octocode-cli 1.3.0 → 1.5.0

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.
Files changed (106) hide show
  1. package/README.md +129 -28
  2. package/out/chunks/chunk-7476PETK.js +309 -0
  3. package/out/chunks/chunk-CVNNNSMQ.js +26 -0
  4. package/out/chunks/chunk-OQBJTZWK.js +60 -0
  5. package/out/chunks/chunk-UCZCF3BQ.js +9 -0
  6. package/out/chunks/command-help-specs-JZXVSLZ5.js +8 -0
  7. package/out/chunks/commands-XBFPLHSQ.js +8 -0
  8. package/out/chunks/help-P7TCOYAJ.js +10 -0
  9. package/out/chunks/main-help-ULF5PAQY.js +10 -0
  10. package/out/chunks/prompts-5E6VKRX5.js +8 -0
  11. package/out/chunks/spinner-URV2OX6O.js +8 -0
  12. package/out/chunks/tool-command-M6VA7P2F.js +8 -0
  13. package/out/octocode-cli.js +1 -1
  14. package/package.json +5 -3
  15. package/skills/README.md +60 -58
  16. package/skills/agentic-flow-best-practices/SKILL.md +280 -0
  17. package/skills/agentic-flow-best-practices/references/agent-collaboration-patterns.md +75 -0
  18. package/skills/agentic-flow-best-practices/references/pr-review-agent-example.md +47 -0
  19. package/skills/agentic-flow-best-practices/references/resources.md +112 -0
  20. package/skills/octocode-brainstorming/.env.example +11 -0
  21. package/skills/octocode-brainstorming/SKILL.md +262 -0
  22. package/skills/octocode-brainstorming/scripts/tavily-search.mjs +138 -0
  23. package/skills/octocode-chrome-devtools/README.md +541 -0
  24. package/skills/octocode-chrome-devtools/SKILL.md +197 -0
  25. package/skills/octocode-chrome-devtools/agents/openai.yaml +7 -0
  26. package/skills/octocode-chrome-devtools/references/CDP_AGENT_REFERENCE.md +401 -0
  27. package/skills/octocode-chrome-devtools/references/CHROME_FLAGS.md +234 -0
  28. package/skills/octocode-chrome-devtools/references/INTENTS.md +108 -0
  29. package/skills/octocode-chrome-devtools/references/INTENTS_AUTH.md +179 -0
  30. package/skills/octocode-chrome-devtools/references/INTENTS_AUTOMATION.md +214 -0
  31. package/skills/octocode-chrome-devtools/references/INTENTS_DEBUG.md +329 -0
  32. package/skills/octocode-chrome-devtools/references/INTENTS_ENVIRONMENT.md +237 -0
  33. package/skills/octocode-chrome-devtools/references/INTENTS_INSPECT.md +263 -0
  34. package/skills/octocode-chrome-devtools/references/INTENTS_STORAGE_CONSENT.md +214 -0
  35. package/skills/octocode-chrome-devtools/references/RECOVERY.md +39 -0
  36. package/skills/octocode-chrome-devtools/references/SCRIPT_PATTERNS.md +43 -0
  37. package/skills/octocode-chrome-devtools/references/SCRIPT_PATTERNS_ASYNC_WORKERS.md +345 -0
  38. package/skills/octocode-chrome-devtools/references/SCRIPT_PATTERNS_BROWSER.md +403 -0
  39. package/skills/octocode-chrome-devtools/references/SCRIPT_PATTERNS_OBSERVE.md +275 -0
  40. package/skills/octocode-chrome-devtools/references/SCRIPT_PATTERNS_SPECIAL.md +18 -0
  41. package/skills/octocode-chrome-devtools/scripts/cdp-runner.mjs +503 -0
  42. package/skills/octocode-chrome-devtools/scripts/cdp-sandbox.mjs +123 -0
  43. package/skills/octocode-chrome-devtools/scripts/cdp-template.mjs +81 -0
  44. package/skills/octocode-chrome-devtools/scripts/octocode-chrome-devtools.vpn.example.json +8 -0
  45. package/skills/octocode-chrome-devtools/scripts/open-browser.mjs +362 -0
  46. package/skills/octocode-chrome-devtools/scripts/sourcemap-resolver.mjs +193 -0
  47. package/skills/octocode-chrome-devtools/scripts/undercover.mjs +226 -0
  48. package/skills/octocode-design/README.md +2 -2
  49. package/skills/octocode-documentation-writer/README.md +1 -1
  50. package/skills/octocode-engineer/README.md +1 -1
  51. package/skills/octocode-engineer/SKILL.md +137 -306
  52. package/skills/octocode-engineer/references/cli-reference.md +13 -0
  53. package/skills/octocode-engineer/references/output-files.md +3 -3
  54. package/skills/octocode-engineer/scripts/run.js +146 -146
  55. package/skills/octocode-engineer/src/pipeline/main.ts +1 -17
  56. package/skills/octocode-engineer/src/pipeline/progress.ts +4 -0
  57. package/skills/octocode-engineer/src/reporting/summary-md.test.ts +48 -0
  58. package/skills/octocode-engineer/src/reporting/summary-md.ts +43 -2
  59. package/skills/octocode-install/SKILL.md +1 -1
  60. package/skills/octocode-pull-request-reviewer/README.md +5 -5
  61. package/skills/octocode-pull-request-reviewer/SKILL.md +1 -1
  62. package/skills/octocode-research/AGENTS.md +1 -1
  63. package/skills/octocode-research/README.md +2 -2
  64. package/skills/octocode-research/docs/ARCHITECTURE.md +1 -1
  65. package/skills/octocode-research/scripts/server.js +184 -239
  66. package/skills/octocode-research/src/routes/github.ts +4 -21
  67. package/skills/octocode-research/src/routes/local.ts +4 -21
  68. package/skills/octocode-research/src/utils/fileContentTransform.ts +44 -0
  69. package/skills/octocode-search-skill/SKILL.md +337 -0
  70. package/skills/octocode-search-skill/references/agent-skills-guide.md +177 -0
  71. package/skills/octocode-search-skill/references/discovery-surfaces.md +162 -0
  72. package/skills/octocode-search-skill/references/fetch-and-create-locally.md +57 -0
  73. package/skills/octocode-search-skill/references/install-reference.md +130 -0
  74. package/skills/octocode-search-skill/references/references-template.md +27 -0
  75. package/skills/octocode-search-skill/references/references.md +62 -0
  76. package/skills/octocode-slides/README.md +307 -0
  77. package/skills/octocode-slides/SKILL.md +410 -0
  78. package/skills/octocode-slides/references/01-brief.md +156 -0
  79. package/skills/octocode-slides/references/02-research.md +149 -0
  80. package/skills/octocode-slides/references/03-outline.md +172 -0
  81. package/skills/octocode-slides/references/04-design.md +301 -0
  82. package/skills/octocode-slides/references/05-implementation.md +213 -0
  83. package/skills/octocode-slides/references/06-review.md +258 -0
  84. package/skills/octocode-slides/references/animation.md +281 -0
  85. package/skills/octocode-slides/references/design-system.md +316 -0
  86. package/skills/octocode-slides/references/html-templates.md +673 -0
  87. package/skills/octocode-slides/references/image-generation.md +448 -0
  88. package/skills/octocode-slides/references/resources.md +840 -0
  89. package/skills/octocode-slides/references/slide-rules.md +541 -0
  90. package/skills/octocode-slides/references/wireframes.md +727 -0
  91. package/skills/octocode-slides/scripts/animation.js +182 -0
  92. package/skills/octocode-slides/scripts/base.css +353 -0
  93. package/skills/octocode-slides/scripts/base.html +655 -0
  94. package/skills/octocode-slides/scripts/generate_image.py +221 -0
  95. package/skills/octocode-slides/scripts/navbridge.js +79 -0
  96. package/skills/octocode-slides/scripts/presenter.js +316 -0
  97. package/skills/octocode-slides/scripts/slide.html +248 -0
  98. package/skills/octocode-stats/SKILL.md +73 -0
  99. package/skills/octocode-stats/assets/template.html +1332 -0
  100. package/skills/octocode-stats/scripts/build_dashboard.mjs +407 -0
  101. package/out/chunks/chunk-LH4AZJPA.js +0 -389
  102. package/out/chunks/command-help-specs-CQ3RBLP6.js +0 -8
  103. package/out/chunks/commands-M3QTWKWE.js +0 -51
  104. package/out/chunks/help-XPXP46ZT.js +0 -10
  105. package/out/chunks/main-help-HXFAFHPG.js +0 -10
  106. package/out/chunks/tool-command-VHFLPIHY.js +0 -8
