@3xhaust/oh-my-design 0.16.1
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/LICENSE +21 -0
- package/README.ko.md +282 -0
- package/README.md +282 -0
- package/adapters/build.ts +184 -0
- package/adapters/claude.ts +111 -0
- package/adapters/codex.ts +68 -0
- package/adapters/tokens.ts +21 -0
- package/adapters/tool-map.json +7 -0
- package/bin/omd-install.ts +76 -0
- package/bin/omd.ts +1774 -0
- package/core/asset-sourcing/index.ts +187 -0
- package/core/coach/index.ts +98 -0
- package/core/composition/app-shell-workbench.md +168 -0
- package/core/composition/asymmetric-diagonal-grid.md +178 -0
- package/core/composition/bento-grid.md +223 -0
- package/core/composition/editorial-index-labels.md +173 -0
- package/core/composition/form-wizard-stepper.md +132 -0
- package/core/composition/master-detail-flow.md +129 -0
- package/core/composition/section-inversion.md +182 -0
- package/core/composition/sidebar-margin-annotation.md +184 -0
- package/core/composition/split-screen-hero.md +224 -0
- package/core/composition/sticky-sidebar-scroll.md +219 -0
- package/core/composition/typographic-hero.md +100 -0
- package/core/composition-contract/index.ts +233 -0
- package/core/composition-contract/visual-richness.ts +101 -0
- package/core/config/index.ts +27 -0
- package/core/copy/index.ts +296 -0
- package/core/craft/finish-pass.md +356 -0
- package/core/craft/index.ts +33 -0
- package/core/design/index.ts +581 -0
- package/core/design/interaction-states.ts +189 -0
- package/core/eval-harness/index.ts +225 -0
- package/core/evidence/final.ts +444 -0
- package/core/evidence/task.ts +459 -0
- package/core/figma/client.ts +312 -0
- package/core/figma/diff.ts +261 -0
- package/core/figma/responsive.ts +310 -0
- package/core/figma/system.ts +466 -0
- package/core/figma/types.ts +185 -0
- package/core/frame/check-ux.ts +180 -0
- package/core/frame/index.ts +39 -0
- package/core/frame/write.ts +168 -0
- package/core/graphics/css-illustration-primitives.md +189 -0
- package/core/graphics/duotone-image-presets.md +173 -0
- package/core/graphics/gradient-mesh.md +178 -0
- package/core/graphics/noise-grain-texture.md +150 -0
- package/core/graphics/placeholder-policy.md +185 -0
- package/core/graphics/svg-geometric-patterns.md +145 -0
- package/core/history/index.ts +39 -0
- package/core/install/detect.ts +32 -0
- package/core/install/install.ts +321 -0
- package/core/install/patch-claude.ts +109 -0
- package/core/install/patch-codex.ts +82 -0
- package/core/interaction/index.ts +101 -0
- package/core/interaction/recipes/signature-lighting.md +203 -0
- package/core/ir/dom.ts +352 -0
- package/core/ir/normalize.ts +177 -0
- package/core/motion/easing.md +151 -0
- package/core/motion/energy.ts +188 -0
- package/core/motion/recipes/image-hover-distortion.md +198 -0
- package/core/motion/recipes/magnetic-hover.md +229 -0
- package/core/motion/recipes/marquee.md +202 -0
- package/core/motion/recipes/number-counter.md +242 -0
- package/core/motion/recipes/page-loader.md +240 -0
- package/core/motion/recipes/parallax.md +233 -0
- package/core/motion/recipes/scroll-reveal.md +210 -0
- package/core/motion/recipes/section-color-inversion.md +217 -0
- package/core/motion/recipes/split-text-entrance.md +222 -0
- package/core/motion/recipes/stagger-orchestrator.md +227 -0
- package/core/motion/recipes/sticky-scene-transition.md +246 -0
- package/core/motion/recipes/view-transitions.md +239 -0
- package/core/probe/index.ts +186 -0
- package/core/probe/schema.json +46 -0
- package/core/protocol/composition-contract.md +192 -0
- package/core/protocol/copy-deck.md +96 -0
- package/core/protocol/human-design-loop.md +447 -0
- package/core/protocol/slop-review.md +71 -0
- package/core/ref/batch.ts +94 -0
- package/core/ref/blueprint.ts +199 -0
- package/core/ref/distance.ts +225 -0
- package/core/ref/invariants.ts +162 -0
- package/core/ref/signal.ts +37 -0
- package/core/ref/store.ts +122 -0
- package/core/render/index.ts +607 -0
- package/core/rules/attribution.ts +159 -0
- package/core/rules/builtin/contrast.yaml +8 -0
- package/core/rules/builtin/focus.yaml +8 -0
- package/core/rules/builtin/hit-area.yaml +8 -0
- package/core/rules/builtin/ko.yaml +6 -0
- package/core/rules/builtin/motion.yaml +80 -0
- package/core/rules/builtin/slop.yaml +365 -0
- package/core/rules/builtin/spacing.yaml +9 -0
- package/core/rules/builtin/system.yaml +42 -0
- package/core/rules/builtin/token.yaml +8 -0
- package/core/rules/builtin/ux.yaml +125 -0
- package/core/rules/engine.ts +88 -0
- package/core/rules/leakage.ts +72 -0
- package/core/rules/motion-spec.ts +204 -0
- package/core/site/index.ts +100 -0
- package/core/slop/index.ts +427 -0
- package/core/slop/text-slop.ts +220 -0
- package/core/source-seal/index.ts +174 -0
- package/core/stack/index.ts +53 -0
- package/core/target/index.ts +183 -0
- package/core/theory/color.md +285 -0
- package/core/theory/components.md +272 -0
- package/core/theory/craft.md +270 -0
- package/core/theory/expressive.md +213 -0
- package/core/theory/imagegen.md +105 -0
- package/core/theory/layout.md +159 -0
- package/core/theory/motion.md +283 -0
- package/core/theory/typography.md +134 -0
- package/core/theory/ux.md +580 -0
- package/core/theory/voice.md +595 -0
- package/core/types.ts +684 -0
- package/package.json +40 -0
- package/src/agents/composer.agent.yaml +174 -0
- package/src/agents/eye.agent.yaml +208 -0
- package/src/agents/framer.agent.yaml +52 -0
- package/src/agents/glance.agent.yaml +19 -0
- package/src/agents/hand.agent.yaml +200 -0
- package/src/agents/scout.agent.yaml +71 -0
- package/src/agents/sketch.agent.yaml +64 -0
- package/src/agents/typesetter.agent.yaml +52 -0
- package/src/agents/writer.agent.yaml +63 -0
- package/src/skills/omd-coach/SKILL.md +40 -0
- package/src/skills/omd-critique/SKILL.md +77 -0
- package/src/skills/omd-figma/SKILL.md +256 -0
- package/src/skills/omd-humanize/SKILL.md +160 -0
- package/src/skills/omd-scout/SKILL.md +77 -0
- package/src/skills/omd-ultradesign/SKILL.md +521 -0
|
@@ -0,0 +1,256 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: omd-figma
|
|
3
|
+
description: >-
|
|
4
|
+
Implement a Figma design end to end: pull the file, synthesize the design system,
|
|
5
|
+
build each frame pixel-faithfully with an iterative diff loop, match responsive
|
|
6
|
+
pairs, and ship with a fidelity report. Use when a figma.com link is present in
|
|
7
|
+
the brief — the design decisions were already made in Figma; the job here is
|
|
8
|
+
faithful implementation and systematization, not concept invention.
|
|
9
|
+
Triggers: 피그마, figma link, 피그마 그대로 구현, any figma.com URL in the brief.
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# omd-figma
|
|
13
|
+
|
|
14
|
+
When Figma exists, the design is already decided. The frame/concept/reference steps
|
|
15
|
+
of the design loop are not needed — someone made those choices, and they are visible
|
|
16
|
+
in the file. The job here is different: read what was designed, build it faithfully,
|
|
17
|
+
systematize it so the implementation can be maintained, and tell the user honestly
|
|
18
|
+
how close the build got.
|
|
19
|
+
|
|
20
|
+
The slop linter still runs. If the *original Figma design* fires slop rules, report
|
|
21
|
+
that to the user as information — never silently "fix" their design. The user hired
|
|
22
|
+
a faithful implementation, not a corrected one.
|
|
23
|
+
|
|
24
|
+
---
|
|
25
|
+
|
|
26
|
+
## Before anything: check the environment and the token
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
omd doctor
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
Run `omd doctor` first, quietly. If any check fails, surface the failure in one
|
|
33
|
+
sentence and stop. A missing Playwright installation or an unwritable `.omd/` will
|
|
34
|
+
break every subsequent step, and discovering that mid-loop is wasteful.
|
|
35
|
+
|
|
36
|
+
`omd figma pull` requires a Figma personal access token. This is the **one allowed
|
|
37
|
+
user interaction** in the skill. Check for it before pulling:
|
|
38
|
+
|
|
39
|
+
```bash
|
|
40
|
+
echo $FIGMA_TOKEN
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
If `FIGMA_TOKEN` is absent, tell the user exactly how to create one and where to set
|
|
44
|
+
it, then stop:
|
|
45
|
+
|
|
46
|
+
> To use `omd-figma`, you need a Figma personal access token.
|
|
47
|
+
>
|
|
48
|
+
> 1. Open Figma → **Account settings** (your avatar, top-left) → **Security** tab.
|
|
49
|
+
> 2. Under **Personal access tokens**, click **Generate new token**.
|
|
50
|
+
> Scopes: **File content** (read) is sufficient.
|
|
51
|
+
> 3. Copy the token and set it in your shell:
|
|
52
|
+
> ```bash
|
|
53
|
+
> export FIGMA_TOKEN=figd_...
|
|
54
|
+
> ```
|
|
55
|
+
> To persist it, add that line to `~/.zshrc` or `~/.bashrc`.
|
|
56
|
+
> 4. Then re-run the skill.
|
|
57
|
+
|
|
58
|
+
Do not attempt to proceed without the token. Do not invent a workaround.
|
|
59
|
+
|
|
60
|
+
---
|
|
61
|
+
|
|
62
|
+
## 1. PULL — read the Figma file
|
|
63
|
+
|
|
64
|
+
```bash
|
|
65
|
+
omd figma pull <figma-url>
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
This writes `.omd/figma/snapshot.json` — the normalized page → frame → node tree —
|
|
69
|
+
and prints a page/frame inventory so the implementer can see what they are building.
|
|
70
|
+
The snapshot includes a `responsive` section: frames grouped into breakpoint sets by
|
|
71
|
+
the name-suffix and structure-similarity heuristics. Read this section before
|
|
72
|
+
building. It is the answer to "which frames go together."
|
|
73
|
+
|
|
74
|
+
The pull also computes responsive pairs (F4). Read the `responsive.breakpointSets`
|
|
75
|
+
section to understand which frames are desktop/tablet/mobile variants of the same
|
|
76
|
+
screen. Unpaired frames are in `responsive.unmatched` — they will fall back to the
|
|
77
|
+
dual-viewport rule (build once, diff at the frame's own width; record that the
|
|
78
|
+
pairing was a fallback).
|
|
79
|
+
|
|
80
|
+
---
|
|
81
|
+
|
|
82
|
+
## 2. SYSTEM — design system before any frame
|
|
83
|
+
|
|
84
|
+
```bash
|
|
85
|
+
omd figma system
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
This reads the snapshot and writes two artifacts:
|
|
89
|
+
- `.omd/figma/design-system.md` — color palette, type scale, spacing, radii,
|
|
90
|
+
shadows, and the component inventory as a human-readable table.
|
|
91
|
+
- A `:root` CSS file with all tokens as custom properties, ready to paste into
|
|
92
|
+
the build's stylesheet.
|
|
93
|
+
|
|
94
|
+
**Build the design system before any frame.** Components with variants become React
|
|
95
|
+
components (when the project is React) or standalone CSS classes with modifier
|
|
96
|
+
variants. Build each component set once; every frame that uses it is an instance,
|
|
97
|
+
not a copy. A component that appears in three frames is implemented three times
|
|
98
|
+
only if you did not read the inventory.
|
|
99
|
+
|
|
100
|
+
Record the component decisions:
|
|
101
|
+
|
|
102
|
+
```bash
|
|
103
|
+
omd decision "Button component: 3 variants (Size=sm/md, State=default/hover)" \
|
|
104
|
+
--why "component set from snapshot; variant props map directly to CSS modifiers"
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
---
|
|
108
|
+
|
|
109
|
+
## 3. BUILD LOOP — per-frame, pixel-faithful, max 4 iterations
|
|
110
|
+
|
|
111
|
+
For each frame in the inventory (name-matched responsive pairs count as one build
|
|
112
|
+
target with multiple viewports):
|
|
113
|
+
|
|
114
|
+
**① Build the frame** — using the design system tokens from step 2, not hardcoded
|
|
115
|
+
values. Every color is a `var(--color-*)`, every spacing is a `var(--spacing-*)`,
|
|
116
|
+
every radius is a `var(--radius-*)`.
|
|
117
|
+
|
|
118
|
+
**② Diff**
|
|
119
|
+
|
|
120
|
+
```bash
|
|
121
|
+
omd figma diff <frame-id> <rendered-page> --json
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
Read the `cells` array. Find the worst cells (highest `mismatch`). The cell
|
|
125
|
+
coordinates are in the reference image's pixel space — they tell you *where* the
|
|
126
|
+
divergence is, not just how much.
|
|
127
|
+
|
|
128
|
+
**③ Fix** — address the worst cells. Typical causes: wrong component size, wrong
|
|
129
|
+
spacing token, missing border, wrong font weight. Fix the specific region the diff
|
|
130
|
+
named; do not guess.
|
|
131
|
+
|
|
132
|
+
**④ Re-diff** — repeat until `score ≥ 0.97` or the iteration ceiling is reached.
|
|
133
|
+
|
|
134
|
+
**Ceiling: 4 iterations per frame.** After 4, record the final score and move on.
|
|
135
|
+
A frame that reaches the ceiling with score < 0.97 is not a failure of the loop —
|
|
136
|
+
it is honest data. The fidelity report will show it.
|
|
137
|
+
|
|
138
|
+
Record each frame's final score:
|
|
139
|
+
|
|
140
|
+
```bash
|
|
141
|
+
omd decision "Hero frame: final score 0.983 (3 iterations)" \
|
|
142
|
+
--why "font rendering divergence on large display text; within antialiasing tolerance"
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
---
|
|
146
|
+
|
|
147
|
+
## 4. RESPONSIVE — paired frames, honest fallbacks
|
|
148
|
+
|
|
149
|
+
For each breakpoint set in `responsive.breakpointSets`:
|
|
150
|
+
- Build each variant at its own viewport width.
|
|
151
|
+
- Diff each variant against its own Figma export (the diff tool renders at the
|
|
152
|
+
frame's declared width).
|
|
153
|
+
- Report scores per variant in the fidelity table.
|
|
154
|
+
|
|
155
|
+
For frames in `responsive.unmatched` (no Figma-side viewport partner):
|
|
156
|
+
- Apply the dual-viewport rule: build once, render at 1280px and 375px, check both,
|
|
157
|
+
record that the responsive pairing was a **fallback** (no Figma reference for the
|
|
158
|
+
missing viewport).
|
|
159
|
+
- The fallback is not a gap in the implementation — it is an honest statement that
|
|
160
|
+
the design did not specify a mobile layout, and the build interpolated one.
|
|
161
|
+
|
|
162
|
+
```bash
|
|
163
|
+
omd decision "Contact page: no mobile variant in Figma — dual-viewport fallback applied" \
|
|
164
|
+
--why "responsive.unmatched; mobile layout interpolated from desktop, not diffed"
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
---
|
|
168
|
+
|
|
169
|
+
## 5. SLOP CHECK — the original design, honestly reported
|
|
170
|
+
|
|
171
|
+
After all frames are built, run the slop linter on each page:
|
|
172
|
+
|
|
173
|
+
```bash
|
|
174
|
+
omd check <page> --category slop --json
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
If the slop linter fires on findings that trace back to the original Figma design
|
|
178
|
+
(the indigo gradient that was in Figma, the three identical feature cards that were
|
|
179
|
+
in the design), **report them to the user as information, not corrections**:
|
|
180
|
+
|
|
181
|
+
> The original Figma design has these slop findings: `SLOP-GRADIENT` (hero
|
|
182
|
+
> background), `SLOP-TRIPLE-CARD` (features section). The build implements the
|
|
183
|
+
> design as specified. If you want these addressed, update the Figma file and
|
|
184
|
+
> re-pull, or override them with a written reason.
|
|
185
|
+
|
|
186
|
+
Never silently "fix" the design. The user's Figma file is the source of truth.
|
|
187
|
+
|
|
188
|
+
If findings arise from the *implementation* (a gradient the build introduced that
|
|
189
|
+
was not in the Figma file), fix them — those are build errors, not design choices.
|
|
190
|
+
|
|
191
|
+
---
|
|
192
|
+
|
|
193
|
+
## 6. SHIP — fidelity report, attribution, deliver
|
|
194
|
+
|
|
195
|
+
Run the full check suite:
|
|
196
|
+
|
|
197
|
+
```bash
|
|
198
|
+
omd check <page> --json --viewport 1280x800
|
|
199
|
+
omd check <page> --json --viewport 375x812
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
Then deliver the working implementation plus a fidelity report table. The table is
|
|
203
|
+
not a decoration — it is the honest record of how close the build got to the design.
|
|
204
|
+
|
|
205
|
+
**Fidelity report format:**
|
|
206
|
+
|
|
207
|
+
| Frame | Viewport | Score | Iterations | Notes |
|
|
208
|
+
|---|---|---|---|---|
|
|
209
|
+
| Hero | 1440px (desktop) | 0.983 | 3 | Font AA delta on display heading |
|
|
210
|
+
| Hero | 375px (mobile) | 0.978 | 2 | — |
|
|
211
|
+
| Features | 1440px | 0.997 | 1 | — |
|
|
212
|
+
| Contact | 1440px | 0.965 | 4 | Ceiling reached; map embed diff |
|
|
213
|
+
| Contact | 375px | — | — | Fallback: no Figma mobile frame |
|
|
214
|
+
|
|
215
|
+
Include the attribution map. The frame IDs are the sources. `.omd/attribution.md`
|
|
216
|
+
should record which Figma frame each token group was extracted from:
|
|
217
|
+
|
|
218
|
+
```
|
|
219
|
+
| Decision | Source | Reason |
|
|
220
|
+
|---|---|---|
|
|
221
|
+
| --color-bg: #ffffff | snapshot frame:1:2 (Hero) | dominant fill, luminance=1 |
|
|
222
|
+
| --type-scale-1: 48px | snapshot frame:1:2 (Hero) | display heading fontSize |
|
|
223
|
+
| Button component | component set "Button" | variant matrix from system step |
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
Everything lands in `.omd/figma/` and `.omd/attribution.md`, committed with the repo.
|
|
227
|
+
|
|
228
|
+
---
|
|
229
|
+
|
|
230
|
+
## Relationship to omd-ultradesign
|
|
231
|
+
|
|
232
|
+
When a Figma file is in the brief, the design decisions — concept, colour, type,
|
|
233
|
+
layout — were made in Figma. The ultradesign loop's frame/concept/reference steps
|
|
234
|
+
(steps 1–3) are not needed and should not run. Hand off here.
|
|
235
|
+
|
|
236
|
+
The discipline of the ultradesign loop that *does* carry over:
|
|
237
|
+
- The slop linter runs. If the original design fires findings, report them honestly.
|
|
238
|
+
- Attribution is tracked. Frame IDs are the source entries.
|
|
239
|
+
- Motion: if the Figma file includes motion prototyping, read it and record a
|
|
240
|
+
`.omd/motion-spec.md`; if not, the motion decision falls to the implementer and
|
|
241
|
+
must be recorded.
|
|
242
|
+
|
|
243
|
+
---
|
|
244
|
+
|
|
245
|
+
## Constraints
|
|
246
|
+
|
|
247
|
+
- **Never ask the user for the token twice.** If it was set, `$FIGMA_TOKEN` is there.
|
|
248
|
+
- **Never fix the original design silently.** Report slop findings that trace back
|
|
249
|
+
to Figma; let the user decide.
|
|
250
|
+
- **Never hardcode a hex value from the snapshot.** Use `var(--color-*)` from the
|
|
251
|
+
design system output.
|
|
252
|
+
- **Never copy a component implementation across frames.** Build it once, use it
|
|
253
|
+
everywhere.
|
|
254
|
+
- **Never stop the loop before running the diff.** An unverified build is not a
|
|
255
|
+
faithful implementation — it is a guess.
|
|
256
|
+
- **Never claim a score you did not measure.** Read the diff output; do not estimate.
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: omd-humanize
|
|
3
|
+
description: >-
|
|
4
|
+
Rewrite chat, assistant replies, UI copy, pages, essays, and documentation into natural,
|
|
5
|
+
situation-aware discourse without changing facts. Repairs mechanical prose locally or
|
|
6
|
+
reconstructs a misshapen message from verified facts and its voice contract.
|
|
7
|
+
Triggers: humanize, 사람같이, 사람처럼 써, AI티 빼줘, 자연스럽게 바꿔, 글 다듬어,
|
|
8
|
+
make it sound human, de-AI, rewrite naturally.
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# omd-humanize
|
|
12
|
+
|
|
13
|
+
Natural writing is not text with detector bait removed. It is a person, in a specific
|
|
14
|
+
situation, trying to change what a specific listener knows, feels able to do, or does next.
|
|
15
|
+
Edit that discourse. Do not optimize for detector evasion, add mistakes, imitate a person,
|
|
16
|
+
or manufacture quirky rhythm.
|
|
17
|
+
|
|
18
|
+
## Hard laws
|
|
19
|
+
|
|
20
|
+
1. **Freeze the evidence.** Preserve facts, numbers, names, verified claims, uncertainty,
|
|
21
|
+
and verbatim quotations. Never invent a promise, comparison, emotion, motive, personal
|
|
22
|
+
experience, customer, result, or degree of certainty. If an exact quote cannot stay
|
|
23
|
+
verbatim, remove it; never paraphrase it as a quote.
|
|
24
|
+
2. **Preserve the job and register.** Chat remains dialogue, a support reply remains
|
|
25
|
+
support, an essay remains an essay, and documentation remains documentation. Formality,
|
|
26
|
+
language, accessibility needs, and the requested genre do not drift toward generic
|
|
27
|
+
marketing voice.
|
|
28
|
+
3. **Edit the smallest coherent discourse unit.** Repair a sentence, exchange, paragraph,
|
|
29
|
+
or section that has one communicative job. Do not perform token-by-token synonym swaps;
|
|
30
|
+
they preserve the broken logic while making factual drift harder to see.
|
|
31
|
+
4. **Do the requested work.** The first useful sentence carries the answer, decision, or
|
|
32
|
+
next action. Do not announce an answer before giving it, substitute an offer of help for
|
|
33
|
+
the help, or continue after the communicative job is complete.
|
|
34
|
+
|
|
35
|
+
## Required input contract
|
|
36
|
+
|
|
37
|
+
Identify these before rewriting:
|
|
38
|
+
|
|
39
|
+
- **Speaker** — who is speaking and what authority they have;
|
|
40
|
+
- **Listener** — who needs this and what context they already share;
|
|
41
|
+
- **Situation** — what just happened or prompted the message;
|
|
42
|
+
- **Intended change / next move** — what should become clearer or possible;
|
|
43
|
+
- **Genre and register** — chat reply, UI state, landing page, essay, tutorial, policy,
|
|
44
|
+
support response, or another named form, including language and formality;
|
|
45
|
+
- **Facts and quotes** — the allowed factual ledger, uncertainty, and exact quotations.
|
|
46
|
+
|
|
47
|
+
In an OMD run, derive this contract from `.omd/copy-deck.md`: Voice contract `Audience`,
|
|
48
|
+
`Language`, and `Register`, then each surface's `Main message`, `Supporting fact`, `Next
|
|
49
|
+
action`, and `Claim refs`. Only `verified` facts may support shipped claims. `open` and
|
|
50
|
+
`fixture` facts cannot ship. When speaker, listener, situation, intent, genre, register,
|
|
51
|
+
fact status, or quote status is missing, return the gap to `omd-writer`; do not guess.
|
|
52
|
+
|
|
53
|
+
## Choose one mode
|
|
54
|
+
|
|
55
|
+
### Mode A — local repair
|
|
56
|
+
|
|
57
|
+
Use local repair when the message already has a sound order: it answers the right question,
|
|
58
|
+
each section has a distinct job, and the next move is clear. Rewrite only the smallest unit
|
|
59
|
+
whose wording blocks that job. Typical repairs make the actor and action concrete, move a
|
|
60
|
+
caveat next to its claim, remove a redundant restatement, or replace translation-shaped
|
|
61
|
+
nominalization with a direct verb while preserving register.
|
|
62
|
+
|
|
63
|
+
### Mode B — reconstruct from facts
|
|
64
|
+
|
|
65
|
+
Use reconstruction only when the prompt has shaped the discourse itself: the response
|
|
66
|
+
mirrors the request instead of answering it, explains its own plan before acting, repeats
|
|
67
|
+
the same proposition under symmetrical headings, or buries a simple next move under
|
|
68
|
+
exhaustive framing. Patching sentences cannot repair that order.
|
|
69
|
+
|
|
70
|
+
Discard the generated outline, not the evidence. Rebuild from the verified fact ledger,
|
|
71
|
+
voice contract, and the surface's real action/state. For non-OMD conversation, rebuild only
|
|
72
|
+
from the supplied facts and established conversational context. Preserve every honest
|
|
73
|
+
unknown. Never import a new claim merely to make the reconstruction sound complete.
|
|
74
|
+
|
|
75
|
+
## Diagnose the discourse, not isolated tokens
|
|
76
|
+
|
|
77
|
+
These are contextual root causes. A word or structure is not a verdict by itself.
|
|
78
|
+
|
|
79
|
+
- **Ceremonial acknowledgement** delays the payload with thanks, praise, or agreement that
|
|
80
|
+
changes nothing. Keep acknowledgement when relationship repair, support, or a sensitive
|
|
81
|
+
event genuinely requires it; make it specific and brief.
|
|
82
|
+
- **Request echo** repeats what the listener just said. Restatement is useful when confirming
|
|
83
|
+
a dangerous, ambiguous, legal, or multi-step instruction; otherwise answer directly.
|
|
84
|
+
- **Answer narration** describes what the reply will cover before covering it. Tutorials and
|
|
85
|
+
long reference documents may need a map; a simple question does not.
|
|
86
|
+
- **Deferred service** offers to investigate, draft, or help when the speaker can perform
|
|
87
|
+
that work now. Ask a question only for a real gap that changes the result.
|
|
88
|
+
- **Scale mismatch** gives a taxonomy, lecture, or caveat wall to a small practical request.
|
|
89
|
+
Legal, medical, security, and safety-critical material may need explicit limits; place
|
|
90
|
+
each limit beside the claim it qualifies.
|
|
91
|
+
- **Redundant recap** repeats a proposition in the title, opening, bullets, conclusion, or
|
|
92
|
+
CTA without adding a decision. Recap is legitimate in long tutorials, handoffs, and
|
|
93
|
+
accessibility-oriented instructions when it supports recall or safe completion.
|
|
94
|
+
- **Performed empathy** names an emotion the speaker cannot know or uses a stock sympathy
|
|
95
|
+
line. Support writing may acknowledge an observed consequence; do not invent the person's
|
|
96
|
+
feelings.
|
|
97
|
+
- **Template geometry** forces equal headings, matching paragraph sizes, repeated triads,
|
|
98
|
+
or balanced contrast clauses onto ideas that do not have equal weight. Keep lists and
|
|
99
|
+
parallel structure when the content is genuinely enumerable or comparable.
|
|
100
|
+
- **Abstract agency** hides the actor and action inside nouns, passive layers, or
|
|
101
|
+
translation-shaped phrasing. Restore a concrete subject and verb unless the genre needs
|
|
102
|
+
the actor omitted for legal, scientific, or procedural precision.
|
|
103
|
+
- **Automatic closing** adds a generic invitation after the answer is already complete.
|
|
104
|
+
Keep a closing action only when the listener needs a real escalation route or next step.
|
|
105
|
+
|
|
106
|
+
## Language and surface judgment
|
|
107
|
+
|
|
108
|
+
For Korean, choose the speech level from the genre and voice contract, then hold it. Product
|
|
109
|
+
copy often uses 해요체 or 합니다체; essays, developer notes, dialogue, legal text, and quoted
|
|
110
|
+
speech may require different registers. Treat repeated literal subjects, stacked particles,
|
|
111
|
+
translation-shaped passive forms, connective punctuation, and nominal padding as symptoms
|
|
112
|
+
only when they make this speaker sound unnatural in this situation. Korean connectives can
|
|
113
|
+
carry real logic; do not delete them mechanically.
|
|
114
|
+
|
|
115
|
+
For English, inspect hedging stacks, abstract nouns, formulaic openings, symmetrical contrast,
|
|
116
|
+
and reflexive politeness in context. A policy caveat, support acknowledgement, or tutorial
|
|
117
|
+
signpost may be doing necessary work. Keep it when removing it would reduce truth, safety,
|
|
118
|
+
orientation, or care.
|
|
119
|
+
|
|
120
|
+
UI copy is action/state language: say what happened, what remains true, and what the person
|
|
121
|
+
can do next. Assistant dialogue uses established context and answers at the listener's
|
|
122
|
+
altitude. Essays may retain unresolved thought and a personal cadence only when the supplied
|
|
123
|
+
speaker genuinely owns that experience. Documentation favors stable terminology,
|
|
124
|
+
prerequisites, and scan paths over conversational warmth.
|
|
125
|
+
|
|
126
|
+
## Rewrite procedure
|
|
127
|
+
|
|
128
|
+
1. Write the six input-contract fields. Mark unknowns; do not fill them creatively.
|
|
129
|
+
2. Extract a factual ledger before editing. Include exact numbers, proper nouns, claim
|
|
130
|
+
status, uncertainty, and quotes.
|
|
131
|
+
3. State the message's single job and the next move. Choose local repair or reconstruction.
|
|
132
|
+
4. Rewrite in the chosen genre. Put the payload first, keep each proposition once, and place
|
|
133
|
+
evidence or caveats beside the claim they support.
|
|
134
|
+
5. Compare the result against the factual ledger. Any added, removed, strengthened, or
|
|
135
|
+
weakened proposition is a failure. Quotes are byte-for-byte unchanged or absent.
|
|
136
|
+
6. Read aloud for speaker/listener fit. Repair only genuine friction; do not add artificial
|
|
137
|
+
sentence-length variation or deliberate roughness.
|
|
138
|
+
7. Stop when the job is done.
|
|
139
|
+
|
|
140
|
+
## OMD ownership and invalidation
|
|
141
|
+
|
|
142
|
+
`omd-humanize` diagnoses and proposes a rewrite; it does not bypass the copy owner. Only
|
|
143
|
+
`omd-writer` changes `.omd/copy-deck.md`. After the writer's revision, run `omd copy --check`,
|
|
144
|
+
then `omd-hand` synchronizes production source and rerenders. A changed shipped line, claim,
|
|
145
|
+
or action invalidates the affected blind copy review and typography proof. Rerun the relevant
|
|
146
|
+
proof instead of carrying an earlier approval forward.
|
|
147
|
+
|
|
148
|
+
## Acceptance
|
|
149
|
+
|
|
150
|
+
- The first useful sentence carries the payload.
|
|
151
|
+
- Title, body, and CTA do not repeat the same proposition.
|
|
152
|
+
- A concrete actor performs a concrete action where the genre permits it.
|
|
153
|
+
- Caveats and uncertainty remain honest and sit beside the claims they qualify.
|
|
154
|
+
- The next move is explicit when one exists; there is no empty closing offer.
|
|
155
|
+
- The text sounds natural when read aloud without manufactured rhythm or fake quirks.
|
|
156
|
+
- The factual-ledger diff is clean, and every shipped OMD claim still cites `verified` facts.
|
|
157
|
+
|
|
158
|
+
Return the rewritten result by default. Do not lead with a violation inventory. Provide a
|
|
159
|
+
brief audit only when the user requests one or when filling the durable Humanize audit in
|
|
160
|
+
the copy deck.
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: omd-scout
|
|
3
|
+
description: >-
|
|
4
|
+
Build a measured reference board without designing anything: whole pages for feel,
|
|
5
|
+
tight selectors for component anatomy, typography studies, motion studies, image refs
|
|
6
|
+
for the unrenderable. Use when the user asks for references, inspiration, benchmarks,
|
|
7
|
+
or "how do good sites do X" — standalone, before or without a build.
|
|
8
|
+
Triggers: 레퍼런스 찾아줘, 레퍼런스 수집, 참고 사이트, 벤치마킹, find references,
|
|
9
|
+
inspiration board, how do other sites do.
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# omd-scout
|
|
13
|
+
|
|
14
|
+
A reference board, measured instead of pinned. This skill collects evidence and names
|
|
15
|
+
transferable principles; it does not design or implement the result.
|
|
16
|
+
|
|
17
|
+
Spawn `omd-scout` with the concept (ask one short question only when neither the request nor
|
|
18
|
+
`.omd/frame.md` supplies one), the component inventory, working directory, and user URLs.
|
|
19
|
+
User URLs are captured first and marked `--from-user`.
|
|
20
|
+
|
|
21
|
+
## Coverage contract
|
|
22
|
+
|
|
23
|
+
Build for decision coverage, not capture counts. Before searching, list the decisions the
|
|
24
|
+
later design must make and the components it must support. The board is complete only when
|
|
25
|
+
it contains useful, non-duplicate evidence for every applicable category:
|
|
26
|
+
|
|
27
|
+
- domain conventions and user expectations;
|
|
28
|
+
- direct competitors and meaningful alternatives;
|
|
29
|
+
- first-party or user/community language;
|
|
30
|
+
- typography and voice;
|
|
31
|
+
- motion when the concept or interaction actually needs it;
|
|
32
|
+
- every required component or state whose anatomy is uncertain.
|
|
33
|
+
|
|
34
|
+
There is no minimum query count, capture quota, famous-site quota, or mandatory award
|
|
35
|
+
gallery. A small board with complete, independent evidence is better than a large gallery of
|
|
36
|
+
near-duplicates. If a category is irrelevant, record why. If evidence remains weak or
|
|
37
|
+
contradictory, report the gap and uncertainty instead of filling a slot with decoration.
|
|
38
|
+
|
|
39
|
+
Use the narrowest useful capture:
|
|
40
|
+
|
|
41
|
+
```bash
|
|
42
|
+
omd ref add <user-url> --as <name> --from-user
|
|
43
|
+
omd ref add <url> --as <name>
|
|
44
|
+
omd ref add <url> --as <name> --selector ".component"
|
|
45
|
+
omd ref add <url> --as <name> --selector ".component" --blueprint
|
|
46
|
+
omd ref add <image-url> --as <name> --image
|
|
47
|
+
omd ref principles <url> --as <name> --add "..."
|
|
48
|
+
omd ref list
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
Whole-page captures establish rhythm or product feel; tight selectors establish component
|
|
52
|
+
anatomy; type and motion studies establish measured behavior; image references support only
|
|
53
|
+
what cannot be rendered. A blueprint is allowed only for an explicitly requested exact
|
|
54
|
+
component transplant or a structurally equivalent component problem. Structure may
|
|
55
|
+
transfer; skin and pixels do not.
|
|
56
|
+
|
|
57
|
+
## Evidence quality and contamination
|
|
58
|
+
|
|
59
|
+
Prefer first-party product sources and direct user/community evidence over SEO summaries.
|
|
60
|
+
Label source trust, uncertainty, and whether evidence is independent or derivative. Reject
|
|
61
|
+
a non-user source with two or more slop signals. Keep a user-provided contaminated source
|
|
62
|
+
only as a named anti-reference. Drop kin at similarity `>= .85`; a cluster of related pages
|
|
63
|
+
is one evidence family, not independent corroboration. A blocked page is not retried; use an
|
|
64
|
+
honest image/discourse fallback or discard it.
|
|
65
|
+
|
|
66
|
+
Every retained capture records:
|
|
67
|
+
|
|
68
|
+
- the decision or coverage gap it answers;
|
|
69
|
+
- measured invariants and the reason they matter;
|
|
70
|
+
- what contradicts the concept;
|
|
71
|
+
- source trust and uncertainty;
|
|
72
|
+
- the token, component, motion, voice, or composition question it may inform.
|
|
73
|
+
|
|
74
|
+
Never describe a page for imitation, show reference screenshots to the builder, copy visual
|
|
75
|
+
skin, or turn award status into evidence. Hand off measurements, principles, contradictions,
|
|
76
|
+
coverage gaps, and trust. Raw captures remain under `.omd/refs/`; downstream agents receive
|
|
77
|
+
only the sanitized evidence summary required for their decision.
|