create-yss-spec 2.2.9 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/package.json +1 -1
- package/template/.agents/mcp_config.json +8 -0
- package/template/.agents/rules/yss-ai-skills.md +3 -1
- package/template/.agents/skills/.yss-skills-manifest.json +51 -25
- package/template/.agents/skills/ask-matt/SKILL.md +1 -1
- package/template/.agents/skills/code-review/references/yss-review-standards.md +3 -3
- package/template/.agents/skills/component-selection-imports/SKILL.md +2 -2
- package/template/.agents/skills/frontend-commit/SKILL.md +1 -1
- package/template/.agents/skills/wayfinder/SKILL.md +2 -2
- package/template/.agents/skills/yss-api-integration/SKILL.md +85 -339
- package/template/.agents/skills/yss-application/SKILL.md +7 -5
- package/template/.agents/skills/yss-application/references/application-layer-guide.md +60 -105
- package/template/.agents/skills/yss-components/SKILL.md +1 -1
- package/template/.agents/skills/yss-ddd-scaffold-generator/SKILL.md +39 -14
- package/template/.agents/skills/yss-ddd-scaffold-generator/assets/templates/config/application-local.yml.template +8 -0
- package/template/.agents/skills/yss-ddd-scaffold-generator/assets/templates/config/application.yml.template +2 -3
- package/template/.agents/skills/yss-ddd-scaffold-generator/assets/templates/java/architecture-rules-test.java.template +36 -0
- package/template/.agents/skills/yss-ddd-scaffold-generator/assets/templates/java/bootstrap-application.java.template +15 -0
- package/template/.agents/skills/yss-ddd-scaffold-generator/assets/templates/pom/adapter-pom.xml.template +3 -3
- package/template/.agents/skills/yss-ddd-scaffold-generator/assets/templates/pom/application-pom.xml.template +13 -4
- package/template/.agents/skills/yss-ddd-scaffold-generator/assets/templates/pom/bootstrap-pom.xml.template +24 -4
- package/template/.agents/skills/yss-ddd-scaffold-generator/assets/templates/pom/domain-pom.xml.template +6 -20
- package/template/.agents/skills/yss-ddd-scaffold-generator/assets/templates/pom/infrastructure-pom.xml.template +26 -6
- package/template/.agents/skills/yss-ddd-scaffold-generator/assets/templates/pom/parent-pom.xml.template +70 -10
- package/template/.agents/skills/yss-ddd-scaffold-generator/assets/templates/pom/web-pom.xml.template +24 -10
- package/template/.agents/skills/yss-ddd-scaffold-generator/assets/wrapper/.mvn/maven.config +2 -3
- package/template/.agents/skills/yss-ddd-scaffold-generator/assets/wrapper/.mvn/settings.xml +18 -105
- package/template/.agents/skills/yss-ddd-scaffold-generator/assets/wrapper/.mvn/wrapper/maven-wrapper.properties +4 -2
- package/template/.agents/skills/yss-ddd-scaffold-generator/references/ARCHITECTURE.md +78 -156
- package/template/.agents/skills/yss-ddd-scaffold-generator/references/USAGE_EXAMPLES.md +90 -385
- package/template/.agents/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-adapter/SKILL.md +20 -188
- package/template/.agents/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-parent/SKILL.md +42 -122
- package/template/.agents/skills/yss-ddd-scaffold-generator/scripts/first-slice-compatibility.test.mjs +225 -0
- package/template/.agents/skills/yss-ddd-scaffold-generator/scripts/first-slice-verification.test.mjs +164 -0
- package/template/.agents/skills/yss-ddd-scaffold-generator/scripts/generate_and_verify_scaffold.mjs +126 -0
- package/template/.agents/skills/yss-ddd-scaffold-generator/scripts/generate_scaffold.mjs +153 -42
- package/template/.agents/skills/yss-ddd-scaffold-generator/scripts/run_first_slice_verification.mjs +172 -0
- package/template/.agents/skills/yss-ddd-scaffold-generator/scripts/run_scaffold_verification.mjs +87 -7
- package/template/.agents/skills/yss-ddd-scaffold-generator/scripts/scaffold-generator.test.mjs +335 -12
- package/template/.agents/skills/yss-design-system/SKILL.md +2 -2
- package/template/.agents/skills/yss-design-system/references/design-system.md +2 -2
- package/template/.agents/skills/yss-domain/SKILL.md +5 -4
- package/template/.agents/skills/yss-domain/agents/openai.yaml +2 -2
- package/template/.agents/skills/yss-domain/references/domain-layer-guide.md +62 -235
- package/template/.agents/skills/yss-dto/SKILL.md +11 -5
- package/template/.agents/skills/yss-dto/references/README.md +2 -2
- package/template/.agents/skills/yss-dto/references/openapi-wire-profile.yaml +9 -3
- package/template/.agents/skills/yss-exception/SKILL.md +2 -0
- package/template/.agents/skills/yss-formily/SKILL.md +1 -1
- package/template/.agents/skills/yss-mybatis/SKILL.md +2 -2
- package/template/.agents/skills/yss-page-module-development/SKILL.md +2 -0
- package/template/.agents/skills/yss-product-lifecycle/SKILL.md +1 -1
- package/template/.agents/skills/yss-product-lifecycle/references/matt-yss-adapter.md +2 -2
- package/template/.agents/skills/yss-product-lifecycle/references/orchestration-contract.yaml +54 -21
- package/template/.agents/skills/yss-product-lifecycle/references/orchestration.md +2 -2
- package/template/.agents/skills/yss-repository/SKILL.md +19 -15
- package/template/.agents/skills/yss-repository/agents/openai.yaml +2 -2
- package/template/.agents/skills/yss-repository/references/infrastructure-layer-guide.md +70 -155
- package/template/.agents/skills/yss-research/SKILL.md +73 -0
- package/template/.agents/skills/yss-research/agents/openai.yaml +3 -0
- package/template/.agents/skills/yss-research/assets/evidence-template.yaml +68 -0
- package/template/.agents/skills/yss-research/assets/research-brief-template.md +36 -0
- package/template/.agents/skills/yss-research/references/evidence-contract.md +42 -0
- package/template/.agents/skills/yss-research/scripts/validate-research-package.mjs +128 -0
- package/template/.agents/skills/yss-research/tests/run-scenarios.mjs +81 -0
- package/template/.agents/skills/yss-router/references/router-contract.yaml +48 -10
- package/template/.agents/skills/yss-stage-decision/SKILL.md +2 -1
- package/template/.agents/skills/yss-ui/SKILL.md +6 -5
- package/template/.agents/skills/yss-ui/references/component-routing.md +1 -1
- package/template/.agents/skills/yss-ui-business-page-generation/SKILL.md +159 -0
- package/template/.agents/skills/yss-ui-business-page-generation/references/component-map.md +39 -0
- package/template/.agents/skills/yss-ui-business-page-generation/references/hooks-map.md +70 -0
- package/template/.agents/skills/yss-ui-business-page-generation/references/utils-map.md +51 -0
- package/template/.agents/skills/yss-use-table-height/SKILL.md +78 -297
- package/template/.agents/skills/yss-use-tree-height/SKILL.md +51 -393
- package/template/.agents/skills/yss-web-controller/SKILL.md +26 -19
- package/template/.agents/skills/yss-web-controller/agents/openai.yaml +2 -2
- package/template/.agents/skills/yss-web-controller/assets/templates/Controller.java.template +21 -22
- package/template/.agents/skills/yss-web-controller/assets/templates/WebConvertor.java.template +19 -12
- package/template/.agents/skills/yss-web-controller/assets/templates/web/dto/CreateRequest.java.template +19 -0
- package/template/.agents/skills/yss-web-controller/assets/templates/web/dto/PageRequest.java.template +21 -0
- package/template/.agents/skills/yss-web-controller/assets/templates/web/dto/Response.java.template +18 -0
- package/template/.agents/skills/yss-web-controller/assets/templates/web/dto/UpdateRequest.java.template +19 -0
- package/template/.agents/skills/yss-web-controller/references/web-adapter-layer-guide.md +63 -145
- package/template/.agents/skills/yss-web-controller/references/web-generation-contract.schema.json +97 -0
- package/template/.agents/skills/yss-web-controller/scripts/generate_controller.mjs +168 -19
- package/template/.agents/skills/yss-web-controller/scripts/generate_controller.test.mjs +144 -7
- package/template/.claude/skills/ask-matt/SKILL.md +1 -1
- package/template/.claude/skills/code-review/references/yss-review-standards.md +3 -3
- package/template/.claude/skills/component-selection-imports/SKILL.md +2 -2
- package/template/.claude/skills/frontend-commit/SKILL.md +1 -1
- package/template/.claude/skills/wayfinder/SKILL.md +2 -2
- package/template/.claude/skills/yss-api-integration/SKILL.md +85 -339
- package/template/.claude/skills/yss-application/SKILL.md +7 -5
- package/template/.claude/skills/yss-application/references/application-layer-guide.md +60 -105
- package/template/.claude/skills/yss-components/SKILL.md +1 -1
- package/template/.claude/skills/yss-ddd-scaffold-generator/SKILL.md +39 -14
- package/template/.claude/skills/yss-ddd-scaffold-generator/assets/templates/config/application-local.yml.template +8 -0
- package/template/.claude/skills/yss-ddd-scaffold-generator/assets/templates/config/application.yml.template +2 -3
- package/template/.claude/skills/yss-ddd-scaffold-generator/assets/templates/java/architecture-rules-test.java.template +36 -0
- package/template/.claude/skills/yss-ddd-scaffold-generator/assets/templates/java/bootstrap-application.java.template +15 -0
- package/template/.claude/skills/yss-ddd-scaffold-generator/assets/templates/pom/adapter-pom.xml.template +3 -3
- package/template/.claude/skills/yss-ddd-scaffold-generator/assets/templates/pom/application-pom.xml.template +13 -4
- package/template/.claude/skills/yss-ddd-scaffold-generator/assets/templates/pom/bootstrap-pom.xml.template +24 -4
- package/template/.claude/skills/yss-ddd-scaffold-generator/assets/templates/pom/domain-pom.xml.template +6 -20
- package/template/.claude/skills/yss-ddd-scaffold-generator/assets/templates/pom/infrastructure-pom.xml.template +26 -6
- package/template/.claude/skills/yss-ddd-scaffold-generator/assets/templates/pom/parent-pom.xml.template +70 -10
- package/template/.claude/skills/yss-ddd-scaffold-generator/assets/templates/pom/web-pom.xml.template +24 -10
- package/template/.claude/skills/yss-ddd-scaffold-generator/assets/wrapper/.mvn/maven.config +2 -3
- package/template/.claude/skills/yss-ddd-scaffold-generator/assets/wrapper/.mvn/settings.xml +18 -105
- package/template/.claude/skills/yss-ddd-scaffold-generator/assets/wrapper/.mvn/wrapper/maven-wrapper.properties +4 -2
- package/template/.claude/skills/yss-ddd-scaffold-generator/references/ARCHITECTURE.md +78 -156
- package/template/.claude/skills/yss-ddd-scaffold-generator/references/USAGE_EXAMPLES.md +90 -385
- package/template/.claude/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-adapter/SKILL.md +20 -188
- package/template/.claude/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-parent/SKILL.md +42 -122
- package/template/.claude/skills/yss-ddd-scaffold-generator/scripts/first-slice-compatibility.test.mjs +225 -0
- package/template/.claude/skills/yss-ddd-scaffold-generator/scripts/first-slice-verification.test.mjs +164 -0
- package/template/.claude/skills/yss-ddd-scaffold-generator/scripts/generate_and_verify_scaffold.mjs +126 -0
- package/template/.claude/skills/yss-ddd-scaffold-generator/scripts/generate_scaffold.mjs +153 -42
- package/template/.claude/skills/yss-ddd-scaffold-generator/scripts/run_first_slice_verification.mjs +172 -0
- package/template/.claude/skills/yss-ddd-scaffold-generator/scripts/run_scaffold_verification.mjs +87 -7
- package/template/.claude/skills/yss-ddd-scaffold-generator/scripts/scaffold-generator.test.mjs +335 -12
- package/template/.claude/skills/yss-design-system/SKILL.md +2 -2
- package/template/.claude/skills/yss-design-system/references/design-system.md +2 -2
- package/template/.claude/skills/yss-domain/SKILL.md +5 -4
- package/template/.claude/skills/yss-domain/agents/openai.yaml +2 -2
- package/template/.claude/skills/yss-domain/references/domain-layer-guide.md +62 -235
- package/template/.claude/skills/yss-dto/SKILL.md +11 -5
- package/template/.claude/skills/yss-dto/references/README.md +2 -2
- package/template/.claude/skills/yss-dto/references/openapi-wire-profile.yaml +9 -3
- package/template/.claude/skills/yss-exception/SKILL.md +2 -0
- package/template/.claude/skills/yss-formily/SKILL.md +1 -1
- package/template/.claude/skills/yss-mybatis/SKILL.md +2 -2
- package/template/.claude/skills/yss-page-module-development/SKILL.md +2 -0
- package/template/.claude/skills/yss-product-lifecycle/SKILL.md +1 -1
- package/template/.claude/skills/yss-product-lifecycle/references/matt-yss-adapter.md +2 -2
- package/template/.claude/skills/yss-product-lifecycle/references/orchestration-contract.yaml +54 -21
- package/template/.claude/skills/yss-product-lifecycle/references/orchestration.md +2 -2
- package/template/.claude/skills/yss-repository/SKILL.md +19 -15
- package/template/.claude/skills/yss-repository/agents/openai.yaml +2 -2
- package/template/.claude/skills/yss-repository/references/infrastructure-layer-guide.md +70 -155
- package/template/.claude/skills/yss-research/SKILL.md +73 -0
- package/template/.claude/skills/yss-research/agents/openai.yaml +3 -0
- package/template/.claude/skills/yss-research/assets/evidence-template.yaml +68 -0
- package/template/.claude/skills/yss-research/assets/research-brief-template.md +36 -0
- package/template/.claude/skills/yss-research/references/evidence-contract.md +42 -0
- package/template/.claude/skills/yss-research/scripts/validate-research-package.mjs +128 -0
- package/template/.claude/skills/yss-research/tests/run-scenarios.mjs +81 -0
- package/template/.claude/skills/yss-router/references/router-contract.yaml +48 -10
- package/template/.claude/skills/yss-stage-decision/SKILL.md +2 -1
- package/template/.claude/skills/yss-ui/SKILL.md +6 -5
- package/template/.claude/skills/yss-ui/references/component-routing.md +1 -1
- package/template/.claude/skills/yss-ui-business-page-generation/SKILL.md +159 -0
- package/template/.claude/skills/yss-ui-business-page-generation/references/component-map.md +39 -0
- package/template/.claude/skills/yss-ui-business-page-generation/references/hooks-map.md +70 -0
- package/template/.claude/skills/yss-ui-business-page-generation/references/utils-map.md +51 -0
- package/template/.claude/skills/yss-use-table-height/SKILL.md +78 -297
- package/template/.claude/skills/yss-use-tree-height/SKILL.md +51 -393
- package/template/.claude/skills/yss-web-controller/SKILL.md +26 -19
- package/template/.claude/skills/yss-web-controller/agents/openai.yaml +2 -2
- package/template/.claude/skills/yss-web-controller/assets/templates/Controller.java.template +21 -22
- package/template/.claude/skills/yss-web-controller/assets/templates/WebConvertor.java.template +19 -12
- package/template/.claude/skills/yss-web-controller/assets/templates/web/dto/CreateRequest.java.template +19 -0
- package/template/.claude/skills/yss-web-controller/assets/templates/web/dto/PageRequest.java.template +21 -0
- package/template/.claude/skills/yss-web-controller/assets/templates/web/dto/Response.java.template +18 -0
- package/template/.claude/skills/yss-web-controller/assets/templates/web/dto/UpdateRequest.java.template +19 -0
- package/template/.claude/skills/yss-web-controller/references/web-adapter-layer-guide.md +63 -145
- package/template/.claude/skills/yss-web-controller/references/web-generation-contract.schema.json +97 -0
- package/template/.claude/skills/yss-web-controller/scripts/generate_controller.mjs +168 -19
- package/template/.claude/skills/yss-web-controller/scripts/generate_controller.test.mjs +144 -7
- package/template/.codex/skills/ask-matt/SKILL.md +1 -1
- package/template/.codex/skills/code-review/references/yss-review-standards.md +3 -3
- package/template/.codex/skills/component-selection-imports/SKILL.md +2 -2
- package/template/.codex/skills/frontend-commit/SKILL.md +1 -1
- package/template/.codex/skills/product-design/package.json +4 -2
- package/template/.codex/skills/product-design/skills/research/SKILL.md +22 -0
- package/template/.codex/skills/product-design/skills/research/assets/evidence-template.yaml +65 -0
- package/template/.codex/skills/product-design/skills/research/assets/research-brief-template.md +33 -0
- package/template/.codex/skills/product-design/skills/research/references/evidence-audited.md +80 -0
- package/template/.codex/skills/product-design/skills/research/scripts/validate-research-package.mjs +149 -0
- package/template/.codex/skills/product-design/skills/research/tests/run-scenarios.mjs +72 -0
- package/template/.codex/skills/wayfinder/SKILL.md +2 -2
- package/template/.codex/skills/yss-api-integration/SKILL.md +85 -339
- package/template/.codex/skills/yss-application/SKILL.md +7 -5
- package/template/.codex/skills/yss-application/references/application-layer-guide.md +60 -105
- package/template/.codex/skills/yss-components/SKILL.md +1 -1
- package/template/.codex/skills/yss-ddd-scaffold-generator/SKILL.md +39 -14
- package/template/.codex/skills/yss-ddd-scaffold-generator/assets/templates/config/application-local.yml.template +8 -0
- package/template/.codex/skills/yss-ddd-scaffold-generator/assets/templates/config/application.yml.template +2 -3
- package/template/.codex/skills/yss-ddd-scaffold-generator/assets/templates/java/architecture-rules-test.java.template +36 -0
- package/template/.codex/skills/yss-ddd-scaffold-generator/assets/templates/java/bootstrap-application.java.template +15 -0
- package/template/.codex/skills/yss-ddd-scaffold-generator/assets/templates/pom/adapter-pom.xml.template +3 -3
- package/template/.codex/skills/yss-ddd-scaffold-generator/assets/templates/pom/application-pom.xml.template +13 -4
- package/template/.codex/skills/yss-ddd-scaffold-generator/assets/templates/pom/bootstrap-pom.xml.template +24 -4
- package/template/.codex/skills/yss-ddd-scaffold-generator/assets/templates/pom/domain-pom.xml.template +6 -20
- package/template/.codex/skills/yss-ddd-scaffold-generator/assets/templates/pom/infrastructure-pom.xml.template +26 -6
- package/template/.codex/skills/yss-ddd-scaffold-generator/assets/templates/pom/parent-pom.xml.template +70 -10
- package/template/.codex/skills/yss-ddd-scaffold-generator/assets/templates/pom/web-pom.xml.template +24 -10
- package/template/.codex/skills/yss-ddd-scaffold-generator/assets/wrapper/.mvn/maven.config +2 -3
- package/template/.codex/skills/yss-ddd-scaffold-generator/assets/wrapper/.mvn/settings.xml +18 -105
- package/template/.codex/skills/yss-ddd-scaffold-generator/assets/wrapper/.mvn/wrapper/maven-wrapper.properties +4 -2
- package/template/.codex/skills/yss-ddd-scaffold-generator/references/ARCHITECTURE.md +78 -156
- package/template/.codex/skills/yss-ddd-scaffold-generator/references/USAGE_EXAMPLES.md +90 -385
- package/template/.codex/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-adapter/SKILL.md +20 -188
- package/template/.codex/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-parent/SKILL.md +42 -122
- package/template/.codex/skills/yss-ddd-scaffold-generator/scripts/first-slice-compatibility.test.mjs +225 -0
- package/template/.codex/skills/yss-ddd-scaffold-generator/scripts/first-slice-verification.test.mjs +164 -0
- package/template/.codex/skills/yss-ddd-scaffold-generator/scripts/generate_and_verify_scaffold.mjs +126 -0
- package/template/.codex/skills/yss-ddd-scaffold-generator/scripts/generate_scaffold.mjs +153 -42
- package/template/.codex/skills/yss-ddd-scaffold-generator/scripts/run_first_slice_verification.mjs +172 -0
- package/template/.codex/skills/yss-ddd-scaffold-generator/scripts/run_scaffold_verification.mjs +87 -7
- package/template/.codex/skills/yss-ddd-scaffold-generator/scripts/scaffold-generator.test.mjs +335 -12
- package/template/.codex/skills/yss-design-system/SKILL.md +2 -2
- package/template/.codex/skills/yss-design-system/references/design-system.md +2 -2
- package/template/.codex/skills/yss-domain/SKILL.md +5 -4
- package/template/.codex/skills/yss-domain/agents/openai.yaml +2 -2
- package/template/.codex/skills/yss-domain/references/domain-layer-guide.md +62 -235
- package/template/.codex/skills/yss-dto/SKILL.md +11 -5
- package/template/.codex/skills/yss-dto/references/README.md +2 -2
- package/template/.codex/skills/yss-dto/references/openapi-wire-profile.yaml +9 -3
- package/template/.codex/skills/yss-exception/SKILL.md +2 -0
- package/template/.codex/skills/yss-formily/SKILL.md +1 -1
- package/template/.codex/skills/yss-mybatis/SKILL.md +2 -2
- package/template/.codex/skills/yss-page-module-development/SKILL.md +2 -0
- package/template/.codex/skills/yss-product-lifecycle/SKILL.md +1 -1
- package/template/.codex/skills/yss-product-lifecycle/references/matt-yss-adapter.md +2 -2
- package/template/.codex/skills/yss-product-lifecycle/references/orchestration-contract.yaml +54 -21
- package/template/.codex/skills/yss-product-lifecycle/references/orchestration.md +2 -2
- package/template/.codex/skills/yss-repository/SKILL.md +19 -15
- package/template/.codex/skills/yss-repository/agents/openai.yaml +2 -2
- package/template/.codex/skills/yss-repository/references/infrastructure-layer-guide.md +70 -155
- package/template/.codex/skills/yss-research/SKILL.md +73 -0
- package/template/.codex/skills/yss-research/agents/openai.yaml +3 -0
- package/template/.codex/skills/yss-research/assets/evidence-template.yaml +68 -0
- package/template/.codex/skills/yss-research/assets/research-brief-template.md +36 -0
- package/template/.codex/skills/yss-research/references/evidence-contract.md +42 -0
- package/template/.codex/skills/yss-research/scripts/validate-research-package.mjs +128 -0
- package/template/.codex/skills/yss-research/tests/run-scenarios.mjs +81 -0
- package/template/.codex/skills/yss-router/references/router-contract.yaml +48 -10
- package/template/.codex/skills/yss-stage-decision/SKILL.md +2 -1
- package/template/.codex/skills/yss-ui/SKILL.md +6 -5
- package/template/.codex/skills/yss-ui/references/component-routing.md +1 -1
- package/template/.codex/skills/yss-ui-business-page-generation/SKILL.md +159 -0
- package/template/.codex/skills/yss-ui-business-page-generation/references/component-map.md +39 -0
- package/template/.codex/skills/yss-ui-business-page-generation/references/hooks-map.md +70 -0
- package/template/.codex/skills/yss-ui-business-page-generation/references/utils-map.md +51 -0
- package/template/.codex/skills/yss-use-table-height/SKILL.md +78 -297
- package/template/.codex/skills/yss-use-tree-height/SKILL.md +51 -393
- package/template/.codex/skills/yss-web-controller/SKILL.md +26 -19
- package/template/.codex/skills/yss-web-controller/agents/openai.yaml +2 -2
- package/template/.codex/skills/yss-web-controller/assets/templates/Controller.java.template +21 -22
- package/template/.codex/skills/yss-web-controller/assets/templates/WebConvertor.java.template +19 -12
- package/template/.codex/skills/yss-web-controller/assets/templates/web/dto/CreateRequest.java.template +19 -0
- package/template/.codex/skills/yss-web-controller/assets/templates/web/dto/PageRequest.java.template +21 -0
- package/template/.codex/skills/yss-web-controller/assets/templates/web/dto/Response.java.template +18 -0
- package/template/.codex/skills/yss-web-controller/assets/templates/web/dto/UpdateRequest.java.template +19 -0
- package/template/.codex/skills/yss-web-controller/references/web-adapter-layer-guide.md +63 -145
- package/template/.codex/skills/yss-web-controller/references/web-generation-contract.schema.json +97 -0
- package/template/.codex/skills/yss-web-controller/scripts/generate_controller.mjs +168 -19
- package/template/.codex/skills/yss-web-controller/scripts/generate_controller.test.mjs +144 -7
- package/template/.cursor/mcp.json +8 -0
- package/template/.cursor/skills/ask-matt/SKILL.md +1 -1
- package/template/.cursor/skills/code-review/references/yss-review-standards.md +3 -3
- package/template/.cursor/skills/component-selection-imports/SKILL.md +2 -2
- package/template/.cursor/skills/frontend-commit/SKILL.md +1 -1
- package/template/.cursor/skills/wayfinder/SKILL.md +2 -2
- package/template/.cursor/skills/yss-api-integration/SKILL.md +85 -339
- package/template/.cursor/skills/yss-application/SKILL.md +7 -5
- package/template/.cursor/skills/yss-application/references/application-layer-guide.md +60 -105
- package/template/.cursor/skills/yss-components/SKILL.md +1 -1
- package/template/.cursor/skills/yss-ddd-scaffold-generator/SKILL.md +39 -14
- package/template/.cursor/skills/yss-ddd-scaffold-generator/assets/templates/config/application-local.yml.template +8 -0
- package/template/.cursor/skills/yss-ddd-scaffold-generator/assets/templates/config/application.yml.template +2 -3
- package/template/.cursor/skills/yss-ddd-scaffold-generator/assets/templates/java/architecture-rules-test.java.template +36 -0
- package/template/.cursor/skills/yss-ddd-scaffold-generator/assets/templates/java/bootstrap-application.java.template +15 -0
- package/template/.cursor/skills/yss-ddd-scaffold-generator/assets/templates/pom/adapter-pom.xml.template +3 -3
- package/template/.cursor/skills/yss-ddd-scaffold-generator/assets/templates/pom/application-pom.xml.template +13 -4
- package/template/.cursor/skills/yss-ddd-scaffold-generator/assets/templates/pom/bootstrap-pom.xml.template +24 -4
- package/template/.cursor/skills/yss-ddd-scaffold-generator/assets/templates/pom/domain-pom.xml.template +6 -20
- package/template/.cursor/skills/yss-ddd-scaffold-generator/assets/templates/pom/infrastructure-pom.xml.template +26 -6
- package/template/.cursor/skills/yss-ddd-scaffold-generator/assets/templates/pom/parent-pom.xml.template +70 -10
- package/template/.cursor/skills/yss-ddd-scaffold-generator/assets/templates/pom/web-pom.xml.template +24 -10
- package/template/.cursor/skills/yss-ddd-scaffold-generator/assets/wrapper/.mvn/maven.config +2 -3
- package/template/.cursor/skills/yss-ddd-scaffold-generator/assets/wrapper/.mvn/settings.xml +18 -105
- package/template/.cursor/skills/yss-ddd-scaffold-generator/assets/wrapper/.mvn/wrapper/maven-wrapper.properties +4 -2
- package/template/.cursor/skills/yss-ddd-scaffold-generator/references/ARCHITECTURE.md +78 -156
- package/template/.cursor/skills/yss-ddd-scaffold-generator/references/USAGE_EXAMPLES.md +90 -385
- package/template/.cursor/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-adapter/SKILL.md +20 -188
- package/template/.cursor/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-parent/SKILL.md +42 -122
- package/template/.cursor/skills/yss-ddd-scaffold-generator/scripts/first-slice-compatibility.test.mjs +225 -0
- package/template/.cursor/skills/yss-ddd-scaffold-generator/scripts/first-slice-verification.test.mjs +164 -0
- package/template/.cursor/skills/yss-ddd-scaffold-generator/scripts/generate_and_verify_scaffold.mjs +126 -0
- package/template/.cursor/skills/yss-ddd-scaffold-generator/scripts/generate_scaffold.mjs +153 -42
- package/template/.cursor/skills/yss-ddd-scaffold-generator/scripts/run_first_slice_verification.mjs +172 -0
- package/template/.cursor/skills/yss-ddd-scaffold-generator/scripts/run_scaffold_verification.mjs +87 -7
- package/template/.cursor/skills/yss-ddd-scaffold-generator/scripts/scaffold-generator.test.mjs +335 -12
- package/template/.cursor/skills/yss-design-system/SKILL.md +2 -2
- package/template/.cursor/skills/yss-design-system/references/design-system.md +2 -2
- package/template/.cursor/skills/yss-domain/SKILL.md +5 -4
- package/template/.cursor/skills/yss-domain/agents/openai.yaml +2 -2
- package/template/.cursor/skills/yss-domain/references/domain-layer-guide.md +62 -235
- package/template/.cursor/skills/yss-dto/SKILL.md +11 -5
- package/template/.cursor/skills/yss-dto/references/README.md +2 -2
- package/template/.cursor/skills/yss-dto/references/openapi-wire-profile.yaml +9 -3
- package/template/.cursor/skills/yss-exception/SKILL.md +2 -0
- package/template/.cursor/skills/yss-formily/SKILL.md +1 -1
- package/template/.cursor/skills/yss-mybatis/SKILL.md +2 -2
- package/template/.cursor/skills/yss-page-module-development/SKILL.md +2 -0
- package/template/.cursor/skills/yss-product-lifecycle/SKILL.md +1 -1
- package/template/.cursor/skills/yss-product-lifecycle/references/matt-yss-adapter.md +2 -2
- package/template/.cursor/skills/yss-product-lifecycle/references/orchestration-contract.yaml +54 -21
- package/template/.cursor/skills/yss-product-lifecycle/references/orchestration.md +2 -2
- package/template/.cursor/skills/yss-repository/SKILL.md +19 -15
- package/template/.cursor/skills/yss-repository/agents/openai.yaml +2 -2
- package/template/.cursor/skills/yss-repository/references/infrastructure-layer-guide.md +70 -155
- package/template/.cursor/skills/yss-research/SKILL.md +73 -0
- package/template/.cursor/skills/yss-research/agents/openai.yaml +3 -0
- package/template/.cursor/skills/yss-research/assets/evidence-template.yaml +68 -0
- package/template/.cursor/skills/yss-research/assets/research-brief-template.md +36 -0
- package/template/.cursor/skills/yss-research/references/evidence-contract.md +42 -0
- package/template/.cursor/skills/yss-research/scripts/validate-research-package.mjs +128 -0
- package/template/.cursor/skills/yss-research/tests/run-scenarios.mjs +81 -0
- package/template/.cursor/skills/yss-router/references/router-contract.yaml +48 -10
- package/template/.cursor/skills/yss-stage-decision/SKILL.md +2 -1
- package/template/.cursor/skills/yss-ui/SKILL.md +6 -5
- package/template/.cursor/skills/yss-ui/references/component-routing.md +1 -1
- package/template/.cursor/skills/yss-ui-business-page-generation/SKILL.md +159 -0
- package/template/.cursor/skills/yss-ui-business-page-generation/references/component-map.md +39 -0
- package/template/.cursor/skills/yss-ui-business-page-generation/references/hooks-map.md +70 -0
- package/template/.cursor/skills/yss-ui-business-page-generation/references/utils-map.md +51 -0
- package/template/.cursor/skills/yss-use-table-height/SKILL.md +78 -297
- package/template/.cursor/skills/yss-use-tree-height/SKILL.md +51 -393
- package/template/.cursor/skills/yss-web-controller/SKILL.md +26 -19
- package/template/.cursor/skills/yss-web-controller/agents/openai.yaml +2 -2
- package/template/.cursor/skills/yss-web-controller/assets/templates/Controller.java.template +21 -22
- package/template/.cursor/skills/yss-web-controller/assets/templates/WebConvertor.java.template +19 -12
- package/template/.cursor/skills/yss-web-controller/assets/templates/web/dto/CreateRequest.java.template +19 -0
- package/template/.cursor/skills/yss-web-controller/assets/templates/web/dto/PageRequest.java.template +21 -0
- package/template/.cursor/skills/yss-web-controller/assets/templates/web/dto/Response.java.template +18 -0
- package/template/.cursor/skills/yss-web-controller/assets/templates/web/dto/UpdateRequest.java.template +19 -0
- package/template/.cursor/skills/yss-web-controller/references/web-adapter-layer-guide.md +63 -145
- package/template/.cursor/skills/yss-web-controller/references/web-generation-contract.schema.json +97 -0
- package/template/.cursor/skills/yss-web-controller/scripts/generate_controller.mjs +168 -19
- package/template/.cursor/skills/yss-web-controller/scripts/generate_controller.test.mjs +144 -7
- package/template/.cursorrules +9 -5
- package/template/.gemini/settings.json +8 -0
- package/template/.hermes/skills/ask-matt/SKILL.md +1 -1
- package/template/.hermes/skills/code-review/references/yss-review-standards.md +3 -3
- package/template/.hermes/skills/component-selection-imports/SKILL.md +2 -2
- package/template/.hermes/skills/frontend-commit/SKILL.md +1 -1
- package/template/.hermes/skills/wayfinder/SKILL.md +2 -2
- package/template/.hermes/skills/yss-api-integration/SKILL.md +85 -339
- package/template/.hermes/skills/yss-application/SKILL.md +7 -5
- package/template/.hermes/skills/yss-application/references/application-layer-guide.md +60 -105
- package/template/.hermes/skills/yss-components/SKILL.md +1 -1
- package/template/.hermes/skills/yss-ddd-scaffold-generator/SKILL.md +39 -14
- package/template/.hermes/skills/yss-ddd-scaffold-generator/assets/templates/config/application-local.yml.template +8 -0
- package/template/.hermes/skills/yss-ddd-scaffold-generator/assets/templates/config/application.yml.template +2 -3
- package/template/.hermes/skills/yss-ddd-scaffold-generator/assets/templates/java/architecture-rules-test.java.template +36 -0
- package/template/.hermes/skills/yss-ddd-scaffold-generator/assets/templates/java/bootstrap-application.java.template +15 -0
- package/template/.hermes/skills/yss-ddd-scaffold-generator/assets/templates/pom/adapter-pom.xml.template +3 -3
- package/template/.hermes/skills/yss-ddd-scaffold-generator/assets/templates/pom/application-pom.xml.template +13 -4
- package/template/.hermes/skills/yss-ddd-scaffold-generator/assets/templates/pom/bootstrap-pom.xml.template +24 -4
- package/template/.hermes/skills/yss-ddd-scaffold-generator/assets/templates/pom/domain-pom.xml.template +6 -20
- package/template/.hermes/skills/yss-ddd-scaffold-generator/assets/templates/pom/infrastructure-pom.xml.template +26 -6
- package/template/.hermes/skills/yss-ddd-scaffold-generator/assets/templates/pom/parent-pom.xml.template +70 -10
- package/template/.hermes/skills/yss-ddd-scaffold-generator/assets/templates/pom/web-pom.xml.template +24 -10
- package/template/.hermes/skills/yss-ddd-scaffold-generator/assets/wrapper/.mvn/maven.config +2 -3
- package/template/.hermes/skills/yss-ddd-scaffold-generator/assets/wrapper/.mvn/settings.xml +18 -105
- package/template/.hermes/skills/yss-ddd-scaffold-generator/assets/wrapper/.mvn/wrapper/maven-wrapper.properties +4 -2
- package/template/.hermes/skills/yss-ddd-scaffold-generator/references/ARCHITECTURE.md +78 -156
- package/template/.hermes/skills/yss-ddd-scaffold-generator/references/USAGE_EXAMPLES.md +90 -385
- package/template/.hermes/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-adapter/SKILL.md +20 -188
- package/template/.hermes/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-parent/SKILL.md +42 -122
- package/template/.hermes/skills/yss-ddd-scaffold-generator/scripts/first-slice-compatibility.test.mjs +225 -0
- package/template/.hermes/skills/yss-ddd-scaffold-generator/scripts/first-slice-verification.test.mjs +164 -0
- package/template/.hermes/skills/yss-ddd-scaffold-generator/scripts/generate_and_verify_scaffold.mjs +126 -0
- package/template/.hermes/skills/yss-ddd-scaffold-generator/scripts/generate_scaffold.mjs +153 -42
- package/template/.hermes/skills/yss-ddd-scaffold-generator/scripts/run_first_slice_verification.mjs +172 -0
- package/template/.hermes/skills/yss-ddd-scaffold-generator/scripts/run_scaffold_verification.mjs +87 -7
- package/template/.hermes/skills/yss-ddd-scaffold-generator/scripts/scaffold-generator.test.mjs +335 -12
- package/template/.hermes/skills/yss-design-system/SKILL.md +2 -2
- package/template/.hermes/skills/yss-design-system/references/design-system.md +2 -2
- package/template/.hermes/skills/yss-domain/SKILL.md +5 -4
- package/template/.hermes/skills/yss-domain/agents/openai.yaml +2 -2
- package/template/.hermes/skills/yss-domain/references/domain-layer-guide.md +62 -235
- package/template/.hermes/skills/yss-dto/SKILL.md +11 -5
- package/template/.hermes/skills/yss-dto/references/README.md +2 -2
- package/template/.hermes/skills/yss-dto/references/openapi-wire-profile.yaml +9 -3
- package/template/.hermes/skills/yss-exception/SKILL.md +2 -0
- package/template/.hermes/skills/yss-formily/SKILL.md +1 -1
- package/template/.hermes/skills/yss-mybatis/SKILL.md +2 -2
- package/template/.hermes/skills/yss-page-module-development/SKILL.md +2 -0
- package/template/.hermes/skills/yss-product-lifecycle/SKILL.md +1 -1
- package/template/.hermes/skills/yss-product-lifecycle/references/matt-yss-adapter.md +2 -2
- package/template/.hermes/skills/yss-product-lifecycle/references/orchestration-contract.yaml +54 -21
- package/template/.hermes/skills/yss-product-lifecycle/references/orchestration.md +2 -2
- package/template/.hermes/skills/yss-repository/SKILL.md +19 -15
- package/template/.hermes/skills/yss-repository/agents/openai.yaml +2 -2
- package/template/.hermes/skills/yss-repository/references/infrastructure-layer-guide.md +70 -155
- package/template/.hermes/skills/yss-research/SKILL.md +73 -0
- package/template/.hermes/skills/yss-research/agents/openai.yaml +3 -0
- package/template/.hermes/skills/yss-research/assets/evidence-template.yaml +68 -0
- package/template/.hermes/skills/yss-research/assets/research-brief-template.md +36 -0
- package/template/.hermes/skills/yss-research/references/evidence-contract.md +42 -0
- package/template/.hermes/skills/yss-research/scripts/validate-research-package.mjs +128 -0
- package/template/.hermes/skills/yss-research/tests/run-scenarios.mjs +81 -0
- package/template/.hermes/skills/yss-router/references/router-contract.yaml +48 -10
- package/template/.hermes/skills/yss-stage-decision/SKILL.md +2 -1
- package/template/.hermes/skills/yss-ui/SKILL.md +6 -5
- package/template/.hermes/skills/yss-ui/references/component-routing.md +1 -1
- package/template/.hermes/skills/yss-ui-business-page-generation/SKILL.md +159 -0
- package/template/.hermes/skills/yss-ui-business-page-generation/references/component-map.md +39 -0
- package/template/.hermes/skills/yss-ui-business-page-generation/references/hooks-map.md +70 -0
- package/template/.hermes/skills/yss-ui-business-page-generation/references/utils-map.md +51 -0
- package/template/.hermes/skills/yss-use-table-height/SKILL.md +78 -297
- package/template/.hermes/skills/yss-use-tree-height/SKILL.md +51 -393
- package/template/.hermes/skills/yss-web-controller/SKILL.md +26 -19
- package/template/.hermes/skills/yss-web-controller/agents/openai.yaml +2 -2
- package/template/.hermes/skills/yss-web-controller/assets/templates/Controller.java.template +21 -22
- package/template/.hermes/skills/yss-web-controller/assets/templates/WebConvertor.java.template +19 -12
- package/template/.hermes/skills/yss-web-controller/assets/templates/web/dto/CreateRequest.java.template +19 -0
- package/template/.hermes/skills/yss-web-controller/assets/templates/web/dto/PageRequest.java.template +21 -0
- package/template/.hermes/skills/yss-web-controller/assets/templates/web/dto/Response.java.template +18 -0
- package/template/.hermes/skills/yss-web-controller/assets/templates/web/dto/UpdateRequest.java.template +19 -0
- package/template/.hermes/skills/yss-web-controller/references/web-adapter-layer-guide.md +63 -145
- package/template/.hermes/skills/yss-web-controller/references/web-generation-contract.schema.json +97 -0
- package/template/.hermes/skills/yss-web-controller/scripts/generate_controller.mjs +168 -19
- package/template/.hermes/skills/yss-web-controller/scripts/generate_controller.test.mjs +144 -7
- package/template/.kiro/settings/mcp.json +8 -0
- package/template/.mcp.json +8 -0
- package/template/.pi/skills/ask-matt/SKILL.md +1 -1
- package/template/.pi/skills/code-review/references/yss-review-standards.md +3 -3
- package/template/.pi/skills/component-selection-imports/SKILL.md +2 -2
- package/template/.pi/skills/frontend-commit/SKILL.md +1 -1
- package/template/.pi/skills/wayfinder/SKILL.md +2 -2
- package/template/.pi/skills/yss-api-integration/SKILL.md +85 -339
- package/template/.pi/skills/yss-application/SKILL.md +7 -5
- package/template/.pi/skills/yss-application/references/application-layer-guide.md +60 -105
- package/template/.pi/skills/yss-components/SKILL.md +1 -1
- package/template/.pi/skills/yss-ddd-scaffold-generator/SKILL.md +39 -14
- package/template/.pi/skills/yss-ddd-scaffold-generator/assets/templates/config/application-local.yml.template +8 -0
- package/template/.pi/skills/yss-ddd-scaffold-generator/assets/templates/config/application.yml.template +2 -3
- package/template/.pi/skills/yss-ddd-scaffold-generator/assets/templates/java/architecture-rules-test.java.template +36 -0
- package/template/.pi/skills/yss-ddd-scaffold-generator/assets/templates/java/bootstrap-application.java.template +15 -0
- package/template/.pi/skills/yss-ddd-scaffold-generator/assets/templates/pom/adapter-pom.xml.template +3 -3
- package/template/.pi/skills/yss-ddd-scaffold-generator/assets/templates/pom/application-pom.xml.template +13 -4
- package/template/.pi/skills/yss-ddd-scaffold-generator/assets/templates/pom/bootstrap-pom.xml.template +24 -4
- package/template/.pi/skills/yss-ddd-scaffold-generator/assets/templates/pom/domain-pom.xml.template +6 -20
- package/template/.pi/skills/yss-ddd-scaffold-generator/assets/templates/pom/infrastructure-pom.xml.template +26 -6
- package/template/.pi/skills/yss-ddd-scaffold-generator/assets/templates/pom/parent-pom.xml.template +70 -10
- package/template/.pi/skills/yss-ddd-scaffold-generator/assets/templates/pom/web-pom.xml.template +24 -10
- package/template/.pi/skills/yss-ddd-scaffold-generator/assets/wrapper/.mvn/maven.config +2 -3
- package/template/.pi/skills/yss-ddd-scaffold-generator/assets/wrapper/.mvn/settings.xml +18 -105
- package/template/.pi/skills/yss-ddd-scaffold-generator/assets/wrapper/.mvn/wrapper/maven-wrapper.properties +4 -2
- package/template/.pi/skills/yss-ddd-scaffold-generator/references/ARCHITECTURE.md +78 -156
- package/template/.pi/skills/yss-ddd-scaffold-generator/references/USAGE_EXAMPLES.md +90 -385
- package/template/.pi/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-adapter/SKILL.md +20 -188
- package/template/.pi/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-parent/SKILL.md +42 -122
- package/template/.pi/skills/yss-ddd-scaffold-generator/scripts/first-slice-compatibility.test.mjs +225 -0
- package/template/.pi/skills/yss-ddd-scaffold-generator/scripts/first-slice-verification.test.mjs +164 -0
- package/template/.pi/skills/yss-ddd-scaffold-generator/scripts/generate_and_verify_scaffold.mjs +126 -0
- package/template/.pi/skills/yss-ddd-scaffold-generator/scripts/generate_scaffold.mjs +153 -42
- package/template/.pi/skills/yss-ddd-scaffold-generator/scripts/run_first_slice_verification.mjs +172 -0
- package/template/.pi/skills/yss-ddd-scaffold-generator/scripts/run_scaffold_verification.mjs +87 -7
- package/template/.pi/skills/yss-ddd-scaffold-generator/scripts/scaffold-generator.test.mjs +335 -12
- package/template/.pi/skills/yss-design-system/SKILL.md +2 -2
- package/template/.pi/skills/yss-design-system/references/design-system.md +2 -2
- package/template/.pi/skills/yss-domain/SKILL.md +5 -4
- package/template/.pi/skills/yss-domain/agents/openai.yaml +2 -2
- package/template/.pi/skills/yss-domain/references/domain-layer-guide.md +62 -235
- package/template/.pi/skills/yss-dto/SKILL.md +11 -5
- package/template/.pi/skills/yss-dto/references/README.md +2 -2
- package/template/.pi/skills/yss-dto/references/openapi-wire-profile.yaml +9 -3
- package/template/.pi/skills/yss-exception/SKILL.md +2 -0
- package/template/.pi/skills/yss-formily/SKILL.md +1 -1
- package/template/.pi/skills/yss-mybatis/SKILL.md +2 -2
- package/template/.pi/skills/yss-page-module-development/SKILL.md +2 -0
- package/template/.pi/skills/yss-product-lifecycle/SKILL.md +1 -1
- package/template/.pi/skills/yss-product-lifecycle/references/matt-yss-adapter.md +2 -2
- package/template/.pi/skills/yss-product-lifecycle/references/orchestration-contract.yaml +54 -21
- package/template/.pi/skills/yss-product-lifecycle/references/orchestration.md +2 -2
- package/template/.pi/skills/yss-repository/SKILL.md +19 -15
- package/template/.pi/skills/yss-repository/agents/openai.yaml +2 -2
- package/template/.pi/skills/yss-repository/references/infrastructure-layer-guide.md +70 -155
- package/template/.pi/skills/yss-research/SKILL.md +73 -0
- package/template/.pi/skills/yss-research/agents/openai.yaml +3 -0
- package/template/.pi/skills/yss-research/assets/evidence-template.yaml +68 -0
- package/template/.pi/skills/yss-research/assets/research-brief-template.md +36 -0
- package/template/.pi/skills/yss-research/references/evidence-contract.md +42 -0
- package/template/.pi/skills/yss-research/scripts/validate-research-package.mjs +128 -0
- package/template/.pi/skills/yss-research/tests/run-scenarios.mjs +81 -0
- package/template/.pi/skills/yss-router/references/router-contract.yaml +48 -10
- package/template/.pi/skills/yss-stage-decision/SKILL.md +2 -1
- package/template/.pi/skills/yss-ui/SKILL.md +6 -5
- package/template/.pi/skills/yss-ui/references/component-routing.md +1 -1
- package/template/.pi/skills/yss-ui-business-page-generation/SKILL.md +159 -0
- package/template/.pi/skills/yss-ui-business-page-generation/references/component-map.md +39 -0
- package/template/.pi/skills/yss-ui-business-page-generation/references/hooks-map.md +70 -0
- package/template/.pi/skills/yss-ui-business-page-generation/references/utils-map.md +51 -0
- package/template/.pi/skills/yss-use-table-height/SKILL.md +78 -297
- package/template/.pi/skills/yss-use-tree-height/SKILL.md +51 -393
- package/template/.pi/skills/yss-web-controller/SKILL.md +26 -19
- package/template/.pi/skills/yss-web-controller/agents/openai.yaml +2 -2
- package/template/.pi/skills/yss-web-controller/assets/templates/Controller.java.template +21 -22
- package/template/.pi/skills/yss-web-controller/assets/templates/WebConvertor.java.template +19 -12
- package/template/.pi/skills/yss-web-controller/assets/templates/web/dto/CreateRequest.java.template +19 -0
- package/template/.pi/skills/yss-web-controller/assets/templates/web/dto/PageRequest.java.template +21 -0
- package/template/.pi/skills/yss-web-controller/assets/templates/web/dto/Response.java.template +18 -0
- package/template/.pi/skills/yss-web-controller/assets/templates/web/dto/UpdateRequest.java.template +19 -0
- package/template/.pi/skills/yss-web-controller/references/web-adapter-layer-guide.md +63 -145
- package/template/.pi/skills/yss-web-controller/references/web-generation-contract.schema.json +97 -0
- package/template/.pi/skills/yss-web-controller/scripts/generate_controller.mjs +168 -19
- package/template/.pi/skills/yss-web-controller/scripts/generate_controller.test.mjs +144 -7
- package/template/.qoder/skills/ask-matt/SKILL.md +1 -1
- package/template/.qoder/skills/code-review/references/yss-review-standards.md +3 -3
- package/template/.qoder/skills/component-selection-imports/SKILL.md +2 -2
- package/template/.qoder/skills/frontend-commit/SKILL.md +1 -1
- package/template/.qoder/skills/wayfinder/SKILL.md +2 -2
- package/template/.qoder/skills/yss-api-integration/SKILL.md +85 -339
- package/template/.qoder/skills/yss-application/SKILL.md +7 -5
- package/template/.qoder/skills/yss-application/references/application-layer-guide.md +60 -105
- package/template/.qoder/skills/yss-components/SKILL.md +1 -1
- package/template/.qoder/skills/yss-ddd-scaffold-generator/SKILL.md +39 -14
- package/template/.qoder/skills/yss-ddd-scaffold-generator/assets/templates/config/application-local.yml.template +8 -0
- package/template/.qoder/skills/yss-ddd-scaffold-generator/assets/templates/config/application.yml.template +2 -3
- package/template/.qoder/skills/yss-ddd-scaffold-generator/assets/templates/java/architecture-rules-test.java.template +36 -0
- package/template/.qoder/skills/yss-ddd-scaffold-generator/assets/templates/java/bootstrap-application.java.template +15 -0
- package/template/.qoder/skills/yss-ddd-scaffold-generator/assets/templates/pom/adapter-pom.xml.template +3 -3
- package/template/.qoder/skills/yss-ddd-scaffold-generator/assets/templates/pom/application-pom.xml.template +13 -4
- package/template/.qoder/skills/yss-ddd-scaffold-generator/assets/templates/pom/bootstrap-pom.xml.template +24 -4
- package/template/.qoder/skills/yss-ddd-scaffold-generator/assets/templates/pom/domain-pom.xml.template +6 -20
- package/template/.qoder/skills/yss-ddd-scaffold-generator/assets/templates/pom/infrastructure-pom.xml.template +26 -6
- package/template/.qoder/skills/yss-ddd-scaffold-generator/assets/templates/pom/parent-pom.xml.template +70 -10
- package/template/.qoder/skills/yss-ddd-scaffold-generator/assets/templates/pom/web-pom.xml.template +24 -10
- package/template/.qoder/skills/yss-ddd-scaffold-generator/assets/wrapper/.mvn/maven.config +2 -3
- package/template/.qoder/skills/yss-ddd-scaffold-generator/assets/wrapper/.mvn/settings.xml +18 -105
- package/template/.qoder/skills/yss-ddd-scaffold-generator/assets/wrapper/.mvn/wrapper/maven-wrapper.properties +4 -2
- package/template/.qoder/skills/yss-ddd-scaffold-generator/references/ARCHITECTURE.md +78 -156
- package/template/.qoder/skills/yss-ddd-scaffold-generator/references/USAGE_EXAMPLES.md +90 -385
- package/template/.qoder/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-adapter/SKILL.md +20 -188
- package/template/.qoder/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-parent/SKILL.md +42 -122
- package/template/.qoder/skills/yss-ddd-scaffold-generator/scripts/first-slice-compatibility.test.mjs +225 -0
- package/template/.qoder/skills/yss-ddd-scaffold-generator/scripts/first-slice-verification.test.mjs +164 -0
- package/template/.qoder/skills/yss-ddd-scaffold-generator/scripts/generate_and_verify_scaffold.mjs +126 -0
- package/template/.qoder/skills/yss-ddd-scaffold-generator/scripts/generate_scaffold.mjs +153 -42
- package/template/.qoder/skills/yss-ddd-scaffold-generator/scripts/run_first_slice_verification.mjs +172 -0
- package/template/.qoder/skills/yss-ddd-scaffold-generator/scripts/run_scaffold_verification.mjs +87 -7
- package/template/.qoder/skills/yss-ddd-scaffold-generator/scripts/scaffold-generator.test.mjs +335 -12
- package/template/.qoder/skills/yss-design-system/SKILL.md +2 -2
- package/template/.qoder/skills/yss-design-system/references/design-system.md +2 -2
- package/template/.qoder/skills/yss-domain/SKILL.md +5 -4
- package/template/.qoder/skills/yss-domain/agents/openai.yaml +2 -2
- package/template/.qoder/skills/yss-domain/references/domain-layer-guide.md +62 -235
- package/template/.qoder/skills/yss-dto/SKILL.md +11 -5
- package/template/.qoder/skills/yss-dto/references/README.md +2 -2
- package/template/.qoder/skills/yss-dto/references/openapi-wire-profile.yaml +9 -3
- package/template/.qoder/skills/yss-exception/SKILL.md +2 -0
- package/template/.qoder/skills/yss-formily/SKILL.md +1 -1
- package/template/.qoder/skills/yss-mybatis/SKILL.md +2 -2
- package/template/.qoder/skills/yss-page-module-development/SKILL.md +2 -0
- package/template/.qoder/skills/yss-product-lifecycle/SKILL.md +1 -1
- package/template/.qoder/skills/yss-product-lifecycle/references/matt-yss-adapter.md +2 -2
- package/template/.qoder/skills/yss-product-lifecycle/references/orchestration-contract.yaml +54 -21
- package/template/.qoder/skills/yss-product-lifecycle/references/orchestration.md +2 -2
- package/template/.qoder/skills/yss-repository/SKILL.md +19 -15
- package/template/.qoder/skills/yss-repository/agents/openai.yaml +2 -2
- package/template/.qoder/skills/yss-repository/references/infrastructure-layer-guide.md +70 -155
- package/template/.qoder/skills/yss-research/SKILL.md +73 -0
- package/template/.qoder/skills/yss-research/agents/openai.yaml +3 -0
- package/template/.qoder/skills/yss-research/assets/evidence-template.yaml +68 -0
- package/template/.qoder/skills/yss-research/assets/research-brief-template.md +36 -0
- package/template/.qoder/skills/yss-research/references/evidence-contract.md +42 -0
- package/template/.qoder/skills/yss-research/scripts/validate-research-package.mjs +128 -0
- package/template/.qoder/skills/yss-research/tests/run-scenarios.mjs +81 -0
- package/template/.qoder/skills/yss-router/references/router-contract.yaml +48 -10
- package/template/.qoder/skills/yss-stage-decision/SKILL.md +2 -1
- package/template/.qoder/skills/yss-ui/SKILL.md +6 -5
- package/template/.qoder/skills/yss-ui/references/component-routing.md +1 -1
- package/template/.qoder/skills/yss-ui-business-page-generation/SKILL.md +159 -0
- package/template/.qoder/skills/yss-ui-business-page-generation/references/component-map.md +39 -0
- package/template/.qoder/skills/yss-ui-business-page-generation/references/hooks-map.md +70 -0
- package/template/.qoder/skills/yss-ui-business-page-generation/references/utils-map.md +51 -0
- package/template/.qoder/skills/yss-use-table-height/SKILL.md +78 -297
- package/template/.qoder/skills/yss-use-tree-height/SKILL.md +51 -393
- package/template/.qoder/skills/yss-web-controller/SKILL.md +26 -19
- package/template/.qoder/skills/yss-web-controller/agents/openai.yaml +2 -2
- package/template/.qoder/skills/yss-web-controller/assets/templates/Controller.java.template +21 -22
- package/template/.qoder/skills/yss-web-controller/assets/templates/WebConvertor.java.template +19 -12
- package/template/.qoder/skills/yss-web-controller/assets/templates/web/dto/CreateRequest.java.template +19 -0
- package/template/.qoder/skills/yss-web-controller/assets/templates/web/dto/PageRequest.java.template +21 -0
- package/template/.qoder/skills/yss-web-controller/assets/templates/web/dto/Response.java.template +18 -0
- package/template/.qoder/skills/yss-web-controller/assets/templates/web/dto/UpdateRequest.java.template +19 -0
- package/template/.qoder/skills/yss-web-controller/references/web-adapter-layer-guide.md +63 -145
- package/template/.qoder/skills/yss-web-controller/references/web-generation-contract.schema.json +97 -0
- package/template/.qoder/skills/yss-web-controller/scripts/generate_controller.mjs +168 -19
- package/template/.qoder/skills/yss-web-controller/scripts/generate_controller.test.mjs +144 -7
- package/template/.trae/skills/ask-matt/SKILL.md +1 -1
- package/template/.trae/skills/code-review/references/yss-review-standards.md +3 -3
- package/template/.trae/skills/component-selection-imports/SKILL.md +2 -2
- package/template/.trae/skills/frontend-commit/SKILL.md +1 -1
- package/template/.trae/skills/wayfinder/SKILL.md +2 -2
- package/template/.trae/skills/yss-api-integration/SKILL.md +85 -339
- package/template/.trae/skills/yss-application/SKILL.md +7 -5
- package/template/.trae/skills/yss-application/references/application-layer-guide.md +60 -105
- package/template/.trae/skills/yss-components/SKILL.md +1 -1
- package/template/.trae/skills/yss-ddd-scaffold-generator/SKILL.md +39 -14
- package/template/.trae/skills/yss-ddd-scaffold-generator/assets/templates/config/application-local.yml.template +8 -0
- package/template/.trae/skills/yss-ddd-scaffold-generator/assets/templates/config/application.yml.template +2 -3
- package/template/.trae/skills/yss-ddd-scaffold-generator/assets/templates/java/architecture-rules-test.java.template +36 -0
- package/template/.trae/skills/yss-ddd-scaffold-generator/assets/templates/java/bootstrap-application.java.template +15 -0
- package/template/.trae/skills/yss-ddd-scaffold-generator/assets/templates/pom/adapter-pom.xml.template +3 -3
- package/template/.trae/skills/yss-ddd-scaffold-generator/assets/templates/pom/application-pom.xml.template +13 -4
- package/template/.trae/skills/yss-ddd-scaffold-generator/assets/templates/pom/bootstrap-pom.xml.template +24 -4
- package/template/.trae/skills/yss-ddd-scaffold-generator/assets/templates/pom/domain-pom.xml.template +6 -20
- package/template/.trae/skills/yss-ddd-scaffold-generator/assets/templates/pom/infrastructure-pom.xml.template +26 -6
- package/template/.trae/skills/yss-ddd-scaffold-generator/assets/templates/pom/parent-pom.xml.template +70 -10
- package/template/.trae/skills/yss-ddd-scaffold-generator/assets/templates/pom/web-pom.xml.template +24 -10
- package/template/.trae/skills/yss-ddd-scaffold-generator/assets/wrapper/.mvn/maven.config +2 -3
- package/template/.trae/skills/yss-ddd-scaffold-generator/assets/wrapper/.mvn/settings.xml +18 -105
- package/template/.trae/skills/yss-ddd-scaffold-generator/assets/wrapper/.mvn/wrapper/maven-wrapper.properties +4 -2
- package/template/.trae/skills/yss-ddd-scaffold-generator/references/ARCHITECTURE.md +78 -156
- package/template/.trae/skills/yss-ddd-scaffold-generator/references/USAGE_EXAMPLES.md +90 -385
- package/template/.trae/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-adapter/SKILL.md +20 -188
- package/template/.trae/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-parent/SKILL.md +42 -122
- package/template/.trae/skills/yss-ddd-scaffold-generator/scripts/first-slice-compatibility.test.mjs +225 -0
- package/template/.trae/skills/yss-ddd-scaffold-generator/scripts/first-slice-verification.test.mjs +164 -0
- package/template/.trae/skills/yss-ddd-scaffold-generator/scripts/generate_and_verify_scaffold.mjs +126 -0
- package/template/.trae/skills/yss-ddd-scaffold-generator/scripts/generate_scaffold.mjs +153 -42
- package/template/.trae/skills/yss-ddd-scaffold-generator/scripts/run_first_slice_verification.mjs +172 -0
- package/template/.trae/skills/yss-ddd-scaffold-generator/scripts/run_scaffold_verification.mjs +87 -7
- package/template/.trae/skills/yss-ddd-scaffold-generator/scripts/scaffold-generator.test.mjs +335 -12
- package/template/.trae/skills/yss-design-system/SKILL.md +2 -2
- package/template/.trae/skills/yss-design-system/references/design-system.md +2 -2
- package/template/.trae/skills/yss-domain/SKILL.md +5 -4
- package/template/.trae/skills/yss-domain/agents/openai.yaml +2 -2
- package/template/.trae/skills/yss-domain/references/domain-layer-guide.md +62 -235
- package/template/.trae/skills/yss-dto/SKILL.md +11 -5
- package/template/.trae/skills/yss-dto/references/README.md +2 -2
- package/template/.trae/skills/yss-dto/references/openapi-wire-profile.yaml +9 -3
- package/template/.trae/skills/yss-exception/SKILL.md +2 -0
- package/template/.trae/skills/yss-formily/SKILL.md +1 -1
- package/template/.trae/skills/yss-mybatis/SKILL.md +2 -2
- package/template/.trae/skills/yss-page-module-development/SKILL.md +2 -0
- package/template/.trae/skills/yss-product-lifecycle/SKILL.md +1 -1
- package/template/.trae/skills/yss-product-lifecycle/references/matt-yss-adapter.md +2 -2
- package/template/.trae/skills/yss-product-lifecycle/references/orchestration-contract.yaml +54 -21
- package/template/.trae/skills/yss-product-lifecycle/references/orchestration.md +2 -2
- package/template/.trae/skills/yss-repository/SKILL.md +19 -15
- package/template/.trae/skills/yss-repository/agents/openai.yaml +2 -2
- package/template/.trae/skills/yss-repository/references/infrastructure-layer-guide.md +70 -155
- package/template/.trae/skills/yss-research/SKILL.md +73 -0
- package/template/.trae/skills/yss-research/agents/openai.yaml +3 -0
- package/template/.trae/skills/yss-research/assets/evidence-template.yaml +68 -0
- package/template/.trae/skills/yss-research/assets/research-brief-template.md +36 -0
- package/template/.trae/skills/yss-research/references/evidence-contract.md +42 -0
- package/template/.trae/skills/yss-research/scripts/validate-research-package.mjs +128 -0
- package/template/.trae/skills/yss-research/tests/run-scenarios.mjs +81 -0
- package/template/.trae/skills/yss-router/references/router-contract.yaml +48 -10
- package/template/.trae/skills/yss-stage-decision/SKILL.md +2 -1
- package/template/.trae/skills/yss-ui/SKILL.md +6 -5
- package/template/.trae/skills/yss-ui/references/component-routing.md +1 -1
- package/template/.trae/skills/yss-ui-business-page-generation/SKILL.md +159 -0
- package/template/.trae/skills/yss-ui-business-page-generation/references/component-map.md +39 -0
- package/template/.trae/skills/yss-ui-business-page-generation/references/hooks-map.md +70 -0
- package/template/.trae/skills/yss-ui-business-page-generation/references/utils-map.md +51 -0
- package/template/.trae/skills/yss-use-table-height/SKILL.md +78 -297
- package/template/.trae/skills/yss-use-tree-height/SKILL.md +51 -393
- package/template/.trae/skills/yss-web-controller/SKILL.md +26 -19
- package/template/.trae/skills/yss-web-controller/agents/openai.yaml +2 -2
- package/template/.trae/skills/yss-web-controller/assets/templates/Controller.java.template +21 -22
- package/template/.trae/skills/yss-web-controller/assets/templates/WebConvertor.java.template +19 -12
- package/template/.trae/skills/yss-web-controller/assets/templates/web/dto/CreateRequest.java.template +19 -0
- package/template/.trae/skills/yss-web-controller/assets/templates/web/dto/PageRequest.java.template +21 -0
- package/template/.trae/skills/yss-web-controller/assets/templates/web/dto/Response.java.template +18 -0
- package/template/.trae/skills/yss-web-controller/assets/templates/web/dto/UpdateRequest.java.template +19 -0
- package/template/.trae/skills/yss-web-controller/references/web-adapter-layer-guide.md +63 -145
- package/template/.trae/skills/yss-web-controller/references/web-generation-contract.schema.json +97 -0
- package/template/.trae/skills/yss-web-controller/scripts/generate_controller.mjs +168 -19
- package/template/.trae/skills/yss-web-controller/scripts/generate_controller.test.mjs +144 -7
- package/template/.vscode/mcp.json +8 -0
- package/template/AGENTS.md +2 -2
- package/template/CONTEXT.md +1 -1
- package/template/README.md +3 -0
- package/template/docs/agents/digital-human-roles.yaml +3 -3
- package/template/docs/agents/skills-maintenance.md +7 -4
- package/template/docs/agents/yss-skill-registry.yaml +25 -4
- package/template/docs/agents/yss-ui-skills-integration.md +24 -0
- package/template/docs/process/MATT-POCOCK-ENGINEERING-SKILLS.md +1 -0
- package/template/docs/process/template-verification-profiles.yaml +11 -0
- package/template/docs/templates/implementation-routing-template.md +5 -3
- package/template/docs/templates/review-report-template.md +2 -2
- package/template/docs/user-guide/yss-ui-mcp.md +43 -0
- package/template/docs/user-guide//347/224/250/346/210/267/346/211/213/345/206/214.md +1 -1
- package/template/scripts/lib/scenario-checks.mjs +11 -7
- package/template/scripts/lib/skill-governance.mjs +36 -2
- package/template/scripts/lib/skill-registry.mjs +51 -6
- package/template/scripts/lib/skill-supply-chain.mjs +75 -3
- package/template/scripts/verify-scaffold-generator-scenarios +150 -44
- package/template/scripts/verify-skill-governance +1 -1
- package/template/scripts/verify-upstream-skill-source +38 -3
- package/template/scripts/verify-yss-dto-openapi-profile +12 -2
- package/template/skills-lock.json +182 -107
- package/template/yss-public-skills.json +2 -0
- package/template.manifest.json +4 -0
- package/template.snapshot.json +5 -5
- package/template/.agents/skills/research/SKILL.md +0 -12
- package/template/.agents/skills/research/agents/openai.yaml +0 -3
- package/template/.agents/skills/yss-ddd-scaffold-generator/assets/templates/config/parent-pom.xml.template +0 -84
- package/template/.agents/skills/yss-web-controller/assets/templates/domain/dto/cmd/AddCmd.java.template +0 -23
- package/template/.agents/skills/yss-web-controller/assets/templates/domain/dto/cmd/UpdateCmd.java.template +0 -23
- package/template/.agents/skills/yss-web-controller/assets/templates/domain/dto/query/PageQuery.java.template +0 -21
- package/template/.agents/skills/yss-web-controller/assets/templates/domain/vo/VO.java.template +0 -20
- package/template/.claude/skills/research/SKILL.md +0 -12
- package/template/.claude/skills/research/agents/openai.yaml +0 -3
- package/template/.claude/skills/yss-ddd-scaffold-generator/assets/templates/config/parent-pom.xml.template +0 -84
- package/template/.claude/skills/yss-web-controller/assets/templates/domain/dto/cmd/AddCmd.java.template +0 -23
- package/template/.claude/skills/yss-web-controller/assets/templates/domain/dto/cmd/UpdateCmd.java.template +0 -23
- package/template/.claude/skills/yss-web-controller/assets/templates/domain/dto/query/PageQuery.java.template +0 -21
- package/template/.claude/skills/yss-web-controller/assets/templates/domain/vo/VO.java.template +0 -20
- package/template/.codex/skills/research/SKILL.md +0 -12
- package/template/.codex/skills/research/agents/openai.yaml +0 -3
- package/template/.codex/skills/yss-ddd-scaffold-generator/assets/templates/config/parent-pom.xml.template +0 -84
- package/template/.codex/skills/yss-web-controller/assets/templates/domain/dto/cmd/AddCmd.java.template +0 -23
- package/template/.codex/skills/yss-web-controller/assets/templates/domain/dto/cmd/UpdateCmd.java.template +0 -23
- package/template/.codex/skills/yss-web-controller/assets/templates/domain/dto/query/PageQuery.java.template +0 -21
- package/template/.codex/skills/yss-web-controller/assets/templates/domain/vo/VO.java.template +0 -20
- package/template/.cursor/skills/research/SKILL.md +0 -12
- package/template/.cursor/skills/research/agents/openai.yaml +0 -3
- package/template/.cursor/skills/yss-ddd-scaffold-generator/assets/templates/config/parent-pom.xml.template +0 -84
- package/template/.cursor/skills/yss-web-controller/assets/templates/domain/dto/cmd/AddCmd.java.template +0 -23
- package/template/.cursor/skills/yss-web-controller/assets/templates/domain/dto/cmd/UpdateCmd.java.template +0 -23
- package/template/.cursor/skills/yss-web-controller/assets/templates/domain/dto/query/PageQuery.java.template +0 -21
- package/template/.cursor/skills/yss-web-controller/assets/templates/domain/vo/VO.java.template +0 -20
- package/template/.hermes/skills/research/SKILL.md +0 -12
- package/template/.hermes/skills/research/agents/openai.yaml +0 -3
- package/template/.hermes/skills/yss-ddd-scaffold-generator/assets/templates/config/parent-pom.xml.template +0 -84
- package/template/.hermes/skills/yss-web-controller/assets/templates/domain/dto/cmd/AddCmd.java.template +0 -23
- package/template/.hermes/skills/yss-web-controller/assets/templates/domain/dto/cmd/UpdateCmd.java.template +0 -23
- package/template/.hermes/skills/yss-web-controller/assets/templates/domain/dto/query/PageQuery.java.template +0 -21
- package/template/.hermes/skills/yss-web-controller/assets/templates/domain/vo/VO.java.template +0 -20
- package/template/.pi/skills/research/SKILL.md +0 -12
- package/template/.pi/skills/research/agents/openai.yaml +0 -3
- package/template/.pi/skills/yss-ddd-scaffold-generator/assets/templates/config/parent-pom.xml.template +0 -84
- package/template/.pi/skills/yss-web-controller/assets/templates/domain/dto/cmd/AddCmd.java.template +0 -23
- package/template/.pi/skills/yss-web-controller/assets/templates/domain/dto/cmd/UpdateCmd.java.template +0 -23
- package/template/.pi/skills/yss-web-controller/assets/templates/domain/dto/query/PageQuery.java.template +0 -21
- package/template/.pi/skills/yss-web-controller/assets/templates/domain/vo/VO.java.template +0 -20
- package/template/.qoder/skills/research/SKILL.md +0 -12
- package/template/.qoder/skills/research/agents/openai.yaml +0 -3
- package/template/.qoder/skills/yss-ddd-scaffold-generator/assets/templates/config/parent-pom.xml.template +0 -84
- package/template/.qoder/skills/yss-web-controller/assets/templates/domain/dto/cmd/AddCmd.java.template +0 -23
- package/template/.qoder/skills/yss-web-controller/assets/templates/domain/dto/cmd/UpdateCmd.java.template +0 -23
- package/template/.qoder/skills/yss-web-controller/assets/templates/domain/dto/query/PageQuery.java.template +0 -21
- package/template/.qoder/skills/yss-web-controller/assets/templates/domain/vo/VO.java.template +0 -20
- package/template/.trae/skills/research/SKILL.md +0 -12
- package/template/.trae/skills/research/agents/openai.yaml +0 -3
- package/template/.trae/skills/yss-ddd-scaffold-generator/assets/templates/config/parent-pom.xml.template +0 -84
- package/template/.trae/skills/yss-web-controller/assets/templates/domain/dto/cmd/AddCmd.java.template +0 -23
- package/template/.trae/skills/yss-web-controller/assets/templates/domain/dto/cmd/UpdateCmd.java.template +0 -23
- package/template/.trae/skills/yss-web-controller/assets/templates/domain/dto/query/PageQuery.java.template +0 -21
- package/template/.trae/skills/yss-web-controller/assets/templates/domain/vo/VO.java.template +0 -20
package/template/.cursor/skills/yss-ddd-scaffold-generator/scripts/run_scaffold_verification.mjs
CHANGED
|
@@ -10,23 +10,103 @@ const COMMANDS = PHASES.map((phase) => `./mvnw ${phase}`);
|
|
|
10
10
|
const isoNow = () => new Date().toISOString();
|
|
11
11
|
async function isFile(target) { try { return (await stat(target)).isFile(); } catch (error) { if (error.code === "ENOENT") return false; throw error; } }
|
|
12
12
|
async function writeText(target, content) { await mkdir(path.dirname(target), { recursive: true }); await writeFile(target, content, "utf8"); }
|
|
13
|
+
async function isExecutable(target) {
|
|
14
|
+
try { const info = await stat(target); return info.isFile() && Boolean(info.mode & 0o111); }
|
|
15
|
+
catch (error) { if (error.code === "ENOENT") return false; throw error; }
|
|
16
|
+
}
|
|
17
|
+
async function readTextIfPresent(target) { try { return await readFile(target, "utf8"); } catch (error) { if (error.code === "ENOENT") return ""; throw error; } }
|
|
18
|
+
function configured(value) { return typeof value === "string" && value.trim().length > 0; }
|
|
19
|
+
function redactSecrets(text, environment = process.env) {
|
|
20
|
+
let output = text;
|
|
21
|
+
for (const name of ["MAVEN_REPO_USERNAME", "MAVEN_REPO_PASSWORD"]) {
|
|
22
|
+
const value = environment[name];
|
|
23
|
+
if (configured(value)) output = output.replaceAll(value, `[REDACTED:${name}]`);
|
|
24
|
+
}
|
|
25
|
+
return output;
|
|
26
|
+
}
|
|
27
|
+
function classifyFailure(phase, outcome) {
|
|
28
|
+
if (outcome.exitCode === 0) return null;
|
|
29
|
+
const output = `${outcome.stdout}\n${outcome.stderr}`.replaceAll(/\u001B\[[0-9;]*m/g, "");
|
|
30
|
+
if (/Non-resolvable parent POM|Could not transfer artifact|Could not resolve (?:dependencies|artifact)|status code: 401|\bUnauthorized\b|PKIX path building failed|Name or service not known|Unknown host/i.test(output)) return "repository-access";
|
|
31
|
+
if (/Unable to find main class|mainClass.*(?:not found|missing)/i.test(output)) return "bootstrap-entrypoint";
|
|
32
|
+
if (/COMPILATION ERROR|Compilation failure|maven-compiler-plugin/i.test(output)) return "compilation";
|
|
33
|
+
if (phase === "validate") return "project-model";
|
|
34
|
+
if (phase === "test") return "test-failure";
|
|
35
|
+
if (phase === "package") return "packaging";
|
|
36
|
+
return "maven-execution";
|
|
37
|
+
}
|
|
13
38
|
function parseArgs(argv) { const result = {}; for (let index = 0; index < argv.length; index += 1) { let token = argv[index]; if (token === "--help" || token === "-h") { result.help = true; continue; } const equals = token.indexOf("="); let value; if (equals !== -1) { value = token.slice(equals + 1); token = token.slice(0, equals); } if (!["--project-root", "--evidence-dir"].includes(token)) throw new Error(`不支持的参数: ${token}`); if (value === undefined) value = argv[++index]; if (!value || value.startsWith("--")) throw new Error(`参数 ${token} 缺少值`); result[token === "--project-root" ? "projectRoot" : "evidenceDir"] = path.resolve(value); } if (result.help) return result; if (!result.projectRoot || !result.evidenceDir) throw new Error("必须提供 --project-root 和 --evidence-dir"); return result; }
|
|
14
39
|
function validateManifest(manifest) {
|
|
15
|
-
|
|
40
|
+
if (manifest.schema_version !== 2) throw new Error(`unsupported: scaffold Manifest schema_version=${manifest.schema_version};只验证 Target Profile v2`);
|
|
41
|
+
const required = ["schema_version", "contract_id", "contract_version", "scaffold_request_id", "contract_digest", "profiles", "ownership", "readiness", "generation_policy", "completion_level", "approval_ref", "approver", "lifecycle_approval_ref", "router_draft_ref", "persisted_ref", "contract_file_ref", "current_version", "allowed_write_paths", "expected_evidence_files", "verification_commands", "generation_mode"];
|
|
16
42
|
const missing = required.filter((field) => manifest[field] === undefined || manifest[field] === null || manifest[field] === "");
|
|
17
43
|
if (manifest.generation_mode !== "controlled-generation" || missing.length) throw new Error(`脚手架生成元数据清单不完整或不是 controlled-generation: ${missing.join(", ")}`);
|
|
44
|
+
if (manifest.profiles.architecture !== "target-domain-model" || manifest.generation_policy.mode !== "initialize-only" || manifest.generation_policy.existing_target !== "unsupported" || manifest.generation_policy.old_project_migration !== "unsupported" || manifest.generation_policy.template_upgrade !== "unsupported") throw new Error("Manifest v2 必须声明 Target Profile 与严格 initialize-only;已有目标、旧项目迁移和模板升级均须为 unsupported");
|
|
18
45
|
if (manifest.current_version !== manifest.contract_version) throw new Error("脚手架生成元数据清单不是当前合同版本");
|
|
19
46
|
if (JSON.stringify(manifest.verification_commands) !== JSON.stringify(COMMANDS)) throw new Error("脚手架生成元数据清单验证命令不符合固定合同");
|
|
20
47
|
}
|
|
21
|
-
function execute(wrapper, phase, cwd) { return new Promise((resolve) => { const child = spawn(wrapper, [phase], { cwd, stdio: ["ignore", "pipe", "pipe"] }); let stdout = "", stderr = ""; child.stdout.on("data", (chunk) => { stdout += chunk; }); child.stderr.on("data", (chunk) => { stderr += chunk; }); child.on("error", (error) => resolve({ exitCode: 127, stdout: "", stderr: String(error) })); child.on("close", (code) => resolve({ exitCode: code ?? 1, stdout, stderr })); }); }
|
|
22
|
-
export async function run(projectRoot, evidenceDir) {
|
|
48
|
+
function execute(wrapper, phase, cwd, environment) { return new Promise((resolve) => { const child = spawn(wrapper, [phase], { cwd, env: environment, stdio: ["ignore", "pipe", "pipe"] }); let stdout = "", stderr = ""; child.stdout.on("data", (chunk) => { stdout += chunk; }); child.stderr.on("data", (chunk) => { stderr += chunk; }); child.on("error", (error) => resolve({ exitCode: 127, stdout: "", stderr: String(error) })); child.on("close", (code) => resolve({ exitCode: code ?? 1, stdout, stderr })); }); }
|
|
49
|
+
export async function run(projectRoot, evidenceDir, environment = process.env) {
|
|
23
50
|
const wrapper = path.join(projectRoot, "mvnw"), manifestPath = path.join(projectRoot, ".yss", "scaffold-generation.json");
|
|
24
51
|
if (!await isFile(wrapper)) throw new Error(`项目根目录缺少 Maven wrapper: ${wrapper}`);
|
|
25
52
|
if (!await isFile(manifestPath)) throw new Error(`项目根目录缺少脚手架生成元数据清单: ${manifestPath}`);
|
|
26
53
|
let manifest; try { manifest = JSON.parse(await readFile(manifestPath, "utf8")); } catch { throw new Error(`脚手架生成元数据清单无法读取或不是合法 JSON: ${manifestPath}`); }
|
|
27
|
-
validateManifest(manifest);
|
|
28
|
-
|
|
29
|
-
|
|
54
|
+
validateManifest(manifest);
|
|
55
|
+
await mkdir(evidenceDir, { recursive: true });
|
|
56
|
+
const mavenConfig = await readTextIfPresent(path.join(projectRoot, ".mvn", "maven.config"));
|
|
57
|
+
const preflight = {
|
|
58
|
+
wrapper_exists: true,
|
|
59
|
+
wrapper_executable: await isExecutable(wrapper),
|
|
60
|
+
java_home_configured: configured(environment.JAVA_HOME),
|
|
61
|
+
maven_repository_credentials_configured: configured(environment.MAVEN_REPO_USERNAME) && configured(environment.MAVEN_REPO_PASSWORD),
|
|
62
|
+
maven_repository_url_configured: configured(environment.YSS_MAVEN_REPOSITORY_URL),
|
|
63
|
+
project_settings_present: await isFile(path.join(projectRoot, ".mvn", "settings.xml")),
|
|
64
|
+
project_maven_config_present: await isFile(path.join(projectRoot, ".mvn", "maven.config")),
|
|
65
|
+
project_settings_wired: /(?:^|\s)-(?:s|-settings)\s+\.mvn\/settings\.xml(?:\s|$)/m.test(mavenConfig),
|
|
66
|
+
repository_profile: manifest.profiles.repository,
|
|
67
|
+
repository_profile_wired: /(?:^|\s)-(?:P|-activate-profiles)\s+yss-internal(?:\s|$)/m.test(mavenConfig),
|
|
68
|
+
maven_coordinates_source: manifest.maven_coordinates_source
|
|
69
|
+
};
|
|
70
|
+
const failed = [];
|
|
71
|
+
if (!preflight.wrapper_executable) failed.push("wrapper-not-executable");
|
|
72
|
+
if (!preflight.project_settings_present || !preflight.project_maven_config_present || !preflight.project_settings_wired || !preflight.repository_profile_wired) failed.push("repository-profile-not-wired");
|
|
73
|
+
if (!preflight.maven_repository_url_configured) failed.push("repository-url-not-configured");
|
|
74
|
+
if (!preflight.maven_repository_credentials_configured) failed.push("repository-credentials-not-configured");
|
|
75
|
+
if (failed.length) return { verification_mode: "controlled-generation", project_root: projectRoot, scaffold_manifest_ref: manifestPath, generated_at: isoNow(), status: "failed", failure_category: "verification-preflight", completion_level: "generated", preflight: { ...preflight, failures: failed }, commands: [] };
|
|
76
|
+
const commands = [];
|
|
77
|
+
for (const phase of PHASES) {
|
|
78
|
+
const stdoutPath = path.join(evidenceDir, `mvnw-${phase}.stdout.log`);
|
|
79
|
+
const stderrPath = path.join(evidenceDir, `mvnw-${phase}.stderr.log`);
|
|
80
|
+
const startedAt = isoNow();
|
|
81
|
+
const started = process.hrtime.bigint();
|
|
82
|
+
const outcome = await execute(wrapper, phase, projectRoot, environment);
|
|
83
|
+
const durationMs = Number(process.hrtime.bigint() - started) / 1e6;
|
|
84
|
+
await writeText(stdoutPath, redactSecrets(outcome.stdout, environment));
|
|
85
|
+
await writeText(stderrPath, redactSecrets(outcome.stderr, environment));
|
|
86
|
+
commands.push({
|
|
87
|
+
command: `./mvnw ${phase}`,
|
|
88
|
+
phase,
|
|
89
|
+
exit_code: outcome.exitCode,
|
|
90
|
+
failure_category: classifyFailure(phase, outcome),
|
|
91
|
+
duration_ms: Number(durationMs.toFixed(3)),
|
|
92
|
+
started_at: startedAt,
|
|
93
|
+
executed_at: isoNow(),
|
|
94
|
+
stdout_ref: stdoutPath,
|
|
95
|
+
stderr_ref: stderrPath
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
const failureCategory = commands.find((item) => item.failure_category)?.failure_category ?? null;
|
|
99
|
+
return {
|
|
100
|
+
verification_mode: "controlled-generation",
|
|
101
|
+
project_root: projectRoot,
|
|
102
|
+
scaffold_manifest_ref: manifestPath,
|
|
103
|
+
generated_at: isoNow(),
|
|
104
|
+
status: failureCategory === null ? "passed" : "failed",
|
|
105
|
+
failure_category: failureCategory,
|
|
106
|
+
completion_level: failureCategory === null ? "empty-scaffold-verified" : "generated",
|
|
107
|
+
preflight,
|
|
108
|
+
commands
|
|
109
|
+
};
|
|
30
110
|
}
|
|
31
|
-
async function main() { let args; try { args = parseArgs(process.argv.slice(2)); if (args.help) { console.log("运行 YSS 脚手架真实验证命令\n用法: node scripts/run_scaffold_verification.mjs --project-root <dir> --evidence-dir <dir>"); return 0; } const reportPath = path.join(args.evidenceDir, "scaffold-verification.json"); try { const report = await run(args.projectRoot, args.evidenceDir); await writeText(reportPath, `${JSON.stringify(report, null, 2)}\n`); console.log(`${report.status}: ${reportPath}`); return report.status === "passed" ? 0 : 1; } catch (error) { const report = { verification_mode: "controlled-generation", project_root: args.projectRoot, generated_at: isoNow(), status: "failed", error: error.message, commands: [] }; await writeText(reportPath, `${JSON.stringify(report, null, 2)}\n`); process.stderr.write(`❌ 脚手架验证无法执行: ${error.message}\n`); return 1; } } catch (error) { process.stderr.write(`❌ 脚手架验证无法执行: ${error.message}\n`); return 1; } }
|
|
111
|
+
async function main() { let args; try { args = parseArgs(process.argv.slice(2)); if (args.help) { console.log("运行 YSS 脚手架真实验证命令\n用法: node scripts/run_scaffold_verification.mjs --project-root <dir> --evidence-dir <dir>"); return 0; } const reportPath = path.join(args.evidenceDir, "scaffold-verification.json"); try { const report = await run(args.projectRoot, args.evidenceDir); await writeText(reportPath, `${JSON.stringify(report, null, 2)}\n`); console.log(`${report.status}: ${reportPath}`); return report.status === "passed" ? 0 : 1; } catch (error) { const report = { verification_mode: "controlled-generation", project_root: args.projectRoot, generated_at: isoNow(), status: "failed", failure_category: "verification-preflight", error: error.message, commands: [] }; await writeText(reportPath, `${JSON.stringify(report, null, 2)}\n`); process.stderr.write(`❌ 脚手架验证无法执行: ${error.message}\n`); return 1; } } catch (error) { process.stderr.write(`❌ 脚手架验证无法执行: ${error.message}\n`); return 1; } }
|
|
32
112
|
if (process.argv[1] && import.meta.url === new URL(`file://${process.argv[1]}`).href) process.exitCode = await main();
|
package/template/.cursor/skills/yss-ddd-scaffold-generator/scripts/scaffold-generator.test.mjs
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import assert from "node:assert/strict";
|
|
2
2
|
import { execFile } from "node:child_process";
|
|
3
|
+
import { createHash } from "node:crypto";
|
|
3
4
|
import { chmod, mkdtemp, mkdir, readFile, readdir, rm, writeFile } from "node:fs/promises";
|
|
4
5
|
import { existsSync } from "node:fs";
|
|
5
6
|
import os from "node:os";
|
|
@@ -12,19 +13,264 @@ import { GITLINK_MODE, gitLsFilesStage } from "../../../../scripts/lib/repositor
|
|
|
12
13
|
|
|
13
14
|
const scripts = path.dirname(fileURLToPath(import.meta.url));
|
|
14
15
|
const generator = path.join(scripts, "generate_scaffold.mjs");
|
|
16
|
+
const workflow = path.join(scripts, "generate_and_verify_scaffold.mjs");
|
|
15
17
|
const command = (args, options = {}) => new Promise((resolve) => execFile(process.execPath, [generator, ...args], { encoding: "utf8", ...options }, (error, stdout, stderr) => resolve({ code: error?.code ?? 0, stdout, stderr })));
|
|
18
|
+
const workflowCommand = (args, options = {}) => new Promise((resolve) => execFile(process.execPath, [workflow, ...args], { encoding: "utf8", ...options }, (error, stdout, stderr) => resolve({ code: error?.code ?? 0, stdout, stderr })));
|
|
19
|
+
async function treeDigest(root) {
|
|
20
|
+
const hash = createHash("sha256");
|
|
21
|
+
async function visit(directory) {
|
|
22
|
+
for (const entry of (await readdir(directory, { withFileTypes: true })).sort((left, right) => left.name.localeCompare(right.name))) {
|
|
23
|
+
const absolute = path.join(directory, entry.name);
|
|
24
|
+
if (entry.isDirectory()) await visit(absolute);
|
|
25
|
+
else if (entry.isFile()) hash.update(path.relative(root, absolute).split(path.sep).join("/")).update("\0").update(await readFile(absolute)).update("\0");
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
await visit(root);
|
|
29
|
+
return hash.digest("hex");
|
|
30
|
+
}
|
|
16
31
|
function contract(outputDir, overrides = {}) {
|
|
17
|
-
return {
|
|
32
|
+
return {
|
|
33
|
+
schema_version: 2,
|
|
34
|
+
contract_id: "scaffold-1",
|
|
35
|
+
contract_version: 1,
|
|
36
|
+
scaffold_request_id: "scaffold-request-1",
|
|
37
|
+
status: "approved",
|
|
38
|
+
router_draft_ref: "router-1",
|
|
39
|
+
lifecycle_approval_ref: "approval-1",
|
|
40
|
+
persisted_ref: "persisted-1",
|
|
41
|
+
current_version: 1,
|
|
42
|
+
implementation_repository: "external",
|
|
43
|
+
backend_repository: "external",
|
|
44
|
+
scaffold_status: "required",
|
|
45
|
+
project_name: "demo-service",
|
|
46
|
+
target_output_dir: outputDir,
|
|
47
|
+
base_package: "com.yss.demo",
|
|
48
|
+
maven_coordinates: {
|
|
49
|
+
group_id: "com.yss.datamiddle",
|
|
50
|
+
project_version: "1.0.0-SNAPSHOT",
|
|
51
|
+
parent: { group_id: "com.yss.datamiddle", artifact_id: "yss-datamiddle-parent", version: "2.0.0-SNAPSHOT" },
|
|
52
|
+
yss_components_version: "2.0.0-SNAPSHOT"
|
|
53
|
+
},
|
|
54
|
+
profiles: {
|
|
55
|
+
architecture: "target-domain-model",
|
|
56
|
+
persistence: "mybatis-plus",
|
|
57
|
+
database: "mysql",
|
|
58
|
+
platform: "spring-boot-2.7-jdk8",
|
|
59
|
+
validation_namespace: "javax",
|
|
60
|
+
dto_placement: "web",
|
|
61
|
+
repository: "yss-internal"
|
|
62
|
+
},
|
|
63
|
+
allowed_write_paths: ["."],
|
|
64
|
+
expected_evidence_files: [".yss/scaffold-generation.json"],
|
|
65
|
+
verification_commands: ["./mvnw validate", "./mvnw test", "./mvnw package"],
|
|
66
|
+
approval: { approval_ref: "approval-1", approver: "reviewer", persisted_ref: "persisted-1", current_version: 1 },
|
|
67
|
+
work_unit: { id: "unit-1", behavior: "scaffold", primary_skill: "yss-ddd-scaffold-generator", supporting_skills: ["yss-router"], tdd_mode: "controlled-generation", allowed_write_paths: ["."], expected_evidence: ["manifest"], verification_commands: ["./mvnw validate", "./mvnw test", "./mvnw package"], controlled_generation: true },
|
|
68
|
+
generation_policy: { mode: "initialize-only", existing_target: "unsupported", old_project_migration: "unsupported", template_upgrade: "unsupported" },
|
|
69
|
+
...overrides
|
|
70
|
+
};
|
|
18
71
|
}
|
|
19
|
-
async function fixture() { const root = await mkdtemp(path.join(os.tmpdir(), "yss-scaffold-node-")); const output = path.join(root, "implementation"); await mkdir(output); const contractFile = path.join(root, "contract.json"); await writeFile(contractFile, `${JSON.stringify(contract(output), null, 2)}\n`); return { root, output, contractFile, args: ["--project-name", "demo-service", "--base-package", "com.yss.demo", "--output-dir", output, "--database", "mysql", "--contract-id", "scaffold-1", "--contract-version", "1", "--approval-ref", "approval-1", "--router-draft-ref", "router-1", "--persisted-ref", "persisted-1", "--contract-file", contractFile] }; }
|
|
72
|
+
async function fixture(contractOverrides = {}) { const root = await mkdtemp(path.join(os.tmpdir(), "yss-scaffold-node-")); const output = path.join(root, "implementation"); await mkdir(output); const contractFile = path.join(root, "contract.json"); await writeFile(contractFile, `${JSON.stringify(contract(output, contractOverrides), null, 2)}\n`); return { root, output, contractFile, args: ["--project-name", "demo-service", "--base-package", "com.yss.demo", "--output-dir", output, "--database", "mysql", "--contract-id", "scaffold-1", "--contract-version", "1", "--approval-ref", "approval-1", "--router-draft-ref", "router-1", "--persisted-ref", "persisted-1", "--contract-file", contractFile, "--group-id", "com.yss.datamiddle", "--project-version", "1.0.0-SNAPSHOT", "--parent-group-id", "com.yss.datamiddle", "--parent-artifact-id", "yss-datamiddle-parent", "--parent-version", "2.0.0-SNAPSHOT", "--yss-components-version", "2.0.0-SNAPSHOT"] }; }
|
|
20
73
|
|
|
21
|
-
|
|
74
|
+
const controlledEnvironment = {
|
|
75
|
+
...process.env,
|
|
76
|
+
YSS_MAVEN_REPOSITORY_URL: "https://repo.example.invalid/repository/maven-public/",
|
|
77
|
+
MAVEN_REPO_USERNAME: "test-user",
|
|
78
|
+
MAVEN_REPO_PASSWORD: "test-password"
|
|
79
|
+
};
|
|
80
|
+
function targetManifest(overrides = {}) {
|
|
81
|
+
return {
|
|
82
|
+
schema_version: 2,
|
|
83
|
+
contract_id: "id",
|
|
84
|
+
contract_version: 1,
|
|
85
|
+
scaffold_request_id: "request",
|
|
86
|
+
contract_digest: "a".repeat(64),
|
|
87
|
+
approval_ref: "approval",
|
|
88
|
+
approver: "reviewer",
|
|
89
|
+
lifecycle_approval_ref: "approval",
|
|
90
|
+
router_draft_ref: "router",
|
|
91
|
+
persisted_ref: "persisted",
|
|
92
|
+
contract_file_ref: "contract",
|
|
93
|
+
current_version: 1,
|
|
94
|
+
allowed_write_paths: ["."],
|
|
95
|
+
expected_evidence_files: ["manifest"],
|
|
96
|
+
verification_commands: ["./mvnw validate", "./mvnw test", "./mvnw package"],
|
|
97
|
+
generation_mode: "controlled-generation",
|
|
98
|
+
completion_level: "generated",
|
|
99
|
+
profiles: { architecture: "target-domain-model", repository: "yss-internal" },
|
|
100
|
+
ownership: { generated_files: [] },
|
|
101
|
+
readiness: { downstream_skills: {}, architecture_ruleset: "b".repeat(64) },
|
|
102
|
+
generation_policy: { mode: "initialize-only", existing_target: "unsupported", old_project_migration: "unsupported", template_upgrade: "unsupported" },
|
|
103
|
+
maven_coordinates_source: "approved-contract",
|
|
104
|
+
...overrides
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
async function prepareVerifierProject(project, manifest = targetManifest()) {
|
|
108
|
+
await mkdir(path.join(project, ".yss"), { recursive: true });
|
|
109
|
+
await mkdir(path.join(project, ".mvn"), { recursive: true });
|
|
110
|
+
await writeFile(path.join(project, ".mvn", "maven.config"), "-s .mvn/settings.xml\n-P yss-internal\n");
|
|
111
|
+
await writeFile(path.join(project, ".mvn", "settings.xml"), "<settings/>\n");
|
|
112
|
+
await writeFile(path.join(project, ".yss", "scaffold-generation.json"), `${JSON.stringify(manifest)}\n`);
|
|
113
|
+
}
|
|
22
114
|
|
|
23
|
-
test("
|
|
115
|
+
test("生成批准的服务级 target profile 骨架,并写入可追溯 Manifest v2", async (t) => { const data = await fixture(); t.after(() => rm(data.root, { recursive: true, force: true })); const result = await command(data.args); assert.equal(result.code, 0, result.stderr); const project = path.join(data.output, "demo-service"); const manifest = JSON.parse(await readFile(path.join(project, ".yss/scaffold-generation.json"), "utf8")); assert.equal(manifest.schema_version, 2); assert.equal(manifest.scaffold_request_id, "scaffold-request-1"); assert.equal(manifest.slice_id, undefined); assert.equal(manifest.completion_level, "generated"); assert.equal(manifest.profiles.architecture, "target-domain-model"); assert.deepEqual(manifest.generation_policy, { mode: "initialize-only", existing_target: "unsupported", old_project_migration: "unsupported", template_upgrade: "unsupported" }); assert.match(manifest.generator.template_digest, /^[a-f0-9]{64}$/); assert.match(manifest.contract_digest, /^[a-f0-9]{64}$/); assert.ok(manifest.ownership.generated_files.length > 8); assert.ok(manifest.ownership.generated_files.every((item) => item.owner === "generator" && /^[a-f0-9]{64}$/.test(item.sha256))); assert.equal(manifest.generation_mode, "controlled-generation"); assert.deepEqual(manifest.verification_commands, ["./mvnw validate", "./mvnw test", "./mvnw package"]); assert.equal(manifest.bootstrap_main_class, "com.yss.demo.DemoServiceApplication"); assert.equal(manifest.bootstrap_main_source, "demo-service-bootstrap/src/main/java/com/yss/demo/DemoServiceApplication.java"); assert.match(await readFile(path.join(project, manifest.bootstrap_main_source), "utf8"), /class DemoServiceApplication/); assert.match(await readFile(path.join(project, "pom.xml"), "utf8"), /demo-service/); assert.equal(manifest.readiness.downstream_skills["yss-domain"], await treeDigest(path.resolve(scripts, "../../yss-domain"))); assert.match(manifest.readiness.contracts.scaffold_parent, /^[a-f0-9]{64}$/); assert.match(manifest.readiness.contracts.router_contract, /^[a-f0-9]{64}$/); });
|
|
24
116
|
|
|
25
|
-
test("
|
|
117
|
+
test("schema v1 scaffold contract is unsupported and is never upgraded", async (t) => {
|
|
118
|
+
const data = await fixture({ schema_version: 1 });
|
|
119
|
+
t.after(() => rm(data.root, { recursive: true, force: true }));
|
|
120
|
+
const result = await command(data.args);
|
|
121
|
+
assert.equal(result.code, 1);
|
|
122
|
+
assert.match(result.stderr, /unsupported: scaffold contract schema_version=1/);
|
|
123
|
+
assert.equal(existsSync(path.join(data.output, "demo-service")), false);
|
|
124
|
+
});
|
|
26
125
|
|
|
27
|
-
test("
|
|
126
|
+
test("一键工作流只有在真实 Maven 三命令全部通过后才报告完成", { timeout: 300_000 }, async (t) => {
|
|
127
|
+
if (!["YSS_MAVEN_REPOSITORY_URL", "MAVEN_REPO_USERNAME", "MAVEN_REPO_PASSWORD"].every((name) => process.env[name])) {
|
|
128
|
+
t.skip("缺少受控 YSS Maven 仓库环境,真实 Wrapper 验证由 L3 环境门禁执行");
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
const data = await fixture();
|
|
132
|
+
t.after(() => rm(data.root, { recursive: true, force: true }));
|
|
133
|
+
const evidence = path.join(data.root, "workflow-evidence");
|
|
134
|
+
const result = await workflowCommand([...data.args, "--evidence-dir", evidence]);
|
|
135
|
+
assert.equal(result.code, 0, result.stderr);
|
|
136
|
+
assert.match(result.stdout, /脚手架生成与验证完成/);
|
|
137
|
+
const verification = JSON.parse(await readFile(path.join(evidence, "scaffold-verification.json"), "utf8"));
|
|
138
|
+
const workflowReport = JSON.parse(await readFile(path.join(evidence, "scaffold-workflow.json"), "utf8"));
|
|
139
|
+
assert.equal(verification.status, "passed");
|
|
140
|
+
assert.deepEqual(verification.commands.map((item) => item.command), ["./mvnw validate", "./mvnw test", "./mvnw package"]);
|
|
141
|
+
assert.ok(verification.commands.every((item) => item.exit_code === 0));
|
|
142
|
+
assert.equal(verification.preflight.project_settings_wired, true);
|
|
143
|
+
assert.equal(verification.preflight.repository_profile_wired, true);
|
|
144
|
+
assert.equal(workflowReport.status, "completed");
|
|
145
|
+
assert.equal(workflowReport.verification_ref, path.join(evidence, "scaffold-verification.json"));
|
|
146
|
+
const manifest = JSON.parse(await readFile(path.join(data.output, "demo-service", ".yss", "scaffold-generation.json"), "utf8"));
|
|
147
|
+
assert.equal(manifest.completion_level, "empty-scaffold-verified");
|
|
148
|
+
});
|
|
149
|
+
|
|
150
|
+
test("显式 Maven 坐标贯穿批准合同、生成参数、全部 POM 和生成清单", async (t) => {
|
|
151
|
+
const mavenCoordinates = {
|
|
152
|
+
group_id: "com.example.metadata",
|
|
153
|
+
project_version: "1.2.3-SNAPSHOT",
|
|
154
|
+
parent: {
|
|
155
|
+
group_id: "com.yss.datamiddle",
|
|
156
|
+
artifact_id: "yss-datamiddle-parent",
|
|
157
|
+
version: "2.0.0-SNAPSHOT"
|
|
158
|
+
},
|
|
159
|
+
yss_components_version: "2.0.0-SNAPSHOT"
|
|
160
|
+
};
|
|
161
|
+
const data = await fixture({ maven_coordinates: mavenCoordinates });
|
|
162
|
+
t.after(() => rm(data.root, { recursive: true, force: true }));
|
|
163
|
+
const result = await command([
|
|
164
|
+
...data.args,
|
|
165
|
+
"--group-id", mavenCoordinates.group_id,
|
|
166
|
+
"--project-version", mavenCoordinates.project_version,
|
|
167
|
+
"--parent-group-id", mavenCoordinates.parent.group_id,
|
|
168
|
+
"--parent-artifact-id", mavenCoordinates.parent.artifact_id,
|
|
169
|
+
"--parent-version", mavenCoordinates.parent.version,
|
|
170
|
+
"--yss-components-version", mavenCoordinates.yss_components_version
|
|
171
|
+
]);
|
|
172
|
+
assert.equal(result.code, 0, result.stderr);
|
|
173
|
+
|
|
174
|
+
const project = path.join(data.output, "demo-service");
|
|
175
|
+
const pomFiles = [
|
|
176
|
+
"pom.xml",
|
|
177
|
+
"demo-service-domain/pom.xml",
|
|
178
|
+
"demo-service-application/pom.xml",
|
|
179
|
+
"demo-service-infrastructure/pom.xml",
|
|
180
|
+
"demo-service-adapter/pom.xml",
|
|
181
|
+
"demo-service-adapter/demo-service-web/pom.xml",
|
|
182
|
+
"demo-service-bootstrap/pom.xml"
|
|
183
|
+
];
|
|
184
|
+
const poms = await Promise.all(pomFiles.map((file) => readFile(path.join(project, file), "utf8")));
|
|
185
|
+
assert.ok(poms.every((pom) => pom.includes(mavenCoordinates.group_id)), "全部项目内坐标必须使用合同 groupId");
|
|
186
|
+
assert.ok(poms.every((pom) => pom.includes(mavenCoordinates.project_version)), "全部项目内坐标必须使用合同版本");
|
|
187
|
+
const manifest = JSON.parse(await readFile(path.join(project, ".yss/scaffold-generation.json"), "utf8"));
|
|
188
|
+
assert.deepEqual(manifest.maven_coordinates, mavenCoordinates);
|
|
189
|
+
assert.equal(manifest.maven_coordinates_source, "approved-contract");
|
|
190
|
+
|
|
191
|
+
});
|
|
192
|
+
|
|
193
|
+
test("生成工程声明命名仓库 profile、target DDD 依赖边界和构建门禁", async (t) => {
|
|
194
|
+
const data = await fixture();
|
|
195
|
+
t.after(() => rm(data.root, { recursive: true, force: true }));
|
|
196
|
+
const result = await command(data.args);
|
|
197
|
+
assert.equal(result.code, 0, result.stderr);
|
|
198
|
+
const project = path.join(data.output, "demo-service");
|
|
199
|
+
const mavenConfig = await readFile(path.join(project, ".mvn/maven.config"), "utf8");
|
|
200
|
+
const settings = await readFile(path.join(project, ".mvn/settings.xml"), "utf8");
|
|
201
|
+
assert.match(mavenConfig, /-s \.mvn\/settings\.xml/);
|
|
202
|
+
assert.match(mavenConfig, /-P yss-internal/);
|
|
203
|
+
assert.doesNotMatch(settings, /192\.168\.|<activeProfile>aliyun-only<\/activeProfile>/);
|
|
204
|
+
assert.match(settings, /\$\{env\.YSS_MAVEN_REPOSITORY_URL\}/);
|
|
205
|
+
assert.match(settings, /\$\{env\.MAVEN_REPO_USERNAME\}/);
|
|
206
|
+
assert.match(settings, /\$\{env\.MAVEN_REPO_PASSWORD\}/);
|
|
207
|
+
|
|
208
|
+
const domainPom = await readFile(path.join(project, "demo-service-domain/pom.xml"), "utf8");
|
|
209
|
+
const infrastructurePom = await readFile(path.join(project, "demo-service-infrastructure/pom.xml"), "utf8");
|
|
210
|
+
const bootstrapPom = await readFile(path.join(project, "demo-service-bootstrap/pom.xml"), "utf8");
|
|
211
|
+
assert.doesNotMatch(domainPom, /yss-component-(?:dto|exception)|jackson-databind|swagger-annotations|validation-api/);
|
|
212
|
+
assert.match(infrastructurePom, /yss-component-mybatis-plus-starter/);
|
|
213
|
+
assert.match(infrastructurePom, /spring-boot-starter-jdbc/);
|
|
214
|
+
assert.match(bootstrapPom, /spring-boot-starter-actuator/);
|
|
215
|
+
assert.match(bootstrapPom, /spring-boot-starter-test/);
|
|
216
|
+
const webPom = await readFile(path.join(project, "demo-service-adapter", "demo-service-web", "pom.xml"), "utf8");
|
|
217
|
+
assert.match(webPom, /yss-component-dto/);
|
|
218
|
+
assert.match(webPom, /yss-component-exception/);
|
|
219
|
+
assert.match(webPom, /io\.swagger\.core\.v3/);
|
|
220
|
+
const parentPom = await readFile(path.join(project, "pom.xml"), "utf8");
|
|
221
|
+
assert.match(parentPom, /lombok-mapstruct-binding/);
|
|
222
|
+
assert.match(parentPom, /maven-enforcer-plugin/);
|
|
223
|
+
assert.match(parentPom, /maven-compiler-plugin/);
|
|
224
|
+
assert.match(parentPom, /archunit-junit5/);
|
|
225
|
+
});
|
|
226
|
+
|
|
227
|
+
test("生成工程固定平台 profile、Wrapper checksum,并把调试日志隔离到 local 配置", async (t) => {
|
|
228
|
+
const data = await fixture();
|
|
229
|
+
t.after(() => rm(data.root, { recursive: true, force: true }));
|
|
230
|
+
const result = await command(data.args);
|
|
231
|
+
assert.equal(result.code, 0, result.stderr);
|
|
232
|
+
const project = path.join(data.output, "demo-service");
|
|
233
|
+
const wrapper = await readFile(path.join(project, ".mvn", "wrapper", "maven-wrapper.properties"), "utf8");
|
|
234
|
+
assert.match(wrapper, /^wrapperSha256Sum=[a-f0-9]{64}$/m);
|
|
235
|
+
assert.match(wrapper, /^distributionSha256Sum=[a-f0-9]{64}$/m);
|
|
236
|
+
const application = await readFile(path.join(project, "demo-service-bootstrap", "src", "main", "resources", "application.yml"), "utf8");
|
|
237
|
+
assert.doesNotMatch(application, /StdOutImpl|DEBUG/);
|
|
238
|
+
const local = await readFile(path.join(project, "demo-service-bootstrap", "src", "main", "resources", "application-local.yml"), "utf8");
|
|
239
|
+
assert.match(local, /StdOutImpl/);
|
|
240
|
+
assert.match(local, /DEBUG/);
|
|
241
|
+
});
|
|
242
|
+
|
|
243
|
+
test("initialize-only 在写文件前拒绝任何已存在目标和 --force", async (t) => { const data = await fixture(); t.after(() => rm(data.root, { recursive: true, force: true })); const rejected = await command(data.args.map((value) => value === data.contractFile ? path.join(data.root, "missing.json") : value)); assert.equal(rejected.code, 1); assert.match(rejected.stderr, /合同/); await mkdir(path.join(data.output, "demo-service")); await writeFile(path.join(data.output, "demo-service", "keep.txt"), "keep"); const noForce = await command(data.args); assert.equal(noForce.code, 1); assert.match(noForce.stderr, /initialize-only/); const forced = await command([...data.args, "--force"]); assert.equal(forced.code, 1); assert.match(forced.stderr, /initialize-only/); assert.equal(await readFile(path.join(data.output, "demo-service", "keep.txt"), "utf8"), "keep"); });
|
|
244
|
+
|
|
245
|
+
test("拒绝基础包名与批准合同不一致", async (t) => {
|
|
246
|
+
const data = await fixture({ base_package: "com.example.approved" });
|
|
247
|
+
t.after(() => rm(data.root, { recursive: true, force: true }));
|
|
248
|
+
const result = await command(data.args);
|
|
249
|
+
assert.equal(result.code, 1);
|
|
250
|
+
assert.match(result.stderr, /--base-package 与脚手架合同不一致/);
|
|
251
|
+
});
|
|
252
|
+
|
|
253
|
+
test("合同 project_name、profile 和 allowed_write_paths 必须约束实际输出", async (t) => {
|
|
254
|
+
const wrongName = await fixture({ project_name: "other-service" });
|
|
255
|
+
t.after(() => rm(wrongName.root, { recursive: true, force: true }));
|
|
256
|
+
const nameResult = await command(wrongName.args);
|
|
257
|
+
assert.equal(nameResult.code, 1);
|
|
258
|
+
assert.match(nameResult.stderr, /--project-name 与脚手架合同不一致/);
|
|
259
|
+
|
|
260
|
+
const wrongProfile = await fixture({ profiles: { ...contract("unused").profiles, persistence: "mybatis" } });
|
|
261
|
+
t.after(() => rm(wrongProfile.root, { recursive: true, force: true }));
|
|
262
|
+
const profileResult = await command(wrongProfile.args);
|
|
263
|
+
assert.equal(profileResult.code, 1);
|
|
264
|
+
assert.match(profileResult.stderr, /unsupported persistence profile/);
|
|
265
|
+
|
|
266
|
+
const wrongPath = await fixture({ allowed_write_paths: ["another-service"], work_unit: { ...contract("unused").work_unit, allowed_write_paths: ["another-service"] } });
|
|
267
|
+
t.after(() => rm(wrongPath.root, { recursive: true, force: true }));
|
|
268
|
+
const pathResult = await command(wrongPath.args);
|
|
269
|
+
assert.equal(pathResult.code, 1);
|
|
270
|
+
assert.match(pathResult.stderr, /allowed_write_paths/);
|
|
271
|
+
});
|
|
272
|
+
|
|
273
|
+
test("initialize-only 拒绝以 --force 覆盖 .gitmodules 登记的挂载点", async (t) => {
|
|
28
274
|
const data = await fixture();
|
|
29
275
|
t.after(() => rm(data.root, { recursive: true, force: true }));
|
|
30
276
|
const superproject = path.join(data.root, "harness");
|
|
@@ -33,9 +279,9 @@ test("拒绝覆盖 .gitmodules 登记的 git-submodule 挂载点", async (t) =>
|
|
|
33
279
|
await writeFile(path.join(superproject, ".gitmodules"), "[submodule \"demo-service\"]\n\tpath = apps/backend/demo-service\n\turl = https://example.invalid/demo-service.git\n");
|
|
34
280
|
const contractFile = path.join(data.root, "gitlink-contract.json");
|
|
35
281
|
await writeFile(contractFile, `${JSON.stringify(contract(output), null, 2)}\n`);
|
|
36
|
-
const result = await command(["--project-name", "demo-service", "--base-package", "com.yss.demo", "--output-dir", output, "--database", "mysql", "--contract-id", "scaffold-1", "--contract-version", "1", "--approval-ref", "approval-1", "--router-draft-ref", "router-1", "--persisted-ref", "persisted-1", "--contract-file", contractFile, "--force"
|
|
282
|
+
const result = await command(["--project-name", "demo-service", "--base-package", "com.yss.demo", "--output-dir", output, "--database", "mysql", "--contract-id", "scaffold-1", "--contract-version", "1", "--approval-ref", "approval-1", "--router-draft-ref", "router-1", "--persisted-ref", "persisted-1", "--contract-file", contractFile, "--force"]);
|
|
37
283
|
assert.equal(result.code, 1, result.stderr);
|
|
38
|
-
assert.match(`${result.stdout}\n${result.stderr}`, /gitlink 不得由脚手架覆盖/);
|
|
284
|
+
assert.match(`${result.stdout}\n${result.stderr}`, /initialize-only|gitlink 不得由脚手架覆盖/);
|
|
39
285
|
});
|
|
40
286
|
|
|
41
287
|
test("拒绝在 detached HEAD 子仓工作树内当成普通目录生成", async (t) => {
|
|
@@ -63,16 +309,93 @@ test("--force 覆盖真实 gitlink 不得走普通目录覆盖路径", async (t)
|
|
|
63
309
|
const output = path.join(empty.superproject, "apps/backend");
|
|
64
310
|
const contractFile = path.join(data.root, "empty-gitlink-contract.json");
|
|
65
311
|
await writeFile(contractFile, `${JSON.stringify(contract(output), null, 2)}\n`);
|
|
66
|
-
const result = await command(["--project-name", "billing-service", "--base-package", "com.yss.demo", "--output-dir", output, "--database", "mysql", "--contract-id", "scaffold-1", "--contract-version", "1", "--approval-ref", "approval-1", "--router-draft-ref", "router-1", "--persisted-ref", "persisted-1", "--contract-file", contractFile, "--force"
|
|
312
|
+
const result = await command(["--project-name", "billing-service", "--base-package", "com.yss.demo", "--output-dir", output, "--database", "mysql", "--contract-id", "scaffold-1", "--contract-version", "1", "--approval-ref", "approval-1", "--router-draft-ref", "router-1", "--persisted-ref", "persisted-1", "--contract-file", contractFile, "--force"]);
|
|
67
313
|
const text = `${result.stdout}\n${result.stderr}`;
|
|
68
314
|
assert.equal(result.code, 1, text);
|
|
69
315
|
assert.doesNotMatch(text, /请显式传入 --force/);
|
|
70
|
-
assert.match(text,
|
|
316
|
+
assert.match(text, /initialize-only|--force 不得把 git-submodule 挂载点当成普通目录覆盖|gitlink 不得/);
|
|
71
317
|
assert.equal(existsSync(path.join(output, "billing-service", "pom.xml")), false);
|
|
72
318
|
assert.equal((await readdir(output)).some((name) => name.includes("backup")), false);
|
|
73
319
|
assert.equal(gitLsFilesStage(empty.superproject, empty.mount)?.mode, GITLINK_MODE);
|
|
74
320
|
});
|
|
75
321
|
|
|
76
|
-
test("验证器记录三条 wrapper 命令的成功和失败证据", async (t) => { const root = await mkdtemp(path.join(os.tmpdir(), "yss-scaffold-verifier-")); t.after(() => rm(root, { recursive: true, force: true })); const project = path.join(root, "project"); await
|
|
322
|
+
test("验证器记录三条 wrapper 命令的成功和失败证据", async (t) => { const root = await mkdtemp(path.join(os.tmpdir(), "yss-scaffold-verifier-")); t.after(() => rm(root, { recursive: true, force: true })); const project = path.join(root, "project"); await prepareVerifierProject(project); const wrapper = path.join(project, "mvnw"); await writeFile(wrapper, "#!/bin/sh\n[ \"$1\" = test ] && exit 2\nprintf 'ran %s\\n' \"$1\"\n"); await chmod(wrapper, 0o755); const evidence = path.join(root, "evidence"); const report = await run(project, evidence, controlledEnvironment); assert.equal(report.status, "failed"); assert.equal(report.failure_category, "test-failure"); assert.equal(report.commands[1].failure_category, "test-failure"); assert.equal(report.preflight.wrapper_executable, true); assert.deepEqual(report.commands.map((item) => item.exit_code), [0, 2, 0]); assert.match(await readFile(path.join(evidence, "mvnw-test.stderr.log"), "utf8"), /^$/); });
|
|
77
323
|
|
|
78
|
-
test("
|
|
324
|
+
test("验证器把内部仓库解析失败与编译失败分开报告", async (t) => {
|
|
325
|
+
const root = await mkdtemp(path.join(os.tmpdir(), "yss-scaffold-repository-failure-"));
|
|
326
|
+
t.after(() => rm(root, { recursive: true, force: true }));
|
|
327
|
+
const project = path.join(root, "project");
|
|
328
|
+
await prepareVerifierProject(project);
|
|
329
|
+
const wrapper = path.join(project, "mvnw");
|
|
330
|
+
await writeFile(wrapper, "#!/bin/sh\nprintf 'Non-resolvable parent POM: Could not transfer artifact\\n'\nexit 1\n");
|
|
331
|
+
await chmod(wrapper, 0o755);
|
|
332
|
+
const report = await run(project, path.join(root, "evidence"), controlledEnvironment);
|
|
333
|
+
assert.equal(report.status, "failed");
|
|
334
|
+
assert.equal(report.failure_category, "repository-access");
|
|
335
|
+
assert.ok(report.commands.every((item) => item.failure_category === "repository-access"));
|
|
336
|
+
assert.equal(typeof report.preflight.maven_repository_credentials_configured, "boolean");
|
|
337
|
+
});
|
|
338
|
+
|
|
339
|
+
test("验证器单独标记 Java 编译失败和 Bootstrap 主类缺失", async (t) => {
|
|
340
|
+
const cases = [
|
|
341
|
+
{ output: "[ERROR] COMPILATION ERROR", expected: "compilation" },
|
|
342
|
+
{ output: "Unable to find main class", expected: "bootstrap-entrypoint" }
|
|
343
|
+
];
|
|
344
|
+
for (const item of cases) {
|
|
345
|
+
const root = await mkdtemp(path.join(os.tmpdir(), "yss-scaffold-build-failure-"));
|
|
346
|
+
t.after(() => rm(root, { recursive: true, force: true }));
|
|
347
|
+
const project = path.join(root, "project");
|
|
348
|
+
await prepareVerifierProject(project);
|
|
349
|
+
const wrapper = path.join(project, "mvnw");
|
|
350
|
+
await writeFile(wrapper, `#!/bin/sh\n[ "$1" = package ] || exit 0\nprintf '%s\\n' '${item.output}' >&2\nexit 1\n`);
|
|
351
|
+
await chmod(wrapper, 0o755);
|
|
352
|
+
const report = await run(project, path.join(root, "evidence"), controlledEnvironment);
|
|
353
|
+
assert.equal(report.failure_category, item.expected);
|
|
354
|
+
assert.equal(report.commands[2].failure_category, item.expected);
|
|
355
|
+
}
|
|
356
|
+
});
|
|
357
|
+
|
|
358
|
+
test("验证器在全部 Maven 命令成功时通过并保留日志引用", async (t) => { const root = await mkdtemp(path.join(os.tmpdir(), "yss-scaffold-verifier-success-")); t.after(() => rm(root, { recursive: true, force: true })); const project = path.join(root, "project"); await prepareVerifierProject(project); const wrapper = path.join(project, "mvnw"); await writeFile(wrapper, "#!/bin/sh\nprintf 'ran %s\\n' \"$1\"\n"); await chmod(wrapper, 0o755); const report = await run(project, path.join(root, "evidence"), controlledEnvironment); assert.equal(report.status, "passed"); assert.ok(report.commands.every((item) => item.exit_code === 0 && item.stdout_ref.endsWith(".stdout.log"))); });
|
|
359
|
+
|
|
360
|
+
test("Manifest v2 在缺少受控仓库环境时先于 Maven 执行阻断", async (t) => {
|
|
361
|
+
const root = await mkdtemp(path.join(os.tmpdir(), "yss-scaffold-v2-preflight-"));
|
|
362
|
+
t.after(() => rm(root, { recursive: true, force: true }));
|
|
363
|
+
const project = path.join(root, "project");
|
|
364
|
+
await prepareVerifierProject(project);
|
|
365
|
+
const wrapper = path.join(project, "mvnw");
|
|
366
|
+
await writeFile(wrapper, "#!/bin/sh\nprintf 'must not run'\nexit 99\n");
|
|
367
|
+
await chmod(wrapper, 0o755);
|
|
368
|
+
const report = await run(project, path.join(root, "evidence"), { ...process.env, YSS_MAVEN_REPOSITORY_URL: "", MAVEN_REPO_USERNAME: "", MAVEN_REPO_PASSWORD: "" });
|
|
369
|
+
assert.equal(report.status, "failed");
|
|
370
|
+
assert.equal(report.failure_category, "verification-preflight");
|
|
371
|
+
assert.deepEqual(report.commands, []);
|
|
372
|
+
assert.ok(report.preflight.failures.includes("repository-url-not-configured"));
|
|
373
|
+
});
|
|
374
|
+
|
|
375
|
+
test("Manifest schema v1 is unsupported and verifier never executes its wrapper", async (t) => {
|
|
376
|
+
const root = await mkdtemp(path.join(os.tmpdir(), "yss-scaffold-v1-unsupported-"));
|
|
377
|
+
t.after(() => rm(root, { recursive: true, force: true }));
|
|
378
|
+
const project = path.join(root, "project");
|
|
379
|
+
await prepareVerifierProject(project, { schema_version: 1, contract_id: "legacy", contract_version: 1 });
|
|
380
|
+
const wrapper = path.join(project, "mvnw");
|
|
381
|
+
await writeFile(wrapper, "#!/bin/sh\nprintf 'must not run' > wrapper-ran\n");
|
|
382
|
+
await chmod(wrapper, 0o755);
|
|
383
|
+
await assert.rejects(() => run(project, path.join(root, "evidence"), controlledEnvironment), /unsupported: scaffold Manifest schema_version=1/);
|
|
384
|
+
assert.equal(existsSync(path.join(project, "wrapper-ran")), false);
|
|
385
|
+
});
|
|
386
|
+
|
|
387
|
+
test("验证日志会脱敏 Maven 仓库凭据", async (t) => {
|
|
388
|
+
const root = await mkdtemp(path.join(os.tmpdir(), "yss-scaffold-redaction-"));
|
|
389
|
+
t.after(() => rm(root, { recursive: true, force: true }));
|
|
390
|
+
const project = path.join(root, "project");
|
|
391
|
+
await prepareVerifierProject(project);
|
|
392
|
+
const wrapper = path.join(project, "mvnw");
|
|
393
|
+
await writeFile(wrapper, "#!/bin/sh\nprintf '%s %s\\n' \"$MAVEN_REPO_USERNAME\" \"$MAVEN_REPO_PASSWORD\"\n");
|
|
394
|
+
await chmod(wrapper, 0o755);
|
|
395
|
+
const sensitiveEnvironment = { ...controlledEnvironment, MAVEN_REPO_USERNAME: "sensitive-user", MAVEN_REPO_PASSWORD: "sensitive-password" };
|
|
396
|
+
const evidence = path.join(root, "evidence");
|
|
397
|
+
await run(project, evidence, sensitiveEnvironment);
|
|
398
|
+
const log = await readFile(path.join(evidence, "mvnw-validate.stdout.log"), "utf8");
|
|
399
|
+
assert.doesNotMatch(log, /sensitive-user|sensitive-password/);
|
|
400
|
+
assert.match(log, /\[REDACTED:MAVEN_REPO_USERNAME\].*\[REDACTED:MAVEN_REPO_PASSWORD\]/);
|
|
401
|
+
});
|
|
@@ -25,7 +25,7 @@ description: Use when YSS 产品设计系统与 Ant Design 企业级 UI 风格
|
|
|
25
25
|
2. 读取已有资产:`docs/design/design.md`、相关 Spec、交互说明、状态矩阵、OpenAPI Draft、现有页面代码。
|
|
26
26
|
3. 按设计系统基线约束输出或修改产物:颜色、排版、间距、圆角、动效、组件、状态、响应式。
|
|
27
27
|
4. 若是产品设计阶段,先使用 `yss-prototype-stage`;Codex 以 `product-design:index` 为主入口,其他 Agent 必须交付等价合同资产和证据。
|
|
28
|
-
5. 若是前端实现阶段,配合 `yss-ui`、`yss-components`、`yss-formily
|
|
28
|
+
5. 若是前端实现阶段,配合 `yss-ui`、`yss-ui-business-page-generation`、`yss-components`、`yss-formily`;生命周期编排和旧触发词兼容再使用 `yss-page-module-development`,但本技能负责风格与体验一致性门禁。
|
|
29
29
|
6. 若发现现有设计系统文档不足,先更新 `docs/design/design.md`,再让实现或评审引用该文档。
|
|
30
30
|
|
|
31
31
|
## 核心基线
|
|
@@ -85,7 +85,7 @@ description: Use when YSS 产品设计系统与 Ant Design 企业级 UI 风格
|
|
|
85
85
|
| 低保真原型进入高保真前评审 | `prototype-review` |
|
|
86
86
|
| 低保真评审通过后的高保真 HTML 原型 | `yss-prototype-stage`;`high-fidelity-html-prototype` 仅兼容入口 |
|
|
87
87
|
| 低保真线框或流程图 | `product-design:index` |
|
|
88
|
-
| 前端页面实现 | `yss-ui` / `yss-page-module-development` |
|
|
88
|
+
| 前端页面实现 | `yss-ui` / `yss-ui-business-page-generation`;生命周期兼容使用 `yss-page-module-development` |
|
|
89
89
|
| 表单 schema | `yss-formily` |
|
|
90
90
|
| YTable / YTree / 高度自适应 | `yss-components` / `yss-use-table-height` / `yss-use-tree-height` |
|
|
91
91
|
| 原型阶段的 Ant Design v6 组件 / token / demo 查询 | `yss-antd-design`(只用于原型设计构建;前端落地改用 `yss-ui`) |
|
|
@@ -214,8 +214,8 @@ React + Ant Design:
|
|
|
214
214
|
|
|
215
215
|
YSS UI / Vue:
|
|
216
216
|
|
|
217
|
-
- 业务页面优先走 `yss-ui` 和 `yss-page-module-development`。
|
|
218
|
-
-
|
|
217
|
+
- 业务页面优先走 `yss-ui` 和 `yss-ui-business-page-generation`;生命周期编排和旧触发词兼容使用 `yss-page-module-development`。
|
|
218
|
+
- 新业务表单使用 `YFormily` schema;`YssFormily` 仅用于历史兼容。
|
|
219
219
|
- 表格使用 `YTable`,列定义使用项目约定字段。
|
|
220
220
|
- 高度自适应使用 `useTableHeight` / `useTreeHeight`。
|
|
221
221
|
- 请求、分页、筛选参数下沉到 Hook。
|
|
@@ -7,7 +7,7 @@ description: 用于构建或重构 YSS 领域层代码。当用户要求设计
|
|
|
7
7
|
|
|
8
8
|
这是一个领域实现 skill。核心目标是消费已批准的战术模型,将领域行为落实为代码;战术模型的设计与批准由 `yss-tactical-design` 和 `yss-product-lifecycle` 负责。
|
|
9
9
|
|
|
10
|
-
|
|
10
|
+
本 skill 在新脚手架链路只支持 `target-domain-model`。`core/client/repository`、贫血对象和 VO 型 Gateway 对该链路均为 `unsupported`,不提供旧架构分支。
|
|
11
11
|
|
|
12
12
|
## 何时使用
|
|
13
13
|
|
|
@@ -41,13 +41,14 @@ description: 用于构建或重构 YSS 领域层代码。当用户要求设计
|
|
|
41
41
|
- Gateway 只暴露领域能力,不暴露持久化细节。
|
|
42
42
|
- 对关键状态流转给出明确方法,如 `publish()`、`cancel()`、`terminate()`。
|
|
43
43
|
- 明确 Aggregate Root、Entity identity、Value Object、不变量、Domain Event 和一致性边界;没有业务行为时不要伪造富领域模型。
|
|
44
|
-
-
|
|
44
|
+
- 发现旧架构时停止套用新脚手架合同并返回 `unsupported`;旧项目继续按原工程维护,现代化改造单独立项。
|
|
45
45
|
|
|
46
46
|
## 质量要求
|
|
47
47
|
|
|
48
48
|
- 命名体现业务语义,不照抄表名缩写。
|
|
49
49
|
- 生成代码应可编译,且没有跨层依赖泄漏。
|
|
50
|
-
-
|
|
50
|
+
- Domain Gateway interface 由本 skill 唯一拥有;Infrastructure 只能实现,不得由 `yss-repository` 反向创建或改写其签名。
|
|
51
|
+
- 对不确定规则返回 `new_impacts` / `drift` 并暂停;不要把未批准假设或 TODO 写进实现冒充已确认事实。
|
|
51
52
|
|
|
52
53
|
## 协同顺序
|
|
53
54
|
|
|
@@ -58,7 +59,7 @@ description: 用于构建或重构 YSS 领域层代码。当用户要求设计
|
|
|
58
59
|
|
|
59
60
|
## 分层开发规范
|
|
60
61
|
|
|
61
|
-
脚手架生成或进入 Domain 实现前,必须加载 `references/domain-layer-guide.md`:其中定义
|
|
62
|
+
脚手架生成或进入 Domain 实现前,必须加载 `references/domain-layer-guide.md`:其中定义 Aggregate、Domain Gateway、Domain Error、依赖门禁与旧架构 `unsupported` 边界;HTTP DTO/VO 明确不属于 Domain。
|
|
62
63
|
|
|
63
64
|
## 阶段 7 合同
|
|
64
65
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
version: 1
|
|
2
2
|
interface:
|
|
3
3
|
display_name: "YSS Domain"
|
|
4
|
-
short_description: "
|
|
5
|
-
default_prompt: "Use $yss-domain to
|
|
4
|
+
short_description: "按批准战术模型实现聚合、规则与 Domain Gateway 接口"
|
|
5
|
+
default_prompt: "Use $yss-domain to implement approved aggregates, entities, business rules, domain tests, and the sole Domain Gateway interfaces; reroute instead of inventing unresolved rules."
|