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,84 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://yss.dev/schemas/strategic-handoff-delivery-v1.schema.json",
4
+ "title": "YSS Strategic Handoff Delivery Record v1",
5
+ "type": "object",
6
+ "additionalProperties": false,
7
+ "required": ["schema_version", "kind", "status", "handoff", "source_assets", "package_ref", "manifest_ref", "bundle_digest", "verification_ref", "consumer_routes", "previous_delivery"],
8
+ "properties": {
9
+ "schema_version": {"const": 1},
10
+ "kind": {"const": "strategic-handoff-delivery-v1"},
11
+ "status": {"const": "packaged"},
12
+ "handoff": {
13
+ "type": "object",
14
+ "additionalProperties": false,
15
+ "required": ["id", "version", "ref", "sha256", "schema_version"],
16
+ "properties": {
17
+ "id": {"type": "string", "pattern": "^strategic-design-handoff\\.[a-z0-9][a-z0-9-]*$"},
18
+ "version": {"type": "string", "pattern": "^v[1-9][0-9]*$"},
19
+ "ref": {"type": "string", "minLength": 1},
20
+ "sha256": {"type": "string", "pattern": "^sha256:[a-f0-9]{64}$"},
21
+ "schema_version": {"const": 5}
22
+ }
23
+ },
24
+ "source_assets": {
25
+ "type": "array",
26
+ "minItems": 1,
27
+ "items": {
28
+ "type": "object",
29
+ "additionalProperties": false,
30
+ "required": ["source_key", "id", "version", "ref", "digest"],
31
+ "properties": {
32
+ "source_key": {"type": "string", "minLength": 1},
33
+ "id": {"type": "string", "minLength": 1},
34
+ "version": {"type": "string", "minLength": 1},
35
+ "ref": {"type": "string", "minLength": 1},
36
+ "digest": {"type": "string", "pattern": "^sha256:[a-f0-9]{64}$"}
37
+ }
38
+ }
39
+ },
40
+ "package_ref": {"const": "package"},
41
+ "manifest_ref": {"const": "package/manifest.json"},
42
+ "bundle_digest": {"type": "string", "pattern": "^sha256:[a-f0-9]{64}$"},
43
+ "verification_ref": {"const": "verification.json"},
44
+ "consumer_routes": {
45
+ "type": "array",
46
+ "minItems": 3,
47
+ "maxItems": 3,
48
+ "items": {
49
+ "type": "object",
50
+ "additionalProperties": false,
51
+ "required": ["route_id", "capability", "activation"],
52
+ "properties": {
53
+ "route_id": {"type": "string", "pattern": "^route\\.[a-z0-9][a-z0-9-]*$"},
54
+ "capability": {"enum": ["backend-technical-design", "frontend-engineering-design", "delivery-coordination"]},
55
+ "activation": {"enum": ["required", "optional", "not-applicable"]}
56
+ }
57
+ }
58
+ },
59
+ "zip": {
60
+ "type": "object",
61
+ "additionalProperties": false,
62
+ "required": ["ref", "sha256"],
63
+ "properties": {
64
+ "ref": {"const": "package.zip"},
65
+ "sha256": {"type": "string", "pattern": "^sha256:[a-f0-9]{64}$"}
66
+ }
67
+ },
68
+ "previous_delivery": {
69
+ "anyOf": [
70
+ {"type": "null"},
71
+ {
72
+ "type": "object",
73
+ "additionalProperties": false,
74
+ "required": ["handoff_id", "version", "bundle_digest"],
75
+ "properties": {
76
+ "handoff_id": {"type": "string", "minLength": 1},
77
+ "version": {"type": "string", "pattern": "^v[1-9][0-9]*$"},
78
+ "bundle_digest": {"type": "string", "pattern": "^sha256:[a-f0-9]{64}$"}
79
+ }
80
+ }
81
+ ]
82
+ }
83
+ }
84
+ }
@@ -0,0 +1,42 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://yss.dev/schemas/strategic-handoff-import-receipt-v3.schema.json",
4
+ "title": "YSS Strategic Handoff Import Receipt v3",
5
+ "type": "object",
6
+ "additionalProperties": false,
7
+ "required": ["schema_version", "bundle_id", "version", "bundle_digest", "package_ref", "source_delivery_record_ref", "source_delivery_record_sha256", "target_context_digest", "target_profile_id", "selected_consumer_capabilities", "routes", "status", "ready_for_agent"],
8
+ "properties": {
9
+ "schema_version": {"const": 3},
10
+ "bundle_id": {"type": "string", "pattern": "^strategic-design-handoff\\.[a-z0-9][a-z0-9-]*$"},
11
+ "version": {"type": "string", "pattern": "^v[1-9][0-9]*$"},
12
+ "bundle_digest": {"type": "string", "pattern": "^sha256:[a-f0-9]{64}$"},
13
+ "package_ref": {"type": "string", "minLength": 1},
14
+ "source_delivery_record_ref": {"type": "string", "minLength": 1},
15
+ "source_delivery_record_sha256": {"type": "string", "pattern": "^sha256:[a-f0-9]{64}$"},
16
+ "target_context_digest": {"type": "string", "pattern": "^sha256:[a-f0-9]{64}$"},
17
+ "target_profile_id": {"type": "string", "minLength": 1},
18
+ "selected_consumer_capabilities": {
19
+ "type": "array",
20
+ "minItems": 1,
21
+ "uniqueItems": true,
22
+ "items": {"enum": ["backend-technical-design", "frontend-engineering-design", "delivery-coordination"]}
23
+ },
24
+ "routes": {
25
+ "type": "array",
26
+ "minItems": 1,
27
+ "items": {
28
+ "type": "object",
29
+ "additionalProperties": false,
30
+ "required": ["route_id", "capability", "activation", "artifact_refs"],
31
+ "properties": {
32
+ "route_id": {"type": "string", "pattern": "^route\\.[a-z0-9][a-z0-9-]*$"},
33
+ "capability": {"enum": ["backend-technical-design", "frontend-engineering-design", "delivery-coordination"]},
34
+ "activation": {"enum": ["required", "optional", "not-applicable"]},
35
+ "artifact_refs": {"type": "array", "minItems": 1, "uniqueItems": true, "items": {"type": "string", "minLength": 1}}
36
+ }
37
+ }
38
+ },
39
+ "status": {"const": "pending-context-reconciliation"},
40
+ "ready_for_agent": {"const": false}
41
+ }
42
+ }
@@ -1,12 +1,12 @@
1
1
  # 战略交接快照包
