* fix(stardust): make migrate output genuinely zip-and-deploy portable The 0.7.0 contract claimed "self-contained, zip-and-deploy" but emitted root-absolute paths (/assets/..., /beers/) plus directory-only nav links. Those work on a webserver at the host root only — they 404 on file:// and at any subpath. This PR delivers what the claim promised: - Output path is URL-literal: /beers/ -> beers/index.html, /about-us/history.html -> about-us/history.html. No more synthesizing /about/index.html from a slug. - Page map (state.json.migrate.pageMap[]) built once per run; per-page rendering and internal-link rewriting both consume it. - Reference shape is depth-aware relative: prefix is ./ for depth-0 pages, ../ * depth otherwise. Works on file://, at host root, and at any subpath without rewriting. - Phase 3 broadens the self-containment check into a full portability audit: refuses absolute internal refs, refuses directory-only nav, runs the new pageMap + file:// fixtures. - New fixtures: file-protocol-audit.mjs (Playwright file:// round-trip) and pagemap-audit.mjs (static pageMap consistency). - asset-bundling.md and migrate-output-format.md aligned to the new depth-aware-relative shape; state.json contract gains pageMap[]. Plugin bumped 0.7.0 -> 0.7.1. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * review: fix four flagged correctness issues - Directory-only-nav regex now catches `./beers/` (the cited example). Old pattern required a-z as first char; `./beers/` starts with `.` and would have slipped through. New pattern accepts ./, ../, /, or a bare segment, and excludes scheme-bearing URLs (no false positive on https://google.com/). - Add a second grep for absolute url() references inside inline style attrs and <style> blocks (and CSS files); the original href/src grep missed these. - SKILL.md Outputs row no longer claims the sidecar lives at <source-url-path>/_meta.json (nonsense for .html-leaf pages). Replaced with a row that points at the canonical sidecar rule. - migration-procedure.md § Page map now explicitly says same-origin absolute URLs are stripped to their path portion before pageMap lookup (per content-preservation.md § Internal link rewriting), closing the loophole that would let <a href="https://origin/foo/"> pass through verbatim. Regex patterns verified against a test fixture before commit. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * review: update migrate-self-contained-bundle eval to 0.7.1 contract The eval was pinned to 0.7.0's root-relative /assets/<subpath> shape. This PR's contract change to depth-aware relative paths would have made the eval fail against correct 0.7.1 output. - detection_src_href criterion now asserts <prefix>assets/<subpath> (not /assets/<subpath>). - Renamed prefix_resolution_root_relative -> prefix_normalises_authoring; description flipped from "reference is left as-is" to "authoring is normalised to the depth-aware emit form". - Added 4 new criteria: depth_aware_paths (6pts), pagemap_constructed (6pts), internal_links_via_pagemap (5pts), portability_audit_passes (13pts). - Setup uses real source URLs that exercise the URL-literal rule: /, /beers/, /about/history.html (preserve .html leaf), /docs/api/ (depth-2 nested). - Prototype HTML now carries internal nav in three authoring styles (root-absolute, same-origin absolute, directory-only) plus a broken-link case, exercising the page map rewrite. - Run 1 expected behavior rewritten to expect depth-aware emission ('./assets/...'), pageMap built before render, broken-link flagging, and the 6-step portability audit passing. - Run 4 (cross-page dedup) updated so the second page emits its shared asset with its own '../' prefix while the underlying file on disk is a single copy. - Weights re-balanced to sum to 100; portability_audit_passes gets the largest weight (13pts) since it backs the contract claim. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
stardust
Redesign an existing website to make it better.
Stardust is a Claude Code plugin that drives a guided redesign of an existing website. It is a higher-level skill built on top of impeccable: impeccable owns how to design well; stardust owns the specific job of taking a site that exists and turning it into a site that is better.
Stardust is opinionated about what "better" means but the user has the final say. The default definition of better is rooted in impeccable's critique and audit, the absence of AI-slop patterns, and a user-selected expressive direction. Every redesign decision is reasoned in the open before code runs.
Pipeline
extract → direct → prototype → migrate
- extract — crawl the existing site (capped, multi-page) and seed a
description of its current state in impeccable's own format
(
stardust/current/PRODUCT.md+DESIGN.md). - direct — capture the user's intent ("make it better", "make it more
expressive for a young audience") as an open phrase, reason about what it
means in stardust's dimensional vocabulary, ask up to two clarifying
questions, and write a target
PRODUCT.md+DESIGN.mdat the project root plus astardust/direction.mdwith the full reasoning trace. - prototype — render before/after static-HTML prototypes per page and
iterate via
$impeccable craftand$impeccable live. - migrate — apply the approved target
DESIGN.mdto every page in the inventory. Per-page state means migration is incremental and resumable.
Surface
$stardust # state report + freeform intent reasoning
$stardust extract [url] # ingest existing site
$stardust direct # resolve intent → target PRODUCT.md / DESIGN.md
$stardust prototype [page] # before/after prototype, delegates to impeccable
$stardust migrate [page] # render redesigned static HTML (incremental)
$stardust with no argument runs a read-only state report and shows the
recommended next step. $stardust with a freeform phrase runs the intent
reasoning procedure (reference/intent-reasoning.md) and proposes a plan
before executing anything.
Hard dependency
Stardust requires impeccable to be installed. There are no fallbacks. On every invocation stardust verifies the impeccable skill is reachable and aborts otherwise with a clear install hint.
What stardust does NOT ship
- No design language of its own. All design opinions are impeccable's. Stardust adds redesign-specific opinions (the divergence toolkit, the palette library, the before/after model, the migration target).
- No production CMS output. The migration target is platform-agnostic static HTML. Conversion to AEM EDS, another CMS, or a framework is a separate downstream effort and out of scope for this plugin.
- No closed intent vocabulary. The user phrase is open. The agent reasons about it in public.
Status
v0.3.0 — complete refactor. v1 (the four-stage greenfield design tool) is
preserved at the stardust--v0.1.0
tag and is unrelated to this version's surface.
License
Apache-2.0