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.
Files changed (60) hide show
  1. package/README.md +455 -205
  2. package/dist/bin/cli.d.mts +17 -0
  3. package/dist/bin/cli.d.ts +17 -0
  4. package/dist/bin/cli.js +6456 -17604
  5. package/dist/bin/cli.js.map +1 -1
  6. package/dist/bin/cli.mjs +6443 -17589
  7. package/dist/bin/cli.mjs.map +1 -1
  8. package/dist/bin/feedback-collector.d.mts +2 -0
  9. package/dist/bin/feedback-collector.d.ts +2 -0
  10. package/dist/bin/feedback-collector.js.map +1 -1
  11. package/dist/bin/feedback-collector.mjs.map +1 -1
  12. package/dist/index.d.mts +2133 -0
  13. package/dist/index.d.ts +2133 -0
  14. package/dist/index.js +3916 -14711
  15. package/dist/index.js.map +1 -1
  16. package/dist/index.mjs +3914 -14516
  17. package/dist/index.mjs.map +1 -1
  18. package/dist/templates/extensions/pi/juno-skill-preprocessor.ts +239 -0
  19. package/dist/templates/scripts/__pycache__/github.cpython-313.pyc +0 -0
  20. package/dist/templates/scripts/__pycache__/parallel_runner.cpython-313.pyc +0 -0
  21. package/dist/templates/scripts/__pycache__/slack_respond.cpython-313.pyc +0 -0
  22. package/dist/templates/scripts/install_requirements.sh +41 -3
  23. package/dist/templates/scripts/kanban.sh +22 -4
  24. package/dist/templates/scripts/parallel_runner.sh +2242 -0
  25. package/dist/templates/services/README.md +61 -1
  26. package/dist/templates/services/__pycache__/claude.cpython-313.pyc +0 -0
  27. package/dist/templates/services/__pycache__/codex.cpython-313.pyc +0 -0
  28. package/dist/templates/services/__pycache__/pi.cpython-313.pyc +0 -0
  29. package/dist/templates/services/claude.py +132 -33
  30. package/dist/templates/services/codex.py +179 -66
  31. package/dist/templates/services/gemini.py +117 -27
  32. package/dist/templates/services/pi.py +2796 -0
  33. package/dist/templates/skills/claude/kanban-workflow/SKILL.md +138 -0
  34. package/dist/templates/skills/claude/plan-kanban-tasks/SKILL.md +15 -8
  35. package/dist/templates/skills/claude/ralph-loop/SKILL.md +18 -22
  36. package/dist/templates/skills/claude/ralph-loop/references/first_check.md +15 -14
  37. package/dist/templates/skills/claude/ralph-loop/references/implement.md +17 -17
  38. package/dist/templates/skills/claude/ralph-loop/scripts/kanban.sh +22 -4
  39. package/dist/templates/skills/claude/understand-project/SKILL.md +15 -8
  40. package/dist/templates/skills/codex/kanban-workflow/SKILL.md +139 -0
  41. package/dist/templates/skills/codex/plan-kanban-tasks/SKILL.md +32 -0
  42. package/dist/templates/skills/codex/ralph-loop/SKILL.md +18 -22
  43. package/dist/templates/skills/codex/ralph-loop/references/first_check.md +15 -14
  44. package/dist/templates/skills/codex/ralph-loop/references/implement.md +17 -17
  45. package/dist/templates/skills/codex/ralph-loop/scripts/kanban.sh +22 -4
  46. package/dist/templates/skills/codex/understand-project/SKILL.md +46 -0
  47. package/dist/templates/skills/pi/.gitkeep +0 -0
  48. package/dist/templates/skills/pi/kanban-workflow/SKILL.md +139 -0
  49. package/dist/templates/skills/pi/plan-kanban-tasks/SKILL.md +32 -0
  50. package/dist/templates/skills/pi/ralph-loop/SKILL.md +43 -0
  51. package/dist/templates/skills/pi/ralph-loop/references/first_check.md +21 -0
  52. package/dist/templates/skills/pi/ralph-loop/references/implement.md +99 -0
  53. package/dist/templates/skills/pi/understand-project/SKILL.md +46 -0
  54. package/package.json +26 -46
  55. package/dist/templates/scripts/__pycache__/attachment_downloader.cpython-38.pyc +0 -0
  56. package/dist/templates/scripts/__pycache__/github.cpython-38.pyc +0 -0
  57. package/dist/templates/scripts/__pycache__/slack_fetch.cpython-38.pyc +0 -0
  58. package/dist/templates/scripts/__pycache__/slack_state.cpython-38.pyc +0 -0
  59. package/dist/templates/services/__pycache__/claude.cpython-38.pyc +0 -0
  60. 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/int.md (optimized Ralph prompt)
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 "Fix the login bug"
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 "your prompt"
217
+ juno-code -b shell -s claude -i 3 -p 'your prompt'
155
218
 
