oh-my-design-cli 1.3.0 → 1.3.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.ko.md +39 -7
- package/README.md +30 -3
- package/data/issues/2026-05-13-multi-surface-schema-rfc.md +67 -0
- package/package.json +3 -1
- package/skills/omd-apply/SKILL.md +14 -2
- package/skills/omd-asset-fetch/SKILL.md +213 -0
- package/skills/omd-experiment-gallery/SKILL.md +164 -0
- package/skills/omd-harness/SKILL.md +299 -7
- package/skills/omd-init/SKILL.md +13 -3
- package/skills/omd-reference-capture/SKILL.md +398 -1
package/README.ko.md
CHANGED
|
@@ -89,24 +89,35 @@ omd remember "..."
|
|
|
89
89
|
| `CLAUDE.md` | `omd sync` | Claude Code 포인터 (`@./DESIGN.md`) |
|
|
90
90
|
| `AGENTS.md` | `omd sync` | Codex CLI **+** OpenCode 공용 포인터 (한 파일이 둘 커버) |
|
|
91
91
|
| `.cursor/rules/omd-design.mdc` | `omd sync` | Cursor가 UI 파일 편집 시 DESIGN.md 자동 attach |
|
|
92
|
-
| `.claude/skills/omd-*/SKILL.md` | `omd install-skills` | Claude Code 스킬
|
|
93
|
-
| `.codex/skills/omd-*/SKILL.md` | `omd install-skills` | Codex 스킬
|
|
94
|
-
| `.opencode/agents/omd-*.md` | `omd install-skills` | OpenCode 에이전트
|
|
92
|
+
| `.claude/skills/omd-*/SKILL.md` | `omd install-skills` | Claude Code 스킬 9종 |
|
|
93
|
+
| `.codex/skills/omd-*/SKILL.md` | `omd install-skills` | Codex 스킬 9종 |
|
|
94
|
+
| `.opencode/agents/omd-*.md` | `omd install-skills` | OpenCode 에이전트 9종 |
|
|
95
95
|
| `.omd/preferences.md` | `omd remember` | append-only 디자인 교정 로그 |
|
|
96
96
|
| `.omd/sync.lock.json` | `omd sync` | drift 감지 상태 |
|
|
97
97
|
|
|
98
98
|
shim과 스킬 파일은 `<!-- omd:start -->` 마커 블록을 사용해서, 마커 외부의 사용자 편집은 `omd sync` 재실행에도 보존됩니다.
|
|
99
99
|
|
|
100
|
-
###
|
|
100
|
+
### 9개 스킬
|
|
101
|
+
|
|
102
|
+
**Core flow (6)**
|
|
101
103
|
|
|
102
104
|
| 스킬 | 트리거 | 동작 |
|
|
103
105
|
|---|---|---|
|
|
104
|
-
| `omd:init` | "DESIGN.md 만들어줘" / "브랜드 세팅" | 레퍼런스 추천 → 프로젝트 description 수집 → 레퍼런스
|
|
105
|
-
| `omd:apply` | UI / 스타일링 / 마이크로카피 / 모션 작업 | DESIGN.md + pending preference를 authoritative context로 주입,
|
|
106
|
-
| `omd:
|
|
106
|
+
| `omd:init` | "DESIGN.md 만들어줘" / "브랜드 세팅" | 레퍼런스 추천 → 프로젝트 description 수집 → 레퍼런스 톤·매너 preserve하면서 deltas 반영한 Hybrid variation → DESIGN.md + shim 작성 |
|
|
107
|
+
| `omd:apply` | UI / 스타일링 / 마이크로카피 / 모션 작업 | DESIGN.md + pending preference를 authoritative context로 주입, 사용자 교정 시 자동으로 `omd:remember` 호출 |
|
|
108
|
+
| `omd:harness` | "랜딩 처음부터 / production-ready" | 10-phase 디자인 파이프라인. rule 9 hero archetype 7종 (center-text / carousel / split-screen / editorial / dashboard / quote-led / left-character) 중 brand vibe 매칭으로 선택. rule 5 워드마크-only 로고, rule 10 reveal safety net. |
|
|
109
|
+
| `omd:sync` | "shim drift" / "AGENTS.md 동기화" | 적절한 플래그로 `omd:sync` 실행 |
|
|
107
110
|
| `omd:remember` | "기억해 둬" / "우리는 ~안 해" | 구조화된 entry를 `.omd/preferences.md`에 append |
|
|
108
111
|
| `omd:learn` | "preferences 정리해서 DESIGN.md에 반영" | scope별로 그룹핑 → coherent edit 제안 → status flip |
|
|
109
112
|
|
|
113
|
+
**Live capture + assets (v1.3.x — 3개)**
|
|
114
|
+
|
|
115
|
+
| 스킬 | 트리거 | 동작 |
|
|
116
|
+
|---|---|---|
|
|
117
|
+
| `omd:reference-capture` | "X 라이브 자료 가져와" / "에셋 캡쳐" | 라이브 brand 사이트 CDP/playwright inspect → `assets/_reference/<id>/`에 tokens.json + structure.json + fonts.json + `.live-inspect-proof.json` + screenshots + LICENSE-NOTE 작성. Phase 3.9 browser-harness fast-path (3-5x 빠름) auto-detect. |
|
|
118
|
+
| `omd:asset-fetch` | "에셋 가져와줘" / "플레이스홀더 진짜 이미지로" | Free-license 카탈로그 — DiceBear (CC0 avatars), Lucide (ISC icons), Picsum/Loremflickr (CC photos), Bricolage Grotesque / Space Grotesk / DM Serif Display 등 SIL OFL display fonts. 핸드드로잉 캐릭터 SVG 금지. |
|
|
119
|
+
| `omd:experiment-gallery` | "결과물 한 번에 보여줘" / "갤러리 만들어" | N개 experiment 디렉토리를 받아 단일 index.html에 iframe scaled로 비교 뷰 생성. wow rating + archetype badge + round-별 deltas + IP audit 한 카드에. |
|
|
120
|
+
|
|
110
121
|
소스: [`skills/`](skills/) 디렉토리. `omd install-skills`가 프로젝트의 에이전트 디렉토리로 복사.
|
|
111
122
|
|
|
112
123
|
### CLI 명령어
|
|
@@ -141,6 +152,27 @@ omd learn --mark-rejected <id> --reason <text>
|
|
|
141
152
|
|
|
142
153
|
이 생태계는 **v0.1.0** — 첫 agent-integration 릴리스입니다. CLI 표면 (sync / remember / learn / init prepare / install-skills)은 안정 + 단위 테스트 완료 (505 테스트). 에이전트 측 Hybrid variation 품질은 호스트 LLM이 `omd:init` 스킬 프롬프트를 얼마나 잘 따르는지에 좌우됩니다 — 검증 맵은 [`test/scenarios/WORKFLOWS.md`](test/scenarios/WORKFLOWS.md) 참고. 실 세션 결과 환영 — `.omd/init-context.json`과 결과 `DESIGN.md`를 첨부해서 이슈로 보고 부탁드립니다.
|
|
143
154
|
|
|
155
|
+
### 업그레이드
|
|
156
|
+
|
|
157
|
+
스킬·에이전트는 매 릴리스마다 진화합니다. 기존 프로젝트에서 최신 번들 받아오려면:
|
|
158
|
+
|
|
159
|
+
```bash
|
|
160
|
+
npx oh-my-design-cli@latest install-skills
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
Idempotent. 상단에 `<!-- omd:installed-skill -->` 마커가 있는 **관리 파일**은 in-place 갱신, 마커 없이 사용자가 수정한 파일은 `skipped-drift` 상태로 그대로 두기. 사용자 편집까지 정말 덮어쓰려면 `--force`.
|
|
164
|
+
|
|
165
|
+
재실행 후 에이전트 재시작 (Cmd+Q in Claude Code → 재실행) — 새 스킬·에이전트 로드.
|
|
166
|
+
|
|
167
|
+
**버전 확인:**
|
|
168
|
+
|
|
169
|
+
```bash
|
|
170
|
+
npx oh-my-design-cli --version # 프로젝트에 깔린 버전
|
|
171
|
+
npm view oh-my-design-cli version # npm registry 최신
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
**각 릴리스 변경 내용:** [CHANGELOG.md](./CHANGELOG.md). 모든 릴리스 항목에 skill·agent·hook·CLI·data 변경 명시. re-install 외에 마이그레이션(예: `DESIGN.md` frontmatter 스키마 변경) 필요한 변경은 해당 entry 최상단에 표시.
|
|
175
|
+
|
|
144
176
|
## OmD v0.1 Philosophy Layer
|
|
145
177
|
|
|
146
178
|
Google Stitch의 9개 섹션 위에 OmD가 더하는 6개:
|
package/README.md
CHANGED
|
@@ -37,6 +37,27 @@ Then restart your agent (Cmd+Q in Claude Code, then relaunch) so the new skills
|
|
|
37
37
|
|
|
38
38
|
That is the only CLI command you will run. Everything else is natural language to your agent.
|
|
39
39
|
|
|
40
|
+
## Upgrading
|
|
41
|
+
|
|
42
|
+
Skills and agents evolve every release. To pick up the latest bundle in an existing project:
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
npx oh-my-design-cli@latest install-skills
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
Idempotent. Managed files (those carrying the `<!-- omd:installed-skill -->` marker at the top) are refreshed in place. Files you edited that don't have the marker are left untouched (status `skipped-drift`). Pass `--force` if you really want to overwrite your custom edits.
|
|
49
|
+
|
|
50
|
+
Restart your agent after re-running so the refreshed skills + agents are loaded.
|
|
51
|
+
|
|
52
|
+
**Check what's installed vs what's latest:**
|
|
53
|
+
|
|
54
|
+
```bash
|
|
55
|
+
npx oh-my-design-cli --version # what your project currently uses
|
|
56
|
+
npm view oh-my-design-cli version # latest on the registry
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
**What's new each release:** [CHANGELOG.md](./CHANGELOG.md). Every release entry says what changed in the skills, agents, hooks, CLI, and data. If a change requires anything beyond a re-install — for example a migration of `DESIGN.md` frontmatter — it will be called out at the top of that entry.
|
|
60
|
+
|
|
40
61
|
## How to use omd with your AI
|
|
41
62
|
|
|
42
63
|
Open Claude Code (or Codex / OpenCode) in your project. Just talk:
|
|
@@ -63,7 +84,7 @@ Open Claude Code (or Codex / OpenCode) in your project. Just talk:
|
|
|
63
84
|
|
|
64
85
|
| Path | Owner | Purpose |
|
|
65
86
|
|---|---|---|
|
|
66
|
-
| `.claude/skills/omd-*/SKILL.md` | install-skills | Claude Code skill bundle (apply / harness / init / learn / remember / sync) |
|
|
87
|
+
| `.claude/skills/omd-*/SKILL.md` | install-skills | Claude Code skill bundle (apply / harness / init / learn / remember / sync / reference-capture / asset-fetch / experiment-gallery) |
|
|
67
88
|
| `.codex/skills/omd-*/SKILL.md` | install-skills | Codex skill bundle |
|
|
68
89
|
| `.opencode/agents/omd-*.md` | install-skills | OpenCode agent bundle |
|
|
69
90
|
| `.claude/agents/omd-*.md` | install-skills | 11 canonical sub-agents (master + 10 specialists) |
|
|
@@ -76,17 +97,23 @@ Open Claude Code (or Codex / OpenCode) in your project. Just talk:
|
|
|
76
97
|
| `.omd/preferences.md` | omd-remember skill | Append-only design correction log |
|
|
77
98
|
| `.omd/runs/<id>/` | omd-harness skill | Per-harness-run artifacts (briefs, wireframes, eval, handoff zips) |
|
|
78
99
|
|
|
79
|
-
## The
|
|
100
|
+
## The 9 skills + 11 agents
|
|
80
101
|
|
|
81
102
|
Skills (loaded into your agent's context based on prompt triggers):
|
|
82
103
|
|
|
104
|
+
**Core flow**
|
|
83
105
|
- **omd:apply** — DESIGN.md as authoritative context for every UI task. Routes complex requests (assets, charts, full screens, a11y audit) to specialized sub-agents.
|
|
84
106
|
- **omd:init** — Bootstrap DESIGN.md from a reference + project description. 88 references, hybrid variation that preserves the reference voice while shifting only user-named axes.
|
|
85
|
-
- **omd:harness** — `/omd-harness <task>` to run the 10-phase design pipeline
|
|
107
|
+
- **omd:harness** — `/omd-harness <task>` to run the 10-phase design pipeline. 7 hero archetypes (rule 9) match brand vibe to layout (center-text / carousel / split-screen / editorial / dashboard / quote-led / left-character). Reveal safety net (rule 10), wordmark-only logo (rule 5), container-inner consistency (rule 7), decomposed hero (rule 8).
|
|
86
108
|
- **omd:remember** — Captures user corrections to `.omd/preferences.md` automatically when the agent detects them.
|
|
87
109
|
- **omd:learn** — Folds pending corrections back into DESIGN.md by scope.
|
|
88
110
|
- **omd:sync** — Maintains the shim files (CLAUDE.md / AGENTS.md / Cursor mdc) so every agent reads your DESIGN.md.
|
|
89
111
|
|
|
112
|
+
**Live capture + assets** (v1.3.x)
|
|
113
|
+
- **omd:reference-capture** — Live brand site CDP/playwright inspect → `assets/_reference/<id>/` with tokens.json + structure.json + fonts.json + `.live-inspect-proof.json` + screenshots + LICENSE-NOTE/attribution. Phase 3.9 browser-harness fast-path: 3-5× faster than playwright MCP when available.
|
|
114
|
+
- **omd:asset-fetch** — Free-license asset catalog with verified URLs. DiceBear CC0 (notionists/lorelei avatars), Lucide ISC icons, Picsum CC0 / Loremflickr Flickr-CC photos, SIL OFL display fonts (Bricolage Grotesque / Space Grotesk / DM Serif Display / Fraunces). Strict anti-patterns: handcrafted character SVG forbidden, brand creative work never in product DOM.
|
|
115
|
+
- **omd:experiment-gallery** — N-brand experiment results in a single comparison index.html. iframe scaled previews + wow ratings + multi-turn deltas + per-brand IP audit. Reusable across batches.
|
|
116
|
+
|
|
90
117
|
Sub-agents — 1 orchestrator + 10 specialists (invoked by the master or directly by skills):
|
|
91
118
|
|
|
92
119
|
- **omd-master** — Conversational state machine, runs the harness phases. opus.
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
# RFC: Multi-surface brand spec (deferred)
|
|
2
|
+
|
|
3
|
+
**Status**: deferred / not blocking
|
|
4
|
+
**Filed**: 2026-05-13
|
|
5
|
+
**Trigger**: Banksalad mismatch — canonical DESIGN.md captured "advisor app" idiom, but `banksalad.com` is a "marketing landing" idiom. Generated landing.html was schema-faithful but didn't resemble the actual brand homepage.
|
|
6
|
+
**Decision**: do NOT do this schema change now. Solve at the skill level first (see `data/issues/2026-05-13-multi-surface-schema-rfc.md` companion fix in commit history). Revisit only if skill-level fix proves insufficient after ~10 more brand additions or repeated user complaints about surface mismatch.
|
|
7
|
+
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
## Problem
|
|
11
|
+
|
|
12
|
+
One brand can have visually distinct surfaces (marketing landing, in-app, docs, onboarding). The current `DESIGN.md`-per-brand schema implicitly picks ONE surface as canonical. Generators following the spec faithfully will mismatch when user requests a different surface.
|
|
13
|
+
|
|
14
|
+
## Why we're deferring the schema change
|
|
15
|
+
|
|
16
|
+
1. **Both prior-art systems we surveyed keep schema single**:
|
|
17
|
+
- Google Stitch treats variants/modes/devices as runtime workflows (sidebar items in their docs), not separate spec documents.
|
|
18
|
+
- getdesign.md allows N entries per brand with catalog-level tags, but actual catalog data shows 1 entry per brand in practice (e.g. Apple has 1 entry).
|
|
19
|
+
- W3C Design Tokens Community Group spec deliberately does NOT scope tokens by surface — leaves it to vendor `$extensions`.
|
|
20
|
+
2. **Authoring cost scales poorly**: 88 brands × N surfaces is real maintenance overhead for marginal cases. Only ~10-15% of brands appear to have visually distinct landing/app idioms.
|
|
21
|
+
3. **The Banksalad case is a generator priority bug, not a schema gap**. We already had `tokens.json#live_overrides` and screenshots — the generator just didn't weight them.
|
|
22
|
+
4. **Backward compatibility**: 88 published references would all need migration. High blast radius for unclear payoff.
|
|
23
|
+
|
|
24
|
+
## What might warrant revisiting
|
|
25
|
+
|
|
26
|
+
- ≥3 distinct user reports of "this brand's generated output doesn't look like the real brand"
|
|
27
|
+
- A new batch where ≥30% of brands exhibit landing-vs-app idiom split
|
|
28
|
+
- AI coding agents adopting a multi-surface convention (W3C tokens spec, Stitch, etc. adding `surface` as a first-class field)
|
|
29
|
+
|
|
30
|
+
## Sketch (if/when we do this)
|
|
31
|
+
|
|
32
|
+
Probable shape based on the survey:
|
|
33
|
+
|
|
34
|
+
- `web/references/<id>/DESIGN.md` stays — essence-leaning (voice, principles, motion philosophy, raw palette)
|
|
35
|
+
- Optional `surfaces/<surface>.md` overlay files — delta only, frontmatter `surface: marketing|product|docs|onboarding`, `extends: ../DESIGN.md`
|
|
36
|
+
- Generator reads essence + (one) overlay → composes
|
|
37
|
+
- Closed enum chosen for AI determinism (Spectrum/Carbon precedent — productive vs expressive moment)
|
|
38
|
+
- Only ~10-15% of brands need overlays — most stay single-doc
|
|
39
|
+
|
|
40
|
+
## What we're doing instead (now)
|
|
41
|
+
|
|
42
|
+
Skill-level fix shipping in v1.4.0 or similar:
|
|
43
|
+
|
|
44
|
+
1. `omd:reference-capture` writes `structure.json` recording observable composition cues (hero type, CTA shape, nav structure, ornament style) — facts, not copyrighted content.
|
|
45
|
+
2. `omd:apply` / `omd:harness` instructed to Read hero screenshots as images for visual grounding before composing.
|
|
46
|
+
3. Token-resolution priority order documented: `tokens.json#live_overrides` > canonical DESIGN.md > `delta_set`. Brand essence (voice, principles, motion philosophy) stays canonical-only.
|
|
47
|
+
4. `omd:harness` Step 4 master prompt includes a `surface_signal` field derived from task keywords (`랜딩`→marketing, `대시보드`→product, etc.). Master uses it to weight reference-capture artifacts vs canonical spec.
|
|
48
|
+
|
|
49
|
+
The skill-level fix achieves the same Banksalad-landing outcome without any schema or migration work.
|
|
50
|
+
|
|
51
|
+
## References (survey notes)
|
|
52
|
+
|
|
53
|
+
- Stitch docs at `stitch.withgoogle.com/docs/design-md/overview` — sidebar nav includes `Device Types`, `Design Modes`, `Generate design variations` as separate workflows
|
|
54
|
+
- getdesign.md catalog (`getdesign.md/apple`) — N-entries-per-brand with category tags at catalog level, but actual data has single entries
|
|
55
|
+
- W3C Design Tokens spec `tr.designtokens.org` — `$extensions` escape hatch, no surface primitive
|
|
56
|
+
- Material 3 (`m3.material.io`) — three-tier `ref/sys/comp` is vertical, not surface-horizontal
|
|
57
|
+
- Carbon (`carbondesignsystem.com`) — theme axis (`white/g10/g90/g100`) is the closest to surface, but it's a single coarse dimension
|
|
58
|
+
- Adobe Spectrum (`spectrum.adobe.com`) — `productive/expressive` moment is a 2-bucket idiom split; precedent for closed enum
|
|
59
|
+
- shadcn/ui (`ui.shadcn.com`) — explicitly refuses the surface problem by shipping unstyled primitives
|
|
60
|
+
|
|
61
|
+
---
|
|
62
|
+
|
|
63
|
+
## Linked actions
|
|
64
|
+
|
|
65
|
+
- [ ] Implement skill-level fix (4 items above) — target v1.4.0
|
|
66
|
+
- [ ] After 3 more batches, re-evaluate whether skill fix is sufficient
|
|
67
|
+
- [ ] If not, draft formal `omd: 0.2` schema following the surfaces/<name>.md sketch
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "oh-my-design-cli",
|
|
3
|
-
"version": "1.3.
|
|
3
|
+
"version": "1.3.9",
|
|
4
4
|
"description": "Bootstrap oh-my-design skills + agents into your project. After install, talk to your AI coding agent in natural language — no other CLI commands.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -16,6 +16,8 @@
|
|
|
16
16
|
"skills/omd-remember",
|
|
17
17
|
"skills/omd-sync",
|
|
18
18
|
"skills/omd-reference-capture",
|
|
19
|
+
"skills/omd-asset-fetch",
|
|
20
|
+
"skills/omd-experiment-gallery",
|
|
19
21
|
"agents",
|
|
20
22
|
"data",
|
|
21
23
|
"web/references/*/DESIGN.md",
|
|
@@ -53,10 +53,22 @@ dispatch가 아니라 인라인 처리로 분기됐을 때만 진행:
|
|
|
53
53
|
|
|
54
54
|
1. 프로젝트 루트의 `DESIGN.md`를 **전체 읽는다**. 요약 금지, Read 툴로 직접 로드.
|
|
55
55
|
2. `.omd/preferences.md`가 있으면 같이 읽는다. `status: pending` 엔트리는 아직 DESIGN.md에 반영 안 된 교정 — DESIGN.md보다 **우선** 적용.
|
|
56
|
-
3.
|
|
56
|
+
3. **reference-capture 자료가 있으면 함께 로드**: `DESIGN.md` frontmatter의 `bootstrapped_from` 또는 `.omd/init-context.json`의 `reference_id`로 brand id를 얻고, `assets/_reference/<id>/`가 존재하면:
|
|
57
|
+
- `tokens.json` — `live_overrides` 블록 우선
|
|
58
|
+
- `structure.json` — composition cues (hero/cta/nav idiom)
|
|
59
|
+
- `fonts.json` — `live_observed: true` 항목은 출력 HTML `<head>`에 `html_link` 그대로 박을 것. 미로드 시 시스템 fallback으로 둥근 폰트 mismatch.
|
|
60
|
+
- `screenshots/hero-desktop.png` — UI 작업이 hero/landing 류면 Read 툴로 **이미지로 직접 읽고** 시각 grounding
|
|
61
|
+
- **mode 분기** (`.omd/init-context.json`의 `mode` 필드):
|
|
62
|
+
- `clone` → 헤더 logo는 `assets/_reference/<id>/logo.<ext>` 직접 사용. project root에 `CLONE-MODE.md` + `replace-checklist.md`가 있어야 함.
|
|
63
|
+
- `inspired` (또는 미지정) → 헤더 logo는 `[YOUR LOGO]` placeholder. captured 자산은 product DOM 미사용.
|
|
64
|
+
4. 우선순위:
|
|
57
65
|
```
|
|
58
|
-
.omd/preferences.md (pending)
|
|
66
|
+
.omd/preferences.md (pending)
|
|
67
|
+
> assets/_reference/<id>/tokens.json#live_overrides (visual surface tokens만)
|
|
68
|
+
> DESIGN.md (essence: voice/principles/motion 철학·canonical token)
|
|
69
|
+
> framework defaults
|
|
59
70
|
```
|
|
71
|
+
essence (voice/principles/motion philosophy)는 항상 DESIGN.md가 권위. visual surface 토큰만 live_overrides가 우위.
|
|
60
72
|
|
|
61
73
|
DESIGN.md 없으면 사용자에게 알리고 omd:init 스킬 트리거. 임의 생성 금지.
|
|
62
74
|
|
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: omd:asset-fetch
|
|
3
|
+
description: "사용자 product UI 생성 시 placeholder 자리를 generic SVG가 아닌 **실제 free-license CDN 자산**으로 채운다. 로고·일러스트·아이콘·사진·폰트·패턴 카탈로그를 verified URL만으로 운영. '에셋 가져와줘', '플레이스홀더 진짜 이미지로', '로고 자리 채워줘', 'unsplash에서 사진 가져와' 류 요청에 트리거. omd:apply / omd:harness 안에서 자동 호출됨."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# omd:asset-fetch — Free-license Asset Catalog
|
|
7
|
+
|
|
8
|
+
## 왜 이 스킬
|
|
9
|
+
|
|
10
|
+
"초안 같음" 결과물의 90%는 **placeholder가 너무 generic**이라서 — `[YOUR LOGO]` 점선 박스, organic blob SVG, "image placeholder" 회색 사각형. 사용자가 "와우" 못 느낌.
|
|
11
|
+
|
|
12
|
+
이 스킬은 **모든 placeholder 자리에 verified free-license CDN 자산**을 박는 catalog. URL은 전부 200 OK 검증됨 (2026-05-14 기준).
|
|
13
|
+
|
|
14
|
+
## 핵심 원칙
|
|
15
|
+
|
|
16
|
+
1. **검증된 URL만**. 이 catalog에 없으면 generator가 임의로 만들지 말 것.
|
|
17
|
+
2. **모든 자산은 commercial-use 허용** — 사용자 product에 ship 가능.
|
|
18
|
+
3. **출처는 `assets/attribution.md`에 의무 기록** — URL + license + 사용 위치 + fetch 일자.
|
|
19
|
+
4. **deterministic seeding 권장** — `seed` 또는 `lock` 파라미터로 결과 재현 가능. 매번 다른 이미지 나오는 random URL은 피할 것.
|
|
20
|
+
5. **금지**: handcraft inline SVG로 placeholder를 "그려서" 채우기. catalog 자산 fetch 실패 시 → brand-color CSS gradient placeholder (이전 v1.3.4 fallback 정책과 동일).
|
|
21
|
+
|
|
22
|
+
## Catalog (verified 2026-05-14)
|
|
23
|
+
|
|
24
|
+
### 1. LOGO — product name **워드마크만** (v1.3.7부터)
|
|
25
|
+
|
|
26
|
+
별도 icon / shapes mark / DiceBear logo 합성 **금지**. 헤더 logo = product name 텍스트 + 디스플레이 폰트, 그게 전부.
|
|
27
|
+
|
|
28
|
+
**왜**: AI가 합성한 icon mark는 "generic"하게 보임 (사용자 frustration source). product 이름을 **꽤 괜찮은 폰트로** 그대로 박는 게 진짜 brand wordmark처럼 보이고 사용자가 1초만에 자기 product name으로 swap 가능.
|
|
29
|
+
|
|
30
|
+
**패턴**:
|
|
31
|
+
```html
|
|
32
|
+
<a class="logo" href="/" style="display:inline-flex;align-items:center;text-decoration:none;">
|
|
33
|
+
<span class="logo-wordmark">{{PRODUCT_NAME}}</span>
|
|
34
|
+
</a>
|
|
35
|
+
<style>
|
|
36
|
+
.logo-wordmark{
|
|
37
|
+
font-family:"Bricolage Grotesque","Space Grotesk","DM Serif Display","Fraunces",-apple-system,sans-serif;
|
|
38
|
+
font-size:22px;font-weight:700;letter-spacing:-0.04em;
|
|
39
|
+
color:var(--color-text-heading);
|
|
40
|
+
}
|
|
41
|
+
</style>
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
`<head>`에 디스플레이 폰트 `<link>` 의무 (§6 참고).
|
|
45
|
+
|
|
46
|
+
**brand vibe별 폰트 매칭**:
|
|
47
|
+
- cool / minimal / fintech serious → **Space Grotesk** 700 (geometric)
|
|
48
|
+
- warm / playful / community → **Bricolage Grotesque** 700 (friendly variable)
|
|
49
|
+
- editorial / luxury → **DM Serif Display** 또는 **Fraunces** (display serif)
|
|
50
|
+
- bold / display → **Bricolage Grotesque** 800
|
|
51
|
+
|
|
52
|
+
**`{{PRODUCT_NAME}}` 결정**:
|
|
53
|
+
1. 사용자 prompt에 명시 product name 있으면 그대로 사용
|
|
54
|
+
2. 없으면 brand vibe 맞는 generic placeholder 1개 선택 (omd-harness rule 5 §placeholder 표 참고: `Folio`, `Mint`, `Pop`, `Spark`, `Townie`, `Lane`, `Compass`, ...)
|
|
55
|
+
3. 선택된 이름은 `<title>`, hero copy, footer brand 자리 전부 **일관 적용** (사용자 grep replace 1번이면 swap 끝)
|
|
56
|
+
|
|
57
|
+
**금지 패턴 (v1.3.6 회귀 방지)**:
|
|
58
|
+
- ❌ DiceBear `shapes` mark + wordmark 페어 — generic "AI 로고" 느낌
|
|
59
|
+
- ❌ DiceBear `initials` 이니셜 chip — 이메일 아바타 같이 보임
|
|
60
|
+
- ❌ 직접 그린 inline `<svg>` logo icon — 손그림 anatomy 회귀
|
|
61
|
+
- ❌ `[YOUR LOGO]` / `[YOUR PRODUCT NAME]` 텍스트가 점선 박스 안에 그대로 — placeholder 티 폭발
|
|
62
|
+
|
|
63
|
+
### 2. HERO 일러스트레이션 / 캐릭터
|
|
64
|
+
|
|
65
|
+
**DiceBear avatars** (CC0) — v1.3.4부터 이미 사용 중. 5 스타일:
|
|
66
|
+
|
|
67
|
+
| style | use case | URL pattern |
|
|
68
|
+
|---|---|---|
|
|
69
|
+
| `notionists` | financial advisor, business persona | `https://api.dicebear.com/9.x/notionists/svg?seed=<seed>&size=520` |
|
|
70
|
+
| `lorelei` | warm, approachable | `https://api.dicebear.com/9.x/lorelei/svg?seed=<seed>&size=520` |
|
|
71
|
+
| `personas` | diverse persona | `https://api.dicebear.com/9.x/personas/svg?seed=<seed>&size=520` |
|
|
72
|
+
| `adventurer` | active, mobility | `https://api.dicebear.com/9.x/adventurer/svg?seed=<seed>&size=520` |
|
|
73
|
+
| `fun-emoji` | warm, casual commerce | `https://api.dicebear.com/9.x/fun-emoji/svg?seed=<seed>&size=520` |
|
|
74
|
+
|
|
75
|
+
생성기는 brand의 voice register 또는 surface signal에 맞춰 style 선택 — 예: 핀테크 advisor → `notionists`, 커뮤니티 커머스 → `lorelei` 또는 `fun-emoji`.
|
|
76
|
+
|
|
77
|
+
**금지** (v1.3.4부터 누적, 자주 어겨지므로 재명시):
|
|
78
|
+
- handcraft inline SVG 캐릭터 — 손그림 stick figure 합성 절대 금지
|
|
79
|
+
- 캐릭터 일러스트를 우리 generator가 직접 inline `<path>`로 그리지 말 것
|
|
80
|
+
- CDN fetch 후 다운로드한 파일 첫 부분에 `<!-- dicebear-fetched: <full URL> | <ISO> -->` 코멘트 박을 것 — 후속 audit gate가 검증
|
|
81
|
+
|
|
82
|
+
### 3. ICONS — feature 카드, nav, product 카테고리
|
|
83
|
+
|
|
84
|
+
**Lucide** (ISC) — 한 줄 1500+ 아이콘
|
|
85
|
+
- URL: `https://cdn.jsdelivr.net/npm/lucide-static@latest/icons/<name>.svg`
|
|
86
|
+
- 예시: `credit-card`, `home`, `landmark`, `shield-check`, `trending-up`, `book-open`, `map-pin`, `bell`, `heart`, `search`, `user`, `chevron-right`, `arrow-right`, `external-link`, `play`, `bar-chart-3`
|
|
87
|
+
|
|
88
|
+
**Heroicons** (MIT)
|
|
89
|
+
- URL: `https://cdn.jsdelivr.net/npm/heroicons@2/24/outline/<name>.svg`
|
|
90
|
+
- outline + solid family
|
|
91
|
+
|
|
92
|
+
**Tabler Icons** (MIT)
|
|
93
|
+
- URL: `https://cdn.jsdelivr.net/npm/@tabler/icons@latest/icons/<name>.svg`
|
|
94
|
+
|
|
95
|
+
색상 적용: SVG inline 후 `currentColor` / `stroke="..."` 변경, 또는 CSS filter
|
|
96
|
+
|
|
97
|
+
### 4. PHOTOS — product 카드, hero 배경, testimonial 아바타
|
|
98
|
+
|
|
99
|
+
**Lorem Picsum** (CC0 — Unsplash-derived rehosting)
|
|
100
|
+
- random photo: `https://picsum.photos/<w>/<h>` (매 호출 다름)
|
|
101
|
+
- **deterministic** (권장): `https://picsum.photos/seed/<seed>/<w>/<h>`
|
|
102
|
+
- seed는 `<brand>-product-01`, `<brand>-hero-01` 식으로 의미 부여
|
|
103
|
+
- grayscale: `?grayscale`
|
|
104
|
+
- blur: `?blur=2`
|
|
105
|
+
- 예: `https://picsum.photos/seed/musinsa-card-1/400/500` → musinsa product 카드 자리에 들어갈 결정적 이미지
|
|
106
|
+
|
|
107
|
+
**Loremflickr** (Flickr CC) — 키워드 매칭 + deterministic
|
|
108
|
+
- URL: `https://loremflickr.com/<w>/<h>/<keyword>/all?lock=<n>`
|
|
109
|
+
- 한국 컨텍스트 키워드: `seoul`, `korean,food`, `cafe,interior`, `apartment,korea`
|
|
110
|
+
- `?lock=N`로 결정적 출력
|
|
111
|
+
- 예: `https://loremflickr.com/600/400/seoul,city/all?lock=42` → 서울 도시 사진 결정적
|
|
112
|
+
|
|
113
|
+
**사용 가이드**:
|
|
114
|
+
- product 카드: Picsum seed로 시리즈 일관성 (`<brand>-product-1`, `-2`, `-3` ...)
|
|
115
|
+
- hero 배경 photo (필요 시): Loremflickr 키워드 매칭
|
|
116
|
+
- testimonial 아바타: DiceBear `lorelei` 또는 `notionists` (people 사진 placeholder 보다 일관)
|
|
117
|
+
- 사진이 brand idiom과 안 맞으면 (예: musinsa editorial은 photo 자리에 색면 placeholder가 더 맞음) → 사용 안 함
|
|
118
|
+
|
|
119
|
+
**금지**:
|
|
120
|
+
- 실제 brand가 운영하는 CDN URL (`cdn.banksalad.com/...` 등)은 product DOM에 hot-link 금지 — TOS·IP 영역
|
|
121
|
+
- 특정 인물 사진을 brand mascot처럼 박지 말 것
|
|
122
|
+
|
|
123
|
+
### 5. PATTERNS / BACKGROUNDS
|
|
124
|
+
|
|
125
|
+
**Hero Patterns** (CC BY 4.0) — `https://heropatterns.com` — SVG 도큐 보고 inline 복사
|
|
126
|
+
- 라이센스에 따라 `assets/attribution.md`에 CC BY 표기 의무
|
|
127
|
+
|
|
128
|
+
**CSS 자체 생성** — abstract gradient ornament는 generator가 직접:
|
|
129
|
+
```css
|
|
130
|
+
.hero-ornament {
|
|
131
|
+
position: absolute; inset: -100px -200px auto auto;
|
|
132
|
+
width: 480px; height: 280px;
|
|
133
|
+
background: radial-gradient(circle, var(--brand) 0%, transparent 70%);
|
|
134
|
+
filter: blur(120px); opacity: 0.4;
|
|
135
|
+
pointer-events: none; z-index: 0;
|
|
136
|
+
}
|
|
137
|
+
```
|
|
138
|
+
이건 brand-specific creative work 아님 — 우리가 직접 그려도 무방.
|
|
139
|
+
|
|
140
|
+
### 6. FONTS
|
|
141
|
+
|
|
142
|
+
기존 `omd:reference-capture` Phase 3.5의 fonts.json catalog와 동일. SIL OFL / open-source만:
|
|
143
|
+
- Pretendard, Wanted Sans, Noto Sans KR, Inter — jsdelivr / Google Fonts CDN
|
|
144
|
+
|
|
145
|
+
**디스플레이/액센트 폰트** (logo / hero 헤드라인용, SIL OFL):
|
|
146
|
+
- **DM Serif Display** (Google Fonts) — 우아한 serif display
|
|
147
|
+
- `https://fonts.googleapis.com/css2?family=DM+Serif+Display:ital@0;1&display=swap`
|
|
148
|
+
- **Space Grotesk** (SIL OFL) — modern geometric sans
|
|
149
|
+
- `https://fonts.googleapis.com/css2?family=Space+Grotesk:wght@400;500;600;700&display=swap`
|
|
150
|
+
- **Fraunces** (SIL OFL) — display serif
|
|
151
|
+
- `https://fonts.googleapis.com/css2?family=Fraunces:opsz,wght@9..144,300..900&display=swap`
|
|
152
|
+
- **Bricolage Grotesque** (SIL OFL) — modern display
|
|
153
|
+
- `https://fonts.googleapis.com/css2?family=Bricolage+Grotesque:wght@400;500;700&display=swap`
|
|
154
|
+
|
|
155
|
+
`[YOUR PRODUCT NAME]` 자리를 폼나게 만들 때 위 display 폰트 + `letter-spacing: -0.03em` + `font-weight: 600` 정도가 polish 시작점.
|
|
156
|
+
|
|
157
|
+
## Attribution 의무
|
|
158
|
+
|
|
159
|
+
모든 자산 사용 시 `assets/attribution.md`에 다음 형식으로 기록:
|
|
160
|
+
|
|
161
|
+
```markdown
|
|
162
|
+
# Asset Attribution
|
|
163
|
+
|
|
164
|
+
Generated by `omd:asset-fetch` on <ISO-date>.
|
|
165
|
+
|
|
166
|
+
## Used Assets
|
|
167
|
+
|
|
168
|
+
| Asset | Source URL | License | Used at |
|
|
169
|
+
|---|---|---|---|
|
|
170
|
+
| Hero character | `https://api.dicebear.com/9.x/notionists/svg?seed=X&size=520` | CC0 | landing.html#L148 |
|
|
171
|
+
| Logo wordmark | `Folio` rendered in Bricolage Grotesque 700 (SIL OFL via Google Fonts) | SIL OFL | landing.html header `.logo-wordmark` |
|
|
172
|
+
| Product card 1 photo | `https://picsum.photos/seed/musinsa-card-1/400/500` | CC0 (Picsum) | landing.html#L412 |
|
|
173
|
+
| ... | ... | ... | ... |
|
|
174
|
+
|
|
175
|
+
## License Summary
|
|
176
|
+
|
|
177
|
+
- CC0 자산: 무제한 commercial 사용
|
|
178
|
+
- CC BY 4.0 자산 (Hero Patterns 등): 사용 시 attribution 의무 — 이 파일이 attribution 역할
|
|
179
|
+
- SIL OFL 폰트: 폰트 자체 redistribution은 라이센스에 따름; 웹페이지 임베드는 자유
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
## 호출 패턴
|
|
183
|
+
|
|
184
|
+
이 스킬은 **omd:apply / omd:harness가 내부적으로 호출**하는 룩업 catalog. 사용자가 명시적으로 부를 일은 드묾.
|
|
185
|
+
|
|
186
|
+
| 호출 컨텍스트 | 액션 |
|
|
187
|
+
|---|---|
|
|
188
|
+
| omd:harness가 hero 일러스트 자리 채울 때 | §2 DiceBear avatar URL fetch |
|
|
189
|
+
| omd:apply가 product 카드 N개 그릴 때 | §4 Picsum seeded URL 사용 |
|
|
190
|
+
| omd:harness가 헤더 logo 자리 만들 때 | §1 워드마크-only 패턴 (디스플레이 폰트 + product name, icon mark X) |
|
|
191
|
+
| omd:harness가 feature 카드 아이콘 정할 때 | §3 Lucide URL |
|
|
192
|
+
| 사용자가 직접 "사진 자료 가져와줘" 요청 | 사용자 의도 확인 후 §4 Picsum / Loremflickr |
|
|
193
|
+
|
|
194
|
+
## 검증 gate
|
|
195
|
+
|
|
196
|
+
생성된 HTML 작성 직후 self-audit:
|
|
197
|
+
|
|
198
|
+
1. `grep -E '<svg[^>]*>(\s*<path d="M[0-9.,\sCQ-]+"\s*/?>)' landing.html` — handcrafted inline svg path 개수 확인. 차트(.hero-chart) 외에 0이어야 함.
|
|
199
|
+
2. `grep -E '\[YOUR LOGO\]|\[YOUR PRODUCT NAME\]' landing.html` — placeholder 텍스트 남아있나? 있으면 §1 패턴으로 교체.
|
|
200
|
+
3. `grep -E 'assets/attribution\.md' landing.html` 또는 attribution.md 파일 존재 확인.
|
|
201
|
+
4. `grep -E 'placeholder|TBD|TODO|FIXME' landing.html` — sub-agent가 lazy fallback 남겼나? 0이어야 함.
|
|
202
|
+
|
|
203
|
+
## 안티패턴 (절대 금지)
|
|
204
|
+
|
|
205
|
+
- ❌ generator가 inline SVG로 캐릭터·로고·아이콘·일러스트 "그리기"
|
|
206
|
+
- ❌ catalog에 없는 임의 CDN URL 추측 (e.g. "https://example.com/cool-illustration.svg" 같은 거짓 URL)
|
|
207
|
+
- ❌ brand가 운영하는 CDN URL hot-link (cdn.banksalad.com 등)
|
|
208
|
+
- ❌ 사용자 product에 [YOUR LOGO] 점선 박스 그대로 ship — §1 패턴으로 교체 의무
|
|
209
|
+
- ❌ attribution.md 생략
|
|
210
|
+
|
|
211
|
+
## 한 줄 요약
|
|
212
|
+
|
|
213
|
+
**모든 placeholder = catalog fetch + attribution. handcraft inline graphics 0.**
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: omd:experiment-gallery
|
|
3
|
+
description: "N개 brand experiment를 한 화면에서 비교하는 gallery index.html을 생성. 각 카드는 brand name, wow rating, multi-turn refinement deltas, iframe scaled preview, standalone link 포함. '결과물 한 번에 보여줘', '갤러리 만들어', '5개 비교 뷰', 'experiment 결과 정리' 류 트리거. omd:harness가 N개 brand batch 작업 끝낸 직후 자동 호출되거나 사용자가 명시적으로 호출."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# omd:experiment-gallery — N-brand comparison index
|
|
7
|
+
|
|
8
|
+
## 왜 이 스킬
|
|
9
|
+
|
|
10
|
+
여러 brand experiment를 돌리고 나면 결과물 검수가 산만 — 각 폴더 따로 열고 비교하기 번거로움. 이 skill은 **단일 `index.html`** 에 N개 결과를 iframe으로 박아서 한 화면에서 wow ratings + deltas + 실제 렌더를 동시 확인.
|
|
11
|
+
|
|
12
|
+
## 트리거
|
|
13
|
+
|
|
14
|
+
- 명시: "결과물 한 번에 보여줘", "갤러리 만들어", "N개 비교 뷰"
|
|
15
|
+
- 묵시: 사용자가 omd:harness로 ≥2개 brand experiment를 한 batch에서 끝낸 직후 ("이제 비교해보자" 라는 흐름)
|
|
16
|
+
- 다른 skill 안에서 호출: omd:batch-launch가 5개 brand 끝낸 후 Phase 5로 호출
|
|
17
|
+
|
|
18
|
+
## 입력
|
|
19
|
+
|
|
20
|
+
다음 둘 중 하나:
|
|
21
|
+
|
|
22
|
+
1. **명시 디렉토리 list**: 사용자가 `/tmp/omd-gallery/{brand1,brand2,brand3}` 같은 list 제공
|
|
23
|
+
2. **부모 디렉토리 + glob**: `/tmp/omd-gallery/*` 또는 `web/experiments/2026-05/*` 등 — skill이 자동 enumerate
|
|
24
|
+
|
|
25
|
+
각 brand 디렉토리는 다음 파일들 있어야 함 (있으면 사용, 없으면 fallback):
|
|
26
|
+
- `landing.html` (필수) — iframe src
|
|
27
|
+
- `DESIGN.md` (선택) — brand display name 추출
|
|
28
|
+
- `assets/_reference/<id>/structure.json` (선택) — composition 메타
|
|
29
|
+
- `assets/_reference/<id>/.live-inspect-proof.json` (선택) — live tag 표시
|
|
30
|
+
- `screenshots/after.png` (선택) — fallback preview
|
|
31
|
+
- `experiment-meta.json` (선택, 권장) — wow rating + round-2 deltas + 카테고리 — sub-agent가 작성
|
|
32
|
+
|
|
33
|
+
## experiment-meta.json 스키마 (sub-agent가 작성)
|
|
34
|
+
|
|
35
|
+
각 experiment sub-agent는 work 종료 직전 다음 파일을 작성:
|
|
36
|
+
|
|
37
|
+
```json
|
|
38
|
+
{
|
|
39
|
+
"brand_id": "toss",
|
|
40
|
+
"brand_korean": "토스",
|
|
41
|
+
"brand_category": "Fintech",
|
|
42
|
+
"brand_color_hex": "#3182f6",
|
|
43
|
+
"wow_rating": 7.5,
|
|
44
|
+
"lines": 603,
|
|
45
|
+
"live_inspect": { "ran": true, "raw_samples": 7, "method": "playwright|harness" },
|
|
46
|
+
"round2_deltas": [
|
|
47
|
+
"Reveal failsafe — 2s forwards animation",
|
|
48
|
+
"Stat-card narrative upgrade",
|
|
49
|
+
"CTA copy 구체화 (시간 약속)",
|
|
50
|
+
"Hero shimmer (accent text gradient)",
|
|
51
|
+
"Dark marquee band rhythm break",
|
|
52
|
+
"Chart stroke-dashoffset draw-in"
|
|
53
|
+
],
|
|
54
|
+
"ip_compliance": {
|
|
55
|
+
"your_logo_placeholders": 2,
|
|
56
|
+
"your_product_name_placeholders": 4,
|
|
57
|
+
"brand_logo_embed_count": 0,
|
|
58
|
+
"verbatim_brand_copy": 0
|
|
59
|
+
},
|
|
60
|
+
"honest_gaps": [
|
|
61
|
+
"Hero composition은 single character + flat card (3D ornament 부재)",
|
|
62
|
+
"Carousel은 dot만 회전 (slide content 미스왑)"
|
|
63
|
+
]
|
|
64
|
+
}
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
skill이 이 파일을 읽어 gallery 카드의 wow / lines / deltas 영역 채움. 없으면 brand_id만으로 minimal 카드.
|
|
68
|
+
|
|
69
|
+
## 출력
|
|
70
|
+
|
|
71
|
+
### 1. `<output-dir>/index.html` (메인 산출물)
|
|
72
|
+
|
|
73
|
+
다음 구조:
|
|
74
|
+
|
|
75
|
+
- 헤더: title (사용자가 batch 명령에서 받은 raw — "한국 brand 5선" 등), kicker (date · brand 수), meta (version · skill chain · mode)
|
|
76
|
+
- main grid: brand 1개당 card 1개
|
|
77
|
+
- card head: brand mark (CSS-generated initial chip 또는 DiceBear shapes if brand has known color) + 한글명 + id + wow rating
|
|
78
|
+
- frame-wrap: aspect-ratio 16:10 iframe (scale 50%로 200%×200% iframe rendering — 모바일은 100%)
|
|
79
|
+
- card foot: voice note 1줄 + tags chips + round-2 deltas ol
|
|
80
|
+
- footer summary: 모든 brand wow/lines/proof/round-2 핵심 1줄 테이블
|
|
81
|
+
- system-note: 적용된 skill 버전의 시스템 fix들 한 단락
|
|
82
|
+
|
|
83
|
+
### 2. CSS 스타일 가이드
|
|
84
|
+
|
|
85
|
+
- typography: Pretendard from jsdelivr (SIL OFL). 디스플레이는 본문 헤더에만 (`clamp(36px,4.4vw,56px) / weight 800 / letter-spacing -0.04em`)
|
|
86
|
+
- 다크 surface (`#0b0d10`) — gallery는 dark mode가 정석 (검토 환경 자체가 광원이 되도록)
|
|
87
|
+
- accent: gradient `linear-gradient(135deg, #7c5cfc 0%, #fa2e5f 50%, #04c584 100%)` — Stripe-like
|
|
88
|
+
- card: `bg #13161b`, border `#252b35`, hover `border #7c5cfc` + `translateY -2px`
|
|
89
|
+
- 반응형: ≥1100px 2-col grid, <1100px 1-col
|
|
90
|
+
|
|
91
|
+
### 3. iframe scaling
|
|
92
|
+
|
|
93
|
+
```css
|
|
94
|
+
.frame-wrap { aspect-ratio: 16/10; background: #fff; overflow: hidden; position: relative; }
|
|
95
|
+
.frame-wrap iframe {
|
|
96
|
+
position: absolute; top: 0; left: 0;
|
|
97
|
+
width: 200%; height: 200%;
|
|
98
|
+
transform: scale(.5); transform-origin: top left;
|
|
99
|
+
border: 0;
|
|
100
|
+
}
|
|
101
|
+
.open-link {
|
|
102
|
+
position: absolute; top: 12px; right: 12px;
|
|
103
|
+
background: rgba(11,13,16,.7); color: #fff;
|
|
104
|
+
padding: 6px 12px; border-radius: 999px;
|
|
105
|
+
font-size: 11px; backdrop-filter: blur(8px);
|
|
106
|
+
}
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
200% × scale(.5)는 모바일 viewport에서도 데스크탑 layout 그대로 렌더하기 위함 (iframe 본인은 1280-1920px 가정).
|
|
110
|
+
|
|
111
|
+
### 4. 정적 vs 서버 모드
|
|
112
|
+
|
|
113
|
+
- iframe src는 **상대 경로** (`./toss/landing.html`) — 정적 file:// open 안 됨 (CORS), `python3 -m http.server <port>` 추천
|
|
114
|
+
- skill 끝에 사용자에게 "서버 띄우는 명령" 출력:
|
|
115
|
+
```
|
|
116
|
+
cd <output-dir> && python3 -m http.server 8770
|
|
117
|
+
open http://localhost:8770/index.html
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
## 실행 절차
|
|
121
|
+
|
|
122
|
+
1. **입력 검증**: 디렉토리 list parsed, 각 디렉토리에 `landing.html` 존재 확인. 없으면 그 brand는 skip + 사용자에게 알림.
|
|
123
|
+
|
|
124
|
+
2. **meta 수집**: 각 brand 디렉토리에서:
|
|
125
|
+
- `experiment-meta.json` 있으면 그대로 사용
|
|
126
|
+
- 없으면 `DESIGN.md` frontmatter에서 `brand` 추출, `landing.html`에서 `<title>` 추출 → minimal card
|
|
127
|
+
- `structure.json`이 있으면 hero.type / cta.dominant_shape 정도를 tag로 추가
|
|
128
|
+
- `.live-inspect-proof.json` 존재 → "live ✓" tag, raw_samples 수 표시
|
|
129
|
+
|
|
130
|
+
3. **brand mark 생성**: brand_color_hex가 있으면 색칩 div에 첫 글자. 없으면 회색 fallback.
|
|
131
|
+
|
|
132
|
+
4. **gallery HTML 작성**: 위 CSS + 카드 구조로 출력. `<output-dir>/index.html`에 write.
|
|
133
|
+
|
|
134
|
+
5. **사용자 요약**:
|
|
135
|
+
```
|
|
136
|
+
✓ Gallery 생성: <output-dir>/index.html
|
|
137
|
+
- 카드 N개 · wow 평균 X.X · live-inspect 통과 Y/N
|
|
138
|
+
- 서버 띄우는 법: cd <output-dir> && python3 -m http.server 8770
|
|
139
|
+
- 열기: http://localhost:8770/index.html
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
## 멀티턴 self-feedback 옵션 (v1.3.6 신설)
|
|
143
|
+
|
|
144
|
+
`browser-harness` 또는 `mcp__playwright__*` 가용 시, gallery 생성 후 **gallery 자체에 self-critique 라운드**:
|
|
145
|
+
|
|
146
|
+
1. gallery index.html을 browser-harness로 열어 screenshot
|
|
147
|
+
2. 각 brand 카드의 iframe rendering이 정상인지 (빈 화면 / 깨진 layout / 누락 자산) 시각 grading
|
|
148
|
+
3. 발견된 문제 brand에 대해 **issue.md** 작성 (`<output-dir>/issues.md`):
|
|
149
|
+
```markdown
|
|
150
|
+
# Gallery issues — auto-detected via browser-harness
|
|
151
|
+
- toss: hero section reveals empty (IntersectionObserver fired but skill rule 10 safety net missing) — re-run with v1.3.6
|
|
152
|
+
- karrot: product card photo 3 fails to load (Loremflickr 503) — fallback to Picsum needed
|
|
153
|
+
```
|
|
154
|
+
4. 사용자에게 issues.md 안내 + 자동 fix 진행 여부 묻기
|
|
155
|
+
|
|
156
|
+
## 안티패턴 (절대 금지)
|
|
157
|
+
|
|
158
|
+
- ❌ Brand 디렉토리 안의 자산을 gallery에 직접 복사 (iframe으로만 reference)
|
|
159
|
+
- ❌ Brand creative work 재구성 (각 brand의 own landing.html이 self-contained — gallery는 그 wrapper일 뿐)
|
|
160
|
+
- ❌ wow rating 임의 부여 (sub-agent의 honest assessment가 출처)
|
|
161
|
+
|
|
162
|
+
## 한 줄 요약
|
|
163
|
+
|
|
164
|
+
**N개 brand experiment → 1개 index.html. iframe scaled, wow rating, round-2 deltas, system-fix summary. 재사용 무한.**
|