Repository navigation
Description
I've been testing Personal squads with the new CLI and its not currently a smooth experience. I've prototype some of this and feel like that it works decently but this is just a proposal please feel free to suggest alternatives.
personal squad: multi-team support and linking teams to projects
Summary
This proposal introduces multiple domain-specific personal teams (e.g., frontend-focused, API consulting, quick-fixes), each with its own charter and skills, managed via a new squad personal subcommand. Consult mode and --mode remote and link become one concept --team-root: it resolves a personal team name to a path. Clearer mental model, fewer overlapping commands.
Problem
Several overlapping features created confusion:
- Three ways to connect a squad:
squad consult,squad link, andsquad init --mode remote— unclear when to use which - Single personal squad limitation: Users often want different squads for different work (frontend vs backend vs quick fixes) but could only have one personal team
- Consult mode's copy-then-extract model: Copying the entire personal squad, then requiring a manual
squad extractstep was used to extract the learnings to the personal squad but there is a dual root write in the SDK (see Open Design Question — the old extract step is essentially approach 3, "post-session sync," which maybe necessary if using copilot) - Personal squad doesn't go through casting:
squad init --globalcreates a bare scaffold — you don't get a real team - Confusing flag naming: The difference between
squad init --mode remoteandsquad linkwasn't clear
Solution
Multiple Personal Teams
Users can create multiple named personal teams, each stored directly under ~/.config/squad/teams/{name}/:
~/.config/squad/
├── teams/
│ ├── api-crew/ # IS the squad root (agents/, team.md, decisions.md, skills/, etc.)
│ ├── ui-squad/
│ └── quick-fixes/
└── config.json # global config, preferences
Each team directory IS the squad structure directly — no nested .squad/ subdirectory. In a project repo, .squad/ exists to namespace squad files alongside your code. In a personal team directory, there are no other files, so the extra nesting is redundant.
Resolver note:
resolveSquadPaths()currently appends.squad/to the root. For personal teams, the resolver needs to recognize it's already pointing at a squad root and skip the extra nesting. This is a small change topackages/squad-sdk/src/resolution.ts.
Each team has its own charter, skills, history, and decisions. No persistent "active team" concept — you choose which team at squad init time.
How this relates to Inheritance (Two Layers)
These are separate concerns:
- teamRoot — where your team identity lives (charters, skills, routing). "Who is on my squad?" Used by consult and team-root modes.
- Upstream (
upstream.json) — inherited context from other squads (org-level skills, decisions, wisdom). "What does my org know?" Orthogonal, works with any mode.
Usage Examples
# Create your first personal team (walks through casting)
squad personal add "api-crew"
# Create a second team for UI work
squad personal add "ui-squad"
# See your teams
squad personal teams
# Add a member to a team
squad personal hire "api-crew"
# Consult on someone else's project
cd ~/projects/their-repo
squad init --consult "api-crew"
# Normal project squad (committed, how it works today)
cd ~/projects/my-repo
squad init
# Link to a shared team identity (advanced)
squad init --team-root ../shared-teamAdding teams to projects
squad init # normal local squad, everything gets initialized in the project
squad init --consult "api-crew" # personal team, hidden from git (90% use case)
squad init --consult # prompts to pick team if multiple exist
squad init --team-root ../shared-team # shared/org team, visible (advanced)The key insight: --consult and --team-root use the same underlying mechanism (both set teamRoot in config.json). Consult adds two bits of sugar:
- Resolves a personal team name to a path (
"api-crew"→~/.config/squad/teams/api-crew/) - Hides .squad/ from git via
.git/info/exclude
Unified Architecture
| Mode | teamRoot | State writes | Git visibility |
|---|---|---|---|
Normal (squad init) |
./.squad/ | Project | ✅ Visible |
Consult (squad init --consult "team") |
~/.config/squad/teams/{name}/ | Project .squad/ | ❌ Hidden via .git/info/exclude |
Team Root (squad init --team-root <path>) |
External path | Project .squad/ | ✅ Visible |
Note: Consult is sugar over Team Root — both set teamRoot in config.json. Consult adds personal team name resolution + git invisibility.
In Consult and Team Root modes:
- Agent identity (charters, skills, casting) lives at the teamRoot
- Runtime state (session logs, orchestration logs) stays in the local project .squad/
- The dual-root resolver handles this split
What Changes
Added Commands
squad personal add [name]— create a new personal team with castingsquad personal teams— list personal teamssquad personal hire [team-name]— add member to personal teamsquad personal remove [team-name]— archive a personal teamsquad init --consult [team-name]— consult mode (sugar over --team-root + git invisibility)squad init --team-root <path>— link to external team identity
Removed Commands
squad consult— replaced bysquad init --consultsquad extract— no longer needed (remote mode handles write paths)squad link— replaced bysquad init --team-root <path>squad init --mode remote— replaced bysquad init --team-root <path>squad init --global— replaced bysquad personal add
Removed Config
sourceSquadfield — no longer needed (teamRoot handles this) (depends on outcome of Open Design Question
⚠️ Open Design Question: Dual-Root Agent Write Paths
The SDK's resolveSquadPaths() (in packages/squad-sdk/src/resolution.ts) returns two paths:
projectDir— local.squad/for session state (logs, orchestration)teamDir— remote identity root (charters, history, decisions, skills)
This works in SDK mode (Node.js code writes to the correct path programmatically). But when agents are spawned via Copilot's task tool, they receive a single TEAM_ROOT in their prompt and write everything relative to it. There's no dual-root awareness in the agent prompt template today.
The problem: In consult mode (teamRoot = ~/.squad/), the agent needs to write history and decisions to the personal squad (teamDir) but session logs to the local project (projectDir). With one root, it can't do both correctly.
Possible approaches:
- Two roots in spawn prompt — pass both
TEAM_ROOT(identity) andPROJECT_ROOT(session state), with clear guidance on which files go where - Coordinator-managed routing — coordinator tells each agent exactly which paths to write to, rather than a generic root
- Post-session sync — agents write everything to one root, a post-session step moves files to the correct locations.
⚠️ This is essentially the oldsquad extractmodel we're trying to eliminate — if we pick this approach, we haven't actually simplified anything.
Activity
bradygaster commentedon Mar 10, 2026
Triage: RFC for multi-team personal squads with clearer mental model. Addresses confusion around squad consult/link/init modes. Setting as P1 — impacts core API design. Needs proposal-first review before implementation.
github-actions commentedon Mar 10, 2026
📋 Assigned to Flight (Lead)
Issue: #329 — Personal Squad updates
Flight will pick this up in the next Copilot session.
jsturtevant commentedon Mar 10, 2026
Looked alittle more into the "Open Design Question"
The docs show that this spilt is wired up in the SDK and how it is expected to work https://bradygaster.github.io/squad/docs/guide/personal-squad/#3-what-just-happened-behind-the-scenes. What seems to be missing is some instructions in the Squad coordinate agent that knows about this. The SDK would be preferred route since its more deterministic but giving some information like it does with TEAM_ROOT now, would help quite a bit.
jsturtevant commentedon Mar 10, 2026
Ok, so I think I found out how this should work: https://github.com/bradygaster/squad/issues/344
The changes in this issue are wider and would require larger changes but would still be interested in knowing if these types of changes would be interesting to folks
fix: implement P0 UX blockers from Marquez audit (github#349)
chore(squad): Phase 2 launch — thinking feedback, P0 bugs, dual telem…
feat: rich progress indicators for agent work (github#357)
style: copy polish — human, fun, action-oriented (github#358)
feat: accessibility hardening and guidelines (github#359)
feat: terminal adaptivity 40-120 col range (github#360)
feat: breathtaking first-run wow moment (github#362)
test: E2E integration tests for REPL flow (github#379)
8 remaining items
github-actions commentedon Mar 13, 2026
📋 Assigned to Flight (Lead)
Issue: #329 — Personal Squad updates
Flight will pick this up in the next Copilot session.
bradygaster commentedon Mar 22, 2026
🏗️ Flight — Ambient Personal Squad Design
I've written a design proposal that addresses this issue and #344 together: .squad/decisions/inbox/flight-ambient-personal-squad.md
Core idea: Personal squads become an ambient cast — auto-discovered at session start, merged into whatever project squad the user is working in. No more \squad consult\ copy-then-extract. Daryl just shows up.
Key design decisions:
Ambient discovery — Coordinator reads the user's active personal squad from ~/.config/squad/squads.json\ at session start and merges personal agents into the session cast alongside project agents.
Ghost Protocol — Personal agents can produce work product (code, diagrams) for the project, but their identity state (history, decisions) writes back to the personal squad directory only. Zero footprint on client repos.
Dual-root spawn prompts — Personal agents receive both \TEAM_ROOT\ (personal squad path) and \PROJECT_ROOT\ (project .squad/ path) with clear Ghost Protocol instructions.
Conflict resolution — Project agents win naming conflicts by default. Personal agents are consultants who defer to the client team.
Git-free by default — Personal squads are plain filesystem state. Users MAY version with git, but it's not required.
How this relates to #329's proposal:
12 E2E test scenarios defined covering auto-discovery, conflict resolution, ghost mode, routing priority, graceful degradation, and git-free operation.
4 implementation phases: Ambient Discovery → Ghost Protocol → Routing Integration → Consult Deprecation
Full design doc is in the repo. Feedback welcome from @jsturtevant and @bradygaster.
Scribe: Wave 1 decisions merged (#329/#344/#500)
fix: hard-fail on Node <22.5.0 with clear message (#502) (#506)
docs: log session 2 — wave 1+2 results, 4 PRs merged
bradygaster commentedon Mar 23, 2026
Superseded by #508 (Ambient Personal Squad) — fully implemented and merged.