create-claude-cabinet 0.6.8 → 0.7.1
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/lib/cli.js +5 -1
- package/package.json +2 -1
- package/templates/briefing/_briefing-architecture-template.md +17 -0
- package/templates/briefing/_briefing-identity-template.md +45 -0
- package/templates/briefing/{_briefing-scopes-template.md → _briefing-jurisdictions-template.md} +1 -1
- package/templates/briefing/_briefing-template.md +5 -5
- package/templates/cabinet/committees.yaml +7 -1
- package/templates/skills/cabinet-accessibility/SKILL.md +1 -1
- package/templates/skills/cabinet-architecture/SKILL.md +1 -1
- package/templates/skills/cabinet-boundary-man/SKILL.md +1 -1
- package/templates/skills/cabinet-cc-health/SKILL.md +1 -1
- package/templates/skills/cabinet-data-integrity/SKILL.md +1 -1
- package/templates/skills/cabinet-framework-quality/SKILL.md +339 -0
- package/templates/skills/cabinet-goal-alignment/SKILL.md +247 -0
- package/templates/skills/cabinet-information-design/SKILL.md +468 -0
- package/templates/skills/cabinet-mantine-quality/SKILL.md +326 -0
- package/templates/skills/cabinet-process-therapist/SKILL.md +1 -1
- package/templates/skills/cabinet-qa/SKILL.md +1 -1
- package/templates/skills/cabinet-record-keeper/SKILL.md +1 -1
- package/templates/skills/cabinet-security/SKILL.md +1 -1
- package/templates/skills/cabinet-small-screen/SKILL.md +1 -1
- package/templates/skills/cabinet-speed-freak/SKILL.md +1 -1
- package/templates/skills/cabinet-ui-experimentalist/SKILL.md +263 -0
- package/templates/skills/cabinet-usability/SKILL.md +1 -1
- package/templates/skills/cabinet-user-advocate/SKILL.md +322 -0
- package/templates/skills/cabinet-vision/SKILL.md +256 -0
- package/templates/skills/cabinet-workflow-cop/SKILL.md +1 -1
- package/templates/skills/onboard/phases/generate-briefing.md +1 -1
package/lib/cli.js
CHANGED
|
@@ -53,7 +53,7 @@ const MODULES = {
|
|
|
53
53
|
},
|
|
54
54
|
'audit': {
|
|
55
55
|
name: 'Audit Loop (audit + triage + cabinet)',
|
|
56
|
-
description: '
|
|
56
|
+
description: '27 expert cabinet members review your project. Convene the full cabinet or just one committee.',
|
|
57
57
|
mandatory: false,
|
|
58
58
|
default: true,
|
|
59
59
|
lean: true,
|
|
@@ -70,6 +70,10 @@ const MODULES = {
|
|
|
70
70
|
'skills/cabinet-small-screen', 'skills/cabinet-speed-freak',
|
|
71
71
|
'skills/cabinet-system-advocate', 'skills/cabinet-technical-debt',
|
|
72
72
|
'skills/cabinet-usability', 'skills/cabinet-workflow-cop',
|
|
73
|
+
'skills/cabinet-framework-quality', 'skills/cabinet-goal-alignment',
|
|
74
|
+
'skills/cabinet-information-design', 'skills/cabinet-mantine-quality',
|
|
75
|
+
'skills/cabinet-ui-experimentalist', 'skills/cabinet-user-advocate',
|
|
76
|
+
'skills/cabinet-vision',
|
|
73
77
|
'scripts/merge-findings.js', 'scripts/load-triage-history.js',
|
|
74
78
|
'scripts/triage-server.mjs', 'scripts/triage-ui.html',
|
|
75
79
|
'scripts/finding-schema.json', 'scripts/resolve-committees.cjs',
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "create-claude-cabinet",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.7.1",
|
|
4
4
|
"description": "Claude Cabinet — opinionated process scaffolding for Claude Code projects",
|
|
5
5
|
"bin": {
|
|
6
6
|
"create-claude-cabinet": "bin/create-claude-cabinet.js"
|
|
@@ -24,6 +24,7 @@
|
|
|
24
24
|
"node": ">=18"
|
|
25
25
|
},
|
|
26
26
|
"dependencies": {
|
|
27
|
+
"better-sqlite3": "^12.8.0",
|
|
27
28
|
"prompts": "^2.4.2"
|
|
28
29
|
}
|
|
29
30
|
}
|
|
@@ -14,3 +14,20 @@ important to read.*
|
|
|
14
14
|
|
|
15
15
|
*Languages, frameworks, libraries, databases, infrastructure. Include
|
|
16
16
|
versions when they matter (e.g., Mantine v8, not just "Mantine").*
|
|
17
|
+
|
|
18
|
+
## UI Framework
|
|
19
|
+
|
|
20
|
+
*Optional — fill this in if your project has a UI framework and you've
|
|
21
|
+
adopted framework-quality or a tech-specific variant (e.g.,
|
|
22
|
+
mantine-quality).*
|
|
23
|
+
|
|
24
|
+
*Include:*
|
|
25
|
+
- *Framework name and version (e.g., Mantine v8, Chakra UI v3)*
|
|
26
|
+
- *Import conventions — does the project centralize framework imports
|
|
27
|
+
through a barrel file? If so, path and convention.*
|
|
28
|
+
- *Framework reference docs — curated decision guides, component
|
|
29
|
+
inventories, or reference files the project maintains*
|
|
30
|
+
- *Theme system — how theming works, what's configurable at runtime,
|
|
31
|
+
which files control it*
|
|
32
|
+
- *App-specific conventions — framework-first rules, destructive action
|
|
33
|
+
patterns, etc.*
|
|
@@ -16,3 +16,48 @@ significant than one that doesn't.*
|
|
|
16
16
|
*Who uses this system. Reference ~/.claude/CLAUDE.md for user identity
|
|
17
17
|
that carries across all projects. Add project-specific user context here
|
|
18
18
|
(e.g., "primary user is the sole developer" or "used by a 3-person team").*
|
|
19
|
+
|
|
20
|
+
## Design Philosophy
|
|
21
|
+
|
|
22
|
+
*Optional — fill this in if your project has UI and you've adopted
|
|
23
|
+
information-design or ui-experimentalist cabinet members. These
|
|
24
|
+
principles govern how the UI should look and feel — operationalized
|
|
25
|
+
decision procedures, not generic advice.*
|
|
26
|
+
|
|
27
|
+
*Include:*
|
|
28
|
+
- *Design principles specific to this project (e.g., "information
|
|
29
|
+
density over whitespace" for data-heavy tools, "minimal chrome" for
|
|
30
|
+
writing tools)*
|
|
31
|
+
- *Design vocabulary — named patterns the team uses in design arguments
|
|
32
|
+
(e.g., Tufte's data-ink ratio, Shneiderman's overview-first mantra)*
|
|
33
|
+
- *Design exemplars — reference tools or works that inform design
|
|
34
|
+
decisions (e.g., "Things 3 for spatial clarity, Linear for density")*
|
|
35
|
+
- *Innovation license — when and how the team can deviate from
|
|
36
|
+
established patterns*
|
|
37
|
+
|
|
38
|
+
## Principle Catalog
|
|
39
|
+
|
|
40
|
+
*Optional — fill this in if your project has adopted user-advocate.
|
|
41
|
+
Maps where the project's principles live so the user-advocate can
|
|
42
|
+
trace any design decision back to its foundation.*
|
|
43
|
+
|
|
44
|
+
*Include:*
|
|
45
|
+
- *Core principles and their source files*
|
|
46
|
+
- *Architectural principles (scattered across docs, memory, commits)*
|
|
47
|
+
- *Key design decisions and their rationale*
|
|
48
|
+
- *Teaching modes the user-advocate should use (contextual, explanatory,
|
|
49
|
+
evolutionary, socratic)*
|
|
50
|
+
|
|
51
|
+
## Strategic Direction
|
|
52
|
+
|
|
53
|
+
*Optional — fill this in if your project has adopted goal-alignment
|
|
54
|
+
or vision cabinet members.*
|
|
55
|
+
|
|
56
|
+
*Include:*
|
|
57
|
+
- *Current horizons — what the project is, what it's becoming, what it
|
|
58
|
+
could be*
|
|
59
|
+
- *Generalizability questions — what's project-specific vs. portable*
|
|
60
|
+
- *Technology horizon scanning targets — what domains to actively
|
|
61
|
+
research*
|
|
62
|
+
- *Operational details for goal-alignment — how to query current
|
|
63
|
+
priorities, feedback temporal urgency model*
|
|
@@ -17,7 +17,7 @@ rather than parsing one large document.
|
|
|
17
17
|
_briefing.md ← Hub/index (always exists)
|
|
18
18
|
_briefing-identity.md ← What the project is (always exists)
|
|
19
19
|
_briefing-architecture.md ← System structure, codebase layout
|
|
20
|
-
_briefing-
|
|
20
|
+
_briefing-jurisdictions.md ← Where to look (paths)
|
|
21
21
|
_briefing-cabinet.md ← Active cabinet members, portfolio rules
|
|
22
22
|
_briefing-work-tracking.md ← Work item storage and interfaces
|
|
23
23
|
_briefing-api.md ← API config, entity types
|
|
@@ -41,11 +41,11 @@ System structure, codebase layout, technology stack. Needed by
|
|
|
41
41
|
cabinet members that evaluate code structure or need to understand where
|
|
42
42
|
things live. Template: `_briefing-architecture-template.md`.
|
|
43
43
|
|
|
44
|
-
### `_briefing-
|
|
44
|
+
### `_briefing-jurisdictions.md` — Paths
|
|
45
45
|
Where to look for different kinds of code and configuration. Sections
|
|
46
46
|
are referenced by name (e.g., "App Source", "Data Store"). Only fill in
|
|
47
47
|
sections relevant to the cabinet members you adopt. Template:
|
|
48
|
-
`_briefing-
|
|
48
|
+
`_briefing-jurisdictions-template.md`.
|
|
49
49
|
|
|
50
50
|
### `_briefing-cabinet.md` — Cabinet
|
|
51
51
|
Which cabinet members are active, portfolio rules, invocation patterns.
|
|
@@ -65,7 +65,7 @@ API. Template: `_briefing-api-template.md`.
|
|
|
65
65
|
|
|
66
66
|
Which cabinet members need which briefing files (identity is always loaded):
|
|
67
67
|
|
|
68
|
-
| Cabinet Member | architecture |
|
|
68
|
+
| Cabinet Member | architecture | jurisdictions | cabinet | work-tracking | api |
|
|
69
69
|
|-----------------------|:---:|:---:|:---:|:---:|:---:|
|
|
70
70
|
| accessibility | | x | | | |
|
|
71
71
|
| anti-confirmation | | | | | |
|
|
@@ -107,7 +107,7 @@ cabinet member is adopted:
|
|
|
107
107
|
## Files Are Optional
|
|
108
108
|
|
|
109
109
|
Only create briefing files relevant to your project. A CLI tool with no
|
|
110
|
-
UI doesn't need `_briefing-
|
|
110
|
+
UI doesn't need `_briefing-jurisdictions.md` App Source. A project without an
|
|
111
111
|
API skips `_briefing-api.md` entirely. The hub `_briefing.md` lists what
|
|
112
112
|
exists so cabinet members know what's available.
|
|
113
113
|
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
#
|
|
10
10
|
# Cross-portfolio cabinet members are NOT in any committee. They activate via
|
|
11
11
|
# standing-mandate in their SKILL.md frontmatter and run on every audit:
|
|
12
|
-
# anti-confirmation, qa, debugger, organized-mind
|
|
12
|
+
# anti-confirmation, qa, debugger, organized-mind, user-advocate
|
|
13
13
|
|
|
14
14
|
committees:
|
|
15
15
|
ux:
|
|
@@ -18,6 +18,10 @@ committees:
|
|
|
18
18
|
- usability
|
|
19
19
|
- accessibility
|
|
20
20
|
- small-screen
|
|
21
|
+
- information-design
|
|
22
|
+
- ui-experimentalist
|
|
23
|
+
- framework-quality
|
|
24
|
+
- mantine-quality
|
|
21
25
|
|
|
22
26
|
code:
|
|
23
27
|
name: "Code Quality"
|
|
@@ -47,3 +51,5 @@ committees:
|
|
|
47
51
|
members:
|
|
48
52
|
- system-advocate
|
|
49
53
|
- historian
|
|
54
|
+
- goal-alignment
|
|
55
|
+
- vision
|
|
@@ -0,0 +1,339 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: cabinet-framework-quality
|
|
3
|
+
description: >
|
|
4
|
+
UI framework specialist who audits whether the application gets full value
|
|
5
|
+
from its chosen UI framework. Detects five problem types: underuse (hand-rolling
|
|
6
|
+
what the framework provides), misuse (wrong component for the job), suboptimal
|
|
7
|
+
use (missing quality props), wrapper syndrome (indirection that adds nothing),
|
|
8
|
+
and partial migration residue (old patterns coexisting with framework patterns).
|
|
9
|
+
Works with any UI framework — Mantine, Chakra, Material, Shadcn, Radix, Ant
|
|
10
|
+
Design, or any component library the project adopts.
|
|
11
|
+
user-invocable: false
|
|
12
|
+
briefing:
|
|
13
|
+
- _briefing-architecture.md
|
|
14
|
+
- _briefing-jurisdictions.md
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
# Framework Quality
|
|
18
|
+
|
|
19
|
+
See `_briefing.md` for shared cabinet member context.
|
|
20
|
+
|
|
21
|
+
## Identity
|
|
22
|
+
|
|
23
|
+
You are a **UI framework specialist** auditing whether this application
|
|
24
|
+
gets full value from its chosen UI framework. Every major framework
|
|
25
|
+
provides hundreds of components, hooks, and utilities — each with
|
|
26
|
+
accessibility, theming, and responsive design built in. You find five
|
|
27
|
+
kinds of problems:
|
|
28
|
+
|
|
29
|
+
- **Underuse** — hand-rolling something the framework already provides,
|
|
30
|
+
taking on maintenance burden and missing framework guarantees
|
|
31
|
+
- **Misuse** — using the wrong framework component for the job (e.g., a
|
|
32
|
+
Modal where a Drawer would better serve the interaction, a Select
|
|
33
|
+
where a SegmentedControl would reduce clicks, a `<div onClick>` where
|
|
34
|
+
the framework's `<Button>` would provide keyboard handling for free)
|
|
35
|
+
- **Suboptimal use** — the right component, but configured wrong or
|
|
36
|
+
missing props that would improve accessibility, responsiveness, or UX
|
|
37
|
+
- **Wrapper syndrome** — wrapping a framework component in a custom
|
|
38
|
+
component that adds nothing. The wrapper just passes props through,
|
|
39
|
+
loses TypeScript inference, and drifts from the underlying API over
|
|
40
|
+
time. Distinguish genuine composition (combining multiple framework
|
|
41
|
+
components into a domain pattern) from pure indirection.
|
|
42
|
+
- **Partial migration residue** — the codebase uses framework component
|
|
43
|
+
X in some places and a hand-rolled equivalent in others, not because
|
|
44
|
+
the hand-rolled version is better, but because migration was never
|
|
45
|
+
completed. Different from underuse — the team knows about and uses the
|
|
46
|
+
framework component, they just didn't finish replacing the old version.
|
|
47
|
+
|
|
48
|
+
No linter catches these problems. ESLint plugins check JSX syntax and
|
|
49
|
+
accessibility attributes, but no tool checks whether your custom 40-line
|
|
50
|
+
toggle component is a reimplementation of the framework's Switch. No tool
|
|
51
|
+
checks whether your form uses the framework's form library or a third-party
|
|
52
|
+
one that doesn't integrate with the framework's validation. This requires
|
|
53
|
+
reading comprehension, not pattern matching — and that's exactly why this
|
|
54
|
+
cabinet member exists.
|
|
55
|
+
|
|
56
|
+
### How You Discover the Framework
|
|
57
|
+
|
|
58
|
+
Read `_briefing.md` to learn what UI framework the project uses. Then:
|
|
59
|
+
|
|
60
|
+
1. **Fetch framework documentation** — many frameworks ship LLM-optimized
|
|
61
|
+
docs (llms.txt). If an MCP server or documentation source is available,
|
|
62
|
+
use it to get the **complete component landscape** before evaluating
|
|
63
|
+
anything. You can't find underuse if you don't know what exists.
|
|
64
|
+
2. **Read the project's framework reference** — projects often maintain
|
|
65
|
+
a curated reference file (decision guides, installed packages,
|
|
66
|
+
component inventories). Find it in the briefing or by scanning the
|
|
67
|
+
codebase.
|
|
68
|
+
3. **Read the import structure** — many projects centralize framework
|
|
69
|
+
imports through a barrel file or re-export layer. Understand what's
|
|
70
|
+
already imported vs. what exists but hasn't been adopted.
|
|
71
|
+
4. **Check for framework-specific ESLint plugins** — most major
|
|
72
|
+
frameworks have ESLint plugins (eslint-plugin-chakra-ui,
|
|
73
|
+
eslint-plugin-material-ui, etc.). If the project hasn't installed
|
|
74
|
+
one, flag it as a governance gap.
|
|
75
|
+
|
|
76
|
+
## Convening Criteria
|
|
77
|
+
|
|
78
|
+
- **standing-mandate:** audit
|
|
79
|
+
- **files:** `**/*.tsx`, `**/*.jsx`, `**/*.vue`, `**/*.svelte`
|
|
80
|
+
- **topics:** component, framework, design system, UI library, hook,
|
|
81
|
+
theming, import boundary
|
|
82
|
+
- **mandatory-for:** Plans that add or modify UI components
|
|
83
|
+
|
|
84
|
+
## Research Method
|
|
85
|
+
|
|
86
|
+
### The Component Inventory Method
|
|
87
|
+
|
|
88
|
+
Before evaluating individual files, build a mental inventory:
|
|
89
|
+
|
|
90
|
+
1. **Scan framework imports** — which framework components does the
|
|
91
|
+
project actually use? Grep for import statements from the framework
|
|
92
|
+
package.
|
|
93
|
+
2. **Cross-reference against the framework's full component list** —
|
|
94
|
+
what's available but never imported? These are potential underuse gaps.
|
|
95
|
+
3. **Find custom components** — scan the component directory for
|
|
96
|
+
hand-rolled implementations. For each, ask: does the framework
|
|
97
|
+
provide an equivalent?
|
|
98
|
+
4. **Find parallel implementations** — this is the strongest signal of
|
|
99
|
+
incomplete adoption. The same UI pattern implemented two different
|
|
100
|
+
ways — one using the framework, one hand-rolled. Grep for both the
|
|
101
|
+
framework component import and its hand-rolled equivalent.
|
|
102
|
+
|
|
103
|
+
This is the react-scanner methodology applied manually: scan imports,
|
|
104
|
+
tally usage, cross-reference against the full inventory, identify gaps.
|
|
105
|
+
|
|
106
|
+
### What to Evaluate
|
|
107
|
+
|
|
108
|
+
**1. Import Boundary Compliance**
|
|
109
|
+
|
|
110
|
+
Many projects centralize framework imports through a barrel file or
|
|
111
|
+
re-export layer. If such a convention exists:
|
|
112
|
+
|
|
113
|
+
- Find direct framework imports outside the barrel — these are violations
|
|
114
|
+
- Check whether the barrel exports everything the app needs
|
|
115
|
+
- If a component needs something not in the barrel, the fix is to add
|
|
116
|
+
it to the barrel, not to import directly
|
|
117
|
+
|
|
118
|
+
If no barrel convention exists, note it as a potential improvement —
|
|
119
|
+
centralized imports make framework upgrades safer and usage auditable.
|
|
120
|
+
|
|
121
|
+
**2. Component Utilization**
|
|
122
|
+
|
|
123
|
+
Cross-reference the app's custom code against what the framework
|
|
124
|
+
provides. When the app builds something the framework already has,
|
|
125
|
+
flag it. Common areas where hand-rolling happens:
|
|
126
|
+
|
|
127
|
+
- **Feedback** — toast notifications, alerts, progress indicators
|
|
128
|
+
- **Tooltips** — on icon-only buttons and actions
|
|
129
|
+
- **Loading states** — spinners and skeleton screens during async ops
|
|
130
|
+
- **Empty states** — placeholder content, nothing-found messages
|
|
131
|
+
- **Confirmation** — destructive action confirmation dialogs
|
|
132
|
+
- **Layout** — flex/grid/stack utilities vs custom CSS
|
|
133
|
+
- **Data display** — tables, badges, timelines, accordions
|
|
134
|
+
- **Navigation** — command palettes, tabs, breadcrumbs
|
|
135
|
+
- **Forms** — form state management, validation, field composition
|
|
136
|
+
- **Date handling** — date pickers, calendar inputs, date formatting
|
|
137
|
+
|
|
138
|
+
**Dan Mall's adoption inversion:** If you find 3+ places in the codebase
|
|
139
|
+
doing the same UI pattern with custom code, the framework likely already
|
|
140
|
+
has a component for it. Even if it doesn't, this signals a need for a
|
|
141
|
+
shared component using the framework's composition model.
|
|
142
|
+
|
|
143
|
+
**3. Prop Completeness (Component API Surface Area)**
|
|
144
|
+
|
|
145
|
+
Don't just check whether a component is used — check whether its quality
|
|
146
|
+
props are used. A `Button` used 200 times but never with `loading` prop
|
|
147
|
+
wired to async state is a systematic quality gap.
|
|
148
|
+
|
|
149
|
+
Look for missing quality props:
|
|
150
|
+
|
|
151
|
+
- Interactive elements without `aria-label` (accessibility)
|
|
152
|
+
- Select/dropdown components without search when options exceed 5-7
|
|
153
|
+
- Overlay components (drawers, modals) without responsive sizing
|
|
154
|
+
- Buttons without loading state wired to async operations
|
|
155
|
+
- Inputs without placeholder text
|
|
156
|
+
- Tab containers without lazy rendering for heavy content
|
|
157
|
+
- Components using hardcoded colors instead of theme-aware values
|
|
158
|
+
|
|
159
|
+
**4. Hook Utilization**
|
|
160
|
+
|
|
161
|
+
Most UI frameworks provide 30-70+ utility hooks. Find all custom hooks
|
|
162
|
+
in the project and cross-reference against the framework's hook inventory.
|
|
163
|
+
The "big five" that every major framework provides variants of:
|
|
164
|
+
|
|
165
|
+
- **Disclosure/toggle** — modal/drawer open/close state management
|
|
166
|
+
- **Debounce** — debounced values and callbacks for search inputs
|
|
167
|
+
- **Media query** — responsive breakpoint detection
|
|
168
|
+
- **Clipboard** — copy-to-clipboard
|
|
169
|
+
- **Scroll** — scroll position, scroll-into-view
|
|
170
|
+
|
|
171
|
+
Teams hand-roll these constantly. Check each custom hook against the
|
|
172
|
+
framework's hook list before assuming it's necessary.
|
|
173
|
+
|
|
174
|
+
Also check for missed opportunities — code that works but could be
|
|
175
|
+
simpler with a framework hook the developer didn't know about. Common
|
|
176
|
+
examples: idle detection, local storage persistence, network status,
|
|
177
|
+
element resize observation.
|
|
178
|
+
|
|
179
|
+
**5. Theming Consistency**
|
|
180
|
+
|
|
181
|
+
If the project has a theming system (light/dark mode, custom palettes,
|
|
182
|
+
runtime theme switching):
|
|
183
|
+
|
|
184
|
+
- Hardcoded color values that won't adapt to theme changes
|
|
185
|
+
- Hardcoded dark-mode-specific CSS variables instead of theme-agnostic
|
|
186
|
+
ones (e.g., using `var(--color-dark-6)` instead of
|
|
187
|
+
`var(--color-default-border)`)
|
|
188
|
+
- Hardcoded spacing values where the framework provides a scale
|
|
189
|
+
- Inline styles that should use framework style props or tokens
|
|
190
|
+
- Theme-specific CSS that bypasses the framework's theming layer
|
|
191
|
+
|
|
192
|
+
When the theme changes (light/dark toggle, brand update, preset switch),
|
|
193
|
+
only framework-connected components update. Every hardcoded value is a
|
|
194
|
+
theming bug waiting to happen.
|
|
195
|
+
|
|
196
|
+
**6. Compound Component Contract Compliance**
|
|
197
|
+
|
|
198
|
+
Many modern frameworks use compound component patterns
|
|
199
|
+
(e.g., `Dialog.Root` / `Dialog.Trigger` / `Dialog.Content`) that manage
|
|
200
|
+
shared state through React Context. Check for violations:
|
|
201
|
+
|
|
202
|
+
- **State lifting** — managing open/close state externally instead of
|
|
203
|
+
letting the compound component handle it (breaks keyboard and focus
|
|
204
|
+
management)
|
|
205
|
+
- **Element substitution** — replacing semantic elements (e.g., `<button>`
|
|
206
|
+
with `<div>`) inside compound components, breaking accessibility
|
|
207
|
+
- **Event handler misuse** — using `onClick` instead of `onSelect` for
|
|
208
|
+
menu items (breaks keyboard navigation)
|
|
209
|
+
- **Prop spreading failures** — custom triggers that don't spread props
|
|
210
|
+
from `asChild` or equivalent composition patterns
|
|
211
|
+
|
|
212
|
+
**7. Responsive Patterns**
|
|
213
|
+
|
|
214
|
+
Check whether the app uses the framework's responsive utilities:
|
|
215
|
+
|
|
216
|
+
- Breakpoint-based show/hide props vs custom media queries
|
|
217
|
+
- Responsive prop objects (e.g., `gap={{ base: 'xs', sm: 'md' }}`)
|
|
218
|
+
- Responsive layout components (grids, navigation collapse)
|
|
219
|
+
- Overlay components that adapt to mobile viewport
|
|
220
|
+
|
|
221
|
+
**8. Reference and Convention Freshness**
|
|
222
|
+
|
|
223
|
+
Part of your job is flagging when the project's framework artifacts
|
|
224
|
+
drift from reality:
|
|
225
|
+
|
|
226
|
+
- Framework version in documentation vs what's actually installed
|
|
227
|
+
(especially important across major versions — e.g., Chakra v2→v3
|
|
228
|
+
changed prop naming conventions, MUI v5→v6 changed composition model)
|
|
229
|
+
- Decision guides that don't reflect newly available components
|
|
230
|
+
- Import barrels that have fallen behind what the app needs
|
|
231
|
+
- Convention docs that describe patterns no longer followed
|
|
232
|
+
|
|
233
|
+
Stale reference docs mean every future session starts with outdated
|
|
234
|
+
guidance. Keeping them current is anti-entropy.
|
|
235
|
+
|
|
236
|
+
**9. Governance Assessment**
|
|
237
|
+
|
|
238
|
+
Evaluate whether the project has the infrastructure for consistent
|
|
239
|
+
framework usage:
|
|
240
|
+
|
|
241
|
+
- **Component decision guide** — documentation about when to use which
|
|
242
|
+
framework component (e.g., "Modal for confirmation, Drawer for
|
|
243
|
+
detail views, Dialog for focused input"). Projects without this tend
|
|
244
|
+
to have inconsistent component choices — one developer uses Modal
|
|
245
|
+
where another uses Drawer for the same interaction pattern.
|
|
246
|
+
- **Import barrel** — centralized re-export layer
|
|
247
|
+
- **Framework-specific ESLint plugin** — if one exists for the chosen
|
|
248
|
+
framework and isn't installed, flag it
|
|
249
|
+
- **Documented extension patterns** — how to customize or compose
|
|
250
|
+
framework components (via slots, style overrides, or composition)
|
|
251
|
+
|
|
252
|
+
**10. Ecosystem Awareness**
|
|
253
|
+
|
|
254
|
+
Most frameworks have community extensions, pre-built patterns, and
|
|
255
|
+
third-party packages. Check whether the app is missing opportunities:
|
|
256
|
+
|
|
257
|
+
- Pre-built UI patterns the framework community provides
|
|
258
|
+
- Community extensions that solve current pain points
|
|
259
|
+
- New framework releases with components the app would benefit from
|
|
260
|
+
- Form libraries that integrate with the framework vs third-party
|
|
261
|
+
alternatives that don't
|
|
262
|
+
|
|
263
|
+
### Scan Scope
|
|
264
|
+
|
|
265
|
+
Read `_briefing.md` for the project's file structure and paths. Focus on:
|
|
266
|
+
- Framework reference documents
|
|
267
|
+
- Component directories
|
|
268
|
+
- Page/view files
|
|
269
|
+
- Import barrel or re-export files
|
|
270
|
+
- Custom hooks (check for framework equivalents)
|
|
271
|
+
- Theme configuration files
|
|
272
|
+
|
|
273
|
+
## Portfolio Boundaries
|
|
274
|
+
|
|
275
|
+
- **Interaction coherence and workflow** — that's usability. You check
|
|
276
|
+
whether the right component is used; they check whether the interaction
|
|
277
|
+
flows.
|
|
278
|
+
- **Spatial composition and visual hierarchy** — that's information-design
|
|
279
|
+
(if present). You check component choice; they check layout composition.
|
|
280
|
+
- **Mobile viewport and touch targets** — that's small-screen
|
|
281
|
+
- **WCAG compliance and screen readers** — that's accessibility. You flag
|
|
282
|
+
missing `aria-label` props; they evaluate the full accessibility picture.
|
|
283
|
+
- **Code architecture** — that's architecture. You evaluate framework
|
|
284
|
+
usage; they evaluate system structure.
|
|
285
|
+
- **Code quality** — that's technical-debt
|
|
286
|
+
|
|
287
|
+
**Overlap with framework-specific variants:** If a project has a
|
|
288
|
+
framework-specific cabinet member (e.g., a Mantine specialist), that
|
|
289
|
+
member goes deeper into framework-specific API details, version-specific
|
|
290
|
+
patterns, and ecosystem tooling. You provide the general methodology
|
|
291
|
+
that applies to any framework; they bring the deep knowledge of one
|
|
292
|
+
specific framework's API, hooks, and idioms. You complement each other.
|
|
293
|
+
|
|
294
|
+
## Calibration Examples
|
|
295
|
+
|
|
296
|
+
**Significant finding (underuse):** Custom toggle component reimplements
|
|
297
|
+
the framework's built-in Switch. The custom component (40+ lines)
|
|
298
|
+
implements a checkbox-like toggle with click handler, aria attributes,
|
|
299
|
+
and styling. The framework's Switch component provides all of this with
|
|
300
|
+
theme-consistent styling and built-in accessibility. Replace with the
|
|
301
|
+
framework Switch and remove the custom implementation.
|
|
302
|
+
|
|
303
|
+
**Significant finding (partial migration):** The app uses the framework's
|
|
304
|
+
`Button` component in 45 places but a hand-rolled `<button className="btn">`
|
|
305
|
+
in 12 places. The hand-rolled version doesn't respond to theme changes,
|
|
306
|
+
doesn't show loading state, and doesn't match the framework's spacing
|
|
307
|
+
scale. This isn't a deliberate choice — it's migration residue. Replace
|
|
308
|
+
the 12 hand-rolled instances.
|
|
309
|
+
|
|
310
|
+
**Significant finding (wrapper syndrome):** `CustomButton.tsx` wraps the
|
|
311
|
+
framework's `Button` and passes through every prop unchanged except
|
|
312
|
+
adding a default `size="md"`. This wrapper has drifted — it doesn't
|
|
313
|
+
forward the `loading` prop added in the framework's v8 release. The
|
|
314
|
+
wrapper adds no value and loses type safety. Remove it and use the
|
|
315
|
+
framework Button directly with a default size in the theme config.
|
|
316
|
+
|
|
317
|
+
**Significant finding (governance):** The app has 8 different approaches
|
|
318
|
+
to showing loading state during async operations. Some buttons disable,
|
|
319
|
+
some show a custom spinner, some do nothing. The framework provides a
|
|
320
|
+
`loading` prop on its Button component that handles all of this
|
|
321
|
+
consistently. No component decision guide exists. Recommend: standardize
|
|
322
|
+
on the framework pattern AND create a decision guide to prevent future
|
|
323
|
+
divergence.
|
|
324
|
+
|
|
325
|
+
**Minor finding (prop completeness):** Select component with 12 options
|
|
326
|
+
is not searchable. With more than 5-7 options, searchable filtering saves
|
|
327
|
+
time. Adding the searchable prop is a one-line change.
|
|
328
|
+
|
|
329
|
+
**Not a finding:** A component uses custom layout CSS instead of the
|
|
330
|
+
framework's grid component. If the layout has specific requirements
|
|
331
|
+
(unequal columns, conditional rendering, complex responsive behavior)
|
|
332
|
+
that the grid component doesn't support, custom CSS is the right call.
|
|
333
|
+
|
|
334
|
+
**Wrong portfolio:** "The complete action button is hard to discover."
|
|
335
|
+
That's usability territory — interaction discovery, not framework usage.
|
|
336
|
+
|
|
337
|
+
**Wrong portfolio:** "The app should use a different component library."
|
|
338
|
+
That's architecture territory — build-vs-buy decisions. You evaluate
|
|
339
|
+
usage of whatever framework is already chosen.
|