create-yss-spec 3.4.1 → 3.4.3
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 +1 -1
- package/package.json +2 -2
- package/template/.agents/skills/.strategic-design-skills-manifest.json +1 -1
- package/template/.agents/skills/archify/SKILL.md +1 -1
- package/template/.agents/skills/code-review/SKILL.md +12 -8
- package/template/.agents/skills/file-export-download/SKILL.md +1 -1
- package/template/.agents/skills/frontend-commit/SKILL.md +1 -1
- package/template/.agents/skills/java-backend-commit/SKILL.md +1 -1
- package/template/.agents/skills/llm-wiki/SKILL.md +1 -6
- package/template/.agents/skills/lombok/SKILL.md +10 -336
- package/template/.agents/skills/lombok/references/annotation-examples.md +307 -0
- package/template/.agents/skills/maintaining-skills/SKILL.md +2 -1
- package/template/.agents/skills/maintaining-skills/references/authoring.md +27 -0
- package/template/.agents/skills/mapstruct/SKILL.md +11 -318
- package/template/.agents/skills/mapstruct/references/annotation-examples.md +300 -0
- package/template/.agents/skills/page-form-module/SKILL.md +1 -1
- package/template/.agents/skills/page-skeleton/SKILL.md +1 -1
- package/template/.agents/skills/theme-token-usage/SKILL.md +1 -1
- package/template/.agents/skills/to-tickets/SKILL.md +1 -1
- package/template/.agents/skills/using-git-worktrees/SKILL.md +1 -1
- package/template/.agents/skills/wayfinder/SKILL.md +1 -1
- package/template/.agents/skills/yedit-table-usage/SKILL.md +1 -1
- package/template/.agents/skills/yss-api-integration/SKILL.md +1 -1
- package/template/.agents/skills/yss-audit-log/SKILL.md +1 -1
- package/template/.agents/skills/yss-cache/SKILL.md +1 -1
- package/template/.agents/skills/yss-ddd-scaffold-generator/SKILL.md +15 -2
- package/template/.agents/skills/yss-ddd-scaffold-generator/assets/templates/pom/application-pom.xml.template +1 -1
- package/template/.agents/skills/yss-ddd-scaffold-generator/assets/templates/pom/parent-pom.xml.template +15 -10
- package/template/.agents/skills/yss-ddd-scaffold-generator/assets/templates/pom/web-pom.xml.template +3 -3
- package/template/.agents/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-parent/SKILL.md +3 -3
- package/template/.agents/skills/yss-ddd-scaffold-generator/scripts/first-slice-compatibility.test.mjs +5 -1
- package/template/.agents/skills/yss-ddd-scaffold-generator/scripts/first-slice-verification.test.mjs +5 -2
- package/template/.agents/skills/yss-ddd-scaffold-generator/scripts/generate_scaffold.mjs +13 -10
- package/template/.agents/skills/yss-ddd-scaffold-generator/scripts/run_first_slice_verification.mjs +2 -1
- package/template/.agents/skills/yss-ddd-scaffold-generator/scripts/run_scaffold_verification.mjs +35 -3
- package/template/.agents/skills/yss-ddd-scaffold-generator/scripts/scaffold-generator.test.mjs +1 -1
- package/template/.agents/skills/yss-distributed-id/SKILL.md +1 -1
- package/template/.agents/skills/yss-dto/SKILL.md +5 -1
- package/template/.agents/skills/yss-excel-mvc/SKILL.md +1 -1
- package/template/.agents/skills/yss-exception/SKILL.md +5 -1
- package/template/.agents/skills/yss-formily-schema-generator/SKILL.md +1 -1
- package/template/.agents/skills/yss-implementation-contract-compiler/SKILL.md +13 -5
- package/template/.agents/skills/yss-implementation-contract-compiler/agents/openai.yaml +1 -1
- package/template/.agents/skills/yss-implementation-contract-compiler/references/compiler-contract.yaml +16 -0
- package/template/.agents/skills/yss-implementation-contract-compiler/references/slice-implementation-contract-v2.md +214 -0
- package/template/.agents/skills/yss-implementation-contract-compiler/references/slice-implementation-contract.md +66 -204
- package/template/.agents/skills/yss-layered-mvc-scaffold-generator/SKILL.md +15 -2
- package/template/.agents/skills/yss-layered-mvc-scaffold-generator/scripts/generate_scaffold.mjs +28 -19
- package/template/.agents/skills/yss-layered-mvc-scaffold-generator/scripts/scaffold-generator.test.mjs +10 -10
- package/template/.agents/skills/yss-mybatis/SKILL.md +4 -0
- package/template/.agents/skills/yss-openapi-draft-review/SKILL.md +1 -1
- package/template/.agents/skills/yss-openapi-governance/SKILL.md +1 -1
- package/template/.agents/skills/yss-product-lifecycle/SKILL.md +4 -4
- package/template/.agents/skills/yss-product-lifecycle/references/orchestration-contract.yaml +7 -2
- package/template/.agents/skills/yss-product-lifecycle/references/orchestration.md +4 -0
- package/template/.agents/skills/yss-product-lifecycle/references/state-model.md +2 -0
- package/template/.agents/skills/yss-product-lifecycle/references/user-decisions.md +23 -3
- package/template/.agents/skills/yss-prototype-stage/SKILL.md +1 -1
- package/template/.agents/skills/yss-repository/SKILL.md +4 -0
- package/template/.agents/skills/yss-research/SKILL.md +1 -1
- package/template/.agents/skills/yss-resilience4j/SKILL.md +1 -1
- package/template/.agents/skills/yss-security-algorithm/SKILL.md +1 -1
- package/template/.agents/skills/yss-tactical-design/SKILL.md +4 -0
- package/template/.agents/skills/yss-technical-design/SKILL.md +4 -0
- package/template/.agents/skills/yss-technical-design/scripts/validate-technical-design.mjs +2 -2
- package/template/.agents/skills/yss-ui/SKILL.md +1 -1
- package/template/.agents/skills/yss-ui-business-page-generation/SKILL.md +1 -1
- package/template/.agents/skills/yss-up-springboot3/SKILL.md +1 -1
- package/template/.agents/skills/yss-use-table-height/SKILL.md +1 -1
- package/template/.agents/skills/yss-use-tree-height/SKILL.md +1 -1
- package/template/.agents/skills/yss-userinfo/SKILL.md +1 -1
- package/template/.agents/skills/yss-validation/SKILL.md +5 -1
- package/template/.agents/skills/yss-web-controller/SKILL.md +5 -1
- package/template/.agents/skills/yss-web-controller/scripts/generate_controller.mjs +5 -2
- package/template/.agents/skills/ytable-usage/SKILL.md +1 -1
- package/template/.agents/skills/ytree-usage/SKILL.md +1 -1
- package/template/.codex/skills/archify/SKILL.md +1 -1
- package/template/.codex/skills/code-review/SKILL.md +12 -8
- package/template/.codex/skills/data-analytics/skills/analyze-data-quality/SKILL.md +1 -1
- package/template/.codex/skills/data-analytics/skills/build-dashboard/SKILL.md +1 -1
- package/template/.codex/skills/data-analytics/skills/build-report/SKILL.md +1 -1
- package/template/.codex/skills/data-analytics/skills/design-kpis/SKILL.md +1 -1
- package/template/.codex/skills/data-analytics/skills/gather-business-context/SKILL.md +1 -1
- package/template/.codex/skills/data-analytics/skills/index/SKILL.md +1 -1
- package/template/.codex/skills/data-analytics/skills/jupyter-notebooks/SKILL.md +1 -1
- package/template/.codex/skills/data-analytics/skills/kpi-reporting/SKILL.md +1 -1
- package/template/.codex/skills/data-analytics/skills/market-sizing/SKILL.md +1 -1
- package/template/.codex/skills/data-analytics/skills/metric-diagnostics/SKILL.md +1 -1
- package/template/.codex/skills/data-analytics/skills/product-business-analysis/SKILL.md +1 -1
- package/template/.codex/skills/data-analytics/skills/spreadsheets/SKILL.md +1 -1
- package/template/.codex/skills/data-analytics/skills/validate-data/SKILL.md +1 -1
- package/template/.codex/skills/data-analytics/skills/visualize-data/SKILL.md +1 -1
- package/template/.codex/skills/file-export-download/SKILL.md +1 -1
- package/template/.codex/skills/frontend-commit/SKILL.md +1 -1
- package/template/.codex/skills/java-backend-commit/SKILL.md +1 -1
- package/template/.codex/skills/llm-wiki/SKILL.md +1 -6
- package/template/.codex/skills/lombok/SKILL.md +10 -336
- package/template/.codex/skills/lombok/references/annotation-examples.md +307 -0
- package/template/.codex/skills/maintaining-skills/SKILL.md +2 -1
- package/template/.codex/skills/maintaining-skills/references/authoring.md +27 -0
- package/template/.codex/skills/mapstruct/SKILL.md +11 -318
- package/template/.codex/skills/mapstruct/references/annotation-examples.md +300 -0
- package/template/.codex/skills/page-form-module/SKILL.md +1 -1
- package/template/.codex/skills/page-skeleton/SKILL.md +1 -1
- package/template/.codex/skills/product-design/skills/audit/SKILL.md +1 -1
- package/template/.codex/skills/product-design/skills/design-qa/SKILL.md +1 -1
- package/template/.codex/skills/product-design/skills/get-context/SKILL.md +1 -1
- package/template/.codex/skills/product-design/skills/ideate/SKILL.md +1 -1
- package/template/.codex/skills/product-design/skills/image-to-code/SKILL.md +1 -1
- package/template/.codex/skills/product-design/skills/index/SKILL.md +1 -1
- package/template/.codex/skills/product-design/skills/prototype/SKILL.md +1 -1
- package/template/.codex/skills/product-design/skills/research/SKILL.md +1 -1
- package/template/.codex/skills/product-design/skills/user-context/SKILL.md +1 -1
- package/template/.codex/skills/theme-token-usage/SKILL.md +1 -1
- package/template/.codex/skills/to-tickets/SKILL.md +1 -1
- package/template/.codex/skills/using-git-worktrees/SKILL.md +1 -1
- package/template/.codex/skills/wayfinder/SKILL.md +1 -1
- package/template/.codex/skills/yedit-table-usage/SKILL.md +1 -1
- package/template/.codex/skills/yss-api-integration/SKILL.md +1 -1
- package/template/.codex/skills/yss-audit-log/SKILL.md +1 -1
- package/template/.codex/skills/yss-cache/SKILL.md +1 -1
- package/template/.codex/skills/yss-ddd-scaffold-generator/SKILL.md +15 -2
- package/template/.codex/skills/yss-ddd-scaffold-generator/assets/templates/pom/application-pom.xml.template +1 -1
- package/template/.codex/skills/yss-ddd-scaffold-generator/assets/templates/pom/parent-pom.xml.template +15 -10
- package/template/.codex/skills/yss-ddd-scaffold-generator/assets/templates/pom/web-pom.xml.template +3 -3
- package/template/.codex/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-parent/SKILL.md +3 -3
- package/template/.codex/skills/yss-ddd-scaffold-generator/scripts/first-slice-compatibility.test.mjs +5 -1
- package/template/.codex/skills/yss-ddd-scaffold-generator/scripts/first-slice-verification.test.mjs +5 -2
- package/template/.codex/skills/yss-ddd-scaffold-generator/scripts/generate_scaffold.mjs +13 -10
- package/template/.codex/skills/yss-ddd-scaffold-generator/scripts/run_first_slice_verification.mjs +2 -1
- package/template/.codex/skills/yss-ddd-scaffold-generator/scripts/run_scaffold_verification.mjs +35 -3
- package/template/.codex/skills/yss-ddd-scaffold-generator/scripts/scaffold-generator.test.mjs +1 -1
- package/template/.codex/skills/yss-distributed-id/SKILL.md +1 -1
- package/template/.codex/skills/yss-dto/SKILL.md +5 -1
- package/template/.codex/skills/yss-excel-mvc/SKILL.md +1 -1
- package/template/.codex/skills/yss-exception/SKILL.md +5 -1
- package/template/.codex/skills/yss-formily-schema-generator/SKILL.md +1 -1
- package/template/.codex/skills/yss-implementation-contract-compiler/SKILL.md +13 -5
- package/template/.codex/skills/yss-implementation-contract-compiler/agents/openai.yaml +1 -1
- package/template/.codex/skills/yss-implementation-contract-compiler/references/compiler-contract.yaml +16 -0
- package/template/.codex/skills/yss-implementation-contract-compiler/references/slice-implementation-contract-v2.md +214 -0
- package/template/.codex/skills/yss-implementation-contract-compiler/references/slice-implementation-contract.md +66 -204
- package/template/.codex/skills/yss-layered-mvc-scaffold-generator/SKILL.md +15 -2
- package/template/.codex/skills/yss-layered-mvc-scaffold-generator/scripts/generate_scaffold.mjs +28 -19
- package/template/.codex/skills/yss-layered-mvc-scaffold-generator/scripts/scaffold-generator.test.mjs +10 -10
- package/template/.codex/skills/yss-mybatis/SKILL.md +4 -0
- package/template/.codex/skills/yss-openapi-draft-review/SKILL.md +1 -1
- package/template/.codex/skills/yss-openapi-governance/SKILL.md +1 -1
- package/template/.codex/skills/yss-product-lifecycle/SKILL.md +4 -4
- package/template/.codex/skills/yss-product-lifecycle/references/orchestration-contract.yaml +7 -2
- package/template/.codex/skills/yss-product-lifecycle/references/orchestration.md +4 -0
- package/template/.codex/skills/yss-product-lifecycle/references/state-model.md +2 -0
- package/template/.codex/skills/yss-product-lifecycle/references/user-decisions.md +23 -3
- package/template/.codex/skills/yss-prototype-stage/SKILL.md +1 -1
- package/template/.codex/skills/yss-repository/SKILL.md +4 -0
- package/template/.codex/skills/yss-research/SKILL.md +1 -1
- package/template/.codex/skills/yss-resilience4j/SKILL.md +1 -1
- package/template/.codex/skills/yss-security-algorithm/SKILL.md +1 -1
- package/template/.codex/skills/yss-tactical-design/SKILL.md +4 -0
- package/template/.codex/skills/yss-technical-design/SKILL.md +4 -0
- package/template/.codex/skills/yss-technical-design/scripts/validate-technical-design.mjs +2 -2
- package/template/.codex/skills/yss-ui/SKILL.md +1 -1
- package/template/.codex/skills/yss-ui-business-page-generation/SKILL.md +1 -1
- package/template/.codex/skills/yss-up-springboot3/SKILL.md +1 -1
- package/template/.codex/skills/yss-use-table-height/SKILL.md +1 -1
- package/template/.codex/skills/yss-use-tree-height/SKILL.md +1 -1
- package/template/.codex/skills/yss-userinfo/SKILL.md +1 -1
- package/template/.codex/skills/yss-validation/SKILL.md +5 -1
- package/template/.codex/skills/yss-web-controller/SKILL.md +5 -1
- package/template/.codex/skills/yss-web-controller/scripts/generate_controller.mjs +5 -2
- package/template/.codex/skills/ytable-usage/SKILL.md +1 -1
- package/template/.codex/skills/ytree-usage/SKILL.md +1 -1
- package/template/.cursor/skills/archify/SKILL.md +1 -1
- package/template/.cursor/skills/code-review/SKILL.md +12 -8
- package/template/.cursor/skills/file-export-download/SKILL.md +1 -1
- package/template/.cursor/skills/frontend-commit/SKILL.md +1 -1
- package/template/.cursor/skills/java-backend-commit/SKILL.md +1 -1
- package/template/.cursor/skills/llm-wiki/SKILL.md +1 -6
- package/template/.cursor/skills/lombok/SKILL.md +10 -336
- package/template/.cursor/skills/lombok/references/annotation-examples.md +307 -0
- package/template/.cursor/skills/maintaining-skills/SKILL.md +2 -1
- package/template/.cursor/skills/maintaining-skills/references/authoring.md +27 -0
- package/template/.cursor/skills/mapstruct/SKILL.md +11 -318
- package/template/.cursor/skills/mapstruct/references/annotation-examples.md +300 -0
- package/template/.cursor/skills/page-form-module/SKILL.md +1 -1
- package/template/.cursor/skills/page-skeleton/SKILL.md +1 -1
- package/template/.cursor/skills/theme-token-usage/SKILL.md +1 -1
- package/template/.cursor/skills/to-tickets/SKILL.md +1 -1
- package/template/.cursor/skills/using-git-worktrees/SKILL.md +1 -1
- package/template/.cursor/skills/wayfinder/SKILL.md +1 -1
- package/template/.cursor/skills/yedit-table-usage/SKILL.md +1 -1
- package/template/.cursor/skills/yss-api-integration/SKILL.md +1 -1
- package/template/.cursor/skills/yss-audit-log/SKILL.md +1 -1
- package/template/.cursor/skills/yss-cache/SKILL.md +1 -1
- package/template/.cursor/skills/yss-ddd-scaffold-generator/SKILL.md +15 -2
- package/template/.cursor/skills/yss-ddd-scaffold-generator/assets/templates/pom/application-pom.xml.template +1 -1
- package/template/.cursor/skills/yss-ddd-scaffold-generator/assets/templates/pom/parent-pom.xml.template +15 -10
- package/template/.cursor/skills/yss-ddd-scaffold-generator/assets/templates/pom/web-pom.xml.template +3 -3
- package/template/.cursor/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-parent/SKILL.md +3 -3
- package/template/.cursor/skills/yss-ddd-scaffold-generator/scripts/first-slice-compatibility.test.mjs +5 -1
- package/template/.cursor/skills/yss-ddd-scaffold-generator/scripts/first-slice-verification.test.mjs +5 -2
- package/template/.cursor/skills/yss-ddd-scaffold-generator/scripts/generate_scaffold.mjs +13 -10
- package/template/.cursor/skills/yss-ddd-scaffold-generator/scripts/run_first_slice_verification.mjs +2 -1
- package/template/.cursor/skills/yss-ddd-scaffold-generator/scripts/run_scaffold_verification.mjs +35 -3
- package/template/.cursor/skills/yss-ddd-scaffold-generator/scripts/scaffold-generator.test.mjs +1 -1
- package/template/.cursor/skills/yss-distributed-id/SKILL.md +1 -1
- package/template/.cursor/skills/yss-dto/SKILL.md +5 -1
- package/template/.cursor/skills/yss-excel-mvc/SKILL.md +1 -1
- package/template/.cursor/skills/yss-exception/SKILL.md +5 -1
- package/template/.cursor/skills/yss-formily-schema-generator/SKILL.md +1 -1
- package/template/.cursor/skills/yss-implementation-contract-compiler/SKILL.md +13 -5
- package/template/.cursor/skills/yss-implementation-contract-compiler/agents/openai.yaml +1 -1
- package/template/.cursor/skills/yss-implementation-contract-compiler/references/compiler-contract.yaml +16 -0
- package/template/.cursor/skills/yss-implementation-contract-compiler/references/slice-implementation-contract-v2.md +214 -0
- package/template/.cursor/skills/yss-implementation-contract-compiler/references/slice-implementation-contract.md +66 -204
- package/template/.cursor/skills/yss-layered-mvc-scaffold-generator/SKILL.md +15 -2
- package/template/.cursor/skills/yss-layered-mvc-scaffold-generator/scripts/generate_scaffold.mjs +28 -19
- package/template/.cursor/skills/yss-layered-mvc-scaffold-generator/scripts/scaffold-generator.test.mjs +10 -10
- package/template/.cursor/skills/yss-mybatis/SKILL.md +4 -0
- package/template/.cursor/skills/yss-openapi-draft-review/SKILL.md +1 -1
- package/template/.cursor/skills/yss-openapi-governance/SKILL.md +1 -1
- package/template/.cursor/skills/yss-product-lifecycle/SKILL.md +4 -4
- package/template/.cursor/skills/yss-product-lifecycle/references/orchestration-contract.yaml +7 -2
- package/template/.cursor/skills/yss-product-lifecycle/references/orchestration.md +4 -0
- package/template/.cursor/skills/yss-product-lifecycle/references/state-model.md +2 -0
- package/template/.cursor/skills/yss-product-lifecycle/references/user-decisions.md +23 -3
- package/template/.cursor/skills/yss-prototype-stage/SKILL.md +1 -1
- package/template/.cursor/skills/yss-repository/SKILL.md +4 -0
- package/template/.cursor/skills/yss-research/SKILL.md +1 -1
- package/template/.cursor/skills/yss-resilience4j/SKILL.md +1 -1
- package/template/.cursor/skills/yss-security-algorithm/SKILL.md +1 -1
- package/template/.cursor/skills/yss-tactical-design/SKILL.md +4 -0
- package/template/.cursor/skills/yss-technical-design/SKILL.md +4 -0
- package/template/.cursor/skills/yss-technical-design/scripts/validate-technical-design.mjs +2 -2
- package/template/.cursor/skills/yss-ui/SKILL.md +1 -1
- package/template/.cursor/skills/yss-ui-business-page-generation/SKILL.md +1 -1
- package/template/.cursor/skills/yss-up-springboot3/SKILL.md +1 -1
- package/template/.cursor/skills/yss-use-table-height/SKILL.md +1 -1
- package/template/.cursor/skills/yss-use-tree-height/SKILL.md +1 -1
- package/template/.cursor/skills/yss-userinfo/SKILL.md +1 -1
- package/template/.cursor/skills/yss-validation/SKILL.md +5 -1
- package/template/.cursor/skills/yss-web-controller/SKILL.md +5 -1
- package/template/.cursor/skills/yss-web-controller/scripts/generate_controller.mjs +5 -2
- package/template/.cursor/skills/ytable-usage/SKILL.md +1 -1
- package/template/.cursor/skills/ytree-usage/SKILL.md +1 -1
- package/template/.pi/skills/archify/SKILL.md +1 -1
- package/template/.pi/skills/code-review/SKILL.md +12 -8
- package/template/.pi/skills/file-export-download/SKILL.md +1 -1
- package/template/.pi/skills/frontend-commit/SKILL.md +1 -1
- package/template/.pi/skills/java-backend-commit/SKILL.md +1 -1
- package/template/.pi/skills/llm-wiki/SKILL.md +1 -6
- package/template/.pi/skills/lombok/SKILL.md +10 -336
- package/template/.pi/skills/lombok/references/annotation-examples.md +307 -0
- package/template/.pi/skills/maintaining-skills/SKILL.md +2 -1
- package/template/.pi/skills/maintaining-skills/references/authoring.md +27 -0
- package/template/.pi/skills/mapstruct/SKILL.md +11 -318
- package/template/.pi/skills/mapstruct/references/annotation-examples.md +300 -0
- package/template/.pi/skills/page-form-module/SKILL.md +1 -1
- package/template/.pi/skills/page-skeleton/SKILL.md +1 -1
- package/template/.pi/skills/theme-token-usage/SKILL.md +1 -1
- package/template/.pi/skills/to-tickets/SKILL.md +1 -1
- package/template/.pi/skills/using-git-worktrees/SKILL.md +1 -1
- package/template/.pi/skills/wayfinder/SKILL.md +1 -1
- package/template/.pi/skills/yedit-table-usage/SKILL.md +1 -1
- package/template/.pi/skills/yss-api-integration/SKILL.md +1 -1
- package/template/.pi/skills/yss-audit-log/SKILL.md +1 -1
- package/template/.pi/skills/yss-cache/SKILL.md +1 -1
- package/template/.pi/skills/yss-ddd-scaffold-generator/SKILL.md +15 -2
- package/template/.pi/skills/yss-ddd-scaffold-generator/assets/templates/pom/application-pom.xml.template +1 -1
- package/template/.pi/skills/yss-ddd-scaffold-generator/assets/templates/pom/parent-pom.xml.template +15 -10
- package/template/.pi/skills/yss-ddd-scaffold-generator/assets/templates/pom/web-pom.xml.template +3 -3
- package/template/.pi/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-parent/SKILL.md +3 -3
- package/template/.pi/skills/yss-ddd-scaffold-generator/scripts/first-slice-compatibility.test.mjs +5 -1
- package/template/.pi/skills/yss-ddd-scaffold-generator/scripts/first-slice-verification.test.mjs +5 -2
- package/template/.pi/skills/yss-ddd-scaffold-generator/scripts/generate_scaffold.mjs +13 -10
- package/template/.pi/skills/yss-ddd-scaffold-generator/scripts/run_first_slice_verification.mjs +2 -1
- package/template/.pi/skills/yss-ddd-scaffold-generator/scripts/run_scaffold_verification.mjs +35 -3
- package/template/.pi/skills/yss-ddd-scaffold-generator/scripts/scaffold-generator.test.mjs +1 -1
- package/template/.pi/skills/yss-distributed-id/SKILL.md +1 -1
- package/template/.pi/skills/yss-dto/SKILL.md +5 -1
- package/template/.pi/skills/yss-excel-mvc/SKILL.md +1 -1
- package/template/.pi/skills/yss-exception/SKILL.md +5 -1
- package/template/.pi/skills/yss-formily-schema-generator/SKILL.md +1 -1
- package/template/.pi/skills/yss-implementation-contract-compiler/SKILL.md +13 -5
- package/template/.pi/skills/yss-implementation-contract-compiler/agents/openai.yaml +1 -1
- package/template/.pi/skills/yss-implementation-contract-compiler/references/compiler-contract.yaml +16 -0
- package/template/.pi/skills/yss-implementation-contract-compiler/references/slice-implementation-contract-v2.md +214 -0
- package/template/.pi/skills/yss-implementation-contract-compiler/references/slice-implementation-contract.md +66 -204
- package/template/.pi/skills/yss-layered-mvc-scaffold-generator/SKILL.md +15 -2
- package/template/.pi/skills/yss-layered-mvc-scaffold-generator/scripts/generate_scaffold.mjs +28 -19
- package/template/.pi/skills/yss-layered-mvc-scaffold-generator/scripts/scaffold-generator.test.mjs +10 -10
- package/template/.pi/skills/yss-mybatis/SKILL.md +4 -0
- package/template/.pi/skills/yss-openapi-draft-review/SKILL.md +1 -1
- package/template/.pi/skills/yss-openapi-governance/SKILL.md +1 -1
- package/template/.pi/skills/yss-product-lifecycle/SKILL.md +4 -4
- package/template/.pi/skills/yss-product-lifecycle/references/orchestration-contract.yaml +7 -2
- package/template/.pi/skills/yss-product-lifecycle/references/orchestration.md +4 -0
- package/template/.pi/skills/yss-product-lifecycle/references/state-model.md +2 -0
- package/template/.pi/skills/yss-product-lifecycle/references/user-decisions.md +23 -3
- package/template/.pi/skills/yss-prototype-stage/SKILL.md +1 -1
- package/template/.pi/skills/yss-repository/SKILL.md +4 -0
- package/template/.pi/skills/yss-research/SKILL.md +1 -1
- package/template/.pi/skills/yss-resilience4j/SKILL.md +1 -1
- package/template/.pi/skills/yss-security-algorithm/SKILL.md +1 -1
- package/template/.pi/skills/yss-tactical-design/SKILL.md +4 -0
- package/template/.pi/skills/yss-technical-design/SKILL.md +4 -0
- package/template/.pi/skills/yss-technical-design/scripts/validate-technical-design.mjs +2 -2
- package/template/.pi/skills/yss-ui/SKILL.md +1 -1
- package/template/.pi/skills/yss-ui-business-page-generation/SKILL.md +1 -1
- package/template/.pi/skills/yss-up-springboot3/SKILL.md +1 -1
- package/template/.pi/skills/yss-use-table-height/SKILL.md +1 -1
- package/template/.pi/skills/yss-use-tree-height/SKILL.md +1 -1
- package/template/.pi/skills/yss-userinfo/SKILL.md +1 -1
- package/template/.pi/skills/yss-validation/SKILL.md +5 -1
- package/template/.pi/skills/yss-web-controller/SKILL.md +5 -1
- package/template/.pi/skills/yss-web-controller/scripts/generate_controller.mjs +5 -2
- package/template/.pi/skills/ytable-usage/SKILL.md +1 -1
- package/template/.pi/skills/ytree-usage/SKILL.md +1 -1
- package/template/AGENTS.md +1 -0
- package/template/CONTEXT.md +2 -1
- package/template/docs/agents/backend-architecture-profiles.md +1 -1
- package/template/docs/agents/digital-human-roles.yaml +25 -1
- package/template/docs/agents/issue-tracker.md +2 -0
- package/template/docs/engineering/backend-platforms.json +174 -0
- package/template/docs/engineering/backend-platforms.md +77 -0
- package/template/docs/process/MATT-POCOCK-ENGINEERING-SKILLS.md +1 -0
- package/template/docs/process/harness-process-tailoring.md +9 -1
- package/template/docs/process/lifecycle-artifact-map.md +4 -4
- package/template/docs/process/lifecycle-registry-baseline.json +1 -1
- package/template/docs/process/lifecycle-registry.yaml +4 -4
- package/template/docs/process/schemas/backend-architecture-identity.schema.json +91 -0
- package/template/docs/process/schemas/digital-human-task-package.schema.json +2 -1
- package/template/docs/process/schemas/lifecycle-checkpoint.schema.json +4 -0
- package/template/docs/process/schemas/project-scaffold-contract.schema.json +602 -83
- package/template/docs/process/schemas/scaffold-architecture-decisions.schema.json +323 -39
- package/template/docs/process/schemas/slice-implementation-contract-v3.schema.json +925 -0
- package/template/docs/templates/approval-record-template.yaml +2 -0
- package/template/docs/templates/vertical-slice-ticket-template.md +22 -31
- package/template/scripts/backend-platforms +14 -0
- package/template/scripts/lib/approval-record.mjs +32 -6
- package/template/scripts/lib/approved-execution-context.mjs +31 -8
- package/template/scripts/lib/backend-architecture.mjs +6 -0
- package/template/scripts/lib/backend-platform-provenance.mjs +67 -0
- package/template/scripts/lib/backend-platform-verification.mjs +210 -0
- package/template/scripts/lib/backend-platform.mjs +175 -0
- package/template/scripts/lib/backend-scaffold-prerequisites.mjs +1 -1
- package/template/scripts/lib/decision-continuation.mjs +79 -0
- package/template/scripts/lib/delivery-preflight.mjs +6 -5
- package/template/scripts/lib/digital-human-roles.mjs +10 -0
- package/template/scripts/lib/frontend-delivery-boundary.mjs +3 -0
- package/template/scripts/lib/implementation-contract-compiler.mjs +42 -9
- package/template/scripts/lib/lifecycle-controls.mjs +2 -2
- package/template/scripts/lib/lifecycle-transition.mjs +3 -1
- package/template/scripts/lib/plan-spec-entry.mjs +3 -3
- package/template/scripts/lib/scaffold-local-database.mjs +1 -0
- package/template/scripts/lib/slice-applicability.mjs +10 -0
- package/template/scripts/lib/slice-contract-preparation.mjs +257 -0
- package/template/scripts/lib/slice-contract-views.mjs +52 -0
- package/template/scripts/lib/slice-contract.mjs +211 -0
- package/template/scripts/lib/slice-repositories.mjs +49 -0
- package/template/scripts/lib/slice-task-package.mjs +66 -0
- package/template/scripts/lib/strategic-handoff.mjs +12 -1
- package/template/scripts/lib/task-package.mjs +6 -2
- package/template/scripts/lib/technical-design-boundary.mjs +1 -0
- package/template/scripts/lib/user-decision-reuse.mjs +1 -0
- package/template/scripts/lib/user-decision.mjs +4 -1
- package/template/scripts/preflight-delivery +2 -2
- package/template/scripts/slice-contract +30 -0
- package/template/scripts/verify-backend-platform-matrix +69 -0
- package/template/scripts/verify-scaffold-architecture-decisions +5 -0
- package/template/scripts/verify-user-decision +7 -2
- package/template/skills-lock.json +60 -55
- package/template.snapshot.json +3 -3
|
@@ -1,210 +1,72 @@
|
|
|
1
|
-
# Slice Implementation Contract
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
`
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
prototype_review:
|
|
23
|
-
prototype_profile_decision:
|
|
24
|
-
prototype_deliverable:
|
|
25
|
-
prototype_deliverable_verification:
|
|
26
|
-
prototype_confirmation:
|
|
27
|
-
openapi_freeze_or_no_impact:
|
|
28
|
-
architecture_review:
|
|
29
|
-
data_architecture:
|
|
30
|
-
engineering_baseline:
|
|
31
|
-
technical_design: # 阅读引用;与 resolution.technical_design.ref 指向同一文件
|
|
32
|
-
tactical_design: # 旧 DDD 引用兼容
|
|
33
|
-
build_architecture_checklist:
|
|
34
|
-
implementation_repository:
|
|
35
|
-
frontend_repository:
|
|
36
|
-
backend_repository:
|
|
37
|
-
maven_wrapper:
|
|
38
|
-
readiness:
|
|
39
|
-
blockers: []
|
|
40
|
-
stale_inputs: []
|
|
41
|
-
not_applicable:
|
|
42
|
-
- item:
|
|
43
|
-
reason:
|
|
44
|
-
resolution:
|
|
45
|
-
technical_design: # 有技术设计影响时由编译器绑定,DDD / MVC 共用
|
|
46
|
-
ref:
|
|
47
|
-
version:
|
|
48
|
-
digest: # 已持久化合同原始字节摘要
|
|
49
|
-
required_capabilities: []
|
|
50
|
-
required_skills: []
|
|
51
|
-
recipe_ids: []
|
|
52
|
-
conditions: []
|
|
53
|
-
reason_chains: {}
|
|
54
|
-
registry_digest: # sha256 of normalized docs/agents/yss-skill-registry.yaml
|
|
55
|
-
compiler_contract_digest: # sha256 of normalized compiler-contract.yaml
|
|
56
|
-
compiled_at:
|
|
57
|
-
freshness: current # digest 变化后为 stale
|
|
58
|
-
common:
|
|
59
|
-
impacted_areas: []
|
|
60
|
-
implementation_path_policy: harness-apps-multi-project # or external-repository-native | git-submodule-harness-apps
|
|
61
|
-
project_roots: []
|
|
62
|
-
required_capabilities: []
|
|
63
|
-
required_skills: []
|
|
64
|
-
optional_skills: []
|
|
65
|
-
unavailable_skills:
|
|
66
|
-
- skill:
|
|
67
|
-
provider:
|
|
68
|
-
fallback: blocked | approved-equivalent
|
|
69
|
-
resolution:
|
|
70
|
-
allowed_write_paths: []
|
|
71
|
-
forbidden_patterns: []
|
|
72
|
-
expected_evidence_files: []
|
|
73
|
-
verification_commands: []
|
|
74
|
-
human_review_points: []
|
|
75
|
-
full_reroute_triggers: []
|
|
76
|
-
quality_baseline_ref:
|
|
77
|
-
context_plan:
|
|
78
|
-
required_context_refs: []
|
|
79
|
-
on_demand_context_refs: []
|
|
80
|
-
context_stop_rule: minimal-sufficient-evidence
|
|
81
|
-
missing_context_action: blocked # or reroute
|
|
82
|
-
doubt_driven_review:
|
|
83
|
-
status: not-applicable # or required / completed / blocked
|
|
84
|
-
trigger_impacts: []
|
|
85
|
-
claim:
|
|
86
|
-
counterclaim:
|
|
87
|
-
evidence_refs: []
|
|
88
|
-
residual_risks: []
|
|
89
|
-
reviewer_ref:
|
|
90
|
-
frontend:
|
|
91
|
-
status: not-applicable
|
|
92
|
-
required_skills: []
|
|
93
|
-
approved_prototype_ref:
|
|
94
|
-
state_matrix_ref:
|
|
95
|
-
visual_baseline_ref:
|
|
96
|
-
visual_baseline_case_ids: []
|
|
97
|
-
generated_api_client_ref:
|
|
98
|
-
allowed_write_paths: []
|
|
99
|
-
component_test_seams: []
|
|
100
|
-
e2e_paths: []
|
|
101
|
-
backend:
|
|
102
|
-
status: not-applicable
|
|
103
|
-
affected_layers: []
|
|
104
|
-
component_impacts: []
|
|
105
|
-
required_skills: []
|
|
106
|
-
application_boundary:
|
|
107
|
-
transaction_boundary:
|
|
108
|
-
persistence_strategy:
|
|
109
|
-
tactical_design_ref:
|
|
110
|
-
tactical_design_version:
|
|
111
|
-
aggregate_refs: []
|
|
112
|
-
invariant_refs: []
|
|
113
|
-
state_behavior_refs: []
|
|
114
|
-
gateway_boundary_ref:
|
|
115
|
-
domain_test_seams: []
|
|
116
|
-
application_test_seams: []
|
|
117
|
-
tactical_ddd:
|
|
118
|
-
status: not-applicable
|
|
119
|
-
tactical_design_ref:
|
|
120
|
-
tactical_design_version:
|
|
121
|
-
aggregate_refs: []
|
|
122
|
-
invariant_refs: []
|
|
123
|
-
state_behavior_refs: []
|
|
124
|
-
gateway_boundary_ref:
|
|
125
|
-
domain_test_seams: []
|
|
126
|
-
application_test_seams: []
|
|
127
|
-
allowed_write_paths: []
|
|
128
|
-
forbidden_patterns: []
|
|
129
|
-
expected_evidence_files: []
|
|
130
|
-
seam_deferred: []
|
|
131
|
-
verification_commands: []
|
|
132
|
-
contract:
|
|
133
|
-
api_impact: false
|
|
134
|
-
freeze_ref:
|
|
135
|
-
no_api_impact_ref:
|
|
136
|
-
generated_clients: []
|
|
137
|
-
contract_tests: []
|
|
138
|
-
regeneration_commands: []
|
|
139
|
-
cross_repo:
|
|
140
|
-
repositories: []
|
|
141
|
-
delivery_order: []
|
|
142
|
-
integration_verification: []
|
|
143
|
-
rollback_order: []
|
|
144
|
-
work_units:
|
|
145
|
-
- id: slice-frontend
|
|
146
|
-
role_id: role.frontend-engineer
|
|
147
|
-
runtime_id: runtime.skill-projection
|
|
148
|
-
execution_state: Worker
|
|
149
|
-
workflow_status: not-started
|
|
150
|
-
task_package_ref:
|
|
151
|
-
contract_id: # must equal slice_contract.contract_id
|
|
152
|
-
contract_version: # must equal slice_contract.contract_version
|
|
153
|
-
downstream_consumers: []
|
|
154
|
-
convergence_ref:
|
|
155
|
-
work_unit:
|
|
156
|
-
behavior:
|
|
157
|
-
primary_skill:
|
|
158
|
-
supporting_skills: []
|
|
159
|
-
tdd_mode: behavior-tdd
|
|
160
|
-
allowed_write_paths: []
|
|
161
|
-
expected_evidence: []
|
|
162
|
-
verification_commands: []
|
|
163
|
-
- id: slice-backend
|
|
164
|
-
role_id: role.backend-engineer
|
|
165
|
-
runtime_id: runtime.skill-projection
|
|
166
|
-
execution_state: Worker
|
|
167
|
-
workflow_status: not-started
|
|
168
|
-
task_package_ref:
|
|
169
|
-
contract_id:
|
|
170
|
-
contract_version:
|
|
171
|
-
downstream_consumers: []
|
|
172
|
-
convergence_ref:
|
|
173
|
-
work_unit:
|
|
174
|
-
behavior:
|
|
175
|
-
primary_skill:
|
|
176
|
-
supporting_skills: []
|
|
177
|
-
tdd_mode: behavior-tdd
|
|
178
|
-
allowed_write_paths: []
|
|
179
|
-
expected_evidence: []
|
|
180
|
-
verification_commands: []
|
|
181
|
-
```
|
|
1
|
+
# Slice Implementation Contract v3
|
|
2
|
+
|
|
3
|
+
YAML 是唯一权威合同。Agent 从已确认上游整理草案;用户确认目标、范围、验收和关键取舍;独立专业审查核验工程约束,生命周期主控关闭 `gate.slice-contract-approved`。新合同使用 schema v3;[v2](slice-implementation-contract-v2.md) 保留原规则读取和校验,schema v1 继续拒绝。
|
|
4
|
+
|
|
5
|
+
结构权威为 `docs/process/schemas/slice-implementation-contract-v3.schema.json`。Registry、编译规则与 Execution Result 继续使用各自版本;Slice v3 不要求它们一同升级。
|
|
6
|
+
|
|
7
|
+
## 只保存一次
|
|
8
|
+
|
|
9
|
+
| 分组 | 填写内容 | 不再重复填写 |
|
|
10
|
+
|---|---|---|
|
|
11
|
+
| 身份 | schema_version、contract_id、contract_version、slice_id、status | 任务内不复制合同身份 |
|
|
12
|
+
| basis | 上游 ref、原字节 digest、已知 version 和适用 approval_ref | 同一文件用本组键名别名,不复制 Spec、技术设计正文 |
|
|
13
|
+
| scope | 影响面、工程根、写边界及本切片约束 | 子合同不再保存同一 Skill、路径、命令 |
|
|
14
|
+
| applicability | frontend/backend/api/cross_repo 的 required 或带理由的 not-applicable | 不适用的 extensions 整段省略;缺信息不能省略 |
|
|
15
|
+
| resolution | 冻结 capability、Skill、Recipe、条件、Registry/Compiler 摘要及适用架构身份 | 原因链、编译时间、实时 freshness 不进入权威合同 |
|
|
16
|
+
| acceptance | 本切片验收 ID 对应 basis 来源和 locator | 验收正文仍在 Ticket / Spec |
|
|
17
|
+
| verification | 命令、cwd、test_seams、expected_evidence、acceptance_refs | 工作单元通过 verification_refs 选择;required_for_all 自动继承 |
|
|
18
|
+
| work_units | 行为、角色、主辅 Skill、TDD 模式、验收和验证引用 | 写路径默认继承 scope,只能收窄;runtime、派发和进度留在任务包 |
|
|
19
|
+
| extensions | 适用 frontend/backend/api/cross_repo 的独有信息 | 后端设计用 design_refs 定位;仅切片新增约束进入 backend.constraints |
|
|
20
|
+
|
|
21
|
+
`basis` 别名必须可解析且无循环。所有引用先校验原字节摘要;已知版本必须绑定。locator 支持唯一文字/稳定 ID、`lines:起始-结束`、结构化资产的 `pointer:/design/...`;歧义或缺失阻断。行区间绑定文件摘要,源内容变化后必须重新核验。
|
|
182
22
|
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
controlled_generation:
|
|
196
|
-
exception_reason:
|
|
197
|
-
generator:
|
|
198
|
-
generator_inputs: []
|
|
199
|
-
expected_files: []
|
|
200
|
-
verification_commands: []
|
|
201
|
-
behavior_tests_after_generation: []
|
|
23
|
+
scope.implementation_path_policy 保留 `external-repository-native`、`harness-apps-multi-project`、`git-submodule-harness-apps`;gitlink 登记、attached HEAD 和禁止覆盖的边界仍按原仓库接入规则校验。
|
|
24
|
+
|
|
25
|
+
每项验收必须映射到工作单元与验证。每条验证指定已登记工程内的 cwd;多工程工作单元明确 project_root。跨仓扩展保留交付、联合验证和回滚顺序,数组顺序不能排序消除。任务所选 Skill 必须属于冻结闭包;共享约束始终继承。
|
|
26
|
+
|
|
27
|
+
## 准备和查看
|
|
28
|
+
|
|
29
|
+
```sh
|
|
30
|
+
scripts/slice-contract prepare <ticket.md> --input <本切片补充.yaml> --output <新合同.yaml> --root <治理根>
|
|
31
|
+
scripts/slice-contract view <合同.yaml> --root <治理根>
|
|
32
|
+
scripts/slice-contract view <合同.yaml> --unit <work-unit-id> --root <治理根>
|
|
33
|
+
scripts/slice-contract diff <旧合同.yaml> <新合同.yaml> --root <治理根>
|
|
34
|
+
scripts/slice-contract migrate <旧v2.yaml> --input <迁移补充.yaml> --output <新v3.yaml> --root <治理根>
|
|
202
35
|
```
|
|
203
36
|
|
|
204
|
-
`
|
|
37
|
+
`--input` 只传 `sources` 来源选择、`refinements` 新增细化,以及需要时的 checkpoint_ref / approved_slice。可直接调用 `prepareSliceImplementationContract`,避免另存补充文件;临时补充不是批准或执行合同。Ticket 已有 `slice_implementation` frontmatter 或 checkpoint 中同名事实时自动读取,不要求补录全部合同。普通 Markdown Ticket 的验收列表自动按原行定位;其他非结构化语义由 Agent 带来源整理,仍需专业审查。
|
|
38
|
+
|
|
39
|
+
先复用登记中的工程根和基线中的架构身份。登记写范围仅为上限,不能当作切片授权。多来源冲突、未明影响和缺少必要资产输出具体 blocker。输入变化不能用最后覆盖处理;先修正来源或重新确定切片细化。
|
|
40
|
+
|
|
41
|
+
输出为 `{slice_contract, report}`;report 包含来源、缺口、原因链和检查结果,不是第二份合同。`persistSliceDraft` 只写新路径,保存前复核读取过的来源,不覆盖既有草案或已批准合同。CLI `verify` 只检查合同与来源,不证明批准有效。
|
|
42
|
+
|
|
43
|
+
审阅视图展示交付行为、范围、验收、取舍与风险,任务视图附完整全局和专项约束。Markdown 和结构化视图同源,携带合同 ID、版本与原字节摘要,不可反向作为执行授权。差异按原字节与结构比较,未知字段、缺少旧来源快照或来源漂移明确显示,不自动判定用户授权可以延续。
|
|
44
|
+
|
|
45
|
+
## 审查、批准与派发
|
|
46
|
+
|
|
47
|
+
- 默认一名有对应能力的独立专业审查者,核验范围、验收覆盖、工程约束和验证充分性。相邻检查可共用现有 review-bundle;不重复要求用户审阅工程字段。
|
|
48
|
+
- 当前合同的工程审查使用现有 `check.design-reviewed` 会签记录,绑定 `subject_ref`、无前缀 subject_digest、artifact_bindings,以及不同的 principal_ref / drafter_principal_ref;findings 为明确数组。未关闭缺陷、缺证据和重要风险阻断,建议须有 follow_up。
|
|
49
|
+
- 生命周期把审查记录引用放入 Slice gate 的 evidence_refs。合同最终字节(包含生命周期设置的状态)冻结后绑定审查和 checkpoint;单独的 `status: approved` 不授予执行权。
|
|
50
|
+
- 用户决定沿用现有 user-decisions 协议:已覆盖且无实质变化时复用,缺失确认或决定变化才集中询问。Spec 确认不自动升级为实施授权,不改写原回复。
|
|
51
|
+
- `compileSliceTaskPackage` 只从已批准原始 YAML 生成任务包,角色 Skill 来自 `taskPackageDefaults`;运行时身份在派发时选择。已有任务包 schema 不变,`contract.gate_refs` 为唯一当前批准 checkpoint 引用。
|
|
52
|
+
- 批准、范围、派发、freshness 和结果核验共用 `normalizeSliceContract`;展开只在内存发生。执行结果仍是 v2,并用 verification_results 的 cwd 证明命令执行位置;任务验收需要全部声明命令、实际结果及可读预期证据。
|
|
53
|
+
|
|
54
|
+
## 兼容与迁移
|
|
55
|
+
|
|
56
|
+
v2 不自动改写,也不忽略旧 Compiler/Registry 摘要漂移。显式迁移要求新 contract_version,输出草案并重新计算冻结结果;不继承旧批准。重复字段冲突、未映射约束、模糊验收映射和子合同独有边界均阻断并列明恢复动作。v2 runtime / workflow 状态不进入 v3 合同,保留在原文件和现有任务证据中。
|
|
57
|
+
|
|
58
|
+
本试点不改技术设计、脚手架、审批记录、交付合同结构,不新增管理页面或跨进程缓存。
|
|
59
|
+
|
|
60
|
+
## 第二轮增量规则
|
|
61
|
+
|
|
62
|
+
新草案的 `ticket_policy` 声明 `frozen-requirements` / `tracker-or-task-package`,Ticket 必须有 requirement_version 或显式绑定版本。冻结后进度、验收结果、会签与重路由记录进入现有 tracker / 任务包;需求改动生成新版本,不重新解释旧合同的绑定。审阅视图分别显示冻结时状态与当前状态的读取位置。
|
|
63
|
+
|
|
64
|
+
明确 `scope.risk_level` 后,准备器绑定生命周期注册表和裁剪依据,并从注册表已发布架构审查的 trigger 条件计算 `applicability.checks`。缺少该声明的旧 v3 保留原保守材料要求。已有 UI 承接须声明 `frontend.baseline_kind: existing-ui-baseline` 与 `ui_change: none`,绑定已有观测包和前端交付验收;UI 变化仍走产品设计证据。未知影响、必要证据缺失和外部强制审批不能裁掉。
|
|
65
|
+
|
|
66
|
+
准备报告按来源发现、独立检查、依赖检查和组装给出诊断;blocker 的稳定 code、field、source_ref、responsibility 与 recovery 可用于一次回交。责任类别为 agent、professional-review、user-decision。依赖缺失的下游标记 not-executed。报告随草案保存为 `.preparation.json`,绑定 YAML 原始字节;阻断草案只显示诊断,不能批准或执行。报告 metrics 只记录本次实测准备耗时,未观测的补材料轮次与人工确认次数为 null,不把夹具当成真实工时收益。
|
|
205
67
|
|
|
206
|
-
`
|
|
68
|
+
多工程新草案在 `basis.repository_preparation` 绑定现有 schema v2 多项目准备结果。`extensions.cross_repo.repository_bindings` 以工程根为键,仅引用 basis 中各工程的 implementation_repository、engineering_baseline、manifest、technical_design 或 frontend_delivery;不复制文件事实。可用 recipe_refs / capability_refs 选择全局编译输入中的适用项。逐仓登记、基线身份、写上限、设计与编译约束都必须满足;所有工作单元显式选择 project_root。delivery_order 与 rollback_order 完整列出工程根;integration_verification 引用 verification 的 ID,联合验证用 cwd 和 dependency_roots 明确位置及依赖。
|
|
207
69
|
|
|
208
|
-
|
|
70
|
+
跨仓 `createApprovedExecutionContext` / `createApprovedRecompilationContext` 使用 `work_unit_id`,歧义阻断。Execution Result 保持 schema v2,跨仓 changed_files / evidence_files 使用 `{path, project_root}`;证据文件从所属工程读取,verification_results 必须携带真实 cwd 和适用 dependency_roots。单仓旧调用继续兼容。接收端重读来源批准与编译摘要并检查角色范围,不能用本地默认编译结果替换不支持的来源版本。
|
|
209
71
|
|
|
210
|
-
|
|
72
|
+
来源别名在单次读取内合并,审阅复用本次规范化的来源快照;没有外部可传入的缓存对象。执行边界始终重新读取。差异的 scope / acceptance / authorization / engineering-detail 分类附原字节证据与待审查说明;presentation-only 也不授予批准或确认语义等价。
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: yss-layered-mvc-scaffold-generator
|
|
3
|
-
description:
|
|
3
|
+
description: 用于在生命周期已批准的脚手架合同下生成按批准 Spring Boot / Java 平台生成通用 YSS 分层 MVC 后端工程;核心模块为 server、service、repository,并按能力确定性增加 adapter、client、feign-client。
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# YSS Layered MVC Scaffold Generator
|
|
@@ -16,13 +16,26 @@ description: 用于在生命周期已批准的脚手架合同下生成通用 YSS
|
|
|
16
16
|
|
|
17
17
|
任一条件缺失时返回 `blocked`。本生成器无交互、无默认回退;用户选择由 `yss-product-lifecycle` 在 `work-unit.technical-analysis` 的工程基线内完成。
|
|
18
18
|
|
|
19
|
+
## Spring Boot / Java 平台选择
|
|
20
|
+
|
|
21
|
+
调用本技能时先展示 `scripts/backend-platforms` 的精确版本清单及兼容状态。由生命周期编排器把架构、Spring Boot、Java 和 YSS 父 POM/BOM 合并展示并取得真实用户确认;生成器不提问、不猜版本、不使用 `x` 或 `latest`。已有批准且当前的选择展示摘要后复用。
|
|
22
|
+
|
|
23
|
+
- 候选平台:Boot 2.7.18 / Java 8,Boot 3.5.16 / Java 17 或 21,Boot 4.1.1 / Java 17 或 21。新 Boot 默认推荐 Java 17;候选不等于可生成。
|
|
24
|
+
- 独立子项目可继承主项目组合或覆盖,必须逐项目确认(允许一次确认明确列出的项目);同一 Maven Reactor 使用一个平台。
|
|
25
|
+
- 只开放共享兼容清单中已有真实 YSS 构建、依赖和启动证据的组合。缺少兼容父 POM、BOM、starter 或相应能力证据即 `blocked`;不替换官方组件、不降级回退。
|
|
26
|
+
- 新生成合同必须有 `platform_configuration` v2,与架构决策、Maven 坐标及兼容条目摘要一致。Boot、Java、YSS 坐标或依赖配方变化时回生命周期重新确认并编译合同;仅追加同配置验证记录不重复确认,仍核验证据有效性。
|
|
27
|
+
- Spring MVC、Servlet、Validation、Jackson 和 starter 坐标消费共享平台清单;Boot 3.5 / 4.1 拒绝 Java 8/11。Jakarta 转换不包括 `javax.sql` 等 Java SE API。
|
|
28
|
+
- 平台候选维护验证产物标记 `platform_verification=candidate`,不能交给业务生成、升级完成等级或进入首切片验证。测试夹具不证明 YSS 兼容。
|
|
29
|
+
|
|
30
|
+
版本清单、合同字段、候选验证和支持晋级规则见 仓库共享合同 `docs/engineering/backend-platforms.md`。
|
|
31
|
+
|
|
19
32
|
## 架构与 Profile
|
|
20
33
|
|
|
21
34
|
- 固定核心模块:`server`、`service`、`repository`。
|
|
22
35
|
- `external-integration` 增加 `adapter`。
|
|
23
36
|
- `published-client` 增加 `client`。
|
|
24
37
|
- `feign-client` 增加 `client`、`feign-client`。
|
|
25
|
-
-
|
|
38
|
+
- 平台来自批准的 `platform_configuration`;保留 YSS BOM、MyBatis-Plus,不固定单一 Boot/Java/Validation 命名空间。
|
|
26
39
|
- 固定 architecture_profile=layered-mvc-service;verification_database=h2、production_database=not-bound。测试使用 H2,本地运行显式启用 scaffold-local;不引入外部驱动/数据源。
|
|
27
40
|
|
|
28
41
|
能力解析规则、模块职责和依赖方向见 [architecture.md](references/architecture.md)。生成器必须同时校验 `requested_capabilities` 与 `resolved_modules`,不得自行补猜模块。
|
package/template/.agents/skills/yss-layered-mvc-scaffold-generator/scripts/generate_scaffold.mjs
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
/** 依据生命周期批准的 schema v4 合同生成纯机械 YSS 分层 MVC 后端骨架。 */
|
|
3
|
+
import { platformSourceFingerprint, generatedTreeDigest } from "../../../../scripts/lib/backend-platform-provenance.mjs";
|
|
4
|
+
import { assertContractPlatform, platformProfile, platformTemplateVars, platformSmokeTest } from "../../../../scripts/lib/backend-platform.mjs";
|
|
3
5
|
import { assertScaffoldUserDecision } from "../../../../scripts/lib/user-decision.mjs";
|
|
4
6
|
import { validateBackendScaffoldPrerequisites } from "../../../../scripts/lib/backend-scaffold-prerequisites.mjs";
|
|
5
7
|
import { createHash } from "node:crypto";
|
|
@@ -106,49 +108,51 @@ function dependency(groupId, artifactId, version = null, scope = null) {
|
|
|
106
108
|
return `<dependency><groupId>${xml(groupId)}</groupId><artifactId>${xml(artifactId)}</artifactId>${version ? `<version>${xml(version)}</version>` : ""}${scope ? `<scope>${scope}</scope>` : ""}</dependency>`;
|
|
107
109
|
}
|
|
108
110
|
|
|
109
|
-
function parentPom(contract, modules) {
|
|
111
|
+
function parentPom(contract, modules, platform) {
|
|
112
|
+
const v = platformTemplateVars(platform);
|
|
110
113
|
const c = contract.maven_coordinates;
|
|
111
114
|
return `<?xml version="1.0" encoding="UTF-8"?>
|
|
112
115
|
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
|
|
113
116
|
<modelVersion>4.0.0</modelVersion>
|
|
114
117
|
<parent><groupId>${xml(c.parent.group_id)}</groupId><artifactId>${xml(c.parent.artifact_id)}</artifactId><version>${xml(c.parent.version)}</version><relativePath/></parent>
|
|
115
118
|
<groupId>${xml(c.group_id)}</groupId><artifactId>${xml(contract.project_name)}</artifactId><version>${xml(c.project_version)}</version><packaging>pom</packaging>
|
|
116
|
-
<properties><java.version
|
|
119
|
+
<properties><java.version>${v.java_version}</java.version><spring-boot.version>${v.boot_version}</spring-boot.version><maven.compiler.source>${v.java_version}</maven.compiler.source><maven.compiler.target>${v.java_version}</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><yss-components.version>${xml(c.yss_components_version)}</yss-components.version></properties>
|
|
117
120
|
<modules>${modules.map((module) => `<module>${contract.project_name}-${module}</module>`).join("")}</modules>
|
|
118
|
-
<dependencyManagement><dependencies>${dependency("com.yss.cloud", "yss-components-bom", "${yss-components.version}", "import").replace("</dependency>", "<type>pom</type></dependency>")}</dependencies></dependencyManagement>
|
|
119
|
-
<build><pluginManagement><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-
|
|
121
|
+
<dependencyManagement><dependencies>${dependency("org.springframework.boot", "spring-boot-dependencies", v.boot_version, "import").replace("</dependency>", "<type>pom</type></dependency>")}${dependency("com.yss.cloud", "yss-components-bom", "${yss-components.version}", "import").replace("</dependency>", "<type>pom</type></dependency>")}</dependencies></dependencyManagement>
|
|
122
|
+
<build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-enforcer-plugin</artifactId><version>${v.enforcer_version}</version><executions><execution><id>enforce-platform</id><goals><goal>enforce</goal></goals><configuration><rules><requireJavaVersion><version>${v.java_range}</version></requireJavaVersion><requireMavenVersion><version>[3.6.3,)</version></requireMavenVersion><dependencyConvergence/></rules></configuration></execution></executions></plugin></plugins><pluginManagement><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>${v.boot_version}</version><executions><execution><goals><goal>repackage</goal></goals></execution></executions></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-surefire-plugin</artifactId><version>${v.surefire_version}</version></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>${v.compiler_version}</version><configuration><source>${v.java_version}</source><target>${v.java_version}</target><parameters>true</parameters><annotationProcessorPaths><path><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>${v.lombok_version}</version></path><path><groupId>org.mapstruct</groupId><artifactId>mapstruct-processor</artifactId><version>${v.mapstruct_version}</version></path><path><groupId>org.projectlombok</groupId><artifactId>lombok-mapstruct-binding</artifactId><version>0.2.0</version></path></annotationProcessorPaths></configuration></plugin></plugins></pluginManagement></build>
|
|
120
123
|
</project>`;
|
|
121
124
|
}
|
|
122
125
|
|
|
123
|
-
function modulePom(contract, module, modules) {
|
|
126
|
+
function modulePom(contract, module, modules, platform) {
|
|
124
127
|
const applicationModule = modules.includes("core") ? "core" : "service";
|
|
125
128
|
const own = (name) => dependency(contract.maven_coordinates.group_id, `${contract.project_name}-${name}`, "${project.version}");
|
|
126
129
|
const dependencies = [];
|
|
127
130
|
if (module === "server") {
|
|
128
|
-
dependencies.push(own(applicationModule), dependency("org.springframework.boot",
|
|
131
|
+
dependencies.push(own(applicationModule), dependency("org.springframework.boot", platform.web_starter), dependency("org.springframework.boot", "spring-boot-starter-validation"), dependency("org.springframework.boot", "spring-boot-starter-test", null, "test"), dependency("com.tngtech.archunit", "archunit-junit5", platform.versions.archunit, "test"));
|
|
132
|
+
if (platform.web_test_starter !== "spring-boot-starter-test") dependencies.push(dependency("org.springframework.boot", platform.web_test_starter, null, "test"));
|
|
129
133
|
if (modules.includes("client")) dependencies.push(own("client"));
|
|
130
|
-
dependencies.push(dependency("com.h2database", "h2", null, "test"), dependency("org.mapstruct", "mapstruct",
|
|
134
|
+
dependencies.push(dependency("com.h2database", "h2", null, "test"), dependency("org.mapstruct", "mapstruct", platform.versions.mapstruct), dependency("com.yss.cloud", "yss-component-dto"));
|
|
131
135
|
}
|
|
132
136
|
if (module === applicationModule) {
|
|
133
137
|
dependencies.push(own("repository"), dependency("org.springframework", "spring-tx"), dependency("com.yss.cloud", "yss-component-dto"), dependency("org.springframework.boot", "spring-boot-starter-test", null, "test"));
|
|
134
138
|
if (modules.includes("adapter")) dependencies.push(own("adapter"));
|
|
135
139
|
}
|
|
136
140
|
if (module === "repository") {
|
|
137
|
-
dependencies.push(dependency("com.yss.cloud", "yss-component-mybatis-plus-starter"), dependency("org.mapstruct", "mapstruct",
|
|
141
|
+
dependencies.push(dependency("com.yss.cloud", "yss-component-mybatis-plus-starter"), dependency("org.mapstruct", "mapstruct", platform.versions.mapstruct), dependency("org.springframework.boot", "spring-boot-starter-test", null, "test"), dependency("com.h2database", "h2", null, "test"));
|
|
138
142
|
}
|
|
139
143
|
if (module === "adapter") {
|
|
140
144
|
dependencies.push(dependency("org.springframework", "spring-context"));
|
|
141
145
|
if (modules.includes("feign-client")) dependencies.push(own("feign-client"));
|
|
142
146
|
}
|
|
143
|
-
if (module === "client") dependencies.push(dependency("com.yss.cloud", "yss-component-dto"), dependency(
|
|
144
|
-
if (["server", "service", "core", "client", "repository"].includes(module)) dependencies.push(dependency("org.projectlombok", "lombok",
|
|
145
|
-
if (module === "feign-client") dependencies.push(own("client"), dependency("org.springframework.cloud", "spring-cloud-openfeign-core"));
|
|
147
|
+
if (module === "client") dependencies.push(dependency("com.yss.cloud", "yss-component-dto"), dependency(platform.validation_group, platform.validation_artifact));
|
|
148
|
+
if (["server", "service", "core", "client", "repository"].includes(module)) dependencies.push(dependency("org.projectlombok", "lombok", platform.versions.lombok, "provided"));
|
|
149
|
+
if (module === "feign-client") dependencies.push(own("client"), dependency("org.springframework.cloud", contract.generator_skill === SKILL_ID ? "spring-cloud-starter-openfeign" : "spring-cloud-openfeign-core"));
|
|
146
150
|
const plugin = module === "server" ? `<profiles><profile><id>scaffold-local</id><dependencies>${dependency("com.h2database", "h2", null, "runtime")}</dependencies></profile></profiles><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build>` : "";
|
|
147
151
|
return `<?xml version="1.0" encoding="UTF-8"?>
|
|
148
152
|
<project xmlns="http://maven.apache.org/POM/4.0.0"><modelVersion>4.0.0</modelVersion><parent><groupId>${xml(contract.maven_coordinates.group_id)}</groupId><artifactId>${xml(contract.project_name)}</artifactId><version>${xml(contract.maven_coordinates.project_version)}</version></parent><artifactId>${xml(contract.project_name)}-${module}</artifactId><dependencies>${dependencies.join("")}</dependencies>${plugin}</project>`;
|
|
149
153
|
}
|
|
150
154
|
|
|
151
|
-
async function validateContract(options, skillId, architectureProfile) {
|
|
155
|
+
export async function validateContract(options, skillId, architectureProfile, platformOptions) {
|
|
152
156
|
const contractFile = path.resolve(options.contractFile);
|
|
153
157
|
const contractText = await readFile(contractFile, "utf8").catch(() => fail(`脚手架合同不可读取: ${contractFile}`));
|
|
154
158
|
let contract;
|
|
@@ -168,7 +172,7 @@ async function validateContract(options, skillId, architectureProfile) {
|
|
|
168
172
|
const finalProjectRoot = path.join(path.resolve(options.outputDir), options.projectName);
|
|
169
173
|
const allowedRoots = contract.allowed_write_paths.map((item) => path.resolve(options.outputDir, String(item)));
|
|
170
174
|
if (!allowedRoots.some((root) => isWithin(root, finalProjectRoot))) fail("实际项目根不在合同 allowed_write_paths 内");
|
|
171
|
-
const expectedProfiles = { architecture: "layered-mvc", persistence: "mybatis-plus",
|
|
175
|
+
const expectedProfiles = { architecture: "layered-mvc", persistence: "mybatis-plus", repository: "yss-internal" };
|
|
172
176
|
for (const [field, value] of Object.entries(expectedProfiles)) if (contract.profiles?.[field] !== value) fail(`unsupported profile ${field}: ${contract.profiles?.[field]}`);
|
|
173
177
|
assertLocalDatabaseProfile(contract.profiles);
|
|
174
178
|
if (contract.architecture_profile !== architectureProfile) fail(`合同必须显式绑定 ${architectureProfile} Profile`);
|
|
@@ -205,7 +209,9 @@ async function validateContract(options, skillId, architectureProfile) {
|
|
|
205
209
|
assertScaffoldUserDecision(decision);
|
|
206
210
|
validateArchitectureIdentity(scaffoldArchitectureIdentity(contract, sha256(contractText)));
|
|
207
211
|
const designPrerequisites = await validateBackendScaffoldPrerequisites(contract, { contractFile });
|
|
208
|
-
|
|
212
|
+
const platform = skillId === SKILL_ID ? assertContractPlatform(contract, decision, { ...platformOptions, requireVerified: platformOptions.candidate !== true }).profile : platformProfile("spring-boot-2.7-jdk8", undefined, "2.7.18");
|
|
213
|
+
if (skillId !== SKILL_ID && (contract.platform_configuration || contract.profiles.platform !== "spring-boot-2.7-jdk8" || contract.profiles.validation_namespace !== "javax")) fail("unsupported: data-analysis initializer remains on legacy Boot 2.7/Java 8");
|
|
214
|
+
return { contract, contractText, modules: resolved, designPrerequisites, platform };
|
|
209
215
|
}
|
|
210
216
|
|
|
211
217
|
async function validateOutputLayout(outputDir, projectName) {
|
|
@@ -221,10 +227,10 @@ async function validateOutputLayout(outputDir, projectName) {
|
|
|
221
227
|
if (await exists(target)) fail(`unsupported: 目标已存在 ${target}`);
|
|
222
228
|
}
|
|
223
229
|
|
|
224
|
-
export async function generate(options, { skillId = SKILL_ID, architectureProfile = "layered-mvc-service", finalize } = {}) {
|
|
230
|
+
export async function generate(options, { skillId = SKILL_ID, architectureProfile = "layered-mvc-service", finalize, platformOptions = {} } = {}) {
|
|
225
231
|
if (!((skillId === SKILL_ID && architectureProfile === "layered-mvc-service") || (skillId === "yss-mvc-data-analysis-project-initializer" && architectureProfile === "mvc-data-analysis-v1"))) fail("unsupported MVC generator/Profile pair");
|
|
226
232
|
await validateOutputLayout(options.outputDir, options.projectName);
|
|
227
|
-
const { contract, contractText, modules, designPrerequisites } = await validateContract(options, skillId, architectureProfile);
|
|
233
|
+
const { contract, contractText, modules, designPrerequisites, platform } = await validateContract(options, skillId, architectureProfile, platformOptions);
|
|
228
234
|
const outputDir = path.resolve(options.outputDir);
|
|
229
235
|
await mkdir(outputDir, { recursive: true });
|
|
230
236
|
const staging = await mkdtemp(path.join(outputDir, `.${options.projectName}.staging-`));
|
|
@@ -232,10 +238,10 @@ export async function generate(options, { skillId = SKILL_ID, architectureProfil
|
|
|
232
238
|
const packagePath = options.basePackage.replaceAll(".", "/");
|
|
233
239
|
try {
|
|
234
240
|
await mkdir(projectRoot, { recursive: true });
|
|
235
|
-
await put(projectRoot, "pom.xml", parentPom(contract, modules));
|
|
241
|
+
await put(projectRoot, "pom.xml", parentPom(contract, modules, platform));
|
|
236
242
|
for (const module of modules) {
|
|
237
243
|
const moduleRoot = `${options.projectName}-${module}`;
|
|
238
|
-
await put(projectRoot, `${moduleRoot}/pom.xml`, modulePom(contract, module, modules));
|
|
244
|
+
await put(projectRoot, `${moduleRoot}/pom.xml`, modulePom(contract, module, modules, platform));
|
|
239
245
|
await put(projectRoot, `${moduleRoot}/src/main/java/${packagePath}/${module.replaceAll("-", "/")}/package-info.java`, `/** ${module} mechanical package boundary. */\npackage ${options.basePackage}.${module.replaceAll("-", ".")};`);
|
|
240
246
|
}
|
|
241
247
|
const applicationClass = `${toUpperCamel(options.projectName)}Application`;
|
|
@@ -246,17 +252,20 @@ export async function generate(options, { skillId = SKILL_ID, architectureProfil
|
|
|
246
252
|
await put(projectRoot, `${serverRoot}/src/test/resources/application-scaffold-test.yml`, localDatabaseConfiguration(`${options.projectName}_test`));
|
|
247
253
|
await put(projectRoot, `${serverRoot}/src/test/java/${packagePath}/${applicationClass}Test.java`, `package ${options.basePackage};\n\nimport org.junit.jupiter.api.Test;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.test.context.ActiveProfiles;\n\n@SpringBootTest\n@ActiveProfiles("scaffold-test")\nclass ${applicationClass}Test {\n @Test\n void contextLoads() {\n }\n}`);
|
|
248
254
|
await put(projectRoot, `${serverRoot}/src/test/java/${packagePath}/architecture/LayeredMvcArchitectureTest.java`, `package ${options.basePackage}.architecture;\n\nimport static com.tngtech.archunit.lang.syntax.ArchRuleDefinition.noClasses;\n\nimport com.tngtech.archunit.core.importer.ImportOption;\nimport com.tngtech.archunit.junit.AnalyzeClasses;\nimport com.tngtech.archunit.junit.ArchTest;\nimport com.tngtech.archunit.lang.ArchRule;\n\n@AnalyzeClasses(packages = "${options.basePackage}", importOptions = ImportOption.DoNotIncludeTests.class)\nclass LayeredMvcArchitectureTest {\n @ArchTest\n static final ArchRule repositoryDoesNotDependOnUpperLayers = noClasses().that().resideInAPackage("..repository..").should().dependOnClassesThat().resideInAnyPackage("..service..", "..server..");\n}`);
|
|
255
|
+
if (skillId === SKILL_ID) await put(projectRoot, `${serverRoot}/src/test/java/${packagePath}/PlatformIntegrationTest.java`, platformSmokeTest(options.basePackage, platform, contract.module_profile.requested_capabilities));
|
|
249
256
|
const wrapper = path.join(REPOSITORY_ROOT, ".agents/skills/yss-ddd-scaffold-generator/assets/wrapper");
|
|
250
257
|
await cp(wrapper, projectRoot, { recursive: true });
|
|
251
258
|
await chmod(path.join(projectRoot, "mvnw"), 0o755);
|
|
252
259
|
if (finalize) await finalize({ projectRoot, contract, architectureIdentity: scaffoldArchitectureIdentity(contract, sha256(contractText)) });
|
|
253
|
-
await put(projectRoot, "README.md", `# ${options.projectName}\n\n该工程由 ${skillId} 根据批准的 schema v${contract.schema_version} 合同生成。模块:${modules.join("、")}。不包含业务 API、SQL 或生产数据库绑定。\n\n本地运行需同时显式启用 Maven -Pscaffold-local 和 Spring scaffold-local Profile;测试独立使用 H2。生产数据库须由后续已批准存储工作单元接入。`);
|
|
260
|
+
await put(projectRoot, "README.md", `# ${options.projectName}\n\n平台:Spring Boot ${platform.spring_boot_version} / Java ${platform.java_version}。\n\n该工程由 ${skillId} 根据批准的 schema v${contract.schema_version} 合同生成。模块:${modules.join("、")}。不包含业务 API、SQL 或生产数据库绑定。\n\n本地运行需同时显式启用 Maven -Pscaffold-local 和 Spring scaffold-local Profile;测试独立使用 H2。生产数据库须由后续已批准存储工作单元接入。`);
|
|
254
261
|
const generatedFiles = [];
|
|
255
262
|
for (const entry of await fileEntries(projectRoot, new Set([".yss/scaffold-generation.json"]))) generatedFiles.push({ path: entry.relative, owner: "generator", sha256: rawSha256(await readFile(entry.target)) });
|
|
256
263
|
const architectureRuleset = `${serverRoot}/src/test/java/${packagePath}/architecture/LayeredMvcArchitectureTest.java`;
|
|
257
264
|
const downstream = {};
|
|
258
265
|
for (const skill of ["yss-application", "yss-repository", "yss-mybatis", "yss-web-controller", "yss-dto", "yss-exception", "yss-validation", "mapstruct", "lombok", "alibaba-java-code-style"]) downstream[skill] = (await treeDigest(path.join(REPOSITORY_ROOT, ".agents/skills", skill))).replace(/^sha256:/, "");
|
|
259
266
|
const manifest = {
|
|
267
|
+
...(contract.platform_configuration ? { source_fingerprint: platformSourceFingerprint(contract.architecture_family), generated_tree_digest: generatedTreeDigest(projectRoot, { ownership: { generated_files: generatedFiles } }) } : {}),
|
|
268
|
+
...(contract.platform_configuration ? { platform_verification: platformOptions.candidate === true ? "candidate" : "verified", platform_configuration: contract.platform_configuration } : {}),
|
|
260
269
|
schema_version: 4,
|
|
261
270
|
kind: architectureProfile === "mvc-data-analysis-v1" ? "service-project-initialization" : "backend-scaffold",
|
|
262
271
|
architecture_profile: contract.architecture_profile,
|
|
@@ -106,7 +106,7 @@ test("旧数据库和 Mock 参数在写入前被拒绝", async (t) => {
|
|
|
106
106
|
|
|
107
107
|
test("统一 Project Scaffold Contract v4 可生成 Layered MVC 后端并保留设计门禁", async (t) => {
|
|
108
108
|
const data = await fixture(t);
|
|
109
|
-
const result = spawnSync(process.execPath, [script, ...data.args], { encoding: "utf8" });
|
|
109
|
+
const result = spawnSync(process.execPath, [path.resolve(path.dirname(script), "../../../../scripts/fixtures/backend-scaffold/generate-candidate.mjs"), script, ...data.args], { encoding: "utf8" });
|
|
110
110
|
assert.equal(result.status, 0, result.stderr);
|
|
111
111
|
const manifest = JSON.parse(await readFile(path.join(data.project, ".yss/scaffold-generation.json"), "utf8"));
|
|
112
112
|
assert.equal(manifest.schema_version, 4);
|
|
@@ -115,7 +115,7 @@ test("统一 Project Scaffold Contract v4 可生成 Layered MVC 后端并保留
|
|
|
115
115
|
|
|
116
116
|
test("数据影响为 required 时绑定数据架构后可生成 Layered MVC 后端", async (t) => {
|
|
117
117
|
const data = await fixture(t, { dataImpact: "required" });
|
|
118
|
-
const result = spawnSync(process.execPath, [script, ...data.args], { encoding: "utf8" });
|
|
118
|
+
const result = spawnSync(process.execPath, [path.resolve(path.dirname(script), "../../../../scripts/fixtures/backend-scaffold/generate-candidate.mjs"), script, ...data.args], { encoding: "utf8" });
|
|
119
119
|
assert.equal(result.status, 0, result.stderr);
|
|
120
120
|
const manifest = JSON.parse(await readFile(path.join(data.project, ".yss/scaffold-generation.json"), "utf8"));
|
|
121
121
|
assert.equal(manifest.design_prerequisites.data_architecture_decision.impact, "required");
|
|
@@ -123,7 +123,7 @@ test("数据影响为 required 时绑定数据架构后可生成 Layered MVC 后
|
|
|
123
123
|
|
|
124
124
|
test("API 影响为 required 时绑定同字节 Draft、Validation、Review 和 Freeze 后可生成 Layered MVC 后端", async (t) => {
|
|
125
125
|
const data = await fixture(t, { apiImpact: "required" });
|
|
126
|
-
const result = spawnSync(process.execPath, [script, ...data.args], { encoding: "utf8" });
|
|
126
|
+
const result = spawnSync(process.execPath, [path.resolve(path.dirname(script), "../../../../scripts/fixtures/backend-scaffold/generate-candidate.mjs"), script, ...data.args], { encoding: "utf8" });
|
|
127
127
|
assert.equal(result.status, 0, result.stderr);
|
|
128
128
|
const manifest = JSON.parse(await readFile(path.join(data.project, ".yss/scaffold-generation.json"), "utf8"));
|
|
129
129
|
assert.equal(manifest.design_prerequisites.api_contract_decision.impact, "required");
|
|
@@ -133,7 +133,7 @@ test("缺少设计门禁时在写文件前拒绝 Layered MVC 新生成", async (
|
|
|
133
133
|
const data = await fixture(t);
|
|
134
134
|
delete data.contract.design_prerequisites;
|
|
135
135
|
await writeFile(data.contractFile, JSON.stringify(data.contract));
|
|
136
|
-
const result = spawnSync(process.execPath, [script, ...data.args], { encoding: "utf8" });
|
|
136
|
+
const result = spawnSync(process.execPath, [path.resolve(path.dirname(script), "../../../../scripts/fixtures/backend-scaffold/generate-candidate.mjs"), script, ...data.args], { encoding: "utf8" });
|
|
137
137
|
assert.notEqual(result.status, 0);
|
|
138
138
|
assert.match(result.stderr, /design_prerequisites|Technical Design/);
|
|
139
139
|
await assert.rejects(stat(data.project), { code: "ENOENT" });
|
|
@@ -143,7 +143,7 @@ test("技术和数据设计齐全但缺少 API Decision 时在写文件前拒绝
|
|
|
143
143
|
const data = await fixture(t);
|
|
144
144
|
delete data.contract.design_prerequisites.api_contract_decision;
|
|
145
145
|
await writeFile(data.contractFile, JSON.stringify(data.contract));
|
|
146
|
-
const result = spawnSync(process.execPath, [script, ...data.args], { encoding: "utf8" });
|
|
146
|
+
const result = spawnSync(process.execPath, [path.resolve(path.dirname(script), "../../../../scripts/fixtures/backend-scaffold/generate-candidate.mjs"), script, ...data.args], { encoding: "utf8" });
|
|
147
147
|
assert.notEqual(result.status, 0);
|
|
148
148
|
assert.match(result.stderr, /API Contract Decision|api_contract_decision/);
|
|
149
149
|
await assert.rejects(stat(data.project), { code: "ENOENT" });
|
|
@@ -186,7 +186,7 @@ test("API Draft、Validation、Review 或工程批准异常时均在零写入状
|
|
|
186
186
|
for (const mutate of mutations) {
|
|
187
187
|
const data = await fixture(t, { apiImpact: "required" });
|
|
188
188
|
await mutate(data);
|
|
189
|
-
const result = spawnSync(process.execPath, [script, ...data.args], { encoding: "utf8" });
|
|
189
|
+
const result = spawnSync(process.execPath, [path.resolve(path.dirname(script), "../../../../scripts/fixtures/backend-scaffold/generate-candidate.mjs"), script, ...data.args], { encoding: "utf8" });
|
|
190
190
|
assert.notEqual(result.status, 0, result.stderr);
|
|
191
191
|
await assert.rejects(stat(data.project), { code: "ENOENT" });
|
|
192
192
|
}
|
|
@@ -194,7 +194,7 @@ test("API Draft、Validation、Review 或工程批准异常时均在零写入状
|
|
|
194
194
|
|
|
195
195
|
test("schema v3 只读兼容但禁止用于 Layered MVC 新生成", async (t) => {
|
|
196
196
|
const data = await fixture(t, { schemaVersion: 3 });
|
|
197
|
-
const result = spawnSync(process.execPath, [script, ...data.args], { encoding: "utf8" });
|
|
197
|
+
const result = spawnSync(process.execPath, [path.resolve(path.dirname(script), "../../../../scripts/fixtures/backend-scaffold/generate-candidate.mjs"), script, ...data.args], { encoding: "utf8" });
|
|
198
198
|
assert.notEqual(result.status, 0);
|
|
199
199
|
assert.match(result.stderr, /Project Scaffold Contract v4|新生成/);
|
|
200
200
|
await assert.rejects(stat(data.project), { code: "ENOENT" });
|
|
@@ -202,7 +202,7 @@ test("schema v3 只读兼容但禁止用于 Layered MVC 新生成", async (t) =>
|
|
|
202
202
|
|
|
203
203
|
test("可选离线 Maven 可行性检查(不替代受控仓库验收)", { skip: process.env.YSS_BACKEND_OFFLINE_PROBE !== "1" }, async (t) => {
|
|
204
204
|
const data = await fixture(t);
|
|
205
|
-
const generated = spawnSync(process.execPath, [script, ...data.args], { encoding: "utf8" });
|
|
205
|
+
const generated = spawnSync(process.execPath, [path.resolve(path.dirname(script), "../../../../scripts/fixtures/backend-scaffold/generate-candidate.mjs"), script, ...data.args], { encoding: "utf8" });
|
|
206
206
|
assert.equal(generated.status, 0, generated.stderr);
|
|
207
207
|
for (const phase of ["validate", "test", "package"]) {
|
|
208
208
|
const result = spawnSync(path.join(data.project, "mvnw"), ["-o", phase], { cwd: data.project, encoding: "utf8", timeout: 60_000 });
|
|
@@ -214,7 +214,7 @@ test("可选离线 Maven 可行性检查(不替代受控仓库验收)", { sk
|
|
|
214
214
|
for (const database of ["h2"]) {
|
|
215
215
|
test(`生成 ${database} 基础 Profile`, async (t) => {
|
|
216
216
|
const data = await fixture(t, { database });
|
|
217
|
-
const result = spawnSync(process.execPath, [script, ...data.args], { encoding: "utf8" });
|
|
217
|
+
const result = spawnSync(process.execPath, [path.resolve(path.dirname(script), "../../../../scripts/fixtures/backend-scaffold/generate-candidate.mjs"), script, ...data.args], { encoding: "utf8" });
|
|
218
218
|
assert.equal(result.status, 0, result.stderr);
|
|
219
219
|
const manifest = JSON.parse(await readFile(path.join(data.project, ".yss/scaffold-generation.json"), "utf8"));
|
|
220
220
|
assert.equal(manifest.schema_version, 4);
|
|
@@ -235,7 +235,7 @@ for (const database of ["h2"]) {
|
|
|
235
235
|
for (const [name, profile] of Object.entries(capabilityModules)) {
|
|
236
236
|
test(`能力闭包 ${name}`, async (t) => {
|
|
237
237
|
const data = await fixture(t, { profile });
|
|
238
|
-
const result = spawnSync(process.execPath, [script, ...data.args], { encoding: "utf8" });
|
|
238
|
+
const result = spawnSync(process.execPath, [path.resolve(path.dirname(script), "../../../../scripts/fixtures/backend-scaffold/generate-candidate.mjs"), script, ...data.args], { encoding: "utf8" });
|
|
239
239
|
assert.equal(result.status, 0, result.stderr);
|
|
240
240
|
const pom = await readFile(path.join(data.project, "pom.xml"), "utf8");
|
|
241
241
|
for (const module of profile.modules) assert.match(pom, new RegExp(`<module>demo-service-${module}</module>`));
|
|
@@ -51,3 +51,7 @@ description: 用于 YSS MyBatis / MyBatis-Plus 组件能力核验、接入决策
|
|
|
51
51
|
- 行为变更使用 `behavior-tdd`;纯 Mapper/XML 骨架仅在批准合同明确为 `controlled-generation` 时允许。
|
|
52
52
|
- 使用项目根 `./mvnw ...` 记录实际命令、退出码和时间;H2 只证明本地/测试行为,不证明生产方言。
|
|
53
53
|
- 按 [YSS Skill Execution Result v2](../yss-implementation-contract-compiler/references/yss-skill-execution-result.md) 返回证据、`seam_deferred`、`deviations`、`new_impacts`、`drift` 和 `violation`。
|
|
54
|
+
|
|
55
|
+
## 新脚手架平台约束
|
|
56
|
+
|
|
57
|
+
消费批准切片架构身份中的 `platform_configuration`,与工程 Manifest 核对后使用对应 YSS 组件。Boot 2.7 使用 `javax` Web/Validation API;Boot 3.5/4.1 使用 `jakarta`。Boot 4 按 Jackson 3、对应自动配置和 starter 适配;不替换 `javax.sql` 等 Java SE 包。平台不一致、兼容条目缺失或候选未验证时回合同编译器阻断,不在业务实现中升级或替换组件。详见 仓库共享合同 `docs/engineering/backend-platforms.md`。
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: yss-openapi-draft-review
|
|
3
|
-
description:
|
|
3
|
+
description: "审查 YSS OpenAPI Draft 的需求覆盖、页面动作、响应、错误与测试 seam;不执行 Freeze。"
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# YSS OpenAPI Draft Review
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: yss-openapi-governance
|
|
3
|
-
description:
|
|
3
|
+
description: "维护、校验、冻结或导出 YSS OpenAPI 3.1 设计合同;以冻结 YAML 生成受审查的 JSON。"
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# YSS OpenAPI Governance
|