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.
Files changed (33) hide show
  1. package/README.md +508 -202
  2. package/dist/bin/cli.d.mts +1 -1
  3. package/dist/bin/cli.d.ts +1 -1
  4. package/dist/bin/cli.js +3332 -1421
  5. package/dist/bin/cli.js.map +1 -1
  6. package/dist/bin/cli.mjs +3316 -1405
  7. package/dist/bin/cli.mjs.map +1 -1
  8. package/dist/bin/feedback-collector.js.map +1 -1
  9. package/dist/bin/feedback-collector.mjs.map +1 -1
  10. package/dist/index.d.mts +56 -19
  11. package/dist/index.d.ts +56 -19
  12. package/dist/index.js +240 -36
  13. package/dist/index.js.map +1 -1
  14. package/dist/index.mjs +240 -36
  15. package/dist/index.mjs.map +1 -1
  16. package/dist/templates/scripts/install_requirements.sh +55 -5
  17. package/dist/templates/scripts/kanban.sh +11 -0
  18. package/dist/templates/services/README.md +23 -4
  19. package/dist/templates/services/__pycache__/pi.cpython-313.pyc +0 -0
  20. package/dist/templates/services/pi.py +1933 -262
  21. package/dist/templates/skills/claude/kanban-workflow/SKILL.md +138 -0
  22. package/dist/templates/skills/claude/plan-kanban-tasks/SKILL.md +1 -1
  23. package/dist/templates/skills/claude/ralph-loop/scripts/kanban.sh +11 -0
  24. package/dist/templates/skills/claude/understand-project/SKILL.md +1 -1
  25. package/dist/templates/skills/codex/kanban-workflow/SKILL.md +139 -0
  26. package/dist/templates/skills/codex/plan-kanban-tasks/SKILL.md +32 -0
  27. package/dist/templates/skills/codex/ralph-loop/scripts/kanban.sh +11 -0
  28. package/dist/templates/skills/codex/understand-project/SKILL.md +46 -0
  29. package/dist/templates/skills/pi/kanban-workflow/SKILL.md +139 -0
  30. package/dist/templates/skills/pi/plan-kanban-tasks/SKILL.md +1 -1
  31. package/dist/templates/skills/pi/ralph-loop/SKILL.md +4 -0
  32. package/dist/templates/skills/pi/understand-project/SKILL.md +1 -1
  33. 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/int.md (optimized Ralph prompt)
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 "Fix the login bug"
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 "your prompt"
217
+ juno-code -b shell -s claude -i 3 -p 'your prompt'
171
218
 
172
219
  # Quick subagent shortcuts
173
- juno-code claude "your task"
174
- juno-code codex "your task"
175
- juno-code gemini "your task"
176
- juno-code pi "your task"
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: `mcp`, `shell` |
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 # View all sessions
205
- juno-code session info abc123 # Session details
206
- juno-code --resume abc123 -p "continue" # Resume session
207
- juno-code --continue -p "keep going" # Continue most recent
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
- ## run_until_completion.sh
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
- ### Basic Usage
656
+ Proactive error detection that scans log files and auto-creates kanban bug reports:
397
657
 
