From vmkteam-developer
Resolves YouTrack tasks end-to-end: fetches issues/attachments/context from git/related tasks, analyzes/plans/implements/reviews/commits with human approvals at key stages.
npx claudepluginhub vmkteam/claude-plugins --plugin vmkteam-developerThis skill uses the workspace's default tool permissions.
Полный цикл решения задачи из YouTrack с human-in-the-loop на ключевых этапах.
Mandates invoking relevant skills via tools before any response in coding sessions. Covers access, priorities, and adaptations for Claude Code, Copilot CLI, Gemini CLI.
Share bugs, ideas, or general feedback.
Полный цикл решения задачи из YouTrack с human-in-the-loop на ключевых этапах.
Подключения к системам из .claude/memory/project-index.md.
/solve PLF-819
/solve WEB-456
Каждый этап создаёт документ в docs/llm/tasks/{TASK_ID}/:
docs/llm/tasks/PLF-819/
├── research.md — анализ задачи, контекст, вопросы (шаг 2)
├── spec.md — спецификация плана реализации (шаг 3)
├── review-initial.md — первое ревью (шаг 9)
└── review-final.md — финальное ревью перед коммитом (шаг 9, повторное)
FETCH → ANALYZE → research.md → ⏸
→ PLAN → spec.md → ⏸
→ TEST → IMPLEMENT → SIMPLIFY → FMT+LINT → VERIFY
→ REVIEW → ⏸
→ COMMIT → ⏸
→ YOUTRACK → ⏸
Важно:
Получить задачу из YouTrack (скилл /youtrack):
pcurl @{yt_profile} 'https://{yt_host}/api/issues/{TASK_ID}?fields=idReadable,summary,description,created,updated,reporter(login,name),assignee(login,name),tags(name),comments(author(login),text,created),customFields(name,value(name))' -s
Извлечь:
Создать директорию: mkdir -p docs/llm/tasks/{TASK_ID}/
Аттачи:
pcurl @{yt_profile} 'https://{yt_host}/api/issues/{TASK_ID}/attachments?fields=id,name,url,mimeType,size,created,author(login)' -s
Для каждого аттача с поддерживаемым типом (image/*, application/pdf):
pcurl @{yt_profile} 'https://{yt_host}{url}' -s -o docs/llm/tasks/{TASK_ID}/{filename}
Скачанные изображения и PDF — прочитать и проанализировать (Claude видит картинки и PDF). Остальные форматы — упомянуть в research.md без скачивания.
Войти в plan mode для анализа и планирования. Не писать код до утверждения spec.
На основе задачи:
Контекст из YouTrack:
pcurl @{yt_profile} 'https://{yt_host}/api/issues/{TASK_ID}?fields=idReadable,summary,links(direction,linkType(name),issues(idReadable,summary,resolved))' -s
Контекст из git-истории:
git log --oneline --all --grep="{TASK_ID}" | head -20
git log --oneline --all --grep="{PARENT_ID}" | head -20
git log --oneline -10 -- {file}
Анализ кода:
Если баг — Root Cause Analysis:
Определить глубину расследования по описанию бага:
| Признаки | Уровень | Что делать |
|---|---|---|
| Ясная ошибка в коде, stacktrace в описании | Лёгкий | Sentry (поиск по ключевым словам) + git log + чтение кода |
| Непонятная причина, "иногда не работает", деградация | Полный | Вызвать /investigate как подшаг — Sentry + Prometheus + Loki + API проверка на dev/prod |
Лёгкий (код + Sentry):
pcurl @{sentry_profile} 'https://{sentry_host}/api/0/organizations/{org}/issues/?query=is:unresolved+{keywords}&sort=freq&statsPeriod=7d&limit=5' -s
Полный (вызвать /investigate):
Артефакт: Прочитать шаблон из skills/solve/research-template.md, заполнить и сохранить как docs/llm/tasks/{TASK_ID}/research.md.
Чеклист артефактов: убедиться что docs/llm/tasks/{TASK_ID}/research.md записан на диск.
Показать пользователю research.md. Не переходить к PLAN пока research не утверждён.
Пользователь может:
Оставаться в plan mode. Продумать:
Написать реальные скелеты кода из текущей задачи — сигнатуры функций, структуры, конвертеры. Не абстрактные примеры.
СОХРАНИТЬ: прочитать шаблон из skills/solve/spec-template.md, заполнить и записать как docs/llm/tasks/{TASK_ID}/spec.md через Write tool. Не откладывать.
Секции "Миграции" и "API compatibility" включать только если применимо к задаче.
Чеклист артефактов: убедиться что docs/llm/tasks/{TASK_ID}/spec.md записан на диск.
Показать пользователю spec.md (включая примеры кода). Не переходить к TEST/IMPLEMENT пока spec не утверждён.
Пользователь может:
Сначала тесты, потом реализация:
pkg/db/test/ для тестовых данныхmake test # убедиться что тесты падают по правильной причине
Реализовать по утверждённой spec.md:
Работа с БД: при изменениях схемы, моделей или поисков использовать скиллы /pgd (или /pgmdd) и /mfd. Стандартные поиски и фильтрация всегда добавляются через /mfd (SearchObject).
Правило генерации: если изменены структуры или методы в pkg/rpc/, pkg/vt/, pkg/intrpc/ или любом пакете с //go:generate — обязательно:
make generate # zenrpc + colgen
Закоммитить обновлённые *_zenrpc.go и *_colgen.go вместе с изменениями. Без этого SMD/OpenRPC schema будет устаревшей.
Актуализация артефактов: после реализации, пока контекст свежий — обновить артефакты:
[x] и добавив фактические отличия.Проверить изменённые файлы (вызвать /simplify если доступен):
make fmt
make lint
Если lint находит ошибки — исправить и вернуться к шагу 6 (SIMPLIFY).
make build
make test
Все тесты (включая написанные в шаге 4) должны проходить. Если падают — вернуться к IMPLEMENT.
Дополнительно (если применимо по spec.md):
pgmigrator dryrun — проверить что миграция применяется без ошибокmake generate должен быть чистый (нет неожиданных diff в *_zenrpc.go)go mod tidy && go mod vendor без неожиданных измененийКогда нужно: новые JSON-поля, изменённые response-структуры, новые методы. Когда не нужно: внутренняя логика, рефакторинг без изменения API.
make run &psql -d {database} -c 'SELECT "{auth_key_field}" FROM "{users_table}" WHERE {condition} LIMIT 1;'
curl -s http://localhost:{port}/{rpc_endpoint} \
-H "Content-Type: application/json" \
-H "{auth_header}: {auth_value}" \
-d '{"jsonrpc":"2.0","method":"{method}","params":{...},"id":1}'
Auth credentials, порт, endpoint, таблица пользователей — из project-index.md и cfg/local.toml.
Перечитать этот SKILL.md через Read tool если прошло много шагов — контекст мог быть сжат.
Вызвать /go-review на свои изменения — 6 ревьюеров:
СРАЗУ после получения результатов ревью сохранить в файл через Write tool:
docs/llm/tasks/{TASK_ID}/review-initial.mddocs/llm/tasks/{TASK_ID}/review-final.mdЧеклист артефактов: убедиться что docs/llm/tasks/{TASK_ID}/review-initial.md (или review-final.md) записан на диск.
Показать результаты ревью пользователю. Пользователь решает:
Перечитать этот SKILL.md через Read tool если контекст мог быть сжат.
Проверить что ВСЕ артефакты существуют на диске:
docs/llm/tasks/{TASK_ID}/research.mddocs/llm/tasks/{TASK_ID}/spec.mddocs/llm/tasks/{TASK_ID}/review-initial.md (или review-final.md)Если файл отсутствует — создать его СЕЙЧАС через Write tool, восстановив содержимое из контекста.
# Создать ветку (если не существует)
git checkout -b {TASK_ID}
# Финальный fmt + lint
make fmt
make lint
# Сгенерировать commit message
# /commit-msg
Артефакты: проверить настройку artifacts из project-index.md:
artifacts: commit → включить docs/llm/tasks/{TASK_ID}/ в коммитartifacts: comment → НЕ добавлять docs/llm/tasks/ в коммит; артефакты будут опубликованы как коммент (шаг 11)Показать:
{TASK_ID}git diff --statdocs/llm/tasks/{TASK_ID}/ (research, spec, review){commit/comment}Пользователь подтверждает:
git add {files} && git commitgit add {files} && git commit && git push -u origin {TASK_ID} \
-o merge_request.create \
-o merge_request.target=devel \
-o "merge_request.title={TASK_ID} {commit_title}" \
-o merge_request.squash_on_merge \
-o merge_request.remove_source_branch
Push + MR создаются одной командой через GitLab push options. Второй push без новых коммитов не создаст MR.
После успешного push в origin.
artifacts: comment)Если artifacts: comment в project-index.md, спросить пользователя куда прикрепить:
Один коммент с двумя спойлерами (research + spec). Review не публикуется — это внутренний артефакт.
# Получить MR IID по ветке
MR_IID=$(pcurl @{gl_profile} 'https://{gl_host}/api/v4/projects/{gl_project_id}/merge_requests?source_branch={TASK_ID}&state=opened' -s | jq -r '.[0].iid')
# Собрать коммент из файлов
RESEARCH=$(cat docs/llm/tasks/{TASK_ID}/research.md)
SPEC=$(cat docs/llm/tasks/{TASK_ID}/spec.md)
# Создать коммент со спойлерами
pcurl @{gl_profile} 'https://{gl_host}/api/v4/projects/{gl_project_id}/merge_requests/'"${MR_IID}"'/notes' -s \
-X POST --data-urlencode "body=## Артефакты /solve
<details>
<summary>Research — анализ задачи</summary>
${RESEARCH}
</details>
<details>
<summary>Spec — план реализации</summary>
${SPEC}
</details>"
Один коммент с двумя спойлерами (YouTrack {cut} синтаксис).
RESEARCH=$(cat docs/llm/tasks/{TASK_ID}/research.md)
SPEC=$(cat docs/llm/tasks/{TASK_ID}/spec.md)
pcurl @{yt_profile} 'https://{yt_host}/api/issues/{TASK_ID}/comments?fields=id,text' -s \
-X POST -H 'Content-Type: application/json' \
-d '{
"text": "**Артефакты /solve**\n\n{cut text=\"Research — анализ задачи\"}\n'"$(echo "$RESEARCH" | jq -sR .)"'\n{cut}\n\n{cut text=\"Spec — план реализации\"}\n'"$(echo "$SPEC" | jq -sR .)"'\n{cut}"
}'
В обоих вариантах review-артефакты (review-initial.md, review-final.md) не публикуются — они нужны только в процессе работы. Артефакты на диске (
docs/llm/tasks/{TASK_ID}/) остаются локально, но НЕ коммитятся.
Показать:
{TASK_ID}{login} (если не назначен){mr_url}Пользователь подтверждает:
Выполнение (параллельно):
# Назначить на пользователя
pcurl @{yt_profile} 'https://{yt_host}/api/issues/{TASK_ID}' -s -X POST \
-H 'Content-Type: application/json' \
-d '{"customFields":[{"name":"Assignee","$type":"SingleUserIssueCustomField","value":{"login":"{login}"}}]}'
# Перевести в Review
pcurl @{yt_profile} 'https://{yt_host}/api/issues/{TASK_ID}' -s -X POST \
-H 'Content-Type: application/json' \
-d '{"customFields":[{"name":"{state_field}","$type":"StateIssueCustomField","value":{"name":"Review"}}]}'
Имя поля (Stage/State/Status) и значения берутся из
project-index.mdсекции YouTrack.
PLF-819, WEB-456make fmt lint запускается автоматически перед review и перед коммитом/go-review — всегда, без исключенийdocs/llm/tasks/{TASK_ID}/ — коммитятся вместе с кодом (artifacts: commit) или публикуются как коммент со спойлерами (artifacts: comment). Настройка в project-index.md