@qijenchen/design-system 0.1.0-beta.93 → 0.1.0-beta.96

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/AGENTS.md +6 -208
  2. package/CLAUDE.md +2 -23
  3. package/dist/components/Calendar/calendar.d.ts.map +1 -1
  4. package/dist/components/Calendar/calendar.js +47 -23
  5. package/dist/components/Calendar/calendar.js.map +1 -1
  6. package/dist/components/DataTable/cell-registry.d.ts.map +1 -1
  7. package/dist/components/DataTable/cell-registry.js +1 -5
  8. package/dist/components/DataTable/cell-registry.js.map +1 -1
  9. package/dist/components/DataTable/data-table-filter-value-picker.js +4 -0
  10. package/dist/components/DataTable/data-table-filter-value-picker.js.map +1 -1
  11. package/dist/components/DataTable/data-table.d.ts.map +1 -1
  12. package/dist/components/DataTable/data-table.js +3 -2
  13. package/dist/components/DataTable/data-table.js.map +1 -1
  14. package/dist/components/DataTable/filter-tree.js +6 -0
  15. package/dist/components/DataTable/filter-tree.js.map +1 -1
  16. package/dist/components/DatePicker/date-picker.d.ts.map +1 -1
  17. package/dist/components/DatePicker/date-picker.js +183 -156
  18. package/dist/components/DatePicker/date-picker.js.map +1 -1
  19. package/dist/components/Dialog/dialog.d.ts.map +1 -1
  20. package/dist/components/Dialog/dialog.js +4 -2
  21. package/dist/components/Dialog/dialog.js.map +1 -1
  22. package/dist/components/Field/field-context.d.ts +12 -0
  23. package/dist/components/Field/field-context.d.ts.map +1 -1
  24. package/dist/components/Field/field-context.js +10 -1
  25. package/dist/components/Field/field-context.js.map +1 -1
  26. package/dist/components/Field/field-wrapper.d.ts.map +1 -1
  27. package/dist/components/Field/field-wrapper.js +7 -1
  28. package/dist/components/Field/field-wrapper.js.map +1 -1
  29. package/dist/components/Field/field.d.ts.map +1 -1
  30. package/dist/components/Field/field.js +11 -2
  31. package/dist/components/Field/field.js.map +1 -1
  32. package/dist/components/InlineEdit/inline-edit.d.ts +5 -0
  33. package/dist/components/InlineEdit/inline-edit.d.ts.map +1 -1
  34. package/dist/components/InlineEdit/inline-edit.js +65 -33
  35. package/dist/components/InlineEdit/inline-edit.js.map +1 -1
  36. package/dist/components/Input/input.d.ts.map +1 -1
  37. package/dist/components/Input/input.js +3 -2
  38. package/dist/components/Input/input.js.map +1 -1
  39. package/dist/components/LinkInput/link-input.d.ts.map +1 -1
  40. package/dist/components/LinkInput/link-input.js +2 -1
  41. package/dist/components/LinkInput/link-input.js.map +1 -1
  42. package/dist/components/Popover/popover.d.ts.map +1 -1
  43. package/dist/components/Popover/popover.js +4 -2
  44. package/dist/components/Popover/popover.js.map +1 -1
  45. package/dist/components/Select/select.d.ts.map +1 -1
  46. package/dist/components/Select/select.js +59 -37
  47. package/dist/components/Select/select.js.map +1 -1
  48. package/dist/components/Textarea/textarea.d.ts +11 -0
  49. package/dist/components/Textarea/textarea.d.ts.map +1 -1
  50. package/dist/components/Textarea/textarea.js +22 -5
  51. package/dist/components/Textarea/textarea.js.map +1 -1
  52. package/dist/components/TimePicker/time-picker.d.ts.map +1 -1
  53. package/dist/components/TimePicker/time-picker.js +4 -3
  54. package/dist/components/TimePicker/time-picker.js.map +1 -1
  55. package/dist/patterns/element-anatomy/item-anatomy.d.ts +9 -0
  56. package/dist/patterns/element-anatomy/item-anatomy.d.ts.map +1 -1
  57. package/dist/patterns/element-anatomy/item-anatomy.js +71 -27
  58. package/dist/patterns/element-anatomy/item-anatomy.js.map +1 -1
  59. package/ds-canonical/adapters/claude/agents/README.md +58 -0
  60. package/ds-canonical/adapters/claude/agents/canonical-reviewer.md +14 -0
  61. package/ds-canonical/adapters/claude-root-instructions.md +24 -0
  62. package/ds-canonical/adapters/claude-settings-base.json +172 -0
  63. package/ds-canonical/commands/README.md +8 -13
  64. package/ds-canonical/commands/gov-status.md +5 -75
  65. package/ds-canonical/fork/AGENTS.md +116 -213
  66. package/ds-canonical/fork/CLAUDE.md +54 -0
  67. package/ds-canonical/fork/codex/agents/skills/bug-fix-rhythm/SKILL.md +207 -0
  68. package/ds-canonical/fork/codex/agents/skills/code-quality-audit/SKILL.md +71 -0
  69. package/ds-canonical/fork/codex/agents/skills/delivery-handoff/SKILL.md +244 -0
  70. package/ds-canonical/fork/codex/agents/skills/delivery-handoff/references/flow-diagram.md +180 -0
  71. package/ds-canonical/fork/codex/agents/skills/delivery-handoff/references/handoff-template.md +177 -0
  72. package/ds-canonical/fork/codex/agents/skills/delivery-handoff/references/inventory-checklist.md +196 -0
  73. package/ds-canonical/fork/codex/agents/skills/independent-review/SKILL.md +29 -19
  74. package/ds-canonical/fork/codex/agents/skills/independent-review/agents/openai.yaml +4 -0
  75. package/ds-canonical/fork/codex/agents/skills/independent-review/references/evidence-contract.md +24 -0
  76. package/ds-canonical/fork/codex/agents/skills/performance-audit/SKILL.md +114 -0
  77. package/ds-canonical/fork/codex/agents/skills/product-ui-audit/SKILL.md +244 -0
  78. package/ds-canonical/fork/codex/agents/skills/product-ui-audit/references/audit-checks.md +250 -0
  79. package/ds-canonical/fork/codex/agents/skills/product-ui-audit/references/common-misuses.md +329 -0
  80. package/ds-canonical/fork/codex/agents/skills/product-ui-audit/references/report-template.md +163 -0
  81. package/ds-canonical/fork/codex/agents/skills/propose-options/SKILL.md +190 -0
  82. package/ds-canonical/fork/codex/agents/skills/prototype/SKILL.md +246 -0
  83. package/ds-canonical/fork/codex/agents/skills/prototype/references/audit-checks.md +39 -0
  84. package/ds-canonical/fork/codex/agents/skills/prototype/references/benchmark-sources.md +94 -0
  85. package/ds-canonical/fork/codex/agents/skills/prototype/references/checkpoints.md +200 -0
  86. package/ds-canonical/fork/codex/agents/skills/prototype/references/evaluation-matrix.md +142 -0
  87. package/ds-canonical/fork/codex/agents/skills/prototype/references/ooux-template.md +198 -0
  88. package/ds-canonical/fork/codex/agents/skills/prototype/references/proposal-template.md +230 -0
  89. package/ds-canonical/fork/codex/agents/skills/scan-similar-bugs/SKILL.md +212 -0
  90. package/ds-canonical/fork/codex/agents/skills/ux-audit/SKILL.md +135 -0
  91. package/ds-canonical/fork/codex/agents/skills/visual-audit/SKILL.md +259 -0
  92. package/ds-canonical/fork/codex/agents/skills/visual-audit/output/.gitkeep +0 -0
  93. package/ds-canonical/fork/codex/agents/skills/visual-audit/references/audit-architecture.md +101 -0
  94. package/ds-canonical/fork/codex/agents/skills/visual-audit/references/visual-checklist.md +297 -0
  95. package/ds-canonical/fork/codex/agents/skills/visual-audit/references/world-class-benchmarks.md +198 -0
  96. package/ds-canonical/fork/codex/hooks.json +44 -3
  97. package/ds-canonical/fork/common/closed-tool-execution.mjs +1001 -0
  98. package/ds-canonical/fork/common/instruction.md +116 -0
  99. package/ds-canonical/fork/consumer/governance-check.mjs +3059 -0
  100. package/ds-canonical/fork/consumer/lib/closed-tool-execution.mjs +1001 -0
  101. package/ds-canonical/fork/consumer/lock.json +189 -0
  102. package/ds-canonical/fork/consumer/lock.schema.json +338 -0
  103. package/ds-canonical/fork/consumer/managed-files/0235cf6b3fd402a3717881dc205b5bf77aed7632e7d7d6f1811a40e3033bd816.blob +145 -0
  104. package/ds-canonical/fork/consumer/managed-files/145aab4b4fc470fc9ba7679b4a1d87d4f6a6d604940bd40f8d675c8af696498f.blob +47 -0
  105. package/ds-canonical/fork/consumer/managed-files/189e551431181e4a88783c02130d2787b801ef731c86e35bcde89a7313aa020e.blob +149 -0
  106. package/ds-canonical/fork/consumer/managed-files/24ad71c8613ddcf6fd23818cb3bb477a1fb6d83af4550b0bad43099813088686.blob +28 -0
  107. package/ds-canonical/fork/consumer/managed-files/2d1ef5617a5ce3c39ad9aae1c42af7d199f9270c0a0ccb490b63d62dbc6913db.blob +1001 -0
  108. package/ds-canonical/fork/consumer/managed-files/3625e02235cf166a50649a4d704cfb68fead69d0e168c481df013ebae9f6be25.blob +1412 -0
  109. package/ds-canonical/fork/consumer/managed-files/3ddedc67b464bdfe3dde9803a2d917920c96d633678b802eee638a44cd47366a.blob +8 -0
  110. package/ds-canonical/fork/consumer/managed-files/423729840acdd43c812f17c245b871716c6b60f76e4d3e94864d0e34a815bf8d.blob +348 -0
  111. package/ds-canonical/fork/consumer/managed-files/46f10bc55cdfdf834d0749eebff42ea0bb8576f361b36d2b6ba1851354c50150.blob +464 -0
  112. package/ds-canonical/fork/consumer/managed-files/475fba657eaeb8abd88f60635f3eadab27a9d0d3114ba4fffc65f43a2a0fe6e2.blob +124 -0
  113. package/ds-canonical/fork/consumer/managed-files/61c6aca6d7f04bedbf556eaa9d3043681fe48cbe0e93a8ccb1d69a7c5e23fdcf.blob +113 -0
  114. package/ds-canonical/fork/consumer/managed-files/63061e05969667005020166ea2ae7df3c96663f7a928e7dd3eebc1471022df56.blob +2398 -0
  115. package/ds-canonical/fork/consumer/managed-files/65410b66e8799a560e07b71779c186fed2a0ef50575ac44745df7a0938a9c2b4.blob +317 -0
  116. package/ds-canonical/fork/consumer/managed-files/6929a3c8bb4d69c507720b4754aeb339c6cbb8ff655e0a381d76606d64695e38.blob +393 -0
  117. package/ds-canonical/fork/consumer/managed-files/6b746628ac11fcccbe277ef6fea94cc2a7b90ea2822e83536eae80d5ee4b3fa5.blob +167 -0
  118. package/ds-canonical/fork/consumer/managed-files/76d485470d30ff014afacf7ce643763de9f4f956d9fc8128dbc1814774cf2e63.blob +671 -0
  119. package/ds-canonical/fork/consumer/managed-files/77e06f62670dfee01e9b5e8b0f8dad085ce711d75538c1fb0679d9818acaca82.blob +424 -0
  120. package/ds-canonical/fork/consumer/managed-files/7937321877e5c34c27dae36c0d507d21cd42fa3f46a8f11a284b8b4a52b6faa4.blob +84 -0
  121. package/ds-canonical/fork/consumer/managed-files/794bb911ba8ebef58ab0d44a55b9968a19d2c62bcfb310b1ee3a84166f087f21.blob +880 -0
  122. package/ds-canonical/fork/consumer/managed-files/7b17835d0ceb17cdcdcaf930540a3e5d0943a34a747ac43c12ca8cd485c11581.blob +44 -0
  123. package/ds-canonical/fork/consumer/managed-files/7eb6cc60abfdabaf6617c336058fad1454ccde08889295767bfd9b7fd153cc6e.blob +778 -0
  124. package/ds-canonical/fork/consumer/managed-files/81037efa5b3b9f4a875704005fb268acdc9233bb901f44902e4e37e1da92b8e3.blob +46 -0
  125. package/ds-canonical/fork/consumer/managed-files/884721550b56308812b20917adac7a12f36fdb4ecda6b02460a7f5a219c0c966.blob +78 -0
  126. package/ds-canonical/fork/consumer/managed-files/91f414b9462ddc1e4be1d4c6ca4ac7a7340a6eec9e98ee109cbc049d3b354b6a.blob +36 -0
  127. package/ds-canonical/fork/consumer/managed-files/92e4828cdcb96ff0d01daa16f6885f24045a8e72820665650f2a1890dc3a446c.blob +121 -0
  128. package/ds-canonical/fork/consumer/managed-files/93a89f16f6717d1e4e4e27ec20ef916e3355c7aa890ca74cd9b12db30d8a899f.blob +43 -0
  129. package/ds-canonical/fork/consumer/managed-files/974521d6b8fe796ea4c58b3c78b0c2b8a1be262b97100d77aaf4cc9c7724bcab.blob +45 -0
  130. package/ds-canonical/fork/consumer/managed-files/9791c85388d2e2e2bd564e2550fadc3351c4c960a47ce838098afcba7544eb90.blob +959 -0
  131. package/ds-canonical/fork/consumer/managed-files/a448d2222133335c30e6fda5116e26a40db3283a19d62ccc0663c30d272262a7.blob +174 -0
  132. package/ds-canonical/fork/consumer/managed-files/ab072e7f2eca51f0e18a5e18c4b333260ee5d219a12cc6df5bb2d683f0b2734d.blob +2636 -0
  133. package/ds-canonical/fork/consumer/managed-files/bc44cabad181f766611dab6a8f52d81100afadd50ac59799015e8ba7bf46d9eb.blob +596 -0
  134. package/ds-canonical/fork/consumer/managed-files/c4aa767f11714467de0038a2149cf78074baddc17fc6a9e074b6aed7544c6f3c.blob +80 -0
  135. package/ds-canonical/fork/consumer/managed-files/c893e9b734b162f4c631fef871128c16a9ab565f796a0e76d7f320f821f220f5.blob +41 -0
  136. package/ds-canonical/fork/consumer/managed-files/cd9c61f8ff24fb9bcc3663e346e2cfa419cfb84e02aae18d3dc66dd192681696.blob +9 -0
  137. package/ds-canonical/fork/consumer/managed-files/da2ad2737315d25a5300905ddefd62f1695056a8a1af155c5b34170ad9923bce.blob +38 -0
  138. package/ds-canonical/fork/consumer/managed-files/e1b11160d6c4043002d2cbff6d9a4ae551698a96137773c4244dadfac152fcb0.blob +222 -0
  139. package/ds-canonical/fork/consumer/managed-files/e26057408661597aac4a57cdf7e30e2f9d0afb1b9a2dbbb692c3805cd9028ca5.blob +250 -0
  140. package/ds-canonical/fork/consumer/managed-files/e68ae1915965d8e17d4b2441c00c2b97fe062ea308ae8535c9eebb2fc16fa245.blob +20 -0
  141. package/ds-canonical/fork/consumer/managed-files/e71c65f45c6af7ce12b6b3c0d8028f185da5b719e2050c9b2a6b243d41ae4878.blob +182 -0
  142. package/ds-canonical/fork/consumer/managed-files/e813096d69c49812e40e00be9ac8fa14d77f0ec1f97ab4c45cb096b3bedd35de.blob +3 -0
  143. package/ds-canonical/fork/consumer/managed-files/e930ebca6fd8eeb30802aac0930efae7bcc44cc0996f24de07c11ca6a081fedf.blob +277 -0
  144. package/ds-canonical/fork/consumer/managed-files/ea94e914d5c8acb84ad7660e5bda0f01b6ccc8cf96b0f6b1ce048f8938d0f5b5.blob +47 -0
  145. package/ds-canonical/fork/consumer/managed-files/f4db6e616d5229aa7e700c6a3ace022cb9d90baae74e38ca65fce617f18e0d9b.blob +110 -0
  146. package/ds-canonical/fork/consumer/managed-files/faa128c26102415dc5345e68698efbbd28a395c35ee278dceae044cf430692b2.blob +11 -0
  147. package/ds-canonical/fork/governance.lock +1552 -103
  148. package/ds-canonical/fork/hooks/_log-fire.sh +109 -12
  149. package/ds-canonical/fork/hooks/block_prototype_imports.py +148 -29
  150. package/ds-canonical/fork/hooks/check_chrome_header_avatar_canonical.sh +23 -12
  151. package/ds-canonical/fork/hooks/check_consumer_app_invariants.sh +116 -65
  152. package/ds-canonical/fork/hooks/check_consumer_code_quality.sh +140 -0
  153. package/ds-canonical/fork/hooks/check_ds_anchor_preflight.sh +84 -30
  154. package/ds-canonical/fork/hooks/check_dynamic_tailwind_class.sh +16 -6
  155. package/ds-canonical/fork/hooks/check_escape_marker_abuse.sh +65 -21
  156. package/ds-canonical/fork/hooks/check_field_family_invariants.sh +90 -24
  157. package/ds-canonical/fork/hooks/check_fork_product_quality.sh +8 -6
  158. package/ds-canonical/fork/hooks/check_item_list_gap.sh +4 -2
  159. package/ds-canonical/fork/hooks/check_layout_space_magic_numbers.sh +31 -13
  160. package/ds-canonical/fork/hooks/check_opacity_token_usage.sh +220 -95
  161. package/ds-canonical/fork/hooks/check_pattern_invariants.sh +73 -14
  162. package/ds-canonical/fork/hooks/check_sidebar_menu_button_implicit_wrap.sh +23 -12
  163. package/ds-canonical/fork/hooks/check_story_determinism.sh +1 -1
  164. package/ds-canonical/fork/hooks/check_story_invariants.sh +342 -61
  165. package/ds-canonical/fork/hooks/check_tabs_content_chrome_body_double_gap.sh +52 -23
  166. package/ds-canonical/fork/hooks/check_tailwind_wildcard_in_docs.sh +20 -13
  167. package/ds-canonical/fork/hooks/inject_deploy_url_after_push.sh +105 -22
  168. package/ds-canonical/fork/hooks/lib/_hook_integrity.sh +158 -0
  169. package/ds-canonical/fork/hooks/lib/_provider_paths.sh +162 -0
  170. package/ds-canonical/fork/launchers/approval-evidence.mjs +1131 -0
  171. package/ds-canonical/fork/launchers/authority-decision-evidence.mjs +413 -0
  172. package/ds-canonical/fork/launchers/canonical-order.mjs +8 -0
  173. package/ds-canonical/fork/launchers/fork-governance-dispatcher.sh +139 -29
  174. package/ds-canonical/fork/launchers/format-provider-hook-output.mjs +25 -0
  175. package/ds-canonical/fork/launchers/independent-review.mjs +490 -0
  176. package/ds-canonical/fork/launchers/inject_fork_governance_preamble.sh +88 -43
  177. package/ds-canonical/fork/launchers/normalize-provider-event.mjs +355 -0
  178. package/ds-canonical/fork/launchers/product-hook-dispatch-runtime.mjs +1067 -0
  179. package/ds-canonical/fork/launchers/provider-hook-normalization.mjs +1646 -0
  180. package/ds-canonical/fork/launchers/provider-hook-output-transport.mjs +525 -0
  181. package/ds-canonical/fork/launchers/settings-hooks.json +30 -53
  182. package/ds-canonical/fork/manifest.json +1881 -23
  183. package/ds-canonical/fork/providers/claude/hook-config.json +333 -0
  184. package/ds-canonical/fork/providers/claude/instruction.md +54 -0
  185. package/ds-canonical/fork/providers/claude/skills/bug-fix-rhythm/SKILL.md +207 -0
  186. package/ds-canonical/fork/providers/claude/skills/code-quality-audit/SKILL.md +71 -0
  187. package/ds-canonical/fork/providers/claude/skills/delivery-handoff/SKILL.md +244 -0
  188. package/ds-canonical/fork/providers/claude/skills/delivery-handoff/references/flow-diagram.md +180 -0
  189. package/ds-canonical/fork/providers/claude/skills/delivery-handoff/references/handoff-template.md +177 -0
  190. package/ds-canonical/fork/providers/claude/skills/delivery-handoff/references/inventory-checklist.md +196 -0
  191. package/ds-canonical/fork/providers/claude/skills/independent-review/SKILL.md +43 -0
  192. package/ds-canonical/fork/providers/claude/skills/independent-review/agents/openai.yaml +4 -0
  193. package/ds-canonical/fork/providers/claude/skills/independent-review/references/evidence-contract.md +24 -0
  194. package/ds-canonical/fork/providers/claude/skills/performance-audit/SKILL.md +114 -0
  195. package/ds-canonical/fork/providers/claude/skills/product-ui-audit/SKILL.md +244 -0
  196. package/ds-canonical/fork/providers/claude/skills/product-ui-audit/references/audit-checks.md +250 -0
  197. package/ds-canonical/fork/providers/claude/skills/product-ui-audit/references/common-misuses.md +329 -0
  198. package/ds-canonical/fork/providers/claude/skills/product-ui-audit/references/report-template.md +163 -0
  199. package/ds-canonical/fork/providers/claude/skills/propose-options/SKILL.md +190 -0
  200. package/ds-canonical/fork/providers/claude/skills/prototype/SKILL.md +246 -0
  201. package/ds-canonical/fork/providers/claude/skills/prototype/references/audit-checks.md +39 -0
  202. package/ds-canonical/fork/providers/claude/skills/prototype/references/benchmark-sources.md +94 -0
  203. package/ds-canonical/fork/providers/claude/skills/prototype/references/checkpoints.md +200 -0
  204. package/ds-canonical/fork/providers/claude/skills/prototype/references/evaluation-matrix.md +142 -0
  205. package/ds-canonical/fork/providers/claude/skills/prototype/references/ooux-template.md +198 -0
  206. package/ds-canonical/fork/providers/claude/skills/prototype/references/proposal-template.md +230 -0
  207. package/ds-canonical/fork/providers/claude/skills/scan-similar-bugs/SKILL.md +212 -0
  208. package/ds-canonical/fork/providers/claude/skills/ux-audit/SKILL.md +135 -0
  209. package/ds-canonical/fork/providers/claude/skills/visual-audit/SKILL.md +259 -0
  210. package/ds-canonical/fork/providers/claude/skills/visual-audit/output/.gitkeep +0 -0
  211. package/ds-canonical/fork/providers/claude/skills/visual-audit/references/audit-architecture.md +101 -0
  212. package/ds-canonical/fork/providers/claude/skills/visual-audit/references/visual-checklist.md +297 -0
  213. package/ds-canonical/fork/providers/claude/skills/visual-audit/references/world-class-benchmarks.md +198 -0
  214. package/ds-canonical/fork/providers/codex/hook-config.json +57 -0
  215. package/ds-canonical/fork/providers/codex/skills/bug-fix-rhythm/SKILL.md +207 -0
  216. package/ds-canonical/fork/providers/codex/skills/code-quality-audit/SKILL.md +71 -0
  217. package/ds-canonical/fork/providers/codex/skills/delivery-handoff/SKILL.md +244 -0
  218. package/ds-canonical/fork/providers/codex/skills/delivery-handoff/references/flow-diagram.md +180 -0
  219. package/ds-canonical/fork/providers/codex/skills/delivery-handoff/references/handoff-template.md +177 -0
  220. package/ds-canonical/fork/providers/codex/skills/delivery-handoff/references/inventory-checklist.md +196 -0
  221. package/ds-canonical/fork/providers/codex/skills/independent-review/SKILL.md +43 -0
  222. package/ds-canonical/fork/providers/codex/skills/independent-review/agents/openai.yaml +4 -0
  223. package/ds-canonical/fork/providers/codex/skills/independent-review/references/evidence-contract.md +24 -0
  224. package/ds-canonical/fork/providers/codex/skills/performance-audit/SKILL.md +114 -0
  225. package/ds-canonical/fork/providers/codex/skills/product-ui-audit/SKILL.md +244 -0
  226. package/ds-canonical/fork/providers/codex/skills/product-ui-audit/references/audit-checks.md +250 -0
  227. package/ds-canonical/fork/providers/codex/skills/product-ui-audit/references/common-misuses.md +329 -0
  228. package/ds-canonical/fork/providers/codex/skills/product-ui-audit/references/report-template.md +163 -0
  229. package/ds-canonical/fork/providers/codex/skills/propose-options/SKILL.md +190 -0
  230. package/ds-canonical/fork/providers/codex/skills/prototype/SKILL.md +246 -0
  231. package/ds-canonical/fork/providers/codex/skills/prototype/references/audit-checks.md +39 -0
  232. package/ds-canonical/fork/providers/codex/skills/prototype/references/benchmark-sources.md +94 -0
  233. package/ds-canonical/fork/providers/codex/skills/prototype/references/checkpoints.md +200 -0
  234. package/ds-canonical/fork/providers/codex/skills/prototype/references/evaluation-matrix.md +142 -0
  235. package/ds-canonical/fork/providers/codex/skills/prototype/references/ooux-template.md +198 -0
  236. package/ds-canonical/fork/providers/codex/skills/prototype/references/proposal-template.md +230 -0
  237. package/ds-canonical/fork/providers/codex/skills/scan-similar-bugs/SKILL.md +212 -0
  238. package/ds-canonical/fork/providers/codex/skills/ux-audit/SKILL.md +135 -0
  239. package/ds-canonical/fork/providers/codex/skills/visual-audit/SKILL.md +259 -0
  240. package/ds-canonical/fork/providers/codex/skills/visual-audit/output/.gitkeep +0 -0
  241. package/ds-canonical/fork/providers/codex/skills/visual-audit/references/audit-architecture.md +101 -0
  242. package/ds-canonical/fork/providers/codex/skills/visual-audit/references/visual-checklist.md +297 -0
  243. package/ds-canonical/fork/providers/codex/skills/visual-audit/references/world-class-benchmarks.md +198 -0
  244. package/ds-canonical/fork/references/story-baseline-registry.json +117 -0
  245. package/ds-canonical/fork/references/story-baseline-registry.schema.json +145 -0
  246. package/ds-canonical/fork/references/utility-registry.json +377 -0
  247. package/ds-canonical/fork/references/utility-registry.schema.json +373 -0
  248. package/ds-canonical/fork/review/canonical-order.mjs +8 -0
  249. package/ds-canonical/fork/review/provider-review-binding.mjs +2377 -0
  250. package/ds-canonical/fork/skills/bug-fix-rhythm/SKILL.md +19 -12
  251. package/ds-canonical/fork/skills/code-quality-audit/SKILL.md +19 -15
  252. package/ds-canonical/fork/skills/delivery-handoff/SKILL.md +17 -11
  253. package/ds-canonical/fork/skills/independent-review/SKILL.md +37 -0
  254. package/ds-canonical/fork/skills/independent-review/agents/openai.yaml +4 -0
  255. package/ds-canonical/fork/skills/independent-review/references/evidence-contract.md +24 -0
  256. package/ds-canonical/fork/skills/performance-audit/SKILL.md +11 -8
  257. package/ds-canonical/fork/skills/product-ui-audit/SKILL.md +31 -21
  258. package/ds-canonical/fork/skills/product-ui-audit/references/audit-checks.md +9 -5
  259. package/ds-canonical/fork/skills/product-ui-audit/references/report-template.md +30 -26
  260. package/ds-canonical/fork/skills/propose-options/SKILL.md +6 -4
  261. package/ds-canonical/fork/skills/prototype/SKILL.md +21 -21
  262. package/ds-canonical/fork/skills/prototype/references/audit-checks.md +7 -6
  263. package/ds-canonical/fork/skills/prototype/references/checkpoints.md +26 -17
  264. package/ds-canonical/fork/skills/prototype/references/evaluation-matrix.md +2 -1
  265. package/ds-canonical/fork/skills/prototype/references/ooux-template.md +1 -1
  266. package/ds-canonical/fork/skills/prototype/references/proposal-template.md +6 -5
  267. package/ds-canonical/fork/skills/scan-similar-bugs/SKILL.md +28 -27
  268. package/ds-canonical/fork/skills/ux-audit/SKILL.md +8 -5
  269. package/ds-canonical/fork/skills/visual-audit/SKILL.md +37 -43
  270. package/ds-canonical/fork/skills/visual-audit/references/audit-architecture.md +15 -15
  271. package/ds-canonical/fork/skills/visual-audit/references/visual-checklist.md +6 -6
  272. package/ds-canonical/fork/skills/visual-audit/references/world-class-benchmarks.md +2 -2
  273. package/ds-canonical/hooks/README.md +37 -23
  274. package/ds-canonical/hooks/_log-fire.sh +109 -12
  275. package/ds-canonical/hooks/auto_regen_ds_barrel.sh +52 -20
  276. package/ds-canonical/hooks/block_prototype_imports.py +148 -29
  277. package/ds-canonical/hooks/check_audit_post_report_validator.sh +76 -66
  278. package/ds-canonical/hooks/check_audit_sample_escape.sh +4 -4
  279. package/ds-canonical/hooks/check_benchmark_citation.sh +3 -3
  280. package/ds-canonical/hooks/check_canonical_propagation.sh +81 -22
  281. package/ds-canonical/hooks/check_chrome_header_avatar_canonical.sh +22 -11
  282. package/ds-canonical/hooks/check_codex_brief_invariants.sh +100 -56
  283. package/ds-canonical/hooks/check_codex_collab_5step.sh +31 -25
  284. package/ds-canonical/hooks/check_consumer_app_invariants.sh +116 -65
  285. package/ds-canonical/hooks/check_consumer_code_quality.sh +140 -0
  286. package/ds-canonical/hooks/check_datatable_invariants.sh +103 -25
  287. package/ds-canonical/hooks/check_dim_count_drift.sh +5 -4
  288. package/ds-canonical/hooks/check_ds_anchor_preflight.sh +83 -29
  289. package/ds-canonical/hooks/check_dynamic_tailwind_class.sh +16 -6
  290. package/ds-canonical/hooks/check_escape_marker_abuse.sh +65 -21
  291. package/ds-canonical/hooks/check_field_controls_contracts.sh +10 -8
  292. package/ds-canonical/hooks/check_field_family_invariants.sh +90 -24
  293. package/ds-canonical/hooks/check_file_size_budget.sh +32 -14
  294. package/ds-canonical/hooks/check_full_story_visual_interaction_sweep.sh +60 -21
  295. package/ds-canonical/hooks/check_item_list_gap.sh +4 -2
  296. package/ds-canonical/hooks/check_layout_space_magic_numbers.sh +31 -13
  297. package/ds-canonical/hooks/check_main_branch_workbench.sh +27 -68
  298. package/ds-canonical/hooks/check_naming_and_abstraction.sh +20 -9
  299. package/ds-canonical/hooks/check_opacity_token_usage.sh +220 -95
  300. package/ds-canonical/hooks/check_orphan_ds_css.sh +48 -18
  301. package/ds-canonical/hooks/check_overlay_open_focus_escape_probe.sh +29 -11
  302. package/ds-canonical/hooks/check_pattern_invariants.sh +73 -14
  303. package/ds-canonical/hooks/check_peoplepicker_ssot_drift.sh +4 -4
  304. package/ds-canonical/hooks/check_pixel_quantified_audit.sh +3 -2
  305. package/ds-canonical/hooks/check_plugin_fork_health.sh +151 -41
  306. package/ds-canonical/hooks/check_post_main_ssot_propagate.sh +5 -109
  307. package/ds-canonical/hooks/check_propose_discipline.sh +116 -29
  308. package/ds-canonical/hooks/check_propose_pre_grep_verify.sh +6 -4
  309. package/ds-canonical/hooks/check_propose_without_benchmark.sh +10 -6
  310. package/ds-canonical/hooks/check_select_all_canonical.sh +1 -1
  311. package/ds-canonical/hooks/check_sidebar_menu_button_implicit_wrap.sh +22 -11
  312. package/ds-canonical/hooks/check_solo_workflow.sh +117 -186
  313. package/ds-canonical/hooks/check_spec_class_drift.sh +33 -19
  314. package/ds-canonical/hooks/check_ssot_header_declaration.sh +6 -5
  315. package/ds-canonical/hooks/check_story_determinism.sh +1 -1
  316. package/ds-canonical/hooks/check_story_invariants.sh +526 -213
  317. package/ds-canonical/hooks/check_storybook_addon_packaging.sh +65 -15
  318. package/ds-canonical/hooks/check_substantive_edit_approval_preflight.sh +137 -67
  319. package/ds-canonical/hooks/check_tabs_content_chrome_body_double_gap.sh +52 -23
  320. package/ds-canonical/hooks/check_tailwind_wildcard_in_docs.sh +20 -13
  321. package/ds-canonical/hooks/check_wrapper_primitive_schema_drift.sh +15 -12
  322. package/ds-canonical/hooks/chrome_header_dispatcher.sh +75 -26
  323. package/ds-canonical/hooks/enforce_home_charter.sh +29 -8
  324. package/ds-canonical/hooks/governance_control_plane.sh +15 -0
  325. package/ds-canonical/hooks/inject_deploy_url_after_push.sh +105 -22
  326. package/ds-canonical/hooks/inject_pending_self_audit.sh +27 -24
  327. package/ds-canonical/hooks/lib/_app_shell_primary_header_consistency.sh +77 -29
  328. package/ds-canonical/hooks/lib/_approval_re.sh +5 -6
  329. package/ds-canonical/hooks/lib/_chrome_header_handcraft.sh +66 -20
  330. package/ds-canonical/hooks/lib/_code_quality.sh +9 -9
  331. package/ds-canonical/hooks/lib/_cva_default_sync.sh +11 -13
  332. package/ds-canonical/hooks/lib/_governance_coverage_check.sh +48 -21
  333. package/ds-canonical/hooks/lib/_hardcoded_strings.sh +13 -10
  334. package/ds-canonical/hooks/lib/_header_with_tabs_border.sh +68 -48
  335. package/ds-canonical/hooks/lib/_hook_integrity.sh +158 -0
  336. package/ds-canonical/hooks/lib/_layout_space_canonical.sh +5 -5
  337. package/ds-canonical/hooks/lib/_overlay_handcraft.sh +21 -23
  338. package/ds-canonical/hooks/lib/_person_data_richness.sh +5 -5
  339. package/ds-canonical/hooks/lib/_provider_paths.sh +162 -0
  340. package/ds-canonical/hooks/lib/_story_compile_drift.sh +5 -5
  341. package/ds-canonical/hooks/lib/_tab_lg_chrome_header_equal.sh +247 -27
  342. package/ds-canonical/hooks/lib/_token_hygiene.sh +39 -22
  343. package/ds-canonical/hooks/lib/approval-evidence.mjs +1131 -0
  344. package/ds-canonical/hooks/lib/audit-report-validator.mjs +118 -0
  345. package/ds-canonical/hooks/lib/provider-marker-regex.mjs +23 -0
  346. package/ds-canonical/hooks/lib/tsx-governance-analysis.mjs +410 -0
  347. package/ds-canonical/hooks/log_governance_fires.sh +45 -13
  348. package/ds-canonical/hooks/log_skill_invokes.sh +8 -7
  349. package/ds-canonical/hooks/post_edit_dispatcher.sh +106 -28
  350. package/ds-canonical/hooks/registrations.json +488 -0
  351. package/ds-canonical/hooks/registrations.schema.json +58 -0
  352. package/ds-canonical/hooks/retired/2026-06-11-prune-merge/check_propose_plain_chinese.sh +1 -1
  353. package/ds-canonical/hooks/retired/check_governance_compliance.sh +1 -1
  354. package/ds-canonical/hooks/session_start_governance_check.sh +109 -78
  355. package/ds-canonical/hooks/stop_audit_content_quality.sh +20 -0
  356. package/ds-canonical/hooks/stop_extract_canonical_rules.sh +20 -0
  357. package/ds-canonical/hooks/stop_passive_logging.sh +133 -59
  358. package/ds-canonical/hooks/stop_self_audit.sh +349 -210
  359. package/ds-canonical/hooks/tests/fixtures/transcripts/claude-transcript-jsonl-v1.jsonl +3 -0
  360. package/ds-canonical/hooks/tests/fixtures/transcripts/claude-transcript-jsonl-v2.jsonl +3 -0
  361. package/ds-canonical/hooks/tests/registration-output-contracts.mjs +151 -0
  362. package/ds-canonical/hooks/tests/run-all.sh +35 -5
  363. package/ds-canonical/hooks/tests/test_auto_regen_ds_barrel.sh +48 -4
  364. package/ds-canonical/hooks/tests/test_block_prototype_imports.sh +157 -9
  365. package/ds-canonical/hooks/tests/test_check_app_shell_primary_header_consistency.sh +265 -127
  366. package/ds-canonical/hooks/tests/test_check_audit_post_report_validator.sh +119 -12
  367. package/ds-canonical/hooks/tests/test_check_audit_sample_escape.sh +0 -0
  368. package/ds-canonical/hooks/tests/test_check_benchmark_citation.sh +0 -0
  369. package/ds-canonical/hooks/tests/test_check_canonical_propagation.sh +56 -5
  370. package/ds-canonical/hooks/tests/test_check_chrome_header_avatar_canonical.sh +6 -6
  371. package/ds-canonical/hooks/tests/test_check_chrome_header_handcraft.sh +193 -100
  372. package/ds-canonical/hooks/tests/test_check_codex_brief_invariants.sh +143 -17
  373. package/ds-canonical/hooks/tests/test_check_codex_collab_5step.sh +49 -5
  374. package/ds-canonical/hooks/tests/test_check_consumer_app_invariants.sh +128 -0
  375. package/ds-canonical/hooks/tests/test_check_consumer_app_story_title.sh +2 -2
  376. package/ds-canonical/hooks/tests/test_check_consumer_code_quality.sh +64 -0
  377. package/ds-canonical/hooks/tests/test_check_consumer_ds_primitive_misuse.sh +2 -2
  378. package/ds-canonical/hooks/tests/test_check_consumer_no_ds_catalog.sh +2 -2
  379. package/ds-canonical/hooks/tests/test_check_consumer_story_baseline.sh +2 -2
  380. package/ds-canonical/hooks/tests/test_check_data_table_size_num_to_meta_width.sh +26 -8
  381. package/ds-canonical/hooks/tests/test_check_datatable_invariants.sh +126 -12
  382. package/ds-canonical/hooks/tests/test_check_dim_count_drift.sh +13 -8
  383. package/ds-canonical/hooks/tests/test_check_ds_anchor_preflight.sh +53 -7
  384. package/ds-canonical/hooks/tests/test_check_dynamic_tailwind_class.sh +3 -3
  385. package/ds-canonical/hooks/tests/test_check_escape_marker_abuse.sh +17 -7
  386. package/ds-canonical/hooks/tests/test_check_field_family_invariants.sh +72 -16
  387. package/ds-canonical/hooks/tests/test_check_file_size_budget.sh +67 -5
  388. package/ds-canonical/hooks/tests/test_check_fork_user_plugin_install.sh +107 -4
  389. package/ds-canonical/hooks/tests/test_check_full_story_visual_interaction_sweep.sh +25 -15
  390. package/ds-canonical/hooks/tests/test_check_header_with_tabs_border.sh +177 -67
  391. package/ds-canonical/hooks/tests/test_check_item_list_gap.sh +7 -7
  392. package/ds-canonical/hooks/tests/test_check_layout_space_magic_numbers.sh +2 -2
  393. package/ds-canonical/hooks/tests/test_check_main_branch_workbench.sh +45 -110
  394. package/ds-canonical/hooks/tests/test_check_naming_and_abstraction.sh +19 -2
  395. package/ds-canonical/hooks/tests/test_check_opacity_token_usage.sh +114 -8
  396. package/ds-canonical/hooks/tests/test_check_orphan_ds_css.sh +38 -22
  397. package/ds-canonical/hooks/tests/test_check_overlay_open_focus_escape_probe.sh +2 -2
  398. package/ds-canonical/hooks/tests/test_check_pattern_invariants.sh +68 -6
  399. package/ds-canonical/hooks/tests/test_check_plugin_fork_health.sh +53 -0
  400. package/ds-canonical/hooks/tests/test_check_post_main_ssot_propagate.sh +37 -0
  401. package/ds-canonical/hooks/tests/test_check_propose_cite_required.sh +2 -2
  402. package/ds-canonical/hooks/tests/test_check_propose_discipline.sh +59 -0
  403. package/ds-canonical/hooks/tests/test_check_propose_plain_chinese.sh +7 -5
  404. package/ds-canonical/hooks/tests/test_check_propose_pre_grep_verify.sh +5 -5
  405. package/ds-canonical/hooks/tests/test_check_propose_without_benchmark.sh +45 -0
  406. package/ds-canonical/hooks/tests/test_check_sidebar_menu_button_implicit_wrap.sh +5 -5
  407. package/ds-canonical/hooks/tests/test_check_solo_workflow.sh +183 -105
  408. package/ds-canonical/hooks/tests/test_check_spec_class_drift.sh +35 -7
  409. package/ds-canonical/hooks/tests/{test_check_story_anatomy.sh.broken → test_check_story_anatomy.sh} +73 -4
  410. package/ds-canonical/hooks/tests/{test_check_story_category.sh.broken → test_check_story_category.sh} +82 -2
  411. package/ds-canonical/hooks/tests/test_check_story_determinism.sh +39 -0
  412. package/ds-canonical/hooks/tests/test_check_story_invariants.sh +559 -43
  413. package/ds-canonical/hooks/tests/{test_check_story_name_jargon.sh.broken → test_check_story_name_jargon.sh} +22 -1
  414. package/ds-canonical/hooks/tests/test_check_storybook_addon_packaging.sh +79 -0
  415. package/ds-canonical/hooks/tests/test_check_storybook_addon_preset_cjs.sh +2 -2
  416. package/ds-canonical/hooks/tests/test_check_substantive_edit_approval_preflight.sh +546 -28
  417. package/ds-canonical/hooks/tests/test_check_tab_lg_chrome_header_equal.sh +180 -98
  418. package/ds-canonical/hooks/tests/test_check_tabs_content_chrome_body_double_gap.sh +3 -3
  419. package/ds-canonical/hooks/tests/test_check_tailwind_wildcard_in_docs.sh +2 -2
  420. package/ds-canonical/hooks/tests/test_check_token_hygiene.sh +63 -15
  421. package/ds-canonical/hooks/tests/test_check_wrapper_primitive_schema_drift.sh +12 -6
  422. package/ds-canonical/hooks/tests/test_chrome_header_dispatcher.sh +125 -0
  423. package/ds-canonical/hooks/tests/test_enforce_home_charter.sh +57 -3
  424. package/ds-canonical/hooks/tests/test_governance_control_plane.sh +66 -0
  425. package/ds-canonical/hooks/tests/test_governance_coverage_check.sh +88 -0
  426. package/ds-canonical/hooks/tests/test_hook_integrity_classification.sh +217 -0
  427. package/ds-canonical/hooks/tests/test_inject_deploy_url_after_push.sh +85 -2
  428. package/ds-canonical/hooks/tests/test_inject_pending_self_audit.sh +116 -11
  429. package/ds-canonical/hooks/tests/test_log_governance_fires.sh +117 -1
  430. package/ds-canonical/hooks/tests/test_log_skill_invokes.sh +74 -5
  431. package/ds-canonical/hooks/tests/test_post_edit_dispatcher.sh +234 -77
  432. package/ds-canonical/hooks/tests/test_provider_peer_symmetry.sh +76 -0
  433. package/ds-canonical/hooks/tests/test_registration_output_contracts.sh +20 -0
  434. package/ds-canonical/hooks/tests/test_session_start_governance_check.sh +130 -18
  435. package/ds-canonical/hooks/tests/test_stop_audit_content_quality.sh +75 -0
  436. package/ds-canonical/hooks/tests/test_stop_capture_metrics.sh +101 -23
  437. package/ds-canonical/hooks/tests/test_stop_extract_canonical_rules.sh +75 -0
  438. package/ds-canonical/hooks/tests/{test_stop_governance_drift_check.sh.broken → test_stop_governance_drift_check.sh} +22 -12
  439. package/ds-canonical/hooks/tests/test_stop_passive_logging.sh +102 -1
  440. package/ds-canonical/hooks/tests/test_stop_repository_command_context.sh +38 -0
  441. package/ds-canonical/hooks/tests/test_stop_self_audit.sh +363 -9
  442. package/ds-canonical/references/README.md +8 -8
  443. package/ds-canonical/references/audit-coverage-vs-24-checklist.md +4 -4
  444. package/ds-canonical/references/build-ui-canonicals.md +3 -3
  445. package/ds-canonical/references/certified-surfaces.md +46 -15
  446. package/ds-canonical/references/cva-patterns.md +2 -2
  447. package/ds-canonical/references/failure-class-registry.json +3 -2
  448. package/ds-canonical/references/governance-audit-coverage.md +8 -8
  449. package/ds-canonical/references/naming-conventions.md +1 -1
  450. package/ds-canonical/references/preflight-gate-baseline.json +210 -3
  451. package/ds-canonical/references/principle-dim-map.json +15 -9
  452. package/ds-canonical/references/props-naming.md +1 -1
  453. package/ds-canonical/references/scenario-definition.md +33 -30
  454. package/ds-canonical/references/spec-rules.md +1 -1
  455. package/ds-canonical/references/ssot-consultation.md +3 -3
  456. package/ds-canonical/references/ssot-index.md +1 -1
  457. package/ds-canonical/references/story-baseline-registry.json +9 -6
  458. package/ds-canonical/references/story-baseline-registry.schema.json +145 -0
  459. package/ds-canonical/references/structural-token-retention.md +1 -1
  460. package/ds-canonical/references/tailwind-gotchas.md +2 -2
  461. package/ds-canonical/references/ui-dev-rules.md +1 -1
  462. package/ds-canonical/rules/README.md +14 -9
  463. package/ds-canonical/rules/meta-patterns.md +13 -13
  464. package/ds-canonical/rules/self-verify.md +12 -7
  465. package/ds-canonical/rules/spec-rules.md +1 -1
  466. package/ds-canonical/rules/ui-development.md +5 -5
  467. package/ds-canonical/skills/README.md +27 -15
  468. package/ds-canonical/skills/bug-fix-rhythm/SKILL.md +14 -7
  469. package/ds-canonical/skills/canonical-reviewer/SKILL.md +29 -0
  470. package/ds-canonical/skills/code-quality-audit/SKILL.md +11 -7
  471. package/ds-canonical/skills/codex-collab/SKILL.md +19 -238
  472. package/ds-canonical/skills/codex-collab/references/brief-template.md +37 -47
  473. package/ds-canonical/skills/codex-collab/references/transport.md +38 -57
  474. package/ds-canonical/skills/codify-corrections/SKILL.md +32 -31
  475. package/ds-canonical/skills/codify-principle/SKILL.md +33 -32
  476. package/ds-canonical/skills/component-quality-gate/SKILL.md +13 -13
  477. package/ds-canonical/skills/component-quality-gate/references/checklist.md +7 -7
  478. package/ds-canonical/skills/deep-audit-cross-codex/SKILL.md +28 -229
  479. package/ds-canonical/skills/deep-audit-cross-codex/references/phase-a-workflow.md +36 -131
  480. package/ds-canonical/skills/deep-audit-cross-codex/references/phase-b-codex-brief.md +33 -187
  481. package/ds-canonical/skills/deep-audit-cross-codex/references/skill-relationships-antipatterns-benchmarks.md +22 -24
  482. package/ds-canonical/skills/deep-audit-cross-codex/references/triage-rubric.md +15 -79
  483. package/ds-canonical/skills/deep-audit-cross-codex/references/upstream-directives-r-mapping.md +24 -23
  484. package/ds-canonical/skills/delivery-handoff/SKILL.md +14 -8
  485. package/ds-canonical/skills/design-system-audit/SKILL.md +63 -62
  486. package/ds-canonical/skills/design-system-audit/references/audit-prompts.md +86 -77
  487. package/ds-canonical/skills/design-system-audit/references/checkpoints.md +59 -50
  488. package/ds-canonical/skills/design-system-audit/references/historical-bugs.md +8 -8
  489. package/ds-canonical/skills/design-system-audit/references/principle-audit-protocol.md +37 -32
  490. package/ds-canonical/skills/design-system-audit/references/rule-placement.md +39 -38
  491. package/ds-canonical/skills/ensure-canonical/SKILL.md +36 -34
  492. package/ds-canonical/skills/governance-health/SKILL.md +26 -22
  493. package/ds-canonical/skills/governance-status/SKILL.md +30 -0
  494. package/ds-canonical/skills/independent-review/SKILL.md +37 -0
  495. package/ds-canonical/skills/independent-review/agents/openai.yaml +4 -0
  496. package/ds-canonical/skills/independent-review/references/evidence-contract.md +24 -0
  497. package/ds-canonical/skills/knowledge-prune/SKILL.md +45 -52
  498. package/ds-canonical/skills/knowledge-prune/references/phase-z-cross-repo-ssot-propagation.md +10 -7
  499. package/ds-canonical/skills/knowledge-prune/references/prune-dimensions-d5-d10.md +6 -6
  500. package/ds-canonical/skills/new-component/SKILL.md +18 -12
  501. package/ds-canonical/skills/new-component/references/new-component-checklist.md +7 -6
  502. package/ds-canonical/skills/performance-audit/SKILL.md +13 -10
  503. package/ds-canonical/skills/product-ui-audit/SKILL.md +27 -17
  504. package/ds-canonical/skills/product-ui-audit/references/audit-checks.md +7 -4
  505. package/ds-canonical/skills/product-ui-audit/references/report-template.md +30 -26
  506. package/ds-canonical/skills/propose-options/SKILL.md +1 -1
  507. package/ds-canonical/skills/prototype/SKILL.md +19 -21
  508. package/ds-canonical/skills/prototype/references/audit-checks.md +6 -5
  509. package/ds-canonical/skills/prototype/references/checkpoints.md +26 -17
  510. package/ds-canonical/skills/prototype/references/ooux-template.md +1 -1
  511. package/ds-canonical/skills/prototype/references/proposal-template.md +4 -4
  512. package/ds-canonical/skills/scan-similar-bugs/SKILL.md +22 -21
  513. package/ds-canonical/skills/story-auto-compile-migrate/SKILL.md +21 -20
  514. package/ds-canonical/skills/story-writing/SKILL.md +12 -12
  515. package/ds-canonical/skills/story-writing/references/anatomy-standard.md +1 -1
  516. package/ds-canonical/skills/story-writing/references/category-templates.md +5 -5
  517. package/ds-canonical/skills/ux-audit/SKILL.md +12 -9
  518. package/ds-canonical/skills/visual-audit/SKILL.md +41 -47
  519. package/ds-canonical/skills/visual-audit/references/audit-architecture.md +7 -7
  520. package/ds-canonical/skills/visual-audit/references/visual-checklist.md +12 -12
  521. package/ds-canonical/skills/visual-audit/references/world-class-benchmarks.md +3 -3
  522. package/ds-canonical/templates/_README.md +6 -7
  523. package/ds-canonical/templates/consumer-governance.md +78 -0
  524. package/ds-canonical/templates/dashboard-app.tsx +3 -1
  525. package/ds-canonical/templates/product-launchers/fork-governance-dispatcher.sh +154 -0
  526. package/ds-canonical/templates/product-launchers/format-provider-hook-output.mjs +25 -0
  527. package/ds-canonical/templates/product-launchers/independent-review.mjs +490 -0
  528. package/ds-canonical/templates/product-launchers/inject_fork_governance_preamble.sh +99 -0
  529. package/ds-canonical/templates/product-launchers/normalize-provider-event.mjs +355 -0
  530. package/ds-canonical/templates/product-launchers/product-hook-dispatch-runtime.mjs +1067 -0
  531. package/ds-canonical/templates/product-provider-wiring.json +80 -0
  532. package/ds-canonical/templates/product-provider-wiring.schema.json +151 -0
  533. package/llms-full.txt +6 -6
  534. package/llms.txt +2 -2
  535. package/package.json +15 -4
  536. package/src/components/Accordion/accordion.principles.stories.tsx +16 -26
  537. package/src/components/Accordion/accordion.stories.tsx +22 -40
  538. package/src/components/Calendar/calendar.spec.md +1 -1
  539. package/src/components/Calendar/calendar.tsx +59 -25
  540. package/src/components/DataTable/cell-registry.tsx +3 -7
  541. package/src/components/DataTable/data-table.spec.md +1 -0
  542. package/src/components/DataTable/data-table.tsx +9 -2
  543. package/src/components/DatePicker/date-picker.spec.md +1 -1
  544. package/src/components/DatePicker/date-picker.tsx +203 -147
  545. package/src/components/Dialog/dialog.spec.md +1 -1
  546. package/src/components/Dialog/dialog.tsx +8 -2
  547. package/src/components/Field/field-context.ts +25 -1
  548. package/src/components/Field/field-wrapper.tsx +7 -1
  549. package/src/components/Field/field.spec.md +7 -0
  550. package/src/components/Field/field.tsx +13 -2
  551. package/src/components/InlineEdit/inline-edit.spec.md +12 -0
  552. package/src/components/InlineEdit/inline-edit.stories.tsx +28 -17
  553. package/src/components/InlineEdit/inline-edit.tsx +94 -31
  554. package/src/components/Input/input.tsx +7 -2
  555. package/src/components/LinkInput/link-input.spec.md +1 -1
  556. package/src/components/LinkInput/link-input.tsx +5 -1
  557. package/src/components/Popover/popover.tsx +7 -2
  558. package/src/components/Select/select.principles.stories.tsx +4 -3
  559. package/src/components/Select/select.stories.tsx +7 -6
  560. package/src/components/Select/select.tsx +61 -29
  561. package/src/components/Textarea/textarea.spec.md +10 -1
  562. package/src/components/Textarea/textarea.tsx +38 -5
  563. package/src/components/TimePicker/time-picker.tsx +11 -5
  564. package/src/components/Tooltip/tooltip.spec.md +6 -0
  565. package/src/patterns/element-anatomy/item-anatomy.spec.md +8 -1
  566. package/src/patterns/element-anatomy/item-anatomy.tsx +111 -30
  567. package/src/patterns/element-anatomy/truncated-text.spec.md +13 -2
  568. package/src/tokens/uiSize/uiSize.css +11 -0
  569. package/src/tokens/uiSize/uiSize.spec.md +1 -0
  570. package/src/tokens/utility-registry.json +119 -4
  571. package/src/tokens/utility-registry.schema.json +373 -0
  572. package/tools/README.md +9 -0
  573. package/tools/codemods/cli.mjs +93 -0
  574. package/tools/codemods/index.mjs +582 -0
  575. package/tools/shared/safe-filesystem.mjs +371 -0
  576. package/tools/visual-baseline/cli.mjs +97 -0
  577. package/tools/visual-baseline/index.mjs +522 -0
  578. /package/dist/{react-day-picker.css → index.css} +0 -0
