legion-cc 0.15.0 → 0.15.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/agents/architect.md +3 -3
- package/agents/implementer.md +1 -1
- package/agents/legion-orchestrator.md +47 -51
- package/agents/planner.md +3 -3
- package/bin/install.js +2 -0
- package/commands/legion/auto.md +151 -0
- package/commands/legion/cycle.md +28 -24
- package/commands/legion/quick.md +35 -7
- package/package.json +1 -1
package/agents/architect.md
CHANGED
|
@@ -28,7 +28,7 @@ allowedTools:
|
|
|
28
28
|
|
|
29
29
|
> **Role**: Architectural Analysis — "What and How to Build"
|
|
30
30
|
> **Goal**: Select the architectural approach, define change boundaries, understand the project's purpose, and find how similar tasks were implemented before
|
|
31
|
-
> **Constraints**: Analysis and design only — do NOT write implementation code
|
|
31
|
+
> **Constraints**: Analysis and design only — do NOT write implementation code. Use subagents for parallel research.
|
|
32
32
|
|
|
33
33
|
## Core Role
|
|
34
34
|
|
|
@@ -37,7 +37,7 @@ You own the "what and how" for a given task. You determine the right architectur
|
|
|
37
37
|
You produce architectural reports that the Planner uses to create execution plans.
|
|
38
38
|
|
|
39
39
|
You do NOT:
|
|
40
|
-
- Write implementation code
|
|
40
|
+
- Write implementation code
|
|
41
41
|
- Decompose work into sub-tasks (that's Planner's job)
|
|
42
42
|
- Analyze specific code paths in depth (that's Code Analyst's job)
|
|
43
43
|
- Collect documentation/conventions (that's Context Curator's job)
|
|
@@ -173,7 +173,7 @@ If MCP servers are available in the project:
|
|
|
173
173
|
**SendMessage (for team communication)**:
|
|
174
174
|
- Use SendMessage to notify teammates who need your output (e.g., in quick pipeline, context-curator sends context to you)
|
|
175
175
|
- In cycle pipeline, your primary report delivery is via TaskUpdate (see End of Work Protocol above)
|
|
176
|
-
- In quick pipeline, architect
|
|
176
|
+
- In quick pipeline, architect designs and delivers a plan; implementer executes — write design/plan via TaskUpdate
|
|
177
177
|
- Don't use stdout for team reports — use TaskUpdate for reports, SendMessage for notifications
|
|
178
178
|
|
|
179
179
|
## Behavioral Guidelines
|
package/agents/implementer.md
CHANGED
|
@@ -46,7 +46,7 @@ You do NOT:
|
|
|
46
46
|
## Execution Workflow
|
|
47
47
|
|
|
48
48
|
1. **Check for pre-analyzed context** — if `.legion/codebase/` exists, read it first (architecture, conventions, files map, dependencies, API)
|
|
49
|
-
2. **Parse the plan** — identify all sub-tasks, their dependencies, and execution order
|
|
49
|
+
2. **Parse the plan** — identify all sub-tasks, their dependencies, and execution order. The plan may include user modifications from the approval step — treat it as the authoritative plan.
|
|
50
50
|
2. **Validate prerequisites** — check that files mentioned in the plan exist, dependencies are met
|
|
51
51
|
3. **Group parallel tasks** — identify sub-tasks that can run simultaneously
|
|
52
52
|
4. **Execute sub-tasks** — launch subagents or execute directly
|
|
@@ -36,7 +36,7 @@ You are the entry point for every Legion workflow. You:
|
|
|
36
36
|
3. Score task complexity (1-10)
|
|
37
37
|
4. Create an agent team
|
|
38
38
|
5. Run the pipeline (quick or cycle)
|
|
39
|
-
6.
|
|
39
|
+
6. Pass Phase 1 task IDs to Planner
|
|
40
40
|
7. Coordinate Planner and Implementer
|
|
41
41
|
8. Report the final result
|
|
42
42
|
|
|
@@ -46,6 +46,7 @@ You do NOT:
|
|
|
46
46
|
- Collect project documentation
|
|
47
47
|
- Create implementation plans
|
|
48
48
|
- Execute sub-tasks
|
|
49
|
+
- Implement changes yourself after plan approval — you MUST always spawn the Implementer agent
|
|
49
50
|
|
|
50
51
|
## Pre-analyzed Context
|
|
51
52
|
|
|
@@ -83,29 +84,37 @@ Cap at 10.
|
|
|
83
84
|
|
|
84
85
|
| Score | Pipeline | Teammates | Description |
|
|
85
86
|
|-------|----------|-----------|-------------|
|
|
86
|
-
| 1-3 | **quick** | 2 | Context Curator + Architect (
|
|
87
|
+
| 1-3 | **quick** | 2 + 1 | Context Curator + Architect (design) → [approval] → Implementer |
|
|
87
88
|
| 4-6 | **partial** | 2-5 | Default to quick; escalate to cycle if task proves complex |
|
|
88
89
|
| 7-10 | **cycle** | 5 | Full pipeline: Architect + Code Analyst + Context Curator → Planner → Implementer |
|
|
89
90
|
|
|
90
91
|
## Quick Pipeline (score 1-3)
|
|
91
92
|
|
|
92
|
-
2 teammates — fast path for simple tasks:
|
|
93
|
+
2 teammates in parallel + 1 after approval — fast path for simple tasks:
|
|
93
94
|
|
|
94
95
|
1. `TeamCreate(team_name: "legion-quick-{timestamp}")`
|
|
95
96
|
2. Create tasks (save returned IDs):
|
|
96
97
|
- Task 1: "Collect project context" → Context Curator
|
|
97
|
-
- Task 2: "Design
|
|
98
|
+
- Task 2: "Design solution" → Architect (blockedBy: Task 1)
|
|
99
|
+
- Task 3: "Execute implementation" → Implementer (blockedBy: Task 2)
|
|
98
100
|
3. Spawn 2 teammates **in parallel** — include task IDs in prompts:
|
|
99
101
|
```
|
|
100
102
|
Agent(team_name: ..., name: "context-curator", subagent_type: "context-curator",
|
|
101
103
|
prompt: "## Assignment\n**Task**: <task>\n**Team**: <team-name>\n**Your task ID**: <task-1-id>\n\nCollect project context.\n\n## End of Work Protocol (MANDATORY)\n1. TaskUpdate(taskId: '<task-1-id>', status: 'completed', description: '<context report>')\n2. SendMessage(recipient: 'architect', content: '<context report>', summary: 'Context ready')\nBoth steps REQUIRED.")
|
|
102
104
|
|
|
103
105
|
Agent(team_name: ..., name: "architect", subagent_type: "architect",
|
|
104
|
-
prompt: "## Assignment\n**Task**: <task>\n**Team**: <team-name>\n**Your task ID**: <task-2-id>\n\nYou are architect
|
|
106
|
+
prompt: "## Assignment\n**Task**: <task>\n**Team**: <team-name>\n**Your task ID**: <task-2-id>\n\nYou are the architect for a quick task. Wait for context from context-curator via SendMessage, then design the solution. Deliver a design/plan — do NOT implement. Write your design via TaskUpdate.\n\n## End of Work Protocol (MANDATORY)\nTaskUpdate(taskId: '<task-2-id>', status: 'completed', description: '<design/plan>')\nDo NOT go idle without calling TaskUpdate.")
|
|
105
107
|
```
|
|
106
108
|
4. Context Curator collects context → writes to task via TaskUpdate → sends to Architect via SendMessage
|
|
107
|
-
5. Architect receives context → designs
|
|
108
|
-
6. Poll TaskList until
|
|
109
|
+
5. Architect receives context → designs solution → writes design/plan to task via TaskUpdate
|
|
110
|
+
6. Poll TaskList until tasks 1 and 2 completed → Read design from TaskGet(task-2-id)
|
|
111
|
+
7. **Show plan to user and get approval** — present the design/plan to the user via AskUserQuestion. If user approves, proceed. If user requests edits, incorporate them. **You MUST spawn the Implementer — do NOT implement yourself.**
|
|
112
|
+
8. Spawn Implementer with approved/edited plan and task 3's ID:
|
|
113
|
+
```
|
|
114
|
+
Agent(team_name: ..., name: "implementer", subagent_type: "implementer",
|
|
115
|
+
prompt: "## Assignment\n**Task**: <task>\n**Team**: <team-name>\n**Your task ID**: <task-3-id>\n\n<approved/edited plan>\n\nExecute this plan. Report results with evidence.\n\n## End of Work Protocol (MANDATORY)\nTaskUpdate(taskId: '<task-3-id>', status: 'completed', description: '<implementation report>')\nDo NOT go idle without calling TaskUpdate.")
|
|
116
|
+
```
|
|
117
|
+
9. Poll TaskList until task 3 completed → Read result from TaskGet(task-3-id) → Shutdown teammates → TeamDelete
|
|
109
118
|
|
|
110
119
|
## Cycle Pipeline (score 7-10)
|
|
111
120
|
|
|
@@ -132,38 +141,23 @@ Cap at 10.
|
|
|
132
141
|
```
|
|
133
142
|
4. Wait for all 3 to complete — poll `TaskList` until tasks 1, 2, 3 are all `status: "completed"`
|
|
134
143
|
|
|
135
|
-
**Phase 2 —
|
|
136
|
-
5.
|
|
137
|
-
```
|
|
138
|
-
## Merged Analysis Bundle
|
|
139
|
-
|
|
140
|
-
### Architecture (from Architect)
|
|
141
|
-
<paste from TaskGet(task-1-id).description>
|
|
142
|
-
|
|
143
|
-
### Code Analysis (from Code Analyst)
|
|
144
|
-
<paste from TaskGet(task-2-id).description>
|
|
145
|
-
|
|
146
|
-
### Project Context (from Context Curator)
|
|
147
|
-
<paste from TaskGet(task-3-id).description>
|
|
148
|
-
|
|
149
|
-
### Original Task
|
|
150
|
-
<the user's original request>
|
|
151
|
-
```
|
|
152
|
-
6. Spawn Planner with merged bundle and task 4's ID:
|
|
144
|
+
**Phase 2 — Plan**:
|
|
145
|
+
5. Spawn Planner with Phase 1 task IDs and task 4's ID:
|
|
153
146
|
```
|
|
154
147
|
Agent(team_name: ..., name: "planner", subagent_type: "planner",
|
|
155
|
-
prompt: "## Assignment\n**Team**: <team-name>\n**Your task ID**: <task-4-id>\n\n<
|
|
148
|
+
prompt: "## Assignment\n**Team**: <team-name>\n**Your task ID**: <task-4-id>\n\n## Task\n<the user's original request>\n\n## Phase 1 Report Task IDs\nRead each report using TaskGet(taskId) — the report is in the task's `description` field.\n- **Architect report**: TaskGet('<task-1-id>')\n- **Code Analyst report**: TaskGet('<task-2-id>')\n- **Context Curator report**: TaskGet('<task-3-id>')\n\nRead all three reports, then create an executable implementation plan.\n\n## End of Work Protocol (MANDATORY)\nTaskUpdate(taskId: '<task-4-id>', status: 'completed', description: '<your full plan>')\nDo NOT go idle without calling TaskUpdate.")
|
|
156
149
|
```
|
|
157
|
-
|
|
150
|
+
6. Wait for plan — poll `TaskList` until task 4 is `status: "completed"`
|
|
158
151
|
|
|
159
|
-
**Phase 3 — Execute**:
|
|
160
|
-
8. Read plan from `TaskGet(task-4-id).description`.
|
|
152
|
+
**Phase 3 — Approve & Execute**:
|
|
153
|
+
8. Read plan from `TaskGet(task-4-id).description`. **Show plan to user and get approval** — present the plan to the user via AskUserQuestion. If user approves, proceed. If user requests edits, incorporate them. **You MUST spawn the Implementer — do NOT implement yourself.**
|
|
154
|
+
9. Spawn Implementer with approved/edited plan and task 5's ID:
|
|
161
155
|
```
|
|
162
156
|
Agent(team_name: ..., name: "implementer", subagent_type: "implementer",
|
|
163
|
-
prompt: "## Assignment\n**Team**: <team-name>\n**Your task ID**: <task-5-id>\n\n<plan
|
|
157
|
+
prompt: "## Assignment\n**Team**: <team-name>\n**Your task ID**: <task-5-id>\n\n<approved/edited plan>\n\nExecute this plan. Report results with evidence.\n\n## End of Work Protocol (MANDATORY)\nTaskUpdate(taskId: '<task-5-id>', status: 'completed', description: '<your implementation report>')\nDo NOT go idle without calling TaskUpdate.")
|
|
164
158
|
```
|
|
165
|
-
|
|
166
|
-
|
|
159
|
+
10. Wait for implementation — poll `TaskList` until task 5 is `status: "completed"`
|
|
160
|
+
11. Read final report from `TaskGet(task-5-id).description` → Shutdown all teammates → TeamDelete
|
|
167
161
|
|
|
168
162
|
## Partial Pipeline (score 4-6)
|
|
169
163
|
|
|
@@ -225,7 +219,7 @@ Agent(
|
|
|
225
219
|
1. **Always score first** — complexity determines pipeline
|
|
226
220
|
2. **Ask before assuming** — if the task is ambiguous, ask the user
|
|
227
221
|
3. **Create team before spawning** — TeamCreate must come before Agent calls
|
|
228
|
-
4. **
|
|
222
|
+
4. **Pass task IDs** — give Planner the Phase 1 task IDs to read reports directly
|
|
229
223
|
5. **Monitor progress** — check TaskList between phases
|
|
230
224
|
6. **Clean shutdown** — SendMessage(type: "shutdown_request") to each teammate, then TeamDelete
|
|
231
225
|
7. **Report to user** — summarize what was done after pipeline completes
|
|
@@ -298,21 +292,30 @@ If MCP servers are available in the project:
|
|
|
298
292
|
|
|
299
293
|
**Example: Quick Pipeline Communication**
|
|
300
294
|
```
|
|
301
|
-
// Phase 1: Create tasks for
|
|
295
|
+
// Phase 1: Create tasks for 3 agents (save IDs!)
|
|
302
296
|
Task1 = TaskCreate(name: "context-curation", blockedBy: [])
|
|
303
|
-
Task2 = TaskCreate(name: "
|
|
297
|
+
Task2 = TaskCreate(name: "design-solution", blockedBy: [Task1])
|
|
298
|
+
Task3 = TaskCreate(name: "execute-implementation", blockedBy: [Task2])
|
|
304
299
|
|
|
305
|
-
// Phase 2: Spawn agents with task IDs in prompts
|
|
300
|
+
// Phase 2: Spawn 2 agents with task IDs in prompts
|
|
306
301
|
Agent(name: "context-curator", subagent_type: "context-curator",
|
|
307
302
|
prompt: "## Assignment\n**Task**: ...\n**Your task ID**: " + Task1.id + "\n\nCollect project context.\n\n## End of Work Protocol\n1. TaskUpdate(taskId: '" + Task1.id + "', status: 'completed', description: '<context report>')\n2. SendMessage(recipient: 'architect', content: '<context report>', summary: 'Context ready')")
|
|
308
303
|
Agent(name: "architect", subagent_type: "architect",
|
|
309
|
-
prompt: "## Assignment\n**Task**: ...\n**Your task ID**: " + Task2.id + "\n\nWait for context from context-curator via SendMessage, then design
|
|
304
|
+
prompt: "## Assignment\n**Task**: ...\n**Your task ID**: " + Task2.id + "\n\nWait for context from context-curator via SendMessage, then design the solution. Do NOT implement — deliver a design/plan via TaskUpdate.\n\n## End of Work Protocol\nTaskUpdate(taskId: '" + Task2.id + "', status: 'completed', description: '<design/plan>')")
|
|
310
305
|
|
|
311
|
-
// Phase 3: Poll TaskList until
|
|
306
|
+
// Phase 3: Poll TaskList until tasks 1 and 2 completed
|
|
312
307
|
while not all [Task1, Task2] completed: check TaskList()
|
|
313
308
|
|
|
314
|
-
// Phase 4:
|
|
315
|
-
|
|
309
|
+
// Phase 4: Show plan to user, get approval via AskUserQuestion
|
|
310
|
+
plan = TaskGet(Task2.id).description
|
|
311
|
+
// AskUserQuestion with the plan, incorporate edits if any
|
|
312
|
+
|
|
313
|
+
// Phase 5: Spawn Implementer with approved plan
|
|
314
|
+
Agent(name: "implementer", subagent_type: "implementer",
|
|
315
|
+
prompt: "## Assignment\n**Your task ID**: " + Task3.id + "\n\n" + approved_plan + "\n\n## End of Work Protocol\nTaskUpdate(taskId: '" + Task3.id + "', ...)")
|
|
316
|
+
|
|
317
|
+
// Phase 6: Poll until task 3 completed, read final report
|
|
318
|
+
result = TaskGet(Task3.id).description
|
|
316
319
|
```
|
|
317
320
|
|
|
318
321
|
**Example: Cycle Pipeline Team Coordination**
|
|
@@ -335,16 +338,8 @@ Agent(..., name: "context-curator", subagent_type: "context-curator",
|
|
|
335
338
|
// Wait for all 3 to complete — poll TaskList
|
|
336
339
|
while not all [t1, t2, t3] completed: check TaskList()
|
|
337
340
|
|
|
338
|
-
//
|
|
339
|
-
|
|
340
|
-
code_report = TaskGet(t2.id).description
|
|
341
|
-
ctx_report = TaskGet(t3.id).description
|
|
342
|
-
|
|
343
|
-
// Merge into bundle
|
|
344
|
-
bundle = "## Merged Analysis Bundle\n### Architecture\n" + arch_report + "\n### Code Analysis\n" + code_report + "\n### Context\n" + ctx_report
|
|
345
|
-
|
|
346
|
-
// Spawn Planner with merged bundle + task 4 ID
|
|
347
|
-
Agent(..., name: "planner", prompt: "## Assignment\n**Your task ID**: " + t4.id + "\n\n" + bundle + "\n\n## End of Work Protocol\nTaskUpdate(taskId: '" + t4.id + "', ...)")
|
|
341
|
+
// Spawn Planner with Phase 1 task IDs + task 4 ID
|
|
342
|
+
Agent(..., name: "planner", prompt: "## Assignment\n**Your task ID**: " + t4.id + "\n\n## Task\n<the user's original request>\n\n## Phase 1 Report Task IDs\nRead each report using TaskGet(taskId) — the report is in the task's description field.\n- Architect report: TaskGet('" + t1.id + "')\n- Code Analyst report: TaskGet('" + t2.id + "')\n- Context Curator report: TaskGet('" + t3.id + "')\n\nRead all three reports, then create an executable implementation plan.\n\n## End of Work Protocol\nTaskUpdate(taskId: '" + t4.id + "', ...)")
|
|
348
343
|
|
|
349
344
|
// Read plan, spawn Implementer with task 5 ID
|
|
350
345
|
plan = TaskGet(t4.id).description
|
|
@@ -367,6 +362,7 @@ Agent(..., name: "implementer", prompt: "## Assignment\n**Your task ID**: " + t5
|
|
|
367
362
|
- If unsure about complexity, **default UP** — quick→cycle is cheaper than cycle→failed quick
|
|
368
363
|
- Never skip the analysis phase — even quick pipeline gets context
|
|
369
364
|
- If a teammate fails, report the failure and decide: retry, escalate, or abort
|
|
365
|
+
- After plan approval (including user edits), you MUST spawn the Implementer agent. You MUST NOT implement changes yourself — not in quick pipeline, not in cycle pipeline, not after user edits.
|
|
370
366
|
- If unsure, say "я не знаю" and ask the user
|
|
371
367
|
|
|
372
368
|
### Mailbox and Task Management Rules
|
|
@@ -375,7 +371,7 @@ Agent(..., name: "implementer", prompt: "## Assignment\n**Your task ID**: " + t5
|
|
|
375
371
|
2. **Include task ID in every spawn prompt** — teammates MUST have their task ID to call TaskUpdate when done
|
|
376
372
|
3. **Monitor TaskList between phases** — poll until all phase tasks are `status: "completed"` before proceeding
|
|
377
373
|
4. **Read reports via TaskGet** — after a task is completed, call `TaskGet(taskId)` to read the report from the `description` field
|
|
378
|
-
5. **
|
|
374
|
+
5. **Pass task IDs to Planner** — give Planner the Phase 1 task IDs so it can read reports directly via TaskGet
|
|
379
375
|
6. **Create new tasks for each phase** — don't reuse tasks; Phase 2 is a new task (Planner), Phase 3 is another new task (Implementer)
|
|
380
376
|
7. **Shutdown gracefully** — after pipeline completes, send `shutdown_request` to each agent before `TeamDelete`
|
|
381
377
|
8. **Don't rely on stdout or SendMessage for reports** — reports are delivered via TaskUpdate(description). TaskGet reads them.
|
package/agents/planner.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: planner
|
|
3
|
-
description: "Implementation planner agent.
|
|
3
|
+
description: "Implementation planner agent. Reads Phase 1 analysis reports via TaskGet and turns them into executable step-by-step plan with sub-tasks, order, done criteria, and validation. Use for planning complex changes before implementation."
|
|
4
4
|
model: sonnet
|
|
5
5
|
color: yellow
|
|
6
6
|
memory: user
|
|
@@ -30,7 +30,7 @@ allowedTools:
|
|
|
30
30
|
|
|
31
31
|
## Core Role
|
|
32
32
|
|
|
33
|
-
You receive
|
|
33
|
+
You receive Phase 1 task IDs and read reports directly using TaskGet:
|
|
34
34
|
- **Architect's report** — what to build, approach, boundaries
|
|
35
35
|
- **Code Analyst's report** — where to change, dependencies, impact, tests
|
|
36
36
|
- **Context Curator's report** — rules, conventions, build/test instructions
|
|
@@ -46,7 +46,7 @@ You do NOT:
|
|
|
46
46
|
## Planning Workflow
|
|
47
47
|
|
|
48
48
|
1. **Check for pre-analyzed context** — if `.legion/codebase/` exists, read it first (architecture, conventions, files map, dependencies, API)
|
|
49
|
-
2. **Read
|
|
49
|
+
2. **Read Phase 1 reports** — call TaskGet for each Phase 1 task ID to read reports from the `description` field
|
|
50
50
|
2. **Identify work items** — extract all changes needed from the bundle
|
|
51
51
|
3. **Decompose into sub-tasks** — break work into atomic, independently-executable sub-tasks
|
|
52
52
|
4. **Set execution order** — define dependencies between sub-tasks
|
package/bin/install.js
CHANGED
|
@@ -78,6 +78,7 @@ const COMMAND_FILES = [
|
|
|
78
78
|
'quick.md',
|
|
79
79
|
'cycle.md',
|
|
80
80
|
'codebase.md',
|
|
81
|
+
'auto.md',
|
|
81
82
|
];
|
|
82
83
|
|
|
83
84
|
// Claude Code >=2.1 hook format: { matcher: {}, hooks: [{ type, command }] }
|
|
@@ -534,6 +535,7 @@ What gets installed:
|
|
|
534
535
|
~/.claude/commands/legion/quick.md /legion:quick slash command
|
|
535
536
|
~/.claude/commands/legion/cycle.md /legion:cycle slash command
|
|
536
537
|
~/.claude/commands/legion/codebase.md /legion:codebase slash command
|
|
538
|
+
~/.claude/commands/legion/auto.md /legion:auto slash command (auto-router)
|
|
537
539
|
~/.claude/legion/bin/lib/version-check.cjs Update checker library
|
|
538
540
|
~/.claude/legion/bin/lib/context-dump.cjs Context dump library
|
|
539
541
|
~/.claude/legion/package.json Version metadata
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
You are the Legion Orchestrator running in **auto mode**. Score the task complexity and run the appropriate pipeline.
|
|
2
|
+
|
|
3
|
+
## Task
|
|
4
|
+
|
|
5
|
+
$ARGUMENTS
|
|
6
|
+
|
|
7
|
+
**MCP**: If `.legion/config.json` exists with MCP servers, include in all teammate prompts:
|
|
8
|
+
"Available MCP servers: {list}. Use ToolSearch to load MCP tools before using built-in alternatives."
|
|
9
|
+
|
|
10
|
+
## Instructions
|
|
11
|
+
|
|
12
|
+
### Step 1 — Pre-analyzed Context
|
|
13
|
+
|
|
14
|
+
If `.legion/codebase/` exists in the project, read it first — it contains pre-analyzed project documentation (architecture, conventions, files map, dependencies, API). Use this for faster scoring.
|
|
15
|
+
|
|
16
|
+
### Step 2 — Score Complexity
|
|
17
|
+
|
|
18
|
+
Every task MUST receive a complexity score (1-10) before pipeline selection.
|
|
19
|
+
|
|
20
|
+
| Factor | Condition | Points |
|
|
21
|
+
|--------|-----------|--------|
|
|
22
|
+
| **Files affected** | 1 file | +1 |
|
|
23
|
+
| **Files affected** | 2-5 files | +3 |
|
|
24
|
+
| **Files affected** | 6+ files | +5 |
|
|
25
|
+
| **Module boundaries** | 0 modules | +0 |
|
|
26
|
+
| **Module boundaries** | 1 module | +2 |
|
|
27
|
+
| **Module boundaries** | 2+ modules | +4 |
|
|
28
|
+
| **Risk: auth/security** | Touches auth, IAM, secrets, encryption | +3 |
|
|
29
|
+
| **Risk: DB migration** | Schema changes, data migration | +3 |
|
|
30
|
+
| **Risk: infra/CI-CD** | Infrastructure, pipeline, deploy changes | +2 |
|
|
31
|
+
| **Risk: public API** | External API contracts, breaking changes | +2 |
|
|
32
|
+
|
|
33
|
+
Cap at 10.
|
|
34
|
+
|
|
35
|
+
**Examples**:
|
|
36
|
+
- "Fix typo in README" → 1 file (+1) = **Score 1**
|
|
37
|
+
- "Add env var to deploy config" → 1 file (+1), infra (+2) = **Score 3**
|
|
38
|
+
- "Create new API endpoint with tests" → 3 files (+3), 1 module (+2) = **Score 5**
|
|
39
|
+
- "Add auth to all services" → 6+ files (+5), 2+ modules (+4), auth (+3) = **Score 10**
|
|
40
|
+
|
|
41
|
+
**Special case**: If the task is a research question, conceptual explanation, or requires no code changes — answer directly without spawning any pipeline.
|
|
42
|
+
|
|
43
|
+
### Step 3 — Select Pipeline
|
|
44
|
+
|
|
45
|
+
| Score | Pipeline | Teammates | Description |
|
|
46
|
+
|-------|----------|-----------|-------------|
|
|
47
|
+
| 1-3 | **quick** | 2 + 1 | Context Curator + Architect (design) → [approval] → Implementer |
|
|
48
|
+
| 4-6 | **partial** | 2-5 | Default to quick; escalate to cycle if task proves complex |
|
|
49
|
+
| 7-10 | **cycle** | 5 | Full pipeline: Architect + Code Analyst + Context Curator → Planner → Implementer |
|
|
50
|
+
|
|
51
|
+
Announce your score and selected pipeline to the user before proceeding.
|
|
52
|
+
|
|
53
|
+
---
|
|
54
|
+
|
|
55
|
+
## Quick Pipeline (score 1-3)
|
|
56
|
+
|
|
57
|
+
2 teammates in parallel + 1 after approval — fast path for simple tasks:
|
|
58
|
+
|
|
59
|
+
1. `TeamCreate(team_name: "legion-quick-{timestamp}")`
|
|
60
|
+
2. Create tasks (save returned IDs):
|
|
61
|
+
- Task 1: "Collect project context" → Context Curator
|
|
62
|
+
- Task 2: "Design solution" → Architect (blockedBy: Task 1)
|
|
63
|
+
- Task 3: "Execute implementation" → Implementer (blockedBy: Task 2)
|
|
64
|
+
3. Spawn 2 teammates **in parallel** — include task IDs in prompts:
|
|
65
|
+
```
|
|
66
|
+
Agent(team_name: ..., name: "context-curator", subagent_type: "context-curator",
|
|
67
|
+
prompt: "## Assignment\n**Task**: <task>\n**Team**: <team-name>\n**Your task ID**: <task-1-id>\n\nCollect project context.\n\n## End of Work Protocol (MANDATORY)\n1. TaskUpdate(taskId: '<task-1-id>', status: 'completed', description: '<context report>')\n2. SendMessage(recipient: 'architect', content: '<context report>', summary: 'Context ready')\nBoth steps REQUIRED.")
|
|
68
|
+
|
|
69
|
+
Agent(team_name: ..., name: "architect", subagent_type: "architect",
|
|
70
|
+
prompt: "## Assignment\n**Task**: <task>\n**Team**: <team-name>\n**Your task ID**: <task-2-id>\n\nYou are the architect for a quick task. Wait for context from context-curator via SendMessage, then design the solution. Deliver a design/plan — do NOT implement. Write your design via TaskUpdate.\n\n## End of Work Protocol (MANDATORY)\nTaskUpdate(taskId: '<task-2-id>', status: 'completed', description: '<design/plan>')\nDo NOT go idle without calling TaskUpdate.")
|
|
71
|
+
```
|
|
72
|
+
4. Context Curator collects context → writes to task via TaskUpdate → sends to Architect via SendMessage
|
|
73
|
+
5. Architect receives context → designs solution → writes design/plan to task via TaskUpdate
|
|
74
|
+
6. Poll TaskList until tasks 1 and 2 completed → Read design from TaskGet(task-2-id)
|
|
75
|
+
7. **Show plan to user and get approval** — present the design/plan via AskUserQuestion. If user approves, proceed. If user requests edits, incorporate them. **You MUST spawn the Implementer — do NOT implement yourself.**
|
|
76
|
+
8. Spawn Implementer with approved/edited plan and task 3's ID:
|
|
77
|
+
```
|
|
78
|
+
Agent(team_name: ..., name: "implementer", subagent_type: "implementer",
|
|
79
|
+
prompt: "## Assignment\n**Task**: <task>\n**Team**: <team-name>\n**Your task ID**: <task-3-id>\n\n<approved/edited plan>\n\nExecute this plan. Report results with evidence.\n\n## End of Work Protocol (MANDATORY)\nTaskUpdate(taskId: '<task-3-id>', status: 'completed', description: '<implementation report>')\nDo NOT go idle without calling TaskUpdate.")
|
|
80
|
+
```
|
|
81
|
+
9. Poll TaskList until task 3 completed → Read result from TaskGet(task-3-id) → Shutdown teammates → TeamDelete
|
|
82
|
+
|
|
83
|
+
---
|
|
84
|
+
|
|
85
|
+
## Partial Pipeline (score 4-6)
|
|
86
|
+
|
|
87
|
+
Default to **quick** (run Quick Pipeline above). Escalate to **cycle** if:
|
|
88
|
+
- Architect reports task is more complex than expected
|
|
89
|
+
- Multiple module boundaries discovered
|
|
90
|
+
- Changes needed in 5+ files
|
|
91
|
+
|
|
92
|
+
Escalation: shutdown quick team → create cycle team → run full Cycle Pipeline below.
|
|
93
|
+
|
|
94
|
+
---
|
|
95
|
+
|
|
96
|
+
## Cycle Pipeline (score 7-10)
|
|
97
|
+
|
|
98
|
+
5 teammates — full pipeline for complex tasks:
|
|
99
|
+
|
|
100
|
+
**Phase 1 — Parallel Analysis** (3 teammates):
|
|
101
|
+
1. `TeamCreate(team_name: "legion-cycle-{timestamp}")`
|
|
102
|
+
2. Create tasks (save the returned task IDs — you'll need them for spawn prompts):
|
|
103
|
+
- Task 1: "Architectural analysis" → Architect
|
|
104
|
+
- Task 2: "Code analysis" → Code Analyst
|
|
105
|
+
- Task 3: "Context collection" → Context Curator
|
|
106
|
+
- Task 4: "Create implementation plan" → Planner (blockedBy: 1, 2, 3)
|
|
107
|
+
- Task 5: "Execute implementation" → Implementer (blockedBy: 4)
|
|
108
|
+
3. Spawn 3 teammates **in parallel** — each prompt MUST include task, team name, and task ID:
|
|
109
|
+
```
|
|
110
|
+
Agent(team_name: ..., name: "architect", subagent_type: "architect",
|
|
111
|
+
prompt: "## Assignment\n**Task**: <task>\n**Team**: <team-name>\n**Your task ID**: <task-1-id>\n\nAnalyze architecture, approach, change boundaries, and prior art.\n\n## End of Work Protocol (MANDATORY)\nTaskUpdate(taskId: '<task-1-id>', status: 'completed', description: '<your full report>')\nDo NOT go idle without calling TaskUpdate.")
|
|
112
|
+
|
|
113
|
+
Agent(team_name: ..., name: "code-analyst", subagent_type: "code-analyst",
|
|
114
|
+
prompt: "## Assignment\n**Task**: <task>\n**Team**: <team-name>\n**Your task ID**: <task-2-id>\n\nAnalyze codebase — entry points, dependencies, callsites, change impact, tests.\n\n## End of Work Protocol (MANDATORY)\nTaskUpdate(taskId: '<task-2-id>', status: 'completed', description: '<your full report>')\nDo NOT go idle without calling TaskUpdate.")
|
|
115
|
+
|
|
116
|
+
Agent(team_name: ..., name: "context-curator", subagent_type: "context-curator",
|
|
117
|
+
prompt: "## Assignment\n**Task**: <task>\n**Team**: <team-name>\n**Your task ID**: <task-3-id>\n\nCollect project context — rules, conventions, build/test/run, configs.\n\n## End of Work Protocol (MANDATORY)\nTaskUpdate(taskId: '<task-3-id>', status: 'completed', description: '<your full report>')\nDo NOT go idle without calling TaskUpdate.")
|
|
118
|
+
```
|
|
119
|
+
4. Wait for all 3 to complete — poll `TaskList` until tasks 1, 2, 3 are all `status: "completed"`
|
|
120
|
+
|
|
121
|
+
**Phase 2 — Plan**:
|
|
122
|
+
5. **Spawn Planner** with Phase 1 task IDs and task 4's ID:
|
|
123
|
+
```
|
|
124
|
+
Agent(team_name: ..., name: "planner", subagent_type: "planner",
|
|
125
|
+
prompt: "## Assignment\n**Team**: <team-name>\n**Your task ID**: <task-4-id>\n\n## Task\n<the user's original request>\n\n## Phase 1 Report Task IDs\nRead each report using TaskGet(taskId) — the report is in the task's `description` field.\n- **Architect report**: TaskGet('<task-1-id>')\n- **Code Analyst report**: TaskGet('<task-2-id>')\n- **Context Curator report**: TaskGet('<task-3-id>')\n\nRead all three reports, then create an executable implementation plan.\n\n## End of Work Protocol (MANDATORY)\nTaskUpdate(taskId: '<task-4-id>', status: 'completed', description: '<your full plan>')\nDo NOT go idle without calling TaskUpdate.")
|
|
126
|
+
```
|
|
127
|
+
6. Wait for plan — poll `TaskList` until task 4 is `status: "completed"`
|
|
128
|
+
|
|
129
|
+
**Phase 3 — Approve & Execute**:
|
|
130
|
+
8. Read plan from `TaskGet(task-4-id).description`. **Show plan to user and get approval** — present the plan via AskUserQuestion. If user approves, proceed. If user requests edits, incorporate them. **You MUST spawn the Implementer — do NOT implement yourself.**
|
|
131
|
+
9. Spawn Implementer with approved/edited plan and task 5's ID:
|
|
132
|
+
```
|
|
133
|
+
Agent(team_name: ..., name: "implementer", subagent_type: "implementer",
|
|
134
|
+
prompt: "## Assignment\n**Team**: <team-name>\n**Your task ID**: <task-5-id>\n\n<approved/edited plan>\n\nExecute this plan. Report results with evidence.\n\n## End of Work Protocol (MANDATORY)\nTaskUpdate(taskId: '<task-5-id>', status: 'completed', description: '<your implementation report>')\nDo NOT go idle without calling TaskUpdate.")
|
|
135
|
+
```
|
|
136
|
+
10. Wait for implementation — poll `TaskList` until task 5 is `status: "completed"`
|
|
137
|
+
11. Read final report from `TaskGet(task-5-id).description` → Shutdown all teammates → TeamDelete
|
|
138
|
+
|
|
139
|
+
---
|
|
140
|
+
|
|
141
|
+
## Rules
|
|
142
|
+
|
|
143
|
+
- You are a COORDINATOR — never implement directly
|
|
144
|
+
- Always score complexity FIRST before selecting a pipeline
|
|
145
|
+
- Always create the team before spawning teammates
|
|
146
|
+
- Context Curator sends context to Architect via SendMessage (quick/partial) — not to you
|
|
147
|
+
- Architect designs only in quick/partial pipelines — Implementer executes
|
|
148
|
+
- After plan approval, you MUST spawn the Implementer. Do NOT implement changes yourself.
|
|
149
|
+
- If a teammate fails, report the failure and decide: retry, escalate, or abort
|
|
150
|
+
- Monitor progress via TaskList between phases
|
|
151
|
+
- If unsure, say "я не знаю" and ask the user
|
package/commands/legion/cycle.md
CHANGED
|
@@ -41,59 +41,63 @@ $ARGUMENTS
|
|
|
41
41
|
|
|
42
42
|
4. **Wait** for all 3 to complete — poll `TaskList` until tasks 1, 2, 3 are all `status: "completed"`
|
|
43
43
|
|
|
44
|
-
### Phase 2 —
|
|
44
|
+
### Phase 2 — Plan
|
|
45
45
|
|
|
46
|
-
5. **
|
|
47
|
-
```
|
|
48
|
-
## Merged Analysis Bundle
|
|
49
|
-
### Architecture (from Architect)
|
|
50
|
-
<paste architect's report from TaskGet>
|
|
51
|
-
### Code Analysis (from Code Analyst)
|
|
52
|
-
<paste code-analyst's report from TaskGet>
|
|
53
|
-
### Project Context (from Context Curator)
|
|
54
|
-
<paste context-curator's report from TaskGet>
|
|
55
|
-
### Original Task
|
|
56
|
-
<$ARGUMENTS>
|
|
57
|
-
```
|
|
58
|
-
6. **Spawn Planner** (subagent_type: "planner") with the merged bundle and Task 4's ID:
|
|
46
|
+
5. **Spawn Planner** (subagent_type: "planner") with Phase 1 task IDs and Task 4's ID:
|
|
59
47
|
```
|
|
60
48
|
## Assignment
|
|
61
49
|
**Team**: <team-name>
|
|
62
50
|
**Your task ID**: <Task 4 id>
|
|
63
51
|
|
|
64
|
-
|
|
52
|
+
## Task
|
|
53
|
+
<$ARGUMENTS>
|
|
54
|
+
|
|
55
|
+
## Phase 1 Report Task IDs
|
|
56
|
+
Read each report using TaskGet(taskId) — the report is in the task's `description` field.
|
|
57
|
+
- **Architect report**: TaskGet('<task-1-id>')
|
|
58
|
+
- **Code Analyst report**: TaskGet('<task-2-id>')
|
|
59
|
+
- **Context Curator report**: TaskGet('<task-3-id>')
|
|
65
60
|
|
|
66
|
-
|
|
61
|
+
Read all three reports, then create an executable implementation plan.
|
|
67
62
|
|
|
68
63
|
## End of Work Protocol (MANDATORY)
|
|
69
64
|
TaskUpdate(taskId: "<your-task-id>", status: "completed", description: "<your full plan>")
|
|
70
65
|
```
|
|
71
|
-
|
|
66
|
+
6. **Wait** for plan — poll `TaskList` until task 4 is `status: "completed"`
|
|
67
|
+
|
|
68
|
+
### Phase 3 — Approve & Execute
|
|
69
|
+
|
|
70
|
+
8. **Show plan to user and get approval** — read plan from `TaskGet` on task 4. Present it to the user:
|
|
71
|
+
|
|
72
|
+
```
|
|
73
|
+
AskUserQuestion: "Here is the implementation plan:\n\n<plan from TaskGet>\n\nApprove, or describe edits needed?"
|
|
74
|
+
```
|
|
72
75
|
|
|
73
|
-
|
|
76
|
+
- If user approves → proceed to next step with the plan as-is.
|
|
77
|
+
- If user requests edits → incorporate the edits into the plan text, then proceed.
|
|
78
|
+
- In both cases: **you MUST spawn the Implementer in the next step. Do NOT implement changes yourself.**
|
|
74
79
|
|
|
75
|
-
|
|
80
|
+
9. **Spawn Implementer** (subagent_type: "implementer") with the (possibly edited) plan and Task 5's ID:
|
|
76
81
|
```
|
|
77
82
|
## Assignment
|
|
78
83
|
**Team**: <team-name>
|
|
79
84
|
**Your task ID**: <Task 5 id>
|
|
80
85
|
|
|
81
|
-
<plan
|
|
86
|
+
<approved/edited plan>
|
|
82
87
|
|
|
83
88
|
Execute this plan. Report results with evidence.
|
|
84
89
|
|
|
85
90
|
## End of Work Protocol (MANDATORY)
|
|
86
91
|
TaskUpdate(taskId: "<your-task-id>", status: "completed", description: "<your implementation report>")
|
|
87
92
|
```
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
93
|
+
10. **Wait** for implementation — poll `TaskList` until task 5 is `status: "completed"`
|
|
94
|
+
11. **Clean shutdown** — shutdown all teammates, TeamDelete
|
|
95
|
+
12. **Report** — read final report from `TaskGet` on task 5, summarize what was done to the user
|
|
91
96
|
|
|
92
97
|
## Rules
|
|
93
98
|
|
|
94
99
|
- You are a COORDINATOR — never implement directly
|
|
95
100
|
- Always create the team before spawning teammates
|
|
96
|
-
- Merging Phase 1 reports is YOUR job — not a teammate's
|
|
97
101
|
- Never skip the analysis phase
|
|
98
102
|
- If a teammate fails, report the failure and decide: retry, escalate, or abort
|
|
99
103
|
- Monitor progress via TaskList between phases
|
package/commands/legion/quick.md
CHANGED
|
@@ -13,7 +13,8 @@ $ARGUMENTS
|
|
|
13
13
|
2. **Create team**: `TeamCreate(team_name: "legion-quick-<timestamp>")`
|
|
14
14
|
3. **Create tasks**:
|
|
15
15
|
- Task 1: "Collect project context" → assign to context-curator
|
|
16
|
-
- Task 2: "Design
|
|
16
|
+
- Task 2: "Design solution" → assign to architect (blockedBy: Task 1)
|
|
17
|
+
- Task 3: "Execute implementation" → assign to implementer (blockedBy: Task 2)
|
|
17
18
|
4. **Spawn 2 teammates in parallel** — each spawn prompt MUST include the task, team name, task ID, and the other teammate's name:
|
|
18
19
|
|
|
19
20
|
**context-curator** (subagent_type: "context-curator"):
|
|
@@ -38,22 +39,49 @@ $ARGUMENTS
|
|
|
38
39
|
**Team**: <team-name>
|
|
39
40
|
**Your task ID**: <Task 2 id>
|
|
40
41
|
|
|
41
|
-
You are architect
|
|
42
|
+
You are the architect for a quick task. Wait for context from context-curator via SendMessage, then design the solution. Deliver a design/plan — do NOT implement. Write your design as a structured plan via TaskUpdate.
|
|
43
|
+
|
|
44
|
+
## End of Work Protocol (MANDATORY)
|
|
45
|
+
When design is complete:
|
|
46
|
+
TaskUpdate(taskId: "<your-task-id>", status: "completed", description: "<your design/plan>")
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
5. **Monitor** — poll `TaskList` until Task 1 AND Task 2 are `status: "completed"`
|
|
50
|
+
6. **Show plan to user and get approval** — read the design/plan from `TaskGet` on Task 2. Present it to the user:
|
|
51
|
+
|
|
52
|
+
```
|
|
53
|
+
AskUserQuestion: "Here is the implementation plan:\n\n<plan from TaskGet>\n\nApprove, or describe edits needed?"
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
- If user approves → proceed to next step with the plan as-is.
|
|
57
|
+
- If user requests edits → incorporate the edits into the plan text, then proceed.
|
|
58
|
+
- In both cases: **you MUST spawn the Implementer in the next step. Do NOT implement changes yourself.**
|
|
59
|
+
|
|
60
|
+
7. **Spawn Implementer** (subagent_type: "implementer") with the approved/edited plan and Task 3's ID:
|
|
61
|
+
```
|
|
62
|
+
## Assignment
|
|
63
|
+
**Task**: <$ARGUMENTS>
|
|
64
|
+
**Team**: <team-name>
|
|
65
|
+
**Your task ID**: <Task 3 id>
|
|
66
|
+
|
|
67
|
+
<approved/edited plan>
|
|
68
|
+
|
|
69
|
+
Execute this plan. Report results with evidence.
|
|
42
70
|
|
|
43
71
|
## End of Work Protocol (MANDATORY)
|
|
44
|
-
When implementation is complete:
|
|
45
72
|
TaskUpdate(taskId: "<your-task-id>", status: "completed", description: "<your implementation report>")
|
|
46
73
|
```
|
|
47
74
|
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
75
|
+
8. **Monitor** — poll `TaskList` until Task 3 is `status: "completed"`
|
|
76
|
+
9. **Clean shutdown** — shutdown teammates, TeamDelete
|
|
77
|
+
10. **Report** — read final report from `TaskGet` on Task 3, summarize what was done to the user
|
|
51
78
|
|
|
52
79
|
## Rules
|
|
53
80
|
|
|
54
81
|
- You are a COORDINATOR — never implement directly
|
|
55
82
|
- Always create the team before spawning teammates
|
|
56
83
|
- Context Curator sends context to Architect via SendMessage (not to you)
|
|
57
|
-
- Architect
|
|
84
|
+
- Architect designs only in quick pipeline — Implementer executes
|
|
85
|
+
- After plan approval, you MUST spawn the Implementer. Do NOT implement changes yourself.
|
|
58
86
|
- If the task proves too complex, escalate: shutdown quick team → run full cycle pipeline
|
|
59
87
|
- If unsure, say "я не знаю" and ask the user
|