Upgrade guide
Upgrade guide¶
Эта страница — для пользователей, идущих с v0.13.x или раньше, которые хотят довести свой templates_dir до текущего YAML-first artifact-формата. Если ты уже на свежем srekit и templates dir пустая или fresh — эта страница не нужна, srekit templates init сразу делает новую раскладку.
Формат артефактов переехал с per-generator Go-template файлов (postmortem.md.tmpl + опц. postmortem.sections.yaml sidecar) на один YAML-артефакт на генератор (postmortem.yaml). Миграция шла инкрементально через v0.14.0 → v0.20.0 (1-2 генератора на релиз); v0.20.0 — cutover для embedded-набора. Твой templates_dir апгрейдится тем же способом каждый раз через srekit templates upgrade. Legacy-файлы в твоей dir остаются читаемыми и подсвечиваются stderr WARN, пока ты их не удалишь.
Журнал релиз-за-релизом (что изменилось когда и почему) — Migration history.
Быстрая проверка: где я?¶
ls твоей templates dir (путь — из ~/.srekit.yaml templates_dir: / $SREKIT_TEMPLATES_DIR / $XDG_CONFIG_HOME/srekit/templates):
- Видишь
*.yaml(postmortem.yaml, task.yaml, …) — ты на v1. Готово. - Видишь
*.md.tmpl+ возможно*.sections.yaml— у тебя legacy-файлы. Запускай upgrade-рецепт ниже. - Смесь (.yaml и .tmpl на тот же генератор) — ты начал; закончи, удалив legacy
.tmplпосле проверки, что новый.yamlрендерится правильно.
Upgrade-рецепт (v0.13.x → текущая)¶
Каждый шаг изолирован; можно остановиться после любого и перезапустить.
Порядок важен: templates migrate идёт первым, чтобы конвертнуть твои кастомизированные .tmpl в .yaml. Если запустить templates upgrade первым, он скаффолдит embedded .yaml, и templates migrate потом скипнет твои кастомизированные .tmpl (target уже существует) — твои кастомизации останутся проигнорированными.
TPL=~/.srekit/templates # или где твоя dir
# 1. Конвертнуть кастомизированные .tmpl в твоей dir в .yaml. По умолчанию
# dry-run печатает converted YAML; --apply пишет файлы. Конвертер копирует
# template-выражения as-is — см. шаг переписывания ниже.
srekit templates migrate "$TPL" # preview
srekit templates migrate "$TPL" --apply # пишет <name>.yaml рядом с каждым .tmpl
# 2. Переписать data-shape ссылки внутри сгенерированного YAML.
# Большинство генераторов переехало с .X на .Meta.X. Скипаем файлы,
# которые УЖЕ используют .Meta.X (postmortem был на .Meta.X с v0.13.0 —
# его sidecar driving типизированный доступ).
for f in "$TPL"/*.yaml; do
grep -q '{{ \.Meta\.' "$f" && continue # уже на .Meta.X — не трогаем
sed -E -i '' 's/\{\{ \.([A-Z][a-zA-Z]*)/\{\{ .Meta.\1/g' "$f"
done
# rfc-специфично: function-call форма `{{ shortID .ID 8 }}` не ловится
# основным regex'ом — переписываем отдельно.
[ -f "$TPL"/rfc.yaml ] && sed -E -i '' 's/shortID \.ID/shortID .Meta.ID/g' "$TPL"/rfc.yaml
# (Linux/GNU sed: убери пустой `''` после `-i` — это BSD/macOS особенность.)
# 3. Притащить v1 артефакты, которые шипит бинарь и которых у тебя ещё нет
# (например, ты пропустил какие-то генераторы в v0.13.x). Существующие
# user-файлы не трогаются (3-way merge на следующих run'ах когда снапшоты появятся).
# Orphaned snapshot'ы для legacy раскладок GC'шатся из .srekit-embedded/.
srekit templates upgrade "$TPL"
# 4. Проверить результат.
srekit templates validate "$TPL"
# OK postmortem.yaml
# OK task.yaml
# ...
# 5. Когда доверяешь новому YAML — render-тест, потом удаляй legacy.
# Они не удаляются авто — это твои кастомизации.
srekit --templates-dir "$TPL" postmortem --title smoke --severity SEV-2 --stdout > /dev/null
rm "$TPL"/*.md.tmpl "$TPL"/*.sections.yaml 2>/dev/null
Подсказки:
- Section ID — часть structured
--jsonконтракта; если конвертер slugify'нул заголовок секции неудобно (например bilingual heading с abbreviation), открой YAML и переименуйid:перед тем как полагаться на--jsonconsumers. - Секции с Go-template control flow (
{{ if }}/{{ range }}/{{ with }}) обрамляютсяgit merge-стайл diff-маркерами — конвертер не переводит control flow в типизированный sections-словарь. Резолви руками. header_body:— freeform-Markdown escape hatch; используй для blameless-callout'ов, custom-blockquote'ов, всего что не лезет в типизированные секции. (Для postmortem-style.tmplфайлов, которые заканчиваются{{ range .Sections }}loop'ом, конвертер корректно опускает header_body начиная с v0.26.0.)license_*.tmplпропускаются; license-bodies зашиты в бинарь с v0.14.0.
Изменения JSON shape по версиям¶
srekit <generator> --json прошёл через две breaking shape-changes. Мигрируй jq-consumers соответственно:
| Откуда → Куда | Изменение shape | jq-миграция |
|---|---|---|
| 0.12.x → 0.13.0 | плоское {title, severity, …} → {meta, sections} |
jq '.title' → jq '.meta.title' |
| 0.13.x → 0.20 | bootstrap envelope (sections: [{id:"body", body:<markdown>}]) → structured per-artifact sections |
jq '.sections[0].body' → jq '.sections[] | select(.id=="<id>").body' |
Per-section ID — в internal/tmpl/templates/<name>.yaml в репо бинаря. Structured-контракт стабилен с v0.20.0.
--template FILE¶
Флаг теперь license-only. Остальные генераторы (postmortem, task, retro, slo, ebp, capacity, incident, rfc, runbook, oncall-report, changelog) отвечают Error: unknown flag: --template. Это v0.22.0-cleanup флага, который стал silent no-op после миграции каждого генератора на artifact path.
Per-artifact кастомизация в v1-модели — положить <name>.yaml в templates_dir. См. Custom templates workflow для полного цикла.
Границы стабильности¶
Stable contracts (не изменятся без major version bump):
- Поля схемы
<name>.yaml:version,frontmatter,title,meta_bullets,header_body,sections. Новые поля могут добавляться; существующие не удаляются до 2.0. - Внешняя форма
--json({meta, sections}) и форма секции ({id, title, type, required, body}). - Словарь section
type(text/list/table). - Имена per-command
meta-полей (добавление — minor; удаление — breaking). - CLI-флаги, показанные в
--helpкаждой команды.
Совместимость сохранена, кандидаты на удаление в v2.0:
- Legacy
.tmplloader path (Loader.Parse) для user-файлов вtemplates_dir. Работает с stderr WARN. - Legacy
.sections.yamlsidecar parser (sections.ParseManifest) — используетсяtemplates validate/templates migrateдля чтения pre-v0.14 dirs.
Ещё не стабильно (может измениться в 1.x или 2.0):
- Поле
frontmatter— free-form map. Возможно появится типизированная JSON Schema; breaking только для авторов, завязанных на free-form структуру. - Точная формулировка stderr WARN для legacy
.tmplфайлов.
Troubleshooting¶
WARN: <file> in <dir> is a legacy pre-v1.0 format and is being ignored. — Legacy .tmpl или .sections.yaml лежит рядом с v1 <name>.yaml в твоей dir. Мигрируй по рецепту выше; legacy-файлы не удаляются авто (это твои кастомизации). WARN глушится через --quiet.
Error: load <name>.yaml: ... — Embedded-артефакт отсутствует или user-dir версия malformed. Запусти templates validate чтобы увидеть parse-error.
Error: parse <name>.yaml: unknown type "..." — Твой user-dir артефакт объявил секцию с type: который бинарь не знает. Поддерживаемые типы: text, list, table. Поправь YAML.
Section heading показывает raw template syntax ({{ .Meta.X }}) — pre-v0.20.0 srekit не template-evaluate'ил section titles. Обнови бинарь до v0.20.0+ или используй статичные titles.
См. также¶
- Migration history — per-release журнал что изменилось когда.
srekit postmortem— полная схема v1-артефакта.templatesкоманды —init,upgrade,diff,list,validate,migrate.- JSON-вывод — контракт
{meta, sections}. - Custom templates workflow — steady-state цикл кастомизации.