@@ -3,17 +3,17 @@
3
3
  #
4
4
  # Hook 規則(PreToolUse,Write|Edit|MultiEdit):
5
5
  # - File gate:tool_input.file_path 必 match `(sweep|audit-report)\.json$`,否則 silent。
6
- # - Content:tool_input.new_string // tool_input.content。空 → silent。
7
- # - Escape:content 含 `_sampling_allowed` → silent。
6
+ # - Content 必為 schema-valid report JSON;空/壞 JSON → integrity 70。
7
+ # - Escape:valid report 的 `_sampling_allowed` 非空 rationale → silent。
8
8
  # - Story count:`.storyResults // .results | length`,fallback `.storySummary.total // .summary.total // .total`。
9
- # - Manifest:$CLAUDE_PROJECT_DIR/packages/design-system/ds-story-manifest.json .totalStories。
10
- # manifest 不存在 / total=0 → silent。STORY_COUNT=0 → silent。
9
+ # - Manifest:$GOVERNANCE_PROJECT_DIR/packages/design-system/ds-story-manifest.json .totalStories。
10
+ # manifest 不存在 / malformed / total=0 → integrity 70。STORY_COUNT=0 → policy block 2。
11
11
  # - BLOCKER:STORY_COUNT < MANIFEST_TOTAL → exit 2 + stderr「FULL-STORY-SWEEP BLOCKER」。
