create-yss-spec 2.1.15 → 2.2.1
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 +6 -2
- package/package.json +1 -1
- package/src/cli.js +276 -15
- package/template/.agents/rules/yss-ai-skills.md +59 -0
- package/template/.agents/skills/.yss-skills-manifest.json +28 -0
- package/template/.agents/skills/component-selection-imports/SKILL.md +64 -0
- package/template/.agents/skills/cross-repo-implementation-routing/SKILL.md +2 -2
- package/template/.agents/skills/file-export-download/SKILL.md +160 -0
- package/template/.agents/skills/file-export-download/agents/openai.yaml +4 -0
- package/template/.agents/skills/formily-foundation/SKILL.md +176 -0
- package/template/.agents/skills/formily-foundation/references/examples.md +486 -0
- package/template/.agents/skills/formily-linkage-effects/SKILL.md +167 -0
- package/template/.agents/skills/formily-mode-slot-detail/SKILL.md +137 -0
- package/template/.agents/skills/formily-step-flow/SKILL.md +194 -0
- package/template/.agents/skills/frontend-commit/SKILL.md +118 -0
- package/template/.agents/skills/frontend-commit/agents/openai.yaml +7 -0
- package/template/.agents/skills/frontend-commit/references/scope-and-examples.md +111 -0
- package/template/.agents/skills/implementation-repo-onboarding/SKILL.md +5 -5
- package/template/.agents/skills/java-backend-commit/SKILL.md +121 -0
- package/template/.agents/skills/java-backend-commit/agents/openai.yaml +7 -0
- package/template/.agents/skills/java-backend-commit/references/scope-and-examples.md +118 -0
- package/template/.agents/skills/llm-wiki/SKILL.md +1 -1
- package/template/.agents/skills/llm-wiki/references/discover.md +1 -0
- package/template/.agents/skills/page-form-module/SKILL.md +168 -0
- package/template/.agents/skills/page-list-module/SKILL.md +137 -0
- package/template/.agents/skills/page-skeleton/SKILL.md +76 -0
- package/template/.agents/skills/page-skeleton/examples/AdvancedFormPage/constant.ts +34 -0
- package/template/.agents/skills/page-skeleton/examples/AdvancedFormPage/hooks/useRuleConfig.ts +75 -0
- package/template/.agents/skills/page-skeleton/examples/AdvancedFormPage/index.vue +107 -0
- package/template/.agents/skills/page-skeleton/examples/AdvancedFormPage/schemas/ruleConfigSchema.ts +256 -0
- package/template/.agents/skills/page-skeleton/examples/AdvancedFormPage/style.less +30 -0
- package/template/.agents/skills/page-skeleton/examples/StandardListPage/constant.ts +28 -0
- package/template/.agents/skills/page-skeleton/examples/StandardListPage/hooks/useQualityRuleList.ts +58 -0
- package/template/.agents/skills/page-skeleton/examples/StandardListPage/hooks/useRuleActions.ts +65 -0
- package/template/.agents/skills/page-skeleton/examples/StandardListPage/index.vue +91 -0
- package/template/.agents/skills/page-skeleton/examples/StandardListPage/style.less +49 -0
- package/template/.agents/skills/prototype-page-acceptance/SKILL.md +62 -0
- package/template/.agents/skills/theme-token-usage/SKILL.md +123 -0
- package/template/.agents/skills/theme-token-usage/agents/openai.yaml +4 -0
- package/template/.agents/skills/vue3-best-practices/SKILL.md +68 -0
- package/template/.agents/skills/yedit-table-usage/SKILL.md +227 -0
- package/template/.agents/skills/yss-api-integration/SKILL.md +12 -2
- package/template/.agents/skills/yss-components/SKILL.md +1 -1
- package/template/.agents/skills/yss-ddd-scaffold-generator/SKILL.md +1 -1
- package/template/.agents/skills/yss-ddd-scaffold-generator/scripts/generate_scaffold.mjs +30 -3
- package/template/.agents/skills/yss-ddd-scaffold-generator/scripts/scaffold-generator.test.mjs +52 -0
- package/template/.agents/skills/yss-design-system/SKILL.md +1 -1
- package/template/.agents/skills/yss-formily/SKILL.md +233 -265
- package/template/.agents/skills/yss-frontend-scaffold-generator/SKILL.md +2 -2
- package/template/.agents/skills/yss-hook/SKILL.md +1 -1
- package/template/.agents/skills/yss-openapi-governance/SKILL.md +2 -2
- package/template/.agents/skills/yss-page-module-development/SKILL.md +12 -2
- package/template/.agents/skills/yss-page-module-development/references/component-map.md +34 -0
- package/template/.agents/skills/yss-page-module-development/references/hooks-map.md +11 -0
- package/template/.agents/skills/yss-page-module-development/references/utils-map.md +14 -0
- package/template/.agents/skills/yss-product-lifecycle/references/matt-yss-adapter.md +1 -1
- package/template/.agents/skills/yss-product-lifecycle/references/orchestration-contract.yaml +86 -1
- package/template/.agents/skills/yss-product-lifecycle/references/orchestration.md +2 -0
- package/template/.agents/skills/yss-product-lifecycle/references/state-model.md +1 -1
- package/template/.agents/skills/yss-router/SKILL.md +1 -1
- package/template/.agents/skills/yss-router/references/boundaries.md +1 -1
- package/template/.agents/skills/yss-router/references/router-contract.yaml +26 -2
- package/template/.agents/skills/yss-router/references/slice-implementation-contract.md +1 -1
- package/template/.agents/skills/yss-ui/SKILL.md +1 -1
- package/template/.agents/skills/yss-use-table-height/SKILL.md +9 -0
- package/template/.agents/skills/yss-use-tree-height/SKILL.md +9 -0
- package/template/.agents/skills/ytable-usage/SKILL.md +251 -0
- package/template/.agents/skills/ytree-usage/SKILL.md +132 -0
- package/template/.claude/skills/.yss-skills-manifest.json +29 -0
- package/template/.claude/skills/component-selection-imports/SKILL.md +64 -0
- package/template/.claude/skills/cross-repo-implementation-routing/SKILL.md +2 -2
- package/template/.claude/skills/file-export-download/SKILL.md +160 -0
- package/template/.claude/skills/file-export-download/agents/openai.yaml +4 -0
- package/template/.claude/skills/formily-foundation/SKILL.md +176 -0
- package/template/.claude/skills/formily-foundation/references/examples.md +486 -0
- package/template/.claude/skills/formily-linkage-effects/SKILL.md +167 -0
- package/template/.claude/skills/formily-mode-slot-detail/SKILL.md +137 -0
- package/template/.claude/skills/formily-step-flow/SKILL.md +194 -0
- package/template/.claude/skills/frontend-commit/SKILL.md +118 -0
- package/template/.claude/skills/frontend-commit/agents/openai.yaml +7 -0
- package/template/.claude/skills/frontend-commit/references/scope-and-examples.md +111 -0
- package/template/.claude/skills/implementation-repo-onboarding/SKILL.md +5 -5
- package/template/.claude/skills/java-backend-commit/SKILL.md +121 -0
- package/template/.claude/skills/java-backend-commit/agents/openai.yaml +7 -0
- package/template/.claude/skills/java-backend-commit/references/scope-and-examples.md +118 -0
- package/template/.claude/skills/llm-wiki/SKILL.md +1 -1
- package/template/.claude/skills/llm-wiki/references/discover.md +1 -0
- package/template/.claude/skills/page-form-module/SKILL.md +168 -0
- package/template/.claude/skills/page-list-module/SKILL.md +137 -0
- package/template/.claude/skills/page-skeleton/SKILL.md +76 -0
- package/template/.claude/skills/page-skeleton/examples/AdvancedFormPage/constant.ts +34 -0
- package/template/.claude/skills/page-skeleton/examples/AdvancedFormPage/hooks/useRuleConfig.ts +75 -0
- package/template/.claude/skills/page-skeleton/examples/AdvancedFormPage/index.vue +107 -0
- package/template/.claude/skills/page-skeleton/examples/AdvancedFormPage/schemas/ruleConfigSchema.ts +256 -0
- package/template/.claude/skills/page-skeleton/examples/AdvancedFormPage/style.less +30 -0
- package/template/.claude/skills/page-skeleton/examples/StandardListPage/constant.ts +28 -0
- package/template/.claude/skills/page-skeleton/examples/StandardListPage/hooks/useQualityRuleList.ts +58 -0
- package/template/.claude/skills/page-skeleton/examples/StandardListPage/hooks/useRuleActions.ts +65 -0
- package/template/.claude/skills/page-skeleton/examples/StandardListPage/index.vue +91 -0
- package/template/.claude/skills/page-skeleton/examples/StandardListPage/style.less +49 -0
- package/template/.claude/skills/prototype-page-acceptance/SKILL.md +62 -0
- package/template/.claude/skills/theme-token-usage/SKILL.md +123 -0
- package/template/.claude/skills/theme-token-usage/agents/openai.yaml +4 -0
- package/template/.claude/skills/vue3-best-practices/SKILL.md +68 -0
- package/template/.claude/skills/yedit-table-usage/SKILL.md +227 -0
- package/template/.claude/skills/yss-api-integration/SKILL.md +12 -2
- package/template/.claude/skills/yss-components/SKILL.md +1 -1
- package/template/.claude/skills/yss-ddd-scaffold-generator/SKILL.md +1 -1
- package/template/.claude/skills/yss-ddd-scaffold-generator/scripts/generate_scaffold.mjs +30 -3
- package/template/.claude/skills/yss-ddd-scaffold-generator/scripts/scaffold-generator.test.mjs +52 -0
- package/template/.claude/skills/yss-design-system/SKILL.md +1 -1
- package/template/.claude/skills/yss-formily/SKILL.md +233 -265
- package/template/.claude/skills/yss-frontend-scaffold-generator/SKILL.md +2 -2
- package/template/.claude/skills/yss-hook/SKILL.md +1 -1
- package/template/.claude/skills/yss-openapi-governance/SKILL.md +2 -2
- package/template/.claude/skills/yss-page-module-development/SKILL.md +12 -2
- package/template/.claude/skills/yss-page-module-development/references/component-map.md +34 -0
- package/template/.claude/skills/yss-page-module-development/references/hooks-map.md +11 -0
- package/template/.claude/skills/yss-page-module-development/references/utils-map.md +14 -0
- package/template/.claude/skills/yss-product-lifecycle/references/matt-yss-adapter.md +1 -1
- package/template/.claude/skills/yss-product-lifecycle/references/orchestration-contract.yaml +86 -1
- package/template/.claude/skills/yss-product-lifecycle/references/orchestration.md +2 -0
- package/template/.claude/skills/yss-product-lifecycle/references/state-model.md +1 -1
- package/template/.claude/skills/yss-router/SKILL.md +1 -1
- package/template/.claude/skills/yss-router/references/boundaries.md +1 -1
- package/template/.claude/skills/yss-router/references/router-contract.yaml +26 -2
- package/template/.claude/skills/yss-router/references/slice-implementation-contract.md +1 -1
- package/template/.claude/skills/yss-ui/SKILL.md +1 -1
- package/template/.claude/skills/yss-use-table-height/SKILL.md +9 -0
- package/template/.claude/skills/yss-use-tree-height/SKILL.md +9 -0
- package/template/.claude/skills/ytable-usage/SKILL.md +251 -0
- package/template/.claude/skills/ytree-usage/SKILL.md +132 -0
- package/template/.codex/skills/component-selection-imports/SKILL.md +64 -0
- package/template/.codex/skills/cross-repo-implementation-routing/SKILL.md +2 -2
- package/template/.codex/skills/file-export-download/SKILL.md +160 -0
- package/template/.codex/skills/file-export-download/agents/openai.yaml +4 -0
- package/template/.codex/skills/formily-foundation/SKILL.md +176 -0
- package/template/.codex/skills/formily-foundation/references/examples.md +486 -0
- package/template/.codex/skills/formily-linkage-effects/SKILL.md +167 -0
- package/template/.codex/skills/formily-mode-slot-detail/SKILL.md +137 -0
- package/template/.codex/skills/formily-step-flow/SKILL.md +194 -0
- package/template/.codex/skills/frontend-commit/SKILL.md +118 -0
- package/template/.codex/skills/frontend-commit/agents/openai.yaml +7 -0
- package/template/.codex/skills/frontend-commit/references/scope-and-examples.md +111 -0
- package/template/.codex/skills/implementation-repo-onboarding/SKILL.md +5 -5
- package/template/.codex/skills/java-backend-commit/SKILL.md +121 -0
- package/template/.codex/skills/java-backend-commit/agents/openai.yaml +7 -0
- package/template/.codex/skills/java-backend-commit/references/scope-and-examples.md +118 -0
- package/template/.codex/skills/llm-wiki/SKILL.md +1 -1
- package/template/.codex/skills/llm-wiki/references/discover.md +1 -0
- package/template/.codex/skills/page-form-module/SKILL.md +168 -0
- package/template/.codex/skills/page-list-module/SKILL.md +137 -0
- package/template/.codex/skills/page-skeleton/SKILL.md +76 -0
- package/template/.codex/skills/page-skeleton/examples/AdvancedFormPage/constant.ts +34 -0
- package/template/.codex/skills/page-skeleton/examples/AdvancedFormPage/hooks/useRuleConfig.ts +75 -0
- package/template/.codex/skills/page-skeleton/examples/AdvancedFormPage/index.vue +107 -0
- package/template/.codex/skills/page-skeleton/examples/AdvancedFormPage/schemas/ruleConfigSchema.ts +256 -0
- package/template/.codex/skills/page-skeleton/examples/AdvancedFormPage/style.less +30 -0
- package/template/.codex/skills/page-skeleton/examples/StandardListPage/constant.ts +28 -0
- package/template/.codex/skills/page-skeleton/examples/StandardListPage/hooks/useQualityRuleList.ts +58 -0
- package/template/.codex/skills/page-skeleton/examples/StandardListPage/hooks/useRuleActions.ts +65 -0
- package/template/.codex/skills/page-skeleton/examples/StandardListPage/index.vue +91 -0
- package/template/.codex/skills/page-skeleton/examples/StandardListPage/style.less +49 -0
- package/template/.codex/skills/prototype-page-acceptance/SKILL.md +62 -0
- package/template/.codex/skills/theme-token-usage/SKILL.md +123 -0
- package/template/.codex/skills/theme-token-usage/agents/openai.yaml +4 -0
- package/template/.codex/skills/vue3-best-practices/SKILL.md +68 -0
- package/template/.codex/skills/yedit-table-usage/SKILL.md +227 -0
- package/template/.codex/skills/yss-api-integration/SKILL.md +12 -2
- package/template/.codex/skills/yss-components/SKILL.md +1 -1
- package/template/.codex/skills/yss-ddd-scaffold-generator/SKILL.md +1 -1
- package/template/.codex/skills/yss-ddd-scaffold-generator/scripts/generate_scaffold.mjs +30 -3
- package/template/.codex/skills/yss-ddd-scaffold-generator/scripts/scaffold-generator.test.mjs +52 -0
- package/template/.codex/skills/yss-design-system/SKILL.md +1 -1
- package/template/.codex/skills/yss-formily/SKILL.md +233 -265
- package/template/.codex/skills/yss-frontend-scaffold-generator/SKILL.md +2 -2
- package/template/.codex/skills/yss-hook/SKILL.md +1 -1
- package/template/.codex/skills/yss-openapi-governance/SKILL.md +2 -2
- package/template/.codex/skills/yss-page-module-development/SKILL.md +12 -2
- package/template/.codex/skills/yss-page-module-development/references/component-map.md +34 -0
- package/template/.codex/skills/yss-page-module-development/references/hooks-map.md +11 -0
- package/template/.codex/skills/yss-page-module-development/references/utils-map.md +14 -0
- package/template/.codex/skills/yss-product-lifecycle/references/matt-yss-adapter.md +1 -1
- package/template/.codex/skills/yss-product-lifecycle/references/orchestration-contract.yaml +86 -1
- package/template/.codex/skills/yss-product-lifecycle/references/orchestration.md +2 -0
- package/template/.codex/skills/yss-product-lifecycle/references/state-model.md +1 -1
- package/template/.codex/skills/yss-router/SKILL.md +1 -1
- package/template/.codex/skills/yss-router/references/boundaries.md +1 -1
- package/template/.codex/skills/yss-router/references/router-contract.yaml +26 -2
- package/template/.codex/skills/yss-router/references/slice-implementation-contract.md +1 -1
- package/template/.codex/skills/yss-ui/SKILL.md +1 -1
- package/template/.codex/skills/yss-use-table-height/SKILL.md +9 -0
- package/template/.codex/skills/yss-use-tree-height/SKILL.md +9 -0
- package/template/.codex/skills/ytable-usage/SKILL.md +251 -0
- package/template/.codex/skills/ytree-usage/SKILL.md +132 -0
- package/template/.cursor/skills/.yss-skills-manifest.json +29 -0
- package/template/.cursor/skills/component-selection-imports/SKILL.md +64 -0
- package/template/.cursor/skills/cross-repo-implementation-routing/SKILL.md +2 -2
- package/template/.cursor/skills/file-export-download/SKILL.md +160 -0
- package/template/.cursor/skills/file-export-download/agents/openai.yaml +4 -0
- package/template/.cursor/skills/formily-foundation/SKILL.md +176 -0
- package/template/.cursor/skills/formily-foundation/references/examples.md +486 -0
- package/template/.cursor/skills/formily-linkage-effects/SKILL.md +167 -0
- package/template/.cursor/skills/formily-mode-slot-detail/SKILL.md +137 -0
- package/template/.cursor/skills/formily-step-flow/SKILL.md +194 -0
- package/template/.cursor/skills/frontend-commit/SKILL.md +118 -0
- package/template/.cursor/skills/frontend-commit/agents/openai.yaml +7 -0
- package/template/.cursor/skills/frontend-commit/references/scope-and-examples.md +111 -0
- package/template/.cursor/skills/implementation-repo-onboarding/SKILL.md +5 -5
- package/template/.cursor/skills/java-backend-commit/SKILL.md +121 -0
- package/template/.cursor/skills/java-backend-commit/agents/openai.yaml +7 -0
- package/template/.cursor/skills/java-backend-commit/references/scope-and-examples.md +118 -0
- package/template/.cursor/skills/llm-wiki/SKILL.md +1 -1
- package/template/.cursor/skills/llm-wiki/references/discover.md +1 -0
- package/template/.cursor/skills/page-form-module/SKILL.md +168 -0
- package/template/.cursor/skills/page-list-module/SKILL.md +137 -0
- package/template/.cursor/skills/page-skeleton/SKILL.md +76 -0
- package/template/.cursor/skills/page-skeleton/examples/AdvancedFormPage/constant.ts +34 -0
- package/template/.cursor/skills/page-skeleton/examples/AdvancedFormPage/hooks/useRuleConfig.ts +75 -0
- package/template/.cursor/skills/page-skeleton/examples/AdvancedFormPage/index.vue +107 -0
- package/template/.cursor/skills/page-skeleton/examples/AdvancedFormPage/schemas/ruleConfigSchema.ts +256 -0
- package/template/.cursor/skills/page-skeleton/examples/AdvancedFormPage/style.less +30 -0
- package/template/.cursor/skills/page-skeleton/examples/StandardListPage/constant.ts +28 -0
- package/template/.cursor/skills/page-skeleton/examples/StandardListPage/hooks/useQualityRuleList.ts +58 -0
- package/template/.cursor/skills/page-skeleton/examples/StandardListPage/hooks/useRuleActions.ts +65 -0
- package/template/.cursor/skills/page-skeleton/examples/StandardListPage/index.vue +91 -0
- package/template/.cursor/skills/page-skeleton/examples/StandardListPage/style.less +49 -0
- package/template/.cursor/skills/prototype-page-acceptance/SKILL.md +62 -0
- package/template/.cursor/skills/theme-token-usage/SKILL.md +123 -0
- package/template/.cursor/skills/theme-token-usage/agents/openai.yaml +4 -0
- package/template/.cursor/skills/vue3-best-practices/SKILL.md +68 -0
- package/template/.cursor/skills/yedit-table-usage/SKILL.md +227 -0
- package/template/.cursor/skills/yss-api-integration/SKILL.md +12 -2
- package/template/.cursor/skills/yss-components/SKILL.md +1 -1
- package/template/.cursor/skills/yss-ddd-scaffold-generator/SKILL.md +1 -1
- package/template/.cursor/skills/yss-ddd-scaffold-generator/scripts/generate_scaffold.mjs +30 -3
- package/template/.cursor/skills/yss-ddd-scaffold-generator/scripts/scaffold-generator.test.mjs +52 -0
- package/template/.cursor/skills/yss-design-system/SKILL.md +1 -1
- package/template/.cursor/skills/yss-formily/SKILL.md +233 -265
- package/template/.cursor/skills/yss-frontend-scaffold-generator/SKILL.md +2 -2
- package/template/.cursor/skills/yss-hook/SKILL.md +1 -1
- package/template/.cursor/skills/yss-openapi-governance/SKILL.md +2 -2
- package/template/.cursor/skills/yss-page-module-development/SKILL.md +12 -2
- package/template/.cursor/skills/yss-page-module-development/references/component-map.md +34 -0
- package/template/.cursor/skills/yss-page-module-development/references/hooks-map.md +11 -0
- package/template/.cursor/skills/yss-page-module-development/references/utils-map.md +14 -0
- package/template/.cursor/skills/yss-product-lifecycle/references/matt-yss-adapter.md +1 -1
- package/template/.cursor/skills/yss-product-lifecycle/references/orchestration-contract.yaml +86 -1
- package/template/.cursor/skills/yss-product-lifecycle/references/orchestration.md +2 -0
- package/template/.cursor/skills/yss-product-lifecycle/references/state-model.md +1 -1
- package/template/.cursor/skills/yss-router/SKILL.md +1 -1
- package/template/.cursor/skills/yss-router/references/boundaries.md +1 -1
- package/template/.cursor/skills/yss-router/references/router-contract.yaml +26 -2
- package/template/.cursor/skills/yss-router/references/slice-implementation-contract.md +1 -1
- package/template/.cursor/skills/yss-ui/SKILL.md +1 -1
- package/template/.cursor/skills/yss-use-table-height/SKILL.md +9 -0
- package/template/.cursor/skills/yss-use-tree-height/SKILL.md +9 -0
- package/template/.cursor/skills/ytable-usage/SKILL.md +251 -0
- package/template/.cursor/skills/ytree-usage/SKILL.md +132 -0
- package/template/.cursorrules +32 -0
- package/template/.hermes/skills/component-selection-imports/SKILL.md +64 -0
- package/template/.hermes/skills/cross-repo-implementation-routing/SKILL.md +2 -2
- package/template/.hermes/skills/file-export-download/SKILL.md +160 -0
- package/template/.hermes/skills/file-export-download/agents/openai.yaml +4 -0
- package/template/.hermes/skills/formily-foundation/SKILL.md +176 -0
- package/template/.hermes/skills/formily-foundation/references/examples.md +486 -0
- package/template/.hermes/skills/formily-linkage-effects/SKILL.md +167 -0
- package/template/.hermes/skills/formily-mode-slot-detail/SKILL.md +137 -0
- package/template/.hermes/skills/formily-step-flow/SKILL.md +194 -0
- package/template/.hermes/skills/frontend-commit/SKILL.md +118 -0
- package/template/.hermes/skills/frontend-commit/agents/openai.yaml +7 -0
- package/template/.hermes/skills/frontend-commit/references/scope-and-examples.md +111 -0
- package/template/.hermes/skills/implementation-repo-onboarding/SKILL.md +5 -5
- package/template/.hermes/skills/java-backend-commit/SKILL.md +121 -0
- package/template/.hermes/skills/java-backend-commit/agents/openai.yaml +7 -0
- package/template/.hermes/skills/java-backend-commit/references/scope-and-examples.md +118 -0
- package/template/.hermes/skills/llm-wiki/SKILL.md +1 -1
- package/template/.hermes/skills/llm-wiki/references/discover.md +1 -0
- package/template/.hermes/skills/page-form-module/SKILL.md +168 -0
- package/template/.hermes/skills/page-list-module/SKILL.md +137 -0
- package/template/.hermes/skills/page-skeleton/SKILL.md +76 -0
- package/template/.hermes/skills/page-skeleton/examples/AdvancedFormPage/constant.ts +34 -0
- package/template/.hermes/skills/page-skeleton/examples/AdvancedFormPage/hooks/useRuleConfig.ts +75 -0
- package/template/.hermes/skills/page-skeleton/examples/AdvancedFormPage/index.vue +107 -0
- package/template/.hermes/skills/page-skeleton/examples/AdvancedFormPage/schemas/ruleConfigSchema.ts +256 -0
- package/template/.hermes/skills/page-skeleton/examples/AdvancedFormPage/style.less +30 -0
- package/template/.hermes/skills/page-skeleton/examples/StandardListPage/constant.ts +28 -0
- package/template/.hermes/skills/page-skeleton/examples/StandardListPage/hooks/useQualityRuleList.ts +58 -0
- package/template/.hermes/skills/page-skeleton/examples/StandardListPage/hooks/useRuleActions.ts +65 -0
- package/template/.hermes/skills/page-skeleton/examples/StandardListPage/index.vue +91 -0
- package/template/.hermes/skills/page-skeleton/examples/StandardListPage/style.less +49 -0
- package/template/.hermes/skills/prototype-page-acceptance/SKILL.md +62 -0
- package/template/.hermes/skills/theme-token-usage/SKILL.md +123 -0
- package/template/.hermes/skills/theme-token-usage/agents/openai.yaml +4 -0
- package/template/.hermes/skills/vue3-best-practices/SKILL.md +68 -0
- package/template/.hermes/skills/yedit-table-usage/SKILL.md +227 -0
- package/template/.hermes/skills/yss-api-integration/SKILL.md +12 -2
- package/template/.hermes/skills/yss-components/SKILL.md +1 -1
- package/template/.hermes/skills/yss-ddd-scaffold-generator/SKILL.md +1 -1
- package/template/.hermes/skills/yss-ddd-scaffold-generator/scripts/generate_scaffold.mjs +30 -3
- package/template/.hermes/skills/yss-ddd-scaffold-generator/scripts/scaffold-generator.test.mjs +52 -0
- package/template/.hermes/skills/yss-design-system/SKILL.md +1 -1
- package/template/.hermes/skills/yss-formily/SKILL.md +233 -265
- package/template/.hermes/skills/yss-frontend-scaffold-generator/SKILL.md +2 -2
- package/template/.hermes/skills/yss-hook/SKILL.md +1 -1
- package/template/.hermes/skills/yss-openapi-governance/SKILL.md +2 -2
- package/template/.hermes/skills/yss-page-module-development/SKILL.md +12 -2
- package/template/.hermes/skills/yss-page-module-development/references/component-map.md +34 -0
- package/template/.hermes/skills/yss-page-module-development/references/hooks-map.md +11 -0
- package/template/.hermes/skills/yss-page-module-development/references/utils-map.md +14 -0
- package/template/.hermes/skills/yss-product-lifecycle/references/matt-yss-adapter.md +1 -1
- package/template/.hermes/skills/yss-product-lifecycle/references/orchestration-contract.yaml +86 -1
- package/template/.hermes/skills/yss-product-lifecycle/references/orchestration.md +2 -0
- package/template/.hermes/skills/yss-product-lifecycle/references/state-model.md +1 -1
- package/template/.hermes/skills/yss-router/SKILL.md +1 -1
- package/template/.hermes/skills/yss-router/references/boundaries.md +1 -1
- package/template/.hermes/skills/yss-router/references/router-contract.yaml +26 -2
- package/template/.hermes/skills/yss-router/references/slice-implementation-contract.md +1 -1
- package/template/.hermes/skills/yss-ui/SKILL.md +1 -1
- package/template/.hermes/skills/yss-use-table-height/SKILL.md +9 -0
- package/template/.hermes/skills/yss-use-tree-height/SKILL.md +9 -0
- package/template/.hermes/skills/ytable-usage/SKILL.md +251 -0
- package/template/.hermes/skills/ytree-usage/SKILL.md +132 -0
- package/template/.pi/skills/component-selection-imports/SKILL.md +64 -0
- package/template/.pi/skills/cross-repo-implementation-routing/SKILL.md +2 -2
- package/template/.pi/skills/file-export-download/SKILL.md +160 -0
- package/template/.pi/skills/file-export-download/agents/openai.yaml +4 -0
- package/template/.pi/skills/formily-foundation/SKILL.md +176 -0
- package/template/.pi/skills/formily-foundation/references/examples.md +486 -0
- package/template/.pi/skills/formily-linkage-effects/SKILL.md +167 -0
- package/template/.pi/skills/formily-mode-slot-detail/SKILL.md +137 -0
- package/template/.pi/skills/formily-step-flow/SKILL.md +194 -0
- package/template/.pi/skills/frontend-commit/SKILL.md +118 -0
- package/template/.pi/skills/frontend-commit/agents/openai.yaml +7 -0
- package/template/.pi/skills/frontend-commit/references/scope-and-examples.md +111 -0
- package/template/.pi/skills/implementation-repo-onboarding/SKILL.md +5 -5
- package/template/.pi/skills/java-backend-commit/SKILL.md +121 -0
- package/template/.pi/skills/java-backend-commit/agents/openai.yaml +7 -0
- package/template/.pi/skills/java-backend-commit/references/scope-and-examples.md +118 -0
- package/template/.pi/skills/llm-wiki/SKILL.md +1 -1
- package/template/.pi/skills/llm-wiki/references/discover.md +1 -0
- package/template/.pi/skills/page-form-module/SKILL.md +168 -0
- package/template/.pi/skills/page-list-module/SKILL.md +137 -0
- package/template/.pi/skills/page-skeleton/SKILL.md +76 -0
- package/template/.pi/skills/page-skeleton/examples/AdvancedFormPage/constant.ts +34 -0
- package/template/.pi/skills/page-skeleton/examples/AdvancedFormPage/hooks/useRuleConfig.ts +75 -0
- package/template/.pi/skills/page-skeleton/examples/AdvancedFormPage/index.vue +107 -0
- package/template/.pi/skills/page-skeleton/examples/AdvancedFormPage/schemas/ruleConfigSchema.ts +256 -0
- package/template/.pi/skills/page-skeleton/examples/AdvancedFormPage/style.less +30 -0
- package/template/.pi/skills/page-skeleton/examples/StandardListPage/constant.ts +28 -0
- package/template/.pi/skills/page-skeleton/examples/StandardListPage/hooks/useQualityRuleList.ts +58 -0
- package/template/.pi/skills/page-skeleton/examples/StandardListPage/hooks/useRuleActions.ts +65 -0
- package/template/.pi/skills/page-skeleton/examples/StandardListPage/index.vue +91 -0
- package/template/.pi/skills/page-skeleton/examples/StandardListPage/style.less +49 -0
- package/template/.pi/skills/prototype-page-acceptance/SKILL.md +62 -0
- package/template/.pi/skills/theme-token-usage/SKILL.md +123 -0
- package/template/.pi/skills/theme-token-usage/agents/openai.yaml +4 -0
- package/template/.pi/skills/vue3-best-practices/SKILL.md +68 -0
- package/template/.pi/skills/yedit-table-usage/SKILL.md +227 -0
- package/template/.pi/skills/yss-api-integration/SKILL.md +12 -2
- package/template/.pi/skills/yss-components/SKILL.md +1 -1
- package/template/.pi/skills/yss-ddd-scaffold-generator/SKILL.md +1 -1
- package/template/.pi/skills/yss-ddd-scaffold-generator/scripts/generate_scaffold.mjs +30 -3
- package/template/.pi/skills/yss-ddd-scaffold-generator/scripts/scaffold-generator.test.mjs +52 -0
- package/template/.pi/skills/yss-design-system/SKILL.md +1 -1
- package/template/.pi/skills/yss-formily/SKILL.md +233 -265
- package/template/.pi/skills/yss-frontend-scaffold-generator/SKILL.md +2 -2
- package/template/.pi/skills/yss-hook/SKILL.md +1 -1
- package/template/.pi/skills/yss-openapi-governance/SKILL.md +2 -2
- package/template/.pi/skills/yss-page-module-development/SKILL.md +12 -2
- package/template/.pi/skills/yss-page-module-development/references/component-map.md +34 -0
- package/template/.pi/skills/yss-page-module-development/references/hooks-map.md +11 -0
- package/template/.pi/skills/yss-page-module-development/references/utils-map.md +14 -0
- package/template/.pi/skills/yss-product-lifecycle/references/matt-yss-adapter.md +1 -1
- package/template/.pi/skills/yss-product-lifecycle/references/orchestration-contract.yaml +86 -1
- package/template/.pi/skills/yss-product-lifecycle/references/orchestration.md +2 -0
- package/template/.pi/skills/yss-product-lifecycle/references/state-model.md +1 -1
- package/template/.pi/skills/yss-router/SKILL.md +1 -1
- package/template/.pi/skills/yss-router/references/boundaries.md +1 -1
- package/template/.pi/skills/yss-router/references/router-contract.yaml +26 -2
- package/template/.pi/skills/yss-router/references/slice-implementation-contract.md +1 -1
- package/template/.pi/skills/yss-ui/SKILL.md +1 -1
- package/template/.pi/skills/yss-use-table-height/SKILL.md +9 -0
- package/template/.pi/skills/yss-use-tree-height/SKILL.md +9 -0
- package/template/.pi/skills/ytable-usage/SKILL.md +251 -0
- package/template/.pi/skills/ytree-usage/SKILL.md +132 -0
- package/template/.qoder/skills/component-selection-imports/SKILL.md +64 -0
- package/template/.qoder/skills/cross-repo-implementation-routing/SKILL.md +2 -2
- package/template/.qoder/skills/file-export-download/SKILL.md +160 -0
- package/template/.qoder/skills/file-export-download/agents/openai.yaml +4 -0
- package/template/.qoder/skills/formily-foundation/SKILL.md +176 -0
- package/template/.qoder/skills/formily-foundation/references/examples.md +486 -0
- package/template/.qoder/skills/formily-linkage-effects/SKILL.md +167 -0
- package/template/.qoder/skills/formily-mode-slot-detail/SKILL.md +137 -0
- package/template/.qoder/skills/formily-step-flow/SKILL.md +194 -0
- package/template/.qoder/skills/frontend-commit/SKILL.md +118 -0
- package/template/.qoder/skills/frontend-commit/agents/openai.yaml +7 -0
- package/template/.qoder/skills/frontend-commit/references/scope-and-examples.md +111 -0
- package/template/.qoder/skills/implementation-repo-onboarding/SKILL.md +5 -5
- package/template/.qoder/skills/java-backend-commit/SKILL.md +121 -0
- package/template/.qoder/skills/java-backend-commit/agents/openai.yaml +7 -0
- package/template/.qoder/skills/java-backend-commit/references/scope-and-examples.md +118 -0
- package/template/.qoder/skills/llm-wiki/SKILL.md +1 -1
- package/template/.qoder/skills/llm-wiki/references/discover.md +1 -0
- package/template/.qoder/skills/page-form-module/SKILL.md +168 -0
- package/template/.qoder/skills/page-list-module/SKILL.md +137 -0
- package/template/.qoder/skills/page-skeleton/SKILL.md +76 -0
- package/template/.qoder/skills/page-skeleton/examples/AdvancedFormPage/constant.ts +34 -0
- package/template/.qoder/skills/page-skeleton/examples/AdvancedFormPage/hooks/useRuleConfig.ts +75 -0
- package/template/.qoder/skills/page-skeleton/examples/AdvancedFormPage/index.vue +107 -0
- package/template/.qoder/skills/page-skeleton/examples/AdvancedFormPage/schemas/ruleConfigSchema.ts +256 -0
- package/template/.qoder/skills/page-skeleton/examples/AdvancedFormPage/style.less +30 -0
- package/template/.qoder/skills/page-skeleton/examples/StandardListPage/constant.ts +28 -0
- package/template/.qoder/skills/page-skeleton/examples/StandardListPage/hooks/useQualityRuleList.ts +58 -0
- package/template/.qoder/skills/page-skeleton/examples/StandardListPage/hooks/useRuleActions.ts +65 -0
- package/template/.qoder/skills/page-skeleton/examples/StandardListPage/index.vue +91 -0
- package/template/.qoder/skills/page-skeleton/examples/StandardListPage/style.less +49 -0
- package/template/.qoder/skills/prototype-page-acceptance/SKILL.md +62 -0
- package/template/.qoder/skills/theme-token-usage/SKILL.md +123 -0
- package/template/.qoder/skills/theme-token-usage/agents/openai.yaml +4 -0
- package/template/.qoder/skills/vue3-best-practices/SKILL.md +68 -0
- package/template/.qoder/skills/yedit-table-usage/SKILL.md +227 -0
- package/template/.qoder/skills/yss-api-integration/SKILL.md +12 -2
- package/template/.qoder/skills/yss-components/SKILL.md +1 -1
- package/template/.qoder/skills/yss-ddd-scaffold-generator/SKILL.md +1 -1
- package/template/.qoder/skills/yss-ddd-scaffold-generator/scripts/generate_scaffold.mjs +30 -3
- package/template/.qoder/skills/yss-ddd-scaffold-generator/scripts/scaffold-generator.test.mjs +52 -0
- package/template/.qoder/skills/yss-design-system/SKILL.md +1 -1
- package/template/.qoder/skills/yss-formily/SKILL.md +233 -265
- package/template/.qoder/skills/yss-frontend-scaffold-generator/SKILL.md +2 -2
- package/template/.qoder/skills/yss-hook/SKILL.md +1 -1
- package/template/.qoder/skills/yss-openapi-governance/SKILL.md +2 -2
- package/template/.qoder/skills/yss-page-module-development/SKILL.md +12 -2
- package/template/.qoder/skills/yss-page-module-development/references/component-map.md +34 -0
- package/template/.qoder/skills/yss-page-module-development/references/hooks-map.md +11 -0
- package/template/.qoder/skills/yss-page-module-development/references/utils-map.md +14 -0
- package/template/.qoder/skills/yss-product-lifecycle/references/matt-yss-adapter.md +1 -1
- package/template/.qoder/skills/yss-product-lifecycle/references/orchestration-contract.yaml +86 -1
- package/template/.qoder/skills/yss-product-lifecycle/references/orchestration.md +2 -0
- package/template/.qoder/skills/yss-product-lifecycle/references/state-model.md +1 -1
- package/template/.qoder/skills/yss-router/SKILL.md +1 -1
- package/template/.qoder/skills/yss-router/references/boundaries.md +1 -1
- package/template/.qoder/skills/yss-router/references/router-contract.yaml +26 -2
- package/template/.qoder/skills/yss-router/references/slice-implementation-contract.md +1 -1
- package/template/.qoder/skills/yss-ui/SKILL.md +1 -1
- package/template/.qoder/skills/yss-use-table-height/SKILL.md +9 -0
- package/template/.qoder/skills/yss-use-tree-height/SKILL.md +9 -0
- package/template/.qoder/skills/ytable-usage/SKILL.md +251 -0
- package/template/.qoder/skills/ytree-usage/SKILL.md +132 -0
- package/template/.trae/skills/.yss-skills-manifest.json +29 -0
- package/template/.trae/skills/component-selection-imports/SKILL.md +64 -0
- package/template/.trae/skills/cross-repo-implementation-routing/SKILL.md +2 -2
- package/template/.trae/skills/file-export-download/SKILL.md +160 -0
- package/template/.trae/skills/file-export-download/agents/openai.yaml +4 -0
- package/template/.trae/skills/formily-foundation/SKILL.md +176 -0
- package/template/.trae/skills/formily-foundation/references/examples.md +486 -0
- package/template/.trae/skills/formily-linkage-effects/SKILL.md +167 -0
- package/template/.trae/skills/formily-mode-slot-detail/SKILL.md +137 -0
- package/template/.trae/skills/formily-step-flow/SKILL.md +194 -0
- package/template/.trae/skills/frontend-commit/SKILL.md +118 -0
- package/template/.trae/skills/frontend-commit/agents/openai.yaml +7 -0
- package/template/.trae/skills/frontend-commit/references/scope-and-examples.md +111 -0
- package/template/.trae/skills/implementation-repo-onboarding/SKILL.md +5 -5
- package/template/.trae/skills/java-backend-commit/SKILL.md +121 -0
- package/template/.trae/skills/java-backend-commit/agents/openai.yaml +7 -0
- package/template/.trae/skills/java-backend-commit/references/scope-and-examples.md +118 -0
- package/template/.trae/skills/llm-wiki/SKILL.md +1 -1
- package/template/.trae/skills/llm-wiki/references/discover.md +1 -0
- package/template/.trae/skills/page-form-module/SKILL.md +168 -0
- package/template/.trae/skills/page-list-module/SKILL.md +137 -0
- package/template/.trae/skills/page-skeleton/SKILL.md +76 -0
- package/template/.trae/skills/page-skeleton/examples/AdvancedFormPage/constant.ts +34 -0
- package/template/.trae/skills/page-skeleton/examples/AdvancedFormPage/hooks/useRuleConfig.ts +75 -0
- package/template/.trae/skills/page-skeleton/examples/AdvancedFormPage/index.vue +107 -0
- package/template/.trae/skills/page-skeleton/examples/AdvancedFormPage/schemas/ruleConfigSchema.ts +256 -0
- package/template/.trae/skills/page-skeleton/examples/AdvancedFormPage/style.less +30 -0
- package/template/.trae/skills/page-skeleton/examples/StandardListPage/constant.ts +28 -0
- package/template/.trae/skills/page-skeleton/examples/StandardListPage/hooks/useQualityRuleList.ts +58 -0
- package/template/.trae/skills/page-skeleton/examples/StandardListPage/hooks/useRuleActions.ts +65 -0
- package/template/.trae/skills/page-skeleton/examples/StandardListPage/index.vue +91 -0
- package/template/.trae/skills/page-skeleton/examples/StandardListPage/style.less +49 -0
- package/template/.trae/skills/prototype-page-acceptance/SKILL.md +62 -0
- package/template/.trae/skills/theme-token-usage/SKILL.md +123 -0
- package/template/.trae/skills/theme-token-usage/agents/openai.yaml +4 -0
- package/template/.trae/skills/vue3-best-practices/SKILL.md +68 -0
- package/template/.trae/skills/yedit-table-usage/SKILL.md +227 -0
- package/template/.trae/skills/yss-api-integration/SKILL.md +12 -2
- package/template/.trae/skills/yss-components/SKILL.md +1 -1
- package/template/.trae/skills/yss-ddd-scaffold-generator/SKILL.md +1 -1
- package/template/.trae/skills/yss-ddd-scaffold-generator/scripts/generate_scaffold.mjs +30 -3
- package/template/.trae/skills/yss-ddd-scaffold-generator/scripts/scaffold-generator.test.mjs +52 -0
- package/template/.trae/skills/yss-design-system/SKILL.md +1 -1
- package/template/.trae/skills/yss-formily/SKILL.md +233 -265
- package/template/.trae/skills/yss-frontend-scaffold-generator/SKILL.md +2 -2
- package/template/.trae/skills/yss-hook/SKILL.md +1 -1
- package/template/.trae/skills/yss-openapi-governance/SKILL.md +2 -2
- package/template/.trae/skills/yss-page-module-development/SKILL.md +12 -2
- package/template/.trae/skills/yss-page-module-development/references/component-map.md +34 -0
- package/template/.trae/skills/yss-page-module-development/references/hooks-map.md +11 -0
- package/template/.trae/skills/yss-page-module-development/references/utils-map.md +14 -0
- package/template/.trae/skills/yss-product-lifecycle/references/matt-yss-adapter.md +1 -1
- package/template/.trae/skills/yss-product-lifecycle/references/orchestration-contract.yaml +86 -1
- package/template/.trae/skills/yss-product-lifecycle/references/orchestration.md +2 -0
- package/template/.trae/skills/yss-product-lifecycle/references/state-model.md +1 -1
- package/template/.trae/skills/yss-router/SKILL.md +1 -1
- package/template/.trae/skills/yss-router/references/boundaries.md +1 -1
- package/template/.trae/skills/yss-router/references/router-contract.yaml +26 -2
- package/template/.trae/skills/yss-router/references/slice-implementation-contract.md +1 -1
- package/template/.trae/skills/yss-ui/SKILL.md +1 -1
- package/template/.trae/skills/yss-use-table-height/SKILL.md +9 -0
- package/template/.trae/skills/yss-use-tree-height/SKILL.md +9 -0
- package/template/.trae/skills/ytable-usage/SKILL.md +251 -0
- package/template/.trae/skills/ytree-usage/SKILL.md +132 -0
- package/template/AGENTS.md +5 -5
- package/template/CONTEXT.md +3 -2
- package/template/docs/agents/skill-migrations.md +16 -0
- package/template/docs/agents/skills-maintenance.md +1 -1
- package/template/docs/agents/yss-skill-registry.yaml +125 -25
- package/template/docs/process/implementation-repo-integration.md +24 -2
- package/template/docs/templates/cross-repo-slice-template.md +15 -0
- package/template/docs/templates/implementation-repo-registry-template.md +8 -3
- package/template/docs/templates/implementation-routing-template.md +3 -3
- package/template/docs/user-guide//344/272/247/345/223/201/347/224/237/345/221/275/345/221/250/346/234/237/345/267/245/344/275/234/346/265/201.md +2 -2
- package/template/docs/user-guide//344/272/247/345/223/201/347/240/224/345/217/221/345/205/250/347/224/237/345/221/275/345/221/250/346/234/237/346/234/200/344/275/263/345/256/236/350/267/265.md +4 -4
- package/template/docs/user-guide//347/224/237/345/221/275/345/221/250/346/234/237/346/234/200/344/275/263/345/256/236/350/267/265.md +1 -1
- package/template/scripts/lib/git-submodule-fixtures.mjs +58 -0
- package/template/scripts/lib/repository-scope-policy.mjs +456 -0
- package/template/scripts/lib/scenario-checks.mjs +32 -1
- package/template/scripts/lib/skill-governance.mjs +50 -0
- package/template/scripts/lib/skill-registry.mjs +82 -5
- package/template/scripts/lib/skill-supply-chain.mjs +5 -1
- package/template/scripts/repository-scope-policy +16 -0
- package/template/scripts/verify-repository-scope-scenarios +239 -0
- package/template/scripts/verify-scaffold-generator-scenarios +54 -0
- package/template/scripts/verify-skill-governance +10 -0
- package/template/scripts/verify-template +4 -2
- package/template/skills-lock.json +289 -33
- package/template.manifest.json +6 -5
- package/template.snapshot.json +4 -4
- package/template/.agents/skills/high-fidelity-html-prototype/SKILL.md +0 -89
- package/template/.agents/skills/high-fidelity-html-prototype/agents/openai.yaml +0 -5
- package/template/.agents/skills/yss-formily/agents/openai.yaml +0 -5
- package/template/.agents/skills/yss-formily/references/examples.md +0 -65
- package/template/.claude/skills/high-fidelity-html-prototype/SKILL.md +0 -89
- package/template/.claude/skills/high-fidelity-html-prototype/agents/openai.yaml +0 -5
- package/template/.claude/skills/yss-formily/agents/openai.yaml +0 -5
- package/template/.claude/skills/yss-formily/references/examples.md +0 -65
- package/template/.codex/skills/high-fidelity-html-prototype/SKILL.md +0 -89
- package/template/.codex/skills/high-fidelity-html-prototype/agents/openai.yaml +0 -5
- package/template/.codex/skills/yss-formily/agents/openai.yaml +0 -5
- package/template/.codex/skills/yss-formily/references/examples.md +0 -65
- package/template/.cursor/environment.json +0 -5
- package/template/.cursor/skills/high-fidelity-html-prototype/SKILL.md +0 -89
- package/template/.cursor/skills/high-fidelity-html-prototype/agents/openai.yaml +0 -5
- package/template/.cursor/skills/yss-formily/agents/openai.yaml +0 -5
- package/template/.cursor/skills/yss-formily/references/examples.md +0 -65
- package/template/.github/workflows/template-node-tooling.yml +0 -61
- package/template/.hermes/skills/high-fidelity-html-prototype/SKILL.md +0 -89
- package/template/.hermes/skills/high-fidelity-html-prototype/agents/openai.yaml +0 -5
- package/template/.hermes/skills/yss-formily/agents/openai.yaml +0 -5
- package/template/.hermes/skills/yss-formily/references/examples.md +0 -65
- package/template/.pi/skills/high-fidelity-html-prototype/SKILL.md +0 -89
- package/template/.pi/skills/high-fidelity-html-prototype/agents/openai.yaml +0 -5
- package/template/.pi/skills/yss-formily/agents/openai.yaml +0 -5
- package/template/.pi/skills/yss-formily/references/examples.md +0 -65
- package/template/.qoder/skills/high-fidelity-html-prototype/SKILL.md +0 -89
- package/template/.qoder/skills/high-fidelity-html-prototype/agents/openai.yaml +0 -5
- package/template/.qoder/skills/yss-formily/agents/openai.yaml +0 -5
- package/template/.qoder/skills/yss-formily/references/examples.md +0 -65
- package/template/.trae/skills/high-fidelity-html-prototype/SKILL.md +0 -89
- package/template/.trae/skills/high-fidelity-html-prototype/agents/openai.yaml +0 -5
- package/template/.trae/skills/yss-formily/agents/openai.yaml +0 -5
- package/template/.trae/skills/yss-formily/references/examples.md +0 -65
- package/template/wiki/.wiki-manifest.json +0 -390
- package/template/wiki/raw/AGENTS.md +0 -122
- package/template/wiki/raw/CONTEXT.md +0 -80
- package/template/wiki/raw/README.md +0 -130
- package/template/wiki/raw/adr-0002-repository-mode.md +0 -3
- package/template/wiki/raw/create-yss-spec-repository-mode-contract.md +0 -95
- package/template/wiki/raw/harness-process-tailoring.md +0 -64
- package/template/wiki/raw/implementation-repo-integration.md +0 -62
- package/template/wiki/raw/issue-tracker.md +0 -135
- package/template/wiki/raw/lifecycle-registry.yaml +0 -369
- package/template/wiki/raw/maintenance-intensity.yaml +0 -25
- package/template/wiki/raw/skills-lock-names.md +0 -93
- package/template/wiki/raw/skills-maintenance.md +0 -90
- package/template/wiki/raw/spec-template.md +0 -102
- package/template/wiki/raw/triage-labels.md +0 -15
- package/template/wiki/raw/vertical-slice-ticket-template.md +0 -132
- package/template/wiki/raw/yss-project.yaml +0 -2
- package/template/wiki/raw/yss-skill-registry.yaml +0 -510
- package/template/wiki/wiki/Agent/345/205/245/345/217/243/350/247/204/345/210/231.md +0 -21
- package/template/wiki/wiki/CLAUDE.md +0 -28
- package/template/wiki/wiki/Fresh/351/252/214/350/257/201/344/270/216/347/213/254/347/253/213/345/256/241/346/237/245.md +0 -19
- package/template/wiki/wiki/LLM Wiki.md +0 -30
- package/template/wiki/wiki/Matt/346/212/200/350/203/275/344/275/223/347/263/273.md +0 -21
- package/template/wiki/wiki/OpenAPI/345/245/221/347/272/246.md +0 -20
- package/template/wiki/wiki/SpecDelta.md +0 -19
- package/template/wiki/wiki/Spec/345/237/272/347/272/277.md +0 -22
- package/template/wiki/wiki/Ticket/344/270/216/346/265/201/347/250/213/347/212/266/346/200/201.md +0 -21
- package/template/wiki/wiki/YSS/345/267/245/347/250/213/346/212/200/350/203/275/344/275/223/347/263/273.md +0 -23
- package/template/wiki/wiki/YSS/350/267/257/347/224/261/344/270/216/345/220/210/345/220/214/347/274/226/350/257/221.md +0 -20
- package/template/wiki/wiki/concept-table.md +0 -9
- package/template/wiki/wiki/index.md +0 -41
- package/template/wiki/wiki/log.md +0 -51
- package/template/wiki/wiki//344/272/247/345/223/201/347/240/224/345/217/221/347/224/237/345/221/275/345/221/250/346/234/237.md +0 -20
- package/template/wiki/wiki//344/272/247/345/223/201/350/256/276/350/256/241/345/275/261/345/223/215/344/270/216/345/216/237/345/236/213.md +0 -19
- package/template/wiki/wiki//344/273/223/345/272/223/350/272/253/344/273/275/344/270/216/350/267/257/347/224/261.md +0 -20
- package/template/wiki/wiki//345/210/207/347/211/207/345/256/236/347/216/260/345/220/210/345/220/214.md +0 -21
- package/template/wiki/wiki//345/236/202/347/233/264/345/210/207/347/211/207Ticket.md +0 -23
- package/template/wiki/wiki//345/244/215/347/233/230/344/270/216/346/235/203/345/250/201/350/265/204/344/272/247/344/277/256/350/256/242.md +0 -20
- package/template/wiki/wiki//345/256/236/347/216/260/344/273/223/345/272/223/344/270/216/350/267/250/344/273/223/345/272/223/345/245/221/347/272/246.md +0 -22
- package/template/wiki/wiki//345/275/261/345/223/215/351/235/242/345/210/206/350/257/212/344/270/216/346/265/201/347/250/213/350/243/201/345/211/252.md +0 -20
- package/template/wiki/wiki//346/212/200/350/203/275/346/212/225/345/275/261/344/270/216/351/224/201/345/256/232.md +0 -23
- package/template/wiki/wiki//346/235/241/344/273/266/345/274/272/345/210/266/351/227/250/347/246/201.md +0 -18
- package/template/wiki/wiki//346/250/241/346/235/277/345/217/221/345/270/203/351/227/250/347/246/201/344/270/216/351/252/214/350/257/201.md +0 -22
- package/template/wiki/wiki//346/250/241/346/235/277/346/200/273/350/247/210.md +0 -20
- package/template/wiki/wiki//346/250/241/346/235/277/347/273/264/346/212/244/346/265/201/347/250/213.md +0 -19
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { mkdirSync, mkdtempSync, rmSync, writeFileSync } from "node:fs";
|
|
2
|
+
import { tmpdir } from "node:os";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { execFileSync } from "node:child_process";
|
|
5
|
+
|
|
6
|
+
function git(cwd, args) {
|
|
7
|
+
return execFileSync("git", args, { cwd, encoding: "utf8" });
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
function initRepo(dir) {
|
|
11
|
+
mkdirSync(dir, { recursive: true });
|
|
12
|
+
git(dir, ["init", "-b", "main"]);
|
|
13
|
+
git(dir, ["config", "user.email", "test@example.invalid"]);
|
|
14
|
+
git(dir, ["config", "user.name", "fixture"]);
|
|
15
|
+
git(dir, ["config", "commit.gpgsign", "false"]);
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export function makeGitlinkFixture({ checkout = "empty-gitlink" } = {}) {
|
|
19
|
+
const root = mkdtempSync(path.join(tmpdir(), "yss-gitlink-"));
|
|
20
|
+
const child = path.join(root, "child.git");
|
|
21
|
+
const superproject = path.join(root, "super");
|
|
22
|
+
initRepo(child);
|
|
23
|
+
writeFileSync(path.join(child, "README.md"), "child\n");
|
|
24
|
+
git(child, ["add", "."]);
|
|
25
|
+
git(child, ["commit", "-m", "init child"]);
|
|
26
|
+
const sha = git(child, ["rev-parse", "HEAD"]).trim();
|
|
27
|
+
initRepo(superproject);
|
|
28
|
+
mkdirSync(path.join(superproject, "apps/backend"), { recursive: true });
|
|
29
|
+
const mount = "apps/backend/billing-service";
|
|
30
|
+
if (checkout === "empty-gitlink") {
|
|
31
|
+
mkdirSync(path.join(superproject, mount), { recursive: true });
|
|
32
|
+
writeFileSync(
|
|
33
|
+
path.join(superproject, ".gitmodules"),
|
|
34
|
+
`[submodule "backend-billing-service"]\n\tpath = ${mount}\n\turl = ${child}\n`
|
|
35
|
+
);
|
|
36
|
+
git(superproject, ["update-index", "--add", "--cacheinfo", "160000", sha, mount]);
|
|
37
|
+
git(superproject, ["add", ".gitmodules"]);
|
|
38
|
+
git(superproject, ["commit", "-m", "empty gitlink"]);
|
|
39
|
+
} else {
|
|
40
|
+
git(superproject, ["-c", "protocol.file.allow=always", "submodule", "add", child, mount]);
|
|
41
|
+
git(superproject, ["commit", "-m", "add submodule"]);
|
|
42
|
+
if (checkout === "detached-head") {
|
|
43
|
+
git(path.join(superproject, mount), ["checkout", "--detach"]);
|
|
44
|
+
} else if (checkout === "attached-branch") {
|
|
45
|
+
git(path.join(superproject, mount), ["checkout", "-B", "main"]);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
return {
|
|
49
|
+
root,
|
|
50
|
+
superproject,
|
|
51
|
+
child,
|
|
52
|
+
mount,
|
|
53
|
+
sha,
|
|
54
|
+
cleanup() {
|
|
55
|
+
rmSync(root, { recursive: true, force: true });
|
|
56
|
+
}
|
|
57
|
+
};
|
|
58
|
+
}
|
|
@@ -0,0 +1,456 @@
|
|
|
1
|
+
import { existsSync, readdirSync, readFileSync } from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { spawnSync } from "node:child_process";
|
|
4
|
+
import { validImplementationPath, violation as pathViolation } from "./implementation-path-policy.mjs";
|
|
5
|
+
|
|
6
|
+
export const REPOSITORY_SCOPES = Object.freeze([
|
|
7
|
+
"external-repository",
|
|
8
|
+
"harness-apps",
|
|
9
|
+
"git-submodule"
|
|
10
|
+
]);
|
|
11
|
+
|
|
12
|
+
export const LAYOUT_POLICIES = Object.freeze({
|
|
13
|
+
"external-repository": "external-repository-native",
|
|
14
|
+
"harness-apps": "harness-apps-multi-project",
|
|
15
|
+
"git-submodule": "git-submodule-harness-apps"
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
export const GITLINK_MODE = "160000";
|
|
19
|
+
export const CHECKOUT_STATES = Object.freeze([
|
|
20
|
+
"attached-branch",
|
|
21
|
+
"detached-head",
|
|
22
|
+
"uninitialized",
|
|
23
|
+
"empty-gitlink"
|
|
24
|
+
]);
|
|
25
|
+
|
|
26
|
+
export const NAMED_STRESS_SCENARIOS = Object.freeze([
|
|
27
|
+
"unknown_scope",
|
|
28
|
+
"layout_mismatch",
|
|
29
|
+
"same_origin_url",
|
|
30
|
+
"copy_source_into_harness",
|
|
31
|
+
"missing_git_entry_mode",
|
|
32
|
+
"declared_harness_apps_actual_gitlink",
|
|
33
|
+
"empty_gitlink_as_regular_dir",
|
|
34
|
+
"detached_head_as_regular_dir",
|
|
35
|
+
"force_overlay_mount"
|
|
36
|
+
]);
|
|
37
|
+
|
|
38
|
+
function asString(value) {
|
|
39
|
+
return typeof value === "string" ? value.trim() : "";
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
function normalizeSlash(value) {
|
|
43
|
+
const text = asString(value);
|
|
44
|
+
if (!text) return "";
|
|
45
|
+
return text.replace(/\\/g, "/").replace(/\/+$/, "");
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
function isDeclared(value) {
|
|
49
|
+
const text = asString(value);
|
|
50
|
+
return text !== "" && text !== "不适用";
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
function uniqueResolved(items) {
|
|
54
|
+
const seen = new Set();
|
|
55
|
+
const out = [];
|
|
56
|
+
for (const item of items) {
|
|
57
|
+
if (!item) continue;
|
|
58
|
+
const resolved = path.resolve(item);
|
|
59
|
+
if (seen.has(resolved)) continue;
|
|
60
|
+
seen.add(resolved);
|
|
61
|
+
out.push(resolved);
|
|
62
|
+
}
|
|
63
|
+
return out;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
export function expectedLayoutPolicy(scope) {
|
|
67
|
+
return LAYOUT_POLICIES[scope] ?? null;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
export function violationRepositoryScope(record = {}) {
|
|
71
|
+
const scope = asString(record.repository_scope);
|
|
72
|
+
if (!REPOSITORY_SCOPES.includes(scope)) {
|
|
73
|
+
return `repository_scope must be one of ${REPOSITORY_SCOPES.join(" / ")}`;
|
|
74
|
+
}
|
|
75
|
+
const layout = asString(record.layout_policy);
|
|
76
|
+
const expected = expectedLayoutPolicy(scope);
|
|
77
|
+
if (layout && layout !== expected) {
|
|
78
|
+
return `layout_policy for ${scope} must be ${expected}`;
|
|
79
|
+
}
|
|
80
|
+
if (scope === "git-submodule") return gitSubmoduleRecordViolation(record);
|
|
81
|
+
if (scope === "harness-apps") return harnessAppsRecordViolation(record);
|
|
82
|
+
return externalRepositoryRecordViolation(record);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
function gitSubmoduleRecordViolation(record) {
|
|
86
|
+
const projectRoot = normalizeSlash(record.project_root);
|
|
87
|
+
if (!projectRoot || !validImplementationPath(`${projectRoot}/`)) {
|
|
88
|
+
return `git-submodule project_root must be a concrete apps/backend/<project>/ or apps/frontend/<project>/ path: ${pathViolation(record.project_root || "") ?? "missing"}`;
|
|
89
|
+
}
|
|
90
|
+
if (!isDeclared(record.gitlink_path)) {
|
|
91
|
+
return "git-submodule gitlink_path is required";
|
|
92
|
+
}
|
|
93
|
+
const gitlinkPath = normalizeSlash(record.gitlink_path);
|
|
94
|
+
if (gitlinkPath !== projectRoot) {
|
|
95
|
+
return "git-submodule gitlink_path must equal project_root";
|
|
96
|
+
}
|
|
97
|
+
if (asString(record.git_entry_mode) !== GITLINK_MODE) {
|
|
98
|
+
return `git-submodule git_entry_mode must be ${GITLINK_MODE}`;
|
|
99
|
+
}
|
|
100
|
+
if (!asString(record.git_url)) return "git-submodule git_url is required";
|
|
101
|
+
if (!asString(record.gitmodules_name)) return "git-submodule gitmodules_name is required";
|
|
102
|
+
if (!asString(record.superproject_git_url)) {
|
|
103
|
+
return "git-submodule superproject_git_url is required";
|
|
104
|
+
}
|
|
105
|
+
if (asString(record.superproject_git_url) === asString(record.git_url)) {
|
|
106
|
+
return "git-submodule git_url must differ from superproject_git_url";
|
|
107
|
+
}
|
|
108
|
+
if (asString(record.layout_policy) && asString(record.layout_policy) !== LAYOUT_POLICIES["git-submodule"]) {
|
|
109
|
+
return `git-submodule layout_policy must be ${LAYOUT_POLICIES["git-submodule"]}`;
|
|
110
|
+
}
|
|
111
|
+
const checkout = asString(record.checkout_state);
|
|
112
|
+
if (!checkout) return "git-submodule checkout_state is required";
|
|
113
|
+
if (!CHECKOUT_STATES.includes(checkout)) {
|
|
114
|
+
return `git-submodule checkout_state must be one of ${CHECKOUT_STATES.join(" / ")}`;
|
|
115
|
+
}
|
|
116
|
+
if (checkout === "detached-head" && record.commit_allowed === true) {
|
|
117
|
+
return "git-submodule must not commit on detached HEAD";
|
|
118
|
+
}
|
|
119
|
+
if (checkout === "detached-head" && record.scaffold_status === "required") {
|
|
120
|
+
return "detached HEAD must not be treated as a regular directory";
|
|
121
|
+
}
|
|
122
|
+
if ((checkout === "uninitialized" || checkout === "empty-gitlink") && record.scaffold_status === "required") {
|
|
123
|
+
return "empty or uninitialized gitlink must not run scaffold_status=required";
|
|
124
|
+
}
|
|
125
|
+
if (record.force === true) {
|
|
126
|
+
return "--force must not overlay a git-submodule mount as a regular directory";
|
|
127
|
+
}
|
|
128
|
+
if (record.copy_source_into_harness === true) {
|
|
129
|
+
return "git-submodule must use gitlink mount, not copy implementation sources into the superproject";
|
|
130
|
+
}
|
|
131
|
+
return null;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
function foreignGitlinkIdentityViolation(record, scope) {
|
|
135
|
+
if (asString(record.git_entry_mode) === GITLINK_MODE) {
|
|
136
|
+
return `${scope} cannot record a gitlink; use repository_scope: git-submodule`;
|
|
137
|
+
}
|
|
138
|
+
if (isDeclared(record.gitlink_path) || isDeclared(record.gitmodules_name) || isDeclared(record.superproject_git_url)) {
|
|
139
|
+
return `${scope} must not record git-submodule identity fields; use repository_scope: git-submodule`;
|
|
140
|
+
}
|
|
141
|
+
const checkout = asString(record.checkout_state);
|
|
142
|
+
if (isDeclared(checkout) && CHECKOUT_STATES.includes(checkout)) {
|
|
143
|
+
return `${scope} must not record git-submodule checkout_state; use repository_scope: git-submodule`;
|
|
144
|
+
}
|
|
145
|
+
return null;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
function harnessAppsRecordViolation(record) {
|
|
149
|
+
const foreign = foreignGitlinkIdentityViolation(record, "harness-apps");
|
|
150
|
+
if (foreign) return foreign;
|
|
151
|
+
const projectRoot = normalizeSlash(record.project_root);
|
|
152
|
+
if (projectRoot && !validImplementationPath(`${projectRoot}/`)) {
|
|
153
|
+
return `harness-apps project_root must be a concrete apps/<kind>/<project>/ path: ${pathViolation(record.project_root)}`;
|
|
154
|
+
}
|
|
155
|
+
return null;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
function externalRepositoryRecordViolation(record) {
|
|
159
|
+
const gitlinkPath = normalizeSlash(record.gitlink_path);
|
|
160
|
+
if (gitlinkPath && gitlinkPath.startsWith("apps/") && String(record.git_entry_mode) === GITLINK_MODE) {
|
|
161
|
+
return "external-repository cannot mount a gitlink under apps/; use repository_scope: git-submodule";
|
|
162
|
+
}
|
|
163
|
+
const foreign = foreignGitlinkIdentityViolation(record, "external-repository");
|
|
164
|
+
if (foreign) return foreign;
|
|
165
|
+
return null;
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
export function validRepositoryScope(record) {
|
|
169
|
+
return violationRepositoryScope(record) === null;
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
export function parseGitmodules(content) {
|
|
173
|
+
const modules = [];
|
|
174
|
+
if (typeof content !== "string" || content.length === 0) return modules;
|
|
175
|
+
let current = null;
|
|
176
|
+
for (const rawLine of content.split(/\r?\n/)) {
|
|
177
|
+
const line = rawLine.trim();
|
|
178
|
+
const name = line.match(/^\[submodule "(.+)"\]$/);
|
|
179
|
+
if (name) {
|
|
180
|
+
current = { name: name[1], path: "", url: "" };
|
|
181
|
+
modules.push(current);
|
|
182
|
+
continue;
|
|
183
|
+
}
|
|
184
|
+
if (!current) continue;
|
|
185
|
+
const pathMatch = line.match(/^path\s*=\s*(.+)$/);
|
|
186
|
+
if (pathMatch) current.path = normalizeSlash(pathMatch[1]);
|
|
187
|
+
const urlMatch = line.match(/^url\s*=\s*(.+)$/);
|
|
188
|
+
if (urlMatch) current.url = urlMatch[1].trim();
|
|
189
|
+
}
|
|
190
|
+
return modules;
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
export function readGitmodules(repoRoot) {
|
|
194
|
+
const file = path.join(repoRoot, ".gitmodules");
|
|
195
|
+
if (!existsSync(file)) return [];
|
|
196
|
+
return parseGitmodules(readFileSync(file, "utf8"));
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
export function gitLsFilesStage(repoRoot, relativePath) {
|
|
200
|
+
const result = spawnSync("git", ["-C", repoRoot, "ls-files", "--stage", "--", relativePath], {
|
|
201
|
+
encoding: "utf8"
|
|
202
|
+
});
|
|
203
|
+
if (result.status !== 0) return null;
|
|
204
|
+
const line = (result.stdout || "").trim().split(/\r?\n/).filter(Boolean)[0];
|
|
205
|
+
if (!line) return null;
|
|
206
|
+
const match = line.match(/^(\d+)\s+([0-9a-f]+)\s+(\d+)\s+(.+)$/i);
|
|
207
|
+
if (!match) return null;
|
|
208
|
+
return { mode: match[1], sha: match[2], stage: match[3], path: match[4] };
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
export function findGitRoot(start) {
|
|
212
|
+
const roots = collectGitRoots(start);
|
|
213
|
+
return roots[0] ?? null;
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
export function collectGitRoots(start) {
|
|
217
|
+
if (!start) return [];
|
|
218
|
+
const roots = [];
|
|
219
|
+
let current = path.resolve(start);
|
|
220
|
+
while (true) {
|
|
221
|
+
if (existsSync(path.join(current, ".git")) || existsSync(path.join(current, ".gitmodules"))) {
|
|
222
|
+
roots.push(current);
|
|
223
|
+
}
|
|
224
|
+
const parent = path.dirname(current);
|
|
225
|
+
if (parent === current) break;
|
|
226
|
+
current = parent;
|
|
227
|
+
}
|
|
228
|
+
return roots;
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
function isUnsafeCheckout(state) {
|
|
232
|
+
return state === "empty-gitlink" || state === "uninitialized" || state === "detached-head";
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
function gitAbbrevRef(cwd) {
|
|
236
|
+
const result = spawnSync("git", ["-C", cwd, "rev-parse", "--abbrev-ref", "HEAD"], { encoding: "utf8" });
|
|
237
|
+
if (result.status !== 0) return null;
|
|
238
|
+
return (result.stdout || "").trim();
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
function gitShowSuperproject(cwd) {
|
|
242
|
+
const result = spawnSync("git", ["-C", cwd, "rev-parse", "--show-superproject-working-tree"], { encoding: "utf8" });
|
|
243
|
+
if (result.status !== 0) return "";
|
|
244
|
+
return (result.stdout || "").trim();
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
function isEmptyDir(dir) {
|
|
248
|
+
if (!existsSync(dir)) return true;
|
|
249
|
+
try {
|
|
250
|
+
return readdirSync(dir).filter((name) => name !== "." && name !== "..").length === 0;
|
|
251
|
+
} catch {
|
|
252
|
+
return false;
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
export function isGitSubmoduleMount(repoRoot, targetPath) {
|
|
257
|
+
const relative = normalizeSlash(path.relative(repoRoot, path.resolve(targetPath)));
|
|
258
|
+
if (!relative || relative.startsWith("..")) return false;
|
|
259
|
+
const listed = readGitmodules(repoRoot).some((item) => item.path === relative);
|
|
260
|
+
if (listed) return true;
|
|
261
|
+
const staged = gitLsFilesStage(repoRoot, relative);
|
|
262
|
+
return staged?.mode === GITLINK_MODE;
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
export function isGitSubmoduleMountAnywhere(startOrRoot, targetPath) {
|
|
266
|
+
const roots = uniqueResolved([startOrRoot, ...collectGitRoots(targetPath), ...collectGitRoots(startOrRoot)]);
|
|
267
|
+
return roots.some((root) => isGitSubmoduleMount(root, targetPath));
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
export function inspectCheckoutState(repoRoot, targetPath) {
|
|
271
|
+
const resolved = path.resolve(targetPath);
|
|
272
|
+
const relative = repoRoot ? normalizeSlash(path.relative(path.resolve(repoRoot), resolved)) : "";
|
|
273
|
+
const inRepo = Boolean(relative) && !relative.startsWith("..");
|
|
274
|
+
const staged = inRepo ? gitLsFilesStage(repoRoot, relative) : null;
|
|
275
|
+
const listed = inRepo ? readGitmodules(repoRoot).some((item) => item.path === relative) : false;
|
|
276
|
+
const superproject = existsSync(path.join(resolved, ".git")) ? gitShowSuperproject(resolved) : "";
|
|
277
|
+
const isMount = staged?.mode === GITLINK_MODE || listed || Boolean(superproject);
|
|
278
|
+
const hasGit = existsSync(path.join(resolved, ".git"));
|
|
279
|
+
if (isMount && !hasGit) {
|
|
280
|
+
return isEmptyDir(resolved) ? "empty-gitlink" : "uninitialized";
|
|
281
|
+
}
|
|
282
|
+
if (isMount && hasGit) {
|
|
283
|
+
const ref = gitAbbrevRef(resolved);
|
|
284
|
+
if (ref === "HEAD") return "detached-head";
|
|
285
|
+
return "attached-branch";
|
|
286
|
+
}
|
|
287
|
+
return null;
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
export function actualWorkingTreeScope(repoRoot, targetPath) {
|
|
291
|
+
if (isGitSubmoduleMountAnywhere(repoRoot, targetPath) || gitShowSuperproject(targetPath)) {
|
|
292
|
+
return "git-submodule";
|
|
293
|
+
}
|
|
294
|
+
return "regular";
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
export function regularDirectoryMisreadViolation(record = {}, options = {}) {
|
|
298
|
+
const force = options.force === true;
|
|
299
|
+
const checkout = asString(record.checkout_state);
|
|
300
|
+
if (checkout === "empty-gitlink" || checkout === "uninitialized") {
|
|
301
|
+
return "empty gitlink must not be treated as a regular directory";
|
|
302
|
+
}
|
|
303
|
+
if (checkout === "detached-head") {
|
|
304
|
+
return "detached HEAD must not be treated as a regular directory";
|
|
305
|
+
}
|
|
306
|
+
if (options.repoRoot && options.targetPath) {
|
|
307
|
+
const inspected = inspectCheckoutState(options.repoRoot, options.targetPath);
|
|
308
|
+
if (inspected === "empty-gitlink" || inspected === "uninitialized") {
|
|
309
|
+
return "empty gitlink must not be treated as a regular directory";
|
|
310
|
+
}
|
|
311
|
+
if (inspected === "detached-head") {
|
|
312
|
+
return "detached HEAD must not be treated as a regular directory";
|
|
313
|
+
}
|
|
314
|
+
if (isGitSubmoduleMountAnywhere(options.repoRoot, options.targetPath) && force) {
|
|
315
|
+
return "--force must not overlay a git-submodule mount as a regular directory";
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
if (force && asString(record.repository_scope) === "git-submodule") {
|
|
319
|
+
return "--force must not overlay a git-submodule mount as a regular directory";
|
|
320
|
+
}
|
|
321
|
+
return null;
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
export function findEnclosingSubmoduleWorktree(repoRoot, start) {
|
|
325
|
+
let current = path.resolve(start);
|
|
326
|
+
const stop = repoRoot ? path.resolve(repoRoot) : null;
|
|
327
|
+
while (true) {
|
|
328
|
+
const roots = uniqueResolved([repoRoot, ...collectGitRoots(current)]);
|
|
329
|
+
for (const root of roots) {
|
|
330
|
+
if (path.resolve(root) === current) continue;
|
|
331
|
+
if (isGitSubmoduleMount(root, current)) {
|
|
332
|
+
return {
|
|
333
|
+
worktree: current,
|
|
334
|
+
superproject: root,
|
|
335
|
+
checkout: inspectCheckoutState(root, current)
|
|
336
|
+
};
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
if (existsSync(path.join(current, ".git"))) {
|
|
340
|
+
const superproject = gitShowSuperproject(current);
|
|
341
|
+
if (superproject) {
|
|
342
|
+
const checkout = inspectCheckoutState(superproject, current)
|
|
343
|
+
|| (gitAbbrevRef(current) === "HEAD" ? "detached-head" : "attached-branch");
|
|
344
|
+
return { worktree: current, superproject, checkout };
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
if (stop && current === stop) break;
|
|
348
|
+
const parent = path.dirname(current);
|
|
349
|
+
if (parent === current) break;
|
|
350
|
+
current = parent;
|
|
351
|
+
}
|
|
352
|
+
return null;
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
export function overlayMountViolation(repoRoot, targetPath, { force = false } = {}) {
|
|
356
|
+
if (!isGitSubmoduleMountAnywhere(repoRoot, targetPath)) return null;
|
|
357
|
+
return force
|
|
358
|
+
? "--force 不得把 git-submodule 挂载点当成普通目录覆盖;gitlink 不得由脚手架覆盖"
|
|
359
|
+
: "git-submodule gitlink 不得由脚手架覆盖;先 git submodule update --init,在子仓附加分支的工作树内生成,或改用 external-repository / harness-apps";
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
export function unsafeSubmoduleWorktreeViolation(repoRoot, targetPath) {
|
|
363
|
+
const enclosing = findEnclosingSubmoduleWorktree(repoRoot, targetPath);
|
|
364
|
+
if (!enclosing) return null;
|
|
365
|
+
if (enclosing.checkout === "empty-gitlink" || enclosing.checkout === "uninitialized") {
|
|
366
|
+
return "空 gitlink 不得当成普通目录写入;gitlink 不得由脚手架覆盖";
|
|
367
|
+
}
|
|
368
|
+
if (enclosing.checkout === "detached-head") {
|
|
369
|
+
return "detached HEAD 不得当成普通目录写入;gitlink 不得由脚手架覆盖";
|
|
370
|
+
}
|
|
371
|
+
return null;
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
export function implementationWriteViolation(repoRoot, targetPath, { force = false } = {}) {
|
|
375
|
+
return overlayMountViolation(repoRoot, targetPath, { force })
|
|
376
|
+
|| unsafeSubmoduleWorktreeViolation(repoRoot, targetPath);
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
function freezeWorkingTreeInspection({ writable, violation, declared, actual }) {
|
|
380
|
+
return Object.freeze({
|
|
381
|
+
writable: writable === true,
|
|
382
|
+
violation: violation || null,
|
|
383
|
+
declared: Object.freeze(declared),
|
|
384
|
+
actual: Object.freeze(actual)
|
|
385
|
+
});
|
|
386
|
+
}
|
|
387
|
+
|
|
388
|
+
export function isWorkingTreeWritable(inspection) {
|
|
389
|
+
return inspection?.writable === true;
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
export function inspectWorkingTreeScope(repoRoot, record = {}) {
|
|
393
|
+
const projectRoot = normalizeSlash(record.project_root);
|
|
394
|
+
const declaredScope = asString(record.repository_scope);
|
|
395
|
+
const declaredCheckout = asString(record.checkout_state);
|
|
396
|
+
const declared = { scope: declaredScope, checkout: declaredCheckout };
|
|
397
|
+
if (!repoRoot || !projectRoot) {
|
|
398
|
+
return freezeWorkingTreeInspection({
|
|
399
|
+
writable: false,
|
|
400
|
+
violation: "working-tree inspection requires repoRoot and project_root",
|
|
401
|
+
declared,
|
|
402
|
+
actual: { scope: null, checkout: null }
|
|
403
|
+
});
|
|
404
|
+
}
|
|
405
|
+
const target = path.resolve(repoRoot, projectRoot);
|
|
406
|
+
const actualScope = actualWorkingTreeScope(repoRoot, target);
|
|
407
|
+
const actualCheckout = inspectCheckoutState(repoRoot, target);
|
|
408
|
+
const actual = { scope: actualScope, checkout: actualCheckout };
|
|
409
|
+
let violation = null;
|
|
410
|
+
if (declaredScope === "harness-apps" && actualScope === "git-submodule") {
|
|
411
|
+
violation = "工作树存在 gitlink / .gitmodules,不得登记为 harness-apps";
|
|
412
|
+
} else if (declaredScope === "external-repository" && actualScope === "git-submodule" && projectRoot.startsWith("apps/")) {
|
|
413
|
+
violation = "工作树存在 apps/ gitlink,不得登记为 external-repository";
|
|
414
|
+
} else if (declaredScope === "git-submodule" && actualScope !== "git-submodule") {
|
|
415
|
+
violation = "工作树不是 gitlink,不得登记为 git-submodule";
|
|
416
|
+
}
|
|
417
|
+
if (isUnsafeCheckout(declaredCheckout) || isUnsafeCheckout(actualCheckout)) {
|
|
418
|
+
const misread = regularDirectoryMisreadViolation({
|
|
419
|
+
checkout_state: isUnsafeCheckout(actualCheckout) ? actualCheckout : declaredCheckout
|
|
420
|
+
});
|
|
421
|
+
violation = violation ? `${violation};${misread}` : misread;
|
|
422
|
+
} else if (!violation) {
|
|
423
|
+
violation = unsafeSubmoduleWorktreeViolation(repoRoot, target);
|
|
424
|
+
}
|
|
425
|
+
const writable = violation === null
|
|
426
|
+
&& declaredCheckout !== "empty-gitlink"
|
|
427
|
+
&& (declaredScope !== "git-submodule"
|
|
428
|
+
|| (declaredCheckout === "attached-branch" && actualCheckout === "attached-branch"));
|
|
429
|
+
return freezeWorkingTreeInspection({ writable, violation, declared, actual });
|
|
430
|
+
}
|
|
431
|
+
|
|
432
|
+
export function gitSubmoduleScaffoldViolation(repositoryRoot, outputDir, projectName, { force = false } = {}) {
|
|
433
|
+
const resolvedOutput = path.resolve(outputDir);
|
|
434
|
+
const projectRoot = path.resolve(resolvedOutput, projectName);
|
|
435
|
+
const gitRoot = findGitRoot(projectRoot) || findGitRoot(resolvedOutput) || repositoryRoot || null;
|
|
436
|
+
return overlayMountViolation(gitRoot, projectRoot, { force })
|
|
437
|
+
|| unsafeSubmoduleWorktreeViolation(gitRoot, projectRoot)
|
|
438
|
+
|| unsafeSubmoduleWorktreeViolation(gitRoot, resolvedOutput)
|
|
439
|
+
|| regularDirectoryMisreadViolation({}, { force, repoRoot: gitRoot, targetPath: projectRoot });
|
|
440
|
+
}
|
|
441
|
+
|
|
442
|
+
export function gitSubmoduleCommitViolation({ checkout_state, commit_authorized } = {}) {
|
|
443
|
+
if (checkout_state === "detached-head") {
|
|
444
|
+
return "git-submodule must checkout an attached branch before commit";
|
|
445
|
+
}
|
|
446
|
+
if (commit_authorized !== true) return "commit_authorized must be true";
|
|
447
|
+
return null;
|
|
448
|
+
}
|
|
449
|
+
|
|
450
|
+
export function gitSubmodulePushOrderViolation(order) {
|
|
451
|
+
const expected = ["submodule-repositories", "superproject-gitlink"];
|
|
452
|
+
if (!Array.isArray(order) || order.length !== expected.length || expected.some((item, index) => order[index] !== item)) {
|
|
453
|
+
return "git-submodule push/commit order must be submodule-repositories then superproject-gitlink";
|
|
454
|
+
}
|
|
455
|
+
return null;
|
|
456
|
+
}
|
|
@@ -28,6 +28,9 @@ function validateMattContract(data) {
|
|
|
28
28
|
ensure(git?.natural_language_intent_is_authorization === false && rule?.requires_explicit_user_authorization === true && rule?.authorized_value === true && rule?.unauthorized_action === "checkpoint-only", `${action} 授权边界不完整`);
|
|
29
29
|
ensure(includesAll(rule?.required, [`${prefix}_authorized`, `${prefix}_scope`, `${prefix}_authorization_ref`]) && includesAll(rule?.non_empty, [`${prefix}_scope`, `${prefix}_authorization_ref`]), `${action} 授权必填字段不完整`);
|
|
30
30
|
}
|
|
31
|
+
const submodule = git?.git_submodule;
|
|
32
|
+
ensure(submodule?.applies_when === "repository_scope=git-submodule" && submodule?.forbid_commit_on_detached_head === true && submodule?.empty_gitlink_scaffold === "blocked" && submodule?.treat_empty_gitlink_as_regular_dir === "blocked" && submodule?.treat_detached_head_as_regular_dir === "blocked" && submodule?.force_overlay_mount === "blocked" && submodule?.write_inside_detached_head === "blocked" && submodule?.require_git_entry_mode === "160000" && submodule?.working_tree_declared_scope_must_match === true && submodule?.copy_source_into_harness === "forbidden" && submodule?.clone_requires_recurse_submodules === true && submodule?.push_recurse_submodules === "check" && submodule?.delivery_order_must_include === "superproject-gitlink-update" && submodule?.nested_authorization === "per-repository" && submodule?.inspect_working_tree_writable === "explicit-boolean" && submodule?.empty_gitlink_writable === false && submodule?.force_overlay_regular_dir_path === "blocked", "git-submodule Git 授权契约不完整");
|
|
33
|
+
ensure(JSON.stringify(submodule?.commit_order) === JSON.stringify(["submodule-repositories", "superproject-gitlink"]) && JSON.stringify(submodule?.push_order) === JSON.stringify(["submodule-repositories", "superproject-gitlink"]), "git-submodule 先子后父顺序不完整");
|
|
31
34
|
}
|
|
32
35
|
|
|
33
36
|
function validateInvocationBoundary(data) {
|
|
@@ -54,6 +57,11 @@ function validateInvocationBoundary(data) {
|
|
|
54
57
|
ensure(routes?.["work-unit.discovery-requirements"]?.skills?.includes("grilling") && routes?.["work-unit.discovery-requirements"]?.skills?.includes("domain-modeling"), "需求分析工作单元缺少 grilling/domain-modeling");
|
|
55
58
|
ensure(routes?.["work-unit.discovery-opportunity"]?.route_by?.market_or_competitor_fact === "competitive-intelligence" && routes["work-unit.discovery-opportunity"].route_by.technical_or_standard_fact === "research", "机会调研事实路由不准确");
|
|
56
59
|
ensure(routes?.["work-unit.slice-implementation"]?.skills?.includes("tdd") && routes?.["work-unit.slice-implementation"]?.skills?.includes("yss-ui"), "原生实现工作单元缺少 TDD 或 UI 路由");
|
|
60
|
+
const frontendRoute = routes?.["work-unit.slice-implementation"]?.frontend_route;
|
|
61
|
+
ensure(frontendRoute?.primary_skill === "yss-ui" && frontendRoute?.page_orchestration_skill === "yss-page-module-development", "前端实现路由缺少 yss-ui 主入口或页面编排技能");
|
|
62
|
+
for (const impact of ["api_impact", "formily_impact", "table_impact", "tree_impact", "height_impact", "export_impact", "theme_impact"]) {
|
|
63
|
+
ensure(Array.isArray(frontendRoute?.conditional_skills?.[impact]) && frontendRoute.conditional_skills[impact].length > 0 && typeof frontendRoute.not_applicable_reasons?.[impact] === "string", `前端条件专项路由缺少 ${impact}`);
|
|
64
|
+
}
|
|
57
65
|
ensure(routes?.["work-unit.frontend-implementation-verification"]?.skills?.includes("code-review") && routes?.["work-unit.frontend-implementation-verification"]?.applies_when === "ui_impact", "前端还原验证未绑定 UI fidelity 审查轴");
|
|
58
66
|
for (const id of ["work-unit.spec-synthesis", "work-unit.ticket-decomposition", "work-unit.slice-implementation"]) {
|
|
59
67
|
ensure(routes?.[id]?.native?.source === "yss-product-lifecycle" && routes[id].compatibility?.source === "mattpocock/skills" && routes[id].compatibility.formal_artifact_owner === "explicit-user-entry", `${id} 未分离原生执行定义与 Matt 兼容输入`);
|
|
@@ -67,6 +75,12 @@ function validateInvocationBoundary(data) {
|
|
|
67
75
|
function validateWorkflowExecutionResult(payload, contract, workUnitRoutes) {
|
|
68
76
|
for (const field of contract.required) ensure(Object.hasOwn(payload, field), `Workflow Execution Result 缺少 ${field}`);
|
|
69
77
|
ensure(contract.result_values.includes(payload.result), "Workflow Execution Result result 无效");
|
|
78
|
+
if (Object.hasOwn(payload, "unavailable_skill")) {
|
|
79
|
+
ensure(payload.result === contract.unavailable_skill.blocking_result, "技能不可用必须将 Workflow Execution Result 标记为 blocked");
|
|
80
|
+
for (const field of contract.unavailable_skill.required) {
|
|
81
|
+
ensure(typeof payload.unavailable_skill?.[field] === "string" && payload.unavailable_skill[field].trim(), `unavailable_skill.${field} 无效`);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
70
84
|
for (const field of contract.workflow_reference.required) ensure(typeof payload.workflow_reference?.[field] === "string" && payload.workflow_reference[field].trim(), `workflow_reference.${field} 无效`);
|
|
71
85
|
const workUnit = workUnitRoutes?.[payload.work_unit];
|
|
72
86
|
ensure(workUnit, `未知 Workflow Execution Result work_unit: ${payload.work_unit}`);
|
|
@@ -92,6 +106,7 @@ function validateMattProse(skill, adapter) {
|
|
|
92
106
|
ensure(adapter.includes("仅发现旧路径资产") && adapter.includes("不得调用 `setup-matt-pocock-skills`"), "适配器缺少 setup 旧资产迁移或显式用户入口条件");
|
|
93
107
|
ensure(adapter.includes("frontier 为空") && adapter.includes("双方共同理解已确认"), "适配器缺少 grill_exit 的 frontier 或共同理解条件");
|
|
94
108
|
ensure(skill.includes("自然语言意向不构成上述结构化 Git 授权") && adapter.includes("本身不是结构化授权"), "主技能或适配器缺少自然语言 Git 意向不是授权的说明");
|
|
109
|
+
ensure(adapter.includes("禁止 detached HEAD 提交") && adapter.includes("先推子仓再更新父仓 gitlink"), "适配器缺少 git-submodule 嵌套 Git 授权说明");
|
|
95
110
|
}
|
|
96
111
|
|
|
97
112
|
function validateInvocationProse(skill, adapter, orchestration) {
|
|
@@ -185,6 +200,16 @@ export function runScenario(name) {
|
|
|
185
200
|
blocking_signals: []
|
|
186
201
|
};
|
|
187
202
|
validateWorkflowExecutionResult(validResult, data.workflow_execution_result, data.work_unit_routes);
|
|
203
|
+
const unavailableResult = structuredClone(validResult);
|
|
204
|
+
unavailableResult.result = "blocked";
|
|
205
|
+
unavailableResult.unavailable_skill = { skill: "yss-ui", provider: "codex", fallback: "manual-review", resolution: "needs-human" };
|
|
206
|
+
unavailableResult.blocking_signals = ["missing_evidence"];
|
|
207
|
+
validateWorkflowExecutionResult(unavailableResult, data.workflow_execution_result, data.work_unit_routes);
|
|
208
|
+
const malformedUnavailable = structuredClone(unavailableResult);
|
|
209
|
+
delete malformedUnavailable.unavailable_skill.fallback;
|
|
210
|
+
let unavailableRejected = false;
|
|
211
|
+
try { validateWorkflowExecutionResult(malformedUnavailable, data.workflow_execution_result, data.work_unit_routes); } catch { unavailableRejected = true; }
|
|
212
|
+
ensure(unavailableRejected, "技能不可用结果缺少 fallback 时未被拒绝");
|
|
188
213
|
const compatibleResult = structuredClone(validResult);
|
|
189
214
|
compatibleResult.workflow_reference = { source: "mattpocock/skills", skill: "to-spec", invocation_mode: "reference" };
|
|
190
215
|
validateWorkflowExecutionResult(compatibleResult, data.workflow_execution_result, data.work_unit_routes);
|
|
@@ -214,7 +239,13 @@ export function runScenario(name) {
|
|
|
214
239
|
(item) => { item.matt_invocation_boundary.user_invoked_skills.push("unexpected-user-entry"); },
|
|
215
240
|
(item) => { item.setup_readiness.lifecycle_may_invoke_setup = true; },
|
|
216
241
|
(item) => { item.grill_exit.user_confirmation_required = false; },
|
|
217
|
-
(item) => { delete item.git_authorization.push; }
|
|
242
|
+
(item) => { delete item.git_authorization.push; },
|
|
243
|
+
(item) => { delete item.git_authorization.git_submodule; },
|
|
244
|
+
(item) => { item.git_authorization.git_submodule.forbid_commit_on_detached_head = false; },
|
|
245
|
+
(item) => { item.git_authorization.git_submodule.force_overlay_mount = "allowed"; },
|
|
246
|
+
(item) => { item.git_authorization.git_submodule.write_inside_detached_head = "allowed"; },
|
|
247
|
+
(item) => { item.git_authorization.git_submodule.empty_gitlink_writable = true },
|
|
248
|
+
(item) => { item.git_authorization.git_submodule.force_overlay_regular_dir_path = "allowed"; }
|
|
218
249
|
];
|
|
219
250
|
for (const mutate of mutations) {
|
|
220
251
|
const candidate = structuredClone(data); mutate(candidate);
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { fileURLToPath } from "node:url";
|
|
4
|
+
import { loadSkillRegistry } from "./skill-registry.mjs";
|
|
5
|
+
|
|
6
|
+
export const ROOT = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "../..");
|
|
7
|
+
|
|
8
|
+
function fail(message) {
|
|
9
|
+
throw new TypeError(message);
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export function validateSkillGovernance({ read = (relative) => readFileSync(path.join(ROOT, relative), "utf8"), exists = (relative) => existsSync(path.join(ROOT, relative)) } = {}) {
|
|
13
|
+
const globalRules = read(".agents/rules/yss-ai-skills.md");
|
|
14
|
+
const tableSkill = read(".agents/skills/ytable-usage/SKILL.md");
|
|
15
|
+
const pageSkill = read(".agents/skills/yss-page-module-development/SKILL.md");
|
|
16
|
+
|
|
17
|
+
if (/toolbar-config\.custom.{0,30}(必须|必需)|必须.{0,30}toolbar-config\.custom/.test(globalRules)) {
|
|
18
|
+
fail("全局规则不得把 toolbar-config.custom 作为无条件要求");
|
|
19
|
+
}
|
|
20
|
+
for (const marker of ["主操作必须放入 `#toolbar-right`", "只有确实需要列设置时才使用", "toolbar-config"] ) {
|
|
21
|
+
if (!globalRules.includes(marker)) fail(`全局规则缺少条件化表格工具栏规则: ${marker}`);
|
|
22
|
+
}
|
|
23
|
+
for (const marker of ["无需配置 `:toolbar-config=\"{ custom: true }\"`", "仅在业务明确需要列设置时才传入"]) {
|
|
24
|
+
if (!tableSkill.includes(marker)) fail(`YTable 专项技能缺少条件化工具栏规则: ${marker}`);
|
|
25
|
+
}
|
|
26
|
+
if (!pageSkill.includes("只有确实需要列设置时才启用 `toolbar-config.custom`")) {
|
|
27
|
+
fail("页面模块 canonical 技能缺少条件化 toolbar-config 规则");
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
const registry = loadSkillRegistry();
|
|
31
|
+
const canonicalIds = new Set(registry.skills.map((skill) => skill.id));
|
|
32
|
+
const aliases = new Map(registry.skills.flatMap((skill) => skill.aliases.map((alias) => [alias, skill.id])));
|
|
33
|
+
const legacy = new Set(["api-integration", "page-module-development", "use-table-height", "use-tree-height", "yss-ui-business-page-generation"]);
|
|
34
|
+
for (const alias of legacy) {
|
|
35
|
+
if (exists(`.agents/skills/${alias}`)) fail(`legacy alias 不得存在独立 canonical 目录: ${alias}`);
|
|
36
|
+
if (!aliases.has(alias)) fail(`legacy alias 未登记: ${alias}`);
|
|
37
|
+
}
|
|
38
|
+
if (exists(".agents/skills/high-fidelity-html-prototype") || aliases.has("high-fidelity-html-prototype")) {
|
|
39
|
+
fail("high-fidelity-html-prototype 已退役,不得保留物理目录或运行时 alias");
|
|
40
|
+
}
|
|
41
|
+
for (const skill of registry.skills) {
|
|
42
|
+
if (!canonicalIds.has(skill.id)) fail(`注册表 canonical skill 无效: ${skill.id}`);
|
|
43
|
+
if (skill.maturity === "deprecated") {
|
|
44
|
+
for (const field of ["replaced_by", "migration_deadline", "cleanup_status"]) {
|
|
45
|
+
if (!skill[field] || typeof skill[field] !== "string") fail(`deprecated 技能缺少 ${field}: ${skill.id}`);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
return { checked: true, legacy_aliases: legacy.size };
|
|
50
|
+
}
|