2
2
 
3
- 本合同用于批准后的战略交付和研发接收,不增加生命周期阶段或门禁。`scripts/strategic-handoff` 是统一入口;Node 22+、Python 3 和现有 `jsonschema` 环境即可运行,不下载依赖、不执行交接包中的代码。包 schema 与导出配置见同目录 `schemas/strategic-handoff-package.schema.json`、`schemas/strategic-handoff-export.schema.json`(历史 v1)与 `schemas/strategic-handoff-export-v2.schema.json`(Handoff v5)。源规则仍由战略合同持有,索引与快照不成为第二套事实源。
3
+ 本合同用于批准后的战略交付和研发接收,不增加生命周期阶段或门禁。`scripts/strategic-handoff` 是统一入口;Node 22+、Python 3 和现有 `jsonschema` 环境即可运行,不下载依赖、不执行交接包中的代码。新交付统一使用 Handoff v5,并生成 `Strategic Delivery Bundle`;交付记录、验证记录、逻辑包和可选 ZIP 的 schema 分别见 `schemas/strategic-handoff-delivery.schema.json`、`schemas/strategic-handoff-delivery-verification.schema.json`、`schemas/strategic-handoff-package.schema.json`。源规则仍由战略合同持有,README、索引与快照不成为第二套事实源。
4
4
 
5
5
  ## 源资产准备
6
6
 
7
7
  1. 源仓必须为 `project-instance`。新交付使用 Domain Strategy v3 与 Stage Decision Package v3;规则、场景、决定、假设、约束、成功标准、测试 seam 与 downstream mapping 使用稳定 ID 和证据。v2 仅用于历史 Handoff v3 的只读验证;修改或重发须显式迁移、重新批准。不得用行号、文字 hash 或导出顺序生成业务身份。
8
8
  2. 每个场景明确 `critical`、`rule_refs`、`success_results` 和既有 `failure_results`;兼容字段 `rules` 必须与引用规则正文一致。不变量使用 `rule_ref`,并通过 `scenario_refs` 指向确实覆盖该规则的场景。缺身份或关联先回战略方确认、更新并重新批准,导出器不猜测。
9
- 3. 新的既有 UI 交接使用 Handoff v5;原型交付可继续使用 Handoff v4 或显式使用 v5 的 prototype 分支。历史 Handoff v3/v4 按各自冻结 schema 和来源语义严格验证,不原地升级。校验器先读取 `schema_version` 再选择固定 schema,未知版本输出支持列表并 fail closed。`package_export` 的 `approvals` 按 `source` 字段及 `handoff` 绑定批准记录,声明 `record_ref`、`gate_id`、`digest_kind`。沿用源角色表的现有门禁;当前综合模板的战略、阶段决策及交接资产统一绑定 `gate.plan-approved`,Spec 对应 Spec 基线批准,原型和视觉基线对应 `gate.product-design-approved`;历史包及其他源 profile 仍按包内明确登记的源批准规则验证,不自动迁移当前门禁状态。
9
+ 3. 新原型与既有 UI 交接都使用 Handoff v5,分别选择 `prototype` 或 `existing-ui-baseline`。历史 Handoff v3/v4 与既有裸 v5 包继续按冻结 schema 执行 `verify/import`,但 v3/v4 不再创建新 export;修改或重新交付必须迁移到 v5 并重新批准。校验器先读取 `schema_version` 再选择固定 schema,未知版本输出支持列表并 fail closed。`package_export` 的 `approvals` 按 `source` 字段及 `handoff` 绑定批准记录,声明 `record_ref`、`gate_id`、`digest_kind`。沿用源角色表的现有门禁;当前综合模板的战略、阶段决策及交接资产统一绑定 `gate.plan-approved`,Spec 对应 Spec 基线批准,原型和视觉基线对应 `gate.product-design-approved`;历史包及其他源 profile 仍按包内明确登记的源批准规则验证,不自动迁移当前门禁状态。
10
10
  4. 批准记录除既有会签字段,还要在 `artifact_bindings` 中逐项绑定 `{id, version, digest}`。战略/阶段建议 `canonical-json`;普通文件使用 `sha256-bytes`;视觉基线使用 `visual-baseline`。正文中的 `approved` 和可读取批准路径不能替代当前字节的批准绑定。源角色表要求用户决定记录时,接收端必须支持并核验该策略;旧工具缺少该能力时阻断并要求升级,不能按旧规则放行。
11
11
  5. `additional_files` 明确补充依赖;`reference_map` 将 `evidence.*` 稳定证据引用解析为仓内路径。源资产、批准记录、证据引用、Markdown 本地链接和显式目录共同形成依赖闭包。HTTP 引用保留为引用,不在导出时下载网页。
12
12
  6. 原型分支的 `prototype` 指定 `profile`、`preview_root`、`entry_ref`、`verification_ref`、`verification_digest`(验证记录的字节摘要);H2 另须 `source_root`、`lock_ref` 和 `source_digest`(源码目录树摘要,算法同下述预览树)。源码交付目录不含 node_modules / .git;锁文件与源码一同保存。预览目录须资源闭合,可通过本地静态服务离线浏览。源码、锁文件或验证记录变化须更新交接摘要并重新批准。
@@ -17,12 +17,29 @@
17
17
  以下路径参数由当前资产提供,不从目录 glob 猜测业务含义。
