create-yss-spec 3.3.8 → 3.4.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.
Files changed (628) hide show
  1. package/README.md +1 -1
  2. package/package.json +1 -1
  3. package/template/.agents/skills/.strategic-design-skills-manifest.json +3 -13
  4. package/template/.agents/skills/yss-ddd-scaffold-generator/SKILL.md +3 -3
  5. package/template/.agents/skills/yss-ddd-scaffold-generator/references/USAGE_EXAMPLES.md +1 -1
  6. package/template/.agents/skills/yss-ddd-scaffold-generator/references/layer-skill-routing.md +18 -0
  7. package/template/.agents/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-parent/SKILL.md +1 -1
  8. package/template/.agents/skills/yss-ddd-scaffold-generator/scripts/first-slice-compatibility.test.mjs +13 -4
  9. package/template/.agents/skills/yss-ddd-scaffold-generator/scripts/generate_scaffold.mjs +9 -8
  10. package/template/.agents/skills/yss-ddd-scaffold-generator/scripts/run_first_slice_verification.mjs +2 -1
  11. package/template/.agents/skills/yss-ddd-scaffold-generator/scripts/run_scaffold_verification.mjs +6 -4
  12. package/template/.agents/skills/yss-ddd-scaffold-generator/scripts/scaffold-generator.test.mjs +108 -12
  13. package/template/.agents/skills/yss-design-system/SKILL.md +19 -19
  14. package/template/.agents/skills/yss-design-system/references/data-quality-theme.md +13 -0
  15. package/template/.agents/skills/yss-design-system/references/design-qa-theme.md +3 -1
  16. package/template/.agents/skills/yss-design-system/references/design-system.md +7 -9
  17. package/template/.agents/skills/yss-formily/SKILL.md +21 -258
  18. package/template/.agents/skills/yss-frontend-scaffold-generator/SKILL.md +17 -13
  19. package/template/.agents/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/.eslintrc.cjs +1 -0
  20. package/template/.agents/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/.npmrc.example +2 -0
  21. package/template/.agents/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/DESIGN.md +264 -0
  22. package/template/.agents/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/README.md +13 -0
  23. package/template/.agents/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/__yss_dotfile__.gitignore +6 -0
  24. package/template/.agents/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/micro-config.json +5 -0
  25. package/template/.agents/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/orval.config.ts +2 -0
  26. package/template/.agents/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/package.json +30 -0
  27. package/template/.agents/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/.env.development +1 -0
  28. package/template/.agents/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/.env.example +5 -0
  29. package/template/.agents/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/.env.production +1 -0
  30. package/template/.agents/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/.env.production.standalone +1 -0
  31. package/template/.agents/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/index.html +2 -0
  32. package/template/.agents/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/package.json +34 -0
  33. package/template/.agents/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/public/favicon.svg +1 -0
  34. package/template/.agents/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/src/App.vue +15 -0
  35. package/template/.agents/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/src/api/mutator.ts +7 -0
  36. package/template/.agents/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/src/components/ThemeScope.vue +11 -0
  37. package/template/.agents/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/src/config/theme.json +41 -0
  38. package/template/.agents/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/src/env.d.ts +1 -0
  39. package/template/.agents/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/src/main.ts +40 -0
  40. package/template/.agents/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/src/router/index.ts +8 -0
  41. package/template/.agents/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/src/store/theme.ts +37 -0
  42. package/template/.agents/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/src/styles/index.less +6 -0
  43. package/template/.agents/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/src/types/microAppBridge.ts +28 -0
  44. package/template/.agents/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/src/utils/microAppRouterBridge.ts +266 -0
  45. package/template/.agents/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/src/views/NotFound.vue +1 -0
  46. package/template/.agents/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/src/views/Welcome.vue +1 -0
  47. package/template/.agents/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/tsconfig.json +23 -0
  48. package/template/.agents/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/vite.config.ts +16 -0
  49. package/template/.agents/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/pnpm-lock.yaml +9026 -0
  50. package/template/.agents/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/pnpm-workspace.yaml +7 -0
  51. package/template/.agents/skills/yss-frontend-scaffold-generator/references/data-quality-baseline.md +17 -0
  52. package/template/.agents/skills/yss-frontend-scaffold-generator/references/data-quality-v1.manifest.json +49 -0
  53. package/template/.agents/skills/yss-frontend-scaffold-generator/scripts/generate_scaffold.mjs +41 -13
  54. package/template/.agents/skills/yss-frontend-scaffold-generator/scripts/refresh_baseline.mjs +29 -0
  55. package/template/.agents/skills/yss-frontend-scaffold-generator/scripts/run_scaffold_verification.mjs +5 -1
  56. package/template/.agents/skills/yss-frontend-scaffold-generator/scripts/scaffold-generator.test.mjs +32 -0
  57. package/template/.agents/skills/yss-hook/SKILL.md +1 -1
  58. package/template/.agents/skills/yss-implementation-contract-compiler/SKILL.md +1 -1
  59. package/template/.agents/skills/yss-implementation-contract-compiler/references/boundaries.md +5 -3
  60. package/template/.agents/skills/yss-implementation-contract-compiler/references/compiler-contract.yaml +13 -5
  61. package/template/.agents/skills/yss-layered-mvc-scaffold-generator/SKILL.md +2 -2
  62. package/template/.agents/skills/yss-layered-mvc-scaffold-generator/agents/openai.yaml +1 -1
  63. package/template/.agents/skills/yss-layered-mvc-scaffold-generator/scripts/generate_scaffold.mjs +12 -8
  64. package/template/.agents/skills/yss-layered-mvc-scaffold-generator/scripts/run_scaffold_verification.mjs +1 -1
  65. package/template/.agents/skills/yss-layered-mvc-scaffold-generator/scripts/scaffold-generator.test.mjs +97 -9
  66. package/template/.agents/skills/yss-mvc-data-analysis-project-initializer/SKILL.md +2 -2
  67. package/template/.agents/skills/yss-mvc-data-analysis-project-initializer/scripts/generate_project.mjs +1 -1
  68. package/template/.agents/skills/yss-openapi-governance/SKILL.md +2 -0
  69. package/template/.agents/skills/yss-product-lifecycle/references/orchestration-contract.yaml +43 -15
  70. package/template/.agents/skills/yss-product-lifecycle/references/orchestration.md +2 -2
  71. package/template/.agents/skills/yss-product-lifecycle/references/state-model.md +1 -1
  72. package/template/.agents/skills/yss-prototype-stage/SKILL.md +12 -8
  73. package/template/.agents/skills/yss-prototype-stage/assets/antd-authoring/package.json +16 -0
  74. package/template/.agents/skills/yss-prototype-stage/assets/antd-authoring/pnpm-lock.yaml +1678 -0
  75. package/template/.agents/skills/yss-prototype-stage/assets/antd-authoring/workbench.jsx +23 -0
  76. package/template/.agents/skills/yss-prototype-stage/assets/native-workbench/app.js +20 -0
  77. package/template/.agents/skills/yss-prototype-stage/assets/native-workbench/index.html +11 -0
  78. package/template/.agents/skills/yss-prototype-stage/assets/native-workbench/styles.css +28 -0
  79. package/template/.agents/skills/yss-prototype-stage/assets/offline-html/app.js +50 -0
  80. package/template/.agents/skills/yss-prototype-stage/assets/offline-html/index.html +38 -0
  81. package/template/.agents/skills/yss-prototype-stage/assets/offline-html/scenarios.js +7 -0
  82. package/template/.agents/skills/yss-prototype-stage/assets/offline-html/styles.css +20 -0
  83. package/template/.agents/skills/yss-prototype-stage/references/antd-component-catalog.json +736 -0
  84. package/template/.agents/skills/yss-prototype-stage/references/antd-integration.md +61 -0
  85. package/template/.agents/skills/yss-prototype-stage/references/html-prototype-practices.md +14 -0
  86. package/template/.agents/skills/yss-prototype-stage/references/product-design-adapter.md +28 -51
  87. package/template/.agents/skills/yss-prototype-stage/references/prototype-profile-routing.md +15 -4
  88. package/template/.agents/skills/yss-prototype-stage/scripts/build-antd-prototype.mjs +71 -0
  89. package/template/.agents/skills/yss-prototype-stage/scripts/collect-antd-reference.mjs +26 -0
  90. package/template/.agents/skills/yss-prototype-stage/scripts/offline-html.mjs +121 -0
  91. package/template/.agents/skills/yss-prototype-stage/scripts/prototype-contract.mjs +52 -143
  92. package/template/.agents/skills/yss-prototype-stage/tests/antd-reference.test.mjs +24 -0
  93. package/template/.agents/skills/yss-prototype-stage/tests/browser-smoke.mjs +77 -0
  94. package/template/.agents/skills/yss-prototype-stage/tests/run-scenarios.mjs +73 -26
  95. package/template/.agents/skills/yss-prototype-stage/tests/workbench-smoke.mjs +57 -0
  96. package/template/.agents/skills/yss-skill-source-index-refresh/references/source-map-config.md +0 -1
  97. package/template/.agents/skills/yss-skill-source-index-refresh/scripts/refresh-yss-skill-index.mjs +0 -1
  98. package/template/.agents/skills/yss-tactical-design/SKILL.md +1 -1
  99. package/template/.agents/skills/yss-ui/SKILL.md +3 -2
  100. package/template/.agents/skills/yss-ui/references/component-routing.md +11 -10
  101. package/template/.agents/skills/yss-ui/references/specialized-components.md +52 -0
  102. package/template/.agents/skills/yss-web-controller/scripts/generate_controller.mjs +4 -3
  103. package/template/.agents/skills/yss-web-controller/scripts/generate_controller.test.mjs +1 -1
  104. package/template/.codex/skills/yss-ddd-scaffold-generator/SKILL.md +3 -3
  105. package/template/.codex/skills/yss-ddd-scaffold-generator/references/USAGE_EXAMPLES.md +1 -1
  106. package/template/.codex/skills/yss-ddd-scaffold-generator/references/layer-skill-routing.md +18 -0
  107. package/template/.codex/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-parent/SKILL.md +1 -1
  108. package/template/.codex/skills/yss-ddd-scaffold-generator/scripts/first-slice-compatibility.test.mjs +13 -4
  109. package/template/.codex/skills/yss-ddd-scaffold-generator/scripts/generate_scaffold.mjs +9 -8
  110. package/template/.codex/skills/yss-ddd-scaffold-generator/scripts/run_first_slice_verification.mjs +2 -1
  111. package/template/.codex/skills/yss-ddd-scaffold-generator/scripts/run_scaffold_verification.mjs +6 -4
  112. package/template/.codex/skills/yss-ddd-scaffold-generator/scripts/scaffold-generator.test.mjs +108 -12
  113. package/template/.codex/skills/yss-design-system/SKILL.md +19 -19
  114. package/template/.codex/skills/yss-design-system/references/data-quality-theme.md +13 -0
  115. package/template/.codex/skills/yss-design-system/references/design-qa-theme.md +3 -1
  116. package/template/.codex/skills/yss-design-system/references/design-system.md +7 -9
  117. package/template/.codex/skills/yss-formily/SKILL.md +21 -258
  118. package/template/.codex/skills/yss-frontend-scaffold-generator/SKILL.md +17 -13
  119. package/template/.codex/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/.eslintrc.cjs +1 -0
  120. package/template/.codex/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/.npmrc.example +2 -0
  121. package/template/.codex/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/DESIGN.md +264 -0
  122. package/template/.codex/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/README.md +13 -0
  123. package/template/.codex/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/__yss_dotfile__.gitignore +6 -0
  124. package/template/.codex/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/micro-config.json +5 -0
  125. package/template/.codex/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/orval.config.ts +2 -0
  126. package/template/.codex/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/package.json +30 -0
  127. package/template/.codex/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/.env.development +1 -0
  128. package/template/.codex/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/.env.example +5 -0
  129. package/template/.codex/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/.env.production +1 -0
  130. package/template/.codex/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/.env.production.standalone +1 -0
  131. package/template/.codex/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/index.html +2 -0
  132. package/template/.codex/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/package.json +34 -0
  133. package/template/.codex/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/public/favicon.svg +1 -0
  134. package/template/.codex/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/src/App.vue +15 -0
  135. package/template/.codex/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/src/api/mutator.ts +7 -0
  136. package/template/.codex/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/src/components/ThemeScope.vue +11 -0
  137. package/template/.codex/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/src/config/theme.json +41 -0
  138. package/template/.codex/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/src/env.d.ts +1 -0
  139. package/template/.codex/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/src/main.ts +40 -0
  140. package/template/.codex/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/src/router/index.ts +8 -0
  141. package/template/.codex/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/src/store/theme.ts +37 -0
  142. package/template/.codex/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/src/styles/index.less +6 -0
  143. package/template/.codex/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/src/types/microAppBridge.ts +28 -0
  144. package/template/.codex/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/src/utils/microAppRouterBridge.ts +266 -0
  145. package/template/.codex/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/src/views/NotFound.vue +1 -0
  146. package/template/.codex/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/src/views/Welcome.vue +1 -0
  147. package/template/.codex/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/tsconfig.json +23 -0
  148. package/template/.codex/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/vite.config.ts +16 -0
  149. package/template/.codex/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/pnpm-lock.yaml +9026 -0
  150. package/template/.codex/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/pnpm-workspace.yaml +7 -0
  151. package/template/.codex/skills/yss-frontend-scaffold-generator/references/data-quality-baseline.md +17 -0
  152. package/template/.codex/skills/yss-frontend-scaffold-generator/references/data-quality-v1.manifest.json +49 -0
  153. package/template/.codex/skills/yss-frontend-scaffold-generator/scripts/generate_scaffold.mjs +41 -13
  154. package/template/.codex/skills/yss-frontend-scaffold-generator/scripts/refresh_baseline.mjs +29 -0
  155. package/template/.codex/skills/yss-frontend-scaffold-generator/scripts/run_scaffold_verification.mjs +5 -1
  156. package/template/.codex/skills/yss-frontend-scaffold-generator/scripts/scaffold-generator.test.mjs +32 -0
  157. package/template/.codex/skills/yss-hook/SKILL.md +1 -1
  158. package/template/.codex/skills/yss-implementation-contract-compiler/SKILL.md +1 -1
  159. package/template/.codex/skills/yss-implementation-contract-compiler/references/boundaries.md +5 -3
  160. package/template/.codex/skills/yss-implementation-contract-compiler/references/compiler-contract.yaml +13 -5
  161. package/template/.codex/skills/yss-layered-mvc-scaffold-generator/SKILL.md +2 -2
  162. package/template/.codex/skills/yss-layered-mvc-scaffold-generator/agents/openai.yaml +1 -1
  163. package/template/.codex/skills/yss-layered-mvc-scaffold-generator/scripts/generate_scaffold.mjs +12 -8
  164. package/template/.codex/skills/yss-layered-mvc-scaffold-generator/scripts/run_scaffold_verification.mjs +1 -1
  165. package/template/.codex/skills/yss-layered-mvc-scaffold-generator/scripts/scaffold-generator.test.mjs +97 -9
  166. package/template/.codex/skills/yss-mvc-data-analysis-project-initializer/SKILL.md +2 -2
  167. package/template/.codex/skills/yss-mvc-data-analysis-project-initializer/scripts/generate_project.mjs +1 -1
  168. package/template/.codex/skills/yss-openapi-governance/SKILL.md +2 -0
  169. package/template/.codex/skills/yss-product-lifecycle/references/orchestration-contract.yaml +43 -15
  170. package/template/.codex/skills/yss-product-lifecycle/references/orchestration.md +2 -2
  171. package/template/.codex/skills/yss-product-lifecycle/references/state-model.md +1 -1
  172. package/template/.codex/skills/yss-prototype-stage/SKILL.md +12 -8
  173. package/template/.codex/skills/yss-prototype-stage/assets/antd-authoring/package.json +16 -0
  174. package/template/.codex/skills/yss-prototype-stage/assets/antd-authoring/pnpm-lock.yaml +1678 -0
  175. package/template/.codex/skills/yss-prototype-stage/assets/antd-authoring/workbench.jsx +23 -0
  176. package/template/.codex/skills/yss-prototype-stage/assets/native-workbench/app.js +20 -0
  177. package/template/.codex/skills/yss-prototype-stage/assets/native-workbench/index.html +11 -0
  178. package/template/.codex/skills/yss-prototype-stage/assets/native-workbench/styles.css +28 -0
  179. package/template/.codex/skills/yss-prototype-stage/assets/offline-html/app.js +50 -0
  180. package/template/.codex/skills/yss-prototype-stage/assets/offline-html/index.html +38 -0
  181. package/template/.codex/skills/yss-prototype-stage/assets/offline-html/scenarios.js +7 -0
  182. package/template/.codex/skills/yss-prototype-stage/assets/offline-html/styles.css +20 -0
  183. package/template/.codex/skills/yss-prototype-stage/references/antd-component-catalog.json +736 -0
  184. package/template/.codex/skills/yss-prototype-stage/references/antd-integration.md +61 -0
  185. package/template/.codex/skills/yss-prototype-stage/references/html-prototype-practices.md +14 -0
  186. package/template/.codex/skills/yss-prototype-stage/references/product-design-adapter.md +28 -51
  187. package/template/.codex/skills/yss-prototype-stage/references/prototype-profile-routing.md +15 -4
  188. package/template/.codex/skills/yss-prototype-stage/scripts/build-antd-prototype.mjs +71 -0
  189. package/template/.codex/skills/yss-prototype-stage/scripts/collect-antd-reference.mjs +26 -0
  190. package/template/.codex/skills/yss-prototype-stage/scripts/offline-html.mjs +121 -0
  191. package/template/.codex/skills/yss-prototype-stage/scripts/prototype-contract.mjs +52 -143
  192. package/template/.codex/skills/yss-prototype-stage/tests/antd-reference.test.mjs +24 -0
  193. package/template/.codex/skills/yss-prototype-stage/tests/browser-smoke.mjs +77 -0
  194. package/template/.codex/skills/yss-prototype-stage/tests/run-scenarios.mjs +73 -26
  195. package/template/.codex/skills/yss-prototype-stage/tests/workbench-smoke.mjs +57 -0
  196. package/template/.codex/skills/yss-skill-source-index-refresh/references/source-map-config.md +0 -1
  197. package/template/.codex/skills/yss-skill-source-index-refresh/scripts/refresh-yss-skill-index.mjs +0 -1
  198. package/template/.codex/skills/yss-tactical-design/SKILL.md +1 -1
  199. package/template/.codex/skills/yss-ui/SKILL.md +3 -2
  200. package/template/.codex/skills/yss-ui/references/component-routing.md +11 -10
  201. package/template/.codex/skills/yss-ui/references/specialized-components.md +52 -0
  202. package/template/.codex/skills/yss-web-controller/scripts/generate_controller.mjs +4 -3
  203. package/template/.codex/skills/yss-web-controller/scripts/generate_controller.test.mjs +1 -1
  204. package/template/.cursor/skills/yss-ddd-scaffold-generator/SKILL.md +3 -3
  205. package/template/.cursor/skills/yss-ddd-scaffold-generator/references/USAGE_EXAMPLES.md +1 -1
  206. package/template/.cursor/skills/yss-ddd-scaffold-generator/references/layer-skill-routing.md +18 -0
  207. package/template/.cursor/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-parent/SKILL.md +1 -1
  208. package/template/.cursor/skills/yss-ddd-scaffold-generator/scripts/first-slice-compatibility.test.mjs +13 -4
  209. package/template/.cursor/skills/yss-ddd-scaffold-generator/scripts/generate_scaffold.mjs +9 -8
  210. package/template/.cursor/skills/yss-ddd-scaffold-generator/scripts/run_first_slice_verification.mjs +2 -1
  211. package/template/.cursor/skills/yss-ddd-scaffold-generator/scripts/run_scaffold_verification.mjs +6 -4
  212. package/template/.cursor/skills/yss-ddd-scaffold-generator/scripts/scaffold-generator.test.mjs +108 -12
  213. package/template/.cursor/skills/yss-design-system/SKILL.md +19 -19
  214. package/template/.cursor/skills/yss-design-system/references/data-quality-theme.md +13 -0
  215. package/template/.cursor/skills/yss-design-system/references/design-qa-theme.md +3 -1
  216. package/template/.cursor/skills/yss-design-system/references/design-system.md +7 -9
  217. package/template/.cursor/skills/yss-formily/SKILL.md +21 -258
  218. package/template/.cursor/skills/yss-frontend-scaffold-generator/SKILL.md +17 -13
  219. package/template/.cursor/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/.eslintrc.cjs +1 -0
  220. package/template/.cursor/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/.npmrc.example +2 -0
  221. package/template/.cursor/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/DESIGN.md +264 -0
  222. package/template/.cursor/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/README.md +13 -0
  223. package/template/.cursor/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/__yss_dotfile__.gitignore +6 -0
  224. package/template/.cursor/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/micro-config.json +5 -0
  225. package/template/.cursor/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/orval.config.ts +2 -0
  226. package/template/.cursor/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/package.json +30 -0
  227. package/template/.cursor/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/.env.development +1 -0
  228. package/template/.cursor/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/.env.example +5 -0
  229. package/template/.cursor/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/.env.production +1 -0
  230. package/template/.cursor/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/.env.production.standalone +1 -0
  231. package/template/.cursor/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/index.html +2 -0
  232. package/template/.cursor/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/package.json +34 -0
  233. package/template/.cursor/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/public/favicon.svg +1 -0
  234. package/template/.cursor/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/src/App.vue +15 -0
  235. package/template/.cursor/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/src/api/mutator.ts +7 -0
  236. package/template/.cursor/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/src/components/ThemeScope.vue +11 -0
  237. package/template/.cursor/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/src/config/theme.json +41 -0
  238. package/template/.cursor/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/src/env.d.ts +1 -0
  239. package/template/.cursor/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/src/main.ts +40 -0
  240. package/template/.cursor/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/src/router/index.ts +8 -0
  241. package/template/.cursor/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/src/store/theme.ts +37 -0
  242. package/template/.cursor/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/src/styles/index.less +6 -0
  243. package/template/.cursor/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/src/types/microAppBridge.ts +28 -0
  244. package/template/.cursor/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/src/utils/microAppRouterBridge.ts +266 -0
  245. package/template/.cursor/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/src/views/NotFound.vue +1 -0
  246. package/template/.cursor/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/src/views/Welcome.vue +1 -0
  247. package/template/.cursor/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/tsconfig.json +23 -0
  248. package/template/.cursor/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/vite.config.ts +16 -0
  249. package/template/.cursor/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/pnpm-lock.yaml +9026 -0
  250. package/template/.cursor/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/pnpm-workspace.yaml +7 -0
  251. package/template/.cursor/skills/yss-frontend-scaffold-generator/references/data-quality-baseline.md +17 -0
  252. package/template/.cursor/skills/yss-frontend-scaffold-generator/references/data-quality-v1.manifest.json +49 -0
  253. package/template/.cursor/skills/yss-frontend-scaffold-generator/scripts/generate_scaffold.mjs +41 -13
  254. package/template/.cursor/skills/yss-frontend-scaffold-generator/scripts/refresh_baseline.mjs +29 -0
  255. package/template/.cursor/skills/yss-frontend-scaffold-generator/scripts/run_scaffold_verification.mjs +5 -1
  256. package/template/.cursor/skills/yss-frontend-scaffold-generator/scripts/scaffold-generator.test.mjs +32 -0
  257. package/template/.cursor/skills/yss-hook/SKILL.md +1 -1
  258. package/template/.cursor/skills/yss-implementation-contract-compiler/SKILL.md +1 -1
  259. package/template/.cursor/skills/yss-implementation-contract-compiler/references/boundaries.md +5 -3
  260. package/template/.cursor/skills/yss-implementation-contract-compiler/references/compiler-contract.yaml +13 -5
  261. package/template/.cursor/skills/yss-layered-mvc-scaffold-generator/SKILL.md +2 -2
  262. package/template/.cursor/skills/yss-layered-mvc-scaffold-generator/agents/openai.yaml +1 -1
  263. package/template/.cursor/skills/yss-layered-mvc-scaffold-generator/scripts/generate_scaffold.mjs +12 -8
  264. package/template/.cursor/skills/yss-layered-mvc-scaffold-generator/scripts/run_scaffold_verification.mjs +1 -1
  265. package/template/.cursor/skills/yss-layered-mvc-scaffold-generator/scripts/scaffold-generator.test.mjs +97 -9
  266. package/template/.cursor/skills/yss-mvc-data-analysis-project-initializer/SKILL.md +2 -2
  267. package/template/.cursor/skills/yss-mvc-data-analysis-project-initializer/scripts/generate_project.mjs +1 -1
  268. package/template/.cursor/skills/yss-openapi-governance/SKILL.md +2 -0
  269. package/template/.cursor/skills/yss-product-lifecycle/references/orchestration-contract.yaml +43 -15
  270. package/template/.cursor/skills/yss-product-lifecycle/references/orchestration.md +2 -2
  271. package/template/.cursor/skills/yss-product-lifecycle/references/state-model.md +1 -1
  272. package/template/.cursor/skills/yss-prototype-stage/SKILL.md +12 -8
  273. package/template/.cursor/skills/yss-prototype-stage/assets/antd-authoring/package.json +16 -0
  274. package/template/.cursor/skills/yss-prototype-stage/assets/antd-authoring/pnpm-lock.yaml +1678 -0
  275. package/template/.cursor/skills/yss-prototype-stage/assets/antd-authoring/workbench.jsx +23 -0
  276. package/template/.cursor/skills/yss-prototype-stage/assets/native-workbench/app.js +20 -0
  277. package/template/.cursor/skills/yss-prototype-stage/assets/native-workbench/index.html +11 -0
  278. package/template/.cursor/skills/yss-prototype-stage/assets/native-workbench/styles.css +28 -0
  279. package/template/.cursor/skills/yss-prototype-stage/assets/offline-html/app.js +50 -0
  280. package/template/.cursor/skills/yss-prototype-stage/assets/offline-html/index.html +38 -0
  281. package/template/.cursor/skills/yss-prototype-stage/assets/offline-html/scenarios.js +7 -0
  282. package/template/.cursor/skills/yss-prototype-stage/assets/offline-html/styles.css +20 -0
  283. package/template/.cursor/skills/yss-prototype-stage/references/antd-component-catalog.json +736 -0
  284. package/template/.cursor/skills/yss-prototype-stage/references/antd-integration.md +61 -0
  285. package/template/.cursor/skills/yss-prototype-stage/references/html-prototype-practices.md +14 -0
  286. package/template/.cursor/skills/yss-prototype-stage/references/product-design-adapter.md +28 -51
  287. package/template/.cursor/skills/yss-prototype-stage/references/prototype-profile-routing.md +15 -4
  288. package/template/.cursor/skills/yss-prototype-stage/scripts/build-antd-prototype.mjs +71 -0
  289. package/template/.cursor/skills/yss-prototype-stage/scripts/collect-antd-reference.mjs +26 -0
  290. package/template/.cursor/skills/yss-prototype-stage/scripts/offline-html.mjs +121 -0
  291. package/template/.cursor/skills/yss-prototype-stage/scripts/prototype-contract.mjs +52 -143
  292. package/template/.cursor/skills/yss-prototype-stage/tests/antd-reference.test.mjs +24 -0
  293. package/template/.cursor/skills/yss-prototype-stage/tests/browser-smoke.mjs +77 -0
  294. package/template/.cursor/skills/yss-prototype-stage/tests/run-scenarios.mjs +73 -26
  295. package/template/.cursor/skills/yss-prototype-stage/tests/workbench-smoke.mjs +57 -0
  296. package/template/.cursor/skills/yss-skill-source-index-refresh/references/source-map-config.md +0 -1
  297. package/template/.cursor/skills/yss-skill-source-index-refresh/scripts/refresh-yss-skill-index.mjs +0 -1
  298. package/template/.cursor/skills/yss-tactical-design/SKILL.md +1 -1
  299. package/template/.cursor/skills/yss-ui/SKILL.md +3 -2
  300. package/template/.cursor/skills/yss-ui/references/component-routing.md +11 -10
  301. package/template/.cursor/skills/yss-ui/references/specialized-components.md +52 -0
  302. package/template/.cursor/skills/yss-web-controller/scripts/generate_controller.mjs +4 -3
  303. package/template/.cursor/skills/yss-web-controller/scripts/generate_controller.test.mjs +1 -1
  304. package/template/.pi/skills/yss-ddd-scaffold-generator/SKILL.md +3 -3
  305. package/template/.pi/skills/yss-ddd-scaffold-generator/references/USAGE_EXAMPLES.md +1 -1
  306. package/template/.pi/skills/yss-ddd-scaffold-generator/references/layer-skill-routing.md +18 -0
  307. package/template/.pi/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-parent/SKILL.md +1 -1
  308. package/template/.pi/skills/yss-ddd-scaffold-generator/scripts/first-slice-compatibility.test.mjs +13 -4
  309. package/template/.pi/skills/yss-ddd-scaffold-generator/scripts/generate_scaffold.mjs +9 -8
  310. package/template/.pi/skills/yss-ddd-scaffold-generator/scripts/run_first_slice_verification.mjs +2 -1
  311. package/template/.pi/skills/yss-ddd-scaffold-generator/scripts/run_scaffold_verification.mjs +6 -4
  312. package/template/.pi/skills/yss-ddd-scaffold-generator/scripts/scaffold-generator.test.mjs +108 -12
  313. package/template/.pi/skills/yss-design-system/SKILL.md +19 -19
  314. package/template/.pi/skills/yss-design-system/references/data-quality-theme.md +13 -0
  315. package/template/.pi/skills/yss-design-system/references/design-qa-theme.md +3 -1
  316. package/template/.pi/skills/yss-design-system/references/design-system.md +7 -9
  317. package/template/.pi/skills/yss-formily/SKILL.md +21 -258
  318. package/template/.pi/skills/yss-frontend-scaffold-generator/SKILL.md +17 -13
  319. package/template/.pi/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/.eslintrc.cjs +1 -0
  320. package/template/.pi/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/.npmrc.example +2 -0
  321. package/template/.pi/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/DESIGN.md +264 -0
  322. package/template/.pi/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/README.md +13 -0
  323. package/template/.pi/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/__yss_dotfile__.gitignore +6 -0
  324. package/template/.pi/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/micro-config.json +5 -0
  325. package/template/.pi/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/orval.config.ts +2 -0
  326. package/template/.pi/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/package.json +30 -0
  327. package/template/.pi/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/.env.development +1 -0
  328. package/template/.pi/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/.env.example +5 -0
  329. package/template/.pi/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/.env.production +1 -0
  330. package/template/.pi/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/.env.production.standalone +1 -0
  331. package/template/.pi/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/index.html +2 -0
  332. package/template/.pi/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/package.json +34 -0
  333. package/template/.pi/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/public/favicon.svg +1 -0
  334. package/template/.pi/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/src/App.vue +15 -0
  335. package/template/.pi/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/src/api/mutator.ts +7 -0
  336. package/template/.pi/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/src/components/ThemeScope.vue +11 -0
  337. package/template/.pi/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/src/config/theme.json +41 -0
  338. package/template/.pi/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/src/env.d.ts +1 -0
  339. package/template/.pi/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/src/main.ts +40 -0
  340. package/template/.pi/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/src/router/index.ts +8 -0
  341. package/template/.pi/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/src/store/theme.ts +37 -0
  342. package/template/.pi/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/src/styles/index.less +6 -0
  343. package/template/.pi/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/src/types/microAppBridge.ts +28 -0
  344. package/template/.pi/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/src/utils/microAppRouterBridge.ts +266 -0
  345. package/template/.pi/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/src/views/NotFound.vue +1 -0
  346. package/template/.pi/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/src/views/Welcome.vue +1 -0
  347. package/template/.pi/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/tsconfig.json +23 -0
  348. package/template/.pi/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/vite.config.ts +16 -0
  349. package/template/.pi/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/pnpm-lock.yaml +9026 -0
  350. package/template/.pi/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/pnpm-workspace.yaml +7 -0
  351. package/template/.pi/skills/yss-frontend-scaffold-generator/references/data-quality-baseline.md +17 -0
  352. package/template/.pi/skills/yss-frontend-scaffold-generator/references/data-quality-v1.manifest.json +49 -0
  353. package/template/.pi/skills/yss-frontend-scaffold-generator/scripts/generate_scaffold.mjs +41 -13
  354. package/template/.pi/skills/yss-frontend-scaffold-generator/scripts/refresh_baseline.mjs +29 -0
  355. package/template/.pi/skills/yss-frontend-scaffold-generator/scripts/run_scaffold_verification.mjs +5 -1
  356. package/template/.pi/skills/yss-frontend-scaffold-generator/scripts/scaffold-generator.test.mjs +32 -0
  357. package/template/.pi/skills/yss-hook/SKILL.md +1 -1
  358. package/template/.pi/skills/yss-implementation-contract-compiler/SKILL.md +1 -1
  359. package/template/.pi/skills/yss-implementation-contract-compiler/references/boundaries.md +5 -3
  360. package/template/.pi/skills/yss-implementation-contract-compiler/references/compiler-contract.yaml +13 -5
  361. package/template/.pi/skills/yss-layered-mvc-scaffold-generator/SKILL.md +2 -2
  362. package/template/.pi/skills/yss-layered-mvc-scaffold-generator/agents/openai.yaml +1 -1
  363. package/template/.pi/skills/yss-layered-mvc-scaffold-generator/scripts/generate_scaffold.mjs +12 -8
  364. package/template/.pi/skills/yss-layered-mvc-scaffold-generator/scripts/run_scaffold_verification.mjs +1 -1
  365. package/template/.pi/skills/yss-layered-mvc-scaffold-generator/scripts/scaffold-generator.test.mjs +97 -9
  366. package/template/.pi/skills/yss-mvc-data-analysis-project-initializer/SKILL.md +2 -2
  367. package/template/.pi/skills/yss-mvc-data-analysis-project-initializer/scripts/generate_project.mjs +1 -1
  368. package/template/.pi/skills/yss-openapi-governance/SKILL.md +2 -0
  369. package/template/.pi/skills/yss-product-lifecycle/references/orchestration-contract.yaml +43 -15
  370. package/template/.pi/skills/yss-product-lifecycle/references/orchestration.md +2 -2
  371. package/template/.pi/skills/yss-product-lifecycle/references/state-model.md +1 -1
  372. package/template/.pi/skills/yss-prototype-stage/SKILL.md +12 -8
  373. package/template/.pi/skills/yss-prototype-stage/assets/antd-authoring/package.json +16 -0
  374. package/template/.pi/skills/yss-prototype-stage/assets/antd-authoring/pnpm-lock.yaml +1678 -0
  375. package/template/.pi/skills/yss-prototype-stage/assets/antd-authoring/workbench.jsx +23 -0
  376. package/template/.pi/skills/yss-prototype-stage/assets/native-workbench/app.js +20 -0
  377. package/template/.pi/skills/yss-prototype-stage/assets/native-workbench/index.html +11 -0
  378. package/template/.pi/skills/yss-prototype-stage/assets/native-workbench/styles.css +28 -0
  379. package/template/.pi/skills/yss-prototype-stage/assets/offline-html/app.js +50 -0
  380. package/template/.pi/skills/yss-prototype-stage/assets/offline-html/index.html +38 -0
  381. package/template/.pi/skills/yss-prototype-stage/assets/offline-html/scenarios.js +7 -0
  382. package/template/.pi/skills/yss-prototype-stage/assets/offline-html/styles.css +20 -0
  383. package/template/.pi/skills/yss-prototype-stage/references/antd-component-catalog.json +736 -0
  384. package/template/.pi/skills/yss-prototype-stage/references/antd-integration.md +61 -0
  385. package/template/.pi/skills/yss-prototype-stage/references/html-prototype-practices.md +14 -0
  386. package/template/.pi/skills/yss-prototype-stage/references/product-design-adapter.md +28 -51
  387. package/template/.pi/skills/yss-prototype-stage/references/prototype-profile-routing.md +15 -4
  388. package/template/.pi/skills/yss-prototype-stage/scripts/build-antd-prototype.mjs +71 -0
  389. package/template/.pi/skills/yss-prototype-stage/scripts/collect-antd-reference.mjs +26 -0
  390. package/template/.pi/skills/yss-prototype-stage/scripts/offline-html.mjs +121 -0
  391. package/template/.pi/skills/yss-prototype-stage/scripts/prototype-contract.mjs +52 -143
  392. package/template/.pi/skills/yss-prototype-stage/tests/antd-reference.test.mjs +24 -0
  393. package/template/.pi/skills/yss-prototype-stage/tests/browser-smoke.mjs +77 -0
  394. package/template/.pi/skills/yss-prototype-stage/tests/run-scenarios.mjs +73 -26
  395. package/template/.pi/skills/yss-prototype-stage/tests/workbench-smoke.mjs +57 -0
  396. package/template/.pi/skills/yss-skill-source-index-refresh/references/source-map-config.md +0 -1
  397. package/template/.pi/skills/yss-skill-source-index-refresh/scripts/refresh-yss-skill-index.mjs +0 -1
  398. package/template/.pi/skills/yss-tactical-design/SKILL.md +1 -1
  399. package/template/.pi/skills/yss-ui/SKILL.md +3 -2
  400. package/template/.pi/skills/yss-ui/references/component-routing.md +11 -10
  401. package/template/.pi/skills/yss-ui/references/specialized-components.md +52 -0
  402. package/template/.pi/skills/yss-web-controller/scripts/generate_controller.mjs +4 -3
  403. package/template/.pi/skills/yss-web-controller/scripts/generate_controller.test.mjs +1 -1
  404. package/template/CONTEXT.md +1 -0
  405. package/template/DESIGN.md +31 -14
  406. package/template/__yss_dotfile__.gitignore +4 -0
  407. package/template/docs/agents/digital-human-roles.yaml +4 -4
  408. package/template/docs/agents/skill-migrations.md +15 -2
  409. package/template/docs/agents/yss-skill-registry.yaml +6 -40
  410. package/template/docs/design/README.md +4 -4
  411. package/template/docs/design/design-system-sync.yaml +2 -1
  412. package/template/docs/design/design.md +23 -31
  413. package/template/docs/design/preview-dark.html +3 -3
  414. package/template/docs/design/preview.css +1 -1
  415. package/template/docs/design/preview.html +2 -2
  416. package/template/docs/design/templates/interaction-spec-template.md +2 -2
  417. package/template/docs/design/templates/prototype-evidence-template.yaml +18 -22
  418. package/template/docs/design/templates/prototype-review-checklist.md +3 -1
  419. package/template/docs/design/templates/state-matrix-template.md +1 -1
  420. package/template/docs/design/templates/visual-baseline-template.yaml +3 -2
  421. package/template/docs/design/tokens/.design-md-projection.json +7 -7
  422. package/template/docs/design/tokens/theme.json +16 -10
  423. package/template/docs/design/tokens/tokens.compact.json +521 -237
  424. package/template/docs/design/tokens/tokens.dark.json +527 -240
  425. package/template/docs/design/tokens/tokens.default.json +513 -235
  426. package/template/docs/design/tokens/variables.css +67 -65
  427. package/template/docs/design/tokens/variables.dark.css +41 -41
  428. package/template/docs/process/delivery-preflight.md +1 -1
  429. package/template/docs/process/frontend-backend-delivery.md +2 -1
  430. package/template/docs/process/lifecycle-registry-baseline.json +1 -1
  431. package/template/docs/process/lifecycle-registry.yaml +5 -5
  432. package/template/docs/process/schemas/api-contract-decision.schema.json +74 -0
  433. package/template/docs/process/schemas/data-architecture-decision.schema.json +34 -0
  434. package/template/docs/process/schemas/implementation-repository-preparation-result.schema.json +80 -24
  435. package/template/docs/process/schemas/project-scaffold-contract.schema.json +85 -11
  436. package/template/docs/process/schemas/strategic-design-handoff.schema.json +296 -107
  437. package/template/docs/process/schemas/strategic-handoff-delivery-verification.schema.json +19 -0
  438. package/template/docs/process/schemas/strategic-handoff-delivery.schema.json +84 -0
  439. package/template/docs/process/schemas/strategic-handoff-import-receipt-v3.schema.json +42 -0
  440. package/template/docs/process/strategic-handoff-package.md +26 -9
  441. package/template/docs/user-guide//350/256/276/345/244/207/345/200/237/347/224/250/350/264/257/347/251/277/346/241/210/344/276/213.md +1 -1
  442. package/template/scripts/audit-legacy-backend-scaffold +29 -0
  443. package/template/scripts/lib/api-contract-decision.mjs +49 -0
  444. package/template/scripts/lib/api-contract-decision.test.mjs +69 -0
  445. package/template/scripts/lib/backend-scaffold-prerequisites.mjs +123 -0
  446. package/template/scripts/lib/legacy-backend-scaffold-audit.mjs +87 -0
  447. package/template/scripts/lib/legacy-backend-scaffold-audit.test.mjs +64 -0
  448. package/template/scripts/lib/lifecycle-transition.mjs +153 -5
  449. package/template/scripts/lib/openapi-draft-validation.mjs +111 -0
  450. package/template/scripts/lib/skill-registry.mjs +17 -3
  451. package/template/scripts/lib/skill-supply-chain.mjs +12 -1
  452. package/template/scripts/lib/strategic-feedback.mjs +2 -2
  453. package/template/scripts/lib/strategic-handoff-consumption.mjs +2 -2
  454. package/template/scripts/lib/strategic-handoff.mjs +77 -3
  455. package/template/scripts/strategic-handoff +6 -4
  456. package/template/scripts/verify-openapi-draft-validation-record +10 -129
  457. package/template/scripts/verify-strategic-context-import +12 -14
  458. package/template/skills-lock.json +22 -77
  459. package/template/yss-public-skills.json +0 -6
  460. package/template.snapshot.json +8 -4
  461. package/template/.agents/skills/yss-antd-design/SKILL.md +0 -35
  462. package/template/.agents/skills/yss-antd-design/references/boundaries.md +0 -30
  463. package/template/.agents/skills/yss-antd-design/references/cli-matrix.md +0 -38
  464. package/template/.agents/skills/yss-antd-design/references/evidence.md +0 -35
  465. package/template/.agents/skills/yss-antd-design/scripts/validate-frontmatter.mjs +0 -46
  466. package/template/.agents/skills/yss-antd-design/scripts/validate-frontmatter.test.mjs +0 -27
  467. package/template/.agents/skills/yss-antdv-next-design/SKILL.md +0 -48
  468. package/template/.agents/skills/yss-antdv-next-design/references/boundaries.md +0 -25
  469. package/template/.agents/skills/yss-antdv-next-design/references/cli-matrix.md +0 -34
  470. package/template/.agents/skills/yss-antdv-next-design/references/fact-pack.md +0 -38
  471. package/template/.agents/skills/yss-antdv-next-design/scripts/collect-antdv-next-facts.mjs +0 -213
  472. package/template/.agents/skills/yss-antdv-next-design/scripts/validate-fact-pack.mjs +0 -168
  473. package/template/.agents/skills/yss-antdv-next-design/tests/run-scenarios.mjs +0 -139
  474. package/template/.agents/skills/yss-components/SKILL.md +0 -386
  475. package/template/.agents/skills/yss-components/agents/openai.yaml +0 -5
  476. package/template/.agents/skills/yss-components/references/frontend-docs.md +0 -9
  477. package/template/.agents/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-adapter/SKILL.md +0 -31
  478. package/template/.agents/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-adapter/agents/openai.yaml +0 -5
  479. package/template/.agents/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-application/SKILL.md +0 -8
  480. package/template/.agents/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-application/agents/openai.yaml +0 -5
  481. package/template/.agents/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-domain/SKILL.md +0 -8
  482. package/template/.agents/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-domain/agents/openai.yaml +0 -5
  483. package/template/.agents/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-infrastructure/SKILL.md +0 -8
  484. package/template/.agents/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-infrastructure/agents/openai.yaml +0 -5
  485. package/template/.agents/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-web/SKILL.md +0 -8
  486. package/template/.agents/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-web/agents/openai.yaml +0 -5
  487. package/template/.agents/skills/yss-mvc-scaffold-generator/SKILL.md +0 -8
  488. package/template/.agents/skills/yss-mvc-scaffold-generator/agents/openai.yaml +0 -4
  489. package/template/.agents/skills/yss-mvc-scaffold-generator/assets/logback-spring.xml.template +0 -50
  490. package/template/.agents/skills/yss-mvc-scaffold-generator/assets/smart-doc.json.template +0 -42
  491. package/template/.agents/skills/yss-mvc-scaffold-generator/references/architecture.md +0 -28
  492. package/template/.agents/skills/yss-mvc-scaffold-generator/references/history/generate_project.mjs.txt +0 -137
  493. package/template/.agents/skills/yss-mvc-scaffold-generator/references/history/generate_project.test.mjs.txt +0 -341
  494. package/template/.agents/skills/yss-mvc-scaffold-generator/references/history/skill.md +0 -87
  495. package/template/.agents/skills/yss-mvc-scaffold-generator/scripts/generate_project.mjs +0 -3
  496. package/template/.agents/skills/yss-mvc-scaffold-generator/scripts/generate_project.test.mjs +0 -9
  497. package/template/.agents/skills/yss-mvc-scaffold-generator/scripts/lib/envelope.mjs +0 -74
  498. package/template/.agents/skills/yss-mvc-scaffold-generator/scripts/lib/envelope.test.mjs +0 -36
  499. package/template/.agents/skills/yss-mvc-scaffold-generator/scripts/lib/runtime.mjs +0 -114
  500. package/template/.agents/skills/yss-mvc-scaffold-generator/scripts/lib/storage.mjs +0 -90
  501. package/template/.agents/skills/yss-mvc-scaffold-generator/scripts/lib/templates.mjs +0 -54
  502. package/template/.agents/skills/yss-mvc-scaffold-generator/scripts/verify_project.mjs +0 -103
  503. package/template/.codex/skills/yss-antd-design/SKILL.md +0 -35
  504. package/template/.codex/skills/yss-antd-design/references/boundaries.md +0 -30
  505. package/template/.codex/skills/yss-antd-design/references/cli-matrix.md +0 -38
  506. package/template/.codex/skills/yss-antd-design/references/evidence.md +0 -35
  507. package/template/.codex/skills/yss-antd-design/scripts/validate-frontmatter.mjs +0 -46
  508. package/template/.codex/skills/yss-antd-design/scripts/validate-frontmatter.test.mjs +0 -27
  509. package/template/.codex/skills/yss-antdv-next-design/SKILL.md +0 -48
  510. package/template/.codex/skills/yss-antdv-next-design/references/boundaries.md +0 -25
  511. package/template/.codex/skills/yss-antdv-next-design/references/cli-matrix.md +0 -34
  512. package/template/.codex/skills/yss-antdv-next-design/references/fact-pack.md +0 -38
  513. package/template/.codex/skills/yss-antdv-next-design/scripts/collect-antdv-next-facts.mjs +0 -213
  514. package/template/.codex/skills/yss-antdv-next-design/scripts/validate-fact-pack.mjs +0 -168
  515. package/template/.codex/skills/yss-antdv-next-design/tests/run-scenarios.mjs +0 -139
  516. package/template/.codex/skills/yss-components/SKILL.md +0 -386
  517. package/template/.codex/skills/yss-components/agents/openai.yaml +0 -5
  518. package/template/.codex/skills/yss-components/references/frontend-docs.md +0 -9
  519. package/template/.codex/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-adapter/SKILL.md +0 -31
  520. package/template/.codex/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-adapter/agents/openai.yaml +0 -5
  521. package/template/.codex/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-application/SKILL.md +0 -8
  522. package/template/.codex/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-application/agents/openai.yaml +0 -5
  523. package/template/.codex/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-domain/SKILL.md +0 -8
  524. package/template/.codex/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-domain/agents/openai.yaml +0 -5
  525. package/template/.codex/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-infrastructure/SKILL.md +0 -8
  526. package/template/.codex/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-infrastructure/agents/openai.yaml +0 -5
  527. package/template/.codex/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-web/SKILL.md +0 -8
  528. package/template/.codex/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-web/agents/openai.yaml +0 -5
  529. package/template/.codex/skills/yss-mvc-scaffold-generator/SKILL.md +0 -8
  530. package/template/.codex/skills/yss-mvc-scaffold-generator/agents/openai.yaml +0 -4
  531. package/template/.codex/skills/yss-mvc-scaffold-generator/assets/logback-spring.xml.template +0 -50
  532. package/template/.codex/skills/yss-mvc-scaffold-generator/assets/smart-doc.json.template +0 -42
  533. package/template/.codex/skills/yss-mvc-scaffold-generator/references/architecture.md +0 -28
  534. package/template/.codex/skills/yss-mvc-scaffold-generator/references/history/generate_project.mjs.txt +0 -137
  535. package/template/.codex/skills/yss-mvc-scaffold-generator/references/history/generate_project.test.mjs.txt +0 -341
  536. package/template/.codex/skills/yss-mvc-scaffold-generator/references/history/skill.md +0 -87
  537. package/template/.codex/skills/yss-mvc-scaffold-generator/scripts/generate_project.mjs +0 -3
  538. package/template/.codex/skills/yss-mvc-scaffold-generator/scripts/generate_project.test.mjs +0 -9
  539. package/template/.codex/skills/yss-mvc-scaffold-generator/scripts/lib/envelope.mjs +0 -74
  540. package/template/.codex/skills/yss-mvc-scaffold-generator/scripts/lib/envelope.test.mjs +0 -36
  541. package/template/.codex/skills/yss-mvc-scaffold-generator/scripts/lib/runtime.mjs +0 -114
  542. package/template/.codex/skills/yss-mvc-scaffold-generator/scripts/lib/storage.mjs +0 -90
  543. package/template/.codex/skills/yss-mvc-scaffold-generator/scripts/lib/templates.mjs +0 -54
  544. package/template/.codex/skills/yss-mvc-scaffold-generator/scripts/verify_project.mjs +0 -103
  545. package/template/.cursor/skills/yss-antd-design/SKILL.md +0 -35
  546. package/template/.cursor/skills/yss-antd-design/references/boundaries.md +0 -30
  547. package/template/.cursor/skills/yss-antd-design/references/cli-matrix.md +0 -38
  548. package/template/.cursor/skills/yss-antd-design/references/evidence.md +0 -35
  549. package/template/.cursor/skills/yss-antd-design/scripts/validate-frontmatter.mjs +0 -46
  550. package/template/.cursor/skills/yss-antd-design/scripts/validate-frontmatter.test.mjs +0 -27
  551. package/template/.cursor/skills/yss-antdv-next-design/SKILL.md +0 -48
  552. package/template/.cursor/skills/yss-antdv-next-design/references/boundaries.md +0 -25
  553. package/template/.cursor/skills/yss-antdv-next-design/references/cli-matrix.md +0 -34
  554. package/template/.cursor/skills/yss-antdv-next-design/references/fact-pack.md +0 -38
  555. package/template/.cursor/skills/yss-antdv-next-design/scripts/collect-antdv-next-facts.mjs +0 -213
  556. package/template/.cursor/skills/yss-antdv-next-design/scripts/validate-fact-pack.mjs +0 -168
  557. package/template/.cursor/skills/yss-antdv-next-design/tests/run-scenarios.mjs +0 -139
  558. package/template/.cursor/skills/yss-components/SKILL.md +0 -386
  559. package/template/.cursor/skills/yss-components/agents/openai.yaml +0 -5
  560. package/template/.cursor/skills/yss-components/references/frontend-docs.md +0 -9
  561. package/template/.cursor/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-adapter/SKILL.md +0 -31
  562. package/template/.cursor/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-adapter/agents/openai.yaml +0 -5
  563. package/template/.cursor/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-application/SKILL.md +0 -8
  564. package/template/.cursor/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-application/agents/openai.yaml +0 -5
  565. package/template/.cursor/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-domain/SKILL.md +0 -8
  566. package/template/.cursor/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-domain/agents/openai.yaml +0 -5
  567. package/template/.cursor/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-infrastructure/SKILL.md +0 -8
  568. package/template/.cursor/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-infrastructure/agents/openai.yaml +0 -5
  569. package/template/.cursor/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-web/SKILL.md +0 -8
  570. package/template/.cursor/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-web/agents/openai.yaml +0 -5
  571. package/template/.cursor/skills/yss-mvc-scaffold-generator/SKILL.md +0 -8
  572. package/template/.cursor/skills/yss-mvc-scaffold-generator/agents/openai.yaml +0 -4
  573. package/template/.cursor/skills/yss-mvc-scaffold-generator/assets/logback-spring.xml.template +0 -50
  574. package/template/.cursor/skills/yss-mvc-scaffold-generator/assets/smart-doc.json.template +0 -42
  575. package/template/.cursor/skills/yss-mvc-scaffold-generator/references/architecture.md +0 -28
  576. package/template/.cursor/skills/yss-mvc-scaffold-generator/references/history/generate_project.mjs.txt +0 -137
  577. package/template/.cursor/skills/yss-mvc-scaffold-generator/references/history/generate_project.test.mjs.txt +0 -341
  578. package/template/.cursor/skills/yss-mvc-scaffold-generator/references/history/skill.md +0 -87
  579. package/template/.cursor/skills/yss-mvc-scaffold-generator/scripts/generate_project.mjs +0 -3
  580. package/template/.cursor/skills/yss-mvc-scaffold-generator/scripts/generate_project.test.mjs +0 -9
  581. package/template/.cursor/skills/yss-mvc-scaffold-generator/scripts/lib/envelope.mjs +0 -74
  582. package/template/.cursor/skills/yss-mvc-scaffold-generator/scripts/lib/envelope.test.mjs +0 -36
  583. package/template/.cursor/skills/yss-mvc-scaffold-generator/scripts/lib/runtime.mjs +0 -114
  584. package/template/.cursor/skills/yss-mvc-scaffold-generator/scripts/lib/storage.mjs +0 -90
  585. package/template/.cursor/skills/yss-mvc-scaffold-generator/scripts/lib/templates.mjs +0 -54
  586. package/template/.cursor/skills/yss-mvc-scaffold-generator/scripts/verify_project.mjs +0 -103
  587. package/template/.pi/skills/yss-antd-design/SKILL.md +0 -35
  588. package/template/.pi/skills/yss-antd-design/references/boundaries.md +0 -30
  589. package/template/.pi/skills/yss-antd-design/references/cli-matrix.md +0 -38
  590. package/template/.pi/skills/yss-antd-design/references/evidence.md +0 -35
  591. package/template/.pi/skills/yss-antd-design/scripts/validate-frontmatter.mjs +0 -46
  592. package/template/.pi/skills/yss-antd-design/scripts/validate-frontmatter.test.mjs +0 -27
  593. package/template/.pi/skills/yss-antdv-next-design/SKILL.md +0 -48
  594. package/template/.pi/skills/yss-antdv-next-design/references/boundaries.md +0 -25
  595. package/template/.pi/skills/yss-antdv-next-design/references/cli-matrix.md +0 -34
  596. package/template/.pi/skills/yss-antdv-next-design/references/fact-pack.md +0 -38
  597. package/template/.pi/skills/yss-antdv-next-design/scripts/collect-antdv-next-facts.mjs +0 -213
  598. package/template/.pi/skills/yss-antdv-next-design/scripts/validate-fact-pack.mjs +0 -168
  599. package/template/.pi/skills/yss-antdv-next-design/tests/run-scenarios.mjs +0 -139
  600. package/template/.pi/skills/yss-components/SKILL.md +0 -386
  601. package/template/.pi/skills/yss-components/agents/openai.yaml +0 -5
  602. package/template/.pi/skills/yss-components/references/frontend-docs.md +0 -9
  603. package/template/.pi/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-adapter/SKILL.md +0 -31
  604. package/template/.pi/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-adapter/agents/openai.yaml +0 -5
  605. package/template/.pi/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-application/SKILL.md +0 -8
  606. package/template/.pi/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-application/agents/openai.yaml +0 -5
  607. package/template/.pi/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-domain/SKILL.md +0 -8
  608. package/template/.pi/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-domain/agents/openai.yaml +0 -5
  609. package/template/.pi/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-infrastructure/SKILL.md +0 -8
  610. package/template/.pi/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-infrastructure/agents/openai.yaml +0 -5
  611. package/template/.pi/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-web/SKILL.md +0 -8
  612. package/template/.pi/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-web/agents/openai.yaml +0 -5
  613. package/template/.pi/skills/yss-mvc-scaffold-generator/SKILL.md +0 -8
  614. package/template/.pi/skills/yss-mvc-scaffold-generator/agents/openai.yaml +0 -4
  615. package/template/.pi/skills/yss-mvc-scaffold-generator/assets/logback-spring.xml.template +0 -50
  616. package/template/.pi/skills/yss-mvc-scaffold-generator/assets/smart-doc.json.template +0 -42
  617. package/template/.pi/skills/yss-mvc-scaffold-generator/references/architecture.md +0 -28
  618. package/template/.pi/skills/yss-mvc-scaffold-generator/references/history/generate_project.mjs.txt +0 -137
  619. package/template/.pi/skills/yss-mvc-scaffold-generator/references/history/generate_project.test.mjs.txt +0 -341
  620. package/template/.pi/skills/yss-mvc-scaffold-generator/references/history/skill.md +0 -87
  621. package/template/.pi/skills/yss-mvc-scaffold-generator/scripts/generate_project.mjs +0 -3
  622. package/template/.pi/skills/yss-mvc-scaffold-generator/scripts/generate_project.test.mjs +0 -9
  623. package/template/.pi/skills/yss-mvc-scaffold-generator/scripts/lib/envelope.mjs +0 -74
  624. package/template/.pi/skills/yss-mvc-scaffold-generator/scripts/lib/envelope.test.mjs +0 -36
  625. package/template/.pi/skills/yss-mvc-scaffold-generator/scripts/lib/runtime.mjs +0 -114
  626. package/template/.pi/skills/yss-mvc-scaffold-generator/scripts/lib/storage.mjs +0 -90
  627. package/template/.pi/skills/yss-mvc-scaffold-generator/scripts/lib/templates.mjs +0 -54
  628. package/template/.pi/skills/yss-mvc-scaffold-generator/scripts/verify_project.mjs +0 -103
