* feat(skills): open-design-landing rename, kami skills, landing OG - Rename editorial-collage skills to open-design-landing and -deck; refresh examples and compose script layout - Add kami-deck and kami-landing skills with HTML examples - Landing page: og.astro, index wiring, and style tweaks; package.json bump - Web i18n: German and Russian copy for renamed and new skills - Daemon test: update skill-asset-rewrite expectations for new paths - Design systems: README and atelier-zero doc touch-ups - Cross-skill SKILL.md reference updates Co-authored-by: Cursor <cursoragent@cursor.com> * docs(landing-page): document version-slot invariant and deprecation timeline Address P3 review notes on PR #428: - Note the `data-github-version` wrapper invariant (version string only) near the canonical URL block in `app/page.tsx`. - Expand the `formatVersion` helper comment in `app/pages/index.astro` with concrete `release.name` / `tag_name` example shapes for each branch of the regex fallback. - Tighten the `EditorialCollageDeckInputs` deprecation in `skills/open-design-landing-deck/schema.ts` to a specific removal version (v0.4.0) and add a "Migrating from editorial-collage-deck" section to the skill README. Generated-By: looper 0.4.0 (runner=fixer, agent=claude-code) * docs(landing-page, skills): clarify version slot script and rename migrations - Describe GitHub version slots as driven by the inline enhancement script, not React hydration. - Add editorial-collage → open-design-landing migration notes; fix README link copy (Astro static landing app). - Extend deck README migration table with shared asset path renames. Co-authored-by: Cursor <cursoragent@cursor.com> * fix(daemon): alias deprecated editorial-collage skill ids The PR renames the editorial-collage / editorial-collage-deck skills to open-design-landing / open-design-landing-deck, but the daemon persists exact skill_id strings on projects and resolves them via listSkills().find((s) => s.id === storedId). After the rename, any project saved against an old id silently composes without the intended skill prompt because the listing no longer exposes that id. Add a SKILL_ID_ALIASES map in skills.ts plus a findSkillById() helper that rewrites deprecated ids to their current canonical form, then route every server-side lookup (skill detail, example HTML, asset proxy, system-prompt composer) through it. Cover the alias map, the resolver, and end-to-end resolution against a temp skills directory with a regression test. Generated-By: looper 0.4.0 (runner=fixer, agent=claude-code) * fix(kami-deck): route host od:slide messages through local go() The host bridge classifies kami-deck as class-driven because go() toggles .slide.active, but the visible slide is moved by deck.style.transform which the bridge cannot drive. Listen for od:slide messages and dispatch them through the local go() so toolbar next/prev and initialSlideIndex restore actually shift the deck. Generated-By: looper 0.4.0 (runner=fixer, agent=claude-code) * fix(kami-deck): sync deck transform with host-driven .active changes The previous fix added a local od:slide listener but the host bridge in apps/web/src/runtime/srcdoc.ts also listens for the same message and calls setActive() (toggles .slide.active) without driving the deck transform. Both listeners fired, the bridge re-read the just-toggled active class, and overshot by one — and the bridge's restoreInitialSlide path could move .active without a message at all, leaving the deck on the original transform. Stop the bridge from double-handling by calling stopImmediatePropagation in the local listener (registered first because the bridge script is appended to </body>), and add a MutationObserver that pulls the deck transform onto whichever slide currently carries .active so the bridge's direct setActive calls (notably the initial-slide restore) move the deck too. Generated-By: looper 0.4.0 (runner=fixer, agent=claude-code) * fix(i18n): align French content with renamed/new skills PR #434 (French localization) merged into main with French copy for the old editorial-collage / editorial-collage-deck skill ids; this branch renamed those to open-design-landing / open-design-landing-deck and added kami-deck and kami-landing. Update content.fr.ts to track the rename and add French copy for the new kami skills so the LOCALIZED_CONTENT_IDS coverage test passes once main is merged. Generated-By: looper 0.4.0 (runner=fixer, agent=claude-code) * fix(open-design-landing-deck): sync deck transform with host-driven .active changes Apply the same fix that landed in skills/kami-deck/example.html (commits |
||
|---|---|---|
| .. | ||
| assets | ||
| scripts | ||
| example.html | ||
| inputs.example.json | ||
| README.md | ||
| schema.ts | ||
| SKILL.md | ||
| styles.css | ||
open-design-landing
Reusable skill that produces a world-class editorial landing page in the Atelier Zero design language — the warm-paper, italic-serif, collage-on-grid aesthetic shared by Monocle, Apartamento, and Études.
The skill is parameterized: fill one typed inputs.json, run one
script, get a self-contained HTML file. Optionally generate 16 surreal
collage assets with gpt-image-2, or fall back to paper-textured SVG
placeholders so the layout still feels intentional with zero image
budget.
Read first — the agent contract, inputs schema, and self-check live in
SKILL.md. This README is the human quick-start.
30-second tour
# 1. Paper-textured placeholders so the layout renders immediately.
npx tsx scripts/placeholder.ts ./out/assets/
# 2. Compose the standalone HTML from the worked example.
npx tsx scripts/compose.ts inputs.example.json ./out/index.html
# 3. Open it.
open ./out/index.html
That's it. Three commands, full editorial landing page, no API keys.
To brand it for yourself, copy inputs.example.json to inputs.json,
edit the fields (the schema is self-documenting — see
schema.ts), and re-run step 2.
The three image strategies
| Strategy | Cost | Latency | When |
|---|---|---|---|
placeholder |
$0 | <1s | First pass, demo, internal review. |
generate |
~$0.40 | ~6 min | Final delivery; original collage plates. |
bring-your-own |
$0 | 0s | You have art direction PNGs ready to drop in. |
Set inputs.imagery.strategy to one of the three.
# generate mode (requires FAL_KEY in env)
FAL_KEY=fal-... npx tsx scripts/imagegen.ts inputs.json --out=./out/assets/
Without FAL_KEY, the imagegen script prints the prompts so you can
route them through the /gpt-image-fal slash-command skill manually.
Layout at a glance
8 numbered Roman-numeral sections, all responsive at 1280 / 1080 / 880 / 560:
I. Hero — display headline + 3 stat rings + 4-step index + collage plate
II. About — manifesto + studio stamp + tilted side-note
III. Capabilities — 4 cards (skills / systems / adapters / BYOK) + ribbon
IV. Labs — 5 portrait cards + filter pills + progress bar
V. Method — 4 numbered steps with thumbnails on hairline timeline
VI. Selected work — dark slab, 2 tilted cards (one rotated -1.2°, one +2.4°)
VII. Testimonial — pull quote + 5 partner glyphs
VIII. CTA — closing pitch + ribbon + email pill
Footer — 4 link columns + huge italic-serif kicker word
Every section has scroll-reveal motion (IntersectionObserver, respects
prefers-reduced-motion).
Files
skills/open-design-landing/
├── SKILL.md # ← agent contract (read this first)
├── README.md # ← you are here
├── schema.ts # typed inputs (single source of truth)
├── styles.css # Atelier Zero stylesheet (single source of truth)
├── inputs.example.json # Open Design as the worked example
├── example.html # canonical rendering, regenerable from inputs.example.json
├── scripts/
│ ├── compose.ts # inputs.json + styles.css → index.html
│ ├── imagegen.ts # gpt-image-2 wrapper (fal.ai backend)
│ └── placeholder.ts # SVG paper-textured frames
└── assets/
├── *.png # 16 collage plates (Open Design instance)
├── image-manifest.json # slot → file / dimensions / prompt mapping
└── imagegen-prompts.md # human-readable prompt pack
Regenerate the canonical example
After editing styles.css, schema.ts, or inputs.example.json:
npx tsx scripts/compose.ts inputs.example.json example.html
The example.html in this folder is the pre-rendered known-good demo —
useful as a visual reference and for QA against the live composer
output.
Migrating from editorial-collage
This skill replaces the older editorial-collage folder:
- Path:
skills/editorial-collage/→skills/open-design-landing/. - Shared assets: downstream paths such as
../editorial-collage/assets/(for example from the slide-deck skill) should use../open-design-landing/assets/— seeopen-design-landing-deck.
See also
design-systems/atelier-zero/DESIGN.md— colors, type, motion tokens.apps/landing-page/— Astro static site that mirrors this skill’s markup at deploy time.skills/open-design-landing-deck/— sibling skill that produces a slide deck in the same visual language.