juno-code 1.0.49 → 1.0.51
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 +508 -202
- package/dist/bin/cli.d.mts +1 -1
- package/dist/bin/cli.d.ts +1 -1
- package/dist/bin/cli.js +3332 -1421
- package/dist/bin/cli.js.map +1 -1
- package/dist/bin/cli.mjs +3316 -1405
- package/dist/bin/cli.mjs.map +1 -1
- package/dist/bin/feedback-collector.js.map +1 -1
- package/dist/bin/feedback-collector.mjs.map +1 -1
- package/dist/index.d.mts +56 -19
- package/dist/index.d.ts +56 -19
- package/dist/index.js +240 -36
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +240 -36
- package/dist/index.mjs.map +1 -1
- package/dist/templates/scripts/install_requirements.sh +55 -5
- package/dist/templates/scripts/kanban.sh +11 -0
- package/dist/templates/services/README.md +23 -4
- package/dist/templates/services/__pycache__/pi.cpython-313.pyc +0 -0
- package/dist/templates/services/pi.py +1933 -262
- package/dist/templates/skills/claude/kanban-workflow/SKILL.md +138 -0
- package/dist/templates/skills/claude/plan-kanban-tasks/SKILL.md +1 -1
- package/dist/templates/skills/claude/ralph-loop/scripts/kanban.sh +11 -0
- package/dist/templates/skills/claude/understand-project/SKILL.md +1 -1
- 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/scripts/kanban.sh +11 -0
- package/dist/templates/skills/codex/understand-project/SKILL.md +46 -0
- package/dist/templates/skills/pi/kanban-workflow/SKILL.md +139 -0
- package/dist/templates/skills/pi/plan-kanban-tasks/SKILL.md +1 -1
- package/dist/templates/skills/pi/ralph-loop/SKILL.md +4 -0
- package/dist/templates/skills/pi/understand-project/SKILL.md +1 -1
- package/package.json +7 -5
package/README.md
CHANGED
|
@@ -73,7 +73,7 @@ juno-code -b shell -s claude -m :opus -i 5 -v
|
|
|
73
73
|
./.juno_task/scripts/run_until_completion.sh -s claude -i 1 -v
|
|
74
74
|
|
|
75
75
|
# Unlimited (like Ralph) - when you really want that
|
|
76
|
-
juno-code -b shell -s claude
|
|
76
|
+
juno-code -b shell -s claude
|
|
77
77
|
```
|
|
78
78
|
|
|
79
79
|
### Task Tracking: Structured, Not Prose
|
|
@@ -89,6 +89,25 @@ Built-in kanban via [juno-kanban](https://pypi.org/project/juno-kanban/). Unlike
|
|
|
89
89
|
./.juno_task/scripts/kanban.sh list --limit 5 # Shows only what matters
|
|
90
90
|
```
|
|
91
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
|
+
|
|
92
111
|
### Backend Choice: Use Any AI
|
|
93
112
|
Switch between Claude, Codex, Gemini, Pi, or Cursor with one flag:
|
|
94
113
|
```bash
|
|
@@ -99,6 +118,22 @@ juno-code -b shell -s gemini -m :flash -i 1 -v
|
|
|
99
118
|
juno-code -b shell -s pi -m :sonnet -i 1 -v
|
|
100
119
|
```
|
|
101
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
|
|
135
|
+
```
|
|
136
|
+
|
|
102
137
|
### Full Traceability: Every Change Tracked
|
|
103
138
|
- Every task links to a git commit
|
|
104
139
|
- Jump to any point in development history
|
|
@@ -141,11 +176,11 @@ npm install -g juno-code
|
|
|
141
176
|
# Initialize project
|
|
142
177
|
juno-code init --task "Add user authentication..." --subagent claude
|
|
143
178
|
|
|
144
|
-
# Start execution - uses .juno_task/
|
|
179
|
+
# Start execution - uses .juno_task/init.md (optimized Ralph prompt)
|
|
145
180
|
juno-code start -b shell -s claude -i 1 -v
|
|
146
181
|
|
|
147
182
|
# Or with a custom prompt
|
|
148
|
-
juno-code -b shell -s claude -i 5 -p
|
|
183
|
+
juno-code -b shell -s claude -i 5 -p 'Fix the login bug'
|
|
149
184
|
|
|
150
185
|
# Default Ralph based on kanban , without -p , juno-code uses .juno_task/prompt.md as prompt
|
|
151
186
|
juno-code -b shell -s claude -i 5 -v
|
|
@@ -153,6 +188,18 @@ juno-code -b shell -s claude -i 5 -v
|
|
|
153
188
|
|
|
154
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.
|
|
155
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
|
+
|
|
156
203
|
## CLI Reference
|
|
157
204
|
|
|
158
205
|
### Core Commands
|
|
@@ -167,13 +214,20 @@ juno-code start -b shell -s claude -i 5 -v
|
|
|
167
214
|
juno-code start -b shell -s codex -m :codex -i 10
|
|
168
215
|
|
|
169
216
|
# Direct prompt execution
|
|
170
|
-
juno-code -b shell -s claude -i 3 -p
|
|
217
|
+
juno-code -b shell -s claude -i 3 -p 'your prompt'
|
|
171
218
|
|
|
172
219
|
# Quick subagent shortcuts
|
|
173
|
-
juno-code claude
|
|
174
|
-
juno-code codex
|
|
175
|
-
juno-code gemini
|
|
176
|
-
juno-code pi
|
|
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
|
+
# Pi live interactive run (auto-exits on non-aborted completion)
|
|
226
|
+
juno-code pi --live -p '/skill:ralph-loop' -i 1
|
|
227
|
+
|
|
228
|
+
# AI-powered test generation
|
|
229
|
+
juno-code test --generate --framework vitest
|
|
230
|
+
juno-code test --run
|
|
177
231
|
|
|
178
232
|
# View and parse log files
|
|
179
233
|
juno-code view-log .juno_task/logs/claude_shell_*.log --output json-only --limit 50
|
|
@@ -183,7 +237,7 @@ juno-code view-log .juno_task/logs/claude_shell_*.log --output json-only --limit
|
|
|
183
237
|
|
|
184
238
|
| Flag | Description |
|
|
185
239
|
|------|-------------|
|
|
186
|
-
| `-b, --backend <type>` | Backend: `
|
|
240
|
+
| `-b, --backend <type>` | Backend: `shell` |
|
|
187
241
|
| `-s, --subagent <name>` | Service: `claude`, `codex`, `gemini`, `pi`, `cursor` |
|
|
188
242
|
| `-m, --model <name>` | Model (supports shorthands like `:opus`, `:haiku`) |
|
|
189
243
|
| `-i, --max-iterations <n>` | Iteration limit (-1 for unlimited) |
|
|
@@ -192,6 +246,7 @@ juno-code view-log .juno_task/logs/claude_shell_*.log --output json-only --limit
|
|
|
192
246
|
| `-v, --verbose` | Human-readable verbose output |
|
|
193
247
|
| `-r, --resume <id>` | Resume specific session |
|
|
194
248
|
| `--continue` | Continue most recent session |
|
|
249
|
+
| `--live` | Pi-only: run Pi in interactive TUI mode with auto-exit on non-aborted completion |
|
|
195
250
|
| `--no-hooks` | Skip lifecycle hooks |
|
|
196
251
|
| `--on-hourly-limit <action>` | Quota limit behavior: `wait` (auto-retry) or `raise` (exit) |
|
|
197
252
|
| `--force-update` | Force reinstall all scripts and services |
|
|
@@ -201,12 +256,44 @@ juno-code view-log .juno_task/logs/claude_shell_*.log --output json-only --limit
|
|
|
201
256
|
### Session Management
|
|
202
257
|
|
|
203
258
|
```bash
|
|
204
|
-
juno-code session list
|
|
205
|
-
juno-code session info abc123
|
|
206
|
-
juno-code --resume abc123 -p
|
|
207
|
-
juno-code --continue -p
|
|
259
|
+
juno-code session list # View all sessions
|
|
260
|
+
juno-code session info abc123 # Session details
|
|
261
|
+
juno-code --resume abc123 -p 'continue' # Resume session
|
|
262
|
+
juno-code --continue -p 'keep going' # Continue most recent (backend-native)
|
|
263
|
+
juno-code continue 'next prompt' # Reuse last session id + runtime settings snapshot
|
|
264
|
+
```
|
|
265
|
+
|
|
266
|
+
Each `juno-code` run also appends execution history to:
|
|
267
|
+
|
|
268
|
+
- `.juno_task/session_history.json` (unlimited, newest-first)
|
|
269
|
+
|
|
270
|
+
Per-run entries include: initial prompt + timestamp, subagent/model/settings, total cost, turn/message counts, session IDs, and last-message timestamp.
|
|
271
|
+
|
|
272
|
+
CLI run summaries also surface these fields live in the terminal:
|
|
273
|
+
- `Statistics -> Total Cost`
|
|
274
|
+
- `Statistics -> Completed At`
|
|
275
|
+
- `Statistics -> Average Duration` (humanized unit: ms/s/m/h)
|
|
276
|
+
- `Session ID(s)` entries with per-session cost when available
|
|
277
|
+
|
|
278
|
+
For `juno-code continue`, the latest session context is persisted into the project env file (`.env.juno` by default) using **shell-scoped keys** so panes/tabs do not overwrite each other:
|
|
279
|
+
- `JUNO_CODE_LAST_SESSION_ID_SCOPE_<HASH>`
|
|
280
|
+
- `JUNO_CODE_LAST_EXECUTION_SETTINGS_SCOPE_<HASH>` (JSON runtime-settings snapshot)
|
|
281
|
+
|
|
282
|
+
Scope detection prefers terminal markers (for example `TMUX_PANE`, `WEZTERM_PANE`, `TERM_SESSION_ID`) and falls back to the parent shell PID. You can override scope resolution explicitly with `JUNO_CODE_CONTINUE_SCOPE=<name>`.
|
|
283
|
+
|
|
284
|
+
Short help text for scripts that need pane-scoped continue state:
|
|
285
|
+
- Session key pattern: `JUNO_CODE_LAST_SESSION_ID_SCOPE_<HASH>`
|
|
286
|
+
- Settings key pattern: `JUNO_CODE_LAST_EXECUTION_SETTINGS_SCOPE_<HASH>`
|
|
287
|
+
- Deterministic override: set `JUNO_CODE_CONTINUE_SCOPE=<your-pane-id>` before running `juno-code` so external scripts can target a stable scope name across runs.
|
|
288
|
+
|
|
289
|
+
Script endpoint for hash/status lookups:
|
|
290
|
+
```bash
|
|
291
|
+
juno-code continue-scope --json # current scope hash + status
|
|
292
|
+
juno-code continue-scope A1B2C3 --json # lookup by short hash prefix (5-6 chars)
|
|
208
293
|
```
|
|
209
294
|
|
|
295
|
+
`continue-scope` returns `status` as one of: `running`, `finished`, `not_found`, `error`.
|
|
296
|
+
|
|
210
297
|
### Feedback System
|
|
211
298
|
|
|
212
299
|
```bash
|
|
@@ -218,6 +305,224 @@ juno-code feedback --interactive
|
|
|
218
305
|
juno-code start -b shell -s claude --enable-feedback -i 10
|
|
219
306
|
```
|
|
220
307
|
|
|
308
|
+
### Skills Management
|
|
309
|
+
|
|
310
|
+
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.
|
|
311
|
+
|
|
312
|
+
```bash
|
|
313
|
+
# List installed skills
|
|
314
|
+
juno-code skills list
|
|
315
|
+
|
|
316
|
+
# Install/update skills
|
|
317
|
+
juno-code skills install
|
|
318
|
+
juno-code skills install --force
|
|
319
|
+
|
|
320
|
+
# Check skill status
|
|
321
|
+
juno-code skills status
|
|
322
|
+
```
|
|
323
|
+
|
|
324
|
+
**Skill groups by agent:**
|
|
325
|
+
|
|
326
|
+
| Agent | Directory | Skills |
|
|
327
|
+
|-------|-----------|--------|
|
|
328
|
+
| Claude | `.claude/skills/` | `kanban-workflow`, `ralph-loop`, `plan-kanban-tasks`, `understand-project` |
|
|
329
|
+
| Codex | `.agents/skills/` | `kanban-workflow`, `ralph-loop`, `plan-kanban-tasks`, `understand-project` |
|
|
330
|
+
| Pi | `.pi/skills/` | `kanban-workflow`, `ralph-loop`, `plan-kanban-tasks`, `understand-project` |
|
|
331
|
+
|
|
332
|
+
### Service Management
|
|
333
|
+
|
|
334
|
+
```bash
|
|
335
|
+
# View installed services
|
|
336
|
+
juno-code services list
|
|
337
|
+
|
|
338
|
+
# Check service status
|
|
339
|
+
juno-code services status
|
|
340
|
+
|
|
341
|
+
# Force reinstall (get latest)
|
|
342
|
+
juno-code services install --force
|
|
343
|
+
```
|
|
344
|
+
|
|
345
|
+
### Auth Management (Codex → Pi)
|
|
346
|
+
|
|
347
|
+
```bash
|
|
348
|
+
# Import default Codex auth into Pi auth store
|
|
349
|
+
juno-code auth import-codex
|
|
350
|
+
|
|
351
|
+
# Use explicit input/output paths (useful for account switching/backup files)
|
|
352
|
+
juno-code auth import-codex --input ~/.codex/auth.json --output ~/.pi/agent/auth.json
|
|
353
|
+
```
|
|
354
|
+
|
|
355
|
+
This command translates Codex CLI credentials to Pi's `auth.json` format (`type: "oauth"`) and writes/updates the `openai-codex` provider entry.
|
|
356
|
+
|
|
357
|
+
## Backends & Services
|
|
358
|
+
|
|
359
|
+
### Supported Services
|
|
360
|
+
|
|
361
|
+
| Service | Default Model | Shorthands |
|
|
362
|
+
|---------|---------------|------------|
|
|
363
|
+
| claude | `claude-sonnet-4-6` | `:haiku`, `:sonnet`, `:opus` |
|
|
364
|
+
| codex | `gpt-5.3-codex` | `:codex`, `:codex-mini`, `:gpt-5`, `:mini` |
|
|
365
|
+
| gemini | `gemini-2.5-pro` | `:pro`, `:flash`, `:pro-3`, `:flash-3` |
|
|
366
|
+
| pi | `anthropic/claude-sonnet-4-6` | `:pi`, `:sonnet`, `:opus`, `:gpt-5`, `:codex`, `:api-codex`, `:codex-spark`, `:api-codex-spark`, `:gemini-pro` |
|
|
367
|
+
|
|
368
|
+
> **Pi** is a multi-provider coding agent that supports Anthropic, OpenAI, Google, Groq, xAI, and more.
|
|
369
|
+
> It requires separate installation: `npm install -g @mariozechner/pi-coding-agent`
|
|
370
|
+
|
|
371
|
+
### Pi Live Mode (`--live`)
|
|
372
|
+
|
|
373
|
+
Use live mode when you want Pi's interactive TUI while keeping juno-code iteration hooks/statistics.
|
|
374
|
+
|
|
375
|
+
```bash
|
|
376
|
+
# Canonical live flow
|
|
377
|
+
juno-code pi --live -p '/skill:ralph-loop' -i 1
|
|
378
|
+
|
|
379
|
+
# If :pi default model is unavailable in your Pi provider setup, pick an explicit available model
|
|
380
|
+
juno-code pi --live -m :api-codex -p '/skill:ralph-loop' -i 1
|
|
381
|
+
```
|
|
382
|
+
|
|
383
|
+
Notes:
|
|
384
|
+
- `--live` is validated as **Pi-only** (`juno-code pi ...`).
|
|
385
|
+
- `--live` requires extensions enabled (`--no-extensions` is incompatible).
|
|
386
|
+
- Live auto-exit is triggered on non-aborted `agent_end` only. Pressing `Esc` to interrupt the current run keeps Pi open so you can continue interacting.
|
|
387
|
+
- To manually leave Pi and return control to juno-code hooks/loop, use Pi's normal exit keys (for example `Ctrl+C` twice quickly or `Ctrl+D` on an empty editor).
|
|
388
|
+
- Best experience is an interactive terminal (TTY) so Pi TUI can manage screen state cleanly.
|
|
389
|
+
- Pi TUI depends on the Node runtime used to launch Pi; use a modern Node version (Node 20+) in PATH.
|
|
390
|
+
|
|
391
|
+
### Custom Backends
|
|
392
|
+
|
|
393
|
+
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.
|
|
394
|
+
|
|
395
|
+
## Hook System
|
|
396
|
+
|
|
397
|
+
Hooks allow user-defined shell commands at execution lifecycle points. Configure in `.juno_task/config.json`:
|
|
398
|
+
|
|
399
|
+
| Hook | When | Example Use |
|
|
400
|
+
|------|------|-------------|
|
|
401
|
+
| `START_RUN` | Before all iterations | Environment setup |
|
|
402
|
+
| `START_ITERATION` | Each iteration start | File size monitoring, linting |
|
|
403
|
+
| `END_ITERATION` | Each iteration end | Test execution |
|
|
404
|
+
| `END_RUN` | After all iterations | Cleanup, reports |
|
|
405
|
+
| `ON_STALE` | Stale iteration detected | Alert, auto-create task |
|
|
406
|
+
|
|
407
|
+
**Default hooks** (set up by `juno-code init`):
|
|
408
|
+
- `START_ITERATION`: CLAUDE.md / AGENTS.md file size checks, feedback cleanup
|
|
409
|
+
- `ON_STALE`: Creates a kanban warning task when no progress detected
|
|
410
|
+
|
|
411
|
+
Example config:
|
|
412
|
+
```json
|
|
413
|
+
{
|
|
414
|
+
"hooks": {
|
|
415
|
+
"START_ITERATION": {
|
|
416
|
+
"commands": [
|
|
417
|
+
"test ! -f CLAUDE.md || [ $(wc -c < CLAUDE.md) -lt 40000 ] || echo 'WARNING: CLAUDE.md exceeds 40KB'",
|
|
418
|
+
"./.juno_task/scripts/cleanup_feedback.sh"
|
|
419
|
+
]
|
|
420
|
+
},
|
|
421
|
+
"END_ITERATION": {
|
|
422
|
+
"commands": ["npm test"]
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
}
|
|
426
|
+
```
|
|
427
|
+
|
|
428
|
+
## Autonomous Execution
|
|
429
|
+
|
|
430
|
+
### run_until_completion.sh
|
|
431
|
+
|
|
432
|
+
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.
|
|
433
|
+
|
|
434
|
+
```bash
|
|
435
|
+
# Run until all tasks complete
|
|
436
|
+
./.juno_task/scripts/run_until_completion.sh -s claude -i 5 -v
|
|
437
|
+
|
|
438
|
+
# With custom backend and model
|
|
439
|
+
./.juno_task/scripts/run_until_completion.sh -b shell -s codex -m :codex -i 10
|
|
440
|
+
```
|
|
441
|
+
|
|
442
|
+
#### Stale Detection
|
|
443
|
+
|
|
444
|
+
Tracks kanban state between iterations. After 3 consecutive iterations with no task changes (configurable), executes `ON_STALE` hook and exits.
|
|
445
|
+
|
|
446
|
+
```bash
|
|
447
|
+
# Custom stale threshold
|
|
448
|
+
./.juno_task/scripts/run_until_completion.sh -s claude -i 5 --stale-threshold 5
|
|
449
|
+
|
|
450
|
+
# Disable stale checking
|
|
451
|
+
./.juno_task/scripts/run_until_completion.sh -s claude -i 5 --no-stale-check
|
|
452
|
+
```
|
|
453
|
+
|
|
454
|
+
#### Pre-run Commands & Hooks
|
|
455
|
+
|
|
456
|
+
Execute commands or named hooks before the main loop:
|
|
457
|
+
|
|
458
|
+
```bash
|
|
459
|
+
# Single pre-run command
|
|
460
|
+
./.juno_task/scripts/run_until_completion.sh --pre-run "./scripts/lint.sh" -s claude -i 5
|
|
461
|
+
|
|
462
|
+
# Named hooks from config.json
|
|
463
|
+
./.juno_task/scripts/run_until_completion.sh --pre-run-hook SLACK_SYNC -s claude -i 5
|
|
464
|
+
|
|
465
|
+
# Multiple pre-run commands (executed in order)
|
|
466
|
+
./.juno_task/scripts/run_until_completion.sh \
|
|
467
|
+
--pre-run "./scripts/sync.sh" \
|
|
468
|
+
--pre-run "npm run build" \
|
|
469
|
+
-s claude -i 5 -v
|
|
470
|
+
```
|
|
471
|
+
|
|
472
|
+
**Execution order** when both hooks and commands are specified:
|
|
473
|
+
1. Hooks from `JUNO_PRE_RUN_HOOK` env var
|
|
474
|
+
2. Hooks from `--pre-run-hook` flags (in order)
|
|
475
|
+
3. Commands from `JUNO_PRE_RUN` env var
|
|
476
|
+
4. Commands from `--pre-run` flags (in order)
|
|
477
|
+
5. Main juno-code loop begins
|
|
478
|
+
|
|
479
|
+
### Parallel Runner
|
|
480
|
+
|
|
481
|
+
Orchestrate N concurrent juno-code processes with queue management, structured output, and optional tmux visualization.
|
|
482
|
+
|
|
483
|
+
#### Input Modes
|
|
484
|
+
|
|
485
|
+
| Input | Description |
|
|
486
|
+
|-------|-------------|
|
|
487
|
+
| `--kanban T1,T2,T3` | Kanban task IDs |
|
|
488
|
+
| `--kanban-filter '--tag X --status Y'` | Query kanban, auto-extract IDs |
|
|
489
|
+
| `--kanban-filter 'ready'` | Dependency-aware: only unblocked tasks |
|
|
490
|
+
| `--items "a,b,c"` | Generic item list |
|
|
491
|
+
| `--items-file data.csv` | File input (JSONL, CSV, TSV, XLSX) |
|
|
492
|
+
|
|
493
|
+
#### Execution Modes
|
|
494
|
+
|
|
495
|
+
| Mode | Flag | Description |
|
|
496
|
+
|------|------|-------------|
|
|
497
|
+
| Headless | (default) | ThreadPoolExecutor, output to log files |
|
|
498
|
+
| Tmux Windows | `--tmux` | Each worker = tmux window |
|
|
499
|
+
| Tmux Panes | `--tmux panes` | Workers as split panes |
|
|
500
|
+
|
|
501
|
+
```bash
|
|
502
|
+
# Headless parallel execution
|
|
503
|
+
./.juno_task/scripts/parallel_runner.sh --kanban T1,T2,T3 --parallel 3
|
|
504
|
+
|
|
505
|
+
# Tmux visualization with 5 workers
|
|
506
|
+
./.juno_task/scripts/parallel_runner.sh --tmux --kanban T1,T2,T3 --parallel 5
|
|
507
|
+
|
|
508
|
+
# Process file with extraction
|
|
509
|
+
./.juno_task/scripts/parallel_runner.sh --items-file data.csv --prompt-file crawl.md --strict
|
|
510
|
+
|
|
511
|
+
# Use different AI backend
|
|
512
|
+
./.juno_task/scripts/parallel_runner.sh -s codex -m :codex --kanban T1,T2
|
|
513
|
+
|
|
514
|
+
# Session control
|
|
515
|
+
./.juno_task/scripts/parallel_runner.sh --stop --name my-batch
|
|
516
|
+
./.juno_task/scripts/parallel_runner.sh --stop-all
|
|
517
|
+
```
|
|
518
|
+
|
|
519
|
+
#### Output & Extraction
|
|
520
|
+
|
|
521
|
+
- **Per-task JSON**: `{output_dir}/{task_id}.json` with exit code, wall time, extracted response
|
|
522
|
+
- **Aggregation JSON**: All tasks merged into one file
|
|
523
|
+
- **Code block extraction**: Finds last fenced code block in output. `--strict` fails the task if not found
|
|
524
|
+
- **Pause/resume**: `touch .juno_task/scripts/logs/.pause_{name}` / remove to resume
|
|
525
|
+
|
|
221
526
|
## Slack Integration
|
|
222
527
|
|
|
223
528
|
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.
|
|
@@ -228,8 +533,6 @@ juno-code includes built-in Slack integration for team collaboration. The system
|
|
|
228
533
|
2. **Process**: The AI agent processes tasks and records responses in the kanban
|
|
229
534
|
3. **Respond**: `slack_respond.sh` sends agent responses back to Slack as threaded replies
|
|
230
535
|
|
|
231
|
-
This enables a workflow where team members can submit tasks via Slack and receive AI-generated responses without leaving their chat interface.
|
|
232
|
-
|
|
233
536
|
### Setup
|
|
234
537
|
|
|
235
538
|
1. **Create a Slack App**:
|
|
@@ -266,8 +569,6 @@ This enables a workflow where team members can submit tasks via Slack and receiv
|
|
|
266
569
|
|
|
267
570
|
### Automated Slack Workflow with Hooks
|
|
268
571
|
|
|
269
|
-
Use the `--pre-run` flag to sync with Slack before each juno-code run:
|
|
270
|
-
|
|
271
572
|
```bash
|
|
272
573
|
# Fetch Slack messages before starting work
|
|
273
574
|
./.juno_task/scripts/run_until_completion.sh \
|
|
@@ -306,8 +607,6 @@ juno-code includes built-in GitHub integration for issue tracking and automated
|
|
|
306
607
|
2. **Process**: The AI agent processes tasks and records responses in the kanban
|
|
307
608
|
3. **Respond**: `github.py respond` posts agent responses as comments on GitHub issues and closes them
|
|
308
609
|
|
|
309
|
-
This enables a workflow where team members can submit tasks via GitHub issues and receive AI-generated responses with automatic issue closure.
|
|
310
|
-
|
|
311
610
|
### Setup
|
|
312
611
|
|
|
313
612
|
1. **Create a GitHub Personal Access Token**:
|
|
@@ -342,218 +641,167 @@ This enables a workflow where team members can submit tasks via GitHub issues an
|
|
|
342
641
|
# Continuous sync mode with interval
|
|
343
642
|
./.juno_task/scripts/github.py sync --repo owner/repo --continuous --interval 600
|
|
344
643
|
|
|
345
|
-
# One-time sync
|
|
346
|
-
./.juno_task/scripts/github.py sync --repo owner/repo --once
|
|
347
|
-
|
|
348
644
|
# Dry run to preview what would be posted
|
|
349
645
|
./.juno_task/scripts/github.py respond --dry-run --verbose
|
|
350
646
|
```
|
|
351
647
|
|
|
352
|
-
### Key Features
|
|
353
|
-
|
|
354
|
-
- **Tag-based identification**: Uses `github_issue_owner_repo_123` format for O(1) lookups
|
|
355
|
-
- **State tracking**: Maintains state in `.juno_task/github/state.ndjson` and `responses.ndjson`
|
|
356
|
-
- **Automatic closure**: Issues are automatically closed after posting the agent response
|
|
357
|
-
- **Commit linking**: Includes commit hash in comment if available
|
|
358
|
-
- **Response format**: Posts `agent_response` field from completed kanban tasks
|
|
359
|
-
|
|
360
648
|
### Automated GitHub Workflow with Hooks
|
|
361
649
|
|
|
362
|
-
Use the `--pre-run` flag to sync with GitHub before each juno-code run:
|
|
363
|
-
|
|
364
|
-
```bash
|
|
365
|
-
# Fetch GitHub issues before starting work
|
|
366
|
-
./.juno_task/scripts/run_until_completion.sh \
|
|
367
|
-
--pre-run "./.juno_task/scripts/github.py fetch --repo owner/repo" \
|
|
368
|
-
-s claude -i 5 -v
|
|
369
|
-
```
|
|
370
|
-
|
|
371
|
-
Or configure hooks in `.juno_task/config.json`:
|
|
372
|
-
|
|
373
|
-
```json
|
|
374
|
-
{
|
|
375
|
-
"hooks": {
|
|
376
|
-
"GITHUB_SYNC": {
|
|
377
|
-
"commands": [
|
|
378
|
-
"./.juno_task/scripts/github.py fetch --repo owner/repo --labels bug",
|
|
379
|
-
"./.juno_task/scripts/github.py respond --tag github-issue"
|
|
380
|
-
]
|
|
381
|
-
}
|
|
382
|
-
}
|
|
383
|
-
}
|
|
384
|
-
```
|
|
385
|
-
|
|
386
|
-
Then run with the hook:
|
|
387
|
-
|
|
388
650
|
```bash
|
|
389
651
|
./.juno_task/scripts/run_until_completion.sh --pre-run-hook GITHUB_SYNC -s claude -i 5 -v
|
|
390
652
|
```
|
|
391
653
|
|
|
392
|
-
##
|
|
393
|
-
|
|
394
|
-
The `run_until_completion.sh` script continuously runs juno-code until all kanban tasks are completed. It uses a do-while loop pattern: juno-code runs at least once, then continues while tasks remain in backlog, todo, or in_progress status.
|
|
654
|
+
## Log Scanner
|
|
395
655
|
|
|
396
|
-
|
|
656
|
+
Proactive error detection that scans log files and auto-creates kanban bug reports:
|
|
397
657
|
|
|
398
658
|
```bash
|
|
399
|
-
#
|
|
400
|
-
./.juno_task/scripts/
|
|
401
|
-
|
|
402
|
-
# With custom backend and model
|
|
403
|
-
./.juno_task/scripts/run_until_completion.sh -b shell -s codex -m :codex -i 10
|
|
404
|
-
```
|
|
405
|
-
|
|
406
|
-
### Pre-run Commands (--pre-run)
|
|
659
|
+
# Scan for errors and create tasks
|
|
660
|
+
./.juno_task/scripts/log_scanner.sh
|
|
407
661
|
|
|
408
|
-
|
|
662
|
+
# Dry run (report only)
|
|
663
|
+
./.juno_task/scripts/log_scanner.sh --dry-run --verbose
|
|
409
664
|
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
./.juno_task/scripts/run_until_completion.sh --pre-run "./scripts/lint.sh" -s claude -i 5
|
|
413
|
-
|
|
414
|
-
# Multiple pre-run commands (executed in order)
|
|
415
|
-
./.juno_task/scripts/run_until_completion.sh \
|
|
416
|
-
--pre-run "./scripts/sync.sh" \
|
|
417
|
-
--pre-run "npm run build" \
|
|
418
|
-
-s claude -i 5 -v
|
|
665
|
+
# Check scan status
|
|
666
|
+
./.juno_task/scripts/log_scanner.sh --status
|
|
419
667
|
|
|
420
|
-
#
|
|
421
|
-
|
|
422
|
-
./.juno_task/scripts/run_until_completion.sh -s claude -i 5
|
|
668
|
+
# Reset scan state (re-scan everything)
|
|
669
|
+
./.juno_task/scripts/log_scanner.sh --reset
|
|
423
670
|
```
|
|
424
671
|
|
|
425
|
-
|
|
672
|
+
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.
|
|
426
673
|
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
**Define hooks in config.json:**
|
|
674
|
+
Use as a pre-run hook so the agent finds and fixes errors automatically:
|
|
430
675
|
```json
|
|
431
676
|
{
|
|
432
677
|
"hooks": {
|
|
433
678
|
"START_ITERATION": {
|
|
434
|
-
"commands": [
|
|
435
|
-
"./scripts/lint.sh",
|
|
436
|
-
"npm run typecheck"
|
|
437
|
-
]
|
|
438
|
-
},
|
|
439
|
-
"SLACK_SYNC": {
|
|
440
|
-
"commands": [
|
|
441
|
-
"./.juno_task/scripts/slack_fetch.sh --channel bugs",
|
|
442
|
-
"./.juno_task/scripts/slack_respond.sh"
|
|
443
|
-
]
|
|
679
|
+
"commands": ["./.juno_task/scripts/log_scanner.sh"]
|
|
444
680
|
}
|
|
445
681
|
}
|
|
446
682
|
}
|
|
447
683
|
```
|
|
448
684
|
|
|
449
|
-
|
|
450
|
-
```bash
|
|
451
|
-
# Single hook
|
|
452
|
-
./.juno_task/scripts/run_until_completion.sh --pre-run-hook START_ITERATION -s claude -i 5
|
|
685
|
+
## Kanban Commands
|
|
453
686
|
|
|
454
|
-
|
|
455
|
-
./.juno_task/scripts/run_until_completion.sh \
|
|
456
|
-
--pre-run-hook SLACK_SYNC \
|
|
457
|
-
--pre-run-hook START_ITERATION \
|
|
458
|
-
-s claude -i 5
|
|
687
|
+
The kanban.sh script wraps juno-kanban. Here are the actual commands:
|
|
459
688
|
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
689
|
+
```bash
|
|
690
|
+
# Task CRUD
|
|
691
|
+
./.juno_task/scripts/kanban.sh create "Task body" --tags feature,backend
|
|
692
|
+
./.juno_task/scripts/kanban.sh get TASK_ID
|
|
693
|
+
./.juno_task/scripts/kanban.sh update TASK_ID --response "Fixed it" --commit abc123
|
|
694
|
+
./.juno_task/scripts/kanban.sh mark done --id TASK_ID --response "Completed, tests pass"
|
|
695
|
+
./.juno_task/scripts/kanban.sh archive TASK_ID
|
|
464
696
|
|
|
465
|
-
|
|
697
|
+
# List & search
|
|
698
|
+
./.juno_task/scripts/kanban.sh list --limit 5 --status backlog todo in_progress
|
|
699
|
+
./.juno_task/scripts/kanban.sh search --tag backend --status todo
|
|
466
700
|
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
701
|
+
# Dependencies
|
|
702
|
+
./.juno_task/scripts/kanban.sh create "Deploy" --blocked-by A1b2C3,X4y5Z6
|
|
703
|
+
./.juno_task/scripts/kanban.sh deps TASK_ID # Show blockers & dependents
|
|
704
|
+
./.juno_task/scripts/kanban.sh deps add --id T1 --blocked-by T2 # Add dependency
|
|
705
|
+
./.juno_task/scripts/kanban.sh deps remove --id T1 --blocked-by T2
|
|
706
|
+
./.juno_task/scripts/kanban.sh ready # Tasks with no unmet blockers
|
|
707
|
+
./.juno_task/scripts/kanban.sh order --scores # Topological execution order
|
|
473
708
|
|
|
474
|
-
|
|
709
|
+
# Merge (monorepo support)
|
|
710
|
+
./.juno_task/scripts/kanban.sh merge source/ --into target/ --strategy keep-newer
|
|
711
|
+
```
|
|
475
712
|
|
|
476
|
-
|
|
477
|
-
|----------|-------------|
|
|
478
|
-
| `JUNO_DEBUG=true` | Show debug diagnostic messages |
|
|
479
|
-
| `JUNO_VERBOSE=true` | Show informational status messages |
|
|
480
|
-
| `JUNO_PRE_RUN` | Pre-run command (runs before --pre-run flags) |
|
|
481
|
-
| `JUNO_PRE_RUN_HOOK` | Pre-run hook name (runs before --pre-run-hook flags) |
|
|
482
|
-
| `JUNO_RUN_UNTIL_MAX_ITERATIONS` | Maximum iterations (0 = unlimited) |
|
|
713
|
+
**Task schema**: `{id, status, body, commit_hash, agent_response, created_date, last_modified, feature_tags[], related_tasks[], blocked_by[]}`
|
|
483
714
|
|
|
484
|
-
|
|
715
|
+
**Status lifecycle**: `backlog → todo → in_progress → done → archive`
|
|
485
716
|
|
|
486
|
-
|
|
717
|
+
**Body markup** (auto-parsed on create):
|
|
718
|
+
- `[task_id]ID1, ID2[/task_id]` → `related_tasks`
|
|
719
|
+
- `[blocked_by]ID1, ID2[/blocked_by]` → `blocked_by` (synonyms: `block_by`, `block`, `parent_task`)
|
|
487
720
|
|
|
488
|
-
|
|
489
|
-
# List tasks
|
|
490
|
-
./.juno_task/scripts/kanban.sh list --limit 5
|
|
491
|
-
./.juno_task/scripts/kanban.sh list --status backlog todo in_progress
|
|
721
|
+
## Configuration
|
|
492
722
|
|
|
493
|
-
|
|
494
|
-
./.juno_task/scripts/kanban.sh get TASK_ID
|
|
723
|
+
### Hierarchy (highest to lowest priority)
|
|
495
724
|
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
725
|
+
1. CLI arguments
|
|
726
|
+
2. Environment variables (`JUNO_CODE_*`)
|
|
727
|
+
3. Project config (`.juno_task/config.json`)
|
|
728
|
+
4. Global config files
|
|
729
|
+
5. Hardcoded defaults
|
|
499
730
|
|
|
500
|
-
|
|
501
|
-
./.juno_task/scripts/kanban.sh update TASK_ID --commit abc123
|
|
502
|
-
```
|
|
731
|
+
### Per-subagent default models
|
|
503
732
|
|
|
504
|
-
|
|
733
|
+
Set model defaults per subagent without changing your global default:
|
|
505
734
|
|
|
506
|
-
|
|
735
|
+
```bash
|
|
736
|
+
juno-code pi set-default-model :api-codex
|
|
737
|
+
juno-code claude set-default-model :opus
|
|
738
|
+
juno-code codex set-default-model :gpt-5
|
|
739
|
+
```
|
|
507
740
|
|
|
508
|
-
|
|
509
|
-
- **mcp** - Model Context Protocol servers (full tool integration)
|
|
741
|
+
This writes to `.juno_task/config.json`:
|
|
510
742
|
|
|
511
|
-
|
|
743
|
+
```json
|
|
744
|
+
{
|
|
745
|
+
"defaultModels": {
|
|
746
|
+
"pi": ":api-codex",
|
|
747
|
+
"claude": ":opus",
|
|
748
|
+
"codex": ":gpt-5"
|
|
749
|
+
}
|
|
750
|
+
}
|
|
751
|
+
```
|
|
512
752
|
|
|
513
|
-
|
|
514
|
-
|---------|---------------|------------|
|
|
515
|
-
| claude | `claude-sonnet-4-6` | `:haiku`, `:sonnet`, `:opus` |
|
|
516
|
-
| codex | `gpt-5.3-codex` | `:codex`, `:codex-mini`, `:gpt-5`, `:mini` |
|
|
517
|
-
| gemini | `gemini-2.5-pro` | `:pro`, `:flash`, `:pro-3`, `:flash-3` |
|
|
518
|
-
| pi | `anthropic/claude-sonnet-4-6` | `:pi`, `:sonnet`, `:opus`, `:gpt-5`, `:codex`, `:gemini-pro` |
|
|
753
|
+
`juno-code` resolves models in this order: CLI `--model` → configured subagent default (`defaultModels` / legacy `defaultModel`) → built-in default.
|
|
519
754
|
|
|
520
|
-
|
|
521
|
-
> It requires separate installation: `npm install -g @mariozechner/pi-coding-agent`
|
|
755
|
+
### Project Env Bootstrap (`.env.juno`)
|
|
522
756
|
|
|
523
|
-
|
|
757
|
+
`juno-code` now bootstraps a project env file automatically:
|
|
524
758
|
|
|
525
|
-
|
|
759
|
+
- On `juno-code init`: creates an empty `.env.juno` in project root
|
|
760
|
+
- On any `juno-code` run: ensures `.env.juno` exists (creates if missing)
|
|
761
|
+
- Loads env values before execution so hooks and subagent processes receive them
|
|
762
|
+
- Supports custom env file path via `.juno_task/config.json`
|
|
526
763
|
|
|
527
|
-
|
|
528
|
-
# View installed services
|
|
529
|
-
juno-code services list
|
|
764
|
+
Example config:
|
|
530
765
|
|
|
531
|
-
|
|
532
|
-
|
|
766
|
+
```json
|
|
767
|
+
{
|
|
768
|
+
"envFilePath": ".env.local",
|
|
769
|
+
"envFileCopied": true
|
|
770
|
+
}
|
|
533
771
|
```
|
|
534
772
|
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
773
|
+
Notes:
|
|
774
|
+
- `envFilePath`: env file to load (relative to project root or absolute path)
|
|
775
|
+
- `envFileCopied`: tracks one-time initialization from `.env.juno` to custom env path
|
|
776
|
+
- Load order: `.env.juno` first, then `envFilePath` (custom file overrides defaults)
|
|
539
777
|
|
|
540
|
-
|
|
778
|
+
### Project Structure
|
|
541
779
|
|
|
542
780
|
After `juno-code init`:
|
|
543
781
|
|
|
544
782
|
```
|
|
545
783
|
your-project/
|
|
784
|
+
├── .env.juno # Project env file auto-created and loaded on startup
|
|
546
785
|
├── .juno_task/
|
|
547
786
|
│ ├── init.md # Task breakdown (your input)
|
|
548
787
|
│ ├── prompt.md # AI instructions (Ralph-style prompt)
|
|
549
788
|
│ ├── plan.md # Progress tracking
|
|
550
|
-
│ ├── USER_FEEDBACK.md # Issue tracking
|
|
551
|
-
│ ├── config.json #
|
|
789
|
+
│ ├── USER_FEEDBACK.md # Issue tracking (write here while agent runs)
|
|
790
|
+
│ ├── config.json # Hooks, agent config, project settings
|
|
552
791
|
│ ├── scripts/ # Auto-installed utilities
|
|
553
|
-
│ │ ├── run_until_completion.sh
|
|
554
792
|
│ │ ├── kanban.sh
|
|
555
|
-
│ │
|
|
556
|
-
│
|
|
793
|
+
│ │ ├── run_until_completion.sh
|
|
794
|
+
│ │ ├── parallel_runner.sh
|
|
795
|
+
│ │ ├── log_scanner.sh
|
|
796
|
+
│ │ ├── install_requirements.sh
|
|
797
|
+
│ │ ├── slack_fetch.sh / slack_fetch.py
|
|
798
|
+
│ │ ├── slack_respond.sh / slack_respond.py
|
|
799
|
+
│ │ ├── github.py
|
|
800
|
+
│ │ └── hooks/session_counter.sh
|
|
801
|
+
│ ├── tasks/ # Kanban tasks (NDJSON)
|
|
802
|
+
│ └── logs/ # Agent session logs
|
|
803
|
+
├── .claude/skills/ # Claude agent skills (auto-provisioned)
|
|
804
|
+
├── .agents/skills/ # Codex agent skills (auto-provisioned)
|
|
557
805
|
├── CLAUDE.md # Session learnings
|
|
558
806
|
└── AGENTS.md # Agent performance
|
|
559
807
|
```
|
|
@@ -570,7 +818,23 @@ export JUNO_CODE_MAX_ITERATIONS=10
|
|
|
570
818
|
# Service-specific
|
|
571
819
|
export CODEX_HIDE_STREAM_TYPES="turn_diff,token_count"
|
|
572
820
|
export GEMINI_API_KEY=your-key
|
|
573
|
-
|
|
821
|
+
|
|
822
|
+
# Execution control
|
|
823
|
+
export JUNO_STALE_THRESHOLD=3 # Stale iteration limit
|
|
824
|
+
export JUNO_PRE_RUN="./scripts/sync.sh" # Pre-run command
|
|
825
|
+
export JUNO_PRE_RUN_HOOK="SLACK_SYNC" # Pre-run hook name
|
|
826
|
+
export JUNO_RUN_UNTIL_MAX_ITERATIONS=0 # Max iterations (0=unlimited)
|
|
827
|
+
export JUNO_SESSION_COUNTER_THRESHOLD=100 # Session length warning threshold
|
|
828
|
+
|
|
829
|
+
# Integration
|
|
830
|
+
export SLACK_BOT_TOKEN=xoxb-your-token
|
|
831
|
+
export SLACK_CHANNEL=bug-reports
|
|
832
|
+
export GITHUB_TOKEN=ghp_your-token
|
|
833
|
+
export GITHUB_REPO=owner/repo
|
|
834
|
+
|
|
835
|
+
# Debug
|
|
836
|
+
export JUNO_DEBUG=true # Enable [DEBUG] output
|
|
837
|
+
export JUNO_VERBOSE=true # Enable [INFO] output
|
|
574
838
|
|
|
575
839
|
# Pi requires the pi-coding-agent CLI installed globally
|
|
576
840
|
# npm install -g @mariozechner/pi-coding-agent
|
|
@@ -604,17 +868,44 @@ juno-code -b shell -s codex -p "Same investigation" -i 3
|
|
|
604
868
|
juno-code -b shell -s pi -m :sonnet -p "Same investigation" -i 3
|
|
605
869
|
```
|
|
606
870
|
|
|
607
|
-
###
|
|
871
|
+
### Parallel Batch Processing
|
|
608
872
|
|
|
609
873
|
```bash
|
|
610
|
-
#
|
|
611
|
-
|
|
874
|
+
# Process 100 kanban tasks with 5 workers
|
|
875
|
+
./.juno_task/scripts/parallel_runner.sh --kanban T1,T2,...,T100 --parallel 5
|
|
612
876
|
|
|
613
|
-
#
|
|
614
|
-
./.juno_task/scripts/
|
|
877
|
+
# Visual monitoring
|
|
878
|
+
./.juno_task/scripts/parallel_runner.sh --tmux --kanban T1,T2,T3 --parallel 3
|
|
879
|
+
|
|
880
|
+
# Process a CSV dataset
|
|
881
|
+
./.juno_task/scripts/parallel_runner.sh --items-file data.csv --prompt-file process.md --strict --file-format csv
|
|
882
|
+
```
|
|
883
|
+
|
|
884
|
+
### Dependency-Aware Workflow
|
|
885
|
+
|
|
886
|
+
```bash
|
|
887
|
+
# Create tasks with dependencies
|
|
888
|
+
./.juno_task/scripts/kanban.sh create "Setup database" --tags infra
|
|
889
|
+
./.juno_task/scripts/kanban.sh create "Build API [blocked_by]DBID[/blocked_by]" --tags backend
|
|
890
|
+
./.juno_task/scripts/kanban.sh create "Build UI [blocked_by]APIID[/blocked_by]" --tags frontend
|
|
615
891
|
|
|
616
|
-
#
|
|
617
|
-
|
|
892
|
+
# See what's ready to work on
|
|
893
|
+
./.juno_task/scripts/kanban.sh ready
|
|
894
|
+
|
|
895
|
+
# Execution order respecting dependencies
|
|
896
|
+
./.juno_task/scripts/kanban.sh order --scores
|
|
897
|
+
|
|
898
|
+
# Run only unblocked tasks in parallel
|
|
899
|
+
./.juno_task/scripts/parallel_runner.sh --kanban-filter 'ready' --parallel 3
|
|
900
|
+
```
|
|
901
|
+
|
|
902
|
+
### Slack-Driven Development
|
|
903
|
+
|
|
904
|
+
```bash
|
|
905
|
+
# Full automated loop: Slack → Agent → Slack
|
|
906
|
+
./.juno_task/scripts/run_until_completion.sh \
|
|
907
|
+
--pre-run-hook SLACK_SYNC \
|
|
908
|
+
-s claude -i 5 -v
|
|
618
909
|
```
|
|
619
910
|
|
|
620
911
|
## Comparison: Ralph vs juno-code
|
|
@@ -625,39 +916,17 @@ git log --oneline
|
|
|
625
916
|
| **Core Loop** | `while :; do claude; done` | Controlled iterations |
|
|
626
917
|
| **Stopping** | Ctrl+C (guesswork) | `-i N` or "until tasks done" |
|
|
627
918
|
| **Source of Truth** | Markdown files (TASKS.md, PLANNING.md) | Structured kanban over bash |
|
|
628
|
-
| **Format Integrity** | Relies on LLM instruction-following | Strict
|
|
919
|
+
| **Format Integrity** | Relies on LLM instruction-following | Strict NDJSON, always parseable |
|
|
629
920
|
| **Multiple AIs** | Claude only | Claude, Codex, Gemini, Pi, Cursor |
|
|
921
|
+
| **Dependencies** | None | blocked_by, ready, topological sort |
|
|
922
|
+
| **Parallelism** | None | parallel_runner with N workers |
|
|
630
923
|
| **Traceability** | None | Every task → git commit |
|
|
924
|
+
| **Integrations** | None | Slack, GitHub Issues |
|
|
631
925
|
| **Hooks** | Claude-specific | Works with any backend |
|
|
926
|
+
| **Error Detection** | None | Log scanner with auto bug reports |
|
|
632
927
|
| **Verbose** | Raw JSON | Human-readable + jq-friendly |
|
|
633
928
|
| **Feedback** | None | Real-time during execution |
|
|
634
929
|
|
|
635
|
-
### Why Structured Kanban Over Markdown?
|
|
636
|
-
|
|
637
|
-
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."
|
|
638
|
-
|
|
639
|
-
But for **iterative development**, markdown files break down:
|
|
640
|
-
|
|
641
|
-
- **No strict format**: LLMs can corrupt the structure, add extra formatting, forget sections
|
|
642
|
-
- **Context bloat**: Long plan.md files confuse agents and waste tokens
|
|
643
|
-
- **No query capability**: Can't ask "what's in progress?" without parsing prose
|
|
644
|
-
- **No task isolation**: Changes to one task can accidentally affect others
|
|
645
|
-
|
|
646
|
-
juno-code uses **structured kanban over bash**:
|
|
647
|
-
|
|
648
|
-
```bash
|
|
649
|
-
# Always parseable - the format can never break
|
|
650
|
-
./.juno_task/scripts/kanban.sh list --status in_progress
|
|
651
|
-
|
|
652
|
-
# Query specific tasks
|
|
653
|
-
./.juno_task/scripts/kanban.sh get TASK_ID
|
|
654
|
-
|
|
655
|
-
# Tasks stored as NDJSON - one line per task
|
|
656
|
-
# Each task is self-contained and isolated
|
|
657
|
-
```
|
|
658
|
-
|
|
659
|
-
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.
|
|
660
|
-
|
|
661
930
|
## Troubleshooting
|
|
662
931
|
|
|
663
932
|
### Service scripts not updating
|
|
@@ -677,6 +946,43 @@ juno-code -v -b shell -s codex -m :codex -p "test"
|
|
|
677
946
|
./.juno_task/scripts/kanban.sh list --status backlog todo in_progress
|
|
678
947
|
```
|
|
679
948
|
|
|
949
|
+
### Skills not appearing
|
|
950
|
+
```bash
|
|
951
|
+
juno-code skills list
|
|
952
|
+
juno-code skills install --force
|
|
953
|
+
```
|
|
954
|
+
|
|
955
|
+
### Python environment issues
|
|
956
|
+
```bash
|
|
957
|
+
# Force reinstall Python dependencies
|
|
958
|
+
./.juno_task/scripts/install_requirements.sh --force-update
|
|
959
|
+
```
|
|
960
|
+
|
|
961
|
+
## Build from Source
|
|
962
|
+
|
|
963
|
+
```bash
|
|
964
|
+
cd juno-code
|
|
965
|
+
|
|
966
|
+
# Build
|
|
967
|
+
npm run build
|
|
968
|
+
|
|
969
|
+
# Build as exp-juno-code (local testing)
|
|
970
|
+
npm run build:exp
|
|
971
|
+
|
|
972
|
+
# Remove exp-juno-code
|
|
973
|
+
npm run uninstall:exp
|
|
974
|
+
|
|
975
|
+
# Run tests
|
|
976
|
+
npm test # Fast tests
|
|
977
|
+
npm run test:full # Full suite
|
|
978
|
+
npm run test:coverage # With coverage
|
|
979
|
+
|
|
980
|
+
# Lint & format
|
|
981
|
+
npm run lint
|
|
982
|
+
npm run format:check
|
|
983
|
+
npm run typecheck
|
|
984
|
+
```
|
|
985
|
+
|
|
680
986
|
## Credits
|
|
681
987
|
|
|
682
988
|
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.
|