Releases: marianif/impeccable-native
v0.9.0 — break + purpose-driven rethink
What's new
Split the radical-redesign command into two complementary tools:
break (renamed from rethink)
The 'question the system' command. Metaphorically breaks the design system to escape its gravity, then reconciles via KEEP / UPDATE / NEW per token with blast-radius surfaced. Use when the brand itself is part of what's wrong.
rethink (new, purpose-driven)
The default creative refine after a rebrand or migration. Treats brand tokens as read-only vocabulary and forces five purpose questions before any visual decision:
- Where does this live (which screens, which step of which flow)?
- What job is it doing (decision / action / feeling enabled at this moment)?
- Who's reading it, in what posture?
- What are the neighbors saying (relative volume)?
- What would make this component unmistakably this, in this place, for this purpose?
Every visual decision must trace back to one of the answers. Token policy: KEEP-first, NEW only when the brand vocabulary genuinely lacks a word, never UPDATE (that's break or migration).
New rethink-scan.mjs outputs brandSurface (read-only), usageSites, flowNeighbors, and siblingTreatment with a same-treatment flatness signal.
When to use which
- brand is wrong →
break - brand is right, component is generic / doesn't earn its place in the flow →
rethink - whole system needs to move →
migration
Other changes
- Cross-references updated in
migration.md,design-system.md,rebrand.md - Registered
breakacrossSKILL.md,command-metadata.json,pin.mjs,utils.js - Command count 27 → 28
- 84/84 tests pass
v0.8.2 — tree-aware consumers + plan validator
Closes the foundation work started in v0.8.1: every Act 1 script now reads the same directory-tree source of truth, and a mechanical validator enforces the reference doc's refusal rules before Act 3 can execute.
What changed
Tree integration in remaining consumers
duplication-report.mjs— cross-kind block (a path-sourced atom and a path-sourced organism are not duplicates regardless of name/prop overlap); ladder-aware so atoms and molecules can still cluster legitimately; per-clusterkinds,kindCoherent,folders,sameFolderflags; newcrossKindBlockedsummary countercomposition-patterns.mjs,app-anatomy.mjs,screen-choreography.mjs— each accepts--tree=path.jsonand preferstree.roots.screensover the hardcoded screens-dir fallback. Unusual layouts (src/app/, monorepopackages/) are now reachable.design-system-scan.mjsthreads--treeto all four screen-walking scripts
New validate-plan.mjs
Mechanical guard on design-system-plan.json. Hard refusal rules from the reference doc:
- Missing
lifeblock on any organism → error (the five-question gate) - Fewer than 3 states → error
- Missing neighbors AND no
solitudeNote→ error - Missing evidence → error
- Missing or non-verb-led job → error
- Missing or invalid disposition (CONFIRM | REVISE | ADD | RETIRE) → error
- Cleanup approvals missing or invalid → error
- Merges without
winnerormemberJobs→ error - Generic vibe traits ("modern", "clean") → warning
- States missing
whenclauses → warning
Exit code 1 on any error so Act 3 can gate on it. Surfaces pendingApprovals count so the agent knows when cleanup is ready to execute.
The reference doc now requires running the validator between "present the plan" and Act 3.
Why this matters
Before v0.8.2:
duplication-reportcould cluster an atom and an organism if their names looked similarcomposition-patternswalked hardcoded screens-dir defaults — unusual layouts dropped silently- The reference doc's refusal rules were aspirational — agent could author non-compliant plans and nothing caught it
After v0.8.2:
- Tree is the single source of truth across every Act 1 script
- The contract between reference doc and runtime is mechanical, not honor-system
- Ready for real-app testing — every documented guarantee is enforced
84/84 tests pass.
🤖 Generated with Claude Code
v0.8.1 — path-based kindGuess + directory-tree
Correctness fixes to /design-system scan based on real-world testing.
What was broken
EntityCarousel(sitting incomponents/organisms/) was classified as atom because the structural heuristic only looked at composition + prop count- Typed
Textwrappers (7+ props but rendering a single RN primitive) were classified as molecule - The scanner could only see components in hardcoded default folders (
components/,src/components/,app/components/) — components hidden in non-default layouts (atomic-design, feature folders) were invisible
The root cause was the same in all three cases: the scanner ignored stated developer intent encoded in folder placement. Folder kind is the most authoritative signal available; structural inference is a fallback.
What's new
directory-tree.mjs — first script in Act 1. Maps the codebase shape with strict folder-kind recognition:
- Atomic design (
atoms/molecules/organisms/templates/pages) — only when sitting directly under acomponents/root or at top-level. Filters out.specify/templatesand other false positives. - Expo-router
app/and React Navigationscreens/ - Feature folders (
features/<name>/components/) - Component-per-folder vs flat layouts; barrel exports; test/story colocation; naming convention
- Unknown folders (
shared/,primitives/, etc.) surfaced inneedsClarification[]with a reason the agent can quote
component-inventory.mjs upgrades:
- Reads
--tree=path.json(auto-generates if absent) - Component roots derived from
tree.roots.components— invisible-components problem solved - Path-based
kindGuesswins; structural heuristic kept askindStructuralfallback - Per-entry
kindSource,kindConflict,folderKindso disagreement is surfaced rather than hidden missingComponentFolders[]for leaf folders yielding zero components (barrel re-exports, wrapper chains)- Structural fallback improvements: atom prop threshold 4 → 6, single-primitive-wrapper escape (renders only RN built-ins → atom regardless of prop count), molecule threshold raised to 7
design-system-scan.mjs orchestrator:
- Runs
directory-treefirst, threads its path to all downstream scripts - Three new readiness flags:
unknown-folders— count ofneedsClarificationentriesparser-misses— count of missing-component folderskind-conflicts— count of path-vs-structural disagreements
- Terminal output now shows a
treerow with conventions + inline conflict/missing counts on thecomponentsrow
Verified
| Test case | Before | After |
|---|---|---|
EntityCarousel in organisms/ with trivial structure |
atom | organism (path), with kindConflict: true for Act 2 review |
Typed Text wrapping <RNText> with 7 props |
molecule | atom (path AND structural — wrapper escape) |
Barrel-only folder (organisms/EmptyExport/index.ts re-export) |
silently dropped | surfaced in missingComponentFolders |
Component in components/atoms/Button/ (default scan didn't find it) |
invisible | found via tree-derived roots |
.specify/templates/ directory in skill source repo |
false-classified as templates-folder |
filtered (depth + parent check) |
84/84 tests pass.
🤖 Generated with Claude Code
v0.8.0 — design-system command
design-system
New /impeccable-native design-system command. Sits above rebrand (vibe + tokens) and migration (mechanical token application) as the compositional layer: designs atoms, molecules, and especially organisms as living things on screens — tied to a vibe trait, a real user journey, and concrete file:line evidence.
The five-question gate
An organism must answer all five before it ships:
- Job — what does it let the user do, verb-led
- Lives in — which screen(s), which region, which moment in the flow
- States — ≥3 meaningful states (single-state things are molecules)
- Reacts to — scroll, focus, sibling changes, data arrival, dwell, app foreground
- Neighbors — who yields to whom, who dims when, who coexists
Captured in a life block on every organism entry in design-system-plan.json. The agent must refuse to author entries missing any of the five.
Three acts
- Act 1 (
scan) — forensics pipeline (seven scripts) catalogues components, clusters duplicates, finds dead + transitively-dead code, harvests implicit organism candidates from repeated JSX, maps per-screen choreography. Brownfield/greenfield auto-detect. - Act 2 (
plan) — agent-authoreddesign-system-plan.jsonwith atoms / molecules / organisms / cleanup. Organisms harvested first (screen-driven), then strategy-projected fromPRODUCT.mdjourneys. Per-cluster cleanup approval gates. - Act 3 (
execute) — cleanup first (cluster-by-cluster on approval), then atoms, molecules, organisms. Each phase commits separately.
New scripts (skill/scripts/design-system/)
| Script | Job |
|---|---|
component-inventory.mjs |
Props surface, internal composition, usage count, last-touched, kind heuristic |
duplication-report.mjs |
Clusters via name + prop Jaccard + JSX root-shape signals; union-find on duplicate pairs |
dead-code-report.mjs |
Direct + transitive dead; flags dynamically-referenced names as not-safe-to-delete |
composition-patterns.mjs |
Organism candidates surviving a four-filter bar: ≥6 elements, ≥4 distinct types, non-bare root, interaction signal, ≥2-screen spread. Near-duplicate clustering at ≥80% multiset Jaccard |
app-anatomy.mjs |
Screens + routes + journeys + goals + personas from filesystem and PRODUCT.md |
screen-choreography.mjs |
Per-screen regions (top-fixed / above-fold / main-scrolling / bottom-fixed / overlay), occupants, entries, exits |
design-system-scan.mjs |
Orchestrator; greenfield/brownfield-aware; readiness verdict; blocks if brand-brief.json missing |
Refusal rules (in the reference doc)
- No organism without all five
lifefields, ≥3 states, ≥1 named neighbor - No organism without ≥3 use sites OR a verbatim quote from
app-anatomy.json/ brand brief - No cleanup without per-cluster approval
- No flattening duplicates without describing each member's job
- No modifying
brand-brief.jsonor tokens (that'srebrand's territory) - No "just in case" components
Verified
- All 7 scripts run end-to-end against a fixture
- Implicit-organism filter correctly reduces 25+ raw sub-trees to 1 real candidate with cross-screen evidence
- 84/84 tests pass
🤖 Generated with Claude Code
Release v0.7.1
Full Changelog: v0.7.0...v0.7.1
Release v0.7.0
Full Changelog: v0.6.0...v0.7.0
v0.6.0
Release v0.4.0
Full Changelog: v0.3.1...v0.4.0
v0.3.1 — /flow graph rendering fixes
Patch release for `/impeccable-native flow`. No new commands; sharpens the graph and screen-naming output.
Fixes
- Screen names — `index.tsx` inside a `(group)/` no longer leaks the group name as the screen name. Root index renders as `home`; nested indexes inherit the last visible segment.
- Modal detection — the scanner cross-references parent `_layout.tsx` for `<Stack.Screen options={{ presentation: 'modal' }}>` declarations and back-flags matching screens as modals, even when the filename gives no hint.
- Navigator type visibility — subgraph headers now use unicode glyphs (`▭▭▭ Tabs`, `▤ Stack`, `☰ Drawer`, `◇ Slot`) and a per-type color palette via `classDef`.
- Modal plane — modals are pulled out of their host navigator's subgraph into a dedicated `⊕ Modal layer` subgraph at the bottom. Edges to modals are dashed to read as overlay relationships.
- Entry point — dropped the floating `entry(( root-layout ))` node. The actual home screen gets the `start` class and a `⭐` annotation.
- Legend — every graph now ships with a markdown legend below it explaining glyphs, edge styles, and the start marker.
Install / Update
```
/plugin marketplace update marianif/impeccable-native
/plugin update impeccable-native
```
v0.3.0 — /flow navigation reconnaissance
New: `/impeccable-native flow`
Maps the app's navigation surface so both agents and developers can see the architecture at a glance.
- Auto-detects router via `detect-rn-flavor.mjs` and branches the scan: expo-router walks the `app/` directory; react-navigation parses `createXNavigator` calls, `<Stack.Screen>` JSX, and `linking.config.screens`.
- Outputs a single markdown report: Mermaid `flowchart TD` grouped by navigator subgraph, a screen inventory table, and a deep-link index.
- Information-only: no scoring, no recommendations. Use `audit` or `critique` for evaluation.
Files
- `skill/scripts/flow-scan.mjs` — dual-router scanner
- `skill/reference/flow.md` — rendering instructions
Install / Update
```
/plugin marketplace update marianif/impeccable-native
/plugin update impeccable-native
```