* feat(skills): add audit skill for one-command project audit * feat(commands): add /audit command as thin wrapper for audit skill --------- Co-authored-by: opencode-agent <agent@opencode.local>
9.1 KiB
9.1 KiB
| name | description |
|---|---|
| audit | One-command project audit. project-status tool + explore subagent (code-standards) → binary verdict → ask user → create-issue for each problem. Read-only (creates issues, NOT fixes). Also when user says "аудит проекта", "проверь проект", "audit", "проверь архитектуру". |
Audit
Линейный flow для аудита существующего проекта. В отличие от
project-template check flow (который чинит через FIX subagents напрямую),
audit создаёт GitHub issues для рефакторинга — дальше юзер запускает
/run-pipeline на каждом issue (pipeline-подход: ISSUE → IMPLEMENT → CI →
REVIEW → MERGE).
Источники находок:
project-statustool — детерминированные проблемы (нетconftest.py, нетci.yml, thin routes, centralized models). Agent парсит текстовый отчёт (НЕ JSON —project-status.pyне трогаем).exploresubagent +code-standardsskill — качественные проблемы (project-statusНЕ ловит): schemas смешаны с models, бизнес-логика в роутах, нарушение layering, service-слой пропущен.
ПРОТОКОЛ (ЖЁСТКО)
project-status({})— оркестратор вызывает tool напрямую (read-only oracle, ALLOWED — какpipeline-status/spec-status). Если вернул⚠️ ...failed→ WARN, продолжай без детерминированных находок (explore всё равно работает).- Парсит отчёт (текст):
Итог:(OK/WARN/FAIL counts) +Рекомендации:(список FAIL с путями). skill({ name: "code-standards" })— load skill (НЕ хардкод правил в audit skill —code-standardsисточник правды).- Delegate
exploresubagent (Template EXPLORE) — проверяет структуру и код противcode-standards, возвращает[{category, problem, path, severity}, ...]. - Комбинирует находки: FAIL/WARN из
project-status+ качественные из explore. Дедупликация: еслиproject-statusFAIL и explore нашли одну и ту же проблему → 1 issue (не 2). - Бинарный вердикт:
≥1 FAILИЛИ≥1 qualitative finding→❌ Найдено N проблем0 FAIL+0 qualitative+0 WARN→✅ Проект здоров→ STOP0 FAIL+0 qualitative+≥1 WARN→⚠️ N замечаний→ вопрос
- Список проблем (сгруппированный: Структура / Качество / Тесты / Infra / Code-standards) — покажи юзеру.
- Вопрос юзеру:
Найдено N проблем. Создать issues для рефакторинга? [1] да — для каждой проблемы create-issue (subagent) [2] нет — STOP, отчёт у юзера - Если
да→ для каждой проблемы (последовательно, НЕ параллельно — Linear Execution из AGENTS.md) — delegatetask(general)с Template ISSUE_CREATE. Еслиcreate-issueвалидация упала → subagent сообщает ошибку, continue к следующей. Если gh недоступен → STOP + report. - Финальный репорт:
Audit complete. Создано N issues: - #M1: <title> — <url> Запусти /run-pipeline на каждом issue для рефакторинга.
ЗАПРЕЩЕНО
- Чинить код напрямую (audit = read-only, только issues). FIX flow остаётся
в
project-templatecheck flow. - Параллелить create-issue subagents (Linear Execution).
- Хардкодить правила из
code-standards— загружай черезskill(). - Трогать
project-status.py(агент парсит текст — JSON не нужен). - Создавать
audit-statustool (audit — линейный, не фазный loop). - Группировать проблемы в один issue (1 проблема = 1 issue для
/run-pipeline).
Граничные случаи
- Репо UNKNOWN типа → explore всё равно проверяет против
code-standards, вердикт по качественным находкам. - Репо без
src/<pkg>/(flat layout) →project-statusWARNs, explore проверяет поcode-standards(если применимо). - Только WARN (0 FAIL, 0 qualitative) →
⚠️ N замечаний, вопрос (да/нет — на усмотрение юзера). - Юзер "нет" → STOP, отчёт у юзера.
- create-issue валидация упала → subagent сообщает, continue к следующей.
- Дублирующие проблемы → дедупликация оркестратором (1 issue, не 2).
Prompt templates
Template EXPLORE (code-standards qualitative audit)
Прочитай .opencode/skills/code-standards/SKILL.md.
Проверь структуру и код проекта в <cwd> против правил из skill.
Найди качественные проблемы, которые project-status НЕ ловит:
- schemas смешаны с models (Pydantic DTO в db/models/)
- бизнес-логика в роутах (Tortoise queries в api/)
- нарушение layering (routes импортируют db/models напрямую, минуя services)
- service-слой пропущен (routes → db/models без services/)
- файлы длиннее 200-300 строк (декомпозиция)
- mixing concerns (бизнес-логика ≠ транспорт ≠ представление)
Для каждой находки верни:
{category: "Code-standards", problem: "<name>: <detail>", path: "<file:line>", severity: "warn"|"fail"}
Верни массив находок. Если находок нет — пустой массив [].
НЕ редактируй код — audit read-only. Только отчёт.
Template ISSUE_CREATE (create-issue для одной проблемы)
Создай GitHub issue для проблемы из audit.
Категория: <category>
Проблема: <name>: <detail>
Путь: <path>
Источник: <project-status | code-standards explore>
Severity: <warn|fail>
1. Load `issue` skill via `skill({ name: "issue" })`.
2. Сформируй issue body (8 headings: ## Контекст, ## Задача, ## Контракты,
## Инварианты, ## Граничные случаи, ## Вне scope, ## Критерии приемки).
- Контекст: проблема из audit (<repo>) — <name>: <detail>. Путь: <path>.
Источник: <source>. Severity: <severity>.
- Задача: что починить (конкретно, с путями к файлам).
- Контракты: конкретные изменения (что должно стать после фикса).
- Инварианты: что НЕ ломать при фиксе.
- Граничные случаи: edge cases при фиксе.
- Вне scope: что НЕ делаем в этом issue.
- Критерии приемки: чек-лист (включая `project-status` проходит эту
категорию после фикса).
3. `create-issue({ title: "fix(<scope>): <description>", body, labels: ["tech-debt", "from-audit"] })`
tool (НЕ raw `gh issue create` — заблокирован deny). tool валидирует
conventional title + 7 headings + Cyrillic.
4. Верни: issue URL (или ошибку валидации для оркестратора).
Если gh недоступен → верни: "gh unavailable: <reason>". НЕ retry, НЕ fallback.
Rules
- Main agent = оркестратор:
project-statustool +exploresubagent + вопрос юзеру +task(general)для create-issue. Не делает edit/read/gh issue createсам. project-status— read-only oracle, ALLOWED для оркестратора.- Audit — read-only (НЕ редактирует код, только создаёт issues).
- FAIL/WARN из
project-status→ issues, НЕ FIX напрямую. - 1 проблема = 1 issue (для отдельного
/run-pipeline). - Issue body self-contained (8 headings,
create-issueвалидация). code-standards— черезskill()tool, НЕ хардкод.- Audit — линейный flow (не
audit-statustool). - create-issue subagents — последовательно (Linear Execution).
- Subagent error → 1 retry, потом STOP + report.