@@ -0,0 +1,64 @@
1
+ import assert from "node:assert/strict";
2
+ import { createHash } from "node:crypto";
3
+ import { mkdtemp, mkdir, rm, writeFile } from "node:fs/promises";
4
+ import os from "node:os";
5
+ import path from "node:path";
6
+ import test from "node:test";
7
+ import { auditLegacyBackendScaffold } from "./legacy-backend-scaffold-audit.mjs";
8
+
9
+ const rawDigest = (value) => createHash("sha256").update(value).digest("hex");
10
+
11
+ async function fixture(t) {
12
+ const root = await mkdtemp(path.join(os.tmpdir(), "legacy-scaffold-audit-"));
13
+ t.after(() => rm(root, { recursive: true, force: true }));
14
+ const generated = "package com.yss.demo;\n";
15
+ const source = "demo-service-server/src/main/java/com/yss/demo/package-info.java";
16
+ await mkdir(path.join(root, path.dirname(source)), { recursive: true });
17
+ await writeFile(path.join(root, source), generated);
18
+ const manifest = {
19
+ schema_version: 3,
20
+ kind: "backend-scaffold",
21
+ completion_level: "empty-scaffold-verified",
22
+ ownership: { generated_files: [{ path: source, owner: "generator", sha256: rawDigest(generated) }] },
23
+ };
24
+ await mkdir(path.join(root, ".yss"));
25
+ await writeFile(path.join(root, ".yss/scaffold-generation.json"), `${JSON.stringify(manifest, null, 2)}\n`);
26
+ return { root, source };
27
+ }
28
+
29
+ test("未修改的历史 v3 机械骨架可进入恢复对账但不会自动批准", async (t) => {
30
+ const data = await fixture(t);
31
+ const result = await auditLegacyBackendScaffold(data.root);
32
+ assert.equal(result.status, "reconcilable");
33
+ assert.equal(result.ownership_state, "unchanged-mechanical-scaffold");
34
+ assert.equal(result.premature_implementation, false);
35
+ assert.deepEqual(result.generated_file_drift, []);
36
+ });
37
+
38
+ test("额外业务代码保留并标记 premature-implementation-detected", async (t) => {
39
+ const data = await fixture(t);
40
+ const controller = "demo-service-server/src/main/java/com/yss/demo/controller/DemoController.java";
41
+ await mkdir(path.join(data.root, path.dirname(controller)), { recursive: true });
42
+ await writeFile(path.join(data.root, controller), "class DemoController {}\n");
43
+ const result = await auditLegacyBackendScaffold(data.root);
44
+ assert.equal(result.status, "blocked");
45
+ assert.equal(result.ownership_state, "premature-implementation-detected");
46
+ assert.equal(result.premature_implementation, true);
47
+ assert.deepEqual(result.business_files, [controller]);
48
+ });
49
+
50
+ test("历史生成文件摘要漂移时保持 blocked", async (t) => {
51
+ const data = await fixture(t);
52
+ await writeFile(path.join(data.root, data.source), "changed\n");
53
+ const result = await auditLegacyBackendScaffold(data.root);
54
+ assert.equal(result.status, "blocked");
55
+ assert.equal(result.ownership_state, "generated-file-drift");
56
+ assert.equal(result.generated_file_drift[0].path, data.source);
57
+ });
58
+
59
+ test("审计器拒绝将 v4 当作历史恢复输入", async (t) => {
60
+ const data = await fixture(t);
61
+ const manifestFile = path.join(data.root, ".yss/scaffold-generation.json");
62
+ await writeFile(manifestFile, JSON.stringify({ schema_version: 4, ownership: { generated_files: [] } }));
63
+ await assert.rejects(() => auditLegacyBackendScaffold(data.root), /历史 v3/);
64
+ });
@@ -1,8 +1,13 @@
1
+ import { createHash } from "node:crypto";
1
2
  import { existsSync, readFileSync } from "node:fs";
