Changelog

Entries grouped by date, newest first. d2c-docs tracks upstream d2c-ai/d2c. When upstream ships a CHANGELOG.md, this page will migrate to fetching from it; until then it is hand-authored here.

2026-06-19 — Agentic page decomposition for d2c-build

d2c-build can now build pages that are too large to generate in a single pass. Instead of failing or truncating, it works the way you would by hand — split the page up, build the parts, stitch them back together — but autonomously, in parallel, and with the design system held intact across every piece.

Decompose → parallel sub-agents → merge

  • Buildability assessment (§1.6). Before emitting any code, /d2c-build measures the page against the complexity tier and the real Figma context budget. Pages that fit build directly, exactly as before. Pages that don't are partitioned — and the number of sections is derived from the design's own structure (Figma sections, then auto-layout groups), never a fixed cap.
  • Parallel section sub-agents. Each section is dispatched to its own sub-agent that runs the full build flow — tokens, component reuse, conventions, the visual-verification loop — in its own isolated context. Splitting the work is what keeps a large page from blowing the context window, which is the whole reason a manual three-way split worked.
  • Whole-page verification. Sections are merged into one page inside a single <main>, in deterministic order, and the assembled page is pixel-diffed as a whole (full-page capture plus per-section clips and seam checks) — so cross-section spacing and shared layout are verified, not just each part in isolation.

Build a shared component once, reuse it everywhere

  • Plan-first reconciliation. When two sections both need a component that doesn't exist yet, the orchestrator detects the overlap before any section writes code, builds that component a single time, and rewrites each section to import the one canonical source. No duplicated near-identical components, no drift — one piece of code, reused.
  • Conservative clustering. Components only merge when they share a structural signature; a card on a light band versus a dark band reuses one component via a thin wrapper, while genuinely different cards stay separate.

All six non-negotiables hold for every section, the IR stays frozen per the decision-lock model, and a partition is fully checkpoint/resumable.

2026-04-20 — Flow parity, auth handling, and a leaner skill surface

A two-part release. First half hardened d2c-build-flow until it matched d2c-build's discipline mechanisms one-for-one. Second half cut the JS surface from 25 scripts to 9 by replacing deterministic helpers with explicit SKILL.md prose — the skill is now prompt-first as Anthropic's Skills convention intends.

d2c-build-flow parity work

  • Phase 1.5 — Flow-level intake. The flow now asks the standard six /d2c-build intake questions once upfront (with context-based skip rules) plus a new mobile-design question that collects all per-step mobile Figma URLs in one pass. Answers bundle into a flow_intake block and propagate to every per-page dispatch — replacing the silent hardcoded defaults that shipped earlier.
  • Stepper-step delegation to /d2c-build. Each step body is now a standalone /d2c-build dispatch with what: "component", output at app/<group_route>/steps/Step<N>.tsx. The orchestrator imports each step and wires onNext / onBack via a documented prop contract. Result: every step body passes through the same six non-negotiables as a route page.
  • Unified Playwright flow-walker. One spec walks the entire loaded path (visit start → screenshot → click Next → screenshot → click Next…), pixel-diffs each step against its Figma export, and auto-fixtures validate: form steps from the IR. Replaces N independent page.goto(URL) runs. Persists user-supplied fixture values to <run-dir>/flow/walker-fixtures.json with user-wins semantics so reruns don't re-prompt.
  • Per-step Phase 5 audit. Stepper-group virtual pages now audit every emitted file (orchestrator + state context + per-step bodies) instead of once on the virtual page.
  • flow-decisions-lock.json. Per-decision lock file with locked → failed → re-locked lifecycle. Phase 3 / 4 / 5 retries cannot silently change a flow-level choice (mode, shell, project_conventions, stepper_groups, per-page route / layout / mobile_variant, per-edge source / trigger / condition). validate-flow-graph.js --verify-lock enforces it.
  • Bucket F-Flow honor checks. Five-bucket Phase 5 enforcement on files the flow emits directly (orchestrator, state context, shared layout, nav-smoke spec, walker spec). Catches orchestration-layer drift the per-page audit can't see.
  • Walker discipline ports. Phase 4a now ports d2c-build's snapshot/ revert/plateau/oscillation logic and adds a checkpoint resume mechanism so an interrupted walker doesn't have to restart from scratch.
  • Auth handling (both skills). New Phase 4.0d (build) and Phase 4a.0b (flow) detect next-auth / clerk / supabase / middleware, identify gated routes, and branch on has_api_calls. UI-only flows get a public-route bypass snippet; flows with APIs require D2C_TEST_USER / D2C_TEST_PASSWORD in .env.local and the walker logs in via Playwright's storageState.
  • Failure-mode catalogue enrichment. Every flow failure-mode entry now carries Lock impact and Related rule fields plus anti-rationalization callouts on trap candidates — matching d2c-build's catalogue discipline.

Lean skill surface (25 → 9 scripts)

A skill is supposed to be prompt-first — markdown that teaches the agent to use its existing tools (Bash, Read, Edit, Glob, Grep). Code is the exception, not the rule. The previous shape leaned too heavily on JS helpers. Cut 16 scripts and their tests; replaced with explicit SKILL.md prose.

The 9 remaining scripts are where code is genuinely necessary:

  • Pixel math + browser control (3): pixeldiff.js, phase4-login.js, screenshot-with-auth.js.
  • Schema validation + grammar parsing (4): validate-ir.js, parse-structured-input.js, validate-flow-graph.js, parse-flow-prompt.js.
  • Atomic hashed lock (1): write-flow-lock.js.
  • Init only (1): detect-conflicts.js.

The cut surfaces (mode detection, shell detection, conventions, walker fixtures / snapshots / checkpoint / preflight, auth detection, validate-honor-flow, render-flow-diagram, format-frame-picker, nav-autofix-plan, pick-link-target, flow-reuse-metric, diff-flow-graph) are now SKILL.md sections with explicit Bash one-liners and reasoning rules. Schemas stay as documentation contracts.

2026-04-15 — Docs site launch

  • Landing page. Five-skill bento grid, animated pixel-diff demo in the hero, framework strip, source-of-truth callout.
  • Skill reference pages (/skills/init, /skills/build, /skills/build-flow, /skills/audit, /skills/guard) sourced live from upstream via fetchUpstream(). Six framework guides under /skills/build/<framework>.
  • Install guide at /install covering plugin, npm-skills, and manual install paths.
  • Reference section added:
    • FAQ — comparisons with Locofy / Anima / Builder.io / Figma Dev Mode.
    • Token schema — shape of design-tokens.json, the contract the five skills share.
    • Skill flags — every --flag across all five skills, extracted live from the upstream SKILL.md files.
    • Plugin manifest — annotated .claude-plugin/plugin.json.
    • Troubleshooting — per-skill failure modes and fixes.
  • Resilience:
    • fetchUpstream() falls back to public/snapshots/ when GitHub is unreachable. A "cached" pill surfaces next to the View source link on any page served from a snapshot.
    • Nightly snapshot refresh workflow opens a PR when upstream moves (.github/workflows/refresh-snapshots.yml).
    • On-demand revalidation endpoint at POST /api/revalidate for the upstream → docs webhook (see setup doc for the d2c-ai/d2c side).
  • Test harness: Vitest wired up with lib-level coverage for the markdown pipeline, URL builders, snapshot-fallback resilience, and skill-flag extraction. GitHub Actions runs lint, test, and build on every PR.
  • Dev-only a11y checker: @axe-core/react wired via src/components/axe-dev.tsx; production builds strip the check.