create-yss-spec 3.3.8 → 3.4.3

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 (908) hide show
  1. package/README.md +1 -1
  2. package/package.json +2 -2
  3. package/template/.agents/skills/.strategic-design-skills-manifest.json +3 -13
  4. package/template/.agents/skills/archify/SKILL.md +1 -1
  5. package/template/.agents/skills/code-review/SKILL.md +12 -8
  6. package/template/.agents/skills/file-export-download/SKILL.md +1 -1
  7. package/template/.agents/skills/frontend-commit/SKILL.md +1 -1
  8. package/template/.agents/skills/java-backend-commit/SKILL.md +1 -1
  9. package/template/.agents/skills/llm-wiki/SKILL.md +1 -6
  10. package/template/.agents/skills/lombok/SKILL.md +10 -336
  11. package/template/.agents/skills/lombok/references/annotation-examples.md +307 -0
  12. package/template/.agents/skills/maintaining-skills/SKILL.md +2 -1
  13. package/template/.agents/skills/maintaining-skills/references/authoring.md +27 -0
  14. package/template/.agents/skills/mapstruct/SKILL.md +11 -318
  15. package/template/.agents/skills/mapstruct/references/annotation-examples.md +300 -0
  16. package/template/.agents/skills/page-form-module/SKILL.md +1 -1
  17. package/template/.agents/skills/page-skeleton/SKILL.md +1 -1
  18. package/template/.agents/skills/theme-token-usage/SKILL.md +1 -1
  19. package/template/.agents/skills/to-tickets/SKILL.md +1 -1
  20. package/template/.agents/skills/using-git-worktrees/SKILL.md +1 -1
  21. package/template/.agents/skills/wayfinder/SKILL.md +1 -1
  22. package/template/.agents/skills/yedit-table-usage/SKILL.md +1 -1
  23. package/template/.agents/skills/yss-api-integration/SKILL.md +1 -1
  24. package/template/.agents/skills/yss-audit-log/SKILL.md +1 -1
  25. package/template/.agents/skills/yss-cache/SKILL.md +1 -1
  26. package/template/.agents/skills/yss-ddd-scaffold-generator/SKILL.md +18 -5
  27. package/template/.agents/skills/yss-ddd-scaffold-generator/assets/templates/pom/application-pom.xml.template +1 -1
  28. package/template/.agents/skills/yss-ddd-scaffold-generator/assets/templates/pom/parent-pom.xml.template +15 -10
  29. package/template/.agents/skills/yss-ddd-scaffold-generator/assets/templates/pom/web-pom.xml.template +3 -3
  30. package/template/.agents/skills/yss-ddd-scaffold-generator/references/USAGE_EXAMPLES.md +1 -1
  31. package/template/.agents/skills/yss-ddd-scaffold-generator/references/layer-skill-routing.md +18 -0
  32. package/template/.agents/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-parent/SKILL.md +4 -4
  33. package/template/.agents/skills/yss-ddd-scaffold-generator/scripts/first-slice-compatibility.test.mjs +18 -5
  34. package/template/.agents/skills/yss-ddd-scaffold-generator/scripts/first-slice-verification.test.mjs +5 -2
  35. package/template/.agents/skills/yss-ddd-scaffold-generator/scripts/generate_scaffold.mjs +21 -17
  36. package/template/.agents/skills/yss-ddd-scaffold-generator/scripts/run_first_slice_verification.mjs +4 -2
  37. package/template/.agents/skills/yss-ddd-scaffold-generator/scripts/run_scaffold_verification.mjs +41 -7
  38. package/template/.agents/skills/yss-ddd-scaffold-generator/scripts/scaffold-generator.test.mjs +109 -13
  39. package/template/.agents/skills/yss-design-system/SKILL.md +19 -19
  40. package/template/.agents/skills/yss-design-system/references/data-quality-theme.md +13 -0
  41. package/template/.agents/skills/yss-design-system/references/design-qa-theme.md +3 -1
  42. package/template/.agents/skills/yss-design-system/references/design-system.md +7 -9
  43. package/template/.agents/skills/yss-distributed-id/SKILL.md +1 -1
  44. package/template/.agents/skills/yss-dto/SKILL.md +5 -1
  45. package/template/.agents/skills/yss-excel-mvc/SKILL.md +1 -1
  46. package/template/.agents/skills/yss-exception/SKILL.md +5 -1
  47. package/template/.agents/skills/yss-formily/SKILL.md +21 -258
  48. package/template/.agents/skills/yss-formily-schema-generator/SKILL.md +1 -1
  49. package/template/.agents/skills/yss-frontend-scaffold-generator/SKILL.md +17 -13
  50. package/template/.agents/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/.eslintrc.cjs +1 -0
  51. package/template/.agents/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/.npmrc.example +2 -0
  52. package/template/.agents/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/DESIGN.md +264 -0
  53. package/template/.agents/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/README.md +13 -0
  54. package/template/.agents/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/__yss_dotfile__.gitignore +6 -0
  55. package/template/.agents/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/micro-config.json +5 -0
  56. package/template/.agents/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/orval.config.ts +2 -0
  57. package/template/.agents/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/package.json +30 -0
  58. package/template/.agents/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/.env.development +1 -0
  59. package/template/.agents/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/.env.example +5 -0
  60. package/template/.agents/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/.env.production +1 -0
  61. package/template/.agents/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/.env.production.standalone +1 -0
  62. package/template/.agents/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/index.html +2 -0
  63. package/template/.agents/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/package.json +34 -0
  64. package/template/.agents/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/public/favicon.svg +1 -0
  65. package/template/.agents/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/src/App.vue +15 -0
  66. package/template/.agents/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/src/api/mutator.ts +7 -0
  67. package/template/.agents/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/src/components/ThemeScope.vue +11 -0
  68. package/template/.agents/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/src/config/theme.json +41 -0
  69. package/template/.agents/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/src/env.d.ts +1 -0
  70. package/template/.agents/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/src/main.ts +40 -0
  71. package/template/.agents/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/src/router/index.ts +8 -0
  72. package/template/.agents/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/src/store/theme.ts +37 -0
  73. package/template/.agents/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/src/styles/index.less +6 -0
  74. package/template/.agents/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/src/types/microAppBridge.ts +28 -0
  75. package/template/.agents/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/src/utils/microAppRouterBridge.ts +266 -0
  76. package/template/.agents/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/src/views/NotFound.vue +1 -0
  77. package/template/.agents/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/src/views/Welcome.vue +1 -0
  78. package/template/.agents/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/tsconfig.json +23 -0
  79. package/template/.agents/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/vite.config.ts +16 -0
  80. package/template/.agents/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/pnpm-lock.yaml +9026 -0
  81. package/template/.agents/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/pnpm-workspace.yaml +7 -0
  82. package/template/.agents/skills/yss-frontend-scaffold-generator/references/data-quality-baseline.md +17 -0
  83. package/template/.agents/skills/yss-frontend-scaffold-generator/references/data-quality-v1.manifest.json +49 -0
  84. package/template/.agents/skills/yss-frontend-scaffold-generator/scripts/generate_scaffold.mjs +41 -13
  85. package/template/.agents/skills/yss-frontend-scaffold-generator/scripts/refresh_baseline.mjs +29 -0
  86. package/template/.agents/skills/yss-frontend-scaffold-generator/scripts/run_scaffold_verification.mjs +5 -1
  87. package/template/.agents/skills/yss-frontend-scaffold-generator/scripts/scaffold-generator.test.mjs +32 -0
  88. package/template/.agents/skills/yss-hook/SKILL.md +1 -1
  89. package/template/.agents/skills/yss-implementation-contract-compiler/SKILL.md +14 -6
  90. package/template/.agents/skills/yss-implementation-contract-compiler/agents/openai.yaml +1 -1
  91. package/template/.agents/skills/yss-implementation-contract-compiler/references/boundaries.md +5 -3
  92. package/template/.agents/skills/yss-implementation-contract-compiler/references/compiler-contract.yaml +29 -5
  93. package/template/.agents/skills/yss-implementation-contract-compiler/references/slice-implementation-contract-v2.md +214 -0
  94. package/template/.agents/skills/yss-implementation-contract-compiler/references/slice-implementation-contract.md +66 -204
  95. package/template/.agents/skills/yss-layered-mvc-scaffold-generator/SKILL.md +17 -4
  96. package/template/.agents/skills/yss-layered-mvc-scaffold-generator/agents/openai.yaml +1 -1
  97. package/template/.agents/skills/yss-layered-mvc-scaffold-generator/scripts/generate_scaffold.mjs +38 -25
  98. package/template/.agents/skills/yss-layered-mvc-scaffold-generator/scripts/run_scaffold_verification.mjs +1 -1
  99. package/template/.agents/skills/yss-layered-mvc-scaffold-generator/scripts/scaffold-generator.test.mjs +101 -13
  100. package/template/.agents/skills/yss-mvc-data-analysis-project-initializer/SKILL.md +2 -2
  101. package/template/.agents/skills/yss-mvc-data-analysis-project-initializer/scripts/generate_project.mjs +1 -1
  102. package/template/.agents/skills/yss-mybatis/SKILL.md +4 -0
  103. package/template/.agents/skills/yss-openapi-draft-review/SKILL.md +1 -1
  104. package/template/.agents/skills/yss-openapi-governance/SKILL.md +3 -1
  105. package/template/.agents/skills/yss-product-lifecycle/SKILL.md +4 -4
  106. package/template/.agents/skills/yss-product-lifecycle/references/orchestration-contract.yaml +50 -17
  107. package/template/.agents/skills/yss-product-lifecycle/references/orchestration.md +6 -2
  108. package/template/.agents/skills/yss-product-lifecycle/references/state-model.md +3 -1
  109. package/template/.agents/skills/yss-product-lifecycle/references/user-decisions.md +23 -3
  110. package/template/.agents/skills/yss-prototype-stage/SKILL.md +13 -9
  111. package/template/.agents/skills/yss-prototype-stage/assets/antd-authoring/package.json +16 -0
  112. package/template/.agents/skills/yss-prototype-stage/assets/antd-authoring/pnpm-lock.yaml +1678 -0
  113. package/template/.agents/skills/yss-prototype-stage/assets/antd-authoring/workbench.jsx +23 -0
  114. package/template/.agents/skills/yss-prototype-stage/assets/native-workbench/app.js +20 -0
  115. package/template/.agents/skills/yss-prototype-stage/assets/native-workbench/index.html +11 -0
  116. package/template/.agents/skills/yss-prototype-stage/assets/native-workbench/styles.css +28 -0
  117. package/template/.agents/skills/yss-prototype-stage/assets/offline-html/app.js +50 -0
  118. package/template/.agents/skills/yss-prototype-stage/assets/offline-html/index.html +38 -0
  119. package/template/.agents/skills/yss-prototype-stage/assets/offline-html/scenarios.js +7 -0
  120. package/template/.agents/skills/yss-prototype-stage/assets/offline-html/styles.css +20 -0
  121. package/template/.agents/skills/yss-prototype-stage/references/antd-component-catalog.json +736 -0
  122. package/template/.agents/skills/yss-prototype-stage/references/antd-integration.md +61 -0
  123. package/template/.agents/skills/yss-prototype-stage/references/html-prototype-practices.md +14 -0
  124. package/template/.agents/skills/yss-prototype-stage/references/product-design-adapter.md +28 -51
  125. package/template/.agents/skills/yss-prototype-stage/references/prototype-profile-routing.md +15 -4
  126. package/template/.agents/skills/yss-prototype-stage/scripts/build-antd-prototype.mjs +71 -0
  127. package/template/.agents/skills/yss-prototype-stage/scripts/collect-antd-reference.mjs +26 -0
  128. package/template/.agents/skills/yss-prototype-stage/scripts/offline-html.mjs +121 -0
  129. package/template/.agents/skills/yss-prototype-stage/scripts/prototype-contract.mjs +52 -143
  130. package/template/.agents/skills/yss-prototype-stage/tests/antd-reference.test.mjs +24 -0
  131. package/template/.agents/skills/yss-prototype-stage/tests/browser-smoke.mjs +77 -0
  132. package/template/.agents/skills/yss-prototype-stage/tests/run-scenarios.mjs +73 -26
  133. package/template/.agents/skills/yss-prototype-stage/tests/workbench-smoke.mjs +57 -0
  134. package/template/.agents/skills/yss-repository/SKILL.md +4 -0
  135. package/template/.agents/skills/yss-research/SKILL.md +1 -1
  136. package/template/.agents/skills/yss-resilience4j/SKILL.md +1 -1
  137. package/template/.agents/skills/yss-security-algorithm/SKILL.md +1 -1
  138. package/template/.agents/skills/yss-skill-source-index-refresh/references/source-map-config.md +0 -1
  139. package/template/.agents/skills/yss-skill-source-index-refresh/scripts/refresh-yss-skill-index.mjs +0 -1
  140. package/template/.agents/skills/yss-tactical-design/SKILL.md +5 -1
  141. package/template/.agents/skills/yss-technical-design/SKILL.md +4 -0
  142. package/template/.agents/skills/yss-technical-design/scripts/validate-technical-design.mjs +2 -2
  143. package/template/.agents/skills/yss-ui/SKILL.md +4 -3
  144. package/template/.agents/skills/yss-ui/references/component-routing.md +11 -10
  145. package/template/.agents/skills/yss-ui/references/specialized-components.md +52 -0
  146. package/template/.agents/skills/yss-ui-business-page-generation/SKILL.md +1 -1
  147. package/template/.agents/skills/yss-up-springboot3/SKILL.md +1 -1
  148. package/template/.agents/skills/yss-use-table-height/SKILL.md +1 -1
  149. package/template/.agents/skills/yss-use-tree-height/SKILL.md +1 -1
  150. package/template/.agents/skills/yss-userinfo/SKILL.md +1 -1
  151. package/template/.agents/skills/yss-validation/SKILL.md +5 -1
  152. package/template/.agents/skills/yss-web-controller/SKILL.md +5 -1
  153. package/template/.agents/skills/yss-web-controller/scripts/generate_controller.mjs +9 -5
  154. package/template/.agents/skills/yss-web-controller/scripts/generate_controller.test.mjs +1 -1
  155. package/template/.agents/skills/ytable-usage/SKILL.md +1 -1
  156. package/template/.agents/skills/ytree-usage/SKILL.md +1 -1
  157. package/template/.codex/skills/archify/SKILL.md +1 -1
  158. package/template/.codex/skills/code-review/SKILL.md +12 -8
  159. package/template/.codex/skills/data-analytics/skills/analyze-data-quality/SKILL.md +1 -1
  160. package/template/.codex/skills/data-analytics/skills/build-dashboard/SKILL.md +1 -1
  161. package/template/.codex/skills/data-analytics/skills/build-report/SKILL.md +1 -1
  162. package/template/.codex/skills/data-analytics/skills/design-kpis/SKILL.md +1 -1
  163. package/template/.codex/skills/data-analytics/skills/gather-business-context/SKILL.md +1 -1
  164. package/template/.codex/skills/data-analytics/skills/index/SKILL.md +1 -1
  165. package/template/.codex/skills/data-analytics/skills/jupyter-notebooks/SKILL.md +1 -1
  166. package/template/.codex/skills/data-analytics/skills/kpi-reporting/SKILL.md +1 -1
  167. package/template/.codex/skills/data-analytics/skills/market-sizing/SKILL.md +1 -1
  168. package/template/.codex/skills/data-analytics/skills/metric-diagnostics/SKILL.md +1 -1
  169. package/template/.codex/skills/data-analytics/skills/product-business-analysis/SKILL.md +1 -1
  170. package/template/.codex/skills/data-analytics/skills/spreadsheets/SKILL.md +1 -1
  171. package/template/.codex/skills/data-analytics/skills/validate-data/SKILL.md +1 -1
  172. package/template/.codex/skills/data-analytics/skills/visualize-data/SKILL.md +1 -1
  173. package/template/.codex/skills/file-export-download/SKILL.md +1 -1
  174. package/template/.codex/skills/frontend-commit/SKILL.md +1 -1
  175. package/template/.codex/skills/java-backend-commit/SKILL.md +1 -1
  176. package/template/.codex/skills/llm-wiki/SKILL.md +1 -6
  177. package/template/.codex/skills/lombok/SKILL.md +10 -336
  178. package/template/.codex/skills/lombok/references/annotation-examples.md +307 -0
  179. package/template/.codex/skills/maintaining-skills/SKILL.md +2 -1
  180. package/template/.codex/skills/maintaining-skills/references/authoring.md +27 -0
  181. package/template/.codex/skills/mapstruct/SKILL.md +11 -318
  182. package/template/.codex/skills/mapstruct/references/annotation-examples.md +300 -0
  183. package/template/.codex/skills/page-form-module/SKILL.md +1 -1
  184. package/template/.codex/skills/page-skeleton/SKILL.md +1 -1
  185. package/template/.codex/skills/product-design/skills/audit/SKILL.md +1 -1
  186. package/template/.codex/skills/product-design/skills/design-qa/SKILL.md +1 -1
  187. package/template/.codex/skills/product-design/skills/get-context/SKILL.md +1 -1
  188. package/template/.codex/skills/product-design/skills/ideate/SKILL.md +1 -1
  189. package/template/.codex/skills/product-design/skills/image-to-code/SKILL.md +1 -1
  190. package/template/.codex/skills/product-design/skills/index/SKILL.md +1 -1
  191. package/template/.codex/skills/product-design/skills/prototype/SKILL.md +1 -1
  192. package/template/.codex/skills/product-design/skills/research/SKILL.md +1 -1
  193. package/template/.codex/skills/product-design/skills/user-context/SKILL.md +1 -1
  194. package/template/.codex/skills/theme-token-usage/SKILL.md +1 -1
  195. package/template/.codex/skills/to-tickets/SKILL.md +1 -1
  196. package/template/.codex/skills/using-git-worktrees/SKILL.md +1 -1
  197. package/template/.codex/skills/wayfinder/SKILL.md +1 -1
  198. package/template/.codex/skills/yedit-table-usage/SKILL.md +1 -1
  199. package/template/.codex/skills/yss-api-integration/SKILL.md +1 -1
  200. package/template/.codex/skills/yss-audit-log/SKILL.md +1 -1
  201. package/template/.codex/skills/yss-cache/SKILL.md +1 -1
  202. package/template/.codex/skills/yss-ddd-scaffold-generator/SKILL.md +18 -5
  203. package/template/.codex/skills/yss-ddd-scaffold-generator/assets/templates/pom/application-pom.xml.template +1 -1
  204. package/template/.codex/skills/yss-ddd-scaffold-generator/assets/templates/pom/parent-pom.xml.template +15 -10
  205. package/template/.codex/skills/yss-ddd-scaffold-generator/assets/templates/pom/web-pom.xml.template +3 -3
  206. package/template/.codex/skills/yss-ddd-scaffold-generator/references/USAGE_EXAMPLES.md +1 -1
  207. package/template/.codex/skills/yss-ddd-scaffold-generator/references/layer-skill-routing.md +18 -0
  208. package/template/.codex/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-parent/SKILL.md +4 -4
  209. package/template/.codex/skills/yss-ddd-scaffold-generator/scripts/first-slice-compatibility.test.mjs +18 -5
  210. package/template/.codex/skills/yss-ddd-scaffold-generator/scripts/first-slice-verification.test.mjs +5 -2
  211. package/template/.codex/skills/yss-ddd-scaffold-generator/scripts/generate_scaffold.mjs +21 -17
  212. package/template/.codex/skills/yss-ddd-scaffold-generator/scripts/run_first_slice_verification.mjs +4 -2
  213. package/template/.codex/skills/yss-ddd-scaffold-generator/scripts/run_scaffold_verification.mjs +41 -7
  214. package/template/.codex/skills/yss-ddd-scaffold-generator/scripts/scaffold-generator.test.mjs +109 -13
  215. package/template/.codex/skills/yss-design-system/SKILL.md +19 -19
  216. package/template/.codex/skills/yss-design-system/references/data-quality-theme.md +13 -0
  217. package/template/.codex/skills/yss-design-system/references/design-qa-theme.md +3 -1
  218. package/template/.codex/skills/yss-design-system/references/design-system.md +7 -9
  219. package/template/.codex/skills/yss-distributed-id/SKILL.md +1 -1
  220. package/template/.codex/skills/yss-dto/SKILL.md +5 -1
  221. package/template/.codex/skills/yss-excel-mvc/SKILL.md +1 -1
  222. package/template/.codex/skills/yss-exception/SKILL.md +5 -1
  223. package/template/.codex/skills/yss-formily/SKILL.md +21 -258
  224. package/template/.codex/skills/yss-formily-schema-generator/SKILL.md +1 -1
  225. package/template/.codex/skills/yss-frontend-scaffold-generator/SKILL.md +17 -13
  226. package/template/.codex/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/.eslintrc.cjs +1 -0
  227. package/template/.codex/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/.npmrc.example +2 -0
  228. package/template/.codex/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/DESIGN.md +264 -0
  229. package/template/.codex/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/README.md +13 -0
  230. package/template/.codex/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/__yss_dotfile__.gitignore +6 -0
  231. package/template/.codex/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/micro-config.json +5 -0
  232. package/template/.codex/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/orval.config.ts +2 -0
  233. package/template/.codex/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/package.json +30 -0
  234. package/template/.codex/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/.env.development +1 -0
  235. package/template/.codex/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/.env.example +5 -0
  236. package/template/.codex/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/.env.production +1 -0
  237. package/template/.codex/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/.env.production.standalone +1 -0
  238. package/template/.codex/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/index.html +2 -0
  239. package/template/.codex/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/package.json +34 -0
  240. package/template/.codex/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/public/favicon.svg +1 -0
  241. package/template/.codex/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/src/App.vue +15 -0
  242. package/template/.codex/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/src/api/mutator.ts +7 -0
  243. package/template/.codex/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/src/components/ThemeScope.vue +11 -0
  244. package/template/.codex/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/src/config/theme.json +41 -0
  245. package/template/.codex/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/src/env.d.ts +1 -0
  246. package/template/.codex/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/src/main.ts +40 -0
  247. package/template/.codex/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/src/router/index.ts +8 -0
  248. package/template/.codex/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/src/store/theme.ts +37 -0
  249. package/template/.codex/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/src/styles/index.less +6 -0
  250. package/template/.codex/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/src/types/microAppBridge.ts +28 -0
  251. package/template/.codex/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/src/utils/microAppRouterBridge.ts +266 -0
  252. package/template/.codex/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/src/views/NotFound.vue +1 -0
  253. package/template/.codex/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/src/views/Welcome.vue +1 -0
  254. package/template/.codex/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/tsconfig.json +23 -0
  255. package/template/.codex/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/vite.config.ts +16 -0
  256. package/template/.codex/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/pnpm-lock.yaml +9026 -0
  257. package/template/.codex/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/pnpm-workspace.yaml +7 -0
  258. package/template/.codex/skills/yss-frontend-scaffold-generator/references/data-quality-baseline.md +17 -0
  259. package/template/.codex/skills/yss-frontend-scaffold-generator/references/data-quality-v1.manifest.json +49 -0
  260. package/template/.codex/skills/yss-frontend-scaffold-generator/scripts/generate_scaffold.mjs +41 -13
  261. package/template/.codex/skills/yss-frontend-scaffold-generator/scripts/refresh_baseline.mjs +29 -0
  262. package/template/.codex/skills/yss-frontend-scaffold-generator/scripts/run_scaffold_verification.mjs +5 -1
  263. package/template/.codex/skills/yss-frontend-scaffold-generator/scripts/scaffold-generator.test.mjs +32 -0
  264. package/template/.codex/skills/yss-hook/SKILL.md +1 -1
  265. package/template/.codex/skills/yss-implementation-contract-compiler/SKILL.md +14 -6
  266. package/template/.codex/skills/yss-implementation-contract-compiler/agents/openai.yaml +1 -1
  267. package/template/.codex/skills/yss-implementation-contract-compiler/references/boundaries.md +5 -3
  268. package/template/.codex/skills/yss-implementation-contract-compiler/references/compiler-contract.yaml +29 -5
  269. package/template/.codex/skills/yss-implementation-contract-compiler/references/slice-implementation-contract-v2.md +214 -0
  270. package/template/.codex/skills/yss-implementation-contract-compiler/references/slice-implementation-contract.md +66 -204
  271. package/template/.codex/skills/yss-layered-mvc-scaffold-generator/SKILL.md +17 -4
  272. package/template/.codex/skills/yss-layered-mvc-scaffold-generator/agents/openai.yaml +1 -1
  273. package/template/.codex/skills/yss-layered-mvc-scaffold-generator/scripts/generate_scaffold.mjs +38 -25
  274. package/template/.codex/skills/yss-layered-mvc-scaffold-generator/scripts/run_scaffold_verification.mjs +1 -1
  275. package/template/.codex/skills/yss-layered-mvc-scaffold-generator/scripts/scaffold-generator.test.mjs +101 -13
  276. package/template/.codex/skills/yss-mvc-data-analysis-project-initializer/SKILL.md +2 -2
  277. package/template/.codex/skills/yss-mvc-data-analysis-project-initializer/scripts/generate_project.mjs +1 -1
  278. package/template/.codex/skills/yss-mybatis/SKILL.md +4 -0
  279. package/template/.codex/skills/yss-openapi-draft-review/SKILL.md +1 -1
  280. package/template/.codex/skills/yss-openapi-governance/SKILL.md +3 -1
  281. package/template/.codex/skills/yss-product-lifecycle/SKILL.md +4 -4
  282. package/template/.codex/skills/yss-product-lifecycle/references/orchestration-contract.yaml +50 -17
  283. package/template/.codex/skills/yss-product-lifecycle/references/orchestration.md +6 -2
  284. package/template/.codex/skills/yss-product-lifecycle/references/state-model.md +3 -1
  285. package/template/.codex/skills/yss-product-lifecycle/references/user-decisions.md +23 -3
  286. package/template/.codex/skills/yss-prototype-stage/SKILL.md +13 -9
  287. package/template/.codex/skills/yss-prototype-stage/assets/antd-authoring/package.json +16 -0
  288. package/template/.codex/skills/yss-prototype-stage/assets/antd-authoring/pnpm-lock.yaml +1678 -0
  289. package/template/.codex/skills/yss-prototype-stage/assets/antd-authoring/workbench.jsx +23 -0
  290. package/template/.codex/skills/yss-prototype-stage/assets/native-workbench/app.js +20 -0
  291. package/template/.codex/skills/yss-prototype-stage/assets/native-workbench/index.html +11 -0
  292. package/template/.codex/skills/yss-prototype-stage/assets/native-workbench/styles.css +28 -0
  293. package/template/.codex/skills/yss-prototype-stage/assets/offline-html/app.js +50 -0
  294. package/template/.codex/skills/yss-prototype-stage/assets/offline-html/index.html +38 -0
  295. package/template/.codex/skills/yss-prototype-stage/assets/offline-html/scenarios.js +7 -0
  296. package/template/.codex/skills/yss-prototype-stage/assets/offline-html/styles.css +20 -0
  297. package/template/.codex/skills/yss-prototype-stage/references/antd-component-catalog.json +736 -0
  298. package/template/.codex/skills/yss-prototype-stage/references/antd-integration.md +61 -0
  299. package/template/.codex/skills/yss-prototype-stage/references/html-prototype-practices.md +14 -0
  300. package/template/.codex/skills/yss-prototype-stage/references/product-design-adapter.md +28 -51
  301. package/template/.codex/skills/yss-prototype-stage/references/prototype-profile-routing.md +15 -4
  302. package/template/.codex/skills/yss-prototype-stage/scripts/build-antd-prototype.mjs +71 -0
  303. package/template/.codex/skills/yss-prototype-stage/scripts/collect-antd-reference.mjs +26 -0
  304. package/template/.codex/skills/yss-prototype-stage/scripts/offline-html.mjs +121 -0
  305. package/template/.codex/skills/yss-prototype-stage/scripts/prototype-contract.mjs +52 -143
  306. package/template/.codex/skills/yss-prototype-stage/tests/antd-reference.test.mjs +24 -0
  307. package/template/.codex/skills/yss-prototype-stage/tests/browser-smoke.mjs +77 -0
  308. package/template/.codex/skills/yss-prototype-stage/tests/run-scenarios.mjs +73 -26
  309. package/template/.codex/skills/yss-prototype-stage/tests/workbench-smoke.mjs +57 -0
  310. package/template/.codex/skills/yss-repository/SKILL.md +4 -0
  311. package/template/.codex/skills/yss-research/SKILL.md +1 -1
  312. package/template/.codex/skills/yss-resilience4j/SKILL.md +1 -1
  313. package/template/.codex/skills/yss-security-algorithm/SKILL.md +1 -1
  314. package/template/.codex/skills/yss-skill-source-index-refresh/references/source-map-config.md +0 -1
  315. package/template/.codex/skills/yss-skill-source-index-refresh/scripts/refresh-yss-skill-index.mjs +0 -1
  316. package/template/.codex/skills/yss-tactical-design/SKILL.md +5 -1
  317. package/template/.codex/skills/yss-technical-design/SKILL.md +4 -0
  318. package/template/.codex/skills/yss-technical-design/scripts/validate-technical-design.mjs +2 -2
  319. package/template/.codex/skills/yss-ui/SKILL.md +4 -3
  320. package/template/.codex/skills/yss-ui/references/component-routing.md +11 -10
  321. package/template/.codex/skills/yss-ui/references/specialized-components.md +52 -0
  322. package/template/.codex/skills/yss-ui-business-page-generation/SKILL.md +1 -1
  323. package/template/.codex/skills/yss-up-springboot3/SKILL.md +1 -1
  324. package/template/.codex/skills/yss-use-table-height/SKILL.md +1 -1
  325. package/template/.codex/skills/yss-use-tree-height/SKILL.md +1 -1
  326. package/template/.codex/skills/yss-userinfo/SKILL.md +1 -1
  327. package/template/.codex/skills/yss-validation/SKILL.md +5 -1
  328. package/template/.codex/skills/yss-web-controller/SKILL.md +5 -1
  329. package/template/.codex/skills/yss-web-controller/scripts/generate_controller.mjs +9 -5
  330. package/template/.codex/skills/yss-web-controller/scripts/generate_controller.test.mjs +1 -1
  331. package/template/.codex/skills/ytable-usage/SKILL.md +1 -1
  332. package/template/.codex/skills/ytree-usage/SKILL.md +1 -1
  333. package/template/.cursor/skills/archify/SKILL.md +1 -1
  334. package/template/.cursor/skills/code-review/SKILL.md +12 -8
  335. package/template/.cursor/skills/file-export-download/SKILL.md +1 -1
  336. package/template/.cursor/skills/frontend-commit/SKILL.md +1 -1
  337. package/template/.cursor/skills/java-backend-commit/SKILL.md +1 -1
  338. package/template/.cursor/skills/llm-wiki/SKILL.md +1 -6
  339. package/template/.cursor/skills/lombok/SKILL.md +10 -336
  340. package/template/.cursor/skills/lombok/references/annotation-examples.md +307 -0
  341. package/template/.cursor/skills/maintaining-skills/SKILL.md +2 -1
  342. package/template/.cursor/skills/maintaining-skills/references/authoring.md +27 -0
  343. package/template/.cursor/skills/mapstruct/SKILL.md +11 -318
  344. package/template/.cursor/skills/mapstruct/references/annotation-examples.md +300 -0
  345. package/template/.cursor/skills/page-form-module/SKILL.md +1 -1
  346. package/template/.cursor/skills/page-skeleton/SKILL.md +1 -1
  347. package/template/.cursor/skills/theme-token-usage/SKILL.md +1 -1
  348. package/template/.cursor/skills/to-tickets/SKILL.md +1 -1
  349. package/template/.cursor/skills/using-git-worktrees/SKILL.md +1 -1
  350. package/template/.cursor/skills/wayfinder/SKILL.md +1 -1
  351. package/template/.cursor/skills/yedit-table-usage/SKILL.md +1 -1
  352. package/template/.cursor/skills/yss-api-integration/SKILL.md +1 -1
  353. package/template/.cursor/skills/yss-audit-log/SKILL.md +1 -1
  354. package/template/.cursor/skills/yss-cache/SKILL.md +1 -1
  355. package/template/.cursor/skills/yss-ddd-scaffold-generator/SKILL.md +18 -5
  356. package/template/.cursor/skills/yss-ddd-scaffold-generator/assets/templates/pom/application-pom.xml.template +1 -1
  357. package/template/.cursor/skills/yss-ddd-scaffold-generator/assets/templates/pom/parent-pom.xml.template +15 -10
  358. package/template/.cursor/skills/yss-ddd-scaffold-generator/assets/templates/pom/web-pom.xml.template +3 -3
  359. package/template/.cursor/skills/yss-ddd-scaffold-generator/references/USAGE_EXAMPLES.md +1 -1
  360. package/template/.cursor/skills/yss-ddd-scaffold-generator/references/layer-skill-routing.md +18 -0
  361. package/template/.cursor/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-parent/SKILL.md +4 -4
  362. package/template/.cursor/skills/yss-ddd-scaffold-generator/scripts/first-slice-compatibility.test.mjs +18 -5
  363. package/template/.cursor/skills/yss-ddd-scaffold-generator/scripts/first-slice-verification.test.mjs +5 -2
  364. package/template/.cursor/skills/yss-ddd-scaffold-generator/scripts/generate_scaffold.mjs +21 -17
  365. package/template/.cursor/skills/yss-ddd-scaffold-generator/scripts/run_first_slice_verification.mjs +4 -2
  366. package/template/.cursor/skills/yss-ddd-scaffold-generator/scripts/run_scaffold_verification.mjs +41 -7
  367. package/template/.cursor/skills/yss-ddd-scaffold-generator/scripts/scaffold-generator.test.mjs +109 -13
  368. package/template/.cursor/skills/yss-design-system/SKILL.md +19 -19
  369. package/template/.cursor/skills/yss-design-system/references/data-quality-theme.md +13 -0
  370. package/template/.cursor/skills/yss-design-system/references/design-qa-theme.md +3 -1
  371. package/template/.cursor/skills/yss-design-system/references/design-system.md +7 -9
  372. package/template/.cursor/skills/yss-distributed-id/SKILL.md +1 -1
  373. package/template/.cursor/skills/yss-dto/SKILL.md +5 -1
  374. package/template/.cursor/skills/yss-excel-mvc/SKILL.md +1 -1
  375. package/template/.cursor/skills/yss-exception/SKILL.md +5 -1
  376. package/template/.cursor/skills/yss-formily/SKILL.md +21 -258
  377. package/template/.cursor/skills/yss-formily-schema-generator/SKILL.md +1 -1
  378. package/template/.cursor/skills/yss-frontend-scaffold-generator/SKILL.md +17 -13
  379. package/template/.cursor/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/.eslintrc.cjs +1 -0
  380. package/template/.cursor/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/.npmrc.example +2 -0
  381. package/template/.cursor/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/DESIGN.md +264 -0
  382. package/template/.cursor/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/README.md +13 -0
  383. package/template/.cursor/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/__yss_dotfile__.gitignore +6 -0
  384. package/template/.cursor/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/micro-config.json +5 -0
  385. package/template/.cursor/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/orval.config.ts +2 -0
  386. package/template/.cursor/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/package.json +30 -0
  387. package/template/.cursor/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/.env.development +1 -0
  388. package/template/.cursor/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/.env.example +5 -0
  389. package/template/.cursor/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/.env.production +1 -0
  390. package/template/.cursor/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/.env.production.standalone +1 -0
  391. package/template/.cursor/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/index.html +2 -0
  392. package/template/.cursor/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/package.json +34 -0
  393. package/template/.cursor/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/public/favicon.svg +1 -0
  394. package/template/.cursor/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/src/App.vue +15 -0
  395. package/template/.cursor/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/src/api/mutator.ts +7 -0
  396. package/template/.cursor/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/src/components/ThemeScope.vue +11 -0
  397. package/template/.cursor/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/src/config/theme.json +41 -0
  398. package/template/.cursor/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/src/env.d.ts +1 -0
  399. package/template/.cursor/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/src/main.ts +40 -0
  400. package/template/.cursor/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/src/router/index.ts +8 -0
  401. package/template/.cursor/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/src/store/theme.ts +37 -0
  402. package/template/.cursor/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/src/styles/index.less +6 -0
  403. package/template/.cursor/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/src/types/microAppBridge.ts +28 -0
  404. package/template/.cursor/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/src/utils/microAppRouterBridge.ts +266 -0
  405. package/template/.cursor/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/src/views/NotFound.vue +1 -0
  406. package/template/.cursor/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/src/views/Welcome.vue +1 -0
  407. package/template/.cursor/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/tsconfig.json +23 -0
  408. package/template/.cursor/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/vite.config.ts +16 -0
  409. package/template/.cursor/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/pnpm-lock.yaml +9026 -0
  410. package/template/.cursor/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/pnpm-workspace.yaml +7 -0
  411. package/template/.cursor/skills/yss-frontend-scaffold-generator/references/data-quality-baseline.md +17 -0
  412. package/template/.cursor/skills/yss-frontend-scaffold-generator/references/data-quality-v1.manifest.json +49 -0
  413. package/template/.cursor/skills/yss-frontend-scaffold-generator/scripts/generate_scaffold.mjs +41 -13
  414. package/template/.cursor/skills/yss-frontend-scaffold-generator/scripts/refresh_baseline.mjs +29 -0
  415. package/template/.cursor/skills/yss-frontend-scaffold-generator/scripts/run_scaffold_verification.mjs +5 -1
  416. package/template/.cursor/skills/yss-frontend-scaffold-generator/scripts/scaffold-generator.test.mjs +32 -0
  417. package/template/.cursor/skills/yss-hook/SKILL.md +1 -1
  418. package/template/.cursor/skills/yss-implementation-contract-compiler/SKILL.md +14 -6
  419. package/template/.cursor/skills/yss-implementation-contract-compiler/agents/openai.yaml +1 -1
  420. package/template/.cursor/skills/yss-implementation-contract-compiler/references/boundaries.md +5 -3
  421. package/template/.cursor/skills/yss-implementation-contract-compiler/references/compiler-contract.yaml +29 -5
  422. package/template/.cursor/skills/yss-implementation-contract-compiler/references/slice-implementation-contract-v2.md +214 -0
  423. package/template/.cursor/skills/yss-implementation-contract-compiler/references/slice-implementation-contract.md +66 -204
  424. package/template/.cursor/skills/yss-layered-mvc-scaffold-generator/SKILL.md +17 -4
  425. package/template/.cursor/skills/yss-layered-mvc-scaffold-generator/agents/openai.yaml +1 -1
  426. package/template/.cursor/skills/yss-layered-mvc-scaffold-generator/scripts/generate_scaffold.mjs +38 -25
  427. package/template/.cursor/skills/yss-layered-mvc-scaffold-generator/scripts/run_scaffold_verification.mjs +1 -1
  428. package/template/.cursor/skills/yss-layered-mvc-scaffold-generator/scripts/scaffold-generator.test.mjs +101 -13
  429. package/template/.cursor/skills/yss-mvc-data-analysis-project-initializer/SKILL.md +2 -2
  430. package/template/.cursor/skills/yss-mvc-data-analysis-project-initializer/scripts/generate_project.mjs +1 -1
  431. package/template/.cursor/skills/yss-mybatis/SKILL.md +4 -0
  432. package/template/.cursor/skills/yss-openapi-draft-review/SKILL.md +1 -1
  433. package/template/.cursor/skills/yss-openapi-governance/SKILL.md +3 -1
  434. package/template/.cursor/skills/yss-product-lifecycle/SKILL.md +4 -4
  435. package/template/.cursor/skills/yss-product-lifecycle/references/orchestration-contract.yaml +50 -17
  436. package/template/.cursor/skills/yss-product-lifecycle/references/orchestration.md +6 -2
  437. package/template/.cursor/skills/yss-product-lifecycle/references/state-model.md +3 -1
  438. package/template/.cursor/skills/yss-product-lifecycle/references/user-decisions.md +23 -3
  439. package/template/.cursor/skills/yss-prototype-stage/SKILL.md +13 -9
  440. package/template/.cursor/skills/yss-prototype-stage/assets/antd-authoring/package.json +16 -0
  441. package/template/.cursor/skills/yss-prototype-stage/assets/antd-authoring/pnpm-lock.yaml +1678 -0
  442. package/template/.cursor/skills/yss-prototype-stage/assets/antd-authoring/workbench.jsx +23 -0
  443. package/template/.cursor/skills/yss-prototype-stage/assets/native-workbench/app.js +20 -0
  444. package/template/.cursor/skills/yss-prototype-stage/assets/native-workbench/index.html +11 -0
  445. package/template/.cursor/skills/yss-prototype-stage/assets/native-workbench/styles.css +28 -0
  446. package/template/.cursor/skills/yss-prototype-stage/assets/offline-html/app.js +50 -0
  447. package/template/.cursor/skills/yss-prototype-stage/assets/offline-html/index.html +38 -0
  448. package/template/.cursor/skills/yss-prototype-stage/assets/offline-html/scenarios.js +7 -0
  449. package/template/.cursor/skills/yss-prototype-stage/assets/offline-html/styles.css +20 -0
  450. package/template/.cursor/skills/yss-prototype-stage/references/antd-component-catalog.json +736 -0
  451. package/template/.cursor/skills/yss-prototype-stage/references/antd-integration.md +61 -0
  452. package/template/.cursor/skills/yss-prototype-stage/references/html-prototype-practices.md +14 -0
  453. package/template/.cursor/skills/yss-prototype-stage/references/product-design-adapter.md +28 -51
  454. package/template/.cursor/skills/yss-prototype-stage/references/prototype-profile-routing.md +15 -4
  455. package/template/.cursor/skills/yss-prototype-stage/scripts/build-antd-prototype.mjs +71 -0
  456. package/template/.cursor/skills/yss-prototype-stage/scripts/collect-antd-reference.mjs +26 -0
  457. package/template/.cursor/skills/yss-prototype-stage/scripts/offline-html.mjs +121 -0
  458. package/template/.cursor/skills/yss-prototype-stage/scripts/prototype-contract.mjs +52 -143
  459. package/template/.cursor/skills/yss-prototype-stage/tests/antd-reference.test.mjs +24 -0
  460. package/template/.cursor/skills/yss-prototype-stage/tests/browser-smoke.mjs +77 -0
  461. package/template/.cursor/skills/yss-prototype-stage/tests/run-scenarios.mjs +73 -26
  462. package/template/.cursor/skills/yss-prototype-stage/tests/workbench-smoke.mjs +57 -0
  463. package/template/.cursor/skills/yss-repository/SKILL.md +4 -0
  464. package/template/.cursor/skills/yss-research/SKILL.md +1 -1
  465. package/template/.cursor/skills/yss-resilience4j/SKILL.md +1 -1
  466. package/template/.cursor/skills/yss-security-algorithm/SKILL.md +1 -1
  467. package/template/.cursor/skills/yss-skill-source-index-refresh/references/source-map-config.md +0 -1
  468. package/template/.cursor/skills/yss-skill-source-index-refresh/scripts/refresh-yss-skill-index.mjs +0 -1
  469. package/template/.cursor/skills/yss-tactical-design/SKILL.md +5 -1
  470. package/template/.cursor/skills/yss-technical-design/SKILL.md +4 -0
  471. package/template/.cursor/skills/yss-technical-design/scripts/validate-technical-design.mjs +2 -2
  472. package/template/.cursor/skills/yss-ui/SKILL.md +4 -3
  473. package/template/.cursor/skills/yss-ui/references/component-routing.md +11 -10
  474. package/template/.cursor/skills/yss-ui/references/specialized-components.md +52 -0
  475. package/template/.cursor/skills/yss-ui-business-page-generation/SKILL.md +1 -1
  476. package/template/.cursor/skills/yss-up-springboot3/SKILL.md +1 -1
  477. package/template/.cursor/skills/yss-use-table-height/SKILL.md +1 -1
  478. package/template/.cursor/skills/yss-use-tree-height/SKILL.md +1 -1
  479. package/template/.cursor/skills/yss-userinfo/SKILL.md +1 -1
  480. package/template/.cursor/skills/yss-validation/SKILL.md +5 -1
  481. package/template/.cursor/skills/yss-web-controller/SKILL.md +5 -1
  482. package/template/.cursor/skills/yss-web-controller/scripts/generate_controller.mjs +9 -5
  483. package/template/.cursor/skills/yss-web-controller/scripts/generate_controller.test.mjs +1 -1
  484. package/template/.cursor/skills/ytable-usage/SKILL.md +1 -1
  485. package/template/.cursor/skills/ytree-usage/SKILL.md +1 -1
  486. package/template/.pi/skills/archify/SKILL.md +1 -1
  487. package/template/.pi/skills/code-review/SKILL.md +12 -8
  488. package/template/.pi/skills/file-export-download/SKILL.md +1 -1
  489. package/template/.pi/skills/frontend-commit/SKILL.md +1 -1
  490. package/template/.pi/skills/java-backend-commit/SKILL.md +1 -1
  491. package/template/.pi/skills/llm-wiki/SKILL.md +1 -6
  492. package/template/.pi/skills/lombok/SKILL.md +10 -336
  493. package/template/.pi/skills/lombok/references/annotation-examples.md +307 -0
  494. package/template/.pi/skills/maintaining-skills/SKILL.md +2 -1
  495. package/template/.pi/skills/maintaining-skills/references/authoring.md +27 -0
  496. package/template/.pi/skills/mapstruct/SKILL.md +11 -318
  497. package/template/.pi/skills/mapstruct/references/annotation-examples.md +300 -0
  498. package/template/.pi/skills/page-form-module/SKILL.md +1 -1
  499. package/template/.pi/skills/page-skeleton/SKILL.md +1 -1
  500. package/template/.pi/skills/theme-token-usage/SKILL.md +1 -1
  501. package/template/.pi/skills/to-tickets/SKILL.md +1 -1
  502. package/template/.pi/skills/using-git-worktrees/SKILL.md +1 -1
  503. package/template/.pi/skills/wayfinder/SKILL.md +1 -1
  504. package/template/.pi/skills/yedit-table-usage/SKILL.md +1 -1
  505. package/template/.pi/skills/yss-api-integration/SKILL.md +1 -1
  506. package/template/.pi/skills/yss-audit-log/SKILL.md +1 -1
  507. package/template/.pi/skills/yss-cache/SKILL.md +1 -1
  508. package/template/.pi/skills/yss-ddd-scaffold-generator/SKILL.md +18 -5
  509. package/template/.pi/skills/yss-ddd-scaffold-generator/assets/templates/pom/application-pom.xml.template +1 -1
  510. package/template/.pi/skills/yss-ddd-scaffold-generator/assets/templates/pom/parent-pom.xml.template +15 -10
  511. package/template/.pi/skills/yss-ddd-scaffold-generator/assets/templates/pom/web-pom.xml.template +3 -3
  512. package/template/.pi/skills/yss-ddd-scaffold-generator/references/USAGE_EXAMPLES.md +1 -1
  513. package/template/.pi/skills/yss-ddd-scaffold-generator/references/layer-skill-routing.md +18 -0
  514. package/template/.pi/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-parent/SKILL.md +4 -4
  515. package/template/.pi/skills/yss-ddd-scaffold-generator/scripts/first-slice-compatibility.test.mjs +18 -5
  516. package/template/.pi/skills/yss-ddd-scaffold-generator/scripts/first-slice-verification.test.mjs +5 -2
  517. package/template/.pi/skills/yss-ddd-scaffold-generator/scripts/generate_scaffold.mjs +21 -17
  518. package/template/.pi/skills/yss-ddd-scaffold-generator/scripts/run_first_slice_verification.mjs +4 -2
  519. package/template/.pi/skills/yss-ddd-scaffold-generator/scripts/run_scaffold_verification.mjs +41 -7
  520. package/template/.pi/skills/yss-ddd-scaffold-generator/scripts/scaffold-generator.test.mjs +109 -13
  521. package/template/.pi/skills/yss-design-system/SKILL.md +19 -19
  522. package/template/.pi/skills/yss-design-system/references/data-quality-theme.md +13 -0
  523. package/template/.pi/skills/yss-design-system/references/design-qa-theme.md +3 -1
  524. package/template/.pi/skills/yss-design-system/references/design-system.md +7 -9
  525. package/template/.pi/skills/yss-distributed-id/SKILL.md +1 -1
  526. package/template/.pi/skills/yss-dto/SKILL.md +5 -1
  527. package/template/.pi/skills/yss-excel-mvc/SKILL.md +1 -1
  528. package/template/.pi/skills/yss-exception/SKILL.md +5 -1
  529. package/template/.pi/skills/yss-formily/SKILL.md +21 -258
  530. package/template/.pi/skills/yss-formily-schema-generator/SKILL.md +1 -1
  531. package/template/.pi/skills/yss-frontend-scaffold-generator/SKILL.md +17 -13
  532. package/template/.pi/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/.eslintrc.cjs +1 -0
  533. package/template/.pi/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/.npmrc.example +2 -0
  534. package/template/.pi/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/DESIGN.md +264 -0
  535. package/template/.pi/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/README.md +13 -0
  536. package/template/.pi/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/__yss_dotfile__.gitignore +6 -0
  537. package/template/.pi/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/micro-config.json +5 -0
  538. package/template/.pi/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/orval.config.ts +2 -0
  539. package/template/.pi/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/package.json +30 -0
  540. package/template/.pi/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/.env.development +1 -0
  541. package/template/.pi/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/.env.example +5 -0
  542. package/template/.pi/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/.env.production +1 -0
  543. package/template/.pi/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/.env.production.standalone +1 -0
  544. package/template/.pi/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/index.html +2 -0
  545. package/template/.pi/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/package.json +34 -0
  546. package/template/.pi/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/public/favicon.svg +1 -0
  547. package/template/.pi/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/src/App.vue +15 -0
  548. package/template/.pi/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/src/api/mutator.ts +7 -0
  549. package/template/.pi/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/src/components/ThemeScope.vue +11 -0
  550. package/template/.pi/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/src/config/theme.json +41 -0
  551. package/template/.pi/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/src/env.d.ts +1 -0
  552. package/template/.pi/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/src/main.ts +40 -0
  553. package/template/.pi/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/src/router/index.ts +8 -0
  554. package/template/.pi/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/src/store/theme.ts +37 -0
  555. package/template/.pi/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/src/styles/index.less +6 -0
  556. package/template/.pi/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/src/types/microAppBridge.ts +28 -0
  557. package/template/.pi/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/src/utils/microAppRouterBridge.ts +266 -0
  558. package/template/.pi/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/src/views/NotFound.vue +1 -0
  559. package/template/.pi/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/src/views/Welcome.vue +1 -0
  560. package/template/.pi/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/tsconfig.json +23 -0
  561. package/template/.pi/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/packages/vite.config.ts +16 -0
  562. package/template/.pi/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/pnpm-lock.yaml +9026 -0
  563. package/template/.pi/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/pnpm-workspace.yaml +7 -0
  564. package/template/.pi/skills/yss-frontend-scaffold-generator/references/data-quality-baseline.md +17 -0
  565. package/template/.pi/skills/yss-frontend-scaffold-generator/references/data-quality-v1.manifest.json +49 -0
  566. package/template/.pi/skills/yss-frontend-scaffold-generator/scripts/generate_scaffold.mjs +41 -13
  567. package/template/.pi/skills/yss-frontend-scaffold-generator/scripts/refresh_baseline.mjs +29 -0
  568. package/template/.pi/skills/yss-frontend-scaffold-generator/scripts/run_scaffold_verification.mjs +5 -1
  569. package/template/.pi/skills/yss-frontend-scaffold-generator/scripts/scaffold-generator.test.mjs +32 -0
  570. package/template/.pi/skills/yss-hook/SKILL.md +1 -1
  571. package/template/.pi/skills/yss-implementation-contract-compiler/SKILL.md +14 -6
  572. package/template/.pi/skills/yss-implementation-contract-compiler/agents/openai.yaml +1 -1
  573. package/template/.pi/skills/yss-implementation-contract-compiler/references/boundaries.md +5 -3
  574. package/template/.pi/skills/yss-implementation-contract-compiler/references/compiler-contract.yaml +29 -5
  575. package/template/.pi/skills/yss-implementation-contract-compiler/references/slice-implementation-contract-v2.md +214 -0
  576. package/template/.pi/skills/yss-implementation-contract-compiler/references/slice-implementation-contract.md +66 -204
  577. package/template/.pi/skills/yss-layered-mvc-scaffold-generator/SKILL.md +17 -4
  578. package/template/.pi/skills/yss-layered-mvc-scaffold-generator/agents/openai.yaml +1 -1
  579. package/template/.pi/skills/yss-layered-mvc-scaffold-generator/scripts/generate_scaffold.mjs +38 -25
  580. package/template/.pi/skills/yss-layered-mvc-scaffold-generator/scripts/run_scaffold_verification.mjs +1 -1
  581. package/template/.pi/skills/yss-layered-mvc-scaffold-generator/scripts/scaffold-generator.test.mjs +101 -13
  582. package/template/.pi/skills/yss-mvc-data-analysis-project-initializer/SKILL.md +2 -2
  583. package/template/.pi/skills/yss-mvc-data-analysis-project-initializer/scripts/generate_project.mjs +1 -1
  584. package/template/.pi/skills/yss-mybatis/SKILL.md +4 -0
  585. package/template/.pi/skills/yss-openapi-draft-review/SKILL.md +1 -1
  586. package/template/.pi/skills/yss-openapi-governance/SKILL.md +3 -1
  587. package/template/.pi/skills/yss-product-lifecycle/SKILL.md +4 -4
  588. package/template/.pi/skills/yss-product-lifecycle/references/orchestration-contract.yaml +50 -17
  589. package/template/.pi/skills/yss-product-lifecycle/references/orchestration.md +6 -2
  590. package/template/.pi/skills/yss-product-lifecycle/references/state-model.md +3 -1
  591. package/template/.pi/skills/yss-product-lifecycle/references/user-decisions.md +23 -3
  592. package/template/.pi/skills/yss-prototype-stage/SKILL.md +13 -9
  593. package/template/.pi/skills/yss-prototype-stage/assets/antd-authoring/package.json +16 -0
  594. package/template/.pi/skills/yss-prototype-stage/assets/antd-authoring/pnpm-lock.yaml +1678 -0
  595. package/template/.pi/skills/yss-prototype-stage/assets/antd-authoring/workbench.jsx +23 -0
  596. package/template/.pi/skills/yss-prototype-stage/assets/native-workbench/app.js +20 -0
  597. package/template/.pi/skills/yss-prototype-stage/assets/native-workbench/index.html +11 -0
  598. package/template/.pi/skills/yss-prototype-stage/assets/native-workbench/styles.css +28 -0
  599. package/template/.pi/skills/yss-prototype-stage/assets/offline-html/app.js +50 -0
  600. package/template/.pi/skills/yss-prototype-stage/assets/offline-html/index.html +38 -0
  601. package/template/.pi/skills/yss-prototype-stage/assets/offline-html/scenarios.js +7 -0
  602. package/template/.pi/skills/yss-prototype-stage/assets/offline-html/styles.css +20 -0
  603. package/template/.pi/skills/yss-prototype-stage/references/antd-component-catalog.json +736 -0
  604. package/template/.pi/skills/yss-prototype-stage/references/antd-integration.md +61 -0
  605. package/template/.pi/skills/yss-prototype-stage/references/html-prototype-practices.md +14 -0
  606. package/template/.pi/skills/yss-prototype-stage/references/product-design-adapter.md +28 -51
  607. package/template/.pi/skills/yss-prototype-stage/references/prototype-profile-routing.md +15 -4
  608. package/template/.pi/skills/yss-prototype-stage/scripts/build-antd-prototype.mjs +71 -0
  609. package/template/.pi/skills/yss-prototype-stage/scripts/collect-antd-reference.mjs +26 -0
  610. package/template/.pi/skills/yss-prototype-stage/scripts/offline-html.mjs +121 -0
  611. package/template/.pi/skills/yss-prototype-stage/scripts/prototype-contract.mjs +52 -143
  612. package/template/.pi/skills/yss-prototype-stage/tests/antd-reference.test.mjs +24 -0
  613. package/template/.pi/skills/yss-prototype-stage/tests/browser-smoke.mjs +77 -0
  614. package/template/.pi/skills/yss-prototype-stage/tests/run-scenarios.mjs +73 -26
  615. package/template/.pi/skills/yss-prototype-stage/tests/workbench-smoke.mjs +57 -0
  616. package/template/.pi/skills/yss-repository/SKILL.md +4 -0
  617. package/template/.pi/skills/yss-research/SKILL.md +1 -1
  618. package/template/.pi/skills/yss-resilience4j/SKILL.md +1 -1
  619. package/template/.pi/skills/yss-security-algorithm/SKILL.md +1 -1
  620. package/template/.pi/skills/yss-skill-source-index-refresh/references/source-map-config.md +0 -1
  621. package/template/.pi/skills/yss-skill-source-index-refresh/scripts/refresh-yss-skill-index.mjs +0 -1
  622. package/template/.pi/skills/yss-tactical-design/SKILL.md +5 -1
  623. package/template/.pi/skills/yss-technical-design/SKILL.md +4 -0
  624. package/template/.pi/skills/yss-technical-design/scripts/validate-technical-design.mjs +2 -2
  625. package/template/.pi/skills/yss-ui/SKILL.md +4 -3
  626. package/template/.pi/skills/yss-ui/references/component-routing.md +11 -10
  627. package/template/.pi/skills/yss-ui/references/specialized-components.md +52 -0
  628. package/template/.pi/skills/yss-ui-business-page-generation/SKILL.md +1 -1
  629. package/template/.pi/skills/yss-up-springboot3/SKILL.md +1 -1
  630. package/template/.pi/skills/yss-use-table-height/SKILL.md +1 -1
  631. package/template/.pi/skills/yss-use-tree-height/SKILL.md +1 -1
  632. package/template/.pi/skills/yss-userinfo/SKILL.md +1 -1
  633. package/template/.pi/skills/yss-validation/SKILL.md +5 -1
  634. package/template/.pi/skills/yss-web-controller/SKILL.md +5 -1
  635. package/template/.pi/skills/yss-web-controller/scripts/generate_controller.mjs +9 -5
  636. package/template/.pi/skills/yss-web-controller/scripts/generate_controller.test.mjs +1 -1
  637. package/template/.pi/skills/ytable-usage/SKILL.md +1 -1
  638. package/template/.pi/skills/ytree-usage/SKILL.md +1 -1
  639. package/template/AGENTS.md +1 -0
  640. package/template/CONTEXT.md +3 -1
  641. package/template/DESIGN.md +31 -14
  642. package/template/__yss_dotfile__.gitignore +4 -0
  643. package/template/docs/agents/backend-architecture-profiles.md +1 -1
  644. package/template/docs/agents/digital-human-roles.yaml +29 -5
  645. package/template/docs/agents/issue-tracker.md +2 -0
  646. package/template/docs/agents/skill-migrations.md +15 -2
  647. package/template/docs/agents/yss-skill-registry.yaml +6 -40
  648. package/template/docs/design/README.md +4 -4
  649. package/template/docs/design/design-system-sync.yaml +2 -1
  650. package/template/docs/design/design.md +23 -31
  651. package/template/docs/design/preview-dark.html +3 -3
  652. package/template/docs/design/preview.css +1 -1
  653. package/template/docs/design/preview.html +2 -2
  654. package/template/docs/design/templates/interaction-spec-template.md +2 -2
  655. package/template/docs/design/templates/prototype-evidence-template.yaml +18 -22
  656. package/template/docs/design/templates/prototype-review-checklist.md +3 -1
  657. package/template/docs/design/templates/state-matrix-template.md +1 -1
  658. package/template/docs/design/templates/visual-baseline-template.yaml +3 -2
  659. package/template/docs/design/tokens/.design-md-projection.json +7 -7
  660. package/template/docs/design/tokens/theme.json +16 -10
  661. package/template/docs/design/tokens/tokens.compact.json +521 -237
  662. package/template/docs/design/tokens/tokens.dark.json +527 -240
  663. package/template/docs/design/tokens/tokens.default.json +513 -235
  664. package/template/docs/design/tokens/variables.css +67 -65
  665. package/template/docs/design/tokens/variables.dark.css +41 -41
  666. package/template/docs/engineering/backend-platforms.json +174 -0
  667. package/template/docs/engineering/backend-platforms.md +77 -0
  668. package/template/docs/process/MATT-POCOCK-ENGINEERING-SKILLS.md +1 -0
  669. package/template/docs/process/delivery-preflight.md +1 -1
  670. package/template/docs/process/frontend-backend-delivery.md +2 -1
  671. package/template/docs/process/harness-process-tailoring.md +9 -1
  672. package/template/docs/process/lifecycle-artifact-map.md +4 -4
  673. package/template/docs/process/lifecycle-registry-baseline.json +1 -1
  674. package/template/docs/process/lifecycle-registry.yaml +9 -9
  675. package/template/docs/process/schemas/api-contract-decision.schema.json +74 -0
  676. package/template/docs/process/schemas/backend-architecture-identity.schema.json +91 -0
  677. package/template/docs/process/schemas/data-architecture-decision.schema.json +34 -0
  678. package/template/docs/process/schemas/digital-human-task-package.schema.json +2 -1
  679. package/template/docs/process/schemas/implementation-repository-preparation-result.schema.json +80 -24
  680. package/template/docs/process/schemas/lifecycle-checkpoint.schema.json +4 -0
  681. package/template/docs/process/schemas/project-scaffold-contract.schema.json +666 -73
  682. package/template/docs/process/schemas/scaffold-architecture-decisions.schema.json +323 -39
  683. package/template/docs/process/schemas/slice-implementation-contract-v3.schema.json +925 -0
  684. package/template/docs/process/schemas/strategic-design-handoff.schema.json +296 -107
  685. package/template/docs/process/schemas/strategic-handoff-delivery-verification.schema.json +19 -0
  686. package/template/docs/process/schemas/strategic-handoff-delivery.schema.json +84 -0
  687. package/template/docs/process/schemas/strategic-handoff-import-receipt-v3.schema.json +42 -0
  688. package/template/docs/process/strategic-handoff-package.md +26 -9
  689. package/template/docs/templates/approval-record-template.yaml +2 -0
  690. package/template/docs/templates/vertical-slice-ticket-template.md +22 -31
  691. 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
  692. package/template/scripts/audit-legacy-backend-scaffold +29 -0
  693. package/template/scripts/backend-platforms +14 -0
  694. package/template/scripts/lib/api-contract-decision.mjs +49 -0
  695. package/template/scripts/lib/api-contract-decision.test.mjs +69 -0
  696. package/template/scripts/lib/approval-record.mjs +32 -6
  697. package/template/scripts/lib/approved-execution-context.mjs +31 -8
  698. package/template/scripts/lib/backend-architecture.mjs +6 -0
  699. package/template/scripts/lib/backend-platform-provenance.mjs +67 -0
  700. package/template/scripts/lib/backend-platform-verification.mjs +210 -0
  701. package/template/scripts/lib/backend-platform.mjs +175 -0
  702. package/template/scripts/lib/backend-scaffold-prerequisites.mjs +123 -0
  703. package/template/scripts/lib/decision-continuation.mjs +79 -0
  704. package/template/scripts/lib/delivery-preflight.mjs +6 -5
  705. package/template/scripts/lib/digital-human-roles.mjs +10 -0
  706. package/template/scripts/lib/frontend-delivery-boundary.mjs +3 -0
  707. package/template/scripts/lib/implementation-contract-compiler.mjs +42 -9
  708. package/template/scripts/lib/legacy-backend-scaffold-audit.mjs +87 -0
  709. package/template/scripts/lib/legacy-backend-scaffold-audit.test.mjs +64 -0
  710. package/template/scripts/lib/lifecycle-controls.mjs +2 -2
  711. package/template/scripts/lib/lifecycle-transition.mjs +155 -5
  712. package/template/scripts/lib/openapi-draft-validation.mjs +111 -0
  713. package/template/scripts/lib/plan-spec-entry.mjs +3 -3
  714. package/template/scripts/lib/scaffold-local-database.mjs +1 -0
  715. package/template/scripts/lib/skill-registry.mjs +17 -3
  716. package/template/scripts/lib/skill-supply-chain.mjs +12 -1
  717. package/template/scripts/lib/slice-applicability.mjs +10 -0
  718. package/template/scripts/lib/slice-contract-preparation.mjs +257 -0
  719. package/template/scripts/lib/slice-contract-views.mjs +52 -0
  720. package/template/scripts/lib/slice-contract.mjs +211 -0
  721. package/template/scripts/lib/slice-repositories.mjs +49 -0
  722. package/template/scripts/lib/slice-task-package.mjs +66 -0
  723. package/template/scripts/lib/strategic-feedback.mjs +2 -2
  724. package/template/scripts/lib/strategic-handoff-consumption.mjs +2 -2
  725. package/template/scripts/lib/strategic-handoff.mjs +89 -4
  726. package/template/scripts/lib/task-package.mjs +6 -2
  727. package/template/scripts/lib/technical-design-boundary.mjs +1 -0
  728. package/template/scripts/lib/user-decision-reuse.mjs +1 -0
  729. package/template/scripts/lib/user-decision.mjs +4 -1
  730. package/template/scripts/preflight-delivery +2 -2
  731. package/template/scripts/slice-contract +30 -0
  732. package/template/scripts/strategic-handoff +6 -4
  733. package/template/scripts/verify-backend-platform-matrix +69 -0
  734. package/template/scripts/verify-openapi-draft-validation-record +10 -129
  735. package/template/scripts/verify-scaffold-architecture-decisions +5 -0
  736. package/template/scripts/verify-strategic-context-import +12 -14
  737. package/template/scripts/verify-user-decision +7 -2
  738. package/template/skills-lock.json +67 -117
  739. package/template/yss-public-skills.json +0 -6
  740. package/template.snapshot.json +8 -4
  741. package/template/.agents/skills/yss-antd-design/SKILL.md +0 -35
  742. package/template/.agents/skills/yss-antd-design/references/boundaries.md +0 -30
  743. package/template/.agents/skills/yss-antd-design/references/cli-matrix.md +0 -38
  744. package/template/.agents/skills/yss-antd-design/references/evidence.md +0 -35
  745. package/template/.agents/skills/yss-antd-design/scripts/validate-frontmatter.mjs +0 -46
  746. package/template/.agents/skills/yss-antd-design/scripts/validate-frontmatter.test.mjs +0 -27
  747. package/template/.agents/skills/yss-antdv-next-design/SKILL.md +0 -48
  748. package/template/.agents/skills/yss-antdv-next-design/references/boundaries.md +0 -25
  749. package/template/.agents/skills/yss-antdv-next-design/references/cli-matrix.md +0 -34
  750. package/template/.agents/skills/yss-antdv-next-design/references/fact-pack.md +0 -38
  751. package/template/.agents/skills/yss-antdv-next-design/scripts/collect-antdv-next-facts.mjs +0 -213
  752. package/template/.agents/skills/yss-antdv-next-design/scripts/validate-fact-pack.mjs +0 -168
  753. package/template/.agents/skills/yss-antdv-next-design/tests/run-scenarios.mjs +0 -139
  754. package/template/.agents/skills/yss-components/SKILL.md +0 -386
  755. package/template/.agents/skills/yss-components/agents/openai.yaml +0 -5
  756. package/template/.agents/skills/yss-components/references/frontend-docs.md +0 -9
  757. package/template/.agents/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-adapter/SKILL.md +0 -31
  758. package/template/.agents/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-adapter/agents/openai.yaml +0 -5
  759. package/template/.agents/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-application/SKILL.md +0 -8
  760. package/template/.agents/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-application/agents/openai.yaml +0 -5
  761. package/template/.agents/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-domain/SKILL.md +0 -8
  762. package/template/.agents/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-domain/agents/openai.yaml +0 -5
  763. package/template/.agents/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-infrastructure/SKILL.md +0 -8
  764. package/template/.agents/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-infrastructure/agents/openai.yaml +0 -5
  765. package/template/.agents/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-web/SKILL.md +0 -8
  766. package/template/.agents/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-web/agents/openai.yaml +0 -5
  767. package/template/.agents/skills/yss-mvc-scaffold-generator/SKILL.md +0 -8
  768. package/template/.agents/skills/yss-mvc-scaffold-generator/agents/openai.yaml +0 -4
  769. package/template/.agents/skills/yss-mvc-scaffold-generator/assets/logback-spring.xml.template +0 -50
  770. package/template/.agents/skills/yss-mvc-scaffold-generator/assets/smart-doc.json.template +0 -42
  771. package/template/.agents/skills/yss-mvc-scaffold-generator/references/architecture.md +0 -28
  772. package/template/.agents/skills/yss-mvc-scaffold-generator/references/history/generate_project.mjs.txt +0 -137
  773. package/template/.agents/skills/yss-mvc-scaffold-generator/references/history/generate_project.test.mjs.txt +0 -341
  774. package/template/.agents/skills/yss-mvc-scaffold-generator/references/history/skill.md +0 -87
  775. package/template/.agents/skills/yss-mvc-scaffold-generator/scripts/generate_project.mjs +0 -3
  776. package/template/.agents/skills/yss-mvc-scaffold-generator/scripts/generate_project.test.mjs +0 -9
  777. package/template/.agents/skills/yss-mvc-scaffold-generator/scripts/lib/envelope.mjs +0 -74
  778. package/template/.agents/skills/yss-mvc-scaffold-generator/scripts/lib/envelope.test.mjs +0 -36
  779. package/template/.agents/skills/yss-mvc-scaffold-generator/scripts/lib/runtime.mjs +0 -114
  780. package/template/.agents/skills/yss-mvc-scaffold-generator/scripts/lib/storage.mjs +0 -90
  781. package/template/.agents/skills/yss-mvc-scaffold-generator/scripts/lib/templates.mjs +0 -54
  782. package/template/.agents/skills/yss-mvc-scaffold-generator/scripts/verify_project.mjs +0 -103
  783. package/template/.codex/skills/yss-antd-design/SKILL.md +0 -35
  784. package/template/.codex/skills/yss-antd-design/references/boundaries.md +0 -30
  785. package/template/.codex/skills/yss-antd-design/references/cli-matrix.md +0 -38
  786. package/template/.codex/skills/yss-antd-design/references/evidence.md +0 -35
  787. package/template/.codex/skills/yss-antd-design/scripts/validate-frontmatter.mjs +0 -46
  788. package/template/.codex/skills/yss-antd-design/scripts/validate-frontmatter.test.mjs +0 -27
  789. package/template/.codex/skills/yss-antdv-next-design/SKILL.md +0 -48
  790. package/template/.codex/skills/yss-antdv-next-design/references/boundaries.md +0 -25
  791. package/template/.codex/skills/yss-antdv-next-design/references/cli-matrix.md +0 -34
  792. package/template/.codex/skills/yss-antdv-next-design/references/fact-pack.md +0 -38
  793. package/template/.codex/skills/yss-antdv-next-design/scripts/collect-antdv-next-facts.mjs +0 -213
  794. package/template/.codex/skills/yss-antdv-next-design/scripts/validate-fact-pack.mjs +0 -168
  795. package/template/.codex/skills/yss-antdv-next-design/tests/run-scenarios.mjs +0 -139
  796. package/template/.codex/skills/yss-components/SKILL.md +0 -386
  797. package/template/.codex/skills/yss-components/agents/openai.yaml +0 -5
  798. package/template/.codex/skills/yss-components/references/frontend-docs.md +0 -9
  799. package/template/.codex/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-adapter/SKILL.md +0 -31
  800. package/template/.codex/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-adapter/agents/openai.yaml +0 -5
  801. package/template/.codex/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-application/SKILL.md +0 -8
  802. package/template/.codex/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-application/agents/openai.yaml +0 -5
  803. package/template/.codex/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-domain/SKILL.md +0 -8
  804. package/template/.codex/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-domain/agents/openai.yaml +0 -5
  805. package/template/.codex/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-infrastructure/SKILL.md +0 -8
  806. package/template/.codex/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-infrastructure/agents/openai.yaml +0 -5
  807. package/template/.codex/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-web/SKILL.md +0 -8
  808. package/template/.codex/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-web/agents/openai.yaml +0 -5
  809. package/template/.codex/skills/yss-mvc-scaffold-generator/SKILL.md +0 -8
  810. package/template/.codex/skills/yss-mvc-scaffold-generator/agents/openai.yaml +0 -4
  811. package/template/.codex/skills/yss-mvc-scaffold-generator/assets/logback-spring.xml.template +0 -50
  812. package/template/.codex/skills/yss-mvc-scaffold-generator/assets/smart-doc.json.template +0 -42
  813. package/template/.codex/skills/yss-mvc-scaffold-generator/references/architecture.md +0 -28
  814. package/template/.codex/skills/yss-mvc-scaffold-generator/references/history/generate_project.mjs.txt +0 -137
  815. package/template/.codex/skills/yss-mvc-scaffold-generator/references/history/generate_project.test.mjs.txt +0 -341
  816. package/template/.codex/skills/yss-mvc-scaffold-generator/references/history/skill.md +0 -87
  817. package/template/.codex/skills/yss-mvc-scaffold-generator/scripts/generate_project.mjs +0 -3
  818. package/template/.codex/skills/yss-mvc-scaffold-generator/scripts/generate_project.test.mjs +0 -9
  819. package/template/.codex/skills/yss-mvc-scaffold-generator/scripts/lib/envelope.mjs +0 -74
  820. package/template/.codex/skills/yss-mvc-scaffold-generator/scripts/lib/envelope.test.mjs +0 -36
  821. package/template/.codex/skills/yss-mvc-scaffold-generator/scripts/lib/runtime.mjs +0 -114
  822. package/template/.codex/skills/yss-mvc-scaffold-generator/scripts/lib/storage.mjs +0 -90
  823. package/template/.codex/skills/yss-mvc-scaffold-generator/scripts/lib/templates.mjs +0 -54
  824. package/template/.codex/skills/yss-mvc-scaffold-generator/scripts/verify_project.mjs +0 -103
  825. package/template/.cursor/skills/yss-antd-design/SKILL.md +0 -35
  826. package/template/.cursor/skills/yss-antd-design/references/boundaries.md +0 -30
  827. package/template/.cursor/skills/yss-antd-design/references/cli-matrix.md +0 -38
  828. package/template/.cursor/skills/yss-antd-design/references/evidence.md +0 -35
  829. package/template/.cursor/skills/yss-antd-design/scripts/validate-frontmatter.mjs +0 -46
  830. package/template/.cursor/skills/yss-antd-design/scripts/validate-frontmatter.test.mjs +0 -27
  831. package/template/.cursor/skills/yss-antdv-next-design/SKILL.md +0 -48
  832. package/template/.cursor/skills/yss-antdv-next-design/references/boundaries.md +0 -25
  833. package/template/.cursor/skills/yss-antdv-next-design/references/cli-matrix.md +0 -34
  834. package/template/.cursor/skills/yss-antdv-next-design/references/fact-pack.md +0 -38
  835. package/template/.cursor/skills/yss-antdv-next-design/scripts/collect-antdv-next-facts.mjs +0 -213
  836. package/template/.cursor/skills/yss-antdv-next-design/scripts/validate-fact-pack.mjs +0 -168
  837. package/template/.cursor/skills/yss-antdv-next-design/tests/run-scenarios.mjs +0 -139
  838. package/template/.cursor/skills/yss-components/SKILL.md +0 -386
  839. package/template/.cursor/skills/yss-components/agents/openai.yaml +0 -5
  840. package/template/.cursor/skills/yss-components/references/frontend-docs.md +0 -9
  841. package/template/.cursor/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-adapter/SKILL.md +0 -31
  842. package/template/.cursor/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-adapter/agents/openai.yaml +0 -5
  843. package/template/.cursor/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-application/SKILL.md +0 -8
  844. package/template/.cursor/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-application/agents/openai.yaml +0 -5
  845. package/template/.cursor/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-domain/SKILL.md +0 -8
  846. package/template/.cursor/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-domain/agents/openai.yaml +0 -5
  847. package/template/.cursor/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-infrastructure/SKILL.md +0 -8
  848. package/template/.cursor/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-infrastructure/agents/openai.yaml +0 -5
  849. package/template/.cursor/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-web/SKILL.md +0 -8
  850. package/template/.cursor/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-web/agents/openai.yaml +0 -5
  851. package/template/.cursor/skills/yss-mvc-scaffold-generator/SKILL.md +0 -8
  852. package/template/.cursor/skills/yss-mvc-scaffold-generator/agents/openai.yaml +0 -4
  853. package/template/.cursor/skills/yss-mvc-scaffold-generator/assets/logback-spring.xml.template +0 -50
  854. package/template/.cursor/skills/yss-mvc-scaffold-generator/assets/smart-doc.json.template +0 -42
  855. package/template/.cursor/skills/yss-mvc-scaffold-generator/references/architecture.md +0 -28
  856. package/template/.cursor/skills/yss-mvc-scaffold-generator/references/history/generate_project.mjs.txt +0 -137
  857. package/template/.cursor/skills/yss-mvc-scaffold-generator/references/history/generate_project.test.mjs.txt +0 -341
  858. package/template/.cursor/skills/yss-mvc-scaffold-generator/references/history/skill.md +0 -87
  859. package/template/.cursor/skills/yss-mvc-scaffold-generator/scripts/generate_project.mjs +0 -3
  860. package/template/.cursor/skills/yss-mvc-scaffold-generator/scripts/generate_project.test.mjs +0 -9
  861. package/template/.cursor/skills/yss-mvc-scaffold-generator/scripts/lib/envelope.mjs +0 -74
  862. package/template/.cursor/skills/yss-mvc-scaffold-generator/scripts/lib/envelope.test.mjs +0 -36
  863. package/template/.cursor/skills/yss-mvc-scaffold-generator/scripts/lib/runtime.mjs +0 -114
  864. package/template/.cursor/skills/yss-mvc-scaffold-generator/scripts/lib/storage.mjs +0 -90
  865. package/template/.cursor/skills/yss-mvc-scaffold-generator/scripts/lib/templates.mjs +0 -54
  866. package/template/.cursor/skills/yss-mvc-scaffold-generator/scripts/verify_project.mjs +0 -103
  867. package/template/.pi/skills/yss-antd-design/SKILL.md +0 -35
  868. package/template/.pi/skills/yss-antd-design/references/boundaries.md +0 -30
  869. package/template/.pi/skills/yss-antd-design/references/cli-matrix.md +0 -38
  870. package/template/.pi/skills/yss-antd-design/references/evidence.md +0 -35
  871. package/template/.pi/skills/yss-antd-design/scripts/validate-frontmatter.mjs +0 -46
  872. package/template/.pi/skills/yss-antd-design/scripts/validate-frontmatter.test.mjs +0 -27
  873. package/template/.pi/skills/yss-antdv-next-design/SKILL.md +0 -48
  874. package/template/.pi/skills/yss-antdv-next-design/references/boundaries.md +0 -25
  875. package/template/.pi/skills/yss-antdv-next-design/references/cli-matrix.md +0 -34
  876. package/template/.pi/skills/yss-antdv-next-design/references/fact-pack.md +0 -38
  877. package/template/.pi/skills/yss-antdv-next-design/scripts/collect-antdv-next-facts.mjs +0 -213
  878. package/template/.pi/skills/yss-antdv-next-design/scripts/validate-fact-pack.mjs +0 -168
  879. package/template/.pi/skills/yss-antdv-next-design/tests/run-scenarios.mjs +0 -139
  880. package/template/.pi/skills/yss-components/SKILL.md +0 -386
  881. package/template/.pi/skills/yss-components/agents/openai.yaml +0 -5
  882. package/template/.pi/skills/yss-components/references/frontend-docs.md +0 -9
  883. package/template/.pi/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-adapter/SKILL.md +0 -31
  884. package/template/.pi/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-adapter/agents/openai.yaml +0 -5
  885. package/template/.pi/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-application/SKILL.md +0 -8
  886. package/template/.pi/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-application/agents/openai.yaml +0 -5
  887. package/template/.pi/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-domain/SKILL.md +0 -8
  888. package/template/.pi/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-domain/agents/openai.yaml +0 -5
  889. package/template/.pi/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-infrastructure/SKILL.md +0 -8
  890. package/template/.pi/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-infrastructure/agents/openai.yaml +0 -5
  891. package/template/.pi/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-web/SKILL.md +0 -8
  892. package/template/.pi/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-web/agents/openai.yaml +0 -5
  893. package/template/.pi/skills/yss-mvc-scaffold-generator/SKILL.md +0 -8
  894. package/template/.pi/skills/yss-mvc-scaffold-generator/agents/openai.yaml +0 -4
  895. package/template/.pi/skills/yss-mvc-scaffold-generator/assets/logback-spring.xml.template +0 -50
  896. package/template/.pi/skills/yss-mvc-scaffold-generator/assets/smart-doc.json.template +0 -42
  897. package/template/.pi/skills/yss-mvc-scaffold-generator/references/architecture.md +0 -28
  898. package/template/.pi/skills/yss-mvc-scaffold-generator/references/history/generate_project.mjs.txt +0 -137
  899. package/template/.pi/skills/yss-mvc-scaffold-generator/references/history/generate_project.test.mjs.txt +0 -341
  900. package/template/.pi/skills/yss-mvc-scaffold-generator/references/history/skill.md +0 -87
  901. package/template/.pi/skills/yss-mvc-scaffold-generator/scripts/generate_project.mjs +0 -3
  902. package/template/.pi/skills/yss-mvc-scaffold-generator/scripts/generate_project.test.mjs +0 -9
  903. package/template/.pi/skills/yss-mvc-scaffold-generator/scripts/lib/envelope.mjs +0 -74
  904. package/template/.pi/skills/yss-mvc-scaffold-generator/scripts/lib/envelope.test.mjs +0 -36
  905. package/template/.pi/skills/yss-mvc-scaffold-generator/scripts/lib/runtime.mjs +0 -114
  906. package/template/.pi/skills/yss-mvc-scaffold-generator/scripts/lib/storage.mjs +0 -90
  907. package/template/.pi/skills/yss-mvc-scaffold-generator/scripts/lib/templates.mjs +0 -54
  908. package/template/.pi/skills/yss-mvc-scaffold-generator/scripts/verify_project.mjs +0 -103
