| name | publish-version |
| description | Use when releasing a new version of the obsidian-llm-wiki plugin — bumps patch in package.json and src/manifest.json, builds, commits with conventional format, pushes to trigger CI auto-release. Use when user says "release", "publish", "bump version", "новая версия", "выпустить релиз". |
publish-version
Публикация новой patch-версии obsidian-llm-wiki с автоматическим CI-релизом.
Когда использовать
- Пользователь говорит «release», «publish», «bump version», «новая версия», «выпустить»
- После завершения фичи/фикса, готового к релизу
- Не использовать для minor/major — только вручную
Процесс (шаги 0a–0c, затем 1–6)
0a. Найти точку отсчёта
git log --oneline --grep="chore(release)" | head -1
- Извлечь хэш последнего
chore(release) коммита.
- Fallback 1: если таких коммитов нет →
git describe --tags --abbrev=0.
- Fallback 2: если тегов нет → брать всю историю (
git log --oneline).
Вывести пользователю: "Последний релиз: <hash> <message>".
0b. Собрать изменения
git log <hash>..HEAD --oneline
Фильтр включения: строки с префиксом feat|fix|refactor|perf.
Фильтр исключения: коммиты с типом или scope chore, docs, test, ci, build; строки, содержащие только up или build в subject.
Группировать по типу:
feat → раздел «New»
fix → раздел «Fixes»
refactor, perf → раздел «Other»
Дедупликация: если два коммита имеют одинаковый scope И совпадают ≥2 значимых слова в subject — объединять в один пункт, оставляя наиболее полное описание.
Single-entry guard: если нет коммитов с типами feat/fix/refactor/perf — предупредить пользователя и спросить, продолжать ли.
0c. Draft changelog и согласование
Сначала вычисли tentative-версию: прочитай package.json → возьми version → инкрементируй patch. Не записывай файлы — только вычисли номер для заголовка changelog.
Claude формирует changelog:
## X.Y.NEW
### New
- feat(scope): description
### Fixes
- fix(scope): description
### Other
- refactor(scope): description
- perf(scope): description
Правила формата:
- Версия без префикса
v (X.Y.NEW, не vX.Y.NEW).
- Пустые разделы не выводить (без заголовка).
- Описания — из сообщения коммита, без хэша.
- Весь changelog — только английский. Заголовки разделов и описания пунктов.
Claude показывает draft и ждёт явного подтверждения. Пользователь может удалять пункты, переформулировать, добавлять свои.
Переход к шагу 1 только после явного «ок» / «подтверждаю» / аналога.
1. Проверка предусловий
git status
npm test
git branch --show-current
Если тесты падают или есть незакоммиченные изменения — стоп. Исправить сначала.
2. Вычислить новую версию
node -p "require('./package.json').version"
Формула: X.Y.Z → X.Y.(Z+1) (только patch)
3. Обновить версию в двух файлах
package.json:
{ "version": "X.Y.NEW" }
src/manifest.json:
{ "version": "X.Y.NEW" }
Оба файла обязательны. CI триггерится именно по изменению manifest.json.
minAppVersion не трогать — статичное поле, меняется только при явном использовании нового Obsidian API.
4. Собрать
npm run build
Ожидаемый результат: dist/main.js обновлён без ошибок. Build также синкает manifest.json (root) и dist/manifest.json.
4.5. Обновить CHANGELOG.md
Используй текст из changelog, согласованного на шаге 0c — без изменений.
Prepend новую секцию в начало CHANGELOG.md:
## X.Y.NEW — YYYY-MM-DD
### Новое
...
### Исправления
...
### Прочее
...
---
- Если
CHANGELOG.md не существует — создать с заголовком # Changelog и первой секцией.
- Пустые разделы не выводить (без заголовка).
- Дата — сегодняшняя в формате
YYYY-MM-DD.
X.Y.NEW — tentative-версия, вычисленная в шаге 0c.
5. Закоммитить (git-workflow)
git add package.json src/manifest.json manifest.json dist/manifest.json dist/main.js CHANGELOG.md
git commit -m "chore(release): X.Y.NEW — <summary>
<полный changelog из шага 0c>
🤖 Generated with Claude Code
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>"
Где <summary> — subject первого feat из согласованного changelog; если feat нет — первый fix; если нет ни того ни другого — «minor improvements».
Только эти шесть файлов. Не включать другие изменения в релизный коммит.
6. Push → CI авторелиз
git push origin master
CI (ci: auto-release on manifest version bump) подхватывает изменение manifest.json и создаёт GitHub Release автоматически.
7. Перезаписать ноты релиза
Обязательный шаг. CI генерирует ноты автоматически по PR-заголовкам — они не совпадают с согласованным changelog. Дождаться появления релиза (~30 сек), затем перезаписать:
sleep 30
gh release view X.Y.NEW
gh release edit X.Y.NEW --notes "<полный changelog из шага 0c>
**Full Changelog**: https://github.com/ikeniborn/obsidian-ai-wiki/compare/X.Y.OLD...X.Y.NEW"
Формат нот — тот же markdown, что в шаге 0c (разделы «Новое», «Исправления», «Прочее»).
Если gh release view возвращает ошибку — CI ещё не завершился. Повторить через 15 сек.
Итоговый summary
Версия: X.Y.OLD → X.Y.NEW
Changelog: <N> изменений согласовано
Файлы: package.json, src/manifest.json, manifest.json, dist/manifest.json, dist/main.js, CHANGELOG.md
Коммит: chore(release): X.Y.NEW — <summary>
GitHub Release: ноты перезаписаны вручную
CI: авторелиз запущен
Частые ошибки
| Ошибка | Исправление |
|---|
Обновил только package.json | Обновить и src/manifest.json — CI не сработает |
| Незакоммиченные изменения в рабочем дереве | Закоммитить или стэшнуть перед релизом |
| Добавил лишние файлы в релизный коммит | Только package.json, src/manifest.json, manifest.json, dist/* |
Изменил minAppVersion | Не трогать — только при явном использовании нового Obsidian API |
| Тесты падали, но продолжил | Релиз с багами — исправить тесты сначала |
| Minor/major через этот навык | Только patch; minor/major — вручную |
| Нет коммитов feat/fix/refactor/perf | Показать предупреждение и спросить пользователя; не переходить к шагу 1 без явного ответа |
| Не дождался подтверждения changelog | Вернуться к шагу 0c, показать draft, дождаться «ок» |
| Не включил CHANGELOG.md в коммит | Шесть файлов: добавить CHANGELOG.md в git add |
| Описания пунктов на русском | Язык описаний — только английский |
| Не перезаписал ноты релиза | CI пишет автоноты по PR — всегда выполнять шаг 7 |
gh release view — ошибка сразу после push | CI ещё не завершился, подождать 15 сек и повторить |