156
219
  # Quick subagent shortcuts
157
- juno-code claude "your task"
158
- juno-code codex "your task"
159
- juno-code gemini "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
+ # 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: `mcp`, `shell` |
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 "continue" # Resume session
181
- juno-code --continue -p "keep going" # Continue most recent
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
- ## run_until_completion.sh
586
+ ## Log Scanner
367
587
 
368
- 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.
369
-
370
- ### Basic Usage
588
+ Proactive error detection that scans log files and auto-creates kanban bug reports:
371
589
 
372
590
  ```bash
373
- # Run until all tasks complete
374
- ./.juno_task/scripts/run_until_completion.sh -s claude -i 5 -v
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
- Execute commands before the main loop starts. Useful for syncing with external services, running linters, or preparing the environment.
594
+ # Dry run (report only)
595
+ ./.juno_task/scripts/log_scanner.sh --dry-run --verbose
383
596
 
384
- ```bash
385
- # Single pre-run command
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
- # Multiple pre-run commands (executed in order)
389
- ./.juno_task/scripts/run_until_completion.sh \
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
- ### Pre-run Hooks (--pre-run-hook)
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
- **Define hooks in config.json:**
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
- # List tasks
464
- ./.juno_task/scripts/kanban.sh list --limit 5
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
- # Mark task status (backlog, todo, in_progress, done)
471
- ./.juno_task/scripts/kanban.sh mark in_progress --ID TASK_ID
472
- ./.juno_task/scripts/kanban.sh mark done --ID TASK_ID --response "Fixed auth, added tests"
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
- # Update task with git commit reference
475
- ./.juno_task/scripts/kanban.sh update TASK_ID --commit abc123
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
- ## Backends & Services
645
+ **Task schema**: `{id, status, body, commit_hash, agent_response, created_date, last_modified, feature_tags[], related_tasks[], blocked_by[]}`
479
646
 
480
- ### Available Backends
647
+ **Status lifecycle**: `backlog → todo → in_progress → done → archive`
481
648
 
482
- - **shell** - Direct execution via service scripts (recommended for headless)
483
- - **mcp** - Model Context Protocol servers (full tool integration)
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
- ### Supported Services
653
+ ## Configuration
486
654
 
487
- | Service | Default Model | Shorthands |
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
- ### Custom Backends
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
- Service scripts live in `~/.juno_code/services/`. Each is a Python script:
663
+ ### Project Env Bootstrap (`.env.juno`)
496
664
 
497
- ```bash
498
- # View installed services
499
- juno-code services list
665
+ `juno-code` now bootstraps a project env file automatically:
500
666
 
501
- # Force reinstall (get latest)
502
- juno-code services install --force
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
- To add a custom backend:
506
- 1. Create a Python script in `~/.juno_code/services/`
507
- 2. Accept standard args: `-p/--prompt`, `-m/--model`, `-v/--verbose`
508
- 3. Output JSON events to stdout for structured parsing
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
- ## Project Structure
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 # Configuration
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
- │ │ └── install_requirements.sh
526
- └── tasks/ # Kanban tasks (ndjson)
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
- export CLAUDE_USER_MESSAGE_PRETTY_TRUNCATE=4
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
- ### Iterative Feature Development
779
+ ### Parallel Batch Processing
572
780
 
573
781
  ```bash
574
- # Tasks are tracked via kanban
575
- # (Tasks created by agent or imported)
782
+ # Process 100 kanban tasks with 5 workers
783
+ ./.juno_task/scripts/parallel_runner.sh --kanban T1,T2,...,T100 --parallel 5
576
784
 
577
- # Run until all tasks complete
578
- ./.juno_task/scripts/run_until_completion.sh -s claude -i 10 -v
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
- # Each completed task has a git commit for traceability
581
- git log --oneline
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 format, always parseable |
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 codex-5.2-codex-max"
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.