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
|
@@ -1,21 +1,29 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import {
|
|
2
|
+
import { createHash } from "node:crypto";
|
|
3
|
+
import { constants, access, copyFile, mkdir, mkdtemp, readFile, rm, unlink, writeFile } from "node:fs/promises";
|
|
4
|
+
import { tmpdir } from "node:os";
|
|
3
5
|
import path from "node:path";
|
|
4
6
|
import { fileURLToPath } from "node:url";
|
|
5
7
|
|
|
8
|
+
import { parseDocument } from "../../../../scripts/vendor/yaml.mjs";
|
|
9
|
+
|
|
6
10
|
const TYPE_MAPPING = { bigint: "Long", int: "Integer", integer: "Integer", smallint: "Integer", tinyint: "Integer", number: "Long", numeric: "BigDecimal", decimal: "BigDecimal", float: "Float", double: "Double", real: "Float", varchar: "String", varchar2: "String", nvarchar2: "String", char: "String", nchar: "String", text: "String", clob: "String", nclob: "String", date: "LocalDateTime", datetime: "LocalDateTime", timestamp: "LocalDateTime", "timestamp with time zone": "LocalDateTime", boolean: "Boolean", bool: "Boolean", bit: "Boolean", json: "String", jsonb: "String", uuid: "String" };
|
|
7
|
-
const
|
|
8
|
-
|
|
11
|
+
const PLATFORM_VALIDATION_NAMESPACES = {
|
|
12
|
+
"spring-boot-2.7-jdk8": "javax",
|
|
13
|
+
"spring-boot-3-jdk17": "jakarta"
|
|
14
|
+
};
|
|
15
|
+
const required = ["metadata-file", "contract-file", "dto-wire-profile-file", "base-package", "module-name", "domain-segment"];
|
|
16
|
+
const valued = new Set([...required, "output-dir", "web-project-dir", "web-output-dir", "author", "application-service-package", "validation-namespace", "scaffold-manifest-file"]);
|
|
9
17
|
|
|
10
18
|
function usage() {
|
|
11
|
-
return "Usage: node generate_controller.mjs --metadata-file FILE --base-package PACKAGE --module-name NAME --domain-segment SEGMENT [--output-dir DIR] [--
|
|
19
|
+
return "Usage: node generate_controller.mjs --metadata-file FILE --contract-file FILE --dto-wire-profile-file FILE --base-package PACKAGE --module-name NAME --domain-segment SEGMENT [--output-dir DIR] [--web-project-dir DIR] [--web-output-dir DIR] [--scaffold-manifest-file FILE] [--author NAME] [--application-service-package PACKAGE] [--validation-namespace javax|jakarta]";
|
|
12
20
|
}
|
|
13
21
|
export function parseArgs(argv) {
|
|
14
22
|
const args = { "output-dir": "./output", author: "System", "validation-namespace": "javax", force: false };
|
|
15
23
|
for (let index = 0; index < argv.length; index += 1) {
|
|
16
24
|
const token = argv[index];
|
|
17
25
|
if (token === "--help" || token === "-h") return { help: true };
|
|
18
|
-
if (token === "--force")
|
|
26
|
+
if (token === "--force") throw new Error("unsupported: initialize-only Web 生成禁止 --force、已有目标覆盖和旧项目迁移");
|
|
19
27
|
if (!token.startsWith("--") || !valued.has(token.slice(2))) throw new Error(`unrecognized argument: ${token}`);
|
|
20
28
|
const value = argv[++index];
|
|
21
29
|
if (!value || value.startsWith("--")) throw new Error(`argument ${token} requires a value`);
|
|
@@ -32,9 +40,11 @@ const packagePath = (value) => value.replaceAll(".", path.sep);
|
|
|
32
40
|
const ensureSubdir = (root, name) => path.basename(path.normalize(root)) === name ? root : path.join(root, name);
|
|
33
41
|
const javaType = (sqlType = "") => TYPE_MAPPING[sqlType.toLowerCase().split("(")[0]] || "String";
|
|
34
42
|
|
|
35
|
-
function fields(columns, {
|
|
36
|
-
const
|
|
37
|
-
return
|
|
43
|
+
function fields(columns, selected, { command = false } = {}) {
|
|
44
|
+
const byName = new Map(columns.map((column) => [String(column.name), column]));
|
|
45
|
+
return selected.map((field) => {
|
|
46
|
+
const column = byName.get(field);
|
|
47
|
+
if (!column) throw new Error(`approved field is absent from metadata: ${field}`);
|
|
38
48
|
const type = javaType(column.sql_type);
|
|
39
49
|
const name = lowerCamel(column.name);
|
|
40
50
|
const comment = column.comment || "";
|
|
@@ -45,33 +55,172 @@ function fields(columns, { skipPk = false, command = false, skipAudit = true } =
|
|
|
45
55
|
}
|
|
46
56
|
function render(template, context) { return template.replace(/\$(?:\{([A-Za-z_][A-Za-z0-9_]*)\}|([A-Za-z_][A-Za-z0-9_]*))/g, (_, braced, plain) => { const key = braced || plain; if (!(key in context)) throw new Error(`missing template field: ${key}`); return context[key]; }); }
|
|
47
57
|
async function exists(target) { try { await access(target); return true; } catch { return false; } }
|
|
58
|
+
const present = (value) => value !== undefined && value !== null && value !== "";
|
|
59
|
+
function within(root, target) {
|
|
60
|
+
const relative = path.relative(path.resolve(root), path.resolve(target));
|
|
61
|
+
return relative === "" || (!relative.startsWith("..") && !path.isAbsolute(relative));
|
|
62
|
+
}
|
|
63
|
+
function simpleJavaName(javaType) {
|
|
64
|
+
return javaType.replace(/<.*$/, "").split(".").at(-1);
|
|
65
|
+
}
|
|
66
|
+
function paginationFields(selected, dtoProfile) {
|
|
67
|
+
const definitions = dtoProfile.page_query.fields;
|
|
68
|
+
const unique = [...new Set(selected)];
|
|
69
|
+
const unsupported = unique.filter((name) => !(name in definitions) || dtoProfile.page_query.forbidden_client_fields.includes(name));
|
|
70
|
+
if (unsupported.length) throw new Error(`unsupported pagination fields: ${unsupported.join(", ")}`);
|
|
71
|
+
return unique.map((name) => {
|
|
72
|
+
const definition = definitions[name];
|
|
73
|
+
const wireType = definition.wire_types.find((item) => item !== "null");
|
|
74
|
+
const javaType = wireType === "integer" ? (definition.nullable ? "Integer" : "int") : wireType === "string" ? "String" : null;
|
|
75
|
+
if (!javaType) throw new Error(`unsupported yss-dto pagination wire type for ${name}: ${definition.wire_types.join(", ")}`);
|
|
76
|
+
const annotation = definition.enum?.length
|
|
77
|
+
? ` @Pattern(regexp = "${definition.enum.join("|")}", message = "${name} must be one of ${definition.enum.join(", ")}")\n`
|
|
78
|
+
: "";
|
|
79
|
+
const initializer = definition.default === undefined ? "" : ` = ${typeof definition.default === "string" ? JSON.stringify(definition.default) : definition.default}`;
|
|
80
|
+
return `${annotation} private ${javaType} ${name}${initializer};`;
|
|
81
|
+
}).join("\n");
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
async function loadDtoWireProfile(contract, args) {
|
|
85
|
+
const profilePath = path.resolve(args["dto-wire-profile-file"]);
|
|
86
|
+
if (profilePath !== path.resolve(contract.dto_wire_profile_ref ?? "")) throw new Error("--dto-wire-profile-file does not match the approved Web generation contract");
|
|
87
|
+
if (!await exists(profilePath)) throw new Error(`yss-dto wire profile not found: ${profilePath}`);
|
|
88
|
+
const source = await readFile(profilePath);
|
|
89
|
+
const digest = createHash("sha256").update(source).digest("hex");
|
|
90
|
+
if (digest !== contract.dto_wire_profile_digest) throw new Error("yss-dto wire profile digest does not match the approved Web generation contract");
|
|
91
|
+
const document = parseDocument(source.toString("utf8"), { maxAliasCount: 0, uniqueKeys: true });
|
|
92
|
+
if (document.errors.length) throw new Error(`invalid yss-dto wire profile: ${document.errors[0].message}`);
|
|
93
|
+
const profile = document.toJS({ maxAliasCount: 0 });
|
|
94
|
+
if (profile?.schema_version !== 1 || profile?.kind !== "yss-dto-openapi-wire-profile") throw new Error("unsupported yss-dto wire profile");
|
|
95
|
+
const resultPackage = profile.canonical?.java_package;
|
|
96
|
+
const pageResult = profile.wrappers?.PageResult;
|
|
97
|
+
const singleResult = profile.wrappers?.SingleResult;
|
|
98
|
+
const commandDtoType = profile.request_bases?.command?.java_type;
|
|
99
|
+
const queryDtoType = profile.request_bases?.query?.java_type;
|
|
100
|
+
if (![resultPackage, pageResult?.java_type, singleResult?.java_type, commandDtoType, queryDtoType].every(present)) throw new Error("incomplete yss-dto wire profile type mapping");
|
|
101
|
+
if (![pageResult.java_type, singleResult.java_type].every((type) => type.startsWith(`${resultPackage}.`))) throw new Error("yss-dto result wrapper package is inconsistent");
|
|
102
|
+
if (!profile.page_query?.fields || !Array.isArray(profile.page_query?.forbidden_client_fields)) throw new Error("incomplete yss-dto page_query mapping");
|
|
103
|
+
const factory = pageResult.java_factory;
|
|
104
|
+
const singleFactory = singleResult.java_factory;
|
|
105
|
+
const javaIdentifier = /^[A-Za-z_$][A-Za-z0-9_$]*$/;
|
|
106
|
+
if (!javaIdentifier.test(factory?.method ?? "") || !Array.isArray(factory.arguments) || !factory.arguments.length) throw new Error("incomplete yss-dto PageResult factory mapping");
|
|
107
|
+
if (!javaIdentifier.test(singleFactory?.method ?? "") || JSON.stringify(singleFactory.arguments) !== JSON.stringify(["data"])) throw new Error("incomplete yss-dto SingleResult factory mapping");
|
|
108
|
+
const expressionByArgument = { data: "toResponses(source.getData())", totalCount: "source.getTotalCount()", pageSize: "source.getPageSize()", pageIndex: "source.getPageIndex()" };
|
|
109
|
+
const unsupportedArguments = factory.arguments.filter((name) => !(name in expressionByArgument));
|
|
110
|
+
if (unsupportedArguments.length) throw new Error(`unsupported yss-dto PageResult factory arguments: ${unsupportedArguments.join(", ")}`);
|
|
111
|
+
return {
|
|
112
|
+
profile,
|
|
113
|
+
resultPackage,
|
|
114
|
+
pageResultType: pageResult.java_type.replace(/<.*$/, ""),
|
|
115
|
+
singleResultType: singleResult.java_type.replace(/<.*$/, ""),
|
|
116
|
+
pageResultFactoryMethod: factory.method,
|
|
117
|
+
singleResultFactoryMethod: singleFactory.method,
|
|
118
|
+
commandDtoType,
|
|
119
|
+
queryDtoType,
|
|
120
|
+
pageResultFactoryArguments: factory.arguments.map((name, index) => ` ${expressionByArgument[name]}${index < factory.arguments.length - 1 ? "," : ""}`).join("\n")
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
async function validateContract(contract, args) {
|
|
125
|
+
if (contract.schema_version !== 2) throw new Error(`web generation contract schema_version=${contract.schema_version} is unsupported; only schema_version=2 is accepted`);
|
|
126
|
+
if (contract.status !== "approved") throw new Error("web generation contract must be approved");
|
|
127
|
+
const requiredFields = ["contract_id", "contract_version", "current_version", "slice_id", "integration_mode", "implementation_project_root", "base_package", "module_name", "domain_segment", "application_service_package", "architecture_profile", "platform_profile", "validation_namespace", "dto_placement", "dto_wire_profile_ref", "dto_wire_profile_digest", "openapi_freeze_ref", "fields", "allowed_write_paths", "expected_evidence_files", "verification_commands"];
|
|
128
|
+
const missing = requiredFields.filter((name) => !present(contract[name]));
|
|
129
|
+
if (missing.length) throw new Error(`approved web generation contract is incomplete: ${missing.join(", ")}`);
|
|
130
|
+
if (contract.current_version !== contract.contract_version) throw new Error("web generation contract is not the current approved version");
|
|
131
|
+
if (!Number.isInteger(contract.contract_version) || contract.contract_version < 1) throw new Error("web generation contract_version must be a positive integer");
|
|
132
|
+
if (!["existing-project", "scaffold-v2"].includes(contract.integration_mode)) throw new Error("unsupported web generation integration_mode");
|
|
133
|
+
if (!["allowed_write_paths", "expected_evidence_files", "verification_commands"].every((name) => Array.isArray(contract[name]) && contract[name].length)) throw new Error("web generation contract requires non-empty allowed_write_paths, expected_evidence_files, and verification_commands");
|
|
134
|
+
if (contract.architecture_profile !== "target-domain-model" || contract.dto_placement !== "web") throw new Error("web generation only supports target-domain-model with dto_placement=web");
|
|
135
|
+
if (contract.base_package !== args["base-package"] || contract.module_name !== args["module-name"] || contract.domain_segment !== args["domain-segment"]) throw new Error("CLI generation identity does not match the approved web generation contract");
|
|
136
|
+
const applicationPackage = args["application-service-package"] || `${args["base-package"]}.application.service`;
|
|
137
|
+
if (contract.application_service_package !== applicationPackage) throw new Error("--application-service-package does not match the approved web generation contract");
|
|
138
|
+
if (!(contract.platform_profile in PLATFORM_VALIDATION_NAMESPACES)) throw new Error("unsupported platform_profile in approved web generation contract");
|
|
139
|
+
if (PLATFORM_VALIDATION_NAMESPACES[contract.platform_profile] !== contract.validation_namespace) throw new Error("platform_profile and validation_namespace are inconsistent");
|
|
140
|
+
if (contract.validation_namespace !== args["validation-namespace"]) throw new Error("--validation-namespace must match the approved web generation contract");
|
|
141
|
+
|
|
142
|
+
const implementationRoot = path.resolve(contract.implementation_project_root);
|
|
143
|
+
if (contract.integration_mode === "existing-project") {
|
|
144
|
+
if (args["scaffold-manifest-file"] || present(contract.scaffold_manifest_ref)) throw new Error("existing-project Web generation must not claim a scaffold manifest");
|
|
145
|
+
return { applicationPackage, implementationRoot };
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
if (!args["scaffold-manifest-file"] || !present(contract.scaffold_manifest_ref)) throw new Error("scaffold-v2 Web generation requires --scaffold-manifest-file and scaffold_manifest_ref");
|
|
149
|
+
const manifestPath = path.resolve(args["scaffold-manifest-file"]);
|
|
150
|
+
if (manifestPath !== path.resolve(contract.scaffold_manifest_ref)) throw new Error("--scaffold-manifest-file does not match the approved web generation contract");
|
|
151
|
+
if (!await exists(manifestPath)) throw new Error(`scaffold manifest not found: ${manifestPath}`);
|
|
152
|
+
const manifest = JSON.parse(await readFile(manifestPath, "utf8"));
|
|
153
|
+
if (manifest.schema_version !== 2) throw new Error("scaffold manifest must use schema_version=2");
|
|
154
|
+
if (!["empty-scaffold-verified", "first-slice-verified"].includes(manifest.completion_level)) throw new Error("scaffold manifest must be empty-scaffold-verified before Web generation");
|
|
155
|
+
const scaffoldRoot = path.dirname(path.dirname(manifestPath));
|
|
156
|
+
if (implementationRoot !== scaffoldRoot) throw new Error("implementation_project_root does not match the scaffold manifest project root");
|
|
157
|
+
const expectedWebProject = path.join(scaffoldRoot, `${manifest.project_name}-adapter`, `${manifest.project_name}-web`);
|
|
158
|
+
if (!args["web-project-dir"] || path.resolve(args["web-project-dir"]) !== expectedWebProject) throw new Error("--web-project-dir does not match the scaffold manifest project layout");
|
|
159
|
+
const profilePairs = [["architecture", "architecture_profile"], ["platform", "platform_profile"], ["validation_namespace", "validation_namespace"], ["dto_placement", "dto_placement"]];
|
|
160
|
+
for (const [manifestField, contractField] of profilePairs) {
|
|
161
|
+
if (manifest.profiles?.[manifestField] !== contract[contractField]) throw new Error(`scaffold manifest ${manifestField} profile does not match the approved Web contract`);
|
|
162
|
+
}
|
|
163
|
+
if (manifest.base_package !== contract.base_package) throw new Error("scaffold manifest base_package does not match the approved Web contract");
|
|
164
|
+
return { applicationPackage, implementationRoot };
|
|
165
|
+
}
|
|
48
166
|
|
|
49
167
|
export async function generate(args, logger = console) {
|
|
50
168
|
if (!await exists(args["metadata-file"])) throw new Error(`Metadata file not found: ${args["metadata-file"]}`);
|
|
169
|
+
if (!await exists(args["contract-file"])) throw new Error(`Contract file not found: ${args["contract-file"]}`);
|
|
51
170
|
let metadata;
|
|
52
171
|
try { metadata = JSON.parse(await readFile(args["metadata-file"], "utf8")); } catch (error) { throw new Error(`Error reading metadata file: ${error.message}`); }
|
|
172
|
+
let contract;
|
|
173
|
+
try { contract = JSON.parse(await readFile(args["contract-file"], "utf8")); } catch (error) { throw new Error(`Error reading contract file: ${error.message}`); }
|
|
174
|
+
const { applicationPackage, implementationRoot } = await validateContract(contract, args);
|
|
175
|
+
const dto = await loadDtoWireProfile(contract, args);
|
|
53
176
|
const tables = metadata.tables || [];
|
|
54
177
|
if (!tables.length) { logger.warn("Warning: No tables found in metadata."); return []; }
|
|
55
178
|
const scriptDir = path.dirname(fileURLToPath(import.meta.url));
|
|
56
179
|
const templatesDir = path.resolve(scriptDir, "../assets/templates");
|
|
57
180
|
const template = async (name) => { const target = path.join(templatesDir, name); if (!await exists(target)) throw new Error(`Template not found: ${target}`); return readFile(target, "utf8"); };
|
|
58
|
-
const
|
|
181
|
+
const templateNames = ["Controller.java.template", "WebConvertor.java.template", "web/dto/Response.java.template", "web/dto/CreateRequest.java.template", "web/dto/UpdateRequest.java.template", "web/dto/PageRequest.java.template"];
|
|
182
|
+
const templates = Object.fromEntries(await Promise.all(templateNames.map(async (name) => [name, await template(name)])));
|
|
59
183
|
const basePath = packagePath(args["base-package"]);
|
|
60
|
-
const domainBase = args["domain-output-dir"] || (args["domain-project-dir"] ? path.join(args["domain-project-dir"], "src", "main", "java", basePath) : path.join(args["output-dir"], basePath));
|
|
61
184
|
const webBase = args["web-output-dir"] || (args["web-project-dir"] ? path.join(args["web-project-dir"], "src", "main", "java", basePath) : path.join(args["output-dir"], basePath));
|
|
62
|
-
const domainRoot = ensureSubdir(domainBase, "client");
|
|
63
185
|
const webRoot = ensureSubdir(webBase, "rest");
|
|
64
|
-
const
|
|
65
|
-
const
|
|
186
|
+
const planned = [];
|
|
187
|
+
const plan = (target, contents) => planned.push({ target, contents });
|
|
66
188
|
for (const table of tables) {
|
|
67
189
|
const domainClass = pascal(table.table_name); const domainVar = lowerCamel(table.table_name); const domainDesc = String(table.table_comment || domainClass).trim().replaceAll("\n", " ");
|
|
68
|
-
const
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
190
|
+
const approvedFields = contract.fields[table.table_name];
|
|
191
|
+
if (!approvedFields || ["create", "update", "query", "pagination", "response"].some((name) => !Array.isArray(approvedFields[name]))) throw new Error(`approved web field contract is missing create/update/query/pagination/response allowlists for table: ${table.table_name}`);
|
|
192
|
+
const context = { base_package: args["base-package"], module_name: args["module-name"], domain_class: domainClass, domain_var: domainVar, domain_desc: domainDesc, domain_url_path: kebab(table.table_name), domain_pkg_name: args["domain-segment"], author: args.author, dto_imports: [`import ${args["base-package"]}.rest.dto.request.${domainClass}CreateRequest;`, `import ${args["base-package"]}.rest.dto.request.${domainClass}UpdateRequest;`, `import ${args["base-package"]}.rest.dto.request.${domainClass}PageRequest;`, `import ${args["base-package"]}.rest.dto.response.${domainClass}Response;`].join("\n"), application_type_imports: [`import ${args["base-package"]}.application.command.${domainClass}CreateCommand;`, `import ${args["base-package"]}.application.command.${domainClass}UpdateCommand;`, `import ${args["base-package"]}.application.query.${domainClass}PageQuery;`, `import ${args["base-package"]}.application.result.${domainClass}Result;`].join("\n"), application_service_import: `import ${applicationPackage}.${domainClass}Service;`, web_convertor_import: `import ${args["base-package"]}.rest.convertor.${domainClass}WebConvertor;`, web_convertor_class: `${domainClass}WebConvertor`, application_service_field: `private final ${domainClass}Service ${domainVar}Service;`, query_call: `${domainVar}Service.page(webConvertor.toPageQuery(request))`, detail_call: `${domainVar}Service.detail(id)`, add_call: `${domainVar}Service.add(webConvertor.toCreateCommand(request))`, update_call: `${domainVar}Service.update(webConvertor.toUpdateCommand(request))`, delete_call: `${domainVar}Service.delete(id)`, response_class: `${domainClass}Response`, create_request_class: `${domainClass}CreateRequest`, update_request_class: `${domainClass}UpdateRequest`, page_request_class: `${domainClass}PageRequest`, validation_namespace: args["validation-namespace"], result_package: dto.resultPackage, page_result_type: dto.pageResultType, page_result_simple_name: simpleJavaName(dto.pageResultType), page_result_factory_method: dto.pageResultFactoryMethod, single_result_type: dto.singleResultType, single_result_simple_name: simpleJavaName(dto.singleResultType), single_result_factory_method: dto.singleResultFactoryMethod, command_dto_type: dto.commandDtoType, command_dto_simple_name: simpleJavaName(dto.commandDtoType), query_dto_type: dto.queryDtoType, query_dto_simple_name: simpleJavaName(dto.queryDtoType), page_result_factory_arguments: dto.pageResultFactoryArguments };
|
|
193
|
+
plan(path.join(webRoot, `${domainClass}Controller.java`), render(templates["Controller.java.template"], context));
|
|
194
|
+
plan(path.join(webRoot, "convertor", `${domainClass}WebConvertor.java`), render(templates["WebConvertor.java.template"], context));
|
|
195
|
+
for (const [templateName, target, declaration] of [["web/dto/Response.java.template", path.join(webRoot, "dto", "response", `${domainClass}Response.java`), fields(table.columns || [], approvedFields.response)], ["web/dto/CreateRequest.java.template", path.join(webRoot, "dto", "request", `${domainClass}CreateRequest.java`), fields(table.columns || [], approvedFields.create, { command: true })], ["web/dto/UpdateRequest.java.template", path.join(webRoot, "dto", "request", `${domainClass}UpdateRequest.java`), fields(table.columns || [], approvedFields.update, { command: true })], ["web/dto/PageRequest.java.template", path.join(webRoot, "dto", "request", `${domainClass}PageRequest.java`), fields(table.columns || [], approvedFields.query)]]) plan(target, render(templates[templateName], { ...context, field_declarations: declaration, pagination_field_declarations: paginationFields(approvedFields.pagination, dto.profile) }));
|
|
196
|
+
}
|
|
197
|
+
const targets = planned.map(({ target }) => target);
|
|
198
|
+
if (new Set(targets).size !== targets.length) throw new Error("approved metadata produces duplicate target files");
|
|
199
|
+
const existing = [];
|
|
200
|
+
for (const target of targets) if (await exists(target)) existing.push(target);
|
|
201
|
+
if (existing.length) throw new Error(`initialize-only Web generation refuses existing targets: ${existing.join(", ")}`);
|
|
202
|
+
const allowedRoots = contract.allowed_write_paths.map((item) => path.resolve(implementationRoot, String(item)));
|
|
203
|
+
const outside = targets.filter((target) => !allowedRoots.some((root) => within(root, target)));
|
|
204
|
+
if (outside.length) throw new Error(`planned Web targets are outside allowed_write_paths: ${outside.join(", ")}`);
|
|
205
|
+
const staging = await mkdtemp(path.join(tmpdir(), "yss-web-generation-"));
|
|
206
|
+
const created = [];
|
|
207
|
+
try {
|
|
208
|
+
for (const [index, { contents }] of planned.entries()) await writeFile(path.join(staging, String(index)), contents, "utf8");
|
|
209
|
+
for (const [index, { target }] of planned.entries()) {
|
|
210
|
+
await mkdir(path.dirname(target), { recursive: true });
|
|
211
|
+
await copyFile(path.join(staging, String(index)), target, constants.COPYFILE_EXCL);
|
|
212
|
+
created.push(target);
|
|
213
|
+
logger.log(`Generated: ${target}`);
|
|
214
|
+
}
|
|
215
|
+
} catch (error) {
|
|
216
|
+
for (const target of created.reverse()) {
|
|
217
|
+
try { await unlink(target); } catch (cleanupError) { if (cleanupError.code !== "ENOENT") error.cleanupError = cleanupError.message; }
|
|
218
|
+
}
|
|
219
|
+
throw error;
|
|
220
|
+
} finally {
|
|
221
|
+
await rm(staging, { recursive: true, force: true });
|
|
73
222
|
}
|
|
74
|
-
return
|
|
223
|
+
return targets;
|
|
75
224
|
}
|
|
76
225
|
async function main() { try { const args = parseArgs(process.argv.slice(2)); if (args.help) { console.log(usage()); return; } await generate(args); } catch (error) { console.error(`Error: ${error.message}`); process.exitCode = 1; } }
|
|
77
226
|
if (process.argv[1] === fileURLToPath(import.meta.url)) await main();
|
|
@@ -1,19 +1,156 @@
|
|
|
1
1
|
import assert from "node:assert/strict";
|
|
2
|
-
import {
|
|
2
|
+
import { createHash } from "node:crypto";
|
|
3
|
+
import { mkdir, mkdtemp, readFile, writeFile } from "node:fs/promises";
|
|
3
4
|
import { tmpdir } from "node:os";
|
|
4
5
|
import path from "node:path";
|
|
5
6
|
import test from "node:test";
|
|
7
|
+
import { fileURLToPath } from "node:url";
|
|
6
8
|
import { generate, parseArgs } from "./generate_controller.mjs";
|
|
7
9
|
|
|
8
|
-
|
|
10
|
+
const scripts = path.dirname(fileURLToPath(import.meta.url));
|
|
11
|
+
const dtoWireProfileFile = path.resolve(scripts, "../../yss-dto/references/openapi-wire-profile.yaml");
|
|
12
|
+
const dtoWireProfileDigest = createHash("sha256").update(await readFile(dtoWireProfileFile)).digest("hex");
|
|
13
|
+
|
|
14
|
+
const metadataValue = {
|
|
15
|
+
tables: [{
|
|
16
|
+
table_name: "quality_rule",
|
|
17
|
+
table_comment: "质量规则",
|
|
18
|
+
columns: [
|
|
19
|
+
{ name: "id", sql_type: "bigint", primary: true, nullable: false },
|
|
20
|
+
{ name: "rule_name", sql_type: "varchar(64)", nullable: false }
|
|
21
|
+
]
|
|
22
|
+
}]
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
function webContract(root, overrides = {}) {
|
|
26
|
+
return {
|
|
27
|
+
schema_version: 2,
|
|
28
|
+
contract_id: "slice-quality-web-1",
|
|
29
|
+
contract_version: 1,
|
|
30
|
+
current_version: 1,
|
|
31
|
+
slice_id: "quality-rule-create",
|
|
32
|
+
status: "approved",
|
|
33
|
+
integration_mode: "existing-project",
|
|
34
|
+
implementation_project_root: root,
|
|
35
|
+
base_package: "com.yss.demo",
|
|
36
|
+
module_name: "demo",
|
|
37
|
+
domain_segment: "quality",
|
|
38
|
+
application_service_package: "com.yss.demo.application.service",
|
|
39
|
+
architecture_profile: "target-domain-model",
|
|
40
|
+
platform_profile: "spring-boot-3-jdk17",
|
|
41
|
+
validation_namespace: "jakarta",
|
|
42
|
+
dto_placement: "web",
|
|
43
|
+
dto_wire_profile_ref: dtoWireProfileFile,
|
|
44
|
+
dto_wire_profile_digest: dtoWireProfileDigest,
|
|
45
|
+
openapi_freeze_ref: "openapi://quality-rule@1",
|
|
46
|
+
allowed_write_paths: [root],
|
|
47
|
+
expected_evidence_files: ["evidence/web-generation.json"],
|
|
48
|
+
verification_commands: ["./mvnw test", "./mvnw package"],
|
|
49
|
+
fields: {
|
|
50
|
+
quality_rule: {
|
|
51
|
+
create: ["rule_name"],
|
|
52
|
+
update: ["id", "rule_name"],
|
|
53
|
+
query: ["rule_name"],
|
|
54
|
+
pagination: ["pageIndex", "pageSize"],
|
|
55
|
+
response: ["id", "rule_name"]
|
|
56
|
+
}
|
|
57
|
+
},
|
|
58
|
+
...overrides
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
async function fixture(overrides = {}) {
|
|
9
63
|
const root = await mkdtemp(path.join(tmpdir(), "yss-controller-"));
|
|
10
64
|
const metadata = path.join(root, "metadata.json");
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
65
|
+
const contract = path.join(root, "web-contract.json");
|
|
66
|
+
const output = path.join(root, "out");
|
|
67
|
+
await writeFile(metadata, JSON.stringify(metadataValue));
|
|
68
|
+
await writeFile(contract, JSON.stringify(webContract(root, overrides)));
|
|
69
|
+
const args = ["--metadata-file", metadata, "--contract-file", contract, "--dto-wire-profile-file", dtoWireProfileFile, "--base-package", "com.yss.demo", "--module-name", "demo", "--domain-segment", "quality", "--output-dir", output, "--application-service-package", "com.yss.demo.application.service", "--validation-namespace", overrides.validation_namespace ?? "jakarta"];
|
|
70
|
+
return { root, metadata, contract, output, args };
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
test("generates approved standalone Web code and exposes only approved pagination fields", async () => {
|
|
74
|
+
const data = await fixture();
|
|
75
|
+
await generate(parseArgs(data.args), { log() {}, warn() {} });
|
|
76
|
+
const rest = path.join(data.output, "com", "yss", "demo", "rest");
|
|
77
|
+
const controller = await readFile(path.join(rest, "QualityRuleController.java"), "utf8");
|
|
78
|
+
const convertor = await readFile(path.join(rest, "convertor", "QualityRuleWebConvertor.java"), "utf8");
|
|
79
|
+
const createRequest = await readFile(path.join(rest, "dto", "request", "QualityRuleCreateRequest.java"), "utf8");
|
|
80
|
+
const pageRequest = await readFile(path.join(rest, "dto", "request", "QualityRulePageRequest.java"), "utf8");
|
|
14
81
|
assert.match(controller, /import com\.yss\.demo\.application\.service\.QualityRuleService;/);
|
|
82
|
+
assert.match(controller, /SingleResult\.of\(/);
|
|
15
83
|
assert.match(controller, /import jakarta\.validation\.Valid;/);
|
|
16
|
-
assert.
|
|
84
|
+
assert.match(convertor, /@Mapper\(componentModel = "spring"\)/);
|
|
85
|
+
assert.match(convertor, /PageResult\.of\(\s*toResponses\(source\.getData\(\)\),\s*source\.getTotalCount\(\),\s*source\.getPageSize\(\),\s*source\.getPageIndex\(\)/s);
|
|
86
|
+
assert.doesNotMatch(`${controller}\n${convertor}`, /Gateway|\.domain\.|Mappers\.getMapper|INSTANCE/);
|
|
87
|
+
assert.match(createRequest, /private String ruleName;/);
|
|
88
|
+
assert.doesNotMatch(createRequest, /private Long id;|@Data/);
|
|
89
|
+
assert.match(pageRequest, /private int pageIndex = 1;/);
|
|
90
|
+
assert.match(pageRequest, /private int pageSize = 10;/);
|
|
91
|
+
assert.doesNotMatch(pageRequest, /orderBy|orderDirection|groupBy|offset|needTotalCount|tempTotalCount|extends PageQuery/);
|
|
17
92
|
});
|
|
18
93
|
|
|
19
|
-
test("rejects
|
|
94
|
+
test("rejects a yss-dto wire profile whose digest differs from the approved contract", async () => {
|
|
95
|
+
const data = await fixture({ dto_wire_profile_digest: "0".repeat(64) });
|
|
96
|
+
await assert.rejects(() => generate(parseArgs(data.args), { log() {}, warn() {} }), /yss-dto wire profile digest/);
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
test("rejects missing CLI arguments, schema v1, draft contracts, and inconsistent platform profiles", async () => {
|
|
100
|
+
assert.throws(() => parseArgs(["--module-name", "demo"]), /required/);
|
|
101
|
+
const v1 = await fixture({ schema_version: 1 });
|
|
102
|
+
await assert.rejects(() => generate(parseArgs(v1.args), { log() {}, warn() {} }), /schema_version=1.*unsupported/);
|
|
103
|
+
const draft = await fixture({ status: "draft" });
|
|
104
|
+
await assert.rejects(() => generate(parseArgs(draft.args), { log() {}, warn() {} }), /approved/);
|
|
105
|
+
const mismatch = await fixture({ platform_profile: "spring-boot-3-jdk17", validation_namespace: "javax" });
|
|
106
|
+
await assert.rejects(() => generate(parseArgs(mismatch.args), { log() {}, warn() {} }), /platform_profile and validation_namespace/);
|
|
107
|
+
assert.throws(() => parseArgs([...draft.args, "--force"]), /initialize-only/);
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
test("binds identity and every target to the approved write scope before writing", async () => {
|
|
111
|
+
const data = await fixture();
|
|
112
|
+
await assert.rejects(() => generate(parseArgs(data.args.map((value) => value === "demo" ? "other" : value)), { log() {}, warn() {} }), /approved web generation contract/);
|
|
113
|
+
await writeFile(data.contract, JSON.stringify(webContract(data.root, { allowed_write_paths: [path.join(data.root, "different-root")] })));
|
|
114
|
+
await assert.rejects(() => generate(parseArgs(data.args), { log() {}, warn() {} }), /allowed_write_paths/);
|
|
115
|
+
await writeFile(data.contract, JSON.stringify(webContract(data.root)));
|
|
116
|
+
const existing = path.join(data.output, "com/yss/demo/rest/QualityRuleController.java");
|
|
117
|
+
await mkdir(path.dirname(existing), { recursive: true });
|
|
118
|
+
await writeFile(existing, "user-owned\n");
|
|
119
|
+
await assert.rejects(() => generate(parseArgs(data.args), { log() {}, warn() {} }), /initialize-only/);
|
|
120
|
+
assert.equal(await readFile(existing, "utf8"), "user-owned\n");
|
|
121
|
+
await assert.rejects(() => readFile(path.join(data.output, "com/yss/demo/rest/convertor/QualityRuleWebConvertor.java"), "utf8"), /ENOENT/);
|
|
122
|
+
});
|
|
123
|
+
|
|
124
|
+
test("scaffold-v2 mode requires an empty-scaffold-verified manifest with matching profile and project layout", async () => {
|
|
125
|
+
const data = await fixture({ platform_profile: "spring-boot-2.7-jdk8", validation_namespace: "javax" });
|
|
126
|
+
const projectRoot = path.join(data.root, "demo-service");
|
|
127
|
+
const webProject = path.join(projectRoot, "demo-service-adapter", "demo-service-web");
|
|
128
|
+
const manifest = path.join(projectRoot, ".yss", "scaffold-generation.json");
|
|
129
|
+
await mkdir(path.dirname(manifest), { recursive: true });
|
|
130
|
+
await writeFile(manifest, JSON.stringify({ schema_version: 2, project_name: "demo-service", base_package: "com.yss.demo", completion_level: "empty-scaffold-verified", profiles: { architecture: "target-domain-model", platform: "spring-boot-2.7-jdk8", validation_namespace: "javax", dto_placement: "web" } }));
|
|
131
|
+
const contractValue = webContract(projectRoot, {
|
|
132
|
+
integration_mode: "scaffold-v2",
|
|
133
|
+
implementation_project_root: projectRoot,
|
|
134
|
+
scaffold_manifest_ref: manifest,
|
|
135
|
+
platform_profile: "spring-boot-3-jdk17",
|
|
136
|
+
validation_namespace: "jakarta",
|
|
137
|
+
allowed_write_paths: [path.join(webProject, "src/main/java/com/yss/demo/rest")]
|
|
138
|
+
});
|
|
139
|
+
await writeFile(data.contract, JSON.stringify(contractValue));
|
|
140
|
+
const args = ["--metadata-file", data.metadata, "--contract-file", data.contract, "--dto-wire-profile-file", dtoWireProfileFile, "--scaffold-manifest-file", manifest, "--base-package", "com.yss.demo", "--module-name", "demo", "--domain-segment", "quality", "--web-project-dir", webProject, "--application-service-package", "com.yss.demo.application.service", "--validation-namespace", "jakarta"];
|
|
141
|
+
await assert.rejects(() => generate(parseArgs(args), { log() {}, warn() {} }), /scaffold manifest.*platform/i);
|
|
142
|
+
contractValue.platform_profile = "spring-boot-2.7-jdk8";
|
|
143
|
+
contractValue.validation_namespace = "javax";
|
|
144
|
+
await writeFile(data.contract, JSON.stringify(contractValue));
|
|
145
|
+
await generate(parseArgs(args.map((value) => value === "jakarta" ? "javax" : value)), { log() {}, warn() {} });
|
|
146
|
+
});
|
|
147
|
+
|
|
148
|
+
test("rolls back files written before a filesystem failure", async () => {
|
|
149
|
+
const data = await fixture();
|
|
150
|
+
const rest = path.join(data.output, "com/yss/demo/rest");
|
|
151
|
+
await mkdir(rest, { recursive: true });
|
|
152
|
+
await writeFile(path.join(rest, "convertor"), "blocking-file\n");
|
|
153
|
+
await assert.rejects(() => generate(parseArgs(data.args), { log() {}, warn() {} }));
|
|
154
|
+
await assert.rejects(() => readFile(path.join(rest, "QualityRuleController.java"), "utf8"), /ENOENT/);
|
|
155
|
+
assert.equal(await readFile(path.join(rest, "convertor"), "utf8"), "blocking-file\n");
|
|
156
|
+
});
|
|
@@ -84,7 +84,7 @@ Off the main flow entirely.
|
|
|
84
84
|
- **`/grilling`** — the interview primitive itself: rounds, the frontier, facts are the agent's job and decisions are yours. `/grill-me` and `/grill-with-docs` are the two named ways in, and `/triage`, `/wayfinder` and `/improve-codebase-architecture` all run it internally. Reach for it directly only when you want the interview with no wrapper around it.
|
|
85
85
|
- **`/resolving-merge-conflicts`** — work an in-progress merge or rebase conflict hunk by hunk, resolving by **intent** traced to each side's primary source rather than by picking lines, then finish the operation. It never runs `--abort`. Standalone and off every flow: reach for it when you are already mid-conflict.
|
|
86
86
|
- **`/prototype`** — a small, throwaway program that answers one design question: does this state model feel right, or what should this UI look like. Throwaway is a constraint on how the code is written, not a promise to destroy it: the answer folds into the real code, and the prototype itself is kept as a **primary source** on a `prototype/<name>` branch out of main, pointed at from the implementation issue. It's the detour in step 2 of the main flow, but reach for it any time a design question is hard to settle on paper.
|
|
87
|
-
- **`/research`** —
|
|
87
|
+
- **`/yss-research`** — investigate technical or strategy evidence using `technical-evidence` / `strategy-evidence` and `quick` / `evidence-audited` modes. Use a background agent when the runtime supports it and parallel reading is useful; delegation is not a trust guarantee. The old `/research` name is a deprecated alias. Research feeds `/grill-with-docs` and lifecycle decisions; it does not approve them.
|
|
88
88
|
- **`/to-questionnaire`** — when the thing blocking you isn't in your head or the codebase but in **someone else's**, this writes them a questionnaire to fill in. It's the inverse of `/grill-me`: instead of interviewing you about the subject, it interviews you about the **send** — who it's going to, what you need back — and aims the questions at the gap. What comes back is material for `/grill-with-docs` or `/to-spec`.
|
|
89
89
|
- **`/wait-what`** — the corrective for a message that didn't land. Use it mid-conversation, inside any other skill, and the agent re-pitches what it just said with the context you were missing, in plain English, using the `CONTEXT.md` vocabulary. It works after the fact; `/grill-with-docs` is the upfront cure, because a shared language agreed early is what stops the jargon arriving at all.
|
|
90
90
|
- **`/teach`** — learn a concept over multiple sessions, using the current directory as a stateful workspace.
|
|
@@ -12,10 +12,10 @@
|
|
|
12
12
|
2. Slice Implementation Contract 的 `required_skills`:对每个技能读取 `.agents/skills/<id>/SKILL.md` 及该 skill 指明的 references。
|
|
13
13
|
3. 影响面专项检查输入(与合同并集,不得互相替代):
|
|
14
14
|
- 后端:`alibaba-java-code-style`、`yss-domain`、`yss-application`、`yss-repository`、`yss-web-controller`、`yss-dto`、`mapstruct`、`lombok`
|
|
15
|
-
- UI:`yss-ui`、`yss-design-system`、`yss-page-module-development`
|
|
15
|
+
- UI:`yss-ui`、`yss-design-system`、`yss-ui-business-page-generation`、`yss-page-module-development`
|
|
16
16
|
4. 报告模板中的后端 / 前端门禁表。空着的适用行视为 `missing_evidence`。
|
|
17
17
|
|
|
18
|
-
YSS 页面模块约定(YTable、
|
|
18
|
+
YSS 页面模块约定(YTable、YFormily、页面骨架等)走 Standards,不并入 UI fidelity。UI fidelity 只核原型与状态矩阵。
|
|
19
19
|
|
|
20
20
|
审查者只读这些 skill,不得用它们写实现路径。`role.test-engineer` 任务包禁止 `implement` 与脚手架生成器。
|
|
21
21
|
|
|
@@ -51,4 +51,4 @@ YSS 页面模块约定(YTable、YssFormily、页面骨架等)走 Standards
|
|
|
51
51
|
| `violation`、机器检查失败、适用行空白、`missing_evidence` | 实现者在**原合同允许路径**内修复;任何修复使候选失效,必须重新捕获并重跑 Standards、Spec、UI fidelity(若命中)和 fresh verification |
|
|
52
52
|
| `drift`、`new_impacts`、`required_skills` 与真实影响不一致 | 合同标 `stale`,回 Router 或更早生命周期阶段;禁止在旧合同上继续编码 |
|
|
53
53
|
|
|
54
|
-
`not-applicable` 仅当影响面未命中。命中后的 mandatory 不得豁免;只允许修复,或写完整 `seam-deferred`(风险、责任人、后续 Ticket、验证计划、目标版本或发布日期)。禁止为日常 Alibaba / YSS 新增生物人豁免门禁;安全 / 公共 API 仍走既有 `TODO-HUMAN-REVIEW` 与生物人门禁。
|
|
54
|
+
`not-applicable` 仅当影响面未命中。命中后的 mandatory 不得豁免;只允许修复,或写完整 `seam-deferred`(风险、责任人、后续 Ticket、验证计划、目标版本或发布日期)。禁止为日常 Alibaba / YSS 新增生物人豁免门禁;安全 / 公共 API 仍走既有 `TODO-HUMAN-REVIEW` 与生物人门禁。
|
|
@@ -19,8 +19,8 @@ description: 指导 YSS UI 业务页面、CRUD、列表页、表单页和组件
|
|
|
19
19
|
|
|
20
20
|
1. 当前会话可用 yss-ui MCP 时,先用 `list_components` 确认组件、Hook 或 Utils 是否真实存在,再用 `get_component_docs` 确认名称、导出包、Props、Events 和 Slots,不只看 demo 标签名。
|
|
21
21
|
2. `get_component_docs` 未命中时,先用 `search_docs` 和 `list_components` 校正别名与归属,不得立即判定为未封装。
|
|
22
|
-
3. MCP
|
|
23
|
-
4. 必要时读取 `../yss-page-
|
|
22
|
+
3. MCP 工具不可用、调用失败或校正后仍无结果时,读取当前上下文或文档站的最新 `llms-full.txt`。
|
|
23
|
+
4. 必要时读取 `../yss-ui-business-page-generation/references/component-map.md`、`hooks-map.md`、`utils-map.md` 快速缩小范围;文档与当前项目依赖版本不一致时,最终以当前源码和可编译导出为准。
|
|
24
24
|
5. 已导出的 YSS 能力优先从 `@yss-ui/components`、`@yss-ui/hooks`、`@yss-ui/utils` 导入;确认未封装后才从 `ant-design-vue` 导入原组件。
|
|
25
25
|
6. 若文档与导出源码不一致,记录差异并按当前仓库可编译的导出处理,不猜测 API。
|
|
26
26
|
|
|
@@ -14,7 +14,7 @@ description: 分析并提交 Vue、React、TypeScript、JavaScript、Vite、微
|
|
|
14
14
|
|
|
15
15
|
## 不适用场景
|
|
16
16
|
|
|
17
|
-
- yss-ui
|
|
17
|
+
- yss-ui 组件库仓库自身的提交与发版:回到 yss-ui 源仓库使用其 `categories.library` 提交流程;该类 skill 不随业务模板分发。
|
|
18
18
|
- Java、Spring Boot、Maven、Gradle 后端仓库:使用 `../java-backend-commit/SKILL.md`。
|
|
19
19
|
- 仅请求代码实现,不涉及提交信息或 `git commit` 操作。
|
|
20
20
|
- 无代码改动,或改动内容与提交请求不匹配。
|
|
@@ -74,7 +74,7 @@ The answer isn't part of the body — it's recorded on resolution (see [Work thr
|
|
|
74
74
|
|
|
75
75
|
Every ticket is either **HITL** — human in the loop, worked _with_ a human who speaks for themselves — or **AFK**, driven by the agent alone. A HITL ticket only resolves through that live exchange; the agent never stands in for the human's side of it (a grilling agent that answers its own questions has broken this).
|
|
76
76
|
|
|
77
|
-
- **Research** (AFK): Reading documentation, third-party APIs, or local resources like knowledge bases to surface a fact a decision waits on. Resolved by a `/research` **subagent
|
|
77
|
+
- **Research** (AFK): Reading documentation, third-party APIs, or local resources like knowledge bases to surface a fact a decision waits on. Resolved by a `/yss-research` **subagent** (`/research` is a deprecated alias). Use when knowledge outside the current working directory is required.
|
|
78
78
|
- **Prototype** (HITL): Raise the fidelity of the discussion by making a cheap, rough, concrete artifact to react to — an outline, a rough take, a stub, or UI/logic code via the /prototype skill. Links the prototype as an asset. Use when "how should it look" or "how should it behave" is the key question.
|
|
79
79
|
- **Grilling** (HITL): Conversation. The default case. Always invoke the /grilling and /domain-modeling skills.
|
|
80
80
|
- **Task** (HITL or AFK): Manual work that must happen before a _decision_ can be made — nothing to decide, prototype, or research, but the discussion is blocked until it's done. Signing up for a service so its API can be judged, provisioning access, moving data so its shape can be seen. This is the one type that _does_ rather than decides — and it earns its place by unblocking a decision, not by delivering the destination. The agent drives it alone where it can (AFK); otherwise it hands the human a precise checklist (HITL). Resolved when the work is done; the answer records what was done and any resulting facts (credentials location, new URLs, row counts) later tickets depend on.
|
|
@@ -112,7 +112,7 @@ User invokes with a loose idea.
|
|
|
112
112
|
2. **Map the frontier.** Grill again, **breadth-first** this time: fan out across the whole space rather than deep on any one thread, surfacing the open decisions and the first steps takeable now. **If this surfaces no fog** — the way to the destination is already clear, the whole journey small enough for one session — you don't need a map. Stop and ask the user how they'd like to proceed.
|
|
113
113
|
3. **Create the map** (label `wayfinder:map`): Destination and Notes filled in, Decisions-so-far empty, the fog sketched into **Not yet specified**.
|
|
114
114
|
4. **Create the tickets you can specify now** as child issues of the map — then wire blocking edges in a **second pass** (issues need ids before they can reference each other). Wiring sorts them into the frontier and the blocked; everything you can't yet specify stays in the fog — the **Not yet specified** section.
|
|
115
|
-
5. **Fire the research subagents.** For each `research` ticket you just created, spin up a `/research` subagent to resolve it in parallel, capturing its findings on a throwaway `research/<name>` branch with a context pointer from the ticket.
|
|
115
|
+
5. **Fire the research subagents.** For each `research` ticket you just created, spin up a `/yss-research` subagent to resolve it in parallel, capturing its findings on a throwaway `research/<name>` branch with a context pointer from the ticket. `/research` remains only as a deprecated compatibility alias.
|
|
116
116
|
6. Stop — charting is one session's work; it hand-resolves nothing.
|
|
117
117
|
|
|
118
118
|
### Work through the map
|