jdi-cli 0.1.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 (159) hide show
  1. package/AGENTS.md +209 -0
  2. package/ARCHITECTURE.md +210 -0
  3. package/COMMANDS.md +241 -0
  4. package/CREATE-EXAMPLE.md +385 -0
  5. package/CREATE.md +315 -0
  6. package/EXTENSION.md +141 -0
  7. package/LICENSE +21 -0
  8. package/MEMORY.md +471 -0
  9. package/PORTABILITY.md +438 -0
  10. package/README.md +789 -0
  11. package/bin/git-hooks/post-commit +16 -0
  12. package/bin/git-hooks/pre-commit +21 -0
  13. package/bin/jdi-build.ps1 +381 -0
  14. package/bin/jdi-build.sh +332 -0
  15. package/bin/jdi-doctor.ps1 +403 -0
  16. package/bin/jdi-doctor.sh +400 -0
  17. package/bin/jdi-install-caveman.ps1 +97 -0
  18. package/bin/jdi-install-caveman.sh +99 -0
  19. package/bin/jdi-install-playwright.ps1 +319 -0
  20. package/bin/jdi-install-playwright.sh +284 -0
  21. package/bin/jdi-install.ps1 +154 -0
  22. package/bin/jdi-install.sh +132 -0
  23. package/bin/jdi-uninstall.ps1 +309 -0
  24. package/bin/jdi-uninstall.sh +264 -0
  25. package/bin/jdi-update.ps1 +215 -0
  26. package/bin/jdi-update.sh +209 -0
  27. package/bin/jdi.js +460 -0
  28. package/bin/lib/jdi-monitor.ps1 +66 -0
  29. package/bin/lib/jdi-monitor.sh +74 -0
  30. package/bin/lib/jdi-truncate.ps1 +96 -0
  31. package/bin/lib/jdi-truncate.sh +99 -0
  32. package/bin/lib/ui.js +197 -0
  33. package/core/agents/jdi-adopter.md +465 -0
  34. package/core/agents/jdi-architect.md +894 -0
  35. package/core/agents/jdi-asker.md +153 -0
  36. package/core/agents/jdi-bootstrap.md +247 -0
  37. package/core/agents/jdi-planner.md +254 -0
  38. package/core/agents/jdi-researcher.md +303 -0
  39. package/core/commands/jdi-adopt.md +155 -0
  40. package/core/commands/jdi-bootstrap.md +81 -0
  41. package/core/commands/jdi-create.md +80 -0
  42. package/core/commands/jdi-discuss.md +80 -0
  43. package/core/commands/jdi-do.md +200 -0
  44. package/core/commands/jdi-loop.md +315 -0
  45. package/core/commands/jdi-new.md +131 -0
  46. package/core/commands/jdi-plan.md +73 -0
  47. package/core/commands/jdi-ship.md +146 -0
  48. package/core/commands/jdi-verify.md +159 -0
  49. package/core/skills/clean-code/SKILL.md +261 -0
  50. package/core/skills/dry/SKILL.md +150 -0
  51. package/core/skills/frontend-rules/SKILL.md +386 -0
  52. package/core/skills/frontend-validator/SKILL.md +567 -0
  53. package/core/skills/kiss/SKILL.md +178 -0
  54. package/core/skills/solid/SKILL.md +281 -0
  55. package/core/skills/yagni/SKILL.md +207 -0
  56. package/core/templates/agent.md +72 -0
  57. package/core/templates/doer-specialist.md +216 -0
  58. package/core/templates/reviewer-specialist.md +405 -0
  59. package/core/templates/skill.md +66 -0
  60. package/package.json +70 -0
  61. package/runtimes/antigravity/agents.md +74 -0
  62. package/runtimes/antigravity/skills/clean-code/SKILL.md +252 -0
  63. package/runtimes/antigravity/skills/dry/SKILL.md +141 -0
  64. package/runtimes/antigravity/skills/frontend-rules/SKILL.md +376 -0
  65. package/runtimes/antigravity/skills/frontend-validator/SKILL.md +559 -0
  66. package/runtimes/antigravity/skills/jdi-adopt/SKILL.md +155 -0
  67. package/runtimes/antigravity/skills/jdi-adopter/SKILL.md +436 -0
  68. package/runtimes/antigravity/skills/jdi-architect/SKILL.md +872 -0
  69. package/runtimes/antigravity/skills/jdi-asker/SKILL.md +125 -0
  70. package/runtimes/antigravity/skills/jdi-asker/references/context-template.md +34 -0
  71. package/runtimes/antigravity/skills/jdi-asker/references/decision-format.md +19 -0
  72. package/runtimes/antigravity/skills/jdi-asker/scripts/find_phase_dir.sh +25 -0
  73. package/runtimes/antigravity/skills/jdi-bootstrap/SKILL.md +81 -0
  74. package/runtimes/antigravity/skills/jdi-create/SKILL.md +80 -0
  75. package/runtimes/antigravity/skills/jdi-discuss/SKILL.md +80 -0
  76. package/runtimes/antigravity/skills/jdi-discuss/scripts/run_command.sh +62 -0
  77. package/runtimes/antigravity/skills/jdi-do/SKILL.md +200 -0
  78. package/runtimes/antigravity/skills/jdi-loop/SKILL.md +315 -0
  79. package/runtimes/antigravity/skills/jdi-new/SKILL.md +131 -0
  80. package/runtimes/antigravity/skills/jdi-plan/SKILL.md +73 -0
  81. package/runtimes/antigravity/skills/jdi-planner/SKILL.md +225 -0
  82. package/runtimes/antigravity/skills/jdi-researcher/SKILL.md +274 -0
  83. package/runtimes/antigravity/skills/jdi-ship/SKILL.md +146 -0
  84. package/runtimes/antigravity/skills/jdi-verify/SKILL.md +159 -0
  85. package/runtimes/antigravity/skills/kiss/SKILL.md +169 -0
  86. package/runtimes/antigravity/skills/solid/SKILL.md +272 -0
  87. package/runtimes/antigravity/skills/yagni/SKILL.md +198 -0
  88. package/runtimes/claude/CLAUDE.md +91 -0
  89. package/runtimes/claude/agents/jdi-adopter.md +430 -0
  90. package/runtimes/claude/agents/jdi-architect.md +864 -0
  91. package/runtimes/claude/agents/jdi-asker.md +119 -0
  92. package/runtimes/claude/agents/jdi-bootstrap.md +213 -0
  93. package/runtimes/claude/agents/jdi-planner.md +221 -0
  94. package/runtimes/claude/agents/jdi-researcher.md +269 -0
  95. package/runtimes/claude/commands/jdi-adopt.md +155 -0
  96. package/runtimes/claude/commands/jdi-bootstrap.md +81 -0
  97. package/runtimes/claude/commands/jdi-create.md +80 -0
  98. package/runtimes/claude/commands/jdi-discuss.md +80 -0
  99. package/runtimes/claude/commands/jdi-do.md +200 -0
  100. package/runtimes/claude/commands/jdi-loop.md +315 -0
  101. package/runtimes/claude/commands/jdi-new.md +131 -0
  102. package/runtimes/claude/commands/jdi-plan.md +73 -0
  103. package/runtimes/claude/commands/jdi-ship.md +146 -0
  104. package/runtimes/claude/commands/jdi-verify.md +159 -0
  105. package/runtimes/claude/settings.example.json +132 -0
  106. package/runtimes/claude/skills/clean-code/SKILL.md +247 -0
  107. package/runtimes/claude/skills/dry/SKILL.md +136 -0
  108. package/runtimes/claude/skills/frontend-rules/SKILL.md +369 -0
  109. package/runtimes/claude/skills/frontend-validator/SKILL.md +553 -0
  110. package/runtimes/claude/skills/kiss/SKILL.md +164 -0
  111. package/runtimes/claude/skills/solid/SKILL.md +267 -0
  112. package/runtimes/claude/skills/yagni/SKILL.md +193 -0
  113. package/runtimes/copilot/agents/jdi-adopter.agent.md +430 -0
  114. package/runtimes/copilot/agents/jdi-architect.agent.md +864 -0
  115. package/runtimes/copilot/agents/jdi-asker.agent.md +119 -0
  116. package/runtimes/copilot/agents/jdi-bootstrap.agent.md +213 -0
  117. package/runtimes/copilot/agents/jdi-planner.agent.md +221 -0
  118. package/runtimes/copilot/agents/jdi-researcher.agent.md +269 -0
  119. package/runtimes/copilot/copilot-instructions.md +80 -0
  120. package/runtimes/copilot/prompts/jdi-adopt.prompt.md +155 -0
  121. package/runtimes/copilot/prompts/jdi-bootstrap.prompt.md +81 -0
  122. package/runtimes/copilot/prompts/jdi-create.prompt.md +80 -0
  123. package/runtimes/copilot/prompts/jdi-discuss.prompt.md +80 -0
  124. package/runtimes/copilot/prompts/jdi-do.prompt.md +200 -0
  125. package/runtimes/copilot/prompts/jdi-loop.prompt.md +315 -0
  126. package/runtimes/copilot/prompts/jdi-new.prompt.md +131 -0
  127. package/runtimes/copilot/prompts/jdi-plan.prompt.md +73 -0
  128. package/runtimes/copilot/prompts/jdi-ship.prompt.md +146 -0
  129. package/runtimes/copilot/prompts/jdi-verify.prompt.md +159 -0
  130. package/runtimes/opencode/AGENTS.md +87 -0
  131. package/runtimes/opencode/agents/jdi-adopter.md +434 -0
  132. package/runtimes/opencode/agents/jdi-architect.md +861 -0
  133. package/runtimes/opencode/agents/jdi-asker.md +123 -0
  134. package/runtimes/opencode/agents/jdi-bootstrap.md +217 -0
  135. package/runtimes/opencode/agents/jdi-planner.md +225 -0
  136. package/runtimes/opencode/agents/jdi-researcher.md +273 -0
  137. package/runtimes/opencode/commands/jdi-adopt.md +155 -0
  138. package/runtimes/opencode/commands/jdi-bootstrap.md +81 -0
  139. package/runtimes/opencode/commands/jdi-create.md +80 -0
  140. package/runtimes/opencode/commands/jdi-discuss.md +80 -0
  141. package/runtimes/opencode/commands/jdi-do.md +200 -0
  142. package/runtimes/opencode/commands/jdi-loop.md +315 -0
  143. package/runtimes/opencode/commands/jdi-new.md +131 -0
  144. package/runtimes/opencode/commands/jdi-plan.md +73 -0
  145. package/runtimes/opencode/commands/jdi-ship.md +146 -0
  146. package/runtimes/opencode/commands/jdi-verify.md +159 -0
  147. package/runtimes/opencode/opencode.example.jsonc +169 -0
  148. package/runtimes/opencode/skills/clean-code/SKILL.md +247 -0
  149. package/runtimes/opencode/skills/dry/SKILL.md +136 -0
  150. package/runtimes/opencode/skills/frontend-rules/SKILL.md +369 -0
  151. package/runtimes/opencode/skills/frontend-validator/SKILL.md +553 -0
  152. package/runtimes/opencode/skills/kiss/SKILL.md +164 -0
  153. package/runtimes/opencode/skills/solid/SKILL.md +267 -0
  154. package/runtimes/opencode/skills/yagni/SKILL.md +193 -0
  155. package/templates-jdi-folder/config.json +18 -0
  156. package/templates-jdi-folder/registry.md +31 -0
  157. package/templates-jdi-folder/reviewers.md +33 -0
  158. package/templates-jdi-folder/skills-registry.md +32 -0
  159. package/templates-jdi-folder/specialists.md +39 -0
