squads-cli 0.6.1 → 0.7.0

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.
Files changed (112) hide show
  1. package/README.md +196 -1152
  2. package/dist/auth-YW3UPFSB.js +23 -0
  3. package/dist/autonomy-BWTVDEAT.js +102 -0
  4. package/dist/autonomy-BWTVDEAT.js.map +1 -0
  5. package/dist/chunk-3KCWNZWW.js +401 -0
  6. package/dist/chunk-3KCWNZWW.js.map +1 -0
  7. package/dist/chunk-67RO2HKR.js +174 -0
  8. package/dist/chunk-67RO2HKR.js.map +1 -0
  9. package/dist/chunk-7JVD7RD4.js +275 -0
  10. package/dist/chunk-7JVD7RD4.js.map +1 -0
  11. package/dist/chunk-BODLDQY7.js +452 -0
  12. package/dist/chunk-BODLDQY7.js.map +1 -0
  13. package/dist/chunk-FFFCFZ6A.js +121 -0
  14. package/dist/chunk-FFFCFZ6A.js.map +1 -0
  15. package/dist/chunk-FIWT2NMM.js +165 -0
  16. package/dist/chunk-FIWT2NMM.js.map +1 -0
  17. package/dist/chunk-L6GQCHDF.js +222 -0
  18. package/dist/chunk-L6GQCHDF.js.map +1 -0
  19. package/dist/{chunk-O7UV3FWI.js → chunk-LDM62TIX.js} +2 -2
  20. package/dist/chunk-LDM62TIX.js.map +1 -0
  21. package/dist/chunk-LOA3KWYJ.js +294 -0
  22. package/dist/chunk-LOA3KWYJ.js.map +1 -0
  23. package/dist/chunk-NA45DFXY.js +616 -0
  24. package/dist/chunk-NA45DFXY.js.map +1 -0
  25. package/dist/{chunk-4CMAEQQY.js → chunk-NQN6JPI7.js} +4 -3
  26. package/dist/chunk-NQN6JPI7.js.map +1 -0
  27. package/dist/chunk-OQJHPULO.js +103 -0
  28. package/dist/chunk-OQJHPULO.js.map +1 -0
  29. package/dist/chunk-QHNUMM4V.js +87 -0
  30. package/dist/chunk-QHNUMM4V.js.map +1 -0
  31. package/dist/chunk-RM6BWILN.js +74 -0
  32. package/dist/chunk-RM6BWILN.js.map +1 -0
  33. package/dist/chunk-WBR5J7EX.js +90 -0
  34. package/dist/chunk-WBR5J7EX.js.map +1 -0
  35. package/dist/chunk-Z2UKDBNL.js +162 -0
  36. package/dist/chunk-Z2UKDBNL.js.map +1 -0
  37. package/dist/cli.js +2151 -12594
  38. package/dist/cli.js.map +1 -1
  39. package/dist/context-M2A2DOFV.js +291 -0
  40. package/dist/context-M2A2DOFV.js.map +1 -0
  41. package/dist/context-feed-JMNW4GAM.js +391 -0
  42. package/dist/context-feed-JMNW4GAM.js.map +1 -0
  43. package/dist/cost-N37I4UTA.js +274 -0
  44. package/dist/cost-N37I4UTA.js.map +1 -0
  45. package/dist/create-554W5HNU.js +286 -0
  46. package/dist/create-554W5HNU.js.map +1 -0
  47. package/dist/daemon-XWPQPPPN.js +546 -0
  48. package/dist/daemon-XWPQPPPN.js.map +1 -0
  49. package/dist/dashboard-L7YKVQEB.js +945 -0
  50. package/dist/dashboard-L7YKVQEB.js.map +1 -0
  51. package/dist/dashboard-MFNRLCEE.js +794 -0
  52. package/dist/dashboard-MFNRLCEE.js.map +1 -0
  53. package/dist/doctor-RG75M5RO.js +346 -0
  54. package/dist/doctor-RG75M5RO.js.map +1 -0
  55. package/dist/env-config-KCLDBKYX.js +21 -0
  56. package/dist/exec-JQKBF7BL.js +197 -0
  57. package/dist/exec-JQKBF7BL.js.map +1 -0
  58. package/dist/feedback-KA2UYBZG.js +229 -0
  59. package/dist/feedback-KA2UYBZG.js.map +1 -0
  60. package/dist/github-UQTM5KMS.js +23 -0
  61. package/dist/goal-EOPC5ZCD.js +168 -0
  62. package/dist/goal-EOPC5ZCD.js.map +1 -0
  63. package/dist/health-3FZDOSR5.js +209 -0
  64. package/dist/health-3FZDOSR5.js.map +1 -0
  65. package/dist/history-TFVXJEDH.js +229 -0
  66. package/dist/history-TFVXJEDH.js.map +1 -0
  67. package/dist/index.js +1 -1
  68. package/dist/index.js.map +1 -1
  69. package/dist/init-UOWTNMIE.js +747 -0
  70. package/dist/init-UOWTNMIE.js.map +1 -0
  71. package/dist/kpi-2SQ2WCVT.js +413 -0
  72. package/dist/kpi-2SQ2WCVT.js.map +1 -0
  73. package/dist/learn-6ERTERAO.js +269 -0
  74. package/dist/learn-6ERTERAO.js.map +1 -0
  75. package/dist/list-KSOMUBMB.js +92 -0
  76. package/dist/list-KSOMUBMB.js.map +1 -0
  77. package/dist/login-ST6PAXYE.js +155 -0
  78. package/dist/login-ST6PAXYE.js.map +1 -0
  79. package/dist/memory-3CSNKXIL.js +562 -0
  80. package/dist/memory-3CSNKXIL.js.map +1 -0
  81. package/dist/progress-FKG4V2VH.js +202 -0
  82. package/dist/progress-FKG4V2VH.js.map +1 -0
  83. package/dist/providers-66PDCORB.js +65 -0
  84. package/dist/providers-66PDCORB.js.map +1 -0
  85. package/dist/results-2MJFLWEO.js +224 -0
  86. package/dist/results-2MJFLWEO.js.map +1 -0
  87. package/dist/run-72OQLH5A.js +2685 -0
  88. package/dist/run-72OQLH5A.js.map +1 -0
  89. package/dist/session-6H67XPAQ.js +64 -0
  90. package/dist/session-6H67XPAQ.js.map +1 -0
  91. package/dist/{chunk-NHGLXN2F.js → sessions-GVQIMN4W.js} +23 -459
  92. package/dist/sessions-GVQIMN4W.js.map +1 -0
  93. package/dist/{squad-parser-4BI3G4RS.js → squad-parser-CM3HOIWM.js} +2 -2
  94. package/dist/squad-parser-CM3HOIWM.js.map +1 -0
  95. package/dist/stats-ONZI557Q.js +335 -0
  96. package/dist/stats-ONZI557Q.js.map +1 -0
  97. package/dist/status-FYH42FTB.js +346 -0
  98. package/dist/status-FYH42FTB.js.map +1 -0
  99. package/dist/sync-HJZJNXHW.js +800 -0
  100. package/dist/sync-HJZJNXHW.js.map +1 -0
  101. package/dist/update-B4WMUOPO.js +83 -0
  102. package/dist/update-B4WMUOPO.js.map +1 -0
  103. package/dist/{update-ALJKFFM7.js → update-L7FGHN6W.js} +2 -2
  104. package/dist/update-L7FGHN6W.js.map +1 -0
  105. package/package.json +18 -10
  106. package/dist/chunk-4CMAEQQY.js.map +0 -1
  107. package/dist/chunk-NHGLXN2F.js.map +0 -1
  108. package/dist/chunk-O7UV3FWI.js.map +0 -1
  109. package/dist/sessions-6PB7ALCE.js +0 -16
  110. /package/dist/{sessions-6PB7ALCE.js.map → auth-YW3UPFSB.js.map} +0 -0
  111. /package/dist/{squad-parser-4BI3G4RS.js.map → env-config-KCLDBKYX.js.map} +0 -0
  112. /package/dist/{update-ALJKFFM7.js.map → github-UQTM5KMS.js.map} +0 -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/lib/templates.ts","../src/lib/setup-checks.ts","../src/commands/run.ts","../src/lib/permissions.ts","../src/lib/llm-clis.ts","../src/lib/providers.ts","../src/commands/list.ts","../src/commands/status.ts","../src/lib/executions.ts","../src/lib/services.ts","../src/commands/memory.ts","../src/commands/sync.ts","../src/lib/cycle-sync.ts","../src/commands/autonomy.ts","../src/commands/goal.ts","../src/commands/feedback.ts","../src/commands/learn.ts","../src/commands/dashboard.ts","../src/lib/costs.ts","../src/lib/db.ts","../src/lib/dashboard/loader.ts","../src/lib/dashboard/sources/postgres.ts","../src/lib/dashboard/renderers/base.ts","../src/lib/dashboard/renderers/summary.ts","../src/lib/dashboard/renderers/table.ts","../src/lib/dashboard/renderers/trend.ts","../src/lib/dashboard/renderers/bar.ts","../src/lib/dashboard/renderers/list.ts","../src/lib/dashboard/renderers/index.ts","../src/lib/dashboard/engine.ts","../src/commands/login.ts","../src/lib/auth.ts","../src/commands/update.ts","../src/commands/progress.ts","../src/commands/results.ts","../src/commands/history.ts","../src/commands/health.ts","../src/commands/context-feed.ts","../src/commands/session.ts","../src/lib/stack-config.ts","../src/commands/trigger.ts","../src/commands/autonomous.ts","../src/lib/cron.ts","../src/commands/approval.ts","../src/commands/deploy.ts","../src/commands/eval.ts","../src/commands/orchestrate.ts","../src/lib/orchestration/lead-orchestrator.ts","../src/commands/context.ts","../src/commands/cost.ts","../src/commands/exec.ts","../src/commands/providers.ts","../src/lib/kpi.ts","../src/commands/kpi.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 { autoUpdateOnStartup } from './lib/update.js';\nimport { colors as termColors, RESET as termReset, bold as termBold } 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}\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 memoryExtractCommand\n} from './commands/memory.js';\nimport { syncCommand } from './commands/sync.js';\nimport { autonomyCommand } from './commands/autonomy.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 {\n learnCommand,\n learnShowCommand,\n learnSearchCommand\n} from './commands/learn.js';\nimport { dashboardCommand } from './commands/dashboard.js';\nimport { renderDashboard, showAvailableDashboards, findDashboard } from './lib/dashboard/index.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 { historyCommand } from './commands/history.js';\nimport { healthCommand } from './commands/health.js';\nimport { contextFeedCommand } from './commands/context-feed.js';\nimport { sessionsCommand, sessionsHistoryCommand, sessionsSummaryCommand, SessionSummaryData } from './commands/sessions.js';\nimport { sessionStartCommand, sessionStopCommand, sessionHeartbeatCommand, detectSquadCommand } from './commands/session.js';\nimport { registerExitHandler } from './lib/telemetry.js';\nimport { applyStackConfig } from './lib/stack-config.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 { registerOrchestrateCommand } from './commands/orchestrate.js';\nimport { contextShowCommand, contextListCommand, contextActivateCommand, contextPromptCommand } from './commands/context.js';\nimport { costCommand, budgetCheckCommand } from './commands/cost.js';\nimport { execListCommand, execShowCommand, execStatsCommand } from './commands/exec.js';\nimport { providersCommand } from './commands/providers.js';\nimport {\n kpiShowCommand,\n kpiRecordCommand,\n kpiTrendCommand,\n kpiInsightsCommand,\n kpiListCommand,\n} from './commands/kpi.js';\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\nawait autoUpdateOnStartup();\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 '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 const { gradient, colors, RESET } = await import('./lib/terminal.js');\n const { checkForUpdate } = await import('./lib/update.js');\n\n console.log();\n console.log(` ${gradient('squads')} ${colors.dim}v${version}${RESET}`);\n console.log();\n\n // Check for updates\n const updateInfo = checkForUpdate();\n if (updateInfo.updateAvailable) {\n console.log(` ${colors.cyan}⬆${RESET} Update available: ${colors.dim}${updateInfo.currentVersion}${RESET} → ${colors.green}${updateInfo.latestVersion}${RESET}`);\n console.log(` ${colors.dim}Run \\`squads update\\` to install${RESET}`);\n console.log();\n }\n\n // Run status command to show all squads (includes quick commands)\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('--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(initCommand);\n\n// Run command - execute 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('-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('--no-verify', 'Skip post-execution verification (Ralph loop)')\n .option('-j, --json', 'Output as JSON')\n .addHelpText('after', `\nExamples:\n $ squads run engineering Run whole squad (shows agent list)\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`)\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 .option('-v, --verbose', 'Show additional details')\n .option('-j, --json', 'Output as JSON')\n .action(listCommand);\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\nenv\n .command('show <squad>')\n .description('Show execution environment for a squad')\n .option('--json', 'Output as JSON')\n .action(contextShowCommand);\n\nenv\n .command('list')\n .description('List execution environment for all squads')\n .option('--json', 'Output as JSON')\n .action(contextListCommand);\n\nenv\n .command('activate <squad>')\n .description('Activate execution context for a squad (generates scoped MCP config)')\n .option('-d, --dry-run', 'Show what would be generated without writing files')\n .option('-f, --force', 'Force regeneration even if config exists')\n .option('--json', 'Output as JSON')\n .action(contextActivateCommand);\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(contextPromptCommand);\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((options) => execListCommand({ ...options, limit: parseInt(options.limit, 10) }));\n\nexec\n .command('show <id>')\n .description('Show execution details')\n .option('--json', 'Output as JSON')\n .action(execShowCommand);\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(execStatsCommand);\n\n// Default action: show list\nexec.action((options) => execListCommand(options));\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 // 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 console.log(` Dashboard \"${name}\" not found. Showing default dashboard.\\n`);\n }\n\n // Default: show the comprehensive dashboard\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(statusCommand);\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((options) => contextFeedCommand(options));\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(costCommand);\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(budgetCheckCommand);\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((options) => healthCommand(options));\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((options) => historyCommand(options));\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// ─── 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(goalSetCommand);\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(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// 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\nkpi\n .command('list')\n .description('List all KPIs across squads')\n .option('-j, --json', 'Output as JSON')\n .action(kpiListCommand);\n\nkpi\n .command('show <squad>')\n .description('Show KPI status for a squad')\n .option('-j, --json', 'Output as JSON')\n .action(kpiShowCommand);\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(kpiRecordCommand);\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(kpiTrendCommand);\n\nkpi\n .command('insights [squad]')\n .description('Generate insights from KPI data')\n .option('-j, --json', 'Output as JSON')\n .action(kpiInsightsCommand);\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// 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// 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((options) => autonomyCommand({ squad: options.squad, period: options.period, json: options.json }));\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(memoryQueryCommand);\n\n// read (new name) + show (alias)\nmemory\n .command('read <squad>')\n .alias('show')\n .description('Show memory for a squad')\n .action(memoryShowCommand);\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(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 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((options) => syncCommand({ verbose: options.verbose, push: options.push, pull: options.pull, postgres: options.postgres, dimensions: options.dimensions, learnings: options.learnings, autoLearn: options.autoLearn }));\n\n// search (new name) — also keep old 'search' subcommand\nmemory\n .command('search <query>')\n .description('Search conversations stored via squads-bridge (requires bridge service)')\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\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((opts) => memoryExtractCommand({\n session: opts.session,\n hours: parseInt(opts.hours, 10),\n dryRun: opts.dryRun\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(learnCommand);\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(learnShowCommand);\n\nlearn\n .command('search <query>')\n .description('Search learnings across all squads')\n .option('-n, --limit <n>', 'Max results', '10')\n .action(learnSearchCommand);\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((options) => syncCommand({ verbose: options.verbose, push: options.push, pull: options.pull, postgres: options.postgres }));\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(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\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 } = 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\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// 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// Eval command - agent readiness scoring\nregisterEvalCommand(program);\n\n// Deploy command group - push agents to platform\nregisterDeployCommand(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((options) => providersCommand(options));\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// Version command (following npm/docker pattern)\nprogram\n .command('version')\n .description('Show version information')\n .action(() => {\n console.log(`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 separately. Use: docker compose up -d'));\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 infrastructure.'));\n console.error(chalk.dim('If you need scheduling or telemetry:'));\n console.error(chalk.dim(' 1. Check infrastructure: squads health'));\n console.error(chalk.dim(' 2. Start containers: docker compose up -d'));\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","import { createRequire } from 'module';\nconst require = createRequire(import.meta.url);\nconst pkg = require('../package.json');\nexport const version: string = pkg.version;\n","/**\n * squads init - Plant the seed\n *\n * Creates:\n * - Use-case specific squads (Engineering, Marketing, Operations, or all)\n * - CLI skill (teaches agents how to use squads CLI)\n * - Core squads (company + research + intelligence) for all use cases\n * - CLAUDE.md (operating manual for all Claude instances)\n * - BUSINESS_BRIEF.md (from user input)\n * - Memory directories (persistent state)\n * - Claude Code hooks (session tracking)\n */\n\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport fs from 'fs/promises';\nimport path from 'path';\nimport { createInterface } from 'readline';\nimport { checkGitStatus, getRepoName } from '../lib/git.js';\nimport { track, Events } from '../lib/telemetry.js';\nimport {\n loadTemplate,\n type TemplateVariables,\n} from '../lib/templates.js';\nimport {\n PROVIDERS,\n checkGhCli,\n runAuthChecks,\n displayCheckResults,\n} from '../lib/setup-checks.js';\n\nexport interface InitOptions {\n provider?: string;\n skipInfra?: boolean;\n force?: boolean;\n yes?: boolean;\n quick?: boolean;\n}\n\ntype Provider = 'claude' | 'gemini' | 'openai' | 'ollama' | 'cursor' | 'aider' | 'none';\n\ntype UseCase = 'engineering' | 'marketing' | 'operations' | 'full-company' | 'custom';\n\n/**\n * Use-case configuration: squads, files, memory dirs, and display info\n */\ninterface UseCaseConfig {\n label: string;\n description: string;\n squads: SquadConfig[];\n}\n\ninterface SquadConfig {\n name: string;\n agentCount: number;\n agentSummary: string;\n dirs: string[];\n files: [string, string][]; // [destPath, templatePath]\n memoryFiles: [string, string][]; // [destPath, templatePath]\n}\n\n/**\n * Define what each use case creates\n */\nfunction getUseCaseConfig(useCase: UseCase): UseCaseConfig {\n const configs: Record<UseCase, UseCaseConfig> = {\n engineering: {\n label: 'Engineering',\n description: 'Ships code',\n squads: [getEngineeringSquad()],\n },\n marketing: {\n label: 'Marketing',\n description: 'Grows audience',\n squads: [getMarketingSquad()],\n },\n operations: {\n label: 'Operations',\n description: 'Runs the business',\n squads: [getOperationsSquad()],\n },\n 'full-company': {\n label: 'Full Company',\n description: 'Engineering + Marketing + Operations',\n squads: [getEngineeringSquad(), getMarketingSquad(), getOperationsSquad()],\n },\n custom: {\n label: 'Custom',\n description: 'Empty scaffold — you build from scratch',\n squads: [],\n },\n };\n\n return configs[useCase];\n}\n\nfunction getEngineeringSquad(): SquadConfig {\n return {\n name: 'engineering',\n agentCount: 3,\n agentSummary: 'issue-solver, code-reviewer, test-writer',\n dirs: [\n '.agents/squads/engineering',\n '.agents/memory/engineering/issue-solver',\n '.agents/memory/engineering/code-reviewer',\n '.agents/memory/engineering/test-writer',\n ],\n files: [\n ['.agents/squads/engineering/SQUAD.md', 'squads/engineering/SQUAD.md'],\n ['.agents/squads/engineering/issue-solver.md', 'squads/engineering/issue-solver.md'],\n ['.agents/squads/engineering/code-reviewer.md', 'squads/engineering/code-reviewer.md'],\n ['.agents/squads/engineering/test-writer.md', 'squads/engineering/test-writer.md'],\n ],\n memoryFiles: [\n ['.agents/memory/engineering/issue-solver/state.md', 'memory/engineering/issue-solver/state.md'],\n ],\n };\n}\n\nfunction getMarketingSquad(): SquadConfig {\n return {\n name: 'marketing',\n agentCount: 3,\n agentSummary: 'content-drafter, social-poster, growth-analyst',\n dirs: [\n '.agents/squads/marketing',\n '.agents/memory/marketing/content-drafter',\n '.agents/memory/marketing/social-poster',\n '.agents/memory/marketing/growth-analyst',\n ],\n files: [\n ['.agents/squads/marketing/SQUAD.md', 'squads/marketing/SQUAD.md'],\n ['.agents/squads/marketing/content-drafter.md', 'squads/marketing/content-drafter.md'],\n ['.agents/squads/marketing/social-poster.md', 'squads/marketing/social-poster.md'],\n ['.agents/squads/marketing/growth-analyst.md', 'squads/marketing/growth-analyst.md'],\n ],\n memoryFiles: [\n ['.agents/memory/marketing/content-drafter/state.md', 'memory/marketing/content-drafter/state.md'],\n ],\n };\n}\n\nfunction getOperationsSquad(): SquadConfig {\n return {\n name: 'operations',\n agentCount: 3,\n agentSummary: 'ops-lead, finance-tracker, goal-tracker',\n dirs: [\n '.agents/squads/operations',\n '.agents/memory/operations/ops-lead',\n '.agents/memory/operations/finance-tracker',\n '.agents/memory/operations/goal-tracker',\n ],\n files: [\n ['.agents/squads/operations/SQUAD.md', 'squads/operations/SQUAD.md'],\n ['.agents/squads/operations/ops-lead.md', 'squads/operations/ops-lead.md'],\n ['.agents/squads/operations/finance-tracker.md', 'squads/operations/finance-tracker.md'],\n ['.agents/squads/operations/goal-tracker.md', 'squads/operations/goal-tracker.md'],\n ],\n memoryFiles: [\n ['.agents/memory/operations/ops-lead/state.md', 'memory/operations/ops-lead/state.md'],\n ],\n };\n}\n\nfunction isInteractive(): boolean {\n return process.stdin.isTTY === true && process.stdout.isTTY === true;\n}\n\nasync function prompt(question: string, defaultValue = ''): Promise<string> {\n if (!isInteractive()) return defaultValue;\n\n const rl = createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n return new Promise((resolve) => {\n const suffix = defaultValue ? chalk.dim(` (${defaultValue})`) : '';\n rl.question(` ${question}${suffix} `, (answer) => {\n rl.close();\n resolve(answer.trim() || defaultValue);\n });\n });\n}\n\nasync function promptProvider(forceProvider?: string): Promise<Provider> {\n if (forceProvider && forceProvider in PROVIDERS) {\n return forceProvider as Provider;\n }\n if (!isInteractive()) return 'claude';\n\n console.log();\n console.log(chalk.bold(' Select your AI assistant:'));\n console.log();\n console.log(` ${chalk.cyan('1)')} Claude Code ${chalk.dim('(recommended)')}`);\n console.log(` ${chalk.cyan('2)')} Gemini`);\n console.log(` ${chalk.cyan('3)')} OpenAI GPT`);\n console.log(` ${chalk.cyan('4)')} Ollama ${chalk.dim('(local)')}`);\n console.log(` ${chalk.cyan('5)')} Other/None`);\n console.log();\n\n const rl = createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n return new Promise((resolve) => {\n rl.question(` ${chalk.dim('Enter choice [1-5]:')} `, (answer) => {\n rl.close();\n const choice = answer.trim() || '1';\n switch (choice) {\n case '1': resolve('claude'); break;\n case '2': resolve('gemini'); break;\n case '3': resolve('openai'); break;\n case '4': resolve('ollama'); break;\n case '5': resolve('none'); break;\n default: resolve('claude'); break;\n }\n });\n });\n}\n\nasync function promptUseCase(): Promise<UseCase> {\n if (!isInteractive()) return 'full-company';\n\n console.log();\n console.log(chalk.bold(' What does your AI workforce need to do?'));\n console.log();\n console.log(` ${chalk.cyan('1)')} Engineering ${chalk.dim('— ships code (issue-solver, code-reviewer, test-writer)')}`);\n console.log(` ${chalk.cyan('2)')} Marketing ${chalk.dim('— grows audience (content-drafter, social-poster, growth-analyst)')}`);\n console.log(` ${chalk.cyan('3)')} Operations ${chalk.dim('— runs the business (ops-lead, finance-tracker, goal-tracker)')}`);\n console.log(` ${chalk.cyan('4)')} Full Company ${chalk.dim('— all of the above')} ${chalk.green('(recommended)')}`);\n console.log(` ${chalk.cyan('5)')} Custom ${chalk.dim('— empty scaffold, you build from scratch')}`);\n console.log();\n\n const rl = createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n return new Promise((resolve) => {\n rl.question(` ${chalk.dim('Enter choice [1-5]:')} `, (answer) => {\n rl.close();\n const choice = answer.trim() || '4';\n switch (choice) {\n case '1': resolve('engineering'); break;\n case '2': resolve('marketing'); break;\n case '3': resolve('operations'); break;\n case '4': resolve('full-company'); break;\n case '5': resolve('custom'); break;\n default: resolve('full-company'); break;\n }\n });\n });\n}\n\nasync function fileExists(filePath: string): Promise<boolean> {\n try {\n await fs.access(filePath);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Load a seed template from templates/seed/\n * Falls back to bundled templates in dist/templates/seed/\n */\nfunction loadSeedTemplate(templatePath: string, variables: TemplateVariables = {}): string {\n // Try loading from seed directory\n return loadTemplate(`seed/${templatePath}`, variables);\n}\n\n/**\n * Write a file only if it doesn't already exist (safe for re-runs)\n */\nasync function writeIfNew(filePath: string, content: string): Promise<boolean> {\n if (await fileExists(filePath)) return false;\n await fs.mkdir(path.dirname(filePath), { recursive: true });\n await fs.writeFile(filePath, content);\n return true;\n}\n\n/**\n * Write a file, creating directories as needed\n */\nasync function writeFile(filePath: string, content: string): Promise<void> {\n await fs.mkdir(path.dirname(filePath), { recursive: true });\n await fs.writeFile(filePath, content);\n}\n\n/**\n * Main init command - plant the seed\n */\nexport async function initCommand(options: InitOptions): Promise<void> {\n const cwd = process.cwd();\n\n // 1. Welcome\n console.log();\n console.log(chalk.bold(' Plant the seed for your AI workforce'));\n console.log(chalk.dim(' https://agents-squads.com/docs/getting-started'));\n console.log();\n\n // 2. Select provider\n const selectedProvider = await promptProvider(options.provider);\n const provider = PROVIDERS[selectedProvider];\n\n // 3. Prerequisite checks\n console.log();\n console.log(chalk.bold(' Checking prerequisites...'));\n console.log();\n\n const checks = [\n ...runAuthChecks(selectedProvider),\n checkGhCli(),\n ];\n\n // Check Git\n const gitStatus = checkGitStatus(cwd);\n if (!gitStatus.isGitRepo) {\n checks.push({\n name: 'Git Repository',\n status: 'missing' as const,\n message: 'Git is the coordination layer',\n hint: 'Run: git init',\n fixCommand: 'git init',\n });\n } else {\n checks.push({ name: 'Git Repository', status: 'ok' as const });\n if (gitStatus.hasRemote) {\n const repoName = getRepoName(gitStatus.remoteUrl);\n checks.push({ name: `Remote: ${repoName || gitStatus.remoteUrl}`, status: 'ok' as const });\n }\n }\n\n const { hasErrors } = displayCheckResults(checks);\n\n if (hasErrors && !options.force) {\n console.log();\n console.log(chalk.red(' Fix the errors above before continuing.'));\n console.log(chalk.dim(' Or run with --force to skip checks.'));\n console.log();\n process.exit(1);\n }\n\n console.log();\n\n // 4. Ask about the business\n let businessName: string;\n let businessDescription: string;\n let businessFocus: string;\n let selectedUseCase: UseCase;\n\n if (options.yes || options.quick || !isInteractive()) {\n businessName = path.basename(cwd);\n businessDescription = 'General business operations';\n businessFocus = 'Our market, competitors, and growth opportunities';\n selectedUseCase = 'full-company';\n } else {\n const dirName = path.basename(cwd);\n\n console.log(chalk.bold(' Tell us about your business:'));\n console.log();\n\n businessName = await prompt(\n 'Company or project name?',\n dirName\n );\n\n businessDescription = await prompt(\n 'What does it do? (one sentence)',\n ''\n );\n\n console.log();\n\n businessFocus = await prompt(\n 'What should your first research squad investigate?',\n 'Our market, competitors, and growth opportunities'\n );\n\n // 4b. Use-case selection\n selectedUseCase = await promptUseCase();\n }\n\n const useCaseConfig = getUseCaseConfig(selectedUseCase);\n\n // Calculate totals (core squads + use-case squads)\n const coreAgentCount = 12; // company(5) + research(4) + intelligence(3)\n const coreSquadCount = 3;\n const useCaseAgentCount = useCaseConfig.squads.reduce((sum, s) => sum + s.agentCount, 0);\n const totalAgentCount = coreAgentCount + useCaseAgentCount;\n const totalSquadCount = coreSquadCount + useCaseConfig.squads.length;\n\n console.log();\n console.log(` ${chalk.green('✓')} Business: ${chalk.cyan(businessName)}${businessDescription ? chalk.dim(` — ${businessDescription}`) : ''}`);\n console.log(` ${chalk.green('✓')} Provider: ${chalk.cyan(provider?.name || selectedProvider)}`);\n console.log(` ${chalk.green('✓')} Research focus: ${chalk.cyan(businessFocus)}`);\n console.log(` ${chalk.green('✓')} Use case: ${chalk.cyan(useCaseConfig.label)} ${chalk.dim(`— ${useCaseConfig.description}`)}`);\n console.log();\n\n // 5. Create the seed\n const spinner = ora('Planting the seed...').start();\n\n try {\n const variables: TemplateVariables = {\n BUSINESS_NAME: businessName,\n BUSINESS_DESCRIPTION: businessDescription || `${businessName} — details to be added by the manager agent.`,\n BUSINESS_FOCUS: businessFocus,\n PROVIDER: selectedProvider,\n PROVIDER_NAME: provider?.name || 'Unknown',\n };\n\n // Core directories (always created)\n const dirs = [\n '.agents/squads/company',\n '.agents/squads/research',\n '.agents/squads/intelligence',\n '.agents/memory/company/manager',\n '.agents/memory/company/event-dispatcher',\n '.agents/memory/company/goal-tracker',\n '.agents/memory/company/company-eval',\n '.agents/memory/company/company-critic',\n '.agents/memory/research/researcher',\n '.agents/memory/research/analyst',\n '.agents/memory/research/research-eval',\n '.agents/memory/research/research-critic',\n '.agents/memory/intelligence/intel-lead',\n '.agents/memory/intelligence/intel-eval',\n '.agents/memory/intelligence/intel-critic',\n '.agents/skills/squads-cli',\n '.agents/skills/gh',\n '.agents/config',\n ];\n\n // Add use-case specific directories\n for (const squad of useCaseConfig.squads) {\n dirs.push(...squad.dirs);\n }\n\n if (selectedProvider === 'claude') {\n dirs.push('.claude');\n }\n\n for (const dir of dirs) {\n await fs.mkdir(path.join(cwd, dir), { recursive: true });\n }\n\n spinner.text = 'Creating squad definitions...';\n\n // Core squad files (always created)\n const companyFiles: [string, string][] = [\n ['.agents/squads/company/SQUAD.md', 'squads/company/SQUAD.md'],\n ['.agents/squads/company/manager.md', 'squads/company/manager.md'],\n ['.agents/squads/company/event-dispatcher.md', 'squads/company/event-dispatcher.md'],\n ['.agents/squads/company/goal-tracker.md', 'squads/company/goal-tracker.md'],\n ['.agents/squads/company/company-eval.md', 'squads/company/company-eval.md'],\n ['.agents/squads/company/company-critic.md', 'squads/company/company-critic.md'],\n ];\n\n const researchFiles: [string, string][] = [\n ['.agents/squads/research/SQUAD.md', 'squads/research/SQUAD.md'],\n ['.agents/squads/research/researcher.md', 'squads/research/researcher.md'],\n ['.agents/squads/research/analyst.md', 'squads/research/analyst.md'],\n ['.agents/squads/research/research-eval.md', 'squads/research/research-eval.md'],\n ['.agents/squads/research/research-critic.md', 'squads/research/research-critic.md'],\n ];\n\n const intelligenceFiles: [string, string][] = [\n ['.agents/squads/intelligence/SQUAD.md', 'squads/intelligence/SQUAD.md'],\n ['.agents/squads/intelligence/intel-lead.md', 'squads/intelligence/intel-lead.md'],\n ['.agents/squads/intelligence/intel-eval.md', 'squads/intelligence/intel-eval.md'],\n ['.agents/squads/intelligence/intel-critic.md', 'squads/intelligence/intel-critic.md'],\n ];\n\n // Collect all use-case squad files\n const useCaseFiles: [string, string][] = [];\n for (const squad of useCaseConfig.squads) {\n useCaseFiles.push(...squad.files);\n }\n\n // Write all squad files\n for (const [dest, template] of [...companyFiles, ...researchFiles, ...intelligenceFiles, ...useCaseFiles]) {\n const content = loadSeedTemplate(template, variables);\n await writeFile(path.join(cwd, dest), content);\n }\n\n spinner.text = 'Creating memory and config...';\n\n // Core memory state files\n const coreMemoryFiles: [string, string][] = [\n ['.agents/memory/company/manager/state.md', 'memory/company/manager/state.md'],\n ['.agents/memory/research/researcher/state.md', 'memory/research/researcher/state.md'],\n ['.agents/memory/intelligence/intel-lead/state.md', 'memory/intelligence/intel-lead/state.md'],\n ];\n\n // Use-case memory state files\n const useCaseMemoryFiles: [string, string][] = [];\n for (const squad of useCaseConfig.squads) {\n useCaseMemoryFiles.push(...squad.memoryFiles);\n }\n\n for (const [dest, template] of [...coreMemoryFiles, ...useCaseMemoryFiles]) {\n await writeIfNew(path.join(cwd, dest), loadSeedTemplate(template, variables));\n }\n\n // Skills\n const skillContent = loadSeedTemplate('skills/squads-cli/SKILL.md', variables);\n await writeFile(path.join(cwd, '.agents/skills/squads-cli/SKILL.md'), skillContent);\n\n const ghSkillContent = loadSeedTemplate('skills/gh/SKILL.md', variables);\n await writeFile(path.join(cwd, '.agents/skills/gh/SKILL.md'), ghSkillContent);\n\n // Provider config\n const providerConfig = loadSeedTemplate('config/provider.yaml', variables);\n await writeFile(path.join(cwd, '.agents/config/provider.yaml'), providerConfig);\n\n // Business brief\n const businessBrief = loadSeedTemplate('BUSINESS_BRIEF.md.template', variables);\n await writeFile(path.join(cwd, '.agents/BUSINESS_BRIEF.md'), businessBrief);\n\n spinner.text = 'Setting up operating manual...';\n\n // CLAUDE.md (the operating manual — only if it doesn't exist)\n if (selectedProvider === 'claude') {\n const claudeMd = loadSeedTemplate('CLAUDE.md.template', variables);\n await writeIfNew(path.join(cwd, 'CLAUDE.md'), claudeMd);\n\n // Claude Code hooks\n const hooksContent = loadSeedTemplate('hooks/settings.json.template', variables);\n await writeIfNew(path.join(cwd, '.claude/settings.json'), hooksContent);\n }\n\n spinner.succeed('Seed planted');\n\n // Track initialization\n await track(Events.CLI_INIT, {\n success: true,\n hasGit: gitStatus.isGitRepo,\n hasRemote: gitStatus.hasRemote,\n provider: selectedProvider,\n useCase: selectedUseCase,\n agentCount: totalAgentCount,\n squadCount: totalSquadCount,\n hasBusinessName: businessName !== path.basename(cwd),\n hasBusinessDescription: businessDescription.length > 0,\n });\n\n } catch (error) {\n spinner.fail('Failed to plant the seed');\n console.error(chalk.red(` ${error}`));\n process.exit(1);\n }\n\n // 6. Success message\n console.log();\n console.log(chalk.green.bold(` ${businessName}'s AI workforce is ready.`));\n console.log();\n console.log(chalk.dim(' Created:'));\n\n // Core squads (always present)\n console.log(chalk.dim(' • .agents/squads/company/ 5 agents (manager, dispatcher, tracker, eval, critic)'));\n console.log(chalk.dim(' • .agents/squads/research/ 4 agents (researcher, analyst, eval, critic)'));\n console.log(chalk.dim(' • .agents/squads/intelligence/ 3 agents (intel-lead, eval, critic)'));\n\n // Use-case specific squads\n for (const squad of useCaseConfig.squads) {\n const padding = ' '.repeat(Math.max(0, 22 - squad.name.length));\n console.log(chalk.dim(` • .agents/squads/${squad.name}/${padding}${squad.agentCount} agents (${squad.agentSummary})`));\n }\n\n console.log(chalk.dim(' • .agents/skills/ CLI + GitHub workflow skills'));\n console.log(chalk.dim(' • .agents/memory/ Persistent state'));\n console.log(chalk.dim(' • .agents/BUSINESS_BRIEF.md'));\n if (selectedProvider === 'claude') {\n console.log(chalk.dim(' • CLAUDE.md Operating manual'));\n console.log(chalk.dim(' • .claude/settings.json Session hooks'));\n }\n console.log();\n console.log(chalk.bold(' Getting started:'));\n console.log();\n console.log(` ${chalk.cyan('1.')} ${chalk.yellow('git add -A && git commit -m \"feat: init AI workforce\"')}`);\n console.log(chalk.dim(' Git is the coordination layer — commit first'));\n console.log();\n\n // Dynamic \"first run\" suggestion based on use case\n const firstRunCommand = getFirstRunCommand(selectedUseCase);\n console.log(` ${chalk.cyan('2.')} ${chalk.yellow(firstRunCommand.command)}`);\n console.log(chalk.dim(` ${firstRunCommand.description}`));\n console.log();\n console.log(` ${chalk.cyan('3.')} ${chalk.yellow(`squads dash`)}`);\n console.log(chalk.dim(' See all your squads and agents at a glance'));\n console.log();\n console.log(chalk.dim(' Docs: https://agents-squads.com/docs/getting-started'));\n console.log();\n}\n\n/**\n * Get the suggested first command based on use case\n */\nfunction getFirstRunCommand(useCase: UseCase): { command: string; description: string } {\n switch (useCase) {\n case 'engineering':\n return {\n command: 'squads run engineering/issue-solver',\n description: 'Your first agent finds and solves GitHub issues',\n };\n case 'marketing':\n return {\n command: 'squads run marketing/content-drafter',\n description: 'Your first agent drafts content for your business',\n };\n case 'operations':\n return {\n command: 'squads run operations/ops-lead',\n description: 'Your first agent starts running daily operations',\n };\n case 'full-company':\n return {\n command: 'squads run research/researcher',\n description: 'Your first agent researches the topic you set',\n };\n case 'custom':\n default:\n return {\n command: 'squads run research/researcher',\n description: 'Your first agent researches the topic you set',\n };\n }\n}\n","import { execSync, exec } from 'child_process';\nimport { existsSync } from 'fs';\nimport { join } from 'path';\nimport { promisify } from 'util';\n\nconst execAsync = promisify(exec);\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\n/**\n * Check git status - synchronous version for backwards compatibility\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 // Run all git commands in parallel using a single combined command\n // This reduces 3 sequential execSync calls to 1\n const combined = execSync(\n 'echo \"BRANCH:\" && git rev-parse --abbrev-ref HEAD && echo \"REMOTES:\" && git remote -v && echo \"STATUS:\" && git status --porcelain',\n { cwd, encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'], timeout: 5000 }\n );\n\n // Parse combined output\n const branchMatch = combined.match(/BRANCH:\\n(.+)\\n/);\n if (branchMatch) {\n status.branch = branchMatch[1].trim();\n }\n\n const remotesMatch = combined.match(/REMOTES:\\n([\\s\\S]*?)STATUS:/);\n if (remotesMatch) {\n const remotes = remotesMatch[1].trim();\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\n const statusMatch = combined.match(/STATUS:\\n([\\s\\S]*?)$/);\n if (statusMatch) {\n const statusOutput = statusMatch[1].trim();\n if (statusOutput) {\n status.isDirty = true;\n status.uncommittedCount = statusOutput.split('\\n').filter(l => l.trim()).length;\n }\n }\n\n } catch {\n // Git commands failed, but we know it's a git repo\n }\n\n return status;\n}\n\n/**\n * Check git status - async version with parallel git commands\n */\nexport async function checkGitStatusAsync(cwd: string = process.cwd()): Promise<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 // Run all git commands in parallel\n const [branchResult, remotesResult, statusResult] = await Promise.all([\n execAsync('git rev-parse --abbrev-ref HEAD', { cwd, timeout: 5000 }).catch(() => ({ stdout: '' })),\n execAsync('git remote -v', { cwd, timeout: 5000 }).catch(() => ({ stdout: '' })),\n execAsync('git status --porcelain', { cwd, timeout: 5000 }).catch(() => ({ stdout: '' })),\n ]);\n\n status.branch = branchResult.stdout.trim();\n\n const remotes = remotesResult.stdout.trim();\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 const statusOutput = statusResult.stdout.trim();\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 recentCommits: CommitInfo[]; // Most recent commits across all repos\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 async function getGitHubStats(basePath: string, days: number = 30): Promise<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 = await 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 async function getMultiRepoGitStats(basePath: string, days: number = 30): Promise<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 recentCommits: [],\n };\n\n // Collect all commits with full info for sorting\n const allCommits: CommitInfo[] = [];\n\n // Build list of valid repos\n const validRepos = SQUAD_REPOS.filter(repo => {\n const repoPath = join(basePath, repo);\n return existsSync(repoPath) && existsSync(join(repoPath, '.git'));\n });\n\n // Fetch git logs from all repos in parallel\n const repoResults = await Promise.all(\n validRepos.map(async (repo) => {\n const repoPath = join(basePath, repo);\n try {\n const { stdout } = await execAsync(\n `git log --since=\"${days} days ago\" --format=\"%H|%aN|%ad|%s\" --date=short 2>/dev/null`,\n { cwd: repoPath, encoding: 'utf-8', maxBuffer: 10 * 1024 * 1024 }\n );\n return { repo, repoPath, output: stdout.trim() };\n } catch {\n return { repo, repoPath, output: '' };\n }\n })\n );\n\n // Process results\n for (const { repo, repoPath, output } of repoResults) {\n if (!output) continue;\n\n const commits = output.split('\\n').filter(l => l.trim());\n const authors = new Set<string>();\n let lastCommit = '';\n\n for (const line of commits) {\n const parts = line.split('|');\n const [hash, author, date, ...messageParts] = parts;\n const message = messageParts.join('|'); // Handle | in commit messages\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 // Collect for recent commits\n allCommits.push({ hash, author, date, message, repo });\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\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 // Sort commits by date (most recent first) and take top 5\n stats.recentCommits = allCommits\n .sort((a, b) => b.date.localeCompare(a.date) || b.hash.localeCompare(a.hash))\n .slice(0, 5);\n\n return stats;\n}\n\n// Get recent activity sparkline data (last 7 days)\nexport async function getActivitySparkline(basePath: string, days: number = 7): Promise<number[]> {\n const activity: number[] = [];\n const now = new Date();\n\n // Initialize activity array with zeros for each day\n for (let i = days - 1; i >= 0; i--) {\n activity.push(0);\n }\n\n // Build list of valid repos\n const validRepos = SQUAD_REPOS.filter(repo => {\n const repoPath = join(basePath, repo);\n return existsSync(repoPath) && existsSync(join(repoPath, '.git'));\n });\n\n // Fetch git logs from all repos in parallel\n const results = await Promise.all(\n validRepos.map(async (repo) => {\n const repoPath = join(basePath, repo);\n try {\n const { stdout } = await execAsync(\n `git log --since=\"${days} days ago\" --format=\"%ad\" --date=short 2>/dev/null`,\n { cwd: repoPath, encoding: 'utf-8', maxBuffer: 10 * 1024 * 1024 }\n );\n return stdout.trim();\n } catch {\n return '';\n }\n })\n );\n\n // Process results\n for (const output of results) {\n if (!output) continue;\n\n for (const dateStr of output.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 }\n\n return activity;\n}\n","import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'fs';\nimport { join } from 'path';\nimport { homedir, platform, release } from 'os';\nimport { randomUUID } from 'crypto';\nimport { version as cliVersion } from '../version.js';\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 - locked to Agents Squads infrastructure\n// Users can opt-out but cannot redirect telemetry\nconst TELEMETRY_ENDPOINT = Buffer.from(\n 'aHR0cHM6Ly9zcXVhZHMtdGVsZW1ldHJ5LTk3ODg3MTgxNzYxMC51cy1jZW50cmFsMS5ydW4uYXBwL3Bpbmc=',\n 'base64'\n).toString();\n\n// API key for endpoint validation (obfuscated)\nconst TELEMETRY_KEY = Buffer.from('c3FfdGVsX3YxXzdmOGE5YjJjM2Q0ZTVmNmE=', 'base64').toString();\n\n// Event queue for batch flushing\nlet eventQueue: TelemetryEvent[] = [];\nlet flushScheduled = false;\n\n// Cached system context (computed once per session)\nlet cachedSystemContext: Record<string, string | undefined> | null = null;\n\n/**\n * Detect user type for segmentation.\n * - 'agent': Autonomous agent execution (via squads run)\n * - 'ci': CI/CD environment (GitHub Actions, Azure Pipelines, etc)\n * - 'human': Interactive terminal usage\n */\nfunction detectUserType(): 'human' | 'agent' | 'ci' {\n // Agent execution (set by squads run command)\n // SQUADS_AGENT contains the agent name when running via squads run\n if (process.env.SQUADS_AGENT) {\n return 'agent';\n }\n\n // CI/CD environments\n if (\n process.env.CI === 'true' ||\n process.env.GITHUB_ACTIONS === 'true' ||\n process.env.GITLAB_CI === 'true' ||\n process.env.JENKINS_URL ||\n process.env.BUILDKITE === 'true' ||\n process.env.CIRCLECI === 'true' ||\n process.env.AZURE_PIPELINES === 'true' ||\n process.env.TF_BUILD === 'True'\n ) {\n return 'ci';\n }\n\n return 'human';\n}\n\n/**\n * Get minimal system context for error identification.\n * Computed once per session for performance.\n */\nfunction getSystemContext(): Record<string, string | undefined> {\n if (cachedSystemContext) return cachedSystemContext;\n\n cachedSystemContext = {\n os: platform(), // darwin, linux, win32\n osVersion: release(),\n nodeVersion: process.version,\n shell: process.env.SHELL?.split('/').pop() || process.env.ComSpec?.split('\\\\').pop(),\n terminal: process.env.TERM_PROGRAM || undefined,\n ci: process.env.CI === 'true' ? 'true' : undefined,\n userType: detectUserType(),\n // Agent context (set by squads run)\n squad: process.env.SQUADS_SQUAD || undefined,\n agent: process.env.SQUADS_AGENT || undefined,\n executionId: process.env.SQUADS_EXECUTION_ID || undefined,\n };\n\n return cachedSystemContext;\n}\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\n/**\n * Check if telemetry is enabled.\n * Telemetry is disabled if SQUADS_TELEMETRY_DISABLED=1 or DO_NOT_TRACK=1.\n * @returns true if telemetry collection is enabled\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\n/**\n * Enable telemetry collection.\n * Persists the setting to ~/.squads-cli/telemetry.json\n */\nexport function enable(): void {\n const config = getConfig();\n config.enabled = true;\n saveConfig(config);\n}\n\n/**\n * Disable telemetry collection.\n * Persists the setting to ~/.squads-cli/telemetry.json\n */\nexport function disable(): void {\n const config = getConfig();\n config.enabled = false;\n saveConfig(config);\n}\n\n/**\n * Get the anonymous identifier for this CLI installation.\n * Generated once on first run and persisted.\n * @returns UUID string\n */\nexport function getAnonymousId(): string {\n return getConfig().anonymousId;\n}\n\n/**\n * Track a telemetry event with optional properties.\n * Events are batched and flushed asynchronously.\n * @param event - Event name (e.g., 'cli.status', 'cli.error')\n * @param properties - Optional key-value pairs of event metadata\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 ...getSystemContext(),\n anonymousId: config.anonymousId,\n cliVersion,\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: {\n 'Content-Type': 'application/json',\n 'X-Squads-Key': TELEMETRY_KEY,\n },\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/**\n * Pre-defined event names for consistency across the CLI.\n * Use these constants instead of string literals.\n */\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 CLI_TONIGHT: 'cli.tonight',\n CLI_CONTEXT: 'cli.context',\n CLI_COST: 'cli.cost',\n CLI_EXEC: 'cli.exec',\n CLI_BASELINE: 'cli.baseline',\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 // Learnings\n CLI_LEARN: 'cli.learn',\n CLI_LEARN_SHOW: 'cli.learn.show',\n CLI_LEARN_SEARCH: 'cli.learn.search',\n\n // Auth\n CLI_LOGIN: 'cli.login',\n CLI_LOGOUT: 'cli.logout',\n\n // Providers\n CLI_PROVIDERS: 'cli.providers',\n\n // KPIs\n CLI_KPI_SHOW: 'cli.kpi.show',\n CLI_KPI_RECORD: 'cli.kpi.record',\n CLI_KPI_TREND: 'cli.kpi.trend',\n CLI_KPI_INSIGHTS: 'cli.kpi.insights',\n CLI_KPI_LIST: 'cli.kpi.list',\n\n // Cycle Sync\n CLI_SYNC_CYCLE: 'cli.sync.cycle',\n\n // Context Condenser\n CONDENSER_COMPRESS: 'condenser.compress',\n CONDENSER_DEDUPE: 'condenser.dedupe',\n CONDENSER_PRUNE: 'condenser.prune',\n CONDENSER_SUMMARIZE: 'condenser.summarize',\n} as const;\n\n/**\n * Track command execution time.\n * Call at start of command, returns function to call when command completes.\n * @param command - Command name (without 'cli.' prefix)\n * @returns Callback to invoke when command completes\n * @example\n * const done = trackCommand('status');\n * // ... execute command ...\n * done(); // Records duration\n */\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\n/**\n * Register process exit handlers to flush pending telemetry events.\n * Call once at CLI startup. Handles SIGINT, SIGTERM, and normal exit.\n */\nexport function registerExitHandler(): void {\n if (exitHandlerRegistered) return;\n exitHandlerRegistered = true;\n\n // beforeExit allows async operations (unlike 'exit')\n process.on('beforeExit', async () => {\n if (eventQueue.length > 0) {\n await flushEvents();\n }\n });\n\n // For signals, we need to handle manually\n const signalHandler = async (_signal: string) => {\n if (eventQueue.length > 0) {\n await flushEvents();\n }\n process.exit(0);\n };\n\n process.on('SIGINT', () => signalHandler('SIGINT'));\n process.on('SIGTERM', () => signalHandler('SIGTERM'));\n}\n","/**\n * Template loading and variable substitution for squads setup\n *\n * Template sources (checked in order):\n * 1. Local agents-squads repo clone (if in agents-squads directory)\n * 2. User's global templates (~/.squads/templates/)\n * 3. Bundled templates (dist/templates/)\n */\n\nimport { readFileSync, existsSync, readdirSync, statSync } from 'fs';\nimport { join, dirname } from 'path';\nimport { fileURLToPath } from 'url';\nimport { homedir } from 'os';\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\n// GitHub repo for templates\nexport const AGENTS_SQUADS_REPO = 'https://github.com/agents-squads/agents-squads.git';\n\n/**\n * Template source info\n */\nexport interface TemplateSource {\n type: 'repo' | 'global' | 'bundled';\n path: string;\n description: string;\n}\n\n/**\n * Find templates directory with priority:\n * 1. Local agents-squads repo (best - has domain starters)\n * 2. User's global templates (~/.squads/templates/)\n * 3. Bundled templates in CLI package\n */\nfunction findTemplatesDir(): TemplateSource {\n // 1. Check for local agents-squads repo (look for .agents/squads/_template)\n const repoLocations = [\n join(process.cwd(), '..', 'agents-squads'), // Sibling directory\n join(homedir(), 'agents-squads', 'agents-squads'), // Common clone location\n join(homedir(), 'code', 'agents-squads'), // Alternative\n join(homedir(), 'projects', 'agents-squads'), // Alternative\n ];\n\n for (const repoPath of repoLocations) {\n const templatePath = join(repoPath, '.agents', 'squads', '_template');\n if (existsSync(templatePath) && existsSync(join(templatePath, 'SQUAD.md'))) {\n return {\n type: 'repo',\n path: repoPath,\n description: `agents-squads repo at ${repoPath}`,\n };\n }\n }\n\n // 2. Check user's global templates\n const globalTemplates = join(homedir(), '.squads', 'templates');\n if (existsSync(globalTemplates)) {\n return {\n type: 'global',\n path: globalTemplates,\n description: 'User global templates (~/.squads/templates/)',\n };\n }\n\n // 3. Fall back to bundled templates\n const bundledLocations = [\n join(__dirname, '..', 'templates'), // dist/templates (production)\n join(__dirname, '..', '..', 'templates'), // src/../templates (dev)\n join(__dirname, '..', '..', '..', 'templates'), // npm installed\n ];\n\n for (const bundled of bundledLocations) {\n if (existsSync(bundled)) {\n return {\n type: 'bundled',\n path: bundled,\n description: 'CLI bundled templates',\n };\n }\n }\n\n // Default fallback\n return {\n type: 'bundled',\n path: join(__dirname, '..', '..', 'templates'),\n description: 'CLI bundled templates (not found)',\n };\n}\n\nconst TEMPLATE_SOURCE = findTemplatesDir();\n\n/**\n * Get current template source info\n */\nexport function getTemplateSource(): TemplateSource {\n return TEMPLATE_SOURCE;\n}\n\n/**\n * Check if using agents-squads repo templates\n */\nexport function isUsingRepoTemplates(): boolean {\n return TEMPLATE_SOURCE.type === 'repo';\n}\n\n/**\n * Template variables for substitution\n */\nexport interface TemplateVariables {\n // Squad variables\n SQUAD_NAME?: string; // Human-readable name: \"My First Squad\"\n SQUAD_ID?: string; // Kebab-case ID: \"my-first-squad\"\n SQUAD_DESCRIPTION?: string;\n GOAL?: string;\n\n // Provider variables\n PROVIDER?: string; // Provider ID: \"claude\", \"gemini\", etc.\n PROVIDER_NAME?: string; // Display name: \"Claude Code (Anthropic)\"\n\n // Custom variables\n [key: string]: string | undefined;\n}\n\n/**\n * Resolve template path based on source type\n */\nfunction resolveTemplatePath(templatePath: string): string {\n if (TEMPLATE_SOURCE.type === 'repo') {\n // For repo source, map template paths to repo structure\n // CLI templates are in different locations than repo templates\n const mappings: Record<string, string> = {\n 'first-squad/SQUAD.md.template': '.agents/squads/_template/SQUAD.md',\n 'first-squad/lead.md.template': '.agents/squads/_template/agent.md',\n 'core/AGENTS.md.template': 'AGENTS.md', // Use repo's AGENTS.md? Or skip\n 'core/CLAUDE.md.template': 'CLAUDE.md',\n };\n\n const mapped = mappings[templatePath];\n if (mapped) {\n return join(TEMPLATE_SOURCE.path, mapped);\n }\n\n // For unmapped, try direct path\n return join(TEMPLATE_SOURCE.path, templatePath);\n }\n\n // For bundled/global, use direct path\n return join(TEMPLATE_SOURCE.path, templatePath);\n}\n\n/**\n * Load a template file and substitute variables\n */\nexport function loadTemplate(templatePath: string, variables: TemplateVariables = {}): string {\n const fullPath = resolveTemplatePath(templatePath);\n\n if (!existsSync(fullPath)) {\n // Try bundled fallback if repo template not found\n if (TEMPLATE_SOURCE.type === 'repo') {\n const bundledPath = join(__dirname, '..', 'templates', templatePath);\n if (existsSync(bundledPath)) {\n return loadTemplateFromPath(bundledPath, variables);\n }\n }\n throw new Error(`Template not found: ${templatePath} (source: ${TEMPLATE_SOURCE.description})`);\n }\n\n return loadTemplateFromPath(fullPath, variables);\n}\n\nfunction loadTemplateFromPath(fullPath: string, variables: TemplateVariables): string {\n let content = readFileSync(fullPath, 'utf-8');\n\n // Substitute all {{VARIABLE}} patterns\n for (const [key, value] of Object.entries(variables)) {\n if (value !== undefined) {\n const pattern = new RegExp(`\\\\{\\\\{${key}\\\\}\\\\}`, 'g');\n content = content.replace(pattern, value);\n }\n }\n\n // Also substitute {VARIABLE} patterns (used in repo templates)\n for (const [key, value] of Object.entries(variables)) {\n if (value !== undefined) {\n const pattern = new RegExp(`\\\\{${key}\\\\}`, 'g');\n content = content.replace(pattern, value);\n }\n }\n\n return content;\n}\n\n/**\n * Check if a template exists\n */\nexport function templateExists(templatePath: string): boolean {\n return existsSync(resolveTemplatePath(templatePath));\n}\n\n/**\n * Get domain starters from agents-squads repo\n * Returns available domains if using repo templates\n */\nexport function getDomainStarters(): string[] {\n if (TEMPLATE_SOURCE.type !== 'repo') {\n return [];\n }\n\n const domainsDir = join(TEMPLATE_SOURCE.path, 'domains');\n if (!existsSync(domainsDir)) {\n return [];\n }\n\n return readdirSync(domainsDir, { withFileTypes: true })\n .filter(d => d.isDirectory())\n .map(d => d.name);\n}\n\n/**\n * Copy a domain starter to current directory\n */\nexport function getDomainStarterPath(domain: string): string | null {\n if (TEMPLATE_SOURCE.type !== 'repo') {\n return null;\n }\n\n const domainPath = join(TEMPLATE_SOURCE.path, 'domains', domain);\n if (!existsSync(domainPath)) {\n return null;\n }\n\n return domainPath;\n}\n\n/**\n * List all templates in a directory\n */\nexport function listTemplates(dir: string): string[] {\n let fullDir: string;\n\n if (TEMPLATE_SOURCE.type === 'repo') {\n fullDir = join(TEMPLATE_SOURCE.path, '.agents', 'squads', '_template');\n } else {\n fullDir = join(TEMPLATE_SOURCE.path, dir);\n }\n\n if (!existsSync(fullDir)) {\n return [];\n }\n\n return readdirSync(fullDir).filter(f => {\n const stat = statSync(join(fullDir, f));\n return stat.isFile() && (f.endsWith('.template') || f.endsWith('.md'));\n });\n}\n\n/**\n * Get the templates directory path\n */\nexport function getTemplatesDir(): string {\n return TEMPLATE_SOURCE.path;\n}\n\n/**\n * Load all templates from a directory with variables substituted\n */\nexport function loadTemplateDirectory(\n dir: string,\n variables: TemplateVariables = {}\n): Map<string, string> {\n const result = new Map<string, string>();\n const fullDir = join(TEMPLATE_SOURCE.path, dir);\n\n if (!existsSync(fullDir)) {\n return result;\n }\n\n const processDir = (currentDir: string, prefix: string) => {\n const entries = readdirSync(currentDir, { withFileTypes: true });\n\n for (const entry of entries) {\n const fullPath = join(currentDir, entry.name);\n const relativePath = prefix ? `${prefix}/${entry.name}` : entry.name;\n\n if (entry.isDirectory()) {\n processDir(fullPath, relativePath);\n } else if (entry.isFile()) {\n let content = readFileSync(fullPath, 'utf-8');\n\n // Substitute variables\n for (const [key, value] of Object.entries(variables)) {\n if (value !== undefined) {\n const pattern = new RegExp(`\\\\{\\\\{${key}\\\\}\\\\}`, 'g');\n content = content.replace(pattern, value);\n }\n }\n\n // Remove .template suffix for output filename\n const outputName = relativePath.replace(/\\.template$/, '');\n result.set(outputName, content);\n }\n }\n };\n\n processDir(fullDir, '');\n return result;\n}\n\n/**\n * Convert a name to kebab-case for use as ID\n */\nexport function toKebabCase(name: string): string {\n return name\n .toLowerCase()\n .replace(/[^a-z0-9\\s-]/g, '')\n .replace(/\\s+/g, '-')\n .replace(/-+/g, '-')\n .replace(/^-|-$/g, '');\n}\n\n/**\n * Convert a name to Title Case for display\n */\nexport function toTitleCase(name: string): string {\n return name\n .split(/[-_\\s]+/)\n .map(word => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())\n .join(' ');\n}\n","/**\n * Setup checks and validation for squads setup command\n * Provides prerequisite checking with helpful fix guidance\n */\n\nimport { execSync, spawn } from 'child_process';\nimport {\n colors,\n RESET,\n icons,\n writeLine,\n} from './terminal.js';\n\nexport type CheckStatus = 'ok' | 'missing' | 'warning' | 'error';\n\nexport interface CheckResult {\n name: string;\n status: CheckStatus;\n message?: string;\n hint?: string;\n fixCommand?: string;\n}\n\nexport interface ProviderInfo {\n id: string;\n name: string;\n cliCheck?: string;\n envKey?: string;\n installCmd?: string;\n loginCmd?: string;\n requiresSubscription: boolean;\n requiresApiKey: boolean;\n}\n\nexport const PROVIDERS: Record<string, ProviderInfo> = {\n claude: {\n id: 'claude',\n name: 'Claude Code (Anthropic)',\n cliCheck: 'claude',\n installCmd: 'npm install -g @anthropic-ai/claude-code',\n loginCmd: 'claude login',\n requiresSubscription: true,\n requiresApiKey: false,\n },\n gemini: {\n id: 'gemini',\n name: 'Gemini (Google)',\n cliCheck: 'gemini',\n envKey: 'GEMINI_API_KEY',\n installCmd: 'npm install -g @anthropic-ai/claude-code', // Placeholder - gemini CLI\n requiresSubscription: false,\n requiresApiKey: true,\n },\n openai: {\n id: 'openai',\n name: 'GPT (OpenAI)',\n envKey: 'OPENAI_API_KEY',\n requiresSubscription: false,\n requiresApiKey: true,\n },\n ollama: {\n id: 'ollama',\n name: 'Ollama (Local)',\n cliCheck: 'ollama',\n installCmd: 'brew install ollama',\n requiresSubscription: false,\n requiresApiKey: false,\n },\n cursor: {\n id: 'cursor',\n name: 'Cursor IDE',\n requiresSubscription: true,\n requiresApiKey: false,\n },\n aider: {\n id: 'aider',\n name: 'Aider',\n cliCheck: 'aider',\n installCmd: 'pip install aider-chat',\n requiresSubscription: false,\n requiresApiKey: true,\n },\n none: {\n id: 'none',\n name: 'Planning Only (no agent execution)',\n requiresSubscription: false,\n requiresApiKey: false,\n },\n};\n\n/**\n * Check if a command exists in PATH\n */\nexport function commandExists(cmd: string): boolean {\n try {\n execSync(`which ${cmd}`, { stdio: 'ignore' });\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Check if Docker is running\n */\nexport function isDockerRunning(): boolean {\n try {\n execSync('docker info', { stdio: 'ignore' });\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Check if Colima is running (alternative to Docker Desktop on macOS)\n */\nexport function isColimaRunning(): boolean {\n try {\n const result = execSync('colima status', { encoding: 'utf-8', stdio: ['pipe', 'pipe', 'ignore'] });\n return result.includes('Running');\n } catch {\n return false;\n }\n}\n\n/**\n * Check Docker/Colima prerequisites\n */\nexport function checkDockerPrereqs(): CheckResult {\n // Check if Docker is running\n if (isDockerRunning()) {\n return { name: 'Docker', status: 'ok' };\n }\n\n // Docker not running - check if it's installed\n if (commandExists('docker')) {\n // Check if Colima is available as an alternative\n if (commandExists('colima')) {\n if (isColimaRunning()) {\n return { name: 'Docker (Colima)', status: 'ok' };\n }\n return {\n name: 'Docker',\n status: 'warning',\n message: 'Docker installed but not running',\n hint: 'Start Docker Desktop or run: colima start',\n fixCommand: 'colima start',\n };\n }\n\n return {\n name: 'Docker',\n status: 'warning',\n message: 'Docker installed but not running',\n hint: 'Start Docker Desktop',\n };\n }\n\n // Docker not installed\n return {\n name: 'Docker',\n status: 'warning',\n message: 'Optional: enables scheduling, telemetry, and persistent storage',\n hint: 'Core commands (init, run, status, eval) work without Docker. Install for scheduling: brew install --cask docker',\n };\n}\n\n/**\n * Check GitHub CLI\n */\nexport function checkGhCli(): CheckResult {\n if (!commandExists('gh')) {\n return {\n name: 'GitHub CLI',\n status: 'missing',\n message: 'Required for GitHub integration',\n hint: 'Install: brew install gh',\n fixCommand: 'brew install gh',\n };\n }\n\n // Check if authenticated\n try {\n execSync('gh auth status', { stdio: 'ignore' });\n return { name: 'GitHub CLI', status: 'ok' };\n } catch {\n return {\n name: 'GitHub CLI',\n status: 'warning',\n message: 'Installed but not authenticated',\n hint: 'Run: gh auth login',\n fixCommand: 'gh auth login',\n };\n }\n}\n\n/**\n * Check GitHub token permissions\n */\nexport function checkGhPermissions(): CheckResult {\n try {\n // Get current scopes\n const result = execSync('gh auth status 2>&1', { encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] });\n\n // Check for required scopes\n const hasRepo = result.includes('repo') || result.includes('Token scopes:') && !result.includes('none');\n const hasWorkflow = result.includes('workflow');\n\n if (!hasRepo) {\n return {\n name: 'GitHub Permissions',\n status: 'warning',\n message: 'Missing repo scope',\n hint: 'Run: gh auth refresh -s repo,workflow',\n fixCommand: 'gh auth refresh -s repo,workflow',\n };\n }\n\n if (!hasWorkflow) {\n return {\n name: 'GitHub Permissions',\n status: 'warning',\n message: 'Missing workflow scope (optional)',\n hint: 'For Actions: gh auth refresh -s repo,workflow',\n };\n }\n\n return { name: 'GitHub Permissions', status: 'ok' };\n } catch {\n return {\n name: 'GitHub Permissions',\n status: 'warning',\n message: 'Could not verify permissions',\n hint: 'Run: gh auth status',\n };\n }\n}\n\n/**\n * Check Claude CLI\n */\nexport function checkClaudeCli(): CheckResult {\n if (!commandExists('claude')) {\n return {\n name: 'Claude CLI',\n status: 'missing',\n message: 'Required to run agents',\n hint: 'Install: npm install -g @anthropic-ai/claude-code',\n fixCommand: 'npm install -g @anthropic-ai/claude-code',\n };\n }\n\n // Check if logged in by running claude --version\n try {\n execSync('claude --version', { stdio: 'ignore' });\n return { name: 'Claude CLI', status: 'ok' };\n } catch {\n return {\n name: 'Claude CLI',\n status: 'warning',\n message: 'Installed but may need login',\n hint: 'Run: claude login',\n fixCommand: 'claude login',\n };\n }\n}\n\n/**\n * Check provider-specific requirements\n */\nexport function checkProviderAuth(providerId: string): CheckResult {\n const provider = PROVIDERS[providerId];\n if (!provider) {\n return { name: 'Provider', status: 'warning', message: `Unknown provider: ${providerId}` };\n }\n\n // No requirements for none/cursor\n if (providerId === 'none' || providerId === 'cursor') {\n return { name: provider.name, status: 'ok' };\n }\n\n // Check CLI if required\n if (provider.cliCheck) {\n if (!commandExists(provider.cliCheck)) {\n return {\n name: provider.name,\n status: 'missing',\n message: `CLI not installed`,\n hint: provider.installCmd ? `Install: ${provider.installCmd}` : undefined,\n fixCommand: provider.installCmd,\n };\n }\n }\n\n // Check API key if required\n if (provider.envKey && provider.requiresApiKey) {\n if (!process.env[provider.envKey]) {\n return {\n name: provider.name,\n status: 'warning',\n message: `${provider.envKey} not set`,\n hint: `Set environment variable: export ${provider.envKey}=<your-key>`,\n };\n }\n }\n\n return { name: provider.name, status: 'ok' };\n}\n\n/**\n * Run all prerequisite checks\n */\nexport function runPrereqChecks(): CheckResult[] {\n return [\n checkDockerPrereqs(),\n checkGhCli(),\n ];\n}\n\n/**\n * Run all auth checks for a specific provider\n */\nexport function runAuthChecks(providerId: string): CheckResult[] {\n const checks: CheckResult[] = [];\n\n // Provider-specific auth\n checks.push(checkProviderAuth(providerId));\n\n // Claude CLI check (only for claude provider)\n if (providerId === 'claude') {\n checks.push(checkClaudeCli());\n }\n\n // GitHub permissions (for all providers that use GitHub)\n if (providerId !== 'none') {\n checks.push(checkGhPermissions());\n }\n\n return checks;\n}\n\n/**\n * Display check results with formatting\n */\nexport function displayCheckResults(checks: CheckResult[]): {\n hasErrors: boolean;\n hasWarnings: boolean;\n errorChecks: CheckResult[];\n warningChecks: CheckResult[];\n} {\n const errorChecks: CheckResult[] = [];\n const warningChecks: CheckResult[] = [];\n\n for (const check of checks) {\n const icon = getStatusIcon(check.status);\n const statusColor = getStatusColor(check.status);\n\n if (check.status === 'ok') {\n writeLine(` ${icon} ${check.name}`);\n } else {\n const suffix = check.message ? ` ${colors.dim}(${check.message})${RESET}` : '';\n writeLine(` ${icon} ${statusColor}${check.name}${RESET}${suffix}`);\n\n if (check.hint) {\n writeLine(` ${colors.cyan}→ ${check.hint}${RESET}`);\n }\n\n if (check.status === 'error' || check.status === 'missing') {\n errorChecks.push(check);\n } else if (check.status === 'warning') {\n warningChecks.push(check);\n }\n }\n }\n\n return {\n hasErrors: errorChecks.length > 0,\n hasWarnings: warningChecks.length > 0,\n errorChecks,\n warningChecks,\n };\n}\n\nfunction getStatusIcon(status: CheckStatus): string {\n switch (status) {\n case 'ok':\n return `${colors.green}${icons.success}${RESET}`;\n case 'warning':\n return `${colors.yellow}${icons.warning}${RESET}`;\n case 'missing':\n case 'error':\n return `${colors.red}${icons.error}${RESET}`;\n }\n}\n\nfunction getStatusColor(status: CheckStatus): string {\n switch (status) {\n case 'ok':\n return colors.green;\n case 'warning':\n return colors.yellow;\n case 'missing':\n case 'error':\n return colors.red;\n }\n}\n\n/**\n * Attempt to fix a failed check by running its fix command\n */\nexport async function attemptFix(check: CheckResult): Promise<boolean> {\n if (!check.fixCommand) {\n return false;\n }\n\n writeLine();\n writeLine(` ${colors.cyan}${icons.progress}${RESET} Running: ${colors.dim}${check.fixCommand}${RESET}`);\n writeLine();\n\n return new Promise((resolve) => {\n const proc = spawn(check.fixCommand!, [], {\n stdio: 'inherit',\n shell: true,\n });\n\n proc.on('close', (code) => {\n resolve(code === 0);\n });\n\n proc.on('error', () => {\n resolve(false);\n });\n });\n}\n\n/**\n * Wait for a service to be ready with retry\n */\nexport async function waitForService(\n name: string,\n checkFn: () => boolean | Promise<boolean>,\n maxAttempts = 30,\n intervalMs = 1000\n): Promise<boolean> {\n for (let i = 0; i < maxAttempts; i++) {\n const ready = await checkFn();\n if (ready) {\n return true;\n }\n await new Promise((resolve) => setTimeout(resolve, intervalMs));\n }\n return false;\n}\n","import ora from 'ora';\nimport { spawn, execSync } from 'child_process';\nimport { join, dirname } from 'path';\nimport { existsSync, readFileSync, writeFileSync, mkdirSync, readdirSync } from 'fs';\nimport {\n findSquadsDir,\n loadSquad,\n listAgents,\n loadAgentDefinition,\n parseAgentProvider,\n EffortLevel,\n Squad,\n} from '../lib/squad-parser.js';\nimport { resolveMcpConfigPath } from '../lib/mcp-config.js';\nimport {\n buildContextFromSquad,\n validateExecution,\n formatViolations,\n ExecutionRequest\n} from '../lib/permissions.js';\nimport { findMemoryDir } from '../lib/memory.js';\nimport { track, Events, flushEvents } from '../lib/telemetry.js';\nimport {\n colors,\n bold,\n RESET,\n gradient,\n icons,\n writeLine,\n} from '../lib/terminal.js';\nimport {\n getCLIConfig,\n isProviderCLIAvailable,\n} from '../lib/llm-clis.js';\nimport { detectProviderFromModel } from '../lib/providers.js';\nimport { homedir } from 'os';\n\ninterface RunOptions {\n verbose?: boolean;\n dryRun?: boolean;\n agent?: string;\n timeout?: number; // minutes, default 30\n execute?: boolean;\n parallel?: boolean; // Run all agents in parallel\n lead?: boolean; // Run as lead session using Task tool for parallelization\n foreground?: boolean; // Run in foreground (deprecated, now default)\n background?: boolean; // Run in background (detached process)\n watch?: boolean; // Run in background but tail the log\n useApi?: boolean; // Use API credits instead of subscription\n effort?: EffortLevel; // Effort level: high, medium, low\n skills?: string[]; // Skills to load (skill IDs or local paths)\n trigger?: 'manual' | 'scheduled' | 'event' | 'smart'; // Trigger source for telemetry\n provider?: string; // LLM provider: anthropic, google, openai, mistral, xai, aider, ollama\n model?: string; // Model to use (Claude aliases or full model IDs like gemini-2.5-flash)\n verify?: boolean; // Post-execution verification (default true, --no-verify to skip)\n}\n\n/**\n * Execution context for telemetry tagging\n * Passed to Claude via environment variables for per-agent cost tracking\n */\ninterface ExecutionContext {\n squad: string;\n agent: string;\n taskType: 'evaluation' | 'execution' | 'research' | 'lead';\n trigger: 'manual' | 'scheduled' | 'event' | 'smart';\n executionId: string;\n}\n\n/**\n * Register execution context with the squads-bridge for telemetry\n * This allows the bridge to tag incoming OTel data with correct squad/agent info\n */\nasync function registerContextWithBridge(ctx: ExecutionContext): Promise<boolean> {\n const bridgeUrl = process.env.SQUADS_BRIDGE_URL || 'http://localhost:8088';\n\n try {\n const response = await fetch(`${bridgeUrl}/api/context/register`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n execution_id: ctx.executionId,\n squad: ctx.squad,\n agent: ctx.agent,\n task_type: ctx.taskType,\n trigger: ctx.trigger,\n }),\n });\n\n if (!response.ok) {\n // Non-fatal - continue even if bridge is unavailable\n return false;\n }\n return true;\n } catch {\n // Bridge not available - continue anyway\n return false;\n }\n}\n\n/**\n * Pre-execution gate check via bridge API.\n * Checks quota (monthly spend) and cooldown before running an agent.\n * Fails open (allows execution) if bridge is unavailable.\n */\ninterface PreflightResult {\n allowed: boolean;\n gates: {\n quota?: { ok: boolean; used: number; limit: number; remaining: number; period: string };\n cooldown?: { ok: boolean; elapsed_sec: number | null; min_gap_sec: number };\n };\n error?: string;\n}\n\nasync function checkPreflightGates(squad: string, agent: string): Promise<PreflightResult> {\n const bridgeUrl = process.env.SQUADS_BRIDGE_URL || 'http://localhost:8088';\n\n try {\n const response = await fetch(`${bridgeUrl}/api/execution/preflight`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ squad, agent }),\n });\n\n if (!response.ok) {\n // Fail open if bridge returns error\n return { allowed: true, gates: {} };\n }\n\n return await response.json() as PreflightResult;\n } catch {\n // Fail open if bridge is unavailable\n return { allowed: true, gates: {} };\n }\n}\n\n/**\n * Fetch relevant learnings from bridge for prompt injection.\n * Returns empty array if bridge is unavailable.\n */\ninterface Learning {\n content: string;\n importance: string;\n created_at: string;\n}\n\nasync function fetchLearnings(squad: string, limit = 5): Promise<Learning[]> {\n const bridgeUrl = process.env.SQUADS_BRIDGE_URL || 'http://localhost:8088';\n\n try {\n const response = await fetch(\n `${bridgeUrl}/api/learnings/relevant?squad=${encodeURIComponent(squad)}&limit=${limit}`\n );\n\n if (!response.ok) {\n return [];\n }\n\n const data = await response.json() as { learnings: Learning[] };\n return data.learnings || [];\n } catch {\n return [];\n }\n}\n\n/**\n * Load approval/escalation instructions from config file.\n * Returns the instructions content or empty string if not found.\n */\nfunction loadApprovalInstructions(): string {\n const squadsDir = findSquadsDir();\n if (!squadsDir) return '';\n\n // Try .agents/config/approval-instructions.md\n const instructionsPath = join(dirname(squadsDir), 'config', 'approval-instructions.md');\n\n if (existsSync(instructionsPath)) {\n try {\n return readFileSync(instructionsPath, 'utf-8');\n } catch {\n return '';\n }\n }\n\n return '';\n}\n\n/**\n * Gather squad context for prompt injection.\n * Includes SQUAD.md mission/goals, agent's existing state, and relevant briefs.\n * This ensures agents build on existing knowledge rather than starting from scratch.\n */\nfunction gatherSquadContext(\n squadName: string,\n agentName: string,\n options: { verbose?: boolean; maxTokens?: number; agentPath?: string } = {}\n): string {\n const squadsDir = findSquadsDir();\n if (!squadsDir) return '';\n\n const memoryDir = findMemoryDir();\n const maxTokens = options.maxTokens || 8000; // ~8k tokens of context by default\n const sections: string[] = [];\n let estimatedTokens = 0;\n\n // Helper to estimate tokens (rough: ~4 chars per token)\n const estimateTokens = (text: string) => Math.ceil(text.length / 4);\n\n // 1. SQUAD.md - mission, goals, and key context\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 (skip frontmatter YAML, focus on mission/goals/output)\n const missionMatch = squadContent.match(/## Mission[\\s\\S]*?(?=\\n## |$)/i);\n const goalsMatch = squadContent.match(/## (?:Goals|Objectives)[\\s\\S]*?(?=\\n## |$)/i);\n const outputMatch = squadContent.match(/## Output[\\s\\S]*?(?=\\n## |$)/i);\n const contextMatch = squadContent.match(/## Context[\\s\\S]*?(?=\\n## |$)/i);\n\n let squadContext = '';\n if (missionMatch) squadContext += missionMatch[0] + '\\n';\n if (goalsMatch) squadContext += goalsMatch[0] + '\\n';\n if (outputMatch) squadContext += outputMatch[0] + '\\n';\n if (contextMatch) squadContext += contextMatch[0] + '\\n';\n\n // If no structured sections found, include first 2000 chars\n if (!squadContext && squadContent.length > 0) {\n squadContext = squadContent.substring(0, 2000);\n }\n\n if (squadContext) {\n const tokens = estimateTokens(squadContext);\n if (estimatedTokens + tokens < maxTokens) {\n sections.push(`## Squad Context (${squadName})\\n${squadContext.trim()}`);\n estimatedTokens += tokens;\n }\n }\n } catch {\n // Ignore read errors\n }\n }\n\n // 2. Agent's existing state (state.md) - what the agent knows\n if (memoryDir) {\n const stateFile = join(memoryDir, squadName, agentName, 'state.md');\n if (existsSync(stateFile)) {\n try {\n const stateContent = readFileSync(stateFile, 'utf-8');\n const tokens = estimateTokens(stateContent);\n\n if (estimatedTokens + tokens < maxTokens && stateContent.trim()) {\n sections.push(`## Your Previous State\\nThis is your memory from your last execution:\\n\\n${stateContent.trim()}`);\n estimatedTokens += tokens;\n }\n } catch {\n // Ignore read errors\n }\n }\n }\n\n // 3. Related briefs (if any exist in memory/squad/agent/briefs/)\n if (memoryDir) {\n const briefsDir = join(memoryDir, squadName, agentName, 'briefs');\n if (existsSync(briefsDir)) {\n try {\n const briefFiles = readdirSync(briefsDir)\n .filter(f => f.endsWith('.md'))\n .slice(0, 3); // Max 3 briefs\n\n for (const briefFile of briefFiles) {\n const briefPath = join(briefsDir, briefFile);\n const briefContent = readFileSync(briefPath, 'utf-8');\n const tokens = estimateTokens(briefContent);\n\n if (estimatedTokens + tokens < maxTokens) {\n sections.push(`## Brief: ${briefFile.replace('.md', '')}\\n${briefContent.trim()}`);\n estimatedTokens += tokens;\n } else {\n break; // Stop adding briefs if we're over budget\n }\n }\n } catch {\n // Ignore read errors\n }\n }\n }\n\n // 4. Squad-level briefs (shared context for all agents in squad)\n if (memoryDir) {\n const squadBriefsDir = join(memoryDir, squadName, '_briefs');\n if (existsSync(squadBriefsDir)) {\n try {\n const squadBriefs = readdirSync(squadBriefsDir)\n .filter(f => f.endsWith('.md'))\n .slice(0, 2); // Max 2 squad briefs\n\n for (const briefFile of squadBriefs) {\n const briefPath = join(squadBriefsDir, briefFile);\n const briefContent = readFileSync(briefPath, 'utf-8');\n const tokens = estimateTokens(briefContent);\n\n if (estimatedTokens + tokens < maxTokens) {\n sections.push(`## Squad Brief: ${briefFile.replace('.md', '')}\\n${briefContent.trim()}`);\n estimatedTokens += tokens;\n } else {\n break;\n }\n }\n } catch {\n // Ignore read errors\n }\n }\n }\n\n // 5. Daily briefing (cross-squad context)\n if (memoryDir) {\n const briefingPath = join(memoryDir, 'daily-briefing.md');\n if (existsSync(briefingPath)) {\n try {\n const briefingContent = readFileSync(briefingPath, 'utf-8');\n if (briefingContent.trim()) {\n const tokens = estimateTokens(briefingContent);\n if (estimatedTokens + tokens < maxTokens) {\n sections.push(`## Daily Briefing\\n${briefingContent.trim()}`);\n estimatedTokens += tokens;\n }\n }\n } catch {\n // Ignore read errors\n }\n }\n }\n\n // 6. Cross-squad learnings (from context_from in agent frontmatter)\n if (memoryDir && options.agentPath) {\n const frontmatter = parseAgentFrontmatter(options.agentPath);\n if (frontmatter.context_from && frontmatter.context_from.length > 0) {\n for (const relatedSquad of frontmatter.context_from) {\n // Related squad shared learnings\n const learningsPath = join(memoryDir, relatedSquad, 'shared', 'learnings.md');\n if (existsSync(learningsPath)) {\n try {\n let learningsContent = readFileSync(learningsPath, 'utf-8');\n if (learningsContent.trim()) {\n if (learningsContent.length > 1500) {\n learningsContent = learningsContent.slice(0, 1500) + '\\n...(truncated)';\n }\n const tokens = estimateTokens(learningsContent);\n if (estimatedTokens + tokens < maxTokens) {\n sections.push(`## ${relatedSquad} Squad Learnings\\n${learningsContent.trim()}`);\n estimatedTokens += tokens;\n }\n }\n } catch {\n // Ignore read errors\n }\n }\n\n // Related squad lead state\n const leadStatePath = join(memoryDir, relatedSquad, `${relatedSquad}-lead`, 'state.md');\n if (existsSync(leadStatePath)) {\n try {\n let leadState = readFileSync(leadStatePath, 'utf-8');\n if (leadState.trim()) {\n if (leadState.length > 1000) {\n leadState = leadState.slice(0, 1000) + '\\n...(truncated)';\n }\n const tokens = estimateTokens(leadState);\n if (estimatedTokens + tokens < maxTokens) {\n sections.push(`## ${relatedSquad} Lead State\\n${leadState.trim()}`);\n estimatedTokens += tokens;\n }\n }\n } catch {\n // Ignore read errors\n }\n }\n }\n }\n }\n\n if (sections.length === 0) {\n return '';\n }\n\n if (options.verbose) {\n writeLine(` ${colors.dim}Context: ${sections.length} sections (~${estimatedTokens} tokens)${RESET}`);\n }\n\n return `\\n# EXISTING CONTEXT\\nBuild on this existing knowledge - do NOT start from scratch:\\n\\n${sections.join('\\n\\n')}\\n`;\n}\n\n/**\n * Generate a unique execution ID for telemetry tracking\n */\nfunction generateExecutionId(): string {\n const timestamp = Date.now().toString(36);\n const random = Math.random().toString(36).substring(2, 8);\n return `exec_${timestamp}_${random}`;\n}\n\n/**\n * Select MCP config based on squad name and context\n * Uses three-tier resolution:\n * 1. Squad context.mcp from SQUAD.md frontmatter (dynamic)\n * 2. User override at ~/.claude/mcp-configs/{squad}.json\n * 3. Legacy hardcoded mapping (backward compatibility)\n * 4. Fallback to ~/.claude.json\n */\nfunction selectMcpConfig(squadName: string, squad?: Squad | null): string {\n // Tier 1 & 2: Use new context-based resolution if squad has context.mcp\n if (squad?.context?.mcp && squad.context.mcp.length > 0) {\n return resolveMcpConfigPath(squadName, squad.context.mcp);\n }\n\n // Tier 3: Legacy hardcoded mapping (for squads without context block)\n const home = process.env.HOME || '';\n const configsDir = join(home, '.claude', 'mcp-configs');\n\n const squadConfigs: Record<string, string> = {\n website: 'website.json',\n research: 'research.json',\n intelligence: 'research.json',\n analytics: 'data.json',\n engineering: 'data.json',\n };\n\n const configFile = squadConfigs[squadName.toLowerCase()];\n if (configFile) {\n const configPath = join(configsDir, configFile);\n if (existsSync(configPath)) {\n return configPath;\n }\n }\n\n // Tier 4: No MCP config — return empty string to skip --mcp-config flag.\n // Previously fell back to ~/.claude.json but that's Claude's settings file,\n // not an MCP config, and causes claude to exit silently with no output.\n return '';\n}\n\n/**\n * Detect task type from agent name patterns\n * - *-eval, *-critic, *-review → evaluation\n * - *-lead, *-orchestrator → lead\n * - *-research, *-analyst → research\n * - everything else → execution\n */\nfunction detectTaskType(agentName: string): ExecutionContext['taskType'] {\n const name = agentName.toLowerCase();\n if (name.includes('eval') || name.includes('critic') || name.includes('review') || name.includes('test')) {\n return 'evaluation';\n }\n if (name.includes('lead') || name.includes('orchestrator')) {\n return 'lead';\n }\n if (name.includes('research') || name.includes('analyst') || name.includes('intel')) {\n return 'research';\n }\n return 'execution';\n}\n\n/** Claude Code --model flag aliases */\ntype ClaudeModelAlias = 'opus' | 'sonnet' | 'haiku';\n\n/**\n * Map full model names to Claude Code --model aliases.\n * Claude Code only accepts: opus, sonnet, haiku (not full model IDs)\n */\nfunction getClaudeModelAlias(model: string): ClaudeModelAlias | undefined {\n const lower = model.toLowerCase();\n\n // Direct aliases\n if (lower === 'opus' || lower === 'sonnet' || lower === 'haiku') {\n return lower as ClaudeModelAlias;\n }\n\n // Full model name mapping\n if (lower.includes('opus')) return 'opus';\n if (lower.includes('sonnet')) return 'sonnet';\n if (lower.includes('haiku')) return 'haiku';\n\n // Unknown Claude model - let Claude Code handle it\n return undefined;\n}\n\n/**\n * Resolve model based on squad context and task type.\n * Priority: explicit --model flag > squad context routing > undefined (provider default)\n *\n * Supports multi-provider models:\n * - Anthropic: claude-opus-4-5, claude-sonnet-4, claude-3-5-haiku, opus, sonnet, haiku\n * - Google: gemini-2.5-flash, gemini-2.5-pro, gemini-2.0-flash\n * - Others: model names passed through to provider CLI\n *\n * Routing logic:\n * - evaluation (critics, tests) → cheap model - simple validation\n * - research (analysts, intel) → default model - balanced\n * - execution (builders, fixers) → default model - balanced\n * - lead (orchestrators) → expensive model - complex coordination\n */\nfunction resolveModel(\n explicitModel: string | undefined,\n squad: Squad | null,\n taskType: ExecutionContext['taskType']\n): string | undefined {\n // Explicit --model flag always wins\n if (explicitModel) {\n return explicitModel;\n }\n\n // No squad context = let provider decide\n const modelConfig = squad?.context?.model;\n if (!modelConfig) {\n return undefined;\n }\n\n // Route by task type\n switch (taskType) {\n case 'evaluation':\n // Critics/evals are simple - use cheap model\n return modelConfig.cheap || modelConfig.default;\n case 'lead':\n // Leads need complex reasoning - use expensive model\n return modelConfig.expensive || modelConfig.default;\n case 'research':\n case 'execution':\n default:\n // Default for most tasks\n return modelConfig.default;\n }\n}\n\n/**\n * Ensure the project directory is trusted in Claude's config.\n * This prevents the workspace trust dialog from blocking autonomous execution.\n */\nfunction ensureProjectTrusted(projectPath: string): void {\n const configPath = join(process.env.HOME || '', '.claude.json');\n\n if (!existsSync(configPath)) {\n // No Claude config yet - will be created on first interactive run\n return;\n }\n\n try {\n const config = JSON.parse(readFileSync(configPath, 'utf-8'));\n\n if (!config.projects) {\n config.projects = {};\n }\n\n if (!config.projects[projectPath]) {\n config.projects[projectPath] = {};\n }\n\n // Mark as trusted for autonomous execution\n if (!config.projects[projectPath].hasTrustDialogAccepted) {\n config.projects[projectPath].hasTrustDialogAccepted = true;\n writeFileSync(configPath, JSON.stringify(config, null, 2));\n }\n } catch {\n // Don't fail execution if we can't update config\n // The dialog will just appear\n }\n}\n\n/**\n * Get the project root directory (where .agents/ lives)\n */\nfunction getProjectRoot(): string {\n const squadsDir = findSquadsDir();\n if (squadsDir) {\n // .agents/squads -> .agents -> project root\n return dirname(dirname(squadsDir));\n }\n return process.cwd();\n}\n\ninterface ExecutionRecord {\n squadName: string;\n agentName: string;\n executionId: string;\n startTime: string;\n endTime?: string;\n durationMs?: number;\n status: 'running' | 'completed' | 'failed';\n trigger?: 'manual' | 'scheduled' | 'event' | 'smart';\n taskType?: 'evaluation' | 'execution' | 'research' | 'lead';\n outcome?: string;\n error?: 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').trimEnd();\n } else {\n content = `# ${record.squadName}/${record.agentName} - Execution Log`;\n }\n\n // Structured entry format for parsing\n const entry = `\n\n---\n<!-- exec:${record.executionId} -->\n**${record.startTime}** | Status: ${record.status}\n- ID: \\`${record.executionId}\\`\n- Trigger: ${record.trigger || 'manual'}\n- Task Type: ${record.taskType || 'execution'}\n`;\n\n writeFileSync(logPath, content + entry);\n}\n\nfunction updateExecutionStatus(\n squadName: string,\n agentName: string,\n executionId: string,\n status: 'completed' | 'failed',\n details?: {\n outcome?: string;\n error?: string;\n durationMs?: number;\n }\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 // Find and update the specific execution by ID\n const execMarker = `<!-- exec:${executionId} -->`;\n const markerIndex = content.indexOf(execMarker);\n\n if (markerIndex === -1) return;\n\n // Find the next entry marker or end of file\n const nextEntryIndex = content.indexOf('\\n---\\n', markerIndex + 1);\n const entryEnd = nextEntryIndex === -1 ? content.length : nextEntryIndex;\n\n // Extract and update the entry\n const entryStart = content.lastIndexOf('\\n---\\n', markerIndex);\n const currentEntry = content.slice(entryStart, entryEnd);\n\n // Build completion details\n const durationStr = details?.durationMs\n ? `${(details.durationMs / 1000).toFixed(1)}s`\n : 'unknown';\n\n let updatedEntry = currentEntry\n .replace(/Status: running/, `Status: ${status}`)\n + `- Completed: ${endTime}\n- Duration: ${durationStr}`;\n\n if (details?.outcome) {\n updatedEntry += `\\n- Outcome: ${details.outcome}`;\n }\n if (details?.error) {\n updatedEntry += `\\n- Error: ${details.error}`;\n }\n\n // Replace the entry in content\n content = content.slice(0, entryStart) + updatedEntry + content.slice(entryEnd);\n writeFileSync(logPath, content);\n}\n\n/**\n * Auto-commit agent work after execution completes.\n * Commits any uncommitted changes made by the agent.\n */\nasync function autoCommitAgentWork(\n squadName: string,\n agentName: string,\n executionId: string\n): Promise<{ committed: boolean; message?: string; error?: string }> {\n const { execSync } = await import('child_process');\n const projectRoot = getProjectRoot();\n\n try {\n // Check for uncommitted changes\n const status = execSync('git status --porcelain', {\n encoding: 'utf-8',\n cwd: projectRoot,\n }).trim();\n\n if (!status) {\n return { committed: false };\n }\n\n // Stage all changes (agent work should be committed)\n execSync('git add -A', { cwd: projectRoot });\n\n // Build commit message\n const shortExecId = executionId.slice(0, 12);\n const message = `feat(${squadName}/${agentName}): execution ${shortExecId}\\n\\nCo-Authored-By: Claude <noreply@anthropic.com>`;\n\n // Commit\n execSync(`git commit -m \"${message.replace(/\"/g, '\\\\\"')}\"`, { cwd: projectRoot });\n\n // Push to origin\n try {\n execSync('git push origin HEAD', { cwd: projectRoot, stdio: 'pipe' });\n } catch {\n // Push failed - continue, the commit is still local\n }\n\n return { committed: true, message: `Committed changes from ${agentName}` };\n } catch (error) {\n return { committed: false, error: String(error) };\n }\n}\n\n/**\n * Get the timestamp of the last execution from executions.md\n */\nfunction getLastExecutionTime(squadName: string, agentName: string): Date | null {\n const logPath = getExecutionLogPath(squadName, agentName);\n if (!logPath || !existsSync(logPath)) return null;\n\n const content = readFileSync(logPath, 'utf-8');\n\n // Find all timestamps in the format **2026-01-21T14:00:02.358Z**\n const timestamps = content.match(/\\*\\*(\\d{4}-\\d{2}-\\d{2}T[\\d:.]+Z)\\*\\*/g);\n if (!timestamps || timestamps.length === 0) return null;\n\n // Get the last (most recent) timestamp\n const lastTimestamp = timestamps[timestamps.length - 1].replace(/\\*\\*/g, '');\n return new Date(lastTimestamp);\n}\n\n/**\n * Local cooldown check - works without bridge\n * Returns { ok: true } if allowed, { ok: false, ... } if blocked\n */\nfunction checkLocalCooldown(\n squadName: string,\n agentName: string,\n cooldownMs: number\n): { ok: boolean; elapsedMs?: number; cooldownMs: number } {\n const lastExec = getLastExecutionTime(squadName, agentName);\n if (!lastExec) return { ok: true, cooldownMs };\n\n const elapsedMs = Date.now() - lastExec.getTime();\n if (elapsedMs < cooldownMs) {\n return { ok: false, elapsedMs, cooldownMs };\n }\n\n return { ok: true, elapsedMs, cooldownMs };\n}\n\n/**\n * Format milliseconds as human-readable duration\n */\nfunction formatDuration(ms: number): string {\n const hours = Math.floor(ms / (60 * 60 * 1000));\n const minutes = Math.floor((ms % (60 * 60 * 1000)) / (60 * 1000));\n\n if (hours >= 24) {\n const days = Math.floor(hours / 24);\n const remainingHours = hours % 24;\n return remainingHours > 0 ? `${days}d ${remainingHours}h` : `${days}d`;\n }\n if (hours > 0) {\n return minutes > 0 ? `${hours}h ${minutes}m` : `${hours}h`;\n }\n return `${minutes}m`;\n}\n\n/**\n * Extract MCP servers mentioned in an agent definition\n * Looks for patterns like: mcp-server-name, chrome-devtools, firecrawl, etc.\n */\nfunction extractMcpServersFromDefinition(definition: string): string[] {\n const servers: Set<string> = new Set();\n\n // Common MCP server patterns\n const knownServers = [\n 'chrome-devtools',\n 'firecrawl',\n 'context7',\n 'huggingface',\n ];\n\n // Check for known servers in the definition\n for (const server of knownServers) {\n if (definition.toLowerCase().includes(server)) {\n servers.add(server);\n }\n }\n\n // Look for mcp: blocks in YAML\n const mcpMatch = definition.match(/mcp:\\s*\\n((?:\\s*-\\s*\\S+\\s*\\n?)+)/i);\n if (mcpMatch) {\n const lines = mcpMatch[1].split('\\n');\n for (const line of lines) {\n const serverMatch = line.match(/^\\s*-\\s*(\\S+)/);\n if (serverMatch) {\n servers.add(serverMatch[1]);\n }\n }\n }\n\n return Array.from(servers);\n}\n\n/**\n * Parse frontmatter fields from an agent definition file.\n * Handles non-standard format where frontmatter appears after a heading.\n */\ninterface AgentFrontmatter {\n context_from?: string[];\n acceptance_criteria?: string;\n max_retries?: number;\n}\n\nfunction parseAgentFrontmatter(agentPath: string): AgentFrontmatter {\n if (!existsSync(agentPath)) return {};\n\n const content = readFileSync(agentPath, 'utf-8');\n const lines = content.split('\\n');\n let inFrontmatter = false;\n const yamlLines: string[] = [];\n\n for (const line of lines) {\n if (line.trim() === '---') {\n if (inFrontmatter) break;\n inFrontmatter = true;\n continue;\n }\n if (inFrontmatter) {\n yamlLines.push(line);\n }\n }\n\n if (yamlLines.length === 0) return {};\n\n const yaml = yamlLines.join('\\n');\n const result: AgentFrontmatter = {};\n\n // context_from: [operations, finance, product, growth]\n const contextMatch = yaml.match(/context_from:\\s*\\[([^\\]]+)\\]/);\n if (contextMatch) {\n result.context_from = contextMatch[1].split(',').map(s => s.trim());\n }\n\n // acceptance_criteria: |\\n - criteria1\\n - criteria2\n const criteriaMatch = yaml.match(/acceptance_criteria:\\s*\\|\\n((?:\\s+.+\\n?)*)/);\n if (criteriaMatch) {\n result.acceptance_criteria = criteriaMatch[1].replace(/^ {2}/gm, '').trim();\n }\n\n // max_retries: 2\n const retriesMatch = yaml.match(/max_retries:\\s*(\\d+)/);\n if (retriesMatch) {\n result.max_retries = parseInt(retriesMatch[1], 10);\n }\n\n return result;\n}\n\n/**\n * Emit an execution event to the API for tracking and routing.\n * Non-blocking and fail-safe — falls back to file if API unavailable.\n */\nasync function emitExecutionEvent(\n eventType: 'agent.completed' | 'agent.failed',\n data: { squad: string; agent: string; executionId: string; error?: string }\n): Promise<void> {\n const apiUrl = process.env.SQUADS_API_URL;\n\n if (apiUrl) {\n try {\n await fetch(`${apiUrl}/events/ingest`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n source: 'scheduler',\n event_type: eventType,\n data: {\n squad: data.squad,\n agent: data.agent,\n execution_id: data.executionId,\n ...(data.error ? { error: data.error } : {}),\n },\n }),\n signal: AbortSignal.timeout(5000),\n });\n return;\n } catch {\n // API unavailable — fall through to file\n }\n }\n\n // Fallback: write event to memory file\n try {\n const memDir = findMemoryDir();\n if (!memDir) return;\n\n const eventsDir = join(memDir, data.squad, data.agent);\n if (!existsSync(eventsDir)) {\n mkdirSync(eventsDir, { recursive: true });\n }\n\n const eventsPath = join(eventsDir, 'events.md');\n const timestamp = new Date().toISOString();\n const entry = `\\n## ${timestamp}: ${eventType}\\n- execution_id: ${data.executionId}\\n${data.error ? `- error: ${data.error}\\n` : ''}`;\n\n let existing = '';\n if (existsSync(eventsPath)) {\n existing = readFileSync(eventsPath, 'utf-8');\n }\n writeFileSync(eventsPath, existing + entry);\n } catch {\n // Truly fail-safe — never block execution\n }\n}\n\n/**\n * Verify execution against acceptance criteria using a lightweight model.\n * Returns pass/fail with reason. Used by the Ralph verification loop.\n */\nasync function verifyExecution(\n squadName: string,\n agentName: string,\n criteria: string,\n options: { verbose?: boolean } = {}\n): Promise<{ passed: boolean; reason: string }> {\n const { execSync } = await import('child_process');\n const projectRoot = getProjectRoot();\n\n // Gather evidence: state file + recent commits\n let stateContent = '';\n const memDir = findMemoryDir();\n if (memDir) {\n const statePath = join(memDir, squadName, agentName, 'state.md');\n if (existsSync(statePath)) {\n stateContent = readFileSync(statePath, 'utf-8').slice(0, 2000);\n }\n }\n\n let recentCommits = '';\n try {\n recentCommits = execSync('git log --oneline -5 --no-color', {\n encoding: 'utf-8',\n cwd: projectRoot,\n }).trim();\n } catch {\n recentCommits = '(no commits found)';\n }\n\n const verifyPrompt = `You are verifying whether an agent completed its task successfully.\n\nAgent: ${squadName}/${agentName}\n\n## Acceptance Criteria\n${criteria}\n\n## Evidence\n\n### Agent State File\n${stateContent || '(empty or not found)'}\n\n### Recent Git Commits\n${recentCommits}\n\n## Instructions\nEvaluate whether the acceptance criteria are met based on the evidence.\nRespond with EXACTLY one line:\nPASS: <brief reason>\nor\nFAIL: <brief reason>`;\n\n try {\n const escapedPrompt = verifyPrompt.replace(/'/g, \"'\\\\''\");\n const result = execSync(\n `claude --print --model haiku -- '${escapedPrompt}'`,\n { encoding: 'utf-8', cwd: projectRoot, timeout: 30000 }\n ).trim();\n\n if (options.verbose) {\n writeLine(` ${colors.dim}Verification: ${result}${RESET}`);\n }\n\n if (result.startsWith('PASS')) {\n return { passed: true, reason: result.replace(/^PASS:\\s*/, '') };\n }\n return { passed: false, reason: result.replace(/^FAIL:\\s*/, '') };\n } catch (error) {\n if (options.verbose) {\n writeLine(` ${colors.dim}Verification error (defaulting to PASS): ${error}${RESET}`);\n }\n return { passed: true, reason: 'Verification unavailable — defaulting to pass' };\n }\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 // Execution is now the default behavior (no --execute flag needed)\n // --dry-run disables execution\n if (!options.dryRun && options.execute === undefined) {\n options.execute = true;\n }\n\n // Check if target uses squad/agent syntax (e.g., \"demo/researcher\")\n let squadName = target;\n let agentFromSlash: string | undefined;\n\n if (target.includes('/')) {\n const parts = target.split('/');\n squadName = parts[0];\n agentFromSlash = parts[1];\n if (!options.agent) {\n options.agent = agentFromSlash;\n }\n }\n\n // Check if target is a squad or an agent\n const squad = loadSquad(squadName);\n\n // Pre-flight executor check: verify CLI and auth before attempting execution\n // Only runs when we're actually going to execute (not dry-run)\n if (options.execute && !options.dryRun) {\n // Resolve the provider early so we check the right CLI\n const provider = options.provider || squad?.providers?.default || 'anthropic';\n const checksOk = await preflightExecutorCheck(provider);\n if (!checksOk) {\n process.exit(1);\n }\n }\n\n if (squad) {\n await track(Events.CLI_RUN, { type: 'squad', target: squad.name });\n await flushEvents(); // Ensure telemetry is sent before potential exit\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 // Inherit effort from squad config if not provided via CLI\n if (!options.effort && squad.effort) {\n options.effort = squad.effort;\n }\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 // LEAD MODE: Single orchestrator session using Task tool for parallelization\n if (options.lead) {\n await runLeadMode(squad, squadsDir, options);\n return;\n }\n\n // PARALLEL EXECUTION: --parallel --execute runs all agents simultaneously\n if (options.parallel) {\n const agentFiles = squad.agents\n .map(a => ({\n name: a.name,\n path: join(squadsDir, squad.dir, `${a.name}.md`)\n }))\n .filter(a => existsSync(a.path));\n\n if (agentFiles.length === 0) {\n writeLine(` ${icons.error} ${colors.red}No agent files found${RESET}`);\n return;\n }\n\n writeLine(` ${bold}Parallel execution${RESET} ${colors.dim}${agentFiles.length} agents${RESET}`);\n writeLine();\n\n if (!options.execute) {\n // Preview mode\n for (const agent of agentFiles) {\n writeLine(` ${icons.empty} ${colors.cyan}${agent.name}${RESET}`);\n }\n writeLine();\n writeLine(` ${colors.dim}Launch all agents in parallel:${RESET}`);\n writeLine(` ${colors.dim}$${RESET} squads run ${colors.cyan}${squad.name}${RESET} --parallel`);\n writeLine();\n return;\n }\n\n // Execute all in parallel\n writeLine(` ${gradient('Launching')} ${agentFiles.length} agents in parallel...`);\n writeLine();\n\n const launches = agentFiles.map(agent =>\n runAgent(agent.name, agent.path, squad.dir, options)\n );\n\n await Promise.all(launches);\n\n writeLine();\n writeLine(` ${icons.success} All ${agentFiles.length} agents launched`);\n writeLine(` ${colors.dim}Monitor: tmux ls | grep squads-${squad.name}${RESET}`);\n writeLine(` ${colors.dim}Attach: tmux attach -t <session>${RESET}`);\n writeLine();\n return;\n }\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.dir, `${agentName}.md`);\n\n if (existsSync(agentPath)) {\n writeLine(` ${colors.dim}[${i + 1}/${pipeline.agents.length}]${RESET}`);\n await runAgent(agentName, agentPath, squad.dir, 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.dir, `${options.agent}.md`);\n if (existsSync(agentPath)) {\n await runAgent(options.agent, agentPath, squad.dir, 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.dir, `${orchestrator.name}.md`);\n if (existsSync(agentPath)) {\n await runAgent(orchestrator.name, agentPath, squad.dir, 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 writeLine();\n writeLine(` ${colors.dim}Run all agents in parallel:${RESET}`);\n writeLine(` ${colors.dim}$${RESET} squads run ${colors.cyan}${squad.name}${RESET} --parallel`);\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\n/**\n * Lead mode: Single orchestrator session that uses Task tool for parallel work.\n * Benefits over --parallel:\n * - Single session overhead vs N sessions\n * - Lead coordinates and routes work intelligently\n * - Task agents share context when needed\n * - Better parallelization (Claude's native Task tool)\n */\nasync function runLeadMode(\n squad: ReturnType<typeof loadSquad>,\n squadsDir: string,\n options: RunOptions\n): Promise<void> {\n if (!squad) return;\n\n const agentFiles = squad.agents\n .map(a => ({\n name: a.name,\n path: join(squadsDir, squad.dir, `${a.name}.md`),\n role: a.role || '',\n }))\n .filter(a => existsSync(a.path));\n\n if (agentFiles.length === 0) {\n writeLine(` ${icons.error} ${colors.red}No agent files found${RESET}`);\n return;\n }\n\n writeLine(` ${bold}Lead mode${RESET} ${colors.dim}orchestrating ${agentFiles.length} agents${RESET}`);\n writeLine();\n\n // List available agents\n for (const agent of agentFiles) {\n writeLine(` ${icons.empty} ${colors.cyan}${agent.name}${RESET} ${colors.dim}${agent.role}${RESET}`);\n }\n writeLine();\n\n if (!options.execute) {\n writeLine(` ${colors.dim}Launch lead session:${RESET}`);\n writeLine(` ${colors.dim}$${RESET} squads run ${colors.cyan}${squad.name}${RESET} --lead`);\n writeLine();\n return;\n }\n\n // Build the lead prompt\n const timeoutMins = options.timeout || 30;\n const agentList = agentFiles.map(a => `- ${a.name}: ${a.role}`).join('\\n');\n const agentPaths = agentFiles.map(a => `- ${a.name}: ${a.path}`).join('\\n');\n\n const prompt = `You are the Lead of the ${squad.name} squad.\n\n## Mission\n${squad.mission || 'Execute squad operations efficiently.'}\n\n## Available Agents\n${agentList}\n\n## Agent Definition Files\n${agentPaths}\n\n## Your Role as Lead\n\n1. **Assess the situation**: Check for pending work:\n - Run \\`gh issue list --repo agents-squads/hq --label squad:${squad.name}\\` for assigned issues\n - Check .agents/memory/${squad.dir}/ for squad state and pending tasks\n - Review recent activity with \\`git log --oneline -10\\`\n\n2. **Delegate work using Task tool**: For each piece of work:\n - Use the Task tool with subagent_type=\"general-purpose\"\n - Include the agent definition file path in the prompt\n - Spawn multiple Task agents IN PARALLEL when work is independent\n - Example: \"Read ${agentFiles[0]?.path || 'agent.md'} and execute its instructions for [specific task]\"\n\n3. **Coordinate parallel execution**:\n - Independent tasks → spawn Task agents in parallel (single message, multiple tool calls)\n - Dependent tasks → run sequentially\n - Monitor progress and handle failures\n\n4. **Report and update memory**:\n - Update .agents/memory/${squad.dir}/state.md with completed work\n - Log learnings to learnings.md\n - Create issues for follow-up work if needed\n\n## Time Budget\nYou have ${timeoutMins} minutes. Prioritize high-impact work.\n\n## Critical Instructions\n- Use Task tool for delegation, NOT direct execution of agent work\n- Spawn parallel Task agents when work is independent\n- When done, type /exit to end the session\n- Do NOT wait for user input - work autonomously\n\n## Async Mode (CRITICAL)\nThis is ASYNC execution - Task agents must be fully autonomous:\n- **Findings** → Create GitHub issues (gh issue create)\n- **Code changes** → Create PRs (gh pr create)\n- **Analysis results** → Write to .agents/outputs/ or memory files\n- **NEVER wait for human review** - complete the work and move on\n- **NEVER ask clarifying questions** - make reasonable decisions\n\nInstruct each Task agent: \"Work autonomously. Output findings to GitHub issues. Output code changes as PRs. Do not wait for review.\"\n\nBegin by assessing pending work, then delegate to agents via Task tool.`;\n\n // Execute via Claude\n const claudeAvailable = await checkClaudeCliAvailable();\n if (!claudeAvailable) {\n writeLine(` ${colors.yellow}Claude CLI not found${RESET}`);\n writeLine(` ${colors.dim}Install: npm install -g @anthropic-ai/claude-code${RESET}`);\n return;\n }\n\n // Determine execution mode (foreground is default, background is opt-in)\n const isBackground = options.background === true && !options.watch;\n const isWatch = options.watch === true;\n const isForeground = !isBackground && !isWatch;\n\n const modeText = isBackground ? ' (background)' : isWatch ? ' (watch)' : '';\n writeLine(` ${gradient('Launching')} lead session${modeText}...`);\n writeLine();\n\n try {\n // Find lead agent name from agent files or use default\n const leadAgentName = agentFiles.find(a => a.name.includes('lead'))?.name || `${squad.dir}-lead`;\n\n const result = await executeWithClaude(prompt, {\n verbose: options.verbose,\n timeoutMinutes: timeoutMins,\n foreground: options.foreground,\n background: options.background,\n watch: options.watch,\n useApi: options.useApi,\n effort: options.effort,\n skills: options.skills,\n trigger: options.trigger || 'manual',\n squadName: squad.dir,\n agentName: leadAgentName,\n model: options.model,\n });\n\n if (isForeground || isWatch) {\n writeLine();\n writeLine(` ${icons.success} Lead session completed`);\n } else {\n writeLine(` ${icons.success} Lead session launched in background`);\n writeLine(` ${colors.dim}${result}${RESET}`);\n writeLine();\n writeLine(` ${colors.dim}The lead will:${RESET}`);\n writeLine(` ${colors.dim} 1. Assess pending work (issues, memory)${RESET}`);\n writeLine(` ${colors.dim} 2. Spawn Task agents for parallel execution${RESET}`);\n writeLine(` ${colors.dim} 3. Coordinate and report results${RESET}`);\n writeLine();\n writeLine(` ${colors.dim}Monitor: squads workers${RESET}`);\n }\n } catch (error) {\n writeLine(` ${icons.error} ${colors.red}Failed to launch: ${error}${RESET}`);\n }\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 startMs = Date.now();\n const startTime = new Date(startMs).toISOString();\n const executionId = generateExecutionId();\n const taskType = detectTaskType(agentName);\n\n const definition = loadAgentDefinition(agentPath);\n\n // Fetch learnings from bridge (needed for both dry-run preview and real execution)\n const learnings = await fetchLearnings(squadName);\n const learningContext = learnings.length > 0\n ? `\\n## Learnings from Previous Runs\\n${learnings.map(l => `- ${l.content}`).join('\\n')}\\n`\n : '';\n\n if (options.dryRun) {\n spinner.info(`[DRY RUN] Would run ${agentName}`);\n // Show context that would be injected\n const dryRunContext = gatherSquadContext(squadName, agentName, { verbose: options.verbose, agentPath });\n if (options.verbose) {\n writeLine(` ${colors.dim}Agent definition:${RESET}`);\n writeLine(` ${colors.dim}${definition.slice(0, 500)}...${RESET}`);\n if (learnings.length > 0) {\n writeLine(` ${colors.dim}Learnings: ${learnings.length} from bridge${RESET}`);\n }\n if (dryRunContext || learningContext) {\n const fullContext = `${dryRunContext}${learningContext}`;\n writeLine();\n writeLine(` ${colors.cyan}Context to inject (${Math.ceil(fullContext.length / 4)} tokens):${RESET}`);\n writeLine(` ${colors.dim}${fullContext.slice(0, 800)}...${RESET}`);\n }\n }\n return;\n }\n\n // Pre-execution permission validation (Phase 3)\n const squadsDir = findSquadsDir();\n if (squadsDir) {\n const squadFilePath = join(squadsDir, squadName, 'SQUAD.md');\n if (existsSync(squadFilePath)) {\n const squadContent = readFileSync(squadFilePath, 'utf-8');\n const permContext = buildContextFromSquad(squadName, squadContent, agentName);\n\n // Build execution request from agent definition\n // For now, we validate MCP servers mentioned in the agent definition\n const mcpServers = extractMcpServersFromDefinition(definition);\n const execRequest: ExecutionRequest = {\n mcpServers\n };\n\n const permResult = validateExecution(permContext, execRequest);\n\n if (permResult.violations.length > 0) {\n spinner.stop();\n const violationLines = formatViolations(permResult);\n for (const line of violationLines) {\n writeLine(` ${line}`);\n }\n writeLine();\n\n if (!permResult.allowed) {\n writeLine(` ${colors.red}Execution blocked due to permission violations.${RESET}`);\n writeLine(` ${colors.dim}Configure permissions in ${squadFilePath}${RESET}`);\n return;\n }\n }\n }\n }\n\n // Preflight gate check (quota, cooldown) via bridge API\n const preflight = await checkPreflightGates(squadName, agentName);\n\n if (!preflight.allowed) {\n spinner.stop();\n writeLine();\n writeLine(` ${colors.red}${icons.error} Execution blocked by preflight gates${RESET}`);\n\n if (preflight.gates.quota && !preflight.gates.quota.ok) {\n writeLine(` ${colors.dim}Quota: $${preflight.gates.quota.used.toFixed(2)}/$${preflight.gates.quota.limit}/mo limit exceeded${RESET}`);\n }\n\n if (preflight.gates.cooldown && !preflight.gates.cooldown.ok) {\n const elapsed = preflight.gates.cooldown.elapsed_sec;\n const minGap = preflight.gates.cooldown.min_gap_sec;\n writeLine(` ${colors.dim}Cooldown: ${elapsed}s since last run (min: ${minGap}s)${RESET}`);\n }\n\n writeLine();\n return;\n }\n\n // Show preflight status in verbose mode\n if (options.verbose && Object.keys(preflight.gates).length > 0) {\n writeLine(` ${colors.dim}Preflight: quota ${preflight.gates.quota?.ok ? '✓' : '✗'} cooldown ${preflight.gates.cooldown?.ok ? '✓' : '✗'}${RESET}`);\n }\n\n // Local cooldown check (when bridge is unavailable or has no execution history)\n // Skip for manual triggers - only enforce for scheduled/cron runs\n const isScheduledRun = options.trigger === 'scheduled' || options.trigger === 'smart';\n const bridgeHasNoHistory = preflight.gates.cooldown?.elapsed_sec === null;\n if (isScheduledRun && (!preflight.gates.cooldown || bridgeHasNoHistory)) {\n // Default cooldown: 6 hours for scheduled runs\n const defaultCooldownMs = 6 * 60 * 60 * 1000;\n const localCooldown = checkLocalCooldown(squadName, agentName, defaultCooldownMs);\n\n if (!localCooldown.ok) {\n spinner.stop();\n writeLine();\n writeLine(` ${colors.yellow}${icons.warning} Skipping: cooldown not elapsed${RESET}`);\n writeLine(` ${colors.dim}Last run: ${formatDuration(localCooldown.elapsedMs!)} ago (cooldown: ${formatDuration(localCooldown.cooldownMs)})${RESET}`);\n writeLine();\n return;\n }\n\n if (options.verbose) {\n writeLine(` ${colors.dim}Local cooldown: ✓ (${formatDuration(localCooldown.elapsedMs || 0)} since last run)${RESET}`);\n }\n }\n\n // Log execution start\n logExecution({\n squadName,\n agentName,\n executionId,\n startTime,\n status: 'running',\n trigger: options.trigger || 'manual',\n taskType,\n });\n\n if (options.verbose && learnings.length > 0) {\n writeLine(` ${colors.dim}Injecting ${learnings.length} learnings${RESET}`);\n }\n\n // Load approval/escalation instructions\n const approvalInstructions = loadApprovalInstructions();\n const approvalContext = approvalInstructions\n ? `\\n${approvalInstructions}\\n`\n : '';\n\n // Gather squad context (SQUAD.md, agent state, briefs)\n const squadContext = gatherSquadContext(squadName, agentName, { verbose: options.verbose, agentPath });\n\n // Generate the Claude Code prompt with timeout awareness\n const timeoutMins = options.timeout || 30;\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\nTOOL PREFERENCE: Always prefer CLI tools over MCP servers when both can accomplish the task:\n- Use \\`squads\\` CLI for squad operations (run, memory, status, feedback)\n- Use \\`gh\\` CLI for GitHub (issues, PRs, repos)\n- Use \\`git\\` CLI for version control\n- Use Bash for file operations, builds, tests\n- Only use MCP tools when CLI cannot do it or MCP is significantly better\n${squadContext}${learningContext}${approvalContext}\nTIME LIMIT: You have ${timeoutMins} minutes. Work efficiently:\n- Focus on the most important tasks first\n- If a task is taking too long, move on and note it for next run\n- Aim to complete within ${Math.floor(timeoutMins * 0.7)} minutes\n\nAfter completion:\n\n## 1. Create a branch for your work\nBEFORE making any changes, create a descriptive branch:\n\n\\`\\`\\`bash\n# Pick a type based on what you're doing:\n# feat/ — new deliverables, research, features\n# fix/ — bug fixes, corrections\n# docs/ — documentation\n# solve/issue-{n} — solving a specific GitHub issue\ngit checkout -b {type}/{short-description}\n\\`\\`\\`\n\nExamples: \\`feat/agent-orchestration-research\\`, \\`fix/auth-timeout\\`, \\`solve/issue-42\\`\nThe branch name should describe the WORK, not you.\n\n## 2. Commit with Conventional Commits\n\\`\\`\\`bash\ngit add .agents/memory/${squadName}/${agentName}/\ngit commit -m \"memory(${squadName}): ${agentName} state update\n\nCo-Authored-By: Claude <noreply@anthropic.com>\"\n\ngit add -A\ngit commit -m \"feat(${squadName}): {describe what was created}\n\nCo-Authored-By: Claude <noreply@anthropic.com>\"\n\\`\\`\\`\n\nTypes: \\`feat\\`, \\`fix\\`, \\`docs\\`, \\`chore\\`, \\`memory\\`, \\`refactor\\`, \\`test\\`\n\n## 3. NEVER commit to main\n- Do NOT commit to \\`main\\` directly\n- Do NOT push to \\`main\\`\n- All work goes on your branch\n- If a remote exists, push your branch and open a PR\n\n## 3. Summarize what was accomplished\n\nCRITICAL: When you have completed your tasks OR reached the time limit:\n- Type /exit immediately to end this session\n- Do NOT wait for user input\n- Do NOT ask follow-up questions\n- Just /exit when done`;\n\n // Resolve provider with full chain:\n // 1. Agent config (from agent file frontmatter/header)\n // 2. CLI option (--provider flag)\n // 3. Squad default (from SQUAD.md providers.default)\n // 4. Fallback to 'anthropic'\n const agentProvider = parseAgentProvider(agentPath);\n const squad = loadSquad(squadName);\n const squadDefaultProvider = squad?.providers?.default;\n\n const provider = agentProvider || options.provider || squadDefaultProvider || 'anthropic';\n const isAnthropic = provider === 'anthropic';\n\n if (options.verbose && (agentProvider || squadDefaultProvider)) {\n writeLine(` ${colors.dim}Provider resolution:${RESET}`);\n if (agentProvider) writeLine(` ${colors.dim}Agent: ${agentProvider}${RESET}`);\n if (options.provider) writeLine(` ${colors.dim}CLI: ${options.provider}${RESET}`);\n if (squadDefaultProvider) writeLine(` ${colors.dim}Squad: ${squadDefaultProvider}${RESET}`);\n writeLine(` ${colors.dim}→ Using: ${provider}${RESET}`);\n }\n\n // Check CLI availability\n const cliAvailable = isAnthropic\n ? await checkClaudeCliAvailable()\n : isProviderCLIAvailable(provider);\n\n if (options.execute && cliAvailable) {\n const cliConfig = getCLIConfig(provider);\n const cliName = cliConfig?.displayName || provider;\n\n // Determine execution mode (foreground is default, background is opt-in)\n const isBackground = options.background === true && !options.watch;\n const isWatch = options.watch === true;\n const isForeground = !isBackground && !isWatch;\n\n spinner.text = isBackground\n ? `Launching ${agentName} with ${cliName} in background...`\n : isWatch\n ? `Starting ${agentName} with ${cliName} (watch mode)...`\n : `Running ${agentName} with ${cliName}...`;\n\n // Parse frontmatter for verification criteria (Ralph loop)\n const frontmatter = parseAgentFrontmatter(agentPath);\n const hasCriteria = !!frontmatter.acceptance_criteria && options.verify !== false;\n const maxRetries = frontmatter.max_retries ?? 2;\n let currentPrompt = prompt;\n\n for (let attempt = 0; attempt <= (hasCriteria ? maxRetries : 0); attempt++) {\n try {\n let result: string;\n\n if (isAnthropic) {\n result = await executeWithClaude(currentPrompt, {\n verbose: options.verbose,\n timeoutMinutes: options.timeout || 30,\n foreground: options.foreground,\n background: options.background,\n watch: options.watch,\n useApi: options.useApi,\n effort: options.effort,\n skills: options.skills,\n trigger: options.trigger || 'manual',\n squadName,\n agentName,\n model: options.model,\n });\n } else {\n result = await executeWithProvider(provider, currentPrompt, {\n verbose: options.verbose,\n foreground: !isBackground,\n squadName,\n agentName,\n });\n }\n\n // Ralph loop: verify foreground execution against acceptance criteria\n if (hasCriteria && (isForeground || isWatch)) {\n const verification = await verifyExecution(\n squadName, agentName, frontmatter.acceptance_criteria!, { verbose: options.verbose }\n );\n if (!verification.passed && attempt < maxRetries) {\n writeLine(` ${colors.yellow}Verification: FAIL - ${verification.reason}${RESET}`);\n writeLine(` ${colors.dim}Retrying (${attempt + 1}/${maxRetries})...${RESET}`);\n currentPrompt = `${prompt}\\n\\n## PREVIOUS ATTEMPT FAILED\\nVerification found: ${verification.reason}\\nPlease address this issue and try again.`;\n continue;\n }\n if (verification.passed) {\n writeLine(` ${colors.green}Verification: PASS - ${verification.reason}${RESET}`);\n }\n }\n\n // Emit completion event (non-blocking)\n emitExecutionEvent('agent.completed', {\n squad: squadName, agent: agentName, executionId,\n }).catch(() => {});\n\n if (isForeground || isWatch) {\n spinner.succeed(`Agent ${agentName} completed (${cliName})`);\n } else {\n spinner.succeed(`Agent ${agentName} launched in background (${cliName})`);\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 }\n break; // Success — exit retry loop\n } catch (error) {\n // Emit failure event (non-blocking)\n emitExecutionEvent('agent.failed', {\n squad: squadName, agent: agentName, executionId, error: String(error),\n }).catch(() => {});\n\n spinner.fail(`Agent ${agentName} failed to launch`);\n updateExecutionStatus(squadName, agentName, executionId, 'failed', {\n error: String(error),\n durationMs: Date.now() - startMs,\n });\n writeLine(` ${colors.red}${String(error)}${RESET}`);\n break; // Error — exit retry loop\n }\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 (!cliAvailable) {\n const cliConfig = getCLIConfig(provider);\n writeLine();\n writeLine(` ${colors.yellow}${cliConfig?.command || provider} CLI not found${RESET}`);\n writeLine(` ${colors.dim}Install: ${cliConfig?.install || 'squads providers'}${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}`);\n if (provider !== 'anthropic') {\n writeLine(` ${colors.dim}$${RESET} squads run ${colors.cyan}${squadName}${RESET} -a ${colors.cyan}${agentName}${RESET} --provider=${provider}`);\n }\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\n/**\n * Pre-flight check for the executor (Claude Code or other provider CLI).\n * Runs once at the start of `squads run` before any agent execution.\n * Checks:\n * 1. CLI binary is available on PATH\n * 2. Authentication looks configured (credentials file or API key)\n * Skippable with SQUADS_SKIP_CHECKS=1 env var (for CI/CD).\n * Returns true if checks pass (or are skipped), false if execution should abort.\n */\nasync function preflightExecutorCheck(provider: string): Promise<boolean> {\n // Allow skipping for CI/CD or advanced users\n if (process.env.SQUADS_SKIP_CHECKS === '1') {\n return true;\n }\n\n const isAnthropic = provider === 'anthropic';\n\n // --- Check 1: CLI binary on PATH ---\n let cliFound: boolean;\n\n if (isAnthropic) {\n cliFound = await checkClaudeCliAvailable();\n } else {\n cliFound = isProviderCLIAvailable(provider);\n }\n\n if (!cliFound) {\n const cliConfig = getCLIConfig(provider);\n const cliName = cliConfig?.command || provider;\n const installCmd = cliConfig?.install || `See ${provider} documentation`;\n\n writeLine();\n writeLine(` ${icons.error} ${colors.red}${cliName} CLI not found${RESET}`);\n writeLine();\n writeLine(` ${colors.dim}The ${cliName} command is required to run agents but was not found on your PATH.${RESET}`);\n writeLine();\n writeLine(` ${colors.cyan}Install:${RESET} ${installCmd}`);\n writeLine();\n writeLine(` ${colors.dim}Skip this check: SQUADS_SKIP_CHECKS=1 squads run ...${RESET}`);\n writeLine();\n return false;\n }\n\n // --- Check 2: Authentication (Anthropic only — other providers handle auth internally) ---\n if (isAnthropic) {\n const hasApiKey = !!process.env.ANTHROPIC_API_KEY;\n\n // Check for OAuth credentials (Max subscription or claude login)\n const home = homedir();\n const credentialsPath = join(home, '.claude', '.credentials.json');\n const hasOAuthCreds = existsSync(credentialsPath);\n\n if (!hasApiKey && !hasOAuthCreds) {\n writeLine();\n writeLine(` ${icons.warning} ${colors.yellow}Claude Code authentication not detected${RESET}`);\n writeLine();\n writeLine(` ${colors.dim}No ANTHROPIC_API_KEY env var and no OAuth credentials found.${RESET}`);\n writeLine(` ${colors.dim}Agents may fail to authenticate with the Anthropic API.${RESET}`);\n writeLine();\n writeLine(` ${colors.cyan}Option 1:${RESET} ${colors.dim}Run${RESET} claude ${colors.dim}and complete the login flow${RESET}`);\n writeLine(` ${colors.cyan}Option 2:${RESET} ${colors.dim}Set ANTHROPIC_API_KEY env var to your API key${RESET}`);\n writeLine();\n writeLine(` ${colors.dim}Skip this check: SQUADS_SKIP_CHECKS=1 squads run ...${RESET}`);\n writeLine();\n return false;\n }\n }\n\n return true;\n}\n\ninterface ExecuteWithClaudeOptions {\n verbose?: boolean;\n timeoutMinutes?: number;\n foreground?: boolean; // Deprecated, now default\n background?: boolean; // Opt-in background mode\n watch?: boolean; // Background but tail log\n useApi?: boolean;\n effort?: EffortLevel;\n skills?: string[];\n trigger?: ExecutionContext['trigger'];\n squadName: string;\n agentName: string;\n model?: string; // Model to use (Claude aliases or full model IDs like gemini-2.5-flash)\n}\n\nasync function executeWithClaude(\n prompt: string,\n options: ExecuteWithClaudeOptions\n): Promise<string> {\n const {\n verbose,\n timeoutMinutes: _timeoutMinutes = 30,\n foreground,\n background,\n watch,\n useApi,\n effort,\n skills,\n trigger = 'manual',\n squadName,\n agentName,\n model,\n } = options;\n\n // Determine execution mode:\n // - Default is foreground (visible output)\n // - --background (-b) runs detached\n // - --watch (-w) runs detached but tails log\n // - --foreground (-f) is deprecated (now default)\n const runInBackground = background === true && !watch;\n const runInWatch = watch === true;\n const runInForeground = !runInBackground && !runInWatch;\n\n // Track start time for status updates\n const startMs = Date.now();\n\n // Ensure the project is trusted (prevents workspace trust dialog)\n const projectRoot = getProjectRoot();\n ensureProjectTrusted(projectRoot);\n\n // Load squad for context-based MCP config resolution\n const squad = squadName !== 'unknown' ? loadSquad(squadName) : null;\n\n // Select MCP config based on squad context (dynamic) or legacy mapping (fallback)\n const mcpConfigPath = selectMcpConfig(squadName, squad);\n\n // Detect task type for telemetry and model routing\n const taskType = detectTaskType(agentName);\n\n // Resolve model: explicit --model > squad context routing > undefined (provider default)\n const resolvedModel = resolveModel(model, squad, taskType);\n\n // Detect provider from model (defaults to anthropic if no model specified)\n const detectedProvider = resolvedModel ? detectProviderFromModel(resolvedModel) : 'anthropic';\n\n // For non-Anthropic providers, delegate to executeWithProvider\n if (detectedProvider !== 'anthropic' && detectedProvider !== 'unknown') {\n if (verbose) {\n const source = model ? 'explicit' : 'auto-routed';\n writeLine(` ${colors.dim}Model: ${resolvedModel} (${source})${RESET}`);\n writeLine(` ${colors.dim}Provider: ${detectedProvider}${RESET}`);\n }\n\n return executeWithProvider(detectedProvider, prompt, {\n verbose,\n foreground,\n cwd: getProjectRoot(),\n squadName,\n agentName,\n });\n }\n\n // For Anthropic, convert full model name to Claude Code alias\n const claudeModelAlias = resolvedModel ? getClaudeModelAlias(resolvedModel) : undefined;\n\n // Build execution context for telemetry\n const execContext: ExecutionContext = {\n squad: squadName,\n agent: agentName,\n taskType,\n trigger,\n executionId: generateExecutionId(),\n };\n\n // Build env: remove ANTHROPIC_API_KEY unless --use-api is set\n // This ensures Claude uses OAuth subscription by default\n // Also remove CLAUDECODE to allow spawning from within Claude Code sessions\n const { ANTHROPIC_API_KEY: _apiKey, CLAUDECODE: _claudeCode, ...envWithoutApiKey } = process.env;\n const spawnEnv = useApi\n ? (() => { const { CLAUDECODE: _, ...rest } = process.env; return rest; })()\n : envWithoutApiKey;\n\n // Escape prompt for shell\n const escapedPrompt = prompt.replace(/'/g, \"'\\\\''\");\n\n // Register context with bridge for telemetry (non-blocking)\n await registerContextWithBridge(execContext);\n\n // Foreground mode: run Claude directly in the terminal (default)\n if (runInForeground) {\n if (verbose) {\n writeLine(` ${colors.dim}Project: ${projectRoot}${RESET}`);\n writeLine(` ${colors.dim}Mode: foreground${RESET}`);\n writeLine(` ${colors.dim}Auth: ${useApi ? 'API credits' : 'subscription'}${RESET}`);\n writeLine(` ${colors.dim}Execution: ${execContext.executionId}${RESET}`);\n writeLine(` ${colors.dim}Task type: ${execContext.taskType}${RESET}`);\n writeLine(` ${colors.dim}Trigger: ${execContext.trigger}${RESET}`);\n if (effort) {\n writeLine(` ${colors.dim}Effort: ${effort}${RESET}`);\n }\n if (skills && skills.length > 0) {\n writeLine(` ${colors.dim}Skills: ${skills.join(', ')}${RESET}`);\n }\n if (resolvedModel || claudeModelAlias) {\n const source = model ? 'explicit' : 'auto-routed';\n const displayModel = resolvedModel || claudeModelAlias;\n writeLine(` ${colors.dim}Model: ${displayModel} (${source})${RESET}`);\n }\n }\n\n // Build claude args as array to avoid shell escaping issues with large prompts.\n // Previous approach embedded the prompt in a shell string, which broke when\n // the prompt contained characters that interfered with shell quoting.\n const claudeArgs: string[] = [];\n // Use --print when stdin is not a TTY (cron, systemd, pipe) to prevent Claude\n // from entering interactive mode and hanging.\n if (!process.stdin.isTTY) claudeArgs.push('--print');\n claudeArgs.push('--dangerously-skip-permissions');\n if (mcpConfigPath) claudeArgs.push('--mcp-config', mcpConfigPath);\n if (claudeModelAlias) claudeArgs.push('--model', claudeModelAlias);\n claudeArgs.push('--', prompt); // raw prompt, no shell escaping needed\n\n // Pass env vars via spawn env option to avoid shell injection\n const agentEnv: Record<string, string> = {\n ...spawnEnv as Record<string, string>,\n SQUADS_SQUAD: execContext.squad,\n SQUADS_AGENT: execContext.agent,\n SQUADS_TASK_TYPE: execContext.taskType,\n SQUADS_TRIGGER: execContext.trigger,\n SQUADS_EXECUTION_ID: execContext.executionId,\n BRIDGE_API: process.env.SQUADS_BRIDGE_URL || 'http://localhost:8088',\n OTEL_RESOURCE_ATTRIBUTES: `squads.squad=${execContext.squad},squads.agent=${execContext.agent},squads.task_type=${execContext.taskType},squads.trigger=${execContext.trigger},squads.execution_id=${execContext.executionId}`,\n ...(effort ? { CLAUDE_EFFORT: effort } : {}),\n ...(skills && skills.length > 0 ? { CLAUDE_SKILLS: skills.join(',') } : {}),\n };\n\n // Create isolated worktree for this agent execution\n const fgTimestamp = Date.now();\n const fgBranchName = `agent/${squadName}/${agentName}-${fgTimestamp}`;\n const fgWorktreePath = join(projectRoot, '..', '.worktrees', `${squadName}-${agentName}-${fgTimestamp}`);\n let fgWorkDir = projectRoot;\n try {\n mkdirSync(join(projectRoot, '..', '.worktrees'), { recursive: true });\n execSync(`git worktree add '${fgWorktreePath}' -b '${fgBranchName}' HEAD`, { cwd: projectRoot, stdio: 'pipe' });\n fgWorkDir = fgWorktreePath;\n } catch {\n // Worktree creation failed — fall back to project root\n }\n\n return new Promise((resolve, reject) => {\n const claude = spawn('claude', claudeArgs, {\n stdio: 'inherit',\n cwd: fgWorkDir,\n env: agentEnv,\n });\n\n claude.on('close', async (code) => {\n const durationMs = Date.now() - startMs;\n\n if (code === 0) {\n // Update execution status to completed\n updateExecutionStatus(squadName, agentName, execContext.executionId, 'completed', {\n outcome: 'Session completed successfully',\n durationMs,\n });\n\n // Auto-commit any changes made by the agent\n const commitResult = await autoCommitAgentWork(squadName, agentName, execContext.executionId);\n if (commitResult.committed) {\n writeLine();\n writeLine(` ${colors.green}Auto-committed agent work${RESET}`);\n }\n\n resolve('Session completed');\n } else {\n // Update execution status to failed\n updateExecutionStatus(squadName, agentName, execContext.executionId, 'failed', {\n error: `Claude exited with code ${code}`,\n durationMs,\n });\n reject(new Error(`Claude exited with code ${code}`));\n }\n });\n\n claude.on('error', (err) => {\n const durationMs = Date.now() - startMs;\n updateExecutionStatus(squadName, agentName, execContext.executionId, 'failed', {\n error: String(err),\n durationMs,\n });\n reject(err);\n });\n });\n }\n\n // Watch mode: run in background but tail the log\n if (runInWatch) {\n const timestamp = Date.now();\n const logDir = join(projectRoot, '.agents', 'logs', squadName);\n const logFile = join(logDir, `${agentName}-${timestamp}.log`);\n const pidFile = join(logDir, `${agentName}-${timestamp}.pid`);\n\n // Ensure log directory exists\n if (!existsSync(logDir)) {\n mkdirSync(logDir, { recursive: true });\n }\n\n if (verbose) {\n writeLine(` ${colors.dim}Project: ${projectRoot}${RESET}`);\n writeLine(` ${colors.dim}Mode: watch (background + tail)${RESET}`);\n writeLine(` ${colors.dim}Log: ${logFile}${RESET}`);\n }\n\n // Pass env vars via spawn env option to avoid shell injection\n const watchEnv: Record<string, string> = {\n ...spawnEnv as Record<string, string>,\n SQUADS_SQUAD: execContext.squad,\n SQUADS_AGENT: execContext.agent,\n SQUADS_TASK_TYPE: execContext.taskType,\n SQUADS_TRIGGER: execContext.trigger,\n SQUADS_EXECUTION_ID: execContext.executionId,\n BRIDGE_API: process.env.SQUADS_BRIDGE_URL || 'http://localhost:8088',\n };\n\n const modelFlag = claudeModelAlias ? `--model ${claudeModelAlias}` : '';\n const watchBranchName = `agent/${squadName}/${agentName}-${timestamp}`;\n const watchWorktreeDir = `\\${PROJECT_ROOT}/../.worktrees/${squadName}-${agentName}-${timestamp}`;\n const shellScript = `PROJECT_ROOT='${projectRoot}'; mkdir -p \"\\${PROJECT_ROOT}/../.worktrees\"; WORK_DIR=\"\\${PROJECT_ROOT}\"; if git -C \"\\${PROJECT_ROOT}\" worktree add '${watchWorktreeDir}' -b '${watchBranchName}' HEAD 2>/dev/null; then WORK_DIR='${watchWorktreeDir}'; fi; cd \"\\${WORK_DIR}\"; exec claude --print --dangerously-skip-permissions ${modelFlag} -- '${escapedPrompt}' > '${logFile}' 2>&1`;\n const wrapperScript = `echo $$ > '${pidFile}'; ${shellScript}`;\n\n // Spawn background process\n const child = spawn('sh', ['-c', wrapperScript], {\n cwd: projectRoot,\n detached: true,\n stdio: 'ignore',\n env: watchEnv,\n });\n child.unref();\n\n // Wait a moment for the log file to be created\n await new Promise(resolve => setTimeout(resolve, 500));\n\n // Tail the log file\n writeLine(` ${colors.dim}Tailing log (Ctrl+C to stop watching, agent continues)...${RESET}`);\n writeLine();\n\n const tail = spawn('tail', ['-f', logFile], { stdio: 'inherit' });\n\n // Handle Ctrl+C gracefully\n process.on('SIGINT', () => {\n tail.kill();\n writeLine();\n writeLine(` ${colors.dim}Stopped watching. Agent continues in background.${RESET}`);\n writeLine(` ${colors.dim}Resume: tail -f ${logFile}${RESET}`);\n process.exit(0);\n });\n\n // Wait for tail to exit (which won't happen unless killed)\n return new Promise((resolve) => {\n tail.on('close', () => {\n resolve(`Agent running in background. Log: ${logFile}`);\n });\n });\n }\n\n // Background mode (--background): run detached with log file\n // This is now opt-in behavior, not default\n const timestamp = Date.now();\n const logDir = join(projectRoot, '.agents', 'logs', squadName);\n const logFile = join(logDir, `${agentName}-${timestamp}.log`);\n const pidFile = join(logDir, `${agentName}-${timestamp}.pid`);\n\n // Ensure log directory exists\n if (!existsSync(logDir)) {\n mkdirSync(logDir, { recursive: true });\n }\n\n if (verbose) {\n writeLine(` ${colors.dim}Project: ${projectRoot}${RESET}`);\n writeLine(` ${colors.dim}Log: ${logFile}${RESET}`);\n writeLine(` ${colors.dim}MCP config: ${mcpConfigPath}${RESET}`);\n writeLine(` ${colors.dim}Auth: ${useApi ? 'API credits' : 'subscription'}${RESET}`);\n writeLine(` ${colors.dim}Execution: ${execContext.executionId}${RESET}`);\n writeLine(` ${colors.dim}Task type: ${execContext.taskType}${RESET}`);\n writeLine(` ${colors.dim}Trigger: ${execContext.trigger}${RESET}`);\n if (effort) {\n writeLine(` ${colors.dim}Effort: ${effort}${RESET}`);\n }\n if (skills && skills.length > 0) {\n writeLine(` ${colors.dim}Skills: ${skills.join(', ')}${RESET}`);\n }\n if (resolvedModel || claudeModelAlias) {\n const source = model ? 'explicit' : 'auto-routed';\n const displayModel = resolvedModel || claudeModelAlias;\n writeLine(` ${colors.dim}Model: ${displayModel} (${source})${RESET}`);\n }\n }\n\n // Build Claude command with all permissions bypassed for autonomous execution\n // --print ensures non-interactive mode (exits after completion, no REPL)\n // Use shell 'exec' to replace shell with claude while keeping file redirect\n // This ensures output goes to log even after parent exits\n // Pass env vars via spawn env option to avoid shell injection\n const bgEnv: Record<string, string> = {\n ...spawnEnv as Record<string, string>,\n SQUADS_SQUAD: execContext.squad,\n SQUADS_AGENT: execContext.agent,\n SQUADS_TASK_TYPE: execContext.taskType,\n SQUADS_TRIGGER: execContext.trigger,\n SQUADS_EXECUTION_ID: execContext.executionId,\n BRIDGE_API: process.env.SQUADS_BRIDGE_URL || 'http://localhost:8088',\n OTEL_RESOURCE_ATTRIBUTES: `squads.squad=${execContext.squad},squads.agent=${execContext.agent},squads.task_type=${execContext.taskType},squads.trigger=${execContext.trigger},squads.execution_id=${execContext.executionId}`,\n ...(effort ? { CLAUDE_EFFORT: effort } : {}),\n ...(skills && skills.length > 0 ? { CLAUDE_SKILLS: skills.join(',') } : {}),\n };\n\n // Build shell command:\n // 1. Create isolated worktree for this agent (prevents branch collisions)\n // 2. cd to worktree (or project root as fallback)\n // 3. run claude (output to logfile)\n // Note: MCP config removed - causes blocking issues in background execution\n const modelFlag = claudeModelAlias ? `--model ${claudeModelAlias}` : '';\n const bgBranchName = `agent/${squadName}/${agentName}-${timestamp}`;\n const bgWorktreeDir = `${projectRoot}/../.worktrees/${squadName}-${agentName}-${timestamp}`;\n const shellScript = `mkdir -p '${projectRoot}/../.worktrees'; WORK_DIR='${projectRoot}'; if git -C '${projectRoot}' worktree add '${bgWorktreeDir}' -b '${bgBranchName}' HEAD 2>/dev/null; then WORK_DIR='${bgWorktreeDir}'; fi; cd \"\\${WORK_DIR}\"; claude --print --dangerously-skip-permissions ${modelFlag} -- '${escapedPrompt}' > '${logFile}' 2>&1`;\n\n\n // Get child PID by using a wrapper that writes PID then execs\n const wrapperScript = `echo $$ > '${pidFile}'; ${shellScript}`;\n\n const child = spawn('sh', ['-c', wrapperScript], {\n cwd: projectRoot,\n detached: true,\n stdio: 'ignore',\n env: bgEnv,\n });\n\n child.unref();\n\n if (verbose) {\n writeLine(` ${colors.dim}Monitor: tail -f ${logFile}${RESET}`);\n }\n\n return `Log: ${logFile}. Monitor: tail -f ${logFile}`;\n}\n\n/**\n * Execute agent with a non-Anthropic LLM CLI provider.\n *\n * Supports: google (gemini), openai (codex), mistral (vibe), xai (grok), aider, ollama\n *\n * Unlike executeWithClaude which has full session management,\n * other CLIs run in simpler non-interactive mode.\n */\nasync function executeWithProvider(\n provider: string,\n prompt: string,\n options: {\n verbose?: boolean;\n foreground?: boolean;\n cwd?: string;\n squadName?: string;\n agentName?: string;\n }\n): Promise<string> {\n const cliConfig = getCLIConfig(provider);\n\n if (!cliConfig) {\n throw new Error(`Unknown provider: ${provider}. Run 'squads providers' to see available providers.`);\n }\n\n if (!isProviderCLIAvailable(provider)) {\n throw new Error(`CLI '${cliConfig.command}' not found. Install: ${cliConfig.install}`);\n }\n\n const projectRoot = options.cwd || getProjectRoot();\n const args = cliConfig.buildArgs(prompt);\n const squadName = options.squadName || 'unknown';\n const agentName = options.agentName || 'unknown';\n const timestamp = Date.now();\n\n // Build clean env: remove CLAUDECODE to allow nesting, pass squad context\n const { CLAUDECODE: _claudeCode, ...cleanEnv } = process.env;\n const providerEnv = {\n ...cleanEnv,\n SQUADS_SQUAD: squadName,\n SQUADS_AGENT: agentName,\n SQUADS_PROVIDER: provider,\n };\n\n // Create isolated worktree for this agent (same pattern as executeWithClaude)\n const branchName = `agent/${squadName}/${agentName}-${timestamp}`;\n const worktreePath = join(projectRoot, '..', '.worktrees', `${squadName}-${agentName}-${timestamp}`);\n let workDir = projectRoot;\n try {\n mkdirSync(join(projectRoot, '..', '.worktrees'), { recursive: true });\n execSync(`git worktree add '${worktreePath}' -b '${branchName}' HEAD`, { cwd: projectRoot, stdio: 'pipe' });\n workDir = worktreePath;\n } catch {\n // Worktree creation failed — fall back to project root\n }\n\n if (options.verbose) {\n writeLine(` ${colors.dim}Provider: ${cliConfig.displayName}${RESET}`);\n writeLine(` ${colors.dim}Command: ${cliConfig.command} ${args.join(' ').slice(0, 50)}...${RESET}`);\n writeLine(` ${colors.dim}CWD: ${workDir}${RESET}`);\n if (workDir !== projectRoot) {\n writeLine(` ${colors.dim}Worktree: ${branchName}${RESET}`);\n }\n }\n\n // Foreground mode: run directly in terminal\n if (options.foreground) {\n return new Promise((resolve, reject) => {\n const proc = spawn(cliConfig.command, args, {\n stdio: 'inherit',\n cwd: workDir,\n env: providerEnv,\n });\n\n proc.on('close', (code) => {\n if (code === 0) {\n resolve('Session completed');\n } else {\n reject(new Error(`${cliConfig.command} exited with code ${code}`));\n }\n });\n\n proc.on('error', (err) => {\n reject(err);\n });\n });\n }\n\n // Background mode: run detached with log file (matches executeWithClaude pattern)\n const logDir = join(projectRoot, '.agents', 'logs', squadName);\n const logFile = join(logDir, `${agentName}-${timestamp}.log`);\n const pidFile = join(logDir, `${agentName}-${timestamp}.pid`);\n\n if (!existsSync(logDir)) {\n mkdirSync(logDir, { recursive: true });\n }\n\n const escapedPrompt = prompt.replace(/'/g, \"'\\\\''\");\n const providerArgs = cliConfig.buildArgs(escapedPrompt).map(a => `'${a}'`).join(' ');\n const shellScript = `cd '${workDir}' && ${cliConfig.command} ${providerArgs} > '${logFile}' 2>&1`;\n const wrapperScript = `echo $$ > '${pidFile}'; ${shellScript}`;\n\n const child = spawn('sh', ['-c', wrapperScript], {\n cwd: workDir,\n detached: true,\n stdio: 'ignore',\n env: providerEnv,\n });\n\n child.unref();\n\n if (options.verbose) {\n writeLine(` ${colors.dim}Log: ${logFile}${RESET}`);\n writeLine(` ${colors.dim}PID file: ${pidFile}${RESET}`);\n }\n\n return `Log: ${logFile}. Monitor: tail -f ${logFile}`;\n}\n\nexport async function runSquadCommand(\n squadName: string,\n options: RunOptions\n): Promise<void> {\n return runCommand(squadName, options);\n}\n","/**\n * Permission Engine for Squad Execution\n *\n * Phase 3 of the Squads as Execution Contexts RFC (#110)\n *\n * Validates execution requests against squad-defined permissions:\n * - Bash command allowlists\n * - File path permissions (read/write globs)\n * - MCP server allow/deny lists\n *\n * Supports three enforcement modes:\n * - warn: Log violations, continue execution\n * - strict: Block on any violation\n * - audit: Log to trail, continue execution\n */\n\nimport { minimatch } from 'minimatch';\n\nexport type EnforcementMode = 'warn' | 'strict' | 'audit';\n\n/**\n * Squad context for permission validation\n * Populated from SQUAD.md context YAML block (Phase 1)\n */\nexport interface SquadContext {\n squad: string;\n agent?: string;\n\n permissions: {\n mode: EnforcementMode;\n bash: string[]; // Allowed bash commands (e.g., ['npm', 'git', 'vercel'])\n write: string[]; // Write path globs (e.g., ['agents-squads-web/**'])\n read: string[]; // Read path globs (e.g., ['hq/.agents/**'])\n mcp: {\n allow: string[]; // Allowed MCP servers\n deny: string[]; // Denied MCP servers (takes precedence)\n };\n };\n}\n\n/**\n * Execution request to validate\n */\nexport interface ExecutionRequest {\n // Bash commands the agent might run\n bashCommands?: string[];\n\n // File paths to write\n writePaths?: string[];\n\n // File paths to read\n readPaths?: string[];\n\n // MCP servers to use\n mcpServers?: string[];\n}\n\n/**\n * Result of permission validation\n */\nexport interface PermissionResult {\n allowed: boolean;\n violations: PermissionViolation[];\n mode: EnforcementMode;\n}\n\n/**\n * Details of a permission violation\n */\nexport interface PermissionViolation {\n type: 'bash' | 'write' | 'read' | 'mcp';\n requested: string;\n reason: string;\n severity: 'error' | 'warning';\n}\n\n/**\n * Default permissive context for squads without explicit permissions\n */\nexport function getDefaultContext(squad: string, agent?: string): SquadContext {\n return {\n squad,\n agent,\n permissions: {\n mode: 'warn',\n bash: ['*'], // All commands allowed by default\n write: ['**'], // All paths writable by default\n read: ['**'], // All paths readable by default\n mcp: {\n allow: ['*'], // All MCP servers allowed\n deny: []\n }\n }\n };\n}\n\n/**\n * Check if a bash command is allowed\n */\nfunction validateBashCommand(\n command: string,\n allowedCommands: string[]\n): PermissionViolation | null {\n // Extract the base command (first word)\n const baseCommand = command.trim().split(/\\s+/)[0];\n\n // Check if wildcard allows all\n if (allowedCommands.includes('*')) {\n return null;\n }\n\n // Check if command is in allowlist\n const isAllowed = allowedCommands.some(allowed => {\n if (allowed === baseCommand) return true;\n // Support glob patterns\n if (allowed.includes('*')) {\n return minimatch(baseCommand, allowed);\n }\n return false;\n });\n\n if (!isAllowed) {\n return {\n type: 'bash',\n requested: baseCommand,\n reason: `Bash command '${baseCommand}' not in allowlist: [${allowedCommands.join(', ')}]`,\n severity: 'error'\n };\n }\n\n return null;\n}\n\n/**\n * Check if a file path matches any of the allowed globs\n */\nfunction validateFilePath(\n path: string,\n allowedGlobs: string[],\n operation: 'read' | 'write'\n): PermissionViolation | null {\n // Wildcard allows all\n if (allowedGlobs.includes('**') || allowedGlobs.includes('*')) {\n return null;\n }\n\n // Check against each glob\n const isAllowed = allowedGlobs.some(glob => minimatch(path, glob));\n\n if (!isAllowed) {\n return {\n type: operation,\n requested: path,\n reason: `${operation === 'write' ? 'Write' : 'Read'} to '${path}' not allowed. Permitted paths: [${allowedGlobs.join(', ')}]`,\n severity: 'error'\n };\n }\n\n return null;\n}\n\n/**\n * Check if an MCP server is allowed\n */\nfunction validateMcpServer(\n server: string,\n allow: string[],\n deny: string[]\n): PermissionViolation | null {\n // Deny list takes precedence\n const isDenied = deny.some(pattern => {\n if (pattern === server) return true;\n if (pattern.includes('*')) return minimatch(server, pattern);\n return false;\n });\n\n if (isDenied) {\n return {\n type: 'mcp',\n requested: server,\n reason: `MCP server '${server}' is explicitly denied`,\n severity: 'error'\n };\n }\n\n // Check allow list\n if (allow.includes('*')) {\n return null;\n }\n\n const isAllowed = allow.some(pattern => {\n if (pattern === server) return true;\n if (pattern.includes('*')) return minimatch(server, pattern);\n return false;\n });\n\n if (!isAllowed) {\n return {\n type: 'mcp',\n requested: server,\n reason: `MCP server '${server}' not in allowlist: [${allow.join(', ')}]`,\n severity: 'error'\n };\n }\n\n return null;\n}\n\n/**\n * Main validation function\n *\n * Validates an execution request against the squad's permission context\n */\nexport function validateExecution(\n context: SquadContext,\n request: ExecutionRequest\n): PermissionResult {\n const violations: PermissionViolation[] = [];\n\n // Validate bash commands\n if (request.bashCommands) {\n for (const cmd of request.bashCommands) {\n const violation = validateBashCommand(cmd, context.permissions.bash);\n if (violation) {\n violations.push(violation);\n }\n }\n }\n\n // Validate write paths\n if (request.writePaths) {\n for (const path of request.writePaths) {\n const violation = validateFilePath(path, context.permissions.write, 'write');\n if (violation) {\n violations.push(violation);\n }\n }\n }\n\n // Validate read paths\n if (request.readPaths) {\n for (const path of request.readPaths) {\n const violation = validateFilePath(path, context.permissions.read, 'read');\n if (violation) {\n violations.push(violation);\n }\n }\n }\n\n // Validate MCP servers\n if (request.mcpServers) {\n for (const server of request.mcpServers) {\n const violation = validateMcpServer(\n server,\n context.permissions.mcp.allow,\n context.permissions.mcp.deny\n );\n if (violation) {\n violations.push(violation);\n }\n }\n }\n\n // Determine if execution is allowed based on mode\n const hasErrors = violations.some(v => v.severity === 'error');\n const allowed = context.permissions.mode !== 'strict' || !hasErrors;\n\n return {\n allowed,\n violations,\n mode: context.permissions.mode\n };\n}\n\n/**\n * Format violations for display\n */\nexport function formatViolations(result: PermissionResult): string[] {\n const lines: string[] = [];\n\n if (result.violations.length === 0) {\n return lines;\n }\n\n const modeLabel = {\n warn: '⚠️ PERMISSION WARNING',\n strict: '🚫 PERMISSION DENIED',\n audit: '📝 PERMISSION AUDIT'\n }[result.mode];\n\n lines.push(modeLabel);\n lines.push('');\n\n for (const v of result.violations) {\n const icon = v.severity === 'error' ? '✗' : '⚠';\n lines.push(` ${icon} [${v.type}] ${v.reason}`);\n }\n\n if (result.mode === 'warn') {\n lines.push('');\n lines.push(' Continuing with warnings (mode: warn)');\n } else if (result.mode === 'audit') {\n lines.push('');\n lines.push(' Logged for audit, continuing (mode: audit)');\n } else if (!result.allowed) {\n lines.push('');\n lines.push(' Execution blocked (mode: strict)');\n }\n\n return lines;\n}\n\n/**\n * Parse permissions YAML block from SQUAD.md content\n *\n * Expected format in SQUAD.md:\n * ```yaml\n * permissions:\n * mode: warn | strict | audit\n * bash: [npm, git, vercel]\n * write: [agents-squads-web/**]\n * read: [hq/.agents/**]\n * mcp:\n * allow: [chrome-devtools, firecrawl]\n * deny: [restricted-server]\n * ```\n */\nexport function parsePermissionsYaml(content: string): Partial<SquadContext['permissions']> | null {\n // Find YAML code block\n const yamlMatch = content.match(/```ya?ml\\n([\\s\\S]*?)```/);\n if (!yamlMatch) return null;\n\n const yamlContent = yamlMatch[1];\n\n // Simple YAML parsing for permissions block\n const permissions: Partial<SquadContext['permissions']> = {};\n\n // Parse mode\n const modeMatch = yamlContent.match(/^\\s*mode:\\s*(warn|strict|audit)/m);\n if (modeMatch) {\n permissions.mode = modeMatch[1] as EnforcementMode;\n }\n\n // Parse bash allowlist\n const bashMatch = yamlContent.match(/^\\s*bash:\\s*\\[(.*?)\\]/m);\n if (bashMatch) {\n permissions.bash = bashMatch[1].split(',').map(s => s.trim());\n }\n\n // Parse write globs\n const writeMatch = yamlContent.match(/^\\s*write:\\s*\\[(.*?)\\]/m);\n if (writeMatch) {\n permissions.write = writeMatch[1].split(',').map(s => s.trim());\n }\n\n // Parse read globs\n const readMatch = yamlContent.match(/^\\s*read:\\s*\\[(.*?)\\]/m);\n if (readMatch) {\n permissions.read = readMatch[1].split(',').map(s => s.trim());\n }\n\n // Parse MCP allow/deny\n const mcpAllowMatch = yamlContent.match(/^\\s*allow:\\s*\\[(.*?)\\]/m);\n const mcpDenyMatch = yamlContent.match(/^\\s*deny:\\s*\\[(.*?)\\]/m);\n\n if (mcpAllowMatch || mcpDenyMatch) {\n permissions.mcp = {\n allow: mcpAllowMatch ? mcpAllowMatch[1].split(',').map(s => s.trim()) : ['*'],\n deny: mcpDenyMatch ? mcpDenyMatch[1].split(',').map(s => s.trim()) : []\n };\n }\n\n return Object.keys(permissions).length > 0 ? permissions : null;\n}\n\n/**\n * Build a SquadContext from SQUAD.md content\n */\nexport function buildContextFromSquad(\n squadName: string,\n squadContent: string,\n agentName?: string\n): SquadContext {\n // Start with defaults\n const context = getDefaultContext(squadName, agentName);\n\n // Parse permissions from content\n const parsed = parsePermissionsYaml(squadContent);\n\n if (parsed) {\n if (parsed.mode) context.permissions.mode = parsed.mode;\n if (parsed.bash) context.permissions.bash = parsed.bash;\n if (parsed.write) context.permissions.write = parsed.write;\n if (parsed.read) context.permissions.read = parsed.read;\n if (parsed.mcp) context.permissions.mcp = parsed.mcp;\n }\n\n return context;\n}\n","/**\n * Multi-LLM CLI Support\n *\n * Enables squads to use different LLM providers by delegating to their native CLIs.\n * Unix-style composition: each provider maintains their own CLI, we orchestrate.\n *\n * @see specs/multi-llm.md\n */\n\nimport { execSync } from 'child_process';\n\nexport interface CLIConfig {\n /** Provider identifier (matches provider field in SQUAD.md/agent.md) */\n provider: string;\n\n /** Display name for UI */\n displayName: string;\n\n /** CLI command name */\n command: string;\n\n /** Install instructions */\n install: string;\n\n /** Build non-interactive args for execution */\n buildArgs: (prompt: string, options?: RunOptions) => string[];\n}\n\nexport interface RunOptions {\n /** Model override (for providers that support it) */\n model?: string;\n\n /** Working directory */\n cwd?: string;\n\n /** Dry run - just show what would execute */\n dryRun?: boolean;\n}\n\n/**\n * Check if a command exists in PATH\n */\nexport function commandExists(command: string): boolean {\n try {\n execSync(`which ${command}`, { stdio: 'pipe' });\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * LLM CLI registry\n * Maps provider IDs to their CLI configurations\n */\nexport const LLM_CLIS: Record<string, CLIConfig> = {\n anthropic: {\n provider: 'anthropic',\n displayName: 'Anthropic',\n command: 'claude',\n install: 'npm i -g @anthropic-ai/claude-code',\n buildArgs: (prompt) => ['--print', prompt],\n },\n\n google: {\n provider: 'google',\n displayName: 'Google',\n command: 'gemini',\n install: 'npm i -g @google/gemini-cli',\n buildArgs: (prompt) => ['--prompt', prompt],\n },\n\n openai: {\n provider: 'openai',\n displayName: 'OpenAI',\n command: 'codex',\n install: 'npm i -g @openai/codex',\n buildArgs: (prompt) => ['exec', prompt],\n },\n\n mistral: {\n provider: 'mistral',\n displayName: 'Mistral',\n command: 'vibe',\n install: 'curl -LsSf https://mistral.ai/vibe/install.sh | bash',\n buildArgs: (prompt) => ['--prompt', prompt, '--auto-approve'],\n },\n\n xai: {\n provider: 'xai',\n displayName: 'xAI',\n command: 'grok',\n install: 'bun add -g @vibe-kit/grok-cli',\n buildArgs: (prompt) => ['--prompt', prompt],\n },\n\n aider: {\n provider: 'aider',\n displayName: 'Aider (Multi)',\n command: 'aider',\n install: 'pip install aider-install && aider-install',\n buildArgs: (prompt) => ['--message', prompt, '--yes'],\n },\n\n ollama: {\n provider: 'ollama',\n displayName: 'Ollama (Local)',\n command: 'ollama',\n install: 'brew install ollama',\n buildArgs: (prompt, opts) => ['run', opts?.model || 'llama3.1', prompt],\n },\n};\n\nexport interface CLIStatus {\n provider: string;\n displayName: string;\n command: string;\n available: boolean;\n install: string;\n}\n\n/**\n * Get status of all LLM CLIs\n */\nexport function getAllCLIStatus(): CLIStatus[] {\n return Object.values(LLM_CLIS).map((cli) => ({\n provider: cli.provider,\n displayName: cli.displayName,\n command: cli.command,\n available: commandExists(cli.command),\n install: cli.install,\n }));\n}\n\n/**\n * Get CLI config for a provider\n */\nexport function getCLIConfig(provider: string): CLIConfig | undefined {\n return LLM_CLIS[provider];\n}\n\n/**\n * Check if a provider's CLI is available\n */\nexport function isProviderCLIAvailable(provider: string): boolean {\n const config = LLM_CLIS[provider];\n if (!config) return false;\n return commandExists(config.command);\n}\n","/**\n * Multi-provider LLM detection and cost tracking\n *\n * Supports: Anthropic, OpenAI, Google, AWS Bedrock, Azure, Mistral, Groq\n */\n\n// Provider types\nexport type ProviderName =\n | 'anthropic'\n | 'openai'\n | 'google'\n | 'aws_bedrock'\n | 'azure'\n | 'mistral'\n | 'groq'\n | 'unknown';\n\nexport interface ProviderDetection {\n provider: ProviderName;\n plan?: string;\n confidence: 'explicit' | 'inferred';\n reason: string;\n}\n\nexport interface ModelPricing {\n input: number; // per 1M tokens\n output: number; // per 1M tokens\n cached?: number; // per 1M cached tokens (if supported)\n}\n\nexport interface ProviderConfig {\n name: ProviderName;\n displayName: string;\n models: Record<string, ModelPricing>;\n defaultPricing: ModelPricing;\n envVars: string[]; // API key env vars to check\n modelPatterns: RegExp[]; // Model name patterns\n}\n\n// Pricing data per 1M tokens (Jan 2025)\nexport const PROVIDERS: Record<Exclude<ProviderName, 'unknown'>, ProviderConfig> = {\n anthropic: {\n name: 'anthropic',\n displayName: 'Anthropic',\n envVars: ['ANTHROPIC_API_KEY'],\n modelPatterns: [/^claude/i],\n defaultPricing: { input: 3.0, output: 15.0 },\n models: {\n 'claude-opus-4-5': { input: 15.0, output: 75.0 },\n 'claude-opus-4-5-20251101': { input: 15.0, output: 75.0 },\n 'claude-sonnet-4': { input: 3.0, output: 15.0 },\n 'claude-sonnet-4-20250514': { input: 3.0, output: 15.0 },\n 'claude-3-5-sonnet': { input: 3.0, output: 15.0 },\n 'claude-3-5-sonnet-20241022': { input: 3.0, output: 15.0 },\n 'claude-3-5-sonnet-20240620': { input: 3.0, output: 15.0 },\n 'claude-haiku-3-5': { input: 0.8, output: 4.0 },\n 'claude-3-5-haiku': { input: 0.8, output: 4.0 },\n 'claude-3-5-haiku-20241022': { input: 0.8, output: 4.0 },\n 'claude-3-opus': { input: 15.0, output: 75.0 },\n 'claude-3-sonnet': { input: 3.0, output: 15.0 },\n 'claude-3-haiku': { input: 0.25, output: 1.25 },\n },\n },\n\n openai: {\n name: 'openai',\n displayName: 'OpenAI',\n envVars: ['OPENAI_API_KEY'],\n modelPatterns: [/^gpt-/i, /^o1/i, /^o3/i],\n defaultPricing: { input: 2.5, output: 10.0 },\n models: {\n 'gpt-4o': { input: 2.5, output: 10.0 },\n 'gpt-4o-2024-11-20': { input: 2.5, output: 10.0 },\n 'gpt-4o-2024-08-06': { input: 2.5, output: 10.0 },\n 'gpt-4o-mini': { input: 0.15, output: 0.6 },\n 'gpt-4o-mini-2024-07-18': { input: 0.15, output: 0.6 },\n 'gpt-4-turbo': { input: 10.0, output: 30.0 },\n 'gpt-4-turbo-2024-04-09': { input: 10.0, output: 30.0 },\n 'gpt-4': { input: 30.0, output: 60.0 },\n 'gpt-4-32k': { input: 60.0, output: 120.0 },\n 'gpt-3.5-turbo': { input: 0.5, output: 1.5 },\n 'gpt-3.5-turbo-0125': { input: 0.5, output: 1.5 },\n o1: { input: 15.0, output: 60.0 },\n 'o1-2024-12-17': { input: 15.0, output: 60.0 },\n 'o1-preview': { input: 15.0, output: 60.0 },\n 'o1-mini': { input: 3.0, output: 12.0 },\n 'o1-mini-2024-09-12': { input: 3.0, output: 12.0 },\n 'o3-mini': { input: 1.1, output: 4.4 },\n },\n },\n\n google: {\n name: 'google',\n displayName: 'Google',\n envVars: ['GEMINI_API_KEY', 'GOOGLE_API_KEY'],\n modelPatterns: [/^gemini/i],\n defaultPricing: { input: 0.1, output: 0.4 },\n models: {\n 'gemini-2.0-flash': { input: 0.1, output: 0.4 },\n 'gemini-2.0-flash-exp': { input: 0.1, output: 0.4 },\n 'gemini-1.5-pro': { input: 1.25, output: 5.0 },\n 'gemini-1.5-pro-002': { input: 1.25, output: 5.0 },\n 'gemini-1.5-flash': { input: 0.075, output: 0.3 },\n 'gemini-1.5-flash-002': { input: 0.075, output: 0.3 },\n 'gemini-1.0-pro': { input: 0.5, output: 1.5 },\n },\n },\n\n mistral: {\n name: 'mistral',\n displayName: 'Mistral',\n envVars: ['MISTRAL_API_KEY'],\n modelPatterns: [/^mistral/i, /^mixtral/i, /^codestral/i],\n defaultPricing: { input: 2.0, output: 6.0 },\n models: {\n 'mistral-large': { input: 2.0, output: 6.0 },\n 'mistral-large-2411': { input: 2.0, output: 6.0 },\n 'mistral-medium': { input: 2.7, output: 8.1 },\n 'mistral-small': { input: 0.2, output: 0.6 },\n 'mistral-small-2409': { input: 0.2, output: 0.6 },\n 'mixtral-8x7b': { input: 0.7, output: 0.7 },\n 'mixtral-8x22b': { input: 2.0, output: 6.0 },\n codestral: { input: 0.2, output: 0.6 },\n 'codestral-2405': { input: 0.2, output: 0.6 },\n },\n },\n\n groq: {\n name: 'groq',\n displayName: 'Groq',\n envVars: ['GROQ_API_KEY'],\n modelPatterns: [/^llama/i], // llama models on Groq\n defaultPricing: { input: 0.59, output: 0.79 },\n models: {\n 'llama-3.3-70b-versatile': { input: 0.59, output: 0.79 },\n 'llama-3.3-70b-specdec': { input: 0.59, output: 0.99 },\n 'llama-3.1-70b-versatile': { input: 0.59, output: 0.79 },\n 'llama-3.1-8b-instant': { input: 0.05, output: 0.08 },\n 'llama-3-70b-8192': { input: 0.59, output: 0.79 },\n 'llama-3-8b-8192': { input: 0.05, output: 0.08 },\n 'mixtral-8x7b-32768': { input: 0.24, output: 0.24 },\n 'gemma2-9b-it': { input: 0.2, output: 0.2 },\n },\n },\n\n aws_bedrock: {\n name: 'aws_bedrock',\n displayName: 'AWS Bedrock',\n envVars: ['AWS_ACCESS_KEY_ID'],\n modelPatterns: [/^anthropic\\./i, /^amazon\\./i, /^meta\\./i, /^mistral\\./i],\n defaultPricing: { input: 3.0, output: 15.0 },\n models: {\n 'anthropic.claude-3-5-sonnet-20241022-v2:0': { input: 3.0, output: 15.0 },\n 'anthropic.claude-3-5-sonnet-20240620-v1:0': { input: 3.0, output: 15.0 },\n 'anthropic.claude-3-5-haiku-20241022-v1:0': { input: 0.8, output: 4.0 },\n 'anthropic.claude-3-opus-20240229-v1:0': { input: 15.0, output: 75.0 },\n 'anthropic.claude-3-sonnet-20240229-v1:0': { input: 3.0, output: 15.0 },\n 'anthropic.claude-3-haiku-20240307-v1:0': { input: 0.25, output: 1.25 },\n 'amazon.titan-text-premier-v1:0': { input: 0.5, output: 1.5 },\n 'amazon.titan-text-express-v1': { input: 0.2, output: 0.6 },\n 'amazon.titan-text-lite-v1': { input: 0.15, output: 0.2 },\n 'meta.llama3-70b-instruct-v1:0': { input: 2.65, output: 3.5 },\n 'meta.llama3-8b-instruct-v1:0': { input: 0.3, output: 0.6 },\n 'meta.llama3-1-405b-instruct-v1:0': { input: 5.32, output: 16.0 },\n 'mistral.mistral-large-2407-v1:0': { input: 4.0, output: 12.0 },\n },\n },\n\n azure: {\n name: 'azure',\n displayName: 'Azure OpenAI',\n envVars: ['AZURE_OPENAI_API_KEY'],\n modelPatterns: [], // Detected via endpoint, not model name\n defaultPricing: { input: 2.5, output: 10.0 },\n models: {\n // Same pricing as OpenAI (regional variations possible)\n 'gpt-4o': { input: 2.5, output: 10.0 },\n 'gpt-4o-mini': { input: 0.15, output: 0.6 },\n 'gpt-4-turbo': { input: 10.0, output: 30.0 },\n 'gpt-4': { input: 30.0, output: 60.0 },\n 'gpt-35-turbo': { input: 0.5, output: 1.5 }, // Azure uses different name\n },\n },\n};\n\n/**\n * Detect the LLM provider from a model name string.\n * Supports Anthropic, OpenAI, Google, Mistral, Groq, AWS Bedrock, and Azure.\n * @param model - Model identifier (e.g., 'claude-3-5-sonnet', 'gpt-4o')\n * @returns Provider name or 'unknown' if unrecognized\n */\nexport function detectProviderFromModel(model: string): ProviderName {\n const modelLower = model.toLowerCase();\n\n // AWS Bedrock - check first (model IDs include provider prefix)\n if (\n modelLower.includes('anthropic.') ||\n modelLower.includes('amazon.') ||\n modelLower.includes('meta.') ||\n modelLower.includes('mistral.')\n ) {\n return 'aws_bedrock';\n }\n\n // Anthropic\n if (modelLower.startsWith('claude')) {\n return 'anthropic';\n }\n\n // OpenAI\n if (\n modelLower.startsWith('gpt-') ||\n modelLower.startsWith('o1') ||\n modelLower.startsWith('o3')\n ) {\n // Check for Azure (endpoint-based detection takes priority)\n if (process.env.AZURE_OPENAI_ENDPOINT || process.env.AZURE_OPENAI_API_KEY) {\n return 'azure';\n }\n return 'openai';\n }\n\n // Google\n if (modelLower.startsWith('gemini')) {\n return 'google';\n }\n\n // Mistral vs Groq (both can run mistral/mixtral models)\n if (modelLower.startsWith('mistral') || modelLower.startsWith('mixtral') || modelLower.startsWith('codestral')) {\n // If Groq API key is set and not Mistral key, assume Groq\n if (process.env.GROQ_API_KEY && !process.env.MISTRAL_API_KEY) {\n return 'groq';\n }\n return 'mistral';\n }\n\n // Groq (llama models, gemma)\n if (modelLower.startsWith('llama') || modelLower.startsWith('gemma')) {\n return 'groq';\n }\n\n return 'unknown';\n}\n\n/**\n * Detect all LLM providers configured via environment variables.\n * Checks for API keys and infers plan type based on tier/budget settings.\n * @returns Array of detected providers with their configuration details\n */\nexport function detectProvidersFromEnv(): ProviderDetection[] {\n const detected: ProviderDetection[] = [];\n\n // Anthropic\n if (process.env.ANTHROPIC_API_KEY) {\n const tier = parseInt(process.env.ANTHROPIC_TIER || '0', 10);\n const budgetSet = process.env.ANTHROPIC_BUDGET_DAILY || process.env.SQUADS_DAILY_BUDGET;\n const explicitPlan = process.env.SQUADS_PLAN_TYPE?.toLowerCase();\n\n let plan = 'Max';\n let confidence: 'explicit' | 'inferred' = 'inferred';\n let reason = 'API key detected';\n\n if (explicitPlan === 'usage') {\n plan = 'Usage';\n confidence = 'explicit';\n reason = 'SQUADS_PLAN_TYPE=usage';\n } else if (explicitPlan === 'max') {\n plan = 'Max';\n confidence = 'explicit';\n reason = 'SQUADS_PLAN_TYPE=max';\n } else if (budgetSet) {\n plan = 'Usage';\n reason = `Budget set ($${budgetSet}/day)`;\n } else if (tier >= 4) {\n plan = 'Max';\n reason = `Tier ${tier} (high usage)`;\n } else if (tier >= 1 && tier <= 2) {\n plan = 'Usage';\n reason = `Tier ${tier} (new user)`;\n }\n\n detected.push({ provider: 'anthropic', plan, confidence, reason });\n }\n\n // OpenAI\n if (process.env.OPENAI_API_KEY) {\n const orgId = process.env.OPENAI_ORG_ID;\n detected.push({\n provider: 'openai',\n plan: orgId ? 'Team/Enterprise' : 'Personal',\n confidence: 'inferred',\n reason: orgId ? 'Org ID set' : 'API key only',\n });\n }\n\n // Google\n if (process.env.GEMINI_API_KEY || process.env.GOOGLE_API_KEY) {\n detected.push({\n provider: 'google',\n plan: 'Pay-as-you-go',\n confidence: 'inferred',\n reason: 'API key detected',\n });\n }\n\n // AWS Bedrock\n if (process.env.AWS_ACCESS_KEY_ID) {\n detected.push({\n provider: 'aws_bedrock',\n plan: 'On-demand',\n confidence: 'inferred',\n reason: 'AWS credentials detected',\n });\n }\n\n // Azure OpenAI\n if (process.env.AZURE_OPENAI_API_KEY) {\n detected.push({\n provider: 'azure',\n plan: process.env.AZURE_OPENAI_DEPLOYMENT ? 'PTU' : 'Pay-as-you-go',\n confidence: 'inferred',\n reason: process.env.AZURE_OPENAI_DEPLOYMENT ? 'Deployment detected' : 'API key only',\n });\n }\n\n // Mistral\n if (process.env.MISTRAL_API_KEY) {\n detected.push({\n provider: 'mistral',\n plan: 'Pay-per-token',\n confidence: 'inferred',\n reason: 'API key detected',\n });\n }\n\n // Groq\n if (process.env.GROQ_API_KEY) {\n detected.push({\n provider: 'groq',\n plan: 'Developer',\n confidence: 'inferred',\n reason: 'API key detected',\n });\n }\n\n return detected;\n}\n\n/**\n * Get pricing information for a specific model.\n * Attempts exact match first, then case-insensitive, then partial match.\n * @param provider - Provider name\n * @param model - Model identifier\n * @returns Pricing in dollars per 1M tokens (input/output/cached)\n */\nexport function getModelPricing(provider: ProviderName, model: string): ModelPricing {\n if (provider === 'unknown') {\n // Fallback to Anthropic Sonnet pricing for unknown models\n return { input: 3.0, output: 15.0 };\n }\n\n const config = PROVIDERS[provider];\n const modelLower = model.toLowerCase();\n\n // Exact match first\n if (config.models[model]) {\n return config.models[model];\n }\n\n // Case-insensitive match\n const matchedModel = Object.keys(config.models).find(\n (m) => m.toLowerCase() === modelLower\n );\n if (matchedModel) {\n return config.models[matchedModel];\n }\n\n // Partial match (for versioned models)\n const partialMatch = Object.keys(config.models).find(\n (m) => modelLower.includes(m.toLowerCase()) || m.toLowerCase().includes(modelLower)\n );\n if (partialMatch) {\n return config.models[partialMatch];\n }\n\n return config.defaultPricing;\n}\n\n/**\n * Calculate cost for token usage based on provider pricing.\n * @param provider - Provider name\n * @param model - Model identifier\n * @param inputTokens - Number of input tokens\n * @param outputTokens - Number of output tokens\n * @param cachedTokens - Number of cached tokens (for providers that support it)\n * @returns Total cost in dollars\n */\nexport function calcCost(\n provider: ProviderName,\n model: string,\n inputTokens: number,\n outputTokens: number,\n cachedTokens = 0\n): number {\n const pricing = getModelPricing(provider, model);\n\n // Per 1M tokens pricing\n const inputCost = (inputTokens / 1_000_000) * pricing.input;\n const outputCost = (outputTokens / 1_000_000) * pricing.output;\n const cachedCost = pricing.cached\n ? (cachedTokens / 1_000_000) * pricing.cached\n : 0;\n\n return inputCost + outputCost + cachedCost;\n}\n\n/**\n * Get human-readable display name for a provider.\n * @param provider - Provider name\n * @returns Display name (e.g., 'Anthropic', 'OpenAI', 'AWS Bedrock')\n */\nexport function getProviderDisplayName(provider: ProviderName): string {\n if (provider === 'unknown') return 'Unknown';\n return PROVIDERS[provider].displayName;\n}\n\n/**\n * Check if a provider has its API key configured in environment variables.\n * @param provider - Provider name\n * @returns true if any of the provider's API key env vars are set\n */\nexport function isProviderConfigured(provider: ProviderName): boolean {\n if (provider === 'unknown') return false;\n const config = PROVIDERS[provider];\n return config.envVars.some((envVar) => !!process.env[envVar]);\n}\n","import {\n findSquadsDir,\n listSquads,\n listAgents,\n loadSquad,\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';\nimport { track } from '../lib/telemetry.js';\n\ninterface ListOptions {\n squads?: boolean;\n agents?: boolean;\n json?: boolean;\n}\n\nexport async function listCommand(options: ListOptions): Promise<void> {\n await track('cli.list', { squads: options.squads, agents: options.agents });\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 // JSON output\n if (options.json) {\n const squadData = squads.map(name => {\n const agents = listAgents(squadsDir, name);\n return {\n name,\n agentCount: agents.length,\n agents: agents.map(a => ({ name: a.name, role: a.role || null, status: a.status || 'active' })),\n };\n });\n console.log(JSON.stringify({\n ok: true,\n command: 'list',\n data: { squads: squadData, totalSquads: squads.length, totalAgents: allAgents.length },\n }, null, 2));\n return;\n }\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 squad = loadSquad(squadName);\n const lead = (squad?.frontmatter?.lead as string) || 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 resolveExecutionContext,\n} from '../lib/squad-parser.js';\nimport { findMemoryDir, getSquadState } from '../lib/memory.js';\nimport {\n getLiveSessionSummaryAsync,\n cleanupStaleSessions,\n} from '../lib/sessions.js';\nimport {\n listExecutions,\n getExecutionStats,\n formatDuration,\n formatRelativeTime,\n} from '../lib/executions.js';\nimport { checkForUpdate } from '../lib/update.js';\nimport { track, Events } from '../lib/telemetry.js';\nimport {\n colors,\n bold,\n RESET,\n gradient,\n box,\n padEnd,\n icons,\n writeLine,\n privacyHeader,\n} from '../lib/terminal.js';\n\ninterface StatusOptions {\n verbose?: boolean;\n json?: boolean;\n}\n\nexport async function statusCommand(\n squadName?: string,\n options: StatusOptions = {}\n): Promise<void> {\n await track(Events.CLI_STATUS, { squad: squadName || 'all', verbose: options.verbose });\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 with parallel lsof)\n cleanupStaleSessions();\n const sessionSummary = await getLiveSessionSummaryAsync();\n\n // JSON output\n if (options.json) {\n const execStats = getExecutionStats({ since: new Date(Date.now() - 24 * 60 * 60 * 1000) });\n const squadData = squads.map(name => {\n const agents = listAgents(squadsDir, name);\n const states = memoryDir ? getSquadState(name) : [];\n return { name, agentCount: agents.length, memoryEntries: states.length };\n });\n console.log(JSON.stringify({\n ok: true,\n command: 'status',\n data: {\n squads: squadData,\n totalSquads: squads.length,\n sessions: sessionSummary,\n executions24h: execStats,\n memoryEnabled: !!memoryDir,\n },\n }, null, 2));\n return;\n }\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 // Execution stats (last 24h)\n const execStats = getExecutionStats({ since: new Date(Date.now() - 24 * 60 * 60 * 1000) });\n const execSummary = execStats.total > 0\n ? `${colors.green}${execStats.completed}${RESET} ${colors.dim}completed${RESET}` +\n (execStats.failed > 0 ? ` ${colors.red}${execStats.failed}${RESET} ${colors.dim}failed${RESET}` : '') +\n (execStats.running > 0 ? ` ${colors.yellow}${execStats.running}${RESET} ${colors.dim}running${RESET}` : '')\n : `${colors.dim}no executions${RESET}`;\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} ${colors.dim}│${RESET} ${colors.dim}24h:${RESET} ${execSummary}`);\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 if (options.json) {\n console.log(JSON.stringify({ ok: false, command: 'status', error: `Squad \"${squadName}\" not found` }, null, 2));\n process.exit(1);\n }\n writeLine(`${colors.red}Squad \"${squadName}\" not found.${RESET}`);\n process.exit(1);\n }\n\n // JSON output for specific squad\n if (options.json) {\n const agents = listAgents(squadsDir, squadName);\n const execContext = resolveExecutionContext(squad);\n const recentExecs = listExecutions({ squad: squadName, limit: 5 });\n const memDir = findMemoryDir();\n const states = memDir ? getSquadState(squadName) : [];\n console.log(JSON.stringify({\n ok: true,\n command: 'status',\n data: {\n squad: {\n name: squad.name,\n mission: squad.mission || null,\n agents: agents.map(a => ({ name: a.name, role: a.role || null, status: a.status || 'active' })),\n pipelines: squad.pipelines,\n context: {\n skills: execContext.resolved.skills.map(s => s.name),\n mcpServers: execContext.resolved.mcpServers,\n model: squad.context?.model?.default || null,\n },\n recentExecutions: recentExecs,\n memoryEntries: states.length,\n },\n },\n }, null, 2));\n return;\n }\n\n writeLine();\n\n // Show privacy header for sensitive squads (client, finance, etc.)\n const sensitiveSquads = ['client-'];\n const isSensitive = sensitiveSquads.some(prefix => squadName.startsWith(prefix));\n if (isSensitive) {\n writeLine(privacyHeader('internal'));\n writeLine();\n }\n\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 // Context profile\n const execContext = resolveExecutionContext(squad);\n const hasContext = execContext.resolved.skills.length > 0 ||\n execContext.resolved.mcpServers.length > 0 ||\n (squad.context?.model?.default);\n\n if (hasContext) {\n writeLine();\n writeLine(` ${bold}Context${RESET}`);\n\n // MCP servers\n if (execContext.resolved.mcpServers.length > 0) {\n const sourceLabel = execContext.resolved.mcpSource === 'squad-local' ? `${colors.green}local${RESET}` :\n execContext.resolved.mcpSource === 'generated' ? `${colors.cyan}generated${RESET}` :\n execContext.resolved.mcpSource === 'user-override' ? `${colors.yellow}override${RESET}` :\n '';\n writeLine(` ${colors.dim}MCP:${RESET} ${colors.cyan}${execContext.resolved.mcpServers.join(', ')}${RESET}${sourceLabel ? ` ${colors.dim}(${sourceLabel})${RESET}` : ''}`);\n }\n\n // Skills (grouped by source)\n if (execContext.resolved.skills.length > 0) {\n const bySource = execContext.resolved.skills.reduce((acc, s) => {\n acc[s.source] = acc[s.source] || [];\n acc[s.source].push(s.name);\n return acc;\n }, {} as Record<string, string[]>);\n\n const skillParts: string[] = [];\n if (bySource['squad-local']) {\n skillParts.push(`${colors.green}${bySource['squad-local'].join(', ')}${RESET} ${colors.dim}(local)${RESET}`);\n }\n if (bySource['project']) {\n skillParts.push(`${colors.cyan}${bySource['project'].join(', ')}${RESET}`);\n }\n if (bySource['global']) {\n skillParts.push(`${colors.dim}${bySource['global'].join(', ')}${RESET}`);\n }\n writeLine(` ${colors.dim}Skills:${RESET} ${skillParts.join(', ')}`);\n }\n\n // Model\n if (squad.context?.model?.default) {\n writeLine(` ${colors.dim}Model:${RESET} ${colors.white}${squad.context.model.default}${RESET}`);\n }\n }\n\n // Recent executions\n const recentExecs = listExecutions({ squad: squadName, limit: 5 });\n if (recentExecs.length > 0) {\n writeLine();\n writeLine(` ${bold}Recent Executions${RESET}`);\n writeLine();\n\n for (const exec of recentExecs) {\n // Use plain symbols - icons already have colors embedded\n const statusIcon = exec.status === 'completed' ? `${colors.green}●${RESET}` :\n exec.status === 'failed' ? `${colors.red}●${RESET}` :\n `${colors.yellow}◆${RESET}`;\n const duration = exec.durationMs ? ` ${colors.dim}(${formatDuration(exec.durationMs)})${RESET}` : '';\n const relTime = formatRelativeTime(exec.startTime);\n\n writeLine(` ${statusIcon} ${colors.white}${exec.agent}${RESET}${duration} ${colors.dim}${relTime}${RESET}`);\n\n // Show error message for failed executions\n if (exec.status === 'failed' && exec.error && options.verbose) {\n writeLine(` ${colors.red}└ ${exec.error.substring(0, 60)}${exec.error.length > 60 ? '...' : ''}${RESET}`);\n }\n\n // Show outcome for completed executions in verbose mode\n if (exec.status === 'completed' && exec.outcome && options.verbose) {\n writeLine(` ${colors.dim}└ ${exec.outcome.substring(0, 60)}${exec.outcome.length > 60 ? '...' : ''}${RESET}`);\n }\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 * Execution log parsing and querying\n *\n * Parses execution logs from .agents/memory/<squad>/<agent>/executions.md\n * and provides query functions for the `squads exec` command.\n */\n\nimport { readFileSync, existsSync, readdirSync } from 'fs';\nimport { join } from 'path';\nimport { findMemoryDir } from './memory.js';\n\nexport interface Execution {\n id: string;\n squad: string;\n agent: string;\n startTime: string;\n endTime?: string;\n durationMs?: number;\n status: 'running' | 'completed' | 'failed';\n trigger: 'manual' | 'scheduled' | 'event' | 'smart';\n taskType: 'evaluation' | 'execution' | 'research' | 'lead';\n outcome?: string;\n error?: string;\n}\n\nexport interface ExecutionListOptions {\n squad?: string;\n agent?: string;\n status?: Execution['status'];\n limit?: number;\n since?: Date;\n}\n\n/**\n * Parse a single execution entry from markdown\n */\nfunction parseExecutionEntry(\n content: string,\n squad: string,\n agent: string\n): Execution | null {\n // Extract execution ID from comment marker\n const idMatch = content.match(/<!-- exec:(\\S+) -->/);\n if (!idMatch) return null;\n\n const id = idMatch[1];\n\n // Extract timestamp and status from header\n const headerMatch = content.match(/\\*\\*([^*]+)\\*\\* \\| Status: (\\w+)/);\n if (!headerMatch) return null;\n\n const startTime = headerMatch[1].trim();\n const status = headerMatch[2] as Execution['status'];\n\n // Parse structured fields\n const triggerMatch = content.match(/- Trigger: (\\w+)/);\n const taskTypeMatch = content.match(/- Task Type: (\\w+)/);\n const completedMatch = content.match(/- Completed: ([^\\n]+)/);\n const durationMatch = content.match(/- Duration: ([^\\n]+)/);\n const outcomeMatch = content.match(/- Outcome: ([^\\n]+)/);\n const errorMatch = content.match(/- Error: ([^\\n]+)/);\n\n // Parse duration string to ms\n let durationMs: number | undefined;\n if (durationMatch) {\n const durationStr = durationMatch[1].trim();\n const secMatch = durationStr.match(/^([\\d.]+)s$/);\n if (secMatch) {\n durationMs = parseFloat(secMatch[1]) * 1000;\n }\n }\n\n return {\n id,\n squad,\n agent,\n startTime,\n endTime: completedMatch?.[1]?.trim(),\n durationMs,\n status,\n trigger: (triggerMatch?.[1] || 'manual') as Execution['trigger'],\n taskType: (taskTypeMatch?.[1] || 'execution') as Execution['taskType'],\n outcome: outcomeMatch?.[1]?.trim(),\n error: errorMatch?.[1]?.trim(),\n };\n}\n\n/**\n * Parse all executions from an agent's execution log\n */\nfunction parseExecutionLog(filePath: string, squad: string, agent: string): Execution[] {\n if (!existsSync(filePath)) return [];\n\n const content = readFileSync(filePath, 'utf-8');\n const executions: Execution[] = [];\n\n // Split by entry separator\n const entries = content.split(/\\n---\\n/);\n\n for (const entry of entries) {\n if (!entry.includes('<!-- exec:')) continue;\n\n const execution = parseExecutionEntry(entry, squad, agent);\n if (execution) {\n executions.push(execution);\n }\n }\n\n // Also try to parse legacy format entries (without exec: marker)\n // These will have limited data but we can still extract basic info\n for (const entry of entries) {\n if (entry.includes('<!-- exec:')) continue; // Already parsed\n\n const headerMatch = entry.match(/\\*\\*([^*]+)\\*\\* \\| Status: (\\w+)/);\n if (!headerMatch) continue;\n\n const startTime = headerMatch[1].trim();\n const status = headerMatch[2] as Execution['status'];\n\n // Generate a deterministic ID from timestamp for legacy entries\n const legacyId = `legacy_${startTime.replace(/[^a-z0-9]/gi, '')}`;\n\n // Skip if we already have this (by timestamp proximity)\n if (executions.some(e => e.startTime === startTime)) continue;\n\n executions.push({\n id: legacyId,\n squad,\n agent,\n startTime,\n status,\n trigger: 'manual',\n taskType: 'execution',\n });\n }\n\n return executions;\n}\n\n/**\n * List all executions across all squads\n */\nexport function listExecutions(options: ExecutionListOptions = {}): Execution[] {\n const memoryDir = findMemoryDir();\n if (!memoryDir) return [];\n\n const executions: Execution[] = [];\n const { squad: filterSquad, agent: filterAgent, status: filterStatus, limit, since } = options;\n\n // Find all squad directories\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 if (filterSquad && squad !== filterSquad) continue;\n\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 if (filterAgent && agent !== filterAgent) continue;\n\n const logPath = join(squadPath, agent, 'executions.md');\n const agentExecutions = parseExecutionLog(logPath, squad, agent);\n executions.push(...agentExecutions);\n }\n }\n\n // Filter by status\n let filtered = filterStatus\n ? executions.filter(e => e.status === filterStatus)\n : executions;\n\n // Filter by date\n if (since) {\n const sinceMs = since.getTime();\n filtered = filtered.filter(e => {\n const execDate = new Date(e.startTime).getTime();\n return !isNaN(execDate) && execDate >= sinceMs;\n });\n }\n\n // Sort by start time (most recent first)\n filtered.sort((a, b) => {\n const aTime = new Date(a.startTime).getTime();\n const bTime = new Date(b.startTime).getTime();\n if (isNaN(aTime) || isNaN(bTime)) return 0;\n return bTime - aTime;\n });\n\n // Apply limit\n if (limit && limit > 0) {\n filtered = filtered.slice(0, limit);\n }\n\n return filtered;\n}\n\n/**\n * Get a specific execution by ID\n */\nexport function getExecution(executionId: string): Execution | null {\n const executions = listExecutions();\n return executions.find(e => e.id === executionId) || null;\n}\n\n/**\n * Get execution statistics\n */\nexport function getExecutionStats(options: ExecutionListOptions = {}): {\n total: number;\n running: number;\n completed: number;\n failed: number;\n avgDurationMs: number | null;\n bySquad: Record<string, number>;\n byAgent: Record<string, number>;\n} {\n const executions = listExecutions(options);\n\n const running = executions.filter(e => e.status === 'running').length;\n const completed = executions.filter(e => e.status === 'completed').length;\n const failed = executions.filter(e => e.status === 'failed').length;\n\n // Calculate average duration from completed executions\n const durations = executions\n .filter(e => e.status === 'completed' && e.durationMs)\n .map(e => e.durationMs!);\n const avgDurationMs = durations.length > 0\n ? durations.reduce((a, b) => a + b, 0) / durations.length\n : null;\n\n // Count by squad\n const bySquad: Record<string, number> = {};\n for (const e of executions) {\n bySquad[e.squad] = (bySquad[e.squad] || 0) + 1;\n }\n\n // Count by agent\n const byAgent: Record<string, number> = {};\n for (const e of executions) {\n const key = `${e.squad}/${e.agent}`;\n byAgent[key] = (byAgent[key] || 0) + 1;\n }\n\n return {\n total: executions.length,\n running,\n completed,\n failed,\n avgDurationMs,\n bySquad,\n byAgent,\n };\n}\n\n/**\n * Format duration for display\n */\nexport function formatDuration(ms: number | undefined): string {\n if (!ms) return '—';\n\n if (ms < 1000) {\n return `${ms}ms`;\n }\n if (ms < 60000) {\n return `${(ms / 1000).toFixed(1)}s`;\n }\n if (ms < 3600000) {\n const mins = Math.floor(ms / 60000);\n const secs = Math.round((ms % 60000) / 1000);\n return `${mins}m ${secs}s`;\n }\n\n const hours = Math.floor(ms / 3600000);\n const mins = Math.round((ms % 3600000) / 60000);\n return `${hours}h ${mins}m`;\n}\n\n/**\n * Format relative time for display\n */\nexport function formatRelativeTime(isoTime: string): string {\n const date = new Date(isoTime);\n if (isNaN(date.getTime())) return isoTime;\n\n const now = Date.now();\n const diff = now - date.getTime();\n\n if (diff < 60000) return 'just now';\n if (diff < 3600000) return `${Math.floor(diff / 60000)}m ago`;\n if (diff < 86400000) return `${Math.floor(diff / 3600000)}h ago`;\n if (diff < 604800000) return `${Math.floor(diff / 86400000)}d ago`;\n\n return date.toLocaleDateString();\n}\n","/**\n * Service availability checking utilities\n * Extracted from stack.ts for use across commands\n */\n\nimport { execSync } from 'child_process';\nimport {\n colors,\n bold,\n RESET,\n icons,\n writeLine,\n} from './terminal.js';\n\ninterface ContainerStatus {\n name: string;\n running: boolean;\n healthy: boolean;\n port?: string;\n}\n\ninterface ServiceInfo {\n name: string;\n description: string;\n required: boolean;\n healthUrl?: string;\n envVars: string[];\n setupGuide: string[];\n}\n\nconst SERVICES: Record<string, ServiceInfo> = {\n bridge: {\n name: 'Bridge API',\n description: 'Optional: captures conversations and telemetry',\n required: false,\n healthUrl: 'http://localhost:8088/health',\n envVars: ['SQUADS_BRIDGE_URL'],\n setupGuide: [\n 'Not required for basic usage (init, run, status, eval).',\n 'To enable telemetry:',\n ' squads stack up',\n ' Or: docker compose up -d bridge',\n ],\n },\n postgres: {\n name: 'PostgreSQL',\n description: 'Optional: enables scheduling, telemetry, and persistent storage',\n required: false,\n envVars: ['SQUADS_DATABASE_URL'],\n setupGuide: [\n 'Not required for basic usage (init, run, status, eval).',\n 'To enable scheduling and telemetry:',\n ' squads stack up',\n ' Or: docker compose up -d postgres',\n ],\n },\n mem0: {\n name: 'Mem0',\n description: 'Memory extraction and search',\n required: false,\n healthUrl: 'http://localhost:8000/health',\n envVars: ['MEM0_API_URL'],\n setupGuide: [\n 'Run: squads stack up',\n 'Or manually: docker compose -f docker-compose.engram.yml up -d mem0',\n '',\n 'Mem0 requires an LLM provider. Configure in docker/.env:',\n ' LLM_PROVIDER=ollama # For local (free)',\n ' LLM_PROVIDER=openai # Requires OPENAI_API_KEY',\n ],\n },\n scheduler: {\n name: 'Scheduler API',\n description: 'Trigger evaluation and agent execution',\n required: false,\n healthUrl: 'http://localhost:8090/health',\n envVars: [],\n setupGuide: [\n 'Run: docker compose -f docker-compose.engram.yml up -d scheduler-api scheduler-worker',\n '',\n 'Scheduler runs agents on triggers defined in SQUAD.md',\n ],\n },\n langfuse: {\n name: 'Langfuse',\n description: 'Telemetry dashboard and cost tracking',\n required: false,\n healthUrl: 'http://localhost:3100/api/public/health',\n envVars: ['LANGFUSE_HOST', 'LANGFUSE_PUBLIC_KEY', 'LANGFUSE_SECRET_KEY'],\n setupGuide: [\n 'Run: squads stack up',\n 'Then get API keys from: http://localhost:3100',\n ' 1. Create account / login',\n ' 2. Create project',\n ' 3. Copy API keys to docker/.env',\n ],\n },\n redis: {\n name: 'Redis',\n description: 'Caching and rate limiting',\n required: false,\n envVars: ['REDIS_URL'],\n setupGuide: [\n 'Run: squads stack up',\n ],\n },\n};\n\nfunction getContainerStatus(name: string): ContainerStatus {\n try {\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 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 let healthy = true;\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;\n } else {\n healthy = false;\n }\n } catch {\n healthy = true;\n }\n\n return { name, running, healthy, port };\n } catch {\n return { name, running: false, healthy: false };\n }\n}\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 * Check if a service is available and show guidance if not\n */\nexport async function checkServiceAvailable(\n serviceName: keyof typeof SERVICES,\n showGuidance = true\n): Promise<boolean> {\n const service = SERVICES[serviceName];\n if (!service) return false;\n\n const containerName = `squads-${serviceName === 'mem0' ? 'mem0' : serviceName}`;\n const status = getContainerStatus(containerName);\n\n if (!status.running) {\n if (showGuidance) {\n showServiceSetupGuide(serviceName, 'not running');\n }\n return false;\n }\n\n if (service.healthUrl) {\n const healthy = await checkService(service.healthUrl);\n if (!healthy) {\n if (showGuidance) {\n showServiceSetupGuide(serviceName, 'not responding');\n }\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * Show setup guide for a service\n */\nexport function showServiceSetupGuide(\n serviceName: keyof typeof SERVICES,\n issue: string\n): void {\n const service = SERVICES[serviceName];\n if (!service) return;\n\n writeLine();\n writeLine(` ${colors.yellow}${icons.warning}${RESET} ${bold}${service.name}${RESET} is ${issue}`);\n writeLine(` ${colors.dim}${service.description}${RESET}`);\n writeLine();\n\n writeLine(` ${bold}To fix:${RESET}`);\n for (const step of service.setupGuide) {\n if (step === '') {\n writeLine();\n } else {\n writeLine(` ${colors.dim}${step}${RESET}`);\n }\n }\n\n if (service.envVars.length > 0) {\n writeLine();\n writeLine(` ${bold}Environment variables:${RESET}`);\n for (const envVar of service.envVars) {\n const value = process.env[envVar];\n const status = value ? `${colors.green}✓${RESET}` : `${colors.red}✗${RESET}`;\n writeLine(` ${status} ${colors.cyan}${envVar}${RESET}${value ? ` = ${colors.dim}${value}${RESET}` : ''}`);\n }\n }\n\n writeLine();\n writeLine(` ${colors.dim}Full setup: squads health${RESET}`);\n writeLine();\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';\nimport { checkServiceAvailable, showServiceSetupGuide } from '../lib/services.js';\nimport { track, Events } from '../lib/telemetry.js';\n\nconst SQUADS_BRIDGE_URL = process.env.SQUADS_BRIDGE_URL || 'http://localhost:8088';\nconst MEM0_API_URL = process.env.MEM0_API_URL || 'http://localhost:8000';\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 await track(Events.CLI_MEMORY_QUERY, { squad: options.squad, agent: options.agent });\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 await track(Events.CLI_MEMORY_SHOW, { squad: squadName });\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 await track(Events.CLI_MEMORY_UPDATE, { squad: squadName, agent: options.agent, type: options.type });\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 await 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 await track(Events.CLI_MEMORY_LIST);\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}Bridge service not available${RESET}`);\n writeLine(` ${colors.dim}Conversation search requires the bridge service.${RESET}`);\n writeLine(` ${colors.dim}For local memory search, use: squads memory query \"${query}\"${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. telemetry hooks are 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') || errorMessage.includes('fetch failed')) {\n showServiceSetupGuide('bridge', 'not responding');\n } else {\n writeLine(` ${colors.red}Error searching conversations: ${errorMessage}${RESET}`);\n writeLine();\n }\n }\n}\n\ninterface ExtractOptions {\n session?: string;\n hours?: number;\n dryRun?: boolean;\n}\n\n/**\n * Extract memories from recent conversations and store in Engram\n */\nexport async function memoryExtractCommand(\n options: ExtractOptions = {}\n): Promise<void> {\n writeLine();\n writeLine(` ${gradient('squads')} ${colors.dim}memory extract${RESET}`);\n writeLine();\n\n const hours = options.hours || 24;\n\n try {\n // 1. Fetch recent conversations from bridge\n writeLine(` ${colors.dim}Fetching conversations from last ${hours}h...${RESET}`);\n\n const bridgeResponse = await fetch(`${SQUADS_BRIDGE_URL}/api/conversations/recent`);\n if (!bridgeResponse.ok) {\n throw new Error(`Bridge API error: ${bridgeResponse.status}`);\n }\n\n const { conversations, count } = await bridgeResponse.json() as {\n conversations: Array<{\n id: number;\n session_id: string;\n role: string;\n content: string;\n squad?: string;\n agent?: string;\n created_at: string;\n }>;\n count: number;\n };\n\n if (count === 0) {\n writeLine(` ${colors.yellow}No recent conversations to extract${RESET}`);\n writeLine();\n return;\n }\n\n writeLine(` ${colors.green}${count}${RESET} conversations found`);\n writeLine();\n\n // 2. Group conversations by session\n const sessions = new Map<string, typeof conversations>();\n for (const conv of conversations) {\n const sessionId = conv.session_id || 'unknown';\n if (!sessions.has(sessionId)) {\n sessions.set(sessionId, []);\n }\n sessions.get(sessionId)!.push(conv);\n }\n\n writeLine(` ${colors.cyan}${sessions.size}${RESET} sessions to process`);\n writeLine();\n\n if (options.dryRun) {\n writeLine(` ${colors.yellow}Dry run - not sending to Engram${RESET}`);\n writeLine();\n for (const [sessionId, convs] of sessions) {\n const squad = convs[0]?.squad || 'unknown';\n const agent = convs[0]?.agent || 'unknown';\n writeLine(` ${icons.progress} ${colors.dim}${sessionId.slice(0, 8)}${RESET} ${colors.cyan}${squad}/${agent}${RESET} ${colors.dim}(${convs.length} messages)${RESET}`);\n }\n writeLine();\n return;\n }\n\n // 3. Send each session to mem0 for extraction\n let extracted = 0;\n let failed = 0;\n\n for (const [sessionId, convs] of sessions) {\n const squad = convs[0]?.squad || 'hq';\n const agent = convs[0]?.agent || 'unknown';\n\n // Format messages for mem0\n const messages = convs.map(c => ({\n role: c.role === 'assistant' ? 'assistant' : c.role === 'user' ? 'user' : 'system',\n content: c.content\n }));\n\n try {\n const mem0Response = await fetch(`${MEM0_API_URL}/memories`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n messages,\n user_id: squad,\n agent_id: agent,\n run_id: sessionId,\n metadata: {\n source: 'squads-cli',\n extracted_at: new Date().toISOString()\n }\n })\n });\n\n if (mem0Response.ok) {\n const result = await mem0Response.json() as { results?: Array<unknown> };\n const memCount = result.results?.length || 0;\n writeLine(` ${colors.green}${icons.success}${RESET} ${colors.dim}${sessionId.slice(0, 8)}${RESET} ${colors.cyan}${squad}/${agent}${RESET} → ${colors.green}${memCount}${RESET} memories`);\n extracted++;\n } else {\n writeLine(` ${colors.red}${icons.error}${RESET} ${colors.dim}${sessionId.slice(0, 8)}${RESET} ${colors.red}Failed: ${mem0Response.status}${RESET}`);\n failed++;\n }\n } catch (err) {\n writeLine(` ${colors.red}${icons.error}${RESET} ${colors.dim}${sessionId.slice(0, 8)}${RESET} ${colors.red}Error: ${err}${RESET}`);\n failed++;\n }\n }\n\n writeLine();\n if (failed === 0) {\n writeLine(` ${colors.green}${icons.success}${RESET} Extracted memories from ${extracted} sessions`);\n } else {\n writeLine(` ${colors.yellow}${icons.warning}${RESET} Extracted: ${extracted}, Failed: ${failed}`);\n }\n writeLine();\n\n // Show next steps\n writeLine(` ${colors.dim}$${RESET} squads memory query ${colors.cyan}\"<term>\"${RESET} ${colors.dim}Search extracted memories${RESET}`);\n writeLine();\n\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n if (errorMessage.includes('ECONNREFUSED') || errorMessage.includes('fetch failed')) {\n // Check which service is down\n const bridgeOk = await checkServiceAvailable('bridge', false);\n const mem0Ok = await checkServiceAvailable('mem0', false);\n\n if (!bridgeOk) {\n showServiceSetupGuide('bridge', 'not responding');\n } else if (!mem0Ok) {\n showServiceSetupGuide('mem0', 'not responding');\n } else {\n writeLine(` ${colors.red}Error: ${errorMessage}${RESET}`);\n writeLine();\n }\n } else {\n writeLine(` ${colors.red}Error: ${errorMessage}${RESET}`);\n writeLine();\n }\n }\n}\n","import { execSync } from 'child_process';\nimport { existsSync, readFileSync, writeFileSync, mkdirSync, readdirSync } from 'fs';\nimport { join } from 'path';\nimport { findMemoryDir } from '../lib/memory.js';\nimport { findSquadsDir } from '../lib/squad-parser.js';\nimport { syncAllCycleData, isPostgresAvailable, closeCycleSyncPool, SyncResult } from '../lib/cycle-sync.js';\nimport {\n colors,\n RESET,\n gradient,\n icons,\n writeLine,\n} from '../lib/terminal.js';\nimport { track, Events } from '../lib/telemetry.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 (err) {\n if (process.env.DEBUG) {\n console.error('Git log failed (not a git repo or other error):', err);\n }\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 * Sync squad and agent definitions to Postgres dimension tables.\n * Creates/updates dim_squads and dim_agents from SQUAD.md and agent .md files.\n */\nasync function syncDimensionsToPostgres(verbose?: boolean): Promise<void> {\n const squadsDir = findSquadsDir();\n const bridgeUrl = process.env.SQUADS_BRIDGE_URL || 'http://localhost:8088';\n\n if (!squadsDir) {\n writeLine(` ${colors.red}No .agents/squads directory found${RESET}`);\n return;\n }\n\n writeLine();\n writeLine(` ${gradient('squads')} ${colors.dim}sync --dimensions${RESET}`);\n writeLine();\n writeLine(` ${icons.progress} Collecting squad definitions...`);\n\n // Collect all squads\n const squadDirs = readdirSync(squadsDir, { withFileTypes: true })\n .filter(d => d.isDirectory())\n .map(d => d.name);\n\n const squadsData: Array<{\n name: string;\n mission: string | null;\n domain: string | null;\n default_provider: string;\n daily_budget: number;\n cooldown_seconds: number;\n metadata: Record<string, unknown>;\n }> = [];\n\n const agentsData: Array<{\n name: string;\n squad: string;\n role: string | null;\n purpose: string | null;\n provider: string | null;\n trigger_type: string;\n mcp_servers: string[];\n skills: string[];\n metadata: Record<string, unknown>;\n }> = [];\n\n // Parse each squad\n const { loadSquad: loadSquadFn } = await import('../lib/squad-parser.js');\n\n for (const squadName of squadDirs) {\n const squad = loadSquadFn(squadName);\n if (!squad) continue;\n\n squadsData.push({\n name: squad.name,\n mission: squad.mission || null,\n domain: squad.domain || null,\n default_provider: squad.providers?.default || 'anthropic',\n daily_budget: squad.context?.budget?.daily || 50,\n cooldown_seconds: squad.context?.cooldown || 300,\n metadata: {\n providers: squad.providers,\n context: squad.context,\n permissions: squad.permissions,\n },\n });\n\n // Parse agents in this squad\n for (const agent of squad.agents) {\n const agentPath = join(squadsDir, squadName, `${agent.name}.md`);\n if (!existsSync(agentPath)) continue;\n\n // Extract MCP servers and skills from definition\n const definition = readFileSync(agentPath, 'utf-8');\n const mcpServers = extractMcpServersFromDef(definition);\n const skills = extractSkillsFromDef(definition);\n\n agentsData.push({\n name: agent.name,\n squad: squadName,\n role: agent.role || null,\n purpose: agent.purpose || null,\n provider: agent.provider || null,\n trigger_type: agent.trigger?.toLowerCase() || 'manual',\n mcp_servers: mcpServers,\n skills: skills,\n metadata: {\n schedule: agent.schedule,\n outputs: agent.outputs,\n },\n });\n }\n }\n\n writeLine(` ${icons.success} Found ${colors.cyan}${squadsData.length}${RESET} squads, ${colors.cyan}${agentsData.length}${RESET} agents`);\n\n if (verbose) {\n writeLine();\n for (const s of squadsData) {\n writeLine(` ${colors.cyan}${s.name}${RESET} ${colors.dim}(${s.metadata.providers ? 'with providers' : 'default'})${RESET}`);\n }\n }\n\n // Send to bridge\n writeLine();\n writeLine(` ${icons.progress} Syncing to Postgres...`);\n\n try {\n const response = await fetch(`${bridgeUrl}/api/sync/dimensions`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ squads: squadsData, agents: agentsData }),\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`Bridge returned ${response.status}: ${error}`);\n }\n\n const data = await response.json() as { synced_squads: number; synced_agents: number };\n\n writeLine(` ${icons.success} Synced ${colors.green}${data.synced_squads}${RESET} squads, ${colors.green}${data.synced_agents}${RESET} agents`);\n writeLine();\n\n } catch (error) {\n writeLine(` ${icons.error} ${colors.red}Sync failed: ${error}${RESET}`);\n writeLine();\n writeLine(` ${colors.dim}Is the bridge running? Check: curl ${bridgeUrl}/health${RESET}`);\n writeLine();\n }\n}\n\nfunction extractMcpServersFromDef(definition: string): string[] {\n const servers: Set<string> = new Set();\n const knownServers = ['chrome-devtools', 'firecrawl', 'context7', 'huggingface'];\n\n for (const server of knownServers) {\n if (definition.toLowerCase().includes(server)) {\n servers.add(server);\n }\n }\n\n const mcpMatch = definition.match(/mcp:\\s*\\n((?:\\s*-\\s*\\S+\\s*\\n?)+)/i);\n if (mcpMatch) {\n for (const line of mcpMatch[1].split('\\n')) {\n const m = line.match(/^\\s*-\\s*(\\S+)/);\n if (m) servers.add(m[1]);\n }\n }\n\n return Array.from(servers);\n}\n\nfunction extractSkillsFromDef(definition: string): string[] {\n const skills: Set<string> = new Set();\n\n const skillsMatch = definition.match(/skills:\\s*\\n((?:\\s*-\\s*\\S+\\s*\\n?)+)/i);\n if (skillsMatch) {\n for (const line of skillsMatch[1].split('\\n')) {\n const m = line.match(/^\\s*-\\s*(\\S+)/);\n if (m) skills.add(m[1]);\n }\n }\n\n const slashSkills = definition.match(/\\/[\\w-]+/g);\n if (slashSkills) {\n for (const skill of slashSkills) {\n if (!skill.startsWith('/exit') && !skill.startsWith('/help')) {\n skills.add(skill.slice(1));\n }\n }\n }\n\n return Array.from(skills);\n}\n\ninterface LearningEntry {\n squad: string;\n agent: string | null;\n content: string;\n category: string;\n importance: string;\n source_file: string;\n}\n\ninterface GeneratedLearning {\n squad: string;\n insight: string;\n category: 'success' | 'failure' | 'pattern' | 'tip';\n tags: string[];\n context: string; // commit hashes\n}\n\n// Commit message prefixes that indicate learning categories\nconst COMMIT_CATEGORY_MAP: Record<string, 'success' | 'failure' | 'pattern' | 'tip'> = {\n 'feat': 'success',\n 'fix': 'failure',\n 'refactor': 'pattern',\n 'perf': 'pattern',\n 'docs': 'tip',\n 'chore': 'tip',\n 'test': 'pattern',\n 'style': 'tip',\n};\n\n// Patterns that indicate significant learnings worth capturing\nconst SIGNIFICANT_PATTERNS = [\n { pattern: /\\d+\\s*(agents?|files?|components?)/i, weight: 2 }, // Batch operations\n { pattern: /parallel|concurrent|async/i, weight: 2 }, // Parallelization\n { pattern: /automat|hook|trigger/i, weight: 2 }, // Automation\n { pattern: /integrat|connect|bridge/i, weight: 1.5 }, // Integration\n { pattern: /improv|optim|enhanc|better/i, weight: 1.5 }, // Improvements\n { pattern: /new|add|implement|create/i, weight: 1 }, // New features\n];\n\n/**\n * Analyze commits and generate learnings based on patterns\n */\nfunction analyzeCommitsForLearnings(commits: CommitInfo[]): GeneratedLearning[] {\n const learnings: GeneratedLearning[] = [];\n const squadCommits = groupCommitsBySquad(commits);\n\n for (const [squad, squadCommitList] of squadCommits) {\n // Group by category (feat, fix, etc.)\n const byCategory = new Map<string, CommitInfo[]>();\n\n for (const commit of squadCommitList) {\n // Extract conventional commit prefix\n const match = commit.message.match(/^(\\w+)(?:\\(.*?\\))?:\\s*/);\n const prefix = match ? match[1].toLowerCase() : 'other';\n\n if (!byCategory.has(prefix)) {\n byCategory.set(prefix, []);\n }\n byCategory.get(prefix)!.push(commit);\n }\n\n // Generate learnings for significant patterns\n for (const [prefix, categoryCommits] of byCategory) {\n if (categoryCommits.length === 0) continue;\n\n const category = COMMIT_CATEGORY_MAP[prefix] || 'tip';\n\n // Calculate significance score\n let significanceScore = categoryCommits.length; // Base: number of commits\n const allMessages = categoryCommits.map(c => c.message).join(' ');\n\n for (const { pattern, weight } of SIGNIFICANT_PATTERNS) {\n if (pattern.test(allMessages)) {\n significanceScore *= weight;\n }\n }\n\n // Only generate learning if significant enough (score > 2)\n if (significanceScore < 2) continue;\n\n // Generate insight text\n let insight: string;\n if (categoryCommits.length === 1) {\n // Single commit - use message directly\n insight = categoryCommits[0].message.replace(/^(\\w+)(?:\\(.*?\\))?:\\s*/, '');\n } else {\n // Multiple commits - summarize\n const summaryParts = categoryCommits\n .slice(0, 3)\n .map(c => c.message.replace(/^(\\w+)(?:\\(.*?\\))?:\\s*/, ''));\n\n insight = `${prefix}: ${summaryParts.join('; ')}${categoryCommits.length > 3 ? ` (+${categoryCommits.length - 3} more)` : ''}`;\n }\n\n // Extract tags from file paths\n const tags = new Set<string>();\n for (const commit of categoryCommits) {\n for (const file of commit.files) {\n if (file.includes('agents')) tags.add('agents');\n if (file.includes('memory')) tags.add('memory');\n if (file.includes('cli')) tags.add('cli');\n if (file.includes('web')) tags.add('web');\n if (file.includes('hook')) tags.add('hooks');\n }\n }\n\n learnings.push({\n squad,\n insight,\n category,\n tags: Array.from(tags),\n context: categoryCommits.map(c => c.hash).join(', '),\n });\n }\n }\n\n return learnings;\n}\n\n/**\n * Append auto-generated learnings to learnings.md files\n */\nfunction appendAutoLearnings(memoryDir: string, learnings: GeneratedLearning[]): number {\n let appended = 0;\n const date = new Date().toISOString().split('T')[0];\n\n for (const learning of learnings) {\n const squadDir = join(memoryDir, learning.squad);\n\n // Find or create agent directory\n let agentDir: string;\n if (existsSync(squadDir)) {\n const dirs = readdirSync(squadDir, { withFileTypes: true })\n .filter(d => d.isDirectory())\n .map(d => d.name);\n agentDir = dirs.length > 0 ? join(squadDir, dirs[0]) : join(squadDir, `${learning.squad}-lead`);\n } else {\n mkdirSync(squadDir, { recursive: true });\n agentDir = join(squadDir, `${learning.squad}-lead`);\n }\n\n if (!existsSync(agentDir)) {\n mkdirSync(agentDir, { recursive: true });\n }\n\n const learningsPath = join(agentDir, 'learnings.md');\n\n // Build learning entry\n const categoryEmoji = {\n success: '✓',\n failure: '✗',\n pattern: '◆',\n tip: '→',\n }[learning.category];\n\n const tagsStr = learning.tags.length > 0 ? ` #${learning.tags.join(' #')}` : '';\n const entry = `\\n${date} ${categoryEmoji} **${learning.category.charAt(0).toUpperCase() + learning.category.slice(1)}**: ${learning.insight}${tagsStr}\\n`;\n\n // Append to file\n let content = '';\n if (existsSync(learningsPath)) {\n content = readFileSync(learningsPath, 'utf-8');\n // Check if this insight already exists (avoid duplicates)\n if (content.includes(learning.insight.slice(0, 50))) {\n continue;\n }\n } else {\n content = `# ${learning.squad} Squad - Learnings\\n\\nAuto-captured insights from session activity.\\n`;\n }\n\n writeFileSync(learningsPath, content + entry);\n appended++;\n }\n\n return appended;\n}\n\n/**\n * Parse a learnings.md file into individual learning entries\n */\nfunction parseLearningsFile(filePath: string, squad: string, agent: string | null): LearningEntry[] {\n const content = readFileSync(filePath, 'utf-8');\n const learnings: LearningEntry[] = [];\n\n // Split by headers (##, ###) to get sections\n const sections = content.split(/^##+ /m).filter(Boolean);\n\n for (const section of sections) {\n const lines = section.trim().split('\\n');\n const title = lines[0]?.trim();\n const body = lines.slice(1).join('\\n').trim();\n\n if (!body || body.length < 20) continue; // Skip empty or too short\n\n // Determine category from section title\n let category = 'insight';\n const titleLower = title?.toLowerCase() || '';\n if (titleLower.includes('what works') || titleLower.includes('success')) category = 'success';\n else if (titleLower.includes('what doesn\\'t') || titleLower.includes('unsuccessful') || titleLower.includes('fail')) category = 'failure';\n else if (titleLower.includes('pattern')) category = 'pattern';\n else if (titleLower.includes('improvement') || titleLower.includes('next')) category = 'tip';\n\n // Determine importance from content markers\n let importance = 'normal';\n if (body.includes('**Learning**:') || body.includes('critical') || body.includes('P1')) importance = 'high';\n\n learnings.push({\n squad,\n agent,\n content: title ? `## ${title}\\n${body}` : body,\n category,\n importance,\n source_file: filePath,\n });\n }\n\n // Also extract individual bullet points marked as learnings\n const learningMatches = content.matchAll(/\\*\\*Learning\\*\\*:\\s*(.+?)(?=\\n\\n|\\n\\*\\*|$)/gs);\n for (const match of learningMatches) {\n learnings.push({\n squad,\n agent,\n content: match[1].trim(),\n category: 'insight',\n importance: 'high',\n source_file: filePath,\n });\n }\n\n return learnings;\n}\n\n/**\n * Sync learnings from .agents/memory to Postgres\n */\nasync function syncLearningsToPostgres(verbose?: boolean): Promise<void> {\n const bridgeUrl = process.env.SQUADS_BRIDGE_URL || 'http://localhost:8088';\n const memoryDir = findMemoryDir();\n\n writeLine();\n writeLine(` ${gradient('squads')} ${colors.dim}sync --learnings${RESET}`);\n writeLine();\n\n if (!memoryDir) {\n writeLine(` ${icons.error} ${colors.red}No .agents/memory directory found${RESET}`);\n return;\n }\n\n // Find all learnings.md files\n writeLine(` ${icons.progress} Scanning for learnings files...`);\n\n const learningsFiles: string[] = [];\n const scanDir = (dir: string) => {\n const entries = readdirSync(dir, { withFileTypes: true });\n for (const entry of entries) {\n const fullPath = join(dir, entry.name);\n if (entry.isDirectory()) {\n scanDir(fullPath);\n } else if (entry.name === 'learnings.md') {\n learningsFiles.push(fullPath);\n }\n }\n };\n scanDir(memoryDir);\n\n writeLine(` ${icons.success} Found ${colors.cyan}${learningsFiles.length}${RESET} learnings files`);\n\n // Parse all learnings\n const allLearnings: LearningEntry[] = [];\n for (const file of learningsFiles) {\n // Extract squad and agent from path: .agents/memory/<squad>/<agent>/learnings.md\n const relativePath = file.replace(memoryDir + '/', '');\n const parts = relativePath.split('/');\n const squad = parts[0] || 'unknown';\n const agent = parts.length > 2 ? parts[1] : null;\n\n const entries = parseLearningsFile(file, squad, agent);\n allLearnings.push(...entries);\n\n if (verbose && entries.length > 0) {\n writeLine(` ${colors.cyan}${squad}${agent ? '/' + agent : ''}${RESET}: ${entries.length} learnings`);\n }\n }\n\n writeLine(` ${icons.success} Parsed ${colors.cyan}${allLearnings.length}${RESET} total learnings`);\n\n if (allLearnings.length === 0) {\n writeLine();\n writeLine(` ${colors.dim}No learnings to sync${RESET}`);\n return;\n }\n\n // Send to bridge\n writeLine();\n writeLine(` ${icons.progress} Syncing to Postgres...`);\n\n try {\n const response = await fetch(`${bridgeUrl}/api/sync/learnings`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ learnings: allLearnings }),\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`Bridge returned ${response.status}: ${errorText}`);\n }\n\n const result = await response.json() as { imported: number; skipped: number };\n writeLine(` ${icons.success} Imported ${colors.green}${result.imported}${RESET} learnings${result.skipped > 0 ? `, skipped ${result.skipped} duplicates` : ''}`);\n\n } catch (error) {\n writeLine(` ${icons.error} ${colors.red}Sync failed: ${error}${RESET}`);\n writeLine();\n writeLine(` ${colors.dim}Is the bridge running? Check: curl ${bridgeUrl}/health${RESET}`);\n }\n\n writeLine();\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; postgres?: boolean; dimensions?: boolean; learnings?: boolean; autoLearn?: boolean } = {}): Promise<void> {\n await track(Events.CLI_MEMORY_SYNC, { push: options.push, pull: options.pull, postgres: options.postgres, dimensions: options.dimensions, learnings: options.learnings, autoLearn: options.autoLearn });\n\n // If --dimensions flag, sync squad/agent definitions to Postgres dim tables\n if (options.dimensions) {\n await syncDimensionsToPostgres(options.verbose);\n return;\n }\n\n // If --learnings flag, sync learnings.md files to Postgres\n if (options.learnings) {\n await syncLearningsToPostgres(options.verbose);\n return;\n }\n\n // If --auto-learn flag, generate and append learnings from commits\n if (options.autoLearn) {\n const memoryDir = findMemoryDir();\n if (!memoryDir) {\n writeLine(` ${colors.yellow}No .agents/memory directory found${RESET}`);\n return;\n }\n\n writeLine();\n writeLine(` ${gradient('squads')} ${colors.dim}memory sync --auto-learn${RESET}`);\n writeLine();\n\n // Get commits since last sync (or last 20)\n const lastSync = getLastSyncTime(memoryDir);\n const commits = getRecentCommits(lastSync || undefined);\n\n if (commits.length === 0) {\n writeLine(` ${colors.dim}No commits to analyze${RESET}`);\n writeLine();\n return;\n }\n\n writeLine(` ${icons.progress} Analyzing ${colors.cyan}${commits.length}${RESET} commits...`);\n\n // Analyze and generate learnings\n const learnings = analyzeCommitsForLearnings(commits);\n\n if (learnings.length === 0) {\n writeLine(` ${colors.dim}No significant patterns detected${RESET}`);\n writeLine();\n return;\n }\n\n writeLine(` ${icons.success} Found ${colors.cyan}${learnings.length}${RESET} learnable patterns`);\n writeLine();\n\n // Show what will be captured\n if (options.verbose) {\n for (const learning of learnings) {\n const emoji = { success: '✓', failure: '✗', pattern: '◆', tip: '→' }[learning.category];\n writeLine(` ${colors.cyan}${learning.squad}${RESET} ${emoji} ${learning.insight.slice(0, 60)}${learning.insight.length > 60 ? '...' : ''}`);\n }\n writeLine();\n }\n\n // Append to learnings.md files\n const appended = appendAutoLearnings(memoryDir, learnings);\n\n writeLine(` ${icons.success} Captured ${colors.green}${appended}${RESET} learnings to memory`);\n\n // Show summary by squad\n const bySquad = new Map<string, number>();\n for (const l of learnings) {\n bySquad.set(l.squad, (bySquad.get(l.squad) || 0) + 1);\n }\n for (const [squad, count] of bySquad) {\n writeLine(` ${colors.cyan}${squad}${RESET}: ${count} learnings`);\n }\n\n writeLine();\n\n // Update last sync time\n updateLastSyncTime(memoryDir);\n\n // Sync to Postgres if requested\n if (options.postgres) {\n await syncLearningsToPostgres(options.verbose);\n }\n\n return;\n }\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\n // Still sync to Postgres if requested (even without new commits)\n if (options.postgres) {\n writeLine();\n writeLine(` ${icons.progress} Syncing cycle data to Postgres...`);\n\n const pgAvailable = await isPostgresAvailable();\n if (!pgAvailable) {\n writeLine(` ${icons.error} ${colors.red}Postgres not available${RESET}`);\n writeLine(` ${colors.dim}Run \\`squads stack up\\` to start the database${RESET}`);\n } else {\n try {\n const result: SyncResult = await syncAllCycleData();\n\n const totalSynced = result.goals.synced + result.feedback.synced + result.kpis.synced + result.learnings.synced;\n const totalErrors = result.goals.errors + result.feedback.errors + result.kpis.errors + result.learnings.errors;\n\n if (totalSynced > 0 || totalErrors > 0) {\n writeLine(` ${icons.success} Synced to Postgres ${colors.dim}(${result.duration}ms)${RESET}`);\n if (result.goals.synced > 0) {\n writeLine(` ${colors.dim}Goals:${RESET} ${colors.cyan}${result.goals.synced}${RESET}`);\n }\n if (result.feedback.synced > 0) {\n writeLine(` ${colors.dim}Feedback:${RESET} ${colors.cyan}${result.feedback.synced}${RESET}`);\n }\n if (result.kpis.synced > 0) {\n writeLine(` ${colors.dim}KPIs:${RESET} ${colors.cyan}${result.kpis.synced}${RESET}`);\n }\n if (result.learnings.synced > 0) {\n writeLine(` ${colors.dim}Learnings:${RESET} ${colors.cyan}${result.learnings.synced}${RESET}`);\n }\n if (totalErrors > 0) {\n writeLine(` ${colors.red}Errors:${RESET} ${totalErrors}`);\n }\n } else {\n writeLine(` ${icons.success} ${colors.dim}No new cycle data to sync${RESET}`);\n }\n\n await closeCycleSyncPool();\n } catch (err) {\n writeLine(` ${icons.error} ${colors.red}Postgres sync failed${RESET}`);\n if (process.env.DEBUG) console.error(err);\n }\n }\n }\n\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 // Step 4: Sync to Postgres if requested\n if (options.postgres) {\n writeLine(` ${icons.progress} Syncing cycle data to Postgres...`);\n\n const pgAvailable = await isPostgresAvailable();\n if (!pgAvailable) {\n writeLine(` ${icons.error} ${colors.red}Postgres not available${RESET}`);\n writeLine(` ${colors.dim}Run \\`squads stack up\\` to start the database${RESET}`);\n writeLine();\n } else {\n try {\n const result: SyncResult = await syncAllCycleData();\n\n const totalSynced = result.goals.synced + result.feedback.synced + result.kpis.synced + result.learnings.synced;\n const totalErrors = result.goals.errors + result.feedback.errors + result.kpis.errors + result.learnings.errors;\n\n if (totalSynced > 0 || totalErrors > 0) {\n writeLine(` ${icons.success} Synced to Postgres ${colors.dim}(${result.duration}ms)${RESET}`);\n if (result.goals.synced > 0) {\n writeLine(` ${colors.dim}Goals:${RESET} ${colors.cyan}${result.goals.synced}${RESET}`);\n }\n if (result.feedback.synced > 0) {\n writeLine(` ${colors.dim}Feedback:${RESET} ${colors.cyan}${result.feedback.synced}${RESET}`);\n }\n if (result.kpis.synced > 0) {\n writeLine(` ${colors.dim}KPIs:${RESET} ${colors.cyan}${result.kpis.synced}${RESET}`);\n }\n if (result.learnings.synced > 0) {\n writeLine(` ${colors.dim}Learnings:${RESET} ${colors.cyan}${result.learnings.synced}${RESET}`);\n }\n if (totalErrors > 0) {\n writeLine(` ${colors.red}Errors:${RESET} ${totalErrors}`);\n }\n } else {\n writeLine(` ${icons.success} ${colors.dim}No new cycle data to sync${RESET}`);\n }\n writeLine();\n\n await closeCycleSyncPool();\n } catch (err) {\n writeLine(` ${icons.error} ${colors.red}Postgres sync failed${RESET}`);\n if (process.env.DEBUG) console.error(err);\n writeLine();\n }\n }\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 if (!options.postgres) {\n writeLine(` ${colors.dim}$${RESET} squads memory sync --postgres ${colors.dim}Sync to Postgres${RESET}`);\n }\n writeLine();\n}\n","/**\n * Cycle Data Sync — stub implementation\n *\n * Syncing cycle data to Postgres is a platform feature (Layer 3).\n * The CLI (Layer 1) stores all data in local markdown/JSON files.\n * These stubs maintain API compatibility for the sync command.\n */\n\n/**\n * Sync result for a single data type\n */\nexport interface SyncStats {\n synced: number;\n skipped: number;\n errors: number;\n}\n\n/**\n * Full sync result\n */\nexport interface SyncResult {\n goals: SyncStats;\n feedback: SyncStats;\n kpis: SyncStats;\n learnings: SyncStats;\n duration: number;\n}\n\n/**\n * Sync all cycle data (no-op without database)\n */\nexport async function syncAllCycleData(): Promise<SyncResult> {\n return {\n goals: { synced: 0, skipped: 0, errors: 0 },\n feedback: { synced: 0, skipped: 0, errors: 0 },\n kpis: { synced: 0, skipped: 0, errors: 0 },\n learnings: { synced: 0, skipped: 0, errors: 0 },\n duration: 0,\n };\n}\n\n/**\n * Check if Postgres is available (always false in CLI-only mode)\n */\nexport async function isPostgresAvailable(): Promise<boolean> {\n return false;\n}\n\n/**\n * Close the connection pool (no-op)\n */\nexport async function closeCycleSyncPool(): Promise<void> {\n // No-op: no database connection in CLI-only mode\n}\n","import {\n colors,\n RESET,\n gradient,\n icons,\n writeLine,\n bold,\n} from '../lib/terminal.js';\nimport { track, Events } from '../lib/telemetry.js';\n\ninterface AutonomyOptions {\n squad?: string;\n period?: 'today' | 'week' | 'month';\n json?: boolean;\n}\n\ninterface AutonomyScore {\n overall_score: number;\n confidence_level: string;\n period: string;\n squad: string | null;\n components: {\n quota_compliance: number;\n cooldown_compliance: number;\n quality_score: number;\n success_rate: number;\n learning_utilization: number;\n };\n execution_stats: {\n total_tasks: number;\n successful_tasks: number;\n monthly_used: number;\n monthly_quota: number;\n quota_pct: number;\n learning_count: number;\n };\n error?: string;\n}\n\n/**\n * Display autonomy score and confidence metrics.\n * Shows how ready the system is for autonomous operation.\n */\nexport async function autonomyCommand(options: AutonomyOptions = {}): Promise<void> {\n const bridgeUrl = process.env.SQUADS_BRIDGE_URL || 'http://localhost:8088';\n const period = options.period || 'today';\n\n await track(Events.CLI_STATUS, { command: 'autonomy', period, squad: options.squad });\n\n try {\n const params = new URLSearchParams({ period });\n if (options.squad) params.append('squad', options.squad);\n\n const response = await fetch(`${bridgeUrl}/api/autonomy/score?${params}`);\n const data = await response.json() as AutonomyScore;\n\n if (options.json) {\n console.log(JSON.stringify(data, null, 2));\n return;\n }\n\n writeLine();\n writeLine(` ${gradient('squads')} ${colors.dim}autonomy${RESET}`);\n writeLine();\n\n // Overall score with visual indicator\n const score = data.overall_score;\n const confidence = data.confidence_level;\n const scoreColor = score >= 75 ? colors.green : score >= 50 ? colors.yellow : colors.red;\n const confidenceIcon = confidence === 'high' ? icons.success : confidence === 'medium' ? icons.warning : icons.error;\n\n writeLine(` ${bold}Overall Score${RESET} ${scoreColor}${score}%${RESET} ${confidenceIcon} ${confidence} confidence`);\n writeLine();\n\n // Progress bar\n const barWidth = 40;\n const filled = Math.round((score / 100) * barWidth);\n const bar = `${scoreColor}${'█'.repeat(filled)}${colors.dim}${'░'.repeat(barWidth - filled)}${RESET}`;\n writeLine(` ${bar}`);\n writeLine();\n\n // Component scores\n writeLine(` ${bold}Components${RESET}`);\n writeLine();\n\n const components = [\n { name: 'Quota Compliance', score: data.components.quota_compliance, weight: '25%' },\n { name: 'Success Rate', score: data.components.success_rate, weight: '25%' },\n { name: 'Quality Score', score: data.components.quality_score, weight: '20%' },\n { name: 'Cooldown Compliance', score: data.components.cooldown_compliance, weight: '15%' },\n { name: 'Learning Utilization', score: data.components.learning_utilization, weight: '15%' },\n ];\n\n for (const comp of components) {\n const compColor = comp.score >= 75 ? colors.green : comp.score >= 50 ? colors.yellow : colors.red;\n const compBar = `${compColor}${'█'.repeat(Math.round(comp.score / 5))}${colors.dim}${'░'.repeat(20 - Math.round(comp.score / 5))}${RESET}`;\n writeLine(` ${comp.name.padEnd(22)} ${compBar} ${compColor}${comp.score}%${RESET} ${colors.dim}(${comp.weight})${RESET}`);\n }\n\n writeLine();\n\n // Execution stats\n writeLine(` ${bold}Stats${RESET} ${colors.dim}(${period})${RESET}`);\n writeLine();\n writeLine(` ${colors.dim}Tasks:${RESET} ${data.execution_stats.successful_tasks}/${data.execution_stats.total_tasks} successful`);\n writeLine(` ${colors.dim}Quota:${RESET} $${data.execution_stats.monthly_used}/$${data.execution_stats.monthly_quota}/mo (${data.execution_stats.quota_pct}%)`);\n writeLine(` ${colors.dim}Learnings:${RESET} ${data.execution_stats.learning_count} captured`);\n\n if (options.squad) {\n writeLine(` ${colors.dim}Squad:${RESET} ${options.squad}`);\n }\n\n writeLine();\n\n // Recommendations\n if (score < 75) {\n writeLine(` ${bold}Recommendations${RESET}`);\n writeLine();\n\n if (data.components.learning_utilization < 50) {\n writeLine(` ${icons.empty} Capture more learnings: ${colors.dim}squads learn \"...\"${RESET}`);\n }\n if (data.components.quality_score < 70) {\n writeLine(` ${icons.empty} Add feedback after runs: ${colors.dim}squads feedback add <squad> <1-5>${RESET}`);\n }\n if (data.components.quota_compliance < 80) {\n writeLine(` ${icons.empty} Approaching monthly quota limit - consider upgrading plan`);\n }\n if (data.execution_stats.total_tasks === 0) {\n writeLine(` ${icons.empty} Run some agents: ${colors.dim}squads run <squad> --execute${RESET}`);\n }\n\n writeLine();\n }\n\n // Next steps\n writeLine(` ${colors.dim}$${RESET} squads autonomy --period=week ${colors.dim}Weekly view${RESET}`);\n writeLine(` ${colors.dim}$${RESET} squads memory sync --dimensions ${colors.dim}Sync to Postgres${RESET}`);\n writeLine();\n\n } catch (error) {\n writeLine();\n writeLine(` ${gradient('squads')} ${colors.dim}autonomy${RESET}`);\n writeLine();\n writeLine(` ${icons.error} ${colors.red}Failed to fetch autonomy score${RESET}`);\n writeLine(` ${colors.dim}${error}${RESET}`);\n writeLine();\n writeLine(` ${colors.dim}Is the bridge running? Check: curl ${bridgeUrl}/health${RESET}`);\n writeLine();\n }\n}\n","import {\n loadSquad,\n findSquadsDir,\n listSquads,\n addGoalToSquad,\n updateGoalInSquad,\n} from '../lib/squad-parser.js';\nimport {\n colors,\n bold,\n RESET,\n gradient,\n truncate,\n icons,\n writeLine,\n} from '../lib/terminal.js';\nimport { track, Events } from '../lib/telemetry.js';\n\nexport async function goalSetCommand(\n squadName: string,\n description: string,\n options: { metric?: string[] }\n): Promise<void> {\n await track(Events.CLI_GOAL_SET, { squad: squadName });\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 await track(Events.CLI_GOAL_LIST, { squad: squadName || 'all' });\n const squadsDir = findSquadsDir();\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 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 await track(Events.CLI_GOAL_COMPLETE, { squad: squadName });\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 (isNaN(idx) || idx < 0 || idx >= squad.goals.length) {\n writeLine(` ${colors.red}Invalid goal index: ${goalIndex}${RESET}`);\n if (squad.goals.length === 0) {\n writeLine(` ${colors.dim}Squad has no goals${RESET}`);\n } else {\n writeLine(` ${colors.dim}Valid indexes: 1-${squad.goals.length}${RESET}`);\n writeLine(` ${colors.dim}Tip: Run 'squads goal list ${squadName}' to see goals with indexes${RESET}`);\n }\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 await track(Events.CLI_GOAL_PROGRESS, { squad: squadName });\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 (isNaN(idx) || idx < 0 || idx >= squad.goals.length) {\n writeLine(` ${colors.red}Invalid goal index: ${goalIndex}${RESET}`);\n if (squad.goals.length === 0) {\n writeLine(` ${colors.dim}Squad has no goals${RESET}`);\n } else {\n writeLine(` ${colors.dim}Valid indexes: 1-${squad.goals.length}${RESET}`);\n writeLine(` ${colors.dim}Tip: Run 'squads goal list ${squadName}' to see goals with indexes${RESET}`);\n }\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';\nimport { track, Events } from '../lib/telemetry.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 await track(Events.CLI_FEEDBACK_ADD, { squad: squadName, rating: parseInt(rating) });\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 await 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 await track(Events.CLI_FEEDBACK_SHOW, { squad: squadName });\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 await track(Events.CLI_FEEDBACK_STATS);\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 { existsSync, mkdirSync, readFileSync, writeFileSync } 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 RESET,\n gradient,\n icons,\n writeLine,\n} from '../lib/terminal.js';\nimport { track, Events } from '../lib/telemetry.js';\n\nexport interface Learning {\n date: string;\n insight: string;\n category: 'success' | 'failure' | 'pattern' | 'tip';\n tags: string[];\n squad?: string;\n context?: string;\n}\n\n/**\n * Parse existing learnings from a file\n */\nfunction parseLearnings(content: string): Learning[] {\n const learnings: Learning[] = [];\n const sections = content.split(/\\n---\\n/).filter(s => s.trim());\n\n for (const section of sections) {\n if (section.startsWith('#')) continue; // Skip header\n\n const dateMatch = section.match(/_(\\d{4}-\\d{2}-\\d{2})_/);\n const categoryMatch = section.match(/\\*\\*(\\w+)\\*\\*:/);\n const tagsMatch = section.match(/Tags: `([^`]+)`/);\n\n // Extract the insight (the main content)\n const lines = section.split('\\n').filter(l => l.trim() && !l.startsWith('_') && !l.includes('Tags:'));\n const insight = lines\n .map(l => l.replace(/^\\*\\*\\w+\\*\\*:\\s*/, ''))\n .join(' ')\n .trim();\n\n if (dateMatch && insight) {\n learnings.push({\n date: dateMatch[1],\n insight,\n category: (categoryMatch?.[1]?.toLowerCase() as Learning['category']) || 'tip',\n tags: tagsMatch?.[1]?.split(',').map(t => t.trim()) || [],\n });\n }\n }\n\n return learnings;\n}\n\n/**\n * Format a learning entry for storage\n */\nfunction formatLearning(learning: Learning): string {\n // Plain unicode for file storage (no ANSI codes)\n const categoryEmoji = {\n success: '●',\n failure: '✗',\n pattern: '◆',\n tip: '→',\n };\n\n let entry = `\\n---\\n_${learning.date}_\\n\\n`;\n entry += `${categoryEmoji[learning.category]} **${learning.category.charAt(0).toUpperCase() + learning.category.slice(1)}**: ${learning.insight}\\n`;\n\n if (learning.tags.length > 0) {\n entry += `Tags: \\`${learning.tags.join(', ')}\\`\\n`;\n }\n\n if (learning.context) {\n entry += `\\n_Context: ${learning.context}_\\n`;\n }\n\n return entry;\n}\n\n/**\n * Add a learning\n */\nexport async function learnCommand(\n insight: string,\n options: {\n squad?: string;\n category?: string;\n tags?: string;\n context?: string;\n }\n): Promise<void> {\n // Determine squad - use provided or default to 'general'\n let squadName = options.squad || 'general';\n\n // Validate squad exists if specified\n if (options.squad) {\n const squadsDir = findSquadsDir();\n if (squadsDir) {\n const squads = listSquads(squadsDir);\n if (!squads.includes(options.squad)) {\n writeLine();\n writeLine(` ${colors.yellow}${icons.warning} Squad '${options.squad}' not found${RESET}`);\n writeLine(` ${colors.dim}Available: ${squads.join(', ')}${RESET}`);\n writeLine(` ${colors.dim}Using 'general' instead${RESET}`);\n squadName = 'general';\n }\n }\n }\n\n // Parse tags\n const tags = options.tags\n ? options.tags.split(',').map(t => t.trim().toLowerCase())\n : [];\n\n // Auto-extract tags from insight if none provided\n if (tags.length === 0) {\n const autoTags = extractTags(insight);\n tags.push(...autoTags);\n }\n\n // Determine category\n const category = (options.category as Learning['category']) || inferCategory(insight);\n\n // Create learning entry\n const learning: Learning = {\n date: new Date().toISOString().split('T')[0],\n insight,\n category,\n tags,\n squad: squadName,\n context: options.context,\n };\n\n // Get or create learnings file\n const memoryDir = findMemoryDir();\n if (!memoryDir) {\n writeLine(` ${colors.red}No .agents/memory directory found${RESET}`);\n writeLine(` ${colors.dim}Run 'squads init' first${RESET}`);\n return;\n }\n\n const learningsPath = join(memoryDir, squadName, 'shared', 'learnings.md');\n const dir = dirname(learningsPath);\n\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n\n // Read existing or create header\n let content = '';\n if (existsSync(learningsPath)) {\n content = readFileSync(learningsPath, 'utf-8');\n } else {\n content = `# ${squadName} - Learnings\\n\\n> Accumulated knowledge from sessions\\n`;\n }\n\n // Append learning\n content += formatLearning(learning);\n writeFileSync(learningsPath, content);\n\n // Track telemetry\n await track(Events.CLI_LEARN, {\n squad: squadName,\n category,\n tagCount: tags.length,\n });\n\n // Display\n writeLine();\n writeLine(` ${icons.success} Learning captured for ${colors.cyan}${squadName}${RESET}`);\n writeLine();\n writeLine(` ${colors.dim}Category:${RESET} ${category}`);\n if (tags.length > 0) {\n writeLine(` ${colors.dim}Tags:${RESET} ${tags.map(t => `#${t}`).join(' ')}`);\n }\n writeLine();\n writeLine(` ${colors.green}${insight}${RESET}`);\n writeLine();\n}\n\n/**\n * Show learnings for a squad\n */\nexport async function learnShowCommand(\n squadName: string,\n options: { limit?: string; category?: string; tag?: string }\n): Promise<void> {\n const memoryDir = findMemoryDir();\n if (!memoryDir) {\n writeLine(` ${colors.red}No memory directory found${RESET}`);\n return;\n }\n\n const learningsPath = join(memoryDir, squadName, 'shared', 'learnings.md');\n if (!existsSync(learningsPath)) {\n writeLine(` ${colors.yellow}No learnings recorded for ${squadName}${RESET}`);\n writeLine(` ${colors.dim}Add one: squads learn \"insight\" --squad ${squadName}${RESET}`);\n return;\n }\n\n const content = readFileSync(learningsPath, 'utf-8');\n const learnings = parseLearnings(content);\n\n // Filter\n let filtered = learnings;\n if (options.category) {\n filtered = filtered.filter(l => l.category === options.category);\n }\n if (options.tag) {\n const tag = options.tag.toLowerCase();\n filtered = filtered.filter(l => l.tags.includes(tag));\n }\n\n // Limit and reverse (most recent first)\n const limit = options.limit ? parseInt(options.limit) : 10;\n const recent = filtered.slice(-limit).reverse();\n\n // Track\n await track(Events.CLI_LEARN_SHOW, { squad: squadName });\n\n // Display\n writeLine();\n writeLine(` ${gradient('squads')} ${colors.dim}learnings${RESET} ${colors.cyan}${squadName}${RESET}`);\n writeLine();\n\n if (recent.length === 0) {\n writeLine(` ${colors.dim}No learnings found${RESET}`);\n return;\n }\n\n writeLine(` ${colors.dim}Showing ${recent.length} of ${filtered.length} learnings${RESET}`);\n writeLine();\n\n const categoryIcon = {\n success: `${colors.green}${icons.success}${RESET}`,\n failure: `${colors.red}✗${RESET}`,\n pattern: `${colors.purple}◆${RESET}`,\n tip: `${colors.cyan}→${RESET}`,\n };\n\n for (const learning of recent) {\n writeLine(` ${colors.dim}${learning.date}${RESET} ${categoryIcon[learning.category]} ${learning.insight}`);\n if (learning.tags.length > 0) {\n writeLine(` ${colors.dim}${learning.tags.map(t => `#${t}`).join(' ')}${RESET}`);\n }\n }\n writeLine();\n}\n\n/**\n * Search learnings across all squads\n */\nexport async function learnSearchCommand(\n query: string,\n options: { limit?: string }\n): Promise<void> {\n const memoryDir = findMemoryDir();\n if (!memoryDir) {\n writeLine(` ${colors.red}No memory directory found${RESET}`);\n return;\n }\n\n const squadsDir = findSquadsDir();\n const squads = squadsDir ? listSquads(squadsDir) : [];\n squads.push('general'); // Always check general\n\n const allLearnings: (Learning & { squad: string })[] = [];\n\n for (const squad of squads) {\n const learningsPath = join(memoryDir, squad, 'shared', 'learnings.md');\n if (existsSync(learningsPath)) {\n const content = readFileSync(learningsPath, 'utf-8');\n const learnings = parseLearnings(content);\n allLearnings.push(...learnings.map(l => ({ ...l, squad })));\n }\n }\n\n // Search\n const queryLower = query.toLowerCase();\n const matches = allLearnings.filter(l =>\n l.insight.toLowerCase().includes(queryLower) ||\n l.tags.some(t => t.includes(queryLower))\n );\n\n // Track\n await track(Events.CLI_LEARN_SEARCH, { query, matches: matches.length });\n\n // Display\n writeLine();\n writeLine(` ${gradient('squads')} ${colors.dim}search learnings${RESET} \"${query}\"`);\n writeLine();\n\n const limit = options.limit ? parseInt(options.limit) : 10;\n const limited = matches.slice(0, limit);\n\n if (limited.length === 0) {\n writeLine(` ${colors.dim}No learnings found matching \"${query}\"${RESET}`);\n return;\n }\n\n writeLine(` ${colors.dim}Found ${matches.length} matches${RESET}`);\n writeLine();\n\n const categoryIcon = {\n success: `${colors.green}${icons.success}${RESET}`,\n failure: `${colors.red}✗${RESET}`,\n pattern: `${colors.purple}◆${RESET}`,\n tip: `${colors.cyan}→${RESET}`,\n };\n\n for (const learning of limited) {\n writeLine(` ${colors.cyan}${learning.squad}${RESET} ${categoryIcon[learning.category]} ${learning.insight}`);\n }\n writeLine();\n}\n\n/**\n * Auto-extract tags from insight text\n */\nfunction extractTags(insight: string): string[] {\n const tags: string[] = [];\n const lowerInsight = insight.toLowerCase();\n\n // Common patterns\n const patterns: Record<string, string[]> = {\n 'auth': ['auth', 'login', 'token', 'session', 'password'],\n 'api': ['api', 'endpoint', 'request', 'response', 'rest'],\n 'bug': ['bug', 'fix', 'error', 'issue', 'crash'],\n 'perf': ['performance', 'slow', 'fast', 'optimize', 'cache'],\n 'ux': ['user', 'ui', 'interface', 'design', 'experience'],\n 'test': ['test', 'spec', 'coverage', 'assert'],\n 'db': ['database', 'query', 'sql', 'postgres', 'redis'],\n 'deploy': ['deploy', 'release', 'production', 'staging'],\n };\n\n for (const [tag, keywords] of Object.entries(patterns)) {\n if (keywords.some(kw => lowerInsight.includes(kw))) {\n tags.push(tag);\n }\n }\n\n return tags.slice(0, 3); // Max 3 auto-tags\n}\n\n/**\n * Infer category from insight text\n */\nfunction inferCategory(insight: string): Learning['category'] {\n const lower = insight.toLowerCase();\n\n if (lower.includes('worked') || lower.includes('success') || lower.includes('fixed')) {\n return 'success';\n }\n if (lower.includes('failed') || lower.includes('error') || lower.includes(\"didn't work\")) {\n return 'failure';\n }\n if (lower.includes('pattern') || lower.includes('always') || lower.includes('whenever')) {\n return 'pattern';\n }\n\n return 'tip';\n}\n","import { readdirSync, existsSync, statSync } from 'fs';\nimport { join } from 'path';\nimport { findSquadsDir, listSquads, loadSquad, Goal, hasLocalInfraConfig } from '../lib/squad-parser.js';\nimport { findMemoryDir } from '../lib/memory.js';\nimport { fetchCostSummary, formatCostBar, fetchRateLimits, fetchInsights, Insights, fetchBridgeStats, BridgeStats, CostSummary, isMaxPlan, getPlanType, fetchNpmStats, NpmStats, fetchQuotaInfo, QuotaInfo, fetchClaudeCodeCapacity, ClaudeCodeCapacity, calculateROIMetrics, calculateSquadCostProjections, ROIMetrics, SquadCostProjection } from '../lib/costs.js';\nimport { getMultiRepoGitStats, getActivitySparkline, getGitHubStatsOptimized, SquadGitHubStats, GitPerformanceStats, GitHubStats } from '../lib/git.js';\nimport { saveDashboardSnapshot, isDatabaseAvailable, getDashboardHistory, DashboardSnapshot, SquadSnapshotData, closeDatabase, getLatestBaseline, BaselineSnapshot } from '../lib/db.js';\nimport { getLiveSessionSummaryAsync, cleanupStaleSessions, SessionSummary } from '../lib/sessions.js';\nimport { checkForUpdate } from '../lib/update.js';\nimport { track, Events } from '../lib/telemetry.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 sessionSummary: SessionSummary;\n npmStats: NpmStats | null;\n quotaInfo: QuotaInfo | null;\n capacity: ClaudeCodeCapacity | null;\n baseline: BaselineSnapshot | null;\n roiMetrics: ROIMetrics | null;\n squadProjections: SquadCostProjection[];\n}\n\n// Dashboard stats aggregated from squad data\ninterface DashboardStats {\n activeSquads: number;\n totalSquads: number;\n totalPRs: number;\n totalIssuesClosed: number;\n totalIssuesOpen: number;\n overallProgress: number;\n}\n\n/**\n * Build squad metrics from squad data and git/github stats\n */\nfunction collectSquadMetrics(\n squadNames: string[],\n gitStats: GitPerformanceStats | null,\n ghStats: GitHubStats | null\n): SquadMetrics[] {\n const squadData: SquadMetrics[] = [];\n\n // Map repos to squads for commit attribution\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 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 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 return squadData;\n}\n\n/**\n * Calculate aggregated dashboard stats from squad metrics\n */\nfunction calculateDashboardStats(squadData: SquadMetrics[], ghStats: GitHubStats | null): DashboardStats {\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 const overallProgress = squadData.length > 0\n ? Math.round(squadData.reduce((sum, s) => sum + s.goalProgress, 0) / squadData.length)\n : 0;\n\n return {\n activeSquads,\n totalSquads: squadData.length,\n totalPRs,\n totalIssuesClosed,\n totalIssuesOpen,\n overallProgress,\n };\n}\n\n/**\n * Render the dashboard header with session and stats info\n */\nfunction renderDashboardHeader(\n stats: DashboardStats,\n sessionSummary: SessionSummary,\n gitStats: GitPerformanceStats | null,\n ghStats: GitHubStats | null\n): void {\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}${stats.activeSquads}${RESET}/${stats.totalSquads} squads`];\n if (ghStats) {\n statsParts.push(`${colors.green}${stats.totalPRs}${RESET} PRs merged`);\n statsParts.push(`${colors.purple}${stats.totalIssuesClosed}${RESET} closed`);\n statsParts.push(`${colors.yellow}${stats.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 writeLine(` ${progressBar(stats.overallProgress, 32)} ${colors.dim}${stats.overallProgress}% goal progress${RESET}`);\n writeLine();\n}\n\n/**\n * Render the squads table showing activity per squad\n */\nfunction renderSquadsTable(squadData: SquadMetrics[]): void {\n // Squad table - add 2 chars padding to each column for spacing\n const w = { name: 13, commits: 9, prs: 5, issues: 8, goals: 7, bar: 10 };\n const tableWidth = w.name + w.commits + w.prs + w.issues + w.goals + w.bar + 6;\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 completedCount = 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(`${completedCount}/${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\n/**\n * Render the working on section showing recent commits\n */\nfunction renderWorkingOn(gitStats: GitPerformanceStats | null): void {\n if (gitStats && gitStats.recentCommits && gitStats.recentCommits.length > 0) {\n writeLine(` ${bold}Working On${RESET}`);\n writeLine();\n\n for (const commit of gitStats.recentCommits.slice(0, 3)) {\n const shortHash = commit.hash.slice(0, 7);\n const shortMsg = truncate(commit.message, 45);\n writeLine(` ${colors.dim}${shortHash}${RESET} ${shortMsg} ${colors.dim}(${commit.repo})${RESET}`);\n }\n writeLine();\n }\n}\n\n/**\n * Render the goals section sorted from tactical to strategic\n */\nfunction renderGoalsSection(squadData: SquadMetrics[]): void {\n const allActiveGoals = squadData.flatMap(s =>\n s.goals.filter(g => !g.completed).map(g => ({\n squad: s.name,\n goal: g,\n scope: inferScope(g.description)\n }))\n );\n\n if (allActiveGoals.length > 0) {\n // Sort goals: tactical first (actionable NOW) → operational → strategic (vision)\n const scopeOrder = { tactical: 0, operational: 1, strategic: 2 };\n const sortedGoals = [...allActiveGoals].sort((a, b) => {\n // Primary: scope (tactical first)\n const scopeDiff = scopeOrder[a.scope] - scopeOrder[b.scope];\n if (scopeDiff !== 0) return scopeDiff;\n // Secondary: goals with progress first (being worked on)\n const aHasProgress = a.goal.progress ? 1 : 0;\n const bHasProgress = b.goal.progress ? 1 : 0;\n return bHasProgress - aHasProgress;\n });\n\n // Group labels for display\n const scopeLabels = { tactical: 'Next', operational: 'In Progress', strategic: 'Vision' };\n const scopeIcons = { tactical: icons.active, operational: icons.progress, strategic: icons.empty };\n\n writeLine(` ${bold}Goals${RESET} ${colors.dim}(tactical → strategic)${RESET}`);\n writeLine();\n\n const maxGoals = 5; // Show more goals since they're now meaningfully ordered\n let lastScope = '';\n for (const { squad, goal, scope } of sortedGoals.slice(0, maxGoals)) {\n // Show scope header when it changes\n if (scope !== lastScope) {\n const label = scopeLabels[scope];\n const labelColor = scope === 'tactical' ? colors.green : scope === 'strategic' ? colors.purple : colors.cyan;\n writeLine(` ${labelColor}${label}${RESET}`);\n lastScope = scope;\n }\n const hasProgress = goal.progress && goal.progress.length > 0;\n const icon = scopeIcons[scope];\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\n/**\n * Render the footer with command hints\n */\nfunction renderDashboardFooter(): void {\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\nexport async function dashboardCommand(options: { verbose?: boolean; ceo?: boolean; fast?: boolean; json?: boolean } = {}): Promise<void> {\n await track(Events.CLI_DASHBOARD, { verbose: options.verbose, ceo: options.ceo, fast: options.fast });\n const squadsDir = findSquadsDir();\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 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 const cache = await fetchDashboardData(baseDir, skipGitHub);\n\n // === PHASE 2: Build squad metrics ===\n const squadData = collectSquadMetrics(squadNames, cache.gitStats, cache.ghStats);\n\n // === PHASE 3: Calculate stats and render ===\n const stats = calculateDashboardStats(squadData, cache.ghStats);\n\n // JSON output\n if (options.json) {\n const goalCount = {\n active: squadData.reduce((sum, s) => sum + s.goals.filter(g => !g.completed).length, 0),\n completed: squadData.reduce((sum, s) => sum + s.goals.filter(g => g.completed).length, 0),\n };\n console.log(JSON.stringify({\n ok: true,\n command: 'dash',\n data: {\n squads: squadData.map(s => ({\n name: s.name, mission: s.mission, status: s.status,\n goalProgress: s.goalProgress, lastActivity: s.lastActivity,\n goals: s.goals,\n })),\n stats,\n goals: goalCount,\n sessions: cache.sessionSummary,\n costs: cache.costs,\n gitStats: cache.gitStats ? {\n totalCommits: cache.gitStats.totalCommits,\n repos: cache.gitStats.repos?.map(r => ({ name: r.name, commits: r.commits })),\n } : null,\n },\n }, null, 2));\n await closeDatabase();\n return;\n }\n\n // Render dashboard sections\n renderDashboardHeader(stats, cache.sessionSummary, cache.gitStats, cache.ghStats);\n renderSquadsTable(squadData);\n\n // Compute goal counts for efficiency metrics\n const goalCount = {\n active: squadData.reduce((sum, s) => sum + s.goals.filter(g => !g.completed).length, 0),\n completed: squadData.reduce((sum, s) => sum + s.goals.filter(g => g.completed).length, 0),\n };\n\n // Render sections using cached data (no more network calls)\n renderGitPerformanceCached(cache);\n renderTokenEconomicsCached(cache, goalCount);\n renderROICached(cache, goalCount);\n renderQuotaCached(cache);\n renderCapacityCached(cache);\n renderInfrastructureCached(cache);\n renderAcquisitionCached(cache);\n renderHistoricalTrendsCached(cache);\n renderInsightsCached(cache);\n renderWorkingOn(cache.gitStats);\n renderGoalsSection(squadData);\n renderDashboardFooter();\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 * Fetch all dashboard data in parallel with timeouts\n */\nasync function fetchDashboardData(baseDir: string | null, skipGitHub: boolean): Promise<DashboardCache> {\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 // Clean up stale file-based sessions (sync, fast)\n cleanupStaleSessions();\n\n const [gitStats, ghStats, costs, bridgeStats, activity, dbAvailable, history, insights, sessionSummary, npmStats, quotaInfo, capacity, baseline] = await Promise.all([\n // Git stats (local, parallel across repos)\n baseDir ? getMultiRepoGitStats(baseDir, 30) : Promise.resolve(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, parallel across repos)\n baseDir ? getActivitySparkline(baseDir, 14) : Promise.resolve([]),\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 // Session summary (parallel lsof, ~1s)\n getLiveSessionSummaryAsync(),\n // NPM download stats (network, 2s timeout)\n timeout(fetchNpmStats('squads-cli'), 2000, null),\n // Quota/autonomy info (local network, 2s timeout)\n timeout(fetchQuotaInfo(), 2000, null),\n // Claude Code capacity (local file read, fast)\n fetchClaudeCodeCapacity(),\n // Latest baseline for ROI comparison (1.5s timeout)\n timeout(getLatestBaseline().catch(() => null), 1500, null),\n ]);\n\n // Calculate ROI metrics\n const roiMetrics = calculateROIMetrics(costs, 0, gitStats?.totalCommits || 0, ghStats?.prsMerged || 0);\n const squadProjections = calculateSquadCostProjections(bridgeStats, null);\n\n return { gitStats, ghStats, costs, bridgeStats, activity, dbAvailable, history, insights, sessionSummary, npmStats, quotaInfo, capacity, baseline, roiMetrics, squadProjections };\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 ? await 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: number, s: { inputTokens: number }) => sum + s.inputTokens, 0) || 0;\n const totalOutputTokens = costs?.bySquad.reduce((sum: number, s: { outputTokens: number }) => 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 || 0, // 0 = not configured (no hardcoded defaults)\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 (project-scoped, not global)\nfunction findAgentsSquadsDir(): string | null {\n // First try: parent of current project (for multi-repo setups)\n const parentDir = join(process.cwd(), '..');\n if (existsSync(join(parentDir, 'hq'))) {\n return parentDir;\n }\n\n // Second try: current directory IS the project root\n if (existsSync(join(process.cwd(), '.git'))) {\n return process.cwd();\n }\n\n // Don't fall back to ~/agents-squads - that would show our data to fresh users\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, activity] = await Promise.all([\n getMultiRepoGitStats(baseDir, 30),\n getActivitySparkline(baseDir, 14),\n ]);\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 - display depends on plan type\n const maxPlan = isMaxPlan();\n if (maxPlan) {\n // On Max plan, costs are informational (no real budget constraint)\n writeLine(` ${colors.dim}Daily spend${RESET} ${colors.green}$${costs.totalCost.toFixed(2)}${RESET} ${colors.dim}(target: $${costs.dailyBudget})${RESET}`);\n } else {\n // On usage plan, show budget bar with clear labeling\n const barWidth = 32;\n const costBar = formatCostBar(Math.min(costs.usedPercent, 100), barWidth);\n const pctColor = costs.usedPercent > 100 ? colors.red : costs.usedPercent > 80 ? colors.yellow : colors.green;\n writeLine(` ${colors.dim}Daily target $${costs.dailyBudget}${RESET} [${costBar}] ${pctColor}$${costs.totalCost.toFixed(2)}${RESET}`);\n if (costs.usedPercent > 100) {\n writeLine(` ${colors.yellow}⚠${RESET} ${colors.dim}${costs.usedPercent.toFixed(0)}% of target - consider increasing SQUADS_DAILY_BUDGET${RESET}`);\n } else {\n writeLine(` ${colors.cyan}$${costs.idleBudget.toFixed(2)}${RESET} ${colors.dim}remaining of daily target${RESET}`);\n }\n }\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();\n writeLine(` ${colors.dim}Start with:${RESET} cd docker && docker-compose up -d`);\n writeLine(` ${colors.dim}Docs:${RESET} https://agents-squads.com/docs/setup`);\n writeLine(` ${colors.yellow}Need help?${RESET} ${colors.dim}hello@agents-squads.com${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 // On Max plan, cost is informational only (green). On usage plan, color by budget usage.\n const maxPlan = isMaxPlan();\n const costColor = maxPlan ? colors.green : (stats.budget.usedPct > 80 ? colors.red : stats.budget.usedPct > 50 ? colors.yellow : colors.green);\n const costDisplay = maxPlan\n ? `${costColor}$${stats.today.costUsd.toFixed(2)}${RESET}`\n : `${costColor}$${stats.today.costUsd.toFixed(2)}${RESET}${colors.dim}/$${stats.budget.daily}${RESET}`;\n writeLine(` ${colors.dim}Today:${RESET} ${colors.cyan}${stats.today.generations}${RESET}${colors.dim} calls${RESET} ${costDisplay} ${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, goalCount?: { active: number; completed: number }): void {\n const costs = cache.costs;\n const stats = cache.bridgeStats;\n const hasInfra = hasLocalInfraConfig();\n const hasData = costs || stats;\n\n writeLine(` ${bold}Token Economics${RESET}`);\n writeLine();\n\n // === SUBSCRIPTION (always show - works without infra) ===\n const planType = getPlanType();\n const tier = parseInt(process.env.ANTHROPIC_TIER || '0', 10);\n\n if (planType === 'unknown') {\n writeLine(` ${colors.dim}○${RESET} ${bold}Plan${RESET} ${colors.yellow}not configured${RESET}`);\n writeLine();\n writeLine(` ${colors.dim}Set your Claude plan:${RESET}`);\n writeLine(` ${colors.dim}$${RESET} export SQUADS_PLAN_TYPE=max ${colors.dim}# $200/mo flat${RESET}`);\n writeLine(` ${colors.dim}$${RESET} export SQUADS_PLAN_TYPE=usage ${colors.dim}# pay-per-token${RESET}`);\n writeLine();\n } else {\n const maxPlan = planType === 'max';\n const planIcon = maxPlan ? `${colors.purple}◆${RESET}` : `${colors.dim}○${RESET}`;\n const planLabel = maxPlan ? 'Claude Max' : 'Claude Pro';\n const planCost = maxPlan ? '$200/mo flat' : 'pay-per-token';\n const tierDisplay = tier > 0 ? ` ${colors.dim}Tier ${tier}${RESET}` : '';\n writeLine(` ${planIcon} ${bold}${planLabel}${RESET} ${colors.dim}${planCost}${RESET}${tierDisplay}`);\n writeLine();\n }\n\n // === METRICS (require infra) ===\n if (!hasInfra || !hasData) {\n writeLine(` ${colors.dim}○${RESET} Track costs, tokens, and API usage`);\n writeLine(` ${colors.dim}○${RESET} Monitor rate limits and budgets`);\n writeLine();\n writeLine(` ${colors.dim}Setup:${RESET} github.com/agents-squads/squads-cli#analytics`);\n writeLine();\n return;\n }\n\n // === TOKEN USAGE ===\n const todayTokens = stats ? stats.today.inputTokens + stats.today.outputTokens : 0;\n const todayCalls = stats?.today.generations || costs?.totalCalls || 0;\n const todayCost = stats?.today.costUsd || costs?.totalCost || 0;\n\n writeLine(` ${colors.dim}Today${RESET}`);\n writeLine(` ${colors.cyan}${formatK(todayTokens)}${RESET} tokens ${colors.dim}│${RESET} ${colors.cyan}${todayCalls}${RESET} calls ${colors.dim}│${RESET} ${colors.green}$${todayCost.toFixed(2)}${RESET}`);\n\n // Week stats if available\n if (stats?.week && stats.week.generations > 0) {\n const weekTokens = (stats.week.inputTokens || 0) + (stats.week.outputTokens || 0);\n writeLine(` ${colors.dim}Week${RESET} ${colors.purple}${formatK(weekTokens)}${RESET} tokens ${colors.dim}│${RESET} ${colors.purple}${stats.week.generations}${RESET} calls ${colors.dim}│${RESET} ${colors.purple}$${stats.week.costUsd.toFixed(2)}${RESET}`);\n }\n writeLine();\n\n // === GOAL EFFICIENCY ===\n if (goalCount && goalCount.completed > 0 && todayTokens > 0) {\n const tokensPerGoal = Math.round(todayTokens / goalCount.completed);\n writeLine(` ${colors.dim}Efficiency${RESET}`);\n writeLine(` ${colors.cyan}${formatK(tokensPerGoal)}${RESET} tokens/goal ${colors.dim}│${RESET} ${colors.green}${goalCount.completed}${RESET} goals done`);\n writeLine();\n }\n\n // === RATE LIMITS (informational - real limits from Anthropic subscription) ===\n // Limits vary by tier - check /usage for actual subscription limits\n writeLine(` ${colors.dim}Rate Limits${RESET} ${colors.dim}(check /usage for real limits)${RESET}`);\n\n // Dynamic tier limits based on configured tier (or estimate from usage patterns)\n const tierLimits: Record<number, { rpm: number; inputTpm: number; outputTpm: number }> = {\n 1: { rpm: 50, inputTpm: 30000, outputTpm: 8000 },\n 2: { rpm: 1000, inputTpm: 450000, outputTpm: 90000 },\n 3: { rpm: 2000, inputTpm: 800000, outputTpm: 160000 },\n 4: { rpm: 4000, inputTpm: 2000000, outputTpm: 400000 },\n };\n const limits = tierLimits[tier] || tierLimits[4];\n\n // Estimate current usage rate (calls per minute based on today's activity)\n const now = new Date();\n const minutesElapsed = Math.max((now.getHours() * 60) + now.getMinutes(), 1);\n const callsPerMinute = todayCalls / minutesElapsed;\n const tokensPerMinute = todayTokens / minutesElapsed;\n const rpmPct = (callsPerMinute / limits.rpm) * 100;\n const tpmPct = (tokensPerMinute / (limits.inputTpm + limits.outputTpm)) * 100;\n\n // Show rate usage bars\n const rpmBar = progressBar(Math.min(rpmPct, 100), 10);\n const tpmBar = progressBar(Math.min(tpmPct, 100), 10);\n const rpmColor = rpmPct > 75 ? colors.red : rpmPct > 50 ? colors.yellow : colors.green;\n const tpmColor = tpmPct > 75 ? colors.red : tpmPct > 50 ? colors.yellow : colors.green;\n\n writeLine(` RPM ${rpmBar} ${rpmColor}${callsPerMinute.toFixed(1)}${RESET}${colors.dim}/${limits.rpm}${RESET}`);\n writeLine(` TPM ${tpmBar} ${tpmColor}${formatK(Math.round(tokensPerMinute))}${RESET}${colors.dim}/${formatK(limits.inputTpm + limits.outputTpm)}${RESET}`);\n\n // Capacity remaining for autonomous work\n const rpmAvailable = Math.max(0, limits.rpm - callsPerMinute);\n const tpmAvailable = Math.max(0, (limits.inputTpm + limits.outputTpm) - tokensPerMinute);\n\n if (rpmAvailable > 100 && tpmAvailable > 10000) {\n writeLine(` ${colors.green}●${RESET} ${colors.dim}Capacity for autonomous triggers${RESET}`);\n } else if (rpmPct > 75 || tpmPct > 75) {\n writeLine(` ${colors.yellow}⚠${RESET} ${colors.yellow}Rate limits constrained${RESET}`);\n }\n\n writeLine();\n}\n\nfunction renderQuotaCached(cache: DashboardCache): void {\n const quota = cache.quotaInfo;\n\n if (!quota || !quota.monthlyQuota || quota.monthlyQuota === 0) {\n // No quota data or invalid quota - skip section\n return;\n }\n\n // Calculate ROI multiplier (how much value extracted from subscription)\n const monthlyUsed = quota.monthlyUsed || 0;\n const monthlyQuota = quota.monthlyQuota;\n const roiMultiplier = monthlyUsed / monthlyQuota;\n const roiDisplay = roiMultiplier >= 1 ? `${roiMultiplier.toFixed(1)}x` : `${(roiMultiplier * 100).toFixed(0)}%`;\n\n // High utilization = good (green), low = room to grow (yellow)\n const utilizationColor = roiMultiplier >= 2 ? colors.green : roiMultiplier >= 1 ? colors.cyan : roiMultiplier >= 0.5 ? colors.yellow : colors.dim;\n const roiIcon = roiMultiplier >= 3 ? '🚀' : roiMultiplier >= 2 ? '🎉' : roiMultiplier >= 1 ? '✓' : '';\n\n writeLine(` ${bold}Subscription ROI${RESET} ${colors.dim}(autonomy: ${quota.autonomyScore}% ${quota.confidenceLevel})${RESET}`);\n writeLine();\n\n // ROI bar - fills up and overflows to show value extraction\n const barWidth = 24;\n const fillPct = Math.min(roiMultiplier, 1); // Cap at 100% for the bar\n const filled = Math.round(fillPct * barWidth);\n const overflowIndicator = roiMultiplier > 1 ? `${utilizationColor}+${RESET}` : '';\n const bar = `${utilizationColor}${'█'.repeat(filled)}${colors.dim}${'░'.repeat(barWidth - filled)}${RESET}${overflowIndicator}`;\n\n writeLine(` ${bar} ${utilizationColor}${roiDisplay}${RESET} ${roiIcon}`);\n writeLine(` ${colors.green}$${monthlyUsed.toFixed(2)}${RESET} ${colors.dim}consumed${RESET} ${colors.dim}/${RESET} $${monthlyQuota}${colors.dim}/mo subscription${RESET}`);\n\n // ROI interpretation\n if (roiMultiplier >= 2) {\n writeLine(` ${colors.green}Excellent value${RESET} ${colors.dim}- ${roiDisplay} return on $${monthlyQuota} subscription${RESET}`);\n } else if (roiMultiplier >= 1) {\n writeLine(` ${colors.cyan}Good utilization${RESET} ${colors.dim}- maximizing subscription value${RESET}`);\n } else {\n const potentialValue = monthlyQuota - monthlyUsed;\n writeLine(` ${colors.yellow}Room to grow${RESET} ${colors.dim}- $${potentialValue.toFixed(0)} of unused capacity${RESET}`);\n writeLine(` ${colors.dim}Tip: Run more routines with${RESET} ${colors.cyan}squads run <squad>${RESET}`);\n }\n\n // Learnings count\n if (quota.learningCount > 0) {\n writeLine(` ${colors.dim}Learnings:${RESET} ${colors.purple}${quota.learningCount}${RESET} ${colors.dim}captured${RESET}`);\n }\n\n writeLine();\n}\n\nfunction renderCapacityCached(cache: DashboardCache): void {\n const cap = cache.capacity;\n\n if (!cap) {\n // No capacity data - skip section\n return;\n }\n\n // Helper to format tokens\n const formatTokens = (n: number) => {\n if (n >= 1_000_000) return `${(n / 1_000_000).toFixed(1)}M`;\n if (n >= 1_000) return `${(n / 1_000).toFixed(0)}k`;\n return n.toString();\n };\n\n writeLine(` ${bold}Subscription Capacity${RESET} ${colors.dim}(from Claude Code)${RESET}`);\n writeLine();\n\n // Weekly capacity bar\n const weeklyPct = cap.weeklyCapacityPct;\n const weeklyColor = weeklyPct > 80 ? colors.red : weeklyPct > 60 ? colors.yellow : colors.green;\n const weeklyBarWidth = 20;\n const weeklyFilled = Math.min(Math.round((weeklyPct / 100) * weeklyBarWidth), weeklyBarWidth);\n const weeklyBar = `${weeklyColor}${'█'.repeat(weeklyFilled)}${colors.dim}${'░'.repeat(weeklyBarWidth - weeklyFilled)}${RESET}`;\n\n writeLine(` ${colors.dim}Weekly:${RESET} ${weeklyBar} ${weeklyColor}${weeklyPct}%${RESET} ${colors.dim}(resets ${cap.weeklyResetDate})${RESET}`);\n writeLine(` ${colors.dim}${formatTokens(cap.weeklyTokensUsed)} / ${formatTokens(cap.weeklyTokensLimit)} tokens${RESET}`);\n\n // Model breakdown\n const opusPct = cap.weeklyTokensUsed > 0 ? Math.round((cap.opusTokensUsed / cap.weeklyTokensUsed) * 100) : 0;\n const sonnetPct = cap.weeklyTokensUsed > 0 ? Math.round((cap.sonnetTokensUsed / cap.weeklyTokensUsed) * 100) : 0;\n\n writeLine(` ${colors.dim}opus${RESET} ${colors.purple}${opusPct}%${RESET} ${colors.dim}sonnet${RESET} ${colors.cyan}${sonnetPct}%${RESET}`);\n\n // Session capacity (if significant)\n if (cap.sessionCapacityPct > 10) {\n const sessionPct = cap.sessionCapacityPct;\n const sessionColor = sessionPct > 80 ? colors.red : sessionPct > 60 ? colors.yellow : colors.green;\n writeLine(` ${colors.dim}Session:${RESET} ${sessionColor}${sessionPct}%${RESET} ${colors.dim}(resets ${cap.sessionResetTime})${RESET}`);\n }\n\n // Capacity interpretation\n const headroom = 100 - weeklyPct;\n if (headroom > 50) {\n writeLine(` ${colors.green}●${RESET} ${colors.dim}${headroom}% headroom for autonomous agents${RESET}`);\n } else if (headroom > 20) {\n writeLine(` ${colors.yellow}●${RESET} ${colors.dim}${headroom}% remaining - monitor usage${RESET}`);\n } else {\n writeLine(` ${colors.red}●${RESET} ${colors.dim}Low capacity - consider Sonnet for routine tasks${RESET}`);\n }\n\n writeLine();\n}\n\nfunction renderInfrastructureCached(cache: DashboardCache): void {\n const stats = cache.bridgeStats;\n const hasInfra = hasLocalInfraConfig();\n\n if (!hasInfra || !stats) {\n writeLine(` ${bold}Infrastructure${RESET} ${colors.dim}(not connected)${RESET}`);\n writeLine();\n writeLine(` ${colors.dim}○${RESET} postgres ${colors.dim}○${RESET} redis ${colors.dim}○${RESET} otel`);\n writeLine();\n writeLine(` ${colors.dim}Setup:${RESET} github.com/agents-squads/squads-cli#infrastructure`);\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 // On Max plan, cost is informational only (green). On usage plan, color by budget usage.\n const maxPlan = isMaxPlan();\n const costColor = maxPlan ? colors.green : (stats.budget.usedPct > 80 ? colors.red : stats.budget.usedPct > 50 ? colors.yellow : colors.green);\n const costDisplay = maxPlan\n ? `${costColor}$${stats.today.costUsd.toFixed(2)}${RESET}`\n : `${costColor}$${stats.today.costUsd.toFixed(2)}${RESET}${colors.dim}/$${stats.budget.daily}${RESET}`;\n writeLine(` ${colors.dim}Today:${RESET} ${colors.cyan}${stats.today.generations}${RESET}${colors.dim} calls${RESET} ${costDisplay} ${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\nfunction renderAcquisitionCached(cache: DashboardCache): void {\n // Only show Acquisition for squads-cli project (internal metrics)\n // Check if SQUADS_NPM_PACKAGE is set or if we're in the squads-cli repo\n const npmPackage = process.env.SQUADS_NPM_PACKAGE;\n if (!npmPackage) {\n // Not configured - don't show internal acquisition metrics to fresh users\n return;\n }\n\n const npm = cache.npmStats;\n if (!npm) {\n // Don't show section if npm API failed\n return;\n }\n\n writeLine(` ${bold}Acquisition${RESET} ${colors.dim}(npm)${RESET}`);\n writeLine();\n\n // Download stats\n const trendIcon = npm.weekOverWeek >= 0 ? `${colors.green}↑${RESET}` : `${colors.red}↓${RESET}`;\n const trendColor = npm.weekOverWeek >= 0 ? colors.green : colors.red;\n\n writeLine(` ${colors.cyan}${npm.downloads.lastWeek}${RESET} installs/week ${trendIcon} ${trendColor}${Math.abs(npm.weekOverWeek)}%${RESET} ${colors.dim}wow${RESET}`);\n writeLine(` ${colors.dim}Today${RESET} ${npm.downloads.lastDay} ${colors.dim}│${RESET} ${colors.dim}Month${RESET} ${npm.downloads.lastMonth}`);\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: number, s: { inputTokens: number }) => sum + s.inputTokens, 0) || 0;\n const totalOutputTokens = costs?.bySquad.reduce((sum: number, s: { outputTokens: number }) => 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 || 0, // 0 = not configured (no hardcoded defaults)\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// Goal classification by scope (tactical = immediate action, strategic = long-term vision)\n// Tactical: specific, actionable, concrete tasks (what to do NOW)\nconst TACTICAL_KEYWORDS = ['fix', 'add', 'update', 'implement', 'run', 'test', 'deploy', 'merge', 'review', 'debug'];\n// Strategic: high-level objectives, foundational work (WHERE we're going)\nconst STRATEGIC_KEYWORDS = ['revenue', 'establish', 'build', 'create', 'define', 'design', 'launch', 'ship', 'foundation', 'strategy'];\n\n// Classify goal scope: tactical (0) = do now, strategic (2) = long-term vision\nfunction inferScope(goal: string): 'tactical' | 'operational' | 'strategic' {\n const lower = goal.toLowerCase();\n if (TACTICAL_KEYWORDS.some(k => lower.includes(k))) return 'tactical';\n if (STRATEGIC_KEYWORDS.some(k => lower.includes(k))) return 'strategic';\n return 'operational'; // middle ground\n}\n\n// Legacy priority inference for CEO report (strategic-first view)\nfunction inferPriority(goal: string): 'P0' | 'P1' | 'P2' {\n const lower = goal.toLowerCase();\n // P0 = strategic/revenue critical\n if (STRATEGIC_KEYWORDS.slice(0, 3).some(k => lower.includes(k))) return 'P0'; // revenue, establish, build\n // P1 = operational/important\n if (TACTICAL_KEYWORDS.slice(0, 4).some(k => lower.includes(k))) return 'P1'; // fix, add, update, implement\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/**\n * Render ROI metrics section showing cost projections and before/after comparison\n */\nfunction renderROICached(cache: DashboardCache, goalCount: { active: number; completed: number }): void {\n const { costs, bridgeStats, baseline, squadProjections } = cache;\n\n if (!costs && !bridgeStats) {\n return;\n }\n\n const roiMetrics = calculateROIMetrics(\n costs,\n goalCount.completed,\n cache.gitStats?.totalCommits || 0,\n cache.ghStats?.prsMerged || 0\n );\n\n writeLine(` ${bold}ROI & Projections${RESET}`);\n writeLine();\n\n // Cost per output metrics\n if (roiMetrics.totalCostUsd > 0) {\n const metricsLine = [];\n if (roiMetrics.costPerGoal > 0) {\n metricsLine.push(`${colors.cyan}$${roiMetrics.costPerGoal.toFixed(2)}${RESET}${colors.dim}/goal${RESET}`);\n }\n if (roiMetrics.costPerPR > 0) {\n metricsLine.push(`${colors.cyan}$${roiMetrics.costPerPR.toFixed(2)}${RESET}${colors.dim}/PR${RESET}`);\n }\n if (roiMetrics.costPerCommit > 0) {\n metricsLine.push(`${colors.cyan}$${roiMetrics.costPerCommit.toFixed(2)}${RESET}${colors.dim}/commit${RESET}`);\n }\n if (metricsLine.length > 0) {\n writeLine(` ${colors.dim}Cost/Output:${RESET} ${metricsLine.join(` ${colors.dim}|${RESET} `)}`);\n }\n }\n\n // ROI multiplier\n if (roiMetrics.roiMultiplier > 0) {\n const roiColor = roiMetrics.roiMultiplier >= 3 ? colors.green :\n roiMetrics.roiMultiplier >= 1 ? colors.cyan : colors.yellow;\n writeLine(` ${colors.dim}Est. ROI:${RESET} ${roiColor}${roiMetrics.roiMultiplier.toFixed(1)}x${RESET} ${colors.dim}($${roiMetrics.estimatedValueUsd.toFixed(0)} value / $${roiMetrics.totalCostUsd.toFixed(2)} cost)${RESET}`);\n }\n\n // Cost projections\n writeLine();\n writeLine(` ${colors.dim}Projections${RESET}`);\n const dailyBudget = costs?.dailyBudget || 200;\n const projColor = roiMetrics.dailyProjectedCost > dailyBudget ? colors.red :\n roiMetrics.dailyProjectedCost > dailyBudget * 0.8 ? colors.yellow : colors.green;\n writeLine(` ${colors.dim}Daily:${RESET} ${projColor}~$${roiMetrics.dailyProjectedCost.toFixed(2)}${RESET} ${colors.dim}Weekly:${RESET} ${colors.cyan}~$${roiMetrics.weeklyProjectedCost.toFixed(0)}${RESET} ${colors.dim}Monthly:${RESET} ${colors.purple}~$${roiMetrics.monthlyProjectedCost.toFixed(0)}${RESET}`);\n\n // Squad-level projections\n if (squadProjections.length > 0) {\n writeLine();\n writeLine(` ${colors.dim}By Squad (projected monthly)${RESET}`);\n const topSquads = squadProjections\n .sort((a, b) => b.projectedMonthlyCost - a.projectedMonthlyCost)\n .slice(0, 4);\n for (const sq of topSquads) {\n const trendIcon = sq.costTrend === 'increasing' ? `${colors.red}↑${RESET}` :\n sq.costTrend === 'decreasing' ? `${colors.green}↓${RESET}` : `${colors.dim}-${RESET}`;\n writeLine(` ${colors.cyan}${padEnd(sq.squad, 14)}${RESET}${colors.dim}~$${sq.projectedMonthlyCost.toFixed(0)}/mo${RESET} ${trendIcon}`);\n }\n }\n\n // Before/after comparison with baseline\n if (baseline) {\n writeLine();\n writeLine(` ${colors.dim}vs Baseline${RESET} ${colors.dim}(${baseline.name})${RESET}`);\n const costDelta = roiMetrics.totalCostUsd - baseline.costUsd;\n const goalsDelta = goalCount.completed - baseline.goalsCompleted;\n const costPerGoalBefore = baseline.goalsCompleted > 0 ? baseline.costUsd / baseline.goalsCompleted : 0;\n const costPerGoalAfter = goalCount.completed > 0 ? roiMetrics.totalCostUsd / goalCount.completed : 0;\n const efficiencyChange = costPerGoalBefore > 0 ? ((costPerGoalBefore - costPerGoalAfter) / costPerGoalBefore) * 100 : 0;\n\n const costColor = costDelta > 0 ? colors.red : colors.green;\n const goalsColor = goalsDelta >= 0 ? colors.green : colors.red;\n const effColor = efficiencyChange > 0 ? colors.green : efficiencyChange < 0 ? colors.red : colors.dim;\n writeLine(` ${colors.dim}Cost:${RESET} ${costColor}${costDelta >= 0 ? '+' : ''}$${costDelta.toFixed(2)}${RESET} ${colors.dim}Goals:${RESET} ${goalsColor}${goalsDelta >= 0 ? '+' : ''}${goalsDelta}${RESET} ${colors.dim}Efficiency:${RESET} ${effColor}${efficiencyChange >= 0 ? '+' : ''}${efficiencyChange.toFixed(0)}%${RESET}`);\n } else {\n writeLine();\n writeLine(` ${colors.dim}No baseline set. Capture one with:${RESET} squads baseline`);\n }\n\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\nimport {\n ProviderName,\n ProviderDetection,\n detectProviderFromModel,\n detectProvidersFromEnv,\n calcCost as calcProviderCost,\n getProviderDisplayName,\n} from './providers.js';\n\n// Re-export provider types for convenience\nexport { ProviderName, ProviderDetection, detectProviderFromModel, detectProvidersFromEnv, getProviderDisplayName };\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 ProviderCosts {\n provider: ProviderName;\n displayName: string;\n calls: number;\n inputTokens: number;\n outputTokens: number;\n cost: number;\n plan?: string;\n confidence?: 'explicit' | 'inferred';\n reason?: string;\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 byProvider: ProviderCosts[];\n source: 'postgres' | 'langfuse' | 'none';\n}\n\n// Legacy MODEL_PRICING kept for backward compatibility\n// New code should use getModelPricing() from providers.ts\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 * Anthropic plan types:\n * - 'max': Flat fee subscription ($200/mo), no overage - only rate limits matter\n * - 'usage': Pay-per-token, budget tracking matters\n * - 'unknown': Not configured yet\n */\nexport type PlanType = 'max' | 'usage' | 'unknown';\n\n/**\n * Plan detection result with confidence and reason\n */\nexport interface PlanDetection {\n plan: PlanType;\n confidence: 'explicit' | 'inferred';\n reason: string;\n}\n\n/**\n * Detect the Anthropic plan type using multiple signals:\n *\n * Priority order:\n * 1. Explicit SQUADS_PLAN_TYPE env var (highest confidence)\n * 2. ANTHROPIC_BUDGET_DAILY set → usage plan (user cares about budget)\n * 3. Tier 4 + no budget → likely Max plan (heavy user)\n * 4. Low tier (1-2) → usage plan (new user, pay-as-you-go)\n * 5. Default: max (assumes professional use)\n */\nexport function detectPlan(): PlanDetection {\n // 1. Explicit configuration (highest priority)\n const explicitPlan = process.env.SQUADS_PLAN_TYPE?.toLowerCase();\n if (explicitPlan === 'usage') {\n return { plan: 'usage', confidence: 'explicit', reason: 'SQUADS_PLAN_TYPE=usage' };\n }\n if (explicitPlan === 'max') {\n return { plan: 'max', confidence: 'explicit', reason: 'SQUADS_PLAN_TYPE=max' };\n }\n\n // 2. Budget explicitly set → user cares about costs → usage plan\n const budgetSet = process.env.ANTHROPIC_BUDGET_DAILY || process.env.SQUADS_DAILY_BUDGET;\n if (budgetSet) {\n return { plan: 'usage', confidence: 'inferred', reason: `Budget set ($${budgetSet}/day)` };\n }\n\n // 3. Check tier - Tier 4 usually indicates Max plan user\n const tier = parseInt(process.env.ANTHROPIC_TIER || '0', 10);\n if (tier >= 4) {\n return { plan: 'max', confidence: 'inferred', reason: `Tier ${tier} (high usage)` };\n }\n\n // 4. Low tier (1-2) → likely new user on usage plan\n if (tier >= 1 && tier <= 2) {\n return { plan: 'usage', confidence: 'inferred', reason: `Tier ${tier} (new user)` };\n }\n\n // 5. Default: unknown - prompt user to configure\n return { plan: 'unknown', confidence: 'inferred', reason: 'Not configured' };\n}\n\n/**\n * Get the current Anthropic plan type\n * Use detectPlan() for full details including confidence\n */\nexport function getPlanType(): PlanType {\n return detectPlan().plan;\n}\n\n/**\n * Check if we're on a flat-fee plan where budget doesn't matter\n */\nexport function isMaxPlan(): boolean {\n return getPlanType() === 'max';\n}\n\n/**\n * Get human-readable plan description for dashboard display\n */\nexport function getPlanDescription(): string {\n const detection = detectPlan();\n const planName = detection.plan === 'max'\n ? 'Max ($200 flat)'\n : detection.plan === 'usage'\n ? 'Usage (pay-per-token)'\n : 'Unknown';\n const confidence = detection.confidence === 'explicit' ? '' : ` [${detection.reason}]`;\n return `${planName}${confidence}`;\n}\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 // Use provider-aware pricing\n const provider = detectProviderFromModel(model);\n return calcProviderCost(provider, model, inputTokens, outputTokens);\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 // Build provider summary from detected providers in env\n const detectedProviders = detectProvidersFromEnv();\n const byProvider: ProviderCosts[] = detectedProviders.map((p) => ({\n provider: p.provider,\n displayName: getProviderDisplayName(p.provider),\n calls: 0, // Bridge doesn't track by provider yet\n inputTokens: 0,\n outputTokens: 0,\n cost: p.provider === 'anthropic' ? totalCost : 0, // Assume all cost is Anthropic for now\n plan: p.plan,\n confidence: p.confidence,\n reason: p.reason,\n }));\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 byProvider,\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 // Build provider summary - Langfuse can track by model, so group by provider\n const providerMap: Record<string, ProviderCosts> = {};\n for (const obs of observations) {\n if (obs.type !== 'GENERATION') continue;\n const model = obs.model || 'unknown';\n const provider = detectProviderFromModel(model);\n const usage = obs.usage || {};\n const inputTokens = usage.input || 0;\n const outputTokens = usage.output || 0;\n const cost = calcCost(model, inputTokens, outputTokens);\n\n if (!providerMap[provider]) {\n const detection = detectProvidersFromEnv().find((p) => p.provider === provider);\n providerMap[provider] = {\n provider,\n displayName: getProviderDisplayName(provider),\n calls: 0,\n inputTokens: 0,\n outputTokens: 0,\n cost: 0,\n plan: detection?.plan,\n confidence: detection?.confidence,\n reason: detection?.reason,\n };\n }\n providerMap[provider].calls += 1;\n providerMap[provider].inputTokens += inputTokens;\n providerMap[provider].outputTokens += outputTokens;\n providerMap[provider].cost += cost;\n }\n const byProvider = Object.values(providerMap).sort((a, b) => b.cost - a.cost);\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 byProvider,\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 - still detect providers from env\n const defaultBudget = parseFloat(process.env.SQUADS_DAILY_BUDGET || '') || DEFAULT_DAILY_BUDGET;\n const detectedProviders = detectProvidersFromEnv();\n const byProvider: ProviderCosts[] = detectedProviders.map((p) => ({\n provider: p.provider,\n displayName: getProviderDisplayName(p.provider),\n calls: 0,\n inputTokens: 0,\n outputTokens: 0,\n cost: 0,\n plan: p.plan,\n confidence: p.confidence,\n reason: p.reason,\n }));\n\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 byProvider,\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 * All HTTP calls are made in parallel for optimal performance\n */\nexport async function fetchBridgeStats(): Promise<BridgeStats | null> {\n try {\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 interface HealthData {\n postgres?: string;\n redis?: string;\n langfuse?: string;\n }\n\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 // Fetch ALL endpoints in parallel (4 requests -> 1 round trip)\n const [statsResponse, healthResponse, costResponse, weekResponse] = await Promise.all([\n fetchWithTimeout(`${BRIDGE_URL}/stats`, {\n headers: { 'Content-Type': 'application/json' },\n }),\n fetchWithTimeout(`${BRIDGE_URL}/health`, {\n headers: { 'Content-Type': 'application/json' },\n }),\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 if (!statsResponse.ok) {\n return null;\n }\n\n // Parse all responses in parallel\n const [stats, health, costData, weekData] = await Promise.all([\n statsResponse.json() as Promise<StatsData>,\n healthResponse.ok ? healthResponse.json() as Promise<HealthData> : Promise.resolve({} as HealthData),\n costResponse.ok ? costResponse.json() as Promise<CostData> : Promise.resolve({} as CostData),\n weekResponse.ok ? weekResponse.json() as Promise<CostData> : Promise.resolve({} as CostData),\n ]);\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 * Monthly quota/autonomy data from bridge\n */\nexport interface QuotaInfo {\n monthlyUsed: number;\n monthlyQuota: number;\n quotaPct: number;\n autonomyScore: number;\n confidenceLevel: string;\n learningCount: number;\n}\n\nexport async function fetchQuotaInfo(): Promise<QuotaInfo | null> {\n const bridgeUrl = process.env.SQUADS_BRIDGE_URL || 'http://localhost:8088';\n\n try {\n const response = await fetch(`${bridgeUrl}/api/autonomy/score`);\n if (!response.ok) return null;\n\n const data = await response.json() as {\n overall_score: number;\n confidence_level: string;\n execution_stats: {\n monthly_used: number;\n monthly_quota: number;\n quota_pct: number;\n learning_count: number;\n };\n };\n\n return {\n monthlyUsed: data.execution_stats.monthly_used,\n monthlyQuota: data.execution_stats.monthly_quota,\n quotaPct: data.execution_stats.quota_pct,\n autonomyScore: data.overall_score,\n confidenceLevel: data.confidence_level,\n learningCount: data.execution_stats.learning_count,\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// === NPM Stats for Acquisition Tracking ===\n\nexport interface NpmStats {\n package: string;\n downloads: {\n lastDay: number;\n lastWeek: number;\n lastMonth: number;\n };\n weekOverWeek: number; // percentage change\n}\n\nexport async function fetchNpmStats(packageName: string = process.env.SQUADS_NPM_PACKAGE || 'squads-cli'): Promise<NpmStats | null> {\n try {\n const [dayRes, weekRes, monthRes] = await Promise.all([\n fetch(`https://api.npmjs.org/downloads/point/last-day/${packageName}`),\n fetch(`https://api.npmjs.org/downloads/point/last-week/${packageName}`),\n fetch(`https://api.npmjs.org/downloads/point/last-month/${packageName}`),\n ]);\n\n if (!dayRes.ok || !weekRes.ok || !monthRes.ok) return null;\n\n const [dayData, weekData, monthData] = await Promise.all([\n dayRes.json() as Promise<{ downloads: number }>,\n weekRes.json() as Promise<{ downloads: number }>,\n monthRes.json() as Promise<{ downloads: number }>,\n ]);\n\n // Calculate week-over-week growth (rough estimate: this week vs avg of month)\n const avgWeeklyFromMonth = monthData.downloads / 4;\n const weekOverWeek = avgWeeklyFromMonth > 0\n ? Math.round(((weekData.downloads - avgWeeklyFromMonth) / avgWeeklyFromMonth) * 100)\n : 0;\n\n return {\n package: packageName,\n downloads: {\n lastDay: dayData.downloads,\n lastWeek: weekData.downloads,\n lastMonth: monthData.downloads,\n },\n weekOverWeek,\n };\n } catch {\n return null;\n }\n}\n\n/**\n * Claude Code subscription capacity data\n * Read from ~/.claude/stats-cache.json\n */\nexport interface ClaudeCodeCapacity {\n // Weekly capacity (from stats-cache.json token data)\n weeklyTokensUsed: number;\n weeklyTokensLimit: number;\n weeklyCapacityPct: number;\n // Session capacity (estimated from current session)\n sessionTokensUsed: number;\n sessionTokensLimit: number;\n sessionCapacityPct: number;\n // By model breakdown\n opusTokensUsed: number;\n sonnetTokensUsed: number;\n haikuTokensUsed: number;\n // Reset info\n weeklyResetDate: string;\n sessionResetTime: string;\n}\n\n// Claude Code subscription capacity estimation\n// The actual limits use \"usage units\" not raw tokens\n// Opus costs ~5x more usage units than Sonnet/Haiku\n// Based on user reports: Max 20x gives ~24-40 hours Opus/week\n// Conservative estimate: ~4M \"weighted tokens\" per week for Max 20x\nconst OPUS_WEIGHT = 5; // Opus costs ~5x more against limit\nconst SONNET_WEIGHT = 1; // Sonnet is the baseline\nconst HAIKU_WEIGHT = 0.25; // Haiku is cheaper\n\n// Effective weekly limit in weighted tokens (conservative for Max 20x)\n// Adjust via SQUADS_WEEKLY_LIMIT env var if your plan differs\nconst DEFAULT_WEEKLY_WEIGHTED_LIMIT = 4_000_000;\nconst MAX5_SESSION_TOKEN_LIMIT = 2_000_000; // ~2M tokens/session (raw)\n\n/**\n * Fetch Claude Code capacity from stats-cache.json\n */\nexport async function fetchClaudeCodeCapacity(): Promise<ClaudeCodeCapacity | null> {\n const { readFile } = await import('fs/promises');\n const { homedir } = await import('os');\n const { join } = await import('path');\n\n try {\n const cacheFile = join(homedir(), '.claude', 'stats-cache.json');\n const content = await readFile(cacheFile, 'utf-8');\n const data = JSON.parse(content) as {\n dailyModelTokens?: Array<{\n date: string;\n tokensByModel: Record<string, number>;\n }>;\n modelUsage?: Record<string, {\n inputTokens?: number;\n outputTokens?: number;\n cacheReadInputTokens?: number;\n cacheCreationInputTokens?: number;\n }>;\n };\n\n // Calculate weekly token usage (last 7 days)\n const now = new Date();\n const weekAgo = new Date(now.getTime() - 7 * 24 * 60 * 60 * 1000);\n const weekStart = weekAgo.toISOString().split('T')[0];\n\n let weeklyOpus = 0;\n\n if (data.dailyModelTokens) {\n for (const day of data.dailyModelTokens) {\n if (day.date >= weekStart) {\n for (const [model, tokens] of Object.entries(day.tokensByModel)) {\n if (model.includes('opus')) {\n weeklyOpus += tokens;\n }\n }\n }\n }\n }\n\n // Calculate weighted usage (Opus costs 5x more against limit)\n // This better reflects actual subscription capacity consumption\n const weeklyLimit = parseInt(process.env.SQUADS_WEEKLY_LIMIT || '', 10) || DEFAULT_WEEKLY_WEIGHTED_LIMIT;\n\n // Calculate session usage (today's tokens as proxy)\n const today = now.toISOString().split('T')[0];\n let sessionTokens = 0;\n if (data.dailyModelTokens) {\n const todayData = data.dailyModelTokens.find(d => d.date === today);\n if (todayData) {\n sessionTokens = Object.values(todayData.tokensByModel).reduce((a, b) => a + b, 0);\n }\n }\n\n // Calculate weekly reset (next Sunday 9:59pm in local timezone)\n const daysUntilSunday = (7 - now.getDay()) % 7 || 7;\n const nextSunday = new Date(now);\n nextSunday.setDate(now.getDate() + daysUntilSunday);\n nextSunday.setHours(21, 59, 0, 0);\n\n // Session reset (end of current session - approximate as end of day)\n const sessionReset = new Date(now);\n sessionReset.setHours(18, 59, 0, 0);\n if (sessionReset < now) {\n sessionReset.setDate(sessionReset.getDate() + 1);\n }\n\n // Calculate Sonnet/Haiku usage\n let sonnetTokens = 0;\n let haikuTokens = 0;\n if (data.dailyModelTokens) {\n for (const day of data.dailyModelTokens) {\n if (day.date >= weekStart) {\n for (const [model, tokens] of Object.entries(day.tokensByModel)) {\n if (model.includes('sonnet')) {\n sonnetTokens += tokens;\n } else if (model.includes('haiku')) {\n haikuTokens += tokens;\n }\n }\n }\n }\n }\n\n // Calculate weighted weekly usage\n const weeklyWeighted = Math.round(\n (weeklyOpus * OPUS_WEIGHT) +\n (sonnetTokens * SONNET_WEIGHT) +\n (haikuTokens * HAIKU_WEIGHT)\n );\n\n return {\n weeklyTokensUsed: weeklyWeighted, // Now weighted, not raw\n weeklyTokensLimit: weeklyLimit,\n weeklyCapacityPct: Math.round((weeklyWeighted / weeklyLimit) * 100),\n sessionTokensUsed: sessionTokens,\n sessionTokensLimit: MAX5_SESSION_TOKEN_LIMIT,\n sessionCapacityPct: Math.round((sessionTokens / MAX5_SESSION_TOKEN_LIMIT) * 100),\n opusTokensUsed: weeklyOpus,\n sonnetTokensUsed: sonnetTokens,\n haikuTokensUsed: haikuTokens,\n weeklyResetDate: nextSunday.toLocaleDateString('en-US', { month: 'short', day: 'numeric' }),\n sessionResetTime: sessionReset.toLocaleTimeString('en-US', { hour: 'numeric', minute: '2-digit' }),\n };\n } catch {\n return null;\n }\n}\n\n// === ROI and Cost Projection Types ===\n\n/**\n * ROI metrics for measuring value delivered vs cost\n */\nexport interface ROIMetrics {\n totalCostUsd: number;\n costPerGoal: number;\n costPerCommit: number;\n costPerPR: number;\n estimatedValueUsd: number;\n roiMultiplier: number;\n dailyProjectedCost: number;\n weeklyProjectedCost: number;\n monthlyProjectedCost: number;\n hoursTracked: number;\n costPerHour: number;\n}\n\n/**\n * Before/after comparison for a period\n */\nexport interface BeforeAfterMetrics {\n periodStart: string;\n periodEnd: string;\n baselineCostUsd: number;\n baselineGoals: number;\n baselineCommits: number;\n baselinePRs: number;\n baselineTokens: number;\n currentCostUsd: number;\n currentGoals: number;\n currentCommits: number;\n currentPRs: number;\n currentTokens: number;\n costDelta: number;\n goalsDelta: number;\n commitsDelta: number;\n prsDelta: number;\n tokensDelta: number;\n costPerGoalBefore: number;\n costPerGoalAfter: number;\n efficiencyImprovement: number;\n}\n\n/**\n * Squad-level cost projection\n */\nexport interface SquadCostProjection {\n squad: string;\n currentDailyCost: number;\n projectedDailyCost: number;\n projectedWeeklyCost: number;\n projectedMonthlyCost: number;\n costTrend: 'increasing' | 'stable' | 'decreasing';\n trendPct: number;\n}\n\n/**\n * Calculate ROI metrics from cost and activity data\n */\nexport function calculateROIMetrics(\n costs: CostSummary | null,\n goalsCompleted: number,\n commits: number,\n prsMerged: number,\n hoursTracked: number = 0\n): ROIMetrics {\n const totalCost = costs?.totalCost || 0;\n const costPerGoal = goalsCompleted > 0 ? totalCost / goalsCompleted : 0;\n const costPerCommit = commits > 0 ? totalCost / commits : 0;\n const costPerPR = prsMerged > 0 ? totalCost / prsMerged : 0;\n\n const GOAL_VALUE = parseFloat(process.env.SQUADS_GOAL_VALUE || '100');\n const PR_VALUE = parseFloat(process.env.SQUADS_PR_VALUE || '200');\n const COMMIT_VALUE = parseFloat(process.env.SQUADS_COMMIT_VALUE || '25');\n\n const estimatedValue = (goalsCompleted * GOAL_VALUE) + (prsMerged * PR_VALUE) + (commits * COMMIT_VALUE);\n const roiMultiplier = totalCost > 0 ? estimatedValue / totalCost : 0;\n\n const now = new Date();\n const hoursElapsed = hoursTracked > 0 ? hoursTracked : Math.max(now.getHours() + now.getMinutes() / 60, 1);\n const costPerHour = totalCost / hoursElapsed;\n\n return {\n totalCostUsd: totalCost,\n costPerGoal,\n costPerCommit,\n costPerPR,\n estimatedValueUsd: estimatedValue,\n roiMultiplier,\n dailyProjectedCost: costPerHour * 24,\n weeklyProjectedCost: costPerHour * 24 * 7,\n monthlyProjectedCost: costPerHour * 24 * 30,\n hoursTracked: hoursElapsed,\n costPerHour,\n };\n}\n\n/**\n * Calculate cost projections per squad\n */\nexport function calculateSquadCostProjections(\n bridgeStats: BridgeStats | null,\n _history: Array<{ squad: string; costUsd: number }[]> | null\n): SquadCostProjection[] {\n if (!bridgeStats || bridgeStats.bySquad.length === 0) {\n return [];\n }\n\n const now = new Date();\n const hoursElapsed = Math.max(now.getHours() + now.getMinutes() / 60, 1);\n\n return bridgeStats.bySquad.map(squad => {\n const hourlyRate = squad.costUsd / hoursElapsed;\n return {\n squad: squad.squad,\n currentDailyCost: squad.costUsd,\n projectedDailyCost: hourlyRate * 24,\n projectedWeeklyCost: hourlyRate * 24 * 7,\n projectedMonthlyCost: hourlyRate * 24 * 30,\n costTrend: 'stable' as const,\n trendPct: 0,\n };\n });\n}\n","/**\n * Database utilities — stub implementation\n *\n * Database persistence is a platform feature (Layer 3).\n * The CLI (Layer 1) operates entirely on the local file system.\n * These stubs maintain API compatibility for commands that reference db functions.\n */\n\n/**\n * Check if database is available (always false in CLI-only mode)\n */\nexport async function isDatabaseAvailable(): Promise<boolean> {\n return false;\n}\n\n/**\n * Dashboard snapshot data structure\n */\nexport interface DashboardSnapshot {\n totalSquads: number;\n totalCommits: number;\n totalPrsMerged: number;\n totalIssuesClosed: number;\n totalIssuesOpen: number;\n goalProgressPct: number;\n costUsd: number;\n dailyBudgetUsd: number;\n inputTokens: number;\n outputTokens: number;\n commits30d: number;\n avgCommitsPerDay: number;\n activeDays: number;\n peakCommits: number;\n peakDate: string | null;\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 (no-op without database)\n */\nexport async function saveDashboardSnapshot(_snapshot: DashboardSnapshot): Promise<number | null> {\n return null;\n}\n\n/**\n * Get recent dashboard snapshots (empty without database)\n */\nexport async function getDashboardHistory(_limit: number = 30): Promise<DashboardSnapshot[]> {\n return [];\n}\n\n/**\n * Close the database connection pool (no-op)\n */\nexport async function closeDatabase(): Promise<void> {\n // No-op: no database connection in CLI-only mode\n}\n\n// === Baseline Storage for ROI Tracking ===\n\nexport interface BaselineSnapshot {\n id?: number;\n name: string;\n capturedAt: string;\n costUsd: number;\n goalsCompleted: number;\n goalsActive: number;\n commits: number;\n prsMerged: number;\n issuesClosed: number;\n inputTokens: number;\n outputTokens: number;\n squadMetrics: Array<{\n squad: string;\n costUsd: number;\n goals: number;\n commits: number;\n prs: number;\n }>;\n}\n\n/**\n * Save a baseline snapshot (no-op without database)\n */\nexport async function saveBaseline(_baseline: BaselineSnapshot): Promise<number | null> {\n return null;\n}\n\n/**\n * Get the most recent baseline (null without database)\n */\nexport async function getLatestBaseline(): Promise<BaselineSnapshot | null> {\n return null;\n}\n\n/**\n * Get a baseline by name (null without database)\n */\nexport async function getBaselineByName(_name: string): Promise<BaselineSnapshot | null> {\n return null;\n}\n\n/**\n * List all baselines (empty without database)\n */\nexport async function listBaselines(_limit: number = 10): Promise<BaselineSnapshot[]> {\n return [];\n}\n","/**\n * Dashboard Loader\n * Loads and parses dashboard YAML definitions\n */\n\nimport { readFileSync, readdirSync, existsSync } from 'fs';\nimport { join, basename } from 'path';\nimport { createRequire } from 'module';\nimport type { DashboardDefinition } from './types.js';\n\nconst require = createRequire(import.meta.url);\nconst yaml = require('js-yaml');\n\n// Cache loaded dashboards\nconst dashboardCache = new Map<string, DashboardDefinition>();\n\n/**\n * Find the dashboards directory\n */\nexport function findDashboardsDir(): string | null {\n // Start from cwd and walk up\n let dir = process.cwd();\n for (let i = 0; i < 10; i++) {\n const dashDir = join(dir, '.agents', 'dashboards');\n if (existsSync(dashDir)) {\n return dashDir;\n }\n const parent = join(dir, '..');\n if (parent === dir) break;\n dir = parent;\n }\n return null;\n}\n\n/**\n * List all available dashboards\n */\nexport function listDashboards(): string[] {\n const dir = findDashboardsDir();\n if (!dir) return [];\n\n try {\n return readdirSync(dir)\n .filter(f => f.endsWith('.yaml') && !f.startsWith('_'))\n .map(f => basename(f, '.yaml'));\n } catch {\n return [];\n }\n}\n\n/**\n * Load a dashboard definition by name\n */\nexport function loadDashboard(name: string): DashboardDefinition | null {\n // Check cache\n if (dashboardCache.has(name)) {\n return dashboardCache.get(name)!;\n }\n\n const dir = findDashboardsDir();\n if (!dir) return null;\n\n const filePath = join(dir, `${name}.yaml`);\n if (!existsSync(filePath)) return null;\n\n try {\n const content = readFileSync(filePath, 'utf-8');\n const def = yaml.load(content) as DashboardDefinition;\n\n // Validate required fields\n if (!def.name || !def.title || !def.source || !def.metrics || !def.views) {\n console.error(`Invalid dashboard definition: ${name}`);\n return null;\n }\n\n // Cache and return\n dashboardCache.set(name, def);\n return def;\n } catch (err) {\n console.error(`Error loading dashboard ${name}:`, err);\n return null;\n }\n}\n\n/**\n * Load all dashboards\n */\nexport function loadAllDashboards(): DashboardDefinition[] {\n const names = listDashboards();\n return names\n .map(name => loadDashboard(name))\n .filter((d): d is DashboardDefinition => d !== null);\n}\n\n/**\n * Clear the dashboard cache (useful for hot-reload)\n */\nexport function clearDashboardCache(): void {\n dashboardCache.clear();\n}\n\n/**\n * Get dashboard by partial match (fuzzy find)\n */\nexport function findDashboard(query: string): DashboardDefinition | null {\n // Exact match first\n const exact = loadDashboard(query);\n if (exact) return exact;\n\n // Partial match\n const all = listDashboards();\n const match = all.find(name =>\n name.toLowerCase().includes(query.toLowerCase())\n );\n if (match) return loadDashboard(match);\n\n return null;\n}\n","/**\n * PostgreSQL Data Source — stub implementation\n *\n * Database queries are a platform feature (Layer 3).\n * The CLI dashboard uses local data sources only.\n * The pure utility functions (buildQuery, buildWhereClause, parseDateRange) are kept\n * as they don't depend on pg and may be used by other data sources.\n */\n\nimport type { DataSource, QueryResult } from '../types.js';\n\nexport const postgresSource: DataSource = {\n name: 'postgres',\n\n async query(_sql: string, _params: unknown[] = []): Promise<QueryResult> {\n return { rows: [], columns: [] };\n },\n\n async isAvailable(): Promise<boolean> {\n return false;\n },\n\n async close(): Promise<void> {\n // No-op\n },\n};\n\n/**\n * Build a SELECT query from dashboard definition\n */\nexport function buildQuery(\n table: string,\n metrics: { name: string; sql: string }[],\n groupBy?: string[],\n where?: string,\n orderBy?: string,\n limit?: number\n): string {\n const selectParts: string[] = [];\n\n if (groupBy && groupBy.length > 0) {\n for (const col of groupBy) {\n selectParts.push(col);\n }\n }\n\n for (const metric of metrics) {\n selectParts.push(`${metric.sql} AS ${metric.name}`);\n }\n\n let sql = `SELECT ${selectParts.join(', ')} FROM ${table}`;\n\n if (where) {\n sql += ` WHERE ${where}`;\n }\n\n if (groupBy && groupBy.length > 0) {\n sql += ` GROUP BY ${groupBy.join(', ')}`;\n }\n\n if (orderBy) {\n sql += ` ORDER BY ${orderBy}`;\n }\n\n if (limit) {\n sql += ` LIMIT ${limit}`;\n }\n\n return sql;\n}\n\n/**\n * Build WHERE clause from filters\n */\nexport function buildWhereClause(\n filters: Record<string, unknown>,\n filterDefs: { name: string; field?: string; type: string }[]\n): string | null {\n const conditions: string[] = [];\n\n for (const [name, value] of Object.entries(filters)) {\n if (value === undefined || value === null) continue;\n\n const def = filterDefs.find(f => f.name === name);\n if (!def) continue;\n\n const field = def.field || name;\n\n if (def.type === 'date_range' && typeof value === 'object') {\n const range = value as { start?: Date; end?: Date };\n if (range.start) {\n conditions.push(`${field} >= '${range.start.toISOString()}'`);\n }\n if (range.end) {\n conditions.push(`${field} <= '${range.end.toISOString()}'`);\n }\n } else if (def.type === 'select' && Array.isArray(value)) {\n if (value.length > 0) {\n const escaped = value.map(v => `'${String(v).replace(/'/g, \"''\")}'`);\n conditions.push(`${field} IN (${escaped.join(', ')})`);\n }\n } else if (def.type === 'boolean') {\n conditions.push(`${field} = ${value ? 'true' : 'false'}`);\n } else if (def.type === 'text') {\n conditions.push(`${field} ILIKE '%${String(value).replace(/'/g, \"''\")}%'`);\n }\n }\n\n return conditions.length > 0 ? conditions.join(' AND ') : null;\n}\n\n/**\n * Parse date range presets\n */\nexport function parseDateRange(preset: string): { start: Date; end: Date } {\n const now = new Date();\n const end = new Date(now);\n end.setHours(23, 59, 59, 999);\n\n const start = new Date(now);\n start.setHours(0, 0, 0, 0);\n\n switch (preset) {\n case 'today':\n return { start, end };\n\n case 'yesterday':\n start.setDate(start.getDate() - 1);\n end.setDate(end.getDate() - 1);\n return { start, end };\n\n case 'last_7d':\n start.setDate(start.getDate() - 7);\n return { start, end };\n\n case 'last_30d':\n start.setDate(start.getDate() - 30);\n return { start, end };\n\n case 'this_month':\n start.setDate(1);\n return { start, end };\n\n case 'last_month':\n start.setMonth(start.getMonth() - 1);\n start.setDate(1);\n end.setDate(0);\n return { start, end };\n\n case 'this_quarter': {\n const q = Math.floor(now.getMonth() / 3);\n start.setMonth(q * 3);\n start.setDate(1);\n return { start, end };\n }\n\n default:\n start.setDate(start.getDate() - 7);\n return { start, end };\n }\n}\n","/**\n * Base Renderer Utilities\n * Shared formatting and rendering functions\n */\n\nimport {\n colors,\n bold,\n RESET,\n box,\n padEnd,\n truncate,\n writeLine,\n progressBar,\n sparkline,\n barChart,\n gradient,\n} from '../../terminal.js';\n\nexport { colors, bold, RESET, box, padEnd, truncate, writeLine, progressBar, sparkline, barChart, gradient };\n\n/**\n * Format a value based on format type\n */\nexport function formatValue(\n value: unknown,\n format: string,\n truncateLen?: number\n): string {\n if (value === null || value === undefined) {\n return `${colors.dim}—${RESET}`;\n }\n\n const strValue = String(value);\n\n switch (format) {\n case 'number': {\n const num = typeof value === 'number' ? value : parseFloat(strValue);\n if (isNaN(num)) return strValue;\n if (num >= 1_000_000) return `${(num / 1_000_000).toFixed(1)}M`;\n if (num >= 1_000) return `${(num / 1_000).toFixed(1)}k`;\n return num.toLocaleString();\n }\n\n case 'currency': {\n const amount = typeof value === 'number' ? value : parseFloat(strValue);\n if (isNaN(amount)) return strValue;\n return `$${amount.toFixed(2)}`;\n }\n\n case 'percent': {\n const pct = typeof value === 'number' ? value : parseFloat(strValue);\n if (isNaN(pct)) return strValue;\n return `${pct.toFixed(1)}%`;\n }\n\n case 'duration': {\n const secs = typeof value === 'number' ? value : parseFloat(strValue);\n if (isNaN(secs)) return strValue;\n if (secs < 60) return `${secs.toFixed(1)}s`;\n if (secs < 3600) return `${Math.floor(secs / 60)}m ${Math.round(secs % 60)}s`;\n return `${Math.floor(secs / 3600)}h ${Math.floor((secs % 3600) / 60)}m`;\n }\n\n case 'tokens': {\n const tokens = typeof value === 'number' ? value : parseInt(strValue, 10);\n if (isNaN(tokens)) return strValue;\n if (tokens >= 1_000_000) return `${(tokens / 1_000_000).toFixed(1)}M`;\n if (tokens >= 1_000) return `${(tokens / 1_000).toFixed(0)}k`;\n return tokens.toLocaleString();\n }\n\n case 'relative_time':\n return formatRelativeTime(value);\n\n case 'relative_date':\n return formatRelativeDate(value);\n\n case 'status_badge':\n return formatStatusBadge(strValue);\n\n case 'progress_bar': {\n const progress = typeof value === 'number' ? value : parseFloat(strValue);\n if (isNaN(progress)) return strValue;\n return progressBar(progress, 8);\n }\n\n default:\n if (truncateLen && strValue.length > truncateLen) {\n return truncate(strValue, truncateLen);\n }\n return strValue;\n }\n}\n\n/**\n * Format relative time (e.g., \"5 minutes ago\")\n */\nfunction formatRelativeTime(value: unknown): string {\n const date = value instanceof Date ? value : new Date(String(value));\n if (isNaN(date.getTime())) return String(value);\n\n const now = new Date();\n const diffMs = now.getTime() - date.getTime();\n const diffSecs = Math.floor(diffMs / 1000);\n const diffMins = Math.floor(diffSecs / 60);\n const diffHours = Math.floor(diffMins / 60);\n const diffDays = Math.floor(diffHours / 24);\n\n if (diffSecs < 60) return `${diffSecs}s ago`;\n if (diffMins < 60) return `${diffMins}m ago`;\n if (diffHours < 24) return `${diffHours}h ago`;\n if (diffDays < 7) return `${diffDays}d ago`;\n return date.toLocaleDateString();\n}\n\n/**\n * Format relative date (e.g., \"today\", \"yesterday\", \"5 days ago\")\n */\nfunction formatRelativeDate(value: unknown): string {\n const date = value instanceof Date ? value : new Date(String(value));\n if (isNaN(date.getTime())) return String(value);\n\n const now = new Date();\n const today = new Date(now.getFullYear(), now.getMonth(), now.getDate());\n const target = new Date(date.getFullYear(), date.getMonth(), date.getDate());\n const diffDays = Math.floor((today.getTime() - target.getTime()) / (1000 * 60 * 60 * 24));\n\n if (diffDays === 0) return 'today';\n if (diffDays === 1) return 'yesterday';\n if (diffDays < 7) return `${diffDays}d ago`;\n if (diffDays < 30) return `${Math.floor(diffDays / 7)}w ago`;\n return date.toLocaleDateString();\n}\n\n/**\n * Format status badge with color\n */\nfunction formatStatusBadge(status: string): string {\n const lower = status.toLowerCase();\n\n switch (lower) {\n case 'success':\n case 'completed':\n case 'active':\n return `${colors.green}${status}${RESET}`;\n\n case 'failed':\n case 'error':\n return `${colors.red}${status}${RESET}`;\n\n case 'running':\n case 'pending':\n case 'in_progress':\n return `${colors.yellow}${status}${RESET}`;\n\n case 'timeout':\n case 'cancelled':\n return `${colors.dim}${status}${RESET}`;\n\n default:\n return status;\n }\n}\n\n/**\n * Get color based on value threshold\n */\nexport function getThresholdColor(\n value: number,\n thresholds: { good?: number; warning?: number; direction?: 'up' | 'down' }\n): string {\n const { good = 80, warning = 50, direction = 'up' } = thresholds;\n\n if (direction === 'up') {\n if (value >= good) return colors.green;\n if (value >= warning) return colors.yellow;\n return colors.red;\n } else {\n if (value <= good) return colors.green;\n if (value <= warning) return colors.yellow;\n return colors.red;\n }\n}\n\n/**\n * Render a horizontal divider\n */\nexport function renderDivider(width: number = 50): void {\n writeLine(` ${colors.dim}${box.horizontal.repeat(width)}${RESET}`);\n}\n\n/**\n * Render section header\n */\nexport function renderSectionHeader(title: string): void {\n writeLine();\n writeLine(` ${bold}${title}${RESET}`);\n writeLine();\n}\n\n/**\n * Calculate column widths for table rendering\n */\nexport function calculateColumnWidths(\n rows: Record<string, unknown>[],\n columns: { field: string; label?: string }[],\n maxWidth: number = 80\n): number[] {\n const widths = columns.map(col => {\n const headerLen = (col.label || col.field).length;\n const maxValueLen = rows.reduce((max, row) => {\n const val = String(row[col.field] ?? '');\n return Math.max(max, val.length);\n }, 0);\n return Math.min(Math.max(headerLen, maxValueLen) + 2, 30);\n });\n\n // Scale down if total exceeds maxWidth\n const totalWidth = widths.reduce((sum, w) => sum + w, 0);\n if (totalWidth > maxWidth) {\n const scale = maxWidth / totalWidth;\n return widths.map(w => Math.max(Math.floor(w * scale), 5));\n }\n\n return widths;\n}\n","/**\n * Summary Renderer\n * Renders key metrics in a horizontal row\n */\n\nimport type { ViewDefinition, MetricDefinition, QueryResult } from '../types.js';\nimport { colors, bold, RESET, formatValue } from './base.js';\n\nexport function renderSummary(\n view: ViewDefinition,\n data: QueryResult,\n metricDefs: MetricDefinition[]\n): string[] {\n const lines: string[] = [];\n const row = data.rows[0] || {};\n\n // Build metric display parts\n const parts: string[] = [];\n\n for (const metricName of view.metrics || []) {\n const def = metricDefs.find(m => m.name === metricName);\n if (!def) continue;\n\n const value = row[metricName];\n const formatted = formatValue(value, def.format);\n const label = def.label || metricName;\n\n // Color based on format\n const valueColor = def.format === 'currency' ? colors.green :\n def.format === 'percent' ? colors.purple :\n colors.cyan;\n\n parts.push(`${valueColor}${formatted}${RESET} ${colors.dim}${label}${RESET}`);\n }\n\n // Join with dividers\n const line = parts.join(` ${colors.dim}|${RESET} `);\n lines.push(` ${line}`);\n\n return lines;\n}\n\n/**\n * Render summary as a boxed card\n */\nexport function renderSummaryBox(\n view: ViewDefinition,\n data: QueryResult,\n metricDefs: MetricDefinition[]\n): string[] {\n const lines: string[] = [];\n const row = data.rows[0] || {};\n\n if (view.title) {\n lines.push(` ${bold}${view.title}${RESET}`);\n lines.push('');\n }\n\n // Render each metric on its own line\n for (const metricName of view.metrics || []) {\n const def = metricDefs.find(m => m.name === metricName);\n if (!def) continue;\n\n const value = row[metricName];\n const formatted = formatValue(value, def.format);\n const label = def.label || metricName;\n\n const valueColor = def.format === 'currency' ? colors.green :\n def.format === 'percent' ? colors.purple :\n colors.cyan;\n\n lines.push(` ${colors.dim}${label.padEnd(16)}${RESET} ${valueColor}${formatted}${RESET}`);\n }\n\n return lines;\n}\n","/**\n * Table Renderer\n * Renders data in a tabular format with borders\n */\n\nimport type { ViewDefinition, MetricDefinition, DimensionDefinition, QueryResult } from '../types.js';\nimport { colors, bold, RESET, box, padEnd, formatValue, calculateColumnWidths } from './base.js';\n\nexport function renderTable(\n view: ViewDefinition,\n data: QueryResult,\n metricDefs: MetricDefinition[],\n dimensionDefs: DimensionDefinition[]\n): string[] {\n const lines: string[] = [];\n\n if (data.rows.length === 0) {\n lines.push(` ${colors.dim}No data${RESET}`);\n return lines;\n }\n\n // Build column definitions\n const columns: { field: string; label: string; format?: string; width: number }[] = [];\n\n // Add group by columns first (dimensions)\n if (view.group_by) {\n for (const dimName of view.group_by) {\n const def = dimensionDefs.find(d => d.name === dimName);\n columns.push({\n field: dimName,\n label: def?.label || dimName,\n format: undefined,\n width: 0, // Will calculate\n });\n }\n }\n\n // Add metric columns\n if (view.metrics) {\n for (const metricName of view.metrics) {\n const def = metricDefs.find(m => m.name === metricName);\n columns.push({\n field: metricName,\n label: def?.label || metricName,\n format: def?.format,\n width: 0,\n });\n }\n }\n\n // Use explicit columns if provided\n if (view.columns && view.columns.length > 0) {\n columns.length = 0;\n for (const col of view.columns) {\n columns.push({\n field: col.field,\n label: col.label || col.field,\n format: col.format,\n width: 0,\n });\n }\n }\n\n // Calculate widths\n const widths = calculateColumnWidths(data.rows, columns, 70);\n columns.forEach((col, i) => col.width = widths[i]);\n\n // Calculate table width\n const tableWidth = columns.reduce((sum, col) => sum + col.width, 0) + columns.length + 1;\n\n // Title\n if (view.title) {\n lines.push(` ${bold}${view.title}${RESET}`);\n lines.push('');\n }\n\n // Top border\n lines.push(` ${colors.purple}${box.topLeft}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.topRight}${RESET}`);\n\n // Header row\n let headerRow = ` ${colors.purple}${box.vertical}${RESET}`;\n for (const col of columns) {\n headerRow += ` ${bold}${padEnd(col.label.toUpperCase(), col.width - 1)}${RESET}`;\n }\n headerRow += `${colors.purple}${box.vertical}${RESET}`;\n lines.push(headerRow);\n\n // Header divider\n lines.push(` ${colors.purple}${box.teeRight}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.teeLeft}${RESET}`);\n\n // Data rows\n for (const row of data.rows) {\n let rowStr = ` ${colors.purple}${box.vertical}${RESET}`;\n for (const col of columns) {\n const value = row[col.field];\n const formatted = formatValue(value, col.format || 'string', col.width - 3);\n\n // Strip ANSI for padding calculation\n const visibleLen = formatted.replace(/\\x1b\\[[0-9;]*m/g, '').length;\n const padding = Math.max(0, col.width - 1 - visibleLen);\n\n rowStr += ` ${formatted}${' '.repeat(padding)}`;\n }\n rowStr += `${colors.purple}${box.vertical}${RESET}`;\n lines.push(rowStr);\n }\n\n // Bottom border\n lines.push(` ${colors.purple}${box.bottomLeft}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.bottomRight}${RESET}`);\n\n return lines;\n}\n\n/**\n * Render a simple table without borders\n */\nexport function renderSimpleTable(\n view: ViewDefinition,\n data: QueryResult,\n metricDefs: MetricDefinition[],\n dimensionDefs: DimensionDefinition[]\n): string[] {\n const lines: string[] = [];\n\n if (data.rows.length === 0) {\n lines.push(` ${colors.dim}No data${RESET}`);\n return lines;\n }\n\n // Build columns\n const columns: { field: string; label: string; format?: string }[] = [];\n\n if (view.group_by) {\n for (const dimName of view.group_by) {\n const def = dimensionDefs.find(d => d.name === dimName);\n columns.push({ field: dimName, label: def?.label || dimName });\n }\n }\n\n if (view.metrics) {\n for (const metricName of view.metrics) {\n const def = metricDefs.find(m => m.name === metricName);\n columns.push({ field: metricName, label: def?.label || metricName, format: def?.format });\n }\n }\n\n // Calculate widths\n const widths = calculateColumnWidths(data.rows, columns, 70);\n\n // Title\n if (view.title) {\n lines.push(` ${bold}${view.title}${RESET}`);\n lines.push('');\n }\n\n // Header\n let header = ' ';\n for (let i = 0; i < columns.length; i++) {\n header += `${colors.dim}${padEnd(columns[i].label.toUpperCase(), widths[i])}${RESET}`;\n }\n lines.push(header);\n\n // Data rows\n for (const row of data.rows) {\n let rowStr = ' ';\n for (let i = 0; i < columns.length; i++) {\n const col = columns[i];\n const value = row[col.field];\n const formatted = formatValue(value, col.format || 'string', widths[i] - 2);\n\n const visibleLen = formatted.replace(/\\x1b\\[[0-9;]*m/g, '').length;\n const padding = Math.max(0, widths[i] - visibleLen);\n\n rowStr += `${formatted}${' '.repeat(padding)}`;\n }\n lines.push(rowStr);\n }\n\n return lines;\n}\n","/**\n * Trend Renderer\n * Renders time-series data as sparklines\n */\n\nimport type { ViewDefinition, MetricDefinition, QueryResult } from '../types.js';\nimport { colors, bold, RESET, formatValue, sparkline } from './base.js';\n\nexport function renderTrend(\n view: ViewDefinition,\n data: QueryResult,\n metricDefs: MetricDefinition[]\n): string[] {\n const lines: string[] = [];\n\n if (data.rows.length === 0) {\n lines.push(` ${colors.dim}No data${RESET}`);\n return lines;\n }\n\n // Title\n if (view.title) {\n lines.push(` ${bold}${view.title}${RESET}`);\n lines.push('');\n }\n\n // Render each metric as a sparkline\n for (const metricName of view.metrics || []) {\n const def = metricDefs.find(m => m.name === metricName);\n if (!def) continue;\n\n // Extract values for sparkline (reversed if data is desc order)\n const values = data.rows.map(row => {\n const val = row[metricName];\n return typeof val === 'number' ? val : parseFloat(String(val)) || 0;\n });\n\n // Reverse if needed (assume data comes newest first)\n const orderedValues = [...values].reverse();\n\n // Calculate summary stats\n const total = orderedValues.reduce((sum, v) => sum + v, 0);\n const avg = orderedValues.length > 0 ? total / orderedValues.length : 0;\n const latest = orderedValues[orderedValues.length - 1] || 0;\n const previous = orderedValues[orderedValues.length - 2] || 0;\n const change = previous > 0 ? ((latest - previous) / previous) * 100 : 0;\n\n // Render sparkline\n const spark = sparkline(orderedValues);\n\n // Format the summary\n const label = def.label || metricName;\n const totalFormatted = formatValue(total, def.format);\n const avgFormatted = formatValue(avg, def.format);\n\n // Change indicator\n const changeColor = change > 0 ? colors.green : change < 0 ? colors.red : colors.dim;\n const changeSign = change > 0 ? '+' : '';\n const changeStr = `${changeColor}${changeSign}${change.toFixed(0)}%${RESET}`;\n\n lines.push(` ${colors.dim}${label}:${RESET} ${spark} ${colors.cyan}${totalFormatted}${RESET} total ${colors.dim}(avg ${avgFormatted})${RESET} ${changeStr}`);\n }\n\n return lines;\n}\n\n/**\n * Render stacked trend (multiple metrics on same chart)\n */\nexport function renderStackedTrend(\n view: ViewDefinition,\n data: QueryResult,\n metricDefs: MetricDefinition[]\n): string[] {\n const lines: string[] = [];\n\n if (data.rows.length === 0) {\n lines.push(` ${colors.dim}No data${RESET}`);\n return lines;\n }\n\n // Title\n if (view.title) {\n lines.push(` ${bold}${view.title}${RESET}`);\n lines.push('');\n }\n\n // Build combined sparkline (showing first metric for the visual)\n const primaryMetric = view.metrics?.[0];\n if (primaryMetric) {\n const values = data.rows.map(row => {\n const val = row[primaryMetric];\n return typeof val === 'number' ? val : parseFloat(String(val)) || 0;\n }).reverse();\n\n const spark = sparkline(values);\n lines.push(` ${spark}`);\n lines.push('');\n }\n\n // Show legend with totals\n const legendParts: string[] = [];\n for (const metricName of view.metrics || []) {\n const def = metricDefs.find(m => m.name === metricName);\n if (!def) continue;\n\n const total = data.rows.reduce((sum, row) => {\n const val = row[metricName];\n return sum + (typeof val === 'number' ? val : parseFloat(String(val)) || 0);\n }, 0);\n\n const label = def.label || metricName;\n const formatted = formatValue(total, def.format);\n\n // Color code by metric position\n const metricColor = metricName === view.metrics?.[0] ? colors.green :\n metricName === view.metrics?.[1] ? colors.yellow :\n colors.red;\n\n legendParts.push(`${metricColor}${formatted}${RESET} ${colors.dim}${label}${RESET}`);\n }\n\n lines.push(` ${legendParts.join(' ')}`);\n\n return lines;\n}\n","/**\n * Bar Chart Renderer\n * Renders horizontal bar charts\n */\n\nimport type { ViewDefinition, MetricDefinition, DimensionDefinition, QueryResult } from '../types.js';\nimport { colors, bold, RESET, padEnd, formatValue, barChart } from './base.js';\n\nexport function renderBar(\n view: ViewDefinition,\n data: QueryResult,\n metricDefs: MetricDefinition[],\n _dimensionDefs: DimensionDefinition[]\n): string[] {\n const lines: string[] = [];\n\n if (data.rows.length === 0) {\n lines.push(` ${colors.dim}No data${RESET}`);\n return lines;\n }\n\n // Title\n if (view.title) {\n lines.push(` ${bold}${view.title}${RESET}`);\n lines.push('');\n }\n\n // Get the primary dimension and metric\n const dimName = view.group_by?.[0];\n const metricName = view.metrics?.[0];\n\n if (!dimName || !metricName) {\n lines.push(` ${colors.dim}Bar chart requires group_by and metrics${RESET}`);\n return lines;\n }\n\n const metricDef = metricDefs.find(m => m.name === metricName);\n\n // Find max value for scaling\n const values = data.rows.map(row => {\n const val = row[metricName];\n return typeof val === 'number' ? val : parseFloat(String(val)) || 0;\n });\n const maxValue = Math.max(...values, 1);\n\n // Calculate label width\n const labels = data.rows.map(row => String(row[dimName] || 'Unknown'));\n const maxLabelWidth = Math.min(Math.max(...labels.map(l => l.length)), 20);\n\n // Render bars\n for (const row of data.rows) {\n const label = String(row[dimName] || 'Unknown');\n const value = row[metricName];\n const numValue = typeof value === 'number' ? value : parseFloat(String(value)) || 0;\n\n const bar = barChart(numValue, maxValue, 20);\n const formatted = formatValue(value, metricDef?.format || 'number');\n\n lines.push(` ${colors.cyan}${padEnd(label.slice(0, maxLabelWidth), maxLabelWidth + 1)}${RESET}${bar} ${colors.dim}${formatted}${RESET}`);\n }\n\n return lines;\n}\n\n/**\n * Render a pie chart as a horizontal distribution\n */\nexport function renderPie(\n view: ViewDefinition,\n data: QueryResult,\n _metricDefs: MetricDefinition[],\n _dimensionDefs: DimensionDefinition[]\n): string[] {\n const lines: string[] = [];\n\n if (data.rows.length === 0) {\n lines.push(` ${colors.dim}No data${RESET}`);\n return lines;\n }\n\n // Title\n if (view.title) {\n lines.push(` ${bold}${view.title}${RESET}`);\n lines.push('');\n }\n\n // Get dimension and metric\n const dimName = view.group_by?.[0];\n const metricName = view.metrics?.[0];\n\n if (!dimName || !metricName) {\n lines.push(` ${colors.dim}Pie chart requires group_by and metrics${RESET}`);\n return lines;\n }\n\n // Calculate total and percentages\n const values = data.rows.map(row => {\n const val = row[metricName];\n return {\n label: String(row[dimName] || 'Unknown'),\n value: typeof val === 'number' ? val : parseFloat(String(val)) || 0,\n };\n });\n\n const total = values.reduce((sum, v) => sum + v.value, 0);\n if (total === 0) {\n lines.push(` ${colors.dim}No data${RESET}`);\n return lines;\n }\n\n // Color palette\n const colorPalette = [colors.cyan, colors.green, colors.yellow, colors.purple, colors.red];\n\n // Render horizontal bar showing distribution\n const barWidth = 40;\n let barStr = '';\n let pos = 0;\n\n for (let i = 0; i < values.length; i++) {\n const pct = values[i].value / total;\n const width = Math.max(1, Math.round(pct * barWidth));\n const color = colorPalette[i % colorPalette.length];\n barStr += `${color}${'█'.repeat(width)}${RESET}`;\n pos += width;\n }\n\n // Pad to full width if needed\n if (pos < barWidth) {\n barStr += `${colors.dim}${'░'.repeat(barWidth - pos)}${RESET}`;\n }\n\n lines.push(` ${barStr}`);\n lines.push('');\n\n // Legend\n for (let i = 0; i < values.length; i++) {\n const v = values[i];\n const pct = (v.value / total) * 100;\n const color = colorPalette[i % colorPalette.length];\n\n lines.push(` ${color}■${RESET} ${padEnd(v.label.slice(0, 15), 16)} ${color}${pct.toFixed(1)}%${RESET} ${colors.dim}(${v.value.toLocaleString()})${RESET}`);\n }\n\n return lines;\n}\n","/**\n * List Renderer\n * Renders data as a list of items\n */\n\nimport type { ViewDefinition, QueryResult, ColumnDefinition } from '../types.js';\nimport { colors, bold, RESET, formatValue } from './base.js';\n\nexport function renderList(\n view: ViewDefinition,\n data: QueryResult\n): string[] {\n const lines: string[] = [];\n\n if (data.rows.length === 0) {\n lines.push(` ${colors.dim}No data${RESET}`);\n return lines;\n }\n\n // Title\n if (view.title) {\n lines.push(` ${bold}${view.title}${RESET}`);\n lines.push('');\n }\n\n // Get columns from view definition or infer from data\n const columns: ColumnDefinition[] = view.columns || data.columns.map(c => ({ field: c }));\n\n // Render each row\n for (const row of data.rows) {\n const parts: string[] = [];\n\n for (const col of columns) {\n const value = row[col.field];\n let formatted = formatValue(value, col.format || 'string', col.truncate);\n\n // Apply label if this is the first column and we have a label defined\n if (col.label) {\n formatted = `${colors.dim}${col.label}:${RESET} ${formatted}`;\n }\n\n parts.push(formatted);\n }\n\n // Join with spacing\n lines.push(` ${parts.join(' ')}`);\n }\n\n return lines;\n}\n\n/**\n * Render list with detailed multi-line items\n */\nexport function renderDetailedList(\n view: ViewDefinition,\n data: QueryResult\n): string[] {\n const lines: string[] = [];\n\n if (data.rows.length === 0) {\n lines.push(` ${colors.dim}No data${RESET}`);\n return lines;\n }\n\n // Title\n if (view.title) {\n lines.push(` ${bold}${view.title}${RESET}`);\n lines.push('');\n }\n\n const columns: ColumnDefinition[] = view.columns || data.columns.map(c => ({ field: c }));\n\n // Render each row as a multi-line block\n for (let i = 0; i < data.rows.length; i++) {\n const row = data.rows[i];\n\n // First column as header\n if (columns.length > 0) {\n const mainCol = columns[0];\n const mainValue = formatValue(row[mainCol.field], mainCol.format || 'string');\n lines.push(` ${colors.cyan}${mainValue}${RESET}`);\n }\n\n // Remaining columns as details\n for (let j = 1; j < columns.length; j++) {\n const col = columns[j];\n const value = formatValue(row[col.field], col.format || 'string', col.truncate || 50);\n const label = col.label || col.field;\n lines.push(` ${colors.dim}${label}:${RESET} ${value}`);\n }\n\n // Add spacing between items\n if (i < data.rows.length - 1) {\n lines.push('');\n }\n }\n\n return lines;\n}\n\n/**\n * Render recent items with time-based header\n */\nexport function renderRecentList(\n view: ViewDefinition,\n data: QueryResult\n): string[] {\n const lines: string[] = [];\n\n if (data.rows.length === 0) {\n lines.push(` ${colors.dim}No recent items${RESET}`);\n return lines;\n }\n\n // Title\n if (view.title) {\n lines.push(` ${bold}${view.title}${RESET}`);\n lines.push('');\n }\n\n const columns = view.columns || [];\n\n // Find time column\n const timeCol = columns.find(c => c.format === 'relative_time' || c.field.includes('_at'));\n\n // Render each row\n for (const row of data.rows) {\n const parts: string[] = [];\n\n // Time first if present\n if (timeCol) {\n const timeVal = formatValue(row[timeCol.field], 'relative_time');\n parts.push(`${colors.dim}${timeVal}${RESET}`);\n }\n\n // Other columns\n for (const col of columns) {\n if (col === timeCol) continue;\n\n const value = row[col.field];\n const formatted = formatValue(value, col.format || 'string', col.truncate);\n parts.push(formatted);\n }\n\n lines.push(` ${parts.join(' ')}`);\n }\n\n return lines;\n}\n","/**\n * Renderer Index\n * Exports all renderers and provides a unified render function\n */\n\nimport type { ViewDefinition, MetricDefinition, DimensionDefinition, QueryResult } from '../types.js';\nimport { renderSummary } from './summary.js';\nimport { renderTable } from './table.js';\nimport { renderTrend, renderStackedTrend } from './trend.js';\nimport { renderBar, renderPie } from './bar.js';\nimport { renderList, renderRecentList } from './list.js';\nimport { colors, RESET } from './base.js';\n\nexport * from './base.js';\n\n/**\n * Render a view based on its type\n */\nexport function renderView(\n view: ViewDefinition,\n data: QueryResult,\n metricDefs: MetricDefinition[],\n dimensionDefs: DimensionDefinition[]\n): string[] {\n switch (view.type) {\n case 'summary':\n return renderSummary(view, data, metricDefs);\n\n case 'table':\n return renderTable(view, data, metricDefs, dimensionDefs);\n\n case 'trend':\n if (view.stacked) {\n return renderStackedTrend(view, data, metricDefs);\n }\n return renderTrend(view, data, metricDefs);\n\n case 'bar':\n return renderBar(view, data, metricDefs, dimensionDefs);\n\n case 'pie':\n return renderPie(view, data, metricDefs, dimensionDefs);\n\n case 'list': {\n // Detect if this looks like a recent items list\n const hasTimeCol = view.columns?.some(c =>\n c.format === 'relative_time' || c.field.includes('_at')\n );\n if (hasTimeCol) {\n return renderRecentList(view, data);\n }\n return renderList(view, data);\n }\n\n case 'histogram':\n // TODO: Implement histogram\n return [` ${colors.dim}Histogram not yet implemented${RESET}`];\n\n case 'heatmap':\n // TODO: Implement heatmap\n return [` ${colors.dim}Heatmap not yet implemented${RESET}`];\n\n default:\n return [` ${colors.dim}Unknown view type: ${view.type}${RESET}`];\n }\n}\n","/**\n * Dashboard Engine\n * Orchestrates loading definitions, fetching data, and rendering views\n */\n\nimport type {\n DashboardDefinition,\n ViewDefinition,\n QueryResult,\n AppliedFilters,\n DataSource,\n} from './types.js';\nimport { loadDashboard, listDashboards, findDashboard } from './loader.js';\nimport { postgresSource, buildQuery, buildWhereClause, parseDateRange } from './sources/postgres.js';\nimport { renderView, writeLine, colors, RESET, gradient } from './renderers/index.js';\n\nexport { loadDashboard, listDashboards, findDashboard } from './loader.js';\nexport * from './types.js';\n\n/**\n * Get the appropriate data source for a dashboard\n */\nfunction getDataSource(sourceName: string): DataSource | null {\n switch (sourceName) {\n case 'postgres':\n return postgresSource;\n // TODO: Add other sources\n case 'sessions':\n case 'langfuse':\n case 'api':\n return null;\n default:\n return null;\n }\n}\n\n/**\n * Execute a dashboard and return rendered output\n */\nexport async function executeDashboard(\n name: string,\n options: {\n filters?: AppliedFilters;\n views?: string[]; // Specific views to render (default: all)\n verbose?: boolean;\n } = {}\n): Promise<{ success: boolean; lines: string[] }> {\n const lines: string[] = [];\n\n // Load definition\n const def = findDashboard(name);\n if (!def) {\n return {\n success: false,\n lines: [`${colors.red}Dashboard not found: ${name}${RESET}`],\n };\n }\n\n // Get data source\n const source = getDataSource(def.source);\n if (!source) {\n return {\n success: false,\n lines: [`${colors.red}Data source not available: ${def.source}${RESET}`],\n };\n }\n\n // Check availability\n const available = await source.isAvailable();\n if (!available) {\n return {\n success: false,\n lines: [`${colors.red}Cannot connect to ${def.source}${RESET}`],\n };\n }\n\n // Apply default filters\n const filters = { ...options.filters };\n for (const filterDef of def.filters || []) {\n if (filters[filterDef.name] === undefined && filterDef.default) {\n if (filterDef.type === 'date_range') {\n filters[filterDef.name] = parseDateRange(filterDef.default as string);\n } else {\n filters[filterDef.name] = filterDef.default;\n }\n }\n }\n\n // Header\n lines.push('');\n lines.push(` ${gradient('squads')} ${colors.dim}${def.title}${RESET}`);\n if (def.description && options.verbose) {\n lines.push(` ${colors.dim}${def.description}${RESET}`);\n }\n lines.push('');\n\n // Determine which views to render\n const viewsToRender = options.views\n ? def.views.filter(v => options.views!.includes(v.id))\n : def.views;\n\n // Execute each view\n for (const view of viewsToRender) {\n try {\n const data = await fetchViewData(def, view, filters, source);\n const viewLines = renderView(view, data, def.metrics, def.dimensions || []);\n lines.push(...viewLines);\n lines.push('');\n } catch (err) {\n if (options.verbose) {\n lines.push(` ${colors.red}Error rendering ${view.id}: ${err}${RESET}`);\n }\n }\n }\n\n // Cleanup\n await source.close();\n\n return { success: true, lines };\n}\n\n/**\n * Fetch data for a specific view\n */\nasync function fetchViewData(\n def: DashboardDefinition,\n view: ViewDefinition,\n filters: AppliedFilters,\n source: DataSource\n): Promise<QueryResult> {\n // If view has custom source SQL, use it directly\n if (view.source) {\n return source.query(view.source);\n }\n\n // Build query from definition\n if (!def.table) {\n throw new Error('Dashboard requires table or view.source');\n }\n\n // Get metrics for this view\n const metrics = (view.metrics || []).map(name => {\n const m = def.metrics.find(m => m.name === name);\n if (!m) throw new Error(`Unknown metric: ${name}`);\n return m;\n });\n\n // Build WHERE clause\n const filterDefs = def.filters || [];\n let where = buildWhereClause(filters, filterDefs);\n\n // Add view-specific filter\n if (view.filter) {\n where = where ? `(${where}) AND (${view.filter})` : view.filter;\n }\n\n // Build and execute query\n const sql = buildQuery(\n def.table,\n metrics,\n view.group_by,\n where ?? undefined,\n view.sort,\n view.limit\n );\n\n return source.query(sql);\n}\n\n/**\n * Render a dashboard to the terminal\n */\nexport async function renderDashboard(\n name: string,\n options: {\n filters?: AppliedFilters;\n views?: string[];\n verbose?: boolean;\n } = {}\n): Promise<boolean> {\n const result = await executeDashboard(name, options);\n\n for (const line of result.lines) {\n writeLine(line);\n }\n\n return result.success;\n}\n\n/**\n * List all available dashboards with descriptions\n */\nexport function showAvailableDashboards(): void {\n const names = listDashboards();\n\n writeLine();\n writeLine(` ${gradient('squads')} ${colors.dim}dashboards${RESET}`);\n writeLine();\n\n if (names.length === 0) {\n writeLine(` ${colors.dim}No dashboards found${RESET}`);\n writeLine(` ${colors.dim}Create dashboards in .agents/dashboards/*.yaml${RESET}`);\n writeLine();\n return;\n }\n\n for (const name of names) {\n const def = loadDashboard(name);\n if (def) {\n writeLine(` ${colors.cyan}${name.padEnd(16)}${RESET} ${colors.dim}${def.title}${RESET}`);\n }\n }\n\n writeLine();\n writeLine(` ${colors.dim}Usage:${RESET} squads dash ${colors.cyan}<dashboard>${RESET}`);\n writeLine(` ${colors.dim} squads dash ${colors.cyan}<dashboard>${RESET} ${colors.dim}--view=<view-id>${RESET}`);\n writeLine();\n}\n\n/**\n * Interactive dashboard with filter support\n */\nexport async function interactiveDashboard(\n name: string,\n initialFilters?: AppliedFilters\n): Promise<void> {\n // For now, just render the dashboard\n // TODO: Add interactive filter selection\n await renderDashboard(name, { filters: initialFilters });\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 || '';\nconst CALLBACK_PORT = 54321;\n\nasync function isAuthEndpointAvailable(): Promise<boolean> {\n try {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), 3000);\n const response = await fetch(AUTH_URL, {\n method: 'HEAD',\n signal: controller.signal,\n });\n clearTimeout(timeout);\n return response.ok || response.status < 500;\n } catch {\n return false;\n }\n}\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 // Check if auth endpoint is available\n const spinner = ora('Checking authentication service...').start();\n const isAvailable = await isAuthEndpointAvailable();\n\n if (!isAvailable) {\n spinner.stop();\n spinner.clear();\n console.log(`\n${chalk.bold.cyan('Pro & Enterprise Login')} ${chalk.yellow('(Coming Soon)')}\n${chalk.dim('─'.repeat(40))}\n\nAuthentication is coming soon for Pro & Enterprise teams.\n\n${chalk.bold('In the meantime:')}\n ${chalk.dim('→')} Explore the CLI: ${chalk.cyan('squads status')}\n ${chalk.dim('→')} Run agents: ${chalk.cyan('squads run <squad>')}\n ${chalk.dim('→')} Join waitlist: ${chalk.cyan('https://agents-squads.com/waitlist')}\n\n${chalk.dim('Questions?')} ${chalk.cyan('hello@agents-squads.com')}\n`);\n await track('cli.login.unavailable');\n return;\n }\n\n spinner.text = 'Opening browser to authenticate...';\n spinner.succeed();\n\n console.log(`\n${chalk.bold.magenta('Squads CLI Login')}\n${chalk.dim('─'.repeat(40))}\n`);\n\n const authSpinner = 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 authSpinner.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 authSpinner.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 authSpinner.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 { existsSync, readFileSync, writeFileSync, mkdirSync, unlinkSync } from 'fs';\nimport { join } from 'path';\nimport { homedir } from 'os';\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, mode: 0o700 });\n }\n writeFileSync(AUTH_PATH, JSON.stringify(session, null, 2), { mode: 0o600 });\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 try {\n if (existsSync(AUTH_PATH)) {\n unlinkSync(AUTH_PATH);\n }\n } catch {\n // File already removed or inaccessible\n }\n}\n\nexport function isLoggedIn(): boolean {\n const session = loadSession();\n return session !== null && session.status === 'active';\n}\n\n// Escape HTML special characters to prevent XSS\nfunction escapeHtml(str: string): string {\n return str\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&#039;');\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;\">Authentication failed: ${escapeHtml(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, ${escapeHtml(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 refreshVersionCache,\n performUpdate,\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 '../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 { 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} 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 writeLine(`${colors.dim}Run \\`squads init\\` to create one.${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","/**\n * squads history - Show recent agent execution history\n *\n * Sources:\n * 1. PostgreSQL traces table (via bridge)\n * 2. Local session history (.agents/sessions/history.jsonl)\n */\n\nimport { existsSync, readFileSync } from 'fs';\nimport { join } from 'path';\nimport {\n colors,\n bold,\n RESET,\n gradient,\n padEnd,\n truncate,\n icons,\n writeLine,\n} from '../lib/terminal.js';\n\nconst BRIDGE_URL = process.env.SQUADS_BRIDGE_URL || 'http://localhost:8088';\nconst FETCH_TIMEOUT_MS = 3000;\n\ninterface Execution {\n id: string;\n squad: string;\n agent: string;\n startedAt: Date;\n endedAt?: Date;\n durationMs?: number;\n status: 'success' | 'error' | 'running';\n cost?: number;\n tokens?: number;\n error?: string;\n}\n\ninterface HistoryOptions {\n days?: number;\n squad?: string;\n verbose?: boolean;\n json?: boolean;\n}\n\n/**\n * Fetch with timeout to prevent hanging\n */\nasync function fetchWithTimeout(url: string, 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, { signal: controller.signal });\n clearTimeout(timeoutId);\n return response;\n } catch {\n clearTimeout(timeoutId);\n throw new Error('Request timed out');\n }\n}\n\n/**\n * Fetch executions from bridge/postgres\n */\nasync function fetchFromBridge(days: number, squad?: string): Promise<Execution[]> {\n try {\n const params = new URLSearchParams({\n days: String(days),\n ...(squad && { squad }),\n });\n\n const response = await fetchWithTimeout(`${BRIDGE_URL}/api/executions?${params}`);\n\n if (!response.ok) {\n return [];\n }\n\n interface BridgeExecution {\n id?: string;\n squad?: string;\n agent?: string;\n started_at?: string;\n ended_at?: string;\n duration_ms?: number;\n status?: string;\n cost_usd?: number;\n total_tokens?: number;\n error?: string;\n }\n\n const data = await response.json() as { executions?: BridgeExecution[] };\n return (data.executions || []).map((e: BridgeExecution) => ({\n id: e.id || '',\n squad: e.squad || 'unknown',\n agent: e.agent || 'unknown',\n startedAt: new Date(e.started_at || Date.now()),\n endedAt: e.ended_at ? new Date(e.ended_at) : undefined,\n durationMs: e.duration_ms,\n status: (e.status as Execution['status']) || 'success',\n cost: e.cost_usd,\n tokens: e.total_tokens,\n error: e.error,\n }));\n } catch {\n return [];\n }\n}\n\n/**\n * Fetch executions from local session history\n */\nfunction fetchFromLocal(days: number, squad?: string): Execution[] {\n const executions: Execution[] = [];\n\n // Try multiple possible locations\n const historyPaths = [\n join(process.cwd(), '.agents/sessions/history.jsonl'),\n join(process.env.HOME || '', 'agents-squads/hq/.agents/sessions/history.jsonl'),\n ];\n\n let historyPath: string | undefined;\n for (const path of historyPaths) {\n if (existsSync(path)) {\n historyPath = path;\n break;\n }\n }\n\n if (!historyPath) {\n return [];\n }\n\n try {\n const content = readFileSync(historyPath, 'utf-8');\n const lines = content.trim().split('\\n').filter(Boolean);\n const cutoff = Date.now() - days * 24 * 60 * 60 * 1000;\n\n interface SessionEvent {\n type?: string;\n timestamp?: string;\n squad?: string;\n agent?: string;\n sessionId?: string;\n duration?: number;\n status?: string;\n cost?: number;\n tokens?: number;\n }\n\n for (const line of lines) {\n try {\n const event = JSON.parse(line) as SessionEvent;\n const timestamp = new Date(event.timestamp || 0);\n\n if (timestamp.getTime() < cutoff) continue;\n if (squad && event.squad !== squad) continue;\n\n // Convert session events to executions\n if (event.type === 'session_end' || event.type === 'agent_complete') {\n executions.push({\n id: event.sessionId || `local-${Date.now()}`,\n squad: event.squad || 'unknown',\n agent: event.agent || 'unknown',\n startedAt: timestamp,\n durationMs: event.duration,\n status: event.status === 'error' ? 'error' : 'success',\n cost: event.cost,\n tokens: event.tokens,\n });\n }\n } catch {\n // Skip invalid lines\n }\n }\n } catch {\n // File read error\n }\n\n return executions;\n}\n\n/**\n * Format duration in human-readable form\n */\nfunction formatDuration(ms?: number): string {\n if (!ms) return '—';\n\n const seconds = Math.floor(ms / 1000);\n if (seconds < 60) return `${seconds}s`;\n\n const minutes = Math.floor(seconds / 60);\n const remainingSeconds = seconds % 60;\n if (minutes < 60) return `${minutes}m ${remainingSeconds}s`;\n\n const hours = Math.floor(minutes / 60);\n const remainingMinutes = minutes % 60;\n return `${hours}h ${remainingMinutes}m`;\n}\n\n/**\n * Group executions by date\n */\nfunction groupByDate(executions: Execution[]): Map<string, Execution[]> {\n const groups = new Map<string, Execution[]>();\n\n for (const exec of executions) {\n const dateKey = exec.startedAt.toISOString().split('T')[0];\n if (!groups.has(dateKey)) {\n groups.set(dateKey, []);\n }\n groups.get(dateKey)!.push(exec);\n }\n\n return groups;\n}\n\n/**\n * Format date for display\n */\nfunction formatDateHeader(dateStr: string): string {\n const date = new Date(dateStr);\n const today = new Date();\n const yesterday = new Date(today);\n yesterday.setDate(yesterday.getDate() - 1);\n\n if (dateStr === today.toISOString().split('T')[0]) {\n return `Today (${date.toLocaleDateString('en-US', { month: 'short', day: 'numeric' })})`;\n }\n if (dateStr === yesterday.toISOString().split('T')[0]) {\n return `Yesterday (${date.toLocaleDateString('en-US', { month: 'short', day: 'numeric' })})`;\n }\n return date.toLocaleDateString('en-US', { weekday: 'short', month: 'short', day: 'numeric' });\n}\n\nexport async function historyCommand(options: HistoryOptions = {}): Promise<void> {\n const days = options.days || 7;\n const squad = options.squad;\n const verbose = options.verbose || false;\n const jsonOutput = options.json || false;\n\n writeLine();\n writeLine(` ${gradient('squads')} ${colors.dim}history${RESET}`);\n writeLine();\n\n // Fetch from both sources\n const [bridgeExecs, localExecs] = await Promise.all([\n fetchFromBridge(days, squad),\n Promise.resolve(fetchFromLocal(days, squad)),\n ]);\n\n // Merge and deduplicate (prefer bridge data)\n const seenIds = new Set<string>();\n const allExecutions: Execution[] = [];\n\n for (const exec of bridgeExecs) {\n seenIds.add(exec.id);\n allExecutions.push(exec);\n }\n\n for (const exec of localExecs) {\n if (!seenIds.has(exec.id)) {\n allExecutions.push(exec);\n }\n }\n\n // Sort by start time descending\n allExecutions.sort((a, b) => b.startedAt.getTime() - a.startedAt.getTime());\n\n if (jsonOutput) {\n console.log(JSON.stringify(allExecutions, null, 2));\n return;\n }\n\n if (allExecutions.length === 0) {\n writeLine(` ${colors.dim}No executions found in the last ${days} day(s)${RESET}`);\n writeLine();\n writeLine(` ${colors.dim}Tip: Run agents with 'squads run <squad>' to see history${RESET}`);\n writeLine();\n return;\n }\n\n // Group by date\n const grouped = groupByDate(allExecutions);\n\n // Display\n const source = bridgeExecs.length > 0 ? 'postgres' : 'local';\n writeLine(` ${colors.dim}${allExecutions.length} executions (last ${days}d, source: ${source})${RESET}`);\n writeLine();\n\n for (const [dateStr, execs] of grouped) {\n writeLine(` ${bold}${formatDateHeader(dateStr)}${RESET}`);\n\n // Table header\n writeLine(` ${colors.purple}┌${'─'.repeat(60)}┐${RESET}`);\n writeLine(` ${colors.purple}│${RESET} ${padEnd('TIME', 7)}${padEnd('SQUAD', 13)}${padEnd('AGENT', 16)}${padEnd('DURATION', 10)}${padEnd('STATUS', 8)}${colors.purple}│${RESET}`);\n writeLine(` ${colors.purple}├${'─'.repeat(60)}┤${RESET}`);\n\n for (const exec of execs) {\n const time = exec.startedAt.toLocaleTimeString('en-US', { hour: '2-digit', minute: '2-digit', hour12: false });\n const squadName = truncate(exec.squad, 11);\n const agentName = truncate(exec.agent, 14);\n const duration = formatDuration(exec.durationMs);\n\n let statusIcon: string;\n let statusColor: string;\n switch (exec.status) {\n case 'success':\n statusIcon = icons.success;\n statusColor = colors.green;\n break;\n case 'error':\n statusIcon = icons.error;\n statusColor = colors.red;\n break;\n case 'running':\n statusIcon = icons.progress;\n statusColor = colors.cyan;\n break;\n default:\n statusIcon = icons.empty;\n statusColor = colors.dim;\n }\n\n writeLine(` ${colors.purple}│${RESET} ${colors.dim}${time}${RESET} ${colors.cyan}${padEnd(squadName, 12)}${RESET}${padEnd(agentName, 16)}${padEnd(duration, 10)}${statusColor}${statusIcon}${RESET} ${colors.purple}│${RESET}`);\n\n // Verbose: show cost and tokens\n if (verbose && (exec.cost || exec.tokens)) {\n const costStr = exec.cost ? `$${exec.cost.toFixed(2)}` : '';\n const tokenStr = exec.tokens ? `${exec.tokens.toLocaleString()} tokens` : '';\n const details = [costStr, tokenStr].filter(Boolean).join(' │ ');\n writeLine(` ${colors.purple}│${RESET} ${colors.dim}└ ${details}${RESET}${' '.repeat(Math.max(0, 45 - details.length))}${colors.purple}│${RESET}`);\n }\n\n // Show error if present\n if (exec.error) {\n writeLine(` ${colors.purple}│${RESET} ${colors.red}└ ${truncate(exec.error, 45)}${RESET}${' '.repeat(Math.max(0, 45 - exec.error.length))}${colors.purple}│${RESET}`);\n }\n }\n\n writeLine(` ${colors.purple}└${'─'.repeat(60)}┘${RESET}`);\n writeLine();\n }\n\n // Summary\n const successCount = allExecutions.filter(e => e.status === 'success').length;\n const errorCount = allExecutions.filter(e => e.status === 'error').length;\n const totalCost = allExecutions.reduce((sum, e) => sum + (e.cost || 0), 0);\n\n writeLine(` ${colors.dim}Summary:${RESET} ${colors.green}${successCount} success${RESET} ${errorCount > 0 ? `${colors.red}${errorCount} errors${RESET} ` : ''}${totalCost > 0 ? `${colors.cyan}$${totalCost.toFixed(2)} total${RESET}` : ''}`);\n writeLine();\n}\n","/**\n * squads health - Quick infrastructure health check\n *\n * Lightweight check that doesn't require Docker - just pings endpoints\n */\n\nimport {\n colors,\n RESET,\n gradient,\n icons,\n writeLine,\n padEnd,\n} from '../lib/terminal.js';\n\nconst FETCH_TIMEOUT_MS = 2000;\n\ninterface ServiceCheck {\n name: string;\n url: string;\n optional?: boolean;\n fix?: string;\n}\n\ninterface ServiceResult {\n name: string;\n status: 'healthy' | 'down' | 'degraded';\n latencyMs?: number;\n error?: string;\n optional?: boolean;\n fix?: string;\n}\n\ninterface TriggerStats {\n active: number;\n disabled: number;\n lastFire?: {\n name: string;\n ago: string;\n };\n}\n\nconst SERVICES: ServiceCheck[] = [\n {\n name: 'PostgreSQL',\n url: `${process.env.SQUADS_BRIDGE_URL || 'http://localhost:8088'}/stats`,\n optional: true,\n fix: 'squads stack up postgres',\n },\n {\n name: 'Redis',\n url: `${process.env.SQUADS_BRIDGE_URL || 'http://localhost:8088'}/stats`,\n optional: true,\n fix: 'squads stack up redis',\n },\n {\n name: 'Bridge API',\n url: `${process.env.SQUADS_BRIDGE_URL || 'http://localhost:8088'}/health`,\n optional: true,\n fix: 'squads stack up bridge',\n },\n {\n name: 'Scheduler',\n url: `${process.env.SQUADS_API_URL || process.env.SQUADS_SCHEDULER_URL || 'http://localhost:8090'}/health`,\n optional: true,\n fix: 'squads stack up scheduler',\n },\n {\n name: 'Langfuse',\n url: `${process.env.LANGFUSE_HOST || 'http://localhost:3100'}/api/public/health`,\n optional: true,\n fix: 'squads stack up langfuse',\n },\n];\n\n/**\n * Fetch with timeout\n */\nasync function fetchWithTimeout(url: string, 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, { signal: controller.signal });\n clearTimeout(timeoutId);\n return response;\n } catch {\n clearTimeout(timeoutId);\n throw new Error('timeout');\n }\n}\n\n/**\n * Check a single service\n */\nasync function checkService(service: ServiceCheck): Promise<ServiceResult> {\n const start = Date.now();\n\n try {\n const response = await fetchWithTimeout(service.url);\n const latencyMs = Date.now() - start;\n\n if (response.ok) {\n return {\n name: service.name,\n status: 'healthy',\n latencyMs,\n optional: service.optional,\n };\n }\n\n return {\n name: service.name,\n status: 'degraded',\n latencyMs,\n error: `HTTP ${response.status}`,\n optional: service.optional,\n fix: service.fix,\n };\n } catch (error) {\n return {\n name: service.name,\n status: 'down',\n error: error instanceof Error ? error.message : 'unknown',\n optional: service.optional,\n fix: service.fix,\n };\n }\n}\n\n/**\n * Get trigger stats from scheduler\n */\nasync function getTriggerStats(): Promise<TriggerStats | null> {\n try {\n const schedulerUrl = process.env.SQUADS_API_URL || process.env.SQUADS_SCHEDULER_URL || 'http://localhost:8090';\n const response = await fetchWithTimeout(`${schedulerUrl}/api/triggers/stats`);\n\n if (!response.ok) return null;\n\n interface StatsResponse {\n active?: number;\n disabled?: number;\n last_fire?: {\n name?: string;\n fired_at?: string;\n };\n }\n\n const data = await response.json() as StatsResponse;\n return {\n active: data.active || 0,\n disabled: data.disabled || 0,\n lastFire: data.last_fire ? {\n name: data.last_fire.name || 'unknown',\n ago: formatTimeAgo(new Date(data.last_fire.fired_at || Date.now())),\n } : undefined,\n };\n } catch {\n return null;\n }\n}\n\n/**\n * Format time ago\n */\nfunction formatTimeAgo(date: Date): string {\n const seconds = Math.floor((Date.now() - date.getTime()) / 1000);\n\n if (seconds < 60) return `${seconds}s ago`;\n if (seconds < 3600) return `${Math.floor(seconds / 60)}m ago`;\n if (seconds < 86400) return `${Math.floor(seconds / 3600)}h ago`;\n return `${Math.floor(seconds / 86400)}d ago`;\n}\n\n/**\n * Format latency\n */\nfunction formatLatency(ms?: number): string {\n if (!ms) return '—';\n return `${ms}ms`;\n}\n\nexport interface HealthOptions {\n verbose?: boolean;\n}\n\nexport async function healthCommand(options: HealthOptions = {}): Promise<void> {\n writeLine();\n writeLine(` ${gradient('squads')} ${colors.dim}health${RESET}`);\n writeLine();\n\n // Check all services in parallel\n const results = await Promise.all(SERVICES.map(checkService));\n\n // Display table\n writeLine(` ${colors.purple}┌${'─'.repeat(48)}┐${RESET}`);\n writeLine(` ${colors.purple}│${RESET} ${padEnd('SERVICE', 18)}${padEnd('STATUS', 14)}${padEnd('LATENCY', 12)}${colors.purple}│${RESET}`);\n writeLine(` ${colors.purple}├${'─'.repeat(48)}┤${RESET}`);\n\n const issues: ServiceResult[] = [];\n\n for (const result of results) {\n let statusIcon: string;\n let statusColor: string;\n let statusText: string;\n\n switch (result.status) {\n case 'healthy':\n statusIcon = icons.success;\n statusColor = colors.green;\n statusText = 'healthy';\n break;\n case 'degraded':\n statusIcon = icons.warning;\n statusColor = colors.yellow;\n statusText = 'degraded';\n issues.push(result);\n break;\n case 'down':\n statusIcon = icons.error;\n statusColor = colors.red;\n statusText = 'down';\n if (!result.optional) {\n issues.push(result);\n }\n break;\n }\n\n const nameDisplay = result.optional ? `${result.name} ${colors.dim}(opt)${RESET}` : result.name;\n const latency = formatLatency(result.latencyMs);\n\n writeLine(` ${colors.purple}│${RESET} ${padEnd(nameDisplay, 18)}${statusColor}${statusIcon} ${padEnd(statusText, 11)}${RESET}${padEnd(latency, 12)}${colors.purple}│${RESET}`);\n }\n\n writeLine(` ${colors.purple}└${'─'.repeat(48)}┘${RESET}`);\n writeLine();\n\n // Get trigger stats if scheduler is up\n const schedulerUp = results.find(r => r.name === 'Scheduler')?.status === 'healthy';\n if (schedulerUp) {\n const stats = await getTriggerStats();\n if (stats) {\n const lastFireText = stats.lastFire\n ? `${colors.dim}Last fire:${RESET} ${stats.lastFire.ago} (${stats.lastFire.name})`\n : `${colors.dim}No recent fires${RESET}`;\n\n writeLine(` ${colors.cyan}Triggers:${RESET} ${stats.active} active, ${stats.disabled} disabled`);\n writeLine(` ${lastFireText}`);\n writeLine();\n }\n }\n\n // Show issues and fixes\n if (issues.length > 0) {\n const criticalIssues = issues.filter(i => !i.optional);\n const optionalIssues = issues.filter(i => i.optional);\n\n if (criticalIssues.length > 0) {\n writeLine(` ${colors.red}${icons.warning} ${criticalIssues.length} service(s) need attention${RESET}`);\n for (const issue of criticalIssues) {\n writeLine(` ${colors.dim}•${RESET} ${issue.name}: ${issue.error || 'not responding'}`);\n if (issue.fix) {\n writeLine(` ${colors.cyan}Fix:${RESET} ${issue.fix}`);\n }\n }\n writeLine();\n }\n\n if (options.verbose && optionalIssues.length > 0) {\n writeLine(` ${colors.yellow}Optional services down:${RESET}`);\n for (const issue of optionalIssues) {\n writeLine(` ${colors.dim}•${RESET} ${issue.name}`);\n }\n writeLine();\n }\n } else {\n writeLine(` ${colors.green}${icons.success} All services healthy${RESET}`);\n writeLine();\n }\n\n // Show mode info\n const allDown = results.every(r => r.status === 'down');\n if (allDown) {\n writeLine(` ${colors.cyan}${icons.progress}${RESET} Running in local mode ${colors.dim}(no database required)${RESET}`);\n writeLine(` Core commands work without infrastructure: ${colors.cyan}init${RESET}, ${colors.cyan}run${RESET}, ${colors.cyan}status${RESET}, ${colors.cyan}eval${RESET}`);\n writeLine(` Memory uses local ${colors.dim}.agents/memory/${RESET} files.`);\n writeLine();\n writeLine(` ${colors.dim}To enable scheduling and telemetry:${RESET} squads stack up`);\n writeLine();\n } else if (!schedulerUp) {\n writeLine(` ${colors.yellow}${icons.warning} Scheduler not running - triggers won't auto-fire${RESET}`);\n writeLine(` ${colors.dim}Start with:${RESET} squads stack up scheduler`);\n writeLine();\n }\n}\n","/**\n * Briefing command - Context injection for agents\n *\n * Aggregates squad state, goals, memory, costs, and git activity\n * into a single consumable output for human review or agent context.\n */\n\nimport { existsSync, statSync, readdirSync, readFileSync } from 'fs';\nimport { join } from 'path';\nimport {\n findSquadsDir,\n loadSquad,\n listSquads,\n listAgents,\n} from '../lib/squad-parser.js';\nimport { findMemoryDir, searchMemory, getSquadState } from '../lib/memory.js';\nimport {\n fetchBridgeStats,\n fetchRateLimits,\n} from '../lib/costs.js';\nimport { getMultiRepoGitStats } from '../lib/git.js';\nimport { getLiveSessionSummaryAsync } 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\n// ============================================================================\n// Types\n// ============================================================================\n\ninterface SquadBriefing {\n name: string;\n mission?: string;\n agentCount: number;\n activeGoals: { description: string; progress?: string }[];\n memoryEntries: number;\n recentMemory: string[];\n lastActivity?: string;\n}\n\ninterface BusinessBrief {\n priority?: string;\n runway?: string;\n focus?: string[];\n blockers?: string[];\n decisionFramework?: string[];\n raw?: string;\n}\n\ninterface BriefingData {\n timestamp: string;\n error?: string;\n brief?: BusinessBrief;\n squads: SquadBriefing[];\n goals: {\n active: number;\n completed: number;\n bySquad: { squad: string; goals: string[] }[];\n };\n costs?: {\n today: { generations: number; cost: number };\n budget: { daily: number; used: number; remaining: number; usedPct: number };\n bySquad: { squad: string; cost: number; generations: number }[];\n };\n rateLimits?: {\n models: { model: string; requestsRemaining: number; tokensRemaining: number }[];\n };\n git?: {\n commits: number;\n activeDays: number;\n avgPerDay: number;\n byRepo: { repo: string; commits: number }[];\n };\n sessions: {\n active: number;\n bySquad: number;\n };\n relevantMemory?: { squad: string; agent: string; snippet: string }[];\n}\n\ninterface BriefingOptions {\n squad?: string;\n topic?: string;\n json?: boolean;\n agent?: boolean;\n verbose?: boolean;\n}\n\n// ============================================================================\n// Business Brief Parser\n// ============================================================================\n\nconst BRIDGE_URL = process.env.SQUADS_BRIDGE_URL || 'http://localhost:8088';\n\nasync function syncBriefToBridge(brief: BusinessBrief, sourcePath: string): Promise<boolean> {\n try {\n const response = await fetch(`${BRIDGE_URL}/api/brief`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n priority: brief.priority,\n runway: brief.runway,\n focus: brief.focus || [],\n blockers: brief.blockers || [],\n decision_framework: brief.decisionFramework || [],\n raw_content: brief.raw || '',\n source_path: sourcePath,\n synced_by: 'cli',\n }),\n });\n\n if (!response.ok) {\n return false;\n }\n\n const result = await response.json() as { status?: string };\n return result.status === 'synced' || result.status === 'unchanged';\n } catch {\n // Bridge not available, silently fail\n return false;\n }\n}\n\nfunction readBusinessBrief(squadsDir: string | null): BusinessBrief | undefined {\n if (!squadsDir) return undefined;\n\n // Go up from .agents/squads to .agents, then look for BUSINESS_BRIEF.md\n const briefPath = join(squadsDir, '..', 'BUSINESS_BRIEF.md');\n if (!existsSync(briefPath)) return undefined;\n\n try {\n const content = readFileSync(briefPath, 'utf-8');\n const brief: BusinessBrief = { raw: content };\n\n // Parse #1 Priority section\n const priorityMatch = content.match(/##\\s*#1 Priority\\s*\\n+\\*\\*([^*]+)\\*\\*/);\n if (priorityMatch) {\n brief.priority = priorityMatch[1].trim();\n }\n\n // Parse Runway section\n const runwayMatch = content.match(/##\\s*Runway\\s*\\n+([\\s\\S]*?)(?=\\n##|$)/);\n if (runwayMatch) {\n const pressureMatch = runwayMatch[1].match(/\\*\\*Pressure\\*\\*:\\s*(\\w+)/i);\n if (pressureMatch) {\n brief.runway = pressureMatch[1];\n }\n }\n\n // Parse Current Focus section\n const focusMatch = content.match(/##\\s*Current Focus\\s*\\n+([\\s\\S]*?)(?=\\n##|$)/);\n if (focusMatch) {\n const items = focusMatch[1].match(/^\\d+\\.\\s*\\*\\*([^*]+)\\*\\*/gm);\n if (items) {\n brief.focus = items.map(item => {\n const match = item.match(/\\*\\*([^*]+)\\*\\*/);\n return match ? match[1].trim() : item;\n });\n }\n }\n\n // Parse Blockers section\n const blockersMatch = content.match(/##\\s*Blockers\\s*\\n+([\\s\\S]*?)(?=\\n##|$)/);\n if (blockersMatch) {\n const text = blockersMatch[1].trim();\n if (text.toLowerCase().includes('none')) {\n brief.blockers = [];\n } else {\n const items = text.match(/^-\\s*(.+)$/gm);\n if (items) {\n brief.blockers = items.map(item => item.replace(/^-\\s*/, '').trim());\n }\n }\n }\n\n // Parse Decision Framework\n const decisionMatch = content.match(/##\\s*Decision Framework\\s*\\n+([\\s\\S]*?)(?=\\n##|$)/);\n if (decisionMatch) {\n const items = decisionMatch[1].match(/^\\d+\\.\\s*(.+)$/gm);\n if (items) {\n brief.decisionFramework = items.map(item => item.replace(/^\\d+\\.\\s*/, '').trim());\n }\n }\n\n return brief;\n } catch {\n return undefined;\n }\n}\n\n// ============================================================================\n// Data Collection\n// ============================================================================\n\nasync function collectBriefingData(options: BriefingOptions): Promise<BriefingData> {\n const squadsDir = findSquadsDir();\n const memoryDir = findMemoryDir();\n const baseDir = squadsDir ? join(squadsDir, '..', '..', '..') : null;\n\n // Determine which squads to include\n const allSquads = squadsDir ? listSquads(squadsDir) : [];\n\n // Validate --squad option if provided\n if (options.squad && !allSquads.includes(options.squad)) {\n return {\n timestamp: new Date().toISOString(),\n error: `Squad \"${options.squad}\" not found. Available: ${allSquads.join(', ')}`,\n squads: [],\n goals: { active: 0, completed: 0, bySquad: [] },\n sessions: { active: 0, bySquad: 0 },\n } as BriefingData & { error?: string };\n }\n\n const squadNames = options.squad ? [options.squad] : allSquads;\n\n // Collect data in parallel for performance\n const [bridgeStats, rateLimits, sessions, gitStats] = await Promise.all([\n fetchBridgeStats(),\n fetchRateLimits(),\n getLiveSessionSummaryAsync(),\n baseDir ? getMultiRepoGitStats(baseDir, 7) : Promise.resolve(null),\n ]);\n\n // Build squad briefings\n const squadBriefings: SquadBriefing[] = [];\n const goalsBySquad: { squad: string; goals: string[] }[] = [];\n let totalActive = 0;\n let totalCompleted = 0;\n\n for (const squadName of squadNames) {\n const squad = loadSquad(squadName);\n if (!squad) continue;\n\n const agents = squadsDir ? listAgents(squadsDir, squadName) : [];\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 // Get memory state\n const states = getSquadState(squadName);\n const recentMemory: string[] = [];\n\n // Extract recent insights from memory\n for (const state of states.slice(0, 3)) {\n const lines = state.content.split('\\n').filter(l => l.trim() && !l.startsWith('#'));\n if (lines.length > 0) {\n recentMemory.push(lines[0].substring(0, 100));\n }\n }\n\n // Determine last activity\n let lastActivity: string | undefined;\n if (memoryDir) {\n const squadMemoryPath = join(memoryDir, squadName);\n if (existsSync(squadMemoryPath)) {\n let mostRecent = 0;\n try {\n const walkDir = (dir: string) => {\n const entries = readdirSync(dir, { withFileTypes: true });\n for (const entry of entries) {\n const fullPath = join(dir, entry.name);\n if (entry.isDirectory()) {\n walkDir(fullPath);\n } else if (entry.name.endsWith('.md')) {\n const stat = statSync(fullPath);\n if (stat.mtimeMs > mostRecent) {\n mostRecent = stat.mtimeMs;\n }\n }\n }\n };\n walkDir(squadMemoryPath);\n } catch {\n // Ignore errors\n }\n\n if (mostRecent > 0) {\n const daysAgo = Math.floor((Date.now() - mostRecent) / (1000 * 60 * 60 * 24));\n if (daysAgo === 0) lastActivity = 'today';\n else if (daysAgo === 1) lastActivity = 'yesterday';\n else lastActivity = `${daysAgo}d ago`;\n }\n }\n }\n\n squadBriefings.push({\n name: squadName,\n mission: squad.mission,\n agentCount: agents.length,\n activeGoals: activeGoals.map(g => ({\n description: g.description,\n progress: g.progress,\n })),\n memoryEntries: states.length,\n recentMemory,\n lastActivity,\n });\n\n if (activeGoals.length > 0) {\n goalsBySquad.push({\n squad: squadName,\n goals: activeGoals.map(g => g.description),\n });\n }\n }\n\n // Build costs data\n const costs = bridgeStats ? {\n today: {\n generations: bridgeStats.today.generations,\n cost: bridgeStats.today.costUsd,\n },\n budget: bridgeStats.budget,\n bySquad: bridgeStats.bySquad.map(s => ({\n squad: s.squad,\n cost: s.costUsd,\n generations: s.generations,\n })),\n } : undefined;\n\n // Build rate limits data\n const rateLimitsData = rateLimits.source !== 'none' ? {\n models: Object.values(rateLimits.limits).map(l => ({\n model: l.model,\n requestsRemaining: l.requestsRemaining,\n tokensRemaining: l.tokensRemaining,\n })),\n } : undefined;\n\n // Build git data\n const git = gitStats ? {\n commits: gitStats.totalCommits,\n activeDays: gitStats.activeDays,\n avgPerDay: gitStats.avgCommitsPerDay,\n byRepo: Array.from(gitStats.commitsByRepo.entries()).map(([repo, commits]) => ({\n repo,\n commits,\n })),\n } : undefined;\n\n // Search for topic-relevant memory if provided\n let relevantMemory: { squad: string; agent: string; snippet: string }[] | undefined;\n if (options.topic) {\n const results = searchMemory(options.topic);\n relevantMemory = results.slice(0, 5).map(r => ({\n squad: r.entry.squad,\n agent: r.entry.agent,\n snippet: r.matches[0]?.substring(0, 150) || '',\n }));\n }\n\n // Read business brief and sync to bridge\n const brief = readBusinessBrief(squadsDir);\n if (brief && squadsDir) {\n const briefPath = join(squadsDir, '..', 'BUSINESS_BRIEF.md');\n // Sync in background, don't block\n syncBriefToBridge(brief, briefPath).catch(() => {});\n }\n\n return {\n timestamp: new Date().toISOString(),\n brief,\n squads: squadBriefings,\n goals: {\n active: totalActive,\n completed: totalCompleted,\n bySquad: goalsBySquad,\n },\n costs,\n rateLimits: rateLimitsData,\n git,\n sessions: {\n active: sessions.totalSessions,\n bySquad: sessions.squadCount,\n },\n relevantMemory,\n };\n}\n\n// ============================================================================\n// Human Output\n// ============================================================================\n\nfunction renderHumanBriefing(data: BriefingData, options: BriefingOptions): void {\n writeLine();\n writeLine(` ${gradient('squads')} ${colors.dim}context-feed${RESET}`);\n writeLine();\n\n // Handle error (e.g., invalid squad)\n if (data.error) {\n writeLine(` ${colors.yellow}${icons.warning || '⚠'}${RESET} ${data.error}`);\n writeLine();\n return;\n }\n\n // Business Brief (top priority context)\n if (data.brief) {\n if (data.brief.priority) {\n const runwayColor = data.brief.runway === 'HIGH' ? colors.red :\n data.brief.runway === 'MEDIUM' ? colors.yellow : colors.green;\n writeLine(` ${bold}#1 Priority${RESET} ${runwayColor}[${data.brief.runway || '—'}]${RESET}`);\n writeLine(` ${colors.white}${data.brief.priority}${RESET}`);\n writeLine();\n }\n\n if (data.brief.focus && data.brief.focus.length > 0) {\n writeLine(` ${bold}Focus${RESET}`);\n for (const item of data.brief.focus.slice(0, 3)) {\n writeLine(` ${colors.cyan}→${RESET} ${item}`);\n }\n writeLine();\n }\n\n if (data.brief.blockers && data.brief.blockers.length > 0) {\n writeLine(` ${colors.red}${bold}Blockers${RESET}`);\n for (const blocker of data.brief.blockers) {\n writeLine(` ${colors.red}✗${RESET} ${blocker}`);\n }\n writeLine();\n }\n }\n\n // Sessions indicator\n if (data.sessions.active > 0) {\n writeLine(` ${colors.green}${icons.active}${RESET} ${data.sessions.active} active sessions across ${data.sessions.bySquad} squads`);\n writeLine();\n }\n\n // Goals summary\n if (data.goals.active > 0) {\n writeLine(` ${bold}Active Goals${RESET} ${colors.dim}(${data.goals.active})${RESET}`);\n writeLine();\n for (const sq of data.goals.bySquad) {\n writeLine(` ${colors.cyan}${sq.squad}${RESET}`);\n for (const goal of sq.goals.slice(0, 2)) {\n writeLine(` ${icons.active} ${goal}`);\n }\n if (sq.goals.length > 2) {\n writeLine(` ${colors.dim}+${sq.goals.length - 2} more${RESET}`);\n }\n }\n writeLine();\n }\n\n // Costs snapshot\n if (data.costs) {\n const { budget } = data.costs;\n const usedBar = '█'.repeat(Math.min(Math.round(budget.usedPct / 5), 20));\n const emptyBar = '░'.repeat(20 - usedBar.length);\n\n writeLine(` ${bold}Budget${RESET}`);\n writeLine(` ${colors.dim}$${budget.used.toFixed(2)}/${budget.daily} today${RESET} ${usedBar}${emptyBar} ${budget.usedPct.toFixed(0)}%`);\n writeLine();\n }\n\n // Rate limits (if available and verbose)\n if (data.rateLimits && options.verbose) {\n writeLine(` ${bold}Rate Limits${RESET}`);\n for (const model of data.rateLimits.models.slice(0, 3)) {\n const shortName = model.model.replace('claude-', '').replace(/-\\d+$/, '');\n writeLine(` ${colors.dim}${shortName}:${RESET} ${model.requestsRemaining} req, ${Math.round(model.tokensRemaining / 1000)}k tok`);\n }\n writeLine();\n }\n\n // Git activity (last 7 days)\n if (data.git && data.git.commits > 0) {\n writeLine(` ${bold}Git Activity${RESET} ${colors.dim}(7d)${RESET}`);\n writeLine(` ${data.git.commits} commits, ${data.git.avgPerDay}/day avg`);\n writeLine();\n }\n\n // Squads with activity\n const activeSquads = data.squads.filter(s => s.activeGoals.length > 0 || s.memoryEntries > 0);\n if (activeSquads.length > 0 && options.verbose) {\n const w = { name: 14, agents: 8, memory: 10, activity: 10 };\n const tableWidth = w.name + w.agents + w.memory + w.activity + 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.name)}${RESET}${bold}${padEnd('AGENTS', w.agents)}${RESET}${bold}${padEnd('MEMORY', w.memory)}${RESET}${bold}ACTIVITY${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 sq of activeSquads.slice(0, 8)) {\n const row = ` ${colors.purple}${box.vertical}${RESET} ` +\n `${colors.cyan}${padEnd(sq.name, w.name)}${RESET}` +\n `${padEnd(String(sq.agentCount), w.agents)}` +\n `${padEnd(String(sq.memoryEntries), w.memory)}` +\n `${padEnd(sq.lastActivity || '—', w.activity - 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 writeLine();\n }\n\n // Topic-relevant memory\n if (data.relevantMemory && data.relevantMemory.length > 0) {\n writeLine(` ${bold}Relevant Memory${RESET} ${colors.dim}(\"${options.topic}\")${RESET}`);\n for (const mem of data.relevantMemory) {\n writeLine(` ${colors.cyan}${mem.squad}/${mem.agent}${RESET}`);\n writeLine(` ${colors.dim}${mem.snippet}${RESET}`);\n }\n writeLine();\n }\n\n // Commands\n writeLine(` ${colors.dim}$${RESET} squads feed ${colors.cyan}--topic \"pricing\"${RESET} ${colors.dim}Topic-focused${RESET}`);\n writeLine(` ${colors.dim}$${RESET} squads feed ${colors.cyan}--squad website${RESET} ${colors.dim}Single squad${RESET}`);\n writeLine(` ${colors.dim}$${RESET} squads feed ${colors.cyan}--agent${RESET} ${colors.dim}JSON for agents${RESET}`);\n writeLine();\n}\n\n// ============================================================================\n// Agent Output (JSON)\n// ============================================================================\n\nfunction renderAgentBriefing(data: BriefingData): void {\n // Clean output for agent consumption\n console.log(JSON.stringify(data, null, 2));\n}\n\n// ============================================================================\n// Command Export\n// ============================================================================\n\nexport async function contextFeedCommand(options: BriefingOptions = {}): Promise<void> {\n const squadsDir = findSquadsDir();\n\n if (!squadsDir) {\n if (options.json || options.agent) {\n console.log(JSON.stringify({ error: 'No .agents/squads directory found' }));\n } else {\n writeLine(`${colors.red}No .agents/squads directory found${RESET}`);\n writeLine(`${colors.dim}Run \\`squads init\\` to create one.${RESET}`);\n }\n process.exit(1);\n }\n\n const data = await collectBriefingData(options);\n\n if (options.json || options.agent) {\n renderAgentBriefing(data);\n } else {\n renderHumanBriefing(data, options);\n }\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","/**\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_DATABASE_URL: 'postgresql://user:password@localhost:5432/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 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 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\";\n\nconst API_URL = process.env.SQUADS_API_URL || process.env.SCHEDULER_URL || \"http://localhost:8090\";\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 console.log(chalk.gray(\" The trigger system requires the local stack to be running.\\n\"));\n console.log(` ${chalk.cyan(\"$ squads stack start\")} Start the local stack`);\n console.log(` ${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 console.log(chalk.gray(\"No triggers found\"));\n return;\n }\n\n console.log(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 console.log(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 console.log(\n ` ${status} ${t.name}${chalk.gray(agent)} P${t.priority}${fires}`\n );\n }\n console.log();\n }\n}\n\nasync function syncTriggers(): Promise<void> {\n console.log(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 console.log(chalk.yellow(`Synced with ${result.errors.length} error(s):`));\n for (const err of result.errors) {\n console.log(chalk.red(` - ${err.name}: ${err.error}`));\n }\n }\n\n console.log(chalk.green(`Synced ${result.synced} trigger(s)`));\n if (result.triggers && result.triggers.length > 0) {\n for (const name of result.triggers) {\n console.log(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 console.log(chalk.gray(\" The sync command requires the API to be running.\\n\"));\n console.log(` ${chalk.cyan(\"$ squads stack start\")} Start the local stack`);\n console.log(` ${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 console.log(\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 console.log(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 console.log(`${trigger.name} ${status}`);\n}\n\nasync function showStatus(): Promise<void> {\n try {\n const stats = await fetchScheduler<SchedulerStats>(\"/stats\");\n\n console.log(chalk.bold(\"\\nScheduler Status\\n\"));\n\n console.log(chalk.cyan(\" Triggers\"));\n console.log(` Total: ${stats.triggers.total}`);\n console.log(` Enabled: ${chalk.green(stats.triggers.enabled)}`);\n console.log(` Fired 24h: ${stats.triggers.fired_24h}`);\n\n console.log(chalk.cyan(\"\\n Executions (24h)\"));\n console.log(` Completed: ${chalk.green(stats.executions_24h.completed)}`);\n console.log(` Failed: ${chalk.red(stats.executions_24h.failed)}`);\n console.log(` Running: ${chalk.yellow(stats.executions_24h.running)}`);\n console.log(` Queued: ${stats.executions_24h.queued}`);\n console.log();\n } catch {\n console.error(chalk.red(\"Scheduler not running or unreachable\"));\n console.log(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\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 {\n existsSync,\n readFileSync,\n writeFileSync,\n unlinkSync,\n readdirSync,\n mkdirSync,\n appendFileSync,\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\");\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 /##+ 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 * The main daemon loop. Runs as a long-lived process.\n */\nasync function daemonLoop(): Promise<void> {\n daemonLog(\"Daemon started\");\n\n // Track last spawn time per routine to enforce cooldowns\n const lastSpawned = new Map<string, number>();\n\n const tick = async () => {\n try {\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 const _runningCount = running.length;\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\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 }\n );\n lastSpawned.set(key, Date.now());\n daemonLog(`SPAWNED: ${key}`);\n } catch (err) {\n daemonLog(`ERROR: Failed to spawn ${key}: ${err}`);\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 // Keep process alive\n process.on(\"SIGTERM\", () => {\n daemonLog(\"Received SIGTERM, shutting down\");\n try {\n unlinkSync(PID_FILE);\n } catch {\n /* ignore */\n }\n process.exit(0);\n });\n\n process.on(\"SIGINT\", () => {\n daemonLog(\"Received SIGINT, shutting down\");\n try {\n unlinkSync(PID_FILE);\n } catch {\n /* ignore */\n }\n process.exit(0);\n });\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 console.log(\n chalk.yellow(`Daemon already running (PID ${status.pid})`)\n );\n console.log(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 console.log(chalk.yellow(\"No enabled routines found.\"));\n console.log(\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 (--daemon flag)\n if (process.argv.includes(\"--daemon\")) {\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 const child = spawn(\n process.execPath, // node\n [process.argv[1], \"autonomous\", \"start\", \"--daemon\"],\n {\n cwd: process.cwd(),\n detached: true,\n stdio: \"ignore\",\n env: { ...process.env },\n }\n );\n child.unref();\n\n // Wait briefly for PID file to appear\n await new Promise((resolve) => setTimeout(resolve, 1000));\n\n const check = isRunning();\n if (check.running) {\n console.log(chalk.green(`\\n Daemon started (PID ${check.pid})`));\n } else {\n console.log(chalk.green(\"\\n Daemon starting...\"));\n }\n\n console.log(chalk.gray(` Log: ${DAEMON_LOG}`));\n console.log(chalk.gray(` Config: SQUAD.md routines\\n`));\n\n // Show what's scheduled\n console.log(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 console.log(\n ` ${chalk.green(\"●\")} ${chalk.cyan(squad)}/${r.name} ${chalk.gray(r.schedule)} ${chalk.gray(`→ ${timeStr}`)}`\n );\n }\n }\n\n console.log(\n chalk.gray(`\\n ${routines.length} routines, max ${MAX_CONCURRENT} concurrent`)\n );\n console.log(chalk.gray(\" Stop: squads autonomous stop\"));\n console.log(chalk.gray(` Monitor: tail -f ${DAEMON_LOG}\\n`));\n}\n\nfunction stopScheduler(): void {\n const status = isRunning();\n\n if (!status.running) {\n console.log(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 console.log(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 console.log(chalk.bold(\"\\n Autonomous Scheduler\\n\"));\n\n // Daemon status\n if (daemon.running) {\n console.log(\n ` ${chalk.green(\"●\")} Daemon running ${chalk.gray(`(PID ${daemon.pid})`)}`\n );\n } else {\n console.log(` ${chalk.red(\"●\")} Daemon not running`);\n }\n console.log();\n\n // Running agents\n if (running.length > 0) {\n console.log(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 console.log(\n ` ${chalk.green(\"●\")} ${chalk.cyan(agent.squad)}/${agent.agent} ${chalk.gray(`${runtimeMin}min`)}${timeoutWarning} ${chalk.gray(`PID ${agent.pid}`)}`\n );\n }\n console.log();\n }\n\n // Routine summary\n console.log(chalk.cyan(\" Routines\"));\n console.log(\n ` ${enabled.length} enabled / ${routines.length} total, ${running.length}/${MAX_CONCURRENT} running`\n );\n console.log();\n\n // Next 10 upcoming runs\n if (enabled.length > 0) {\n console.log(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 console.log(\n ` ${chalk.gray(timeStr)} ${chalk.gray(dateStr)} ${chalk.cyan(run.squad)}/${run.agent}`\n );\n });\n }\n\n console.log();\n console.log(chalk.gray(\" Commands:\"));\n console.log(chalk.gray(\" $ squads autonomous start Start daemon\"));\n console.log(chalk.gray(\" $ squads autonomous stop Stop daemon\"));\n console.log(chalk.gray(` $ tail -f ${DAEMON_LOG}`));\n console.log();\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\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","/**\n * Zero-dependency cron evaluator utilities\n * Extracted from autonomous.ts for reusability and testing\n */\n\n/**\n * Check if a cron expression matches a given date\n * @param cron - Cron expression (minute hour day month weekday)\n * @param date - Date to check against\n * @returns true if the cron matches the date\n */\nexport function cronMatches(cron: string, date: Date): boolean {\n const parts = cron.trim().split(/\\s+/);\n if (parts.length < 5) return false;\n\n const fields = [\n { value: date.getMinutes(), field: parts[0], min: 0, max: 59 },\n { value: date.getHours(), field: parts[1], min: 0, max: 23 },\n { value: date.getDate(), field: parts[2], min: 1, max: 31 },\n { value: date.getMonth() + 1, field: parts[3], min: 1, max: 12 },\n { value: date.getDay(), field: parts[4], min: 0, max: 6 },\n ];\n\n return fields.every(({ value, field, min, max }) =>\n fieldMatches(field, value, min, max)\n );\n}\n\n/**\n * Check if a cron field matches a value\n * Handles wildcards, ranges, steps, and lists\n */\nexport function fieldMatches(\n field: string,\n value: number,\n min: number,\n max: number\n): boolean {\n // Handle lists: \"1,3,5\"\n if (field.includes(\",\")) {\n return field.split(\",\").some((part) => fieldMatches(part.trim(), value, min, max));\n }\n\n // Handle step: \"*/5\" or \"1-10/2\"\n if (field.includes(\"/\")) {\n const [range, stepStr] = field.split(\"/\");\n const step = parseInt(stepStr);\n if (isNaN(step) || step <= 0) return false;\n\n let start = min;\n let end = max;\n if (range !== \"*\") {\n if (range.includes(\"-\")) {\n [start, end] = range.split(\"-\").map(Number);\n } else {\n start = parseInt(range);\n }\n }\n if (value < start || value > end) return false;\n return (value - start) % step === 0;\n }\n\n // Handle range: \"1-5\"\n if (field.includes(\"-\")) {\n const [start, end] = field.split(\"-\").map(Number);\n return value >= start && value <= end;\n }\n\n // Wildcard\n if (field === \"*\") return true;\n\n // Exact match\n return parseInt(field) === value;\n}\n\n/**\n * Get the next occurrence of a cron expression after `after`.\n * Brute-forces minute by minute (max 48h lookahead).\n */\nexport function getNextCronRun(cron: string, after: Date = new Date()): Date {\n const next = new Date(after);\n next.setSeconds(0, 0);\n next.setMinutes(next.getMinutes() + 1); // Start from next minute\n\n const maxIterations = 60 * 48; // 48 hours\n for (let i = 0; i < maxIterations; i++) {\n if (cronMatches(cron, next)) return next;\n next.setMinutes(next.getMinutes() + 1);\n }\n\n // Fallback: 24h from now\n const fallback = new Date(after);\n fallback.setDate(fallback.getDate() + 1);\n return fallback;\n}\n\n/**\n * Parse a cooldown string like \"30m\", \"6 hours\", \"7d\" into milliseconds\n * @param cooldown - String like \"30m\", \"6 hours\", \"7d\"\n * @returns milliseconds, or 0 if invalid\n */\nexport function parseCooldown(cooldown: string): number {\n const match = cooldown.match(/^(\\d+)\\s*(m|min|minutes?|h|hours?|d|days?)$/i);\n if (!match) return 0;\n\n const value = parseInt(match[1]);\n const unit = match[2].toLowerCase();\n\n if (unit.startsWith(\"m\")) return value * 60 * 1000;\n if (unit.startsWith(\"h\")) return value * 60 * 60 * 1000;\n if (unit.startsWith(\"d\")) return value * 24 * 60 * 60 * 1000;\n return 0;\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\";\n\nconst API_URL =\n process.env.SQUADS_API_URL ||\n process.env.SCHEDULER_URL ||\n \"http://localhost:8090\";\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 console.log(chalk.green(`\\nApproval sent: ${result.approval_id}`));\n console.log(chalk.dim(` Expires: ${expiresAt.toISOString()}`));\n console.log();\n\n // Output for agent consumption\n if (process.env.SQUADS_AGENT) {\n console.log(`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 console.log(chalk.gray(\"\\nNo pending approvals\\n\"));\n return;\n }\n\n console.log(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 console.log(\n ` ${color(`[${a.type}]`)} ${chalk.bold(a.title)} ${chalk.dim(`(${a.approval_id})`)}`\n );\n console.log(\n chalk.dim(\n ` Squad: ${a.squad}${a.agent ? \"/\" + a.agent : \"\"} | Created: ${new Date(a.created_at).toLocaleString()}`\n )\n );\n console.log();\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 console.log(`\\nApproval: ${approvalId}`);\n console.log(` Status: ${color(approval.status)}`);\n if (approval.decided_by) {\n console.log(` Decided by: ${approval.decided_by}`);\n console.log(` Decided at: ${approval.decided_at}`);\n }\n console.log();\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 console.log(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 console.log(color(`\\nDecision: ${updated.status}`));\n if (updated.decided_by) {\n console.log(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 console.log(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\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 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 console.log(`\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 console.log(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 console.log('');\n console.log(chalk.bold('Deployment Manifest'));\n console.log(chalk.dim('─'.repeat(50)));\n\n for (const squad of manifest.squads) {\n console.log(` ${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 console.log(` ${chalk.dim('→')} ${agent.name} (${agent.model}) [${status}]`);\n if (agent.schedule) {\n console.log(` ${chalk.dim('schedule:')} ${agent.schedule}`);\n }\n }\n }\n }\n\n if (manifest.triggers.length > 0) {\n console.log('');\n console.log(chalk.bold('Triggers to sync'));\n console.log(chalk.dim('─'.repeat(50)));\n for (const trigger of manifest.triggers) {\n console.log(` ${chalk.magenta(trigger.name)} — ${trigger.squad}${trigger.agent ? '/' + trigger.agent : ''}`);\n if (options.verbose) {\n console.log(` ${chalk.dim('schedule:')} ${trigger.condition}`);\n console.log(` ${chalk.dim('cooldown:')} ${trigger.cooldown}`);\n }\n }\n }\n\n if (manifest.gitSha) {\n console.log('');\n console.log(chalk.dim(`Git SHA: ${manifest.gitSha}`));\n }\n\n // Dry run stops here\n if (options.dryRun) {\n console.log('');\n console.log(chalk.yellow('Dry run — no changes pushed to platform.'));\n console.log(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 console.log('');\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 console.log(` ${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 console.log('');\n console.log(chalk.dim('Synced triggers:'));\n for (const name of result.triggersSynced) {\n console.log(` ${chalk.green('✓')} ${name}`);\n }\n }\n\n console.log(`\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 console.log(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 console.log(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 });\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 console.log(chalk.dim('\\nNo triggers deployed. Run: squads deploy'));\n return;\n }\n\n console.log('');\n console.log(chalk.bold('Platform Triggers'));\n console.log(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 console.log(` ${status} ${chalk.cyan(trigger.name)} — ${trigger.squad}${trigger.agent ? '/' + trigger.agent : ''}`);\n console.log(` ${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 });\n\n if (execResponse.ok) {\n const stats = await execResponse.json() as Record<string, unknown>;\n console.log('');\n console.log(chalk.bold('Platform Stats'));\n console.log(chalk.dim('─'.repeat(60)));\n if (stats.running_agents !== undefined) {\n console.log(` Running agents: ${chalk.cyan(String(stats.running_agents))}`);\n }\n if (stats.executions_today !== undefined) {\n console.log(` Executions today: ${chalk.cyan(String(stats.executions_today))}`);\n }\n if (stats.total_cost_today !== undefined) {\n console.log(` Cost today: ${chalk.cyan('$' + String(stats.total_cost_today))}`);\n }\n }\n\n } catch (error) {\n spinner.fail('Failed to fetch status');\n console.error(chalk.red(error instanceof Error ? error.message : String(error)));\n }\n}\n\nexport async function deployPullCommand(options: { verbose?: boolean }): Promise<void> {\n const session = loadSession();\n if (!session?.accessToken) {\n console.log(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 });\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 console.log(chalk.dim('\\nNo executions found on platform.'));\n return;\n }\n\n console.log('');\n console.log(chalk.bold('Recent Platform Executions'));\n console.log(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 console.log(` ${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 console.log(` ${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 });\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 console.log('');\n console.log(chalk.bold('Recent Learnings'));\n console.log(chalk.dim('─'.repeat(70)));\n for (const l of learnings) {\n console.log(` ${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 console.error(chalk.red(error instanceof Error ? error.message : String(error)));\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 });\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 { 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 console.log(`\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 console.log(` ${icon} ${dim.name.padEnd(22)} ${renderBar(dim.score, dim.maxScore)}`);\n }\n\n console.log(`\n Overall readiness: ${chalk.bold(String(result.overallScore) + '%')} — ${renderReadinessLevel(result.readinessLevel)}\n`);\n\n if (result.recommendations.length > 0) {\n console.log(` ${chalk.bold('Recommendations:')}`);\n for (const rec of result.recommendations) {\n console.log(` ${chalk.dim('→')} ${rec}`);\n }\n console.log('');\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 console.log(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 console.log(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 console.log(chalk.bold('Squad Summary'));\n console.log(chalk.dim('━'.repeat(50)));\n console.log(` Agents evaluated: ${results.length}`);\n console.log(` Average score: ${avgScore}%`);\n for (const [level, count] of Object.entries(levels)) {\n console.log(` ${renderReadinessLevel(level as EvalResult['readinessLevel'])}: ${count}`);\n }\n console.log('');\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 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 claude = spawn('claude', [\n '--permission-mode', 'bypassPermissions',\n '--mcp-config', mcpConfigPath,\n '--', leadPrompt,\n ], {\n stdio: 'inherit',\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 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}' && 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}' && \\\\\nclaude --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","import {\n findSquadsDir,\n loadSquad,\n listSquads,\n SquadContext,\n resolveExecutionContext,\n} from '../lib/squad-parser.js';\nimport { track, Events } from '../lib/telemetry.js';\nimport {\n colors,\n bold,\n RESET,\n gradient,\n box,\n padEnd,\n writeLine,\n icons,\n} from '../lib/terminal.js';\n\ninterface ContextOptions {\n json?: boolean;\n}\n\nexport async function contextShowCommand(\n squadName: string,\n options: ContextOptions = {}\n): Promise<void> {\n await track(Events.CLI_CONTEXT, { squad: squadName });\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 squad = loadSquad(squadName);\n\n if (!squad) {\n writeLine(`${colors.red}Squad \"${squadName}\" not found.${RESET}`);\n process.exit(1);\n }\n\n // Resolve execution context to get full skill and MCP info\n const execContext = resolveExecutionContext(squad);\n\n if (options.json) {\n console.log(JSON.stringify({\n name: squad.name,\n mission: squad.mission,\n repo: squad.repo,\n stack: squad.stack,\n effort: squad.effort,\n context: squad.context,\n resolved: execContext.resolved,\n }, null, 2));\n return;\n }\n\n writeLine();\n writeLine(` ${gradient('squads')} ${colors.dim}context${RESET} ${colors.cyan}${squad.name}${RESET}`);\n\n const ctx = squad.context;\n\n if (!ctx) {\n writeLine();\n writeLine(` ${colors.yellow}No context defined in SQUAD.md frontmatter${RESET}`);\n writeLine();\n writeLine(` ${colors.dim}Add a frontmatter block to ${squad.name}/SQUAD.md:${RESET}`);\n writeLine();\n writeLine(` ${colors.dim}---${RESET}`);\n writeLine(` ${colors.dim}name: ${squad.name}${RESET}`);\n writeLine(` ${colors.dim}context:${RESET}`);\n writeLine(` ${colors.dim} mcp: [chrome-devtools]${RESET}`);\n writeLine(` ${colors.dim} model: { default: sonnet }${RESET}`);\n writeLine(` ${colors.dim} budget: { daily: 10 }${RESET}`);\n writeLine(` ${colors.dim}---${RESET}`);\n writeLine();\n return;\n }\n\n const tableWidth = 54;\n writeLine();\n writeLine(` ${colors.purple}${box.horizontal.repeat(tableWidth)}${RESET}`);\n\n // MCP Config (show resolved source)\n const mcpSource = execContext.resolved.mcpSource;\n const mcpSourceLabel = mcpSource === 'squad-local' ? `${colors.green}squad-local${RESET}` :\n mcpSource === 'generated' ? `${colors.cyan}generated${RESET}` :\n mcpSource === 'user-override' ? `${colors.yellow}user-override${RESET}` :\n `${colors.dim}fallback${RESET}`;\n\n if (execContext.resolved.mcpServers.length > 0) {\n writeLine(` ${bold}MCP${RESET} ${colors.cyan}${execContext.resolved.mcpServers.join(', ')}${RESET} ${colors.dim}(${mcpSourceLabel})${RESET}`);\n } else if (ctx?.mcp && ctx.mcp.length > 0) {\n writeLine(` ${bold}MCP${RESET} ${colors.cyan}${ctx.mcp.join(', ')}${RESET}`);\n } else {\n writeLine(` ${bold}MCP${RESET} ${colors.dim}none${RESET}`);\n }\n\n // Skills (show resolved with sources)\n const resolvedSkills = execContext.resolved.skills || [];\n if (resolvedSkills.length > 0) {\n const skillLabels = resolvedSkills.map(s => {\n const sourceColor = s.source === 'squad-local' ? colors.green :\n s.source === 'project' ? colors.cyan :\n colors.dim;\n return `${colors.cyan}${s.name}${RESET} ${sourceColor}(${s.source})${RESET}`;\n });\n writeLine(` ${bold}Skills${RESET} ${skillLabels.join(', ')}`);\n } else if (ctx?.skills && ctx.skills.length > 0) {\n writeLine(` ${bold}Skills${RESET} ${colors.cyan}${ctx.skills.join(', ')}${RESET}`);\n }\n\n // Memory\n if (ctx.memory?.load && ctx.memory.load.length > 0) {\n writeLine(` ${bold}Memory${RESET} ${colors.cyan}${ctx.memory.load.join(', ')}${RESET}`);\n }\n\n // Model\n if (ctx.model) {\n const modelParts: string[] = [];\n if (ctx.model.default) modelParts.push(`${colors.white}${ctx.model.default}${RESET} ${colors.dim}(default)${RESET}`);\n if (ctx.model.expensive) modelParts.push(`${colors.yellow}${ctx.model.expensive}${RESET} ${colors.dim}(expensive)${RESET}`);\n if (ctx.model.cheap) modelParts.push(`${colors.green}${ctx.model.cheap}${RESET} ${colors.dim}(cheap)${RESET}`);\n writeLine(` ${bold}Model${RESET} ${modelParts.join(', ')}`);\n }\n\n // Budget\n if (ctx.budget) {\n const budgetParts: string[] = [];\n if (ctx.budget.daily) budgetParts.push(`$${ctx.budget.daily}/day`);\n if (ctx.budget.weekly) budgetParts.push(`$${ctx.budget.weekly}/week`);\n if (ctx.budget.perExecution) budgetParts.push(`$${ctx.budget.perExecution}/run`);\n writeLine(` ${bold}Budget${RESET} ${colors.green}${budgetParts.join(', ')}${RESET}`);\n }\n\n // Effort\n if (squad.effort) {\n const effortColor = squad.effort === 'high' ? colors.red :\n squad.effort === 'medium' ? colors.yellow : colors.green;\n writeLine(` ${bold}Effort${RESET} ${effortColor}${squad.effort}${RESET}`);\n }\n\n // Stack/Repo info\n if (squad.repo) {\n writeLine(` ${bold}Repo${RESET} ${colors.dim}${squad.repo}${RESET}`);\n }\n if (squad.stack) {\n writeLine(` ${bold}Stack${RESET} ${colors.dim}${squad.stack}${RESET}`);\n }\n\n writeLine(` ${colors.purple}${box.horizontal.repeat(tableWidth)}${RESET}`);\n writeLine();\n\n // Commands\n writeLine(` ${colors.dim}$${RESET} squads context show ${colors.cyan}${squad.name}${RESET} --json ${colors.dim}JSON output${RESET}`);\n writeLine(` ${colors.dim}$${RESET} squads run ${colors.cyan}${squad.name}${RESET} ${colors.dim}Run with this context${RESET}`);\n writeLine();\n}\n\nexport async function contextListCommand(\n options: ContextOptions = {}\n): Promise<void> {\n await track(Events.CLI_CONTEXT, { action: 'list' });\n const squadsDir = findSquadsDir();\n\n if (!squadsDir) {\n writeLine(`${colors.red}No .agents/squads directory found${RESET}`);\n process.exit(1);\n }\n\n const squads = listSquads(squadsDir);\n\n if (options.json) {\n const contexts: Record<string, SquadContext | undefined> = {};\n for (const name of squads) {\n const squad = loadSquad(name);\n if (squad) {\n contexts[name] = squad.context;\n }\n }\n console.log(JSON.stringify(contexts, null, 2));\n return;\n }\n\n writeLine();\n writeLine(` ${gradient('squads')} ${colors.dim}context list${RESET}`);\n writeLine();\n\n const w = { name: 14, mcp: 24, model: 12, budget: 12 };\n const tableWidth = w.name + w.mcp + w.model + w.budget + 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('MCP', w.mcp)}${RESET}` +\n `${bold}${padEnd('MODEL', w.model)}${RESET}` +\n `${bold}BUDGET${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 name of squads) {\n const squad = loadSquad(name);\n const ctx = squad?.context;\n\n const mcpStr = ctx?.mcp?.slice(0, 2).join(', ') || `${colors.dim}—${RESET}`;\n const modelStr = ctx?.model?.default || `${colors.dim}—${RESET}`;\n const budgetStr = ctx?.budget?.daily ? `$${ctx.budget.daily}/d` : `${colors.dim}—${RESET}`;\n\n const row = ` ${colors.purple}${box.vertical}${RESET} ` +\n `${colors.cyan}${padEnd(name, w.name)}${RESET}` +\n `${padEnd(mcpStr, w.mcp)}` +\n `${padEnd(modelStr, w.model)}` +\n `${padEnd(budgetStr, w.budget)}` +\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\ninterface ActivateOptions {\n dryRun?: boolean;\n force?: boolean;\n json?: boolean;\n}\n\n/**\n * Activate execution context for a squad.\n * Resolves MCP config, skills, and memory paths.\n * Generates squad-scoped .mcp.json if needed.\n */\nexport async function contextActivateCommand(\n squadName: string,\n options: ActivateOptions = {}\n): Promise<void> {\n await track(Events.CLI_CONTEXT, { squad: squadName, action: 'activate' });\n\n const squadsDir = findSquadsDir();\n if (!squadsDir) {\n writeLine(`${colors.red}No .agents/squads directory found${RESET}`);\n process.exit(1);\n }\n\n const squad = loadSquad(squadName);\n if (!squad) {\n writeLine(`${colors.red}Squad \"${squadName}\" not found.${RESET}`);\n process.exit(1);\n }\n\n // Resolve execution context\n const execContext = resolveExecutionContext(squad, options.force);\n\n if (options.json) {\n console.log(JSON.stringify(execContext, null, 2));\n return;\n }\n\n if (options.dryRun) {\n writeLine();\n writeLine(` ${gradient('squads')} ${colors.dim}context activate${RESET} ${colors.cyan}${squadName}${RESET} ${colors.yellow}(dry run)${RESET}`);\n writeLine();\n writeLine(` ${colors.dim}Would resolve:${RESET}`);\n writeLine();\n writeLine(` ${bold}MCP Config${RESET}`);\n writeLine(` Path: ${execContext.resolved.mcpConfigPath}`);\n writeLine(` Source: ${execContext.resolved.mcpSource}`);\n if (execContext.resolved.mcpServers.length > 0) {\n writeLine(` Servers: ${execContext.resolved.mcpServers.join(', ')}`);\n }\n\n if (execContext.resolved.skills && execContext.resolved.skills.length > 0) {\n writeLine();\n writeLine(` ${bold}Skills${RESET}`);\n for (const skill of execContext.resolved.skills) {\n const sourceColor = skill.source === 'squad-local' ? colors.green :\n skill.source === 'project' ? colors.cyan :\n colors.dim;\n writeLine(` ${colors.cyan}${skill.name}${RESET} ${sourceColor}(${skill.source})${RESET}`);\n writeLine(` ${colors.dim}${skill.path}${RESET}`);\n }\n }\n\n if (execContext.resolved.memoryPaths.length > 0) {\n writeLine();\n writeLine(` ${bold}Memory${RESET}`);\n for (const path of execContext.resolved.memoryPaths) {\n writeLine(` ${colors.dim}${path}${RESET}`);\n }\n }\n\n writeLine();\n writeLine(` ${colors.dim}Run without --dry-run to generate config${RESET}`);\n writeLine();\n return;\n }\n\n // Actually activate (generate config if needed)\n writeLine();\n writeLine(` ${gradient('squads')} ${colors.dim}context activate${RESET} ${colors.cyan}${squadName}${RESET}`);\n writeLine();\n\n // Show what was resolved/generated\n const mcpSourceLabel = execContext.resolved.mcpSource === 'squad-local'\n ? `${colors.green}squad-local${RESET}`\n : execContext.resolved.mcpSource === 'generated'\n ? `${colors.cyan}generated${RESET}`\n : execContext.resolved.mcpSource === 'user-override'\n ? `${colors.yellow}user override${RESET}`\n : `${colors.dim}fallback${RESET}`;\n\n const sourceLabel = mcpSourceLabel;\n\n writeLine(` ${icons.success} MCP config: ${sourceLabel}`);\n writeLine(` ${colors.dim}${execContext.resolved.mcpConfigPath}${RESET}`);\n\n if (execContext.resolved.mcpServers.length > 0) {\n writeLine(` ${colors.dim}Servers: ${execContext.resolved.mcpServers.join(', ')}${RESET}`);\n }\n\n if (execContext.resolved.skills && execContext.resolved.skills.length > 0) {\n // Group skills by source\n const bySource = execContext.resolved.skills.reduce((acc, s) => {\n acc[s.source] = (acc[s.source] || 0) + 1;\n return acc;\n }, {} as Record<string, number>);\n\n const sourceSummary = Object.entries(bySource)\n .map(([source, count]) => `${count} ${source}`)\n .join(', ');\n\n writeLine(` ${icons.success} Skills: ${execContext.resolved.skills.length} resolved (${sourceSummary})`);\n }\n\n if (execContext.resolved.memoryPaths.length > 0) {\n writeLine(` ${icons.success} Memory: ${execContext.resolved.memoryPaths.length} files`);\n }\n\n writeLine();\n writeLine(` ${colors.dim}To use this context manually:${RESET}`);\n writeLine(` ${colors.dim}$${RESET} claude --mcp-config '${execContext.resolved.mcpConfigPath}'`);\n writeLine();\n writeLine(` ${colors.dim}Or run with squads:${RESET}`);\n writeLine(` ${colors.dim}$${RESET} squads run ${colors.cyan}${squadName}${RESET}`);\n writeLine();\n}\n\n/**\n * Output a ready-to-use prompt for Claude Code execution.\n * Usage: squads context prompt <squad> -a <agent>\n * Pipe to claude: squads context prompt company -a event-dispatcher | claude --print\n */\ninterface PromptOptions {\n agent?: string;\n json?: boolean;\n}\n\nexport async function contextPromptCommand(\n squadName: string,\n options: PromptOptions = {}\n): Promise<void> {\n await track(Events.CLI_CONTEXT, { squad: squadName, action: 'prompt' });\n const squadsDir = findSquadsDir();\n\n if (!squadsDir) {\n console.error('No .agents/squads directory found');\n process.exit(1);\n }\n\n const squad = loadSquad(squadName);\n if (!squad) {\n console.error(`Squad \"${squadName}\" not found.`);\n process.exit(1);\n }\n\n if (!options.agent) {\n console.error('Agent required. Use -a <agent>');\n process.exit(1);\n }\n\n const agentPath = `.agents/squads/${squadName}/${options.agent}.md`;\n\n // Build the prompt for Claude\n const prompt = `Execute the ${options.agent} agent from squad ${squadName}.\n\nRead the agent definition at ${agentPath} and follow its instructions exactly.\n\nCRITICAL INSTRUCTIONS:\n- Work autonomously - do NOT ask clarifying questions\n- Use Task tool to spawn sub-agents when needed\n- Output findings to GitHub issues (gh issue create)\n- Output code changes as PRs (gh pr create)\n- Update memory files in .agents/memory/${squadName}/${options.agent}/\n- Type /exit when done\n\nBegin now.`;\n\n if (options.json) {\n console.log(JSON.stringify({\n squad: squadName,\n agent: options.agent,\n agentPath,\n prompt,\n }, null, 2));\n } else {\n // Output raw prompt for piping to claude\n console.log(prompt);\n }\n}\n","import {\n fetchBridgeStats,\n BridgeStats,\n detectPlan,\n PlanDetection,\n} from '../lib/costs.js';\nimport {\n findSquadsDir,\n loadSquad,\n listSquads,\n} from '../lib/squad-parser.js';\nimport { track, Events } from '../lib/telemetry.js';\nimport {\n colors,\n bold,\n RESET,\n gradient,\n box,\n padEnd,\n writeLine,\n} from '../lib/terminal.js';\n\ninterface CostOptions {\n squad?: string;\n json?: boolean;\n}\n\ninterface BudgetStatus {\n squad: string;\n spent: number;\n dailyBudget: number | null;\n weeklyBudget: number | null;\n dailyPercent: number | null;\n weeklyPercent: number | null;\n status: 'ok' | 'warning' | 'over' | 'no-budget';\n}\n\nfunction getBudgetStatus(\n squadName: string,\n spent: number,\n dailyBudget: number | null,\n weeklyBudget: number | null\n): BudgetStatus {\n let status: BudgetStatus['status'] = 'no-budget';\n let dailyPercent: number | null = null;\n let weeklyPercent: number | null = null;\n\n if (dailyBudget !== null) {\n dailyPercent = (spent / dailyBudget) * 100;\n if (dailyPercent >= 100) {\n status = 'over';\n } else if (dailyPercent >= 80) {\n status = 'warning';\n } else {\n status = 'ok';\n }\n }\n\n if (weeklyBudget !== null) {\n weeklyPercent = (spent / weeklyBudget) * 100;\n }\n\n return {\n squad: squadName,\n spent,\n dailyBudget,\n weeklyBudget,\n dailyPercent,\n weeklyPercent,\n status,\n };\n}\n\nexport async function costCommand(options: CostOptions = {}): Promise<void> {\n await track(Events.CLI_COST, { squad: options.squad || 'all' });\n\n const stats = await fetchBridgeStats();\n const plan = detectPlan();\n\n if (options.json) {\n const result = buildJsonOutput(stats, plan, options.squad);\n console.log(JSON.stringify(result, null, 2));\n return;\n }\n\n writeLine();\n writeLine(` ${gradient('squads')} ${colors.dim}cost${RESET}${options.squad ? ` ${colors.cyan}${options.squad}${RESET}` : ''}`);\n writeLine();\n\n if (!stats) {\n writeLine(` ${colors.yellow}⚠ Bridge unavailable${RESET}`);\n writeLine(` ${colors.dim}Run \\`squads stack up\\` to start infrastructure${RESET}`);\n writeLine();\n return;\n }\n\n // Today summary\n const todaySection = ` ${bold}Today${RESET}`;\n writeLine(todaySection);\n writeLine(` ${colors.cyan}$${stats.today.costUsd.toFixed(2)}${RESET} ${colors.dim}|${RESET} ${stats.today.generations.toLocaleString()} calls ${colors.dim}|${RESET} ${formatTokens(stats.today.inputTokens + stats.today.outputTokens)} tokens`);\n\n // Model breakdown for today\n if (stats.byModel && stats.byModel.length > 0) {\n const modelParts = stats.byModel\n .filter(m => m.costUsd > 0)\n .sort((a, b) => b.costUsd - a.costUsd)\n .slice(0, 4)\n .map(m => `${colors.dim}${shortModelName(m.model)}${RESET} $${m.costUsd.toFixed(0)}`);\n if (modelParts.length > 0) {\n writeLine(` ${colors.dim}Models:${RESET} ${modelParts.join(' · ')}`);\n }\n }\n\n writeLine();\n\n // Week summary (if available)\n if (stats.week) {\n writeLine(` ${bold}Week${RESET}`);\n writeLine(` ${colors.purple}$${stats.week.costUsd.toFixed(2)}${RESET} ${colors.dim}|${RESET} ${stats.week.generations.toLocaleString()} calls ${colors.dim}|${RESET} ${formatTokens(stats.week.inputTokens + stats.week.outputTokens)} tokens`);\n writeLine();\n }\n\n // Budget status\n writeLine(` ${bold}Budget${RESET} ${colors.dim}(daily)${RESET}`);\n const budgetBar = createBudgetBar(stats.budget.usedPct);\n const budgetColor = stats.budget.usedPct >= 100 ? colors.red :\n stats.budget.usedPct >= 80 ? colors.yellow : colors.green;\n writeLine(` ${budgetBar} ${budgetColor}$${stats.budget.used.toFixed(0)}${RESET}/${colors.dim}$${stats.budget.daily}${RESET} (${stats.budget.usedPct.toFixed(0)}%)`);\n writeLine();\n\n // Per-squad breakdown with budget comparison\n if (stats.bySquad && stats.bySquad.length > 0 && !options.squad) {\n writeLine(` ${bold}By Squad${RESET}`);\n writeLine();\n\n const squadsDir = findSquadsDir();\n const squadBudgets = new Map<string, { daily: number | null; weekly: number | null }>();\n\n if (squadsDir) {\n for (const name of listSquads(squadsDir)) {\n const squad = loadSquad(name);\n if (squad?.context?.budget) {\n squadBudgets.set(name, {\n daily: squad.context.budget.daily || null,\n weekly: squad.context.budget.weekly || null,\n });\n }\n }\n }\n\n const tableWidth = 52;\n writeLine(` ${colors.purple}${box.topLeft}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.topRight}${RESET}`);\n\n const w = { name: 14, spent: 10, budget: 12, status: 14 };\n const header = ` ${colors.purple}${box.vertical}${RESET} ` +\n `${bold}${padEnd('SQUAD', w.name)}${RESET}` +\n `${bold}${padEnd('SPENT', w.spent)}${RESET}` +\n `${bold}${padEnd('BUDGET', w.budget)}${RESET}` +\n `${bold}STATUS${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 sq of stats.bySquad.sort((a, b) => b.costUsd - a.costUsd)) {\n const budgetInfo = squadBudgets.get(sq.squad);\n const dailyBudget = budgetInfo?.daily || null;\n\n const spentStr = `$${sq.costUsd.toFixed(2)}`;\n const budgetStr = dailyBudget ? `$${dailyBudget}/d` : `${colors.dim}—${RESET}`;\n\n let statusStr: string;\n if (dailyBudget) {\n const pct = (sq.costUsd / dailyBudget) * 100;\n if (pct >= 100) {\n statusStr = `${colors.red}● OVER${RESET}`;\n } else if (pct >= 80) {\n statusStr = `${colors.yellow}● ${pct.toFixed(0)}%${RESET}`;\n } else {\n statusStr = `${colors.green}✓ ${pct.toFixed(0)}%${RESET}`;\n }\n } else {\n statusStr = `${colors.dim}no budget${RESET}`;\n }\n\n const row = ` ${colors.purple}${box.vertical}${RESET} ` +\n `${colors.cyan}${padEnd(sq.squad, w.name)}${RESET}` +\n `${padEnd(spentStr, w.spent)}` +\n `${padEnd(budgetStr, w.budget)}` +\n `${padEnd(statusStr, w.status)}` +\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 // Single squad detail\n if (options.squad) {\n const squadStats = stats.bySquad?.find(s => s.squad === options.squad);\n const squad = loadSquad(options.squad);\n\n if (squadStats) {\n writeLine(` ${bold}Squad: ${options.squad}${RESET}`);\n writeLine(` Spent today: ${colors.cyan}$${squadStats.costUsd.toFixed(2)}${RESET}`);\n writeLine(` Calls: ${squadStats.generations.toLocaleString()}`);\n\n if (squad?.context?.budget) {\n const daily = squad.context.budget.daily;\n const weekly = squad.context.budget.weekly;\n\n if (daily) {\n const pct = (squadStats.costUsd / daily) * 100;\n const statusIcon = pct >= 100 ? `${colors.red}●${RESET}` :\n pct >= 80 ? `${colors.yellow}●${RESET}` : `${colors.green}✓${RESET}`;\n writeLine(` Daily budget: ${statusIcon} $${squadStats.costUsd.toFixed(2)}/$${daily} (${pct.toFixed(0)}%)`);\n }\n\n if (weekly) {\n writeLine(` Weekly budget: $${weekly}/week`);\n }\n } else {\n writeLine(` ${colors.dim}No budget defined in SQUAD.md frontmatter${RESET}`);\n }\n } else {\n writeLine(` ${colors.dim}No cost data for squad \"${options.squad}\"${RESET}`);\n }\n writeLine();\n }\n\n // Plan info\n writeLine(` ${colors.dim}Plan: ${plan.plan} (${plan.reason})${RESET}`);\n writeLine();\n}\n\nexport async function budgetCheckCommand(\n squadName: string,\n options: { json?: boolean } = {}\n): Promise<void> {\n await track(Events.CLI_COST, { action: 'budget-check', squad: squadName });\n\n const stats = await fetchBridgeStats();\n const squad = loadSquad(squadName);\n\n if (!stats) {\n if (options.json) {\n console.log(JSON.stringify({ error: 'Bridge unavailable' }));\n } else {\n writeLine(` ${colors.yellow}⚠ Bridge unavailable${RESET}`);\n }\n return;\n }\n\n const squadStats = stats.bySquad?.find(s => s.squad === squadName);\n const spent = squadStats?.costUsd || 0;\n const dailyBudget = squad?.context?.budget?.daily || null;\n const weeklyBudget = squad?.context?.budget?.weekly || null;\n\n const status = getBudgetStatus(squadName, spent, dailyBudget, weeklyBudget);\n\n if (options.json) {\n console.log(JSON.stringify(status, null, 2));\n return;\n }\n\n writeLine();\n\n if (status.status === 'no-budget') {\n writeLine(` ${colors.dim}○${RESET} ${colors.cyan}${squadName}${RESET}: No budget defined`);\n writeLine(` ${colors.dim}Add budget to SQUAD.md frontmatter:${RESET}`);\n writeLine(` ${colors.dim} context:${RESET}`);\n writeLine(` ${colors.dim} budget: { daily: 50 }${RESET}`);\n } else if (status.status === 'over') {\n writeLine(` ${colors.red}●${RESET} ${colors.cyan}${squadName}${RESET}: ${colors.red}OVER BUDGET${RESET}`);\n writeLine(` $${spent.toFixed(2)}/$${dailyBudget} daily (${status.dailyPercent?.toFixed(0)}%)`);\n } else if (status.status === 'warning') {\n writeLine(` ${colors.yellow}●${RESET} ${colors.cyan}${squadName}${RESET}: ${colors.yellow}Approaching limit${RESET}`);\n writeLine(` $${spent.toFixed(2)}/$${dailyBudget} daily (${status.dailyPercent?.toFixed(0)}%)`);\n } else {\n writeLine(` ${colors.green}✓${RESET} ${colors.cyan}${squadName}${RESET}: OK to proceed`);\n writeLine(` $${spent.toFixed(2)}/$${dailyBudget} daily (${status.dailyPercent?.toFixed(0)}%)`);\n }\n\n writeLine();\n}\n\nfunction buildJsonOutput(\n stats: BridgeStats | null,\n plan: PlanDetection,\n squadFilter?: string\n): object {\n if (!stats) {\n return { error: 'Bridge unavailable', plan };\n }\n\n const squadsDir = findSquadsDir();\n const squadBudgets: Record<string, { daily: number | null; weekly: number | null }> = {};\n\n if (squadsDir) {\n for (const name of listSquads(squadsDir)) {\n const squad = loadSquad(name);\n if (squad?.context?.budget) {\n squadBudgets[name] = {\n daily: squad.context.budget.daily || null,\n weekly: squad.context.budget.weekly || null,\n };\n }\n }\n }\n\n const bySquadWithBudget = stats.bySquad?.map(sq => ({\n ...sq,\n budget: squadBudgets[sq.squad] || null,\n budgetStatus: squadBudgets[sq.squad]?.daily\n ? getBudgetStatus(sq.squad, sq.costUsd, squadBudgets[sq.squad].daily, squadBudgets[sq.squad].weekly)\n : null,\n }));\n\n if (squadFilter) {\n const filtered = bySquadWithBudget?.find(s => s.squad === squadFilter);\n return {\n squad: squadFilter,\n ...filtered,\n plan,\n };\n }\n\n return {\n today: stats.today,\n week: stats.week,\n budget: stats.budget,\n bySquad: bySquadWithBudget,\n byModel: stats.byModel,\n plan,\n source: stats.source,\n };\n}\n\nfunction shortModelName(model: string): string {\n if (model.includes('opus')) return 'opus';\n if (model.includes('sonnet')) return 'sonnet';\n if (model.includes('haiku')) return 'haiku';\n return model.split('-')[0];\n}\n\nfunction formatTokens(tokens: number): string {\n if (tokens >= 1_000_000) {\n return `${(tokens / 1_000_000).toFixed(1)}M`;\n }\n if (tokens >= 1_000) {\n return `${(tokens / 1_000).toFixed(0)}k`;\n }\n return tokens.toString();\n}\n\nfunction createBudgetBar(percent: number, width = 10): string {\n const filled = Math.min(Math.round((percent / 100) * width), width);\n const empty = width - filled;\n\n const filledChar = '━';\n const emptyChar = '━';\n\n const color = percent >= 100 ? colors.red :\n percent >= 80 ? colors.yellow : colors.green;\n\n return `${color}${filledChar.repeat(filled)}${colors.dim}${emptyChar.repeat(empty)}${RESET}`;\n}\n","/**\n * squads exec - Execution history commands\n *\n * Enables agents to introspect past executions for self-improvement.\n * Part of RFC #110 Phase 2.\n */\n\nimport { track, Events } from '../lib/telemetry.js';\nimport {\n listExecutions,\n getExecutionStats,\n formatDuration,\n formatRelativeTime,\n Execution,\n ExecutionListOptions,\n} from '../lib/executions.js';\nimport {\n colors,\n bold,\n RESET,\n gradient,\n box,\n padEnd,\n writeLine,\n icons,\n} from '../lib/terminal.js';\n\ninterface ListOptions {\n squad?: string;\n agent?: string;\n status?: string;\n limit?: number;\n json?: boolean;\n}\n\ninterface ShowOptions {\n json?: boolean;\n}\n\n/**\n * squads exec list - List recent executions\n */\nexport async function execListCommand(options: ListOptions = {}): Promise<void> {\n await track(Events.CLI_EXEC, { action: 'list', squad: options.squad });\n\n const listOptions: ExecutionListOptions = {\n squad: options.squad,\n agent: options.agent,\n limit: options.limit || 20,\n };\n\n if (options.status) {\n listOptions.status = options.status as Execution['status'];\n }\n\n const executions = listExecutions(listOptions);\n\n if (options.json) {\n console.log(JSON.stringify(executions, null, 2));\n return;\n }\n\n writeLine();\n writeLine(` ${gradient('squads')} ${colors.dim}exec list${RESET}${options.squad ? ` ${colors.cyan}${options.squad}${RESET}` : ''}`);\n writeLine();\n\n if (executions.length === 0) {\n writeLine(` ${colors.dim}No executions found${RESET}`);\n writeLine();\n writeLine(` ${colors.dim}Executions are logged when running agents:${RESET}`);\n writeLine(` ${colors.dim}$${RESET} squads run ${colors.cyan}<squad>${RESET} --execute`);\n writeLine();\n return;\n }\n\n // Table header\n const w = { agent: 22, status: 12, duration: 10, time: 14, id: 18 };\n const tableWidth = w.agent + w.status + w.duration + w.time + w.id + 8;\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('AGENT', w.agent)}${RESET}` +\n `${bold}${padEnd('STATUS', w.status)}${RESET}` +\n `${bold}${padEnd('DURATION', w.duration)}${RESET}` +\n `${bold}${padEnd('TIME', w.time)}${RESET}` +\n `${bold}ID${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 exec of executions) {\n const agentName = `${exec.squad}/${exec.agent}`;\n const truncatedAgent = agentName.length > w.agent - 1\n ? agentName.slice(0, w.agent - 4) + '...'\n : agentName;\n\n const statusIcon = exec.status === 'running' ? icons.running :\n exec.status === 'completed' ? icons.success : icons.error;\n const statusColor = exec.status === 'running' ? colors.yellow :\n exec.status === 'completed' ? colors.green : colors.red;\n\n const statusStr = `${statusColor}${statusIcon} ${exec.status}${RESET}`;\n const durationStr = formatDuration(exec.durationMs);\n const timeStr = formatRelativeTime(exec.startTime);\n const shortId = exec.id.slice(0, 16);\n\n const row = ` ${colors.purple}${box.vertical}${RESET} ` +\n `${colors.cyan}${padEnd(truncatedAgent, w.agent)}${RESET}` +\n `${padEnd(statusStr, w.status + 10)}` + // +10 for ANSI codes\n `${padEnd(durationStr, w.duration)}` +\n `${colors.dim}${padEnd(timeStr, w.time)}${RESET}` +\n `${colors.dim}${shortId}${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 stats summary\n const stats = getExecutionStats(listOptions);\n const parts: string[] = [];\n if (stats.running > 0) parts.push(`${colors.yellow}${stats.running} running${RESET}`);\n if (stats.completed > 0) parts.push(`${colors.green}${stats.completed} completed${RESET}`);\n if (stats.failed > 0) parts.push(`${colors.red}${stats.failed} failed${RESET}`);\n\n if (parts.length > 0) {\n writeLine(` ${parts.join(` ${colors.dim}|${RESET} `)}`);\n if (stats.avgDurationMs) {\n writeLine(` ${colors.dim}Avg duration: ${formatDuration(stats.avgDurationMs)}${RESET}`);\n }\n writeLine();\n }\n\n // Show commands\n writeLine(` ${colors.dim}$${RESET} squads exec show ${colors.cyan}<id>${RESET} ${colors.dim}Execution details${RESET}`);\n writeLine(` ${colors.dim}$${RESET} squads exec --json ${colors.dim}JSON output${RESET}`);\n writeLine();\n}\n\n/**\n * squads exec show <id> - Show execution details\n */\nexport async function execShowCommand(executionId: string, options: ShowOptions = {}): Promise<void> {\n await track(Events.CLI_EXEC, { action: 'show', id: executionId });\n\n // Support partial ID matching\n const executions = listExecutions();\n const matches = executions.filter(e =>\n e.id === executionId || e.id.startsWith(executionId)\n );\n\n if (matches.length === 0) {\n writeLine();\n writeLine(` ${colors.red}Execution not found: ${executionId}${RESET}`);\n writeLine();\n writeLine(` ${colors.dim}List recent executions:${RESET}`);\n writeLine(` ${colors.dim}$${RESET} squads exec list`);\n writeLine();\n return;\n }\n\n if (matches.length > 1) {\n writeLine();\n writeLine(` ${colors.yellow}Multiple matches for \"${executionId}\":${RESET}`);\n for (const m of matches.slice(0, 5)) {\n writeLine(` ${colors.dim}${m.id}${RESET} - ${m.squad}/${m.agent}`);\n }\n writeLine();\n writeLine(` ${colors.dim}Provide a more specific ID${RESET}`);\n writeLine();\n return;\n }\n\n const exec = matches[0];\n\n if (options.json) {\n console.log(JSON.stringify(exec, null, 2));\n return;\n }\n\n writeLine();\n writeLine(` ${gradient('squads')} ${colors.dim}exec show${RESET}`);\n writeLine();\n\n // Header\n writeLine(` ${bold}${exec.squad}/${exec.agent}${RESET}`);\n writeLine(` ${colors.dim}${exec.id}${RESET}`);\n writeLine();\n\n // Status with icon\n const statusIcon = exec.status === 'running' ? icons.running :\n exec.status === 'completed' ? icons.success : icons.error;\n const statusColor = exec.status === 'running' ? colors.yellow :\n exec.status === 'completed' ? colors.green : colors.red;\n\n writeLine(` ${bold}Status${RESET} ${statusColor}${statusIcon} ${exec.status}${RESET}`);\n writeLine(` ${bold}Task Type${RESET} ${exec.taskType}`);\n writeLine(` ${bold}Trigger${RESET} ${exec.trigger}`);\n writeLine();\n\n // Timing\n writeLine(` ${bold}Started${RESET} ${exec.startTime}`);\n if (exec.endTime) {\n writeLine(` ${bold}Completed${RESET} ${exec.endTime}`);\n }\n if (exec.durationMs) {\n writeLine(` ${bold}Duration${RESET} ${formatDuration(exec.durationMs)}`);\n }\n writeLine();\n\n // Outcome/Error\n if (exec.outcome) {\n writeLine(` ${bold}Outcome${RESET}`);\n writeLine(` ${colors.dim}${exec.outcome}${RESET}`);\n writeLine();\n }\n\n if (exec.error) {\n writeLine(` ${bold}Error${RESET}`);\n writeLine(` ${colors.red}${exec.error}${RESET}`);\n writeLine();\n }\n\n // Commands\n writeLine(` ${colors.dim}$${RESET} squads memory show ${colors.cyan}${exec.squad}${RESET} ${colors.dim}Squad memory${RESET}`);\n writeLine(` ${colors.dim}$${RESET} squads exec list --squad ${colors.cyan}${exec.squad}${RESET} ${colors.dim}Squad history${RESET}`);\n writeLine();\n}\n\n/**\n * squads exec stats - Show execution statistics\n */\nexport async function execStatsCommand(options: ListOptions = {}): Promise<void> {\n await track(Events.CLI_EXEC, { action: 'stats', squad: options.squad });\n\n const listOptions: ExecutionListOptions = {\n squad: options.squad,\n };\n\n const stats = getExecutionStats(listOptions);\n\n if (options.json) {\n console.log(JSON.stringify(stats, null, 2));\n return;\n }\n\n writeLine();\n writeLine(` ${gradient('squads')} ${colors.dim}exec stats${RESET}${options.squad ? ` ${colors.cyan}${options.squad}${RESET}` : ''}`);\n writeLine();\n\n writeLine(` ${bold}Total${RESET} ${stats.total}`);\n writeLine(` ${colors.yellow}Running${RESET} ${stats.running}`);\n writeLine(` ${colors.green}Completed${RESET} ${stats.completed}`);\n writeLine(` ${colors.red}Failed${RESET} ${stats.failed}`);\n writeLine();\n\n if (stats.avgDurationMs) {\n writeLine(` ${bold}Avg Duration${RESET} ${formatDuration(stats.avgDurationMs)}`);\n writeLine();\n }\n\n // Top squads by execution count\n const squadEntries = Object.entries(stats.bySquad).sort((a, b) => b[1] - a[1]).slice(0, 5);\n if (squadEntries.length > 0) {\n writeLine(` ${bold}By Squad${RESET}`);\n for (const [squad, count] of squadEntries) {\n writeLine(` ${colors.cyan}${squad}${RESET}: ${count}`);\n }\n writeLine();\n }\n\n // Top agents by execution count\n const agentEntries = Object.entries(stats.byAgent).sort((a, b) => b[1] - a[1]).slice(0, 5);\n if (agentEntries.length > 0) {\n writeLine(` ${bold}Top Agents${RESET}`);\n for (const [agent, count] of agentEntries) {\n writeLine(` ${colors.cyan}${agent}${RESET}: ${count}`);\n }\n writeLine();\n }\n}\n","/**\n * squads providers - Show available LLM CLI providers\n *\n * Lists all supported LLM CLIs and their availability status.\n * Provides install instructions for missing CLIs.\n *\n * @see specs/multi-llm.md\n */\n\nimport {\n colors,\n RESET,\n gradient,\n icons,\n writeLine,\n} from '../lib/terminal.js';\nimport { getAllCLIStatus, CLIStatus } from '../lib/llm-clis.js';\nimport { track, Events } from '../lib/telemetry.js';\n\nexport interface ProvidersOptions {\n json?: boolean;\n}\n\n/**\n * Show status of all LLM CLI providers\n */\nexport async function providersCommand(options: ProvidersOptions = {}): Promise<void> {\n const statuses = getAllCLIStatus();\n\n // Track telemetry\n await track(Events.CLI_PROVIDERS, {\n available: statuses.filter((s) => s.available).length,\n total: statuses.length,\n });\n\n // JSON output for programmatic use\n if (options.json) {\n console.log(JSON.stringify(statuses, null, 2));\n return;\n }\n\n // Pretty output\n writeLine();\n writeLine(` ${gradient('squads')} ${colors.dim}providers${RESET}`);\n writeLine();\n\n // Header\n writeLine(` ${colors.dim}Provider CLI Status${RESET}`);\n writeLine(` ${colors.dim}${'─'.repeat(40)}${RESET}`);\n\n // Provider rows\n const ready: CLIStatus[] = [];\n const missing: CLIStatus[] = [];\n\n for (const status of statuses) {\n const statusText = status.available\n ? `${colors.green}${icons.success} ready${RESET}`\n : `${colors.red}${icons.error} not installed${RESET}`;\n\n // Pad columns for alignment\n const providerCol = status.displayName.padEnd(12);\n const commandCol = status.command.padEnd(9);\n\n writeLine(` ${colors.cyan}${providerCol}${RESET} ${commandCol} ${statusText}`);\n\n if (status.available) {\n ready.push(status);\n } else {\n missing.push(status);\n }\n }\n\n writeLine();\n\n // Summary\n if (ready.length === statuses.length) {\n writeLine(` ${colors.green}${icons.success}${RESET} All providers ready`);\n } else {\n writeLine(` ${colors.dim}${ready.length}/${statuses.length} providers available${RESET}`);\n }\n\n // Install instructions for missing\n if (missing.length > 0) {\n writeLine();\n writeLine(` ${colors.dim}Install missing:${RESET}`);\n\n for (const status of missing) {\n writeLine(` ${colors.dim}$${RESET} ${status.install}`);\n }\n }\n\n writeLine();\n}\n","/**\n * KPI Tracking Library\n *\n * Handles KPI definitions, recording values, and generating insights.\n * KPIs are defined in SQUAD.md frontmatter and values stored in memory files.\n */\n\nimport { existsSync, readFileSync, writeFileSync, mkdirSync } from 'fs';\nimport { join, dirname } from 'path';\nimport { findSquadsDir } from './squad-parser.js';\n\n/**\n * KPI definition from SQUAD.md frontmatter\n */\nexport interface KpiDefinition {\n name: string;\n target: number;\n unit: string;\n period: 'daily' | 'weekly' | 'monthly';\n source?: 'manual' | 'postgres' | 'github' | 'api';\n description?: string;\n}\n\n/**\n * Recorded KPI value\n */\nexport interface KpiValue {\n timestamp: string; // ISO date\n value: number;\n note?: string;\n}\n\n/**\n * KPI with current state and history\n */\nexport interface Kpi extends KpiDefinition {\n current?: number;\n lastUpdated?: string;\n trend?: 'up' | 'down' | 'flat';\n percentOfTarget?: number;\n history: KpiValue[];\n}\n\n/**\n * KPI storage file structure\n */\ninterface KpiStore {\n squadName: string;\n kpis: Record<string, KpiValue[]>;\n updatedAt: string;\n}\n\n/**\n * Get path to KPI store file for a squad\n */\nexport function getKpiStorePath(squadName: string): string {\n const squadsDir = findSquadsDir();\n if (!squadsDir) {\n throw new Error('No .agents/squads directory found');\n }\n return join(dirname(squadsDir), 'memory', squadName, 'kpis.json');\n}\n\n/**\n * Load KPI store for a squad\n */\nexport function loadKpiStore(squadName: string): KpiStore {\n const path = getKpiStorePath(squadName);\n\n if (!existsSync(path)) {\n return {\n squadName,\n kpis: {},\n updatedAt: new Date().toISOString(),\n };\n }\n\n try {\n const content = readFileSync(path, 'utf-8');\n return JSON.parse(content) as KpiStore;\n } catch {\n return {\n squadName,\n kpis: {},\n updatedAt: new Date().toISOString(),\n };\n }\n}\n\n/**\n * Save KPI store for a squad\n */\nexport function saveKpiStore(store: KpiStore): void {\n const path = getKpiStorePath(store.squadName);\n const dir = dirname(path);\n\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n\n store.updatedAt = new Date().toISOString();\n writeFileSync(path, JSON.stringify(store, null, 2));\n}\n\n/**\n * Record a KPI value\n */\nexport function recordKpiValue(\n squadName: string,\n kpiName: string,\n value: number,\n note?: string\n): KpiValue {\n const store = loadKpiStore(squadName);\n\n if (!store.kpis[kpiName]) {\n store.kpis[kpiName] = [];\n }\n\n const record: KpiValue = {\n timestamp: new Date().toISOString(),\n value,\n note,\n };\n\n store.kpis[kpiName].push(record);\n saveKpiStore(store);\n\n return record;\n}\n\n/**\n * Get KPI history for a specific metric\n */\nexport function getKpiHistory(\n squadName: string,\n kpiName: string,\n limit?: number\n): KpiValue[] {\n const store = loadKpiStore(squadName);\n const history = store.kpis[kpiName] || [];\n\n if (limit) {\n return history.slice(-limit);\n }\n return history;\n}\n\n/**\n * Calculate trend from history\n */\nexport function calculateTrend(history: KpiValue[]): 'up' | 'down' | 'flat' {\n if (history.length < 2) return 'flat';\n\n const recent = history.slice(-5);\n if (recent.length < 2) return 'flat';\n\n const first = recent[0].value;\n const last = recent[recent.length - 1].value;\n const change = ((last - first) / first) * 100;\n\n if (change > 5) return 'up';\n if (change < -5) return 'down';\n return 'flat';\n}\n\n/**\n * Get current KPI state with trend\n */\nexport function getKpiState(\n definition: KpiDefinition,\n squadName: string\n): Kpi {\n const history = getKpiHistory(squadName, definition.name);\n const lastValue = history.length > 0 ? history[history.length - 1] : undefined;\n\n return {\n ...definition,\n current: lastValue?.value,\n lastUpdated: lastValue?.timestamp,\n trend: calculateTrend(history),\n percentOfTarget: lastValue ? Math.round((lastValue.value / definition.target) * 100) : undefined,\n history,\n };\n}\n\n/**\n * Generate insight from KPI state\n */\nexport function generateKpiInsight(kpi: Kpi): string | null {\n if (!kpi.current || !kpi.percentOfTarget) {\n return null;\n }\n\n const trendEmoji = kpi.trend === 'up' ? '📈' : kpi.trend === 'down' ? '📉' : '➡️';\n const statusEmoji = kpi.percentOfTarget >= 100 ? '✅' : kpi.percentOfTarget >= 70 ? '🟡' : '🔴';\n\n if (kpi.percentOfTarget >= 100) {\n return `${statusEmoji} ${kpi.name}: Target achieved! ${kpi.current}/${kpi.target} ${kpi.unit} (${kpi.percentOfTarget}%) ${trendEmoji}`;\n } else if (kpi.percentOfTarget >= 70) {\n return `${statusEmoji} ${kpi.name}: On track - ${kpi.current}/${kpi.target} ${kpi.unit} (${kpi.percentOfTarget}%) ${trendEmoji}`;\n } else {\n return `${statusEmoji} ${kpi.name}: Needs attention - ${kpi.current}/${kpi.target} ${kpi.unit} (${kpi.percentOfTarget}%) ${trendEmoji}`;\n }\n}\n\n/**\n * Get values for a specific period\n */\nexport function getValuesForPeriod(\n history: KpiValue[],\n period: 'daily' | 'weekly' | 'monthly',\n count: number = 7\n): KpiValue[] {\n const now = new Date();\n const cutoff = new Date();\n\n switch (period) {\n case 'daily':\n cutoff.setDate(now.getDate() - count);\n break;\n case 'weekly':\n cutoff.setDate(now.getDate() - count * 7);\n break;\n case 'monthly':\n cutoff.setMonth(now.getMonth() - count);\n break;\n }\n\n return history.filter(v => new Date(v.timestamp) >= cutoff);\n}\n\n/**\n * Aggregate values by period\n */\nexport function aggregateByPeriod(\n history: KpiValue[],\n period: 'daily' | 'weekly' | 'monthly'\n): Map<string, number> {\n const aggregated = new Map<string, number[]>();\n\n for (const value of history) {\n const date = new Date(value.timestamp);\n let key: string;\n\n switch (period) {\n case 'daily':\n key = date.toISOString().split('T')[0];\n break;\n case 'weekly': {\n const weekStart = new Date(date);\n weekStart.setDate(date.getDate() - date.getDay());\n key = weekStart.toISOString().split('T')[0];\n break;\n }\n case 'monthly':\n key = `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, '0')}`;\n break;\n }\n\n if (!aggregated.has(key)) {\n aggregated.set(key, []);\n }\n aggregated.get(key)!.push(value.value);\n }\n\n // Sum values for each period\n const result = new Map<string, number>();\n for (const [key, values] of aggregated) {\n result.set(key, values.reduce((a, b) => a + b, 0));\n }\n\n return result;\n}\n\n/**\n * Parse KPI definitions from SQUAD.md frontmatter\n */\nexport function parseKpiDefinitions(frontmatter?: Record<string, unknown>): KpiDefinition[] {\n if (!frontmatter) return [];\n const kpis = frontmatter.kpis as Array<Record<string, unknown>> | undefined;\n if (!kpis || !Array.isArray(kpis)) {\n return [];\n }\n\n return kpis.map(k => ({\n name: String(k.name || ''),\n target: Number(k.target || 0),\n unit: String(k.unit || ''),\n period: (k.period as KpiDefinition['period']) || 'weekly',\n source: (k.source as KpiDefinition['source']) || 'manual',\n description: k.description ? String(k.description) : undefined,\n })).filter(k => k.name && k.target > 0);\n}\n","/**\n * KPI Command\n *\n * Track and analyze squad KPIs defined in SQUAD.md frontmatter.\n * Commands: define, record, show, trend, insights\n */\n\nimport {\n loadSquad,\n findSquadsDir,\n listSquads,\n} from '../lib/squad-parser.js';\nimport {\n KpiDefinition,\n Kpi,\n recordKpiValue,\n getKpiState,\n generateKpiInsight,\n parseKpiDefinitions,\n getValuesForPeriod,\n} from '../lib/kpi.js';\nimport {\n colors,\n bold,\n RESET,\n gradient,\n icons,\n writeLine,\n} from '../lib/terminal.js';\nimport { track, Events } from '../lib/telemetry.js';\n\n/**\n * Show KPI status for a squad\n */\nexport async function kpiShowCommand(\n squadName: string,\n options: { json?: boolean } = {}\n): Promise<void> {\n await track(Events.CLI_KPI_SHOW, { squad: squadName });\n\n const squad = loadSquad(squadName);\n if (!squad) {\n writeLine(` ${colors.red}Squad \"${squadName}\" not found${RESET}`);\n return;\n }\n\n const definitions = parseKpiDefinitions(squad.frontmatter);\n\n if (definitions.length === 0) {\n writeLine();\n writeLine(` ${colors.yellow}No KPIs defined for ${squadName}${RESET}`);\n writeLine();\n writeLine(` ${colors.dim}Define KPIs in SQUAD.md frontmatter:${RESET}`);\n writeLine(` ${colors.dim}---${RESET}`);\n writeLine(` ${colors.dim}kpis:${RESET}`);\n writeLine(` ${colors.dim} - name: \"leads_generated\"${RESET}`);\n writeLine(` ${colors.dim} target: 10${RESET}`);\n writeLine(` ${colors.dim} unit: \"leads\"${RESET}`);\n writeLine(` ${colors.dim} period: weekly${RESET}`);\n writeLine(` ${colors.dim}---${RESET}`);\n writeLine();\n return;\n }\n\n const kpis: Kpi[] = definitions.map(def => getKpiState(def, squadName));\n\n if (options.json) {\n console.log(JSON.stringify(kpis, null, 2));\n return;\n }\n\n writeLine();\n writeLine(` ${gradient('squads')} ${colors.dim}kpi show${RESET} ${colors.cyan}${squadName}${RESET}`);\n writeLine();\n\n for (const kpi of kpis) {\n const insight = generateKpiInsight(kpi);\n\n if (insight) {\n writeLine(` ${insight}`);\n } else {\n writeLine(` ${colors.dim}○${RESET} ${kpi.name}: ${colors.dim}No data recorded${RESET}`);\n }\n\n if (kpi.description) {\n writeLine(` ${colors.dim}${kpi.description}${RESET}`);\n }\n }\n\n writeLine();\n}\n\n/**\n * Record a KPI value\n */\nexport async function kpiRecordCommand(\n squadName: string,\n kpiName: string,\n value: string,\n options: { note?: string; json?: boolean } = {}\n): Promise<void> {\n await track(Events.CLI_KPI_RECORD, { squad: squadName, kpi: kpiName });\n\n const squad = loadSquad(squadName);\n if (!squad) {\n writeLine(` ${colors.red}Squad \"${squadName}\" not found${RESET}`);\n return;\n }\n\n const definitions = parseKpiDefinitions(squad.frontmatter);\n const definition = definitions.find(d => d.name === kpiName);\n\n if (!definition) {\n writeLine(` ${colors.red}KPI \"${kpiName}\" not defined in ${squadName}${RESET}`);\n writeLine();\n writeLine(` ${colors.dim}Available KPIs:${RESET}`);\n for (const def of definitions) {\n writeLine(` ${colors.dim} - ${def.name}${RESET}`);\n }\n return;\n }\n\n const numValue = parseFloat(value);\n if (isNaN(numValue)) {\n writeLine(` ${colors.red}Invalid value: ${value}${RESET}`);\n return;\n }\n\n const record = recordKpiValue(squadName, kpiName, numValue, options.note);\n\n if (options.json) {\n console.log(JSON.stringify(record, null, 2));\n return;\n }\n\n writeLine();\n writeLine(` ${icons.success} Recorded ${colors.cyan}${kpiName}${RESET}: ${bold}${numValue}${RESET} ${definition.unit}`);\n if (options.note) {\n writeLine(` ${colors.dim}Note: ${options.note}${RESET}`);\n }\n\n // Show progress toward target\n const percentOfTarget = Math.round((numValue / definition.target) * 100);\n const statusEmoji = percentOfTarget >= 100 ? '✅' : percentOfTarget >= 70 ? '🟡' : '🔴';\n writeLine(` ${statusEmoji} ${percentOfTarget}% of target (${definition.target} ${definition.unit}/${definition.period})`);\n writeLine();\n}\n\n/**\n * Show KPI trend over time\n */\nexport async function kpiTrendCommand(\n squadName: string,\n kpiName: string,\n options: { periods?: string; json?: boolean } = {}\n): Promise<void> {\n await track(Events.CLI_KPI_TREND, { squad: squadName, kpi: kpiName });\n\n const squad = loadSquad(squadName);\n if (!squad) {\n writeLine(` ${colors.red}Squad \"${squadName}\" not found${RESET}`);\n return;\n }\n\n const definitions = parseKpiDefinitions(squad.frontmatter);\n const definition = definitions.find(d => d.name === kpiName);\n\n if (!definition) {\n writeLine(` ${colors.red}KPI \"${kpiName}\" not defined in ${squadName}${RESET}`);\n return;\n }\n\n const kpi = getKpiState(definition, squadName);\n const periods = parseInt(options.periods || '7', 10);\n const values = getValuesForPeriod(kpi.history, definition.period, periods);\n\n if (options.json) {\n console.log(JSON.stringify({\n kpi: kpiName,\n definition,\n trend: kpi.trend,\n values,\n }, null, 2));\n return;\n }\n\n writeLine();\n writeLine(` ${gradient('squads')} ${colors.dim}kpi trend${RESET} ${colors.cyan}${squadName}/${kpiName}${RESET}`);\n writeLine();\n\n const trendEmoji = kpi.trend === 'up' ? '📈' : kpi.trend === 'down' ? '📉' : '➡️';\n writeLine(` ${bold}${kpiName}${RESET} ${trendEmoji} ${kpi.trend}`);\n writeLine(` ${colors.dim}Target: ${definition.target} ${definition.unit}/${definition.period}${RESET}`);\n writeLine();\n\n if (values.length === 0) {\n writeLine(` ${colors.dim}No data for the last ${periods} ${definition.period} periods${RESET}`);\n } else {\n // Simple ASCII chart\n const maxValue = Math.max(...values.map(v => v.value), definition.target);\n\n for (const v of values.slice(-10)) {\n const barLength = Math.round((v.value / maxValue) * 30);\n const bar = '█'.repeat(barLength);\n const targetMark = v.value >= definition.target ? colors.green : colors.red;\n\n const date = new Date(v.timestamp).toLocaleDateString('en-US', { month: 'short', day: 'numeric' });\n writeLine(` ${colors.dim}${date}${RESET} ${targetMark}${bar}${RESET} ${v.value}`);\n }\n\n writeLine();\n writeLine(` ${colors.dim}Target line: ${definition.target} ${'─'.repeat(20)}${RESET}`);\n }\n\n writeLine();\n}\n\n/**\n * Generate insights for all KPIs\n */\nexport async function kpiInsightsCommand(\n squadName?: string,\n options: { json?: boolean } = {}\n): Promise<void> {\n await track(Events.CLI_KPI_INSIGHTS, { squad: squadName || 'all' });\n\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 const allInsights: { squad: string; kpi: string; insight: string; percentOfTarget: number }[] = [];\n\n for (const name of squadsToCheck) {\n const squad = loadSquad(name);\n if (!squad) continue;\n\n const definitions = parseKpiDefinitions(squad.frontmatter);\n\n for (const def of definitions) {\n const kpi = getKpiState(def, name);\n const insight = generateKpiInsight(kpi);\n\n if (insight && kpi.percentOfTarget !== undefined) {\n allInsights.push({\n squad: name,\n kpi: def.name,\n insight,\n percentOfTarget: kpi.percentOfTarget,\n });\n }\n }\n }\n\n if (options.json) {\n console.log(JSON.stringify(allInsights, null, 2));\n return;\n }\n\n writeLine();\n writeLine(` ${gradient('squads')} ${colors.dim}kpi insights${RESET}`);\n writeLine();\n\n if (allInsights.length === 0) {\n writeLine(` ${colors.dim}No KPI data recorded yet${RESET}`);\n writeLine();\n writeLine(` ${colors.dim}Record KPI values:${RESET}`);\n writeLine(` ${colors.dim}$ squads kpi record <squad> <kpi> <value>${RESET}`);\n writeLine();\n return;\n }\n\n // Sort by percentage (lowest first - needs attention)\n allInsights.sort((a, b) => a.percentOfTarget - b.percentOfTarget);\n\n // Group by status\n const needsAttention = allInsights.filter(i => i.percentOfTarget < 70);\n const onTrack = allInsights.filter(i => i.percentOfTarget >= 70 && i.percentOfTarget < 100);\n const achieved = allInsights.filter(i => i.percentOfTarget >= 100);\n\n if (needsAttention.length > 0) {\n writeLine(` ${colors.red}${bold}Needs Attention${RESET}`);\n for (const item of needsAttention) {\n writeLine(` ${item.insight}`);\n writeLine(` ${colors.dim}Squad: ${item.squad}${RESET}`);\n }\n writeLine();\n }\n\n if (onTrack.length > 0) {\n writeLine(` ${colors.yellow}${bold}On Track${RESET}`);\n for (const item of onTrack) {\n writeLine(` ${item.insight}`);\n }\n writeLine();\n }\n\n if (achieved.length > 0) {\n writeLine(` ${colors.green}${bold}Target Achieved${RESET}`);\n for (const item of achieved) {\n writeLine(` ${item.insight}`);\n }\n writeLine();\n }\n\n // Summary\n writeLine(` ${colors.dim}─────────────────────────────────────${RESET}`);\n writeLine(` ${colors.red}${needsAttention.length}${RESET} needs attention ${colors.yellow}${onTrack.length}${RESET} on track ${colors.green}${achieved.length}${RESET} achieved`);\n writeLine();\n}\n\n/**\n * List all KPIs across squads\n */\nexport async function kpiListCommand(\n options: { json?: boolean } = {}\n): Promise<void> {\n await track(Events.CLI_KPI_LIST, {});\n\n const squadsDir = findSquadsDir();\n if (!squadsDir) {\n writeLine(` ${colors.red}No .agents/squads directory found${RESET}`);\n return;\n }\n\n const squads = listSquads(squadsDir);\n const allKpis: { squad: string; kpis: KpiDefinition[] }[] = [];\n\n for (const name of squads) {\n const squad = loadSquad(name);\n if (!squad) continue;\n\n const definitions = parseKpiDefinitions(squad.frontmatter);\n if (definitions.length > 0) {\n allKpis.push({ squad: name, kpis: definitions });\n }\n }\n\n if (options.json) {\n console.log(JSON.stringify(allKpis, null, 2));\n return;\n }\n\n writeLine();\n writeLine(` ${gradient('squads')} ${colors.dim}kpi list${RESET}`);\n writeLine();\n\n if (allKpis.length === 0) {\n writeLine(` ${colors.dim}No KPIs defined in any squad${RESET}`);\n writeLine();\n writeLine(` ${colors.dim}Define KPIs in SQUAD.md frontmatter:${RESET}`);\n writeLine(` ${colors.dim}---${RESET}`);\n writeLine(` ${colors.dim}kpis:${RESET}`);\n writeLine(` ${colors.dim} - name: \"metric_name\"${RESET}`);\n writeLine(` ${colors.dim} target: 100${RESET}`);\n writeLine(` ${colors.dim} unit: \"items\"${RESET}`);\n writeLine(` ${colors.dim} period: weekly${RESET}`);\n writeLine(` ${colors.dim}---${RESET}`);\n writeLine();\n return;\n }\n\n for (const { squad, kpis } of allKpis) {\n writeLine(` ${colors.cyan}${squad}${RESET}`);\n\n for (const kpi of kpis) {\n const periodIcon = kpi.period === 'daily' ? '📅' : kpi.period === 'weekly' ? '📆' : '🗓️';\n writeLine(` ${periodIcon} ${bold}${kpi.name}${RESET}: ${kpi.target} ${kpi.unit}/${kpi.period}`);\n if (kpi.description) {\n writeLine(` ${colors.dim}${kpi.description}${RESET}`);\n }\n }\n writeLine();\n }\n\n const total = allKpis.reduce((sum, s) => sum + s.kpis.length, 0);\n writeLine(` ${colors.dim}${total} KPIs across ${allKpis.length} squads${RESET}`);\n writeLine();\n}\n"],"mappings":"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","names":["existsSync","join","homedir","chalk","require","existsSync","join","join","existsSync","config","config","existsSync","readFileSync","existsSync","join","homedir","__filename","__dirname","join","homedir","existsSync","__dirname","join","existsSync","__dirname","readFileSync","execSync","execSync","execSync","ora","spawn","execSync","join","dirname","existsSync","readFileSync","writeFileSync","mkdirSync","readdirSync","path","execSync","commandExists","prompt","config","PROVIDERS","config","homedir","join","dirname","existsSync","readFileSync","readdirSync","config","writeFileSync","mkdirSync","execSync","yaml","squadName","prompt","ora","spawn","watch","timestamp","logDir","logFile","pidFile","modelFlag","shellScript","wrapperScript","child","existsSync","statSync","join","readFileSync","existsSync","readdirSync","join","existsSync","readFileSync","readdirSync","join","formatDuration","mins","execStats","join","existsSync","statSync","agents","execContext","recentExecs","exec","formatDuration","execSync","execSync","sessions","execSync","existsSync","readFileSync","writeFileSync","mkdirSync","readdirSync","join","join","existsSync","readFileSync","writeFileSync","execSync","mkdirSync","readdirSync","memoryDir","lastSync","commits","bySquad","goal","progress","readFileSync","writeFileSync","existsSync","mkdirSync","readdirSync","join","dirname","join","existsSync","readFileSync","feedback","dirname","mkdirSync","writeFileSync","readdirSync","existsSync","mkdirSync","readFileSync","writeFileSync","join","dirname","join","dirname","existsSync","mkdirSync","readFileSync","writeFileSync","readdirSync","existsSync","statSync","join","calcCost","homedir","join","join","existsSync","readdirSync","statSync","goal","goalCount","join","existsSync","formatTokens","goal","readFileSync","readdirSync","existsSync","join","createRequire","require","formatRelativeTime","progress","m","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","goal","existsSync","readFileSync","join","BRIDGE_URL","FETCH_TIMEOUT_MS","fetchWithTimeout","fetchFromBridge","join","path","existsSync","readFileSync","formatDuration","exec","FETCH_TIMEOUT_MS","SERVICES","fetchWithTimeout","checkService","existsSync","statSync","readdirSync","readFileSync","join","BRIDGE_URL","join","existsSync","readFileSync","sessions","readdirSync","statSync","goal","session","existsSync","readFileSync","join","homedir","CONFIG_PATH","config","chalk","path","program","chalk","existsSync","readFileSync","writeFileSync","unlinkSync","readdirSync","mkdirSync","join","homedir","spawn","execSync","join","homedir","existsSync","readFileSync","readdirSync","unlinkSync","execSync","chalk","mkdirSync","writeFileSync","spawn","showStatus","program","chalk","API_URL","program","chalk","ora","existsSync","readFileSync","execSync","session","chalk","ora","exec","execSync","existsSync","readFileSync","program","chalk","existsSync","readFileSync","readdirSync","statSync","join","matter","readFileSync","matter","join","existsSync","statSync","readdirSync","renderBar","chalk","program","spawn","existsSync","readFileSync","readdirSync","join","existsSync","mkdirSync","writeFileSync","readFileSync","readdirSync","unlinkSync","join","config","join","existsSync","readFileSync","colors","join","existsSync","readFileSync","readdirSync","spawn","program","path","prompt","exec","formatDuration","existsSync","readFileSync","writeFileSync","mkdirSync","join","dirname","join","dirname","path","existsSync","readFileSync","mkdirSync","writeFileSync","kpi","kpi","chalk","join","homedir","existsSync","gradient","colors","RESET","checkForUpdate","exec","readFileSync"]}
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 'create': {\n message: 'Specify a name for the new squad.',\n example: 'squads create marketing # create with interactive prompts\\n squads create 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 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('--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 (...args: any[]) => {\n const { initCommand } = await import('./commands/init.js');\n // @ts-expect-error Commander action args spread\n return initCommand(...args);\n });\n\n// Create command - add a new squad to your workforce\nprogram\n .command('create <name>')\n .description('Create 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 create marketing Create with interactive prompts\n $ squads create marketing -d \"Drive growth\" -y Create non-interactively\n $ squads create marketing --force Overwrite existing squad\n $ squads create marketing --repo Create with GitHub repo\n $ squads create marketing --repo --org myorg Create with GitHub repo in specific org\n`)\n .action(async (...args: any[]) => {\n const { createCommand } = await import('./commands/create.js');\n // @ts-expect-error Commander action args spread\n return createCommand(...args);\n });\n\n// Run command - execute 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('-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('-j, --json', 'Output as JSON')\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`)\n .action(async (target, options) => {\n const { runCommand } = await import('./commands/run.js');\n return runCommand(target, { ...options, timeout: parseInt(options.timeout, 10) });\n });\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 .option('-v, --verbose', 'Show additional details')\n .option('-j, --json', 'Output as JSON')\n .action(async (...args: any[]) => {\n const { listCommand } = await import('./commands/list.js');\n // @ts-expect-error Commander action args spread\n return listCommand(...args);\n });\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 (...args: any[]) => {\n const { contextShowCommand } = await import('./commands/context.js');\n // @ts-expect-error Commander action args spread\n return contextShowCommand(...args);\n });\n\nenv\n .command('list')\n .description('List execution environment for all squads')\n .option('--json', 'Output as JSON')\n .action(async (...args: any[]) => {\n const { contextListCommand } = await import('./commands/context.js');\n return contextListCommand(...args);\n });\n\nenv\n .command('activate <squad>')\n .description('Activate execution context for a squad (generates scoped MCP config)')\n .option('-d, --dry-run', 'Show what would be generated without writing files')\n .option('-f, --force', 'Force regeneration even if config exists')\n .option('--json', 'Output as JSON')\n .action(async (...args: any[]) => {\n const { contextActivateCommand } = await import('./commands/context.js');\n // @ts-expect-error Commander action args spread\n return contextActivateCommand(...args);\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 (...args: any[]) => {\n const { contextPromptCommand } = await import('./commands/context.js');\n // @ts-expect-error Commander action args spread\n return contextPromptCommand(...args);\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 (...args: any[]) => {\n const { execShowCommand } = await import('./commands/exec.js');\n // @ts-expect-error Commander action args spread\n return execShowCommand(...args);\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 (...args: any[]) => {\n const { execStatsCommand } = await import('./commands/exec.js');\n return execStatsCommand(...args);\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 (...args: any[]) => {\n const { statusCommand } = await import('./commands/status.js');\n return statusCommand(...args);\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 (...args: any[]) => {\n const { costCommand } = await import('./commands/cost.js');\n return costCommand(...args);\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 (...args: any[]) => {\n const { budgetCheckCommand } = await import('./commands/cost.js');\n // @ts-expect-error Commander action args spread\n return budgetCheckCommand(...args);\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 (...args: any[]) => {\n const { goalSetCommand } = await import('./commands/goal.js');\n // @ts-expect-error Commander action args spread\n return goalSetCommand(...args);\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 (...args: any[]) => {\n const { goalListCommand } = await import('./commands/goal.js');\n return goalListCommand(...args);\n });\n\ngoal\n .command('complete <squad> <index>')\n .description('Mark a goal as completed')\n .action(async (...args: any[]) => {\n const { goalCompleteCommand } = await import('./commands/goal.js');\n // @ts-expect-error Commander action args spread\n return goalCompleteCommand(...args);\n });\n\ngoal\n .command('progress <squad> <index> <progress>')\n .description('Update goal progress')\n .action(async (...args: any[]) => {\n const { goalProgressCommand } = await import('./commands/goal.js');\n // @ts-expect-error Commander action args spread\n return goalProgressCommand(...args);\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 (...args: any[]) => {\n const { kpiListCommand } = await import('./commands/kpi.js');\n return kpiListCommand(...args);\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 (...args: any[]) => {\n const { kpiShowCommand } = await import('./commands/kpi.js');\n // @ts-expect-error Commander action args spread\n return kpiShowCommand(...args);\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 (...args: any[]) => {\n const { kpiRecordCommand } = await import('./commands/kpi.js');\n // @ts-expect-error Commander action args spread\n return kpiRecordCommand(...args);\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 (...args: any[]) => {\n const { kpiTrendCommand } = await import('./commands/kpi.js');\n // @ts-expect-error Commander action args spread\n return kpiTrendCommand(...args);\n });\n\nkpi\n .command('insights [squad]')\n .description('Generate insights from KPI data')\n .option('-j, --json', 'Output as JSON')\n .action(async (...args: any[]) => {\n const { kpiInsightsCommand } = await import('./commands/kpi.js');\n return kpiInsightsCommand(...args);\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 (...args: any[]) => {\n const { progressCommand } = await import('./commands/progress.js');\n return progressCommand(...args);\n });\n\nprogress\n .command('start <squad> <description>')\n .description('Register a new active task')\n .action(async (...args: any[]) => {\n const { progressStartCommand } = await import('./commands/progress.js');\n // @ts-expect-error Commander action args spread\n return progressStartCommand(...args);\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 (...args: any[]) => {\n const { progressCompleteCommand } = await import('./commands/progress.js');\n // @ts-expect-error Commander action args spread\n return progressCompleteCommand(...args);\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 (...args: any[]) => {\n const { feedbackAddCommand } = await import('./commands/feedback.js');\n // @ts-expect-error Commander action args spread\n return feedbackAddCommand(...args);\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 (...args: any[]) => {\n const { feedbackShowCommand } = await import('./commands/feedback.js');\n // @ts-expect-error Commander action args spread\n return feedbackShowCommand(...args);\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 — autonomous business operations loop\nprogram\n .command('autopilot')\n .alias('daemon')\n .description('Autopilot: watch, decide, dispatch, learn, escalate — your AI workforce on auto')\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 { daemonCommand } = await import('./commands/daemon.js');\n return daemonCommand(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 (...args: any[]) => {\n const { memoryQueryCommand } = await import('./commands/memory.js');\n // @ts-expect-error Commander action args spread\n return memoryQueryCommand(...args);\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 (...args: any[]) => {\n const { memoryShowCommand } = await import('./commands/memory.js');\n // @ts-expect-error Commander action args spread\n return memoryShowCommand(...args);\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 (...args: any[]) => {\n const { memoryUpdateCommand } = await import('./commands/memory.js');\n // @ts-expect-error Commander action args spread\n return memoryUpdateCommand(...args);\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 conversations stored via squads-bridge (requires bridge service)')\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 (...args: any[]) => {\n const { learnCommand } = await import('./commands/learn.js');\n // @ts-expect-error Commander action args spread\n return learnCommand(...args);\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 (...args: any[]) => {\n const { learnShowCommand } = await import('./commands/learn.js');\n // @ts-expect-error Commander action args spread\n return learnShowCommand(...args);\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 (...args: any[]) => {\n const { learnSearchCommand } = await import('./commands/learn.js');\n // @ts-expect-error Commander action args spread\n return learnSearchCommand(...args);\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 (...args: any[]) => {\n const { sessionsCommand } = await import('./commands/sessions.js');\n return sessionsCommand(...args);\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 separately. Use: docker compose up -d'));\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 infrastructure.'));\n console.error(chalk.dim('If you need scheduling or telemetry:'));\n console.error(chalk.dim(' 1. Check infrastructure: squads health'));\n console.error(chalk.dim(' 2. Start containers: docker compose up -d'));\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_DATABASE_URL: 'postgresql://user:password@localhost:5432/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 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 claude = spawn('claude', [\n '--permission-mode', 'bypassPermissions',\n '--mcp-config', mcpConfigPath,\n '--', leadPrompt,\n ], {\n stdio: 'inherit',\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 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}' && 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}' && \\\\\nclaude --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\";\n\nconst API_URL = process.env.SQUADS_API_URL || process.env.SCHEDULER_URL || \"http://localhost:8090\";\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\";\n\nconst API_URL =\n process.env.SQUADS_API_URL ||\n process.env.SCHEDULER_URL ||\n \"http://localhost:8090\";\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 });\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 });\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 console.error(chalk.red(error instanceof Error ? error.message : String(error)));\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 });\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 });\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 console.error(chalk.red(error instanceof Error ? error.message : String(error)));\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 });\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\nasync function apiFetch(path: string, options?: RequestInit): Promise<any> {\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();\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('/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?.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?.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?.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(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(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('/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?.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?.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","session","program","chalk","join","homedir","existsSync","colors","RESET","readFileSync"]}