Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ All notable changes to this project will be documented in this file.

## [Unreleased]


### Added — Full Work Monitor for squad watch (#708)
- `--execute` flag spawns Copilot sessions to work on actionable issues autonomously
- Multi-platform support — auto-detects GitHub vs Azure DevOps from git remote URL
Expand All @@ -30,6 +31,12 @@ All notable changes to this project will be documented in this file.
- **Contract test suite** (#640) — provider conformance tests ensuring all implementations satisfy the StorageProvider interface
- **Sample projects** (#640) — `storage-provider-azure` and `storage-provider-sqlite` in `samples/`

### Fixed — squad watch ignores extra arguments silently (#703)
- `squad watch` (and `squad triage`) now warns when extra arguments are passed instead of silently ignoring them — users see: `⚠️ Watch mode does not route messages to agents. Ignoring: "..."`
- Documentation in `ralph.md` and `cli.md` clarifies that `squad watch` is a polling loop, not a message router — create a `squad:{agent}` issue label to route work to a specific agent



## [0.9.0] - 2026-03-23

### Added — Personal Squad Governance Layer
Expand Down
18 changes: 18 additions & 0 deletions docs/src/content/docs/features/ralph.md
Original file line number Diff line number Diff line change
Expand Up @@ -208,6 +208,23 @@ This runs as a standalone local process (not inside Copilot) that:
- Assigns @copilot to `squad:copilot` issues (if auto-assign is enabled)
- Runs until Ctrl+C


:::caution[Watch mode does not route messages]
`squad watch` is a **triage polling loop**, not a message router. Extra arguments like agent names or messages are ignored:

```bash
# ❌ This does NOT route to Nick — the message is ignored
squad watch --interval 5 "Nick, Run scheduled tasks"

# ✅ To address an agent directly, use an interactive session:
squad
> Nick, Run scheduled tasks
```

To route work to a specific agent, create a GitHub issue with the appropriate `squad:{member}` label — `squad watch` will pick it up during the next poll cycle.
:::


### Full Work Monitor Mode (`--execute`)

Add `--execute` to transform Ralph from a triage bot into a full work monitor that spawns Copilot sessions and actually does the work:
Expand Down Expand Up @@ -353,6 +370,7 @@ squad watch --execute # full work monitor (auto-detects pl
- ADO rate limiting is handled differently — the circuit breaker skips quota checks
- ADO PRs don't expose `statusCheckRollup` — CI status columns may be empty


### Three layers of Ralph

| Layer | When | How |
Expand Down
4 changes: 3 additions & 1 deletion docs/src/content/docs/reference/cli.md
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,8 @@ squad init
| `squad upgrade --migrate-directory` | Rename legacy `.ai-team/` directory to `.squad/` | Yes |
| `squad link <team-repo-path>` | Link project to a remote team root | Yes |
| `squad triage` | Auto-triage issues and assign to team (primary name; `watch` is an alias) | Yes |
| `squad triage --interval <min>` | Continuous triage (default: every 10 min) | Yes |

| `squad triage --interval <min>` | Continuous triage (default: every 10 min). **Note:** extra args (e.g., agent messages) are ignored — watch is a polling loop, not a message router | Yes |
| `squad watch --execute` | Enable work execution (spawn Copilot to work on issues) | Yes |
| `squad watch --monitor-teams` | Scan Teams for actionable messages each round | Yes |
| `squad watch --monitor-email` | Scan email for alerts and action items each round | Yes |
Expand All @@ -49,6 +50,7 @@ squad init
| `squad watch --max-concurrent N` | Max parallel issues per round (default: 1) | Yes |
| `squad watch --timeout N` | Per-issue timeout in minutes (default: 30) | Yes |
| `squad watch --copilot-flags "..."` | Extra flags for Copilot CLI | Yes |

| `squad copilot` | Add the @copilot coding agent to the team | Yes |
| `squad copilot --off` | Remove @copilot from the team | Yes |
| `squad copilot --auto-assign` | Enable auto-assignment for @copilot | Yes |
Expand Down
13 changes: 13 additions & 0 deletions packages/squad-cli/src/cli-entry.ts
Original file line number Diff line number Diff line change
Expand Up @@ -383,6 +383,19 @@ async function main(): Promise<void> {
: { projectNumber: parseInt(args[boardProjectIdx + 1]!, 10) };
}

// Detect positional args that look like agent messages (user may expect routing)
const flagArgValues = new Set(
([intervalIdx, copilotFlagsIdx, agentCmdIdx, maxConcurrentIdx, timeoutIdx, boardProjectIdx] as number[])
.filter(i => i !== -1 && args[i + 1])
.map(i => args[i + 1]!)
);
const unknownPositionals = args.filter(a => a !== cmd && !a.startsWith('--') && !flagArgValues.has(a));
if (unknownPositionals.length > 0) {
const message = unknownPositionals.join(' ');
console.warn(`\n⚠️ Watch mode does not route messages to agents. Ignoring: "${message}"`);
Copy link

Copilot AI Mar 30, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This block runs for both cmd === 'triage' and cmd === 'watch', but the warning text always says "Watch mode". If the user runs squad triage ... they'll see an inaccurate message; either tailor the wording based on cmd (e.g. "triage/watch mode") or split the handling so each command prints the correct message.

Suggested change
console.warn(`\n⚠️ Watch mode does not route messages to agents. Ignoring: "${message}"`);
const modeLabel = cmd === 'triage' ? 'Triage' : 'Watch';
console.warn(`\n⚠️ ${modeLabel} mode does not route messages to agents. Ignoring: "${message}"`);

Copilot uses AI. Check for mistakes.
console.warn(` To address an agent directly, use an interactive session instead.\n`);
}

// Load config: .squad/config.json merged with CLI overrides
const config = loadWatchConfig(process.cwd(), {
interval,
Expand Down
Loading