package/README.md ADDED
@@ -0,0 +1,789 @@
1
+ # JDI — Just Do It
2
+
3
+ Lean workflow toolkit for solo dev + AI assistant. Adaptive loop, atomic commits, file-based state, fresh context per agent, wave-based parallelism. Per-project specialists that already know your stack.
4
+
5
+ ## Why
6
+
7
+ Full-blown AI workflows (33+ agents, 60+ commands, 100+ subworkflows) burn tokens and ceremony in solo projects. JDI ships what matters and cuts the rest:
8
+
9
+ - **6 core agents** + **2 per-project** (doer + reviewer, generated by `/jdi-bootstrap`)
10
+ - **10 commands** in a fixed loop + ralph mode + brownfield entry + meta
11
+ - **File-based state** in `.jdi/` (Markdown + frontmatter, no DB)
12
+ - **Multi-runtime:** Claude Code, GitHub Copilot, Google Antigravity, OpenCode
13
+ - **Zero runtime deps** — Node stdlib only
14
+ - **Brownfield supported** — adopt existing projects, not just greenfield
15
+ - **Multi-stack** — N specialist pairs with file-glob routing (e.g. backend C# + frontend React)
16
+ - **Optional MCP** — one-shot Playwright MCP install across all 4 CLIs
17
+
18
+ ## The flow
19
+
20
+ ### Greenfield (new project)
21
+
22
+ ```
23
+ /jdi-new "<short description>" <- research + PROJECT.md + ROADMAP.md
24
+ /jdi-bootstrap <- doer + reviewer per project
25
+ /jdi-discuss <N> <- capture locked decisions (CONTEXT.md)
26
+ /jdi-plan <N> <- decompose into tasks + waves (PLAN.md)
27
+ /jdi-do <N> <- execute via doer specialist (SUMMARY.md)
28
+ /jdi-verify <N> <- gates via reviewer (REVIEW.md)
29
+ /jdi-ship <N> <- update ROADMAP, advance phase
30
+ ```
31
+
32
+ ### Brownfield (existing project)
33
+
34
+ ```
35
+ /jdi-adopt <- scan repo, infer stack/code-design, confirm with user
36
+ /jdi-bootstrap <- doer + reviewer (adopted-aware: coverage only on new files)
37
+ /jdi-discuss <N> <- ... same as greenfield from here
38
+ /jdi-plan <N>
39
+ /jdi-do <N>
40
+ /jdi-verify <N>
41
+ /jdi-ship <N>
42
+ ```
43
+
44
+ `/jdi-adopt` detects manifests (`package.json`, `pyproject.toml`, `go.mod`, `Cargo.toml`, `*.csproj`, `pom.xml`), infers layout (DDD / Vertical Slice / Clean / Hexagonal / The Method / legacy-mixed), reads `README.md` for vision hint, captures existing assets, and ALWAYS confirms code-design with you before locking (D-1). Records boundary commit hash in D-2 so reviewer enforces coverage only on files created AFTER adoption.
45
+
46
+ ### Ralph mode (auto-iterate)
47
+
48
+ Instead of manually running `/jdi-do` then `/jdi-verify`, use:
49
+
50
+ ```
51
+ /jdi-loop <N>
52
+ ```
53
+
54
+ Runs `/jdi-do` ↔ `/jdi-verify` in a bounded loop (default 5 iter per round, max 3 resets = 15 iter absolute). Exits when verdict is `APPROVED` or `APPROVED_WITH_WARNINGS`. Oscillation detection cuts dead loops early.
55
+
56
+ ## Quickstart — `npx` in 30 seconds
57
+
58
+ ```bash
59
+ cd /path/to/your/project
60
+ npx jdi-cli@latest install opencode
61
+ ```
62
+
63
+ Done. Swap `opencode` for `claude`, `copilot`, `antigravity`, or `all` depending on your active runtime.
64
+
65
+ > No `cd` first? `npx` runs in the current directory. Always confirm with `pwd` (Linux/Mac) or `Get-Location` (Windows).
66
+
67
+ ### Prerequisites
68
+
69
+ - **Node.js 18+** (for `npx`)
70
+ - **git**
71
+ - At least one runtime: Claude Code, GitHub Copilot, Antigravity, or OpenCode
72
+
73
+ ## CLI subcommands
74
+
75
+ Quick reference of every flag per subcommand:
76
+
77
+ ### `install <runtime>` — install JDI into the project
78
+
79
+ | Flag | Values | Default | Purpose |
80
+ |---|---|---|---|
81
+ | `--scope` / `-s` | `user` \| `project` | `project` | `project` writes `.claude/`/`.opencode/`/etc into the project; `user` writes to `~/.claude/`, `~/.config/opencode/`, `~/.gemini/antigravity/` |
82
+ | `--no-color` | flag | false | Disable ANSI colors |
83
+
84
+ ```bash
85
+ npx jdi-cli@latest install claude
86
+ npx jdi-cli@latest install copilot
87
+ npx jdi-cli@latest install antigravity --scope user
88
+ npx jdi-cli@latest install opencode
89
+ npx jdi-cli@latest install all # all 4 runtimes at once
90
+ ```
91
+
92
+ ### `install-playwright` — Playwright dev dep + chromium browser + MCP config
93
+
94
+ | Flag | Values | Default | Purpose |
95
+ |---|---|---|---|
96
+ | `--skip-browser` | flag | false | Skip `npx playwright install chromium` (~170MB) |
97
+ | `--skip-mcp` | flag | false | Only install dep + browser, skip injecting MCP configs |
98
+ | `--runtime` | `claude` \| `opencode` \| `copilot` \| `antigravity` \| `all` | `all` | Limit MCP injection to one runtime |
99
+ | `--antigravity-scope` | `user` \| `project` | `user` | `~/.gemini/settings.json` vs `.gemini/settings.json` |
100
+
101
+ Injects MCP into all 4 detected runtimes (see Playwright section above for paths).
102
+
103
+ ```bash
104
+ npx jdi-cli@latest install-playwright
105
+ npx jdi-cli@latest install-playwright --skip-browser
106
+ npx jdi-cli@latest install-playwright --runtime claude
107
+ npx jdi-cli@latest install-playwright --runtime copilot
108
+ npx jdi-cli@latest install-playwright --skip-mcp # just dep + browser
109
+ npx jdi-cli@latest install-playwright --antigravity-scope project
110
+ ```
111
+
112
+ ### `install-caveman` — clone Caveman plugin
113
+
114
+ | Flag | Values | Default | Purpose |
115
+ |---|---|---|---|
116
+ | `--repo` | git URL | `https://github.com/JuliusBrussee/caveman.git` | Override caveman source repo (fork support) |
117
+ | `--scope` | `user` \| `project` | `user` | `~/.claude/plugins/caveman/` vs `.claude/plugins/caveman/` |
118
+ | `--force` | flag | false | Overwrite existing install without prompt |
119
+
120
+ ```bash
121
+ npx jdi-cli@latest install-caveman # user scope, default repo
122
+ npx jdi-cli@latest install-caveman --scope project
123
+ npx jdi-cli@latest install-caveman --repo https://github.com/forked/caveman.git --force
124
+ ```
125
+
126
+ ### `update` — refresh runtime files, preserve state
127
+
128
+ | Flag | Values | Default | Purpose |
129
+ |---|---|---|---|
130
+ | `--dry-run` | flag | false | Show what would change without applying |
131
+ | `--force-specialists` | flag | false | Regenerate specialists without asking (assumes Yes) |
132
+ | `--skip-specialists` | flag | false | Leave specialists alone even if template changed |
133
+
134
+ ```bash
135
+ npx jdi-cli@latest update
136
+ npx jdi-cli@latest update --dry-run
137
+ npx jdi-cli@latest update --force-specialists
138
+ npx jdi-cli@latest update --skip-specialists
139
+ ```
140
+
141
+ Update does NOT refresh Playwright dep, MCP configs, or Caveman plugin. Re-run their respective subcommands to refresh.
142
+
143
+ ### `uninstall [runtime]` — remove JDI files
144
+
145
+ | Flag | Values | Default | Purpose |
146
+ |---|---|---|---|
147
+ | `--scope` | `user` \| `project` \| `both` | `both` | Limit removal scope |
148
+ | `--dry-run` | flag | false | Preview without applying |
149
+ | `--yes` | flag | false | Skip all interactive prompts |
150
+ | `--purge` | flag | false | **DESTRUCTIVE:** also wipe `.jdi/` (locked decisions lost) |
151
+
152
+ ```bash
153
+ npx jdi-cli@latest uninstall # all detected runtimes, preserves .jdi/
154
+ npx jdi-cli@latest uninstall claude
155
+ npx jdi-cli@latest uninstall opencode --scope user
156
+ npx jdi-cli@latest uninstall --dry-run # preview
157
+ npx jdi-cli@latest uninstall --yes # skip prompts
158
+ npx jdi-cli@latest uninstall --purge --yes # WIPE EVERYTHING including .jdi/
159
+ ```
160
+
161
+ ### `doctor` — environment diagnostic
162
+
163
+ | Flag | Values | Default | Purpose |
164
+ |---|---|---|---|
165
+ | `--verbose` / `-v` | flag | false | Show note-level (debug) lines |
166
+
167
+ ```bash
168
+ npx jdi-cli@latest doctor
169
+ npx jdi-cli@latest doctor --verbose
170
+ ```
171
+
172
+ ### `build` — regenerate runtimes/ from core/ (contributors only)
173
+
174
+ No flags. Used inside the JDI source repo after editing `core/`.
175
+
176
+ ```bash
177
+ npx jdi-cli@latest build
178
+ ```
179
+
180
+ ### Misc
181
+
182
+ ```bash
183
+ npx jdi-cli@latest --version
184
+ npx jdi-cli@latest help
185
+ ```
186
+
187
+ > Use `@latest` to force a fresh pull from npm. Without it, `npx` may use a cached older version.
188
+
189
+ ### Install globally (optional)
190
+
191
+ ```bash
192
+ npm i -g jdi-cli
193
+ jdi install opencode
194
+ jdi doctor
195
+ ```
196
+
197
+ After that, `jdi` works without `npx`.
198
+
199
+ ## Optional add-ons
200
+
201
+ ### Playwright MCP — live browser tool for all 4 CLIs
202
+
203
+ `npx jdi-cli install-playwright` does three things:
204
+
205
+ 1. Installs `@playwright/test` as devDependency (detects pnpm/yarn/bun/npm via lockfile)
206
+ 2. Installs Chromium browser (`npx playwright install chromium`, ~170MB) — skippable with `--skip-browser`
207
+ 3. Injects Playwright MCP server config into all detected runtimes:
208
+
209
+ | CLI | MCP config path |
210
+ |---|---|
211
+ | Claude Code | `.claude/settings.local.json` (`mcpServers.playwright`) |
212
+ | OpenCode | `.opencode/opencode.jsonc` (`mcp.playwright`) |
213
+ | GitHub Copilot (VS Code) | `.vscode/mcp.json` (`servers.playwright`) |
214
+ | Antigravity (Google) | `~/.gemini/settings.json` user-scope OR `.gemini/settings.json` project-scope (`mcpServers.playwright`) |
215
+
216
+ Idempotent: skips dep if already in `package.json`, skips MCP entry if already present.
217
+
218
+ Restart your runtime to load the MCP after install.
219
+
220
+ If `frontend.has_frontend: true` is set in `PROJECT.md`, `/jdi-bootstrap` will offer this install interactively (step S9).
221
+
222
+ ### Caveman plugin — token compression
223
+
224
+ `npx jdi-cli install-caveman` clones the [Caveman](https://github.com/JuliusBrussee/caveman) plugin into:
225
+
226
+ - **User scope (default):** `~/.claude/plugins/caveman/`
227
+ - **Project scope:** `.claude/plugins/caveman/`
228
+
229
+ Caveman is a Claude Code plugin that compresses LLM output ~75% by dropping articles/filler/pleasantries while preserving full technical accuracy. Useful for long sessions where context budget matters.
230
+
231
+ After install, restart Claude Code. Toggle with `/caveman lite|full|ultra` or disable with `stop caveman`.
232
+
233
+ `/jdi-bootstrap` offers this install interactively (step S9.5, project-agnostic).
234
+
235
+ ## Frontend support — auto-detect + UI/UX gates
236
+
237
+ If your project has a web interface, JDI activates an extra set of UI/UX-focused gates. Detection runs against:
238
+
239
+ - `package.json` for React, Vue, Svelte, Solid, Angular, Astro, Next, Nuxt, Remix, SvelteKit, Qwik, Preact
240
+ - Razor/Blazor (`*.razor`, `*.cshtml`)
241
+ - Django/Flask templates (`templates/*.html`)
242
+ - Rails (`app/views/*.erb`)
243
+ - Laravel (`resources/views/*.blade.php`)
244
+ - Plain `index.html`
245
+
246
+ ### What auto-loads
247
+
248
+ **Skill `frontend-rules`** — universal UI/UX checklist (**WCAG 2.2 AA + Nielsen + Material/Apple HIG**). Framework-agnostic. Covers:
249
+
250
+ - Accessibility (contrast 4.5:1, focus visible, keyboard nav, ARIA, semantic HTML, touch targets, labels)
251
+ - Mandatory states (loading / empty / error / success / disabled)
252
+ - Forms (validation, autocomplete, inputmode, password toggle, destructive confirmations)
253
+ - Performance UX (CLS < 0.1, LCP < 2.5s, INP < 200ms, optimistic UI)
254
+ - Mobile-first responsive
255
+ - i18n + l10n + RTL
256
+ - UI security (token never in localStorage, CSP, CSRF, `target=_blank` with noopener)
257
+ - BLOCK-level anti-patterns table with WCAG rule citations
258
+
259
+ Doer applies it before writing code. Reviewer uses it as a gate 5 checklist.
260
+
261
+ **Skill `frontend-validator`** — gate 7 of the reviewer. Runs Playwright + axe-core in a real browser:
262
+
263
+ 1. Detects Playwright. If absent, **asks before installing** (4 options: Chromium / all browsers / skip gate 7 / cancel review)
264
+ 2. Detects package manager via lockfile
265
+ 3. Spawns your dev server, waits for ready (60s poll timeout)
266
+ 4. Per critical route × **mobile (375×667)** + **desktop (1280×720)**:
267
+ - Captures console errors
268
+ - Captures network failures (4xx, 5xx, requestfailed)
269
+ - Runs axe-core (WCAG 2.0/2.1/2.2 AA + best-practices)
270
+ - Detects horizontal scroll
271
+ - Fullpage screenshot
272
+ 5. Kills dev server (always, even on error)
273
+ 6. JSON output in `.jdi/cache/ui-findings.json`
274
+
275
+ ### Finding severity
276
+
277
+ | Finding | Severity |
278
+ |---|---|
279
+ | Console error on any route | BLOCK |
280
+ | Network 5xx on critical route | BLOCK |
281
+ | A11y violation `critical` or `serious` | BLOCK |
282
+ | Horizontal scroll on mobile | BLOCK |
283
+ | A11y violation `moderate`, network 4xx | WARN |
284
+ | A11y violation `minor`, scroll on desktop | INFO |
285
+ | Dev server timeout | INCONCLUSIVE (warn) |
286
+ | User declined Playwright install | SKIPPED (warn) |
287
+
288
+ Never BLOCK on technical failure — only on real findings. `.jdi/cache/` is auto-gitignored.
289
+
290
+ ### How it turns on
291
+
292
+ You do nothing. When you run `/jdi-bootstrap` in a project with UI:
293
+
294
+ 1. Auto-detect fires
295
+ 2. Bootstrap asks: "Detected React in `package.json`. Confirm frontend?"
296
+ 3. If yes, 3 extra questions: dev server command (default per framework), frontend URL (default per framework), critical paths (default `/`)
297
+ 4. Persists `frontend:` section in `PROJECT.md`
298
+ 5. Injects `<skills_to_load>` into doer + reviewer
299
+
300
+ From then on, `/jdi-do` loads `frontend-rules` when a task touches UI files; `/jdi-verify` runs gate 7 with Playwright.
301
+
302
+ ### How to turn off
303
+
304
+ Edit `PROJECT.md`:
305
+ ```yaml
306
+ frontend:
307
+ has_frontend: false
308
+ ```
309
+
310
+ Gate 7 returns `SKIPPED`. Skill does not load.
311
+
312
+ ## Multi-stack — N specialist pairs
313
+
314
+ By default, JDI creates **1 doer + 1 reviewer per project**. For fullstack (backend + frontend), mobile (iOS + Android), or polyglot projects, opt into multi-stack at `/jdi-bootstrap`:
315
+
316
+ ```
317
+ Bootstrap asks: "Project stack count?"
318
+ - Single (1 specialist pair)
319
+ - Multi (2 pairs — e.g. backend + frontend)
320
+ - Multi (3 pairs — e.g. backend + frontend + infra)
321
+ - Multi (custom count)
322
+ ```
323
+
324
+ For each specialist, you provide a `stack_label` + `file_glob`:
325
+
326
+ | Specialist | Stack label | File glob |
327
+ |---|---|---|
328
+ | 1 | Backend C# | `**/*.{cs,csproj,sln}` |
329
+ | 2 | Frontend React | `**/*.{ts,tsx,jsx,css,scss}` |
330
+ | 3 | Infra Terraform | `**/*.{tf,tfvars}` |
331
+
332
+ ### How it routes
333
+
334
+ - `.jdi/specialists.md` + `.jdi/reviewers.md` get one row per pair (schema v2 adds `File glob` column)
335
+ - `/jdi-plan` matches each task's `files_modified` against globs and auto-assigns a specialist per task. Tasks spanning 2+ globs auto-split into sub-tasks
336
+ - `/jdi-do` reads `task.specialist` from PLAN.md and spawns the right doer per task. Within a wave, different tasks may spawn different specialists in parallel (disjoint scopes)
337
+ - `/jdi-verify` chains reviewers sequentially (build/test ports + locks would clash if parallel). Each reviewer scopes gates to its glob. Final verdict = worst-case (1 BLOCK = overall BLOCK)
338
+
339
+ Single-stack projects (1 row) stay unchanged — backward compatible.
340
+
341
+ ## State model — `.jdi/`
342
+
343
+ ```
344
+ your-project/
345
+ ├── .jdi/ # state files (generated by JDI commands)
346
+ │ ├── PROJECT.md # vision, stack, code-design (LOCKED after /jdi-new or /jdi-adopt)
347
+ │ ├── ROADMAP.md # phases list (greenfield: MVP features, adopted: new features)
348
+ │ ├── STATE.md # current phase, adopted flag, next step
349
+ │ ├── DECISIONS.md # append-only D-1, D-2, ... (locked decisions)
350
+ │ ├── VERSION # JDI version installed
351
+ │ ├── specialists.md # registry of doer specialists (schema v2)
352
+ │ ├── reviewers.md # registry of reviewer specialists (schema v2)
353
+ │ ├── registry.md # append-only R-1, R-2, ... (audit trail of specialist creation)
354
+ │ ├── agents/ # per-project specialists
355
+ │ │ ├── jdi-doer-{slug}.md
356
+ │ │ └── jdi-reviewer-{slug}.md
357
+ │ ├── phases/{NN-slug}/
358
+ │ │ ├── CONTEXT.md # from /jdi-discuss
359
+ │ │ ├── PLAN.md # from /jdi-plan
360
+ │ │ ├── SUMMARY.md # from /jdi-do
361
+ │ │ ├── REVIEW.md # from /jdi-verify (verdict)
362
+ │ │ └── LOOP.md # only if /jdi-loop ran (ralph state)
363
+ │ └── cache/ # gitignored — gate 7 artifacts (screenshots, JSON findings)
364
+ ├── .claude/ # (if runtime=claude)
365
+ │ ├── agents/jdi-*.md
366
+ │ ├── commands/jdi-*.md
367
+ │ └── settings.example.json
368
+ ├── .githooks/ # no-op by default
369
+ ├── .gitattributes # normalizes CRLF
370
+ ├── CLAUDE.md # runtime instructions
371
+ └── {your code}
372
+ ```
373
+
374
+ For other runtimes, swap `.claude/` for `.github/`, `.gemini/antigravity/`, or `.opencode/`. See [PORTABILITY.md](PORTABILITY.md).
375
+
376
+ ### Invariants
377
+
378
+ - `PROJECT.md` is **immutable** after `/jdi-new` or `/jdi-adopt`
379
+ - `DECISIONS.md` is **append-only** (`D-1`, `D-2`, …). Locked decisions never reverse
380
+ - `registry.md` is **append-only** (`R-1`, `R-2`, …) — audit trail
381
+ - Every command is **idempotent** — re-running prompts before overwrite
382
+ - Reviewer is **read-only by design** (no Write/Edit). Doer is the only writer
383
+
384
+ ## Gates between commands
385
+
386
+ | From | To | Gate |
387
+ |---|---|---|
388
+ | `/jdi-discuss` | `/jdi-plan` | `CONTEXT.md` exists |
389
+ | `/jdi-plan` | `/jdi-do` | PLAN valid (every task has `files_modified`, `acceptance`, `dependencies`, `test`, `specialist`) |
390
+ | `/jdi-do` | `/jdi-verify` | `SUMMARY.md` exists |
391
+ | `/jdi-verify` | `/jdi-ship` | `REVIEW.md` verdict ≠ `BLOCKED` |
392
+
393
+ ## Doctor — 12 sections
394
+
395
+ ```bash
396
+ npx jdi-cli doctor
397
+ npx jdi-cli doctor --verbose
398
+ ```
399
+
400
+ 1. Dependencies (git, bash detection)
401
+ 2. Runtimes installed (claude, copilot, antigravity, opencode)
402
+ 3. Optional tooling (ctx7, gh CLI)
403
+ 4. JDI repo integrity (`core/`)
404
+ 5. Adapters built (`runtimes/`)
405
+ 6. Current project (`.jdi/` files)
406
+ 7. Runtime installed in project
407
+ 8. Git hooks configured
408
+ 9. Working tree clean
409
+ 10. Playwright + MCP status (all 4 CLIs)
410
+ 11. Caveman plugin status (user vs project scope)
411
+ 12. Specialists (single vs multi-stack, reviewer chain length)
412
+
413
+ ## Update
414
+
415
+ Dedicated command — detects installed runtimes, overwrites runtime files, preserves state, offers to regenerate specialists if templates changed:
416
+
417
+ ```bash
418
+ cd /path/to/your/project
419
+ npx jdi-cli@latest update
420
+ ```
421
+
422
+ Preview without applying:
423
+
424
+ ```bash
425
+ npx jdi-cli@latest update --dry-run
426
+ ```
427
+
428
+ Force specialists regen (no prompt):
429
+
430
+ ```bash
431
+ npx jdi-cli@latest update --force-specialists
432
+ ```
433
+
434
+ Skip specialists regen even if template changed:
435
+
436
+ ```bash
437
+ npx jdi-cli@latest update --skip-specialists
438
+ ```
439
+
440
+ **What update touches:**
441
+ - Overwrites agents, commands, skills in detected runtimes
442
+ - Preserves `.jdi/PROJECT.md`, `DECISIONS.md`, `ROADMAP.md`, `STATE.md`, `phases/`, `registry.md`
443
+ - Preserves custom config (`opencode.jsonc`, `settings.json`)
444
+ - Updates `.jdi/VERSION`
445
+ - Detects old specialists (without `<skills_to_load>`) and offers `/jdi-bootstrap` regen
446
+
447
+ **What update does NOT touch:**
448
+ - `@playwright/test` (run `jdi install-playwright` to refresh)
449
+ - Chromium browser
450
+ - MCP configs in `.claude/settings.local.json` / `.opencode/opencode.jsonc` / `.vscode/mcp.json` / `~/.gemini/settings.json`
451
+ - Caveman plugin (run `jdi install-caveman --force` to refresh)
452
+
453
+ ## Uninstall
454
+
455
+ ```bash
456
+ cd /path/to/your/project
457
+ npx jdi-cli@latest uninstall # all detected runtimes, preserves .jdi/
458
+ npx jdi-cli@latest uninstall claude # one runtime
459
+ npx jdi-cli@latest uninstall opencode --scope user
460
+ npx jdi-cli@latest uninstall --dry-run # preview
461
+ npx jdi-cli@latest uninstall --yes # skip prompts
462
+ npx jdi-cli@latest uninstall --purge --yes # DESTRUCTIVE: also wipe .jdi/
463
+ ```
464
+
465
+ `--purge` permanently deletes locked decisions. Back up `.jdi/DECISIONS.md` and `.jdi/ROADMAP.md` first if relevant.
466
+
467
+ Manual fallback:
468
+ ```bash
469
+ rm -rf .claude/ .github/ .gemini/antigravity/ .opencode/ .githooks/ CLAUDE.md AGENTS.md
470
+ # .jdi/ separate — destructive
471
+ rm -rf .jdi/
472
+ ```
473
+
474
+ ## Agents inventory
475
+
476
+ **Core (6 — shipped):**
477
+
478
+ | Agent | Model | Role |
479
+ |---|---|---|
480
+ | `jdi-researcher` | Opus | Greenfield discovery — spawned by `/jdi-new` |
481
+ | `jdi-adopter` | Opus | Brownfield discovery — spawned by `/jdi-adopt` |
482
+ | `jdi-bootstrap` | Sonnet | Wrapper that generates specialists |
483
+ | `jdi-asker` | Sonnet | Adaptive question loop (CONTEXT.md) |
484
+ | `jdi-planner` | Opus | Decompose phase into tasks + waves |
485
+ | `jdi-architect` | Opus | Meta (create + specialist modes) |
486
+
487
+ **Per-project (generated by `/jdi-bootstrap`):**
488
+
489
+ | Agent | Model | Role |
490
+ |---|---|---|
491
+ | `jdi-doer-{slug}` | Sonnet | Executor — knows stack, conventions, test framework |
492
+ | `jdi-reviewer-{slug}` | Sonnet | Read-only gates (build/test/coverage/lint/security/UI) |
493
+
494
+ Every flow agent has access to web tools (WebSearch, WebFetch, MCP `context7`) for on-demand research. Limits per agent — see each agent's `<research_tools>` block.
495
+
496
+ ## Skills inventory
497
+
498
+ **Universal programming principles (auto-loaded by doer + reviewer):**
499
+
500
+ | Skill | What |
501
+ |---|---|
502
+ | `dry` | Don't Repeat Yourself — knowledge duplication vs code coincidence, rule of three |
503
+ | `kiss` | Keep It Simple — anti over-engineering, complexity must pay its cost |
504
+ | `yagni` | You Aren't Gonna Need It — no speculative code, generalize after 3rd case |
505
+ | `solid` | SRP/OCP/LSP/ISP/DIP with detection heuristics |
506
+ | `clean-code` | Intentional names, small functions, explicit error handling, classic smells |
507
+
508
+ **Frontend-conditional (auto-loaded if `has_frontend: true`):**
509
+
510
+ | Skill | What |
511
+ |---|---|
512
+ | `frontend-rules` | WCAG 2.2 AA + UX checklist, framework-agnostic |
513
+ | `frontend-validator` | Gate 7 — Playwright + axe-core live validation |
514
+
515
+ See [AGENTS.md](AGENTS.md) for full details.
516
+
517
+ ## Commands inventory
518
+
519
+ **Main loop (7):**
520
+
521
+ | Command | Args | Flags | Purpose |
522
+ |---|---|---|---|
523
+ | `/jdi-new <description>` | description (optional) | `--reset` (wipes `.jdi/` first, asks confirm) | Greenfield entry: researcher + PROJECT.md + ROADMAP.md |
524
+ | `/jdi-bootstrap` | — | — (idempotent: prompts Recreate/Keep/Cancel if specialists exist) | Generate doer + reviewer per project. Multi-stack opt-in via interactive question |
525
+ | `/jdi-discuss <N>` | phase number | — | Adaptive question loop → CONTEXT.md |
526
+ | `/jdi-plan <N>` | phase number | `--review` (preview PLAN.md before save, ask approve/edit/cancel) | Decompose phase into tasks + waves → PLAN.md |
527
+ | `/jdi-do <N>` | phase number | `--sequential` (force sequential execution even if waves permit parallel) | Execute tasks via doer specialist(s) → SUMMARY.md |
528
+ | `/jdi-verify <N>` | phase number | — | Run reviewer specialist gates → REVIEW.md (verdict APPROVED / APPROVED_WITH_WARNINGS / BLOCKED) |
529
+ | `/jdi-ship <N>` | phase number | — | Update ROADMAP, advance phase. Gates: verdict must not be BLOCKED |
530
+
531
+ **Brownfield entry (1):**
532
+
533
+ | Command | Args | Flags | Purpose |
534
+ |---|---|---|---|
535
+ | `/jdi-adopt <description>` | description (optional override; defaults to README/inferred) | — | Scan existing repo, infer stack/code-design, confirm with user, mark `adopted: true` + D-2 boundary commit |
536
+
537
+ **Ralph mode (1):**
538
+
539
+ | Command | Args | Flags | Purpose |
540
+ |---|---|---|---|
541
+ | `/jdi-loop <N>` | phase number | `--max-iter=N` (default 5), `--max-resets=N` (default 3) | Auto-iterate `/jdi-do` ↔ `/jdi-verify` until APPROVED. Oscillation detection, human gate between rounds |
542
+
543
+ **Meta (1, contributors only):**
544
+
545
+ | Command | Args | Flags | Purpose |
546
+ |---|---|---|---|
547
+ | `/jdi-create <description>` | description (optional) | — | Generate new generic agent/skill in `core/`. For contributors editing JDI source, not consumers |
548
+
549
+ See [COMMANDS.md](COMMANDS.md) for full details.
550
+
551
+ ### Adding a specialist mid-project
552
+
553
+ `/jdi-bootstrap` is idempotent but its current "Recreate" mode wipes ALL specialists and regenerates. There is no `--add` mode yet (planned). To add a specialist to an existing multi-stack project today:
554
+
555
+ **Option A — Re-run bootstrap (nukes manual edits):**
556
+
557
+ ```
558
+ /jdi-bootstrap
559
+ ```
560
+
561
+ When asked "Specialist already exists. Recreate / Keep / Cancel?":
562
+ 1. Pick **Recreate**
563
+ 2. At the multi-stack question, pick the new total count (e.g. was single → now "Multi 2 pairs")
564
+ 3. Provide `stack_label` + `file_glob` for each (existing + new)
565
+
566
+ **Caveat:** any hand-edits in `.jdi/agents/jdi-doer-{slug}.md` or `jdi-reviewer-{slug}.md` get overwritten. If you have customizations, back them up first.
567
+
568
+ **Option B — Manual edit (preserves customizations):**
569
+
570
+ 1. Copy an existing specialist as a template:
571
+ ```bash
572
+ cp .jdi/agents/jdi-doer-myapp.md .jdi/agents/jdi-doer-myapp-newstack.md
573
+ cp .jdi/agents/jdi-reviewer-myapp.md .jdi/agents/jdi-reviewer-myapp-newstack.md
574
+ ```
575
+ 2. Edit both:
576
+ - Rename inside `name:` and references
577
+ - Update `scope.file_glob` + `scope.stack_label` frontmatter
578
+ - Update `<role>` block (stack scope + STACK + TEST_FRAMEWORK + COVERAGE_MIN)
579
+ - Update build/test/lint/coverage commands in reviewer gates
580
+ 3. Append rows to `.jdi/specialists.md` and `.jdi/reviewers.md`:
581
+ ```markdown
582
+ | NewStack | jdi-doer-myapp-newstack | **/*.{ext1,ext2} | executor for files matching glob |
583
+ | jdi-reviewer-myapp-newstack | **/*.{ext1,ext2} | /jdi-verify | yes, if BLOCKED |
584
+ ```
585
+ 4. Append to `.jdi/registry.md` (audit trail):
586
+ ```markdown
587
+ ## R-{N+1} ({date})
588
+ **Type:** specialist (doer + reviewer, manual add)
589
+ **Slug:** myapp-newstack
590
+ **Stack:** NewStack
591
+ ```
592
+ 5. Commit:
593
+ ```bash
594
+ git add .jdi/agents/ .jdi/specialists.md .jdi/reviewers.md .jdi/registry.md
595
+ git commit -m "chore(jdi): add NewStack specialist (manual)"
596
+ ```
597
+
598
+ From the next `/jdi-plan`, the new specialist routes automatically based on its glob.
599
+
600
+ **Option C — Wait for `/jdi-bootstrap --add`** (planned next minor):
601
+
602
+ ```
603
+ /jdi-bootstrap --add # asks 1 new specialist only, preserves existing
604
+ ```
605
+
606
+ ## Runtimes supported
607
+
608
+ | Runtime | Tier | npx install |
609
+ |---|---|---|
610
+ | Claude Code | tier 1 | `npx jdi-cli install claude` |
611
+ | GitHub Copilot | tier 1 | `npx jdi-cli install copilot` |
612
+ | OpenCode | tier 1 | `npx jdi-cli install opencode` |
613
+ | Google Antigravity | tier 2 | `npx jdi-cli install antigravity --scope user` |
614
+ | All | — | `npx jdi-cli install all` |
615
+
616
+ Default scope: `project`. For user-scope global: `--scope user`.
617
+
618
+ **Power users (shell scripts direct, no Node):**
619
+
620
+ | Runtime | Bash | PowerShell |
621
+ |---|---|---|
622
+ | Claude | `jdi-install.sh claude` | `jdi-install.ps1 -Runtime claude` |
623
+ | OpenCode | `jdi-install.sh opencode --scope user` | `jdi-install.ps1 -Runtime opencode -Scope user` |
624
+
625
+ See [PORTABILITY.md](PORTABILITY.md) for per-runtime mapping details.
626
+
627
+ ## Power users — shell scripts direct
628
+
629
+ For containers, minimal environments, or no-Node setups:
630
+
631
+ ```bash
632
+ git clone https://github.com/slipalison/jdi-cli.git
633
+ cd jdi-cli
634
+
635
+ # Build adapters
636
+ ./bin/jdi-build.sh # Linux/Mac
637
+ .\bin\jdi-build.ps1 # Windows
638
+
639
+ # Install in your project
640
+ cd /path/to/your/project
641
+ /path/to/jdi-cli/bin/jdi-install.sh claude --scope project
642
+ # Windows: C:\path\to\jdi-cli\bin\jdi-install.ps1 -Runtime claude -Scope project
643
+ ```
644
+
645
+ **Windows note:** if PowerShell blocks `.ps1`:
646
+ ```powershell
647
+ Set-ExecutionPolicy -Scope CurrentUser RemoteSigned
648
+ # Or per-call:
649
+ pwsh -ExecutionPolicy Bypass -File .\bin\jdi-build.ps1
650
+ ```
651
+
652
+ ## Philosophy
653
+
654
+ 1. **Fresh context per agent** — each spawn has a clean window
655
+ 2. **Thin orchestrator** — commands load context, spawn agent, route
656
+ 3. **File-based state** — `.jdi/` in md/json, no DB
657
+ 4. **Locked decision = immutable** — D-XX never reverses
658
+ 5. **1 task = 1 atomic commit**
659
+ 6. **Per-project specialists** — doer/reviewer customized, not generic
660
+ 7. **Wave-based parallelism** — parallel within wave, sequential between
661
+ 8. **Security > Performance > Best Practices** (declared invariant)
662
+
663
+ ## Conventions
664
+
665
+ - **Conventional Commits** everywhere. Per-task atomic commits during `/jdi-do`. Orchestrator writes final `chore(state): phase {N} executed`
666
+ - **Code + prompts + docs in English** (was pt-BR before v1.8)
667
+ - Default coverage gate: **80%** unless `PROJECT.md` overrides
668
+ - Adopted brownfield projects enforce coverage only on files created AFTER D-2 boundary commit
669
+ - Git hooks ship as **no-op** — reviewer covers quality gates, users opt-in to hooks themselves
670
+ - Conventional Commits scope = phase slug
671
+
672
+ ## Reset (full wipe + restart)
673
+
674
+ ```
675
+ /jdi-new --reset "<new description>"
676
+ ```
677
+
678
+ Deletes `.jdi/` after confirmation. Recreates from scratch. **CAUTION** — loses DECISIONS.md, ROADMAP.md, etc.
679
+
680
+ ## Troubleshooting
681
+
682
+ ### Build script fails on Linux/Mac
683
+
684
+ Check deps: `bash --version`, `awk --version`, `sed --version`. Use bash >= 4.
685
+
686
+ ### Windows: .sh scripts don't run in PowerShell
687
+
688
+ Use the `.ps1` equivalents:
689
+ - `bin/jdi-build.sh` → `bin/jdi-build.ps1`
690
+ - `bin/jdi-install.sh` → `bin/jdi-install.ps1`
691
+ - `bin/jdi-doctor.sh` → `bin/jdi-doctor.ps1`
692
+
693
+ Or run via Git Bash / WSL.
694
+
695
+ ### Windows: PowerShell blocks .ps1 execution
696
+
697
+ ```powershell
698
+ Set-ExecutionPolicy -Scope CurrentUser RemoteSigned
699
+ # OR
700
+ pwsh -ExecutionPolicy Bypass -File .\bin\jdi-build.ps1
701
+ ```
702
+
703
+ After download, may need `Unblock-File`:
704
+ ```powershell
705
+ Get-ChildItem .\bin\*.ps1 | Unblock-File
706
+ ```
707
+
708
+ ### Windows: git hooks don't fire
709
+
710
+ Hooks are bash scripts. Windows needs Git for Windows (ships `bash.exe`). Without it, hooks are silently ignored.
711
+
712
+ JDI default: hooks are no-op. If you don't customize, this blocks nothing.
713
+
714
+ ### Slash command doesn't appear in runtime
715
+
716
+ ```bash
717
+ ls .claude/commands/ # or .github/prompts/, .opencode/commands/
718
+ ```
719
+
720
+ If empty, reinstall:
721
+ ```bash
722
+ npx jdi-cli install <runtime> --scope project
723
+ ```
724
+
725
+ ### Specialist not generated by /jdi-bootstrap
726
+
727
+ Check `PROJECT.md` has stack + code-design. Edit manually if missing, then re-run bootstrap (idempotent — prompts before overwrite):
728
+ ```
729
+ /jdi-bootstrap
730
+ ```
731
+
732
+ ### Phase BLOCKED in /jdi-verify, can't /jdi-ship
733
+
734
+ REVIEW.md lists blockers. Fix code, run `/jdi-do <N>` again (re-executes affected tasks), then `/jdi-verify <N>`. When verdict != BLOCKED, ship unblocks.
735
+
736
+ ### Token budget too high in large phase
737
+
738
+ PLAN.md with >8 tasks indicates phase is too large. Split:
739
+ 1. Edit ROADMAP.md, split current phase into 2 or 3
740
+ 2. Run `/jdi-discuss <N>` for each (smaller CONTEXT.md each)
741
+
742
+ ### MCP playwright doesn't appear after install
743
+
744
+ Restart the runtime. For Claude Code: `/mcp` to verify. For OpenCode: `opencode reload`. For Copilot: VS Code palette `MCP: List Servers`. For Antigravity: restart Antigravity.
745
+
746
+ ## See also
747
+
748
+ - [ARCHITECTURE.md](ARCHITECTURE.md) — technical overview
749
+ - [AGENTS.md](AGENTS.md) — agents detailed
750
+ - [COMMANDS.md](COMMANDS.md) — commands detailed
751
+ - [MEMORY.md](MEMORY.md) — `.jdi/` schema
752
+ - [EXTENSION.md](EXTENSION.md) — create specialists/agents/skills
753
+ - [CREATE.md](CREATE.md) + [CREATE-EXAMPLE.md](CREATE-EXAMPLE.md) — `/jdi-create` walkthrough
754
+ - [PORTABILITY.md](PORTABILITY.md) — multi-runtime details
755
+
756
+ ## License
757
+
758
+ MIT.
759
+
760
+ ## Contributing
761
+
762
+ Run `/jdi-create` inside the JDI source repo to add generic agents/skills. It runs against `core/templates/{agent,skill}.md` with automatic integration.
763
+
764
+ Pull requests: describe the problem (who needs this? how many users?) before adding a new agent. JDI grows **carefully** — soft cap: 6 core agents, 25 core skills. See [EXTENSION.md](EXTENSION.md).
765
+
766
+ ## Publishing to npm (maintainers)
767
+
768
+ Push a `v*.*.*` tag and GitHub Actions handles the rest (`.github/workflows/npm-publish.yml`):
769
+
770
+ ```bash
771
+ # 1. Bump version in package.json
772
+ # 2. Rebuild runtimes/
773
+ node bin/jdi.js build
774
+
775
+ # 3. Commit + push main
776
+ git add -A && git commit -m "chore(release): X.Y.Z"
777
+ git push origin main
778
+
779
+ # 4. Tag + push tag (triggers workflow)
780
+ git tag -a vX.Y.Z -m "vX.Y.Z — short description"
781
+ git push origin vX.Y.Z
782
+
783
+ # 5. Watch
784
+ gh run watch
785
+ ```
786
+
787
+ Workflow verifies tag matches `package.json`, runs `npm publish --provenance --access public`. Provenance badge appears on the npm page via sigstore OIDC.
788
+
789
+ `package.json` `files:` controls what ships in the tarball.