open-design/skills/open-design-landing-deck/inputs.example.json
Tom Huang aefba56a3f
feat(skills): open-design-landing rename, kami skills, landing OG (#428)
* 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 96b255b, 8cbca30) to the open-design-landing-deck composer
runtime: the host bridge classifies this deck as class-driven because
go() toggles .slide.active, but the visible slide is moved by
deck.style.transform which the bridge can't drive. Add an od:slide
message listener that calls stopImmediatePropagation() and routes nav
through the local go(), plus a MutationObserver that pulls the deck
transform onto whichever slide carries .active so the bridge's direct
setActive calls (notably restoreInitialSlide) move the deck too.

Regenerates example.html via scripts/compose.ts; the regeneration also
picks up upstream nav-cta and brand-meta CSS additions in the sister
open-design-landing styles.css that the example had drifted from.

Generated-By: looper 0.4.0 (runner=fixer, agent=claude-code)

* docs(open-design-landing): align deploy story with Astro landing app

- Update SKILL contract: apps/landing-page is Astro static; clarify
  nextjs-app output_format as a historical enum label and <out>/nextjs
  as a legacy folder name.
- Replace optional-deploy section with fork + pnpm --filter landing-page build.
- Fix styles.css header and regenerate landing + deck example.html so
  inlined comments match.

Co-authored-by: Cursor <cursoragent@cursor.com>

* fix(deck-runtime): bypass interaction lock for host/observer slide sync

The slide deck runtimes for kami-deck and open-design-landing-deck
gate go() behind a 700ms `lock` so wheel/key/touch input bursts can't
overshoot the transform transition. But applying the same gate to the
host bridge's od:slide messages and the MutationObserver watching
`.slide.active` creates a startup race: go(0) at the end of init sets
lock=true, and any host-driven `.active` change inside that window
(notably restoreInitialSlide) fires the observer, which calls go(i),
which exits at the lock guard — leaving the visible deck on slide 1
while the host counter advances to N.

Split the actual state update into an unthrottled `applySlide(n)`
helper that updates transform, `.active`, dot nav, and the progress
bar. Keep `lock` only on the user-input path through `go()`. Route
the message listener, the MutationObserver, and the initial render
through `applySlide` directly so host-driven sync always reaches the
deck transform regardless of the throttle state.

Generated-By: looper 0.4.0 (runner=fixer, agent=claude-code)

---------

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-05-04 19:22:46 +08:00

210 lines
7.5 KiB
JSON

