create-yss-spec 3.5.6 → 3.5.9

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 (578) hide show
  1. package/bin/create-yss-spec.js +3 -1
  2. package/cli-core.lock.json +10 -6
  3. package/package.json +4 -1
  4. package/src/api/_sync-service.js +3 -1
  5. package/src/command-runner.mjs +44 -9
  6. package/src/commands/doctor.js +40 -0
  7. package/src/commands/skills.js +7 -2
  8. package/src/content-identity.js +111 -0
  9. package/src/runtime-store.mjs +650 -0
  10. package/src/template/asset-runtime.js +124 -22
  11. package/src/template/instance-runtime.js +23 -7
  12. package/src/validation/metadata.js +8 -0
  13. package/template/.agents/skills/.strategic-design-skills-manifest.json +3 -3
  14. package/template/.agents/skills/alibaba-java-code-style/SKILL.md +30 -36
  15. package/template/.agents/skills/archify/SKILL.md +2 -2
  16. package/template/.agents/skills/archify/scripts/yss-safe-deliver.mjs +10 -6
  17. package/template/.agents/skills/archify/test/yss-safe-deliver.test.mjs +9 -2
  18. package/template/.agents/skills/code-review/SKILL.md +19 -11
  19. package/template/.agents/skills/code-review/references/candidate-capture.md +1 -1
  20. package/template/.agents/skills/code-review/references/legacy-convergence.md +3 -1
  21. package/template/.agents/skills/code-review/references/review-axis-checklists.md +2 -0
  22. package/template/.agents/skills/code-review/references/yss-review-standards.md +4 -2
  23. package/template/.agents/skills/competitive-intelligence/SKILL.md +32 -74
  24. package/template/.agents/skills/file-export-download/SKILL.md +4 -73
  25. package/template/.agents/skills/file-export-download/references/binary-contract-example.md +26 -0
  26. package/template/.agents/skills/file-export-download/references/download-call-example.md +45 -0
  27. package/template/.agents/skills/formily-foundation/SKILL.md +6 -105
  28. package/template/.agents/skills/formily-foundation/references/async-save-example.md +57 -0
  29. package/template/.agents/skills/formily-foundation/references/query-layout.md +50 -0
  30. package/template/.agents/skills/formily-linkage-effects/SKILL.md +3 -116
  31. package/template/.agents/skills/formily-linkage-effects/references/linkage-example.md +116 -0
  32. package/template/.agents/skills/formily-mode-slot-detail/SKILL.md +3 -81
  33. package/template/.agents/skills/formily-mode-slot-detail/references/mode-slot-example.md +81 -0
  34. package/template/.agents/skills/formily-step-flow/SKILL.md +3 -143
  35. package/template/.agents/skills/formily-step-flow/references/step-flow-example.md +143 -0
  36. package/template/.agents/skills/handoff/SKILL.md +3 -1
  37. package/template/.agents/skills/i-have-adhd/SKILL.md +2 -2
  38. package/template/.agents/skills/i-have-adhd/references/yss-adaptation.md +2 -2
  39. package/template/.agents/skills/i-have-adhd/tests/verify-integration.mjs +7 -2
  40. package/template/.agents/skills/implement/SKILL.md +2 -2
  41. package/template/.agents/skills/llm-wiki/references/transactions.md +2 -2
  42. package/template/.agents/skills/llm-wiki/scripts/core.mjs +40 -2
  43. package/template/.agents/skills/llm-wiki/scripts/transaction.mjs +30 -27
  44. package/template/.agents/skills/llm-wiki/scripts/v2.test.mjs +38 -2
  45. package/template/.agents/skills/lombok/SKILL.md +2 -0
  46. package/template/.agents/skills/mapstruct/SKILL.md +2 -0
  47. package/template/.agents/skills/tdd/SKILL.md +2 -2
  48. package/template/.agents/skills/theme-token-usage/SKILL.md +6 -5
  49. package/template/.agents/skills/wayfinder/references/chart-map.md +2 -2
  50. package/template/.agents/skills/wayfinder/references/ticket-types.md +1 -1
  51. package/template/.agents/skills/yss-api-integration/SKILL.md +13 -50
  52. package/template/.agents/skills/yss-api-integration/references/orval-list-example.md +38 -0
  53. package/template/.agents/skills/yss-application/SKILL.md +11 -5
  54. package/template/.agents/skills/yss-audit-log/SKILL.md +8 -6
  55. package/template/.agents/skills/yss-audit-log/references/README.md +5 -5
  56. package/template/.agents/skills/yss-cache/SKILL.md +4 -4
  57. package/template/.agents/skills/yss-ddd-scaffold-generator/SKILL.md +7 -8
  58. package/template/.agents/skills/yss-ddd-scaffold-generator/references/USAGE_EXAMPLES.md +13 -6
  59. package/template/.agents/skills/yss-ddd-scaffold-generator/references/command-examples.md +2 -0
  60. package/template/.agents/skills/yss-ddd-scaffold-generator/scripts/scaffold-generator.test.mjs +28 -1
  61. package/template/.agents/skills/yss-design-system/SKILL.md +2 -2
  62. package/template/.agents/skills/yss-distributed-id/SKILL.md +4 -4
  63. package/template/.agents/skills/yss-dto/SKILL.md +9 -9
  64. package/template/.agents/skills/yss-dto/references/README.md +4 -4
  65. package/template/.agents/skills/yss-dto/references/wire-validation-checklist.md +4 -4
  66. package/template/.agents/skills/yss-excel-mvc/SKILL.md +4 -4
  67. package/template/.agents/skills/yss-exception/SKILL.md +42 -48
  68. package/template/.agents/skills/yss-formily-schema-generator/SKILL.md +26 -170
  69. package/template/.agents/skills/yss-formily-schema-generator/references/workflow.md +49 -193
  70. package/template/.agents/skills/yss-frontend-scaffold-generator/SKILL.md +14 -10
  71. package/template/.agents/skills/yss-implementation-contract-compiler/SKILL.md +4 -6
  72. package/template/.agents/skills/yss-implementation-contract-compiler/references/yss-skill-execution-result.md +15 -1
  73. package/template/.agents/skills/yss-layered-mvc-scaffold-generator/SKILL.md +1 -1
  74. package/template/.agents/skills/yss-mybatis/SKILL.md +4 -4
  75. package/template/.agents/skills/yss-openapi-draft-review/SKILL.md +6 -4
  76. package/template/.agents/skills/yss-openapi-draft-review/references/review-output.md +2 -0
  77. package/template/.agents/skills/yss-openapi-draft-review/references/semantic-review.md +3 -3
  78. package/template/.agents/skills/yss-openapi-governance/SKILL.md +5 -7
  79. package/template/.agents/skills/yss-openapi-governance/references/governance-output.md +2 -0
  80. package/template/.agents/skills/yss-openapi-governance/references/governance-workflow.md +3 -3
  81. package/template/.agents/skills/yss-product-lifecycle/SKILL.md +32 -26
  82. package/template/.agents/skills/yss-product-lifecycle/references/artifact-dependencies.md +1 -1
  83. package/template/.agents/skills/yss-product-lifecycle/references/matt-yss-adapter.md +28 -6
  84. package/template/.agents/skills/yss-product-lifecycle/references/orchestration-contract.yaml +143 -4
  85. package/template/.agents/skills/yss-product-lifecycle/references/orchestration.md +38 -13
  86. package/template/.agents/skills/yss-product-lifecycle/references/plan-requirements.md +7 -6
  87. package/template/.agents/skills/yss-product-lifecycle/references/state-model.md +3 -1
  88. package/template/.agents/skills/yss-product-lifecycle/references/user-decisions.md +3 -3
  89. package/template/.agents/skills/yss-prototype-stage/SKILL.md +1 -5
  90. package/template/.agents/skills/yss-prototype-stage/scripts/verify-prototype-design.mjs +1 -0
  91. package/template/.agents/skills/yss-repository/SKILL.md +2 -2
  92. package/template/.agents/skills/yss-research/SKILL.md +39 -48
  93. package/template/.agents/skills/yss-research/assets/competitive-evidence-template.yaml +146 -0
  94. package/template/.agents/skills/yss-research/references/competitive-analysis.md +76 -0
  95. package/template/.agents/skills/yss-research/references/competitive-analysis.schema.json +324 -0
  96. package/template/.agents/skills/yss-research/references/evidence-contract.md +8 -0
  97. package/template/.agents/skills/yss-research/scripts/lib/competitive-analysis.mjs +185 -0
  98. package/template/.agents/skills/yss-research/scripts/render-competitive-outputs.mjs +16 -0
  99. package/template/.agents/skills/yss-research/scripts/validate-research-package.mjs +6 -2
  100. package/template/.agents/skills/yss-research/tests/competitive-scenarios.test.mjs +270 -0
  101. package/template/.agents/skills/yss-resilience4j/SKILL.md +25 -31
  102. package/template/.agents/skills/yss-security-algorithm/SKILL.md +37 -43
  103. package/template/.agents/skills/yss-skill-source-index-refresh/SKILL.md +29 -36
  104. package/template/.agents/skills/yss-skill-source-index-refresh/references/backend-component-platform-compatibility.md +1 -1
  105. package/template/.agents/skills/yss-stage-decision/SKILL.md +2 -5
  106. package/template/.agents/skills/yss-stage-decision/scripts/validate-domain-strategy.mjs +8 -5
  107. package/template/.agents/skills/yss-stage-decision/scripts/validate-stage-decision-package.mjs +8 -5
  108. package/template/.agents/skills/yss-stage-decision/tests/run-scenarios.mjs +83 -13
  109. package/template/.agents/skills/yss-tactical-design/SKILL.md +1 -1
  110. package/template/.agents/skills/yss-tactical-design/references/output-template.md +3 -3
  111. package/template/.agents/skills/yss-tactical-design/references/tactical-design-contract.md +1 -1
  112. package/template/.agents/skills/yss-technical-design/SKILL.md +6 -5
  113. package/template/.agents/skills/yss-ui/SKILL.md +7 -1
  114. package/template/.agents/skills/yss-ui/assets/docs/guide/gitlab-ci-integration.md +2 -2
  115. package/template/.agents/skills/yss-ui/references/checklist.md +38 -96
  116. package/template/.agents/skills/yss-ui/references/component-routing.md +3 -1
  117. package/template/.agents/skills/yss-ui/references/quick-recipes.md +17 -272
  118. package/template/.agents/skills/yss-ui/references/specialized-components.md +3 -3
  119. package/template/.agents/skills/yss-ui-business-page-generation/SKILL.md +1 -1
  120. package/template/.agents/skills/yss-up-springboot3/SKILL.md +19 -21
  121. package/template/.agents/skills/yss-userinfo/SKILL.md +27 -33
  122. package/template/.agents/skills/yss-validation/SKILL.md +26 -32
  123. package/template/.agents/skills/yss-web-controller/SKILL.md +11 -44
  124. package/template/.agents/skills/yss-web-controller/references/crud-generation.md +38 -0
  125. package/template/.agents/skills/ytable-usage/SKILL.md +2 -2
  126. package/template/.agents/skills/ytree-usage/SKILL.md +2 -80
  127. package/template/.agents/skills/ytree-usage/references/tree-and-confirmation-example.md +81 -0
  128. package/template/.codex/skills/alibaba-java-code-style/SKILL.md +30 -36
  129. package/template/.codex/skills/archify/SKILL.md +2 -2
  130. package/template/.codex/skills/archify/scripts/yss-safe-deliver.mjs +10 -6
  131. package/template/.codex/skills/archify/test/yss-safe-deliver.test.mjs +9 -2
  132. package/template/.codex/skills/code-review/SKILL.md +19 -11
  133. package/template/.codex/skills/code-review/references/candidate-capture.md +1 -1
  134. package/template/.codex/skills/code-review/references/legacy-convergence.md +3 -1
  135. package/template/.codex/skills/code-review/references/review-axis-checklists.md +2 -0
  136. package/template/.codex/skills/code-review/references/yss-review-standards.md +4 -2
  137. package/template/.codex/skills/competitive-intelligence/SKILL.md +32 -74
  138. package/template/.codex/skills/file-export-download/SKILL.md +4 -73
  139. package/template/.codex/skills/file-export-download/references/binary-contract-example.md +26 -0
  140. package/template/.codex/skills/file-export-download/references/download-call-example.md +45 -0
  141. package/template/.codex/skills/formily-foundation/SKILL.md +6 -105
  142. package/template/.codex/skills/formily-foundation/references/async-save-example.md +57 -0
  143. package/template/.codex/skills/formily-foundation/references/query-layout.md +50 -0
  144. package/template/.codex/skills/formily-linkage-effects/SKILL.md +3 -116
  145. package/template/.codex/skills/formily-linkage-effects/references/linkage-example.md +116 -0
  146. package/template/.codex/skills/formily-mode-slot-detail/SKILL.md +3 -81
  147. package/template/.codex/skills/formily-mode-slot-detail/references/mode-slot-example.md +81 -0
  148. package/template/.codex/skills/formily-step-flow/SKILL.md +3 -143
  149. package/template/.codex/skills/formily-step-flow/references/step-flow-example.md +143 -0
  150. package/template/.codex/skills/handoff/SKILL.md +3 -1
  151. package/template/.codex/skills/i-have-adhd/SKILL.md +2 -2
  152. package/template/.codex/skills/i-have-adhd/references/yss-adaptation.md +2 -2
  153. package/template/.codex/skills/i-have-adhd/tests/verify-integration.mjs +7 -2
  154. package/template/.codex/skills/implement/SKILL.md +2 -2
  155. package/template/.codex/skills/llm-wiki/references/transactions.md +2 -2
  156. package/template/.codex/skills/llm-wiki/scripts/core.mjs +40 -2
  157. package/template/.codex/skills/llm-wiki/scripts/transaction.mjs +30 -27
  158. package/template/.codex/skills/llm-wiki/scripts/v2.test.mjs +38 -2
  159. package/template/.codex/skills/lombok/SKILL.md +2 -0
  160. package/template/.codex/skills/mapstruct/SKILL.md +2 -0
  161. package/template/.codex/skills/product-design/references/communication-protocol.md +3 -3
  162. package/template/.codex/skills/product-design/references/critical-overrides.md +4 -5
  163. package/template/.codex/skills/product-design/skills/audit/SKILL.md +2 -4
  164. package/template/.codex/skills/product-design/skills/get-context/SKILL.md +6 -8
  165. package/template/.codex/skills/product-design/skills/ideate/SKILL.md +3 -3
  166. package/template/.codex/skills/product-design/skills/image-to-code/SKILL.md +3 -5
  167. package/template/.codex/skills/product-design/skills/index/SKILL.md +1 -1
  168. package/template/.codex/skills/product-design/skills/prototype/SKILL.md +2 -4
  169. package/template/.codex/skills/product-design/skills/research/SKILL.md +4 -6
  170. package/template/.codex/skills/product-design/skills/research/assets/research-brief-template.md +3 -3
  171. package/template/.codex/skills/product-design/skills/share/SKILL.md +2 -4
  172. package/template/.codex/skills/product-design/skills/url-to-code/SKILL.md +2 -4
  173. package/template/.codex/skills/product-design/skills/user-context/SKILL.md +1 -1
  174. package/template/.codex/skills/tdd/SKILL.md +2 -2
  175. package/template/.codex/skills/theme-token-usage/SKILL.md +6 -5
  176. package/template/.codex/skills/wayfinder/references/chart-map.md +2 -2
  177. package/template/.codex/skills/wayfinder/references/ticket-types.md +1 -1
  178. package/template/.codex/skills/yss-api-integration/SKILL.md +13 -50
  179. package/template/.codex/skills/yss-api-integration/references/orval-list-example.md +38 -0
  180. package/template/.codex/skills/yss-application/SKILL.md +11 -5
  181. package/template/.codex/skills/yss-audit-log/SKILL.md +8 -6
  182. package/template/.codex/skills/yss-audit-log/references/README.md +5 -5
  183. package/template/.codex/skills/yss-cache/SKILL.md +4 -4
  184. package/template/.codex/skills/yss-ddd-scaffold-generator/SKILL.md +7 -8
  185. package/template/.codex/skills/yss-ddd-scaffold-generator/references/USAGE_EXAMPLES.md +13 -6
  186. package/template/.codex/skills/yss-ddd-scaffold-generator/references/command-examples.md +2 -0
  187. package/template/.codex/skills/yss-ddd-scaffold-generator/scripts/scaffold-generator.test.mjs +28 -1
  188. package/template/.codex/skills/yss-design-system/SKILL.md +2 -2
  189. package/template/.codex/skills/yss-distributed-id/SKILL.md +4 -4
  190. package/template/.codex/skills/yss-dto/SKILL.md +9 -9
  191. package/template/.codex/skills/yss-dto/references/README.md +4 -4
  192. package/template/.codex/skills/yss-dto/references/wire-validation-checklist.md +4 -4
  193. package/template/.codex/skills/yss-excel-mvc/SKILL.md +4 -4
  194. package/template/.codex/skills/yss-exception/SKILL.md +42 -48
  195. package/template/.codex/skills/yss-formily-schema-generator/SKILL.md +26 -170
  196. package/template/.codex/skills/yss-formily-schema-generator/references/workflow.md +49 -193
  197. package/template/.codex/skills/yss-frontend-scaffold-generator/SKILL.md +14 -10
  198. package/template/.codex/skills/yss-implementation-contract-compiler/SKILL.md +4 -6
  199. package/template/.codex/skills/yss-implementation-contract-compiler/references/yss-skill-execution-result.md +15 -1
  200. package/template/.codex/skills/yss-layered-mvc-scaffold-generator/SKILL.md +1 -1
  201. package/template/.codex/skills/yss-mybatis/SKILL.md +4 -4
  202. package/template/.codex/skills/yss-openapi-draft-review/SKILL.md +6 -4
  203. package/template/.codex/skills/yss-openapi-draft-review/references/review-output.md +2 -0
  204. package/template/.codex/skills/yss-openapi-draft-review/references/semantic-review.md +3 -3
  205. package/template/.codex/skills/yss-openapi-governance/SKILL.md +5 -7
  206. package/template/.codex/skills/yss-openapi-governance/references/governance-output.md +2 -0
  207. package/template/.codex/skills/yss-openapi-governance/references/governance-workflow.md +3 -3
  208. package/template/.codex/skills/yss-product-lifecycle/SKILL.md +32 -26
  209. package/template/.codex/skills/yss-product-lifecycle/references/artifact-dependencies.md +1 -1
  210. package/template/.codex/skills/yss-product-lifecycle/references/matt-yss-adapter.md +28 -6
  211. package/template/.codex/skills/yss-product-lifecycle/references/orchestration-contract.yaml +143 -4
  212. package/template/.codex/skills/yss-product-lifecycle/references/orchestration.md +38 -13
  213. package/template/.codex/skills/yss-product-lifecycle/references/plan-requirements.md +7 -6
  214. package/template/.codex/skills/yss-product-lifecycle/references/state-model.md +3 -1
  215. package/template/.codex/skills/yss-product-lifecycle/references/user-decisions.md +3 -3
  216. package/template/.codex/skills/yss-prototype-stage/SKILL.md +1 -5
  217. package/template/.codex/skills/yss-prototype-stage/scripts/verify-prototype-design.mjs +1 -0
  218. package/template/.codex/skills/yss-repository/SKILL.md +2 -2
  219. package/template/.codex/skills/yss-research/SKILL.md +39 -48
  220. package/template/.codex/skills/yss-research/assets/competitive-evidence-template.yaml +146 -0
  221. package/template/.codex/skills/yss-research/references/competitive-analysis.md +76 -0
  222. package/template/.codex/skills/yss-research/references/competitive-analysis.schema.json +324 -0
  223. package/template/.codex/skills/yss-research/references/evidence-contract.md +8 -0
  224. package/template/.codex/skills/yss-research/scripts/lib/competitive-analysis.mjs +185 -0
  225. package/template/.codex/skills/yss-research/scripts/render-competitive-outputs.mjs +16 -0
  226. package/template/.codex/skills/yss-research/scripts/validate-research-package.mjs +6 -2
  227. package/template/.codex/skills/yss-research/tests/competitive-scenarios.test.mjs +270 -0
  228. package/template/.codex/skills/yss-resilience4j/SKILL.md +25 -31
  229. package/template/.codex/skills/yss-security-algorithm/SKILL.md +37 -43
  230. package/template/.codex/skills/yss-skill-source-index-refresh/SKILL.md +29 -36
  231. package/template/.codex/skills/yss-skill-source-index-refresh/references/backend-component-platform-compatibility.md +1 -1
  232. package/template/.codex/skills/yss-stage-decision/SKILL.md +2 -5
  233. package/template/.codex/skills/yss-stage-decision/scripts/validate-domain-strategy.mjs +8 -5
  234. package/template/.codex/skills/yss-stage-decision/scripts/validate-stage-decision-package.mjs +8 -5
  235. package/template/.codex/skills/yss-stage-decision/tests/run-scenarios.mjs +83 -13
  236. package/template/.codex/skills/yss-tactical-design/SKILL.md +1 -1
  237. package/template/.codex/skills/yss-tactical-design/references/output-template.md +3 -3
  238. package/template/.codex/skills/yss-tactical-design/references/tactical-design-contract.md +1 -1
  239. package/template/.codex/skills/yss-technical-design/SKILL.md +6 -5
  240. package/template/.codex/skills/yss-ui/SKILL.md +7 -1
  241. package/template/.codex/skills/yss-ui/assets/docs/guide/gitlab-ci-integration.md +2 -2
  242. package/template/.codex/skills/yss-ui/references/checklist.md +38 -96
  243. package/template/.codex/skills/yss-ui/references/component-routing.md +3 -1
  244. package/template/.codex/skills/yss-ui/references/quick-recipes.md +17 -272
  245. package/template/.codex/skills/yss-ui/references/specialized-components.md +3 -3
  246. package/template/.codex/skills/yss-ui-business-page-generation/SKILL.md +1 -1
  247. package/template/.codex/skills/yss-up-springboot3/SKILL.md +19 -21
  248. package/template/.codex/skills/yss-userinfo/SKILL.md +27 -33
  249. package/template/.codex/skills/yss-validation/SKILL.md +26 -32
  250. package/template/.codex/skills/yss-web-controller/SKILL.md +11 -44
  251. package/template/.codex/skills/yss-web-controller/references/crud-generation.md +38 -0
  252. package/template/.codex/skills/ytable-usage/SKILL.md +2 -2
  253. package/template/.codex/skills/ytree-usage/SKILL.md +2 -80
  254. package/template/.codex/skills/ytree-usage/references/tree-and-confirmation-example.md +81 -0
  255. package/template/.cursor/skills/alibaba-java-code-style/SKILL.md +30 -36
  256. package/template/.cursor/skills/archify/SKILL.md +2 -2
  257. package/template/.cursor/skills/archify/scripts/yss-safe-deliver.mjs +10 -6
  258. package/template/.cursor/skills/archify/test/yss-safe-deliver.test.mjs +9 -2
  259. package/template/.cursor/skills/code-review/SKILL.md +19 -11
  260. package/template/.cursor/skills/code-review/references/candidate-capture.md +1 -1
  261. package/template/.cursor/skills/code-review/references/legacy-convergence.md +3 -1
  262. package/template/.cursor/skills/code-review/references/review-axis-checklists.md +2 -0
  263. package/template/.cursor/skills/code-review/references/yss-review-standards.md +4 -2
  264. package/template/.cursor/skills/competitive-intelligence/SKILL.md +32 -74
  265. package/template/.cursor/skills/file-export-download/SKILL.md +4 -73
  266. package/template/.cursor/skills/file-export-download/references/binary-contract-example.md +26 -0
  267. package/template/.cursor/skills/file-export-download/references/download-call-example.md +45 -0
  268. package/template/.cursor/skills/formily-foundation/SKILL.md +6 -105
  269. package/template/.cursor/skills/formily-foundation/references/async-save-example.md +57 -0
  270. package/template/.cursor/skills/formily-foundation/references/query-layout.md +50 -0
  271. package/template/.cursor/skills/formily-linkage-effects/SKILL.md +3 -116
  272. package/template/.cursor/skills/formily-linkage-effects/references/linkage-example.md +116 -0
  273. package/template/.cursor/skills/formily-mode-slot-detail/SKILL.md +3 -81
  274. package/template/.cursor/skills/formily-mode-slot-detail/references/mode-slot-example.md +81 -0
  275. package/template/.cursor/skills/formily-step-flow/SKILL.md +3 -143
  276. package/template/.cursor/skills/formily-step-flow/references/step-flow-example.md +143 -0
  277. package/template/.cursor/skills/handoff/SKILL.md +3 -1
  278. package/template/.cursor/skills/i-have-adhd/SKILL.md +2 -2
  279. package/template/.cursor/skills/i-have-adhd/references/yss-adaptation.md +2 -2
  280. package/template/.cursor/skills/i-have-adhd/tests/verify-integration.mjs +7 -2
  281. package/template/.cursor/skills/implement/SKILL.md +2 -2
  282. package/template/.cursor/skills/llm-wiki/references/transactions.md +2 -2
  283. package/template/.cursor/skills/llm-wiki/scripts/core.mjs +40 -2
  284. package/template/.cursor/skills/llm-wiki/scripts/transaction.mjs +30 -27
  285. package/template/.cursor/skills/llm-wiki/scripts/v2.test.mjs +38 -2
  286. package/template/.cursor/skills/lombok/SKILL.md +2 -0
  287. package/template/.cursor/skills/mapstruct/SKILL.md +2 -0
  288. package/template/.cursor/skills/tdd/SKILL.md +2 -2
  289. package/template/.cursor/skills/theme-token-usage/SKILL.md +6 -5
  290. package/template/.cursor/skills/wayfinder/references/chart-map.md +2 -2
  291. package/template/.cursor/skills/wayfinder/references/ticket-types.md +1 -1
  292. package/template/.cursor/skills/yss-api-integration/SKILL.md +13 -50
  293. package/template/.cursor/skills/yss-api-integration/references/orval-list-example.md +38 -0
  294. package/template/.cursor/skills/yss-application/SKILL.md +11 -5
  295. package/template/.cursor/skills/yss-audit-log/SKILL.md +8 -6
  296. package/template/.cursor/skills/yss-audit-log/references/README.md +5 -5
  297. package/template/.cursor/skills/yss-cache/SKILL.md +4 -4
  298. package/template/.cursor/skills/yss-ddd-scaffold-generator/SKILL.md +7 -8
  299. package/template/.cursor/skills/yss-ddd-scaffold-generator/references/USAGE_EXAMPLES.md +13 -6
  300. package/template/.cursor/skills/yss-ddd-scaffold-generator/references/command-examples.md +2 -0
  301. package/template/.cursor/skills/yss-ddd-scaffold-generator/scripts/scaffold-generator.test.mjs +28 -1
  302. package/template/.cursor/skills/yss-design-system/SKILL.md +2 -2
  303. package/template/.cursor/skills/yss-distributed-id/SKILL.md +4 -4
  304. package/template/.cursor/skills/yss-dto/SKILL.md +9 -9
  305. package/template/.cursor/skills/yss-dto/references/README.md +4 -4
  306. package/template/.cursor/skills/yss-dto/references/wire-validation-checklist.md +4 -4
  307. package/template/.cursor/skills/yss-excel-mvc/SKILL.md +4 -4
  308. package/template/.cursor/skills/yss-exception/SKILL.md +42 -48
  309. package/template/.cursor/skills/yss-formily-schema-generator/SKILL.md +26 -170
  310. package/template/.cursor/skills/yss-formily-schema-generator/references/workflow.md +49 -193
  311. package/template/.cursor/skills/yss-frontend-scaffold-generator/SKILL.md +14 -10
  312. package/template/.cursor/skills/yss-implementation-contract-compiler/SKILL.md +4 -6
  313. package/template/.cursor/skills/yss-implementation-contract-compiler/references/yss-skill-execution-result.md +15 -1
  314. package/template/.cursor/skills/yss-layered-mvc-scaffold-generator/SKILL.md +1 -1
  315. package/template/.cursor/skills/yss-mybatis/SKILL.md +4 -4
  316. package/template/.cursor/skills/yss-openapi-draft-review/SKILL.md +6 -4
  317. package/template/.cursor/skills/yss-openapi-draft-review/references/review-output.md +2 -0
  318. package/template/.cursor/skills/yss-openapi-draft-review/references/semantic-review.md +3 -3
  319. package/template/.cursor/skills/yss-openapi-governance/SKILL.md +5 -7
  320. package/template/.cursor/skills/yss-openapi-governance/references/governance-output.md +2 -0
  321. package/template/.cursor/skills/yss-openapi-governance/references/governance-workflow.md +3 -3
  322. package/template/.cursor/skills/yss-product-lifecycle/SKILL.md +32 -26
  323. package/template/.cursor/skills/yss-product-lifecycle/references/artifact-dependencies.md +1 -1
  324. package/template/.cursor/skills/yss-product-lifecycle/references/matt-yss-adapter.md +28 -6
  325. package/template/.cursor/skills/yss-product-lifecycle/references/orchestration-contract.yaml +143 -4
  326. package/template/.cursor/skills/yss-product-lifecycle/references/orchestration.md +38 -13
  327. package/template/.cursor/skills/yss-product-lifecycle/references/plan-requirements.md +7 -6
  328. package/template/.cursor/skills/yss-product-lifecycle/references/state-model.md +3 -1
  329. package/template/.cursor/skills/yss-product-lifecycle/references/user-decisions.md +3 -3
  330. package/template/.cursor/skills/yss-prototype-stage/SKILL.md +1 -5
  331. package/template/.cursor/skills/yss-prototype-stage/scripts/verify-prototype-design.mjs +1 -0
  332. package/template/.cursor/skills/yss-repository/SKILL.md +2 -2
  333. package/template/.cursor/skills/yss-research/SKILL.md +39 -48
  334. package/template/.cursor/skills/yss-research/assets/competitive-evidence-template.yaml +146 -0
  335. package/template/.cursor/skills/yss-research/references/competitive-analysis.md +76 -0
  336. package/template/.cursor/skills/yss-research/references/competitive-analysis.schema.json +324 -0
  337. package/template/.cursor/skills/yss-research/references/evidence-contract.md +8 -0
  338. package/template/.cursor/skills/yss-research/scripts/lib/competitive-analysis.mjs +185 -0
  339. package/template/.cursor/skills/yss-research/scripts/render-competitive-outputs.mjs +16 -0
  340. package/template/.cursor/skills/yss-research/scripts/validate-research-package.mjs +6 -2
  341. package/template/.cursor/skills/yss-research/tests/competitive-scenarios.test.mjs +270 -0
  342. package/template/.cursor/skills/yss-resilience4j/SKILL.md +25 -31
  343. package/template/.cursor/skills/yss-security-algorithm/SKILL.md +37 -43
  344. package/template/.cursor/skills/yss-skill-source-index-refresh/SKILL.md +29 -36
  345. package/template/.cursor/skills/yss-skill-source-index-refresh/references/backend-component-platform-compatibility.md +1 -1
  346. package/template/.cursor/skills/yss-stage-decision/SKILL.md +2 -5
  347. package/template/.cursor/skills/yss-stage-decision/scripts/validate-domain-strategy.mjs +8 -5
  348. package/template/.cursor/skills/yss-stage-decision/scripts/validate-stage-decision-package.mjs +8 -5
  349. package/template/.cursor/skills/yss-stage-decision/tests/run-scenarios.mjs +83 -13
  350. package/template/.cursor/skills/yss-tactical-design/SKILL.md +1 -1
  351. package/template/.cursor/skills/yss-tactical-design/references/output-template.md +3 -3
  352. package/template/.cursor/skills/yss-tactical-design/references/tactical-design-contract.md +1 -1
  353. package/template/.cursor/skills/yss-technical-design/SKILL.md +6 -5
  354. package/template/.cursor/skills/yss-ui/SKILL.md +7 -1
  355. package/template/.cursor/skills/yss-ui/assets/docs/guide/gitlab-ci-integration.md +2 -2
  356. package/template/.cursor/skills/yss-ui/references/checklist.md +38 -96
  357. package/template/.cursor/skills/yss-ui/references/component-routing.md +3 -1
  358. package/template/.cursor/skills/yss-ui/references/quick-recipes.md +17 -272
  359. package/template/.cursor/skills/yss-ui/references/specialized-components.md +3 -3
  360. package/template/.cursor/skills/yss-ui-business-page-generation/SKILL.md +1 -1
  361. package/template/.cursor/skills/yss-up-springboot3/SKILL.md +19 -21
  362. package/template/.cursor/skills/yss-userinfo/SKILL.md +27 -33
  363. package/template/.cursor/skills/yss-validation/SKILL.md +26 -32
  364. package/template/.cursor/skills/yss-web-controller/SKILL.md +11 -44
  365. package/template/.cursor/skills/yss-web-controller/references/crud-generation.md +38 -0
  366. package/template/.cursor/skills/ytable-usage/SKILL.md +2 -2
  367. package/template/.cursor/skills/ytree-usage/SKILL.md +2 -80
  368. package/template/.cursor/skills/ytree-usage/references/tree-and-confirmation-example.md +81 -0
  369. package/template/.pi/skills/alibaba-java-code-style/SKILL.md +30 -36
  370. package/template/.pi/skills/archify/SKILL.md +2 -2
  371. package/template/.pi/skills/archify/scripts/yss-safe-deliver.mjs +10 -6
  372. package/template/.pi/skills/archify/test/yss-safe-deliver.test.mjs +9 -2
  373. package/template/.pi/skills/code-review/SKILL.md +19 -11
  374. package/template/.pi/skills/code-review/references/candidate-capture.md +1 -1
  375. package/template/.pi/skills/code-review/references/legacy-convergence.md +3 -1
  376. package/template/.pi/skills/code-review/references/review-axis-checklists.md +2 -0
  377. package/template/.pi/skills/code-review/references/yss-review-standards.md +4 -2
  378. package/template/.pi/skills/competitive-intelligence/SKILL.md +32 -74
  379. package/template/.pi/skills/file-export-download/SKILL.md +4 -73
  380. package/template/.pi/skills/file-export-download/references/binary-contract-example.md +26 -0
  381. package/template/.pi/skills/file-export-download/references/download-call-example.md +45 -0
  382. package/template/.pi/skills/formily-foundation/SKILL.md +6 -105
  383. package/template/.pi/skills/formily-foundation/references/async-save-example.md +57 -0
  384. package/template/.pi/skills/formily-foundation/references/query-layout.md +50 -0
  385. package/template/.pi/skills/formily-linkage-effects/SKILL.md +3 -116
  386. package/template/.pi/skills/formily-linkage-effects/references/linkage-example.md +116 -0
  387. package/template/.pi/skills/formily-mode-slot-detail/SKILL.md +3 -81
  388. package/template/.pi/skills/formily-mode-slot-detail/references/mode-slot-example.md +81 -0
  389. package/template/.pi/skills/formily-step-flow/SKILL.md +3 -143
  390. package/template/.pi/skills/formily-step-flow/references/step-flow-example.md +143 -0
  391. package/template/.pi/skills/handoff/SKILL.md +3 -1
  392. package/template/.pi/skills/i-have-adhd/SKILL.md +2 -2
  393. package/template/.pi/skills/i-have-adhd/references/yss-adaptation.md +2 -2
  394. package/template/.pi/skills/i-have-adhd/tests/verify-integration.mjs +7 -2
  395. package/template/.pi/skills/implement/SKILL.md +2 -2
  396. package/template/.pi/skills/llm-wiki/references/transactions.md +2 -2
  397. package/template/.pi/skills/llm-wiki/scripts/core.mjs +40 -2
  398. package/template/.pi/skills/llm-wiki/scripts/transaction.mjs +30 -27
  399. package/template/.pi/skills/llm-wiki/scripts/v2.test.mjs +38 -2
  400. package/template/.pi/skills/lombok/SKILL.md +2 -0
  401. package/template/.pi/skills/mapstruct/SKILL.md +2 -0
  402. package/template/.pi/skills/tdd/SKILL.md +2 -2
  403. package/template/.pi/skills/theme-token-usage/SKILL.md +6 -5
  404. package/template/.pi/skills/wayfinder/references/chart-map.md +2 -2
  405. package/template/.pi/skills/wayfinder/references/ticket-types.md +1 -1
  406. package/template/.pi/skills/yss-api-integration/SKILL.md +13 -50
  407. package/template/.pi/skills/yss-api-integration/references/orval-list-example.md +38 -0
  408. package/template/.pi/skills/yss-application/SKILL.md +11 -5
  409. package/template/.pi/skills/yss-audit-log/SKILL.md +8 -6
  410. package/template/.pi/skills/yss-audit-log/references/README.md +5 -5
  411. package/template/.pi/skills/yss-cache/SKILL.md +4 -4
  412. package/template/.pi/skills/yss-ddd-scaffold-generator/SKILL.md +7 -8
  413. package/template/.pi/skills/yss-ddd-scaffold-generator/references/USAGE_EXAMPLES.md +13 -6
  414. package/template/.pi/skills/yss-ddd-scaffold-generator/references/command-examples.md +2 -0
  415. package/template/.pi/skills/yss-ddd-scaffold-generator/scripts/scaffold-generator.test.mjs +28 -1
  416. package/template/.pi/skills/yss-design-system/SKILL.md +2 -2
  417. package/template/.pi/skills/yss-distributed-id/SKILL.md +4 -4
  418. package/template/.pi/skills/yss-dto/SKILL.md +9 -9
  419. package/template/.pi/skills/yss-dto/references/README.md +4 -4
  420. package/template/.pi/skills/yss-dto/references/wire-validation-checklist.md +4 -4
  421. package/template/.pi/skills/yss-excel-mvc/SKILL.md +4 -4
  422. package/template/.pi/skills/yss-exception/SKILL.md +42 -48
  423. package/template/.pi/skills/yss-formily-schema-generator/SKILL.md +26 -170
  424. package/template/.pi/skills/yss-formily-schema-generator/references/workflow.md +49 -193
  425. package/template/.pi/skills/yss-frontend-scaffold-generator/SKILL.md +14 -10
  426. package/template/.pi/skills/yss-implementation-contract-compiler/SKILL.md +4 -6
  427. package/template/.pi/skills/yss-implementation-contract-compiler/references/yss-skill-execution-result.md +15 -1
  428. package/template/.pi/skills/yss-layered-mvc-scaffold-generator/SKILL.md +1 -1
  429. package/template/.pi/skills/yss-mybatis/SKILL.md +4 -4
  430. package/template/.pi/skills/yss-openapi-draft-review/SKILL.md +6 -4
  431. package/template/.pi/skills/yss-openapi-draft-review/references/review-output.md +2 -0
  432. package/template/.pi/skills/yss-openapi-draft-review/references/semantic-review.md +3 -3
  433. package/template/.pi/skills/yss-openapi-governance/SKILL.md +5 -7
  434. package/template/.pi/skills/yss-openapi-governance/references/governance-output.md +2 -0
  435. package/template/.pi/skills/yss-openapi-governance/references/governance-workflow.md +3 -3
  436. package/template/.pi/skills/yss-product-lifecycle/SKILL.md +32 -26
  437. package/template/.pi/skills/yss-product-lifecycle/references/artifact-dependencies.md +1 -1
  438. package/template/.pi/skills/yss-product-lifecycle/references/matt-yss-adapter.md +28 -6
  439. package/template/.pi/skills/yss-product-lifecycle/references/orchestration-contract.yaml +143 -4
  440. package/template/.pi/skills/yss-product-lifecycle/references/orchestration.md +38 -13
  441. package/template/.pi/skills/yss-product-lifecycle/references/plan-requirements.md +7 -6
  442. package/template/.pi/skills/yss-product-lifecycle/references/state-model.md +3 -1
  443. package/template/.pi/skills/yss-product-lifecycle/references/user-decisions.md +3 -3
  444. package/template/.pi/skills/yss-prototype-stage/SKILL.md +1 -5
  445. package/template/.pi/skills/yss-prototype-stage/scripts/verify-prototype-design.mjs +1 -0
  446. package/template/.pi/skills/yss-repository/SKILL.md +2 -2
  447. package/template/.pi/skills/yss-research/SKILL.md +39 -48
  448. package/template/.pi/skills/yss-research/assets/competitive-evidence-template.yaml +146 -0
  449. package/template/.pi/skills/yss-research/references/competitive-analysis.md +76 -0
  450. package/template/.pi/skills/yss-research/references/competitive-analysis.schema.json +324 -0
  451. package/template/.pi/skills/yss-research/references/evidence-contract.md +8 -0
  452. package/template/.pi/skills/yss-research/scripts/lib/competitive-analysis.mjs +185 -0
  453. package/template/.pi/skills/yss-research/scripts/render-competitive-outputs.mjs +16 -0
  454. package/template/.pi/skills/yss-research/scripts/validate-research-package.mjs +6 -2
  455. package/template/.pi/skills/yss-research/tests/competitive-scenarios.test.mjs +270 -0
  456. package/template/.pi/skills/yss-resilience4j/SKILL.md +25 -31
  457. package/template/.pi/skills/yss-security-algorithm/SKILL.md +37 -43
  458. package/template/.pi/skills/yss-skill-source-index-refresh/SKILL.md +29 -36
  459. package/template/.pi/skills/yss-skill-source-index-refresh/references/backend-component-platform-compatibility.md +1 -1
  460. package/template/.pi/skills/yss-stage-decision/SKILL.md +2 -5
  461. package/template/.pi/skills/yss-stage-decision/scripts/validate-domain-strategy.mjs +8 -5
  462. package/template/.pi/skills/yss-stage-decision/scripts/validate-stage-decision-package.mjs +8 -5
  463. package/template/.pi/skills/yss-stage-decision/tests/run-scenarios.mjs +83 -13
  464. package/template/.pi/skills/yss-tactical-design/SKILL.md +1 -1
  465. package/template/.pi/skills/yss-tactical-design/references/output-template.md +3 -3
  466. package/template/.pi/skills/yss-tactical-design/references/tactical-design-contract.md +1 -1
  467. package/template/.pi/skills/yss-technical-design/SKILL.md +6 -5
  468. package/template/.pi/skills/yss-ui/SKILL.md +7 -1
  469. package/template/.pi/skills/yss-ui/assets/docs/guide/gitlab-ci-integration.md +2 -2
  470. package/template/.pi/skills/yss-ui/references/checklist.md +38 -96
  471. package/template/.pi/skills/yss-ui/references/component-routing.md +3 -1
  472. package/template/.pi/skills/yss-ui/references/quick-recipes.md +17 -272
  473. package/template/.pi/skills/yss-ui/references/specialized-components.md +3 -3
  474. package/template/.pi/skills/yss-ui-business-page-generation/SKILL.md +1 -1
  475. package/template/.pi/skills/yss-up-springboot3/SKILL.md +19 -21
  476. package/template/.pi/skills/yss-userinfo/SKILL.md +27 -33
  477. package/template/.pi/skills/yss-validation/SKILL.md +26 -32
  478. package/template/.pi/skills/yss-web-controller/SKILL.md +11 -44
  479. package/template/.pi/skills/yss-web-controller/references/crud-generation.md +38 -0
  480. package/template/.pi/skills/ytable-usage/SKILL.md +2 -2
  481. package/template/.pi/skills/ytree-usage/SKILL.md +2 -80
  482. package/template/.pi/skills/ytree-usage/references/tree-and-confirmation-example.md +81 -0
  483. package/template/.template-spec/agents/backend-architecture-profiles.md +1 -1
  484. package/template/.template-spec/agents/digital-human-roles.md +5 -1
  485. package/template/.template-spec/agents/digital-human-roles.yaml +49 -1
  486. package/template/.template-spec/engineering/backend-platforms.json +1 -1
  487. package/template/.template-spec/plan/entry-review.md +2 -1
  488. package/template/.template-spec/plan/templates/competitive-analysis-template.md +38 -36
  489. package/template/.template-spec/plan/templates/competitive-matrix-template.md +37 -17
  490. package/template/.template-spec/plan/templates/plan-template.md +11 -5
  491. package/template/.template-spec/process/document-writing.md +22 -3
  492. package/template/.template-spec/process/harness-process-tailoring.md +5 -1
  493. package/template/.template-spec/process/implementation-repo-integration.md +26 -8
  494. package/template/.template-spec/process/research-completion.md +2 -0
  495. package/template/.template-spec/process/runtime-storage.md +78 -0
  496. package/template/.template-spec/process/schemas/approval-context.schema.json +67 -0
  497. package/template/.template-spec/process/schemas/approval-record.schema.json +179 -16
  498. package/template/.template-spec/process/schemas/backend-delivery.schema.json +16 -0
  499. package/template/.template-spec/process/schemas/delivery-preflight-input.schema.json +4 -0
  500. package/template/.template-spec/process/schemas/digital-human-task-package.schema.json +236 -1
  501. package/template/.template-spec/process/schemas/implementation-repository-preparation-result.schema.json +335 -52
  502. package/template/.template-spec/process/schemas/lifecycle-checkpoint.schema.json +11 -0
  503. package/template/.template-spec/process/schemas/project-scaffold-contract.schema.json +3 -0
  504. package/template/.template-spec/process/schemas/review-bundle.schema.json +347 -35
  505. package/template/.template-spec/process/schemas/strategic-design-handoff-v3.schema.json +504 -0
  506. package/template/.template-spec/process/schemas/strategic-design-handoff-v4.schema.json +544 -8
  507. package/template/.template-spec/process/schemas/strategic-design-handoff-v5.schema.json +616 -0
  508. package/template/.template-spec/process/schemas/strategic-design-handoff.schema.json +616 -0
  509. package/template/.template-spec/process/schemas/strategic-handoff-domain-strategy-v3.schema.json +712 -109
  510. package/template/.template-spec/process/schemas/strategic-handoff-domain-strategy.schema.json +595 -90
  511. package/template/.template-spec/process/schemas/strategic-handoff-export-v2.schema.json +448 -0
  512. package/template/.template-spec/process/schemas/strategic-handoff-export.schema.json +392 -0
  513. package/template/.template-spec/process/schemas/strategic-handoff-stage-decision-package-v3.schema.json +556 -83
  514. package/template/.template-spec/process/schemas/strategic-handoff-stage-decision-package.schema.json +418 -57
  515. package/template/.template-spec/process/script-execution.md +37 -0
  516. package/template/.template-spec/process/subagent-collaboration.md +7 -1
  517. package/template/.template-spec/templates/approval-record-template.json +7 -3
  518. package/template/.template-spec/templates/approval-record-template.yaml +8 -2
  519. package/template/.template-spec/templates/examples/lifecycle-writing-examples.md +92 -2
  520. package/template/.template-spec/templates/retro-report-template.md +10 -3
  521. package/template/.template-spec/templates/review-bundle-template.yaml +19 -10
  522. package/template/.template-spec/user-guide//347/224/250/346/210/267/346/211/213/345/206/214.md +2 -0
  523. package/template/AGENTS.md +4 -3
  524. package/template/CONTEXT.md +2 -2
  525. package/template/README.md +2 -2
  526. package/template/scripts/advance-maintenance-iteration +51 -0
  527. package/template/scripts/lib/approval-checkpoint-discovery.mjs +26 -0
  528. package/template/scripts/lib/approval-consumption.mjs +35 -0
  529. package/template/scripts/lib/approval-current.mjs +111 -0
  530. package/template/scripts/lib/approval-record-io.mjs +56 -0
  531. package/template/scripts/lib/approval-record.mjs +79 -184
  532. package/template/scripts/lib/approved-execution-context.mjs +8 -6
  533. package/template/scripts/lib/asset-transactions.mjs +5 -1
  534. package/template/scripts/lib/backend-delivery.mjs +1 -1
  535. package/template/scripts/lib/backend-review.mjs +2 -1
  536. package/template/scripts/lib/backend-scaffold-prerequisites.mjs +3 -2
  537. package/template/scripts/lib/business-ticket-lifecycle.mjs +2 -1
  538. package/template/scripts/lib/checkpoint-commit.mjs +50 -0
  539. package/template/scripts/lib/command-runner.mjs +44 -9
  540. package/template/scripts/lib/content-identity.mjs +273 -0
  541. package/template/scripts/lib/delivery-preflight.mjs +2 -1
  542. package/template/scripts/lib/digital-human-roles.mjs +12 -5
  543. package/template/scripts/lib/drift-report.mjs +110 -0
  544. package/template/scripts/lib/existing-backend-architecture.mjs +4 -1
  545. package/template/scripts/lib/lifecycle-context-query.mjs +172 -11
  546. package/template/scripts/lib/lifecycle-controls.mjs +9 -19
  547. package/template/scripts/lib/lifecycle-presentation.mjs +5 -0
  548. package/template/scripts/lib/lifecycle-status.mjs +63 -12
  549. package/template/scripts/lib/lifecycle-transition.mjs +2 -1
  550. package/template/scripts/lib/maintenance-candidate.mjs +24 -30
  551. package/template/scripts/lib/maintenance-research.mjs +52 -8
  552. package/template/scripts/lib/maintenance-storage.mjs +81 -0
  553. package/template/scripts/lib/plan-spec-entry.mjs +2 -1
  554. package/template/scripts/lib/project-governance.mjs +2 -1
  555. package/template/scripts/lib/read-only-intake.mjs +44 -9
  556. package/template/scripts/lib/review-capabilities.mjs +234 -0
  557. package/template/scripts/lib/review-package.mjs +100 -0
  558. package/template/scripts/lib/runtime-store.mjs +650 -0
  559. package/template/scripts/lib/skill-registry.mjs +4 -4
  560. package/template/scripts/lib/strategic-handoff.mjs +22 -9
  561. package/template/scripts/lib/task-package.mjs +47 -16
  562. package/template/scripts/lifecycle-status +26 -1
  563. package/template/scripts/maintenance-path +11 -0
  564. package/template/scripts/prepare-review-package +8 -0
  565. package/template/scripts/project-ci +13 -3
  566. package/template/scripts/query-lifecycle-context +8 -1
  567. package/template/scripts/run-read-only-intake +2 -2
  568. package/template/scripts/runtime-store +40 -0
  569. package/template/scripts/verify-approval-record +21 -13
  570. package/template/scripts/verify-lifecycle-checkpoint +7 -3
  571. package/template/scripts/verify-project-instance +21 -1
  572. package/template/skills-lock.json +64 -63
  573. package/template.snapshot.json +4 -4
  574. package/vendor/cli-core/cli.mjs +2 -0
  575. package/vendor/cli-core/command-runner.mjs +44 -9
  576. package/vendor/cli-core/package.json +1 -1
  577. package/vendor/cli-core/runtime-store.mjs +650 -0
  578. package/vendor/cli-core/scaffold.mjs +4 -2
