@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.
- package/AGENTS.md +6 -208
- package/CLAUDE.md +2 -23
- package/dist/components/Calendar/calendar.d.ts.map +1 -1
- package/dist/components/Calendar/calendar.js +47 -23
- package/dist/components/Calendar/calendar.js.map +1 -1
- package/dist/components/DataTable/cell-registry.d.ts.map +1 -1
- package/dist/components/DataTable/cell-registry.js +1 -5
- package/dist/components/DataTable/cell-registry.js.map +1 -1
- package/dist/components/DataTable/data-table-filter-value-picker.js +4 -0
- package/dist/components/DataTable/data-table-filter-value-picker.js.map +1 -1
- package/dist/components/DataTable/data-table.d.ts.map +1 -1
- package/dist/components/DataTable/data-table.js +3 -2
- package/dist/components/DataTable/data-table.js.map +1 -1
- package/dist/components/DataTable/filter-tree.js +6 -0
- package/dist/components/DataTable/filter-tree.js.map +1 -1
- package/dist/components/DatePicker/date-picker.d.ts.map +1 -1
- package/dist/components/DatePicker/date-picker.js +183 -156
- package/dist/components/DatePicker/date-picker.js.map +1 -1
- package/dist/components/Dialog/dialog.d.ts.map +1 -1
- package/dist/components/Dialog/dialog.js +4 -2
- package/dist/components/Dialog/dialog.js.map +1 -1
- package/dist/components/Field/field-context.d.ts +12 -0
- package/dist/components/Field/field-context.d.ts.map +1 -1
- package/dist/components/Field/field-context.js +10 -1
- package/dist/components/Field/field-context.js.map +1 -1
- package/dist/components/Field/field-wrapper.d.ts.map +1 -1
- package/dist/components/Field/field-wrapper.js +7 -1
- package/dist/components/Field/field-wrapper.js.map +1 -1
- package/dist/components/Field/field.d.ts.map +1 -1
- package/dist/components/Field/field.js +11 -2
- package/dist/components/Field/field.js.map +1 -1
- package/dist/components/InlineEdit/inline-edit.d.ts +5 -0
- package/dist/components/InlineEdit/inline-edit.d.ts.map +1 -1
- package/dist/components/InlineEdit/inline-edit.js +65 -33
- package/dist/components/InlineEdit/inline-edit.js.map +1 -1
- package/dist/components/Input/input.d.ts.map +1 -1
- package/dist/components/Input/input.js +3 -2
- package/dist/components/Input/input.js.map +1 -1
- package/dist/components/LinkInput/link-input.d.ts.map +1 -1
- package/dist/components/LinkInput/link-input.js +2 -1
- package/dist/components/LinkInput/link-input.js.map +1 -1
- package/dist/components/Popover/popover.d.ts.map +1 -1
- package/dist/components/Popover/popover.js +4 -2
- package/dist/components/Popover/popover.js.map +1 -1
- package/dist/components/Select/select.d.ts.map +1 -1
- package/dist/components/Select/select.js +59 -37
- package/dist/components/Select/select.js.map +1 -1
- package/dist/components/Textarea/textarea.d.ts +11 -0
- package/dist/components/Textarea/textarea.d.ts.map +1 -1
- package/dist/components/Textarea/textarea.js +22 -5
- package/dist/components/Textarea/textarea.js.map +1 -1
- package/dist/components/TimePicker/time-picker.d.ts.map +1 -1
- package/dist/components/TimePicker/time-picker.js +4 -3
- package/dist/components/TimePicker/time-picker.js.map +1 -1
- package/dist/patterns/element-anatomy/item-anatomy.d.ts +9 -0
- package/dist/patterns/element-anatomy/item-anatomy.d.ts.map +1 -1
- package/dist/patterns/element-anatomy/item-anatomy.js +71 -27
- package/dist/patterns/element-anatomy/item-anatomy.js.map +1 -1
- package/ds-canonical/adapters/claude/agents/README.md +58 -0
- package/ds-canonical/adapters/claude/agents/canonical-reviewer.md +14 -0
- package/ds-canonical/adapters/claude-root-instructions.md +24 -0
- package/ds-canonical/adapters/claude-settings-base.json +172 -0
- package/ds-canonical/commands/README.md +8 -13
- package/ds-canonical/commands/gov-status.md +5 -75
- package/ds-canonical/fork/AGENTS.md +116 -213
- package/ds-canonical/fork/CLAUDE.md +54 -0
- package/ds-canonical/fork/codex/agents/skills/bug-fix-rhythm/SKILL.md +207 -0
- package/ds-canonical/fork/codex/agents/skills/code-quality-audit/SKILL.md +71 -0
- package/ds-canonical/fork/codex/agents/skills/delivery-handoff/SKILL.md +244 -0
- package/ds-canonical/fork/codex/agents/skills/delivery-handoff/references/flow-diagram.md +180 -0
- package/ds-canonical/fork/codex/agents/skills/delivery-handoff/references/handoff-template.md +177 -0
- package/ds-canonical/fork/codex/agents/skills/delivery-handoff/references/inventory-checklist.md +196 -0
- package/ds-canonical/fork/codex/agents/skills/independent-review/SKILL.md +29 -19
- package/ds-canonical/fork/codex/agents/skills/independent-review/agents/openai.yaml +4 -0
- package/ds-canonical/fork/codex/agents/skills/independent-review/references/evidence-contract.md +24 -0
- package/ds-canonical/fork/codex/agents/skills/performance-audit/SKILL.md +114 -0
- package/ds-canonical/fork/codex/agents/skills/product-ui-audit/SKILL.md +244 -0
- package/ds-canonical/fork/codex/agents/skills/product-ui-audit/references/audit-checks.md +250 -0
- package/ds-canonical/fork/codex/agents/skills/product-ui-audit/references/common-misuses.md +329 -0
- package/ds-canonical/fork/codex/agents/skills/product-ui-audit/references/report-template.md +163 -0
- package/ds-canonical/fork/codex/agents/skills/propose-options/SKILL.md +190 -0
- package/ds-canonical/fork/codex/agents/skills/prototype/SKILL.md +246 -0
- package/ds-canonical/fork/codex/agents/skills/prototype/references/audit-checks.md +39 -0
- package/ds-canonical/fork/codex/agents/skills/prototype/references/benchmark-sources.md +94 -0
- package/ds-canonical/fork/codex/agents/skills/prototype/references/checkpoints.md +200 -0
- package/ds-canonical/fork/codex/agents/skills/prototype/references/evaluation-matrix.md +142 -0
- package/ds-canonical/fork/codex/agents/skills/prototype/references/ooux-template.md +198 -0
- package/ds-canonical/fork/codex/agents/skills/prototype/references/proposal-template.md +230 -0
- package/ds-canonical/fork/codex/agents/skills/scan-similar-bugs/SKILL.md +212 -0
- package/ds-canonical/fork/codex/agents/skills/ux-audit/SKILL.md +135 -0
- package/ds-canonical/fork/codex/agents/skills/visual-audit/SKILL.md +259 -0
- package/ds-canonical/fork/codex/agents/skills/visual-audit/output/.gitkeep +0 -0
- package/ds-canonical/fork/codex/agents/skills/visual-audit/references/audit-architecture.md +101 -0
- package/ds-canonical/fork/codex/agents/skills/visual-audit/references/visual-checklist.md +297 -0
- package/ds-canonical/fork/codex/agents/skills/visual-audit/references/world-class-benchmarks.md +198 -0
- package/ds-canonical/fork/codex/hooks.json +44 -3
- package/ds-canonical/fork/common/closed-tool-execution.mjs +1001 -0
- package/ds-canonical/fork/common/instruction.md +116 -0
- package/ds-canonical/fork/consumer/governance-check.mjs +3059 -0
- package/ds-canonical/fork/consumer/lib/closed-tool-execution.mjs +1001 -0
- package/ds-canonical/fork/consumer/lock.json +189 -0
- package/ds-canonical/fork/consumer/lock.schema.json +338 -0
- package/ds-canonical/fork/consumer/managed-files/0235cf6b3fd402a3717881dc205b5bf77aed7632e7d7d6f1811a40e3033bd816.blob +145 -0
- package/ds-canonical/fork/consumer/managed-files/145aab4b4fc470fc9ba7679b4a1d87d4f6a6d604940bd40f8d675c8af696498f.blob +47 -0
- package/ds-canonical/fork/consumer/managed-files/189e551431181e4a88783c02130d2787b801ef731c86e35bcde89a7313aa020e.blob +149 -0
- package/ds-canonical/fork/consumer/managed-files/24ad71c8613ddcf6fd23818cb3bb477a1fb6d83af4550b0bad43099813088686.blob +28 -0
- package/ds-canonical/fork/consumer/managed-files/2d1ef5617a5ce3c39ad9aae1c42af7d199f9270c0a0ccb490b63d62dbc6913db.blob +1001 -0
- package/ds-canonical/fork/consumer/managed-files/3625e02235cf166a50649a4d704cfb68fead69d0e168c481df013ebae9f6be25.blob +1412 -0
- package/ds-canonical/fork/consumer/managed-files/3ddedc67b464bdfe3dde9803a2d917920c96d633678b802eee638a44cd47366a.blob +8 -0
- package/ds-canonical/fork/consumer/managed-files/423729840acdd43c812f17c245b871716c6b60f76e4d3e94864d0e34a815bf8d.blob +348 -0
- package/ds-canonical/fork/consumer/managed-files/46f10bc55cdfdf834d0749eebff42ea0bb8576f361b36d2b6ba1851354c50150.blob +464 -0
- package/ds-canonical/fork/consumer/managed-files/475fba657eaeb8abd88f60635f3eadab27a9d0d3114ba4fffc65f43a2a0fe6e2.blob +124 -0
- package/ds-canonical/fork/consumer/managed-files/61c6aca6d7f04bedbf556eaa9d3043681fe48cbe0e93a8ccb1d69a7c5e23fdcf.blob +113 -0
- package/ds-canonical/fork/consumer/managed-files/63061e05969667005020166ea2ae7df3c96663f7a928e7dd3eebc1471022df56.blob +2398 -0
- package/ds-canonical/fork/consumer/managed-files/65410b66e8799a560e07b71779c186fed2a0ef50575ac44745df7a0938a9c2b4.blob +317 -0
- package/ds-canonical/fork/consumer/managed-files/6929a3c8bb4d69c507720b4754aeb339c6cbb8ff655e0a381d76606d64695e38.blob +393 -0
- package/ds-canonical/fork/consumer/managed-files/6b746628ac11fcccbe277ef6fea94cc2a7b90ea2822e83536eae80d5ee4b3fa5.blob +167 -0
- package/ds-canonical/fork/consumer/managed-files/76d485470d30ff014afacf7ce643763de9f4f956d9fc8128dbc1814774cf2e63.blob +671 -0
- package/ds-canonical/fork/consumer/managed-files/77e06f62670dfee01e9b5e8b0f8dad085ce711d75538c1fb0679d9818acaca82.blob +424 -0
- package/ds-canonical/fork/consumer/managed-files/7937321877e5c34c27dae36c0d507d21cd42fa3f46a8f11a284b8b4a52b6faa4.blob +84 -0
- package/ds-canonical/fork/consumer/managed-files/794bb911ba8ebef58ab0d44a55b9968a19d2c62bcfb310b1ee3a84166f087f21.blob +880 -0
- package/ds-canonical/fork/consumer/managed-files/7b17835d0ceb17cdcdcaf930540a3e5d0943a34a747ac43c12ca8cd485c11581.blob +44 -0
- package/ds-canonical/fork/consumer/managed-files/7eb6cc60abfdabaf6617c336058fad1454ccde08889295767bfd9b7fd153cc6e.blob +778 -0
- package/ds-canonical/fork/consumer/managed-files/81037efa5b3b9f4a875704005fb268acdc9233bb901f44902e4e37e1da92b8e3.blob +46 -0
- package/ds-canonical/fork/consumer/managed-files/884721550b56308812b20917adac7a12f36fdb4ecda6b02460a7f5a219c0c966.blob +78 -0
- package/ds-canonical/fork/consumer/managed-files/91f414b9462ddc1e4be1d4c6ca4ac7a7340a6eec9e98ee109cbc049d3b354b6a.blob +36 -0
- package/ds-canonical/fork/consumer/managed-files/92e4828cdcb96ff0d01daa16f6885f24045a8e72820665650f2a1890dc3a446c.blob +121 -0
- package/ds-canonical/fork/consumer/managed-files/93a89f16f6717d1e4e4e27ec20ef916e3355c7aa890ca74cd9b12db30d8a899f.blob +43 -0
- package/ds-canonical/fork/consumer/managed-files/974521d6b8fe796ea4c58b3c78b0c2b8a1be262b97100d77aaf4cc9c7724bcab.blob +45 -0
- package/ds-canonical/fork/consumer/managed-files/9791c85388d2e2e2bd564e2550fadc3351c4c960a47ce838098afcba7544eb90.blob +959 -0
- package/ds-canonical/fork/consumer/managed-files/a448d2222133335c30e6fda5116e26a40db3283a19d62ccc0663c30d272262a7.blob +174 -0
- package/ds-canonical/fork/consumer/managed-files/ab072e7f2eca51f0e18a5e18c4b333260ee5d219a12cc6df5bb2d683f0b2734d.blob +2636 -0
- package/ds-canonical/fork/consumer/managed-files/bc44cabad181f766611dab6a8f52d81100afadd50ac59799015e8ba7bf46d9eb.blob +596 -0
- package/ds-canonical/fork/consumer/managed-files/c4aa767f11714467de0038a2149cf78074baddc17fc6a9e074b6aed7544c6f3c.blob +80 -0
- package/ds-canonical/fork/consumer/managed-files/c893e9b734b162f4c631fef871128c16a9ab565f796a0e76d7f320f821f220f5.blob +41 -0
- package/ds-canonical/fork/consumer/managed-files/cd9c61f8ff24fb9bcc3663e346e2cfa419cfb84e02aae18d3dc66dd192681696.blob +9 -0
- package/ds-canonical/fork/consumer/managed-files/da2ad2737315d25a5300905ddefd62f1695056a8a1af155c5b34170ad9923bce.blob +38 -0
- package/ds-canonical/fork/consumer/managed-files/e1b11160d6c4043002d2cbff6d9a4ae551698a96137773c4244dadfac152fcb0.blob +222 -0
- package/ds-canonical/fork/consumer/managed-files/e26057408661597aac4a57cdf7e30e2f9d0afb1b9a2dbbb692c3805cd9028ca5.blob +250 -0
- package/ds-canonical/fork/consumer/managed-files/e68ae1915965d8e17d4b2441c00c2b97fe062ea308ae8535c9eebb2fc16fa245.blob +20 -0
- package/ds-canonical/fork/consumer/managed-files/e71c65f45c6af7ce12b6b3c0d8028f185da5b719e2050c9b2a6b243d41ae4878.blob +182 -0
- package/ds-canonical/fork/consumer/managed-files/e813096d69c49812e40e00be9ac8fa14d77f0ec1f97ab4c45cb096b3bedd35de.blob +3 -0
- package/ds-canonical/fork/consumer/managed-files/e930ebca6fd8eeb30802aac0930efae7bcc44cc0996f24de07c11ca6a081fedf.blob +277 -0
- package/ds-canonical/fork/consumer/managed-files/ea94e914d5c8acb84ad7660e5bda0f01b6ccc8cf96b0f6b1ce048f8938d0f5b5.blob +47 -0
- package/ds-canonical/fork/consumer/managed-files/f4db6e616d5229aa7e700c6a3ace022cb9d90baae74e38ca65fce617f18e0d9b.blob +110 -0
- package/ds-canonical/fork/consumer/managed-files/faa128c26102415dc5345e68698efbbd28a395c35ee278dceae044cf430692b2.blob +11 -0
- package/ds-canonical/fork/governance.lock +1552 -103
- package/ds-canonical/fork/hooks/_log-fire.sh +109 -12
- package/ds-canonical/fork/hooks/block_prototype_imports.py +148 -29
- package/ds-canonical/fork/hooks/check_chrome_header_avatar_canonical.sh +23 -12
- package/ds-canonical/fork/hooks/check_consumer_app_invariants.sh +116 -65
- package/ds-canonical/fork/hooks/check_consumer_code_quality.sh +140 -0
- package/ds-canonical/fork/hooks/check_ds_anchor_preflight.sh +84 -30
- package/ds-canonical/fork/hooks/check_dynamic_tailwind_class.sh +16 -6
- package/ds-canonical/fork/hooks/check_escape_marker_abuse.sh +65 -21
- package/ds-canonical/fork/hooks/check_field_family_invariants.sh +90 -24
- package/ds-canonical/fork/hooks/check_fork_product_quality.sh +8 -6
- package/ds-canonical/fork/hooks/check_item_list_gap.sh +4 -2
- package/ds-canonical/fork/hooks/check_layout_space_magic_numbers.sh +31 -13
- package/ds-canonical/fork/hooks/check_opacity_token_usage.sh +220 -95
- package/ds-canonical/fork/hooks/check_pattern_invariants.sh +73 -14
- package/ds-canonical/fork/hooks/check_sidebar_menu_button_implicit_wrap.sh +23 -12
- package/ds-canonical/fork/hooks/check_story_determinism.sh +1 -1
- package/ds-canonical/fork/hooks/check_story_invariants.sh +342 -61
- package/ds-canonical/fork/hooks/check_tabs_content_chrome_body_double_gap.sh +52 -23
- package/ds-canonical/fork/hooks/check_tailwind_wildcard_in_docs.sh +20 -13
- package/ds-canonical/fork/hooks/inject_deploy_url_after_push.sh +105 -22
- package/ds-canonical/fork/hooks/lib/_hook_integrity.sh +158 -0
- package/ds-canonical/fork/hooks/lib/_provider_paths.sh +162 -0
- package/ds-canonical/fork/launchers/approval-evidence.mjs +1131 -0
- package/ds-canonical/fork/launchers/authority-decision-evidence.mjs +413 -0
- package/ds-canonical/fork/launchers/canonical-order.mjs +8 -0
- package/ds-canonical/fork/launchers/fork-governance-dispatcher.sh +139 -29
- package/ds-canonical/fork/launchers/format-provider-hook-output.mjs +25 -0
- package/ds-canonical/fork/launchers/independent-review.mjs +490 -0
- package/ds-canonical/fork/launchers/inject_fork_governance_preamble.sh +88 -43
- package/ds-canonical/fork/launchers/normalize-provider-event.mjs +355 -0
- package/ds-canonical/fork/launchers/product-hook-dispatch-runtime.mjs +1067 -0
- package/ds-canonical/fork/launchers/provider-hook-normalization.mjs +1646 -0
- package/ds-canonical/fork/launchers/provider-hook-output-transport.mjs +525 -0
- package/ds-canonical/fork/launchers/settings-hooks.json +30 -53
- package/ds-canonical/fork/manifest.json +1881 -23
- package/ds-canonical/fork/providers/claude/hook-config.json +333 -0
- package/ds-canonical/fork/providers/claude/instruction.md +54 -0
- package/ds-canonical/fork/providers/claude/skills/bug-fix-rhythm/SKILL.md +207 -0
- package/ds-canonical/fork/providers/claude/skills/code-quality-audit/SKILL.md +71 -0
- package/ds-canonical/fork/providers/claude/skills/delivery-handoff/SKILL.md +244 -0
- package/ds-canonical/fork/providers/claude/skills/delivery-handoff/references/flow-diagram.md +180 -0
- package/ds-canonical/fork/providers/claude/skills/delivery-handoff/references/handoff-template.md +177 -0
- package/ds-canonical/fork/providers/claude/skills/delivery-handoff/references/inventory-checklist.md +196 -0
- package/ds-canonical/fork/providers/claude/skills/independent-review/SKILL.md +43 -0
- package/ds-canonical/fork/providers/claude/skills/independent-review/agents/openai.yaml +4 -0
- package/ds-canonical/fork/providers/claude/skills/independent-review/references/evidence-contract.md +24 -0
- package/ds-canonical/fork/providers/claude/skills/performance-audit/SKILL.md +114 -0
- package/ds-canonical/fork/providers/claude/skills/product-ui-audit/SKILL.md +244 -0
- package/ds-canonical/fork/providers/claude/skills/product-ui-audit/references/audit-checks.md +250 -0
- package/ds-canonical/fork/providers/claude/skills/product-ui-audit/references/common-misuses.md +329 -0
- package/ds-canonical/fork/providers/claude/skills/product-ui-audit/references/report-template.md +163 -0
- package/ds-canonical/fork/providers/claude/skills/propose-options/SKILL.md +190 -0
- package/ds-canonical/fork/providers/claude/skills/prototype/SKILL.md +246 -0
- package/ds-canonical/fork/providers/claude/skills/prototype/references/audit-checks.md +39 -0
- package/ds-canonical/fork/providers/claude/skills/prototype/references/benchmark-sources.md +94 -0
- package/ds-canonical/fork/providers/claude/skills/prototype/references/checkpoints.md +200 -0
- package/ds-canonical/fork/providers/claude/skills/prototype/references/evaluation-matrix.md +142 -0
- package/ds-canonical/fork/providers/claude/skills/prototype/references/ooux-template.md +198 -0
- package/ds-canonical/fork/providers/claude/skills/prototype/references/proposal-template.md +230 -0
- package/ds-canonical/fork/providers/claude/skills/scan-similar-bugs/SKILL.md +212 -0
- package/ds-canonical/fork/providers/claude/skills/ux-audit/SKILL.md +135 -0
- package/ds-canonical/fork/providers/claude/skills/visual-audit/SKILL.md +259 -0
- package/ds-canonical/fork/providers/claude/skills/visual-audit/output/.gitkeep +0 -0
- package/ds-canonical/fork/providers/claude/skills/visual-audit/references/audit-architecture.md +101 -0
- package/ds-canonical/fork/providers/claude/skills/visual-audit/references/visual-checklist.md +297 -0
- package/ds-canonical/fork/providers/claude/skills/visual-audit/references/world-class-benchmarks.md +198 -0
- package/ds-canonical/fork/providers/codex/hook-config.json +57 -0
- package/ds-canonical/fork/providers/codex/skills/bug-fix-rhythm/SKILL.md +207 -0
- package/ds-canonical/fork/providers/codex/skills/code-quality-audit/SKILL.md +71 -0
- package/ds-canonical/fork/providers/codex/skills/delivery-handoff/SKILL.md +244 -0
- package/ds-canonical/fork/providers/codex/skills/delivery-handoff/references/flow-diagram.md +180 -0
- package/ds-canonical/fork/providers/codex/skills/delivery-handoff/references/handoff-template.md +177 -0
- package/ds-canonical/fork/providers/codex/skills/delivery-handoff/references/inventory-checklist.md +196 -0
- package/ds-canonical/fork/providers/codex/skills/independent-review/SKILL.md +43 -0
- package/ds-canonical/fork/providers/codex/skills/independent-review/agents/openai.yaml +4 -0
- package/ds-canonical/fork/providers/codex/skills/independent-review/references/evidence-contract.md +24 -0
- package/ds-canonical/fork/providers/codex/skills/performance-audit/SKILL.md +114 -0
- package/ds-canonical/fork/providers/codex/skills/product-ui-audit/SKILL.md +244 -0
- package/ds-canonical/fork/providers/codex/skills/product-ui-audit/references/audit-checks.md +250 -0
- package/ds-canonical/fork/providers/codex/skills/product-ui-audit/references/common-misuses.md +329 -0
- package/ds-canonical/fork/providers/codex/skills/product-ui-audit/references/report-template.md +163 -0
- package/ds-canonical/fork/providers/codex/skills/propose-options/SKILL.md +190 -0
- package/ds-canonical/fork/providers/codex/skills/prototype/SKILL.md +246 -0
- package/ds-canonical/fork/providers/codex/skills/prototype/references/audit-checks.md +39 -0
- package/ds-canonical/fork/providers/codex/skills/prototype/references/benchmark-sources.md +94 -0
- package/ds-canonical/fork/providers/codex/skills/prototype/references/checkpoints.md +200 -0
- package/ds-canonical/fork/providers/codex/skills/prototype/references/evaluation-matrix.md +142 -0
- package/ds-canonical/fork/providers/codex/skills/prototype/references/ooux-template.md +198 -0
- package/ds-canonical/fork/providers/codex/skills/prototype/references/proposal-template.md +230 -0
- package/ds-canonical/fork/providers/codex/skills/scan-similar-bugs/SKILL.md +212 -0
- package/ds-canonical/fork/providers/codex/skills/ux-audit/SKILL.md +135 -0
- package/ds-canonical/fork/providers/codex/skills/visual-audit/SKILL.md +259 -0
- package/ds-canonical/fork/providers/codex/skills/visual-audit/output/.gitkeep +0 -0
- package/ds-canonical/fork/providers/codex/skills/visual-audit/references/audit-architecture.md +101 -0
- package/ds-canonical/fork/providers/codex/skills/visual-audit/references/visual-checklist.md +297 -0
- package/ds-canonical/fork/providers/codex/skills/visual-audit/references/world-class-benchmarks.md +198 -0
- package/ds-canonical/fork/references/story-baseline-registry.json +117 -0
- package/ds-canonical/fork/references/story-baseline-registry.schema.json +145 -0
- package/ds-canonical/fork/references/utility-registry.json +377 -0
- package/ds-canonical/fork/references/utility-registry.schema.json +373 -0
- package/ds-canonical/fork/review/canonical-order.mjs +8 -0
- package/ds-canonical/fork/review/provider-review-binding.mjs +2377 -0
- package/ds-canonical/fork/skills/bug-fix-rhythm/SKILL.md +19 -12
- package/ds-canonical/fork/skills/code-quality-audit/SKILL.md +19 -15
- package/ds-canonical/fork/skills/delivery-handoff/SKILL.md +17 -11
- package/ds-canonical/fork/skills/independent-review/SKILL.md +37 -0
- package/ds-canonical/fork/skills/independent-review/agents/openai.yaml +4 -0
- package/ds-canonical/fork/skills/independent-review/references/evidence-contract.md +24 -0
- package/ds-canonical/fork/skills/performance-audit/SKILL.md +11 -8
- package/ds-canonical/fork/skills/product-ui-audit/SKILL.md +31 -21
- package/ds-canonical/fork/skills/product-ui-audit/references/audit-checks.md +9 -5
- package/ds-canonical/fork/skills/product-ui-audit/references/report-template.md +30 -26
- package/ds-canonical/fork/skills/propose-options/SKILL.md +6 -4
- package/ds-canonical/fork/skills/prototype/SKILL.md +21 -21
- package/ds-canonical/fork/skills/prototype/references/audit-checks.md +7 -6
- package/ds-canonical/fork/skills/prototype/references/checkpoints.md +26 -17
- package/ds-canonical/fork/skills/prototype/references/evaluation-matrix.md +2 -1
- package/ds-canonical/fork/skills/prototype/references/ooux-template.md +1 -1
- package/ds-canonical/fork/skills/prototype/references/proposal-template.md +6 -5
- package/ds-canonical/fork/skills/scan-similar-bugs/SKILL.md +28 -27
- package/ds-canonical/fork/skills/ux-audit/SKILL.md +8 -5
- package/ds-canonical/fork/skills/visual-audit/SKILL.md +37 -43
- package/ds-canonical/fork/skills/visual-audit/references/audit-architecture.md +15 -15
- package/ds-canonical/fork/skills/visual-audit/references/visual-checklist.md +6 -6
- package/ds-canonical/fork/skills/visual-audit/references/world-class-benchmarks.md +2 -2
- package/ds-canonical/hooks/README.md +37 -23
- package/ds-canonical/hooks/_log-fire.sh +109 -12
- package/ds-canonical/hooks/auto_regen_ds_barrel.sh +52 -20
- package/ds-canonical/hooks/block_prototype_imports.py +148 -29
- package/ds-canonical/hooks/check_audit_post_report_validator.sh +76 -66
- package/ds-canonical/hooks/check_audit_sample_escape.sh +4 -4
- package/ds-canonical/hooks/check_benchmark_citation.sh +3 -3
- package/ds-canonical/hooks/check_canonical_propagation.sh +81 -22
- package/ds-canonical/hooks/check_chrome_header_avatar_canonical.sh +22 -11
- package/ds-canonical/hooks/check_codex_brief_invariants.sh +100 -56
- package/ds-canonical/hooks/check_codex_collab_5step.sh +31 -25
- package/ds-canonical/hooks/check_consumer_app_invariants.sh +116 -65
- package/ds-canonical/hooks/check_consumer_code_quality.sh +140 -0
- package/ds-canonical/hooks/check_datatable_invariants.sh +103 -25
- package/ds-canonical/hooks/check_dim_count_drift.sh +5 -4
- package/ds-canonical/hooks/check_ds_anchor_preflight.sh +83 -29
- package/ds-canonical/hooks/check_dynamic_tailwind_class.sh +16 -6
- package/ds-canonical/hooks/check_escape_marker_abuse.sh +65 -21
- package/ds-canonical/hooks/check_field_controls_contracts.sh +10 -8
- package/ds-canonical/hooks/check_field_family_invariants.sh +90 -24
- package/ds-canonical/hooks/check_file_size_budget.sh +32 -14
- package/ds-canonical/hooks/check_full_story_visual_interaction_sweep.sh +60 -21
- package/ds-canonical/hooks/check_item_list_gap.sh +4 -2
- package/ds-canonical/hooks/check_layout_space_magic_numbers.sh +31 -13
- package/ds-canonical/hooks/check_main_branch_workbench.sh +27 -68
- package/ds-canonical/hooks/check_naming_and_abstraction.sh +20 -9
- package/ds-canonical/hooks/check_opacity_token_usage.sh +220 -95
- package/ds-canonical/hooks/check_orphan_ds_css.sh +48 -18
- package/ds-canonical/hooks/check_overlay_open_focus_escape_probe.sh +29 -11
- package/ds-canonical/hooks/check_pattern_invariants.sh +73 -14
- package/ds-canonical/hooks/check_peoplepicker_ssot_drift.sh +4 -4
- package/ds-canonical/hooks/check_pixel_quantified_audit.sh +3 -2
- package/ds-canonical/hooks/check_plugin_fork_health.sh +151 -41
- package/ds-canonical/hooks/check_post_main_ssot_propagate.sh +5 -109
- package/ds-canonical/hooks/check_propose_discipline.sh +116 -29
- package/ds-canonical/hooks/check_propose_pre_grep_verify.sh +6 -4
- package/ds-canonical/hooks/check_propose_without_benchmark.sh +10 -6
- package/ds-canonical/hooks/check_select_all_canonical.sh +1 -1
- package/ds-canonical/hooks/check_sidebar_menu_button_implicit_wrap.sh +22 -11
- package/ds-canonical/hooks/check_solo_workflow.sh +117 -186
- package/ds-canonical/hooks/check_spec_class_drift.sh +33 -19
- package/ds-canonical/hooks/check_ssot_header_declaration.sh +6 -5
- package/ds-canonical/hooks/check_story_determinism.sh +1 -1
- package/ds-canonical/hooks/check_story_invariants.sh +526 -213
- package/ds-canonical/hooks/check_storybook_addon_packaging.sh +65 -15
- package/ds-canonical/hooks/check_substantive_edit_approval_preflight.sh +137 -67
- package/ds-canonical/hooks/check_tabs_content_chrome_body_double_gap.sh +52 -23
- package/ds-canonical/hooks/check_tailwind_wildcard_in_docs.sh +20 -13
- package/ds-canonical/hooks/check_wrapper_primitive_schema_drift.sh +15 -12
- package/ds-canonical/hooks/chrome_header_dispatcher.sh +75 -26
- package/ds-canonical/hooks/enforce_home_charter.sh +29 -8
- package/ds-canonical/hooks/governance_control_plane.sh +15 -0
- package/ds-canonical/hooks/inject_deploy_url_after_push.sh +105 -22
- package/ds-canonical/hooks/inject_pending_self_audit.sh +27 -24
- package/ds-canonical/hooks/lib/_app_shell_primary_header_consistency.sh +77 -29
- package/ds-canonical/hooks/lib/_approval_re.sh +5 -6
- package/ds-canonical/hooks/lib/_chrome_header_handcraft.sh +66 -20
- package/ds-canonical/hooks/lib/_code_quality.sh +9 -9
- package/ds-canonical/hooks/lib/_cva_default_sync.sh +11 -13
- package/ds-canonical/hooks/lib/_governance_coverage_check.sh +48 -21
- package/ds-canonical/hooks/lib/_hardcoded_strings.sh +13 -10
- package/ds-canonical/hooks/lib/_header_with_tabs_border.sh +68 -48
- package/ds-canonical/hooks/lib/_hook_integrity.sh +158 -0
- package/ds-canonical/hooks/lib/_layout_space_canonical.sh +5 -5
- package/ds-canonical/hooks/lib/_overlay_handcraft.sh +21 -23
- package/ds-canonical/hooks/lib/_person_data_richness.sh +5 -5
- package/ds-canonical/hooks/lib/_provider_paths.sh +162 -0
- package/ds-canonical/hooks/lib/_story_compile_drift.sh +5 -5
- package/ds-canonical/hooks/lib/_tab_lg_chrome_header_equal.sh +247 -27
- package/ds-canonical/hooks/lib/_token_hygiene.sh +39 -22
- package/ds-canonical/hooks/lib/approval-evidence.mjs +1131 -0
- package/ds-canonical/hooks/lib/audit-report-validator.mjs +118 -0
- package/ds-canonical/hooks/lib/provider-marker-regex.mjs +23 -0
- package/ds-canonical/hooks/lib/tsx-governance-analysis.mjs +410 -0
- package/ds-canonical/hooks/log_governance_fires.sh +45 -13
- package/ds-canonical/hooks/log_skill_invokes.sh +8 -7
- package/ds-canonical/hooks/post_edit_dispatcher.sh +106 -28
- package/ds-canonical/hooks/registrations.json +488 -0
- package/ds-canonical/hooks/registrations.schema.json +58 -0
- package/ds-canonical/hooks/retired/2026-06-11-prune-merge/check_propose_plain_chinese.sh +1 -1
- package/ds-canonical/hooks/retired/check_governance_compliance.sh +1 -1
- package/ds-canonical/hooks/session_start_governance_check.sh +109 -78
- package/ds-canonical/hooks/stop_audit_content_quality.sh +20 -0
- package/ds-canonical/hooks/stop_extract_canonical_rules.sh +20 -0
- package/ds-canonical/hooks/stop_passive_logging.sh +133 -59
- package/ds-canonical/hooks/stop_self_audit.sh +349 -210
- package/ds-canonical/hooks/tests/fixtures/transcripts/claude-transcript-jsonl-v1.jsonl +3 -0
- package/ds-canonical/hooks/tests/fixtures/transcripts/claude-transcript-jsonl-v2.jsonl +3 -0
- package/ds-canonical/hooks/tests/registration-output-contracts.mjs +151 -0
- package/ds-canonical/hooks/tests/run-all.sh +35 -5
- package/ds-canonical/hooks/tests/test_auto_regen_ds_barrel.sh +48 -4
- package/ds-canonical/hooks/tests/test_block_prototype_imports.sh +157 -9
- package/ds-canonical/hooks/tests/test_check_app_shell_primary_header_consistency.sh +265 -127
- package/ds-canonical/hooks/tests/test_check_audit_post_report_validator.sh +119 -12
- package/ds-canonical/hooks/tests/test_check_audit_sample_escape.sh +0 -0
- package/ds-canonical/hooks/tests/test_check_benchmark_citation.sh +0 -0
- package/ds-canonical/hooks/tests/test_check_canonical_propagation.sh +56 -5
- package/ds-canonical/hooks/tests/test_check_chrome_header_avatar_canonical.sh +6 -6
- package/ds-canonical/hooks/tests/test_check_chrome_header_handcraft.sh +193 -100
- package/ds-canonical/hooks/tests/test_check_codex_brief_invariants.sh +143 -17
- package/ds-canonical/hooks/tests/test_check_codex_collab_5step.sh +49 -5
- package/ds-canonical/hooks/tests/test_check_consumer_app_invariants.sh +128 -0
- package/ds-canonical/hooks/tests/test_check_consumer_app_story_title.sh +2 -2
- package/ds-canonical/hooks/tests/test_check_consumer_code_quality.sh +64 -0
- package/ds-canonical/hooks/tests/test_check_consumer_ds_primitive_misuse.sh +2 -2
- package/ds-canonical/hooks/tests/test_check_consumer_no_ds_catalog.sh +2 -2
- package/ds-canonical/hooks/tests/test_check_consumer_story_baseline.sh +2 -2
- package/ds-canonical/hooks/tests/test_check_data_table_size_num_to_meta_width.sh +26 -8
- package/ds-canonical/hooks/tests/test_check_datatable_invariants.sh +126 -12
- package/ds-canonical/hooks/tests/test_check_dim_count_drift.sh +13 -8
- package/ds-canonical/hooks/tests/test_check_ds_anchor_preflight.sh +53 -7
- package/ds-canonical/hooks/tests/test_check_dynamic_tailwind_class.sh +3 -3
- package/ds-canonical/hooks/tests/test_check_escape_marker_abuse.sh +17 -7
- package/ds-canonical/hooks/tests/test_check_field_family_invariants.sh +72 -16
- package/ds-canonical/hooks/tests/test_check_file_size_budget.sh +67 -5
- package/ds-canonical/hooks/tests/test_check_fork_user_plugin_install.sh +107 -4
- package/ds-canonical/hooks/tests/test_check_full_story_visual_interaction_sweep.sh +25 -15
- package/ds-canonical/hooks/tests/test_check_header_with_tabs_border.sh +177 -67
- package/ds-canonical/hooks/tests/test_check_item_list_gap.sh +7 -7
- package/ds-canonical/hooks/tests/test_check_layout_space_magic_numbers.sh +2 -2
- package/ds-canonical/hooks/tests/test_check_main_branch_workbench.sh +45 -110
- package/ds-canonical/hooks/tests/test_check_naming_and_abstraction.sh +19 -2
- package/ds-canonical/hooks/tests/test_check_opacity_token_usage.sh +114 -8
- package/ds-canonical/hooks/tests/test_check_orphan_ds_css.sh +38 -22
- package/ds-canonical/hooks/tests/test_check_overlay_open_focus_escape_probe.sh +2 -2
- package/ds-canonical/hooks/tests/test_check_pattern_invariants.sh +68 -6
- package/ds-canonical/hooks/tests/test_check_plugin_fork_health.sh +53 -0
- package/ds-canonical/hooks/tests/test_check_post_main_ssot_propagate.sh +37 -0
- package/ds-canonical/hooks/tests/test_check_propose_cite_required.sh +2 -2
- package/ds-canonical/hooks/tests/test_check_propose_discipline.sh +59 -0
- package/ds-canonical/hooks/tests/test_check_propose_plain_chinese.sh +7 -5
- package/ds-canonical/hooks/tests/test_check_propose_pre_grep_verify.sh +5 -5
- package/ds-canonical/hooks/tests/test_check_propose_without_benchmark.sh +45 -0
- package/ds-canonical/hooks/tests/test_check_sidebar_menu_button_implicit_wrap.sh +5 -5
- package/ds-canonical/hooks/tests/test_check_solo_workflow.sh +183 -105
- package/ds-canonical/hooks/tests/test_check_spec_class_drift.sh +35 -7
- package/ds-canonical/hooks/tests/{test_check_story_anatomy.sh.broken → test_check_story_anatomy.sh} +73 -4
- package/ds-canonical/hooks/tests/{test_check_story_category.sh.broken → test_check_story_category.sh} +82 -2
- package/ds-canonical/hooks/tests/test_check_story_determinism.sh +39 -0
- package/ds-canonical/hooks/tests/test_check_story_invariants.sh +559 -43
- package/ds-canonical/hooks/tests/{test_check_story_name_jargon.sh.broken → test_check_story_name_jargon.sh} +22 -1
- package/ds-canonical/hooks/tests/test_check_storybook_addon_packaging.sh +79 -0
- package/ds-canonical/hooks/tests/test_check_storybook_addon_preset_cjs.sh +2 -2
- package/ds-canonical/hooks/tests/test_check_substantive_edit_approval_preflight.sh +546 -28
- package/ds-canonical/hooks/tests/test_check_tab_lg_chrome_header_equal.sh +180 -98
- package/ds-canonical/hooks/tests/test_check_tabs_content_chrome_body_double_gap.sh +3 -3
- package/ds-canonical/hooks/tests/test_check_tailwind_wildcard_in_docs.sh +2 -2
- package/ds-canonical/hooks/tests/test_check_token_hygiene.sh +63 -15
- package/ds-canonical/hooks/tests/test_check_wrapper_primitive_schema_drift.sh +12 -6
- package/ds-canonical/hooks/tests/test_chrome_header_dispatcher.sh +125 -0
- package/ds-canonical/hooks/tests/test_enforce_home_charter.sh +57 -3
- package/ds-canonical/hooks/tests/test_governance_control_plane.sh +66 -0
- package/ds-canonical/hooks/tests/test_governance_coverage_check.sh +88 -0
- package/ds-canonical/hooks/tests/test_hook_integrity_classification.sh +217 -0
- package/ds-canonical/hooks/tests/test_inject_deploy_url_after_push.sh +85 -2
- package/ds-canonical/hooks/tests/test_inject_pending_self_audit.sh +116 -11
- package/ds-canonical/hooks/tests/test_log_governance_fires.sh +117 -1
- package/ds-canonical/hooks/tests/test_log_skill_invokes.sh +74 -5
- package/ds-canonical/hooks/tests/test_post_edit_dispatcher.sh +234 -77
- package/ds-canonical/hooks/tests/test_provider_peer_symmetry.sh +76 -0
- package/ds-canonical/hooks/tests/test_registration_output_contracts.sh +20 -0
- package/ds-canonical/hooks/tests/test_session_start_governance_check.sh +130 -18
- package/ds-canonical/hooks/tests/test_stop_audit_content_quality.sh +75 -0
- package/ds-canonical/hooks/tests/test_stop_capture_metrics.sh +101 -23
- package/ds-canonical/hooks/tests/test_stop_extract_canonical_rules.sh +75 -0
- package/ds-canonical/hooks/tests/{test_stop_governance_drift_check.sh.broken → test_stop_governance_drift_check.sh} +22 -12
- package/ds-canonical/hooks/tests/test_stop_passive_logging.sh +102 -1
- package/ds-canonical/hooks/tests/test_stop_repository_command_context.sh +38 -0
- package/ds-canonical/hooks/tests/test_stop_self_audit.sh +363 -9
- package/ds-canonical/references/README.md +8 -8
- package/ds-canonical/references/audit-coverage-vs-24-checklist.md +4 -4
- package/ds-canonical/references/build-ui-canonicals.md +3 -3
- package/ds-canonical/references/certified-surfaces.md +46 -15
- package/ds-canonical/references/cva-patterns.md +2 -2
- package/ds-canonical/references/failure-class-registry.json +3 -2
- package/ds-canonical/references/governance-audit-coverage.md +8 -8
- package/ds-canonical/references/naming-conventions.md +1 -1
- package/ds-canonical/references/preflight-gate-baseline.json +210 -3
- package/ds-canonical/references/principle-dim-map.json +15 -9
- package/ds-canonical/references/props-naming.md +1 -1
- package/ds-canonical/references/scenario-definition.md +33 -30
- package/ds-canonical/references/spec-rules.md +1 -1
- package/ds-canonical/references/ssot-consultation.md +3 -3
- package/ds-canonical/references/ssot-index.md +1 -1
- package/ds-canonical/references/story-baseline-registry.json +9 -6
- package/ds-canonical/references/story-baseline-registry.schema.json +145 -0
- package/ds-canonical/references/structural-token-retention.md +1 -1
- package/ds-canonical/references/tailwind-gotchas.md +2 -2
- package/ds-canonical/references/ui-dev-rules.md +1 -1
- package/ds-canonical/rules/README.md +14 -9
- package/ds-canonical/rules/meta-patterns.md +13 -13
- package/ds-canonical/rules/self-verify.md +12 -7
- package/ds-canonical/rules/spec-rules.md +1 -1
- package/ds-canonical/rules/ui-development.md +5 -5
- package/ds-canonical/skills/README.md +27 -15
- package/ds-canonical/skills/bug-fix-rhythm/SKILL.md +14 -7
- package/ds-canonical/skills/canonical-reviewer/SKILL.md +29 -0
- package/ds-canonical/skills/code-quality-audit/SKILL.md +11 -7
- package/ds-canonical/skills/codex-collab/SKILL.md +19 -238
- package/ds-canonical/skills/codex-collab/references/brief-template.md +37 -47
- package/ds-canonical/skills/codex-collab/references/transport.md +38 -57
- package/ds-canonical/skills/codify-corrections/SKILL.md +32 -31
- package/ds-canonical/skills/codify-principle/SKILL.md +33 -32
- package/ds-canonical/skills/component-quality-gate/SKILL.md +13 -13
- package/ds-canonical/skills/component-quality-gate/references/checklist.md +7 -7
- package/ds-canonical/skills/deep-audit-cross-codex/SKILL.md +28 -229
- package/ds-canonical/skills/deep-audit-cross-codex/references/phase-a-workflow.md +36 -131
- package/ds-canonical/skills/deep-audit-cross-codex/references/phase-b-codex-brief.md +33 -187
- package/ds-canonical/skills/deep-audit-cross-codex/references/skill-relationships-antipatterns-benchmarks.md +22 -24
- package/ds-canonical/skills/deep-audit-cross-codex/references/triage-rubric.md +15 -79
- package/ds-canonical/skills/deep-audit-cross-codex/references/upstream-directives-r-mapping.md +24 -23
- package/ds-canonical/skills/delivery-handoff/SKILL.md +14 -8
- package/ds-canonical/skills/design-system-audit/SKILL.md +63 -62
- package/ds-canonical/skills/design-system-audit/references/audit-prompts.md +86 -77
- package/ds-canonical/skills/design-system-audit/references/checkpoints.md +59 -50
- package/ds-canonical/skills/design-system-audit/references/historical-bugs.md +8 -8
- package/ds-canonical/skills/design-system-audit/references/principle-audit-protocol.md +37 -32
- package/ds-canonical/skills/design-system-audit/references/rule-placement.md +39 -38
- package/ds-canonical/skills/ensure-canonical/SKILL.md +36 -34
- package/ds-canonical/skills/governance-health/SKILL.md +26 -22
- package/ds-canonical/skills/governance-status/SKILL.md +30 -0
- package/ds-canonical/skills/independent-review/SKILL.md +37 -0
- package/ds-canonical/skills/independent-review/agents/openai.yaml +4 -0
- package/ds-canonical/skills/independent-review/references/evidence-contract.md +24 -0
- package/ds-canonical/skills/knowledge-prune/SKILL.md +45 -52
- package/ds-canonical/skills/knowledge-prune/references/phase-z-cross-repo-ssot-propagation.md +10 -7
- package/ds-canonical/skills/knowledge-prune/references/prune-dimensions-d5-d10.md +6 -6
- package/ds-canonical/skills/new-component/SKILL.md +18 -12
- package/ds-canonical/skills/new-component/references/new-component-checklist.md +7 -6
- package/ds-canonical/skills/performance-audit/SKILL.md +13 -10
- package/ds-canonical/skills/product-ui-audit/SKILL.md +27 -17
- package/ds-canonical/skills/product-ui-audit/references/audit-checks.md +7 -4
- package/ds-canonical/skills/product-ui-audit/references/report-template.md +30 -26
- package/ds-canonical/skills/propose-options/SKILL.md +1 -1
- package/ds-canonical/skills/prototype/SKILL.md +19 -21
- package/ds-canonical/skills/prototype/references/audit-checks.md +6 -5
- package/ds-canonical/skills/prototype/references/checkpoints.md +26 -17
- package/ds-canonical/skills/prototype/references/ooux-template.md +1 -1
- package/ds-canonical/skills/prototype/references/proposal-template.md +4 -4
- package/ds-canonical/skills/scan-similar-bugs/SKILL.md +22 -21
- package/ds-canonical/skills/story-auto-compile-migrate/SKILL.md +21 -20
- package/ds-canonical/skills/story-writing/SKILL.md +12 -12
- package/ds-canonical/skills/story-writing/references/anatomy-standard.md +1 -1
- package/ds-canonical/skills/story-writing/references/category-templates.md +5 -5
- package/ds-canonical/skills/ux-audit/SKILL.md +12 -9
- package/ds-canonical/skills/visual-audit/SKILL.md +41 -47
- package/ds-canonical/skills/visual-audit/references/audit-architecture.md +7 -7
- package/ds-canonical/skills/visual-audit/references/visual-checklist.md +12 -12
- package/ds-canonical/skills/visual-audit/references/world-class-benchmarks.md +3 -3
- package/ds-canonical/templates/_README.md +6 -7
- package/ds-canonical/templates/consumer-governance.md +78 -0
- package/ds-canonical/templates/dashboard-app.tsx +3 -1
- package/ds-canonical/templates/product-launchers/fork-governance-dispatcher.sh +154 -0
- package/ds-canonical/templates/product-launchers/format-provider-hook-output.mjs +25 -0
- package/ds-canonical/templates/product-launchers/independent-review.mjs +490 -0
- package/ds-canonical/templates/product-launchers/inject_fork_governance_preamble.sh +99 -0
- package/ds-canonical/templates/product-launchers/normalize-provider-event.mjs +355 -0
- package/ds-canonical/templates/product-launchers/product-hook-dispatch-runtime.mjs +1067 -0
- package/ds-canonical/templates/product-provider-wiring.json +80 -0
- package/ds-canonical/templates/product-provider-wiring.schema.json +151 -0
- package/llms-full.txt +6 -6
- package/llms.txt +2 -2
- package/package.json +15 -4
- package/src/components/Accordion/accordion.principles.stories.tsx +16 -26
- package/src/components/Accordion/accordion.stories.tsx +22 -40
- package/src/components/Calendar/calendar.spec.md +1 -1
- package/src/components/Calendar/calendar.tsx +59 -25
- package/src/components/DataTable/cell-registry.tsx +3 -7
- package/src/components/DataTable/data-table.spec.md +1 -0
- package/src/components/DataTable/data-table.tsx +9 -2
- package/src/components/DatePicker/date-picker.spec.md +1 -1
- package/src/components/DatePicker/date-picker.tsx +203 -147
- package/src/components/Dialog/dialog.spec.md +1 -1
- package/src/components/Dialog/dialog.tsx +8 -2
- package/src/components/Field/field-context.ts +25 -1
- package/src/components/Field/field-wrapper.tsx +7 -1
- package/src/components/Field/field.spec.md +7 -0
- package/src/components/Field/field.tsx +13 -2
- package/src/components/InlineEdit/inline-edit.spec.md +12 -0
- package/src/components/InlineEdit/inline-edit.stories.tsx +28 -17
- package/src/components/InlineEdit/inline-edit.tsx +94 -31
- package/src/components/Input/input.tsx +7 -2
- package/src/components/LinkInput/link-input.spec.md +1 -1
- package/src/components/LinkInput/link-input.tsx +5 -1
- package/src/components/Popover/popover.tsx +7 -2
- package/src/components/Select/select.principles.stories.tsx +4 -3
- package/src/components/Select/select.stories.tsx +7 -6
- package/src/components/Select/select.tsx +61 -29
- package/src/components/Textarea/textarea.spec.md +10 -1
- package/src/components/Textarea/textarea.tsx +38 -5
- package/src/components/TimePicker/time-picker.tsx +11 -5
- package/src/components/Tooltip/tooltip.spec.md +6 -0
- package/src/patterns/element-anatomy/item-anatomy.spec.md +8 -1
- package/src/patterns/element-anatomy/item-anatomy.tsx +111 -30
- package/src/patterns/element-anatomy/truncated-text.spec.md +13 -2
- package/src/tokens/uiSize/uiSize.css +11 -0
- package/src/tokens/uiSize/uiSize.spec.md +1 -0
- package/src/tokens/utility-registry.json +119 -4
- package/src/tokens/utility-registry.schema.json +373 -0
- package/tools/README.md +9 -0
- package/tools/codemods/cli.mjs +93 -0
- package/tools/codemods/index.mjs +582 -0
- package/tools/shared/safe-filesystem.mjs +371 -0
- package/tools/visual-baseline/cli.mjs +97 -0
- package/tools/visual-baseline/index.mjs +522 -0
- /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
|
|
7
|
-
# - Escape:
|
|
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:$
|
|
10
|
-
# manifest 不存在 / total=0 →
|
|
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 +
|
|
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
|
|
36
|
+
# Override GOVERNANCE_PROJECT_DIR so manifest lookup + _log-fire land in TMP_DIR
|
|
37
37
|
# (不污染 repo packages/ 與 .claude/logs/)
|
|
38
|
-
export
|
|
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.
|
|
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
|
-
|
|
171
|
+
expect_block "13. [POS] valid report with count=0 → BLOCK" "FULL-STORY-SWEEP BLOCKER"
|
|
162
172
|
|
|
163
|
-
# 14.
|
|
173
|
+
# 14. Empty report content is invalid enforcement evidence.
|
|
164
174
|
run_hook "/tmp/codex-sweep/audit-report.json" ""
|
|
165
|
-
|
|
175
|
+
expect_integrity "14. empty report → integrity failure" "report is malformed or invalid"
|
|
166
176
|
|
|
167
|
-
# 15.
|
|
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" |
|
|
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
|
-
|
|
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
|
-
#
|
|
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"
|
|
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"
|
|
29
|
-
|
|
30
|
-
|
|
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"
|
|
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
|
-
|
|
36
|
-
|
|
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"
|
|
42
|
-
echo " PASS $name"
|
|
69
|
+
if [ "$EXIT" -eq 0 ] && [ -z "$STDOUT_TEXT" ] && [ -z "$STDERR_TEXT" ]; then
|
|
70
|
+
PASS=$((PASS + 1)); echo " PASS $name"
|
|
43
71
|
else
|
|
44
|
-
|
|
45
|
-
echo "
|
|
46
|
-
|
|
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
|
-
|
|
51
|
-
local name="$1"
|
|
52
|
-
if [ "$EXIT"
|
|
53
|
-
|
|
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
|
-
|
|
56
|
-
echo "
|
|
57
|
-
|
|
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
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
echo " PASS $name"
|
|
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
|
-
|
|
68
|
-
echo "
|
|
69
|
-
|
|
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
|
-
|
|
76
|
-
|
|
77
|
-
|
|
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
|
-
|
|
80
|
-
|
|
81
|
-
|
|
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
|
-
|
|
84
|
-
|
|
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
|
-
|
|
88
|
-
|
|
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
|
-
|
|
92
|
-
|
|
93
|
-
|
|
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
|
-
|
|
96
|
-
|
|
97
|
-
|
|
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
|
-
|
|
100
|
-
|
|
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
|
-
|
|
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"
|
|
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
|
|
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
|
|
36
|
+
# Override GOVERNANCE_PROJECT_DIR so _log-fire.sh per-hook log lands in TMP_DIR
|
|
37
37
|
# (避免污染 repo .claude/logs/)
|
|
38
|
-
export
|
|
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
|
|
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-
|
|
12
|
+
REPO_FEAT="$TMP_ROOT/repo-feature"
|
|
29
13
|
|
|
30
14
|
setup_repo() {
|
|
31
|
-
local dir="$1"
|
|
15
|
+
local dir="$1" branch="$2"
|
|
32
16
|
mkdir -p "$dir"
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
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 "$
|
|
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"
|
|
56
|
-
local payload
|
|
57
|
-
payload=$(jq -n --arg fp "$file_path"
|
|
58
|
-
|
|
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
|
-
|
|
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 "$
|
|
67
|
-
rm -f "$
|
|
40
|
+
STDERR_TEXT=$(cat "$stderr_file")
|
|
41
|
+
rm -f "$stdout_file" "$stderr_file"
|
|
68
42
|
}
|
|
69
43
|
|
|
70
|
-
|
|
44
|
+
expect_pass() {
|
|
71
45
|
local name="$1"
|
|
72
|
-
if [ "$EXIT" =
|
|
73
|
-
|
|
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
|
-
|
|
82
|
-
|
|
83
|
-
|
|
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
|
-
|
|
95
|
-
|
|
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
|
-
|
|
106
|
-
|
|
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
|
-
|
|
110
|
-
|
|
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
|
-
|
|
114
|
-
|
|
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
|
-
|
|
118
|
-
|
|
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" |
|
|
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 "$
|
|
125
|
-
rm -f "$
|
|
126
|
-
|
|
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
|
-
|
|
145
|
-
echo "Failed:$FAILED_TESTS"
|
|
146
|
-
exit 1
|
|
147
|
-
fi
|
|
82
|
+
[ "$FAIL" -eq 0 ]
|