██╗██████╗ ██╗
██║██╔══██╗██║
██║██║ ██║██║
██ ██║██║ ██║██║
╚█████╔╝██████╔╝██║
╚════╝ ╚═════╝ ╚═╝
◄══════════════════════════════════════════════|=|◉|=|/////|==
◄══════════════════════════════════════════════|=|◉|=|/////|==
◄══════════════════════════════════════════════|=|◉|=|/////|==
Cut through the chaos. Ship the work. [Just do it]
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.
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:
- 6 core agents + 2 per-project (doer + reviewer, generated by
/jdi-bootstrap) - 10 commands in a fixed loop + ralph mode + brownfield entry + meta
- File-based state in
.jdi/(Markdown + frontmatter, no DB) - Multi-runtime: Claude Code, GitHub Copilot, Google Antigravity, OpenCode
- Zero runtime deps — Node stdlib only
- Brownfield supported — adopt existing projects, not just greenfield
- Multi-stack — N specialist pairs with file-glob routing (e.g. backend C# + frontend React)
- Optional MCP — one-shot Playwright MCP install across all 4 CLIs
Every phase command accepts either a slug (auth-flow, canonical) or an integer position (2, display ordering). Slugs are stable across branch merges; positions are not. New phases default to slug-as-ID; legacy NN-slug projects keep working until you opt into /jdi-migrate-phases.
/jdi-new "<short description>" <- research + PROJECT.md + ROADMAP.md (schema v2)
/jdi-bootstrap <- doer + reviewer per project
/jdi-discuss <slug|position> <- capture locked decisions (CONTEXT.md)
/jdi-plan <slug|position> <- decompose into tasks + waves (PLAN.md)
/jdi-do <slug|position> <- execute via doer specialist (SUMMARY.md)
/jdi-verify <slug|position> <- gates via reviewer (REVIEW.md)
/jdi-ship <slug|position> <- update ROADMAP, advance phase
# Roadmap mutation (run anytime, multi-developer safe)
/jdi-add-phase "<name>" [--slug s] [--before <slug>|--after <slug>]
/jdi-remove-phase <slug|position> [--force]
# v0/v1 → v2 migration (one-time, non-destructive)
/jdi-migrate-phases [--dry-run] <- adds schema_version: 2 + phases.json
# Continuity / where did I stop?
/jdi-status <- compact snapshot: phase + last action + next step
/jdi-adopt <- scan repo, infer stack/code-design, confirm with user
/jdi-bootstrap <- doer + reviewer (adopted-aware: coverage only on new files)
/jdi-discuss <slug|position> <- ... same as greenfield from here
/jdi-plan <slug|position>
/jdi-do <slug|position>
/jdi-verify <slug|position>
/jdi-ship <slug|position>
/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.
Instead of manually running /jdi-do then /jdi-verify, use:
/jdi-loop <slug|position>
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.
cd /path/to/your/project
npx jdi-cli@latest install opencodeDone. Swap opencode for claude, copilot, antigravity, or all depending on your active runtime.
No
cdfirst?npxruns in the current directory. Always confirm withpwd(Linux/Mac) orGet-Location(Windows).
- Node.js 18+ (for
npx) - git
- At least one runtime: Claude Code, GitHub Copilot, Antigravity, or OpenCode
Quick reference of every flag per subcommand:
| Flag | Values | Default | Purpose |
|---|---|---|---|
--scope / -s |
user | project |
project |
project writes .claude//.opencode//etc into the project; user writes to ~/.claude/, ~/.config/opencode/, ~/.gemini/antigravity/ |
--no-color |
flag | false | Disable ANSI colors |
npx jdi-cli@latest install claude
npx jdi-cli@latest install copilot
npx jdi-cli@latest install antigravity --scope user
npx jdi-cli@latest install opencode
npx jdi-cli@latest install all # all 4 runtimes at once| Flag | Values | Default | Purpose |
|---|---|---|---|
--skip-browser |
flag | false | Skip npx playwright install chromium (~170MB) |
--skip-mcp |
flag | false | Only install dep + browser, skip injecting MCP configs |
--runtime |
claude | opencode | copilot | antigravity | all |
all |
Limit MCP injection to one runtime |
--antigravity-scope |
user | project |
user |
~/.gemini/settings.json vs .gemini/settings.json |
Injects MCP into all 4 detected runtimes (see Playwright section above for paths).
npx jdi-cli@latest install-playwright
npx jdi-cli@latest install-playwright --skip-browser
npx jdi-cli@latest install-playwright --runtime claude
npx jdi-cli@latest install-playwright --runtime copilot
npx jdi-cli@latest install-playwright --skip-mcp # just dep + browser
npx jdi-cli@latest install-playwright --antigravity-scope project| Flag | Values | Default | Purpose |
|---|---|---|---|
--repo |
git URL | https://github.com/JuliusBrussee/caveman.git |
Override caveman source repo (fork support) |
--scope |
user | project |
user |
~/.claude/plugins/caveman/ vs .claude/plugins/caveman/ |
--force |
flag | false | Overwrite existing install without prompt |
npx jdi-cli@latest install-caveman # user scope, default repo
npx jdi-cli@latest install-caveman --scope project
npx jdi-cli@latest install-caveman --repo https://github.com/forked/caveman.git --force| Flag | Values | Default | Purpose |
|---|---|---|---|
--dry-run |
flag | false | Show what would change without applying |
--force-specialists |
flag | false | Regenerate specialists without asking (assumes Yes) |
--skip-specialists |
flag | false | Leave specialists alone even if template changed |
npx jdi-cli@latest update
npx jdi-cli@latest update --dry-run
npx jdi-cli@latest update --force-specialists
npx jdi-cli@latest update --skip-specialistsUpdate does NOT refresh Playwright dep, MCP configs, or Caveman plugin. Re-run their respective subcommands to refresh.
| Flag | Values | Default | Purpose |
|---|---|---|---|
--scope |
user | project | both |
both |
Limit removal scope |
--dry-run |
flag | false | Preview without applying |
--yes |
flag | false | Skip all interactive prompts |
--purge |
flag | false | DESTRUCTIVE: also wipe .jdi/ (locked decisions lost) |
npx jdi-cli@latest uninstall # all detected runtimes, preserves .jdi/
npx jdi-cli@latest uninstall claude
npx jdi-cli@latest uninstall opencode --scope user
npx jdi-cli@latest uninstall --dry-run # preview
npx jdi-cli@latest uninstall --yes # skip prompts
npx jdi-cli@latest uninstall --purge --yes # WIPE EVERYTHING including .jdi/| Flag | Values | Default | Purpose |
|---|---|---|---|
--verbose / -v |
flag | false | Show note-level (debug) lines |
npx jdi-cli@latest doctor
npx jdi-cli@latest doctor --verboseNo flags. Used inside the JDI source repo after editing core/.
npx jdi-cli@latest buildnpx jdi-cli@latest --version
npx jdi-cli@latest helpUse
@latestto force a fresh pull from npm. Without it,npxmay use a cached older version.
npm i -g jdi-cli
jdi install opencode
jdi doctorAfter that, jdi works without npx.
npx jdi-cli install-playwright does three things:
- Installs
@playwright/testas devDependency (detects pnpm/yarn/bun/npm via lockfile) - Installs Chromium browser (
npx playwright install chromium, ~170MB) — skippable with--skip-browser - Injects Playwright MCP server config into all detected runtimes:
| CLI | MCP config path |
|---|---|
| Claude Code | .claude/settings.local.json (mcpServers.playwright) |
| OpenCode | .opencode/opencode.jsonc (mcp.playwright) |
| GitHub Copilot (VS Code) | .vscode/mcp.json (servers.playwright) |
| Antigravity (Google) | ~/.gemini/settings.json user-scope OR .gemini/settings.json project-scope (mcpServers.playwright) |
Idempotent: skips dep if already in package.json, skips MCP entry if already present.
Restart your runtime to load the MCP after install.
If frontend.has_frontend: true is set in PROJECT.md, /jdi-bootstrap will offer this install interactively (step S9).
npx jdi-cli install-caveman clones the Caveman plugin into:
- User scope (default):
~/.claude/plugins/caveman/ - Project scope:
.claude/plugins/caveman/
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.
After install, restart Claude Code. Toggle with /caveman lite|full|ultra or disable with stop caveman.
/jdi-bootstrap offers this install interactively (step S9.5, project-agnostic).
If your project has a web interface, JDI activates an extra set of UI/UX-focused gates. Detection runs against:
package.jsonfor React, Vue, Svelte, Solid, Angular, Astro, Next, Nuxt, Remix, SvelteKit, Qwik, Preact- Razor/Blazor (
*.razor,*.cshtml) - Django/Flask templates (
templates/*.html) - Rails (
app/views/*.erb) - Laravel (
resources/views/*.blade.php) - Plain
index.html
Skill frontend-rules — universal UI/UX checklist (WCAG 2.2 AA + Nielsen + Material/Apple HIG). Framework-agnostic. Covers:
- Accessibility (contrast 4.5:1, focus visible, keyboard nav, ARIA, semantic HTML, touch targets, labels)
- Mandatory states (loading / empty / error / success / disabled)
- Forms (validation, autocomplete, inputmode, password toggle, destructive confirmations)
- Performance UX (CLS < 0.1, LCP < 2.5s, INP < 200ms, optimistic UI)
- Mobile-first responsive
- i18n + l10n + RTL
- UI security (token never in localStorage, CSP, CSRF,
target=_blankwith noopener) - BLOCK-level anti-patterns table with WCAG rule citations
Doer applies it before writing code. Reviewer uses it as a gate 5 checklist.
Skill frontend-validator — gate 7 of the reviewer. Runs Playwright + axe-core in a real browser:
- Detects Playwright. If absent, asks before installing (4 options: Chromium / all browsers / skip gate 7 / cancel review)
- Detects package manager via lockfile
- Spawns your dev server, waits for ready (60s poll timeout)
- Per critical route × mobile (375×667) + desktop (1280×720):
- Captures console errors
- Captures network failures (4xx, 5xx, requestfailed)
- Runs axe-core (WCAG 2.0/2.1/2.2 AA + best-practices)
- Detects horizontal scroll
- Fullpage screenshot
- Kills dev server (always, even on error)
- JSON output in
.jdi/cache/ui-findings.json
| Finding | Severity |
|---|---|
| Console error on any route | BLOCK |
| Network 5xx on critical route | BLOCK |
A11y violation critical or serious |
BLOCK |
| Horizontal scroll on mobile | BLOCK |
A11y violation moderate, network 4xx |
WARN |
A11y violation minor, scroll on desktop |
INFO |
| Dev server timeout | INCONCLUSIVE (warn) |
| User declined Playwright install | SKIPPED (warn) |
Never BLOCK on technical failure — only on real findings. .jdi/cache/ is auto-gitignored.
You do nothing. When you run /jdi-bootstrap in a project with UI:
- Auto-detect fires
- Bootstrap asks: "Detected React in
package.json. Confirm frontend?" - If yes, 3 extra questions: dev server command (default per framework), frontend URL (default per framework), critical paths (default
/) - Persists
frontend:section inPROJECT.md - Injects
<skills_to_load>into doer + reviewer
From then on, /jdi-do loads frontend-rules when a task touches UI files; /jdi-verify runs gate 7 with Playwright.
Edit PROJECT.md:
frontend:
has_frontend: falseGate 7 returns SKIPPED. Skill does not load.
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:
Bootstrap asks: "Project stack count?"
- Single (1 specialist pair)
- Multi (2 pairs — e.g. backend + frontend)
- Multi (3 pairs — e.g. backend + frontend + infra)
- Multi (custom count)
For each specialist, you provide a stack_label + file_glob:
| Specialist | Stack label | File glob |
|---|---|---|
| 1 | Backend C# | **/*.{cs,csproj,sln} |
| 2 | Frontend React | **/*.{ts,tsx,jsx,css,scss} |
| 3 | Infra Terraform | **/*.{tf,tfvars} |
.jdi/specialists.md+.jdi/reviewers.mdget one row per pair (schema v2 addsFile globcolumn)/jdi-planmatches each task'sfiles_modifiedagainst globs and auto-assigns a specialist per task. Tasks spanning 2+ globs auto-split into sub-tasks/jdi-doreadstask.specialistfrom PLAN.md and spawns the right doer per task. Within a wave, different tasks may spawn different specialists in parallel (disjoint scopes)/jdi-verifychains 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)
Single-stack projects (1 row) stay unchanged — backward compatible.
your-project/
├── .jdi/ # state files (generated by JDI commands)
│ ├── PROJECT.md # vision, stack, code-design (LOCKED after /jdi-new or /jdi-adopt)
│ ├── ROADMAP.md # phases list (greenfield: MVP features, adopted: new features)
│ ├── STATE.md # schema_version, current_phase_slug, current_phase, adopted flag, next step
│ ├── DECISIONS.md # append-only (v1: D-1, D-2, ...; v2: D-YYYY-MM-DD-slug-seq — multi-dev safe)
│ ├── VERSION # JDI version installed
│ ├── specialists.md # registry of doer specialists
│ ├── reviewers.md # registry of reviewer specialists
│ ├── registry.md # append-only audit trail of specialist creation
│ ├── phases.json # v2 only: manifest mapping position <-> slug (legacy folders flagged)
│ ├── agents/ # per-project specialists
│ │ ├── jdi-doer-{slug}.md
│ │ └── jdi-reviewer-{slug}.md
│ ├── phases/
│ │ ├── <slug>/ # v2 layout (default for new projects)
│ │ │ ├── CONTEXT.md # from /jdi-discuss
│ │ │ ├── PLAN.md # from /jdi-plan
│ │ │ ├── SUMMARY.md # from /jdi-do
│ │ │ ├── REVIEW.md # from /jdi-verify (verdict)
│ │ │ └── LOOP.md # only if /jdi-loop ran (ralph state)
│ │ └── NN-<slug>/ # v1 legacy layout — NEVER renamed (preserves git history)
│ └── cache/ # gitignored — gate 7 artifacts (screenshots, JSON findings)
├── .claude/ # (if runtime=claude)
│ ├── agents/jdi-*.md
│ ├── commands/jdi-*.md
│ └── settings.example.json
├── .githooks/ # no-op by default
├── .gitattributes # normalizes CRLF
├── CLAUDE.md # runtime instructions
└── {your code}
For other runtimes, swap .claude/ for .github/, .gemini/antigravity/, or .opencode/. See PORTABILITY.md.
PROJECT.mdis immutable after/jdi-newor/jdi-adoptDECISIONS.mdis append-only. Locked decisions never reverse. v1 usesD-1,D-2, …; v2 uses deterministicD-YYYY-MM-DD-slug-seq(collision-free across developer branches)registry.mdis append-only — audit trail- Phase slugs never change. Existing
NN-slug/folders are never renamed on migration. Numeric positions (### Phase 3) are display-only and may renumber on insert/remove - Every command is idempotent — re-running prompts before overwrite
- Reviewer is read-only by design (no Write/Edit). Doer is the only writer
| From | To | Gate |
|---|---|---|
/jdi-discuss |
/jdi-plan |
CONTEXT.md exists |
/jdi-plan |
/jdi-do |
PLAN valid (every task has files_modified, acceptance, dependencies, test, specialist) |
/jdi-do |
/jdi-verify |
SUMMARY.md exists |
/jdi-verify |
/jdi-ship |
REVIEW.md verdict ≠ BLOCKED |
Multiple developers can run JDI in parallel on the same project as long as the project is on schema v2.
The problem with v1 (numeric IDs):
- Phase identifier was the position in ROADMAP (
current_phase: 5). - Two developers on parallel branches both pick
total_phases + 1→ both create.jdi/phases/06-foo/and.jdi/phases/06-bar/→ silent collision on merge. D-Xdecision IDs andR-Xregistry entries had the same race.
How v2 fixes it:
- Phase identifier is a slug (
auth-flow,payments). Validated at creation: shape ([a-z][a-z0-9-]{2,39}, no--, no trailing-), reserved-word list (current,all,archive, …), uniqueness vs folders AND ROADMAP. - Folder layout becomes
.jdi/phases/<slug>/(noNN-prefix). Two developers picking different slugs produce disjoint folders — git merges cleanly. Two developers picking the same slug surface as an explicit git conflict, not a silent overwrite. ### Phase N:heading is display-only — may renumber when phases are inserted/removed without affecting slug references.DECISIONS.mdIDs become deterministic:D-{YYYY-MM-DD}-{phase_slug}-{seq}(collision-free across branches).- Commit scopes use slugs:
chore(payments): ...instead ofchore(NN-payments): ....
Recommended workflow with multiple developers:
git pull
/jdi-add-phase "<name>" --slug <unique-slug> # validator refuses duplicates locally
git push # if remote moved, pull/rebase first; slug collision (rare) is a real signalMigration from v1 (existing projects on numeric IDs):
/jdi-migrate-phases --dry-run # show audit + plan, write nothing
/jdi-migrate-phases # confirm, write schema_version: 2 + phases.json- Idempotent: re-running on a v2 project is a no-op.
- Non-destructive: existing
NN-slug/folders are NEVER renamed (git history references stay valid). New phases use slug-only folders. - Pre-flight audit checks folder/ROADMAP parity, duplicate canonical slugs, and slug shape — aborts with a named error before writing anything.
- Refuses when
.jdi/working tree is dirty (unless--force) so the migration commit stays auditable.
Both schemas coexist after migration — old folders keep working, new folders use the new layout. Every command accepts both ID forms (/jdi-do 2 and /jdi-do auth-flow resolve to the same phase).
Schema detection is automatic via STATE.md's schema_version field (1 or absent = v1; 2 = v2). The resolver (bin/lib/jdi-resolve-phase.{sh,ps1}) and validator (bin/lib/jdi-validate-slug.{sh,ps1}) ship in the npm package.
npx jdi-cli doctor
npx jdi-cli doctor --verbose- Dependencies (git, bash detection)
- Runtimes installed (claude, copilot, antigravity, opencode)
- Optional tooling (ctx7, gh CLI)
- JDI repo integrity (
core/) - Adapters built (
runtimes/) - Current project (
.jdi/files) - Runtime installed in project
- Git hooks configured
- Working tree clean
- Playwright + MCP status (all 4 CLIs)
- Caveman plugin status (user vs project scope)
- Specialists (single vs multi-stack, reviewer chain length)
Dedicated command — detects installed runtimes, overwrites runtime files, preserves state, offers to regenerate specialists if templates changed:
cd /path/to/your/project
npx jdi-cli@latest updatePreview without applying:
npx jdi-cli@latest update --dry-runForce specialists regen (no prompt):
npx jdi-cli@latest update --force-specialistsSkip specialists regen even if template changed:
npx jdi-cli@latest update --skip-specialistsWhat update touches:
- Overwrites agents, commands, skills in detected runtimes
- Preserves
.jdi/PROJECT.md,DECISIONS.md,ROADMAP.md,STATE.md,phases/,registry.md - Preserves custom config (
opencode.jsonc,settings.json) - Updates
.jdi/VERSION - Detects old specialists (without
<skills_to_load>) and offers/jdi-bootstrapregen
What update does NOT touch:
@playwright/test(runjdi install-playwrightto refresh)- Chromium browser
- MCP configs in
.claude/settings.local.json/.opencode/opencode.jsonc/.vscode/mcp.json/~/.gemini/settings.json - Caveman plugin (run
jdi install-caveman --forceto refresh)
cd /path/to/your/project
npx jdi-cli@latest uninstall # all detected runtimes, preserves .jdi/
npx jdi-cli@latest uninstall claude # one runtime
npx jdi-cli@latest uninstall opencode --scope user
npx jdi-cli@latest uninstall --dry-run # preview
npx jdi-cli@latest uninstall --yes # skip prompts
npx jdi-cli@latest uninstall --purge --yes # DESTRUCTIVE: also wipe .jdi/--purge permanently deletes locked decisions. Back up .jdi/DECISIONS.md and .jdi/ROADMAP.md first if relevant.
Manual fallback:
rm -rf .claude/ .github/ .gemini/antigravity/ .opencode/ .githooks/ CLAUDE.md AGENTS.md
# .jdi/ separate — destructive
rm -rf .jdi/Core (6 — shipped):
| Agent | Model | Role |
|---|---|---|
jdi-researcher |
Opus | Greenfield discovery — spawned by /jdi-new |
jdi-adopter |
Opus | Brownfield discovery — spawned by /jdi-adopt |
jdi-bootstrap |
Sonnet | Wrapper that generates specialists |
jdi-asker |
Sonnet | Adaptive question loop (CONTEXT.md) |
jdi-planner |
Opus | Decompose phase into tasks + waves |
jdi-architect |
Opus | Meta (create + specialist modes) |
Per-project (generated by /jdi-bootstrap):
| Agent | Model | Role |
|---|---|---|
jdi-doer-{slug} |
Sonnet | Executor — knows stack, conventions, test framework |
jdi-reviewer-{slug} |
Sonnet | Read-only gates (build/test/coverage/lint/security/UI) |
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.
Universal programming principles (auto-loaded by doer + reviewer):
| Skill | What |
|---|---|
dry |
Don't Repeat Yourself — knowledge duplication vs code coincidence, rule of three |
kiss |
Keep It Simple — anti over-engineering, complexity must pay its cost |
yagni |
You Aren't Gonna Need It — no speculative code, generalize after 3rd case |
solid |
SRP/OCP/LSP/ISP/DIP with detection heuristics |
clean-code |
Intentional names, small functions, explicit error handling, classic smells |
Frontend-conditional (auto-loaded if has_frontend: true):
| Skill | What |
|---|---|
frontend-rules |
WCAG 2.2 AA + UX checklist, framework-agnostic |
frontend-validator |
Gate 7 — Playwright + axe-core live validation |
See AGENTS.md for full details.
Main loop (7):
| Command | Args | Flags | Purpose |
|---|---|---|---|
/jdi-new <description> |
description (optional) | --reset (wipes .jdi/ first, asks confirm) |
Greenfield entry: researcher + PROJECT.md + ROADMAP.md |
/jdi-bootstrap |
— | — (idempotent: prompts Recreate/Keep/Cancel if specialists exist) | Generate doer + reviewer per project. Multi-stack opt-in via interactive question |
/jdi-discuss <slug|position> |
phase id (slug or int) | --auto (asker decides everything, no questions) |
Adaptive question loop → CONTEXT.md |
/jdi-plan <slug|position> |
phase id | --review (preview PLAN.md before save) |
Decompose phase into tasks + waves → PLAN.md |
/jdi-do <slug|position> |
phase id | --sequential (force sequential even if waves permit parallel) |
Execute tasks via doer specialist(s) → SUMMARY.md |
/jdi-verify <slug|position> |
phase id | — | Run reviewer gates → REVIEW.md (APPROVED / APPROVED_WITH_WARNINGS / BLOCKED) |
/jdi-ship <slug|position> |
phase id | — | Update ROADMAP, advance phase. Gates: verdict must not be BLOCKED |
/jdi-add-phase "<name>" |
phase name (required) | --goal "<text>", --slug <slug>, --before <slug> | --after <slug>, --reason "<text>". Legacy --at <pos> accepted on v1 only. |
Register a new phase in ROADMAP.md. Slug-as-ID — validates shape, reserved words, uniqueness. Multi-developer safe (slug collisions surface as git conflict). |
/jdi-remove-phase <slug|position> |
phase id (required) | --force (required if artifacts exist) |
Remove a future or pending phase. Refuses for done, current, or past phases. Archives existing artifacts to .jdi/archive/removed-<slug>/. Slugs of remaining phases are NEVER changed (display positions renumber). |
/jdi-migrate-phases |
— | --dry-run, --force (bypass clean-tree gate) |
Migrate a v1 project (numeric phase IDs, NN-slug/ folders) to v2 (slug-as-ID). Non-destructive — does NOT rename folders. Adds schema_version: 2 + .jdi/phases.json manifest. Idempotent. Required for safe multi-developer parallel /jdi-add-phase. |
/jdi-status |
— | — | Read-only snapshot. Prints schema, current phase (slug + position), status, verdict, last artifact, last commit, next step. No agent invoked. Safe anytime. |
Brownfield entry (1):
| Command | Args | Flags | Purpose |
|---|---|---|---|
/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 |
Ralph mode (1):
| Command | Args | Flags | Purpose |
|---|---|---|---|
/jdi-loop <slug|position> |
phase id | --max-iter=N (default 5), --max-resets=N (default 3) |
Auto-iterate /jdi-do ↔ /jdi-verify until APPROVED. Oscillation detection, human gate between rounds |
Meta (1, contributors only):
| Command | Args | Flags | Purpose |
|---|---|---|---|
/jdi-create <description> |
description (optional) | — | Generate new generic agent/skill in core/. For contributors editing JDI source, not consumers |
See COMMANDS.md for full details.
/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:
Option A — Re-run bootstrap (nukes manual edits):
/jdi-bootstrap
When asked "Specialist already exists. Recreate / Keep / Cancel?":
- Pick Recreate
- At the multi-stack question, pick the new total count (e.g. was single → now "Multi 2 pairs")
- Provide
stack_label+file_globfor each (existing + new)
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.
Option B — Manual edit (preserves customizations):
- Copy an existing specialist as a template:
cp .jdi/agents/jdi-doer-myapp.md .jdi/agents/jdi-doer-myapp-newstack.md cp .jdi/agents/jdi-reviewer-myapp.md .jdi/agents/jdi-reviewer-myapp-newstack.md
- Edit both:
- Rename inside
name:and references - Update
scope.file_glob+scope.stack_labelfrontmatter - Update
<role>block (stack scope + STACK + TEST_FRAMEWORK + COVERAGE_MIN) - Update build/test/lint/coverage commands in reviewer gates
- Rename inside
- Append rows to
.jdi/specialists.mdand.jdi/reviewers.md:| NewStack | jdi-doer-myapp-newstack | **/*.{ext1,ext2} | executor for files matching glob | | jdi-reviewer-myapp-newstack | **/*.{ext1,ext2} | /jdi-verify | yes, if BLOCKED |
- Append to
.jdi/registry.md(audit trail):## R-{N+1} ({date}) **Type:** specialist (doer + reviewer, manual add) **Slug:** myapp-newstack **Stack:** NewStack
- Commit:
git add .jdi/agents/ .jdi/specialists.md .jdi/reviewers.md .jdi/registry.md git commit -m "chore(jdi): add NewStack specialist (manual)"
From the next /jdi-plan, the new specialist routes automatically based on its glob.
Option C — Wait for /jdi-bootstrap --add (planned next minor):
/jdi-bootstrap --add # asks 1 new specialist only, preserves existing
| Runtime | Tier | npx install |
|---|---|---|
| Claude Code | tier 1 | npx jdi-cli install claude |
| GitHub Copilot | tier 1 | npx jdi-cli install copilot |
| OpenCode | tier 1 | npx jdi-cli install opencode |
| Google Antigravity | tier 2 | npx jdi-cli install antigravity --scope user |
| All | — | npx jdi-cli install all |
Default scope: project. For user-scope global: --scope user.
Power users (shell scripts direct, no Node):
| Runtime | Bash | PowerShell |
|---|---|---|
| Claude | jdi-install.sh claude |
jdi-install.ps1 -Runtime claude |
| OpenCode | jdi-install.sh opencode --scope user |
jdi-install.ps1 -Runtime opencode -Scope user |
See PORTABILITY.md for per-runtime mapping details.
For containers, minimal environments, or no-Node setups:
git clone https://github.com/slipalison/jdi-cli.git
cd jdi-cli
# Build adapters
./bin/jdi-build.sh # Linux/Mac
.\bin\jdi-build.ps1 # Windows
# Install in your project
cd /path/to/your/project
/path/to/jdi-cli/bin/jdi-install.sh claude --scope project
# Windows: C:\path\to\jdi-cli\bin\jdi-install.ps1 -Runtime claude -Scope projectWindows note: if PowerShell blocks .ps1:
Set-ExecutionPolicy -Scope CurrentUser RemoteSigned
# Or per-call:
pwsh -ExecutionPolicy Bypass -File .\bin\jdi-build.ps1- Fresh context per agent — each spawn has a clean window
- Thin orchestrator — commands load context, spawn agent, route
- File-based state —
.jdi/in md/json, no DB - Locked decision = immutable — D-XX never reverses
- 1 task = 1 atomic commit
- Per-project specialists — doer/reviewer customized, not generic
- Wave-based parallelism — parallel within wave, sequential between
- Security > Performance > Best Practices (declared invariant)
- Conventional Commits everywhere. Per-task atomic commits during
/jdi-do. Orchestrator writes finalchore(state): phase {slug} executed(v2; v1 legacy uses position) - Code + prompts + docs in English (was pt-BR before v1.8)
- Default coverage gate: 80% unless
PROJECT.mdoverrides - Adopted brownfield projects enforce coverage only on files created AFTER D-2 boundary commit
- Git hooks ship as no-op — reviewer covers quality gates, users opt-in to hooks themselves
- Conventional Commits scope = phase slug
/jdi-new --reset "<new description>"
Deletes .jdi/ after confirmation. Recreates from scratch. CAUTION — loses DECISIONS.md, ROADMAP.md, etc.
Check deps: bash --version, awk --version, sed --version. Use bash >= 4.
Use the .ps1 equivalents:
bin/jdi-build.sh→bin/jdi-build.ps1bin/jdi-install.sh→bin/jdi-install.ps1bin/jdi-doctor.sh→bin/jdi-doctor.ps1
Or run via Git Bash / WSL.
Set-ExecutionPolicy -Scope CurrentUser RemoteSigned
# OR
pwsh -ExecutionPolicy Bypass -File .\bin\jdi-build.ps1After download, may need Unblock-File:
Get-ChildItem .\bin\*.ps1 | Unblock-FileHooks are bash scripts. Windows needs Git for Windows (ships bash.exe). Without it, hooks are silently ignored.
JDI default: hooks are no-op. If you don't customize, this blocks nothing.
ls .claude/commands/ # or .github/prompts/, .opencode/commands/If empty, reinstall:
npx jdi-cli install <runtime> --scope projectCheck PROJECT.md has stack + code-design. Edit manually if missing, then re-run bootstrap (idempotent — prompts before overwrite):
/jdi-bootstrap
REVIEW.md lists blockers. Fix code, run /jdi-do <slug|position> again (re-executes affected tasks), then /jdi-verify <slug|position>. When verdict != BLOCKED, ship unblocks.
PLAN.md with >8 tasks indicates phase is too large. Split:
- Edit ROADMAP.md, split current phase into 2 or 3
- Run
/jdi-discuss <N>for each (smaller CONTEXT.md each)
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.
- ARCHITECTURE.md — technical overview
- AGENTS.md — agents detailed
- COMMANDS.md — commands detailed
- MEMORY.md —
.jdi/schema - EXTENSION.md — create specialists/agents/skills
- CREATE.md + CREATE-EXAMPLE.md —
/jdi-createwalkthrough - PORTABILITY.md — multi-runtime details
MIT.
Run /jdi-create inside the JDI source repo to add generic agents/skills. It runs against core/templates/{agent,skill}.md with automatic integration.
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.
Push a v*.*.* tag and GitHub Actions handles the rest (.github/workflows/npm-publish.yml):
# 1. Bump version in package.json
# 2. Rebuild runtimes/
node bin/jdi.js build
# 3. Commit + push main
git add -A && git commit -m "chore(release): X.Y.Z"
git push origin main
# 4. Tag + push tag (triggers workflow)
git tag -a vX.Y.Z -m "vX.Y.Z — short description"
git push origin vX.Y.Z
# 5. Watch
gh run watchWorkflow verifies tag matches package.json, runs npm publish --provenance --access public. Provenance badge appears on the npm page via sigstore OIDC.
package.json files: controls what ships in the tarball.