@@ -0,0 +1,273 @@
1
+ import { createHash } from "node:crypto";
2
+ import { spawnSync } from "node:child_process";
3
+ import { existsSync, lstatSync, readFileSync, readdirSync, realpathSync } from "node:fs";
4
+ import path from "node:path";
5
+
6
+ // Git-native content identity. A "git-sha1" / "git-sha256" identity is the blob
7
+ // hash Git itself would record for the path (default clean filters), obtained
8
+ // from the index only when the path is provably complete, and from
9
+ // "git hash-object" otherwise. "sha256" is the disclosed fallback without Git.
10
+ export const GIT_SHA1 = "git-sha1";
11
+ export const GIT_SHA256 = "git-sha256";
12
+ export const SHA256 = "sha256";
13
+ export const UNRESOLVED = "unresolved";
14
+ const HEX_LENGTH = { "git-sha1": 40, "git-sha256": 64, sha256: 64 };
15
+ const IDENTITY_PATTERN = /^(git-sha1|git-sha256|sha256):([0-9a-f]+)$/;
16
+ const SKIP_NAMES = new Set([".DS_Store", "__pycache__", ".git"]);
17
+ const SKIP_FILE = /\.(iml|pyc|pyo)$/;
18
+
19
+ export function parseIdentity(value) {
20
+ if (typeof value !== "string") return null;
21
+ const match = IDENTITY_PATTERN.exec(value);
22
+ if (!match) return null;
23
+ if (match[2].length !== HEX_LENGTH[match[1]]) return null;
24
+ return { algo: match[1], value: match[2] };
25
+ }
26
+ export function formatIdentity(algo, hex) {
27
+ const length = HEX_LENGTH[algo];
28
+ if (!length) throw new TypeError("未知身份算法: " + algo);
29
+ if (typeof hex !== "string" || !new RegExp("^[0-9a-f]{" + length + "}$").test(hex)) {
30
+ throw new TypeError("身份摘要非法: " + algo + ":" + hex);
31
+ }
32
+ return algo + ":" + hex;
33
+ }
34
+ export function identityEquals(left, right) {
35
+ const a = parseIdentity(left);
36
+ const b = parseIdentity(right);
37
+ if (!a || !b) return left === right;
38
+ return a.algo === b.algo && a.value === b.value;
39
+ }
40
+ export function sha256Identity(bytes) {
41
+ return formatIdentity(SHA256, createHash("sha256").update(bytes).digest("hex"));
42
+ }
43
+ export function treeDigest(entries, algo = SHA256) {
44
+ const digest = createHash(algo === GIT_SHA1 ? "sha1" : "sha256");
45
+ const sorted = [...entries].sort((left, right) => (left.path < right.path ? -1 : left.path > right.path ? 1 : 0));
46
+ for (const entry of sorted) {
47
+ digest.update(entry.path).update("\0").update(entry.kind).update("\0").update(entry.identity).update("\0");
48
+ }
49
+ return formatIdentity(algo, digest.digest("hex"));
50
+ }
51
+ export function treeFiles(directory, prefix = "") {
52
+ if (!existsSync(directory)) return [];
53
+ const collected = [];
54
+ for (const entry of readdirSync(directory, { withFileTypes: true })) {
55
+ if (SKIP_NAMES.has(entry.name)) continue;
56
+ const absolute = path.join(directory, entry.name);
57
+ const rel = prefix ? prefix + "/" + entry.name : entry.name;
58
+ if (SKIP_FILE.test(rel)) continue;
59
+ if (entry.isDirectory()) collected.push(...treeFiles(absolute, rel));
60
+ else if (entry.isFile() || entry.isSymbolicLink()) collected.push([rel, absolute]);
61
+ }
62
+ return collected;
63
+ }
64
+
65
+ function modeKind(mode) {
66
+ if (mode === "120000") return "symlink";
67
+ if (mode === "160000") return "gitlink";
68
+ if (mode === "100755") return "exec";
69
+ return "file";
70
+ }
71
+ function statKind(info) {
72
+ if (info.isSymbolicLink()) return "symlink";
73
+ return info.mode & 0o111 ? "exec" : "file";
74
+ }
75
+ // Mark a path and every ancestor directory. A directory may only trust the
76
+ // index when neither it nor any descendant is dirty, untracked or ignored —
77
+ // otherwise the index view would silently omit files the worktree has.
78
+ function markDirectories(target, ref) {
79
+ target.add(ref);
80
+ let cursor = ref;
81
+ while (cursor.includes("/")) {
82
+ cursor = cursor.slice(0, cursor.lastIndexOf("/"));
83
+ if (!cursor) break;
84
+ target.add(cursor);
85
+ }
86
+ }
87
+
88
+ export function createIdentityProvider(root, { spawn = spawnSync } = {}) {
89
+ // Compare against the canonical root: on macOS a /tmp path is really
90
+ // /private/tmp, and a link inside the repository would otherwise look external.
91
+ const realRoot = realpathOrResolve(root);
92
+ const run = (args) => spawn("git", ["-C", root, ...args], { encoding: "buffer", maxBuffer: 128 * 1024 * 1024 });
93
+ let available = false;
94
+ let algo = SHA256;
95
+ const index = new Map();
96
+ const ignoredDirs = new Set();
97
+ let dirty = null;
98
+ let dirtyDirs = null;
99
+ const visiting = new Set();
100
+
101
+ function load() {
102
+ index.clear();
103
+ ignoredDirs.clear();
104
+ visiting.clear();
105
+ dirty = null;
106
+ dirtyDirs = null;
107
+ const probe = run(["rev-parse", "--is-inside-work-tree"]);
108
+ available = probe.status === 0 && probe.stdout.toString("utf8").trim() === "true";
109
+ algo = SHA256;
110
+ if (!available) return;
111
+ const format = run(["rev-parse", "--show-object-format"]);
112
+ const name = format.status === 0 ? format.stdout.toString("utf8").trim() : "sha1";
113
+ algo = name === "sha256" ? GIT_SHA256 : GIT_SHA1;
114
+ const listed = run(["ls-files", "--stage", "-z"]);
115
+ if (listed.status !== 0) { available = false; return; }
116
+ for (const record of listed.stdout.toString("utf8").split("\0")) {
117
+ if (!record) continue;
118
+ const separator = record.indexOf("\t");
119
+ if (separator < 0) continue;
120
+ const [mode, sha] = record.slice(0, separator).split(" ");
121
+ index.set(record.slice(separator + 1), { mode, sha });
122
+ }
123
+ const ignored = run(["ls-files", "-z", "--others", "--ignored", "--exclude-standard"]);
124
+ if (ignored.status === 0) {
125
+ for (const ref of ignored.stdout.toString("utf8").split("\0")) {
126
+ if (ref) markDirectories(ignoredDirs, ref);
127
+ }
128
+ }
129
+ }
130
+ load();
131
+
132
+ function dirtySet() {
133
+ if (dirty) return dirty;
134
+ dirty = new Set();
135
+ dirtyDirs = new Set();
136
+ if (available) {
137
+ const status = run(["status", "--porcelain=v1", "-z", "--untracked-files=all"]);
138
+ if (status.status === 0) {
139
+ const records = status.stdout.toString("utf8").split("\0");
140
+ for (let cursor = 0; cursor < records.length; cursor += 1) {
141
+ const record = records[cursor];
142
+ if (record.length < 4) continue;
143
+ const code = record.slice(0, 2);
144
+ const ref = record.slice(3);
145
+ if (code[0] === "?" || code[1] !== " ") { dirty.add(ref); markDirectories(dirtyDirs, ref); }
146
+ if (code[0] === "R" || code[0] === "C") {
147
+ cursor += 1;
148
+ if (records[cursor]) { dirty.add(records[cursor]); markDirectories(dirtyDirs, records[cursor]); }
149
+ }
150
+ }
151
+ }
152
+ }
153
+ return dirty;
154
+ }
155
+
156
+ function hashObject(absolute) {
157
+ const result = spawn("git", ["-C", root, "hash-object", "--", absolute], { encoding: "utf8" });
158
+ if (result.status !== 0) return null;
159
+ const hex = result.stdout.trim();
160
+ return new RegExp("^[0-9a-f]{" + HEX_LENGTH[algo] + "}$").test(hex) ? formatIdentity(algo, hex) : null;
161
+ }
162
+
163
+ function indexIdentity(ref) {
164
+ const record = ref ? index.get(ref) : null;
165
+ if (!record || dirtySet().has(ref)) return null;
166
+ return formatIdentity(algo, record.sha);
167
+ }
168
+
169
+ function fileFromAbsolute(absolute, ref) {
170
+ const fromIndex = indexIdentity(ref);
171
+ if (fromIndex) return fromIndex;
172
+ if (available) {
173
+ const hashed = hashObject(absolute);
174
+ if (hashed) return hashed;
175
+ }
176
+ try { return sha256Identity(readFileSync(absolute)); } catch { return null; }
177
+ }
178
+
179
+ function symlinkIdentity(absolute) {
180
+ let resolved;
181
+ try { resolved = realpathSync(absolute); } catch { return null; }
182
+ if (visiting.has(resolved)) return null;
183
+ visiting.add(resolved);
184
+ try {
185
+ const info = lstatSync(resolved);
186
+ const rel = path.relative(realRoot, resolved).split(path.sep).join("/");
187
+ // A link that leaves the repository (or points at the root itself) is never
188
+ // enumerated: walking it would be unbounded. A directory legitimately named
189
+ // like "..data" is still inside, so only the ".." path segment is rejected.
190
+ const inside = rel !== "" && rel !== ".." && !rel.startsWith("../") && !path.isAbsolute(rel);
191
+ if (!inside) return null;
192
+ if (info.isDirectory()) return directoryIdentity(rel, resolved).identity;
193
+ return fileFromAbsolute(resolved, rel);
194
+ } finally {
195
+ visiting.delete(resolved);
196
+ }
197
+ }
198
+
199
+ function unresolvedEntry(rel, info) {
200
+ return { path: rel, kind: info.isSymbolicLink() ? "symlink" : "file", identity: UNRESOLVED };
201
+ }
202
+
203
+ function directoryEntries(absolute, ref) {
204
+ dirtySet();
205
+ const complete = ref && !dirtyDirs.has(ref) && !ignoredDirs.has(ref);
206
+ if (complete) {
207
+ const candidates = [];
208
+ for (const [candidate, record] of index) {
209
+ if (candidate.startsWith(ref + "/")) candidates.push([candidate, record]);
210
+ }
211
+ if (candidates.length) {
212
+ const entries = candidates.map(([candidate, record]) => {
213
+ const rel = candidate.slice(ref.length + 1);
214
+ const kind = modeKind(record.mode);
215
+ if (kind === "symlink") {
216
+ const resolvedIdentity = symlinkIdentity(path.join(root, candidate));
217
+ return resolvedIdentity ? { path: rel, kind, identity: resolvedIdentity } : { path: rel, kind, identity: UNRESOLVED };
218
+ }
219
+ return { path: rel, kind, identity: formatIdentity(algo, record.sha) };
220
+ });
221
+ return { entries, source: "index" };
222
+ }
223
+ }
224
+ const entries = treeFiles(absolute).map(([rel, file]) => {
225
+ const info = lstatSync(file);
226
+ if (info.isSymbolicLink()) {
227
+ const identity = symlinkIdentity(file);
228
+ return identity ? { path: rel, kind: "symlink", identity } : unresolvedEntry(rel, info);
229
+ }
230
+ const identity = fileFromAbsolute(file, ref ? ref + "/" + rel : null);
231
+ return identity ? { path: rel, kind: statKind(info), identity } : unresolvedEntry(rel, info);
232
+ });
233
+ return { entries, source: available ? "worktree" : "sha256-fallback" };
234
+ }
235
+
236
+ function directoryIdentity(ref, absolute = path.join(root, ref)) {
237
+ const { entries, source } = directoryEntries(absolute, ref);
238
+ return { identity: treeDigest(entries, available ? algo : SHA256), kind: "dir", source };
239
+ }
240
+
241
+ function identityFor(ref) {
242
+ const absolute = path.isAbsolute(ref) ? ref : path.join(root, ref);
243
+ const info = lstatSafe(absolute);
244
+ if (!info) return { identity: null, kind: "missing", source: available ? "index" : "sha256-fallback" };
245
+ if (info.isSymbolicLink()) {
246
+ const identity = symlinkIdentity(absolute);
247
+ return { identity, kind: "symlink", source: identity ? (available ? "worktree" : "sha256-fallback") : "unresolved" };
248
+ }
249
+ if (info.isDirectory()) return directoryIdentity(ref, absolute);
250
+ const identity = fileFromAbsolute(absolute, ref);
251
+ return { identity, kind: statKind(info), source: indexIdentity(ref) ? "index" : (available ? "worktree" : "sha256-fallback") };
252
+ }
253
+
254
+ return {
255
+ get available() { return available; },
256
+ get algo() { return available ? algo : SHA256; },
257
+ get root() { return root; },
258
+ indexSize: () => index.size,
259
+ refresh: () => { load(); },
260
+ identityFor,
261
+ file: (ref) => identityFor(ref).identity,
262
+ directory: (ref) => directoryIdentity(ref).identity,
263
+ equals: (left, right) => identityEquals(identityFor(left).identity, identityFor(right).identity),
264
+ };
265
+ }
266
+
267
+ function realpathOrResolve(target) {
268
+ try { return realpathSync(target); } catch { return path.resolve(target); }
269
+ }
270
+
271
+ function lstatSafe(target) {
272
+ try { return lstatSync(target); } catch (error) { if (error.code === "ENOENT") return null; throw error; }
273
+ }
@@ -1,3 +1,4 @@
1
+ import {approvalExpectationForBoundAsset} from './approval-consumption.mjs';
1
2
  import { normalizeSliceContract, sourceSliceContract, parseSliceYaml } from './slice-contract.mjs';