398
658
  ```bash
399
- # Run until all tasks complete
400
- ./.juno_task/scripts/run_until_completion.sh -s claude -i 5 -v
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
- Execute commands before the main loop starts. Useful for syncing with external services, running linters, or preparing the environment.
662
+ # Dry run (report only)
663
+ ./.juno_task/scripts/log_scanner.sh --dry-run --verbose
409
664
 
410
- ```bash
411
- # Single pre-run command
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
- # Alternative: use environment variable
421
- JUNO_PRE_RUN="./scripts/prepare.sh" \
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
- ### Pre-run Hooks (--pre-run-hook)
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
- Execute named hooks defined in `.juno_task/config.json`. Hooks group multiple commands that run together.
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
- **Use hooks:**
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
- # Multiple hooks (executed in order)
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
- # Alternative: use environment variable
461
- JUNO_PRE_RUN_HOOK="START_ITERATION" \
462
- ./.juno_task/scripts/run_until_completion.sh -s claude -i 5
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
- ### Execution Order
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
- When both hooks and pre-run commands are specified, the execution order is:
468
- 1. Hooks from `JUNO_PRE_RUN_HOOK` env var
469
- 2. Hooks from `--pre-run-hook` flags (in order)
470
- 3. Commands from `JUNO_PRE_RUN` env var
471
- 4. Commands from `--pre-run` flags (in order)
472
- 5. Main juno-code loop begins
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
- ### Environment Variables
709
+ # Merge (monorepo support)
710
+ ./.juno_task/scripts/kanban.sh merge source/ --into target/ --strategy keep-newer
711
+ ```
475
712
 
476
- | Variable | Description |
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
- ## Kanban Commands
715
+ **Status lifecycle**: `backlog → todo → in_progress → done → archive`
485
716
 
486
- The kanban.sh script wraps juno-kanban. Here are the actual commands:
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
- ```bash
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
- # Get task details
494
- ./.juno_task/scripts/kanban.sh get TASK_ID
723
+ ### Hierarchy (highest to lowest priority)
495
724
 
496
- # Mark task status (backlog, todo, in_progress, done)
497
- ./.juno_task/scripts/kanban.sh mark in_progress --ID TASK_ID
498
- ./.juno_task/scripts/kanban.sh mark done --ID TASK_ID --response "Fixed auth, added tests"
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
- # Update task with git commit reference
501
- ./.juno_task/scripts/kanban.sh update TASK_ID --commit abc123
502
- ```
731
+ ### Per-subagent default models
503
732
 
504
- ## Backends & Services
733
+ Set model defaults per subagent without changing your global default:
505
734
 
506
- ### Available Backends
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
- - **shell** - Direct execution via service scripts (recommended for headless)
509
- - **mcp** - Model Context Protocol servers (full tool integration)
741
+ This writes to `.juno_task/config.json`:
510
742
 
511
- ### Supported Services
743
+ ```json
744
+ {
745
+ "defaultModels": {
746
+ "pi": ":api-codex",
747
+ "claude": ":opus",
748
+ "codex": ":gpt-5"
749
+ }
750
+ }
751
+ ```
512
752
 
513
- | Service | Default Model | Shorthands |
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
- > **Pi** is a multi-provider coding agent that supports Anthropic, OpenAI, Google, Groq, xAI, and more.
521
- > It requires separate installation: `npm install -g @mariozechner/pi-coding-agent`
755
+ ### Project Env Bootstrap (`.env.juno`)
522
756
 
523
- ### Custom Backends
757
+ `juno-code` now bootstraps a project env file automatically:
524
758
 
525
- Service scripts live in `~/.juno_code/services/`. Each is a Python script:
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
- ```bash
528
- # View installed services
529
- juno-code services list
764
+ Example config:
530
765
 
531
- # Force reinstall (get latest)
532
- juno-code services install --force
766
+ ```json
767
+ {
768
+ "envFilePath": ".env.local",
769
+ "envFileCopied": true
770
+ }
533
771
  ```
534
772
 
535
- To add a custom backend:
536
- 1. Create a Python script in `~/.juno_code/services/`
537
- 2. Accept standard args: `-p/--prompt`, `-m/--model`, `-v/--verbose`
538
- 3. Output JSON events to stdout for structured parsing
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
- ## Project Structure
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 # Configuration
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
- │ │ └── install_requirements.sh
556
- └── tasks/ # Kanban tasks (ndjson)
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
- export CLAUDE_USER_MESSAGE_PRETTY_TRUNCATE=4
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
- ### Iterative Feature Development
871
+ ### Parallel Batch Processing
608
872
 
609
873
  ```bash
610
- # Tasks are tracked via kanban
611
- # (Tasks created by agent or imported)
874
+ # Process 100 kanban tasks with 5 workers
875
+ ./.juno_task/scripts/parallel_runner.sh --kanban T1,T2,...,T100 --parallel 5
612
876
 
613
- # Run until all tasks complete
614
- ./.juno_task/scripts/run_until_completion.sh -s claude -i 10 -v
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
- # Each completed task has a git commit for traceability
617
- git log --oneline
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 format, always parseable |
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.