18
18
 
19
19
  ```bash
20
- scripts/strategic-handoff export --source-root <战略项目根> --handoff <仓内交接文件> --output <新目录> --zip
21
- scripts/strategic-handoff export --source-root <战略项目根> --handoff <新版本交接文件> --output <新目录> --previous <上一目录或ZIP> --zip
22
- scripts/strategic-handoff verify --bundle <目录或ZIP>
23
- scripts/strategic-handoff import --bundle <目录或ZIP> --target-root <研发项目根>
20
+ scripts/strategic-handoff finalize --source-root <战略项目根> --handoff <Handoff-v5相对路径> [--previous <上一交付目录或package>] [--zip]
21
+ scripts/strategic-handoff verify --bundle <交付目录|package目录|历史ZIP>
22
+ scripts/strategic-handoff import --bundle <交付目录|package目录|历史ZIP> --target-root <研发项目根>
24
23
  ```
25
24
 
25
+ 生命周期在交接批准后自动调用 `finalize`,不要求业务用户提供 `--output`。固定输出为:
26
+
27
+ ```text
28
+ docs/deliveries/strategic/<handoff-id>/<version>/
29
+ delivery-record.json
30
+ verification.json
31
+ package/
32
+ README.md
33
+ manifest.json
34
+ payload/
35
+ indexes/
36
+ package.zip # 仅 --zip 时生成
37
+ ```
38
+
39
+ `package/` 是权威不可变交付件。相同 ID/version 且逻辑摘要一致时重新整包验证并返回 `already-packaged`;内容不一致返回 `delivery-version-conflict`,必须提升版本。README 由工具确定性生成,只列范围、来源引用、消费者、待决项和接收命令,不复制业务正文。ZIP 只负责运输,不参与逻辑版本判定,也不要求提交 Git。
40
+
41
+ 战略 checkpoint 不新增产物 ID:`artifact.strategic-design-handoff.ref` 继续指向批准的 Handoff v5,其 `evidence_refs` 必须同时包含交付目录内的 `delivery-record.json` 与 `verification.json`。`verification.strategic_delivery` 记录实际命令、`exit_code: 0`、`result: verified` 和同一 `bundle_digest`。缺记录、包缺失、摘要漂移或验证失败时,`work-unit.strategic-design-handoff` 保持 `blocked`;已成包并验证通过后允许阶段完成,不等待后端或前端 Import Receipt。
42
+
26
43
  目录是逻辑包;ZIP 只负责运输。源资产原始字节进入 payload,清单以 `original_ref → path` 映射原路径到包内路径;v3/v4 的原 Handoff 保存在 `handoff.yaml`,源根词汇表保存为 `payload/source-context.snapshot.md`。v5 的原文件映射为 `payload/files/<original_ref>`,只有根词汇表使用固定物理别名 `payload/files/source-context.snapshot.md`;该别名不成为第二个根词汇表。包中不创建嵌套 `CONTEXT.md`。常规独立验包时工具在临时目录重建验证视图,完成后清理;不把临时源词汇表注册为目标权威。
27
44
 
28
45
  `manifest.json` 的 `files` 声明所有文件的字节摘要和大小。`bundle_digest` 是删除自身字段后 canonical JSON 的 SHA-256;不把整 ZIP 摘要当逻辑版本摘要。目录与 ZIP 的逻辑摘要相同。源合同的既有语义 digest 另行复核。目录/ZIP 已存在时拒绝覆盖,同身份版本不同内容的导入拒绝;已验过且相同的重复导入返回 `already-imported`。限制为 20,000 文件、512 MiB 展开内容;拒绝 ZIP 路径穿越、重复路径、大小写碰撞和符号链接。
@@ -35,7 +52,7 @@ Handoff v5 必须声明 `ui_baseline_kind: prototype | existing-ui-baseline`,`
35
52
 
36
53
  初始化和构建前运行 `scripts/preflight-delivery --input <输入清单> --stage prepare|build|export|accept --json`;完整阶段语义见 [交付预检](delivery-preflight.md)。`openBundle(...,{readOnly:true})` 对已展开 v5 包以固定别名映射核验,不写临时源目录、不执行来源代码;ZIP 返回 `readonly-extraction-required`,旧布局返回 `readonly-source-layout-required`,均不得视为验证通过。实际导出和接收仍在执行边界重新校验。
37
54
 
38
- ## Handoff v4/v5 消费者路由
55
+ ## Handoff v5 消费者路由
39
56
 
40
57
  `consumer_routes` 固定表达三种能力,不绑定仓名:`backend-technical-design`、`frontend-engineering-design`、`delivery-coordination`。每条路由记录稳定 `route_id`、`required | optional | not-applicable`、影响引用、入口工作单元、预期输出、依赖和 Context Reconciliation 要求;`optional` / `not-applicable` 必须有原因与证据,不能产生 `ready-for-agent`。
41
58
 
@@ -45,7 +62,7 @@ Handoff v5 必须声明 `ui_baseline_kind: prototype | existing-ui-baseline`,`
45
62
 
46
63
  ## 下游接收与逐条追溯
47
64
 
48
- 导入落盘到 `docs/handoffs/<handoff-id>/<version>/`。Handoff v3 继续生成 Import Receipt v1 和原固定文件名;Handoff v4/v5 生成 Import Receipt v2,按目标 profile 的消费者能力登记 route、产物引用和状态,并分别生成后端追踪、Frontend Strategic Preflight / 前端追踪、协调状态索引草案。共同生成 route-aware Context Reconciliation 和 upstream impact 草案。仅写快照与草案,不自动更新根词汇表或批准状态。目标侧确认增量后更新唯一根 `CONTEXT.md` 并完成正式 reconciliation。
65
+ 导入落盘到 `docs/handoffs/<handoff-id>/<version>/`。Handoff v3 继续生成 Import Receipt v1;历史裸 Handoff v4/v5 包继续生成 Import Receipt v2。新的 v5 交付目录生成 Import Receipt v3,保存源 `delivery-record.json` 原始字节及摘要,按目标 profile 的消费者能力登记 route、产物引用和状态,并分别生成后端追踪、Frontend Strategic Preflight / 前端追踪、协调状态索引草案。共同生成 route-aware Context Reconciliation 和 upstream impact 草案,所有入口固定 `ready_for_agent: false`。接收回执由研发仓持有,不反向修改战略仓;协调索引只保存回执引用。目标侧确认增量后更新唯一根 `CONTEXT.md` 并完成正式 reconciliation。
49
66
 
