create-yss-spec 2.2.0 → 2.2.2
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/src/cli.js +56 -8
- 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/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/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/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-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 +1 -1
- 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/orchestration-contract.yaml +62 -1
- package/template/.agents/skills/yss-router/references/boundaries.md +1 -1
- package/template/.agents/skills/yss-router/references/router-contract.yaml +6 -2
- 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/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/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/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-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 +1 -1
- 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/orchestration-contract.yaml +62 -1
- package/template/.claude/skills/yss-router/references/boundaries.md +1 -1
- package/template/.claude/skills/yss-router/references/router-contract.yaml +6 -2
- 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/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/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/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-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 +1 -1
- 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/orchestration-contract.yaml +62 -1
- package/template/.codex/skills/yss-router/references/boundaries.md +1 -1
- package/template/.codex/skills/yss-router/references/router-contract.yaml +6 -2
- 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/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/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/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-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 +1 -1
- 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/orchestration-contract.yaml +62 -1
- package/template/.cursor/skills/yss-router/references/boundaries.md +1 -1
- package/template/.cursor/skills/yss-router/references/router-contract.yaml +6 -2
- 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/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/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/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-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 +1 -1
- 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/orchestration-contract.yaml +62 -1
- package/template/.hermes/skills/yss-router/references/boundaries.md +1 -1
- package/template/.hermes/skills/yss-router/references/router-contract.yaml +6 -2
- 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/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/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/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-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 +1 -1
- 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/orchestration-contract.yaml +62 -1
- package/template/.pi/skills/yss-router/references/boundaries.md +1 -1
- package/template/.pi/skills/yss-router/references/router-contract.yaml +6 -2
- 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/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/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/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-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 +1 -1
- 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/orchestration-contract.yaml +62 -1
- package/template/.qoder/skills/yss-router/references/boundaries.md +1 -1
- package/template/.qoder/skills/yss-router/references/router-contract.yaml +6 -2
- 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/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/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/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-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 +1 -1
- 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/orchestration-contract.yaml +62 -1
- package/template/.trae/skills/yss-router/references/boundaries.md +1 -1
- package/template/.trae/skills/yss-router/references/router-contract.yaml +6 -2
- 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 +1 -13
- package/template/docs/adr/README.md +7 -0
- package/template/docs/agents/skill-migrations.md +16 -0
- package/template/docs/agents/skills-maintenance.md +2 -2
- package/template/docs/agents/yss-skill-registry.yaml +125 -25
- package/template/docs/process/implementation-repo-integration.md +1 -1
- 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/scenario-checks.mjs +21 -0
- 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/verify-governance-release +7 -5
- package/template/scripts/verify-skill-governance +10 -0
- package/template/scripts/verify-template +3 -2
- package/template/skills-lock.json +285 -29
- package/template.manifest.json +30 -7
- package/template.snapshot.json +5 -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/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/.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/docs/adr/0001-product-design-prototype-entrypoint.md +0 -54
- package/template/docs/adr/0002-yss-project-repository-mode.md +0 -3
- package/template/docs/adr/0003-machine-readable-lifecycle-registry.md +0 -5
- package/template/docs/adr/0006-stable-lifecycle-ids-and-generated-structure.md +0 -5
- package/template/docs/adr/0007-lifecycle-native-work-units.md +0 -5
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
- `.agents/skills` 是跨 Agent 共享技能的唯一权威内容。
|
|
8
8
|
- `.claude/skills`、`.codex/skills`、`.cursor/skills`、`.hermes/skills`、`.pi/skills`、`.qoder/skills`、`.trae/skills` 中的同名共享技能是生成投影,不得分别手工修改。
|
|
9
9
|
- Cursor 的契约运行时入口是 `.cursor/skills`。若客户端同时枚举 `.claude/skills`,仍以 `.cursor/skills` 为 Cursor 投影契约,不得把两套同名 skill 解释为两个来源。
|
|
10
|
-
- 分层、别名和默认可发现性以 `docs/agents/yss-skill-registry.yaml`
|
|
10
|
+
- 分层、别名和默认可发现性以 `docs/agents/yss-skill-registry.yaml` 为准;当前 registry 为 `active`,Router、生命周期编排器和实例发现面必须消费通过校验的 canonical 技能及其 alias 解析结果。
|
|
11
11
|
- 只属于某个平台的 skill 继续保留在对应 root,并由 `skills-lock.json` 的 `platform` 分组记录。
|
|
12
12
|
- 共享技能投影可以是指向权威目录的符号链接,也可以是完整同步副本;`scripts/sync-skills --check` 会检查链接目标或完整目录哈希。
|
|
13
13
|
|
|
@@ -57,7 +57,7 @@
|
|
|
57
57
|
scripts/verify-template
|
|
58
58
|
```
|
|
59
59
|
|
|
60
|
-
|
|
60
|
+
模板源维护引入或更新分发到实例的 Node 工具时,维护侧依赖、构建和 vendor 校验只在模板源治理区及 CI 中执行;实例门禁不得安装依赖或重建 vendor。实例只消费已提交的 `scripts/lib/*.mjs` 与 `scripts/vendor/*.mjs`,具体维护侧命令和治理决策不属于项目实例文档。
|
|
61
61
|
|
|
62
62
|
6. 需要重新加载技能的客户端在变更落地后重启或刷新项目。
|
|
63
63
|
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
schema_version: 1
|
|
2
2
|
registry_id: yss.skill-routing
|
|
3
|
-
status:
|
|
3
|
+
status: active
|
|
4
4
|
description: >-
|
|
5
|
-
技能分层、别名、默认可发现性和 Agent
|
|
6
|
-
本文件不替代 skills-lock.json 的来源、hash 与投影完整性职责;Router
|
|
5
|
+
技能分层、别名、默认可发现性和 Agent 运行时入口的可执行路由注册表。
|
|
6
|
+
本文件不替代 skills-lock.json 的来源、hash 与投影完整性职责;Router 与生命周期编排器只消费通过本表校验的 canonical 技能。
|
|
7
7
|
canonical_content_root: .agents/skills
|
|
8
8
|
runtime_policy:
|
|
9
|
-
consumed_by_router:
|
|
10
|
-
consumed_by_lifecycle:
|
|
11
|
-
discovery_enforced:
|
|
9
|
+
consumed_by_router: true
|
|
10
|
+
consumed_by_lifecycle: true
|
|
11
|
+
discovery_enforced: true
|
|
12
12
|
agent_runtime_roots:
|
|
13
13
|
claude: .claude/skills
|
|
14
14
|
codex: .codex/skills
|
|
@@ -27,7 +27,7 @@ skills:
|
|
|
27
27
|
- id: ask-matt
|
|
28
28
|
layer: compatibility
|
|
29
29
|
maturity: supported
|
|
30
|
-
instance_default_discoverable:
|
|
30
|
+
instance_default_discoverable: false
|
|
31
31
|
aliases: []
|
|
32
32
|
impacts: [lifecycle]
|
|
33
33
|
- id: code-review
|
|
@@ -75,13 +75,13 @@ skills:
|
|
|
75
75
|
- id: grill-me
|
|
76
76
|
layer: compatibility
|
|
77
77
|
maturity: supported
|
|
78
|
-
instance_default_discoverable:
|
|
78
|
+
instance_default_discoverable: false
|
|
79
79
|
aliases: []
|
|
80
80
|
impacts: [discovery]
|
|
81
81
|
- id: grill-with-docs
|
|
82
82
|
layer: compatibility
|
|
83
83
|
maturity: supported
|
|
84
|
-
instance_default_discoverable:
|
|
84
|
+
instance_default_discoverable: false
|
|
85
85
|
aliases: []
|
|
86
86
|
impacts: [discovery]
|
|
87
87
|
- id: grilling
|
|
@@ -96,17 +96,10 @@ skills:
|
|
|
96
96
|
instance_default_discoverable: true
|
|
97
97
|
aliases: []
|
|
98
98
|
impacts: [lifecycle]
|
|
99
|
-
- id: high-fidelity-html-prototype
|
|
100
|
-
layer: compatibility
|
|
101
|
-
maturity: deprecated
|
|
102
|
-
instance_default_discoverable: false
|
|
103
|
-
aliases: []
|
|
104
|
-
impacts: [prototype]
|
|
105
|
-
replaced_by: yss-prototype-stage
|
|
106
99
|
- id: implement
|
|
107
100
|
layer: compatibility
|
|
108
101
|
maturity: supported
|
|
109
|
-
instance_default_discoverable:
|
|
102
|
+
instance_default_discoverable: false
|
|
110
103
|
aliases: []
|
|
111
104
|
impacts: [lifecycle]
|
|
112
105
|
- id: implementation-repo-onboarding
|
|
@@ -118,7 +111,7 @@ skills:
|
|
|
118
111
|
- id: improve-codebase-architecture
|
|
119
112
|
layer: compatibility
|
|
120
113
|
maturity: supported
|
|
121
|
-
instance_default_discoverable:
|
|
114
|
+
instance_default_discoverable: false
|
|
122
115
|
aliases: []
|
|
123
116
|
impacts: [quality]
|
|
124
117
|
- id: llm-wiki
|
|
@@ -190,7 +183,7 @@ skills:
|
|
|
190
183
|
- id: setup-matt-pocock-skills
|
|
191
184
|
layer: compatibility
|
|
192
185
|
maturity: supported
|
|
193
|
-
instance_default_discoverable:
|
|
186
|
+
instance_default_discoverable: false
|
|
194
187
|
aliases: []
|
|
195
188
|
impacts: [setup]
|
|
196
189
|
- id: setup-pre-commit
|
|
@@ -226,19 +219,19 @@ skills:
|
|
|
226
219
|
- id: to-spec
|
|
227
220
|
layer: compatibility
|
|
228
221
|
maturity: supported
|
|
229
|
-
instance_default_discoverable:
|
|
222
|
+
instance_default_discoverable: false
|
|
230
223
|
aliases: []
|
|
231
224
|
impacts: [lifecycle]
|
|
232
225
|
- id: to-tickets
|
|
233
226
|
layer: compatibility
|
|
234
227
|
maturity: supported
|
|
235
|
-
instance_default_discoverable:
|
|
228
|
+
instance_default_discoverable: false
|
|
236
229
|
aliases: []
|
|
237
230
|
impacts: [lifecycle]
|
|
238
231
|
- id: triage
|
|
239
232
|
layer: compatibility
|
|
240
233
|
maturity: supported
|
|
241
|
-
instance_default_discoverable:
|
|
234
|
+
instance_default_discoverable: false
|
|
242
235
|
aliases: []
|
|
243
236
|
impacts: [lifecycle]
|
|
244
237
|
- id: using-git-worktrees
|
|
@@ -413,7 +406,7 @@ skills:
|
|
|
413
406
|
layer: specialist
|
|
414
407
|
maturity: supported
|
|
415
408
|
instance_default_discoverable: false
|
|
416
|
-
aliases: []
|
|
409
|
+
aliases: [page-module-development, yss-ui-business-page-generation]
|
|
417
410
|
impacts: [frontend]
|
|
418
411
|
- id: yss-product-lifecycle
|
|
419
412
|
layer: core
|
|
@@ -473,13 +466,13 @@ skills:
|
|
|
473
466
|
layer: specialist
|
|
474
467
|
maturity: supported
|
|
475
468
|
instance_default_discoverable: false
|
|
476
|
-
aliases: []
|
|
469
|
+
aliases: [use-table-height]
|
|
477
470
|
impacts: [frontend]
|
|
478
471
|
- id: yss-use-tree-height
|
|
479
472
|
layer: specialist
|
|
480
473
|
maturity: supported
|
|
481
474
|
instance_default_discoverable: false
|
|
482
|
-
aliases: []
|
|
475
|
+
aliases: [use-tree-height]
|
|
483
476
|
impacts: [frontend]
|
|
484
477
|
- id: yss-userinfo
|
|
485
478
|
layer: specialist
|
|
@@ -499,12 +492,119 @@ skills:
|
|
|
499
492
|
instance_default_discoverable: false
|
|
500
493
|
aliases: []
|
|
501
494
|
impacts: [backend, api]
|
|
495
|
+
- id: component-selection-imports
|
|
496
|
+
layer: specialist
|
|
497
|
+
maturity: supported
|
|
498
|
+
instance_default_discoverable: false
|
|
499
|
+
aliases: []
|
|
500
|
+
impacts: [frontend]
|
|
501
|
+
- id: file-export-download
|
|
502
|
+
layer: specialist
|
|
503
|
+
maturity: supported
|
|
504
|
+
instance_default_discoverable: false
|
|
505
|
+
aliases: []
|
|
506
|
+
impacts: [frontend, api]
|
|
507
|
+
- id: formily-foundation
|
|
508
|
+
layer: specialist
|
|
509
|
+
maturity: supported
|
|
510
|
+
instance_default_discoverable: false
|
|
511
|
+
aliases: []
|
|
512
|
+
impacts: [frontend]
|
|
513
|
+
- id: formily-linkage-effects
|
|
514
|
+
layer: specialist
|
|
515
|
+
maturity: supported
|
|
516
|
+
instance_default_discoverable: false
|
|
517
|
+
aliases: []
|
|
518
|
+
impacts: [frontend]
|
|
519
|
+
- id: formily-mode-slot-detail
|
|
520
|
+
layer: specialist
|
|
521
|
+
maturity: supported
|
|
522
|
+
instance_default_discoverable: false
|
|
523
|
+
aliases: []
|
|
524
|
+
impacts: [frontend]
|
|
525
|
+
- id: formily-step-flow
|
|
526
|
+
layer: specialist
|
|
527
|
+
maturity: supported
|
|
528
|
+
instance_default_discoverable: false
|
|
529
|
+
aliases: []
|
|
530
|
+
impacts: [frontend]
|
|
531
|
+
- id: frontend-commit
|
|
532
|
+
layer: maintainer-only
|
|
533
|
+
maturity: supported
|
|
534
|
+
instance_default_discoverable: false
|
|
535
|
+
aliases: []
|
|
536
|
+
impacts: [template-maintenance]
|
|
537
|
+
- id: java-backend-commit
|
|
538
|
+
layer: maintainer-only
|
|
539
|
+
maturity: supported
|
|
540
|
+
instance_default_discoverable: false
|
|
541
|
+
aliases: []
|
|
542
|
+
impacts: [template-maintenance]
|
|
543
|
+
- id: page-form-module
|
|
544
|
+
layer: specialist
|
|
545
|
+
maturity: supported
|
|
546
|
+
instance_default_discoverable: false
|
|
547
|
+
aliases: []
|
|
548
|
+
impacts: [frontend]
|
|
549
|
+
- id: page-list-module
|
|
550
|
+
layer: specialist
|
|
551
|
+
maturity: supported
|
|
552
|
+
instance_default_discoverable: false
|
|
553
|
+
aliases: []
|
|
554
|
+
impacts: [frontend]
|
|
555
|
+
- id: page-skeleton
|
|
556
|
+
layer: specialist
|
|
557
|
+
maturity: supported
|
|
558
|
+
instance_default_discoverable: false
|
|
559
|
+
aliases: []
|
|
560
|
+
impacts: [frontend]
|
|
561
|
+
- id: prototype-page-acceptance
|
|
562
|
+
layer: specialist
|
|
563
|
+
maturity: supported
|
|
564
|
+
instance_default_discoverable: false
|
|
565
|
+
aliases: []
|
|
566
|
+
impacts: [prototype, frontend]
|
|
567
|
+
- id: theme-token-usage
|
|
568
|
+
layer: specialist
|
|
569
|
+
maturity: supported
|
|
570
|
+
instance_default_discoverable: false
|
|
571
|
+
aliases: []
|
|
572
|
+
impacts: [frontend, prototype]
|
|
573
|
+
- id: vue3-best-practices
|
|
574
|
+
layer: specialist
|
|
575
|
+
maturity: supported
|
|
576
|
+
instance_default_discoverable: false
|
|
577
|
+
aliases: []
|
|
578
|
+
impacts: [frontend]
|
|
579
|
+
- id: yedit-table-usage
|
|
580
|
+
layer: specialist
|
|
581
|
+
maturity: supported
|
|
582
|
+
instance_default_discoverable: false
|
|
583
|
+
aliases: []
|
|
584
|
+
impacts: [frontend]
|
|
585
|
+
- id: ytable-usage
|
|
586
|
+
layer: specialist
|
|
587
|
+
maturity: supported
|
|
588
|
+
instance_default_discoverable: false
|
|
589
|
+
aliases: []
|
|
590
|
+
impacts: [frontend]
|
|
591
|
+
- id: ytree-usage
|
|
592
|
+
layer: specialist
|
|
593
|
+
maturity: supported
|
|
594
|
+
instance_default_discoverable: false
|
|
595
|
+
aliases: []
|
|
596
|
+
impacts: [frontend]
|
|
502
597
|
platform_skills:
|
|
503
598
|
- id: data-analytics
|
|
504
599
|
root: .codex/skills
|
|
505
600
|
layer: maintainer-only
|
|
506
601
|
instance_default_discoverable: false
|
|
602
|
+
aliases: []
|
|
507
603
|
- id: product-design
|
|
508
604
|
root: .codex/skills
|
|
509
605
|
layer: specialist
|
|
510
606
|
instance_default_discoverable: false
|
|
607
|
+
aliases: [product-design:index]
|
|
608
|
+
external_skills:
|
|
609
|
+
- id: yss-backend-scaffold-parent
|
|
610
|
+
source: .agents/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-parent/SKILL.md
|
|
@@ -30,7 +30,7 @@ apps/
|
|
|
30
30
|
- **frontend**:依赖安装、测试、type-check 与构建优先使用 `pnpm`(例如 `pnpm test`、`pnpm type-check`、`pnpm build`)。不要默认 `npm` 或 `yarn`。
|
|
31
31
|
- **backend**:校验、测试与编译优先使用项目根 `./mvnw`(例如 `./mvnw validate`、`./mvnw test`、`./mvnw package`)。不要默认裸 `mvn`。
|
|
32
32
|
- Ticket、Slice Implementation Contract、CI 和 Review 证据必须写下实际执行的上述命令。既有仓库缺少 `pnpm` 或 Maven Wrapper 时,先记录受控例外、替代命令和责任人,再执行。
|
|
33
|
-
- 本模板源仓库没有产品 frontend / backend
|
|
33
|
+
- 本模板源仓库没有产品 frontend / backend 运行时;模板源维护侧的 Node 校验命令和环境约束只记录在 `.template-source/` 治理区及 CI 配置中,不属于项目实例实现命令。
|
|
34
34
|
|
|
35
35
|
## 1.3 `repository_scope: git-submodule`
|
|
36
36
|
|
|
@@ -165,7 +165,7 @@ skills 是让 AI 按规程工作的“操作手册”,不是关键词装饰。
|
|
|
165
165
|
使用 yss-router,基于 `docs/.scratch/data-modeling/issues/04-validate-model.md`、
|
|
166
166
|
冻结 OpenAPI `docs/.scratch/data-modeling/api/data-modeling.yaml` 和架构设计,
|
|
167
167
|
选择最小 YSS 技能集。
|
|
168
|
-
请说明为什么需要或不需要 yss-domain、yss-repository、yss-mybatis、yss-web-controller、yss-ui、api-integration。
|
|
168
|
+
请说明为什么需要或不需要 yss-domain、yss-repository、yss-mybatis、yss-web-controller、yss-ui、yss-api-integration。
|
|
169
169
|
不要实现代码,只输出技能路由、实现顺序和验证建议。
|
|
170
170
|
```
|
|
171
171
|
|
|
@@ -804,8 +804,8 @@ TDD 顺序示例:
|
|
|
804
804
|
| 后端用例编排 | `yss-application` |
|
|
805
805
|
| 持久化 | `yss-repository`、需要分页/批量/数据源时加 `yss-mybatis` |
|
|
806
806
|
| Web 接口 | `yss-web-controller`、`yss-dto` |
|
|
807
|
-
| 前端页面 | `yss-ui`、`yss-page-module-development`、`api-integration` |
|
|
808
|
-
| OpenAPI client 刷新 | `yss-openapi-governance` 从冻结 YAML 派生 JSON,随后 `api-integration` 运行 Orval;只在 Freeze 后或按实现契约刷新时使用 |
|
|
807
|
+
| 前端页面 | `yss-ui`、`yss-page-module-development`、`yss-api-integration` |
|
|
808
|
+
| OpenAPI client 刷新 | `yss-openapi-governance` 从冻结 YAML 派生 JSON,随后 `yss-api-integration` 运行 Orval;只在 Freeze 后或按实现契约刷新时使用 |
|
|
809
809
|
|
|
810
810
|
阶段门禁:
|
|
811
811
|
|
|
@@ -1072,7 +1072,7 @@ docs/user-guide/
|
|
|
1072
1072
|
使用 yss-router。
|
|
1073
1073
|
输入资产:<Spec 路径>、<交互设计路径>、<OpenAPI Freeze 路径或无 API 影响记录>、<架构设计路径>、<垂直切片路径>。
|
|
1074
1074
|
目标:选择最小 YSS 技能集。
|
|
1075
|
-
请说明每个候选技能需要或不需要的理由,尤其是 yss-domain、yss-repository、yss-mybatis、yss-web-controller、yss-ui、yss-openapi-governance、api-integration。
|
|
1075
|
+
请说明每个候选技能需要或不需要的理由,尤其是 yss-domain、yss-repository、yss-mybatis、yss-web-controller、yss-ui、yss-openapi-governance、yss-api-integration。
|
|
1076
1076
|
边界:不要实现代码,只输出技能路由、实施顺序、测试 seam 和验证建议。
|
|
1077
1077
|
```
|
|
1078
1078
|
|
|
@@ -258,7 +258,7 @@ Competitive Matrix
|
|
|
258
258
|
|
|
259
259
|
| 场景 | 主技能 | 常见补充 |
|
|
260
260
|
|---|---|---|
|
|
261
|
-
| 新建完整 Vue 业务页面 | `yss-ui` | `yss-page-module-development`、`yss-openapi-governance`、`api-integration` |
|
|
261
|
+
| 新建完整 Vue 业务页面 | `yss-ui` | `yss-page-module-development`、`yss-openapi-governance`、`yss-api-integration` |
|
|
262
262
|
| YTable / YTree / YssFormily 页面 | `yss-ui` | `yss-use-table-height`、`yss-use-tree-height`、`yss-formily` |
|
|
263
263
|
| 从零创建后端服务 | `yss-ddd-scaffold-generator` | 后续接 `yss-domain`、`yss-repository`、`yss-web-controller` |
|
|
264
264
|
| 领域建模和状态规则 | `yss-domain` | — |
|
|
@@ -57,6 +57,11 @@ function validateInvocationBoundary(data) {
|
|
|
57
57
|
ensure(routes?.["work-unit.discovery-requirements"]?.skills?.includes("grilling") && routes?.["work-unit.discovery-requirements"]?.skills?.includes("domain-modeling"), "需求分析工作单元缺少 grilling/domain-modeling");
|
|
58
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", "机会调研事实路由不准确");
|
|
59
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
|
+
}
|
|
60
65
|
ensure(routes?.["work-unit.frontend-implementation-verification"]?.skills?.includes("code-review") && routes?.["work-unit.frontend-implementation-verification"]?.applies_when === "ui_impact", "前端还原验证未绑定 UI fidelity 审查轴");
|
|
61
66
|
for (const id of ["work-unit.spec-synthesis", "work-unit.ticket-decomposition", "work-unit.slice-implementation"]) {
|
|
62
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 兼容输入`);
|
|
@@ -70,6 +75,12 @@ function validateInvocationBoundary(data) {
|
|
|
70
75
|
function validateWorkflowExecutionResult(payload, contract, workUnitRoutes) {
|
|
71
76
|
for (const field of contract.required) ensure(Object.hasOwn(payload, field), `Workflow Execution Result 缺少 ${field}`);
|
|
72
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
|
+
}
|
|
73
84
|
for (const field of contract.workflow_reference.required) ensure(typeof payload.workflow_reference?.[field] === "string" && payload.workflow_reference[field].trim(), `workflow_reference.${field} 无效`);
|
|
74
85
|
const workUnit = workUnitRoutes?.[payload.work_unit];
|
|
75
86
|
ensure(workUnit, `未知 Workflow Execution Result work_unit: ${payload.work_unit}`);
|
|
@@ -189,6 +200,16 @@ export function runScenario(name) {
|
|
|
189
200
|
blocking_signals: []
|
|
190
201
|
};
|
|
191
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 时未被拒绝");
|
|
192
213
|
const compatibleResult = structuredClone(validResult);
|
|
193
214
|
compatibleResult.workflow_reference = { source: "mattpocock/skills", skill: "to-spec", invocation_mode: "reference" };
|
|
194
215
|
validateWorkflowExecutionResult(compatibleResult, data.workflow_execution_result, data.work_unit_routes);
|
|
@@ -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
|
+
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { readFileSync } from "node:fs";
|
|
1
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
2
2
|
import path from "node:path";
|
|
3
3
|
import { parseDocument } from "../vendor/yaml.mjs";
|
|
4
4
|
import { PROJECTION_ROOTS, ROOT } from "./skill-supply-chain.mjs";
|
|
@@ -6,9 +6,11 @@ import { PROJECTION_ROOTS, ROOT } from "./skill-supply-chain.mjs";
|
|
|
6
6
|
export const DEFAULT_REGISTRY = path.join(ROOT, "docs/agents/yss-skill-registry.yaml");
|
|
7
7
|
const LOCK_PATH = path.join(ROOT, "skills-lock.json");
|
|
8
8
|
const ROUTER_CONTRACT = path.join(ROOT, ".agents/skills/yss-router/references/router-contract.yaml");
|
|
9
|
+
const LIFECYCLE_CONTRACT = path.join(ROOT, ".agents/skills/yss-product-lifecycle/references/orchestration-contract.yaml");
|
|
9
10
|
const LAYERS = new Set(["core", "specialist", "compatibility", "maintainer-only"]);
|
|
10
11
|
const MATURITIES = new Set(["draft", "verified", "supported", "deprecated"]);
|
|
11
12
|
const ID_PATTERN = /^[a-z0-9][a-z0-9-]*$/;
|
|
13
|
+
const PLATFORM_ALIAS_PATTERN = /^[a-z0-9][a-z0-9-]*(?::[a-z0-9][a-z0-9-]*)?$/;
|
|
12
14
|
|
|
13
15
|
function fail(message) {
|
|
14
16
|
throw new TypeError(message);
|
|
@@ -45,7 +47,7 @@ function requireString(value, field) {
|
|
|
45
47
|
if (typeof value !== "string" || !value.trim()) fail(`${field} 不能为空`);
|
|
46
48
|
}
|
|
47
49
|
|
|
48
|
-
export function validateSkillRegistry(registry, { lock, routerContract, skillSource } = {}) {
|
|
50
|
+
export function validateSkillRegistry(registry, { lock, routerContract, lifecycleContract, skillSource } = {}) {
|
|
49
51
|
if (!registry || typeof registry !== "object" || Array.isArray(registry)) fail("技能路由注册表必须是对象");
|
|
50
52
|
if (registry.schema_version !== 1) fail("schema_version 必须为 1");
|
|
51
53
|
if (registry.registry_id !== "yss.skill-routing") fail("registry_id 必须为 yss.skill-routing");
|
|
@@ -99,10 +101,14 @@ export function validateSkillRegistry(registry, { lock, routerContract, skillSou
|
|
|
99
101
|
if (!MATURITIES.has(skill.maturity)) fail(`${skill.id} 未知 maturity: ${skill.maturity}`);
|
|
100
102
|
if (typeof skill.instance_default_discoverable !== "boolean") fail(`${skill.id} 缺少 instance_default_discoverable`);
|
|
101
103
|
if (skill.layer === "core" && skill.instance_default_discoverable !== true) fail(`${skill.id} 作为 core 必须默认可发现`);
|
|
102
|
-
if (
|
|
104
|
+
if (["specialist", "maintainer-only", "compatibility"].includes(skill.layer) && skill.instance_default_discoverable !== false) {
|
|
103
105
|
fail(`${skill.id} 作为 ${skill.layer} 不得默认可发现`);
|
|
104
106
|
}
|
|
105
|
-
if (skill.maturity === "deprecated")
|
|
107
|
+
if (skill.maturity === "deprecated") {
|
|
108
|
+
requireString(skill.replaced_by, `${skill.id}.replaced_by`);
|
|
109
|
+
requireString(skill.migration_deadline, `${skill.id}.migration_deadline`);
|
|
110
|
+
requireString(skill.cleanup_status, `${skill.id}.cleanup_status`);
|
|
111
|
+
}
|
|
106
112
|
if (skill.replaced_by && !ids.has(skill.replaced_by) && !skills.some((item) => item.id === skill.replaced_by)) {
|
|
107
113
|
// resolved in second pass
|
|
108
114
|
}
|
|
@@ -125,6 +131,7 @@ export function validateSkillRegistry(registry, { lock, routerContract, skillSou
|
|
|
125
131
|
const platform = registry.platform_skills ?? [];
|
|
126
132
|
if (!Array.isArray(platform)) fail("platform_skills 必须是数组");
|
|
127
133
|
const platformIds = new Set();
|
|
134
|
+
const platformAliases = new Map();
|
|
128
135
|
for (const skill of platform) {
|
|
129
136
|
requireString(skill.id, "platform_skills.id");
|
|
130
137
|
requireString(skill.root, `${skill.id}.root`);
|
|
@@ -132,9 +139,27 @@ export function validateSkillRegistry(registry, { lock, routerContract, skillSou
|
|
|
132
139
|
if (typeof skill.instance_default_discoverable !== "boolean" || skill.instance_default_discoverable !== false) {
|
|
133
140
|
fail(`${skill.id} 平台技能不得作为实例默认可发现`);
|
|
134
141
|
}
|
|
142
|
+
if (!Array.isArray(skill.aliases) || skill.aliases.some((alias) => typeof alias !== "string" || !PLATFORM_ALIAS_PATTERN.test(alias))) {
|
|
143
|
+
fail(`${skill.id} aliases 必须是合法 id 数组`);
|
|
144
|
+
}
|
|
135
145
|
if (platformIds.has(`${skill.root}:${skill.id}`)) fail(`重复平台技能: ${skill.root}/${skill.id}`);
|
|
136
146
|
platformIds.add(`${skill.root}:${skill.id}`);
|
|
137
147
|
}
|
|
148
|
+
const external = registry.external_skills ?? [];
|
|
149
|
+
if (!Array.isArray(external)) fail("external_skills 必须是数组");
|
|
150
|
+
const externalIds = new Set();
|
|
151
|
+
for (const skill of external) {
|
|
152
|
+
requireString(skill.id, "external_skills.id");
|
|
153
|
+
requireString(skill.source, `${skill.id}.source`);
|
|
154
|
+
if (externalIds.has(skill.id) || ids.has(skill.id) || aliases.has(skill.id) || platformAliases.has(skill.id)) fail(`external skill 冲突: ${skill.id}`);
|
|
155
|
+
externalIds.add(skill.id);
|
|
156
|
+
}
|
|
157
|
+
for (const skill of platform) {
|
|
158
|
+
for (const alias of skill.aliases) {
|
|
159
|
+
if (ids.has(alias) || aliases.has(alias) || platformAliases.has(alias)) fail(`alias 冲突: ${alias}`);
|
|
160
|
+
platformAliases.set(alias, `${skill.root}:${skill.id}`);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
138
163
|
|
|
139
164
|
if (lock) {
|
|
140
165
|
const shared = Object.keys(lock.skills?.shared ?? {}).sort();
|
|
@@ -179,7 +204,58 @@ export function validateSkillRegistry(registry, { lock, routerContract, skillSou
|
|
|
179
204
|
}
|
|
180
205
|
const closures = Object.keys(routerContract.dependency_closure ?? {});
|
|
181
206
|
for (const name of closures) {
|
|
182
|
-
if (!ids.has(name) && !aliases.has(name)) fail(`Router 闭包引用了未登记技能: ${name}`);
|
|
207
|
+
if (!ids.has(name) && !aliases.has(name) && !externalIds.has(name)) fail(`Router 闭包引用了未登记技能: ${name}`);
|
|
208
|
+
}
|
|
209
|
+
for (const dependencies of Object.values(routerContract.dependency_closure ?? {})) {
|
|
210
|
+
for (const names of Object.values(dependencies ?? {})) {
|
|
211
|
+
for (const name of names ?? []) if (!ids.has(name) && !aliases.has(name) && !externalIds.has(name)) fail(`Router 依赖引用了未登记技能: ${name}`);
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
if (lifecycleContract || existsSync(LIFECYCLE_CONTRACT)) {
|
|
217
|
+
const lifecycle = lifecycleContract ?? yamlFromFile(LIFECYCLE_CONTRACT, "生命周期编排合同");
|
|
218
|
+
const routes = lifecycle.work_unit_routes;
|
|
219
|
+
if (!routes || typeof routes !== "object" || Array.isArray(routes)) fail("生命周期编排合同缺少 work_unit_routes");
|
|
220
|
+
const resolve = (name) => {
|
|
221
|
+
if (ids.has(name)) return name;
|
|
222
|
+
if (aliases.has(name)) return aliases.get(name);
|
|
223
|
+
if (platformAliases.has(name)) return platformAliases.get(name);
|
|
224
|
+
if (externalIds.has(name)) return name;
|
|
225
|
+
if ([...platformIds].some((key) => key.endsWith(`:${name}`))) return name;
|
|
226
|
+
return null;
|
|
227
|
+
};
|
|
228
|
+
for (const [routeId, route] of Object.entries(routes)) {
|
|
229
|
+
if (!route || typeof route !== "object") fail(`${routeId} 生命周期路由必须是对象`);
|
|
230
|
+
requireString(route.primary_skill, `${routeId}.primary_skill`);
|
|
231
|
+
if (!Array.isArray(route.supporting_skills)) fail(`${routeId}.supporting_skills 必须是数组`);
|
|
232
|
+
if (!Array.isArray(route.skills) || route.skills.length === 0) fail(`${routeId}.skills 不能为空`);
|
|
233
|
+
if (!route.applies_when || !route.not_applicable_reason) fail(`${routeId} 缺少 applies_when 或 not_applicable_reason`);
|
|
234
|
+
for (const name of [route.primary_skill, ...route.supporting_skills, ...route.skills]) {
|
|
235
|
+
if (!resolve(name)) fail(`生命周期路由引用了未登记技能: ${routeId} -> ${name}`);
|
|
236
|
+
}
|
|
237
|
+
if (route.frontend_route) {
|
|
238
|
+
requireString(route.frontend_route.primary_skill, `${routeId}.frontend_route.primary_skill`);
|
|
239
|
+
requireString(route.frontend_route.page_orchestration_skill, `${routeId}.frontend_route.page_orchestration_skill`);
|
|
240
|
+
const conditional = route.frontend_route.conditional_skills;
|
|
241
|
+
if (!conditional || typeof conditional !== "object" || Array.isArray(conditional)) fail(`${routeId}.frontend_route.conditional_skills 必须是对象`);
|
|
242
|
+
for (const [impact, names] of Object.entries(conditional)) {
|
|
243
|
+
if (!Array.isArray(names) || names.length === 0) fail(`${routeId}.frontend_route.conditional_skills.${impact} 必须是非空数组`);
|
|
244
|
+
for (const name of names) if (!resolve(name)) fail(`前端条件路由引用了未登记技能: ${routeId}.${impact} -> ${name}`);
|
|
245
|
+
if (route.frontend_route.not_applicable_reasons && typeof route.frontend_route.not_applicable_reasons[impact] !== "string") {
|
|
246
|
+
fail(`${routeId}.frontend_route.not_applicable_reasons.${impact} 必须是字符串`);
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
if (!resolve(route.frontend_route.primary_skill) || !resolve(route.frontend_route.page_orchestration_skill)) {
|
|
250
|
+
fail(`${routeId}.frontend_route 主入口引用了未登记技能`);
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
if (routeId === "work-unit.prototype-design") {
|
|
254
|
+
if (!route.skills.includes("prototype-review") || !route.supporting_skills.includes("prototype-review")) {
|
|
255
|
+
fail("原型工作单元必须包含独立 prototype-review supporting skill");
|
|
256
|
+
}
|
|
257
|
+
if (route.primary_skill === "prototype-review") fail("prototype-review 必须作为独立 supporting skill,不得成为生命周期主技能");
|
|
258
|
+
}
|
|
183
259
|
}
|
|
184
260
|
}
|
|
185
261
|
|
|
@@ -193,6 +269,7 @@ export function validateDefaultSkillRegistry() {
|
|
|
193
269
|
return validateSkillRegistry(registry, {
|
|
194
270
|
lock,
|
|
195
271
|
routerContract,
|
|
272
|
+
lifecycleContract: yamlFromFile(LIFECYCLE_CONTRACT, "生命周期编排合同"),
|
|
196
273
|
skillSource: (id) => readFileSync(path.join(ROOT, ".agents/skills", id, "SKILL.md"), "utf8")
|
|
197
274
|
});
|
|
198
275
|
}
|
|
@@ -49,6 +49,10 @@ export function unlockedProjectionEntries(candidates, allowedNames, isTracked) {
|
|
|
49
49
|
const allowed = new Set(allowedNames);
|
|
50
50
|
return candidates.filter((candidate) => candidate.isDirectory() || candidate.isSymbolicLink()).filter((candidate) => !allowed.has(candidate.name) && isTracked(candidate.name));
|
|
51
51
|
}
|
|
52
|
+
export function unlockedCanonicalEntries(names, allowedNames, hasSkillMd = () => true) {
|
|
53
|
+
const allowed = new Set(allowedNames);
|
|
54
|
+
return names.filter((name) => !allowed.has(name) && !OBSOLETE.has(name) && hasSkillMd(name)).sort();
|
|
55
|
+
}
|
|
52
56
|
export function syncSkills({ check = false } = {}) {
|
|
53
57
|
const lock = parseLock();
|
|
54
58
|
const shared = sharedFromLock(lock);
|
|
@@ -141,7 +145,7 @@ export function updateSkillLock(arguments_ = process.argv.slice(2)) {
|
|
|
141
145
|
const sharedNames = [...new Set([...existing, ...additions])].filter((name) => !removals.has(name) && !OBSOLETE.has(name)).sort();
|
|
142
146
|
const absent = sharedNames.filter((name) => !lstatSafe(path.join(SOURCE_ROOT, name))?.isDirectory());
|
|
143
147
|
if (absent.length) throw new TypeError(`锁文件声明的共享 skills 缺少权威内容: ${absent.join(", ")}`);
|
|
144
|
-
const unlocked = skillNames(SOURCE_ROOT)
|
|
148
|
+
const unlocked = unlockedCanonicalEntries(skillNames(SOURCE_ROOT), sharedNames, (name) => lstatSafe(path.join(SOURCE_ROOT, name, "SKILL.md"))?.isFile());
|
|
145
149
|
if (unlocked.length) throw new TypeError(`发现未登记到 skills-lock.json 的已跟踪共享 skills: ${unlocked.join(", ")}\n确认新增后运行 scripts/update-skill-lock --add=<skill-name>`);
|
|
146
150
|
const targets = [".agents/skills", ...PROJECTION_ROOTS];
|
|
147
151
|
const shared = Object.fromEntries(sharedNames.map((name) => {
|
|
@@ -25,11 +25,13 @@ if (isTemplateSource(root)) {
|
|
|
25
25
|
if (status === "proposed" && !/尚未|未实现|不构成|不能把/.test(body)) failures.push(`${relativePath} 的 proposed ADR 缺少未实施/非当前门禁说明`);
|
|
26
26
|
}
|
|
27
27
|
}
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
28
|
+
if (isTemplateSource(root)) {
|
|
29
|
+
for (const [relativePath, marker] of Object.entries({
|
|
30
|
+
".template-source/adr/0003-machine-readable-lifecycle-registry.md": "状态:部分实施(Phase 1)",
|
|
31
|
+
".template-source/adr/0006-stable-lifecycle-ids-and-generated-structure.md": "状态:部分实施(Phase 1)"
|
|
32
|
+
})) {
|
|
33
|
+
if (!read(relativePath).includes(marker)) failures.push(`${relativePath} 未声明当前实现状态`);
|
|
34
|
+
}
|
|
33
35
|
}
|
|
34
36
|
if (!read("scripts/verify-lifecycle-scenarios").includes("ROUTE_REGISTRY_IDS")) failures.push("生命周期场景未校验稳定 ID 映射");
|
|
35
37
|
if (failures.length > 0) {
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { validateSkillGovernance } from "./lib/skill-governance.mjs";
|
|
3
|
+
|
|
4
|
+
try {
|
|
5
|
+
const result = validateSkillGovernance();
|
|
6
|
+
process.stdout.write(`技能规范冲突扫描通过(${result.legacy_aliases} 个兼容 alias)\n`);
|
|
7
|
+
} catch (error) {
|
|
8
|
+
process.stderr.write(`技能规范冲突扫描失败: ${error.message}\n`);
|
|
9
|
+
process.exitCode = 1;
|
|
10
|
+
}
|
|
@@ -5,7 +5,7 @@ ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
|
|
5
5
|
cd "$ROOT_DIR"
|
|
6
6
|
node -e 'const [major]=process.versions.node.split(".").map(Number); if (major < 22 || major >= 27) { console.error("模板工具需要 Node >=22 <27"); process.exit(1); }'
|
|
7
7
|
|
|
8
|
-
required_files=(yss-project.yaml AGENTS.md CONTEXT.md skills-lock.json docs/agents/yss-skill-registry.yaml docs/process/lifecycle-registry.yaml docs/process/lifecycle-registry-baseline.json docs/process/maintenance-intensity.yaml docs/process/schemas/lifecycle-checkpoint.schema.json docs/process/schemas/frontend-implementation-evidence.schema.json docs/process/templates/lifecycle-checkpoint-template.yaml docs/process/templates/frontend-implementation-plan-template.yaml docs/process/templates/frontend-implementation-verification-template.yaml scripts/repository-mode scripts/implementation-path-policy scripts/repository-scope-policy scripts/sync-skills scripts/update-skill-lock scripts/generate-lifecycle-artifacts scripts/verify-lifecycle-registry scripts/verify-lifecycle-checkpoint scripts/verify-frontend-implementation-evidence scripts/verify-maintenance-checkpoint scripts/verify-maintenance-intensity-scenarios scripts/verify-skill-registry scripts/verify-yss-dto-openapi-profile scripts/verify-yss-dto-openapi-scenarios scripts/export-yss-skills)
|
|
8
|
+
required_files=(yss-project.yaml AGENTS.md CONTEXT.md skills-lock.json docs/agents/yss-skill-registry.yaml docs/process/lifecycle-registry.yaml docs/process/lifecycle-registry-baseline.json docs/process/maintenance-intensity.yaml docs/process/schemas/lifecycle-checkpoint.schema.json docs/process/schemas/frontend-implementation-evidence.schema.json docs/process/templates/lifecycle-checkpoint-template.yaml docs/process/templates/frontend-implementation-plan-template.yaml docs/process/templates/frontend-implementation-verification-template.yaml scripts/repository-mode scripts/implementation-path-policy scripts/repository-scope-policy scripts/sync-skills scripts/update-skill-lock scripts/generate-lifecycle-artifacts scripts/verify-lifecycle-registry scripts/verify-lifecycle-checkpoint scripts/verify-frontend-implementation-evidence scripts/verify-maintenance-checkpoint scripts/verify-maintenance-intensity-scenarios scripts/verify-skill-registry scripts/verify-skill-governance scripts/verify-yss-dto-openapi-profile scripts/verify-yss-dto-openapi-scenarios scripts/export-yss-skills)
|
|
9
9
|
for required in "${required_files[@]}"; do test -f "$required" || { echo "缺少模板必需文件: $required" >&2; exit 1; }; done
|
|
10
10
|
|
|
11
11
|
repository_mode="$(scripts/repository-mode)"
|
|
@@ -19,6 +19,7 @@ fi
|
|
|
19
19
|
scripts/sync-skills --check
|
|
20
20
|
scripts/update-skill-lock --check
|
|
21
21
|
scripts/verify-skill-registry
|
|
22
|
+
scripts/verify-skill-governance
|
|
22
23
|
scripts/verify-yss-dto-openapi-profile
|
|
23
24
|
scripts/verify-yss-dto-openapi-scenarios
|
|
24
25
|
scripts/verify-lifecycle-registry
|
|
@@ -38,7 +39,7 @@ scripts/verify-yss-ui-scenarios
|
|
|
38
39
|
scripts/verify-openapi-yaml-first-scenarios
|
|
39
40
|
scripts/verify-openapi-json-handoff-scenarios
|
|
40
41
|
|
|
41
|
-
for entry in scripts/sync-skills scripts/update-skill-lock scripts/generate-lifecycle-artifacts scripts/verify-lifecycle-registry scripts/verify-lifecycle-checkpoint scripts/verify-frontend-implementation-evidence scripts/verify-maintenance-checkpoint scripts/verify-maintenance-intensity-scenarios scripts/verify-skill-registry scripts/verify-yss-dto-openapi-profile scripts/verify-yss-dto-openapi-scenarios scripts/verify-lifecycle-scenarios scripts/verify-matt-yss-integration-scenarios scripts/verify-prototype-backend-scaffold-scenarios scripts/verify-yss-router-scenarios scripts/verify-openapi-yaml-first-scenarios scripts/verify-openapi-json-handoff-scenarios scripts/verify-repository-scope-scenarios scripts/export-yss-skills; do node --check "$entry"; done
|
|
42
|
+
for entry in scripts/sync-skills scripts/update-skill-lock scripts/generate-lifecycle-artifacts scripts/verify-lifecycle-registry scripts/verify-lifecycle-checkpoint scripts/verify-frontend-implementation-evidence scripts/verify-maintenance-checkpoint scripts/verify-maintenance-intensity-scenarios scripts/verify-skill-registry scripts/verify-skill-governance scripts/verify-yss-dto-openapi-profile scripts/verify-yss-dto-openapi-scenarios scripts/verify-lifecycle-scenarios scripts/verify-matt-yss-integration-scenarios scripts/verify-prototype-backend-scaffold-scenarios scripts/verify-yss-router-scenarios scripts/verify-openapi-yaml-first-scenarios scripts/verify-openapi-json-handoff-scenarios scripts/verify-repository-scope-scenarios scripts/export-yss-skills; do node --check "$entry"; done
|
|
42
43
|
|
|
43
44
|
legacy_runtime="ru""by"
|
|
44
45
|
script_roots=(scripts)
|