Skip to content

Releases: marianif/impeccable-native

v0.9.0 — break + purpose-driven rethink

24 May 22:18

Choose a tag to compare

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:

  1. Where does this live (which screens, which step of which flow)?
  2. What job is it doing (decision / action / feeling enabled at this moment)?
  3. Who's reading it, in what posture?
  4. What are the neighbors saying (relative volume)?
  5. 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 wrongbreak
  • brand is right, component is generic / doesn't earn its place in the flowrethink
  • whole system needs to movemigration

Other changes

  • Cross-references updated in migration.md, design-system.md, rebrand.md
  • Registered break across SKILL.md, command-metadata.json, pin.mjs, utils.js
  • Command count 27 → 28
  • 84/84 tests pass

v0.8.2 — tree-aware consumers + plan validator

24 May 19:05

Choose a tag to compare

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-cluster kinds, kindCoherent, folders, sameFolder flags; new crossKindBlocked summary counter
  • composition-patterns.mjs, app-anatomy.mjs, screen-choreography.mjs — each accepts --tree=path.json and prefers tree.roots.screens over the hardcoded screens-dir fallback. Unusual layouts (src/app/, monorepo packages/) are now reachable.
  • design-system-scan.mjs threads --tree to all four screen-walking scripts

New validate-plan.mjs

Mechanical guard on design-system-plan.json. Hard refusal rules from the reference doc:

  • Missing life block 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 winner or memberJobs → error
  • Generic vibe traits ("modern", "clean") → warning
  • States missing when clauses → 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-report could cluster an atom and an organism if their names looked similar
  • composition-patterns walked 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

24 May 18:54

Choose a tag to compare

Correctness fixes to /design-system scan based on real-world testing.

What was broken

  • EntityCarousel (sitting in components/organisms/) was classified as atom because the structural heuristic only looked at composition + prop count
  • Typed Text wrappers (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 a components/ root or at top-level. Filters out .specify/templates and other false positives.
  • Expo-router app/ and React Navigation screens/
  • Feature folders (features/<name>/components/)
  • Component-per-folder vs flat layouts; barrel exports; test/story colocation; naming convention
  • Unknown folders (shared/, primitives/, etc.) surfaced in needsClarification[] 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 kindGuess wins; structural heuristic kept as kindStructural fallback
  • Per-entry kindSource, kindConflict, folderKind so 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-tree first, threads its path to all downstream scripts
  • Three new readiness flags:
    • unknown-folders — count of needsClarification entries
    • parser-misses — count of missing-component folders
    • kind-conflicts — count of path-vs-structural disagreements
  • Terminal output now shows a tree row with conventions + inline conflict/missing counts on the components row

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

24 May 17:34

Choose a tag to compare

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:

  1. Job — what does it let the user do, verb-led
  2. Lives in — which screen(s), which region, which moment in the flow
  3. States — ≥3 meaningful states (single-state things are molecules)
  4. Reacts to — scroll, focus, sibling changes, data arrival, dwell, app foreground
  5. 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-authored design-system-plan.json with atoms / molecules / organisms / cleanup. Organisms harvested first (screen-driven), then strategy-projected from PRODUCT.md journeys. 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 life fields, ≥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.json or tokens (that's rebrand'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

24 May 12:55

Choose a tag to compare

Release v0.7.0

24 May 12:39

Choose a tag to compare

v0.6.0

24 May 09:55

Choose a tag to compare

Ship rebrand command with design system overhaul capability (scan, direction, resume).

Release v0.4.0

23 May 21:37

Choose a tag to compare

v0.3.1 — /flow graph rendering fixes

23 May 16:36

Choose a tag to compare

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

23 May 16:14

Choose a tag to compare

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
```