50
67
  Technical Design Contract v2(DDD / MVC 共用)的 `strategic_handoff` 绑定 `import_receipt_ref`、`bundle_digest`、`context_reconciliation_ref` 和 `rows`。逐条覆盖全部规则与 `critical: true` 的成功/失败场景;行字段如下:
51
68
 
@@ -61,7 +78,7 @@ scripts/verify-strategic-handoff-consumption --root <研发项目根> --slice <
61
78
  node .agents/skills/yss-technical-design/scripts/validate-technical-design.mjs <技术设计合同> --root <研发项目根>
62
79
  ```
63
80
 
64
- Handoff v4/v5 后端消费必须绑定 `backend-technical-design` 的 `route_id`,先对账,再由 `yss-technical-design` 依据已批准架构调用 `yss-tactical-design` 或 `yss-mvc-design`。Handoff v3 的 `yss-technical-design` / `yss-tactical-design` 单目标组合只读兼容,不修改已冻结包。`tactical_refs` 在 v2 Technical Design 可指向 MVC 或 DDD 分支对象;无战略交接包的 MVC 项目直接消费批准需求,不补造战略 DDD。
81
+ Handoff v4/v5 后端消费必须绑定 `backend-technical-design` 的 `route_id`,先对账,再由 `yss-technical-design` 依据已批准架构调用 `yss-tactical-design` 或 `yss-mvc-design`。Handoff v3/v4 仅作历史只读兼容,不修改已冻结包。`tactical_refs` 在 v2 Technical Design 可指向 MVC 或 DDD 分支对象;无战略交接包的 MVC 项目直接消费批准需求,不补造战略 DDD。
65
82
 
66
83
  前端先验证与交接版本匹配的 Strategic Preflight:Handoff v4 使用 v1,Handoff v5 使用 v2 的 `ui_baseline_kind/ui_baseline_ref`,只允许起草前端工程设计与实现计划,固定返回 `ready_for_agent: false`。最终 Frontend Delivery Acceptance v2(Handoff v4)或 v3(Handoff v5)在 Backend/API/Data 有影响时必须绑定真实 Backend Delivery 收据与版本探测;UI-only 时使用与战略路由一致的 `backend-not-applicable`,此时 `operation_ids` 必须为空。无论哪条路径,当前且已批准的 Slice Contract 仍是实现入口。
67
84
 
@@ -35,7 +35,7 @@
35
35
 
36
36
  ```bash
37
37
  node scripts/preflight-delivery --input <战略预检输入.json> --stage export --json
38
- node scripts/strategic-handoff export --source-root . --handoff <交接描述相对路径> --output <新包目录> --zip
38
+ node scripts/strategic-handoff finalize --source-root . --handoff <Handoff-v5相对路径> --zip
39
39
  node scripts/strategic-handoff verify --bundle <包目录或ZIP>