2
3
  import { parseDocument } from "../vendor/yaml.mjs";
3
4
  import { assertWorkUnitUserDecision, assertImplementationDecision } from "./user-decision.mjs";
4
5
  import { enforceFrontendDelivery } from "./frontend-delivery-boundary.mjs";
5
6
  import { validatePlanSpecEntry } from "./plan-spec-entry.mjs";
7
+ import path from "node:path";
8
+ import { validateApiContractDecision } from "./api-contract-decision.mjs";
9
+ import { loadApprovalRecord, validateApprovalRecord } from "./approval-record.mjs";
10
+ import { ROOT } from "./lifecycle-registry.mjs";
6
11
 
7
12
  const IMPLEMENTATION_WORK_UNIT = "work-unit.slice-implementation";
8
13
  const TICKET_DECOMPOSITION_WORK_UNIT = "work-unit.ticket-decomposition";
@@ -28,8 +33,8 @@ const NEXT_ROUTES = deepFreeze({
28
33
  "work-unit.plan-requirements": ["work-unit.domain-strategy-design", "work-unit.stage-decision", "work-unit.spec-synthesis"],
29
34
  "work-unit.domain-strategy-design": ["work-unit.stage-decision", "work-unit.spec-synthesis"],
30
35
  "work-unit.stage-decision": ["work-unit.spec-synthesis"],
31
- "work-unit.spec-synthesis": ["work-unit.prototype-design", "work-unit.technical-analysis", REPOSITORY_PREPARATION_WORK_UNIT],
32
- "work-unit.prototype-design": ["work-unit.technical-analysis", REPOSITORY_PREPARATION_WORK_UNIT],
36
+ "work-unit.spec-synthesis": ["work-unit.prototype-design", "work-unit.technical-analysis"],
37
+ "work-unit.prototype-design": ["work-unit.technical-analysis"],
33
38
  "work-unit.technical-analysis": [REPOSITORY_PREPARATION_WORK_UNIT],
34
39
  [REPOSITORY_PREPARATION_WORK_UNIT]: [TICKET_DECOMPOSITION_WORK_UNIT],
35
40
  [TICKET_DECOMPOSITION_WORK_UNIT]: [IMPLEMENTATION_WORK_UNIT],
@@ -68,6 +73,10 @@ const BLOCKING_SIGNALS = Object.freeze({
68
73
  scaffoldVerificationFailed: "scaffold-verification-failed",
69
74
  frontendTemplateUnavailable: "frontend-template-unavailable",
70
75
  implementationRepositoriesStale: "implementation-repositories-stale",
76
+ technicalAnalysisRequired: "technical-analysis-required",
77
+ backendDesignPrerequisitesMissing: "backend-design-prerequisites-missing",
78
+ legacyScaffoldReconciliationRequired: "legacy-scaffold-reconciliation-required",
79
+ prematureImplementationDetected: "premature-implementation-detected",
71
80
  });
72
81
 
73
82
  const allowedResult = (evidenceRefs = []) => ({
@@ -106,6 +115,118 @@ function readDecompositionResult(ref, read) {
106
115
  }
107
116
  }
108
117
 
118
+ function artifactBindingReady(binding, exists) {
119
+ return hasText(binding?.ref) && /^v[1-9][0-9]*$/.test(binding?.version ?? "") && /^sha256:[a-f0-9]{64}$/.test(binding?.digest ?? "") && isReadable(binding.ref, exists);
120
+ }
121
+
122
+ function approvalHasBinding(approval, expected) {
123
+ return Array.isArray(approval?.artifact_bindings) && approval.artifact_bindings.some((binding) =>
124
+ binding?.id === expected.id && binding.version === expected.version && binding.digest === expected.digest);
125
+ }
126
+
127
+ function loadBoundArtifact(root, binding, idField, versionField) {
128
+ const file = path.isAbsolute(binding.ref) ? binding.ref : path.resolve(root, binding.ref);
129
+ const bytes = readFileSync(file);
130
+ if (`sha256:${createHash("sha256").update(bytes).digest("hex")}` !== binding.digest) throw new TypeError(`${binding.ref} 原始字节摘要漂移`);
131
+ const document = parseDocument(bytes.toString("utf8"), { maxAliasCount: 0, uniqueKeys: true });
132
+ if (document.errors.length) throw new TypeError(`${binding.ref} 无法解析`);
133
+ const value = document.toJS({ maxAliasCount: 0 });
134
+ if (!value || typeof value !== "object" || value.status !== "approved" || value[versionField] !== binding.version || !hasText(value[idField])) throw new TypeError(`${binding.ref} 不是当前批准资产`);
135
+ return { value, expected: { id: value[idField], version: value[versionField], digest: binding.digest } };
136
+ }
137
+
138
+ function samePackageBinding(actual, expected, includeImpact = false) {
139
+ return actual?.ref === expected.ref && actual.version === expected.version && actual.digest === expected.digest
140
+ && (!includeImpact || actual.impact === expected.impact);
141
+ }
142
+
143
+ function approvalPackageReady(approval, prerequisites, technical, data, api, root, projectId) {
144
+ const file = path.isAbsolute(approval.subject_ref) ? approval.subject_ref : path.resolve(root, approval.subject_ref);
145
+ const document = parseDocument(readFileSync(file, "utf8"), { maxAliasCount: 0, uniqueKeys: true });
146
+ if (document.errors.length) return false;
147
+ const value = document.toJS({ maxAliasCount: 0 });
148
+ if (value?.schema_version !== 1 || value?.kind !== "engineering-contract-package" || value?.project_id !== projectId) return false;
149
+ if (!samePackageBinding(value.technical_design, { ...prerequisites.technical_design, version: technical.value.version })) return false;
150
+ if (!samePackageBinding(value.data_architecture_decision, { ...prerequisites.data_architecture_decision, version: data.value.decision_version, impact: data.value.impact }, true)) return false;
151
+ if (!samePackageBinding(value.api_contract_decision, { ...prerequisites.api_contract_decision, version: api.decision.decision_version, impact: api.decision.impact }, true)) return false;
152
+ if (api.decision.impact === "required") return samePackageBinding(value.frozen_openapi, api.decision.openapi) && value.frozen_openapi.id === api.decision.openapi.id;
153
+ return !Object.hasOwn(value, "frozen_openapi");
154
+ }
155
+
156
+ function backendDesignPrerequisitesReady(prerequisites, exists, root, projectId) {
157
+ const structurallyReady = artifactBindingReady(prerequisites?.technical_design, exists)
158
+ && artifactBindingReady(prerequisites?.data_architecture_decision, exists)
159
+ && ["required", "not-applicable"].includes(prerequisites?.data_architecture_decision?.impact)
160
+ && artifactBindingReady(prerequisites?.api_contract_decision, exists)
161
+ && ["required", "not-applicable"].includes(prerequisites?.api_contract_decision?.impact)
162
+ && isReadable(prerequisites?.engineering_contract_approval_ref, exists);
163
+ if (!structurallyReady) return false;
164
+ try {
165
+ const technical = loadBoundArtifact(root, prerequisites.technical_design, "technical_design_id", "version");
166
+ const data = loadBoundArtifact(root, prerequisites.data_architecture_decision, "decision_id", "decision_version");
167
+ const api = validateApiContractDecision(prerequisites.api_contract_decision, { root });
168
+ const approvalFile = path.isAbsolute(prerequisites.engineering_contract_approval_ref)
169
+ ? prerequisites.engineering_contract_approval_ref
170
+ : path.resolve(root, prerequisites.engineering_contract_approval_ref);
171
+ const approval = loadApprovalRecord(approvalFile);
172
+ validateApprovalRecord(approval, { requireApproved: true, root });
173
+ if (approval.gate_id !== "gate.engineering-contract-approved" || !approval.approval_scope?.includes(projectId)) return false;
174
+ if (!approvalHasBinding(approval, technical.expected) || !approvalHasBinding(approval, data.expected)) return false;
175
+ if (!approvalHasBinding(approval, { id: api.decision.decision_id, version: api.decision.decision_version, digest: prerequisites.api_contract_decision.digest })) return false;
176
+ if (api.decision.impact === "required" && !approvalHasBinding(approval, api.decision.openapi)) return false;
177
+ return approvalPackageReady(approval, prerequisites, technical, data, api, root, projectId);
178
+ } catch {
179
+ return false;
180
+ }
181
+ }
182
+
183
+ function sameBackendDesignPrerequisites(expected, actual) {
184
+ return ["technical_design", "data_architecture_decision", "api_contract_decision"].every((key) =>
185
+ expected?.[key]?.ref === actual?.[key]?.ref
186
+ && expected?.[key]?.version === actual?.[key]?.version
187
+ && expected?.[key]?.digest === actual?.[key]?.digest)
188
+ && expected?.engineering_contract_approval_ref === actual?.engineering_contract_approval_ref;
189
+ }
190
+
191
+ function validateTechnicalAnalysisCompletion(state, { exists = existsSync, read = (ref) => readFileSync(ref, "utf8"), root = ROOT } = {}) {
192
+ const result = state?.technical_analysis_result;
193
+ const resultRef = state?.technical_analysis_result_ref;
194
+ const signals = [];
195
+ const missing = [];
196
+ const persisted = readDecompositionResult(resultRef, read);
197
+ if (!result || result.result_schema !== "workflow-execution-result-v1" || result.work_unit !== "work-unit.technical-analysis" || result.result !== "completed" || result.current_version !== true) {
198
+ signals.push(BLOCKING_SIGNALS.technicalAnalysisRequired);
199
+ missing.push("completed current work-unit.technical-analysis result");
200
+ }
201
+ if (!isReadable(resultRef, exists) || !persisted || persisted.result_schema !== "workflow-execution-result-v1" || persisted.work_unit !== "work-unit.technical-analysis" || persisted.result !== "completed" || persisted.current_version !== true) {
202
+ signals.push(BLOCKING_SIGNALS.technicalAnalysisRequired);
203
+ missing.push("readable persisted technical_analysis_result_ref");
204
+ }
205
+ if (result?.context_reconciliation?.status !== "reconciled" || !isReadable(result?.context_reconciliation?.ref, exists)) {
206
+ signals.push(BLOCKING_SIGNALS.technicalAnalysisRequired);
207
+ missing.push("reconciled readable technical analysis context");
208
+ }
209
+ const evidenceRefs = Array.isArray(result?.evidence_refs) ? result.evidence_refs : [];
210
+ if (!evidenceRefs.includes(resultRef) || evidenceRefs.some((ref) => !isReadable(ref, exists))) {
211
+ signals.push(BLOCKING_SIGNALS.technicalAnalysisRequired);
212
+ missing.push("readable technical analysis evidence including its persisted result");
213
+ }
214
+ try {
215
+ const api = validateApiContractDecision(result?.api_contract_decision, { root: path.resolve(root) });
216
+ if (!artifactBindingReady(result.api_contract_decision, exists)
217
+ || !evidenceRefs.includes(result.api_contract_decision.ref)
218
+ || !persisted?.api_contract_decision
219
+ || !sameBackendDesignPrerequisites({ api_contract_decision: result.api_contract_decision }, { api_contract_decision: persisted.api_contract_decision })) {
220
+ throw new TypeError("技术分析执行结果未一致绑定当前 API Contract Decision");
221
+ }
222
+ if (api.decision.current_version !== true || api.decision.status !== "approved") throw new TypeError("API Contract Decision 非当前批准版本");
223
+ } catch (error) {
224
+ signals.push(BLOCKING_SIGNALS.technicalAnalysisRequired);
225
+ missing.push(error.message);
226
+ }
227
+ return signals.length ? blockedResult(signals, missing, evidenceRefs) : allowedResult(evidenceRefs);
228
+ }
229
+
109
230
  function validateTicketPath(ref) {
110
231
  if (!hasText(ref)) return false;
111
232
  return /^docs\/\.scratch\/[^/]+\/issues\/[^/]+\.md$/.test(ref);
@@ -132,6 +253,9 @@ export function validateNextRoute(currentWorkUnit, nextRoute, decisionState, opt
132
253
  }
133
254
  const routes = NEXT_ROUTES[currentWorkUnit];
134
255
  if (!routes) return blockedResult([BLOCKING_SIGNALS.invalidRoute], ["known_current_work_unit"]);
256
+ if (nextRoute === REPOSITORY_PREPARATION_WORK_UNIT && currentWorkUnit !== "work-unit.technical-analysis") {
257
+ return blockedResult([BLOCKING_SIGNALS.technicalAnalysisRequired], ["work-unit.technical-analysis predecessor"]);
258
+ }
135
259
  if (nextRoute === null && routes.length === 0) {
136
260
  if (decisionState) return validateDecisionBoundary(currentWorkUnit, decisionState, options);
137
261
  return allowedResult();
@@ -143,6 +267,10 @@ export function validateNextRoute(currentWorkUnit, nextRoute, decisionState, opt
143
267
  }
144
268
  return blockedResult(signals, ["allowed_next_route"]);
145
269
  }
270
+ if (nextRoute === REPOSITORY_PREPARATION_WORK_UNIT) {
271
+ const analysis = validateTechnicalAnalysisCompletion(decisionState, options);
272
+ if (analysis.result === "blocked") return analysis;
273
+ }
146
274
  if (nextRoute === 'work-unit.spec-synthesis' || currentWorkUnit === 'work-unit.spec-synthesis') {
147
275
  const entry = validatePlanSpecEntry(decisionState, options);
148
276
  if (entry.result === 'blocked' || nextRoute === 'work-unit.spec-synthesis') return entry;
@@ -159,14 +287,14 @@ export function validateNextRoute(currentWorkUnit, nextRoute, decisionState, opt
159
287
  * delivery role must resolve to an onboarded existing repository or a freshly
160
288
  * generated and verified scaffold. Unaffected roles need an explicit reason.
161
289
  */
162
- export function validateImplementationRepositoriesReady(state, { exists = existsSync } = {}) {
290
+ export function validateImplementationRepositoriesReady(state, { exists = existsSync, read = (ref) => readFileSync(ref, "utf8"), root = ROOT } = {}) {
163
291
  const preparation = state?.implementation_repository_preparation;
164
292
  const impacts = state?.delivery_impacts;
165
293
  const signals = [];
166
294
  const missing = [];
167
295
  const evidenceRefs = Array.isArray(preparation?.evidence_refs) ? preparation.evidence_refs : [];
168
296
 
169
- if (!preparation || preparation.result !== "completed" || !Array.isArray(preparation.projects)) {
297
+ if (!preparation || preparation.schema_version !== 2 || preparation.kind !== "implementation-repository-preparation-result" || preparation.result !== "completed" || !Array.isArray(preparation.projects)) {
170
298
  return blockedResult([BLOCKING_SIGNALS.repositoryDecisionRequired], ["completed implementation_repository_preparation with projects"]);
171
299
  }
172
300
  if (preparation.current_version !== true || state?.implementation_repositories_stale === true) {
@@ -206,6 +334,10 @@ export function validateImplementationRepositoriesReady(state, { exists = exists
206
334
  signals.push(BLOCKING_SIGNALS.repositoryLocationRequired);
207
335
  missing.push(`${project.project_id} repository_ref, project_root and repository_scope`);
208
336
  }
337
+ if (role === "backend" && !backendDesignPrerequisitesReady(project.design_prerequisites, exists, path.resolve(root), project.project_id)) {
338
+ signals.push(BLOCKING_SIGNALS.backendDesignPrerequisitesMissing);
339
+ missing.push(`${project.project_id} readable Technical Design, Data Architecture Decision, API Contract Decision and atomic engineering approval bindings`);
340
+ }
209
341
  if (project.status === "existing-and-onboarded") {
210
342
  if (project.onboarding_result?.status !== "completed" || !isReadable(project.onboarding_result?.ref, exists)) {
211
343
  signals.push(BLOCKING_SIGNALS.repositoryOnboardingIncomplete);
@@ -225,6 +357,22 @@ export function validateImplementationRepositoriesReady(state, { exists = exists
225
357
  signals.push(BLOCKING_SIGNALS.scaffoldGenerationIncomplete);
226
358
  missing.push(`${project.project_id} readable scaffold manifest`);
227
359
  }
360
+ const manifest = readDecompositionResult(project.scaffold_manifest_ref, read);
361
+ if (role === "backend" && contract?.schema_version === 4) {
362
+ if (manifest?.schema_version !== 4 || manifest?.completion_level !== "empty-scaffold-verified" || !sameBackendDesignPrerequisites(project.design_prerequisites, manifest?.design_prerequisites)) {
363
+ signals.push(BLOCKING_SIGNALS.scaffoldGenerationIncomplete);
364
+ missing.push(`${project.project_id} v4 Manifest with empty-scaffold-verified and matching design prerequisites`);
365
+ }
366
+ }
367
+ if (role === "backend" && contract?.schema_version === 3) {
368
+ const legacy = project.legacy_reconciliation;
369
+ let digestMatches = false;
370
+ try { digestMatches = legacy?.manifest_digest === `sha256:${createHash("sha256").update(read(project.scaffold_manifest_ref)).digest("hex")}`; } catch {}
371
+ if (manifest?.schema_version !== 3 || manifest?.completion_level !== "empty-scaffold-verified" || legacy?.status !== "approved" || legacy?.ownership_state !== "unchanged-mechanical-scaffold" || legacy?.premature_implementation !== false || legacy?.manifest_ref !== project.scaffold_manifest_ref || !digestMatches || !isReadable(legacy?.ownership_check_ref, exists) || !isReadable(legacy?.recovery_approval_ref, exists)) {
372
+ signals.push(legacy?.premature_implementation === true ? BLOCKING_SIGNALS.prematureImplementationDetected : BLOCKING_SIGNALS.legacyScaffoldReconciliationRequired);
373
+ missing.push(`${project.project_id} approved legacy v3 reconciliation with unchanged mechanical ownership and recovery approval`);
374
+ }
375
+ }
228
376
  if (project.scaffold_verification?.status !== "passed" || !isReadable(project.scaffold_verification?.ref, exists)) {
229
377
  signals.push(BLOCKING_SIGNALS.scaffoldVerificationFailed);
230
378
  missing.push(`${project.project_id} readable passed scaffold verification`);
@@ -254,7 +402,7 @@ function validateDecisionBoundary(workUnit, state, options) {
254
402
  export function validateTicketFormalization(state, { exists = existsSync, read = (ref) => readFileSync(ref, "utf8"), ...decisionOptions } = {}) {
255
403
  try { enforceFrontendDelivery(state, { root: decisionOptions.root, phase: "implementation" }); }
256
404
  catch (error) { return blockedResult(["frontend-delivery-blocked"], [error.message]); }
257
- const repositoryResult = validateImplementationRepositoriesReady(state, { exists });
405
+ const repositoryResult = validateImplementationRepositoriesReady(state, { exists, read, ...decisionOptions });
258
406
  if (repositoryResult.result === "blocked") return repositoryResult;
259
407
  const decomposition = state?.ticket_decomposition_result;
260
408
  const ticket = state?.vertical_slice_ticket;
@@ -0,0 +1,111 @@
1
+ import { createHash } from "node:crypto";
2
+ import { existsSync, lstatSync, readFileSync, realpathSync } from "node:fs";
3
+ import path from "node:path";
4
+ import { fileURLToPath } from "node:url";
5
+ import { parseAllDocuments, parseDocument } from "../vendor/yaml.mjs";
6
+ import { validateJsonSchema } from "./json-schema.mjs";
7
+
8
+ const TEMPLATE_ROOT = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "../..");
9
+ const METHODS = new Set(["get", "put", "post", "delete", "options", "head", "patch", "trace"]);
10
+
11
+ function ensure(condition, message) { if (!condition) throw new TypeError(message); }
12
+ export const openApiDigest = (bytes) => `sha256:${createHash("sha256").update(bytes).digest("hex")}`;
13
+
14
+ export function resolveOpenApiRef(root, reference) {
15
+ ensure(typeof reference === "string" && reference.length > 0, "引用不能为空");
16
+ ensure(!path.isAbsolute(reference) && !reference.includes("\\") && !reference.split("/").includes(".."), `引用必须位于项目内: ${reference}`);
17
+ const target = path.resolve(root, reference);
18
+ ensure(target === root || target.startsWith(`${root}${path.sep}`), `引用越出项目根: ${reference}`);
19
+ ensure(existsSync(target), `引用不可读取: ${reference}`);
20
+ ensure(!lstatSync(target).isSymbolicLink(), `引用不能是 symlink: ${reference}`);
21
+ return target;
22
+ }
23
+
24
+ function parseOne(file, label) {
25
+ const source = readFileSync(file, "utf8");
26
+ const documents = parseAllDocuments(source, { uniqueKeys: true, maxAliasCount: 0 });
27
+ ensure(documents.length === 1, `${label} 必须是单一 YAML document`);
28
+ ensure(!documents[0].errors.length, `${label} YAML 无效: ${documents[0].errors[0]?.message}`);
29
+ return documents[0].toJS({ maxAliasCount: 0 });
30
+ }
31
+
32
+ function pointer(value, fragment, reference) {
33
+ if (!fragment || fragment === "#") return value;
34
+ ensure(fragment.startsWith("#/"), `仅支持 JSON Pointer fragment: ${reference}`);
35
+ return fragment.slice(2).split("/").reduce((current, part) => {
36
+ const key = decodeURIComponent(part).replaceAll("~1", "/").replaceAll("~0", "~");
37
+ ensure(current && Object.hasOwn(current, key), `$ref 无法解析: ${reference}`);
38
+ return current[key];
39
+ }, value);
40
+ }
41
+
42
+ function verifyReferences(rootDocument, draftFile) {
43
+ const apiRoot = realpathSync(path.dirname(draftFile));
44
+ const cache = new Map([[realpathSync(draftFile), rootDocument]]);
45
+ const active = new Set();
46
+ function load(reference, ownerFile) {
47
+ ensure(!/^[a-z][a-z0-9+.-]*:/i.test(reference) && !path.isAbsolute(reference), `$ref 禁止远程或绝对路径: ${reference}`);
48
+ const [filePart, fragment = ""] = reference.split("#", 2);
49
+ const targetFile = filePart ? path.resolve(path.dirname(ownerFile), filePart) : ownerFile;
50
+ ensure(existsSync(targetFile), `$ref 文件不存在: ${reference}`);
51
+ const realTarget = realpathSync(targetFile);
52
+ ensure(realTarget === apiRoot || realTarget.startsWith(`${apiRoot}${path.sep}`), `$ref 越出 feature API 目录: ${reference}`);
53
+ if (!cache.has(realTarget)) cache.set(realTarget, parseOne(realTarget, `$ref ${reference}`));
54
+ return { value: pointer(cache.get(realTarget), fragment ? `#${fragment}` : "", reference), file: realTarget };
55
+ }
56
+ function walk(value, ownerFile) {
57
+ if (!value || typeof value !== "object") return;
58
+ if (typeof value.$ref === "string") {
59
+ const key = `${ownerFile}|${value.$ref}`;
60
+ if (active.has(key)) return;
61
+ active.add(key); const resolved = load(value.$ref, ownerFile); walk(resolved.value, resolved.file); active.delete(key);
62
+ }
63
+ for (const child of Object.values(value)) walk(child, ownerFile);
64
+ }
65
+ walk(rootDocument, realpathSync(draftFile));
66
+ return (reference, ownerFile = realpathSync(draftFile)) => load(reference, ownerFile);
67
+ }
68
+
69
+ function verifyOperations(document, resolveReference) {
70
+ const operationIds = new Set();
71
+ for (const [route, pathItem] of Object.entries(document.paths ?? {})) {
72
+ if (!pathItem || typeof pathItem !== "object") continue;
73
+ const placeholders = [...route.matchAll(/\{([^}]+)\}/g)].map((match) => match[1]);
74
+ for (const [method, operation] of Object.entries(pathItem)) {
75
+ if (!METHODS.has(method) || !operation || typeof operation !== "object") continue;
76
+ ensure(typeof operation.operationId === "string" && operation.operationId.length > 0, `${method.toUpperCase()} ${route} 缺少 operationId`);
77
+ ensure(!operationIds.has(operation.operationId), `operationId 重复: ${operation.operationId}`);
78
+ operationIds.add(operation.operationId);
79
+ const parameters = [...(pathItem.parameters ?? []), ...(operation.parameters ?? [])].map((item) => typeof item?.$ref === "string" ? resolveReference(item.$ref).value : item);
80
+ for (const name of placeholders) ensure(parameters.some((item) => item?.in === "path" && item?.name === name && item.required === true), `${method.toUpperCase()} ${route} 缺少 required path parameter: ${name}`);
81
+ }
82
+ }
83
+ }
84
+
85
+ export function validateOpenApiDraftValidationRecord(recordFile, { root = TEMPLATE_ROOT, allowTemplate = false, schemaPath = path.join(TEMPLATE_ROOT, "docs/process/schemas/openapi-draft-validation-record.schema.json") } = {}) {
86
+ const projectRoot = path.resolve(root);
87
+ const recordDocument = parseDocument(readFileSync(recordFile, "utf8"), { uniqueKeys: true, maxAliasCount: 0 });
88
+ ensure(!recordDocument.errors.length, `validation record YAML 无效: ${recordDocument.errors[0]?.message}`);
89
+ const record = recordDocument.toJS({ maxAliasCount: 0 });
90
+ validateJsonSchema(record, schemaPath, { cwd: TEMPLATE_ROOT, label: "OpenAPI Draft validation record schema" });
91
+ if (allowTemplate) { ensure(record.template === true, "--allow-template 只接受模板记录"); return { record, template: true }; }
92
+ ensure(record.template === false, "正式 validation record 必须设置 template: false");
93
+ ensure(record.status === "passed", "正式 validation record 必须达到 status: passed");
94
+ ensure(record.toolchain.exit_code === 0, "Redocly lint 必须以退出码 0 完成");
95
+ ensure(Object.values(record.checks).every((result) => result === "passed"), "所有结构与 lint checks 必须为 passed");
96
+ ensure(record.toolchain.command === `pnpm exec redocly lint ${record.draft.ref}`, "lint command 必须精确指向当前 Draft");
97
+ const draftFile = resolveOpenApiRef(projectRoot, record.draft.ref);
98
+ const lockfile = resolveOpenApiRef(projectRoot, record.toolchain.lockfile_ref);
99
+ resolveOpenApiRef(projectRoot, record.toolchain.evidence_ref);
100
+ const draftBytes = readFileSync(draftFile);
101
+ ensure(openApiDigest(draftBytes) === record.draft.sha256, `Draft SHA-256 不匹配: record=${record.draft.sha256}, actual=${openApiDigest(draftBytes)}`);
102
+ const lock = readFileSync(lockfile, "utf8");
103
+ const version = record.toolchain.version.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
104
+ const lockedPackage = new RegExp(`['\"]?@redocly/cli@${version}(?:['\":\\s(]|$)`).test(lock)
105
+ || new RegExp(`['\"]?@redocly/cli['\"]?:[\\s\\S]{0,240}?\\n\\s+version:\\s*['\"]?${version}(?:\\(|['\"\\s]|$)`).test(lock);
106
+ ensure(lockedPackage, "pnpm lockfile 未绑定记录中的 @redocly/cli 版本");
107
+ const draft = parseOne(draftFile, "OpenAPI Draft");
108
+ ensure(draft?.openapi === "3.1.0" && record.draft.oas_version === draft.openapi, "OpenAPI Draft 必须为 OAS 3.1.0");
109
+ verifyOperations(draft, verifyReferences(draft, draftFile));
110
+ return { record, draft, draftFile, draftDigest: openApiDigest(draftBytes) };
111
+ }
@@ -1,7 +1,7 @@
1
1
  import { existsSync, readFileSync } from "node:fs";
2
2
  import path from "node:path";
3
3
  import { parseDocument } from "../vendor/yaml.mjs";
4
- import { PROJECTION_ROOTS, ROOT } from "./skill-supply-chain.mjs";
4
+ import { nestedSkillPaths, PROJECTION_ROOTS, ROOT, unregisteredNestedSkillPaths } from "./skill-supply-chain.mjs";
5
5
 
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");
@@ -217,7 +217,7 @@ function validateCodeReviewRoute(route, resolve) {
217
217
  validateFindingDisposition(standards.finding_disposition);
218
218
  }
219
219
 
220
- export function validateSkillRegistry(registry, { lock, compilerContract, lifecycleContract, skillSource } = {}) {
220
+ export function validateSkillRegistry(registry, { lock, compilerContract, lifecycleContract, skillSource, externalSkillSource, nestedSkillSources } = {}) {
221
221
  if (!registry || typeof registry !== "object" || Array.isArray(registry)) fail("技能路由注册表必须是对象");
222
222
  if (registry.schema_version !== 2) fail("schema_version 必须为 2;v1 已停止支持,请迁移 capability、typed dependencies 与 recipes");
223
223
  if (registry.registry_id !== "yss.skill-routing") fail("registry_id 必须为 yss.skill-routing");
@@ -315,11 +315,23 @@ export function validateSkillRegistry(registry, { lock, compilerContract, lifecy
315
315
  const external = registry.external_skills ?? [];
316
316
  if (!Array.isArray(external)) fail("external_skills 必须是数组");
317
317
  const externalIds = new Set();
318
+ const externalSources = new Set();
318
319
  for (const skill of external) {
319
320
  requireString(skill.id, "external_skills.id");
320
321
  requireString(skill.source, `${skill.id}.source`);
321
322
  if (externalIds.has(skill.id) || ids.has(skill.id) || aliases.has(skill.id) || platformAliases.has(skill.id)) fail(`external skill 冲突: ${skill.id}`);
323
+ const canonicalExternalSource = skill.source.startsWith(`${registry.canonical_content_root}/`);
324
+ if (canonicalExternalSource && externalSources.has(skill.source)) fail(`external skill source 重复: ${skill.source}`);
325
+ if (externalSkillSource && canonicalExternalSource) {
326
+ const discovered = frontmatterName(externalSkillSource(skill.source));
327
+ if (discovered !== skill.id) fail(`${skill.id} 的 external SKILL.md name=${discovered} 与 id 不一致`);
328
+ }
322
329
  externalIds.add(skill.id);
330
+ externalSources.add(skill.source);
331
+ }
332
+ if (nestedSkillSources) {
333
+ const unregistered = unregisteredNestedSkillPaths(nestedSkillSources, externalSources);
334
+ if (unregistered.length) fail(`嵌套 SKILL.md 必须登记到 external_skills: ${unregistered.join(", ")}`);
323
335
  }
324
336
  for (const skill of platform) {
325
337
  for (const alias of skill.aliases) {
@@ -523,6 +535,8 @@ export function validateDefaultSkillRegistry() {
523
535
  lock,
524
536
  compilerContract,
525
537
  lifecycleContract: yamlFromFile(LIFECYCLE_CONTRACT, "生命周期编排合同"),
526
- skillSource: (id) => readFileSync(path.join(ROOT, ".agents/skills", id, "SKILL.md"), "utf8")
538
+ skillSource: (id) => readFileSync(path.join(ROOT, ".agents/skills", id, "SKILL.md"), "utf8"),
539
+ externalSkillSource: (source) => readFileSync(path.join(ROOT, source), "utf8"),
540
+ nestedSkillSources: nestedSkillPaths().map((source) => `.agents/skills/${source}`)
527
541
  });
528
542
  }
@@ -10,7 +10,8 @@ const LOCK_PATH = path.join(ROOT, "skills-lock.json");
10
10
  const YSS_UI_MANIFEST_PATH = path.join(SOURCE_ROOT, ".yss-skills-manifest.json");
11
11
  const STRATEGIC_DESIGN_MANIFEST_PATH = path.join(SOURCE_ROOT, ".strategic-design-skills-manifest.json");
12
12
  export const PROJECTION_ROOTS = [".codex/skills", ".cursor/skills", ".pi/skills"];
13
- export const OBSOLETE = new Set(["to-" + "prd", "to-" + "issues", "design-an-interface", "qa", "request-refactor-plan", "ubiquitous-language", "edit-article", "obsidian-vault", "writing-great-skills", "code-review-process", "yss-domain-modeling", "yss-dir", "yss-duckdb", "yss-file", "yss-filerunner", "yss-db2mybatis", "yss-mail", "yss-mapper-dynamic", "yss-quality", "yss-sql-condition", "yss-sql-tpl", "yss-valuation", "yss-variable", "yss-openapi", "web-design-engineer", "web-video-presentation", "wireframe-prototype", "wizard", "git-guardrails-claude-code", "claude-handoff", "batch-grill-me", "product-design-prototype", "research", "ask-matt", "dispatching-parallel-agents", "loop-me", "migrate-to-shoehorn", "prototype-page-acceptance", "scaffold-exercises", "setup-pre-commit", "setup-ts-deep-modules", "teach", "writing-beats", "writing-fragments", "writing-shape", "yss-microapp-commit", "yss-page-module-development", "yss-dictionary", "yss-jdbc", "yss-log", "yss-taskflow", "yss-backend-scaffold-application", "yss-backend-scaffold-domain", "yss-backend-scaffold-infrastructure", "yss-backend-scaffold-web", "yss-router", "yss-source-index"]);
13
+ export const OBSOLETE = new Set(["yss-antd-design", "yss-antdv-next-design", "to-" + "prd", "to-" + "issues", "design-an-interface", "qa", "request-refactor-plan", "ubiquitous-language", "edit-article", "obsidian-vault", "writing-great-skills", "code-review-process", "yss-domain-modeling", "yss-dir", "yss-duckdb", "yss-file", "yss-filerunner", "yss-db2mybatis", "yss-mail", "yss-mapper-dynamic", "yss-quality", "yss-sql-condition", "yss-sql-tpl", "yss-valuation", "yss-variable", "yss-openapi", "web-design-engineer", "web-video-presentation", "wireframe-prototype", "wizard", "git-guardrails-claude-code", "claude-handoff", "batch-grill-me", "product-design-prototype", "research", "ask-matt", "dispatching-parallel-agents", "loop-me", "migrate-to-shoehorn", "prototype-page-acceptance", "scaffold-exercises", "setup-pre-commit", "setup-ts-deep-modules", "teach", "writing-beats", "writing-fragments", "writing-shape", "yss-microapp-commit", "yss-page-module-development", "yss-dictionary", "yss-jdbc", "yss-log", "yss-taskflow", "yss-backend-scaffold-application", "yss-backend-scaffold-domain", "yss-backend-scaffold-infrastructure", "yss-backend-scaffold-web", "yss-router", "yss-source-index"]);
14
+ for (const id of ["yss-components", "yss-mvc-scaffold-generator", "yss-backend-scaffold-adapter", "yss-application-layer-reference", "yss-domain-layer-reference", "yss-infrastructure-layer-reference", "yss-web-layer-reference"]) OBSOLETE.add(id);
14
15
  export function obsoleteCanonicalResidues(names, obsolete = OBSOLETE) {
15
16
  return names.filter((name) => obsolete.has(name)).sort();
16
17
  }
@@ -28,6 +29,16 @@ function treeFiles(directory, prefix = "") {
28
29
  return entry.isFile() || entry.isSymbolicLink() ? [[rel, absolute]] : [];
29
30
  });
30
31
  }
32
+ export function nestedSkillPaths(directory = SOURCE_ROOT) {
33
+ return treeFiles(directory)
34
+ .map(([name]) => name)
35
+ .filter((name) => name.endsWith("/SKILL.md") && name.split("/").length > 2)
36
+ .sort();
37
+ }
38
+ export function unregisteredNestedSkillPaths(candidates, registeredSources) {
39
+ const registered = new Set(registeredSources);
40
+ return candidates.filter((candidate) => !registered.has(candidate)).sort();
41
+ }
31
42
  export function treeHash(directory) {
32
43
  const digest = createHash("sha256");
33
44
  for (const [name, file] of treeFiles(directory).sort(([left], [right]) => left.localeCompare(right))) {
@@ -6,14 +6,14 @@ export async function verifyConsumerFeedback({root=process.cwd(),feedbackRef}={}
6
6
  project(root);const file=safe(root,feedbackRef),feedback=read(file);
7
7
  schema(feedback,'docs/process/schemas/strategic-consumer-feedback.schema.json');
8
8
  const receipt=read(safe(root,feedback.import_receipt_ref));
9
- ensure(receipt.schema_version===2,'Consumer Feedback v1 只接受 Handoff v4 的 Import Receipt v2');
9
+ ensure([2,3].includes(receipt.schema_version),'Consumer Feedback v1 只接受 route-aware Import Receipt v2/v3');
10
10
  const base=`docs/handoffs/${receipt.bundle_id}/${receipt.version}`;
11
11
  ensure(feedback.import_receipt_ref===`${base}/import-receipt.json`&&receipt.package_ref===`${base}/package`,'Consumer Feedback 导入收据路径无效');
12
12
  ensure(feedback.bundle.id===receipt.bundle_id&&feedback.bundle.version===receipt.version&&feedback.bundle.digest===receipt.bundle_digest,'Consumer Feedback 绑定的 bundle 身份或摘要不一致');
13
13
  const route=receipt.routes.find(item=>item.route_id===feedback.route_id);ensure(route&&route.activation!=='not-applicable','Consumer Feedback route_id 未被当前消费者激活');
14
14
  for(const ref of feedback.evidence_refs)ensure(readFileSync(safe(root,ref)).length>0,`Consumer Feedback evidence 为空: ${ref}`);
15
15
  return openBundle(safe(root,receipt.package_ref),bundle=>{
16
- ensure(bundle.handoff.schema_version===4&&bundle.manifest.bundle_digest===receipt.bundle_digest,'Consumer Feedback 必须绑定当前 Handoff v4 包');
16
+ ensure([4,5].includes(bundle.handoff.schema_version)&&bundle.manifest.bundle_digest===receipt.bundle_digest,'Consumer Feedback 必须绑定当前 Handoff v4/v5 包');
17
17
  const source=[...bundle.indexes.rules.map(item=>({id:item.rule_id,digest:item.source_digest})),...bundle.indexes.scenarios.map(item=>({id:item.scenario_id,digest:item.source_digest}))].find(item=>item.id===feedback.source.id);
18
18
  ensure(source&&source.digest===feedback.source.digest,'Consumer Feedback source ID 或摘要不是当前包内容');
19
19
  return {result:'feedback-verified',feedback_ref:feedbackRef,feedback_digest:hash(readFileSync(file)),severity:feedback.severity,route_id:feedback.route_id,bundle_digest:receipt.bundle_digest};
@@ -24,10 +24,10 @@ export async function verifyConsumption(data,{root=process.cwd(),sliceRef,consum
24
24
  const expectedBase=`docs/handoffs/${receipt.bundle_id}/${receipt.version}`;
25
25
  ensure(binding.import_receipt_ref===`${expectedBase}/import-receipt.json` && receipt.package_ref===`${expectedBase}/package`,'导入收据路径与包身份不一致');
26
26
  ensure(binding.bundle_digest===receipt.bundle_digest,'战术绑定与导入收据摘要不一致');
27
- if(receipt.schema_version===2){
27
+ if([2,3].includes(receipt.schema_version)){
28
28
  const capability=consumer==='frontend'?'frontend-engineering-design':'backend-technical-design';
29
29
  const route=receipt.routes.find(item=>item.capability===capability);
30
- ensure(route&&route.activation!=='not-applicable'&&binding.route_id===route.route_id,`${capability} 未绑定当前 Handoff v4 route_id`);
30
+ ensure(route&&route.activation!=='not-applicable'&&binding.route_id===route.route_id,`${capability} 未绑定当前 Handoff v4/v5 route_id`);
31
31
  }
32
32
  const result=spawnSync(process.execPath,[path.join(ROOT,'scripts/verify-context-reconciliation'),'--root',root,safe(root,binding.context_reconciliation_ref)],{encoding:'utf8'});
33
33
  ensure(result.status===0,`目标术语对账未通过: ${result.error?.message || result.stderr}`);