create-yss-spec 3.2.0 → 3.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/package.json +1 -1
- package/template/.agents/skills/code-review/SKILL.md +4 -0
- package/template/.agents/skills/code-review/agents/openai.yaml +1 -1
- package/template/.agents/skills/code-review/references/yss-review-standards.md +9 -2
- package/template/.agents/skills/yss-ddd-scaffold-generator/SKILL.md +1 -1
- package/template/.agents/skills/yss-ddd-scaffold-generator/scripts/generate_scaffold.mjs +7 -3
- package/template/.agents/skills/yss-ddd-scaffold-generator/scripts/run_scaffold_verification.mjs +1 -1
- package/template/.agents/skills/yss-ddd-scaffold-generator/scripts/scaffold-generator.test.mjs +9 -0
- package/template/.agents/skills/yss-frontend-scaffold-generator/SKILL.md +10 -7
- package/template/.agents/skills/yss-frontend-scaffold-generator/scripts/generate_and_verify_scaffold.mjs +10 -0
- package/template/.agents/skills/yss-frontend-scaffold-generator/scripts/generate_scaffold.mjs +107 -0
- package/template/.agents/skills/yss-frontend-scaffold-generator/scripts/run_scaffold_verification.mjs +41 -0
- package/template/.agents/skills/yss-frontend-scaffold-generator/scripts/scaffold-generator.test.mjs +37 -0
- package/template/.agents/skills/yss-implementation-contract-compiler/SKILL.md +1 -1
- package/template/.agents/skills/yss-implementation-contract-compiler/references/boundaries.md +4 -0
- package/template/.agents/skills/yss-implementation-contract-compiler/references/compiler-contract.yaml +25 -0
- package/template/.agents/skills/yss-layered-mvc-scaffold-generator/SKILL.md +2 -2
- package/template/.agents/skills/yss-layered-mvc-scaffold-generator/scripts/generate_scaffold.mjs +8 -5
- package/template/.agents/skills/yss-layered-mvc-scaffold-generator/scripts/scaffold-generator.test.mjs +17 -2
- package/template/.agents/skills/yss-mybatis/SKILL.md +34 -58
- package/template/.agents/skills/yss-mybatis/agents/openai.yaml +2 -2
- package/template/.agents/skills/yss-mybatis/references/source-index.md +88 -68
- package/template/.agents/skills/yss-product-lifecycle/SKILL.md +48 -43
- package/template/.agents/skills/yss-product-lifecycle/references/artifact-dependencies.md +4 -2
- package/template/.agents/skills/yss-product-lifecycle/references/orchestration-contract.yaml +67 -10
- package/template/.agents/skills/yss-product-lifecycle/references/orchestration.md +5 -1
- package/template/.agents/skills/yss-product-lifecycle/references/state-model.md +5 -2
- package/template/.agents/skills/yss-repository/SKILL.md +28 -70
- package/template/.agents/skills/yss-repository/agents/openai.yaml +2 -2
- package/template/.agents/skills/yss-repository/references/profiles/layered-mvc-service.md +19 -1
- package/template/.agents/skills/yss-repository/references/profiles/mvc-data-analysis-v1.md +19 -1
- package/template/.agents/skills/yss-repository/references/profiles/target-domain-model.md +21 -1
- package/template/.agents/skills/yss-repository/tests/profile-routing.test.mjs +59 -0
- package/template/.agents/skills/yss-skill-source-index-refresh/SKILL.md +8 -5
- package/template/.agents/skills/yss-skill-source-index-refresh/references/source-location.md +2 -1
- package/template/.agents/skills/yss-skill-source-index-refresh/scripts/refresh-yss-skill-index.mjs +388 -18
- package/template/.agents/skills/yss-skill-source-index-refresh/scripts/refresh-yss-skill-index.test.mjs +79 -1
- package/template/.claude/skills/code-review/SKILL.md +4 -0
- package/template/.claude/skills/code-review/agents/openai.yaml +1 -1
- package/template/.claude/skills/code-review/references/yss-review-standards.md +9 -2
- package/template/.claude/skills/yss-ddd-scaffold-generator/SKILL.md +1 -1
- package/template/.claude/skills/yss-ddd-scaffold-generator/scripts/generate_scaffold.mjs +7 -3
- package/template/.claude/skills/yss-ddd-scaffold-generator/scripts/run_scaffold_verification.mjs +1 -1
- package/template/.claude/skills/yss-ddd-scaffold-generator/scripts/scaffold-generator.test.mjs +9 -0
- package/template/.claude/skills/yss-frontend-scaffold-generator/SKILL.md +10 -7
- package/template/.claude/skills/yss-frontend-scaffold-generator/scripts/generate_and_verify_scaffold.mjs +10 -0
- package/template/.claude/skills/yss-frontend-scaffold-generator/scripts/generate_scaffold.mjs +107 -0
- package/template/.claude/skills/yss-frontend-scaffold-generator/scripts/run_scaffold_verification.mjs +41 -0
- package/template/.claude/skills/yss-frontend-scaffold-generator/scripts/scaffold-generator.test.mjs +37 -0
- package/template/.claude/skills/yss-implementation-contract-compiler/SKILL.md +1 -1
- package/template/.claude/skills/yss-implementation-contract-compiler/references/boundaries.md +4 -0
- package/template/.claude/skills/yss-implementation-contract-compiler/references/compiler-contract.yaml +25 -0
- package/template/.claude/skills/yss-layered-mvc-scaffold-generator/SKILL.md +2 -2
- package/template/.claude/skills/yss-layered-mvc-scaffold-generator/scripts/generate_scaffold.mjs +8 -5
- package/template/.claude/skills/yss-layered-mvc-scaffold-generator/scripts/scaffold-generator.test.mjs +17 -2
- package/template/.claude/skills/yss-mybatis/SKILL.md +34 -58
- package/template/.claude/skills/yss-mybatis/agents/openai.yaml +2 -2
- package/template/.claude/skills/yss-mybatis/references/source-index.md +88 -68
- package/template/.claude/skills/yss-product-lifecycle/SKILL.md +48 -43
- package/template/.claude/skills/yss-product-lifecycle/references/artifact-dependencies.md +4 -2
- package/template/.claude/skills/yss-product-lifecycle/references/orchestration-contract.yaml +67 -10
- package/template/.claude/skills/yss-product-lifecycle/references/orchestration.md +5 -1
- package/template/.claude/skills/yss-product-lifecycle/references/state-model.md +5 -2
- package/template/.claude/skills/yss-repository/SKILL.md +28 -70
- package/template/.claude/skills/yss-repository/agents/openai.yaml +2 -2
- package/template/.claude/skills/yss-repository/references/profiles/layered-mvc-service.md +19 -1
- package/template/.claude/skills/yss-repository/references/profiles/mvc-data-analysis-v1.md +19 -1
- package/template/.claude/skills/yss-repository/references/profiles/target-domain-model.md +21 -1
- package/template/.claude/skills/yss-repository/tests/profile-routing.test.mjs +59 -0
- package/template/.claude/skills/yss-skill-source-index-refresh/SKILL.md +8 -5
- package/template/.claude/skills/yss-skill-source-index-refresh/references/source-location.md +2 -1
- package/template/.claude/skills/yss-skill-source-index-refresh/scripts/refresh-yss-skill-index.mjs +388 -18
- package/template/.claude/skills/yss-skill-source-index-refresh/scripts/refresh-yss-skill-index.test.mjs +79 -1
- package/template/.codex/skills/code-review/SKILL.md +4 -0
- package/template/.codex/skills/code-review/agents/openai.yaml +1 -1
- package/template/.codex/skills/code-review/references/yss-review-standards.md +9 -2
- package/template/.codex/skills/yss-ddd-scaffold-generator/SKILL.md +1 -1
- package/template/.codex/skills/yss-ddd-scaffold-generator/scripts/generate_scaffold.mjs +7 -3
- package/template/.codex/skills/yss-ddd-scaffold-generator/scripts/run_scaffold_verification.mjs +1 -1
- package/template/.codex/skills/yss-ddd-scaffold-generator/scripts/scaffold-generator.test.mjs +9 -0
- package/template/.codex/skills/yss-frontend-scaffold-generator/SKILL.md +10 -7
- package/template/.codex/skills/yss-frontend-scaffold-generator/scripts/generate_and_verify_scaffold.mjs +10 -0
- package/template/.codex/skills/yss-frontend-scaffold-generator/scripts/generate_scaffold.mjs +107 -0
- package/template/.codex/skills/yss-frontend-scaffold-generator/scripts/run_scaffold_verification.mjs +41 -0
- package/template/.codex/skills/yss-frontend-scaffold-generator/scripts/scaffold-generator.test.mjs +37 -0
- package/template/.codex/skills/yss-implementation-contract-compiler/SKILL.md +1 -1
- package/template/.codex/skills/yss-implementation-contract-compiler/references/boundaries.md +4 -0
- package/template/.codex/skills/yss-implementation-contract-compiler/references/compiler-contract.yaml +25 -0
- package/template/.codex/skills/yss-layered-mvc-scaffold-generator/SKILL.md +2 -2
- package/template/.codex/skills/yss-layered-mvc-scaffold-generator/scripts/generate_scaffold.mjs +8 -5
- package/template/.codex/skills/yss-layered-mvc-scaffold-generator/scripts/scaffold-generator.test.mjs +17 -2
- package/template/.codex/skills/yss-mybatis/SKILL.md +34 -58
- package/template/.codex/skills/yss-mybatis/agents/openai.yaml +2 -2
- package/template/.codex/skills/yss-mybatis/references/source-index.md +88 -68
- package/template/.codex/skills/yss-product-lifecycle/SKILL.md +48 -43
- package/template/.codex/skills/yss-product-lifecycle/references/artifact-dependencies.md +4 -2
- package/template/.codex/skills/yss-product-lifecycle/references/orchestration-contract.yaml +67 -10
- package/template/.codex/skills/yss-product-lifecycle/references/orchestration.md +5 -1
- package/template/.codex/skills/yss-product-lifecycle/references/state-model.md +5 -2
- package/template/.codex/skills/yss-repository/SKILL.md +28 -70
- package/template/.codex/skills/yss-repository/agents/openai.yaml +2 -2
- package/template/.codex/skills/yss-repository/references/profiles/layered-mvc-service.md +19 -1
- package/template/.codex/skills/yss-repository/references/profiles/mvc-data-analysis-v1.md +19 -1
- package/template/.codex/skills/yss-repository/references/profiles/target-domain-model.md +21 -1
- package/template/.codex/skills/yss-repository/tests/profile-routing.test.mjs +59 -0
- package/template/.codex/skills/yss-skill-source-index-refresh/SKILL.md +8 -5
- package/template/.codex/skills/yss-skill-source-index-refresh/references/source-location.md +2 -1
- package/template/.codex/skills/yss-skill-source-index-refresh/scripts/refresh-yss-skill-index.mjs +388 -18
- package/template/.codex/skills/yss-skill-source-index-refresh/scripts/refresh-yss-skill-index.test.mjs +79 -1
- package/template/.cursor/skills/code-review/SKILL.md +4 -0
- package/template/.cursor/skills/code-review/agents/openai.yaml +1 -1
- package/template/.cursor/skills/code-review/references/yss-review-standards.md +9 -2
- package/template/.cursor/skills/yss-ddd-scaffold-generator/SKILL.md +1 -1
- package/template/.cursor/skills/yss-ddd-scaffold-generator/scripts/generate_scaffold.mjs +7 -3
- package/template/.cursor/skills/yss-ddd-scaffold-generator/scripts/run_scaffold_verification.mjs +1 -1
- package/template/.cursor/skills/yss-ddd-scaffold-generator/scripts/scaffold-generator.test.mjs +9 -0
- package/template/.cursor/skills/yss-frontend-scaffold-generator/SKILL.md +10 -7
- package/template/.cursor/skills/yss-frontend-scaffold-generator/scripts/generate_and_verify_scaffold.mjs +10 -0
- package/template/.cursor/skills/yss-frontend-scaffold-generator/scripts/generate_scaffold.mjs +107 -0
- package/template/.cursor/skills/yss-frontend-scaffold-generator/scripts/run_scaffold_verification.mjs +41 -0
- package/template/.cursor/skills/yss-frontend-scaffold-generator/scripts/scaffold-generator.test.mjs +37 -0
- package/template/.cursor/skills/yss-implementation-contract-compiler/SKILL.md +1 -1
- package/template/.cursor/skills/yss-implementation-contract-compiler/references/boundaries.md +4 -0
- package/template/.cursor/skills/yss-implementation-contract-compiler/references/compiler-contract.yaml +25 -0
- package/template/.cursor/skills/yss-layered-mvc-scaffold-generator/SKILL.md +2 -2
- package/template/.cursor/skills/yss-layered-mvc-scaffold-generator/scripts/generate_scaffold.mjs +8 -5
- package/template/.cursor/skills/yss-layered-mvc-scaffold-generator/scripts/scaffold-generator.test.mjs +17 -2
- package/template/.cursor/skills/yss-mybatis/SKILL.md +34 -58
- package/template/.cursor/skills/yss-mybatis/agents/openai.yaml +2 -2
- package/template/.cursor/skills/yss-mybatis/references/source-index.md +88 -68
- package/template/.cursor/skills/yss-product-lifecycle/SKILL.md +48 -43
- package/template/.cursor/skills/yss-product-lifecycle/references/artifact-dependencies.md +4 -2
- package/template/.cursor/skills/yss-product-lifecycle/references/orchestration-contract.yaml +67 -10
- package/template/.cursor/skills/yss-product-lifecycle/references/orchestration.md +5 -1
- package/template/.cursor/skills/yss-product-lifecycle/references/state-model.md +5 -2
- package/template/.cursor/skills/yss-repository/SKILL.md +28 -70
- package/template/.cursor/skills/yss-repository/agents/openai.yaml +2 -2
- package/template/.cursor/skills/yss-repository/references/profiles/layered-mvc-service.md +19 -1
- package/template/.cursor/skills/yss-repository/references/profiles/mvc-data-analysis-v1.md +19 -1
- package/template/.cursor/skills/yss-repository/references/profiles/target-domain-model.md +21 -1
- package/template/.cursor/skills/yss-repository/tests/profile-routing.test.mjs +59 -0
- package/template/.cursor/skills/yss-skill-source-index-refresh/SKILL.md +8 -5
- package/template/.cursor/skills/yss-skill-source-index-refresh/references/source-location.md +2 -1
- package/template/.cursor/skills/yss-skill-source-index-refresh/scripts/refresh-yss-skill-index.mjs +388 -18
- package/template/.cursor/skills/yss-skill-source-index-refresh/scripts/refresh-yss-skill-index.test.mjs +79 -1
- package/template/.pi/skills/code-review/SKILL.md +4 -0
- package/template/.pi/skills/code-review/agents/openai.yaml +1 -1
- package/template/.pi/skills/code-review/references/yss-review-standards.md +9 -2
- package/template/.pi/skills/yss-ddd-scaffold-generator/SKILL.md +1 -1
- package/template/.pi/skills/yss-ddd-scaffold-generator/scripts/generate_scaffold.mjs +7 -3
- package/template/.pi/skills/yss-ddd-scaffold-generator/scripts/run_scaffold_verification.mjs +1 -1
- package/template/.pi/skills/yss-ddd-scaffold-generator/scripts/scaffold-generator.test.mjs +9 -0
- package/template/.pi/skills/yss-frontend-scaffold-generator/SKILL.md +10 -7
- package/template/.pi/skills/yss-frontend-scaffold-generator/scripts/generate_and_verify_scaffold.mjs +10 -0
- package/template/.pi/skills/yss-frontend-scaffold-generator/scripts/generate_scaffold.mjs +107 -0
- package/template/.pi/skills/yss-frontend-scaffold-generator/scripts/run_scaffold_verification.mjs +41 -0
- package/template/.pi/skills/yss-frontend-scaffold-generator/scripts/scaffold-generator.test.mjs +37 -0
- package/template/.pi/skills/yss-implementation-contract-compiler/SKILL.md +1 -1
- package/template/.pi/skills/yss-implementation-contract-compiler/references/boundaries.md +4 -0
- package/template/.pi/skills/yss-implementation-contract-compiler/references/compiler-contract.yaml +25 -0
- package/template/.pi/skills/yss-layered-mvc-scaffold-generator/SKILL.md +2 -2
- package/template/.pi/skills/yss-layered-mvc-scaffold-generator/scripts/generate_scaffold.mjs +8 -5
- package/template/.pi/skills/yss-layered-mvc-scaffold-generator/scripts/scaffold-generator.test.mjs +17 -2
- package/template/.pi/skills/yss-mybatis/SKILL.md +34 -58
- package/template/.pi/skills/yss-mybatis/agents/openai.yaml +2 -2
- package/template/.pi/skills/yss-mybatis/references/source-index.md +88 -68
- package/template/.pi/skills/yss-product-lifecycle/SKILL.md +48 -43
- package/template/.pi/skills/yss-product-lifecycle/references/artifact-dependencies.md +4 -2
- package/template/.pi/skills/yss-product-lifecycle/references/orchestration-contract.yaml +67 -10
- package/template/.pi/skills/yss-product-lifecycle/references/orchestration.md +5 -1
- package/template/.pi/skills/yss-product-lifecycle/references/state-model.md +5 -2
- package/template/.pi/skills/yss-repository/SKILL.md +28 -70
- package/template/.pi/skills/yss-repository/agents/openai.yaml +2 -2
- package/template/.pi/skills/yss-repository/references/profiles/layered-mvc-service.md +19 -1
- package/template/.pi/skills/yss-repository/references/profiles/mvc-data-analysis-v1.md +19 -1
- package/template/.pi/skills/yss-repository/references/profiles/target-domain-model.md +21 -1
- package/template/.pi/skills/yss-repository/tests/profile-routing.test.mjs +59 -0
- package/template/.pi/skills/yss-skill-source-index-refresh/SKILL.md +8 -5
- package/template/.pi/skills/yss-skill-source-index-refresh/references/source-location.md +2 -1
- package/template/.pi/skills/yss-skill-source-index-refresh/scripts/refresh-yss-skill-index.mjs +388 -18
- package/template/.pi/skills/yss-skill-source-index-refresh/scripts/refresh-yss-skill-index.test.mjs +79 -1
- package/template/.qoder/skills/code-review/SKILL.md +4 -0
- package/template/.qoder/skills/code-review/agents/openai.yaml +1 -1
- package/template/.qoder/skills/code-review/references/yss-review-standards.md +9 -2
- package/template/.qoder/skills/yss-ddd-scaffold-generator/SKILL.md +1 -1
- package/template/.qoder/skills/yss-ddd-scaffold-generator/scripts/generate_scaffold.mjs +7 -3
- package/template/.qoder/skills/yss-ddd-scaffold-generator/scripts/run_scaffold_verification.mjs +1 -1
- package/template/.qoder/skills/yss-ddd-scaffold-generator/scripts/scaffold-generator.test.mjs +9 -0
- package/template/.qoder/skills/yss-frontend-scaffold-generator/SKILL.md +10 -7
- package/template/.qoder/skills/yss-frontend-scaffold-generator/scripts/generate_and_verify_scaffold.mjs +10 -0
- package/template/.qoder/skills/yss-frontend-scaffold-generator/scripts/generate_scaffold.mjs +107 -0
- package/template/.qoder/skills/yss-frontend-scaffold-generator/scripts/run_scaffold_verification.mjs +41 -0
- package/template/.qoder/skills/yss-frontend-scaffold-generator/scripts/scaffold-generator.test.mjs +37 -0
- package/template/.qoder/skills/yss-implementation-contract-compiler/SKILL.md +1 -1
- package/template/.qoder/skills/yss-implementation-contract-compiler/references/boundaries.md +4 -0
- package/template/.qoder/skills/yss-implementation-contract-compiler/references/compiler-contract.yaml +25 -0
- package/template/.qoder/skills/yss-layered-mvc-scaffold-generator/SKILL.md +2 -2
- package/template/.qoder/skills/yss-layered-mvc-scaffold-generator/scripts/generate_scaffold.mjs +8 -5
- package/template/.qoder/skills/yss-layered-mvc-scaffold-generator/scripts/scaffold-generator.test.mjs +17 -2
- package/template/.qoder/skills/yss-mybatis/SKILL.md +34 -58
- package/template/.qoder/skills/yss-mybatis/agents/openai.yaml +2 -2
- package/template/.qoder/skills/yss-mybatis/references/source-index.md +88 -68
- package/template/.qoder/skills/yss-product-lifecycle/SKILL.md +48 -43
- package/template/.qoder/skills/yss-product-lifecycle/references/artifact-dependencies.md +4 -2
- package/template/.qoder/skills/yss-product-lifecycle/references/orchestration-contract.yaml +67 -10
- package/template/.qoder/skills/yss-product-lifecycle/references/orchestration.md +5 -1
- package/template/.qoder/skills/yss-product-lifecycle/references/state-model.md +5 -2
- package/template/.qoder/skills/yss-repository/SKILL.md +28 -70
- package/template/.qoder/skills/yss-repository/agents/openai.yaml +2 -2
- package/template/.qoder/skills/yss-repository/references/profiles/layered-mvc-service.md +19 -1
- package/template/.qoder/skills/yss-repository/references/profiles/mvc-data-analysis-v1.md +19 -1
- package/template/.qoder/skills/yss-repository/references/profiles/target-domain-model.md +21 -1
- package/template/.qoder/skills/yss-repository/tests/profile-routing.test.mjs +59 -0
- package/template/.qoder/skills/yss-skill-source-index-refresh/SKILL.md +8 -5
- package/template/.qoder/skills/yss-skill-source-index-refresh/references/source-location.md +2 -1
- package/template/.qoder/skills/yss-skill-source-index-refresh/scripts/refresh-yss-skill-index.mjs +388 -18
- package/template/.qoder/skills/yss-skill-source-index-refresh/scripts/refresh-yss-skill-index.test.mjs +79 -1
- package/template/.trae/skills/code-review/SKILL.md +4 -0
- package/template/.trae/skills/code-review/agents/openai.yaml +1 -1
- package/template/.trae/skills/code-review/references/yss-review-standards.md +9 -2
- package/template/.trae/skills/yss-ddd-scaffold-generator/SKILL.md +1 -1
- package/template/.trae/skills/yss-ddd-scaffold-generator/scripts/generate_scaffold.mjs +7 -3
- package/template/.trae/skills/yss-ddd-scaffold-generator/scripts/run_scaffold_verification.mjs +1 -1
- package/template/.trae/skills/yss-ddd-scaffold-generator/scripts/scaffold-generator.test.mjs +9 -0
- package/template/.trae/skills/yss-frontend-scaffold-generator/SKILL.md +10 -7
- package/template/.trae/skills/yss-frontend-scaffold-generator/scripts/generate_and_verify_scaffold.mjs +10 -0
- package/template/.trae/skills/yss-frontend-scaffold-generator/scripts/generate_scaffold.mjs +107 -0
- package/template/.trae/skills/yss-frontend-scaffold-generator/scripts/run_scaffold_verification.mjs +41 -0
- package/template/.trae/skills/yss-frontend-scaffold-generator/scripts/scaffold-generator.test.mjs +37 -0
- package/template/.trae/skills/yss-implementation-contract-compiler/SKILL.md +1 -1
- package/template/.trae/skills/yss-implementation-contract-compiler/references/boundaries.md +4 -0
- package/template/.trae/skills/yss-implementation-contract-compiler/references/compiler-contract.yaml +25 -0
- package/template/.trae/skills/yss-layered-mvc-scaffold-generator/SKILL.md +2 -2
- package/template/.trae/skills/yss-layered-mvc-scaffold-generator/scripts/generate_scaffold.mjs +8 -5
- package/template/.trae/skills/yss-layered-mvc-scaffold-generator/scripts/scaffold-generator.test.mjs +17 -2
- package/template/.trae/skills/yss-mybatis/SKILL.md +34 -58
- package/template/.trae/skills/yss-mybatis/agents/openai.yaml +2 -2
- package/template/.trae/skills/yss-mybatis/references/source-index.md +88 -68
- package/template/.trae/skills/yss-product-lifecycle/SKILL.md +48 -43
- package/template/.trae/skills/yss-product-lifecycle/references/artifact-dependencies.md +4 -2
- package/template/.trae/skills/yss-product-lifecycle/references/orchestration-contract.yaml +67 -10
- package/template/.trae/skills/yss-product-lifecycle/references/orchestration.md +5 -1
- package/template/.trae/skills/yss-product-lifecycle/references/state-model.md +5 -2
- package/template/.trae/skills/yss-repository/SKILL.md +28 -70
- package/template/.trae/skills/yss-repository/agents/openai.yaml +2 -2
- package/template/.trae/skills/yss-repository/references/profiles/layered-mvc-service.md +19 -1
- package/template/.trae/skills/yss-repository/references/profiles/mvc-data-analysis-v1.md +19 -1
- package/template/.trae/skills/yss-repository/references/profiles/target-domain-model.md +21 -1
- package/template/.trae/skills/yss-repository/tests/profile-routing.test.mjs +59 -0
- package/template/.trae/skills/yss-skill-source-index-refresh/SKILL.md +8 -5
- package/template/.trae/skills/yss-skill-source-index-refresh/references/source-location.md +2 -1
- package/template/.trae/skills/yss-skill-source-index-refresh/scripts/refresh-yss-skill-index.mjs +388 -18
- package/template/.trae/skills/yss-skill-source-index-refresh/scripts/refresh-yss-skill-index.test.mjs +79 -1
- package/template/docs/agents/digital-human-roles.yaml +2 -0
- package/template/docs/agents/yss-skill-registry.yaml +5 -0
- package/template/docs/process/lifecycle-artifact-map.md +4 -0
- package/template/docs/process/lifecycle-registry-baseline.json +6 -1
- package/template/docs/process/lifecycle-registry.yaml +23 -0
- package/template/docs/process/schemas/implementation-repository-preparation-result.schema.json +38 -0
- package/template/docs/process/schemas/project-scaffold-contract.schema.json +113 -0
- package/template/docs/process/template-verification-profiles.yaml +23 -0
- package/template/docs/templates/implementation-repo-registry-template.md +8 -0
- package/template/docs/templates/review-report-template.md +7 -3
- package/template/scripts/lib/lifecycle-context-query.mjs +137 -0
- package/template/scripts/lib/lifecycle-transition.mjs +109 -3
- package/template/scripts/lib/scenario-checks.mjs +29 -26
- package/template/scripts/lib/skill-registry.mjs +9 -0
- package/template/scripts/query-lifecycle-context +25 -0
- package/template/scripts/verify-business-language-scenarios +0 -7
- package/template/scripts/verify-frontend-scaffold-generator-scenarios +2 -0
- package/template/scripts/verify-lifecycle-context-query-scenarios +68 -0
- package/template/scripts/verify-lifecycle-transition-scenarios +44 -4
- package/template/skills-lock.json +9 -9
- package/template.snapshot.json +4 -4
- package/template/.agents/skills/yss-mybatis/assets/BaseRepository.java +0 -112
- package/template/.agents/skills/yss-mybatis/assets/EntityQueryAspect.java +0 -37
- package/template/.agents/skills/yss-mybatis/assets/MybatisBaseConfiguration.java +0 -18
- package/template/.agents/skills/yss-mybatis/assets/PageQueryEntityConfigration.java +0 -18
- package/template/.agents/skills/yss-mybatis/references/README.md +0 -57
- package/template/.agents/skills/yss-repository/references/infrastructure-layer-guide.md +0 -107
- package/template/.claude/skills/yss-mybatis/assets/BaseRepository.java +0 -112
- package/template/.claude/skills/yss-mybatis/assets/EntityQueryAspect.java +0 -37
- package/template/.claude/skills/yss-mybatis/assets/MybatisBaseConfiguration.java +0 -18
- package/template/.claude/skills/yss-mybatis/assets/PageQueryEntityConfigration.java +0 -18
- package/template/.claude/skills/yss-mybatis/references/README.md +0 -57
- package/template/.claude/skills/yss-repository/references/infrastructure-layer-guide.md +0 -107
- package/template/.codex/skills/yss-mybatis/assets/BaseRepository.java +0 -112
- package/template/.codex/skills/yss-mybatis/assets/EntityQueryAspect.java +0 -37
- package/template/.codex/skills/yss-mybatis/assets/MybatisBaseConfiguration.java +0 -18
- package/template/.codex/skills/yss-mybatis/assets/PageQueryEntityConfigration.java +0 -18
- package/template/.codex/skills/yss-mybatis/references/README.md +0 -57
- package/template/.codex/skills/yss-repository/references/infrastructure-layer-guide.md +0 -107
- package/template/.cursor/skills/yss-mybatis/assets/BaseRepository.java +0 -112
- package/template/.cursor/skills/yss-mybatis/assets/EntityQueryAspect.java +0 -37
- package/template/.cursor/skills/yss-mybatis/assets/MybatisBaseConfiguration.java +0 -18
- package/template/.cursor/skills/yss-mybatis/assets/PageQueryEntityConfigration.java +0 -18
- package/template/.cursor/skills/yss-mybatis/references/README.md +0 -57
- package/template/.cursor/skills/yss-repository/references/infrastructure-layer-guide.md +0 -107
- package/template/.pi/skills/yss-mybatis/assets/BaseRepository.java +0 -112
- package/template/.pi/skills/yss-mybatis/assets/EntityQueryAspect.java +0 -37
- package/template/.pi/skills/yss-mybatis/assets/MybatisBaseConfiguration.java +0 -18
- package/template/.pi/skills/yss-mybatis/assets/PageQueryEntityConfigration.java +0 -18
- package/template/.pi/skills/yss-mybatis/references/README.md +0 -57
- package/template/.pi/skills/yss-repository/references/infrastructure-layer-guide.md +0 -107
- package/template/.qoder/skills/yss-mybatis/assets/BaseRepository.java +0 -112
- package/template/.qoder/skills/yss-mybatis/assets/EntityQueryAspect.java +0 -37
- package/template/.qoder/skills/yss-mybatis/assets/MybatisBaseConfiguration.java +0 -18
- package/template/.qoder/skills/yss-mybatis/assets/PageQueryEntityConfigration.java +0 -18
- package/template/.qoder/skills/yss-mybatis/references/README.md +0 -57
- package/template/.qoder/skills/yss-repository/references/infrastructure-layer-guide.md +0 -107
- package/template/.trae/skills/yss-mybatis/assets/BaseRepository.java +0 -112
- package/template/.trae/skills/yss-mybatis/assets/EntityQueryAspect.java +0 -37
- package/template/.trae/skills/yss-mybatis/assets/MybatisBaseConfiguration.java +0 -18
- package/template/.trae/skills/yss-mybatis/assets/PageQueryEntityConfigration.java +0 -18
- package/template/.trae/skills/yss-mybatis/references/README.md +0 -57
- package/template/.trae/skills/yss-repository/references/infrastructure-layer-guide.md +0 -107
|
@@ -5,6 +5,7 @@ import { enforceFrontendDelivery } from "./frontend-delivery-boundary.mjs";
|
|
|
5
5
|
|
|
6
6
|
const IMPLEMENTATION_WORK_UNIT = "work-unit.slice-implementation";
|
|
7
7
|
const TICKET_DECOMPOSITION_WORK_UNIT = "work-unit.ticket-decomposition";
|
|
8
|
+
const REPOSITORY_PREPARATION_WORK_UNIT = "work-unit.implementation-repository-preparation";
|
|
8
9
|
|
|
9
10
|
function deepFreeze(value) {
|
|
10
11
|
if (!value || typeof value !== "object" || Object.isFrozen(value)) return value;
|
|
@@ -26,9 +27,10 @@ const NEXT_ROUTES = deepFreeze({
|
|
|
26
27
|
"work-unit.discovery-requirements": ["work-unit.domain-strategy-design", "work-unit.stage-decision", "work-unit.spec-synthesis"],
|
|
27
28
|
"work-unit.domain-strategy-design": ["work-unit.stage-decision", "work-unit.spec-synthesis"],
|
|
28
29
|
"work-unit.stage-decision": ["work-unit.spec-synthesis"],
|
|
29
|
-
"work-unit.spec-synthesis": ["work-unit.prototype-design", "work-unit.technical-analysis",
|
|
30
|
-
"work-unit.prototype-design": ["work-unit.technical-analysis",
|
|
31
|
-
"work-unit.technical-analysis": [
|
|
30
|
+
"work-unit.spec-synthesis": ["work-unit.prototype-design", "work-unit.technical-analysis", REPOSITORY_PREPARATION_WORK_UNIT],
|
|
31
|
+
"work-unit.prototype-design": ["work-unit.technical-analysis", REPOSITORY_PREPARATION_WORK_UNIT],
|
|
32
|
+
"work-unit.technical-analysis": [REPOSITORY_PREPARATION_WORK_UNIT],
|
|
33
|
+
[REPOSITORY_PREPARATION_WORK_UNIT]: [TICKET_DECOMPOSITION_WORK_UNIT],
|
|
32
34
|
[TICKET_DECOMPOSITION_WORK_UNIT]: [IMPLEMENTATION_WORK_UNIT],
|
|
33
35
|
[IMPLEMENTATION_WORK_UNIT]: ["work-unit.frontend-implementation-verification", "work-unit.code-review"],
|
|
34
36
|
"work-unit.frontend-implementation-verification": ["work-unit.code-review"],
|
|
@@ -56,6 +58,15 @@ const BLOCKING_SIGNALS = Object.freeze({
|
|
|
56
58
|
contractNotCurrent: "slice-contract-not-current",
|
|
57
59
|
missingEvidence: "ticket-formalization-evidence-missing",
|
|
58
60
|
stale: "ticket-formalization-stale",
|
|
61
|
+
repositoryDecisionRequired: "implementation-repository-decision-required",
|
|
62
|
+
repositoryLocationRequired: "implementation-repository-location-required",
|
|
63
|
+
repositoryOnboardingIncomplete: "implementation-repository-onboarding-incomplete",
|
|
64
|
+
scaffoldChoiceRequired: "scaffold-choice-required",
|
|
65
|
+
scaffoldContractUnapproved: "scaffold-contract-unapproved",
|
|
66
|
+
scaffoldGenerationIncomplete: "scaffold-generation-incomplete",
|
|
67
|
+
scaffoldVerificationFailed: "scaffold-verification-failed",
|
|
68
|
+
frontendTemplateUnavailable: "frontend-template-unavailable",
|
|
69
|
+
implementationRepositoriesStale: "implementation-repositories-stale",
|
|
59
70
|
});
|
|
60
71
|
|
|
61
72
|
const allowedResult = (evidenceRefs = []) => ({
|
|
@@ -130,9 +141,101 @@ export function validateNextRoute(currentWorkUnit, nextRoute, decisionState, opt
|
|
|
130
141
|
}
|
|
131
142
|
return blockedResult(signals, ["allowed_next_route"]);
|
|
132
143
|
}
|
|
144
|
+
if (nextRoute === TICKET_DECOMPOSITION_WORK_UNIT) {
|
|
145
|
+
const readiness = validateImplementationRepositoriesReady(decisionState, options);
|
|
146
|
+
if (readiness.result === "blocked") return readiness;
|
|
147
|
+
}
|
|
133
148
|
return decisionState ? validateDecisionBoundary(currentWorkUnit, decisionState, options) : allowedResult();
|
|
134
149
|
}
|
|
135
150
|
|
|
151
|
+
/**
|
|
152
|
+
* Validate the aggregate stage-5 repository-preparation result. Every affected
|
|
153
|
+
* delivery role must resolve to an onboarded existing repository or a freshly
|
|
154
|
+
* generated and verified scaffold. Unaffected roles need an explicit reason.
|
|
155
|
+
*/
|
|
156
|
+
export function validateImplementationRepositoriesReady(state, { exists = existsSync } = {}) {
|
|
157
|
+
const preparation = state?.implementation_repository_preparation;
|
|
158
|
+
const impacts = state?.delivery_impacts;
|
|
159
|
+
const signals = [];
|
|
160
|
+
const missing = [];
|
|
161
|
+
const evidenceRefs = Array.isArray(preparation?.evidence_refs) ? preparation.evidence_refs : [];
|
|
162
|
+
|
|
163
|
+
if (!preparation || preparation.result !== "completed" || !Array.isArray(preparation.projects)) {
|
|
164
|
+
return blockedResult([BLOCKING_SIGNALS.repositoryDecisionRequired], ["completed implementation_repository_preparation with projects"]);
|
|
165
|
+
}
|
|
166
|
+
if (preparation.current_version !== true || state?.implementation_repositories_stale === true) {
|
|
167
|
+
signals.push(BLOCKING_SIGNALS.implementationRepositoriesStale);
|
|
168
|
+
missing.push("implementation repository preparation is current");
|
|
169
|
+
}
|
|
170
|
+
if (evidenceRefs.length === 0 || evidenceRefs.some((ref) => !isReadable(ref, exists))) {
|
|
171
|
+
signals.push(BLOCKING_SIGNALS.repositoryOnboardingIncomplete);
|
|
172
|
+
missing.push("readable implementation_repository_preparation.evidence_refs");
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
for (const role of ["backend", "frontend"]) {
|
|
176
|
+
const affected = impacts?.[role] === true;
|
|
177
|
+
const projects = preparation.projects.filter((project) => project?.delivery_role === role);
|
|
178
|
+
if (affected && projects.length === 0) {
|
|
179
|
+
signals.push(BLOCKING_SIGNALS.repositoryDecisionRequired);
|
|
180
|
+
missing.push(`${role} repository decision`);
|
|
181
|
+
}
|
|
182
|
+
if (!affected && projects.length === 0) {
|
|
183
|
+
signals.push(BLOCKING_SIGNALS.repositoryDecisionRequired);
|
|
184
|
+
missing.push(`${role} not-applicable decision with reason`);
|
|
185
|
+
}
|
|
186
|
+
for (const project of projects) {
|
|
187
|
+
if (!hasText(project.project_id) || !hasText(project.status)) {
|
|
188
|
+
signals.push(BLOCKING_SIGNALS.repositoryDecisionRequired);
|
|
189
|
+
missing.push(`${role} project_id and status`);
|
|
190
|
+
continue;
|
|
191
|
+
}
|
|
192
|
+
if (project.status === "not-applicable") {
|
|
193
|
+
if (affected || !hasText(project.reason)) {
|
|
194
|
+
signals.push(BLOCKING_SIGNALS.repositoryDecisionRequired);
|
|
195
|
+
missing.push(`${project.project_id} not-applicable reason for an unaffected role`);
|
|
196
|
+
}
|
|
197
|
+
continue;
|
|
198
|
+
}
|
|
199
|
+
if (!hasText(project.repository_ref) || !hasText(project.project_root) || !hasText(project.repository_scope)) {
|
|
200
|
+
signals.push(BLOCKING_SIGNALS.repositoryLocationRequired);
|
|
201
|
+
missing.push(`${project.project_id} repository_ref, project_root and repository_scope`);
|
|
202
|
+
}
|
|
203
|
+
if (project.status === "existing-and-onboarded") {
|
|
204
|
+
if (project.onboarding_result?.status !== "completed" || !isReadable(project.onboarding_result?.ref, exists)) {
|
|
205
|
+
signals.push(BLOCKING_SIGNALS.repositoryOnboardingIncomplete);
|
|
206
|
+
missing.push(`${project.project_id} readable completed onboarding result`);
|
|
207
|
+
}
|
|
208
|
+
} else if (project.status === "initialized-and-verified") {
|
|
209
|
+
if (role === "backend" && !hasText(project.architecture_family)) {
|
|
210
|
+
signals.push(BLOCKING_SIGNALS.scaffoldChoiceRequired);
|
|
211
|
+
missing.push(`${project.project_id} confirmed backend architecture_family`);
|
|
212
|
+
}
|
|
213
|
+
const contract = project.scaffold_contract;
|
|
214
|
+
if (![3, 4].includes(contract?.schema_version) || contract?.status !== "approved" || contract?.persisted !== true || contract?.current_version !== true || (role === "frontend" && contract?.schema_version !== 4)) {
|
|
215
|
+
signals.push(BLOCKING_SIGNALS.scaffoldContractUnapproved);
|
|
216
|
+
missing.push(`${project.project_id} approved persisted current scaffold contract`);
|
|
217
|
+
}
|
|
218
|
+
if (!isReadable(project.scaffold_manifest_ref, exists)) {
|
|
219
|
+
signals.push(BLOCKING_SIGNALS.scaffoldGenerationIncomplete);
|
|
220
|
+
missing.push(`${project.project_id} readable scaffold manifest`);
|
|
221
|
+
}
|
|
222
|
+
if (project.scaffold_verification?.status !== "passed" || !isReadable(project.scaffold_verification?.ref, exists)) {
|
|
223
|
+
signals.push(BLOCKING_SIGNALS.scaffoldVerificationFailed);
|
|
224
|
+
missing.push(`${project.project_id} readable passed scaffold verification`);
|
|
225
|
+
}
|
|
226
|
+
if (role === "frontend" && project.template_available !== true) {
|
|
227
|
+
signals.push(BLOCKING_SIGNALS.frontendTemplateUnavailable);
|
|
228
|
+
missing.push(`${project.project_id} verified frontend template source`);
|
|
229
|
+
}
|
|
230
|
+
} else {
|
|
231
|
+
signals.push(BLOCKING_SIGNALS.repositoryDecisionRequired);
|
|
232
|
+
missing.push(`${project.project_id} supported repository preparation status`);
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
return signals.length === 0 ? allowedResult(evidenceRefs) : blockedResult(signals, missing, evidenceRefs);
|
|
237
|
+
}
|
|
238
|
+
|
|
136
239
|
function validateDecisionBoundary(workUnit, state, options) {
|
|
137
240
|
try { assertWorkUnitUserDecision(workUnit, state, options); return allowedResult(); }
|
|
138
241
|
catch (error) { return blockedResult([error.code || "user-decision-invalid"], [error.message]); }
|
|
@@ -145,6 +248,8 @@ function validateDecisionBoundary(workUnit, state, options) {
|
|
|
145
248
|
export function validateTicketFormalization(state, { exists = existsSync, read = (ref) => readFileSync(ref, "utf8"), ...decisionOptions } = {}) {
|
|
146
249
|
try { enforceFrontendDelivery(state, { root: decisionOptions.root, phase: "implementation" }); }
|
|
147
250
|
catch (error) { return blockedResult(["frontend-delivery-blocked"], [error.message]); }
|
|
251
|
+
const repositoryResult = validateImplementationRepositoriesReady(state, { exists });
|
|
252
|
+
if (repositoryResult.result === "blocked") return repositoryResult;
|
|
148
253
|
const decomposition = state?.ticket_decomposition_result;
|
|
149
254
|
const ticket = state?.vertical_slice_ticket;
|
|
150
255
|
const contract = state?.slice_contract;
|
|
@@ -276,6 +381,7 @@ export function validateImplementationEntry(state, options = {}) {
|
|
|
276
381
|
export const lifecycleTransitionContract = Object.freeze({
|
|
277
382
|
implementation_work_unit: IMPLEMENTATION_WORK_UNIT,
|
|
278
383
|
ticket_decomposition_work_unit: TICKET_DECOMPOSITION_WORK_UNIT,
|
|
384
|
+
repository_preparation_work_unit: REPOSITORY_PREPARATION_WORK_UNIT,
|
|
279
385
|
next_routes: NEXT_ROUTES,
|
|
280
386
|
blocking_signals: BLOCKING_SIGNALS,
|
|
281
387
|
});
|
|
@@ -76,7 +76,9 @@ function validateInvocationBoundary(data) {
|
|
|
76
76
|
ensure(routes?.["work-unit.frontend-implementation-verification"]?.skills?.includes("code-review") && routes?.["work-unit.frontend-implementation-verification"]?.applies_when === "ui_impact", "前端还原验证未绑定 UI fidelity 审查轴");
|
|
77
77
|
const reviewRoute = routes?.["work-unit.code-review"];
|
|
78
78
|
ensure(reviewRoute?.primary_skill === "code-review" && reviewRoute?.review_standards_route?.unique_default_skill === "code-review" && reviewRoute?.review_standards_route?.second_generic_review_skill === "forbidden", "code-review 不是唯一默认审查入口或允许第二套通用审查 skill");
|
|
79
|
-
ensure(includesAll(reviewRoute?.supporting_skills, ["alibaba-java-code-style", "yss-ui", "yss-domain"]) && includesAll(reviewRoute?.skills, ["code-review", "alibaba-java-code-style", "yss-ui"]), "审查工作单元缺少 YSS / Alibaba 专项检查输入");
|
|
79
|
+
ensure(includesAll(reviewRoute?.supporting_skills, ["alibaba-java-code-style", "yss-ui", "yss-domain", "yss-repository", "yss-mybatis"]) && includesAll(reviewRoute?.skills, ["code-review", "alibaba-java-code-style", "yss-ui", "yss-repository", "yss-mybatis"]), "审查工作单元缺少 YSS / Alibaba / Repository / MyBatis 专项检查输入");
|
|
80
|
+
const reviewScope = reviewRoute?.review_standards_route?.project_scope;
|
|
81
|
+
ensure(includesAll(reviewScope?.sources, ["candidate-project-root", "implementation-repository-registry", "slice-project-roots", "allowed-write-paths"]) && includesAll(reviewScope?.include, ["project-itself", "registered-backend-development-projects"]) && includesAll(reviewScope?.exclude, ["frontend-projects", "unrelated-submodules", "vendor", "unregistered-directories"]) && reviewScope?.fixed_apps_backend_assumption === "forbidden", "后端审查范围未绑定本体项目与已登记后端研发项目,或仍固定为 apps/backend");
|
|
80
82
|
const disposition = reviewRoute?.review_standards_route?.finding_disposition;
|
|
81
83
|
ensure(includesAll(disposition?.same_loop_for, ["product-slice", "template-maintenance"]) && disposition?.reviewer_write_implementation === "forbidden", "审查 finding 闭环未同时覆盖产品切片与模板维护,或允许审查者写实现");
|
|
82
84
|
ensure(includesAll(disposition?.repair_then_full_rereview?.kinds, ["violation", "machine_check_failure", "blank_applicable_row", "missing_evidence"]) && disposition?.repair_then_full_rereview?.actor === "implementer" && disposition?.repair_then_full_rereview?.then === "recapture_candidate_and_rerun_all_axes", "violation 类 finding 未要求实现者修复后全轴复审");
|
|
@@ -125,6 +127,8 @@ function validateWorkflowExecutionResult(payload, contract, workUnitRoutes) {
|
|
|
125
127
|
const implementationState = {
|
|
126
128
|
user_decisions: payload.user_decisions,
|
|
127
129
|
slice_contract_ref: payload.slice_contract_ref,
|
|
130
|
+
delivery_impacts: payload.delivery_impacts,
|
|
131
|
+
implementation_repository_preparation: payload.implementation_repository_preparation,
|
|
128
132
|
tracker_kind: payload.tracker_kind,
|
|
129
133
|
predecessor_work_unit: payload.predecessor_work_unit,
|
|
130
134
|
ready_for_agent: payload.ready_for_agent,
|
|
@@ -164,18 +168,15 @@ function validateInvocationMetadata(boundary, skillContents) {
|
|
|
164
168
|
for (const skill of boundary.model_invoked_skills) ensure(!skillContents(skill).includes("disable-model-invocation: true"), `${skill} 不应出现在 model-invoked 白名单`);
|
|
165
169
|
}
|
|
166
170
|
|
|
167
|
-
function
|
|
168
|
-
ensure(
|
|
169
|
-
ensure(
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
ensure(skill.includes("不得自动调用它们或代替其创建正式资产") && skill.includes("Workflow Execution Result"), "主技能未限制 user-invoked 调用或未采用新结果协议");
|
|
177
|
-
ensure(adapter.includes("workflow reference 不表示调用") && adapter.includes("正式 Spec、Ticket 或实现资产仍只能由对应显式用户入口创建"), "适配器未限制 workflow reference 的正式资产所有权");
|
|
178
|
-
ensure(orchestration.includes("只实际调用允许的 model-invoked skill") && orchestration.includes("用户显式启动"), "编排协议未区分 model-invoked 原语和显式用户入口");
|
|
171
|
+
function validateLifecycleEntrySkill(skill) {
|
|
172
|
+
ensure(/^---\nname: yss-product-lifecycle\n/m.test(skill), "生命周期入口缺少有效 frontmatter");
|
|
173
|
+
ensure(Buffer.byteLength(skill) <= 8192, "生命周期入口超过 8KB 上下文预算");
|
|
174
|
+
for (const reference of ["docs/process/lifecycle-registry.yaml", "references/orchestration-contract.yaml", "docs/agents/yss-skill-registry.yaml", "scripts/query-lifecycle-context"]) {
|
|
175
|
+
ensure(skill.includes(reference), `生命周期入口缺少权威引用: ${reference}`);
|
|
176
|
+
}
|
|
177
|
+
for (const heading of ["### 仓库身份", "### 流转与实现", "### 用户决定", "### 外部副作用与 Git"]) {
|
|
178
|
+
ensure(skill.includes(heading), `生命周期入口缺少边界分组: ${heading}`);
|
|
179
|
+
}
|
|
179
180
|
}
|
|
180
181
|
|
|
181
182
|
const profiles = {
|
|
@@ -192,7 +193,7 @@ const profiles = {
|
|
|
192
193
|
prototype: {
|
|
193
194
|
message: "原型到后端脚手架及后续 YSS 代码生成压力场景验证通过",
|
|
194
195
|
files: [".agents/skills/yss-ddd-scaffold-generator/scripts/generate_scaffold.mjs", ".agents/skills/yss-implementation-contract-compiler/references/compiler-contract.yaml"],
|
|
195
|
-
markers: [[".agents/skills/yss-
|
|
196
|
+
markers: [[".agents/skills/yss-implementation-contract-compiler/references/compiler-contract.yaml", "controlled-generation"]]
|
|
196
197
|
},
|
|
197
198
|
implementationContractCompiler: {
|
|
198
199
|
message: "YSS implementation contract compiler stage 7 scenarios passed",
|
|
@@ -248,7 +249,10 @@ export function runScenario(name) {
|
|
|
248
249
|
{ from: "work-unit.spec-synthesis", to: "work-unit.slice-implementation" },
|
|
249
250
|
{ from: "work-unit.prototype-design", to: "work-unit.slice-implementation" },
|
|
250
251
|
{ from: "work-unit.technical-analysis", to: "work-unit.slice-implementation" },
|
|
251
|
-
|
|
252
|
+
{ from: "work-unit.technical-analysis", to: "work-unit.ticket-decomposition" },
|
|
253
|
+
]), "生命周期转换图缺少工程准备、Ticket 正式化与实现越级阻断");
|
|
254
|
+
ensure(contract.transition_graph?.routes?.["work-unit.implementation-repository-preparation"]?.includes("work-unit.ticket-decomposition"), "实现仓库准备未成为 Ticket 正式化前置");
|
|
255
|
+
ensure(contract.implementation_repository_preparation?.gate === "gate.implementation-repositories-ready", "实现仓库准备聚合门禁缺失");
|
|
252
256
|
ensure(lifecycleTransitionContract.next_routes["work-unit.ticket-decomposition"]?.includes("work-unit.slice-implementation"), "转换校验器未允许 Ticket 正式化后进入实现");
|
|
253
257
|
ensure(contract.release_readiness?.conditional?.ui_impact?.includes("gate.frontend-implementation-verified") && contract.frontend_implementation_plan?.acceptance?.includes("no_template_placeholders"), "发布公式或前端计划实质校验不完整");
|
|
254
258
|
const templateRejected = spawnSync("scripts/verify-frontend-implementation-evidence", ["docs/process/templates/frontend-implementation-plan-template.yaml"], { cwd: root, encoding: "utf8" });
|
|
@@ -275,7 +279,7 @@ export function runScenario(name) {
|
|
|
275
279
|
changed_artifacts: [],
|
|
276
280
|
new_impacts: [],
|
|
277
281
|
stale_candidates: [],
|
|
278
|
-
next_route: "work-unit.
|
|
282
|
+
next_route: "work-unit.implementation-repository-preparation",
|
|
279
283
|
blocking_signals: []
|
|
280
284
|
};
|
|
281
285
|
validateWorkflowExecutionResult(validResult, data.workflow_execution_result, data.work_unit_routes);
|
|
@@ -304,6 +308,14 @@ export function runScenario(name) {
|
|
|
304
308
|
slice_contract_status: "approved",
|
|
305
309
|
slice_contract_persisted: true,
|
|
306
310
|
slice_contract_current_version: true,
|
|
311
|
+
delivery_impacts: { backend: true, frontend: false },
|
|
312
|
+
implementation_repository_preparation: {
|
|
313
|
+
result: "completed", current_version: true, evidence_refs: ["docs/process/lifecycle-registry.yaml"],
|
|
314
|
+
projects: [
|
|
315
|
+
{ project_id: "backend", delivery_role: "backend", status: "existing-and-onboarded", repository_ref: "git://backend", project_root: "/workspace/backend", repository_scope: "external-repository", onboarding_result: { status: "completed", ref: "docs/process/lifecycle-registry.yaml" } },
|
|
316
|
+
{ project_id: "frontend-na", delivery_role: "frontend", status: "not-applicable", reason: "no frontend impact" },
|
|
317
|
+
],
|
|
318
|
+
},
|
|
307
319
|
};
|
|
308
320
|
validateWorkflowExecutionResult(validImplementationResult, data.workflow_execution_result, data.work_unit_routes);
|
|
309
321
|
for (const mutate of [
|
|
@@ -377,16 +389,7 @@ export function runScenario(name) {
|
|
|
377
389
|
ensure(rejected, "Matt/YSS 契约变异未被 baseline oracle 拒绝");
|
|
378
390
|
}
|
|
379
391
|
const skill = read(".agents/skills/yss-product-lifecycle/SKILL.md");
|
|
380
|
-
|
|
381
|
-
const orchestration = read(".agents/skills/yss-product-lifecycle/references/orchestration.md");
|
|
382
|
-
validateMattProse(skill, adapter);
|
|
383
|
-
validateInvocationProse(skill, adapter, orchestration);
|
|
384
|
-
let proseRejected = false;
|
|
385
|
-
try { validateMattProse(skill.replace("任何写入前回交本编排器", "允许直接写入"), adapter); } catch { proseRejected = true; }
|
|
386
|
-
ensure(proseRejected, "Matt/YSS prose 变异未被 baseline oracle 拒绝");
|
|
387
|
-
let invocationProseRejected = false;
|
|
388
|
-
try { validateInvocationProse(skill.replace("不得自动调用它们或代替其创建正式资产", "可以自动调用并创建正式资产"), adapter, orchestration); } catch { invocationProseRejected = true; }
|
|
389
|
-
ensure(invocationProseRejected, "调用边界 prose 变异未被 baseline oracle 拒绝");
|
|
392
|
+
validateLifecycleEntrySkill(skill);
|
|
390
393
|
for (const relative of ["SKILL.md", "references/matt-yss-adapter.md", "references/orchestration-contract.yaml"]) {
|
|
391
394
|
ensure(read(`.agents/skills/yss-product-lifecycle/${relative}`) === read(`.codex/skills/yss-product-lifecycle/${relative}`), `YSS 生命周期投影未同步: ${relative}`);
|
|
392
395
|
}
|
|
@@ -166,6 +166,10 @@ function validateReviewInputFinding(reviewInput) {
|
|
|
166
166
|
if (reviewInput.completed_requires_no_open_mandatory_violations !== true) fail("未关闭的 mandatory violation 不得 completed");
|
|
167
167
|
if (reviewInput.completed_requires_no_blank_applicable_rows !== true) fail("适用报告行空白不得 completed");
|
|
168
168
|
if (reviewInput.reviewer_write_implementation !== "forbidden") fail("review_input 禁止审查者写实现");
|
|
169
|
+
requireObject(reviewInput.scope_resolution, "review_input.scope_resolution");
|
|
170
|
+
requireStringSet(reviewInput.scope_resolution.sources, ["candidate-project-root", "implementation-repository-registry", "slice-project-roots", "allowed-write-paths"], "review_input.scope_resolution.sources");
|
|
171
|
+
requireStringSet(reviewInput.scope_resolution.backend_includes, ["project-itself", "registered-backend-development-projects"], "review_input.scope_resolution.backend_includes");
|
|
172
|
+
requireStringSet(reviewInput.scope_resolution.excludes, ["frontend-projects", "unrelated-submodules", "vendor", "unregistered-directories"], "review_input.scope_resolution.excludes");
|
|
169
173
|
}
|
|
170
174
|
|
|
171
175
|
function validateCodeReviewRoute(route, resolve) {
|
|
@@ -180,6 +184,11 @@ function validateCodeReviewRoute(route, resolve) {
|
|
|
180
184
|
if (standards.contract_required_skills !== "required") fail("Standards 必须消费 Slice 合同 required_skills");
|
|
181
185
|
requireString(standards.report_template, "review_standards_route.report_template");
|
|
182
186
|
if (!existsSync(path.join(ROOT, standards.report_template))) fail(`审查报告模板不存在: ${standards.report_template}`);
|
|
187
|
+
requireObject(standards.project_scope, "review_standards_route.project_scope");
|
|
188
|
+
requireStringSet(standards.project_scope.sources, ["candidate-project-root", "implementation-repository-registry", "slice-project-roots", "allowed-write-paths"], "review_standards_route.project_scope.sources");
|
|
189
|
+
requireStringSet(standards.project_scope.include, ["project-itself", "registered-backend-development-projects"], "review_standards_route.project_scope.include");
|
|
190
|
+
requireStringSet(standards.project_scope.exclude, ["frontend-projects", "unrelated-submodules", "vendor", "unregistered-directories"], "review_standards_route.project_scope.exclude");
|
|
191
|
+
if (standards.project_scope.fixed_apps_backend_assumption !== "forbidden") fail("code-review 不得把后端审查范围固定为 apps/backend");
|
|
183
192
|
const conditional = standards.conditional_skills;
|
|
184
193
|
if (!conditional || typeof conditional !== "object" || Array.isArray(conditional)) {
|
|
185
194
|
fail("review_standards_route.conditional_skills 必须是对象");
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { parseArgs } from "node:util";
|
|
3
|
+
import { queryLifecycleContext } from "./lib/lifecycle-context-query.mjs";
|
|
4
|
+
|
|
5
|
+
try {
|
|
6
|
+
const { values } = parseArgs({
|
|
7
|
+
options: {
|
|
8
|
+
mode: { type: "string" },
|
|
9
|
+
stage: { type: "string" },
|
|
10
|
+
"work-unit": { type: "string" },
|
|
11
|
+
include: { type: "string", multiple: true },
|
|
12
|
+
},
|
|
13
|
+
strict: true,
|
|
14
|
+
});
|
|
15
|
+
const result = queryLifecycleContext({
|
|
16
|
+
mode: values.mode,
|
|
17
|
+
stageId: values.stage,
|
|
18
|
+
workUnitId: values["work-unit"],
|
|
19
|
+
include: values.include ?? [],
|
|
20
|
+
});
|
|
21
|
+
process.stdout.write(`${JSON.stringify(result, null, 2)}\n`);
|
|
22
|
+
} catch (error) {
|
|
23
|
+
process.stderr.write(`${error.message}\n`);
|
|
24
|
+
process.exitCode = 1;
|
|
25
|
+
}
|
|
@@ -25,13 +25,6 @@ for (const relativePath of PUBLIC_FILES) {
|
|
|
25
25
|
}
|
|
26
26
|
}
|
|
27
27
|
|
|
28
|
-
const lifecycle = read(".agents/skills/yss-product-lifecycle/SKILL.md");
|
|
29
|
-
for (const phrase of [
|
|
30
|
-
"机会与目标 → 业务故事 → 责任与交接 → 规则、例子与疑问 → 可验收需求 → 页面验证 → 业务任务 → 交接研发",
|
|
31
|
-
"业务方案总览",
|
|
32
|
-
"不成为新的事实源",
|
|
33
|
-
]) assert.match(lifecycle, new RegExp(phrase));
|
|
34
|
-
|
|
35
28
|
const registry = read("docs/process/lifecycle-registry.yaml");
|
|
36
29
|
for (const stableId of ["work-unit.domain-strategy-design", "artifact.domain-strategy", "gate.domain-strategy-approved"]) {
|
|
37
30
|
assert.match(registry, new RegExp(`id: ${stableId.replaceAll(".", "\\.")}`));
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import assert from "node:assert/strict";
|
|
3
|
+
import { readFileSync } from "node:fs";
|
|
4
|
+
import { spawnSync } from "node:child_process";
|
|
5
|
+
import path from "node:path";
|
|
6
|
+
import { fileURLToPath } from "node:url";
|
|
7
|
+
import { queryLifecycleContext } from "./lib/lifecycle-context-query.mjs";
|
|
8
|
+
|
|
9
|
+
const ROOT = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "..");
|
|
10
|
+
|
|
11
|
+
const query = {
|
|
12
|
+
mode: "route",
|
|
13
|
+
stageId: "stage.discovery",
|
|
14
|
+
workUnitId: "work-unit.discovery-requirements",
|
|
15
|
+
include: ["grill_exit"],
|
|
16
|
+
};
|
|
17
|
+
const first = queryLifecycleContext(query);
|
|
18
|
+
const second = queryLifecycleContext(query);
|
|
19
|
+
|
|
20
|
+
assert.deepEqual(first, second, "同一查询必须产生确定性结果");
|
|
21
|
+
assert.equal(first.query.mode, "route");
|
|
22
|
+
assert.equal(first.lifecycle.stage.id, "stage.discovery");
|
|
23
|
+
assert.ok(first.lifecycle.gates.every((gate) => gate.stage === "stage.discovery"));
|
|
24
|
+
assert.ok(first.lifecycle.artifacts.every((artifact) => artifact.stage === "stage.discovery"));
|
|
25
|
+
assert.equal(first.lifecycle.work_unit.id, "work-unit.discovery-requirements");
|
|
26
|
+
assert.equal(first.execution.mode, "read_only");
|
|
27
|
+
assert.equal(first.execution.work_unit_route.primary_skill, "yss-product-lifecycle");
|
|
28
|
+
assert.ok(first.execution.selected.grill_exit.required.includes("frontier_empty"));
|
|
29
|
+
assert.equal("review_input" in first.execution.selected, false, "不得返回未请求的合同子树");
|
|
30
|
+
assert.ok(first.skills.some((skill) => skill.id === "grilling"));
|
|
31
|
+
assert.match(first.sources.lifecycle_registry.semantic_sha256, /^[0-9a-f]{64}$/);
|
|
32
|
+
assert.match(first.sources.orchestration_contract.sha256, /^[0-9a-f]{64}$/);
|
|
33
|
+
|
|
34
|
+
for (const invalid of [
|
|
35
|
+
{ mode: "invalid" },
|
|
36
|
+
{ stageId: "stage.missing" },
|
|
37
|
+
{ workUnitId: "work-unit.missing" },
|
|
38
|
+
{ include: ["missing_contract_section"] },
|
|
39
|
+
]) {
|
|
40
|
+
assert.throws(() => queryLifecycleContext(invalid), /未知|至少提供/);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
const cli = spawnSync("node", [
|
|
44
|
+
"scripts/query-lifecycle-context",
|
|
45
|
+
"--mode", "route",
|
|
46
|
+
"--stage", "stage.discovery",
|
|
47
|
+
"--work-unit", "work-unit.discovery-requirements",
|
|
48
|
+
"--include", "grill_exit",
|
|
49
|
+
], { cwd: ROOT, encoding: "utf8" });
|
|
50
|
+
assert.equal(cli.status, 0, cli.stderr);
|
|
51
|
+
assert.deepEqual(JSON.parse(cli.stdout), first, "CLI 输出必须等于库函数的规范投影");
|
|
52
|
+
|
|
53
|
+
const skillPath = path.join(ROOT, ".agents/skills/yss-product-lifecycle/SKILL.md");
|
|
54
|
+
const skill = readFileSync(skillPath, "utf8");
|
|
55
|
+
assert.ok(Buffer.byteLength(skill) <= 8192, "生命周期入口 Skill 必须保持在 8KB 软预算内");
|
|
56
|
+
assert.equal(skill.includes("| 主阶段 |"), false, "入口 Skill 不得复制完整阶段表");
|
|
57
|
+
for (const marker of [
|
|
58
|
+
"docs/process/lifecycle-registry.yaml",
|
|
59
|
+
"references/orchestration-contract.yaml",
|
|
60
|
+
"docs/agents/yss-skill-registry.yaml",
|
|
61
|
+
"scripts/query-lifecycle-context",
|
|
62
|
+
"### 仓库身份",
|
|
63
|
+
"### 流转与实现",
|
|
64
|
+
"### 用户决定",
|
|
65
|
+
"### 外部副作用与 Git",
|
|
66
|
+
]) assert.match(skill, new RegExp(marker.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")));
|
|
67
|
+
|
|
68
|
+
process.stdout.write("生命周期按需上下文查询场景验证通过\n");
|
|
@@ -3,16 +3,24 @@ import assert from "node:assert/strict";
|
|
|
3
3
|
import { mkdtempSync, rmSync, readFileSync, existsSync } from "node:fs";
|
|
4
4
|
import os from "node:os";
|
|
5
5
|
import path from "node:path";
|
|
6
|
-
import { buildImplementationFixture } from "./fixtures/user-decision/build-fixture.mjs";
|
|
6
|
+
import { buildDecisionFixture, buildImplementationFixture } from "./fixtures/user-decision/build-fixture.mjs";
|
|
7
7
|
const temp = mkdtempSync(path.join(os.tmpdir(), "lifecycle-decision-test-"));
|
|
8
8
|
process.on("exit", () => rmSync(temp, { recursive: true, force: true }));
|
|
9
9
|
const approval = buildImplementationFixture(temp, "docs/.scratch/demo/issues/01-valid-slice.md");
|
|
10
|
-
|
|
10
|
+
const scaffoldApproval = buildDecisionFixture(path.join(temp, "scaffold-choice"), { boundary: "scaffold-choice", scope: ["backend", "frontend"] });
|
|
11
|
+
import { validateImplementationEntry, validateImplementationRepositoriesReady, validateNextRoute, validateTicketFormalization } from "./lib/lifecycle-transition.mjs";
|
|
11
12
|
|
|
12
13
|
const exists = (ref) => [
|
|
13
14
|
"docs/process/lifecycle-registry.yaml",
|
|
14
15
|
"docs/.scratch/demo/issues/01-valid-slice.md",
|
|
15
16
|
"docs/.scratch/demo/evidence/ticket-decomposition-result.yaml",
|
|
17
|
+
"docs/.scratch/demo/evidence/repository-preparation.yaml",
|
|
18
|
+
"docs/.scratch/demo/evidence/backend-onboarding.yaml",
|
|
19
|
+
"docs/.scratch/demo/evidence/frontend-onboarding.yaml",
|
|
20
|
+
"docs/.scratch/demo/evidence/backend-manifest.json",
|
|
21
|
+
"docs/.scratch/demo/evidence/backend-verification.json",
|
|
22
|
+
"docs/.scratch/demo/evidence/frontend-manifest.json",
|
|
23
|
+
"docs/.scratch/demo/evidence/frontend-verification.json",
|
|
16
24
|
].includes(ref) || existsSync(ref);
|
|
17
25
|
const decompositionResult = `result_schema: workflow-execution-result-v1\nwork_unit: work-unit.ticket-decomposition\nresult: completed\nevidence_refs:\n - docs/.scratch/demo/evidence/ticket-decomposition-result.yaml\n`;
|
|
18
26
|
const read = (ref) => ref === "docs/.scratch/demo/evidence/ticket-decomposition-result.yaml" ? decompositionResult : readFileSync(ref, "utf8");
|
|
@@ -20,6 +28,17 @@ const options = { exists, read };
|
|
|
20
28
|
|
|
21
29
|
const validTicketState = {
|
|
22
30
|
...approval.state,
|
|
31
|
+
user_decisions: [...approval.state.user_decisions, scaffoldApproval.requirement],
|
|
32
|
+
delivery_impacts: { backend: true, frontend: true },
|
|
33
|
+
implementation_repository_preparation: {
|
|
34
|
+
result: "completed",
|
|
35
|
+
current_version: true,
|
|
36
|
+
evidence_refs: ["docs/.scratch/demo/evidence/repository-preparation.yaml"],
|
|
37
|
+
projects: [
|
|
38
|
+
{ project_id: "backend", delivery_role: "backend", status: "existing-and-onboarded", repository_ref: "git://backend", project_root: "/workspace/backend", repository_scope: "external-repository", onboarding_result: { status: "completed", ref: "docs/.scratch/demo/evidence/backend-onboarding.yaml" } },
|
|
39
|
+
{ project_id: "frontend", delivery_role: "frontend", status: "existing-and-onboarded", repository_ref: "git://frontend", project_root: "/workspace/frontend", repository_scope: "external-repository", onboarding_result: { status: "completed", ref: "docs/.scratch/demo/evidence/frontend-onboarding.yaml" } },
|
|
40
|
+
],
|
|
41
|
+
},
|
|
23
42
|
predecessor_work_unit: "work-unit.ticket-decomposition",
|
|
24
43
|
tracker_kind: "local-markdown",
|
|
25
44
|
ticket_decomposition_result_ref: "docs/.scratch/demo/evidence/ticket-decomposition-result.yaml",
|
|
@@ -45,6 +64,19 @@ const validTicketState = {
|
|
|
45
64
|
|
|
46
65
|
const valid = validateTicketFormalization(validTicketState, options);
|
|
47
66
|
assert.equal(valid.result, "allowed");
|
|
67
|
+
assert.equal(validateImplementationRepositoriesReady(validTicketState, options).result, "allowed");
|
|
68
|
+
const initializedState = {
|
|
69
|
+
delivery_impacts: { backend: true, frontend: true },
|
|
70
|
+
implementation_repository_preparation: {
|
|
71
|
+
result: "completed", current_version: true, evidence_refs: ["docs/.scratch/demo/evidence/repository-preparation.yaml"],
|
|
72
|
+
projects: [
|
|
73
|
+
{ project_id: "backend-ddd", delivery_role: "backend", status: "initialized-and-verified", repository_ref: "git://backend", project_root: "/workspace/backend", repository_scope: "external-repository", architecture_family: "domain-driven", scaffold_contract: { schema_version: 4, status: "approved", persisted: true, current_version: true }, scaffold_manifest_ref: "docs/.scratch/demo/evidence/backend-manifest.json", scaffold_verification: { status: "passed", ref: "docs/.scratch/demo/evidence/backend-verification.json" } },
|
|
74
|
+
{ project_id: "frontend", delivery_role: "frontend", status: "initialized-and-verified", repository_ref: "git://frontend", project_root: "/workspace/frontend", repository_scope: "external-repository", template_available: true, scaffold_contract: { schema_version: 4, status: "approved", persisted: true, current_version: true }, scaffold_manifest_ref: "docs/.scratch/demo/evidence/frontend-manifest.json", scaffold_verification: { status: "passed", ref: "docs/.scratch/demo/evidence/frontend-verification.json" } },
|
|
75
|
+
],
|
|
76
|
+
},
|
|
77
|
+
};
|
|
78
|
+
assert.equal(validateImplementationRepositoriesReady(initializedState, options).result, "allowed");
|
|
79
|
+
assert.equal(validateImplementationRepositoriesReady({ delivery_impacts: { backend: false, frontend: false }, implementation_repository_preparation: { result: "completed", current_version: true, evidence_refs: ["docs/.scratch/demo/evidence/repository-preparation.yaml"], projects: [{ project_id: "backend-na", delivery_role: "backend", status: "not-applicable", reason: "no backend impact" }, { project_id: "frontend-na", delivery_role: "frontend", status: "not-applicable", reason: "no frontend impact" }] } }, options).result, "allowed");
|
|
48
80
|
|
|
49
81
|
const implementation = validateImplementationEntry({
|
|
50
82
|
...validTicketState,
|
|
@@ -53,6 +85,11 @@ const implementation = validateImplementationEntry({
|
|
|
53
85
|
assert.equal(implementation.result, "allowed");
|
|
54
86
|
|
|
55
87
|
const cases = [
|
|
88
|
+
["missing repository preparation", { ...validTicketState, implementation_repository_preparation: undefined }, "implementation-repository-decision-required"],
|
|
89
|
+
["stale repository preparation", { ...validTicketState, implementation_repositories_stale: true }, "implementation-repositories-stale"],
|
|
90
|
+
["missing frontend decision", { ...validTicketState, implementation_repository_preparation: { ...validTicketState.implementation_repository_preparation, projects: validTicketState.implementation_repository_preparation.projects.filter((item) => item.delivery_role !== "frontend") } }, "implementation-repository-decision-required"],
|
|
91
|
+
["missing repository location", { ...validTicketState, implementation_repository_preparation: { ...validTicketState.implementation_repository_preparation, projects: validTicketState.implementation_repository_preparation.projects.map((item) => item.delivery_role === "backend" ? { ...item, project_root: undefined } : item) } }, "implementation-repository-location-required"],
|
|
92
|
+
["incomplete onboarding", { ...validTicketState, implementation_repository_preparation: { ...validTicketState.implementation_repository_preparation, projects: validTicketState.implementation_repository_preparation.projects.map((item) => item.delivery_role === "backend" ? { ...item, onboarding_result: { status: "blocked" } } : item) } }, "implementation-repository-onboarding-incomplete"],
|
|
56
93
|
["missing decomposition result ref", { ...validTicketState, ticket_decomposition_result_ref: undefined }, "ticket-decomposition-result-ref-missing"],
|
|
57
94
|
["missing slice ref", { ...validTicketState, vertical_slice_ticket_ref: undefined }, "vertical-slice-ticket-ref-missing"],
|
|
58
95
|
["missing slice role", { ...validTicketState, vertical_slice_ticket_role: undefined }, "vertical-slice-ticket-role-missing"],
|
|
@@ -90,7 +127,10 @@ for (const current of ["work-unit.spec-synthesis", "work-unit.prototype-design",
|
|
|
90
127
|
assert.equal(result.result, "blocked", current);
|
|
91
128
|
assert.ok(result.blocking_signals.includes("ticket-formalization-required"), current);
|
|
92
129
|
}
|
|
93
|
-
assert.equal(validateNextRoute("work-unit.spec-synthesis", "work-unit.ticket-decomposition").result, "
|
|
130
|
+
assert.equal(validateNextRoute("work-unit.spec-synthesis", "work-unit.ticket-decomposition").result, "blocked");
|
|
131
|
+
assert.equal(validateNextRoute("work-unit.technical-analysis", "work-unit.implementation-repository-preparation").result, "allowed");
|
|
132
|
+
assert.equal(validateNextRoute("work-unit.implementation-repository-preparation", "work-unit.ticket-decomposition", validTicketState, options).result, "allowed");
|
|
133
|
+
assert.ok(validateNextRoute("work-unit.implementation-repository-preparation", "work-unit.ticket-decomposition", {}, options).blocking_signals.includes("implementation-repository-decision-required"));
|
|
94
134
|
assert.equal(validateNextRoute("work-unit.intensity-aware-verification", "work-unit.intensity-aware-review").result, "allowed");
|
|
95
135
|
assert.equal(validateNextRoute("work-unit.release-and-rollback", null).result, "allowed");
|
|
96
136
|
const arbitraryReadable = validateTicketFormalization({
|
|
@@ -110,6 +150,6 @@ assert.equal(validateTicketFormalization({
|
|
|
110
150
|
vertical_slice_ticket_ref: "https://github.com/example/project/issues/1",
|
|
111
151
|
vertical_slice_ticket: { ref: "https://github.com/example/project/issues/1", kind: "vertical-slice-ticket", role: "ready-for-agent" },
|
|
112
152
|
slice_contract: { ...validTicketState.slice_contract, ticket_ref: "https://github.com/example/project/issues/1" },
|
|
113
|
-
}, { ...options, exists: (ref) => ref === "https://github.com/example/project/issues/1", read: (ref) => ref === "https://github.com/example/project/issues/1" ? decompositionResult.replace("docs/.scratch/demo/evidence/ticket-decomposition-result.yaml", "https://github.com/example/project/issues/1") : readFileSync(ref, "utf8") }).result, "allowed");
|
|
153
|
+
}, { ...options, exists: (ref) => ref === "https://github.com/example/project/issues/1" || exists(ref), read: (ref) => ref === "https://github.com/example/project/issues/1" ? decompositionResult.replace("docs/.scratch/demo/evidence/ticket-decomposition-result.yaml", "https://github.com/example/project/issues/1") : readFileSync(ref, "utf8") }).result, "allowed");
|
|
114
154
|
|
|
115
155
|
process.stdout.write("生命周期转换压力场景验证通过\n");
|
|
@@ -63,7 +63,7 @@
|
|
|
63
63
|
"source": "mattpocock/skills",
|
|
64
64
|
"sourceType": "github",
|
|
65
65
|
"skillPath": "skills/engineering/code-review/SKILL.md",
|
|
66
|
-
"effectiveHash": "
|
|
66
|
+
"effectiveHash": "660ca39ab37b65099940b2e6a197089291e2fb74494ec93bbeb8e2fde6559465",
|
|
67
67
|
"sourceRevision": "0ab1b63a410a03d3627979a109c8695de27af954",
|
|
68
68
|
"upstreamHash": "12daafb9c4f77deb3c3303dc2e6f8a3c2a0ff7928fc004af959ba18b8bd38068",
|
|
69
69
|
"adaptationRef": "docs/process/MATT-POCOCK-ENGINEERING-SKILLS.md",
|
|
@@ -937,7 +937,7 @@
|
|
|
937
937
|
"source": "project",
|
|
938
938
|
"sourceType": "local",
|
|
939
939
|
"skillPath": ".agents/skills/yss-ddd-scaffold-generator/SKILL.md",
|
|
940
|
-
"effectiveHash": "
|
|
940
|
+
"effectiveHash": "96e1c82c538a96af293273906db5ddefcf9943e8b76bb47b05d08772f16258cb",
|
|
941
941
|
"targets": [
|
|
942
942
|
".agents/skills",
|
|
943
943
|
".claude/skills",
|
|
@@ -1078,7 +1078,7 @@
|
|
|
1078
1078
|
"source": "project",
|
|
1079
1079
|
"sourceType": "local",
|
|
1080
1080
|
"skillPath": ".agents/skills/yss-frontend-scaffold-generator/SKILL.md",
|
|
1081
|
-
"effectiveHash": "
|
|
1081
|
+
"effectiveHash": "968c213c90a30d719e51050a6122ef729bc03ae97d2841a5d47824d68a5d27ff",
|
|
1082
1082
|
"targets": [
|
|
1083
1083
|
".agents/skills",
|
|
1084
1084
|
".claude/skills",
|
|
@@ -1108,7 +1108,7 @@
|
|
|
1108
1108
|
"source": "project",
|
|
1109
1109
|
"sourceType": "local",
|
|
1110
1110
|
"skillPath": ".agents/skills/yss-implementation-contract-compiler/SKILL.md",
|
|
1111
|
-
"effectiveHash": "
|
|
1111
|
+
"effectiveHash": "96582c950a13f26a7c16b2087d0614cb28a99f0f805190fc64cfc80e6456c335",
|
|
1112
1112
|
"targets": [
|
|
1113
1113
|
".agents/skills",
|
|
1114
1114
|
".claude/skills",
|
|
@@ -1123,7 +1123,7 @@
|
|
|
1123
1123
|
"source": "project",
|
|
1124
1124
|
"sourceType": "local",
|
|
1125
1125
|
"skillPath": ".agents/skills/yss-layered-mvc-scaffold-generator/SKILL.md",
|
|
1126
|
-
"effectiveHash": "
|
|
1126
|
+
"effectiveHash": "50d0f704326fc523c29f4b728c08148cde372c674b9e8686829bee3e74b66fdc",
|
|
1127
1127
|
"targets": [
|
|
1128
1128
|
".agents/skills",
|
|
1129
1129
|
".claude/skills",
|
|
@@ -1183,7 +1183,7 @@
|
|
|
1183
1183
|
"source": "project",
|
|
1184
1184
|
"sourceType": "local",
|
|
1185
1185
|
"skillPath": ".agents/skills/yss-mybatis/SKILL.md",
|
|
1186
|
-
"effectiveHash": "
|
|
1186
|
+
"effectiveHash": "8ab792d519c045a8a682942185f9aae3dcabfe86dbd8a4a9a444d7f657798701",
|
|
1187
1187
|
"targets": [
|
|
1188
1188
|
".agents/skills",
|
|
1189
1189
|
".claude/skills",
|
|
@@ -1228,7 +1228,7 @@
|
|
|
1228
1228
|
"source": "project",
|
|
1229
1229
|
"sourceType": "local",
|
|
1230
1230
|
"skillPath": ".agents/skills/yss-product-lifecycle/SKILL.md",
|
|
1231
|
-
"effectiveHash": "
|
|
1231
|
+
"effectiveHash": "d317bd2799da0442745c8126e62f7919a0b3de03f2c3cc2e1a7ca0433dc69645",
|
|
1232
1232
|
"targets": [
|
|
1233
1233
|
".agents/skills",
|
|
1234
1234
|
".claude/skills",
|
|
@@ -1261,7 +1261,7 @@
|
|
|
1261
1261
|
"source": "project",
|
|
1262
1262
|
"sourceType": "local",
|
|
1263
1263
|
"skillPath": ".agents/skills/yss-repository/SKILL.md",
|
|
1264
|
-
"effectiveHash": "
|
|
1264
|
+
"effectiveHash": "0abe4e8f4896613985074615281f11711b807fcfc5727a6e6d2e7d2ebcf7ddc7",
|
|
1265
1265
|
"targets": [
|
|
1266
1266
|
".agents/skills",
|
|
1267
1267
|
".claude/skills",
|
|
@@ -1324,7 +1324,7 @@
|
|
|
1324
1324
|
"source": "project",
|
|
1325
1325
|
"sourceType": "local",
|
|
1326
1326
|
"skillPath": ".agents/skills/yss-skill-source-index-refresh/SKILL.md",
|
|
1327
|
-
"effectiveHash": "
|
|
1327
|
+
"effectiveHash": "96ff974a0f7b3db8de09680daf9ecada94dd19f608341dcc85a32d40c02591b0",
|
|
1328
1328
|
"targets": [
|
|
1329
1329
|
".agents/skills",
|
|
1330
1330
|
".claude/skills",
|
package/template.snapshot.json
CHANGED
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
"templateName": "yss-spec-project-template",
|
|
4
4
|
"templateSource": "github:iloveZzz/yss-spec-project-template",
|
|
5
5
|
"templateRepository": "https://github.com/iloveZzz/yss-spec-project-template.git",
|
|
6
|
-
"requestedRef": "
|
|
7
|
-
"templateCommit": "
|
|
6
|
+
"requestedRef": "6f5c5d80adcdb743fb06199f70a7ab0b0a640ce5",
|
|
7
|
+
"templateCommit": "6f5c5d80adcdb743fb06199f70a7ab0b0a640ce5",
|
|
8
8
|
"manifestHash": "f7520dfdfa388b19ea47cb893c2daab8936019783aa84589f13921e459702280",
|
|
9
9
|
"encodedPaths": {
|
|
10
10
|
".codex/skills/data-analytics/.gitignore": ".codex/skills/data-analytics/__yss_dotfile__.gitignore",
|
|
@@ -12,6 +12,6 @@
|
|
|
12
12
|
".codex/skills/product-design/templates/prototype/.npmrc": ".codex/skills/product-design/templates/prototype/__yss_dotfile__.npmrc",
|
|
13
13
|
".gitignore": "__yss_dotfile__.gitignore"
|
|
14
14
|
},
|
|
15
|
-
"snapshotHash": "
|
|
16
|
-
"generatedAt": "2026-09-
|
|
15
|
+
"snapshotHash": "2a676bf4ed0d3151bab51ad900181cbb8fdd628385572e11dd398bcbaceab61b",
|
|
16
|
+
"generatedAt": "2026-09-09T02:16:12.516Z"
|
|
17
17
|
}
|