40
40
  ```
41
41
 
@@ -0,0 +1,29 @@
1
+ #!/usr/bin/env node
2
+ import process from "node:process";
3
+ import { auditLegacyBackendScaffold } from "./lib/legacy-backend-scaffold-audit.mjs";
4
+
5
+ function parse(argv) {
6
+ const options = {};
7
+ for (let index = 0; index < argv.length; index += 1) {
8
+ const token = argv[index];
9
+ if (token === "--project-root") options.projectRoot = argv[++index];
10
+ else if (token === "--manifest-ref") options.manifestRef = argv[++index];
11
+ else if (token === "--help" || token === "-h") options.help = true;
12
+ else throw new TypeError(`不支持的参数: ${token}`);
13
+ }
14
+ if (!options.help && !options.projectRoot) throw new TypeError("缺少 --project-root");
15
+ return options;
16
+ }
17
+
18
+ try {
19
+ const options = parse(process.argv.slice(2));
20
+ if (options.help) process.stdout.write("用法: scripts/audit-legacy-backend-scaffold --project-root <path> [--manifest-ref .yss/scaffold-generation.json]\n");
21
+ else {
22
+ const result = await auditLegacyBackendScaffold(options.projectRoot, { manifestRef: options.manifestRef });
23
+ process.stdout.write(`${JSON.stringify(result, null, 2)}\n`);
24
+ if (result.status === "blocked") process.exitCode = 2;
25
+ }
26
+ } catch (error) {
27
+ process.stderr.write(`❌ 历史后端脚手架审计失败: ${error.message}\n`);
28
+ process.exitCode = 1;
29
+ }
@@ -0,0 +1,49 @@
1
+ import { readFileSync } from "node:fs";
2
+ import path from "node:path";
3
+ import { fileURLToPath } from "node:url";
4
+ import { parseDocument } from "../vendor/yaml.mjs";
5
+ import { validateJsonSchema } from "./json-schema.mjs";
6
+ import { openApiDigest, resolveOpenApiRef, validateOpenApiDraftValidationRecord } from "./openapi-draft-validation.mjs";
7
+
8
+ const TEMPLATE_ROOT = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "../..");
9
+ const SCHEMA = path.join(TEMPLATE_ROOT, "docs/process/schemas/api-contract-decision.schema.json");
10
+ const fail = (message) => { throw new TypeError(message); };
11
+ const readBound = (root, ref, label) => {
12
+ const file = resolveOpenApiRef(root, ref);
13
+ const bytes = readFileSync(file);
14
+ return { file, bytes, digest: openApiDigest(bytes), label };
15
+ };
16
+ const requireDigest = (asset, expected) => { if (asset.digest !== expected) fail(`${asset.label}摘要漂移`); };
17
+
18
+ export function validateApiContractDecision(binding, { root = TEMPLATE_ROOT } = {}) {
19
+ if (!binding || !binding.ref || !binding.version || !binding.digest || !["required", "not-applicable"].includes(binding.impact)) fail("缺少 API Contract Decision 当前版本绑定");
20
+ const projectRoot = path.resolve(root);
21
+ const decisionAsset = readBound(projectRoot, binding.ref, "API Contract Decision");
22
+ requireDigest(decisionAsset, binding.digest);
23
+ const document = parseDocument(decisionAsset.bytes.toString("utf8"), { uniqueKeys: true, maxAliasCount: 0 });
24
+ if (document.errors.length) fail(`API Contract Decision 无法解析: ${document.errors[0].message}`);
25
+ const decision = document.toJS({ maxAliasCount: 0 });
26
+ validateJsonSchema(decision, SCHEMA, { cwd: TEMPLATE_ROOT, label: "API Contract Decision v1" });
27
+ if (decision.decision_version !== binding.version || decision.impact !== binding.impact) fail("API Contract Decision 版本或影响结论与合同不一致");
28
+ requireDigest(readBound(projectRoot, decision.assessment_ref, "API 影响评估"), decision.assessment_digest);
29
+ for (const ref of decision.evidence_refs) readBound(projectRoot, ref, "API Decision 证据");
30
+ if (decision.impact === "not-applicable") return { decision, binding: { ref: binding.ref, version: binding.version, digest: binding.digest, impact: decision.impact } };
31
+
32
+ const draft = readBound(projectRoot, decision.openapi.ref, "OpenAPI YAML");
33
+ requireDigest(draft, decision.openapi.digest);
34
+ const validation = readBound(projectRoot, decision.validation_record.ref, "OpenAPI Validation");
35
+ requireDigest(validation, decision.validation_record.digest);
36
+ const review = readBound(projectRoot, decision.draft_review.ref, "OpenAPI Draft Review");
37
+ requireDigest(review, decision.draft_review.digest);
38
+ const reviewDocument = parseDocument(review.bytes.toString("utf8"), { uniqueKeys: true, maxAliasCount: 0 });
39
+ if (reviewDocument.errors.length) fail(`OpenAPI Draft Review 无法解析: ${reviewDocument.errors[0].message}`);
40
+ const reviewRecord = reviewDocument.toJS({ maxAliasCount: 0 });
41
+ if (reviewRecord?.result !== "approved" || !Array.isArray(reviewRecord.blocking_findings) || reviewRecord.blocking_findings.length > 0) fail("OpenAPI Draft Review 实际记录未批准或仍有阻断项");
42
+ if (reviewRecord.draft_ref !== decision.openapi.ref || reviewRecord.draft_digest !== decision.openapi.digest) fail("OpenAPI Draft Review 实际记录未绑定当前权威 YAML");
43
+ for (const ref of decision.draft_review.evidence_refs) readBound(projectRoot, ref, "OpenAPI Draft Review 证据");
44
+ const validated = validateOpenApiDraftValidationRecord(validation.file, { root: projectRoot });
45
+ if (validated.record.draft.ref !== decision.openapi.ref || validated.draftDigest !== decision.openapi.digest) fail("OpenAPI Validation 未绑定当前权威 YAML");
46
+ if (decision.draft_review.draft_ref !== decision.openapi.ref || decision.draft_review.draft_digest !== decision.openapi.digest || decision.draft_review.blocking_findings.length) fail("OpenAPI Draft Review 未批准当前权威 YAML");
47
+ if (decision.freeze.version !== decision.openapi.version || decision.freeze.draft_ref !== decision.openapi.ref || decision.freeze.draft_digest !== decision.openapi.digest) fail("OpenAPI Freeze 未绑定当前权威 YAML 版本和摘要");
48
+ return { decision, openapi: decision.openapi, binding: { ref: binding.ref, version: binding.version, digest: binding.digest, impact: decision.impact } };
49
+ }
@@ -0,0 +1,69 @@
1
+ import assert from "node:assert/strict";
2
+ import { createHash } from "node:crypto";
3
+ import { mkdtempSync, mkdirSync, readFileSync, rmSync, writeFileSync } from "node:fs";
4
+ import os from "node:os";
5
+ import path from "node:path";
6
+ import test from "node:test";
7
+ import { validateApiContractDecision } from "./api-contract-decision.mjs";
8
+
9
+ const digest = (bytes) => `sha256:${createHash("sha256").update(bytes).digest("hex")}`;
10
+
11
+ function write(root, ref, value) {
12
+ const file = path.join(root, ref);
13
+ mkdirSync(path.dirname(file), { recursive: true });
14
+ writeFileSync(file, typeof value === "string" ? value : `${JSON.stringify(value, null, 2)}\n`);
15
+ return { ref, file, digest: digest(readFileSync(file)) };
16
+ }
17
+
18
+ function notApplicableFixture() {
19
+ const root = mkdtempSync(path.join(os.tmpdir(), "api-contract-decision-"));
20
+ const assessment = write(root, "api-impact.json", { api: false, project_id: "demo" });
21
+ const evidence = write(root, "api-impact-evidence.md", "无 API 影响证据。\n");
22
+ const decision = {
23
+ schema_version: 1,
24
+ kind: "api-contract-decision",
25
+ decision_id: "api-contract.demo",
26
+ decision_version: "v1",
27
+ status: "approved",
28
+ current_version: true,
29
+ impact: "not-applicable",
30
+ assessment_ref: assessment.ref,
31
+ assessment_digest: assessment.digest,
32
+ evidence_refs: [evidence.ref],
33
+ reason: "不新增或修改 HTTP、消息或集成接口",
34
+ };
35
+ const asset = write(root, "api-contract-decision.json", decision);
36
+ return { root, assessment, evidence, decision, asset, binding: { ref: asset.ref, version: "v1", digest: asset.digest, impact: "not-applicable" } };
37
+ }
38
+
39
+ test("API not-applicable 决定必须绑定影响评估、原因和可读证据", () => {
40
+ const data = notApplicableFixture();
41
+ try {
42
+ assert.equal(validateApiContractDecision(data.binding, { root: data.root }).decision.impact, "not-applicable");
43
+ for (const mutation of [
44
+ (value) => { delete value.reason; },
45
+ (value) => { value.evidence_refs = []; },
46
+ (value) => { value.openapi = { id: "openapi.demo", ref: "empty.yaml", version: "v1", digest: `sha256:${"0".repeat(64)}` }; },
47
+ ]) {
48
+ const value = structuredClone(data.decision);
49
+ mutation(value);
50
+ const changed = write(data.root, "api-contract-decision.json", value);
51
+ assert.throws(() => validateApiContractDecision({ ...data.binding, digest: changed.digest }, { root: data.root }));
52
+ }
53
+ } finally {
54
+ rmSync(data.root, { recursive: true, force: true });
55
+ }
56
+ });
57
+
58
+ test("API Decision 或影响评估原始字节漂移即失效", () => {
59
+ const data = notApplicableFixture();
60
+ try {
61
+ writeFileSync(data.asset.file, "\n", { flag: "a" });
62
+ assert.throws(() => validateApiContractDecision(data.binding, { root: data.root }), /摘要漂移/);
63
+ const restored = write(data.root, data.asset.ref, data.decision);
64
+ writeFileSync(data.assessment.file, "\n", { flag: "a" });
65
+ assert.throws(() => validateApiContractDecision({ ...data.binding, digest: restored.digest }, { root: data.root }), /摘要漂移/);
66
+ } finally {
67
+ rmSync(data.root, { recursive: true, force: true });
68
+ }
69
+ });
@@ -0,0 +1,123 @@
1
+ import { createHash } from "node:crypto";
2
+ import { existsSync, readFileSync } from "node:fs";
3
+ import path from "node:path";
4
+ import { parseDocument } from "../vendor/yaml.mjs";
5
+ import { loadApprovalRecord, validateApprovalRecord } from "./approval-record.mjs";
6
+ import { validateJsonSchema } from "./json-schema.mjs";
7
+ import { ROOT } from "./lifecycle-registry.mjs";
8
+ import { validateTechnicalDesign } from "../../.agents/skills/yss-technical-design/scripts/validate-technical-design.mjs";
9
+ import { validateApiContractDecision } from "./api-contract-decision.mjs";
10
+
11
+ const DATA_DECISION_SCHEMA = path.join(ROOT, "docs/process/schemas/data-architecture-decision.schema.json");
12
+
13
+ const fail = (message) => { throw new TypeError(message); };
14
+ const digest = (bytes) => `sha256:${createHash("sha256").update(bytes).digest("hex")}`;
15
+ const text = (value) => typeof value === "string" && value.trim().length > 0;
16
+
17
+ function resolveLocalRef(root, ref, label) {
18
+ if (!text(ref) || /^[a-z][a-z0-9+.-]*:\/\//i.test(ref)) fail(`${label} 必须是可读取的本地文件引用`);
19
+ const resolved = path.isAbsolute(ref) ? path.normalize(ref) : path.resolve(root, ref);
20
+ if (!existsSync(resolved)) fail(`${label} 不可读取: ${ref}`);
21
+ return resolved;
22
+ }
23
+
24
+ export function findGovernanceRoot(contractFile) {
25
+ let current = path.dirname(path.resolve(contractFile));
26
+ const fallback = current;
27
+ while (true) {
28
+ if (existsSync(path.join(current, "yss-project.yaml"))) return current;
29
+ const parent = path.dirname(current);
30
+ if (parent === current) return fallback;
31
+ current = parent;
32
+ }
33
+ }
34
+
35
+ function readDocument(root, binding, label) {
36
+ if (!binding || !text(binding.ref) || !text(binding.digest)) fail(`${label} 缺少 ref/digest`);
37
+ const file = resolveLocalRef(root, binding.ref, label);
38
+ const bytes = readFileSync(file);
39
+ if (digest(bytes) !== binding.digest) fail(`${label} 原始字节摘要漂移`);
40
+ const document = parseDocument(bytes.toString("utf8"), { maxAliasCount: 0, uniqueKeys: true });
41
+ if (document.errors.length) fail(`${label} 无法解析: ${document.errors[0].message}`);
42
+ const value = document.toJS({ maxAliasCount: 0 });
43
+ if (!value || typeof value !== "object" || Array.isArray(value)) fail(`${label} 必须是对象`);
44
+ return { file, bytes, value };
45
+ }
46
+
47
+ function requireReadableRefs(root, refs, label) {
48
+ if (!Array.isArray(refs) || refs.length === 0) fail(`${label} 必须包含可读取证据`);
49
+ for (const ref of refs) resolveLocalRef(root, ref, label);
50
+ }
51
+
52
+ function requireArtifactBinding(record, expected, label) {
53
+ const binding = (record.artifact_bindings || []).find((item) => item?.id === expected.id);
54
+ if (!binding || binding.version !== expected.version || binding.digest !== expected.digest) fail(`${label} 未绑定当前资产版本和摘要`);
55
+ }
56
+
57
+ function requireExactBinding(actual, expected, label, { impact = false, id = false } = {}) {
58
+ const keys = ["ref", "version", "digest", ...(impact ? ["impact"] : []), ...(id ? ["id"] : [])];
59
+ if (!actual || keys.some((key) => actual[key] !== expected[key])) fail(`${label} 未原子绑定当前资产`);
60
+ }
61
+
62
+ function requireEngineeringPackage(root, approval, contract, technical, data, api, prerequisites) {
63
+ const packageFile = resolveLocalRef(root, approval.subject_ref, "工程合同批准主体");
64
+ const packageDocument = parseDocument(readFileSync(packageFile, "utf8"), { maxAliasCount: 0, uniqueKeys: true });
65
+ if (packageDocument.errors.length) fail(`工程合同批准主体无法解析: ${packageDocument.errors[0].message}`);
66
+ const value = packageDocument.toJS({ maxAliasCount: 0 });
67
+ if (value?.schema_version !== 1 || value?.kind !== "engineering-contract-package" || value?.project_id !== contract.project_name) fail("工程合同批准主体必须是当前项目的 engineering-contract-package v1");
68
+ requireExactBinding(value.technical_design, { ...prerequisites.technical_design, version: technical.value.version }, "工程合同包 Technical Design");
69
+ requireExactBinding(value.data_architecture_decision, { ...prerequisites.data_architecture_decision, version: data.value.decision_version, impact: data.value.impact }, "工程合同包 Data Architecture Decision", { impact: true });
70
+ requireExactBinding(value.api_contract_decision, { ...prerequisites.api_contract_decision, version: api.decision.decision_version, impact: api.decision.impact }, "工程合同包 API Contract Decision", { impact: true });
71
+ if (api.decision.impact === "required") {
72
+ requireExactBinding(value.frozen_openapi, api.decision.openapi, "工程合同包冻结 OpenAPI", { id: true });
73
+ } else if (Object.hasOwn(value, "frozen_openapi")) {
74
+ fail("API not-applicable 的工程合同包禁止携带 frozen_openapi 占位字段");
75
+ }
76
+ }
77
+
78
+ export async function validateBackendScaffoldPrerequisites(contract, { contractFile, root = findGovernanceRoot(contractFile) } = {}) {
79
+ if (contract?.schema_version !== 4 || contract?.delivery_role !== "backend") fail("后端新生成只接受 Project Scaffold Contract v4");
80
+ const prerequisites = contract.design_prerequisites;
81
+ if (!prerequisites || typeof prerequisites !== "object") fail("后端脚手架合同缺少 design_prerequisites");
82
+
83
+ const technical = readDocument(root, prerequisites.technical_design, "Technical Design");
84
+ if (technical.value.schema_version !== 2 || technical.value.status !== "approved" || technical.value.version !== prerequisites.technical_design.version) fail("Technical Design 必须是 approved 的当前 v2 合同");
85
+ if (technical.value.architecture?.family !== contract.architecture_family || technical.value.architecture?.project_id !== contract.project_name || technical.value.architecture?.decision_digest !== contract.decision_digest) fail("Technical Design 与脚手架架构决定不一致");
86
+ await validateTechnicalDesign(technical.value, { root });
87
+
88
+ const data = readDocument(root, prerequisites.data_architecture_decision, "数据架构决定");
89
+ validateJsonSchema(data.value, DATA_DECISION_SCHEMA, { label: "Data Architecture Decision v1" });
90
+ if (data.value.decision_version !== prerequisites.data_architecture_decision.version) fail("数据架构决定版本不匹配");
91
+ const assessment = resolveLocalRef(root, data.value.assessment_ref, "数据影响评估");
92
+ if (digest(readFileSync(assessment)) !== data.value.assessment_digest) fail("数据影响评估摘要漂移");
93
+ requireReadableRefs(root, data.value.evidence_refs, "数据架构决定证据");
94
+ if (data.value.impact === "required") {
95
+ const architecture = resolveLocalRef(root, data.value.data_architecture_ref, "数据架构文档");
96
+ if (digest(readFileSync(architecture)) !== data.value.data_architecture_digest) fail("数据架构文档摘要漂移");
97
+ requireReadableRefs(root, data.value.review_evidence_refs, "数据架构评审证据");
98
+ }
99
+
100
+ const api = validateApiContractDecision(prerequisites.api_contract_decision, { root });
101
+
102
+ const approvalRef = prerequisites.engineering_contract_approval_ref;
103
+ if (approvalRef !== contract.lifecycle_approval_ref || approvalRef !== contract.approval?.approval_ref) fail("工程合同批准引用与脚手架合同不一致");
104
+ const approvalFile = resolveLocalRef(root, approvalRef, "工程合同批准记录");
105
+ const approval = loadApprovalRecord(approvalFile);
106
+ validateApprovalRecord(approval, { requireApproved: true, root });
107
+ if (approval.gate_id !== "gate.engineering-contract-approved") fail("工程合同批准记录 gate_id 必须为 gate.engineering-contract-approved");
108
+ if (!Array.isArray(approval.approval_scope) || !approval.approval_scope.includes(contract.contract_id) || !approval.approval_scope.includes(contract.project_name)) fail("工程合同批准范围未覆盖当前合同和项目");
109
+ requireEngineeringPackage(root, approval, contract, technical, data, api, prerequisites);
110
+ requireArtifactBinding(approval, { id: technical.value.technical_design_id, version: technical.value.version, digest: prerequisites.technical_design.digest }, "工程合同批准记录");
111
+ requireArtifactBinding(approval, { id: data.value.decision_id, version: data.value.decision_version, digest: prerequisites.data_architecture_decision.digest }, "工程合同批准记录");
112
+ requireArtifactBinding(approval, { id: api.decision.decision_id, version: api.decision.decision_version, digest: prerequisites.api_contract_decision.digest }, "工程合同批准记录");
113
+ if (api.decision.impact === "required") {
114
+ requireArtifactBinding(approval, { id: api.decision.openapi.id, version: api.decision.openapi.version, digest: api.decision.openapi.digest }, "工程合同批准记录");
115
+ }
116
+
117
+ return {
118
+ technical_design: { ref: prerequisites.technical_design.ref, version: technical.value.version, digest: prerequisites.technical_design.digest },
119
+ data_architecture_decision: { ref: prerequisites.data_architecture_decision.ref, version: data.value.decision_version, digest: prerequisites.data_architecture_decision.digest, impact: data.value.impact },
120
+ api_contract_decision: { ref: prerequisites.api_contract_decision.ref, version: api.decision.decision_version, digest: prerequisites.api_contract_decision.digest, impact: api.decision.impact },
121
+ engineering_contract_approval_ref: approvalRef,
122
+ };
123
+ }
@@ -0,0 +1,87 @@
1
+ import { createHash } from "node:crypto";
2
+ import { lstat, readFile, readdir } from "node:fs/promises";
3
+ import path from "node:path";
4
+
5
+ const sha256 = (bytes) => createHash("sha256").update(bytes).digest("hex");
6
+ const normalizedDigest = (value) => String(value ?? "").replace(/^sha256:/, "");
7
+
8
+ async function collectFiles(root) {
9
+ const files = [];
10
+ async function visit(directory) {
11
+ for (const entry of (await readdir(directory, { withFileTypes: true })).sort((a, b) => a.name.localeCompare(b.name))) {
12
+ if ([".git", "target", "node_modules"].includes(entry.name)) continue;
13
+ const target = path.join(directory, entry.name);
14
+ const relative = path.relative(root, target).split(path.sep).join("/");
15
+ if (entry.isDirectory()) await visit(target);
16
+ else files.push({ relative, target, symlink: entry.isSymbolicLink() });
17
+ }
18
+ }
19
+ await visit(root);
20
+ return files;
21
+ }
22
+
23
+ function isBusinessFile(relative, manifest) {
24
+ if (relative === manifest.bootstrap_main_source || /(^|\/)package-info\.java$/.test(relative)) return false;
25
+ return /(^|\/)src\/(main|test)\/java\/.+\.java$/.test(relative)
26
+ || /(^|\/)src\/main\/resources\/.+\.(sql|xml|ya?ml|properties)$/.test(relative)
27
+ || /(^|\/)(db|mapper|repository|controller|domain)(\/|$)/i.test(relative)
28
+ || /(^|\/)(Controller|Repository|Mapper|Aggregate|Entity)\.java$/i.test(relative);
29
+ }
30
+
31
+ export async function auditLegacyBackendScaffold(projectRoot, { manifestRef = ".yss/scaffold-generation.json" } = {}) {
32
+ const root = path.resolve(projectRoot);
33
+ const manifestFile = path.resolve(root, manifestRef);
34
+ const relativeManifest = path.relative(root, manifestFile);
35
+ if (relativeManifest.startsWith("..") || path.isAbsolute(relativeManifest)) throw new TypeError("Manifest 必须位于项目根内");
36
+ const manifestBytes = await readFile(manifestFile).catch(() => { throw new TypeError(`Manifest 不可读取: ${manifestRef}`); });
37
+ let manifest;
38
+ try { manifest = JSON.parse(manifestBytes); } catch { throw new TypeError("Manifest 必须是 JSON 对象"); }
39
+ if (manifest?.schema_version !== 3) throw new TypeError("恢复审计只接受历史 v3 Manifest");
40
+ if (!Array.isArray(manifest?.ownership?.generated_files)) throw new TypeError("历史 v3 Manifest 缺少 ownership.generated_files");
41
+
42
+ const generated = new Map(manifest.ownership.generated_files.map((entry) => [entry.path, entry]));
43
+ const generatedFileDrift = [];
44
+ for (const [relative, entry] of generated) {
45
+ const target = path.resolve(root, relative);
46
+ const inside = path.relative(root, target);
47
+ if (inside.startsWith("..") || path.isAbsolute(inside)) {
48
+ generatedFileDrift.push({ path: relative, reason: "path-outside-project" });
49
+ continue;
50
+ }
51
+ try {
52
+ const info = await lstat(target);
53
+ if (!info.isFile()) generatedFileDrift.push({ path: relative, reason: "not-a-regular-file" });
54
+ else {
55
+ const actual = sha256(await readFile(target));
56
+ if (actual !== normalizedDigest(entry.sha256)) generatedFileDrift.push({ path: relative, reason: "digest-drift", expected: normalizedDigest(entry.sha256), actual });
57
+ }
58
+ } catch (error) {
59
+ if (error.code === "ENOENT") generatedFileDrift.push({ path: relative, reason: "missing" });
60
+ else throw error;
61
+ }
62
+ }
63
+
64
+ const files = await collectFiles(root);
65
+ const unownedFiles = files.map((entry) => entry.relative).filter((relative) => relative !== manifestRef && !generated.has(relative));
66
+ const businessFiles = files
67
+ .filter((entry) => entry.symlink || (unownedFiles.includes(entry.relative) && isBusinessFile(entry.relative, manifest)))
68
+ .map((entry) => entry.relative);
69
+ const premature = businessFiles.length > 0;
70
+ const state = premature ? "premature-implementation-detected" : generatedFileDrift.length > 0 ? "generated-file-drift" : "unchanged-mechanical-scaffold";
71
+ return {
72
+ schema_version: 1,
73
+ kind: "legacy-backend-scaffold-ownership-audit",
74
+ status: state === "unchanged-mechanical-scaffold" ? "reconcilable" : "blocked",
75
+ manifest_ref: manifestRef,
76
+ manifest_digest: `sha256:${sha256(manifestBytes)}`,
77
+ manifest_schema_version: 3,
78
+ ownership_state: state,
79
+ premature_implementation: premature,
80
+ generated_file_drift: generatedFileDrift,
81
+ business_files: businessFiles,
82
+ unowned_files: unownedFiles,
83
+ recovery_requirements: state === "unchanged-mechanical-scaffold"
84
+ ? ["approved-current-technical-design", "data-architecture-decision", "gate.engineering-contract-approved", "recovery-approval"]
85
+ : ["preserve-all-files", "design-reconciliation", "difference-review", "current-user-approval"],
86
+ };
87
+ }