squads-cli 0.2.0 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +521 -288
- package/dist/auth-YW3UPFSB.js +23 -0
- package/dist/auth-YW3UPFSB.js.map +1 -0
- package/dist/autonomy-PSVZVX7A.js +105 -0
- package/dist/autonomy-PSVZVX7A.js.map +1 -0
- package/dist/chunk-67RO2HKR.js +174 -0
- package/dist/chunk-67RO2HKR.js.map +1 -0
- package/dist/chunk-7OCVIDC7.js +12 -0
- package/dist/chunk-7OCVIDC7.js.map +1 -0
- package/dist/chunk-BODLDQY7.js +452 -0
- package/dist/chunk-BODLDQY7.js.map +1 -0
- package/dist/chunk-EHQJHRIW.js +103 -0
- package/dist/chunk-EHQJHRIW.js.map +1 -0
- package/dist/chunk-FFFCFZ6A.js +121 -0
- package/dist/chunk-FFFCFZ6A.js.map +1 -0
- package/dist/chunk-FIWT2NMM.js +165 -0
- package/dist/chunk-FIWT2NMM.js.map +1 -0
- package/dist/chunk-HF4WR7RA.js +154 -0
- package/dist/chunk-HF4WR7RA.js.map +1 -0
- package/dist/chunk-J6QF4ZQX.js +230 -0
- package/dist/chunk-J6QF4ZQX.js.map +1 -0
- package/dist/chunk-LOA3KWYJ.js +294 -0
- package/dist/chunk-LOA3KWYJ.js.map +1 -0
- package/dist/chunk-M5FXNY6Y.js +384 -0
- package/dist/chunk-M5FXNY6Y.js.map +1 -0
- package/dist/chunk-QHNUMM4V.js +87 -0
- package/dist/chunk-QHNUMM4V.js.map +1 -0
- package/dist/chunk-QJ7C7CMB.js +223 -0
- package/dist/chunk-QJ7C7CMB.js.map +1 -0
- package/dist/chunk-RM6BWILN.js +74 -0
- package/dist/chunk-RM6BWILN.js.map +1 -0
- package/dist/chunk-TYFTF53O.js +613 -0
- package/dist/chunk-TYFTF53O.js.map +1 -0
- package/dist/chunk-TZXD6WFN.js +420 -0
- package/dist/chunk-TZXD6WFN.js.map +1 -0
- package/dist/chunk-WVOIY5GW.js +621 -0
- package/dist/chunk-WVOIY5GW.js.map +1 -0
- package/dist/chunk-Z2UKDBNL.js +162 -0
- package/dist/chunk-Z2UKDBNL.js.map +1 -0
- package/dist/chunk-ZTQ7ISUR.js +338 -0
- package/dist/chunk-ZTQ7ISUR.js.map +1 -0
- package/dist/cli.js +2483 -5902
- package/dist/cli.js.map +1 -1
- package/dist/context-GWPF4SEY.js +291 -0
- package/dist/context-GWPF4SEY.js.map +1 -0
- package/dist/context-feed-AJGVAR6H.js +394 -0
- package/dist/context-feed-AJGVAR6H.js.map +1 -0
- package/dist/cost-XBCDJ7XC.js +275 -0
- package/dist/cost-XBCDJ7XC.js.map +1 -0
- package/dist/create-BLFGG6PF.js +286 -0
- package/dist/create-BLFGG6PF.js.map +1 -0
- package/dist/dashboard-LGT2B2BL.js +951 -0
- package/dist/dashboard-LGT2B2BL.js.map +1 -0
- package/dist/dashboard-RMK2BOD2.js +794 -0
- package/dist/dashboard-RMK2BOD2.js.map +1 -0
- package/dist/doctor-XPUIIBHJ.js +374 -0
- package/dist/doctor-XPUIIBHJ.js.map +1 -0
- package/dist/env-config-SQEI3Y7Y.js +21 -0
- package/dist/env-config-SQEI3Y7Y.js.map +1 -0
- package/dist/exec-OUXM7JBF.js +223 -0
- package/dist/exec-OUXM7JBF.js.map +1 -0
- package/dist/feedback-KNAOG5QK.js +229 -0
- package/dist/feedback-KNAOG5QK.js.map +1 -0
- package/dist/github-UQTM5KMS.js +23 -0
- package/dist/github-UQTM5KMS.js.map +1 -0
- package/dist/goal-BVHV5573.js +168 -0
- package/dist/goal-BVHV5573.js.map +1 -0
- package/dist/health-4UXN44PF.js +218 -0
- package/dist/health-4UXN44PF.js.map +1 -0
- package/dist/history-ILH3SWHB.js +232 -0
- package/dist/history-ILH3SWHB.js.map +1 -0
- package/dist/index.d.ts +736 -8
- package/dist/index.js +1312 -6
- package/dist/index.js.map +1 -1
- package/dist/init-XQZ7BOGT.js +812 -0
- package/dist/init-XQZ7BOGT.js.map +1 -0
- package/dist/kpi-RQIU7WGK.js +413 -0
- package/dist/kpi-RQIU7WGK.js.map +1 -0
- package/dist/learn-OIFUVZAS.js +269 -0
- package/dist/learn-OIFUVZAS.js.map +1 -0
- package/dist/login-DXZANWZY.js +155 -0
- package/dist/login-DXZANWZY.js.map +1 -0
- package/dist/memory-T3ACCS7E.js +560 -0
- package/dist/memory-T3ACCS7E.js.map +1 -0
- package/dist/memory-VNF2VFRB.js +23 -0
- package/dist/memory-VNF2VFRB.js.map +1 -0
- package/dist/progress-DAUZMT3N.js +202 -0
- package/dist/progress-DAUZMT3N.js.map +1 -0
- package/dist/providers-3P5D2XL5.js +65 -0
- package/dist/providers-3P5D2XL5.js.map +1 -0
- package/dist/results-UECWGLTB.js +224 -0
- package/dist/results-UECWGLTB.js.map +1 -0
- package/dist/run-I6KAXU6U.js +4049 -0
- package/dist/run-I6KAXU6U.js.map +1 -0
- package/dist/session-HBU6KZOD.js +64 -0
- package/dist/session-HBU6KZOD.js.map +1 -0
- package/dist/sessions-CK25VGPL.js +333 -0
- package/dist/sessions-CK25VGPL.js.map +1 -0
- package/dist/squad-parser-DCG65BJS.js +35 -0
- package/dist/squad-parser-DCG65BJS.js.map +1 -0
- package/dist/stats-G6NAU5BD.js +334 -0
- package/dist/stats-G6NAU5BD.js.map +1 -0
- package/dist/status-AQNLDZVN.js +352 -0
- package/dist/status-AQNLDZVN.js.map +1 -0
- package/dist/sync-ZI3MHA4G.js +836 -0
- package/dist/sync-ZI3MHA4G.js.map +1 -0
- package/dist/templates/core/AGENTS.md.template +51 -0
- package/dist/templates/core/BUSINESS_BRIEF.md.template +29 -0
- package/dist/templates/core/CLAUDE.md.template +48 -0
- package/dist/templates/core/provider.yaml.template +5 -0
- package/dist/templates/first-squad/SQUAD.md.template +23 -0
- package/dist/templates/first-squad/lead.md.template +44 -0
- package/dist/templates/memory/getting-started/state.md.template +19 -0
- package/dist/templates/seed/BUSINESS_BRIEF.md.template +27 -0
- package/dist/templates/seed/CLAUDE.md.template +119 -0
- package/dist/templates/seed/README.md.template +42 -0
- package/dist/templates/seed/config/SYSTEM.md +52 -0
- package/dist/templates/seed/config/provider.yaml +4 -0
- package/dist/templates/seed/hooks/settings.json.template +31 -0
- package/dist/templates/seed/memory/company/directives.md +37 -0
- package/dist/templates/seed/memory/company/manager/state.md +16 -0
- package/dist/templates/seed/memory/engineering/issue-solver/state.md +12 -0
- package/dist/templates/seed/memory/intelligence/intel-lead/state.md +9 -0
- package/dist/templates/seed/memory/marketing/content-drafter/state.md +12 -0
- package/dist/templates/seed/memory/operations/ops-lead/state.md +12 -0
- package/dist/templates/seed/memory/product/lead/state.md +14 -0
- package/dist/templates/seed/memory/research/lead/state.md +14 -0
- package/dist/templates/seed/skills/gh/SKILL.md +57 -0
- package/dist/templates/seed/skills/squads-cli/SKILL.md +84 -0
- package/dist/templates/seed/squads/company/SQUAD.md +51 -0
- package/dist/templates/seed/squads/company/company-critic.md +49 -0
- package/dist/templates/seed/squads/company/company-eval.md +49 -0
- package/dist/templates/seed/squads/company/event-dispatcher.md +43 -0
- package/dist/templates/seed/squads/company/goal-tracker.md +43 -0
- package/dist/templates/seed/squads/company/manager.md +54 -0
- package/dist/templates/seed/squads/engineering/SQUAD.md +48 -0
- package/dist/templates/seed/squads/engineering/code-reviewer.md +57 -0
- package/dist/templates/seed/squads/engineering/issue-solver.md +58 -0
- package/dist/templates/seed/squads/engineering/test-writer.md +50 -0
- package/dist/templates/seed/squads/intelligence/SQUAD.md +38 -0
- package/dist/templates/seed/squads/intelligence/intel-critic.md +36 -0
- package/dist/templates/seed/squads/intelligence/intel-eval.md +31 -0
- package/dist/templates/seed/squads/intelligence/intel-lead.md +71 -0
- package/dist/templates/seed/squads/marketing/SQUAD.md +47 -0
- package/dist/templates/seed/squads/marketing/content-drafter.md +71 -0
- package/dist/templates/seed/squads/marketing/growth-analyst.md +49 -0
- package/dist/templates/seed/squads/marketing/social-poster.md +44 -0
- package/dist/templates/seed/squads/operations/SQUAD.md +45 -0
- package/dist/templates/seed/squads/operations/finance-tracker.md +47 -0
- package/dist/templates/seed/squads/operations/goal-tracker.md +48 -0
- package/dist/templates/seed/squads/operations/ops-lead.md +58 -0
- package/dist/templates/seed/squads/product/SQUAD.md +41 -0
- package/dist/templates/seed/squads/product/lead.md +56 -0
- package/dist/templates/seed/squads/product/scanner.md +50 -0
- package/dist/templates/seed/squads/product/worker.md +55 -0
- package/dist/templates/seed/squads/research/SQUAD.md +38 -0
- package/dist/templates/seed/squads/research/analyst.md +50 -0
- package/dist/templates/seed/squads/research/lead.md +52 -0
- package/dist/templates/seed/squads/research/synthesizer.md +59 -0
- package/dist/templates/skills/squads-learn/SKILL.md +86 -0
- package/dist/templates/skills/squads-workflow/instruction.md +70 -0
- package/dist/terminal-FBQFQTKZ.js +55 -0
- package/dist/terminal-FBQFQTKZ.js.map +1 -0
- package/dist/update-D7CGIZ3M.js +18 -0
- package/dist/update-D7CGIZ3M.js.map +1 -0
- package/dist/update-STU276HR.js +83 -0
- package/dist/update-STU276HR.js.map +1 -0
- package/package.json +31 -13
- package/templates/core/AGENTS.md.template +51 -0
- package/templates/core/BUSINESS_BRIEF.md.template +29 -0
- package/templates/core/CLAUDE.md.template +48 -0
- package/templates/core/provider.yaml.template +5 -0
- package/templates/first-squad/SQUAD.md.template +23 -0
- package/templates/first-squad/lead.md.template +44 -0
- package/templates/memory/getting-started/state.md.template +19 -0
- package/templates/seed/BUSINESS_BRIEF.md.template +27 -0
- package/templates/seed/CLAUDE.md.template +119 -0
- package/templates/seed/README.md.template +42 -0
- package/templates/seed/config/SYSTEM.md +52 -0
- package/templates/seed/config/provider.yaml +4 -0
- package/templates/seed/hooks/settings.json.template +31 -0
- package/templates/seed/memory/company/directives.md +37 -0
- package/templates/seed/memory/company/manager/state.md +16 -0
- package/templates/seed/memory/engineering/issue-solver/state.md +12 -0
- package/templates/seed/memory/intelligence/intel-lead/state.md +9 -0
- package/templates/seed/memory/marketing/content-drafter/state.md +12 -0
- package/templates/seed/memory/operations/ops-lead/state.md +12 -0
- package/templates/seed/memory/product/lead/state.md +14 -0
- package/templates/seed/memory/research/lead/state.md +14 -0
- package/templates/seed/skills/gh/SKILL.md +57 -0
- package/templates/seed/skills/squads-cli/SKILL.md +84 -0
- package/templates/seed/squads/company/SQUAD.md +51 -0
- package/templates/seed/squads/company/company-critic.md +49 -0
- package/templates/seed/squads/company/company-eval.md +49 -0
- package/templates/seed/squads/company/event-dispatcher.md +43 -0
- package/templates/seed/squads/company/goal-tracker.md +43 -0
- package/templates/seed/squads/company/manager.md +54 -0
- package/templates/seed/squads/engineering/SQUAD.md +48 -0
- package/templates/seed/squads/engineering/code-reviewer.md +57 -0
- package/templates/seed/squads/engineering/issue-solver.md +58 -0
- package/templates/seed/squads/engineering/test-writer.md +50 -0
- package/templates/seed/squads/intelligence/SQUAD.md +38 -0
- package/templates/seed/squads/intelligence/intel-critic.md +36 -0
- package/templates/seed/squads/intelligence/intel-eval.md +31 -0
- package/templates/seed/squads/intelligence/intel-lead.md +71 -0
- package/templates/seed/squads/marketing/SQUAD.md +47 -0
- package/templates/seed/squads/marketing/content-drafter.md +71 -0
- package/templates/seed/squads/marketing/growth-analyst.md +49 -0
- package/templates/seed/squads/marketing/social-poster.md +44 -0
- package/templates/seed/squads/operations/SQUAD.md +45 -0
- package/templates/seed/squads/operations/finance-tracker.md +47 -0
- package/templates/seed/squads/operations/goal-tracker.md +48 -0
- package/templates/seed/squads/operations/ops-lead.md +58 -0
- package/templates/seed/squads/product/SQUAD.md +41 -0
- package/templates/seed/squads/product/lead.md +56 -0
- package/templates/seed/squads/product/scanner.md +50 -0
- package/templates/seed/squads/product/worker.md +55 -0
- package/templates/seed/squads/research/SQUAD.md +38 -0
- package/templates/seed/squads/research/analyst.md +50 -0
- package/templates/seed/squads/research/lead.md +52 -0
- package/templates/seed/squads/research/synthesizer.md +59 -0
- package/templates/skills/squads-learn/SKILL.md +86 -0
- package/templates/skills/squads-workflow/instruction.md +70 -0
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli.ts","../src/version.ts","../src/commands/init.ts","../src/lib/git.ts","../src/lib/telemetry.ts","../src/commands/run.ts","../src/lib/squad-parser.ts","../src/lib/memory.ts","../src/lib/terminal.ts","../src/commands/list.ts","../src/commands/status.ts","../src/lib/sessions.ts","../src/lib/update.ts","../src/commands/memory.ts","../src/commands/sync.ts","../src/commands/goal.ts","../src/commands/feedback.ts","../src/commands/dashboard.ts","../src/lib/costs.ts","../src/lib/db.ts","../src/commands/issues.ts","../src/commands/solve-issues.ts","../src/commands/open-issues.ts","../src/commands/login.ts","../src/lib/auth.ts","../src/commands/update.ts","../src/commands/progress.ts","../src/commands/results.ts","../src/commands/workers.ts","../src/commands/sessions.ts","../src/commands/session.ts","../src/commands/stack.ts"],"sourcesContent":["import { config } from 'dotenv';\nimport { existsSync } from 'fs';\nimport { join } from 'path';\nimport { homedir } from 'os';\nimport { Command } from 'commander';\nimport chalk from 'chalk';\nimport { version } from './version.js';\n\n// Load .env from multiple locations (first found wins)\nconst envPaths = [\n join(process.cwd(), '.env'),\n join(process.cwd(), '..', 'hq', '.env'),\n join(homedir(), 'agents-squads', 'hq', '.env'),\n];\n\nfor (const envPath of envPaths) {\n if (existsSync(envPath)) {\n config({ path: envPath, quiet: true });\n break;\n }\n}\nimport { initCommand } from './commands/init.js';\nimport { runCommand } from './commands/run.js';\nimport { listCommand } from './commands/list.js';\nimport { statusCommand } from './commands/status.js';\nimport {\n memoryQueryCommand,\n memoryShowCommand,\n memoryUpdateCommand,\n memoryListCommand,\n memorySearchCommand\n} from './commands/memory.js';\nimport { syncCommand } from './commands/sync.js';\nimport {\n goalSetCommand,\n goalListCommand,\n goalCompleteCommand,\n goalProgressCommand\n} from './commands/goal.js';\nimport {\n feedbackAddCommand,\n feedbackShowCommand,\n feedbackStatsCommand\n} from './commands/feedback.js';\nimport { dashboardCommand } from './commands/dashboard.js';\nimport { issuesCommand } from './commands/issues.js';\nimport { solveIssuesCommand } from './commands/solve-issues.js';\nimport { openIssuesCommand } from './commands/open-issues.js';\nimport { loginCommand, logoutCommand, whoamiCommand } from './commands/login.js';\nimport { updateCommand } from './commands/update.js';\nimport { progressCommand, progressStartCommand, progressCompleteCommand } from './commands/progress.js';\nimport { resultsCommand } from './commands/results.js';\nimport { workersCommand } from './commands/workers.js';\nimport { sessionsCommand, sessionsHistoryCommand } from './commands/sessions.js';\nimport { sessionStartCommand, sessionStopCommand, sessionHeartbeatCommand, detectSquadCommand } from './commands/session.js';\nimport { registerExitHandler } from './lib/telemetry.js';\nimport {\n stackInitCommand,\n stackStatusCommand,\n stackEnvCommand,\n stackUpCommand,\n stackDownCommand,\n stackHealthCommand,\n stackLogsCommand,\n applyStackConfig\n} from './commands/stack.js';\n\n// Load stack config from ~/.squadsrc (if exists)\napplyStackConfig();\n\n// Register telemetry exit handler early\nregisterExitHandler();\n\nconst program = new Command();\n\nprogram\n .name('squads')\n .description('A CLI for humans and agents')\n .version(version);\n\n// Init command\nprogram\n .command('init')\n .description('Initialize a new squad project')\n .option('-t, --template <template>', 'Project template', 'default')\n .action(initCommand);\n\n// Run command - runs squads or individual agents\nprogram\n .command('run <target>')\n .description('Run a squad or agent')\n .option('-v, --verbose', 'Verbose output')\n .option('-d, --dry-run', 'Show what would be run without executing')\n .option('-e, --execute', 'Execute agent via Claude CLI (requires claude installed)')\n .option('-a, --agent <agent>', 'Run specific agent within squad')\n .option('-t, --timeout <minutes>', 'Execution timeout in minutes (default: 30)', '30')\n .action((target, options) => runCommand(target, { ...options, timeout: parseInt(options.timeout, 10) }));\n\n// List command\nprogram\n .command('list')\n .description('List agents and squads')\n .option('-s, --squads', 'List squads only')\n .option('-a, --agents', 'List agents only')\n .action(listCommand);\n\n// Status command\nprogram\n .command('status [squad]')\n .description('Show squad status and state')\n .option('-v, --verbose', 'Show detailed status')\n .action(statusCommand);\n\n// Dashboard command\nprogram\n .command('dashboard')\n .alias('dash')\n .description('Show comprehensive goals and metrics dashboard')\n .option('-v, --verbose', 'Show additional details')\n .option('-c, --ceo', 'Executive summary with priorities and blockers')\n .option('-f, --full', 'Include GitHub PR/issue stats (slower, ~30s)')\n .action((options) => dashboardCommand({ ...options, fast: !options.full }));\n\n// Issues command\nprogram\n .command('issues')\n .description('Show GitHub issues across repos')\n .option('-o, --org <org>', 'GitHub organization', 'agents-squads')\n .option('-r, --repos <repos>', 'Comma-separated repo names')\n .action(issuesCommand);\n\n// Solve issues command - close issues by creating PRs\nprogram\n .command('solve-issues')\n .description('Solve ready-to-fix issues by creating PRs')\n .option('-r, --repo <repo>', 'Target repo (hq, agents-squads-web)')\n .option('-i, --issue <number>', 'Specific issue number', parseInt)\n .option('-d, --dry-run', 'Show what would be solved')\n .option('-e, --execute', 'Execute with Claude CLI')\n .action(solveIssuesCommand);\n\n// Open issues command - run evaluators to find new issues\nprogram\n .command('open-issues')\n .description('Run evaluators/critics to find and create issues')\n .option('-s, --squad <squad>', 'Target squad (website, engineering, etc.)')\n .option('-a, --agent <agent>', 'Specific evaluator agent')\n .option('-d, --dry-run', 'Show what would run')\n .option('-e, --execute', 'Execute with Claude CLI')\n .action(openIssuesCommand);\n\n// Progress command - track agent task progress\nconst progress = program\n .command('progress')\n .description('Track active and completed agent tasks')\n .option('-v, --verbose', 'Show more activity')\n .action(progressCommand);\n\nprogress\n .command('start <squad> <description>')\n .description('Register a new active task')\n .action(progressStartCommand);\n\nprogress\n .command('complete <taskId>')\n .description('Mark a task as completed')\n .option('-f, --failed', 'Mark as failed instead')\n .action(progressCompleteCommand);\n\n// Results command - KPI goals vs actuals\nprogram\n .command('results [squad]')\n .description('Show squad results: git activity + KPI goals vs actuals')\n .option('-d, --days <days>', 'Days to look back', '7')\n .option('-v, --verbose', 'Show detailed KPIs per goal')\n .action((squad, options) => resultsCommand({ ...options, squad }));\n\n// Workers command - show running processes and tasks\nprogram\n .command('workers')\n .description('Show active workers: Claude sessions, tasks, dev servers')\n .option('-v, --verbose', 'Show more details')\n .option('-k, --kill <pid>', 'Kill a process by PID')\n .action(workersCommand);\n\n// Memory command group\nconst memory = program\n .command('memory')\n .description('Query and manage squad memory');\n\nmemory\n .command('query <query>')\n .description('Search across all squad memory')\n .option('-s, --squad <squad>', 'Limit search to specific squad')\n .option('-a, --agent <agent>', 'Limit search to specific agent')\n .action(memoryQueryCommand);\n\nmemory\n .command('show <squad>')\n .description('Show memory for a squad')\n .action(memoryShowCommand);\n\nmemory\n .command('update <squad> <content>')\n .description('Add to squad memory')\n .option('-a, --agent <agent>', 'Specific agent (default: squad-lead)')\n .option('-t, --type <type>', 'Memory type: state, learnings, feedback', 'learnings')\n .action(memoryUpdateCommand);\n\nmemory\n .command('list')\n .description('List all memory entries')\n .action(memoryListCommand);\n\nmemory\n .command('sync')\n .description('Sync memory from git: pull remote changes, process commits, optionally push')\n .option('-v, --verbose', 'Show detailed commit info')\n .option('-p, --push', 'Push local memory changes to remote after sync')\n .option('--no-pull', 'Skip pulling from remote')\n .action((options) => syncCommand({ verbose: options.verbose, push: options.push, pull: options.pull }));\n\nmemory\n .command('search <query>')\n .description('Search conversations stored in postgres (via squads-bridge)')\n .option('-l, --limit <limit>', 'Number of results', '10')\n .option('-r, --role <role>', 'Filter by role: user, assistant, thinking')\n .option('-i, --importance <importance>', 'Filter by importance: low, normal, high')\n .action((query, opts) => memorySearchCommand(query, {\n limit: parseInt(opts.limit, 10),\n role: opts.role,\n importance: opts.importance\n }));\n\n// Goal command group\nconst goal = program\n .command('goal')\n .description('Manage squad goals');\n\ngoal\n .command('set <squad> <description>')\n .description('Set a goal for a squad')\n .option('-m, --metric <metrics...>', 'Metrics to track')\n .action(goalSetCommand);\n\ngoal\n .command('list [squad]')\n .description('List goals for squad(s)')\n .option('-a, --all', 'Show completed goals too')\n .action(goalListCommand);\n\ngoal\n .command('complete <squad> <index>')\n .description('Mark a goal as completed')\n .action(goalCompleteCommand);\n\ngoal\n .command('progress <squad> <index> <progress>')\n .description('Update goal progress')\n .action(goalProgressCommand);\n\n// Feedback command group\nconst feedback = program\n .command('feedback')\n .description('Record and view execution feedback');\n\nfeedback\n .command('add <squad> <rating> <feedback>')\n .description('Add feedback for last execution (rating 1-5)')\n .option('-l, --learning <learnings...>', 'Learnings to extract')\n .action(feedbackAddCommand);\n\nfeedback\n .command('show <squad>')\n .description('Show feedback history')\n .option('-n, --limit <n>', 'Number of entries to show', '5')\n .action(feedbackShowCommand);\n\nfeedback\n .command('stats')\n .description('Show feedback summary across all squads')\n .action(feedbackStatsCommand);\n\n// Sessions command group - list active sessions and history\nconst sessions = program\n .command('sessions')\n .description('Show active Claude Code sessions across squads')\n .option('-v, --verbose', 'Show session details')\n .option('-j, --json', 'Output as JSON')\n .action(sessionsCommand);\n\nsessions\n .command('history')\n .description('Show session history and statistics')\n .option('-d, --days <days>', 'Days of history to show', '7')\n .option('-s, --squad <squad>', 'Filter by squad')\n .option('-j, --json', 'Output as JSON')\n .action((options) => sessionsHistoryCommand({\n days: parseInt(options.days, 10),\n squad: options.squad,\n json: options.json,\n }));\n\n// Session command group - lifecycle management\nconst session = program\n .command('session')\n .description('Manage current session lifecycle');\n\nsession\n .command('start')\n .description('Register a new session')\n .option('-s, --squad <squad>', 'Override squad detection')\n .option('-q, --quiet', 'Suppress output')\n .action((options) => sessionStartCommand({ squad: options.squad, quiet: options.quiet }));\n\nsession\n .command('stop')\n .description('End current session')\n .option('-q, --quiet', 'Suppress output')\n .action((options) => sessionStopCommand({ quiet: options.quiet }));\n\nsession\n .command('heartbeat')\n .description('Update session heartbeat')\n .option('-q, --quiet', 'Suppress output')\n .action((options) => sessionHeartbeatCommand({ quiet: options.quiet }));\n\n// Detect squad command - useful for hooks\nprogram\n .command('detect-squad')\n .description('Detect current squad based on cwd (for use in hooks)')\n .action(detectSquadCommand);\n\n// Stack command group - manage local Docker stack\nconst stack = program\n .command('stack')\n .description('Manage local Docker stack (postgres, redis, langfuse, bridge)');\n\nstack\n .command('init')\n .description('Auto-detect Docker containers and configure CLI connection')\n .action(stackInitCommand);\n\nstack\n .command('status')\n .description('Show container health and connection status')\n .action(stackStatusCommand);\n\nstack\n .command('env')\n .description('Print environment variables for shell export')\n .action(stackEnvCommand);\n\nstack\n .command('up')\n .description('Start Docker containers via docker-compose')\n .action(stackUpCommand);\n\nstack\n .command('down')\n .description('Stop Docker containers')\n .action(stackDownCommand);\n\nstack\n .command('health')\n .description('Comprehensive health check with diagnostics')\n .option('-v, --verbose', 'Show logs for unhealthy services')\n .action((options) => stackHealthCommand(options.verbose));\n\nstack\n .command('logs <service>')\n .description('Show logs for a service (postgres, redis, neo4j, bridge, langfuse, mem0, engram)')\n .option('-n, --tail <lines>', 'Number of lines to show', '50')\n .action((service, options) => stackLogsCommand(service, parseInt(options.tail, 10)));\n\n// Auth commands\nprogram\n .command('login')\n .description('Log in to Squads (Pro & Enterprise)')\n .action(loginCommand);\n\nprogram\n .command('logout')\n .description('Log out from Squads')\n .action(logoutCommand);\n\nprogram\n .command('whoami')\n .description('Show current logged in user')\n .action(whoamiCommand);\n\n// Update command\nprogram\n .command('update')\n .description('Check for and install updates')\n .option('-y, --yes', 'Auto-confirm update without prompting')\n .option('-c, --check', 'Check for updates without installing')\n .action((options) => updateCommand(options));\n\n// Parse arguments (use parseAsync to properly await async actions)\nawait program.parseAsync();\n\n// Show help if no command provided\nif (!process.argv.slice(2).length) {\n console.log(`\n${chalk.bold.magenta('squads')} - AI agent squad management\n\n${chalk.dim('Quick start:')}\n ${chalk.cyan('squads status')} View all squads status\n ${chalk.cyan('squads run <squad>')} Run a squad\n ${chalk.cyan('squads memory query \"<term>\"')} Search squad memory\n\n${chalk.dim('Goals & Feedback:')}\n ${chalk.cyan('squads goal set <squad> \"<goal>\"')} Set a goal\n ${chalk.cyan('squads goal list')} View active goals\n ${chalk.cyan('squads feedback add <squad> 4 \"msg\"')} Rate last execution\n\n${chalk.dim('Examples:')}\n ${chalk.cyan('squads run website')} Run website squad\n ${chalk.cyan('squads goal set finance \"Track costs\"')} Set finance goal\n ${chalk.cyan('squads feedback stats')} View feedback summary\n\n${chalk.dim('Run')} ${chalk.cyan('squads --help')} ${chalk.dim('for all commands.')}\n`);\n}\n","export const version = '0.1.0';\n","import chalk from 'chalk';\nimport ora from 'ora';\nimport fs from 'fs/promises';\nimport path from 'path';\nimport { checkGitStatus, initGitRepo, getRepoName } from '../lib/git.js';\nimport { track, Events } from '../lib/telemetry.js';\n\ninterface InitOptions {\n template: string;\n}\n\nexport async function initCommand(options: InitOptions): Promise<void> {\n const cwd = process.cwd();\n\n // Check Git status first\n console.log(chalk.dim('Checking project setup...\\n'));\n\n const gitStatus = checkGitStatus(cwd);\n\n if (!gitStatus.isGitRepo) {\n console.log(chalk.yellow('⚠ No git repository found.'));\n console.log(chalk.dim(' Squads work best with git for version control and GitHub integration.'));\n console.log(chalk.dim(' Run: git init && git remote add origin <your-repo-url>\\n'));\n } else {\n console.log(chalk.green('✓ Git repository detected'));\n\n if (gitStatus.hasRemote) {\n const repoName = getRepoName(gitStatus.remoteUrl);\n console.log(chalk.green(`✓ Remote: ${chalk.cyan(repoName || gitStatus.remoteUrl)}`));\n } else {\n console.log(chalk.yellow('⚠ No remote configured.'));\n console.log(chalk.dim(' Add a remote: git remote add origin <your-repo-url>\\n'));\n }\n\n if (gitStatus.isDirty) {\n console.log(chalk.yellow(`⚠ ${gitStatus.uncommittedCount} uncommitted changes`));\n }\n }\n\n console.log();\n\n const spinner = ora('Initializing squad project...').start();\n\n try {\n // Create directory structure\n const dirs = [\n '.agents/squads',\n '.agents/memory',\n '.agents/outputs',\n '.claude',\n ];\n\n for (const dir of dirs) {\n await fs.mkdir(path.join(cwd, dir), { recursive: true });\n }\n\n // Create git commit template\n const commitTemplate = `\n\n# ────────────────────────────────────────────────────────────\n# Commit message format (delete this comment block):\n#\n# <type>(<scope>): <subject>\n#\n# <body>\n#\n# 🤖 Generated with [Agents Squads](https://agents-squads.com)\n#\n# Co-Authored-By: <model> <email>\n# ────────────────────────────────────────────────────────────\n# AI Models (add those that contributed to this commit):\n#\n# Model | Email | API Key\n# --------------------|----------------------------|------------------\n# Claude Opus 4.5 | <noreply@anthropic.com> | ANTHROPIC_API_KEY\n# Claude Sonnet 4 | <noreply@anthropic.com> | ANTHROPIC_API_KEY\n# Claude Haiku 3.5 | <noreply@anthropic.com> | ANTHROPIC_API_KEY\n# GPT-4o | <noreply@openai.com> | OPENAI_API_KEY\n# GPT-o1 | <noreply@openai.com> | OPENAI_API_KEY\n# Gemini 2.0 Flash | <noreply@google.com> | GEMINI_API_KEY\n# Grok 3 | <noreply@x.ai> | XAI_API_KEY\n# Perplexity | <noreply@perplexity.ai> | PERPLEXITY_API_KEY\n# Manus AI | <noreply@manus.im> | MANUS_API_KEY\n#\n# Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>\n# Co-Authored-By: Claude Sonnet 4 <noreply@anthropic.com>\n# Co-Authored-By: Claude Haiku 3.5 <noreply@anthropic.com>\n# Co-Authored-By: GPT-4o <noreply@openai.com>\n# Co-Authored-By: GPT-o1 <noreply@openai.com>\n# Co-Authored-By: Gemini 2.0 Flash <noreply@google.com>\n# Co-Authored-By: Grok 3 <noreply@x.ai>\n# Co-Authored-By: Perplexity <noreply@perplexity.ai>\n# Co-Authored-By: Manus AI <noreply@manus.im>\n# ────────────────────────────────────────────────────────────\n`;\n\n await fs.writeFile(\n path.join(cwd, '.agents/commit-template.txt'),\n commitTemplate\n );\n\n // Create .mailmap for author consolidation\n const mailmap = `# Git author name consolidation\n# Format: Proper Name <proper@email> Commit Name <commit@email>\n# Add entries to consolidate multiple git identities\n\n# AI Contributors\nAgents Squads <agents@agents-squads.com> Agents Squads <agents@agents-squads.com>\n`;\n\n await fs.writeFile(path.join(cwd, '.mailmap'), mailmap);\n\n // Create Claude Code settings with hooks\n const claudeSettings = {\n hooks: {\n SessionStart: [\n {\n hooks: [\n {\n type: 'command',\n command: 'squads status',\n timeout: 10,\n },\n ],\n },\n ],\n Stop: [\n {\n hooks: [\n {\n type: 'command',\n command: 'squads memory sync',\n timeout: 15,\n },\n ],\n },\n ],\n },\n };\n\n await fs.writeFile(\n path.join(cwd, '.claude/settings.json'),\n JSON.stringify(claudeSettings, null, 2)\n );\n\n // Create example agent\n const exampleAgent = `# Example Agent\n\n## Purpose\nDemonstrate basic agent structure.\n\n## Model\nclaude-sonnet-4\n\n## Tools\n- Read\n- Write\n- WebSearch\n\n## Instructions\n1. Greet the user\n2. Ask how you can help\n3. Execute the task\n\n## Output\nMarkdown summary of actions taken.\n`;\n\n await fs.writeFile(\n path.join(cwd, '.agents/squads/example-agent.md'),\n exampleAgent\n );\n\n // Create CLAUDE.md if it doesn't exist\n const claudeMdPath = path.join(cwd, 'CLAUDE.md');\n try {\n await fs.access(claudeMdPath);\n } catch {\n await fs.writeFile(\n claudeMdPath,\n `# Project Instructions\n\n## Squads CLI\n\nThis project uses AI agent squads. The \\`squads\\` CLI provides persistent memory across sessions.\n\n### Key Commands\n\n| Command | Purpose |\n|---------|---------|\n| \\`squads status\\` | Overview of all squads (runs on session start) |\n| \\`squads dash\\` | Full operational dashboard |\n| \\`squads dash --ceo\\` | Executive summary with P0/P1 priorities |\n| \\`squads goal list\\` | View all active goals |\n| \\`squads memory query \"<topic>\"\\` | Search squad memory before researching |\n| \\`squads run <squad>\\` | Execute a squad |\n\n### Workflow\n\n1. **Session Start**: \\`squads status\\` runs automatically via hook\n2. **Before Research**: Query memory to avoid re-doing work\n3. **Session End**: Memory syncs automatically from git commits\n\n### Git Commit Format\n\nAll commits should use the Agents Squads format:\n\n\\`\\`\\`\n<type>(<scope>): <subject>\n\n<body>\n\n🤖 Generated with [Agents Squads](https://agents-squads.com)\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>\n\\`\\`\\`\n\n**AI Models** (include those that contributed):\n\n| Model | Co-Author Email | API Key Required |\n|-------|-----------------|------------------|\n| Claude Opus 4.5 | \\`<noreply@anthropic.com>\\` | \\`ANTHROPIC_API_KEY\\` |\n| Claude Sonnet 4 | \\`<noreply@anthropic.com>\\` | \\`ANTHROPIC_API_KEY\\` |\n| Claude Haiku 3.5 | \\`<noreply@anthropic.com>\\` | \\`ANTHROPIC_API_KEY\\` |\n| GPT-4o | \\`<noreply@openai.com>\\` | \\`OPENAI_API_KEY\\` |\n| GPT-o1 | \\`<noreply@openai.com>\\` | \\`OPENAI_API_KEY\\` |\n| Gemini 2.0 Flash | \\`<noreply@google.com>\\` | \\`GEMINI_API_KEY\\` |\n| Grok 3 | \\`<noreply@x.ai>\\` | \\`XAI_API_KEY\\` |\n| Perplexity | \\`<noreply@perplexity.ai>\\` | \\`PERPLEXITY_API_KEY\\` |\n| Manus AI | \\`<noreply@manus.im>\\` | \\`MANUS_API_KEY\\` |\n\n### For Reports\n\nAlways use CLI commands for status reports:\n- Executive summary: \\`squads dash --ceo\\`\n- Operational view: \\`squads dash\\`\n- Goals: \\`squads goal list\\`\n`\n );\n }\n\n spinner.succeed('Squad project initialized!');\n\n // Track initialization\n await track(Events.CLI_INIT, {\n hasGit: gitStatus.isGitRepo,\n hasRemote: gitStatus.hasRemote,\n template: options.template,\n });\n\n console.log(`\n${chalk.green('Success!')} Created squad project structure:\n\n ${chalk.cyan('.agents/')}\n ${chalk.dim('├──')} ${chalk.cyan('squads/')} Squad & agent definitions\n ${chalk.dim('├──')} ${chalk.cyan('memory/')} Persistent squad memory\n ${chalk.dim('├──')} ${chalk.cyan('outputs/')} Squad outputs\n ${chalk.dim('└──')} ${chalk.cyan('commit-template.txt')} Git commit format\n\n ${chalk.cyan('.mailmap')} Author name consolidation\n\n${chalk.dim('Commit format:')}\n 🤖 Generated with [Agents Squads](https://agents-squads.com)\n Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>\n\n${chalk.dim('Next steps:')}\n ${chalk.cyan('1.')} Create a squad: ${chalk.yellow('mkdir .agents/squads/my-squad && touch .agents/squads/my-squad/SQUAD.md')}\n ${chalk.cyan('2.')} Set a goal: ${chalk.yellow('squads goal set my-squad \"Solve a problem\"')}\n ${chalk.cyan('3.')} Run it: ${chalk.yellow('squads run my-squad')}\n\n${chalk.dim('Put your first squad to work solving a problem in minutes.')}\n`);\n\n } catch (error) {\n spinner.fail('Failed to initialize project');\n console.error(chalk.red(error));\n process.exit(1);\n }\n}\n","import { execSync } from 'child_process';\nimport { existsSync } from 'fs';\nimport { join } from 'path';\n\nexport interface GitStatus {\n isGitRepo: boolean;\n hasRemote: boolean;\n remoteName?: string;\n remoteUrl?: string;\n branch?: string;\n isDirty: boolean;\n uncommittedCount: number;\n}\n\nexport function checkGitStatus(cwd: string = process.cwd()): GitStatus {\n const status: GitStatus = {\n isGitRepo: false,\n hasRemote: false,\n isDirty: false,\n uncommittedCount: 0,\n };\n\n // Check if .git directory exists\n if (!existsSync(join(cwd, '.git'))) {\n return status;\n }\n\n status.isGitRepo = true;\n\n try {\n // Get current branch\n const branch = execSync('git rev-parse --abbrev-ref HEAD', {\n cwd,\n encoding: 'utf-8',\n stdio: ['pipe', 'pipe', 'pipe']\n }).trim();\n status.branch = branch;\n\n // Check for remote\n const remotes = execSync('git remote -v', {\n cwd,\n encoding: 'utf-8',\n stdio: ['pipe', 'pipe', 'pipe']\n }).trim();\n\n if (remotes) {\n status.hasRemote = true;\n const lines = remotes.split('\\n');\n if (lines.length > 0) {\n const parts = lines[0].split(/\\s+/);\n status.remoteName = parts[0];\n status.remoteUrl = parts[1];\n }\n }\n\n // Check for uncommitted changes\n const statusOutput = execSync('git status --porcelain', {\n cwd,\n encoding: 'utf-8',\n stdio: ['pipe', 'pipe', 'pipe']\n }).trim();\n\n if (statusOutput) {\n status.isDirty = true;\n status.uncommittedCount = statusOutput.split('\\n').filter(l => l.trim()).length;\n }\n\n } catch {\n // Git commands failed, but we know it's a git repo\n }\n\n return status;\n}\n\nexport function initGitRepo(cwd: string = process.cwd()): boolean {\n try {\n execSync('git init', { cwd, stdio: 'pipe' });\n return true;\n } catch {\n return false;\n }\n}\n\nexport function getRepoName(remoteUrl?: string): string | null {\n if (!remoteUrl) return null;\n\n // Handle various remote URL formats\n // git@github.com:user/repo.git\n // https://github.com/user/repo.git\n const match = remoteUrl.match(/[:/]([^/]+\\/[^/]+?)(?:\\.git)?$/);\n return match ? match[1] : null;\n}\n\n// Multi-repo git performance stats\nexport interface GitPerformanceStats {\n totalCommits: number;\n commitsByDay: Map<string, number>; // date string -> count\n commitsByAuthor: Map<string, number>;\n commitsByRepo: Map<string, number>;\n activeDays: number;\n avgCommitsPerDay: number;\n peakDay: { date: string; count: number } | null;\n repos: RepoStats[];\n}\n\nexport interface RepoStats {\n name: string;\n path: string;\n commits: number;\n lastCommit: string;\n authors: string[];\n}\n\nexport interface CommitInfo {\n hash: string;\n author: string;\n date: string;\n message: string;\n repo: string;\n}\n\nconst SQUAD_REPOS = ['hq', 'agents-squads-web', 'squads-cli', 'company', 'product', 'engineering', 'research', 'intelligence', 'customer', 'finance', 'marketing'];\n\n// Squad to repo mapping for GitHub stats\nconst SQUAD_REPO_MAP: Record<string, string[]> = {\n website: ['agents-squads-web'],\n product: ['squads-cli'],\n engineering: ['hq', 'squads-cli'],\n research: ['research'],\n intelligence: ['intelligence'],\n customer: ['customer'],\n finance: ['finance'],\n company: ['company', 'hq'],\n marketing: ['marketing', 'agents-squads-web'],\n};\n\n// Label patterns that map to squads\nconst SQUAD_LABELS: Record<string, string[]> = {\n website: ['website', 'web', 'frontend', 'ui'],\n product: ['product', 'cli', 'feature'],\n engineering: ['engineering', 'infra', 'backend', 'bug'],\n research: ['research', 'analysis'],\n intelligence: ['intel', 'monitoring'],\n customer: ['customer', 'sales', 'lead'],\n finance: ['finance', 'cost', 'billing'],\n company: ['company', 'strategy'],\n marketing: ['marketing', 'content', 'seo'],\n};\n\nexport interface GitHubStats {\n prsOpened: number;\n prsMerged: number;\n issuesClosed: number;\n issuesOpen: number;\n bySquad: Map<string, SquadGitHubStats>;\n}\n\nexport interface SquadGitHubStats {\n prsOpened: number;\n prsMerged: number;\n issuesClosed: number;\n issuesOpen: number;\n commits: number;\n recentIssues: { title: string; number: number; state: string }[];\n recentPRs: { title: string; number: number; merged: boolean }[];\n}\n\nexport function getGitHubStats(basePath: string, days: number = 30): GitHubStats {\n const stats: GitHubStats = {\n prsOpened: 0,\n prsMerged: 0,\n issuesClosed: 0,\n issuesOpen: 0,\n bySquad: new Map(),\n };\n\n // Initialize squad stats\n for (const squad of Object.keys(SQUAD_REPO_MAP)) {\n stats.bySquad.set(squad, {\n prsOpened: 0,\n prsMerged: 0,\n issuesClosed: 0,\n issuesOpen: 0,\n commits: 0,\n recentIssues: [],\n recentPRs: [],\n });\n }\n\n const repos = ['hq', 'agents-squads-web'];\n const since = new Date(Date.now() - days * 24 * 60 * 60 * 1000).toISOString();\n\n for (const repo of repos) {\n const repoPath = join(basePath, repo);\n if (!existsSync(repoPath)) continue;\n\n try {\n // Get PRs\n const prsOutput = execSync(\n `gh pr list --state all --json number,title,createdAt,mergedAt,labels --limit 100 2>/dev/null`,\n { cwd: repoPath, encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] }\n );\n const prs = JSON.parse(prsOutput || '[]');\n\n for (const pr of prs) {\n const created = new Date(pr.createdAt);\n if (created < new Date(since)) continue;\n\n stats.prsOpened++;\n if (pr.mergedAt) stats.prsMerged++;\n\n // Detect squad from labels or title\n const squad = detectSquadFromPR(pr, repo);\n const squadStats = stats.bySquad.get(squad);\n if (squadStats) {\n squadStats.prsOpened++;\n if (pr.mergedAt) squadStats.prsMerged++;\n if (squadStats.recentPRs.length < 3) {\n squadStats.recentPRs.push({\n title: pr.title,\n number: pr.number,\n merged: !!pr.mergedAt,\n });\n }\n }\n }\n\n // Get Issues\n const issuesOutput = execSync(\n `gh issue list --state all --json number,title,state,closedAt,labels --limit 100 2>/dev/null`,\n { cwd: repoPath, encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] }\n );\n const issues = JSON.parse(issuesOutput || '[]');\n\n for (const issue of issues) {\n const squad = detectSquadFromIssue(issue, repo);\n const squadStats = stats.bySquad.get(squad);\n\n if (issue.state === 'CLOSED') {\n const closed = new Date(issue.closedAt);\n if (closed >= new Date(since)) {\n stats.issuesClosed++;\n if (squadStats) {\n squadStats.issuesClosed++;\n }\n }\n } else {\n stats.issuesOpen++;\n if (squadStats) {\n squadStats.issuesOpen++;\n if (squadStats.recentIssues.length < 3) {\n squadStats.recentIssues.push({\n title: issue.title,\n number: issue.number,\n state: issue.state,\n });\n }\n }\n }\n }\n } catch {\n // gh not available or not in repo\n }\n }\n\n // Add commit counts per squad\n const gitStats = getMultiRepoGitStats(basePath, days);\n for (const [repo, commits] of gitStats.commitsByRepo) {\n // Map repo to squad\n for (const [squad, repos] of Object.entries(SQUAD_REPO_MAP)) {\n if (repos.includes(repo)) {\n const squadStats = stats.bySquad.get(squad);\n if (squadStats) {\n squadStats.commits += commits;\n }\n }\n }\n }\n\n return stats;\n}\n\n/**\n * Optimized GitHub stats - fetches PRs and issues in parallel across repos\n * Uses a single combined gh api call per repo for better performance\n */\nexport function getGitHubStatsOptimized(basePath: string, days: number = 30): GitHubStats {\n const stats: GitHubStats = {\n prsOpened: 0,\n prsMerged: 0,\n issuesClosed: 0,\n issuesOpen: 0,\n bySquad: new Map(),\n };\n\n // Initialize squad stats\n for (const squad of Object.keys(SQUAD_REPO_MAP)) {\n stats.bySquad.set(squad, {\n prsOpened: 0,\n prsMerged: 0,\n issuesClosed: 0,\n issuesOpen: 0,\n commits: 0,\n recentIssues: [],\n recentPRs: [],\n });\n }\n\n const repos = ['hq', 'agents-squads-web'];\n const since = new Date(Date.now() - days * 24 * 60 * 60 * 1000).toISOString();\n\n // Fetch all data in parallel using a single combined command\n const results: { repo: string; prs: unknown[]; issues: unknown[] }[] = [];\n\n for (const repo of repos) {\n const repoPath = join(basePath, repo);\n if (!existsSync(repoPath)) continue;\n\n try {\n // Use a single shell command to get both PRs and issues\n // This reduces the number of gh CLI invocations from 4 to 2\n const output = execSync(\n `echo '{\"prs\":' && gh pr list --state all --json number,title,createdAt,mergedAt,labels --limit 50 2>/dev/null && echo ',\"issues\":' && gh issue list --state all --json number,title,state,closedAt,labels --limit 50 2>/dev/null && echo '}'`,\n { cwd: repoPath, encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'], timeout: 10000 }\n );\n\n // Parse the combined output (handle edge cases)\n const prsMatch = output.match(/\"prs\":(\\[.*?\\]),\"issues\":/s);\n const issuesMatch = output.match(/\"issues\":(\\[.*?\\])\\s*\\}/s);\n\n const prs = prsMatch ? JSON.parse(prsMatch[1]) : [];\n const issues = issuesMatch ? JSON.parse(issuesMatch[1]) : [];\n\n results.push({ repo, prs, issues });\n } catch {\n // Fallback: try individual calls with short timeout\n try {\n const prsOutput = execSync(\n `gh pr list --state all --json number,title,createdAt,mergedAt,labels --limit 50 2>/dev/null`,\n { cwd: repoPath, encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'], timeout: 5000 }\n );\n const issuesOutput = execSync(\n `gh issue list --state all --json number,title,state,closedAt,labels --limit 50 2>/dev/null`,\n { cwd: repoPath, encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'], timeout: 5000 }\n );\n results.push({\n repo,\n prs: JSON.parse(prsOutput || '[]'),\n issues: JSON.parse(issuesOutput || '[]'),\n });\n } catch {\n // Skip this repo\n }\n }\n }\n\n // Process results\n for (const { repo, prs, issues } of results) {\n // Process PRs\n for (const pr of prs as { createdAt: string; mergedAt?: string; title: string; number: number; labels: { name: string }[] }[]) {\n const created = new Date(pr.createdAt);\n if (created < new Date(since)) continue;\n\n stats.prsOpened++;\n if (pr.mergedAt) stats.prsMerged++;\n\n const squad = detectSquadFromPR(pr, repo);\n const squadStats = stats.bySquad.get(squad);\n if (squadStats) {\n squadStats.prsOpened++;\n if (pr.mergedAt) squadStats.prsMerged++;\n if (squadStats.recentPRs.length < 3) {\n squadStats.recentPRs.push({\n title: pr.title,\n number: pr.number,\n merged: !!pr.mergedAt,\n });\n }\n }\n }\n\n // Process Issues\n for (const issue of issues as { state: string; closedAt?: string; title: string; number: number; labels: { name: string }[] }[]) {\n const squad = detectSquadFromIssue(issue, repo);\n const squadStats = stats.bySquad.get(squad);\n\n if (issue.state === 'CLOSED') {\n const closed = new Date(issue.closedAt || 0);\n if (closed >= new Date(since)) {\n stats.issuesClosed++;\n if (squadStats) {\n squadStats.issuesClosed++;\n }\n }\n } else {\n stats.issuesOpen++;\n if (squadStats) {\n squadStats.issuesOpen++;\n if (squadStats.recentIssues.length < 3) {\n squadStats.recentIssues.push({\n title: issue.title,\n number: issue.number,\n state: issue.state,\n });\n }\n }\n }\n }\n }\n\n // Note: commit counts are added separately by the caller using cached git stats\n return stats;\n}\n\nfunction detectSquadFromPR(pr: { title: string; labels: { name: string }[] }, repo: string): string {\n // Check labels first\n for (const label of pr.labels || []) {\n const labelLower = label.name.toLowerCase();\n for (const [squad, patterns] of Object.entries(SQUAD_LABELS)) {\n if (patterns.some(p => labelLower.includes(p))) {\n return squad;\n }\n }\n }\n\n // Check title\n const titleLower = pr.title.toLowerCase();\n for (const [squad, patterns] of Object.entries(SQUAD_LABELS)) {\n if (patterns.some(p => titleLower.includes(p))) {\n return squad;\n }\n }\n\n // Default based on repo\n if (repo === 'agents-squads-web') return 'website';\n if (repo === 'squads-cli') return 'product';\n return 'engineering';\n}\n\nfunction detectSquadFromIssue(issue: { title: string; labels: { name: string }[] }, repo: string): string {\n // Check labels first\n for (const label of issue.labels || []) {\n const labelLower = label.name.toLowerCase();\n\n // Direct squad label match\n if (labelLower.startsWith('squad:')) {\n return labelLower.replace('squad:', '');\n }\n\n for (const [squad, patterns] of Object.entries(SQUAD_LABELS)) {\n if (patterns.some(p => labelLower.includes(p))) {\n return squad;\n }\n }\n }\n\n // Check title\n const titleLower = issue.title.toLowerCase();\n for (const [squad, patterns] of Object.entries(SQUAD_LABELS)) {\n if (patterns.some(p => titleLower.includes(p))) {\n return squad;\n }\n }\n\n // Default based on repo\n if (repo === 'agents-squads-web') return 'website';\n if (repo === 'squads-cli') return 'product';\n return 'engineering';\n}\n\nexport function getMultiRepoGitStats(basePath: string, days: number = 30): GitPerformanceStats {\n const stats: GitPerformanceStats = {\n totalCommits: 0,\n commitsByDay: new Map(),\n commitsByAuthor: new Map(),\n commitsByRepo: new Map(),\n activeDays: 0,\n avgCommitsPerDay: 0,\n peakDay: null,\n repos: [],\n };\n\n for (const repo of SQUAD_REPOS) {\n const repoPath = join(basePath, repo);\n if (!existsSync(repoPath) || !existsSync(join(repoPath, '.git'))) {\n continue;\n }\n\n try {\n // Get commits from this repo (use %aN to respect .mailmap)\n const logOutput = execSync(\n `git log --since=\"${days} days ago\" --format=\"%H|%aN|%ad|%s\" --date=short 2>/dev/null`,\n { cwd: repoPath, encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] }\n ).trim();\n\n if (!logOutput) continue;\n\n const commits = logOutput.split('\\n').filter(l => l.trim());\n const authors = new Set<string>();\n let lastCommit = '';\n\n for (const line of commits) {\n const [hash, author, date, message] = line.split('|');\n if (!hash) continue;\n\n stats.totalCommits++;\n authors.add(author);\n if (!lastCommit) lastCommit = date;\n\n // By day\n const dayCount = stats.commitsByDay.get(date) || 0;\n stats.commitsByDay.set(date, dayCount + 1);\n\n // By author\n const authorCount = stats.commitsByAuthor.get(author) || 0;\n stats.commitsByAuthor.set(author, authorCount + 1);\n\n // By repo\n const repoCount = stats.commitsByRepo.get(repo) || 0;\n stats.commitsByRepo.set(repo, repoCount + 1);\n }\n\n stats.repos.push({\n name: repo,\n path: repoPath,\n commits: commits.length,\n lastCommit,\n authors: Array.from(authors),\n });\n\n } catch {\n // Skip repos that fail\n }\n }\n\n // Calculate derived stats\n stats.activeDays = stats.commitsByDay.size;\n stats.avgCommitsPerDay = stats.activeDays > 0\n ? Math.round((stats.totalCommits / days) * 10) / 10\n : 0;\n\n // Find peak day\n let peakCount = 0;\n let peakDate = '';\n for (const [date, count] of stats.commitsByDay) {\n if (count > peakCount) {\n peakCount = count;\n peakDate = date;\n }\n }\n if (peakDate) {\n stats.peakDay = { date: peakDate, count: peakCount };\n }\n\n return stats;\n}\n\n// Get recent activity sparkline data (last 7 days)\nexport function getActivitySparkline(basePath: string, days: number = 7): number[] {\n const activity: number[] = [];\n const now = new Date();\n\n for (let i = days - 1; i >= 0; i--) {\n const date = new Date(now);\n date.setDate(date.getDate() - i);\n const dateStr = date.toISOString().split('T')[0];\n activity.push(0);\n }\n\n for (const repo of SQUAD_REPOS) {\n const repoPath = join(basePath, repo);\n if (!existsSync(repoPath) || !existsSync(join(repoPath, '.git'))) {\n continue;\n }\n\n try {\n const logOutput = execSync(\n `git log --since=\"${days} days ago\" --format=\"%ad\" --date=short 2>/dev/null`,\n { cwd: repoPath, encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] }\n ).trim();\n\n if (!logOutput) continue;\n\n for (const dateStr of logOutput.split('\\n')) {\n const commitDate = new Date(dateStr);\n const daysAgo = Math.floor((now.getTime() - commitDate.getTime()) / (1000 * 60 * 60 * 24));\n const index = days - 1 - daysAgo;\n if (index >= 0 && index < days) {\n activity[index]++;\n }\n }\n } catch {\n // Skip\n }\n }\n\n return activity;\n}\n","import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'fs';\nimport { join } from 'path';\nimport { homedir } from 'os';\nimport { randomUUID } from 'crypto';\n\ninterface TelemetryEvent {\n event: string;\n timestamp: string;\n properties?: Record<string, string | number | boolean | undefined>;\n}\n\ninterface TelemetryConfig {\n enabled: boolean;\n anonymousId: string;\n firstRun: string;\n}\n\nconst TELEMETRY_DIR = join(homedir(), '.squads-cli');\nconst CONFIG_PATH = join(TELEMETRY_DIR, 'telemetry.json');\nconst EVENTS_PATH = join(TELEMETRY_DIR, 'events.json');\n\n// Telemetry endpoint - Supabase Edge Function → Pub/Sub → BigQuery\nconst DEFAULT_TELEMETRY_ENDPOINT = 'https://qzayrjwxiznkqfvmjxyy.supabase.co/functions/v1/telemetry-ingest';\nconst TELEMETRY_ENDPOINT = process.env.SQUADS_TELEMETRY_URL ||\n (process.env.SQUADS_BRIDGE_URL ? `${process.env.SQUADS_BRIDGE_URL}/api/telemetry` : DEFAULT_TELEMETRY_ENDPOINT);\n\n// Event queue for batch flushing\nlet eventQueue: TelemetryEvent[] = [];\nlet flushScheduled = false;\n\nfunction ensureDir(): void {\n if (!existsSync(TELEMETRY_DIR)) {\n mkdirSync(TELEMETRY_DIR, { recursive: true });\n }\n}\n\nfunction getConfig(): TelemetryConfig {\n ensureDir();\n\n if (!existsSync(CONFIG_PATH)) {\n const config: TelemetryConfig = {\n enabled: true, // Opt-out by default (common for CLIs)\n anonymousId: randomUUID(),\n firstRun: new Date().toISOString(),\n };\n writeFileSync(CONFIG_PATH, JSON.stringify(config, null, 2));\n return config;\n }\n\n try {\n return JSON.parse(readFileSync(CONFIG_PATH, 'utf-8'));\n } catch {\n return { enabled: false, anonymousId: '', firstRun: '' };\n }\n}\n\nfunction saveConfig(config: TelemetryConfig): void {\n ensureDir();\n writeFileSync(CONFIG_PATH, JSON.stringify(config, null, 2));\n}\n\nexport function isEnabled(): boolean {\n // Check environment variable first (allows CI/testing override)\n if (process.env.SQUADS_TELEMETRY_DISABLED === '1') {\n return false;\n }\n if (process.env.DO_NOT_TRACK === '1') {\n return false;\n }\n\n return getConfig().enabled;\n}\n\nexport function enable(): void {\n const config = getConfig();\n config.enabled = true;\n saveConfig(config);\n}\n\nexport function disable(): void {\n const config = getConfig();\n config.enabled = false;\n saveConfig(config);\n}\n\nexport function getAnonymousId(): string {\n return getConfig().anonymousId;\n}\n\nexport async function track(event: string, properties?: Record<string, string | number | boolean | undefined>): Promise<void> {\n if (!isEnabled()) return;\n\n const config = getConfig();\n\n const telemetryEvent: TelemetryEvent = {\n event,\n timestamp: new Date().toISOString(),\n properties: {\n ...properties,\n anonymousId: config.anonymousId,\n cliVersion: process.env.npm_package_version || 'unknown',\n },\n };\n\n // Store locally (for debugging/review)\n storeEventLocally(telemetryEvent);\n\n // Queue for batch sending\n eventQueue.push(telemetryEvent);\n\n // Schedule flush if not already scheduled\n if (TELEMETRY_ENDPOINT && !flushScheduled) {\n flushScheduled = true;\n // Flush on next tick to batch events from same command\n setImmediate(() => {\n flushEvents().catch(() => {});\n });\n }\n}\n\n/**\n * Flush queued events to the telemetry endpoint\n */\nexport async function flushEvents(): Promise<void> {\n if (!TELEMETRY_ENDPOINT || eventQueue.length === 0) {\n flushScheduled = false;\n return;\n }\n\n const batch = [...eventQueue];\n eventQueue = [];\n flushScheduled = false;\n\n try {\n await fetch(TELEMETRY_ENDPOINT, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ events: batch }),\n });\n } catch {\n // Restore events on failure (will retry on next track)\n eventQueue = [...batch, ...eventQueue].slice(-100); // Keep max 100\n }\n}\n\n/**\n * Track an error event\n */\nexport async function trackError(\n command: string,\n error: Error,\n context?: Record<string, string | number | boolean>\n): Promise<void> {\n await track(Events.CLI_ERROR, {\n command,\n errorType: error.constructor.name,\n errorMessage: error.message.slice(0, 100), // Truncate for privacy\n ...context,\n });\n}\n\n/**\n * Wrap an async command function with telemetry\n */\nexport function instrumentCommand<T>(\n name: string,\n fn: () => Promise<T>\n): () => Promise<T> {\n return async () => {\n const start = Date.now();\n try {\n const result = await fn();\n await track(`cli.${name}`, {\n durationMs: Date.now() - start,\n success: true,\n });\n return result;\n } catch (error) {\n await trackError(name, error as Error, {\n durationMs: Date.now() - start,\n });\n throw error;\n }\n };\n}\n\nfunction storeEventLocally(event: TelemetryEvent): void {\n ensureDir();\n\n let events: TelemetryEvent[] = [];\n\n if (existsSync(EVENTS_PATH)) {\n try {\n events = JSON.parse(readFileSync(EVENTS_PATH, 'utf-8'));\n } catch {\n events = [];\n }\n }\n\n // Keep last 1000 events\n events.push(event);\n if (events.length > 1000) {\n events = events.slice(-1000);\n }\n\n writeFileSync(EVENTS_PATH, JSON.stringify(events, null, 2));\n}\n\n// Pre-defined events for consistency\nexport const Events = {\n // Lifecycle\n CLI_INIT: 'cli.init',\n CLI_ERROR: 'cli.error',\n\n // Commands\n CLI_RUN: 'cli.run',\n CLI_STATUS: 'cli.status',\n CLI_DASHBOARD: 'cli.dashboard',\n CLI_WORKERS: 'cli.workers',\n\n // Goals\n CLI_GOAL_SET: 'cli.goal.set',\n CLI_GOAL_LIST: 'cli.goal.list',\n CLI_GOAL_COMPLETE: 'cli.goal.complete',\n CLI_GOAL_PROGRESS: 'cli.goal.progress',\n\n // Memory\n CLI_MEMORY_QUERY: 'cli.memory.query',\n CLI_MEMORY_SHOW: 'cli.memory.show',\n CLI_MEMORY_UPDATE: 'cli.memory.update',\n CLI_MEMORY_LIST: 'cli.memory.list',\n CLI_MEMORY_SYNC: 'cli.memory.sync',\n\n // Feedback\n CLI_FEEDBACK_ADD: 'cli.feedback.add',\n CLI_FEEDBACK_SHOW: 'cli.feedback.show',\n CLI_FEEDBACK_STATS: 'cli.feedback.stats',\n\n // Auth\n CLI_LOGIN: 'cli.login',\n CLI_LOGOUT: 'cli.logout',\n} as const;\n\n// Track command execution time (legacy helper)\nexport function trackCommand(command: string): () => void {\n const start = Date.now();\n\n return () => {\n const duration = Date.now() - start;\n track(`cli.${command}`, { durationMs: duration });\n };\n}\n\n// Register exit handler to flush remaining events\nlet exitHandlerRegistered = false;\n\nexport function registerExitHandler(): void {\n if (exitHandlerRegistered) return;\n exitHandlerRegistered = true;\n\n const cleanup = () => {\n // Synchronous flush attempt on exit\n if (eventQueue.length > 0 && TELEMETRY_ENDPOINT) {\n // Can't do async on exit, so just log\n storeEventLocally({\n event: 'cli.exit',\n timestamp: new Date().toISOString(),\n properties: { pendingEvents: eventQueue.length },\n });\n }\n };\n\n process.on('exit', cleanup);\n process.on('SIGINT', () => {\n cleanup();\n process.exit(0);\n });\n process.on('SIGTERM', () => {\n cleanup();\n process.exit(0);\n });\n}\n","import ora from 'ora';\nimport { spawn } from 'child_process';\nimport { join, dirname } from 'path';\nimport { existsSync, readFileSync, writeFileSync, mkdirSync } from 'fs';\nimport {\n findSquadsDir,\n loadSquad,\n listAgents,\n loadAgentDefinition\n} from '../lib/squad-parser.js';\nimport { findMemoryDir } from '../lib/memory.js';\nimport { track, Events } from '../lib/telemetry.js';\nimport {\n colors,\n bold,\n RESET,\n gradient,\n box,\n icons,\n writeLine,\n} from '../lib/terminal.js';\n\ninterface RunOptions {\n verbose?: boolean;\n dryRun?: boolean;\n agent?: string;\n timeout?: number; // minutes, default 30\n}\n\ninterface ExecutionRecord {\n squadName: string;\n agentName: string;\n startTime: string;\n endTime?: string;\n status: 'running' | 'completed' | 'failed';\n outcome?: string;\n}\n\nfunction getExecutionLogPath(squadName: string, agentName: string): string | null {\n const memoryDir = findMemoryDir();\n if (!memoryDir) return null;\n return join(memoryDir, squadName, agentName, 'executions.md');\n}\n\nfunction logExecution(record: ExecutionRecord): void {\n const logPath = getExecutionLogPath(record.squadName, record.agentName);\n if (!logPath) return;\n\n const dir = dirname(logPath);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n\n let content = '';\n if (existsSync(logPath)) {\n content = readFileSync(logPath, 'utf-8');\n } else {\n content = `# ${record.squadName}/${record.agentName} - Execution Log\\n\\n`;\n }\n\n const entry = `\n---\n**${record.startTime}** | Status: ${record.status}\n${record.endTime ? `Completed: ${record.endTime}` : ''}\n${record.outcome ? `Outcome: ${record.outcome}` : ''}\n`;\n\n writeFileSync(logPath, content + entry);\n}\n\nfunction updateExecutionStatus(\n squadName: string,\n agentName: string,\n status: 'completed' | 'failed',\n outcome?: string\n): void {\n const logPath = getExecutionLogPath(squadName, agentName);\n if (!logPath || !existsSync(logPath)) return;\n\n let content = readFileSync(logPath, 'utf-8');\n const endTime = new Date().toISOString();\n\n // Update the last \"running\" entry\n content = content.replace(\n /Status: running\\n$/,\n `Status: ${status}\\nCompleted: ${endTime}\\n${outcome ? `Outcome: ${outcome}\\n` : ''}`\n );\n\n writeFileSync(logPath, content);\n}\n\nexport async function runCommand(\n target: string,\n options: RunOptions\n): Promise<void> {\n const squadsDir = findSquadsDir();\n\n if (!squadsDir) {\n writeLine(` ${colors.red}No .agents/squads directory found${RESET}`);\n writeLine(` ${colors.dim}Run \\`squads init\\` to create one.${RESET}`);\n process.exit(1);\n }\n\n // Check if target is a squad or an agent\n const squad = loadSquad(target);\n\n if (squad) {\n await track(Events.CLI_RUN, { type: 'squad', target: squad.name });\n await runSquad(squad, squadsDir, options);\n } else {\n // Try to find as an agent\n const agents = listAgents(squadsDir);\n const agent = agents.find(a => a.name === target);\n\n if (agent && agent.filePath) {\n // Extract squad name from path\n const pathParts = agent.filePath.split('/');\n const squadIdx = pathParts.indexOf('squads');\n const squadName = squadIdx >= 0 ? pathParts[squadIdx + 1] : 'unknown';\n await runAgent(agent.name, agent.filePath, squadName, options);\n } else {\n writeLine(` ${colors.red}Squad or agent \"${target}\" not found${RESET}`);\n writeLine(` ${colors.dim}Run \\`squads list\\` to see available squads and agents.${RESET}`);\n process.exit(1);\n }\n }\n}\n\nasync function runSquad(\n squad: ReturnType<typeof loadSquad>,\n squadsDir: string,\n options: RunOptions\n): Promise<void> {\n if (!squad) return;\n\n const startTime = new Date().toISOString();\n\n writeLine();\n writeLine(` ${gradient('squads')} ${colors.dim}run${RESET} ${colors.cyan}${squad.name}${RESET}`);\n writeLine();\n if (squad.mission) {\n writeLine(` ${colors.dim}${squad.mission}${RESET}`);\n writeLine();\n }\n writeLine(` ${colors.dim}Started: ${startTime}${RESET}`);\n writeLine();\n\n // If there's a pipeline, run agents in order\n if (squad.pipelines.length > 0) {\n const pipeline = squad.pipelines[0];\n writeLine(` ${bold}Pipeline${RESET} ${colors.dim}${pipeline.agents.join(' → ')}${RESET}`);\n writeLine();\n\n for (let i = 0; i < pipeline.agents.length; i++) {\n const agentName = pipeline.agents[i];\n const agentPath = join(squadsDir, squad.name, `${agentName}.md`);\n\n if (existsSync(agentPath)) {\n writeLine(` ${colors.dim}[${i + 1}/${pipeline.agents.length}]${RESET}`);\n await runAgent(agentName, agentPath, squad.name, options);\n writeLine();\n } else {\n writeLine(` ${icons.warning} ${colors.yellow}Agent ${agentName} not found, skipping${RESET}`);\n }\n }\n } else {\n // If specific agent requested via -a flag, run that agent\n if (options.agent) {\n const agentPath = join(squadsDir, squad.name, `${options.agent}.md`);\n if (existsSync(agentPath)) {\n await runAgent(options.agent, agentPath, squad.name, options);\n } else {\n writeLine(` ${icons.error} ${colors.red}Agent ${options.agent} not found${RESET}`);\n return;\n }\n } else {\n // Run orchestrator if exists, otherwise list agents\n const orchestrator = squad.agents.find(a =>\n a.name.includes('lead') || a.trigger === 'Manual'\n );\n\n if (orchestrator) {\n const agentPath = join(squadsDir, squad.name, `${orchestrator.name}.md`);\n if (existsSync(agentPath)) {\n await runAgent(orchestrator.name, agentPath, squad.name, options);\n }\n } else {\n writeLine(` ${colors.dim}No pipeline defined. Available agents:${RESET}`);\n for (const agent of squad.agents) {\n writeLine(` ${icons.empty} ${colors.cyan}${agent.name}${RESET} ${colors.dim}${agent.role}${RESET}`);\n }\n writeLine();\n writeLine(` ${colors.dim}Run a specific agent:${RESET}`);\n writeLine(` ${colors.dim}$${RESET} squads run ${colors.cyan}${squad.name}${RESET} --agent ${colors.cyan}<name>${RESET}`);\n }\n }\n }\n\n writeLine();\n writeLine(` ${colors.dim}After execution, record outcome:${RESET}`);\n writeLine(` ${colors.dim}$${RESET} squads feedback add ${colors.cyan}${squad.name}${RESET} ${colors.cyan}<1-5>${RESET} ${colors.cyan}\"<feedback>\"${RESET}`);\n writeLine();\n}\n\nasync function runAgent(\n agentName: string,\n agentPath: string,\n squadName: string,\n options: RunOptions & { execute?: boolean }\n): Promise<void> {\n const spinner = ora(`Running agent: ${agentName}`).start();\n const startTime = new Date().toISOString();\n\n const definition = loadAgentDefinition(agentPath);\n\n if (options.dryRun) {\n spinner.info(`[DRY RUN] Would run ${agentName}`);\n if (options.verbose) {\n writeLine(` ${colors.dim}Agent definition:${RESET}`);\n writeLine(` ${colors.dim}${definition.slice(0, 500)}...${RESET}`);\n }\n return;\n }\n\n // Log execution start\n logExecution({\n squadName,\n agentName,\n startTime,\n status: 'running',\n });\n\n // Generate the Claude Code prompt\n const prompt = `Execute the ${agentName} agent from squad ${squadName}.\n\nRead the agent definition at ${agentPath} and follow its instructions exactly.\n\nThe agent definition contains:\n- Purpose/role\n- Tools it can use (MCP servers, skills)\n- Step-by-step instructions\n- Expected output format\n\nAfter completion:\n1. Update the agent's memory in .agents/memory/${squadName}/${agentName}/state.md\n2. Log any learnings to learnings.md\n3. Report what was accomplished`;\n\n // Check if Claude CLI is available\n const claudeAvailable = await checkClaudeCliAvailable();\n\n if (options.execute && claudeAvailable) {\n spinner.text = `Launching ${agentName} as background task...`;\n\n try {\n const result = await executeWithClaude(prompt, options.verbose, options.timeout || 30);\n spinner.succeed(`Agent ${agentName} launched`);\n // Don't mark as completed - it's running in background\n // Agent will update its own memory when done\n\n writeLine(` ${colors.dim}${result}${RESET}`);\n writeLine();\n writeLine(` ${colors.dim}Monitor:${RESET} squads workers`);\n writeLine(` ${colors.dim}Memory:${RESET} squads memory show ${squadName}`);\n } catch (error) {\n spinner.fail(`Agent ${agentName} failed to launch`);\n updateExecutionStatus(squadName, agentName, 'failed', String(error));\n writeLine(` ${colors.red}${String(error)}${RESET}`);\n }\n } else {\n // Show instructions for manual execution\n spinner.succeed(`Agent ${agentName} ready`);\n writeLine(` ${colors.dim}Execution logged: ${startTime}${RESET}`);\n\n if (!claudeAvailable) {\n writeLine();\n writeLine(` ${colors.yellow}Claude CLI not found${RESET}`);\n writeLine(` ${colors.dim}Install: npm install -g @anthropic-ai/claude-code${RESET}`);\n }\n\n writeLine();\n writeLine(` ${colors.dim}To launch as background task:${RESET}`);\n writeLine(` ${colors.dim}$${RESET} squads run ${colors.cyan}${squadName}${RESET} -a ${colors.cyan}${agentName}${RESET} --execute`);\n writeLine();\n writeLine(` ${colors.dim}Or run interactively:${RESET}`);\n writeLine(` ${colors.dim}$${RESET} Run the ${colors.cyan}${agentName}${RESET} agent from ${agentPath}`);\n }\n}\n\nasync function checkClaudeCliAvailable(): Promise<boolean> {\n return new Promise((resolve) => {\n const check = spawn('which', ['claude'], { stdio: 'pipe' });\n check.on('close', (code) => resolve(code === 0));\n check.on('error', () => resolve(false));\n });\n}\n\nasync function executeWithClaude(prompt: string, verbose?: boolean, timeoutMinutes: number = 30): Promise<string> {\n // Use interactive Claude Code (subscription) instead of --print (API credits)\n // Run via tmux for real PTY support and session management\n const userConfigPath = join(process.env.HOME || '', '.claude.json');\n\n // Extract squad/agent from prompt for telemetry tagging\n const squadMatch = prompt.match(/squad (\\w+)/);\n const agentMatch = prompt.match(/(\\w+) agent/);\n const squadName = squadMatch?.[1] || 'unknown';\n const agentName = agentMatch?.[1] || 'unknown';\n\n // Create unique session name\n const timestamp = Date.now();\n const sessionName = `squads-${squadName}-${agentName}-${timestamp}`;\n\n if (verbose) {\n writeLine(` ${colors.dim}Spawning tmux session: ${sessionName}${RESET}`);\n }\n\n // Escape prompt for shell\n const escapedPrompt = prompt.replace(/'/g, \"'\\\\''\");\n\n // Build Claude command with all permissions bypassed for autonomous execution\n const claudeCmd = `claude --dangerously-skip-permissions --mcp-config '${userConfigPath}' -- '${escapedPrompt}'`;\n\n // Create detached tmux session running Claude\n const tmux = spawn('tmux', [\n 'new-session',\n '-d', // Detached\n '-s', sessionName,\n '-x', '200', // Wide terminal for better output\n '-y', '50',\n '/bin/sh', '-c', claudeCmd\n ], {\n stdio: 'ignore',\n detached: true,\n env: {\n ...process.env,\n SQUADS_SQUAD: squadName,\n SQUADS_AGENT: agentName,\n },\n });\n\n tmux.unref();\n\n // Spawn a background process to auto-accept the dialog after it appears\n // This runs outside the tmux session and sends keys to it\n spawn('/bin/sh', ['-c', `sleep 2 && tmux send-keys -t '${sessionName}' Down Enter`], {\n stdio: 'ignore',\n detached: true,\n }).unref();\n\n if (verbose) {\n writeLine(` ${colors.dim}Attach: tmux attach -t ${sessionName}${RESET}`);\n }\n\n return `tmux session: ${sessionName}. Attach: tmux attach -t ${sessionName}`;\n}\n\nexport async function runSquadCommand(\n squadName: string,\n options: RunOptions\n): Promise<void> {\n return runCommand(squadName, options);\n}\n","import { readFileSync, existsSync, readdirSync, writeFileSync } from 'fs';\nimport { join, basename } from 'path';\n\nexport interface Agent {\n name: string;\n role: string;\n trigger: string;\n status?: string;\n filePath?: string;\n squad?: string;\n}\n\nexport interface Pipeline {\n name: string;\n agents: string[];\n}\n\nexport interface Goal {\n description: string;\n completed: boolean;\n progress?: string;\n metrics?: string[];\n}\n\nexport interface Squad {\n name: string;\n mission: string;\n agents: Agent[];\n pipelines: Pipeline[];\n triggers: {\n scheduled: string[];\n event: string[];\n manual: string[];\n };\n dependencies: string[];\n outputPath: string;\n goals: Goal[];\n}\n\nexport function findSquadsDir(): string | null {\n // Look for .agents/squads in current directory or parent directories\n let dir = process.cwd();\n\n for (let i = 0; i < 5; i++) {\n const squadsPath = join(dir, '.agents', 'squads');\n if (existsSync(squadsPath)) {\n return squadsPath;\n }\n const parent = join(dir, '..');\n if (parent === dir) break;\n dir = parent;\n }\n\n return null;\n}\n\nexport function listSquads(squadsDir: string): string[] {\n const squads: string[] = [];\n\n const entries = readdirSync(squadsDir, { withFileTypes: true });\n for (const entry of entries) {\n if (entry.isDirectory() && !entry.name.startsWith('_')) {\n const squadFile = join(squadsDir, entry.name, 'SQUAD.md');\n if (existsSync(squadFile)) {\n squads.push(entry.name);\n }\n }\n }\n\n return squads;\n}\n\nexport function listAgents(squadsDir: string, squadName?: string): Agent[] {\n const agents: Agent[] = [];\n\n const dirs = squadName\n ? [squadName]\n : readdirSync(squadsDir, { withFileTypes: true })\n .filter(e => e.isDirectory() && !e.name.startsWith('_'))\n .map(e => e.name);\n\n for (const dir of dirs) {\n const squadPath = join(squadsDir, dir);\n if (!existsSync(squadPath)) continue;\n\n const files = readdirSync(squadPath);\n for (const file of files) {\n if (file.endsWith('.md') && file !== 'SQUAD.md') {\n const agentName = file.replace('.md', '');\n agents.push({\n name: agentName,\n role: `Agent in ${dir}`,\n trigger: 'manual',\n filePath: join(squadPath, file)\n });\n }\n }\n }\n\n return agents;\n}\n\nexport function parseSquadFile(filePath: string): Squad {\n const content = readFileSync(filePath, 'utf-8');\n const lines = content.split('\\n');\n\n const squad: Squad = {\n name: basename(filePath).replace('.md', ''),\n mission: '',\n agents: [],\n pipelines: [],\n triggers: { scheduled: [], event: [], manual: [] },\n dependencies: [],\n outputPath: '',\n goals: []\n };\n\n let currentSection = '';\n let inTable = false;\n let tableHeaders: string[] = [];\n\n for (const line of lines) {\n // Extract squad name from title\n if (line.startsWith('# Squad:')) {\n squad.name = line.replace('# Squad:', '').trim().toLowerCase();\n continue;\n }\n\n // Track sections\n if (line.startsWith('## ')) {\n currentSection = line.replace('## ', '').trim().toLowerCase();\n inTable = false;\n continue;\n }\n\n // Extract mission\n if (currentSection === 'mission' && line.trim() && !line.startsWith('#')) {\n if (!squad.mission) {\n squad.mission = line.trim();\n }\n }\n\n // Parse agent tables\n if (currentSection.includes('agent') || currentSection.includes('orchestrator') ||\n currentSection.includes('evaluator') || currentSection.includes('builder') ||\n currentSection.includes('priority')) {\n\n if (line.includes('|') && line.includes('Agent')) {\n inTable = true;\n tableHeaders = line.split('|').map(h => h.trim().toLowerCase());\n continue;\n }\n\n if (inTable && line.includes('|') && !line.includes('---')) {\n const cells = line.split('|').map(c => c.trim().replace(/`/g, ''));\n const agentIdx = tableHeaders.findIndex(h => h === 'agent');\n const roleIdx = tableHeaders.findIndex(h => h === 'role');\n const triggerIdx = tableHeaders.findIndex(h => h === 'trigger');\n const statusIdx = tableHeaders.findIndex(h => h === 'status');\n\n if (agentIdx >= 0 && cells[agentIdx]) {\n squad.agents.push({\n name: cells[agentIdx],\n role: roleIdx >= 0 ? cells[roleIdx] : '',\n trigger: triggerIdx >= 0 ? cells[triggerIdx] : 'manual',\n status: statusIdx >= 0 ? cells[statusIdx] : 'active'\n });\n }\n }\n }\n\n // Parse pipelines (looking for patterns like: agent1 → agent2 → agent3)\n if (line.includes('→') && line.includes('`')) {\n const pipelineMatch = line.match(/`([^`]+)`\\s*→\\s*`([^`]+)`/g);\n if (pipelineMatch) {\n const agentNames = line.match(/`([^`]+)`/g)?.map(m => m.replace(/`/g, '')) || [];\n if (agentNames.length >= 2) {\n squad.pipelines.push({\n name: 'default',\n agents: agentNames\n });\n }\n }\n }\n\n // Also look for Pipeline: format\n if (line.toLowerCase().includes('pipeline:')) {\n const pipelineContent = line.split(':')[1];\n if (pipelineContent && pipelineContent.includes('→')) {\n const agentNames = pipelineContent.match(/`([^`]+)`/g)?.map(m => m.replace(/`/g, '')) || [];\n if (agentNames.length >= 2) {\n squad.pipelines.push({\n name: 'default',\n agents: agentNames\n });\n }\n }\n }\n\n // Extract output path\n if (line.toLowerCase().includes('primary') && line.includes('`')) {\n const match = line.match(/`([^`]+)`/);\n if (match) {\n squad.outputPath = match[1].replace(/\\/$/, '');\n }\n }\n\n // Parse goals (checkbox format: - [ ] or - [x])\n if (currentSection === 'goals') {\n const goalMatch = line.match(/^-\\s*\\[([ x])\\]\\s*(.+)$/);\n if (goalMatch) {\n const completed = goalMatch[1] === 'x';\n let description = goalMatch[2].trim();\n let progress: string | undefined;\n\n // Check for progress annotation\n const progressMatch = description.match(/\\(progress:\\s*([^)]+)\\)/i);\n if (progressMatch) {\n progress = progressMatch[1];\n description = description.replace(progressMatch[0], '').trim();\n }\n\n squad.goals.push({\n description,\n completed,\n progress\n });\n }\n }\n }\n\n return squad;\n}\n\nexport function loadSquad(squadName: string): Squad | null {\n const squadsDir = findSquadsDir();\n if (!squadsDir) return null;\n\n const squadFile = join(squadsDir, squadName, 'SQUAD.md');\n if (!existsSync(squadFile)) return null;\n\n return parseSquadFile(squadFile);\n}\n\nexport function loadAgentDefinition(agentPath: string): string {\n if (!existsSync(agentPath)) return '';\n return readFileSync(agentPath, 'utf-8');\n}\n\nexport function addGoalToSquad(squadName: string, goal: string): boolean {\n const squadsDir = findSquadsDir();\n if (!squadsDir) return false;\n\n const squadFile = join(squadsDir, squadName, 'SQUAD.md');\n if (!existsSync(squadFile)) return false;\n\n let content = readFileSync(squadFile, 'utf-8');\n\n // Check if Goals section exists\n if (!content.includes('## Goals')) {\n // Add Goals section before Dependencies or at end\n const insertPoint = content.indexOf('## Dependencies');\n if (insertPoint > 0) {\n content = content.slice(0, insertPoint) + `## Goals\\n\\n- [ ] ${goal}\\n\\n` + content.slice(insertPoint);\n } else {\n content += `\\n## Goals\\n\\n- [ ] ${goal}\\n`;\n }\n } else {\n // Add to existing Goals section\n const goalsIdx = content.indexOf('## Goals');\n const nextSectionIdx = content.indexOf('\\n## ', goalsIdx + 1);\n const endIdx = nextSectionIdx > 0 ? nextSectionIdx : content.length;\n\n // Find last goal line or section header\n const goalsSection = content.slice(goalsIdx, endIdx);\n const lastGoalMatch = goalsSection.match(/^-\\s*\\[[ x]\\].+$/gm);\n\n if (lastGoalMatch) {\n // Add after last goal\n const lastGoal = lastGoalMatch[lastGoalMatch.length - 1];\n const lastGoalIdx = content.lastIndexOf(lastGoal, endIdx);\n const insertPos = lastGoalIdx + lastGoal.length;\n content = content.slice(0, insertPos) + `\\n- [ ] ${goal}` + content.slice(insertPos);\n } else {\n // No goals yet, add after section header\n const headerEnd = goalsIdx + '## Goals'.length;\n content = content.slice(0, headerEnd) + `\\n\\n- [ ] ${goal}` + content.slice(headerEnd);\n }\n }\n\n writeFileSync(squadFile, content);\n return true;\n}\n\nexport function updateGoalInSquad(\n squadName: string,\n goalIndex: number,\n updates: { completed?: boolean; progress?: string }\n): boolean {\n const squadsDir = findSquadsDir();\n if (!squadsDir) return false;\n\n const squadFile = join(squadsDir, squadName, 'SQUAD.md');\n if (!existsSync(squadFile)) return false;\n\n const content = readFileSync(squadFile, 'utf-8');\n const lines = content.split('\\n');\n\n let currentSection = '';\n let goalCount = 0;\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n\n if (line.startsWith('## ')) {\n currentSection = line.replace('## ', '').trim().toLowerCase();\n continue;\n }\n\n if (currentSection === 'goals') {\n const goalMatch = line.match(/^-\\s*\\[([ x])\\]\\s*(.+)$/);\n if (goalMatch) {\n if (goalCount === goalIndex) {\n let newLine = '- [' + (updates.completed ? 'x' : ' ') + '] ' + goalMatch[2];\n\n // Handle progress update\n if (updates.progress !== undefined) {\n // Remove existing progress annotation\n newLine = newLine.replace(/\\s*\\(progress:\\s*[^)]+\\)/i, '');\n if (updates.progress) {\n newLine += ` (progress: ${updates.progress})`;\n }\n }\n\n lines[i] = newLine;\n writeFileSync(squadFile, lines.join('\\n'));\n return true;\n }\n goalCount++;\n }\n }\n }\n\n return false;\n}\n","import { readFileSync, writeFileSync, existsSync, readdirSync, mkdirSync } from 'fs';\nimport { join, dirname } from 'path';\n\nexport interface MemoryEntry {\n squad: string;\n agent: string;\n type: 'state' | 'output' | 'learnings' | 'feedback';\n content: string;\n path: string;\n lastUpdated?: string;\n}\n\nexport interface SearchResult {\n entry: MemoryEntry;\n matches: string[];\n score: number;\n}\n\nexport function findMemoryDir(): string | null {\n let dir = process.cwd();\n\n for (let i = 0; i < 5; i++) {\n const memoryPath = join(dir, '.agents', 'memory');\n if (existsSync(memoryPath)) {\n return memoryPath;\n }\n const parent = join(dir, '..');\n if (parent === dir) break;\n dir = parent;\n }\n\n return null;\n}\n\nexport function listMemoryEntries(memoryDir: string): MemoryEntry[] {\n const entries: MemoryEntry[] = [];\n\n const squads = readdirSync(memoryDir, { withFileTypes: true })\n .filter(e => e.isDirectory())\n .map(e => e.name);\n\n for (const squad of squads) {\n const squadPath = join(memoryDir, squad);\n const agents = readdirSync(squadPath, { withFileTypes: true })\n .filter(e => e.isDirectory())\n .map(e => e.name);\n\n for (const agent of agents) {\n const agentPath = join(squadPath, agent);\n const files = readdirSync(agentPath).filter(f => f.endsWith('.md'));\n\n for (const file of files) {\n const filePath = join(agentPath, file);\n const type = file.replace('.md', '') as MemoryEntry['type'];\n\n entries.push({\n squad,\n agent,\n type,\n content: readFileSync(filePath, 'utf-8'),\n path: filePath\n });\n }\n }\n }\n\n return entries;\n}\n\n// Semantic expansions for common business terms\nconst SEMANTIC_EXPANSIONS: Record<string, string[]> = {\n 'pricing': ['price', 'cost', '$', 'revenue', 'fee', 'rate'],\n 'price': ['pricing', 'cost', '$', 'fee'],\n 'revenue': ['income', 'sales', 'mrr', 'arr', '$'],\n 'cost': ['expense', 'spend', 'budget', '$', 'price'],\n 'customer': ['client', 'lead', 'prospect', 'user'],\n 'client': ['customer', 'lead', 'prospect'],\n 'lead': ['prospect', 'customer', 'client', 'pipeline'],\n 'agent': ['squad', 'bot', 'ai'],\n 'squad': ['team', 'agent', 'group'],\n 'status': ['state', 'progress', 'health'],\n 'bug': ['issue', 'error', 'problem', 'fix'],\n 'feature': ['capability', 'function', 'ability'],\n};\n\nfunction expandQuery(query: string): string[] {\n const words = query.toLowerCase().split(/\\s+/);\n const expanded = new Set(words);\n\n for (const word of words) {\n if (SEMANTIC_EXPANSIONS[word]) {\n SEMANTIC_EXPANSIONS[word].forEach(syn => expanded.add(syn));\n }\n }\n\n return Array.from(expanded);\n}\n\nfunction getFileAge(filePath: string): number {\n try {\n const { statSync } = require('fs');\n const stats = statSync(filePath);\n const ageMs = Date.now() - stats.mtimeMs;\n const ageDays = ageMs / (1000 * 60 * 60 * 24);\n return ageDays;\n } catch {\n return 999;\n }\n}\n\nexport function searchMemory(query: string, memoryDir?: string): SearchResult[] {\n const dir = memoryDir || findMemoryDir();\n if (!dir) return [];\n\n const entries = listMemoryEntries(dir);\n const results: SearchResult[] = [];\n const queryLower = query.toLowerCase();\n const expandedTerms = expandQuery(queryLower);\n\n for (const entry of entries) {\n const contentLower = entry.content.toLowerCase();\n const lines = entry.content.split('\\n');\n const matches: string[] = [];\n let score = 0;\n let directHits = 0;\n let expandedHits = 0;\n\n // Check direct query words first\n const directWords = queryLower.split(/\\s+/);\n for (const word of directWords) {\n if (contentLower.includes(word)) {\n directHits += 1;\n score += 2; // Direct matches worth more\n }\n }\n\n // Check expanded terms\n for (const term of expandedTerms) {\n if (contentLower.includes(term)) {\n expandedHits += 1;\n score += 0.5; // Expanded matches worth less but still count\n\n // Find matching lines with context\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n if (line.toLowerCase().includes(term) && line.trim() && !matches.includes(line.trim())) {\n matches.push(line.trim());\n }\n }\n }\n }\n\n // Boost score for exact phrase match\n if (contentLower.includes(queryLower)) {\n score += 5;\n }\n\n // Recency boost - files updated recently are more relevant\n const ageDays = getFileAge(entry.path);\n if (ageDays < 1) {\n score *= 1.5; // Updated today\n } else if (ageDays < 7) {\n score *= 1.2; // Updated this week\n } else if (ageDays > 30) {\n score *= 0.8; // Stale data penalty\n }\n\n // Type weighting - balanced across types\n const typeWeights: Record<string, number> = {\n 'state': 1.2, // Current state slightly preferred\n 'learnings': 1.1, // Learnings are valuable\n 'output': 1.0, // Recent outputs\n 'feedback': 0.9, // Feedback less commonly needed\n };\n score *= typeWeights[entry.type] || 1.0;\n\n if (score > 0 && (directHits > 0 || expandedHits > 1)) {\n results.push({ entry, matches: matches.slice(0, 7), score });\n }\n }\n\n // Sort by score descending\n return results.sort((a, b) => b.score - a.score);\n}\n\nexport function getSquadState(squadName: string): MemoryEntry[] {\n const memoryDir = findMemoryDir();\n if (!memoryDir) return [];\n\n const squadPath = join(memoryDir, squadName);\n if (!existsSync(squadPath)) return [];\n\n const entries: MemoryEntry[] = [];\n const agents = readdirSync(squadPath, { withFileTypes: true })\n .filter(e => e.isDirectory())\n .map(e => e.name);\n\n for (const agent of agents) {\n const statePath = join(squadPath, agent, 'state.md');\n if (existsSync(statePath)) {\n entries.push({\n squad: squadName,\n agent,\n type: 'state',\n content: readFileSync(statePath, 'utf-8'),\n path: statePath\n });\n }\n }\n\n return entries;\n}\n\nexport function updateMemory(\n squadName: string,\n agentName: string,\n type: MemoryEntry['type'],\n content: string\n): void {\n const memoryDir = findMemoryDir();\n if (!memoryDir) {\n throw new Error('No .agents/memory directory found');\n }\n\n const filePath = join(memoryDir, squadName, agentName, `${type}.md`);\n const dir = dirname(filePath);\n\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n\n writeFileSync(filePath, content);\n}\n\nexport function appendToMemory(\n squadName: string,\n agentName: string,\n type: MemoryEntry['type'],\n addition: string\n): void {\n const memoryDir = findMemoryDir();\n if (!memoryDir) {\n throw new Error('No .agents/memory directory found');\n }\n\n const filePath = join(memoryDir, squadName, agentName, `${type}.md`);\n\n let existing = '';\n if (existsSync(filePath)) {\n existing = readFileSync(filePath, 'utf-8');\n }\n\n const timestamp = new Date().toISOString().split('T')[0];\n const newContent = existing + `\\n\\n---\\n_Added: ${timestamp}_\\n\\n${addition}`;\n\n updateMemory(squadName, agentName, type, newContent.trim());\n}\n","// Terminal utilities - Bun-style approach\n// Raw ANSI for performance, no heavy deps\n\n// ANSI escape codes\nexport const ESC = '\\x1b[';\nexport const RESET = `${ESC}0m`;\n\n// Colors (256-color mode for gradients)\nexport const rgb = (r: number, g: number, b: number) => `${ESC}38;2;${r};${g};${b}m`;\nexport const bgRgb = (r: number, g: number, b: number) => `${ESC}48;2;${r};${g};${b}m`;\n\n// Named colors (our brand palette)\nexport const colors = {\n purple: rgb(168, 85, 247), // #a855f7\n pink: rgb(236, 72, 153), // #ec4899\n cyan: rgb(6, 182, 212), // #06b6d4\n green: rgb(16, 185, 129), // #10b981\n yellow: rgb(234, 179, 8), // #eab308\n red: rgb(239, 68, 68), // #ef4444\n gray: rgb(107, 114, 128), // #6b7280\n dim: rgb(75, 85, 99), // #4b5563\n white: rgb(255, 255, 255),\n};\n\n// Styles\nexport const bold = `${ESC}1m`;\nexport const dim = `${ESC}2m`;\n\n// Cursor control\nexport const cursor = {\n hide: `${ESC}?25l`,\n show: `${ESC}?25h`,\n up: (n = 1) => `${ESC}${n}A`,\n down: (n = 1) => `${ESC}${n}B`,\n left: (n = 1) => `${ESC}${n}D`,\n right: (n = 1) => `${ESC}${n}C`,\n to: (x: number, y: number) => `${ESC}${y};${x}H`,\n save: `${ESC}s`,\n restore: `${ESC}u`,\n};\n\n// Clear\nexport const clear = {\n line: `${ESC}2K`,\n toEnd: `${ESC}0K`,\n screen: `${ESC}2J${ESC}0;0H`,\n};\n\n// Gradient text (purple → pink → cyan)\nexport function gradient(text: string): string {\n const stops = [\n [168, 85, 247], // purple\n [192, 132, 252], // purple-light\n [232, 121, 249], // pink\n [244, 114, 182], // pink-light\n [251, 113, 133], // rose\n ];\n\n let result = '';\n for (let i = 0; i < text.length; i++) {\n const t = i / Math.max(text.length - 1, 1);\n const stopIndex = t * (stops.length - 1);\n const lower = Math.floor(stopIndex);\n const upper = Math.min(lower + 1, stops.length - 1);\n const blend = stopIndex - lower;\n\n const r = Math.round(stops[lower][0] + (stops[upper][0] - stops[lower][0]) * blend);\n const g = Math.round(stops[lower][1] + (stops[upper][1] - stops[lower][1]) * blend);\n const b = Math.round(stops[lower][2] + (stops[upper][2] - stops[lower][2]) * blend);\n\n result += rgb(r, g, b) + text[i];\n }\n return result + RESET;\n}\n\n// Progress bar with gradient fill\nexport function progressBar(percent: number, width = 20): string {\n const filled = Math.round((percent / 100) * width);\n const empty = width - filled;\n\n let bar = '';\n for (let i = 0; i < filled; i++) {\n const t = i / Math.max(filled - 1, 1);\n const r = Math.round(16 + (168 - 16) * t);\n const g = Math.round(185 + (85 - 185) * t);\n const b = Math.round(129 + (247 - 129) * t);\n bar += rgb(r, g, b) + '━';\n }\n\n bar += colors.dim + '━'.repeat(empty) + RESET;\n return bar;\n}\n\n// Box drawing\nexport const box = {\n topLeft: '┌',\n topRight: '┐',\n bottomLeft: '└',\n bottomRight: '┘',\n horizontal: '─',\n vertical: '│',\n teeRight: '├',\n teeLeft: '┤',\n};\n\n// Format helpers\nexport function padEnd(str: string, len: number): string {\n // Strip ANSI codes for length calculation\n const visible = str.replace(/\\x1b\\[[0-9;]*m/g, '');\n const pad = Math.max(0, len - visible.length);\n return str + ' '.repeat(pad);\n}\n\nexport function truncate(str: string, len: number): string {\n const visible = str.replace(/\\x1b\\[[0-9;]*m/g, '');\n if (visible.length <= len) return str;\n\n // Simple truncation (won't handle mid-ANSI truncation perfectly)\n let result = '';\n let count = 0;\n let i = 0;\n\n while (i < str.length && count < len - 1) {\n if (str[i] === '\\x1b') {\n const end = str.indexOf('m', i);\n if (end !== -1) {\n result += str.slice(i, end + 1);\n i = end + 1;\n continue;\n }\n }\n result += str[i];\n count++;\n i++;\n }\n\n return result + colors.dim + '…' + RESET;\n}\n\n// Spinner frames\nexport const spinnerFrames = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];\n\n// Status icons\nexport const icons = {\n success: `${colors.green}●${RESET}`,\n warning: `${colors.yellow}○${RESET}`,\n error: `${colors.red}●${RESET}`,\n pending: `${colors.dim}○${RESET}`,\n active: `${colors.green}●${RESET}`,\n progress: `${colors.cyan}◆${RESET}`,\n empty: `${colors.dim}◇${RESET}`,\n};\n\n// Write without newline\nexport function write(str: string): void {\n process.stdout.write(str);\n}\n\n// Write line\nexport function writeLine(str = ''): void {\n process.stdout.write(str + '\\n');\n}\n\n// Sparkline chart using block characters\nexport function sparkline(values: number[], width?: number): string {\n if (values.length === 0) return '';\n\n const blocks = ['▁', '▂', '▃', '▄', '▅', '▆', '▇', '█'];\n const max = Math.max(...values, 1);\n\n let result = '';\n for (const val of values) {\n const normalized = val / max;\n const blockIndex = Math.min(Math.floor(normalized * blocks.length), blocks.length - 1);\n const intensity = normalized;\n\n // Color gradient from dim to cyan to green based on value\n if (normalized === 0) {\n result += colors.dim + blocks[0];\n } else if (normalized < 0.5) {\n result += colors.cyan + blocks[blockIndex];\n } else {\n result += colors.green + blocks[blockIndex];\n }\n }\n\n return result + RESET;\n}\n\n// Bar chart (horizontal)\nexport function barChart(value: number, max: number, width: number = 20, label?: string): string {\n const filled = Math.round((value / max) * width);\n const empty = width - filled;\n\n let bar = '';\n for (let i = 0; i < filled; i++) {\n const t = i / Math.max(filled - 1, 1);\n // Green to cyan gradient\n const r = Math.round(16 + (6 - 16) * t);\n const g = Math.round(185 + (182 - 185) * t);\n const b = Math.round(129 + (212 - 129) * t);\n bar += rgb(r, g, b) + '━';\n }\n\n bar += colors.dim + '━'.repeat(empty) + RESET;\n\n if (label) {\n return `${bar} ${label}`;\n }\n return bar;\n}\n","import {\n findSquadsDir,\n listSquads,\n listAgents\n} from '../lib/squad-parser.js';\nimport {\n colors,\n bold,\n RESET,\n gradient,\n box,\n padEnd,\n icons,\n writeLine,\n} from '../lib/terminal.js';\n\ninterface ListOptions {\n squads?: boolean;\n agents?: boolean;\n}\n\nexport async function listCommand(options: ListOptions): Promise<void> {\n const squadsDir = findSquadsDir();\n\n if (!squadsDir) {\n writeLine(` ${colors.red}No .agents/squads directory found${RESET}`);\n writeLine(` ${colors.dim}Run \\`squads init\\` to create one.${RESET}`);\n process.exit(1);\n }\n\n const squads = listSquads(squadsDir);\n const allAgents = listAgents(squadsDir);\n\n writeLine();\n writeLine(` ${gradient('squads')} ${colors.dim}list${RESET}`);\n writeLine();\n\n // Stats\n writeLine(` ${colors.cyan}${squads.length}${RESET} squads ${colors.dim}│${RESET} ${colors.cyan}${allAgents.length}${RESET} agents`);\n writeLine();\n\n if (!options.agents) {\n // Show squads table\n const w = { name: 16, agents: 8, lead: 24 };\n const tableWidth = w.name + w.agents + w.lead + 4;\n\n writeLine(` ${colors.purple}${box.topLeft}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.topRight}${RESET}`);\n\n const header = ` ${colors.purple}${box.vertical}${RESET} ` +\n `${bold}${padEnd('SQUAD', w.name)}${RESET}` +\n `${bold}${padEnd('AGENTS', w.agents)}${RESET}` +\n `${bold}LEAD${RESET}` +\n ` ${colors.purple}${box.vertical}${RESET}`;\n writeLine(header);\n\n writeLine(` ${colors.purple}${box.teeRight}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.teeLeft}${RESET}`);\n\n for (const squadName of squads) {\n const agents = listAgents(squadsDir, squadName);\n const lead = agents.find(a => a.name.includes('lead'))?.name || agents[0]?.name || '-';\n\n const row = ` ${colors.purple}${box.vertical}${RESET} ` +\n `${colors.cyan}${padEnd(squadName, w.name)}${RESET}` +\n `${padEnd(String(agents.length), w.agents)}` +\n `${colors.dim}${padEnd(lead, w.lead)}${RESET}` +\n `${colors.purple}${box.vertical}${RESET}`;\n\n writeLine(row);\n }\n\n writeLine(` ${colors.purple}${box.bottomLeft}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.bottomRight}${RESET}`);\n writeLine();\n }\n\n if (!options.squads && options.agents) {\n // Show agents list\n writeLine(` ${bold}Agents${RESET}`);\n writeLine();\n\n for (const agent of allAgents) {\n const squadPart = agent.squad ? `${colors.dim}${agent.squad}/${RESET}` : '';\n const statusIcon = agent.status?.toLowerCase() === 'active' ? icons.active : icons.pending;\n\n writeLine(` ${statusIcon} ${squadPart}${colors.white}${agent.name}${RESET}`);\n if (agent.role) {\n writeLine(` ${colors.dim}└ ${agent.role}${RESET}`);\n }\n }\n writeLine();\n }\n\n // Commands\n writeLine(` ${colors.dim}$${RESET} squads status ${colors.cyan}<squad>${RESET} ${colors.dim}Squad details${RESET}`);\n writeLine(` ${colors.dim}$${RESET} squads run ${colors.cyan}<squad>${RESET} ${colors.dim}Execute a squad${RESET}`);\n writeLine();\n}\n","import { existsSync, statSync } from 'fs';\nimport { join } from 'path';\nimport {\n findSquadsDir,\n loadSquad,\n listSquads,\n listAgents\n} from '../lib/squad-parser.js';\nimport { findMemoryDir, getSquadState } from '../lib/memory.js';\nimport { getLiveSessionSummary, cleanupStaleSessions } from '../lib/sessions.js';\nimport { checkForUpdate } from '../lib/update.js';\nimport {\n colors,\n bold,\n RESET,\n gradient,\n box,\n padEnd,\n icons,\n writeLine,\n} from '../lib/terminal.js';\n\ninterface StatusOptions {\n verbose?: boolean;\n}\n\nexport async function statusCommand(\n squadName?: string,\n options: StatusOptions = {}\n): Promise<void> {\n const squadsDir = findSquadsDir();\n\n if (!squadsDir) {\n writeLine(`${colors.red}No .agents/squads directory found${RESET}`);\n writeLine(`${colors.dim}Run \\`squads init\\` to create one.${RESET}`);\n process.exit(1);\n }\n\n if (squadName) {\n await showSquadStatus(squadName, squadsDir, options);\n } else {\n await showOverallStatus(squadsDir, options);\n }\n}\n\nasync function showOverallStatus(\n squadsDir: string,\n _options: StatusOptions\n): Promise<void> {\n const squads = listSquads(squadsDir);\n const memoryDir = findMemoryDir();\n\n // Get active sessions (real-time process detection)\n cleanupStaleSessions();\n const sessionSummary = getLiveSessionSummary();\n\n writeLine();\n writeLine(` ${gradient('squads')} ${colors.dim}status${RESET}`);\n\n // Check for updates (cached, non-blocking)\n const updateInfo = checkForUpdate();\n if (updateInfo.updateAvailable) {\n writeLine(` ${colors.cyan}⬆${RESET} Update available: ${colors.dim}${updateInfo.currentVersion}${RESET} → ${colors.green}${updateInfo.latestVersion}${RESET} ${colors.dim}(run \\`squads update\\`)${RESET}`);\n }\n\n // Session indicator line (only if there are active sessions)\n if (sessionSummary.totalSessions > 0) {\n const sessionText = sessionSummary.totalSessions === 1 ? 'session' : 'sessions';\n const squadText = sessionSummary.squadCount === 1 ? 'squad' : 'squads';\n\n // Build tool breakdown string (e.g., \"claude 4, cursor 2\")\n let toolInfo = '';\n if (sessionSummary.byTool && Object.keys(sessionSummary.byTool).length > 0) {\n const toolParts = Object.entries(sessionSummary.byTool)\n .sort((a, b) => b[1] - a[1]) // Sort by count descending\n .map(([tool, count]) => `${colors.dim}${tool}${RESET} ${colors.cyan}${count}${RESET}`);\n toolInfo = ` ${colors.dim}(${RESET}${toolParts.join(` ${colors.dim}·${RESET} `)}${colors.dim})${RESET}`;\n }\n\n writeLine(` ${colors.green}${icons.active}${RESET} ${colors.white}${sessionSummary.totalSessions}${RESET} active ${sessionText} ${colors.dim}across${RESET} ${colors.cyan}${sessionSummary.squadCount}${RESET} ${squadText}${toolInfo}`);\n }\n writeLine();\n\n // Stats row\n const totalSquads = squads.length;\n const activeCount = squads.length; // All loaded squads are \"active\"\n writeLine(` ${colors.cyan}${activeCount}${RESET}/${totalSquads} squads ${colors.dim}│${RESET} ${colors.dim}memory: ${memoryDir ? 'enabled' : 'none'}${RESET}`);\n writeLine();\n\n // Table\n const w = { name: 16, agents: 8, memory: 14, activity: 12 };\n const tableWidth = w.name + w.agents + w.memory + w.activity + 6;\n\n writeLine(` ${colors.purple}${box.topLeft}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.topRight}${RESET}`);\n\n const header = ` ${colors.purple}${box.vertical}${RESET} ` +\n `${bold}${padEnd('SQUAD', w.name)}${RESET}` +\n `${bold}${padEnd('AGENTS', w.agents)}${RESET}` +\n `${bold}${padEnd('MEMORY', w.memory)}${RESET}` +\n `${bold}ACTIVITY${RESET}` +\n ` ${colors.purple}${box.vertical}${RESET}`;\n writeLine(header);\n\n writeLine(` ${colors.purple}${box.teeRight}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.teeLeft}${RESET}`);\n\n for (const squadName of squads) {\n const agents = listAgents(squadsDir, squadName);\n\n // Check memory\n let memoryStatus = `${colors.dim}none${RESET}`;\n let lastActivity = `${colors.dim}—${RESET}`;\n let activityColor = colors.dim;\n\n if (memoryDir) {\n const squadMemoryPath = join(memoryDir, squadName);\n if (existsSync(squadMemoryPath)) {\n const states = getSquadState(squadName);\n memoryStatus = `${colors.green}${states.length} ${states.length === 1 ? 'entry' : 'entries'}${RESET}`;\n\n // Find most recent file\n let mostRecent = 0;\n for (const state of states) {\n const stat = statSync(state.path);\n if (stat.mtimeMs > mostRecent) {\n mostRecent = stat.mtimeMs;\n }\n }\n\n if (mostRecent > 0) {\n const daysAgo = Math.floor((Date.now() - mostRecent) / (1000 * 60 * 60 * 24));\n if (daysAgo === 0) {\n lastActivity = 'today';\n activityColor = colors.green;\n } else if (daysAgo === 1) {\n lastActivity = 'yesterday';\n activityColor = colors.green;\n } else if (daysAgo < 7) {\n lastActivity = `${daysAgo}d ago`;\n activityColor = colors.yellow;\n } else {\n lastActivity = `${daysAgo}d ago`;\n activityColor = colors.dim;\n }\n }\n }\n }\n\n const row = ` ${colors.purple}${box.vertical}${RESET} ` +\n `${colors.cyan}${padEnd(squadName, w.name)}${RESET}` +\n `${padEnd(String(agents.length), w.agents)}` +\n `${padEnd(memoryStatus, w.memory)}` +\n `${padEnd(`${activityColor}${lastActivity}${RESET}`, w.activity)}` +\n `${colors.purple}${box.vertical}${RESET}`;\n\n writeLine(row);\n }\n\n writeLine(` ${colors.purple}${box.bottomLeft}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.bottomRight}${RESET}`);\n writeLine();\n\n // Commands\n writeLine(` ${colors.dim}$${RESET} squads status ${colors.cyan}<squad>${RESET} ${colors.dim}Squad details${RESET}`);\n writeLine(` ${colors.dim}$${RESET} squads dash ${colors.dim}Full dashboard${RESET}`);\n writeLine(` ${colors.dim}$${RESET} squads run ${colors.cyan}<squad>${RESET} ${colors.dim}Execute a squad${RESET}`);\n writeLine();\n}\n\nasync function showSquadStatus(\n squadName: string,\n squadsDir: string,\n options: StatusOptions\n): Promise<void> {\n const squad = loadSquad(squadName);\n\n if (!squad) {\n writeLine(`${colors.red}Squad \"${squadName}\" not found.${RESET}`);\n process.exit(1);\n }\n\n writeLine();\n writeLine(` ${gradient('squads')} ${colors.dim}status${RESET} ${colors.cyan}${squad.name}${RESET}`);\n writeLine();\n\n // Mission\n if (squad.mission) {\n writeLine(` ${colors.dim}${squad.mission}${RESET}`);\n writeLine();\n }\n\n // Agents table\n const agents = listAgents(squadsDir, squadName);\n const w = { name: 24, role: 36 };\n const tableWidth = w.name + w.role + 4;\n\n writeLine(` ${bold}Agents${RESET} ${colors.dim}(${agents.length})${RESET}`);\n writeLine();\n\n writeLine(` ${colors.purple}${box.topLeft}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.topRight}${RESET}`);\n\n for (const agent of agents) {\n const status = agent.status?.toLowerCase() === 'active'\n ? icons.active\n : icons.pending;\n\n const role = options.verbose && agent.role\n ? `${colors.dim}${agent.role.substring(0, w.role - 2)}${RESET}`\n : '';\n\n const row = ` ${colors.purple}${box.vertical}${RESET} ` +\n `${status} ${padEnd(agent.name, w.name - 2)}` +\n `${padEnd(role, w.role)}` +\n `${colors.purple}${box.vertical}${RESET}`;\n\n writeLine(row);\n }\n\n writeLine(` ${colors.purple}${box.bottomLeft}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.bottomRight}${RESET}`);\n\n // Pipelines\n if (squad.pipelines.length > 0) {\n writeLine();\n writeLine(` ${bold}Pipelines${RESET}`);\n for (const pipeline of squad.pipelines) {\n writeLine(` ${colors.dim}${pipeline.agents.join(' → ')}${RESET}`);\n }\n }\n\n // Memory state\n const memoryDir = findMemoryDir();\n if (memoryDir) {\n const states = getSquadState(squadName);\n\n if (states.length > 0) {\n writeLine();\n writeLine(` ${bold}Memory${RESET} ${colors.dim}(${states.length} ${states.length === 1 ? 'entry' : 'entries'})${RESET}`);\n writeLine();\n\n for (const state of states) {\n const updated = state.content.match(/Updated:\\s*(\\S+)/)?.[1] || 'unknown';\n writeLine(` ${icons.progress} ${colors.white}${state.agent}${RESET}`);\n writeLine(` ${colors.dim}└ updated: ${updated}${RESET}`);\n\n if (options.verbose) {\n const signalsMatch = state.content.match(/## Active Signals([\\s\\S]*?)(?=##|$)/);\n if (signalsMatch) {\n const signalLines = signalsMatch[1]\n .split('\\n')\n .filter(l => l.match(/^\\d+\\./))\n .slice(0, 3);\n\n for (const sig of signalLines) {\n writeLine(` ${colors.dim} ${sig.trim()}${RESET}`);\n }\n }\n }\n }\n }\n }\n\n writeLine();\n writeLine(` ${colors.dim}$${RESET} squads run ${colors.cyan}${squadName}${RESET} ${colors.dim}Run the squad${RESET}`);\n writeLine(` ${colors.dim}$${RESET} squads memory show ${colors.cyan}${squadName}${RESET} ${colors.dim}View full memory${RESET}`);\n writeLine(` ${colors.dim}$${RESET} squads status ${colors.cyan}${squadName}${RESET} -v ${colors.dim}Verbose status${RESET}`);\n writeLine();\n}\n","/**\n * Session tracking for active Claude Code sessions\n * Provides heartbeat-based session state management\n *\n * Storage:\n * - Active sessions: .agents/sessions/active/{id}.json (quick lookup)\n * - Event history: .agents/sessions/history.jsonl (analytics)\n */\n\nimport { existsSync, mkdirSync, readdirSync, readFileSync, writeFileSync, unlinkSync, appendFileSync, createReadStream } from 'fs';\nimport { join, dirname } from 'path';\nimport { randomBytes } from 'crypto';\nimport { createInterface } from 'readline';\nimport { execSync } from 'child_process';\n\nexport interface SessionState {\n sessionId: string;\n squad: string | null;\n startedAt: string;\n lastHeartbeat: string;\n cwd: string;\n pid: number;\n}\n\nexport interface SessionSummary {\n totalSessions: number;\n bySquad: Record<string, number>;\n squadCount: number;\n byTool?: Record<string, number>; // Optional: breakdown by AI tool\n}\n\n// Event types for JSONL history\nexport type SessionEventType = 'start' | 'heartbeat' | 'stop' | 'stale_cleanup';\n\nexport interface SessionEvent {\n type: SessionEventType;\n sessionId: string;\n squad: string | null;\n ts: string;\n cwd?: string;\n pid?: number;\n durationMs?: number; // For stop events\n}\n\nexport interface SessionHistoryStats {\n totalSessions: number;\n totalDurationMs: number;\n avgDurationMs: number;\n bySquad: Record<string, { count: number; durationMs: number }>;\n byDate: Record<string, number>; // YYYY-MM-DD -> count\n peakConcurrent: number;\n}\n\n// Live AI coding assistant process info\nexport interface AIProcess {\n pid: number;\n tty: string;\n cwd: string;\n squad: string | null;\n tool: string; // 'claude', 'cursor', 'aider', 'gemini', etc.\n}\n\n// Supported AI coding tools (process names to detect)\nconst AI_TOOL_PATTERNS: { pattern: RegExp; name: string }[] = [\n { pattern: /^claude$/, name: 'claude' },\n { pattern: /^cursor$/i, name: 'cursor' },\n { pattern: /^aider$/, name: 'aider' },\n { pattern: /^gemini$/i, name: 'gemini' },\n { pattern: /^copilot$/i, name: 'copilot' },\n { pattern: /^cody$/i, name: 'cody' },\n { pattern: /^continue$/i, name: 'continue' },\n];\n\n// Session is stale after 5 minutes without heartbeat\nconst STALE_THRESHOLD_MS = 5 * 60 * 1000;\n\n// History file name\nconst HISTORY_FILE = 'history.jsonl';\n\n// Active sessions subdirectory\nconst ACTIVE_DIR = 'active';\n\n// Directory mapping for squad detection\nconst SQUAD_DIR_MAP: Record<string, string> = {\n 'hq': 'company',\n 'agents-squads-web': 'website',\n 'company': 'company',\n 'product': 'product',\n 'engineering': 'engineering',\n 'research': 'research',\n 'intelligence': 'intelligence',\n 'customer': 'customer',\n 'finance': 'finance',\n 'marketing': 'marketing',\n};\n\n/**\n * Find the .agents directory (sessions live at .agents/sessions/)\n */\nexport function findAgentsDir(): string | null {\n let dir = process.cwd();\n\n for (let i = 0; i < 5; i++) {\n const agentsPath = join(dir, '.agents');\n if (existsSync(agentsPath)) {\n return agentsPath;\n }\n const parent = dirname(dir);\n if (parent === dir) break;\n dir = parent;\n }\n\n return null;\n}\n\n/**\n * Get the sessions base directory\n */\nexport function getSessionsBaseDir(): string | null {\n const agentsDir = findAgentsDir();\n if (!agentsDir) return null;\n\n const sessionsDir = join(agentsDir, 'sessions');\n if (!existsSync(sessionsDir)) {\n mkdirSync(sessionsDir, { recursive: true });\n }\n return sessionsDir;\n}\n\n/**\n * Get the active sessions directory, creating it if needed\n */\nexport function getSessionsDir(): string | null {\n const baseDir = getSessionsBaseDir();\n if (!baseDir) return null;\n\n const activeDir = join(baseDir, ACTIVE_DIR);\n if (!existsSync(activeDir)) {\n mkdirSync(activeDir, { recursive: true });\n }\n return activeDir;\n}\n\n/**\n * Get the history file path\n */\nexport function getHistoryFilePath(): string | null {\n const baseDir = getSessionsBaseDir();\n if (!baseDir) return null;\n return join(baseDir, HISTORY_FILE);\n}\n\n/**\n * Append an event to the history JSONL file\n */\nfunction appendEvent(event: SessionEvent): void {\n const historyPath = getHistoryFilePath();\n if (!historyPath) return;\n\n try {\n const line = JSON.stringify(event) + '\\n';\n appendFileSync(historyPath, line);\n } catch {\n // Silently fail - history is optional\n }\n}\n\n/**\n * Detect which squad based on current working directory\n */\nexport function detectSquad(cwd: string = process.cwd()): string | null {\n // Pattern: .../agents-squads/{domain}/...\n const match = cwd.match(/agents-squads\\/([^/]+)/);\n if (match) {\n const dir = match[1];\n return SQUAD_DIR_MAP[dir] || dir;\n }\n return null;\n}\n\n/**\n * Detect running AI coding assistant processes (real-time process detection)\n * Supports: Claude, Cursor, Aider, Gemini, Copilot, Cody, Continue\n */\nexport function detectAIProcesses(): AIProcess[] {\n const processes: AIProcess[] = [];\n\n try {\n // Get all processes - we'll filter for AI tools\n const psOutput = execSync('ps -eo pid,tty,comm 2>/dev/null', {\n encoding: 'utf-8',\n timeout: 5000,\n }).trim();\n\n if (!psOutput) return [];\n\n const lines = psOutput.split('\\n').filter(line => line.trim());\n\n for (const line of lines) {\n const parts = line.trim().split(/\\s+/);\n if (parts.length < 3) continue;\n\n const pid = parseInt(parts[0], 10);\n const tty = parts[1];\n const comm = parts.slice(2).join(' '); // Process name (may have spaces)\n\n if (isNaN(pid)) continue;\n\n // Check if this is an AI coding tool\n let toolName: string | null = null;\n for (const { pattern, name } of AI_TOOL_PATTERNS) {\n if (pattern.test(comm)) {\n toolName = name;\n break;\n }\n }\n\n if (!toolName) continue;\n\n // Get the working directory for this process\n let cwd = '';\n try {\n const lsofOutput = execSync(`lsof -p ${pid} 2>/dev/null | grep cwd | awk '{print $NF}'`, {\n encoding: 'utf-8',\n timeout: 3000,\n }).trim();\n cwd = lsofOutput || '';\n } catch {\n // Can't get cwd, use empty string\n cwd = '';\n }\n\n // Detect squad from working directory\n const squad = detectSquad(cwd);\n\n processes.push({\n pid,\n tty,\n cwd,\n squad,\n tool: toolName,\n });\n }\n } catch {\n // Process detection failed (command not found, timeout, etc.)\n // Return empty array - graceful degradation\n }\n\n return processes;\n}\n\n// Backwards compatibility alias\nexport const detectClaudeProcesses = detectAIProcesses;\n\n/**\n * Get live session summary using real process detection\n */\nexport function getLiveSessionSummary(): SessionSummary {\n const processes = detectAIProcesses();\n const bySquad: Record<string, number> = {};\n const byTool: Record<string, number> = {};\n\n for (const proc of processes) {\n const squad = proc.squad || 'unknown';\n bySquad[squad] = (bySquad[squad] || 0) + 1;\n byTool[proc.tool] = (byTool[proc.tool] || 0) + 1;\n }\n\n return {\n totalSessions: processes.length,\n bySquad,\n squadCount: Object.keys(bySquad).length,\n byTool,\n };\n}\n\n/**\n * Generate a unique session ID\n */\nfunction generateSessionId(): string {\n return randomBytes(8).toString('hex');\n}\n\n/**\n * Get current session ID from environment or generate new one\n */\nlet currentSessionId: string | null = null;\n\nexport function getSessionId(): string {\n if (currentSessionId) return currentSessionId;\n\n // Check if we have a session file for this PID\n const sessionsDir = getSessionsDir();\n if (sessionsDir) {\n const pid = process.pid;\n const files = readdirSync(sessionsDir).filter(f => f.endsWith('.json'));\n\n for (const file of files) {\n try {\n const content = readFileSync(join(sessionsDir, file), 'utf-8');\n const session = JSON.parse(content) as SessionState;\n if (session.pid === pid) {\n currentSessionId = session.sessionId;\n return currentSessionId;\n }\n } catch {\n // Ignore parse errors\n }\n }\n }\n\n // Generate new session ID\n currentSessionId = generateSessionId();\n return currentSessionId;\n}\n\n/**\n * Start a new session (write initial state file and log event)\n */\nexport function startSession(squad?: string): SessionState | null {\n const sessionsDir = getSessionsDir();\n if (!sessionsDir) return null;\n\n const sessionId = getSessionId();\n const now = new Date().toISOString();\n const cwd = process.cwd();\n const detectedSquad = squad || detectSquad(cwd);\n\n const session: SessionState = {\n sessionId,\n squad: detectedSquad,\n startedAt: now,\n lastHeartbeat: now,\n cwd,\n pid: process.pid,\n };\n\n const sessionPath = join(sessionsDir, `${sessionId}.json`);\n writeFileSync(sessionPath, JSON.stringify(session, null, 2));\n\n // Log start event to history\n appendEvent({\n type: 'start',\n sessionId,\n squad: detectedSquad,\n ts: now,\n cwd,\n pid: process.pid,\n });\n\n return session;\n}\n\n/**\n * Update heartbeat for current session\n */\nexport function updateHeartbeat(): boolean {\n const sessionsDir = getSessionsDir();\n if (!sessionsDir) return false;\n\n const sessionId = getSessionId();\n const sessionPath = join(sessionsDir, `${sessionId}.json`);\n\n if (!existsSync(sessionPath)) {\n // Session doesn't exist, start a new one\n startSession();\n return true;\n }\n\n try {\n const content = readFileSync(sessionPath, 'utf-8');\n const session = JSON.parse(content) as SessionState;\n session.lastHeartbeat = new Date().toISOString();\n writeFileSync(sessionPath, JSON.stringify(session, null, 2));\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Stop current session (remove state file and log event)\n */\nexport function stopSession(): boolean {\n const sessionsDir = getSessionsDir();\n if (!sessionsDir) return false;\n\n const sessionId = getSessionId();\n const sessionPath = join(sessionsDir, `${sessionId}.json`);\n\n if (existsSync(sessionPath)) {\n // Read session to get start time and squad for duration calculation\n let squad: string | null = null;\n let durationMs: number | undefined;\n\n try {\n const content = readFileSync(sessionPath, 'utf-8');\n const session = JSON.parse(content) as SessionState;\n squad = session.squad;\n durationMs = Date.now() - new Date(session.startedAt).getTime();\n } catch {\n // Ignore parse errors\n }\n\n unlinkSync(sessionPath);\n currentSessionId = null;\n\n // Log stop event to history\n appendEvent({\n type: 'stop',\n sessionId,\n squad,\n ts: new Date().toISOString(),\n durationMs,\n });\n\n return true;\n }\n\n return false;\n}\n\n/**\n * Get all active sessions (non-stale)\n */\nexport function getActiveSessions(): SessionState[] {\n const sessionsDir = getSessionsDir();\n if (!sessionsDir) return [];\n\n const now = Date.now();\n const sessions: SessionState[] = [];\n\n try {\n const files = readdirSync(sessionsDir).filter(f => f.endsWith('.json'));\n\n for (const file of files) {\n try {\n const filePath = join(sessionsDir, file);\n const content = readFileSync(filePath, 'utf-8');\n const session = JSON.parse(content) as SessionState;\n\n // Check if session is stale\n const lastHeartbeat = new Date(session.lastHeartbeat).getTime();\n if (now - lastHeartbeat < STALE_THRESHOLD_MS) {\n sessions.push(session);\n }\n } catch {\n // Ignore parse errors\n }\n }\n } catch {\n // Directory read error\n }\n\n return sessions;\n}\n\n/**\n * Get session summary for dashboard\n */\nexport function getSessionSummary(): SessionSummary {\n const sessions = getActiveSessions();\n const bySquad: Record<string, number> = {};\n\n for (const session of sessions) {\n const squad = session.squad || 'unknown';\n bySquad[squad] = (bySquad[squad] || 0) + 1;\n }\n\n return {\n totalSessions: sessions.length,\n bySquad,\n squadCount: Object.keys(bySquad).length,\n };\n}\n\n/**\n * Clean up stale sessions (older than threshold) and log events\n */\nexport function cleanupStaleSessions(): number {\n const sessionsDir = getSessionsDir();\n if (!sessionsDir) return 0;\n\n const now = Date.now();\n const nowIso = new Date().toISOString();\n let cleaned = 0;\n\n try {\n const files = readdirSync(sessionsDir).filter(f => f.endsWith('.json'));\n\n for (const file of files) {\n try {\n const filePath = join(sessionsDir, file);\n const content = readFileSync(filePath, 'utf-8');\n const session = JSON.parse(content) as SessionState;\n\n const lastHeartbeat = new Date(session.lastHeartbeat).getTime();\n if (now - lastHeartbeat >= STALE_THRESHOLD_MS) {\n const durationMs = now - new Date(session.startedAt).getTime();\n\n unlinkSync(filePath);\n cleaned++;\n\n // Log stale cleanup event\n appendEvent({\n type: 'stale_cleanup',\n sessionId: session.sessionId,\n squad: session.squad,\n ts: nowIso,\n durationMs,\n });\n }\n } catch {\n // If we can't parse, remove the file\n try {\n unlinkSync(join(sessionsDir, file));\n cleaned++;\n } catch {\n // Ignore\n }\n }\n }\n } catch {\n // Directory read error\n }\n\n return cleaned;\n}\n\n/**\n * Read all events from history file\n */\nexport async function readSessionHistory(options: {\n since?: Date;\n until?: Date;\n squad?: string;\n type?: SessionEventType;\n limit?: number;\n} = {}): Promise<SessionEvent[]> {\n const historyPath = getHistoryFilePath();\n if (!historyPath || !existsSync(historyPath)) return [];\n\n const events: SessionEvent[] = [];\n const sinceMs = options.since?.getTime() || 0;\n const untilMs = options.until?.getTime() || Date.now();\n\n return new Promise((resolve) => {\n const rl = createInterface({\n input: createReadStream(historyPath),\n crlfDelay: Infinity,\n });\n\n rl.on('line', (line) => {\n if (!line.trim()) return;\n\n try {\n const event = JSON.parse(line) as SessionEvent;\n const eventMs = new Date(event.ts).getTime();\n\n // Apply filters\n if (eventMs < sinceMs || eventMs > untilMs) return;\n if (options.squad && event.squad !== options.squad) return;\n if (options.type && event.type !== options.type) return;\n\n events.push(event);\n } catch {\n // Ignore parse errors\n }\n });\n\n rl.on('close', () => {\n // Apply limit (from end, most recent first)\n if (options.limit && events.length > options.limit) {\n resolve(events.slice(-options.limit));\n } else {\n resolve(events);\n }\n });\n\n rl.on('error', () => {\n resolve([]);\n });\n });\n}\n\n/**\n * Get session history statistics\n */\nexport async function getSessionHistoryStats(options: {\n since?: Date;\n until?: Date;\n squad?: string;\n} = {}): Promise<SessionHistoryStats> {\n const events = await readSessionHistory(options);\n\n const stats: SessionHistoryStats = {\n totalSessions: 0,\n totalDurationMs: 0,\n avgDurationMs: 0,\n bySquad: {},\n byDate: {},\n peakConcurrent: 0,\n };\n\n // Track active sessions for peak concurrent calculation\n const activeSessions = new Map<string, { squad: string | null; startTs: number }>();\n let currentConcurrent = 0;\n\n for (const event of events) {\n const squad = event.squad || 'unknown';\n const date = event.ts.split('T')[0]; // YYYY-MM-DD\n\n if (event.type === 'start') {\n stats.totalSessions++;\n stats.byDate[date] = (stats.byDate[date] || 0) + 1;\n\n if (!stats.bySquad[squad]) {\n stats.bySquad[squad] = { count: 0, durationMs: 0 };\n }\n stats.bySquad[squad].count++;\n\n // Track for concurrent calculation\n activeSessions.set(event.sessionId, {\n squad: event.squad,\n startTs: new Date(event.ts).getTime(),\n });\n currentConcurrent++;\n stats.peakConcurrent = Math.max(stats.peakConcurrent, currentConcurrent);\n }\n\n if (event.type === 'stop' || event.type === 'stale_cleanup') {\n const duration = event.durationMs || 0;\n stats.totalDurationMs += duration;\n\n if (stats.bySquad[squad]) {\n stats.bySquad[squad].durationMs += duration;\n }\n\n // Remove from concurrent tracking\n if (activeSessions.has(event.sessionId)) {\n activeSessions.delete(event.sessionId);\n currentConcurrent = Math.max(0, currentConcurrent - 1);\n }\n }\n }\n\n // Calculate average duration\n const completedSessions = events.filter(e => e.type === 'stop' || e.type === 'stale_cleanup').length;\n if (completedSessions > 0) {\n stats.avgDurationMs = Math.round(stats.totalDurationMs / completedSessions);\n }\n\n return stats;\n}\n\n/**\n * Get recent session events (for display)\n */\nexport async function getRecentSessions(limit: number = 20): Promise<SessionEvent[]> {\n const events = await readSessionHistory({ limit: limit * 3 }); // Get more to filter\n\n // Group by session and get start/stop pairs\n const sessionEvents = new Map<string, SessionEvent[]>();\n for (const event of events) {\n if (!sessionEvents.has(event.sessionId)) {\n sessionEvents.set(event.sessionId, []);\n }\n sessionEvents.get(event.sessionId)!.push(event);\n }\n\n // Get the most recent start events\n const startEvents = events\n .filter(e => e.type === 'start')\n .slice(-limit);\n\n return startEvents.reverse(); // Most recent first\n}\n","/**\n * Update checker for squads-cli\n * Checks npm registry for newer versions and caches result\n */\n\nimport { existsSync, readFileSync, writeFileSync, mkdirSync, unlinkSync } from 'fs';\nimport { join, dirname } from 'path';\nimport { homedir } from 'os';\nimport { execSync } from 'child_process';\nimport { fileURLToPath } from 'url';\n\n// Get current version from package.json\nfunction getPackageVersion(): string {\n try {\n // Try to find package.json relative to this module\n const __filename = fileURLToPath(import.meta.url);\n const __dirname = dirname(__filename);\n\n // Look up from dist/lib to find package.json\n const possiblePaths = [\n join(__dirname, '..', '..', 'package.json'), // From dist/lib/\n join(__dirname, '..', 'package.json'), // From dist/\n join(__dirname, 'package.json'), // Same dir\n ];\n\n for (const pkgPath of possiblePaths) {\n if (existsSync(pkgPath)) {\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'));\n return pkg.version || '0.0.0';\n }\n }\n } catch {\n // Ignore errors\n }\n return '0.0.0';\n}\n\nconst CURRENT_VERSION = getPackageVersion();\n\n// Cache settings\nconst CACHE_DIR = join(homedir(), '.squads');\nconst CACHE_FILE = join(CACHE_DIR, 'update-check.json');\nconst CACHE_TTL_MS = 24 * 60 * 60 * 1000; // 24 hours\n\ninterface UpdateCache {\n latestVersion: string;\n checkedAt: number;\n}\n\nexport interface UpdateInfo {\n currentVersion: string;\n latestVersion: string;\n updateAvailable: boolean;\n}\n\n/**\n * Compare semantic versions\n * Returns true if v2 > v1\n */\nfunction isNewerVersion(v1: string, v2: string): boolean {\n const parts1 = v1.replace(/^v/, '').split('.').map(Number);\n const parts2 = v2.replace(/^v/, '').split('.').map(Number);\n\n for (let i = 0; i < 3; i++) {\n const p1 = parts1[i] || 0;\n const p2 = parts2[i] || 0;\n if (p2 > p1) return true;\n if (p2 < p1) return false;\n }\n return false;\n}\n\n/**\n * Read cached update info\n */\nfunction readCache(): UpdateCache | null {\n try {\n if (!existsSync(CACHE_FILE)) return null;\n const data = JSON.parse(readFileSync(CACHE_FILE, 'utf-8'));\n return data as UpdateCache;\n } catch {\n return null;\n }\n}\n\n/**\n * Write update info to cache\n */\nfunction writeCache(latestVersion: string): void {\n try {\n if (!existsSync(CACHE_DIR)) {\n mkdirSync(CACHE_DIR, { recursive: true });\n }\n const cache: UpdateCache = {\n latestVersion,\n checkedAt: Date.now(),\n };\n writeFileSync(CACHE_FILE, JSON.stringify(cache, null, 2));\n } catch {\n // Ignore cache write errors\n }\n}\n\n/**\n * Fetch latest version from npm registry\n */\nfunction fetchLatestVersion(): string | null {\n try {\n const result = execSync('npm view squads-cli version 2>/dev/null', {\n encoding: 'utf-8',\n timeout: 5000,\n }).trim();\n return result || null;\n } catch {\n return null;\n }\n}\n\n/**\n * Check for updates (uses cache to avoid frequent npm calls)\n */\nexport function checkForUpdate(): UpdateInfo {\n const result: UpdateInfo = {\n currentVersion: CURRENT_VERSION,\n latestVersion: CURRENT_VERSION,\n updateAvailable: false,\n };\n\n // Check cache first\n const cache = readCache();\n const now = Date.now();\n\n if (cache && (now - cache.checkedAt) < CACHE_TTL_MS) {\n // Use cached value\n result.latestVersion = cache.latestVersion;\n result.updateAvailable = isNewerVersion(CURRENT_VERSION, cache.latestVersion);\n return result;\n }\n\n // Fetch from npm (async-ish via cache)\n const latestVersion = fetchLatestVersion();\n\n if (latestVersion) {\n writeCache(latestVersion);\n result.latestVersion = latestVersion;\n result.updateAvailable = isNewerVersion(CURRENT_VERSION, latestVersion);\n } else if (cache) {\n // Use stale cache if fetch fails\n result.latestVersion = cache.latestVersion;\n result.updateAvailable = isNewerVersion(CURRENT_VERSION, cache.latestVersion);\n }\n\n return result;\n}\n\n/**\n * Get current version\n */\nexport function getCurrentVersion(): string {\n return CURRENT_VERSION;\n}\n\n/**\n * Perform the actual update via npm\n * Returns true if successful\n */\nexport function performUpdate(): { success: boolean; error?: string } {\n try {\n execSync('npm update -g squads-cli', {\n encoding: 'utf-8',\n stdio: 'inherit',\n timeout: 120000, // 2 minutes\n });\n // Clear cache so next check fetches fresh\n try {\n unlinkSync(CACHE_FILE);\n } catch {\n // Ignore\n }\n return { success: true };\n } catch (err) {\n return {\n success: false,\n error: err instanceof Error ? err.message : 'Unknown error',\n };\n }\n}\n\n/**\n * Force refresh the version cache (bypass TTL)\n */\nexport function refreshVersionCache(): UpdateInfo {\n const latestVersion = fetchLatestVersion();\n if (latestVersion) {\n writeCache(latestVersion);\n return {\n currentVersion: CURRENT_VERSION,\n latestVersion,\n updateAvailable: isNewerVersion(CURRENT_VERSION, latestVersion),\n };\n }\n return checkForUpdate();\n}\n","import {\n findMemoryDir,\n searchMemory,\n getSquadState,\n appendToMemory,\n listMemoryEntries\n} from '../lib/memory.js';\nimport {\n colors,\n bold,\n RESET,\n gradient,\n box,\n padEnd,\n truncate,\n icons,\n writeLine,\n} from '../lib/terminal.js';\n\nconst SQUADS_BRIDGE_URL = process.env.SQUADS_BRIDGE_URL || 'http://localhost:8088';\n\ninterface MemoryOptions {\n squad?: string;\n agent?: string;\n type?: string;\n}\n\nexport async function memoryQueryCommand(\n query: string,\n options: MemoryOptions\n): Promise<void> {\n const memoryDir = findMemoryDir();\n\n if (!memoryDir) {\n writeLine(` ${colors.red}No .agents/memory directory found${RESET}`);\n writeLine(` ${colors.dim}Run \\`squads init\\` to create one.${RESET}`);\n process.exit(1);\n }\n\n writeLine();\n writeLine(` ${gradient('squads')} ${colors.dim}memory query${RESET} \"${colors.cyan}${query}${RESET}\"`);\n writeLine();\n\n const results = searchMemory(query, memoryDir);\n\n if (results.length === 0) {\n writeLine(` ${colors.yellow}No results found.${RESET}`);\n writeLine();\n return;\n }\n\n // Filter by squad/agent if specified\n let filtered = results;\n if (options.squad) {\n filtered = filtered.filter(r => r.entry.squad === options.squad);\n }\n if (options.agent) {\n filtered = filtered.filter(r => r.entry.agent === options.agent);\n }\n\n writeLine(` ${colors.green}${filtered.length}${RESET} results found`);\n writeLine();\n\n // Table\n const w = { location: 28, type: 10, score: 8 };\n const tableWidth = w.location + w.type + w.score + 4;\n\n writeLine(` ${colors.purple}${box.topLeft}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.topRight}${RESET}`);\n\n const header = ` ${colors.purple}${box.vertical}${RESET} ` +\n `${bold}${padEnd('LOCATION', w.location)}${RESET}` +\n `${bold}${padEnd('TYPE', w.type)}${RESET}` +\n `${bold}SCORE${RESET}` +\n ` ${colors.purple}${box.vertical}${RESET}`;\n writeLine(header);\n\n writeLine(` ${colors.purple}${box.teeRight}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.teeLeft}${RESET}`);\n\n for (const result of filtered.slice(0, 8)) {\n const { entry, score } = result;\n const location = `${entry.squad}/${entry.agent}`;\n const scoreColor = score > 5 ? colors.green : score > 2 ? colors.yellow : colors.dim;\n\n const row = ` ${colors.purple}${box.vertical}${RESET} ` +\n `${colors.cyan}${padEnd(location, w.location)}${RESET}` +\n `${colors.dim}${padEnd(entry.type, w.type)}${RESET}` +\n `${scoreColor}${padEnd(score.toFixed(1), w.score)}${RESET}` +\n `${colors.purple}${box.vertical}${RESET}`;\n\n writeLine(row);\n }\n\n writeLine(` ${colors.purple}${box.bottomLeft}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.bottomRight}${RESET}`);\n writeLine();\n\n // Show matches\n writeLine(` ${bold}Matches${RESET}`);\n writeLine();\n\n for (const result of filtered.slice(0, 5)) {\n const { entry, matches } = result;\n\n for (const match of matches.slice(0, 2)) {\n const highlighted = match.replace(\n new RegExp(query, 'gi'),\n (m) => `${colors.yellow}${m}${RESET}`\n );\n writeLine(` ${icons.empty} ${truncate(highlighted, 60)}`);\n writeLine(` ${colors.dim}└ ${entry.squad}/${entry.agent}${RESET}`);\n }\n }\n\n if (filtered.length > 5) {\n writeLine(` ${colors.dim} +${filtered.length - 5} more results${RESET}`);\n }\n writeLine();\n\n // Commands\n writeLine(` ${colors.dim}$${RESET} squads memory show ${colors.cyan}<squad>${RESET} ${colors.dim}View full memory${RESET}`);\n writeLine();\n}\n\nexport async function memoryShowCommand(\n squadName: string,\n _options: MemoryOptions\n): Promise<void> {\n const memoryDir = findMemoryDir();\n\n if (!memoryDir) {\n writeLine(` ${colors.red}No .agents/memory directory found${RESET}`);\n process.exit(1);\n }\n\n const states = getSquadState(squadName);\n\n if (states.length === 0) {\n writeLine(` ${colors.yellow}No memory found for squad: ${squadName}${RESET}`);\n return;\n }\n\n writeLine();\n writeLine(` ${gradient('squads')} ${colors.dim}memory${RESET} ${colors.cyan}${squadName}${RESET}`);\n writeLine();\n\n writeLine(` ${colors.dim}${states.length} entries${RESET}`);\n writeLine();\n\n for (const state of states) {\n writeLine(` ${icons.progress} ${colors.white}${state.agent}${RESET} ${colors.dim}(${state.type || 'state'})${RESET}`);\n writeLine(` ${colors.dim}${box.horizontal.repeat(40)}${RESET}`);\n\n // Show preview\n const lines = state.content.split('\\n').slice(0, 12);\n for (const line of lines) {\n writeLine(` ${colors.dim}${truncate(line, 70)}${RESET}`);\n }\n\n if (state.content.split('\\n').length > 12) {\n writeLine(` ${colors.dim}... (more content)${RESET}`);\n }\n writeLine();\n }\n\n // Commands\n writeLine(` ${colors.dim}$${RESET} squads memory query ${colors.cyan}\"<term>\"${RESET} ${colors.dim}Search memory${RESET}`);\n writeLine();\n}\n\nexport async function memoryUpdateCommand(\n squadName: string,\n content: string,\n options: MemoryOptions\n): Promise<void> {\n const agentName = options.agent || `${squadName}-lead`;\n const type = (options.type || 'learnings') as 'state' | 'output' | 'learnings' | 'feedback';\n\n writeLine();\n\n try {\n appendToMemory(squadName, agentName, type, content);\n writeLine(` ${icons.success} Updated ${colors.cyan}${type}${RESET} for ${colors.white}${squadName}/${agentName}${RESET}`);\n } catch (error) {\n writeLine(` ${icons.error} ${colors.red}Failed to update memory: ${error}${RESET}`);\n process.exit(1);\n }\n\n writeLine();\n}\n\nexport async function memoryListCommand(): Promise<void> {\n const memoryDir = findMemoryDir();\n\n if (!memoryDir) {\n writeLine(` ${colors.red}No .agents/memory directory found${RESET}`);\n process.exit(1);\n }\n\n const entries = listMemoryEntries(memoryDir);\n\n // Group by squad\n const bySquad: Record<string, typeof entries> = {};\n for (const entry of entries) {\n if (!bySquad[entry.squad]) {\n bySquad[entry.squad] = [];\n }\n bySquad[entry.squad].push(entry);\n }\n\n writeLine();\n writeLine(` ${gradient('squads')} ${colors.dim}memory list${RESET}`);\n writeLine();\n\n const squadNames = Object.keys(bySquad);\n writeLine(` ${colors.cyan}${entries.length}${RESET} entries across ${squadNames.length} squads`);\n writeLine();\n\n // Table\n const w = { squad: 16, agents: 8, types: 28 };\n const tableWidth = w.squad + w.agents + w.types + 4;\n\n writeLine(` ${colors.purple}${box.topLeft}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.topRight}${RESET}`);\n\n const header = ` ${colors.purple}${box.vertical}${RESET} ` +\n `${bold}${padEnd('SQUAD', w.squad)}${RESET}` +\n `${bold}${padEnd('AGENTS', w.agents)}${RESET}` +\n `${bold}TYPES${RESET}` +\n ` ${colors.purple}${box.vertical}${RESET}`;\n writeLine(header);\n\n writeLine(` ${colors.purple}${box.teeRight}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.teeLeft}${RESET}`);\n\n for (const [squad, squadEntries] of Object.entries(bySquad)) {\n const agents = new Set(squadEntries.map(e => e.agent));\n const types = [...new Set(squadEntries.map(e => e.type))].join(', ');\n const typesDisplay = truncate(types, w.types - 2);\n\n const row = ` ${colors.purple}${box.vertical}${RESET} ` +\n `${colors.cyan}${padEnd(squad, w.squad)}${RESET}` +\n `${padEnd(String(agents.size), w.agents)}` +\n `${colors.dim}${padEnd(typesDisplay, w.types)}${RESET}` +\n `${colors.purple}${box.vertical}${RESET}`;\n\n writeLine(row);\n }\n\n writeLine(` ${colors.purple}${box.bottomLeft}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.bottomRight}${RESET}`);\n writeLine();\n\n // Commands\n writeLine(` ${colors.dim}$${RESET} squads memory show ${colors.cyan}<squad>${RESET} ${colors.dim}View squad memory${RESET}`);\n writeLine(` ${colors.dim}$${RESET} squads memory query ${colors.cyan}\"<term>\"${RESET} ${colors.dim}Search all memory${RESET}`);\n writeLine();\n}\n\ninterface ConversationResult {\n id: number;\n session_id: string;\n role: string;\n content: string;\n type: string; // message_type in the API response\n importance: string;\n created_at: string;\n rank: number;\n}\n\nexport async function memorySearchCommand(\n query: string,\n options: { limit?: number; role?: string; importance?: string } = {}\n): Promise<void> {\n writeLine();\n writeLine(` ${gradient('squads')} ${colors.dim}memory search${RESET} \"${colors.cyan}${query}${RESET}\"`);\n writeLine();\n\n const limit = options.limit || 10;\n const params = new URLSearchParams({ q: query, limit: String(limit) });\n\n if (options.role) {\n params.append('role', options.role);\n }\n if (options.importance) {\n params.append('importance', options.importance);\n }\n\n try {\n const response = await fetch(`${SQUADS_BRIDGE_URL}/api/conversations/search?${params}`);\n\n if (!response.ok) {\n if (response.status === 503) {\n writeLine(` ${colors.yellow}Database not available${RESET}`);\n writeLine(` ${colors.dim}Run: docker compose up -d${RESET}`);\n writeLine();\n return;\n }\n throw new Error(`HTTP ${response.status}`);\n }\n\n const data = await response.json() as { results: ConversationResult[]; count: number };\n const conversations = data.results;\n const total = data.count;\n\n if (conversations.length === 0) {\n writeLine(` ${colors.yellow}No conversations found for \"${query}\"${RESET}`);\n writeLine();\n writeLine(` ${colors.dim}Conversations are captured via hooks. Make sure:${RESET}`);\n writeLine(` ${colors.dim} 1. squads-bridge is running (docker compose up)${RESET}`);\n writeLine(` ${colors.dim} 2. engram hook is configured in Claude settings${RESET}`);\n writeLine();\n return;\n }\n\n writeLine(` ${colors.green}${conversations.length}${RESET} of ${total} results`);\n writeLine();\n\n // Table\n const w = { time: 12, role: 10, type: 10, content: 50 };\n const tableWidth = w.time + w.role + w.type + w.content + 6;\n\n writeLine(` ${colors.purple}${box.topLeft}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.topRight}${RESET}`);\n\n const header = ` ${colors.purple}${box.vertical}${RESET} ` +\n `${bold}${padEnd('TIME', w.time)}${RESET}` +\n `${bold}${padEnd('ROLE', w.role)}${RESET}` +\n `${bold}${padEnd('TYPE', w.type)}${RESET}` +\n `${bold}${padEnd('CONTENT', w.content)}${RESET}` +\n ` ${colors.purple}${box.vertical}${RESET}`;\n writeLine(header);\n\n writeLine(` ${colors.purple}${box.teeRight}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.teeLeft}${RESET}`);\n\n for (const conv of conversations) {\n const time = new Date(conv.created_at).toLocaleTimeString('en-US', { hour: '2-digit', minute: '2-digit' });\n const roleColor = conv.role === 'user' ? colors.cyan : conv.role === 'thinking' ? colors.yellow : colors.green;\n const importanceIcon = conv.importance === 'high' ? icons.success : '';\n\n // Highlight search term in content\n const contentPreview = truncate((conv.content || '').replace(/\\n/g, ' '), w.content - 2);\n const highlighted = contentPreview.replace(\n new RegExp(query, 'gi'),\n (m) => `${colors.yellow}${m}${RESET}${colors.dim}`\n );\n\n const row = ` ${colors.purple}${box.vertical}${RESET} ` +\n `${colors.dim}${padEnd(time, w.time)}${RESET}` +\n `${roleColor}${padEnd(conv.role || '', w.role)}${RESET}` +\n `${colors.dim}${padEnd(conv.type || 'message', w.type)}${RESET}` +\n `${colors.dim}${padEnd(highlighted + importanceIcon, w.content)}${RESET}` +\n ` ${colors.purple}${box.vertical}${RESET}`;\n\n writeLine(row);\n }\n\n writeLine(` ${colors.purple}${box.bottomLeft}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.bottomRight}${RESET}`);\n writeLine();\n\n // Expanded view of top results\n writeLine(` ${bold}Top Matches${RESET}`);\n writeLine();\n\n for (const conv of conversations.slice(0, 3)) {\n const time = new Date(conv.created_at).toLocaleString('en-US', {\n month: 'short', day: 'numeric', hour: '2-digit', minute: '2-digit'\n });\n const roleIcon = conv.role === 'user' ? '👤' : conv.role === 'thinking' ? '💭' : '🤖';\n\n writeLine(` ${roleIcon} ${colors.dim}${time}${RESET} ${conv.importance === 'high' ? colors.yellow + '[high]' + RESET : ''}`);\n\n // Show first 200 chars with highlighted search term\n const content = conv.content || '';\n const preview = content.substring(0, 200).replace(/\\n/g, ' ');\n const highlighted = preview.replace(\n new RegExp(query, 'gi'),\n (m) => `${colors.yellow}${m}${RESET}`\n );\n writeLine(` ${highlighted}${content.length > 200 ? '...' : ''}`);\n writeLine();\n }\n\n // Commands\n writeLine(` ${colors.dim}$${RESET} squads memory search ${colors.cyan}\"<term>\"${RESET} --role user ${colors.dim}Filter by role${RESET}`);\n writeLine(` ${colors.dim}$${RESET} squads memory search ${colors.cyan}\"<term>\"${RESET} --importance high ${colors.dim}Filter by importance${RESET}`);\n writeLine();\n\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n if (errorMessage.includes('ECONNREFUSED')) {\n writeLine(` ${colors.yellow}Cannot connect to squads-bridge${RESET}`);\n writeLine(` ${colors.dim}Run: docker compose up -d${RESET}`);\n } else {\n writeLine(` ${colors.red}Error searching conversations: ${errorMessage}${RESET}`);\n }\n writeLine();\n }\n}\n","import { execSync } from 'child_process';\nimport { existsSync, readFileSync, writeFileSync, mkdirSync, readdirSync } from 'fs';\nimport { join, dirname } from 'path';\nimport { findMemoryDir } from '../lib/memory.js';\nimport { findSquadsDir, listSquads } from '../lib/squad-parser.js';\nimport {\n colors,\n bold,\n RESET,\n gradient,\n icons,\n writeLine,\n} from '../lib/terminal.js';\n\ninterface CommitInfo {\n hash: string;\n date: string;\n message: string;\n files: string[];\n}\n\ninterface SquadUpdate {\n squad: string;\n commits: CommitInfo[];\n summary: string;\n}\n\n// Map file paths to squads\nconst PATH_TO_SQUAD: Record<string, string> = {\n 'squads-cli': 'product',\n 'agents-squads-web': 'website',\n 'research': 'research',\n 'intelligence': 'intelligence',\n 'customer': 'customer',\n 'finance': 'finance',\n 'engineering': 'engineering',\n 'product': 'product',\n 'company': 'company',\n '.agents/squads': 'engineering',\n '.agents/memory': 'engineering',\n};\n\n// Keywords in commit messages that map to squads\nconst MESSAGE_TO_SQUAD: Record<string, string> = {\n 'cli': 'product',\n 'website': 'website',\n 'web': 'website',\n 'homepage': 'website',\n 'research': 'research',\n 'intel': 'intelligence',\n 'lead': 'customer',\n 'finance': 'finance',\n 'cost': 'finance',\n 'engineering': 'engineering',\n 'infra': 'engineering',\n};\n\nfunction getLastSyncTime(memoryDir: string): string | null {\n const syncFile = join(memoryDir, '.last-sync');\n if (existsSync(syncFile)) {\n return readFileSync(syncFile, 'utf-8').trim();\n }\n return null;\n}\n\nfunction updateLastSyncTime(memoryDir: string): void {\n const syncFile = join(memoryDir, '.last-sync');\n writeFileSync(syncFile, new Date().toISOString());\n}\n\nfunction getRecentCommits(since?: string): CommitInfo[] {\n const commits: CommitInfo[] = [];\n\n try {\n // Get commits with files changed\n const sinceArg = since ? `--since=\"${since}\"` : '-n 20';\n const logOutput = execSync(\n `git log ${sinceArg} --format=\"%H|%aI|%s\" --name-only`,\n { encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] }\n ).trim();\n\n if (!logOutput) return commits;\n\n // Parse git log output\n const entries = logOutput.split('\\n\\n');\n for (const entry of entries) {\n const lines = entry.split('\\n').filter(l => l.trim());\n if (lines.length === 0) continue;\n\n const [header, ...fileLines] = lines;\n const [hash, date, ...messageParts] = header.split('|');\n const message = messageParts.join('|');\n\n if (hash && date && message) {\n commits.push({\n hash: hash.substring(0, 7),\n date: date.split('T')[0],\n message,\n files: fileLines.filter(f => f && !f.includes('|')),\n });\n }\n }\n } catch (error) {\n // Not in a git repo or other error\n }\n\n return commits;\n}\n\nfunction detectSquadsFromCommit(commit: CommitInfo): string[] {\n const squads = new Set<string>();\n\n // Check file paths\n for (const file of commit.files) {\n for (const [pathPattern, squad] of Object.entries(PATH_TO_SQUAD)) {\n if (file.includes(pathPattern)) {\n squads.add(squad);\n }\n }\n }\n\n // Check commit message\n const msgLower = commit.message.toLowerCase();\n for (const [keyword, squad] of Object.entries(MESSAGE_TO_SQUAD)) {\n if (msgLower.includes(keyword)) {\n squads.add(squad);\n }\n }\n\n return Array.from(squads);\n}\n\nfunction groupCommitsBySquad(commits: CommitInfo[]): Map<string, CommitInfo[]> {\n const grouped = new Map<string, CommitInfo[]>();\n\n for (const commit of commits) {\n const squads = detectSquadsFromCommit(commit);\n\n for (const squad of squads) {\n if (!grouped.has(squad)) {\n grouped.set(squad, []);\n }\n grouped.get(squad)!.push(commit);\n }\n }\n\n return grouped;\n}\n\nfunction generateSummary(commits: CommitInfo[]): string {\n if (commits.length === 0) return '';\n\n const messages = commits.map(c => `- ${c.message}`).join('\\n');\n const date = new Date().toISOString().split('T')[0];\n\n return `\n## Session Update (${date})\n\n${messages}\n`;\n}\n\nfunction appendToSquadMemory(\n memoryDir: string,\n squad: string,\n summary: string\n): boolean {\n // Find the lead agent for this squad\n const squadMemoryDir = join(memoryDir, squad);\n\n if (!existsSync(squadMemoryDir)) {\n mkdirSync(squadMemoryDir, { recursive: true });\n }\n\n // Look for existing agent directories or create default\n let agentDir: string;\n const existingDirs = existsSync(squadMemoryDir)\n ? readdirSync(squadMemoryDir, { withFileTypes: true })\n .filter((d) => d.isDirectory())\n .map((d) => d.name)\n : [];\n\n if (existingDirs.length > 0) {\n // Use first existing agent (usually the lead)\n agentDir = join(squadMemoryDir, existingDirs[0]);\n } else {\n // Create default agent directory\n agentDir = join(squadMemoryDir, `${squad}-lead`);\n mkdirSync(agentDir, { recursive: true });\n }\n\n const statePath = join(agentDir, 'state.md');\n\n let content = '';\n if (existsSync(statePath)) {\n content = readFileSync(statePath, 'utf-8');\n } else {\n content = `# ${squad} Squad - State\\n\\nUpdated: ${new Date().toISOString().split('T')[0]}\\n`;\n }\n\n // Update the \"Updated\" line\n content = content.replace(\n /Updated:\\s*\\d{4}-\\d{2}-\\d{2}/,\n `Updated: ${new Date().toISOString().split('T')[0]}`\n );\n\n // Append the summary\n content += summary;\n\n writeFileSync(statePath, content);\n return true;\n}\n\n/**\n * Pull latest memory changes from git remote\n */\nfunction gitPullMemory(): { success: boolean; output: string; behind: number; ahead: number } {\n try {\n // First fetch to see what's different\n execSync('git fetch origin', { encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] });\n\n // Check how many commits behind/ahead\n const status = execSync('git status -sb', { encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] });\n const behindMatch = status.match(/behind (\\d+)/);\n const aheadMatch = status.match(/ahead (\\d+)/);\n const behind = behindMatch ? parseInt(behindMatch[1]) : 0;\n const ahead = aheadMatch ? parseInt(aheadMatch[1]) : 0;\n\n if (behind === 0) {\n return { success: true, output: 'Already up to date', behind: 0, ahead };\n }\n\n // Pull with rebase to get latest\n const output = execSync('git pull --rebase origin main', {\n encoding: 'utf-8',\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n\n return { success: true, output: output.trim(), behind, ahead };\n } catch (error) {\n const err = error as { message?: string };\n return { success: false, output: err.message || 'Pull failed', behind: 0, ahead: 0 };\n }\n}\n\n/**\n * Push local memory changes to git remote\n */\nfunction gitPushMemory(): { success: boolean; output: string } {\n try {\n // Check if there are uncommitted changes in memory\n const status = execSync('git status --porcelain .agents/memory/', {\n encoding: 'utf-8',\n stdio: ['pipe', 'pipe', 'pipe'],\n }).trim();\n\n if (status) {\n // Stage and commit memory changes\n execSync('git add .agents/memory/', { stdio: ['pipe', 'pipe', 'pipe'] });\n execSync('git commit -m \"chore: sync squad memory\"', {\n encoding: 'utf-8',\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n }\n\n // Push to remote\n const output = execSync('git push origin main', {\n encoding: 'utf-8',\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n\n return { success: true, output: output.trim() || 'Pushed successfully' };\n } catch (error) {\n const err = error as { message?: string };\n return { success: false, output: err.message || 'Push failed' };\n }\n}\n\nexport async function syncCommand(options: { verbose?: boolean; push?: boolean; pull?: boolean } = {}): Promise<void> {\n const memoryDir = findMemoryDir();\n const squadsDir = findSquadsDir();\n\n if (!memoryDir) {\n writeLine(` ${colors.yellow}No .agents/memory directory found${RESET}`);\n writeLine(` ${colors.dim}Run \\`squads init\\` to create one.${RESET}`);\n return; // Graceful exit - don't fail hooks\n }\n\n writeLine();\n writeLine(` ${gradient('squads')} ${colors.dim}memory sync${RESET}`);\n writeLine();\n\n // Default behavior: pull from remote\n const doPull = options.pull !== false; // Pull by default unless explicitly disabled\n const doPush = options.push === true; // Only push if explicitly requested\n\n // Step 1: Pull from git remote\n if (doPull) {\n writeLine(` ${icons.progress} Pulling from remote...`);\n const pullResult = gitPullMemory();\n\n if (pullResult.success) {\n if (pullResult.behind > 0) {\n writeLine(` ${icons.success} Pulled ${colors.cyan}${pullResult.behind}${RESET} commits from remote`);\n } else {\n writeLine(` ${icons.success} ${colors.dim}Already up to date${RESET}`);\n }\n if (pullResult.ahead > 0) {\n writeLine(` ${colors.dim} ${pullResult.ahead} local commits to push${RESET}`);\n }\n } else {\n writeLine(` ${icons.error} ${colors.red}Pull failed: ${pullResult.output}${RESET}`);\n }\n writeLine();\n }\n\n // Get last sync time\n const lastSync = getLastSyncTime(memoryDir);\n if (lastSync) {\n writeLine(` ${colors.dim}Last sync: ${lastSync.split('T')[0]}${RESET}`);\n } else {\n writeLine(` ${colors.dim}First sync${RESET}`);\n }\n writeLine();\n\n // Get recent commits\n const commits = getRecentCommits(lastSync || undefined);\n\n if (commits.length === 0) {\n writeLine(` ${colors.yellow}No new commits since last sync${RESET}`);\n writeLine();\n return;\n }\n\n writeLine(` ${colors.cyan}${commits.length}${RESET} commits to process`);\n writeLine();\n\n // Group by squad\n const bySquad = groupCommitsBySquad(commits);\n\n if (bySquad.size === 0) {\n writeLine(` ${colors.yellow}No squad-related commits found${RESET}`);\n writeLine();\n updateLastSyncTime(memoryDir);\n return;\n }\n\n // Update each squad's memory\n let updated = 0;\n for (const [squad, squadCommits] of bySquad) {\n const summary = generateSummary(squadCommits);\n\n if (options.verbose) {\n writeLine(` ${icons.progress} ${colors.cyan}${squad}${RESET}`);\n for (const commit of squadCommits) {\n writeLine(` ${colors.dim}${commit.hash} ${commit.message}${RESET}`);\n }\n }\n\n const success = appendToSquadMemory(memoryDir, squad, summary);\n if (success) {\n writeLine(` ${icons.success} ${colors.cyan}${squad}${RESET} ${colors.dim}(${squadCommits.length} commits)${RESET}`);\n updated++;\n }\n }\n\n writeLine();\n writeLine(` ${colors.green}${updated}${RESET} squad memories updated`);\n writeLine();\n\n // Update last sync time\n updateLastSyncTime(memoryDir);\n\n // Step 3: Push to remote if requested\n if (doPush) {\n writeLine(` ${icons.progress} Pushing to remote...`);\n const pushResult = gitPushMemory();\n\n if (pushResult.success) {\n writeLine(` ${icons.success} ${colors.green}Pushed memory updates to remote${RESET}`);\n } else {\n writeLine(` ${icons.error} ${colors.red}Push failed: ${pushResult.output}${RESET}`);\n }\n writeLine();\n }\n\n // Show helpful commands\n writeLine(` ${colors.dim}$${RESET} squads memory show ${colors.cyan}<squad>${RESET} ${colors.dim}View updated memory${RESET}`);\n writeLine(` ${colors.dim}$${RESET} squads status ${colors.dim}See all squads${RESET}`);\n if (!doPush && updated > 0) {\n writeLine(` ${colors.dim}$${RESET} squads memory sync --push ${colors.dim}Push changes to remote${RESET}`);\n }\n writeLine();\n}\n","import {\n loadSquad,\n findSquadsDir,\n listSquads,\n addGoalToSquad,\n updateGoalInSquad,\n Goal\n} from '../lib/squad-parser.js';\nimport {\n colors,\n bold,\n RESET,\n gradient,\n box,\n padEnd,\n truncate,\n icons,\n writeLine,\n} from '../lib/terminal.js';\n\nexport async function goalSetCommand(\n squadName: string,\n description: string,\n options: { metric?: string[] }\n): Promise<void> {\n const squad = loadSquad(squadName);\n if (!squad) {\n writeLine(` ${colors.red}Squad \"${squadName}\" not found${RESET}`);\n return;\n }\n\n // Add metric annotations if provided\n let goalText = description;\n if (options.metric && options.metric.length > 0) {\n goalText += ` [metrics: ${options.metric.join(', ')}]`;\n }\n\n const success = addGoalToSquad(squadName, goalText);\n\n writeLine();\n if (success) {\n writeLine(` ${icons.success} Goal added to ${colors.cyan}${squadName}${RESET}`);\n writeLine(` ${bold}${description}${RESET}`);\n if (options.metric && options.metric.length > 0) {\n writeLine(` ${colors.dim}Metrics: ${options.metric.join(', ')}${RESET}`);\n }\n } else {\n writeLine(` ${colors.red}Failed to add goal${RESET}`);\n }\n writeLine();\n}\n\nexport async function goalListCommand(\n squadName?: string,\n options: { all?: boolean } = {}\n): Promise<void> {\n const squadsDir = findSquadsDir();\n if (!squadsDir) {\n writeLine(` ${colors.red}No .agents/squads directory found${RESET}`);\n return;\n }\n\n const squadsToCheck = squadName ? [squadName] : listSquads(squadsDir);\n\n let totalActive = 0;\n let totalCompleted = 0;\n let hasGoals = false;\n\n writeLine();\n writeLine(` ${gradient('squads')} ${colors.dim}goal list${RESET}`);\n writeLine();\n\n for (const name of squadsToCheck) {\n const squad = loadSquad(name);\n if (!squad || squad.goals.length === 0) {\n if (squadName) {\n writeLine(` ${colors.yellow}No goals set for ${name}${RESET}`);\n }\n continue;\n }\n\n hasGoals = true;\n const activeGoals = squad.goals.filter(g => !g.completed);\n const completedGoals = squad.goals.filter(g => g.completed);\n\n totalActive += activeGoals.length;\n totalCompleted += completedGoals.length;\n\n if (activeGoals.length === 0 && !options.all) continue;\n\n writeLine(` ${colors.cyan}${name}${RESET}`);\n if (squad.mission) {\n writeLine(` ${colors.dim}${truncate(squad.mission, 60)}${RESET}`);\n }\n writeLine();\n\n for (const goal of activeGoals) {\n const globalIdx = squad.goals.indexOf(goal) + 1;\n writeLine(` ${icons.active} ${colors.dim}[${globalIdx}]${RESET} ${goal.description}`);\n if (goal.progress) {\n writeLine(` ${colors.dim}└ ${goal.progress}${RESET}`);\n }\n }\n\n if (options.all && completedGoals.length > 0) {\n for (const goal of completedGoals) {\n const globalIdx = squad.goals.indexOf(goal) + 1;\n writeLine(` ${icons.success} ${colors.dim}[${globalIdx}] ${goal.description}${RESET}`);\n }\n }\n writeLine();\n }\n\n if (hasGoals) {\n writeLine(` ${colors.green}${totalActive}${RESET} active ${colors.dim}│${RESET} ${colors.dim}${totalCompleted} completed${RESET}`);\n } else if (!squadName) {\n writeLine(` ${colors.yellow}No goals defined yet${RESET}`);\n writeLine();\n writeLine(` ${colors.dim}$${RESET} squads goal set ${colors.cyan}<squad>${RESET} ${colors.cyan}\"<goal>\"${RESET}`);\n }\n writeLine();\n}\n\nexport async function goalCompleteCommand(\n squadName: string,\n goalIndex: string\n): Promise<void> {\n const squad = loadSquad(squadName);\n if (!squad) {\n writeLine(` ${colors.red}Squad \"${squadName}\" not found${RESET}`);\n return;\n }\n\n const idx = parseInt(goalIndex) - 1;\n if (idx < 0 || idx >= squad.goals.length) {\n writeLine(` ${colors.red}Invalid goal index: ${goalIndex}${RESET}`);\n writeLine(` ${colors.dim}Squad has ${squad.goals.length} goal(s)${RESET}`);\n return;\n }\n\n const success = updateGoalInSquad(squadName, idx, { completed: true });\n\n writeLine();\n if (success) {\n writeLine(` ${icons.success} Goal completed: ${colors.cyan}${squad.goals[idx].description}${RESET}`);\n } else {\n writeLine(` ${colors.red}Failed to update goal${RESET}`);\n }\n writeLine();\n}\n\nexport async function goalProgressCommand(\n squadName: string,\n goalIndex: string,\n progress: string\n): Promise<void> {\n const squad = loadSquad(squadName);\n if (!squad) {\n writeLine(` ${colors.red}Squad \"${squadName}\" not found${RESET}`);\n return;\n }\n\n const idx = parseInt(goalIndex) - 1;\n if (idx < 0 || idx >= squad.goals.length) {\n writeLine(` ${colors.red}Invalid goal index: ${goalIndex}${RESET}`);\n return;\n }\n\n const success = updateGoalInSquad(squadName, idx, { progress });\n\n writeLine();\n if (success) {\n writeLine(` ${icons.success} Progress updated: ${colors.cyan}${squad.goals[idx].description}${RESET}`);\n writeLine(` ${colors.dim}${progress}${RESET}`);\n } else {\n writeLine(` ${colors.red}Failed to update progress${RESET}`);\n }\n writeLine();\n}\n","import { readFileSync, writeFileSync, existsSync, mkdirSync, readdirSync } from 'fs';\nimport { join, dirname } from 'path';\nimport { findMemoryDir, appendToMemory } from '../lib/memory.js';\nimport { loadSquad } from '../lib/squad-parser.js';\nimport {\n colors,\n bold,\n RESET,\n gradient,\n box,\n padEnd,\n icons,\n writeLine,\n} from '../lib/terminal.js';\n\nexport interface FeedbackEntry {\n date: string;\n execution: string;\n rating: number; // 1-5\n feedback: string;\n learnings?: string[];\n}\n\nfunction getFeedbackPath(squadName: string): string | null {\n const memoryDir = findMemoryDir();\n if (!memoryDir) return null;\n\n // Find the lead agent for this squad\n const squad = loadSquad(squadName);\n const agentName = squad?.agents[0]?.name || `${squadName}-lead`;\n\n return join(memoryDir, squadName, agentName, 'feedback.md');\n}\n\nfunction getOutputPath(squadName: string): string | null {\n const memoryDir = findMemoryDir();\n if (!memoryDir) return null;\n\n const squad = loadSquad(squadName);\n const agentName = squad?.agents[0]?.name || `${squadName}-lead`;\n\n return join(memoryDir, squadName, agentName, 'output.md');\n}\n\nfunction getLastExecution(squadName: string): { date: string; summary: string } | null {\n const outputPath = getOutputPath(squadName);\n if (!outputPath || !existsSync(outputPath)) {\n return null;\n }\n\n const content = readFileSync(outputPath, 'utf-8');\n const lines = content.split('\\n');\n\n // Try to extract date from content\n let date = 'unknown';\n let summary = lines.slice(0, 5).join('\\n');\n\n // Look for date patterns\n const dateMatch = content.match(/(\\d{4}-\\d{2}-\\d{2})/);\n if (dateMatch) {\n date = dateMatch[1];\n }\n\n // Look for title\n const titleMatch = content.match(/^#\\s+(.+)$/m);\n if (titleMatch) {\n summary = titleMatch[1];\n }\n\n return { date, summary };\n}\n\nfunction parseFeedbackHistory(content: string): FeedbackEntry[] {\n const entries: FeedbackEntry[] = [];\n const sections = content.split(/---\\n/).filter(s => s.trim());\n\n for (const section of sections) {\n const dateMatch = section.match(/_Date:\\s*(.+)_/);\n const ratingMatch = section.match(/\\*\\*Rating\\*\\*:\\s*(\\d)\\/5/);\n const feedbackMatch = section.match(/\\*\\*Feedback\\*\\*:\\s*(.+)/);\n const executionMatch = section.match(/\\*\\*Execution\\*\\*:\\s*(.+)/);\n\n if (dateMatch && ratingMatch) {\n const entry: FeedbackEntry = {\n date: dateMatch[1],\n execution: executionMatch?.[1] || 'unknown',\n rating: parseInt(ratingMatch[1]),\n feedback: feedbackMatch?.[1] || '',\n learnings: [],\n };\n\n // Extract learnings\n const learningsMatch = section.match(/\\*\\*Learnings\\*\\*:\\n((?:- .+\\n?)+)/);\n if (learningsMatch) {\n entry.learnings = learningsMatch[1]\n .split('\\n')\n .filter(l => l.startsWith('- '))\n .map(l => l.replace(/^- /, ''));\n }\n\n entries.push(entry);\n }\n }\n\n return entries;\n}\n\nexport async function feedbackAddCommand(\n squadName: string,\n rating: string,\n feedback: string,\n options: { learning?: string[] }\n): Promise<void> {\n const feedbackPath = getFeedbackPath(squadName);\n if (!feedbackPath) {\n writeLine(` ${colors.red}Could not find memory directory${RESET}`);\n return;\n }\n\n const ratingNum = parseInt(rating);\n if (isNaN(ratingNum) || ratingNum < 1 || ratingNum > 5) {\n writeLine(` ${colors.red}Rating must be 1-5${RESET}`);\n return;\n }\n\n // Get last execution for context\n const lastExec = getLastExecution(squadName);\n\n // Ensure directory exists\n const dir = dirname(feedbackPath);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n\n // Build feedback entry\n const date = new Date().toISOString().split('T')[0];\n let entry = `\\n---\\n_Date: ${date}_\\n\\n`;\n entry += `**Execution**: ${lastExec?.summary || 'Manual feedback'}\\n`;\n entry += `**Rating**: ${ratingNum}/5 ${'★'.repeat(ratingNum)}${'☆'.repeat(5 - ratingNum)}\\n`;\n entry += `**Feedback**: ${feedback}\\n`;\n\n if (options.learning && options.learning.length > 0) {\n entry += `**Learnings**:\\n`;\n for (const learning of options.learning) {\n entry += `- ${learning}\\n`;\n }\n\n // Also add learnings to the learnings file\n const squad = loadSquad(squadName);\n const agentName = squad?.agents[0]?.name || `${squadName}-lead`;\n\n for (const learning of options.learning) {\n appendToMemory(squadName, agentName, 'learnings', `From feedback (${date}): ${learning}`);\n }\n }\n\n // Append to feedback file\n let existing = '';\n if (existsSync(feedbackPath)) {\n existing = readFileSync(feedbackPath, 'utf-8');\n } else {\n existing = `# ${squadName} - Feedback Log\\n\\n> Execution feedback and learnings\\n`;\n }\n\n writeFileSync(feedbackPath, existing + entry);\n\n // Display\n const stars = `${colors.yellow}${'★'.repeat(ratingNum)}${'☆'.repeat(5 - ratingNum)}${RESET}`;\n\n writeLine();\n writeLine(` ${icons.success} Feedback recorded for ${colors.cyan}${squadName}${RESET}`);\n writeLine(` Rating: ${stars}`);\n writeLine(` ${feedback}`);\n if (options.learning && options.learning.length > 0) {\n writeLine(` ${colors.dim}+ ${options.learning.length} learning(s) added${RESET}`);\n }\n writeLine();\n}\n\nexport async function feedbackShowCommand(\n squadName: string,\n options: { limit?: string }\n): Promise<void> {\n const feedbackPath = getFeedbackPath(squadName);\n if (!feedbackPath || !existsSync(feedbackPath)) {\n writeLine(` ${colors.yellow}No feedback recorded for ${squadName}${RESET}`);\n return;\n }\n\n const content = readFileSync(feedbackPath, 'utf-8');\n const entries = parseFeedbackHistory(content);\n\n const limit = options.limit ? parseInt(options.limit) : 5;\n const recent = entries.slice(-limit).reverse();\n\n writeLine();\n writeLine(` ${gradient('squads')} ${colors.dim}feedback${RESET} ${colors.cyan}${squadName}${RESET}`);\n writeLine();\n\n if (recent.length === 0) {\n writeLine(` ${colors.dim}No feedback entries yet${RESET}`);\n return;\n }\n\n // Calculate average rating\n const avgRating = entries.reduce((sum, e) => sum + e.rating, 0) / entries.length;\n\n writeLine(` ${colors.dim}Average: ${avgRating.toFixed(1)}/5 (${entries.length} entries)${RESET}`);\n writeLine();\n\n for (const entry of recent) {\n const stars = `${colors.yellow}${'★'.repeat(entry.rating)}${'☆'.repeat(5 - entry.rating)}${RESET}`;\n writeLine(` ${colors.dim}${entry.date}${RESET} ${stars}`);\n writeLine(` ${entry.feedback}`);\n if (entry.learnings && entry.learnings.length > 0) {\n for (const learning of entry.learnings) {\n writeLine(` ${colors.green}→ ${learning}${RESET}`);\n }\n }\n writeLine();\n }\n}\n\nexport async function feedbackStatsCommand(): Promise<void> {\n const memoryDir = findMemoryDir();\n if (!memoryDir) {\n writeLine(` ${colors.red}Could not find memory directory${RESET}`);\n return;\n }\n\n writeLine();\n writeLine(` ${gradient('squads')} ${colors.dim}feedback stats${RESET}`);\n writeLine();\n\n const squads = readdirSync(memoryDir, { withFileTypes: true })\n .filter(e => e.isDirectory())\n .map(e => e.name);\n\n // Table\n const w = { squad: 18, avg: 12, count: 8, trend: 6 };\n const tableWidth = w.squad + w.avg + w.count + w.trend + 4;\n\n writeLine(` ${colors.purple}${box.topLeft}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.topRight}${RESET}`);\n\n const header = ` ${colors.purple}${box.vertical}${RESET} ` +\n `${bold}${padEnd('SQUAD', w.squad)}${RESET}` +\n `${bold}${padEnd('AVG', w.avg)}${RESET}` +\n `${bold}${padEnd('COUNT', w.count)}${RESET}` +\n `${bold}TREND${RESET}` +\n ` ${colors.purple}${box.vertical}${RESET}`;\n writeLine(header);\n\n writeLine(` ${colors.purple}${box.teeRight}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.teeLeft}${RESET}`);\n\n for (const squad of squads) {\n const feedbackPath = getFeedbackPath(squad);\n if (!feedbackPath || !existsSync(feedbackPath)) {\n continue;\n }\n\n const content = readFileSync(feedbackPath, 'utf-8');\n const entries = parseFeedbackHistory(content);\n\n if (entries.length === 0) continue;\n\n const avgRating = entries.reduce((sum, e) => sum + e.rating, 0) / entries.length;\n\n // Calculate trend (last 3 vs previous)\n let trend = `${colors.dim}→${RESET}`;\n if (entries.length >= 4) {\n const recent = entries.slice(-3).reduce((s, e) => s + e.rating, 0) / 3;\n const older = entries.slice(-6, -3).reduce((s, e) => s + e.rating, 0) / Math.min(3, entries.slice(-6, -3).length);\n if (recent > older + 0.3) trend = `${colors.green}↑${RESET}`;\n else if (recent < older - 0.3) trend = `${colors.red}↓${RESET}`;\n }\n\n const stars = `${colors.yellow}${'★'.repeat(Math.round(avgRating))}${'☆'.repeat(5 - Math.round(avgRating))}${RESET}`;\n\n const row = ` ${colors.purple}${box.vertical}${RESET} ` +\n `${colors.cyan}${padEnd(squad, w.squad)}${RESET}` +\n `${padEnd(stars, w.avg + 20)}` + // extra for color codes\n `${padEnd(String(entries.length), w.count)}` +\n `${trend}` +\n ` ${colors.purple}${box.vertical}${RESET}`;\n\n writeLine(row);\n }\n\n writeLine(` ${colors.purple}${box.bottomLeft}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.bottomRight}${RESET}`);\n writeLine();\n\n // Commands\n writeLine(` ${colors.dim}$${RESET} squads feedback show ${colors.cyan}<squad>${RESET} ${colors.dim}View squad feedback${RESET}`);\n writeLine(` ${colors.dim}$${RESET} squads feedback add ${colors.cyan}<squad>${RESET} ${colors.dim}Add new feedback${RESET}`);\n writeLine();\n}\n","import { readdirSync, readFileSync, existsSync, statSync } from 'fs';\nimport { join } from 'path';\nimport { homedir } from 'os';\nimport { findSquadsDir, listSquads, loadSquad, Goal } from '../lib/squad-parser.js';\nimport { findMemoryDir } from '../lib/memory.js';\nimport { fetchCostSummary, formatCostBar, CostSummary, fetchRateLimits, RateLimits, fetchInsights, Insights, fetchBridgeStats, BridgeStats } from '../lib/costs.js';\nimport { getMultiRepoGitStats, getActivitySparkline, getGitHubStats, getGitHubStatsOptimized, SquadGitHubStats, GitPerformanceStats, GitHubStats } from '../lib/git.js';\nimport { saveDashboardSnapshot, isDatabaseAvailable, getDashboardHistory, DashboardSnapshot, SquadSnapshotData, closeDatabase } from '../lib/db.js';\nimport { getLiveSessionSummary, cleanupStaleSessions } from '../lib/sessions.js';\nimport { checkForUpdate } from '../lib/update.js';\nimport {\n colors,\n bold,\n RESET,\n gradient,\n progressBar,\n box,\n padEnd,\n truncate,\n icons,\n writeLine,\n sparkline,\n barChart,\n} from '../lib/terminal.js';\n\ninterface SquadMetrics {\n name: string;\n mission: string;\n goals: Goal[];\n lastActivity: string;\n status: 'active' | 'stale' | 'needs-goal';\n github: SquadGitHubStats | null;\n goalProgress: number; // 0-100\n}\n\nfunction getLastActivityDate(squadName: string): string {\n const memoryDir = findMemoryDir();\n if (!memoryDir) return 'unknown';\n\n const squadMemory = join(memoryDir, squadName);\n if (!existsSync(squadMemory)) return '—';\n\n let latestTime = 0;\n\n try {\n const agents = readdirSync(squadMemory, { withFileTypes: true })\n .filter(e => e.isDirectory());\n\n for (const agent of agents) {\n const agentPath = join(squadMemory, agent.name);\n const files = readdirSync(agentPath).filter(f => f.endsWith('.md'));\n\n for (const file of files) {\n const filePath = join(agentPath, file);\n const stats = statSync(filePath);\n if (stats.mtimeMs > latestTime) {\n latestTime = stats.mtimeMs;\n }\n }\n }\n } catch {\n return '—';\n }\n\n if (latestTime === 0) return '—';\n\n const ageMs = Date.now() - latestTime;\n const ageDays = Math.floor(ageMs / (1000 * 60 * 60 * 24));\n\n if (ageDays === 0) return 'today';\n if (ageDays === 1) return '1d';\n if (ageDays < 7) return `${ageDays}d`;\n return `${Math.floor(ageDays / 7)}w`;\n}\n\n// Cache for expensive computations within a single run\ninterface DashboardCache {\n gitStats: GitPerformanceStats | null;\n ghStats: GitHubStats | null;\n costs: CostSummary | null;\n bridgeStats: BridgeStats | null;\n activity: number[];\n dbAvailable: boolean;\n history: DashboardSnapshot[];\n insights: Insights | null;\n}\n\nexport async function dashboardCommand(options: { verbose?: boolean; ceo?: boolean; fast?: boolean } = {}): Promise<void> {\n const squadsDir = findSquadsDir();\n if (!squadsDir) {\n writeLine(`${colors.red}No .agents/squads directory found${RESET}`);\n return;\n }\n\n // CEO mode: executive summary\n if (options.ceo) {\n await renderCeoReport(squadsDir);\n return;\n }\n\n const baseDir = findAgentsSquadsDir();\n const squadNames = listSquads(squadsDir);\n const skipGitHub = options.fast !== false; // Default to fast mode (skip GitHub API)\n\n // === PHASE 1: Parallel data fetching ===\n // Fetch all expensive data in parallel to minimize wall time\n // Wrap slow calls with race timeout to ensure CLI responsiveness\n const timeout = <T>(promise: Promise<T>, ms: number, fallback: T): Promise<T> =>\n Promise.race([promise, new Promise<T>(resolve => setTimeout(() => resolve(fallback), ms))]);\n\n const [gitStats, ghStats, costs, bridgeStats, activity, dbAvailable, history, insights] = await Promise.all([\n // Git stats (local, ~1s)\n Promise.resolve(baseDir ? getMultiRepoGitStats(baseDir, 30) : null),\n // GitHub stats (network, ~20-30s) - skip by default for fast mode\n skipGitHub ? Promise.resolve(null) : Promise.resolve(baseDir ? getGitHubStatsOptimized(baseDir, 30) : null),\n // Langfuse costs (network, 2s timeout)\n timeout(fetchCostSummary(100), 2000, null),\n // Bridge stats (local network, 2s timeout)\n timeout(fetchBridgeStats(), 2000, null),\n // Activity sparkline (local, <1s)\n Promise.resolve(baseDir ? getActivitySparkline(baseDir, 14) : []),\n // Database availability check (1.5s timeout)\n timeout(isDatabaseAvailable(), 1500, false),\n // Dashboard history (1.5s timeout)\n timeout(getDashboardHistory(14).catch(() => [] as DashboardSnapshot[]), 1500, [] as DashboardSnapshot[]),\n // Insights (2s timeout)\n timeout(fetchInsights('week').catch(() => null), 2000, null),\n ]);\n\n // Create cache for render functions\n const cache: DashboardCache = { gitStats, ghStats, costs, bridgeStats, activity, dbAvailable, history, insights };\n\n // === PHASE 2: Build squad metrics (sync, fast) ===\n const squadData: SquadMetrics[] = [];\n\n for (const name of squadNames) {\n const squad = loadSquad(name);\n if (!squad) continue;\n\n const lastActivity = getLastActivityDate(name);\n const github = ghStats?.bySquad.get(name) || null;\n\n let status: SquadMetrics['status'] = 'active';\n const activeGoals = squad.goals.filter(g => !g.completed);\n if (activeGoals.length === 0) {\n status = 'needs-goal';\n } else if (lastActivity.includes('w') || lastActivity === '—') {\n status = 'stale';\n }\n\n const totalGoals = squad.goals.length;\n const completedGoals = squad.goals.filter(g => g.completed).length;\n const hasProgress = squad.goals.filter(g => g.progress).length;\n const goalProgress = totalGoals > 0\n ? Math.round(((completedGoals + hasProgress * 0.3) / totalGoals) * 100)\n : 0;\n\n // Calculate commit counts from git stats\n const repoSquadMap: Record<string, string[]> = {\n website: ['agents-squads-web'],\n product: ['squads-cli'],\n engineering: ['hq', 'squads-cli'],\n research: ['research'],\n intelligence: ['intelligence'],\n customer: ['customer'],\n finance: ['finance'],\n company: ['company', 'hq'],\n marketing: ['marketing', 'agents-squads-web'],\n cli: ['squads-cli'],\n };\n\n let squadCommits = 0;\n if (gitStats) {\n for (const [repo, commits] of gitStats.commitsByRepo) {\n if (repoSquadMap[name]?.includes(repo)) {\n squadCommits += commits;\n }\n }\n }\n\n // Create github stats object (from ghStats or minimal with just commits)\n const githubStats: SquadGitHubStats = github || {\n prsOpened: 0,\n prsMerged: 0,\n issuesClosed: 0,\n issuesOpen: 0,\n commits: 0,\n recentIssues: [],\n recentPRs: [],\n };\n githubStats.commits = squadCommits;\n\n squadData.push({\n name,\n mission: squad.mission,\n goals: squad.goals,\n lastActivity,\n status,\n github: githubStats,\n goalProgress,\n });\n }\n\n // === PHASE 3: Render (sync, fast) ===\n const activeSquads = squadData.filter(s => s.status === 'active').length;\n const totalPRs = ghStats ? ghStats.prsMerged : 0;\n const totalIssuesClosed = ghStats ? ghStats.issuesClosed : 0;\n const totalIssuesOpen = ghStats ? ghStats.issuesOpen : 0;\n\n // Get active sessions (real-time process detection)\n cleanupStaleSessions(); // Clean up stale file-based sessions\n const sessionSummary = getLiveSessionSummary();\n\n writeLine();\n writeLine(` ${gradient('squads')} ${colors.dim}dashboard${RESET}`);\n\n // Check for updates (cached, non-blocking)\n const updateInfo = checkForUpdate();\n if (updateInfo.updateAvailable) {\n writeLine(` ${colors.cyan}⬆${RESET} Update available: ${colors.dim}${updateInfo.currentVersion}${RESET} → ${colors.green}${updateInfo.latestVersion}${RESET} ${colors.dim}(run \\`squads update\\`)${RESET}`);\n }\n\n // Session indicator line (only if there are active sessions)\n if (sessionSummary.totalSessions > 0) {\n const sessionText = sessionSummary.totalSessions === 1 ? 'session' : 'sessions';\n const squadText = sessionSummary.squadCount === 1 ? 'squad' : 'squads';\n\n // Build tool breakdown string (e.g., \"claude 4, cursor 2\")\n let toolInfo = '';\n if (sessionSummary.byTool && Object.keys(sessionSummary.byTool).length > 0) {\n const toolParts = Object.entries(sessionSummary.byTool)\n .sort((a, b) => b[1] - a[1]) // Sort by count descending\n .map(([tool, count]) => `${colors.dim}${tool}${RESET} ${colors.cyan}${count}${RESET}`);\n toolInfo = ` ${colors.dim}(${RESET}${toolParts.join(` ${colors.dim}·${RESET} `)}${colors.dim})${RESET}`;\n }\n\n writeLine(` ${colors.green}${icons.active}${RESET} ${colors.white}${sessionSummary.totalSessions}${RESET} active ${sessionText} ${colors.dim}across${RESET} ${colors.cyan}${sessionSummary.squadCount}${RESET} ${squadText}${toolInfo}`);\n }\n writeLine();\n\n // Stats row - show different info based on whether GitHub data is available\n const statsParts = [`${colors.cyan}${activeSquads}${RESET}/${squadData.length} squads`];\n if (ghStats) {\n statsParts.push(`${colors.green}${totalPRs}${RESET} PRs merged`);\n statsParts.push(`${colors.purple}${totalIssuesClosed}${RESET} closed`);\n statsParts.push(`${colors.yellow}${totalIssuesOpen}${RESET} open`);\n } else {\n statsParts.push(`${colors.cyan}${gitStats?.totalCommits || 0}${RESET} commits`);\n statsParts.push(`${colors.dim}use -f for PRs/issues${RESET}`);\n }\n writeLine(` ${statsParts.join(` ${colors.dim}│${RESET} `)}`);\n writeLine();\n\n const overallProgress = squadData.length > 0\n ? Math.round(squadData.reduce((sum, s) => sum + s.goalProgress, 0) / squadData.length)\n : 0;\n writeLine(` ${progressBar(overallProgress, 32)} ${colors.dim}${overallProgress}% goal progress${RESET}`);\n writeLine();\n\n // Squad table\n const w = { name: 13, commits: 7, prs: 4, issues: 6, goals: 6, bar: 10 };\n const tableWidth = w.name + w.commits + w.prs + w.issues + w.goals + w.bar + 12;\n\n writeLine(` ${colors.purple}${box.topLeft}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.topRight}${RESET}`);\n writeLine(` ${colors.purple}${box.vertical}${RESET} ` +\n `${bold}${padEnd('SQUAD', w.name)}${RESET}` +\n `${bold}${padEnd('COMMITS', w.commits)}${RESET}` +\n `${bold}${padEnd('PRs', w.prs)}${RESET}` +\n `${bold}${padEnd('ISSUES', w.issues)}${RESET}` +\n `${bold}${padEnd('GOALS', w.goals)}${RESET}` +\n `${bold}PROGRESS${RESET}` +\n ` ${colors.purple}${box.vertical}${RESET}`);\n writeLine(` ${colors.purple}${box.teeRight}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.teeLeft}${RESET}`);\n\n const sortedSquads = [...squadData].sort((a, b) => {\n const aActivity = (a.github?.commits || 0) + (a.github?.prsMerged || 0) * 5;\n const bActivity = (b.github?.commits || 0) + (b.github?.prsMerged || 0) * 5;\n return bActivity - aActivity;\n });\n\n for (const squad of sortedSquads) {\n const gh = squad.github;\n const commits = gh?.commits || 0;\n const prs = gh?.prsMerged || 0;\n const issuesClosed = gh?.issuesClosed || 0;\n const issuesOpen = gh?.issuesOpen || 0;\n const activeCount = squad.goals.filter(g => !g.completed).length;\n const totalCount = squad.goals.length;\n\n const commitColor = commits > 10 ? colors.green : commits > 0 ? colors.cyan : colors.dim;\n const prColor = prs > 0 ? colors.green : colors.dim;\n const issueColor = issuesClosed > 0 ? colors.green : colors.dim;\n\n writeLine(` ${colors.purple}${box.vertical}${RESET} ` +\n `${colors.cyan}${padEnd(squad.name, w.name)}${RESET}` +\n `${commitColor}${padEnd(String(commits), w.commits)}${RESET}` +\n `${prColor}${padEnd(String(prs), w.prs)}${RESET}` +\n `${issueColor}${padEnd(`${issuesClosed}/${issuesOpen}`, w.issues)}${RESET}` +\n `${padEnd(`${activeCount}/${totalCount}`, w.goals)}` +\n `${progressBar(squad.goalProgress, 8)}` +\n ` ${colors.purple}${box.vertical}${RESET}`);\n }\n\n writeLine(` ${colors.purple}${box.bottomLeft}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.bottomRight}${RESET}`);\n writeLine();\n\n // Render sections using cached data (no more network calls)\n renderGitPerformanceCached(cache);\n renderTokenEconomicsCached(cache);\n renderInfrastructureCached(cache);\n\n // These still need async but are fast\n renderHistoricalTrendsCached(cache);\n renderInsightsCached(cache);\n\n // Goals section\n const allActiveGoals = squadData.flatMap(s =>\n s.goals.filter(g => !g.completed).map(g => ({ squad: s.name, goal: g }))\n );\n\n if (allActiveGoals.length > 0) {\n writeLine(` ${bold}Goals${RESET}`);\n writeLine();\n\n const maxGoals = 6;\n for (const { squad, goal } of allActiveGoals.slice(0, maxGoals)) {\n const hasProgress = goal.progress && goal.progress.length > 0;\n const icon = hasProgress ? icons.progress : icons.empty;\n writeLine(` ${icon} ${colors.dim}${squad}${RESET} ${truncate(goal.description, 48)}`);\n if (hasProgress) {\n writeLine(` ${colors.dim}└${RESET} ${colors.green}${truncate(goal.progress!, 52)}${RESET}`);\n }\n }\n\n if (allActiveGoals.length > maxGoals) {\n writeLine(` ${colors.dim} +${allActiveGoals.length - maxGoals} more${RESET}`);\n }\n writeLine();\n }\n\n writeLine(` ${colors.dim}$${RESET} squads run ${colors.cyan}<squad>${RESET} ${colors.dim}Execute a squad${RESET}`);\n writeLine(` ${colors.dim}$${RESET} squads goal set ${colors.dim}Add a goal${RESET}`);\n writeLine();\n\n // Save snapshot in background (don't block)\n saveSnapshotCached(squadData, cache, baseDir).catch(() => {});\n\n // Close database pool to allow process to exit immediately\n await closeDatabase();\n}\n\n/**\n * Save dashboard snapshot to local PostgreSQL for historical tracking\n */\nasync function saveSnapshot(\n squadData: SquadMetrics[],\n ghStats: GitHubStats | null,\n baseDir: string | null\n): Promise<void> {\n // Check if database is available\n const dbAvailable = await isDatabaseAvailable();\n if (!dbAvailable) return;\n\n // Fetch additional data for snapshot\n const gitStats = baseDir ? getMultiRepoGitStats(baseDir, 30) : null;\n const costs = await fetchCostSummary(100);\n\n // Build squad snapshot data\n const squadsData: SquadSnapshotData[] = squadData.map(s => ({\n name: s.name,\n commits: s.github?.commits || 0,\n prsOpened: s.github?.prsOpened || 0,\n prsMerged: s.github?.prsMerged || 0,\n issuesClosed: s.github?.issuesClosed || 0,\n issuesOpen: s.github?.issuesOpen || 0,\n goalsActive: s.goals.filter(g => !g.completed).length,\n goalsTotal: s.goals.length,\n progress: s.goalProgress,\n }));\n\n // Build authors data\n const authorsData = gitStats\n ? Array.from(gitStats.commitsByAuthor.entries())\n .sort((a, b) => b[1] - a[1])\n .slice(0, 10)\n .map(([name, commits]) => ({ name, commits }))\n : [];\n\n // Build repos data\n const reposData = gitStats\n ? Array.from(gitStats.commitsByRepo.entries())\n .sort((a, b) => b[1] - a[1])\n .map(([name, commits]) => ({ name, commits }))\n : [];\n\n // Calculate totals\n const totalInputTokens = costs?.bySquad.reduce((sum, s) => sum + s.inputTokens, 0) || 0;\n const totalOutputTokens = costs?.bySquad.reduce((sum, s) => sum + s.outputTokens, 0) || 0;\n const overallProgress = squadData.length > 0\n ? Math.round(squadData.reduce((sum, s) => sum + s.goalProgress, 0) / squadData.length)\n : 0;\n\n const snapshot: DashboardSnapshot = {\n totalSquads: squadData.length,\n totalCommits: gitStats?.totalCommits || 0,\n totalPrsMerged: ghStats?.prsMerged || 0,\n totalIssuesClosed: ghStats?.issuesClosed || 0,\n totalIssuesOpen: ghStats?.issuesOpen || 0,\n goalProgressPct: overallProgress,\n costUsd: costs?.totalCost || 0,\n dailyBudgetUsd: costs?.dailyBudget || 50,\n inputTokens: totalInputTokens,\n outputTokens: totalOutputTokens,\n commits30d: gitStats?.totalCommits || 0,\n avgCommitsPerDay: gitStats?.avgCommitsPerDay || 0,\n activeDays: gitStats?.activeDays || 0,\n peakCommits: gitStats?.peakDay?.count || 0,\n peakDate: gitStats?.peakDay?.date || null,\n squadsData,\n authorsData,\n reposData,\n };\n\n await saveDashboardSnapshot(snapshot);\n}\n\n// Find agents-squads base directory\nfunction findAgentsSquadsDir(): string | null {\n const candidates = [\n join(process.cwd(), '..'),\n join(homedir(), 'agents-squads'),\n ];\n\n for (const dir of candidates) {\n if (existsSync(join(dir, 'hq'))) {\n return dir;\n }\n }\n return null;\n}\n\nasync function renderGitPerformance(): Promise<void> {\n const baseDir = findAgentsSquadsDir();\n\n if (!baseDir) {\n writeLine(` ${bold}Git Activity${RESET} ${colors.dim}(no repos found)${RESET}`);\n writeLine();\n return;\n }\n\n const stats = getMultiRepoGitStats(baseDir, 30);\n const activity = getActivitySparkline(baseDir, 14);\n\n if (stats.totalCommits === 0) {\n writeLine(` ${bold}Git Activity${RESET} ${colors.dim}(no commits in 30d)${RESET}`);\n writeLine();\n return;\n }\n\n writeLine(` ${bold}Git Activity${RESET} ${colors.dim}(30d)${RESET}`);\n writeLine();\n\n // Sparkline for last 14 days\n const spark = sparkline(activity);\n writeLine(` ${colors.dim}Last 14d:${RESET} ${spark}`);\n writeLine();\n\n // Key metrics row\n const metrics = [\n `${colors.cyan}${stats.totalCommits}${RESET} commits`,\n `${colors.green}${stats.avgCommitsPerDay}${RESET}/day`,\n `${colors.purple}${stats.activeDays}${RESET} active days`,\n ];\n if (stats.peakDay) {\n metrics.push(`${colors.yellow}${stats.peakDay.count}${RESET} peak ${colors.dim}(${stats.peakDay.date})${RESET}`);\n }\n writeLine(` ${metrics.join(` ${colors.dim}│${RESET} `)}`);\n writeLine();\n\n // Repos by commits (top 5)\n const sortedRepos = Array.from(stats.commitsByRepo.entries())\n .sort((a, b) => b[1] - a[1])\n .slice(0, 5);\n\n if (sortedRepos.length > 0) {\n const maxRepoCommits = sortedRepos[0][1];\n\n for (const [repo, commits] of sortedRepos) {\n const bar = barChart(commits, maxRepoCommits, 12);\n writeLine(` ${colors.cyan}${padEnd(repo, 20)}${RESET}${bar} ${colors.dim}${commits}${RESET}`);\n }\n writeLine();\n }\n\n // Authors (top 3)\n const sortedAuthors = Array.from(stats.commitsByAuthor.entries())\n .sort((a, b) => b[1] - a[1])\n .slice(0, 3);\n\n if (sortedAuthors.length > 0) {\n const authorLine = sortedAuthors\n .map(([author, count]) => `${colors.dim}${truncate(author, 15)}${RESET} ${colors.cyan}${count}${RESET}`)\n .join(` ${colors.dim}│${RESET} `);\n writeLine(` ${colors.dim}By author:${RESET} ${authorLine}`);\n writeLine();\n }\n}\n\nasync function renderTokenEconomics(squadNames: string[]): Promise<void> {\n const costs = await fetchCostSummary(100);\n\n if (!costs) {\n // No Langfuse config or API error - show hint\n writeLine(` ${bold}Token Economics${RESET} ${colors.dim}(no data)${RESET}`);\n writeLine(` ${colors.dim}Set LANGFUSE_PUBLIC_KEY & LANGFUSE_SECRET_KEY for cost tracking${RESET}`);\n writeLine();\n return;\n }\n\n writeLine(` ${bold}Token Economics${RESET} ${colors.dim}(last 100 calls)${RESET}`);\n writeLine();\n\n // Budget bar\n const barWidth = 32;\n const costBar = formatCostBar(costs.usedPercent, barWidth);\n writeLine(` ${colors.dim}Budget $${costs.dailyBudget}${RESET} [${costBar}] ${costs.usedPercent.toFixed(1)}%`);\n writeLine(` ${colors.green}$${costs.totalCost.toFixed(2)}${RESET} used ${colors.dim}│${RESET} ${colors.cyan}$${costs.idleBudget.toFixed(2)}${RESET} idle`);\n writeLine();\n\n // Anthropic tier and limits\n const tier = parseInt(process.env.ANTHROPIC_TIER || '4', 10);\n\n // RPM limits by tier (same for all models)\n const rpmByTier: Record<number, number> = { 1: 50, 2: 1000, 3: 2000, 4: 4000 };\n const rpmLimit = rpmByTier[tier] || 4000;\n\n // Token limits by tier and model family (ITPM/OTPM per minute)\n const tokenLimits: Record<number, Record<string, { itpm: number; otpm: number }>> = {\n 1: { opus: { itpm: 30000, otpm: 8000 }, sonnet: { itpm: 30000, otpm: 8000 }, haiku: { itpm: 50000, otpm: 10000 } },\n 2: { opus: { itpm: 450000, otpm: 90000 }, sonnet: { itpm: 450000, otpm: 90000 }, haiku: { itpm: 450000, otpm: 90000 } },\n 3: { opus: { itpm: 800000, otpm: 160000 }, sonnet: { itpm: 800000, otpm: 160000 }, haiku: { itpm: 1000000, otpm: 200000 } },\n 4: { opus: { itpm: 2000000, otpm: 400000 }, sonnet: { itpm: 2000000, otpm: 400000 }, haiku: { itpm: 4000000, otpm: 800000 } },\n };\n\n const modelShortNames: Record<string, string> = {\n 'claude-opus-4-5-20251101': 'opus-4.5',\n 'claude-sonnet-4-20250514': 'sonnet-4',\n 'claude-haiku-4-5-20251001': 'haiku-4.5',\n 'claude-3-5-sonnet-20241022': 'sonnet-3.5',\n 'claude-3-5-haiku-20241022': 'haiku-3.5',\n };\n\n const modelToFamily: Record<string, string> = {\n 'claude-opus-4-5-20251101': 'opus',\n 'claude-sonnet-4-20250514': 'sonnet',\n 'claude-haiku-4-5-20251001': 'haiku',\n 'claude-3-5-sonnet-20241022': 'sonnet',\n 'claude-3-5-haiku-20241022': 'haiku',\n };\n\n // Aggregate stats by model\n const modelStats: Record<string, { calls: number; input: number; output: number; cached: number }> = {};\n for (const squad of costs.bySquad) {\n for (const [model, count] of Object.entries(squad.models)) {\n if (!modelStats[model]) {\n modelStats[model] = { calls: 0, input: 0, output: 0, cached: 0 };\n }\n modelStats[model].calls += count;\n }\n // Distribute tokens proportionally (approximation since we don't have per-model token breakdown)\n const totalCalls = Object.values(squad.models).reduce((a, b) => a + b, 0);\n for (const [model, count] of Object.entries(squad.models)) {\n const ratio = totalCalls > 0 ? count / totalCalls : 0;\n modelStats[model].input += Math.round(squad.inputTokens * ratio);\n modelStats[model].output += Math.round(squad.outputTokens * ratio);\n }\n }\n\n // Total tokens for all models\n const totalInput = costs.bySquad.reduce((sum, s) => sum + s.inputTokens, 0);\n const totalOutput = costs.bySquad.reduce((sum, s) => sum + s.outputTokens, 0);\n const totalCalls = costs.bySquad.reduce((sum, s) => sum + s.calls, 0);\n\n // Cost projections - extrapolate based on hours elapsed today\n const now = new Date();\n const hoursElapsed = Math.max(now.getHours() + now.getMinutes() / 60, 1); // At least 1 hour to avoid division issues\n const hourlyRate = costs.totalCost / hoursElapsed;\n const dailyProjection = hourlyRate * 24;\n const monthlyProjection = dailyProjection * 30;\n\n // Fetch real rate limits from proxy (if available)\n const rateLimits = await fetchRateLimits();\n const hasRealLimits = rateLimits.source === 'proxy' && Object.keys(rateLimits.limits).length > 0;\n\n // Display rate limits section\n if (hasRealLimits) {\n writeLine(` ${colors.dim}Rate Limits${RESET} ${colors.green}(live)${RESET}`);\n\n for (const [family, limits] of Object.entries(rateLimits.limits)) {\n const name = family === 'opus' ? 'opus' : family === 'sonnet' ? 'sonnet' : family === 'haiku' ? 'haiku' : family;\n\n // Request rate usage\n const reqUsed = limits.requestsLimit - limits.requestsRemaining;\n const reqPct = limits.requestsLimit > 0 ? (reqUsed / limits.requestsLimit) * 100 : 0;\n const reqColor = reqPct > 80 ? colors.red : reqPct > 50 ? colors.yellow : colors.green;\n\n // Token rate usage\n const tokUsed = limits.tokensLimit - limits.tokensRemaining;\n const tokPct = limits.tokensLimit > 0 ? (tokUsed / limits.tokensLimit) * 100 : 0;\n const tokColor = tokPct > 80 ? colors.red : tokPct > 50 ? colors.yellow : colors.green;\n\n writeLine(` ${colors.cyan}${padEnd(name, 8)}${RESET} ${reqColor}${String(reqUsed).padStart(4)}${RESET}${colors.dim}/${limits.requestsLimit}req${RESET} ${tokColor}${formatK(tokUsed)}${RESET}${colors.dim}/${formatK(limits.tokensLimit)}tok${RESET}`);\n }\n } else {\n writeLine(` ${colors.dim}Rate Limits (Tier ${tier})${RESET}`);\n\n const sortedModels = Object.entries(modelStats).sort((a, b) => b[1].calls - a[1].calls);\n for (const [model, stats] of sortedModels.slice(0, 3)) {\n const name = modelShortNames[model] || model.split('-').slice(1, 3).join('-');\n const family = modelToFamily[model] || 'sonnet';\n const limits = tokenLimits[tier]?.[family] || { itpm: 1000000, otpm: 200000 };\n\n // RPM\n const rpmPct = (stats.calls / rpmLimit) * 100;\n const rpmColor = rpmPct > 80 ? colors.red : rpmPct > 50 ? colors.yellow : colors.green;\n\n // Format: model [RPM bar] calls [ITPM] input [OTPM] output\n writeLine(` ${colors.cyan}${padEnd(name, 11)}${RESET} ${rpmColor}${String(stats.calls).padStart(4)}${RESET}${colors.dim}rpm${RESET} ${colors.dim}${formatK(stats.input)}${RESET}${colors.dim}/${formatK(limits.itpm)}i${RESET} ${colors.dim}${formatK(stats.output)}${RESET}${colors.dim}/${formatK(limits.otpm)}o${RESET}`);\n }\n }\n writeLine();\n\n // Cache efficiency\n if (costs.totalCachedTokens > 0 || costs.cacheHitRate > 0) {\n const cacheColor = costs.cacheHitRate > 50 ? colors.green : costs.cacheHitRate > 20 ? colors.yellow : colors.red;\n writeLine(` ${colors.dim}Cache:${RESET} ${cacheColor}${costs.cacheHitRate.toFixed(1)}%${RESET} hit rate ${colors.dim}(${formatK(costs.totalCachedTokens)} cached / ${formatK(costs.totalInputTokens + costs.totalCachedTokens)} total)${RESET}`);\n writeLine();\n }\n\n // Cost projections\n writeLine(` ${colors.dim}Projections${RESET}`);\n const projColor = dailyProjection > costs.dailyBudget ? colors.red : colors.green;\n writeLine(` ${colors.dim}Daily:${RESET} ${projColor}~$${dailyProjection.toFixed(2)}${RESET}${colors.dim}/${costs.dailyBudget}${RESET} ${colors.dim}Monthly:${RESET} ${colors.cyan}~$${monthlyProjection.toFixed(0)}${RESET}`);\n\n // Alerts\n if (dailyProjection > costs.dailyBudget * 0.8) {\n writeLine(` ${colors.yellow}⚠${RESET} ${colors.yellow}Projected to exceed daily budget${RESET}`);\n }\n if (costs.usedPercent > 80) {\n writeLine(` ${colors.red}⚠${RESET} ${colors.red}${costs.usedPercent.toFixed(0)}% of daily budget used${RESET}`);\n }\n writeLine();\n}\n\n// Format number as K/M\nfunction formatK(n: number): string {\n if (n >= 1000000) return (n / 1000000).toFixed(1) + 'M';\n if (n >= 1000) return (n / 1000).toFixed(0) + 'k';\n return String(n);\n}\n\nasync function renderHistoricalTrends(): Promise<void> {\n // Check if database is available\n const dbAvailable = await isDatabaseAvailable();\n if (!dbAvailable) return;\n\n const history = await getDashboardHistory(14);\n if (history.length < 2) return; // Need at least 2 data points\n\n writeLine(` ${bold}Usage Trends${RESET} ${colors.dim}(${history.length}d history)${RESET}`);\n writeLine();\n\n // Daily cost sparkline (most recent first, so reverse for left-to-right)\n const dailyCosts = history.map(h => h.costUsd).reverse();\n const costSparkStr = sparkline(dailyCosts);\n const totalSpend = dailyCosts.reduce((sum, c) => sum + c, 0);\n const avgDaily = totalSpend / dailyCosts.length;\n\n writeLine(` ${colors.dim}Cost:${RESET} ${costSparkStr} ${colors.green}$${totalSpend.toFixed(2)}${RESET} total ${colors.dim}($${avgDaily.toFixed(2)}/day avg)${RESET}`);\n\n // Token usage trend\n const inputTokens = history.map(h => h.inputTokens).reverse();\n const totalInput = inputTokens.reduce((sum, t) => sum + t, 0);\n const tokenSparkStr = sparkline(inputTokens);\n\n writeLine(` ${colors.dim}Tokens:${RESET} ${tokenSparkStr} ${colors.cyan}${formatK(totalInput)}${RESET} input ${colors.dim}(${formatK(Math.round(totalInput / inputTokens.length))}/day)${RESET}`);\n\n // Goal progress trend\n const goalProgress = history.map(h => h.goalProgressPct).reverse();\n const latestProgress = goalProgress[goalProgress.length - 1] || 0;\n const earliestProgress = goalProgress[0] || 0;\n const progressDelta = latestProgress - earliestProgress;\n const progressColor = progressDelta > 0 ? colors.green : progressDelta < 0 ? colors.red : colors.dim;\n const progressSign = progressDelta > 0 ? '+' : '';\n\n writeLine(` ${colors.dim}Goals:${RESET} ${sparkline(goalProgress)} ${colors.purple}${latestProgress}%${RESET} ${progressColor}${progressSign}${progressDelta.toFixed(0)}%${RESET}${colors.dim} vs start${RESET}`);\n writeLine();\n}\n\nasync function renderInsights(): Promise<void> {\n const insights = await fetchInsights('week');\n\n if (insights.source === 'none' || insights.taskMetrics.length === 0) {\n // No insights data available - skip section entirely\n return;\n }\n\n writeLine(` ${bold}Agent Insights${RESET} ${colors.dim}(${insights.days}d)${RESET}`);\n writeLine();\n\n // Task completion metrics (aggregated)\n const totals = insights.taskMetrics.reduce(\n (acc, t) => ({\n tasks: acc.tasks + t.tasksTotal,\n completed: acc.completed + t.tasksCompleted,\n failed: acc.failed + t.tasksFailed,\n retries: acc.retries + t.totalRetries,\n withRetries: acc.withRetries + t.tasksWithRetries,\n }),\n { tasks: 0, completed: 0, failed: 0, retries: 0, withRetries: 0 }\n );\n\n if (totals.tasks > 0) {\n const successRate = totals.tasks > 0 ? ((totals.completed / totals.tasks) * 100).toFixed(0) : '0';\n const successColor = parseInt(successRate) >= 80 ? colors.green : parseInt(successRate) >= 60 ? colors.yellow : colors.red;\n\n // Task completion row\n writeLine(` ${colors.dim}Tasks:${RESET} ${colors.green}${totals.completed}${RESET}${colors.dim}/${totals.tasks} completed${RESET} ${successColor}${successRate}%${RESET}${colors.dim} success${RESET} ${colors.red}${totals.failed}${RESET}${colors.dim} failed${RESET}`);\n\n // Retry metrics\n if (totals.retries > 0) {\n const retryRate = totals.tasks > 0 ? ((totals.withRetries / totals.tasks) * 100).toFixed(0) : '0';\n const retryColor = parseInt(retryRate) > 30 ? colors.red : parseInt(retryRate) > 15 ? colors.yellow : colors.green;\n writeLine(` ${colors.dim}Retries:${RESET} ${retryColor}${totals.retries}${RESET}${colors.dim} total${RESET} ${retryColor}${retryRate}%${RESET}${colors.dim} of tasks needed retry${RESET}`);\n }\n }\n\n // Quality metrics (if feedback exists)\n const qualityTotals = insights.qualityMetrics.reduce(\n (acc, q) => ({\n feedback: acc.feedback + q.feedbackCount,\n qualitySum: acc.qualitySum + (q.avgQuality * q.feedbackCount),\n helpfulSum: acc.helpfulSum + (q.helpfulPct * q.feedbackCount / 100),\n fixSum: acc.fixSum + (q.fixRequiredPct * q.feedbackCount / 100),\n }),\n { feedback: 0, qualitySum: 0, helpfulSum: 0, fixSum: 0 }\n );\n\n if (qualityTotals.feedback > 0) {\n const avgQuality = qualityTotals.qualitySum / qualityTotals.feedback;\n const helpfulPct = (qualityTotals.helpfulSum / qualityTotals.feedback) * 100;\n const fixPct = (qualityTotals.fixSum / qualityTotals.feedback) * 100;\n\n const qualityColor = avgQuality >= 4 ? colors.green : avgQuality >= 3 ? colors.yellow : colors.red;\n const stars = '★'.repeat(Math.round(avgQuality)) + '☆'.repeat(5 - Math.round(avgQuality));\n\n writeLine(` ${colors.dim}Quality:${RESET} ${qualityColor}${stars}${RESET} ${colors.dim}(${avgQuality.toFixed(1)}/5)${RESET} ${colors.green}${helpfulPct.toFixed(0)}%${RESET}${colors.dim} helpful${RESET} ${fixPct > 20 ? colors.red : colors.dim}${fixPct.toFixed(0)}% needed fixes${RESET}`);\n }\n\n // Context window utilization\n const contextMetrics = insights.taskMetrics.filter(t => t.avgContextPct > 0);\n if (contextMetrics.length > 0) {\n const avgContext = contextMetrics.reduce((sum, t) => sum + t.avgContextPct, 0) / contextMetrics.length;\n const maxContext = Math.max(...contextMetrics.map(t => t.maxContextTokens));\n\n // Context utilization colors: green < 40%, yellow 40-70%, red > 70%\n const contextColor = avgContext < 40 ? colors.green : avgContext < 70 ? colors.yellow : colors.red;\n const contextStatus = avgContext < 40 ? 'lean' : avgContext < 70 ? 'moderate' : 'heavy';\n\n writeLine(` ${colors.dim}Context:${RESET} ${contextColor}${avgContext.toFixed(0)}%${RESET}${colors.dim} avg utilization (${contextStatus})${RESET} ${colors.dim}peak ${formatK(maxContext)} tokens${RESET}`);\n }\n\n writeLine();\n\n // Top tools (compact)\n if (insights.topTools.length > 0) {\n const toolLine = insights.topTools.slice(0, 5).map(t => {\n const successColor = t.successRate >= 95 ? colors.green : t.successRate >= 80 ? colors.yellow : colors.red;\n return `${colors.dim}${t.toolName.replace('mcp__', '').slice(0, 12)}${RESET} ${successColor}${t.successRate.toFixed(0)}%${RESET}`;\n }).join(' ');\n\n writeLine(` ${colors.dim}Tools:${RESET} ${toolLine}`);\n\n // Tool failure alert\n if (insights.toolFailureRate > 5) {\n writeLine(` ${colors.yellow}⚠${RESET} ${colors.yellow}${insights.toolFailureRate.toFixed(1)}% tool failure rate${RESET}`);\n }\n writeLine();\n }\n}\n\nasync function renderInfrastructure(): Promise<void> {\n const stats = await fetchBridgeStats();\n\n if (!stats) {\n writeLine(` ${bold}Infrastructure${RESET} ${colors.dim}(bridge offline)${RESET}`);\n writeLine(` ${colors.dim}Start with: cd docker && docker-compose up -d${RESET}`);\n writeLine();\n return;\n }\n\n writeLine(` ${bold}Infrastructure${RESET} ${colors.dim}(${stats.source})${RESET}`);\n writeLine();\n\n // Health status row\n const pgStatus = stats.health.postgres === 'connected' ? `${colors.green}●${RESET}` : `${colors.red}●${RESET}`;\n const redisStatus = stats.health.redis === 'connected' ? `${colors.green}●${RESET}` : stats.health.redis === 'disabled' ? `${colors.dim}○${RESET}` : `${colors.red}●${RESET}`;\n // OTel pipeline is working if we have data flowing (postgres connected + generations > 0)\n const otelWorking = stats.health.postgres === 'connected' && stats.today.generations > 0;\n const otelStatus = otelWorking ? `${colors.green}●${RESET}` : `${colors.dim}○${RESET}`;\n\n writeLine(` ${pgStatus} postgres ${redisStatus} redis ${otelStatus} otel`);\n writeLine();\n\n // Today's real-time metrics\n if (stats.today.generations > 0 || stats.today.costUsd > 0) {\n const costColor = stats.budget.usedPct > 80 ? colors.red : stats.budget.usedPct > 50 ? colors.yellow : colors.green;\n writeLine(` ${colors.dim}Today:${RESET} ${colors.cyan}${stats.today.generations}${RESET}${colors.dim} calls${RESET} ${costColor}$${stats.today.costUsd.toFixed(2)}${RESET}${colors.dim}/$${stats.budget.daily}${RESET} ${colors.dim}${formatK(stats.today.inputTokens)}+${formatK(stats.today.outputTokens)} tokens${RESET}`);\n\n // Model breakdown\n if (stats.byModel && stats.byModel.length > 0) {\n const modelLine = stats.byModel.map(m => {\n const shortName = m.model.includes('opus') ? 'opus' :\n m.model.includes('sonnet') ? 'sonnet' :\n m.model.includes('haiku') ? 'haiku' : m.model.slice(0, 10);\n return `${colors.dim}${shortName}${RESET} ${colors.cyan}${m.generations}${RESET}`;\n }).join(' ');\n writeLine(` ${colors.dim}Models:${RESET} ${modelLine}`);\n }\n\n // Squad breakdown\n if (stats.bySquad.length > 1) {\n const squadLine = stats.bySquad.slice(0, 4).map(s =>\n `${colors.dim}${s.squad}${RESET} ${colors.green}$${s.costUsd.toFixed(2)}${RESET}`\n ).join(' ');\n writeLine(` ${colors.dim}Squads:${RESET} ${squadLine}`);\n }\n }\n\n // Week totals\n if (stats.week && stats.week.generations > 0) {\n const weekModelLine = stats.week.byModel?.map(m => {\n const shortName = m.model.includes('opus') ? 'opus' :\n m.model.includes('sonnet') ? 'sonnet' :\n m.model.includes('haiku') ? 'haiku' : m.model.slice(0, 10);\n return `${colors.dim}${shortName}${RESET} ${colors.purple}$${m.costUsd.toFixed(0)}${RESET}`;\n }).join(' ') || '';\n writeLine(` ${colors.dim}Week:${RESET} ${colors.cyan}${stats.week.generations}${RESET}${colors.dim} calls${RESET} ${colors.purple}$${stats.week.costUsd.toFixed(2)}${RESET} ${weekModelLine}`);\n }\n\n writeLine();\n}\n\n// === CACHED RENDER FUNCTIONS (use pre-fetched data) ===\n\nfunction renderGitPerformanceCached(cache: DashboardCache): void {\n const { gitStats: stats, activity } = cache;\n\n if (!stats || stats.totalCommits === 0) {\n writeLine(` ${bold}Git Activity${RESET} ${colors.dim}(no commits in 30d)${RESET}`);\n writeLine();\n return;\n }\n\n writeLine(` ${bold}Git Activity${RESET} ${colors.dim}(30d)${RESET}`);\n writeLine();\n\n // Sparkline for last 14 days\n if (activity.length > 0) {\n const spark = sparkline(activity);\n writeLine(` ${colors.dim}Last 14d:${RESET} ${spark}`);\n writeLine();\n }\n\n // Key metrics row\n const metrics = [\n `${colors.cyan}${stats.totalCommits}${RESET} commits`,\n `${colors.green}${stats.avgCommitsPerDay}${RESET}/day`,\n `${colors.purple}${stats.activeDays}${RESET} active days`,\n ];\n if (stats.peakDay) {\n metrics.push(`${colors.yellow}${stats.peakDay.count}${RESET} peak ${colors.dim}(${stats.peakDay.date})${RESET}`);\n }\n writeLine(` ${metrics.join(` ${colors.dim}│${RESET} `)}`);\n writeLine();\n\n // Repos by commits (top 5)\n const sortedRepos = Array.from(stats.commitsByRepo.entries())\n .sort((a, b) => b[1] - a[1])\n .slice(0, 5);\n\n if (sortedRepos.length > 0) {\n const maxRepoCommits = sortedRepos[0][1];\n for (const [repo, commits] of sortedRepos) {\n const bar = barChart(commits, maxRepoCommits, 12);\n writeLine(` ${colors.cyan}${padEnd(repo, 20)}${RESET}${bar} ${colors.dim}${commits}${RESET}`);\n }\n writeLine();\n }\n\n // Authors (top 3)\n const sortedAuthors = Array.from(stats.commitsByAuthor.entries())\n .sort((a, b) => b[1] - a[1])\n .slice(0, 3);\n\n if (sortedAuthors.length > 0) {\n const authorLine = sortedAuthors\n .map(([author, count]) => `${colors.dim}${truncate(author, 15)}${RESET} ${colors.cyan}${count}${RESET}`)\n .join(` ${colors.dim}│${RESET} `);\n writeLine(` ${colors.dim}By author:${RESET} ${authorLine}`);\n writeLine();\n }\n}\n\nfunction renderTokenEconomicsCached(cache: DashboardCache): void {\n const costs = cache.costs;\n\n if (!costs) {\n writeLine(` ${bold}Token Economics${RESET} ${colors.dim}(no data)${RESET}`);\n writeLine(` ${colors.dim}Set LANGFUSE_PUBLIC_KEY & LANGFUSE_SECRET_KEY for cost tracking${RESET}`);\n writeLine();\n return;\n }\n\n writeLine(` ${bold}Token Economics${RESET} ${colors.dim}(last 100 calls)${RESET}`);\n writeLine();\n\n // Budget bar\n const barWidth = 32;\n const costBar = formatCostBar(costs.usedPercent, barWidth);\n writeLine(` ${colors.dim}Budget $${costs.dailyBudget}${RESET} [${costBar}] ${costs.usedPercent.toFixed(1)}%`);\n writeLine(` ${colors.green}$${costs.totalCost.toFixed(2)}${RESET} used ${colors.dim}│${RESET} ${colors.cyan}$${costs.idleBudget.toFixed(2)}${RESET} idle`);\n writeLine();\n\n // Rate limits (simplified - skip the async fetch)\n const tier = parseInt(process.env.ANTHROPIC_TIER || '4', 10);\n writeLine(` ${colors.dim}Rate Limits (Tier ${tier})${RESET}`);\n writeLine();\n\n // Cost projections - extrapolate based on hours elapsed today\n const now = new Date();\n const hoursElapsed = Math.max(now.getHours() + now.getMinutes() / 60, 1);\n const hourlyRate = costs.totalCost / hoursElapsed;\n const dailyProjection = hourlyRate * 24;\n const monthlyProjection = dailyProjection * 30;\n\n writeLine(` ${colors.dim}Projections${RESET}`);\n const projColor = dailyProjection > costs.dailyBudget ? colors.red : colors.green;\n writeLine(` ${colors.dim}Daily:${RESET} ${projColor}~$${dailyProjection.toFixed(2)}${RESET}${colors.dim}/${costs.dailyBudget}${RESET} ${colors.dim}Monthly:${RESET} ${colors.cyan}~$${monthlyProjection.toFixed(0)}${RESET}`);\n\n if (dailyProjection > costs.dailyBudget * 0.8) {\n writeLine(` ${colors.yellow}⚠${RESET} ${colors.yellow}Projected to exceed daily budget${RESET}`);\n }\n if (costs.usedPercent > 80) {\n writeLine(` ${colors.red}⚠${RESET} ${colors.red}${costs.usedPercent.toFixed(0)}% of daily budget used${RESET}`);\n }\n writeLine();\n}\n\nfunction renderInfrastructureCached(cache: DashboardCache): void {\n const stats = cache.bridgeStats;\n\n if (!stats) {\n writeLine(` ${bold}Infrastructure${RESET} ${colors.dim}(bridge offline)${RESET}`);\n writeLine(` ${colors.dim}Start with: cd docker && docker-compose up -d${RESET}`);\n writeLine();\n return;\n }\n\n writeLine(` ${bold}Infrastructure${RESET} ${colors.dim}(${stats.source})${RESET}`);\n writeLine();\n\n // Health status row\n const pgStatus = stats.health.postgres === 'connected' ? `${colors.green}●${RESET}` : `${colors.red}●${RESET}`;\n const redisStatus = stats.health.redis === 'connected' ? `${colors.green}●${RESET}` : stats.health.redis === 'disabled' ? `${colors.dim}○${RESET}` : `${colors.red}●${RESET}`;\n // OTel pipeline is working if we have data flowing (postgres connected + generations > 0)\n const otelWorking = stats.health.postgres === 'connected' && stats.today.generations > 0;\n const otelStatus = otelWorking ? `${colors.green}●${RESET}` : `${colors.dim}○${RESET}`;\n\n writeLine(` ${pgStatus} postgres ${redisStatus} redis ${otelStatus} otel`);\n writeLine();\n\n // Today's real-time metrics\n if (stats.today.generations > 0 || stats.today.costUsd > 0) {\n const costColor = stats.budget.usedPct > 80 ? colors.red : stats.budget.usedPct > 50 ? colors.yellow : colors.green;\n writeLine(` ${colors.dim}Today:${RESET} ${colors.cyan}${stats.today.generations}${RESET}${colors.dim} calls${RESET} ${costColor}$${stats.today.costUsd.toFixed(2)}${RESET}${colors.dim}/$${stats.budget.daily}${RESET} ${colors.dim}${formatK(stats.today.inputTokens)}+${formatK(stats.today.outputTokens)} tokens${RESET}`);\n\n // Model breakdown\n if (stats.byModel && stats.byModel.length > 0) {\n const modelLine = stats.byModel.map(m => {\n const shortName = m.model.includes('opus') ? 'opus' :\n m.model.includes('sonnet') ? 'sonnet' :\n m.model.includes('haiku') ? 'haiku' : m.model.slice(0, 10);\n return `${colors.dim}${shortName}${RESET} ${colors.cyan}${m.generations}${RESET}`;\n }).join(' ');\n writeLine(` ${colors.dim}Models:${RESET} ${modelLine}`);\n }\n }\n\n // Week totals\n if (stats.week && stats.week.generations > 0) {\n const weekModelLine = stats.week.byModel?.map(m => {\n const shortName = m.model.includes('opus') ? 'opus' :\n m.model.includes('sonnet') ? 'sonnet' :\n m.model.includes('haiku') ? 'haiku' : m.model.slice(0, 10);\n return `${colors.dim}${shortName}${RESET} ${colors.purple}$${m.costUsd.toFixed(0)}${RESET}`;\n }).join(' ') || '';\n writeLine(` ${colors.dim}Week:${RESET} ${colors.cyan}${stats.week.generations}${RESET}${colors.dim} calls${RESET} ${colors.purple}$${stats.week.costUsd.toFixed(2)}${RESET} ${weekModelLine}`);\n }\n\n writeLine();\n}\n\nasync function saveSnapshotCached(\n squadData: SquadMetrics[],\n cache: DashboardCache,\n baseDir: string | null\n): Promise<void> {\n // Use cached dbAvailable check - don't make another slow connection attempt\n if (!cache.dbAvailable) return;\n\n const { gitStats, ghStats, costs } = cache;\n\n // Build squad snapshot data\n const squadsData: SquadSnapshotData[] = squadData.map(s => ({\n name: s.name,\n commits: s.github?.commits || 0,\n prsOpened: s.github?.prsOpened || 0,\n prsMerged: s.github?.prsMerged || 0,\n issuesClosed: s.github?.issuesClosed || 0,\n issuesOpen: s.github?.issuesOpen || 0,\n goalsActive: s.goals.filter(g => !g.completed).length,\n goalsTotal: s.goals.length,\n progress: s.goalProgress,\n }));\n\n // Build authors data\n const authorsData = gitStats\n ? Array.from(gitStats.commitsByAuthor.entries())\n .sort((a, b) => b[1] - a[1])\n .slice(0, 10)\n .map(([name, commits]) => ({ name, commits }))\n : [];\n\n // Build repos data\n const reposData = gitStats\n ? Array.from(gitStats.commitsByRepo.entries())\n .sort((a, b) => b[1] - a[1])\n .map(([name, commits]) => ({ name, commits }))\n : [];\n\n // Calculate totals\n const totalInputTokens = costs?.bySquad.reduce((sum, s) => sum + s.inputTokens, 0) || 0;\n const totalOutputTokens = costs?.bySquad.reduce((sum, s) => sum + s.outputTokens, 0) || 0;\n const overallProgress = squadData.length > 0\n ? Math.round(squadData.reduce((sum, s) => sum + s.goalProgress, 0) / squadData.length)\n : 0;\n\n const snapshot: DashboardSnapshot = {\n totalSquads: squadData.length,\n totalCommits: gitStats?.totalCommits || 0,\n totalPrsMerged: ghStats?.prsMerged || 0,\n totalIssuesClosed: ghStats?.issuesClosed || 0,\n totalIssuesOpen: ghStats?.issuesOpen || 0,\n goalProgressPct: overallProgress,\n costUsd: costs?.totalCost || 0,\n dailyBudgetUsd: costs?.dailyBudget || 50,\n inputTokens: totalInputTokens,\n outputTokens: totalOutputTokens,\n commits30d: gitStats?.totalCommits || 0,\n avgCommitsPerDay: gitStats?.avgCommitsPerDay || 0,\n activeDays: gitStats?.activeDays || 0,\n peakCommits: gitStats?.peakDay?.count || 0,\n peakDate: gitStats?.peakDay?.date || null,\n squadsData,\n authorsData,\n reposData,\n };\n\n // Save with timeout - don't block the CLI exit\n const saveTimeout = new Promise<void>(resolve => setTimeout(resolve, 2000));\n await Promise.race([saveDashboardSnapshot(snapshot), saveTimeout]);\n}\n\n// Priority keywords that indicate high priority goals\nconst P0_KEYWORDS = ['revenue', 'first', 'launch', 'publish', 'ship', 'critical', 'urgent'];\nconst P1_KEYWORDS = ['track', 'establish', 'identify', 'define', 'fix'];\n\nfunction inferPriority(goal: string): 'P0' | 'P1' | 'P2' {\n const lower = goal.toLowerCase();\n if (P0_KEYWORDS.some(k => lower.includes(k))) return 'P0';\n if (P1_KEYWORDS.some(k => lower.includes(k))) return 'P1';\n return 'P2';\n}\n\nasync function renderCeoReport(squadsDir: string): Promise<void> {\n const squadNames = listSquads(squadsDir);\n const allGoals: { squad: string; goal: Goal; priority: 'P0' | 'P1' | 'P2' }[] = [];\n const blockers: string[] = [];\n let activeSquads = 0;\n let staleSquads = 0;\n\n for (const name of squadNames) {\n const squad = loadSquad(name);\n if (!squad) continue;\n\n const lastActivity = getLastActivityDate(name);\n const activeGoals = squad.goals.filter(g => !g.completed);\n\n // Check for blockers\n if (activeGoals.length === 0) {\n blockers.push(`${name}: No active goals`);\n } else if (lastActivity.includes('w') || lastActivity === '—') {\n blockers.push(`${name}: Stale (${lastActivity})`);\n staleSquads++;\n } else {\n activeSquads++;\n }\n\n // Collect goals with inferred priority\n for (const goal of activeGoals) {\n allGoals.push({\n squad: name,\n goal,\n priority: inferPriority(goal.description),\n });\n }\n }\n\n // Sort by priority\n allGoals.sort((a, b) => {\n const order = { P0: 0, P1: 1, P2: 2 };\n return order[a.priority] - order[b.priority];\n });\n\n const p0Goals = allGoals.filter(g => g.priority === 'P0');\n const p1Goals = allGoals.filter(g => g.priority === 'P1');\n\n // Render\n writeLine();\n writeLine(` ${gradient('squads')} ${colors.dim}CEO Report${RESET}`);\n writeLine(` ${colors.dim}${new Date().toISOString().split('T')[0]}${RESET}`);\n writeLine();\n\n // Key metrics\n const w = { label: 20, value: 12 };\n const tableWidth = w.label + w.value + 4;\n\n writeLine(` ${colors.purple}${box.topLeft}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.topRight}${RESET}`);\n writeLine(` ${colors.purple}${box.vertical}${RESET} ${bold}${padEnd('METRIC', w.label)}${RESET}${bold}VALUE${RESET} ${colors.purple}${box.vertical}${RESET}`);\n writeLine(` ${colors.purple}${box.teeRight}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.teeLeft}${RESET}`);\n\n writeLine(` ${colors.purple}${box.vertical}${RESET} ${padEnd('Active Squads', w.label)}${colors.green}${padEnd(`${activeSquads}/${squadNames.length}`, w.value)}${RESET}${colors.purple}${box.vertical}${RESET}`);\n writeLine(` ${colors.purple}${box.vertical}${RESET} ${padEnd('P0 Goals', w.label)}${colors.red}${padEnd(String(p0Goals.length), w.value)}${RESET}${colors.purple}${box.vertical}${RESET}`);\n writeLine(` ${colors.purple}${box.vertical}${RESET} ${padEnd('P1 Goals', w.label)}${colors.yellow}${padEnd(String(p1Goals.length), w.value)}${RESET}${colors.purple}${box.vertical}${RESET}`);\n writeLine(` ${colors.purple}${box.vertical}${RESET} ${padEnd('Blockers', w.label)}${blockers.length > 0 ? colors.red : colors.green}${padEnd(String(blockers.length), w.value)}${RESET}${colors.purple}${box.vertical}${RESET}`);\n\n // Token Economics (add to metrics table)\n const costs = await fetchCostSummary(100);\n if (costs) {\n const spendStr = `$${costs.totalCost.toFixed(2)} / $${costs.dailyBudget}`;\n writeLine(` ${colors.purple}${box.vertical}${RESET} ${padEnd('Daily Spend', w.label)}${colors.green}${padEnd(spendStr, w.value)}${RESET}${colors.purple}${box.vertical}${RESET}`);\n }\n\n writeLine(` ${colors.purple}${box.bottomLeft}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.bottomRight}${RESET}`);\n writeLine();\n\n // Top Priorities (P0)\n if (p0Goals.length > 0) {\n writeLine(` ${bold}${colors.red}P0${RESET} ${bold}Priorities${RESET} ${colors.dim}(revenue/launch critical)${RESET}`);\n writeLine();\n for (const { squad, goal } of p0Goals.slice(0, 5)) {\n writeLine(` ${icons.error} ${colors.cyan}${squad}${RESET} ${goal.description}`);\n if (goal.progress) {\n writeLine(` ${colors.dim}└ ${goal.progress}${RESET}`);\n }\n }\n writeLine();\n }\n\n // P1 Goals\n if (p1Goals.length > 0) {\n writeLine(` ${bold}${colors.yellow}P1${RESET} ${bold}Important${RESET} ${colors.dim}(tracking/foundations)${RESET}`);\n writeLine();\n for (const { squad, goal } of p1Goals.slice(0, 3)) {\n writeLine(` ${icons.warning} ${colors.cyan}${squad}${RESET} ${truncate(goal.description, 50)}`);\n }\n if (p1Goals.length > 3) {\n writeLine(` ${colors.dim} +${p1Goals.length - 3} more${RESET}`);\n }\n writeLine();\n }\n\n // Blockers\n if (blockers.length > 0) {\n writeLine(` ${bold}Blockers${RESET}`);\n writeLine();\n for (const blocker of blockers.slice(0, 3)) {\n writeLine(` ${icons.error} ${colors.red}${blocker}${RESET}`);\n }\n writeLine();\n }\n\n // Next Steps\n writeLine(` ${bold}Next Steps${RESET}`);\n writeLine();\n if (p0Goals.length > 0) {\n writeLine(` ${icons.active} Focus on P0: ${colors.cyan}${p0Goals[0].squad}${RESET} - ${truncate(p0Goals[0].goal.description, 40)}`);\n }\n if (blockers.length > 0) {\n writeLine(` ${icons.warning} Unblock: ${colors.yellow}${blockers[0]}${RESET}`);\n }\n if (staleSquads > 0) {\n writeLine(` ${icons.progress} Revive ${staleSquads} stale squad(s)`);\n }\n writeLine();\n\n // Commands\n writeLine(` ${colors.dim}$${RESET} squads dash ${colors.dim}Full operational view${RESET}`);\n writeLine(` ${colors.dim}$${RESET} squads goal list ${colors.dim}All active goals${RESET}`);\n writeLine();\n}\n\nfunction renderHistoricalTrendsCached(cache: DashboardCache): void {\n if (!cache.dbAvailable) return;\n\n const history = cache.history;\n if (history.length < 2) return; // Need at least 2 data points\n\n writeLine(` ${bold}Usage Trends${RESET} ${colors.dim}(${history.length}d history)${RESET}`);\n writeLine();\n\n // Daily cost sparkline (most recent first, so reverse for left-to-right)\n const dailyCosts = history.map(h => h.costUsd).reverse();\n const costSparkStr = sparkline(dailyCosts);\n const totalSpend = dailyCosts.reduce((sum, c) => sum + c, 0);\n const avgDaily = totalSpend / dailyCosts.length;\n\n writeLine(` ${colors.dim}Cost:${RESET} ${costSparkStr} ${colors.green}$${totalSpend.toFixed(2)}${RESET} total ${colors.dim}($${avgDaily.toFixed(2)}/day avg)${RESET}`);\n\n // Token usage trend\n const inputTokens = history.map(h => h.inputTokens).reverse();\n const totalInput = inputTokens.reduce((sum, t) => sum + t, 0);\n const tokenSparkStr = sparkline(inputTokens);\n\n writeLine(` ${colors.dim}Tokens:${RESET} ${tokenSparkStr} ${colors.cyan}${formatK(totalInput)}${RESET} input ${colors.dim}(${formatK(Math.round(totalInput / inputTokens.length))}/day)${RESET}`);\n\n // Goal progress trend\n const goalProgress = history.map(h => h.goalProgressPct).reverse();\n const latestProgress = goalProgress[goalProgress.length - 1] || 0;\n const earliestProgress = goalProgress[0] || 0;\n const progressDelta = latestProgress - earliestProgress;\n const progressColor = progressDelta > 0 ? colors.green : progressDelta < 0 ? colors.red : colors.dim;\n const progressSign = progressDelta > 0 ? '+' : '';\n\n writeLine(` ${colors.dim}Goals:${RESET} ${sparkline(goalProgress)} ${colors.purple}${latestProgress}%${RESET} ${progressColor}${progressSign}${progressDelta.toFixed(0)}%${RESET}${colors.dim} vs start${RESET}`);\n writeLine();\n}\n\nfunction renderInsightsCached(cache: DashboardCache): void {\n const insights = cache.insights;\n\n if (!insights || insights.source === 'none' || insights.taskMetrics.length === 0) {\n return;\n }\n\n writeLine(` ${bold}Agent Insights${RESET} ${colors.dim}(${insights.days}d)${RESET}`);\n writeLine();\n\n // Task completion metrics (aggregated)\n const totals = insights.taskMetrics.reduce(\n (acc, t) => ({\n tasks: acc.tasks + t.tasksTotal,\n completed: acc.completed + t.tasksCompleted,\n failed: acc.failed + t.tasksFailed,\n retries: acc.retries + t.totalRetries,\n withRetries: acc.withRetries + t.tasksWithRetries,\n }),\n { tasks: 0, completed: 0, failed: 0, retries: 0, withRetries: 0 }\n );\n\n if (totals.tasks > 0) {\n const successRate = totals.tasks > 0 ? ((totals.completed / totals.tasks) * 100).toFixed(0) : '0';\n const successColor = parseInt(successRate) >= 80 ? colors.green : parseInt(successRate) >= 60 ? colors.yellow : colors.red;\n\n writeLine(` ${colors.dim}Tasks:${RESET} ${colors.green}${totals.completed}${RESET}${colors.dim}/${totals.tasks} completed${RESET} ${successColor}${successRate}%${RESET}${colors.dim} success${RESET} ${colors.red}${totals.failed}${RESET}${colors.dim} failed${RESET}`);\n\n if (totals.retries > 0) {\n const retryRate = totals.tasks > 0 ? ((totals.withRetries / totals.tasks) * 100).toFixed(0) : '0';\n const retryColor = parseInt(retryRate) > 30 ? colors.red : parseInt(retryRate) > 15 ? colors.yellow : colors.green;\n writeLine(` ${colors.dim}Retries:${RESET} ${retryColor}${totals.retries}${RESET}${colors.dim} total${RESET} ${retryColor}${retryRate}%${RESET}${colors.dim} of tasks needed retry${RESET}`);\n }\n }\n\n // Skip quality metrics for brevity in cached version\n writeLine();\n}\n","/**\n * Cost tracking via Squads Bridge (postgres) or Langfuse\n * Primary: Squads Bridge API → PostgreSQL\n * Fallback: Langfuse API (if bridge unavailable)\n */\n\ninterface SquadCosts {\n squad: string;\n calls: number;\n inputTokens: number;\n outputTokens: number;\n cachedTokens: number;\n cost: number;\n models: Record<string, number>;\n}\n\nexport interface CostSummary {\n totalCost: number;\n dailyBudget: number;\n usedPercent: number;\n idleBudget: number;\n totalCalls: number;\n dailyCallLimit: number;\n callsPercent: number;\n totalCachedTokens: number;\n totalInputTokens: number;\n cacheHitRate: number;\n bySquad: SquadCosts[];\n source: 'postgres' | 'langfuse' | 'none';\n}\n\n// Model pricing (per 1M tokens)\nconst MODEL_PRICING: Record<string, { input: number; output: number }> = {\n 'claude-opus-4-5-20251101': { input: 15.0, output: 75.0 },\n 'claude-sonnet-4-20250514': { input: 3.0, output: 15.0 },\n 'claude-haiku-4-5-20251001': { input: 0.80, output: 4.0 },\n 'claude-3-5-sonnet-20241022': { input: 3.0, output: 15.0 },\n 'claude-3-5-haiku-20241022': { input: 0.80, output: 4.0 },\n default: { input: 3.0, output: 15.0 },\n};\n\nconst DEFAULT_DAILY_BUDGET = 200.0;\nconst DEFAULT_DAILY_CALL_LIMIT = 1000; // Default API call limit per day\nconst BRIDGE_URL = process.env.SQUADS_BRIDGE_URL || 'http://localhost:8088';\nconst FETCH_TIMEOUT_MS = 2000; // 2 second timeout for all fetch calls\n\n/**\n * Fetch with timeout to prevent hanging when services are down\n */\nasync function fetchWithTimeout(url: string, options: RequestInit = {}, timeoutMs = FETCH_TIMEOUT_MS): Promise<Response> {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeoutMs);\n\n try {\n const response = await fetch(url, { ...options, signal: controller.signal });\n clearTimeout(timeoutId);\n return response;\n } catch (error) {\n clearTimeout(timeoutId);\n throw error;\n }\n}\n\nfunction calcCost(model: string, inputTokens: number, outputTokens: number): number {\n const pricing = MODEL_PRICING[model] || MODEL_PRICING.default;\n return (inputTokens / 1_000_000) * pricing.input + (outputTokens / 1_000_000) * pricing.output;\n}\n\n/**\n * Fetch cost summary from Squads Bridge (postgres)\n */\nasync function fetchFromBridge(period: 'day' | 'week' | 'month' = 'day'): Promise<CostSummary | null> {\n try {\n const response = await fetchWithTimeout(`${BRIDGE_URL}/api/cost/summary?period=${period}`, {\n headers: { 'Content-Type': 'application/json' },\n });\n\n if (!response.ok) {\n return null;\n }\n\n const data = await response.json() as { totals?: { cost_usd?: number }; by_squad?: Record<string, unknown>[] };\n const dailyBudget = parseFloat(process.env.SQUADS_DAILY_BUDGET || '') || DEFAULT_DAILY_BUDGET;\n const totalCost = data.totals?.cost_usd || 0;\n\n const bySquad: SquadCosts[] = (data.by_squad || []).map((s: Record<string, unknown>) => ({\n squad: s.squad as string,\n calls: (s.generations as number) || 0,\n inputTokens: (s.input_tokens as number) || 0,\n outputTokens: (s.output_tokens as number) || 0,\n cachedTokens: (s.cached_tokens as number) || 0,\n cost: (s.cost_usd as number) || 0,\n models: {},\n }));\n\n const totalCalls = bySquad.reduce((sum, s) => sum + s.calls, 0);\n const dailyCallLimit = parseFloat(process.env.SQUADS_DAILY_CALL_LIMIT || '') || DEFAULT_DAILY_CALL_LIMIT;\n const totalCachedTokens = bySquad.reduce((sum, s) => sum + s.cachedTokens, 0);\n const totalInputTokens = bySquad.reduce((sum, s) => sum + s.inputTokens, 0);\n const totalAllInput = totalInputTokens + totalCachedTokens;\n const cacheHitRate = totalAllInput > 0 ? (totalCachedTokens / totalAllInput) * 100 : 0;\n\n return {\n totalCost,\n dailyBudget,\n usedPercent: (totalCost / dailyBudget) * 100,\n idleBudget: dailyBudget - totalCost,\n totalCalls,\n dailyCallLimit,\n callsPercent: (totalCalls / dailyCallLimit) * 100,\n totalCachedTokens,\n totalInputTokens,\n cacheHitRate,\n bySquad,\n source: 'postgres',\n };\n } catch {\n return null;\n }\n}\n\n/**\n * Fetch cost summary from Langfuse API (fallback)\n */\nasync function fetchFromLangfuse(limit = 100): Promise<CostSummary | null> {\n const publicKey = process.env.LANGFUSE_PUBLIC_KEY;\n const secretKey = process.env.LANGFUSE_SECRET_KEY;\n const host = process.env.LANGFUSE_HOST || process.env.LANGFUSE_BASE_URL || 'https://us.cloud.langfuse.com';\n\n if (!publicKey || !secretKey) {\n return null;\n }\n\n try {\n const auth = Buffer.from(`${publicKey}:${secretKey}`).toString('base64');\n const url = `${host}/api/public/observations?limit=${limit}`;\n\n const response = await fetchWithTimeout(url, {\n headers: {\n Authorization: `Basic ${auth}`,\n 'Content-Type': 'application/json',\n },\n });\n\n if (!response.ok) {\n return null;\n }\n\n interface LangfuseObs {\n type?: string;\n model?: string;\n metadata?: { squad?: string };\n usage?: { input?: number; output?: number };\n }\n const data = await response.json() as { data?: LangfuseObs[] };\n const observations = data.data || [];\n\n // Group by squad\n const bySquad: Record<string, SquadCosts> = {};\n\n for (const obs of observations) {\n if (obs.type !== 'GENERATION') continue;\n\n const metadata = obs.metadata || {};\n const squad = metadata.squad || 'unknown';\n const model = obs.model || 'unknown';\n const usage = obs.usage || {};\n\n const inputTokens = usage.input || 0;\n const outputTokens = usage.output || 0;\n const cost = calcCost(model, inputTokens, outputTokens);\n\n if (!bySquad[squad]) {\n bySquad[squad] = {\n squad,\n calls: 0,\n inputTokens: 0,\n outputTokens: 0,\n cachedTokens: 0,\n cost: 0,\n models: {},\n };\n }\n\n bySquad[squad].calls += 1;\n bySquad[squad].inputTokens += inputTokens;\n bySquad[squad].outputTokens += outputTokens;\n bySquad[squad].cost += cost;\n bySquad[squad].models[model] = (bySquad[squad].models[model] || 0) + 1;\n }\n\n const squadList = Object.values(bySquad).sort((a, b) => b.cost - a.cost);\n const totalCost = squadList.reduce((sum, s) => sum + s.cost, 0);\n const dailyBudget = parseFloat(process.env.SQUADS_DAILY_BUDGET || '') || DEFAULT_DAILY_BUDGET;\n\n const totalCalls = squadList.reduce((sum, s) => sum + s.calls, 0);\n const dailyCallLimit = parseFloat(process.env.SQUADS_DAILY_CALL_LIMIT || '') || DEFAULT_DAILY_CALL_LIMIT;\n const totalCachedTokens = squadList.reduce((sum, s) => sum + s.cachedTokens, 0);\n const totalInputTokens = squadList.reduce((sum, s) => sum + s.inputTokens, 0);\n const totalAllInput = totalInputTokens + totalCachedTokens;\n const cacheHitRate = totalAllInput > 0 ? (totalCachedTokens / totalAllInput) * 100 : 0;\n\n return {\n totalCost,\n dailyBudget,\n usedPercent: (totalCost / dailyBudget) * 100,\n idleBudget: dailyBudget - totalCost,\n totalCalls,\n dailyCallLimit,\n callsPercent: (totalCalls / dailyCallLimit) * 100,\n totalCachedTokens,\n totalInputTokens,\n cacheHitRate,\n bySquad: squadList,\n source: 'langfuse',\n };\n } catch {\n return null;\n }\n}\n\n/**\n * Fetch cost summary - tries postgres first, falls back to Langfuse\n */\nexport async function fetchCostSummary(\n limit = 100,\n period: 'day' | 'week' | 'month' = 'day'\n): Promise<CostSummary | null> {\n // Try postgres (via bridge) first\n const bridgeResult = await fetchFromBridge(period);\n if (bridgeResult) {\n return bridgeResult;\n }\n\n // Fall back to Langfuse\n const langfuseResult = await fetchFromLangfuse(limit);\n if (langfuseResult) {\n return langfuseResult;\n }\n\n // No data source available\n const defaultBudget = parseFloat(process.env.SQUADS_DAILY_BUDGET || '') || DEFAULT_DAILY_BUDGET;\n return {\n totalCost: 0,\n dailyBudget: defaultBudget,\n usedPercent: 0,\n idleBudget: defaultBudget,\n totalCalls: 0,\n dailyCallLimit: DEFAULT_DAILY_CALL_LIMIT,\n callsPercent: 0,\n totalCachedTokens: 0,\n totalInputTokens: 0,\n cacheHitRate: 0,\n bySquad: [],\n source: 'none',\n };\n}\n\nexport function formatCostBar(usedPercent: number, width = 20): string {\n const filled = Math.min(Math.round((usedPercent / 100) * width), width);\n const empty = width - filled;\n return '█'.repeat(filled) + '░'.repeat(empty);\n}\n\n/**\n * Bridge stats from /stats endpoint (Redis real-time or Postgres fallback)\n */\nexport interface BridgeStats {\n status: string;\n source: 'redis' | 'postgres' | 'none';\n today: {\n generations: number;\n inputTokens: number;\n outputTokens: number;\n costUsd: number;\n };\n week?: {\n generations: number;\n inputTokens: number;\n outputTokens: number;\n costUsd: number;\n byModel?: Array<{\n model: string;\n generations: number;\n costUsd: number;\n }>;\n };\n budget: {\n daily: number;\n used: number;\n remaining: number;\n usedPct: number;\n };\n bySquad: Array<{\n squad: string;\n costUsd: number;\n generations: number;\n }>;\n byModel?: Array<{\n model: string;\n generations: number;\n costUsd: number;\n }>;\n health: {\n postgres: string;\n redis: string;\n langfuse: string;\n };\n}\n\n/**\n * Fetch real-time stats from Squads Bridge\n */\nexport async function fetchBridgeStats(): Promise<BridgeStats | null> {\n try {\n // Fetch /stats for real-time data\n const statsResponse = await fetchWithTimeout(`${BRIDGE_URL}/stats`, {\n headers: { 'Content-Type': 'application/json' },\n });\n\n if (!statsResponse.ok) {\n return null;\n }\n\n interface StatsData {\n status?: string;\n source?: string;\n today?: {\n generations?: number;\n input_tokens?: number;\n output_tokens?: number;\n cost_usd?: number;\n };\n budget?: {\n daily?: number;\n used?: number;\n remaining?: number;\n used_pct?: number;\n };\n by_squad?: Array<{\n squad?: string;\n cost_usd?: number;\n generations?: number;\n }>;\n }\n\n const stats = await statsResponse.json() as StatsData;\n\n // Fetch /health for connection statuses\n const healthResponse = await fetchWithTimeout(`${BRIDGE_URL}/health`, {\n headers: { 'Content-Type': 'application/json' },\n });\n\n interface HealthData {\n postgres?: string;\n redis?: string;\n langfuse?: string;\n }\n\n const health = healthResponse.ok ? await healthResponse.json() as HealthData : {};\n\n // Fetch cost summaries for model breakdown (day and week in parallel)\n interface CostData {\n totals?: {\n generations?: number;\n input_tokens?: number;\n output_tokens?: number;\n cost_usd?: number;\n };\n by_model?: Array<{\n model?: string;\n generations?: number;\n cost_usd?: number;\n }>;\n }\n\n const [costResponse, weekResponse] = await Promise.all([\n fetchWithTimeout(`${BRIDGE_URL}/api/cost/summary?period=day`, {\n headers: { 'Content-Type': 'application/json' },\n }),\n fetchWithTimeout(`${BRIDGE_URL}/api/cost/summary?period=week`, {\n headers: { 'Content-Type': 'application/json' },\n }),\n ]);\n\n const costData = costResponse.ok ? await costResponse.json() as CostData : {};\n const weekData = weekResponse.ok ? await weekResponse.json() as CostData : {};\n\n return {\n status: stats.status || 'unknown',\n source: (stats.source as 'redis' | 'postgres' | 'none') || 'none',\n today: {\n generations: stats.today?.generations || 0,\n inputTokens: stats.today?.input_tokens || 0,\n outputTokens: stats.today?.output_tokens || 0,\n costUsd: stats.today?.cost_usd || 0,\n },\n week: weekData.totals ? {\n generations: weekData.totals.generations || 0,\n inputTokens: weekData.totals.input_tokens || 0,\n outputTokens: weekData.totals.output_tokens || 0,\n costUsd: weekData.totals.cost_usd || 0,\n byModel: (weekData.by_model || []).map(m => ({\n model: m.model || 'unknown',\n generations: m.generations || 0,\n costUsd: m.cost_usd || 0,\n })),\n } : undefined,\n budget: {\n daily: stats.budget?.daily || DEFAULT_DAILY_BUDGET,\n used: stats.budget?.used || 0,\n remaining: stats.budget?.remaining || DEFAULT_DAILY_BUDGET,\n usedPct: stats.budget?.used_pct || 0,\n },\n bySquad: (stats.by_squad || []).map(s => ({\n squad: s.squad || 'unknown',\n costUsd: s.cost_usd || 0,\n generations: s.generations || 0,\n })),\n byModel: (costData.by_model || []).map(m => ({\n model: m.model || 'unknown',\n generations: m.generations || 0,\n costUsd: m.cost_usd || 0,\n })),\n health: {\n postgres: health.postgres || 'unknown',\n redis: health.redis || 'unknown',\n langfuse: health.langfuse || 'unknown',\n },\n };\n } catch {\n return null;\n }\n}\n\n/**\n * Rate limit data from Anthropic API headers\n */\nexport interface RateLimitInfo {\n model: string;\n requestsLimit: number;\n requestsRemaining: number;\n requestsReset?: string;\n tokensLimit: number;\n tokensRemaining: number;\n tokensReset?: string;\n inputTokensLimit?: number;\n inputTokensRemaining?: number;\n outputTokensLimit?: number;\n outputTokensRemaining?: number;\n capturedAt: string;\n}\n\nexport interface RateLimits {\n limits: Record<string, RateLimitInfo>;\n source: 'proxy' | 'none';\n}\n\n/**\n * Fetch real rate limits from the Anthropic proxy (via bridge)\n */\nexport async function fetchRateLimits(): Promise<RateLimits> {\n try {\n const response = await fetchWithTimeout(`${BRIDGE_URL}/api/rate-limits`, {\n headers: { 'Content-Type': 'application/json' },\n });\n\n if (!response.ok) {\n return { limits: {}, source: 'none' };\n }\n\n interface RateLimitResponse {\n rate_limits?: Record<string, {\n model?: string;\n requests_limit?: number;\n requests_remaining?: number;\n requests_reset?: string;\n tokens_limit?: number;\n tokens_remaining?: number;\n tokens_reset?: string;\n input_tokens_limit?: number;\n input_tokens_remaining?: number;\n output_tokens_limit?: number;\n output_tokens_remaining?: number;\n captured_at?: string;\n }>;\n }\n\n const data = await response.json() as RateLimitResponse;\n const rateLimits = data.rate_limits || {};\n\n const limits: Record<string, RateLimitInfo> = {};\n for (const [key, value] of Object.entries(rateLimits)) {\n limits[key] = {\n model: value.model || key,\n requestsLimit: value.requests_limit || 0,\n requestsRemaining: value.requests_remaining || 0,\n requestsReset: value.requests_reset,\n tokensLimit: value.tokens_limit || 0,\n tokensRemaining: value.tokens_remaining || 0,\n tokensReset: value.tokens_reset,\n inputTokensLimit: value.input_tokens_limit,\n inputTokensRemaining: value.input_tokens_remaining,\n outputTokensLimit: value.output_tokens_limit,\n outputTokensRemaining: value.output_tokens_remaining,\n capturedAt: value.captured_at || new Date().toISOString(),\n };\n }\n\n return { limits, source: 'proxy' };\n } catch {\n return { limits: {}, source: 'none' };\n }\n}\n\n/**\n * Task and quality insights\n */\nexport interface TaskMetrics {\n squad: string;\n tasksTotal: number;\n tasksCompleted: number;\n tasksFailed: number;\n successRate: number;\n totalRetries: number;\n tasksWithRetries: number;\n avgRetries: number;\n avgDurationMs: number;\n avgTokens: number;\n avgCost: number;\n avgContextPct: number;\n maxContextTokens: number;\n}\n\nexport interface ToolMetrics {\n toolName: string;\n usageCount: number;\n successRate: number;\n avgDurationMs: number;\n}\n\nexport interface QualityMetrics {\n squad: string;\n feedbackCount: number;\n avgQuality: number;\n helpfulPct: number;\n fixRequiredPct: number;\n}\n\nexport interface Insights {\n period: string;\n days: number;\n taskMetrics: TaskMetrics[];\n qualityMetrics: QualityMetrics[];\n topTools: ToolMetrics[];\n toolFailureRate: number;\n source: 'bridge' | 'none';\n}\n\n/**\n * Fetch insights from the bridge\n */\nexport async function fetchInsights(period: 'day' | 'week' | 'month' = 'week'): Promise<Insights> {\n try {\n const response = await fetchWithTimeout(`${BRIDGE_URL}/api/insights?period=${period}`, {\n headers: { 'Content-Type': 'application/json' },\n });\n\n if (!response.ok) {\n return {\n period,\n days: period === 'day' ? 1 : period === 'week' ? 7 : 30,\n taskMetrics: [],\n qualityMetrics: [],\n topTools: [],\n toolFailureRate: 0,\n source: 'none',\n };\n }\n\n interface InsightsResponse {\n period: string;\n days: number;\n task_metrics?: Array<{\n squad: string;\n tasks_total: number;\n tasks_completed: number;\n tasks_failed: number;\n success_rate: number;\n total_retries: number;\n tasks_with_retries: number;\n avg_retries: number;\n avg_duration_ms: number;\n avg_tokens: number;\n avg_cost: number;\n avg_context_pct: number;\n max_context_tokens: number;\n }>;\n quality_metrics?: Array<{\n squad: string;\n feedback_count: number;\n avg_quality: number;\n helpful_pct: number;\n fix_required_pct: number;\n }>;\n top_tools?: Array<{\n tool_name: string;\n usage_count: number;\n success_rate: number;\n avg_duration_ms: number;\n }>;\n tool_failure_rate?: number;\n }\n\n const data = await response.json() as InsightsResponse;\n\n return {\n period: data.period || period,\n days: data.days || 7,\n taskMetrics: (data.task_metrics || []).map(t => ({\n squad: t.squad,\n tasksTotal: t.tasks_total || 0,\n tasksCompleted: t.tasks_completed || 0,\n tasksFailed: t.tasks_failed || 0,\n successRate: t.success_rate || 0,\n totalRetries: t.total_retries || 0,\n tasksWithRetries: t.tasks_with_retries || 0,\n avgRetries: t.avg_retries || 0,\n avgDurationMs: t.avg_duration_ms || 0,\n avgTokens: t.avg_tokens || 0,\n avgCost: t.avg_cost || 0,\n avgContextPct: t.avg_context_pct || 0,\n maxContextTokens: t.max_context_tokens || 0,\n })),\n qualityMetrics: (data.quality_metrics || []).map(q => ({\n squad: q.squad,\n feedbackCount: q.feedback_count || 0,\n avgQuality: q.avg_quality || 0,\n helpfulPct: q.helpful_pct || 0,\n fixRequiredPct: q.fix_required_pct || 0,\n })),\n topTools: (data.top_tools || []).map(t => ({\n toolName: t.tool_name,\n usageCount: t.usage_count || 0,\n successRate: t.success_rate || 0,\n avgDurationMs: t.avg_duration_ms || 0,\n })),\n toolFailureRate: data.tool_failure_rate || 0,\n source: 'bridge',\n };\n } catch {\n return {\n period,\n days: period === 'day' ? 1 : period === 'week' ? 7 : 30,\n taskMetrics: [],\n qualityMetrics: [],\n topTools: [],\n toolFailureRate: 0,\n source: 'none',\n };\n }\n}\n","/**\n * Database utilities for local PostgreSQL persistence\n * Connects to the squads schema for storing metrics and snapshots\n */\n\nimport { createRequire } from 'module';\nconst require = createRequire(import.meta.url);\nconst pg = require('pg');\nconst { Pool } = pg;\n\n// Connection config from environment or defaults\nconst DATABASE_URL = process.env.SQUADS_DATABASE_URL ||\n 'postgresql://squads:squads_local_dev@localhost:5433/squads';\n\nlet pool: InstanceType<typeof Pool> | null = null;\n\n/**\n * Get or create the connection pool\n */\nfunction getPool(): InstanceType<typeof Pool> {\n if (!pool) {\n pool = new Pool({\n connectionString: DATABASE_URL,\n max: 5,\n idleTimeoutMillis: 30000,\n connectionTimeoutMillis: 1500, // Fast timeout for CLI responsiveness\n });\n\n // Handle pool errors\n pool.on('error', (err: Error) => {\n console.error('Unexpected database pool error:', err);\n });\n }\n return pool;\n}\n\n/**\n * Check if database is available\n */\nexport async function isDatabaseAvailable(): Promise<boolean> {\n try {\n const pool = getPool();\n const client = await pool.connect();\n await client.query('SELECT 1');\n client.release();\n return true;\n } catch (err) {\n if (process.env.DEBUG) {\n console.error('DB availability check failed:', err);\n }\n return false;\n }\n}\n\n/**\n * Dashboard snapshot data structure\n */\nexport interface DashboardSnapshot {\n // Top-level metrics\n totalSquads: number;\n totalCommits: number;\n totalPrsMerged: number;\n totalIssuesClosed: number;\n totalIssuesOpen: number;\n goalProgressPct: number;\n\n // Cost metrics\n costUsd: number;\n dailyBudgetUsd: number;\n inputTokens: number;\n outputTokens: number;\n\n // Git activity\n commits30d: number;\n avgCommitsPerDay: number;\n activeDays: number;\n peakCommits: number;\n peakDate: string | null;\n\n // Detailed breakdowns (stored as JSONB)\n squadsData: SquadSnapshotData[];\n authorsData: { name: string; commits: number }[];\n reposData: { name: string; commits: number }[];\n}\n\nexport interface SquadSnapshotData {\n name: string;\n commits: number;\n prsOpened: number;\n prsMerged: number;\n issuesClosed: number;\n issuesOpen: number;\n goalsActive: number;\n goalsTotal: number;\n progress: number;\n}\n\n/**\n * Save a dashboard snapshot to the database\n */\nexport async function saveDashboardSnapshot(snapshot: DashboardSnapshot): Promise<number | null> {\n try {\n const pool = getPool();\n const client = await pool.connect();\n\n const result = await client.query(`\n INSERT INTO squads.dashboard_snapshots (\n total_squads, total_commits, total_prs_merged, total_issues_closed, total_issues_open,\n goal_progress_pct, cost_usd, daily_budget_usd, input_tokens, output_tokens,\n commits_30d, avg_commits_per_day, active_days, peak_commits, peak_date,\n squads_data, authors_data, repos_data\n ) VALUES (\n $1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18\n ) RETURNING id\n `, [\n snapshot.totalSquads,\n snapshot.totalCommits,\n snapshot.totalPrsMerged,\n snapshot.totalIssuesClosed,\n snapshot.totalIssuesOpen,\n snapshot.goalProgressPct,\n snapshot.costUsd,\n snapshot.dailyBudgetUsd,\n snapshot.inputTokens,\n snapshot.outputTokens,\n snapshot.commits30d,\n snapshot.avgCommitsPerDay,\n snapshot.activeDays,\n snapshot.peakCommits,\n snapshot.peakDate,\n JSON.stringify(snapshot.squadsData),\n JSON.stringify(snapshot.authorsData),\n JSON.stringify(snapshot.reposData),\n ]);\n\n client.release();\n return result.rows[0]?.id ?? null;\n } catch (err) {\n // Log error for debugging, but don't crash\n if (process.env.DEBUG) {\n console.error('DB save error:', err);\n }\n return null;\n }\n}\n\n/**\n * Get recent dashboard snapshots for trend analysis\n */\nexport async function getDashboardHistory(limit: number = 30): Promise<DashboardSnapshot[]> {\n try {\n const client = await getPool().connect();\n\n const result = await client.query(`\n SELECT\n total_squads, total_commits, total_prs_merged, total_issues_closed, total_issues_open,\n goal_progress_pct, cost_usd, daily_budget_usd, input_tokens, output_tokens,\n commits_30d, avg_commits_per_day, active_days, peak_commits, peak_date,\n squads_data, authors_data, repos_data, captured_at\n FROM squads.dashboard_snapshots\n ORDER BY captured_at DESC\n LIMIT $1\n `, [limit]);\n\n client.release();\n\n return result.rows.map((row: Record<string, unknown>) => ({\n totalSquads: row.total_squads,\n totalCommits: row.total_commits,\n totalPrsMerged: row.total_prs_merged,\n totalIssuesClosed: row.total_issues_closed,\n totalIssuesOpen: row.total_issues_open,\n goalProgressPct: row.goal_progress_pct,\n costUsd: parseFloat(String(row.cost_usd)),\n dailyBudgetUsd: parseFloat(String(row.daily_budget_usd)),\n inputTokens: row.input_tokens,\n outputTokens: row.output_tokens,\n commits30d: row.commits_30d,\n avgCommitsPerDay: parseFloat(String(row.avg_commits_per_day)),\n activeDays: row.active_days,\n peakCommits: row.peak_commits,\n peakDate: row.peak_date,\n squadsData: row.squads_data || [],\n authorsData: row.authors_data || [],\n reposData: row.repos_data || [],\n }));\n } catch {\n return [];\n }\n}\n\n/**\n * Close the database connection pool\n */\nexport async function closeDatabase(): Promise<void> {\n if (pool) {\n await pool.end();\n pool = null;\n }\n}\n","import { execSync } from 'child_process';\nimport {\n colors,\n bold,\n RESET,\n gradient,\n box,\n padEnd,\n truncate,\n icons,\n writeLine,\n} from '../lib/terminal.js';\n\ninterface Issue {\n number: number;\n title: string;\n state: string;\n labels: string[];\n createdAt: string;\n}\n\ninterface RepoIssues {\n repo: string;\n issues: Issue[];\n error?: string;\n}\n\ninterface IssuesOptions {\n org?: string;\n repos?: string;\n}\n\nconst DEFAULT_ORG = 'agents-squads';\nconst DEFAULT_REPOS = ['hq', 'agents-squads-web', 'squads-cli'];\n\nexport async function issuesCommand(options: IssuesOptions = {}): Promise<void> {\n const org = options.org || DEFAULT_ORG;\n const repos = options.repos ? options.repos.split(',') : DEFAULT_REPOS;\n\n writeLine();\n writeLine(` ${gradient('squads')} ${colors.dim}issues${RESET}`);\n writeLine();\n\n // Check if gh is available\n try {\n execSync('gh --version', { stdio: 'pipe' });\n } catch {\n writeLine(` ${colors.red}GitHub CLI (gh) not found${RESET}`);\n writeLine(` ${colors.dim}Install: brew install gh${RESET}`);\n writeLine();\n return;\n }\n\n // Fetch issues for each repo\n const repoData: RepoIssues[] = [];\n let totalOpen = 0;\n\n for (const repo of repos) {\n try {\n const result = execSync(\n `gh issue list -R ${org}/${repo} --state open --json number,title,state,labels,createdAt --limit 50`,\n { stdio: 'pipe', encoding: 'utf-8' }\n );\n const issues: Issue[] = JSON.parse(result);\n repoData.push({ repo, issues });\n totalOpen += issues.length;\n } catch (e: any) {\n repoData.push({ repo, issues: [], error: 'not found or no access' });\n }\n }\n\n // Stats row\n const reposWithIssues = repoData.filter(r => r.issues.length > 0).length;\n writeLine(` ${colors.cyan}${totalOpen}${RESET} open issues ${colors.dim}│${RESET} ${reposWithIssues}/${repos.length} repos`);\n writeLine();\n\n // Table\n const w = { repo: 20, open: 6, latest: 40 };\n const tableWidth = w.repo + w.open + w.latest + 4;\n\n writeLine(` ${colors.purple}${box.topLeft}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.topRight}${RESET}`);\n\n const header = ` ${colors.purple}${box.vertical}${RESET} ` +\n `${bold}${padEnd('REPO', w.repo)}${RESET}` +\n `${bold}${padEnd('OPEN', w.open)}${RESET}` +\n `${bold}LATEST${RESET}` +\n ` ${colors.purple}${box.vertical}${RESET}`;\n writeLine(header);\n\n writeLine(` ${colors.purple}${box.teeRight}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.teeLeft}${RESET}`);\n\n for (const { repo, issues, error } of repoData) {\n const count = issues.length;\n const countColor = count > 5 ? colors.red : count > 0 ? colors.yellow : colors.green;\n\n let latest = `${colors.dim}—${RESET}`;\n if (error) {\n latest = `${colors.dim}${error}${RESET}`;\n } else if (issues.length > 0) {\n latest = truncate(issues[0].title, w.latest - 2);\n }\n\n const row = ` ${colors.purple}${box.vertical}${RESET} ` +\n `${colors.cyan}${padEnd(repo, w.repo)}${RESET}` +\n `${countColor}${padEnd(String(count), w.open)}${RESET}` +\n `${padEnd(latest, w.latest + 10)}` + // extra for color codes\n `${colors.purple}${box.vertical}${RESET}`;\n\n writeLine(row);\n }\n\n writeLine(` ${colors.purple}${box.bottomLeft}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.bottomRight}${RESET}`);\n writeLine();\n\n // Show recent issues\n const allIssues = repoData\n .flatMap(r => r.issues.map(i => ({ ...i, repo: r.repo })))\n .sort((a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime())\n .slice(0, 6);\n\n if (allIssues.length > 0) {\n writeLine(` ${bold}Recent${RESET}`);\n writeLine();\n\n for (const issue of allIssues) {\n const labelStr = issue.labels.length > 0\n ? `${colors.dim}[${issue.labels.map((l: any) => l.name || l).join(', ')}]${RESET}`\n : '';\n\n writeLine(` ${icons.empty} ${colors.dim}#${issue.number}${RESET} ${truncate(issue.title, 50)} ${labelStr}`);\n writeLine(` ${colors.dim}└ ${issue.repo}${RESET}`);\n }\n writeLine();\n }\n\n // Commands\n writeLine(` ${colors.dim}$${RESET} gh issue list -R ${colors.cyan}${org}/<repo>${RESET} ${colors.dim}View repo issues${RESET}`);\n writeLine(` ${colors.dim}$${RESET} gh issue create -R ${colors.cyan}${org}/<repo>${RESET} ${colors.dim}Create issue${RESET}`);\n writeLine();\n}\n","import { execSync, spawn } from 'child_process';\nimport ora from 'ora';\nimport {\n colors,\n bold,\n RESET,\n gradient,\n box,\n padEnd,\n truncate,\n icons,\n writeLine,\n} from '../lib/terminal.js';\n\ninterface Issue {\n number: number;\n title: string;\n labels: Array<{ name: string }>;\n body?: string;\n}\n\ninterface SolveOptions {\n repo?: string;\n issue?: number;\n dryRun?: boolean;\n execute?: boolean;\n}\n\nconst DEFAULT_ORG = 'agents-squads';\nconst DEFAULT_REPOS = ['hq', 'agents-squads-web', 'squads-cli', 'agents-squads'];\n\nexport async function solveIssuesCommand(options: SolveOptions = {}): Promise<void> {\n const repos = options.repo ? [options.repo] : DEFAULT_REPOS;\n\n writeLine();\n writeLine(` ${gradient('squads')} ${colors.dim}solve-issues${RESET}`);\n writeLine();\n\n // Check if gh is available\n try {\n execSync('gh --version', { stdio: 'pipe' });\n } catch {\n writeLine(` ${colors.red}GitHub CLI (gh) not found${RESET}`);\n writeLine(` ${colors.dim}Install: brew install gh${RESET}`);\n return;\n }\n\n // Collect issues to solve\n const issuesToSolve: Array<Issue & { repo: string }> = [];\n\n if (options.issue) {\n // Specific issue\n const repo = options.repo || 'hq';\n try {\n const result = execSync(\n `gh issue view ${options.issue} -R ${DEFAULT_ORG}/${repo} --json number,title,labels,body`,\n { stdio: 'pipe', encoding: 'utf-8' }\n );\n const issue = JSON.parse(result);\n issuesToSolve.push({ ...issue, repo });\n } catch {\n writeLine(` ${colors.red}Issue #${options.issue} not found in ${repo}${RESET}`);\n return;\n }\n } else {\n // All ready-to-fix issues\n for (const repo of repos) {\n try {\n const result = execSync(\n `gh issue list -R ${DEFAULT_ORG}/${repo} --label \"ready-to-fix\" --state open --json number,title,labels --limit 20`,\n { stdio: 'pipe', encoding: 'utf-8' }\n );\n const issues: Issue[] = JSON.parse(result);\n for (const issue of issues) {\n issuesToSolve.push({ ...issue, repo });\n }\n } catch {\n // Repo might not exist or no access\n }\n }\n }\n\n if (issuesToSolve.length === 0) {\n writeLine(` ${colors.yellow}No issues with 'ready-to-fix' label found${RESET}`);\n writeLine();\n writeLine(` ${colors.dim}Label an issue to make it solvable:${RESET}`);\n writeLine(` ${colors.dim}$${RESET} gh issue edit ${colors.cyan}<number>${RESET} -R ${colors.cyan}${DEFAULT_ORG}/<repo>${RESET} --add-label ready-to-fix`);\n writeLine();\n return;\n }\n\n // Show issues to solve\n writeLine(` ${colors.cyan}${issuesToSolve.length}${RESET} issue${issuesToSolve.length > 1 ? 's' : ''} to solve`);\n writeLine();\n\n for (const issue of issuesToSolve) {\n const labels = issue.labels.map(l => l.name).join(', ');\n writeLine(` ${icons.empty} ${colors.dim}#${issue.number}${RESET} ${truncate(issue.title, 50)}`);\n writeLine(` ${colors.dim}└ ${issue.repo} [${labels}]${RESET}`);\n }\n writeLine();\n\n if (options.dryRun) {\n writeLine(` ${colors.yellow}[DRY RUN] Would solve ${issuesToSolve.length} issues${RESET}`);\n return;\n }\n\n // Solve issues\n if (options.execute) {\n await solveWithClaude(issuesToSolve);\n } else {\n showSolveInstructions(issuesToSolve);\n }\n}\n\nfunction showSolveInstructions(issues: Array<Issue & { repo: string }>): void {\n writeLine(` ${bold}To solve these issues:${RESET}`);\n writeLine();\n writeLine(` ${colors.dim}Option 1: In Claude Code session${RESET}`);\n writeLine(` ${colors.dim}$${RESET} /solve-issue ${colors.cyan}${issues[0].repo}${RESET}`);\n writeLine();\n writeLine(` ${colors.dim}Option 2: Execute with Claude CLI${RESET}`);\n writeLine(` ${colors.dim}$${RESET} squads solve-issues --execute`);\n writeLine();\n writeLine(` ${colors.dim}Option 3: Solve specific issue${RESET}`);\n writeLine(` ${colors.dim}$${RESET} squads solve-issues --repo ${colors.cyan}${issues[0].repo}${RESET} --issue ${colors.cyan}${issues[0].number}${RESET} --execute`);\n writeLine();\n}\n\nasync function solveWithClaude(issues: Array<Issue & { repo: string }>): Promise<void> {\n const spinner = ora('Starting issue solver...').start();\n\n // Check if claude is available\n try {\n execSync('which claude', { stdio: 'pipe' });\n } catch {\n spinner.fail('Claude CLI not found');\n writeLine(` ${colors.dim}Install: npm install -g @anthropic-ai/claude-code${RESET}`);\n return;\n }\n\n for (const issue of issues) {\n spinner.text = `Solving #${issue.number}: ${truncate(issue.title, 40)}`;\n\n const prompt = buildSolvePrompt(issue);\n\n try {\n const result = await executeClaudePrompt(prompt);\n spinner.succeed(`Solved #${issue.number}`);\n\n // Extract PR URL if present\n const prMatch = result.match(/https:\\/\\/github\\.com\\/[^\\s]+\\/pull\\/\\d+/);\n if (prMatch) {\n writeLine(` ${colors.green}PR: ${prMatch[0]}${RESET}`);\n }\n } catch (error) {\n spinner.fail(`Failed #${issue.number}: ${error}`);\n }\n }\n\n writeLine();\n writeLine(` ${colors.dim}View results:${RESET}`);\n writeLine(` ${colors.dim}$${RESET} gh pr list -R ${colors.cyan}${DEFAULT_ORG}/<repo>${RESET}`);\n writeLine();\n}\n\nfunction buildSolvePrompt(issue: Issue & { repo: string }): string {\n return `Solve GitHub issue #${issue.number} in ${DEFAULT_ORG}/${issue.repo}.\n\nIssue: ${issue.title}\n\n## CRITICAL: Work Decisively (No Verification Loops!)\n\nRead each file ONCE, edit ONCE, commit IMMEDIATELY.\nVerify with git diff, NOT by re-reading files.\nIf reading the same file twice, STOP and move forward.\n\n## Instructions\n\n1. Read the issue: gh issue view ${issue.number} --repo ${DEFAULT_ORG}/${issue.repo}\n\n2. Set up worktree:\n git fetch origin main\n git worktree add ../.worktrees/issue-${issue.number} -b solve/issue-${issue.number} origin/main\n cd ../.worktrees/issue-${issue.number}\n\n3. Find and fix the problem (minimal changes)\n\n4. Commit: git add -A && git commit -m \"fix: ...\"\n\n5. Push and create PR:\n git push -u origin solve/issue-${issue.number}\n gh pr create --title \"fix: ...\" --body \"Fixes #${issue.number}\" --repo ${DEFAULT_ORG}/${issue.repo}\n\n6. Clean up: git worktree remove ../.worktrees/issue-${issue.number} --force\n\nReturn the PR URL when done.`;\n}\n\nfunction executeClaudePrompt(prompt: string): Promise<string> {\n return new Promise((resolve, reject) => {\n const claude = spawn('claude', ['--print', prompt], {\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n\n let output = '';\n let error = '';\n\n claude.stdout?.on('data', (data) => {\n output += data.toString();\n });\n\n claude.stderr?.on('data', (data) => {\n error += data.toString();\n });\n\n claude.on('close', (code) => {\n if (code === 0) {\n resolve(output);\n } else {\n reject(new Error(error || `Exited with code ${code}`));\n }\n });\n\n claude.on('error', reject);\n\n // 10 minute timeout\n setTimeout(() => {\n claude.kill();\n reject(new Error('Timeout after 10 minutes'));\n }, 10 * 60 * 1000);\n });\n}\n","import { execSync, spawn } from 'child_process';\nimport { existsSync, readdirSync } from 'fs';\nimport { join } from 'path';\nimport ora from 'ora';\nimport {\n colors,\n bold,\n RESET,\n gradient,\n truncate,\n icons,\n writeLine,\n} from '../lib/terminal.js';\nimport { findSquadsDir } from '../lib/squad-parser.js';\n\ninterface OpenOptions {\n squad?: string;\n agent?: string;\n dryRun?: boolean;\n execute?: boolean;\n}\n\ninterface EvalAgent {\n name: string;\n squad: string;\n path: string;\n}\n\n// Agents that find issues (evaluators, critics, auditors)\nconst ISSUE_FINDER_PATTERNS = [\n '*-eval.md',\n '*-critic.md',\n '*-auditor.md',\n 'site-tester.md',\n];\n\nexport async function openIssuesCommand(options: OpenOptions = {}): Promise<void> {\n writeLine();\n writeLine(` ${gradient('squads')} ${colors.dim}open-issues${RESET}`);\n writeLine();\n\n const squadsDir = findSquadsDir();\n if (!squadsDir) {\n writeLine(` ${colors.red}No .agents/squads directory found${RESET}`);\n return;\n }\n\n // Find evaluator/critic agents\n const evalAgents = findEvalAgents(squadsDir, options.squad);\n\n if (evalAgents.length === 0) {\n writeLine(` ${colors.yellow}No evaluator agents found${RESET}`);\n writeLine(` ${colors.dim}Evaluators match: *-eval.md, *-critic.md, *-auditor.md${RESET}`);\n return;\n }\n\n // Filter by specific agent if requested\n const agents = options.agent\n ? evalAgents.filter(a => a.name === options.agent || a.name === `${options.agent}.md`)\n : evalAgents;\n\n if (agents.length === 0) {\n writeLine(` ${colors.red}Agent '${options.agent}' not found${RESET}`);\n writeLine(` ${colors.dim}Available: ${evalAgents.map(a => a.name).join(', ')}${RESET}`);\n return;\n }\n\n // Group by squad\n const bySquad = agents.reduce((acc, agent) => {\n if (!acc[agent.squad]) acc[agent.squad] = [];\n acc[agent.squad].push(agent);\n return acc;\n }, {} as Record<string, EvalAgent[]>);\n\n writeLine(` ${colors.cyan}${agents.length}${RESET} evaluator${agents.length > 1 ? 's' : ''} ready`);\n writeLine();\n\n for (const [squad, squadAgents] of Object.entries(bySquad)) {\n writeLine(` ${bold}${squad}${RESET}`);\n for (const agent of squadAgents) {\n writeLine(` ${icons.empty} ${colors.cyan}${agent.name.replace('.md', '')}${RESET}`);\n }\n }\n writeLine();\n\n if (options.dryRun) {\n writeLine(` ${colors.yellow}[DRY RUN] Would run ${agents.length} evaluators${RESET}`);\n return;\n }\n\n if (options.execute) {\n await runEvaluators(agents);\n } else {\n showRunInstructions(agents);\n }\n}\n\nfunction findEvalAgents(squadsDir: string, filterSquad?: string): EvalAgent[] {\n const agents: EvalAgent[] = [];\n const squads = readdirSync(squadsDir, { withFileTypes: true })\n .filter(d => d.isDirectory())\n .filter(d => !filterSquad || d.name === filterSquad)\n .map(d => d.name);\n\n for (const squad of squads) {\n const squadPath = join(squadsDir, squad);\n const files = readdirSync(squadPath).filter(f => f.endsWith('.md'));\n\n for (const file of files) {\n // Check if matches evaluator patterns\n const isEval = ISSUE_FINDER_PATTERNS.some(pattern => {\n const regex = new RegExp('^' + pattern.replace('*', '.*') + '$');\n return regex.test(file);\n });\n\n if (isEval) {\n agents.push({\n name: file,\n squad,\n path: join(squadPath, file),\n });\n }\n }\n }\n\n return agents;\n}\n\nfunction showRunInstructions(agents: EvalAgent[]): void {\n writeLine(` ${bold}To run evaluators:${RESET}`);\n writeLine();\n writeLine(` ${colors.dim}Option 1: In Claude Code session${RESET}`);\n writeLine(` ${colors.dim}$${RESET} /website-eval`);\n writeLine();\n writeLine(` ${colors.dim}Option 2: Execute with Claude CLI${RESET}`);\n writeLine(` ${colors.dim}$${RESET} squads open-issues --execute`);\n writeLine();\n writeLine(` ${colors.dim}Option 3: Run specific evaluator${RESET}`);\n writeLine(` ${colors.dim}$${RESET} squads open-issues --squad ${colors.cyan}${agents[0].squad}${RESET} --agent ${colors.cyan}${agents[0].name.replace('.md', '')}${RESET} --execute`);\n writeLine();\n writeLine(` ${colors.dim}Option 4: Via squads run${RESET}`);\n writeLine(` ${colors.dim}$${RESET} squads run ${colors.cyan}${agents[0].squad}/${agents[0].name.replace('.md', '')}${RESET} --execute`);\n writeLine();\n}\n\nasync function runEvaluators(agents: EvalAgent[]): Promise<void> {\n const spinner = ora('Starting evaluators...').start();\n\n // Check if claude is available\n try {\n execSync('which claude', { stdio: 'pipe' });\n } catch {\n spinner.fail('Claude CLI not found');\n writeLine(` ${colors.dim}Install: npm install -g @anthropic-ai/claude-code${RESET}`);\n return;\n }\n\n let issuesCreated = 0;\n\n for (const agent of agents) {\n spinner.text = `Running ${agent.squad}/${agent.name.replace('.md', '')}...`;\n\n const prompt = buildEvalPrompt(agent);\n\n try {\n const result = await executeClaudePrompt(prompt);\n spinner.succeed(`${agent.name.replace('.md', '')}`);\n\n // Count issues created\n const issueMatches = result.match(/Created issue #\\d+/g) || [];\n issuesCreated += issueMatches.length;\n\n if (issueMatches.length > 0) {\n writeLine(` ${colors.green}Created ${issueMatches.length} issue(s)${RESET}`);\n } else {\n writeLine(` ${colors.dim}No issues found${RESET}`);\n }\n } catch (error) {\n spinner.fail(`${agent.name.replace('.md', '')}: ${error}`);\n }\n }\n\n writeLine();\n writeLine(` ${bold}Summary${RESET}`);\n writeLine(` ${colors.cyan}${issuesCreated}${RESET} new issues created`);\n writeLine();\n writeLine(` ${colors.dim}View issues:${RESET}`);\n writeLine(` ${colors.dim}$${RESET} squads issues`);\n writeLine();\n writeLine(` ${colors.dim}Solve them:${RESET}`);\n writeLine(` ${colors.dim}$${RESET} squads solve-issues`);\n writeLine();\n}\n\nfunction buildEvalPrompt(agent: EvalAgent): string {\n return `Execute the ${agent.name.replace('.md', '')} evaluator from squad ${agent.squad}.\n\nRead the agent definition at ${agent.path} and follow its instructions exactly.\n\n## CRITICAL: Work Decisively\n\n- Evaluate the target (website, code, etc.)\n- For each finding, create a GitHub issue\n- Use: gh issue create --repo agents-squads/{repo} --title \"...\" --body \"...\" --label \"type:...,priority:P1/P2/P3,squad:${agent.squad}\"\n- Report how many issues were created\n\nDo NOT get stuck re-reading files. Evaluate, report findings, create issues, done.`;\n}\n\nfunction executeClaudePrompt(prompt: string): Promise<string> {\n return new Promise((resolve, reject) => {\n const claude = spawn('claude', ['--print', prompt], {\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n\n let output = '';\n let error = '';\n\n claude.stdout?.on('data', (data) => {\n output += data.toString();\n });\n\n claude.stderr?.on('data', (data) => {\n error += data.toString();\n });\n\n claude.on('close', (code) => {\n if (code === 0) {\n resolve(output);\n } else {\n reject(new Error(error || `Exited with code ${code}`));\n }\n });\n\n claude.on('error', reject);\n\n // 5 minute timeout per evaluator\n setTimeout(() => {\n claude.kill();\n reject(new Error('Timeout after 5 minutes'));\n }, 5 * 60 * 1000);\n });\n}\n","import chalk from 'chalk';\nimport ora from 'ora';\nimport open from 'open';\nimport {\n isPersonalEmail,\n getEmailDomain,\n saveSession,\n loadSession,\n clearSession,\n startAuthCallbackServer,\n AuthSession\n} from '../lib/auth.js';\nimport { track } from '../lib/telemetry.js';\n\nconst AUTH_URL = process.env.SQUADS_AUTH_URL || 'https://app.agents-squads.com/auth';\nconst CALLBACK_PORT = 54321;\n\nexport async function loginCommand(): Promise<void> {\n const existingSession = loadSession();\n\n if (existingSession && existingSession.status === 'active') {\n console.log(chalk.green(`✓ Already logged in as ${existingSession.email}`));\n console.log(chalk.dim(` Domain: ${existingSession.domain}`));\n console.log(chalk.dim(` Run 'squads logout' to sign out.`));\n return;\n }\n\n console.log(`\n${chalk.bold.magenta('Squads CLI Login')}\n${chalk.dim('─'.repeat(40))}\n\nOpening browser to authenticate...\n`);\n\n const spinner = ora('Waiting for authentication...').start();\n\n try {\n // Start local callback server\n const callbackPromise = startAuthCallbackServer(CALLBACK_PORT);\n\n // Open browser to auth page\n const authUrl = `${AUTH_URL}?callback=http://localhost:${CALLBACK_PORT}/callback`;\n await open(authUrl);\n\n // Wait for callback\n const { email, token } = await callbackPromise;\n\n // Check if personal email\n if (isPersonalEmail(email)) {\n spinner.fail('Personal emails not supported');\n console.log(`\n${chalk.yellow('⚠ Squads CLI is for Pro & Enterprise teams only.')}\n\nPersonal email domains (Gmail, Yahoo, etc.) are not supported.\n\n${chalk.dim('Want to stay updated?')}\n → Get our free research report: ${chalk.cyan('https://agents-squads.com/research')}\n → Follow us: ${chalk.cyan('https://x.com/agents_squads')}\n`);\n\n await track('cli.login.personal_email', { domain: getEmailDomain(email) });\n return;\n }\n\n // Save session\n const session: AuthSession = {\n email,\n domain: getEmailDomain(email),\n status: 'pending', // Will be 'active' after sales contact\n createdAt: new Date().toISOString(),\n accessToken: token,\n };\n\n saveSession(session);\n spinner.succeed(`Logged in as ${chalk.cyan(email)}`);\n\n await track('cli.login.success', { domain: session.domain });\n\n console.log(`\n${chalk.green('✓ Thanks for signing up!')}\n\n${chalk.bold('What happens next:')}\n 1. Our team will reach out within 24 hours\n 2. We'll discuss your AI agent needs\n 3. You'll get access to Pro features\n\n${chalk.dim('In the meantime:')}\n → Explore squads: ${chalk.cyan('squads status')}\n → Set goals: ${chalk.cyan('squads goal set <squad> \"<goal>\"')}\n → Read our research: ${chalk.cyan('https://agents-squads.com/research')}\n\n${chalk.dim('Questions? Email us at')} ${chalk.cyan('hello@agents-squads.com')}\n`);\n\n } catch (error) {\n spinner.fail('Login failed');\n console.error(chalk.red(error instanceof Error ? error.message : 'Unknown error'));\n }\n}\n\nexport async function logoutCommand(): Promise<void> {\n const session = loadSession();\n\n if (!session) {\n console.log(chalk.yellow('Not logged in.'));\n return;\n }\n\n clearSession();\n console.log(chalk.green(`✓ Logged out from ${session.email}`));\n await track('cli.logout');\n}\n\nexport async function whoamiCommand(): Promise<void> {\n const session = loadSession();\n\n if (!session) {\n console.log(chalk.yellow('Not logged in.'));\n console.log(chalk.dim('Run: squads login'));\n return;\n }\n\n console.log(`\n${chalk.bold('Current Session')}\n${chalk.dim('─'.repeat(30))}\nEmail: ${chalk.cyan(session.email)}\nDomain: ${session.domain}\nStatus: ${session.status === 'active' ? chalk.green('Active') : chalk.yellow('Pending')}\nSince: ${new Date(session.createdAt).toLocaleDateString()}\n`);\n}\n","import { createClient } from '@supabase/supabase-js';\nimport { existsSync, readFileSync, writeFileSync, mkdirSync } from 'fs';\nimport { join } from 'path';\nimport { homedir } from 'os';\nimport open from 'open';\nimport http from 'http';\n\n// Personal email domains to reject\nconst PERSONAL_DOMAINS = [\n 'gmail.com', 'googlemail.com',\n 'yahoo.com', 'yahoo.co.uk', 'yahoo.fr',\n 'hotmail.com', 'outlook.com', 'live.com', 'msn.com',\n 'icloud.com', 'me.com', 'mac.com',\n 'aol.com',\n 'protonmail.com', 'proton.me',\n 'zoho.com',\n 'mail.com',\n 'yandex.com', 'yandex.ru',\n 'gmx.com', 'gmx.de',\n 'fastmail.com',\n 'tutanota.com',\n 'hey.com',\n];\n\nconst AUTH_DIR = join(homedir(), '.squads-cli');\nconst AUTH_PATH = join(AUTH_DIR, 'auth.json');\n\nexport interface AuthSession {\n email: string;\n domain: string;\n status: 'pending' | 'contacted' | 'active';\n createdAt: string;\n accessToken?: string;\n}\n\nexport function isPersonalEmail(email: string): boolean {\n const domain = email.split('@')[1]?.toLowerCase();\n return PERSONAL_DOMAINS.includes(domain);\n}\n\nexport function getEmailDomain(email: string): string {\n return email.split('@')[1]?.toLowerCase() || '';\n}\n\nexport function saveSession(session: AuthSession): void {\n if (!existsSync(AUTH_DIR)) {\n mkdirSync(AUTH_DIR, { recursive: true });\n }\n writeFileSync(AUTH_PATH, JSON.stringify(session, null, 2));\n}\n\nexport function loadSession(): AuthSession | null {\n if (!existsSync(AUTH_PATH)) return null;\n try {\n return JSON.parse(readFileSync(AUTH_PATH, 'utf-8'));\n } catch {\n return null;\n }\n}\n\nexport function clearSession(): void {\n if (existsSync(AUTH_PATH)) {\n writeFileSync(AUTH_PATH, '');\n }\n}\n\nexport function isLoggedIn(): boolean {\n const session = loadSession();\n return session !== null && session.status === 'active';\n}\n\n// Create Supabase client (for edge function use)\nexport function createSupabaseClient(url: string, anonKey: string) {\n return createClient(url, anonKey);\n}\n\n// Local callback server for OAuth flow\nexport function startAuthCallbackServer(port: number = 54321): Promise<{ email: string; token: string }> {\n return new Promise((resolve, reject) => {\n const server = http.createServer((req, res) => {\n const url = new URL(req.url || '', `http://localhost:${port}`);\n\n if (url.pathname === '/callback') {\n const email = url.searchParams.get('email');\n const token = url.searchParams.get('token');\n const error = url.searchParams.get('error');\n\n if (error) {\n res.writeHead(200, { 'Content-Type': 'text/html' });\n res.end(`\n <html>\n <body style=\"font-family: system-ui; display: flex; justify-content: center; align-items: center; height: 100vh; margin: 0;\">\n <div style=\"text-align: center;\">\n <h1 style=\"color: #ef4444;\">❌ ${error}</h1>\n <p>You can close this window.</p>\n </div>\n </body>\n </html>\n `);\n server.close();\n reject(new Error(error));\n return;\n }\n\n if (email && token) {\n res.writeHead(200, { 'Content-Type': 'text/html' });\n res.end(`\n <html>\n <body style=\"font-family: system-ui; display: flex; justify-content: center; align-items: center; height: 100vh; margin: 0;\">\n <div style=\"text-align: center;\">\n <h1 style=\"color: #10b981;\">✓ Logged in!</h1>\n <p>Welcome, ${email}</p>\n <p style=\"color: #6b7280;\">You can close this window and return to your terminal.</p>\n </div>\n </body>\n </html>\n `);\n server.close();\n resolve({ email, token });\n } else {\n res.writeHead(400, { 'Content-Type': 'text/plain' });\n res.end('Missing email or token');\n }\n } else {\n res.writeHead(404);\n res.end();\n }\n });\n\n server.listen(port, () => {\n // Server started\n });\n\n // Timeout after 5 minutes\n setTimeout(() => {\n server.close();\n reject(new Error('Login timed out'));\n }, 5 * 60 * 1000);\n });\n}\n","/**\n * squads update - Check and install updates\n */\n\nimport { createInterface } from 'readline';\nimport {\n checkForUpdate,\n refreshVersionCache,\n performUpdate,\n getCurrentVersion,\n} from '../lib/update.js';\nimport {\n colors,\n RESET,\n gradient,\n icons,\n writeLine,\n} from '../lib/terminal.js';\n\ninterface UpdateOptions {\n yes?: boolean;\n check?: boolean;\n}\n\n/**\n * Prompt user for yes/no confirmation\n */\nasync function confirm(message: string): Promise<boolean> {\n const rl = createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n return new Promise((resolve) => {\n rl.question(` ${message} [y/N]: `, (answer) => {\n rl.close();\n resolve(answer.toLowerCase() === 'y' || answer.toLowerCase() === 'yes');\n });\n });\n}\n\nexport async function updateCommand(options: UpdateOptions = {}): Promise<void> {\n writeLine();\n writeLine(` ${gradient('squads')} ${colors.dim}update${RESET}`);\n writeLine();\n\n // Check-only mode\n if (options.check) {\n writeLine(` ${colors.dim}Checking for updates...${RESET}`);\n const info = refreshVersionCache();\n writeLine();\n\n if (info.updateAvailable) {\n writeLine(` ${colors.cyan}⬆${RESET} Update available: ${colors.dim}${info.currentVersion}${RESET} → ${colors.green}${info.latestVersion}${RESET}`);\n writeLine();\n writeLine(` ${colors.dim}Run \\`squads update\\` to install${RESET}`);\n } else {\n writeLine(` ${colors.green}${icons.success}${RESET} Already on latest version ${colors.cyan}${info.currentVersion}${RESET}`);\n }\n writeLine();\n return;\n }\n\n // Check for updates\n writeLine(` ${colors.dim}Checking npm registry...${RESET}`);\n const info = refreshVersionCache();\n\n if (!info.updateAvailable) {\n writeLine();\n writeLine(` ${colors.green}${icons.success}${RESET} Already on latest version ${colors.cyan}${info.currentVersion}${RESET}`);\n writeLine();\n return;\n }\n\n writeLine();\n writeLine(` ${colors.cyan}⬆${RESET} Update available: ${colors.dim}${info.currentVersion}${RESET} → ${colors.green}${info.latestVersion}${RESET}`);\n writeLine();\n\n // Auto-confirm with --yes flag, otherwise prompt\n const shouldUpdate = options.yes || (await confirm('Update now?'));\n\n if (!shouldUpdate) {\n writeLine();\n writeLine(` ${colors.dim}Update skipped${RESET}`);\n writeLine();\n return;\n }\n\n writeLine();\n writeLine(` ${colors.dim}Installing update...${RESET}`);\n writeLine();\n\n const result = performUpdate();\n\n writeLine();\n if (result.success) {\n writeLine(` ${colors.green}${icons.success}${RESET} Updated to ${colors.green}${info.latestVersion}${RESET}`);\n writeLine(` ${colors.dim}Restart your terminal to use the new version${RESET}`);\n } else {\n writeLine(` ${colors.red}${icons.error}${RESET} Update failed: ${result.error}`);\n writeLine(` ${colors.dim}Try manually: npm update -g squads-cli${RESET}`);\n process.exitCode = 1;\n }\n writeLine();\n}\n","import { execSync } from 'child_process';\nimport { existsSync, readFileSync, writeFileSync, mkdirSync } from 'fs';\nimport { join } from 'path';\nimport { findSquadsDir, listSquads, loadSquad } from '../lib/squad-parser.js';\nimport { findMemoryDir } from '../lib/memory.js';\nimport {\n colors,\n bold,\n RESET,\n gradient,\n box,\n padEnd,\n truncate,\n icons,\n writeLine,\n} from '../lib/terminal.js';\n\ninterface TaskEntry {\n id: string;\n squad: string;\n description: string;\n status: 'active' | 'completed' | 'failed';\n startedAt: string;\n completedAt?: string;\n commits?: string[];\n}\n\ninterface TasksFile {\n tasks: TaskEntry[];\n lastUpdated: string;\n}\n\nfunction getTasksFilePath(): string {\n const memoryDir = findMemoryDir();\n if (!memoryDir) {\n const cwd = process.cwd();\n const agentsDir = join(cwd, '.agents');\n if (!existsSync(agentsDir)) {\n mkdirSync(agentsDir, { recursive: true });\n }\n return join(agentsDir, 'tasks.json');\n }\n return join(memoryDir, '..', 'tasks.json');\n}\n\nfunction loadTasks(): TasksFile {\n const tasksPath = getTasksFilePath();\n if (existsSync(tasksPath)) {\n try {\n return JSON.parse(readFileSync(tasksPath, 'utf-8'));\n } catch {\n return { tasks: [], lastUpdated: new Date().toISOString() };\n }\n }\n return { tasks: [], lastUpdated: new Date().toISOString() };\n}\n\nfunction saveTasks(data: TasksFile): void {\n const tasksPath = getTasksFilePath();\n data.lastUpdated = new Date().toISOString();\n writeFileSync(tasksPath, JSON.stringify(data, null, 2));\n}\n\n// Get recent commits to infer activity\nfunction getRecentActivity(): { squad: string; message: string; hash: string; date: string }[] {\n const activity: { squad: string; message: string; hash: string; date: string }[] = [];\n\n const squadKeywords: Record<string, string[]> = {\n website: ['website', 'web', 'homepage', 'astro', 'page'],\n product: ['cli', 'squads-cli', 'command'],\n research: ['research', 'report', 'analysis'],\n engineering: ['infra', 'engineering', 'build'],\n intelligence: ['intel', 'monitor', 'competitor'],\n customer: ['lead', 'customer', 'outreach'],\n finance: ['cost', 'finance', 'budget'],\n company: ['company', 'strategy', 'mission'],\n marketing: ['marketing', 'content', 'social'],\n };\n\n try {\n const logOutput = execSync(\n 'git log --since=\"24 hours ago\" --format=\"%h|%aI|%s\" 2>/dev/null',\n { encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] }\n ).trim();\n\n if (!logOutput) return activity;\n\n for (const line of logOutput.split('\\n')) {\n const [hash, date, ...msgParts] = line.split('|');\n const message = msgParts.join('|');\n if (!hash || !message) continue;\n\n // Detect squad from commit message\n const msgLower = message.toLowerCase();\n let detectedSquad = 'unknown';\n\n for (const [squad, keywords] of Object.entries(squadKeywords)) {\n if (keywords.some(k => msgLower.includes(k))) {\n detectedSquad = squad;\n break;\n }\n }\n\n activity.push({\n squad: detectedSquad,\n message,\n hash,\n date: date.split('T')[0],\n });\n }\n } catch {\n // Not in git repo\n }\n\n return activity;\n}\n\nexport async function progressCommand(options: { verbose?: boolean } = {}): Promise<void> {\n writeLine();\n writeLine(` ${gradient('squads')} ${colors.dim}progress${RESET}`);\n writeLine();\n\n const tasksData = loadTasks();\n const recentActivity = getRecentActivity();\n\n // Active tasks\n const activeTasks = tasksData.tasks.filter(t => t.status === 'active');\n const completedToday = tasksData.tasks.filter(t =>\n t.status === 'completed' &&\n t.completedAt?.startsWith(new Date().toISOString().split('T')[0])\n );\n\n // Stats row\n const stats = [\n `${colors.cyan}${activeTasks.length}${RESET} active`,\n `${colors.green}${completedToday.length}${RESET} done today`,\n `${colors.purple}${recentActivity.length}${RESET} commits (24h)`,\n ].join(` ${colors.dim}│${RESET} `);\n writeLine(` ${stats}`);\n writeLine();\n\n // Active tasks section\n if (activeTasks.length > 0) {\n writeLine(` ${bold}Active Tasks${RESET}`);\n writeLine();\n\n for (const task of activeTasks) {\n const elapsed = getElapsedTime(task.startedAt);\n writeLine(` ${icons.progress} ${colors.cyan}${task.squad}${RESET} ${truncate(task.description, 45)}`);\n writeLine(` ${colors.dim}started ${elapsed} ago${RESET}`);\n }\n writeLine();\n } else {\n writeLine(` ${colors.dim}No active tasks${RESET}`);\n writeLine();\n }\n\n // Recent activity from git\n if (recentActivity.length > 0) {\n writeLine(` ${bold}Recent Activity${RESET} ${colors.dim}(last 24h)${RESET}`);\n writeLine();\n\n const w = { squad: 12, message: 50 };\n const tableWidth = w.squad + w.message + 4;\n\n writeLine(` ${colors.purple}${box.topLeft}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.topRight}${RESET}`);\n writeLine(` ${colors.purple}${box.vertical}${RESET} ${bold}${padEnd('SQUAD', w.squad)}${RESET}${bold}COMMIT${RESET}${' '.repeat(w.message - 6)} ${colors.purple}${box.vertical}${RESET}`);\n writeLine(` ${colors.purple}${box.teeRight}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.teeLeft}${RESET}`);\n\n const maxRows = options.verbose ? 15 : 8;\n for (const act of recentActivity.slice(0, maxRows)) {\n const squadColor = act.squad === 'unknown' ? colors.dim : colors.cyan;\n const row = ` ${colors.purple}${box.vertical}${RESET} ` +\n `${squadColor}${padEnd(act.squad, w.squad)}${RESET}` +\n `${truncate(act.message, w.message - 2)}` +\n ` ${colors.purple}${box.vertical}${RESET}`;\n writeLine(row);\n }\n\n writeLine(` ${colors.purple}${box.bottomLeft}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.bottomRight}${RESET}`);\n\n if (recentActivity.length > maxRows) {\n writeLine(` ${colors.dim}+${recentActivity.length - maxRows} more commits${RESET}`);\n }\n writeLine();\n }\n\n // Completed today\n if (completedToday.length > 0) {\n writeLine(` ${bold}Completed Today${RESET}`);\n writeLine();\n for (const task of completedToday.slice(0, 5)) {\n writeLine(` ${icons.success} ${colors.cyan}${task.squad}${RESET} ${truncate(task.description, 50)}`);\n }\n if (completedToday.length > 5) {\n writeLine(` ${colors.dim}+${completedToday.length - 5} more${RESET}`);\n }\n writeLine();\n }\n\n // Commands\n writeLine(` ${colors.dim}$${RESET} squads results ${colors.dim}KPI goals vs actuals${RESET}`);\n writeLine(` ${colors.dim}$${RESET} squads dash ${colors.dim}Full dashboard${RESET}`);\n writeLine();\n}\n\n// Register a new task (called by agents)\nexport async function progressStartCommand(\n squad: string,\n description: string\n): Promise<void> {\n const tasksData = loadTasks();\n const id = Math.random().toString(36).substring(2, 9);\n\n tasksData.tasks.push({\n id,\n squad,\n description,\n status: 'active',\n startedAt: new Date().toISOString(),\n });\n\n saveTasks(tasksData);\n writeLine(` ${icons.active} Task ${colors.cyan}${id}${RESET} started for ${colors.purple}${squad}${RESET}`);\n}\n\n// Complete a task\nexport async function progressCompleteCommand(\n taskId: string,\n options: { failed?: boolean } = {}\n): Promise<void> {\n const tasksData = loadTasks();\n const task = tasksData.tasks.find(t => t.id === taskId);\n\n if (!task) {\n writeLine(` ${icons.error} Task ${colors.red}${taskId}${RESET} not found`);\n return;\n }\n\n task.status = options.failed ? 'failed' : 'completed';\n task.completedAt = new Date().toISOString();\n\n saveTasks(tasksData);\n\n const icon = options.failed ? icons.error : icons.success;\n const status = options.failed ? 'failed' : 'completed';\n writeLine(` ${icon} Task ${colors.cyan}${taskId}${RESET} ${status}`);\n}\n\nfunction getElapsedTime(startTime: string): string {\n const start = new Date(startTime).getTime();\n const now = Date.now();\n const diffMs = now - start;\n\n const minutes = Math.floor(diffMs / 60000);\n const hours = Math.floor(minutes / 60);\n const days = Math.floor(hours / 24);\n\n if (days > 0) return `${days}d`;\n if (hours > 0) return `${hours}h`;\n if (minutes > 0) return `${minutes}m`;\n return '<1m';\n}\n","import { execSync } from 'child_process';\nimport { existsSync, readFileSync } from 'fs';\nimport { join } from 'path';\nimport { findSquadsDir, listSquads, loadSquad, Goal } from '../lib/squad-parser.js';\nimport {\n colors,\n bold,\n RESET,\n gradient,\n box,\n padEnd,\n truncate,\n icons,\n writeLine,\n progressBar,\n} from '../lib/terminal.js';\n\ninterface SquadResults {\n name: string;\n commits: number;\n prsOpened: number;\n prsMerged: number;\n issuesClosed: number;\n goals: GoalWithMetrics[];\n}\n\ninterface GoalWithMetrics {\n description: string;\n metrics: string[];\n progress?: string;\n completed: boolean;\n actual?: Record<string, number | string>;\n}\n\n// Get git stats for the past week per squad\nfunction getGitStats(days: number = 7): Map<string, { commits: number; files: string[] }> {\n const stats = new Map<string, { commits: number; files: string[] }>();\n\n const squadKeywords: Record<string, string[]> = {\n website: ['agents-squads-web', 'website', 'homepage'],\n product: ['squads-cli', 'cli'],\n research: ['research'],\n engineering: ['engineering', '.agents'],\n intelligence: ['intelligence'],\n customer: ['customer'],\n finance: ['finance'],\n company: ['company'],\n marketing: ['marketing'],\n };\n\n try {\n const logOutput = execSync(\n `git log --since=\"${days} days ago\" --format=\"%s\" --name-only 2>/dev/null`,\n { encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] }\n ).trim();\n\n if (!logOutput) return stats;\n\n const entries = logOutput.split('\\n\\n');\n for (const entry of entries) {\n const lines = entry.split('\\n').filter(l => l.trim());\n if (lines.length === 0) continue;\n\n const message = lines[0];\n const files = lines.slice(1);\n const msgLower = message.toLowerCase();\n\n // Detect squad\n let detectedSquad = 'other';\n for (const [squad, keywords] of Object.entries(squadKeywords)) {\n const inMessage = keywords.some(k => msgLower.includes(k));\n const inFiles = files.some(f =>\n keywords.some(k => f.toLowerCase().includes(k))\n );\n if (inMessage || inFiles) {\n detectedSquad = squad;\n break;\n }\n }\n\n if (!stats.has(detectedSquad)) {\n stats.set(detectedSquad, { commits: 0, files: [] });\n }\n const squadStats = stats.get(detectedSquad)!;\n squadStats.commits++;\n squadStats.files.push(...files);\n }\n } catch {\n // Not in git repo\n }\n\n return stats;\n}\n\n// Get GitHub stats via gh CLI\nfunction getGitHubStats(days: number = 7): {\n prsOpened: Map<string, number>;\n prsMerged: Map<string, number>;\n issuesClosed: Map<string, number>;\n} {\n const prsOpened = new Map<string, number>();\n const prsMerged = new Map<string, number>();\n const issuesClosed = new Map<string, number>();\n\n try {\n // Get PRs opened\n const prsOutput = execSync(\n `gh pr list --state all --json title,createdAt,mergedAt --limit 50 2>/dev/null`,\n { encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] }\n );\n const prs = JSON.parse(prsOutput || '[]');\n const since = new Date(Date.now() - days * 24 * 60 * 60 * 1000);\n\n for (const pr of prs) {\n const created = new Date(pr.createdAt);\n if (created < since) continue;\n\n const squad = detectSquadFromTitle(pr.title);\n prsOpened.set(squad, (prsOpened.get(squad) || 0) + 1);\n\n if (pr.mergedAt) {\n prsMerged.set(squad, (prsMerged.get(squad) || 0) + 1);\n }\n }\n\n // Get issues closed\n const issuesOutput = execSync(\n `gh issue list --state closed --json title,closedAt --limit 50 2>/dev/null`,\n { encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] }\n );\n const issues = JSON.parse(issuesOutput || '[]');\n\n for (const issue of issues) {\n const closed = new Date(issue.closedAt);\n if (closed < since) continue;\n\n const squad = detectSquadFromTitle(issue.title);\n issuesClosed.set(squad, (issuesClosed.get(squad) || 0) + 1);\n }\n } catch {\n // gh not available or not in repo\n }\n\n return { prsOpened, prsMerged, issuesClosed };\n}\n\nfunction detectSquadFromTitle(title: string): string {\n const lower = title.toLowerCase();\n const mapping: Record<string, string[]> = {\n website: ['website', 'web', 'homepage', 'page'],\n product: ['cli', 'squads', 'command'],\n research: ['research', 'report'],\n engineering: ['infra', 'build', 'ci'],\n intelligence: ['intel', 'monitor'],\n customer: ['lead', 'customer'],\n finance: ['cost', 'finance'],\n marketing: ['marketing', 'content'],\n };\n\n for (const [squad, keywords] of Object.entries(mapping)) {\n if (keywords.some(k => lower.includes(k))) {\n return squad;\n }\n }\n return 'other';\n}\n\n// Parse metrics from goal description\nfunction parseMetrics(goal: Goal): string[] {\n const metrics: string[] = [];\n\n // Check for explicit metrics in goal\n if (goal.metrics && goal.metrics.length > 0) {\n return goal.metrics;\n }\n\n // Infer from description\n const desc = goal.description.toLowerCase();\n\n if (desc.includes('revenue')) metrics.push('revenue_usd');\n if (desc.includes('lead')) metrics.push('leads_count');\n if (desc.includes('traffic') || desc.includes('visit')) metrics.push('page_views');\n if (desc.includes('signup') || desc.includes('email')) metrics.push('signups');\n if (desc.includes('cost')) metrics.push('cost_usd');\n if (desc.includes('publish') || desc.includes('launch')) metrics.push('shipped');\n if (desc.includes('demo')) metrics.push('demos_booked');\n\n return metrics.length > 0 ? metrics : ['progress'];\n}\n\nexport async function resultsCommand(options: {\n squad?: string;\n days?: string;\n verbose?: boolean;\n} = {}): Promise<void> {\n const squadsDir = findSquadsDir();\n if (!squadsDir) {\n writeLine(`${colors.red}No .agents/squads directory found${RESET}`);\n return;\n }\n\n const days = parseInt(options.days || '7', 10);\n\n writeLine();\n writeLine(` ${gradient('squads')} ${colors.dim}results${RESET} ${colors.dim}(${days}d)${RESET}`);\n writeLine();\n\n const squadNames = options.squad ? [options.squad] : listSquads(squadsDir);\n const gitStats = getGitStats(days);\n const ghStats = getGitHubStats(days);\n\n const results: SquadResults[] = [];\n\n for (const name of squadNames) {\n const squad = loadSquad(name);\n if (!squad) continue;\n\n const git = gitStats.get(name) || { commits: 0, files: [] };\n const activeGoals = squad.goals.filter(g => !g.completed);\n\n results.push({\n name,\n commits: git.commits,\n prsOpened: ghStats.prsOpened.get(name) || 0,\n prsMerged: ghStats.prsMerged.get(name) || 0,\n issuesClosed: ghStats.issuesClosed.get(name) || 0,\n goals: activeGoals.map(g => ({\n description: g.description,\n metrics: parseMetrics(g),\n progress: g.progress,\n completed: g.completed,\n })),\n });\n }\n\n // Summary stats\n const totalCommits = results.reduce((sum, r) => sum + r.commits, 0);\n const totalPRs = results.reduce((sum, r) => sum + r.prsMerged, 0);\n const totalGoals = results.reduce((sum, r) => sum + r.goals.length, 0);\n\n const stats = [\n `${colors.cyan}${totalCommits}${RESET} commits`,\n `${colors.green}${totalPRs}${RESET} PRs merged`,\n `${colors.purple}${totalGoals}${RESET} active goals`,\n ].join(` ${colors.dim}│${RESET} `);\n writeLine(` ${stats}`);\n writeLine();\n\n // Results table\n const w = { squad: 14, commits: 8, prs: 6, goals: 5, kpi: 20 };\n const tableWidth = w.squad + w.commits + w.prs + w.goals + w.kpi + 8;\n\n writeLine(` ${colors.purple}${box.topLeft}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.topRight}${RESET}`);\n writeLine(` ${colors.purple}${box.vertical}${RESET} ` +\n `${bold}${padEnd('SQUAD', w.squad)}${RESET}` +\n `${bold}${padEnd('COMMITS', w.commits)}${RESET}` +\n `${bold}${padEnd('PRs', w.prs)}${RESET}` +\n `${bold}${padEnd('GOALS', w.goals)}${RESET}` +\n `${bold}KEY METRIC${RESET}` +\n ` ${colors.purple}${box.vertical}${RESET}`);\n writeLine(` ${colors.purple}${box.teeRight}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.teeLeft}${RESET}`);\n\n for (const result of results) {\n const keyMetric = result.goals.length > 0\n ? result.goals[0].metrics[0] || '—'\n : '—';\n\n const commitColor = result.commits > 0 ? colors.green : colors.dim;\n const prColor = result.prsMerged > 0 ? colors.green : colors.dim;\n\n const row = ` ${colors.purple}${box.vertical}${RESET} ` +\n `${colors.cyan}${padEnd(result.name, w.squad)}${RESET}` +\n `${commitColor}${padEnd(String(result.commits), w.commits)}${RESET}` +\n `${prColor}${padEnd(String(result.prsMerged), w.prs)}${RESET}` +\n `${padEnd(String(result.goals.length), w.goals)}` +\n `${colors.dim}${truncate(keyMetric, w.kpi)}${RESET}` +\n ` ${colors.purple}${box.vertical}${RESET}`;\n writeLine(row);\n }\n\n writeLine(` ${colors.purple}${box.bottomLeft}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.bottomRight}${RESET}`);\n writeLine();\n\n // Goal details with KPIs\n if (options.verbose || options.squad) {\n writeLine(` ${bold}Goals & KPIs${RESET}`);\n writeLine();\n\n for (const result of results) {\n if (result.goals.length === 0) continue;\n\n writeLine(` ${colors.cyan}${result.name}${RESET}`);\n\n for (const goal of result.goals) {\n const statusIcon = goal.progress ? icons.progress : icons.empty;\n writeLine(` ${statusIcon} ${truncate(goal.description, 55)}`);\n\n // Show metrics\n if (goal.metrics.length > 0) {\n const metricsStr = goal.metrics.map(m => `${colors.purple}${m}${RESET}`).join(', ');\n writeLine(` ${colors.dim}metrics:${RESET} ${metricsStr}`);\n }\n\n // Show progress if any\n if (goal.progress) {\n writeLine(` ${colors.dim}progress:${RESET} ${colors.green}${goal.progress}${RESET}`);\n }\n }\n writeLine();\n }\n }\n\n // Help\n writeLine(` ${colors.dim}$${RESET} squads results ${colors.cyan}<squad>${RESET} -v ${colors.dim}Detailed squad KPIs${RESET}`);\n writeLine(` ${colors.dim}$${RESET} squads goal progress ${colors.dim}Update goal progress${RESET}`);\n writeLine();\n}\n","import { execSync } from 'child_process';\nimport { existsSync, readFileSync } from 'fs';\nimport { join } from 'path';\nimport { findMemoryDir } from '../lib/memory.js';\nimport {\n colors,\n bold,\n RESET,\n gradient,\n box,\n padEnd,\n truncate,\n icons,\n writeLine,\n} from '../lib/terminal.js';\n\ninterface TaskEntry {\n id: string;\n squad: string;\n description: string;\n status: 'active' | 'completed' | 'failed';\n startedAt: string;\n}\n\ninterface ProcessInfo {\n pid: string;\n cpu: string;\n mem: string;\n time: string;\n command: string;\n type: 'claude' | 'agent' | 'hook' | 'dev-server';\n}\n\nfunction getTasksFilePath(): string | null {\n const memoryDir = findMemoryDir();\n if (!memoryDir) return null;\n return join(memoryDir, '..', 'tasks.json');\n}\n\nfunction loadActiveTasks(): TaskEntry[] {\n const tasksPath = getTasksFilePath();\n if (!tasksPath || !existsSync(tasksPath)) return [];\n\n try {\n const data = JSON.parse(readFileSync(tasksPath, 'utf-8'));\n return data.tasks?.filter((t: TaskEntry) => t.status === 'active') || [];\n } catch {\n return [];\n }\n}\n\nfunction getRunningProcesses(): ProcessInfo[] {\n const processes: ProcessInfo[] = [];\n\n try {\n // Get Claude and related processes\n const psOutput = execSync(\n 'ps aux | grep -E \"claude|squads|astro|node.*agent\" | grep -v grep',\n { encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] }\n ).trim();\n\n if (!psOutput) return processes;\n\n for (const line of psOutput.split('\\n')) {\n const parts = line.trim().split(/\\s+/);\n if (parts.length < 11) continue;\n\n const pid = parts[1];\n const cpu = parts[2];\n const mem = parts[3];\n const time = parts[9];\n const command = parts.slice(10).join(' ');\n\n // Categorize the process\n let type: ProcessInfo['type'] = 'agent';\n if (command.includes('claude')) type = 'claude';\n else if (command.includes('squads')) type = 'hook';\n else if (command.includes('astro')) type = 'dev-server';\n\n // Skip very short-lived processes\n if (command.includes('grep')) continue;\n\n processes.push({ pid, cpu, mem, time, command, type });\n }\n } catch {\n // No matching processes\n }\n\n return processes;\n}\n\nfunction categorizeProcesses(processes: ProcessInfo[]): {\n claude: ProcessInfo[];\n hooks: ProcessInfo[];\n devServers: ProcessInfo[];\n agents: ProcessInfo[];\n} {\n return {\n claude: processes.filter(p => p.type === 'claude'),\n hooks: processes.filter(p => p.type === 'hook'),\n devServers: processes.filter(p => p.type === 'dev-server'),\n agents: processes.filter(p => p.type === 'agent'),\n };\n}\n\nfunction formatCommand(cmd: string, maxLen = 45): string {\n // Extract meaningful part of command\n if (cmd.includes('claude')) {\n return truncate('claude (session)', maxLen);\n }\n if (cmd.includes('astro dev')) {\n return truncate('astro dev server', maxLen);\n }\n if (cmd.includes('squads')) {\n const match = cmd.match(/squads\\s+(\\S+)/);\n return truncate(`squads ${match?.[1] || 'command'}`, maxLen);\n }\n return truncate(cmd, maxLen);\n}\n\nexport async function workersCommand(options: { verbose?: boolean; kill?: string } = {}): Promise<void> {\n writeLine();\n writeLine(` ${gradient('squads')} ${colors.dim}workers${RESET}`);\n writeLine();\n\n // Kill a process if requested\n if (options.kill) {\n try {\n execSync(`kill ${options.kill}`, { stdio: 'pipe' });\n writeLine(` ${icons.success} Killed process ${colors.cyan}${options.kill}${RESET}`);\n writeLine();\n return;\n } catch {\n writeLine(` ${icons.error} Failed to kill process ${colors.red}${options.kill}${RESET}`);\n writeLine();\n return;\n }\n }\n\n const activeTasks = loadActiveTasks();\n const processes = getRunningProcesses();\n const categorized = categorizeProcesses(processes);\n\n // Summary stats\n const stats = [\n `${colors.cyan}${categorized.claude.length}${RESET} claude`,\n `${colors.green}${activeTasks.length}${RESET} tasks`,\n `${colors.purple}${categorized.devServers.length}${RESET} dev servers`,\n ].join(` ${colors.dim}│${RESET} `);\n writeLine(` ${stats}`);\n writeLine();\n\n // Claude sessions\n if (categorized.claude.length > 0) {\n writeLine(` ${bold}Claude Sessions${RESET} ${colors.dim}(terminal tabs)${RESET}`);\n writeLine();\n\n const w = { pid: 8, cpu: 6, mem: 6, time: 8, cmd: 30 };\n const tableWidth = w.pid + w.cpu + w.mem + w.time + w.cmd + 8;\n\n writeLine(` ${colors.purple}${box.topLeft}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.topRight}${RESET}`);\n writeLine(` ${colors.purple}${box.vertical}${RESET} ${bold}${padEnd('PID', w.pid)}${padEnd('CPU%', w.cpu)}${padEnd('MEM%', w.mem)}${padEnd('TIME', w.time)}${padEnd('STATUS', w.cmd)}${RESET} ${colors.purple}${box.vertical}${RESET}`);\n writeLine(` ${colors.purple}${box.teeRight}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.teeLeft}${RESET}`);\n\n for (const proc of categorized.claude) {\n const cpuColor = parseFloat(proc.cpu) > 50 ? colors.yellow : colors.dim;\n const status = parseFloat(proc.cpu) > 10 ? `${icons.active} active` : `${icons.pending} idle`;\n\n const row = ` ${colors.purple}${box.vertical}${RESET} ` +\n `${colors.cyan}${padEnd(proc.pid, w.pid)}${RESET}` +\n `${cpuColor}${padEnd(proc.cpu, w.cpu)}${RESET}` +\n `${colors.dim}${padEnd(proc.mem, w.mem)}${RESET}` +\n `${colors.dim}${padEnd(proc.time, w.time)}${RESET}` +\n `${padEnd(status, w.cmd)}` +\n ` ${colors.purple}${box.vertical}${RESET}`;\n writeLine(row);\n }\n\n writeLine(` ${colors.purple}${box.bottomLeft}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.bottomRight}${RESET}`);\n writeLine();\n }\n\n // Active tasks (registered via squads progress start)\n if (activeTasks.length > 0) {\n writeLine(` ${bold}Registered Tasks${RESET} ${colors.dim}(squads progress)${RESET}`);\n writeLine();\n\n for (const task of activeTasks) {\n const elapsed = getElapsedTime(task.startedAt);\n writeLine(` ${icons.progress} ${colors.cyan}${task.squad}${RESET} ${truncate(task.description, 40)}`);\n writeLine(` ${colors.dim}id: ${task.id} · started ${elapsed} ago${RESET}`);\n }\n writeLine();\n }\n\n // Dev servers\n if (categorized.devServers.length > 0) {\n writeLine(` ${bold}Dev Servers${RESET}`);\n writeLine();\n\n for (const proc of categorized.devServers) {\n const name = formatCommand(proc.command);\n writeLine(` ${icons.active} ${colors.green}${name}${RESET} ${colors.dim}(pid: ${proc.pid})${RESET}`);\n }\n writeLine();\n }\n\n // Hooks/squads processes\n if (categorized.hooks.length > 0) {\n writeLine(` ${bold}Hook Processes${RESET}`);\n writeLine();\n\n for (const proc of categorized.hooks) {\n const name = formatCommand(proc.command);\n writeLine(` ${icons.pending} ${colors.yellow}${name}${RESET} ${colors.dim}(pid: ${proc.pid})${RESET}`);\n }\n writeLine();\n }\n\n // No workers message\n if (categorized.claude.length === 0 && activeTasks.length === 0) {\n writeLine(` ${colors.dim}No active workers${RESET}`);\n writeLine();\n }\n\n // Commands\n writeLine(` ${colors.dim}$${RESET} squads workers --kill <pid> ${colors.dim}Kill a process${RESET}`);\n writeLine(` ${colors.dim}$${RESET} squads progress ${colors.dim}Task history${RESET}`);\n writeLine();\n}\n\nfunction getElapsedTime(startTime: string): string {\n const start = new Date(startTime).getTime();\n const now = Date.now();\n const diffMs = now - start;\n\n const minutes = Math.floor(diffMs / 60000);\n const hours = Math.floor(minutes / 60);\n const days = Math.floor(hours / 24);\n\n if (days > 0) return `${days}d`;\n if (hours > 0) return `${hours}h`;\n if (minutes > 0) return `${minutes}m`;\n return '<1m';\n}\n","/**\n * List active Claude Code sessions across squads\n */\n\nimport {\n getActiveSessions,\n getSessionSummary,\n cleanupStaleSessions,\n getSessionHistoryStats,\n getRecentSessions,\n SessionState,\n SessionEvent,\n} from '../lib/sessions.js';\nimport {\n colors,\n bold,\n RESET,\n gradient,\n box,\n padEnd,\n icons,\n writeLine,\n} from '../lib/terminal.js';\n\ninterface SessionsOptions {\n verbose?: boolean;\n json?: boolean;\n}\n\nexport async function sessionsCommand(\n options: SessionsOptions = {}\n): Promise<void> {\n // Clean up stale sessions first\n cleanupStaleSessions();\n\n const sessions = getActiveSessions();\n const summary = getSessionSummary();\n\n // JSON output for scripts\n if (options.json) {\n console.log(JSON.stringify({ sessions, summary }, null, 2));\n return;\n }\n\n writeLine();\n writeLine(` ${gradient('squads')} ${colors.dim}sessions${RESET}`);\n writeLine();\n\n if (sessions.length === 0) {\n writeLine(` ${colors.dim}No active sessions${RESET}`);\n writeLine();\n writeLine(` ${colors.dim}Sessions are tracked automatically when Claude Code runs.${RESET}`);\n writeLine(` ${colors.dim}Each session updates its heartbeat via squads CLI commands.${RESET}`);\n writeLine();\n return;\n }\n\n // Summary line\n const squadText = summary.squadCount === 1 ? 'squad' : 'squads';\n const sessionText = summary.totalSessions === 1 ? 'session' : 'sessions';\n writeLine(` ${colors.green}${summary.totalSessions}${RESET} active ${sessionText} ${colors.dim}across${RESET} ${colors.cyan}${summary.squadCount}${RESET} ${squadText}`);\n writeLine();\n\n // Group by squad\n const bySquad: Record<string, SessionState[]> = {};\n for (const session of sessions) {\n const squad = session.squad || 'unknown';\n if (!bySquad[squad]) bySquad[squad] = [];\n bySquad[squad].push(session);\n }\n\n // Table\n const w = { squad: 16, sessions: 10, activity: 14 };\n const tableWidth = w.squad + w.sessions + w.activity + 4;\n\n writeLine(` ${colors.purple}${box.topLeft}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.topRight}${RESET}`);\n\n const header = ` ${colors.purple}${box.vertical}${RESET} ` +\n `${bold}${padEnd('SQUAD', w.squad)}${RESET}` +\n `${bold}${padEnd('SESSIONS', w.sessions)}${RESET}` +\n `${bold}LAST ACTIVITY${RESET}` +\n ` ${colors.purple}${box.vertical}${RESET}`;\n writeLine(header);\n\n writeLine(` ${colors.purple}${box.teeRight}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.teeLeft}${RESET}`);\n\n for (const [squad, squadSessions] of Object.entries(bySquad).sort()) {\n // Find most recent activity\n let mostRecent = 0;\n for (const session of squadSessions) {\n const ts = new Date(session.lastHeartbeat).getTime();\n if (ts > mostRecent) mostRecent = ts;\n }\n\n const lastActivity = formatTimeAgo(mostRecent);\n const activityColor = getActivityColor(mostRecent);\n\n const row = ` ${colors.purple}${box.vertical}${RESET} ` +\n `${colors.cyan}${padEnd(squad, w.squad)}${RESET}` +\n `${padEnd(String(squadSessions.length), w.sessions)}` +\n `${padEnd(`${activityColor}${lastActivity}${RESET}`, w.activity)}` +\n `${colors.purple}${box.vertical}${RESET}`;\n\n writeLine(row);\n }\n\n writeLine(` ${colors.purple}${box.bottomLeft}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.bottomRight}${RESET}`);\n\n // Verbose: show individual sessions\n if (options.verbose) {\n writeLine();\n writeLine(` ${bold}Session Details${RESET}`);\n writeLine();\n\n for (const session of sessions) {\n const squad = session.squad || 'unknown';\n const ago = formatTimeAgo(new Date(session.lastHeartbeat).getTime());\n\n writeLine(` ${icons.active} ${colors.white}${session.sessionId}${RESET}`);\n writeLine(` ${colors.dim}squad: ${squad} | pid: ${session.pid} | heartbeat: ${ago}${RESET}`);\n writeLine(` ${colors.dim}cwd: ${session.cwd}${RESET}`);\n }\n }\n\n writeLine();\n writeLine(` ${colors.dim}$${RESET} squads sessions -v ${colors.dim}Show session details${RESET}`);\n writeLine();\n}\n\n/**\n * Format timestamp as \"Xm ago\" or \"Xs ago\"\n */\nfunction formatTimeAgo(timestamp: number): string {\n const now = Date.now();\n const diff = now - timestamp;\n\n const seconds = Math.floor(diff / 1000);\n const minutes = Math.floor(seconds / 60);\n\n if (minutes >= 1) {\n return `${minutes}m ago`;\n }\n return `${seconds}s ago`;\n}\n\n/**\n * Get color based on how recent the activity is\n */\nfunction getActivityColor(timestamp: number): string {\n const now = Date.now();\n const diff = now - timestamp;\n\n const minutes = Math.floor(diff / (1000 * 60));\n\n if (minutes < 1) return colors.green;\n if (minutes < 3) return colors.yellow;\n return colors.dim;\n}\n\ninterface HistoryOptions {\n days?: number;\n squad?: string;\n json?: boolean;\n}\n\n/**\n * Show session history and statistics\n */\nexport async function sessionsHistoryCommand(\n options: HistoryOptions = {}\n): Promise<void> {\n const days = options.days || 7;\n const since = new Date(Date.now() - days * 24 * 60 * 60 * 1000);\n\n const stats = await getSessionHistoryStats({\n since,\n squad: options.squad,\n });\n\n const recentSessions = await getRecentSessions(10);\n\n // JSON output\n if (options.json) {\n console.log(JSON.stringify({ stats, recentSessions }, null, 2));\n return;\n }\n\n writeLine();\n writeLine(` ${gradient('squads')} ${colors.dim}sessions history${RESET} ${colors.dim}(${days}d)${RESET}`);\n writeLine();\n\n if (stats.totalSessions === 0) {\n writeLine(` ${colors.dim}No session history found${RESET}`);\n writeLine();\n writeLine(` ${colors.dim}Session events are logged to .agents/sessions/history.jsonl${RESET}`);\n writeLine();\n return;\n }\n\n // Summary stats\n const avgMinutes = Math.round(stats.avgDurationMs / 60000);\n const totalHours = Math.round(stats.totalDurationMs / 3600000 * 10) / 10;\n\n writeLine(` ${bold}Summary${RESET}`);\n writeLine(` ${colors.cyan}${stats.totalSessions}${RESET} sessions ${colors.dim}│${RESET} ${colors.green}${totalHours}h${RESET} total ${colors.dim}│${RESET} ${colors.yellow}${avgMinutes}m${RESET} avg ${colors.dim}│${RESET} ${colors.purple}${stats.peakConcurrent}${RESET} peak`);\n writeLine();\n\n // By squad table\n const squads = Object.entries(stats.bySquad).sort((a, b) => b[1].count - a[1].count);\n\n if (squads.length > 0) {\n const w = { squad: 16, sessions: 10, duration: 12 };\n const tableWidth = w.squad + w.sessions + w.duration + 4;\n\n writeLine(` ${bold}By Squad${RESET}`);\n writeLine();\n writeLine(` ${colors.purple}${box.topLeft}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.topRight}${RESET}`);\n\n const header = ` ${colors.purple}${box.vertical}${RESET} ` +\n `${bold}${padEnd('SQUAD', w.squad)}${RESET}` +\n `${bold}${padEnd('SESSIONS', w.sessions)}${RESET}` +\n `${bold}DURATION${RESET}` +\n ` ${colors.purple}${box.vertical}${RESET}`;\n writeLine(header);\n\n writeLine(` ${colors.purple}${box.teeRight}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.teeLeft}${RESET}`);\n\n for (const [squad, data] of squads) {\n const hours = Math.round(data.durationMs / 3600000 * 10) / 10;\n\n const row = ` ${colors.purple}${box.vertical}${RESET} ` +\n `${colors.cyan}${padEnd(squad, w.squad)}${RESET}` +\n `${padEnd(String(data.count), w.sessions)}` +\n `${padEnd(`${hours}h`, w.duration)}` +\n `${colors.purple}${box.vertical}${RESET}`;\n\n writeLine(row);\n }\n\n writeLine(` ${colors.purple}${box.bottomLeft}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.bottomRight}${RESET}`);\n }\n\n // Recent sessions\n if (recentSessions.length > 0) {\n writeLine();\n writeLine(` ${bold}Recent Sessions${RESET}`);\n writeLine();\n\n for (const event of recentSessions.slice(0, 5)) {\n const squad = event.squad || 'unknown';\n const date = new Date(event.ts);\n const timeStr = date.toLocaleTimeString('en-US', { hour: '2-digit', minute: '2-digit' });\n const dateStr = date.toLocaleDateString('en-US', { month: 'short', day: 'numeric' });\n\n writeLine(` ${colors.dim}${dateStr} ${timeStr}${RESET} ${colors.cyan}${squad}${RESET} ${colors.dim}${event.sessionId.slice(0, 8)}${RESET}`);\n }\n }\n\n // By date (last 7 days)\n const dates = Object.entries(stats.byDate)\n .sort((a, b) => b[0].localeCompare(a[0]))\n .slice(0, 7);\n\n if (dates.length > 1) {\n writeLine();\n writeLine(` ${bold}Daily Activity${RESET}`);\n writeLine();\n\n for (const [date, count] of dates) {\n const bar = '█'.repeat(Math.min(count, 20));\n writeLine(` ${colors.dim}${date}${RESET} ${colors.green}${bar}${RESET} ${count}`);\n }\n }\n\n writeLine();\n writeLine(` ${colors.dim}$${RESET} squads sessions history --days 30 ${colors.dim}Longer history${RESET}`);\n writeLine(` ${colors.dim}$${RESET} squads sessions history -s website ${colors.dim}Filter by squad${RESET}`);\n writeLine();\n}\n","/**\n * Session lifecycle commands: start, stop, heartbeat\n * Used by Claude Code hooks for session tracking\n */\n\nimport {\n startSession,\n stopSession,\n updateHeartbeat,\n detectSquad,\n cleanupStaleSessions,\n} from '../lib/sessions.js';\nimport {\n colors,\n RESET,\n icons,\n writeLine,\n} from '../lib/terminal.js';\n\ninterface SessionStartOptions {\n squad?: string;\n quiet?: boolean;\n}\n\ninterface SessionStopOptions {\n quiet?: boolean;\n}\n\ninterface SessionHeartbeatOptions {\n quiet?: boolean;\n}\n\n/**\n * Start a new session\n */\nexport async function sessionStartCommand(\n options: SessionStartOptions = {}\n): Promise<void> {\n // Clean up stale sessions first\n cleanupStaleSessions();\n\n const session = startSession(options.squad);\n\n if (!options.quiet) {\n if (session) {\n writeLine(`${icons.active} Session started: ${colors.cyan}${session.sessionId}${RESET}`);\n if (session.squad) {\n writeLine(` ${colors.dim}Squad: ${session.squad}${RESET}`);\n }\n } else {\n writeLine(`${colors.yellow}Could not start session (no .agents directory)${RESET}`);\n }\n }\n}\n\n/**\n * Stop current session\n */\nexport async function sessionStopCommand(\n options: SessionStopOptions = {}\n): Promise<void> {\n const stopped = stopSession();\n\n if (!options.quiet) {\n if (stopped) {\n writeLine(`${icons.progress} Session stopped`);\n } else {\n writeLine(`${colors.dim}No active session to stop${RESET}`);\n }\n }\n}\n\n/**\n * Update heartbeat for current session\n */\nexport async function sessionHeartbeatCommand(\n options: SessionHeartbeatOptions = {}\n): Promise<void> {\n const updated = updateHeartbeat();\n\n if (!options.quiet) {\n if (updated) {\n writeLine(`${icons.active} Heartbeat updated`);\n } else {\n writeLine(`${colors.dim}No session to update${RESET}`);\n }\n }\n}\n\n/**\n * Detect current squad based on cwd\n */\nexport async function detectSquadCommand(): Promise<void> {\n const squad = detectSquad();\n\n if (squad) {\n // Output just the squad name for use in shell scripts\n process.stdout.write(squad);\n }\n}\n","import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'fs';\nimport { join } from 'path';\nimport { homedir } from 'os';\nimport { execSync, spawn } from 'child_process';\nimport {\n colors,\n bold,\n RESET,\n gradient,\n icons,\n writeLine,\n box,\n padEnd,\n} from '../lib/terminal.js';\n\ninterface StackConfig {\n SQUADS_DATABASE_URL: string;\n SQUADS_BRIDGE_URL: string;\n LANGFUSE_HOST: string;\n LANGFUSE_PUBLIC_KEY: string;\n LANGFUSE_SECRET_KEY: string;\n REDIS_URL: string;\n}\n\ninterface ContainerStatus {\n name: string;\n running: boolean;\n healthy: boolean;\n port?: string;\n}\n\nconst DEFAULT_CONFIG: StackConfig = {\n SQUADS_DATABASE_URL: 'postgresql://squads:squads@localhost:5433/squads',\n SQUADS_BRIDGE_URL: 'http://localhost:8088',\n LANGFUSE_HOST: 'http://localhost:3100',\n LANGFUSE_PUBLIC_KEY: '',\n LANGFUSE_SECRET_KEY: '',\n REDIS_URL: 'redis://localhost:6379',\n};\n\nconst CONFIG_PATH = join(homedir(), '.squadsrc');\n\n/**\n * Load config from ~/.squadsrc\n */\nexport function loadStackConfig(): Partial<StackConfig> | null {\n if (!existsSync(CONFIG_PATH)) {\n return null;\n }\n\n try {\n const content = readFileSync(CONFIG_PATH, 'utf-8');\n const config: Partial<StackConfig> = {};\n\n for (const line of content.split('\\n')) {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith('#')) continue;\n\n const match = trimmed.match(/^export\\s+(\\w+)=[\"']?([^\"'\\n]*)[\"']?$/);\n if (match) {\n const [, key, value] = match;\n if (key in DEFAULT_CONFIG) {\n (config as Record<string, string>)[key] = value;\n }\n }\n }\n\n return config;\n } catch {\n return null;\n }\n}\n\n/**\n * Save config to ~/.squadsrc\n */\nfunction saveStackConfig(config: StackConfig): void {\n const lines = [\n '# Squads CLI Local Stack Configuration',\n '# Generated by: squads stack init',\n `# Date: ${new Date().toISOString().split('T')[0]}`,\n '',\n '# Database',\n `export SQUADS_DATABASE_URL=\"${config.SQUADS_DATABASE_URL}\"`,\n '',\n '# Bridge API',\n `export SQUADS_BRIDGE_URL=\"${config.SQUADS_BRIDGE_URL}\"`,\n '',\n '# Langfuse',\n `export LANGFUSE_HOST=\"${config.LANGFUSE_HOST}\"`,\n `export LANGFUSE_PUBLIC_KEY=\"${config.LANGFUSE_PUBLIC_KEY}\"`,\n `export LANGFUSE_SECRET_KEY=\"${config.LANGFUSE_SECRET_KEY}\"`,\n '',\n '# Redis',\n `export REDIS_URL=\"${config.REDIS_URL}\"`,\n '',\n '# To activate: source ~/.squadsrc',\n '',\n ];\n\n writeFileSync(CONFIG_PATH, lines.join('\\n'));\n}\n\n/**\n * Apply config to current process environment\n */\nexport function applyStackConfig(): void {\n const config = loadStackConfig();\n if (!config) return;\n\n for (const [key, value] of Object.entries(config)) {\n if (value && !process.env[key]) {\n process.env[key] = value;\n }\n }\n}\n\n/**\n * Check if Docker is running\n */\nfunction isDockerRunning(): boolean {\n try {\n execSync('docker info', { stdio: 'ignore' });\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Get container status\n */\nfunction getContainerStatus(name: string): ContainerStatus {\n try {\n // First check if container is running\n const runningOutput = execSync(\n `docker inspect ${name} --format '{{.State.Running}}'`,\n { encoding: 'utf-8', stdio: ['pipe', 'pipe', 'ignore'] }\n ).trim();\n\n const running = runningOutput === 'true';\n\n if (!running) {\n return { name, running: false, healthy: false };\n }\n\n // Get port info\n let port: string | undefined;\n try {\n const portOutput = execSync(\n `docker inspect ${name} --format '{{range .NetworkSettings.Ports}}{{range .}}{{.HostPort}}{{end}}{{end}}'`,\n { encoding: 'utf-8', stdio: ['pipe', 'pipe', 'ignore'] }\n ).trim();\n port = portOutput || undefined;\n } catch {\n // Ignore port errors\n }\n\n // Check health status (may not exist for all containers)\n let healthy = true; // Default to healthy if running but no health check\n try {\n const healthOutput = execSync(\n `docker inspect ${name} --format '{{if .State.Health}}{{.State.Health.Status}}{{else}}none{{end}}'`,\n { encoding: 'utf-8', stdio: ['pipe', 'pipe', 'ignore'] }\n ).trim();\n\n if (healthOutput === 'healthy' || healthOutput === 'none') {\n healthy = true;\n } else if (healthOutput === 'starting') {\n healthy = false; // Starting means not yet healthy\n } else {\n healthy = false; // unhealthy or other states\n }\n } catch {\n // If health check fails, assume healthy if running\n healthy = true;\n }\n\n return { name, running, healthy, port };\n } catch {\n return { name, running: false, healthy: false };\n }\n}\n\n/**\n * Check service connectivity\n */\nasync function checkService(url: string, timeout = 2000): Promise<boolean> {\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeout);\n\n const response = await fetch(url, { signal: controller.signal });\n clearTimeout(timeoutId);\n return response.ok;\n } catch {\n return false;\n }\n}\n\n/**\n * Get Langfuse API keys from the docker .env file\n */\nfunction getLangfuseKeysFromDockerEnv(): { publicKey: string; secretKey: string } | null {\n const envPaths = [\n join(process.cwd(), 'docker', '.env'),\n join(process.cwd(), '..', 'squads-cli', 'docker', '.env'),\n join(homedir(), 'agents-squads', 'squads-cli', 'docker', '.env'),\n ];\n\n for (const envPath of envPaths) {\n if (existsSync(envPath)) {\n const content = readFileSync(envPath, 'utf-8');\n const publicMatch = content.match(/LANGFUSE_PUBLIC_KEY=(\\S+)/);\n const secretMatch = content.match(/LANGFUSE_SECRET_KEY=(\\S+)/);\n\n if (publicMatch && secretMatch) {\n return {\n publicKey: publicMatch[1],\n secretKey: secretMatch[1],\n };\n }\n }\n }\n\n return null;\n}\n\n/**\n * Find docker-compose directory\n */\nfunction findDockerComposeDir(): string | null {\n const candidates = [\n join(process.cwd(), 'docker'),\n join(process.cwd(), '..', 'squads-cli', 'docker'),\n join(homedir(), 'agents-squads', 'squads-cli', 'docker'),\n ];\n\n for (const dir of candidates) {\n if (existsSync(join(dir, 'docker-compose.yml'))) {\n return dir;\n }\n }\n\n return null;\n}\n\n/**\n * squads stack init - detect and configure local stack\n */\nexport async function stackInitCommand(): Promise<void> {\n writeLine();\n writeLine(` ${gradient('squads')} ${colors.dim}stack init${RESET}`);\n writeLine();\n\n // Check Docker\n if (!isDockerRunning()) {\n writeLine(` ${colors.red}${icons.error}${RESET} Docker is not running`);\n writeLine(` ${colors.dim}Start Docker Desktop and try again${RESET}`);\n writeLine();\n return;\n }\n\n writeLine(` ${colors.green}${icons.success}${RESET} Docker is running`);\n\n // Check containers\n const containers = [\n 'squads-postgres',\n 'squads-redis',\n 'squads-bridge',\n 'squads-langfuse',\n 'squads-otel-collector',\n ];\n\n const statuses = containers.map(getContainerStatus);\n const allRunning = statuses.every((s) => s.running);\n\n writeLine();\n writeLine(` ${bold}Containers${RESET}`);\n\n for (const status of statuses) {\n const icon = status.running\n ? status.healthy\n ? `${colors.green}●${RESET}`\n : `${colors.yellow}●${RESET}`\n : `${colors.red}○${RESET}`;\n const portInfo = status.port ? `${colors.dim}:${status.port}${RESET}` : '';\n writeLine(` ${icon} ${status.name}${portInfo}`);\n }\n\n if (!allRunning) {\n writeLine();\n writeLine(` ${colors.yellow}${icons.warning}${RESET} Some containers not running`);\n writeLine(` ${colors.dim}Run: squads stack up${RESET}`);\n writeLine();\n return;\n }\n\n // Get Langfuse keys\n const langfuseKeys = getLangfuseKeysFromDockerEnv();\n\n // Build config\n const config: StackConfig = {\n ...DEFAULT_CONFIG,\n LANGFUSE_PUBLIC_KEY: langfuseKeys?.publicKey || '',\n LANGFUSE_SECRET_KEY: langfuseKeys?.secretKey || '',\n };\n\n // Test connections\n writeLine();\n writeLine(` ${bold}Testing connections${RESET}`);\n\n const bridgeOk = await checkService(`${config.SQUADS_BRIDGE_URL}/health`);\n const langfuseOk = await checkService(`${config.LANGFUSE_HOST}/api/public/health`);\n\n writeLine(\n ` ${bridgeOk ? colors.green + icons.success : colors.red + icons.error}${RESET} Bridge ${colors.dim}${config.SQUADS_BRIDGE_URL}${RESET}`\n );\n writeLine(\n ` ${langfuseOk ? colors.green + icons.success : colors.red + icons.error}${RESET} Langfuse ${colors.dim}${config.LANGFUSE_HOST}${RESET}`\n );\n\n // Save config\n saveStackConfig(config);\n\n writeLine();\n writeLine(` ${colors.green}${icons.success}${RESET} Config saved to ${colors.cyan}~/.squadsrc${RESET}`);\n writeLine();\n writeLine(` ${colors.dim}To activate in current shell:${RESET}`);\n writeLine(` ${colors.cyan}source ~/.squadsrc${RESET}`);\n writeLine();\n writeLine(` ${colors.dim}Or add to your ~/.zshrc:${RESET}`);\n writeLine(` ${colors.cyan}[ -f ~/.squadsrc ] && source ~/.squadsrc${RESET}`);\n writeLine();\n}\n\n/**\n * squads stack status - show connection health\n */\nexport async function stackStatusCommand(): Promise<void> {\n writeLine();\n writeLine(` ${gradient('squads')} ${colors.dim}stack status${RESET}`);\n writeLine();\n\n // Check Docker\n if (!isDockerRunning()) {\n writeLine(` ${colors.red}${icons.error}${RESET} Docker is not running`);\n writeLine();\n return;\n }\n\n // Container status\n const containers = [\n { name: 'squads-postgres', service: 'Database' },\n { name: 'squads-redis', service: 'Cache' },\n { name: 'squads-bridge', service: 'Bridge API' },\n { name: 'squads-langfuse', service: 'Langfuse' },\n { name: 'squads-otel-collector', service: 'Telemetry' },\n ];\n\n const w = { service: 12, container: 22, status: 12 };\n const tableWidth = w.service + w.container + w.status + 6;\n\n writeLine(` ${colors.purple}${box.topLeft}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.topRight}${RESET}`);\n writeLine(\n ` ${colors.purple}${box.vertical}${RESET} ${bold}${padEnd('SERVICE', w.service)}${RESET}${bold}${padEnd('CONTAINER', w.container)}${RESET}${bold}STATUS${RESET} ${colors.purple}${box.vertical}${RESET}`\n );\n writeLine(` ${colors.purple}${box.teeRight}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.teeLeft}${RESET}`);\n\n for (const { name, service } of containers) {\n const status = getContainerStatus(name);\n const statusIcon = status.running\n ? status.healthy\n ? `${colors.green}● healthy${RESET}`\n : `${colors.yellow}● starting${RESET}`\n : `${colors.red}○ stopped${RESET}`;\n\n writeLine(\n ` ${colors.purple}${box.vertical}${RESET} ${colors.cyan}${padEnd(service, w.service)}${RESET}${colors.dim}${padEnd(name, w.container)}${RESET}${statusIcon} ${colors.purple}${box.vertical}${RESET}`\n );\n }\n\n writeLine(` ${colors.purple}${box.bottomLeft}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.bottomRight}${RESET}`);\n\n // Config status\n writeLine();\n const config = loadStackConfig();\n if (config) {\n writeLine(` ${colors.green}${icons.success}${RESET} Config loaded from ${colors.cyan}~/.squadsrc${RESET}`);\n\n // Check if env vars are set\n const envVars = ['SQUADS_DATABASE_URL', 'SQUADS_BRIDGE_URL', 'LANGFUSE_HOST'];\n const missing = envVars.filter((v) => !process.env[v]);\n\n if (missing.length > 0) {\n writeLine(` ${colors.yellow}${icons.warning}${RESET} Env vars not in shell: ${colors.dim}${missing.join(', ')}${RESET}`);\n writeLine(` ${colors.dim}Run: source ~/.squadsrc${RESET}`);\n } else {\n writeLine(` ${colors.green}${icons.success}${RESET} All env vars loaded`);\n }\n } else {\n writeLine(` ${colors.yellow}${icons.warning}${RESET} No config found`);\n writeLine(` ${colors.dim}Run: squads stack init${RESET}`);\n }\n\n writeLine();\n}\n\n/**\n * squads stack env - print export commands\n */\nexport function stackEnvCommand(): void {\n const config = loadStackConfig();\n\n if (!config) {\n // Output defaults if no config\n console.log(`# Squads Local Stack - Default Config`);\n console.log(`# Run 'squads stack init' to auto-detect and save`);\n console.log();\n for (const [key, value] of Object.entries(DEFAULT_CONFIG)) {\n console.log(`export ${key}=\"${value}\"`);\n }\n return;\n }\n\n // Output saved config\n console.log(`# Squads Local Stack Config`);\n console.log(`# From: ~/.squadsrc`);\n console.log();\n for (const [key, value] of Object.entries(config)) {\n console.log(`export ${key}=\"${value}\"`);\n }\n}\n\n/**\n * squads stack up - start docker compose\n */\nexport async function stackUpCommand(): Promise<void> {\n writeLine();\n writeLine(` ${gradient('squads')} ${colors.dim}stack up${RESET}`);\n writeLine();\n\n const composeDir = findDockerComposeDir();\n\n if (!composeDir) {\n writeLine(` ${colors.red}${icons.error}${RESET} docker-compose.yml not found`);\n writeLine();\n writeLine(` ${colors.dim}Expected locations:${RESET}`);\n writeLine(` ${colors.dim} ./docker/docker-compose.yml${RESET}`);\n writeLine(` ${colors.dim} ~/agents-squads/squads-cli/docker/docker-compose.yml${RESET}`);\n writeLine();\n return;\n }\n\n writeLine(` ${colors.cyan}${icons.progress}${RESET} Starting containers from ${colors.dim}${composeDir}${RESET}`);\n writeLine();\n\n try {\n const child = spawn('docker-compose', ['up', '-d'], {\n cwd: composeDir,\n stdio: 'inherit',\n });\n\n await new Promise<void>((resolve, reject) => {\n child.on('close', (code) => {\n if (code === 0) resolve();\n else reject(new Error(`docker-compose exited with code ${code}`));\n });\n child.on('error', reject);\n });\n\n writeLine();\n writeLine(` ${colors.green}${icons.success}${RESET} Stack started`);\n writeLine(` ${colors.dim}Run: squads stack init${RESET} to configure CLI`);\n writeLine();\n } catch (error) {\n writeLine(` ${colors.red}${icons.error}${RESET} Failed to start stack`);\n writeLine(` ${colors.dim}${error}${RESET}`);\n writeLine();\n }\n}\n\n/**\n * squads stack health - comprehensive health check with diagnostics\n */\nexport async function stackHealthCommand(verbose = false): Promise<void> {\n writeLine();\n writeLine(` ${gradient('squads')} ${colors.dim}stack health${RESET}`);\n writeLine();\n\n // Check Docker\n if (!isDockerRunning()) {\n writeLine(` ${colors.red}${icons.error}${RESET} Docker is not running`);\n writeLine();\n process.exitCode = 1;\n return;\n }\n\n // All containers including engram stack\n const containers = [\n { name: 'squads-postgres', service: 'postgres', healthUrl: '', critical: true },\n { name: 'squads-redis', service: 'redis', healthUrl: '', critical: true },\n { name: 'squads-neo4j', service: 'neo4j', healthUrl: 'http://localhost:7474', critical: false },\n { name: 'squads-bridge', service: 'bridge', healthUrl: 'http://localhost:8088/health', critical: true },\n { name: 'squads-otel-collector', service: 'otel', healthUrl: '', critical: false },\n { name: 'squads-langfuse', service: 'langfuse', healthUrl: 'http://localhost:3100/api/public/health', critical: false },\n { name: 'squads-mem0', service: 'mem0', healthUrl: 'http://localhost:8000/health', critical: false },\n { name: 'squads-engram-mcp', service: 'engram', healthUrl: 'http://localhost:8080/', critical: false },\n ];\n\n let hasFailures = false;\n const results: Array<{ name: string; service: string; ok: boolean; status: string; logs?: string }> = [];\n\n for (const container of containers) {\n const status = getContainerStatus(container.name);\n let ok = status.running && status.healthy;\n let statusText = '';\n\n if (!status.running) {\n statusText = 'stopped';\n ok = false;\n } else if (!status.healthy) {\n statusText = 'unhealthy';\n ok = false;\n } else if (container.healthUrl) {\n // Additional HTTP health check\n const httpOk = await checkService(container.healthUrl);\n if (!httpOk) {\n statusText = 'not responding';\n ok = false;\n } else {\n statusText = 'healthy';\n }\n } else {\n statusText = 'healthy';\n }\n\n // Get logs if unhealthy\n let logs: string | undefined;\n if (!ok && verbose) {\n try {\n logs = execSync(`docker logs ${container.name} --tail 10 2>&1`, {\n encoding: 'utf-8',\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n } catch {\n logs = '(no logs available)';\n }\n }\n\n if (!ok && container.critical) {\n hasFailures = true;\n }\n\n results.push({ name: container.name, service: container.service, ok, status: statusText, logs });\n }\n\n // Display results\n for (const r of results) {\n const icon = r.ok ? `${colors.green}✓${RESET}` : `${colors.red}✗${RESET}`;\n const statusColor = r.ok ? colors.green : colors.red;\n writeLine(` ${icon} ${padEnd(r.service, 10)} ${statusColor}${r.status}${RESET}`);\n\n if (r.logs && !r.ok) {\n writeLine(` ${colors.dim}${'-'.repeat(40)}${RESET}`);\n for (const line of r.logs.split('\\n').slice(0, 5)) {\n writeLine(` ${colors.dim}${line.substring(0, 70)}${RESET}`);\n }\n }\n }\n\n writeLine();\n\n // Summary\n const healthy = results.filter((r) => r.ok).length;\n const total = results.length;\n\n if (hasFailures) {\n writeLine(` ${colors.red}${icons.error}${RESET} ${healthy}/${total} services healthy - critical failures`);\n writeLine(` ${colors.dim}Run with -v for logs: squads stack health -v${RESET}`);\n process.exitCode = 1;\n } else if (healthy < total) {\n writeLine(` ${colors.yellow}${icons.warning}${RESET} ${healthy}/${total} services healthy - non-critical issues`);\n } else {\n writeLine(` ${colors.green}${icons.success}${RESET} ${healthy}/${total} services healthy`);\n }\n\n writeLine();\n}\n\n/**\n * squads stack logs - show logs for a specific service\n */\nexport function stackLogsCommand(service: string, tail = 50): void {\n const containerMap: Record<string, string> = {\n postgres: 'squads-postgres',\n redis: 'squads-redis',\n neo4j: 'squads-neo4j',\n bridge: 'squads-bridge',\n otel: 'squads-otel-collector',\n langfuse: 'squads-langfuse',\n mem0: 'squads-mem0',\n engram: 'squads-engram-mcp',\n };\n\n const container = containerMap[service] || `squads-${service}`;\n\n try {\n execSync(`docker logs ${container} --tail ${tail}`, { stdio: 'inherit' });\n } catch {\n writeLine(` ${colors.red}${icons.error}${RESET} Container ${container} not found`);\n }\n}\n\n/**\n * squads stack down - stop docker compose\n */\nexport async function stackDownCommand(): Promise<void> {\n writeLine();\n writeLine(` ${gradient('squads')} ${colors.dim}stack down${RESET}`);\n writeLine();\n\n const composeDir = findDockerComposeDir();\n\n if (!composeDir) {\n writeLine(` ${colors.red}${icons.error}${RESET} docker-compose.yml not found`);\n writeLine();\n return;\n }\n\n writeLine(` ${colors.cyan}${icons.progress}${RESET} Stopping containers...`);\n writeLine();\n\n try {\n const child = spawn('docker-compose', ['down'], {\n cwd: composeDir,\n stdio: 'inherit',\n });\n\n await new Promise<void>((resolve, reject) => {\n child.on('close', (code) => {\n if (code === 0) resolve();\n else reject(new Error(`docker-compose exited with code ${code}`));\n });\n child.on('error', reject);\n });\n\n writeLine();\n writeLine(` ${colors.green}${icons.success}${RESET} Stack stopped`);\n writeLine();\n } catch (error) {\n writeLine(` ${colors.red}${icons.error}${RESET} Failed to stop stack`);\n writeLine(` ${colors.dim}${error}${RESET}`);\n writeLine();\n }\n}\n"],"mappings":"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","names":["existsSync","join","homedir","chalk","existsSync","join","config","config","existsSync","ora","join","dirname","existsSync","readFileSync","writeFileSync","mkdirSync","readFileSync","existsSync","writeFileSync","join","progress","goal","readFileSync","writeFileSync","existsSync","readdirSync","mkdirSync","join","statSync","join","dirname","existsSync","mkdirSync","readFileSync","writeFileSync","ora","existsSync","join","existsSync","mkdirSync","readdirSync","readFileSync","writeFileSync","join","dirname","execSync","readdirSync","readFileSync","join","session","writeFileSync","existsSync","sessions","existsSync","readFileSync","writeFileSync","mkdirSync","unlinkSync","join","dirname","homedir","execSync","__filename","__dirname","execSync","unlinkSync","join","existsSync","execSync","existsSync","readFileSync","writeFileSync","mkdirSync","readdirSync","join","join","existsSync","readFileSync","writeFileSync","execSync","mkdirSync","readdirSync","goal","progress","readFileSync","writeFileSync","existsSync","mkdirSync","readdirSync","join","dirname","join","existsSync","readFileSync","feedback","dirname","mkdirSync","writeFileSync","readdirSync","readdirSync","existsSync","statSync","join","homedir","require","pool","join","existsSync","readdirSync","statSync","goal","join","homedir","existsSync","goal","execSync","execSync","execSync","spawn","ora","DEFAULT_ORG","DEFAULT_REPOS","execSync","ora","spawn","execSync","spawn","readdirSync","join","ora","readdirSync","join","ora","execSync","executeClaudePrompt","spawn","chalk","ora","existsSync","readFileSync","writeFileSync","mkdirSync","join","homedir","session","chalk","ora","session","createInterface","createInterface","info","execSync","existsSync","readFileSync","writeFileSync","mkdirSync","join","join","existsSync","mkdirSync","readFileSync","writeFileSync","execSync","execSync","execSync","getGitHubStats","goal","execSync","existsSync","readFileSync","join","getTasksFilePath","join","existsSync","readFileSync","execSync","getElapsedTime","sessions","session","session","existsSync","readFileSync","writeFileSync","join","homedir","execSync","spawn","CONFIG_PATH","join","homedir","existsSync","readFileSync","config","writeFileSync","execSync","envPaths","spawn","join","homedir","existsSync","chalk"]}
|
|
1
|
+
{"version":3,"sources":["../src/cli.ts","../src/lib/stack-config.ts","../src/commands/orchestrate.ts","../src/lib/orchestration/lead-orchestrator.ts","../src/commands/trigger.ts","../src/commands/autonomous.ts","../src/commands/approval.ts","../src/commands/deploy.ts","../src/commands/eval.ts","../src/commands/cognition.ts"],"sourcesContent":["import { config } from 'dotenv';\nimport { existsSync } from 'fs';\nimport { join } from 'path';\nimport { homedir } from 'os';\nimport { Command } from 'commander';\nimport chalk from 'chalk';\nimport { version } from './version.js';\nimport { colors as termColors, RESET as termReset, bold as termBold, writeLine } from './lib/terminal.js';\n\n// Disable colors when output is piped (not a TTY)\n// This ensures piped output is clean for parsing\nif (!process.stdout.isTTY) {\n chalk.level = 0;\n}\n\n// Handle EPIPE gracefully when output is piped through head/tail/grep\n// These commands close the pipe early, which is normal Unix behavior\nprocess.stdout.on('error', (err: NodeJS.ErrnoException) => {\n if (err.code === 'EPIPE') {\n process.exit(0);\n }\n throw err;\n});\n\nprocess.stderr.on('error', (err: NodeJS.ErrnoException) => {\n if (err.code === 'EPIPE') {\n process.exit(0);\n }\n throw err;\n});\n\n// Load .env from multiple locations (first found wins)\nconst envPaths = [\n join(process.cwd(), '.env'),\n join(process.cwd(), '..', 'hq', '.env'),\n join(homedir(), 'agents-squads', 'hq', '.env'),\n];\n\nfor (const envPath of envPaths) {\n if (existsSync(envPath)) {\n config({ path: envPath, quiet: true });\n break;\n }\n}\n\n// Type-only import (erased at compile time, zero runtime cost)\nimport type { SessionSummaryData } from './commands/sessions.js';\n\n// Setup imports (must run on every invocation)\nimport { registerExitHandler } from './lib/telemetry.js';\nimport { applyStackConfig } from './lib/stack-config.js';\n\n// Register-pattern commands (must define subcommand structure before parseAsync)\nimport { registerOrchestrateCommand } from './commands/orchestrate.js';\nimport { registerTriggerCommand } from './commands/trigger.js';\nimport { registerAutonomousCommand } from './commands/autonomous.js';\nimport { registerApprovalCommand } from './commands/approval.js';\nimport { registerDeployCommand } from './commands/deploy.js';\nimport { registerEvalCommand } from './commands/eval.js';\nimport { registerCognitionCommand } from './commands/cognition.js';\n\n// All other command handlers are lazy-loaded via dynamic import() inside\n// action handlers. Only the invoked command's dependencies are loaded,\n// avoiding heavy transitive deps (pg, supabase, inquirer, ora) on every\n// invocation. Saves ~300ms+ on cold start. See: #24\n\n// Load stack config from ~/.squadsrc (if exists)\napplyStackConfig();\n\n// Seamless auto-update on startup (like Gemini CLI)\n// Runs in background, shows message on success\n// Set SQUADS_NO_AUTO_UPDATE=1 to disable\n// Skip for --help and --version to keep those instant\nconst isHelpOrVersion = process.argv.includes('--help') || process.argv.includes('-h') || process.argv.includes('--version') || process.argv.includes('-V');\nif (!isHelpOrVersion) {\n const { autoUpdateOnStartup } = await import('./lib/update.js');\n await autoUpdateOnStartup();\n}\n\n// Register telemetry exit handler early\nregisterExitHandler();\n\n// Helper: show removed command message\nfunction removedCommand(name: string, alternative: string): () => void {\n return () => {\n console.error(chalk.red(`\\n Command \"${name}\" has been removed.`));\n console.error(chalk.dim(` ${alternative}\\n`));\n process.exit(1);\n };\n}\n\n// ─── Friendly error messages for missing arguments (#317) ─────────────────────\n// Maps command paths to user-friendly hints when required arguments are missing.\n// Each entry: { message: plain-language explanation, example: usage example }\nconst friendlyArgErrors: Record<string, { message: string; example: string }> = {\n 'add': {\n message: 'Specify a name for the new squad.',\n example: 'squads add marketing # add with interactive prompts\\n squads add marketing -d \"Drive growth\" -y # non-interactive',\n },\n 'run': {\n message: 'Specify which squad or agent to run.',\n example: 'squads run engineering # run the whole squad\\n squads run engineering/code-review # run a specific agent',\n },\n 'orchestrate': {\n message: 'Specify which squad to orchestrate.',\n example: 'squads orchestrate intelligence',\n },\n 'eval': {\n message: 'Specify which squad or agent to evaluate.',\n example: 'squads eval company # evaluate all agents in squad\\n squads eval company/coo # evaluate a specific agent',\n },\n 'budget': {\n message: 'Specify which squad to check budget for.',\n example: 'squads budget engineering',\n },\n 'goal set': {\n message: 'Provide the squad name and a goal description.',\n example: 'squads goal set marketing \"Increase blog traffic by 20%\"',\n },\n 'goal complete': {\n message: 'Provide the squad name and the goal index to mark complete.',\n example: 'squads goal complete marketing 1',\n },\n 'goal progress': {\n message: 'Provide the squad, goal index, and progress update.',\n example: 'squads goal progress marketing 1 \"50% — halfway through campaign\"',\n },\n};\n\n/**\n * Detect which command the user invoked from process.argv.\n * Returns the command path (e.g. \"goal set\" or \"run\").\n */\nfunction detectCommandFromArgs(): string | null {\n // argv: [node, script, ...commands/options]\n const args = process.argv.slice(2).filter(a => !a.startsWith('-'));\n if (args.length === 0) return null;\n // Try two-word command first (e.g. \"goal set\"), then single word\n if (args.length >= 2) {\n const twoWord = `${args[0]} ${args[1]}`;\n if (friendlyArgErrors[twoWord]) return twoWord;\n }\n return args[0] || null;\n}\n\n/**\n * Handle Commander.js outputError: intercept \"missing required argument\"\n * errors and show friendly, colorized messages instead of raw format.\n */\nfunction handleOutputError(str: string, write: (s: string) => void): void {\n const missingArgMatch = str.match(/^error: missing required argument '(.+)'/);\n if (missingArgMatch) {\n const argName = missingArgMatch[1];\n const command = detectCommandFromArgs();\n const hint = command ? friendlyArgErrors[command] : null;\n\n // Friendly error header\n process.stderr.write(`\\n ${termColors.red}Missing argument: ${termReset}${termBold}${argName}${termReset}\\n`);\n\n if (hint) {\n process.stderr.write(` ${hint.message}\\n\\n`);\n process.stderr.write(` ${termColors.dim}Usage:${termReset}\\n`);\n for (const line of hint.example.split('\\n')) {\n process.stderr.write(` ${termColors.cyan}$${termReset} ${line.trim()}\\n`);\n }\n } else {\n process.stderr.write(` Run the command with ${termColors.cyan}--help${termReset} for usage information.\\n`);\n }\n\n process.stderr.write('\\n');\n return;\n }\n\n // For all other errors (unknown option, etc.), pass through\n write(str);\n}\n\nconst program = new Command();\n\nprogram\n .name('squads')\n .description('Your AI workforce — business operating system for AI managers')\n .version(version)\n // Enable typo suggestions (Commander.js built-in feature)\n .showSuggestionAfterError(true)\n // Configure help to exit with code 0 (Unix convention)\n .configureOutput({\n outputError: handleOutputError,\n })\n .exitOverride((err) => {\n // Exit code 0 for help display (Unix convention)\n if (err.code === 'commander.helpDisplayed' || err.code === 'commander.version') {\n process.exit(0);\n }\n // For other commander errors, use the default exit code\n if (err.exitCode !== undefined) {\n process.exit(err.exitCode);\n }\n throw err;\n })\n // Default action when no command provided - show status dashboard\n .action(async () => {\n // If args were provided but didn't match any command, they're unknown\n if (program.args.length > 0) {\n const unknown = program.args[0];\n process.stderr.write(`\\n Unknown command: \"${unknown}\"\\n\\n`);\n process.stderr.write(` Run \\`squads --help\\` to see available commands.\\n\\n`);\n process.exit(1);\n }\n\n const { gradient, colors, RESET } = await import('./lib/terminal.js');\n const { checkForUpdate } = await import('./lib/update.js');\n\n writeLine();\n writeLine(` ${gradient('squads')} ${colors.dim}v${version}${RESET}`);\n writeLine();\n\n // Check for updates\n const updateInfo = checkForUpdate();\n if (updateInfo.updateAvailable) {\n writeLine(` ${colors.cyan}⬆${RESET} Update available: ${colors.dim}${updateInfo.currentVersion}${RESET} → ${colors.green}${updateInfo.latestVersion}${RESET}`);\n writeLine(` ${colors.dim}Run \\`squads update\\` to install${RESET}`);\n writeLine();\n }\n\n // Run status command to show all squads (includes quick commands)\n const { statusCommand } = await import('./commands/status.js');\n await statusCommand(undefined, {});\n });\n\n// ─── Execute (daily operations) ──────────────────────────────────────────────\n\n// Init command - plant the seed (manager agent + CLI skill + starter squads)\nprogram\n .command('init')\n .description('Plant the seed: create manager agent, CLI skill, and starter squads')\n .option('-p, --provider <provider>', 'LLM provider (claude, gemini, openai, ollama, none)')\n .option('--pack <packs...>', 'Additional squad packs to install (engineering, marketing, operations, all)')\n .option('--skip-infra', 'Skip infrastructure setup prompt')\n .option('--force', 'Skip requirement checks (for CI/testing)')\n .option('-y, --yes', 'Accept all defaults (non-interactive mode)')\n .option('-q, --quick', 'Quick init - create files only, skip interactive prompts')\n .action(async (options) => {\n const { initCommand } = await import('./commands/init.js');\n return initCommand(options);\n });\n\n// Add command - add a new squad to your workforce\nprogram\n .command('add <name>')\n .description('Add a new squad with directory structure and starter files')\n .option('-d, --description <text>', 'Squad mission (one sentence)')\n .option('-g, --goal <text>', 'First goal for the squad')\n .option('-m, --model <model>', 'Default model (default: sonnet)')\n .option('-f, --force', 'Overwrite existing squad')\n .option('-y, --yes', 'Accept all defaults (non-interactive)')\n .option('-r, --repo', 'Create a GitHub repository for the squad')\n .option('-o, --org <org>', 'GitHub organization for --repo (default: detected from git remote)')\n .addHelpText('after', `\nExamples:\n $ squads add marketing Add with interactive prompts\n $ squads add marketing -d \"Drive growth\" -y Add non-interactively\n $ squads add marketing --force Overwrite existing squad\n $ squads add marketing --repo Add with GitHub repo\n $ squads add marketing --repo --org myorg Add with GitHub repo in specific org\n`)\n .action(async (name, options) => {\n const { createCommand } = await import('./commands/create.js');\n return createCommand(name, options);\n });\n\n// Hidden alias: create → add (backward compat)\nprogram.command('create <name>', { hidden: true }).description('[renamed]').action(removedCommand('create', 'Renamed to: squads add <name>'));\n\n// Run command - execute squads or individual agents\nprogram\n .command('run [target]')\n .description('Run a squad, agent, or autopilot (no target = autopilot mode)')\n .option('-v, --verbose', 'Verbose output')\n .option('-d, --dry-run', 'Show what would be run without executing')\n .option('-a, --agent <agent>', 'Run specific agent within squad')\n .option('-t, --timeout <minutes>', 'Execution timeout in minutes (default: 30)', '30')\n .option('-p, --parallel', 'Run all agents in parallel (N tmux sessions)')\n .option('-l, --lead', 'Lead mode: single orchestrator using Task tool for parallelization')\n .option('-b, --background', 'Run agent in background (detached process)')\n .option('-w, --watch', 'Run in background but tail the log for visibility')\n .option('--use-api', 'Use API credits instead of subscription')\n .option('--effort <level>', 'Effort level: high, medium, low (default: from SQUAD.md or high)')\n .option('--skills <skills...>', 'Skills to load (skill IDs or local paths)')\n .option('--provider <provider>', 'LLM provider: anthropic, google, openai, mistral, xai, aider, ollama')\n .option('--model <model>', 'Model to use (e.g., opus, sonnet, haiku, gemini-2.5-flash, gpt-4o)')\n .option('--trigger <type>', 'Trigger source: manual, scheduled, event, smart (default: manual)')\n .option('--cloud', 'Dispatch execution to cloud worker via API (requires squads login)')\n .option('--task <directive>', 'Founder directive for conversation mode (replaces lead briefing)')\n .option('--max-turns <n>', 'Max conversation turns (default: 20)', '20')\n .option('--cost-ceiling <usd>', 'Cost ceiling in USD (default: 25)', '25')\n .option('--no-verify', 'Skip post-execution verification (Ralph loop)')\n .option('--execute', 'Explicitly execute agents (default for run <target>)')\n .option('-j, --json', 'Output as JSON')\n .option('-i, --interval <minutes>', 'Autopilot: minutes between cycles', '30')\n .option('--max-parallel <count>', 'Autopilot: max parallel squad loops', '2')\n .option('--budget <usd>', 'Autopilot: daily budget cap ($)', '0')\n .option('--once', 'Autopilot: run one cycle then exit')\n .option('--phased', 'Autopilot: use dependency-based phase ordering (from SQUAD.md depends_on)')\n .option('--no-eval', 'Skip post-run COO evaluation')\n .addHelpText('after', `\nExamples:\n $ squads run engineering Run squad conversation (lead → scan → work → review)\n $ squads run engineering --task \"fix CI\" Conversation with founder directive\n $ squads run engineering/code-review Run specific agent (slash notation)\n $ squads run engineering -a code-review Same as above (flag notation)\n $ squads run engineering --dry-run Preview what would run\n $ squads run engineering --parallel Run all agents in parallel (tmux)\n $ squads run engineering --lead Single orchestrator with Task tool\n $ squads run engineering -b Run in background (detached)\n $ squads run engineering -w Run in background but tail logs\n $ squads run research --provider=google Use Gemini CLI instead of Claude\n $ squads run engineering/issue-solver --cloud Dispatch to cloud worker\n $ squads run Autopilot mode (watch → decide → dispatch → learn)\n $ squads run --once --dry-run Preview one autopilot cycle\n $ squads run -i 15 --budget 50 Autopilot: 15min cycles, $50/day cap\n`)\n .action(async (target, options) => {\n const { runCommand } = await import('./commands/run.js');\n return runCommand(target || null, { ...options, timeout: parseInt(options.timeout, 10) });\n });\n\n// List command (removed — use status instead)\nprogram.command('list', { hidden: true }).description('[removed]').action(removedCommand('list', 'Use: squads status'));\n\n// Orchestrate command - lead-coordinated squad execution\nregisterOrchestrateCommand(program);\n\n// Env command - squad execution environment (MCP, skills, budget, model)\nconst env = program\n .command('env')\n .description('View squad execution environment (MCP, skills, model, budget)')\n .action(() => { env.outputHelp(); });\n\nenv\n .command('show <squad>')\n .description('Show execution environment for a squad')\n .option('--json', 'Output as JSON')\n .action(async (squad, options) => {\n const { contextShowCommand } = await import('./commands/context.js');\n return contextShowCommand(squad, options);\n });\n\nenv\n .command('prompt <squad>')\n .description('Output ready-to-use prompt for Claude Code execution')\n .option('-a, --agent <agent>', 'Agent to execute (required)')\n .option('--json', 'Output as JSON')\n .action(async (squad, options) => {\n const { contextPromptCommand } = await import('./commands/context.js');\n return contextPromptCommand(squad, options);\n });\n\n// Exec command group - execution history introspection\nconst exec = program\n .command('exec')\n .description('View execution history and statistics');\n\nexec\n .command('list')\n .description('List recent executions')\n .option('-s, --squad <squad>', 'Filter by squad')\n .option('-a, --agent <agent>', 'Filter by agent')\n .option('--status <status>', 'Filter by status (running, completed, failed)')\n .option('-n, --limit <n>', 'Number of executions to show', '20')\n .option('--json', 'Output as JSON')\n .action(async (options) => {\n const { execListCommand } = await import('./commands/exec.js');\n return execListCommand({ ...options, limit: parseInt(options.limit, 10) });\n });\n\nexec\n .command('show <id>')\n .description('Show execution details')\n .option('--json', 'Output as JSON')\n .action(async (id, options) => {\n const { execShowCommand } = await import('./commands/exec.js');\n return execShowCommand(id, options);\n });\n\nexec\n .command('stats')\n .description('Show execution statistics')\n .option('-s, --squad <squad>', 'Filter by squad')\n .option('--json', 'Output as JSON')\n .action(async (options) => {\n const { execStatsCommand } = await import('./commands/exec.js');\n return execStatsCommand(options);\n });\n\n// Default action: show list\nexec.action(async (options) => {\n const { execListCommand } = await import('./commands/exec.js');\n return execListCommand(options);\n});\n\n// ─── Understand (situational awareness) ──────────────────────────────────────\n\n// Dashboard command\nprogram\n .command('dashboard [name]')\n .alias('dash')\n .description('Show dashboards. Use \"squads dash\" for overview, \"squads dash <name>\" for specific dashboard, \"squads dash --list\" to see all.')\n .option('-v, --verbose', 'Show additional details')\n .option('-c, --ceo', 'Executive summary with priorities and blockers')\n .option('-f, --full', 'Include GitHub PR/issue stats (slower, ~30s)')\n .option('-l, --list', 'List available declarative dashboards')\n .option('--view <view>', 'Render specific view from dashboard')\n .option('-j, --json', 'Output as JSON')\n .action(async (name, options) => {\n const { renderDashboard, showAvailableDashboards, findDashboard } = await import('./lib/dashboard/index.js');\n\n // List available dashboards\n if (options.list) {\n showAvailableDashboards();\n return;\n }\n\n // If a name is provided, try declarative dashboard first\n if (name) {\n const def = findDashboard(name);\n if (def) {\n const views = options.view ? [options.view] : undefined;\n await renderDashboard(name, { verbose: options.verbose, views });\n return;\n }\n // Fall through to default dashboard with a warning\n writeLine(` Dashboard \"${name}\" not found. Showing default dashboard.\\n`);\n }\n\n // Default: show the comprehensive dashboard\n const { dashboardCommand } = await import('./commands/dashboard.js');\n dashboardCommand({ ...options, fast: !options.full });\n });\n\n// Status command\nprogram\n .command('status [squad]')\n .description('Show squad status and state')\n .option('-v, --verbose', 'Show detailed status')\n .option('-j, --json', 'Output as JSON')\n .action(async (squad, options) => {\n const { statusCommand } = await import('./commands/status.js');\n return statusCommand(squad, options);\n });\n\n// Context command - business context for alignment\nprogram\n .command('context')\n .alias('feed')\n .description('Get business context for alignment: goals, memory, costs, activity')\n .option('-s, --squad <squad>', 'Focus on specific squad')\n .option('-t, --topic <topic>', 'Search memory for relevant context')\n .option('-a, --agent', 'Output JSON for agent consumption')\n .option('-j, --json', 'Output as JSON (alias for --agent)')\n .option('-v, --verbose', 'Show additional details')\n .action(async (options) => {\n const { contextFeedCommand } = await import('./commands/context-feed.js');\n return contextFeedCommand(options);\n });\n\n// Cost command - cost introspection for self-improvement\nprogram\n .command('cost')\n .description('Show cost summary (today, week, by squad)')\n .option('-s, --squad <squad>', 'Filter to specific squad')\n .option('--json', 'Output as JSON')\n .action(async (options) => {\n const { costCommand } = await import('./commands/cost.js');\n return costCommand(options);\n });\n\n// Budget check command - pre-flight budget validation\nprogram\n .command('budget')\n .description('Check budget status for a squad')\n .argument('<squad>', 'Squad to check')\n .option('--json', 'Output as JSON')\n .action(async (squad, options) => {\n const { budgetCheckCommand } = await import('./commands/cost.js');\n return budgetCheckCommand(squad, options);\n });\n\n// Health command - quick infrastructure check\nprogram\n .command('health')\n .description('Quick health check for all infrastructure services')\n .option('-v, --verbose', 'Show optional services')\n .action(async (options) => {\n const { healthCommand } = await import('./commands/health.js');\n return healthCommand(options);\n });\n\n// Doctor command - check local environment readiness\nprogram\n .command('doctor')\n .description('Check local tools, auth, and project readiness')\n .option('-v, --verbose', 'Show install hints and optional tools')\n .action(async (options) => {\n const { doctorCommand } = await import('./commands/doctor.js');\n return doctorCommand(options);\n });\n\n// History command - show recent agent executions\nprogram\n .command('history')\n .description('Show recent agent execution history')\n .option('-d, --days <days>', 'Days to look back', '7')\n .option('-s, --squad <squad>', 'Filter by squad')\n .option('-v, --verbose', 'Show cost and token details')\n .option('-j, --json', 'Output as JSON')\n .action(async (options) => {\n const { historyCommand } = await import('./commands/history.js');\n return historyCommand(options);\n });\n\n// Results command - KPI goals vs actuals\nprogram\n .command('results [squad]')\n .description('Show squad results: git activity + KPI goals vs actuals')\n .option('-d, --days <days>', 'Days to look back', '7')\n .option('-v, --verbose', 'Show detailed KPIs per goal')\n .action(async (squad, options) => {\n const { resultsCommand } = await import('./commands/results.js');\n return resultsCommand({ ...options, squad });\n });\n\n// ─── Track (objectives + metrics) ────────────────────────────────────────────\n\n// Goal command group\nconst goal = program\n .command('goal')\n .description('Manage squad goals')\n .action(() => {\n goal.outputHelp();\n });\n\ngoal\n .command('set <squad> <description>')\n .description('Set a goal for a squad')\n .option('-m, --metric <metrics...>', 'Metrics to track')\n .action(async (squad, description, options) => {\n const { goalSetCommand } = await import('./commands/goal.js');\n return goalSetCommand(squad, description, options);\n });\n\ngoal\n .command('list [squad]')\n .description('List goals for squad(s)')\n .option('-a, --all', 'Show completed goals too')\n .option('-j, --json', 'Output as JSON')\n .action(async (squad, options) => {\n const { goalListCommand } = await import('./commands/goal.js');\n return goalListCommand(squad, options);\n });\n\ngoal\n .command('complete <squad> <index>')\n .description('Mark a goal as completed')\n .action(async (squad, index) => {\n const { goalCompleteCommand } = await import('./commands/goal.js');\n return goalCompleteCommand(squad, index);\n });\n\ngoal\n .command('progress <squad> <index> <progress>')\n .description('Update goal progress')\n .action(async (squad, index, progress) => {\n const { goalProgressCommand } = await import('./commands/goal.js');\n return goalProgressCommand(squad, index, progress);\n });\n\n// KPI command group - track squad metrics\nconst kpi = program\n .command('kpi')\n .description('Track and analyze squad KPIs (defined in SQUAD.md frontmatter)')\n .addHelpText('after', `\nExamples:\n $ squads kpi list List all defined KPIs\n $ squads kpi show engineering Show KPI status for a squad\n $ squads kpi record engineering leads_generated 15\n $ squads kpi trend engineering leads_generated\n $ squads kpi insights Show insights across all squads\n`)\n .action(() => { kpi.outputHelp(); });\n\nkpi\n .command('list')\n .description('List all KPIs across squads')\n .option('-j, --json', 'Output as JSON')\n .action(async (options) => {\n const { kpiListCommand } = await import('./commands/kpi.js');\n return kpiListCommand(options);\n });\n\nkpi\n .command('show <squad>')\n .description('Show KPI status for a squad')\n .option('-j, --json', 'Output as JSON')\n .action(async (squad, options) => {\n const { kpiShowCommand } = await import('./commands/kpi.js');\n return kpiShowCommand(squad, options);\n });\n\nkpi\n .command('record <squad> <kpi> <value>')\n .description('Record a KPI value')\n .option('-n, --note <note>', 'Add a note to the record')\n .option('-j, --json', 'Output as JSON')\n .action(async (squad, kpi, value, options) => {\n const { kpiRecordCommand } = await import('./commands/kpi.js');\n return kpiRecordCommand(squad, kpi, value, options);\n });\n\nkpi\n .command('trend <squad> <kpi>')\n .description('Show KPI trend over time')\n .option('-p, --periods <n>', 'Number of periods to show', '7')\n .option('-j, --json', 'Output as JSON')\n .action(async (squad, kpi, options) => {\n const { kpiTrendCommand } = await import('./commands/kpi.js');\n return kpiTrendCommand(squad, kpi, options);\n });\n\nkpi\n .command('insights [squad]')\n .description('Generate insights from KPI data')\n .option('-j, --json', 'Output as JSON')\n .action(async (squad, options) => {\n const { kpiInsightsCommand } = await import('./commands/kpi.js');\n return kpiInsightsCommand(squad, options);\n });\n\n// Progress command - track agent task progress\nconst progress = program\n .command('progress')\n .description('Track active and completed agent tasks')\n .option('-v, --verbose', 'Show more activity')\n .action(async (options) => {\n const { progressCommand } = await import('./commands/progress.js');\n return progressCommand(options);\n });\n\nprogress\n .command('start <squad> <description>')\n .description('Register a new active task')\n .action(async (squad, description) => {\n const { progressStartCommand } = await import('./commands/progress.js');\n return progressStartCommand(squad, description);\n });\n\nprogress\n .command('complete <taskId>')\n .description('Mark a task as completed')\n .option('-f, --failed', 'Mark as failed instead')\n .action(async (taskId, options) => {\n const { progressCompleteCommand } = await import('./commands/progress.js');\n return progressCompleteCommand(taskId, options);\n });\n\n// Feedback command group\nconst feedback = program\n .command('feedback')\n .description('Record and view execution feedback')\n .action(() => { feedback.outputHelp(); });\n\nfeedback\n .command('add <squad> <rating> <feedback>')\n .description('Add feedback for last execution (rating 1-5)')\n .option('-l, --learning <learnings...>', 'Learnings to extract')\n .action(async (squad, rating, feedbackText, options) => {\n const { feedbackAddCommand } = await import('./commands/feedback.js');\n return feedbackAddCommand(squad, rating, feedbackText, options);\n });\n\nfeedback\n .command('show <squad>')\n .description('Show feedback history')\n .option('-n, --limit <n>', 'Number of entries to show', '5')\n .action(async (squad, options) => {\n const { feedbackShowCommand } = await import('./commands/feedback.js');\n return feedbackShowCommand(squad, options);\n });\n\nfeedback\n .command('stats')\n .description('Show feedback summary across all squads')\n .action(async () => {\n const { feedbackStatsCommand } = await import('./commands/feedback.js');\n return feedbackStatsCommand();\n });\n\n// Autonomy command - show autonomous operation readiness\nprogram\n .command('autonomy')\n .description('Show autonomy score and confidence metrics')\n .option('-s, --squad <squad>', 'Filter by squad')\n .option('-p, --period <period>', 'Time period: today, week, month', 'today')\n .option('-j, --json', 'Output as JSON')\n .action(async (options) => {\n const { autonomyCommand } = await import('./commands/autonomy.js');\n return autonomyCommand({ squad: options.squad, period: options.period, json: options.json });\n });\n\n// Autopilot — deprecated, now \"squads run\" (no arguments)\nprogram\n .command('autopilot')\n .alias('daemon')\n .description('[deprecated] Use \"squads run\" instead — autopilot mode when no target given')\n .option('-i, --interval <minutes>', 'Minutes between cycles', '30')\n .option('-p, --parallel <count>', 'Max parallel agent runs', '2')\n .option('-b, --budget <dollars>', 'Max daily spend in dollars (0 = unlimited/subscription)', '0')\n .option('--once', 'Run one cycle and exit')\n .option('--dry-run', 'Show what would run without dispatching')\n .option('-v, --verbose', 'Show detailed scoring')\n .action(async (options) => {\n const colors = termColors;\n writeLine(` ${colors.yellow}Note: \"squads autopilot\" is now \"squads run\" (no arguments)${termReset}`);\n const { runCommand } = await import('./commands/run.js');\n return runCommand(null, { interval: parseInt(options.interval || '30', 10), ...options });\n });\n\n// Stats command - agent outcome scorecards\nprogram\n .command('stats [squad]')\n .description('Show agent outcome scorecards: merge rate, waste, cost per outcome')\n .option('-p, --period <period>', 'Time period: 7d or 30d', '7d')\n .option('-j, --json', 'Output as JSON')\n .action(async (squad, options) => {\n const { statsCommand } = await import('./commands/stats.js');\n return statsCommand({ squad, period: options.period, json: options.json });\n });\n\n// ─── Learn (memory + knowledge) ─────────────────────────────────────────────\n\n// Memory command group\nconst memory = program\n .command('memory')\n .description('Query and manage squad memory')\n .addHelpText('after', `\nExamples:\n $ squads memory read engineering View engineering squad's memory\n $ squads memory write research \"Found: MCP adoption at 15%\"\n $ squads memory search \"pricing\" Search all memory\n $ squads memory list List all memory entries\n $ squads memory sync --push Sync and push to git\n`)\n .action(() => {\n memory.outputHelp();\n });\n\nmemory\n .command('query <query>')\n .description('Search across all squad memory')\n .option('-s, --squad <squad>', 'Limit search to specific squad')\n .option('-a, --agent <agent>', 'Limit search to specific agent')\n .action(async (query, options) => {\n const { memoryQueryCommand } = await import('./commands/memory.js');\n return memoryQueryCommand(query, options);\n });\n\n// read (new name) + show (alias)\nmemory\n .command('read <squad>')\n .alias('show')\n .description('Show memory for a squad')\n .action(async (squad, options) => {\n const { memoryShowCommand } = await import('./commands/memory.js');\n return memoryShowCommand(squad, options);\n });\n\n// write (new name) + update (alias)\nmemory\n .command('write <squad> <content>')\n .alias('update')\n .description('Add to squad memory')\n .option('-a, --agent <agent>', 'Specific agent (default: squad-lead)')\n .option('-t, --type <type>', 'Memory type: state, learnings, feedback', 'learnings')\n .action(async (squad, content, options) => {\n const { memoryUpdateCommand } = await import('./commands/memory.js');\n return memoryUpdateCommand(squad, content, options);\n });\n\nmemory\n .command('list')\n .description('List all memory entries')\n .action(async () => {\n const { memoryListCommand } = await import('./commands/memory.js');\n return memoryListCommand();\n });\n\nmemory\n .command('sync')\n .description('Sync memory from git: pull remote changes, process commits, optionally push to Postgres')\n .option('-v, --verbose', 'Show detailed commit info')\n .option('-p, --push', 'Push local memory changes to remote after sync')\n .option('--no-pull', 'Skip pulling from remote')\n .option('--postgres', 'Sync cycle data (goals, feedback, KPIs, learnings) to Postgres')\n .option('--dimensions', 'Sync squad/agent definitions to Postgres dim tables')\n .option('--learnings', 'Sync learnings.md files to Postgres')\n .option('--auto-learn', 'Auto-generate learnings from session commits')\n .action(async (options) => {\n const { syncCommand } = await import('./commands/sync.js');\n return syncCommand({ verbose: options.verbose, push: options.push, pull: options.pull, postgres: options.postgres, dimensions: options.dimensions, learnings: options.learnings, autoLearn: options.autoLearn });\n });\n\n// search (new name) — also keep old 'search' subcommand\nmemory\n .command('search <query>')\n .description('Search stored conversations (requires authentication: squads login)')\n .option('-l, --limit <limit>', 'Number of results', '10')\n .option('-r, --role <role>', 'Filter by role: user, assistant, thinking')\n .option('-i, --importance <importance>', 'Filter by importance: low, normal, high')\n .action(async (query, opts) => {\n const { memorySearchCommand } = await import('./commands/memory.js');\n return memorySearchCommand(query, {\n limit: parseInt(opts.limit, 10),\n role: opts.role,\n importance: opts.importance\n });\n });\n\nmemory\n .command('extract')\n .description('Extract memories from recent conversations into Engram')\n .option('-s, --session <session>', 'Extract specific session only')\n .option('-h, --hours <hours>', 'Look back period in hours', '24')\n .option('-d, --dry-run', 'Preview without sending to Engram')\n .action(async (opts) => {\n const { memoryExtractCommand } = await import('./commands/memory.js');\n return memoryExtractCommand({\n session: opts.session,\n hours: parseInt(opts.hours, 10),\n dryRun: opts.dryRun\n });\n });\n\n// Learn command - capture learnings for autonomous improvement\nprogram\n .command('learn <insight>')\n .description('Capture a learning for future sessions')\n .option('-s, --squad <squad>', 'Squad to associate learning with')\n .option('-c, --category <category>', 'Category: success, failure, pattern, tip')\n .option('-t, --tags <tags>', 'Comma-separated tags')\n .option('--context <context>', 'Additional context')\n .action(async (insight, options) => {\n const { learnCommand } = await import('./commands/learn.js');\n return learnCommand(insight, options);\n });\n\nconst learn = program\n .command('learnings')\n .description('View and search learnings');\n\nlearn\n .command('show <squad>')\n .description('Show learnings for a squad')\n .option('-n, --limit <n>', 'Number to show', '10')\n .option('-c, --category <category>', 'Filter by category')\n .option('--tag <tag>', 'Filter by tag')\n .action(async (squad, options) => {\n const { learnShowCommand } = await import('./commands/learn.js');\n return learnShowCommand(squad, options);\n });\n\nlearn\n .command('search <query>')\n .description('Search learnings across all squads')\n .option('-n, --limit <n>', 'Max results', '10')\n .action(async (query, options) => {\n const { learnSearchCommand } = await import('./commands/learn.js');\n return learnSearchCommand(query, options);\n });\n\n// Sync command (also available as `memory sync`)\nprogram\n .command('sync')\n .description('Git memory synchronization (Postgres sync optional)')\n .option('-v, --verbose', 'Show detailed commit info')\n .option('-p, --push', 'Push local memory changes to remote after sync')\n .option('--no-pull', 'Skip pulling from remote')\n .option('--postgres', 'Sync cycle data to Postgres')\n .action(async (options) => {\n const { syncCommand } = await import('./commands/sync.js');\n return syncCommand({ verbose: options.verbose, push: options.push, pull: options.pull, postgres: options.postgres });\n });\n\n// ─── Schedule (automation) ───────────────────────────────────────────────────\n\n// Trigger command group - smart value-driven triggers\nregisterTriggerCommand(program);\n\n// Approval command group - human-in-the-loop for agents\nregisterApprovalCommand(program);\n\n// Autonomous command group - scheduled routines\nregisterAutonomousCommand(program);\n\n// ─── System ──────────────────────────────────────────────────────────────────\n\n// Sessions command group - list active sessions and history\nconst sessions = program\n .command('sessions')\n .description('Show active Claude Code sessions across squads')\n .option('-v, --verbose', 'Show session details')\n .option('-j, --json', 'Output as JSON')\n .action(async (options) => {\n const { sessionsCommand } = await import('./commands/sessions.js');\n return sessionsCommand(options);\n });\n\nsessions\n .command('history')\n .description('Show session history and statistics')\n .option('-d, --days <days>', 'Days of history to show', '7')\n .option('-s, --squad <squad>', 'Filter by squad')\n .option('-j, --json', 'Output as JSON')\n .action(async (options) => {\n const { sessionsHistoryCommand } = await import('./commands/sessions.js');\n return sessionsHistoryCommand({\n days: parseInt(options.days, 10),\n squad: options.squad,\n json: options.json,\n });\n });\n\nsessions\n .command('summary')\n .description('Show pretty session summary (auto-detects current session or pass JSON)')\n .option('-d, --data <json>', 'JSON data for summary (overrides auto-detection)')\n .option('-f, --file <path>', 'Path to JSON file with summary data')\n .option('-j, --json', 'Output as JSON instead of pretty format')\n .action(async (options) => {\n const { buildCurrentSessionSummary, sessionsSummaryCommand } = await import('./commands/sessions.js');\n let data: SessionSummaryData;\n\n if (options.file) {\n // Read from file\n const { readFileSync } = await import('fs');\n data = JSON.parse(readFileSync(options.file, 'utf-8'));\n } else if (options.data) {\n // Parse from --data argument\n data = JSON.parse(options.data);\n } else if (!process.stdin.isTTY) {\n // Read from stdin only if piped\n const chunks: Buffer[] = [];\n for await (const chunk of process.stdin) {\n chunks.push(chunk);\n }\n const input = Buffer.concat(chunks).toString('utf-8').trim();\n if (input) {\n data = JSON.parse(input);\n } else {\n data = await buildCurrentSessionSummary();\n }\n } else {\n // Auto-detect current session\n data = await buildCurrentSessionSummary();\n }\n\n await sessionsSummaryCommand(data, { json: options.json });\n });\n\n// Session command group - lifecycle management\nconst session = program\n .command('session')\n .description('Manage current session lifecycle')\n .action(() => { session.outputHelp(); });\n\nsession\n .command('start')\n .description('Register a new session')\n .option('-s, --squad <squad>', 'Override squad detection')\n .option('-q, --quiet', 'Suppress output')\n .action(async (options) => {\n const { sessionStartCommand } = await import('./commands/session.js');\n return sessionStartCommand({ squad: options.squad, quiet: options.quiet });\n });\n\nsession\n .command('stop')\n .description('End current session')\n .option('-q, --quiet', 'Suppress output')\n .action(async (options) => {\n const { sessionStopCommand } = await import('./commands/session.js');\n return sessionStopCommand({ quiet: options.quiet });\n });\n\nsession\n .command('heartbeat')\n .description('Update session heartbeat')\n .option('-q, --quiet', 'Suppress output')\n .action(async (options) => {\n const { sessionHeartbeatCommand } = await import('./commands/session.js');\n return sessionHeartbeatCommand({ quiet: options.quiet });\n });\n\n// Detect squad command - useful for hooks\nprogram\n .command('detect-squad')\n .description('Detect current squad based on cwd (for use in hooks)')\n .action(async () => {\n const { detectSquadCommand } = await import('./commands/session.js');\n return detectSquadCommand();\n });\n\n// Auth commands\nprogram\n .command('login')\n .description('Log in to Squads (Pro & Enterprise)')\n .action(async () => {\n const { loginCommand } = await import('./commands/login.js');\n return loginCommand();\n });\n\nprogram\n .command('logout')\n .description('Log out from Squads')\n .action(async () => {\n const { logoutCommand } = await import('./commands/login.js');\n return logoutCommand();\n });\n\nprogram\n .command('whoami')\n .description('Show current logged in user')\n .action(async () => {\n const { whoamiCommand } = await import('./commands/login.js');\n return whoamiCommand();\n });\n\n// Eval command - agent readiness scoring\nregisterEvalCommand(program);\n\n// Deploy command group - push agents to platform\nregisterDeployCommand(program);\n\n// Cognition command group - business cognition engine\nregisterCognitionCommand(program);\n\n// Providers command - show LLM CLI availability for multi-LLM support\nprogram\n .command('providers')\n .description('Show available LLM CLI providers (claude, gemini, codex, etc.)')\n .option('-j, --json', 'Output as JSON')\n .action(async (options) => {\n const { providersCommand } = await import('./commands/providers.js');\n return providersCommand(options);\n });\n\n// Update command\nprogram\n .command('update')\n .description('Check for and install updates')\n .option('-y, --yes', 'Auto-confirm update without prompting')\n .option('-c, --check', 'Check for updates without installing')\n .action(async (options) => {\n const { updateCommand } = await import('./commands/update.js');\n return updateCommand(options);\n });\n\n// Version command (following npm/docker pattern)\nprogram\n .command('version')\n .description('Show version information')\n .action(() => {\n writeLine(`squads-cli ${version}`);\n });\n\n// ─── Removed commands (hidden from --help, show helpful message if invoked) ──\n\nprogram.command('stack', { hidden: true }).description('[removed]').action(removedCommand('stack', 'Infrastructure is managed via the cloud. Use: squads login'));\nprogram.command('cron', { hidden: true }).description('[removed]').action(removedCommand('cron', 'Use platform scheduler: squads trigger list'));\nprogram.command('tonight', { hidden: true }).description('[removed]').action(removedCommand('tonight', 'Use platform scheduler for overnight runs: squads autonomous start'));\nprogram.command('live', { hidden: true }).description('[removed]').action(removedCommand('live', 'Use: squads dash'));\nprogram.command('top', { hidden: true }).description('[removed]').action(removedCommand('top', 'Use: squads sessions'));\nprogram.command('watch', { hidden: true }).description('[removed]').action(removedCommand('watch', 'Use: watch -n 2 squads status'));\nprogram.command('setup', { hidden: true }).description('[removed]').action(removedCommand('setup', 'Use: squads init'));\nprogram.command('slack', { hidden: true }).description('[removed]').action(removedCommand('slack', 'Slack integration runs as a service, not a CLI command'));\nprogram.command('skill', { hidden: true }).description('[removed]').action(removedCommand('skill', 'Skills are defined in agent .md files. See: .agents/skills/'));\nprogram.command('baseline', { hidden: true }).description('[removed]').action(removedCommand('baseline', 'Use: squads dash --ceo'));\nprogram.command('permissions', { hidden: true }).description('[removed]').action(removedCommand('permissions', 'Permissions are defined in SQUAD.md approvals config'));\nprogram.command('issues', { hidden: true }).description('[removed]').action(removedCommand('issues', 'Use: gh issue list'));\nprogram.command('solve-issues', { hidden: true }).description('[removed]').action(removedCommand('solve-issues', 'Issue solving is agent behavior. Use: squads run engineering/issues-solver'));\nprogram.command('open-issues', { hidden: true }).description('[removed]').action(removedCommand('open-issues', 'Evaluators are agents. Use: squads run <squad>/<evaluator>'));\nprogram.command('workers', { hidden: true }).description('[removed]').action(removedCommand('workers', 'Use: squads sessions'));\n\n// ─── Error handling ──────────────────────────────────────────────────────────\n\n// Global error handler for uncaught exceptions\n// Provides helpful recovery steps instead of raw stack traces (#31)\nfunction handleError(error: unknown): void {\n const err = error instanceof Error ? error : new Error(String(error));\n\n // Check for common error types and provide helpful messages\n if (err.message.includes('ECONNREFUSED') || err.message.includes('fetch failed')) {\n console.error(chalk.red('\\nConnection error:'), err.message);\n console.error(chalk.dim('\\nCore commands (init, run, status, eval) work without cloud services.'));\n console.error(chalk.dim('If you need scheduling or telemetry:'));\n console.error(chalk.dim(' 1. Authenticate: squads login'));\n console.error(chalk.dim(' 2. Check services: squads health'));\n console.error(chalk.dim(' 3. Check your network connection'));\n } else if (err.message.includes('ENOENT')) {\n console.error(chalk.red('\\nFile not found:'), err.message);\n console.error(chalk.dim('\\nPossible fixes:'));\n console.error(chalk.dim(' 1. Make sure you are in the correct directory'));\n console.error(chalk.dim(' 2. Initialize the project: squads init'));\n } else if (err.message.includes('permission denied') || err.message.includes('EACCES')) {\n console.error(chalk.red('\\nPermission denied:'), err.message);\n console.error(chalk.dim('\\nPossible fixes:'));\n console.error(chalk.dim(' 1. Check file permissions'));\n console.error(chalk.dim(' 2. Avoid running with sudo if not needed'));\n } else if (err.message.includes('rate limit') || err.message.includes('429')) {\n console.error(chalk.red('\\nRate limit exceeded'));\n console.error(chalk.dim('\\nPossible fixes:'));\n console.error(chalk.dim(' 1. Wait a few minutes and try again'));\n console.error(chalk.dim(' 2. Check your API usage: squads dash'));\n } else {\n // Generic error with stack trace only in verbose mode\n console.error(chalk.red('\\nError:'), err.message);\n if (process.env.DEBUG || process.env.VERBOSE) {\n console.error(chalk.dim('\\nStack trace:'));\n console.error(chalk.dim(err.stack));\n } else {\n console.error(chalk.dim('\\nRun with DEBUG=1 for more details'));\n }\n }\n\n console.error(chalk.dim('\\nIf this persists, please report at:'));\n console.error(chalk.cyan(' https://github.com/agents-squads/squads-cli/issues\\n'));\n\n process.exit(1);\n}\n\n// Register global error handlers\nprocess.on('uncaughtException', handleError);\nprocess.on('unhandledRejection', handleError);\n\n// Parse arguments (use parseAsync to properly await async actions)\ntry {\n await program.parseAsync();\n} catch (error) {\n handleError(error);\n}\n","/**\n * Stack configuration loading from ~/.squadsrc\n * Extracted from stack.ts for use at CLI startup\n */\n\nimport { existsSync, readFileSync } from 'fs';\nimport { join } from 'path';\nimport { homedir } from 'os';\n\ninterface StackConfig {\n SQUADS_DATABASE_URL?: string;\n SQUADS_BRIDGE_URL: string;\n LANGFUSE_HOST: string;\n LANGFUSE_PUBLIC_KEY: string;\n LANGFUSE_SECRET_KEY: string;\n REDIS_URL?: string;\n}\n\nconst DEFAULT_CONFIG: StackConfig = {\n SQUADS_BRIDGE_URL: '',\n LANGFUSE_HOST: '',\n LANGFUSE_PUBLIC_KEY: '',\n LANGFUSE_SECRET_KEY: '',\n};\n\nconst CONFIG_PATH = join(homedir(), '.squadsrc');\n\n/**\n * Load stack configuration from ~/.squadsrc\n */\nexport function loadStackConfig(): Partial<StackConfig> | null {\n if (!existsSync(CONFIG_PATH)) {\n return null;\n }\n\n try {\n const content = readFileSync(CONFIG_PATH, 'utf-8');\n const config: Partial<StackConfig> = {};\n\n for (const line of content.split('\\n')) {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith('#')) continue;\n\n const match = trimmed.match(/^export\\s+(\\w+)=[\"']?([^\"'\\n]*)[\"']?$/);\n if (match) {\n const [, key, value] = match;\n if (key in DEFAULT_CONFIG) {\n (config as Record<string, string>)[key] = value;\n }\n }\n }\n\n return config;\n } catch {\n return null;\n }\n}\n\n/**\n * Apply stack config to current process environment\n */\nexport function applyStackConfig(): void {\n const config = loadStackConfig();\n if (!config) return;\n\n for (const [key, value] of Object.entries(config)) {\n if (value && !process.env[key]) {\n process.env[key] = value;\n }\n }\n}\n","/**\n * squads orchestrate <squad> - Run squad with lead orchestration\n *\n * Starts the squad lead as a persistent session that:\n * - Spawns worker agents\n * - Reviews their outputs\n * - Coordinates multi-agent work\n *\n * Usage:\n * squads orchestrate intelligence\n * squads orchestrate cli --foreground\n */\n\nimport { Command } from 'commander';\nimport { spawn } from 'child_process';\nimport { existsSync, readFileSync, readdirSync } from 'fs';\nimport { join } from 'path';\nimport {\n initEventsDir,\n buildLeadPrompt,\n watchForEvents,\n} from '../lib/orchestration/lead-orchestrator.js';\nimport { resolveMcpConfigPath } from '../lib/mcp-config.js';\nimport { findSquadsDir, loadSquad } from '../lib/squad-parser.js';\nimport { findMemoryDir } from '../lib/memory.js';\nimport {\n colors as termColors,\n RESET,\n writeLine,\n} from '../lib/terminal.js';\n\n// Local alias to match existing usage (color names + reset)\nconst colors = {\n cyan: termColors.cyan,\n green: termColors.green,\n yellow: termColors.yellow,\n red: termColors.red,\n dim: termColors.dim,\n reset: RESET,\n};\n\n/**\n * Gather context for the lead agent (similar to run.ts gatherSquadContext)\n */\nfunction gatherLeadContext(squadName: string, leadAgent: string): string {\n const squadsDir = findSquadsDir();\n if (!squadsDir) return '';\n\n const memoryDir = findMemoryDir();\n const sections: string[] = [];\n\n // 1. SQUAD.md - full content for lead (they need everything)\n const squadFile = join(squadsDir, squadName, 'SQUAD.md');\n if (existsSync(squadFile)) {\n try {\n const squadContent = readFileSync(squadFile, 'utf-8');\n // Extract key sections\n const missionMatch = squadContent.match(/## Mission[\\s\\S]*?(?=\\n## |$)/i);\n const goalsMatch = squadContent.match(/## (?:Goals|Objectives)[\\s\\S]*?(?=\\n## |$)/i);\n\n let context = '';\n if (missionMatch) context += missionMatch[0] + '\\n';\n if (goalsMatch) context += goalsMatch[0] + '\\n';\n\n if (context) {\n sections.push(`## Squad Mission & Goals\\n${context.trim()}`);\n }\n } catch {\n // Ignore\n }\n }\n\n // 2. Lead's previous state\n if (memoryDir) {\n const stateFile = join(memoryDir, squadName, leadAgent, 'state.md');\n if (existsSync(stateFile)) {\n try {\n const stateContent = readFileSync(stateFile, 'utf-8');\n if (stateContent.trim()) {\n sections.push(`## Your Previous State\\n${stateContent.trim()}`);\n }\n } catch {\n // Ignore\n }\n }\n }\n\n if (sections.length === 0) return '';\n\n return `\\n# EXISTING CONTEXT\\nBuild on this - do NOT start from scratch:\\n\\n${sections.join('\\n\\n')}\\n`;\n}\n\ninterface OrchestrateOptions {\n foreground?: boolean;\n verbose?: boolean;\n timeout?: number;\n}\n\n/**\n * Find the lead agent for a squad\n */\nfunction findLeadAgent(squadDir: string): string | null {\n const files = readdirSync(squadDir).filter(f => f.endsWith('.md') && !f.startsWith('_'));\n\n // Look for *-lead.md or squad-lead.md\n const leadFile = files.find(f =>\n f.endsWith('-lead.md') ||\n f === 'lead.md' ||\n f.includes('lead')\n );\n\n return leadFile ? leadFile.replace('.md', '') : null;\n}\n\n/**\n * Get all non-lead agents in a squad\n */\nfunction getWorkerAgents(squadDir: string, leadAgent: string): string[] {\n const files = readdirSync(squadDir).filter(f =>\n f.endsWith('.md') &&\n !f.startsWith('_') &&\n !f.startsWith('README') &&\n f !== `${leadAgent}.md`\n );\n\n return files.map(f => f.replace('.md', ''));\n}\n\n/**\n * Main orchestrate command\n */\nasync function orchestrateSquad(\n squadName: string,\n options: OrchestrateOptions\n): Promise<void> {\n const projectRoot = process.cwd();\n const squadsDir = join(projectRoot, '.agents', 'squads');\n const squadDir = join(squadsDir, squadName);\n\n // Validate squad exists\n if (!existsSync(squadDir)) {\n writeLine(`${colors.red}Squad not found: ${squadName}${colors.reset}`);\n writeLine(`${colors.dim}Available: ${readdirSync(squadsDir).filter(f => !f.startsWith('_')).join(', ')}${colors.reset}`);\n process.exit(1);\n }\n\n // Find lead agent\n const leadAgent = findLeadAgent(squadDir);\n if (!leadAgent) {\n writeLine(`${colors.red}No lead agent found in squad ${squadName}${colors.reset}`);\n writeLine(`${colors.dim}Expected: *-lead.md or lead.md${colors.reset}`);\n process.exit(1);\n }\n\n // Get worker agents\n const workers = getWorkerAgents(squadDir, leadAgent);\n\n writeLine(`${colors.cyan}Orchestrating squad: ${squadName}${colors.reset}`);\n writeLine(` ${colors.green}Lead:${colors.reset} ${leadAgent}`);\n writeLine(` ${colors.green}Workers:${colors.reset} ${workers.length} agents`);\n if (options.verbose) {\n workers.forEach(w => writeLine(` - ${w}`));\n }\n\n // Initialize events directory\n const eventsDir = initEventsDir(projectRoot);\n writeLine(` ${colors.dim}Events: ${eventsDir}${colors.reset}`);\n\n // Get MCP config for the squad\n const squad = loadSquad(squadName);\n const mcpServers = squad?.context?.mcp || [];\n const mcpConfigPath = mcpServers.length > 0\n ? resolveMcpConfigPath(squadName, mcpServers)\n : join(process.env.HOME || '', '.claude.json');\n\n // Gather context for the lead\n const leadContext = gatherLeadContext(squadName, leadAgent);\n if (options.verbose && leadContext) {\n writeLine(` ${colors.dim}Context: ~${Math.ceil(leadContext.length / 4)} tokens${colors.reset}`);\n }\n\n // Build lead prompt with context\n const basePrompt = buildLeadPrompt({\n squad: squadName,\n lead: leadAgent,\n projectRoot,\n agents: workers,\n });\n\n // Inject context and add instructions\n const leadPrompt = `${basePrompt}\n${leadContext}\nTOOL PREFERENCE: Always prefer CLI tools over MCP servers:\n- Use \\`squads run\\` to spawn workers (not MCP)\n- Use \\`gh\\` for GitHub operations\n- Use \\`git\\` for version control\n- Only use MCP when CLI cannot do it\n\nIMPORTANT: When updating state.md, use ISO timestamps (e.g., 2026-01-23T02:45:00Z) not just dates.\nThis allows tracking multiple executions per day.`;\n\n // Session name\n const sessionName = `squads-lead-${squadName}-${Date.now()}`;\n\n if (options.foreground) {\n // Run lead in foreground (interactive)\n writeLine(`\\n${colors.cyan}Starting lead in foreground...${colors.reset}`);\n writeLine(`${colors.dim}Press Ctrl+C to stop${colors.reset}\\n`);\n\n const { CLAUDECODE: _cc, ...cleanOrcEnv } = process.env;\n const claude = spawn('claude', [\n '--permission-mode', 'bypassPermissions',\n '--mcp-config', mcpConfigPath,\n '--', leadPrompt,\n ], {\n stdio: 'inherit',\n env: {\n ...cleanOrcEnv,\n SQUADS_SQUAD: squadName,\n SQUADS_AGENT: leadAgent,\n SQUADS_ROLE: 'lead',\n SQUADS_EVENTS_DIR: eventsDir,\n },\n });\n\n claude.on('exit', (code) => {\n writeLine(`\\n${colors.cyan}Lead session ended (exit code: ${code})${colors.reset}`);\n });\n } else {\n // Run lead in tmux (background)\n const escapedPrompt = leadPrompt.replace(/'/g, \"'\\\\''\");\n\n const claudeCmd = `cd '${projectRoot}' && unset CLAUDECODE && claude --print --permission-mode bypassPermissions --mcp-config '${mcpConfigPath}' -- '${escapedPrompt}'; tmux kill-session -t ${sessionName} 2>/dev/null`;\n\n const tmux = spawn('tmux', [\n 'new-session',\n '-d',\n '-s', sessionName,\n '-x', '200',\n '-y', '50',\n '/bin/sh', '-c', claudeCmd,\n ], {\n stdio: 'ignore',\n detached: true,\n env: {\n ...process.env,\n SQUADS_SQUAD: squadName,\n SQUADS_AGENT: leadAgent,\n SQUADS_ROLE: 'lead',\n SQUADS_EVENTS_DIR: eventsDir,\n },\n });\n\n tmux.unref();\n\n writeLine(`\\n${colors.green}Lead started in background${colors.reset}`);\n writeLine(` ${colors.dim}Session: ${sessionName}${colors.reset}`);\n writeLine(` ${colors.dim}Attach: tmux attach -t ${sessionName}${colors.reset}`);\n\n // Watch for events if verbose\n if (options.verbose) {\n writeLine(`\\n${colors.cyan}Watching for worker events...${colors.reset}`);\n writeLine(`${colors.dim}Press Ctrl+C to stop watching (lead continues)${colors.reset}\\n`);\n\n const stopWatching = watchForEvents(eventsDir, (event) => {\n const icon = event.type === 'completed' ? '✓' : '✗';\n const color = event.type === 'completed' ? colors.green : colors.red;\n writeLine(`${color}${icon} ${event.agent}${colors.reset} ${colors.dim}(${event.type})${colors.reset}`);\n });\n\n process.on('SIGINT', () => {\n stopWatching();\n writeLine(`\\n${colors.dim}Stopped watching. Lead continues in tmux.${colors.reset}`);\n process.exit(0);\n });\n\n // Keep process alive\n await new Promise(() => {});\n }\n }\n}\n\n/**\n * Register the orchestrate command\n */\nexport function registerOrchestrateCommand(program: Command): void {\n program\n .command('orchestrate <squad>')\n .description('Run squad with lead agent orchestration')\n .option('-f, --foreground', 'Run lead in foreground (interactive)')\n .option('-v, --verbose', 'Show detailed output and watch events')\n .option('-t, --timeout <minutes>', 'Maximum runtime in minutes', '60')\n .action(async (squad: string, options: OrchestrateOptions) => {\n await orchestrateSquad(squad, options);\n });\n}\n\nexport default registerOrchestrateCommand;\n","/**\n * Lead Orchestrator - Persistent squad lead that coordinates workers\n *\n * Pattern:\n * 1. Lead agent runs as persistent session\n * 2. Lead spawns worker agents for specific tasks\n * 3. Workers complete and signal via events\n * 4. Lead reviews outputs and decides next steps\n */\n\nimport { existsSync, mkdirSync, writeFileSync, readFileSync, readdirSync, unlinkSync, watch } from 'fs';\nimport { join } from 'path';\n\nexport interface WorkerEvent {\n type: 'started' | 'completed' | 'failed' | 'output';\n squad: string;\n agent: string;\n executionId: string;\n timestamp: string;\n exitCode?: number;\n outputPath?: string;\n summary?: string;\n error?: string;\n}\n\nexport interface OrchestratorConfig {\n projectRoot: string;\n squad: string;\n lead: string;\n eventsDir: string;\n onWorkerComplete?: (event: WorkerEvent) => void;\n}\n\n/**\n * Events directory structure:\n * .agents/events/\n * pending/ - New events waiting for lead to process\n * processed/ - Events that lead has reviewed\n */\nexport function initEventsDir(projectRoot: string): string {\n const eventsDir = join(projectRoot, '.agents', 'events');\n const pendingDir = join(eventsDir, 'pending');\n const processedDir = join(eventsDir, 'processed');\n\n [eventsDir, pendingDir, processedDir].forEach(dir => {\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n });\n\n return eventsDir;\n}\n\n/**\n * Worker signals completion by writing event file\n */\nexport function signalWorkerComplete(config: {\n eventsDir: string;\n squad: string;\n agent: string;\n executionId: string;\n exitCode: number;\n outputPath?: string;\n summary?: string;\n}): void {\n const event: WorkerEvent = {\n type: config.exitCode === 0 ? 'completed' : 'failed',\n squad: config.squad,\n agent: config.agent,\n executionId: config.executionId,\n timestamp: new Date().toISOString(),\n exitCode: config.exitCode,\n outputPath: config.outputPath,\n summary: config.summary,\n };\n\n const filename = `${config.executionId}-${config.agent}.json`;\n const filepath = join(config.eventsDir, 'pending', filename);\n writeFileSync(filepath, JSON.stringify(event, null, 2));\n}\n\n/**\n * Read pending events for lead to review\n */\nexport function getPendingEvents(eventsDir: string): WorkerEvent[] {\n const pendingDir = join(eventsDir, 'pending');\n if (!existsSync(pendingDir)) return [];\n\n const files = readdirSync(pendingDir).filter(f => f.endsWith('.json'));\n return files.map(f => {\n const content = readFileSync(join(pendingDir, f), 'utf-8');\n return JSON.parse(content) as WorkerEvent;\n });\n}\n\n/**\n * Mark event as processed (move to processed dir)\n */\nexport function markEventProcessed(eventsDir: string, event: WorkerEvent): void {\n const filename = `${event.executionId}-${event.agent}.json`;\n const pendingPath = join(eventsDir, 'pending', filename);\n const processedPath = join(eventsDir, 'processed', filename);\n\n if (existsSync(pendingPath)) {\n const content = readFileSync(pendingPath, 'utf-8');\n writeFileSync(processedPath, content);\n unlinkSync(pendingPath);\n }\n}\n\n/**\n * Generate shell command for worker that signals completion\n */\nexport function buildWorkerCommand(config: {\n projectRoot: string;\n squad: string;\n agent: string;\n executionId: string;\n prompt: string;\n mcpConfigPath: string;\n sessionName: string;\n}): string {\n const eventsDir = join(config.projectRoot, '.agents', 'events');\n const escapedPrompt = config.prompt.replace(/'/g, \"'\\\\''\");\n\n // Worker command that:\n // 1. Runs claude with acceptEdits (pre-configured permissions)\n // 2. Captures exit code\n // 3. Signals completion via event file\n // 4. Kills tmux session\n return `\ncd '${config.projectRoot}' && \\\\\nunset CLAUDECODE && claude --print --permission-mode acceptEdits --mcp-config '${config.mcpConfigPath}' -- '${escapedPrompt}'; \\\\\nEXIT_CODE=$?; \\\\\necho '{\"type\":\"'$([ $EXIT_CODE -eq 0 ] && echo completed || echo failed)'\",\"squad\":\"${config.squad}\",\"agent\":\"${config.agent}\",\"executionId\":\"${config.executionId}\",\"timestamp\":\"'$(date -u +%Y-%m-%dT%H:%M:%SZ)'\",\"exitCode\":'$EXIT_CODE'}' > '${eventsDir}/pending/${config.executionId}-${config.agent}.json'; \\\\\ntmux kill-session -t ${config.sessionName} 2>/dev/null\n`.trim().replace(/\\n/g, ' ');\n}\n\n/**\n * Build the lead agent prompt that includes orchestration capabilities\n */\nexport function buildLeadPrompt(config: {\n squad: string;\n lead: string;\n projectRoot: string;\n agents: string[];\n}): string {\n // Keep prompt short - Claude will read detailed instructions from files\n return `You are ${config.lead}, orchestrating the ${config.squad} squad.\n\nRead .agents/squads/${config.squad}/SQUAD.md for goals.\nRead .agents/squads/${config.squad}/${config.lead}.md for your instructions.\n\nWorkers: ${config.agents.slice(0, 5).join(', ')}${config.agents.length > 5 ? ` (+${config.agents.length - 5} more)` : ''}\n\nTo spawn workers: squads run ${config.squad}/<agent> --execute --background\nCheck events: ls .agents/events/pending/\nReview output: cat .agents/memory/${config.squad}/<agent>/state.md\n\nWhen done: git add .agents/ && git commit -m \"feat(${config.squad}): orchestration complete\" && git push && /exit`.trim();\n}\n\n/**\n * Watch for worker completion events (for real-time notification)\n */\nexport function watchForEvents(\n eventsDir: string,\n callback: (event: WorkerEvent) => void\n): () => void {\n const pendingDir = join(eventsDir, 'pending');\n\n const watcher = watch(pendingDir, (eventType, filename) => {\n if (eventType === 'rename' && filename?.endsWith('.json')) {\n const filepath = join(pendingDir, filename);\n if (existsSync(filepath)) {\n try {\n const content = readFileSync(filepath, 'utf-8');\n const event = JSON.parse(content) as WorkerEvent;\n callback(event);\n } catch {\n // Ignore parse errors\n }\n }\n }\n });\n\n // Return cleanup function\n return () => watcher.close();\n}\n","/**\n * squads trigger - Manage smart triggers\n *\n * Commands:\n * squads trigger list [squad] List triggers\n * squads trigger sync Sync SQUAD.md triggers to scheduler\n * squads trigger fire <name> Manually fire a trigger\n * squads trigger enable <name> Enable a trigger\n * squads trigger disable <name> Disable a trigger\n * squads trigger status Show scheduler status\n */\n\nimport { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { writeLine } from \"../lib/terminal.js\";\nimport { getApiUrl } from \"../lib/env-config.js\";\n\nconst API_URL = getApiUrl();\n\ninterface Trigger {\n id: string;\n name: string;\n squad: string;\n agent: string | null;\n enabled: boolean;\n priority: number;\n cooldown: string;\n last_fired: string | null;\n fire_count: number;\n}\n\ninterface SchedulerStats {\n triggers: {\n total: number;\n enabled: number;\n fired_24h: number;\n };\n executions_24h: {\n total_24h: number;\n completed: number;\n failed: number;\n running: number;\n queued: number;\n };\n}\n\nasync function fetchScheduler<T>(\n path: string,\n options?: RequestInit\n): Promise<T> {\n const res = await fetch(`${API_URL}${path}`, {\n ...options,\n headers: {\n \"Content-Type\": \"application/json\",\n ...options?.headers,\n },\n });\n\n if (!res.ok) {\n const error = await res.text();\n throw new Error(`Scheduler error: ${res.status} ${error}`);\n }\n\n return res.json() as T;\n}\n\nasync function listTriggers(squad?: string): Promise<void> {\n let triggers: Trigger[];\n\n try {\n const params = squad ? `?squad=${squad}` : \"\";\n triggers = await fetchScheduler<Trigger[]>(`/triggers${params}`);\n } catch (error: unknown) {\n // Check for connection refused (scheduler offline)\n const isConnectionError = error instanceof Error &&\n (error.cause?.toString().includes('ECONNREFUSED') ||\n error.message.includes('fetch failed'));\n\n if (isConnectionError) {\n console.error(chalk.red(\"\\n Scheduler not running\\n\"));\n writeLine(chalk.gray(\" The trigger system requires the local stack to be running.\\n\"));\n writeLine(` ${chalk.cyan(\"$ squads stack start\")} Start the local stack`);\n writeLine(` ${chalk.cyan(\"$ squads stack status\")} Check stack status\\n`);\n return;\n }\n\n // Re-throw unexpected errors\n throw error;\n }\n\n if (triggers.length === 0) {\n writeLine(chalk.gray(\"No triggers found\"));\n return;\n }\n\n writeLine(chalk.bold(\"\\nSmart Triggers\\n\"));\n\n const grouped = triggers.reduce(\n (acc, t) => {\n (acc[t.squad] = acc[t.squad] || []).push(t);\n return acc;\n },\n {} as Record<string, Trigger[]>\n );\n\n for (const [squadName, squadTriggers] of Object.entries(grouped)) {\n writeLine(chalk.cyan(` ${squadName}`));\n\n for (const t of squadTriggers) {\n const status = t.enabled ? chalk.green(\"●\") : chalk.gray(\"○\");\n const agent = t.agent ? `/${t.agent}` : \"\";\n const fires = t.fire_count > 0 ? chalk.gray(` (${t.fire_count}x)`) : \"\";\n\n writeLine(\n ` ${status} ${t.name}${chalk.gray(agent)} P${t.priority}${fires}`\n );\n }\n writeLine();\n }\n}\n\nasync function syncTriggers(): Promise<void> {\n writeLine(chalk.gray(\"Syncing triggers from SQUAD.md files...\\n\"));\n\n try {\n const result = await fetchScheduler<{ synced: number; triggers: string[]; errors: Array<{ name: string; error: string }> }>(\n \"/triggers/sync\",\n { method: \"POST\" }\n );\n\n if (result.errors && result.errors.length > 0) {\n writeLine(chalk.yellow(`Synced with ${result.errors.length} error(s):`));\n for (const err of result.errors) {\n writeLine(chalk.red(` - ${err.name}: ${err.error}`));\n }\n }\n\n writeLine(chalk.green(`Synced ${result.synced} trigger(s)`));\n if (result.triggers && result.triggers.length > 0) {\n for (const name of result.triggers) {\n writeLine(chalk.gray(` - ${name}`));\n }\n }\n } catch (error: unknown) {\n const isConnectionError = error instanceof Error &&\n (error.cause?.toString().includes('ECONNREFUSED') ||\n error.message.includes('fetch failed'));\n\n if (isConnectionError) {\n console.error(chalk.red(\"\\n API not running\\n\"));\n writeLine(chalk.gray(\" The sync command requires the API to be running.\\n\"));\n writeLine(` ${chalk.cyan(\"$ squads stack start\")} Start the local stack`);\n writeLine(` ${chalk.cyan(\"$ squads health\")} Check service status\\n`);\n return;\n }\n\n const message = error instanceof Error ? error.message : String(error);\n console.error(chalk.red(\"Sync failed:\"), message);\n }\n}\n\nasync function fireTrigger(name: string): Promise<void> {\n // Find trigger by name\n const triggers = await fetchScheduler<Trigger[]>(`/triggers`);\n const trigger = triggers.find((t) => t.name === name);\n\n if (!trigger) {\n console.error(chalk.red(`Trigger '${name}' not found`));\n return;\n }\n\n writeLine(\n chalk.gray(`Firing ${trigger.squad}/${trigger.agent || \"*\"}...`)\n );\n\n interface Execution {\n id: string;\n status: string;\n }\n\n const execution = await fetchScheduler<Execution>(\n `/triggers/${trigger.id}/fire`,\n { method: \"POST\" }\n );\n\n writeLine(chalk.green(`✓ Queued execution ${execution.id.slice(0, 8)}`));\n}\n\nasync function toggleTrigger(name: string, enable: boolean): Promise<void> {\n const triggers = await fetchScheduler<Trigger[]>(`/triggers`);\n const trigger = triggers.find((t) => t.name === name);\n\n if (!trigger) {\n console.error(chalk.red(`Trigger '${name}' not found`));\n return;\n }\n\n await fetchScheduler(`/triggers/${trigger.id}`, {\n method: \"PATCH\",\n body: JSON.stringify({ enabled: enable }),\n });\n\n const status = enable ? chalk.green(\"enabled\") : chalk.gray(\"disabled\");\n writeLine(`${trigger.name} ${status}`);\n}\n\nasync function showStatus(): Promise<void> {\n try {\n const stats = await fetchScheduler<SchedulerStats>(\"/stats\");\n\n writeLine(chalk.bold(\"\\nScheduler Status\\n\"));\n\n writeLine(chalk.cyan(\" Triggers\"));\n writeLine(` Total: ${stats.triggers.total}`);\n writeLine(` Enabled: ${chalk.green(stats.triggers.enabled)}`);\n writeLine(` Fired 24h: ${stats.triggers.fired_24h}`);\n\n writeLine(chalk.cyan(\"\\n Executions (24h)\"));\n writeLine(` Completed: ${chalk.green(stats.executions_24h.completed)}`);\n writeLine(` Failed: ${chalk.red(stats.executions_24h.failed)}`);\n writeLine(` Running: ${chalk.yellow(stats.executions_24h.running)}`);\n writeLine(` Queued: ${stats.executions_24h.queued}`);\n writeLine();\n } catch {\n console.error(chalk.red(\"Scheduler not running or unreachable\"));\n writeLine(chalk.gray(` Expected at: ${API_URL}`));\n }\n}\n\nexport function registerTriggerCommand(program: Command): void {\n const trigger = program\n .command(\"trigger\")\n .description(\"Manage smart triggers\")\n .action(() => { trigger.outputHelp(); });\n\n trigger\n .command(\"list [squad]\")\n .description(\"List triggers\")\n .action(async (squad?: string) => {\n await listTriggers(squad);\n });\n\n trigger\n .command(\"sync\")\n .description(\"Sync SQUAD.md triggers to scheduler\")\n .action(async () => {\n await syncTriggers();\n });\n\n trigger\n .command(\"fire <name>\")\n .description(\"Manually fire a trigger\")\n .action(async (name: string) => {\n await fireTrigger(name);\n });\n\n trigger\n .command(\"enable <name>\")\n .description(\"Enable a trigger\")\n .action(async (name: string) => {\n await toggleTrigger(name, true);\n });\n\n trigger\n .command(\"disable <name>\")\n .description(\"Disable a trigger\")\n .action(async (name: string) => {\n await toggleTrigger(name, false);\n });\n\n trigger\n .command(\"status\")\n .description(\"Show scheduler status\")\n .action(async () => {\n await showStatus();\n });\n}\n","/**\n * squads autonomous - Local scheduling daemon for autonomous agent execution\n *\n * Commands:\n * squads autonomous start Start the daemon (detached background process)\n * squads autonomous stop Stop the daemon\n * squads autonomous status Show daemon status, running agents, next runs\n *\n * The daemon reads SQUAD.md routines, evaluates cron schedules, and spawns\n * agents via `squads run --background`. No database. No Redis. Just a process.\n *\n * Architecture: Layer 2 in docs/ARCHITECTURE.md\n */\n\nimport { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { writeLine } from \"../lib/terminal.js\";\nimport {\n existsSync,\n readFileSync,\n writeFileSync,\n unlinkSync,\n readdirSync,\n mkdirSync,\n appendFileSync,\n openSync,\n} from \"fs\";\nimport { join } from \"path\";\nimport { homedir } from \"os\";\nimport { spawn, execSync } from \"child_process\";\nimport { findSquadsDir, listSquads, Routine } from \"../lib/squad-parser.js\";\nimport {\n cronMatches,\n getNextCronRun,\n parseCooldown,\n} from \"../lib/cron.js\";\n\n// Daemon state directory — persistent across runs\nconst DAEMON_DIR = join(homedir(), \".squads\");\nconst PID_FILE = join(DAEMON_DIR, \"autonomous.pid\");\nconst DAEMON_LOG = join(DAEMON_DIR, \"autonomous.log\");\nconst PAUSE_FILE = join(DAEMON_DIR, \"autonomous.paused\");\nconst COOLDOWN_FILE = join(DAEMON_DIR, \"autonomous.cooldowns.json\");\n\n// Configuration from env vars (all optional)\nconst MAX_CONCURRENT = parseInt(process.env.SQUADS_MAX_CONCURRENT || \"5\");\nconst AGENT_TIMEOUT_MIN = parseInt(process.env.SQUADS_AGENT_TIMEOUT || \"30\");\nconst EVAL_INTERVAL_SEC = parseInt(process.env.SQUADS_EVAL_INTERVAL || \"60\");\n\ninterface RoutineWithSquad extends Routine {\n squad: string;\n}\n\n// =============================================================================\n// Cron Evaluator - now imported from lib/cron.ts\n// =============================================================================\n// Functions: cronMatches, getNextCronRun, parseCooldown are now in lib/cron.ts\n\n// =============================================================================\n// Routine Collection (from SQUAD.md files)\n// =============================================================================\n\n/**\n * Parse routines from SQUAD.md YAML blocks\n */\nfunction parseRoutinesFromFile(filePath: string): Routine[] {\n if (!existsSync(filePath)) return [];\n\n const content = readFileSync(filePath, \"utf-8\");\n const routines: Routine[] = [];\n\n const routinesMatch = content.match(\n /##+ \\w*\\s*Routines[\\s\\S]*?```yaml\\s*\\n([\\s\\S]*?)```/i\n );\n if (!routinesMatch) return [];\n\n let yamlContent = routinesMatch[1];\n yamlContent = yamlContent.replace(/^\\s*routines:\\s*\\n?/, \"\");\n yamlContent = \"\\n\" + yamlContent.trim();\n\n const routineBlocks = yamlContent.split(/\\n\\s*- name:\\s*/);\n\n for (const block of routineBlocks) {\n if (!block.trim()) continue;\n\n const lines = block.split(\"\\n\");\n const name = lines[0].trim();\n if (!name) continue;\n\n const scheduleMatch = block.match(/schedule:\\s*[\"']?([^\"'\\n#]+)/);\n const agentsMatch = block.match(/agents:\\s*\\[(.*?)\\]/);\n const modelMatch = block.match(/model:\\s*(\\w+)/);\n const enabledMatch = block.match(/enabled:\\s*(true|false)/);\n const priorityMatch = block.match(/priority:\\s*(\\d+)/);\n const cooldownMatch = block.match(\n /cooldown:\\s*[\"']?([^\"'\\n]+)[\"']?/\n );\n\n if (scheduleMatch && agentsMatch) {\n const agents = agentsMatch[1]\n .split(\",\")\n .map((a) => a.trim().replace(/[\"']/g, \"\"))\n .filter(Boolean);\n\n routines.push({\n name,\n schedule: scheduleMatch[1].trim().replace(/[\"']/g, \"\"),\n agents,\n model: modelMatch\n ? (modelMatch[1] as \"opus\" | \"sonnet\" | \"haiku\")\n : undefined,\n enabled: enabledMatch ? enabledMatch[1] === \"true\" : true,\n priority: priorityMatch ? parseInt(priorityMatch[1]) : undefined,\n cooldown: cooldownMatch ? cooldownMatch[1].trim() : undefined,\n });\n }\n }\n\n return routines;\n}\n\nfunction collectRoutines(): RoutineWithSquad[] {\n const squadsDir = findSquadsDir();\n if (!squadsDir) return [];\n\n const routines: RoutineWithSquad[] = [];\n const squadNames = listSquads(squadsDir);\n\n for (const name of squadNames) {\n const squadFile = join(squadsDir, name, \"SQUAD.md\");\n const squadRoutines = parseRoutinesFromFile(squadFile);\n\n for (const routine of squadRoutines) {\n routines.push({ ...routine, squad: name });\n }\n }\n\n return routines;\n}\n\n// =============================================================================\n// PID File Management\n// =============================================================================\n\n/**\n * Find the .agents/logs directory (relative to project root)\n */\nfunction getLogsDir(): string | null {\n const squadsDir = findSquadsDir();\n if (!squadsDir) return null;\n // squadsDir is .agents/squads, logs are at .agents/logs\n return join(squadsDir, \"..\", \"logs\");\n}\n\n/**\n * Count currently running agents by checking PID files\n */\nfunction getRunningAgents(): {\n squad: string;\n agent: string;\n pid: number;\n startedAt: number;\n logFile: string;\n}[] {\n const logsDir = getLogsDir();\n if (!logsDir || !existsSync(logsDir)) return [];\n\n const running: {\n squad: string;\n agent: string;\n pid: number;\n startedAt: number;\n logFile: string;\n }[] = [];\n\n let squadDirs: string[];\n try {\n squadDirs = readdirSync(logsDir);\n } catch {\n return [];\n }\n\n for (const squadDir of squadDirs) {\n const squadPath = join(logsDir, squadDir);\n let files: string[];\n try {\n files = readdirSync(squadPath);\n } catch {\n continue;\n }\n\n for (const file of files) {\n if (!file.endsWith(\".pid\")) continue;\n\n const pidPath = join(squadPath, file);\n try {\n const pid = parseInt(readFileSync(pidPath, \"utf-8\").trim());\n if (isNaN(pid)) continue;\n\n // Check if process is alive\n try {\n process.kill(pid, 0);\n } catch {\n // Process dead — clean up orphan PID file\n try {\n unlinkSync(pidPath);\n } catch {\n /* ignore */\n }\n continue;\n }\n\n // Extract agent name and timestamp from filename: agent-timestamp.pid\n const match = file.match(/^(.+)-(\\d+)\\.pid$/);\n if (!match) continue;\n\n const agentName = match[1];\n const timestamp = parseInt(match[2]);\n\n running.push({\n squad: squadDir,\n agent: agentName,\n pid,\n startedAt: timestamp,\n logFile: pidPath.replace(\".pid\", \".log\"),\n });\n } catch {\n continue;\n }\n }\n }\n\n return running;\n}\n\n/**\n * Kill an agent by PID and clean up its PID file\n */\nfunction killAgent(pid: number, pidFile: string, signal: NodeJS.Signals = \"SIGTERM\"): boolean {\n try {\n process.kill(pid, signal);\n // Give it a moment, then check if it's dead\n if (signal === \"SIGTERM\") {\n setTimeout(() => {\n try {\n process.kill(pid, 0); // Still alive?\n process.kill(pid, \"SIGKILL\"); // Force kill\n } catch {\n /* already dead */\n }\n }, 5000);\n }\n try {\n unlinkSync(pidFile);\n } catch {\n /* ignore */\n }\n return true;\n } catch {\n return false;\n }\n}\n\n// =============================================================================\n// Cooldown Parsing - now imported from lib/cron.ts\n// =============================================================================\n// Function: parseCooldown is now in lib/cron.ts\n\n// =============================================================================\n// Daemon Core\n// =============================================================================\n\n/**\n * Log a message to the daemon log file with timestamp\n */\nfunction daemonLog(msg: string): void {\n const ts = new Date().toISOString();\n const line = `[${ts}] ${msg}\\n`;\n try {\n appendFileSync(DAEMON_LOG, line);\n } catch {\n // Can't log — ignore\n }\n}\n\n// =============================================================================\n// Pause / Resume — quota awareness\n// =============================================================================\n\n/**\n * Check if the daemon is paused (e.g., quota exhausted).\n * The daemon stays running but stops spawning new agents.\n */\nfunction isPaused(): { paused: boolean; reason?: string; since?: string } {\n if (!existsSync(PAUSE_FILE)) return { paused: false };\n try {\n const data = JSON.parse(readFileSync(PAUSE_FILE, \"utf-8\"));\n return { paused: true, reason: data.reason, since: data.since };\n } catch {\n return { paused: true, reason: \"unknown\" };\n }\n}\n\n/**\n * Pause the daemon. It stays running but won't spawn new agents.\n * Use for quota limits, maintenance, or manual override.\n */\nfunction pauseDaemon(reason: string): void {\n if (!existsSync(DAEMON_DIR)) {\n mkdirSync(DAEMON_DIR, { recursive: true });\n }\n writeFileSync(PAUSE_FILE, JSON.stringify({\n reason,\n since: new Date().toISOString(),\n }));\n daemonLog(`PAUSED: ${reason}`);\n}\n\n/**\n * Resume the daemon after a pause.\n */\nfunction resumeDaemon(): void {\n try {\n unlinkSync(PAUSE_FILE);\n } catch {\n /* not paused */\n }\n daemonLog(\"RESUMED\");\n}\n\n// =============================================================================\n// Persistent Cooldown State — survives daemon restarts\n// =============================================================================\n\nfunction loadCooldowns(): Map<string, number> {\n const map = new Map<string, number>();\n if (!existsSync(COOLDOWN_FILE)) return map;\n try {\n const data = JSON.parse(readFileSync(COOLDOWN_FILE, \"utf-8\"));\n for (const [key, ts] of Object.entries(data)) {\n if (typeof ts === \"number\") map.set(key, ts);\n }\n } catch {\n /* corrupt file — start fresh */\n }\n return map;\n}\n\nfunction saveCooldowns(map: Map<string, number>): void {\n try {\n const obj: Record<string, number> = {};\n for (const [key, ts] of map) {\n obj[key] = ts;\n }\n writeFileSync(COOLDOWN_FILE, JSON.stringify(obj));\n } catch {\n /* best effort */\n }\n}\n\n/**\n * The main daemon loop. Runs as a long-lived process.\n * This is the COO's operating system — always on, managing the workforce.\n */\nasync function daemonLoop(): Promise<void> {\n daemonLog(\"Daemon started\");\n\n // Load persistent cooldown state (survives restarts)\n const lastSpawned = loadCooldowns();\n\n // Track consecutive spawn failures for auto-pause (quota detection)\n let consecutiveFailures = 0;\n const AUTO_PAUSE_THRESHOLD = 5;\n\n const tick = async () => {\n try {\n // Check if paused (quota, maintenance, manual)\n const pauseStatus = isPaused();\n if (pauseStatus.paused) {\n // Still enforce timeouts on running agents even when paused\n const running = getRunningAgents();\n for (const agent of running) {\n const runtimeMin = (Date.now() - agent.startedAt) / 60000;\n if (runtimeMin > AGENT_TIMEOUT_MIN) {\n daemonLog(\n `TIMEOUT: ${agent.squad}/${agent.agent} (PID ${agent.pid}, ${Math.round(runtimeMin)}min)`\n );\n const pidFile = agent.logFile.replace(\".log\", \".pid\");\n killAgent(agent.pid, pidFile);\n }\n }\n return; // Don't spawn new agents while paused\n }\n\n const now = new Date();\n now.setSeconds(0, 0); // Round to minute\n\n // 1. Collect enabled routines\n const routines = collectRoutines().filter((r) => r.enabled !== false);\n\n // 2. Check running agents\n const running = getRunningAgents();\n\n // 3. Timeout enforcement\n for (const agent of running) {\n const runtimeMin = (Date.now() - agent.startedAt) / 60000;\n if (runtimeMin > AGENT_TIMEOUT_MIN) {\n daemonLog(\n `TIMEOUT: ${agent.squad}/${agent.agent} (PID ${agent.pid}, ${Math.round(runtimeMin)}min)`\n );\n const pidFile = agent.logFile.replace(\".log\", \".pid\");\n killAgent(agent.pid, pidFile);\n }\n }\n\n // 4. Evaluate cron schedules\n for (const routine of routines) {\n if (!cronMatches(routine.schedule, now)) continue;\n\n for (const agentName of routine.agents) {\n const key = `${routine.squad}/${agentName}`;\n\n // Cooldown check (persistent across restarts)\n if (routine.cooldown) {\n const last = lastSpawned.get(key);\n const cooldownMs = parseCooldown(routine.cooldown);\n if (last && Date.now() - last < cooldownMs) {\n continue;\n }\n }\n\n // Already running check\n const alreadyRunning = running.some(\n (r) => r.squad === routine.squad && r.agent === agentName\n );\n if (alreadyRunning) continue;\n\n // Concurrency check\n const currentRunning = getRunningAgents().length;\n if (currentRunning >= MAX_CONCURRENT) {\n daemonLog(\n `SKIP: ${key} — concurrency limit (${currentRunning}/${MAX_CONCURRENT})`\n );\n continue;\n }\n\n // Spawn the agent\n daemonLog(`SPAWN: ${key} (routine: ${routine.name})`);\n try {\n const modelFlag = routine.model ? `--model ${routine.model}` : \"\";\n execSync(\n `squads run ${routine.squad}/${agentName} --background ${modelFlag} --trigger scheduled`,\n {\n cwd: process.cwd(),\n stdio: \"ignore\",\n timeout: 10000, // 10s to spawn\n env: {\n ...process.env,\n CLAUDECODE: \"\", // Allow nested claude sessions\n },\n }\n );\n lastSpawned.set(key, Date.now());\n saveCooldowns(lastSpawned); // Persist to disk\n consecutiveFailures = 0; // Reset failure counter\n daemonLog(`SPAWNED: ${key}`);\n } catch (err) {\n consecutiveFailures++;\n daemonLog(`ERROR: Failed to spawn ${key} (${consecutiveFailures}/${AUTO_PAUSE_THRESHOLD}): ${err}`);\n\n // Auto-pause after repeated failures (likely quota exhausted)\n if (consecutiveFailures >= AUTO_PAUSE_THRESHOLD) {\n pauseDaemon(`Auto-paused: ${consecutiveFailures} consecutive spawn failures (likely quota exhausted)`);\n daemonLog(`AUTO-PAUSED: ${consecutiveFailures} consecutive failures. Run 'squads autonomous resume' when quota resets.`);\n }\n }\n }\n }\n } catch (err) {\n daemonLog(`TICK ERROR: ${err}`);\n }\n };\n\n // Run immediately, then on interval\n await tick();\n setInterval(tick, EVAL_INTERVAL_SEC * 1000);\n\n // Clean shutdown\n const cleanup = (signal: string) => {\n daemonLog(`Received ${signal}, shutting down`);\n saveCooldowns(lastSpawned); // Persist cooldowns before exit\n try {\n unlinkSync(PID_FILE);\n } catch {\n /* ignore */\n }\n process.exit(0);\n };\n\n process.on(\"SIGTERM\", () => cleanup(\"SIGTERM\"));\n process.on(\"SIGINT\", () => cleanup(\"SIGINT\"));\n}\n\n// =============================================================================\n// Daemon Lifecycle (check/start/stop)\n// =============================================================================\n\nfunction isRunning(): { running: boolean; pid?: number } {\n if (!existsSync(PID_FILE)) return { running: false };\n\n const pid = parseInt(readFileSync(PID_FILE, \"utf-8\").trim());\n if (isNaN(pid)) return { running: false };\n\n try {\n process.kill(pid, 0);\n return { running: true, pid };\n } catch {\n // Stale PID file\n try {\n unlinkSync(PID_FILE);\n } catch {\n /* ignore */\n }\n return { running: false };\n }\n}\n\nasync function startScheduler(): Promise<void> {\n const status = isRunning();\n if (status.running) {\n writeLine(\n chalk.yellow(`Daemon already running (PID ${status.pid})`)\n );\n writeLine(chalk.gray(` Log: ${DAEMON_LOG}`));\n return;\n }\n\n // Ensure daemon directory exists\n if (!existsSync(DAEMON_DIR)) {\n mkdirSync(DAEMON_DIR, { recursive: true });\n }\n\n const routines = collectRoutines().filter((r) => r.enabled !== false);\n if (routines.length === 0) {\n writeLine(chalk.yellow(\"No enabled routines found.\"));\n writeLine(\n chalk.gray(\"Add routines to SQUAD.md files under ### Routines section.\")\n );\n return;\n }\n\n // Check if we're being invoked as the daemon itself (via env var)\n if (process.env.SQUADS_DAEMON === \"1\") {\n // We ARE the daemon — run the loop\n writeFileSync(PID_FILE, process.pid.toString());\n await daemonLoop();\n // daemonLoop never returns (infinite setInterval)\n // Keep the event loop alive\n await new Promise(() => {});\n return;\n }\n\n // Spawn a detached daemon process\n // Use SQUADS_DAEMON env var instead of --daemon CLI flag to avoid\n // Commander.js rejecting the unknown option and silently exiting\n\n // Redirect child stdout/stderr to daemon log for diagnosability\n if (!existsSync(DAEMON_LOG)) {\n writeFileSync(DAEMON_LOG, \"\");\n }\n const logFd = openSync(DAEMON_LOG, \"a\");\n\n const child = spawn(\n process.execPath, // node\n [process.argv[1], \"autonomous\", \"start\"],\n {\n cwd: process.cwd(),\n detached: true,\n stdio: [\"ignore\", logFd, logFd],\n env: { ...process.env, SQUADS_DAEMON: \"1\" },\n }\n );\n child.unref();\n\n // Wait for PID file to appear (2s for slower systems)\n await new Promise((resolve) => setTimeout(resolve, 2000));\n\n const check = isRunning();\n if (check.running) {\n writeLine(chalk.green(`\\n Daemon started (PID ${check.pid})`));\n } else {\n writeLine(chalk.red(\"\\n Daemon failed to start. Check log:\"));\n writeLine(chalk.gray(` $ tail -20 ${DAEMON_LOG}`));\n }\n\n writeLine(chalk.gray(` Log: ${DAEMON_LOG}`));\n writeLine(chalk.gray(` Config: SQUAD.md routines\\n`));\n\n // Show what's scheduled\n writeLine(chalk.cyan(\" Routines\"));\n const bySquad = new Map<string, RoutineWithSquad[]>();\n for (const r of routines) {\n if (!bySquad.has(r.squad)) bySquad.set(r.squad, []);\n bySquad.get(r.squad)!.push(r);\n }\n\n for (const [squad, squadRoutines] of bySquad) {\n for (const r of squadRoutines) {\n const next = getNextCronRun(r.schedule);\n const timeStr = next.toLocaleTimeString([], {\n hour: \"2-digit\",\n minute: \"2-digit\",\n });\n writeLine(\n ` ${chalk.green(\"●\")} ${chalk.cyan(squad)}/${r.name} ${chalk.gray(r.schedule)} ${chalk.gray(`→ ${timeStr}`)}`\n );\n }\n }\n\n writeLine(\n chalk.gray(`\\n ${routines.length} routines, max ${MAX_CONCURRENT} concurrent`)\n );\n writeLine(chalk.gray(\" Stop: squads autonomous stop\"));\n writeLine(chalk.gray(` Monitor: tail -f ${DAEMON_LOG}\\n`));\n}\n\nfunction stopScheduler(): void {\n const status = isRunning();\n\n if (!status.running) {\n writeLine(chalk.gray(\"Daemon not running\"));\n return;\n }\n\n try {\n process.kill(status.pid!, \"SIGTERM\");\n try {\n unlinkSync(PID_FILE);\n } catch {\n /* ignore */\n }\n writeLine(chalk.green(`Daemon stopped (PID ${status.pid})`));\n } catch (error) {\n console.error(chalk.red(`Failed to stop daemon: ${error}`));\n }\n}\n\nasync function showStatus(): Promise<void> {\n const daemon = isRunning();\n const routines = collectRoutines();\n const enabled = routines.filter((r) => r.enabled !== false);\n const running = getRunningAgents();\n\n writeLine(chalk.bold(\"\\n Autonomous Scheduler\\n\"));\n\n // Daemon status\n const pauseStatus = isPaused();\n if (daemon.running) {\n if (pauseStatus.paused) {\n writeLine(\n ` ${chalk.yellow(\"●\")} Daemon paused ${chalk.gray(`(PID ${daemon.pid})`)}`\n );\n writeLine(` ${chalk.yellow(pauseStatus.reason || \"No reason given\")} ${chalk.gray(`since ${pauseStatus.since || \"unknown\"}`)}`);\n } else {\n writeLine(\n ` ${chalk.green(\"●\")} Daemon running ${chalk.gray(`(PID ${daemon.pid})`)}`\n );\n }\n } else {\n writeLine(` ${chalk.red(\"●\")} Daemon not running`);\n }\n writeLine();\n\n // Running agents\n if (running.length > 0) {\n writeLine(chalk.cyan(\" Running Agents\"));\n for (const agent of running) {\n const runtimeMin = Math.round((Date.now() - agent.startedAt) / 60000);\n const timeoutWarning =\n runtimeMin > AGENT_TIMEOUT_MIN * 0.8 ? chalk.yellow(\" ⚠\") : \"\";\n writeLine(\n ` ${chalk.green(\"●\")} ${chalk.cyan(agent.squad)}/${agent.agent} ${chalk.gray(`${runtimeMin}min`)}${timeoutWarning} ${chalk.gray(`PID ${agent.pid}`)}`\n );\n }\n writeLine();\n }\n\n // Routine summary\n writeLine(chalk.cyan(\" Routines\"));\n writeLine(\n ` ${enabled.length} enabled / ${routines.length} total, ${running.length}/${MAX_CONCURRENT} running`\n );\n writeLine();\n\n // Next 10 upcoming runs\n if (enabled.length > 0) {\n writeLine(chalk.cyan(\" Next Runs\"));\n\n const now = new Date();\n const nextRuns: {\n squad: string;\n routine: string;\n agent: string;\n nextRun: Date;\n }[] = [];\n\n for (const r of enabled) {\n const next = getNextCronRun(r.schedule, now);\n for (const agent of r.agents) {\n nextRuns.push({\n squad: r.squad,\n routine: r.name,\n agent,\n nextRun: next,\n });\n }\n }\n\n nextRuns\n .sort((a, b) => a.nextRun.getTime() - b.nextRun.getTime())\n .slice(0, 10)\n .forEach((run) => {\n const timeStr = run.nextRun.toLocaleTimeString([], {\n hour: \"2-digit\",\n minute: \"2-digit\",\n });\n const dateStr =\n run.nextRun.toDateString() === now.toDateString()\n ? \"today\"\n : run.nextRun.toLocaleDateString([], {\n month: \"short\",\n day: \"numeric\",\n });\n writeLine(\n ` ${chalk.gray(timeStr)} ${chalk.gray(dateStr)} ${chalk.cyan(run.squad)}/${run.agent}`\n );\n });\n }\n\n writeLine();\n writeLine(chalk.gray(\" Commands:\"));\n writeLine(chalk.gray(\" $ squads autonomous start Start daemon\"));\n writeLine(chalk.gray(\" $ squads autonomous stop Stop daemon\"));\n writeLine(chalk.gray(\" $ squads autonomous pause Pause (quota/manual)\"));\n writeLine(chalk.gray(\" $ squads autonomous resume Resume after pause\"));\n writeLine(chalk.gray(` $ tail -f ${DAEMON_LOG}`));\n writeLine();\n}\n\n// =============================================================================\n// Command Registration\n// =============================================================================\n\nexport function registerAutonomousCommand(program: Command): void {\n const autonomous = program\n .command(\"autonomous\")\n .alias(\"auto\")\n .description(\"Local scheduling daemon for autonomous agent execution\")\n .action(() => { autonomous.outputHelp(); });\n\n autonomous\n .command(\"start\")\n .description(\"Start the scheduling daemon\")\n .action(async () => {\n await startScheduler();\n });\n\n autonomous\n .command(\"stop\")\n .description(\"Stop the scheduling daemon\")\n .action(() => {\n stopScheduler();\n });\n\n autonomous\n .command(\"status\")\n .description(\"Show daemon status, running agents, and next runs\")\n .action(async () => {\n await showStatus();\n });\n\n autonomous\n .command(\"pause\")\n .description(\"Pause the daemon (e.g. quota exhausted)\")\n .argument(\"[reason]\", \"Reason for pausing\", \"Manual pause\")\n .action((reason: string) => {\n pauseDaemon(reason);\n });\n\n autonomous\n .command(\"resume\")\n .description(\"Resume a paused daemon\")\n .action(() => {\n resumeDaemon();\n });\n}\n","/**\n * squads approval - Manage approval requests for agent actions\n *\n * Commands:\n * squads approval send <type> Send approval request to Slack\n * squads approval list List pending approvals\n * squads approval check <id> Check approval status\n * squads approval cancel <id> Cancel pending approval\n */\n\nimport { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { writeLine } from \"../lib/terminal.js\";\nimport { getApiUrl } from \"../lib/env-config.js\";\n\nconst API_URL = getApiUrl();\n\ntype ApprovalType = \"issue\" | \"pr\" | \"content\" | \"run\" | \"brief\";\n\ninterface Approval {\n approval_id: string;\n type: ApprovalType;\n squad: string;\n agent?: string;\n title: string;\n description?: string;\n payload: Record<string, unknown>;\n status: \"pending\" | \"approved\" | \"rejected\" | \"expired\" | \"cancelled\";\n decided_by?: string;\n decided_at?: string;\n created_at: string;\n expires_at: string;\n}\n\nfunction generateApprovalId(): string {\n const timestamp = Date.now().toString(36);\n const random = Math.random().toString(36).substring(2, 8);\n return `appr_${timestamp}_${random}`;\n}\n\nfunction parseExpiresIn(expiresIn: string): Date {\n const expiresAt = new Date();\n const match = expiresIn.match(/(\\d+)(h|m|d)/);\n if (match) {\n const [, num, unit] = match;\n const hours =\n unit === \"d\"\n ? parseInt(num) * 24\n : unit === \"h\"\n ? parseInt(num)\n : parseInt(num) / 60;\n expiresAt.setHours(expiresAt.getHours() + hours);\n } else {\n // Default to 24 hours\n expiresAt.setHours(expiresAt.getHours() + 24);\n }\n return expiresAt;\n}\n\nasync function sendApproval(\n type: string,\n options: {\n title?: string;\n description?: string;\n squad?: string;\n agent?: string;\n priority?: string;\n expiresIn?: string;\n json?: string;\n }\n): Promise<void> {\n const approvalId = generateApprovalId();\n\n let payload: Record<string, unknown> = {};\n\n // Parse JSON payload if provided\n if (options.json) {\n try {\n if (options.json === \"-\") {\n // Read from stdin\n const chunks: Buffer[] = [];\n for await (const chunk of process.stdin) {\n chunks.push(chunk);\n }\n payload = JSON.parse(Buffer.concat(chunks).toString());\n } else {\n payload = JSON.parse(options.json);\n }\n } catch {\n console.error(chalk.red(\"Invalid JSON payload\"));\n process.exit(1);\n }\n }\n\n const expiresAt = parseExpiresIn(options.expiresIn || \"24h\");\n\n const approval = {\n approval_id: approvalId,\n type,\n title: options.title || payload.title || `Approval needed: ${type}`,\n description: options.description || (payload.description as string),\n squad: options.squad || process.env.SQUADS_SQUAD || \"unknown\",\n agent: options.agent || process.env.SQUADS_AGENT,\n priority: parseInt(options.priority || \"5\"),\n expires_at: expiresAt.toISOString(),\n payload,\n };\n\n try {\n const response = await fetch(`${API_URL}/approvals`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(approval),\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(error);\n }\n\n const result = (await response.json()) as {\n success: boolean;\n approval_id: string;\n };\n\n writeLine(chalk.green(`\\nApproval sent: ${result.approval_id}`));\n writeLine(chalk.dim(` Expires: ${expiresAt.toISOString()}`));\n writeLine();\n\n // Output for agent consumption\n if (process.env.SQUADS_AGENT) {\n writeLine(`APPROVAL_ID=${approvalId}`);\n }\n } catch (error) {\n console.error(chalk.red(`Failed to send approval: ${error}`));\n process.exit(1);\n }\n}\n\nasync function listApprovals(options: {\n pending?: boolean;\n squad?: string;\n json?: boolean;\n}): Promise<void> {\n const status = options.pending ? \"pending\" : \"\";\n const params = new URLSearchParams();\n if (status) params.set(\"status\", status);\n if (options.squad) params.set(\"squad\", options.squad);\n\n try {\n const response = await fetch(\n `${API_URL}/approvals?${params.toString()}`\n );\n if (!response.ok) throw new Error(await response.text());\n\n const approvals = (await response.json()) as Approval[];\n\n if (options.json) {\n console.log(JSON.stringify(approvals, null, 2));\n return;\n }\n\n if (approvals.length === 0) {\n writeLine(chalk.gray(\"\\nNo pending approvals\\n\"));\n return;\n }\n\n writeLine(chalk.bold(\"\\nPending Approvals\\n\"));\n\n for (const a of approvals) {\n const typeColors: Record<ApprovalType, typeof chalk.green> = {\n issue: chalk.green,\n pr: chalk.magenta,\n content: chalk.blue,\n run: chalk.yellow,\n brief: chalk.cyan,\n };\n const color = typeColors[a.type] || chalk.white;\n\n writeLine(\n ` ${color(`[${a.type}]`)} ${chalk.bold(a.title)} ${chalk.dim(`(${a.approval_id})`)}`\n );\n writeLine(\n chalk.dim(\n ` Squad: ${a.squad}${a.agent ? \"/\" + a.agent : \"\"} | Created: ${new Date(a.created_at).toLocaleString()}`\n )\n );\n writeLine();\n }\n } catch (error) {\n console.error(chalk.red(`Failed to list approvals: ${error}`));\n process.exit(1);\n }\n}\n\nasync function checkApproval(\n approvalId: string,\n options: { wait?: boolean; timeout?: string }\n): Promise<void> {\n const timeoutMs = parseInt(options.timeout || \"60\") * 60 * 1000;\n const startTime = Date.now();\n\n async function check(): Promise<Approval | null> {\n try {\n const response = await fetch(\n `${API_URL}/approvals/${approvalId}`\n );\n if (response.status === 404) return null;\n if (!response.ok) throw new Error(await response.text());\n return (await response.json()) as Approval;\n } catch (error) {\n console.error(chalk.red(`Failed to check approval: ${error}`));\n return null;\n }\n }\n\n const approval = await check();\n\n if (!approval) {\n console.error(chalk.red(`Approval not found: ${approvalId}`));\n process.exit(1);\n }\n\n if (approval.status !== \"pending\" || !options.wait) {\n // Output current status\n const statusColors: Record<string, typeof chalk.green> = {\n pending: chalk.yellow,\n approved: chalk.green,\n rejected: chalk.red,\n expired: chalk.gray,\n cancelled: chalk.gray,\n };\n const color = statusColors[approval.status] || chalk.white;\n\n writeLine(`\\nApproval: ${approvalId}`);\n writeLine(` Status: ${color(approval.status)}`);\n if (approval.decided_by) {\n writeLine(` Decided by: ${approval.decided_by}`);\n writeLine(` Decided at: ${approval.decided_at}`);\n }\n writeLine();\n\n // Exit with appropriate code\n if (approval.status === \"approved\") {\n process.exit(0);\n } else if (approval.status === \"rejected\") {\n process.exit(1);\n } else if (approval.status === \"pending\") {\n process.exit(2);\n } else {\n process.exit(3);\n }\n }\n\n // Wait mode\n writeLine(chalk.dim(`Waiting for decision on ${approvalId}...`));\n\n while (Date.now() - startTime < timeoutMs) {\n await new Promise((resolve) => setTimeout(resolve, 5000)); // Poll every 5s\n\n const updated = await check();\n if (!updated) {\n console.error(chalk.red(\"Approval disappeared\"));\n process.exit(1);\n }\n\n if (updated.status !== \"pending\") {\n const color =\n updated.status === \"approved\" ? chalk.green : chalk.red;\n writeLine(color(`\\nDecision: ${updated.status}`));\n if (updated.decided_by) {\n writeLine(chalk.dim(` By: ${updated.decided_by}`));\n }\n process.exit(updated.status === \"approved\" ? 0 : 1);\n }\n }\n\n console.error(chalk.red(\"Timeout waiting for approval\"));\n process.exit(2);\n}\n\nasync function cancelApproval(approvalId: string): Promise<void> {\n writeLine(chalk.yellow(`Cancel not yet implemented for: ${approvalId}`));\n // TODO: Implement cancel endpoint\n}\n\nexport function registerApprovalCommand(program: Command): void {\n const approval = program\n .command(\"approval\")\n .description(\"Manage approval requests for agent actions\")\n .action(() => { approval.outputHelp(); });\n\n approval\n .command(\"send <type>\")\n .description(\"Send approval request to Slack\")\n .option(\"-t, --title <title>\", \"Approval title\")\n .option(\"-d, --description <desc>\", \"Detailed description\")\n .option(\"-s, --squad <squad>\", \"Squad name\")\n .option(\"-a, --agent <agent>\", \"Agent name\")\n .option(\"-p, --priority <n>\", \"Priority 1-10 (1=urgent)\", \"5\")\n .option(\"-e, --expires-in <time>\", \"Expiration time (24h, 1h, 30m)\", \"24h\")\n .option(\"-j, --json <json>\", \"Full payload as JSON (use - for stdin)\")\n .addHelpText(\n \"after\",\n `\nTypes: issue, pr, content, run, brief\n\nExamples:\n $ squads approval send pr --title \"Merge feature X\" --json '{\"repo\":\"agents-squads/hq\",\"number\":123}'\n $ squads approval send content -t \"LinkedIn post\" -d \"New blog announcement\"\n $ echo '{\"title\":\"Run overnight\"}' | squads approval send run --json -\n`\n )\n .action(sendApproval);\n\n approval\n .command(\"list\")\n .description(\"List approvals\")\n .option(\"--pending\", \"Only show pending approvals\", true)\n .option(\"-s, --squad <squad>\", \"Filter by squad\")\n .option(\"-j, --json\", \"Output as JSON\")\n .action(listApprovals);\n\n approval\n .command(\"check <id>\")\n .description(\"Check approval status\")\n .option(\"-w, --wait\", \"Wait for decision (polls every 5s)\")\n .option(\"-t, --timeout <minutes>\", \"Wait timeout in minutes\", \"60\")\n .action(checkApproval);\n\n approval\n .command(\"cancel <id>\")\n .description(\"Cancel pending approval\")\n .action(cancelApproval);\n}\n","/**\n * squads deploy — Push agent definitions to the Squads platform.\n *\n * Reads .agents/ directory (squads, agents, routines, memory),\n * packages the deployment manifest, and syncs it to the platform API.\n *\n * This is the upgrade path from Layer 2 (local autonomous) to Layer 3 (platform).\n */\n\nimport { Command } from 'commander';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport { existsSync, readFileSync } from 'fs';\nimport { execSync } from 'child_process';\nimport {\n findSquadsDir,\n listSquads,\n loadSquad,\n listAgents,\n} from '../lib/squad-parser.js';\nimport { writeLine } from '../lib/terminal.js';\nimport matter from 'gray-matter';\nimport { loadSession } from '../lib/auth.js';\nimport { track } from '../lib/telemetry.js';\n\n// Platform API URL\nconst PLATFORM_API_URL = process.env.SQUADS_PLATFORM_URL || process.env.SQUADS_API_URL || process.env.SQUADS_SCHEDULER_URL || '';\n\n// ─── Types ───────────────────────────────────────────────────────────────────\n\ninterface DeployManifest {\n /** Squads with their agents and routines */\n squads: SquadManifest[];\n /** Triggers to sync (from routines) */\n triggers: TriggerSync[];\n /** Timestamp of deployment */\n deployedAt: string;\n /** Git SHA if available */\n gitSha?: string;\n}\n\ninterface SquadManifest {\n name: string;\n agentCount: number;\n agents: AgentManifest[];\n routineCount: number;\n}\n\ninterface AgentManifest {\n name: string;\n squad: string;\n role: string;\n model: string;\n schedule?: string;\n status: string;\n}\n\ninterface TriggerSync {\n name: string;\n squad: string;\n agent: string | null;\n condition: string;\n cooldown: string;\n priority: number;\n context: Record<string, unknown>;\n}\n\ninterface DeployResult {\n triggersCreated: number;\n triggersSynced: string[];\n errors: Array<{ name: string; error: string }>;\n}\n\n// ─── Commands ────────────────────────────────────────────────────────────────\n\nexport async function deployCommand(options: {\n dryRun?: boolean;\n squad?: string;\n verbose?: boolean;\n}): Promise<void> {\n const session = loadSession();\n\n if (!session || session.status !== 'active') {\n writeLine(`\n${chalk.yellow('Not logged in or account not active.')}\n\n${chalk.bold('To deploy agents to the platform:')}\n 1. ${chalk.cyan('squads login')} — Authenticate with your team account\n 2. ${chalk.cyan('squads deploy')} — Push agents to the platform\n\n${chalk.dim('Status:')} ${session ? `${session.email} (${session.status})` : 'Not logged in'}\n${chalk.dim('Need access?')} ${chalk.cyan('hello@agents-squads.com')}\n`);\n await track('cli.deploy.not_authenticated');\n return;\n }\n\n // Find .agents/ directory\n const squadsDir = findSquadsDir();\n if (!squadsDir) {\n console.error(chalk.red('No .agents/squads/ directory found.'));\n writeLine(chalk.dim('Run: squads init'));\n return;\n }\n\n const spinner = ora('Building deployment manifest...').start();\n\n try {\n // Build manifest\n const manifest = buildManifest(squadsDir, options.squad);\n\n if (manifest.squads.length === 0) {\n spinner.warn('No squads found to deploy.');\n return;\n }\n\n spinner.succeed(`Found ${manifest.squads.length} squad(s), ${manifest.triggers.length} trigger(s)`);\n\n // Show what will be deployed\n writeLine('');\n writeLine(chalk.bold('Deployment Manifest'));\n writeLine(chalk.dim('─'.repeat(50)));\n\n for (const squad of manifest.squads) {\n writeLine(` ${chalk.cyan(squad.name)} — ${squad.agentCount} agent(s), ${squad.routineCount} routine(s)`);\n if (options.verbose) {\n for (const agent of squad.agents) {\n const status = agent.status === 'active' ? chalk.green('active') : chalk.yellow(agent.status);\n writeLine(` ${chalk.dim('→')} ${agent.name} (${agent.model}) [${status}]`);\n if (agent.schedule) {\n writeLine(` ${chalk.dim('schedule:')} ${agent.schedule}`);\n }\n }\n }\n }\n\n if (manifest.triggers.length > 0) {\n writeLine('');\n writeLine(chalk.bold('Triggers to sync'));\n writeLine(chalk.dim('─'.repeat(50)));\n for (const trigger of manifest.triggers) {\n writeLine(` ${chalk.magenta(trigger.name)} — ${trigger.squad}${trigger.agent ? '/' + trigger.agent : ''}`);\n if (options.verbose) {\n writeLine(` ${chalk.dim('schedule:')} ${trigger.condition}`);\n writeLine(` ${chalk.dim('cooldown:')} ${trigger.cooldown}`);\n }\n }\n }\n\n if (manifest.gitSha) {\n writeLine('');\n writeLine(chalk.dim(`Git SHA: ${manifest.gitSha}`));\n }\n\n // Dry run stops here\n if (options.dryRun) {\n writeLine('');\n writeLine(chalk.yellow('Dry run — no changes pushed to platform.'));\n writeLine(chalk.dim('Remove --dry-run to deploy.'));\n await track('cli.deploy.dry_run', {\n squads: manifest.squads.length,\n triggers: manifest.triggers.length,\n });\n return;\n }\n\n // Push to platform\n writeLine('');\n const pushSpinner = ora('Pushing to platform...').start();\n\n const result = await pushToplatform(manifest, session.accessToken || '');\n\n if (result.errors.length > 0) {\n pushSpinner.warn(`Deployed with ${result.errors.length} error(s)`);\n for (const err of result.errors) {\n writeLine(` ${chalk.red('✗')} ${err.name}: ${err.error}`);\n }\n } else {\n pushSpinner.succeed(`Deployed ${result.triggersCreated} trigger(s) to platform`);\n }\n\n if (result.triggersSynced.length > 0 && options.verbose) {\n writeLine('');\n writeLine(chalk.dim('Synced triggers:'));\n for (const name of result.triggersSynced) {\n writeLine(` ${chalk.green('✓')} ${name}`);\n }\n }\n\n writeLine(`\n${chalk.green('✓ Deployment complete.')}\n\n${chalk.bold('Next steps:')}\n ${chalk.dim('→')} View in dashboard: ${chalk.cyan(process.env.SQUADS_CONSOLE_URL || 'squads deploy status')}\n ${chalk.dim('→')} Check status: ${chalk.cyan('squads deploy status')}\n ${chalk.dim('→')} Pull cloud state: ${chalk.cyan('squads deploy pull')}\n`);\n\n await track('cli.deploy.success', {\n squads: manifest.squads.length,\n triggers: manifest.triggers.length,\n errors: result.errors.length,\n });\n\n } catch (error) {\n spinner.fail('Deployment failed');\n const message = error instanceof Error ? error.message : String(error);\n console.error(chalk.red(message));\n\n if (message.includes('fetch failed') || message.includes('ECONNREFUSED')) {\n writeLine(chalk.dim('\\nPlatform may be unreachable. Check your connection.'));\n }\n\n await track('cli.deploy.error', { error: message });\n }\n}\n\nexport async function deployStatusCommand(): Promise<void> {\n const session = loadSession();\n if (!session?.accessToken) {\n writeLine(chalk.yellow('Not logged in. Run: squads login'));\n return;\n }\n\n const spinner = ora('Fetching deployment status...').start();\n\n try {\n const response = await fetch(`${PLATFORM_API_URL}/triggers`, {\n headers: {\n 'Authorization': `Bearer ${session.accessToken}`,\n },\n signal: AbortSignal.timeout(5000),\n });\n\n if (!response.ok) {\n spinner.fail(`Failed to fetch triggers: ${response.status}`);\n return;\n }\n\n const data = await response.json() as Array<{\n name: string;\n squad: string;\n agent: string | null;\n enabled: boolean;\n last_fired_at: string | null;\n trigger_type: string;\n }>;\n\n spinner.succeed(`${data.length} trigger(s) on platform`);\n\n if (data.length === 0) {\n writeLine(chalk.dim('\\nNo triggers deployed. Run: squads deploy'));\n return;\n }\n\n writeLine('');\n writeLine(chalk.bold('Platform Triggers'));\n writeLine(chalk.dim('─'.repeat(60)));\n\n for (const trigger of data) {\n const status = trigger.enabled ? chalk.green('enabled') : chalk.red('disabled');\n const lastFired = trigger.last_fired_at\n ? chalk.dim(new Date(trigger.last_fired_at).toLocaleString())\n : chalk.dim('never');\n\n writeLine(` ${status} ${chalk.cyan(trigger.name)} — ${trigger.squad}${trigger.agent ? '/' + trigger.agent : ''}`);\n writeLine(` ${chalk.dim('type:')} ${trigger.trigger_type} ${chalk.dim('last fired:')} ${lastFired}`);\n }\n\n // Show execution stats\n const execResponse = await fetch(`${PLATFORM_API_URL}/stats`, {\n headers: {\n 'Authorization': `Bearer ${session.accessToken}`,\n },\n signal: AbortSignal.timeout(5000),\n });\n\n if (execResponse.ok) {\n const stats = await execResponse.json() as Record<string, unknown>;\n writeLine('');\n writeLine(chalk.bold('Platform Stats'));\n writeLine(chalk.dim('─'.repeat(60)));\n if (stats.running_agents !== undefined) {\n writeLine(` Running agents: ${chalk.cyan(String(stats.running_agents))}`);\n }\n if (stats.executions_today !== undefined) {\n writeLine(` Executions today: ${chalk.cyan(String(stats.executions_today))}`);\n }\n if (stats.total_cost_today !== undefined) {\n writeLine(` Cost today: ${chalk.cyan('$' + String(stats.total_cost_today))}`);\n }\n }\n\n } catch (error) {\n spinner.fail('Failed to fetch status');\n const msg = error instanceof Error ? error.message : String(error);\n if (msg.includes('fetch failed') || msg.includes('ECONNREFUSED') || msg.includes('abort')) {\n writeLine(chalk.yellow('\\nAPI unavailable. Check connection or run `squads login`.'));\n } else {\n console.error(chalk.red(msg));\n }\n }\n}\n\nexport async function deployPullCommand(options: { verbose?: boolean }): Promise<void> {\n const session = loadSession();\n if (!session?.accessToken) {\n writeLine(chalk.yellow('Not logged in. Run: squads login'));\n return;\n }\n\n const spinner = ora('Pulling execution data from platform...').start();\n\n try {\n // Pull recent executions\n const response = await fetch(`${PLATFORM_API_URL}/executions?limit=20`, {\n headers: {\n 'Authorization': `Bearer ${session.accessToken}`,\n },\n signal: AbortSignal.timeout(5000),\n });\n\n if (!response.ok) {\n spinner.fail(`Failed to pull executions: ${response.status}`);\n return;\n }\n\n const executions = await response.json() as Array<{\n id: string;\n trigger_name: string;\n squad: string;\n agent: string | null;\n status: string;\n started_at: string;\n completed_at: string | null;\n cost_usd: number | null;\n }>;\n\n spinner.succeed(`Pulled ${executions.length} recent execution(s)`);\n\n if (executions.length === 0) {\n writeLine(chalk.dim('\\nNo executions found on platform.'));\n return;\n }\n\n writeLine('');\n writeLine(chalk.bold('Recent Platform Executions'));\n writeLine(chalk.dim('─'.repeat(70)));\n\n for (const exec of executions) {\n const statusColor = exec.status === 'completed' ? chalk.green\n : exec.status === 'failed' ? chalk.red\n : exec.status === 'running' ? chalk.yellow\n : chalk.dim;\n\n const cost = exec.cost_usd !== null ? chalk.dim(`$${exec.cost_usd.toFixed(2)}`) : '';\n const time = new Date(exec.started_at).toLocaleString();\n\n writeLine(` ${statusColor(exec.status.padEnd(10))} ${chalk.cyan(exec.trigger_name)} ${chalk.dim(time)} ${cost}`);\n\n if (options.verbose && exec.completed_at) {\n const duration = (new Date(exec.completed_at).getTime() - new Date(exec.started_at).getTime()) / 1000;\n writeLine(` ${chalk.dim(`duration: ${duration.toFixed(0)}s`)}`);\n }\n }\n\n // Pull learnings (collective memory from cloud runs)\n const learningsResponse = await fetch(`${PLATFORM_API_URL}/learnings/relevant?limit=5`, {\n headers: {\n 'Authorization': `Bearer ${session.accessToken}`,\n },\n signal: AbortSignal.timeout(5000),\n });\n\n if (learningsResponse.ok) {\n const learnings = await learningsResponse.json() as Array<{\n squad: string;\n agent: string;\n insight: string;\n created_at: string;\n }>;\n\n if (learnings.length > 0) {\n writeLine('');\n writeLine(chalk.bold('Recent Learnings'));\n writeLine(chalk.dim('─'.repeat(70)));\n for (const l of learnings) {\n writeLine(` ${chalk.cyan(l.squad)}/${l.agent}: ${l.insight.substring(0, 80)}${l.insight.length > 80 ? '...' : ''}`);\n }\n }\n }\n\n } catch (error) {\n spinner.fail('Failed to pull data');\n const msg = error instanceof Error ? error.message : String(error);\n if (msg.includes('fetch failed') || msg.includes('ECONNREFUSED') || msg.includes('abort')) {\n writeLine(chalk.yellow('\\nAPI unavailable. Check connection or run `squads login`.'));\n } else {\n console.error(chalk.red(msg));\n }\n }\n}\n\n// ─── Helpers ─────────────────────────────────────────────────────────────────\n\nfunction buildManifest(squadsDir: string, filterSquad?: string): DeployManifest {\n const squadNames = filterSquad ? [filterSquad] : listSquads(squadsDir);\n const squads: SquadManifest[] = [];\n const triggers: TriggerSync[] = [];\n\n // Try to get git SHA\n let gitSha: string | undefined;\n try {\n gitSha = execSync('git rev-parse --short HEAD', { encoding: 'utf-8' }).trim();\n } catch {\n // Not in a git repo\n }\n\n for (const squadName of squadNames) {\n const squad = loadSquad(squadName);\n if (!squad) continue;\n\n const agents: AgentManifest[] = [];\n const agentList = listAgents(squadsDir, squadName);\n\n for (const agent of agentList) {\n // Parse agent frontmatter for model, schedule, status\n let role = '';\n let model = 'sonnet';\n let schedule: string | undefined;\n let status = 'active';\n\n if (agent.filePath && existsSync(agent.filePath)) {\n const raw = readFileSync(agent.filePath, 'utf-8');\n const { data: fm } = matter(raw);\n role = (fm.role as string) || '';\n model = (fm.model as string) || 'sonnet';\n schedule = fm.schedule as string | undefined;\n status = (fm.status as string) || 'active';\n }\n\n agents.push({\n name: agent.name,\n squad: squadName,\n role,\n model,\n schedule,\n status,\n });\n }\n\n // Extract triggers from routines\n for (const routine of squad.routines) {\n if (routine.enabled === false) continue;\n\n for (const agent of routine.agents) {\n triggers.push({\n name: `${squadName}-${routine.name}-${agent}`,\n squad: squadName,\n agent,\n condition: routine.schedule, // cron expression\n cooldown: routine.cooldown || '1 hour',\n priority: routine.priority || 50,\n context: {\n routine: routine.name,\n model: routine.model || squad.effort || 'sonnet',\n },\n });\n }\n }\n\n squads.push({\n name: squadName,\n agentCount: agents.length,\n agents,\n routineCount: squad.routines.length,\n });\n }\n\n return {\n squads,\n triggers,\n deployedAt: new Date().toISOString(),\n gitSha,\n };\n}\n\nasync function pushToplatform(manifest: DeployManifest, token: string): Promise<DeployResult> {\n if (manifest.triggers.length === 0) {\n return { triggersCreated: 0, triggersSynced: [], errors: [] };\n }\n\n const response = await fetch(`${PLATFORM_API_URL}/triggers/sync`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${token}`,\n },\n body: JSON.stringify(manifest.triggers),\n signal: AbortSignal.timeout(10000),\n });\n\n if (!response.ok) {\n const text = await response.text();\n throw new Error(`Platform sync failed (${response.status}): ${text}`);\n }\n\n const result = await response.json() as {\n synced: number;\n triggers: string[];\n errors: Array<{ name: string; error: string }>;\n };\n\n return {\n triggersCreated: result.synced,\n triggersSynced: result.triggers,\n errors: result.errors,\n };\n}\n\n// ─── Command Registration ────────────────────────────────────────────────────\n\nexport function registerDeployCommand(program: Command): void {\n const deploy = program\n .command('deploy')\n .description('Deploy agents to the Squads platform')\n .option('-n, --dry-run', 'Show what would be deployed without pushing')\n .option('-s, --squad <squad>', 'Deploy only a specific squad')\n .option('-v, --verbose', 'Show detailed agent and trigger info')\n .action((options) => deployCommand({\n dryRun: options.dryRun,\n squad: options.squad,\n verbose: options.verbose,\n }));\n\n deploy\n .command('status')\n .description('Show current platform deployment status')\n .action(() => deployStatusCommand());\n\n deploy\n .command('pull')\n .description('Pull execution data and learnings from platform')\n .option('-v, --verbose', 'Show detailed execution info')\n .action((options) => deployPullCommand({ verbose: options.verbose }));\n}\n","/**\n * squads eval — Agent readiness scorer.\n *\n * Evaluates an agent's readiness for autonomous or platform deployment\n * by checking definition quality, execution history, memory usage,\n * output consistency, and resource safety.\n *\n * Readiness levels:\n * - Untested: No local runs → cannot deploy\n * - Development: 1+ runs → local autonomous (L2) with supervision\n * - Staging: 5+ runs, >80% success → cloud with approval gates\n * - Production: 10+ runs, >95% success, memory working → cloud autonomous\n */\n\nimport { Command } from 'commander';\nimport chalk from 'chalk';\nimport { writeLine } from '../lib/terminal.js';\nimport { existsSync, readFileSync, readdirSync, statSync } from 'fs';\nimport { join } from 'path';\nimport matter from 'gray-matter';\nimport {\n findSquadsDir,\n loadSquad,\n listAgents,\n} from '../lib/squad-parser.js';\nimport { findMemoryDir } from '../lib/memory.js';\nimport { track } from '../lib/telemetry.js';\n\n// ─── Types ───────────────────────────────────────────────────────────────────\n\ninterface EvalDimension {\n name: string;\n score: number; // 0-10\n maxScore: number;\n status: 'pass' | 'warn' | 'fail';\n details: string;\n}\n\ninterface EvalResult {\n agent: string;\n squad: string;\n overallScore: number; // 0-100\n readinessLevel: 'untested' | 'development' | 'staging' | 'production';\n dimensions: EvalDimension[];\n recommendations: string[];\n}\n\n// Required frontmatter fields for a well-defined agent\nconst REQUIRED_FIELDS = ['name', 'role', 'model'];\nconst RECOMMENDED_FIELDS = ['squad', 'trigger', 'schedule', 'status', 'timeout'];\n\n// Patterns that indicate destructive actions\nconst DESTRUCTIVE_PATTERNS = [\n /force.push/i,\n /--force/,\n /git\\s+reset\\s+--hard/i,\n /rm\\s+-rf/,\n /DROP\\s+TABLE/i,\n /DELETE\\s+FROM/i,\n /--dangerously/,\n];\n\n// ─── Scoring Functions ───────────────────────────────────────────────────────\n\nfunction scoreDefinitionQuality(agentPath: string): EvalDimension {\n const content = readFileSync(agentPath, 'utf-8');\n\n let score = 0;\n const maxScore = 10;\n const issues: string[] = [];\n\n // Parse frontmatter\n let frontmatter: Record<string, unknown> = {};\n try {\n const parsed = matter(content);\n frontmatter = parsed.data || {};\n } catch {\n return {\n name: 'Definition quality',\n score: 0,\n maxScore,\n status: 'fail',\n details: 'Failed to parse frontmatter',\n };\n }\n\n // Check required fields (3 points)\n let requiredPresent = 0;\n for (const field of REQUIRED_FIELDS) {\n if (frontmatter[field]) {\n requiredPresent++;\n } else {\n issues.push(`Missing required field: ${field}`);\n }\n }\n score += Math.round((requiredPresent / REQUIRED_FIELDS.length) * 3);\n\n // Check recommended fields (2 points)\n let recommendedPresent = 0;\n for (const field of RECOMMENDED_FIELDS) {\n if (frontmatter[field]) recommendedPresent++;\n }\n score += Math.round((recommendedPresent / RECOMMENDED_FIELDS.length) * 2);\n\n // Check instruction length (2 points)\n const bodyLength = content.split('---').slice(2).join('---').trim().length;\n if (bodyLength > 500) {\n score += 2;\n } else if (bodyLength > 200) {\n score += 1;\n issues.push('Instructions could be more detailed');\n } else {\n issues.push('Instructions are very short (<200 chars)');\n }\n\n // Check for role/mission description (1 point)\n if (content.match(/##\\s*(Role|Mission|Purpose|Responsibilities)/i)) {\n score += 1;\n } else {\n issues.push('No Role/Mission section found');\n }\n\n // Check for output format (1 point)\n if (content.match(/##\\s*(Output|Format|Report|Deliverable)/i)) {\n score += 1;\n } else {\n issues.push('No Output format section');\n }\n\n // Check for constraints/rules (1 point)\n if (content.match(/##\\s*(Constraints|Rules|Never|Always|Guidelines)/i)) {\n score += 1;\n }\n\n const status = score >= 8 ? 'pass' : score >= 5 ? 'warn' : 'fail';\n const details = issues.length > 0 ? issues.join('; ') : 'Well-defined agent';\n\n return { name: 'Definition quality', score, maxScore, status, details };\n}\n\nfunction scoreExecutionReliability(memoryDir: string, squad: string, agent: string): EvalDimension {\n const maxScore = 10;\n const agentMemoryDir = join(memoryDir, squad, agent);\n\n if (!existsSync(agentMemoryDir)) {\n return {\n name: 'Execution reliability',\n score: 0,\n maxScore,\n status: 'fail',\n details: 'No execution history found',\n };\n }\n\n // Check for state.md (indicates the agent has run and persisted state)\n const stateFile = join(agentMemoryDir, 'state.md');\n const outputFile = join(agentMemoryDir, 'output.md');\n\n let runsDetected = 0;\n let hasRecentActivity = false;\n\n // Count evidence of runs from state.md modifications\n if (existsSync(stateFile)) {\n const stat = statSync(stateFile);\n const fileContent = readFileSync(stateFile, 'utf-8');\n\n // Skip template state files that haven't been modified by an actual run\n const isTemplateState = fileContent.includes('awaiting first execution') || fileContent.includes('None yet.');\n if (!isTemplateState) {\n runsDetected += fileContent.length > 50 ? 1 : 0;\n\n // Check if modified in last 7 days\n const sevenDaysAgo = Date.now() - 7 * 24 * 60 * 60 * 1000;\n if (stat.mtimeMs > sevenDaysAgo) {\n hasRecentActivity = true;\n runsDetected += 2;\n }\n }\n }\n\n if (existsSync(outputFile)) {\n const stat = statSync(outputFile);\n const fileContent = readFileSync(outputFile, 'utf-8');\n runsDetected += fileContent.length > 100 ? 2 : 1;\n\n const sevenDaysAgo = Date.now() - 7 * 24 * 60 * 60 * 1000;\n if (stat.mtimeMs > sevenDaysAgo) {\n hasRecentActivity = true;\n }\n }\n\n // Check for execution log files\n const logDir = join(memoryDir, '..', 'logs', squad);\n if (existsSync(logDir)) {\n try {\n const logFiles = readdirSync(logDir).filter(f => f.startsWith(agent));\n runsDetected += logFiles.length;\n } catch { /* ignore */ }\n }\n\n // Score based on evidence\n let score = 0;\n if (runsDetected >= 10) score = 10;\n else if (runsDetected >= 5) score = 8;\n else if (runsDetected >= 3) score = 6;\n else if (runsDetected >= 1) score = 4;\n else score = 0;\n\n // Bonus for recent activity\n if (hasRecentActivity && score < 10) score = Math.min(score + 1, 10);\n\n const status = score >= 8 ? 'pass' : score >= 4 ? 'warn' : 'fail';\n const details = runsDetected === 0\n ? 'No runs detected'\n : `~${runsDetected} run(s) detected${hasRecentActivity ? ', active in last 7 days' : ''}`;\n\n return { name: 'Execution reliability', score, maxScore, status, details };\n}\n\nfunction scoreMemoryUtilization(memoryDir: string, squad: string, agent: string): EvalDimension {\n const maxScore = 10;\n const agentMemoryDir = join(memoryDir, squad, agent);\n\n if (!existsSync(agentMemoryDir)) {\n return {\n name: 'Memory utilization',\n score: 0,\n maxScore,\n status: 'fail',\n details: 'No memory directory',\n };\n }\n\n let score = 0;\n const issues: string[] = [];\n\n // Check state.md exists and has content (3 points)\n const stateFile = join(agentMemoryDir, 'state.md');\n if (existsSync(stateFile)) {\n const content = readFileSync(stateFile, 'utf-8').trim();\n if (content.length > 100) {\n score += 3;\n } else if (content.length > 0) {\n score += 1;\n issues.push('state.md exists but is sparse');\n } else {\n issues.push('state.md is empty');\n }\n } else {\n issues.push('No state.md — agent doesn\\'t persist state');\n }\n\n // Check learnings.md exists and has content (3 points)\n const learningsFile = join(agentMemoryDir, 'learnings.md');\n if (existsSync(learningsFile)) {\n const content = readFileSync(learningsFile, 'utf-8').trim();\n if (content.length > 100) {\n score += 3;\n } else if (content.length > 0) {\n score += 1;\n issues.push('learnings.md exists but is sparse');\n } else {\n issues.push('learnings.md is empty');\n }\n } else {\n issues.push('No learnings.md — agent doesn\\'t learn across runs');\n }\n\n // Check output.md exists and has content (2 points)\n const outputFile = join(agentMemoryDir, 'output.md');\n if (existsSync(outputFile)) {\n const content = readFileSync(outputFile, 'utf-8').trim();\n if (content.length > 50) {\n score += 2;\n } else {\n score += 1;\n issues.push('output.md is sparse');\n }\n } else {\n issues.push('No output.md');\n }\n\n // Check for briefs or additional memory files (2 points)\n try {\n const files = readdirSync(agentMemoryDir);\n const extraFiles = files.filter(f => !['state.md', 'output.md', 'learnings.md'].includes(f));\n if (extraFiles.length > 0) {\n score += 2;\n }\n } catch { /* ignore */ }\n\n const status = score >= 8 ? 'pass' : score >= 4 ? 'warn' : 'fail';\n const details = issues.length > 0 ? issues.join('; ') : 'Memory well-utilized';\n\n return { name: 'Memory utilization', score, maxScore, status, details };\n}\n\nfunction scoreOutputConsistency(memoryDir: string, squad: string, agent: string): EvalDimension {\n const maxScore = 10;\n const outputFile = join(memoryDir, squad, agent, 'output.md');\n\n if (!existsSync(outputFile)) {\n return {\n name: 'Output consistency',\n score: 0,\n maxScore,\n status: 'fail',\n details: 'No output.md found',\n };\n }\n\n const content = readFileSync(outputFile, 'utf-8').trim();\n let score = 0;\n\n // Check if output has structure (headers, lists, etc.)\n const hasHeaders = /^##?\\s/m.test(content);\n const hasLists = /^[-*]\\s/m.test(content);\n const hasStructuredSections = (content.match(/^##\\s/gm) || []).length >= 2;\n\n if (hasHeaders) score += 3;\n if (hasLists) score += 2;\n if (hasStructuredSections) score += 3;\n\n // Check reasonable output length\n if (content.length > 200) score += 2;\n else if (content.length > 50) score += 1;\n\n const status = score >= 8 ? 'pass' : score >= 4 ? 'warn' : 'fail';\n const details = score >= 8\n ? 'Well-structured output'\n : `Output structure: headers=${hasHeaders}, lists=${hasLists}, sections=${hasStructuredSections}`;\n\n return { name: 'Output consistency', score, maxScore, status, details };\n}\n\nfunction scoreResourceSafety(agentPath: string): EvalDimension {\n const maxScore = 10;\n const content = readFileSync(agentPath, 'utf-8');\n\n let score = 10;\n const issues: string[] = [];\n\n for (const pattern of DESTRUCTIVE_PATTERNS) {\n if (pattern.test(content)) {\n score -= 2;\n issues.push(`Mentions destructive pattern: ${pattern.source}`);\n }\n }\n\n // Check if agent has safety constraints\n if (content.match(/##\\s*(Constraints|Safety|Rules|Never)/i)) {\n score = Math.min(score + 1, 10);\n }\n\n score = Math.max(score, 0);\n const status = score >= 8 ? 'pass' : score >= 5 ? 'warn' : 'fail';\n const details = issues.length > 0 ? issues.join('; ') : 'No destructive patterns detected';\n\n return { name: 'Resource safety', score, maxScore, status, details };\n}\n\n// ─── Main Eval ───────────────────────────────────────────────────────────────\n\nfunction evaluateAgent(squad: string, agentName: string, agentPath: string): EvalResult {\n const memoryDir = findMemoryDir();\n const dimensions: EvalDimension[] = [];\n\n // 1. Definition quality\n dimensions.push(scoreDefinitionQuality(agentPath));\n\n // 2. Execution reliability\n if (memoryDir) {\n dimensions.push(scoreExecutionReliability(memoryDir, squad, agentName));\n } else {\n dimensions.push({\n name: 'Execution reliability',\n score: 0,\n maxScore: 10,\n status: 'fail',\n details: 'No memory directory found',\n });\n }\n\n // 3. Output consistency\n if (memoryDir) {\n dimensions.push(scoreOutputConsistency(memoryDir, squad, agentName));\n } else {\n dimensions.push({\n name: 'Output consistency',\n score: 0,\n maxScore: 10,\n status: 'fail',\n details: 'No memory directory found',\n });\n }\n\n // 4. Memory utilization\n if (memoryDir) {\n dimensions.push(scoreMemoryUtilization(memoryDir, squad, agentName));\n } else {\n dimensions.push({\n name: 'Memory utilization',\n score: 0,\n maxScore: 10,\n status: 'fail',\n details: 'No memory directory found',\n });\n }\n\n // 5. Resource safety\n dimensions.push(scoreResourceSafety(agentPath));\n\n // Calculate overall score\n const totalScore = dimensions.reduce((sum, d) => sum + d.score, 0);\n const totalMax = dimensions.reduce((sum, d) => sum + d.maxScore, 0);\n const overallScore = Math.round((totalScore / totalMax) * 100);\n\n // Determine readiness level\n let readinessLevel: EvalResult['readinessLevel'];\n const execDim = dimensions.find(d => d.name === 'Execution reliability');\n const execScore = execDim?.score || 0;\n\n if (execScore === 0) {\n readinessLevel = 'untested';\n } else if (overallScore >= 80 && execScore >= 8) {\n readinessLevel = 'production';\n } else if (overallScore >= 60 && execScore >= 6) {\n readinessLevel = 'staging';\n } else {\n readinessLevel = 'development';\n }\n\n // Generate recommendations\n const recommendations: string[] = [];\n for (const dim of dimensions) {\n if (dim.status === 'fail') {\n recommendations.push(`Fix: ${dim.name} — ${dim.details}`);\n } else if (dim.status === 'warn') {\n recommendations.push(`Improve: ${dim.name} — ${dim.details}`);\n }\n }\n\n return {\n agent: agentName,\n squad,\n overallScore,\n readinessLevel,\n dimensions,\n recommendations,\n };\n}\n\n// ─── Display ─────────────────────────────────────────────────────────────────\n\nfunction renderBar(score: number, max: number): string {\n const filled = Math.round((score / max) * 10);\n const empty = 10 - filled;\n const bar = chalk.green('█'.repeat(filled)) + chalk.dim('░'.repeat(empty));\n return `${bar} ${score}/${max}`;\n}\n\nfunction renderReadinessLevel(level: EvalResult['readinessLevel']): string {\n switch (level) {\n case 'untested': return chalk.red('UNTESTED');\n case 'development': return chalk.yellow('DEVELOPMENT');\n case 'staging': return chalk.blue('STAGING');\n case 'production': return chalk.green('PRODUCTION');\n }\n}\n\nfunction renderResult(result: EvalResult): void {\n writeLine(`\n${chalk.bold(`Agent Readiness: ${result.squad}/${result.agent}`)}\n${chalk.dim('━'.repeat(50))}\n`);\n\n for (const dim of result.dimensions) {\n const icon = dim.status === 'pass' ? chalk.green('✓')\n : dim.status === 'warn' ? chalk.yellow('⚠')\n : chalk.red('✗');\n writeLine(` ${icon} ${dim.name.padEnd(22)} ${renderBar(dim.score, dim.maxScore)}`);\n }\n\n writeLine(`\n Overall readiness: ${chalk.bold(String(result.overallScore) + '%')} — ${renderReadinessLevel(result.readinessLevel)}\n`);\n\n if (result.recommendations.length > 0) {\n writeLine(` ${chalk.bold('Recommendations:')}`);\n for (const rec of result.recommendations) {\n writeLine(` ${chalk.dim('→')} ${rec}`);\n }\n writeLine('');\n }\n}\n\n// ─── Commands ────────────────────────────────────────────────────────────────\n\nexport async function evalCommand(target: string, options: {\n json?: boolean;\n verbose?: boolean;\n}): Promise<void> {\n const squadsDir = findSquadsDir();\n if (!squadsDir) {\n console.error(chalk.red('No .agents/squads/ directory found.'));\n writeLine(chalk.dim('Run: squads init'));\n return;\n }\n\n // Parse target: squad/agent or squad\n const parts = target.split('/');\n const squadName = parts[0];\n const agentFilter = parts[1]; // optional\n\n // Validate squad exists\n const squad = loadSquad(squadName);\n if (!squad) {\n console.error(chalk.red(`Squad not found: ${squadName}`));\n return;\n }\n\n // Get agents to evaluate\n const allAgents = listAgents(squadsDir, squadName);\n const agents = agentFilter\n ? allAgents.filter(a => a.name === agentFilter)\n : allAgents;\n\n if (agents.length === 0) {\n console.error(chalk.red(`No agents found${agentFilter ? `: ${agentFilter}` : ''}`));\n return;\n }\n\n const results: EvalResult[] = [];\n\n for (const agent of agents) {\n if (!agent.filePath) continue;\n const result = evaluateAgent(squadName, agent.name, agent.filePath);\n results.push(result);\n }\n\n if (options.json) {\n writeLine(JSON.stringify(results, null, 2));\n return;\n }\n\n // Render results\n for (const result of results) {\n renderResult(result);\n }\n\n // Summary if evaluating multiple agents\n if (results.length > 1) {\n const avgScore = Math.round(results.reduce((sum, r) => sum + r.overallScore, 0) / results.length);\n const levels = results.reduce((acc, r) => {\n acc[r.readinessLevel] = (acc[r.readinessLevel] || 0) + 1;\n return acc;\n }, {} as Record<string, number>);\n\n writeLine(chalk.bold('Squad Summary'));\n writeLine(chalk.dim('━'.repeat(50)));\n writeLine(` Agents evaluated: ${results.length}`);\n writeLine(` Average score: ${avgScore}%`);\n for (const [level, count] of Object.entries(levels)) {\n writeLine(` ${renderReadinessLevel(level as EvalResult['readinessLevel'])}: ${count}`);\n }\n writeLine('');\n }\n\n await track('cli.eval', {\n squad: squadName,\n agents: results.length,\n avgScore: Math.round(results.reduce((sum, r) => sum + r.overallScore, 0) / results.length),\n });\n}\n\n// ─── Command Registration ────────────────────────────────────────────────────\n\nexport function registerEvalCommand(program: Command): void {\n program\n .command('eval <target>')\n .description('Evaluate agent readiness for deployment (e.g., squads eval company/coo)')\n .option('-j, --json', 'Output as JSON')\n .option('-v, --verbose', 'Show detailed scoring info')\n .action((target, options) => evalCommand(target, {\n json: options.json,\n verbose: options.verbose,\n }));\n}\n","/**\n * squads cognition — business cognition engine.\n *\n * Subcommands:\n * squads cognition brief — executive summary\n * squads cognition beliefs — world model\n * squads cognition decisions — decision log with scores\n * squads cognition reflect — trigger and display a reflection\n */\n\nimport { Command } from 'commander';\nimport {\n colors,\n bold,\n RESET,\n writeLine,\n} from '../lib/terminal.js';\n\ninterface Belief {\n belief_key: string;\n domain: string;\n statement: string;\n confidence: number;\n temperature: string;\n revision: number;\n}\n\ninterface CognitionSignal {\n source: string;\n}\n\ninterface CognitionDecision {\n id: number;\n title: string;\n}\n\ninterface CognitionReflectionSummary {\n created_at: string;\n assessment: string;\n}\n\ninterface CognitionBrief {\n generated_at: string;\n hot_beliefs?: Belief[];\n recent_signals?: CognitionSignal[];\n pending_decisions?: CognitionDecision[];\n latest_reflection?: CognitionReflectionSummary;\n}\n\ninterface Decision {\n id: number;\n title: string;\n reasoning: string;\n outcome_score: number | null;\n decided_at: string;\n decided_by: string;\n}\n\ninterface Insight {\n type: string;\n message: string;\n}\n\ninterface PriorityAdjustment {\n description?: string;\n}\n\ninterface Reflection {\n created_at: string;\n assessment: string;\n insights?: Insight[];\n priority_adjustments?: (string | PriorityAdjustment)[];\n}\n\nasync function apiFetch<T = unknown>(path: string, options?: RequestInit): Promise<T | null> {\n const { loadSession } = await import('../lib/auth.js');\n const { getApiUrl } = await import('../lib/env-config.js');\n const session = loadSession();\n if (!session?.accessToken || session.status !== 'active') {\n writeLine(` ${colors.red}Not logged in.${RESET} Run ${colors.cyan}squads login${RESET} first.`);\n return null;\n }\n const apiUrl = getApiUrl();\n try {\n const res = await fetch(`${apiUrl}${path}`, {\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${session.accessToken}`,\n ...(options?.headers || {}),\n },\n signal: AbortSignal.timeout(10000),\n });\n if (!res.ok) {\n writeLine(` ${colors.red}API error:${RESET} ${res.status} ${res.statusText}`);\n return null;\n }\n return (await res.json()) as T;\n } catch (error) {\n const msg = error instanceof Error && error.name === 'TimeoutError'\n ? 'Request timed out.'\n : 'API unavailable.';\n writeLine(` ${colors.yellow}${msg}${RESET}`);\n return null;\n }\n}\n\nasync function briefCommand(): Promise<void> {\n const data = await apiFetch<CognitionBrief>('/cognition/brief');\n if (!data) return;\n\n writeLine();\n writeLine(` ${bold}Executive Brief${RESET} ${colors.dim}${data.generated_at}${RESET}`);\n writeLine();\n\n // Hot beliefs\n if (data.hot_beliefs && data.hot_beliefs.length > 0) {\n writeLine(` ${colors.red}Hot Beliefs${RESET}`);\n for (const b of data.hot_beliefs) {\n const conf = Math.round(b.confidence * 100);\n const color = conf >= 70 ? colors.green : conf >= 40 ? colors.yellow : colors.red;\n writeLine(` ${color}${conf}%${RESET} ${bold}${b.belief_key}${RESET} ${b.statement}`);\n }\n writeLine();\n }\n\n // Recent signals\n if (data.recent_signals && data.recent_signals.length > 0) {\n writeLine(` ${colors.cyan}Signals (24h)${RESET} ${colors.dim}${data.recent_signals.length} total${RESET}`);\n const bySource: Record<string, number> = {};\n for (const s of data.recent_signals) {\n bySource[s.source] = (bySource[s.source] || 0) + 1;\n }\n for (const [source, count] of Object.entries(bySource)) {\n writeLine(` ${colors.dim}${source}:${RESET} ${count}`);\n }\n writeLine();\n }\n\n // Pending decisions\n if (data.pending_decisions && data.pending_decisions.length > 0) {\n writeLine(` ${colors.yellow}Pending Decisions${RESET}`);\n for (const d of data.pending_decisions) {\n writeLine(` ${colors.dim}#${d.id}${RESET} ${d.title}`);\n }\n writeLine();\n }\n\n // Latest reflection\n if (data.latest_reflection) {\n writeLine(` ${colors.purple}Latest Reflection${RESET} ${colors.dim}${data.latest_reflection.created_at}${RESET}`);\n writeLine(` ${data.latest_reflection.assessment}`);\n writeLine();\n }\n\n if (!data.hot_beliefs?.length && !data.recent_signals?.length && !data.pending_decisions?.length && !data.latest_reflection) {\n writeLine(` ${colors.dim}No cognition data yet. Seed beliefs with:${RESET}`);\n writeLine(` ${colors.cyan}$ squads cognition beliefs${RESET}`);\n writeLine();\n }\n}\n\nasync function beliefsCommand(options: { domain?: string; json?: boolean }): Promise<void> {\n const params = new URLSearchParams();\n if (options.domain) params.set('domain', options.domain);\n const path = `/cognition/beliefs${params.toString() ? '?' + params.toString() : ''}`;\n const data = await apiFetch<Belief[]>(path);\n if (!data) return;\n\n if (options.json) {\n writeLine(JSON.stringify(data, null, 2));\n return;\n }\n\n writeLine();\n writeLine(` ${bold}World Model${RESET} ${colors.dim}${data.length} beliefs${RESET}`);\n writeLine();\n\n // Group by domain\n const byDomain: Record<string, Belief[]> = {};\n for (const b of data) {\n const d = b.domain || 'other';\n if (!byDomain[d]) byDomain[d] = [];\n byDomain[d].push(b);\n }\n\n for (const [domain, beliefs] of Object.entries(byDomain)) {\n writeLine(` ${colors.cyan}${domain}${RESET}`);\n for (const b of beliefs) {\n const conf = Math.round(b.confidence * 100);\n const tempIcon = b.temperature === 'hot' ? `${colors.red}*${RESET}` : b.temperature === 'cold' ? `${colors.dim}~${RESET}` : ' ';\n const confColor = conf >= 70 ? colors.green : conf >= 40 ? colors.yellow : colors.red;\n writeLine(` ${tempIcon} ${confColor}${conf}%${RESET} ${bold}${b.belief_key}${RESET} ${colors.dim}r${b.revision}${RESET}`);\n writeLine(` ${b.statement}`);\n }\n writeLine();\n }\n}\n\nasync function decisionsCommand(options: { evaluated?: boolean; json?: boolean }): Promise<void> {\n const params = new URLSearchParams();\n if (options.evaluated !== undefined) params.set('evaluated', String(options.evaluated));\n const path = `/cognition/decisions${params.toString() ? '?' + params.toString() : ''}`;\n const data = await apiFetch<Decision[]>(path);\n if (!data) return;\n\n if (options.json) {\n writeLine(JSON.stringify(data, null, 2));\n return;\n }\n\n writeLine();\n writeLine(` ${bold}Decision Journal${RESET} ${colors.dim}${data.length} decisions${RESET}`);\n writeLine();\n\n for (const d of data) {\n const score = d.outcome_score !== null && d.outcome_score !== undefined\n ? `${d.outcome_score > 0 ? colors.green : d.outcome_score < 0 ? colors.red : colors.yellow}${d.outcome_score.toFixed(1)}${RESET}`\n : `${colors.dim}pending${RESET}`;\n writeLine(` ${colors.dim}#${d.id}${RESET} ${bold}${d.title}${RESET} score: ${score}`);\n writeLine(` ${colors.dim}${d.reasoning}${RESET}`);\n writeLine(` ${colors.dim}decided: ${d.decided_at} by ${d.decided_by}${RESET}`);\n writeLine();\n }\n}\n\nasync function reflectCommand(options: { scope?: string }): Promise<void> {\n const scope = options.scope || 'business';\n writeLine();\n writeLine(` ${colors.purple}Reflecting...${RESET} scope: ${scope}`);\n\n const data = await apiFetch<Reflection>('/cognition/reflect', {\n method: 'POST',\n body: JSON.stringify({ scope }),\n });\n if (!data) return;\n\n writeLine();\n writeLine(` ${bold}Reflection${RESET} ${colors.dim}${data.created_at}${RESET}`);\n writeLine();\n writeLine(` ${data.assessment}`);\n writeLine();\n\n if (data.insights && data.insights.length > 0) {\n writeLine(` ${colors.cyan}Insights${RESET}`);\n for (const i of data.insights) {\n const icon = i.type === 'warning' ? `${colors.yellow}!${RESET}` : `${colors.cyan}>${RESET}`;\n writeLine(` ${icon} ${i.message}`);\n }\n writeLine();\n }\n\n if (data.priority_adjustments && data.priority_adjustments.length > 0) {\n writeLine(` ${colors.yellow}Priority Adjustments${RESET}`);\n for (const a of data.priority_adjustments) {\n writeLine(` - ${typeof a === 'string' ? a : a.description || JSON.stringify(a)}`);\n }\n writeLine();\n }\n}\n\nexport function registerCognitionCommand(program: Command): void {\n const cmd = program\n .command('cognition')\n .description('Business cognition engine — beliefs, decisions, reflections')\n .addHelpText('after', `\nExamples:\n $ squads cognition brief Executive summary (hot beliefs + signals + decisions)\n $ squads cognition beliefs World model with confidence scores\n $ squads cognition decisions Decision journal with outcome scores\n $ squads cognition reflect Trigger meta-cognition analysis\n`)\n .action(() => {\n cmd.outputHelp();\n });\n\n cmd\n .command('brief')\n .description('Executive summary: hot beliefs + recent signals + pending decisions')\n .action(async () => briefCommand());\n\n cmd\n .command('beliefs')\n .description('Display world model beliefs')\n .option('-d, --domain <domain>', 'Filter by domain (revenue/product/operations/market/team)')\n .option('-j, --json', 'Output as JSON')\n .action(async (options) => beliefsCommand(options));\n\n cmd\n .command('decisions')\n .description('Decision journal with outcome scores')\n .option('-e, --evaluated', 'Only show evaluated decisions')\n .option('-j, --json', 'Output as JSON')\n .action(async (options) => decisionsCommand(options));\n\n cmd\n .command('reflect')\n .description('Trigger meta-cognition reflection')\n .option('-s, --scope <scope>', 'Reflection scope (business, squad:X, agent:X)', 'business')\n .action(async (options) => reflectCommand(options));\n}\n"],"mappings":"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","names":["existsSync","join","homedir","chalk","config","existsSync","readFileSync","readdirSync","join","existsSync","readFileSync","join","config","join","existsSync","readFileSync","colors","join","existsSync","readFileSync","readdirSync","program","program","chalk","existsSync","readFileSync","writeFileSync","unlinkSync","readdirSync","mkdirSync","join","homedir","spawn","join","homedir","existsSync","readFileSync","readdirSync","unlinkSync","mkdirSync","writeFileSync","running","chalk","spawn","showStatus","program","chalk","API_URL","chalk","program","chalk","existsSync","readFileSync","execSync","session","chalk","exec","execSync","existsSync","readFileSync","program","chalk","existsSync","readFileSync","readdirSync","join","matter","readFileSync","matter","join","existsSync","readdirSync","chalk","program","loadSession","getApiUrl","session","program","chalk","join","homedir","existsSync","colors","RESET","progress","kpi","readFileSync"]}
|