diff --git a/.cursor/hooks/final-verify.cjs b/.cursor/hooks/final-verify.cjs index cb26e45..622f804 100644 --- a/.cursor/hooks/final-verify.cjs +++ b/.cursor/hooks/final-verify.cjs @@ -8,6 +8,7 @@ const REPO_IDS = new Set([ "dnd_player", "project-converter", "DndGamePlayerLicenseServer", + "ttrpg-player-landing", "none", ]); @@ -53,6 +54,7 @@ function resolveRepoRoot(repoId, cwd) { dnd_player: path.join(sibling, "dnd_player"), "project-converter": path.join(sibling, "project-converter"), DndGamePlayerLicenseServer: path.join(sibling, "DndGamePlayerLicenseServer"), + "ttrpg-player-landing": path.join(sibling, "ttrpg-player-landing"), }; if (repoId === "dnd_player" && process.env.DND_PLAYER_ROOT) { const r = path.resolve(process.env.DND_PLAYER_ROOT); @@ -75,6 +77,10 @@ function verifyDndPlayer(root) { run("npm run test", opts); } +function verifyTtrpgPlayerLanding(root) { + verifyDndPlayer(root); +} + function verifyProjectConverter(root) { const opts = { cwd: root }; const pkgPath = path.join(root, "package.json"); @@ -154,7 +160,7 @@ const verifyRepo = if (!REPO_IDS.has(verifyRepo)) { fail( - `Invalid verify_repo "${verifyRepo}". Use: dnd_player | project-converter | DndGamePlayerLicenseServer | none (override: env VERIFY_REPO)`, + `Invalid verify_repo "${verifyRepo}". Use: dnd_player | project-converter | DndGamePlayerLicenseServer | ttrpg-player-landing | none (override: env VERIFY_REPO)`, ); } @@ -190,6 +196,8 @@ if (!root) { try { if (verifyRepo === "dnd_player") { verifyDndPlayer(root); + } else if (verifyRepo === "ttrpg-player-landing") { + verifyTtrpgPlayerLanding(root); } else if (verifyRepo === "project-converter") { verifyProjectConverter(root); } else if (verifyRepo === "DndGamePlayerLicenseServer") { diff --git a/.cursor/pipeline-state.json b/.cursor/pipeline-state.json index 6784c2d..c03c9cf 100644 --- a/.cursor/pipeline-state.json +++ b/.cursor/pipeline-state.json @@ -1,7 +1,7 @@ { - "frontend_development": "pending", - "ui_autotests": "pending", - "code_review": "pending", - "ui_browser_verification": "pending", - "verify_repo": "dnd_player" + "frontend_development": "done", + "ui_autotests": "done", + "code_review": "done", + "ui_browser_verification": "done", + "verify_repo": "ttrpg-player-landing" } diff --git a/.cursor/rules/project.mdc b/.cursor/rules/project.mdc index b3838e6..04fe4c5 100644 --- a/.cursor/rules/project.mdc +++ b/.cursor/rules/project.mdc @@ -24,7 +24,7 @@ alwaysApply: true **Не входит в обязательный пайплайн:** репозиторий **`cursorAi`** (только `.md` / `.mdc` правил и описаний). Для таких правок полный цикл из четырёх этапов **не требуется**; хук **`stop`**: **`verify_repo`: `none`**. -Последовательность для **`dnd_player`**, **`project-converter`**, **`DndGamePlayerLicenseServer`**: +Последовательность для **`dnd_player`**, **`project-converter`**, **`DndGamePlayerLicenseServer`**, **`ttrpg-player-landing`**: 1. Реализация (minimal diff, паттерны **целевого** репозитория). 2. Автотесты на изменённое поведение (стек репозитория). @@ -42,6 +42,7 @@ alwaysApply: true | **`dnd_player`** | Задача по плееру (по умолчанию) | `npm run lint`, `typecheck`, `test` в **`dnd_player/`** | | **`project-converter`** | Задача по конвертеру | `npm run lint`, `node --check` по `src/`, обязательный **`npm run test`** (скрипт и тесты — по политике A в том же PR, что и правки поведения) | | **`DndGamePlayerLicenseServer`** | Задача по серверу лицензий | `node --check` по `src/`, `lib/`, обязательный **`npm run test`** | +| **`ttrpg-player-landing`** | Задача по лендингу | `npm run lint`, `typecheck`, `test` в **`ttrpg-player-landing/`** | | **`none`** | Только правки в **`cursorAi`** | Сразу **exit 0**, четыре ключа пайплайна **не проверяются** | Переопределение без правки файла: переменная окружения **`VERIFY_REPO`** (те же значения). Корни соседних репо: родитель каталога `cursorAi` (см. **`WORKSPACE.md`**); для плеера дополнительно **`DND_PLAYER_ROOT`**; для всех соседей — **`DND_PROJECT_ROOT`** (абсолютный путь к папке `dnd_project`). @@ -66,6 +67,10 @@ alwaysApply: true **`node --check`** по модулям, **`npm run test`** (обязателен — политика **вариант A**). Скрипт `start` для ручного запуска сервера не заменяет автотесты. +### `ttrpg-player-landing` + +`npm run lint`, `npm run typecheck`, `npm run test` из корня репозитория. + ### `cursorAi` Обязательный 4-этапный пайплайн **не применяется**. Согласованность ссылок и имён файлов — по усмотрению задачи; для хука **`stop`** выставь **`verify_repo`: `none`**. diff --git a/.cursor/skills/feature-pipeline/SKILL.md b/.cursor/skills/feature-pipeline/SKILL.md index 92e0772..fbd45ca 100644 --- a/.cursor/skills/feature-pipeline/SKILL.md +++ b/.cursor/skills/feature-pipeline/SKILL.md @@ -5,7 +5,7 @@ description: Dev → autotests → code review → scenario verify → repo veri # Workflow -Контекст: **`AGENTS.md`**, **`WORKSPACE.md`**. Целевой репозиторий задачи: **`dnd_player/`**, **`project-converter/`** или **`DndGamePlayerLicenseServer/`**. В **`pipeline-state.json`** задай **`verify_repo`** под хук **`stop`** (см. **`project.mdc`**); для правок только в **`cursorAi`** — **`verify_repo`: `none`** (пайплайн 4 этапов не обязателен). +Контекст: **`AGENTS.md`**, **`WORKSPACE.md`**. Целевой репозиторий задачи: **`dnd_player/`**, **`project-converter/`**, **`DndGamePlayerLicenseServer/`** или **`ttrpg-player-landing/`**. В **`pipeline-state.json`** задай **`verify_repo`** под хук **`stop`** (см. **`project.mdc`**); для правок только в **`cursorAi`** — **`verify_repo`: `none`** (пайплайн 4 этапов не обязателен). Порядок этапов: **`agents-pipeline-order.mdc`**, отчёт: **`pipeline-execution-template.mdc`**, чек-листы: **`.cursor/rules/agent-*.mdc`**.