12
12
  # - STORY_COUNT >= MANIFEST_TOTAL → silent(全跑通過)。
13
13
  #
14
14
  # Non-Write/Edit tool / 非 sweep|audit-report 檔名 → silent。
15
15
  #
16
- # Determinism:TMP_DIR + CLAUDE_PROJECT_DIR override(manifest fixture totalStories=916),
16
+ # Determinism:TMP_DIR + GOVERNANCE_PROJECT_DIR override(manifest fixture totalStories=916),
17
17
  # 不碰 repo 真 manifest / 不寫 repo logs。
18
18
 
19
19
  set -u
@@ -33,9 +33,9 @@ FAILED_TESTS=""
33
33
  TMP_DIR=$(mktemp -d)
34
34
  trap 'rm -rf "$TMP_DIR"' EXIT
35
35
 
36
- # Override CLAUDE_PROJECT_DIR so manifest lookup + _log-fire land in TMP_DIR
36
+ # Override GOVERNANCE_PROJECT_DIR so manifest lookup + _log-fire land in TMP_DIR
37
37
  # (不污染 repo packages/ 與 .claude/logs/)
38
- export CLAUDE_PROJECT_DIR="$TMP_DIR"
38
+ export GOVERNANCE_PROJECT_DIR="$TMP_DIR"
39
39
  mkdir -p "$TMP_DIR/.claude/logs"
