@qijenchen/design-system 0.1.0-beta.10 → 0.1.0-beta.13
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/CLAUDE.md +201 -0
- package/README.md +7 -15
- package/cli-init.mjs +90 -0
- package/ds-canonical/commands/README.md +26 -0
- package/ds-canonical/commands/gov-status.md +79 -0
- package/ds-canonical/hooks/README.md +145 -0
- package/ds-canonical/hooks/_log-fire.sh +44 -0
- package/ds-canonical/hooks/block_prototype_imports.py +111 -0
- package/ds-canonical/hooks/check_app_shell_primary_header_consistency.sh +68 -0
- package/ds-canonical/hooks/check_audit_post_report_validator.sh +88 -0
- package/ds-canonical/hooks/check_audit_sample_escape.sh +73 -0
- package/ds-canonical/hooks/check_benchmark_citation.sh +106 -0
- package/ds-canonical/hooks/check_canonical_propagation.sh +189 -0
- package/ds-canonical/hooks/check_chrome_header_handcraft.sh +70 -0
- package/ds-canonical/hooks/check_codex_brief_invariants.sh +83 -0
- package/ds-canonical/hooks/check_codex_collab_5step.sh +108 -0
- package/ds-canonical/hooks/check_datatable_invariants.sh +117 -0
- package/ds-canonical/hooks/check_dim_count_drift.sh +72 -0
- package/ds-canonical/hooks/check_field_controls_contracts.sh +110 -0
- package/ds-canonical/hooks/check_field_family_invariants.sh +205 -0
- package/ds-canonical/hooks/check_file_size_budget.sh +60 -0
- package/ds-canonical/hooks/check_header_with_tabs_border.sh +87 -0
- package/ds-canonical/hooks/check_main_branch_workbench.sh +93 -0
- package/ds-canonical/hooks/check_naming_and_abstraction.sh +165 -0
- package/ds-canonical/hooks/check_opacity_token_usage.sh +149 -0
- package/ds-canonical/hooks/check_pattern_invariants.sh +194 -0
- package/ds-canonical/hooks/check_peoplepicker_ssot_drift.sh +56 -0
- package/ds-canonical/hooks/check_pixel_quantified_audit.sh +53 -0
- package/ds-canonical/hooks/check_propose_plain_chinese.sh +74 -0
- package/ds-canonical/hooks/check_propose_pre_grep_verify.sh +70 -0
- package/ds-canonical/hooks/check_select_all_canonical.sh +58 -0
- package/ds-canonical/hooks/check_solo_workflow.sh +258 -0
- package/ds-canonical/hooks/check_spec_class_drift.sh +88 -0
- package/ds-canonical/hooks/check_story_invariants.sh +612 -0
- package/ds-canonical/hooks/check_substantive_edit_approval_preflight.sh +105 -0
- package/ds-canonical/hooks/check_tab_lg_chrome_header_equal.sh +66 -0
- package/ds-canonical/hooks/check_wrapper_primitive_schema_drift.sh +104 -0
- package/ds-canonical/hooks/enforce_home_charter.sh +44 -0
- package/ds-canonical/hooks/inject_pending_self_audit.sh +204 -0
- package/ds-canonical/hooks/lib/_approval_re.sh +33 -0
- package/ds-canonical/hooks/lib/_code_quality.sh +73 -0
- package/ds-canonical/hooks/lib/_cva_default_sync.sh +69 -0
- package/ds-canonical/hooks/lib/_governance_coverage_check.sh +49 -0
- package/ds-canonical/hooks/lib/_hardcoded_strings.sh +163 -0
- package/ds-canonical/hooks/lib/_layout_space_canonical.sh +56 -0
- package/ds-canonical/hooks/lib/_overlay_handcraft.sh +141 -0
- package/ds-canonical/hooks/lib/_person_data_richness.sh +42 -0
- package/ds-canonical/hooks/lib/_story_compile_drift.sh +48 -0
- package/ds-canonical/hooks/lib/_token_hygiene.sh +95 -0
- package/ds-canonical/hooks/log_governance_fires.sh +50 -0
- package/ds-canonical/hooks/log_skill_invokes.sh +41 -0
- package/ds-canonical/hooks/post_edit_dispatcher.sh +62 -0
- package/ds-canonical/hooks/retired/check_anatomy_section_numbering.sh +106 -0
- package/ds-canonical/hooks/retired/check_avatar_hovercard.sh +90 -0
- package/ds-canonical/hooks/retired/check_button_icon_literal.sh.retired-2026-04-28 +38 -0
- package/ds-canonical/hooks/retired/check_container_breathing.sh +142 -0
- package/ds-canonical/hooks/retired/check_governance_compliance.sh +61 -0
- package/ds-canonical/hooks/retired/check_icon_only_padding_formula.sh +104 -0
- package/ds-canonical/hooks/retired/check_item_content_primitive.sh +150 -0
- package/ds-canonical/hooks/retired/check_item_list_gap.sh +153 -0
- package/ds-canonical/hooks/retired/check_sideoffset_canonical.sh +65 -0
- package/ds-canonical/hooks/retired/check_spec_iteration_tag.sh +87 -0
- package/ds-canonical/hooks/retired/check_ssot_consultation.sh +88 -0
- package/ds-canonical/hooks/retired/check_sync_update.sh +20 -0
- package/ds-canonical/hooks/retired/check_third_party_dom_verified.sh +95 -0
- package/ds-canonical/hooks/retired/enforce_home_charter.sh +125 -0
- package/ds-canonical/hooks/retired/post_edit_canonical_interrogate.sh +109 -0
- package/ds-canonical/hooks/retired/pre_edit_spec_check.sh +68 -0
- package/ds-canonical/hooks/retired/pre_new_component_spec.sh +39 -0
- package/ds-canonical/hooks/retired/pre_write_subsumption_check.sh +112 -0
- package/ds-canonical/hooks/retired/stop_meta_self_audit.sh.retired-2026-05-13 +76 -0
- package/ds-canonical/hooks/retired/tests/test_check_anatomy_section_numbering.sh +14 -0
- package/ds-canonical/hooks/retired/tests/test_check_avatar_hovercard.sh +15 -0
- package/ds-canonical/hooks/retired/tests/test_check_container_breathing.sh +15 -0
- package/ds-canonical/hooks/retired/tests/test_check_governance_compliance.sh +15 -0
- package/ds-canonical/hooks/retired/tests/test_check_icon_only_padding_formula.sh +79 -0
- package/ds-canonical/hooks/retired/tests/test_check_item_content_primitive.sh +15 -0
- package/ds-canonical/hooks/retired/tests/test_check_item_list_gap.sh +163 -0
- package/ds-canonical/hooks/retired/tests/test_check_sideoffset_canonical.sh +15 -0
- package/ds-canonical/hooks/retired/tests/test_check_spec_iteration_tag.sh +15 -0
- package/ds-canonical/hooks/retired/tests/test_check_ssot_consultation.sh +15 -0
- package/ds-canonical/hooks/retired/tests/test_check_sync_update.sh +14 -0
- package/ds-canonical/hooks/retired/tests/test_check_third_party_dom_verified.sh +15 -0
- package/ds-canonical/hooks/retired/tests/test_enforce_home_charter.sh +15 -0
- package/ds-canonical/hooks/retired/tests/test_pre_edit_spec_check.sh +15 -0
- package/ds-canonical/hooks/retired/tests/test_pre_new_component_spec.sh +15 -0
- package/ds-canonical/hooks/retired/tests/test_pre_write_subsumption_check.sh +63 -0
- package/ds-canonical/hooks/session_start_governance_check.sh +263 -0
- package/ds-canonical/hooks/stop_passive_logging.sh +322 -0
- package/ds-canonical/hooks/stop_self_audit.sh +450 -0
- package/ds-canonical/hooks/tests/KNOWN-BROKEN.md +15 -0
- package/ds-canonical/hooks/tests/run-all.sh +76 -0
- package/ds-canonical/hooks/tests/test_block_prototype_imports.sh +143 -0
- package/ds-canonical/hooks/tests/test_check_app_shell_primary_header_consistency.sh +140 -0
- package/ds-canonical/hooks/tests/test_check_audit_post_report_validator.sh +115 -0
- package/ds-canonical/hooks/tests/test_check_audit_sample_escape.sh +93 -0
- package/ds-canonical/hooks/tests/test_check_benchmark_citation.sh +115 -0
- package/ds-canonical/hooks/tests/test_check_canonical_propagation.sh +133 -0
- package/ds-canonical/hooks/tests/test_check_chrome_header_handcraft.sh +123 -0
- package/ds-canonical/hooks/tests/test_check_code_quality.sh +15 -0
- package/ds-canonical/hooks/tests/test_check_codex_collab_5step.sh +96 -0
- package/ds-canonical/hooks/tests/test_check_cva_default_sync.sh +15 -0
- package/ds-canonical/hooks/tests/test_check_datatable_invariants.sh +122 -0
- package/ds-canonical/hooks/tests/test_check_dim_count_drift.sh +98 -0
- package/ds-canonical/hooks/tests/test_check_field_controls_contracts.sh +126 -0
- package/ds-canonical/hooks/tests/test_check_field_family_invariants.sh +194 -0
- package/ds-canonical/hooks/tests/test_check_file_size_budget.sh +32 -0
- package/ds-canonical/hooks/tests/test_check_hardcoded_strings.sh +14 -0
- package/ds-canonical/hooks/tests/test_check_header_with_tabs_border.sh +110 -0
- package/ds-canonical/hooks/tests/test_check_layout_space_canonical.sh +73 -0
- package/ds-canonical/hooks/tests/test_check_main_branch_workbench.sh +147 -0
- package/ds-canonical/hooks/tests/test_check_naming_and_abstraction.sh +136 -0
- package/ds-canonical/hooks/tests/test_check_opacity_token_usage.sh +110 -0
- package/ds-canonical/hooks/tests/test_check_overlay_handcraft.sh +126 -0
- package/ds-canonical/hooks/tests/test_check_pattern_invariants.sh +148 -0
- package/ds-canonical/hooks/tests/test_check_peoplepicker_ssot_drift.sh +108 -0
- package/ds-canonical/hooks/tests/test_check_person_data_richness.sh +58 -0
- package/ds-canonical/hooks/tests/test_check_pixel_quantified_audit.sh +142 -0
- package/ds-canonical/hooks/tests/test_check_propose_plain_chinese.sh +126 -0
- package/ds-canonical/hooks/tests/test_check_propose_pre_grep_verify.sh +117 -0
- package/ds-canonical/hooks/tests/test_check_select_all_canonical.sh +125 -0
- package/ds-canonical/hooks/tests/test_check_solo_workflow.sh +201 -0
- package/ds-canonical/hooks/tests/test_check_spec_class_drift.sh +135 -0
- package/ds-canonical/hooks/tests/test_check_story_anatomy.sh.broken +197 -0
- package/ds-canonical/hooks/tests/test_check_story_category.sh.broken +187 -0
- package/ds-canonical/hooks/tests/test_check_story_compile_drift.sh +15 -0
- package/ds-canonical/hooks/tests/test_check_story_invariants.sh +209 -0
- package/ds-canonical/hooks/tests/test_check_story_name_jargon.sh.broken +53 -0
- package/ds-canonical/hooks/tests/test_check_story_slot_split.sh +156 -0
- package/ds-canonical/hooks/tests/test_check_substantive_edit_approval_preflight.sh +176 -0
- package/ds-canonical/hooks/tests/test_check_tab_lg_chrome_header_equal.sh +138 -0
- package/ds-canonical/hooks/tests/test_check_token_hygiene.sh +21 -0
- package/ds-canonical/hooks/tests/test_check_wrapper_primitive_schema_drift.sh +169 -0
- package/ds-canonical/hooks/tests/test_enforce_home_charter.sh +77 -0
- package/ds-canonical/hooks/tests/test_inject_pending_self_audit.sh +125 -0
- package/ds-canonical/hooks/tests/test_log_governance_fires.sh +10 -0
- package/ds-canonical/hooks/tests/test_log_skill_invokes.sh +7 -0
- package/ds-canonical/hooks/tests/test_post_edit_dispatcher.sh +108 -0
- package/ds-canonical/hooks/tests/test_session_start_governance_check.sh +143 -0
- package/ds-canonical/hooks/tests/test_stop_capture_metrics.sh +95 -0
- package/ds-canonical/hooks/tests/test_stop_governance_drift_check.sh.broken +125 -0
- package/ds-canonical/hooks/tests/test_stop_harvest_corrections.sh +10 -0
- package/ds-canonical/hooks/tests/test_stop_passive_logging.sh +100 -0
- package/ds-canonical/hooks/tests/test_stop_self_audit.sh +76 -0
- package/ds-canonical/hooks/tests/test_stop_tsc_sanity.sh +10 -0
- package/ds-canonical/references/README.md +43 -0
- package/ds-canonical/references/audit-coverage-vs-24-checklist.md +74 -0
- package/ds-canonical/references/build-ui-canonicals.md +69 -0
- package/ds-canonical/references/cva-patterns.md +41 -0
- package/ds-canonical/references/drag-canonical.md +331 -0
- package/ds-canonical/references/item-anatomy-recipe.md +225 -0
- package/ds-canonical/references/naming-conventions.md +56 -0
- package/ds-canonical/references/principle-dim-map.json +515 -0
- package/ds-canonical/references/props-naming.md +45 -0
- package/ds-canonical/references/spec-rules.md +58 -0
- package/ds-canonical/references/ssot-consultation.md +63 -0
- package/ds-canonical/references/ssot-index.md +40 -0
- package/ds-canonical/references/story-baseline-registry.json +79 -0
- package/ds-canonical/references/structural-token-retention.md +42 -0
- package/ds-canonical/references/tailwind-gotchas.md +87 -0
- package/ds-canonical/references/ui-dev-rules.md +60 -0
- package/ds-canonical/rules/README.md +34 -0
- package/ds-canonical/rules/meta-patterns.md +87 -0
- package/ds-canonical/rules/self-verify.md +53 -0
- package/ds-canonical/rules/spec-rules.md +25 -0
- package/ds-canonical/rules/story-rules.md +56 -0
- package/ds-canonical/rules/ui-development.md +87 -0
- package/ds-canonical/skills/README.md +88 -0
- package/ds-canonical/skills/bug-fix-rhythm/SKILL.md +181 -0
- package/ds-canonical/skills/code-quality-audit/SKILL.md +63 -0
- package/ds-canonical/skills/codex-collab/SKILL.md +249 -0
- package/ds-canonical/skills/codex-collab/references/brief-template.md +48 -0
- package/ds-canonical/skills/codex-collab/references/transport.md +58 -0
- package/ds-canonical/skills/codify-corrections/SKILL.md +184 -0
- package/ds-canonical/skills/codify-principle/SKILL.md +151 -0
- package/ds-canonical/skills/component-quality-gate/SKILL.md +102 -0
- package/ds-canonical/skills/component-quality-gate/references/checklist.md +79 -0
- package/ds-canonical/skills/deep-audit-cross-codex/SKILL.md +247 -0
- package/ds-canonical/skills/deep-audit-cross-codex/references/phase-a-workflow.md +123 -0
- package/ds-canonical/skills/deep-audit-cross-codex/references/phase-b-codex-brief.md +165 -0
- package/ds-canonical/skills/deep-audit-cross-codex/references/triage-rubric.md +91 -0
- package/ds-canonical/skills/delivery-handoff/SKILL.md +229 -0
- package/ds-canonical/skills/delivery-handoff/references/flow-diagram.md +180 -0
- package/ds-canonical/skills/delivery-handoff/references/handoff-template.md +177 -0
- package/ds-canonical/skills/delivery-handoff/references/inventory-checklist.md +196 -0
- package/ds-canonical/skills/design-system-audit/SKILL.md +343 -0
- package/ds-canonical/skills/design-system-audit/references/audit-prompts.md +1260 -0
- package/ds-canonical/skills/design-system-audit/references/checkpoints.md +240 -0
- package/ds-canonical/skills/design-system-audit/references/historical-bugs.md +240 -0
- package/ds-canonical/skills/design-system-audit/references/principle-audit-protocol.md +364 -0
- package/ds-canonical/skills/design-system-audit/references/rule-placement.md +175 -0
- package/ds-canonical/skills/design-system-audit/references/spec-template.md +66 -0
- package/ds-canonical/skills/ensure-canonical/SKILL.md +196 -0
- package/ds-canonical/skills/governance-health/SKILL.md +146 -0
- package/ds-canonical/skills/knowledge-prune/SKILL.md +303 -0
- package/ds-canonical/skills/new-component/SKILL.md +170 -0
- package/ds-canonical/skills/new-component/references/new-component-checklist.md +85 -0
- package/ds-canonical/skills/performance-audit/SKILL.md +107 -0
- package/ds-canonical/skills/product-ui-audit/SKILL.md +230 -0
- package/ds-canonical/skills/product-ui-audit/references/audit-checks.md +246 -0
- package/ds-canonical/skills/product-ui-audit/references/common-misuses.md +329 -0
- package/ds-canonical/skills/product-ui-audit/references/report-template.md +159 -0
- package/ds-canonical/skills/propose-options/SKILL.md +177 -0
- package/ds-canonical/skills/prototype/SKILL.md +244 -0
- package/ds-canonical/skills/prototype/references/audit-checks.md +37 -0
- package/ds-canonical/skills/prototype/references/benchmark-sources.md +94 -0
- package/ds-canonical/skills/prototype/references/checkpoints.md +191 -0
- package/ds-canonical/skills/prototype/references/evaluation-matrix.md +141 -0
- package/ds-canonical/skills/prototype/references/ooux-template.md +198 -0
- package/ds-canonical/skills/prototype/references/proposal-template.md +229 -0
- package/ds-canonical/skills/scan-similar-bugs/SKILL.md +198 -0
- package/ds-canonical/skills/story-auto-compile-migrate/SKILL.md +159 -0
- package/ds-canonical/skills/story-writing/SKILL.md +122 -0
- package/ds-canonical/skills/story-writing/references/anatomy-standard.md +217 -0
- package/ds-canonical/skills/story-writing/references/category-templates.md +174 -0
- package/ds-canonical/skills/story-writing/references/example-selection.md +70 -0
- package/ds-canonical/skills/story-writing/references/self-check.md +20 -0
- package/ds-canonical/skills/ux-audit/SKILL.md +130 -0
- package/ds-canonical/skills/visual-audit/SKILL.md +245 -0
- package/ds-canonical/skills/visual-audit/output/.gitkeep +0 -0
- package/ds-canonical/skills/visual-audit/references/audit-architecture.md +100 -0
- package/ds-canonical/skills/visual-audit/references/visual-checklist.md +297 -0
- package/ds-canonical/skills/visual-audit/references/world-class-benchmarks.md +198 -0
- package/package.json +9 -5
- package/src/components/Accordion/accordion.spec.md +114 -0
- package/src/components/Alert/alert.spec.md +197 -0
- package/src/components/AppShell/app-shell.spec.md +331 -0
- package/src/components/AspectRatio/aspect-ratio.spec.md +134 -0
- package/src/components/Avatar/avatar.spec.md +329 -0
- package/src/components/Badge/badge.spec.md +380 -0
- package/src/components/Breadcrumb/breadcrumb.spec.md +257 -0
- package/src/components/BulkActionBar/bulk-action-bar.spec.md +210 -0
- package/src/components/Button/button.spec.md +460 -0
- package/src/components/Calendar/calendar.spec.md +242 -0
- package/src/components/Carousel/carousel.spec.md +253 -0
- package/src/components/Chart/chart.spec.md +155 -0
- package/src/components/Checkbox/checkbox.spec.md +344 -0
- package/src/components/Chip/chip.spec.md +237 -0
- package/src/components/CircularProgress/circular-progress.spec.md +268 -0
- package/src/components/Coachmark/coachmark.spec.md +230 -0
- package/src/components/Combobox/combobox.spec.md +180 -0
- package/src/components/Command/command.spec.md +171 -0
- package/src/components/DataTable/data-table.spec.md +525 -0
- package/src/components/DateGrid/date-grid.spec.md +215 -0
- package/src/components/DatePicker/date-picker.spec.md +334 -0
- package/src/components/DescriptionList/description-list.spec.md +214 -0
- package/src/components/Dialog/dialog.spec.md +202 -0
- package/src/components/DropdownMenu/dropdown-menu.spec.md +250 -0
- package/src/components/Empty/empty.spec.md +214 -0
- package/src/components/Field/field-controls.spec.md +338 -0
- package/src/components/Field/field.spec.md +438 -0
- package/src/components/Field/form-validation.spec.md +152 -0
- package/src/components/FieldControlGroup/field-control-group.spec.md +176 -0
- package/src/components/FileItem/file-item.spec.md +467 -0
- package/src/components/FileUpload/file-upload.spec.md +123 -0
- package/src/components/FileViewer/file-viewer.spec.md +373 -0
- package/src/components/HoverCard/hover-card.spec.md +157 -0
- package/src/components/Input/input.spec.md +193 -0
- package/src/components/LinkInput/link-input.spec.md +130 -0
- package/src/components/Menu/menu-item.spec.md +290 -0
- package/src/components/NameCard/name-card.spec.md +171 -0
- package/src/components/Notice/notice.spec.md +149 -0
- package/src/components/NumberInput/number-input.spec.md +126 -0
- package/src/components/OverflowIndicator/overflow-indicator.spec.md +120 -0
- package/src/components/PeoplePicker/people-picker.spec.md +263 -0
- package/src/components/Popover/popover.spec.md +198 -0
- package/src/components/ProgressBar/progress-bar.spec.md +232 -0
- package/src/components/RadioGroup/radio-group.spec.md +141 -0
- package/src/components/Rating/rating.spec.md +208 -0
- package/src/components/ScrollArea/scroll-area.spec.md +145 -0
- package/src/components/SegmentedControl/segmented-control.spec.md +295 -0
- package/src/components/Select/select.spec.md +299 -0
- package/src/components/SelectMenu/select-menu.spec.md +220 -0
- package/src/components/SelectionControl/selection-item.spec.md +128 -0
- package/src/components/Separator/separator.spec.md +109 -0
- package/src/components/Sheet/sheet.spec.md +148 -0
- package/src/components/Sidebar/sidebar.spec.md +713 -0
- package/src/components/Skeleton/skeleton.spec.md +104 -0
- package/src/components/Slider/slider.spec.md +353 -0
- package/src/components/Steps/steps.spec.md +465 -0
- package/src/components/Switch/switch.spec.md +215 -0
- package/src/components/Tabs/tabs.spec.md +314 -0
- package/src/components/Tag/tag.spec.md +282 -0
- package/src/components/Textarea/textarea.spec.md +151 -0
- package/src/components/TimePicker/time-picker.spec.md +279 -0
- package/src/components/Toast/toast.spec.md +177 -0
- package/src/components/Tooltip/tooltip.spec.md +139 -0
- package/src/components/TreeView/tree-view.spec.md +374 -0
- package/src/patterns/action-bar/action-bar.spec.md +458 -0
- package/src/patterns/element-anatomy/element-anatomy.spec.md +215 -0
- package/src/patterns/element-anatomy/inline-action.spec.md +315 -0
- package/src/patterns/element-anatomy/item-anatomy.spec.md +1042 -0
- package/src/patterns/header-canonical/header-canonical.spec.md +285 -0
- package/src/patterns/horizontal-overflow/horizontal-overflow.spec.md +191 -0
- package/src/patterns/overlay-surface/overlay-surface.spec.md +428 -0
- package/src/patterns/resize-handle/resize-handle.spec.md +109 -0
- package/src/tokens/color/color.spec.md +804 -0
- package/src/tokens/density/density.spec.md +127 -0
- package/src/tokens/elevation/elevation.spec.md +81 -0
- package/src/tokens/layoutSpace/layoutSpace.spec.md +314 -0
- package/src/tokens/motion/motion.spec.md +97 -0
- package/src/tokens/opacity/opacity.spec.md +78 -0
- package/src/tokens/orphan-tokens.spec.md +117 -0
- package/src/tokens/radius/radius.spec.md +123 -0
- package/src/tokens/typography/typography.spec.md +202 -0
- package/src/tokens/uiSize/uiSize.spec.md +438 -0
- package/src/styles/preset.css +0 -31
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
---
|
|
2
|
+
paths:
|
|
3
|
+
- "**/*.stories.tsx"
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Story 規則(path-scoped)
|
|
7
|
+
|
|
8
|
+
僅在編 `*.stories.tsx`(showcase / anatomy / principles 三層)時 load。
|
|
9
|
+
**完整 workflow → `/story-writing` skill**。
|
|
10
|
+
|
|
11
|
+
## 三層定位
|
|
12
|
+
|
|
13
|
+
| 層 | 檔案 | Canonical | Hook | Audit Dim |
|
|
14
|
+
|---|------|-----------|------|-----------|
|
|
15
|
+
| 1 展示 | `*.stories.tsx` | trait-based v2 | `check_story_category.sh` | 29 |
|
|
16
|
+
| 2 設計規格 | `*.anatomy.stories.tsx` | 6-canonical(Overview / Inspector / ColorMatrix / SizeMatrix / StateBehavior / Accessibility)| `check_story_anatomy.sh` | 13 |
|
|
17
|
+
| 3 設計原則 | `*.principles.stories.tsx` | Polaris-aligned ≥ 2 of {WhenToUse / WhenNotToUse / Vs*Rule / ContentGuidelines};v3 預設整合 `UsageGuidance` 單一 export(Polaris/Material/Ant 共識) | `check_principles_canonical.sh` | 30 |
|
|
18
|
+
|
|
19
|
+
## Title 命名
|
|
20
|
+
|
|
21
|
+
`Design System/{Tokens|Patterns|Components|Internal}/{Name}/{展示|設計規格|設計原則}`。
|
|
22
|
+
|
|
23
|
+
第一層英 / PascalCase / 子頁中文 / 子頁前不加元件名(❌ `MenuItem 展示` → ✅ `展示`)。
|
|
24
|
+
|
|
25
|
+
**Internal vs Components 三 test**:(1) 有預設視覺?(2) 直接 `<X>` 有視覺?(3) 所有消費者都包 wrapper?三題傾向 Internal → `Internal/`。**例外:compound-component public API**(`Dialog.Root/Trigger/Content` / `Field + FieldLabel + FieldError + FieldDescription` 等定義 sub-component 給 consumer 拼的 documented composition pattern)豁免三-test — 它**定義** sub-components,不是被 wrap 的零件。對齊 Radix Dialog / MUI FormControl + InputLabel + FormHelperText / Mantine Input.Wrapper compound idiom。
|
|
26
|
+
|
|
27
|
+
**Title canonical 4-part exemption**(2026-05-16 codified):**Tokens / Patterns** 為 single-file showcase(無 anatomy/principles 對應)→ 3-part title 是 intentional convention(`Design System/Tokens/{Name}` / `Design System/Patterns/{Name}`),不是違反。**Components / Internal** 必 4-part(`/{Name}/{展示|設計規格|設計原則}`)因有 3 stories 對應 file 需 subpage 分流。
|
|
28
|
+
|
|
29
|
+
**MenuItem-as-listbox-child 鍵盤 delegation 例外**(2026-05-16 codified per Combobox spec.md L130-142):MenuItem `<div role="option">` 不需自帶 Enter/Space handler — 由 parent listbox(Combobox / SelectMenu / DropdownMenu)的 hidden native `<select>` handle 鍵盤導覽(對齊 Material/Atlassian/GitHub mixed-control「單 native tab stop + 多 mouse click surface」 canonical)。MenuItem 為 building block 不該重複 handler。
|
|
30
|
+
|
|
31
|
+
**Story `name:` field 必中文人話**(no auto-compile 豁免):`compile-stories.mjs` auto-generate 已產生中文 name(如 `'元件總覽'`)。Manually-written stories `name:` 用純英文 implementation label(`'Default'` / `'Pressed'` / `'SizeMatrix'`)= drift,**必 humanize 中文**。Export const 維持 PascalCase(英)為 code identifier,**`name:` field 為 reader-facing 必中文**(術語例外:`FAQ` / 元件名 `Avatar/Tooltip` 等專有可保英)。
|
|
32
|
+
|
|
33
|
+
## 範例最高準則
|
|
34
|
+
|
|
35
|
+
精簡幹練、0 重複、每 story earn its existence(audit Dim 24/25/28/29/30 抓)。
|
|
36
|
+
|
|
37
|
+
**Earn-existence 2 test**:(a) 教別 story 沒教的原則?(b) 移除後 spec 理解 degrade?兩題皆 NO → retire。
|
|
38
|
+
|
|
39
|
+
**Production-grade composition fidelity**(2026-05-20 codify per codex anti-drift D2):
|
|
40
|
+
- 寫 stories wrap **既有 primitive**(`<Sidebar>` / `<ChromeHeader>` / `<Dialog>` / `<DataTable>` 等)時,**必先 grep 該 primitive `*.stories.tsx` 找「完整佈局」類 story**(eg. `sidebar.stories.tsx IconCollapse` / `data-table.stories.tsx WithBulkActions`),Read 其 helper(`WorkspaceBrand` / `UserFooter` / `PageContent` / toolbar pattern 等)**當 baseline reference**
|
|
41
|
+
- 禁直接寫 simplified mock(`<SidebarHeader><span>name</span>` / `<SidebarMenuButton><Icon className="size-4">` / `<ChromeHeader><span flex-1>title</span>`)= drift
|
|
42
|
+
- 標 `// @story-baseline: <path>#<StoryName>` 在 stories.tsx 檔頭,reference 哪個 baseline。Hook `check_story_invariants.sh R7` 攔 drift(2026-05-20 ship)。
|
|
43
|
+
|
|
44
|
+
**拆分原則**(對齊 Polaris / Carbon / Storybook):
|
|
45
|
+
- 不同 affordance 必分(IconOnly / FullWidth)
|
|
46
|
+
- AllVariants & AllSizes 對照各 1
|
|
47
|
+
- 同 affordance 內 prop variations 用 Controls 不另開(❌ `WithStartIcon`+`WithEndIcon` → ✓ `WithIcon` grid)
|
|
48
|
+
- Compound 有 new constraint 才分
|
|
49
|
+
|
|
50
|
+
**展示 v2 trait-based**:spec.md frontmatter `traits:` array → required core stories 衍生 + hook `check_story_category.sh` 攔。
|
|
51
|
+
|
|
52
|
+
**Principles canonical**(Polaris-aligned):universal core ≥ 2 of `WhenToUse`/`WhenNotToUse`/`Vs*Rule`/`ContentGuidelines` + hook 攔。SSOT → `/story-writing` skill `references/category-templates.md`。
|
|
53
|
+
|
|
54
|
+
## 禁止
|
|
55
|
+
|
|
56
|
+
❌ 佔位符 / 抽象代號 / 極端不現實 / 視覺符號 / spec 內部代號。詳 → `/story-writing` skill。
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
---
|
|
2
|
+
paths:
|
|
3
|
+
- "**/*.tsx"
|
|
4
|
+
- "**/*.ts"
|
|
5
|
+
- "packages/design-system/src/**"
|
|
6
|
+
- "src/explorations/**"
|
|
7
|
+
- "src/app/**"
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# UI 開發 + Tailwind + Token + Props 命名規則(path-scoped)
|
|
11
|
+
|
|
12
|
+
僅在編 `.tsx` / `.ts` 或 DS / explorations / app code 時 load。
|
|
13
|
+
|
|
14
|
+
## Public component vs Internal primitive canonical(SSOT,2026-05-23 user 永久拍板)
|
|
15
|
+
|
|
16
|
+
**Public component**(consumer-facing):**end-user app 直接寫 `<X />` 就能 render 出有意義的 UI**,不需要再 wrap / 不需要再 compose 其他 DS 元件。Examples:`<Button>` / `<Avatar>` / `<Dialog>` / `<DataTable>` / `<MenuItem>` / `<ActionBar>` / `<ResizeHandle>`。
|
|
17
|
+
|
|
18
|
+
**Internal primitive**:**供 DS 內部其他元件 wrap / compose 用**。end-user app 直接 render 無 functioning UI,或必須先 import 多個 DS 元件一起組才有結果。Examples:`<ChromeHeader>`(Sidebar 內部消費)/ `<SurfaceHeader/Body/Footer>`(Dialog 內部)/ `useOverflowItems` hook / `<ItemIcon>` / `<ItemAvatar>`(MenuItem 內部 slot)。
|
|
19
|
+
|
|
20
|
+
**Mechanical test(verifiable)**:
|
|
21
|
+
- 問:end-user app `<X />`(空 children / 無 props / 無 wrapper context)render → 有 functioning visible UI 嗎?
|
|
22
|
+
- YES → **public**
|
|
23
|
+
- NO → **internal**
|
|
24
|
+
|
|
25
|
+
**Folder + storybook canonical**:
|
|
26
|
+
- public:`components/<Name>/` OR `patterns/<name>/`(frontmatter 無 `internal: true`),storybook title `Design System/Components/<Name>/...` OR `Design System/Patterns/<Name>`
|
|
27
|
+
- internal:`components/Internal/<Name>/` OR `patterns/<name>/`(frontmatter `internal: true`),storybook title `Design System/Internal/<Name>/...` OR `Design System/Internal Patterns/<Name>`(end-user 設計師 default 過濾掉,DS contributor 看 reference 用)
|
|
28
|
+
- export jsDoc 加 `@internal` marker(IDE intellisense 警示 end-user)
|
|
29
|
+
|
|
30
|
+
**對齊世界級**:Polaris 「Building blocks」(public) vs「layout primitives」(internal)/ Material UI `@mui/material`(public)vs `@mui/utils` `@mui/system`(internal hooks/primitives)/ Atlassian `@atlaskit/<component>`(public)vs internal `<unstyled>` primitives / Carbon turnkey components + internal utilities / Apple HIG「Presented controls」vs「implementation primitives」 共識。
|
|
31
|
+
|
|
32
|
+
## 建立 UI 前必讀
|
|
33
|
+
|
|
34
|
+
**先 `ls packages/design-system/src/{components,patterns}/`**。必查 spec:Tokens(`tokens/{color|typography|density|uiSize|layoutSpace|elevation|radius}/*.spec.md`)/ Row + List item(`item-anatomy.spec.md` Family 1+2 SSOT)/ Action bar / Overflow / Overlay(`patterns/{action-bar,horizontal-overflow,overlay-surface}/*.spec.md`)/ Field(`components/Field/*.spec.md`)。
|
|
35
|
+
|
|
36
|
+
**既有 primitive 優先消費**:命中既有 → 必消費不 hand-craft。**自我檢查**:icon+text 垂直 → `<Empty>`;橫向 row → `<MenuItem>` + slot;浮層 → `overlay-surface`;跨 OS 捲軸 → `<ScrollArea>`;鎖長寬比 → `<AspectRatio>`。完整對照 → `.claude/references/build-ui-canonicals.md`。
|
|
37
|
+
|
|
38
|
+
## UI 開發 4 條核心
|
|
39
|
+
|
|
40
|
+
必重用既有 `components/` / 必用 design tokens(禁硬寫色/字/間距/圓角)/ 建新 UI 前查 pattern / 用 `cn()`(`@/lib/utils`)合併 Tailwind class。
|
|
41
|
+
|
|
42
|
+
深度規則 → `.claude/references/ui-dev-rules.md`(slot 幾何 / Padding source / Icon size 3 層)。
|
|
43
|
+
|
|
44
|
+
**一句話 pointer**:
|
|
45
|
+
- 新 row 元件 → `patterns/element-anatomy/item-anatomy.spec.md`「自我檢查」
|
|
46
|
+
- 清 unused imports / export 異動後:`npx tsc -b` → grep `export {}` → `npm run storybook` → 互動驗
|
|
47
|
+
- Inline Action vs Button → item-anatomy.spec.md「Inline Action 設計規格」
|
|
48
|
+
- 陰影:必 `--elevation-*`;禁 `shadow-sm/md/lg/xl/2xl`
|
|
49
|
+
- 視覺容器 breathing:有邊界 → 必 inner padding
|
|
50
|
+
|
|
51
|
+
## Tailwind 5 條核心(每條過真實 bug,詳 `.claude/references/tailwind-gotchas.md`)
|
|
52
|
+
|
|
53
|
+
1. **CSS variable 必 `var()` 包覆** — `w-[var(--foo)]` 而非 `w-[--foo]`(v4 silent 失效)
|
|
54
|
+
2. **自訂 utility 必在 `lib/utils.ts` 註冊 group** — 否則 tailwind-merge 誤判 strip
|
|
55
|
+
3. **禁 `shadow-sm/md/lg` / `text-xs/sm/base` / 硬寫色值** — 用 `shadow-[var(--elevation-*)]` / `text-body`
|
|
56
|
+
4. **禁 shadcn compat alias**(`bg-popover` / `text-muted-foreground` / `bg-accent` 等)— 用 direct token
|
|
57
|
+
5. **禁 primitive 色名作 utility**(`bg-neutral-3` / `text-blue-6`)— 用 semantic utility 或 `bg-[var(--color-blue-6)]`
|
|
58
|
+
|
|
59
|
+
## Token 命名 4 條硬規則
|
|
60
|
+
|
|
61
|
+
1. **對齊既有 family**(不孤立發明)— 詳 `tokens/color/color.spec.md`
|
|
62
|
+
2. **不混語義與色名**:Tag/Avatar 用 primitive(`var(--color-deep-orange-1)`);Button/Checkbox 用 semantic(`var(--error-subtle)`)
|
|
63
|
+
3. **新增語意色相**走 `tokens/color/color.spec.md`「新增語意色相流程」SSOT。本系統採 **Atlassian-style Semantic State Token**
|
|
64
|
+
4. **禁止**:籠統命名 / 孤立命名 / 自創縮寫 / Primitive 帶語意 / Semantic 帶色相 / Categorical 中間層(已廢除)
|
|
65
|
+
|
|
66
|
+
## 元件 Props 命名
|
|
67
|
+
|
|
68
|
+
**按「是什麼」命名,不按「在哪裡」命名**(Material Chip / Ant Tag idiom):
|
|
69
|
+
- slot 只接 icon → `startIcon` / `endIcon`(型別 `LucideIcon`,元件控尺寸)
|
|
70
|
+
- slot 接任意視覺 → 描述內容類型(`avatar`,型別 `ReactNode`)
|
|
71
|
+
- slot 是行為 → callback(`onDismiss`,元件渲染互動 + 樣式)
|
|
72
|
+
- ❌ 禁 `prefix` / `suffix` / `left` / `right`(位置名不傳達本質)
|
|
73
|
+
|
|
74
|
+
**4 名關閉 / 移除 callback**(詳 `.claude/references/props-naming.md`):
|
|
75
|
+
`onClose` / `onDismiss` / `onRemove` / `onClear` 各有語意不合併。
|
|
76
|
+
|
|
77
|
+
**Badge 命名按放置**:`badge`(inline)/ `overlayBadge`(疊視覺重心 iconOnly)/ `badgeCount`(Avatar count)/ `status`(Avatar presence dot)。
|
|
78
|
+
|
|
79
|
+
**Icon canonical**:Overflow `MoreVertical` / Breadcrumb ellipsis `MoreHorizontal` / Close `X` / 成功 `Check` / 警告 `TriangleAlert` / 資訊 `Info`。
|
|
80
|
+
|
|
81
|
+
## shadcn 元件規範
|
|
82
|
+
|
|
83
|
+
**結構**:每元件 `{name}.{tsx,spec.md,stories.tsx,anatomy.stories.tsx,principles.stories.tsx}`。tsx 用 forwardRef + cva + VariantProps + cn() + `{Component, componentVariants}` export。Import `@/design-system/components/{Name}/{name}`(無 barrel)。`npx shadcn add` 後**立刻 grep 移除 shadcn compat alias**。
|
|
84
|
+
|
|
85
|
+
**cva 適用**:className-only 差異 → cva;style 物件 → object map + `style={{}}`;不同 JSX 樹 → conditional rendering。
|
|
86
|
+
|
|
87
|
+
**元件不得自包全域 Provider**(Tooltip / Theme / Toast / Portal)— 由應用層統一設定。**判斷**:Context 是行為狀態(open / size)→ 可包;全域外觀配置(delay / theme / portal / variant defaults)→ 禁止。
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
# .claude/skills/ Charter
|
|
2
|
+
|
|
3
|
+
## 這裡只收:多步驟 workflow + user 決策點
|
|
4
|
+
|
|
5
|
+
每個 skill 一個 folder,內含:
|
|
6
|
+
- `SKILL.md` — frontmatter(`name` / `description`) + 完整 workflow body
|
|
7
|
+
- `references/` — 深度細節檔(AI 在跑 workflow 時按需讀)
|
|
8
|
+
|
|
9
|
+
**核心特徵**:**只在 user invoke 時載入**(不佔每 session context);流程包含 checkpoint 讓 user 介入決策。
|
|
10
|
+
|
|
11
|
+
## 當前居民(22 skills,2026-05-14 update)
|
|
12
|
+
|
|
13
|
+
**Audit / Quality(5)**:
|
|
14
|
+
| Skill | Invoke 時機 | Scope |
|
|
15
|
+
|-------|-----------|-------|
|
|
16
|
+
| `design-system-audit/` | user 要求 audit DS 本身 | DS 內部 spec/cva/SSOT 33 維度(Phase 0 自建 baseline)|
|
|
17
|
+
| `product-ui-audit/` | 「audit 這個 UI / 檢查 DS 用對嗎」| consumer UI 6 維檢核 |
|
|
18
|
+
| `component-quality-gate/` | 元件 merge / ready / check | 45+ 項 checklist + Phase 4 Ship 6 項 |
|
|
19
|
+
| `visual-audit/` | 視覺對齊 / 排版問題 / gap 錯 | pixel-level Layer A + B |
|
|
20
|
+
| `code-quality-audit/` | 量化 clean code(any / dead export / file-size / long fn / circular dep / magic number)| chained by /design-system-audit Dim 27 |
|
|
21
|
+
|
|
22
|
+
**Performance / UX(2)**:
|
|
23
|
+
| `performance-audit/` | 「這元件效能如何」 | render / memo / bundle |
|
|
24
|
+
| `ux-audit/` | 「鍵盤用不了 / focus 跑飛 / 無障礙」 | keyboard / ARIA / animation |
|
|
25
|
+
|
|
26
|
+
**Build-phase workflow(3)**:
|
|
27
|
+
| `new-component/` | 「做新元件 X」 | 6-phase 建新元件 |
|
|
28
|
+
| `prototype/` | 「做 prototype / MVP / 原型」 | exploration + Phase 3.5 gate |
|
|
29
|
+
| `delivery-handoff/` | 「要交付 / handoff」 | figma-like 交付包 |
|
|
30
|
+
|
|
31
|
+
**Story 層(2)**:
|
|
32
|
+
| `story-writing/` | 「寫 story / 補 anatomy / principles story」 | 6-story 結構 + 範例品質 |
|
|
33
|
+
| `story-auto-compile-migrate/` | 「migrate 元件到 auto-compile」/ auto-chained by audit Dim 23 | 批次加 `componentMeta` export + spec YAML frontmatter(Phase 1+2 migration) |
|
|
34
|
+
|
|
35
|
+
**Governance(6)**:
|
|
36
|
+
| `knowledge-prune/` | 季度 / CLAUDE.md > 800 / MEMORY.md > 20 / audit 報 sprawl | 治理冗贅深度 prune |
|
|
37
|
+
| `governance-health/` | 月度 / auto-chain by audit | continuous metric monitor + auto-propose |
|
|
38
|
+
| `propose-options/` | 給 option A/B/C 前必走 M18 4-Q gate | M8 benchmark / M17 SSOT / Rule-of-3 / M10 下游 |
|
|
39
|
+
| `scan-similar-bugs/` | 修 bug 後 M10 mechanical exhaustive scan | DS-wide 同類 bug 全清 |
|
|
40
|
+
| `codify-corrections/` | user 糾正後 codify 到正確 home(memory / CLAUDE.md / spec / hook) | 跨 home 路由 |
|
|
41
|
+
| `ensure-canonical/` | user 說「確保 X 一定要 / 永不漂移」trigger phrase(M19)| 自動規劃 5-layer defense-in-depth(canonical+hook+skill+audit+verify),至少 3 層落地 |
|
|
42
|
+
|
|
43
|
+
## 這裡**不收**(反例 + 正確去處)
|
|
44
|
+
|
|
45
|
+
| 疑似要放這但其實不是 | 實際應去 | 為什麼 |
|
|
46
|
+
|-------------------|---------|--------|
|
|
47
|
+
| 單步驟 scaffold / one-shot action | `.claude/commands/` | skill 是多步驟 + checkpoints,命令是單步 |
|
|
48
|
+
| 自動機械檢查(pre/post tool) | `.claude/hooks/` | skill 需 AI 走流程,hook 是 tool-level 自動 |
|
|
49
|
+
| 每 session 都要的 signal rule | `CLAUDE.md` | skill 只在 invoke 時載入,會 miss signal |
|
|
50
|
+
| 隨時間變化的狀態(audit progress) | `memory/` | skill 是不變的 workflow,state 屬 memory |
|
|
51
|
+
| 元件 runtime primitive | `packages/design-system/src/patterns/` | skill 是 AI workflow,不是 UI code |
|
|
52
|
+
|
|
53
|
+
## 新 skill 的 criteria(必須全部通過)
|
|
54
|
+
|
|
55
|
+
1. **多步驟 workflow**(不只是單一 check,有明確 phase)
|
|
56
|
+
2. **有 user 決策 checkpoint**(AI 需要停下問 user)
|
|
57
|
+
3. **只在特定 invoke 情境需要**(不是每 session signal)
|
|
58
|
+
4. **重複使用 ≥ 3 次**(一次性任務不建 skill)
|
|
59
|
+
5. **invoke trigger 明確**(frontmatter description 裡清楚列出 user 說什麼會觸發)
|
|
60
|
+
|
|
61
|
+
任一不過 → 改建 command / hook / spec / CLAUDE.md rule,不硬塞。
|
|
62
|
+
|
|
63
|
+
## SKILL.md 必須包含
|
|
64
|
+
|
|
65
|
+
```markdown
|
|
66
|
+
---
|
|
67
|
+
name: skill-name-kebab-case
|
|
68
|
+
description: 一句話說明 skill 做什麼 + 何時 invoke(user 說哪些話觸發)
|
|
69
|
+
---
|
|
70
|
+
|
|
71
|
+
# Skill Title
|
|
72
|
+
|
|
73
|
+
## When to run
|
|
74
|
+
[明確觸發 trigger]
|
|
75
|
+
|
|
76
|
+
## Preconditions
|
|
77
|
+
[必要條件]
|
|
78
|
+
|
|
79
|
+
## Workflow
|
|
80
|
+
[Phase 1 / 2 / 3 + 每個 phase 的 checkpoint]
|
|
81
|
+
|
|
82
|
+
## References
|
|
83
|
+
[指向 references/*.md 的深度細節]
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
## 建立前必 Read
|
|
87
|
+
|
|
88
|
+
本 README + CLAUDE.md `# 治理 canonical` 的 Skill 章節 + 最接近的既有 skill 當範本。
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: bug-fix-rhythm
|
|
3
|
+
description: Batch-end-verify rhythm + parallel tool batch + user-listed N-rule MUST-ALL + claim runtime verify. Invoke when entering multi-fix session 或 user 列 numbered rules. Replaces M32(c)(d)(h1)(h2) sub-invariants(2026-05-12 split per Knowledge-Prune Checkpoint 2)。
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# /bug-fix-rhythm — 多 fix session 的 rhythm canonical
|
|
7
|
+
|
|
8
|
+
**目的**:當 session 有 ≥ 2 fixes(常見 visual bug session / user 列 N 條 numbered 規則),走 batch-end-verify rhythm,而非 per-fix verify cycle waste。**M32 split 後 (c)(d)(h1)(h2) 的 home**。
|
|
9
|
+
|
|
10
|
+
**對齊**:
|
|
11
|
+
- CLAUDE.md mindset #6「大原則吸收瑣碎」+ M14「對話結論 AUTO integrate」
|
|
12
|
+
- Bazel incremental-build / GitHub Actions matrix-batch idiom(per-step incremental = waste,batch-end = canonical)
|
|
13
|
+
- Anthropic Claude Code prompt engineering「single-message multi-tool-call」canonical
|
|
14
|
+
- Toyota TPS jidoka(per-station per-item verify,不可 skip 任何 item)
|
|
15
|
+
|
|
16
|
+
## When to invoke
|
|
17
|
+
|
|
18
|
+
**強制 auto-chain**:
|
|
19
|
+
- multi-issue session 內 ≥ 2 fix 待處理(visual / behavior / code 任 mix)
|
|
20
|
+
- user 列 numbered N 條規則(「規則 1...規則 N」/「Q1...QN」/ image 標 1234)→ 視作 **MUST-ALL checklist**
|
|
21
|
+
|
|
22
|
+
**手動 invoke**:user 明言「批 fix」「一次做完」「跑完再驗」「列規則」
|
|
23
|
+
|
|
24
|
+
**不 invoke**(對齊 Anthropic Best Practice 小修 skip):
|
|
25
|
+
- 單一 surgical fix(無 numbered rule + 無 cross-component)— per-fix verify 即可
|
|
26
|
+
- pure refactor / typo / import cleanup
|
|
27
|
+
- spec.md docs only
|
|
28
|
+
|
|
29
|
+
## Non-goals
|
|
30
|
+
|
|
31
|
+
- 不擴展到「audit 7 維」(那是 `/design-system-audit`)
|
|
32
|
+
- 不取代 `/scan-similar-bugs`(那是 fix 後 root-pattern scan;本 skill 是 fix-過程 rhythm)
|
|
33
|
+
- 不動 canonical 語意(走 audit-vs-execute STOP 提議)
|
|
34
|
+
|
|
35
|
+
---
|
|
36
|
+
|
|
37
|
+
## Workflow(4 phases)
|
|
38
|
+
|
|
39
|
+
### Phase 0 — Intake & MUST-ALL checklist 化(原 M32(h1))
|
|
40
|
+
|
|
41
|
+
讀 user message:
|
|
42
|
+
|
|
43
|
+
**If user 列 numbered rules**(「規則 1: X / 規則 2: Y / ...」/「Q1 / Q2 / ...」/ image 標號 / bulleted list)→ 抽出 **MUST-ALL checklist**:
|
|
44
|
+
|
|
45
|
+
```markdown
|
|
46
|
+
## MUST-ALL checklist(per-rule 不可下放)
|
|
47
|
+
- [ ] 規則 1: <verbatim user wording> — 對應 fix: <target>
|
|
48
|
+
- [ ] 規則 2: <verbatim user wording> — 對應 fix: <target>
|
|
49
|
+
- ...
|
|
50
|
+
- [ ] 規則 N: <verbatim user wording> — 對應 fix: <target>
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
**禁止**:
|
|
54
|
+
- 把 N 條視作 ranked-priority(「先修 1-3,4 之後再說」)
|
|
55
|
+
- 漏 N 條中第 K 條當「做完」report
|
|
56
|
+
- 改寫 user wording 為自己 paraphrase(verbatim 保留)
|
|
57
|
+
|
|
58
|
+
### Phase 1 — Parallel tool batch(原 M32(d))
|
|
59
|
+
|
|
60
|
+
Read / Grep / Glob 多檔需求 → **single message multi-tool-call**:
|
|
61
|
+
|
|
62
|
+
```
|
|
63
|
+
✓ Good: 1 message with [Read A, Read B, Read C, Grep D, Grep E] (~2s)
|
|
64
|
+
✗ Bad : 5 messages sequential (~10s)
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
**Heuristic**:任何 tool call 之間**無 dependency**(後一個不需前一個結果) → 必 parallel。
|
|
68
|
+
|
|
69
|
+
對齊 Anthropic Claude Code best practice:「Maximize use of parallel tool calls where possible」。
|
|
70
|
+
|
|
71
|
+
### Phase 2 — Batch fix(原 M32(c))
|
|
72
|
+
|
|
73
|
+
每 fix 用 Edit(不 Write,降風險)。**禁止 per-fix tsc / audit cycle**:
|
|
74
|
+
|
|
75
|
+
```
|
|
76
|
+
✓ Good: [Edit A] [Edit B] [Edit C] [Edit D] → final tsc + audit + visual (once)
|
|
77
|
+
✗ Bad : [Edit A → tsc → audit → visual] [Edit B → tsc → audit → visual] ... (5× waste)
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
例外:某 fix 確實依賴前一 fix 的 type 結果 → sequential 必要時可,但 verify cycle 仍 batch-end-only。
|
|
81
|
+
|
|
82
|
+
### ⚠️ Checkpoint 1 — Substantive vs surgical 分流
|
|
83
|
+
|
|
84
|
+
每 fix 落地前 inline 判斷:
|
|
85
|
+
|
|
86
|
+
- **Surgical**(CLAUDE.md「Scope classifier — Surgical visual bug」):pixel / token / class adjustment, no new SSOT / API / cross-component → AUTO ship 此 fix
|
|
87
|
+
- **Substantive**(audit-vs-execute 分權):新 SSOT / 新 prop / 新 canonical meaning / cross-component semantic → **STOP propose**,等 user verbatim 拍板才 ship
|
|
88
|
+
|
|
89
|
+
混合 batch:surgical 部分 ship,substantive 部分 propose。**禁止**:substantive 偷渡進 surgical batch。
|
|
90
|
+
|
|
91
|
+
### Phase 3 — Final batch-end verify(原 M32(c)(h2))
|
|
92
|
+
|
|
93
|
+
全 fix 完成後**一次性**驗證:
|
|
94
|
+
|
|
95
|
+
```bash
|
|
96
|
+
npx tsc -b # type
|
|
97
|
+
npm run hooks:test # invariant
|
|
98
|
+
node scripts/visual-audit-<target>.mjs # pixel-quantified per M32(a)
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
**MUST-ALL re-check**(per Phase 0 checklist):
|
|
102
|
+
|
|
103
|
+
```markdown
|
|
104
|
+
## MUST-ALL verify report
|
|
105
|
+
- [x] 規則 1: ✓ verified via <tsc | audit script | pixel measurement | playwright>
|
|
106
|
+
- [x] 規則 2: ✓ verified via ...
|
|
107
|
+
- ...
|
|
108
|
+
- [x] 規則 N: ✓ verified via ...
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
**禁止**(原 M32(h2) claim runtime verify):
|
|
112
|
+
- 寫「不會有問題」「無 side-effect」「verified」「都實作完了」**沒**對應 verify trace
|
|
113
|
+
- code-reading 推論當「verified」
|
|
114
|
+
- ranked-priority 漏 N 條中第 K 條當「做完」
|
|
115
|
+
|
|
116
|
+
若某條無法 runtime verify → 明撤回 **「規則 K:未驗證,推論而已,user 真機 verify needed」**,不可假宣告。
|
|
117
|
+
|
|
118
|
+
對齊 M20 claim-verify gap(M20 是 stop-hook 機制;本 skill Phase 3 是 active workflow side)。
|
|
119
|
+
|
|
120
|
+
---
|
|
121
|
+
|
|
122
|
+
## ⚠️ Checkpoints(禁止跳)
|
|
123
|
+
|
|
124
|
+
### Checkpoint 1 — Phase 2 surgical vs substantive(見上)
|
|
125
|
+
|
|
126
|
+
### Checkpoint 2 — Phase 3 verify trace 缺漏
|
|
127
|
+
若 MUST-ALL N 條有 K 條無 verify trace → STOP report,先補 verify 再報 user。
|
|
128
|
+
|
|
129
|
+
### Checkpoint 3 — User-listed rule wording 改寫
|
|
130
|
+
若 Phase 0 抽 checklist 時改了 user wording → STOP,重抓 verbatim。
|
|
131
|
+
|
|
132
|
+
---
|
|
133
|
+
|
|
134
|
+
## 與其他 skill / hook 的關係
|
|
135
|
+
|
|
136
|
+
| Tool | Scope | 跟本 skill 關係 |
|
|
137
|
+
|---|---|---|
|
|
138
|
+
| `/scan-similar-bugs` | fix 後 DS-wide root-pattern scan | 本 skill batch-end-verify 後**才** chain `/scan-similar-bugs` |
|
|
139
|
+
| `/visual-audit` | 單次視覺對齊 | Phase 3 sub-step,本 skill 包它 |
|
|
140
|
+
| `/component-quality-gate` | stakeholder gate | 不重疊(stakeholder vs daily bug fix) |
|
|
141
|
+
| `stop_self_audit.sh`(hook) | claim-verify gap 攔 | 本 skill Phase 3 是 active side;hook 是 passive trip-wire |
|
|
142
|
+
| `check_pixel_quantified_audit.sh`(hook) | M32(a) audit script 必 pixel | 本 skill Phase 3 跑該 audit |
|
|
143
|
+
|
|
144
|
+
**3 層 防線**:
|
|
145
|
+
- **本 skill**(active workflow):MUST-ALL checklist + batch-end-verify rhythm
|
|
146
|
+
- **stop_self_audit.sh / check_codex_collab_5step.sh**(passive hook):claim-verify gap 攔
|
|
147
|
+
- **M20 / M32(a)**(meta-rule):上游 invariant
|
|
148
|
+
|
|
149
|
+
---
|
|
150
|
+
|
|
151
|
+
## 世界級對照
|
|
152
|
+
|
|
153
|
+
- **Bazel `bazel test //...`**:全 target 並行 + final report,而非 per-target sequential
|
|
154
|
+
- **GitHub Actions matrix**:N 個 job 並行,final aggregate verdict
|
|
155
|
+
- **Toyota TPS jidoka**:每 station per-item verify,**但** verify 是 station-end 而非 in-progress checkpoint
|
|
156
|
+
- **Anthropic Claude Code prompt eng**:「Maximize use of parallel tool calls」
|
|
157
|
+
- **Stripe / Linear engineering blog**:「batch deploy + single canary verify」over「per-PR canary」
|
|
158
|
+
|
|
159
|
+
---
|
|
160
|
+
|
|
161
|
+
## Self-improvement capture
|
|
162
|
+
|
|
163
|
+
每次 invoke 完寫:
|
|
164
|
+
- (a) Phase 0 抽 MUST-ALL 時 user wording 是否變形?
|
|
165
|
+
- (b) Phase 2 surgical/substantive 分流是否準確?(false-positive 偷渡記錄)
|
|
166
|
+
- (c) Phase 3 verify trace 有沒有「runtime verify needed」的條目漏標?
|
|
167
|
+
- (d) 新發現 numbered-rule pattern → 加進 Phase 0 抽取 heuristic
|
|
168
|
+
|
|
169
|
+
回填本 SKILL.md 或 references/。
|
|
170
|
+
|
|
171
|
+
---
|
|
172
|
+
|
|
173
|
+
## 歷史 absorbed failures(M32 split 來源)
|
|
174
|
+
|
|
175
|
+
2026-05-12 4 prior failures absorbed by M32 → split 後本 skill 承接 (c)(d)(h1)(h2):
|
|
176
|
+
1. cell-align audit「Δ=0 ALL PASS」但 user 抓 SKU/Qty 視覺垂直置中於 88px 高 row(audit 沒驗 Field collapse)
|
|
177
|
+
2. divider 2px audit「ALL PASS」但 pinned panel 邊仍 2px(audit 沒驗 pixel overlap)
|
|
178
|
+
3. breadcrumb tooltip audit「ALL PASS」但 user 連抓 hover 不 fire(audit 沒驗 Portal DOM bounding rect)
|
|
179
|
+
4. row-alignment audit「Δ=0 ALL PASS」(attr 對齊,Field collapse 沒抓)
|
|
180
|
+
|
|
181
|
+
具體 M32(a) pixel-quantified rule 仍在 meta-patterns.md,本 skill 是其 workflow side。
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: code-quality-audit
|
|
3
|
+
description: Clean code 量化稽核 — `any` 使用 / dead export / file size / long function / circular dep / magic number。補 `/design-system-audit` 只管「design canonical」的缺口。Invoke via /code-quality-audit scope=all(release / 季度)OR scope=changed(daily)OR scope=component:X(focused)。Auto-chain by `/design-system-audit --deep` Dim 27 + `/component-quality-gate` Ship phase + `/new-component` Phase 4.5。
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Code Quality Audit — Clean Code 量化稽核
|
|
7
|
+
|
|
8
|
+
Scope:**tsx / ts code hygiene**,跟 design canonical 正交。
|
|
9
|
+
|
|
10
|
+
## 為什麼要這 skill
|
|
11
|
+
|
|
12
|
+
`/design-system-audit`(全 dim per design-system-audit SSOT)管 design / spec / canonical correctness。但 **clean code 面向**(`any` 濫用 / dead export / 函式爆長 / circular dep / 檔案超標)**無任何 dim 覆蓋**。每次建元件 / audit / ship 都該跑這層。
|
|
13
|
+
|
|
14
|
+
## 6 個 check
|
|
15
|
+
|
|
16
|
+
| # | Check | Severity | 如何判定 |
|
|
17
|
+
|---|-------|---------|---------|
|
|
18
|
+
| 1 | `any` 使用 | P0 | grep `: any` / `as any` / `<any>` / `any[]` / `Record<X, any>`;支援 `// any-allow: {rationale}` 逃生口(同行或上一行) |
|
|
19
|
+
| 2 | File size(.tsx)| P0 > 800 / P1 > 500 | `wc -l`;budget 500 / transition cap 800;spec 同 `check_file_size_budget.sh` policy |
|
|
20
|
+
| 3 | Long function | P1 > 80 行 | naive:`function`/`const` 宣告到 matching `}` indent 行距 |
|
|
21
|
+
| 4 | Dead export | P1 | `export` 名稱在其他 src/ 檔無出現;exempt `*Props/Options/Config/Args/Context/Variants/Value` 型別 API 慣例 |
|
|
22
|
+
| 5 | Circular dep | P0 | DFS import graph,找 cycle |
|
|
23
|
+
| 6 | Magic number | P1 | 覆蓋不完整 → 由 `check_token_hygiene.sh` hook 層負責(primitive color / shadow / Tailwind v4 `[--foo]`);本 skill 不重複 |
|
|
24
|
+
|
|
25
|
+
## When to run
|
|
26
|
+
|
|
27
|
+
- **Daily**:`/code-quality-audit --scope=changed`(git diff)
|
|
28
|
+
- **Component ship**:`/component-quality-gate` Ship phase auto-chain
|
|
29
|
+
- **New component**:`/new-component` Phase 4.5 auto-chain
|
|
30
|
+
- **Release / 季度**:`/code-quality-audit --scope=all`
|
|
31
|
+
- **Focus one component**:`/code-quality-audit --scope=component:<Name>`
|
|
32
|
+
- **CI gate**:`node scripts/code-quality-audit.mjs --check`(P0 violation → exit 1)
|
|
33
|
+
|
|
34
|
+
## Workflow
|
|
35
|
+
|
|
36
|
+
1. Run `node scripts/code-quality-audit.mjs [--scope=<scope>]`
|
|
37
|
+
2. Triage findings into P0 / P1 / P2
|
|
38
|
+
3. Auto-fix trivial(unused imports,trivial `any` casts with obvious type)
|
|
39
|
+
4. STOP for user decision on:
|
|
40
|
+
- File-size P0(大 component architectural split)
|
|
41
|
+
- Circular dep(需設計層面重組)
|
|
42
|
+
- 無法 auto-type 的 `any`(需 design judgment 訂 proper type)
|
|
43
|
+
|
|
44
|
+
## 禁止
|
|
45
|
+
|
|
46
|
+
- 禁 silent 吞 `any`(必加 `// any-allow: {rationale}`)
|
|
47
|
+
- 禁把 dead export 直接刪(可能是 planned API surface);flag → user 決策
|
|
48
|
+
- 禁把 long function 硬拆(拆錯比爆長還糟);只提議,user sign-off
|
|
49
|
+
|
|
50
|
+
## Integration points
|
|
51
|
+
|
|
52
|
+
| Skill / Hook | How |
|
|
53
|
+
|---|---|
|
|
54
|
+
| `/design-system-audit` Dim 27 | `--deep` 必 chain 本 skill scope=all |
|
|
55
|
+
| `/component-quality-gate` Ship | chain 本 skill scope=component:{Name} |
|
|
56
|
+
| `/new-component` Phase 4.5 | 元件建完必跑 scope=component:{Name} |
|
|
57
|
+
| Hook `check_code_quality.sh` | PostToolUse Edit/Write on src/ — 只跑 any + file-size(quick) |
|
|
58
|
+
|
|
59
|
+
## References
|
|
60
|
+
|
|
61
|
+
- `scripts/code-quality-audit.mjs` — 實作
|
|
62
|
+
- `.claude/hooks/check_code_quality.sh` — per-edit lite check
|
|
63
|
+
- 相關:`check_token_hygiene.sh`(正交 — token 紀律 vs code 紀律)
|