@katyella/legio 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (219) hide show
  1. package/CHANGELOG.md +422 -0
  2. package/LICENSE +21 -0
  3. package/README.md +555 -0
  4. package/agents/builder.md +141 -0
  5. package/agents/coordinator.md +351 -0
  6. package/agents/cto.md +196 -0
  7. package/agents/gateway.md +276 -0
  8. package/agents/lead.md +281 -0
  9. package/agents/merger.md +156 -0
  10. package/agents/monitor.md +212 -0
  11. package/agents/reviewer.md +142 -0
  12. package/agents/scout.md +131 -0
  13. package/agents/supervisor.md +416 -0
  14. package/bin/legio.mjs +38 -0
  15. package/package.json +77 -0
  16. package/src/agents/checkpoint.test.ts +88 -0
  17. package/src/agents/checkpoint.ts +102 -0
  18. package/src/agents/hooks-deployer.test.ts +1820 -0
  19. package/src/agents/hooks-deployer.ts +574 -0
  20. package/src/agents/identity.test.ts +614 -0
  21. package/src/agents/identity.ts +385 -0
  22. package/src/agents/lifecycle.test.ts +202 -0
  23. package/src/agents/lifecycle.ts +184 -0
  24. package/src/agents/manifest.test.ts +558 -0
  25. package/src/agents/manifest.ts +297 -0
  26. package/src/agents/overlay.test.ts +592 -0
  27. package/src/agents/overlay.ts +316 -0
  28. package/src/beads/client.test.ts +210 -0
  29. package/src/beads/client.ts +227 -0
  30. package/src/beads/molecules.test.ts +320 -0
  31. package/src/beads/molecules.ts +209 -0
  32. package/src/commands/agents.test.ts +325 -0
  33. package/src/commands/agents.ts +286 -0
  34. package/src/commands/clean.test.ts +730 -0
  35. package/src/commands/clean.ts +653 -0
  36. package/src/commands/completions.test.ts +346 -0
  37. package/src/commands/completions.ts +950 -0
  38. package/src/commands/coordinator.test.ts +1524 -0
  39. package/src/commands/coordinator.ts +880 -0
  40. package/src/commands/costs.test.ts +1015 -0
  41. package/src/commands/costs.ts +473 -0
  42. package/src/commands/dashboard.test.ts +94 -0
  43. package/src/commands/dashboard.ts +607 -0
  44. package/src/commands/doctor.test.ts +295 -0
  45. package/src/commands/doctor.ts +213 -0
  46. package/src/commands/down.test.ts +308 -0
  47. package/src/commands/down.ts +124 -0
  48. package/src/commands/errors.test.ts +648 -0
  49. package/src/commands/errors.ts +255 -0
  50. package/src/commands/feed.test.ts +579 -0
  51. package/src/commands/feed.ts +368 -0
  52. package/src/commands/gateway.test.ts +698 -0
  53. package/src/commands/gateway.ts +419 -0
  54. package/src/commands/group.test.ts +262 -0
  55. package/src/commands/group.ts +539 -0
  56. package/src/commands/hooks.test.ts +292 -0
  57. package/src/commands/hooks.ts +210 -0
  58. package/src/commands/init.test.ts +211 -0
  59. package/src/commands/init.ts +622 -0
  60. package/src/commands/inspect.test.ts +670 -0
  61. package/src/commands/inspect.ts +455 -0
  62. package/src/commands/log.test.ts +1556 -0
  63. package/src/commands/log.ts +752 -0
  64. package/src/commands/logs.test.ts +379 -0
  65. package/src/commands/logs.ts +544 -0
  66. package/src/commands/mail.test.ts +1726 -0
  67. package/src/commands/mail.ts +926 -0
  68. package/src/commands/merge.test.ts +676 -0
  69. package/src/commands/merge.ts +374 -0
  70. package/src/commands/metrics.test.ts +444 -0
  71. package/src/commands/metrics.ts +150 -0
  72. package/src/commands/monitor.test.ts +151 -0
  73. package/src/commands/monitor.ts +394 -0
  74. package/src/commands/nudge.test.ts +230 -0
  75. package/src/commands/nudge.ts +373 -0
  76. package/src/commands/prime.test.ts +467 -0
  77. package/src/commands/prime.ts +386 -0
  78. package/src/commands/replay.test.ts +742 -0
  79. package/src/commands/replay.ts +367 -0
  80. package/src/commands/run.test.ts +443 -0
  81. package/src/commands/run.ts +365 -0
  82. package/src/commands/server.test.ts +626 -0
  83. package/src/commands/server.ts +298 -0
  84. package/src/commands/sling.test.ts +810 -0
  85. package/src/commands/sling.ts +700 -0
  86. package/src/commands/spec.test.ts +206 -0
  87. package/src/commands/spec.ts +171 -0
  88. package/src/commands/status.test.ts +276 -0
  89. package/src/commands/status.ts +339 -0
  90. package/src/commands/stop.test.ts +357 -0
  91. package/src/commands/stop.ts +119 -0
  92. package/src/commands/supervisor.test.ts +186 -0
  93. package/src/commands/supervisor.ts +544 -0
  94. package/src/commands/trace.test.ts +746 -0
  95. package/src/commands/trace.ts +332 -0
  96. package/src/commands/up.test.ts +597 -0
  97. package/src/commands/up.ts +275 -0
  98. package/src/commands/watch.test.ts +152 -0
  99. package/src/commands/watch.ts +238 -0
  100. package/src/commands/worktree.test.ts +648 -0
  101. package/src/commands/worktree.ts +266 -0
  102. package/src/config.test.ts +496 -0
  103. package/src/config.ts +616 -0
  104. package/src/doctor/agents.test.ts +448 -0
  105. package/src/doctor/agents.ts +396 -0
  106. package/src/doctor/config-check.test.ts +184 -0
  107. package/src/doctor/config-check.ts +185 -0
  108. package/src/doctor/consistency.test.ts +645 -0
  109. package/src/doctor/consistency.ts +294 -0
  110. package/src/doctor/databases.test.ts +284 -0
  111. package/src/doctor/databases.ts +211 -0
  112. package/src/doctor/dependencies.test.ts +150 -0
  113. package/src/doctor/dependencies.ts +179 -0
  114. package/src/doctor/logs.test.ts +244 -0
  115. package/src/doctor/logs.ts +295 -0
  116. package/src/doctor/merge-queue.test.ts +210 -0
  117. package/src/doctor/merge-queue.ts +144 -0
  118. package/src/doctor/structure.test.ts +285 -0
  119. package/src/doctor/structure.ts +195 -0
  120. package/src/doctor/types.ts +37 -0
  121. package/src/doctor/version.test.ts +130 -0
  122. package/src/doctor/version.ts +131 -0
  123. package/src/e2e/chat-flow.test.ts +346 -0
  124. package/src/e2e/init-sling-lifecycle.test.ts +288 -0
  125. package/src/errors.test.ts +21 -0
  126. package/src/errors.ts +246 -0
  127. package/src/events/store.test.ts +660 -0
  128. package/src/events/store.ts +344 -0
  129. package/src/events/tool-filter.test.ts +330 -0
  130. package/src/events/tool-filter.ts +126 -0
  131. package/src/global-setup.ts +14 -0
  132. package/src/index.ts +339 -0
  133. package/src/insights/analyzer.test.ts +466 -0
  134. package/src/insights/analyzer.ts +203 -0
  135. package/src/logging/color.test.ts +118 -0
  136. package/src/logging/color.ts +71 -0
  137. package/src/logging/logger.test.ts +812 -0
  138. package/src/logging/logger.ts +266 -0
  139. package/src/logging/reporter.test.ts +258 -0
  140. package/src/logging/reporter.ts +109 -0
  141. package/src/logging/sanitizer.test.ts +190 -0
  142. package/src/logging/sanitizer.ts +57 -0
  143. package/src/mail/broadcast.test.ts +203 -0
  144. package/src/mail/broadcast.ts +92 -0
  145. package/src/mail/client.test.ts +873 -0
  146. package/src/mail/client.ts +236 -0
  147. package/src/mail/store.test.ts +815 -0
  148. package/src/mail/store.ts +402 -0
  149. package/src/merge/queue.test.ts +449 -0
  150. package/src/merge/queue.ts +262 -0
  151. package/src/merge/resolver.test.ts +1453 -0
  152. package/src/merge/resolver.ts +759 -0
  153. package/src/metrics/store.test.ts +1167 -0
  154. package/src/metrics/store.ts +511 -0
  155. package/src/metrics/summary.test.ts +397 -0
  156. package/src/metrics/summary.ts +178 -0
  157. package/src/metrics/transcript.test.ts +643 -0
  158. package/src/metrics/transcript.ts +351 -0
  159. package/src/mulch/client.test.ts +547 -0
  160. package/src/mulch/client.ts +416 -0
  161. package/src/server/audit-store.test.ts +384 -0
  162. package/src/server/audit-store.ts +257 -0
  163. package/src/server/headless.test.ts +180 -0
  164. package/src/server/headless.ts +151 -0
  165. package/src/server/index.test.ts +241 -0
  166. package/src/server/index.ts +317 -0
  167. package/src/server/public/app.js +187 -0
  168. package/src/server/public/apple-touch-icon.png +0 -0
  169. package/src/server/public/components/agent-badge.js +37 -0
  170. package/src/server/public/components/data-table.js +114 -0
  171. package/src/server/public/components/gateway-chat.js +256 -0
  172. package/src/server/public/components/issue-card.js +96 -0
  173. package/src/server/public/components/layout.js +88 -0
  174. package/src/server/public/components/message-bubble.js +120 -0
  175. package/src/server/public/components/stat-card.js +26 -0
  176. package/src/server/public/components/terminal-panel.js +140 -0
  177. package/src/server/public/favicon-16.png +0 -0
  178. package/src/server/public/favicon-32.png +0 -0
  179. package/src/server/public/favicon.ico +0 -0
  180. package/src/server/public/favicon.png +0 -0
  181. package/src/server/public/index.html +64 -0
  182. package/src/server/public/lib/api.js +35 -0
  183. package/src/server/public/lib/markdown.js +8 -0
  184. package/src/server/public/lib/preact-setup.js +8 -0
  185. package/src/server/public/lib/state.js +99 -0
  186. package/src/server/public/lib/utils.js +309 -0
  187. package/src/server/public/lib/ws.js +79 -0
  188. package/src/server/public/views/chat.js +983 -0
  189. package/src/server/public/views/costs.js +692 -0
  190. package/src/server/public/views/dashboard.js +781 -0
  191. package/src/server/public/views/gateway-chat.js +622 -0
  192. package/src/server/public/views/inspect.js +399 -0
  193. package/src/server/public/views/issues.js +470 -0
  194. package/src/server/public/views/setup.js +94 -0
  195. package/src/server/public/views/task-detail.js +422 -0
  196. package/src/server/routes.test.ts +3816 -0
  197. package/src/server/routes.ts +1964 -0
  198. package/src/server/websocket.test.ts +288 -0
  199. package/src/server/websocket.ts +196 -0
  200. package/src/sessions/compat.test.ts +109 -0
  201. package/src/sessions/compat.ts +17 -0
  202. package/src/sessions/store.test.ts +969 -0
  203. package/src/sessions/store.ts +480 -0
  204. package/src/test-helpers.test.ts +97 -0
  205. package/src/test-helpers.ts +143 -0
  206. package/src/types.ts +708 -0
  207. package/src/watchdog/daemon.test.ts +1233 -0
  208. package/src/watchdog/daemon.ts +533 -0
  209. package/src/watchdog/health.test.ts +371 -0
  210. package/src/watchdog/health.ts +248 -0
  211. package/src/watchdog/triage.test.ts +162 -0
  212. package/src/watchdog/triage.ts +193 -0
  213. package/src/worktree/manager.test.ts +444 -0
  214. package/src/worktree/manager.ts +224 -0
  215. package/src/worktree/tmux.test.ts +1238 -0
  216. package/src/worktree/tmux.ts +644 -0
  217. package/templates/CLAUDE.md.tmpl +89 -0
  218. package/templates/hooks.json.tmpl +132 -0
  219. package/templates/overlay.md.tmpl +79 -0