40
40
  mkdir -p "$TMP_DIR/packages/design-system"
41
41
 
@@ -91,6 +91,17 @@ expect_block() {
91
91
  fi
92
92
  }
93
93
 
94
+ expect_integrity() {
95
+ local name="$1"; local needle="${2:-GOVERNANCE_INTEGRITY:}"
96
+ if [ "$EXIT" = "70" ] && echo "$STDERR_TEXT" | grep -qF "$needle"; then
97
+ echo " PASS $name"; PASS=$((PASS+1))
98
+ else
99
+ echo " FAIL $name (expected integrity exit=70 + '$needle', got exit=$EXIT)"
100
+ echo " --- stderr ---"; echo "$STDERR_TEXT" | sed 's/^/ /'; echo " --- end ---"
101
+ FAIL=$((FAIL+1)); FAILED_TESTS="${FAILED_TESTS}\n - $name"
102
+ fi
103
+ }
104
+
94
105
  # Build a sampled audit-report content (storyResults array of N entries)
95
106
  sampled_results() {
96
107
  local n="$1"
@@ -155,16 +166,15 @@ expect_pass_silent "11. [NEG] unrelated *.json → silent (file gate)"
155
166
  run_hook "/tmp/codex-sweep/audit-report.json" "$(sampled_results 1)" "Read"
156
167
  expect_pass_silent "12. [NEG] tool=Read → silent (event gate)"
157
168
 
158
- # 13. NEGATIVE: STORY_COUNT=0 (no parseable count) → silent
159
- # (hook explicitly exits 0 when count is 0 to avoid false positive on non-sweep payloads)
169
+ # 13. A schema-valid audit report with no coverage is a real policy violation.
160
170
  run_hook "/tmp/codex-sweep/audit-report.json" '{"meta":{"note":"warmup"}}'
161
- expect_pass_silent "13. [NEG] count=0 unparseable → silent"
171
+ expect_block "13. [POS] valid report with count=0 → BLOCK" "FULL-STORY-SWEEP BLOCKER"
162
172
 
163
- # 14. NEGATIVE: empty content → silent
173
+ # 14. Empty report content is invalid enforcement evidence.
164
174
  run_hook "/tmp/codex-sweep/audit-report.json" ""
165
- expect_pass_silent "14. [NEG] empty content → silent"
175
+ expect_integrity "14. empty report → integrity failure" "report is malformed or invalid"
166
176
 
167
- # 15. NEGATIVE: manifest missing → silent (graceful degrade)
177
+ # 15. Missing manifest means the hook cannot evaluate completeness.
168
178
  # Temporarily point at a project dir without a manifest.
169
179
  NOMANIFEST_DIR=$(mktemp -d)
170
180
  mkdir -p "$NOMANIFEST_DIR/.claude/logs"
@@ -172,12 +182,12 @@ payload=$(jq -n --arg fp "/tmp/codex-sweep/audit-report.json" --arg c "$(sampled
172
182
  '{hook_event_name:"PreToolUse", tool_name:"Write", tool_input:{file_path:$fp, content:$c}}')
173
183
  STDOUT=$(mktemp); STDERR=$(mktemp)
174
184
  set +e
175
- printf '%s' "$payload" | CLAUDE_PROJECT_DIR="$NOMANIFEST_DIR" bash "$HOOK" >"$STDOUT" 2>"$STDERR"
185
+ printf '%s' "$payload" | GOVERNANCE_PROJECT_DIR="$NOMANIFEST_DIR" bash "$HOOK" >"$STDOUT" 2>"$STDERR"
176
186
  EXIT=$?
177
187
  set -e
178
188
  STDERR_TEXT=$(cat "$STDERR")
179
189
  rm -f "$STDOUT" "$STDERR"
180
- expect_pass_silent "15. [NEG] manifest missing → silent (graceful degrade)"
190
+ expect_integrity "15. manifest missing → integrity failure" "manifest is unavailable or unsafe"
181
191
  rm -rf "$NOMANIFEST_DIR"
182
192
 
183
193
  echo ""
@@ -1,110 +1,220 @@
1
1
  #!/bin/bash
2
- # Tests for check_header_with_tabs_border.sh(header-canonical W1 BLOCKER)
3
- #
4
- # Hook 規則:PreToolUse Edit/Write/MultiEdit + file 為 `packages/design-system/src/**/*.tsx`(非 stories)→
5
- # 讀 disk content + tool_input.new_string/content 合 FULL_CONTENT;
6
- # 含 `<XxxHeader>` + `<Tabs|TabsList|TabsTrigger>` JSX 但 `withTabs` 出現 0 次 → exit 2 BLOCKER。
7
- # header > withTabs(但 ≥ 1)→ soft warn exit 0。
8
- # Allow:FULL_CONTENT 含 `@header-withtabs-allow:` → 整檔豁免。
9
- # Skip:stories.tsx / anatomy.stories.tsx / principles.stories.tsx。
2
+ # Proposed-state tests for header-canonical W1 withTabs enforcement.
10
3
 
11
4
  set -u
12
5
 
13
6
  SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
14
7
  HOOK="$SCRIPT_DIR/../lib/_header_with_tabs_border.sh"
15
-
16
- if [ ! -x "$HOOK" ]; then
17
- echo "FATAL: hook not executable: $HOOK"
18
- exit 1
19
- fi
20
-
21
8
  PASS=0
22
9
  FAIL=0
23
10
  FAILED_TESTS=""
24
11
 
25
12
  run_hook() {
26
- local file_path="$1"; local content="$2"
13
+ local file_path="$1" content="$2" tool="${3:-Write}" state_mode="${4:-valid}"
14
+ local repo_path="${file_path#*/repo/}"
15
+ local payload
16
+ case "$state_mode" in
17
+ valid)
18
+ payload=$(jq -n --arg fp "$file_path" --arg rp "$repo_path" --arg c "$content" --arg tool "$tool" \
19
+ '{tool_name:$tool,tool_input:{file_path:$fp,content:"raw-native-content-must-not-win",governance_write_state:{schemaVersion:1,path:$rp,kind:"text",content:$c}}}')
20
+ ;;
21
+ deleted)
22
+ payload=$(jq -n --arg fp "$file_path" --arg rp "$repo_path" --arg tool "$tool" \
23
+ '{tool_name:$tool,tool_input:{file_path:$fp,governance_write_state:{schemaVersion:1,path:$rp,kind:"deleted"}}}')
24
+ ;;
25
+ missing)
26
+ payload=$(jq -n --arg fp "$file_path" --arg tool "$tool" \
27
+ '{tool_name:$tool,tool_input:{file_path:$fp}}')
28
+ ;;
29
+ malformed)
30
+ payload=$(jq -n --arg fp "$file_path" --arg tool "$tool" \
31
+ '{tool_name:$tool,tool_input:{file_path:$fp,governance_write_state:{schemaVersion:"1",path:false,kind:"text",content:null}}}')
32
+ ;;
33
+ mismatch)
34
+ payload=$(jq -n --arg fp "$file_path" --arg c "$content" --arg tool "$tool" \
35
+ '{tool_name:$tool,tool_input:{file_path:$fp,governance_write_state:{schemaVersion:1,path:"packages/design-system/src/other.tsx",kind:"text",content:$c}}}')
36
+ ;;
37
+ esac
38
+
39
+ STDOUT_FILE=$(mktemp)
40
+ STDERR_FILE=$(mktemp)
41
+ set +e
42
+ printf '%s' "$payload" \
43
+ | GOVERNANCE_WRITE_STATE_TRUST=runner-v1 bash "$HOOK" >"$STDOUT_FILE" 2>"$STDERR_FILE"
44
+ EXIT=$?
45
+ set -e
46
+ STDOUT_TEXT=$(cat "$STDOUT_FILE")
47
+ STDERR_TEXT=$(cat "$STDERR_FILE")
48
+ rm -f "$STDOUT_FILE" "$STDERR_FILE"
49
+ }
50
+
51
+ run_without_trust() {
52
+ local file_path="$1"
27
53
  local payload
28
- payload=$(jq -n --arg fp "$file_path" --arg c "$content" \
29
- '{tool_name: "Write", tool_input: {file_path: $fp, content: $c}}')
30
- STDOUT=$(mktemp); STDERR=$(mktemp)
54
+ payload=$(jq -n --arg fp "$file_path" '{tool_name:"Edit",tool_input:{file_path:$fp}}')
55
+ STDOUT_FILE=$(mktemp)
56
+ STDERR_FILE=$(mktemp)
31
57
  set +e
32
- printf '%s' "$payload" | bash "$HOOK" >"$STDOUT" 2>"$STDERR"
58
+ printf '%s' "$payload" \
59
+ | env -u GOVERNANCE_WRITE_STATE_TRUST bash "$HOOK" >"$STDOUT_FILE" 2>"$STDERR_FILE"
33
60
  EXIT=$?
34
61
  set -e
35
- STDERR_TEXT=$(cat "$STDERR")
36
- rm -f "$STDOUT" "$STDERR"
62
+ STDOUT_TEXT=$(cat "$STDOUT_FILE")
63
+ STDERR_TEXT=$(cat "$STDERR_FILE")
64
+ rm -f "$STDOUT_FILE" "$STDERR_FILE"
37
65
  }