2
3
  import { assertExistingSliceStructure, createApprovedExecutionContext, verifySliceContractApproval } from './approved-execution-context.mjs';
3
4
  import path from 'node:path';
@@ -122,7 +123,7 @@ async function approved(root,binding,gates) {
122
123
  ensure(binding.approval_ref&&binding.id&&binding.version,'缺少当前资产 id/version/approval_ref');
123
124
  const record=read(safe(root,binding.approval_ref));
124
125
  const roles=sourceApprovalPolicy(read(safe(root,'.template-spec/agents/digital-human-roles.yaml')));
125
- validateApprovalRecord(record,{rolesDoc:roles,requireApproved:true,root,read:ref=>readFileSync(safe(root,path.relative(root,ref).split(path.sep).join('/')))});
126
+ validateApprovalRecord(record,{rolesDoc:roles,requireApproved:true,root,read:ref=>readFileSync(safe(root,path.relative(root,ref).split(path.sep).join('/'))),expected:approvalExpectationForBoundAsset(record.gate_id,binding,{root})});
126
127
  ensure(gates.includes(record.gate_id),'资产批准使用错误门禁');
127
128
  ensure(record.artifact_bindings?.some(x=>x.id===binding.id&&x.version===binding.version&&x.digest===binding.digest),'stale: 批准未绑定当前资产身份、版本及字节');
128
129
  }
