Skip to content
Skill: CLI Command Wiring logo

Skill: CLI Command Wiring

**Bug class:** Commands implemented in `packages/squad-cli/src/cli/commands/` but never routed in `cli-entry.ts`.

SKILL.md

Full skill instructions

Skill: CLI Command Wiring

Bug class: Commands implemented in packages/​squad-cli/​src/​cli/​commands/ but never routed in cli-entry.ts.

Checklist — Adding a New CLI Command

  1. Create command file in packages/​squad-cli/​src/​cli/​commands/<name>.ts

    • Export a run<Name>(cwd, options) async function (or class with static methods for utility modules)
  2. Add routing block in packages/​squad-cli/​src/​cli-entry.ts inside main():

    if (cmd === '<name>') {
      const { run<Name> } = await import('./​cli/​commands/<name>.js');
      // parse args, call function
      await run<Name>(process.cwd(), options);
      return;
    }
    
  3. Add help text in the help section of cli-entry.ts (search for Commands:):

    console.log(`  ${BOLD}<name>${RESET}     <description>`);
    console.log(`             Usage: <name> [flags]`);
    
  4. Verify both exist — the recurring bug is doing step 1 but missing steps 2-3.

Wiring Patterns by Command Type

TypeExampleHow to wire
Standard commandexport.ts, build.tsrun*() function, parse flags from args
Placeholder commandloop, hireInline in cli-entry.ts, prints pending message
Utility/​check modulerc-tunnel.ts, copilot-bridge.tsWire as diagnostic check (e.g., isDevtunnelAvailable())
Subcommand of anotherinit-remote.tsAlready used inside parent + standalone alias

Common Import Pattern

import { BOLD, RESET, DIM, RED, GREEN, YELLOW } from './​cli/​core/​output.js';

Use dynamic await import() for command modules to keep startup fast (lazy loading).

History

  • #237 / PR #244: 4 commands wired (rc, copilot-bridge, init-remote, rc-tunnel). aspire, link, loop, hire were already present.