@@ -0,0 +1,89 @@
1
+ # {{PROJECT_NAME}} — Legio Orchestration
2
+
3
+ > Auto-generated by `legio init`. You may edit this file.
4
+
5
+ This project uses **legio** for Claude Code agent orchestration. Your session
6
+ acts as the orchestrator: you decide what work to delegate, spawn worker agents,
7
+ monitor progress, and merge results.
8
+
9
+ ## Quick Reference
10
+
11
+ ```bash
12
+ # Spawn a worker agent
13
+ legio sling <bead-id> --capability <type> --name <agent-name> \
14
+ [--spec <path>] [--files file1,file2] [--parent <agent>] [--depth <n>]
15
+
16
+ # Check system status
17
+ legio status # Overview of all agents, worktrees, beads
18
+ legio status --json # Machine-readable output
19
+ legio status --watch # Live updating
20
+
21
+ # Messaging (SQLite-backed, ~1-5ms per query)
22
+ legio mail send --to <agent> --subject "..." --body "..."
23
+ legio mail check # Your inbox
24
+ legio mail list --unread # All unread messages
25
+ legio mail reply <id> --body "..."
26
+
27
+ # Merge completed work
28
+ legio merge --branch <name> # Merge a specific branch
29
+ legio merge --all # Merge all completed branches
30
+ legio merge --dry-run --branch <name> # Preview conflicts
31
+
32
+ # Worktree management
33
+ legio worktree list # Show all worktrees with status
34
+ legio worktree clean --completed # Remove finished worktrees
35
+
36
+ # Context and monitoring
37
+ legio prime # Reload context (config, mulch, recent activity)
38
+ legio watch --background # Start watchdog daemon
39
+ legio metrics # Performance summary
40
+ legio log <event> --agent <name> # Hook-driven event logging
41
+ ```
42
+
43
+ ## How to Spawn Agents
44
+
45
+ 1. Identify the work using beads: `bd ready` or `bd create "task title"`
46
+ 2. Choose a capability based on the task:
47
+ {{AGENT_DEFINITIONS}}
48
+ 3. Assign exclusive file scope so agents do not conflict
49
+ 4. Spawn: `legio sling <bead-id> --capability <type> --name <unique-name> --files src/foo.ts,src/bar.ts`
50
+
51
+ Each spawned agent gets its own git worktree, branch, CLAUDE.md overlay, and
52
+ tmux session. Agents communicate via `legio mail` and report completion
53
+ by closing their beads issue (`bd close <id> --reason "summary"`).
54
+
55
+ ## Hierarchical Delegation
56
+
57
+ You can spawn **team leads** that themselves spawn sub-workers:
58
+
59
+ ```
60
+ Orchestrator (this session)
61
+ └── legio sling bd-xyz --capability lead --name build-lead
62
+ ├── legio sling bd-abc --capability builder --name auth-login
63
+ ├── legio sling bd-def --capability builder --name auth-signup
64
+ └── legio sling bd-ghi --capability builder --name auth-reset
65
+ ```
66
+
67
+ Depth limit is configurable (default: 2). Leads use `--parent` and `--depth`
68
+ to track hierarchy.
69
+
70
+ ## Checking Status
71
+
72
+ Run `legio status` to see:
73
+ - Active agents and their states (booting, working, stalled, zombie)
74
+ - Worktree locations and branches
75
+ - Beads issue progress
76
+ - Unread mail count
77
+
78
+ ## Canonical Branch
79
+
80
+ All merges target **{{CANONICAL_BRANCH}}**. Agents work on branches named
81
+ `legio/<agent-name>/<bead-id>`. Never push directly to {{CANONICAL_BRANCH}}.
82
+
83
+ ## Conventions
84
+
85
+ - Agents own files exclusively — no two agents modify the same file
86
+ - Use `legio mail` for all inter-agent communication (not beads)
87
+ - Use `bd close` to report task completion (not mail)
88
+ - Merge via `legio merge`, not raw `git merge`
89
+ - Logs live in `.legio/logs/` — never delete them manually
@@ -0,0 +1,132 @@
1
+ {
2
+ "hooks": {
3
+ "SessionStart": [
4
+ {
5
+ "matcher": "",
6
+ "hooks": [
7
+ {
8
+ "type": "command",
9
+ "command": "[ -z \"$LEGIO_AGENT_NAME\" ] && exit 0; legio prime --agent {{AGENT_NAME}}"
10
+ }
11
+ ]
12
+ }
13
+ ],
14
+ "UserPromptSubmit": [
15
+ {
16
+ "matcher": "",
17
+ "hooks": [
18
+ {
19
+ "type": "command",
20
+ "command": "[ -z \"$LEGIO_AGENT_NAME\" ] && exit 0; legio mail check --inject --agent {{AGENT_NAME}}"
21
+ }
22
+ ]
23
+ }
24
+ ],
25
+ "PreToolUse": [
26
+ {
27
+ "matcher": "AskUserQuestion",
28
+ "hooks": [
29
+ {
30
+ "type": "command",
31
+ "command": "[ -z \"$LEGIO_AGENT_NAME\" ] && exit 0; echo '{\"decision\":\"block\",\"reason\":\"Legio agents run non-interactively — use legio mail send --type question to ask your parent instead\"}'"
32
+ }
33
+ ]
34
+ },
35
+ {
36
+ "matcher": "EnterPlanMode",
37
+ "hooks": [
38
+ {
39
+ "type": "command",
40
+ "command": "[ -z \"$LEGIO_AGENT_NAME\" ] && exit 0; echo '{\"decision\":\"block\",\"reason\":\"Legio agents run non-interactively — execute immediately per the propulsion principle\"}'"
41
+ }
42
+ ]
43
+ },
44
+ {
45
+ "matcher": "EnterWorktree",
46
+ "hooks": [
47
+ {
48
+ "type": "command",
49
+ "command": "[ -z \"$LEGIO_AGENT_NAME\" ] && exit 0; echo '{\"decision\":\"block\",\"reason\":\"Legio agents already have assigned worktrees — nested worktrees are not allowed\"}'"
50
+ }
51
+ ]
52
+ },
53
+ {
54
+ "matcher": "Bash",
55
+ "hooks": [
56
+ {
57
+ "type": "command",
58
+ "command": "[ -z \"$LEGIO_AGENT_NAME\" ] && exit 0; read -r INPUT; CMD=$(echo \"$INPUT\" | sed 's/.*\"command\": *\"\\([^\"]*\\)\".*/\\1/'); if echo \"$CMD\" | grep -qE '\\bgit\\s+push\\b'; then echo '{\"decision\":\"block\",\"reason\":\"git push is blocked — use legio merge to integrate changes, push manually when ready\"}'; exit 0; fi;"
59
+ }
60
+ ]
61
+ },
62
+ {
63
+ "matcher": "",
64
+ "hooks": [
65
+ {
66
+ "type": "command",
67
+ "command": "[ -z \"$LEGIO_AGENT_NAME\" ] && exit 0; legio log tool-start --agent {{AGENT_NAME}} --stdin"
68
+ }
69
+ ]
70
+ }
71
+ ],
72
+ "PostToolUse": [
73
+ {
74
+ "matcher": "",
75
+ "hooks": [
76
+ {
77
+ "type": "command",
78
+ "command": "[ -z \"$LEGIO_AGENT_NAME\" ] && exit 0; legio log tool-end --agent {{AGENT_NAME}} --stdin"
79
+ },
80
+ {
81
+ "type": "command",
82
+ "command": "[ -z \"$LEGIO_AGENT_NAME\" ] && exit 0; legio mail check --inject --agent {{AGENT_NAME}} --debounce 500"
83
+ }
84
+ ]
85
+ },
86
+ {
87
+ "matcher": "",
88
+ "hooks": [
89
+ {
90
+ "type": "command",
91
+ "command": "[ -z \"$LEGIO_AGENT_NAME\" ] && exit 0; legio mail check --inject --agent {{AGENT_NAME}} --debounce 30000"
92
+ }
93
+ ]
94
+ },
95
+ {
96
+ "matcher": "Bash",
97
+ "hooks": [
98
+ {
99
+ "type": "command",
100
+ "command": "[ -z \"$LEGIO_AGENT_NAME\" ] && exit 0; read -r INPUT; CMD=$(echo \"$INPUT\" | sed 's/.*\"command\": *\"\\([^\"]*\\)\".*/\\1/'); if echo \"$CMD\" | grep -qE '\\bgit\\s+commit\\b'; then mulch diff HEAD~1; fi;"
101
+ }
102
+ ]
103
+ }
104
+ ],
105
+ "Stop": [
106
+ {
107
+ "matcher": "",
108
+ "hooks": [
109
+ {
110
+ "type": "command",
111
+ "command": "[ -z \"$LEGIO_AGENT_NAME\" ] && exit 0; legio log session-end --agent {{AGENT_NAME}} --stdin"
112
+ },
113
+ {
114
+ "type": "command",
115
+ "command": "[ -z \"$LEGIO_AGENT_NAME\" ] && exit 0; mulch learn"
116
+ }
117
+ ]
118
+ }
119
+ ],
120
+ "PreCompact": [
121
+ {
122
+ "matcher": "",
123
+ "hooks": [
124
+ {
125
+ "type": "command",
126
+ "command": "[ -z \"$LEGIO_AGENT_NAME\" ] && exit 0; legio prime --agent {{AGENT_NAME}} --compact"
127
+ }
128
+ ]
129
+ }
130
+ ]
131
+ }
132
+ }
@@ -0,0 +1,79 @@
1
+ # DO NOT EDIT — Auto-generated by legio
2
+ # This overlay was written by `legio sling`. Manual edits will be
3
+ # overwritten on the next spawn. Modify the template at
4
+ # templates/overlay.md.tmpl in the legio repo instead.
5
+
6
+ {{BASE_DEFINITION}}
7
+
8
+ ---
9
+
10
+ ## Your Assignment
11
+
12
+ - **Agent Name:** {{AGENT_NAME}}
13
+ - **Task ID:** {{BEAD_ID}}
14
+ - **Spec:** {{SPEC_PATH}}
15
+ - **Branch:** {{BRANCH_NAME}}
16
+ - **Worktree:** {{WORKTREE_PATH}}
17
+ - **Parent:** {{PARENT_AGENT}}
18
+ - **Depth:** {{DEPTH}}
19
+
20
+ {{SPEC_INSTRUCTION}}
21
+
22
+ ## Working Directory
23
+
24
+ Your worktree root is: `{{WORKTREE_PATH}}`
25
+
26
+ **CRITICAL**: All file operations MUST use paths within this directory.
27
+ - Use paths relative to your worktree root, or absolute paths starting with `{{WORKTREE_PATH}}`
28
+ - Writing to the canonical repo root instead of your worktree is a critical error (PATH_BOUNDARY_VIOLATION)
29
+ - You may READ files from the canonical repo for context, but all WRITES go to your worktree
30
+
31
+ ## File Scope (exclusive ownership)
32
+
33
+ These paths are relative to your worktree root: `{{WORKTREE_PATH}}`
34
+
35
+ You may ONLY modify the files listed below within your worktree. Do not touch any other files.
36
+ If you need changes outside your scope, send mail to your parent agent
37
+ requesting the modification.
38
+
39
+ {{FILE_SCOPE}}
40
+
41
+ ## Expertise
42
+
43
+ Prime relevant domain knowledge before starting work:
44
+
45
+ {{MULCH_DOMAINS}}
46
+
47
+ {{MULCH_EXPERTISE}}
48
+
49
+ ## Communication
50
+
51
+ Use `legio mail` for all communication. Your address is **{{AGENT_NAME}}**.
52
+
53
+ ```bash
54
+ # Check your inbox (mail arrives automatically via hooks — only use this if you suspect a missed delivery)
55
+ legio mail check --agent {{AGENT_NAME}}
56
+
57
+ # Send a status update to your parent
58
+ legio mail send --to {{PARENT_AGENT}} --subject "status" \
59
+ --body "Progress update here" --type status --agent {{AGENT_NAME}}
60
+
61
+ # Ask a question
62
+ legio mail send --to {{PARENT_AGENT}} --subject "question" \
63
+ --body "Your question here" --type question --priority high --agent {{AGENT_NAME}}
64
+
65
+ # Report completion
66
+ legio mail send --to {{PARENT_AGENT}} --subject "done" \
67
+ --body "Summary of what was done" --type result --agent {{AGENT_NAME}}
68
+
69
+ # Reply to a message
70
+ legio mail reply <message-id> --body "Your reply" --agent {{AGENT_NAME}}
71
+ ```
72
+
73
+ ## Spawning Sub-Workers
74
+
75
+ {{CAN_SPAWN}}
76
+
77
+ {{QUALITY_GATES}}
78
+
79
+ {{CONSTRAINTS}}