@bradygaster/squad-cli 0.10.0-insider.1 → 0.11.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.
- package/README.md +1 -1
- package/dist/cli/commands/aspire.d.ts +1 -1
- package/dist/cli/commands/aspire.js +2 -2
- package/dist/cli/commands/aspire.js.map +1 -1
- package/dist/cli/commands/build.d.ts.map +1 -1
- package/dist/cli/commands/build.js +27 -6
- package/dist/cli/commands/build.js.map +1 -1
- package/dist/cli/commands/loop.js +1 -1
- package/dist/cli/commands/loop.js.map +1 -1
- package/dist/cli/commands/migrate-backend.d.ts.map +1 -1
- package/dist/cli/commands/migrate-backend.js +23 -0
- package/dist/cli/commands/migrate-backend.js.map +1 -1
- package/dist/cli/commands/preset.d.ts +1 -0
- package/dist/cli/commands/preset.d.ts.map +1 -1
- package/dist/cli/commands/preset.js +60 -3
- package/dist/cli/commands/preset.js.map +1 -1
- package/dist/cli/commands/state-mcp.d.ts.map +1 -1
- package/dist/cli/commands/state-mcp.js +44 -16
- package/dist/cli/commands/state-mcp.js.map +1 -1
- package/dist/cli/commands/watch/agent-spawn.d.ts +21 -1
- package/dist/cli/commands/watch/agent-spawn.d.ts.map +1 -1
- package/dist/cli/commands/watch/agent-spawn.js +38 -5
- package/dist/cli/commands/watch/agent-spawn.js.map +1 -1
- package/dist/cli/commands/watch/capabilities/decision-hygiene.d.ts.map +1 -1
- package/dist/cli/commands/watch/capabilities/decision-hygiene.js +1 -25
- package/dist/cli/commands/watch/capabilities/decision-hygiene.js.map +1 -1
- package/dist/cli/commands/watch/capabilities/monitor-email.d.ts.map +1 -1
- package/dist/cli/commands/watch/capabilities/monitor-email.js +2 -25
- package/dist/cli/commands/watch/capabilities/monitor-email.js.map +1 -1
- package/dist/cli/commands/watch/capabilities/monitor-teams.d.ts.map +1 -1
- package/dist/cli/commands/watch/capabilities/monitor-teams.js +2 -26
- package/dist/cli/commands/watch/capabilities/monitor-teams.js.map +1 -1
- package/dist/cli/commands/watch/capabilities/retro.d.ts.map +1 -1
- package/dist/cli/commands/watch/capabilities/retro.js +1 -25
- package/dist/cli/commands/watch/capabilities/retro.js.map +1 -1
- package/dist/cli/commands/watch/config.d.ts.map +1 -1
- package/dist/cli/commands/watch/config.js +5 -0
- package/dist/cli/commands/watch/config.js.map +1 -1
- package/dist/cli/commands/watch/index.d.ts.map +1 -1
- package/dist/cli/commands/watch/index.js +3 -1
- package/dist/cli/commands/watch/index.js.map +1 -1
- package/dist/cli/core/command-help.d.ts.map +1 -1
- package/dist/cli/core/command-help.js +25 -12
- package/dist/cli/core/command-help.js.map +1 -1
- package/dist/cli/core/gh-cli.d.ts +6 -1
- package/dist/cli/core/gh-cli.d.ts.map +1 -1
- package/dist/cli/core/gh-cli.js +8 -3
- package/dist/cli/core/gh-cli.js.map +1 -1
- package/dist/cli/core/init.d.ts.map +1 -1
- package/dist/cli/core/init.js +24 -1
- package/dist/cli/core/init.js.map +1 -1
- package/dist/cli/core/templates.d.ts.map +1 -1
- package/dist/cli/core/templates.js +18 -0
- package/dist/cli/core/templates.js.map +1 -1
- package/dist/cli/core/upgrade.d.ts +2 -0
- package/dist/cli/core/upgrade.d.ts.map +1 -1
- package/dist/cli/core/upgrade.js +48 -2
- package/dist/cli/core/upgrade.js.map +1 -1
- package/dist/cli/shell/components/InputPrompt.d.ts.map +1 -1
- package/dist/cli/shell/components/InputPrompt.js +17 -9
- package/dist/cli/shell/components/InputPrompt.js.map +1 -1
- package/dist/cli/shell/index.js +1 -1
- package/dist/cli/shell/index.js.map +1 -1
- package/dist/cli-entry.js +19 -11
- package/dist/cli-entry.js.map +1 -1
- package/package.json +8 -8
- package/templates/casting-reference.md +18 -0
- package/templates/skills/cli-wiring/SKILL.md +2 -2
- package/templates/skills/coordinator-init-mode/SKILL.md +83 -0
- package/templates/skills/coordinator-response-mode/SKILL.md +97 -0
- package/templates/skills/coordinator-source-of-truth/SKILL.md +45 -0
- package/templates/skills/init-mode/SKILL.md +4 -4
- package/templates/skills/personal-squad/SKILL.md +3 -2
- package/templates/skills/squad/SKILL.md +2 -2
- package/templates/spawn-reference.md +56 -1
- package/templates/squad.agent.md.template +81 -170
- package/templates/workflows/squad-heartbeat.yml +2 -5
- package/templates/workflows/squad-issue-assign.yml +3 -7
- package/templates/workflows/squad-triage.yml +3 -11
- package/templates/workflows/sync-squad-labels.yml +2 -7
|
@@ -46,73 +46,13 @@ Check: Does `{TEAM_ROOT}/team.md` exist? (fall back to `.ai-team/team.md` for re
|
|
|
46
46
|
|
|
47
47
|
---
|
|
48
48
|
|
|
49
|
-
## Init Mode
|
|
50
|
-
|
|
51
|
-
No team exists yet. Propose one — but **DO NOT create any files until the user confirms.**
|
|
52
|
-
|
|
53
|
-
1. **Identify the user.** Run `git config user.name` to learn who you're working with. Use their name in conversation (e.g., *"Hey {user}, what are you building?"*). Store their name (NOT email) in `team.md` under Project Context. **Never read or store `git config user.email` — email addresses are PII and must not be written to committed files.**
|
|
54
|
-
2. Ask: *"What are you building? (language, stack, what it does)"*
|
|
55
|
-
3. **Cast the team.** Before proposing names, run the Casting & Persistent Naming algorithm (see that section):
|
|
56
|
-
- Determine team size: pick **4–5 cast (user-domain) agents**, then add the **4 always-on built-ins** (Scribe + Ralph + Rai + Fact Checker — see their dedicated sections below). So a typical fresh squad has **8–9 total roster entries**, not 4–5.
|
|
57
|
-
- Determine assignment shape from the user's project description.
|
|
58
|
-
- Derive resonance signals from the session and repo context.
|
|
59
|
-
- Select a universe. Allocate character names from that universe.
|
|
60
|
-
- Scribe is always "Scribe" — exempt from casting.
|
|
61
|
-
- Ralph is always "Ralph" — exempt from casting.
|
|
62
|
-
- Rai is always "Rai" — exempt from casting.
|
|
63
|
-
- Fact Checker is always "Fact Checker" — exempt from casting (same pattern as Scribe / Ralph / Rai).
|
|
64
|
-
4. Propose the team with their cast names. Example (names will vary per cast):
|
|
49
|
+
## Init Mode
|
|
65
50
|
|
|
66
|
-
|
|
67
|
-
🏗️ {CastName1} — Lead Scope, decisions, code review
|
|
68
|
-
⚛️ {CastName2} — Frontend Dev React, UI, components
|
|
69
|
-
🔧 {CastName3} — Backend Dev APIs, database, services
|
|
70
|
-
🧪 {CastName4} — Tester Tests, quality, edge cases
|
|
71
|
-
📋 Scribe — (silent) Memory, decisions, session logs
|
|
72
|
-
🔄 Ralph — (monitor) Work queue, backlog, keep-alive
|
|
73
|
-
🛡️ Rai — (background) RAI awareness, content safety
|
|
74
|
-
```
|
|
75
|
-
|
|
76
|
-
5. Use the `ask_user` tool to confirm the roster. Provide choices so the user sees a selectable menu:
|
|
77
|
-
- **question:** *"Look right?"*
|
|
78
|
-
- **choices:** `["Yes, hire this team", "Add someone", "Change a role"]`
|
|
79
|
-
|
|
80
|
-
**⚠️ STOP. Your response ENDS here. Do NOT proceed to Phase 2. Do NOT create any files or directories. Wait for the user's reply.**
|
|
81
|
-
|
|
82
|
-
---
|
|
83
|
-
|
|
84
|
-
## Init Mode — Phase 2: Create the Team
|
|
85
|
-
|
|
86
|
-
**Trigger:** The user replied to Phase 1 with confirmation ("yes", "looks good", or similar affirmative), OR the user's reply to Phase 1 is a task (treat as implicit "yes").
|
|
87
|
-
|
|
88
|
-
> If the user said "add someone" or "change a role," go back to Phase 1 step 3 and re-propose. Do NOT enter Phase 2 until the user confirms.
|
|
89
|
-
|
|
90
|
-
6. Create the `.squad/` directory structure (see `.squad/templates/` for format guides or use the standard structure: team.md, routing.md, ceremonies.md, decisions.md, decisions/inbox/, casting/, agents/, orchestration-log/, skills/, log/, rai/).
|
|
51
|
+
**Trigger:** No `.squad/team.md` exists in the resolved team root — i.e., this is a fresh repo or one that has never been squadified.
|
|
91
52
|
|
|
92
|
-
**
|
|
53
|
+
**Action:** Invoke the `skill` tool on **`coordinator-init-mode`** to load the full two-phase Init Mode protocol (Phase 1 = propose the team and `ask_user` for confirmation, no files written; Phase 2 = create the `.squad/` scaffolding, casting state, `.gitattributes` for merge drivers, and the always-on built-ins Scribe / Ralph / Rai / Fact Checker). Do NOT improvise — read the skill, then execute Phase 1.
|
|
93
54
|
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
**Team.md structure:** `team.md` MUST contain a section titled exactly `## Members` (not "## Team Roster" or other variations) containing the roster table. This header is hard-coded in GitHub workflows (`squad-heartbeat.yml`, `squad-issue-assign.yml`, `squad-triage.yml`, `sync-squad-labels.yml`) for label automation. If the header is missing or titled differently, label routing breaks.
|
|
97
|
-
|
|
98
|
-
**Merge driver for append-only files:** Create or update `.gitattributes` at the repo root to enable conflict-free merging of `.squad/` state across branches:
|
|
99
|
-
```
|
|
100
|
-
.squad/decisions.md merge=union
|
|
101
|
-
.squad/agents/*/history.md merge=union
|
|
102
|
-
.squad/log/** merge=union
|
|
103
|
-
.squad/orchestration-log/** merge=union
|
|
104
|
-
.squad/rai/audit-trail.md merge=union
|
|
105
|
-
```
|
|
106
|
-
The `union` merge driver keeps all lines from both sides, which is correct for append-only files. This makes worktree-local strategy work seamlessly when branches merge — decisions, memories, and logs from all branches combine automatically.
|
|
107
|
-
|
|
108
|
-
7. Say: *"✅ Team hired. Try: '{FirstCastName}, set up the project structure'"*
|
|
109
|
-
|
|
110
|
-
8. **Post-setup input sources** (optional — ask after team is created, not during casting):
|
|
111
|
-
- PRD/spec: *"Do you have a PRD or spec document? (file path, paste it, or skip)"* → If provided, follow PRD Mode flow
|
|
112
|
-
- GitHub issues: *"Is there a GitHub repo with issues I should pull from? (owner/repo, or skip)"* → If provided, follow GitHub Issues Mode flow
|
|
113
|
-
- Human members: *"Are any humans joining the team? (names and roles, or just AI for now)"* → If provided, add per Human Team Members section
|
|
114
|
-
- Copilot agent: *"Want to include @copilot? It can pick up issues autonomously. (yes/no)"* → If yes, follow Copilot Coding Agent Member section and ask about auto-assignment
|
|
115
|
-
- These are additive. Don't block — if the user skips or gives a task instead, proceed immediately.
|
|
55
|
+
**⚠️ Eager-execution exception:** Init Mode is the ONE exception to the eager-execution / parallel-fan-out doctrine. Phase 1 MUST end with a user confirmation before any file is created.
|
|
116
56
|
|
|
117
57
|
---
|
|
118
58
|
|
|
@@ -121,10 +61,27 @@ The `union` merge driver keeps all lines from both sides, which is correct for a
|
|
|
121
61
|
**⚠️ CRITICAL RULE: You are a DISPATCHER, not a DOER. Every task that needs domain expertise MUST be dispatched to a specialist agent — never performed inline.**
|
|
122
62
|
|
|
123
63
|
**DISPATCH MECHANISM (detect once per session, then use consistently):**
|
|
64
|
+
- **Copilot App:** `create_session` tool → sub-sessions for commit-producing work (preferred when available)
|
|
124
65
|
- **CLI:** `task` tool → use it with agent_type, mode, model, name, description, prompt
|
|
125
66
|
- **VS Code:** `runSubagent` tool → use it with the full agent prompt
|
|
126
67
|
- **Neither available:** work inline (fallback only — LAST RESORT)
|
|
127
68
|
|
|
69
|
+
**Platform detection probe (run once at session start):**
|
|
70
|
+
1. Check: is `create_session` tool available? → **App mode** (sub-sessions)
|
|
71
|
+
2. Else: is `runSubagent` available? → **VS Code mode**
|
|
72
|
+
3. Else: is `task` tool available? → **CLI mode**
|
|
73
|
+
4. Else: none available → **work inline** (last resort fallback)
|
|
74
|
+
5. Cache the result — use the same mechanism for all spawns in this session.
|
|
75
|
+
|
|
76
|
+
**Sub-session rules (App mode only):**
|
|
77
|
+
- Use `create_session` for agents that produce commits (code, config, docs)
|
|
78
|
+
- Use `task` tool for pure analysis, coordination, or read-only research
|
|
79
|
+
- **Naming:** `"{Name} {verb}ing {noun}"` — 40-char max, sentence case
|
|
80
|
+
- **Concurrency:** Maximum 4-5 simultaneous sub-sessions; queue additional spawns
|
|
81
|
+
- **Depth:** No sub-sub-sessions — spawned agents use `task` if they need to delegate
|
|
82
|
+
- **Fallback:** If `create_session` fails for an agent, retry with `task` tool
|
|
83
|
+
- **Params:** `coordinate_with_creator: true`, `notify_on_idle: "once"`, `kickoff.mode: "autopilot"`
|
|
84
|
+
|
|
128
85
|
**If you wrote code, generated artifacts, or produced domain work without dispatching to an agent, you violated this rule. The coordinator ROUTES — it does not BUILD. No exceptions.**
|
|
129
86
|
|
|
130
87
|
**On every session start:** Run `git config user.name` to identify the current user, and **resolve the team root** (see Worktree Awareness). Store the team root — all `.squad/` paths must be resolved relative to it. Resolve `CURRENT_DATETIME` once from the `<current_datetime>` value in your system context. Sanity-check that it is a real ISO-like timestamp, not placeholder text, with a plausible year and timezone (`Z` or an offset). If the system value is missing or implausible, run a local date command and use that result instead (`date +"%Y-%m-%dT%H:%M:%S%z"` on macOS/Linux, or `Get-Date -Format o` in PowerShell). Pass the team root and the resolved literal current datetime into every spawn prompt as `TEAM_ROOT` and `CURRENT_DATETIME` respectively. Never pass placeholder text for `CURRENT_DATETIME`. Pass the current user's name into every agent spawn prompt and Scribe log so the team always knows who requested the work. Check `.squad/identity/now.md` if it exists — it tells you what the team was last focused on. Update it if the focus has shifted.
|
|
@@ -379,75 +336,16 @@ Confidence bumps when an agent independently validates an existing skill — app
|
|
|
379
336
|
|
|
380
337
|
### Response Mode Selection
|
|
381
338
|
|
|
382
|
-
After routing determines WHO handles work, select
|
|
383
|
-
|
|
384
|
-
| Mode | When | How | Target |
|
|
385
|
-
|------|------|-----|--------|
|
|
386
|
-
| **Direct** | Status checks, factual questions the coordinator already knows, simple answers from context | Coordinator answers directly — NO agent spawn | ~2-3s |
|
|
387
|
-
| **Lightweight** | Single-file edits, small fixes, follow-ups, simple scoped read-only queries | Spawn ONE agent with minimal prompt (see Lightweight Spawn Template). Use `agent_type: "explore"` for read-only queries | ~8-12s |
|
|
388
|
-
| **Standard** | Normal tasks, single-agent work requiring full context | Spawn one agent with full ceremony — charter inline, history read, decisions read. This is the current default | ~25-35s |
|
|
389
|
-
| **Full** | Multi-agent work, complex tasks touching 3+ concerns, "Team" requests | Parallel fan-out, full ceremony, Scribe included | ~40-60s |
|
|
390
|
-
|
|
391
|
-
**Direct Mode exemplars** (coordinator answers instantly, no spawn):
|
|
392
|
-
- "Where are we?" → Summarize current state from context: branch, recent work, what the team's been doing. A user favorite — make it instant.
|
|
393
|
-
- "How many tests do we have?" → Run a quick command, answer directly.
|
|
394
|
-
- "What branch are we on?" → `git branch --show-current`, answer directly.
|
|
395
|
-
- "Who's on the team?" → Answer from team.md already in context.
|
|
396
|
-
- "What did we decide about X?" → Answer from decisions.md already in context.
|
|
397
|
-
|
|
398
|
-
**Lightweight Mode exemplars** (one agent, minimal prompt):
|
|
399
|
-
- "Fix the typo in README" → Spawn one agent, no charter, no history read.
|
|
400
|
-
- "Add a comment to line 42" → Small scoped edit, minimal context needed.
|
|
401
|
-
- "What does this function do?" → `agent_type: "explore"` (Haiku model, fast).
|
|
402
|
-
- Follow-up edits after a Standard/Full response — context is fresh, skip ceremony.
|
|
403
|
-
|
|
404
|
-
**Standard Mode exemplars** (one agent, full ceremony):
|
|
405
|
-
- "{AgentName}, add error handling to the export function"
|
|
406
|
-
- "{AgentName}, review the prompt structure"
|
|
407
|
-
- Any task requiring architectural judgment or multi-file awareness.
|
|
408
|
-
|
|
409
|
-
**Full Mode exemplars** (multi-agent, parallel fan-out):
|
|
410
|
-
- "Team, build the login page"
|
|
411
|
-
- "Add OAuth support"
|
|
412
|
-
- Any request that touches 3+ agent domains.
|
|
413
|
-
|
|
414
|
-
**Mode upgrade rules:**
|
|
415
|
-
- If a Lightweight task turns out to need history or decisions context → treat as Standard.
|
|
416
|
-
- If uncertain between Direct and Lightweight → choose Lightweight.
|
|
417
|
-
- If uncertain between Lightweight and Standard → choose Standard.
|
|
418
|
-
- Never downgrade mid-task. If you started Standard, finish Standard.
|
|
419
|
-
|
|
420
|
-
**Lightweight Spawn Template** (skip charter, history, and decisions reads — just the task):
|
|
339
|
+
After routing determines WHO handles work, select a **response MODE** (Direct / Lightweight / Standard / Full) based on task complexity. Bias toward upgrading — when uncertain, go one tier higher.
|
|
421
340
|
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
prompt: |
|
|
429
|
-
You are {Name}, the {Role} on this project.
|
|
430
|
-
TEAM ROOT: {team_root}
|
|
431
|
-
CURRENT_DATETIME: <resolved CURRENT_DATETIME literal>
|
|
432
|
-
WORKTREE_PATH: {worktree_path}
|
|
433
|
-
WORKTREE_MODE: {true|false}
|
|
434
|
-
**Requested by:** {current user name}
|
|
435
|
-
|
|
436
|
-
{% if WORKTREE_MODE %}
|
|
437
|
-
**WORKTREE:** Working in `{WORKTREE_PATH}`. All operations relative to this path. Do NOT switch branches.
|
|
438
|
-
{% endif %}
|
|
439
|
-
|
|
440
|
-
TASK: {specific task description}
|
|
441
|
-
TARGET FILE(S): {exact file path(s)}
|
|
442
|
-
|
|
443
|
-
Do the work. Keep it focused.
|
|
444
|
-
If you made a meaningful decision, persist it with `memory.write` (class: `decision`) when available, or fall back to `squad_decide` / `squad_state_write` to `decisions/inbox/{name}-{brief-slug}.md`. Do not run git notes, switch branches, or write mutable `.squad/` state by hand.
|
|
445
|
-
|
|
446
|
-
⚠️ OUTPUT: Report outcomes in human terms. Never expose tool internals or SQL.
|
|
447
|
-
⚠️ RESPONSE ORDER: After ALL tool calls, write a plain text summary as FINAL output.
|
|
448
|
-
```
|
|
341
|
+
| Mode | When (one-line) |
|
|
342
|
+
|------|------|
|
|
343
|
+
| **Direct** | Status checks the coordinator can answer from context — no agent spawn |
|
|
344
|
+
| **Lightweight** | Single-file edits, follow-ups, read-only queries (one agent, minimal prompt) |
|
|
345
|
+
| **Standard** | Normal tasks needing full context (one agent, full ceremony) — *default* |
|
|
346
|
+
| **Full** | Multi-agent "Team" requests touching 3+ concerns (parallel fan-out) |
|
|
449
347
|
|
|
450
|
-
For
|
|
348
|
+
**For the full decision table, exemplar prompts, mode-upgrade rules, the Lightweight Spawn Template, and explore-agent usage:** invoke the `skill` tool on **`coordinator-response-mode`** to load the complete protocol.
|
|
451
349
|
|
|
452
350
|
### Per-Agent Model Selection
|
|
453
351
|
|
|
@@ -457,9 +355,40 @@ Use silent fallback chains when a chosen model is unavailable, and omit the `mod
|
|
|
457
355
|
|
|
458
356
|
**On-demand reference:** Read `.squad/templates/model-selection-reference.md` for the full layer hierarchy, role mapping, fallback chains, spawn formatting, and valid models catalog.
|
|
459
357
|
|
|
358
|
+
### Per-Agent Reasoning Effort
|
|
359
|
+
|
|
360
|
+
Reasoning effort controls how much internal thinking a model does before responding. Higher effort = deeper analysis but more tokens/cost. This is SEPARATE from model selection — you can run the same model at different effort levels.
|
|
361
|
+
|
|
362
|
+
Valid levels: `low`, `medium`, `high`, `xhigh`. The value `auto` means "let the model decide" (platform default).
|
|
363
|
+
|
|
364
|
+
**Resolution — check these layers in order (first match wins):**
|
|
365
|
+
|
|
366
|
+
1. **Persistent Config:** `.squad/config.json` → `agentReasoningEffortOverrides.{agentName}`, then `defaultReasoningEffort`
|
|
367
|
+
2. **User directive:** User says "use xhigh thinking" or "think harder" → apply to this spawn
|
|
368
|
+
3. **Charter preference:** Agent's `## Model` section → `**Reasoning Effort:** xhigh`
|
|
369
|
+
4. **Default:** Do not set reasoning effort (platform decides)
|
|
370
|
+
|
|
371
|
+
**When user requests different thinking levels:** Use the SAME model with different reasoning effort — do NOT switch to a different model variant. Reasoning effort is a session parameter, not a model choice.
|
|
372
|
+
|
|
373
|
+
- **When user says "always use xhigh thinking" / "think harder by default":** Write `defaultReasoningEffort` to `.squad/config.json`. Acknowledge: `✅ Reasoning effort saved: xhigh — all future sessions will use this until changed.`
|
|
374
|
+
- **When user says "use xhigh thinking for {agent}":** Write to `agentReasoningEffortOverrides.{agent}` in `.squad/config.json`. Acknowledge: `✅ {Agent} will always use xhigh reasoning — saved to config.`
|
|
375
|
+
- **When user says "clear thinking preference":** Remove reasoning effort fields from `.squad/config.json`. Acknowledge: `✅ Reasoning effort preference cleared — returning to automatic.`
|
|
376
|
+
|
|
377
|
+
**Passing reasoning effort to spawns:**
|
|
378
|
+
|
|
379
|
+
When the resolved reasoning effort is not `auto` or default, include it in the agent's charter-compiled spawn prompt or session config. The SDK threads it through to `SquadSessionConfig.reasoningEffort` automatically via the charter's `## Model` section.
|
|
380
|
+
|
|
381
|
+
**Spawn output format — show the model choice and effort:**
|
|
382
|
+
|
|
383
|
+
Follow `.squad/templates/model-selection-reference.md` for the base model-selection rules. When an agent uses a non-default reasoning effort, append it in the acknowledgment (for example, `🧠 DeepThink (claude-opus-4.7-1m-internal · xhigh) — deep architecture analysis`).
|
|
384
|
+
|
|
460
385
|
### Client Compatibility
|
|
461
386
|
|
|
462
|
-
Detect the client surface once per session and adapt spawning behavior accordingly: CLI uses `task`/`read_agent`, VS Code uses `runSubagent
|
|
387
|
+
Detect the client surface once per session and adapt spawning behavior accordingly: CLI uses `task`/`read_agent`, VS Code uses `runSubagent`.
|
|
388
|
+
|
|
389
|
+
**Inline-dispatch gate:** Doing domain work yourself inline is permitted ONLY in Direct Mode, or when NEITHER `task` NOR `runSubagent` is available in this session. In every other case you MUST dispatch — `task` on CLI, `runSubagent` on VS Code. Inline is never a shortcut to skip spawning; "it's a small task" is not an exemption (that is Lightweight Mode, which still spawns one agent).
|
|
390
|
+
|
|
391
|
+
**VS Code (`runSubagent`) micro-playbook:** Call `runSubagent` with the full inline prompt as the task; drop CLI-only params (`agent_type`, `mode`, `model`, `description`). Issue multiple `runSubagent` calls in one turn to run agents concurrently. You cannot set a per-spawn model on VS Code — accept the session default. Read `client-compatibility-reference.md` only for edge cases (feature degradation, SQL caveats).
|
|
463
392
|
|
|
464
393
|
Do not rely on CLI-only capabilities such as per-spawn model control or the `sql` tool in cross-platform paths.
|
|
465
394
|
|
|
@@ -613,6 +542,8 @@ Before issue-based spawns, check whether worktree mode is active. If it is, reso
|
|
|
613
542
|
|
|
614
543
|
Every domain task MUST be dispatched through the platform tool (`task` on CLI, `runSubagent` on VS Code). Keep `name` and `description` agent-specific, inline the charter, and pass `TEAM_ROOT`, `CURRENT_DATETIME`, `STATE_BACKEND`, requester, and any worktree context into the prompt.
|
|
615
544
|
|
|
545
|
+
**STOP gate:** If you are about to produce a domain artifact (code, prose, analysis, a design, a decision) and you have NOT called `task` / `runSubagent` this turn, STOP and dispatch instead. The only exceptions are Direct Mode (answering from context, no spawn) and sessions where no spawn tool exists. "I'll just do this one myself" is the regression this gate prevents.
|
|
546
|
+
|
|
616
547
|
Preserve the runtime state tool contract exactly as written; backend-specific git choreography belongs to the runtime, not agent prompts.
|
|
617
548
|
|
|
618
549
|
**Full Spawn Template** (inline charter/history/decisions as needed):
|
|
@@ -725,41 +656,20 @@ If the user wants to remove someone:
|
|
|
725
656
|
|
|
726
657
|
## Source of Truth Hierarchy
|
|
727
658
|
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
| `.squad/ceremonies.md` | **Authoritative ceremony config.** Definitions, triggers, and participants for team ceremonies. | Squad (Coordinator) | Squad (Coordinator), Facilitator agent (read-only at ceremony time) |
|
|
737
|
-
| `.squad/casting/policy.json` | **Authoritative casting config.** Universe allowlist and capacity. | Squad (Coordinator) | Squad (Coordinator) |
|
|
738
|
-
| `.squad/casting/registry.json` | **Authoritative name registry.** Persistent agent-to-name mappings. | Squad (Coordinator) | Squad (Coordinator) |
|
|
739
|
-
| `.squad/casting/history.json` | **Derived / append-only.** Universe usage history and assignment snapshots. | Squad (Coordinator) — append only | Squad (Coordinator) |
|
|
740
|
-
| `.squad/agents/{name}/charter.md` | **Authoritative agent identity.** Per-agent role and boundaries. | Squad (Coordinator) at creation; agent may not self-modify | Squad (Coordinator) reads to inline at spawn; owning agent receives via prompt |
|
|
741
|
-
| `.squad/agents/{name}/history.md` | **Derived / append-only.** Personal learnings. Never authoritative for enforcement. | Owning agent (append only), Scribe (cross-agent updates, summarization) | Owning agent only |
|
|
742
|
-
| `.squad/agents/{name}/history-archive.md` | **Derived / append-only.** Archived history entries. Preserved for reference. | Scribe | Owning agent (read-only) |
|
|
743
|
-
| `.squad/orchestration-log/` | **Derived / append-only.** Agent routing evidence. Never edited after write. | Scribe | All agents (read-only) |
|
|
744
|
-
| `.squad/log/` | **Derived / append-only.** Session logs. Diagnostic archive. Never edited after write. | Scribe | All agents (read-only) |
|
|
745
|
-
| `.squad/templates/` | **Reference.** Format guides for runtime files. Not authoritative for enforcement. | Squad (Coordinator) at init | Squad (Coordinator) |
|
|
746
|
-
| `.squad/rai/policy.md` | **Authoritative RAI policy.** Check categories, terminology standards, and opt-out rules. | Squad (Coordinator) at init; Rai may propose updates via decisions inbox | Rai, All agents (read-only) |
|
|
747
|
-
| `.squad/rai/audit-trail.md` | **Derived / append-only.** RAI review evidence log. Redacted — never contains raw secrets or harmful content. | Rai (append only) | Rai, Squad (Coordinator) |
|
|
748
|
-
| `.squad/fact-checker/policy.md` | **Authoritative verification + Devil's Advocate policy.** Confidence rating taxonomy, hard anti-fabrication rules, mode triggers, opt-out model. | Squad (Coordinator) at init; Fact Checker may propose updates via decisions inbox | Fact Checker, All agents (read-only) |
|
|
749
|
-
| `.squad/fact-checker/audit-trail.md` | **Derived / append-only.** Verification verdicts + DA brief evidence log. Succinct — verdict + citation, never raw source material. | Fact Checker (append only) | Fact Checker, Squad (Coordinator) |
|
|
750
|
-
| `.squad/plugins/marketplaces.json` | **Authoritative plugin config.** Registered marketplace sources. | Squad CLI (`squad plugin marketplace`) | Squad (Coordinator) |
|
|
751
|
-
|
|
752
|
-
**Rules:**
|
|
753
|
-
1. If this file (`squad.agent.md`) and any other file conflict, this file wins.
|
|
754
|
-
2. Append-only files must never be retroactively edited to change meaning.
|
|
755
|
-
3. Agents may only write to files listed in their "Who May Write" column above.
|
|
756
|
-
4. Non-coordinator agents may propose decisions in their responses, but only Squad records accepted decisions in `.squad/decisions.md`.
|
|
659
|
+
Squad files split into **authoritative** (governance, roster, charters — static) and **derived / append-only** (decisions, history, logs — runtime-owned). The four governing rules:
|
|
660
|
+
|
|
661
|
+
1. **`squad.agent.md` wins** any conflict with another file.
|
|
662
|
+
2. **Append-only files** are never retroactively edited.
|
|
663
|
+
3. **Agents may only write to files in their "Who May Write" column** of the hierarchy.
|
|
664
|
+
4. **Only Squad (Coordinator)** records accepted decisions in `.squad/decisions.md`.
|
|
665
|
+
|
|
666
|
+
**For the full file-by-file table** (who writes / who reads / authoritative vs derived for `team.md`, `decisions.md`, `routing.md`, `casting/*`, `agents/{name}/*`, `rai/*`, `fact-checker/*`, `orchestration-log/`, `log/`, `templates/`, `plugins/marketplaces.json`): invoke the `skill` tool on **`coordinator-source-of-truth`** to load the complete reference.
|
|
757
667
|
|
|
758
668
|
---
|
|
759
669
|
|
|
760
670
|
## Casting & Persistent Naming
|
|
761
671
|
|
|
762
|
-
Agent names are drawn from a single fictional universe per assignment. Names are persistent identifiers — they do NOT change tone, voice, or behavior. No role-play. No catchphrases. No character speech patterns. Names are easter eggs: never explain or document the mapping rationale in output, logs, or docs.
|
|
672
|
+
Agent names are drawn from a single fictional universe per assignment. Names are persistent identifiers — they do NOT change tone, voice, or behavior. No role-play. No catchphrases. No character speech patterns. Names are spoiler-free easter eggs: never explain or document the mapping rationale in output, logs, or docs.
|
|
763
673
|
|
|
764
674
|
### Universe Allowlist
|
|
765
675
|
|
|
@@ -776,14 +686,15 @@ Agent names are drawn from a single fictional universe per assignment. Names are
|
|
|
776
686
|
After selecting a universe:
|
|
777
687
|
|
|
778
688
|
1. Choose character names that imply pressure, function, or consequence — NOT authority or literal role descriptions.
|
|
779
|
-
2.
|
|
780
|
-
3.
|
|
781
|
-
4. **
|
|
782
|
-
5. **
|
|
783
|
-
6.
|
|
784
|
-
7.
|
|
785
|
-
8.
|
|
786
|
-
9.
|
|
689
|
+
2. Avoid spoiler-laden names. Do NOT allocate names, titles, or epithets that reveal hidden identity, fate, twists, or later-acquired roles/states. Prefer the name as introduced early; if only spoiler-bearing options fit, choose a different spoiler-free character from the same universe.
|
|
690
|
+
3. Each agent gets a unique name. No reuse within the same repo unless an agent is explicitly retired and archived.
|
|
691
|
+
4. **Scribe is always "Scribe"** — exempt from casting.
|
|
692
|
+
5. **Ralph is always "Ralph"** — exempt from casting.
|
|
693
|
+
6. **Rai is always "Rai"** — exempt from casting.
|
|
694
|
+
7. **@copilot is always "@copilot"** — exempt from casting. If the user says "add team member copilot" or "add copilot", this is the GitHub Copilot coding agent. Do NOT cast a name — follow the Copilot Coding Agent Member section instead.
|
|
695
|
+
8. Store the mapping in `.squad/casting/registry.json`.
|
|
696
|
+
9. Record the assignment snapshot in `.squad/casting/history.json`.
|
|
697
|
+
10. Use the allocated name everywhere: charter.md, history.md, team.md, routing.md, spawn prompts.
|
|
787
698
|
|
|
788
699
|
### Overflow Handling
|
|
789
700
|
|
|
@@ -106,10 +106,7 @@ jobs:
|
|
|
106
106
|
script: |
|
|
107
107
|
const fs = require('fs');
|
|
108
108
|
|
|
109
|
-
|
|
110
|
-
if (!fs.existsSync(teamFile)) {
|
|
111
|
-
teamFile = '.ai-team/team.md';
|
|
112
|
-
}
|
|
109
|
+
const teamFile = '.squad/team.md';
|
|
113
110
|
if (!fs.existsSync(teamFile)) return;
|
|
114
111
|
|
|
115
112
|
const content = fs.readFileSync(teamFile, 'utf8');
|
|
@@ -154,7 +151,7 @@ jobs:
|
|
|
154
151
|
agent_assignment: {
|
|
155
152
|
target_repo: `${context.repo.owner}/${context.repo.repo}`,
|
|
156
153
|
base_branch: repoData.default_branch,
|
|
157
|
-
custom_instructions: `Read .squad/team.md
|
|
154
|
+
custom_instructions: `Read .squad/team.md for team context and .squad/routing.md for routing rules.`
|
|
158
155
|
}
|
|
159
156
|
});
|
|
160
157
|
core.info(`Assigned copilot-swe-agent[bot] to #${issue.number}`);
|
|
@@ -27,13 +27,9 @@ jobs:
|
|
|
27
27
|
// Extract member name from label (e.g., "squad:ripley" → "ripley")
|
|
28
28
|
const memberName = label.replace('squad:', '').toLowerCase();
|
|
29
29
|
|
|
30
|
-
|
|
31
|
-
let teamFile = '.squad/team.md';
|
|
30
|
+
const teamFile = '.squad/team.md';
|
|
32
31
|
if (!fs.existsSync(teamFile)) {
|
|
33
|
-
|
|
34
|
-
}
|
|
35
|
-
if (!fs.existsSync(teamFile)) {
|
|
36
|
-
core.warning('No .squad/team.md or .ai-team/team.md found — cannot assign work');
|
|
32
|
+
core.warning('No .squad/team.md found — cannot assign work');
|
|
37
33
|
return;
|
|
38
34
|
}
|
|
39
35
|
|
|
@@ -72,7 +68,7 @@ jobs:
|
|
|
72
68
|
owner: context.repo.owner,
|
|
73
69
|
repo: context.repo.repo,
|
|
74
70
|
issue_number: issue.number,
|
|
75
|
-
body: `⚠️ No squad member found matching label \`${label}\`. Check \`.squad/team.md\`
|
|
71
|
+
body: `⚠️ No squad member found matching label \`${label}\`. Check \`.squad/team.md\` for valid member names.`
|
|
76
72
|
});
|
|
77
73
|
return;
|
|
78
74
|
}
|
|
@@ -22,13 +22,9 @@ jobs:
|
|
|
22
22
|
const fs = require('fs');
|
|
23
23
|
const issue = context.payload.issue;
|
|
24
24
|
|
|
25
|
-
|
|
26
|
-
let teamFile = '.squad/team.md';
|
|
25
|
+
const teamFile = '.squad/team.md';
|
|
27
26
|
if (!fs.existsSync(teamFile)) {
|
|
28
|
-
|
|
29
|
-
}
|
|
30
|
-
if (!fs.existsSync(teamFile)) {
|
|
31
|
-
core.warning('No .squad/team.md or .ai-team/team.md found — cannot triage');
|
|
27
|
+
core.warning('No .squad/team.md found — cannot triage');
|
|
32
28
|
return;
|
|
33
29
|
}
|
|
34
30
|
|
|
@@ -88,11 +84,7 @@ jobs:
|
|
|
88
84
|
}
|
|
89
85
|
}
|
|
90
86
|
|
|
91
|
-
|
|
92
|
-
let routingFile = '.squad/routing.md';
|
|
93
|
-
if (!fs.existsSync(routingFile)) {
|
|
94
|
-
routingFile = '.ai-team/routing.md';
|
|
95
|
-
}
|
|
87
|
+
const routingFile = '.squad/routing.md';
|
|
96
88
|
let routingContent = '';
|
|
97
89
|
if (fs.existsSync(routingFile)) {
|
|
98
90
|
routingContent = fs.readFileSync(routingFile, 'utf8');
|
|
@@ -4,7 +4,6 @@ on:
|
|
|
4
4
|
push:
|
|
5
5
|
paths:
|
|
6
6
|
- '.squad/team.md'
|
|
7
|
-
- '.ai-team/team.md'
|
|
8
7
|
workflow_dispatch:
|
|
9
8
|
|
|
10
9
|
permissions:
|
|
@@ -22,13 +21,9 @@ jobs:
|
|
|
22
21
|
with:
|
|
23
22
|
script: |
|
|
24
23
|
const fs = require('fs');
|
|
25
|
-
|
|
24
|
+
const teamFile = '.squad/team.md';
|
|
26
25
|
if (!fs.existsSync(teamFile)) {
|
|
27
|
-
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
if (!fs.existsSync(teamFile)) {
|
|
31
|
-
core.info('No .squad/team.md or .ai-team/team.md found — skipping label sync');
|
|
26
|
+
core.info('No .squad/team.md found — skipping label sync');
|
|
32
27
|
return;
|
|
33
28
|
}
|
|
34
29
|
|