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,213 @@
1
+ # Phase 5 — Implementation
2
+
3
+ **Role:** Implementation agent. Turn the outline, inline slide notes, and DESIGN.md into working HTML slides. Keep the build focused: finalize only the slide-ready content needed for each slide, then implement the HTML and review in small internal batches.
4
+
5
+ **Input:** `.content/request.md` · `.content/outline.md` · `.content/DESIGN.md` · `css/base.css` + `css/theme.css`
6
+ **Output:** `slides/slug.html` (one per outline row)
7
+
8
+ **Path contract:** see `SKILL.md → Output structure`. All paths are inside `.octocode/slides/{{slideName}}/`. Slides reference `../css/*`, `../js/*`, `../assets/*`. `index.html` references `slides/*.html`. No `slides/slides/` nesting.
9
+
10
+ ---
11
+
12
+ ## Step 1 · Read references
13
+
14
+ Read these files now (in parallel):
15
+ - `references/html-templates.md` — slide-type HTML templates + Motion patterns + `index.html` controller (the canonical CSS lives in `scripts/base.css`)
16
+ - `references/resources.md` — CDN URLs for any library listed in DESIGN.md
17
+ - `references/slide-rules.md` §§1, 5 — Content rules and Logical Flow rules (required by Global Rule 9)
18
+
19
+ ---
20
+
21
+ ## Step 2 · Verify the outline is implementation-ready
22
+
23
+ Before writing any HTML, read `.content/outline.md` fully. For each row in the outline table:
24
+
25
+ - Confirm the title is a claim sentence (not a topic label) — if not, fix it now
26
+ - Check the `Source` column: any `[NEEDS SOURCE]` must be resolved or the slide flagged with a visible placeholder in HTML
27
+ - Check `Slide notes` for any widget, chart data, image path, or layout instruction specific to that slide
28
+ - If a chart slide has no data in the outline, ask the user for the values before building that slide
29
+ - If an image slide has no path and no placeholder instruction, use the `image-ph` pattern from `references/html-templates.md`
30
+
31
+ Track completion internally. Do not ask the user for per-slide confirmation unless a specific data gap blocks progress.
32
+
33
+ ---
34
+
35
+ ## Step 3 · Implement slides
36
+
37
+ For each row in `.content/outline.md`, build directly from the row's data and any matching `Slide notes` entry:
38
+
39
+ 1. Copy `scripts/slide.html` as the starting point — **always**
40
+ 2. Use the row's title as the on-slide heading and browser `<title>`
41
+ 3. Use the row's type, key content, source, and flow logic as the implementation contract
42
+ 4. Check `Slide notes` for that slug — use any widget/chart/image/layout instructions found there
43
+ 5. Replace all `<!-- LLM: ... -->` comments with actual content from `request.md`
44
+ 6. Use the correct layout from `references/html-templates.md` for the slide type
45
+ 7. Add CDN libraries only if this slide needs them — check `DESIGN.md → Libraries` then the slide's `Slide notes`
46
+ 8. Use Motion animation patterns from `references/html-templates.md` where the slide type calls for it
47
+ 9. Write to `slides/slug.html` — slug must match the `Slug` column in the outline table (NOT `slides/slides/`)
48
+ 10. Track completion internally
49
+
50
+ **Implementation rules:**
51
+ - CSS variables only (`var(--accent)`, `var(--t-title)`, etc.) — no hardcoded values
52
+ - Speaker notes go in `<aside class="speaker-notes">`
53
+ - Overflow → split into a new slide (update `.content/outline.md` and continue)
54
+ - For code slides: use highlight.js with the theme from DESIGN.md
55
+ - For markdown-content slides: use marked.js + `data-md` pattern
56
+ - For diagram / flow / architecture slides: use Mermaid.js
57
+ - For chart / KPI / progress widgets — the outline already names the library (Phase 3 Step 4). If it doesn't, decide from `references/resources.md → Data Visualization — Library Decision` and update `outline.md` before implementing. One chart lib per slide; never two.
58
+ - `calc(-1 * clamp(...))` for any negated length instead of `-clamp(...)`
59
+ - Motion: load as `<script type="module">` at bottom of `<body>`
60
+ - **Step animations**: when the outline row or slide notes call for step-by-step reveal, add `data-step="N"` to each element and load `../js/animation.js` **before** `../js/navbridge.js`. Read `references/animation.md` for the full protocol. Never add `data-step` to title or header elements — those must be visible on slide entry.
61
+ - **The outline is the contract.** If implementation reveals a better title, split, or order — update `.content/outline.md` first, then build to the updated version.
62
+ - **Preserve the Question-Answer chain.** The `Flow logic` column in the outline is the contract. Each slide's heading should carry the meaning of that column. If implementation reveals the title drifts from the chain: (a) fix the title to match the chain; (b) if a better reframe serves the chain better, update `.content/outline.md → Flow logic` first, then build to the updated version. Never silently change a title without updating the outline — the chain breaks invisibly.
63
+
64
+ **Image handling (check the slide's `Slide notes` in `outline.md`, then `request.md → Images`):**
65
+
66
+ All image files go in `assets/` at the deck root. Slides reference them as `../assets/filename.png` (one level up from `slides/`).
67
+
68
+ | Image status in brief | What to do in HTML |
69
+ |-----------------------|--------------------|
70
+ | `ready` — file path provided | `<img src="../assets/{{filename}}" alt="{{descriptive alt text}}">` |
71
+ | `placeholder` / `[IMAGE PLACEHOLDER]` — user will provide later | Use the `PLACEHOLDER` component: `image-ph` (inline) or `image-ph-bleed` (full-bleed) from `references/html-templates.md` |
72
+ | Full-bleed `slide--image` with ready image | `<img src="../assets/{{filename}}">` + `<div class="image-overlay">` + optional `.image-caption` |
73
+ | Full-bleed `slide--image` with no image yet | `image-ph-bleed` div + `<div class="image-overlay">` + `.image-caption` |
74
+
75
+ For any missing image, do not search, download, generate, or silently substitute an image. Render the `PLACEHOLDER` component and add a `data-expected` attribute with a plain-English description of the image: `data-expected="{{what the image shows}}"`. The user can replace it later with a real file.
76
+
77
+ **Opt-in exception — image generation via Nano Banana 2 (Gemini 3.1 Flash Image):** when the user has *explicitly* asked to generate images for the deck **and** `data-expected` is concrete, follow `references/image-generation.md`. Three paths are available: **Path A** (default — Python SDK + `GEMINI_API_KEY`), **Path B** (`belt` from inference.sh), **Path C** (Gemini CLI + `mcp-nanobanana-go` MCP server — requires GCP ADC + `GOOGLE_CLOUD_PROJECT`; the `gemini` CLI itself has no built-in image command, only this MCP path works). Save outputs into `assets/` and reference them with the standard `../assets/{{filename}}` path. Without explicit opt-in, the placeholder rule above wins.
78
+
79
+ For full-bleed slides with images: the `.image-overlay` gradient div is **mandatory** — it ensures text in `.image-caption` remains legible regardless of the image content.
80
+
81
+ ---
82
+
83
+ ## Step 3b · Template alignment check (run after every slide, not at the end)
84
+
85
+ Every slide must be structurally identical in its scaffolding. Check each slide before moving to the next:
86
+
87
+ | Check | Pass condition | Fix |
88
+ |-------|---------------|-----|
89
+ | Started from `scripts/slide.html` | `<link rel="stylesheet" href="../css/base.css">` exists | Re-copy template, do not patch inline |
90
+ | Theme loaded | `<link rel="stylesheet" href="../css/theme.css">` exists | Add the link |
91
+ | Navbridge loaded | `<script src="../js/navbridge.js"></script>` immediately before `</body>` | Add in correct position |
92
+ | animation.js order (if slide uses steps) | `<script src="../js/animation.js">` appears **before** `<script src="../js/navbridge.js">` | Swap order — wrong order silently breaks step intercept |
93
+ | Local CSS is justified | Only slide-specific layout helpers live in `<style>`; colors/fonts/sizes still use design tokens | Move reusable styles to `base.css` or `theme.css` |
94
+ | CSS variables only | No `color: #hex` or `font-family: "..."` inline on any element | Replace all hardcoded values with `var(--token)` |
95
+ | Meaningful class names | No bare context-free class (`col`, `item`, `row`) as the sole class on animated or scripted elements — a context qualifier must be present (e.g. `col two-col-left`) | Add qualifier per `html-templates.md → Naming convention` |
96
+ | ID convention | Every JS-targeted element uses `id="{slide-slug}-{role}"` (e.g. `id="metrics-kpi-1"`) — not bare `id="kpi"` or `id="chart"` | Rename to follow convention |
97
+ | Slide class set | `<div class="slide slide--{{type}}">` matches the slide type in the outline row | Correct the class |
98
+ | No inline `style` width/height for layout | Dimensions use CSS classes or `var()` | Extract to class |
99
+ | No scroll at 1280×720 | Content fits without `overflow-y: auto` being needed | Split slide or reduce content |
100
+
101
+ **If any slide fails a check:** fix it immediately before writing the next slide. Do not accumulate debt.
102
+
103
+ ---
104
+
105
+ ## Step 4 · Implementation loop
106
+
107
+ Run an internal mini-review at natural break points — section boundaries, after every 5–8 slides, or whenever density / type pattern changes. The point is to catch drift early, not to hit a fixed cadence.
108
+
109
+ Pause for user feedback only when the user explicitly wants collaborative checkpoints, a missing asset blocks a slide, or a content decision can't be inferred from `outline.md` + `request.md`.
110
+
111
+ When pausing for user feedback, use:
112
+
113
+ ```
114
+ Slides {{N–M}} implemented ({{current}}/{{total}} total).
115
+
116
+ Self-check before showing you:
117
+ - Titles: all claim sentences (not topic labels)?
118
+ - Flow: each slide answers the previous question, raises the next?
119
+ - Overflow: all content fits 1280×720 without scrolling?
120
+ - Variables: no hardcoded colors/fonts?
121
+
122
+ Reply "continue" to build the next batch, or give feedback.
123
+ ```
124
+
125
+ In fast/delegated mode, continue after the internal mini-review without waiting. If the user gives feedback, fix the flagged slides before continuing.
126
+ If the user says "continue", run the self-check against the next batch as you build it.
127
+
128
+ This loop runs until all slides in the outline are implemented.
129
+
130
+ ---
131
+
132
+ ## Step 5 · Build index.html and js/navbridge.js
133
+
134
+ Once all slides are implemented:
135
+
136
+ ### 5a · Copy verbatim scripts
137
+
138
+ Run these copies; never paraphrase from memory:
139
+
140
+ ```bash
141
+ cp scripts/navbridge.js js/navbridge.js
142
+ cp scripts/presenter.js js/presenter.js
143
+ cp scripts/animation.js js/animation.js # copy even if no slides use steps yet
144
+ # css/base.css was already copied by Phase 4 Step 7; verify it exists
145
+ ```
146
+
147
+ **`animation.js`** is an optional per-slide script. Copying it to `js/` at deck build time makes it available for any slide to opt in — slides that don't include the `<script>` tag are unaffected.
148
+
149
+ If `css/base.css` is missing for any reason, copy it now: `cp scripts/base.css css/base.css`. Theme overrides remain in `css/theme.css`.
150
+
151
+ ### 5b · Build index.html
152
+
153
+ 1. Start from `scripts/base.html`
154
+ 2. Replace all `<!-- LLM: ... -->` comments with actual values
155
+ 3. Fill `const slides = [...]` using the `{ path, hidden, name }` object format:
156
+ - `path` — slide HTML file relative to `index.html` (e.g. `'slides/problem.html'`)
157
+ - `name` — unique slug for URL hash (e.g. `'problem'` → `#problem`). **Do NOT use numbers** — playback order is controlled by the array, not filenames.
158
+ - `hidden` — `true` to skip during playback and hide from overview grid
159
+ 4. Keep entries in the order you want them shown — this array is the single source of truth for slide order.
160
+
161
+ Do not replace `scripts/base.html` with a single-iframe controller. The current controller preloads slide iframes for grid thumbnails, uses name-based hashes, forwards iframe keyboard events through navbridge, wires `P` to the presenter popup, `B`/`W` to blackout, and supports scroll-wheel navigation.
162
+ 5. Write to `index.html` (at deck root — same level as `css/`, `js/`, and `slides/`)
163
+
164
+ ```javascript
165
+ // Example manifest — replace with actual slides:
166
+ const slides = [
167
+ { path: 'slides/title.html', hidden: false, name: 'title' },
168
+ { path: 'slides/problem.html', hidden: false, name: 'problem' },
169
+ { path: 'slides/solution.html', hidden: false, name: 'solution' },
170
+ { path: 'slides/closing.html', hidden: false, name: 'closing' },
171
+ ];
172
+ ```
173
+
174
+ ### 5c · Wire pointer chrome on `index.html` (opt-in only)
175
+
176
+ If `DESIGN.md → Pointer & click feedback` section is present (enabled in Phase 4 Step 5b), copy the wiring snippet from `references/resources.md → Pointer & Click Feedback → Wiring on index.html` into `index.html` (just before `</body>`). The snippet is the canonical implementation — do not paraphrase.
177
+
178
+ **Mandatory rules** (verified in Phase 6):
179
+ - Loaded on `index.html` only — **never** inside a slide HTML (each slide is a separate iframe document).
180
+ - `<click-spark>` wrapper: `pointer-events: none; z-index: 5` so HUD (z-index 50) and progress (z-index 10) stay clickable.
181
+ - Keep the `pointer: coarse` and `prefers-reduced-motion` short-circuits in the snippet.
182
+
183
+ Skip this step when `DESIGN.md → Libraries` says `Pointer chrome: off`.
184
+
185
+ ### 5d · Write README.md
186
+
187
+ Write `README.md` (at deck root):
188
+
189
+ ```markdown
190
+ # {{Deck Title}}
191
+
192
+ Serve: `npx serve .octocode/slides/{{slideName}}`
193
+ Then open: http://localhost:3000
194
+
195
+ Keys: `→` next · `←` prev · `Space` next · `G` grid · `F` full · `P` presenter · `B`/`W` blank
196
+
197
+ Edit a slide: `slides/*.html`
198
+ Change theme: `css/theme.css` — all slides update automatically
199
+ Reorder slides: edit the `slides` array in `index.html`
200
+ ```
201
+
202
+ ---
203
+
204
+ ## Step 6 · Hand-off to Phase 6
205
+
206
+ Quick sanity gate — only the items unique to Phase 5 (the structural deck shape). The full technical, design, and content review lives in `references/06-review.md`.
207
+
208
+ - [ ] Every outline row has a matching `slides/slug.html` (no `slides/slides/`)
209
+ - [ ] `js/navbridge.js`, `js/presenter.js`, `css/base.css`, `css/theme.css` all exist at the deck root
210
+ - [ ] No `[NEEDS SOURCE]` / `needs asset` / `revisit` rows remain unless they ship as labeled placeholders
211
+ - [ ] No slide HTML contains hardcoded colors, fonts, or pixel sizes (CSS variables only)
212
+
213
+ Pass to Phase 6 → read `references/06-review.md`. Start with Step 0 (Self-review).
@@ -0,0 +1,258 @@
1
+ # Phase 6 — Review
2
+
3
+ **Role:** Review agent. Verify the deck is structurally correct, visually consistent, content-accurate, and passes both Slop Tests. Then ask the user to confirm.
4
+
5
+ **Input:** The full `.octocode/slides/{{slideName}}/` folder
6
+
7
+ ---
8
+
9
+ ## Step 0 · Self-review — run before showing anything to the user
10
+
11
+ Walk every slide through the three checklists below. Treat them as a thinking tool, not a passing grade — most items are the strong defaults from `SKILL.md → Operating principles → Strong defaults`. Fix every clear failure; when an item is intentionally violated for a brief-driven reason, record the reason inline (in `outline.md → Slide notes` or as an HTML comment) instead of forcing a rewrite.
12
+
13
+ The "Anti-patterns" table is different — those are auto-fail and should be removed without negotiation.
14
+
15
+ ---
16
+
17
+ ### Content
18
+
19
+ | Check | Pass condition |
20
+ |-------|---------------|
21
+ | Title is a claim | Contains a verb + specific assertion — not a topic label ("Performance" fails; "API latency dropped 40% after caching" passes) |
22
+ | One idea per slide | Can state the slide's point in a single sentence |
23
+ | Text volume | ≤ 6 lines of text on any slide; ≤ 4 bullets; each bullet ≤ 12 words |
24
+ | No filler phrases | No "In this slide…", "As you can see…", "Key takeaways:", or similar deck narration |
25
+ | No placeholder tokens | No `{{…}}` text remaining in any slide HTML |
26
+
27
+ ---
28
+
29
+ ### UX
30
+
31
+ | Check | Pass condition |
32
+ |-------|---------------|
33
+ | 3-second test | Main point is clear without reading every word |
34
+ | Visual hierarchy | Largest / boldest element is the most important one; nothing competes equally |
35
+ | Layout variety | No 3 consecutive slides with identical layout type |
36
+ | Whitespace | ≥ 40% of slide area is empty on every slide |
37
+ | No scroll | Every slide fits 1280×720; nothing overflows |
38
+
39
+ ---
40
+
41
+ ### Anti-patterns (auto-fail any of these)
42
+
43
+ | Pattern | Why it fails |
44
+ |---------|-------------|
45
+ | Decorative dashes as bullet markers (`—`, `-`, `–` as visual list leaders) | Use the CSS `.bullets` class with `→` from `base.css` instead |
46
+ | Inline metadata on content slides (author, date, "Slide X of N" inside the content area) | Belongs in speaker notes or the navigation chrome only |
47
+ | Emoji leading bullets or section headers | Breaks visual scale on projectors; use typographic markers |
48
+ | `background-clip: text` gradient on headings | AI-gen cliché; remove entirely |
49
+ | Accent color on more than 3 elements per slide | Destroys hierarchy |
50
+ | All-caps body text | Reduces readability; title/section slides only |
51
+ | Hardcoded colors, fonts, or pixel sizes in slide HTML | Must be `var(--token)` only |
52
+ | More than 4 bullet points on any slide | Exceeds cognitive chunking limit (Miller's Law) |
53
+ | Full paragraphs on any slide | This is a document, not a presentation — use speaker notes |
54
+ | Topic-label title (no verb, no specific assertion) | Prefer claim-sentence titles — see slide-rules.md §1.2 |
55
+ | Every slide is the same centered-stack layout | Layout monotony kills narrative rhythm |
56
+ | Three-dot window chrome (`• • •`) on code blocks | Decorative noise; remove |
57
+ | Data slide with no context slide before or after | Data without interpretation creates confusion |
58
+ | `{{…}}` placeholder tokens remaining in any HTML | Replace before delivery unless intentionally shown as a labeled placeholder |
59
+ | Inter or Roboto as the only heading font | Generic; no design intent; fails Slop Test item 1 |
60
+
61
+ **Scoring:** Each failing check = one fix to consider. Resolve clear failures before Step 1; document intentional exceptions when the brief requires them.
62
+
63
+ After fixing all anti-patterns, run both Slop Tests (tables are in `SKILL.md → Slop Test`). Record `Visual Slop: N/8` and `Content Slop: N/8`. Carry both scores into the Step 6 user summary. Visual target is 0/8 and always ≤1/8; Content target is 0/8.
64
+
65
+ ---
66
+
67
+ ## Step 1 · Rendered browser review
68
+
69
+ Static review is not enough for HTML slides. Before showing the deck to the user, render it.
70
+
71
+ 1. Serve the deck root: `npx serve .octocode/slides/{{slideName}}`
72
+ 2. Open `index.html` in a browser or browser automation tool
73
+ 3. Visit every slide through normal navigation and by name hash (e.g. `#title`, `#problem`, `#closing`)
74
+ 4. Check browser console errors and failed network requests
75
+ 5. Verify no slide visually overflows or clips important content at 1280×720; when automation is available, compare each iframe document's `scrollWidth/scrollHeight` to its viewport even when CSS uses `overflow: hidden`
76
+ 6. Verify keyboard controls: next, previous, Home, End, fullscreen (`F`), overview (`G`), presenter popup (`P`), blackout (`B`/`W`), and scroll-wheel navigation
77
+ 7. Deep-link directly to at least three named hashes in a fresh tab; exactly one `.slide-frame[data-active]` should be active each time
78
+ 8. Capture screenshots when tooling is available, preferably under `.content/review/screenshots/`
79
+
80
+ If browser tooling is unavailable, open the deck manually and document that limitation in the final response. If rendering is impossible, tell the user clearly before delivery.
81
+
82
+ ---
83
+
84
+ ## Step 2 · Technical review
85
+
86
+ Check each item. Fix any failure before moving to Step 3.
87
+
88
+ **Navigation controller (`index.html`)**
89
+ - [ ] `const slides = [...]` uses `{ path, hidden, name }` objects — no plain strings, no numeric names
90
+ - [ ] Every slide has a unique `name` slug
91
+ - [ ] All `path` values start with `slides/` and the files exist
92
+ - [ ] `playable = slides.filter(s => !s.hidden)` filters hidden slides
93
+ - [ ] `postMessage` listener handles `octocode-slides:nav`, `octocode-slides:activity`, and `octocode-slides:presenter-goto`
94
+ - [ ] `ResizeObserver` + `scale()` logic present and correct
95
+ - [ ] Keyboard navigation: `→` `←` `Space` `Home` `End` `F` `G` `P` `B` `W`
96
+ - [ ] Progress bar, counter, and HUD elements present
97
+ - [ ] Hash updates use `slide.name` (not numeric index)
98
+
99
+ - [ ] Direct hash loading activates exactly one iframe and one overview cell
100
+
101
+ - [ ] `js/presenter.js` is copied, loaded by `index.html`, and `P` opens the presenter popup (slide previews + speaker notes + timer + jump control) without console errors
102
+
103
+ - [ ] `index.html` is based on `scripts/base.html` multi-iframe controller, not a stale single-iframe controller
104
+
105
+ **Pointer + selection contract (CRITICAL — easy to break, breaks silently)**
106
+
107
+ All `.slide-cell` wrappers stack at `inset:0`. If any inactive cell still accepts pointer events, the topmost stacked cell will swallow every mouse-down and the user cannot select text, click links, or interact with the active iframe. Verify in `index.html` style block:
108
+
109
+ - [ ] `.slide-cell` declares `pointer-events: none` (default state for inactive cells)
110
+ - [ ] `.slide-cell.is-active` declares `pointer-events: auto`
111
+ - [ ] `.slide-frame` declares `pointer-events: none`
112
+ - [ ] `.slide-frame[data-active]` declares `pointer-events: auto`
113
+ - [ ] `go()` toggles BOTH `is-active` (on the cell) AND `data-active` (on the iframe) in the same step — never one without the other
114
+ - [ ] No slide HTML or shared CSS sets `user-select: none` on body, `.slide`, or any text-bearing container
115
+ - [ ] Browser sanity check: `document.elementFromPoint(640, 360)` (centre of stage) returns the active `<iframe class="slide-frame">`, not a stacked `.slide-cell`. If it returns a cell or another iframe, selection is broken — fix before shipping.
116
+
117
+ **CSS**
118
+ - [ ] `css/base.css` declares all custom properties used across slides
119
+ - [ ] `css/theme.css` overrides only variables defined in `base.css`
120
+ - [ ] No slide HTML file uses hardcoded `color:`, `font-family:`, or `font-size:` values
121
+ - [ ] Google Fonts `@import` is at the top of `theme.css`
122
+ - [ ] `@media (prefers-reduced-motion: reduce)` present in `base.css`
123
+ - [ ] `@media print` present in `base.css` (1280×720 page size for PDF export)
124
+ - [ ] `--text` vs `--bg` contrast ratio is ≥ 4.5:1 WCAG AA (verify using the values in `DESIGN.md` — fail if ratio is not documented or is below 4.5:1)
125
+
126
+ **Individual slides**
127
+ - [ ] Every slide links to `../css/base.css` and `../css/theme.css`
128
+ - [ ] Every slide includes `<script src="../js/navbridge.js"></script>` immediately before `</body>`
129
+ - [ ] `js/navbridge.js` exists at the deck root
130
+
131
+ - [ ] `js/presenter.js` exists at the deck root
132
+ - [ ] Every CDN library listed in DESIGN.md is loaded in the correct slide files
133
+ - [ ] Motion scripts use `type="module"` and load from `cdn.jsdelivr.net/npm/motion@latest/+esm`
134
+ - [ ] Code slides initialize highlight.js — either `hljs.highlightAll()` or `querySelectorAll('pre code').forEach(el => hljs.highlightElement(el))`
135
+ - [ ] Markdown slides call `marked.parse()` on `[data-md]` elements
136
+ - [ ] `<aside class="speaker-notes">` present in every slide
137
+ - [ ] Image references use `../assets/filename` (not hardcoded absolute paths)
138
+
139
+ **Pointer chrome (only if `DESIGN.md → Pointer & click feedback` is present)**
140
+ - [ ] `<click-spark>` and `cursor-effects` import live in `index.html` only — never inside any slide HTML
141
+ - [ ] `<click-spark>` wrapper has `pointer-events: none` and `z-index` below HUD/progress (HUD = 50, progress = 10, spark ≤ 5)
142
+ - [ ] HUD, progress bar, counter, and overview thumbnails remain clickable; spark fires on chrome clicks but does not block them
143
+ - [ ] Custom cursor follows pointer with the lag described in DESIGN.md; OS cursor still appears on form fields, links, and during text selection
144
+ - [ ] Touch device sanity: `pointer: coarse` short-circuit disables the custom cursor (verify in DevTools mobile emulation)
145
+ - [ ] `prefers-reduced-motion: reduce` disables or flattens the spark animation
146
+
147
+ ---
148
+
149
+ ## Step 3 · Design review
150
+
151
+ **Visual Slop Test** — run the 8-item checklist from `SKILL.md → Slop Test → Visual Slop`. Score ≥ 2 → fix before continuing.
152
+
153
+ **Visual consistency check**
154
+ - [ ] Accent color is used for the same purpose in every slide (e.g., heading only)
155
+ - [ ] Font sizes feel consistent slide-to-slide (same heading size hierarchy)
156
+ - [ ] Spacing is consistent — padding feels the same on all slides
157
+ - [ ] Animations are consistent in timing and feel (not different per slide)
158
+ - [ ] Color temperature is consistent (all warm or all cool — no sudden shifts)
159
+
160
+ **Layout variety check (anti-monotony)**
161
+ - [ ] Not every slide is centered-stack
162
+ - [ ] At least 2 different layout types used across the deck
163
+ - [ ] No 3 consecutive slides with the same layout
164
+
165
+ ---
166
+
167
+ ## Step 4 · Content & flow review
168
+
169
+ Read `.content/outline.md` rows and compare to the implemented `slides/slug.html` files. Read the full title sequence aloud.
170
+
171
+ **Outline-to-slide completeness**
172
+ - [ ] Every implemented slide has a matching row in `.content/outline.md`
173
+ - [ ] No outline row still says `[NEEDS SOURCE]`, `needs asset`, or `revisit` unless the slide intentionally ships a labeled placeholder
174
+ - [ ] `Widgets`, `Graphs`, and `Images` notes in the outline match the implemented HTML and loaded libraries
175
+
176
+ **Content accuracy**
177
+ - [ ] Headline text matches what was planned
178
+ - [ ] Bullet points match the outline content (no missing or added points)
179
+ - [ ] Code slides show the correct language class and snippet
180
+ - [ ] Chart/data values match the outline row and cited source
181
+ - [ ] Image path, placeholder, alt text, and overlay match the outline notes
182
+ - [ ] UX/UI layout, reading order, dominant visual, and animation match the outline notes
183
+ - [ ] Speaker notes are present and contain useful context
184
+ - [ ] No slide body overflows (verify each layout fits within the 1280×720 stage; split or simplify any slide that would scroll)
185
+ - [ ] No placeholder text (`{{…}}` tokens left un-replaced)
186
+
187
+ **Content Slop Test** — run the 8-item checklist from `SKILL.md → Slop Test → Content Slop`. Score ≥ 1 → fix before continuing.
188
+
189
+ **Logical flow (slide-rules.md §5)**
190
+ - [ ] Ghost outline test: reading only the slide titles tells the complete story (argument → evidence → conclusion)
191
+ - [ ] Question-Answer chain: each slide answers the implicit question raised by the previous slide
192
+ - [ ] Every `chart`, `stats`, or `code` slide has a context slide before or after it
193
+ - [ ] Major topic transitions use a `section` slide — no abrupt jumps between unrelated claims
194
+ - [ ] Appendix slides (if any) appear after `closing` and are labeled `[APPENDIX]`
195
+ - [ ] No concept is referenced before it is introduced
196
+
197
+ ---
198
+
199
+ ## Step 5 · Fix loop
200
+
201
+ For each failure found in Steps 1–4:
202
+ 1. Fix the specific file
203
+ 2. Re-check only the affected items
204
+ 3. Confirm: `✓ Fixed: {{description}}`
205
+
206
+ Re-run the relevant Slop Test after any content, CSS, or theme changes.
207
+
208
+ ---
209
+
210
+ ## Step 6 · Present to user
211
+
212
+ Once all checks pass:
213
+
214
+ Use the `SKILL.md → Presenting options to the user` format — share the review findings first, then the options:
215
+
216
+ ```
217
+ Review complete ✓
218
+
219
+ Deck: .octocode/slides/{{slideName}}/index.html
220
+ Serve: npx serve .octocode/slides/{{slideName}}
221
+ Slides: {{N}} · Theme: {{name}} · Visual Slop: {{0 or 1}}/8 · Content Slop: 0/8
222
+
223
+ What I fixed: {{list any Slop Test failures that were corrected, or "none needed"}}
224
+ What's still outstanding: {{list any [NEEDS SOURCE] or image placeholders — or "none"}}
225
+
226
+ A — Fix a specific slide
227
+ B — Change slide content or design
228
+ C — Add or remove a slide
229
+ D — Change the theme
230
+ E — Done ✓
231
+
232
+ Reply with a letter — or "E" if the deck is ready.
233
+ ```
234
+
235
+ If the user says "done" (option 5): confirm the deck location and output the final file tree.
236
+
237
+ If the user requests changes: make them, re-run the relevant checks from Steps 1–4, then present again.
238
+
239
+ ---
240
+
241
+ ## Step 7 · Final output (on "done")
242
+
243
+ ```
244
+ Deck complete ✓
245
+
246
+ .octocode/slides/{{slideName}}/
247
+ ├── index.html
248
+ ├── README.md
249
+ ├── css/ (base.css + theme.css)
250
+ ├── js/ (navbridge.js + presenter.js)
251
+ ├── assets/ (images)
252
+ ├── slides/ (N slide HTML files)
253
+ └── .content/
254
+ └── request.md · outline.md · DESIGN.md
255
+
256
+ Serve: npx serve .octocode/slides/{{slideName}}
257
+ Open: http://localhost:3000
258
+ ```