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
package/template/.codex/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
|
|
@@ -27,7 +27,7 @@ description: 编排 YSS 产品或模块从机会调研到 Spec、原型、技术
|
|
|
27
27
|
scripts/query-lifecycle-context --mode route --stage stage.plan --work-unit work-unit.plan-requirements --include execution_efficiency
|
|
28
28
|
```
|
|
29
29
|
|
|
30
|
-
`--include`
|
|
30
|
+
`--include` 接受合同顶层键,非法键或 ID 失败。细节按需读 `references/orchestration.md` 及其索引,证据充分即停止加载。
|
|
31
31
|
|
|
32
32
|
按 `execution_efficiency` 合并查询、复用未变资料并验证当前资产;产品流转不重跑模板套件。词汇对账、恢复核验及门禁不变,执行细节见 `references/orchestration.md`。
|
|
33
33
|
|
|
@@ -52,11 +52,11 @@ Plan 入口读取 `docs/plan/README.md` 和 `docs/process/plan-migration.md`,
|
|
|
52
52
|
|
|
53
53
|
不得越过命中的阶段、门禁、实现仓库准备或 Ticket 正式化。实现只接收绑定垂直切片、已批准且持久化、版本当前并通过完整 `ready-for-agent` 计算的合同;父 Ticket、`ready-for-human` 切片、`stale`、`drift`、`new_impacts`、`violation` 或缺失证据均阻断。实现仓库、脚手架、UI 还原、review input 和发布条件从对应合同子树查询,不在入口重复定义。
|
|
54
54
|
|
|
55
|
-
聚合批准见 `gate_consolidation
|
|
55
|
+
聚合批准见 `gate_consolidation`。普通功能默认一个独立审查者,按能力缺口、冲突或外部制度增员;相邻检查组合审查、逐项留证。
|
|
56
56
|
|
|
57
57
|
### 用户决定
|
|
58
58
|
|
|
59
|
-
|
|
59
|
+
按角色表 `user_decision_policy` 和 `references/user-decisions.md` 先展示可审阅资产、范围、风险及后续动作,再取得提问者或其指定生物人的原始回复。数字人、超时和默认项不能代答。已有授权优先用 `continuation_ref` 核验延续;未知/实质变化或强制审批缺失才重新决定。缺陷和缺证据阻断,建议记待办;合同、验证及外部动作授权仍须满足。
|
|
60
60
|
|
|
61
61
|
### 外部副作用与 Git
|
|
62
62
|
|
|
@@ -68,7 +68,7 @@ Plan 入口读取 `docs/plan/README.md` 和 `docs/process/plan-migration.md`,
|
|
|
68
68
|
2. 评估影响面、上游新鲜度、门禁和阻塞,选择第一个未阻塞工作单元;不把 `not-applicable` 当作豁免。
|
|
69
69
|
3. 原生工作单元由主控持有正式资产;专项工作通过结构化任务包派发,只调用编排合同允许的 model-invoked skill。
|
|
70
70
|
4. Matt 的 `grill-with-docs`、`to-spec`、`to-tickets`、`implement` 等仅为显式 user-invoked 兼容入口。主控不得自动调用它们或代替其创建正式资产;Matt 仅导航,不得写生命周期资产或改变门禁/Ticket 状态,任何写入前回交本编排器。
|
|
71
|
-
5. 先对照用户目标逐项验收,检查遗漏诉求、错误假设与尚未解决的问题,再验收 `Workflow Execution Result`:工作单元、合同、允许写路径、`context_reconciliation`、证据、实际验证、延期 seam、漂移和下一路由必须可核验。实现派发额外绑定当前 Slice Implementation Contract;其他阶段不得伪造该合同。
|
|
71
|
+
5. 先对照用户目标逐项验收,检查遗漏诉求、错误假设与尚未解决的问题,再验收 `Workflow Execution Result`:工作单元、合同、允许写路径、`context_reconciliation`、证据、实际验证、延期 seam、漂移和下一路由必须可核验。实现派发额外绑定当前 Slice Implementation Contract v3;其他阶段不得伪造该合同。
|
|
72
72
|
6. 在授权边界内继续下一工作单元;遇到人工决定、新授权、证据冲突、专项失败或合并/发布结论时暂停。暂停不得阻断无依赖的独立工作。
|
|
73
73
|
|
|
74
74
|
每个 `project-instance` 工作单元在申请批准或流转前,先把稳定术语回写到根目录唯一 `CONTEXT.md`,并生成通过校验的 `context_reconciliation`。候选术语、错误路径、摘要漂移或未决冲突必须阻断。质量标准只由 `engineering-baseline` 定义一次;高风险影响按裁剪合同补充反证和残余风险。
|
|
@@ -1159,7 +1159,7 @@ user_decision_evidence:
|
|
|
1159
1159
|
professional_review_replaced: false
|
|
1160
1160
|
response_absent: paused-human-gate
|
|
1161
1161
|
invalid_response: blocked
|
|
1162
|
-
basis_changed:
|
|
1162
|
+
basis_changed: revalidate_then_continue_only_with_independent_equivalence_evidence
|
|
1163
1163
|
|
|
1164
1164
|
gate_consolidation:
|
|
1165
1165
|
source: docs/process/lifecycle-registry.yaml
|
|
@@ -1170,7 +1170,12 @@ gate_consolidation:
|
|
|
1170
1170
|
readiness: computed_after_current_approved_contract_and_all_applicable_preconditions
|
|
1171
1171
|
api_freeze: atomic_with_engineering_contract_approval_same_version
|
|
1172
1172
|
acceptance_does_not_authorize: [merge, push, release, production_change]
|
|
1173
|
-
reuse:
|
|
1173
|
+
reuse: unchanged_approval_or_verified_approved_scope_continuation
|
|
1174
|
+
default_review: one_owner_one_independent_reviewer
|
|
1175
|
+
adjacent_reviews: one_bundle_with_explicit_per_check_outcomes
|
|
1176
|
+
extra_reviewers: uncovered_expertise_conflict_or_external_requirement
|
|
1177
|
+
suggestions: recorded_backlog_without_blocking
|
|
1178
|
+
continuation_protocol: references/user-decisions.md
|
|
1174
1179
|
invalidation: affected_dependencies_or_authorization_change_only
|
|
1175
1180
|
historical_gate_records: read_only_no_automatic_approval_migration
|
|
1176
1181
|
verifier: scripts/verify-lifecycle-checkpoint
|
|
@@ -148,3 +148,7 @@ Checkpoint 中已批准门禁必须带 `basis: [{ref, digest}]` 和按 `evidence
|
|
|
148
148
|
## 专项合同加载索引
|
|
149
149
|
|
|
150
150
|
专项加载提示:实现仓库与脚手架查询 `implementation_repository_preparation`、`backend_scaffold`;切片实现查询 `ticket_formalization`、`ready_for_agent`;UI 查询 `frontend_implementation_plan`、`frontend_implementation_verification`;审查查询 `review_input`;发布查询 `release_readiness`、`git_authorization`、`user_decision_evidence`;战略交接读取 `docs/process/strategic-handoff-package.md` 并按其中验证器执行。
|
|
151
|
+
|
|
152
|
+
## 后端脚手架平台
|
|
153
|
+
|
|
154
|
+
在工程基线中合并展示、确认架构和 Boot 精确版本、Java、YSS 父 POM/BOM;缺少选择时询问,当前批准可复用。独立子项目可继承或覆盖,并可一次确认明确列出的多个项目。同一 Maven 工程统一平台。执行 `scripts/backend-platforms` 展示兼容状态;只允许已验证组合。决定、合同、Manifest 和下游身份绑定同一平台摘要;变更重新确认。合同见仓库 `docs/engineering/backend-platforms.md`。
|
|
@@ -14,6 +14,8 @@
|
|
|
14
14
|
|
|
15
15
|
Matt 五态不得扩义。资产的 `ready-for-human` 与 Ticket label 必须带命名空间表达。`paused-human-gate` 表示等待 `docs/agents/digital-human-roles.yaml` 指定的会签人(数字人或生物人),不是「必须是生物人」。但 `user_decision_policy` 命中的关键决定还必须有真实用户回复,数字人会签不能解除该等待。
|
|
16
16
|
|
|
17
|
+
Slice v3 冻结需求文件的 status 是冻结时快照,不能用来推断当前执行状态。状态流转和验收结果写入已配置主 tracker / 任务包;需求改版后重新编译、审查与绑定批准,见 [Slice 冻结需求协议](../../yss-implementation-contract-compiler/references/slice-implementation-contract.md#第二轮增量规则)。
|
|
18
|
+
|
|
17
19
|
## 上下文与外部输入证据
|
|
18
20
|
|
|
19
21
|
状态模型不新增 context 状态域。阶段边界只在状态块或 checkpoint 中保存可选证据:
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
2. **绑定原始回复**:保存回复人、原始消息引用、回复时间、原文、决定、对应事项、范围及请求摘要。Agent 只能整理,不得生成、推测或补造用户同意。来源记录是可追溯证据,不是密码学身份认证。
|
|
9
9
|
3. **无回复就等待**:超时、默认选项、数字人同意、无反对意见和 Agent 自述均无效。依赖该决定的工作保持 `paused-human-gate` / `ready-for-human`;来源错误等使用 `blocked`。独立工作可以继续,不得借其完成清除未决决定。
|
|
10
10
|
4. **回复必须指向明确**:单项明确请求的“同意”有效。多项需要逐项指定、清楚的子集或“同意以上全部事项”;“继续”不算全部批准。拒绝、修改意见和撤回均保留为有效回复,但不放行。编排器结合原文判定语义;机器核验结构、明确性底线、来源和绑定,不能用自填 `approved` 覆盖相反原文。
|
|
11
|
-
5.
|
|
11
|
+
5. **复用已有有效确认**:同一版本、范围和依据不重复询问,不按时间自动过期。当前资产字节变化先使旧验证过期;按下述授权延续协议核验差异,决定依据未变时更新专业审查和验证证据,不要求新回复。实质变化、范围扩大或撤回时展示差异后重新确认。无关文件变化不触发重新确认。回复按来源时间追加,禁止删除拒绝、修改或撤回记录来恢复旧批准。
|
|
12
12
|
6. **提问者和负责人分开**:默认回复人为提问者。其他业务、技术或发布负责人必须由提问者在原始消息中明确指定,包含对应事项和负责人;数字人不得自行代任。用户表达使用自然语言,内部 ID 和引用由 Agent 整理。
|
|
13
13
|
|
|
14
14
|
## 记录与来源
|
|
@@ -45,9 +45,29 @@ Workflow Execution Result 使用 `user_decisions` 保存当前要求与证据引
|
|
|
45
45
|
|
|
46
46
|
checkpoint 的 `human_review` 保存 `user_decisions`、`required_decisions`、`not_applicable` 和需要时的 `external_input`。`stage_trace.completed_work_unit` 标识已完成单元;进入实施时 `human_review.implementation` 保存当前切片及持久化合同引用。等待态可以保存;恢复、流转和完成时重新核验。外部回复、新授权、风险接受均以同一决定记录作为恢复依据,不能以工具恢复或默认答案替代。
|
|
47
47
|
|
|
48
|
-
##
|
|
48
|
+
## 已批准范围内连续推进
|
|
49
49
|
|
|
50
|
-
|
|
50
|
+
优先使用已有回复;没有明确授权时先形成可审阅方案,再集中确认范围、验收标准和实施边界。Plan、Spec、产品设计和工程契约仍完成适用检查,但不重复询问同一决定。脚手架架构选择、运行时外部动作仍按各自授权边界执行;交付验收不授权 commit、push、发布或生产操作。
|
|
51
|
+
|
|
52
|
+
`delivery-scope` 用户决定的主体可使用 `delivery-authorization` 清单:`schema_version: 1`、`kind`、不可变且有 `ref/version/digest` 的 `basis` 原始快照、`external_policy` 和 `targets`。每个 target 明确 `boundary/subject_ref/scope/decision_basis`;scope 不能超过原回复覆盖范围。`decision_basis` 必须逐项列明非空的 `business_scope/acceptance/contract_commitments/authorization/risk_acceptance/quality/external_commitments` 字符串数组;不存在的承诺明确写“无新增承诺”,不能留空。边界和资产路径明确,禁止通配授权未来未知范围。外部制度文件有 `status: confirmed|unconfirmed` 和 `requirements`;每项制度列 `id/boundaries/principals`,无额外审批只能在已确认后显式使用空数组。
|
|
53
|
+
|
|
54
|
+
当前 requirement 保持 `boundary/subject_ref/scope`,用 `continuation_ref` 引用 `approved-scope-continuation-v1` 证据,替代直接 `user_decision_ref`。证据包含 `schema_version: 1`、`kind`、`boundary/scope`、当前 `subject`、实际验证 `basis`、原始 `source` requirement、独立 `review` 资产和适用的 `external_decisions`。资产描述均用 `ref/version/digest`,digest 为带 `sha256:` 前缀的原字节摘要。不允许链式延续或生成新的用户回复。
|
|
55
|
+
|
|
56
|
+
`implementation-scope` target 还必须包含 `implementation_limits`,按切片 Ticket 引用登记 `repositories/allowed_write_paths`。校验器将当前实施清单逐项与原授权边界精确比较;即使重算当前摘要并声明“无语义变化”,也不能扩大仓库或写路径。
|
|
57
|
+
|
|
58
|
+
独立 review 包含:`decision: approved`、`role_id/runtime_id/principal_ref/drafter_principal_ref`、`classification`(`within-approved-scope/presentation-only/implementation-detail`)、`material_changes: []`、`findings`、当前 `boundary/scope/subject/basis`、与原授权一致的 `decision_basis`、`reason`、`comparison.before/after`。before 必须是原授权 basis 内不可变快照,after 必须绑定当前 subject。审查者按原快照与当前完整资产比较语义,不能只比较自填摘要或声称“无变化”;机器验证来源、摘要、身份分离、范围和声明的一致性,不替代专业语义判断。
|
|
59
|
+
|
|
60
|
+
finding 分为 `requirement-violation/missing-evidence/important-risk/suggestion`,带 `id/reason`。前三类未 `resolved` 则阻断;suggestion 必须有 `follow_up` 待办,不因个人偏好加门禁。重要风险须重新取得用户风险接受决定,不能改分类绕过。
|
|
61
|
+
|
|
62
|
+
外部制度有要求时,`external_decisions` 每项含 `obligation_id/principal_ref/requirement`,逐一验证当前资产、范围和指定真人原始回复;制度未确认不能自动延续。制度文件或原授权决定依据变化需要重新评估和确认,不能清空要求。
|
|
63
|
+
|
|
64
|
+
使用 `scripts/verify-user-decision --continuation <requirement.yaml>` 核验。会签记录可携带同一 `continuation_ref`;工作单元和任务包沿用 `user_decisions`,Plan 入口使用 `plan_continuation_ref`。实施仍校验当前 scope 清单、切片合同、仓库、允许写路径和工程基线,不因延续省略合同校验。旧记录维持严格读取;未登记该 capability 的接收端必须拒绝延续并升级,不能静默当普通批准。
|
|
65
|
+
|
|
66
|
+
相邻专业检查可共用一个 `schema_version: 1, kind: review-bundle, reviews: [...]` 文件。每行都是已有会签记录形状,有唯一 gate/check ID、当前 subject/digest/scope、独立身份和明确结论;失败项不能被总体通过掩盖。`verify-approval-record` 检查所有行,聚合门禁按检查 ID 读取各自行。组合审查不增加用户确认次数,也不省略检查覆盖。
|
|
67
|
+
|
|
68
|
+
## 实施范围与架构选择
|
|
69
|
+
|
|
70
|
+
首次实施批准的主体为功能级 `implementation-scope` 清单,`slices` 每行包含:`ticket_ref`、`contract`(ref/version/digest)、`repositories`、`allowed_write_paths`、`baselines`(ref/version/digest)。仓库与写路径必须对应当前合同的实施范围(v2 `common.project_roots/allowed_write_paths`,v3 `scope.project_roots/allowed_write_paths`,通过统一读取器核验);基线包含合同引用的工程基线。`scope` 使用批准的切片引用集合。合同、范围或基线变化时回到确认;已覆盖的后续切片复用原记录。
|
|
51
71
|
|
|
52
72
|
实施就绪和派发必须同时提供 `user_decisions`、`slice_contract_ref` 与 `vertical_slice_ticket_ref`。Worker 任务包通过 `user_decisions` 传递记录,不能只声明 `ready_for_agent=true`。
|
|
53
73
|
|
|
@@ -46,7 +46,7 @@ Design QA 合并 visual、layout、interaction、content、accessibility、cross
|
|
|
46
46
|
|
|
47
47
|
用户确认必须绑定提问者或其明确指定负责人的原始回复,使用生命周期 `user_decision_policy` 和统一用户决定记录;产品数字人只提供确认建议,不能代答。正式证据追加 `user_decision_ref/decision_subject_ref`,校验原型、视觉基线和操作范围与用户所见快照一致。用户确认只描述原型确认了什么、哪些范围可操作、哪些为模拟或 gap,以及接受/拒绝结论;不要求用户确认技术栈、CLI 或构建细节。
|
|
48
48
|
|
|
49
|
-
`check.prototype-reviewed` 和 `check.prototype-verified` 是 `gate.product-design-approved`
|
|
49
|
+
`check.prototype-reviewed` 和 `check.prototype-verified` 是 `gate.product-design-approved` 的内部检查;独立评审和验证通过后,按生命周期用户决定协议核验当前范围。已有明确授权且决定依据不变时用 `continuation_ref` 延续;新的业务体验取舍、范围或重要风险仍由用户确认。档位选择属于验证输入,不单独请求批准,也不授权实现。
|
|
50
50
|
|
|
51
51
|
## 按需读取
|
|
52
52
|
|
|
@@ -42,3 +42,7 @@ description: 用于按批准的 YSS 架构与持久化合同实现或重构 PO
|
|
|
42
42
|
## Review 输入
|
|
43
43
|
|
|
44
44
|
`code-review` 仅对本体项目及合同/实现仓登记的后端研发项目执行本 Skill。候选命中持久化结构或数据访问时,Standards 轴必须读取所选 Profile 并引用规则与代码证据;未命中时记录带原因的 `not-applicable`。Reviewer 只报告 finding,不写实现。
|
|
45
|
+
|
|
46
|
+
## 新脚手架平台约束
|
|
47
|
+
|
|
48
|
+
消费批准切片架构身份中的 `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-research
|
|
3
|
-
description:
|
|
3
|
+
description: "研究 YSS 技术或产品策略事实并提供可追溯证据;用于标准、第三方行为、业务约束和 research 兼容入口。"
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# YSS Research
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: yss-security-algorithm
|
|
3
|
-
description:
|
|
3
|
+
description: "接入或排查 YSS 加解密、JWT/JWK、密码编码、密钥加载与轮换。"
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# yss-security-algorithm
|
|
@@ -39,3 +39,7 @@ description: 在 YSS 技术分析阶段将批准的战略领域输入细化为
|
|
|
39
39
|
跨仓交接使用 `scripts/strategic-handoff export / verify / import`。正式导出前补齐源战略的稳定规则 ID、关键场景和当前批准绑定;源资产原字节冻结、包内路径通过清单解析。目标导入只产生快照和对账/承接草案,正式 reconciliation 通过后才能进入战术设计。流程与字段见 `docs/process/strategic-handoff-package.md`。
|
|
40
40
|
|
|
41
41
|
战术合同必须绑定 `strategic_handoff` 导入收据、包摘要、正式目标对账及逐条承接 rows。来自导入包时禁止仅填 `upstream_current: true`。批准前执行 `scripts/verify-strategic-handoff-consumption --root <target> <tactical>`;存在受控延期时按切片执行 `--slice <slice-id>`,实际核验通过且合同批准后才可继续相关切片。最新源规则、关键场景或资产变化使依赖项 stale;未知依赖扩大阻断,业务冲突回交战略方。结果绑定当前包与战术摘要,不能复用旧输出宣布 ready-for-agent。
|
|
42
|
+
|
|
43
|
+
## 后端脚手架平台承接
|
|
44
|
+
|
|
45
|
+
消费生命周期已确认的架构与 `platform_configuration` v2;不得自行选择、批准或静默升级 Boot/Java。平台清单执行 `scripts/backend-platforms` 查询;只允许已验证 YSS 组合,新生成缺少配置或证据即阻断。决定、合同、Manifest 与下游架构身份须绑定同一平台及兼容摘要。详见 仓库共享合同 `docs/engineering/backend-platforms.md`。
|
|
@@ -37,3 +37,7 @@ schema v1 战术合同只按 DDD 显式兼容读取;使用 `--legacy-ddd`,
|
|
|
37
37
|
## 交接
|
|
38
38
|
|
|
39
39
|
按现有架构审查门禁进行独立评审。批准且版本当前后交回生命周期,再交编译器;DDD 实现使用 `yss-domain`,MVC 实现按已登记 Profile 的能力与 Recipe 路由。发现 `stale`、`drift`、`new_impacts` 或路径越界时回交重路由。需要图示时按用户或合同要求调用 `archify`,图只作派生证据。
|
|
40
|
+
|
|
41
|
+
## 后端脚手架平台承接
|
|
42
|
+
|
|
43
|
+
消费生命周期已确认的架构与 `platform_configuration` v2;不得自行选择、批准或静默升级 Boot/Java。平台清单执行 `scripts/backend-platforms` 查询;只允许已验证 YSS 组合,新生成缺少配置或证据即阻断。决定、合同、Manifest 与下游架构身份须绑定同一平台及兼容摘要。详见 仓库共享合同 `docs/engineering/backend-platforms.md`。
|
|
@@ -135,11 +135,11 @@ export async function validateTechnicalDesign(data, { root = process.cwd(), slic
|
|
|
135
135
|
}
|
|
136
136
|
|
|
137
137
|
async function main() {
|
|
138
|
-
const { values, positionals } = parseArgs({ allowPositionals: true, options: { root: { type: 'string', default: process.cwd() }, slice: { type: 'string' }, 'legacy-ddd': { type: 'boolean', default: false }, 'read-only': {type:'boolean',default:false}, 'approved-slice': {type:'string'}, 'approved-slice-digest': {type:'string'}, 'approved-slice-approval': {type:'string'} } });
|
|
138
|
+
const { values, positionals } = parseArgs({ allowPositionals: true, options: { root: { type: 'string', default: process.cwd() }, slice: { type: 'string' }, 'legacy-ddd': { type: 'boolean', default: false }, 'read-only': {type:'boolean',default:false}, 'work-unit': {type:'string'}, 'approved-slice': {type:'string'}, 'approved-slice-digest': {type:'string'}, 'approved-slice-approval': {type:'string'} } });
|
|
139
139
|
ensure(positionals.length === 1, '用法: validate-technical-design.mjs <合同> --root <项目根> [--slice <ID>] [--legacy-ddd]');
|
|
140
140
|
const approvedOptions=['approved-slice','approved-slice-digest','approved-slice-approval'];
|
|
141
141
|
ensure(!approvedOptions.some(key=>values[key])||approvedOptions.every(key=>values[key]),'执行增量必须完整给出持久化 Slice、字节摘要及本地批准引用');
|
|
142
|
-
const execution=values['approved-slice']?createApprovedExecutionContext({ref:values['approved-slice'],digest:values['approved-slice-digest'],approval_ref:values['approved-slice-approval']},{root:values.root}):undefined;
|
|
142
|
+
const execution=values['approved-slice']?createApprovedExecutionContext({ref:values['approved-slice'],digest:values['approved-slice-digest'],approval_ref:values['approved-slice-approval']},{root:values.root,work_unit_id:values['work-unit']}):undefined;
|
|
143
143
|
const result = await validateTechnicalDesign(read(path.resolve(positionals[0])), { root: values.root, sliceRef: values.slice, legacyDdd: values['legacy-ddd'], readOnly:values['read-only'], execution });
|
|
144
144
|
process.stdout.write(`${JSON.stringify(result, null, 2)}\n`);
|
|
145
145
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: "yss-ui"
|
|
3
|
-
description:
|
|
3
|
+
description: "选择和核验 YSS Vue 生产页面组件及 Ant Design Vue 兼容性;原型任务用 yss-prototype-stage。"
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# YSS UI 统一路由与交付门禁
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: yss-ui-business-page-generation
|
|
3
|
-
description:
|
|
3
|
+
description: "生成或改造完整 YSS UI CRUD、列表、表单、详情或左树右表模块;组织页面、API 与验收。"
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# YSS UI 业务页面生成 Skill
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: yss-up-springboot3
|
|
3
|
-
description:
|
|
3
|
+
description: "审查或迁移 YSS Spring Boot 2 到 3 的依赖、Jakarta 与 Spring Cloud 兼容性。"
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# yss-up-springboot3
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: yss-use-table-height
|
|
3
|
-
description:
|
|
3
|
+
description: "用 useTableHeight 修复 YTable、YEditTable 自适应高度、双滚动条及分页或工具栏偏移。"
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# useTableHeight 使用
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: yss-userinfo
|
|
3
|
-
description:
|
|
3
|
+
description: "接入或排查 YSS AuthUserInfoUtil、用户头透传、JWT、Redis 用户缓存与后台用户上下文。"
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# yss-userinfo
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: yss-validation
|
|
3
|
-
description:
|
|
3
|
+
description: "接入或排查 YSS Bean Validation、校验消息、LiteFlow EL 解析器与校验错误映射。"
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# yss-validation
|
|
@@ -55,3 +55,7 @@ Read `references/source-index.md` as a path-hint index whenever the task depends
|
|
|
55
55
|
- Do not invent class names or configuration keys without checking the source index.
|
|
56
56
|
- Do not replace component extension points with business-local framework code.
|
|
57
57
|
- Do not broaden the task into unrelated YSS components unless the user asks.
|
|
58
|
+
|
|
59
|
+
## 新脚手架平台约束
|
|
60
|
+
|
|
61
|
+
消费批准切片架构身份中的 `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-web-controller
|
|
3
|
-
description:
|
|
3
|
+
description: "按冻结合同与稳定 Application 接口生成或重构 YSS Controller、请求 DTO、响应 VO 和 Web Convertor。"
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# yss-web-controller
|
|
@@ -89,3 +89,7 @@ node scripts/generate_controller.mjs \
|
|
|
89
89
|
- DTO/VO/WebConvertor 机械骨架可用 `controlled-generation`;权限、错误映射、校验语义和接口行为必须使用 `behavior-tdd`。
|
|
90
90
|
- 写入必须位于合同 `allowed_write_paths`,并提供 Controller、DTO/VO、WebConvertor、契约/API 测试和实际验证结果。
|
|
91
91
|
- 按统一 `YSS Skill Execution Result` 返回偏离与新增影响;出现新 API/schema、权限或响应包装变化时暂停并回到 实现合同编译器/生命周期。
|
|
92
|
+
|
|
93
|
+
## 新脚手架平台约束
|
|
94
|
+
|
|
95
|
+
消费批准切片架构身份中的 `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`。
|