@@ -1,3 +1,4 @@
1
+ import { validateReviewCapabilityPolicy } from './review-capabilities.mjs';
1
2
  import { readFileSync } from './validation-phase.mjs';
2
3
  import path from "node:path";
3
4
  import { parseDocument } from "../vendor/yaml.mjs";
@@ -230,8 +231,11 @@ export function countersignRuleForGate(policy, gateId) {
230
231
  return { bucket: "biological_human", gate: gateId, countersigners: [BIOLOGICAL_ROLE_ID] };
231
232
  }
232
233
  if ((policy?.evidence_only || []).includes(gateId) || (policy?.orchestrator || []).includes(gateId)) return null;
233
- if (policy?.default_if_unlisted === "biological-human" && loadRegistry().gates.some((gate) => gate.id === gateId)) {
234
- return { bucket: "biological_human", gate: gateId, countersigners: [BIOLOGICAL_ROLE_ID] };
234
+ if ((policy?.automatic_checks || []).includes(gateId)) return null;
235
+ if (policy?.default_if_unlisted === 'reject-unlisted') {
236
+ const error = new TypeError(`GATE_POLICY_REQUIRED: 未分类门禁或检查 ${gateId}`);
237
+ error.code = 'GATE_POLICY_REQUIRED';
238
+ throw error;
235
239
  }
236
240
  return null;
237
241
  }
