mirror of
https://github.com/nexu-io/open-design.git
synced 2026-05-31 19:04:39 +07:00
* 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 (commits96b255b,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>
210 lines
7.5 KiB
JSON
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"
|
|
}
|
|
}
|