create-yss-spec 3.4.4 → 3.4.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/package.json +2 -2
- package/template/.agents/skills/.strategic-design-skills-manifest.json +1 -1
- package/template/.agents/skills/yss-application/SKILL.md +8 -6
- package/template/.agents/skills/yss-audit-log/SKILL.md +12 -7
- package/template/.agents/skills/yss-audit-log/references/source-index.boot2-java8.md +57 -0
- package/template/.agents/skills/yss-audit-log/references/source-index.boot3-java17.md +58 -0
- package/template/.agents/skills/yss-audit-log/references/source-index.md +6 -39
- package/template/.agents/skills/yss-cache/SKILL.md +5 -1
- package/template/.agents/skills/yss-cache/references/source-index.boot2-java8.md +81 -0
- package/template/.agents/skills/yss-cache/references/source-index.boot3-java17.md +83 -0
- package/template/.agents/skills/yss-cache/references/source-index.md +6 -63
- package/template/.agents/skills/yss-cache/scripts/check-skill-freshness.sh +20 -15
- package/template/.agents/skills/yss-ddd-scaffold-generator/SKILL.md +2 -2
- package/template/.agents/skills/yss-ddd-scaffold-generator/references/engineering-baseline.md +53 -0
- package/template/.agents/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-parent/SKILL.md +5 -51
- package/template/.agents/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-parent/agents/openai.yaml +3 -3
- package/template/.agents/skills/yss-ddd-scaffold-generator/scripts/first-slice-verification.test.mjs +1 -1
- package/template/.agents/skills/yss-ddd-scaffold-generator/scripts/generate_scaffold.mjs +2 -2
- package/template/.agents/skills/yss-ddd-scaffold-generator/scripts/run_first_slice_verification.mjs +2 -3
- package/template/.agents/skills/yss-ddd-scaffold-generator/scripts/run_scaffold_verification.mjs +1 -1
- package/template/.agents/skills/yss-ddd-scaffold-generator/scripts/scaffold-generator.test.mjs +1 -1
- package/template/.agents/skills/yss-distributed-id/SKILL.md +4 -0
- package/template/.agents/skills/yss-distributed-id/references/source-index.boot2-java8.md +102 -0
- package/template/.agents/skills/yss-distributed-id/references/source-index.boot3-java17.md +90 -0
- package/template/.agents/skills/yss-distributed-id/references/source-index.md +6 -82
- package/template/.agents/skills/yss-dto/SKILL.md +2 -2
- package/template/.agents/skills/yss-dto/references/source-index.boot2-java8.md +67 -0
- package/template/.agents/skills/yss-dto/references/source-index.boot3-java17.md +70 -0
- package/template/.agents/skills/yss-dto/references/source-index.md +6 -51
- package/template/.agents/skills/yss-excel-mvc/SKILL.md +4 -0
- package/template/.agents/skills/yss-excel-mvc/references/source-index.boot2-java8.md +90 -0
- package/template/.agents/skills/yss-excel-mvc/references/source-index.boot3-java17.md +58 -0
- package/template/.agents/skills/yss-excel-mvc/references/source-index.md +6 -70
- package/template/.agents/skills/yss-exception/SKILL.md +12 -9
- package/template/.agents/skills/yss-exception/references/source-index.boot2-java8.md +50 -0
- package/template/.agents/skills/yss-exception/references/source-index.boot3-java17.md +50 -0
- package/template/.agents/skills/yss-exception/references/source-index.md +6 -31
- package/template/.agents/skills/yss-implementation-contract-compiler/SKILL.md +2 -0
- package/template/.agents/skills/yss-implementation-contract-compiler/references/boundaries.md +3 -5
- package/template/.agents/skills/yss-implementation-contract-compiler/references/compiler-contract.yaml +27 -2
- package/template/.agents/skills/yss-implementation-contract-compiler/references/yss-skill-execution-result.md +2 -1
- package/template/.agents/skills/yss-implementation-contract-compiler/tests/compiler-scenarios.test.mjs +60 -14
- package/template/.agents/skills/yss-layered-mvc-scaffold-generator/SKILL.md +6 -5
- package/template/.agents/skills/yss-layered-mvc-scaffold-generator/agents/openai.yaml +2 -2
- package/template/.agents/skills/yss-layered-mvc-scaffold-generator/references/architecture.md +2 -0
- package/template/.agents/skills/yss-layered-mvc-scaffold-generator/scripts/data-analysis-profile.mjs +82 -0
- package/template/.agents/skills/yss-layered-mvc-scaffold-generator/scripts/generate_scaffold.mjs +23 -9
- package/template/.agents/skills/yss-layered-mvc-scaffold-generator/scripts/scaffold-generator.test.mjs +30 -6
- package/template/.agents/skills/yss-layered-mvc-scaffold-generator/tests/scaffold-generator.test.mjs +2 -0
- package/template/.agents/skills/yss-mvc-data-analysis-project-initializer/SKILL.md +5 -15
- package/template/.agents/skills/yss-mvc-data-analysis-project-initializer/scripts/generate_project.mjs +9 -68
- package/template/.agents/skills/yss-mvc-design/SKILL.md +5 -9
- package/template/.agents/skills/yss-mvc-design/agents/openai.yaml +3 -3
- package/template/.agents/skills/yss-mybatis/SKILL.md +2 -2
- package/template/.agents/skills/yss-mybatis/references/source-index.boot2-java8.md +126 -0
- package/template/.agents/skills/yss-mybatis/references/source-index.boot3-java17.md +126 -0
- package/template/.agents/skills/yss-mybatis/references/source-index.md +6 -109
- package/template/.agents/skills/yss-product-lifecycle/references/orchestration-contract.yaml +10 -8
- package/template/.agents/skills/yss-product-lifecycle/references/orchestration.md +2 -2
- package/template/.agents/skills/yss-repository/SKILL.md +1 -1
- package/template/.agents/skills/yss-resilience4j/SKILL.md +4 -0
- package/template/.agents/skills/yss-resilience4j/references/source-index.boot2-java8.md +48 -0
- package/template/.agents/skills/yss-resilience4j/references/source-index.boot3-java17.md +48 -0
- package/template/.agents/skills/yss-resilience4j/references/source-index.md +6 -29
- package/template/.agents/skills/yss-security-algorithm/SKILL.md +34 -10
- package/template/.agents/skills/yss-security-algorithm/references/source-index.boot2-java8.md +50 -0
- package/template/.agents/skills/yss-security-algorithm/references/source-index.boot3-java17.md +51 -0
- package/template/.agents/skills/yss-security-algorithm/references/source-index.md +6 -31
- package/template/.agents/skills/yss-skill-source-index-refresh/SKILL.md +12 -6
- package/template/.agents/skills/yss-skill-source-index-refresh/references/backend-component-platform-compatibility.md +27 -0
- package/template/.agents/skills/yss-skill-source-index-refresh/references/source-location.md +4 -4
- package/template/.agents/skills/yss-skill-source-index-refresh/references/source-map-config.md +10 -3
- package/template/.agents/skills/yss-skill-source-index-refresh/scripts/check-backend-skill-source-index.mjs +60 -0
- package/template/.agents/skills/yss-skill-source-index-refresh/scripts/refresh-yss-skill-index.mjs +247 -54
- package/template/.agents/skills/yss-skill-source-index-refresh/scripts/refresh-yss-skill-index.test.mjs +74 -7
- package/template/.agents/skills/yss-tactical-design/SKILL.md +1 -1
- package/template/.agents/skills/yss-tactical-design/references/output-template.md +1 -1
- package/template/.agents/skills/yss-technical-design/SKILL.md +3 -1
- package/template/.agents/skills/yss-technical-design/references/mvc-design.schema.json +315 -0
- package/template/.agents/skills/yss-technical-design/references/technical-design-contract.md +1 -1
- package/template/.agents/skills/yss-technical-design/scripts/generate-schema.mjs +1 -1
- package/template/.agents/skills/yss-technical-design/tests/run-scenarios.mjs +4 -1
- package/template/.agents/skills/yss-up-springboot3/SKILL.md +23 -9
- package/template/.agents/skills/yss-userinfo/SKILL.md +21 -14
- package/template/.agents/skills/yss-userinfo/references/source-index.boot2-java8.md +49 -0
- package/template/.agents/skills/yss-userinfo/references/source-index.boot3-java17.md +54 -0
- package/template/.agents/skills/yss-userinfo/references/source-index.md +6 -30
- package/template/.agents/skills/yss-validation/SKILL.md +12 -17
- package/template/.agents/skills/yss-validation/references/source-index.boot2-java8.md +47 -0
- package/template/.agents/skills/yss-validation/references/source-index.boot3-java17.md +47 -0
- package/template/.agents/skills/yss-validation/references/source-index.md +6 -29
- package/template/.agents/skills/yss-web-controller/SKILL.md +4 -4
- package/template/.agents/skills/yss-web-controller/scripts/generate_controller.test.mjs +1 -1
- package/template/.codex/skills/yss-application/SKILL.md +8 -6
- package/template/.codex/skills/yss-audit-log/SKILL.md +12 -7
- package/template/.codex/skills/yss-audit-log/references/source-index.boot2-java8.md +57 -0
- package/template/.codex/skills/yss-audit-log/references/source-index.boot3-java17.md +58 -0
- package/template/.codex/skills/yss-audit-log/references/source-index.md +6 -39
- package/template/.codex/skills/yss-cache/SKILL.md +5 -1
- package/template/.codex/skills/yss-cache/references/source-index.boot2-java8.md +81 -0
- package/template/.codex/skills/yss-cache/references/source-index.boot3-java17.md +83 -0
- package/template/.codex/skills/yss-cache/references/source-index.md +6 -63
- package/template/.codex/skills/yss-cache/scripts/check-skill-freshness.sh +20 -15
- package/template/.codex/skills/yss-ddd-scaffold-generator/SKILL.md +2 -2
- package/template/.codex/skills/yss-ddd-scaffold-generator/references/engineering-baseline.md +53 -0
- package/template/.codex/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-parent/SKILL.md +5 -51
- package/template/.codex/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-parent/agents/openai.yaml +3 -3
- package/template/.codex/skills/yss-ddd-scaffold-generator/scripts/first-slice-verification.test.mjs +1 -1
- package/template/.codex/skills/yss-ddd-scaffold-generator/scripts/generate_scaffold.mjs +2 -2
- package/template/.codex/skills/yss-ddd-scaffold-generator/scripts/run_first_slice_verification.mjs +2 -3
- package/template/.codex/skills/yss-ddd-scaffold-generator/scripts/run_scaffold_verification.mjs +1 -1
- package/template/.codex/skills/yss-ddd-scaffold-generator/scripts/scaffold-generator.test.mjs +1 -1
- package/template/.codex/skills/yss-distributed-id/SKILL.md +4 -0
- package/template/.codex/skills/yss-distributed-id/references/source-index.boot2-java8.md +102 -0
- package/template/.codex/skills/yss-distributed-id/references/source-index.boot3-java17.md +90 -0
- package/template/.codex/skills/yss-distributed-id/references/source-index.md +6 -82
- package/template/.codex/skills/yss-dto/SKILL.md +2 -2
- package/template/.codex/skills/yss-dto/references/source-index.boot2-java8.md +67 -0
- package/template/.codex/skills/yss-dto/references/source-index.boot3-java17.md +70 -0
- package/template/.codex/skills/yss-dto/references/source-index.md +6 -51
- package/template/.codex/skills/yss-excel-mvc/SKILL.md +4 -0
- package/template/.codex/skills/yss-excel-mvc/references/source-index.boot2-java8.md +90 -0
- package/template/.codex/skills/yss-excel-mvc/references/source-index.boot3-java17.md +58 -0
- package/template/.codex/skills/yss-excel-mvc/references/source-index.md +6 -70
- package/template/.codex/skills/yss-exception/SKILL.md +12 -9
- package/template/.codex/skills/yss-exception/references/source-index.boot2-java8.md +50 -0
- package/template/.codex/skills/yss-exception/references/source-index.boot3-java17.md +50 -0
- package/template/.codex/skills/yss-exception/references/source-index.md +6 -31
- package/template/.codex/skills/yss-implementation-contract-compiler/SKILL.md +2 -0
- package/template/.codex/skills/yss-implementation-contract-compiler/references/boundaries.md +3 -5
- package/template/.codex/skills/yss-implementation-contract-compiler/references/compiler-contract.yaml +27 -2
- package/template/.codex/skills/yss-implementation-contract-compiler/references/yss-skill-execution-result.md +2 -1
- package/template/.codex/skills/yss-implementation-contract-compiler/tests/compiler-scenarios.test.mjs +60 -14
- package/template/.codex/skills/yss-layered-mvc-scaffold-generator/SKILL.md +6 -5
- package/template/.codex/skills/yss-layered-mvc-scaffold-generator/agents/openai.yaml +2 -2
- package/template/.codex/skills/yss-layered-mvc-scaffold-generator/references/architecture.md +2 -0
- package/template/.codex/skills/yss-layered-mvc-scaffold-generator/scripts/data-analysis-profile.mjs +82 -0
- package/template/.codex/skills/yss-layered-mvc-scaffold-generator/scripts/generate_scaffold.mjs +23 -9
- package/template/.codex/skills/yss-layered-mvc-scaffold-generator/scripts/scaffold-generator.test.mjs +30 -6
- package/template/.codex/skills/yss-layered-mvc-scaffold-generator/tests/scaffold-generator.test.mjs +2 -0
- package/template/.codex/skills/yss-mvc-data-analysis-project-initializer/SKILL.md +5 -15
- package/template/.codex/skills/yss-mvc-data-analysis-project-initializer/scripts/generate_project.mjs +9 -68
- package/template/.codex/skills/yss-mvc-design/SKILL.md +5 -9
- package/template/.codex/skills/yss-mvc-design/agents/openai.yaml +3 -3
- package/template/.codex/skills/yss-mybatis/SKILL.md +2 -2
- package/template/.codex/skills/yss-mybatis/references/source-index.boot2-java8.md +126 -0
- package/template/.codex/skills/yss-mybatis/references/source-index.boot3-java17.md +126 -0
- package/template/.codex/skills/yss-mybatis/references/source-index.md +6 -109
- package/template/.codex/skills/yss-product-lifecycle/references/orchestration-contract.yaml +10 -8
- package/template/.codex/skills/yss-product-lifecycle/references/orchestration.md +2 -2
- package/template/.codex/skills/yss-repository/SKILL.md +1 -1
- package/template/.codex/skills/yss-resilience4j/SKILL.md +4 -0
- package/template/.codex/skills/yss-resilience4j/references/source-index.boot2-java8.md +48 -0
- package/template/.codex/skills/yss-resilience4j/references/source-index.boot3-java17.md +48 -0
- package/template/.codex/skills/yss-resilience4j/references/source-index.md +6 -29
- package/template/.codex/skills/yss-security-algorithm/SKILL.md +34 -10
- package/template/.codex/skills/yss-security-algorithm/references/source-index.boot2-java8.md +50 -0
- package/template/.codex/skills/yss-security-algorithm/references/source-index.boot3-java17.md +51 -0
- package/template/.codex/skills/yss-security-algorithm/references/source-index.md +6 -31
- package/template/.codex/skills/yss-skill-source-index-refresh/SKILL.md +12 -6
- package/template/.codex/skills/yss-skill-source-index-refresh/references/backend-component-platform-compatibility.md +27 -0
- package/template/.codex/skills/yss-skill-source-index-refresh/references/source-location.md +4 -4
- package/template/.codex/skills/yss-skill-source-index-refresh/references/source-map-config.md +10 -3
- package/template/.codex/skills/yss-skill-source-index-refresh/scripts/check-backend-skill-source-index.mjs +60 -0
- package/template/.codex/skills/yss-skill-source-index-refresh/scripts/refresh-yss-skill-index.mjs +247 -54
- package/template/.codex/skills/yss-skill-source-index-refresh/scripts/refresh-yss-skill-index.test.mjs +74 -7
- package/template/.codex/skills/yss-tactical-design/SKILL.md +1 -1
- package/template/.codex/skills/yss-tactical-design/references/output-template.md +1 -1
- package/template/.codex/skills/yss-technical-design/SKILL.md +3 -1
- package/template/.codex/skills/yss-technical-design/references/mvc-design.schema.json +315 -0
- package/template/.codex/skills/yss-technical-design/references/technical-design-contract.md +1 -1
- package/template/.codex/skills/yss-technical-design/scripts/generate-schema.mjs +1 -1
- package/template/.codex/skills/yss-technical-design/tests/run-scenarios.mjs +4 -1
- package/template/.codex/skills/yss-up-springboot3/SKILL.md +23 -9
- package/template/.codex/skills/yss-userinfo/SKILL.md +21 -14
- package/template/.codex/skills/yss-userinfo/references/source-index.boot2-java8.md +49 -0
- package/template/.codex/skills/yss-userinfo/references/source-index.boot3-java17.md +54 -0
- package/template/.codex/skills/yss-userinfo/references/source-index.md +6 -30
- package/template/.codex/skills/yss-validation/SKILL.md +12 -17
- package/template/.codex/skills/yss-validation/references/source-index.boot2-java8.md +47 -0
- package/template/.codex/skills/yss-validation/references/source-index.boot3-java17.md +47 -0
- package/template/.codex/skills/yss-validation/references/source-index.md +6 -29
- package/template/.codex/skills/yss-web-controller/SKILL.md +4 -4
- package/template/.codex/skills/yss-web-controller/scripts/generate_controller.test.mjs +1 -1
- package/template/.cursor/skills/yss-application/SKILL.md +8 -6
- package/template/.cursor/skills/yss-audit-log/SKILL.md +12 -7
- package/template/.cursor/skills/yss-audit-log/references/source-index.boot2-java8.md +57 -0
- package/template/.cursor/skills/yss-audit-log/references/source-index.boot3-java17.md +58 -0
- package/template/.cursor/skills/yss-audit-log/references/source-index.md +6 -39
- package/template/.cursor/skills/yss-cache/SKILL.md +5 -1
- package/template/.cursor/skills/yss-cache/references/source-index.boot2-java8.md +81 -0
- package/template/.cursor/skills/yss-cache/references/source-index.boot3-java17.md +83 -0
- package/template/.cursor/skills/yss-cache/references/source-index.md +6 -63
- package/template/.cursor/skills/yss-cache/scripts/check-skill-freshness.sh +20 -15
- package/template/.cursor/skills/yss-ddd-scaffold-generator/SKILL.md +2 -2
- package/template/.cursor/skills/yss-ddd-scaffold-generator/references/engineering-baseline.md +53 -0
- package/template/.cursor/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-parent/SKILL.md +5 -51
- package/template/.cursor/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-parent/agents/openai.yaml +3 -3
- package/template/.cursor/skills/yss-ddd-scaffold-generator/scripts/first-slice-verification.test.mjs +1 -1
- package/template/.cursor/skills/yss-ddd-scaffold-generator/scripts/generate_scaffold.mjs +2 -2
- package/template/.cursor/skills/yss-ddd-scaffold-generator/scripts/run_first_slice_verification.mjs +2 -3
- package/template/.cursor/skills/yss-ddd-scaffold-generator/scripts/run_scaffold_verification.mjs +1 -1
- package/template/.cursor/skills/yss-ddd-scaffold-generator/scripts/scaffold-generator.test.mjs +1 -1
- package/template/.cursor/skills/yss-distributed-id/SKILL.md +4 -0
- package/template/.cursor/skills/yss-distributed-id/references/source-index.boot2-java8.md +102 -0
- package/template/.cursor/skills/yss-distributed-id/references/source-index.boot3-java17.md +90 -0
- package/template/.cursor/skills/yss-distributed-id/references/source-index.md +6 -82
- package/template/.cursor/skills/yss-dto/SKILL.md +2 -2
- package/template/.cursor/skills/yss-dto/references/source-index.boot2-java8.md +67 -0
- package/template/.cursor/skills/yss-dto/references/source-index.boot3-java17.md +70 -0
- package/template/.cursor/skills/yss-dto/references/source-index.md +6 -51
- package/template/.cursor/skills/yss-excel-mvc/SKILL.md +4 -0
- package/template/.cursor/skills/yss-excel-mvc/references/source-index.boot2-java8.md +90 -0
- package/template/.cursor/skills/yss-excel-mvc/references/source-index.boot3-java17.md +58 -0
- package/template/.cursor/skills/yss-excel-mvc/references/source-index.md +6 -70
- package/template/.cursor/skills/yss-exception/SKILL.md +12 -9
- package/template/.cursor/skills/yss-exception/references/source-index.boot2-java8.md +50 -0
- package/template/.cursor/skills/yss-exception/references/source-index.boot3-java17.md +50 -0
- package/template/.cursor/skills/yss-exception/references/source-index.md +6 -31
- package/template/.cursor/skills/yss-implementation-contract-compiler/SKILL.md +2 -0
- package/template/.cursor/skills/yss-implementation-contract-compiler/references/boundaries.md +3 -5
- package/template/.cursor/skills/yss-implementation-contract-compiler/references/compiler-contract.yaml +27 -2
- package/template/.cursor/skills/yss-implementation-contract-compiler/references/yss-skill-execution-result.md +2 -1
- package/template/.cursor/skills/yss-implementation-contract-compiler/tests/compiler-scenarios.test.mjs +60 -14
- package/template/.cursor/skills/yss-layered-mvc-scaffold-generator/SKILL.md +6 -5
- package/template/.cursor/skills/yss-layered-mvc-scaffold-generator/agents/openai.yaml +2 -2
- package/template/.cursor/skills/yss-layered-mvc-scaffold-generator/references/architecture.md +2 -0
- package/template/.cursor/skills/yss-layered-mvc-scaffold-generator/scripts/data-analysis-profile.mjs +82 -0
- package/template/.cursor/skills/yss-layered-mvc-scaffold-generator/scripts/generate_scaffold.mjs +23 -9
- package/template/.cursor/skills/yss-layered-mvc-scaffold-generator/scripts/scaffold-generator.test.mjs +30 -6
- package/template/.cursor/skills/yss-layered-mvc-scaffold-generator/tests/scaffold-generator.test.mjs +2 -0
- package/template/.cursor/skills/yss-mvc-data-analysis-project-initializer/SKILL.md +5 -15
- package/template/.cursor/skills/yss-mvc-data-analysis-project-initializer/scripts/generate_project.mjs +9 -68
- package/template/.cursor/skills/yss-mvc-design/SKILL.md +5 -9
- package/template/.cursor/skills/yss-mvc-design/agents/openai.yaml +3 -3
- package/template/.cursor/skills/yss-mybatis/SKILL.md +2 -2
- package/template/.cursor/skills/yss-mybatis/references/source-index.boot2-java8.md +126 -0
- package/template/.cursor/skills/yss-mybatis/references/source-index.boot3-java17.md +126 -0
- package/template/.cursor/skills/yss-mybatis/references/source-index.md +6 -109
- package/template/.cursor/skills/yss-product-lifecycle/references/orchestration-contract.yaml +10 -8
- package/template/.cursor/skills/yss-product-lifecycle/references/orchestration.md +2 -2
- package/template/.cursor/skills/yss-repository/SKILL.md +1 -1
- package/template/.cursor/skills/yss-resilience4j/SKILL.md +4 -0
- package/template/.cursor/skills/yss-resilience4j/references/source-index.boot2-java8.md +48 -0
- package/template/.cursor/skills/yss-resilience4j/references/source-index.boot3-java17.md +48 -0
- package/template/.cursor/skills/yss-resilience4j/references/source-index.md +6 -29
- package/template/.cursor/skills/yss-security-algorithm/SKILL.md +34 -10
- package/template/.cursor/skills/yss-security-algorithm/references/source-index.boot2-java8.md +50 -0
- package/template/.cursor/skills/yss-security-algorithm/references/source-index.boot3-java17.md +51 -0
- package/template/.cursor/skills/yss-security-algorithm/references/source-index.md +6 -31
- package/template/.cursor/skills/yss-skill-source-index-refresh/SKILL.md +12 -6
- package/template/.cursor/skills/yss-skill-source-index-refresh/references/backend-component-platform-compatibility.md +27 -0
- package/template/.cursor/skills/yss-skill-source-index-refresh/references/source-location.md +4 -4
- package/template/.cursor/skills/yss-skill-source-index-refresh/references/source-map-config.md +10 -3
- package/template/.cursor/skills/yss-skill-source-index-refresh/scripts/check-backend-skill-source-index.mjs +60 -0
- package/template/.cursor/skills/yss-skill-source-index-refresh/scripts/refresh-yss-skill-index.mjs +247 -54
- package/template/.cursor/skills/yss-skill-source-index-refresh/scripts/refresh-yss-skill-index.test.mjs +74 -7
- package/template/.cursor/skills/yss-tactical-design/SKILL.md +1 -1
- package/template/.cursor/skills/yss-tactical-design/references/output-template.md +1 -1
- package/template/.cursor/skills/yss-technical-design/SKILL.md +3 -1
- package/template/.cursor/skills/yss-technical-design/references/mvc-design.schema.json +315 -0
- package/template/.cursor/skills/yss-technical-design/references/technical-design-contract.md +1 -1
- package/template/.cursor/skills/yss-technical-design/scripts/generate-schema.mjs +1 -1
- package/template/.cursor/skills/yss-technical-design/tests/run-scenarios.mjs +4 -1
- package/template/.cursor/skills/yss-up-springboot3/SKILL.md +23 -9
- package/template/.cursor/skills/yss-userinfo/SKILL.md +21 -14
- package/template/.cursor/skills/yss-userinfo/references/source-index.boot2-java8.md +49 -0
- package/template/.cursor/skills/yss-userinfo/references/source-index.boot3-java17.md +54 -0
- package/template/.cursor/skills/yss-userinfo/references/source-index.md +6 -30
- package/template/.cursor/skills/yss-validation/SKILL.md +12 -17
- package/template/.cursor/skills/yss-validation/references/source-index.boot2-java8.md +47 -0
- package/template/.cursor/skills/yss-validation/references/source-index.boot3-java17.md +47 -0
- package/template/.cursor/skills/yss-validation/references/source-index.md +6 -29
- package/template/.cursor/skills/yss-web-controller/SKILL.md +4 -4
- package/template/.cursor/skills/yss-web-controller/scripts/generate_controller.test.mjs +1 -1
- package/template/.pi/skills/yss-application/SKILL.md +8 -6
- package/template/.pi/skills/yss-audit-log/SKILL.md +12 -7
- package/template/.pi/skills/yss-audit-log/references/source-index.boot2-java8.md +57 -0
- package/template/.pi/skills/yss-audit-log/references/source-index.boot3-java17.md +58 -0
- package/template/.pi/skills/yss-audit-log/references/source-index.md +6 -39
- package/template/.pi/skills/yss-cache/SKILL.md +5 -1
- package/template/.pi/skills/yss-cache/references/source-index.boot2-java8.md +81 -0
- package/template/.pi/skills/yss-cache/references/source-index.boot3-java17.md +83 -0
- package/template/.pi/skills/yss-cache/references/source-index.md +6 -63
- package/template/.pi/skills/yss-cache/scripts/check-skill-freshness.sh +20 -15
- package/template/.pi/skills/yss-ddd-scaffold-generator/SKILL.md +2 -2
- package/template/.pi/skills/yss-ddd-scaffold-generator/references/engineering-baseline.md +53 -0
- package/template/.pi/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-parent/SKILL.md +5 -51
- package/template/.pi/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-parent/agents/openai.yaml +3 -3
- package/template/.pi/skills/yss-ddd-scaffold-generator/scripts/first-slice-verification.test.mjs +1 -1
- package/template/.pi/skills/yss-ddd-scaffold-generator/scripts/generate_scaffold.mjs +2 -2
- package/template/.pi/skills/yss-ddd-scaffold-generator/scripts/run_first_slice_verification.mjs +2 -3
- package/template/.pi/skills/yss-ddd-scaffold-generator/scripts/run_scaffold_verification.mjs +1 -1
- package/template/.pi/skills/yss-ddd-scaffold-generator/scripts/scaffold-generator.test.mjs +1 -1
- package/template/.pi/skills/yss-distributed-id/SKILL.md +4 -0
- package/template/.pi/skills/yss-distributed-id/references/source-index.boot2-java8.md +102 -0
- package/template/.pi/skills/yss-distributed-id/references/source-index.boot3-java17.md +90 -0
- package/template/.pi/skills/yss-distributed-id/references/source-index.md +6 -82
- package/template/.pi/skills/yss-dto/SKILL.md +2 -2
- package/template/.pi/skills/yss-dto/references/source-index.boot2-java8.md +67 -0
- package/template/.pi/skills/yss-dto/references/source-index.boot3-java17.md +70 -0
- package/template/.pi/skills/yss-dto/references/source-index.md +6 -51
- package/template/.pi/skills/yss-excel-mvc/SKILL.md +4 -0
- package/template/.pi/skills/yss-excel-mvc/references/source-index.boot2-java8.md +90 -0
- package/template/.pi/skills/yss-excel-mvc/references/source-index.boot3-java17.md +58 -0
- package/template/.pi/skills/yss-excel-mvc/references/source-index.md +6 -70
- package/template/.pi/skills/yss-exception/SKILL.md +12 -9
- package/template/.pi/skills/yss-exception/references/source-index.boot2-java8.md +50 -0
- package/template/.pi/skills/yss-exception/references/source-index.boot3-java17.md +50 -0
- package/template/.pi/skills/yss-exception/references/source-index.md +6 -31
- package/template/.pi/skills/yss-implementation-contract-compiler/SKILL.md +2 -0
- package/template/.pi/skills/yss-implementation-contract-compiler/references/boundaries.md +3 -5
- package/template/.pi/skills/yss-implementation-contract-compiler/references/compiler-contract.yaml +27 -2
- package/template/.pi/skills/yss-implementation-contract-compiler/references/yss-skill-execution-result.md +2 -1
- package/template/.pi/skills/yss-implementation-contract-compiler/tests/compiler-scenarios.test.mjs +60 -14
- package/template/.pi/skills/yss-layered-mvc-scaffold-generator/SKILL.md +6 -5
- package/template/.pi/skills/yss-layered-mvc-scaffold-generator/agents/openai.yaml +2 -2
- package/template/.pi/skills/yss-layered-mvc-scaffold-generator/references/architecture.md +2 -0
- package/template/.pi/skills/yss-layered-mvc-scaffold-generator/scripts/data-analysis-profile.mjs +82 -0
- package/template/.pi/skills/yss-layered-mvc-scaffold-generator/scripts/generate_scaffold.mjs +23 -9
- package/template/.pi/skills/yss-layered-mvc-scaffold-generator/scripts/scaffold-generator.test.mjs +30 -6
- package/template/.pi/skills/yss-layered-mvc-scaffold-generator/tests/scaffold-generator.test.mjs +2 -0
- package/template/.pi/skills/yss-mvc-data-analysis-project-initializer/SKILL.md +5 -15
- package/template/.pi/skills/yss-mvc-data-analysis-project-initializer/scripts/generate_project.mjs +9 -68
- package/template/.pi/skills/yss-mvc-design/SKILL.md +5 -9
- package/template/.pi/skills/yss-mvc-design/agents/openai.yaml +3 -3
- package/template/.pi/skills/yss-mybatis/SKILL.md +2 -2
- package/template/.pi/skills/yss-mybatis/references/source-index.boot2-java8.md +126 -0
- package/template/.pi/skills/yss-mybatis/references/source-index.boot3-java17.md +126 -0
- package/template/.pi/skills/yss-mybatis/references/source-index.md +6 -109
- package/template/.pi/skills/yss-product-lifecycle/references/orchestration-contract.yaml +10 -8
- package/template/.pi/skills/yss-product-lifecycle/references/orchestration.md +2 -2
- package/template/.pi/skills/yss-repository/SKILL.md +1 -1
- package/template/.pi/skills/yss-resilience4j/SKILL.md +4 -0
- package/template/.pi/skills/yss-resilience4j/references/source-index.boot2-java8.md +48 -0
- package/template/.pi/skills/yss-resilience4j/references/source-index.boot3-java17.md +48 -0
- package/template/.pi/skills/yss-resilience4j/references/source-index.md +6 -29
- package/template/.pi/skills/yss-security-algorithm/SKILL.md +34 -10
- package/template/.pi/skills/yss-security-algorithm/references/source-index.boot2-java8.md +50 -0
- package/template/.pi/skills/yss-security-algorithm/references/source-index.boot3-java17.md +51 -0
- package/template/.pi/skills/yss-security-algorithm/references/source-index.md +6 -31
- package/template/.pi/skills/yss-skill-source-index-refresh/SKILL.md +12 -6
- package/template/.pi/skills/yss-skill-source-index-refresh/references/backend-component-platform-compatibility.md +27 -0
- package/template/.pi/skills/yss-skill-source-index-refresh/references/source-location.md +4 -4
- package/template/.pi/skills/yss-skill-source-index-refresh/references/source-map-config.md +10 -3
- package/template/.pi/skills/yss-skill-source-index-refresh/scripts/check-backend-skill-source-index.mjs +60 -0
- package/template/.pi/skills/yss-skill-source-index-refresh/scripts/refresh-yss-skill-index.mjs +247 -54
- package/template/.pi/skills/yss-skill-source-index-refresh/scripts/refresh-yss-skill-index.test.mjs +74 -7
- package/template/.pi/skills/yss-tactical-design/SKILL.md +1 -1
- package/template/.pi/skills/yss-tactical-design/references/output-template.md +1 -1
- package/template/.pi/skills/yss-technical-design/SKILL.md +3 -1
- package/template/.pi/skills/yss-technical-design/references/mvc-design.schema.json +315 -0
- package/template/.pi/skills/yss-technical-design/references/technical-design-contract.md +1 -1
- package/template/.pi/skills/yss-technical-design/scripts/generate-schema.mjs +1 -1
- package/template/.pi/skills/yss-technical-design/tests/run-scenarios.mjs +4 -1
- package/template/.pi/skills/yss-up-springboot3/SKILL.md +23 -9
- package/template/.pi/skills/yss-userinfo/SKILL.md +21 -14
- package/template/.pi/skills/yss-userinfo/references/source-index.boot2-java8.md +49 -0
- package/template/.pi/skills/yss-userinfo/references/source-index.boot3-java17.md +54 -0
- package/template/.pi/skills/yss-userinfo/references/source-index.md +6 -30
- package/template/.pi/skills/yss-validation/SKILL.md +12 -17
- package/template/.pi/skills/yss-validation/references/source-index.boot2-java8.md +47 -0
- package/template/.pi/skills/yss-validation/references/source-index.boot3-java17.md +47 -0
- package/template/.pi/skills/yss-validation/references/source-index.md +6 -29
- package/template/.pi/skills/yss-web-controller/SKILL.md +4 -4
- package/template/.pi/skills/yss-web-controller/scripts/generate_controller.test.mjs +1 -1
- package/template/docs/agents/backend-architecture-profiles.md +1 -1
- package/template/docs/agents/digital-human-roles.yaml +1 -1
- package/template/docs/agents/skill-migrations.md +23 -0
- package/template/docs/agents/yss-skill-registry.yaml +109 -40
- package/template/docs/api/templates/openapi-draft-review-checklist.md +1 -1
- package/template/docs/architecture/templates/engineering-baseline-review-template.md +3 -3
- package/template/docs/architecture/templates/system-overview-design-template.md +1 -1
- package/template/docs/engineering/backend-platforms.json +662 -9
- package/template/docs/engineering/backend-platforms.md +33 -7
- package/template/docs/process/schemas/backend-architecture-identity.schema.json +102 -0
- package/template/docs/process/schemas/project-scaffold-contract.schema.json +16 -4
- package/template/docs/process/schemas/scaffold-architecture-decisions.schema.json +7 -0
- package/template/docs/process/schemas/slice-implementation-contract-v3.schema.json +143 -0
- package/template/docs/process/strategic-handoff-package.md +1 -1
- package/template/docs/templates/implementation-routing-template.md +1 -1
- package/template/docs/user-guide//346/212/200/346/234/257/350/256/276/350/256/241/347/224/250/346/210/267/346/214/207/345/215/227.md +2 -2
- package/template/scripts/backend-platforms +77 -8
- package/template/scripts/lib/backend-platform.mjs +232 -5
- package/template/scripts/lib/existing-backend-architecture.mjs +3 -2
- package/template/scripts/lib/implementation-contract-compiler.mjs +93 -9
- package/template/scripts/lib/skill-registry.mjs +165 -12
- package/template/scripts/lib/slice-contract-preparation.mjs +6 -5
- package/template/scripts/verify-backend-platform-matrix +1 -1
- package/template/skills-lock.json +29 -29
- package/template.snapshot.json +5 -5
package/template/.codex/skills/yss-skill-source-index-refresh/scripts/refresh-yss-skill-index.mjs
CHANGED
|
@@ -2,11 +2,10 @@
|
|
|
2
2
|
import { createHash } from "node:crypto";
|
|
3
3
|
import { execFileSync } from "node:child_process";
|
|
4
4
|
import { access, mkdir, readFile, readdir, writeFile } from "node:fs/promises";
|
|
5
|
-
import os from "node:os";
|
|
6
5
|
import path from "node:path";
|
|
7
6
|
import { fileURLToPath } from "node:url";
|
|
8
7
|
|
|
9
|
-
const BACKEND = {
|
|
8
|
+
export const BACKEND = {
|
|
10
9
|
"yss-cache": ["yss-microservice-components/yss-component-cache-parent"],
|
|
11
10
|
"yss-mybatis": ["yss-microservice-components/yss-component-persistence"],
|
|
12
11
|
"yss-dto": ["yss-microservice-components/yss-component-dto"],
|
|
@@ -20,15 +19,41 @@ const BACKEND = {
|
|
|
20
19
|
"yss-microservice-components/yss-component-leaf",
|
|
21
20
|
],
|
|
22
21
|
"yss-resilience4j": ["yss-microservice-components/yss-component-resilience4j-starter"],
|
|
23
|
-
"yss-validation": [
|
|
24
|
-
"yss-microservice-components/yss-component-validation-engine-parent",
|
|
25
|
-
"yss-microservice-components/yss-component-validation-jsr303",
|
|
26
|
-
],
|
|
22
|
+
"yss-validation": ["yss-microservice-components/yss-component-validation-jsr303"],
|
|
27
23
|
"yss-security-algorithm": ["yss-microservice-components/yss-component-security-algorithm"],
|
|
28
24
|
"yss-userinfo": ["yss-microservice-components/yss-component-userinfo-starter"],
|
|
29
25
|
"yss-exception": ["yss-microservice-components/yss-component-exception"],
|
|
30
26
|
};
|
|
31
27
|
|
|
28
|
+
export const BACKEND_PLATFORM_LINES = Object.freeze({
|
|
29
|
+
"boot2-java8": Object.freeze({
|
|
30
|
+
env: "YSS_SOURCE_ROOT_BOOT2_JAVA8",
|
|
31
|
+
label: "Spring Boot 2.7 / Java 8 maintenance line",
|
|
32
|
+
}),
|
|
33
|
+
"boot3-java17": Object.freeze({
|
|
34
|
+
env: "YSS_SOURCE_ROOT_BOOT3_JAVA17",
|
|
35
|
+
label: "Spring Boot 3.5 / Java 17 mainline",
|
|
36
|
+
}),
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
const BACKEND_PATH_OVERRIDES = Object.freeze({
|
|
40
|
+
"boot2-java8": Object.freeze({}),
|
|
41
|
+
"boot3-java17": Object.freeze({
|
|
42
|
+
"yss-excel-mvc": Object.freeze(["yss-microservice-components/yss-component-excel-mvc"]),
|
|
43
|
+
}),
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
export function backendComponentPaths(skill, platformLine) {
|
|
47
|
+
if (!BACKEND_PLATFORM_LINES[platformLine]) throw new TypeError(`unknown backend component platform line: ${platformLine}`);
|
|
48
|
+
if (!BACKEND[skill]) throw new TypeError(`unknown backend component skill: ${skill}`);
|
|
49
|
+
return BACKEND_PATH_OVERRIDES[platformLine][skill] ?? BACKEND[skill];
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export function backendPlatformIndexPath(skillsRoot, skill, platformLine) {
|
|
53
|
+
if (!BACKEND_PLATFORM_LINES[platformLine]) throw new TypeError(`unknown backend component platform line: ${platformLine}`);
|
|
54
|
+
return path.join(skillsRoot, skill, "references", `source-index.${platformLine}.md`);
|
|
55
|
+
}
|
|
56
|
+
|
|
32
57
|
const FRONTEND = {
|
|
33
58
|
"yss-ui": ["components", "hooks", "skills"],
|
|
34
59
|
"yss-hook": ["hooks"],
|
|
@@ -165,42 +190,23 @@ export function sourceState(root, componentPaths) {
|
|
|
165
190
|
}
|
|
166
191
|
}
|
|
167
192
|
|
|
168
|
-
async function
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
const candidates = [
|
|
177
|
-
process.cwd(),
|
|
178
|
-
...ancestors(process.cwd()),
|
|
179
|
-
path.join(home, "Documents/yss-project/yss-cloud-microservice"),
|
|
180
|
-
path.join(home, "Documents/yss-project"),
|
|
181
|
-
path.join(home, "Projects/yss-cloud-microservice"),
|
|
182
|
-
path.join(home, "Projects"),
|
|
183
|
-
];
|
|
184
|
-
for (const base of [path.join(home, "Projects"), path.join(home, "Documents"), path.join(home, "Documents/yss-project")]) {
|
|
185
|
-
if (!await exists(base)) continue;
|
|
186
|
-
for (const entry of await readdir(base, { withFileTypes: true })) {
|
|
187
|
-
if (entry.isDirectory()) candidates.push(path.join(base, entry.name));
|
|
193
|
+
async function configuredSourceRoots() {
|
|
194
|
+
const entries = [];
|
|
195
|
+
for (const [platformLine, contract] of Object.entries(BACKEND_PLATFORM_LINES)) {
|
|
196
|
+
const configured = process.env[contract.env];
|
|
197
|
+
if (!configured) continue;
|
|
198
|
+
const root = path.resolve(configured);
|
|
199
|
+
if (!await exists(path.join(root, "yss-microservice-components"))) {
|
|
200
|
+
throw new Error(`${contract.env} must point to the repository root containing \`yss-microservice-components\`: ${root}`);
|
|
188
201
|
}
|
|
202
|
+
entries.push([platformLine, root]);
|
|
189
203
|
}
|
|
190
|
-
|
|
191
|
-
|
|
204
|
+
if (entries.length === Object.keys(BACKEND_PLATFORM_LINES).length) return Object.fromEntries(entries);
|
|
205
|
+
if (entries.length) {
|
|
206
|
+
const missing = Object.values(BACKEND_PLATFORM_LINES).filter((item) => !process.env[item.env]).map((item) => item.env);
|
|
207
|
+
throw new Error(`dual-track refresh requires both backend source roots; missing ${missing.join(", ")}`);
|
|
192
208
|
}
|
|
193
|
-
throw new Error(
|
|
194
|
-
}
|
|
195
|
-
|
|
196
|
-
function ancestors(start) {
|
|
197
|
-
const output = [];
|
|
198
|
-
let current = path.resolve(start);
|
|
199
|
-
while (path.dirname(current) !== current) {
|
|
200
|
-
current = path.dirname(current);
|
|
201
|
-
output.push(current);
|
|
202
|
-
}
|
|
203
|
-
return output;
|
|
209
|
+
throw new Error(`Set both ${Object.values(BACKEND_PLATFORM_LINES).map((item) => item.env).join(" and ")} to clean, generation-specific YSS source roots.`);
|
|
204
210
|
}
|
|
205
211
|
|
|
206
212
|
async function files(bases) {
|
|
@@ -210,13 +216,170 @@ async function files(bases) {
|
|
|
210
216
|
if (DOCS.has(path.basename(target))) output.docs.push(target);
|
|
211
217
|
else if (path.basename(target) === "pom.xml") output.poms.push(target);
|
|
212
218
|
else if (target.endsWith(".java") && target.includes(`${path.sep}src${path.sep}main${path.sep}java${path.sep}`)) output.java.push(target);
|
|
213
|
-
else if (path.basename(target)
|
|
219
|
+
else if (["spring.factories", "org.springframework.boot.autoconfigure.AutoConfiguration.imports"].includes(path.basename(target))) output.metadata.push(target);
|
|
214
220
|
}
|
|
215
221
|
}
|
|
216
222
|
for (const items of Object.values(output)) items.sort();
|
|
217
223
|
return output;
|
|
218
224
|
}
|
|
219
225
|
|
|
226
|
+
function xmlText(contents, tag) {
|
|
227
|
+
const match = contents.match(new RegExp(`<${tag}(?:\\s[^>]*)?>([\\s\\S]*?)<\\/${tag}>`));
|
|
228
|
+
return match ? match[1].trim() : null;
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
function xmlSection(contents, tag) {
|
|
232
|
+
const match = contents.match(new RegExp(`<${tag}(?:\\s[^>]*)?>[\\s\\S]*?<\\/${tag}>`));
|
|
233
|
+
return match?.[0] ?? null;
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
function xmlProperties(contents) {
|
|
237
|
+
const block = xmlText(contents, "properties");
|
|
238
|
+
if (!block) return {};
|
|
239
|
+
return Object.fromEntries([...block.matchAll(/<([A-Za-z0-9_.-]+)(?:\s[^>]*)?>([^<]*)<\/\1>/g)]
|
|
240
|
+
.map((match) => [match[1], match[2].trim()]));
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
function pomCoordinateText(contents, tag) {
|
|
244
|
+
let direct = contents;
|
|
245
|
+
for (const nested of ["parent", "properties", "modules", "dependencyManagement", "dependencies", "build", "profiles", "repositories", "pluginRepositories", "distributionManagement", "reporting"]) {
|
|
246
|
+
direct = direct.replace(new RegExp(`<${nested}(?:\\s[^>]*)?>[\\s\\S]*?<\\/${nested}>`, "g"), "");
|
|
247
|
+
}
|
|
248
|
+
return xmlText(direct, tag);
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
function resolveProperties(value, properties) {
|
|
252
|
+
let result = value;
|
|
253
|
+
for (let round = 0; result && round < 8; round += 1) {
|
|
254
|
+
const next = result.replace(/\$\{([^}]+)\}/g, (whole, key) => properties[key] ?? whole);
|
|
255
|
+
if (next === result) break;
|
|
256
|
+
result = next;
|
|
257
|
+
}
|
|
258
|
+
return result;
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
export async function assertSourcePlatformLine(source, platformLine) {
|
|
262
|
+
if (!BACKEND_PLATFORM_LINES[platformLine]) throw new TypeError(`unknown backend component platform line: ${platformLine}`);
|
|
263
|
+
const rootPom = path.join(source, "pom.xml");
|
|
264
|
+
if (!await exists(rootPom)) throw new Error(`backend source root has no pom.xml: ${source}`);
|
|
265
|
+
const contents = (await readFile(rootPom, "utf8")).replace(/<!--[\s\S]*?-->/g, "");
|
|
266
|
+
const parent = xmlSection(contents, "parent");
|
|
267
|
+
const parentVersion = parent ? xmlText(parent, "version") : null;
|
|
268
|
+
const properties = {
|
|
269
|
+
...xmlProperties(contents),
|
|
270
|
+
"project.parent.version": parentVersion,
|
|
271
|
+
"parent.version": parentVersion,
|
|
272
|
+
};
|
|
273
|
+
const javaVersion = resolveProperties(properties["java.version"] ?? properties["maven.compiler.release"] ?? properties["maven.compiler.source"], properties);
|
|
274
|
+
const bootVersion = resolveProperties(properties["spring-boot.version"] ?? parentVersion, properties);
|
|
275
|
+
const matches = platformLine === "boot2-java8"
|
|
276
|
+
? /^(?:1\.)?8(?:\D|$)/.test(javaVersion ?? "") && /^2\./.test(bootVersion ?? "")
|
|
277
|
+
: /^17(?:\D|$)/.test(javaVersion ?? "") && /^3\./.test(bootVersion ?? "");
|
|
278
|
+
if (!matches) throw new Error(`source root does not match ${platformLine}: java=${javaVersion ?? "unknown"}, spring-boot=${bootVersion ?? "unknown"}`);
|
|
279
|
+
return { platformLine, javaVersion, bootVersion };
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
async function pomLineage(source, target, seen = new Set()) {
|
|
283
|
+
const normalized = path.resolve(target);
|
|
284
|
+
if (seen.has(normalized) || !await exists(normalized)) return [];
|
|
285
|
+
seen.add(normalized);
|
|
286
|
+
const contents = (await readFile(normalized, "utf8")).replace(/<!--[\s\S]*?-->/g, "");
|
|
287
|
+
const parent = xmlSection(contents, "parent");
|
|
288
|
+
let inherited = [];
|
|
289
|
+
if (parent && !/<relativePath\s*\/>/.test(parent)) {
|
|
290
|
+
const relativePath = xmlText(parent, "relativePath") ?? "../pom.xml";
|
|
291
|
+
const parentPath = path.resolve(path.dirname(normalized), relativePath);
|
|
292
|
+
const withinSource = path.relative(source, parentPath);
|
|
293
|
+
if (!withinSource.startsWith("..") && !path.isAbsolute(withinSource)) inherited = await pomLineage(source, parentPath, seen);
|
|
294
|
+
}
|
|
295
|
+
const body = parent ? contents.replace(parent, "") : contents;
|
|
296
|
+
const parentCoordinates = parent ? {
|
|
297
|
+
groupId: xmlText(parent, "groupId"),
|
|
298
|
+
artifactId: xmlText(parent, "artifactId"),
|
|
299
|
+
version: xmlText(parent, "version"),
|
|
300
|
+
} : {};
|
|
301
|
+
return [...inherited, {
|
|
302
|
+
path: relative(source, normalized),
|
|
303
|
+
groupId: pomCoordinateText(body, "groupId"),
|
|
304
|
+
artifactId: pomCoordinateText(body, "artifactId"),
|
|
305
|
+
version: pomCoordinateText(body, "version"),
|
|
306
|
+
parent: parentCoordinates,
|
|
307
|
+
properties: xmlProperties(contents),
|
|
308
|
+
}];
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
async function mavenAndPlatformFacts(source, pomFiles, javaFiles, metadataFiles) {
|
|
312
|
+
const gavLines = [];
|
|
313
|
+
const javaVersions = new Set();
|
|
314
|
+
const bootVersions = new Set();
|
|
315
|
+
for (const target of pomFiles) {
|
|
316
|
+
const lineage = await pomLineage(source, target);
|
|
317
|
+
const inheritedProperties = {};
|
|
318
|
+
for (const item of lineage) {
|
|
319
|
+
const itemParent = item.parent ?? {};
|
|
320
|
+
const itemResolution = {
|
|
321
|
+
...inheritedProperties,
|
|
322
|
+
...item.properties,
|
|
323
|
+
"project.groupId": item.groupId ?? itemParent.groupId,
|
|
324
|
+
"project.artifactId": item.artifactId,
|
|
325
|
+
"project.version": item.version ?? itemParent.version,
|
|
326
|
+
"project.parent.groupId": itemParent.groupId,
|
|
327
|
+
"project.parent.artifactId": itemParent.artifactId,
|
|
328
|
+
"project.parent.version": itemParent.version,
|
|
329
|
+
"parent.groupId": itemParent.groupId,
|
|
330
|
+
"parent.artifactId": itemParent.artifactId,
|
|
331
|
+
"parent.version": itemParent.version,
|
|
332
|
+
};
|
|
333
|
+
for (const [key, value] of Object.entries(item.properties)) inheritedProperties[key] = resolveProperties(value, itemResolution);
|
|
334
|
+
}
|
|
335
|
+
const current = lineage.at(-1) ?? {};
|
|
336
|
+
const parent = current.parent ?? {};
|
|
337
|
+
const properties = {
|
|
338
|
+
...inheritedProperties,
|
|
339
|
+
"project.groupId": current.groupId ?? parent.groupId,
|
|
340
|
+
"project.artifactId": current.artifactId,
|
|
341
|
+
"project.version": current.version ?? parent.version,
|
|
342
|
+
"project.parent.groupId": parent.groupId,
|
|
343
|
+
"project.parent.artifactId": parent.artifactId,
|
|
344
|
+
"project.parent.version": parent.version,
|
|
345
|
+
"parent.groupId": parent.groupId,
|
|
346
|
+
"parent.artifactId": parent.artifactId,
|
|
347
|
+
"parent.version": parent.version,
|
|
348
|
+
};
|
|
349
|
+
const groupId = resolveProperties(current.groupId ?? parent.groupId ?? "unknown", properties);
|
|
350
|
+
const artifactId = resolveProperties(current.artifactId ?? "unknown", properties);
|
|
351
|
+
const version = resolveProperties(current.version ?? parent.version ?? "unknown", properties);
|
|
352
|
+
const parentGav = parent.artifactId
|
|
353
|
+
? `${resolveProperties(parent.groupId ?? "unknown", properties)}:${resolveProperties(parent.artifactId, properties)}:${resolveProperties(parent.version ?? "unknown", properties)}`
|
|
354
|
+
: "none";
|
|
355
|
+
gavLines.push(`- \`${relative(source, target)}\` — GAV \`${groupId}:${artifactId}:${version}\`; parent \`${parentGav}\``);
|
|
356
|
+
const javaVersion = inheritedProperties["java.version"] ?? inheritedProperties["maven.compiler.release"] ?? inheritedProperties["maven.compiler.source"];
|
|
357
|
+
const bootVersion = inheritedProperties["spring-boot.version"]
|
|
358
|
+
?? (parent.groupId === "org.springframework.boot" ? parent.version : null);
|
|
359
|
+
if (javaVersion) javaVersions.add(resolveProperties(javaVersion, properties));
|
|
360
|
+
if (bootVersion) bootVersions.add(resolveProperties(bootVersion, properties));
|
|
361
|
+
}
|
|
362
|
+
let javaxFiles = 0;
|
|
363
|
+
let jakartaFiles = 0;
|
|
364
|
+
for (const target of javaFiles) {
|
|
365
|
+
const contents = await readFile(target, "utf8");
|
|
366
|
+
if (/\b(?:import|extends|implements|new)\s+javax\.|\bjavax\./.test(contents)) javaxFiles += 1;
|
|
367
|
+
if (/\b(?:import|extends|implements|new)\s+jakarta\.|\bjakarta\./.test(contents)) jakartaFiles += 1;
|
|
368
|
+
}
|
|
369
|
+
const springFactories = metadataFiles.filter((target) => path.basename(target) === "spring.factories").length;
|
|
370
|
+
const autoConfigurationImports = metadataFiles.filter((target) => path.basename(target) === "org.springframework.boot.autoconfigure.AutoConfiguration.imports").length;
|
|
371
|
+
return {
|
|
372
|
+
gavLines,
|
|
373
|
+
platformLines: [
|
|
374
|
+
`- Inherited Java signals: ${javaVersions.size ? [...javaVersions].map((item) => `\`${item}\``).join(", ") : "not declared in the local POM lineage"}.`,
|
|
375
|
+
`- Inherited Spring Boot signals: ${bootVersions.size ? [...bootVersions].map((item) => `\`${item}\``).join(", ") : "not declared in the local POM lineage"}.`,
|
|
376
|
+
`- Namespace source signals: \`javax.*\` in ${javaxFiles} main Java files; \`jakarta.*\` in ${jakartaFiles} main Java files.`,
|
|
377
|
+
`- Auto-configuration metadata: ${springFactories} \`spring.factories\`; ${autoConfigurationImports} \`AutoConfiguration.imports\` files.`,
|
|
378
|
+
"- These are source observations, not compatibility certification. Use the approved `platform_configuration` and verified compatibility evidence before integration or generation.",
|
|
379
|
+
],
|
|
380
|
+
};
|
|
381
|
+
}
|
|
382
|
+
|
|
220
383
|
async function sha256(target) {
|
|
221
384
|
return createHash("sha256").update(await readFile(target)).digest("hex");
|
|
222
385
|
}
|
|
@@ -278,7 +441,7 @@ async function mybatisCapabilityMatrix(source, javaFiles, metadataFiles) {
|
|
|
278
441
|
return output;
|
|
279
442
|
}
|
|
280
443
|
|
|
281
|
-
async function backendIndex({ skill, parts, source, found, now, stateResolver }) {
|
|
444
|
+
async function backendIndex({ skill, parts, source, platformLine, found, now, stateResolver }) {
|
|
282
445
|
const currentState = stateResolver(source, parts);
|
|
283
446
|
const bases = parts.map((item) => path.join(source, item));
|
|
284
447
|
const baseHints = await Promise.all(bases.map(async (target) =>
|
|
@@ -287,14 +450,17 @@ async function backendIndex({ skill, parts, source, found, now, stateResolver })
|
|
|
287
450
|
const treeLines = currentState.componentTrees.map(({ path: componentPath, tree }) =>
|
|
288
451
|
`Component tree \`${componentPath}\`: \`${tree}\``,
|
|
289
452
|
);
|
|
453
|
+
const facts = await mavenAndPlatformFacts(source, found.poms, found.java, found.metadata);
|
|
290
454
|
const lines = [
|
|
291
455
|
`# ${skill} Source Index`,
|
|
292
456
|
"",
|
|
457
|
+
"Index schema: `backend-component-source-index-v2`",
|
|
458
|
+
`Platform line: \`${platformLine}\``,
|
|
293
459
|
`Generated: ${now}`,
|
|
294
460
|
`Source commit: \`${currentState.commit}\``,
|
|
295
461
|
`Component worktree: \`${currentState.componentWorktree}\``,
|
|
296
462
|
...treeLines,
|
|
297
|
-
|
|
463
|
+
`Indexed source root: resolved at refresh time; set \`${BACKEND_PLATFORM_LINES[platformLine].env}\` to reproduce or refresh.`,
|
|
298
464
|
"",
|
|
299
465
|
"This file is generated by `yss-skill-source-index-refresh/scripts/refresh-yss-skill-index.mjs`. Do not hand-edit generated sections.",
|
|
300
466
|
"",
|
|
@@ -312,7 +478,11 @@ async function backendIndex({ skill, parts, source, found, now, stateResolver })
|
|
|
312
478
|
"",
|
|
313
479
|
"## Maven Modules",
|
|
314
480
|
"",
|
|
315
|
-
...
|
|
481
|
+
...(facts.gavLines.length ? facts.gavLines : ["- No Maven modules found."]),
|
|
482
|
+
"",
|
|
483
|
+
"## Platform Signals",
|
|
484
|
+
"",
|
|
485
|
+
...facts.platformLines,
|
|
316
486
|
"",
|
|
317
487
|
];
|
|
318
488
|
|
|
@@ -322,8 +492,9 @@ async function backendIndex({ skill, parts, source, found, now, stateResolver })
|
|
|
322
492
|
lines.push(
|
|
323
493
|
"## Freshness and Use",
|
|
324
494
|
"",
|
|
325
|
-
|
|
495
|
+
`- Locate the current source root using \`${BACKEND_PLATFORM_LINES[platformLine].env}\`, CodeGraph, Maven artifact names or repository search.`,
|
|
326
496
|
"- Compare each indexed `Component tree` with `git rev-parse HEAD:<component-path>` and require the current component subtree to be clean before exact guidance.",
|
|
497
|
+
`- Run \`node ../yss-skill-source-index-refresh/scripts/check-backend-skill-source-index.mjs --skill <skill-id> --platform-line ${platformLine} --source-root <root>\` from the canonical skill root before exact integration guidance.`,
|
|
327
498
|
"- A repository commit difference alone is not stale when the component tree is unchanged; a component tree mismatch or component-local dirty state is stale.",
|
|
328
499
|
"- Read only the source entries needed for the current decision or troubleshooting path.",
|
|
329
500
|
"",
|
|
@@ -333,7 +504,7 @@ async function backendIndex({ skill, parts, source, found, now, stateResolver })
|
|
|
333
504
|
|
|
334
505
|
export async function refresh({
|
|
335
506
|
skillsRoot,
|
|
336
|
-
|
|
507
|
+
sources,
|
|
337
508
|
now = new Date().toISOString(),
|
|
338
509
|
frontend = true,
|
|
339
510
|
backendSkills = Object.keys(BACKEND),
|
|
@@ -341,13 +512,35 @@ export async function refresh({
|
|
|
341
512
|
}) {
|
|
342
513
|
const unknownSkills = backendSkills.filter((skill) => !(skill in BACKEND));
|
|
343
514
|
if (unknownSkills.length) throw new Error(`Unknown backend source-index skill: ${unknownSkills.join(", ")}`);
|
|
515
|
+
const sourceEntries = Object.entries(sources ?? {});
|
|
516
|
+
const unknownLines = sourceEntries.filter(([platformLine]) => !BACKEND_PLATFORM_LINES[platformLine]).map(([platformLine]) => platformLine);
|
|
517
|
+
if (unknownLines.length) throw new Error(`Unknown backend platform line: ${unknownLines.join(", ")}`);
|
|
518
|
+
if (backendSkills.length && sourceEntries.length === 0) throw new Error("Backend source-index refresh requires at least one explicit platform source root.");
|
|
519
|
+
for (const [platformLine, source] of sourceEntries) await assertSourcePlatformLine(source, platformLine);
|
|
344
520
|
for (const skill of backendSkills) {
|
|
345
|
-
const
|
|
346
|
-
|
|
347
|
-
const
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
521
|
+
const referenceRoot = path.join(skillsRoot, skill, "references");
|
|
522
|
+
await mkdir(referenceRoot, { recursive: true });
|
|
523
|
+
for (const [platformLine, source] of sourceEntries) {
|
|
524
|
+
const parts = backendComponentPaths(skill, platformLine);
|
|
525
|
+
const bases = parts.map((item) => path.join(source, item));
|
|
526
|
+
const found = await files(bases);
|
|
527
|
+
const target = backendPlatformIndexPath(skillsRoot, skill, platformLine);
|
|
528
|
+
await writeFile(target, await backendIndex({ skill, parts, source, platformLine, found, now, stateResolver }), "utf8");
|
|
529
|
+
}
|
|
530
|
+
await writeFile(path.join(referenceRoot, "source-index.md"), [
|
|
531
|
+
`# ${skill} Source Index Router`,
|
|
532
|
+
"",
|
|
533
|
+
"Index schema: `backend-component-source-index-router-v1`",
|
|
534
|
+
"",
|
|
535
|
+
"Select the source index from the approved `platform_configuration.component_platform_line`; do not infer a line from imports, a branch name or a requested upgrade.",
|
|
536
|
+
"",
|
|
537
|
+
...Object.entries(BACKEND_PLATFORM_LINES).map(([platformLine, contract]) =>
|
|
538
|
+
`- \`${platformLine}\` — [${contract.label}](source-index.${platformLine}.md)`,
|
|
539
|
+
),
|
|
540
|
+
"",
|
|
541
|
+
"Run the freshness checker with the same explicit `--platform-line` and its matching clean source root before exact integration guidance.",
|
|
542
|
+
"",
|
|
543
|
+
].join("\n"), "utf8");
|
|
351
544
|
}
|
|
352
545
|
|
|
353
546
|
if (frontend) {
|
|
@@ -369,7 +562,7 @@ export async function refresh({
|
|
|
369
562
|
].join("\n"), "utf8");
|
|
370
563
|
}
|
|
371
564
|
}
|
|
372
|
-
return { backend: backendSkills.length, frontend: frontend ? Object.keys(FRONTEND).length : 0 };
|
|
565
|
+
return { backend: backendSkills.length, backendTracks: backendSkills.length * sourceEntries.length, frontend: frontend ? Object.keys(FRONTEND).length : 0 };
|
|
373
566
|
}
|
|
374
567
|
|
|
375
568
|
async function main() {
|
|
@@ -377,13 +570,13 @@ async function main() {
|
|
|
377
570
|
const script = path.dirname(fileURLToPath(import.meta.url));
|
|
378
571
|
const result = await refresh({
|
|
379
572
|
skillsRoot: path.resolve(process.env.YSS_SKILLS_ROOT || path.join(script, "../..")),
|
|
380
|
-
|
|
573
|
+
sources: await configuredSourceRoots(),
|
|
381
574
|
frontend: !["0", "false", "no"].includes((process.env.YSS_REFRESH_FRONTEND || "true").toLowerCase()),
|
|
382
575
|
backendSkills: process.env.YSS_REFRESH_BACKEND_SKILLS
|
|
383
576
|
? process.env.YSS_REFRESH_BACKEND_SKILLS.split(",").map((skill) => skill.trim()).filter(Boolean)
|
|
384
577
|
: Object.keys(BACKEND),
|
|
385
578
|
});
|
|
386
|
-
console.log(`Updated ${result.
|
|
579
|
+
console.log(`Updated ${result.backendTracks} backend platform indexes for ${result.backend} skills and ${result.frontend} frontend doc references.`);
|
|
387
580
|
} catch (error) {
|
|
388
581
|
console.error(error.message);
|
|
389
582
|
process.exitCode = 1;
|
|
@@ -4,15 +4,38 @@ import { mkdir, mkdtemp, readFile, writeFile } from "node:fs/promises";
|
|
|
4
4
|
import { tmpdir } from "node:os";
|
|
5
5
|
import path from "node:path";
|
|
6
6
|
import test from "node:test";
|
|
7
|
-
import { refresh, sourceState } from "./refresh-yss-skill-index.mjs";
|
|
7
|
+
import { BACKEND, backendComponentPaths, refresh, sourceState } from "./refresh-yss-skill-index.mjs";
|
|
8
|
+
import { checkBackendSkillSourceIndex } from "./check-backend-skill-source-index.mjs";
|
|
9
|
+
|
|
10
|
+
const platformPom = (javaVersion, bootVersion) => `<project><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>${bootVersion}</version><relativePath/></parent><artifactId>fixture</artifactId><version>1.0.0</version><properties><java.version>${javaVersion}</java.version><spring-boot.version>\${project.parent.version}</spring-boot.version></properties></project>`;
|
|
8
11
|
|
|
9
12
|
test("writes Node-labelled generated indexes", async () => {
|
|
10
|
-
const root=await mkdtemp(path.join(tmpdir(),"yss-index-")); const
|
|
11
|
-
|
|
13
|
+
const root=await mkdtemp(path.join(tmpdir(),"yss-index-")); const boot2=path.join(root,"boot2"); const boot3=path.join(root,"boot3"); const skills=path.join(root,"skills");
|
|
14
|
+
for (const [source, javaVersion, bootVersion] of [[boot2,"1.8","2.7.18"],[boot3,"17","3.5.16"]]) {
|
|
15
|
+
await mkdir(path.join(source,"yss-microservice-components/yss-component-cache-parent/src/main/java/demo"),{recursive:true});
|
|
16
|
+
await writeFile(path.join(source,"pom.xml"),platformPom(javaVersion,bootVersion));
|
|
17
|
+
await writeFile(path.join(source,"yss-microservice-components/yss-component-cache-parent/src/main/java/demo/CacheConfiguration.java"),"class CacheConfiguration {}");
|
|
18
|
+
}
|
|
12
19
|
for(const name of ["yss-cache","yss-ui"])await mkdir(path.join(skills,name),{recursive:true});
|
|
13
|
-
await refresh({skillsRoot:skills,
|
|
14
|
-
assert.match(await readFile(path.join(skills,"yss-cache/references/source-index.md"),"utf8"),/
|
|
20
|
+
await refresh({skillsRoot:skills,sources:{"boot2-java8":boot2,"boot3-java17":boot3},now:"2026-01-01T00:00:00Z"});
|
|
21
|
+
assert.match(await readFile(path.join(skills,"yss-cache/references/source-index.md"),"utf8"),/backend-component-source-index-router-v1/);
|
|
22
|
+
assert.match(await readFile(path.join(skills,"yss-cache/references/source-index.boot2-java8.md"),"utf8"),/Platform line: `boot2-java8`/);
|
|
23
|
+
assert.match(await readFile(path.join(skills,"yss-cache/references/source-index.boot3-java17.md"),"utf8"),/Platform line: `boot3-java17`/);
|
|
15
24
|
assert.match(await readFile(path.join(skills,"yss-ui/references/frontend-docs.md"),"utf8"),/components/);
|
|
25
|
+
await assert.rejects(
|
|
26
|
+
() => refresh({skillsRoot:skills,sources:{"boot3-java17":boot2},frontend:false,backendSkills:["yss-cache"]}),
|
|
27
|
+
/source root does not match boot3-java17/,
|
|
28
|
+
);
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
test("keeps generation-specific component path sets", () => {
|
|
32
|
+
assert.deepEqual(backendComponentPaths("yss-excel-mvc", "boot2-java8"), [
|
|
33
|
+
"yss-microservice-components/yss-component-excel-mvc",
|
|
34
|
+
"yss-microservice-components/yss-component-excel-starter",
|
|
35
|
+
]);
|
|
36
|
+
assert.deepEqual(backendComponentPaths("yss-excel-mvc", "boot3-java17"), [
|
|
37
|
+
"yss-microservice-components/yss-component-excel-mvc",
|
|
38
|
+
]);
|
|
16
39
|
});
|
|
17
40
|
|
|
18
41
|
test("writes a source-backed MyBatis capability matrix without absolute paths", async () => {
|
|
@@ -28,6 +51,7 @@ test("writes a source-backed MyBatis capability matrix without absolute paths",
|
|
|
28
51
|
await mkdir(path.join(baseJava, "config"), { recursive: true });
|
|
29
52
|
await mkdir(commonJava, { recursive: true });
|
|
30
53
|
await mkdir(path.join(skills, "yss-mybatis"), { recursive: true });
|
|
54
|
+
await writeFile(path.join(source, "pom.xml"), platformPom("1.8", "2.7.18"));
|
|
31
55
|
await writeFile(path.join(source, component, "pom.xml"), "<project/>");
|
|
32
56
|
await writeFile(path.join(plusJava, "support/BasePlusRepository.java"), [
|
|
33
57
|
"public interface BasePlusRepository<T> extends BaseMapper<T> {",
|
|
@@ -48,7 +72,7 @@ test("writes a source-backed MyBatis capability matrix without absolute paths",
|
|
|
48
72
|
|
|
49
73
|
await refresh({
|
|
50
74
|
skillsRoot: skills,
|
|
51
|
-
source,
|
|
75
|
+
sources: { "boot2-java8": source },
|
|
52
76
|
now: "2026-01-01T00:00:00Z",
|
|
53
77
|
frontend: false,
|
|
54
78
|
backendSkills: ["yss-mybatis"],
|
|
@@ -59,7 +83,7 @@ test("writes a source-backed MyBatis capability matrix without absolute paths",
|
|
|
59
83
|
}),
|
|
60
84
|
});
|
|
61
85
|
|
|
62
|
-
const index = await readFile(path.join(skills, "yss-mybatis/references/source-index.md"), "utf8");
|
|
86
|
+
const index = await readFile(path.join(skills, "yss-mybatis/references/source-index.boot2-java8.md"), "utf8");
|
|
63
87
|
assert.match(index, /## Capability Matrix/);
|
|
64
88
|
assert.match(index, /BasePlusRepository<T>/);
|
|
65
89
|
assert.match(index, /yss\.mybatis\.page-helper\.enabled/);
|
|
@@ -91,3 +115,46 @@ test("source freshness is scoped to the indexed component subtree", async () =>
|
|
|
91
115
|
await writeFile(componentFile, "<project><dirty/></project>\n");
|
|
92
116
|
assert.equal(sourceState(root, [component]).componentWorktree, "dirty");
|
|
93
117
|
});
|
|
118
|
+
|
|
119
|
+
test("records Maven lineage and platform signals and validates the exact component tree", async () => {
|
|
120
|
+
const root = await mkdtemp(path.join(tmpdir(), "yss-platform-index-"));
|
|
121
|
+
const source = path.join(root, "source");
|
|
122
|
+
const skills = path.join(root, "skills");
|
|
123
|
+
const component = "yss-microservice-components/yss-component-validation-jsr303";
|
|
124
|
+
const javaFile = path.join(source, component, "src/main/java/demo/ValidationConfiguration.java");
|
|
125
|
+
await mkdir(path.dirname(javaFile), { recursive: true });
|
|
126
|
+
await mkdir(path.join(skills, "yss-validation"), { recursive: true });
|
|
127
|
+
await writeFile(path.join(source, "pom.xml"), `<project>
|
|
128
|
+
<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.7.18</version><relativePath/></parent>
|
|
129
|
+
<groupId>com.yss.cloud</groupId><artifactId>yss-cloud-microservice</artifactId><version>2.0.0-SNAPSHOT</version>
|
|
130
|
+
<properties><java.version>1.8</java.version><spring-boot.version>\${project.parent.version}</spring-boot.version></properties>
|
|
131
|
+
</project>`);
|
|
132
|
+
await writeFile(path.join(source, "yss-microservice-components/pom.xml"), `<project><parent>
|
|
133
|
+
<groupId>com.yss.cloud</groupId><artifactId>yss-cloud-microservice</artifactId><version>2.0.0-SNAPSHOT</version><relativePath>../pom.xml</relativePath>
|
|
134
|
+
</parent><artifactId>yss-microservice-components</artifactId></project>`);
|
|
135
|
+
await writeFile(path.join(source, component, "pom.xml"), `<project><parent>
|
|
136
|
+
<groupId>com.yss.cloud</groupId><artifactId>yss-microservice-components</artifactId><version>2.0.0-SNAPSHOT</version><relativePath>../pom.xml</relativePath>
|
|
137
|
+
</parent><artifactId>yss-component-validation-jsr303</artifactId></project>`);
|
|
138
|
+
await writeFile(javaFile, "package demo; import javax.validation.Valid; class ValidationConfiguration {}\n");
|
|
139
|
+
execFileSync("git", ["init", "-q"], { cwd: source });
|
|
140
|
+
execFileSync("git", ["config", "user.email", "test@example.com"], { cwd: source });
|
|
141
|
+
execFileSync("git", ["config", "user.name", "Test"], { cwd: source });
|
|
142
|
+
execFileSync("git", ["add", "."], { cwd: source });
|
|
143
|
+
execFileSync("git", ["commit", "-qm", "fixture"], { cwd: source });
|
|
144
|
+
|
|
145
|
+
await refresh({ skillsRoot: skills, sources: { "boot2-java8": source }, frontend: false, backendSkills: ["yss-validation"], now: "2026-01-01T00:00:00Z" });
|
|
146
|
+
const index = await readFile(path.join(skills, "yss-validation/references/source-index.boot2-java8.md"), "utf8");
|
|
147
|
+
assert.match(index, /backend-component-source-index-v2/);
|
|
148
|
+
assert.match(index, /GAV `com\.yss\.cloud:yss-component-validation-jsr303:2\.0\.0-SNAPSHOT`/);
|
|
149
|
+
assert.match(index, /Inherited Java signals: `1\.8`/);
|
|
150
|
+
assert.match(index, /Inherited Spring Boot signals: `2\.7\.18`/);
|
|
151
|
+
assert.match(index, /`javax\.\*` in 1 main Java files; `jakarta\.\*` in 0/);
|
|
152
|
+
assert.deepEqual(BACKEND["yss-validation"], [component]);
|
|
153
|
+
await checkBackendSkillSourceIndex({ skill: "yss-validation", platformLine: "boot2-java8", skillsRoot: skills, sourceRoot: source });
|
|
154
|
+
|
|
155
|
+
await writeFile(javaFile, "package demo; import jakarta.validation.Valid; class ValidationConfiguration {}\n");
|
|
156
|
+
await assert.rejects(
|
|
157
|
+
() => checkBackendSkillSourceIndex({ skill: "yss-validation", platformLine: "boot2-java8", skillsRoot: skills, sourceRoot: source }),
|
|
158
|
+
/component worktree is dirty/,
|
|
159
|
+
);
|
|
160
|
+
});
|
|
@@ -9,7 +9,7 @@ description: 在 YSS 技术分析阶段将批准的战略领域输入细化为
|
|
|
9
9
|
|
|
10
10
|
## 适用边界
|
|
11
11
|
|
|
12
|
-
- 由 `yss-technical-design` 在已确认 `domain-driven` 的技术设计分支中调用;新建后端必须先通过 `gate.backend-architecture-platform-approved`,由用户在同一次决定中确认 DDD / MVC 与精确 Spring Boot 版本。传统 MVC
|
|
12
|
+
- 由 `yss-technical-design` 在已确认 `domain-driven` 的技术设计分支中调用;新建后端必须先通过 `gate.backend-architecture-platform-approved`,由用户在同一次决定中确认 DDD / MVC 与精确 Spring Boot 版本。传统 MVC 由 `yss-technical-design` 自身的 `layered-mvc` 分支负责;既有工程直接核验并复用当前登记架构及固定工程基线/POM 中的实际 Spring Boot 版本,不重复询问。不得按状态、一致性影响、目录或默认值单独推断为 DDD。
|
|
13
13
|
- 输入必须是版本当前的 Spec、功能架构、战略 DDD、状态矩阵、OpenAPI Draft / Freeze、ADR 和工程约束。若输入来自 Strategic Design Handoff,必须先用 `scripts/verify-strategic-context-import` 验证历史 v3/v4 或当前 v5 的 `source_context_snapshot` / `context_delta` 已对账到目标仓根 `CONTEXT.md`,对应的 prototype 或 existing UI baseline 可读取且摘要当前,并且目标侧 `context_reconciliation` 有效;未完成时不得开始战术建模。
|
|
14
14
|
- 默认将结果写入系统概要设计 / 数据架构中的 Tactical DDD Check;聚合、状态机、一致性或持久化映射复杂到无法清楚表达时,才升级为独立战术设计文档。
|
|
15
15
|
- 没有聚合、状态、不变量、一致性或领域边界影响时返回 `not-applicable` 及原因,不生成空设计。
|
|
@@ -5,7 +5,7 @@ owner: ai
|
|
|
5
5
|
|
|
6
6
|
# <功能名称> Tactical DDD Design
|
|
7
7
|
|
|
8
|
-
仅用于已确认 domain-driven 分支的阅读视图;引用 Technical Design Contract v2 的 design,不复制共同输入与审批状态。MVC 使用 yss-
|
|
8
|
+
仅用于已确认 domain-driven 分支的阅读视图;引用 Technical Design Contract v2 的 design,不复制共同输入与审批状态。MVC 使用 `yss-technical-design` 的 `layered-mvc` 分支。
|
|
9
9
|
|
|
10
10
|
## 上游引用
|
|
11
11
|
|
|
@@ -20,7 +20,7 @@ description: 在 YSS 技术分析中统一承接需求与战略输入,按已
|
|
|
20
20
|
按项目绑定架构选择的来源及摘要。新工程必须先通过 `gate.backend-architecture-platform-approved`:Agent 展示 DDD / MVC 推荐依据及平台清单中的精确 Spring Boot、Java 版本,用户在同一次决定中确认两项内容;决定持久化到 `scaffold-architecture-decisions.yaml`,再进入对应分支,后续脚手架消费同一决定。既有工程核验并沿用当前登记架构及固定工程基线/POM 中的实际 Spring Boot 版本,该门禁记录为 `not-applicable`,不重复询问;架构转换或平台升级另行立项。只有 `domain-driven` 和 `layered-mvc` 两种架构族,不能从目录推断或默认 DDD、MVC 或 Spring Boot 版本。具体 Profile 及模块边界消费技能注册表与 `docs/agents/backend-architecture-profiles.md`。
|
|
21
21
|
|
|
22
22
|
- `domain-driven`:调用 `yss-tactical-design`,补齐适用的战略领域输入。
|
|
23
|
-
- `layered-mvc
|
|
23
|
+
- `layered-mvc`:由本 skill 直接设计模块职责与依赖方向、用例流程、业务规则、状态转换、事务与回滚、幂等与并发、持久化映射、外部集成和公开测试 seam;不要求战略 DDD、聚合、值对象、Domain Event 或 DDD Gateway。分层边界消费 `docs/agents/backend-architecture-profiles.md`,不得为 MVC 加载 `yss-domain` 或生成 DDD Gateway。
|
|
24
24
|
|
|
25
25
|
已有 Strategic Design Handoff 时,两种分支都必须先完成导入和目标词汇对账,再逐条承接规则与关键场景。没有战略交接包的项目直接消费批准需求,不能为 MVC 补造战略 DDD。
|
|
26
26
|
|
|
@@ -30,6 +30,8 @@ description: 在 YSS 技术分析中统一承接需求与战略输入,按已
|
|
|
30
30
|
|
|
31
31
|
新产物使用 schema v2 Technical Design Contract:共同头记录架构来源、输入版本与摘要、规则/场景承接、评审证据和状态,`design` 保存架构专属内容。合同格式与兼容规则见 `references/technical-design-contract.md`,Schema 见 `references/technical-design.schema.json`。
|
|
32
32
|
|
|
33
|
+
MVC `design` 分支由 `references/mvc-design.schema.json` 约束。无状态流转或外部集成时记录有依据的不适用;业务规则和关键场景必须关联具体用例与成功/失败测试 seam。MVC 与 DDD 使用同一承接和审查要求,不能因采用分层 MVC 省略规则、一致性或测试设计。历史 `yss-mvc-design` 入口仅保留迁移提示,不再拥有该能力或被新合同调用。
|
|
34
|
+
|
|
33
35
|
运行 `node .agents/skills/yss-technical-design/scripts/validate-technical-design.mjs <合同> --root <项目根>`。整体存在延期或冲突即阻断整体;相关切片可带 `--slice <切片ID>` 按依赖核验,仍须合同已批准。校验成功只返回审查输入,不批准、不设置 `ready-for-agent`。
|
|
34
36
|
|
|
35
37
|
schema v1 战术合同只按 DDD 显式兼容读取;使用 `--legacy-ddd`,不能解释为 MVC。迁移不自动批准,输入或架构变化必须重新校验并按现有门禁审查。新合同使用 `artifact.technical-design` / `evidence.technical-design-review`;旧 DDD 稳定 ID 保留原含义。
|