{
"$schema": "./schema.ts",
"_doc": "Worked example — Open Design pitch deck. 11 slides covering cover, two sections, four content slides, one stats, one quote, one CTA, one end. Reuses brand identity and assets from the sister open-design-landing skill. Run `npx tsx scripts/compose.ts inputs.example.json example.html` to build.",
"brand": {
"name": "Open Design",
"mark": "Ø",
"meta": { "title": "Studio Nº 01", "subtitle": "Berlin / Open / Earth" },
"filed_under": "Design · Intelligence",
"tagline": "Designing intelligence with skills, taste, and your own agent.",
"description": "Open Design pitch deck — Vol. 01.",
"locale": "en",
"edition": "Vol. 01 / Issue Nº 26",
"version": "v0.3.0",
"license": "Apache-2.0",
"primary_url": "https://github.com/nexu-io/open-design",
"primary_url_label": "Star · 0K",
"contact_email": "https://github.com/nexu-io/open-design/issues",
"location": "Berlin / Open / Earth",
"coordinates": "52.5200° N · 13.4050° E",
"year": "2026",
"year_roman": "MMXXVI",
"founded": "Est. MMXXVI",
"rails": { "right": "", "left": "" },
"languages": ["EN"],
"status": "Live · v0.3.0"
},
"deck_title": "Open Design · Vol. 01 / Issue Nº 26",
"slides": [
{
"kind": "cover",
"eyebrow": "Open-source design studio · Nº 01",
"title": [
{ "text": "Designing " },
{ "text": "intelligence", "em": true },
{ "text": " with skills, " },
{ "text": "taste,", "em": true },
{ "text": " and " },
{ "text": "code", "em": true },
{ "text": ".", "dot": true }
],
"subtitle": "The open-source alternative to Anthropic's Claude Design.",
"lead": "12 coding agents drive 31 composable skills and 72 brand-grade design systems. Local-first, web-deployable, BYOK at every layer.",
"image_slot": "hero",
"meta": "Berlin · MMXXVI · 52.5200° N · 13.4050° E"
},
{
"kind": "section",
"roman": "I.",
"title": [
{ "text": "Why " },
{ "text": "another", "em": true },
{ "text": " design tool" },
{ "text": "?", "dot": true }
],
"lead": "Because the strongest agents already live on your laptop — and they deserve a real workflow."
},
{
"kind": "content",
"layout": "right",
"eyebrow": "About the studio · Nº 02",
"title": [
{ "text": "We treat " },
{ "text": "your agent", "em": true },
{ "text": " as a creative " },
{ "text": "collaborator", "em": true },
{ "text": ".", "dot": true }
],
"body": "We don't ship one — we wire whichever you trust into a skill-driven design workflow that runs locally with <code>pnpm tools-dev</code>, deploys to Vercel, and stays BYOK at every layer.",
"bullets": [
"Files, not opaque prompts — every skill is a folder of Markdown.",
"Deterministic visual directions, not random generation.",
"Sandboxed iframe preview, real cwd, exportable artifacts."
],
"image_slot": "about"
},
{
"kind": "content",
"layout": "left",
"eyebrow": "Capabilities · Nº 03",
"title": [
{ "text": "Skills, systems, surfaces — " },
{ "text": "for creative", "em": true },
{ "text": " intelligence" },
{ "text": ".", "dot": true }
],
"body": "Four composable surfaces, one feedback loop. Skills supply behavior. Systems supply taste. Adapters bridge agents. BYOK respects your wallet.",
"bullets": [
"31 file-based SKILL.md bundles — drop in, restart, appears.",
"72 portable DESIGN.md systems — Linear, Vercel, Stripe, Apple…",
"12 agent adapters — Claude · Codex · Gemini · Cursor · …",
"OpenAI-compatible proxy — paste a baseUrl + key, ship."
],
"image_slot": "capabilities"
},
{
"kind": "stats",
"eyebrow": "By the numbers · Nº 04",
"title": [
{ "text": "Composable, " },
{ "text": "shippable,", "em": true },
{ "text": " portable" },
{ "text": ".", "dot": true }
],
"stats": [
{ "value": "31", "label": "Skills", "sub": "file-based, shippable today" },
{ "value": "72", "label": "Systems", "sub": "design tokens you already trust" },
{ "value": "12", "label": "Agents", "sub": "auto-detected on your $PATH" },
{ "value": "3", "label": "Commands","sub": "from clone to first artifact" }
],
"caption": "Open Design v0.3.0 · Apache-2.0 · MMXXVI"
},
{
"kind": "section",
"roman": "II.",
"title": [
{ "text": "How it " },
{ "text": "feels", "em": true },
{ "text": " to use it" },
{ "text": ".", "dot": true }
]
},
{
"kind": "content",
"layout": "right",
"eyebrow": "Method · Nº 05",
"title": [
{ "text": "From " },
{ "text": "signals", "em": true },
{ "text": " to systems" },
{ "text": ".", "dot": true }
],
"body": "Every project moves through four iterative stages. The agent picks each stage's tools deterministically; you stay in control.",
"bullets": [
"01 · Detect — daemon scans $PATH, auto-loads skills + systems.",
"02 · Discover — 30s question form locks brand · audience · scale.",
"03 · Direct — pick one of 5 visual directions in OKLch + type stack.",
"04 · Deliver — write to disk, preview in sandbox, export anywhere."
],
"image_slot": "method-1"
},
{
"kind": "content",
"layout": "left",
"eyebrow": "Selected work · Nº 06",
"title": [
{ "text": "Skills that turn briefs into " },
{ "text": "memorable", "em": true },
{ "text": " artifacts" },
{ "text": ".", "dot": true }
],
"body": "From editorial decks to consumer dashboards — the same loop, different surface. Every output is a real file you can hand to a client tomorrow.",
"image_slot": "work-1"
},
{
"kind": "quote",
"quote": [
{ "text": "Open Design helped us turn vague " },
{ "text": "AI ideas", "em": true },
{ "text": " into a visual system that felt " },
{ "text": "sharp, believable,", "em": true },
{ "text": " and genuinely new." }
],
"author": { "initial": "m", "name": "Mina Kovac", "title": "Creative Director · North Form" },
"image_slot": "testimonial"
},
{
"kind": "cta",
"eyebrow": "Start a conversation · Nº 07",
"title": [
{ "text": "Let's build something " },
{ "text": "open", "em": true },
{ "text": " and " },
{ "text": "visually", "em": true },
{ "text": " unforgettable" },
{ "text": ".", "dot": true }
],
"body": "Star us on GitHub, drop into the issues, or run pnpm tools-dev tonight. Three commands and the loop is yours.",
"primary": { "label": "Star on GitHub", "href": "https://github.com/nexu-io/open-design" },
"secondary": { "label": "Open an issue", "href": "https://github.com/nexu-io/open-design/issues" }
},
{
"kind": "end",
"mega": [
{ "text": "Open " },
{ "text": "Design", "em": true },
{ "text": "." }
],
"footer": "Apache-2.0 · MMXXVI · Berlin · 52.5200° N · 13.4050° E"
}
],
"imagery": {
"strategy": "bring-your-own",
"assets_path": "../open-design-landing/assets/",
"provider": "fal"
}
}