@@ -0,0 +1,727 @@
1
+ # Slide Wireframes
2
+
3
+ Pick the layout **from the content**, not from aesthetics. Each wireframe below ties three things together:
4
+
5
+ 1. **Content signals** — what the slide actually contains.
6
+ 2. **Wireframe** — slide regions, proportions, and focal point.
7
+ 3. **DOM + CSS** — the existing flex/grid primitives in `base.css` that produce the layout.
8
+
9
+ All wireframes assume the standard shell from `references/html-templates.md`:
10
+
11
+ ```html
12
+ <div class="slide slide--{{type}}">
13
+ <!-- regions go here -->
14
+ </div>
15
+ ```
16
+
17
+ Inside that root, `.slide` is already `display: flex; flex-direction: column`. Layouts below differ only in:
18
+ - `.slide--{{type}}` modifier (centering, padding, color treatment)
19
+ - which children fill which region
20
+ - which inner container is `flex` row, `grid`, or full-bleed `absolute`
21
+
22
+ ---
23
+
24
+ ## Where Things Live
25
+
26
+ | File | Owns |
27
+ |---|---|
28
+ | `references/wireframes.md` (this) | Pick a layout from content. Region structure, flex/grid, DOM tree per slide type. |
29
+ | `references/html-templates.md` | Full HTML templates per slide type and the canonical 4-region skeleton. |
30
+ | `scripts/base.css` | Canonical CSS — copied verbatim to `css/base.css`. Layout primitives, slide-type rules, components, animations, print. |
31
+ | `references/design-system.md` | Tokens, typography scale, palettes, slide density limits, title contract, anti-slop, methodology, external sources. |
32
+
33
+ If a number, color, font, or density rule shows up here, it is a hint — `design-system.md` is canonical.
34
+
35
+ ---
36
+
37
+ ## Canonical Slide Skeleton (reference)
38
+
39
+ Each wireframe below renders into the same four regions defined in `html-templates.md`:
40
+
41
+ ```text
42
+ .slide
43
+ ├── .slide-logo optional · brand mark, top-right (absolute)
44
+ ├── .slide-header optional · .title + .description
45
+ ├── .slide-content REQUIRED · smart flex body
46
+ └── .slide-footer optional · source / page / link
47
+ ```
48
+
49
+ **Only `.slide-content` is required.** The wireframes show the body — the smart-flex contents of `.slide-content`. Add `.slide-header` when the slide has a heading; add `.slide-logo` / `.slide-footer` when the deck's posture calls for them. Omit any region the slide doesn't need.
50
+
51
+ The DOM blocks below sometimes show only the regions a wireframe leans on, to keep examples readable. The full per-type templates in `html-templates.md` are the canonical markup.
52
+
53
+ ---
54
+
55
+ ## Agent Decision Flow
56
+
57
+ Look at the slide's content first. Walk the table top-down — the first row that matches wins. The wireframes are starting points: if a slide needs a hybrid (e.g., W4 with a small chart, or W3 with a marginal image), build it. The goal is **the layout that serves this slide**, not a perfect match to a labelled pattern.
58
+
59
+ | Content signal | Pick wireframe | Slide type |
60
+ |---|---|---|
61
+ | One sentence, no body needed | W2 Big Message | `title`, `section`, `closing` |
62
+ | Deck opener with author/date | W1 Title / Hero | `title` |
63
+ | Deck section break | W2 Big Message | `section` |
64
+ | 2–4 short bullets explaining one claim | W3 Action Title + Bullets | `content` |
65
+ | 1–3 KPIs / metrics | W4 Big Number / Stats Grid | `stats` |
66
+ | One chart is the proof | W5 Full-Slide Chart | `chart` |
67
+ | Image is the proof or the mood | W6 Image-Led (full-bleed) | `image` |
68
+ | Text + screenshot/diagram together | W7 Text + Visual Split | `content` (custom) |
69
+ | Two parallel options/states | W8 Side-by-Side | `two-col` or `comparison` |
70
+ | One quote | W9 Quote | `quote` |
71
+ | Ordered steps over time | W10 Timeline | `timeline` |
72
+ | Code is the evidence | W11 Code | `code` |
73
+ | Audience needs a roadmap | W12 Agenda | `agenda` |
74
+ | Recap + next step | W13 Closing | `closing` |
75
+
76
+ If two rows match, pick the one with the stronger focal point (number > chart > image > text).
77
+
78
+ ---
79
+
80
+ ## Layout Primitives
81
+
82
+ The wireframes below combine four primitives. They map directly to CSS in `base.css`:
83
+
84
+ | Primitive | CSS / class | Use when |
85
+ |---|---|---|
86
+ | **Stacked column** | `.slide-content` default (flex column, `gap: var(--sp-3)`) | Header above, body of one or more blocks stacked |
87
+ | **Centered single block** | `.slide-content--center` (or centered slide types) | One number, one sentence, one quote, one image |
88
+ | **Two-up grid / N-up grid** | `.slide-content--grid-2`, `.slide-content--grid-3`, or component classes (`.two-col`, `.comparison`, `.stat-grid`) | Two or three parallel content blocks |
89
+ | **Side-by-side row** | `.slide-content--row` | Text + visual, label + value, two unequal columns |
90
+ | **Full-bleed layer** | `position: absolute; inset: 0` on `.slide--image img`, `.image-ph-bleed`, `.image-overlay` | Image / video / color fills the slide; content overlays it |
91
+
92
+ `flex: 1` on the body region is what makes charts, columns, and timelines fill the remaining height under `.slide-header`. The modifier classes live on `.slide-content` itself — you can also drop straight to inline `style="grid-template-columns: 2fr 3fr"` when the layout is unique to one slide.
93
+
94
+ ---
95
+
96
+ ## W1 · Title / Hero
97
+
98
+ **Content signals:** event/eyebrow + main title + subtitle + author/date. No bullets, no chart.
99
+
100
+ **Wireframe (16:9):**
101
+
102
+ ```text
103
+ ┌──────────────────────────────────────────────────────────┐
104
+ │ │
105
+ │ │
106
+ │ EYEBROW · UPPERCASE │ ← .eyebrow (small, accent)
107
+ │ │
108
+ │ MAIN TITLE — display size │ ← .display (largest)
109
+ │ one or two lines, leading-tight │
110
+ │ │
111
+ │ Subtitle that narrows the topic │ ← .subtitle
112
+ │ │
113
+ │ Author · Date │ ← .meta (small, muted)
114
+ │ │
115
+ │ │
116
+ └──────────────────────────────────────────────────────────┘
117
+ ↑ vertically + horizontally centered
118
+ ```
119
+
120
+ **DOM:**
121
+
122
+ ```html
123
+ <div class="slide slide--title">
124
+ <p class="eyebrow fade-in">{{Event}}</p>
125
+ <h1 class="display slide-up">{{Main title}}</h1>
126
+ <p class="subtitle slide-up delay-1">{{Subtitle}}</p>
127
+ <p class="meta fade-in delay-2">{{Author}} · {{Date}}</p>
128
+ </div>
129
+ ```
130
+
131
+ **CSS that does the work:**
132
+ - `.slide--title { justify-content: center; text-align: center; }` — centers the column.
133
+ - `.slide` is already `flex-direction: column`, so the four children stack with default gap.
134
+
135
+ **Agent rule:** if the first slide is a title and an image is *not* explicitly provided, do **not** invent one — keep this text-only hero. Only switch to W6 if the brief specifies a hero image.
136
+
137
+ ---
138
+
139
+ ## W2 · Big Message / Section
140
+
141
+ **Content signals:** one sentence (≤ 12 words) that opens, transitions, or closes a section. Optional eyebrow/section-number.
142
+
143
+ **Wireframe:**
144
+
145
+ ```text
146
+ ┌──────────────────────────────────────────────────────────┐
147
+ │ │
148
+ │ │
149
+ │ 01 │ ← .section-num (small, accent)
150
+ │ │
151
+ │ ONE BIG SENTENCE, LEFT-ALIGNED OR CENTERED. │ ← .display
152
+ │ │
153
+ │ Optional supporting line, muted. │ ← .subtitle
154
+ │ │
155
+ │ │
156
+ └──────────────────────────────────────────────────────────┘
157
+ ↑ vertically centered, text-align varies
158
+ ```
159
+
160
+ **DOM:**
161
+
162
+ ```html
163
+ <div class="slide slide--section">
164
+ <p class="section-num fade-in">{{01}}</p>
165
+ <h2 class="display slide-up">{{Big sentence}}</h2>
166
+ <p class="subtitle slide-up delay-1">{{Supporting line}}</p>
167
+ </div>
168
+ ```
169
+
170
+ **CSS:**
171
+ - `.slide--section { justify-content: center; }` — vertical centering only; text aligns left by default.
172
+
173
+ **Agent rule:** if you find yourself adding bullets to "fill" this slide, stop — split the bullets onto the next slide.
174
+
175
+ ---
176
+
177
+ ## W3 · Action Title + Bullets (Content)
178
+
179
+ **Content signals:** one heading that states the takeaway + 2–4 supporting bullets, each ≤ 12 words.
180
+
181
+ **Wireframe:**
182
+
183
+ ```text
184
+ ┌──────────────────────────────────────────────────────────┐
185
+ │ Action title — a complete thought │ ← .slide-header (flex-shrink: 0)
186
+ │ ────────────────────────────────────────────────────── │
187
+ │ │
188
+ │ → Point one — short, evidence-shaped │
189
+ │ → Point two │ ← .bullets (flex: 1, gap)
190
+ │ → Point three │
191
+ │ → Point four (max) │
192
+ │ │
193
+ └──────────────────────────────────────────────────────────┘
194
+ Header zone above, body zone fills the rest
195
+ ```
196
+
197
+ **DOM:**
198
+
199
+ ```html
200
+ <div class="slide slide--content">
201
+ <div class="slide-header">
202
+ <h2 class="title fade-in">{{Action title}}</h2>
203
+ </div>
204
+ <ul class="bullets">
205
+ <li class="slide-up delay-1">{{Point one}}</li>
206
+ <li class="slide-up delay-2">{{Point two}}</li>
207
+ <li class="slide-up delay-3">{{Point three}}</li>
208
+ </ul>
209
+ </div>
210
+ ```
211
+
212
+ **CSS:**
213
+ - `.slide` flex column → `.slide-header` is `flex-shrink: 0`, `.bullets` (or any child after) takes the remaining height.
214
+ - `.bullets` is itself `display: flex; flex-direction: column; gap: var(--sp-3)`.
215
+
216
+ **Agent rule:** if there are 5+ items, drop the weakest one or split the slide. If there are 0–1 items, switch to W2 Big Message.
217
+
218
+ ---
219
+
220
+ ## W4 · Big Number / Stats Grid
221
+
222
+ **Content signals:** 1–3 metrics. Each metric has a value + a label. Optional source line.
223
+
224
+ **Wireframe (1 KPI):**
225
+
226
+ ```text
227
+ ┌──────────────────────────────────────────────────────────┐
228
+ │ Action title — why this number matters │ ← .slide-header
229
+ │ │
230
+ │ │
231
+ │ 73% │ ← .stat-value (display size)
232
+ │ of weekly active users │ ← .stat-label
233
+ │ │
234
+ │ │
235
+ │ Based on Q1 2025 telemetry · n = 1,240 │ ← .stat-caption
236
+ └──────────────────────────────────────────────────────────┘
237
+ ```
238
+
239
+ **Wireframe (3 KPIs):**
240
+
241
+ ```text
242
+ ┌──────────────────────────────────────────────────────────┐
243
+ │ Action title │
244
+ │ │
245
+ │ ┌────────────┐ ┌────────────┐ ┌────────────┐ │
246
+ │ │ 73% │ │ 2.4× │ │ 12 ms │ │ ← .stat-grid (grid auto-fit)
247
+ │ │ active │ │ faster │ │ p95 lat. │ │
248
+ │ └────────────┘ └────────────┘ └────────────┘ │
249
+ │ │
250
+ │ Source / context line │
251
+ └──────────────────────────────────────────────────────────┘
252
+ ```
253
+
254
+ **DOM:**
255
+
256
+ ```html
257
+ <div class="slide slide--stats">
258
+ <div class="slide-header">
259
+ <h2 class="title fade-in">{{Action title}}</h2>
260
+ </div>
261
+ <div class="stat-grid">
262
+ <div class="stat-item pop-in delay-1">
263
+ <span class="stat-value">73%</span>
264
+ <span class="stat-label">{{Label}}</span>
265
+ </div>
266
+ <!-- repeat 1–3 times -->
267
+ </div>
268
+ <p class="stat-caption fade-in delay-4">{{Source}}</p>
269
+ </div>
270
+ ```
271
+
272
+ **CSS:**
273
+ - `.stat-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); gap: var(--sp-6); flex: 1; align-items: center; }` — auto fits 1, 2, or 3 KPIs without changing markup.
274
+ - `.stat-item` is itself `flex-direction: column; align-items: center` so value sits over label.
275
+
276
+ **Agent rule:** never put a 4th KPI here — if the deck has 4+ metrics, pick the most important one for W4 and move the rest to a W5 chart.
277
+
278
+ ---
279
+
280
+ ## W5 · Full-Slide Chart
281
+
282
+ **Content signals:** trend, comparison across categories, distribution, or any data where shape matters more than a single value.
283
+
284
+ **Wireframe:**
285
+
286
+ ```text
287
+ ┌──────────────────────────────────────────────────────────┐
288
+ │ Action title — the insight, not the topic │ ← .slide-header
289
+ │ │
290
+ │ ┌────────────────────────────────────────────────────┐ │
291
+ │ │ │ │
292
+ │ │ │ │
293
+ │ │ CHART AREA │ │ ← .bar-chart / canvas
294
+ │ │ (≥ 70% of body height) │ ← flex: 1
295
+ │ │ │ │
296
+ │ │ │ │
297
+ │ └────────────────────────────────────────────────────┘ │
298
+ │ │
299
+ │ Source / one-line takeaway │ ← .chart-insight
300
+ └──────────────────────────────────────────────────────────┘
301
+ ```
302
+
303
+ **DOM (CSS bar chart, no JS):**
304
+
305
+ ```html
306
+ <div class="slide slide--chart">
307
+ <div class="slide-header">
308
+ <h2 class="title fade-in">{{Action title}}</h2>
309
+ </div>
310
+ <div class="bar-chart" role="img" aria-label="{{description}}">
311
+ <div class="bar-row">
312
+ <span class="bar-label">{{A}}</span>
313
+ <div class="bar" style="--pct:80%"><span>{{value}}</span></div>
314
+ </div>
315
+ <!-- repeat -->
316
+ </div>
317
+ <p class="chart-insight fade-in delay-3">{{Takeaway}}</p>
318
+ </div>
319
+ ```
320
+
321
+ **DOM (canvas chart, e.g. Chart.js):** swap `.bar-chart` for `<canvas id="..." style="flex:1; width:100%;"></canvas>` and load the lib in `<head>`.
322
+
323
+ **CSS:**
324
+ - `.bar-chart { display: flex; flex-direction: column; gap: var(--sp-3); flex: 1; }` — chart takes all leftover height.
325
+ - `.bar-row { display: flex; align-items: center; gap: var(--sp-3); }` — label + bar share a row.
326
+ - `.bar { flex: 1; }` plus `--pct` custom property drives the fill via `::after`.
327
+
328
+ **Agent rule:** never put two charts on one slide. If two are needed, use W8 with one chart per column.
329
+
330
+ ---
331
+
332
+ ## W6 · Image-Led (Full-Bleed)
333
+
334
+ **Content signals:** image is the proof or the mood. Caption is optional and short.
335
+
336
+ **Wireframe:**
337
+
338
+ ```text
339
+ ┌──────────────────────────────────────────────────────────┐
340
+ │ ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ │
341
+ │ ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ │
342
+ │ ░░░░░░ IMAGE / VIDEO / PLACEHOLDER (absolute) ░░░░░░░░░ │ ← position: absolute; inset: 0
343
+ │ ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ │
344
+ │ ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ │
345
+ │ ░░░░ gradient overlay (transparent → black) ░░░░░░░░░░░ │ ← .image-overlay
346
+ │ Big caption on top of overlay │ ← .image-caption (absolute, bottom)
347
+ │ Supporting line │
348
+ └──────────────────────────────────────────────────────────┘
349
+ ```
350
+
351
+ **DOM (image ready):**
352
+
353
+ ```html
354
+ <div class="slide slide--image">
355
+ <img src="../assets/{{file}}" alt="{{alt}}">
356
+ <div class="image-overlay" aria-hidden="true"></div>
357
+ <div class="image-caption slide-up delay-1">
358
+ <p class="display">{{Headline}}</p>
359
+ <p class="subtitle">{{Supporting line}}</p>
360
+ </div>
361
+ </div>
362
+ ```
363
+
364
+ **DOM (image missing):** swap `<img>` for the placeholder block:
365
+
366
+ ```html
367
+ <div class="image-ph-bleed" aria-label="Image placeholder: {{description}}">
368
+ [ PLACEHOLDER: {{description}} ]
369
+ </div>
370
+ ```
371
+
372
+ **CSS:**
373
+ - `.slide--image { padding: 0; overflow: hidden; }` — kills inner padding so the image truly bleeds.
374
+ - `.slide--image img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; }` — image fills regardless of aspect ratio.
375
+ - `.image-overlay { position: absolute; inset: 0; background: linear-gradient(...); }` — keeps caption legible.
376
+ - `.image-caption { position: absolute; bottom: var(--sp-8); left/right: var(--sp-8); }` — caption pinned to bottom.
377
+
378
+ **Agent rule:** if there's no image and no overlay caption, this becomes an empty grey rectangle — switch to W1 or W2 instead.
379
+
380
+ ---
381
+
382
+ ## W7 · Text + Visual Split (40/60)
383
+
384
+ **Content signals:** short text claim + one visual that proves it (screenshot, diagram, image, mini-chart).
385
+
386
+ **Wireframe:**
387
+
388
+ ```text
389
+ ┌──────────────────────────────────────────────────────────┐
390
+ │ Action title │ ← .slide-header
391
+ │ │
392
+ │ ┌──────────────┐ ┌──────────────────────────────────┐ │
393
+ │ │ │ │ │ │
394
+ │ │ Short claim │ │ │ │
395
+ │ │ │ │ IMAGE / DIAGRAM / │ │ ← grid 2fr / 3fr
396
+ │ │ → detail │ │ PLACEHOLDER │ │
397
+ │ │ → detail │ │ │ │
398
+ │ │ → detail │ │ │ │
399
+ │ │ │ │ │ │
400
+ │ └──────────────┘ └──────────────────────────────────┘ │
401
+ │ .col text-side .col visual-side (larger) │
402
+ └──────────────────────────────────────────────────────────┘
403
+ ```
404
+
405
+ **DOM:**
406
+
407
+ ```html
408
+ <div class="slide slide--content">
409
+ <div class="slide-header">
410
+ <h2 class="title fade-in">{{Action title}}</h2>
411
+ </div>
412
+ <div class="two-col" style="grid-template-columns: 2fr 3fr;">
413
+ <div class="col slide-up delay-1">
414
+ <p>{{Short claim}}</p>
415
+ <ul>
416
+ <li>{{detail}}</li>
417
+ <li>{{detail}}</li>
418
+ </ul>
419
+ </div>
420
+ <div class="col slide-up delay-2">
421
+ <!-- image ready: -->
422
+ <img src="../assets/{{file}}" alt="{{alt}}" style="width:100%; border-radius: var(--r-md);">
423
+ <!-- OR image missing: -->
424
+ <div class="image-ph" data-expected="{{description}}">
425
+ <div class="image-ph-inner">
426
+ <p class="image-ph-label">PLACEHOLDER: {{description}}</p>
427
+ </div>
428
+ </div>
429
+ </div>
430
+ </div>
431
+ </div>
432
+ ```
433
+
434
+ **CSS:**
435
+ - Reuses `.two-col { display: grid; grid-template-columns: 1fr 1fr; gap: var(--sp-6); flex: 1; }`.
436
+ - Override `grid-template-columns` inline (`2fr 3fr`) when the visual deserves more weight.
437
+ - `.col` and `.image-ph` already use `flex: 1` so the visual fills its column.
438
+
439
+ **Agent rule:** the visual side always carries the weight. If the visual is decorative (not proof of the claim), drop it and use W3 instead.
440
+
441
+ ---
442
+
443
+ ## W8 · Side-by-Side Comparison
444
+
445
+ **Content signals:** two parallel things to compare — before/after, current/proposed, option A/B, human/agent.
446
+
447
+ **Wireframe (with divider):**
448
+
449
+ ```text
450
+ ┌──────────────────────────────────────────────────────────┐
451
+ │ Action title — the conclusion of the comparison │
452
+ │ │
453
+ │ ┌─────────────────┐ │ ┌─────────────────┐ │
454
+ │ │ BEFORE │ │ │ AFTER │ │ ← grid 1fr auto 1fr
455
+ │ │ (muted color) │ │ │ (accent color) │ │
456
+ │ │ • point │ │ │ • point │ │
457
+ │ │ • point │ │ │ • point │ │
458
+ │ │ • point │ │ │ • point │ │
459
+ │ └─────────────────┘ │ └─────────────────┘ │
460
+ │ ↑ │
461
+ │ .cmp-divider │
462
+ │ │
463
+ │ Synthesis: what changed, what wins │
464
+ └──────────────────────────────────────────────────────────┘
465
+ ```
466
+
467
+ **DOM (full comparison with divider):**
468
+
469
+ ```html
470
+ <div class="slide slide--comparison">
471
+ <div class="slide-header">
472
+ <h2 class="title fade-in">{{Action title}}</h2>
473
+ </div>
474
+ <div class="comparison">
475
+ <div class="cmp-col cmp-before slide-up delay-1">
476
+ <h3>{{Before}}</h3>
477
+ <ul><li>{{point}}</li><li>{{point}}</li></ul>
478
+ </div>
479
+ <div class="cmp-divider fade-in delay-2"></div>
480
+ <div class="cmp-col cmp-after slide-up delay-3">
481
+ <h3>{{After}}</h3>
482
+ <ul><li>{{point}}</li><li>{{point}}</li></ul>
483
+ </div>
484
+ </div>
485
+ </div>
486
+ ```
487
+
488
+ **DOM (lighter two-col, no divider):** use the `slide--two-col` template from `html-templates.md` — same grid, no `.cmp-*` color treatment.
489
+
490
+ **CSS:**
491
+ - `.comparison { display: grid; grid-template-columns: 1fr auto 1fr; gap: var(--sp-4); flex: 1; }` — the `auto` middle column is the divider.
492
+ - `.cmp-before h3 { color: var(--muted); }` and `.cmp-after h3 { color: var(--accent); }` create the "before is dim, after is bright" pattern automatically.
493
+
494
+ **Agent rule:** keep the two columns balanced — same number of bullets, same label structure. If one side has 5 bullets and the other has 1, the visual lies.
495
+
496
+ ---
497
+
498
+ ## W9 · Quote
499
+
500
+ **Content signals:** a direct quote (≤ 30 words) + attribution.
501
+
502
+ **Wireframe:**
503
+
504
+ ```text
505
+ ┌──────────────────────────────────────────────────────────┐
506
+ │ │
507
+ │ " │ ← .quote-mark (huge, 25% opacity)
508
+ │ │
509
+ │ Short, memorable quote in italic │ ← .quote-text (subtitle size)
510
+ │ that fits on two lines. │
511
+ │ │
512
+ │ — Speaker name, Title │ ← .quote-attr (small, muted)
513
+ │ │
514
+ │ │
515
+ └──────────────────────────────────────────────────────────┘
516
+ ↑ vertically centered, generous padding
517
+ ```
518
+
519
+ **DOM:**
520
+
521
+ ```html
522
+ <div class="slide slide--quote">
523
+ <p class="quote-mark fade-in" aria-hidden="true">"</p>
524
+ <blockquote class="quote-text slide-up">{{Quote}}</blockquote>
525
+ <cite class="quote-attr fade-in delay-2">— {{Name, Title}}</cite>
526
+ </div>
527
+ ```
528
+
529
+ **CSS:**
530
+ - `.slide--quote { justify-content: center; padding: var(--sp-8) calc(var(--sp-8) * 1.5); }` — extra horizontal padding gives breathing room.
531
+
532
+ **Agent rule:** if the quote does not fit in two lines comfortably, paraphrase and use W3 instead — long quotes never read well from the back of the room.
533
+
534
+ ---
535
+
536
+ ## W10 · Timeline / Process
537
+
538
+ **Content signals:** 3–5 ordered steps, each with a label (date, phase, name) and one short note.
539
+
540
+ **Wireframe (vertical):**
541
+
542
+ ```text
543
+ ┌──────────────────────────────────────────────────────────┐
544
+ │ Action title │
545
+ │ │
546
+ │ ● 2022 Q1 Started internal prototype │
547
+ │ │ │ ← .timeline (vertical line via ::before)
548
+ │ ● 2023 Q4 First customer pilot │ ← .tl-item (flex row: dot + text)
549
+ │ │ │
550
+ │ ● 2024 Q2 GA launch, 12 customers │
551
+ │ │ │
552
+ │ ● 2025 Q1 500+ customers, $4M ARR │
553
+ │ │
554
+ └──────────────────────────────────────────────────────────┘
555
+ ```
556
+
557
+ **DOM:**
558
+
559
+ ```html
560
+ <div class="slide slide--timeline">
561
+ <div class="slide-header">
562
+ <h2 class="title fade-in">{{Action title}}</h2>
563
+ </div>
564
+ <ol class="timeline">
565
+ <li class="tl-item slide-up delay-1">
566
+ <span class="tl-dot"></span>
567
+ <div><strong class="tl-label">{{2022 Q1}}</strong> {{Description}}</div>
568
+ </li>
569
+ <!-- repeat 3–5 times -->
570
+ </ol>
571
+ </div>
572
+ ```
573
+
574
+ **CSS:**
575
+ - `.timeline { position: relative; }` + `.timeline::before { position: absolute; left: 0.55rem; top: 0; bottom: 0; width: 2px; }` — the vertical line.
576
+ - `.tl-item { display: flex; gap: var(--sp-3); }` — each row is dot + text, side by side.
577
+
578
+ **Agent rule:** order matters here. If the steps could be re-ordered without changing meaning, use W3 bullets instead.
579
+
580
+ ---
581
+
582
+ ## W11 · Code
583
+
584
+ **Content signals:** the implementation detail is the proof. Code block ≤ 20 lines, with a one-line takeaway.
585
+
586
+ **Wireframe:**
587
+
588
+ ```text
589
+ ┌──────────────────────────────────────────────────────────┐
590
+ │ Action title — what this code proves │
591
+ │ │
592
+ │ ┌────────────────────────────────────────────────────┐ │
593
+ │ │ │ │
594
+ │ │ // syntax-highlighted code │ │
595
+ │ │ function example() { ... } │ │ ← .code-block
596
+ │ │ │ ← flex: 1
597
+ │ │ // ≤ 20 lines, no horizontal scroll │ │
598
+ │ │ │ │
599
+ │ └────────────────────────────────────────────────────┘ │
600
+ │ │
601
+ │ Plain-English takeaway │ ← .code-caption
602
+ └──────────────────────────────────────────────────────────┘
603
+ ```
604
+
605
+ **DOM:** see the `code` template in `html-templates.md`. Key bits:
606
+
607
+ ```html
608
+ <pre class="code-block slide-up delay-1"><code class="language-ts">
609
+ {{ ≤ 20 lines }}
610
+ </code></pre>
611
+ <p class="code-caption fade-in delay-2">{{Takeaway}}</p>
612
+ <script>hljs.highlightAll();</script>
613
+ ```
614
+
615
+ **CSS:**
616
+ - `.code-block { flex: 1; overflow: hidden; }` — block fills remaining height and **never scrolls** (split into multiple slides if it overflows).
617
+
618
+ **Agent rule:** if the code needs to scroll to be read, split it across two slides. If the code is decorative, switch to W3 with a one-line description.
619
+
620
+ ---
621
+
622
+ ## W12 · Agenda
623
+
624
+ **Content signals:** 3–5 sections in order. Each section has a name + one-line promise.
625
+
626
+ **Wireframe:**
627
+
628
+ ```text
629
+ ┌──────────────────────────────────────────────────────────┐
630
+ │ Agenda │
631
+ │ │
632
+ │ 01 What this is │
633
+ │ 02 Why now │ ← .agenda-list (flex column)
634
+ │ 03 How it works │ ← .agenda-list li (flex row)
635
+ │ 04 What's next │
636
+ │ │
637
+ └──────────────────────────────────────────────────────────┘
638
+ ↑ numbers are accent-colored, fixed-width
639
+ ```
640
+
641
+ **DOM:** see the `agenda` template in `html-templates.md`.
642
+
643
+ **CSS:**
644
+ - `.agenda-list { display: flex; flex-direction: column; gap: var(--sp-3); }`
645
+ - `.agenda-list li { display: flex; align-items: center; gap: var(--sp-3); }` — number sits left of label.
646
+ - `.num { min-width: 2.5rem; }` — keeps the numbers vertically aligned even with different label lengths.
647
+
648
+ **Agent rule:** if there are too many sections to fit, group them. Density limits live in `design-system.md`.
649
+
650
+ ---
651
+
652
+ ## W13 · Closing
653
+
654
+ **Content signals:** final statement + 1–3 takeaways or one CTA + optional links.
655
+
656
+ **Wireframe:**
657
+
658
+ ```text
659
+ ┌──────────────────────────────────────────────────────────┐
660
+ │ │
661
+ │ │
662
+ │ Final statement (display) │ ← .display
663
+ │ │
664
+ │ Call to action / next step │ ← .subtitle
665
+ │ │
666
+ │ [link] [link] [link] │ ← .closing-links (flex row)
667
+ │ │
668
+ │ │
669
+ └──────────────────────────────────────────────────────────┘
670
+ ↑ vertically + horizontally centered
671
+ ```
672
+
673
+ **DOM:**
674
+
675
+ ```html
676
+ <div class="slide slide--closing">
677
+ <h2 class="display slide-up">{{Final statement}}</h2>
678
+ <p class="subtitle fade-in delay-1">{{Call to action}}</p>
679
+ <div class="closing-links fade-in delay-2">
680
+ <a href="{{URL}}">{{Link}}</a>
681
+ </div>
682
+ </div>
683
+ ```
684
+
685
+ **CSS:**
686
+ - `.slide--closing { justify-content: center; text-align: center; }`
687
+ - `.closing-links { display: flex; gap: var(--sp-4); justify-content: center; }`
688
+
689
+ **Agent rule:** do not introduce new evidence on the closing slide. If a "thank you" is the only message, prefer a W2 with one strong sentence.
690
+
691
+ ---
692
+
693
+ ## Content → Wireframe Worked Examples
694
+
695
+ Three short examples showing how the agent should reason from a slide's notes to a wireframe choice.
696
+
697
+ ### Example A
698
+ > *Notes:* "Octocode reduces time-to-first-answer from 14m to 3m on the auth-service repo, based on internal benchmark."
699
+
700
+ - One metric is the proof (`14m → 3m`).
701
+ - Pick **W4 Big Number** with one stat. Title states the claim. Caption holds the source.
702
+
703
+ ### Example B
704
+ > *Notes:* "Show before/after of the dashboard. Before: cluttered, 6 panels, no hierarchy. After: 3 panels, one focal KPI."
705
+
706
+ - Two parallel states + visual difference matters.
707
+ - Pick **W8 Side-by-Side** with screenshots in each column. Mark both screenshots as `PLACEHOLDER` if the user has not provided files.
708
+
709
+ ### Example C
710
+ > *Notes:* "Walk through how the agent calls the MCP tools — search, fetch, summarize, cite."
711
+
712
+ - 4 ordered steps.
713
+ - Pick **W10 Timeline**. Each step gets a label (`search`, `fetch`, `summarize`, `cite`) + one note about what the agent does.
714
+
715
+ ---
716
+
717
+ ## Layout Anti-Patterns
718
+
719
+ These are *layout* failures. Title-writing, density, and visual-aesthetic anti-patterns are in `design-system.md` (Slide Title Contract, Slide Density, Anti-Slop Guide) — do not duplicate them here.
720
+
721
+ | Anti-pattern | Symptom | Fix |
722
+ |---|---|---|
723
+ | Filler bullets | Bullets exist to make the slide look balanced | Remove them; switch to W2 or W4 |
724
+ | Visual underweight | Chart or image is < 50% of the body | Switch to W5 / W6; move commentary to caption |
725
+ | Decorative image | Image does not prove or set mood | Drop the image; switch to W1 / W2 / W3 |
726
+ | Lopsided comparison | One column is full, the other half-empty | Drop the comparison; use W3 |
727
+ | Region collision | Header and body overlap, or body has no `flex: 1` | Restore `.slide-header` + body region; let body fill |