Skip to content
Merged
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
5 changes: 5 additions & 0 deletions .changeset/rename-hire-to-cast.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"squad-cli": minor
---

Rename `hire` command to `cast` in CLI help and documentation. The `hire` command continues to work as a silent alias (like `cls`/`clear` in PowerShell) — no deprecation, no warnings, it just does the same thing. All user-facing text now presents `cast` as the canonical verb because we're casting agents, not hiring humans.
4 changes: 2 additions & 2 deletions .copilot/skills/cli-wiring/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ source: "extracted"
| Type | Example | How to wire |
|------|---------|-------------|
| Standard command | `export.ts`, `build.ts` | `run*()` function, parse flags from `args` |
| Placeholder command | `loop`, `hire` | Inline in cli-entry.ts, prints pending message |
| Placeholder command | `loop`, `cast` (alias: `hire`) | Inline in cli-entry.ts, prints pending message |
| Utility/check module | `rc-tunnel.ts`, `copilot-bridge.ts` | Wire as diagnostic check (e.g., `isDevtunnelAvailable()`) |
| Subcommand of another | `init-remote.ts` | Already used inside parent + standalone alias |

Expand All @@ -52,4 +52,4 @@ Use dynamic `await import()` for command modules to keep startup fast (lazy load

## History

- **#237 / PR #244:** 4 commands wired (rc, copilot-bridge, init-remote, rc-tunnel). aspire, link, loop, hire were already present.
- **#237 / PR #244:** 4 commands wired (rc, copilot-bridge, init-remote, rc-tunnel). aspire, link, loop, cast (née hire) were already present.
8 changes: 4 additions & 4 deletions .copilot/skills/init-mode/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ No team exists yet. Propose one — but **DO NOT create any files until the user

5. Use the `ask_user` tool to confirm the roster. Provide choices so the user sees a selectable menu:
- **question:** *"Look right?"*
- **choices:** `["Yes, hire this team", "Add someone", "Change a role"]`
- **choices:** `["Yes, cast this team", "Add someone", "Change a role"]`

**⚠️ STOP. Your response ENDS here. Do NOT proceed to Phase 2. Do NOT create any files or directories. Wait for the user's reply.**

Expand All @@ -69,7 +69,7 @@ No team exists yet. Propose one — but **DO NOT create any files until the user
```
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.

7. Say: *"✅ Team hired. Try: '{FirstCastName}, set up the project structure'"*
7. Say: *"✅ Team cast. Try: '{FirstCastName}, set up the project structure'"*

8. **Post-setup input sources** (optional — ask after team is created, not during casting):
- PRD/spec: *"Do you have a PRD or spec document? (file path, paste it, or skip)"* → If provided, follow PRD Mode flow
Expand All @@ -87,9 +87,9 @@ The `union` merge driver keeps all lines from both sides, which is correct for a
4. User: *"TypeScript CLI tool with GitHub API integration"*
5. Coordinator runs casting algorithm → selects "The Usual Suspects" universe
6. Proposes: Keaton (Lead), Verbal (Prompt), Fenster (Backend), Hockney (Tester), Scribe, Ralph
7. Uses `ask_user` with choices → user selects "Yes, hire this team"
7. Uses `ask_user` with choices → user selects "Yes, cast this team"
8. Coordinator creates `.squad/` structure, initializes casting state, seeds agents
9. Says: *"✅ Team hired. Try: 'Keaton, set up the project structure'"*
9. Says: *"✅ Team cast. Try: 'Keaton, set up the project structure'"*

## Anti-Patterns

Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -138,7 +138,7 @@ Say **"squad commands"** in chat to see a categorized menu of common operations

| Command | What it does |
|---------|-------------|
| `squad init` | **Init** — scaffold Squad in the current directory (idempotent — safe to run multiple times); alias: `hire`; use `--global` to init in personal squad directory, `--mode remote <path>` for dual-root mode |
| `squad init` | **Init** — scaffold Squad in the current directory (idempotent — safe to run multiple times); alias: `cast`; use `--global` to init in personal squad directory, `--mode remote <path>` for dual-root mode |
| `squad upgrade` | Update Squad-owned files to latest; never touches your team state; use `--global` to upgrade personal squad, `--migrate-directory` to rename `.ai-team/` → `.squad/` |
| `squad upgrade --self` | Update the Squad CLI package itself; add `--insider` for dev-channel prerelease builds |
| `squad status` | Show which squad is active and why |
Expand Down
4 changes: 2 additions & 2 deletions docs/src/content/blog/001b-meet-the-squad.md
Original file line number Diff line number Diff line change
Expand Up @@ -69,8 +69,8 @@ You won't hear from Scribe. Ever. Scribe works in the background — logging ses
| Active agents | 8 |
| Silent agents | 1 |
| Total roster | 9 |
| Original hires (day one) | 5 |
| Hired in session 2+ | 3 |
| Original cast (day one) | 5 |
| Cast in session 2+ | 3 |
| Newest member | Redfoot |

## What's Next
Expand Down
2 changes: 1 addition & 1 deletion docs/src/content/docs/features/copilot-coding-agent.md
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ gh issue edit <number> --add-label "squad:copilot"

Say something like:
- **"I want to add copilot to the squad"**
- **"hire copilot to the squad"**
- **"cast copilot to the squad"**
- **"add team member copilot"**

The coordinator will add @copilot to the roster and ask about auto-assign.
Expand Down
2 changes: 1 addition & 1 deletion packages/squad-cli/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,7 @@ For detailed documentation on each command, see the [CLI Reference](https://docs

| Command | Purpose |
|---------|---------|
| `squad hire --name <name> --role <role>` | Add a new agent to your team |
| `squad cast --name <name> --role <role>` | Add a new agent to your team (alias: `hire`) |
| `squad copilot` | Add the @copilot coding agent |
| `squad copilot --off` | Remove @copilot from the team |
| `squad copilot --auto-assign` | Enable auto-assignment for @copilot |
Expand Down
22 changes: 12 additions & 10 deletions packages/squad-cli/src/cli-entry.ts
Original file line number Diff line number Diff line change
Expand Up @@ -204,8 +204,8 @@ async function main(): Promise<void> {
console.log(` Flags: --init (generate boilerplate loop.md)`);
console.log(` --file <path> (custom loop file)`);
console.log(` --monitor-email, --monitor-teams (add monitoring)`);
console.log(` ${BOLD}hire${RESET} Team creation wizard`);
console.log(` Usage: hire [--name <name>] [--role <role>]`);
console.log(` ${BOLD}cast${RESET} Show roster, or add a new agent (alias: hire)`);
console.log(` Usage: cast [--name <name>] [--role <role>]`);
Comment on lines +207 to +208
console.log(` ${BOLD}copilot${RESET} Add/remove the Copilot coding agent (@copilot)`);
console.log(` Usage: copilot [--off] [--auto-assign]`);
console.log(` ${BOLD}plugin${RESET} Manage plugin marketplaces`);
Expand Down Expand Up @@ -784,12 +784,20 @@ async function main(): Promise<void> {
return;
}

if (cmd === 'hire') {
if (cmd === 'cast' || cmd === 'hire') {
const nameIdx = args.indexOf('--name');
const name = (nameIdx !== -1 && args[nameIdx + 1]) ? args[nameIdx + 1] : undefined;
const roleIdx = args.indexOf('--role');
const role = (roleIdx !== -1 && args[roleIdx + 1]) ? args[roleIdx + 1] : undefined;
console.log('👋 Squad hire — team creation wizard starting... (full implementation pending)');

// `squad cast` with no wizard flags shows the roster; `squad hire` always runs the wizard
if (cmd === 'cast' && !name && !role) {
const { runCast } = await import('./cli/commands/cast.js');
await runCast(getSquadStartDir());
return;
}

console.log('🎬 Squad cast — team creation wizard starting... (full implementation pending)');
if (name) {
console.log(` Name: ${name}`);
}
Expand Down Expand Up @@ -1079,12 +1087,6 @@ async function main(): Promise<void> {
return;
}

if (cmd === 'cast') {
const { runCast } = await import('./cli/commands/cast.js');
await runCast(getSquadStartDir());
return;
}

if (cmd === 'skill') {
const { runSkill } = await import('./cli/commands/skill.js');
await runSkill(getSquadStartDir(), args.slice(1));
Expand Down
19 changes: 9 additions & 10 deletions packages/squad-cli/src/cli/core/command-help.ts
Original file line number Diff line number Diff line change
Expand Up @@ -127,13 +127,16 @@ const COMMAND_HELP: Record<string, HelpPrinter> = {
console.log(` squad loop --monitor-email ${DIM}# with email monitoring${RESET}`);
},

hire: (version) => {
header('hire', version, 'Team creation wizard');
console.log(`Usage: squad hire [--name <name>] [--role <role>]\n`);
console.log(`Interactive wizard that walks you through adding a new agent to the team.\n`);
cast: (version) => {
header('cast', version, 'Show roster or add a new agent to the team');
console.log(`Usage: squad cast ${DIM}# show the current cast (roster)${RESET}`);
console.log(` squad cast --name <name> --role <role> ${DIM}# add a new agent${RESET}\n`);
console.log(`With no flags, displays the current session cast (project + personal agents).`);
console.log(`With --name/--role, launches the team creation wizard.\n`);
console.log(`Options:`);
console.log(` ${BOLD}--name <name>${RESET} Pre-fill the agent name`);
console.log(` ${BOLD}--role <role>${RESET} Pre-select a built-in role (see 'squad roles')\n`);
console.log(` ${BOLD}--role <role>${RESET} Pre-select a built-in role (see 'squad roles')`);
console.log(`\nAlias: ${BOLD}squad hire${RESET} (always runs the creation wizard)\n`);
},

copilot: (version) => {
Expand Down Expand Up @@ -287,11 +290,6 @@ const COMMAND_HELP: Record<string, HelpPrinter> = {
console.log(` ${BOLD}--remote${RESET} init: back presets with a GitHub repo\n`);
},

cast: (version) => {
header('cast', version, 'Show the current session cast (project + personal agents)');
console.log(`Usage: squad cast\n`);
},

rc: (version) => printRcHelp('rc', version),
'remote-control': (version) => printRcHelp('remote-control', version),

Expand Down Expand Up @@ -402,6 +400,7 @@ function printRcHelp(name: 'rc' | 'remote-control', version: string): void {
* have explicit help blocks) do NOT need an entry here.
*/
const COMMAND_ALIASES: Readonly<Record<string, string>> = {
hire: 'cast',
streams: 'subsquads',
workstreams: 'subsquads',
};
Expand Down
2 changes: 1 addition & 1 deletion packages/squad-cli/src/cli/shell/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1015,7 +1015,7 @@ export async function runShell(): Promise<void> {

shellApi?.addMessage({
role: 'system',
content: `✅ Team hired! ${result.membersCreated.length} members created.`,
content: `✅ Team cast! ${result.membersCreated.length} members created.`,
timestamp: new Date(),
});

Expand Down
4 changes: 2 additions & 2 deletions packages/squad-cli/templates/skills/cli-wiring/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@
| Type | Example | How to wire |
|------|---------|-------------|
| Standard command | `export.ts`, `build.ts` | `run*()` function, parse flags from `args` |
| Placeholder command | `loop`, `hire` | Inline in cli-entry.ts, prints pending message |
| Placeholder command | `loop`, `cast` (alias: `hire`) | Inline in cli-entry.ts, prints pending message |
| Utility/check module | `rc-tunnel.ts`, `copilot-bridge.ts` | Wire as diagnostic check (e.g., `isDevtunnelAvailable()`) |
| Subcommand of another | `init-remote.ts` | Already used inside parent + standalone alias |

Expand All @@ -44,4 +44,4 @@ Use dynamic `await import()` for command modules to keep startup fast (lazy load

## History

- **#237 / PR #244:** 4 commands wired (rc, copilot-bridge, init-remote, rc-tunnel). aspire, link, loop, hire were already present.
- **#237 / PR #244:** 4 commands wired (rc, copilot-bridge, init-remote, rc-tunnel). aspire, link, loop, cast (née hire) were already present.
8 changes: 4 additions & 4 deletions packages/squad-cli/templates/skills/init-mode/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ No team exists yet. Propose one — but **DO NOT create any files until the user

5. Use the `ask_user` tool to confirm the roster. Provide choices so the user sees a selectable menu:
- **question:** *"Look right?"*
- **choices:** `["Yes, hire this team", "Add someone", "Change a role"]`
- **choices:** `["Yes, cast this team", "Add someone", "Change a role"]`

**⚠️ STOP. Your response ENDS here. Do NOT proceed to Phase 2. Do NOT create any files or directories. Wait for the user's reply.**

Expand All @@ -69,7 +69,7 @@ No team exists yet. Propose one — but **DO NOT create any files until the user
```
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.

7. Say: *"✅ Team hired. Try: '{FirstCastName}, set up the project structure'"*
7. Say: *"✅ Team cast. Try: '{FirstCastName}, set up the project structure'"*

8. **Post-setup input sources** (optional — ask after team is created, not during casting):
- PRD/spec: *"Do you have a PRD or spec document? (file path, paste it, or skip)"* → If provided, follow PRD Mode flow
Expand All @@ -87,9 +87,9 @@ The `union` merge driver keeps all lines from both sides, which is correct for a
4. User: *"TypeScript CLI tool with GitHub API integration"*
5. Coordinator runs casting algorithm → selects "The Usual Suspects" universe
6. Proposes: Keaton (Lead), Verbal (Prompt), Fenster (Backend), Hockney (Tester), Scribe, Ralph
7. Uses `ask_user` with choices → user selects "Yes, hire this team"
7. Uses `ask_user` with choices → user selects "Yes, cast this team"
8. Coordinator creates `.squad/` structure, initializes casting state, seeds agents
9. Says: *"✅ Team hired. Try: 'Keaton, set up the project structure'"*
9. Says: *"✅ Team cast. Try: 'Keaton, set up the project structure'"*

## Anti-Patterns

Expand Down
4 changes: 2 additions & 2 deletions packages/squad-cli/templates/skills/squad/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -214,9 +214,9 @@ Proceed? (yes / no)
### List Installed Skills

- **intent:** list skills, show skills, what skills are installed, skill catalog
- **summary:** List all skills installed in .squad/skills/ and .copilot/skills/
- **summary:** List all skills installed in .squad/skills/ and .github/skills/
- **action:** coordinator
- **command:** Direct Mode — list .squad/skills/ and .copilot/skills/ directories
- **command:** Direct Mode — list .squad/skills/ and .github/skills/ directories
- **args:** (none)
- **confirm:** false

Expand Down
4 changes: 2 additions & 2 deletions packages/squad-sdk/templates/skills/cli-wiring/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@
| Type | Example | How to wire |
|------|---------|-------------|
| Standard command | `export.ts`, `build.ts` | `run*()` function, parse flags from `args` |
| Placeholder command | `loop`, `hire` | Inline in cli-entry.ts, prints pending message |
| Placeholder command | `loop`, `cast` (alias: `hire`) | Inline in cli-entry.ts, prints pending message |
| Utility/check module | `rc-tunnel.ts`, `copilot-bridge.ts` | Wire as diagnostic check (e.g., `isDevtunnelAvailable()`) |
| Subcommand of another | `init-remote.ts` | Already used inside parent + standalone alias |

Expand All @@ -44,4 +44,4 @@ Use dynamic `await import()` for command modules to keep startup fast (lazy load

## History

- **#237 / PR #244:** 4 commands wired (rc, copilot-bridge, init-remote, rc-tunnel). aspire, link, loop, hire were already present.
- **#237 / PR #244:** 4 commands wired (rc, copilot-bridge, init-remote, rc-tunnel). aspire, link, loop, cast (née hire) were already present.
8 changes: 4 additions & 4 deletions packages/squad-sdk/templates/skills/init-mode/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ No team exists yet. Propose one — but **DO NOT create any files until the user

5. Use the `ask_user` tool to confirm the roster. Provide choices so the user sees a selectable menu:
- **question:** *"Look right?"*
- **choices:** `["Yes, hire this team", "Add someone", "Change a role"]`
- **choices:** `["Yes, cast this team", "Add someone", "Change a role"]`

**⚠️ STOP. Your response ENDS here. Do NOT proceed to Phase 2. Do NOT create any files or directories. Wait for the user's reply.**

Expand All @@ -69,7 +69,7 @@ No team exists yet. Propose one — but **DO NOT create any files until the user
```
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.

7. Say: *"✅ Team hired. Try: '{FirstCastName}, set up the project structure'"*
7. Say: *"✅ Team cast. Try: '{FirstCastName}, set up the project structure'"*

8. **Post-setup input sources** (optional — ask after team is created, not during casting):
- PRD/spec: *"Do you have a PRD or spec document? (file path, paste it, or skip)"* → If provided, follow PRD Mode flow
Expand All @@ -87,9 +87,9 @@ The `union` merge driver keeps all lines from both sides, which is correct for a
4. User: *"TypeScript CLI tool with GitHub API integration"*
5. Coordinator runs casting algorithm → selects "The Usual Suspects" universe
6. Proposes: Keaton (Lead), Verbal (Prompt), Fenster (Backend), Hockney (Tester), Scribe, Ralph
7. Uses `ask_user` with choices → user selects "Yes, hire this team"
7. Uses `ask_user` with choices → user selects "Yes, cast this team"
8. Coordinator creates `.squad/` structure, initializes casting state, seeds agents
9. Says: *"✅ Team hired. Try: 'Keaton, set up the project structure'"*
9. Says: *"✅ Team cast. Try: 'Keaton, set up the project structure'"*

## Anti-Patterns

Expand Down
4 changes: 2 additions & 2 deletions packages/squad-sdk/templates/skills/squad/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -214,9 +214,9 @@ Proceed? (yes / no)
### List Installed Skills

- **intent:** list skills, show skills, what skills are installed, skill catalog
- **summary:** List all skills installed in .squad/skills/ and .copilot/skills/
- **summary:** List all skills installed in .squad/skills/ and .github/skills/
- **action:** coordinator
- **command:** Direct Mode — list .squad/skills/ and .copilot/skills/ directories
- **command:** Direct Mode — list .squad/skills/ and .github/skills/ directories
- **args:** (none)
- **confirm:** false

Expand Down
1 change: 1 addition & 0 deletions test/cli-packaging-smoke.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -261,6 +261,7 @@ describe('CLI packaging smoke test', { timeout: 120_000 }, () => {
'migrate',
'triage',
'loop',
'cast',
'hire',
'export',
'import',
Expand Down
12 changes: 10 additions & 2 deletions test/cli-shell-comprehensive.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1268,16 +1268,24 @@ describe('Stub command removal', () => {
expect(result.handled).toBe(false);
});

it('commands.ts executeCommand does not have hire command', () => {
it('commands.ts executeCommand does not have cast/hire command', () => {
const reg = new SessionRegistry();
const renderer = new ShellRenderer();
const result = executeCommand('hire', [], {
const result = executeCommand('cast', [], {
registry: reg,
renderer,
messageHistory: [],
teamRoot: '/test',
});
expect(result.handled).toBe(false);

const resultHire = executeCommand('hire', [], {
registry: reg,
renderer,
messageHistory: [],
teamRoot: '/test',
});
expect(resultHire.handled).toBe(false);
});

it('all known commands are functional (not stubs)', () => {
Expand Down
1 change: 1 addition & 0 deletions test/cli/command-help.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,7 @@ describe('printCommandHelp', () => {
'export',
'externalize',
'extract',
'cast',
'hire',
'import',
'init',
Expand Down
Loading