Sprint 17 — onboarding-контур: 4-шаг wizard, контекстный help, in-app
feedback, admin self-diagnostic, /whats-new из CHANGELOG.md.
Ключевые цифры:
- Wizard: 4 шага + skip каждого, 7 e2e тестов ✓ за 20 секунд.
- Diagnostic: 7 параллельных проверок, ~80ms на stage.
- Bundle impact: initial +4 KB gzip (только FeedbackWidget +
HelpTooltip + EmptyStateWithDemo в основном bundle; страницы lazy).
- Regression-suite: 35 → 42 flows + 60 → 66 visual snapshots.
Backend (новые endpoint'ы):
- /api/admin/diagnostic/run — 7 параллельных проверок (DB, SMTP,
MinIO, Hangfire, диск, сертификаты, бэкап). Task.WhenAll, ~80ms.
- /api/feedback — POST {category, message}, email на FromEmail +
Telegram (если SupportTelegram:* настроены). Rate-limit 5/час.
- /api/whats-new — парсер CHANGELOG.md, возвращает {buildVersion,
items}. Dockerfile.api копирует CHANGELOG.md в content-root +
пишет VERSION из GIT_SHA build-arg.
Frontend:
- /onboarding-wizard — 4-step builder, состояние в useState,
localStorage.fm.wizardCompleted после завершения.
- <HelpTooltip topic="key"/> — popover на каждой странице, mapping
src/lib/help-topics.ts (13 keys).
- /help — knowledge base, 7 markdown topics через import.meta.glob,
mini-renderer без heavy deps, fuzzy search.
- /whats-new — список из /api/whats-new, иконки по типу (feat/fix).
- /admin/diagnostic — Admin/SuperAdmin only, 🟢/🟡/🔴 индикаторы.
- <FeedbackWidget> в sidebar footer + ссылки на /help и /whats-new.
- <EmptyStateWithDemo> placeholder для будущих видео-демо.
scripts/generate-changelog.sh — git log feat:/fix: за 90 дней
→ CHANGELOG.md (307 строк сгенерировано).
Wizard UX-screenshots в docs/sprint17-screenshots/ (6 PNG: 4 шага +
help + diagnostic).
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
49 lines
1.7 KiB
Bash
Executable file
49 lines
1.7 KiB
Bash
Executable file
#!/usr/bin/env bash
|
||
# Sprint 17: генератор CHANGELOG.md из git log feat:/fix: коммитов.
|
||
#
|
||
# Группирует по дате (commit author-date), вытаскивает строку subject'a
|
||
# после `feat:` / `fix:`. Игнорирует chore/test/docs (они в commit log
|
||
# уже есть, в changelog не нужны).
|
||
#
|
||
# Запуск: bash scripts/generate-changelog.sh > CHANGELOG.md
|
||
# Или через CI step при каждом push в main.
|
||
|
||
set -euo pipefail
|
||
cd "$(dirname "$0")/.."
|
||
|
||
# Глубина: 90 дней. /whats-new всё равно показывает только 30, но в
|
||
# CHANGELOG.md держим больше для исторической ретроспективы.
|
||
SINCE="$(date -d '90 days ago' +%Y-%m-%d 2>/dev/null || date -v-90d +%Y-%m-%d)"
|
||
|
||
echo "# CHANGELOG"
|
||
echo ""
|
||
echo "Auto-generated from git log feat:/fix: (last 90 days)."
|
||
echo ""
|
||
|
||
# git log: только feat: и fix: коммиты. Формат «дата|subject».
|
||
# Группируем по дате с awk.
|
||
git log --since="$SINCE" --pretty=format:'%ad|%s' --date=short \
|
||
--grep='^feat\|^fix' \
|
||
| awk -F'|' '
|
||
{ date = $1; msg = $2 }
|
||
date != prev {
|
||
if (prev != "") print ""
|
||
print "## " date
|
||
print ""
|
||
prev = date
|
||
}
|
||
{
|
||
# Извлекаем тип (feat|fix) и текст.
|
||
if (match(msg, /^(feat|fix)(\([^)]+\))?:\s*(.*)/, m)) {
|
||
type = m[1]
|
||
scope = m[2]
|
||
text = m[3]
|
||
printf "- **%s**: %s%s\n", type, text, (scope != "" ? " " scope : "")
|
||
} else {
|
||
printf "- %s\n", msg
|
||
}
|
||
}
|
||
'
|
||
|
||
echo ""
|