Skip to content

Linked-team teamRoot: the FAQ's ../team-repo/.squad form makes squad loop report "No squad found" #2107

Closed

Description

@cherie-q

What happens

The FAQ ("squad doctor complains about absolute path for teamRoot") recommends pointing teamRoot at the team's .squad directory itself:

{ "teamRoot": "../team-repo/.squad" }

With that config, squad loop exits with ✗ No squad found — run 'squad init' first. The same team linked as "teamRoot": "../team-repo" works.

Repro (dev 29e69f5; the same code ships in v0.13.0 and v0.13.1)

team-repo/.squad/team.md
project/.squad/config.json   { "version": 1, "teamRoot": "../team-repo/.squad" }
cd project
squad loop        # ✗ No squad found            (exit 1)
# with teamRoot "../team-repo":
squad loop        # 💤 No loop.md found ...     (exit 0, team resolved)

Why

The CLI, the coordinator and the docs don't agree on what teamRoot points at:

Where Expects teamRoot to be
CLI effectiveSquadDir() (08ceca6, #1877), used by loop/watch/health the parent of .squad/; reads {teamRoot}/.squad/team.md
squad link, and init personal-squad linking the parent of .squad/ (link refuses a target without .squad/)
Coordinator (squad.agent.md, Remote/satellite mode) either; {teamRoot}/.squad/team.md, or {teamRoot}/team.md "if teamRoot already points inside .squad/"
FAQ, and guide/personal-squad.md (shows agents/ directly under the team dir) the .squad directory itself

So a team linked the way the FAQ shows works in a Copilot session but not under squad loop.

Suggested fix

Either:

  1. Make the CLI match the coordinator: in effectiveSquadDir(), use {teamRoot}/.squad when it exists, otherwise {teamRoot} when it holds team.md; or
  2. Pick the parent-of-.squad form as canonical: fix the FAQ and personal-squad docs, and drop the coordinator fallback (maybe with a squad doctor check that flags a teamRoot ending in .squad).

(1) is the smaller change and keeps existing links working.

Activity

  1. cherie-q commented on Sep 29, 2026

    @cherie-q
    ContributorAuthor

    One more data point: this is a conflict inside the CLI itself, not only between the CLI and the docs. In v0.13.1 (b448cd3), squad state-mcp and squad loop read the same teamRoot in two different ways:

    Consumer Where it reads team state
    squad state-mcp → createStateMcpToolRegistry() (state-mcp.ts:72) → new ToolRegistry(paths.teamDir) {teamRoot}/decisions/inbox, {teamRoot}/agents/<name>/history.md, {teamRoot}/<key> (tools/index.ts:490, 595, 660)
    squad loop / watch → effectiveSquadDir() (effective-squad-dir.ts:55) {teamRoot}/.squad/team.md

    So for a linked team:

    • teamRoot → the .squad dir (the FAQ form): squad_state tools work, squad loop says "No squad found".
    • teamRoot → the parent of .squad (the squad link form): squad loop works, but squad_state reads and writes {parent}/decisions/inbox etc., outside .squad/.

    No single value works for both. Option (1) above would fix loop without changing squad_state. Option (2) would also need ToolRegistry to append paths.name in remote mode.

  2. added 2 commits that reference this issue on Sep 30, 2026
    839efe6
    a231e2f
  3. added a commit that references this issue on Oct 2, 2026
    059b31e
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

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions