create-yss-spec 3.2.0 → 3.3.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 +2 -2
- package/package.json +1 -1
- package/template/.agents/skills/code-review/SKILL.md +4 -0
- package/template/.agents/skills/code-review/agents/openai.yaml +1 -1
- package/template/.agents/skills/code-review/references/yss-review-standards.md +9 -2
- package/template/.agents/skills/yss-ddd-scaffold-generator/SKILL.md +1 -1
- package/template/.agents/skills/yss-ddd-scaffold-generator/scripts/generate_scaffold.mjs +7 -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 +9 -0
- package/template/.agents/skills/yss-frontend-scaffold-generator/SKILL.md +10 -7
- package/template/.agents/skills/yss-frontend-scaffold-generator/scripts/generate_and_verify_scaffold.mjs +10 -0
- package/template/.agents/skills/yss-frontend-scaffold-generator/scripts/generate_scaffold.mjs +107 -0
- package/template/.agents/skills/yss-frontend-scaffold-generator/scripts/run_scaffold_verification.mjs +41 -0
- package/template/.agents/skills/yss-frontend-scaffold-generator/scripts/scaffold-generator.test.mjs +37 -0
- package/template/.agents/skills/yss-implementation-contract-compiler/SKILL.md +1 -1
- package/template/.agents/skills/yss-implementation-contract-compiler/references/boundaries.md +4 -0
- package/template/.agents/skills/yss-implementation-contract-compiler/references/compiler-contract.yaml +25 -0
- package/template/.agents/skills/yss-layered-mvc-scaffold-generator/SKILL.md +2 -2
- package/template/.agents/skills/yss-layered-mvc-scaffold-generator/scripts/generate_scaffold.mjs +8 -5
- package/template/.agents/skills/yss-layered-mvc-scaffold-generator/scripts/scaffold-generator.test.mjs +17 -2
- package/template/.agents/skills/yss-mybatis/SKILL.md +34 -58
- package/template/.agents/skills/yss-mybatis/agents/openai.yaml +2 -2
- package/template/.agents/skills/yss-mybatis/references/source-index.md +88 -68
- package/template/.agents/skills/yss-product-lifecycle/SKILL.md +48 -43
- package/template/.agents/skills/yss-product-lifecycle/references/artifact-dependencies.md +4 -2
- package/template/.agents/skills/yss-product-lifecycle/references/orchestration-contract.yaml +67 -10
- package/template/.agents/skills/yss-product-lifecycle/references/orchestration.md +5 -1
- package/template/.agents/skills/yss-product-lifecycle/references/state-model.md +5 -2
- package/template/.agents/skills/yss-repository/SKILL.md +28 -70
- package/template/.agents/skills/yss-repository/agents/openai.yaml +2 -2
- package/template/.agents/skills/yss-repository/references/profiles/layered-mvc-service.md +19 -1
- package/template/.agents/skills/yss-repository/references/profiles/mvc-data-analysis-v1.md +19 -1
- package/template/.agents/skills/yss-repository/references/profiles/target-domain-model.md +21 -1
- package/template/.agents/skills/yss-repository/tests/profile-routing.test.mjs +59 -0
- package/template/.agents/skills/yss-skill-source-index-refresh/SKILL.md +8 -5
- package/template/.agents/skills/yss-skill-source-index-refresh/references/source-location.md +2 -1
- package/template/.agents/skills/yss-skill-source-index-refresh/scripts/refresh-yss-skill-index.mjs +388 -18
- package/template/.agents/skills/yss-skill-source-index-refresh/scripts/refresh-yss-skill-index.test.mjs +79 -1
- package/template/.claude/skills/code-review/SKILL.md +4 -0
- package/template/.claude/skills/code-review/agents/openai.yaml +1 -1
- package/template/.claude/skills/code-review/references/yss-review-standards.md +9 -2
- package/template/.claude/skills/yss-ddd-scaffold-generator/SKILL.md +1 -1
- package/template/.claude/skills/yss-ddd-scaffold-generator/scripts/generate_scaffold.mjs +7 -3
- package/template/.claude/skills/yss-ddd-scaffold-generator/scripts/run_scaffold_verification.mjs +1 -1
- package/template/.claude/skills/yss-ddd-scaffold-generator/scripts/scaffold-generator.test.mjs +9 -0
- package/template/.claude/skills/yss-frontend-scaffold-generator/SKILL.md +10 -7
- package/template/.claude/skills/yss-frontend-scaffold-generator/scripts/generate_and_verify_scaffold.mjs +10 -0
- package/template/.claude/skills/yss-frontend-scaffold-generator/scripts/generate_scaffold.mjs +107 -0
- package/template/.claude/skills/yss-frontend-scaffold-generator/scripts/run_scaffold_verification.mjs +41 -0
- package/template/.claude/skills/yss-frontend-scaffold-generator/scripts/scaffold-generator.test.mjs +37 -0
- package/template/.claude/skills/yss-implementation-contract-compiler/SKILL.md +1 -1
- package/template/.claude/skills/yss-implementation-contract-compiler/references/boundaries.md +4 -0
- package/template/.claude/skills/yss-implementation-contract-compiler/references/compiler-contract.yaml +25 -0
- package/template/.claude/skills/yss-layered-mvc-scaffold-generator/SKILL.md +2 -2
- package/template/.claude/skills/yss-layered-mvc-scaffold-generator/scripts/generate_scaffold.mjs +8 -5
- package/template/.claude/skills/yss-layered-mvc-scaffold-generator/scripts/scaffold-generator.test.mjs +17 -2
- package/template/.claude/skills/yss-mybatis/SKILL.md +34 -58
- package/template/.claude/skills/yss-mybatis/agents/openai.yaml +2 -2
- package/template/.claude/skills/yss-mybatis/references/source-index.md +88 -68
- package/template/.claude/skills/yss-product-lifecycle/SKILL.md +48 -43
- package/template/.claude/skills/yss-product-lifecycle/references/artifact-dependencies.md +4 -2
- package/template/.claude/skills/yss-product-lifecycle/references/orchestration-contract.yaml +67 -10
- package/template/.claude/skills/yss-product-lifecycle/references/orchestration.md +5 -1
- package/template/.claude/skills/yss-product-lifecycle/references/state-model.md +5 -2
- package/template/.claude/skills/yss-repository/SKILL.md +28 -70
- package/template/.claude/skills/yss-repository/agents/openai.yaml +2 -2
- package/template/.claude/skills/yss-repository/references/profiles/layered-mvc-service.md +19 -1
- package/template/.claude/skills/yss-repository/references/profiles/mvc-data-analysis-v1.md +19 -1
- package/template/.claude/skills/yss-repository/references/profiles/target-domain-model.md +21 -1
- package/template/.claude/skills/yss-repository/tests/profile-routing.test.mjs +59 -0
- package/template/.claude/skills/yss-skill-source-index-refresh/SKILL.md +8 -5
- package/template/.claude/skills/yss-skill-source-index-refresh/references/source-location.md +2 -1
- package/template/.claude/skills/yss-skill-source-index-refresh/scripts/refresh-yss-skill-index.mjs +388 -18
- package/template/.claude/skills/yss-skill-source-index-refresh/scripts/refresh-yss-skill-index.test.mjs +79 -1
- package/template/.codex/skills/code-review/SKILL.md +4 -0
- package/template/.codex/skills/code-review/agents/openai.yaml +1 -1
- package/template/.codex/skills/code-review/references/yss-review-standards.md +9 -2
- package/template/.codex/skills/yss-ddd-scaffold-generator/SKILL.md +1 -1
- package/template/.codex/skills/yss-ddd-scaffold-generator/scripts/generate_scaffold.mjs +7 -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 +9 -0
- package/template/.codex/skills/yss-frontend-scaffold-generator/SKILL.md +10 -7
- package/template/.codex/skills/yss-frontend-scaffold-generator/scripts/generate_and_verify_scaffold.mjs +10 -0
- package/template/.codex/skills/yss-frontend-scaffold-generator/scripts/generate_scaffold.mjs +107 -0
- package/template/.codex/skills/yss-frontend-scaffold-generator/scripts/run_scaffold_verification.mjs +41 -0
- package/template/.codex/skills/yss-frontend-scaffold-generator/scripts/scaffold-generator.test.mjs +37 -0
- package/template/.codex/skills/yss-implementation-contract-compiler/SKILL.md +1 -1
- package/template/.codex/skills/yss-implementation-contract-compiler/references/boundaries.md +4 -0
- package/template/.codex/skills/yss-implementation-contract-compiler/references/compiler-contract.yaml +25 -0
- package/template/.codex/skills/yss-layered-mvc-scaffold-generator/SKILL.md +2 -2
- package/template/.codex/skills/yss-layered-mvc-scaffold-generator/scripts/generate_scaffold.mjs +8 -5
- package/template/.codex/skills/yss-layered-mvc-scaffold-generator/scripts/scaffold-generator.test.mjs +17 -2
- package/template/.codex/skills/yss-mybatis/SKILL.md +34 -58
- package/template/.codex/skills/yss-mybatis/agents/openai.yaml +2 -2
- package/template/.codex/skills/yss-mybatis/references/source-index.md +88 -68
- package/template/.codex/skills/yss-product-lifecycle/SKILL.md +48 -43
- package/template/.codex/skills/yss-product-lifecycle/references/artifact-dependencies.md +4 -2
- package/template/.codex/skills/yss-product-lifecycle/references/orchestration-contract.yaml +67 -10
- package/template/.codex/skills/yss-product-lifecycle/references/orchestration.md +5 -1
- package/template/.codex/skills/yss-product-lifecycle/references/state-model.md +5 -2
- package/template/.codex/skills/yss-repository/SKILL.md +28 -70
- package/template/.codex/skills/yss-repository/agents/openai.yaml +2 -2
- package/template/.codex/skills/yss-repository/references/profiles/layered-mvc-service.md +19 -1
- package/template/.codex/skills/yss-repository/references/profiles/mvc-data-analysis-v1.md +19 -1
- package/template/.codex/skills/yss-repository/references/profiles/target-domain-model.md +21 -1
- package/template/.codex/skills/yss-repository/tests/profile-routing.test.mjs +59 -0
- package/template/.codex/skills/yss-skill-source-index-refresh/SKILL.md +8 -5
- package/template/.codex/skills/yss-skill-source-index-refresh/references/source-location.md +2 -1
- package/template/.codex/skills/yss-skill-source-index-refresh/scripts/refresh-yss-skill-index.mjs +388 -18
- package/template/.codex/skills/yss-skill-source-index-refresh/scripts/refresh-yss-skill-index.test.mjs +79 -1
- package/template/.cursor/skills/code-review/SKILL.md +4 -0
- package/template/.cursor/skills/code-review/agents/openai.yaml +1 -1
- package/template/.cursor/skills/code-review/references/yss-review-standards.md +9 -2
- package/template/.cursor/skills/yss-ddd-scaffold-generator/SKILL.md +1 -1
- package/template/.cursor/skills/yss-ddd-scaffold-generator/scripts/generate_scaffold.mjs +7 -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 +9 -0
- package/template/.cursor/skills/yss-frontend-scaffold-generator/SKILL.md +10 -7
- package/template/.cursor/skills/yss-frontend-scaffold-generator/scripts/generate_and_verify_scaffold.mjs +10 -0
- package/template/.cursor/skills/yss-frontend-scaffold-generator/scripts/generate_scaffold.mjs +107 -0
- package/template/.cursor/skills/yss-frontend-scaffold-generator/scripts/run_scaffold_verification.mjs +41 -0
- package/template/.cursor/skills/yss-frontend-scaffold-generator/scripts/scaffold-generator.test.mjs +37 -0
- package/template/.cursor/skills/yss-implementation-contract-compiler/SKILL.md +1 -1
- package/template/.cursor/skills/yss-implementation-contract-compiler/references/boundaries.md +4 -0
- package/template/.cursor/skills/yss-implementation-contract-compiler/references/compiler-contract.yaml +25 -0
- package/template/.cursor/skills/yss-layered-mvc-scaffold-generator/SKILL.md +2 -2
- package/template/.cursor/skills/yss-layered-mvc-scaffold-generator/scripts/generate_scaffold.mjs +8 -5
- package/template/.cursor/skills/yss-layered-mvc-scaffold-generator/scripts/scaffold-generator.test.mjs +17 -2
- package/template/.cursor/skills/yss-mybatis/SKILL.md +34 -58
- package/template/.cursor/skills/yss-mybatis/agents/openai.yaml +2 -2
- package/template/.cursor/skills/yss-mybatis/references/source-index.md +88 -68
- package/template/.cursor/skills/yss-product-lifecycle/SKILL.md +48 -43
- package/template/.cursor/skills/yss-product-lifecycle/references/artifact-dependencies.md +4 -2
- package/template/.cursor/skills/yss-product-lifecycle/references/orchestration-contract.yaml +67 -10
- package/template/.cursor/skills/yss-product-lifecycle/references/orchestration.md +5 -1
- package/template/.cursor/skills/yss-product-lifecycle/references/state-model.md +5 -2
- package/template/.cursor/skills/yss-repository/SKILL.md +28 -70
- package/template/.cursor/skills/yss-repository/agents/openai.yaml +2 -2
- package/template/.cursor/skills/yss-repository/references/profiles/layered-mvc-service.md +19 -1
- package/template/.cursor/skills/yss-repository/references/profiles/mvc-data-analysis-v1.md +19 -1
- package/template/.cursor/skills/yss-repository/references/profiles/target-domain-model.md +21 -1
- package/template/.cursor/skills/yss-repository/tests/profile-routing.test.mjs +59 -0
- package/template/.cursor/skills/yss-skill-source-index-refresh/SKILL.md +8 -5
- package/template/.cursor/skills/yss-skill-source-index-refresh/references/source-location.md +2 -1
- package/template/.cursor/skills/yss-skill-source-index-refresh/scripts/refresh-yss-skill-index.mjs +388 -18
- package/template/.cursor/skills/yss-skill-source-index-refresh/scripts/refresh-yss-skill-index.test.mjs +79 -1
- package/template/.pi/skills/code-review/SKILL.md +4 -0
- package/template/.pi/skills/code-review/agents/openai.yaml +1 -1
- package/template/.pi/skills/code-review/references/yss-review-standards.md +9 -2
- package/template/.pi/skills/yss-ddd-scaffold-generator/SKILL.md +1 -1
- package/template/.pi/skills/yss-ddd-scaffold-generator/scripts/generate_scaffold.mjs +7 -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 +9 -0
- package/template/.pi/skills/yss-frontend-scaffold-generator/SKILL.md +10 -7
- package/template/.pi/skills/yss-frontend-scaffold-generator/scripts/generate_and_verify_scaffold.mjs +10 -0
- package/template/.pi/skills/yss-frontend-scaffold-generator/scripts/generate_scaffold.mjs +107 -0
- package/template/.pi/skills/yss-frontend-scaffold-generator/scripts/run_scaffold_verification.mjs +41 -0
- package/template/.pi/skills/yss-frontend-scaffold-generator/scripts/scaffold-generator.test.mjs +37 -0
- package/template/.pi/skills/yss-implementation-contract-compiler/SKILL.md +1 -1
- package/template/.pi/skills/yss-implementation-contract-compiler/references/boundaries.md +4 -0
- package/template/.pi/skills/yss-implementation-contract-compiler/references/compiler-contract.yaml +25 -0
- package/template/.pi/skills/yss-layered-mvc-scaffold-generator/SKILL.md +2 -2
- package/template/.pi/skills/yss-layered-mvc-scaffold-generator/scripts/generate_scaffold.mjs +8 -5
- package/template/.pi/skills/yss-layered-mvc-scaffold-generator/scripts/scaffold-generator.test.mjs +17 -2
- package/template/.pi/skills/yss-mybatis/SKILL.md +34 -58
- package/template/.pi/skills/yss-mybatis/agents/openai.yaml +2 -2
- package/template/.pi/skills/yss-mybatis/references/source-index.md +88 -68
- package/template/.pi/skills/yss-product-lifecycle/SKILL.md +48 -43
- package/template/.pi/skills/yss-product-lifecycle/references/artifact-dependencies.md +4 -2
- package/template/.pi/skills/yss-product-lifecycle/references/orchestration-contract.yaml +67 -10
- package/template/.pi/skills/yss-product-lifecycle/references/orchestration.md +5 -1
- package/template/.pi/skills/yss-product-lifecycle/references/state-model.md +5 -2
- package/template/.pi/skills/yss-repository/SKILL.md +28 -70
- package/template/.pi/skills/yss-repository/agents/openai.yaml +2 -2
- package/template/.pi/skills/yss-repository/references/profiles/layered-mvc-service.md +19 -1
- package/template/.pi/skills/yss-repository/references/profiles/mvc-data-analysis-v1.md +19 -1
- package/template/.pi/skills/yss-repository/references/profiles/target-domain-model.md +21 -1
- package/template/.pi/skills/yss-repository/tests/profile-routing.test.mjs +59 -0
- package/template/.pi/skills/yss-skill-source-index-refresh/SKILL.md +8 -5
- package/template/.pi/skills/yss-skill-source-index-refresh/references/source-location.md +2 -1
- package/template/.pi/skills/yss-skill-source-index-refresh/scripts/refresh-yss-skill-index.mjs +388 -18
- package/template/.pi/skills/yss-skill-source-index-refresh/scripts/refresh-yss-skill-index.test.mjs +79 -1
- package/template/.qoder/skills/code-review/SKILL.md +4 -0
- package/template/.qoder/skills/code-review/agents/openai.yaml +1 -1
- package/template/.qoder/skills/code-review/references/yss-review-standards.md +9 -2
- package/template/.qoder/skills/yss-ddd-scaffold-generator/SKILL.md +1 -1
- package/template/.qoder/skills/yss-ddd-scaffold-generator/scripts/generate_scaffold.mjs +7 -3
- package/template/.qoder/skills/yss-ddd-scaffold-generator/scripts/run_scaffold_verification.mjs +1 -1
- package/template/.qoder/skills/yss-ddd-scaffold-generator/scripts/scaffold-generator.test.mjs +9 -0
- package/template/.qoder/skills/yss-frontend-scaffold-generator/SKILL.md +10 -7
- package/template/.qoder/skills/yss-frontend-scaffold-generator/scripts/generate_and_verify_scaffold.mjs +10 -0
- package/template/.qoder/skills/yss-frontend-scaffold-generator/scripts/generate_scaffold.mjs +107 -0
- package/template/.qoder/skills/yss-frontend-scaffold-generator/scripts/run_scaffold_verification.mjs +41 -0
- package/template/.qoder/skills/yss-frontend-scaffold-generator/scripts/scaffold-generator.test.mjs +37 -0
- package/template/.qoder/skills/yss-implementation-contract-compiler/SKILL.md +1 -1
- package/template/.qoder/skills/yss-implementation-contract-compiler/references/boundaries.md +4 -0
- package/template/.qoder/skills/yss-implementation-contract-compiler/references/compiler-contract.yaml +25 -0
- package/template/.qoder/skills/yss-layered-mvc-scaffold-generator/SKILL.md +2 -2
- package/template/.qoder/skills/yss-layered-mvc-scaffold-generator/scripts/generate_scaffold.mjs +8 -5
- package/template/.qoder/skills/yss-layered-mvc-scaffold-generator/scripts/scaffold-generator.test.mjs +17 -2
- package/template/.qoder/skills/yss-mybatis/SKILL.md +34 -58
- package/template/.qoder/skills/yss-mybatis/agents/openai.yaml +2 -2
- package/template/.qoder/skills/yss-mybatis/references/source-index.md +88 -68
- package/template/.qoder/skills/yss-product-lifecycle/SKILL.md +48 -43
- package/template/.qoder/skills/yss-product-lifecycle/references/artifact-dependencies.md +4 -2
- package/template/.qoder/skills/yss-product-lifecycle/references/orchestration-contract.yaml +67 -10
- package/template/.qoder/skills/yss-product-lifecycle/references/orchestration.md +5 -1
- package/template/.qoder/skills/yss-product-lifecycle/references/state-model.md +5 -2
- package/template/.qoder/skills/yss-repository/SKILL.md +28 -70
- package/template/.qoder/skills/yss-repository/agents/openai.yaml +2 -2
- package/template/.qoder/skills/yss-repository/references/profiles/layered-mvc-service.md +19 -1
- package/template/.qoder/skills/yss-repository/references/profiles/mvc-data-analysis-v1.md +19 -1
- package/template/.qoder/skills/yss-repository/references/profiles/target-domain-model.md +21 -1
- package/template/.qoder/skills/yss-repository/tests/profile-routing.test.mjs +59 -0
- package/template/.qoder/skills/yss-skill-source-index-refresh/SKILL.md +8 -5
- package/template/.qoder/skills/yss-skill-source-index-refresh/references/source-location.md +2 -1
- package/template/.qoder/skills/yss-skill-source-index-refresh/scripts/refresh-yss-skill-index.mjs +388 -18
- package/template/.qoder/skills/yss-skill-source-index-refresh/scripts/refresh-yss-skill-index.test.mjs +79 -1
- package/template/.trae/skills/code-review/SKILL.md +4 -0
- package/template/.trae/skills/code-review/agents/openai.yaml +1 -1
- package/template/.trae/skills/code-review/references/yss-review-standards.md +9 -2
- package/template/.trae/skills/yss-ddd-scaffold-generator/SKILL.md +1 -1
- package/template/.trae/skills/yss-ddd-scaffold-generator/scripts/generate_scaffold.mjs +7 -3
- package/template/.trae/skills/yss-ddd-scaffold-generator/scripts/run_scaffold_verification.mjs +1 -1
- package/template/.trae/skills/yss-ddd-scaffold-generator/scripts/scaffold-generator.test.mjs +9 -0
- package/template/.trae/skills/yss-frontend-scaffold-generator/SKILL.md +10 -7
- package/template/.trae/skills/yss-frontend-scaffold-generator/scripts/generate_and_verify_scaffold.mjs +10 -0
- package/template/.trae/skills/yss-frontend-scaffold-generator/scripts/generate_scaffold.mjs +107 -0
- package/template/.trae/skills/yss-frontend-scaffold-generator/scripts/run_scaffold_verification.mjs +41 -0
- package/template/.trae/skills/yss-frontend-scaffold-generator/scripts/scaffold-generator.test.mjs +37 -0
- package/template/.trae/skills/yss-implementation-contract-compiler/SKILL.md +1 -1
- package/template/.trae/skills/yss-implementation-contract-compiler/references/boundaries.md +4 -0
- package/template/.trae/skills/yss-implementation-contract-compiler/references/compiler-contract.yaml +25 -0
- package/template/.trae/skills/yss-layered-mvc-scaffold-generator/SKILL.md +2 -2
- package/template/.trae/skills/yss-layered-mvc-scaffold-generator/scripts/generate_scaffold.mjs +8 -5
- package/template/.trae/skills/yss-layered-mvc-scaffold-generator/scripts/scaffold-generator.test.mjs +17 -2
- package/template/.trae/skills/yss-mybatis/SKILL.md +34 -58
- package/template/.trae/skills/yss-mybatis/agents/openai.yaml +2 -2
- package/template/.trae/skills/yss-mybatis/references/source-index.md +88 -68
- package/template/.trae/skills/yss-product-lifecycle/SKILL.md +48 -43
- package/template/.trae/skills/yss-product-lifecycle/references/artifact-dependencies.md +4 -2
- package/template/.trae/skills/yss-product-lifecycle/references/orchestration-contract.yaml +67 -10
- package/template/.trae/skills/yss-product-lifecycle/references/orchestration.md +5 -1
- package/template/.trae/skills/yss-product-lifecycle/references/state-model.md +5 -2
- package/template/.trae/skills/yss-repository/SKILL.md +28 -70
- package/template/.trae/skills/yss-repository/agents/openai.yaml +2 -2
- package/template/.trae/skills/yss-repository/references/profiles/layered-mvc-service.md +19 -1
- package/template/.trae/skills/yss-repository/references/profiles/mvc-data-analysis-v1.md +19 -1
- package/template/.trae/skills/yss-repository/references/profiles/target-domain-model.md +21 -1
- package/template/.trae/skills/yss-repository/tests/profile-routing.test.mjs +59 -0
- package/template/.trae/skills/yss-skill-source-index-refresh/SKILL.md +8 -5
- package/template/.trae/skills/yss-skill-source-index-refresh/references/source-location.md +2 -1
- package/template/.trae/skills/yss-skill-source-index-refresh/scripts/refresh-yss-skill-index.mjs +388 -18
- package/template/.trae/skills/yss-skill-source-index-refresh/scripts/refresh-yss-skill-index.test.mjs +79 -1
- package/template/docs/agents/digital-human-roles.yaml +2 -0
- package/template/docs/agents/yss-skill-registry.yaml +5 -0
- package/template/docs/process/lifecycle-artifact-map.md +4 -0
- package/template/docs/process/lifecycle-registry-baseline.json +6 -1
- package/template/docs/process/lifecycle-registry.yaml +23 -0
- package/template/docs/process/schemas/implementation-repository-preparation-result.schema.json +38 -0
- package/template/docs/process/schemas/project-scaffold-contract.schema.json +113 -0
- package/template/docs/process/template-verification-profiles.yaml +23 -0
- package/template/docs/templates/implementation-repo-registry-template.md +8 -0
- package/template/docs/templates/review-report-template.md +7 -3
- package/template/scripts/lib/lifecycle-context-query.mjs +137 -0
- package/template/scripts/lib/lifecycle-transition.mjs +109 -3
- package/template/scripts/lib/scenario-checks.mjs +29 -26
- package/template/scripts/lib/skill-registry.mjs +9 -0
- package/template/scripts/query-lifecycle-context +25 -0
- package/template/scripts/verify-business-language-scenarios +0 -7
- package/template/scripts/verify-frontend-scaffold-generator-scenarios +2 -0
- package/template/scripts/verify-lifecycle-context-query-scenarios +68 -0
- package/template/scripts/verify-lifecycle-transition-scenarios +44 -4
- package/template/skills-lock.json +9 -9
- package/template.snapshot.json +4 -4
- package/template/.agents/skills/yss-mybatis/assets/BaseRepository.java +0 -112
- package/template/.agents/skills/yss-mybatis/assets/EntityQueryAspect.java +0 -37
- package/template/.agents/skills/yss-mybatis/assets/MybatisBaseConfiguration.java +0 -18
- package/template/.agents/skills/yss-mybatis/assets/PageQueryEntityConfigration.java +0 -18
- package/template/.agents/skills/yss-mybatis/references/README.md +0 -57
- package/template/.agents/skills/yss-repository/references/infrastructure-layer-guide.md +0 -107
- package/template/.claude/skills/yss-mybatis/assets/BaseRepository.java +0 -112
- package/template/.claude/skills/yss-mybatis/assets/EntityQueryAspect.java +0 -37
- package/template/.claude/skills/yss-mybatis/assets/MybatisBaseConfiguration.java +0 -18
- package/template/.claude/skills/yss-mybatis/assets/PageQueryEntityConfigration.java +0 -18
- package/template/.claude/skills/yss-mybatis/references/README.md +0 -57
- package/template/.claude/skills/yss-repository/references/infrastructure-layer-guide.md +0 -107
- package/template/.codex/skills/yss-mybatis/assets/BaseRepository.java +0 -112
- package/template/.codex/skills/yss-mybatis/assets/EntityQueryAspect.java +0 -37
- package/template/.codex/skills/yss-mybatis/assets/MybatisBaseConfiguration.java +0 -18
- package/template/.codex/skills/yss-mybatis/assets/PageQueryEntityConfigration.java +0 -18
- package/template/.codex/skills/yss-mybatis/references/README.md +0 -57
- package/template/.codex/skills/yss-repository/references/infrastructure-layer-guide.md +0 -107
- package/template/.cursor/skills/yss-mybatis/assets/BaseRepository.java +0 -112
- package/template/.cursor/skills/yss-mybatis/assets/EntityQueryAspect.java +0 -37
- package/template/.cursor/skills/yss-mybatis/assets/MybatisBaseConfiguration.java +0 -18
- package/template/.cursor/skills/yss-mybatis/assets/PageQueryEntityConfigration.java +0 -18
- package/template/.cursor/skills/yss-mybatis/references/README.md +0 -57
- package/template/.cursor/skills/yss-repository/references/infrastructure-layer-guide.md +0 -107
- package/template/.pi/skills/yss-mybatis/assets/BaseRepository.java +0 -112
- package/template/.pi/skills/yss-mybatis/assets/EntityQueryAspect.java +0 -37
- package/template/.pi/skills/yss-mybatis/assets/MybatisBaseConfiguration.java +0 -18
- package/template/.pi/skills/yss-mybatis/assets/PageQueryEntityConfigration.java +0 -18
- package/template/.pi/skills/yss-mybatis/references/README.md +0 -57
- package/template/.pi/skills/yss-repository/references/infrastructure-layer-guide.md +0 -107
- package/template/.qoder/skills/yss-mybatis/assets/BaseRepository.java +0 -112
- package/template/.qoder/skills/yss-mybatis/assets/EntityQueryAspect.java +0 -37
- package/template/.qoder/skills/yss-mybatis/assets/MybatisBaseConfiguration.java +0 -18
- package/template/.qoder/skills/yss-mybatis/assets/PageQueryEntityConfigration.java +0 -18
- package/template/.qoder/skills/yss-mybatis/references/README.md +0 -57
- package/template/.qoder/skills/yss-repository/references/infrastructure-layer-guide.md +0 -107
- package/template/.trae/skills/yss-mybatis/assets/BaseRepository.java +0 -112
- package/template/.trae/skills/yss-mybatis/assets/EntityQueryAspect.java +0 -37
- package/template/.trae/skills/yss-mybatis/assets/MybatisBaseConfiguration.java +0 -18
- package/template/.trae/skills/yss-mybatis/assets/PageQueryEntityConfigration.java +0 -18
- package/template/.trae/skills/yss-mybatis/references/README.md +0 -57
- package/template/.trae/skills/yss-repository/references/infrastructure-layer-guide.md +0 -107
package/template/.trae/skills/yss-skill-source-index-refresh/scripts/refresh-yss-skill-index.mjs
CHANGED
|
@@ -1,24 +1,394 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
+
import { createHash } from "node:crypto";
|
|
2
3
|
import { execFileSync } from "node:child_process";
|
|
3
|
-
import { access, mkdir, readdir, writeFile } from "node:fs/promises";
|
|
4
|
+
import { access, mkdir, readFile, readdir, writeFile } from "node:fs/promises";
|
|
4
5
|
import os from "node:os";
|
|
5
6
|
import path from "node:path";
|
|
6
7
|
import { fileURLToPath } from "node:url";
|
|
7
8
|
|
|
8
|
-
const BACKEND = {
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
9
|
+
const BACKEND = {
|
|
10
|
+
"yss-cache": ["yss-microservice-components/yss-component-cache-parent"],
|
|
11
|
+
"yss-mybatis": ["yss-microservice-components/yss-component-persistence"],
|
|
12
|
+
"yss-dto": ["yss-microservice-components/yss-component-dto"],
|
|
13
|
+
"yss-audit-log": ["yss-microservice-components/yss-component-audit-log"],
|
|
14
|
+
"yss-excel-mvc": [
|
|
15
|
+
"yss-microservice-components/yss-component-excel-mvc",
|
|
16
|
+
"yss-microservice-components/yss-component-excel-starter",
|
|
17
|
+
],
|
|
18
|
+
"yss-distributed-id": [
|
|
19
|
+
"yss-microservice-components/yss-component-distributed-id",
|
|
20
|
+
"yss-microservice-components/yss-component-leaf",
|
|
21
|
+
],
|
|
22
|
+
"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
|
+
],
|
|
27
|
+
"yss-security-algorithm": ["yss-microservice-components/yss-component-security-algorithm"],
|
|
28
|
+
"yss-userinfo": ["yss-microservice-components/yss-component-userinfo-starter"],
|
|
29
|
+
"yss-exception": ["yss-microservice-components/yss-component-exception"],
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
const FRONTEND = {
|
|
33
|
+
"yss-ui": ["components", "hooks", "skills"],
|
|
34
|
+
"yss-components": ["components"],
|
|
35
|
+
"yss-hook": ["hooks"],
|
|
36
|
+
"yss-ui-business-page-generation": ["components", "hooks", "skills"],
|
|
37
|
+
"yss-use-table-height": ["hooks"],
|
|
38
|
+
"yss-use-tree-height": ["hooks"],
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
const URLS = {
|
|
42
|
+
components: "http://192.168.164.27:3200/components",
|
|
43
|
+
hooks: "http://192.168.164.27:3200/hooks",
|
|
44
|
+
skills: "http://192.168.164.27:3200/skills",
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
const KEYS = [
|
|
48
|
+
"Audit", "Cache", "Clear", "Command", "Configuration", "Controller", "DTO", "Data", "Enable", "Excel",
|
|
49
|
+
"Handler", "Interceptor", "Jdbc", "Mapper", "Mybatis", "Page", "Properties", "Query", "Repository", "Request",
|
|
50
|
+
"Response", "Result", "Update", "Aspect", "Leaf", "Id", "Dir", "Dic", "Dictionary", "File", "Upload", "Log",
|
|
51
|
+
"Message", "Mail", "Liquibase", "Circuit", "Breaker", "Sql", "Tpl", "Tag", "Task", "Flow", "Report",
|
|
52
|
+
"Validation", "Validator", "Security", "Crypto", "User", "Variable", "Quality", "Search", "Similarity",
|
|
53
|
+
"Scheduler", "Runner", "Duck", "Dynamic", "Factory", "Client", "Feign", "Gateway", "Convertor", "Adapter",
|
|
54
|
+
"Advice", "Bridge", "Route", "Uploader", "Sftp", "Minio", "Parser", "Express", "Rule", "Template", "Generator",
|
|
55
|
+
"Importer", "Engine", "Event", "Submitter", "Executor", "Context", "Status", "Type", "State",
|
|
56
|
+
];
|
|
57
|
+
|
|
58
|
+
const DOCS = new Set(["README.md", "readme.md", "HELP.md", "TECHNICAL_DESIGN.md"]);
|
|
59
|
+
const SKIPPED_DIRECTORIES = new Set([".git", "node_modules", "target", "build", "out", "${project.build.directory}"]);
|
|
60
|
+
|
|
61
|
+
const MYBATIS_CAPABILITIES = [
|
|
62
|
+
{
|
|
63
|
+
title: "Repository abstractions",
|
|
64
|
+
sources: [
|
|
65
|
+
{
|
|
66
|
+
suffix: "/support/BaseRepository.java",
|
|
67
|
+
patterns: [/public interface BaseRepository/, /int (insert|insertSelective|insertList|updateList|updateListSelective)\(/],
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
suffix: "/support/BasePlusRepository.java",
|
|
71
|
+
patterns: [/public interface BasePlusRepository/, /insertBatchSomeColumn/],
|
|
72
|
+
},
|
|
73
|
+
],
|
|
74
|
+
},
|
|
75
|
+
{
|
|
76
|
+
title: "Pagination and activation",
|
|
77
|
+
sources: [
|
|
78
|
+
{ suffix: "/aop/EntityQueryAspect.java", patterns: [/@Around\(/, /PageHelper\.offsetPage/] },
|
|
79
|
+
{ suffix: "/config/PageQueryEntityConfigration.java", patterns: [/@ConditionalOnProperty/] },
|
|
80
|
+
{
|
|
81
|
+
suffix: "/YssMybatisMapperProperties.java",
|
|
82
|
+
patterns: [
|
|
83
|
+
/@ConfigurationProperties/,
|
|
84
|
+
/private (String mapperLocation|String mapperScan|Integer batchSize|String dbType|PageHelper pageHelper|MybatisPlusPagination mybatisPlusPagination)/,
|
|
85
|
+
/public static class (PageHelper|MybatisPlusPagination)/,
|
|
86
|
+
/private Boolean enabled/,
|
|
87
|
+
],
|
|
88
|
+
},
|
|
89
|
+
{
|
|
90
|
+
suffix: "/config/MapperConfiguration.java",
|
|
91
|
+
patterns: [/new PageInterceptor\(/, /new PaginationInnerInterceptor\(/, /setBatchSize\(/, /setDbType\(/],
|
|
92
|
+
},
|
|
93
|
+
],
|
|
94
|
+
},
|
|
95
|
+
{
|
|
96
|
+
title: "SQL-level batch insertion",
|
|
97
|
+
sources: [
|
|
98
|
+
{ suffix: "/config/BatchInsertSettings.java", patterns: [/DEFAULT_BATCH_SIZE/, /configuredBatchSize/] },
|
|
99
|
+
{ suffix: "/config/BatchSqlInjector.java", patterns: [/public class BatchSqlInjector/, /insertBatchSomeColumnInternal/, /FieldFill\.UPDATE/] },
|
|
100
|
+
{ suffix: "/config/DialectInsertBatchSomeColumn.java", patterns: [/public class DialectInsertBatchSomeColumn/, /DbType\.(ORACLE|ORACLE_12C|DM)/] },
|
|
101
|
+
],
|
|
102
|
+
},
|
|
103
|
+
{
|
|
104
|
+
title: "Multi-data-source capability boundary",
|
|
105
|
+
sources: [
|
|
106
|
+
{
|
|
107
|
+
suffix: "/MultiDataSourceHolder.java",
|
|
108
|
+
patterns: [/public class MultiDataSourceHolder/, /Map<String, DataSource>/, /getMultiDataSource\(/],
|
|
109
|
+
},
|
|
110
|
+
],
|
|
111
|
+
},
|
|
112
|
+
];
|
|
113
|
+
|
|
114
|
+
const exists = async (target) => {
|
|
115
|
+
try {
|
|
116
|
+
await access(target);
|
|
117
|
+
return true;
|
|
118
|
+
} catch {
|
|
119
|
+
return false;
|
|
120
|
+
}
|
|
121
|
+
};
|
|
122
|
+
|
|
123
|
+
async function walk(root) {
|
|
124
|
+
if (!await exists(root)) return [];
|
|
125
|
+
const output = [];
|
|
126
|
+
for (const item of await readdir(root, { withFileTypes: true })) {
|
|
127
|
+
const target = path.join(root, item.name);
|
|
128
|
+
if (item.isDirectory() && !SKIPPED_DIRECTORIES.has(item.name)) output.push(...await walk(target));
|
|
129
|
+
else if (item.isFile()) output.push(target);
|
|
130
|
+
}
|
|
131
|
+
return output;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
function relative(root, target) {
|
|
135
|
+
const value = path.relative(root, target).replaceAll(path.sep, "/");
|
|
136
|
+
return value && !value.startsWith("..") ? value : target;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
function runGit(root, args) {
|
|
140
|
+
return execFileSync("git", ["-C", root, ...args], {
|
|
141
|
+
encoding: "utf8",
|
|
142
|
+
stdio: ["ignore", "pipe", "ignore"],
|
|
143
|
+
}).trim();
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
export function sourceState(root, componentPaths) {
|
|
147
|
+
try {
|
|
148
|
+
const commit = runGit(root, ["rev-parse", "HEAD"]);
|
|
149
|
+
const componentWorktree = runGit(root, ["status", "--porcelain", "--", ...componentPaths]) ? "dirty" : "clean";
|
|
150
|
+
const componentTrees = componentPaths.map((componentPath) => {
|
|
151
|
+
let tree = "missing";
|
|
152
|
+
try {
|
|
153
|
+
tree = runGit(root, ["rev-parse", `HEAD:${componentPath}`]);
|
|
154
|
+
} catch {
|
|
155
|
+
// The path can be newly added or absent in the indexed commit.
|
|
156
|
+
}
|
|
157
|
+
return { path: componentPath, tree };
|
|
158
|
+
});
|
|
159
|
+
return { commit, componentWorktree, componentTrees };
|
|
160
|
+
} catch {
|
|
161
|
+
return {
|
|
162
|
+
commit: "unavailable",
|
|
163
|
+
componentWorktree: "unknown",
|
|
164
|
+
componentTrees: componentPaths.map((componentPath) => ({ path: componentPath, tree: "unavailable" })),
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
async function sourceRoot() {
|
|
170
|
+
if (process.env.YSS_SOURCE_ROOT) {
|
|
171
|
+
const root = path.resolve(process.env.YSS_SOURCE_ROOT);
|
|
172
|
+
if (await exists(path.join(root, "yss-microservice-components"))) return root;
|
|
173
|
+
throw new Error(`YSS_SOURCE_ROOT must point to the repository root containing \`yss-microservice-components\`: ${root}`);
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
const home = os.homedir();
|
|
177
|
+
const candidates = [
|
|
178
|
+
process.cwd(),
|
|
179
|
+
...ancestors(process.cwd()),
|
|
180
|
+
path.join(home, "Documents/yss-project/yss-cloud-microservice"),
|
|
181
|
+
path.join(home, "Documents/yss-project"),
|
|
182
|
+
path.join(home, "Projects/yss-cloud-microservice"),
|
|
183
|
+
path.join(home, "Projects"),
|
|
184
|
+
];
|
|
185
|
+
for (const base of [path.join(home, "Projects"), path.join(home, "Documents"), path.join(home, "Documents/yss-project")]) {
|
|
186
|
+
if (!await exists(base)) continue;
|
|
187
|
+
for (const entry of await readdir(base, { withFileTypes: true })) {
|
|
188
|
+
if (entry.isDirectory()) candidates.push(path.join(base, entry.name));
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
for (const root of candidates) {
|
|
192
|
+
if (await exists(path.join(root, "yss-microservice-components"))) return path.resolve(root);
|
|
193
|
+
}
|
|
194
|
+
throw new Error("Could not find a YSS source repository containing `yss-microservice-components`. Export YSS_SOURCE_ROOT=/absolute/path/to/yss-cloud-microservice and rerun.");
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
function ancestors(start) {
|
|
198
|
+
const output = [];
|
|
199
|
+
let current = path.resolve(start);
|
|
200
|
+
while (path.dirname(current) !== current) {
|
|
201
|
+
current = path.dirname(current);
|
|
202
|
+
output.push(current);
|
|
203
|
+
}
|
|
204
|
+
return output;
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
async function files(bases) {
|
|
208
|
+
const output = { docs: [], poms: [], java: [], metadata: [] };
|
|
209
|
+
for (const base of bases) {
|
|
210
|
+
for (const target of await walk(base)) {
|
|
211
|
+
if (DOCS.has(path.basename(target))) output.docs.push(target);
|
|
212
|
+
else if (path.basename(target) === "pom.xml") output.poms.push(target);
|
|
213
|
+
else if (target.endsWith(".java") && target.includes(`${path.sep}src${path.sep}main${path.sep}java${path.sep}`)) output.java.push(target);
|
|
214
|
+
else if (path.basename(target) === "spring.factories") output.metadata.push(target);
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
for (const items of Object.values(output)) items.sort();
|
|
218
|
+
return output;
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
async function sha256(target) {
|
|
222
|
+
return createHash("sha256").update(await readFile(target)).digest("hex");
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
function list(items, render, empty) {
|
|
226
|
+
return items.length ? items.map(render) : [empty];
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
async function genericJavaEntries(source, javaFiles) {
|
|
230
|
+
const selected = javaFiles
|
|
231
|
+
.filter((target) => KEYS.some((key) => path.basename(target, ".java").includes(key)))
|
|
232
|
+
.slice(0, 120);
|
|
233
|
+
const output = [];
|
|
234
|
+
for (const target of selected) {
|
|
235
|
+
output.push(`- \`${relative(source, target)}\` — \`sha256:${await sha256(target)}\``);
|
|
236
|
+
}
|
|
237
|
+
return output.length ? output : ["- No key Java entry points matched the configured name patterns."];
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
function matchingLines(contents, patterns) {
|
|
241
|
+
return contents
|
|
242
|
+
.split(/\r?\n/)
|
|
243
|
+
.map((line, index) => ({ line: index + 1, text: line.trim().replace(/\s+/g, " ") }))
|
|
244
|
+
.filter(({ text }) => text && patterns.some((pattern) => pattern.test(text)))
|
|
245
|
+
.slice(0, 14);
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
async function mybatisCapabilityMatrix(source, javaFiles, metadataFiles) {
|
|
249
|
+
const output = ["## Capability Matrix", ""];
|
|
250
|
+
for (const capability of MYBATIS_CAPABILITIES) {
|
|
251
|
+
output.push(`### ${capability.title}`, "");
|
|
252
|
+
for (const expected of capability.sources) {
|
|
253
|
+
const target = javaFiles.find((candidate) => relative(source, candidate).endsWith(expected.suffix));
|
|
254
|
+
if (!target) {
|
|
255
|
+
output.push(`- \`${path.basename(expected.suffix)}\` — source not found.`);
|
|
256
|
+
continue;
|
|
257
|
+
}
|
|
258
|
+
const sourcePath = relative(source, target);
|
|
259
|
+
output.push(`- \`${sourcePath}\` — \`sha256:${await sha256(target)}\``);
|
|
260
|
+
const lines = matchingLines(await readFile(target, "utf8"), expected.patterns);
|
|
261
|
+
if (!lines.length) output.push(" - No configured public fact matched; refresh rules may need maintenance.");
|
|
262
|
+
else for (const fact of lines) output.push(` - \`${sourcePath}:${fact.line}\` — \`${fact.text.replaceAll("`", "'")}\``);
|
|
263
|
+
}
|
|
264
|
+
output.push("");
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
output.push("### Auto-configuration registration", "");
|
|
268
|
+
for (const target of metadataFiles) {
|
|
269
|
+
const sourcePath = relative(source, target);
|
|
270
|
+
output.push(`- \`${sourcePath}\` — \`sha256:${await sha256(target)}\``);
|
|
271
|
+
const registrations = (await readFile(target, "utf8"))
|
|
272
|
+
.split(/\r?\n/)
|
|
273
|
+
.map((line) => line.trim())
|
|
274
|
+
.filter((line) => line && !line.startsWith("#"));
|
|
275
|
+
for (const registration of registrations.slice(0, 12)) output.push(` - \`${registration.replaceAll("`", "'")}\``);
|
|
276
|
+
}
|
|
277
|
+
if (!metadataFiles.length) output.push("- No `spring.factories` registration found.");
|
|
278
|
+
output.push("");
|
|
279
|
+
return output;
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
async function backendIndex({ skill, parts, source, found, now, stateResolver }) {
|
|
283
|
+
const currentState = stateResolver(source, parts);
|
|
284
|
+
const bases = parts.map((item) => path.join(source, item));
|
|
285
|
+
const baseHints = await Promise.all(bases.map(async (target) =>
|
|
286
|
+
`- \`${relative(source, target)}\` (${await exists(target) ? "existed" : "missing"} when indexed)`,
|
|
287
|
+
));
|
|
288
|
+
const treeLines = currentState.componentTrees.map(({ path: componentPath, tree }) =>
|
|
289
|
+
`Component tree \`${componentPath}\`: \`${tree}\``,
|
|
290
|
+
);
|
|
291
|
+
const lines = [
|
|
292
|
+
`# ${skill} Source Index`,
|
|
293
|
+
"",
|
|
294
|
+
`Generated: ${now}`,
|
|
295
|
+
`Source commit: \`${currentState.commit}\``,
|
|
296
|
+
`Component worktree: \`${currentState.componentWorktree}\``,
|
|
297
|
+
...treeLines,
|
|
298
|
+
"Indexed source root: resolved at refresh time; set `YSS_SOURCE_ROOT` to reproduce or refresh.",
|
|
299
|
+
"",
|
|
300
|
+
"This file is generated by `yss-skill-source-index-refresh/scripts/refresh-yss-skill-index.mjs`. Do not hand-edit generated sections.",
|
|
301
|
+
"",
|
|
302
|
+
"Paths are relocatable source hints. Exact guidance requires a matching component tree and a clean indexed component subtree; the repository commit is trace metadata and may differ when unrelated components change.",
|
|
303
|
+
"",
|
|
304
|
+
"## Component Path Hints",
|
|
305
|
+
"",
|
|
306
|
+
...baseHints,
|
|
307
|
+
"",
|
|
308
|
+
"## Documentation Files",
|
|
309
|
+
"",
|
|
310
|
+
...list(found.docs, (target) => `- \`${relative(source, target)}\``, "- No component documentation files found."),
|
|
311
|
+
"",
|
|
312
|
+
"Component documentation is a discovery aid. For API signatures, conditions and defaults, prefer the indexed source facts below when documentation differs.",
|
|
313
|
+
"",
|
|
314
|
+
"## Maven Modules",
|
|
315
|
+
"",
|
|
316
|
+
...list(found.poms, (target) => `- \`${relative(source, path.dirname(target))}\``, "- No Maven modules found."),
|
|
317
|
+
"",
|
|
318
|
+
];
|
|
319
|
+
|
|
320
|
+
if (skill === "yss-mybatis") lines.push(...await mybatisCapabilityMatrix(source, found.java, found.metadata));
|
|
321
|
+
else lines.push("## Key Java Entry Points", "", ...await genericJavaEntries(source, found.java), "");
|
|
322
|
+
|
|
323
|
+
lines.push(
|
|
324
|
+
"## Freshness and Use",
|
|
325
|
+
"",
|
|
326
|
+
"- Locate the current source root using `YSS_SOURCE_ROOT`, CodeGraph, Maven artifact names or repository search.",
|
|
327
|
+
"- Compare each indexed `Component tree` with `git rev-parse HEAD:<component-path>` and require the current component subtree to be clean before exact guidance.",
|
|
328
|
+
"- 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.",
|
|
329
|
+
"- Read only the source entries needed for the current decision or troubleshooting path.",
|
|
330
|
+
"",
|
|
331
|
+
);
|
|
332
|
+
return lines.join("\n");
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
export async function refresh({
|
|
336
|
+
skillsRoot,
|
|
337
|
+
source,
|
|
338
|
+
now = new Date().toISOString(),
|
|
339
|
+
frontend = true,
|
|
340
|
+
backendSkills = Object.keys(BACKEND),
|
|
341
|
+
stateResolver = sourceState,
|
|
342
|
+
}) {
|
|
343
|
+
const unknownSkills = backendSkills.filter((skill) => !(skill in BACKEND));
|
|
344
|
+
if (unknownSkills.length) throw new Error(`Unknown backend source-index skill: ${unknownSkills.join(", ")}`);
|
|
345
|
+
for (const skill of backendSkills) {
|
|
346
|
+
const parts = BACKEND[skill];
|
|
347
|
+
const bases = parts.map((item) => path.join(source, item));
|
|
348
|
+
const found = await files(bases);
|
|
349
|
+
const target = path.join(skillsRoot, skill, "references", "source-index.md");
|
|
350
|
+
await mkdir(path.dirname(target), { recursive: true });
|
|
351
|
+
await writeFile(target, await backendIndex({ skill, parts, source, found, now, stateResolver }), "utf8");
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
if (frontend) {
|
|
355
|
+
for (const [skill, keys] of Object.entries(FRONTEND)) {
|
|
356
|
+
if (!await exists(path.join(skillsRoot, skill))) continue;
|
|
357
|
+
const target = path.join(skillsRoot, skill, "references", "frontend-docs.md");
|
|
358
|
+
await mkdir(path.dirname(target), { recursive: true });
|
|
359
|
+
await writeFile(target, [
|
|
360
|
+
`# ${skill} Frontend Documentation`,
|
|
361
|
+
"",
|
|
362
|
+
`Generated: ${now}`,
|
|
363
|
+
"",
|
|
364
|
+
"Use these YSS UI documentation entry points as authoritative references when local repo examples are insufficient.",
|
|
365
|
+
"",
|
|
366
|
+
...keys.map((key) => `- ${key}: ${URLS[key]}`),
|
|
367
|
+
"",
|
|
368
|
+
"When documentation and local code differ, inspect the current project code before editing and prefer established local usage.",
|
|
369
|
+
"",
|
|
370
|
+
].join("\n"), "utf8");
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
return { backend: backendSkills.length, frontend: frontend ? Object.keys(FRONTEND).length : 0 };
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
async function main() {
|
|
377
|
+
try {
|
|
378
|
+
const script = path.dirname(fileURLToPath(import.meta.url));
|
|
379
|
+
const result = await refresh({
|
|
380
|
+
skillsRoot: path.resolve(process.env.YSS_SKILLS_ROOT || path.join(script, "../..")),
|
|
381
|
+
source: await sourceRoot(),
|
|
382
|
+
frontend: !["0", "false", "no"].includes((process.env.YSS_REFRESH_FRONTEND || "true").toLowerCase()),
|
|
383
|
+
backendSkills: process.env.YSS_REFRESH_BACKEND_SKILLS
|
|
384
|
+
? process.env.YSS_REFRESH_BACKEND_SKILLS.split(",").map((skill) => skill.trim()).filter(Boolean)
|
|
385
|
+
: Object.keys(BACKEND),
|
|
386
|
+
});
|
|
387
|
+
console.log(`Updated ${result.backend} backend indexes and ${result.frontend} frontend doc references.`);
|
|
388
|
+
} catch (error) {
|
|
389
|
+
console.error(error.message);
|
|
390
|
+
process.exitCode = 1;
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
if (process.argv[1] === fileURLToPath(import.meta.url)) await main();
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import assert from "node:assert/strict";
|
|
2
|
+
import { execFileSync } from "node:child_process";
|
|
2
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";
|
|
6
|
-
import { refresh } from "./refresh-yss-skill-index.mjs";
|
|
7
|
+
import { refresh, sourceState } from "./refresh-yss-skill-index.mjs";
|
|
7
8
|
|
|
8
9
|
test("writes Node-labelled generated indexes", async () => {
|
|
9
10
|
const root=await mkdtemp(path.join(tmpdir(),"yss-index-")); const source=path.join(root,"source"); const skills=path.join(root,"skills");
|
|
@@ -13,3 +14,80 @@ test("writes Node-labelled generated indexes", async () => {
|
|
|
13
14
|
assert.match(await readFile(path.join(skills,"yss-cache/references/source-index.md"),"utf8"),/refresh-yss-skill-index\.mjs/);
|
|
14
15
|
assert.match(await readFile(path.join(skills,"yss-ui/references/frontend-docs.md"),"utf8"),/components/);
|
|
15
16
|
});
|
|
17
|
+
|
|
18
|
+
test("writes a source-backed MyBatis capability matrix without absolute paths", async () => {
|
|
19
|
+
const root = await mkdtemp(path.join(tmpdir(), "yss-mybatis-index-"));
|
|
20
|
+
const source = path.join(root, "source");
|
|
21
|
+
const skills = path.join(root, "skills");
|
|
22
|
+
const component = "yss-microservice-components/yss-component-persistence";
|
|
23
|
+
const plusJava = path.join(source, component, "yss-component-mybatis-plus-starter/src/main/java/com/yss/cloud/mybatis");
|
|
24
|
+
const baseJava = path.join(source, component, "yss-component-mybatis-starter/src/main/java/com/yss/cloud/mybatis");
|
|
25
|
+
const commonJava = path.join(source, component, "yss-component-persistence-common/src/main/java/com/yss/cloud/mybatis");
|
|
26
|
+
|
|
27
|
+
await mkdir(path.join(plusJava, "support"), { recursive: true });
|
|
28
|
+
await mkdir(path.join(baseJava, "config"), { recursive: true });
|
|
29
|
+
await mkdir(commonJava, { recursive: true });
|
|
30
|
+
await mkdir(path.join(skills, "yss-mybatis"), { recursive: true });
|
|
31
|
+
await writeFile(path.join(source, component, "pom.xml"), "<project/>");
|
|
32
|
+
await writeFile(path.join(plusJava, "support/BasePlusRepository.java"), [
|
|
33
|
+
"public interface BasePlusRepository<T> extends BaseMapper<T> {",
|
|
34
|
+
" default Integer insertBatchSomeColumn(List<T> entities) { return 0; }",
|
|
35
|
+
" Integer insertBatchSomeColumnInternal(List<T> entities);",
|
|
36
|
+
"}",
|
|
37
|
+
].join("\n"));
|
|
38
|
+
await writeFile(path.join(baseJava, "config/PageQueryEntityConfigration.java"), [
|
|
39
|
+
"public class PageQueryEntityConfigration {",
|
|
40
|
+
" @ConditionalOnProperty(name = \"yss.mybatis.page-helper.enabled\", havingValue = \"true\", matchIfMissing = true)",
|
|
41
|
+
"}",
|
|
42
|
+
].join("\n"));
|
|
43
|
+
await writeFile(path.join(commonJava, "MultiDataSourceHolder.java"), [
|
|
44
|
+
"public class MultiDataSourceHolder {",
|
|
45
|
+
" private Map<String, DataSource> multiDataSource;",
|
|
46
|
+
"}",
|
|
47
|
+
].join("\n"));
|
|
48
|
+
|
|
49
|
+
await refresh({
|
|
50
|
+
skillsRoot: skills,
|
|
51
|
+
source,
|
|
52
|
+
now: "2026-01-01T00:00:00Z",
|
|
53
|
+
frontend: false,
|
|
54
|
+
backendSkills: ["yss-mybatis"],
|
|
55
|
+
stateResolver: () => ({
|
|
56
|
+
commit: "a".repeat(40),
|
|
57
|
+
componentWorktree: "clean",
|
|
58
|
+
componentTrees: [{ path: component, tree: "b".repeat(40) }],
|
|
59
|
+
}),
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
const index = await readFile(path.join(skills, "yss-mybatis/references/source-index.md"), "utf8");
|
|
63
|
+
assert.match(index, /## Capability Matrix/);
|
|
64
|
+
assert.match(index, /BasePlusRepository<T>/);
|
|
65
|
+
assert.match(index, /yss\.mybatis\.page-helper\.enabled/);
|
|
66
|
+
assert.match(index, /Map<String, DataSource>/);
|
|
67
|
+
assert.match(index, /Component worktree: `clean`/);
|
|
68
|
+
assert.match(index, /Component tree.*b{40}/);
|
|
69
|
+
assert.doesNotMatch(index, new RegExp(root.replaceAll("/", "\\/")));
|
|
70
|
+
assert.doesNotMatch(index, /## Key Java Entry Points/);
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
test("source freshness is scoped to the indexed component subtree", async () => {
|
|
74
|
+
const root = await mkdtemp(path.join(tmpdir(), "yss-component-state-"));
|
|
75
|
+
const component = "yss-microservice-components/yss-component-persistence";
|
|
76
|
+
const componentFile = path.join(root, component, "pom.xml");
|
|
77
|
+
const unrelatedFile = path.join(root, "yss-microservice-components/other/README.md");
|
|
78
|
+
await mkdir(path.dirname(componentFile), { recursive: true });
|
|
79
|
+
await mkdir(path.dirname(unrelatedFile), { recursive: true });
|
|
80
|
+
await writeFile(componentFile, "<project/>\n");
|
|
81
|
+
await writeFile(unrelatedFile, "clean\n");
|
|
82
|
+
execFileSync("git", ["init", "-q"], { cwd: root });
|
|
83
|
+
execFileSync("git", ["config", "user.email", "test@example.com"], { cwd: root });
|
|
84
|
+
execFileSync("git", ["config", "user.name", "Test"], { cwd: root });
|
|
85
|
+
execFileSync("git", ["add", "."], { cwd: root });
|
|
86
|
+
execFileSync("git", ["commit", "-qm", "fixture"], { cwd: root });
|
|
87
|
+
|
|
88
|
+
await writeFile(unrelatedFile, "dirty elsewhere\n");
|
|
89
|
+
assert.equal(sourceState(root, [component]).componentWorktree, "clean");
|
|
90
|
+
|
|
91
|
+
await writeFile(componentFile, "<project><dirty/></project>\n");
|
|
92
|
+
assert.equal(sourceState(root, [component]).componentWorktree, "dirty");
|
|
93
|
+
});
|
|
@@ -219,6 +219,7 @@ gate_policy:
|
|
|
219
219
|
- gate.repository-identity-valid
|
|
220
220
|
- gate.prototype-verified
|
|
221
221
|
orchestrator:
|
|
222
|
+
- gate.implementation-repositories-ready
|
|
222
223
|
- gate.slice-contract-approved
|
|
223
224
|
- gate.slice-ready-for-agent
|
|
224
225
|
digital_human_review:
|
|
@@ -275,6 +276,7 @@ user_decision_policy:
|
|
|
275
276
|
work_units:
|
|
276
277
|
work-unit.discovery-requirements: discovery-conclusion
|
|
277
278
|
work-unit.service-project-initialization: scaffold-choice
|
|
279
|
+
work-unit.implementation-repository-preparation: scaffold-choice
|
|
278
280
|
work-unit.slice-implementation: implementation-scope
|
|
279
281
|
work-unit.release-and-retrospective: gate.release-ready
|
|
280
282
|
work_unit_gates:
|
|
@@ -85,6 +85,7 @@ capabilities:
|
|
|
85
85
|
- { id: component.gateway-resilience, primary_skill: yss-resilience4j, task_modes: [guidance, integration, slice-implementation, troubleshooting, component-maintenance, review-input] }
|
|
86
86
|
- { id: scaffold.ddd, primary_skill: yss-ddd-scaffold-generator, task_modes: [integration, component-maintenance] }
|
|
87
87
|
- { id: scaffold.layered-mvc, primary_skill: yss-layered-mvc-scaffold-generator, task_modes: [integration, component-maintenance] }
|
|
88
|
+
- { id: scaffold.frontend-vue3, primary_skill: yss-frontend-scaffold-generator, task_modes: [integration, component-maintenance] }
|
|
88
89
|
- { id: project-init.mvc-data-analysis, primary_skill: yss-mvc-data-analysis-project-initializer, task_modes: [component-maintenance] }
|
|
89
90
|
- { id: migration.springboot3, primary_skill: yss-up-springboot3, task_modes: [guidance, integration, troubleshooting, component-maintenance, review-input] }
|
|
90
91
|
recipes:
|
|
@@ -106,8 +107,12 @@ recipes:
|
|
|
106
107
|
- { id: backend.distributed-id, capabilities: [component.distributed-id] }
|
|
107
108
|
- { id: backend.ddd-scaffold, capabilities: [scaffold.ddd, quality.java-code-style] }
|
|
108
109
|
- { id: backend.mvc-scaffold, capabilities: [scaffold.layered-mvc, quality.java-code-style] }
|
|
110
|
+
- { id: frontend.vue3-scaffold, capabilities: [scaffold.frontend-vue3] }
|
|
109
111
|
- { id: backend.springboot3-migration, capabilities: [migration.springboot3, quality.java-code-style] }
|
|
110
112
|
skill_dependencies:
|
|
113
|
+
code-review:
|
|
114
|
+
- { skill: yss-repository, type: context-conditional, when: backend-persistence-impact }
|
|
115
|
+
- { skill: yss-mybatis, type: context-conditional, when: backend-persistence-impact }
|
|
111
116
|
yss-prototype-stage:
|
|
112
117
|
- { skill: prototype-review, type: review-only }
|
|
113
118
|
- { skill: yss-design-system, type: coordination-only }
|
|
@@ -39,6 +39,7 @@
|
|
|
39
39
|
| `gate.openapi-frozen` | OpenAPI Freeze | `stage.system-data-engineering` | API 进入实现。 | 无 | `evidence.approval-record` |
|
|
40
40
|
| `gate.engineering-baseline-accepted` | 工程基线 | `stage.system-data-engineering` | 后端、前端或高风险工程变化。 | 无 | `evidence.fresh-verification` |
|
|
41
41
|
| `gate.architecture-reviewed` | 架构审查 | `stage.system-data-engineering` | 高风险或跨边界变化。 | 无 | `evidence.design-review-result` |
|
|
42
|
+
| `gate.implementation-repositories-ready` | 实现仓库准备就绪 | `stage.system-data-engineering` | 后端或前端交付面进入 Ticket 正式化;未命中的交付面须记录带原因的 not-applicable。 | `gate.engineering-baseline-accepted` | `evidence.implementation-repository-preparation`、`evidence.fresh-verification` |
|
|
42
43
|
| `gate.slice-contract-approved` | Slice Implementation Contract 批准 | `stage.ticket-formalization` | Agent 进入实现;脚手架完成后每个后续生成代码工作单元。 | 无 | `evidence.contract-approval` |
|
|
43
44
|
| `gate.slice-ready-for-agent` | 垂直切片实现就绪 | `stage.ticket-formalization` | 垂直切片具备直接实现条件。 | 无 | `evidence.contract-approval`、`evidence.approval-record` |
|
|
44
45
|
| `gate.frontend-implementation-verified` | 前端实现还原验证 | `stage.verification-release-retrospective` | UI 影响切片完成实现并准备合并、发布或阶段完成。 | 无 | `evidence.frontend-implementation-verification` |
|
|
@@ -67,6 +68,8 @@
|
|
|
67
68
|
| `artifact.engineering-baseline` | 工程基线记录 | `stage.system-data-engineering` | 后端、前端或高风险工程变化。 |
|
|
68
69
|
| `artifact.architecture-review` | 架构审查记录 | `stage.system-data-engineering` | 高风险或跨边界变化。 |
|
|
69
70
|
| `artifact.technical-design` | 技术设计合同 | `stage.system-data-engineering` | 后端技术设计需要按已确认 DDD 或 MVC 架构明确行为、分层、一致性或数据映射。 |
|
|
71
|
+
| `artifact.project-scaffold-contract` | Project Scaffold Contract | `stage.system-data-engineering` | 命中的前端或后端交付面选择初始化新工程。 |
|
|
72
|
+
| `artifact.implementation-repository-preparation-result` | 实现仓库准备结果 | `stage.system-data-engineering` | 后端或前端交付面进入 Ticket 正式化。 |
|
|
70
73
|
| `artifact.tactical-design` | DDD 战术设计 | `stage.system-data-engineering` | 聚合边界、状态机、一致性或持久化映射复杂到无法在系统概要设计的 Tactical DDD Check 中清楚表达。 |
|
|
71
74
|
| `artifact.spec-delta` | Spec Delta | `stage.spec-architecture` | 已有冻结 Spec 的高风险行为变化。 |
|
|
72
75
|
| `artifact.parent-ticket` | 功能父 Ticket | `stage.ticket-formalization` | 每个进入追踪的功能。 |
|
|
@@ -101,6 +104,7 @@
|
|
|
101
104
|
| `evidence.yss-skill-execution-result` | YSS Skill Execution Result | 专项 skill 的合同版本、写入、验证、延期 seam 与偏离证据。 |
|
|
102
105
|
| `evidence.frontend-implementation-verification` | 前端实现还原验证证据 | UI 实现相对冻结原型和 Spec 的桌面/窄屏视觉、状态、交互、控制台与 pnpm 验证记录。 |
|
|
103
106
|
| `evidence.fresh-verification` | Fresh Verification 记录 | 本轮实际执行的验证命令、结果和时间。 |
|
|
107
|
+
| `evidence.implementation-repository-preparation` | 实现仓库准备证据 | 按项目记录交付面、已有仓库接入或新脚手架合同、生成清单、实际验证结果、仓库位置、Git 边界和当前版本。 |
|
|
104
108
|
| `evidence.checkpoint-and-rollback` | Checkpoint 与回滚点 | 可追溯的变更边界、发布记录和恢复动作。 |
|
|
105
109
|
<!-- lifecycle-registry:structure:end -->
|
|
106
110
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schema_version": 1,
|
|
3
3
|
"registry_id": "yss.lifecycle",
|
|
4
|
-
"semantic_sha256": "
|
|
4
|
+
"semantic_sha256": "68c053060bb837fe4bc2b40d7a6ffcea1a53fc6b5e6b929eb0858824c657a15d",
|
|
5
5
|
"published_ids": [
|
|
6
6
|
"artifact.architecture-review",
|
|
7
7
|
"artifact.data-architecture",
|
|
@@ -13,12 +13,14 @@
|
|
|
13
13
|
"artifact.functional-architecture",
|
|
14
14
|
"artifact.high-fidelity-html-prototype",
|
|
15
15
|
"artifact.impact-assessment",
|
|
16
|
+
"artifact.implementation-repository-preparation-result",
|
|
16
17
|
"artifact.interaction-spec",
|
|
17
18
|
"artifact.low-fidelity-prototype",
|
|
18
19
|
"artifact.openapi-draft",
|
|
19
20
|
"artifact.openapi-freeze-record",
|
|
20
21
|
"artifact.parent-ticket",
|
|
21
22
|
"artifact.product-overview",
|
|
23
|
+
"artifact.project-scaffold-contract",
|
|
22
24
|
"artifact.prototype-confirmation",
|
|
23
25
|
"artifact.prototype-deliverable",
|
|
24
26
|
"artifact.prototype-review",
|
|
@@ -42,6 +44,7 @@
|
|
|
42
44
|
"evidence.fresh-verification",
|
|
43
45
|
"evidence.frontend-implementation-verification",
|
|
44
46
|
"evidence.impact-assessment",
|
|
47
|
+
"evidence.implementation-repository-preparation",
|
|
45
48
|
"evidence.maintenance-intensity-checkpoint",
|
|
46
49
|
"evidence.openapi-draft-review",
|
|
47
50
|
"evidence.prototype-confirmation",
|
|
@@ -59,6 +62,7 @@
|
|
|
59
62
|
"gate.engineering-baseline-accepted",
|
|
60
63
|
"gate.frontend-delivery-inputs-verified",
|
|
61
64
|
"gate.frontend-implementation-verified",
|
|
65
|
+
"gate.implementation-repositories-ready",
|
|
62
66
|
"gate.openapi-draft-reviewed",
|
|
63
67
|
"gate.openapi-frozen",
|
|
64
68
|
"gate.prototype-reviewed",
|
|
@@ -86,6 +90,7 @@
|
|
|
86
90
|
"work-unit.entry-triage",
|
|
87
91
|
"work-unit.fresh-verification",
|
|
88
92
|
"work-unit.frontend-implementation-verification",
|
|
93
|
+
"work-unit.implementation-repository-preparation",
|
|
89
94
|
"work-unit.independent-review",
|
|
90
95
|
"work-unit.intensity-aware-review",
|
|
91
96
|
"work-unit.intensity-aware-verification",
|