@@ -0,0 +1,257 @@
1
+ import {sliceRepositories} from './slice-repositories.mjs';
2
+ import { sliceCheckApplicability } from './slice-applicability.mjs';
3
+ import path from 'node:path';
4
+ import fs from 'node:fs';
5
+ import { stringify } from '../vendor/yaml.mjs';
6
+ import { safe, hash, digest, write } from './strategic-handoff-io.mjs';
7
+ import { compileDefaultImplementationContract, loadCompilerContract } from './implementation-contract-compiler.mjs';
8
+ import { normalizeSliceContract, parseSliceYaml, readSliceSources, resolveSliceBasis, sourceSliceContract, sliceArchitectureEvidence } from './slice-contract.mjs';
9
+
10
+ const object=value=>value && typeof value==='object' && !Array.isArray(value);
11
+ const same=(a,b)=>digest(a)===digest(b);
12
+ function metadata(text) {
13
+ const front=/^---\r?\n([\s\S]*?)\r?\n---(?:\r?\n|$)/.exec(text);
14
+ if(front)return parseSliceYaml(front[1]);
15
+ return (/^\s*[{[]/.test(text)||/^[A-Za-z_][\w-]*:\s/m.test(text)&&!/^#/m.test(text))?parseSliceYaml(text):{};
16
+ }
17
+ function mergeFacts(left,right,path,report) {
18
+ if(left===undefined)return structuredClone(right);
19
+ if(right===undefined)return structuredClone(left);
20
+ if(object(left)&&object(right))return Object.fromEntries([...new Set([...Object.keys(left),...Object.keys(right)])].map(key=>[key,mergeFacts(left[key],right[key],`${path}.${key}`,report)]));
21
+ if(!same(left,right))report.blockers.push({field:path,reason:'conflict',before:left,after:right,recovery:'回到来源确认当前事实,不使用最后覆盖'});
22
+ return structuredClone(left);
23
+ }
24
+ function markdownAcceptance(text) {
25
+ const rows=text.split('\n'),result={};let active=false;
26
+ rows.forEach((line,index)=>{
27
+ if(/^##\s/.test(line))active=/验收/.test(line);
28
+ if(active&&/^\s*-\s+(?:\[[ xX]\]\s*)?\S/.test(line)) {
29
+ const id=/(?:AC|SC|验收)[-_][\w-]+/.exec(line)?.[0] || `acceptance-${Object.keys(result).length+1}`;
30
+ if(result[id])throw new TypeError(`验收 ID 重复: ${id}`);
31
+ result[id]={source:'ticket',locator:`lines:${index+1}-${index+1}`};
32
+ }
33
+ });return result;
34
+ }
35
+ function lifecycleSources(checkpoint,report) {
36
+ const result={};
37
+ for(const [artifact,key]of Object.entries({'artifact.spec':'spec','artifact.engineering-baseline':'engineering_baseline','artifact.architecture-review':'architecture_review','artifact.technical-design':'technical_design','artifact.data-architecture':'data_architecture','artifact.state-matrix':'state_matrix','artifact.prototype-deliverable':'prototype_deliverable','artifact.prototype-review':'prototype_review','artifact.prototype-confirmation':'prototype_confirmation','artifact.openapi-freeze-record':'openapi_freeze'})) {
38
+ const value=checkpoint.artifacts?.[artifact];if(value===undefined)continue;
39
+ if(typeof value==='string')result[key]={ref:value};
40
+ else if(object(value)&&typeof value.ref==='string')result[key]=Object.fromEntries(['ref','version','digest','approval_ref'].filter(k=>value[k]!==undefined).map(k=>[k,value[k]]));
41
+ else report.blockers.push({field:`artifacts.${artifact}`,reason:'上游引用不明确,需选择当前绑定'});
42
+ }
43
+ return result;
44
+ }
45
+ /** sources select existing assets; refinements contain ONLY new slice facts, never an approved contract. */
46
+ export function prepareSliceImplementationContract({root=process.cwd(),ticket_ref,checkpoint_ref,sources={},refinements={},approved_slice}={}) {
47
+ const started=performance.now();
48
+ const report={read_only:true,blockers:[],sources:{},provenance:[],reason_chains:{},checks:[]};
49
+ const snapshots=new Map();
50
+ const read=ref=>{if(!snapshots.has(ref))snapshots.set(ref,fs.readFileSync(safe(root,ref)));return snapshots.get(ref);};
51
+ let contract={schema_version:3,status:'blocked'};
52
+ try {
53
+ let ticketText='',ticket={},saved={};
54
+ try {ticketText=read(ticket_ref).toString('utf8');ticket=metadata(ticketText);}catch(error){report.blockers.push({code:'SLICE_SOURCE_UNREADABLE',field:'basis.ticket',source_ref:ticket_ref,reason:error.message});}
55
+ if(checkpoint_ref)try {saved=parseSliceYaml(read(checkpoint_ref));}catch(error){report.blockers.push({code:'SLICE_SOURCE_UNREADABLE',field:'checkpoint',source_ref:checkpoint_ref,reason:error.message});}
56
+ const fromTicket=ticket.slice_implementation || {};
57
+ const facts=mergeFacts(saved.slice_implementation || {},fromTicket,'slice',report);
58
+ const input=mergeFacts(facts,refinements,'slice',report);
59
+ for(const field of ['status','resolution','schema_version','readiness'])if(Object.hasOwn(input,field))report.blockers.push({field,reason:'由编译器生成,不接受调用方指定'});
60
+ const inputKeys=['contract_id','contract_version','slice_id','sources','scope','applicability','recipe_ids','required_capabilities','conditions','acceptance','verification','work_units','extensions'];
61
+ for(const field of Object.keys(input))if(!inputKeys.includes(field))report.blockers.push({field,reason:'未知输入字段,禁止静默丢弃'});
62
+ contract={schema_version:3,contract_id:input.contract_id,contract_version:input.contract_version,slice_id:input.slice_id,status:'blocked'};
63
+ for(const field of ['contract_id','contract_version','slice_id','scope','applicability','verification','work_units'])if(input[field]===undefined)report.blockers.push({code:'SLICE_INPUT_MISSING',field:`slice.${field}`,reason:'缺少切片必要输入',recovery:'优先从 Ticket / checkpoint 整理;只补缺失的切片细化'});
64
+ for(const field of ['impacted_areas','allowed_write_paths'])if(input.scope?.[field]===undefined)report.blockers.push({code:'SLICE_INPUT_MISSING',field:`scope.${field}`,reason:'影响与授权范围未确定',responsibility:field==='allowed_write_paths'?'user-decision':'professional-review',recovery:'先确认影响与既有授权范围;不能从目录猜测'});
65
+
66
+ const selected=mergeFacts(lifecycleSources(saved,report),mergeFacts(input.sources || {},sources,'sources',report),'sources',report);
67
+ if(selected.ticket && (typeof selected.ticket==='string'?selected.ticket:selected.ticket.ref)!==ticket_ref)throw new TypeError('Ticket 来源冲突');
68
+ selected.ticket=selected.ticket || {ref:ticket_ref};
69
+ if(input.scope?.risk_level){selected.lifecycle_registry??={ref:'docs/process/lifecycle-registry.yaml'};selected.process_tailoring??={ref:'docs/process/harness-process-tailoring.md'};}
70
+ if(!selected.context&&fs.existsSync(safe(root,'CONTEXT.md',{missing:true})))selected.context={ref:'CONTEXT.md'};
71
+ const basis={},seen=new Map();
72
+ for(const [key,value] of Object.entries(selected)) {
73
+ try {
74
+ if(typeof value==='string' && Object.hasOwn(selected,value)) {basis[key]=value;continue;}
75
+ const binding=typeof value==='string'?{ref:value}:value;
76
+ const bytes=read(binding.ref),rawDigest=hash(bytes);
77
+ if(binding.digest&&binding.digest!==rawDigest)throw new TypeError(`stale: 来源 ${key}`);
78
+ const data=metadata(bytes.toString('utf8'));
79
+ const sourceVersion=data.requirement_version??data.version??data.contract_version;
80
+ if(binding.version!==undefined&&sourceVersion!==undefined&&String(binding.version)!==String(sourceVersion))throw new TypeError(`来源版本冲突: ${key}`);
81
+ const version=binding.version||data.requirement_version||data.version||data.contract_version;
82
+ basis[key]={ref:binding.ref,digest:rawDigest,...(version?{version:String(version)}:{}),...(binding.approval_ref?{approval_ref:binding.approval_ref}:{})};
83
+ if(seen.has(binding.ref)) {
84
+ const previous=seen.get(binding.ref);
85
+ if(!same(basis[key],basis[previous]))throw new TypeError(`来源绑定冲突: ${key}/${previous}`);
86
+ basis[key]=previous;
87
+ }else seen.set(binding.ref,key);
88
+ report.provenance.push({target:`basis.${key}`,source_ref:binding.ref,digest:rawDigest,rule:'original-bytes'});
89
+ }catch(error){report.blockers.push({code:(error.code==='ENOENT'||/文件不可读/.test(error.message))?'SLICE_SOURCE_UNREADABLE':/冲突/.test(error.message)?'SLICE_SOURCE_CONFLICT':'SLICE_SOURCE_INVALID',field:`basis.${key}`,source_ref:typeof value==='string'?value:value?.ref,reason:error.message,responsibility:'agent',recovery:'补齐当前来源或纠正绑定后重新准备'});}
90
+ }
91
+ const extraRequired=[...(input.applicability?.backend?.status==='required'?['technical_design','repository_registration','manifest','backend_repository','maven_wrapper']:[]),...(input.applicability?.frontend?.status==='required'?(input.applicability.frontend.baseline_kind==='existing-ui-baseline'?['existing_ui_baseline','frontend_delivery']:['requirement_freeze','low_fidelity_review','prototype_review','prototype_profile_decision','prototype_deliverable','prototype_deliverable_verification','prototype_confirmation','visual_baseline','state_matrix']):[]),...(input.applicability?.api?[input.applicability.api.status==='required'?'openapi_freeze':'no_api_impact_record']:[])];
92
+ for(const key of ['spec','ticket','engineering_baseline','implementation_repository','build_architecture_checklist',...extraRequired,...(!input.scope?.risk_level?['architecture_review']:[])])if(!selected[key])report.blockers.push({code:'SLICE_SOURCE_MISSING',field:`basis.${key}`,reason:'缺少必要来源',responsibility:'agent',recovery:'绑定已有当前资产;不能用空文档替代'});
93
+ contract.basis=basis;
94
+ if(report.blockers.length){report.checks.push({check:'dependent-compilation',result:'not-executed',reason:'来源或输入存在独立阻断'});throw Object.assign(new Error('依赖未就绪'),{code:'SLICE_DEPENDENCIES_UNAVAILABLE'});}
95
+ const sourceDoc=key=>basis[key]?metadata(read(resolveSliceBasis({basis},key).ref).toString('utf8')):{};
96
+ const registration=sourceDoc('implementation_repository'),baseline=sourceDoc('engineering_baseline');
97
+ const registeredRoot=registration.local_worktree?(registration.project_root&&registration.project_root!=='.'?path.resolve(registration.local_worktree,registration.project_root):registration.local_worktree):undefined;
98
+ const scope={...(registeredRoot?{project_roots:[registeredRoot]}:{}),...input.scope};
99
+ // Registration is an upper bound. Never use its allowed_write_paths as slice authorization.
100
+ if(!input.extensions?.cross_repo?.repository_bindings&&registeredRoot&&scope.project_roots?.some(p=>p!==registeredRoot))throw new TypeError('实施仓库与登记冲突');
101
+ if(!input.extensions?.cross_repo?.repository_bindings&&registration.allowed_write_paths && scope.allowed_write_paths) {
102
+ const {withinSlicePath}=helpers;
103
+ if(scope.allowed_write_paths.some(p=>!registration.allowed_write_paths.some(parent=>withinSlicePath(p,parent))))throw new TypeError('Slice 写范围超出登记');
104
+ }
105
+ const applicability=structuredClone(input.applicability);
106
+ if(scope.risk_level){const calculated=sliceCheckApplicability(scope,sourceDoc('lifecycle_registry'));if(applicability.checks&&!same(applicability.checks,calculated))throw new TypeError('材料适用性与生命周期规则冲突');applicability.checks=calculated;}
107
+ const architecture_identity=baseline.architecture_identity || registration.architecture_identity;
108
+ if(baseline.architecture_identity&&registration.architecture_identity&&!same(baseline.architecture_identity,registration.architecture_identity))throw new TypeError('工程基线与登记架构冲突');
109
+ const bound=key=>basis[key]?resolveSliceBasis({basis},key):undefined;
110
+ const architecture_evidence=architecture_identity?sliceArchitectureEvidence({basis,resolution:{architecture_identity}},readSliceSources({basis},{root})):undefined;
111
+ const compilerRules=loadCompilerContract();
112
+ scope.full_reroute_triggers=[...new Set([...(compilerRules.full_reroute_triggers||[]),...(scope.full_reroute_triggers||[])])];
113
+ for(const impact of input.extensions?.backend?.component_impacts||[])if(!compilerRules.impact_to_capabilities[impact])throw new TypeError(`未知组件影响: ${impact}`);
114
+ const componentCapabilities=(input.extensions?.backend?.component_impacts||[]).flatMap(impact=>compilerRules.impact_to_capabilities[impact]||[]);
115
+ const compileBase={root,slice_id:input.slice_id,conditions:input.conditions||[]};
116
+ let compiled;
117
+ if(input.extensions?.cross_repo?.repository_bindings) {
118
+ const repositories=sliceRepositories({basis,scope,extensions:input.extensions,work_units:input.work_units,resolution:{}},readSliceSources({basis},{root}),{root});
119
+ const results=Object.entries(repositories).map(([projectRoot,repo])=>{
120
+ const recipeIds=repo.recipe_refs||(input.recipe_ids||[]).filter(id=>!id.startsWith('backend.')&&!id.startsWith('frontend.')||id.startsWith(`${repo.project.delivery_role}.`));
121
+ const requiredCapabilities=repo.capability_refs||input.required_capabilities||[];
122
+ if(recipeIds.some(id=>!(input.recipe_ids||[]).includes(id))||requiredCapabilities.some(id=>!(input.required_capabilities||[]).includes(id)))throw new TypeError('逐仓编译引用不属于切片新增输入');
123
+ return compileDefaultImplementationContract({...compileBase,recipeIds,requiredCapabilities:[...requiredCapabilities,...(repo.project.delivery_role==='backend'?componentCapabilities:[])],architecture_identity:repo.resolution.architecture_identity,architecture_evidence:repo.resolution.architecture_evidence,technical_design:repo.resolution.technical_design,...(repo.resolution.frontend_delivery?{frontend_delivery:repo.resolution.frontend_delivery}:{}),...(approved_slice?{approved_slice,work_unit_id:input.work_units.find(u=>u.project_root===projectRoot)?.id}:{})});
124
+ });
125
+ if(results.some(r=>r.registry_digest!==results[0].registry_digest||r.compiler_contract_digest!==results[0].compiler_contract_digest))throw new TypeError('逐仓编译依据冲突:准备期间来源发生变化');
126
+ compiled={...results[0],required_capabilities:[...new Set(results.flatMap(r=>r.required_capabilities))],required_skills:[...new Set(results.flatMap(r=>r.required_skills))],recipe_ids:[...new Set(results.flatMap(r=>r.recipe_ids))],readiness_blockers:results.flatMap(r=>r.readiness_blockers||[]),reason_chains:Object.fromEntries(Object.keys(repositories).map((p,i)=>[p,results[i].reason_chains]))};
127
+ delete compiled.architecture_identity;
128
+ } else compiled=compileDefaultImplementationContract({...compileBase,recipeIds:input.recipe_ids||[],requiredCapabilities:[...new Set([...(input.required_capabilities||[]),...componentCapabilities])],architecture_identity,architecture_evidence,technical_design:bound('technical_design'),...(bound('frontend_delivery')?{frontend_delivery:{acceptance_ref:bound('frontend_delivery').ref,digest:bound('frontend_delivery').digest}}:{}),...(approved_slice?{approved_slice}:{})});
129
+ if(compiled.compiler_contract_digest!==digest(compilerRules).slice(7))throw new TypeError('编译规则来源冲突:准备期间发生变化');
130
+ const resolution=Object.fromEntries(['required_capabilities','required_skills','recipe_ids','conditions','registry_digest','compiler_contract_digest','architecture_identity'].filter(key=>compiled[key]!==undefined).map(key=>[key,compiled[key]]));
131
+ contract={schema_version:3,ticket_policy:{mode:'frozen-requirements',state_owner:'tracker-or-task-package'},contract_id:input.contract_id,contract_version:input.contract_version,slice_id:input.slice_id,status:'draft',basis,scope,applicability,resolution,acceptance:input.acceptance||markdownAcceptance(ticketText),verification:input.verification,work_units:input.work_units,...(input.extensions?{extensions:input.extensions}:{})};
132
+ report.reason_chains=compiled.reason_chains;
133
+ for(const reason of compiled.readiness_blockers||[])report.blockers.push({reason});
134
+ normalizeSliceContract(contract,{root});
135
+ report.checks.push({check:'structure-sources-scope-acceptance',result:'pass'});
136
+ report.provenance.push({target:'resolution',source_ref:'docs/agents/yss-skill-registry.yaml',digest:compiled.registry_digest,rule:'existing-capability-compiler'});
137
+ for(const field of ['scope','acceptance','verification','work_units','applicability','extensions'])if(contract[field]) {
138
+ const origins=[];
139
+ if(saved.slice_implementation?.[field]!==undefined)origins.push({kind:'checkpoint',ref:checkpoint_ref});
140
+ if(fromTicket[field]!==undefined)origins.push({kind:'ticket-metadata',ref:ticket_ref});
141
+ if(refinements[field]!==undefined)origins.push({kind:'agent-refinement'});
142
+ if(field==='scope'&&registeredRoot&&!input.scope?.project_roots)origins.push({kind:'repository-registration',ref:resolveSliceBasis({basis},'implementation_repository').ref});
143
+ if(field==='scope'&&input.extensions?.cross_repo?.repository_bindings)for(const keys of Object.values(input.extensions.cross_repo.repository_bindings))origins.push({kind:'repository-registration',ref:resolveSliceBasis({basis},keys.implementation_repository).ref});
144
+ if(field==='acceptance'&&!input.acceptance)origins.push({kind:'ticket-acceptance',ref:ticket_ref});
145
+ if(field==='applicability'&&scope.risk_level)origins.push({kind:'lifecycle-rule',ref:resolveSliceBasis({basis},'lifecycle_registry').ref});
146
+ report.provenance.push({target:field,origins,requires_professional_review:true});
147
+ }
148
+ }catch(error){if(error.code!=='SLICE_DEPENDENCIES_UNAVAILABLE')report.blockers.push({reason:error.message,recovery:'补齐已确认输入后重新准备;草案不授予执行权限'});report.checks.push({check:'assembly',result:'not-executed',reason:'前置检查未通过'});}
149
+ for(const [ref,bytes] of snapshots) {
150
+ try {if(hash(fs.readFileSync(safe(root,ref)))!==hash(bytes))report.blockers.push({field:ref,reason:'生成期间来源变化'});}catch(error){report.blockers.push({field:ref,reason:error.message});}
151
+ report.sources[ref]=hash(bytes);
152
+ }
153
+ report.blockers=report.blockers.map(b=>({code:b.code||(/conflict|冲突/.test(b.reason)?'SLICE_INPUT_CONFLICT':'SLICE_INPUT_INVALID'),field:b.field||'slice',source_ref:b.source_ref||null,responsibility:b.responsibility||(/user.decision|用户决定|实施授权/.test(b.reason)?'user-decision':/conflict|冲突|技术设计|架构/.test(b.reason)?'professional-review':'agent'),recovery:b.recovery||'核对所列来源并补齐细化后重新准备',...b}));
154
+ report.blockers=report.blockers.filter((b,i,all)=>all.findIndex(x=>x.code===b.code&&x.field===b.field&&x.source_ref===b.source_ref)===i);
155
+ contract.status=report.blockers.length?'blocked':'ready-for-lifecycle-review';
156
+ report.metrics={elapsed_ms:Math.round(performance.now()-started),preparation_round:null,additional_human_confirmations:null,reapproval_reasons:[],measurement:'observed-preparation-only; interaction counts not recorded',unique_source_files:snapshots.size,refinement_fields:Object.keys(refinements).length,contract_bytes:Buffer.byteLength(stringify({slice_contract:contract}))};
157
+ return {slice_contract:contract,report};
158
+ }
159
+ import * as helpers from './slice-contract.mjs';
160
+
161
+ export function persistSliceDraft(result,ref,{root=process.cwd()}={}) {
162
+ if(!['draft','blocked','ready-for-lifecycle-review'].includes(result.slice_contract?.status))throw new TypeError('只能保存编译器草案');
163
+ for(const [source,expected]of Object.entries(result.report?.sources||{}))if(hash(fs.readFileSync(safe(root,source)))!==expected)throw new TypeError(`stale: 保存前来源变化 ${source}`);
164
+ if(result.slice_contract.status!=='blocked')normalizeSliceContract(result.slice_contract,{root});
165
+ const bytes=stringify({slice_contract:result.slice_contract});
166
+ const reportRef=`${ref}.preparation.json`;
167
+ if(fs.existsSync(safe(root,reportRef,{missing:true})))throw Object.assign(new TypeError('EEXIST: 准备报告目标已存在'),{code:'EEXIST'});
168
+ write(root,ref,bytes); // wx: never overwrite a draft or approval.
169
+ write(root,reportRef,JSON.stringify({binding:{ref,digest:hash(bytes)},...result.report},null,2)+'\n');
170
+ return ref;
171
+ }
172
+
173
+ /** Explicit, non-destructive migration; no new authorization is inferred. */
174
+ export function migrateSliceContractV2(document,{root=process.cwd(),ticket_ref,sources={},refinements={},...rest}={}) {
175
+ const old=sourceSliceContract(document);
176
+ if(old?.schema_version!==2)throw new TypeError('显式迁移只接受 Slice v2');
177
+ const conflicts=[];
178
+ const meaningful=value=>value!==undefined&&value!==null&&value!==''&&(!Array.isArray(value)||value.length>0);
179
+ const compare=(a,b,label)=>{if(meaningful(a)&&meaningful(b)&&!same(a,b))conflicts.push({field:label,reason:'conflict',before:a,after:b});};
180
+ for(const key of ['required_skills','required_capabilities'])compare(old.common?.[key],old.resolution?.[key],key);
181
+ compare(old.frontend?.delivery,old.resolution?.frontend_delivery,'frontend_delivery');
182
+ const constraintKeys=['application_boundary','transaction_boundary','persistence_strategy','aggregate_refs','invariant_refs','state_behavior_refs','gateway_boundary_ref','domain_test_seams','application_test_seams'];
183
+ for(const key of constraintKeys)compare(old.backend?.[key],old.backend?.tactical_ddd?.[key],`backend.${key}`);
184
+ if(refinements.contract_version===undefined||refinements.contract_version===String(old.contract_version))conflicts.push({field:'contract_version',reason:'迁移必须指定新版本'});
185
+ if(old.readiness?.blockers?.length||old.readiness?.stale_inputs?.length)conflicts.push({field:'readiness',reason:'旧合同仍有阻断或过期输入'});
186
+ const sourceMap=Object.fromEntries(Object.entries(old.lifecycle_refs||{}).filter(([,v])=>typeof v==='string'&&v).map(([k,v])=>[k,{ref:v}]));
187
+ for(const [key,binding]of Object.entries({...old.resolution?.architecture_evidence,...(old.resolution?.technical_design?{technical_design:old.resolution.technical_design}:{})})) {
188
+ if(!binding?.ref)continue;
189
+ if(sourceMap[key]&&sourceMap[key].ref!==binding.ref)conflicts.push({field:`basis.${key}`,reason:'阅读引用与冻结绑定冲突'});
190
+ sourceMap[key]=binding;
191
+ }
192
+ if(sourceMap.openapi_freeze_or_no_impact){sourceMap[old.contract?.api_impact?'openapi_freeze':'no_api_impact_record']=sourceMap.openapi_freeze_or_no_impact;delete sourceMap.openapi_freeze_or_no_impact;}
193
+ const frontendBinding=old.frontend?.delivery||old.resolution?.frontend_delivery;
194
+ if(frontendBinding)sourceMap.frontend_delivery={ref:frontendBinding.acceptance_ref,digest:frontendBinding.digest};
195
+ if(sourceMap.tactical_design&&!sourceMap.technical_design)sourceMap.technical_design=sourceMap.tactical_design;
196
+ const applicability=Object.fromEntries(['frontend','backend','api','cross_repo'].map(key=>{
197
+ const required=key==='api'?old.contract?.api_impact:key==='cross_repo'?old.cross_repo?.repositories?.length>1:old[key]?.status==='required';
198
+ const reason=old.readiness?.not_applicable?.find(x=>x.item===key)?.reason;
199
+ return [key,required?{status:'required'}:{status:'not-applicable',reason:reason||refinements.applicability?.[key]?.reason}];
200
+ }));
201
+ const scopeKeys=['impacted_areas','implementation_path_policy','project_roots','allowed_write_paths','forbidden_patterns','context_plan','doubt_driven_review','human_review_points','full_reroute_triggers','optional_skills','unavailable_skills'];
202
+ const scope=Object.fromEntries(scopeKeys.filter(k=>old.common?.[k]!==undefined).map(k=>[k,old.common[k]]));
203
+ const checkUnknown=(value,known,prefix)=>{for(const [key,item]of Object.entries(value||{}))if(meaningful(item)&&!known.includes(key))conflicts.push({field:`${prefix}.${key}`,reason:'未映射约束,禁止静默丢弃'});};
204
+ checkUnknown(old,['schema_version','contract_id','contract_version','slice_id','status','suggested_owner_role_id','lifecycle_refs','readiness','resolution','common','frontend','backend','contract','cross_repo','work_units'],'root');
205
+ checkUnknown(old.common,[...scopeKeys,'required_capabilities','required_skills','verification_commands','expected_evidence_files','quality_baseline_ref'],'common');
206
+ checkUnknown(old.resolution,['schema_version','status','slice_id','architecture_identity','architecture_identity_digest','architecture_evidence','technical_design','frontend_delivery','profile_maturity','readiness_blockers','skill_profiles','recipe_ids','conditions','required_capabilities','required_skills','reason_chains','non_expanding_dependencies','excluded_conditional_dependencies','registry_digest','compiler_contract_digest','compiled_at','freshness'],'resolution');
207
+ const ticketRef=ticket_ref||old.lifecycle_refs?.ticket;
208
+ let acceptance=refinements.acceptance;
209
+ if(!acceptance){try{acceptance=markdownAcceptance(fs.readFileSync(safe(root,ticketRef),'utf8'));}catch(error){conflicts.push({field:'acceptance',reason:error.message});acceptance={};}}
210
+ const verification={},work_units=[],extensions={};
211
+ for(const entry of old.work_units||[]) {
212
+ const unit=entry.work_unit||entry;
213
+ for(const key of ['allowed_write_paths','verification_commands','expected_evidence'])compare(entry[key],unit[key],`work_units.${entry.id}.${key}`);
214
+ const projectRoot=unit.project_root||entry.project_root||(scope.project_roots?.length===1?scope.project_roots[0]:undefined);
215
+ const acceptanceRefs=unit.acceptance_refs||(Object.keys(acceptance).length===1?Object.keys(acceptance):[]);
216
+ const seams=[...(old.frontend?.component_test_seams||[]),...(old.frontend?.e2e_paths||[]),...(old.backend?.domain_test_seams||old.backend?.tactical_ddd?.domain_test_seams||[]),...(old.backend?.application_test_seams||old.backend?.tactical_ddd?.application_test_seams||[])];
217
+ const evidence=[...new Set([...(old.common?.expected_evidence_files||[]),...(unit.expected_evidence||[])])];
218
+ const refs=[];
219
+ for(const command of new Set([...(old.common?.verification_commands||[]),...(unit.verification_commands||[])])) {
220
+ const check={command,cwd:projectRoot,expected_evidence:evidence,test_seams:seams,acceptance_refs:acceptanceRefs};
221
+ const existing=Object.entries(verification).find(([,v])=>same(v,check));
222
+ const id=existing?.[0]||`verify-${Object.keys(verification).length+1}`;verification[id]=check;refs.push(id);
223
+ }
224
+ const allowed=unit.allowed_write_paths||entry.allowed_write_paths;
225
+ const next={id:entry.id||unit.id,role_id:entry.role_id||unit.role_id,behavior:unit.behavior,primary_skill:unit.primary_skill,tdd_mode:unit.tdd_mode,verification_refs:refs,acceptance_refs:acceptanceRefs};
226
+ for(const key of ['supporting_skills','controlled_generation','downstream_consumers','convergence_ref','forbidden_patterns'])if(meaningful(unit[key]||entry[key]))next[key]=unit[key]||entry[key];
227
+ if(allowed&&!same(allowed,scope.allowed_write_paths))next.allowed_write_paths=allowed;
228
+ if(scope.project_roots?.length>1)next.project_root=projectRoot;
229
+ work_units.push(next);
230
+ checkUnknown(unit,['id','behavior','role_id','runtime_id','execution_state','workflow_status','task_package_ref','contract_id','contract_version','architecture_identity','project_root','primary_skill','supporting_skills','tdd_mode','allowed_write_paths','expected_evidence','verification_commands','controlled_generation','acceptance_refs','downstream_consumers','convergence_ref','forbidden_patterns'],'work_unit');
231
+ }
232
+ const subset=(value,keys)=>Object.fromEntries(keys.filter(k=>meaningful(value?.[k])).map(k=>[k,value[k]]));
233
+ if(applicability.frontend.status==='required')extensions.frontend=subset(old.frontend,['visual_baseline_case_ids','component_test_seams','e2e_paths','generated_api_client_ref','implementation_verification_ref']);
234
+ if(applicability.backend.status==='required') {
235
+ const constraints={...subset(old.backend,constraintKeys),...subset(old.backend?.tactical_ddd,constraintKeys)};
236
+ extensions.backend={...subset(old.backend,['affected_layers','component_impacts','seam_deferred']),design_refs:['pointer:/design'],...(Object.keys(constraints).length?{constraints}:{})};
237
+ }
238
+ if(applicability.api.status==='required')extensions.api=subset(old.contract,['generated_clients','contract_tests','regeneration_commands']);
239
+ if(applicability.cross_repo.status==='required')extensions.cross_repo=subset(old.cross_repo,['delivery_order','integration_verification','rollback_order']);
240
+ for(const [section,data]of Object.entries({frontend:old.frontend,backend:old.backend})) {
241
+ if(data?.status!=='required')continue;
242
+ for(const key of ['allowed_write_paths','forbidden_patterns','verification_commands','expected_evidence_files'])if(meaningful(data[key])&&!same(data[key],old.common?.[key]))conflicts.push({field:`${section}.${key}`,reason:'独有约束须显式映射至对应工作单元'});
243
+ }
244
+ const knownSub=['status','required_skills','allowed_write_paths','forbidden_patterns','verification_commands','expected_evidence_files'];
245
+ checkUnknown(old.frontend,[...knownSub,'approved_prototype_ref','state_matrix_ref','visual_baseline_ref','visual_baseline_case_ids','component_test_seams','e2e_paths','generated_api_client_ref','implementation_verification_ref','delivery'],'frontend');
246
+ checkUnknown(old.backend,[...knownSub,...constraintKeys,'affected_layers','component_impacts','tactical_design_ref','tactical_design_version','tactical_ddd','seam_deferred'],'backend');
247
+ checkUnknown(old.contract,['api_impact','freeze_ref','no_api_impact_ref','generated_clients','contract_tests','regeneration_commands'],'contract');
248
+ checkUnknown(old.cross_repo,['repositories','delivery_order','integration_verification','rollback_order'],'cross_repo');
249
+ const base={contract_id:old.contract_id,slice_id:old.slice_id,scope,applicability,recipe_ids:old.resolution?.recipe_ids,required_capabilities:old.resolution?.required_capabilities,conditions:old.resolution?.conditions,acceptance,verification,work_units,...(Object.keys(extensions).length?{extensions}:{})};
250
+ const migrated=mergeFacts(base,refinements,'migration', {blockers:conflicts});
251
+ migrated.contract_version=refinements.contract_version;
252
+ const result=prepareSliceImplementationContract({root,ticket_ref:ticketRef,sources:mergeFacts(sourceMap,sources,'sources',{blockers:conflicts}),refinements:migrated,...rest});
253
+ result.report.blockers.push(...conflicts);
254
+ result.report.migration={from_schema:2,to_schema:3,approval_inherited:false};
255
+ if(result.report.blockers.length)result.slice_contract.status='blocked';
256
+ return result;
257
+ }
@@ -0,0 +1,52 @@
1
+ import fs from 'node:fs';
2
+ import { safe, hash, digest } from './strategic-handoff-io.mjs';
3
+ import { selectSliceWorkUnit, readSliceContract, readSliceSources, sliceAcceptanceText, parseSliceYaml, sourceSliceContract } from './slice-contract.mjs';
4
+
5
+ function sections(text) {
6
+ const result={};let name='正文';
7
+ for(const line of text.split('\n')) {
8
+ const heading=/^#{1,3}\s+(.+)/.exec(line);
9
+ if(heading)name=heading[1];
10
+ else (result[name]??=[]).push(line);
11
+ }
12
+ return Object.fromEntries(Object.entries(result).filter(([name])=>!/验收/.test(name)).map(([name,lines])=>[name,lines.join('\n').trim()]));
13
+ }
14
+ export function renderSliceContractView(ref,{root=process.cwd(),unit_id}={}) {
15
+ const {contract,raw,binding,sources}=readSliceContract(ref,{root,diagnostic:true});
16
+ if(raw.status==='blocked') {
17
+ let report;try{report=JSON.parse(fs.readFileSync(safe(root,`${ref}.preparation.json`),'utf8'));if(report.binding.digest!==binding.digest)report=undefined;}catch{}
18
+ const blockers=report?.blockers||[{code:'SLICE_DIAGNOSTICS_UNAVAILABLE',reason:'未找到绑定当前字节的准备报告,需重新准备'}];
19
+ return {read_only:true,diagnostic_only:true,binding,status:'blocked',approval_validity:'阻断草案不可批准或执行',blockers,markdown:`# Slice 诊断\n\n${ref} · ${binding.digest}\n\n阻断草案不可批准或执行。\n\n`+blockers.map(b=>`- ${b.code} · ${b.field||'slice'}:${b.reason};${b.recovery||'重新准备'}`).join('\n')};
20
+ }
21
+
22
+ const displayed=unit_id?selectSliceWorkUnit(contract,unit_id):contract;
23
+ const task=unit_id?contract.work_units?.filter(u=>u.id===unit_id):null;
24
+ if(task&&task.length!==1)throw new TypeError(`工作单元缺失或不唯一: ${unit_id}`);
25
+ const view={ticket_state:raw.ticket_policy?{owner:raw.ticket_policy.state_owner,frozen_status:/^---\r?\n([\s\S]*?)\r?\n---/.test(sources.ticket.text)?parseSliceYaml(/^---\r?\n([\s\S]*?)\r?\n---/.exec(sources.ticket.text)[1]).status||'未记录':'未记录',current_status:'请读取主 tracker 或当前任务包',requirement_version:sources.ticket.version}:{owner:'legacy-ticket'},read_only:true,view_kind:unit_id?'work-unit':'review',binding,status:raw.status,approval_validity:'未核验;本视图不授予执行权限',sources:Object.fromEntries(Object.entries(sources).map(([k,{text,...b}])=>[k,b])),acceptance:raw.schema_version===3?sliceAcceptanceText(raw,sources):{},summary:sources.ticket?sections(sources.ticket.text.replace(/^---\n[\s\S]*?\n---\n/,'')):{说明:'v2 原合同未提供统一摘要来源'},constraints:displayed.common,extensions:{frontend:displayed.frontend,backend:displayed.backend,api:displayed.contract,cross_repo:displayed.cross_repo},...(task?{task:task[0].work_unit||task[0]}:{})};
26
+ const lines=[`# Slice ${raw.slice_id}`,`权威合同:${ref} · ${raw.contract_version} · ${binding.digest}`,`状态:${raw.status};${view.approval_validity}`];
27
+ for(const [name,pattern]of [['交付目标',/目标|构建/],['关键取舍',/取舍/],['风险',/风险/],['待决定事项',/待|决定/]]) { const rows=Object.entries(view.summary).filter(([key])=>pattern.test(key)&&!/^非目标/.test(key));lines.push(`## ${name}`,rows.map(([,text])=>text).filter(Boolean).join('\n')||'未提供说明,需在审查时核实。'); }
28
+ lines.push('## 实施范围',Object.entries(view.summary).filter(([name])=>/范围|非目标/.test(name)).map(([name,text])=>`${name}:${text}`).join('\n')||'未提供业务范围说明,需核对目标、工作单元与写边界。',`工程:${displayed.common?.project_roots?.join(', ') || '见原合同'}`,`允许写入:${displayed.common?.allowed_write_paths?.join(', ') || '见原合同'}`);
29
+ lines.push('## 验收',...Object.entries(view.acceptance).map(([id,text])=>`- ${id}: ${text}`));
30
+ if(raw.ticket_policy)lines.push('## 状态来源',`需求版本:${view.ticket_state.requirement_version};冻结时状态:${view.ticket_state.frozen_status}。当前执行状态:${view.ticket_state.current_status}。`);
31
+ if(view.task)lines.push('## 当前任务',`行为:${view.task.behavior}`,`写范围:${view.task.allowed_write_paths.join(', ')}`,`验证:${view.task.verification_commands.join('; ')}`);
32
+ lines.push('## 执行停止条件','来源或批准过期、越界、缺少证据、验证失败、drift / violation / new_impacts 时停止并回交。','<details><summary>完整工程约束与来源</summary>','', '```json',JSON.stringify({constraints:view.constraints,extensions:view.extensions,task:view.task,sources:view.sources},null,2),'```','</details>');
33
+ view.markdown=lines.join('\n\n');
34
+ return view;
35
+ }
36
+ export function diffSliceContracts(beforeRef,afterRef,{root=process.cwd(),beforeRoot=root}={}) {
37
+ const read=(base,ref)=>{const bytes=fs.readFileSync(safe(base,ref));return{raw:sourceSliceContract(parseSliceYaml(bytes)),binding:{ref,digest:hash(bytes)}};};
38
+ const before=read(beforeRoot,beforeRef),after=read(root,afterRef),changes=[];
39
+ function walk(a,b,p) {
40
+ if(digest(a??null)===digest(b??null)&&((a===undefined)===(b===undefined)))return;
41
+ if(a&&b&&typeof a==='object'&&typeof b==='object'&&!Array.isArray(a)&&!Array.isArray(b)) {
42
+ for(const key of new Set([...Object.keys(a),...Object.keys(b)]))walk(a[key],b[key],p?`${p}.${key}`:key);
43
+ }else changes.push({path:p,before:a??null,after:b??null,category:/^(scope\.(allowed_write_paths|project_roots)|work_units)/.test(p)?'scope':/^acceptance/.test(p)?'acceptance':/^(ticket_policy|basis\.ticket|contract_version|status)/.test(p)?'authorization':'engineering-detail',evidence:{before:before.binding,after:after.binding},decision_impact:'待独立专业审查判定'});
44
+ }
45
+ walk(before.raw,after.raw,'');
46
+ const sourceChecks=[];
47
+ for(const [label,entry,base]of [['before',before,beforeRoot],['after',after,root]]) {
48
+ try {if(entry.raw.schema_version!==3)throw new Error('v2 未冻结统一来源快照');readSliceSources(entry.raw,{root:base});sourceChecks.push({side:label,result:'current'});}
49
+ catch(error){sourceChecks.push({side:label,result:'unknown-or-stale',reason:error.message});}
50
+ }
51
+ return {read_only:true,before:before.binding,after:after.binding,bytes_changed:before.binding.digest!==after.binding.digest,category:changes.length?'requires-review':sourceChecks.some(x=>x.result!=='current')?'unknown-or-stale':before.binding.digest===after.binding.digest?'unchanged':'presentation-only',changes,source_checks:sourceChecks,approval_reusable:false,explanation:'字节变化后须重新绑定;用户确认是否延续由现有协议和独立专业审查裁决。'};
52
+ }
@@ -0,0 +1,211 @@
1
+ import {validateExistingUiBaseline} from './existing-ui-baseline.mjs';
2
+ import {sliceRepositories} from './slice-repositories.mjs';
3
+ import { sliceCheckApplicability } from './slice-applicability.mjs';
4
+ import fs from 'node:fs';
5
+ import path from 'node:path';
6
+ import { parseDocument } from '../vendor/yaml.mjs';
7
+ import { safe, hash, digest, schema } from './strategic-handoff-io.mjs';
8
+
9
+ const originals = new WeakMap();
10
+ const sourceSnapshots = new WeakMap();
11
+ const nonempty = value => typeof value === 'string' && value.trim();
12
+ const unique = values => [...new Set(values)];
13
+ const fail = message => { throw new TypeError(`slice-contract-invalid: ${message}`); };
14
+ const requireThat = (ok, message) => { if (!ok) fail(message); };
15
+ export const sourceSliceContract = value => originals.get(value) || value?.slice_contract || value;
16
+ export function parseSliceYaml(bytes) {
17
+ const doc = parseDocument(String(bytes), { uniqueKeys: true, intAsBigInt: true });
18
+ requireThat(!doc.errors.length, `YAML 无效: ${doc.errors[0]?.message}`);
19
+ const value = doc.toJS({ maxAliasCount: 0 });
20
+ const convert = item => {
21
+ if (typeof item === 'bigint') {
22
+ requireThat(item <= BigInt(Number.MAX_SAFE_INTEGER) && item >= BigInt(Number.MIN_SAFE_INTEGER), 'YAML 整数超出精确范围,请使用字符串');
23
+ return Number(item);
24
+ }
25
+ if (Array.isArray(item)) return item.map(convert);
26
+ if (item && typeof item === 'object') return Object.fromEntries(Object.entries(item).map(([k,v]) => [k,convert(v)]));
27
+ requireThat(typeof item !== 'number' || Number.isFinite(item), 'YAML 非有限数值');
28
+ return item;
29
+ };
30
+ return convert(value);
31
+ }
32
+ export function withinSlicePath(candidate, parent) {
33
+ if (!nonempty(candidate) || !nonempty(parent)) return false;
34
+ const rel = path.relative(path.resolve(parent), path.resolve(candidate));
35
+ return rel === '' || (!path.isAbsolute(rel) && rel !== '..' && !rel.startsWith(`..${path.sep}`));
36
+ }
37
+ function safeWritePath(value) {
38
+ requireThat(nonempty(value) && !path.isAbsolute(value) && !value.split(/[\\/]/).includes('..') && !/[\x00-\x1f*?{}\[\]]/.test(value), `写范围必须为明确的仓库相对路径: ${value}`);
39
+ }
40
+ export function resolveSliceBasis(contract, key, stack = []) {
41
+ requireThat(!stack.includes(key), `依据别名循环: ${[...stack,key].join(' -> ')}`);
42
+ const binding = contract.basis?.[key];
43
+ requireThat(binding !== undefined, `缺少上游依据 ${key}`);
44
+ return typeof binding === 'string' ? resolveSliceBasis(contract,binding,[...stack,key]) : binding;
45
+ }
46
+ export function readSliceSources(contract, { root = process.cwd() } = {}) {
47
+ const result = {}, bytesByPath=new Map();
48
+ for (const key of Object.keys(contract.basis)) {
49
+ const binding = resolveSliceBasis(contract,key);
50
+ const file=safe(root,binding.ref);
51
+ if(!bytesByPath.has(file))bytesByPath.set(file,fs.readFileSync(file));
52
+ const bytes=bytesByPath.get(file);
53
+ requireThat(hash(bytes) === binding.digest, `stale: 上游依据 ${key} 原始字节变化`);
54
+ result[key] = { ...binding, text: bytes.toString('utf8') };
55
+ }
56
+ return result;
57
+ }
58
+ export function sliceArchitectureEvidence(contract,sources) {
59
+ const identity=contract.resolution.architecture_identity;
60
+ if(!identity)return undefined;
61
+ const keys=['engineering_baseline','repository_registration','manifest'];
62
+ if(identity.schema_version!==2)return Object.fromEntries(keys.map(key=>[key,parseSliceYaml(sources[key].text)]));
63
+ const registration=parseSliceYaml(sources.repository_registration.text);
64
+ const evidence={repository_registration:resolveSliceBasis(contract,'repository_registration')};
65
+ for(const key of ['engineering_baseline','manifest']) {
66
+ const original=registration.architecture_evidence?.[key],bound=resolveSliceBasis(contract,key);
67
+ requireThat(original?.ref===bound.ref&&original?.digest===bound.digest,`登记与 ${key} 绑定冲突`);
68
+ evidence[key]=original;
69
+ }
70
+ return evidence;
71
+ }
72
+ function requireKeys(value, names, label) {
73
+ for (const name of names) requireThat(value[name] !== undefined, `${label} 缺少 ${name}`);
74
+ }
75
+ function locate(text, locator) {
76
+ if(locator.startsWith('pointer:')) {
77
+ const value=locator.slice(8).split('/').slice(1).reduce((current,key)=>current?.[key.replaceAll('~1','/').replaceAll('~0','~')],parseSliceYaml(text));
78
+ requireThat(value!==undefined,`定位缺失: ${locator}`);return JSON.stringify(value);
79
+ }
80
+ const lines = text.split('\n');
81
+ const range = /^lines:(\d+)-(\d+)$/.exec(locator);
82
+ if (range) {
83
+ const start=Number(range[1]),end=Number(range[2]);
84
+ requireThat(start>=1&&end>=start&&end<=lines.length,`定位范围无效: ${locator}`);
85
+ return lines.slice(start-1,end).join('\n');
86
+ }
87
+ const body=text.replace(/^---\r?\n[\s\S]*?\r?\n---(?:\r?\n|$)/,'');
88
+ const matches=body.split('\n').filter(line=>line.includes(locator));
89
+ requireThat(matches.length===1, `定位缺失或不唯一: ${locator}`);
90
+ return matches[0];
91
+ }
92
+ export function sliceAcceptanceText(contract, sources) {
93
+ return Object.fromEntries(Object.entries(contract.acceptance).map(([id,item])=>{
94
+ requireThat(sources[item.source],`验收 ${id} 来源缺失`);
95
+ return [id,locate(sources[item.source].text,item.locator)];
96
+ }));
97
+ }
98
+ /** Validate the authoritative v3 document, then expand inherited facts ONLY in memory. */
99
+ export function normalizeSliceContract(document, options = {}) {
100
+ const raw = sourceSliceContract(document);
101
+ requireThat(raw && [2,3].includes(raw.schema_version), 'Slice Implementation Contract schema v1 已停止支持;需要 schema v2 或 v3');
102
+ if (raw.schema_version === 2) return structuredClone(raw);
103
+ schema(raw,'docs/process/schemas/slice-implementation-contract-v3.schema.json');
104
+ const sources=readSliceSources(raw,options), refs=Object.fromEntries(Object.entries(sources).map(([key,item])=>[key,item.ref]));
105
+ requireKeys(refs,['spec','ticket','engineering_baseline','implementation_repository','build_architecture_checklist'],'依据');
106
+ if(!raw.applicability.checks)requireKeys(refs,['architecture_review'],'依据');
107
+ else {
108
+ requireKeys(refs,['lifecycle_registry','process_tailoring'],'适用性依据');
109
+ const registry=parseSliceYaml(sources.lifecycle_registry.text),expected=sliceCheckApplicability(raw.scope,registry);
110
+ requireThat(digest(raw.applicability.checks)===digest(expected),'材料适用性与生命周期规则冲突');
111
+ if(expected['check.architecture-reviewed'].status==='required')requireKeys(refs,['architecture_review'],'命中检查');
112
+ }
113
+ if(raw.ticket_policy)requireThat(nonempty(sources.ticket.version),'冻结 Ticket 缺少需求版本');
114
+ const extension=raw.extensions || {}, scope=raw.scope, resolution=structuredClone(raw.resolution);
115
+ if(raw.ticket_policy&&scope.project_roots.length>1)requireThat(extension.cross_repo?.repository_bindings,'新跨仓草案缺少逐仓登记绑定');
116
+ const repositories=sliceRepositories(raw,sources,options);
117
+ for (const key of ['frontend','backend','api','cross_repo']) {
118
+ const item=raw.applicability[key];
119
+ if (item.status === 'required') requireThat(extension[key],`命中 ${key} 影响但缺少子合同`);
120
+ else {
121
+ requireThat(nonempty(item.reason),`${key} 不适用缺少理由`);
122
+ requireThat(!extension[key],`${key} 不适用时不得保存空子合同`);
123
+ }
124
+ }
125
+ for(const [impact,section]of [['frontend','frontend'],['ui','frontend'],['backend','backend'],['api','api'],['cross-repo','cross_repo']])if(scope.impacted_areas.includes(impact))requireThat(raw.applicability[section].status==='required',`影响面 ${impact} 与适用性冲突`);
126
+ if(scope.impacted_areas.some(x=>['data','persistence'].includes(x)))requireKeys(refs,['data_architecture'],'数据依据');
127
+ if (extension.frontend && raw.applicability.frontend.baseline_kind==='existing-ui-baseline') {
128
+ requireThat(raw.applicability.frontend.ui_change==='none'&&!scope.impacted_areas.includes('ui'),'既有 UI 基线不能承接 UI 变化');
129
+ requireKeys(refs,['existing_ui_baseline','frontend_delivery'],'既有 UI 依据');
130
+ const observed=parseSliceYaml(sources.existing_ui_baseline.text);
131
+ const validation=validateExistingUiBaseline(observed,{bundleRoot:path.dirname(safe(options.root||process.cwd(),sources.existing_ui_baseline.ref))});
132
+ requireThat(validation.errors.length===0,`既有 UI 基线不可消费: ${validation.errors.join('; ')}`);
133
+ requireThat(extension.frontend.visual_baseline_case_ids.every(id=>observed.cases.some(c=>c.case_id===id)),'既有 UI 用例未被基线覆盖');
134
+ } else if (extension.frontend) requireKeys(refs,['requirement_freeze','low_fidelity_review','prototype_review','prototype_profile_decision','prototype_deliverable','prototype_deliverable_verification','prototype_confirmation','visual_baseline','state_matrix'],'前端依据');
135
+ if (extension.backend) {
136
+ requireKeys(refs,['technical_design','repository_registration','manifest','backend_repository','maven_wrapper'],'后端依据');
137
+ requireThat(resolution.architecture_identity||repositories&&Object.values(repositories).some(r=>r.resolution.architecture_identity),'后端缺少架构身份');
138
+ requireThat(nonempty(sources.technical_design.version),'技术设计缺少版本');
139
+ for (const selector of extension.backend.design_refs) locate(sources.technical_design.text,selector);
140
+ }
141
+ requireKeys(refs,[extension.api?'openapi_freeze':'no_api_impact_record'],'API 依据');
142
+ requireThat(!refs[extension.api?'no_api_impact_record':'openapi_freeze'],'API 影响结论冲突');
143
+ for (const p of scope.allowed_write_paths) safeWritePath(p);
144
+ requireThat(!scope.project_roots.some(p=>/^app\/(backend|frontend)(\/|$)/.test(p)), '禁止 app/backend 或 app/frontend');
145
+ if (scope.implementation_path_policy !== 'external-repository-native') for(const p of scope.project_roots) requireThat(/^apps\/(backend|frontend)\/[^/]+/.test(p),'Harness 工程必须落入具体 project 目录');
146
+ sliceAcceptanceText(raw,sources);
147
+ const unitIds=new Set(), usedChecks=new Set(), covered=new Set();
148
+ const expected=Object.keys(raw.acceptance);
149
+ for(const [id,check] of Object.entries(raw.verification)) {
150
+ requireThat(scope.project_roots.some(p=>withinSlicePath(check.cwd,p)),`验证 ${id} 的 cwd 未登记`);
151
+ if(check.dependency_roots)requireThat(repositories&&check.dependency_roots.every(p=>repositories[p]),`验证 ${id} 依赖仓库未登记`);
152
+ requireThat(check.acceptance_refs.length && check.acceptance_refs.every(ref=>expected.includes(ref)),`验证 ${id} 验收引用无效`);
153
+ }
154
+ const work_units=raw.work_units.map(unit=>{
155
+ requireThat(!unitIds.has(unit.id),`工作单元重复: ${unit.id}`);unitIds.add(unit.id);
156
+ const allowed=unit.allowed_write_paths || scope.allowed_write_paths;
157
+ for(const p of allowed) { safeWritePath(p);requireThat(scope.allowed_write_paths.some(parent=>withinSlicePath(p,parent)),`任务 ${unit.id} 写范围越界: ${p}`); }
158
+ const root=unit.project_root || (scope.project_roots.length===1?scope.project_roots[0]:null);
159
+ requireThat(scope.project_roots.includes(root),`任务 ${unit.id} 必须选择登记的 project_root`);
160
+ const checks=unique([...Object.keys(raw.verification).filter(id=>raw.verification[id].required_for_all),...unit.verification_refs]);
161
+ requireThat(checks.every(id=>raw.verification[id]),`任务 ${unit.id} 引用未知验证`);
162
+ requireThat(checks.every(id=>withinSlicePath(raw.verification[id].cwd,root)),`任务 ${unit.id} 验证执行仓库冲突`);
163
+ const skills=[unit.primary_skill,...(unit.supporting_skills || [])];
164
+ requireThat(skills.every(id=>resolution.required_skills.includes(id)),`任务 ${unit.id} Skill 不在冻结闭包内`);
165
+ requireThat(unit.acceptance_refs.every(id=>expected.includes(id)&&checks.some(k=>raw.verification[k].acceptance_refs.includes(id))),`任务 ${unit.id} 验收没有验证覆盖`);
166
+ for(const id of unit.acceptance_refs)covered.add(id);
167
+ for(const id of checks)usedChecks.add(id);
168
+ if(unit.tdd_mode==='controlled-generation') {
169
+ requireThat(unit.controlled_generation,'controlled-generation 缺少受控例外');
170
+ requireKeys(unit.controlled_generation,['exception_reason','generator','generator_inputs','expected_files','verification_commands','behavior_tests_after_generation'],'受控生成');
171
+ } else requireThat(!unit.controlled_generation,'行为测试不得携带受控生成例外');
172
+ const work_unit={...unit,allowed_write_paths:allowed,project_root:root,supporting_skills:unit.supporting_skills||[],verification:checks.map(id=>({id,...raw.verification[id]})),verification_commands:checks.map(id=>raw.verification[id].command),expected_evidence:unique(checks.flatMap(id=>raw.verification[id].expected_evidence)),forbidden_patterns:unique([...(scope.forbidden_patterns||[]),...(unit.forbidden_patterns||[])])};
173
+ return {...work_unit,contract_id:raw.contract_id,contract_version:raw.contract_version,work_unit};
174
+ });
175
+ requireThat(expected.every(id=>covered.has(id)), '存在未被工作单元覆盖的验收');
176
+ requireThat(Object.keys(raw.verification).every(id=>usedChecks.has(id)),'存在未分配的验证要求');
177
+ if(repositories)for(const id of extension.cross_repo.integration_verification)requireThat(raw.verification[id]?.dependency_roots?.length,'联合验证必须引用有依赖仓库和明确 cwd 的 verification');
178
+ const allChecks=Object.values(raw.verification);
179
+ resolution.freshness='current'; // Only after every bound source was read and verified above.
180
+ if(resolution.architecture_identity) {
181
+ resolution.architecture_identity_digest=digest(resolution.architecture_identity).slice(7);
182
+ resolution.architecture_evidence=sliceArchitectureEvidence(raw,sources);
183
+ }
184
+ if(refs.technical_design)resolution.technical_design=resolveSliceBasis(raw,'technical_design');
185
+ if(refs.frontend_delivery)resolution.frontend_delivery={acceptance_ref:refs.frontend_delivery,digest:sources.frontend_delivery.digest};
186
+ const common={...scope,required_capabilities:resolution.required_capabilities,required_skills:resolution.required_skills,verification_commands:allChecks.map(c=>c.command),expected_evidence_files:unique(allChecks.flatMap(c=>c.expected_evidence)),quality_baseline_ref:refs.engineering_baseline,forbidden_patterns:scope.forbidden_patterns||[],full_reroute_triggers:scope.full_reroute_triggers||[]};
187
+ const normalized={...structuredClone(raw),...(repositories?{repositories}:{}),common,resolution,lifecycle_refs:{...refs,openapi_freeze_or_no_impact:refs.openapi_freeze||refs.no_api_impact_record},readiness:{blockers:[],stale_inputs:[],not_applicable:Object.entries(raw.applicability).filter(([,a])=>a.status==='not-applicable').map(([item,a])=>({item,reason:a.reason}))},work_units,
188
+ frontend:extension.frontend?{status:'required',...extension.frontend,approved_prototype_ref:refs.prototype_confirmation,state_matrix_ref:refs.state_matrix,visual_baseline_ref:refs.visual_baseline,...(resolution.frontend_delivery?{delivery:resolution.frontend_delivery}:{})}:{status:'not-applicable'},
189
+ backend:extension.backend?{status:'required',...extension.backend}:{status:'not-applicable'},
190
+ contract:{api_impact:!!extension.api,...(extension.api?{freeze_ref:refs.openapi_freeze,...extension.api}:{no_api_impact_ref:refs.no_api_impact_record})},
191
+ cross_repo:extension.cross_repo?{repositories:scope.project_roots,...extension.cross_repo}:{}
192
+ };
193
+ originals.set(normalized,raw);
194
+ sourceSnapshots.set(normalized,sources);
195
+ return normalized;
196
+ }
197
+ export function readSliceContract(ref,{root=process.cwd(),diagnostic=false}={}) {
198
+ const bytes=fs.readFileSync(safe(root,ref)),raw=sourceSliceContract(parseSliceYaml(bytes));
199
+ const contract=diagnostic&&raw.status==='blocked'?null:normalizeSliceContract(raw,{root});
200
+ return {contract,raw,sources:structuredClone(sourceSnapshots.get(contract)||{}),binding:{ref,id:raw.contract_id,version:raw.contract_version,digest:hash(bytes)}};
201
+ }
202
+
203
+ /** Select only after full normalization; original raw identity is retained for approval comparison. */
204
+ export function selectSliceWorkUnit(contract,workUnitId) {
205
+ if(!contract.repositories)return contract;
206
+ const unit=contract.work_units.find(u=>u.id===workUnitId);
207
+ requireThat(unit,'跨仓执行必须选择唯一 work_unit_id');
208
+ const repo=contract.repositories[unit.project_root];
209
+ const selected={...contract,backend:repo.project.delivery_role==='backend'?contract.backend:{status:'not-applicable'},frontend:repo.project.delivery_role==='frontend'?{...contract.frontend,...(repo.resolution.frontend_delivery?{delivery:repo.resolution.frontend_delivery}:{})}:{status:'not-applicable'},resolution:{...repo.resolution,freshness:contract.resolution.freshness},common:{...contract.common,project_roots:[unit.project_root],allowed_write_paths:unit.allowed_write_paths},lifecycle_refs:{...contract.lifecycle_refs,...Object.fromEntries(Object.entries(repo.basis).map(([k,v])=>[k,v.ref]))}};
210
+ originals.set(selected,sourceSliceContract(contract));return selected;
211
+ }
@@ -0,0 +1,49 @@
1
+ import fs from 'node:fs';
2
+ import * as lifecycle from './lifecycle-transition.mjs';
3
+ import path from 'node:path';
4
+ import {digest,schema} from './strategic-handoff-io.mjs';
5
+ import {parseSliceYaml,resolveSliceBasis,withinSlicePath,sliceArchitectureEvidence} from './slice-contract.mjs';
6
+ const check=(ok,message)=>{if(!ok)throw new TypeError(`slice-repository-invalid: ${message}`);};
7
+ /** All file facts stay in basis. Repository entries only select those facts. */
8
+ export function sliceRepositories(contract,sources,{root=process.cwd()}={}) {
9
+ const bindings=contract.extensions?.cross_repo?.repository_bindings;if(!bindings)return null;
10
+ check(lifecycle.SLICE_REPOSITORY_PREPARATION_PROTOCOL===1&&typeof lifecycle.validateImplementationRepositoriesReady==='function','接收端不支持当前来源的多项目准备协议,不能套用本地默认规则');
11
+ check(sources.repository_preparation,'缺少多项目准备结果');
12
+ const preparation=parseSliceYaml(sources.repository_preparation.text);
13
+ schema(preparation,'docs/process/schemas/implementation-repository-preparation-result.schema.json');
14
+ const ready=lifecycle.validateImplementationRepositoriesReady({implementation_repository_preparation:preparation,delivery_impacts:Object.fromEntries(['backend','frontend'].map(role=>[role,preparation.projects.some(p=>p.delivery_role===role&&p.status!=='not-applicable')]))},{root,exists:ref=>fs.existsSync(path.resolve(root,ref)),read:ref=>fs.readFileSync(path.resolve(root,ref),'utf8')});
15
+ check(ready.result!=='blocked',`多项目准备未就绪: ${ready.missing_requirements.join('; ')}`);
16
+ check(new Set(Object.keys(bindings).map(p=>path.resolve(p))).size===Object.keys(bindings).length,'工程根存在路径别名,不能重复登记');
17
+ const result={},identities=new Set();
18
+ for(const [projectRoot,keys]of Object.entries(bindings)) {
19
+ const references=Object.entries(keys).filter(([name])=>!['recipe_refs','capability_refs'].includes(name));
20
+ const selected=Object.fromEntries(references.map(([name,key])=>{check(sources[key],`缺少 basis.${key}`);return[name,sources[key]];}));
21
+ const registration=parseSliceYaml(selected.implementation_repository.text),baseline=parseSliceYaml(selected.engineering_baseline.text);
22
+ const actual=path.resolve(registration.local_worktree,registration.project_root||'.');
23
+ check(path.resolve(projectRoot)===actual,'工程根与逐仓登记冲突');
24
+ const project=preparation.projects.filter(p=>p.project_id===registration.project_id&&p.repository_ref===selected.implementation_repository.ref);
25
+ check(project.length===1&&project[0].status!=='not-applicable'&&path.resolve(project[0].project_root)===actual,'准备结果没有唯一当前工程');
26
+ const identityKey=JSON.stringify([registration.repository_id,registration.project_id]);check(!identities.has(identityKey),'同一仓库工程不能重复绑定');identities.add(identityKey);
27
+ check(registration.status==='current'&&baseline.status==='current','逐仓登记或基线非 current');
28
+ check(registration.repository_id===baseline.repository_id&&registration.project_id===baseline.project_id,'逐仓基线身份冲突');
29
+ check(Array.isArray(registration.allowed_write_paths)&&registration.allowed_write_paths.length,'登记缺少写边界');
30
+ if(project[0].delivery_role==='backend')check(selected.technical_design&&project[0].design_prerequisites.technical_design.digest===selected.technical_design.digest&&project[0].design_prerequisites.technical_design.ref===selected.technical_design.ref,'多项目准备与切片技术设计绑定冲突');
31
+ const identity=baseline.architecture_identity||registration.architecture_identity;
32
+ if(baseline.architecture_identity&&registration.architecture_identity)check(digest(baseline.architecture_identity)===digest(registration.architecture_identity),'逐仓架构冲突');
33
+ const basis=Object.fromEntries(references.map(([name,key])=>[name,resolveSliceBasis(contract,key)]));
34
+ basis.repository_registration??=basis.implementation_repository;
35
+ selected.repository_registration??=selected.implementation_repository;
36
+ const resolution={...contract.resolution};delete resolution.architecture_identity;
37
+ if(identity){resolution.architecture_identity=identity;resolution.architecture_identity_digest=digest(identity).slice(7);resolution.architecture_evidence=sliceArchitectureEvidence({basis,resolution},selected);}
38
+ if(basis.technical_design)resolution.technical_design=basis.technical_design;
39
+ if(basis.frontend_delivery)resolution.frontend_delivery={acceptance_ref:basis.frontend_delivery.ref,digest:basis.frontend_delivery.digest};
40
+ result[projectRoot]={registration,project:project[0],basis,resolution,recipe_refs:keys.recipe_refs,capability_refs:keys.capability_refs};
41
+ }
42
+ check(Object.keys(result).length===contract.scope.project_roots.length&&contract.scope.project_roots.every(p=>result[p]),'多仓绑定必须完整覆盖工程根');
43
+ for(const key of ['delivery_order','rollback_order'])check(contract.extensions.cross_repo[key].length===Object.keys(result).length&&contract.extensions.cross_repo[key].every(p=>result[p]),`${key} 必须完整且唯一列出工程根`);
44
+ for(const unit of contract.work_units) {
45
+ const repo=result[unit.project_root];check(repo,`工作单元 ${unit.id} 未选择唯一工程`);
46
+ check((unit.allowed_write_paths||contract.scope.allowed_write_paths).every(p=>repo.registration.allowed_write_paths.some(parent=>withinSlicePath(p,parent))),`工作单元 ${unit.id} 超出逐仓登记`);
47
+ }
48
+ return result;
49
+ }