From 4960fb2dea0af23e6b626e470a76adeb6cff6457 Mon Sep 17 00:00:00 2001 From: MerlinH Date: Mon, 29 Jun 2026 12:47:44 +0000 Subject: [PATCH] feat: upgrade CCGS parity surfaces - add CCGS surface inventory and parity matrix reporting\n- expand Codex-native roles, skills, and workflow catalog coverage\n- remove nested init compatibility and align root project docs\n- migrate tests from Vitest to node:test with standalone expect --- AGENTS.md | 2 +- README.md | 2 +- docs/ai/repo-rules.md | 2 +- .../flows/project-initialization.md | 8 +- docs/architecture/repository-structure.md | 2 +- docs/development-rules.md | 2 +- ...ion-bounded-parallelism-ccgs-adaptation.md | 38 +- docs/project-anatomy.md | 4 +- docs/readmes/README.ja.md | 2 +- docs/readmes/README.ko.md | 2 +- docs/readmes/README.zh.md | 2 +- docs/system-verification.md | 2 +- .../engineering/codex/roles-and-workflows.md | 5 + .../projects/project-scaffolding.md | 5 +- .../engineering/repository/overview.md | 2 +- docs/truthmark/routes/areas.md | 2 + docs/truthmark/routes/areas/repository.md | 6 + docs/user-guide.md | 4 +- .../ccgs-surface-parity-upgrade/tasks.md | 84 +- .../design.md | 12 +- .../proposal.md | 4 +- .../specs/repository-root-template/spec.md | 17 +- .../tasks.md | 6 +- package-lock.json | 1906 ++---- package.json | 6 +- references/ccgs-surface-parity-matrix.json | 5808 +++++++++++++++++ references/ccgs-surface-parity-matrix.md | 244 + research/codex-port-design.md | 2 +- scripts/audit-ccgs-surfaces.ts | 11 + src/agents.ts | 4 +- src/ccgs-parity.ts | 487 ++ src/cli.ts | 1 - src/projects.ts | 32 +- src/roles.ts | 150 +- src/skills.ts | 352 +- src/validation.ts | 20 + src/workflow-catalog.ts | 115 + tests/agents-templates.test.ts | 12 +- tests/approval-gates.test.ts | 3 +- tests/behavioral-evaluation.test.ts | 3 +- tests/ccgs-adaptation.test.ts | 3 +- tests/ccgs-parity-audit.test.ts | 70 + tests/cli-prompt-surface.test.ts | 5 +- tests/codex-context-files.test.ts | 3 +- tests/codex-prompts.test.ts | 3 +- tests/codex-runtime.test.ts | 3 +- tests/codex-session.test.ts | 3 +- tests/customization.test.ts | 3 +- tests/engine-system.test.ts | 3 +- tests/functionality-gap-pass.test.ts | 3 +- tests/orchestrator.test.ts | 3 +- tests/project-workflow.test.ts | 9 +- tests/roles.test.ts | 3 +- tests/runner.test.ts | 3 +- tests/studio-policy.test.ts | 3 +- tests/tasks.test.ts | 3 +- tests/template-root-smoke.test.ts | 3 +- tests/validation.test.ts | 16 +- tests/verification.test.ts | 3 +- tests/workflow-catalog.test.ts | 38 + tests/workflow-recipes.test.ts | 3 +- 61 files changed, 7796 insertions(+), 1761 deletions(-) create mode 100644 references/ccgs-surface-parity-matrix.json create mode 100644 references/ccgs-surface-parity-matrix.md create mode 100644 scripts/audit-ccgs-surfaces.ts create mode 100644 src/ccgs-parity.ts create mode 100644 src/workflow-catalog.ts create mode 100644 tests/ccgs-parity-audit.test.ts create mode 100644 tests/workflow-catalog.test.ts diff --git a/AGENTS.md b/AGENTS.md index 1a6052d..06fe59a 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -6,7 +6,7 @@ This project uses `"type": "module"`, `module: "NodeNext"`, and `moduleResolutio For source-checkout usage, run `npm install && npm run build` first, then use the checked-in wrapper: `./codex-game-studio ...`. Do not commit generated bundled CLI artifacts. Use `npm run validate` before parity claims. Use `npm exec codex-game-studio -- ...` only after package install/link or inside package-bin smoke fixtures. Bare `codex-game-studio ...` is only guaranteed after package install/link. -Keep generated game projects under `projects//`. +Keep generated game project surfaces in the repository root; do not reintroduce nested `projects//` initialization. Do not load all agents or all templates for a single role task. diff --git a/README.md b/README.md index b3fd740..c292002 100644 --- a/README.md +++ b/README.md @@ -54,7 +54,7 @@ Codex Game Studio turns that structure into local project artifacts that Codex c | Capability | What it means | | --- | --- | -| Local project scaffolding | Initializes the current repository root as the game workspace; `--nested` keeps the legacy `projects//` layout available for migration. | +| Local project scaffolding | Initializes the current repository root as the game workspace so generated skills, workflows, prompts, and project state are reviewable in Git. | | Codex-native studio roles | Generates focused role prompts for production, design, engineering, art, QA, localization, and release work. | | Workflow prompts | Provides reusable prompts for market review, analytics, specs, handoffs, ship checks, UI review, and more. | | Engine overlays | Adds Godot, Unity, or Unreal context without turning this project into an engine wrapper. | diff --git a/docs/ai/repo-rules.md b/docs/ai/repo-rules.md index 6ad21ce..bea8446 100644 --- a/docs/ai/repo-rules.md +++ b/docs/ai/repo-rules.md @@ -17,7 +17,7 @@ This file mirrors the repository-specific agent rules from `AGENTS.md` in the co - Use `npm run validate` before any parity claim. - This project uses `"type": "module"`, `module: "NodeNext"`, and `moduleResolution: "NodeNext"`; relative TypeScript imports must use emitted `.js` specifiers. - For source-checkout usage, run `npm install && npm run build` first, then use `./codex-game-studio ...`; generated bundled CLI artifacts are not committed. -- Keep generated game projects under `projects//`. +- Keep generated game project surfaces in the repository root. - Do not load all agents or all templates for a single role task. - `src/agents.ts` is the single owner for generated project `AGENTS.md`. - Direct Codex execution is the default path via `codex-game-studio run `. diff --git a/docs/architecture/flows/project-initialization.md b/docs/architecture/flows/project-initialization.md index 73cacc9..8c7cebb 100644 --- a/docs/architecture/flows/project-initialization.md +++ b/docs/architecture/flows/project-initialization.md @@ -13,7 +13,7 @@ source_of_truth: ## Purpose -This architecture flow guide documents the runtime scenario for `codex-game-studio init` and `codex-game-studio new`. Both commands use the same initialization path to create a deterministic Codex Game Studio project under `projects//`. +This architecture flow guide documents the runtime scenario for `codex-game-studio init` and `codex-game-studio new`. Both commands use the same initialization path to create a deterministic Codex Game Studio project in the current repository root. ## Scope @@ -37,7 +37,7 @@ Project initialization owns generated project creation and initial `.codex` stat - The user supplies `--name`, `--engine`, `--mode`, and `--non-interactive`. - The selected engine is known by the engine registry. -- The target `projects//` path does not already exist. +- The target root either has no `.codex/studio.json` or is force-refreshed for the same project intent. - Same-parent project slug and Unreal class-name collision checks pass. ## Inputs @@ -111,7 +111,7 @@ flowchart TD The successful flow creates or writes: -- `projects//` +- repository root - `.codex/studio.json` - `.codex/runs/` - `.codex/workflows/*.md` @@ -128,7 +128,7 @@ Forbidden generated project surfaces remain forbidden: `CODEX.md`, `project_orch | --- | --- | --- | | Required-option failure | CLI command missing required flags. | `src/cli.ts` command definitions. | | Invalid engine | Engine value not recognized or engine registry changed. | `src/engines.ts`, `engine_configs/**`. | -| Target collision | `projects//` already exists. | Project directory and slug derivation in `src/projects.ts`. | +| Target collision | root `.codex/studio.json` belongs to a different project. | Project state loading in `src/projects.ts`. | | Generated file missing in validation | Scaffolding contract drift. | `src/projects.ts`, `src/agents.ts`, `src/validation.ts`. | ## Code Traceability diff --git a/docs/architecture/repository-structure.md b/docs/architecture/repository-structure.md index 2dfa4da..e480846 100644 --- a/docs/architecture/repository-structure.md +++ b/docs/architecture/repository-structure.md @@ -38,7 +38,7 @@ Project scaffolding writes generated project files but does not execute Codex. C - `src/runner.ts`, `src/tasks.ts`, `src/codex-runtime.ts`, and `src/verification.ts` own Codex execution, task persistence, runtime checks, and verification processes. - `src/validation.ts` owns repository and generated-project validation checks. - `engine_configs/**` and `templates/**` are package runtime assets. -- `tests/**` mirrors those behavior boundaries with Vitest coverage. +- `tests/**` mirrors those behavior boundaries with node:test coverage. - `docs/architecture/flows/**` contains Markdown runtime views for project initialization, role runs, workflow prompt rendering, and validation/repository-truth workflows. ## Product Decisions diff --git a/docs/development-rules.md b/docs/development-rules.md index 19d69d2..069090b 100644 --- a/docs/development-rules.md +++ b/docs/development-rules.md @@ -13,6 +13,6 @@ npm test npm run validate ``` -Keep generated projects under `projects//`. +Keep generated game project surfaces in the repository root. The current build invokes Codex by default through `run `. Use `--dry-run` or `--print-prompt` for inspection-only paths. Explicit local task orchestration is now inside the product boundary, but runtime claims require implementation and validation. The build still intentionally excludes planner commands, telemetry, changed-file tracking, hosted/background orchestration, unbounded parallelism, and ownership enforcement. diff --git a/docs/plans/2026-06-25-task-orchestration-bounded-parallelism-ccgs-adaptation.md b/docs/plans/2026-06-25-task-orchestration-bounded-parallelism-ccgs-adaptation.md index 20b0c04..7bd2930 100644 --- a/docs/plans/2026-06-25-task-orchestration-bounded-parallelism-ccgs-adaptation.md +++ b/docs/plans/2026-06-25-task-orchestration-bounded-parallelism-ccgs-adaptation.md @@ -6,7 +6,7 @@ **Architecture:** Keep Codex Game Studio local-first and Codex-native. Extend the existing `.codex/tasks.json`, `.codex/runs/**`, role packages, workflow registry, template registry, approvals, and validation systems. Orchestration is a foreground CLI command that plans, locks, executes, verifies, reviews, and records bounded task runs; it is not a daemon, hosted scheduler, hidden planner, or generic workflow DAG engine. -**Tech Stack:** TypeScript ESM on Node 24, Commander CLI, Vitest, existing Codex runtime, existing project validation, Truthmark-backed docs. +**Tech Stack:** TypeScript ESM on Node 24, Commander CLI, node:test plus standalone expect, existing Codex runtime, existing project validation, Truthmark-backed docs. --- @@ -616,7 +616,7 @@ Defer or keep out of product: 2. Add a test that `writeTaskStore()` writes `schemaVersion: 2`. 3. Run: ```bash - npx vitest run tests/tasks.test.ts -t "task store" + npm test -- tests/tasks.test.ts -t "task store" ``` 4. Expected before implementation: failure because schema v2 is not implemented. @@ -637,7 +637,7 @@ Defer or keep out of product: 4. Ensure status validation accepts `cancelled` and `skipped`. 5. Run: ```bash - npx vitest run tests/tasks.test.ts + npm test -- tests/tasks.test.ts ``` 6. Expected: pass. @@ -660,7 +660,7 @@ Defer or keep out of product: 4. Test duplicate dependencies and unknown dependency IDs. 5. Run: ```bash - npx vitest run tests/tasks.test.ts tests/cli-prompt-surface.test.ts + npm test -- tests/tasks.test.ts tests/cli-prompt-surface.test.ts ``` ### Task 4: Add asynchronous Codex execution @@ -682,7 +682,7 @@ Defer or keep out of product: 4. Keep current output formatting unchanged. 5. Run: ```bash - npx vitest run tests/codex-runtime.test.ts tests/runner.test.ts + npm test -- tests/codex-runtime.test.ts tests/runner.test.ts ``` ### Task 5: Add lock acquisition tests @@ -702,7 +702,7 @@ Defer or keep out of product: 4. Test released locks are removed or marked released according to final implementation choice. 5. Run: ```bash - npx vitest run tests/orchestrator-locks.test.ts + npm test -- tests/orchestrator-locks.test.ts ``` 6. Expected before implementation: failure because module does not exist. @@ -723,7 +723,7 @@ Defer or keep out of product: 4. Implement stale lock diagnostics but do not auto-clean stale locks yet. 5. Run: ```bash - npx vitest run tests/orchestrator-locks.test.ts + npm test -- tests/orchestrator-locks.test.ts ``` ### Task 7: Add orchestration graph tests @@ -743,7 +743,7 @@ Defer or keep out of product: 4. Test `--max-concurrency 4` fails because first cap is 3. 5. Run: ```bash - npx vitest run tests/orchestrator.test.ts + npm test -- tests/orchestrator.test.ts ``` ### Task 8: Implement dry-run orchestration planning @@ -765,7 +765,7 @@ Defer or keep out of product: 5. Assert dry-run writes no `.codex/runs/**`, locks, or task status changes. 6. Run: ```bash - npx vitest run tests/orchestrator.test.ts + npm test -- tests/orchestrator.test.ts ``` ### Task 9: Implement serial orchestration execution @@ -786,7 +786,7 @@ Defer or keep out of product: 5. Mark downstream tasks skipped when blockers occur. 6. Run: ```bash - npx vitest run tests/orchestrator.test.ts tests/tasks.test.ts + npm test -- tests/orchestrator.test.ts tests/tasks.test.ts ``` ### Task 10: Implement bounded parallel orchestration @@ -806,7 +806,7 @@ Defer or keep out of product: 4. Add fake Codex sleep tests proving concurrency without hosted calls. 5. Run: ```bash - npx vitest run tests/orchestrator.test.ts + npm test -- tests/orchestrator.test.ts ``` ### Task 11: Add CLI command @@ -827,7 +827,7 @@ Defer or keep out of product: 4. Update future-surface tests so `parallel` is not blanket-forbidden, but hosted/unbounded/background surfaces remain forbidden. 5. Run: ```bash - npx vitest run tests/cli-prompt-surface.test.ts tests/functionality-gap-pass.test.ts + npm test -- tests/cli-prompt-surface.test.ts tests/functionality-gap-pass.test.ts ``` ### Task 12: Add workflow recipe tests @@ -846,7 +846,7 @@ Defer or keep out of product: 3. Test recipe creation does not call Codex. 4. Run: ```bash - npx vitest run tests/workflow-recipes.test.ts + npm test -- tests/workflow-recipes.test.ts ``` ### Task 13: Implement initial workflow recipes @@ -866,7 +866,7 @@ Defer or keep out of product: 3. Keep workflow shortcut commands render-only. 4. Run: ```bash - npx vitest run tests/workflow-recipes.test.ts tests/functionality-gap-pass.test.ts + npm test -- tests/workflow-recipes.test.ts tests/functionality-gap-pass.test.ts ``` ### Task 14: Add CCGS adaptation registry tests @@ -885,7 +885,7 @@ Defer or keep out of product: 3. Test high-value skill additions are categorized as workflow/template/recipe/deferred. 4. Run: ```bash - npx vitest run tests/ccgs-adaptation.test.ts + npm test -- tests/ccgs-adaptation.test.ts ``` ### Task 15: Implement CCGS adaptation registry @@ -906,7 +906,7 @@ Defer or keep out of product: 4. Optionally add validation diagnostics for registry consistency. 5. Run: ```bash - npx vitest run tests/ccgs-adaptation.test.ts tests/validation.test.ts + npm test -- tests/ccgs-adaptation.test.ts tests/validation.test.ts ``` ### Task 16: Add first curated roles only if justified @@ -928,7 +928,7 @@ Defer or keep out of product: 3. Do not add engine sub-specialist roles. 4. Run: ```bash - npx vitest run tests/roles.test.ts tests/functionality-gap-pass.test.ts + npm test -- tests/roles.test.ts tests/functionality-gap-pass.test.ts ``` ### Task 17: Add high-value CCGS-derived workflows/templates @@ -950,7 +950,7 @@ Defer or keep out of product: 3. Keep template selection bounded. 4. Run: ```bash - npx vitest run tests/functionality-gap-pass.test.ts tests/agents-templates.test.ts + npm test -- tests/functionality-gap-pass.test.ts tests/agents-templates.test.ts ``` ### Task 18: Update validation and future-surface guards @@ -971,7 +971,7 @@ Defer or keep out of product: 3. Add absence checks for daemon/hosted/unbounded CLI/help/config surfaces. 4. Run: ```bash - npx vitest run tests/validation.test.ts tests/behavioral-evaluation.test.ts + npm test -- tests/validation.test.ts tests/behavioral-evaluation.test.ts ``` ### Task 19: Update docs and generated truth surfaces diff --git a/docs/project-anatomy.md b/docs/project-anatomy.md index 9e45cee..9d1d050 100644 --- a/docs/project-anatomy.md +++ b/docs/project-anatomy.md @@ -1,6 +1,6 @@ # Project Anatomy -Codex Game Studio projects are ordinary directories under `projects//`. The generated files are the contract between humans, Codex, validation, and later role runs. +Codex Game Studio projects are ordinary repository-root workspaces. The generated files are the contract between humans, Codex, validation, and later role runs. ## Generated project tree @@ -77,7 +77,7 @@ Codex Game Studio does not recursively dump the whole project into every prompt. | `engine_configs/` | Engine overlays for Godot, Unity, and Unreal. | | `engine_reference/` | Curated engine reference packs selected by role and task. | | `docs/` | Setup, migration, validation, architecture, and truth docs. | -| `tests/` | Vitest coverage for projects, prompts, templates, validation, runner behavior, engine behavior, and orchestration. | +| `tests/` | node:test coverage for projects, prompts, templates, validation, runner behavior, engine behavior, and orchestration. | ## Validation-sensitive surfaces diff --git a/docs/readmes/README.ja.md b/docs/readmes/README.ja.md index 73550dc..bb382fc 100644 --- a/docs/readmes/README.ja.md +++ b/docs/readmes/README.ja.md @@ -50,7 +50,7 @@ Codex Game Studio は、その構造をローカルなプロジェクト成果 | 機能 | 意味 | | --- | --- | -| ローカルプロジェクト生成 | `projects//` に決定的なゲームワークスペースを作成します。 | +| ローカルプロジェクト生成 | 現在のリポジトリルートに決定的なゲームワークスペースを作成します。 | | Codex ネイティブなスタジオロール | 制作、デザイン、エンジニアリング、アート、QA、ローカライズ、リリース用のロールプロンプトを生成します。 | | ワークフロープロンプト | 市場調査、分析、仕様、引き継ぎ、出荷確認、UI レビューなどの再利用可能なプロンプトを提供します。 | | エンジンオーバーレイ | Godot、Unity、Unreal の文脈を追加しますが、エンジンラッパーにはなりません。 | diff --git a/docs/readmes/README.ko.md b/docs/readmes/README.ko.md index 79f75ac..9dd1529 100644 --- a/docs/readmes/README.ko.md +++ b/docs/readmes/README.ko.md @@ -50,7 +50,7 @@ Codex Game Studio는 이 구조를 Codex가 읽고 사람이 리뷰할 수 있 | 기능 | 의미 | | --- | --- | -| 로컬 프로젝트 스캐폴딩 | `projects//` 아래에 결정적인 게임 워크스페이스를 만듭니다. | +| 로컬 프로젝트 스캐폴딩 | 현재 저장소 루트에 결정적인 게임 워크스페이스를 만듭니다。 | | Codex 네이티브 스튜디오 역할 | 제작, 디자인, 엔지니어링, 아트, QA, 로컬라이제이션, 출시 작업용 역할 프롬프트를 생성합니다. | | 워크플로 프롬프트 | 시장 리뷰, 분석, 명세, 핸드오프, 출시 체크, UI 리뷰 등 재사용 가능한 프롬프트를 제공합니다. | | 엔진 오버레이 | Godot, Unity, Unreal 맥락을 추가하지만 엔진 래퍼가 되지는 않습니다. | diff --git a/docs/readmes/README.zh.md b/docs/readmes/README.zh.md index 3183441..797b2fb 100644 --- a/docs/readmes/README.zh.md +++ b/docs/readmes/README.zh.md @@ -50,7 +50,7 @@ Codex Game Studio 把这些结构变成本地项目文件,让 Codex 能读取 | 能力 | 含义 | | --- | --- | -| 本地项目脚手架 | 在 `projects//` 下创建确定性的游戏工作区。 | +| 本地项目脚手架 | 在当前仓库根目录创建确定性的游戏工作区。 | | Codex 原生工作室角色 | 为制作、设计、工程、美术、QA、本地化和发布生成聚焦的角色提示词。 | | 工作流提示词 | 提供市场、数据、规格、交接、发布检查、UI 审查等可复用提示词。 | | 引擎覆盖层 | 添加 Godot、Unity 或 Unreal 上下文,但不把本项目变成引擎包装器。 | diff --git a/docs/system-verification.md b/docs/system-verification.md index 37117f5..07c7109 100644 --- a/docs/system-verification.md +++ b/docs/system-verification.md @@ -3,7 +3,7 @@ Required verification: ```bash -npm test -- --run tests/behavioral-evaluation.test.ts tests/customization.test.ts +npm test -- tests/behavioral-evaluation.test.ts tests/customization.test.ts npm run typecheck npm run build npm test diff --git a/docs/truthmark/engineering/codex/roles-and-workflows.md b/docs/truthmark/engineering/codex/roles-and-workflows.md index e9b664d..15ccb66 100644 --- a/docs/truthmark/engineering/codex/roles-and-workflows.md +++ b/docs/truthmark/engineering/codex/roles-and-workflows.md @@ -122,6 +122,11 @@ It does not own process execution, task persistence, package installation, or ge - Every engine pack includes version, current best practices, deprecated API, breaking-change, gameplay, specialist, module, and plugin references. - Engine reference assets carry seed-review metadata. - Workflow IDs map to `.codex/workflows/.md` files, expected context files, taxonomy categories, gap-coverage notes, and optional CLI aliases. +- The CCGS parity audit inventories reference agents, skills, workflow-catalog steps, templates, and rules into JSON and Markdown matrix reports. +- The parity matrix records source hashes, CGS target paths, target hashes when a generated or registry target exists, decisions, score fields, rationales, owner paths, test paths, and implementation status. +- The generated workflow catalog models phase progression, required steps, optional steps, repeatable steps, artifact checks, and next-phase links without importing Claude slash-command runtime behavior. +- Status output includes the next incomplete workflow-catalog phase and required artifact checks. +- Skill generation renders per-skill phases, context files, write targets, quality gates, handoff/report formats, and required marker validation. - Behavioral scenario IDs map to representative roles or workflows in `src/behavioral-evaluation.ts`. - Each scenario declares required phrases, forbidden drift phrases, selected-context categories, and workflow template expectations. - Required template expectations apply to both project-backed and no-project workflow rendering. diff --git a/docs/truthmark/engineering/projects/project-scaffolding.md b/docs/truthmark/engineering/projects/project-scaffolding.md index 831a0da..eaeadcc 100644 --- a/docs/truthmark/engineering/projects/project-scaffolding.md +++ b/docs/truthmark/engineering/projects/project-scaffolding.md @@ -27,7 +27,6 @@ It does not own Codex run execution, task lifecycle persistence, or repository-l - Initialization accepts optional `--studio-mode` and defaults it to `guided-studio`. - Initialization writes the project into the current repository root by default. - It rejects an existing different root project unless force refresh is explicit. -- Explicit `--nested` keeps the legacy `projects//` layout and checks same-parent slug collisions plus Unreal class-name collisions before writing. - Project state is written to `.codex/studio.json`. - Project state uses schema version 1 and product `codex-game-studio`. - Project state records project summary fields, lifecycle `mode`, policy `studioMode`, project-scoped roles, active roles, active engine specialist, and workflow IDs. @@ -61,7 +60,7 @@ It does not own Codex run execution, task lifecycle persistence, or repository-l - Project creation is deterministic and non-interactive. - Missing `--non-interactive` or `--mode` is an error. - Omitted `--studio-mode` uses `guided-studio`. -- Generated projects use the current repository root by default; `--nested` is a legacy migration escape hatch for `projects//`. +- Generated projects use the current repository root as the project workspace. - `CODEX.md`, `project_orchestrator.md`, `.gamestudio/runs`, `.codex/hooks.json`, coding-standard `.codex/rules/*.rules`, wrong-engine custom agents, and Truthmark maintenance agents are forbidden generated project surfaces. - Generated project prompts must include project name, role display name, project summary, engine context, and role instructions. - They must also include expected outputs, review checklist, and handoff sections. @@ -132,7 +131,7 @@ Generated project instructions live in `AGENTS.md` to align with Codex-native wo - Update this doc when context manifest, config, engine, engine reference, agent, path, engine config, or engine reference assets change. - Relevant verification includes project workflow, agent/template, engine-system, and project validation tests. -- Decision (2026-06-29): Treat the clone checkout root as the primary game root and keep `--nested` only for legacy migration. +- Decision (2026-06-29): Treat the clone checkout root as the game root; do not maintain a script-installed or nested project compatibility mode. - Decision (2026-06-29): Generate Codex-native custom agents under `.codex/agents/*.toml` and repository skills under `.agents/skills/*/SKILL.md`. ## Source References diff --git a/docs/truthmark/engineering/repository/overview.md b/docs/truthmark/engineering/repository/overview.md index 88a9012..8af0300 100644 --- a/docs/truthmark/engineering/repository/overview.md +++ b/docs/truthmark/engineering/repository/overview.md @@ -27,7 +27,7 @@ They are listed in `docs/truthmark/routes/areas/repository.md`. ## Current Implementation Behavior - The package exposes the `codex-game-studio` CLI from the built `dist/cli.js` entrypoint, and the source checkout exposes `./codex-game-studio` as a thin wrapper over built TypeScript output. -- Initialization commands create deterministic game project structure in the current repository root by default; `--nested` preserves the legacy `projects/` layout. +- Initialization commands create deterministic game project structure in the current repository root. - Generated projects contain `.codex/studio.json`, role prompt files, workflow markdown, starter docs, engine markers, and `AGENTS.md`. - Role run commands render deterministic Codex prompts. - Unless in inspection mode, role run commands execute Codex with optional verification, review, and bounded fix passes. diff --git a/docs/truthmark/routes/areas.md b/docs/truthmark/routes/areas.md index e26fe1a..2ed97f2 100644 --- a/docs/truthmark/routes/areas.md +++ b/docs/truthmark/routes/areas.md @@ -17,6 +17,8 @@ Code surface: - engine_configs/** - engine_reference/** - templates/** +- scripts/** +- references/** - package.json - package-lock.json - docs/architecture/** diff --git a/docs/truthmark/routes/areas/repository.md b/docs/truthmark/routes/areas/repository.md index 0131707..cf2f2b5 100644 --- a/docs/truthmark/routes/areas/repository.md +++ b/docs/truthmark/routes/areas/repository.md @@ -97,14 +97,20 @@ Code surface: - src/customization.ts - src/prompt-context.ts - src/workflows.ts +- src/workflow-catalog.ts +- src/ccgs-parity.ts +- scripts/audit-ccgs-surfaces.ts - src/engine-reference.ts - src/templates.ts - src/generated-surfaces.ts +- references/ccgs-surface-parity-matrix.* - templates/** - tests/roles.test.ts - tests/codex-session.test.ts - tests/codex-prompts.test.ts - tests/behavioral-evaluation.test.ts +- tests/ccgs-parity-audit.test.ts +- tests/workflow-catalog.test.ts - tests/customization.test.ts - tests/functionality-gap-pass.test.ts diff --git a/docs/user-guide.md b/docs/user-guide.md index f48b685..84879dd 100644 --- a/docs/user-guide.md +++ b/docs/user-guide.md @@ -6,7 +6,7 @@ Use the README for quick orientation. Use this guide for installation, commands, ## How Codex Game Studio runs -Codex Game Studio runs locally against the current repository checkout. By default, `init` turns the current repository root into the game workspace and keeps project state in files that can be reviewed in Git. Use `--nested` only as a legacy migration escape hatch for `projects//`. +Codex Game Studio runs locally against the current repository checkout. `init` turns the current repository root into the game workspace and keeps project state in files that can be reviewed in Git. The checked-in wrapper runs the built TypeScript entrypoint at `dist/cli.js`. This repository does not commit generated bundled CLI artifacts. @@ -105,7 +105,7 @@ Project validation checks project state, generated prompt/workflow freshness, re | Command | What it does | | --- | --- | -| `init` / `new` | Initialize the current repository root as the game workspace; pass `--nested` only for the legacy `projects//` layout. | +| `init` / `new` | Initialize the current repository root as the game workspace. | | `status` | Print project phase, status, engine, and the next validation command. | | `resume` | Print a read-only continuation summary. | | `refresh-context` | Regenerate `.codex/context-manifest.json` after selected context files change. | diff --git a/openspec/changes/ccgs-surface-parity-upgrade/tasks.md b/openspec/changes/ccgs-surface-parity-upgrade/tasks.md index bd28571..51db79a 100644 --- a/openspec/changes/ccgs-surface-parity-upgrade/tasks.md +++ b/openspec/changes/ccgs-surface-parity-upgrade/tasks.md @@ -1,75 +1,75 @@ ## 1. Baseline Inventory and Audit Tooling -- [ ] 1.1 Add `scripts/audit-ccgs-surfaces.ts` that reads `CCGS_REFERENCE_ROOT` or defaults to `/opt/data/repos/Claude-Code-Game-Studios`. -- [ ] 1.2 Add parser coverage for CCGS `.claude/agents/*.md` frontmatter, body sections, skills lists, gate tokens, and output templates. -- [ ] 1.3 Add parser coverage for CCGS `.claude/skills/*/SKILL.md` frontmatter, argument hints, allowed tools, assigned agent, phase headings, context files, write targets, verdicts, and report templates. -- [ ] 1.4 Add parser coverage for `.claude/docs/workflow-catalog.yaml` phases, steps, commands, required flags, repeatable flags, artifact globs, artifact patterns, and next-phase links. -- [ ] 1.5 Add CGS registry extraction for `src/roles.ts`, `src/workflows.ts`, `src/skills.ts`, `src/templates.ts`, and generated validation markers. -- [ ] 1.6 Write `tests/ccgs-parity-audit.test.ts` with fixture-based unit tests proving all three source types produce stable inventory rows. -- [ ] 1.7 Run `npm test -- tests/ccgs-parity-audit.test.ts`; expected result: parser tests pass without requiring the live CCGS checkout. +- [x] 1.1 Add `scripts/audit-ccgs-surfaces.ts` that reads `CCGS_REFERENCE_ROOT` or defaults to `/opt/data/repos/Claude-Code-Game-Studios`. +- [x] 1.2 Add parser coverage for CCGS `.claude/agents/*.md` frontmatter, body sections, skills lists, gate tokens, and output templates. +- [x] 1.3 Add parser coverage for CCGS `.claude/skills/*/SKILL.md` frontmatter, argument hints, allowed tools, assigned agent, phase headings, context files, write targets, verdicts, and report templates. +- [x] 1.4 Add parser coverage for `.claude/docs/workflow-catalog.yaml` phases, steps, commands, required flags, repeatable flags, artifact globs, artifact patterns, and next-phase links. +- [x] 1.5 Add CGS registry extraction for `src/roles.ts`, `src/workflows.ts`, `src/skills.ts`, `src/templates.ts`, and generated validation markers. +- [x] 1.6 Write `tests/ccgs-parity-audit.test.ts` with fixture-based unit tests proving all three source types produce stable inventory rows. +- [x] 1.7 Run `npm test -- tests/ccgs-parity-audit.test.ts`; expected result: parser tests pass without requiring the live CCGS checkout. ## 2. Parity Matrix and Scoring Rubric -- [ ] 2.1 Define the matrix schema in `src/ccgs-parity.ts` with source type, source path, source hash, CGS target, decision, score fields, rationale, implementation owner path, test path, and status. -- [ ] 2.2 Implement score categories: content depth, procedural specificity, context contract, output contract, role-skill linkage, gate/escalation behavior, Codex fit, and testability. -- [ ] 2.3 Generate `references/ccgs-surface-parity-matrix.json` and `references/ccgs-surface-parity-matrix.md` from the current live CCGS checkout. -- [ ] 2.4 Require every CCGS row to have one decision: `adopt`, `adapt`, `merge`, `rename-alias`, `defer`, or `out-of-scope`. -- [ ] 2.5 Seed obvious preliminary decisions for known exact gaps: CCGS has 49 agents, 73 skills, and workflow-catalog phase steps; CGS currently has 38 roles, 31 workflows, and 11 generated skills. -- [ ] 2.6 Add tests that fail when row counts differ between JSON and Markdown reports. -- [ ] 2.7 Add tests that fail when any row lacks a decision, rationale, or source hash. +- [x] 2.1 Define the matrix schema in `src/ccgs-parity.ts` with source type, source path, source hash, CGS target, decision, score fields, rationale, implementation owner path, test path, and status. +- [x] 2.2 Implement score categories: content depth, procedural specificity, context contract, output contract, role-skill linkage, gate/escalation behavior, Codex fit, and testability. +- [x] 2.3 Generate `references/ccgs-surface-parity-matrix.json` and `references/ccgs-surface-parity-matrix.md` from the current live CCGS checkout. +- [x] 2.4 Require every CCGS row to have one decision: `adopt`, `adapt`, `merge`, `rename-alias`, `defer`, or `out-of-scope`. +- [x] 2.5 Seed obvious preliminary decisions for known exact gaps: CCGS has 49 agents, 73 skills, and workflow-catalog phase steps; CGS currently has 38 roles, 31 workflows, and 11 generated skills. +- [x] 2.6 Add tests that fail when row counts differ between JSON and Markdown reports. +- [x] 2.7 Add tests that fail when any row lacks a decision, rationale, or source hash. ## 3. Agent-by-Agent Upgrade Pass -- [ ] 3.1 Compare every CCGS agent against `src/roles.ts` and record whether the target is a direct role, merged role, alias, new role, or out-of-scope. -- [ ] 3.2 Upgrade high-value direct matches first: `producer`, `creative-director`, `technical-director`, `game-designer`, `systems-designer`, `gameplay-programmer`, `qa-playtester`, `release-manager`, and `performance-analyst`. -- [ ] 3.3 Resolve renamed or collapsed roles: `art-director`, `narrative-director`, `ux-designer`, `qa-lead`, `qa-tester`, `lead-programmer`, `prototyper`, and `analytics-engineer`. +- [x] 3.1 Compare every CCGS agent against `src/roles.ts` and record whether the target is a direct role, merged role, alias, new role, or out-of-scope. +- [x] 3.2 Upgrade high-value direct matches first: `producer`, `creative-director`, `technical-director`, `game-designer`, `systems-designer`, `gameplay-programmer`, `qa-playtester`, `release-manager`, and `performance-analyst`. +- [x] 3.3 Resolve renamed or collapsed roles: `art-director`, `narrative-director`, `ux-designer`, `qa-lead`, `qa-tester`, `lead-programmer`, `prototyper`, and `analytics-engineer`. - [ ] 3.4 Decide and implement engine sub-specialists: Godot C#, GDExtension, GDScript, shader; Unity Addressables, DOTS, shader, UI; Unreal Blueprint, GAS, replication, UMG. -- [ ] 3.5 Update `renderProjectCustomAgentToml()` tests so upgraded agents prove required domain sections appear in `.codex/agents/*.toml`. +- [x] 3.5 Update `renderProjectCustomAgentToml()` tests so upgraded agents prove required domain sections appear in `.codex/agents/*.toml`. - [ ] 3.6 Update prompt rendering tests so `.codex/prompts/*.md` and `.codex/agents/*.toml` stay semantically aligned. -- [ ] 3.7 Run `npm test -- tests/agents-templates.test.ts tests/project-workflow.test.ts tests/validation.test.ts`. +- [x] 3.7 Run `npm test -- tests/agents-templates.test.ts tests/project-workflow.test.ts tests/validation.test.ts`. ## 4. Skill-by-Skill Upgrade Pass -- [ ] 4.1 Replace generic generated skill bodies in `src/skills.ts` with a renderer that supports per-skill phases, context files, write targets, handoff/report formats, and validation markers. -- [ ] 4.2 Upgrade onboarding and setup skills: `start`, `onboard`, `adopt`, `setup-engine`, `help`, and `project-stage-detect`. -- [ ] 4.3 Upgrade design skills: `brainstorm`, `quick-design`, `map-systems`, `design-system`, `design-review`, `review-all-gdds`, `art-bible`, `asset-spec`, `ux-design`, and `ux-review`. -- [ ] 4.4 Upgrade architecture and production skills: `create-architecture`, `create-control-manifest`, `architecture-decision`, `architecture-review`, `create-epics`, `create-stories`, `estimate`, `sprint-plan`, `sprint-status`, `scope-check`, and `milestone-review`. -- [ ] 4.5 Upgrade build and validation skills: `prototype`, `vertical-slice`, `bug-report`, `bug-triage`, `qa-plan`, `regression-suite`, `smoke-check`, `soak-test`, `test-setup`, `test-helpers`, `test-flakiness`, and `test-evidence-review`. -- [ ] 4.6 Upgrade release and operations skills: `release-checklist`, `launch-checklist`, `hotfix`, `day-one-patch`, `patch-notes`, `changelog`, `localize`, `security-audit`, `perf-profile`, `tech-debt`, and `retrospective`. -- [ ] 4.7 Upgrade team specialty skills: `team-audio`, `team-combat`, `team-level`, `team-live-ops`, `team-narrative`, `team-polish`, `team-qa`, `team-release`, and `team-ui`. -- [ ] 4.8 Add validation that upgraded generated skills include required sections and adapted body markers, not just frontmatter. -- [ ] 4.9 Run `npm test -- tests/project-workflow.test.ts tests/validation.test.ts tests/template-root-smoke.test.ts`. +- [x] 4.1 Replace generic generated skill bodies in `src/skills.ts` with a renderer that supports per-skill phases, context files, write targets, handoff/report formats, and validation markers. +- [x] 4.2 Upgrade onboarding and setup skills: `start`, `onboard`, `adopt`, `setup-engine`, `help`, and `project-stage-detect`. +- [x] 4.3 Upgrade design skills: `brainstorm`, `quick-design`, `map-systems`, `design-system`, `design-review`, `review-all-gdds`, `art-bible`, `asset-spec`, `ux-design`, and `ux-review`. +- [x] 4.4 Upgrade architecture and production skills: `create-architecture`, `create-control-manifest`, `architecture-decision`, `architecture-review`, `create-epics`, `create-stories`, `estimate`, `sprint-plan`, `sprint-status`, `scope-check`, and `milestone-review`. +- [x] 4.5 Upgrade build and validation skills: `prototype`, `vertical-slice`, `bug-report`, `bug-triage`, `qa-plan`, `regression-suite`, `smoke-check`, `soak-test`, `test-setup`, `test-helpers`, `test-flakiness`, and `test-evidence-review`. +- [x] 4.6 Upgrade release and operations skills: `release-checklist`, `launch-checklist`, `hotfix`, `day-one-patch`, `patch-notes`, `changelog`, `localize`, `security-audit`, `perf-profile`, `tech-debt`, and `retrospective`. +- [x] 4.7 Upgrade team specialty skills: `team-audio`, `team-combat`, `team-level`, `team-live-ops`, `team-narrative`, `team-polish`, `team-qa`, `team-release`, and `team-ui`. +- [x] 4.8 Add validation that upgraded generated skills include required sections and adapted body markers, not just frontmatter. +- [x] 4.9 Run `npm test -- tests/project-workflow.test.ts tests/validation.test.ts tests/template-root-smoke.test.ts`. ## 5. Workflow Catalog and Phase Progression -- [ ] 5.1 Add a CGS workflow-catalog model that can represent CCGS-style phases, required steps, optional steps, repeatable steps, artifact checks, and next-phase links. -- [ ] 5.2 Map CCGS catalog phases into CGS lifecycle phases without importing Claude slash-command mechanics. +- [x] 5.1 Add a CGS workflow-catalog model that can represent CCGS-style phases, required steps, optional steps, repeatable steps, artifact checks, and next-phase links. +- [x] 5.2 Map CCGS catalog phases into CGS lifecycle phases without importing Claude slash-command mechanics. - [ ] 5.3 Upgrade `status`, `resume`, and workflow rendering to show relevant next steps, required artifacts, and incomplete gate checks. -- [ ] 5.4 Implement explicit artifact checks for accepted workflow rows such as game concept, systems map, architecture, UX design, vertical slice, playtest polish, release checklist, and changelog. -- [ ] 5.5 Add tests for required artifact detection and repeatable step reporting. -- [ ] 5.6 Run `npm test -- tests/runner.test.ts tests/tasks.test.ts tests/workflow-recipes.test.ts tests/validation.test.ts`. +- [x] 5.4 Implement explicit artifact checks for accepted workflow rows such as game concept, systems map, architecture, UX design, vertical slice, playtest polish, release checklist, and changelog. +- [x] 5.5 Add tests for required artifact detection and repeatable step reporting. +- [x] 5.6 Run `npm test -- tests/runner.test.ts tests/tasks.test.ts tests/workflow-recipes.test.ts tests/validation.test.ts`. ## 6. Templates, Rules, and Context Adaptation -- [ ] 6.1 Compare CCGS `.claude/docs/templates/**` one by one against CGS `templates/**` and record matrix decisions. +- [x] 6.1 Compare CCGS `.claude/docs/templates/**` one by one against CGS `templates/**` and record matrix decisions. - [ ] 6.2 Upgrade or add templates where CCGS has stronger game-facing artifacts: art bible, architecture decision record, control manifest, pitch, project-stage report, prototype report, test plan, UX spec, and vertical-slice report. -- [ ] 6.3 Compare CCGS `.claude/rules/**` one by one and map accepted standards to `.agents/skills/**`, `AGENTS.md`, or selected context, never `.codex/rules/*.rules`. +- [x] 6.3 Compare CCGS `.claude/rules/**` one by one and map accepted standards to `.agents/skills/**`, `AGENTS.md`, or selected context, never `.codex/rules/*.rules`. - [ ] 6.4 Update context manifest defaults so upgraded workflows select the minimum relevant standards, templates, and engine references. -- [ ] 6.5 Run `npm test -- tests/codex-context-files.test.ts tests/agents-templates.test.ts tests/validation.test.ts`. +- [x] 6.5 Run `npm test -- tests/codex-context-files.test.ts tests/agents-templates.test.ts tests/validation.test.ts`. ## 7. Behavioral Evaluation Layer -- [ ] 7.1 Add deterministic fixture tests for upgraded generated content before adding any LLM or live Codex probe. +- [x] 7.1 Add deterministic fixture tests for upgraded generated content before adding any LLM or live Codex probe. - [ ] 7.2 Add manual behavioral-eval scenarios for at least producer planning, vertical-slice scoping, bug triage, QA plan, and release checklist. - [ ] 7.3 Ensure manual eval output records scenario, selected agent/skill, prompt, trace summary, changed files or no-write proof, final report, and reviewer verdict. - [ ] 7.4 Keep real Codex/LLM judge runs out of default `npm test` unless explicitly enabled by environment variables. -- [ ] 7.5 Run deterministic behavioral tests with `npm test -- tests/behavioral-evaluation.test.ts`. +- [x] 7.5 Run deterministic behavioral tests with `npm test -- tests/behavioral-evaluation.test.ts`. ## 8. Documentation, Truth, and Final Validation - [ ] 8.1 Update README and user guide only after upgraded behavior exists and tests pass. -- [ ] 8.2 Update Truthmark docs for role, skill, workflow, template, validation, and generated-surface behavior after code lands. +- [x] 8.2 Update Truthmark docs for role, skill, workflow, template, validation, and generated-surface behavior after code lands. - [ ] 8.3 Refresh `references/ccgs-surface-parity-matrix.*` and confirm every adopted/adapted/merged row is implemented or intentionally deferred. -- [ ] 8.4 Run `npm test`. -- [ ] 8.5 Run `npm run validate` before any parity claim. -- [ ] 8.6 Run `truthmark check --json`, `truthmark index --json`, `git diff --check`, `openspec validate ccgs-surface-parity-upgrade --strict --json`, `openspec validate --all --strict --json`, and `openspec status --change ccgs-surface-parity-upgrade --json`. +- [x] 8.4 Run `npm test`. +- [x] 8.5 Run `npm run validate` before any parity claim. +- [x] 8.6 Run `truthmark check --json`, `truthmark index --json`, `git diff --check`, `openspec validate ccgs-surface-parity-upgrade --strict --json`, `openspec validate --all --strict --json`, and `openspec status --change ccgs-surface-parity-upgrade --json`. diff --git a/openspec/changes/repository-root-codex-game-studio/design.md b/openspec/changes/repository-root-codex-game-studio/design.md index 3033777..517b5a8 100644 --- a/openspec/changes/repository-root-codex-game-studio/design.md +++ b/openspec/changes/repository-root-codex-game-studio/design.md @@ -35,9 +35,9 @@ Current Codex documentation defines the native surfaces to use: ### Repository root is the game root -Default installation is `git clone my-game`, then run Codex from `my-game`. Default `init` resolves `projectRoot = cwd` and writes root `.codex/studio.json`. Nested `projects/` remains only as explicit legacy mode if retained. +Default installation is `git clone my-game`, then run Codex from `my-game`. Default `init` resolves `projectRoot = cwd` and writes root `.codex/studio.json`. Nested `projects/` generation is not retained. -Alternative rejected: keep nested `projects/` as the main path. That preserves package-maintenance cleanliness but fails the desired CCGS injection strategy and leaves first-session Codex context pointed at package-maintainer docs. +Alternative rejected: keep nested `projects/` generation. That preserves package-maintenance cleanliness but fails the desired CCGS injection strategy and leaves first-session Codex context pointed at package-maintainer docs. ### Separate game-facing and maintainer-facing paths @@ -65,7 +65,7 @@ Alternative rejected: copy CCGS hook automation immediately. That imports hidden ## Risks / Trade-offs -- Root-mode migration may break current users who rely on `projects/` → Keep `init --nested` and `--project` as a transitional compatibility path. +- Root-mode migration may break current users who rely on `projects/` → Keep explicit `--project` path selection for existing projects, but do not create new nested projects from init. - Moving package source under `tooling/**` may disrupt package scripts and import paths → Add build, package-bin, and temp-cwd smoke tests before merging. - Keeping package maintenance and game template in one repository may remain confusing → Treat `tooling/**` isolation as the first step and keep a separate template repository as the long-term option. - Codex custom-agent noninteractive selection may not be stable → Keep current `.codex/prompts/**` runtime path until a stable custom-agent execution contract exists. @@ -75,17 +75,17 @@ Alternative rejected: copy CCGS hook automation immediately. That imports hidden 1. Add OpenSpec-backed requirements and task plan. 2. Add root-mode tests first. -3. Implement root `init` behavior while preserving explicit nested compatibility. +3. Implement root `init` behavior and preserve explicit `--project` path selection for existing projects. 4. Move package-maintainer implementation/docs out of root game-facing paths. 5. Generate root Codex-native agents and skills. 6. Update validation and smoke tests. 7. Update user docs to show clone-root installation. 8. Run `npm run validate`, `truthmark check --json`, and `truthmark index --json` before claiming completion. -Rollback: keep the nested generation code path available behind `init --nested` and restore it as default for one release if root-mode migration blocks users. Do not roll back to Markdown custom agents or coding standards under `.codex/rules/**`. +Rollback: keep explicit `--project` support for existing checkouts if root-mode migration blocks users. Do not roll back to Markdown custom agents or coding standards under `.codex/rules/**`. ## Open Questions - Should the package-maintenance source stay under `tooling/codex-game-studio/**` in this repository, or should the game template be split into a separate repository before public release? -- What exact CLI flags should guard nested mode and root refresh: `--nested`, `--force-refresh`, `--template-maintenance`, or another naming scheme? +- What exact CLI flags should guard root refresh: `--force-refresh`, `--template-maintenance`, or another naming scheme? - Should default clone state include a generic `studio.json`, or should the `cgs-start` skill be responsible for first-time project configuration before `studio.json` exists? diff --git a/openspec/changes/repository-root-codex-game-studio/proposal.md b/openspec/changes/repository-root-codex-game-studio/proposal.md index 26559ad..a745c79 100644 --- a/openspec/changes/repository-root-codex-game-studio/proposal.md +++ b/openspec/changes/repository-root-codex-game-studio/proposal.md @@ -1,6 +1,6 @@ ## Why -Codex Game Studio currently behaves like a package source checkout that creates nested `projects/` workspaces. CCGS demonstrates a better install strategy for game development: clone the repository as the game root so the first agent session sees game instructions, game roles, and game workflows immediately. +Codex Game Studio previously behaved like a package source checkout that created nested `projects/` workspaces. CCGS demonstrates a better strategy for game development: clone the repository as the game root so the first agent session sees game instructions, game roles, and game workflows immediately. The current root `src/`, `docs/`, `AGENTS.md`, and `.codex/agents/**` also contain package-maintainer material that can derail a game-development Codex session. The repository-root template must separate game-facing surfaces from Codex Game Studio implementation and maintenance surfaces. @@ -14,7 +14,6 @@ The current root `src/`, `docs/`, `AGENTS.md`, and `.codex/agents/**` also conta - Keep `.codex/prompts/**` and `.codex/workflows/**` as CGS runtime artifacts during migration. - Keep `.codex/rules/*.rules` reserved for Codex sandbox command permission rules, not coding standards. - Do not generate Codex hooks by default. -- Preserve legacy nested project support only behind an explicit migration option if needed. ## Capabilities @@ -35,4 +34,3 @@ None. This repository did not have existing OpenSpec specs before this change. - Generated surfaces: root `AGENTS.md`, `.codex/agents/*.toml`, `.agents/skills/**`, `.codex/prompts/**`, `.codex/workflows/**`, `.codex/studio.json`, and `.codex/context-manifest.json`. - Documentation layout: root `docs/` changes from package docs to game docs only. - Tests: template-root smoke tests, validation tests, agent/skill rendering tests, runner tests, and optional Codex debug probe. -- Migration: existing nested `projects/` users need an explicit compatibility path during the transition. diff --git a/openspec/changes/repository-root-codex-game-studio/specs/repository-root-template/spec.md b/openspec/changes/repository-root-codex-game-studio/specs/repository-root-template/spec.md index 84762f8..189750c 100644 --- a/openspec/changes/repository-root-codex-game-studio/specs/repository-root-template/spec.md +++ b/openspec/changes/repository-root-codex-game-studio/specs/repository-root-template/spec.md @@ -23,17 +23,6 @@ The `init` command SHALL configure the current working directory as the game pro - **WHEN** `init` runs in a directory with an existing `.codex/studio.json` for a different project - **THEN** the command fails unless an explicit force-refresh option is provided -### Requirement: Legacy nested mode is explicit -The system SHALL keep nested `projects/` generation only behind an explicit legacy or sandbox option if nested generation remains supported. - -#### Scenario: Nested mode is requested -- **WHEN** the user runs `init` with the explicit nested option -- **THEN** the command creates `projects//` using the legacy layout - -#### Scenario: Nested mode is not requested -- **WHEN** the user runs default `init` -- **THEN** no `projects//` directory is created - ### Requirement: Runtime commands default to root mode Runtime commands SHALL resolve the current directory as the project root when `.codex/studio.json` exists there. @@ -41,6 +30,6 @@ Runtime commands SHALL resolve the current directory as the project root when `. - **WHEN** `codex-game-studio run gameplay-programmer --dry-run` runs from a root-mode project - **THEN** dry-run output uses the current directory as the project root -#### Scenario: Legacy project option still works during migration -- **WHEN** `codex-game-studio run gameplay-programmer --project projects/legacy --dry-run` is provided during the compatibility window -- **THEN** the command resolves the explicit legacy project path +#### Scenario: Explicit project option still works +- **WHEN** `codex-game-studio run gameplay-programmer --project ../existing-game --dry-run` is provided +- **THEN** the command resolves the explicit project path diff --git a/openspec/changes/repository-root-codex-game-studio/tasks.md b/openspec/changes/repository-root-codex-game-studio/tasks.md index d2b529b..8ead664 100644 --- a/openspec/changes/repository-root-codex-game-studio/tasks.md +++ b/openspec/changes/repository-root-codex-game-studio/tasks.md @@ -7,7 +7,7 @@ ## 2. Root Initialization Behavior - [x] 2.1 Add failing tests in `tests/project-workflow.test.ts` proving default `init` writes `.codex/studio.json` under a temp cwd and does not create `projects//`. -- [x] 2.2 Implement root-mode project resolution in `src/projects.ts` and `src/paths.ts` while keeping explicit nested mode available. +- [x] 2.2 Implement root-mode project resolution in `src/projects.ts` and `src/paths.ts`. - [x] 2.3 Add protection tests for re-running `init` over an existing different root project without an explicit force-refresh option. - [x] 2.4 Run `npm test -- tests/project-workflow.test.ts` and confirm root-mode tests pass. @@ -44,7 +44,7 @@ - [x] 6.1 Add failing `tests/runner.test.ts` coverage that root-mode `run --dry-run` resolves cwd when `.codex/studio.json` exists. - [x] 6.2 Update dry-run output to show the runtime prompt path, custom-agent TOML path, and selected skill paths. -- [x] 6.3 Preserve explicit `--project` support for legacy nested projects during migration. +- [x] 6.3 Preserve explicit `--project` support for existing project checkouts during migration. - [x] 6.4 Add `status` output that points to root `.codex/agents/` and `.agents/skills/` catalogs. - [x] 6.5 Run `npm test -- tests/runner.test.ts tests/project-workflow.test.ts`. @@ -59,7 +59,7 @@ ## 8. Public Docs, Truth, and Final Validation - [x] 8.1 Update user-facing setup docs and README to show `git clone my-game` as the primary install path. -- [x] 8.2 Document nested project mode only as a legacy migration escape hatch. +- [x] 8.2 Document root project mode as the supported initialization path. - [x] 8.3 Update truth docs only after functional code and tests land; keep Truthmark maintenance docs out of game-facing root `docs/`. - [x] 8.4 Run `npm run validate` before any parity or completion claim. - [x] 8.5 Run `truthmark check --json`, `truthmark index --json`, `git diff --check`, `openspec validate repository-root-codex-game-studio --strict --json`, and `openspec status --change repository-root-codex-game-studio --json`. diff --git a/package-lock.json b/package-lock.json index 92bd8d6..944c70c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17,15 +17,40 @@ }, "devDependencies": { "@types/node": "^24.13.2", + "expect": "^30.4.1", "truthmark": "^2.2.6", "tsx": "^4.20.6", - "typescript": "^5.9.3", - "vitest": "^1.6.1" + "typescript": "^5.9.3" }, "engines": { "node": ">=24" } }, + "node_modules/@babel/code-frame": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", + "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.29.7", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@esbuild/aix-ppc64": { "version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.0.tgz", @@ -442,23 +467,84 @@ "node": ">=18" } }, - "node_modules/@jest/schemas": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", - "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "node_modules/@jest/diff-sequences": { + "version": "30.4.0", + "resolved": "https://registry.npmjs.org/@jest/diff-sequences/-/diff-sequences-30.4.0.tgz", + "integrity": "sha512-zOpzlfUs45l6u7jm39qr87JCHUDsaeCtvL+kQe/Vn9jSnRB4/5IPXISm0h9I1vZW/o00Kn4UTJ2MOlhnUGwv3g==", "dev": true, - "dependencies": { - "@sinclair/typebox": "^0.27.8" - }, + "license": "MIT", "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", - "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", - "dev": true + "node_modules/@jest/expect-utils": { + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-30.4.1.tgz", + "integrity": "sha512-ZBn5CglH8fBsQsvs4VWNzD4aWfUYks+IdOOQU3MEK71ol/BcVm+P+rtb1KpiFBpSWSCE27uOahyyf1vfqOVbcQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/get-type": "30.1.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/get-type": { + "version": "30.1.0", + "resolved": "https://registry.npmjs.org/@jest/get-type/-/get-type-30.1.0.tgz", + "integrity": "sha512-eMbZE2hUnx1WV0pmURZY9XoXPkUYjpc55mb0CrhtdWLtzMQPFvu/rZkTLZFTsdaVQa+Tr4eWAteqcUzoawq/uA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/pattern": { + "version": "30.4.0", + "resolved": "https://registry.npmjs.org/@jest/pattern/-/pattern-30.4.0.tgz", + "integrity": "sha512-RAWn3+f9u8BsHijKJ71uHcFp6vmyEt6VvoWXkl6hKF3qVIuWNmudVjg12DlBPGup/frIl5UcUlH5HfEuvHpEXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "jest-regex-util": "30.4.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/schemas": { + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-30.4.1.tgz", + "integrity": "sha512-i6b4qw5qnP8c5FEeBJg/uZQ4ddrkN6Ca8qISJh0pr7a5hfn3h3v5x60BEbOC7OYAGZNMs1LfFLwnW2CuK8F57Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.34.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/types": { + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-30.4.1.tgz", + "integrity": "sha512-f1x/vJXIfjOlEmejYpbkbgw1gOqpPECwMvMEtBqe47j7H2Hg8h8w3o3ikhSXq3MI15kg+oQ0exWO0uCtTNJLoQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/pattern": "30.4.0", + "@jest/schemas": "30.4.1", + "@types/istanbul-lib-coverage": "^2.0.6", + "@types/istanbul-reports": "^3.0.4", + "@types/node": "*", + "@types/yargs": "^17.0.33", + "chalk": "^4.1.2" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", @@ -495,331 +581,6 @@ "node": ">= 8" } }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.60.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.60.4.tgz", - "integrity": "sha512-F5QXMSiFebS9hKZj02XhWLLnRpJ3B3AROP0tWbFBSj+6kCbg5m9j5JoHKd4mmSVy5mS/IMQloYgYxCuJC0fxEQ==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.60.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.60.4.tgz", - "integrity": "sha512-GxxTKApUpzRhof7poWvCJHRF51C67u1R7D6DiluBE8wKU1u5GWE8t+v81JvJYtbawoBFX1hLv5Ei4eVjkWokaw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.60.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.60.4.tgz", - "integrity": "sha512-tua0TaJxMOB1R0V0RS1jFZ/RpURFDJIOR2A6jWwQeawuFyS4gBW+rntLRaQd0EQ4bd6Vp44Z2rXW+YYDBsj6IA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.60.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.60.4.tgz", - "integrity": "sha512-CSKq7MsP+5PFIcydhAiR1K0UhEI1A2jWXVKHPCBZ151yOutENwvnPocgVHkivu2kviURtCEB6zUQw0vs8RrhMg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.60.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.60.4.tgz", - "integrity": "sha512-+O8OkVdyvXMtJEciu2wS/pzm1IxntEEQx3z5TAVy4l32G0etZn+RsA48ARRrFm6Ri8fvqPQfgrvNxSjKAbnd3g==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.60.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.60.4.tgz", - "integrity": "sha512-Iw3oMskH3AfNuhU0MSN7vNbdi4me/NiYo2azqPz/Le16zHSa+3RRmliCMWWQmh4lcndccU40xcJuTYJZxNo/lw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.60.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.60.4.tgz", - "integrity": "sha512-EIPRXTVQpHyF8WOo219AD2yEltPehLTcTMz2fn6JsatLYSzQf00hj3rulF+yauOlF9/FtM2WpkT/hJh/KJFGhA==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.60.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.60.4.tgz", - "integrity": "sha512-J3Yh9PzzF1Ovah2At+lHiGQdsYgArxBbXv/zHfSyaiFQEqvNv7DcW98pCrmdjCZBrqBiKrKKe2V+aaSGWuBe/w==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.60.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.60.4.tgz", - "integrity": "sha512-BFDEZMYfUvLn37ONE1yMBojPxnMlTFsdyNoqncT0qFq1mAfllL+ATMMJd8TeuVMiX84s1KbcxcZbXInmcO2mRg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.60.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.60.4.tgz", - "integrity": "sha512-pc9EYOSlOgdQ2uPl1o9PF6/kLSgaUosia7gOuS8mB69IxJvlclko1MECXysjs5ryez1/5zjYqx3+xYU0TU6R1A==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-loong64-gnu": { - "version": "4.60.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.60.4.tgz", - "integrity": "sha512-NxnomyxYerDh5n4iLrNa+sH+Z+U4BMEE46V2PgQ/hoB909i8gV1M5wPojWg9fk1jWpO3IQnOs20K4wyZuFLEFQ==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-loong64-musl": { - "version": "4.60.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.60.4.tgz", - "integrity": "sha512-nbJnQ8a3z1mtmrwImCYhc6BGpThAyYVRQxw9uKSKG4wR6aAYno9sVjJ0zaZcW9BPJX1GbrDPf+SvdWjgTuDmnw==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-ppc64-gnu": { - "version": "4.60.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.60.4.tgz", - "integrity": "sha512-2EU6acNrQLd8tYvo/LXW535wupT3m6fo7HKo6lr7ktQoItxTyOL1ZCR/GfGCuXl2vR+zmfI6eRXkSemafv+iVg==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-ppc64-musl": { - "version": "4.60.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.60.4.tgz", - "integrity": "sha512-WeBtoMuaMxiiIrO2IYP3xs6GMWkJP2C0EoT8beTLkUPmzV1i/UcOSVw1d5r9KBODtHKilG5yFxsGRnBbK3wJ4A==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.60.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.60.4.tgz", - "integrity": "sha512-FJHFfqpKUI3A10WrWKiFbBZ7yVbGT4q4B5o1qKFFojqpaYoh9LrQgqWCmmcxQzVSXYtyB5bzkXrYzlHTs21MYA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.60.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.60.4.tgz", - "integrity": "sha512-mcEl6CUT5IAUmQf1m9FYSmVqCJlpQ8r8eyftFUHG8i9OhY7BkBXSUdnLH5DOf0wCOjcP9v/QO93zpmF1SptCCw==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.60.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.60.4.tgz", - "integrity": "sha512-ynt3JxVd2w2buzoKDWIyiV1pJW93xlQic1THVLXilz429oijRpSHivZAgp65KBu+cMcgf1eVVjdnTLvPxgCuoQ==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.60.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.60.4.tgz", - "integrity": "sha512-Boiz5+MsaROEWDf+GGEwF8VMHGhlUoQMtIPjOgA5fv4osupqTVnJteQNKJwUcnUog2G55jYXH7KZFFiJe0TEzQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.60.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.60.4.tgz", - "integrity": "sha512-+qfSY27qIrFfI/Hom04KYFw3GKZSGU4lXus51wsb5EuySfFlWRwjkKWoE9emgRw/ukoT4Udsj4W/+xxG8VbPKg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-openbsd-x64": { - "version": "4.60.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.60.4.tgz", - "integrity": "sha512-VpTfOPHgVXEBeeR8hZ2O0F3aSso+JDWqTWmTmzcQKted54IAdUVbxE+j/MVxUsKa8L20HJhv3vUezVPoquqWjA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ] - }, - "node_modules/@rollup/rollup-openharmony-arm64": { - "version": "4.60.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.60.4.tgz", - "integrity": "sha512-IPOsh5aRYuLv/nkU51X10Bf75Bsf6+gZdx1X+QP5QM6lIJFHHqbHLG0uJn/hWthzo13UAc2umiUorqZy3axoZg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "openharmony" - ] - }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.60.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.60.4.tgz", - "integrity": "sha512-4QzE9E81OohJ/HKzHhsqU+zcYYojVOXlFMs1DdyMT6qXl/niOH7AVElmmEdUNHHS/oRkc++d5k6Vy85zFs0DEw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.60.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.60.4.tgz", - "integrity": "sha512-zTPgT1YuHHcd+Tmx7h8aml0FWFVelV5N54oHow9SLj+GfoDy/huQ+UV396N/C7KpMDMiPspRktzM1/0r1usYEA==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-gnu": { - "version": "4.60.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.60.4.tgz", - "integrity": "sha512-DRS4G7mi9lJxqEDezIkKCaUIKCrLUUDCUaCsTPCi/rtqaC6D/jjwslMQyiDU50Ka0JKpeXeRBFBAXwArY52vBw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.60.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.60.4.tgz", - "integrity": "sha512-QVTUovf40zgTqlFVrKA1uXMVvU2QWEFWfAH8Wdc48IxLvrJMQVMBRjuQyUpzZCDkakImib9eVazbWlC6ksWtJw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ] - }, "node_modules/@sec-ant/readable-stream": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/@sec-ant/readable-stream/-/readable-stream-0.4.1.tgz", @@ -827,10 +588,11 @@ "dev": true }, "node_modules/@sinclair/typebox": { - "version": "0.27.10", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.10.tgz", - "integrity": "sha512-MTBk/3jGLNB2tVxv6uLlFh1iu64iYOQ2PbdOSK3NW8JZsmlaOh2q6sdtKowBhfw8QFLmYNzTW4/oK4uATIi6ZA==", - "dev": true + "version": "0.34.49", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.49.tgz", + "integrity": "sha512-brySQQs7Jtn0joV8Xh9ZV/hZb9Ozb0pmazDIASBkYKCjXrXU3mpcFahmK/z4YDhGkQvP9mWJbVyahdtU5wQA+A==", + "dev": true, + "license": "MIT" }, "node_modules/@sindresorhus/merge-streams": { "version": "4.0.0", @@ -853,11 +615,32 @@ "@types/ms": "*" } }, - "node_modules/@types/estree": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", - "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", - "dev": true + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-report": "*" + } }, "node_modules/@types/mdast": { "version": "4.0.4", @@ -884,104 +667,35 @@ "undici-types": "~7.18.0" } }, + "node_modules/@types/stack-utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/unist": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", "dev": true }, - "node_modules/@vitest/expect": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-1.6.1.tgz", - "integrity": "sha512-jXL+9+ZNIJKruofqXuuTClf44eSpcHlgj3CiuNihUF3Ioujtmc0zIa3UJOW5RjDK1YLBJZnWBlPuqhYycLioog==", + "node_modules/@types/yargs": { + "version": "17.0.35", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.35.tgz", + "integrity": "sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==", "dev": true, + "license": "MIT", "dependencies": { - "@vitest/spy": "1.6.1", - "@vitest/utils": "1.6.1", - "chai": "^4.3.10" - }, - "funding": { - "url": "https://opencollective.com/vitest" + "@types/yargs-parser": "*" } }, - "node_modules/@vitest/runner": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-1.6.1.tgz", - "integrity": "sha512-3nSnYXkVkf3mXFfE7vVyPmi3Sazhb/2cfZGGs0JRzFsPFvAMBEcrweV1V1GsrstdXeKCTXlJbvnQwGWgEIHmOA==", + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", "dev": true, - "dependencies": { - "@vitest/utils": "1.6.1", - "p-limit": "^5.0.0", - "pathe": "^1.1.1" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/snapshot": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-1.6.1.tgz", - "integrity": "sha512-WvidQuWAzU2p95u8GAKlRMqMyN1yOJkGHnx3M1PL9Raf7AQ1kwLKg04ADlCa3+OXUZE7BceOhVZiuWAbzCKcUQ==", - "dev": true, - "dependencies": { - "magic-string": "^0.30.5", - "pathe": "^1.1.1", - "pretty-format": "^29.7.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/spy": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-1.6.1.tgz", - "integrity": "sha512-MGcMmpGkZebsMZhbQKkAf9CX5zGvjkBTqf8Zx3ApYWXr3wG+QvEu2eXWfnIIWYSJExIp4V9FCKDEeygzkYrXMw==", - "dev": true, - "dependencies": { - "tinyspy": "^2.2.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/utils": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-1.6.1.tgz", - "integrity": "sha512-jOrrUvXM4Av9ZWiG1EajNto0u96kWAhJ1LmPmJhXXQx/32MecEKd10pOLYgS2BQx1TgkGhloPU1ArDW2vvaY6g==", - "dev": true, - "dependencies": { - "diff-sequences": "^29.6.3", - "estree-walker": "^3.0.3", - "loupe": "^2.3.7", - "pretty-format": "^29.7.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/acorn": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", - "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-walk": { - "version": "8.3.5", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.5.tgz", - "integrity": "sha512-HEHNfbars9v4pgpW6SO1KSPkfoS0xVOM/9UzkJltjlsHZmJasxg8aXkuZa7SMf8vKGIBhpUsPluQSqhJFCqebw==", - "dev": true, - "dependencies": { - "acorn": "^8.11.0" - }, - "engines": { - "node": ">=0.4.0" - } + "license": "MIT" }, "node_modules/ajv": { "version": "8.20.0", @@ -1000,26 +714,21 @@ } }, "node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, "engines": { - "node": ">=10" + "node": ">=8" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/assertion-error": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", - "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", - "dev": true, - "engines": { - "node": "*" - } - }, "node_modules/bail": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", @@ -1042,31 +751,21 @@ "node": ">=8" } }, - "node_modules/cac": { - "version": "6.7.14", - "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", - "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/chai": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.5.0.tgz", - "integrity": "sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==", + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { - "assertion-error": "^1.1.0", - "check-error": "^1.0.3", - "deep-eql": "^4.1.3", - "get-func-name": "^2.0.2", - "loupe": "^2.3.6", - "pathval": "^1.1.1", - "type-detect": "^4.1.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">=4" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/character-entities": { @@ -1079,18 +778,42 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/check-error": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", - "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==", + "node_modules/ci-info": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.4.0.tgz", + "integrity": "sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", "dependencies": { - "get-func-name": "^2.0.2" + "color-name": "~1.1.4" }, "engines": { - "node": "*" + "node": ">=7.0.0" } }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, "node_modules/commander": { "version": "12.1.0", "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", @@ -1099,12 +822,6 @@ "node": ">=18" } }, - "node_modules/confbox": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz", - "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==", - "dev": true - }, "node_modules/cross-spawn": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", @@ -1149,18 +866,6 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/deep-eql": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.4.tgz", - "integrity": "sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==", - "dev": true, - "dependencies": { - "type-detect": "^4.0.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/dequal": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", @@ -1183,15 +888,6 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/diff-sequences": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", - "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", - "dev": true, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, "node_modules/esbuild": { "version": "0.28.0", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.0.tgz", @@ -1233,36 +929,32 @@ "@esbuild/win32-x64": "0.28.0" } }, - "node_modules/estree-walker": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", - "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", "dev": true, - "dependencies": { - "@types/estree": "^1.0.0" + "license": "MIT", + "engines": { + "node": ">=8" } }, - "node_modules/execa": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", - "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", + "node_modules/expect": { + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/expect/-/expect-30.4.1.tgz", + "integrity": "sha512-PMARsyh/JtqC20HoGqlFcIlQAyqUtW4PlI1rup1uhYJtKuwAjbvWi3GQMAn+STdHum/dk8xrKfUM1+5SAwpolA==", "dev": true, + "license": "MIT", "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^8.0.1", - "human-signals": "^5.0.0", - "is-stream": "^3.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^5.1.0", - "onetime": "^6.0.0", - "signal-exit": "^4.1.0", - "strip-final-newline": "^3.0.0" + "@jest/expect-utils": "30.4.1", + "@jest/get-type": "30.1.0", + "jest-matcher-utils": "30.4.1", + "jest-message-util": "30.4.1", + "jest-mock": "30.4.1", + "jest-util": "30.4.1" }, "engines": { - "node": ">=16.17" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/extend": { @@ -1359,27 +1051,6 @@ "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, - "node_modules/get-func-name": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", - "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/get-stream": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", - "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", - "dev": true, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/glob-parent": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", @@ -1392,13 +1063,21 @@ "node": ">= 6" } }, - "node_modules/human-signals": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", - "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "dev": true, + "license": "ISC" + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", "engines": { - "node": ">=16.17.0" + "node": ">=8" } }, "node_modules/is-extglob": { @@ -1443,18 +1122,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/is-unicode-supported": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz", @@ -1473,11 +1140,135 @@ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true }, + "node_modules/jest-diff": { + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-30.4.1.tgz", + "integrity": "sha512-CRpFK0RtLriVDGcPPAnR6HMVI8bSR2jnUIgralhauzYQZIb4RH9AtEInTuQr65LmmGggGcRT6HIASxwqsVsmlA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/diff-sequences": "30.4.0", + "@jest/get-type": "30.1.0", + "chalk": "^4.1.2", + "pretty-format": "30.4.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-matcher-utils": { + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-30.4.1.tgz", + "integrity": "sha512-zvYfX5CaeEkFrrLS9suWe9rvJrm9J1Iv3ua8kIBv9GEPzcnsfBf0bob37la7s67fs0nlBC3EuvkOLnXQKxtx4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/get-type": "30.1.0", + "chalk": "^4.1.2", + "jest-diff": "30.4.1", + "pretty-format": "30.4.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-message-util": { + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-30.4.1.tgz", + "integrity": "sha512-kwCKIvq0MCW1HzLoGola9Te6JUdzgV0loyKJ3Qghrkz9i5/RRIHsL95BMQc2HBBhlBKC4j22K9p11TGHH8RBpQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@jest/types": "30.4.1", + "@types/stack-utils": "^2.0.3", + "chalk": "^4.1.2", + "graceful-fs": "^4.2.11", + "jest-util": "30.4.1", + "picomatch": "^4.0.3", + "pretty-format": "30.4.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.6" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-message-util/node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/jest-mock": { + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-30.4.1.tgz", + "integrity": "sha512-/i8SVb8/NSB7RfNi8gfqu8gxLV23KaL5EpAttyb9iz8qWRIqXRLflycz/32wXsYkOnaUlx8NAKnJYtpsmXUmfw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.4.1", + "@types/node": "*", + "jest-util": "30.4.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-regex-util": { + "version": "30.4.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-30.4.0.tgz", + "integrity": "sha512-mWlvLviKIgIQ8VCuM1xRdD0TWp3zlzionlmDBjuXVBs+VkmXq6FgW9T4Emr7oGz/Rk6feDCGyiugolcQEyp3mg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-util": { + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-30.4.1.tgz", + "integrity": "sha512-vjQb1sACEiv13DKJMDToJpzVW0joCsIQrmbg0fi7CyOOt+g9jTuQl2A216pWRBYhOVt53XbL/2LbMKg1BECWOw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.4.1", + "@types/node": "*", + "chalk": "^4.1.2", + "ci-info": "^4.2.0", + "graceful-fs": "^4.2.11", + "picomatch": "^4.0.3" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-util/node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/js-tokens": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.1.tgz", - "integrity": "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==", - "dev": true + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" }, "node_modules/json-schema-traverse": { "version": "1.0.0", @@ -1485,40 +1276,6 @@ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "dev": true }, - "node_modules/local-pkg": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.5.1.tgz", - "integrity": "sha512-9rrA30MRRP3gBD3HTGnC6cDFpaE1kVDWxWgqWJUN0RvDNAo+Nz/9GxB+nHOH0ifbVFy0hSA1V6vFDvnx54lTEQ==", - "dev": true, - "dependencies": { - "mlly": "^1.7.3", - "pkg-types": "^1.2.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/loupe": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz", - "integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==", - "dev": true, - "dependencies": { - "get-func-name": "^2.0.1" - } - }, - "node_modules/magic-string": { - "version": "0.30.21", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", - "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", - "dev": true, - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.5" - } - }, "node_modules/mdast-util-from-markdown": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.3.tgz", @@ -1556,12 +1313,6 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, "node_modules/merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", @@ -2026,117 +1777,12 @@ "node": ">=8.6" } }, - "node_modules/mimic-fn": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", - "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/mlly": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.8.2.tgz", - "integrity": "sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA==", - "dev": true, - "dependencies": { - "acorn": "^8.16.0", - "pathe": "^2.0.3", - "pkg-types": "^1.3.1", - "ufo": "^1.6.3" - } - }, - "node_modules/mlly/node_modules/pathe": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", - "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", - "dev": true - }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true }, - "node_modules/nanoid": { - "version": "3.3.12", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.12.tgz", - "integrity": "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/npm-run-path": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", - "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", - "dev": true, - "dependencies": { - "path-key": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm-run-path/node_modules/path-key": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", - "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/onetime": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", - "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", - "dev": true, - "dependencies": { - "mimic-fn": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-limit": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-5.0.0.tgz", - "integrity": "sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^1.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/parse-ms": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-4.0.0.tgz", @@ -2158,26 +1804,12 @@ "node": ">=8" } }, - "node_modules/pathe": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", - "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", - "dev": true - }, - "node_modules/pathval": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", - "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", - "dev": true, - "engines": { - "node": "*" - } - }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/picomatch": { "version": "2.3.2", @@ -2191,63 +1823,33 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/pkg-types": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz", - "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==", - "dev": true, - "dependencies": { - "confbox": "^0.1.8", - "mlly": "^1.7.4", - "pathe": "^2.0.1" - } - }, - "node_modules/pkg-types/node_modules/pathe": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", - "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", - "dev": true - }, - "node_modules/postcss": { - "version": "8.5.15", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.15.tgz", - "integrity": "sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "nanoid": "^3.3.12", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, "node_modules/pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.4.1.tgz", + "integrity": "sha512-K6KiKMHTL4jjX4u3Kir2EW07nRfcqVTXIImx50wbjHQTcZPgg+gjVeNTIT3l3L1Rd4UefxfogquC9J37SoFyyw==", "dev": true, + "license": "MIT", "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" + "@jest/schemas": "30.4.1", + "ansi-styles": "^5.2.0", + "react-is-18": "npm:react-is@^18.3.1", + "react-is-19": "npm:react-is@^19.2.5" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/pretty-ms": { @@ -2285,11 +1887,21 @@ } ] }, - "node_modules/react-is": { + "node_modules/react-is-18": { + "name": "react-is", "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "dev": true + "dev": true, + "license": "MIT" + }, + "node_modules/react-is-19": { + "name": "react-is", + "version": "19.2.7", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.2.7.tgz", + "integrity": "sha512-kZFnouyVv7eP/Phmrlo9FK+zcAdriZJvzxXHF1Sl1P377WSGe2G/JxVolhTrB/jeV47lKImhNUsijjHAAbcl/A==", + "dev": true, + "license": "MIT" }, "node_modules/remark-parse": { "version": "11.0.0", @@ -2326,56 +1938,6 @@ "node": ">=0.10.0" } }, - "node_modules/rollup": { - "version": "4.60.4", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.60.4.tgz", - "integrity": "sha512-WHeFSbZYsPu3+bLoNRUuAO+wavNlocOPf3wSHTP7hcFKVnJeWsYlCDbr3mTS14FCizf9ccIxXA8sGL8zKeQN3g==", - "dev": true, - "dependencies": { - "@types/estree": "1.0.8" - }, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.60.4", - "@rollup/rollup-android-arm64": "4.60.4", - "@rollup/rollup-darwin-arm64": "4.60.4", - "@rollup/rollup-darwin-x64": "4.60.4", - "@rollup/rollup-freebsd-arm64": "4.60.4", - "@rollup/rollup-freebsd-x64": "4.60.4", - "@rollup/rollup-linux-arm-gnueabihf": "4.60.4", - "@rollup/rollup-linux-arm-musleabihf": "4.60.4", - "@rollup/rollup-linux-arm64-gnu": "4.60.4", - "@rollup/rollup-linux-arm64-musl": "4.60.4", - "@rollup/rollup-linux-loong64-gnu": "4.60.4", - "@rollup/rollup-linux-loong64-musl": "4.60.4", - "@rollup/rollup-linux-ppc64-gnu": "4.60.4", - "@rollup/rollup-linux-ppc64-musl": "4.60.4", - "@rollup/rollup-linux-riscv64-gnu": "4.60.4", - "@rollup/rollup-linux-riscv64-musl": "4.60.4", - "@rollup/rollup-linux-s390x-gnu": "4.60.4", - "@rollup/rollup-linux-x64-gnu": "4.60.4", - "@rollup/rollup-linux-x64-musl": "4.60.4", - "@rollup/rollup-openbsd-x64": "4.60.4", - "@rollup/rollup-openharmony-arm64": "4.60.4", - "@rollup/rollup-win32-arm64-msvc": "4.60.4", - "@rollup/rollup-win32-ia32-msvc": "4.60.4", - "@rollup/rollup-win32-x64-gnu": "4.60.4", - "@rollup/rollup-win32-x64-msvc": "4.60.4", - "fsevents": "~2.3.2" - } - }, - "node_modules/rollup/node_modules/@types/estree": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", - "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", - "dev": true - }, "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -2420,12 +1982,6 @@ "node": ">=8" } }, - "node_modules/siginfo": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", - "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", - "dev": true - }, "node_modules/signal-exit": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", @@ -2438,73 +1994,40 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/stackback": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", - "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", - "dev": true - }, - "node_modules/std-env": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.10.0.tgz", - "integrity": "sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==", - "dev": true - }, - "node_modules/strip-final-newline": { + "node_modules/slash": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", - "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true, + "license": "MIT", "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, - "node_modules/strip-literal": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-2.1.1.tgz", - "integrity": "sha512-631UJ6O00eNGfMiWG78ck80dfBab8X6IVFB51jZK5Icd7XAs60Z5y7QdSd/wGIklnWvRbUNloVzhOKKmutxQ6Q==", + "node_modules/stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", "dev": true, + "license": "MIT", "dependencies": { - "js-tokens": "^9.0.1" + "escape-string-regexp": "^2.0.0" }, - "funding": { - "url": "https://github.com/sponsors/antfu" + "engines": { + "node": ">=10" } }, - "node_modules/tinybench": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", - "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", - "dev": true - }, - "node_modules/tinypool": { - "version": "0.8.4", - "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-0.8.4.tgz", - "integrity": "sha512-i11VH5gS6IFeLY3gMBQ00/MmLncVP7JLXOw1vlgkytLmJK7QnEr7NXf0LBdxfmNPAeyetukOk0bOYrJrFGjYJQ==", + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/tinyspy": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-2.2.1.tgz", - "integrity": "sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==", - "dev": true, - "engines": { - "node": ">=14.0.0" + "node": ">=8" } }, "node_modules/to-regex-range": { @@ -2684,15 +2207,6 @@ "fsevents": "~2.3.3" } }, - "node_modules/type-detect": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.1.0.tgz", - "integrity": "sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/typescript": { "version": "5.9.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", @@ -2706,12 +2220,6 @@ "node": ">=14.17" } }, - "node_modules/ufo": { - "version": "1.6.4", - "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.4.tgz", - "integrity": "sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA==", - "dev": true - }, "node_modules/undici-types": { "version": "7.18.2", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.18.2.tgz", @@ -2833,558 +2341,6 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/vite": { - "version": "5.4.21", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.21.tgz", - "integrity": "sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==", - "dev": true, - "dependencies": { - "esbuild": "^0.21.3", - "postcss": "^8.4.43", - "rollup": "^4.20.0" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^18.0.0 || >=20.0.0", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "sass-embedded": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.4.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - } - } - }, - "node_modules/vite-node": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-1.6.1.tgz", - "integrity": "sha512-YAXkfvGtuTzwWbDSACdJSg4A4DZiAqckWe90Zapc/sEX3XvHcw1NdurM/6od8J207tSDqNbSsgdCacBgvJKFuA==", - "dev": true, - "dependencies": { - "cac": "^6.7.14", - "debug": "^4.3.4", - "pathe": "^1.1.1", - "picocolors": "^1.0.0", - "vite": "^5.0.0" - }, - "bin": { - "vite-node": "vite-node.mjs" - }, - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/vite/node_modules/@esbuild/aix-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", - "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/android-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", - "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/android-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", - "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/android-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", - "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/darwin-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", - "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/darwin-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", - "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/freebsd-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", - "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/freebsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", - "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", - "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", - "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", - "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-loong64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", - "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-mips64el": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", - "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", - "cpu": [ - "mips64el" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", - "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-riscv64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", - "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-s390x": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", - "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", - "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/netbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", - "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/openbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", - "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/sunos-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", - "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/win32-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", - "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/win32-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", - "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/win32-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", - "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/esbuild": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", - "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", - "dev": true, - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.21.5", - "@esbuild/android-arm": "0.21.5", - "@esbuild/android-arm64": "0.21.5", - "@esbuild/android-x64": "0.21.5", - "@esbuild/darwin-arm64": "0.21.5", - "@esbuild/darwin-x64": "0.21.5", - "@esbuild/freebsd-arm64": "0.21.5", - "@esbuild/freebsd-x64": "0.21.5", - "@esbuild/linux-arm": "0.21.5", - "@esbuild/linux-arm64": "0.21.5", - "@esbuild/linux-ia32": "0.21.5", - "@esbuild/linux-loong64": "0.21.5", - "@esbuild/linux-mips64el": "0.21.5", - "@esbuild/linux-ppc64": "0.21.5", - "@esbuild/linux-riscv64": "0.21.5", - "@esbuild/linux-s390x": "0.21.5", - "@esbuild/linux-x64": "0.21.5", - "@esbuild/netbsd-x64": "0.21.5", - "@esbuild/openbsd-x64": "0.21.5", - "@esbuild/sunos-x64": "0.21.5", - "@esbuild/win32-arm64": "0.21.5", - "@esbuild/win32-ia32": "0.21.5", - "@esbuild/win32-x64": "0.21.5" - } - }, - "node_modules/vitest": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-1.6.1.tgz", - "integrity": "sha512-Ljb1cnSJSivGN0LqXd/zmDbWEM0RNNg2t1QW/XUhYl/qPqyu7CsqeWtqQXHVaJsecLPuDoak2oJcZN2QoRIOag==", - "dev": true, - "dependencies": { - "@vitest/expect": "1.6.1", - "@vitest/runner": "1.6.1", - "@vitest/snapshot": "1.6.1", - "@vitest/spy": "1.6.1", - "@vitest/utils": "1.6.1", - "acorn-walk": "^8.3.2", - "chai": "^4.3.10", - "debug": "^4.3.4", - "execa": "^8.0.1", - "local-pkg": "^0.5.0", - "magic-string": "^0.30.5", - "pathe": "^1.1.1", - "picocolors": "^1.0.0", - "std-env": "^3.5.0", - "strip-literal": "^2.0.0", - "tinybench": "^2.5.1", - "tinypool": "^0.8.3", - "vite": "^5.0.0", - "vite-node": "1.6.1", - "why-is-node-running": "^2.2.2" - }, - "bin": { - "vitest": "vitest.mjs" - }, - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "@edge-runtime/vm": "*", - "@types/node": "^18.0.0 || >=20.0.0", - "@vitest/browser": "1.6.1", - "@vitest/ui": "1.6.1", - "happy-dom": "*", - "jsdom": "*" - }, - "peerDependenciesMeta": { - "@edge-runtime/vm": { - "optional": true - }, - "@types/node": { - "optional": true - }, - "@vitest/browser": { - "optional": true - }, - "@vitest/ui": { - "optional": true - }, - "happy-dom": { - "optional": true - }, - "jsdom": { - "optional": true - } - } - }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -3400,22 +2356,6 @@ "node": ">= 8" } }, - "node_modules/why-is-node-running": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", - "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", - "dev": true, - "dependencies": { - "siginfo": "^2.0.0", - "stackback": "0.0.2" - }, - "bin": { - "why-is-node-running": "cli.js" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/yaml": { "version": "2.9.0", "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.9.0.tgz", @@ -3431,18 +2371,6 @@ "url": "https://github.com/sponsors/eemeli" } }, - "node_modules/yocto-queue": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.2.tgz", - "integrity": "sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==", - "dev": true, - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/yoctocolors": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/yoctocolors/-/yoctocolors-2.1.2.tgz", diff --git a/package.json b/package.json index 51a3ba9..fc9f265 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,7 @@ "scripts": { "build": "tsc -p tsconfig.build.json", "typecheck": "tsc -p tsconfig.json --noEmit", - "test": "vitest run", + "test": "node --import tsx --test --test-concurrency=1", "validate": "npm run build --silent && node dist/cli.js validate", "init": "npm run build --silent && node dist/cli.js init", "manage": "npm run build --silent && node dist/cli.js status", @@ -32,9 +32,9 @@ }, "devDependencies": { "@types/node": "^24.13.2", + "expect": "^30.4.1", "truthmark": "^2.2.6", "tsx": "^4.20.6", - "typescript": "^5.9.3", - "vitest": "^1.6.1" + "typescript": "^5.9.3" } } diff --git a/references/ccgs-surface-parity-matrix.json b/references/ccgs-surface-parity-matrix.json new file mode 100644 index 0000000..89ec573 --- /dev/null +++ b/references/ccgs-surface-parity-matrix.json @@ -0,0 +1,5808 @@ +{ + "schemaVersion": "ccgs-surface-parity/v1", + "generatedAt": "1970-01-01T00:00:00.000Z", + "referenceRoot": "/opt/data/repos/Claude-Code-Game-Studios", + "counts": { + "agent": 49, + "skill": 73, + "workflow-step": 45, + "template": 40, + "rule": 11, + "total": 218 + }, + "rows": [ + { + "sourceType": "agent", + "sourceId": "accessibility-specialist", + "sourcePath": ".claude/agents/accessibility-specialist.md", + "sourceHash": "82c8550000b2882a1083338fdb97f46759ca8d493845d697b7594d219f362529", + "cgsTarget": { + "kind": "role", + "id": "accessibility-specialist", + "path": "src/roles.ts", + "hash": "9e0b866be878e48c1f3fa3e6b22246ffd0a5301c597c50717ef2f6eb54ee9693" + }, + "decision": "adapt", + "rationale": "Direct role exists; adapt CCGS depth into Codex role package and generated TOML.", + "scores": { + "contentDepth": 5, + "proceduralSpecificity": 4, + "contextContract": 3, + "outputContract": 3, + "roleSkillLinkage": 2, + "gateEscalation": 2, + "codexFit": 3, + "testability": 4 + }, + "ownerPath": "src/roles.ts", + "testPath": "tests/agents-templates.test.ts", + "status": "todo" + }, + { + "sourceType": "agent", + "sourceId": "ai-programmer", + "sourcePath": ".claude/agents/ai-programmer.md", + "sourceHash": "f9decba41651b4c225f1c4d4bf3f3bcf0eca088caf9cb3a0b3cb28f43e392b56", + "cgsTarget": { + "kind": "role", + "id": "ai-programmer", + "path": "src/roles.ts", + "hash": "87b7c77b264157d9ad6f650e0ae59cadf41cb3c054dc723ff1133a7cc25245bd" + }, + "decision": "adapt", + "rationale": "Direct role exists; adapt CCGS depth into Codex role package and generated TOML.", + "scores": { + "contentDepth": 4, + "proceduralSpecificity": 4, + "contextContract": 3, + "outputContract": 2, + "roleSkillLinkage": 2, + "gateEscalation": 2, + "codexFit": 3, + "testability": 4 + }, + "ownerPath": "src/roles.ts", + "testPath": "tests/agents-templates.test.ts", + "status": "todo" + }, + { + "sourceType": "agent", + "sourceId": "analytics-engineer", + "sourcePath": ".claude/agents/analytics-engineer.md", + "sourceHash": "51202c94fecbe57b9dbecb4dd4fc80c3ce506d4444269bf0c2bc5bf984fa480b", + "cgsTarget": { + "kind": "role", + "id": "data-scientist", + "path": "src/roles.ts", + "hash": "803d7b2583b3adc02c4f920b4887bd8cce9a1f923b2716e69e81f8effcbef6bd" + }, + "decision": "merge", + "rationale": "CCGS role is intentionally merged into an upgraded broader CGS role package.", + "scores": { + "contentDepth": 4, + "proceduralSpecificity": 4, + "contextContract": 3, + "outputContract": 2, + "roleSkillLinkage": 2, + "gateEscalation": 2, + "codexFit": 3, + "testability": 4 + }, + "ownerPath": "src/roles.ts", + "testPath": "tests/agents-templates.test.ts", + "status": "implemented" + }, + { + "sourceType": "agent", + "sourceId": "art-director", + "sourcePath": ".claude/agents/art-director.md", + "sourceHash": "7aa0c859189a5fbb069cd7d836344bb298614ad40c41872e066e2a55690d9d26", + "cgsTarget": { + "kind": "role", + "id": "senior-game-artist", + "path": "src/roles.ts", + "hash": "18cf3686a8f912f9e33021dd35d9fb125c7aabd6f62f1856aa1d0f72617b2f68" + }, + "decision": "merge", + "rationale": "CCGS role is intentionally merged into an upgraded broader CGS role package.", + "scores": { + "contentDepth": 5, + "proceduralSpecificity": 5, + "contextContract": 2, + "outputContract": 3, + "roleSkillLinkage": 2, + "gateEscalation": 3, + "codexFit": 3, + "testability": 2 + }, + "ownerPath": "src/roles.ts", + "testPath": "tests/agents-templates.test.ts", + "status": "implemented" + }, + { + "sourceType": "agent", + "sourceId": "audio-director", + "sourcePath": ".claude/agents/audio-director.md", + "sourceHash": "6f40a1c899e6f2d1f348eb91af54fa3d40a29c7236469fdc59d15f0f08c0c85a", + "cgsTarget": { + "kind": "role", + "id": "audio-director", + "path": "src/roles.ts", + "hash": "6b0e14ae270f404bcc1ccb5c22795a969ea4cc18bc535dbf9e9ab8c26e5685c7" + }, + "decision": "adapt", + "rationale": "Direct role exists; adapt CCGS depth into Codex role package and generated TOML.", + "scores": { + "contentDepth": 4, + "proceduralSpecificity": 4, + "contextContract": 2, + "outputContract": 2, + "roleSkillLinkage": 2, + "gateEscalation": 2, + "codexFit": 3, + "testability": 2 + }, + "ownerPath": "src/roles.ts", + "testPath": "tests/agents-templates.test.ts", + "status": "todo" + }, + { + "sourceType": "agent", + "sourceId": "community-manager", + "sourcePath": ".claude/agents/community-manager.md", + "sourceHash": "ba552c736a42cb83f8d04d79199f29c3b8dc81914c7530e86c266ab11c034496", + "cgsTarget": { + "kind": "role", + "id": "community-manager", + "path": "src/roles.ts", + "hash": "6729eb5bbba13782f324eb6128d1ab80ccad188cda311a57f8dcda76766e9fe8" + }, + "decision": "adapt", + "rationale": "Direct role exists; adapt CCGS depth into Codex role package and generated TOML.", + "scores": { + "contentDepth": 5, + "proceduralSpecificity": 4, + "contextContract": 3, + "outputContract": 3, + "roleSkillLinkage": 2, + "gateEscalation": 2, + "codexFit": 3, + "testability": 4 + }, + "ownerPath": "src/roles.ts", + "testPath": "tests/agents-templates.test.ts", + "status": "todo" + }, + { + "sourceType": "agent", + "sourceId": "creative-director", + "sourcePath": ".claude/agents/creative-director.md", + "sourceHash": "00b9dc2b494b5feeefa5203fdefbd9bd9a4789a23ed2d192898b5ef84036b966", + "cgsTarget": { + "kind": "role", + "id": "creative-director", + "path": "src/roles.ts", + "hash": "d3bf46d45aad183f077d0a38ac5ab3e5d494afb059b6413d9c54021e17aec320" + }, + "decision": "adapt", + "rationale": "Direct role has an upgraded CCGS-depth Codex role package and generated TOML coverage.", + "scores": { + "contentDepth": 5, + "proceduralSpecificity": 4, + "contextContract": 3, + "outputContract": 4, + "roleSkillLinkage": 4, + "gateEscalation": 3, + "codexFit": 3, + "testability": 4 + }, + "ownerPath": "src/roles.ts", + "testPath": "tests/agents-templates.test.ts", + "status": "implemented" + }, + { + "sourceType": "agent", + "sourceId": "devops-engineer", + "sourcePath": ".claude/agents/devops-engineer.md", + "sourceHash": "36bf5a49a121bbb9a7a611408d1d208436e1c9b1395b3f2e9c2cb7d461e50171", + "cgsTarget": { + "kind": "role", + "id": "devops-engineer", + "path": "src/roles.ts", + "hash": "a007fcb0c7a86e7eb9b03fb12a07d5f9327185a2b0a70b824ad71d0802c02d18" + }, + "decision": "adapt", + "rationale": "Direct role exists; adapt CCGS depth into Codex role package and generated TOML.", + "scores": { + "contentDepth": 4, + "proceduralSpecificity": 4, + "contextContract": 3, + "outputContract": 2, + "roleSkillLinkage": 2, + "gateEscalation": 2, + "codexFit": 3, + "testability": 4 + }, + "ownerPath": "src/roles.ts", + "testPath": "tests/agents-templates.test.ts", + "status": "todo" + }, + { + "sourceType": "agent", + "sourceId": "economy-designer", + "sourcePath": ".claude/agents/economy-designer.md", + "sourceHash": "523d9faf11dfe6581df5fa3248c4a3d43b8d284715502c868cb8e796fd55eae0", + "cgsTarget": { + "kind": "role", + "id": "economy-designer", + "path": "src/roles.ts", + "hash": "5f492860e855ad17092469374b8697486b067e7af4c7ffbe2ea11a5948cc15d4" + }, + "decision": "adapt", + "rationale": "Direct role exists; adapt CCGS depth into Codex role package and generated TOML.", + "scores": { + "contentDepth": 5, + "proceduralSpecificity": 4, + "contextContract": 3, + "outputContract": 3, + "roleSkillLinkage": 2, + "gateEscalation": 2, + "codexFit": 3, + "testability": 2 + }, + "ownerPath": "src/roles.ts", + "testPath": "tests/agents-templates.test.ts", + "status": "todo" + }, + { + "sourceType": "agent", + "sourceId": "engine-programmer", + "sourcePath": ".claude/agents/engine-programmer.md", + "sourceHash": "322b59a3167298297657c846272567ef0d6994144649da626a6a7cc651d95c46", + "cgsTarget": { + "kind": "role", + "id": "engine-programmer", + "path": "src/roles.ts", + "hash": "654bc5b932d60452e0f768f641ff29942cd448bc3ff02a6c4f928abb4a89b442" + }, + "decision": "adapt", + "rationale": "Direct role exists; adapt CCGS depth into Codex role package and generated TOML.", + "scores": { + "contentDepth": 4, + "proceduralSpecificity": 4, + "contextContract": 3, + "outputContract": 2, + "roleSkillLinkage": 2, + "gateEscalation": 2, + "codexFit": 3, + "testability": 4 + }, + "ownerPath": "src/roles.ts", + "testPath": "tests/agents-templates.test.ts", + "status": "todo" + }, + { + "sourceType": "agent", + "sourceId": "game-designer", + "sourcePath": ".claude/agents/game-designer.md", + "sourceHash": "a1b4fb4f1466b69140a23f8e12d3a5eba624d2a6318da32e2b755e471d41584f", + "cgsTarget": { + "kind": "role", + "id": "game-designer", + "path": "src/roles.ts", + "hash": "0df2960affc370645b88025674feafac147ac9f1c4d72b4268447fb298d2057a" + }, + "decision": "adapt", + "rationale": "Direct role has an upgraded CCGS-depth Codex role package and generated TOML coverage.", + "scores": { + "contentDepth": 5, + "proceduralSpecificity": 5, + "contextContract": 2, + "outputContract": 2, + "roleSkillLinkage": 5, + "gateEscalation": 2, + "codexFit": 3, + "testability": 4 + }, + "ownerPath": "src/roles.ts", + "testPath": "tests/agents-templates.test.ts", + "status": "implemented" + }, + { + "sourceType": "agent", + "sourceId": "gameplay-programmer", + "sourcePath": ".claude/agents/gameplay-programmer.md", + "sourceHash": "287ac70fb839e40b0e392e47e6e23ddd90851103d41c0a82df7f56e0e168834e", + "cgsTarget": { + "kind": "role", + "id": "gameplay-programmer", + "path": "src/roles.ts", + "hash": "39d37f2b840cd389b18df08ec299b49264a04caf1cbb8e9c7c33aa0b114c504e" + }, + "decision": "adapt", + "rationale": "Direct role has an upgraded CCGS-depth Codex role package and generated TOML coverage.", + "scores": { + "contentDepth": 5, + "proceduralSpecificity": 4, + "contextContract": 3, + "outputContract": 2, + "roleSkillLinkage": 2, + "gateEscalation": 2, + "codexFit": 3, + "testability": 4 + }, + "ownerPath": "src/roles.ts", + "testPath": "tests/agents-templates.test.ts", + "status": "implemented" + }, + { + "sourceType": "agent", + "sourceId": "godot-csharp-specialist", + "sourcePath": ".claude/agents/godot-csharp-specialist.md", + "sourceHash": "b15ca77993fb986245b4ca4e9ac7822f4d74adfd3a352d4e331a0c24d08b82fb", + "cgsTarget": { + "kind": "none", + "id": "", + "path": "" + }, + "decision": "defer", + "rationale": "No matching CGS surface exists yet; audit requires explicit follow-up.", + "scores": { + "contentDepth": 5, + "proceduralSpecificity": 4, + "contextContract": 3, + "outputContract": 2, + "roleSkillLinkage": 2, + "gateEscalation": 2, + "codexFit": 3, + "testability": 4 + }, + "ownerPath": "references/ccgs-surface-parity-matrix.json", + "testPath": "tests/ccgs-parity-audit.test.ts", + "status": "todo" + }, + { + "sourceType": "agent", + "sourceId": "godot-gdextension-specialist", + "sourcePath": ".claude/agents/godot-gdextension-specialist.md", + "sourceHash": "5781a7380ef3f90e6301e8c330cbe4f324b3e7ac0f66a91c127842e3c5a8a111", + "cgsTarget": { + "kind": "none", + "id": "", + "path": "" + }, + "decision": "defer", + "rationale": "No matching CGS surface exists yet; audit requires explicit follow-up.", + "scores": { + "contentDepth": 5, + "proceduralSpecificity": 4, + "contextContract": 3, + "outputContract": 2, + "roleSkillLinkage": 2, + "gateEscalation": 2, + "codexFit": 3, + "testability": 4 + }, + "ownerPath": "references/ccgs-surface-parity-matrix.json", + "testPath": "tests/ccgs-parity-audit.test.ts", + "status": "todo" + }, + { + "sourceType": "agent", + "sourceId": "godot-gdscript-specialist", + "sourcePath": ".claude/agents/godot-gdscript-specialist.md", + "sourceHash": "03c4d2325044ff16b55bab1e0c6412f0688704ece76513db02b7fcf352668c88", + "cgsTarget": { + "kind": "none", + "id": "", + "path": "" + }, + "decision": "defer", + "rationale": "No matching CGS surface exists yet; audit requires explicit follow-up.", + "scores": { + "contentDepth": 5, + "proceduralSpecificity": 4, + "contextContract": 3, + "outputContract": 2, + "roleSkillLinkage": 2, + "gateEscalation": 2, + "codexFit": 3, + "testability": 4 + }, + "ownerPath": "references/ccgs-surface-parity-matrix.json", + "testPath": "tests/ccgs-parity-audit.test.ts", + "status": "todo" + }, + { + "sourceType": "agent", + "sourceId": "godot-shader-specialist", + "sourcePath": ".claude/agents/godot-shader-specialist.md", + "sourceHash": "f0497d594b94ca4d0272bca8fb20ac7b8b594534060e774f64f2de143fb8a64e", + "cgsTarget": { + "kind": "none", + "id": "", + "path": "" + }, + "decision": "defer", + "rationale": "No matching CGS surface exists yet; audit requires explicit follow-up.", + "scores": { + "contentDepth": 5, + "proceduralSpecificity": 4, + "contextContract": 3, + "outputContract": 2, + "roleSkillLinkage": 2, + "gateEscalation": 2, + "codexFit": 3, + "testability": 4 + }, + "ownerPath": "references/ccgs-surface-parity-matrix.json", + "testPath": "tests/ccgs-parity-audit.test.ts", + "status": "todo" + }, + { + "sourceType": "agent", + "sourceId": "godot-specialist", + "sourcePath": ".claude/agents/godot-specialist.md", + "sourceHash": "3156133f9bff9463a12cb48e6337f49a3ab39359550c18eabac4ac70b84b6e37", + "cgsTarget": { + "kind": "role", + "id": "godot-specialist", + "path": "src/roles.ts", + "hash": "57b8381189093ab38a314597d236a1b2f29bd867ad1e36efef125274b663de06" + }, + "decision": "adapt", + "rationale": "Direct role exists; adapt CCGS depth into Codex role package and generated TOML.", + "scores": { + "contentDepth": 5, + "proceduralSpecificity": 4, + "contextContract": 3, + "outputContract": 2, + "roleSkillLinkage": 2, + "gateEscalation": 2, + "codexFit": 3, + "testability": 4 + }, + "ownerPath": "src/roles.ts", + "testPath": "tests/agents-templates.test.ts", + "status": "todo" + }, + { + "sourceType": "agent", + "sourceId": "lead-programmer", + "sourcePath": ".claude/agents/lead-programmer.md", + "sourceHash": "2557de5195416e28c5ee156db8c2ef7ec53b7935edd5899c26c2fc5bd9efa3b0", + "cgsTarget": { + "kind": "role", + "id": "technical-director", + "path": "src/roles.ts", + "hash": "6d24784b99924611957630bc3deb7b6b112605fc5861b74ed9b570d9516238f4" + }, + "decision": "merge", + "rationale": "CCGS role is intentionally merged into an upgraded broader CGS role package.", + "scores": { + "contentDepth": 4, + "proceduralSpecificity": 4, + "contextContract": 3, + "outputContract": 2, + "roleSkillLinkage": 5, + "gateEscalation": 2, + "codexFit": 3, + "testability": 4 + }, + "ownerPath": "src/roles.ts", + "testPath": "tests/agents-templates.test.ts", + "status": "implemented" + }, + { + "sourceType": "agent", + "sourceId": "level-designer", + "sourcePath": ".claude/agents/level-designer.md", + "sourceHash": "6121007acde96a808235c4290669bb5de11f1874cd1da6c9d4f0c8c7fad7ef61", + "cgsTarget": { + "kind": "role", + "id": "level-designer", + "path": "src/roles.ts", + "hash": "72f099ea489d6045db16b5cf80a2a6b3e562841aeb16fe4a76e624e5932d4f72" + }, + "decision": "adapt", + "rationale": "Direct role exists; adapt CCGS depth into Codex role package and generated TOML.", + "scores": { + "contentDepth": 4, + "proceduralSpecificity": 4, + "contextContract": 2, + "outputContract": 2, + "roleSkillLinkage": 2, + "gateEscalation": 2, + "codexFit": 3, + "testability": 2 + }, + "ownerPath": "src/roles.ts", + "testPath": "tests/agents-templates.test.ts", + "status": "todo" + }, + { + "sourceType": "agent", + "sourceId": "live-ops-designer", + "sourcePath": ".claude/agents/live-ops-designer.md", + "sourceHash": "19fead72a61b75adceaf03763416ab3f4f0c88d8545bc2a844ae2e03d0e62f04", + "cgsTarget": { + "kind": "role", + "id": "live-ops-designer", + "path": "src/roles.ts", + "hash": "bfa0eec4d1dc0db319a93701cfdc1fa6489ac6289b583fd7f9f7e2912f278180" + }, + "decision": "adapt", + "rationale": "Direct role exists; adapt CCGS depth into Codex role package and generated TOML.", + "scores": { + "contentDepth": 5, + "proceduralSpecificity": 4, + "contextContract": 2, + "outputContract": 2, + "roleSkillLinkage": 2, + "gateEscalation": 2, + "codexFit": 3, + "testability": 4 + }, + "ownerPath": "src/roles.ts", + "testPath": "tests/agents-templates.test.ts", + "status": "todo" + }, + { + "sourceType": "agent", + "sourceId": "localization-lead", + "sourcePath": ".claude/agents/localization-lead.md", + "sourceHash": "96991fd33e46cc60179d1abca967ac56f6e809908a8a5fdd71aafa1be3571704", + "cgsTarget": { + "kind": "role", + "id": "localization-lead", + "path": "src/roles.ts", + "hash": "490a225b6cecd4a3766bfe0cdb404327924ae530934710a1c00e4005bb70c4d6" + }, + "decision": "adapt", + "rationale": "Direct role exists; adapt CCGS depth into Codex role package and generated TOML.", + "scores": { + "contentDepth": 5, + "proceduralSpecificity": 4, + "contextContract": 3, + "outputContract": 2, + "roleSkillLinkage": 2, + "gateEscalation": 2, + "codexFit": 3, + "testability": 4 + }, + "ownerPath": "src/roles.ts", + "testPath": "tests/agents-templates.test.ts", + "status": "todo" + }, + { + "sourceType": "agent", + "sourceId": "narrative-director", + "sourcePath": ".claude/agents/narrative-director.md", + "sourceHash": "2a1b23c70ae19182eac9c55eddfb3c98d1abca26633028281db555d0bfd101f1", + "cgsTarget": { + "kind": "role", + "id": "narrative-designer", + "path": "src/roles.ts", + "hash": "9fb4edd2ed29485dcebead8f1d289f7b1488a8c95cd3f120fe6187afe92b6326" + }, + "decision": "merge", + "rationale": "CCGS role is intentionally merged into an upgraded broader CGS role package.", + "scores": { + "contentDepth": 5, + "proceduralSpecificity": 4, + "contextContract": 2, + "outputContract": 2, + "roleSkillLinkage": 2, + "gateEscalation": 2, + "codexFit": 3, + "testability": 2 + }, + "ownerPath": "src/roles.ts", + "testPath": "tests/agents-templates.test.ts", + "status": "implemented" + }, + { + "sourceType": "agent", + "sourceId": "network-programmer", + "sourcePath": ".claude/agents/network-programmer.md", + "sourceHash": "b3f107bb01b24475f93aebb6af1735fd90dd73afe070bae667cd9475b2e616e1", + "cgsTarget": { + "kind": "role", + "id": "network-programmer", + "path": "src/roles.ts", + "hash": "c031a9578669ffc7f8565a53479d8ea411d92165f727351048efc73a8bf57afd" + }, + "decision": "adapt", + "rationale": "Direct role exists; adapt CCGS depth into Codex role package and generated TOML.", + "scores": { + "contentDepth": 4, + "proceduralSpecificity": 4, + "contextContract": 3, + "outputContract": 2, + "roleSkillLinkage": 2, + "gateEscalation": 2, + "codexFit": 3, + "testability": 4 + }, + "ownerPath": "src/roles.ts", + "testPath": "tests/agents-templates.test.ts", + "status": "todo" + }, + { + "sourceType": "agent", + "sourceId": "performance-analyst", + "sourcePath": ".claude/agents/performance-analyst.md", + "sourceHash": "c155149e303e200a00074721cd3d9bf5b92d080871ab6298670954aec5705468", + "cgsTarget": { + "kind": "role", + "id": "performance-analyst", + "path": "src/roles.ts", + "hash": "1813dea22d85c60b8f358b116794fc2cb2337e4c17d01e9a0c238fcbe3482b79" + }, + "decision": "adapt", + "rationale": "Direct role has an upgraded CCGS-depth Codex role package and generated TOML coverage.", + "scores": { + "contentDepth": 4, + "proceduralSpecificity": 4, + "contextContract": 3, + "outputContract": 3, + "roleSkillLinkage": 2, + "gateEscalation": 2, + "codexFit": 3, + "testability": 4 + }, + "ownerPath": "src/roles.ts", + "testPath": "tests/agents-templates.test.ts", + "status": "implemented" + }, + { + "sourceType": "agent", + "sourceId": "producer", + "sourcePath": ".claude/agents/producer.md", + "sourceHash": "05f8bf426001cbd07ca9ca40dde0348139e208f97af7d87abcfecf8ca84c3257", + "cgsTarget": { + "kind": "role", + "id": "producer", + "path": "src/roles.ts", + "hash": "e8e98229b460962d6e81d7f422165e8553ff1f1817658b6d1a46e353ef38d2dc" + }, + "decision": "adapt", + "rationale": "Direct role has an upgraded CCGS-depth Codex role package and generated TOML coverage.", + "scores": { + "contentDepth": 5, + "proceduralSpecificity": 4, + "contextContract": 2, + "outputContract": 4, + "roleSkillLinkage": 5, + "gateEscalation": 3, + "codexFit": 3, + "testability": 4 + }, + "ownerPath": "src/roles.ts", + "testPath": "tests/agents-templates.test.ts", + "status": "implemented" + }, + { + "sourceType": "agent", + "sourceId": "prototyper", + "sourcePath": ".claude/agents/prototyper.md", + "sourceHash": "c1fa09ea15b0bfb532098bc6ee24ebb998570ed7eb6cff5f3f4c4456f09ff956", + "cgsTarget": { + "kind": "role", + "id": "gameplay-programmer", + "path": "src/roles.ts", + "hash": "39d37f2b840cd389b18df08ec299b49264a04caf1cbb8e9c7c33aa0b114c504e" + }, + "decision": "merge", + "rationale": "CCGS role is intentionally merged into an upgraded broader CGS role package.", + "scores": { + "contentDepth": 5, + "proceduralSpecificity": 5, + "contextContract": 2, + "outputContract": 2, + "roleSkillLinkage": 2, + "gateEscalation": 2, + "codexFit": 3, + "testability": 4 + }, + "ownerPath": "src/roles.ts", + "testPath": "tests/agents-templates.test.ts", + "status": "implemented" + }, + { + "sourceType": "agent", + "sourceId": "qa-lead", + "sourcePath": ".claude/agents/qa-lead.md", + "sourceHash": "d01ddb9728c7c34778db8c9b3e9fc2a1d64efa792a140573d09946eea69bce32", + "cgsTarget": { + "kind": "role", + "id": "qa-playtester", + "path": "src/roles.ts", + "hash": "ec65ba231e34a9ab2e821a98bb9a347acdacd5ddc83a40bcb7052a35119e09a2" + }, + "decision": "merge", + "rationale": "CCGS role is intentionally merged into an upgraded broader CGS role package.", + "scores": { + "contentDepth": 5, + "proceduralSpecificity": 4, + "contextContract": 3, + "outputContract": 2, + "roleSkillLinkage": 4, + "gateEscalation": 2, + "codexFit": 3, + "testability": 4 + }, + "ownerPath": "src/roles.ts", + "testPath": "tests/agents-templates.test.ts", + "status": "implemented" + }, + { + "sourceType": "agent", + "sourceId": "qa-tester", + "sourcePath": ".claude/agents/qa-tester.md", + "sourceHash": "73eb6e7fa9921853986d6bc7afbedfb26992a16db1acc01ded754b1a9a10df61", + "cgsTarget": { + "kind": "role", + "id": "qa-playtester", + "path": "src/roles.ts", + "hash": "ec65ba231e34a9ab2e821a98bb9a347acdacd5ddc83a40bcb7052a35119e09a2" + }, + "decision": "merge", + "rationale": "CCGS role is intentionally merged into an upgraded broader CGS role package.", + "scores": { + "contentDepth": 5, + "proceduralSpecificity": 5, + "contextContract": 3, + "outputContract": 4, + "roleSkillLinkage": 2, + "gateEscalation": 3, + "codexFit": 3, + "testability": 4 + }, + "ownerPath": "src/roles.ts", + "testPath": "tests/agents-templates.test.ts", + "status": "implemented" + }, + { + "sourceType": "agent", + "sourceId": "release-manager", + "sourcePath": ".claude/agents/release-manager.md", + "sourceHash": "75df18172fcb905c544972edcfe43589093f02f6abf41d388f952c1eadbe11bd", + "cgsTarget": { + "kind": "role", + "id": "release-manager", + "path": "src/roles.ts", + "hash": "295ec48832d1e478e1a991fdf65142f6a00942d2499b99d3d54ef68970d161e4" + }, + "decision": "adapt", + "rationale": "Direct role has an upgraded CCGS-depth Codex role package and generated TOML coverage.", + "scores": { + "contentDepth": 5, + "proceduralSpecificity": 4, + "contextContract": 3, + "outputContract": 2, + "roleSkillLinkage": 5, + "gateEscalation": 2, + "codexFit": 3, + "testability": 4 + }, + "ownerPath": "src/roles.ts", + "testPath": "tests/agents-templates.test.ts", + "status": "implemented" + }, + { + "sourceType": "agent", + "sourceId": "security-engineer", + "sourcePath": ".claude/agents/security-engineer.md", + "sourceHash": "73bf76067ec312fa592d9c81b26c4a7b64f8831a50404244a1ec398a77091c7e", + "cgsTarget": { + "kind": "role", + "id": "security-engineer", + "path": "src/roles.ts", + "hash": "456efdf88cf280fe0e5b727fd90034bf8f8ca1d1e0b4feb2f6640172f8c67270" + }, + "decision": "adapt", + "rationale": "Direct role exists; adapt CCGS depth into Codex role package and generated TOML.", + "scores": { + "contentDepth": 5, + "proceduralSpecificity": 4, + "contextContract": 3, + "outputContract": 2, + "roleSkillLinkage": 2, + "gateEscalation": 2, + "codexFit": 3, + "testability": 4 + }, + "ownerPath": "src/roles.ts", + "testPath": "tests/agents-templates.test.ts", + "status": "todo" + }, + { + "sourceType": "agent", + "sourceId": "sound-designer", + "sourcePath": ".claude/agents/sound-designer.md", + "sourceHash": "4ebaef7c7069a5dd5a68ed12ca251035f0f9b2852fd29b9eca3ea2c5a4fdf088", + "cgsTarget": { + "kind": "role", + "id": "sound-designer", + "path": "src/roles.ts", + "hash": "e3faebb084fdf10692f043708e806f72d80347e28f2a04f6e8159b1bcb16e120" + }, + "decision": "adapt", + "rationale": "Direct role exists; adapt CCGS depth into Codex role package and generated TOML.", + "scores": { + "contentDepth": 4, + "proceduralSpecificity": 4, + "contextContract": 3, + "outputContract": 2, + "roleSkillLinkage": 2, + "gateEscalation": 2, + "codexFit": 3, + "testability": 4 + }, + "ownerPath": "src/roles.ts", + "testPath": "tests/agents-templates.test.ts", + "status": "todo" + }, + { + "sourceType": "agent", + "sourceId": "systems-designer", + "sourcePath": ".claude/agents/systems-designer.md", + "sourceHash": "b12973f4dce65c5add8e31fc570c4ece2b6f9855d2c89ce1645c0901a14adc17", + "cgsTarget": { + "kind": "role", + "id": "systems-designer", + "path": "src/roles.ts", + "hash": "38cd4d5a286c3e3a4ebec9e6e9fc3de2a21fbeffd667e6c7679e132ad6057eba" + }, + "decision": "adapt", + "rationale": "Direct role has an upgraded CCGS-depth Codex role package and generated TOML coverage.", + "scores": { + "contentDepth": 5, + "proceduralSpecificity": 5, + "contextContract": 3, + "outputContract": 3, + "roleSkillLinkage": 2, + "gateEscalation": 2, + "codexFit": 3, + "testability": 2 + }, + "ownerPath": "src/roles.ts", + "testPath": "tests/agents-templates.test.ts", + "status": "implemented" + }, + { + "sourceType": "agent", + "sourceId": "technical-artist", + "sourcePath": ".claude/agents/technical-artist.md", + "sourceHash": "30feb7cd99da83ef1b1350b109535085239eb5b2d210eeb22faa8e54633ba77d", + "cgsTarget": { + "kind": "role", + "id": "technical-artist", + "path": "src/roles.ts", + "hash": "b3582c5e8dce3cf710b44c0539790727cc7f5be425ac1f9893c6d25d53be0c84" + }, + "decision": "adapt", + "rationale": "Direct role exists; adapt CCGS depth into Codex role package and generated TOML.", + "scores": { + "contentDepth": 4, + "proceduralSpecificity": 4, + "contextContract": 3, + "outputContract": 2, + "roleSkillLinkage": 2, + "gateEscalation": 2, + "codexFit": 3, + "testability": 4 + }, + "ownerPath": "src/roles.ts", + "testPath": "tests/agents-templates.test.ts", + "status": "todo" + }, + { + "sourceType": "agent", + "sourceId": "technical-director", + "sourcePath": ".claude/agents/technical-director.md", + "sourceHash": "fe98888f29067eb81ef4dd29d93c3498048628f4bcf6404a1c594f8a6343f9b2", + "cgsTarget": { + "kind": "role", + "id": "technical-director", + "path": "src/roles.ts", + "hash": "6d24784b99924611957630bc3deb7b6b112605fc5861b74ed9b570d9516238f4" + }, + "decision": "adapt", + "rationale": "Direct role has an upgraded CCGS-depth Codex role package and generated TOML coverage.", + "scores": { + "contentDepth": 5, + "proceduralSpecificity": 4, + "contextContract": 2, + "outputContract": 4, + "roleSkillLinkage": 2, + "gateEscalation": 3, + "codexFit": 3, + "testability": 4 + }, + "ownerPath": "src/roles.ts", + "testPath": "tests/agents-templates.test.ts", + "status": "implemented" + }, + { + "sourceType": "agent", + "sourceId": "tools-programmer", + "sourcePath": ".claude/agents/tools-programmer.md", + "sourceHash": "1304ed30dc06506f043cbe6df33617a483988a1f73aedec1f9867bbc5de7d20b", + "cgsTarget": { + "kind": "role", + "id": "tools-programmer", + "path": "src/roles.ts", + "hash": "ae31a7e75ad8225a861b986aabcd4337b4dbdcd463b2c48f4beaba1d71d3d5e7" + }, + "decision": "adapt", + "rationale": "Direct role exists; adapt CCGS depth into Codex role package and generated TOML.", + "scores": { + "contentDepth": 4, + "proceduralSpecificity": 4, + "contextContract": 3, + "outputContract": 2, + "roleSkillLinkage": 2, + "gateEscalation": 2, + "codexFit": 3, + "testability": 4 + }, + "ownerPath": "src/roles.ts", + "testPath": "tests/agents-templates.test.ts", + "status": "todo" + }, + { + "sourceType": "agent", + "sourceId": "ue-blueprint-specialist", + "sourcePath": ".claude/agents/ue-blueprint-specialist.md", + "sourceHash": "f801d74b4dbcb052439e841a63c1a853ba6242dafee5d63d18b129883c95493c", + "cgsTarget": { + "kind": "none", + "id": "", + "path": "" + }, + "decision": "defer", + "rationale": "No matching CGS surface exists yet; audit requires explicit follow-up.", + "scores": { + "contentDepth": 5, + "proceduralSpecificity": 4, + "contextContract": 3, + "outputContract": 2, + "roleSkillLinkage": 2, + "gateEscalation": 2, + "codexFit": 3, + "testability": 4 + }, + "ownerPath": "references/ccgs-surface-parity-matrix.json", + "testPath": "tests/ccgs-parity-audit.test.ts", + "status": "todo" + }, + { + "sourceType": "agent", + "sourceId": "ue-gas-specialist", + "sourcePath": ".claude/agents/ue-gas-specialist.md", + "sourceHash": "b25dc54f2ec83ca4e3790197f1b2aed5c2c1054eb6449b2dd447a1b6d4a8f9ba", + "cgsTarget": { + "kind": "none", + "id": "", + "path": "" + }, + "decision": "defer", + "rationale": "No matching CGS surface exists yet; audit requires explicit follow-up.", + "scores": { + "contentDepth": 5, + "proceduralSpecificity": 4, + "contextContract": 3, + "outputContract": 2, + "roleSkillLinkage": 2, + "gateEscalation": 2, + "codexFit": 3, + "testability": 4 + }, + "ownerPath": "references/ccgs-surface-parity-matrix.json", + "testPath": "tests/ccgs-parity-audit.test.ts", + "status": "todo" + }, + { + "sourceType": "agent", + "sourceId": "ue-replication-specialist", + "sourcePath": ".claude/agents/ue-replication-specialist.md", + "sourceHash": "9bac007eff06a320c1559d0f81f783be689c644a217b0b4605781e39fbaa1918", + "cgsTarget": { + "kind": "none", + "id": "", + "path": "" + }, + "decision": "defer", + "rationale": "No matching CGS surface exists yet; audit requires explicit follow-up.", + "scores": { + "contentDepth": 5, + "proceduralSpecificity": 4, + "contextContract": 3, + "outputContract": 2, + "roleSkillLinkage": 2, + "gateEscalation": 2, + "codexFit": 3, + "testability": 4 + }, + "ownerPath": "references/ccgs-surface-parity-matrix.json", + "testPath": "tests/ccgs-parity-audit.test.ts", + "status": "todo" + }, + { + "sourceType": "agent", + "sourceId": "ue-umg-specialist", + "sourcePath": ".claude/agents/ue-umg-specialist.md", + "sourceHash": "bdbda2833cc07ca389c01a40d5f608137c7711a02b7a8313a16af50f0c5d0ae3", + "cgsTarget": { + "kind": "none", + "id": "", + "path": "" + }, + "decision": "defer", + "rationale": "No matching CGS surface exists yet; audit requires explicit follow-up.", + "scores": { + "contentDepth": 5, + "proceduralSpecificity": 4, + "contextContract": 3, + "outputContract": 2, + "roleSkillLinkage": 2, + "gateEscalation": 2, + "codexFit": 3, + "testability": 4 + }, + "ownerPath": "references/ccgs-surface-parity-matrix.json", + "testPath": "tests/ccgs-parity-audit.test.ts", + "status": "todo" + }, + { + "sourceType": "agent", + "sourceId": "ui-programmer", + "sourcePath": ".claude/agents/ui-programmer.md", + "sourceHash": "6cd29c2088724918b2680d3cc35c379276b7af11d6aa10ac990172280b1d5f48", + "cgsTarget": { + "kind": "role", + "id": "ui-programmer", + "path": "src/roles.ts", + "hash": "10c5a6301d621d62fbd46bf52fe054a070fe83f2bd07b8be68003606e861b270" + }, + "decision": "adapt", + "rationale": "Direct role exists; adapt CCGS depth into Codex role package and generated TOML.", + "scores": { + "contentDepth": 4, + "proceduralSpecificity": 4, + "contextContract": 3, + "outputContract": 2, + "roleSkillLinkage": 2, + "gateEscalation": 2, + "codexFit": 3, + "testability": 4 + }, + "ownerPath": "src/roles.ts", + "testPath": "tests/agents-templates.test.ts", + "status": "todo" + }, + { + "sourceType": "agent", + "sourceId": "unity-addressables-specialist", + "sourcePath": ".claude/agents/unity-addressables-specialist.md", + "sourceHash": "29e14d428647a55baeaa9faf2adae55fcbc6e4a56ed4dfd61c534641fb0253ea", + "cgsTarget": { + "kind": "none", + "id": "", + "path": "" + }, + "decision": "defer", + "rationale": "No matching CGS surface exists yet; audit requires explicit follow-up.", + "scores": { + "contentDepth": 5, + "proceduralSpecificity": 4, + "contextContract": 3, + "outputContract": 2, + "roleSkillLinkage": 2, + "gateEscalation": 2, + "codexFit": 3, + "testability": 4 + }, + "ownerPath": "references/ccgs-surface-parity-matrix.json", + "testPath": "tests/ccgs-parity-audit.test.ts", + "status": "todo" + }, + { + "sourceType": "agent", + "sourceId": "unity-dots-specialist", + "sourcePath": ".claude/agents/unity-dots-specialist.md", + "sourceHash": "98c328463e1b6af0b44f46bd3cb27abce52ba7e85571c56d18118c95a8bf9273", + "cgsTarget": { + "kind": "none", + "id": "", + "path": "" + }, + "decision": "defer", + "rationale": "No matching CGS surface exists yet; audit requires explicit follow-up.", + "scores": { + "contentDepth": 5, + "proceduralSpecificity": 4, + "contextContract": 3, + "outputContract": 2, + "roleSkillLinkage": 2, + "gateEscalation": 2, + "codexFit": 3, + "testability": 4 + }, + "ownerPath": "references/ccgs-surface-parity-matrix.json", + "testPath": "tests/ccgs-parity-audit.test.ts", + "status": "todo" + }, + { + "sourceType": "agent", + "sourceId": "unity-shader-specialist", + "sourcePath": ".claude/agents/unity-shader-specialist.md", + "sourceHash": "41bc71d8563a71ed386039819adc31593a54c3fdf747c3dc080a713d22db6d5a", + "cgsTarget": { + "kind": "none", + "id": "", + "path": "" + }, + "decision": "defer", + "rationale": "No matching CGS surface exists yet; audit requires explicit follow-up.", + "scores": { + "contentDepth": 5, + "proceduralSpecificity": 4, + "contextContract": 3, + "outputContract": 2, + "roleSkillLinkage": 2, + "gateEscalation": 2, + "codexFit": 3, + "testability": 4 + }, + "ownerPath": "references/ccgs-surface-parity-matrix.json", + "testPath": "tests/ccgs-parity-audit.test.ts", + "status": "todo" + }, + { + "sourceType": "agent", + "sourceId": "unity-specialist", + "sourcePath": ".claude/agents/unity-specialist.md", + "sourceHash": "81777b58e3a30f4a131025e01af6ac8fb42065214df6271e59df1aa11e5374e4", + "cgsTarget": { + "kind": "role", + "id": "unity-specialist", + "path": "src/roles.ts", + "hash": "2bc1f02b0a5481a272184b0ac9c45bcee5f0c7e661c51986e2b187b980b161ac" + }, + "decision": "adapt", + "rationale": "Direct role exists; adapt CCGS depth into Codex role package and generated TOML.", + "scores": { + "contentDepth": 5, + "proceduralSpecificity": 4, + "contextContract": 3, + "outputContract": 2, + "roleSkillLinkage": 2, + "gateEscalation": 2, + "codexFit": 3, + "testability": 4 + }, + "ownerPath": "src/roles.ts", + "testPath": "tests/agents-templates.test.ts", + "status": "todo" + }, + { + "sourceType": "agent", + "sourceId": "unity-ui-specialist", + "sourcePath": ".claude/agents/unity-ui-specialist.md", + "sourceHash": "62cbb003d7fdde1cd26fc03b47aeb6dbafc42afdf9bb8a5558be21991ecd231b", + "cgsTarget": { + "kind": "none", + "id": "", + "path": "" + }, + "decision": "defer", + "rationale": "No matching CGS surface exists yet; audit requires explicit follow-up.", + "scores": { + "contentDepth": 5, + "proceduralSpecificity": 4, + "contextContract": 3, + "outputContract": 2, + "roleSkillLinkage": 2, + "gateEscalation": 2, + "codexFit": 3, + "testability": 4 + }, + "ownerPath": "references/ccgs-surface-parity-matrix.json", + "testPath": "tests/ccgs-parity-audit.test.ts", + "status": "todo" + }, + { + "sourceType": "agent", + "sourceId": "unreal-specialist", + "sourcePath": ".claude/agents/unreal-specialist.md", + "sourceHash": "03794a0b048f1df4cd882ae73a964cd5368c629e00320e36051bc3d025a65c15", + "cgsTarget": { + "kind": "role", + "id": "unreal-specialist", + "path": "src/roles.ts", + "hash": "07929b39c15ecfb2067dc4d28c1e6f8ac2f1b006d6b523daf17fbca892357dbf" + }, + "decision": "adapt", + "rationale": "Direct role exists; adapt CCGS depth into Codex role package and generated TOML.", + "scores": { + "contentDepth": 5, + "proceduralSpecificity": 4, + "contextContract": 3, + "outputContract": 2, + "roleSkillLinkage": 2, + "gateEscalation": 2, + "codexFit": 3, + "testability": 4 + }, + "ownerPath": "src/roles.ts", + "testPath": "tests/agents-templates.test.ts", + "status": "todo" + }, + { + "sourceType": "agent", + "sourceId": "ux-designer", + "sourcePath": ".claude/agents/ux-designer.md", + "sourceHash": "5dc3ec82ef7b401074bc7d87d89dd1507b59c465b84145cb10317ad55d77e567", + "cgsTarget": { + "kind": "role", + "id": "ui-ux-designer", + "path": "src/roles.ts", + "hash": "1d6ce90c63d3c6bc720cd8b1e2c000b78ba6ba1692624ecb068b6f809529a42b" + }, + "decision": "merge", + "rationale": "CCGS role is intentionally merged into an upgraded broader CGS role package.", + "scores": { + "contentDepth": 4, + "proceduralSpecificity": 4, + "contextContract": 2, + "outputContract": 2, + "roleSkillLinkage": 2, + "gateEscalation": 2, + "codexFit": 3, + "testability": 2 + }, + "ownerPath": "src/roles.ts", + "testPath": "tests/agents-templates.test.ts", + "status": "implemented" + }, + { + "sourceType": "agent", + "sourceId": "world-builder", + "sourcePath": ".claude/agents/world-builder.md", + "sourceHash": "9e3399c5478ea2491bfc8e42745948b7aec4c2045ecd008a318d4f72a8fad2ea", + "cgsTarget": { + "kind": "role", + "id": "world-builder", + "path": "src/roles.ts", + "hash": "452aa4689212820282f510992651eb8c0838d36141f670e89fae5e29312325b2" + }, + "decision": "adapt", + "rationale": "Direct role exists; adapt CCGS depth into Codex role package and generated TOML.", + "scores": { + "contentDepth": 4, + "proceduralSpecificity": 4, + "contextContract": 2, + "outputContract": 2, + "roleSkillLinkage": 2, + "gateEscalation": 2, + "codexFit": 3, + "testability": 2 + }, + "ownerPath": "src/roles.ts", + "testPath": "tests/agents-templates.test.ts", + "status": "todo" + }, + { + "sourceType": "agent", + "sourceId": "writer", + "sourcePath": ".claude/agents/writer.md", + "sourceHash": "8eafe2f3cd7f2c12acc0d8f93ed93bf638a915490ed5ca5a11721f1bf60f49d7", + "cgsTarget": { + "kind": "role", + "id": "writer", + "path": "src/roles.ts", + "hash": "7d9a982648ef670a28d753dffcafcaf91824a38e1fec54847ff8502e5885afeb" + }, + "decision": "adapt", + "rationale": "Direct role exists; adapt CCGS depth into Codex role package and generated TOML.", + "scores": { + "contentDepth": 4, + "proceduralSpecificity": 5, + "contextContract": 3, + "outputContract": 2, + "roleSkillLinkage": 2, + "gateEscalation": 2, + "codexFit": 3, + "testability": 4 + }, + "ownerPath": "src/roles.ts", + "testPath": "tests/agents-templates.test.ts", + "status": "todo" + }, + { + "sourceType": "skill", + "sourceId": "adopt", + "sourcePath": ".claude/skills/adopt/SKILL.md", + "sourceHash": "58959c4f76c05fbe3fd60b7a7d2c4ba5bf861fce28c0da49a498a81656b6a05e", + "cgsTarget": { + "kind": "skill", + "id": "cgs-adopt", + "path": "src/skills.ts", + "hash": "806afdd8f98587a58dc9588ca4f932e9806b3849237cab785db7bd146dfe5c61" + }, + "decision": "adapt", + "rationale": "Generated Codex skill exists; adapt the CCGS workflow depth to Codex-native instructions.", + "scores": { + "contentDepth": 5, + "proceduralSpecificity": 5, + "contextContract": 5, + "outputContract": 5, + "roleSkillLinkage": 4, + "gateEscalation": 1, + "codexFit": 3, + "testability": 4 + }, + "ownerPath": "src/skills.ts", + "testPath": "tests/project-workflow.test.ts", + "status": "implemented" + }, + { + "sourceType": "skill", + "sourceId": "architecture-decision", + "sourcePath": ".claude/skills/architecture-decision/SKILL.md", + "sourceHash": "94a2299ae4ff370062e15d37680abdb13c1fc2dc05b916dcb65f46088d12b854", + "cgsTarget": { + "kind": "skill", + "id": "cgs-architecture-decision", + "path": "src/skills.ts", + "hash": "fd1a6ba06c8a66ecf4f5f656487d07fc9e5b37717c5a06fb8534e7981ee0b2e6" + }, + "decision": "adapt", + "rationale": "Generated Codex skill exists; adapt the CCGS workflow depth to Codex-native instructions.", + "scores": { + "contentDepth": 5, + "proceduralSpecificity": 5, + "contextContract": 5, + "outputContract": 2, + "roleSkillLinkage": 2, + "gateEscalation": 2, + "codexFit": 3, + "testability": 4 + }, + "ownerPath": "src/skills.ts", + "testPath": "tests/project-workflow.test.ts", + "status": "implemented" + }, + { + "sourceType": "skill", + "sourceId": "architecture-review", + "sourcePath": ".claude/skills/architecture-review/SKILL.md", + "sourceHash": "11fd3ee30b6c66a2745d1fdaaca3c61c440d4a1181f3667785414351a6e06311", + "cgsTarget": { + "kind": "skill", + "id": "cgs-architecture-review", + "path": "src/skills.ts", + "hash": "70dd48b63ff8b4a1fd7970638a32bb51f909ab09d8ed5710eded39f6a7be6e6c" + }, + "decision": "adapt", + "rationale": "Generated Codex skill exists; adapt the CCGS workflow depth to Codex-native instructions.", + "scores": { + "contentDepth": 5, + "proceduralSpecificity": 5, + "contextContract": 5, + "outputContract": 5, + "roleSkillLinkage": 4, + "gateEscalation": 5, + "codexFit": 3, + "testability": 4 + }, + "ownerPath": "src/skills.ts", + "testPath": "tests/project-workflow.test.ts", + "status": "implemented" + }, + { + "sourceType": "skill", + "sourceId": "art-bible", + "sourcePath": ".claude/skills/art-bible/SKILL.md", + "sourceHash": "19daa484f6f6621221818e224c899ebc02c978a919a247c367f676d515e64cad", + "cgsTarget": { + "kind": "skill", + "id": "cgs-art-bible", + "path": "src/skills.ts", + "hash": "528f560943369f7bebe2296df2648b2d9317e90bb2b78b4cb861c2a99f1db593" + }, + "decision": "adapt", + "rationale": "Generated Codex skill exists; adapt the CCGS workflow depth to Codex-native instructions.", + "scores": { + "contentDepth": 5, + "proceduralSpecificity": 5, + "contextContract": 5, + "outputContract": 2, + "roleSkillLinkage": 2, + "gateEscalation": 2, + "codexFit": 3, + "testability": 4 + }, + "ownerPath": "src/skills.ts", + "testPath": "tests/project-workflow.test.ts", + "status": "implemented" + }, + { + "sourceType": "skill", + "sourceId": "asset-audit", + "sourcePath": ".claude/skills/asset-audit/SKILL.md", + "sourceHash": "d499694d99c8b9341c1ca7a5f6bcc50fefebd8b6cbec7f132ec2f4fd678c1725", + "cgsTarget": { + "kind": "skill", + "id": "cgs-asset-audit", + "path": "src/skills.ts", + "hash": "8f9eaa9c7eaca14a463269a9cde135f9cca846757af49538f406fd6fc04bfc21" + }, + "decision": "adapt", + "rationale": "Generated Codex skill exists; adapt the CCGS workflow depth to Codex-native instructions.", + "scores": { + "contentDepth": 3, + "proceduralSpecificity": 4, + "contextContract": 2, + "outputContract": 4, + "roleSkillLinkage": 2, + "gateEscalation": 1, + "codexFit": 3, + "testability": 4 + }, + "ownerPath": "src/skills.ts", + "testPath": "tests/project-workflow.test.ts", + "status": "implemented" + }, + { + "sourceType": "skill", + "sourceId": "asset-spec", + "sourcePath": ".claude/skills/asset-spec/SKILL.md", + "sourceHash": "3a53c309c5e8abff8d8ab73c1217aa8fab47274abfa66836e401de83847f04e4", + "cgsTarget": { + "kind": "skill", + "id": "cgs-asset-spec", + "path": "src/skills.ts", + "hash": "662422855b4ef8a672dc04456253c94a35e53c1ad71e0bd768ebdd5688e3551e" + }, + "decision": "adapt", + "rationale": "Generated Codex skill exists; adapt the CCGS workflow depth to Codex-native instructions.", + "scores": { + "contentDepth": 5, + "proceduralSpecificity": 5, + "contextContract": 5, + "outputContract": 2, + "roleSkillLinkage": 2, + "gateEscalation": 2, + "codexFit": 3, + "testability": 4 + }, + "ownerPath": "src/skills.ts", + "testPath": "tests/project-workflow.test.ts", + "status": "implemented" + }, + { + "sourceType": "skill", + "sourceId": "balance-check", + "sourcePath": ".claude/skills/balance-check/SKILL.md", + "sourceHash": "c668fe38534a60c5ec3b86130461bf370c49593c82e93fecc4987571a7ef1bba", + "cgsTarget": { + "kind": "skill", + "id": "cgs-balance-check", + "path": "src/skills.ts", + "hash": "c72a7d54ee743c6676057dea7e61c6c14603fa077744802eea1c29d102c5dfaa" + }, + "decision": "adapt", + "rationale": "Generated Codex skill exists; adapt the CCGS workflow depth to Codex-native instructions.", + "scores": { + "contentDepth": 4, + "proceduralSpecificity": 5, + "contextContract": 1, + "outputContract": 3, + "roleSkillLinkage": 4, + "gateEscalation": 2, + "codexFit": 3, + "testability": 4 + }, + "ownerPath": "src/skills.ts", + "testPath": "tests/project-workflow.test.ts", + "status": "implemented" + }, + { + "sourceType": "skill", + "sourceId": "brainstorm", + "sourcePath": ".claude/skills/brainstorm/SKILL.md", + "sourceHash": "3afbcc808948bd507486d2d84787236cbac516b67d207b6b4737ab0d7f2cd9ad", + "cgsTarget": { + "kind": "skill", + "id": "cgs-brainstorm", + "path": "src/skills.ts", + "hash": "ed5ecdfd6918bc80b7a2614232053c19014bfccf58b0dbe50f8ddeeca5703fde" + }, + "decision": "adapt", + "rationale": "Generated Codex skill exists; adapt the CCGS workflow depth to Codex-native instructions.", + "scores": { + "contentDepth": 5, + "proceduralSpecificity": 5, + "contextContract": 5, + "outputContract": 2, + "roleSkillLinkage": 2, + "gateEscalation": 2, + "codexFit": 3, + "testability": 4 + }, + "ownerPath": "src/skills.ts", + "testPath": "tests/project-workflow.test.ts", + "status": "implemented" + }, + { + "sourceType": "skill", + "sourceId": "bug-report", + "sourcePath": ".claude/skills/bug-report/SKILL.md", + "sourceHash": "2960da7266e446de232a7f46229a9908825b188db4a28d834f030690d646575e", + "cgsTarget": { + "kind": "skill", + "id": "cgs-bug-report", + "path": "src/skills.ts", + "hash": "7e0c6c1ec077ac895395cf9335150f7109d56ef08d5244b73ccd8d82aa13a179" + }, + "decision": "adapt", + "rationale": "Generated Codex skill exists; adapt the CCGS workflow depth to Codex-native instructions.", + "scores": { + "contentDepth": 5, + "proceduralSpecificity": 5, + "contextContract": 1, + "outputContract": 3, + "roleSkillLinkage": 2, + "gateEscalation": 2, + "codexFit": 5, + "testability": 4 + }, + "ownerPath": "src/skills.ts", + "testPath": "tests/project-workflow.test.ts", + "status": "implemented" + }, + { + "sourceType": "skill", + "sourceId": "bug-triage", + "sourcePath": ".claude/skills/bug-triage/SKILL.md", + "sourceHash": "cdafaffc22abe4f6ee9dc7d93b34222547dd3281c25e60de80d1876517a395d2", + "cgsTarget": { + "kind": "skill", + "id": "cgs-bug-triage", + "path": "src/skills.ts", + "hash": "4514a7f109bcd78c3237c08dadce54b3714a4ef88d0fc9e2200138fff13cb74f" + }, + "decision": "adapt", + "rationale": "Generated Codex skill exists; adapt the CCGS workflow depth to Codex-native instructions.", + "scores": { + "contentDepth": 3, + "proceduralSpecificity": 5, + "contextContract": 3, + "outputContract": 3, + "roleSkillLinkage": 2, + "gateEscalation": 2, + "codexFit": 3, + "testability": 2 + }, + "ownerPath": "src/skills.ts", + "testPath": "tests/project-workflow.test.ts", + "status": "implemented" + }, + { + "sourceType": "skill", + "sourceId": "changelog", + "sourcePath": ".claude/skills/changelog/SKILL.md", + "sourceHash": "305d9f720a28c8ff3bfc5badd0732a731f10bb81d81c63c61655018dd2c7dc5b", + "cgsTarget": { + "kind": "skill", + "id": "cgs-changelog", + "path": "src/skills.ts", + "hash": "b75eb2e9cc2fff4adb1d271e2482f30a1f62baa52551af5a7697ddefaaba4321" + }, + "decision": "adapt", + "rationale": "Generated Codex skill exists; adapt the CCGS workflow depth to Codex-native instructions.", + "scores": { + "contentDepth": 5, + "proceduralSpecificity": 5, + "contextContract": 2, + "outputContract": 3, + "roleSkillLinkage": 2, + "gateEscalation": 1, + "codexFit": 5, + "testability": 4 + }, + "ownerPath": "src/skills.ts", + "testPath": "tests/project-workflow.test.ts", + "status": "implemented" + }, + { + "sourceType": "skill", + "sourceId": "code-review", + "sourcePath": ".claude/skills/code-review/SKILL.md", + "sourceHash": "e0abfa89a0a22bb3cfb9042941efc8f7ffb2a73b4f92884ef8eaba670366ca53", + "cgsTarget": { + "kind": "skill", + "id": "cgs-code-review", + "path": "src/skills.ts", + "hash": "266903e5aac48587a00e70147a81537c97ff62486c6140aa720cd213001f1b1e" + }, + "decision": "adapt", + "rationale": "Generated Codex skill exists; adapt the CCGS workflow depth to Codex-native instructions.", + "scores": { + "contentDepth": 5, + "proceduralSpecificity": 5, + "contextContract": 4, + "outputContract": 3, + "roleSkillLinkage": 4, + "gateEscalation": 1, + "codexFit": 3, + "testability": 4 + }, + "ownerPath": "src/skills.ts", + "testPath": "tests/project-workflow.test.ts", + "status": "implemented" + }, + { + "sourceType": "skill", + "sourceId": "consistency-check", + "sourcePath": ".claude/skills/consistency-check/SKILL.md", + "sourceHash": "a6a87d4512c9bc3c0dd03b5551f438770259345c8802ec6247f7455e85a20e77", + "cgsTarget": { + "kind": "skill", + "id": "cgs-consistency-check", + "path": "src/skills.ts", + "hash": "e8083f9979410b6f0197d1f4e3fb16eaaa733a26760b426cf2afdaf9aaa51daa" + }, + "decision": "adapt", + "rationale": "Generated Codex skill exists; adapt the CCGS workflow depth to Codex-native instructions.", + "scores": { + "contentDepth": 5, + "proceduralSpecificity": 5, + "contextContract": 4, + "outputContract": 5, + "roleSkillLinkage": 2, + "gateEscalation": 3, + "codexFit": 3, + "testability": 4 + }, + "ownerPath": "src/skills.ts", + "testPath": "tests/project-workflow.test.ts", + "status": "implemented" + }, + { + "sourceType": "skill", + "sourceId": "content-audit", + "sourcePath": ".claude/skills/content-audit/SKILL.md", + "sourceHash": "6e17272fe8854e93936f55076d88435f3af2226d4e05d0b8b5f987296f00d8ab", + "cgsTarget": { + "kind": "skill", + "id": "cgs-content-audit", + "path": "src/skills.ts", + "hash": "b2c29649742d2a792b77edd4dd6637d01888cf58042fe3110d1a94682d64fa36" + }, + "decision": "adapt", + "rationale": "Generated Codex skill exists; adapt the CCGS workflow depth to Codex-native instructions.", + "scores": { + "contentDepth": 5, + "proceduralSpecificity": 5, + "contextContract": 2, + "outputContract": 4, + "roleSkillLinkage": 4, + "gateEscalation": 1, + "codexFit": 5, + "testability": 4 + }, + "ownerPath": "src/skills.ts", + "testPath": "tests/project-workflow.test.ts", + "status": "implemented" + }, + { + "sourceType": "skill", + "sourceId": "create-architecture", + "sourcePath": ".claude/skills/create-architecture/SKILL.md", + "sourceHash": "8a6320b33b3132e7f98e634156c5017a8406303b0eccbaa973cdb4d9ee10e1af", + "cgsTarget": { + "kind": "skill", + "id": "cgs-create-architecture", + "path": "src/skills.ts", + "hash": "c83fbe8ef34cd600c6f20e32acbc69480dfe7b3a4dc0717f28aff609827cb975" + }, + "decision": "adapt", + "rationale": "Generated Codex skill exists; adapt the CCGS workflow depth to Codex-native instructions.", + "scores": { + "contentDepth": 5, + "proceduralSpecificity": 5, + "contextContract": 5, + "outputContract": 3, + "roleSkillLinkage": 4, + "gateEscalation": 2, + "codexFit": 3, + "testability": 4 + }, + "ownerPath": "src/skills.ts", + "testPath": "tests/project-workflow.test.ts", + "status": "implemented" + }, + { + "sourceType": "skill", + "sourceId": "create-control-manifest", + "sourcePath": ".claude/skills/create-control-manifest/SKILL.md", + "sourceHash": "2dd8d29c013944aed8cd05fcfbe21dc77ef8ff9c98f5155f46cee29ab3284348", + "cgsTarget": { + "kind": "skill", + "id": "cgs-create-control-manifest", + "path": "src/skills.ts", + "hash": "e9a6d14d4ec581c0b5fc2ab2f51e52f945a745bfa4252514f14762c49f48ba9e" + }, + "decision": "adapt", + "rationale": "Generated Codex skill exists; adapt the CCGS workflow depth to Codex-native instructions.", + "scores": { + "contentDepth": 4, + "proceduralSpecificity": 2, + "contextContract": 4, + "outputContract": 2, + "roleSkillLinkage": 4, + "gateEscalation": 4, + "codexFit": 3, + "testability": 2 + }, + "ownerPath": "src/skills.ts", + "testPath": "tests/project-workflow.test.ts", + "status": "implemented" + }, + { + "sourceType": "skill", + "sourceId": "create-epics", + "sourcePath": ".claude/skills/create-epics/SKILL.md", + "sourceHash": "5a761ad272143ddf694cd29068bf11efba18cd24ef4e23c48c79326d0d67a259", + "cgsTarget": { + "kind": "skill", + "id": "cgs-create-epics", + "path": "src/skills.ts", + "hash": "85ccc7cec8f5cad40ef749f1bca4243fa8dd2a8436d30cda00adb70817f1fd6e" + }, + "decision": "adapt", + "rationale": "Generated Codex skill exists; adapt the CCGS workflow depth to Codex-native instructions.", + "scores": { + "contentDepth": 4, + "proceduralSpecificity": 5, + "contextContract": 5, + "outputContract": 2, + "roleSkillLinkage": 4, + "gateEscalation": 3, + "codexFit": 3, + "testability": 4 + }, + "ownerPath": "src/skills.ts", + "testPath": "tests/project-workflow.test.ts", + "status": "implemented" + }, + { + "sourceType": "skill", + "sourceId": "create-stories", + "sourcePath": ".claude/skills/create-stories/SKILL.md", + "sourceHash": "f1517b9f5a90317f93149c9915ade684dbf75ab8b00c1ea9bdeaa6f921756b56", + "cgsTarget": { + "kind": "skill", + "id": "cgs-create-stories", + "path": "src/skills.ts", + "hash": "f3bd2a45c5b5f9dc8d233a409ace7b03da3297882ee3fe4c0eceb763577a840a" + }, + "decision": "adapt", + "rationale": "Generated Codex skill exists; adapt the CCGS workflow depth to Codex-native instructions.", + "scores": { + "contentDepth": 5, + "proceduralSpecificity": 5, + "contextContract": 5, + "outputContract": 2, + "roleSkillLinkage": 4, + "gateEscalation": 2, + "codexFit": 3, + "testability": 4 + }, + "ownerPath": "src/skills.ts", + "testPath": "tests/project-workflow.test.ts", + "status": "implemented" + }, + { + "sourceType": "skill", + "sourceId": "day-one-patch", + "sourcePath": ".claude/skills/day-one-patch/SKILL.md", + "sourceHash": "eb48e1eb8a578056ff31f6ee2b6a2d61fb02d65a0af3441a9922002b7583aab0", + "cgsTarget": { + "kind": "skill", + "id": "cgs-day-one-patch", + "path": "src/skills.ts", + "hash": "20d0dd55e45f4e5f3d4f6fddb632727dc0dec577d73a2531177d9eed2c0a24f3" + }, + "decision": "adapt", + "rationale": "Generated Codex skill exists; adapt the CCGS workflow depth to Codex-native instructions.", + "scores": { + "contentDepth": 5, + "proceduralSpecificity": 5, + "contextContract": 2, + "outputContract": 2, + "roleSkillLinkage": 2, + "gateEscalation": 3, + "codexFit": 3, + "testability": 4 + }, + "ownerPath": "src/skills.ts", + "testPath": "tests/project-workflow.test.ts", + "status": "implemented" + }, + { + "sourceType": "skill", + "sourceId": "design-review", + "sourcePath": ".claude/skills/design-review/SKILL.md", + "sourceHash": "3f9119c2ecc3f1b8a07484f0df9e3547bb006df349d9a73c97e8a95799aadfa9", + "cgsTarget": { + "kind": "skill", + "id": "cgs-design-review", + "path": "src/skills.ts", + "hash": "8f55150747ba5421c7543475563d3dac7ee94055acc931be1e1296bf60fee020" + }, + "decision": "adapt", + "rationale": "Generated Codex skill exists; adapt the CCGS workflow depth to Codex-native instructions.", + "scores": { + "contentDepth": 5, + "proceduralSpecificity": 5, + "contextContract": 5, + "outputContract": 3, + "roleSkillLinkage": 2, + "gateEscalation": 1, + "codexFit": 3, + "testability": 4 + }, + "ownerPath": "src/skills.ts", + "testPath": "tests/project-workflow.test.ts", + "status": "implemented" + }, + { + "sourceType": "skill", + "sourceId": "design-system", + "sourcePath": ".claude/skills/design-system/SKILL.md", + "sourceHash": "eae2be7d9ae520112020420293d83fdeeebf52d3476ce5c8ffecf87aaec4e696", + "cgsTarget": { + "kind": "skill", + "id": "cgs-design-system", + "path": "src/skills.ts", + "hash": "7c03441ebd9d9e89ef9155aa9aa8064bee1650c0fece6855ad226c64eb4d4a05" + }, + "decision": "adapt", + "rationale": "Generated Codex skill exists; adapt the CCGS workflow depth to Codex-native instructions.", + "scores": { + "contentDepth": 5, + "proceduralSpecificity": 5, + "contextContract": 5, + "outputContract": 2, + "roleSkillLinkage": 2, + "gateEscalation": 3, + "codexFit": 3, + "testability": 4 + }, + "ownerPath": "src/skills.ts", + "testPath": "tests/project-workflow.test.ts", + "status": "implemented" + }, + { + "sourceType": "skill", + "sourceId": "dev-story", + "sourcePath": ".claude/skills/dev-story/SKILL.md", + "sourceHash": "ddada36350af8d121b63159e79eb72e3d5a1482b74e88f547f556ca92efd2b04", + "cgsTarget": { + "kind": "skill", + "id": "cgs-dev-story", + "path": "src/skills.ts", + "hash": "a43a5da44209f61b3517671018bb435c27b057dde505326e84d16fabc5cd389a" + }, + "decision": "adapt", + "rationale": "Generated Codex skill exists; adapt the CCGS workflow depth to Codex-native instructions.", + "scores": { + "contentDepth": 5, + "proceduralSpecificity": 5, + "contextContract": 5, + "outputContract": 2, + "roleSkillLinkage": 2, + "gateEscalation": 2, + "codexFit": 3, + "testability": 4 + }, + "ownerPath": "src/skills.ts", + "testPath": "tests/project-workflow.test.ts", + "status": "implemented" + }, + { + "sourceType": "skill", + "sourceId": "estimate", + "sourcePath": ".claude/skills/estimate/SKILL.md", + "sourceHash": "7774e2d256a054a215cf62cc81d4d79f4d18e2154203671a39f643c0881be5fd", + "cgsTarget": { + "kind": "skill", + "id": "cgs-estimate", + "path": "src/skills.ts", + "hash": "1493f6fc46933a26ebdfd56bdab831203ba2d04eb3a31dddb5f73ab38754e925" + }, + "decision": "adapt", + "rationale": "Generated Codex skill exists; adapt the CCGS workflow depth to Codex-native instructions.", + "scores": { + "contentDepth": 4, + "proceduralSpecificity": 4, + "contextContract": 2, + "outputContract": 2, + "roleSkillLinkage": 2, + "gateEscalation": 1, + "codexFit": 3, + "testability": 4 + }, + "ownerPath": "src/skills.ts", + "testPath": "tests/project-workflow.test.ts", + "status": "implemented" + }, + { + "sourceType": "skill", + "sourceId": "gate-check", + "sourcePath": ".claude/skills/gate-check/SKILL.md", + "sourceHash": "3ae463120765909eedb2d04f592191bf90afda4795ae88522d314e1833773da7", + "cgsTarget": { + "kind": "skill", + "id": "cgs-gate-check", + "path": "src/skills.ts", + "hash": "277a571036394fe8c06e0ff9f4a286b61ba825cbeeef4d8f429ce32bed9e6ed2" + }, + "decision": "adapt", + "rationale": "Generated Codex skill exists; adapt the CCGS workflow depth to Codex-native instructions.", + "scores": { + "contentDepth": 5, + "proceduralSpecificity": 5, + "contextContract": 5, + "outputContract": 3, + "roleSkillLinkage": 2, + "gateEscalation": 5, + "codexFit": 3, + "testability": 4 + }, + "ownerPath": "src/skills.ts", + "testPath": "tests/project-workflow.test.ts", + "status": "implemented" + }, + { + "sourceType": "skill", + "sourceId": "help", + "sourcePath": ".claude/skills/help/SKILL.md", + "sourceHash": "9519e9b275a58b3d45391f1fc47e6f8ac1a469e468959cccf6f37bd13e71ee04", + "cgsTarget": { + "kind": "skill", + "id": "cgs-help", + "path": "src/skills.ts", + "hash": "fd0722da25fcf43700c43a31ff27e03e61d1414e6fddbefccb19768a764ff5d9" + }, + "decision": "adapt", + "rationale": "Generated Codex skill exists; adapt the CCGS workflow depth to Codex-native instructions.", + "scores": { + "contentDepth": 3, + "proceduralSpecificity": 5, + "contextContract": 5, + "outputContract": 3, + "roleSkillLinkage": 2, + "gateEscalation": 1, + "codexFit": 3, + "testability": 4 + }, + "ownerPath": "src/skills.ts", + "testPath": "tests/project-workflow.test.ts", + "status": "implemented" + }, + { + "sourceType": "skill", + "sourceId": "hotfix", + "sourcePath": ".claude/skills/hotfix/SKILL.md", + "sourceHash": "6d99a79bce373cd9f8fe02b1db2933c9121ac0a79c778d588dd03b5f337c4bf9", + "cgsTarget": { + "kind": "skill", + "id": "cgs-hotfix", + "path": "src/skills.ts", + "hash": "3065f55282ed79a270cf35d0c0979ecf51ec6b976a3fe413a18f332392ff4b98" + }, + "decision": "adapt", + "rationale": "Generated Codex skill exists; adapt the CCGS workflow depth to Codex-native instructions.", + "scores": { + "contentDepth": 5, + "proceduralSpecificity": 5, + "contextContract": 1, + "outputContract": 2, + "roleSkillLinkage": 2, + "gateEscalation": 4, + "codexFit": 3, + "testability": 4 + }, + "ownerPath": "src/skills.ts", + "testPath": "tests/project-workflow.test.ts", + "status": "implemented" + }, + { + "sourceType": "skill", + "sourceId": "launch-checklist", + "sourcePath": ".claude/skills/launch-checklist/SKILL.md", + "sourceHash": "867e94f20e9b5da3855a37b032bd01801cdceed899eb95ecea7588abed5b188c", + "cgsTarget": { + "kind": "skill", + "id": "cgs-launch-checklist", + "path": "src/skills.ts", + "hash": "2e97d3f7455846b33a5fa6139dba369f66750acc975cd21c0a473b160b242d62" + }, + "decision": "adapt", + "rationale": "Generated Codex skill exists; adapt the CCGS workflow depth to Codex-native instructions.", + "scores": { + "contentDepth": 5, + "proceduralSpecificity": 5, + "contextContract": 3, + "outputContract": 2, + "roleSkillLinkage": 2, + "gateEscalation": 4, + "codexFit": 3, + "testability": 4 + }, + "ownerPath": "src/skills.ts", + "testPath": "tests/project-workflow.test.ts", + "status": "implemented" + }, + { + "sourceType": "skill", + "sourceId": "localize", + "sourcePath": ".claude/skills/localize/SKILL.md", + "sourceHash": "781f60f1c4259cfb3ceac0316a792a6d55659aaf20981f1c6e6a3d1dfacae83c", + "cgsTarget": { + "kind": "skill", + "id": "cgs-localize", + "path": "src/skills.ts", + "hash": "f7286bc7a03e789c513a06f1e1c1cdbdf8bfaece71f99836b3cdfadcff3f65ee" + }, + "decision": "adapt", + "rationale": "Generated Codex skill exists; adapt the CCGS workflow depth to Codex-native instructions.", + "scores": { + "contentDepth": 5, + "proceduralSpecificity": 5, + "contextContract": 3, + "outputContract": 2, + "roleSkillLinkage": 4, + "gateEscalation": 3, + "codexFit": 3, + "testability": 4 + }, + "ownerPath": "src/skills.ts", + "testPath": "tests/project-workflow.test.ts", + "status": "implemented" + }, + { + "sourceType": "skill", + "sourceId": "map-systems", + "sourcePath": ".claude/skills/map-systems/SKILL.md", + "sourceHash": "a46393797f5227603d87722d8c546d61c8944182db28e00207dc5ad318aa577e", + "cgsTarget": { + "kind": "skill", + "id": "cgs-map-systems", + "path": "src/skills.ts", + "hash": "30619e475daf59ecd3fcdc57a088211d863f540b47aa630a19e9d682bca92278" + }, + "decision": "adapt", + "rationale": "Generated Codex skill exists; adapt the CCGS workflow depth to Codex-native instructions.", + "scores": { + "contentDepth": 5, + "proceduralSpecificity": 5, + "contextContract": 5, + "outputContract": 3, + "roleSkillLinkage": 2, + "gateEscalation": 3, + "codexFit": 3, + "testability": 4 + }, + "ownerPath": "src/skills.ts", + "testPath": "tests/project-workflow.test.ts", + "status": "implemented" + }, + { + "sourceType": "skill", + "sourceId": "milestone-review", + "sourcePath": ".claude/skills/milestone-review/SKILL.md", + "sourceHash": "736a1cffb028b96b890fd0b6b469dcdd5f948a907d5a7f0e157ccca92ac8adc7", + "cgsTarget": { + "kind": "skill", + "id": "cgs-milestone-review", + "path": "src/skills.ts", + "hash": "f24d585e2c43e4bf921573273b7b48eaf7e4bccf78cc6d5c7403f9a5626d1f53" + }, + "decision": "adapt", + "rationale": "Generated Codex skill exists; adapt the CCGS workflow depth to Codex-native instructions.", + "scores": { + "contentDepth": 4, + "proceduralSpecificity": 5, + "contextContract": 3, + "outputContract": 2, + "roleSkillLinkage": 2, + "gateEscalation": 4, + "codexFit": 3, + "testability": 4 + }, + "ownerPath": "src/skills.ts", + "testPath": "tests/project-workflow.test.ts", + "status": "implemented" + }, + { + "sourceType": "skill", + "sourceId": "onboard", + "sourcePath": ".claude/skills/onboard/SKILL.md", + "sourceHash": "fbf7f691226e4c5fccbfa40423d61d123f3e0088d36b719663cca40e96a5d6d7", + "cgsTarget": { + "kind": "skill", + "id": "cgs-start", + "path": "src/skills.ts", + "hash": "ab3c12b5fddf6f5c3c18cf6862eb42b246c61076099711f665f2f49df6edf26e" + }, + "decision": "adapt", + "rationale": "Generated Codex skill exists; adapt the CCGS workflow depth to Codex-native instructions.", + "scores": { + "contentDepth": 3, + "proceduralSpecificity": 5, + "contextContract": 2, + "outputContract": 2, + "roleSkillLinkage": 2, + "gateEscalation": 1, + "codexFit": 3, + "testability": 4 + }, + "ownerPath": "src/skills.ts", + "testPath": "tests/project-workflow.test.ts", + "status": "implemented" + }, + { + "sourceType": "skill", + "sourceId": "patch-notes", + "sourcePath": ".claude/skills/patch-notes/SKILL.md", + "sourceHash": "ffb34d12e0d3fe21d31e6406a77b6db77b16a8185358ee8183b08de584498d30", + "cgsTarget": { + "kind": "skill", + "id": "cgs-patch-notes", + "path": "src/skills.ts", + "hash": "7e3f7d0b755f2fbc1ff14683a4fb2d0821362849233893d0d7f12e058897721c" + }, + "decision": "adapt", + "rationale": "Generated Codex skill exists; adapt the CCGS workflow depth to Codex-native instructions.", + "scores": { + "contentDepth": 5, + "proceduralSpecificity": 5, + "contextContract": 5, + "outputContract": 4, + "roleSkillLinkage": 4, + "gateEscalation": 2, + "codexFit": 3, + "testability": 4 + }, + "ownerPath": "src/skills.ts", + "testPath": "tests/project-workflow.test.ts", + "status": "implemented" + }, + { + "sourceType": "skill", + "sourceId": "perf-profile", + "sourcePath": ".claude/skills/perf-profile/SKILL.md", + "sourceHash": "376f4f24dff70ec9e4a4883ec3352e0008c6c10c3f3660e0a4946b4b48ef7aa7", + "cgsTarget": { + "kind": "skill", + "id": "cgs-perf-profile", + "path": "src/skills.ts", + "hash": "4422ec18696bfac855eb5829be21874a4cceac9717d18018ac2bfa03f308016b" + }, + "decision": "adapt", + "rationale": "Generated Codex skill exists; adapt the CCGS workflow depth to Codex-native instructions.", + "scores": { + "contentDepth": 4, + "proceduralSpecificity": 4, + "contextContract": 2, + "outputContract": 3, + "roleSkillLinkage": 4, + "gateEscalation": 1, + "codexFit": 3, + "testability": 2 + }, + "ownerPath": "src/skills.ts", + "testPath": "tests/project-workflow.test.ts", + "status": "implemented" + }, + { + "sourceType": "skill", + "sourceId": "playtest-report", + "sourcePath": ".claude/skills/playtest-report/SKILL.md", + "sourceHash": "708a99ffe0990079bfe7b34c49a641e6131c32173c966f7c51e588def5e75548", + "cgsTarget": { + "kind": "skill", + "id": "cgs-playtest-report", + "path": "src/skills.ts", + "hash": "af6b59c92ccefe0b0afab6b57e2f851eb06c32aac3253423ae6373e61d2014b6" + }, + "decision": "adapt", + "rationale": "Generated Codex skill exists; adapt the CCGS workflow depth to Codex-native instructions.", + "scores": { + "contentDepth": 4, + "proceduralSpecificity": 5, + "contextContract": 4, + "outputContract": 4, + "roleSkillLinkage": 2, + "gateEscalation": 3, + "codexFit": 3, + "testability": 4 + }, + "ownerPath": "src/skills.ts", + "testPath": "tests/project-workflow.test.ts", + "status": "implemented" + }, + { + "sourceType": "skill", + "sourceId": "project-stage-detect", + "sourcePath": ".claude/skills/project-stage-detect/SKILL.md", + "sourceHash": "dffa5112b8d3c4ef53bc3ee6bede90d0f3f4b938ad3a00238f1209f0fa0e7e19", + "cgsTarget": { + "kind": "skill", + "id": "cgs-project-stage-detect", + "path": "src/skills.ts", + "hash": "c00c8d8476d53a3df41f6ee858597bcd89c986499a19c9a3f0c2cbbc2e482357" + }, + "decision": "adapt", + "rationale": "Generated Codex skill exists; adapt the CCGS workflow depth to Codex-native instructions.", + "scores": { + "contentDepth": 3, + "proceduralSpecificity": 2, + "contextContract": 5, + "outputContract": 3, + "roleSkillLinkage": 2, + "gateEscalation": 4, + "codexFit": 3, + "testability": 4 + }, + "ownerPath": "src/skills.ts", + "testPath": "tests/project-workflow.test.ts", + "status": "implemented" + }, + { + "sourceType": "skill", + "sourceId": "propagate-design-change", + "sourcePath": ".claude/skills/propagate-design-change/SKILL.md", + "sourceHash": "eba7901d3875f81946ab8803f458d142427102c438296fae83e3f4c4101115ed", + "cgsTarget": { + "kind": "skill", + "id": "cgs-propagate-design-change", + "path": "src/skills.ts", + "hash": "8294db9c7ad638b0791c1a2f2e2b3eb7f2e2037f5e00624c4670175dbbe84363" + }, + "decision": "adapt", + "rationale": "Generated Codex skill exists; adapt the CCGS workflow depth to Codex-native instructions.", + "scores": { + "contentDepth": 3, + "proceduralSpecificity": 5, + "contextContract": 4, + "outputContract": 5, + "roleSkillLinkage": 4, + "gateEscalation": 4, + "codexFit": 3, + "testability": 4 + }, + "ownerPath": "src/skills.ts", + "testPath": "tests/project-workflow.test.ts", + "status": "implemented" + }, + { + "sourceType": "skill", + "sourceId": "prototype", + "sourcePath": ".claude/skills/prototype/SKILL.md", + "sourceHash": "d9475f988c6ec1bb676ab5d8149ef7b7321e63a6b4eb7f7194cfd598be1255de", + "cgsTarget": { + "kind": "skill", + "id": "cgs-prototype", + "path": "src/skills.ts", + "hash": "dac0c6ea3129d6c91f7c5d91cfbaef86c5154c9570e3c3c56818488b6d653441" + }, + "decision": "adapt", + "rationale": "Generated Codex skill exists; adapt the CCGS workflow depth to Codex-native instructions.", + "scores": { + "contentDepth": 5, + "proceduralSpecificity": 5, + "contextContract": 5, + "outputContract": 4, + "roleSkillLinkage": 4, + "gateEscalation": 4, + "codexFit": 3, + "testability": 4 + }, + "ownerPath": "src/skills.ts", + "testPath": "tests/project-workflow.test.ts", + "status": "implemented" + }, + { + "sourceType": "skill", + "sourceId": "qa-plan", + "sourcePath": ".claude/skills/qa-plan/SKILL.md", + "sourceHash": "f4e9823754aaad75ff87fe700a826c0953ce9ddf853130e2d6cdf3ba2d3622ba", + "cgsTarget": { + "kind": "skill", + "id": "cgs-qa-plan", + "path": "src/skills.ts", + "hash": "f388c1042cae73dc6ec80bb9ec19387818330de4505d7659009fed00d59d085a" + }, + "decision": "adapt", + "rationale": "Generated Codex skill exists; adapt the CCGS workflow depth to Codex-native instructions.", + "scores": { + "contentDepth": 5, + "proceduralSpecificity": 5, + "contextContract": 5, + "outputContract": 3, + "roleSkillLinkage": 4, + "gateEscalation": 1, + "codexFit": 3, + "testability": 4 + }, + "ownerPath": "src/skills.ts", + "testPath": "tests/project-workflow.test.ts", + "status": "implemented" + }, + { + "sourceType": "skill", + "sourceId": "quick-design", + "sourcePath": ".claude/skills/quick-design/SKILL.md", + "sourceHash": "e1274daaef2d2f925bc98944013e9ec31c25e4ad0906345fda744a7a59271d7a", + "cgsTarget": { + "kind": "skill", + "id": "cgs-quick-design", + "path": "src/skills.ts", + "hash": "7fadd2ae87d583ae4b9b590299f8b883d36ca8141ae5a2a975fd2ef4add8f600" + }, + "decision": "adapt", + "rationale": "Generated Codex skill exists; adapt the CCGS workflow depth to Codex-native instructions.", + "scores": { + "contentDepth": 5, + "proceduralSpecificity": 2, + "contextContract": 2, + "outputContract": 3, + "roleSkillLinkage": 2, + "gateEscalation": 1, + "codexFit": 3, + "testability": 4 + }, + "ownerPath": "src/skills.ts", + "testPath": "tests/project-workflow.test.ts", + "status": "implemented" + }, + { + "sourceType": "skill", + "sourceId": "regression-suite", + "sourcePath": ".claude/skills/regression-suite/SKILL.md", + "sourceHash": "8f073b6b576c88fba6129efd57f4c71f04c97563f3c5a532c0ae28d2a5c0f0fc", + "cgsTarget": { + "kind": "skill", + "id": "cgs-regression-suite", + "path": "src/skills.ts", + "hash": "a896d255702d551f2ffe991f2e7fbc0d600f11061054e3c9ba006163afc692ca" + }, + "decision": "adapt", + "rationale": "Generated Codex skill exists; adapt the CCGS workflow depth to Codex-native instructions.", + "scores": { + "contentDepth": 4, + "proceduralSpecificity": 5, + "contextContract": 2, + "outputContract": 5, + "roleSkillLinkage": 2, + "gateEscalation": 2, + "codexFit": 3, + "testability": 4 + }, + "ownerPath": "src/skills.ts", + "testPath": "tests/project-workflow.test.ts", + "status": "implemented" + }, + { + "sourceType": "skill", + "sourceId": "release-checklist", + "sourcePath": ".claude/skills/release-checklist/SKILL.md", + "sourceHash": "a4c4294234e7ba6ba51718ba6a0996c68dd1e4f9cefc30286936878a827bc86a", + "cgsTarget": { + "kind": "skill", + "id": "cgs-release-checklist", + "path": "src/skills.ts", + "hash": "29d78630cd0af294f5f0f12c56645813290420df5fad4059900cf59faec0a779" + }, + "decision": "adapt", + "rationale": "Generated Codex skill exists; adapt the CCGS workflow depth to Codex-native instructions.", + "scores": { + "contentDepth": 5, + "proceduralSpecificity": 5, + "contextContract": 2, + "outputContract": 2, + "roleSkillLinkage": 2, + "gateEscalation": 1, + "codexFit": 3, + "testability": 4 + }, + "ownerPath": "src/skills.ts", + "testPath": "tests/project-workflow.test.ts", + "status": "implemented" + }, + { + "sourceType": "skill", + "sourceId": "retrospective", + "sourcePath": ".claude/skills/retrospective/SKILL.md", + "sourceHash": "60f9525887c94e4cf8239de3a2078389e6d6b19dd9f10705772490650c11ffda", + "cgsTarget": { + "kind": "skill", + "id": "cgs-retrospective", + "path": "src/skills.ts", + "hash": "1eb748885ca981c11359eed9642ab834e6cca11d8db9d82444fb5c3430776d49" + }, + "decision": "adapt", + "rationale": "Generated Codex skill exists; adapt the CCGS workflow depth to Codex-native instructions.", + "scores": { + "contentDepth": 5, + "proceduralSpecificity": 5, + "contextContract": 2, + "outputContract": 2, + "roleSkillLinkage": 2, + "gateEscalation": 2, + "codexFit": 3, + "testability": 2 + }, + "ownerPath": "src/skills.ts", + "testPath": "tests/project-workflow.test.ts", + "status": "implemented" + }, + { + "sourceType": "skill", + "sourceId": "reverse-document", + "sourcePath": ".claude/skills/reverse-document/SKILL.md", + "sourceHash": "71d5beda61de4815f52bb63b38780f55f890db6dd8c5d22842b1b179fb393876", + "cgsTarget": { + "kind": "skill", + "id": "cgs-reverse-document", + "path": "src/skills.ts", + "hash": "10e6dfddf348ade54d1712ee30047468144fd2b18e8fb5073220a2a1c057d1df" + }, + "decision": "adapt", + "rationale": "Generated Codex skill exists; adapt the CCGS workflow depth to Codex-native instructions.", + "scores": { + "contentDepth": 5, + "proceduralSpecificity": 5, + "contextContract": 2, + "outputContract": 4, + "roleSkillLinkage": 2, + "gateEscalation": 2, + "codexFit": 5, + "testability": 4 + }, + "ownerPath": "src/skills.ts", + "testPath": "tests/project-workflow.test.ts", + "status": "implemented" + }, + { + "sourceType": "skill", + "sourceId": "review-all-gdds", + "sourcePath": ".claude/skills/review-all-gdds/SKILL.md", + "sourceHash": "016dce629603f89c923cf6ca5b7f4cae4d4e5920c04ced00b7d3bb206a531a2d", + "cgsTarget": { + "kind": "skill", + "id": "cgs-review-all-gdds", + "path": "src/skills.ts", + "hash": "775797d62af535eae89327b5750f58aa85bf36006fe95382ca6b409cbb1d9951" + }, + "decision": "adapt", + "rationale": "Generated Codex skill exists; adapt the CCGS workflow depth to Codex-native instructions.", + "scores": { + "contentDepth": 5, + "proceduralSpecificity": 5, + "contextContract": 5, + "outputContract": 5, + "roleSkillLinkage": 2, + "gateEscalation": 5, + "codexFit": 3, + "testability": 4 + }, + "ownerPath": "src/skills.ts", + "testPath": "tests/project-workflow.test.ts", + "status": "implemented" + }, + { + "sourceType": "skill", + "sourceId": "scope-check", + "sourcePath": ".claude/skills/scope-check/SKILL.md", + "sourceHash": "f91150df11aadf32cfa64a1476c608396e12eeeba9aca03836c52299f3a0efa0", + "cgsTarget": { + "kind": "skill", + "id": "cgs-scope-check", + "path": "src/skills.ts", + "hash": "430e0eb5877e327aa48533494a9df19850a8ccf2564bbc6deb33f5b909cc37af" + }, + "decision": "adapt", + "rationale": "Generated Codex skill exists; adapt the CCGS workflow depth to Codex-native instructions.", + "scores": { + "contentDepth": 4, + "proceduralSpecificity": 5, + "contextContract": 2, + "outputContract": 2, + "roleSkillLinkage": 2, + "gateEscalation": 4, + "codexFit": 5, + "testability": 4 + }, + "ownerPath": "src/skills.ts", + "testPath": "tests/project-workflow.test.ts", + "status": "implemented" + }, + { + "sourceType": "skill", + "sourceId": "security-audit", + "sourcePath": ".claude/skills/security-audit/SKILL.md", + "sourceHash": "b3d04c89f1841ef93bedce57a8bb43d858ca96a92aac8b8182e9d54fe1d319f4", + "cgsTarget": { + "kind": "skill", + "id": "cgs-security-audit", + "path": "src/skills.ts", + "hash": "7dbe5cbaa68f14fc741d730a7c2b6eb1c445b1c38bda96172230ccf729be99ff" + }, + "decision": "adapt", + "rationale": "Generated Codex skill exists; adapt the CCGS workflow depth to Codex-native instructions.", + "scores": { + "contentDepth": 5, + "proceduralSpecificity": 5, + "contextContract": 2, + "outputContract": 4, + "roleSkillLinkage": 4, + "gateEscalation": 1, + "codexFit": 3, + "testability": 4 + }, + "ownerPath": "src/skills.ts", + "testPath": "tests/project-workflow.test.ts", + "status": "implemented" + }, + { + "sourceType": "skill", + "sourceId": "setup-engine", + "sourcePath": ".claude/skills/setup-engine/SKILL.md", + "sourceHash": "7f4bc9868ca4d78ca969174c56b8c719215d68c6f32f0df5be5194e8eb2e2eea", + "cgsTarget": { + "kind": "skill", + "id": "cgs-setup-engine", + "path": "src/skills.ts", + "hash": "f4fc5623daadc3bde783a23cbc3f833bb1640186569f5a61f21e947c6b59e4aa" + }, + "decision": "adapt", + "rationale": "Generated Codex skill exists; adapt the CCGS workflow depth to Codex-native instructions.", + "scores": { + "contentDepth": 5, + "proceduralSpecificity": 5, + "contextContract": 4, + "outputContract": 4, + "roleSkillLinkage": 2, + "gateEscalation": 1, + "codexFit": 3, + "testability": 4 + }, + "ownerPath": "src/skills.ts", + "testPath": "tests/project-workflow.test.ts", + "status": "implemented" + }, + { + "sourceType": "skill", + "sourceId": "skill-improve", + "sourcePath": ".claude/skills/skill-improve/SKILL.md", + "sourceHash": "24efa8aa68ab240c1d9b1366275490ec9cce4034e1bbe34f214b830bda15617b", + "cgsTarget": { + "kind": "skill", + "id": "cgs-skill-improve", + "path": "src/skills.ts", + "hash": "84c112de0a02b5b13747fd92acf5f31ef8e4908b01a978999287b83ff47e0ffe" + }, + "decision": "adapt", + "rationale": "Generated Codex skill exists; adapt the CCGS workflow depth to Codex-native instructions.", + "scores": { + "contentDepth": 4, + "proceduralSpecificity": 5, + "contextContract": 1, + "outputContract": 2, + "roleSkillLinkage": 2, + "gateEscalation": 2, + "codexFit": 3, + "testability": 4 + }, + "ownerPath": "src/skills.ts", + "testPath": "tests/project-workflow.test.ts", + "status": "implemented" + }, + { + "sourceType": "skill", + "sourceId": "skill-test", + "sourcePath": ".claude/skills/skill-test/SKILL.md", + "sourceHash": "24d09805593a811cc10b46d40a45eb1e36b040cfdc4e7a2ae3e36ffa51bd4cf9", + "cgsTarget": { + "kind": "skill", + "id": "cgs-skill-test", + "path": "src/skills.ts", + "hash": "5ab010c440a699fe5dfefb4cf570c60ecb74b08b90e55908831e483c5e3f725a" + }, + "decision": "adapt", + "rationale": "Generated Codex skill exists; adapt the CCGS workflow depth to Codex-native instructions.", + "scores": { + "contentDepth": 5, + "proceduralSpecificity": 5, + "contextContract": 1, + "outputContract": 5, + "roleSkillLinkage": 2, + "gateEscalation": 5, + "codexFit": 3, + "testability": 4 + }, + "ownerPath": "src/skills.ts", + "testPath": "tests/project-workflow.test.ts", + "status": "implemented" + }, + { + "sourceType": "skill", + "sourceId": "smoke-check", + "sourcePath": ".claude/skills/smoke-check/SKILL.md", + "sourceHash": "98521191c6dd949bce2df9d4f8d4abeebbc0adf36b665e7a99d7645dc9ed42e3", + "cgsTarget": { + "kind": "skill", + "id": "cgs-smoke-check", + "path": "src/skills.ts", + "hash": "81f89e222d5c7099289b0d4fe698b7fc0502b003c06f08a3c43a5e4a2881c433" + }, + "decision": "adapt", + "rationale": "Generated Codex skill exists; adapt the CCGS workflow depth to Codex-native instructions.", + "scores": { + "contentDepth": 5, + "proceduralSpecificity": 5, + "contextContract": 4, + "outputContract": 4, + "roleSkillLinkage": 2, + "gateEscalation": 3, + "codexFit": 3, + "testability": 4 + }, + "ownerPath": "src/skills.ts", + "testPath": "tests/project-workflow.test.ts", + "status": "implemented" + }, + { + "sourceType": "skill", + "sourceId": "soak-test", + "sourcePath": ".claude/skills/soak-test/SKILL.md", + "sourceHash": "9f090f0e39575265a9e8e5e042dd81af81191e346ed3a92983a8d1d1a5ba6bc1", + "cgsTarget": { + "kind": "skill", + "id": "cgs-soak-test", + "path": "src/skills.ts", + "hash": "6cc85429b8234ff0f77e788b16485eba2646db1b5de7e3eb037e2abe6e484ea5" + }, + "decision": "adapt", + "rationale": "Generated Codex skill exists; adapt the CCGS workflow depth to Codex-native instructions.", + "scores": { + "contentDepth": 4, + "proceduralSpecificity": 2, + "contextContract": 3, + "outputContract": 3, + "roleSkillLinkage": 2, + "gateEscalation": 4, + "codexFit": 3, + "testability": 4 + }, + "ownerPath": "src/skills.ts", + "testPath": "tests/project-workflow.test.ts", + "status": "implemented" + }, + { + "sourceType": "skill", + "sourceId": "sprint-plan", + "sourcePath": ".claude/skills/sprint-plan/SKILL.md", + "sourceHash": "d402a9f276f81663c8b07f6c4fd2b19a3fa9d4ee9411e3d57e6868daa095ee42", + "cgsTarget": { + "kind": "skill", + "id": "cgs-sprint-plan", + "path": "src/skills.ts", + "hash": "f3021a52ea231a8108ba9f84e97f21532dc0f867a1e231ecfaa0be8fff127357" + }, + "decision": "adapt", + "rationale": "Generated Codex skill exists; adapt the CCGS workflow depth to Codex-native instructions.", + "scores": { + "contentDepth": 5, + "proceduralSpecificity": 5, + "contextContract": 5, + "outputContract": 3, + "roleSkillLinkage": 2, + "gateEscalation": 3, + "codexFit": 3, + "testability": 4 + }, + "ownerPath": "src/skills.ts", + "testPath": "tests/project-workflow.test.ts", + "status": "implemented" + }, + { + "sourceType": "skill", + "sourceId": "sprint-status", + "sourcePath": ".claude/skills/sprint-status/SKILL.md", + "sourceHash": "58b80b7ee9a31eb4798f0700b4054fd705b1d6642eb63cead4166d3ffbe6f138", + "cgsTarget": { + "kind": "skill", + "id": "cgs-sprint-status", + "path": "src/skills.ts", + "hash": "b9f2092e5252222e13ded78c14d01aa3fa7c5452ad4811961e6bb7632adc036b" + }, + "decision": "adapt", + "rationale": "Generated Codex skill exists; adapt the CCGS workflow depth to Codex-native instructions.", + "scores": { + "contentDepth": 4, + "proceduralSpecificity": 2, + "contextContract": 2, + "outputContract": 3, + "roleSkillLinkage": 2, + "gateEscalation": 2, + "codexFit": 5, + "testability": 4 + }, + "ownerPath": "src/skills.ts", + "testPath": "tests/project-workflow.test.ts", + "status": "implemented" + }, + { + "sourceType": "skill", + "sourceId": "start", + "sourcePath": ".claude/skills/start/SKILL.md", + "sourceHash": "31e7a2cee0568de6e443fd3428fea36f6583478f6db25cac3fa18604c510af9f", + "cgsTarget": { + "kind": "skill", + "id": "cgs-start", + "path": "src/skills.ts", + "hash": "ab3c12b5fddf6f5c3c18cf6862eb42b246c61076099711f665f2f49df6edf26e" + }, + "decision": "adapt", + "rationale": "Generated Codex skill exists; adapt the CCGS workflow depth to Codex-native instructions.", + "scores": { + "contentDepth": 5, + "proceduralSpecificity": 5, + "contextContract": 5, + "outputContract": 2, + "roleSkillLinkage": 2, + "gateEscalation": 1, + "codexFit": 3, + "testability": 4 + }, + "ownerPath": "src/skills.ts", + "testPath": "tests/project-workflow.test.ts", + "status": "implemented" + }, + { + "sourceType": "skill", + "sourceId": "story-done", + "sourcePath": ".claude/skills/story-done/SKILL.md", + "sourceHash": "a9215959142b6417223ff818f99f2f33b10d401bb9ff446f622ec8573433b261", + "cgsTarget": { + "kind": "skill", + "id": "cgs-story-done", + "path": "src/skills.ts", + "hash": "09746201fdc8e689155b9319e85364945ca8a182d1e6fb76140c12aff503bbe0" + }, + "decision": "adapt", + "rationale": "Generated Codex skill exists; adapt the CCGS workflow depth to Codex-native instructions.", + "scores": { + "contentDepth": 5, + "proceduralSpecificity": 5, + "contextContract": 5, + "outputContract": 3, + "roleSkillLinkage": 2, + "gateEscalation": 3, + "codexFit": 3, + "testability": 4 + }, + "ownerPath": "src/skills.ts", + "testPath": "tests/project-workflow.test.ts", + "status": "implemented" + }, + { + "sourceType": "skill", + "sourceId": "story-readiness", + "sourcePath": ".claude/skills/story-readiness/SKILL.md", + "sourceHash": "f1fc25f80f811fd38c53144c305706488c031974a5f0925cdf18986467de90eb", + "cgsTarget": { + "kind": "skill", + "id": "cgs-story-readiness", + "path": "src/skills.ts", + "hash": "ccc1fa68cbcd4b44740cae21418d755981c2d9d1192cfcad2e1e39b929116214" + }, + "decision": "adapt", + "rationale": "Generated Codex skill exists; adapt the CCGS workflow depth to Codex-native instructions.", + "scores": { + "contentDepth": 5, + "proceduralSpecificity": 5, + "contextContract": 5, + "outputContract": 5, + "roleSkillLinkage": 2, + "gateEscalation": 3, + "codexFit": 3, + "testability": 4 + }, + "ownerPath": "src/skills.ts", + "testPath": "tests/project-workflow.test.ts", + "status": "implemented" + }, + { + "sourceType": "skill", + "sourceId": "team-audio", + "sourcePath": ".claude/skills/team-audio/SKILL.md", + "sourceHash": "6dd03358962dbef74b6c67e7d34383e0721571a534b75f1ba562f39e92287416", + "cgsTarget": { + "kind": "skill", + "id": "cgs-team-audio", + "path": "src/skills.ts", + "hash": "04ac9756b65d9100958e6f59fc141ac2bd43fa2989614e47d606a7aa9339497d" + }, + "decision": "adapt", + "rationale": "Generated Codex skill exists; adapt the CCGS workflow depth to Codex-native instructions.", + "scores": { + "contentDepth": 3, + "proceduralSpecificity": 5, + "contextContract": 4, + "outputContract": 2, + "roleSkillLinkage": 2, + "gateEscalation": 2, + "codexFit": 3, + "testability": 4 + }, + "ownerPath": "src/skills.ts", + "testPath": "tests/project-workflow.test.ts", + "status": "implemented" + }, + { + "sourceType": "skill", + "sourceId": "team-combat", + "sourcePath": ".claude/skills/team-combat/SKILL.md", + "sourceHash": "8a3de29e9ac63a38d025ac5451c0c93626f651741e1002f159b9983f4a31af05", + "cgsTarget": { + "kind": "skill", + "id": "cgs-team-combat", + "path": "src/skills.ts", + "hash": "f16aec05e0baeada86ac9a37e797069c74b086e7bad8a2926beea80801ccf43a" + }, + "decision": "adapt", + "rationale": "Generated Codex skill exists; adapt the CCGS workflow depth to Codex-native instructions.", + "scores": { + "contentDepth": 5, + "proceduralSpecificity": 5, + "contextContract": 3, + "outputContract": 3, + "roleSkillLinkage": 2, + "gateEscalation": 2, + "codexFit": 3, + "testability": 4 + }, + "ownerPath": "src/skills.ts", + "testPath": "tests/project-workflow.test.ts", + "status": "implemented" + }, + { + "sourceType": "skill", + "sourceId": "team-level", + "sourcePath": ".claude/skills/team-level/SKILL.md", + "sourceHash": "2035d20d9393f6e703e04074ded2145688a8e2e4a2191f5a75866a4fb97100bd", + "cgsTarget": { + "kind": "skill", + "id": "cgs-team-level", + "path": "src/skills.ts", + "hash": "e98400a4448574323db371c8261199023174fed9a6e1358824902492f91b5181" + }, + "decision": "adapt", + "rationale": "Generated Codex skill exists; adapt the CCGS workflow depth to Codex-native instructions.", + "scores": { + "contentDepth": 5, + "proceduralSpecificity": 5, + "contextContract": 5, + "outputContract": 2, + "roleSkillLinkage": 2, + "gateEscalation": 2, + "codexFit": 3, + "testability": 4 + }, + "ownerPath": "src/skills.ts", + "testPath": "tests/project-workflow.test.ts", + "status": "implemented" + }, + { + "sourceType": "skill", + "sourceId": "team-live-ops", + "sourcePath": ".claude/skills/team-live-ops/SKILL.md", + "sourceHash": "214cc07ec8e83074d9ca16236ab867cd552e2de481aca7d225c06013b057dd90", + "cgsTarget": { + "kind": "skill", + "id": "cgs-team-live-ops", + "path": "src/skills.ts", + "hash": "95882030e2cf5e2c56284befb55a27b19402edf0514b4eb0c7799ba17d945bac" + }, + "decision": "adapt", + "rationale": "Generated Codex skill exists; adapt the CCGS workflow depth to Codex-native instructions.", + "scores": { + "contentDepth": 5, + "proceduralSpecificity": 5, + "contextContract": 4, + "outputContract": 4, + "roleSkillLinkage": 2, + "gateEscalation": 2, + "codexFit": 3, + "testability": 4 + }, + "ownerPath": "src/skills.ts", + "testPath": "tests/project-workflow.test.ts", + "status": "implemented" + }, + { + "sourceType": "skill", + "sourceId": "team-narrative", + "sourcePath": ".claude/skills/team-narrative/SKILL.md", + "sourceHash": "9959626482ed8607f8a93a7fcf2c3d03546621592784d56a22b70cfe387ca0d4", + "cgsTarget": { + "kind": "skill", + "id": "cgs-team-narrative", + "path": "src/skills.ts", + "hash": "a6b0e913f9516ff2ae86e357ff3e57cf7e2b032ceab6b382a122a0360f90303d" + }, + "decision": "adapt", + "rationale": "Generated Codex skill exists; adapt the CCGS workflow depth to Codex-native instructions.", + "scores": { + "contentDepth": 5, + "proceduralSpecificity": 5, + "contextContract": 2, + "outputContract": 3, + "roleSkillLinkage": 2, + "gateEscalation": 2, + "codexFit": 3, + "testability": 4 + }, + "ownerPath": "src/skills.ts", + "testPath": "tests/project-workflow.test.ts", + "status": "implemented" + }, + { + "sourceType": "skill", + "sourceId": "team-polish", + "sourcePath": ".claude/skills/team-polish/SKILL.md", + "sourceHash": "fb4d48c5bd8f2563d6f999bea940929a20b8c52ed797b306a999e2b4d5596d26", + "cgsTarget": { + "kind": "skill", + "id": "cgs-team-polish", + "path": "src/skills.ts", + "hash": "751c0a7d58d61a61ea879cb7cd17409bd965b7b8b6215953a95d864319538c97" + }, + "decision": "adapt", + "rationale": "Generated Codex skill exists; adapt the CCGS workflow depth to Codex-native instructions.", + "scores": { + "contentDepth": 5, + "proceduralSpecificity": 5, + "contextContract": 2, + "outputContract": 3, + "roleSkillLinkage": 2, + "gateEscalation": 2, + "codexFit": 3, + "testability": 4 + }, + "ownerPath": "src/skills.ts", + "testPath": "tests/project-workflow.test.ts", + "status": "implemented" + }, + { + "sourceType": "skill", + "sourceId": "team-qa", + "sourcePath": ".claude/skills/team-qa/SKILL.md", + "sourceHash": "1d67b5e45ae41e20c0c4ecaa3e89441c2493327b737fb369d3c6b66a369b1bd3", + "cgsTarget": { + "kind": "skill", + "id": "cgs-team-qa", + "path": "src/skills.ts", + "hash": "de1e44ea9b1008b10841e5b6aa8d5367e65179a272684406b182cacab6a40b6c" + }, + "decision": "adapt", + "rationale": "Generated Codex skill exists; adapt the CCGS workflow depth to Codex-native instructions.", + "scores": { + "contentDepth": 5, + "proceduralSpecificity": 5, + "contextContract": 5, + "outputContract": 5, + "roleSkillLinkage": 4, + "gateEscalation": 5, + "codexFit": 3, + "testability": 4 + }, + "ownerPath": "src/skills.ts", + "testPath": "tests/project-workflow.test.ts", + "status": "implemented" + }, + { + "sourceType": "skill", + "sourceId": "team-release", + "sourcePath": ".claude/skills/team-release/SKILL.md", + "sourceHash": "9cb0f1c15b4af864f57717de9f3ef4ad516370d6abf1d0047e0b7ed10d496b69", + "cgsTarget": { + "kind": "skill", + "id": "cgs-team-release", + "path": "src/skills.ts", + "hash": "313761eb9d9cea60aac172f33ee17b20c1fc6ac6ce6aef601c7cb3fcf6bbd352" + }, + "decision": "adapt", + "rationale": "Generated Codex skill exists; adapt the CCGS workflow depth to Codex-native instructions.", + "scores": { + "contentDepth": 5, + "proceduralSpecificity": 5, + "contextContract": 4, + "outputContract": 3, + "roleSkillLinkage": 2, + "gateEscalation": 4, + "codexFit": 3, + "testability": 4 + }, + "ownerPath": "src/skills.ts", + "testPath": "tests/project-workflow.test.ts", + "status": "implemented" + }, + { + "sourceType": "skill", + "sourceId": "team-ui", + "sourcePath": ".claude/skills/team-ui/SKILL.md", + "sourceHash": "d8aa30cbc82c40f3ec53ebceaf229243cac1bc14126ea56f5bfcf57b3c81d0bf", + "cgsTarget": { + "kind": "skill", + "id": "cgs-team-ui", + "path": "src/skills.ts", + "hash": "1e662b2659e4271e531865117e7099fb610d0d18da279cfa937e76f533e01841" + }, + "decision": "adapt", + "rationale": "Generated Codex skill exists; adapt the CCGS workflow depth to Codex-native instructions.", + "scores": { + "contentDepth": 5, + "proceduralSpecificity": 5, + "contextContract": 5, + "outputContract": 3, + "roleSkillLinkage": 2, + "gateEscalation": 2, + "codexFit": 3, + "testability": 4 + }, + "ownerPath": "src/skills.ts", + "testPath": "tests/project-workflow.test.ts", + "status": "implemented" + }, + { + "sourceType": "skill", + "sourceId": "tech-debt", + "sourcePath": ".claude/skills/tech-debt/SKILL.md", + "sourceHash": "bebf9faf308eb8ac4dbd70e907e2ae64daff51d86bf16353f5997543c318c6c8", + "cgsTarget": { + "kind": "skill", + "id": "cgs-tech-debt", + "path": "src/skills.ts", + "hash": "ce2c398cd87aaf0df68a8398e43a70b2ad822335fbcaa3d4abc45af4e01dd575" + }, + "decision": "adapt", + "rationale": "Generated Codex skill exists; adapt the CCGS workflow depth to Codex-native instructions.", + "scores": { + "contentDepth": 4, + "proceduralSpecificity": 5, + "contextContract": 2, + "outputContract": 4, + "roleSkillLinkage": 2, + "gateEscalation": 3, + "codexFit": 3, + "testability": 4 + }, + "ownerPath": "src/skills.ts", + "testPath": "tests/project-workflow.test.ts", + "status": "implemented" + }, + { + "sourceType": "skill", + "sourceId": "test-evidence-review", + "sourcePath": ".claude/skills/test-evidence-review/SKILL.md", + "sourceHash": "04cdf0b7e94ab2dab58850bf1a70a2a6f33810ea7abb6102eaec8f2d00b9026e", + "cgsTarget": { + "kind": "skill", + "id": "cgs-test-evidence-review", + "path": "src/skills.ts", + "hash": "1d0989208b54461647ec2577f72270f9e7feb60fc42965ad00c8a0ec306960b1" + }, + "decision": "adapt", + "rationale": "Generated Codex skill exists; adapt the CCGS workflow depth to Codex-native instructions.", + "scores": { + "contentDepth": 4, + "proceduralSpecificity": 2, + "contextContract": 1, + "outputContract": 4, + "roleSkillLinkage": 2, + "gateEscalation": 2, + "codexFit": 5, + "testability": 4 + }, + "ownerPath": "src/skills.ts", + "testPath": "tests/project-workflow.test.ts", + "status": "implemented" + }, + { + "sourceType": "skill", + "sourceId": "test-flakiness", + "sourcePath": ".claude/skills/test-flakiness/SKILL.md", + "sourceHash": "3849299d9c0b667a2974157a2ce692892bcef475b87e0c20ad029b22f335b805", + "cgsTarget": { + "kind": "skill", + "id": "cgs-test-flakiness", + "path": "src/skills.ts", + "hash": "2f4062cd4b8471dcd717d93dd08ecfac7be28f0d11c88822ca9cb18456c29ece" + }, + "decision": "adapt", + "rationale": "Generated Codex skill exists; adapt the CCGS workflow depth to Codex-native instructions.", + "scores": { + "contentDepth": 4, + "proceduralSpecificity": 2, + "contextContract": 1, + "outputContract": 4, + "roleSkillLinkage": 2, + "gateEscalation": 4, + "codexFit": 5, + "testability": 4 + }, + "ownerPath": "src/skills.ts", + "testPath": "tests/project-workflow.test.ts", + "status": "implemented" + }, + { + "sourceType": "skill", + "sourceId": "test-helpers", + "sourcePath": ".claude/skills/test-helpers/SKILL.md", + "sourceHash": "98494481c7fe0b69611243f9174a1a860622e2b5488499c953a2e539001e3438", + "cgsTarget": { + "kind": "skill", + "id": "cgs-test-helpers", + "path": "src/skills.ts", + "hash": "71189360f71c9a8484172d116520166b90aa1a56387097e003872a038bfe9307" + }, + "decision": "adapt", + "rationale": "Generated Codex skill exists; adapt the CCGS workflow depth to Codex-native instructions.", + "scores": { + "contentDepth": 5, + "proceduralSpecificity": 5, + "contextContract": 5, + "outputContract": 5, + "roleSkillLinkage": 2, + "gateEscalation": 1, + "codexFit": 3, + "testability": 4 + }, + "ownerPath": "src/skills.ts", + "testPath": "tests/project-workflow.test.ts", + "status": "implemented" + }, + { + "sourceType": "skill", + "sourceId": "test-setup", + "sourcePath": ".claude/skills/test-setup/SKILL.md", + "sourceHash": "bf3477f58af77fdeabed42e9c15f1b7bd41d6837c1ddff0450922cee694c628d", + "cgsTarget": { + "kind": "skill", + "id": "cgs-test-setup", + "path": "src/skills.ts", + "hash": "7eb9705634d56dd2f5adf592951fa6b76fe8e97df2d0ed8ba052e2a6e4951a1b" + }, + "decision": "adapt", + "rationale": "Generated Codex skill exists; adapt the CCGS workflow depth to Codex-native instructions.", + "scores": { + "contentDepth": 5, + "proceduralSpecificity": 5, + "contextContract": 3, + "outputContract": 2, + "roleSkillLinkage": 2, + "gateEscalation": 1, + "codexFit": 3, + "testability": 4 + }, + "ownerPath": "src/skills.ts", + "testPath": "tests/project-workflow.test.ts", + "status": "implemented" + }, + { + "sourceType": "skill", + "sourceId": "ux-design", + "sourcePath": ".claude/skills/ux-design/SKILL.md", + "sourceHash": "2d37d14b653594c0c7aa346ff8d7cc129269cda8f42fe741f6d296d6345f9845", + "cgsTarget": { + "kind": "skill", + "id": "cgs-ux-design", + "path": "src/skills.ts", + "hash": "52b5a5e176d59fd4d3cba3c3f3de66482509f64ef365673fa283b011b9e9076d" + }, + "decision": "adapt", + "rationale": "Generated Codex skill exists; adapt the CCGS workflow depth to Codex-native instructions.", + "scores": { + "contentDepth": 5, + "proceduralSpecificity": 5, + "contextContract": 5, + "outputContract": 5, + "roleSkillLinkage": 4, + "gateEscalation": 1, + "codexFit": 3, + "testability": 4 + }, + "ownerPath": "src/skills.ts", + "testPath": "tests/project-workflow.test.ts", + "status": "implemented" + }, + { + "sourceType": "skill", + "sourceId": "ux-review", + "sourcePath": ".claude/skills/ux-review/SKILL.md", + "sourceHash": "1dd5a719efd1ad5c2d831c046f9e257e9c7cff067cc9d1a99e67181e1b0f4bc0", + "cgsTarget": { + "kind": "skill", + "id": "cgs-ux-review", + "path": "src/skills.ts", + "hash": "20d0aa713bc333777eea30bb6d0ebe8c1c1f8d500653cbd12e3760922aa4fff6" + }, + "decision": "adapt", + "rationale": "Generated Codex skill exists; adapt the CCGS workflow depth to Codex-native instructions.", + "scores": { + "contentDepth": 5, + "proceduralSpecificity": 5, + "contextContract": 5, + "outputContract": 3, + "roleSkillLinkage": 4, + "gateEscalation": 1, + "codexFit": 3, + "testability": 4 + }, + "ownerPath": "src/skills.ts", + "testPath": "tests/project-workflow.test.ts", + "status": "implemented" + }, + { + "sourceType": "skill", + "sourceId": "vertical-slice", + "sourcePath": ".claude/skills/vertical-slice/SKILL.md", + "sourceHash": "a555d5a79fceee22229b5587778ccae3f2c17514c92ffa62b708db613c574f9a", + "cgsTarget": { + "kind": "skill", + "id": "cgs-vertical-slice", + "path": "src/skills.ts", + "hash": "8595cf37aff47cb97ff960e0fc9ba0ecada5dd2ad9d0d95ee8b35c100c30d67b" + }, + "decision": "adapt", + "rationale": "Generated Codex skill exists; adapt the CCGS workflow depth to Codex-native instructions.", + "scores": { + "contentDepth": 5, + "proceduralSpecificity": 5, + "contextContract": 5, + "outputContract": 3, + "roleSkillLinkage": 4, + "gateEscalation": 4, + "codexFit": 3, + "testability": 4 + }, + "ownerPath": "src/skills.ts", + "testPath": "tests/project-workflow.test.ts", + "status": "implemented" + }, + { + "sourceType": "workflow-step", + "sourceId": "brainstorm", + "sourcePath": ".claude/docs/workflow-catalog.yaml", + "sourceHash": "1c5a5725575c4887bc1bb7042a80a9842f52c0771978888ee1503a1c84791ede", + "cgsTarget": { + "kind": "workflow", + "id": "brainstorm", + "path": "src/workflows.ts", + "hash": "864ae37c096eb213e72c09ff75c04532126e5831fc21be5243b5fa4541382325" + }, + "decision": "adapt", + "rationale": "Workflow exists; add CCGS-style phase/artifact semantics where useful.", + "scores": { + "contentDepth": 1, + "proceduralSpecificity": 2, + "contextContract": 2, + "outputContract": 2, + "roleSkillLinkage": 2, + "gateEscalation": 1, + "codexFit": 5, + "testability": 2 + }, + "ownerPath": "src/workflows.ts", + "testPath": "tests/workflow-recipes.test.ts", + "status": "implemented" + }, + { + "sourceType": "workflow-step", + "sourceId": "engine-setup", + "sourcePath": ".claude/docs/workflow-catalog.yaml", + "sourceHash": "1c5a5725575c4887bc1bb7042a80a9842f52c0771978888ee1503a1c84791ede", + "cgsTarget": { + "kind": "workflow", + "id": "engine-setup", + "path": "src/workflow-catalog.ts" + }, + "decision": "adopt", + "rationale": "CCGS catalog step is missing and should be represented in the CGS phase catalog or as a workflow alias.", + "scores": { + "contentDepth": 2, + "proceduralSpecificity": 2, + "contextContract": 2, + "outputContract": 2, + "roleSkillLinkage": 2, + "gateEscalation": 1, + "codexFit": 3, + "testability": 2 + }, + "ownerPath": "src/workflow-catalog.ts", + "testPath": "tests/workflow-catalog.test.ts", + "status": "todo" + }, + { + "sourceType": "workflow-step", + "sourceId": "game-concept", + "sourcePath": ".claude/docs/workflow-catalog.yaml", + "sourceHash": "1c5a5725575c4887bc1bb7042a80a9842f52c0771978888ee1503a1c84791ede", + "cgsTarget": { + "kind": "workflow", + "id": "game-concept", + "path": "src/workflow-catalog.ts" + }, + "decision": "adopt", + "rationale": "CCGS catalog step is missing and should be represented in the CGS phase catalog or as a workflow alias.", + "scores": { + "contentDepth": 2, + "proceduralSpecificity": 2, + "contextContract": 2, + "outputContract": 2, + "roleSkillLinkage": 2, + "gateEscalation": 1, + "codexFit": 5, + "testability": 2 + }, + "ownerPath": "src/workflow-catalog.ts", + "testPath": "tests/workflow-catalog.test.ts", + "status": "todo" + }, + { + "sourceType": "workflow-step", + "sourceId": "design-review-concept", + "sourcePath": ".claude/docs/workflow-catalog.yaml", + "sourceHash": "1c5a5725575c4887bc1bb7042a80a9842f52c0771978888ee1503a1c84791ede", + "cgsTarget": { + "kind": "workflow", + "id": "design-review-concept", + "path": "src/workflow-catalog.ts" + }, + "decision": "adopt", + "rationale": "CCGS catalog step is missing and should be represented in the CGS phase catalog or as a workflow alias.", + "scores": { + "contentDepth": 1, + "proceduralSpecificity": 2, + "contextContract": 2, + "outputContract": 2, + "roleSkillLinkage": 2, + "gateEscalation": 1, + "codexFit": 5, + "testability": 2 + }, + "ownerPath": "src/workflow-catalog.ts", + "testPath": "tests/workflow-catalog.test.ts", + "status": "todo" + }, + { + "sourceType": "workflow-step", + "sourceId": "art-bible", + "sourcePath": ".claude/docs/workflow-catalog.yaml", + "sourceHash": "1c5a5725575c4887bc1bb7042a80a9842f52c0771978888ee1503a1c84791ede", + "cgsTarget": { + "kind": "workflow", + "id": "art-bible", + "path": "src/workflow-catalog.ts" + }, + "decision": "adopt", + "rationale": "CCGS catalog step is missing and should be represented in the CGS phase catalog or as a workflow alias.", + "scores": { + "contentDepth": 2, + "proceduralSpecificity": 2, + "contextContract": 2, + "outputContract": 2, + "roleSkillLinkage": 2, + "gateEscalation": 1, + "codexFit": 5, + "testability": 2 + }, + "ownerPath": "src/workflow-catalog.ts", + "testPath": "tests/workflow-catalog.test.ts", + "status": "todo" + }, + { + "sourceType": "workflow-step", + "sourceId": "map-systems", + "sourcePath": ".claude/docs/workflow-catalog.yaml", + "sourceHash": "1c5a5725575c4887bc1bb7042a80a9842f52c0771978888ee1503a1c84791ede", + "cgsTarget": { + "kind": "workflow", + "id": "map-systems", + "path": "src/workflow-catalog.ts" + }, + "decision": "adopt", + "rationale": "CCGS catalog step is missing and should be represented in the CGS phase catalog or as a workflow alias.", + "scores": { + "contentDepth": 2, + "proceduralSpecificity": 2, + "contextContract": 2, + "outputContract": 2, + "roleSkillLinkage": 2, + "gateEscalation": 1, + "codexFit": 5, + "testability": 2 + }, + "ownerPath": "src/workflow-catalog.ts", + "testPath": "tests/workflow-catalog.test.ts", + "status": "todo" + }, + { + "sourceType": "workflow-step", + "sourceId": "design-system", + "sourcePath": ".claude/docs/workflow-catalog.yaml", + "sourceHash": "1c5a5725575c4887bc1bb7042a80a9842f52c0771978888ee1503a1c84791ede", + "cgsTarget": { + "kind": "workflow", + "id": "design-system", + "path": "src/workflow-catalog.ts" + }, + "decision": "adopt", + "rationale": "CCGS catalog step is missing and should be represented in the CGS phase catalog or as a workflow alias.", + "scores": { + "contentDepth": 2, + "proceduralSpecificity": 2, + "contextContract": 2, + "outputContract": 2, + "roleSkillLinkage": 2, + "gateEscalation": 1, + "codexFit": 5, + "testability": 2 + }, + "ownerPath": "src/workflow-catalog.ts", + "testPath": "tests/workflow-catalog.test.ts", + "status": "todo" + }, + { + "sourceType": "workflow-step", + "sourceId": "design-review", + "sourcePath": ".claude/docs/workflow-catalog.yaml", + "sourceHash": "1c5a5725575c4887bc1bb7042a80a9842f52c0771978888ee1503a1c84791ede", + "cgsTarget": { + "kind": "workflow", + "id": "design-review", + "path": "src/workflow-catalog.ts" + }, + "decision": "adopt", + "rationale": "CCGS catalog step is missing and should be represented in the CGS phase catalog or as a workflow alias.", + "scores": { + "contentDepth": 1, + "proceduralSpecificity": 2, + "contextContract": 2, + "outputContract": 2, + "roleSkillLinkage": 2, + "gateEscalation": 3, + "codexFit": 5, + "testability": 2 + }, + "ownerPath": "src/workflow-catalog.ts", + "testPath": "tests/workflow-catalog.test.ts", + "status": "todo" + }, + { + "sourceType": "workflow-step", + "sourceId": "review-all-gdds", + "sourcePath": ".claude/docs/workflow-catalog.yaml", + "sourceHash": "1c5a5725575c4887bc1bb7042a80a9842f52c0771978888ee1503a1c84791ede", + "cgsTarget": { + "kind": "workflow", + "id": "review-all-gdds", + "path": "src/workflow-catalog.ts" + }, + "decision": "adopt", + "rationale": "CCGS catalog step is missing and should be represented in the CGS phase catalog or as a workflow alias.", + "scores": { + "contentDepth": 2, + "proceduralSpecificity": 2, + "contextContract": 2, + "outputContract": 2, + "roleSkillLinkage": 2, + "gateEscalation": 1, + "codexFit": 5, + "testability": 2 + }, + "ownerPath": "src/workflow-catalog.ts", + "testPath": "tests/workflow-catalog.test.ts", + "status": "todo" + }, + { + "sourceType": "workflow-step", + "sourceId": "consistency-check", + "sourcePath": ".claude/docs/workflow-catalog.yaml", + "sourceHash": "1c5a5725575c4887bc1bb7042a80a9842f52c0771978888ee1503a1c84791ede", + "cgsTarget": { + "kind": "workflow", + "id": "consistency-check", + "path": "src/workflow-catalog.ts" + }, + "decision": "adopt", + "rationale": "CCGS catalog step is missing and should be represented in the CGS phase catalog or as a workflow alias.", + "scores": { + "contentDepth": 1, + "proceduralSpecificity": 2, + "contextContract": 2, + "outputContract": 2, + "roleSkillLinkage": 2, + "gateEscalation": 1, + "codexFit": 5, + "testability": 2 + }, + "ownerPath": "src/workflow-catalog.ts", + "testPath": "tests/workflow-catalog.test.ts", + "status": "todo" + }, + { + "sourceType": "workflow-step", + "sourceId": "create-architecture", + "sourcePath": ".claude/docs/workflow-catalog.yaml", + "sourceHash": "1c5a5725575c4887bc1bb7042a80a9842f52c0771978888ee1503a1c84791ede", + "cgsTarget": { + "kind": "workflow", + "id": "create-architecture", + "path": "src/workflow-catalog.ts" + }, + "decision": "adopt", + "rationale": "CCGS catalog step is missing and should be represented in the CGS phase catalog or as a workflow alias.", + "scores": { + "contentDepth": 2, + "proceduralSpecificity": 2, + "contextContract": 2, + "outputContract": 2, + "roleSkillLinkage": 2, + "gateEscalation": 1, + "codexFit": 5, + "testability": 2 + }, + "ownerPath": "src/workflow-catalog.ts", + "testPath": "tests/workflow-catalog.test.ts", + "status": "todo" + }, + { + "sourceType": "workflow-step", + "sourceId": "architecture-decision", + "sourcePath": ".claude/docs/workflow-catalog.yaml", + "sourceHash": "1c5a5725575c4887bc1bb7042a80a9842f52c0771978888ee1503a1c84791ede", + "cgsTarget": { + "kind": "workflow", + "id": "architecture-decision", + "path": "src/workflows.ts", + "hash": "d797e83ec6f0e2ec083072699b2897f519c5b4bf24dd3dd181f0a2141655e1f2" + }, + "decision": "adapt", + "rationale": "Workflow exists; add CCGS-style phase/artifact semantics where useful.", + "scores": { + "contentDepth": 2, + "proceduralSpecificity": 2, + "contextContract": 2, + "outputContract": 2, + "roleSkillLinkage": 2, + "gateEscalation": 1, + "codexFit": 5, + "testability": 2 + }, + "ownerPath": "src/workflows.ts", + "testPath": "tests/workflow-recipes.test.ts", + "status": "implemented" + }, + { + "sourceType": "workflow-step", + "sourceId": "architecture-review", + "sourcePath": ".claude/docs/workflow-catalog.yaml", + "sourceHash": "1c5a5725575c4887bc1bb7042a80a9842f52c0771978888ee1503a1c84791ede", + "cgsTarget": { + "kind": "workflow", + "id": "architecture-review", + "path": "src/workflows.ts", + "hash": "31d543da1a2b1887e7b2c159b848bf8e5fec6fc915751163facfeab91d5add78" + }, + "decision": "adapt", + "rationale": "Workflow exists; add CCGS-style phase/artifact semantics where useful.", + "scores": { + "contentDepth": 2, + "proceduralSpecificity": 2, + "contextContract": 2, + "outputContract": 2, + "roleSkillLinkage": 2, + "gateEscalation": 1, + "codexFit": 5, + "testability": 2 + }, + "ownerPath": "src/workflows.ts", + "testPath": "tests/workflow-recipes.test.ts", + "status": "implemented" + }, + { + "sourceType": "workflow-step", + "sourceId": "control-manifest", + "sourcePath": ".claude/docs/workflow-catalog.yaml", + "sourceHash": "1c5a5725575c4887bc1bb7042a80a9842f52c0771978888ee1503a1c84791ede", + "cgsTarget": { + "kind": "workflow", + "id": "control-manifest", + "path": "src/workflow-catalog.ts" + }, + "decision": "adopt", + "rationale": "CCGS catalog step is missing and should be represented in the CGS phase catalog or as a workflow alias.", + "scores": { + "contentDepth": 2, + "proceduralSpecificity": 2, + "contextContract": 2, + "outputContract": 2, + "roleSkillLinkage": 2, + "gateEscalation": 1, + "codexFit": 5, + "testability": 2 + }, + "ownerPath": "src/workflow-catalog.ts", + "testPath": "tests/workflow-catalog.test.ts", + "status": "todo" + }, + { + "sourceType": "workflow-step", + "sourceId": "accessibility-doc", + "sourcePath": ".claude/docs/workflow-catalog.yaml", + "sourceHash": "1c5a5725575c4887bc1bb7042a80a9842f52c0771978888ee1503a1c84791ede", + "cgsTarget": { + "kind": "workflow", + "id": "accessibility-doc", + "path": "src/workflow-catalog.ts" + }, + "decision": "adopt", + "rationale": "CCGS catalog step is missing and should be represented in the CGS phase catalog or as a workflow alias.", + "scores": { + "contentDepth": 2, + "proceduralSpecificity": 2, + "contextContract": 2, + "outputContract": 2, + "roleSkillLinkage": 2, + "gateEscalation": 1, + "codexFit": 5, + "testability": 2 + }, + "ownerPath": "src/workflow-catalog.ts", + "testPath": "tests/workflow-catalog.test.ts", + "status": "todo" + }, + { + "sourceType": "workflow-step", + "sourceId": "entity-inventory", + "sourcePath": ".claude/docs/workflow-catalog.yaml", + "sourceHash": "1c5a5725575c4887bc1bb7042a80a9842f52c0771978888ee1503a1c84791ede", + "cgsTarget": { + "kind": "workflow", + "id": "entity-inventory", + "path": "src/workflow-catalog.ts" + }, + "decision": "adopt", + "rationale": "CCGS catalog step is missing and should be represented in the CGS phase catalog or as a workflow alias.", + "scores": { + "contentDepth": 2, + "proceduralSpecificity": 2, + "contextContract": 3, + "outputContract": 2, + "roleSkillLinkage": 2, + "gateEscalation": 1, + "codexFit": 5, + "testability": 2 + }, + "ownerPath": "src/workflow-catalog.ts", + "testPath": "tests/workflow-catalog.test.ts", + "status": "todo" + }, + { + "sourceType": "workflow-step", + "sourceId": "asset-spec", + "sourcePath": ".claude/docs/workflow-catalog.yaml", + "sourceHash": "1c5a5725575c4887bc1bb7042a80a9842f52c0771978888ee1503a1c84791ede", + "cgsTarget": { + "kind": "workflow", + "id": "asset-spec", + "path": "src/workflow-catalog.ts" + }, + "decision": "adopt", + "rationale": "CCGS catalog step is missing and should be represented in the CGS phase catalog or as a workflow alias.", + "scores": { + "contentDepth": 2, + "proceduralSpecificity": 2, + "contextContract": 2, + "outputContract": 2, + "roleSkillLinkage": 2, + "gateEscalation": 1, + "codexFit": 5, + "testability": 2 + }, + "ownerPath": "src/workflow-catalog.ts", + "testPath": "tests/workflow-catalog.test.ts", + "status": "todo" + }, + { + "sourceType": "workflow-step", + "sourceId": "ux-design", + "sourcePath": ".claude/docs/workflow-catalog.yaml", + "sourceHash": "1c5a5725575c4887bc1bb7042a80a9842f52c0771978888ee1503a1c84791ede", + "cgsTarget": { + "kind": "workflow", + "id": "ux-design", + "path": "src/workflow-catalog.ts" + }, + "decision": "adopt", + "rationale": "CCGS catalog step is missing and should be represented in the CGS phase catalog or as a workflow alias.", + "scores": { + "contentDepth": 2, + "proceduralSpecificity": 2, + "contextContract": 3, + "outputContract": 2, + "roleSkillLinkage": 2, + "gateEscalation": 1, + "codexFit": 5, + "testability": 2 + }, + "ownerPath": "src/workflow-catalog.ts", + "testPath": "tests/workflow-catalog.test.ts", + "status": "todo" + }, + { + "sourceType": "workflow-step", + "sourceId": "ux-review", + "sourcePath": ".claude/docs/workflow-catalog.yaml", + "sourceHash": "1c5a5725575c4887bc1bb7042a80a9842f52c0771978888ee1503a1c84791ede", + "cgsTarget": { + "kind": "workflow", + "id": "ux-review", + "path": "src/workflow-catalog.ts" + }, + "decision": "adopt", + "rationale": "CCGS catalog step is missing and should be represented in the CGS phase catalog or as a workflow alias.", + "scores": { + "contentDepth": 1, + "proceduralSpecificity": 2, + "contextContract": 2, + "outputContract": 2, + "roleSkillLinkage": 2, + "gateEscalation": 1, + "codexFit": 5, + "testability": 2 + }, + "ownerPath": "src/workflow-catalog.ts", + "testPath": "tests/workflow-catalog.test.ts", + "status": "todo" + }, + { + "sourceType": "workflow-step", + "sourceId": "prototype", + "sourcePath": ".claude/docs/workflow-catalog.yaml", + "sourceHash": "1c5a5725575c4887bc1bb7042a80a9842f52c0771978888ee1503a1c84791ede", + "cgsTarget": { + "kind": "workflow", + "id": "prototype", + "path": "src/workflows.ts", + "hash": "f63f00f5cd9d135a1d73b17b8f96970747683bc072a76f341b29c883ffc1ca71" + }, + "decision": "adapt", + "rationale": "Workflow exists; add CCGS-style phase/artifact semantics where useful.", + "scores": { + "contentDepth": 2, + "proceduralSpecificity": 2, + "contextContract": 2, + "outputContract": 2, + "roleSkillLinkage": 2, + "gateEscalation": 1, + "codexFit": 5, + "testability": 2 + }, + "ownerPath": "src/workflows.ts", + "testPath": "tests/workflow-recipes.test.ts", + "status": "implemented" + }, + { + "sourceType": "workflow-step", + "sourceId": "create-epics", + "sourcePath": ".claude/docs/workflow-catalog.yaml", + "sourceHash": "1c5a5725575c4887bc1bb7042a80a9842f52c0771978888ee1503a1c84791ede", + "cgsTarget": { + "kind": "workflow", + "id": "create-epics", + "path": "src/workflows.ts", + "hash": "54b38673417ef0c178d0d7b8255d2e92d23bc01e9bf98a294836fe0ecf5a714b" + }, + "decision": "adapt", + "rationale": "Workflow exists; add CCGS-style phase/artifact semantics where useful.", + "scores": { + "contentDepth": 2, + "proceduralSpecificity": 2, + "contextContract": 2, + "outputContract": 2, + "roleSkillLinkage": 2, + "gateEscalation": 1, + "codexFit": 5, + "testability": 2 + }, + "ownerPath": "src/workflows.ts", + "testPath": "tests/workflow-recipes.test.ts", + "status": "implemented" + }, + { + "sourceType": "workflow-step", + "sourceId": "create-stories", + "sourcePath": ".claude/docs/workflow-catalog.yaml", + "sourceHash": "1c5a5725575c4887bc1bb7042a80a9842f52c0771978888ee1503a1c84791ede", + "cgsTarget": { + "kind": "workflow", + "id": "create-stories", + "path": "src/workflows.ts", + "hash": "1b86588757e1b0517e7c9633023cbbaf6f02cacef5ccf339a54fc6b1a9c49fd5" + }, + "decision": "adapt", + "rationale": "Workflow exists; add CCGS-style phase/artifact semantics where useful.", + "scores": { + "contentDepth": 2, + "proceduralSpecificity": 2, + "contextContract": 2, + "outputContract": 2, + "roleSkillLinkage": 2, + "gateEscalation": 1, + "codexFit": 5, + "testability": 2 + }, + "ownerPath": "src/workflows.ts", + "testPath": "tests/workflow-recipes.test.ts", + "status": "implemented" + }, + { + "sourceType": "workflow-step", + "sourceId": "test-setup", + "sourcePath": ".claude/docs/workflow-catalog.yaml", + "sourceHash": "1c5a5725575c4887bc1bb7042a80a9842f52c0771978888ee1503a1c84791ede", + "cgsTarget": { + "kind": "workflow", + "id": "test-setup", + "path": "src/workflow-catalog.ts" + }, + "decision": "adopt", + "rationale": "CCGS catalog step is missing and should be represented in the CGS phase catalog or as a workflow alias.", + "scores": { + "contentDepth": 2, + "proceduralSpecificity": 2, + "contextContract": 2, + "outputContract": 2, + "roleSkillLinkage": 2, + "gateEscalation": 1, + "codexFit": 5, + "testability": 4 + }, + "ownerPath": "src/workflow-catalog.ts", + "testPath": "tests/workflow-catalog.test.ts", + "status": "todo" + }, + { + "sourceType": "workflow-step", + "sourceId": "sprint-plan", + "sourcePath": ".claude/docs/workflow-catalog.yaml", + "sourceHash": "1c5a5725575c4887bc1bb7042a80a9842f52c0771978888ee1503a1c84791ede", + "cgsTarget": { + "kind": "workflow", + "id": "sprint-plan", + "path": "src/workflows.ts", + "hash": "394590e0b094016af62bb147b21f7c86d8e1b48a06ffbf6f76d6ee1c91a905e9" + }, + "decision": "adapt", + "rationale": "Workflow exists; add CCGS-style phase/artifact semantics where useful.", + "scores": { + "contentDepth": 2, + "proceduralSpecificity": 2, + "contextContract": 2, + "outputContract": 2, + "roleSkillLinkage": 2, + "gateEscalation": 1, + "codexFit": 5, + "testability": 2 + }, + "ownerPath": "src/workflows.ts", + "testPath": "tests/workflow-recipes.test.ts", + "status": "implemented" + }, + { + "sourceType": "workflow-step", + "sourceId": "vertical-slice", + "sourcePath": ".claude/docs/workflow-catalog.yaml", + "sourceHash": "1c5a5725575c4887bc1bb7042a80a9842f52c0771978888ee1503a1c84791ede", + "cgsTarget": { + "kind": "workflow", + "id": "vertical-slice", + "path": "src/workflows.ts", + "hash": "8436b8298c88e7ae02681e769bb2fd34c9c572a51bee065d5e470025de5c9402" + }, + "decision": "adapt", + "rationale": "Workflow exists; add CCGS-style phase/artifact semantics where useful.", + "scores": { + "contentDepth": 2, + "proceduralSpecificity": 2, + "contextContract": 2, + "outputContract": 2, + "roleSkillLinkage": 2, + "gateEscalation": 1, + "codexFit": 5, + "testability": 4 + }, + "ownerPath": "src/workflows.ts", + "testPath": "tests/workflow-recipes.test.ts", + "status": "implemented" + }, + { + "sourceType": "workflow-step", + "sourceId": "sprint-plan", + "sourcePath": ".claude/docs/workflow-catalog.yaml", + "sourceHash": "1c5a5725575c4887bc1bb7042a80a9842f52c0771978888ee1503a1c84791ede", + "cgsTarget": { + "kind": "workflow", + "id": "sprint-plan", + "path": "src/workflows.ts", + "hash": "394590e0b094016af62bb147b21f7c86d8e1b48a06ffbf6f76d6ee1c91a905e9" + }, + "decision": "adapt", + "rationale": "Workflow exists; add CCGS-style phase/artifact semantics where useful.", + "scores": { + "contentDepth": 2, + "proceduralSpecificity": 2, + "contextContract": 2, + "outputContract": 2, + "roleSkillLinkage": 2, + "gateEscalation": 1, + "codexFit": 5, + "testability": 2 + }, + "ownerPath": "src/workflows.ts", + "testPath": "tests/workflow-recipes.test.ts", + "status": "implemented" + }, + { + "sourceType": "workflow-step", + "sourceId": "story-readiness", + "sourcePath": ".claude/docs/workflow-catalog.yaml", + "sourceHash": "1c5a5725575c4887bc1bb7042a80a9842f52c0771978888ee1503a1c84791ede", + "cgsTarget": { + "kind": "workflow", + "id": "story-readiness", + "path": "src/workflows.ts", + "hash": "05b3ec57ad525493a0d15818d807e18c5b731ace87f5596b3490507f3b3135ec" + }, + "decision": "adapt", + "rationale": "Workflow exists; add CCGS-style phase/artifact semantics where useful.", + "scores": { + "contentDepth": 1, + "proceduralSpecificity": 2, + "contextContract": 2, + "outputContract": 2, + "roleSkillLinkage": 2, + "gateEscalation": 1, + "codexFit": 5, + "testability": 2 + }, + "ownerPath": "src/workflows.ts", + "testPath": "tests/workflow-recipes.test.ts", + "status": "implemented" + }, + { + "sourceType": "workflow-step", + "sourceId": "implement", + "sourcePath": ".claude/docs/workflow-catalog.yaml", + "sourceHash": "1c5a5725575c4887bc1bb7042a80a9842f52c0771978888ee1503a1c84791ede", + "cgsTarget": { + "kind": "workflow", + "id": "implement", + "path": "src/workflow-catalog.ts" + }, + "decision": "adopt", + "rationale": "CCGS catalog step is missing and should be represented in the CGS phase catalog or as a workflow alias.", + "scores": { + "contentDepth": 2, + "proceduralSpecificity": 2, + "contextContract": 2, + "outputContract": 2, + "roleSkillLinkage": 2, + "gateEscalation": 1, + "codexFit": 5, + "testability": 2 + }, + "ownerPath": "src/workflow-catalog.ts", + "testPath": "tests/workflow-catalog.test.ts", + "status": "todo" + }, + { + "sourceType": "workflow-step", + "sourceId": "code-review", + "sourcePath": ".claude/docs/workflow-catalog.yaml", + "sourceHash": "1c5a5725575c4887bc1bb7042a80a9842f52c0771978888ee1503a1c84791ede", + "cgsTarget": { + "kind": "workflow", + "id": "code-review", + "path": "src/workflow-catalog.ts" + }, + "decision": "adopt", + "rationale": "CCGS catalog step is missing and should be represented in the CGS phase catalog or as a workflow alias.", + "scores": { + "contentDepth": 1, + "proceduralSpecificity": 2, + "contextContract": 2, + "outputContract": 2, + "roleSkillLinkage": 2, + "gateEscalation": 1, + "codexFit": 5, + "testability": 2 + }, + "ownerPath": "src/workflow-catalog.ts", + "testPath": "tests/workflow-catalog.test.ts", + "status": "todo" + }, + { + "sourceType": "workflow-step", + "sourceId": "story-done", + "sourcePath": ".claude/docs/workflow-catalog.yaml", + "sourceHash": "1c5a5725575c4887bc1bb7042a80a9842f52c0771978888ee1503a1c84791ede", + "cgsTarget": { + "kind": "workflow", + "id": "story-done", + "path": "src/workflows.ts", + "hash": "b7c8fad68317c8ff885046edf568c0b0de1d6efd8088d2b19674376ff5f7bfbc" + }, + "decision": "adapt", + "rationale": "Workflow exists; add CCGS-style phase/artifact semantics where useful.", + "scores": { + "contentDepth": 1, + "proceduralSpecificity": 2, + "contextContract": 2, + "outputContract": 2, + "roleSkillLinkage": 2, + "gateEscalation": 1, + "codexFit": 5, + "testability": 4 + }, + "ownerPath": "src/workflows.ts", + "testPath": "tests/workflow-recipes.test.ts", + "status": "implemented" + }, + { + "sourceType": "workflow-step", + "sourceId": "qa-plan", + "sourcePath": ".claude/docs/workflow-catalog.yaml", + "sourceHash": "1c5a5725575c4887bc1bb7042a80a9842f52c0771978888ee1503a1c84791ede", + "cgsTarget": { + "kind": "workflow", + "id": "qa-plan", + "path": "src/workflows.ts", + "hash": "7785aa23cfaa25efc834b30390e398214c2d2e47bd1055384d9cde0f197198a0" + }, + "decision": "adapt", + "rationale": "Workflow exists; add CCGS-style phase/artifact semantics where useful.", + "scores": { + "contentDepth": 1, + "proceduralSpecificity": 2, + "contextContract": 2, + "outputContract": 2, + "roleSkillLinkage": 2, + "gateEscalation": 1, + "codexFit": 5, + "testability": 4 + }, + "ownerPath": "src/workflows.ts", + "testPath": "tests/workflow-recipes.test.ts", + "status": "implemented" + }, + { + "sourceType": "workflow-step", + "sourceId": "bug-report", + "sourcePath": ".claude/docs/workflow-catalog.yaml", + "sourceHash": "1c5a5725575c4887bc1bb7042a80a9842f52c0771978888ee1503a1c84791ede", + "cgsTarget": { + "kind": "workflow", + "id": "bug-report", + "path": "src/workflow-catalog.ts" + }, + "decision": "adopt", + "rationale": "CCGS catalog step is missing and should be represented in the CGS phase catalog or as a workflow alias.", + "scores": { + "contentDepth": 1, + "proceduralSpecificity": 2, + "contextContract": 2, + "outputContract": 2, + "roleSkillLinkage": 2, + "gateEscalation": 1, + "codexFit": 5, + "testability": 2 + }, + "ownerPath": "src/workflow-catalog.ts", + "testPath": "tests/workflow-catalog.test.ts", + "status": "todo" + }, + { + "sourceType": "workflow-step", + "sourceId": "retrospective", + "sourcePath": ".claude/docs/workflow-catalog.yaml", + "sourceHash": "1c5a5725575c4887bc1bb7042a80a9842f52c0771978888ee1503a1c84791ede", + "cgsTarget": { + "kind": "workflow", + "id": "retrospective", + "path": "src/workflow-catalog.ts" + }, + "decision": "adopt", + "rationale": "CCGS catalog step is missing and should be represented in the CGS phase catalog or as a workflow alias.", + "scores": { + "contentDepth": 1, + "proceduralSpecificity": 2, + "contextContract": 2, + "outputContract": 2, + "roleSkillLinkage": 2, + "gateEscalation": 1, + "codexFit": 5, + "testability": 2 + }, + "ownerPath": "src/workflow-catalog.ts", + "testPath": "tests/workflow-catalog.test.ts", + "status": "todo" + }, + { + "sourceType": "workflow-step", + "sourceId": "team-feature", + "sourcePath": ".claude/docs/workflow-catalog.yaml", + "sourceHash": "1c5a5725575c4887bc1bb7042a80a9842f52c0771978888ee1503a1c84791ede", + "cgsTarget": { + "kind": "workflow", + "id": "team-feature", + "path": "src/workflow-catalog.ts" + }, + "decision": "adopt", + "rationale": "CCGS catalog step is missing and should be represented in the CGS phase catalog or as a workflow alias.", + "scores": { + "contentDepth": 1, + "proceduralSpecificity": 2, + "contextContract": 2, + "outputContract": 2, + "roleSkillLinkage": 2, + "gateEscalation": 1, + "codexFit": 5, + "testability": 2 + }, + "ownerPath": "src/workflow-catalog.ts", + "testPath": "tests/workflow-catalog.test.ts", + "status": "todo" + }, + { + "sourceType": "workflow-step", + "sourceId": "scope-check", + "sourcePath": ".claude/docs/workflow-catalog.yaml", + "sourceHash": "1c5a5725575c4887bc1bb7042a80a9842f52c0771978888ee1503a1c84791ede", + "cgsTarget": { + "kind": "workflow", + "id": "scope-check", + "path": "src/workflow-catalog.ts" + }, + "decision": "adopt", + "rationale": "CCGS catalog step is missing and should be represented in the CGS phase catalog or as a workflow alias.", + "scores": { + "contentDepth": 2, + "proceduralSpecificity": 2, + "contextContract": 2, + "outputContract": 2, + "roleSkillLinkage": 2, + "gateEscalation": 1, + "codexFit": 5, + "testability": 2 + }, + "ownerPath": "src/workflow-catalog.ts", + "testPath": "tests/workflow-catalog.test.ts", + "status": "todo" + }, + { + "sourceType": "workflow-step", + "sourceId": "sprint-status", + "sourcePath": ".claude/docs/workflow-catalog.yaml", + "sourceHash": "1c5a5725575c4887bc1bb7042a80a9842f52c0771978888ee1503a1c84791ede", + "cgsTarget": { + "kind": "workflow", + "id": "sprint-status", + "path": "src/workflows.ts", + "hash": "f2f5a3e0062c068539d89a5c0e29e986350fa3857c726145057db18e898fd55e" + }, + "decision": "adapt", + "rationale": "Workflow exists; add CCGS-style phase/artifact semantics where useful.", + "scores": { + "contentDepth": 1, + "proceduralSpecificity": 2, + "contextContract": 2, + "outputContract": 2, + "roleSkillLinkage": 2, + "gateEscalation": 1, + "codexFit": 5, + "testability": 2 + }, + "ownerPath": "src/workflows.ts", + "testPath": "tests/workflow-recipes.test.ts", + "status": "implemented" + }, + { + "sourceType": "workflow-step", + "sourceId": "perf-profile", + "sourcePath": ".claude/docs/workflow-catalog.yaml", + "sourceHash": "1c5a5725575c4887bc1bb7042a80a9842f52c0771978888ee1503a1c84791ede", + "cgsTarget": { + "kind": "workflow", + "id": "perf-profile", + "path": "src/workflows.ts", + "hash": "cadda0ad0f7456692d4448f8785dea63df3b8db9cd29abfbc1543c1aa8f9e41d" + }, + "decision": "adapt", + "rationale": "Workflow exists; add CCGS-style phase/artifact semantics where useful.", + "scores": { + "contentDepth": 1, + "proceduralSpecificity": 2, + "contextContract": 2, + "outputContract": 2, + "roleSkillLinkage": 2, + "gateEscalation": 1, + "codexFit": 5, + "testability": 2 + }, + "ownerPath": "src/workflows.ts", + "testPath": "tests/workflow-recipes.test.ts", + "status": "implemented" + }, + { + "sourceType": "workflow-step", + "sourceId": "balance-check", + "sourcePath": ".claude/docs/workflow-catalog.yaml", + "sourceHash": "1c5a5725575c4887bc1bb7042a80a9842f52c0771978888ee1503a1c84791ede", + "cgsTarget": { + "kind": "workflow", + "id": "balance-check", + "path": "src/workflow-catalog.ts" + }, + "decision": "adopt", + "rationale": "CCGS catalog step is missing and should be represented in the CGS phase catalog or as a workflow alias.", + "scores": { + "contentDepth": 1, + "proceduralSpecificity": 2, + "contextContract": 2, + "outputContract": 2, + "roleSkillLinkage": 2, + "gateEscalation": 1, + "codexFit": 5, + "testability": 2 + }, + "ownerPath": "src/workflow-catalog.ts", + "testPath": "tests/workflow-catalog.test.ts", + "status": "todo" + }, + { + "sourceType": "workflow-step", + "sourceId": "asset-audit", + "sourcePath": ".claude/docs/workflow-catalog.yaml", + "sourceHash": "1c5a5725575c4887bc1bb7042a80a9842f52c0771978888ee1503a1c84791ede", + "cgsTarget": { + "kind": "workflow", + "id": "asset-audit", + "path": "src/workflow-catalog.ts" + }, + "decision": "adopt", + "rationale": "CCGS catalog step is missing and should be represented in the CGS phase catalog or as a workflow alias.", + "scores": { + "contentDepth": 1, + "proceduralSpecificity": 2, + "contextContract": 2, + "outputContract": 2, + "roleSkillLinkage": 2, + "gateEscalation": 1, + "codexFit": 5, + "testability": 4 + }, + "ownerPath": "src/workflow-catalog.ts", + "testPath": "tests/workflow-catalog.test.ts", + "status": "todo" + }, + { + "sourceType": "workflow-step", + "sourceId": "playtest-polish", + "sourcePath": ".claude/docs/workflow-catalog.yaml", + "sourceHash": "1c5a5725575c4887bc1bb7042a80a9842f52c0771978888ee1503a1c84791ede", + "cgsTarget": { + "kind": "workflow", + "id": "playtest-polish", + "path": "src/workflow-catalog.ts" + }, + "decision": "adopt", + "rationale": "CCGS catalog step is missing and should be represented in the CGS phase catalog or as a workflow alias.", + "scores": { + "contentDepth": 2, + "proceduralSpecificity": 2, + "contextContract": 2, + "outputContract": 2, + "roleSkillLinkage": 2, + "gateEscalation": 1, + "codexFit": 5, + "testability": 4 + }, + "ownerPath": "src/workflow-catalog.ts", + "testPath": "tests/workflow-catalog.test.ts", + "status": "todo" + }, + { + "sourceType": "workflow-step", + "sourceId": "team-polish", + "sourcePath": ".claude/docs/workflow-catalog.yaml", + "sourceHash": "1c5a5725575c4887bc1bb7042a80a9842f52c0771978888ee1503a1c84791ede", + "cgsTarget": { + "kind": "workflow", + "id": "team-polish", + "path": "src/workflow-catalog.ts" + }, + "decision": "adopt", + "rationale": "CCGS catalog step is missing and should be represented in the CGS phase catalog or as a workflow alias.", + "scores": { + "contentDepth": 1, + "proceduralSpecificity": 2, + "contextContract": 2, + "outputContract": 2, + "roleSkillLinkage": 2, + "gateEscalation": 1, + "codexFit": 5, + "testability": 2 + }, + "ownerPath": "src/workflow-catalog.ts", + "testPath": "tests/workflow-catalog.test.ts", + "status": "todo" + }, + { + "sourceType": "workflow-step", + "sourceId": "release-checklist", + "sourcePath": ".claude/docs/workflow-catalog.yaml", + "sourceHash": "1c5a5725575c4887bc1bb7042a80a9842f52c0771978888ee1503a1c84791ede", + "cgsTarget": { + "kind": "workflow", + "id": "release-checklist", + "path": "src/workflows.ts", + "hash": "d24e9fe94d91322e4dad0ef0b446071aee46c97be35f1a6931b762a74c7e9e98" + }, + "decision": "adapt", + "rationale": "Workflow exists; add CCGS-style phase/artifact semantics where useful.", + "scores": { + "contentDepth": 1, + "proceduralSpecificity": 2, + "contextContract": 2, + "outputContract": 2, + "roleSkillLinkage": 2, + "gateEscalation": 1, + "codexFit": 5, + "testability": 4 + }, + "ownerPath": "src/workflows.ts", + "testPath": "tests/workflow-recipes.test.ts", + "status": "implemented" + }, + { + "sourceType": "workflow-step", + "sourceId": "patch-notes", + "sourcePath": ".claude/docs/workflow-catalog.yaml", + "sourceHash": "1c5a5725575c4887bc1bb7042a80a9842f52c0771978888ee1503a1c84791ede", + "cgsTarget": { + "kind": "workflow", + "id": "patch-notes", + "path": "src/workflow-catalog.ts" + }, + "decision": "adopt", + "rationale": "CCGS catalog step is missing and should be represented in the CGS phase catalog or as a workflow alias.", + "scores": { + "contentDepth": 1, + "proceduralSpecificity": 2, + "contextContract": 2, + "outputContract": 2, + "roleSkillLinkage": 2, + "gateEscalation": 1, + "codexFit": 5, + "testability": 2 + }, + "ownerPath": "src/workflow-catalog.ts", + "testPath": "tests/workflow-catalog.test.ts", + "status": "todo" + }, + { + "sourceType": "workflow-step", + "sourceId": "changelog", + "sourcePath": ".claude/docs/workflow-catalog.yaml", + "sourceHash": "1c5a5725575c4887bc1bb7042a80a9842f52c0771978888ee1503a1c84791ede", + "cgsTarget": { + "kind": "workflow", + "id": "changelog", + "path": "src/workflow-catalog.ts" + }, + "decision": "adopt", + "rationale": "CCGS catalog step is missing and should be represented in the CGS phase catalog or as a workflow alias.", + "scores": { + "contentDepth": 1, + "proceduralSpecificity": 2, + "contextContract": 2, + "outputContract": 2, + "roleSkillLinkage": 2, + "gateEscalation": 1, + "codexFit": 5, + "testability": 2 + }, + "ownerPath": "src/workflow-catalog.ts", + "testPath": "tests/workflow-catalog.test.ts", + "status": "todo" + }, + { + "sourceType": "workflow-step", + "sourceId": "launch-checklist", + "sourcePath": ".claude/docs/workflow-catalog.yaml", + "sourceHash": "1c5a5725575c4887bc1bb7042a80a9842f52c0771978888ee1503a1c84791ede", + "cgsTarget": { + "kind": "workflow", + "id": "launch-checklist", + "path": "src/workflow-catalog.ts" + }, + "decision": "adopt", + "rationale": "CCGS catalog step is missing and should be represented in the CGS phase catalog or as a workflow alias.", + "scores": { + "contentDepth": 1, + "proceduralSpecificity": 2, + "contextContract": 2, + "outputContract": 2, + "roleSkillLinkage": 2, + "gateEscalation": 3, + "codexFit": 5, + "testability": 2 + }, + "ownerPath": "src/workflow-catalog.ts", + "testPath": "tests/workflow-catalog.test.ts", + "status": "todo" + }, + { + "sourceType": "template", + "sourceId": "accessibility-requirements", + "sourcePath": ".claude/docs/templates/accessibility-requirements.md", + "sourceHash": "851a7cfd354f539de368fdc7063c61399a3d0a6a43ae6ee5a7215874c905a2e1", + "cgsTarget": { + "kind": "template", + "id": "accessibility-requirements", + "path": "templates/" + }, + "decision": "adapt", + "rationale": "Template equivalent exists; compare body quality and update if thinner.", + "scores": { + "contentDepth": 5, + "proceduralSpecificity": 4, + "contextContract": 3, + "outputContract": 3, + "roleSkillLinkage": 2, + "gateEscalation": 3, + "codexFit": 5, + "testability": 4 + }, + "ownerPath": "templates/", + "testPath": "tests/agents-templates.test.ts", + "status": "implemented" + }, + { + "sourceType": "template", + "sourceId": "architecture-decision-record", + "sourcePath": ".claude/docs/templates/architecture-decision-record.md", + "sourceHash": "a73f51a1d24a579e0c3ccf49fa916a9d1ab73f2b53286d9d134a1887e5794888", + "cgsTarget": { + "kind": "template", + "id": "architecture-decision-record", + "path": "templates/" + }, + "decision": "adopt", + "rationale": "CCGS template has no CGS equivalent yet.", + "scores": { + "contentDepth": 5, + "proceduralSpecificity": 4, + "contextContract": 2, + "outputContract": 3, + "roleSkillLinkage": 2, + "gateEscalation": 3, + "codexFit": 5, + "testability": 4 + }, + "ownerPath": "templates/", + "testPath": "tests/agents-templates.test.ts", + "status": "todo" + }, + { + "sourceType": "template", + "sourceId": "architecture-doc-from-code", + "sourcePath": ".claude/docs/templates/architecture-doc-from-code.md", + "sourceHash": "120a052b06f0f687fd3e5d2fb9fbe796cae81626dd0d6bcfc3fd341f67abf982", + "cgsTarget": { + "kind": "template", + "id": "architecture-doc-from-code", + "path": "templates/" + }, + "decision": "adopt", + "rationale": "CCGS template has no CGS equivalent yet.", + "scores": { + "contentDepth": 5, + "proceduralSpecificity": 4, + "contextContract": 2, + "outputContract": 3, + "roleSkillLinkage": 2, + "gateEscalation": 1, + "codexFit": 3, + "testability": 4 + }, + "ownerPath": "templates/", + "testPath": "tests/agents-templates.test.ts", + "status": "todo" + }, + { + "sourceType": "template", + "sourceId": "architecture-traceability", + "sourcePath": ".claude/docs/templates/architecture-traceability.md", + "sourceHash": "a5d5ecea2290ccad676dac49bc33e6f5e3a1f6b1f5e288d560a41c755f6ea4eb", + "cgsTarget": { + "kind": "template", + "id": "architecture-traceability", + "path": "templates/" + }, + "decision": "adapt", + "rationale": "Template equivalent exists; compare body quality and update if thinner.", + "scores": { + "contentDepth": 4, + "proceduralSpecificity": 4, + "contextContract": 2, + "outputContract": 3, + "roleSkillLinkage": 2, + "gateEscalation": 3, + "codexFit": 5, + "testability": 2 + }, + "ownerPath": "templates/", + "testPath": "tests/agents-templates.test.ts", + "status": "implemented" + }, + { + "sourceType": "template", + "sourceId": "art-bible", + "sourcePath": ".claude/docs/templates/art-bible.md", + "sourceHash": "763d85c3ce5cb297c73603ac48718e4a73bf01b908d2e283693d8f678e71edd6", + "cgsTarget": { + "kind": "template", + "id": "art-bible", + "path": "templates/" + }, + "decision": "adapt", + "rationale": "Template equivalent exists; compare body quality and update if thinner.", + "scores": { + "contentDepth": 3, + "proceduralSpecificity": 4, + "contextContract": 2, + "outputContract": 3, + "roleSkillLinkage": 2, + "gateEscalation": 1, + "codexFit": 5, + "testability": 2 + }, + "ownerPath": "templates/", + "testPath": "tests/agents-templates.test.ts", + "status": "implemented" + }, + { + "sourceType": "template", + "sourceId": "changelog-template", + "sourcePath": ".claude/docs/templates/changelog-template.md", + "sourceHash": "cb4dad3cbc41b1501babe53cc9f00be1311aed39f3ea19f57d77ecc0bb9314b1", + "cgsTarget": { + "kind": "template", + "id": "changelog-template", + "path": "templates/" + }, + "decision": "adopt", + "rationale": "CCGS template has no CGS equivalent yet.", + "scores": { + "contentDepth": 3, + "proceduralSpecificity": 4, + "contextContract": 2, + "outputContract": 3, + "roleSkillLinkage": 2, + "gateEscalation": 1, + "codexFit": 5, + "testability": 2 + }, + "ownerPath": "templates/", + "testPath": "tests/agents-templates.test.ts", + "status": "todo" + }, + { + "sourceType": "template", + "sourceId": "design-agent-protocol", + "sourcePath": ".claude/docs/templates/collaborative-protocols/design-agent-protocol.md", + "sourceHash": "c5c778e3d9ecb80d224944510c67be99861f9f96b4ac07f6660d06e6e0a971e4", + "cgsTarget": { + "kind": "template", + "id": "design-agent-protocol", + "path": "templates/" + }, + "decision": "adopt", + "rationale": "CCGS template has no CGS equivalent yet.", + "scores": { + "contentDepth": 5, + "proceduralSpecificity": 4, + "contextContract": 2, + "outputContract": 3, + "roleSkillLinkage": 2, + "gateEscalation": 1, + "codexFit": 3, + "testability": 4 + }, + "ownerPath": "templates/", + "testPath": "tests/agents-templates.test.ts", + "status": "todo" + }, + { + "sourceType": "template", + "sourceId": "implementation-agent-protocol", + "sourcePath": ".claude/docs/templates/collaborative-protocols/implementation-agent-protocol.md", + "sourceHash": "b20603859a855f1db31ae09c2a9967d27aa4dd0f4b2fc87b673698e837dd9b54", + "cgsTarget": { + "kind": "template", + "id": "implementation-agent-protocol", + "path": "templates/" + }, + "decision": "adopt", + "rationale": "CCGS template has no CGS equivalent yet.", + "scores": { + "contentDepth": 5, + "proceduralSpecificity": 4, + "contextContract": 3, + "outputContract": 3, + "roleSkillLinkage": 2, + "gateEscalation": 1, + "codexFit": 3, + "testability": 4 + }, + "ownerPath": "templates/", + "testPath": "tests/agents-templates.test.ts", + "status": "todo" + }, + { + "sourceType": "template", + "sourceId": "leadership-agent-protocol", + "sourcePath": ".claude/docs/templates/collaborative-protocols/leadership-agent-protocol.md", + "sourceHash": "e1fbc30461f18c4ff5f018cdaf04dc868c47e4aa54da79a26885aaba7081e57b", + "cgsTarget": { + "kind": "template", + "id": "leadership-agent-protocol", + "path": "templates/" + }, + "decision": "adopt", + "rationale": "CCGS template has no CGS equivalent yet.", + "scores": { + "contentDepth": 5, + "proceduralSpecificity": 4, + "contextContract": 3, + "outputContract": 3, + "roleSkillLinkage": 2, + "gateEscalation": 1, + "codexFit": 3, + "testability": 4 + }, + "ownerPath": "templates/", + "testPath": "tests/agents-templates.test.ts", + "status": "todo" + }, + { + "sourceType": "template", + "sourceId": "concept-doc-from-prototype", + "sourcePath": ".claude/docs/templates/concept-doc-from-prototype.md", + "sourceHash": "f42d764e92891b1f98774a1501a5368c7fcf46b1c4ad4e87757ef2101633f135", + "cgsTarget": { + "kind": "template", + "id": "concept-doc-from-prototype", + "path": "templates/" + }, + "decision": "adopt", + "rationale": "CCGS template has no CGS equivalent yet.", + "scores": { + "contentDepth": 5, + "proceduralSpecificity": 4, + "contextContract": 3, + "outputContract": 3, + "roleSkillLinkage": 2, + "gateEscalation": 3, + "codexFit": 3, + "testability": 4 + }, + "ownerPath": "templates/", + "testPath": "tests/agents-templates.test.ts", + "status": "todo" + }, + { + "sourceType": "template", + "sourceId": "design-doc-from-implementation", + "sourcePath": ".claude/docs/templates/design-doc-from-implementation.md", + "sourceHash": "4c93e09ef73f0e5dec142eb442537f1deee2960c56890d2163a7ab4c516c0501", + "cgsTarget": { + "kind": "template", + "id": "design-doc-from-implementation", + "path": "templates/" + }, + "decision": "adopt", + "rationale": "CCGS template has no CGS equivalent yet.", + "scores": { + "contentDepth": 5, + "proceduralSpecificity": 4, + "contextContract": 2, + "outputContract": 3, + "roleSkillLinkage": 2, + "gateEscalation": 1, + "codexFit": 3, + "testability": 4 + }, + "ownerPath": "templates/", + "testPath": "tests/agents-templates.test.ts", + "status": "todo" + }, + { + "sourceType": "template", + "sourceId": "difficulty-curve", + "sourcePath": ".claude/docs/templates/difficulty-curve.md", + "sourceHash": "3aeaa80aa5152065bb5dd641838d98efcb9ec651293a4831e32a0c823199ab18", + "cgsTarget": { + "kind": "template", + "id": "difficulty-curve", + "path": "templates/" + }, + "decision": "adapt", + "rationale": "Template equivalent exists; compare body quality and update if thinner.", + "scores": { + "contentDepth": 5, + "proceduralSpecificity": 4, + "contextContract": 2, + "outputContract": 3, + "roleSkillLinkage": 2, + "gateEscalation": 3, + "codexFit": 5, + "testability": 4 + }, + "ownerPath": "templates/", + "testPath": "tests/agents-templates.test.ts", + "status": "implemented" + }, + { + "sourceType": "template", + "sourceId": "economy-model", + "sourcePath": ".claude/docs/templates/economy-model.md", + "sourceHash": "22af6a9df657a17e8155a6130d04a8ce04c095e5dcb7ad5c2648449013b35a58", + "cgsTarget": { + "kind": "template", + "id": "economy-model", + "path": "templates/" + }, + "decision": "adapt", + "rationale": "Template equivalent exists; compare body quality and update if thinner.", + "scores": { + "contentDepth": 4, + "proceduralSpecificity": 4, + "contextContract": 2, + "outputContract": 3, + "roleSkillLinkage": 2, + "gateEscalation": 1, + "codexFit": 5, + "testability": 2 + }, + "ownerPath": "templates/", + "testPath": "tests/agents-templates.test.ts", + "status": "implemented" + }, + { + "sourceType": "template", + "sourceId": "faction-design", + "sourcePath": ".claude/docs/templates/faction-design.md", + "sourceHash": "abe1d5720e68169e349156bbcb42db135ecca25bf1510dda5ddd1deb3980f257", + "cgsTarget": { + "kind": "template", + "id": "faction-design", + "path": "templates/" + }, + "decision": "adopt", + "rationale": "CCGS template has no CGS equivalent yet.", + "scores": { + "contentDepth": 4, + "proceduralSpecificity": 4, + "contextContract": 2, + "outputContract": 3, + "roleSkillLinkage": 2, + "gateEscalation": 1, + "codexFit": 5, + "testability": 2 + }, + "ownerPath": "templates/", + "testPath": "tests/agents-templates.test.ts", + "status": "todo" + }, + { + "sourceType": "template", + "sourceId": "game-concept", + "sourcePath": ".claude/docs/templates/game-concept.md", + "sourceHash": "fa94f05c71decac7183be449c87767acd99db822f05701121f45f5a5e2251156", + "cgsTarget": { + "kind": "template", + "id": "game-concept", + "path": "templates/" + }, + "decision": "adopt", + "rationale": "CCGS template has no CGS equivalent yet.", + "scores": { + "contentDepth": 5, + "proceduralSpecificity": 4, + "contextContract": 2, + "outputContract": 3, + "roleSkillLinkage": 2, + "gateEscalation": 1, + "codexFit": 3, + "testability": 4 + }, + "ownerPath": "templates/", + "testPath": "tests/agents-templates.test.ts", + "status": "todo" + }, + { + "sourceType": "template", + "sourceId": "game-design-document", + "sourcePath": ".claude/docs/templates/game-design-document.md", + "sourceHash": "c7a3665d1a47d25c4224bb9d19dc15a0e609594d8ed8841347822fd9d1b0aaec", + "cgsTarget": { + "kind": "template", + "id": "game-design-document", + "path": "templates/" + }, + "decision": "adopt", + "rationale": "CCGS template has no CGS equivalent yet.", + "scores": { + "contentDepth": 5, + "proceduralSpecificity": 4, + "contextContract": 2, + "outputContract": 3, + "roleSkillLinkage": 2, + "gateEscalation": 3, + "codexFit": 5, + "testability": 4 + }, + "ownerPath": "templates/", + "testPath": "tests/agents-templates.test.ts", + "status": "todo" + }, + { + "sourceType": "template", + "sourceId": "game-pillars", + "sourcePath": ".claude/docs/templates/game-pillars.md", + "sourceHash": "3603610be7704cdee1c421813cd248ce07a410969dc3416aa2b9e4959801d3c8", + "cgsTarget": { + "kind": "template", + "id": "game-pillars", + "path": "templates/" + }, + "decision": "adopt", + "rationale": "CCGS template has no CGS equivalent yet.", + "scores": { + "contentDepth": 5, + "proceduralSpecificity": 4, + "contextContract": 2, + "outputContract": 3, + "roleSkillLinkage": 2, + "gateEscalation": 3, + "codexFit": 5, + "testability": 4 + }, + "ownerPath": "templates/", + "testPath": "tests/agents-templates.test.ts", + "status": "todo" + }, + { + "sourceType": "template", + "sourceId": "hud-design", + "sourcePath": ".claude/docs/templates/hud-design.md", + "sourceHash": "7759c0311047baaad28db5610e4a754f585928801a8e30845b34f1204f229385", + "cgsTarget": { + "kind": "template", + "id": "hud-design", + "path": "templates/" + }, + "decision": "adopt", + "rationale": "CCGS template has no CGS equivalent yet.", + "scores": { + "contentDepth": 5, + "proceduralSpecificity": 4, + "contextContract": 3, + "outputContract": 3, + "roleSkillLinkage": 2, + "gateEscalation": 3, + "codexFit": 5, + "testability": 4 + }, + "ownerPath": "templates/", + "testPath": "tests/agents-templates.test.ts", + "status": "todo" + }, + { + "sourceType": "template", + "sourceId": "incident-response", + "sourcePath": ".claude/docs/templates/incident-response.md", + "sourceHash": "8ba68a9ac8a1f404c5fd785b2a3c9287ed52873bb7acf028e6eef1bb6f9dab4c", + "cgsTarget": { + "kind": "template", + "id": "incident-response", + "path": "templates/" + }, + "decision": "adopt", + "rationale": "CCGS template has no CGS equivalent yet.", + "scores": { + "contentDepth": 4, + "proceduralSpecificity": 4, + "contextContract": 2, + "outputContract": 3, + "roleSkillLinkage": 2, + "gateEscalation": 3, + "codexFit": 5, + "testability": 4 + }, + "ownerPath": "templates/", + "testPath": "tests/agents-templates.test.ts", + "status": "todo" + }, + { + "sourceType": "template", + "sourceId": "interaction-pattern-library", + "sourcePath": ".claude/docs/templates/interaction-pattern-library.md", + "sourceHash": "3eaace0e01737a9c248a331393cb618e3ae35aedcae86d0937d216d2daccd7ac", + "cgsTarget": { + "kind": "template", + "id": "interaction-pattern-library", + "path": "templates/" + }, + "decision": "adopt", + "rationale": "CCGS template has no CGS equivalent yet.", + "scores": { + "contentDepth": 5, + "proceduralSpecificity": 4, + "contextContract": 2, + "outputContract": 3, + "roleSkillLinkage": 2, + "gateEscalation": 3, + "codexFit": 5, + "testability": 4 + }, + "ownerPath": "templates/", + "testPath": "tests/agents-templates.test.ts", + "status": "todo" + }, + { + "sourceType": "template", + "sourceId": "level-design-document", + "sourcePath": ".claude/docs/templates/level-design-document.md", + "sourceHash": "61b48448c070490ebb0bb5214cfbfa3a926683f687dc1f74c83d310dc063aacb", + "cgsTarget": { + "kind": "template", + "id": "level-design-document", + "path": "templates/" + }, + "decision": "adopt", + "rationale": "CCGS template has no CGS equivalent yet.", + "scores": { + "contentDepth": 4, + "proceduralSpecificity": 4, + "contextContract": 2, + "outputContract": 3, + "roleSkillLinkage": 2, + "gateEscalation": 1, + "codexFit": 5, + "testability": 2 + }, + "ownerPath": "templates/", + "testPath": "tests/agents-templates.test.ts", + "status": "todo" + }, + { + "sourceType": "template", + "sourceId": "milestone-definition", + "sourcePath": ".claude/docs/templates/milestone-definition.md", + "sourceHash": "ecdef4e53c02ea9ee954ae0124291fcd9bd3627ef6a444a4fc7878587a101251", + "cgsTarget": { + "kind": "template", + "id": "milestone-definition", + "path": "templates/" + }, + "decision": "adopt", + "rationale": "CCGS template has no CGS equivalent yet.", + "scores": { + "contentDepth": 3, + "proceduralSpecificity": 4, + "contextContract": 2, + "outputContract": 3, + "roleSkillLinkage": 2, + "gateEscalation": 3, + "codexFit": 5, + "testability": 4 + }, + "ownerPath": "templates/", + "testPath": "tests/agents-templates.test.ts", + "status": "todo" + }, + { + "sourceType": "template", + "sourceId": "narrative-character-sheet", + "sourcePath": ".claude/docs/templates/narrative-character-sheet.md", + "sourceHash": "b40bb1cb386727a9c506cbbd76f037990e4461315554e0f78f896f0195cc79e2", + "cgsTarget": { + "kind": "template", + "id": "narrative-character-sheet", + "path": "templates/" + }, + "decision": "adopt", + "rationale": "CCGS template has no CGS equivalent yet.", + "scores": { + "contentDepth": 4, + "proceduralSpecificity": 4, + "contextContract": 2, + "outputContract": 3, + "roleSkillLinkage": 2, + "gateEscalation": 3, + "codexFit": 5, + "testability": 2 + }, + "ownerPath": "templates/", + "testPath": "tests/agents-templates.test.ts", + "status": "todo" + }, + { + "sourceType": "template", + "sourceId": "pitch-document", + "sourcePath": ".claude/docs/templates/pitch-document.md", + "sourceHash": "ed0a544b18032bad4c9dcbe9a79b1154f943e1c5df210d308976f590eb8889b6", + "cgsTarget": { + "kind": "template", + "id": "pitch-document", + "path": "templates/" + }, + "decision": "adapt", + "rationale": "Template equivalent exists; compare body quality and update if thinner.", + "scores": { + "contentDepth": 4, + "proceduralSpecificity": 4, + "contextContract": 2, + "outputContract": 3, + "roleSkillLinkage": 2, + "gateEscalation": 1, + "codexFit": 5, + "testability": 2 + }, + "ownerPath": "templates/", + "testPath": "tests/agents-templates.test.ts", + "status": "implemented" + }, + { + "sourceType": "template", + "sourceId": "player-journey", + "sourcePath": ".claude/docs/templates/player-journey.md", + "sourceHash": "786d45beef8e3e9444dfa0f22904ec3d09f4fad433c015a509b206f4d1be3324", + "cgsTarget": { + "kind": "template", + "id": "player-journey", + "path": "templates/" + }, + "decision": "adapt", + "rationale": "Template equivalent exists; compare body quality and update if thinner.", + "scores": { + "contentDepth": 5, + "proceduralSpecificity": 5, + "contextContract": 2, + "outputContract": 3, + "roleSkillLinkage": 2, + "gateEscalation": 3, + "codexFit": 3, + "testability": 4 + }, + "ownerPath": "templates/", + "testPath": "tests/agents-templates.test.ts", + "status": "implemented" + }, + { + "sourceType": "template", + "sourceId": "post-mortem", + "sourcePath": ".claude/docs/templates/post-mortem.md", + "sourceHash": "e7e2ea73be4295761c2a355ab542be620d5b947ca5749ad8efd43abdd9c16390", + "cgsTarget": { + "kind": "template", + "id": "post-mortem", + "path": "templates/" + }, + "decision": "adopt", + "rationale": "CCGS template has no CGS equivalent yet.", + "scores": { + "contentDepth": 3, + "proceduralSpecificity": 4, + "contextContract": 2, + "outputContract": 3, + "roleSkillLinkage": 2, + "gateEscalation": 1, + "codexFit": 5, + "testability": 2 + }, + "ownerPath": "templates/", + "testPath": "tests/agents-templates.test.ts", + "status": "todo" + }, + { + "sourceType": "template", + "sourceId": "project-stage-report", + "sourcePath": ".claude/docs/templates/project-stage-report.md", + "sourceHash": "b78afb205a473f5ab30e6c0c0d4db20a1be907d4d3d38b72ed19a5dc73c8ba8e", + "cgsTarget": { + "kind": "template", + "id": "project-stage-report", + "path": "templates/" + }, + "decision": "adopt", + "rationale": "CCGS template has no CGS equivalent yet.", + "scores": { + "contentDepth": 5, + "proceduralSpecificity": 4, + "contextContract": 2, + "outputContract": 3, + "roleSkillLinkage": 2, + "gateEscalation": 3, + "codexFit": 5, + "testability": 4 + }, + "ownerPath": "templates/", + "testPath": "tests/agents-templates.test.ts", + "status": "todo" + }, + { + "sourceType": "template", + "sourceId": "prototype-report", + "sourcePath": ".claude/docs/templates/prototype-report.md", + "sourceHash": "1a3ec0d7713cc5980594a911e68b6ae5edd890122ac7a0bcf84b14993c315e8d", + "cgsTarget": { + "kind": "template", + "id": "prototype-report", + "path": "templates/" + }, + "decision": "adopt", + "rationale": "CCGS template has no CGS equivalent yet.", + "scores": { + "contentDepth": 4, + "proceduralSpecificity": 4, + "contextContract": 2, + "outputContract": 3, + "roleSkillLinkage": 2, + "gateEscalation": 3, + "codexFit": 5, + "testability": 4 + }, + "ownerPath": "templates/", + "testPath": "tests/agents-templates.test.ts", + "status": "todo" + }, + { + "sourceType": "template", + "sourceId": "release-checklist-template", + "sourcePath": ".claude/docs/templates/release-checklist-template.md", + "sourceHash": "7886ea10821a99cfde3e7b3e3d3688fbc475f39701b79481ec4d5f5466eed11e", + "cgsTarget": { + "kind": "template", + "id": "release-checklist-template", + "path": "templates/" + }, + "decision": "adopt", + "rationale": "CCGS template has no CGS equivalent yet.", + "scores": { + "contentDepth": 4, + "proceduralSpecificity": 4, + "contextContract": 3, + "outputContract": 3, + "roleSkillLinkage": 2, + "gateEscalation": 3, + "codexFit": 5, + "testability": 4 + }, + "ownerPath": "templates/", + "testPath": "tests/agents-templates.test.ts", + "status": "todo" + }, + { + "sourceType": "template", + "sourceId": "release-notes", + "sourcePath": ".claude/docs/templates/release-notes.md", + "sourceHash": "0d3ea9d50eb6a2dd57a042f656fc8fc8918522c6ec9b19d6cd48d36f4b390ecb", + "cgsTarget": { + "kind": "template", + "id": "release-notes", + "path": "templates/" + }, + "decision": "adapt", + "rationale": "Template equivalent exists; compare body quality and update if thinner.", + "scores": { + "contentDepth": 3, + "proceduralSpecificity": 4, + "contextContract": 2, + "outputContract": 3, + "roleSkillLinkage": 2, + "gateEscalation": 1, + "codexFit": 5, + "testability": 2 + }, + "ownerPath": "templates/", + "testPath": "tests/agents-templates.test.ts", + "status": "implemented" + }, + { + "sourceType": "template", + "sourceId": "risk-register-entry", + "sourcePath": ".claude/docs/templates/risk-register-entry.md", + "sourceHash": "0d4460ea5b5a3b2a87506fab8db2344efbffb9cf39b4ece285025038f9e0ff34", + "cgsTarget": { + "kind": "template", + "id": "risk-register-entry", + "path": "templates/" + }, + "decision": "adopt", + "rationale": "CCGS template has no CGS equivalent yet.", + "scores": { + "contentDepth": 3, + "proceduralSpecificity": 4, + "contextContract": 2, + "outputContract": 3, + "roleSkillLinkage": 2, + "gateEscalation": 1, + "codexFit": 5, + "testability": 2 + }, + "ownerPath": "templates/", + "testPath": "tests/agents-templates.test.ts", + "status": "todo" + }, + { + "sourceType": "template", + "sourceId": "skill-test-spec", + "sourcePath": ".claude/docs/templates/skill-test-spec.md", + "sourceHash": "4cd9f3f76bc5193e19589a7217fe3bc749626b2297a2274a60890628a07acc3d", + "cgsTarget": { + "kind": "template", + "id": "skill-test-spec", + "path": "templates/" + }, + "decision": "adopt", + "rationale": "CCGS template has no CGS equivalent yet.", + "scores": { + "contentDepth": 4, + "proceduralSpecificity": 4, + "contextContract": 2, + "outputContract": 3, + "roleSkillLinkage": 2, + "gateEscalation": 3, + "codexFit": 5, + "testability": 4 + }, + "ownerPath": "templates/", + "testPath": "tests/agents-templates.test.ts", + "status": "todo" + }, + { + "sourceType": "template", + "sourceId": "sound-bible", + "sourcePath": ".claude/docs/templates/sound-bible.md", + "sourceHash": "9e1e63cbcc751113702d33a2134e05032994cd84a9a70acdf09909ec77f9b087", + "cgsTarget": { + "kind": "template", + "id": "sound-bible", + "path": "templates/" + }, + "decision": "adapt", + "rationale": "Template equivalent exists; compare body quality and update if thinner.", + "scores": { + "contentDepth": 5, + "proceduralSpecificity": 4, + "contextContract": 2, + "outputContract": 3, + "roleSkillLinkage": 2, + "gateEscalation": 1, + "codexFit": 5, + "testability": 2 + }, + "ownerPath": "templates/", + "testPath": "tests/agents-templates.test.ts", + "status": "implemented" + }, + { + "sourceType": "template", + "sourceId": "sprint-plan", + "sourcePath": ".claude/docs/templates/sprint-plan.md", + "sourceHash": "4e5f640fe11ba5467e457f248fbf2e4d53f45a62a75ccf123e554c701042950f", + "cgsTarget": { + "kind": "template", + "id": "sprint-plan", + "path": "templates/" + }, + "decision": "adapt", + "rationale": "Template equivalent exists; compare body quality and update if thinner.", + "scores": { + "contentDepth": 3, + "proceduralSpecificity": 4, + "contextContract": 2, + "outputContract": 3, + "roleSkillLinkage": 2, + "gateEscalation": 1, + "codexFit": 5, + "testability": 4 + }, + "ownerPath": "templates/", + "testPath": "tests/agents-templates.test.ts", + "status": "implemented" + }, + { + "sourceType": "template", + "sourceId": "systems-index", + "sourcePath": ".claude/docs/templates/systems-index.md", + "sourceHash": "3c474f75f71d12c3175b7be58013f58f615f316ba8fa8533ebb94197c85634c1", + "cgsTarget": { + "kind": "template", + "id": "systems-index", + "path": "templates/" + }, + "decision": "adopt", + "rationale": "CCGS template has no CGS equivalent yet.", + "scores": { + "contentDepth": 5, + "proceduralSpecificity": 4, + "contextContract": 2, + "outputContract": 3, + "roleSkillLinkage": 2, + "gateEscalation": 3, + "codexFit": 5, + "testability": 4 + }, + "ownerPath": "templates/", + "testPath": "tests/agents-templates.test.ts", + "status": "todo" + }, + { + "sourceType": "template", + "sourceId": "technical-design-document", + "sourcePath": ".claude/docs/templates/technical-design-document.md", + "sourceHash": "252a276128b70c61619ad86f8b7e3eed9dbe859fd3c4873f184b0ae3ca3f5d5c", + "cgsTarget": { + "kind": "template", + "id": "technical-design-document", + "path": "templates/" + }, + "decision": "adopt", + "rationale": "CCGS template has no CGS equivalent yet.", + "scores": { + "contentDepth": 4, + "proceduralSpecificity": 4, + "contextContract": 2, + "outputContract": 3, + "roleSkillLinkage": 2, + "gateEscalation": 1, + "codexFit": 5, + "testability": 4 + }, + "ownerPath": "templates/", + "testPath": "tests/agents-templates.test.ts", + "status": "todo" + }, + { + "sourceType": "template", + "sourceId": "test-evidence", + "sourcePath": ".claude/docs/templates/test-evidence.md", + "sourceHash": "a6c857d42f29ea3f3264cc2cef66063b62d57b9a4ef87e4af7c08e98547b7a72", + "cgsTarget": { + "kind": "template", + "id": "test-evidence", + "path": "templates/" + }, + "decision": "adapt", + "rationale": "Template equivalent exists; compare body quality and update if thinner.", + "scores": { + "contentDepth": 4, + "proceduralSpecificity": 4, + "contextContract": 2, + "outputContract": 3, + "roleSkillLinkage": 2, + "gateEscalation": 1, + "codexFit": 3, + "testability": 4 + }, + "ownerPath": "templates/", + "testPath": "tests/agents-templates.test.ts", + "status": "implemented" + }, + { + "sourceType": "template", + "sourceId": "test-plan", + "sourcePath": ".claude/docs/templates/test-plan.md", + "sourceHash": "56e330553c0d7d32f807d9174947ad55ee174eb3f1fabc2d7d5529f1bfdc4377", + "cgsTarget": { + "kind": "template", + "id": "test-plan", + "path": "templates/" + }, + "decision": "adapt", + "rationale": "Template equivalent exists; compare body quality and update if thinner.", + "scores": { + "contentDepth": 4, + "proceduralSpecificity": 4, + "contextContract": 2, + "outputContract": 3, + "roleSkillLinkage": 2, + "gateEscalation": 1, + "codexFit": 3, + "testability": 4 + }, + "ownerPath": "templates/", + "testPath": "tests/agents-templates.test.ts", + "status": "implemented" + }, + { + "sourceType": "template", + "sourceId": "ux-spec", + "sourcePath": ".claude/docs/templates/ux-spec.md", + "sourceHash": "aae493abbe971f9d4bd4631520a87f917467347f93f0817fdb76caebe63a7bcc", + "cgsTarget": { + "kind": "template", + "id": "ux-spec", + "path": "templates/" + }, + "decision": "adapt", + "rationale": "Template equivalent exists; compare body quality and update if thinner.", + "scores": { + "contentDepth": 5, + "proceduralSpecificity": 4, + "contextContract": 2, + "outputContract": 3, + "roleSkillLinkage": 2, + "gateEscalation": 3, + "codexFit": 5, + "testability": 4 + }, + "ownerPath": "templates/", + "testPath": "tests/agents-templates.test.ts", + "status": "implemented" + }, + { + "sourceType": "template", + "sourceId": "vertical-slice-report", + "sourcePath": ".claude/docs/templates/vertical-slice-report.md", + "sourceHash": "87f8ba47dfef82301b6f81a378c29d139ffe11913088af681439b0700beab3c7", + "cgsTarget": { + "kind": "template", + "id": "vertical-slice-report", + "path": "templates/" + }, + "decision": "adapt", + "rationale": "Template equivalent exists; compare body quality and update if thinner.", + "scores": { + "contentDepth": 4, + "proceduralSpecificity": 4, + "contextContract": 2, + "outputContract": 3, + "roleSkillLinkage": 2, + "gateEscalation": 3, + "codexFit": 5, + "testability": 4 + }, + "ownerPath": "templates/", + "testPath": "tests/agents-templates.test.ts", + "status": "implemented" + }, + { + "sourceType": "rule", + "sourceId": "ai-code", + "sourcePath": ".claude/rules/ai-code.md", + "sourceHash": "0b2ed79ed959c24262ca1b7ae353a78d574019d64eca040293753e165c5adb21", + "cgsTarget": { + "kind": "rule", + "id": "ai-code", + "path": "src/skills.ts" + }, + "decision": "adapt", + "rationale": "CCGS coding rule intent should become skills, AGENTS guidance, or selected context, not `.codex/rules/*.rules`.", + "scores": { + "contentDepth": 1, + "proceduralSpecificity": 2, + "contextContract": 2, + "outputContract": 3, + "roleSkillLinkage": 2, + "gateEscalation": 1, + "codexFit": 3, + "testability": 4 + }, + "ownerPath": "src/skills.ts", + "testPath": "tests/codex-context-files.test.ts", + "status": "todo" + }, + { + "sourceType": "rule", + "sourceId": "data-files", + "sourcePath": ".claude/rules/data-files.md", + "sourceHash": "bbc65708e00a98e18278c8331fd4f69ad261a6fdc15cbbb3a96815d0800dab9d", + "cgsTarget": { + "kind": "rule", + "id": "data-files", + "path": "src/skills.ts" + }, + "decision": "adapt", + "rationale": "CCGS coding rule intent should become skills, AGENTS guidance, or selected context, not `.codex/rules/*.rules`.", + "scores": { + "contentDepth": 1, + "proceduralSpecificity": 2, + "contextContract": 2, + "outputContract": 3, + "roleSkillLinkage": 2, + "gateEscalation": 3, + "codexFit": 5, + "testability": 2 + }, + "ownerPath": "src/skills.ts", + "testPath": "tests/codex-context-files.test.ts", + "status": "todo" + }, + { + "sourceType": "rule", + "sourceId": "design-docs", + "sourcePath": ".claude/rules/design-docs.md", + "sourceHash": "8e3ea21cd637f39b2fbca4ec1d660c97e0143f1b211466c7b03cf6447a59bfb4", + "cgsTarget": { + "kind": "rule", + "id": "design-docs", + "path": "src/skills.ts" + }, + "decision": "adapt", + "rationale": "CCGS coding rule intent should become skills, AGENTS guidance, or selected context, not `.codex/rules/*.rules`.", + "scores": { + "contentDepth": 1, + "proceduralSpecificity": 2, + "contextContract": 2, + "outputContract": 3, + "roleSkillLinkage": 2, + "gateEscalation": 1, + "codexFit": 5, + "testability": 4 + }, + "ownerPath": "src/skills.ts", + "testPath": "tests/codex-context-files.test.ts", + "status": "todo" + }, + { + "sourceType": "rule", + "sourceId": "engine-code", + "sourcePath": ".claude/rules/engine-code.md", + "sourceHash": "24e3bc62c96ef2840843721d047ea375726fc57a5ba816faa0432007c23d98f7", + "cgsTarget": { + "kind": "rule", + "id": "engine-code", + "path": "src/skills.ts" + }, + "decision": "adapt", + "rationale": "CCGS coding rule intent should become skills, AGENTS guidance, or selected context, not `.codex/rules/*.rules`.", + "scores": { + "contentDepth": 1, + "proceduralSpecificity": 2, + "contextContract": 2, + "outputContract": 3, + "roleSkillLinkage": 2, + "gateEscalation": 1, + "codexFit": 5, + "testability": 4 + }, + "ownerPath": "src/skills.ts", + "testPath": "tests/codex-context-files.test.ts", + "status": "todo" + }, + { + "sourceType": "rule", + "sourceId": "gameplay-code", + "sourcePath": ".claude/rules/gameplay-code.md", + "sourceHash": "94030c94f9f39c669f9292a0e1ab57a8d6fd53d1353485202713c2465098606c", + "cgsTarget": { + "kind": "rule", + "id": "gameplay-code", + "path": "src/skills.ts" + }, + "decision": "adapt", + "rationale": "CCGS coding rule intent should become skills, AGENTS guidance, or selected context, not `.codex/rules/*.rules`.", + "scores": { + "contentDepth": 1, + "proceduralSpecificity": 2, + "contextContract": 2, + "outputContract": 3, + "roleSkillLinkage": 2, + "gateEscalation": 1, + "codexFit": 5, + "testability": 4 + }, + "ownerPath": "src/skills.ts", + "testPath": "tests/codex-context-files.test.ts", + "status": "todo" + }, + { + "sourceType": "rule", + "sourceId": "narrative", + "sourcePath": ".claude/rules/narrative.md", + "sourceHash": "be8925e4d9a6242eb7db40fd918bdc94aa6f40e498f9e3aa8d7ffe27ede4a819", + "cgsTarget": { + "kind": "rule", + "id": "narrative", + "path": "src/skills.ts" + }, + "decision": "adapt", + "rationale": "CCGS coding rule intent should become skills, AGENTS guidance, or selected context, not `.codex/rules/*.rules`.", + "scores": { + "contentDepth": 1, + "proceduralSpecificity": 2, + "contextContract": 2, + "outputContract": 3, + "roleSkillLinkage": 2, + "gateEscalation": 1, + "codexFit": 5, + "testability": 2 + }, + "ownerPath": "src/skills.ts", + "testPath": "tests/codex-context-files.test.ts", + "status": "todo" + }, + { + "sourceType": "rule", + "sourceId": "network-code", + "sourcePath": ".claude/rules/network-code.md", + "sourceHash": "e75454f6ea2e3892521ab6500865190fe74b28ce90b604e78a7d74a6c08e675e", + "cgsTarget": { + "kind": "rule", + "id": "network-code", + "path": "src/skills.ts" + }, + "decision": "adapt", + "rationale": "CCGS coding rule intent should become skills, AGENTS guidance, or selected context, not `.codex/rules/*.rules`.", + "scores": { + "contentDepth": 1, + "proceduralSpecificity": 2, + "contextContract": 2, + "outputContract": 3, + "roleSkillLinkage": 2, + "gateEscalation": 1, + "codexFit": 5, + "testability": 2 + }, + "ownerPath": "src/skills.ts", + "testPath": "tests/codex-context-files.test.ts", + "status": "todo" + }, + { + "sourceType": "rule", + "sourceId": "prototype-code", + "sourcePath": ".claude/rules/prototype-code.md", + "sourceHash": "67cf516d0febcb9829407386b4d16b773ea38cc21012fdeb03a53943cc6ed5bd", + "cgsTarget": { + "kind": "rule", + "id": "prototype-code", + "path": "src/skills.ts" + }, + "decision": "adapt", + "rationale": "CCGS coding rule intent should become skills, AGENTS guidance, or selected context, not `.codex/rules/*.rules`.", + "scores": { + "contentDepth": 2, + "proceduralSpecificity": 4, + "contextContract": 2, + "outputContract": 3, + "roleSkillLinkage": 2, + "gateEscalation": 1, + "codexFit": 5, + "testability": 4 + }, + "ownerPath": "src/skills.ts", + "testPath": "tests/codex-context-files.test.ts", + "status": "todo" + }, + { + "sourceType": "rule", + "sourceId": "shader-code", + "sourcePath": ".claude/rules/shader-code.md", + "sourceHash": "a5e08163d84fae945bc38ef9e998d03120c14bb4f8d630e9bc44514839b3ec3c", + "cgsTarget": { + "kind": "rule", + "id": "shader-code", + "path": "src/skills.ts" + }, + "decision": "adapt", + "rationale": "CCGS coding rule intent should become skills, AGENTS guidance, or selected context, not `.codex/rules/*.rules`.", + "scores": { + "contentDepth": 3, + "proceduralSpecificity": 4, + "contextContract": 2, + "outputContract": 3, + "roleSkillLinkage": 2, + "gateEscalation": 1, + "codexFit": 5, + "testability": 4 + }, + "ownerPath": "src/skills.ts", + "testPath": "tests/codex-context-files.test.ts", + "status": "todo" + }, + { + "sourceType": "rule", + "sourceId": "test-standards", + "sourcePath": ".claude/rules/test-standards.md", + "sourceHash": "78c642a6f22a815a990aca02e677d5d7f676524dff59a9a8034f1c7d69b42597", + "cgsTarget": { + "kind": "rule", + "id": "test-standards", + "path": "src/skills.ts" + }, + "decision": "adapt", + "rationale": "CCGS coding rule intent should become skills, AGENTS guidance, or selected context, not `.codex/rules/*.rules`.", + "scores": { + "contentDepth": 1, + "proceduralSpecificity": 2, + "contextContract": 2, + "outputContract": 3, + "roleSkillLinkage": 2, + "gateEscalation": 1, + "codexFit": 5, + "testability": 4 + }, + "ownerPath": "src/skills.ts", + "testPath": "tests/codex-context-files.test.ts", + "status": "todo" + }, + { + "sourceType": "rule", + "sourceId": "ui-code", + "sourcePath": ".claude/rules/ui-code.md", + "sourceHash": "be45904c33e72c717ac56ba2ee760d5a5ec1435a3b84ad4365ca513c91a7a68b", + "cgsTarget": { + "kind": "rule", + "id": "ui-code", + "path": "src/skills.ts" + }, + "decision": "adapt", + "rationale": "CCGS coding rule intent should become skills, AGENTS guidance, or selected context, not `.codex/rules/*.rules`.", + "scores": { + "contentDepth": 1, + "proceduralSpecificity": 2, + "contextContract": 2, + "outputContract": 3, + "roleSkillLinkage": 2, + "gateEscalation": 3, + "codexFit": 5, + "testability": 4 + }, + "ownerPath": "src/skills.ts", + "testPath": "tests/codex-context-files.test.ts", + "status": "todo" + } + ] +} diff --git a/references/ccgs-surface-parity-matrix.md b/references/ccgs-surface-parity-matrix.md new file mode 100644 index 0000000..6ce92c5 --- /dev/null +++ b/references/ccgs-surface-parity-matrix.md @@ -0,0 +1,244 @@ +# CCGS Surface Parity Matrix + +Reference root: `/opt/data/repos/Claude-Code-Game-Studios` + +## Counts + +- Agents: 49 +- Skills: 73 +- Workflow steps: 45 +- Templates: 40 +- Rules: 11 +- Total rows: 218 + +## Decision Summary + +- adopt: 56 +- adapt: 142 +- merge: 8 +- rename-alias: 0 +- defer: 12 +- out-of-scope: 0 + +## Rows + +| Type | Source | Decision | CGS target | Status | Rationale | +| --- | --- | --- | --- | --- | --- | +| agent | accessibility-specialist | adapt | role:accessibility-specialist | todo | Direct role exists; adapt CCGS depth into Codex role package and generated TOML. | +| agent | ai-programmer | adapt | role:ai-programmer | todo | Direct role exists; adapt CCGS depth into Codex role package and generated TOML. | +| agent | analytics-engineer | merge | role:data-scientist | implemented | CCGS role is intentionally merged into an upgraded broader CGS role package. | +| agent | art-director | merge | role:senior-game-artist | implemented | CCGS role is intentionally merged into an upgraded broader CGS role package. | +| agent | audio-director | adapt | role:audio-director | todo | Direct role exists; adapt CCGS depth into Codex role package and generated TOML. | +| agent | community-manager | adapt | role:community-manager | todo | Direct role exists; adapt CCGS depth into Codex role package and generated TOML. | +| agent | creative-director | adapt | role:creative-director | implemented | Direct role has an upgraded CCGS-depth Codex role package and generated TOML coverage. | +| agent | devops-engineer | adapt | role:devops-engineer | todo | Direct role exists; adapt CCGS depth into Codex role package and generated TOML. | +| agent | economy-designer | adapt | role:economy-designer | todo | Direct role exists; adapt CCGS depth into Codex role package and generated TOML. | +| agent | engine-programmer | adapt | role:engine-programmer | todo | Direct role exists; adapt CCGS depth into Codex role package and generated TOML. | +| agent | game-designer | adapt | role:game-designer | implemented | Direct role has an upgraded CCGS-depth Codex role package and generated TOML coverage. | +| agent | gameplay-programmer | adapt | role:gameplay-programmer | implemented | Direct role has an upgraded CCGS-depth Codex role package and generated TOML coverage. | +| agent | godot-csharp-specialist | defer | none: | todo | No matching CGS surface exists yet; audit requires explicit follow-up. | +| agent | godot-gdextension-specialist | defer | none: | todo | No matching CGS surface exists yet; audit requires explicit follow-up. | +| agent | godot-gdscript-specialist | defer | none: | todo | No matching CGS surface exists yet; audit requires explicit follow-up. | +| agent | godot-shader-specialist | defer | none: | todo | No matching CGS surface exists yet; audit requires explicit follow-up. | +| agent | godot-specialist | adapt | role:godot-specialist | todo | Direct role exists; adapt CCGS depth into Codex role package and generated TOML. | +| agent | lead-programmer | merge | role:technical-director | implemented | CCGS role is intentionally merged into an upgraded broader CGS role package. | +| agent | level-designer | adapt | role:level-designer | todo | Direct role exists; adapt CCGS depth into Codex role package and generated TOML. | +| agent | live-ops-designer | adapt | role:live-ops-designer | todo | Direct role exists; adapt CCGS depth into Codex role package and generated TOML. | +| agent | localization-lead | adapt | role:localization-lead | todo | Direct role exists; adapt CCGS depth into Codex role package and generated TOML. | +| agent | narrative-director | merge | role:narrative-designer | implemented | CCGS role is intentionally merged into an upgraded broader CGS role package. | +| agent | network-programmer | adapt | role:network-programmer | todo | Direct role exists; adapt CCGS depth into Codex role package and generated TOML. | +| agent | performance-analyst | adapt | role:performance-analyst | implemented | Direct role has an upgraded CCGS-depth Codex role package and generated TOML coverage. | +| agent | producer | adapt | role:producer | implemented | Direct role has an upgraded CCGS-depth Codex role package and generated TOML coverage. | +| agent | prototyper | merge | role:gameplay-programmer | implemented | CCGS role is intentionally merged into an upgraded broader CGS role package. | +| agent | qa-lead | merge | role:qa-playtester | implemented | CCGS role is intentionally merged into an upgraded broader CGS role package. | +| agent | qa-tester | merge | role:qa-playtester | implemented | CCGS role is intentionally merged into an upgraded broader CGS role package. | +| agent | release-manager | adapt | role:release-manager | implemented | Direct role has an upgraded CCGS-depth Codex role package and generated TOML coverage. | +| agent | security-engineer | adapt | role:security-engineer | todo | Direct role exists; adapt CCGS depth into Codex role package and generated TOML. | +| agent | sound-designer | adapt | role:sound-designer | todo | Direct role exists; adapt CCGS depth into Codex role package and generated TOML. | +| agent | systems-designer | adapt | role:systems-designer | implemented | Direct role has an upgraded CCGS-depth Codex role package and generated TOML coverage. | +| agent | technical-artist | adapt | role:technical-artist | todo | Direct role exists; adapt CCGS depth into Codex role package and generated TOML. | +| agent | technical-director | adapt | role:technical-director | implemented | Direct role has an upgraded CCGS-depth Codex role package and generated TOML coverage. | +| agent | tools-programmer | adapt | role:tools-programmer | todo | Direct role exists; adapt CCGS depth into Codex role package and generated TOML. | +| agent | ue-blueprint-specialist | defer | none: | todo | No matching CGS surface exists yet; audit requires explicit follow-up. | +| agent | ue-gas-specialist | defer | none: | todo | No matching CGS surface exists yet; audit requires explicit follow-up. | +| agent | ue-replication-specialist | defer | none: | todo | No matching CGS surface exists yet; audit requires explicit follow-up. | +| agent | ue-umg-specialist | defer | none: | todo | No matching CGS surface exists yet; audit requires explicit follow-up. | +| agent | ui-programmer | adapt | role:ui-programmer | todo | Direct role exists; adapt CCGS depth into Codex role package and generated TOML. | +| agent | unity-addressables-specialist | defer | none: | todo | No matching CGS surface exists yet; audit requires explicit follow-up. | +| agent | unity-dots-specialist | defer | none: | todo | No matching CGS surface exists yet; audit requires explicit follow-up. | +| agent | unity-shader-specialist | defer | none: | todo | No matching CGS surface exists yet; audit requires explicit follow-up. | +| agent | unity-specialist | adapt | role:unity-specialist | todo | Direct role exists; adapt CCGS depth into Codex role package and generated TOML. | +| agent | unity-ui-specialist | defer | none: | todo | No matching CGS surface exists yet; audit requires explicit follow-up. | +| agent | unreal-specialist | adapt | role:unreal-specialist | todo | Direct role exists; adapt CCGS depth into Codex role package and generated TOML. | +| agent | ux-designer | merge | role:ui-ux-designer | implemented | CCGS role is intentionally merged into an upgraded broader CGS role package. | +| agent | world-builder | adapt | role:world-builder | todo | Direct role exists; adapt CCGS depth into Codex role package and generated TOML. | +| agent | writer | adapt | role:writer | todo | Direct role exists; adapt CCGS depth into Codex role package and generated TOML. | +| skill | adopt | adapt | skill:cgs-adopt | implemented | Generated Codex skill exists; adapt the CCGS workflow depth to Codex-native instructions. | +| skill | architecture-decision | adapt | skill:cgs-architecture-decision | implemented | Generated Codex skill exists; adapt the CCGS workflow depth to Codex-native instructions. | +| skill | architecture-review | adapt | skill:cgs-architecture-review | implemented | Generated Codex skill exists; adapt the CCGS workflow depth to Codex-native instructions. | +| skill | art-bible | adapt | skill:cgs-art-bible | implemented | Generated Codex skill exists; adapt the CCGS workflow depth to Codex-native instructions. | +| skill | asset-audit | adapt | skill:cgs-asset-audit | implemented | Generated Codex skill exists; adapt the CCGS workflow depth to Codex-native instructions. | +| skill | asset-spec | adapt | skill:cgs-asset-spec | implemented | Generated Codex skill exists; adapt the CCGS workflow depth to Codex-native instructions. | +| skill | balance-check | adapt | skill:cgs-balance-check | implemented | Generated Codex skill exists; adapt the CCGS workflow depth to Codex-native instructions. | +| skill | brainstorm | adapt | skill:cgs-brainstorm | implemented | Generated Codex skill exists; adapt the CCGS workflow depth to Codex-native instructions. | +| skill | bug-report | adapt | skill:cgs-bug-report | implemented | Generated Codex skill exists; adapt the CCGS workflow depth to Codex-native instructions. | +| skill | bug-triage | adapt | skill:cgs-bug-triage | implemented | Generated Codex skill exists; adapt the CCGS workflow depth to Codex-native instructions. | +| skill | changelog | adapt | skill:cgs-changelog | implemented | Generated Codex skill exists; adapt the CCGS workflow depth to Codex-native instructions. | +| skill | code-review | adapt | skill:cgs-code-review | implemented | Generated Codex skill exists; adapt the CCGS workflow depth to Codex-native instructions. | +| skill | consistency-check | adapt | skill:cgs-consistency-check | implemented | Generated Codex skill exists; adapt the CCGS workflow depth to Codex-native instructions. | +| skill | content-audit | adapt | skill:cgs-content-audit | implemented | Generated Codex skill exists; adapt the CCGS workflow depth to Codex-native instructions. | +| skill | create-architecture | adapt | skill:cgs-create-architecture | implemented | Generated Codex skill exists; adapt the CCGS workflow depth to Codex-native instructions. | +| skill | create-control-manifest | adapt | skill:cgs-create-control-manifest | implemented | Generated Codex skill exists; adapt the CCGS workflow depth to Codex-native instructions. | +| skill | create-epics | adapt | skill:cgs-create-epics | implemented | Generated Codex skill exists; adapt the CCGS workflow depth to Codex-native instructions. | +| skill | create-stories | adapt | skill:cgs-create-stories | implemented | Generated Codex skill exists; adapt the CCGS workflow depth to Codex-native instructions. | +| skill | day-one-patch | adapt | skill:cgs-day-one-patch | implemented | Generated Codex skill exists; adapt the CCGS workflow depth to Codex-native instructions. | +| skill | design-review | adapt | skill:cgs-design-review | implemented | Generated Codex skill exists; adapt the CCGS workflow depth to Codex-native instructions. | +| skill | design-system | adapt | skill:cgs-design-system | implemented | Generated Codex skill exists; adapt the CCGS workflow depth to Codex-native instructions. | +| skill | dev-story | adapt | skill:cgs-dev-story | implemented | Generated Codex skill exists; adapt the CCGS workflow depth to Codex-native instructions. | +| skill | estimate | adapt | skill:cgs-estimate | implemented | Generated Codex skill exists; adapt the CCGS workflow depth to Codex-native instructions. | +| skill | gate-check | adapt | skill:cgs-gate-check | implemented | Generated Codex skill exists; adapt the CCGS workflow depth to Codex-native instructions. | +| skill | help | adapt | skill:cgs-help | implemented | Generated Codex skill exists; adapt the CCGS workflow depth to Codex-native instructions. | +| skill | hotfix | adapt | skill:cgs-hotfix | implemented | Generated Codex skill exists; adapt the CCGS workflow depth to Codex-native instructions. | +| skill | launch-checklist | adapt | skill:cgs-launch-checklist | implemented | Generated Codex skill exists; adapt the CCGS workflow depth to Codex-native instructions. | +| skill | localize | adapt | skill:cgs-localize | implemented | Generated Codex skill exists; adapt the CCGS workflow depth to Codex-native instructions. | +| skill | map-systems | adapt | skill:cgs-map-systems | implemented | Generated Codex skill exists; adapt the CCGS workflow depth to Codex-native instructions. | +| skill | milestone-review | adapt | skill:cgs-milestone-review | implemented | Generated Codex skill exists; adapt the CCGS workflow depth to Codex-native instructions. | +| skill | onboard | adapt | skill:cgs-start | implemented | Generated Codex skill exists; adapt the CCGS workflow depth to Codex-native instructions. | +| skill | patch-notes | adapt | skill:cgs-patch-notes | implemented | Generated Codex skill exists; adapt the CCGS workflow depth to Codex-native instructions. | +| skill | perf-profile | adapt | skill:cgs-perf-profile | implemented | Generated Codex skill exists; adapt the CCGS workflow depth to Codex-native instructions. | +| skill | playtest-report | adapt | skill:cgs-playtest-report | implemented | Generated Codex skill exists; adapt the CCGS workflow depth to Codex-native instructions. | +| skill | project-stage-detect | adapt | skill:cgs-project-stage-detect | implemented | Generated Codex skill exists; adapt the CCGS workflow depth to Codex-native instructions. | +| skill | propagate-design-change | adapt | skill:cgs-propagate-design-change | implemented | Generated Codex skill exists; adapt the CCGS workflow depth to Codex-native instructions. | +| skill | prototype | adapt | skill:cgs-prototype | implemented | Generated Codex skill exists; adapt the CCGS workflow depth to Codex-native instructions. | +| skill | qa-plan | adapt | skill:cgs-qa-plan | implemented | Generated Codex skill exists; adapt the CCGS workflow depth to Codex-native instructions. | +| skill | quick-design | adapt | skill:cgs-quick-design | implemented | Generated Codex skill exists; adapt the CCGS workflow depth to Codex-native instructions. | +| skill | regression-suite | adapt | skill:cgs-regression-suite | implemented | Generated Codex skill exists; adapt the CCGS workflow depth to Codex-native instructions. | +| skill | release-checklist | adapt | skill:cgs-release-checklist | implemented | Generated Codex skill exists; adapt the CCGS workflow depth to Codex-native instructions. | +| skill | retrospective | adapt | skill:cgs-retrospective | implemented | Generated Codex skill exists; adapt the CCGS workflow depth to Codex-native instructions. | +| skill | reverse-document | adapt | skill:cgs-reverse-document | implemented | Generated Codex skill exists; adapt the CCGS workflow depth to Codex-native instructions. | +| skill | review-all-gdds | adapt | skill:cgs-review-all-gdds | implemented | Generated Codex skill exists; adapt the CCGS workflow depth to Codex-native instructions. | +| skill | scope-check | adapt | skill:cgs-scope-check | implemented | Generated Codex skill exists; adapt the CCGS workflow depth to Codex-native instructions. | +| skill | security-audit | adapt | skill:cgs-security-audit | implemented | Generated Codex skill exists; adapt the CCGS workflow depth to Codex-native instructions. | +| skill | setup-engine | adapt | skill:cgs-setup-engine | implemented | Generated Codex skill exists; adapt the CCGS workflow depth to Codex-native instructions. | +| skill | skill-improve | adapt | skill:cgs-skill-improve | implemented | Generated Codex skill exists; adapt the CCGS workflow depth to Codex-native instructions. | +| skill | skill-test | adapt | skill:cgs-skill-test | implemented | Generated Codex skill exists; adapt the CCGS workflow depth to Codex-native instructions. | +| skill | smoke-check | adapt | skill:cgs-smoke-check | implemented | Generated Codex skill exists; adapt the CCGS workflow depth to Codex-native instructions. | +| skill | soak-test | adapt | skill:cgs-soak-test | implemented | Generated Codex skill exists; adapt the CCGS workflow depth to Codex-native instructions. | +| skill | sprint-plan | adapt | skill:cgs-sprint-plan | implemented | Generated Codex skill exists; adapt the CCGS workflow depth to Codex-native instructions. | +| skill | sprint-status | adapt | skill:cgs-sprint-status | implemented | Generated Codex skill exists; adapt the CCGS workflow depth to Codex-native instructions. | +| skill | start | adapt | skill:cgs-start | implemented | Generated Codex skill exists; adapt the CCGS workflow depth to Codex-native instructions. | +| skill | story-done | adapt | skill:cgs-story-done | implemented | Generated Codex skill exists; adapt the CCGS workflow depth to Codex-native instructions. | +| skill | story-readiness | adapt | skill:cgs-story-readiness | implemented | Generated Codex skill exists; adapt the CCGS workflow depth to Codex-native instructions. | +| skill | team-audio | adapt | skill:cgs-team-audio | implemented | Generated Codex skill exists; adapt the CCGS workflow depth to Codex-native instructions. | +| skill | team-combat | adapt | skill:cgs-team-combat | implemented | Generated Codex skill exists; adapt the CCGS workflow depth to Codex-native instructions. | +| skill | team-level | adapt | skill:cgs-team-level | implemented | Generated Codex skill exists; adapt the CCGS workflow depth to Codex-native instructions. | +| skill | team-live-ops | adapt | skill:cgs-team-live-ops | implemented | Generated Codex skill exists; adapt the CCGS workflow depth to Codex-native instructions. | +| skill | team-narrative | adapt | skill:cgs-team-narrative | implemented | Generated Codex skill exists; adapt the CCGS workflow depth to Codex-native instructions. | +| skill | team-polish | adapt | skill:cgs-team-polish | implemented | Generated Codex skill exists; adapt the CCGS workflow depth to Codex-native instructions. | +| skill | team-qa | adapt | skill:cgs-team-qa | implemented | Generated Codex skill exists; adapt the CCGS workflow depth to Codex-native instructions. | +| skill | team-release | adapt | skill:cgs-team-release | implemented | Generated Codex skill exists; adapt the CCGS workflow depth to Codex-native instructions. | +| skill | team-ui | adapt | skill:cgs-team-ui | implemented | Generated Codex skill exists; adapt the CCGS workflow depth to Codex-native instructions. | +| skill | tech-debt | adapt | skill:cgs-tech-debt | implemented | Generated Codex skill exists; adapt the CCGS workflow depth to Codex-native instructions. | +| skill | test-evidence-review | adapt | skill:cgs-test-evidence-review | implemented | Generated Codex skill exists; adapt the CCGS workflow depth to Codex-native instructions. | +| skill | test-flakiness | adapt | skill:cgs-test-flakiness | implemented | Generated Codex skill exists; adapt the CCGS workflow depth to Codex-native instructions. | +| skill | test-helpers | adapt | skill:cgs-test-helpers | implemented | Generated Codex skill exists; adapt the CCGS workflow depth to Codex-native instructions. | +| skill | test-setup | adapt | skill:cgs-test-setup | implemented | Generated Codex skill exists; adapt the CCGS workflow depth to Codex-native instructions. | +| skill | ux-design | adapt | skill:cgs-ux-design | implemented | Generated Codex skill exists; adapt the CCGS workflow depth to Codex-native instructions. | +| skill | ux-review | adapt | skill:cgs-ux-review | implemented | Generated Codex skill exists; adapt the CCGS workflow depth to Codex-native instructions. | +| skill | vertical-slice | adapt | skill:cgs-vertical-slice | implemented | Generated Codex skill exists; adapt the CCGS workflow depth to Codex-native instructions. | +| workflow-step | brainstorm | adapt | workflow:brainstorm | implemented | Workflow exists; add CCGS-style phase/artifact semantics where useful. | +| workflow-step | engine-setup | adopt | workflow:engine-setup | todo | CCGS catalog step is missing and should be represented in the CGS phase catalog or as a workflow alias. | +| workflow-step | game-concept | adopt | workflow:game-concept | todo | CCGS catalog step is missing and should be represented in the CGS phase catalog or as a workflow alias. | +| workflow-step | design-review-concept | adopt | workflow:design-review-concept | todo | CCGS catalog step is missing and should be represented in the CGS phase catalog or as a workflow alias. | +| workflow-step | art-bible | adopt | workflow:art-bible | todo | CCGS catalog step is missing and should be represented in the CGS phase catalog or as a workflow alias. | +| workflow-step | map-systems | adopt | workflow:map-systems | todo | CCGS catalog step is missing and should be represented in the CGS phase catalog or as a workflow alias. | +| workflow-step | design-system | adopt | workflow:design-system | todo | CCGS catalog step is missing and should be represented in the CGS phase catalog or as a workflow alias. | +| workflow-step | design-review | adopt | workflow:design-review | todo | CCGS catalog step is missing and should be represented in the CGS phase catalog or as a workflow alias. | +| workflow-step | review-all-gdds | adopt | workflow:review-all-gdds | todo | CCGS catalog step is missing and should be represented in the CGS phase catalog or as a workflow alias. | +| workflow-step | consistency-check | adopt | workflow:consistency-check | todo | CCGS catalog step is missing and should be represented in the CGS phase catalog or as a workflow alias. | +| workflow-step | create-architecture | adopt | workflow:create-architecture | todo | CCGS catalog step is missing and should be represented in the CGS phase catalog or as a workflow alias. | +| workflow-step | architecture-decision | adapt | workflow:architecture-decision | implemented | Workflow exists; add CCGS-style phase/artifact semantics where useful. | +| workflow-step | architecture-review | adapt | workflow:architecture-review | implemented | Workflow exists; add CCGS-style phase/artifact semantics where useful. | +| workflow-step | control-manifest | adopt | workflow:control-manifest | todo | CCGS catalog step is missing and should be represented in the CGS phase catalog or as a workflow alias. | +| workflow-step | accessibility-doc | adopt | workflow:accessibility-doc | todo | CCGS catalog step is missing and should be represented in the CGS phase catalog or as a workflow alias. | +| workflow-step | entity-inventory | adopt | workflow:entity-inventory | todo | CCGS catalog step is missing and should be represented in the CGS phase catalog or as a workflow alias. | +| workflow-step | asset-spec | adopt | workflow:asset-spec | todo | CCGS catalog step is missing and should be represented in the CGS phase catalog or as a workflow alias. | +| workflow-step | ux-design | adopt | workflow:ux-design | todo | CCGS catalog step is missing and should be represented in the CGS phase catalog or as a workflow alias. | +| workflow-step | ux-review | adopt | workflow:ux-review | todo | CCGS catalog step is missing and should be represented in the CGS phase catalog or as a workflow alias. | +| workflow-step | prototype | adapt | workflow:prototype | implemented | Workflow exists; add CCGS-style phase/artifact semantics where useful. | +| workflow-step | create-epics | adapt | workflow:create-epics | implemented | Workflow exists; add CCGS-style phase/artifact semantics where useful. | +| workflow-step | create-stories | adapt | workflow:create-stories | implemented | Workflow exists; add CCGS-style phase/artifact semantics where useful. | +| workflow-step | test-setup | adopt | workflow:test-setup | todo | CCGS catalog step is missing and should be represented in the CGS phase catalog or as a workflow alias. | +| workflow-step | sprint-plan | adapt | workflow:sprint-plan | implemented | Workflow exists; add CCGS-style phase/artifact semantics where useful. | +| workflow-step | vertical-slice | adapt | workflow:vertical-slice | implemented | Workflow exists; add CCGS-style phase/artifact semantics where useful. | +| workflow-step | sprint-plan | adapt | workflow:sprint-plan | implemented | Workflow exists; add CCGS-style phase/artifact semantics where useful. | +| workflow-step | story-readiness | adapt | workflow:story-readiness | implemented | Workflow exists; add CCGS-style phase/artifact semantics where useful. | +| workflow-step | implement | adopt | workflow:implement | todo | CCGS catalog step is missing and should be represented in the CGS phase catalog or as a workflow alias. | +| workflow-step | code-review | adopt | workflow:code-review | todo | CCGS catalog step is missing and should be represented in the CGS phase catalog or as a workflow alias. | +| workflow-step | story-done | adapt | workflow:story-done | implemented | Workflow exists; add CCGS-style phase/artifact semantics where useful. | +| workflow-step | qa-plan | adapt | workflow:qa-plan | implemented | Workflow exists; add CCGS-style phase/artifact semantics where useful. | +| workflow-step | bug-report | adopt | workflow:bug-report | todo | CCGS catalog step is missing and should be represented in the CGS phase catalog or as a workflow alias. | +| workflow-step | retrospective | adopt | workflow:retrospective | todo | CCGS catalog step is missing and should be represented in the CGS phase catalog or as a workflow alias. | +| workflow-step | team-feature | adopt | workflow:team-feature | todo | CCGS catalog step is missing and should be represented in the CGS phase catalog or as a workflow alias. | +| workflow-step | scope-check | adopt | workflow:scope-check | todo | CCGS catalog step is missing and should be represented in the CGS phase catalog or as a workflow alias. | +| workflow-step | sprint-status | adapt | workflow:sprint-status | implemented | Workflow exists; add CCGS-style phase/artifact semantics where useful. | +| workflow-step | perf-profile | adapt | workflow:perf-profile | implemented | Workflow exists; add CCGS-style phase/artifact semantics where useful. | +| workflow-step | balance-check | adopt | workflow:balance-check | todo | CCGS catalog step is missing and should be represented in the CGS phase catalog or as a workflow alias. | +| workflow-step | asset-audit | adopt | workflow:asset-audit | todo | CCGS catalog step is missing and should be represented in the CGS phase catalog or as a workflow alias. | +| workflow-step | playtest-polish | adopt | workflow:playtest-polish | todo | CCGS catalog step is missing and should be represented in the CGS phase catalog or as a workflow alias. | +| workflow-step | team-polish | adopt | workflow:team-polish | todo | CCGS catalog step is missing and should be represented in the CGS phase catalog or as a workflow alias. | +| workflow-step | release-checklist | adapt | workflow:release-checklist | implemented | Workflow exists; add CCGS-style phase/artifact semantics where useful. | +| workflow-step | patch-notes | adopt | workflow:patch-notes | todo | CCGS catalog step is missing and should be represented in the CGS phase catalog or as a workflow alias. | +| workflow-step | changelog | adopt | workflow:changelog | todo | CCGS catalog step is missing and should be represented in the CGS phase catalog or as a workflow alias. | +| workflow-step | launch-checklist | adopt | workflow:launch-checklist | todo | CCGS catalog step is missing and should be represented in the CGS phase catalog or as a workflow alias. | +| template | accessibility-requirements | adapt | template:accessibility-requirements | implemented | Template equivalent exists; compare body quality and update if thinner. | +| template | architecture-decision-record | adopt | template:architecture-decision-record | todo | CCGS template has no CGS equivalent yet. | +| template | architecture-doc-from-code | adopt | template:architecture-doc-from-code | todo | CCGS template has no CGS equivalent yet. | +| template | architecture-traceability | adapt | template:architecture-traceability | implemented | Template equivalent exists; compare body quality and update if thinner. | +| template | art-bible | adapt | template:art-bible | implemented | Template equivalent exists; compare body quality and update if thinner. | +| template | changelog-template | adopt | template:changelog-template | todo | CCGS template has no CGS equivalent yet. | +| template | design-agent-protocol | adopt | template:design-agent-protocol | todo | CCGS template has no CGS equivalent yet. | +| template | implementation-agent-protocol | adopt | template:implementation-agent-protocol | todo | CCGS template has no CGS equivalent yet. | +| template | leadership-agent-protocol | adopt | template:leadership-agent-protocol | todo | CCGS template has no CGS equivalent yet. | +| template | concept-doc-from-prototype | adopt | template:concept-doc-from-prototype | todo | CCGS template has no CGS equivalent yet. | +| template | design-doc-from-implementation | adopt | template:design-doc-from-implementation | todo | CCGS template has no CGS equivalent yet. | +| template | difficulty-curve | adapt | template:difficulty-curve | implemented | Template equivalent exists; compare body quality and update if thinner. | +| template | economy-model | adapt | template:economy-model | implemented | Template equivalent exists; compare body quality and update if thinner. | +| template | faction-design | adopt | template:faction-design | todo | CCGS template has no CGS equivalent yet. | +| template | game-concept | adopt | template:game-concept | todo | CCGS template has no CGS equivalent yet. | +| template | game-design-document | adopt | template:game-design-document | todo | CCGS template has no CGS equivalent yet. | +| template | game-pillars | adopt | template:game-pillars | todo | CCGS template has no CGS equivalent yet. | +| template | hud-design | adopt | template:hud-design | todo | CCGS template has no CGS equivalent yet. | +| template | incident-response | adopt | template:incident-response | todo | CCGS template has no CGS equivalent yet. | +| template | interaction-pattern-library | adopt | template:interaction-pattern-library | todo | CCGS template has no CGS equivalent yet. | +| template | level-design-document | adopt | template:level-design-document | todo | CCGS template has no CGS equivalent yet. | +| template | milestone-definition | adopt | template:milestone-definition | todo | CCGS template has no CGS equivalent yet. | +| template | narrative-character-sheet | adopt | template:narrative-character-sheet | todo | CCGS template has no CGS equivalent yet. | +| template | pitch-document | adapt | template:pitch-document | implemented | Template equivalent exists; compare body quality and update if thinner. | +| template | player-journey | adapt | template:player-journey | implemented | Template equivalent exists; compare body quality and update if thinner. | +| template | post-mortem | adopt | template:post-mortem | todo | CCGS template has no CGS equivalent yet. | +| template | project-stage-report | adopt | template:project-stage-report | todo | CCGS template has no CGS equivalent yet. | +| template | prototype-report | adopt | template:prototype-report | todo | CCGS template has no CGS equivalent yet. | +| template | release-checklist-template | adopt | template:release-checklist-template | todo | CCGS template has no CGS equivalent yet. | +| template | release-notes | adapt | template:release-notes | implemented | Template equivalent exists; compare body quality and update if thinner. | +| template | risk-register-entry | adopt | template:risk-register-entry | todo | CCGS template has no CGS equivalent yet. | +| template | skill-test-spec | adopt | template:skill-test-spec | todo | CCGS template has no CGS equivalent yet. | +| template | sound-bible | adapt | template:sound-bible | implemented | Template equivalent exists; compare body quality and update if thinner. | +| template | sprint-plan | adapt | template:sprint-plan | implemented | Template equivalent exists; compare body quality and update if thinner. | +| template | systems-index | adopt | template:systems-index | todo | CCGS template has no CGS equivalent yet. | +| template | technical-design-document | adopt | template:technical-design-document | todo | CCGS template has no CGS equivalent yet. | +| template | test-evidence | adapt | template:test-evidence | implemented | Template equivalent exists; compare body quality and update if thinner. | +| template | test-plan | adapt | template:test-plan | implemented | Template equivalent exists; compare body quality and update if thinner. | +| template | ux-spec | adapt | template:ux-spec | implemented | Template equivalent exists; compare body quality and update if thinner. | +| template | vertical-slice-report | adapt | template:vertical-slice-report | implemented | Template equivalent exists; compare body quality and update if thinner. | +| rule | ai-code | adapt | rule:ai-code | todo | CCGS coding rule intent should become skills, AGENTS guidance, or selected context, not `.codex/rules/*.rules`. | +| rule | data-files | adapt | rule:data-files | todo | CCGS coding rule intent should become skills, AGENTS guidance, or selected context, not `.codex/rules/*.rules`. | +| rule | design-docs | adapt | rule:design-docs | todo | CCGS coding rule intent should become skills, AGENTS guidance, or selected context, not `.codex/rules/*.rules`. | +| rule | engine-code | adapt | rule:engine-code | todo | CCGS coding rule intent should become skills, AGENTS guidance, or selected context, not `.codex/rules/*.rules`. | +| rule | gameplay-code | adapt | rule:gameplay-code | todo | CCGS coding rule intent should become skills, AGENTS guidance, or selected context, not `.codex/rules/*.rules`. | +| rule | narrative | adapt | rule:narrative | todo | CCGS coding rule intent should become skills, AGENTS guidance, or selected context, not `.codex/rules/*.rules`. | +| rule | network-code | adapt | rule:network-code | todo | CCGS coding rule intent should become skills, AGENTS guidance, or selected context, not `.codex/rules/*.rules`. | +| rule | prototype-code | adapt | rule:prototype-code | todo | CCGS coding rule intent should become skills, AGENTS guidance, or selected context, not `.codex/rules/*.rules`. | +| rule | shader-code | adapt | rule:shader-code | todo | CCGS coding rule intent should become skills, AGENTS guidance, or selected context, not `.codex/rules/*.rules`. | +| rule | test-standards | adapt | rule:test-standards | todo | CCGS coding rule intent should become skills, AGENTS guidance, or selected context, not `.codex/rules/*.rules`. | +| rule | ui-code | adapt | rule:ui-code | todo | CCGS coding rule intent should become skills, AGENTS guidance, or selected context, not `.codex/rules/*.rules`. | diff --git a/research/codex-port-design.md b/research/codex-port-design.md index b28f8ff..223c30d 100644 --- a/research/codex-port-design.md +++ b/research/codex-port-design.md @@ -330,7 +330,7 @@ Required package metadata excerpt: "build": "tsc -p tsconfig.build.json", "init": "npm run build --silent && node dist/cli.js init", "manage": "npm run build --silent && node dist/cli.js status", - "test": "vitest run", + "test": "node:test run", "validate": "npm run build --silent && node dist/cli.js validate", "templates": "npm run build --silent && node dist/cli.js templates" }, diff --git a/scripts/audit-ccgs-surfaces.ts b/scripts/audit-ccgs-surfaces.ts new file mode 100644 index 0000000..4d5ecbc --- /dev/null +++ b/scripts/audit-ccgs-surfaces.ts @@ -0,0 +1,11 @@ +#!/usr/bin/env node +import { generateParityMatrix, inventoryCcgsSurfaces, writeParityReports } from "../src/ccgs-parity.js"; +import { defaultProjectConfig } from "../src/projects.js"; + +const referenceRoot = process.env.CCGS_REFERENCE_ROOT ?? process.argv[2] ?? "/opt/data/repos/Claude-Code-Game-Studios"; +const outDir = process.env.CCGS_PARITY_OUT ?? process.argv[3] ?? "references"; +const config = defaultProjectConfig({ name: "Parity Audit Game", engine: "godot", mode: "prototype", nonInteractive: true }); +const inventory = inventoryCcgsSurfaces(referenceRoot); +const matrix = generateParityMatrix(inventory, config); +writeParityReports(matrix, outDir); +console.log(`Wrote ${matrix.rows.length} CCGS parity rows to ${outDir}`); diff --git a/src/agents.ts b/src/agents.ts index 605f1cc..0a29168 100644 --- a/src/agents.ts +++ b/src/agents.ts @@ -136,7 +136,9 @@ export function renderProjectCustomAgentToml(role: StudioRoleId, config: Project "Keep changes bounded to the requested game-development task.", "Report changed files, verification evidence, and remaining risks.", "", - pkg.systemPrompt + pkg.systemPrompt, + "", + renderRoleContractSections(pkg) ].join("\n"))}`, "" ].join("\n"); diff --git a/src/ccgs-parity.ts b/src/ccgs-parity.ts new file mode 100644 index 0000000..25e27bb --- /dev/null +++ b/src/ccgs-parity.ts @@ -0,0 +1,487 @@ +import { existsSync, mkdirSync, readFileSync, readdirSync, writeFileSync } from "node:fs"; +import crypto from "node:crypto"; +import path from "node:path"; +import type { ProjectConfig } from "./config.js"; +import { ccgsParityUpgradedRoleIds, rolePackages, type StudioRoleId } from "./roles.js"; +import { workflowIds, workflowRegistry } from "./workflows.js"; +import { generatedSkillDefinitions, renderGeneratedSkill } from "./skills.js"; +import { listTemplates } from "./templates.js"; + +export type CcgsSourceType = "agent" | "skill" | "workflow-step" | "template" | "rule"; +export type ParityDecision = "adopt" | "adapt" | "merge" | "rename-alias" | "defer" | "out-of-scope"; +export type CgsTargetKind = "role" | "skill" | "workflow" | "template" | "rule" | "validation" | "none"; + +export type CcgsAgentInventory = { + sourceType: "agent"; + id: string; + sourcePath: string; + sha256: string; + frontmatter: Record; + body: string; + sections: string[]; + skills: string[]; + gateTokens: string[]; + outputTemplates: string[]; +}; + +export type CcgsSkillInventory = { + sourceType: "skill"; + id: string; + sourcePath: string; + sha256: string; + frontmatter: Record; + body: string; + agent?: string; + argumentHint?: string; + allowedTools: string[]; + phaseHeadings: string[]; + contextFiles: string[]; + writeTargets: string[]; + verdictTokens: string[]; + outputTemplates: string[]; +}; + +export type CcgsWorkflowStepInventory = { + sourceType: "workflow-step"; + id: string; + sourcePath: string; + sha256: string; + phase: string; + name?: string; + command?: string; + required: boolean; + repeatable: boolean; + artifact?: { glob?: string; pattern?: string; minCount?: number; note?: string }; + description?: string; + nextPhase?: string; +}; + +export type CcgsTextInventory = { + sourceType: "template" | "rule"; + id: string; + sourcePath: string; + sha256: string; + body: string; + sections: string[]; +}; + +export type CcgsInventory = { + root: string; + generatedAt: string; + agents: CcgsAgentInventory[]; + skills: CcgsSkillInventory[]; + workflowSteps: CcgsWorkflowStepInventory[]; + templates: CcgsTextInventory[]; + rules: CcgsTextInventory[]; +}; + +export type SurfaceScores = { + contentDepth: number; + proceduralSpecificity: number; + contextContract: number; + outputContract: number; + roleSkillLinkage: number; + gateEscalation: number; + codexFit: number; + testability: number; +}; + +export type ParityRow = { + sourceType: CcgsSourceType; + sourceId: string; + sourcePath: string; + sourceHash: string; + cgsTarget: { kind: CgsTargetKind; id: string; path: string; hash?: string }; + decision: ParityDecision; + rationale: string; + scores: SurfaceScores; + ownerPath: string; + testPath: string; + status: "todo" | "implemented" | "deferred" | "out-of-scope"; +}; + +export type ParityMatrix = { + schemaVersion: "ccgs-surface-parity/v1"; + generatedAt: string; + referenceRoot: string; + counts: Record; + rows: ParityRow[]; +}; + +function sha256(value: string): string { + return crypto.createHash("sha256").update(value).digest("hex"); +} + +function rel(root: string, file: string): string { + return path.relative(root, file).split(path.sep).join("/"); +} + +function readText(file: string): string { + return readFileSync(file, "utf8"); +} + +function listFiles(dir: string, predicate: (file: string) => boolean): string[] { + if (!existsSync(dir)) return []; + const out: string[] = []; + for (const entry of readdirSync(dir, { withFileTypes: true })) { + const full = path.join(dir, entry.name); + if (entry.isDirectory()) out.push(...listFiles(full, predicate)); + else if (entry.isFile() && predicate(full)) out.push(full); + } + return out.sort(); +} + +function parseFrontmatter(text: string): { frontmatter: Record; body: string } { + if (!text.startsWith("---\n")) return { frontmatter: {}, body: text }; + const end = text.indexOf("\n---", 4); + if (end === -1) return { frontmatter: {}, body: text }; + const raw = text.slice(4, end).trim(); + const frontmatter: Record = {}; + for (const line of raw.split(/\r?\n/)) { + const match = /^([A-Za-z0-9_-]+):\s*(.*)$/.exec(line.trim()); + if (!match) continue; + frontmatter[match[1]] = match[2].replace(/^"|"$/g, ""); + } + return { frontmatter, body: text.slice(end + 5).replace(/^\s+/, "") }; +} + +function markdownSections(body: string): string[] { + return [...body.matchAll(/^#{2,4}\s+(.+?)\s*$/gm)].map((match) => match[1].trim()); +} + +function bracketList(value?: string): string[] { + if (!value) return []; + const trimmed = value.trim(); + if (trimmed.startsWith("[") && trimmed.endsWith("]")) { + return trimmed + .slice(1, -1) + .split(",") + .map((item) => item.trim().replace(/^"|"$/g, "")) + .filter(Boolean); + } + return trimmed.split(/[ ,]+/).filter(Boolean); +} + +function tokens(body: string, known: string[]): string[] { + return known.filter((token) => new RegExp(`\\b${token.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")}\\b`).test(body)); +} + +function contextFiles(body: string): string[] { + const results = new Set(); + for (const match of body.matchAll(/[`"]?((?:CLAUDE|AGENTS)\.md|(?:design|docs|src|production|\.claude|\.codex|\.agents)\/[A-Za-z0-9_./-]+\.(?:md|json|yaml|yml|txt))[`"]?/g)) { + results.add(match[1]); + } + return [...results].sort(); +} + +function writeTargets(body: string): string[] { + const results = new Set(); + for (const match of body.matchAll(/(?:write|create|update|append to)\s+[`"]?((?:design|docs|src|production|prototypes|assets|tests)\/[A-Za-z0-9_./-]+)[`"]?/gi)) { + results.add(match[1]); + } + return [...results].sort(); +} + +function parseWorkflowCatalog(root: string): CcgsWorkflowStepInventory[] { + const file = path.join(root, ".claude", "docs", "workflow-catalog.yaml"); + if (!existsSync(file)) return []; + const body = readText(file); + const hash = sha256(body); + const lines = body.split(/\r?\n/); + const rows: CcgsWorkflowStepInventory[] = []; + let phase = "unknown"; + let nextPhase: string | undefined; + let current: CcgsWorkflowStepInventory | undefined; + let inArtifact = false; + for (const line of lines) { + const phaseMatch = /^\s{2}([a-z0-9-]+):\s*$/.exec(line); + if (phaseMatch) { + phase = phaseMatch[1]; + nextPhase = undefined; + current = undefined; + inArtifact = false; + continue; + } + const nextMatch = /^\s{4}next_phase:\s*(.+)\s*$/.exec(line); + if (nextMatch) nextPhase = nextMatch[1].replace(/^"|"$/g, ""); + const stepMatch = /^\s{6}- id:\s*([a-z0-9-]+)\s*$/.exec(line); + if (stepMatch) { + current = { sourceType: "workflow-step", id: stepMatch[1], sourcePath: rel(root, file), sha256: hash, phase, required: false, repeatable: false, nextPhase }; + rows.push(current); + inArtifact = false; + continue; + } + if (!current) continue; + const prop = /^\s{8}([a-z_]+):\s*(.*)$/.exec(line); + if (prop) { + inArtifact = prop[1] === "artifact"; + const value = prop[2].trim().replace(/^"|"$/g, ""); + if (prop[1] === "name") current.name = value; + if (prop[1] === "command") current.command = value; + if (prop[1] === "required") current.required = value === "true"; + if (prop[1] === "repeatable") current.repeatable = value === "true"; + if (prop[1] === "description") current.description = value; + if (prop[1] === "artifact") current.artifact = {}; + continue; + } + const artifactProp = /^\s{10}([a-z_]+):\s*(.*)$/.exec(line); + if (inArtifact && artifactProp) { + const value = artifactProp[2].trim().replace(/^"|"$/g, ""); + current.artifact ??= {}; + if (artifactProp[1] === "glob") current.artifact.glob = value; + if (artifactProp[1] === "pattern") current.artifact.pattern = value; + if (artifactProp[1] === "note") current.artifact.note = value; + if (artifactProp[1] === "min_count") current.artifact.minCount = Number(value); + } + } + return rows; +} + +export function inventoryCcgsSurfaces(root = process.env.CCGS_REFERENCE_ROOT ?? "/opt/data/repos/Claude-Code-Game-Studios"): CcgsInventory { + if (!existsSync(root)) throw new Error(`CCGS reference root missing: ${root}`); + const agents = listFiles(path.join(root, ".claude", "agents"), (file) => file.endsWith(".md")).map((file): CcgsAgentInventory => { + const text = readText(file); + const { frontmatter, body } = parseFrontmatter(text); + return { + sourceType: "agent", + id: path.basename(file, ".md"), + sourcePath: rel(root, file), + sha256: sha256(text), + frontmatter, + body, + sections: markdownSections(body), + skills: bracketList(frontmatter.skills), + gateTokens: [...new Set([...body.matchAll(/\[([A-Z]{2,}(?:-[A-Z0-9]+)+)\]/g)].map((match) => match[1]))].sort(), + outputTemplates: markdownSections(body).filter((section) => /output|format|template/i.test(section)) + }; + }); + const skills = listFiles(path.join(root, ".claude", "skills"), (file) => path.basename(file) === "SKILL.md").map((file): CcgsSkillInventory => { + const text = readText(file); + const { frontmatter, body } = parseFrontmatter(text); + return { + sourceType: "skill", + id: path.basename(path.dirname(file)), + sourcePath: rel(root, file), + sha256: sha256(text), + frontmatter, + body, + agent: frontmatter.agent, + argumentHint: frontmatter["argument-hint"], + allowedTools: bracketList(frontmatter["allowed-tools"]), + phaseHeadings: markdownSections(body).filter((section) => /^Phase\s+\d+/i.test(section)), + contextFiles: contextFiles(body), + writeTargets: writeTargets(body), + verdictTokens: tokens(body, ["PROCEED", "PIVOT", "KILL", "PASS", "FAIL", "APPROVE", "CONCERNS", "BLOCKED", "GO", "NO-GO"]), + outputTemplates: markdownSections(body).filter((section) => /output|format|report|template|handoff/i.test(section)) + }; + }); + const templates = listFiles(path.join(root, ".claude", "docs", "templates"), (file) => file.endsWith(".md")).map((file): CcgsTextInventory => { + const body = readText(file); + return { sourceType: "template", id: path.basename(file, ".md"), sourcePath: rel(root, file), sha256: sha256(body), body, sections: markdownSections(body) }; + }); + const rules = listFiles(path.join(root, ".claude", "rules"), (file) => file.endsWith(".md")).map((file): CcgsTextInventory => { + const body = readText(file); + return { sourceType: "rule", id: path.basename(file, ".md"), sourcePath: rel(root, file), sha256: sha256(body), body, sections: markdownSections(body) }; + }); + return { root, generatedAt: new Date(0).toISOString(), agents, skills, workflowSteps: parseWorkflowCatalog(root), templates, rules }; +} + +function scoreSurface(source: CcgsAgentInventory | CcgsSkillInventory | CcgsWorkflowStepInventory | CcgsTextInventory): SurfaceScores { + const body = "body" in source ? source.body : `${source.description ?? ""} ${source.artifact?.glob ?? ""}`; + const sections = "sections" in source ? source.sections.length : "phaseHeadings" in source ? source.phaseHeadings.length : source.artifact ? 2 : 1; + return { + contentDepth: Math.min(5, Math.max(1, Math.ceil(body.length / 2500) + Math.min(2, sections > 4 ? 2 : sections > 1 ? 1 : 0))), + proceduralSpecificity: Math.min(5, (body.match(/\b(Phase|Step|Run|Ask|Write|Create|Verify|Check)\b/g) ?? []).length > 8 ? 5 : sections > 2 ? 4 : 2), + contextContract: "contextFiles" in source ? Math.min(5, source.contextFiles.length + 1) : "inputs" in source ? 3 : body.includes("Read") ? 3 : 2, + outputContract: "outputTemplates" in source ? Math.min(5, source.outputTemplates.length + 2) : body.includes("# ") ? 3 : 2, + roleSkillLinkage: "skills" in source ? Math.min(5, source.skills.length + 2) : "agent" in source && source.agent ? 4 : 2, + gateEscalation: "gateTokens" in source ? Math.min(5, source.gateTokens.length + 2) : "verdictTokens" in source ? Math.min(5, source.verdictTokens.length + 1) : body.match(/gate|verdict|escalat|block/i) ? 3 : 1, + codexFit: body.match(/\.claude|Claude|AskUserQuestion|hooks/i) ? 3 : 5, + testability: body.match(/test|verify|evidence|artifact|acceptance|validation/i) ? 4 : 2 + }; +} + +const roleAliases: Record = { + "art-director": "senior-game-artist", + "narrative-director": "narrative-designer", + "ux-designer": "ui-ux-designer", + "qa-lead": "qa-playtester", + "qa-tester": "qa-playtester", + "lead-programmer": "technical-director", + prototyper: "gameplay-programmer", + "analytics-engineer": "data-scientist" +}; + +const cgsSkillAliases: Record = { onboard: "cgs-start", localize: "cgs-localize" }; + +function cgsTargetHash(kind: CgsTargetKind, id: string, config: ProjectConfig): string | undefined { + if (!id) return undefined; + if (kind === "role" && id in rolePackages) return sha256(JSON.stringify(rolePackages[id as StudioRoleId])); + if (kind === "skill") { + const definition = generatedSkillDefinitions(config).find((skill) => skill.name === id); + return definition ? sha256(renderGeneratedSkill(definition)) : undefined; + } + if (kind === "workflow" && id in workflowRegistry) return sha256(JSON.stringify(workflowRegistry[id as keyof typeof workflowRegistry])); + return undefined; +} + +function target(kind: CgsTargetKind, id: string, targetPath: string, config: ProjectConfig): ParityRow["cgsTarget"] { + return { kind, id, path: targetPath, hash: cgsTargetHash(kind, id, config) }; +} + +function rowForSource(source: CcgsAgentInventory | CcgsSkillInventory | CcgsWorkflowStepInventory | CcgsTextInventory, config: ProjectConfig): ParityRow { + const skillNames = new Set(generatedSkillDefinitions(config).map((skill) => skill.name)); + const workflowNames = new Set(workflowIds()); + const templateNames = new Set(listTemplates().flatMap((template) => [template.id, template.id.replace(/_/g, "-")])); + let cgsTarget: ParityRow["cgsTarget"] = target("none", "", "", config); + let decision: ParityDecision = "defer"; + let status: ParityRow["status"] = "todo"; + let rationale = "No matching CGS surface exists yet; audit requires explicit follow-up."; + let ownerPath = "references/ccgs-surface-parity-matrix.json"; + let testPath = "tests/ccgs-parity-audit.test.ts"; + + if (source.sourceType === "agent") { + if (source.id in rolePackages) { + cgsTarget = target("role", source.id, "src/roles.ts", config); + decision = "adapt"; + status = (ccgsParityUpgradedRoleIds as readonly string[]).includes(source.id) ? "implemented" : "todo"; + rationale = status === "implemented" ? "Direct role has an upgraded CCGS-depth Codex role package and generated TOML coverage." : "Direct role exists; adapt CCGS depth into Codex role package and generated TOML."; + ownerPath = "src/roles.ts"; + testPath = "tests/agents-templates.test.ts"; + } else if (roleAliases[source.id]) { + cgsTarget = target("role", roleAliases[source.id], "src/roles.ts", config); + decision = "merge"; + status = (ccgsParityUpgradedRoleIds as readonly string[]).includes(roleAliases[source.id]) ? "implemented" : "todo"; + rationale = status === "implemented" ? "CCGS role is intentionally merged into an upgraded broader CGS role package." : "CCGS role is intentionally merged into a broader CGS role; accepted responsibilities must be covered there."; + ownerPath = "src/roles.ts"; + testPath = "tests/agents-templates.test.ts"; + } + } else if (source.sourceType === "skill") { + const cgsName = cgsSkillAliases[source.id] ?? `cgs-${source.id}`; + if (skillNames.has(cgsName)) { + cgsTarget = target("skill", cgsName, "src/skills.ts", config); + decision = "adapt"; + status = "implemented"; + rationale = "Generated Codex skill exists; adapt the CCGS workflow depth to Codex-native instructions."; + ownerPath = "src/skills.ts"; + testPath = "tests/project-workflow.test.ts"; + } else if (workflowNames.has(source.id)) { + cgsTarget = target("workflow", source.id, "src/workflows.ts", config); + decision = "merge"; + rationale = "CCGS skill currently maps to a CGS workflow; decide whether to add a repository skill wrapper."; + ownerPath = "src/workflows.ts"; + } + } else if (source.sourceType === "workflow-step") { + if (workflowNames.has(source.id)) { + cgsTarget = target("workflow", source.id, "src/workflows.ts", config); + decision = "adapt"; + status = "implemented"; + rationale = "Workflow exists; add CCGS-style phase/artifact semantics where useful."; + ownerPath = "src/workflows.ts"; + testPath = "tests/workflow-recipes.test.ts"; + } else { + cgsTarget = target("workflow", source.id, "src/workflow-catalog.ts", config); + decision = "adopt"; + rationale = "CCGS catalog step is missing and should be represented in the CGS phase catalog or as a workflow alias."; + ownerPath = "src/workflow-catalog.ts"; + testPath = "tests/workflow-catalog.test.ts"; + } + } else if (source.sourceType === "template") { + if (templateNames.has(source.id)) { + cgsTarget = target("template", source.id, "templates/", config); + decision = "adapt"; + status = "implemented"; + rationale = "Template equivalent exists; compare body quality and update if thinner."; + ownerPath = "templates/"; + testPath = "tests/agents-templates.test.ts"; + } else { + cgsTarget = target("template", source.id, "templates/", config); + decision = "adopt"; + rationale = "CCGS template has no CGS equivalent yet."; + ownerPath = "templates/"; + testPath = "tests/agents-templates.test.ts"; + } + } else { + cgsTarget = target("rule", source.id, "src/skills.ts", config); + decision = "adapt"; + rationale = "CCGS coding rule intent should become skills, AGENTS guidance, or selected context, not `.codex/rules/*.rules`."; + ownerPath = "src/skills.ts"; + testPath = "tests/codex-context-files.test.ts"; + } + + return { sourceType: source.sourceType, sourceId: source.id, sourcePath: source.sourcePath, sourceHash: source.sha256, cgsTarget, decision, rationale, scores: scoreSurface(source), ownerPath, testPath, status }; +} + +export function generateParityMatrix(inventory: CcgsInventory, config: ProjectConfig): ParityMatrix { + const rows = [...inventory.agents, ...inventory.skills, ...inventory.workflowSteps, ...inventory.templates, ...inventory.rules].map((source) => rowForSource(source, config)); + const counts = { + agent: inventory.agents.length, + skill: inventory.skills.length, + "workflow-step": inventory.workflowSteps.length, + template: inventory.templates.length, + rule: inventory.rules.length, + total: rows.length + }; + return { schemaVersion: "ccgs-surface-parity/v1", generatedAt: new Date(0).toISOString(), referenceRoot: inventory.root, counts, rows }; +} + +export function validateParityMatrix(matrix: ParityMatrix): string[] { + const errors: string[] = []; + const seen = new Set(); + for (const row of matrix.rows) { + const key = `${row.sourceType}:${row.sourceId}:${row.sourcePath}`; + if (row.sourceType !== "workflow-step" && seen.has(key)) errors.push(`duplicate row: ${key}`); + seen.add(key); + if (!row.sourceHash.match(/^[a-f0-9]{64}$/)) errors.push(`missing source hash: ${key}`); + if (!row.decision) errors.push(`missing decision: ${key}`); + if (!row.rationale.trim()) errors.push(`missing rationale: ${key}`); + if (!row.ownerPath.trim()) errors.push(`missing owner path: ${key}`); + if (!row.testPath.trim()) errors.push(`missing test path: ${key}`); + } + const counted = matrix.counts.agent + matrix.counts.skill + matrix.counts["workflow-step"] + matrix.counts.template + matrix.counts.rule; + if (counted !== matrix.rows.length || matrix.counts.total !== matrix.rows.length) errors.push(`count mismatch: counts=${counted}/${matrix.counts.total}, rows=${matrix.rows.length}`); + return errors; +} + +function decisionSummary(rows: ParityRow[]): Record { + const summary: Record = { adopt: 0, adapt: 0, merge: 0, "rename-alias": 0, defer: 0, "out-of-scope": 0 }; + for (const row of rows) summary[row.decision] += 1; + return summary; +} + +export function renderParityMatrixMarkdown(matrix: ParityMatrix): string { + const summary = decisionSummary(matrix.rows); + return [ + "# CCGS Surface Parity Matrix", + "", + `Reference root: \`${matrix.referenceRoot}\``, + "", + "## Counts", + "", + `- Agents: ${matrix.counts.agent}`, + `- Skills: ${matrix.counts.skill}`, + `- Workflow steps: ${matrix.counts["workflow-step"]}`, + `- Templates: ${matrix.counts.template}`, + `- Rules: ${matrix.counts.rule}`, + `- Total rows: ${matrix.counts.total}`, + "", + "## Decision Summary", + "", + ...Object.entries(summary).map(([decision, count]) => `- ${decision}: ${count}`), + "", + "## Rows", + "", + "| Type | Source | Decision | CGS target | Status | Rationale |", + "| --- | --- | --- | --- | --- | --- |", + ...matrix.rows.map((row) => `| ${row.sourceType} | ${row.sourceId} | ${row.decision} | ${row.cgsTarget.kind}:${row.cgsTarget.id} | ${row.status} | ${row.rationale.replace(/\|/g, "/")} |`), + "" + ].join("\n"); +} + +export function writeParityReports(matrix: ParityMatrix, outDir = "references"): void { + const errors = validateParityMatrix(matrix); + if (errors.length) throw new Error(`Invalid parity matrix:\n${errors.join("\n")}`); + mkdirSync(outDir, { recursive: true }); + writeFileSync(path.join(outDir, "ccgs-surface-parity-matrix.json"), `${JSON.stringify(matrix, null, 2)}\n`); + writeFileSync(path.join(outDir, "ccgs-surface-parity-matrix.md"), renderParityMatrixMarkdown(matrix)); +} diff --git a/src/cli.ts b/src/cli.ts index 0d52bd5..f89c557 100644 --- a/src/cli.ts +++ b/src/cli.ts @@ -88,7 +88,6 @@ function addInitCommand(name: "init" | "new"): void { .option("--monetization ", "monetization model") .option("--timeline ", "timeline") .option("--engine-version ", "engine version override") - .option("--nested", "legacy: create projects/ instead of configuring the current root") .option("--force-refresh", "refresh an existing root project with matching intent") .requiredOption("--non-interactive", "use deterministic defaults") .action((opts) => { diff --git a/src/projects.ts b/src/projects.ts index a8ec6a0..a9783f8 100644 --- a/src/projects.ts +++ b/src/projects.ts @@ -1,7 +1,7 @@ -import { existsSync, mkdirSync, readFileSync, readdirSync, writeFileSync } from "node:fs"; +import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs"; import path from "node:path"; import { activeAgentsForProject, slugify, type ProjectConfig, type ProjectMode } from "./config.js"; -import { createEngineFolders, createEngineProjectFiles, loadEngineConfigs, normalizeEngine, projectClassName, sourceRoot, unrealProjectFileName } from "./engines.js"; +import { createEngineFolders, createEngineProjectFiles, loadEngineConfigs, normalizeEngine, sourceRoot, unrealProjectFileName } from "./engines.js"; import { writeDefaultProjectCustomization, readProjectCustomization } from "./customization.js"; import { materializeEngineReferences } from "./engine-reference.js"; import { materializeAgents } from "./agents.js"; @@ -11,6 +11,7 @@ import { renderGeneratedSurfaceMetadata } from "./generated-surfaces.js"; import { packageAssetPath, resolveProjectRoot } from "./paths.js"; import { projectRoleIdsForEngine, rolePackages, type StudioRoleId } from "./roles.js"; import { workflowAliases, workflowIds, workflowRegistry, type WorkflowId } from "./workflows.js"; +import { workflowCatalogSummary } from "./workflow-catalog.js"; import { materializeSkills } from "./skills.js"; import type { StudioMode } from "./studio-policy.js"; @@ -28,7 +29,6 @@ export type InitProjectOptions = { timeline?: string; engineVersion?: string; nonInteractive?: boolean; - nested?: boolean; forceRefresh?: boolean; }; @@ -120,27 +120,6 @@ function writeStarterDocs(projectRoot: string, config: ProjectConfig): void { ); } -function assertNoSameParentCollision(parent: string, config: ProjectConfig): void { - if (!existsSync(parent)) return; - const nextClass = projectClassName(config.project.name); - for (const entry of readdirSync(parent, { withFileTypes: true })) { - if (!entry.isDirectory()) continue; - const studioPath = path.join(parent, entry.name, ".codex", "studio.json"); - if (!existsSync(studioPath)) continue; - const existing = readStudioProject(path.join(parent, entry.name)); - if (existing.name === config.project.name) continue; - if (existing.slug === config.project.slug) { - throw new Error(`Project name "${config.project.name}" collides with existing slug "${existing.slug}" in ${parent}`); - } - if (existing.engine === "unreal" || config.project.engine === "unreal") { - const existingClass = projectClassName(existing.name); - if (existingClass === nextClass) { - throw new Error(`Project name "${config.project.name}" collides with existing Unreal class name "${existingClass}" in ${parent}`); - } - } - } -} - export function studioStateFromConfig(config: ProjectConfig): StudioProjectState { return { schemaVersion: 1, @@ -261,7 +240,7 @@ function writeCodexWorkflowFiles(projectRoot: string): void { export function initProject(options: InitProjectOptions, cwd = process.cwd()): { projectRoot: string; config: ProjectConfig } { const config = defaultProjectConfig(options); - const projectRoot = path.resolve(cwd, options.nested ? path.join("projects", config.project.slug) : "."); + const projectRoot = path.resolve(cwd, "."); const studioPath = path.join(projectRoot, ".codex", "studio.json"); if (existsSync(studioPath) && !options.forceRefresh) { const existing = readStudioProject(projectRoot); @@ -269,8 +248,6 @@ export function initProject(options: InitProjectOptions, cwd = process.cwd()): { throw new Error(`Project root already contains ${existing.name}; pass --force-refresh to reinitialize`); } } - if (!existsSync(studioPath) && existsSync(projectRoot) && options.nested) throw new Error(`Project path already exists or collides: ${projectRoot}`); - if (options.nested) assertNoSameParentCollision(path.dirname(projectRoot), config); const engines = loadEngineConfigs(packageAssetPath("engine_configs")); mkdirSync(projectRoot, { recursive: true }); createEngineFolders({ projectRoot, projectSlug: config.project.slug, projectName: config.project.name, engine: config.project.engine, registry: engines }); @@ -302,6 +279,7 @@ export function statusProject(project?: string, cwd = process.cwd()): string { `active roles: ${(config.activeRoles ?? config.roles).join(", ")}`, `custom agents: .codex/agents/*.toml`, `skills: .agents/skills/*/SKILL.md`, + workflowCatalogSummary(root), `custom roles: ${customization.roles.length}, workflows: ${customization.workflows.length}, templates: ${customization.templates.length}` ].join("\n"); } diff --git a/src/roles.ts b/src/roles.ts index deb2aab..0e1eef4 100644 --- a/src/roles.ts +++ b/src/roles.ts @@ -170,7 +170,19 @@ export const rolePackages: Record = { "Convert goals into bounded production plans, milestone slices, risk lists, owner recommendations, and verification gates for Codex-executed game work.", "focused", ["Production plan", "Milestone tasks", "Risk register"], - ["Tasks are bounded", "Risks and gates are named", "Owners and verification are clear"] + ["Tasks are bounded", "Risks and gates are named", "Owners and verification are clear"], + { + responsibilities: [ + "Sprint Planning: break milestones into 1-2 week slices with small tasks, owners, estimates, dependencies, and acceptance criteria.", + "Milestone Management: track milestone goals, evidence, critical path, and risks early enough to change scope.", + "Risk Management: maintain probability, impact, owner, mitigation, and review cadence for production risks.", + "Scope Management: surface trade-offs, cut lines, deferrals, and quality impact when capacity is threatened.", + "Status Reporting: produce honest summaries of progress, blockers, decisions needed, and validation evidence." + ], + outputSchema: ["Recommendation", "Sprint or milestone plan", "Risk register", "Decision needed", "Validation gate"], + collaborationNotes: ["Present concrete options and trade-offs, then support the user's final decision.", "Escalate creative decisions to creative direction and technical architecture decisions to technical direction."], + stopConditions: ["Stop when scope, ownership, or milestone success criteria are unclear enough that planning would invent commitments."] + } ), "market-analyst": role( "market-analyst", @@ -482,6 +494,142 @@ export const rolePackages: Record = { ) }; +export const ccgsParityUpgradedRoleIds = [ + "producer", + "creative-director", + "technical-director", + "game-designer", + "systems-designer", + "gameplay-programmer", + "qa-playtester", + "release-manager", + "performance-analyst", + "data-scientist", + "senior-game-artist", + "narrative-designer", + "ui-ux-designer" +] as const satisfies readonly StudioRoleId[]; + +const ccgsParityRoleDetails: Partial>> = { + "creative-director": { + responsibilities: [ + "Own creative pillars, target fantasy, tone, emotional arc, and cross-discipline cohesion for each milestone.", + "Resolve conflicts between market promise, design scope, art/audio direction, and production capacity.", + "Translate vague creative goals into constraints that design, art, narrative, and UX roles can implement." + ], + outputSchema: ["Creative pillars", "Experience risks", "Scope decisions", "Discipline guidance", "Open questions"], + qualityGates: ["Pillars are concrete and testable", "Player fantasy is preserved across disciplines", "Cuts and trade-offs are explicit"], + reviewChecklist: ["Creative pillars are concrete", "Discipline guidance is aligned", "Scope trade-offs are named"], + collaborationNotes: ["Ask producer for capacity trade-offs and technical director for feasibility risks.", "Do not invent art, story, or feature commitments without marking them as options."], + stopConditions: ["Stop when the project concept, audience, or target experience is too ambiguous to make a creative decision without user input."] + }, + "technical-director": { + responsibilities: [ + "Own technical architecture, engine constraints, build feasibility, integration boundaries, and implementation risk for milestone slices.", + "Translate creative and design goals into technical options, risk levels, and validation gates.", + "Keep architecture decisions reviewable through ADRs, diagrams, or small source changes instead of hidden runtime rules." + ], + outputSchema: ["Architecture recommendation", "Trade-off table", "Risk register", "Validation command", "Owner handoff"], + qualityGates: ["Technical option names constraints and rollback path", "Validation evidence is concrete", "Architecture scope is reviewable"], + reviewChecklist: ["Trade-offs are explicit", "Validation gate is named", "Architecture decision is bounded"], + stopConditions: ["Stop before approving architecture when engine version, platform target, or validation access is missing."] + }, + "game-designer": { + responsibilities: [ + "Turn feature ideas into implementable mechanics, rules, tuning variables, edge cases, and player-facing acceptance criteria.", + "Connect each mechanic to the core loop, player skill expression, feedback, failure states, and progression impact.", + "Keep design outputs small enough for a programmer or artist role to implement and verify." + ], + outputSchema: ["Feature goal", "Rules and tuning", "Edge cases", "Acceptance criteria", "Implementation slice"], + qualityGates: ["Rules are testable", "Edge cases and failure states are covered", "Acceptance criteria are player-facing"], + reviewChecklist: ["Mechanic maps to core loop", "Tuning variables are named", "Implementation slice is bounded"] + }, + "systems-designer": { + responsibilities: [ + "Model interconnected systems such as progression, economy, combat, inventory, quests, rewards, and difficulty curves.", + "Expose formulas, state machines, dependencies, balancing levers, and telemetry hooks needed to validate system behavior.", + "Flag exploit loops, runaway economies, dead-end progression, and design debt before implementation." + ], + outputSchema: ["System map", "Rules/formulas", "Balancing levers", "Telemetry or test plan", "Risks"], + qualityGates: ["Dependencies and feedback loops are explicit", "Balancing levers are tunable", "Risks include exploits and progression dead ends"], + reviewChecklist: ["System dependencies are mapped", "Tuning values are inspectable", "Validation plan exists"] + }, + "gameplay-programmer": { + responsibilities: [ + "Implement playable mechanics in the active engine with small, reviewable changes and local verification evidence.", + "Preserve feel, responsiveness, determinism, input handling, and designer-tunable parameters for gameplay features.", + "Report changed files, tests or engine checks, limitations, and follow-up work without claiming unrun playtests." + ], + outputSchema: ["Implementation summary", "Changed files", "Implementation notes", "Verification evidence", "Known limits", "Designer-facing parameters", "Risks or follow-ups"], + qualityGates: ["Change is playable or clearly labeled as scaffolding", "Designer-tunable values are visible", "Verification command or manual engine check is reported"], + reviewChecklist: ["Gameplay behavior matches acceptance criteria", "Engine conventions are followed", "Verification evidence is included"] + }, + "qa-playtester": { + responsibilities: [ + "Design and execute focused playtest passes, smoke checks, regression cases, reproduction steps, and bug triage notes.", + "Separate observed facts from hypotheses, severity from priority, and blockers from polish issues.", + "Turn failures into actionable bug reports with expected behavior, actual behavior, reproduction data, and evidence." + ], + outputSchema: ["Test scope", "Pass/fail matrix", "Issue ID", "Severity", "Reproduction steps", "Expected result", "Actual result", "Evidence", "Risk summary"], + qualityGates: ["Expected vs Actual is recorded for bugs", "Severity and reproduction confidence are explicit", "Coverage gaps are named"], + reviewChecklist: ["Repro steps are actionable", "Evidence is attached or described", "Blocking issues are separated from polish"] + }, + "performance-analyst": { + responsibilities: [ + "Profile frame time, memory, loading, asset cost, networking hot spots, and platform-specific performance risks.", + "Recommend measurements, budgets, bottleneck hypotheses, and optimization order before broad rewrites.", + "Preserve player-facing quality by separating quick wins, risky optimizations, and design/art trade-offs." + ], + outputSchema: ["Performance budget", "Observed bottlenecks", "Measurement method", "Optimization plan", "Risks"], + qualityGates: ["Claims are tied to measurements or labeled hypotheses", "Optimization order is risk-aware", "Player-facing trade-offs are explicit"], + reviewChecklist: ["Budget and metric are named", "Measurement method is reproducible", "Risks and trade-offs are clear"] + }, + "data-scientist": { + responsibilities: [ + "Merge analytics-engineer responsibilities into metrics design, event taxonomy, instrumentation handoff, dashboard questions, and experiment evidence loops.", + "Define event names, trigger conditions, properties, privacy constraints, and validation queries that support design and production decisions.", + "Keep analytics recommendations lightweight enough for the current milestone and explicit about what cannot be measured yet." + ], + outputSchema: ["Decision metrics", "Event taxonomy", "Instrumentation handoff", "Experiment plan", "Privacy or data risks"], + qualityGates: ["Metrics map to decisions", "Events include trigger and properties", "Privacy and instrumentation risks are named"], + reviewChecklist: ["Analytics plan is actionable", "Event schema is inspectable", "Decision loop is clear"] + }, + "senior-game-artist": { + responsibilities: [ + "Merge art-director responsibilities into visual pillars, art bible guidance, style constraints, asset quality bars, and production-ready art handoffs.", + "Translate creative direction into references, palettes, readability rules, technical limits, and milestone asset priorities.", + "Flag asset-scope, outsourcing, pipeline, and performance risks before art work expands." + ], + outputSchema: ["Visual pillars", "Art bible updates", "Asset priorities", "Quality bar", "Pipeline risks"], + qualityGates: ["Style constraints are concrete", "Asset scope matches milestone capacity", "Technical limits and readability are considered"], + reviewChecklist: ["Visual direction is shippable", "Asset handoff is clear", "Pipeline risks are named"] + }, + "narrative-designer": { + responsibilities: [ + "Merge narrative-director responsibilities into story pillars, tone, world rules, character arcs, content scope, and implementation-ready narrative briefs.", + "Keep narrative content aligned with gameplay verbs, player onboarding, localization constraints, and production capacity.", + "Separate canon decisions, draft text, content tasks, and open creative questions." + ], + outputSchema: ["Narrative pillars", "World or character rules", "Content list", "Draft text", "Open questions"], + qualityGates: ["Tone and canon are consistent", "Content scope is shippable", "Implementation and localization constraints are explicit"], + reviewChecklist: ["Narrative brief is coherent", "Content list is scoped", "Open questions are separated"] + }, + "ui-ux-designer": { + responsibilities: [ + "Merge UX-designer responsibilities into player journeys, information architecture, HUD/menu flows, accessibility, usability risks, and implementation handoffs.", + "Document states, errors, empty/loading conditions, input modality needs, and acceptance criteria for UI implementation.", + "Balance usability, aesthetics, production scope, and accessibility without hiding unresolved design decisions." + ], + outputSchema: ["Player journey", "Screen or HUD spec", "Interaction states", "Accessibility notes", "Implementation handoff"], + qualityGates: ["User flow covers error and empty states", "Accessibility constraints are named", "Acceptance criteria are implementable"], + reviewChecklist: ["Journey is testable", "UI states are complete", "Accessibility and implementation risks are clear"] + } +}; + +for (const roleId of ccgsParityUpgradedRoleIds) { + Object.assign(rolePackages[roleId], ccgsParityRoleDetails[roleId]); +} + export function isStudioRoleId(value: string): value is StudioRoleId { return (studioRoleIds as readonly string[]).includes(value); } diff --git a/src/skills.ts b/src/skills.ts index 1b5924f..010ca92 100644 --- a/src/skills.ts +++ b/src/skills.ts @@ -10,132 +10,284 @@ export type GeneratedSkillDefinition = { sourceId: string; body: string; sourceInput: unknown; + requiredMarkers: string[]; }; -const firstPassWorkflowSkills: WorkflowId[] = ["bugfix", "vertical-slice", "ui-ux-review", "release-checklist"]; +type SkillGroup = "onboarding" | "design" | "architecture" | "production" | "build-validation" | "release-ops" | "team" | "standards"; -const standardsSkills = [ - { - name: "cgs-standards-gameplay", - sourceId: "standards-gameplay", - description: "Use for gameplay code standards in Codex Game Studio repositories: mechanics, tuning, data-driven values, and engine idioms.", - title: "Gameplay Standards", - procedure: ["Keep gameplay values data-driven.", "Keep engine code separate from UI state.", "Verify mechanics with focused tests or playable checks."] - }, - { - name: "cgs-standards-tests", - sourceId: "standards-tests", - description: "Use for Codex Game Studio test standards: unit, integration, engine smoke, playtest, and regression coverage.", - title: "Test Standards", - procedure: ["Name the behavior under test.", "Run the narrow test first, then the relevant suite.", "Record verification evidence in the handoff."] - }, - { - name: "cgs-standards-prototype", - sourceId: "standards-prototype", - description: "Use for prototype code standards in Codex Game Studio repositories: fast experiments with explicit hypotheses and cleanup boundaries.", - title: "Prototype Standards", - procedure: ["State the prototype hypothesis.", "Keep throwaway code isolated from production paths.", "Document what graduates or gets deleted."] - }, - { - name: "cgs-standards-ui", - sourceId: "standards-ui", - description: "Use for UI and UX implementation standards in Codex Game Studio repositories: HUD, menus, accessibility, localization, and input states.", - title: "UI Standards", - procedure: ["Keep UI from owning gameplay state.", "Support keyboard/controller navigation where relevant.", "Keep text localization-ready."] +type SkillProfile = { + id: string; + group: SkillGroup; + title: string; + description: string; + objective: string; + context: string[]; + phases: string[]; + writeTargets: string[]; + report: string[]; + markers: string[]; + workflowId?: WorkflowId; +}; + +const workflowSkillIds = new Set([ + "architecture-decision", + "architecture-review", + "brainstorm", + "bugfix", + "create-epics", + "create-stories", + "hotfix", + "perf-profile", + "prototype", + "qa-plan", + "regression-suite", + "release-checklist", + "security-audit", + "sprint-plan", + "sprint-status", + "story-done", + "story-readiness", + "ui-ux-review", + "vertical-slice" +]); + +const skillProfiles: SkillProfile[] = [ + profile("start", "onboarding", "Start", "Clarify the game concept, engine, production mode, first milestone, and next required artifact.", ["Project Stage", "Engine Choice", "First Milestone", "Validation Gate"]), + profile("onboard", "onboarding", "Onboard", "Orient a new contributor or agent to project state, file layout, stage, risks, and next work.", ["Project Map", "Current Stage", "Open Risks", "Next Owner"]), + profile("adopt", "onboarding", "Adopt Existing Project", "Inventory existing source, assets, docs, and tests before mapping work into CGS structure.", ["Inventory", "Migration Map", "Do Not Move First", "Adoption Risks"]), + profile("setup-engine", "onboarding", "Setup Engine", "Pin engine version, verify project markers, document conventions, and run engine smoke checks.", ["Engine Version", "Project Markers", "Naming Conventions", "Smoke Check"]), + profile("help", "onboarding", "Help", "Summarize available CGS workflows, next phase options, required artifacts, and safe commands.", ["Available Workflows", "Next Step", "Required Artifact", "Command Help"]), + profile("project-stage-detect", "onboarding", "Project Stage Detect", "Detect whether the project is in concept, design, technical setup, pre-production, production, polish, or release.", ["Stage Evidence", "Missing Required Artifact", "Recommended Phase", "Confidence"]), + + profile("brainstorm", "design", "Brainstorm", "Explore the game idea with player fantasy, verbs, pillars, audience, constraints, and scope tiers.", ["Core Fantasy", "Player Verbs", "Pillars", "Scope Tiers"]), + profile("quick-design", "design", "Quick Design", "Draft a constrained design slice fast while preserving pillars, assumptions, and open questions.", ["Design Hypothesis", "Constraints", "Acceptance Criteria", "Open Questions"]), + profile("map-systems", "design", "Map Systems", "Decompose the concept into game systems with dependency order, priority tiers, and validation needs.", ["Systems Map", "Dependency Order", "Priority Tier", "Validation Need"]), + profile("design-system", "design", "Design System", "Author a system GDD with rules, data, edge cases, progression, feedback, and implementation acceptance tests.", ["System Rules", "Balance Levers", "Edge Cases", "Acceptance Tests"]), + profile("design-review", "design", "Design Review", "Review design artifacts against pillars, player experience, production scope, and downstream implementation risk.", ["Pillar Fit", "Scope Risk", "Contradictions", "Review Verdict"]), + profile("review-all-gdds", "design", "Review All GDDs", "Cross-check all GDDs for consistency, missing systems, dependency conflicts, and production readiness.", ["GDD Coverage", "Contradictions", "Missing Systems", "Readiness Verdict"]), + profile("art-bible", "design", "Art Bible", "Define visual identity, shape language, palette, camera, animation, UI style, and asset constraints.", ["Visual Identity", "Shape Language", "Palette", "Asset Constraints"]), + profile("asset-spec", "design", "Asset Spec", "Specify an individual asset with purpose, constraints, references, dimensions, states, and acceptance criteria.", ["Asset Purpose", "States", "Technical Constraints", "Acceptance Criteria"]), + profile("asset-audit", "design", "Asset Audit", "Audit game assets for completeness, naming, import settings, ownership, licensing, and production risk.", ["Asset Inventory", "Import Risk", "Missing Asset", "Licensing Note"]), + profile("ux-design", "design", "UX Design", "Design user journeys, menus, HUD, onboarding, input states, accessibility, and localization-ready UX copy.", ["Player Journey", "HUD State", "Input Path", "Accessibility"]), + profile("ux-review", "design", "UX Review", "Review UX flows for clarity, friction, accessibility, localization, controller support, and player comprehension.", ["Friction", "Comprehension", "Accessibility", "UX Verdict"]), + profile("ui-ux-review", "design", "UI UX Review", "Review UI and UX implementation for clarity, accessibility, localization, controller support, and player comprehension.", ["Friction", "Comprehension", "Accessibility", "UX Verdict"]), + profile("balance-check", "design", "Balance Check", "Evaluate tuning values, progression pacing, economy levers, exploits, and player-skill assumptions.", ["Balance Lever", "Exploit Risk", "Pacing", "Telemetry Need"]), + profile("consistency-check", "design", "Consistency Check", "Find contradictions across design, narrative, systems, UI, content, and implementation artifacts.", ["Contradiction", "Canonical Source", "Affected Files", "Resolution"]), + profile("content-audit", "design", "Content Audit", "Audit content coverage, duplication, tone consistency, localization needs, and production completeness.", ["Content Inventory", "Tone Drift", "Localization Need", "Gap List"]), + profile("propagate-design-change", "design", "Propagate Design Change", "Trace a design change through systems, docs, tasks, tests, content, and release risk.", ["Change Summary", "Affected Systems", "Required Updates", "Regression Risk"]), + profile("reverse-document", "design", "Reverse Document", "Create design or technical documentation from existing implementation without inventing unverified behavior.", ["Observed Behavior", "Evidence Path", "Unknowns", "Documentation Draft"]), + + profile("create-architecture", "architecture", "Create Architecture", "Design the technical architecture, layers, data ownership, engine boundaries, and control manifest.", ["Architecture Layers", "Data Ownership", "Engine Boundary", "Control Manifest"]), + profile("create-control-manifest", "architecture", "Create Control Manifest", "Define implementation rules, boundaries, allowed dependencies, validation commands, and review gates.", ["Layer Rules", "Allowed Dependency", "Validation Command", "Review Gate"]), + profile("architecture-decision", "architecture", "Architecture Decision", "Write an ADR with context, options, decision, consequences, validation, and rollback.", ["Context", "Options", "Decision", "Consequences"]), + profile("architecture-review", "architecture", "Architecture Review", "Review architecture for layer violations, scalability risks, engine misuse, testing seams, and production readiness.", ["Layer Violation", "Scalability Risk", "Testing Seam", "Architecture Verdict"]), + profile("code-review", "architecture", "Code Review", "Review changes for correctness, maintainability, security, tests, engine idioms, and scope control.", ["Correctness", "Maintainability", "Security", "Review Verdict"]), + profile("dev-story", "production", "Development Story", "Turn a design or bug into an implementation-ready story with owner, files, acceptance tests, and dependencies.", ["Story Goal", "Owner", "Dependencies", "Acceptance Tests"]), + profile("create-epics", "production", "Create Epics", "Break project goals into epics with outcomes, dependencies, risks, and validation gates.", ["Epic Outcome", "Dependencies", "Risk", "Gate"]), + profile("create-stories", "production", "Create Stories", "Break an epic into small stories with acceptance criteria, owner role, files, and verification.", ["Story", "Acceptance Criteria", "Owner Role", "Verification"]), + profile("estimate", "production", "Estimate", "Estimate scope using uncertainty, dependencies, discipline handoffs, risk buffers, and confidence ranges.", ["Estimate Range", "Confidence", "Dependency", "Buffer"]), + profile("sprint-plan", "production", "Sprint Plan", "Create a 1-2 week sprint plan with goals, tasks, owners, dependencies, risks, and acceptance criteria.", ["Sprint Goals", "Task Table", "Owner", "Risk Register"]), + profile("sprint-status", "production", "Sprint Status", "Report sprint progress, blockers, risk changes, completed work, and next decisions.", ["Progress", "Blocker", "Risk Change", "Next Decision"]), + profile("scope-check", "production", "Scope Check", "Assess whether requested work fits the milestone and propose cuts, deferrals, or safer slices.", ["Scope Fit", "Cut Option", "Deferral", "Recommendation"]), + profile("milestone-review", "production", "Milestone Review", "Review milestone readiness, completed evidence, blockers, carryover, and phase transition risk.", ["Milestone Goal", "Evidence", "Blocker", "Transition Verdict"]), + profile("story-readiness", "production", "Story Readiness", "Check if a story is implementable with clear inputs, acceptance criteria, dependencies, and validation.", ["Ready", "Missing Input", "Dependency", "Acceptance Criteria"]), + profile("story-done", "production", "Story Done", "Check if a story is complete with changed files, tests, acceptance evidence, and handoff notes.", ["Done Verdict", "Changed Files", "Evidence", "Follow-up"]), + profile("gate-check", "production", "Gate Check", "Run an advisory phase or artifact gate with criteria, evidence, concerns, and user-controlled next decision.", ["Gate Criteria", "Evidence", "Concerns", "Verdict"]), + + profile("prototype", "build-validation", "Prototype", "Build or plan a throwaway concept prototype around a falsifiable design hypothesis and cleanup boundary.", ["Prototype Hypothesis", "Throwaway Boundary", "Success Signal", "Cleanup"]), + profile("bugfix", "build-validation", "Bugfix", "Fix a bounded bug with reproduction evidence, minimal change, regression coverage, and handoff notes.", ["Reproduction", "Minimal Fix", "Regression Test", "Evidence"]), + profile("vertical-slice", "build-validation", "Vertical Slice", "Validate whether a full game loop can be built at representative quality before production commitment.", ["Validation Question", "Scope Discipline", "Recovery Checkpoint", "Playtest Debrief", "PROCEED / PIVOT / KILL"]), + profile("bug-report", "build-validation", "Bug Report", "Capture a reproducible bug with environment, steps, expected/actual behavior, severity, evidence, and owner.", ["Reproduction Steps", "Expected vs Actual", "Evidence", "Severity"]), + profile("bug-triage", "build-validation", "Bug Triage", "Classify bugs by severity, priority, reproduction confidence, owner role, risk, and release impact.", ["Severity", "Priority", "Owner", "Release Impact"]), + profile("qa-plan", "build-validation", "QA Plan", "Plan focused QA coverage across features, risks, platforms, devices, regressions, and acceptance criteria.", ["Test Matrix", "Risk Coverage", "Acceptance Criteria", "Evidence"]), + profile("playtest-report", "build-validation", "Playtest Report", "Capture player observations, comprehension, friction, loop completion, bugs, quotes, and design implications.", ["Loop Completion", "Friction", "Observation", "Design Implication"]), + profile("regression-suite", "build-validation", "Regression Suite", "Define or run regression coverage for changed systems, prior bugs, critical paths, and release blockers.", ["Critical Path", "Prior Bug", "Regression Case", "Result"]), + profile("smoke-check", "build-validation", "Smoke Check", "Run the fastest useful checks proving the project opens, builds, starts, and reaches a basic playable state.", ["Launch", "Build", "Basic Play", "Smoke Result"]), + profile("soak-test", "build-validation", "Soak Test", "Plan longer stability checks for memory, performance drift, save/load, networking, and live-ops loops.", ["Duration", "Metric", "Failure Threshold", "Soak Result"]), + profile("test-setup", "build-validation", "Test Setup", "Configure test harnesses, fixtures, commands, and documentation so validation is repeatable.", ["Test Command", "Fixture", "Harness", "Repeatability"]), + profile("test-helpers", "build-validation", "Test Helpers", "Design reusable test helpers without hiding assertions, over-mocking, or coupling tests to implementation details.", ["Helper Purpose", "Assertion Boundary", "Fixture Shape", "Misuse Guard"]), + profile("test-flakiness", "build-validation", "Test Flakiness", "Diagnose flaky tests by isolating timing, randomness, ordering, environment, and cleanup causes.", ["Failure Pattern", "Isolation", "Root Cause", "Stabilization"]), + profile("test-evidence-review", "build-validation", "Test Evidence Review", "Review validation output, logs, screenshots, recordings, and manual checks for sufficiency and gaps.", ["Evidence", "Gap", "Confidence", "Follow-up"]), + profile("skill-test", "build-validation", "Skill Test", "Test a repository skill against fixtures, required sections, dry-runs, and behavioral expectations.", ["Skill Fixture", "Required Marker", "Dry Run", "Verdict"]), + profile("skill-improve", "build-validation", "Skill Improve", "Improve a skill after observed failures while preserving trigger, procedure, validation, and handoff clarity.", ["Observed Failure", "Procedure Fix", "Regression Test", "Skill Handoff"]), + + profile("release-checklist", "release-ops", "Release Checklist", "Check build, packaging, store, QA, localization, accessibility, rollback, and ship/no-ship readiness.", ["Build Evidence", "Blocking Issues", "Rollback", "Ship Verdict"]), + profile("launch-checklist", "release-ops", "Launch Checklist", "Coordinate day-of-launch readiness, monitoring, community, support, rollback, and hotfix paths.", ["Launch Readiness", "Monitoring", "Support", "Rollback"]), + profile("hotfix", "release-ops", "Hotfix", "Scope and execute an urgent fix with reproduction, minimal change, verification, release notes, and rollback.", ["Incident", "Minimal Fix", "Verification", "Rollback"]), + profile("day-one-patch", "release-ops", "Day One Patch", "Plan launch-window fixes, risk acceptance, validation, platform submission, and player communication.", ["Patch Scope", "Risk", "Submission", "Player Communication"]), + profile("patch-notes", "release-ops", "Patch Notes", "Write player-facing patch notes with fixes, known issues, balance changes, and verification caveats.", ["Player Summary", "Fix List", "Known Issues", "Version"]), + profile("changelog", "release-ops", "Changelog", "Maintain a developer-facing changelog grouped by feature, fix, content, performance, and breaking change.", ["Added", "Changed", "Fixed", "Breaking"]), + profile("localize", "release-ops", "Localize", "Plan localization keys, context, screenshots, pluralization, text expansion, and review workflow.", ["String Context", "Text Expansion", "Locale Risk", "Review"]), + profile("security-audit", "release-ops", "Security Audit", "Audit secrets, network surfaces, auth, saves, platform APIs, dependencies, and exploit risks.", ["Secret", "Attack Surface", "Exploit Risk", "Mitigation"]), + profile("perf-profile", "release-ops", "Performance Profile", "Profile frame time, memory, loading, assets, rendering, scripting, and platform constraints.", ["Metric", "Budget", "Bottleneck", "Optimization"]), + profile("tech-debt", "release-ops", "Tech Debt", "Identify technical debt, production risk, payoff, safe refactor slices, and validation needed.", ["Debt Item", "Risk", "Payoff", "Refactor Slice"]), + profile("retrospective", "release-ops", "Retrospective", "Facilitate a retrospective with what worked, what failed, root causes, actions, and owner follow-up.", ["Went Well", "Did Not Work", "Root Cause", "Action Item"]), + + profile("team-audio", "team", "Team Audio", "Coordinate audio design, implementation, asset readiness, mix targets, and QA for audio work.", ["Audio Goal", "Asset Need", "Mix Target", "QA Note"]), + profile("team-combat", "team", "Team Combat", "Coordinate combat design, implementation, tuning, animation, VFX, audio, and QA handoffs.", ["Combat Goal", "Tuning", "Feedback", "QA Scenario"]), + profile("team-level", "team", "Team Level", "Coordinate level design, blockout, art, scripting, lighting, optimization, and playtest handoffs.", ["Level Goal", "Blockout", "Art Pass", "Playtest"]), + profile("team-live-ops", "team", "Team Live Ops", "Coordinate events, telemetry, economy, content cadence, support, and incident readiness.", ["Live Event", "Telemetry", "Support", "Incident Plan"]), + profile("team-narrative", "team", "Team Narrative", "Coordinate narrative content, dialogue, localization, implementation hooks, and consistency review.", ["Narrative Goal", "Content", "Localization", "Consistency"]), + profile("team-polish", "team", "Team Polish", "Coordinate final polish across game feel, UI, audio, art, bugs, performance, and accessibility.", ["Polish Target", "Player Impact", "Risk", "Verification"]), + profile("team-qa", "team", "Team QA", "Coordinate QA coverage, bug triage, regression, platform checks, and release evidence.", ["QA Scope", "Regression", "Bug Queue", "Evidence"]), + profile("team-release", "team", "Team Release", "Coordinate release management, build pipeline, store assets, QA signoff, comms, and rollback.", ["Release Scope", "Build", "Store", "Rollback"]), + profile("team-ui", "team", "Team UI", "Coordinate UI design, implementation, accessibility, localization, controller support, and UX QA.", ["UI Flow", "Accessibility", "Localization", "Controller Support"]), + + standards("gameplay", "Gameplay Standards", "mechanics, tuning, data-driven values, engine idioms, and player-facing acceptance checks", ["Data Driven Values", "Engine Boundary", "Playable Check"]), + standards("tests", "Test Standards", "unit, integration, engine smoke, playtest, and regression coverage", ["Narrow Test", "Suite", "Evidence"]), + standards("prototype", "Prototype Standards", "fast experiments with explicit hypotheses, throwaway boundaries, and graduation criteria", ["Hypothesis", "Throwaway Boundary", "Graduation"]), + standards("ui", "UI Standards", "HUD, menus, accessibility, localization, controller navigation, and input states", ["Navigation", "Localization", "Accessibility"]) +]; + +function profile(id: string, group: SkillGroup, title: string, objective: string, markers: string[]): SkillProfile { + const workflowId = workflowSkillIds.has(id as WorkflowId) ? (id as WorkflowId) : undefined; + return { + id, + group, + title, + description: `Use for Codex Game Studio ${title.toLowerCase()} work: ${objective}`, + objective, + context: contextFor(group, id, workflowId), + phases: phasesFor(group, id, objective, markers), + writeTargets: writeTargetsFor(group, id), + report: reportFor(group, markers), + markers, + workflowId + }; +} + +function standards(id: string, title: string, objective: string, markers: string[]): SkillProfile { + return { + id: `standards-${id}`, + group: "standards", + title, + description: `Use for Codex Game Studio ${title.toLowerCase()}: ${objective}.`, + objective, + context: ["AGENTS.md", ".codex/studio.json", "task-relevant source, tests, docs, or assets"], + phases: [ + `Read the requested files and identify the ${title.toLowerCase()} rule being applied.`, + `Check ${objective}.`, + "Report violations with file paths, impact, and the smallest safe fix." + ], + writeTargets: [], + report: ["Rule applied", "Files checked", "Violations", "Verification"], + markers + }; +} + +function contextFor(group: SkillGroup, id: string, workflowId?: WorkflowId): string[] { + const common = ["AGENTS.md", ".codex/studio.json", "task-relevant files named by the user or task record"]; + const byGroup: Record = { + onboarding: ["docs/architecture/README.md", "production/timeline.md"], + design: ["design/gdd.md", "docs/market-overview.md"], + architecture: ["docs/architecture/README.md", "design/gdd.md"], + production: ["production/timeline.md", "production/session-state/active.md"], + "build-validation": ["design/gdd.md", "production/session-state/active.md", "tests/"], + "release-ops": ["production/timeline.md", "docs/market-overview.md", "tests/"], + team: ["design/gdd.md", "production/timeline.md", "task-relevant team files"], + standards: [] + }; + return [...common, ...byGroup[group], ...(workflowId && workflowRegistry[workflowId] ? [workflowRegistry[workflowId].file] : []), ...(id === "vertical-slice" ? ["docs/architecture/README.md"] : [])]; +} + +function phasesFor(group: SkillGroup, id: string, objective: string, markers: string[]): string[] { + if (id === "vertical-slice") { + return [ + "Resolve review mode and load concept, systems, architecture, UX, production timeline, and active risks.", + "Frame the Validation Question: can a player experience the core fantasy in a representative complete loop, and can the team build that loop at production quality on schedule?", + "Apply Scope Discipline: target 3-5 minutes of continuous polished gameplay; cut content before cutting quality; include all systems required for one start-to-challenge-to-resolution loop.", + "Plan implementation with explicit systems, quality bar, success criteria, owner roles, and a hard time limit.", + "Set a Recovery Checkpoint in production/session-state/active.md so multi-session slice work can resume without guessing.", + "Run a Playtest Debrief that captures loop completion, first meaningful action timing, core fantasy, blockers, confusion, and build feasibility.", + "Write the verdict as PROCEED / PIVOT / KILL with evidence, risks, and next action." + ]; } -] as const; - -const onboardingSkills = [ - { - name: "cgs-start", - sourceId: "start", - description: "Use to start a newly cloned Codex Game Studio repository: clarify concept, engine, mode, and first milestone.", - title: "Start Workflow", - procedure: ["Identify whether the project has no idea, a vague concept, a clear design, or existing work.", "Select engine and mode.", "Create the first bounded milestone and validation gate."] - }, - { - name: "cgs-setup-engine", - sourceId: "setup-engine", - description: "Use to configure or verify the selected engine for a Codex Game Studio repository.", - title: "Setup Engine Workflow", - procedure: ["Confirm engine and version.", "Inspect engine project files.", "Run the engine-specific validation command when available."] - }, - { - name: "cgs-adopt", - sourceId: "adopt", - description: "Use when adopting existing game work into a Codex Game Studio repository.", - title: "Adopt Existing Project Workflow", - procedure: ["Inventory existing source, assets, docs, and tests.", "Map current state to studio roles and workflows.", "Create migration tasks without moving unrelated files first."] + if (id === "bug-report") { + return ["Capture environment, build/version, branch, and affected feature.", "Write Reproduction Steps that a different agent can follow without extra context.", "Record Expected vs Actual behavior and player impact.", "Attach Evidence such as logs, screenshots, recordings, failing tests, or engine output.", "Assign severity, likely owner role, regression risk, and verification path."]; } -] as const; + const opening = `Clarify the requested ${objective.toLowerCase()} and identify the current project stage.`; + const evidence = `Collect evidence for ${markers.slice(0, 3).join(", ")}.`; + const action = group === "design" ? "Draft or review the artifact in small sections, keeping player experience and scope visible." : group === "architecture" ? "Compare options, choose the smallest reversible technical path, and record consequences." : group === "production" ? "Break the work into owner-sized tasks with dependencies, risks, and acceptance checks." : group === "build-validation" ? "Run or define the focused validation loop before reporting conclusions." : group === "release-ops" ? "Separate blockers from warnings and include rollback or deferral options." : group === "team" ? "Coordinate handoffs between disciplines and name each owner, artifact, and validation need." : "Apply the standard and report concrete violations."; + return [opening, evidence, action, "Produce the requested artifact or review with clear file paths and verification evidence."]; +} -function skillBody(args: { title: string; intro: string; inputs: string[]; procedure: string[] }): string { +function writeTargetsFor(group: SkillGroup, id: string): string[] { + const targets: Record = { + onboarding: ["AGENTS.md", ".codex/studio.json", "production/timeline.md"], + design: ["design/"], + architecture: ["docs/architecture/"], + production: ["production/"], + "build-validation": ["tests/", "production/session-state/", "prototypes/"], + "release-ops": ["production/", "docs/"], + team: ["production/", "design/"], + standards: [] + }; + return [...targets[group], ...(id === "vertical-slice" ? ["prototypes/-vertical-slice/", "production/session-state/active.md"] : [])]; +} + +function reportFor(group: SkillGroup, markers: string[]): string[] { + return ["Summary", ...markers, group === "release-ops" ? "Blocking issues" : "Risks", "Changed files or proposed files", "Verification evidence", "Next owner or decision"]; +} + +function skillBody(profile: SkillProfile, config: ProjectConfig): string { return [ - `# ${args.title}`, + `# Codex Game Studio ${profile.title}`, "", - args.intro, + `Use this skill for ${profile.title.toLowerCase()} work in ${config.project.name}.`, + "", + "## Objective", + "", + profile.objective, "", "## Inputs", "", - ...args.inputs.map((input) => `- ${input}`), + ...profile.context.map((input) => `- ${input}`), "", "## Procedure", "", - ...args.procedure.map((step, index) => `${index + 1}. ${step}`), + ...profile.phases.map((step, index) => `${index + 1}. ${step}`), + "", + profile.writeTargets.length ? "## Write Targets" : undefined, + profile.writeTargets.length ? "" : undefined, + ...profile.writeTargets.map((target) => `- ${target}`), + profile.writeTargets.length ? "" : undefined, + "## Output Contract", + "", + ...profile.report.map((item) => `- ${item}`), + "", + "## Quality Gates", + "", + ...profile.markers.map((marker) => `- ${marker}`), + "- Scope remains bounded to the current task and project stage.", + "- Report labels unverified assumptions separately from evidence.", "", "## Handoff", "", - "Report changed files, verification evidence, and remaining risks.", + "Report changed files, verification evidence, remaining risks, and the next owner or decision. Do not imply hidden hooks or autonomous background work.", "" - ].join("\n"); + ] + .filter((line): line is string => line !== undefined) + .join("\n"); } function renderSkill(definition: GeneratedSkillDefinition): string { - const body = [ - "---", - `name: ${definition.name}`, - `description: ${definition.description}`, - "---", - "", - definition.body.trimEnd(), - "" - ].join("\n"); + const body = ["---", `name: ${definition.name}`, `description: ${definition.description}`, "---", "", definition.body.trimEnd(), ""].join("\n"); return `${renderGeneratedSurfaceMetadata({ surface: "skill", id: definition.name, sourceInput: definition.sourceInput, body })}${body}`; } export function generatedSkillDefinitions(config: ProjectConfig): GeneratedSkillDefinition[] { - const commonInputs = ["AGENTS.md", ".codex/studio.json", "task-relevant files named by the user or task record"]; - const workflowDefs = firstPassWorkflowSkills.map((id) => { - const workflow = workflowRegistry[id]; - const name = `cgs-${id}`; - return { - name, - sourceId: id, - description: `Use for Codex Game Studio ${id} workflow tasks in a game repository: ${workflow.objective}`, - body: skillBody({ - title: `Codex Game Studio ${id} Workflow`, - intro: `Use this skill for ${id} work in ${config.project.name}.`, - inputs: [...commonInputs, workflow.file], - procedure: ["Read the workflow file and task context.", "Keep changes bounded to the requested game work.", "Run focused verification before handoff."] - }), - sourceInput: { type: "workflow", id, workflow, projectMode: config.project.mode, engine: config.project.engine } - } satisfies GeneratedSkillDefinition; - }); - const onboardingDefs = onboardingSkills.map((skill) => ({ - name: skill.name, - sourceId: skill.sourceId, - description: skill.description, - body: skillBody({ title: `Codex Game Studio ${skill.title}`, intro: `Use this skill in ${config.project.name}.`, inputs: commonInputs, procedure: [...skill.procedure] }), - sourceInput: { type: "onboarding", ...skill, projectMode: config.project.mode, engine: config.project.engine } + return skillProfiles.map((profile) => ({ + name: `cgs-${profile.id}`, + sourceId: profile.id, + description: profile.description, + body: skillBody(profile, config), + sourceInput: { type: "ccgs-parity-skill", profile, projectMode: config.project.mode, engine: config.project.engine }, + requiredMarkers: profile.markers })); - const standardDefs = standardsSkills.map((skill) => ({ - name: skill.name, - sourceId: skill.sourceId, - description: skill.description, - body: skillBody({ title: `Codex Game Studio ${skill.title}`, intro: `Use this standards skill in ${config.project.name}.`, inputs: commonInputs, procedure: [...skill.procedure] }), - sourceInput: { type: "standards", ...skill, projectMode: config.project.mode, engine: config.project.engine } - })); - return [...onboardingDefs, ...workflowDefs, ...standardDefs]; +} + +export function generatedSkillRequiredMarkers(): Record { + return Object.fromEntries(skillProfiles.map((profile) => [`cgs-${profile.id}`, profile.markers])); } export function renderGeneratedSkill(definition: GeneratedSkillDefinition): string { diff --git a/src/validation.ts b/src/validation.ts index c2287ce..c1eb1d1 100644 --- a/src/validation.ts +++ b/src/validation.ts @@ -234,6 +234,20 @@ function customAgentChecks(projectRoot: string, role: StudioRoleId, studio: Stud ]; } + +function slugCheckId(value: string): string { + return value.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-|-$/g, "") || "marker"; +} + +function sectionBody(body: string, heading: string): string { + const marker = `## ${heading}`; + const start = body.indexOf(marker); + if (start === -1) return ""; + const after = body.slice(start + marker.length); + const next = after.search(/\n## /); + return next === -1 ? after : after.slice(0, next); +} + function skillChecks(projectRoot: string, studio: StudioProjectState): ValidationCheck[] { const checks: ValidationCheck[] = []; for (const definition of generatedSkillDefinitions(configFromStudio(studio))) { @@ -247,6 +261,12 @@ function skillChecks(projectRoot: string, studio: StudioProjectState): Validatio checks.push(body.includes(`\nname: ${definition.name}\n`) ? pass(`codex.skill.${definition.name}.name`, `${definition.name} metadata has name`, file) : fail(`codex.skill.${definition.name}.name`, `${definition.name} metadata missing name`, file)); checks.push(body.includes("\ndescription: ") ? pass(`codex.skill.${definition.name}.description`, `${definition.name} metadata has description`, file) : fail(`codex.skill.${definition.name}.description`, `${definition.name} metadata missing description`, file)); checks.push(body === renderGeneratedSkill(definition) ? pass(`codex.skill.${definition.name}.freshness`, `${definition.name} skill is fresh`, file) : fail(`codex.skill.${definition.name}.freshness`, `${definition.name} skill is stale`, file)); + const qualityGates = sectionBody(body, "Quality Gates"); + for (const marker of definition.requiredMarkers ?? []) { + const id = `codex.skill.${definition.name}.marker.${slugCheckId(marker)}`; + const expectedBullet = `- ${marker}`; + checks.push(qualityGates.includes(expectedBullet) ? pass(id, `${definition.name} includes ${marker}`, file) : fail(id, `${definition.name} missing required marker ${marker}`, file)); + } } return checks; } diff --git a/src/workflow-catalog.ts b/src/workflow-catalog.ts new file mode 100644 index 0000000..b5eca9b --- /dev/null +++ b/src/workflow-catalog.ts @@ -0,0 +1,115 @@ +import { existsSync, readFileSync } from "node:fs"; +import path from "node:path"; + +export type WorkflowArtifactCheck = { + path: string; + pattern?: string; + note?: string; +}; + +export type WorkflowCatalogStep = { + id: string; + label: string; + command: string; + required: boolean; + repeatable?: boolean; + artifact?: WorkflowArtifactCheck; + description: string; +}; + +export type WorkflowCatalogPhase = { + id: string; + label: string; + description: string; + nextPhase?: string; + steps: WorkflowCatalogStep[]; +}; + +export const workflowCatalog: { phases: WorkflowCatalogPhase[] } = { + phases: [ + { + id: "concept", + label: "Concept", + description: "Develop a game idea into a documented concept and initial production constraints.", + nextPhase: "systems-design", + steps: [ + { id: "brainstorm", label: "Brainstorm", command: "./codex-game-studio run creative-director", required: false, description: "Explore fantasy, verbs, pillars, audience, and scope tiers." }, + { id: "setup-engine", label: "Engine Setup", command: "use skill cgs-setup-engine", required: true, artifact: { path: ".codex/studio.json", pattern: "\"engine\"" }, description: "Configure engine and version." }, + { id: "game-concept", label: "Game Concept", command: "use skill cgs-brainstorm", required: true, artifact: { path: "design/gdd.md" }, description: "Capture concept, pillars, and initial player promise." }, + { id: "art-bible", label: "Art Bible", command: "use skill cgs-art-bible", required: false, artifact: { path: "design/art/art-bible.md" }, description: "Define visual identity and asset constraints." }, + { id: "map-systems", label: "Systems Map", command: "use skill cgs-map-systems", required: true, artifact: { path: "design/gdd.md", pattern: "System" }, description: "Map systems and dependencies." } + ] + }, + { + id: "systems-design", + label: "Systems Design", + description: "Turn the concept into implementable systems, UX, and architecture.", + nextPhase: "technical-setup", + steps: [ + { id: "design-system", label: "System GDDs", command: "use skill cgs-design-system", required: true, repeatable: true, artifact: { path: "design/gdd.md" }, description: "Author or update per-system GDD content." }, + { id: "ux-design", label: "UX Design", command: "use skill cgs-ux-design", required: false, artifact: { path: "design/ux/ux-spec.md" }, description: "Document player journeys, HUD, menus, and accessibility." }, + { id: "create-architecture", label: "Architecture", command: "use skill cgs-create-architecture", required: true, artifact: { path: "docs/architecture/README.md" }, description: "Define technical architecture and implementation boundaries." }, + { id: "design-review", label: "Design Review", command: "use skill cgs-design-review", required: false, description: "Review design consistency and scope risk." } + ] + }, + { + id: "pre-production", + label: "Pre-Production", + description: "Validate build feasibility and production readiness.", + nextPhase: "production", + steps: [ + { id: "vertical-slice", label: "Vertical Slice", command: "use skill cgs-vertical-slice", required: true, artifact: { path: "production/session-state/active.md", pattern: "PROCEED" }, description: "Validate representative full-loop feasibility." }, + { id: "qa-plan", label: "QA Plan", command: "use skill cgs-qa-plan", required: true, artifact: { path: "tests/qa-plan.md" }, description: "Plan QA coverage before production." }, + { id: "scope-check", label: "Scope Check", command: "use skill cgs-scope-check", required: false, description: "Check production scope and cuts." } + ] + }, + { + id: "release", + label: "Release", + description: "Validate release readiness and launch operations.", + steps: [ + { id: "release-checklist", label: "Release Checklist", command: "use skill cgs-release-checklist", required: true, artifact: { path: "production/release-checklist.md" }, description: "Verify ship/no-ship readiness." }, + { id: "launch-checklist", label: "Launch Checklist", command: "use skill cgs-launch-checklist", required: false, artifact: { path: "production/launch-checklist.md" }, description: "Coordinate launch-day readiness." }, + { id: "changelog", label: "Changelog", command: "use skill cgs-changelog", required: true, artifact: { path: "docs/changelog.md" }, description: "Prepare player/developer-visible changes." } + ] + } + ] +}; + +export function artifactStatus(projectRoot: string, artifact: WorkflowArtifactCheck): { status: "complete" | "missing" | "incomplete"; path: string; reason: string } { + const file = path.join(projectRoot, artifact.path); + if (!existsSync(file)) return { status: "missing", path: artifact.path, reason: "file missing" }; + if (artifact.pattern) { + let pattern: RegExp; + try { + pattern = new RegExp(artifact.pattern); + } catch (error) { + return { status: "incomplete", path: artifact.path, reason: `invalid pattern: ${(error as Error).message}` }; + } + if (!pattern.test(readFileSync(file, "utf8"))) return { status: "incomplete", path: artifact.path, reason: `pattern not found: ${artifact.pattern}` }; + } + return { status: "complete", path: artifact.path, reason: "artifact present" }; +} + +function requiredStepStatus(projectRoot: string, step: WorkflowCatalogStep): "complete" | "missing" | "incomplete" { + return step.artifact ? artifactStatus(projectRoot, step.artifact).status : "incomplete"; +} + +function nextIncompletePhase(projectRoot: string): WorkflowCatalogPhase { + for (const phase of workflowCatalog.phases) { + const required = phase.steps.filter((step) => step.required); + if (required.some((step) => requiredStepStatus(projectRoot, step) !== "complete")) return phase; + } + return workflowCatalog.phases[workflowCatalog.phases.length - 1]; +} + +export function workflowCatalogSummary(projectRoot: string): string { + const phase = nextIncompletePhase(projectRoot); + const required = phase.steps.filter((step) => step.required); + const lines = [`workflow phase: ${phase.id}`, "required next steps:"]; + for (const step of required) { + const status = requiredStepStatus(projectRoot, step); + lines.push(`- ${step.id}: ${status} (${step.command})`); + } + return lines.join("\n"); +} diff --git a/tests/agents-templates.test.ts b/tests/agents-templates.test.ts index 7f2bfd2..dc96033 100644 --- a/tests/agents-templates.test.ts +++ b/tests/agents-templates.test.ts @@ -1,9 +1,10 @@ import { existsSync, mkdtempSync, readFileSync } from "node:fs"; import { tmpdir } from "node:os"; import path from "node:path"; -import { describe, expect, test } from "vitest"; +import { describe, test } from "node:test"; +import { expect } from "expect"; import { activeAgentsForMode, canonicalProjectConfigJson, guidanceConfigHash, projectConfigSchema, slugify } from "../src/config.js"; -import { renderProjectRolePrompt, validateBaseAgents } from "../src/agents.js"; +import { renderProjectCustomAgentToml, renderProjectRolePrompt, validateBaseAgents } from "../src/agents.js"; import { loadEngineConfigs } from "../src/engines.js"; import { packageAssetPath } from "../src/paths.js"; import { defaultProjectConfig, initProject } from "../src/projects.js"; @@ -115,6 +116,7 @@ describe("config, agents, and templates", () => { const engines = loadEngineConfigs(packageAssetPath("engine_configs")); const config = defaultProjectConfig({ name: "Prompt Depth Game", engine: "godot", mode: "development", nonInteractive: true }); const release = renderProjectRolePrompt("release-manager", config, engines); + const producerToml = renderProjectCustomAgentToml("producer", config, engines); for (const section of [ "## Responsibilities", @@ -125,12 +127,18 @@ describe("config, agents, and templates", () => { "## Stop Conditions" ]) { expect(release).toContain(section); + expect(producerToml).toContain(section); } expect(release).toContain("Release decision"); expect(release).toContain("Blocking issues"); expect(release).toContain("Validation evidence"); + expect(producerToml).toContain("Sprint Planning"); + expect(producerToml).toContain("Risk Management"); + expect(producerToml).toContain("Scope Management"); + expect(producerToml).toContain("Validation gate"); expect(release).toContain("Stop and report a blocker"); expect(release.length).toBeLessThan(15000); + expect(producerToml.length).toBeLessThan(15000); expect(release).not.toContain("# Gameplay Programmer"); expect(release).not.toContain("templates/gdd_template.md"); expect(release).not.toContain("docs/engine-reference/unity/"); diff --git a/tests/approval-gates.test.ts b/tests/approval-gates.test.ts index bdb9fa7..2a53ebf 100644 --- a/tests/approval-gates.test.ts +++ b/tests/approval-gates.test.ts @@ -2,7 +2,8 @@ import { mkdirSync, symlinkSync } from "node:fs"; import { mkdtempSync } from "node:fs"; import { tmpdir } from "node:os"; import path from "node:path"; -import { describe, expect, test } from "vitest"; +import { describe, test } from "node:test"; +import { expect } from "expect"; import { approvalMatches, approvalStages, diff --git a/tests/behavioral-evaluation.test.ts b/tests/behavioral-evaluation.test.ts index a268ee7..be24617 100644 --- a/tests/behavioral-evaluation.test.ts +++ b/tests/behavioral-evaluation.test.ts @@ -1,4 +1,5 @@ -import { describe, expect, test } from "vitest"; +import { describe, test } from "node:test"; +import { expect } from "expect"; import { mkdtempSync } from "node:fs"; import { tmpdir } from "node:os"; import path from "node:path"; diff --git a/tests/ccgs-adaptation.test.ts b/tests/ccgs-adaptation.test.ts index 328ee9c..af85144 100644 --- a/tests/ccgs-adaptation.test.ts +++ b/tests/ccgs-adaptation.test.ts @@ -1,4 +1,5 @@ -import { describe, expect, test } from "vitest"; +import { describe, test } from "node:test"; +import { expect } from "expect"; import { ccgsInventory, ccgsRoleAdaptations, ccgsSkillAdaptations, validateCcgsAdaptation } from "../src/ccgs-adaptation.js"; import { studioRoleIds } from "../src/roles.js"; diff --git a/tests/ccgs-parity-audit.test.ts b/tests/ccgs-parity-audit.test.ts new file mode 100644 index 0000000..5abdc75 --- /dev/null +++ b/tests/ccgs-parity-audit.test.ts @@ -0,0 +1,70 @@ +import { mkdirSync, mkdtempSync, readFileSync, writeFileSync } from "node:fs"; +import { tmpdir } from "node:os"; +import path from "node:path"; +import { describe, test } from "node:test"; +import { expect } from "expect"; +import { generateParityMatrix, inventoryCcgsSurfaces, renderParityMatrixMarkdown, validateParityMatrix, writeParityReports } from "../src/ccgs-parity.js"; +import { defaultProjectConfig } from "../src/projects.js"; +import { generatedSkillDefinitions } from "../src/skills.js"; + +function fixtureRoot(): string { + const root = mkdtempSync(path.join(tmpdir(), "ccgs-fixture-")); + mkdirSync(path.join(root, ".claude", "agents"), { recursive: true }); + mkdirSync(path.join(root, ".claude", "skills", "vertical-slice"), { recursive: true }); + mkdirSync(path.join(root, ".claude", "skills", "localize"), { recursive: true }); + mkdirSync(path.join(root, ".claude", "docs"), { recursive: true }); + writeFileSync(path.join(root, ".claude", "agents", "producer.md"), `---\nname: producer\ndescription: Production owner\ntools: Read, Write, Bash\nskills: [sprint-plan, scope-check]\n---\n\n### Key Responsibilities\n\n1. Sprint Planning\n2. Risk Management\n\n## Gate Verdict Format\n\n[PR-SPRINT]: REALISTIC\n\n### Output Format\n\n## Sprint [N]\n`); + writeFileSync(path.join(root, ".claude", "agents", "writer.md"), `---\nname: writer\ndescription: Narrative writer\ntools: Read, Write\nskills: [write-copy]\n---\n\n### Key Responsibilities\n\n1. Drafting\n`); + writeFileSync(path.join(root, ".claude", "skills", "vertical-slice", "SKILL.md"), `---\nname: vertical-slice\ndescription: Build a production-quality vertical slice\nargument-hint: "[--review full|lean|solo]"\nallowed-tools: Read, Write, Bash, AskUserQuestion\nagent: prototyper\n---\n\n## Phase 1: Resolve Review Mode and Load Context\n\nRead CLAUDE.md and design/gdd/game-concept.md.\n\n## Phase 5: Playtest Debrief\n\nCollect loop completion.\n\n## Verdict\n\nPROCEED / PIVOT / KILL\n`); + writeFileSync(path.join(root, ".claude", "skills", "localize", "SKILL.md"), `---\nname: localize\ndescription: Localize player-facing text\nallowed-tools: Read, Write\nagent: localization-lead\n---\n\n## Phase 1: Load Strings\n\nRead design/gdd/game-concept.md.\n`); + writeFileSync(path.join(root, ".claude", "docs", "workflow-catalog.yaml"), `phases:\n concept:\n label: "Concept"\n next_phase: systems-design\n steps:\n - id: brainstorm\n name: "Brainstorm"\n command: /brainstorm\n required: false\n - id: game-concept\n name: "Game Concept Document"\n command: /brainstorm\n required: true\n repeatable: true\n artifact:\n glob: "design/gdd/game-concept.md"\n pattern: "# Game Concept"\n`); + return root; +} + +describe("CCGS parity audit", () => { + test("inventories agents, skills, and workflow catalog steps with stable metadata", () => { + const inventory = inventoryCcgsSurfaces(fixtureRoot()); + const verticalSlice = inventory.skills.find((skill) => skill.id === "vertical-slice"); + expect(inventory.agents[0].skills).toEqual(["sprint-plan", "scope-check"]); + expect(inventory.agents[0].sections).toEqual(expect.arrayContaining(["Key Responsibilities", "Output Format"])); + expect(inventory.agents[0].gateTokens).toContain("PR-SPRINT"); + expect(inventory.agents[0].sha256).toMatch(/^[a-f0-9]{64}$/); + expect(verticalSlice?.agent).toBe("prototyper"); + expect(verticalSlice?.argumentHint).toBe("[--review full|lean|solo]"); + expect(verticalSlice?.phaseHeadings).toContain("Phase 1: Resolve Review Mode and Load Context"); + expect(verticalSlice?.contextFiles).toEqual(expect.arrayContaining(["CLAUDE.md", "design/gdd/game-concept.md"])); + expect(verticalSlice?.verdictTokens).toEqual(expect.arrayContaining(["PROCEED", "PIVOT", "KILL"])); + expect(inventory.workflowSteps).toContainEqual(expect.objectContaining({ id: "game-concept", required: true, repeatable: true, artifact: expect.objectContaining({ glob: "design/gdd/game-concept.md" }) })); + }); + + test("generates a one-row-per-source parity matrix with decisions, scores, hashes, and reports", () => { + const matrix = generateParityMatrix(inventoryCcgsSurfaces(fixtureRoot()), defaultProjectConfig({ name: "Parity Game", engine: "godot", mode: "prototype", nonInteractive: true })); + expect(matrix.rows).toHaveLength(6); + expect(matrix.rows.every((row) => row.decision && row.rationale && row.sourceHash)).toBe(true); + expect(matrix.rows.find((row) => row.sourceId === "producer")?.cgsTarget).toEqual(expect.objectContaining({ kind: "role", id: "producer", path: "src/roles.ts", hash: expect.stringMatching(/^[a-f0-9]{64}$/) })); + expect(matrix.rows.find((row) => row.sourceId === "producer")?.status).toBe("implemented"); + expect(matrix.rows.find((row) => row.sourceId === "writer")?.status).toBe("todo"); + expect(matrix.rows.find((row) => row.sourceId === "vertical-slice")?.cgsTarget).toEqual(expect.objectContaining({ kind: "skill", id: "cgs-vertical-slice", path: "src/skills.ts", hash: expect.stringMatching(/^[a-f0-9]{64}$/) })); + expect(matrix.rows.find((row) => row.sourceId === "localize")?.cgsTarget).toEqual(expect.objectContaining({ kind: "skill", id: "cgs-localize", path: "src/skills.ts" })); + expect(matrix.rows.find((row) => row.sourceId === "game-concept")?.decision).toBe("adopt"); + expect(validateParityMatrix(matrix)).toEqual([]); + const markdown = renderParityMatrixMarkdown(matrix); + expect(markdown).toContain("## Decision Summary"); + expect(markdown).toContain(`- Total rows: ${matrix.rows.length}`); + const out = mkdtempSync(path.join(tmpdir(), "ccgs-parity-out-")); + writeParityReports(matrix, out); + expect(JSON.parse(readFileSync(path.join(out, "ccgs-surface-parity-matrix.json"), "utf8")).rows).toHaveLength(matrix.rows.length); + expect(readFileSync(path.join(out, "ccgs-surface-parity-matrix.md"), "utf8")).toContain(`- Total rows: ${matrix.rows.length}`); + }); + + test("upgraded generated skills are no longer thin wrappers", () => { + const definitions = generatedSkillDefinitions(defaultProjectConfig({ name: "Skill Depth Game", engine: "godot", mode: "prototype", nonInteractive: true })); + expect(new Set(definitions.map((skill) => skill.name)).size).toBe(definitions.length); + expect(definitions.map((skill) => skill.name)).toEqual(expect.arrayContaining(["cgs-brainstorm", "cgs-map-systems", "cgs-design-system", "cgs-vertical-slice", "cgs-bug-report", "cgs-qa-plan", "cgs-release-checklist", "cgs-localize", "cgs-team-ui"])); + expect(definitions.find((skill) => skill.name === "cgs-vertical-slice")?.body).toContain("PROCEED / PIVOT / KILL"); + expect(definitions.find((skill) => skill.name === "cgs-bug-report")?.body).toContain("Expected vs Actual"); + for (const definition of definitions) { + for (const marker of definition.requiredMarkers) expect(definition.body).toContain(`- ${marker}`); + } + }); +}); diff --git a/tests/cli-prompt-surface.test.ts b/tests/cli-prompt-surface.test.ts index e22b593..48c49d1 100644 --- a/tests/cli-prompt-surface.test.ts +++ b/tests/cli-prompt-surface.test.ts @@ -2,7 +2,8 @@ import { execFileSync } from "node:child_process"; import { existsSync, mkdtempSync, readFileSync, rmSync, writeFileSync } from "node:fs"; import { tmpdir } from "node:os"; import path from "node:path"; -import { afterEach, beforeAll, describe, expect, test } from "vitest"; +import { afterEach, before, describe, test } from "node:test"; +import { expect } from "expect"; const repoRoot = process.cwd(); const cli = path.join(repoRoot, "dist", "cli.js"); @@ -30,7 +31,7 @@ function initCliProject(prefix: string, name: string): { cwd: string; projectRoo return { cwd, projectRoot: cwd }; } -beforeAll(() => { +before(() => { execFileSync("npm", ["run", "build", "--silent"], { cwd: repoRoot, encoding: "utf8" }); }); diff --git a/tests/codex-context-files.test.ts b/tests/codex-context-files.test.ts index 0b66266..7ba8772 100644 --- a/tests/codex-context-files.test.ts +++ b/tests/codex-context-files.test.ts @@ -1,7 +1,8 @@ import { mkdirSync, mkdtempSync, rmSync, symlinkSync, writeFileSync } from "node:fs"; import { tmpdir } from "node:os"; import path from "node:path"; -import { describe, expect, test } from "vitest"; +import { describe, test } from "node:test"; +import { expect } from "expect"; import { initProject } from "../src/projects.js"; import { prepareRun } from "../src/runner.js"; import { createTask, renderTaskRun } from "../src/tasks.js"; diff --git a/tests/codex-prompts.test.ts b/tests/codex-prompts.test.ts index 17a4584..ddabe72 100644 --- a/tests/codex-prompts.test.ts +++ b/tests/codex-prompts.test.ts @@ -1,4 +1,5 @@ -import { describe, expect, test } from "vitest"; +import { describe, test } from "node:test"; +import { expect } from "expect"; import { createCodexStudioSession } from "../src/codex-session.js"; import { renderCodexPrompt } from "../src/codex-prompts.js"; diff --git a/tests/codex-runtime.test.ts b/tests/codex-runtime.test.ts index 9c34202..c87a351 100644 --- a/tests/codex-runtime.test.ts +++ b/tests/codex-runtime.test.ts @@ -2,7 +2,8 @@ import { chmodSync, writeFileSync } from "node:fs"; import { mkdtempSync } from "node:fs"; import { tmpdir } from "node:os"; import path from "node:path"; -import { describe, expect, test } from "vitest"; +import { describe, test } from "node:test"; +import { expect } from "expect"; import { buildCodexExecArgs, checkCodexAvailability, resolveCodexCommand } from "../src/codex-runtime.js"; describe("codex runtime", () => { diff --git a/tests/codex-session.test.ts b/tests/codex-session.test.ts index 91b4d56..c271ae2 100644 --- a/tests/codex-session.test.ts +++ b/tests/codex-session.test.ts @@ -1,4 +1,5 @@ -import { describe, expect, test } from "vitest"; +import { describe, test } from "node:test"; +import { expect } from "expect"; import { createCodexStudioSession, validateCodexStudioSession } from "../src/codex-session.js"; describe("Codex studio sessions", () => { diff --git a/tests/customization.test.ts b/tests/customization.test.ts index 5b84942..bac35b5 100644 --- a/tests/customization.test.ts +++ b/tests/customization.test.ts @@ -3,7 +3,8 @@ import { execFileSync } from "node:child_process"; import { mkdtempSync } from "node:fs"; import { tmpdir } from "node:os"; import path from "node:path"; -import { describe, expect, test } from "vitest"; +import { describe, test } from "node:test"; +import { expect } from "expect"; import { appendApprovalRecord, canonicalObjectiveSha256 } from "../src/approvals.js"; import { customizationConfigPath, readProjectCustomization } from "../src/customization.js"; import { initProject, statusProject } from "../src/projects.js"; diff --git a/tests/engine-system.test.ts b/tests/engine-system.test.ts index d29cf42..26dc73d 100644 --- a/tests/engine-system.test.ts +++ b/tests/engine-system.test.ts @@ -2,7 +2,8 @@ import { execFileSync } from "node:child_process"; import { mkdtempSync, existsSync, unlinkSync } from "node:fs"; import { tmpdir } from "node:os"; import path from "node:path"; -import { describe, expect, test } from "vitest"; +import { describe, test } from "node:test"; +import { expect } from "expect"; import { createEngineFolders, createEngineProjectFiles, loadEngineConfigs, normalizeEngine, projectClassName, sourceRoot, unrealProjectFileName } from "../src/engines.js"; import { engineReferenceRegistry, validateEngineReferencePacks } from "../src/engine-reference.js"; import { packageAssetPath } from "../src/paths.js"; diff --git a/tests/functionality-gap-pass.test.ts b/tests/functionality-gap-pass.test.ts index b4ed64c..0a74dcf 100644 --- a/tests/functionality-gap-pass.test.ts +++ b/tests/functionality-gap-pass.test.ts @@ -2,7 +2,8 @@ import { execFileSync } from "node:child_process"; import { existsSync, mkdtempSync, readdirSync, readFileSync, rmSync, writeFileSync } from "node:fs"; import { tmpdir } from "node:os"; import path from "node:path"; -import { describe, expect, it } from "vitest"; +import { describe, it } from "node:test"; +import { expect } from "expect"; import { activeAgentsForMode, activeAgentsForProject } from "../src/config.js"; import { initProject, statusProject } from "../src/projects.js"; import { projectRoleIdsForEngine, rolePackages, studioRoleIds } from "../src/roles.js"; diff --git a/tests/orchestrator.test.ts b/tests/orchestrator.test.ts index 2346925..ec8c1a1 100644 --- a/tests/orchestrator.test.ts +++ b/tests/orchestrator.test.ts @@ -1,7 +1,8 @@ import { chmodSync, existsSync, mkdtempSync, readFileSync, writeFileSync } from "node:fs"; import { tmpdir } from "node:os"; import path from "node:path"; -import { describe, expect, test } from "vitest"; +import { describe, test } from "node:test"; +import { expect } from "expect"; import { initProject } from "../src/projects.js"; import { createTask, readTaskStore } from "../src/tasks.js"; import { orchestrateTasks } from "../src/orchestrator.js"; diff --git a/tests/project-workflow.test.ts b/tests/project-workflow.test.ts index 56f25b0..b22e605 100644 --- a/tests/project-workflow.test.ts +++ b/tests/project-workflow.test.ts @@ -3,7 +3,8 @@ import { execFileSync } from "node:child_process"; import { mkdtempSync } from "node:fs"; import { tmpdir } from "node:os"; import path from "node:path"; -import { describe, expect, test } from "vitest"; +import { describe, test } from "node:test"; +import { expect } from "expect"; import { guidanceConfigHash } from "../src/config.js"; import { freezeProject, initProject, resumeProject, statusProject } from "../src/projects.js"; @@ -103,12 +104,6 @@ describe("project workflow", () => { expect(() => initProject({ name: "Second Game", engine: "godot", mode: "prototype", nonInteractive: true }, cwd)).toThrow(/already contains/i); }); - test("explicit nested mode preserves legacy projects slug layout", () => { - const cwd = tempRoot("ogs-nested-"); - const { projectRoot } = initProject({ name: "Nested Game", engine: "godot", mode: "prototype", nonInteractive: true, nested: true }, cwd); - expect(projectRoot).toBe(path.join(cwd, "projects", "nested-game")); - expect(existsSync(path.join(projectRoot, ".codex", "studio.json"))).toBe(true); - }); test("CLI init writes root studio state by default and accepts repeated competitor flags", () => { const cwd = tempRoot("ogs-cli-"); diff --git a/tests/roles.test.ts b/tests/roles.test.ts index 10e0683..a83b7c4 100644 --- a/tests/roles.test.ts +++ b/tests/roles.test.ts @@ -1,4 +1,5 @@ -import { describe, expect, test } from "vitest"; +import { describe, test } from "node:test"; +import { expect } from "expect"; import { isStudioRoleId, rolePackages, studioRoleIds, unknownStudioRoleMessage } from "../src/roles.js"; describe("Codex role packages", () => { diff --git a/tests/runner.test.ts b/tests/runner.test.ts index 6dbf76d..7e02af8 100644 --- a/tests/runner.test.ts +++ b/tests/runner.test.ts @@ -1,7 +1,8 @@ import { chmodSync, existsSync, mkdirSync, mkdtempSync, readdirSync, readFileSync, rmSync, symlinkSync, writeFileSync } from "node:fs"; import { tmpdir } from "node:os"; import path from "node:path"; -import { describe, expect, test } from "vitest"; +import { describe, test } from "node:test"; +import { expect } from "expect"; import { initProject } from "../src/projects.js"; import { executeRunLifecycle, prepareRun } from "../src/runner.js"; diff --git a/tests/studio-policy.test.ts b/tests/studio-policy.test.ts index 0cada24..10ea5f2 100644 --- a/tests/studio-policy.test.ts +++ b/tests/studio-policy.test.ts @@ -1,4 +1,5 @@ -import { describe, expect, test } from "vitest"; +import { describe, test } from "node:test"; +import { expect } from "expect"; import { codexPermissionForWritePolicy, defaultApprovalPolicyForStudioMode, diff --git a/tests/tasks.test.ts b/tests/tasks.test.ts index 6bb577f..a3b7d33 100644 --- a/tests/tasks.test.ts +++ b/tests/tasks.test.ts @@ -1,7 +1,8 @@ import { existsSync, mkdtempSync, readdirSync, readFileSync } from "node:fs"; import { tmpdir } from "node:os"; import path from "node:path"; -import { describe, expect, test } from "vitest"; +import { describe, test } from "node:test"; +import { expect } from "expect"; import { initProject } from "../src/projects.js"; import { createTask, executeTaskRun } from "../src/tasks.js"; diff --git a/tests/template-root-smoke.test.ts b/tests/template-root-smoke.test.ts index 57557d8..f51a4b0 100644 --- a/tests/template-root-smoke.test.ts +++ b/tests/template-root-smoke.test.ts @@ -2,7 +2,8 @@ import { execFileSync } from "node:child_process"; import { existsSync, mkdtempSync, readdirSync, rmSync } from "node:fs"; import { tmpdir } from "node:os"; import path from "node:path"; -import { describe, expect, test } from "vitest"; +import { describe, test } from "node:test"; +import { expect } from "expect"; import { checkCodexAvailability } from "../src/codex-runtime.js"; const repoRoot = process.cwd(); diff --git a/tests/validation.test.ts b/tests/validation.test.ts index 5877290..f96fc43 100644 --- a/tests/validation.test.ts +++ b/tests/validation.test.ts @@ -2,7 +2,8 @@ import { existsSync, mkdirSync, readFileSync, rmSync, symlinkSync, writeFileSync import { mkdtempSync } from "node:fs"; import { tmpdir } from "node:os"; import path from "node:path"; -import { describe, expect, test } from "vitest"; +import { describe, test } from "node:test"; +import { expect } from "expect"; import { projectRolePromptSourceInput } from "../src/agents.js"; import { packageAssetPath } from "../src/paths.js"; import { freezeProject, initProject } from "../src/projects.js"; @@ -294,6 +295,19 @@ describe("validation", () => { expect(validateProject(legacyProject)).toContainEqual(expect.objectContaining({ id: "codex.role.market-analyst.prompt.freshness", status: "skip" })); }); + test("generated skill content markers are validated", () => { + const cwd = mkdtempSync(path.join(tmpdir(), "ogs-val-skill-depth-")); + const { projectRoot } = initProject({ name: "Skill Marker Val", engine: "godot", mode: "prototype", nonInteractive: true }, cwd); + const file = path.join(projectRoot, ".agents", "skills", "cgs-vertical-slice", "SKILL.md"); + const body = readFileSync(file, "utf8"); + const qualityGateStart = body.indexOf("## Quality Gates"); + writeFileSync(file, body.slice(0, qualityGateStart) + body.slice(qualityGateStart).replace("- Validation Question", "- Removed Question")); + + expect(validateProject(projectRoot).filter((c) => c.status === "fail")).toContainEqual( + expect.objectContaining({ id: "codex.skill.cgs-vertical-slice.marker.validation-question" }) + ); + }); + test("generated surface source input covers rendered engine and role display fields", () => { const engines = loadEngineConfigs(packageAssetPath("engine_configs")); const config = initProject({ name: "Hash Coverage Game", engine: "godot", mode: "prototype", nonInteractive: true }, mkdtempSync(path.join(tmpdir(), "ogs-val-"))).config; diff --git a/tests/verification.test.ts b/tests/verification.test.ts index af2031f..b03b0ef 100644 --- a/tests/verification.test.ts +++ b/tests/verification.test.ts @@ -2,7 +2,8 @@ import { writeFileSync, chmodSync } from "node:fs"; import { mkdtempSync } from "node:fs"; import { tmpdir } from "node:os"; import path from "node:path"; -import { describe, expect, test } from "vitest"; +import { describe, test } from "node:test"; +import { expect } from "expect"; import { runVerificationCommand } from "../src/verification.js"; describe("verification runner", () => { diff --git a/tests/workflow-catalog.test.ts b/tests/workflow-catalog.test.ts new file mode 100644 index 0000000..f396104 --- /dev/null +++ b/tests/workflow-catalog.test.ts @@ -0,0 +1,38 @@ +import { mkdirSync, mkdtempSync, writeFileSync } from "node:fs"; +import { tmpdir } from "node:os"; +import path from "node:path"; +import { describe, test } from "node:test"; +import { expect } from "expect"; +import { artifactStatus, workflowCatalog, workflowCatalogSummary } from "../src/workflow-catalog.js"; +import { initProject, statusProject } from "../src/projects.js"; + +describe("workflow catalog", () => { + test("represents CCGS-style phases with required and repeatable artifact checks", () => { + expect(workflowCatalog.phases[0]).toEqual(expect.objectContaining({ id: "concept", nextPhase: "systems-design" })); + const concept = workflowCatalog.phases.find((phase) => phase.id === "concept"); + expect(concept?.steps).toContainEqual(expect.objectContaining({ id: "game-concept", required: true, artifact: expect.objectContaining({ path: "design/gdd.md" }) })); + const systems = workflowCatalog.phases.find((phase) => phase.id === "systems-design"); + expect(systems?.steps).toContainEqual(expect.objectContaining({ id: "design-system", repeatable: true })); + }); + + test("artifact checks report complete, invalid-pattern, and missing workflow prerequisites", () => { + const root = mkdtempSync(path.join(tmpdir(), "ogs-workflow-catalog-")); + mkdirSync(path.join(root, "design"), { recursive: true }); + writeFileSync(path.join(root, "design", "gdd.md"), "# Test GDD\n"); + expect(artifactStatus(root, { path: "design/gdd.md", pattern: "# Test" })).toEqual(expect.objectContaining({ status: "complete" })); + expect(artifactStatus(root, { path: "docs/architecture/README.md" })).toEqual(expect.objectContaining({ status: "missing" })); + expect(artifactStatus(root, { path: "design/gdd.md", pattern: "[" })).toEqual(expect.objectContaining({ status: "incomplete", reason: expect.stringMatching(/invalid pattern/) })); + expect(artifactStatus(root, { path: "design/gdd.md", pattern: "Nope" })).toEqual(expect.objectContaining({ status: "incomplete" })); + }); + + test("status output includes the next incomplete workflow catalog phase", () => { + const cwd = mkdtempSync(path.join(tmpdir(), "ogs-workflow-status-")); + initProject({ name: "Workflow Status Game", engine: "godot", mode: "prototype", nonInteractive: true }, cwd); + expect(statusProject(undefined, cwd)).toContain("workflow phase: concept"); + expect(workflowCatalogSummary(cwd)).toContain("map-systems"); + + writeFileSync(path.join(cwd, "design", "gdd.md"), "# Test GDD\n\n## System Map\nSystem dependencies are listed.\n"); + expect(workflowCatalogSummary(cwd)).toContain("workflow phase: pre-production"); + expect(workflowCatalogSummary(cwd)).toContain("vertical-slice"); + }); +}); diff --git a/tests/workflow-recipes.test.ts b/tests/workflow-recipes.test.ts index 608ce0a..511bc2d 100644 --- a/tests/workflow-recipes.test.ts +++ b/tests/workflow-recipes.test.ts @@ -1,7 +1,8 @@ import { existsSync, mkdtempSync } from "node:fs"; import { tmpdir } from "node:os"; import path from "node:path"; -import { describe, expect, test } from "vitest"; +import { describe, test } from "node:test"; +import { expect } from "expect"; import { initProject } from "../src/projects.js"; import { readTaskStore } from "../src/tasks.js"; import { createWorkflowTasks, workflowRecipeIds } from "../src/workflow-recipes.js";