Skip to content

Personal Squad updates #329

Closed
Closed

Description

@jsturtevant

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:

  1. Three ways to connect a squad: squad consult, squad link, and squad init --mode remote — unclear when to use which
  2. 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
  3. Consult mode's copy-then-extract model: Copying the entire personal squad, then requiring a manual squad extract step 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)
  4. Personal squad doesn't go through casting: squad init --global creates a bare scaffold — you don't get a real team
  5. Confusing flag naming: The difference between squad init --mode remote and squad link wasn'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 to packages/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-team

Adding 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:

  1. Resolves a personal team name to a path ("api-crew" → ~/.config/squad/teams/api-crew/)
  2. 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 casting
  • squad personal teams — list personal teams
  • squad personal hire [team-name] — add member to personal team
  • squad personal remove [team-name] — archive a personal team
  • squad 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 by squad init --consult
  • squad extract — no longer needed (remote mode handles write paths)
  • squad link — replaced by squad init --team-root <path>
  • squad init --mode remote — replaced by squad init --team-root <path>
  • squad init --global — replaced by squad personal add

Removed Config

  • sourceSquad field — 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:

  1. Two roots in spawn prompt — pass both TEAM_ROOT (identity) and PROJECT_ROOT (session state), with clear guidance on which files go where
  2. Coordinator-managed routing — coordinator tells each agent exactly which paths to write to, rather than a generic root
  3. Post-session sync — agents write everything to one root, a post-session step moves files to the correct locations. ⚠️ This is essentially the old squad extract model we're trying to eliminate — if we pick this approach, we haven't actually simplified anything.

Activity

  1. bradygaster commented on Mar 10, 2026

    @bradygaster
    Collaborator

    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.

  2. github-actions commented on Mar 10, 2026

    @github-actions
    Contributor

    📋 Assigned to Flight (Lead)

    Issue: #329 — Personal Squad updates

    Flight will pick this up in the next Copilot session.

    For Copilot coding agent: If enabled, this issue will be worked automatically.
    Otherwise, start a Copilot session and say:
    Flight, work on issue #329

  3. jsturtevant commented on Mar 10, 2026

    @jsturtevant
    ContributorAuthor

    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.

  4. jsturtevant commented on Mar 10, 2026

    @jsturtevant
    ContributorAuthor

    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

  5. added 8 commits that reference this issue on Mar 11, 2026
    509ac92
    138652a
    a7170d6
    19d0e15
    18753ae
    2b61df2
    245ad0e
    804ab7f
  6. 8 remaining items

  7. github-actions commented on Mar 13, 2026

    @github-actions
    Contributor

    📋 Assigned to Flight (Lead)

    Issue: #329 — Personal Squad updates

    Flight will pick this up in the next Copilot session.

    For Copilot coding agent: If enabled, this issue will be worked automatically.
    Otherwise, start a Copilot session and say:
    Flight, work on issue #329

  8. deleted a comment from github-actions on Mar 18, 2026
  9. added
    squadSquad triage inbox — Lead will assign to a member
    on Mar 20, 2026
  10. bradygaster commented on Mar 22, 2026

    @bradygaster
    Collaborator

    🏗️ 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:

    1. 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.

    2. 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.

    3. Dual-root spawn prompts — Personal agents receive both \TEAM_ROOT\ (personal squad path) and \PROJECT_ROOT\ (project .squad/ path) with clear Ghost Protocol instructions.

    4. Conflict resolution — Project agents win naming conflicts by default. Personal agents are consultants who defer to the client team.

    5. 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:

    • Multi-team personal squads: ✅ Preserved from your design (squads.json registry)
    • --consult\ mode: Deprecated in favor of ambient discovery (consult remains for 'full personal squad' scenarios)
    • \squad extract: Unnecessary — personal agent state writes go directly to personal squad
    • Dual-root open question: Resolved via Ghost Protocol + dual-root spawn prompts

    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.

  11. bradygaster commented on Mar 23, 2026

    @bradygaster
    Collaborator

    Superseded by #508 (Ambient Personal Squad) — fully implemented and merged.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    next-upPriority queue — next issues to workpriority:p1This sprintsquadSquad triage inbox — Lead will assign to a membertype:rfcRFC

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions