juno-code 1.0.47 → 1.0.50
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/README.md +455 -205
- package/dist/bin/cli.d.mts +17 -0
- package/dist/bin/cli.d.ts +17 -0
- package/dist/bin/cli.js +6456 -17604
- package/dist/bin/cli.js.map +1 -1
- package/dist/bin/cli.mjs +6443 -17589
- package/dist/bin/cli.mjs.map +1 -1
- package/dist/bin/feedback-collector.d.mts +2 -0
- package/dist/bin/feedback-collector.d.ts +2 -0
- package/dist/bin/feedback-collector.js.map +1 -1
- package/dist/bin/feedback-collector.mjs.map +1 -1
- package/dist/index.d.mts +2133 -0
- package/dist/index.d.ts +2133 -0
- package/dist/index.js +3916 -14711
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +3914 -14516
- package/dist/index.mjs.map +1 -1
- package/dist/templates/extensions/pi/juno-skill-preprocessor.ts +239 -0
- package/dist/templates/scripts/__pycache__/github.cpython-313.pyc +0 -0
- package/dist/templates/scripts/__pycache__/parallel_runner.cpython-313.pyc +0 -0
- package/dist/templates/scripts/__pycache__/slack_respond.cpython-313.pyc +0 -0
- package/dist/templates/scripts/install_requirements.sh +41 -3
- package/dist/templates/scripts/kanban.sh +22 -4
- package/dist/templates/scripts/parallel_runner.sh +2242 -0
- package/dist/templates/services/README.md +61 -1
- package/dist/templates/services/__pycache__/claude.cpython-313.pyc +0 -0
- package/dist/templates/services/__pycache__/codex.cpython-313.pyc +0 -0
- package/dist/templates/services/__pycache__/pi.cpython-313.pyc +0 -0
- package/dist/templates/services/claude.py +132 -33
- package/dist/templates/services/codex.py +179 -66
- package/dist/templates/services/gemini.py +117 -27
- package/dist/templates/services/pi.py +2796 -0
- package/dist/templates/skills/claude/kanban-workflow/SKILL.md +138 -0
- package/dist/templates/skills/claude/plan-kanban-tasks/SKILL.md +15 -8
- package/dist/templates/skills/claude/ralph-loop/SKILL.md +18 -22
- package/dist/templates/skills/claude/ralph-loop/references/first_check.md +15 -14
- package/dist/templates/skills/claude/ralph-loop/references/implement.md +17 -17
- package/dist/templates/skills/claude/ralph-loop/scripts/kanban.sh +22 -4
- package/dist/templates/skills/claude/understand-project/SKILL.md +15 -8
- package/dist/templates/skills/codex/kanban-workflow/SKILL.md +139 -0
- package/dist/templates/skills/codex/plan-kanban-tasks/SKILL.md +32 -0
- package/dist/templates/skills/codex/ralph-loop/SKILL.md +18 -22
- package/dist/templates/skills/codex/ralph-loop/references/first_check.md +15 -14
- package/dist/templates/skills/codex/ralph-loop/references/implement.md +17 -17
- package/dist/templates/skills/codex/ralph-loop/scripts/kanban.sh +22 -4
- package/dist/templates/skills/codex/understand-project/SKILL.md +46 -0
- package/dist/templates/skills/pi/.gitkeep +0 -0
- package/dist/templates/skills/pi/kanban-workflow/SKILL.md +139 -0
- package/dist/templates/skills/pi/plan-kanban-tasks/SKILL.md +32 -0
- package/dist/templates/skills/pi/ralph-loop/SKILL.md +43 -0
- package/dist/templates/skills/pi/ralph-loop/references/first_check.md +21 -0
- package/dist/templates/skills/pi/ralph-loop/references/implement.md +99 -0
- package/dist/templates/skills/pi/understand-project/SKILL.md +46 -0
- package/package.json +26 -46
- package/dist/templates/scripts/__pycache__/attachment_downloader.cpython-38.pyc +0 -0
- package/dist/templates/scripts/__pycache__/github.cpython-38.pyc +0 -0
- package/dist/templates/scripts/__pycache__/slack_fetch.cpython-38.pyc +0 -0
- package/dist/templates/scripts/__pycache__/slack_state.cpython-38.pyc +0 -0
- package/dist/templates/services/__pycache__/claude.cpython-38.pyc +0 -0
- package/dist/templates/services/__pycache__/codex.cpython-38.pyc +0 -0
package/README.md
CHANGED
|
@@ -17,12 +17,17 @@
|
|
|
17
17
|
|
|
18
18
|
```bash
|
|
19
19
|
npm install -g juno-code
|
|
20
|
+
|
|
21
|
+
# For Pi agent support (optional - multi-provider coding agent)
|
|
22
|
+
npm install -g @mariozechner/pi-coding-agent
|
|
20
23
|
```
|
|
21
24
|
|
|
22
25
|
After installation, initialize your project:
|
|
23
26
|
|
|
24
27
|
```bash
|
|
25
28
|
juno-code init --task "Your task description" --subagent claude
|
|
29
|
+
# Or with Pi (multi-provider agent)
|
|
30
|
+
juno-code init --task "Your task description" --subagent pi
|
|
26
31
|
```
|
|
27
32
|
|
|
28
33
|
---
|
|
@@ -52,7 +57,7 @@ Run the AI in a loop. Let it iterate. Watch it solve problems, fix bugs, and add
|
|
|
52
57
|
| **Overcooking** | Loop runs too long, AI adds features nobody asked for | You get bloated code and wasted tokens |
|
|
53
58
|
| **Undercooking** | You Ctrl+C too early, work is incomplete | Features half-done, bugs half-fixed |
|
|
54
59
|
| **Fragile state** | Markdown files (TASKS.md, PLANNING.md) as source of truth | LLMs can corrupt format; no strict schema |
|
|
55
|
-
| **Vendor lock-in** | Ralph was built for Claude Code | Can't easily switch to Codex, Gemini, or others |
|
|
60
|
+
| **Vendor lock-in** | Ralph was built for Claude Code | Can't easily switch to Codex, Gemini, Pi, or others |
|
|
56
61
|
| **No traceability** | Changes blend together | Hard to debug, impossible to time-travel |
|
|
57
62
|
|
|
58
63
|
## juno-code: Ralph, But Better
|
|
@@ -68,7 +73,7 @@ juno-code -b shell -s claude -m :opus -i 5 -v
|
|
|
68
73
|
./.juno_task/scripts/run_until_completion.sh -s claude -i 1 -v
|
|
69
74
|
|
|
70
75
|
# Unlimited (like Ralph) - when you really want that
|
|
71
|
-
juno-code -b shell -s claude
|
|
76
|
+
juno-code -b shell -s claude
|
|
72
77
|
```
|
|
73
78
|
|
|
74
79
|
### Task Tracking: Structured, Not Prose
|
|
@@ -84,13 +89,49 @@ Built-in kanban via [juno-kanban](https://pypi.org/project/juno-kanban/). Unlike
|
|
|
84
89
|
./.juno_task/scripts/kanban.sh list --limit 5 # Shows only what matters
|
|
85
90
|
```
|
|
86
91
|
|
|
92
|
+
### Task Dependencies
|
|
93
|
+
Declare what must be done first. The kanban system builds a dependency graph so agents work in the right order:
|
|
94
|
+
```bash
|
|
95
|
+
# Create a task that depends on another
|
|
96
|
+
./.juno_task/scripts/kanban.sh create "Deploy API" --blocked-by A1b2C3
|
|
97
|
+
|
|
98
|
+
# Or use body markup (4 synonym tags supported)
|
|
99
|
+
./.juno_task/scripts/kanban.sh create "Deploy API [blocked_by]A1b2C3[/blocked_by]"
|
|
100
|
+
|
|
101
|
+
# What's ready to work on right now?
|
|
102
|
+
./.juno_task/scripts/kanban.sh ready
|
|
103
|
+
|
|
104
|
+
# Dependency-aware execution order
|
|
105
|
+
./.juno_task/scripts/kanban.sh order --scores
|
|
106
|
+
|
|
107
|
+
# Inspect a task's dependency info
|
|
108
|
+
./.juno_task/scripts/kanban.sh deps TASK_ID
|
|
109
|
+
```
|
|
110
|
+
|
|
87
111
|
### Backend Choice: Use Any AI
|
|
88
|
-
Switch between Claude, Codex, Gemini, or Cursor with one flag:
|
|
112
|
+
Switch between Claude, Codex, Gemini, Pi, or Cursor with one flag:
|
|
89
113
|
```bash
|
|
90
114
|
# Stuck on a bug? Try different models
|
|
91
|
-
juno-code -b shell -s claude -m :opus-i 1 -v
|
|
115
|
+
juno-code -b shell -s claude -m :opus -i 1 -v
|
|
92
116
|
juno-code -b shell -s codex -m :codex -i 1 -v
|
|
93
117
|
juno-code -b shell -s gemini -m :flash -i 1 -v
|
|
118
|
+
juno-code -b shell -s pi -m :sonnet -i 1 -v
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
### Parallel Execution
|
|
122
|
+
Run multiple tasks simultaneously with the parallel runner:
|
|
123
|
+
```bash
|
|
124
|
+
# Run 3 kanban tasks in parallel
|
|
125
|
+
./.juno_task/scripts/parallel_runner.sh --kanban T1,T2,T3 --parallel 3
|
|
126
|
+
|
|
127
|
+
# Visual monitoring in tmux
|
|
128
|
+
./.juno_task/scripts/parallel_runner.sh --tmux --kanban T1,T2,T3 --parallel 5
|
|
129
|
+
|
|
130
|
+
# Process a CSV file with custom prompt
|
|
131
|
+
./.juno_task/scripts/parallel_runner.sh --items-file data.csv --prompt-file instructions.md --strict
|
|
132
|
+
|
|
133
|
+
# Dependency-aware parallel execution
|
|
134
|
+
./.juno_task/scripts/parallel_runner.sh --kanban-filter 'ready' --parallel 3
|
|
94
135
|
```
|
|
95
136
|
|
|
96
137
|
### Full Traceability: Every Change Tracked
|
|
@@ -116,6 +157,16 @@ juno-code -b shell -s claude -i 5 -v
|
|
|
116
157
|
# Clean, readable progress instead of wall of JSON
|
|
117
158
|
```
|
|
118
159
|
|
|
160
|
+
### Quota Limit Handling
|
|
161
|
+
Auto-wait when you hit API rate limits instead of failing:
|
|
162
|
+
```bash
|
|
163
|
+
# Wait automatically when hitting hourly limits
|
|
164
|
+
juno-code -b shell -s claude -i 10 --on-hourly-limit wait
|
|
165
|
+
|
|
166
|
+
# Or exit immediately (default)
|
|
167
|
+
juno-code -b shell -s claude -i 10 --on-hourly-limit raise
|
|
168
|
+
```
|
|
169
|
+
|
|
119
170
|
## Quick Start
|
|
120
171
|
|
|
121
172
|
```bash
|
|
@@ -125,11 +176,11 @@ npm install -g juno-code
|
|
|
125
176
|
# Initialize project
|
|
126
177
|
juno-code init --task "Add user authentication..." --subagent claude
|
|
127
178
|
|
|
128
|
-
# Start execution - uses .juno_task/
|
|
179
|
+
# Start execution - uses .juno_task/init.md (optimized Ralph prompt)
|
|
129
180
|
juno-code start -b shell -s claude -i 1 -v
|
|
130
181
|
|
|
131
182
|
# Or with a custom prompt
|
|
132
|
-
juno-code -b shell -s claude -i 5 -p
|
|
183
|
+
juno-code -b shell -s claude -i 5 -p 'Fix the login bug'
|
|
133
184
|
|
|
134
185
|
# Default Ralph based on kanban , without -p , juno-code uses .juno_task/prompt.md as prompt
|
|
135
186
|
juno-code -b shell -s claude -i 5 -v
|
|
@@ -137,6 +188,18 @@ juno-code -b shell -s claude -i 5 -v
|
|
|
137
188
|
|
|
138
189
|
**Key insight**: Running `juno-code start` without `-p` uses `.juno_task/prompt.md`—a production-ready prompt template that implements the Ralph method with guard rails.
|
|
139
190
|
|
|
191
|
+
### Shell safety for prompts
|
|
192
|
+
|
|
193
|
+
When prompt text contains shell metacharacters (especially backticks `` `...` `` or `$()`), prefer one of these patterns so your shell does not execute substitutions before juno-code receives the prompt:
|
|
194
|
+
|
|
195
|
+
```bash
|
|
196
|
+
juno-code -s claude -p 'literal text with `backticks` and $(dollar-parens)'
|
|
197
|
+
juno-code -s claude -f prompt.md
|
|
198
|
+
juno-code -s claude << 'EOF'
|
|
199
|
+
literal text with `backticks`
|
|
200
|
+
EOF
|
|
201
|
+
```
|
|
202
|
+
|
|
140
203
|
## CLI Reference
|
|
141
204
|
|
|
142
205
|
### Core Commands
|
|
@@ -151,34 +214,48 @@ juno-code start -b shell -s claude -i 5 -v
|
|
|
151
214
|
juno-code start -b shell -s codex -m :codex -i 10
|
|
152
215
|
|
|
153
216
|
# Direct prompt execution
|
|
154
|
-
juno-code -b shell -s claude -i 3 -p
|
|
217
|
+
juno-code -b shell -s claude -i 3 -p 'your prompt'
|
|
155
218
|
|
|
156
219
|
# Quick subagent shortcuts
|
|
157
|
-
juno-code claude
|
|
158
|
-
juno-code codex
|
|
159
|
-
juno-code gemini
|
|
220
|
+
juno-code claude 'your task'
|
|
221
|
+
juno-code codex 'your task'
|
|
222
|
+
juno-code gemini 'your task'
|
|
223
|
+
juno-code pi 'your task'
|
|
224
|
+
|
|
225
|
+
# AI-powered test generation
|
|
226
|
+
juno-code test --generate --framework vitest
|
|
227
|
+
juno-code test --run
|
|
228
|
+
|
|
229
|
+
# View and parse log files
|
|
230
|
+
juno-code view-log .juno_task/logs/claude_shell_*.log --output json-only --limit 50
|
|
160
231
|
```
|
|
161
232
|
|
|
162
233
|
### Global Options
|
|
163
234
|
|
|
164
235
|
| Flag | Description |
|
|
165
236
|
|------|-------------|
|
|
166
|
-
| `-b, --backend <type>` | Backend: `
|
|
167
|
-
| `-s, --subagent <name>` | Service: `claude`, `codex`, `gemini`, `cursor` |
|
|
237
|
+
| `-b, --backend <type>` | Backend: `shell` |
|
|
238
|
+
| `-s, --subagent <name>` | Service: `claude`, `codex`, `gemini`, `pi`, `cursor` |
|
|
168
239
|
| `-m, --model <name>` | Model (supports shorthands like `:opus`, `:haiku`) |
|
|
169
240
|
| `-i, --max-iterations <n>` | Iteration limit (-1 for unlimited) |
|
|
170
241
|
| `-p, --prompt <text>` | Prompt text (if omitted with `start`, uses prompt.md) |
|
|
242
|
+
| `-f, --prompt-file <path>` | Read prompt from a file instead of `-p` |
|
|
171
243
|
| `-v, --verbose` | Human-readable verbose output |
|
|
172
244
|
| `-r, --resume <id>` | Resume specific session |
|
|
173
245
|
| `--continue` | Continue most recent session |
|
|
246
|
+
| `--no-hooks` | Skip lifecycle hooks |
|
|
247
|
+
| `--on-hourly-limit <action>` | Quota limit behavior: `wait` (auto-retry) or `raise` (exit) |
|
|
248
|
+
| `--force-update` | Force reinstall all scripts and services |
|
|
249
|
+
| `--til-completion` | Loop until all kanban tasks are done |
|
|
250
|
+
| `--pre-run-hook <name>` | Execute named hooks before loop |
|
|
174
251
|
|
|
175
252
|
### Session Management
|
|
176
253
|
|
|
177
254
|
```bash
|
|
178
255
|
juno-code session list # View all sessions
|
|
179
256
|
juno-code session info abc123 # Session details
|
|
180
|
-
juno-code --resume abc123 -p
|
|
181
|
-
juno-code --continue -p
|
|
257
|
+
juno-code --resume abc123 -p 'continue' # Resume session
|
|
258
|
+
juno-code --continue -p 'keep going' # Continue most recent
|
|
182
259
|
```
|
|
183
260
|
|
|
184
261
|
### Feedback System
|
|
@@ -192,6 +269,192 @@ juno-code feedback --interactive
|
|
|
192
269
|
juno-code start -b shell -s claude --enable-feedback -i 10
|
|
193
270
|
```
|
|
194
271
|
|
|
272
|
+
### Skills Management
|
|
273
|
+
|
|
274
|
+
Skills are Markdown instruction files (with YAML frontmatter) installed into agent-specific directories so each coding agent reads them as context. juno-code auto-provisions skills on every CLI run.
|
|
275
|
+
|
|
276
|
+
```bash
|
|
277
|
+
# List installed skills
|
|
278
|
+
juno-code skills list
|
|
279
|
+
|
|
280
|
+
# Install/update skills
|
|
281
|
+
juno-code skills install
|
|
282
|
+
juno-code skills install --force
|
|
283
|
+
|
|
284
|
+
# Check skill status
|
|
285
|
+
juno-code skills status
|
|
286
|
+
```
|
|
287
|
+
|
|
288
|
+
**Skill groups by agent:**
|
|
289
|
+
|
|
290
|
+
| Agent | Directory | Skills |
|
|
291
|
+
|-------|-----------|--------|
|
|
292
|
+
| Claude | `.claude/skills/` | `ralph-loop`, `plan-kanban-tasks`, `understand-project` |
|
|
293
|
+
| Codex | `.agents/skills/` | `ralph-loop` |
|
|
294
|
+
| Pi | `.pi/skills/` | (planned) |
|
|
295
|
+
|
|
296
|
+
### Service Management
|
|
297
|
+
|
|
298
|
+
```bash
|
|
299
|
+
# View installed services
|
|
300
|
+
juno-code services list
|
|
301
|
+
|
|
302
|
+
# Check service status
|
|
303
|
+
juno-code services status
|
|
304
|
+
|
|
305
|
+
# Force reinstall (get latest)
|
|
306
|
+
juno-code services install --force
|
|
307
|
+
```
|
|
308
|
+
|
|
309
|
+
## Backends & Services
|
|
310
|
+
|
|
311
|
+
### Supported Services
|
|
312
|
+
|
|
313
|
+
| Service | Default Model | Shorthands |
|
|
314
|
+
|---------|---------------|------------|
|
|
315
|
+
| claude | `claude-sonnet-4-6` | `:haiku`, `:sonnet`, `:opus` |
|
|
316
|
+
| codex | `gpt-5.3-codex` | `:codex`, `:codex-mini`, `:gpt-5`, `:mini` |
|
|
317
|
+
| gemini | `gemini-2.5-pro` | `:pro`, `:flash`, `:pro-3`, `:flash-3` |
|
|
318
|
+
| pi | `anthropic/claude-sonnet-4-6` | `:pi`, `:sonnet`, `:opus`, `:gpt-5`, `:codex`, `:api-codex`, `:gemini-pro` |
|
|
319
|
+
|
|
320
|
+
> **Pi** is a multi-provider coding agent that supports Anthropic, OpenAI, Google, Groq, xAI, and more.
|
|
321
|
+
> It requires separate installation: `npm install -g @mariozechner/pi-coding-agent`
|
|
322
|
+
|
|
323
|
+
### Custom Backends
|
|
324
|
+
|
|
325
|
+
Service scripts live in `~/.juno_code/services/`. Each is a Python script that accepts standard args (`-p/--prompt`, `-m/--model`, `-v/--verbose`) and outputs JSON events to stdout.
|
|
326
|
+
|
|
327
|
+
## Hook System
|
|
328
|
+
|
|
329
|
+
Hooks allow user-defined shell commands at execution lifecycle points. Configure in `.juno_task/config.json`:
|
|
330
|
+
|
|
331
|
+
| Hook | When | Example Use |
|
|
332
|
+
|------|------|-------------|
|
|
333
|
+
| `START_RUN` | Before all iterations | Environment setup |
|
|
334
|
+
| `START_ITERATION` | Each iteration start | File size monitoring, linting |
|
|
335
|
+
| `END_ITERATION` | Each iteration end | Test execution |
|
|
336
|
+
| `END_RUN` | After all iterations | Cleanup, reports |
|
|
337
|
+
| `ON_STALE` | Stale iteration detected | Alert, auto-create task |
|
|
338
|
+
|
|
339
|
+
**Default hooks** (set up by `juno-code init`):
|
|
340
|
+
- `START_ITERATION`: CLAUDE.md / AGENTS.md file size checks, feedback cleanup
|
|
341
|
+
- `ON_STALE`: Creates a kanban warning task when no progress detected
|
|
342
|
+
|
|
343
|
+
Example config:
|
|
344
|
+
```json
|
|
345
|
+
{
|
|
346
|
+
"hooks": {
|
|
347
|
+
"START_ITERATION": {
|
|
348
|
+
"commands": [
|
|
349
|
+
"test ! -f CLAUDE.md || [ $(wc -c < CLAUDE.md) -lt 40000 ] || echo 'WARNING: CLAUDE.md exceeds 40KB'",
|
|
350
|
+
"./.juno_task/scripts/cleanup_feedback.sh"
|
|
351
|
+
]
|
|
352
|
+
},
|
|
353
|
+
"END_ITERATION": {
|
|
354
|
+
"commands": ["npm test"]
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
```
|
|
359
|
+
|
|
360
|
+
## Autonomous Execution
|
|
361
|
+
|
|
362
|
+
### run_until_completion.sh
|
|
363
|
+
|
|
364
|
+
Continuously runs juno-code until all kanban tasks are completed. Uses a do-while loop: juno-code runs at least once, then continues while tasks remain in backlog, todo, or in_progress status.
|
|
365
|
+
|
|
366
|
+
```bash
|
|
367
|
+
# Run until all tasks complete
|
|
368
|
+
./.juno_task/scripts/run_until_completion.sh -s claude -i 5 -v
|
|
369
|
+
|
|
370
|
+
# With custom backend and model
|
|
371
|
+
./.juno_task/scripts/run_until_completion.sh -b shell -s codex -m :codex -i 10
|
|
372
|
+
```
|
|
373
|
+
|
|
374
|
+
#### Stale Detection
|
|
375
|
+
|
|
376
|
+
Tracks kanban state between iterations. After 3 consecutive iterations with no task changes (configurable), executes `ON_STALE` hook and exits.
|
|
377
|
+
|
|
378
|
+
```bash
|
|
379
|
+
# Custom stale threshold
|
|
380
|
+
./.juno_task/scripts/run_until_completion.sh -s claude -i 5 --stale-threshold 5
|
|
381
|
+
|
|
382
|
+
# Disable stale checking
|
|
383
|
+
./.juno_task/scripts/run_until_completion.sh -s claude -i 5 --no-stale-check
|
|
384
|
+
```
|
|
385
|
+
|
|
386
|
+
#### Pre-run Commands & Hooks
|
|
387
|
+
|
|
388
|
+
Execute commands or named hooks before the main loop:
|
|
389
|
+
|
|
390
|
+
```bash
|
|
391
|
+
# Single pre-run command
|
|
392
|
+
./.juno_task/scripts/run_until_completion.sh --pre-run "./scripts/lint.sh" -s claude -i 5
|
|
393
|
+
|
|
394
|
+
# Named hooks from config.json
|
|
395
|
+
./.juno_task/scripts/run_until_completion.sh --pre-run-hook SLACK_SYNC -s claude -i 5
|
|
396
|
+
|
|
397
|
+
# Multiple pre-run commands (executed in order)
|
|
398
|
+
./.juno_task/scripts/run_until_completion.sh \
|
|
399
|
+
--pre-run "./scripts/sync.sh" \
|
|
400
|
+
--pre-run "npm run build" \
|
|
401
|
+
-s claude -i 5 -v
|
|
402
|
+
```
|
|
403
|
+
|
|
404
|
+
**Execution order** when both hooks and commands are specified:
|
|
405
|
+
1. Hooks from `JUNO_PRE_RUN_HOOK` env var
|
|
406
|
+
2. Hooks from `--pre-run-hook` flags (in order)
|
|
407
|
+
3. Commands from `JUNO_PRE_RUN` env var
|
|
408
|
+
4. Commands from `--pre-run` flags (in order)
|
|
409
|
+
5. Main juno-code loop begins
|
|
410
|
+
|
|
411
|
+
### Parallel Runner
|
|
412
|
+
|
|
413
|
+
Orchestrate N concurrent juno-code processes with queue management, structured output, and optional tmux visualization.
|
|
414
|
+
|
|
415
|
+
#### Input Modes
|
|
416
|
+
|
|
417
|
+
| Input | Description |
|
|
418
|
+
|-------|-------------|
|
|
419
|
+
| `--kanban T1,T2,T3` | Kanban task IDs |
|
|
420
|
+
| `--kanban-filter '--tag X --status Y'` | Query kanban, auto-extract IDs |
|
|
421
|
+
| `--kanban-filter 'ready'` | Dependency-aware: only unblocked tasks |
|
|
422
|
+
| `--items "a,b,c"` | Generic item list |
|
|
423
|
+
| `--items-file data.csv` | File input (JSONL, CSV, TSV, XLSX) |
|
|
424
|
+
|
|
425
|
+
#### Execution Modes
|
|
426
|
+
|
|
427
|
+
| Mode | Flag | Description |
|
|
428
|
+
|------|------|-------------|
|
|
429
|
+
| Headless | (default) | ThreadPoolExecutor, output to log files |
|
|
430
|
+
| Tmux Windows | `--tmux` | Each worker = tmux window |
|
|
431
|
+
| Tmux Panes | `--tmux panes` | Workers as split panes |
|
|
432
|
+
|
|
433
|
+
```bash
|
|
434
|
+
# Headless parallel execution
|
|
435
|
+
./.juno_task/scripts/parallel_runner.sh --kanban T1,T2,T3 --parallel 3
|
|
436
|
+
|
|
437
|
+
# Tmux visualization with 5 workers
|
|
438
|
+
./.juno_task/scripts/parallel_runner.sh --tmux --kanban T1,T2,T3 --parallel 5
|
|
439
|
+
|
|
440
|
+
# Process file with extraction
|
|
441
|
+
./.juno_task/scripts/parallel_runner.sh --items-file data.csv --prompt-file crawl.md --strict
|
|
442
|
+
|
|
443
|
+
# Use different AI backend
|
|
444
|
+
./.juno_task/scripts/parallel_runner.sh -s codex -m :codex --kanban T1,T2
|
|
445
|
+
|
|
446
|
+
# Session control
|
|
447
|
+
./.juno_task/scripts/parallel_runner.sh --stop --name my-batch
|
|
448
|
+
./.juno_task/scripts/parallel_runner.sh --stop-all
|
|
449
|
+
```
|
|
450
|
+
|
|
451
|
+
#### Output & Extraction
|
|
452
|
+
|
|
453
|
+
- **Per-task JSON**: `{output_dir}/{task_id}.json` with exit code, wall time, extracted response
|
|
454
|
+
- **Aggregation JSON**: All tasks merged into one file
|
|
455
|
+
- **Code block extraction**: Finds last fenced code block in output. `--strict` fails the task if not found
|
|
456
|
+
- **Pause/resume**: `touch .juno_task/scripts/logs/.pause_{name}` / remove to resume
|
|
457
|
+
|
|
195
458
|
## Slack Integration
|
|
196
459
|
|
|
197
460
|
juno-code includes built-in Slack integration for team collaboration. The system monitors Slack channels and creates kanban tasks from messages, then posts agent responses as threaded replies.
|
|
@@ -202,8 +465,6 @@ juno-code includes built-in Slack integration for team collaboration. The system
|
|
|
202
465
|
2. **Process**: The AI agent processes tasks and records responses in the kanban
|
|
203
466
|
3. **Respond**: `slack_respond.sh` sends agent responses back to Slack as threaded replies
|
|
204
467
|
|
|
205
|
-
This enables a workflow where team members can submit tasks via Slack and receive AI-generated responses without leaving their chat interface.
|
|
206
|
-
|
|
207
468
|
### Setup
|
|
208
469
|
|
|
209
470
|
1. **Create a Slack App**:
|
|
@@ -240,8 +501,6 @@ This enables a workflow where team members can submit tasks via Slack and receiv
|
|
|
240
501
|
|
|
241
502
|
### Automated Slack Workflow with Hooks
|
|
242
503
|
|
|
243
|
-
Use the `--pre-run` flag to sync with Slack before each juno-code run:
|
|
244
|
-
|
|
245
504
|
```bash
|
|
246
505
|
# Fetch Slack messages before starting work
|
|
247
506
|
./.juno_task/scripts/run_until_completion.sh \
|
|
@@ -280,8 +539,6 @@ juno-code includes built-in GitHub integration for issue tracking and automated
|
|
|
280
539
|
2. **Process**: The AI agent processes tasks and records responses in the kanban
|
|
281
540
|
3. **Respond**: `github.py respond` posts agent responses as comments on GitHub issues and closes them
|
|
282
541
|
|
|
283
|
-
This enables a workflow where team members can submit tasks via GitHub issues and receive AI-generated responses with automatic issue closure.
|
|
284
|
-
|
|
285
542
|
### Setup
|
|
286
543
|
|
|
287
544
|
1. **Create a GitHub Personal Access Token**:
|
|
@@ -316,214 +573,143 @@ This enables a workflow where team members can submit tasks via GitHub issues an
|
|
|
316
573
|
# Continuous sync mode with interval
|
|
317
574
|
./.juno_task/scripts/github.py sync --repo owner/repo --continuous --interval 600
|
|
318
575
|
|
|
319
|
-
# One-time sync
|
|
320
|
-
./.juno_task/scripts/github.py sync --repo owner/repo --once
|
|
321
|
-
|
|
322
576
|
# Dry run to preview what would be posted
|
|
323
577
|
./.juno_task/scripts/github.py respond --dry-run --verbose
|
|
324
578
|
```
|
|
325
579
|
|
|
326
|
-
### Key Features
|
|
327
|
-
|
|
328
|
-
- **Tag-based identification**: Uses `github_issue_owner_repo_123` format for O(1) lookups
|
|
329
|
-
- **State tracking**: Maintains state in `.juno_task/github/state.ndjson` and `responses.ndjson`
|
|
330
|
-
- **Automatic closure**: Issues are automatically closed after posting the agent response
|
|
331
|
-
- **Commit linking**: Includes commit hash in comment if available
|
|
332
|
-
- **Response format**: Posts `agent_response` field from completed kanban tasks
|
|
333
|
-
|
|
334
580
|
### Automated GitHub Workflow with Hooks
|
|
335
581
|
|
|
336
|
-
Use the `--pre-run` flag to sync with GitHub before each juno-code run:
|
|
337
|
-
|
|
338
|
-
```bash
|
|
339
|
-
# Fetch GitHub issues before starting work
|
|
340
|
-
./.juno_task/scripts/run_until_completion.sh \
|
|
341
|
-
--pre-run "./.juno_task/scripts/github.py fetch --repo owner/repo" \
|
|
342
|
-
-s claude -i 5 -v
|
|
343
|
-
```
|
|
344
|
-
|
|
345
|
-
Or configure hooks in `.juno_task/config.json`:
|
|
346
|
-
|
|
347
|
-
```json
|
|
348
|
-
{
|
|
349
|
-
"hooks": {
|
|
350
|
-
"GITHUB_SYNC": {
|
|
351
|
-
"commands": [
|
|
352
|
-
"./.juno_task/scripts/github.py fetch --repo owner/repo --labels bug",
|
|
353
|
-
"./.juno_task/scripts/github.py respond --tag github-issue"
|
|
354
|
-
]
|
|
355
|
-
}
|
|
356
|
-
}
|
|
357
|
-
}
|
|
358
|
-
```
|
|
359
|
-
|
|
360
|
-
Then run with the hook:
|
|
361
|
-
|
|
362
582
|
```bash
|
|
363
583
|
./.juno_task/scripts/run_until_completion.sh --pre-run-hook GITHUB_SYNC -s claude -i 5 -v
|
|
364
584
|
```
|
|
365
585
|
|
|
366
|
-
##
|
|
586
|
+
## Log Scanner
|
|
367
587
|
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
### Basic Usage
|
|
588
|
+
Proactive error detection that scans log files and auto-creates kanban bug reports:
|
|
371
589
|
|
|
372
590
|
```bash
|
|
373
|
-
#
|
|
374
|
-
./.juno_task/scripts/
|
|
375
|
-
|
|
376
|
-
# With custom backend and model
|
|
377
|
-
./.juno_task/scripts/run_until_completion.sh -b shell -s codex -m :codex -i 10
|
|
378
|
-
```
|
|
379
|
-
|
|
380
|
-
### Pre-run Commands (--pre-run)
|
|
591
|
+
# Scan for errors and create tasks
|
|
592
|
+
./.juno_task/scripts/log_scanner.sh
|
|
381
593
|
|
|
382
|
-
|
|
594
|
+
# Dry run (report only)
|
|
595
|
+
./.juno_task/scripts/log_scanner.sh --dry-run --verbose
|
|
383
596
|
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
./.juno_task/scripts/run_until_completion.sh --pre-run "./scripts/lint.sh" -s claude -i 5
|
|
597
|
+
# Check scan status
|
|
598
|
+
./.juno_task/scripts/log_scanner.sh --status
|
|
387
599
|
|
|
388
|
-
#
|
|
389
|
-
./.juno_task/scripts/
|
|
390
|
-
--pre-run "./scripts/sync.sh" \
|
|
391
|
-
--pre-run "npm run build" \
|
|
392
|
-
-s claude -i 5 -v
|
|
393
|
-
|
|
394
|
-
# Alternative: use environment variable
|
|
395
|
-
JUNO_PRE_RUN="./scripts/prepare.sh" \
|
|
396
|
-
./.juno_task/scripts/run_until_completion.sh -s claude -i 5
|
|
600
|
+
# Reset scan state (re-scan everything)
|
|
601
|
+
./.juno_task/scripts/log_scanner.sh --reset
|
|
397
602
|
```
|
|
398
603
|
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
Execute named hooks defined in `.juno_task/config.json`. Hooks group multiple commands that run together.
|
|
604
|
+
Detects Python errors (Traceback, ValueError, TypeError), Node.js errors (UnhandledPromiseRejection, ECONNREFUSED), and general patterns (FATAL, CRITICAL, PANIC, OOM). Uses ripgrep for high-performance scanning with grep fallback.
|
|
402
605
|
|
|
403
|
-
|
|
606
|
+
Use as a pre-run hook so the agent finds and fixes errors automatically:
|
|
404
607
|
```json
|
|
405
608
|
{
|
|
406
609
|
"hooks": {
|
|
407
610
|
"START_ITERATION": {
|
|
408
|
-
"commands": [
|
|
409
|
-
"./scripts/lint.sh",
|
|
410
|
-
"npm run typecheck"
|
|
411
|
-
]
|
|
412
|
-
},
|
|
413
|
-
"SLACK_SYNC": {
|
|
414
|
-
"commands": [
|
|
415
|
-
"./.juno_task/scripts/slack_fetch.sh --channel bugs",
|
|
416
|
-
"./.juno_task/scripts/slack_respond.sh"
|
|
417
|
-
]
|
|
611
|
+
"commands": ["./.juno_task/scripts/log_scanner.sh"]
|
|
418
612
|
}
|
|
419
613
|
}
|
|
420
614
|
}
|
|
421
615
|
```
|
|
422
616
|
|
|
423
|
-
**Use hooks:**
|
|
424
|
-
```bash
|
|
425
|
-
# Single hook
|
|
426
|
-
./.juno_task/scripts/run_until_completion.sh --pre-run-hook START_ITERATION -s claude -i 5
|
|
427
|
-
|
|
428
|
-
# Multiple hooks (executed in order)
|
|
429
|
-
./.juno_task/scripts/run_until_completion.sh \
|
|
430
|
-
--pre-run-hook SLACK_SYNC \
|
|
431
|
-
--pre-run-hook START_ITERATION \
|
|
432
|
-
-s claude -i 5
|
|
433
|
-
|
|
434
|
-
# Alternative: use environment variable
|
|
435
|
-
JUNO_PRE_RUN_HOOK="START_ITERATION" \
|
|
436
|
-
./.juno_task/scripts/run_until_completion.sh -s claude -i 5
|
|
437
|
-
```
|
|
438
|
-
|
|
439
|
-
### Execution Order
|
|
440
|
-
|
|
441
|
-
When both hooks and pre-run commands are specified, the execution order is:
|
|
442
|
-
1. Hooks from `JUNO_PRE_RUN_HOOK` env var
|
|
443
|
-
2. Hooks from `--pre-run-hook` flags (in order)
|
|
444
|
-
3. Commands from `JUNO_PRE_RUN` env var
|
|
445
|
-
4. Commands from `--pre-run` flags (in order)
|
|
446
|
-
5. Main juno-code loop begins
|
|
447
|
-
|
|
448
|
-
### Environment Variables
|
|
449
|
-
|
|
450
|
-
| Variable | Description |
|
|
451
|
-
|----------|-------------|
|
|
452
|
-
| `JUNO_DEBUG=true` | Show debug diagnostic messages |
|
|
453
|
-
| `JUNO_VERBOSE=true` | Show informational status messages |
|
|
454
|
-
| `JUNO_PRE_RUN` | Pre-run command (runs before --pre-run flags) |
|
|
455
|
-
| `JUNO_PRE_RUN_HOOK` | Pre-run hook name (runs before --pre-run-hook flags) |
|
|
456
|
-
| `JUNO_RUN_UNTIL_MAX_ITERATIONS` | Maximum iterations (0 = unlimited) |
|
|
457
|
-
|
|
458
617
|
## Kanban Commands
|
|
459
618
|
|
|
460
619
|
The kanban.sh script wraps juno-kanban. Here are the actual commands:
|
|
461
620
|
|
|
462
621
|
```bash
|
|
463
|
-
#
|
|
464
|
-
./.juno_task/scripts/kanban.sh
|
|
465
|
-
./.juno_task/scripts/kanban.sh list --status backlog todo in_progress
|
|
466
|
-
|
|
467
|
-
# Get task details
|
|
622
|
+
# Task CRUD
|
|
623
|
+
./.juno_task/scripts/kanban.sh create "Task body" --tags feature,backend
|
|
468
624
|
./.juno_task/scripts/kanban.sh get TASK_ID
|
|
625
|
+
./.juno_task/scripts/kanban.sh update TASK_ID --response "Fixed it" --commit abc123
|
|
626
|
+
./.juno_task/scripts/kanban.sh mark done --id TASK_ID --response "Completed, tests pass"
|
|
627
|
+
./.juno_task/scripts/kanban.sh archive TASK_ID
|
|
469
628
|
|
|
470
|
-
#
|
|
471
|
-
./.juno_task/scripts/kanban.sh
|
|
472
|
-
./.juno_task/scripts/kanban.sh
|
|
629
|
+
# List & search
|
|
630
|
+
./.juno_task/scripts/kanban.sh list --limit 5 --status backlog todo in_progress
|
|
631
|
+
./.juno_task/scripts/kanban.sh search --tag backend --status todo
|
|
473
632
|
|
|
474
|
-
#
|
|
475
|
-
./.juno_task/scripts/kanban.sh
|
|
633
|
+
# Dependencies
|
|
634
|
+
./.juno_task/scripts/kanban.sh create "Deploy" --blocked-by A1b2C3,X4y5Z6
|
|
635
|
+
./.juno_task/scripts/kanban.sh deps TASK_ID # Show blockers & dependents
|
|
636
|
+
./.juno_task/scripts/kanban.sh deps add --id T1 --blocked-by T2 # Add dependency
|
|
637
|
+
./.juno_task/scripts/kanban.sh deps remove --id T1 --blocked-by T2
|
|
638
|
+
./.juno_task/scripts/kanban.sh ready # Tasks with no unmet blockers
|
|
639
|
+
./.juno_task/scripts/kanban.sh order --scores # Topological execution order
|
|
640
|
+
|
|
641
|
+
# Merge (monorepo support)
|
|
642
|
+
./.juno_task/scripts/kanban.sh merge source/ --into target/ --strategy keep-newer
|
|
476
643
|
```
|
|
477
644
|
|
|
478
|
-
|
|
645
|
+
**Task schema**: `{id, status, body, commit_hash, agent_response, created_date, last_modified, feature_tags[], related_tasks[], blocked_by[]}`
|
|
479
646
|
|
|
480
|
-
|
|
647
|
+
**Status lifecycle**: `backlog → todo → in_progress → done → archive`
|
|
481
648
|
|
|
482
|
-
|
|
483
|
-
-
|
|
649
|
+
**Body markup** (auto-parsed on create):
|
|
650
|
+
- `[task_id]ID1, ID2[/task_id]` → `related_tasks`
|
|
651
|
+
- `[blocked_by]ID1, ID2[/blocked_by]` → `blocked_by` (synonyms: `block_by`, `block`, `parent_task`)
|
|
484
652
|
|
|
485
|
-
|
|
653
|
+
## Configuration
|
|
486
654
|
|
|
487
|
-
|
|
488
|
-
|---------|---------------|------------|
|
|
489
|
-
| claude | `claude-sonnet-4-5-20250929` | `:haiku`, `:sonnet`, `:opus` |
|
|
490
|
-
| codex | `gpt-5.3-codex` | `:codex`, `:gpt-5`, `:mini` |
|
|
491
|
-
| gemini | `gemini-2.5-pro` | `:pro`, `:flash`, `:pro-3`, `:flash-3` |
|
|
655
|
+
### Hierarchy (highest to lowest priority)
|
|
492
656
|
|
|
493
|
-
|
|
657
|
+
1. CLI arguments
|
|
658
|
+
2. Environment variables (`JUNO_CODE_*`)
|
|
659
|
+
3. Project config (`.juno_task/config.json`)
|
|
660
|
+
4. Global config files
|
|
661
|
+
5. Hardcoded defaults
|
|
494
662
|
|
|
495
|
-
|
|
663
|
+
### Project Env Bootstrap (`.env.juno`)
|
|
496
664
|
|
|
497
|
-
|
|
498
|
-
# View installed services
|
|
499
|
-
juno-code services list
|
|
665
|
+
`juno-code` now bootstraps a project env file automatically:
|
|
500
666
|
|
|
501
|
-
|
|
502
|
-
juno-code
|
|
667
|
+
- On `juno-code init`: creates an empty `.env.juno` in project root
|
|
668
|
+
- On any `juno-code` run: ensures `.env.juno` exists (creates if missing)
|
|
669
|
+
- Loads env values before execution so hooks and subagent processes receive them
|
|
670
|
+
- Supports custom env file path via `.juno_task/config.json`
|
|
671
|
+
|
|
672
|
+
Example config:
|
|
673
|
+
|
|
674
|
+
```json
|
|
675
|
+
{
|
|
676
|
+
"envFilePath": ".env.local",
|
|
677
|
+
"envFileCopied": true
|
|
678
|
+
}
|
|
503
679
|
```
|
|
504
680
|
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
681
|
+
Notes:
|
|
682
|
+
- `envFilePath`: env file to load (relative to project root or absolute path)
|
|
683
|
+
- `envFileCopied`: tracks one-time initialization from `.env.juno` to custom env path
|
|
684
|
+
- Load order: `.env.juno` first, then `envFilePath` (custom file overrides defaults)
|
|
509
685
|
|
|
510
|
-
|
|
686
|
+
### Project Structure
|
|
511
687
|
|
|
512
688
|
After `juno-code init`:
|
|
513
689
|
|
|
514
690
|
```
|
|
515
691
|
your-project/
|
|
692
|
+
├── .env.juno # Project env file auto-created and loaded on startup
|
|
516
693
|
├── .juno_task/
|
|
517
694
|
│ ├── init.md # Task breakdown (your input)
|
|
518
695
|
│ ├── prompt.md # AI instructions (Ralph-style prompt)
|
|
519
696
|
│ ├── plan.md # Progress tracking
|
|
520
|
-
│ ├── USER_FEEDBACK.md # Issue tracking
|
|
521
|
-
│ ├── config.json #
|
|
697
|
+
│ ├── USER_FEEDBACK.md # Issue tracking (write here while agent runs)
|
|
698
|
+
│ ├── config.json # Hooks, agent config, project settings
|
|
522
699
|
│ ├── scripts/ # Auto-installed utilities
|
|
523
|
-
│ │ ├── run_until_completion.sh
|
|
524
700
|
│ │ ├── kanban.sh
|
|
525
|
-
│ │
|
|
526
|
-
│
|
|
701
|
+
│ │ ├── run_until_completion.sh
|
|
702
|
+
│ │ ├── parallel_runner.sh
|
|
703
|
+
│ │ ├── log_scanner.sh
|
|
704
|
+
│ │ ├── install_requirements.sh
|
|
705
|
+
│ │ ├── slack_fetch.sh / slack_fetch.py
|
|
706
|
+
│ │ ├── slack_respond.sh / slack_respond.py
|
|
707
|
+
│ │ ├── github.py
|
|
708
|
+
│ │ └── hooks/session_counter.sh
|
|
709
|
+
│ ├── tasks/ # Kanban tasks (NDJSON)
|
|
710
|
+
│ └── logs/ # Agent session logs
|
|
711
|
+
├── .claude/skills/ # Claude agent skills (auto-provisioned)
|
|
712
|
+
├── .agents/skills/ # Codex agent skills (auto-provisioned)
|
|
527
713
|
├── CLAUDE.md # Session learnings
|
|
528
714
|
└── AGENTS.md # Agent performance
|
|
529
715
|
```
|
|
@@ -540,7 +726,26 @@ export JUNO_CODE_MAX_ITERATIONS=10
|
|
|
540
726
|
# Service-specific
|
|
541
727
|
export CODEX_HIDE_STREAM_TYPES="turn_diff,token_count"
|
|
542
728
|
export GEMINI_API_KEY=your-key
|
|
543
|
-
|
|
729
|
+
|
|
730
|
+
# Execution control
|
|
731
|
+
export JUNO_STALE_THRESHOLD=3 # Stale iteration limit
|
|
732
|
+
export JUNO_PRE_RUN="./scripts/sync.sh" # Pre-run command
|
|
733
|
+
export JUNO_PRE_RUN_HOOK="SLACK_SYNC" # Pre-run hook name
|
|
734
|
+
export JUNO_RUN_UNTIL_MAX_ITERATIONS=0 # Max iterations (0=unlimited)
|
|
735
|
+
export JUNO_SESSION_COUNTER_THRESHOLD=100 # Session length warning threshold
|
|
736
|
+
|
|
737
|
+
# Integration
|
|
738
|
+
export SLACK_BOT_TOKEN=xoxb-your-token
|
|
739
|
+
export SLACK_CHANNEL=bug-reports
|
|
740
|
+
export GITHUB_TOKEN=ghp_your-token
|
|
741
|
+
export GITHUB_REPO=owner/repo
|
|
742
|
+
|
|
743
|
+
# Debug
|
|
744
|
+
export JUNO_DEBUG=true # Enable [DEBUG] output
|
|
745
|
+
export JUNO_VERBOSE=true # Enable [INFO] output
|
|
746
|
+
|
|
747
|
+
# Pi requires the pi-coding-agent CLI installed globally
|
|
748
|
+
# npm install -g @mariozechner/pi-coding-agent
|
|
544
749
|
```
|
|
545
750
|
|
|
546
751
|
## Examples
|
|
@@ -566,19 +771,49 @@ juno-code -b shell -s claude -m :opus -p "Investigate CI failures" -i 3
|
|
|
566
771
|
|
|
567
772
|
# Stuck? Try Codex perspective
|
|
568
773
|
juno-code -b shell -s codex -p "Same investigation" -i 3
|
|
774
|
+
|
|
775
|
+
# Or use Pi with any provider's model
|
|
776
|
+
juno-code -b shell -s pi -m :sonnet -p "Same investigation" -i 3
|
|
569
777
|
```
|
|
570
778
|
|
|
571
|
-
###
|
|
779
|
+
### Parallel Batch Processing
|
|
572
780
|
|
|
573
781
|
```bash
|
|
574
|
-
#
|
|
575
|
-
|
|
782
|
+
# Process 100 kanban tasks with 5 workers
|
|
783
|
+
./.juno_task/scripts/parallel_runner.sh --kanban T1,T2,...,T100 --parallel 5
|
|
576
784
|
|
|
577
|
-
#
|
|
578
|
-
./.juno_task/scripts/
|
|
785
|
+
# Visual monitoring
|
|
786
|
+
./.juno_task/scripts/parallel_runner.sh --tmux --kanban T1,T2,T3 --parallel 3
|
|
787
|
+
|
|
788
|
+
# Process a CSV dataset
|
|
789
|
+
./.juno_task/scripts/parallel_runner.sh --items-file data.csv --prompt-file process.md --strict --file-format csv
|
|
790
|
+
```
|
|
791
|
+
|
|
792
|
+
### Dependency-Aware Workflow
|
|
793
|
+
|
|
794
|
+
```bash
|
|
795
|
+
# Create tasks with dependencies
|
|
796
|
+
./.juno_task/scripts/kanban.sh create "Setup database" --tags infra
|
|
797
|
+
./.juno_task/scripts/kanban.sh create "Build API [blocked_by]DBID[/blocked_by]" --tags backend
|
|
798
|
+
./.juno_task/scripts/kanban.sh create "Build UI [blocked_by]APIID[/blocked_by]" --tags frontend
|
|
799
|
+
|
|
800
|
+
# See what's ready to work on
|
|
801
|
+
./.juno_task/scripts/kanban.sh ready
|
|
802
|
+
|
|
803
|
+
# Execution order respecting dependencies
|
|
804
|
+
./.juno_task/scripts/kanban.sh order --scores
|
|
805
|
+
|
|
806
|
+
# Run only unblocked tasks in parallel
|
|
807
|
+
./.juno_task/scripts/parallel_runner.sh --kanban-filter 'ready' --parallel 3
|
|
808
|
+
```
|
|
579
809
|
|
|
580
|
-
|
|
581
|
-
|
|
810
|
+
### Slack-Driven Development
|
|
811
|
+
|
|
812
|
+
```bash
|
|
813
|
+
# Full automated loop: Slack → Agent → Slack
|
|
814
|
+
./.juno_task/scripts/run_until_completion.sh \
|
|
815
|
+
--pre-run-hook SLACK_SYNC \
|
|
816
|
+
-s claude -i 5 -v
|
|
582
817
|
```
|
|
583
818
|
|
|
584
819
|
## Comparison: Ralph vs juno-code
|
|
@@ -589,39 +824,17 @@ git log --oneline
|
|
|
589
824
|
| **Core Loop** | `while :; do claude; done` | Controlled iterations |
|
|
590
825
|
| **Stopping** | Ctrl+C (guesswork) | `-i N` or "until tasks done" |
|
|
591
826
|
| **Source of Truth** | Markdown files (TASKS.md, PLANNING.md) | Structured kanban over bash |
|
|
592
|
-
| **Format Integrity** | Relies on LLM instruction-following | Strict
|
|
593
|
-
| **Multiple AIs** | Claude only | Claude, Codex, Gemini, Cursor |
|
|
827
|
+
| **Format Integrity** | Relies on LLM instruction-following | Strict NDJSON, always parseable |
|
|
828
|
+
| **Multiple AIs** | Claude only | Claude, Codex, Gemini, Pi, Cursor |
|
|
829
|
+
| **Dependencies** | None | blocked_by, ready, topological sort |
|
|
830
|
+
| **Parallelism** | None | parallel_runner with N workers |
|
|
594
831
|
| **Traceability** | None | Every task → git commit |
|
|
832
|
+
| **Integrations** | None | Slack, GitHub Issues |
|
|
595
833
|
| **Hooks** | Claude-specific | Works with any backend |
|
|
834
|
+
| **Error Detection** | None | Log scanner with auto bug reports |
|
|
596
835
|
| **Verbose** | Raw JSON | Human-readable + jq-friendly |
|
|
597
836
|
| **Feedback** | None | Real-time during execution |
|
|
598
837
|
|
|
599
|
-
### Why Structured Kanban Over Markdown?
|
|
600
|
-
|
|
601
|
-
Ralph uses markdown files (TASKS.md, PLANNING.md) as its source of truth. This works for **one-time tasks** like "migrate the whole repo from TypeScript to Rust."
|
|
602
|
-
|
|
603
|
-
But for **iterative development**, markdown files break down:
|
|
604
|
-
|
|
605
|
-
- **No strict format**: LLMs can corrupt the structure, add extra formatting, forget sections
|
|
606
|
-
- **Context bloat**: Long plan.md files confuse agents and waste tokens
|
|
607
|
-
- **No query capability**: Can't ask "what's in progress?" without parsing prose
|
|
608
|
-
- **No task isolation**: Changes to one task can accidentally affect others
|
|
609
|
-
|
|
610
|
-
juno-code uses **structured kanban over bash**:
|
|
611
|
-
|
|
612
|
-
```bash
|
|
613
|
-
# Always parseable - the format can never break
|
|
614
|
-
./.juno_task/scripts/kanban.sh list --status in_progress
|
|
615
|
-
|
|
616
|
-
# Query specific tasks
|
|
617
|
-
./.juno_task/scripts/kanban.sh get TASK_ID
|
|
618
|
-
|
|
619
|
-
# Tasks stored as NDJSON - one line per task
|
|
620
|
-
# Each task is self-contained and isolated
|
|
621
|
-
```
|
|
622
|
-
|
|
623
|
-
This lets juno-code scale Ralph's insight (AI works better in loops) to **thousands of tasks** without the agent losing track or corrupting state.
|
|
624
|
-
|
|
625
838
|
## Troubleshooting
|
|
626
839
|
|
|
627
840
|
### Service scripts not updating
|
|
@@ -633,7 +846,7 @@ juno-code services install --force
|
|
|
633
846
|
```bash
|
|
634
847
|
# Verify with verbose
|
|
635
848
|
juno-code -v -b shell -s codex -m :codex -p "test"
|
|
636
|
-
# Check stderr for: "Executing: python3 ~/.juno_code/services/codex.py ... -m
|
|
849
|
+
# Check stderr for: "Executing: python3 ~/.juno_code/services/codex.py ... -m gpt-5.3-codex"
|
|
637
850
|
```
|
|
638
851
|
|
|
639
852
|
### Kanban not finding tasks
|
|
@@ -641,6 +854,43 @@ juno-code -v -b shell -s codex -m :codex -p "test"
|
|
|
641
854
|
./.juno_task/scripts/kanban.sh list --status backlog todo in_progress
|
|
642
855
|
```
|
|
643
856
|
|
|
857
|
+
### Skills not appearing
|
|
858
|
+
```bash
|
|
859
|
+
juno-code skills list
|
|
860
|
+
juno-code skills install --force
|
|
861
|
+
```
|
|
862
|
+
|
|
863
|
+
### Python environment issues
|
|
864
|
+
```bash
|
|
865
|
+
# Force reinstall Python dependencies
|
|
866
|
+
./.juno_task/scripts/install_requirements.sh --force-update
|
|
867
|
+
```
|
|
868
|
+
|
|
869
|
+
## Build from Source
|
|
870
|
+
|
|
871
|
+
```bash
|
|
872
|
+
cd juno-code
|
|
873
|
+
|
|
874
|
+
# Build
|
|
875
|
+
npm run build
|
|
876
|
+
|
|
877
|
+
# Build as exp-juno-code (local testing)
|
|
878
|
+
npm run build:exp
|
|
879
|
+
|
|
880
|
+
# Remove exp-juno-code
|
|
881
|
+
npm run uninstall:exp
|
|
882
|
+
|
|
883
|
+
# Run tests
|
|
884
|
+
npm test # Fast tests
|
|
885
|
+
npm run test:full # Full suite
|
|
886
|
+
npm run test:coverage # With coverage
|
|
887
|
+
|
|
888
|
+
# Lint & format
|
|
889
|
+
npm run lint
|
|
890
|
+
npm run format:check
|
|
891
|
+
npm run typecheck
|
|
892
|
+
```
|
|
893
|
+
|
|
644
894
|
## Credits
|
|
645
895
|
|
|
646
896
|
juno-code is inspired by [Geoffrey Huntley's Ralph Method](https://ghuntley.com/ralph/)—the insight that AI delivers production software through iterative refinement. juno-code adds the structure that makes Ralph sustainable for real development work.
|