@@ -253,7 +257,7 @@ export function taskPackageDefaults(roleId, doc) {
253
257
  };
254
258
  }
255
259
 
256
- export function validateDigitalHumanRoles(doc, { skillIds, stageIds, gateIds, artifactIds, evidenceIds, workUnitIds, skillRegistry } = {}) {
260
+ export function validateDigitalHumanRoles(doc, { skillIds, stageIds, gateIds, artifactIds, evidenceIds, workUnitIds, skillRegistry, checkIds: suppliedCheckIds } = {}) {
257
261
  if (!doc || typeof doc !== "object" || Array.isArray(doc)) fail("数字人角色注册表必须是对象");
258
262
  if (doc.schema_version !== 1) fail("schema_version 必须为 1");
259
263
  if (doc.registry_id !== "yss.digital-human-roles") fail("registry_id 必须为 yss.digital-human-roles");
@@ -323,7 +327,7 @@ export function validateDigitalHumanRoles(doc, { skillIds, stageIds, gateIds, ar
323
327
 
324
328
  const policy = doc.gate_policy;
325
329
  if (!policy || typeof policy !== "object") fail("缺少 gate_policy");
326
- if (policy.default_if_unlisted !== "biological-human") fail("default_if_unlisted 必须为 biological-human");
330
+ if (policy.default_if_unlisted !== "reject-unlisted") fail("GATE_POLICY_REQUIRED: default_if_unlisted 必须为 reject-unlisted");
327
331
  if (policy.runtime_side_effect_approval !== "biological-human") fail("runtime_side_effect_approval 必须为 biological-human");
328
332
  if (policy.commercial_contract !== "biological-human") fail("commercial_contract 必须为 biological-human");
329
333
  if (policy.unlisted_kept_biological) {
@@ -348,7 +352,7 @@ export function validateDigitalHumanRoles(doc, { skillIds, stageIds, gateIds, ar
348
352
  if (typeof rule === "string") fail("digital_human_review 必须是含 gate 与 countersigners 的规则");
349
353
  validateSignRule(rule, { actors, gateIds, claimed, field: `digital_human_review[${index}]` });
350
354
  }
351
- const checkIds = new Set(loadRegistry().checks.map(check => check.id));
355
+ const checkIds = suppliedCheckIds || new Set(loadRegistry().checks.map(check => check.id));
352
356
  const checkClaimed = new Set();
353
357
  for (const id of policy.automatic_checks || []) {
354
358
  if (!checkIds.has(id) || checkClaimed.has(id)) fail(`未知或重复自动检查: ${id}`);
@@ -387,6 +391,8 @@ export function validateDigitalHumanRoles(doc, { skillIds, stageIds, gateIds, ar
387
391
  if (claimed.has(gate)) fail(`unlisted_kept_biological 与会签桶重复: ${gate}`);
388
392
  }
389
393
 
394
+ validateReviewCapabilityPolicy(doc, { skillIds, gateIds, checkIds });
395
+
390
396
  const decisions = doc.user_decision_policy;
391
397
  if (decisions?.continuation) {
392
398
  const continuation = decisions.continuation;
@@ -425,6 +431,7 @@ export function validateDefaultDigitalHumanRoles() {
425
431
  skillIds: skillIdsFromRegistry(skills),
426
432
  stageIds: idsFromCollection(lifecycle.stages, "stages"),
427
433
  gateIds: idsFromCollection(lifecycle.gates, "gates"),
434
+ checkIds: idsFromCollection(lifecycle.checks, "checks"),
428
435
  artifactIds: idsFromCollection(lifecycle.artifacts, "artifacts"),
429
436
  evidenceIds: idsFromCollection(lifecycle.evidence, "evidence"),
430
437
  workUnitIds: idsFromCollection(lifecycle.work_units, "work_units"),
@@ -0,0 +1,110 @@
1
+ import { existsSync, lstatSync, readFileSync } from "node:fs";
2
+ import path from "node:path";
3
+ import { SHA256, createIdentityProvider, identityEquals, parseIdentity, sha256Identity } from "./content-identity.mjs";
4
+
5
+ // Records written by create-yss-spec historically store a bare sha256 hex in
6
+ // contentHash. Normalize bare digests to their algorithm-tagged identity so the
7
+ // comparison is by algorithm and value, never by string shape alone.
8
+ export function normalizeRecordedIdentity(value) {
9
+ if (typeof value !== "string") return null;
10
+ if (parseIdentity(value)) return value;
11
+ if (/^[0-9a-f]{64}$/.test(value)) return "sha256:" + value;
12
+ if (/^[0-9a-f]{40}$/.test(value)) return "git-sha1:" + value;
13
+ return value;
14
+ }
15
+
16
+ export const DRIFT_EXIT = { clean: 0, drift: 1, usage: 2, environment: 3 };
17
+
18
+ // Classify every recorded managed asset. "not-installed" means nothing was ever
19
+ // recorded for an expected asset, "missing" means it was recorded and is now
20
+ // gone, "drifted" means it was recorded and its content changed.
21
+ export function classifyManagedFiles({ root, managedFiles = {}, expected = [], provider = null, allowCustomizations = false } = {}) {
22
+ const identity = provider || createIdentityProvider(root);
23
+ const entries = [];
24
+ const recorded = new Set(Object.keys(managedFiles));
25
+ for (const [ref, record] of Object.entries(managedFiles).sort(([left], [right]) => (left < right ? -1 : 1))) {
26
+ const info = lstatSafe(path.join(root, ref));
27
+ const customizable = allowCustomizations && record.ownership === "managed-customizable";
28
+ const expectedIdentity = customizable ? null : normalizeRecordedIdentity(record.identity ?? record.contentHash ?? null);
29
+ if (!info) { entries.push({ ref, kind: "missing", expected: expectedIdentity, actual: null }); continue; }
30
+ // Customization permits different file content, not missing, unreadable or
31
+ // replaced paths. Generated assets continue to require their recorded hash.
32
+ if (customizable && !info.isFile()) {
33
+ entries.push({ ref, kind: "drifted", expected: null, actual: null, error: "customizable-asset-must-be-file" });
34
+ continue;
35
+ }
36
+ // Compare like with like: a recorded sha256 digest must be matched against a
37
+ // freshly computed sha256, never against a differently-versioned Git identity.
38
+ const parsed = parseIdentity(expectedIdentity);
39
+ // A directory, a broken symlink or an unreadable path must surface as drift,
40
+ // never as an uncaught exception.
41
+ let actual = null;
42
+ let error = null;
43
+ try {
44
+ // A cached Git identity cannot prove that a permitted custom file is
45
+ // currently readable. Read its actual bytes before accepting it.
46
+ actual = customizable || (parsed && parsed.algo === SHA256) ? sha256Identity(readFileSync(path.join(root, ref))) : identity.identityFor(ref).identity;
47
+ } catch (cause) { actual = null; error = cause.message; }
48
+ if (!expectedIdentity) { entries.push({ ref, kind: error || (customizable && actual === null) ? "drifted" : "ok", expected: null, actual, ...(error ? { error } : {}) }); continue; }
49
+ const kind = identityEquals(expectedIdentity, actual) ? "ok" : "drifted";
50
+ const diagnosis = error ?? (actual === null ? "unreadable-or-unresolved" : null);
51
+ entries.push({ ref, kind, expected: expectedIdentity, actual, ...(diagnosis ? { error: diagnosis } : {}) });
52
+ }
53
+ for (const ref of [...expected].sort()) {
54
+ if (recorded.has(ref) || existsSync(path.join(root, ref))) continue;
55
+ entries.push({ ref, kind: "not-installed", expected: null, actual: null });
56
+ }
57
+ const summary = { ok: 0, not_installed: 0, missing: 0, drifted: 0, obsolete: 0 };
58
+ for (const entry of entries) {
59
+ const key = entry.kind === "not-installed" ? "not_installed" : entry.kind;
60
+ summary[key] += 1;
61
+ }
62
+ return { entries, summary };
63
+ }
64
+
65
+ export function buildDriftReport({ scope, root, provider = null, managedFiles = {}, expected = [], asOf = new Date().toISOString(), allowCustomizations = false } = {}) {
66
+ if (!["template-source", "project-instance"].includes(scope)) throw new TypeError("未知 drift-report scope: " + scope);
67
+ const identity = provider || createIdentityProvider(root);
68
+ const { entries, summary } = classifyManagedFiles({ root, managedFiles, expected, provider: identity, allowCustomizations: scope === "project-instance" && allowCustomizations });
69
+ return {
70
+ schema_version: 1,
71
+ kind: "drift-report",
72
+ as_of: asOf,
73
+ scope,
74
+ identity: { algo: identity.algo, source: identity.available ? "index" : "sha256-fallback" },
75
+ entries,
76
+ summary,
77
+ };
78
+ }
79
+
80
+ export function driftReportExit(report) {
81
+ return report.summary.missing || report.summary.drifted || report.summary.obsolete || report.summary.not_installed
82
+ ? DRIFT_EXIT.drift
83
+ : DRIFT_EXIT.clean;
84
+ }
85
+
86
+ function short(value) {
87
+ return typeof value === "string" ? value.slice(0, 18) : String(value);
88
+ }
89
+
90
+ export function formatDriftReport(report) {
91
+ const lines = ["drift-report [" + report.scope + "] identity=" + report.identity.algo + "/" + report.identity.source];
92
+ for (const entry of report.entries) {
93
+ if (entry.kind === "ok") continue;
94
+ const detail = entry.expected ? " (expected " + short(entry.expected) + ", actual " + short(entry.actual) + ")" : "";
95
+ lines.push(" " + entry.kind + ": " + entry.ref + detail);
96
+ }
97
+ lines.push(" summary: ok=" + report.summary.ok + " not-installed=" + report.summary.not_installed + " missing=" + report.summary.missing + " drifted=" + report.summary.drifted + " obsolete=" + report.summary.obsolete);
98
+ return lines.join("\n");
99
+ }
100
+
101
+ // Expected assets the distribution says should exist but that were never recorded.
102
+ export function expectedFromDistribution(metadata = {}) {
103
+ const expected = [];
104
+ for (const skill of metadata.distribution?.installedSkills ?? []) expected.push(".agents/skills/" + skill);
105
+ return expected;
106
+ }
107
+
108
+ function lstatSafe(target) {
109
+ try { return lstatSync(target); } catch (error) { if (error.code === "ENOENT") return null; throw error; }
110
+ }
@@ -1,3 +1,5 @@
1
+ import {countersignRuleForGate} from './digital-human-roles.mjs';
2
+ import {approvalExpectationForBoundAsset} from './approval-consumption.mjs';
1
3
  import {assertApprovedExecutionContext} from './approved-execution-context.mjs';
2
4
  import {createHash} from 'node:crypto';
3
5
  import { realpathSync } from 'node:fs';
@@ -113,7 +115,8 @@ export function verifyExistingArchitecture(identity,bindings,{root,registry,exec
113
115
  const review=bound(root,baseline.boundary_review);
114
116
  const rolesFile=path.join(root,'.template-spec/agents/digital-human-roles.yaml');
115
117
  const roles=parse(readFileSync(rolesFile));
116
- validateApprovalRecord(review,{rolesDoc:roles,requireApproved:true,root});
118
+ const reviewBoundary=['check.architecture-reviewed','gate.technical-design-approved'].find(boundary=>countersignRuleForGate(roles.gate_policy,boundary));
119
+ validateApprovalRecord(review,{rolesDoc:roles,requireApproved:true,root,expected:approvalExpectationForBoundAsset(reviewBoundary,bindings.manifest,{root})});
117
120
  requireThat(['check.architecture-reviewed','gate.technical-design-approved'].includes(review.gate_id)&&text(baseline.id)&&text(baseline.version),'ARCH_REVIEW_MISSING','需要架构边界审查');
118
121
  const basis=existingArchitectureDigest(Object.fromEntries(Object.entries(baseline).filter(([k])=>k!=='boundary_review')));
119
122
  requireThat(review.artifact_bindings?.some(x=>x.id===baseline.id&&x.version===baseline.version&&x.digest===basis),'ARCH_REVIEW_STALE','架构审查未绑定当前基线');