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.
- package/AGENTS.md +209 -0
- package/ARCHITECTURE.md +210 -0
- package/COMMANDS.md +241 -0
- package/CREATE-EXAMPLE.md +385 -0
- package/CREATE.md +315 -0
- package/EXTENSION.md +141 -0
- package/LICENSE +21 -0
- package/MEMORY.md +471 -0
- package/PORTABILITY.md +438 -0
- package/README.md +789 -0
- package/bin/git-hooks/post-commit +16 -0
- package/bin/git-hooks/pre-commit +21 -0
- package/bin/jdi-build.ps1 +381 -0
- package/bin/jdi-build.sh +332 -0
- package/bin/jdi-doctor.ps1 +403 -0
- package/bin/jdi-doctor.sh +400 -0
- package/bin/jdi-install-caveman.ps1 +97 -0
- package/bin/jdi-install-caveman.sh +99 -0
- package/bin/jdi-install-playwright.ps1 +319 -0
- package/bin/jdi-install-playwright.sh +284 -0
- package/bin/jdi-install.ps1 +154 -0
- package/bin/jdi-install.sh +132 -0
- package/bin/jdi-uninstall.ps1 +309 -0
- package/bin/jdi-uninstall.sh +264 -0
- package/bin/jdi-update.ps1 +215 -0
- package/bin/jdi-update.sh +209 -0
- package/bin/jdi.js +460 -0
- package/bin/lib/jdi-monitor.ps1 +66 -0
- package/bin/lib/jdi-monitor.sh +74 -0
- package/bin/lib/jdi-truncate.ps1 +96 -0
- package/bin/lib/jdi-truncate.sh +99 -0
- package/bin/lib/ui.js +197 -0
- package/core/agents/jdi-adopter.md +465 -0
- package/core/agents/jdi-architect.md +894 -0
- package/core/agents/jdi-asker.md +153 -0
- package/core/agents/jdi-bootstrap.md +247 -0
- package/core/agents/jdi-planner.md +254 -0
- package/core/agents/jdi-researcher.md +303 -0
- package/core/commands/jdi-adopt.md +155 -0
- package/core/commands/jdi-bootstrap.md +81 -0
- package/core/commands/jdi-create.md +80 -0
- package/core/commands/jdi-discuss.md +80 -0
- package/core/commands/jdi-do.md +200 -0
- package/core/commands/jdi-loop.md +315 -0
- package/core/commands/jdi-new.md +131 -0
- package/core/commands/jdi-plan.md +73 -0
- package/core/commands/jdi-ship.md +146 -0
- package/core/commands/jdi-verify.md +159 -0
- package/core/skills/clean-code/SKILL.md +261 -0
- package/core/skills/dry/SKILL.md +150 -0
- package/core/skills/frontend-rules/SKILL.md +386 -0
- package/core/skills/frontend-validator/SKILL.md +567 -0
- package/core/skills/kiss/SKILL.md +178 -0
- package/core/skills/solid/SKILL.md +281 -0
- package/core/skills/yagni/SKILL.md +207 -0
- package/core/templates/agent.md +72 -0
- package/core/templates/doer-specialist.md +216 -0
- package/core/templates/reviewer-specialist.md +405 -0
- package/core/templates/skill.md +66 -0
- package/package.json +70 -0
- package/runtimes/antigravity/agents.md +74 -0
- package/runtimes/antigravity/skills/clean-code/SKILL.md +252 -0
- package/runtimes/antigravity/skills/dry/SKILL.md +141 -0
- package/runtimes/antigravity/skills/frontend-rules/SKILL.md +376 -0
- package/runtimes/antigravity/skills/frontend-validator/SKILL.md +559 -0
- package/runtimes/antigravity/skills/jdi-adopt/SKILL.md +155 -0
- package/runtimes/antigravity/skills/jdi-adopter/SKILL.md +436 -0
- package/runtimes/antigravity/skills/jdi-architect/SKILL.md +872 -0
- package/runtimes/antigravity/skills/jdi-asker/SKILL.md +125 -0
- package/runtimes/antigravity/skills/jdi-asker/references/context-template.md +34 -0
- package/runtimes/antigravity/skills/jdi-asker/references/decision-format.md +19 -0
- package/runtimes/antigravity/skills/jdi-asker/scripts/find_phase_dir.sh +25 -0
- package/runtimes/antigravity/skills/jdi-bootstrap/SKILL.md +81 -0
- package/runtimes/antigravity/skills/jdi-create/SKILL.md +80 -0
- package/runtimes/antigravity/skills/jdi-discuss/SKILL.md +80 -0
- package/runtimes/antigravity/skills/jdi-discuss/scripts/run_command.sh +62 -0
- package/runtimes/antigravity/skills/jdi-do/SKILL.md +200 -0
- package/runtimes/antigravity/skills/jdi-loop/SKILL.md +315 -0
- package/runtimes/antigravity/skills/jdi-new/SKILL.md +131 -0
- package/runtimes/antigravity/skills/jdi-plan/SKILL.md +73 -0
- package/runtimes/antigravity/skills/jdi-planner/SKILL.md +225 -0
- package/runtimes/antigravity/skills/jdi-researcher/SKILL.md +274 -0
- package/runtimes/antigravity/skills/jdi-ship/SKILL.md +146 -0
- package/runtimes/antigravity/skills/jdi-verify/SKILL.md +159 -0
- package/runtimes/antigravity/skills/kiss/SKILL.md +169 -0
- package/runtimes/antigravity/skills/solid/SKILL.md +272 -0
- package/runtimes/antigravity/skills/yagni/SKILL.md +198 -0
- package/runtimes/claude/CLAUDE.md +91 -0
- package/runtimes/claude/agents/jdi-adopter.md +430 -0
- package/runtimes/claude/agents/jdi-architect.md +864 -0
- package/runtimes/claude/agents/jdi-asker.md +119 -0
- package/runtimes/claude/agents/jdi-bootstrap.md +213 -0
- package/runtimes/claude/agents/jdi-planner.md +221 -0
- package/runtimes/claude/agents/jdi-researcher.md +269 -0
- package/runtimes/claude/commands/jdi-adopt.md +155 -0
- package/runtimes/claude/commands/jdi-bootstrap.md +81 -0
- package/runtimes/claude/commands/jdi-create.md +80 -0
- package/runtimes/claude/commands/jdi-discuss.md +80 -0
- package/runtimes/claude/commands/jdi-do.md +200 -0
- package/runtimes/claude/commands/jdi-loop.md +315 -0
- package/runtimes/claude/commands/jdi-new.md +131 -0
- package/runtimes/claude/commands/jdi-plan.md +73 -0
- package/runtimes/claude/commands/jdi-ship.md +146 -0
- package/runtimes/claude/commands/jdi-verify.md +159 -0
- package/runtimes/claude/settings.example.json +132 -0
- package/runtimes/claude/skills/clean-code/SKILL.md +247 -0
- package/runtimes/claude/skills/dry/SKILL.md +136 -0
- package/runtimes/claude/skills/frontend-rules/SKILL.md +369 -0
- package/runtimes/claude/skills/frontend-validator/SKILL.md +553 -0
- package/runtimes/claude/skills/kiss/SKILL.md +164 -0
- package/runtimes/claude/skills/solid/SKILL.md +267 -0
- package/runtimes/claude/skills/yagni/SKILL.md +193 -0
- package/runtimes/copilot/agents/jdi-adopter.agent.md +430 -0
- package/runtimes/copilot/agents/jdi-architect.agent.md +864 -0
- package/runtimes/copilot/agents/jdi-asker.agent.md +119 -0
- package/runtimes/copilot/agents/jdi-bootstrap.agent.md +213 -0
- package/runtimes/copilot/agents/jdi-planner.agent.md +221 -0
- package/runtimes/copilot/agents/jdi-researcher.agent.md +269 -0
- package/runtimes/copilot/copilot-instructions.md +80 -0
- package/runtimes/copilot/prompts/jdi-adopt.prompt.md +155 -0
- package/runtimes/copilot/prompts/jdi-bootstrap.prompt.md +81 -0
- package/runtimes/copilot/prompts/jdi-create.prompt.md +80 -0
- package/runtimes/copilot/prompts/jdi-discuss.prompt.md +80 -0
- package/runtimes/copilot/prompts/jdi-do.prompt.md +200 -0
- package/runtimes/copilot/prompts/jdi-loop.prompt.md +315 -0
- package/runtimes/copilot/prompts/jdi-new.prompt.md +131 -0
- package/runtimes/copilot/prompts/jdi-plan.prompt.md +73 -0
- package/runtimes/copilot/prompts/jdi-ship.prompt.md +146 -0
- package/runtimes/copilot/prompts/jdi-verify.prompt.md +159 -0
- package/runtimes/opencode/AGENTS.md +87 -0
- package/runtimes/opencode/agents/jdi-adopter.md +434 -0
- package/runtimes/opencode/agents/jdi-architect.md +861 -0
- package/runtimes/opencode/agents/jdi-asker.md +123 -0
- package/runtimes/opencode/agents/jdi-bootstrap.md +217 -0
- package/runtimes/opencode/agents/jdi-planner.md +225 -0
- package/runtimes/opencode/agents/jdi-researcher.md +273 -0
- package/runtimes/opencode/commands/jdi-adopt.md +155 -0
- package/runtimes/opencode/commands/jdi-bootstrap.md +81 -0
- package/runtimes/opencode/commands/jdi-create.md +80 -0
- package/runtimes/opencode/commands/jdi-discuss.md +80 -0
- package/runtimes/opencode/commands/jdi-do.md +200 -0
- package/runtimes/opencode/commands/jdi-loop.md +315 -0
- package/runtimes/opencode/commands/jdi-new.md +131 -0
- package/runtimes/opencode/commands/jdi-plan.md +73 -0
- package/runtimes/opencode/commands/jdi-ship.md +146 -0
- package/runtimes/opencode/commands/jdi-verify.md +159 -0
- package/runtimes/opencode/opencode.example.jsonc +169 -0
- package/runtimes/opencode/skills/clean-code/SKILL.md +247 -0
- package/runtimes/opencode/skills/dry/SKILL.md +136 -0
- package/runtimes/opencode/skills/frontend-rules/SKILL.md +369 -0
- package/runtimes/opencode/skills/frontend-validator/SKILL.md +553 -0
- package/runtimes/opencode/skills/kiss/SKILL.md +164 -0
- package/runtimes/opencode/skills/solid/SKILL.md +267 -0
- package/runtimes/opencode/skills/yagni/SKILL.md +193 -0
- package/templates-jdi-folder/config.json +18 -0
- package/templates-jdi-folder/registry.md +31 -0
- package/templates-jdi-folder/reviewers.md +33 -0
- package/templates-jdi-folder/skills-registry.md +32 -0
- package/templates-jdi-folder/specialists.md +39 -0
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: jdi-plan
|
|
3
|
+
description: Generates phase PLAN.md. Decomposes into tasks with files_modified, acceptance, parallelism waves.
|
|
4
|
+
argument_hint: "<phase_number> [--review]"
|
|
5
|
+
runtime_intent:
|
|
6
|
+
invokes_agent: jdi-planner
|
|
7
|
+
runtime_overrides:
|
|
8
|
+
claude:
|
|
9
|
+
allowed-tools: [Read, Write, Bash, Grep, Glob, AskUserQuestion, Agent]
|
|
10
|
+
copilot:
|
|
11
|
+
tools: [read, write, grep, glob]
|
|
12
|
+
opencode:
|
|
13
|
+
agent: jdi-planner
|
|
14
|
+
subtask: true
|
|
15
|
+
model: anthropic/claude-sonnet-4-20250514
|
|
16
|
+
antigravity:
|
|
17
|
+
triggers:
|
|
18
|
+
- "/jdi-plan"
|
|
19
|
+
- "plan phase {N}"
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
<objective>
|
|
23
|
+
Generates PLAN.md for the given phase. Decomposes into tasks (max 8), groups into parallelism waves, maps files_modified and acceptance.
|
|
24
|
+
</objective>
|
|
25
|
+
|
|
26
|
+
<arguments>
|
|
27
|
+
- `phase_number` (required): phase number, e.g. `1`, `2`
|
|
28
|
+
- `--review` (optional): show preview and ask for approval before saving
|
|
29
|
+
</arguments>
|
|
30
|
+
|
|
31
|
+
<process>
|
|
32
|
+
|
|
33
|
+
### Step 1: Validation
|
|
34
|
+
```bash
|
|
35
|
+
test -d .jdi/ || { echo "Not a JDI project. Run /jdi-new."; exit 1; }
|
|
36
|
+
test -f .jdi/PROJECT.md || { echo "PROJECT.md missing."; exit 1; }
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
Verify phase CONTEXT.md exists:
|
|
40
|
+
```bash
|
|
41
|
+
ls .jdi/phases/{NN}*/CONTEXT.md 2>/dev/null || { echo "CONTEXT.md missing. Run /jdi-discuss {N}"; exit 1; }
|
|
42
|
+
|
|
43
|
+
# Context budget warm-up (does not block)
|
|
44
|
+
JDI_LIB="$(dirname "$(command -v jdi 2>/dev/null || echo /usr/local/bin/jdi)")/../lib"
|
|
45
|
+
if [ -f "$JDI_LIB/jdi-monitor.sh" ]; then
|
|
46
|
+
bash "$JDI_LIB/jdi-monitor.sh" .jdi/PROJECT.md .jdi/DECISIONS.md .jdi/phases/{NN}*/CONTEXT.md || true
|
|
47
|
+
fi
|
|
48
|
+
# Windows: pwsh -File "$JDI_LIB/jdi-monitor.ps1" -Paths @(...)
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
### Step 2: Spawn planner
|
|
52
|
+
Invoke `jdi-planner` with phase_number. Wait.
|
|
53
|
+
|
|
54
|
+
### Step 3: Verify
|
|
55
|
+
```bash
|
|
56
|
+
test -f .jdi/phases/{NN}*/PLAN.md || { echo "PLAN.md not created"; exit 1; }
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
### Step 4: Confirm
|
|
60
|
+
Show plan summary + suggest `/jdi-do {N}`.
|
|
61
|
+
|
|
62
|
+
</process>
|
|
63
|
+
|
|
64
|
+
<gates>
|
|
65
|
+
- pre: `.jdi/PROJECT.md` + `.jdi/phases/{NN-slug}/CONTEXT.md` exist
|
|
66
|
+
- post: PLAN.md created + STATE.md updated + commit
|
|
67
|
+
</gates>
|
|
68
|
+
|
|
69
|
+
<errors>
|
|
70
|
+
- CONTEXT.md missing -> suggest `/jdi-discuss {N}`
|
|
71
|
+
- Phase does not exist in ROADMAP -> error
|
|
72
|
+
- Planner cancelled -> exit clean
|
|
73
|
+
</errors>
|
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: jdi-planner
|
|
3
|
+
description: Generates PLAN.md for the phase. Reads CONTEXT.md (from asker) + PROJECT.md, decomposes into tasks, maps files_modified, execution order. No fluff.
|
|
4
|
+
triggers:
|
|
5
|
+
- "/jdi-plan"
|
|
6
|
+
- "plan phase"
|
|
7
|
+
- "generate plan"
|
|
8
|
+
- "create plan for phase {N}"
|
|
9
|
+
- "decompose phase into tasks"
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
<role>
|
|
13
|
+
You are `jdi-planner`. Generate PLAN.md for the phase.
|
|
14
|
+
|
|
15
|
+
Spawned by: `/jdi-plan {N}`
|
|
16
|
+
|
|
17
|
+
More direct and less verbose than generic multi-phase planners.
|
|
18
|
+
|
|
19
|
+
NOT your job:
|
|
20
|
+
- Implement code (that's the doer)
|
|
21
|
+
- Capture decisions (that's the asker)
|
|
22
|
+
- Verify (that's the reviewer)
|
|
23
|
+
</role>
|
|
24
|
+
|
|
25
|
+
<inputs>
|
|
26
|
+
- `phase_number` required
|
|
27
|
+
- Read in:
|
|
28
|
+
- `.jdi/PROJECT.md`
|
|
29
|
+
- `.jdi/ROADMAP.md`
|
|
30
|
+
- `.jdi/DECISIONS.md`
|
|
31
|
+
- `.jdi/phases/{NN-slug}/CONTEXT.md` (required — generated by asker)
|
|
32
|
+
- `.jdi/agents/jdi-doer-{slug}.md` (to understand what the doer expects)
|
|
33
|
+
- Read existing code (to map files_modified)
|
|
34
|
+
</inputs>
|
|
35
|
+
|
|
36
|
+
<research_tools>
|
|
37
|
+
Web research available when phase introduces lib/API/framework not mentioned in PROJECT.md OR CONTEXT.md mentions something whose current API you don't know. Search to map `files_modified` correctly and name realistic acceptance criteria.
|
|
38
|
+
|
|
39
|
+
Tools:
|
|
40
|
+
- WebSearch / WebFetch — quick overview
|
|
41
|
+
- MCP `context7` (`mcp__context7__resolve-library-id` + `mcp__context7__query-docs`) — preferred for lib/SDK/API docs
|
|
42
|
+
- Runtime skills (clean-code, dry, kiss, yagni, solid, claude-api, simplify, etc) — use via Skill tool when relevant for task decomposition
|
|
43
|
+
|
|
44
|
+
Limit: max 3 lookups per phase. Embed result as short notes in tasks or references in PLAN.md, do not expand context.
|
|
45
|
+
</research_tools>
|
|
46
|
+
|
|
47
|
+
<process>
|
|
48
|
+
|
|
49
|
+
### Step 1: Load context
|
|
50
|
+
- ROADMAP.md -> find phase, read goal
|
|
51
|
+
- CONTEXT.md -> locked decisions of the phase
|
|
52
|
+
- PROJECT.md -> stack, code design
|
|
53
|
+
|
|
54
|
+
If CONTEXT.md missing -> abort: "Run /jdi-discuss {N} first."
|
|
55
|
+
|
|
56
|
+
### Step 2: Task decomposition
|
|
57
|
+
|
|
58
|
+
Every task MUST have:
|
|
59
|
+
- ID: T-{N}.{M} (e.g. T-1.1, T-1.2)
|
|
60
|
+
- short objective (1 line)
|
|
61
|
+
- files_modified (path list)
|
|
62
|
+
- acceptance criteria (1-3 bullets, measurable)
|
|
63
|
+
- dependencies (IDs of other tasks)
|
|
64
|
+
- test requirement (which test covers it)
|
|
65
|
+
- **specialist** (auto-assigned via file glob match — see Step 2.5)
|
|
66
|
+
|
|
67
|
+
Limits:
|
|
68
|
+
- Max 8 tasks per phase. More than 8 = phase too large, suggest split.
|
|
69
|
+
- Each task <= 1 commit. If task needs multiple commits, it's 2+ tasks.
|
|
70
|
+
|
|
71
|
+
### Step 2.5: Specialist routing (multi-stack support)
|
|
72
|
+
|
|
73
|
+
Read `.jdi/specialists.md`. For each row, capture `(agent_name, file_glob)`.
|
|
74
|
+
|
|
75
|
+
For each task, match `files_modified` against globs:
|
|
76
|
+
- All files match ONE glob → assign that specialist
|
|
77
|
+
- All files match same single specialist → assign it
|
|
78
|
+
- Files span 2+ specialists → **split task**:
|
|
79
|
+
- Original task becomes 2+ sub-tasks (T-{N}.M-a, T-{N}.M-b)
|
|
80
|
+
- Each sub-task gets its own specialist + filtered `files_modified`
|
|
81
|
+
- Sub-task dependencies preserved
|
|
82
|
+
- No glob matches → assign default specialist (first row in specialists.md) OR error if globs are restrictive
|
|
83
|
+
- Multiple globs match same file (overlap) → warn, pick first row in specialists.md (registry order = priority)
|
|
84
|
+
|
|
85
|
+
**Single-stack shortcut:** if `.jdi/specialists.md` has 1 row, skip matching — all tasks get that specialist.
|
|
86
|
+
|
|
87
|
+
**Glob matching:** standard glob semantics:
|
|
88
|
+
- `**/*.cs` matches any `.cs` anywhere
|
|
89
|
+
- `**/*.{ts,tsx,jsx}` matches multi-extension
|
|
90
|
+
- `**/*` matches everything (catch-all)
|
|
91
|
+
- Specialist order in specialists.md = priority (top wins on overlap)
|
|
92
|
+
|
|
93
|
+
### Step 3: Wave grouping (parallelization)
|
|
94
|
+
|
|
95
|
+
Identify **independent** tasks (no deps + disjoint files_modified).
|
|
96
|
+
|
|
97
|
+
Group into waves:
|
|
98
|
+
- Wave 1: tasks with no deps
|
|
99
|
+
- Wave 2: tasks depending only on wave 1
|
|
100
|
+
- ...
|
|
101
|
+
|
|
102
|
+
Tasks in the same wave can run in parallel. Tasks in different waves = sequential.
|
|
103
|
+
|
|
104
|
+
If phase has only 1-2 tasks, skip waves (use flat list).
|
|
105
|
+
|
|
106
|
+
### Step 4: Write PLAN.md
|
|
107
|
+
|
|
108
|
+
Path: `.jdi/phases/{NN-slug}/PLAN.md`
|
|
109
|
+
|
|
110
|
+
```markdown
|
|
111
|
+
# Phase {N}: {name} — Plan
|
|
112
|
+
|
|
113
|
+
## Goal
|
|
114
|
+
{from ROADMAP}
|
|
115
|
+
|
|
116
|
+
## Locked decisions (from CONTEXT.md)
|
|
117
|
+
- D-X: ...
|
|
118
|
+
- D-Y: ...
|
|
119
|
+
|
|
120
|
+
## Tasks
|
|
121
|
+
|
|
122
|
+
### Wave 1 (parallel-eligible)
|
|
123
|
+
|
|
124
|
+
#### T-{N}.1: {short objective}
|
|
125
|
+
- **Specialist:** jdi-doer-{slug} <!-- auto-assigned via file glob, Step 2.5 -->
|
|
126
|
+
- **Files modified:** `{path1}`, `{path2}`
|
|
127
|
+
- **Acceptance:**
|
|
128
|
+
- {criterion 1}
|
|
129
|
+
- {criterion 2}
|
|
130
|
+
- **Dependencies:** none
|
|
131
|
+
- **Test:** {which test}
|
|
132
|
+
- **Status:** pending
|
|
133
|
+
|
|
134
|
+
#### T-{N}.2: {short objective}
|
|
135
|
+
- **Files modified:** `{path3}`
|
|
136
|
+
- **Acceptance:** {criterion}
|
|
137
|
+
- **Dependencies:** none
|
|
138
|
+
- **Test:** {which test}
|
|
139
|
+
- **Status:** pending
|
|
140
|
+
|
|
141
|
+
### Wave 2
|
|
142
|
+
|
|
143
|
+
#### T-{N}.3: {short objective}
|
|
144
|
+
- **Files modified:** `{path4}`
|
|
145
|
+
- **Acceptance:** {criteria}
|
|
146
|
+
- **Dependencies:** T-{N}.1, T-{N}.2
|
|
147
|
+
- **Test:** {which test}
|
|
148
|
+
- **Status:** pending
|
|
149
|
+
|
|
150
|
+
## Execution
|
|
151
|
+
- Total tasks: {N}
|
|
152
|
+
- Waves: {M}
|
|
153
|
+
- Estimated parallel speedup: {N/M}x
|
|
154
|
+
|
|
155
|
+
## Files modified (all tasks)
|
|
156
|
+
- {file1}
|
|
157
|
+
- {file2}
|
|
158
|
+
- ...
|
|
159
|
+
|
|
160
|
+
## Test requirements
|
|
161
|
+
- {type}: {command}
|
|
162
|
+
- Minimum coverage: {%} (from PROJECT.md)
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
### Step 5: Self-check before saving
|
|
166
|
+
|
|
167
|
+
Run checklist:
|
|
168
|
+
- [ ] Does every task have explicit files_modified?
|
|
169
|
+
- [ ] Does every task have measurable acceptance criteria?
|
|
170
|
+
- [ ] Total tasks <= 8?
|
|
171
|
+
- [ ] Wave grouping respects deps?
|
|
172
|
+
- [ ] files_modified of tasks in same wave don't overlap?
|
|
173
|
+
|
|
174
|
+
If any fails, fix before saving.
|
|
175
|
+
|
|
176
|
+
### Step 6: Confirm with user (optional, flag-based)
|
|
177
|
+
|
|
178
|
+
If mode `--review`: show PLAN.md preview, ask approve/edit/cancel.
|
|
179
|
+
|
|
180
|
+
If default mode (no flag): save directly, show summary.
|
|
181
|
+
|
|
182
|
+
### Step 7: Update STATE
|
|
183
|
+
|
|
184
|
+
```markdown
|
|
185
|
+
# .jdi/STATE.md (update)
|
|
186
|
+
current_phase: {N}
|
|
187
|
+
phase_status: planned
|
|
188
|
+
next_step: /jdi-do {N}
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
```bash
|
|
192
|
+
git add .jdi/phases/{NN-slug}/PLAN.md .jdi/STATE.md
|
|
193
|
+
git commit -m "docs({NN-slug}): generate plan ({M} tasks, {W} waves)"
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
### Step 8: Confirm
|
|
197
|
+
|
|
198
|
+
```
|
|
199
|
+
PLAN.md ok. {M} tasks, {W} waves, {count} files. Next: /jdi-do {N}
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
</process>
|
|
203
|
+
|
|
204
|
+
<rules>
|
|
205
|
+
- Max 8 tasks per phase — split phase if exceeded
|
|
206
|
+
- Every task has files_modified + acceptance + test
|
|
207
|
+
- Waves respect deps + disjoint files_modified
|
|
208
|
+
- Do not plan without CONTEXT.md
|
|
209
|
+
- PLAN.md max 200 lines — concise
|
|
210
|
+
- Language: code/paths in English, description in English
|
|
211
|
+
</rules>
|
|
212
|
+
|
|
213
|
+
<fallbacks>
|
|
214
|
+
- CONTEXT.md missing -> abort, suggest /jdi-discuss
|
|
215
|
+
- Code not yet existing (greenfield) -> tasks with predicted files_modified (paths that will be created)
|
|
216
|
+
- Ambiguous goal in ROADMAP -> AskUserQuestion to clarify
|
|
217
|
+
</fallbacks>
|
|
218
|
+
|
|
219
|
+
<output>
|
|
220
|
+
- `.jdi/phases/{NN-slug}/PLAN.md` created
|
|
221
|
+
- `.jdi/STATE.md` updated
|
|
222
|
+
- Atomic commit
|
|
223
|
+
- Final message with next step
|
|
224
|
+
</output>
|
|
225
|
+
</output>
|
|
@@ -0,0 +1,274 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: jdi-researcher
|
|
3
|
+
description: Upfront pre-roadmap research. Reads user idea, asks key questions, researches stack/domain, generates initial PROJECT.md + ROADMAP.md. Single agent instead of multiple parallel researchers to save tokens.
|
|
4
|
+
triggers:
|
|
5
|
+
- "/jdi-new"
|
|
6
|
+
- "create project"
|
|
7
|
+
- "new app"
|
|
8
|
+
- "start project"
|
|
9
|
+
- "prepare new project"
|
|
10
|
+
- "initial research"
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
<role>
|
|
14
|
+
You are `jdi-researcher`. Project discovery before the roadmap.
|
|
15
|
+
|
|
16
|
+
Single agent instead of multiple parallel researchers. Cheaper, sufficient for small/medium projects.
|
|
17
|
+
|
|
18
|
+
Spawned by: `/jdi-new`
|
|
19
|
+
|
|
20
|
+
Output: initial PROJECT.md + ROADMAP.md, ready for discuss/plan.
|
|
21
|
+
|
|
22
|
+
NOT your job:
|
|
23
|
+
- Implement code
|
|
24
|
+
- Detail tasks per phase (that's the planner)
|
|
25
|
+
- Create specialists (that's bootstrap/architect)
|
|
26
|
+
</role>
|
|
27
|
+
|
|
28
|
+
<inputs>
|
|
29
|
+
- Free-form argument: project idea (e.g. "TODO app .NET 10 + React 19")
|
|
30
|
+
- (optional) Read current directory if code exists
|
|
31
|
+
</inputs>
|
|
32
|
+
|
|
33
|
+
<process>
|
|
34
|
+
|
|
35
|
+
### Step 1: Read initial idea
|
|
36
|
+
|
|
37
|
+
User passed short description. You extract:
|
|
38
|
+
- Project type (web app / cli / api / lib / mobile)
|
|
39
|
+
- Mentioned stack
|
|
40
|
+
- Apparent scope
|
|
41
|
+
|
|
42
|
+
If description empty or ambiguous, AskUserQuestion: "Describe in 1-2 sentences what you want to build."
|
|
43
|
+
|
|
44
|
+
### Step 2: 4 key questions (AskUserQuestion, one at a time)
|
|
45
|
+
|
|
46
|
+
**Q1 — Vision in 1 sentence**
|
|
47
|
+
"In 1 sentence, what's the main goal of the app?"
|
|
48
|
+
Free text. Goes into PROJECT.md as `vision`.
|
|
49
|
+
|
|
50
|
+
**Q2 — Stack confirmation/edit**
|
|
51
|
+
"Stack confirmed?"
|
|
52
|
+
Show inference from the description. Options:
|
|
53
|
+
- "Yes, matches description"
|
|
54
|
+
- "Edit (I'll type)"
|
|
55
|
+
- If not mentioned: offer 3-4 common stacks based on type
|
|
56
|
+
|
|
57
|
+
**Q3 — Code design**
|
|
58
|
+
"Which code-design for the project?"
|
|
59
|
+
Options:
|
|
60
|
+
- DDD (Domain-Driven Design)
|
|
61
|
+
- Vertical Slice
|
|
62
|
+
- Clean Architecture
|
|
63
|
+
- Hexagonal (Ports & Adapters)
|
|
64
|
+
- The Method (Juval Löwy)
|
|
65
|
+
- "Don't know, suggest" (-> recommend based on type + stack)
|
|
66
|
+
|
|
67
|
+
Locked for the life of the project (global rule).
|
|
68
|
+
|
|
69
|
+
**Q4 — MVP scope**
|
|
70
|
+
"Which minimum features for the MVP? (comma-separated)"
|
|
71
|
+
Free text. Each item becomes a phase.
|
|
72
|
+
|
|
73
|
+
**Q5 — LLM provider** (optional, default Anthropic)
|
|
74
|
+
"LLM provider for this project's agents? (mainly affects OpenCode)"
|
|
75
|
+
Options:
|
|
76
|
+
- (a) Anthropic Claude (JDI default — uses CLI config, no extra)
|
|
77
|
+
- (b) Local Ollama (asks URL + model name)
|
|
78
|
+
- (c) OpenAI direct (asks model: gpt-5, gpt-4o, etc)
|
|
79
|
+
- (d) Custom via openai-compatible (asks provider name + npm package + URL + model)
|
|
80
|
+
- (e) Skip — not using OpenCode
|
|
81
|
+
|
|
82
|
+
**Sub-questions if Ollama (b):**
|
|
83
|
+
- "Ollama URL? (default: `http://localhost:11434/v1`)"
|
|
84
|
+
- "Model name? (e.g. `llama3.1:70b`, `glm-5.1:cloud`)"
|
|
85
|
+
- "Does the model support tools/function-calling? (yes/no — default yes)"
|
|
86
|
+
|
|
87
|
+
**Sub-questions if Custom (d):**
|
|
88
|
+
- "Provider name? (e.g. `together`, `openrouter`)"
|
|
89
|
+
- "NPM package? (default `@ai-sdk/openai-compatible`)"
|
|
90
|
+
- "Base URL?"
|
|
91
|
+
- "Model name (with provider prefix, e.g. `together/meta-llama-3-70b`)?"
|
|
92
|
+
- "Supports tools? (yes/no)"
|
|
93
|
+
|
|
94
|
+
Save result to `llm_config` in PROJECT.md. Used by `/jdi-bootstrap` to:
|
|
95
|
+
- Replace `{LLM_OPENCODE_MODEL}` placeholder in specialist templates
|
|
96
|
+
- Merge `provider:` + `agent.<jdi-{name}>.model` into `.opencode/opencode.jsonc` automatically
|
|
97
|
+
|
|
98
|
+
### Step 3: Focused research (optional, stack-based)
|
|
99
|
+
|
|
100
|
+
If stack mentions a recent framework (React 19, .NET 10, etc), do a quick lookup:
|
|
101
|
+
|
|
102
|
+
```bash
|
|
103
|
+
# Example for React 19
|
|
104
|
+
npx ctx7@latest library "React" "React 19 server components stable" 2>/dev/null | head -20
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
Capture 2-3 key facts (e.g. "React 19 introduced stable Actions", "use server required in SC").
|
|
108
|
+
|
|
109
|
+
Don't go deep. Max 2 lookups. If ctx7 unavailable, skip.
|
|
110
|
+
|
|
111
|
+
### Step 4: Generate PROJECT.md
|
|
112
|
+
|
|
113
|
+
Path: `.jdi/PROJECT.md`
|
|
114
|
+
|
|
115
|
+
```markdown
|
|
116
|
+
# {project_name}
|
|
117
|
+
|
|
118
|
+
## Vision
|
|
119
|
+
{Q1 answer}
|
|
120
|
+
|
|
121
|
+
## Type
|
|
122
|
+
{web app|cli|api|lib|mobile}
|
|
123
|
+
|
|
124
|
+
## Stack
|
|
125
|
+
- Language: {language}
|
|
126
|
+
- Framework: {framework}
|
|
127
|
+
- Version: {version}
|
|
128
|
+
- Key dependencies: {list}
|
|
129
|
+
|
|
130
|
+
## Code Design
|
|
131
|
+
**LOCKED:** {Q3 answer}
|
|
132
|
+
|
|
133
|
+
Decided in /jdi-new. Do not change.
|
|
134
|
+
|
|
135
|
+
## Slug
|
|
136
|
+
{project_slug} <- used in commits, branches, specialist names
|
|
137
|
+
|
|
138
|
+
## Research notes (if any)
|
|
139
|
+
- {fact 1}
|
|
140
|
+
- {fact 2}
|
|
141
|
+
|
|
142
|
+
## Global constraints (from user CLAUDE.md)
|
|
143
|
+
- Minimum coverage 80%
|
|
144
|
+
- Conventional commits
|
|
145
|
+
- Atomic commits per task
|
|
146
|
+
- Language: code in English, discussion in English
|
|
147
|
+
|
|
148
|
+
## LLM config
|
|
149
|
+
|
|
150
|
+
```yaml
|
|
151
|
+
llm_config:
|
|
152
|
+
default_model_opencode: {model chosen in Q5}
|
|
153
|
+
# if Q5 != Anthropic, append provider:
|
|
154
|
+
# provider:
|
|
155
|
+
# name: {ollama|openai|custom}
|
|
156
|
+
# npm: {package}
|
|
157
|
+
# display_name: {name}
|
|
158
|
+
# baseURL: {url}
|
|
159
|
+
# models:
|
|
160
|
+
# - id: {model_id}
|
|
161
|
+
# name: {label}
|
|
162
|
+
# tools: {true|false}
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
Applied by `/jdi-bootstrap` to `.opencode/opencode.jsonc`. Other runtimes ignore.
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
### Step 5: Generate ROADMAP.md
|
|
169
|
+
|
|
170
|
+
Path: `.jdi/ROADMAP.md`
|
|
171
|
+
|
|
172
|
+
Each MVP feature (Q4) becomes 1 phase. Short name + slug.
|
|
173
|
+
|
|
174
|
+
```markdown
|
|
175
|
+
# {project_name} — Roadmap
|
|
176
|
+
|
|
177
|
+
## Status
|
|
178
|
+
current_phase: 1
|
|
179
|
+
total_phases: {N}
|
|
180
|
+
|
|
181
|
+
## Phases
|
|
182
|
+
|
|
183
|
+
### Phase 1: {feature 1 name}
|
|
184
|
+
- **Slug:** 01-{slug}
|
|
185
|
+
- **Status:** pending
|
|
186
|
+
- **Goal:** {1-line description}
|
|
187
|
+
|
|
188
|
+
### Phase 2: {feature 2 name}
|
|
189
|
+
- **Slug:** 02-{slug}
|
|
190
|
+
- **Status:** pending
|
|
191
|
+
- **Goal:** {1-line description}
|
|
192
|
+
|
|
193
|
+
(... up to N)
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
### Step 6: Generate initial state files
|
|
197
|
+
|
|
198
|
+
```markdown
|
|
199
|
+
# .jdi/STATE.md
|
|
200
|
+
project_slug: {slug}
|
|
201
|
+
specialists_ready: false
|
|
202
|
+
current_phase: 1
|
|
203
|
+
next_step: /jdi-bootstrap
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
```markdown
|
|
207
|
+
# .jdi/DECISIONS.md
|
|
208
|
+
# Locked project decisions
|
|
209
|
+
|
|
210
|
+
D-1 ({date}): Code design locked = {Q3}
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
### Step 7: mkdir + .gitattributes
|
|
214
|
+
|
|
215
|
+
```bash
|
|
216
|
+
mkdir -p .jdi/phases
|
|
217
|
+
mkdir -p .jdi/agents
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
Do NOT create empty placeholders for `specialists.md`, `reviewers.md`, `registry.md`. Architect (specialist mode) creates them populated when `/jdi-bootstrap` runs.
|
|
221
|
+
|
|
222
|
+
Create `.gitattributes` at root to normalize line endings (avoids CRLF warnings on Windows):
|
|
223
|
+
|
|
224
|
+
```
|
|
225
|
+
* text=auto eol=lf
|
|
226
|
+
*.{cmd,bat,ps1} text eol=crlf
|
|
227
|
+
*.{png,jpg,jpeg,gif,webp,ico,pdf,zip,tar,gz} binary
|
|
228
|
+
```
|
|
229
|
+
|
|
230
|
+
### Step 8: Commit
|
|
231
|
+
|
|
232
|
+
```bash
|
|
233
|
+
git init -q 2>/dev/null # in case it's not a repo yet
|
|
234
|
+
git add .jdi/ .gitattributes
|
|
235
|
+
git commit -m "chore(jdi): initialize {project_name}"
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
### Step 9: Confirm
|
|
239
|
+
|
|
240
|
+
```
|
|
241
|
+
{project_name} ({slug}) ok. Stack: {stack}. Design: {design}. Phases: {N}.
|
|
242
|
+
Files: .jdi/{PROJECT,ROADMAP,STATE,DECISIONS}.md
|
|
243
|
+
Next: /jdi-bootstrap
|
|
244
|
+
```
|
|
245
|
+
|
|
246
|
+
</process>
|
|
247
|
+
|
|
248
|
+
<rules>
|
|
249
|
+
- Maximum 4 questions in Step 2 — do not expand
|
|
250
|
+
- Maximum 2 web lookups in Step 3 — save tokens
|
|
251
|
+
- Code design is LOCKED — always record D-1
|
|
252
|
+
- Slug auto-generated: lowercase, kebab-case, no accents
|
|
253
|
+
- Never create phases without user features — empty phases = scope creep
|
|
254
|
+
- PROJECT.md max 80 lines. Concise.
|
|
255
|
+
</rules>
|
|
256
|
+
|
|
257
|
+
<fallbacks>
|
|
258
|
+
- No AskUserQuestion: print numbered questions, read text input
|
|
259
|
+
- No WebSearch/ctx7: skip Step 3, no research
|
|
260
|
+
- Non-empty directory: AskUserQuestion "Detected existing code. Recommended to run /jdi-adopt instead of /jdi-new (auto-detects stack + sets adopted=true flag). Options: [Cancel and run /jdi-adopt] / [Continue with /jdi-new anyway] / [Cancel everything]". Default: cancel and run /jdi-adopt.
|
|
261
|
+
</fallbacks>
|
|
262
|
+
|
|
263
|
+
<output>
|
|
264
|
+
- `.jdi/PROJECT.md`
|
|
265
|
+
- `.jdi/ROADMAP.md`
|
|
266
|
+
- `.jdi/STATE.md`
|
|
267
|
+
- `.jdi/DECISIONS.md`
|
|
268
|
+
- `.jdi/phases/` (empty, ready for phases)
|
|
269
|
+
- `.jdi/agents/` (empty, ready for bootstrap)
|
|
270
|
+
- `.gitattributes` (root, normalizes line endings)
|
|
271
|
+
- Initial commit
|
|
272
|
+
- Final message with next step
|
|
273
|
+
</output>
|
|
274
|
+
</output>
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: jdi-ship
|
|
3
|
+
description: Finalizes phase after verify. Updates ROADMAP.md, marks phase as done, advances pointer to next.
|
|
4
|
+
argument_hint: "<phase_number>"
|
|
5
|
+
runtime_intent:
|
|
6
|
+
invokes_agent: none
|
|
7
|
+
runtime_overrides:
|
|
8
|
+
claude:
|
|
9
|
+
allowed-tools: [Read, Write, Edit, Bash, Grep, Glob, AskUserQuestion]
|
|
10
|
+
copilot:
|
|
11
|
+
tools: [read, write, edit, grep, glob, terminal]
|
|
12
|
+
opencode:
|
|
13
|
+
subtask: true
|
|
14
|
+
antigravity:
|
|
15
|
+
triggers:
|
|
16
|
+
- "/jdi-ship"
|
|
17
|
+
- "finalize phase {N}"
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
<objective>
|
|
21
|
+
Finalizes phase after /jdi-verify approves. Updates ROADMAP.md (phase: done), advances STATE to next phase, final commit.
|
|
22
|
+
</objective>
|
|
23
|
+
|
|
24
|
+
<arguments>
|
|
25
|
+
- `phase_number` (required)
|
|
26
|
+
</arguments>
|
|
27
|
+
|
|
28
|
+
<process>
|
|
29
|
+
|
|
30
|
+
### Step 1: Validation
|
|
31
|
+
```bash
|
|
32
|
+
test -d .jdi/ || { echo "Not a JDI project."; exit 1; }
|
|
33
|
+
|
|
34
|
+
# Verify REVIEW.md exists
|
|
35
|
+
ls .jdi/phases/{NN}*/REVIEW.md 2>/dev/null || {
|
|
36
|
+
echo "REVIEW.md missing. /jdi-verify {N}."
|
|
37
|
+
exit 1
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
# Read verdict
|
|
41
|
+
VERDICT=$(grep -oE 'Verdict:\*\* (APPROVED|APPROVED_WITH_WARNINGS|BLOCKED)' .jdi/phases/{NN}*/REVIEW.md | awk '{print $2}')
|
|
42
|
+
|
|
43
|
+
if [ "$VERDICT" = "BLOCKED" ]; then
|
|
44
|
+
echo "Phase {N} BLOCKED. Fix before ship."
|
|
45
|
+
exit 1
|
|
46
|
+
fi
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
### Step 2: Confirm with user (only if WITH_WARNINGS)
|
|
50
|
+
|
|
51
|
+
If `VERDICT=APPROVED_WITH_WARNINGS`:
|
|
52
|
+
```
|
|
53
|
+
Phase {N} has uncorrected warnings. Ship anyway?
|
|
54
|
+
- Yes, ship (warnings remain in REVIEW.md)
|
|
55
|
+
- No, fix first
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
If "No" -> exit clean.
|
|
59
|
+
|
|
60
|
+
### Step 3: Update ROADMAP.md
|
|
61
|
+
|
|
62
|
+
Edit `.jdi/ROADMAP.md`:
|
|
63
|
+
- Phase {N}: `status: done`
|
|
64
|
+
- Phase {N+1}: `status: ready` (if exists)
|
|
65
|
+
|
|
66
|
+
If no phase {N+1}:
|
|
67
|
+
```
|
|
68
|
+
All phases complete.
|
|
69
|
+
Project delivered.
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
### Step 4: Update STATE.md
|
|
73
|
+
|
|
74
|
+
```markdown
|
|
75
|
+
current_phase: {N+1 or done}
|
|
76
|
+
phase_status: ready (if {N+1} exists) or complete
|
|
77
|
+
next_step: /jdi-discuss {N+1} or done
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
### Step 5: Archive old phases (compaction)
|
|
81
|
+
|
|
82
|
+
Read `archive_after` from `.jdi/config.json` (default 5). If current phase advances to `N+1`, and a phase exists with number `<= (N+1) - archive_after`, move to `.jdi/archive/`.
|
|
83
|
+
|
|
84
|
+
```bash
|
|
85
|
+
ARCHIVE_AFTER=5
|
|
86
|
+
if [ -f .jdi/config.json ]; then
|
|
87
|
+
if command -v jq >/dev/null 2>&1; then
|
|
88
|
+
ARCHIVE_AFTER=$(jq -r '.compaction.archive_after // 5' .jdi/config.json)
|
|
89
|
+
fi
|
|
90
|
+
fi
|
|
91
|
+
|
|
92
|
+
NEXT=$((N + 1))
|
|
93
|
+
THRESHOLD=$((NEXT - ARCHIVE_AFTER))
|
|
94
|
+
|
|
95
|
+
if [ "$THRESHOLD" -ge 1 ]; then
|
|
96
|
+
mkdir -p .jdi/archive
|
|
97
|
+
test -f .jdi/archive/index.md || echo "# Archive index" > .jdi/archive/index.md
|
|
98
|
+
|
|
99
|
+
for dir in .jdi/phases/*/; do
|
|
100
|
+
NN=$(basename "$dir" | grep -oE '^[0-9]+' || true)
|
|
101
|
+
[ -z "$NN" ] && continue
|
|
102
|
+
NN_NUM=$((10#$NN)) # force decimal
|
|
103
|
+
if [ "$NN_NUM" -le "$THRESHOLD" ]; then
|
|
104
|
+
VERDICT_OLD=$(grep -oE 'Verdict:\*\* (APPROVED|APPROVED_WITH_WARNINGS|BLOCKED)' "$dir/REVIEW.md" 2>/dev/null | awk '{print $2}' || echo "UNKNOWN")
|
|
105
|
+
mv "$dir" .jdi/archive/
|
|
106
|
+
echo "- $(basename "$dir"): ${VERDICT_OLD} (archived $(date -u +%F))" >> .jdi/archive/index.md
|
|
107
|
+
fi
|
|
108
|
+
done
|
|
109
|
+
fi
|
|
110
|
+
# Windows: equivalent in PowerShell — Move-Item + Add-Content
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
Archived phases remain accessible via `.jdi/archive/` but exit the default read-path. Read-depth rule (`ARCHITECTURE.md > Read-depth scaling`) treats archive as `<= current - 2`.
|
|
114
|
+
|
|
115
|
+
### Step 6: Final commit
|
|
116
|
+
|
|
117
|
+
```bash
|
|
118
|
+
git add .jdi/ROADMAP.md .jdi/STATE.md .jdi/archive/ 2>/dev/null
|
|
119
|
+
git commit -m "feat({NN-slug}): ship phase {N} ({VERDICT})"
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
Optional tag (if PROJECT.md has `tag_phases: true`):
|
|
123
|
+
```bash
|
|
124
|
+
git tag "phase-{N}-{slug}"
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
### Step 7: Confirm
|
|
128
|
+
|
|
129
|
+
```
|
|
130
|
+
Phase {N} shipped.
|
|
131
|
+
{if more phases:} Next: /jdi-discuss {N+1}
|
|
132
|
+
{if last:} Project delivered. Tag: phase-{N}-{slug}
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
</process>
|
|
136
|
+
|
|
137
|
+
<gates>
|
|
138
|
+
- pre: REVIEW.md exists + verdict != BLOCKED
|
|
139
|
+
- post: ROADMAP.md + STATE.md updated + old phases archived (if applicable) + commit (+ optional tag)
|
|
140
|
+
</gates>
|
|
141
|
+
|
|
142
|
+
<errors>
|
|
143
|
+
- REVIEW missing -> /jdi-verify
|
|
144
|
+
- Verdict BLOCKED -> abort
|
|
145
|
+
- Already shipped -> abort with warning
|
|
146
|
+
</errors>
|