38
66
 
39
67
  expect_pass_silent() {
40
68
  local name="$1"
41
- if [ "$EXIT" = "0" ] && [ -z "$STDERR_TEXT" ]; then
42
- echo " PASS $name"; PASS=$((PASS+1))
69
+ if [ "$EXIT" -eq 0 ] && [ -z "$STDOUT_TEXT" ] && [ -z "$STDERR_TEXT" ]; then
70
+ PASS=$((PASS + 1)); echo " PASS $name"
43
71
  else
44
- echo " FAIL $name (expected silent, exit=$EXIT)"
45
- echo " --- stderr ---"; echo "$STDERR_TEXT" | sed 's/^/ /'; echo " --- end ---"
46
- FAIL=$((FAIL+1)); FAILED_TESTS="${FAILED_TESTS}\n - $name"
72
+ FAIL=$((FAIL + 1)); FAILED_TESTS="${FAILED_TESTS}\n - $name"
73
+ echo " FAIL $name (exit=$EXIT stdout=${#STDOUT_TEXT} stderr=${#STDERR_TEXT})"
74
+ printf '%s\n' "$STDERR_TEXT" | sed 's/^/ /'
47
75
  fi
48
76
  }
49
77
 
50
- expect_blocker() {
51
- local name="$1"; local needle="$2"
52
- if [ "$EXIT" = "2" ] && echo "$STDERR_TEXT" | grep -qF "$needle"; then
53
- echo " PASS $name"; PASS=$((PASS+1))
78
+ expect_block() {
79
+ local name="$1" needle="$2"
80
+ if [ "$EXIT" -eq 2 ] && [ -z "$STDOUT_TEXT" ] && [ -n "$STDERR_TEXT" ] \
81
+ && printf '%s' "$STDERR_TEXT" | grep -qF "$needle" \
82
+ && ! printf '%s' "$STDERR_TEXT" | grep -Eq 'command not found|No such file or directory'; then
83
+ PASS=$((PASS + 1)); echo " PASS $name"
54
84
  else
55
- echo " FAIL $name (expected exit 2 + '$needle', got exit $EXIT)"
56
- echo " --- stderr ---"; echo "$STDERR_TEXT" | sed 's/^/ /'; echo " --- end ---"
57
- FAIL=$((FAIL+1)); FAILED_TESTS="${FAILED_TESTS}\n - $name"
85
+ FAIL=$((FAIL + 1)); FAILED_TESTS="${FAILED_TESTS}\n - $name"
86
+ echo " FAIL $name (expected stderr-only rc2 + '$needle'; got rc=$EXIT)"
87
+ printf '%s\n' "$STDERR_TEXT" | sed 's/^/ /'
58
88
  fi
59
89
  }
60
90
 
61
- expect_warn_silent_exit0() {
62
- # exit 0 but stderr contains needle (soft warn)
63
- local name="$1"; local needle="$2"
64
- if [ "$EXIT" = "0" ] && echo "$STDERR_TEXT" | grep -qF "$needle"; then
65
- echo " PASS $name"; PASS=$((PASS+1))
91
+ expect_integrity() {
92
+ local name="$1" needle="$2"
93
+ if [ "$EXIT" -eq 70 ] && [ -z "$STDOUT_TEXT" ] && [ -n "$STDERR_TEXT" ] \
94
+ && printf '%s' "$STDERR_TEXT" | grep -qF "$needle"; then
95
+ PASS=$((PASS + 1)); echo " PASS $name"
66
96
  else
67
- echo " FAIL $name (expected exit 0 + warn '$needle', got exit $EXIT)"
68
- echo " --- stderr ---"; echo "$STDERR_TEXT" | sed 's/^/ /'; echo " --- end ---"
69
- FAIL=$((FAIL+1)); FAILED_TESTS="${FAILED_TESTS}\n - $name"
97
+ FAIL=$((FAIL + 1)); FAILED_TESTS="${FAILED_TESTS}\n - $name"
98
+ echo " FAIL $name (expected stderr-only rc70 + '$needle'; got rc=$EXIT)"
99
+ printf '%s\n' "$STDERR_TEXT" | sed 's/^/ /'
70
100
  fi
71
101
  }
72
102
 
73
- echo "=== check_header_with_tabs_border tests ==="
103
+ echo "=== check_header_with_tabs_border proposed-state tests ==="
104
+
105
+ IN_SCOPE="/repo/packages/design-system/src/components/Foo/foo.tsx"
106
+
107
+ run_hook "/repo/src/foo.tsx" '<ChromeHeader><Tabs /></ChromeHeader>' Write missing
108
+ expect_pass_silent "1. out-of-scope path skips"
109
+
110
+ run_hook "/repo/packages/design-system/src/components/Foo/foo.stories.tsx" '<ChromeHeader><Tabs /></ChromeHeader>' Write missing
111
+ expect_pass_silent "2. story path skips"
112
+
113
+ run_hook "$IN_SCOPE" '<button />'
114
+ expect_pass_silent "3. proposed content without header skips"
115
+
116
+ run_hook "$IN_SCOPE" '<ChromeHeader />' Edit
117
+ expect_pass_silent "4. proposed Edit header without Tabs skips"
118
+
119
+ run_hook "$IN_SCOPE" '<ChromeHeader withTabs><TabsList /></ChromeHeader>' MultiEdit
120
+ expect_pass_silent "5. proposed MultiEdit compliant header+Tabs is silent"
121
+
122
+ run_hook "$IN_SCOPE" '<ChromeHeader><TabsList /></ChromeHeader>' Edit
123
+ expect_block "6. proposed Edit missing withTabs blocks" "HEADER + TABS WITHTABS BLOCKER"
124
+
125
+ run_hook "$IN_SCOPE" '// @header-withtabs-allow: special case
126
+ <ChromeHeader><TabsList /></ChromeHeader>'
127
+ expect_pass_silent "7. proposed escape marker is silent"
128
+
129
+ run_hook "$IN_SCOPE" '
130
+ <>
131
+ <ChromeHeader withTabs><TabsList /></ChromeHeader>
132
+ <SurfaceHeader><TabsList /></SurfaceHeader>
133
+ </>'
134
+ expect_block "8. compliant instance cannot hide a violating header instance" "1 個未宣告 true withTabs"
135
+
136
+ run_hook "$IN_SCOPE" '' Write deleted
137
+ expect_pass_silent "9. trusted deletion has no post-write violation"
138
+
139
+ run_hook "$IN_SCOPE" '<ChromeHeader withTabs><Tabs /></ChromeHeader>' Edit missing
140
+ expect_integrity "10. runner marker without state is integrity failure" "trusted proposed write state 缺失或 malformed"
141
+
142
+ run_hook "$IN_SCOPE" '<ChromeHeader withTabs><Tabs /></ChromeHeader>' Edit malformed
143
+ expect_integrity "11. malformed state is integrity failure" "trusted proposed write state 缺失或 malformed"
144
+
145
+ run_hook "$IN_SCOPE" '<ChromeHeader withTabs><Tabs /></ChromeHeader>' Edit mismatch
146
+ expect_integrity "12. state path mismatch is integrity failure" "與 hook target 不相符"
147
+
148
+ run_without_trust "$IN_SCOPE"
149
+ expect_integrity "13. governed mutation without runner trust is integrity failure" "缺少 runner-v1 proposed state"
150
+
151
+ run_hook "$IN_SCOPE" '
152
+ const withTabs = false
153
+ export const Example = () => <ChromeHeader><TabsList /></ChromeHeader>'
154
+ expect_block "14. variable-name withTabs decoy cannot bypass" "HEADER + TABS WITHTABS BLOCKER"
155
+
156
+ run_hook "$IN_SCOPE" '
157
+ // withTabs =
158
+ export const Example = () => <ChromeHeader><TabsList /></ChromeHeader>'
159
+ expect_block "15. comment withTabs decoy cannot bypass" "HEADER + TABS WITHTABS BLOCKER"
160
+
161
+ run_hook "$IN_SCOPE" '<ChromeHeader withTabs={false}><TabsList /></ChromeHeader>'
162
+ expect_block "16. explicit withTabs false blocks" "HEADER + TABS WITHTABS BLOCKER"
163
+
164
+ run_hook "$IN_SCOPE" '<ChromeHeader withTabs={true}><TabsList /></ChromeHeader>'
165
+ expect_pass_silent "17. explicit withTabs true is compliant"
166
+
167
+ run_hook "$IN_SCOPE" '
168
+ <>
169
+ <ChromeHeader />
170
+ <TabsList />
171
+ </>'
172
+ expect_pass_silent "18. unrelated sibling Header/Tabs ambiguity stays silent"
173
+
174
+ run_hook "$IN_SCOPE" '<ChromeHeader><TabsList />' Edit
175
+ expect_integrity "19. malformed proposed TSX is integrity failure" "parser unavailable or proposed content malformed"
176
+
177
+ run_hook "$IN_SCOPE" '// @header-withtabs-allow:
178
+ <ChromeHeader><TabsList /></ChromeHeader>'
179
+ expect_block "20. empty escape rationale cannot bypass" "HEADER + TABS WITHTABS BLOCKER"
180
+
181
+ run_hook "$IN_SCOPE" 'const ready = true
182
+ // @header-withtabs-allow: too late
183
+ export const Example = () => <ChromeHeader><TabsList /></ChromeHeader>'
184
+ expect_block "21. non-leading escape cannot bypass" "HEADER + TABS WITHTABS BLOCKER"
74
185
 
75
- # 1. Out-of-scope path (random tsx) → skip
76
- run_hook "/repo/src/foo.tsx" '<ChromeHeader/><Tabs/>'
77
- expect_pass_silent "1. out-of-scope path → skip"
186
+ run_hook "$IN_SCOPE" 'const decoy = `// @header-withtabs-allow: template decoy`
187
+ export const Example = () => <ChromeHeader><TabsList /></ChromeHeader>'
188
+ expect_block "22. template escape decoy cannot bypass" "HEADER + TABS WITHTABS BLOCKER"
78
189
 
79
- # 2. Story file → skip
80
- run_hook "/repo/packages/design-system/src/components/Foo/foo.stories.tsx" '<ChromeHeader/><Tabs/>'
81
- expect_pass_silent "2. .stories.tsx → skip"
190
+ run_hook "$IN_SCOPE" '/* // @header-withtabs-allow: block decoy */
191
+ export const Example = () => <ChromeHeader><TabsList /></ChromeHeader>'
192
+ expect_block "23. block-comment escape decoy cannot bypass" "HEADER + TABS WITHTABS BLOCKER"
82
193
 
83
- # 3. In-scope but no header → skip
84
- run_hook "/repo/packages/design-system/src/components/Foo/foo.tsx" '<button/>'
85
- expect_pass_silent "3. no header JSX → skip"
194
+ run_hook "$IN_SCOPE" '<Header><TabsList /></Header>'
195
+ expect_block "24. bare Header is governed" "HEADER + TABS WITHTABS BLOCKER"
86
196
 
87
- # 4. In-scope header but no Tabs → skip
88
- run_hook "/repo/packages/design-system/src/components/Foo/foo.tsx" '<ChromeHeader/>'
89
- expect_pass_silent "4. header but no Tabs → skip"
197
+ run_hook "$IN_SCOPE" '<UI.Header><UI.TabsList /></UI.Header>'
198
+ expect_block "25. namespaced UI.Header is governed" "HEADER + TABS WITHTABS BLOCKER"
90
199
 
91
- # 5. In-scope header + Tabs + withTabs prop → silent
92
- run_hook "/repo/packages/design-system/src/components/Foo/foo.tsx" '<ChromeHeader withTabs><TabsList ></TabsList></ChromeHeader>'
93
- expect_pass_silent "5. header + Tabs + withTabs → silent"
200
+ run_hook "$IN_SCOPE" '
201
+ <SurfaceHeader>
202
+ <Header withTabs><TabsList /></Header>
203
+ </SurfaceHeader>'
204
+ expect_pass_silent "26. outer Header does not consume nested Header Tabs"
94
205
 
95
- # 6. In-scope header + Tabs WITHOUT withTabs → BLOCKER exit 2
96
- run_hook "/repo/packages/design-system/src/components/Foo/foo.tsx" '<ChromeHeader><TabsList ></TabsList></ChromeHeader>'
97
- expect_blocker "6. header + Tabs missing withTabs → BLOCKER" "HEADER + TABS WITHTABS BLOCKER"
206
+ run_hook "$IN_SCOPE" '
207
+ <SurfaceHeader withTabs>
208
+ <Header><TabsList /></Header>
209
+ </SurfaceHeader>'
210
+ expect_block "27. nested Header is independently enforced" "HEADER + TABS WITHTABS BLOCKER"
98
211
 
99
- # 7. With allow escape → silent
100
- run_hook "/repo/packages/design-system/src/components/Foo/foo.tsx" '// @header-withtabs-allow: special case
101
- <ChromeHeader><TabsList ></TabsList></ChromeHeader>'
102
- expect_pass_silent "7. @header-withtabs-allow → silent"
212
+ run_hook "$IN_SCOPE" '<ChromeHeader withTabs withTabs={false}><TabsList /></ChromeHeader>'
213
+ expect_block "28. duplicate conflicting withTabs props cannot bypass" "HEADER + TABS WITHTABS BLOCKER"
103
214
 
104
- echo ""
105
- echo "=== Summary ==="
215
+ echo
106
216
  echo "Passed: $PASS / $((PASS + FAIL))"
107
217
  if [ "$FAIL" -gt 0 ]; then
108
- echo "Failed:$FAILED_TESTS"
218
+ printf 'Failed:%b\n' "$FAILED_TESTS"
109
219
  exit 1
110
220
  fi
@@ -11,32 +11,32 @@ run() {
11
11
  local fp="$1"; local content="$2"
12
12
  local payload=$(jq -n --arg fp "$fp" --arg c "$content" \
13
13
  '{hook_event_name:"PreToolUse",tool_name:"Write",tool_input:{file_path:$fp,content:$c}}')
14
- STDERR=$(mktemp)
15
- printf '%s' "$payload" | bash "$HOOK" 2>"$STDERR" >/dev/null
16
- STDERR_TEXT=$(cat "$STDERR"); rm -f "$STDERR"
14
+ STDOUT=$(mktemp); STDERR=$(mktemp)
15
+ printf '%s' "$payload" | bash "$HOOK" >"$STDOUT" 2>"$STDERR"
16
+ STDOUT_TEXT=$(cat "$STDOUT"); STDERR_TEXT=$(cat "$STDERR"); rm -f "$STDOUT" "$STDERR"
17
17
  }
18
18
 
19
19
  # Test 1:2+ FileItem 無 gap → warn
20
20
  echo "Test 1: 2+ FileItem no gap → warn"
21
21
  CONTENT='<div><FileItem /><FileItem /><FileItem /></div>'
22
22
  run "/path/foo.tsx" "$CONTENT"
23
- if echo "$STDERR_TEXT" | grep -q "M16 Item-list gap"; then echo " PASS"; PASS=$((PASS+1)); else echo " FAIL: no warn"; FAIL=$((FAIL+1)); fi
23
+ if [ -z "$STDERR_TEXT" ] && echo "$STDOUT_TEXT" | jq -e '.governanceContext.hookEventName == "PreToolUse" and (.governanceContext.message | contains("M16 Item-list gap"))' >/dev/null; then echo " PASS"; PASS=$((PASS+1)); else echo " FAIL: no model-visible context"; FAIL=$((FAIL+1)); fi
24
24
 
25
25
  # Test 2:有 gap-2 parent → silent
26
26
  echo "Test 2: with gap-2 parent → silent"
27
27
  CONTENT='<div className="flex gap-2"><FileItem /><FileItem /></div>'
28
28
  run "/path/foo.tsx" "$CONTENT"
29
- if [ -z "$STDERR_TEXT" ]; then echo " PASS"; PASS=$((PASS+1)); else echo " FAIL"; FAIL=$((FAIL+1)); fi
29
+ if [ -z "$STDERR_TEXT" ] && [ -z "$STDOUT_TEXT" ]; then echo " PASS"; PASS=$((PASS+1)); else echo " FAIL"; FAIL=$((FAIL+1)); fi
30
30
 
31
31
  # Test 3:single FileItem → silent
32
32
  echo "Test 3: single FileItem → silent"
33
33
  run "/path/foo.tsx" '<FileItem />'
34
- if [ -z "$STDERR_TEXT" ]; then echo " PASS"; PASS=$((PASS+1)); else echo " FAIL"; FAIL=$((FAIL+1)); fi
34
+ if [ -z "$STDERR_TEXT" ] && [ -z "$STDOUT_TEXT" ]; then echo " PASS"; PASS=$((PASS+1)); else echo " FAIL"; FAIL=$((FAIL+1)); fi
35
35
 
36
36
  # Test 4:stories.tsx skip
37
37
  echo "Test 4: stories.tsx skip"
38
38
  run "/path/foo.stories.tsx" '<FileItem /><FileItem />'
39
- if [ -z "$STDERR_TEXT" ]; then echo " PASS"; PASS=$((PASS+1)); else echo " FAIL"; FAIL=$((FAIL+1)); fi
39
+ if [ -z "$STDERR_TEXT" ] && [ -z "$STDOUT_TEXT" ]; then echo " PASS"; PASS=$((PASS+1)); else echo " FAIL"; FAIL=$((FAIL+1)); fi
40
40
 
41
41
  echo ""
42
42
  echo "════ Results: $PASS PASS, $FAIL FAIL ════"
@@ -33,9 +33,9 @@ FAILED_TESTS=""
33
33
  TMP_DIR=$(mktemp -d)
34
34
  trap 'rm -rf "$TMP_DIR"' EXIT
35
35
 
36
- # Override CLAUDE_PROJECT_DIR so _log-fire.sh per-hook log lands in TMP_DIR
36
+ # Override GOVERNANCE_PROJECT_DIR so _log-fire.sh per-hook log lands in TMP_DIR
37
37
  # (避免污染 repo .claude/logs/)
38
- export CLAUDE_PROJECT_DIR="$TMP_DIR"
38
+ export GOVERNANCE_PROJECT_DIR="$TMP_DIR"
39
39
  mkdir -p "$TMP_DIR/.claude/logs"
40
40
 
41
41
  # run_hook <tool> <file_path> <content_field> <content>
@@ -1,147 +1,82 @@
1
1
  #!/bin/bash
2
- # Tests for check_main_branch_workbench.sh(M28 main-as-workbench BLOCKER)
3
- #
4
- # Hook 規則:PreToolUse Edit/Write/MultiEdit + 目標 file 為 production code
5
- # (`packages/design-system/src/**/*.{tsx,ts,css}` OR `src/app/**` OR `src/explorations/**`)
6
- # + current git branch == main/master + transcript 近 5 user msg 無 branch trigger keyword
7
- # → exit 2 BLOCKER。
8
- # Allow:`CLAUDE_BYPASS_MAIN_WORKBENCH=1` / branch != main / out-of-scope path /
9
- # trigger keyword(開 branch / 開 分支 / 新 branch / working branch / 在 branch 上做 / on branch)。
10
- #
11
- # 測試手法:`CLAUDE_PROJECT_DIR` 指向 fixture git repo(可控 current branch)。
2
+ # Tests for the protected-main editing feedback gate(M28).
12
3
 
13
4
  set -u
14
-
15
5
  SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
16
6
  HOOK="$SCRIPT_DIR/../check_main_branch_workbench.sh"
17
-
18
- if [ ! -x "$HOOK" ]; then
19
- echo "FATAL: hook not executable: $HOOK"
20
- exit 1
21
- fi
7
+ [ -x "$HOOK" ] || { echo "FATAL: hook not executable: $HOOK"; exit 1; }
22
8
 
23
9
  TMP_ROOT=$(mktemp -d)
24
10
  trap 'rm -rf "$TMP_ROOT"' EXIT
25
-
26
- # Build fake git repos:one on main, one on feature branch
27
11
  REPO_MAIN="$TMP_ROOT/repo-main"
28
- REPO_FEAT="$TMP_ROOT/repo-feat"
12
+ REPO_FEAT="$TMP_ROOT/repo-feature"
29
13
 
30
14
  setup_repo() {
31
- local dir="$1"; local branch="$2"
15
+ local dir="$1" branch="$2"
32
16
  mkdir -p "$dir"
33
- (
34
- cd "$dir"
35
- git init -q -b main 2>/dev/null || { git init -q && git checkout -q -b main; }
36
- git config user.email test@example.com
37
- git config user.name test
38
- echo seed > seed.txt
39
- git add seed.txt
40
- git commit -q -m "seed"
41
- if [ "$branch" != "main" ]; then
42
- git checkout -q -b "$branch"
43
- fi
44
- )
17
+ git -C "$dir" init -q -b main 2>/dev/null || { git -C "$dir" init -q; git -C "$dir" checkout -q -b main; }
18
+ git -C "$dir" config user.email test@example.invalid
19
+ git -C "$dir" config user.name test
20
+ printf 'seed\n' > "$dir/seed.txt"
21
+ git -C "$dir" add seed.txt
22
+ git -C "$dir" commit -qm seed
23
+ [ "$branch" = main ] || git -C "$dir" checkout -q -b "$branch"
45
24
  }
46
-
47
- setup_repo "$REPO_MAIN" "main"
48
- setup_repo "$REPO_FEAT" "feature-x"
25
+ setup_repo "$REPO_MAIN" main
26
+ setup_repo "$REPO_FEAT" codex/feature
49
27
 
50
28
  PASS=0
51
29
  FAIL=0
52
- FAILED_TESTS=""
53
30
 
54
31
  run_hook() {
55
- local file_path="$1"; local project_dir="$2"; local transcript="${3:-}"
56
- local payload
57
- payload=$(jq -n --arg fp "$file_path" \
58
- '{tool_name: "Edit", tool_input: {file_path: $fp, new_string: "x"}}')
59
- STDOUT=$(mktemp); STDERR=$(mktemp)
32
+ local file_path="$1" project_dir="$2" tool="${3:-Edit}"
33
+ local payload stdout_file stderr_file
34
+ payload=$(jq -n --arg fp "$file_path" --arg tool "$tool" '{tool_name:$tool,tool_input:{file_path:$fp}}')
35
+ stdout_file=$(mktemp); stderr_file=$(mktemp)
60
36
  set +e
61
- CLAUDE_PROJECT_DIR="$project_dir" CLAUDE_TRANSCRIPT_PATH="$transcript" \
62
- printf '%s' "$payload" | CLAUDE_PROJECT_DIR="$project_dir" CLAUDE_TRANSCRIPT_PATH="$transcript" \
63
- bash "$HOOK" >"$STDOUT" 2>"$STDERR"
37
+ printf '%s' "$payload" | GOVERNANCE_PROJECT_DIR="$project_dir" bash "$HOOK" >"$stdout_file" 2>"$stderr_file"
64
38
  EXIT=$?
65
39
  set -e
66
- STDERR_TEXT=$(cat "$STDERR")
67
- rm -f "$STDOUT" "$STDERR"
40
+ STDERR_TEXT=$(cat "$stderr_file")
41
+ rm -f "$stdout_file" "$stderr_file"
68
42
  }
69
43
 
70
- expect_pass_silent() {
44
+ expect_pass() {
71
45
  local name="$1"
72
- if [ "$EXIT" = "0" ] && [ -z "$STDERR_TEXT" ]; then
73
- echo " PASS $name"; PASS=$((PASS+1))
74
- else
75
- echo " FAIL $name (expected silent, exit=$EXIT)"
76
- echo " --- stderr ---"; echo "$STDERR_TEXT" | sed 's/^/ /'; echo " --- end ---"
77
- FAIL=$((FAIL+1)); FAILED_TESTS="${FAILED_TESTS}\n - $name"
78
- fi
46
+ if [ "$EXIT" = 0 ] && [ -z "$STDERR_TEXT" ]; then echo " PASS $name"; PASS=$((PASS+1));
47
+ else echo " FAIL $name(exit=$EXIT)"; FAIL=$((FAIL+1)); fi
79
48
  }
80
-
81
- expect_blocker() {
82
- local name="$1"; local needle="$2"
83
- if [ "$EXIT" = "2" ] && echo "$STDERR_TEXT" | grep -qF "$needle"; then
84
- echo " PASS $name"; PASS=$((PASS+1))
85
- else
86
- echo " FAIL $name (expected exit 2 + '$needle', got exit $EXIT)"
87
- echo " --- stderr ---"; echo "$STDERR_TEXT" | sed 's/^/ /'; echo " --- end ---"
88
- FAIL=$((FAIL+1)); FAILED_TESTS="${FAILED_TESTS}\n - $name"
89
- fi
49
+ expect_block() {
50
+ local name="$1"
51
+ if [ "$EXIT" = 2 ] && echo "$STDERR_TEXT" | grep -qF 'PROTECTED-MAIN WORKBENCH BLOCKER'; then echo " PASS $name"; PASS=$((PASS+1));
52
+ else echo " FAIL $name(exit=$EXIT)"; echo "$STDERR_TEXT"; FAIL=$((FAIL+1)); fi
90
53
  }
91
54
 
92
- echo "=== check_main_branch_workbench tests ==="
55
+ echo "=== check_main_branch_workbench protected-main tests ==="
56
+ run_hook "$REPO_MAIN/README.md" "$REPO_MAIN" Read
57
+ expect_pass "1. read tool skips"
93
58
 
94
- # 1. Non Edit/Write tool → skip (use payload with different tool)
95
- payload=$(jq -n '{tool_name: "Read", tool_input: {file_path: "/repo/packages/design-system/src/foo.tsx"}}')
96
- STDOUT=$(mktemp); STDERR=$(mktemp)
97
- set +e
98
- CLAUDE_PROJECT_DIR="$REPO_MAIN" printf '%s' "$payload" | CLAUDE_PROJECT_DIR="$REPO_MAIN" bash "$HOOK" >"$STDOUT" 2>"$STDERR"
99
- EXIT=$?
100
- set -e
101
- STDERR_TEXT=$(cat "$STDERR")
102
- rm -f "$STDOUT" "$STDERR"
103
- expect_pass_silent "1. non Edit/Write tool → skip"
59
+ run_hook "$REPO_FEAT/README.md" "$REPO_FEAT"
60
+ expect_pass "2. edits on the task branch pass"
104
61
 
105
- # 2. Out-of-scope path (random file) → skip
106
- run_hook "/repo/.claude/foo.md" "$REPO_MAIN"
107
- expect_pass_silent "2. out-of-scope path (.claude/) → skip"
62
+ run_hook "$REPO_MAIN/packages/design-system/src/Foo.tsx" "$REPO_MAIN"
63
+ expect_block "3. production edit on main blocks"
108
64
 
109
- # 3. Production code path + branch=feature-x → skip
110
- run_hook "/repo/packages/design-system/src/components/Foo/foo.tsx" "$REPO_FEAT"
111
- expect_pass_silent "3. on feature branch → skip"
65
+ run_hook "$REPO_MAIN/.claude/rules/meta-patterns.md" "$REPO_MAIN"
66
+ expect_block "4. governance/doc edit on main also blocks"
112
67
 
113
- # 4. Production code path + branch=main + no trigger transcript → BLOCKER
114
- run_hook "/repo/packages/design-system/src/components/Foo/foo.tsx" "$REPO_MAIN"
115
- expect_blocker "4. main + production code + no trigger → BLOCKER" "MAIN-AS-WORKBENCH BLOCKER"
68
+ run_hook "$TMP_ROOT/outside.txt" "$REPO_MAIN"
69
+ expect_pass "5. file outside checkout skips"
116
70
 
117
- # 5. CLAUDE_BYPASS_MAIN_WORKBENCH=1 escape → skip
118
- payload=$(jq -n '{tool_name: "Edit", tool_input: {file_path: "/repo/packages/design-system/src/components/Foo/foo.tsx", new_string: "x"}}')
119
- STDOUT=$(mktemp); STDERR=$(mktemp)
71
+ payload=$(jq -n --arg fp "$REPO_MAIN/README.md" '{tool_name:"Edit",tool_input:{file_path:$fp}}')
72
+ stdout_file=$(mktemp); stderr_file=$(mktemp)
120
73
  set +e
121
- printf '%s' "$payload" | CLAUDE_PROJECT_DIR="$REPO_MAIN" CLAUDE_BYPASS_MAIN_WORKBENCH=1 bash "$HOOK" >"$STDOUT" 2>"$STDERR"
74
+ printf '%s' "$payload" | GOVERNANCE_PROJECT_DIR="$REPO_MAIN" GOVERNANCE_BYPASS_MAIN_WORKBENCH=1 bash "$HOOK" >"$stdout_file" 2>"$stderr_file"
122
75
  EXIT=$?
123
76
  set -e
124
- STDERR_TEXT=$(cat "$STDERR")
125
- rm -f "$STDOUT" "$STDERR"
126
- expect_pass_silent "5. CLAUDE_BYPASS_MAIN_WORKBENCH=1 → skip"
127
-
128
- # 6. Transcript with branch trigger keyword → skip
129
- TRANSCRIPT="$TMP_ROOT/transcript.jsonl"
130
- cat >"$TRANSCRIPT" <<'EOF'
131
- {"role":"user","content":"我們開 working branch 來做這個 batch"}
132
- {"role":"assistant","content":"OK"}
133
- EOF
134
- run_hook "/repo/packages/design-system/src/components/Foo/foo.tsx" "$REPO_MAIN" "$TRANSCRIPT"
135
- expect_pass_silent "6. transcript has 'working branch' trigger → skip"
136
-
137
- # 7. src/app/** also intercepted on main → BLOCKER
138
- run_hook "/repo/src/app/page.tsx" "$REPO_MAIN"
139
- expect_blocker "7. src/app/ on main → BLOCKER" "MAIN-AS-WORKBENCH BLOCKER"
77
+ STDERR_TEXT=$(cat "$stderr_file")
78
+ rm -f "$stdout_file" "$stderr_file"
79
+ expect_pass "6. local recovery override passes"
140
80
 
141
- echo ""
142
- echo "=== Summary ==="
143
81
  echo "Passed: $PASS / $((PASS + FAIL))"
144
- if [ "$FAIL" -gt 0 ]; then
145
- echo "Failed:$FAILED_TESTS"
146
- exit 1
147
- fi
82
+ [ "$FAIL" -eq 0 ]