squads-cli 0.4.8 → 0.4.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{chunk-IDZYXBZY.js → chunk-HIQ2APYR.js} +13 -269
- package/dist/chunk-HIQ2APYR.js.map +1 -0
- package/dist/chunk-HKWCBCEK.js +225 -0
- package/dist/chunk-HKWCBCEK.js.map +1 -0
- package/dist/chunk-NA3IECJA.js +288 -0
- package/dist/chunk-NA3IECJA.js.map +1 -0
- package/dist/cli.js +358 -573
- package/dist/cli.js.map +1 -1
- package/dist/{sessions-B6GVXJ2H.js → sessions-R4VWIGFR.js} +3 -2
- package/dist/terminal-JZSAQSN7.js +53 -0
- package/dist/terminal-JZSAQSN7.js.map +1 -0
- package/dist/update-MAY6EXFQ.js +17 -0
- package/dist/update-MAY6EXFQ.js.map +1 -0
- package/package.json +1 -1
- package/dist/chunk-IDZYXBZY.js.map +0 -1
- /package/dist/{sessions-B6GVXJ2H.js.map → sessions-R4VWIGFR.js.map} +0 -0
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli.ts","../src/version.ts","../src/lib/update.ts","../src/commands/init.ts","../src/lib/git.ts","../src/lib/telemetry.ts","../src/commands/run.ts","../src/lib/squad-parser.ts","../src/lib/permissions.ts","../src/commands/list.ts","../src/commands/status.ts","../src/commands/stack.ts","../src/commands/memory.ts","../src/commands/sync.ts","../src/commands/goal.ts","../src/commands/feedback.ts","../src/commands/dashboard.ts","../src/lib/providers.ts","../src/lib/costs.ts","../src/lib/db.ts","../src/commands/issues.ts","../src/commands/solve-issues.ts","../src/commands/open-issues.ts","../src/commands/login.ts","../src/lib/auth.ts","../src/commands/update.ts","../src/commands/progress.ts","../src/commands/results.ts","../src/commands/history.ts","../src/commands/health.ts","../src/commands/workers.ts","../src/commands/context-feed.ts","../src/commands/watch.ts","../src/commands/live.ts","../src/commands/top.ts","../src/commands/session.ts","../src/commands/trigger.ts","../src/commands/skill.ts","../src/lib/anthropic.ts","../src/commands/permissions.ts","../src/commands/context.ts","../src/commands/cost.ts","../src/lib/executions.ts","../src/commands/exec.ts","../src/commands/tonight.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';\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 {\n goalSetCommand,\n goalListCommand,\n goalCompleteCommand,\n goalProgressCommand\n} from './commands/goal.js';\nimport {\n feedbackAddCommand,\n feedbackShowCommand,\n feedbackStatsCommand\n} from './commands/feedback.js';\nimport { dashboardCommand } from './commands/dashboard.js';\nimport { issuesCommand } from './commands/issues.js';\nimport { solveIssuesCommand } from './commands/solve-issues.js';\nimport { openIssuesCommand } from './commands/open-issues.js';\nimport { loginCommand, logoutCommand, whoamiCommand } from './commands/login.js';\nimport { updateCommand } from './commands/update.js';\nimport { progressCommand, progressStartCommand, progressCompleteCommand } from './commands/progress.js';\nimport { resultsCommand } from './commands/results.js';\nimport { historyCommand } from './commands/history.js';\nimport { healthCommand } from './commands/health.js';\nimport { workersCommand } from './commands/workers.js';\nimport { contextFeedCommand } from './commands/context-feed.js';\nimport { watchCommand } from './commands/watch.js';\nimport { liveCommand } from './commands/live.js';\nimport { topCommand } from './commands/top.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 {\n stackInitCommand,\n stackStatusCommand,\n stackEnvCommand,\n stackUpCommand,\n stackDownCommand,\n stackHealthCommand,\n stackLogsCommand,\n applyStackConfig\n} from './commands/stack.js';\nimport { registerTriggerCommand } from './commands/trigger.js';\nimport { registerSkillCommand } from './commands/skill.js';\nimport { registerPermissionsCommand } from './commands/permissions.js';\nimport { contextShowCommand, contextListCommand } from './commands/context.js';\nimport { costCommand, budgetCheckCommand } from './commands/cost.js';\nimport { execListCommand, execShowCommand, execStatsCommand } from './commands/exec.js';\nimport {\n tonightCommand,\n tonightStatusCommand,\n tonightStopCommand,\n tonightReportCommand\n} from './commands/tonight.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\nconst program = new Command();\n\nprogram\n .name('squads')\n .description('A CLI for humans and agents')\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: (str, write) => write(str),\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\n// Init command\nprogram\n .command('init')\n .description('Initialize a new squad project')\n .option('-t, --template <template>', 'Project template', 'default')\n .option('--skip-infra', 'Skip infrastructure setup prompt')\n .action(initCommand);\n\n// Run command - runs squads or individual agents\nprogram\n .command('run <target>')\n .description('Run a squad or agent')\n .option('-v, --verbose', 'Verbose output')\n .option('-d, --dry-run', 'Show what would be run without executing')\n .option('-e, --execute', 'Execute agent via Claude CLI (requires claude installed)')\n .option('-a, --agent <agent>', 'Run specific agent within squad')\n .option('-t, --timeout <minutes>', 'Execution timeout in minutes (default: 30)', '30')\n .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('-f, --foreground', 'Run in foreground (no tmux, blocks terminal)')\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 .action((target, options) => runCommand(target, { ...options, timeout: parseInt(options.timeout, 10) }));\n\n// List command\nprogram\n .command('list')\n .description('List agents and squads')\n .option('-s, --squads', 'List squads only')\n .option('-a, --agents', 'List agents only')\n .action(listCommand);\n\n// Status command\nprogram\n .command('status [squad]')\n .description('Show squad status and state')\n .option('-v, --verbose', 'Show detailed status')\n .action(statusCommand);\n\n// Dashboard command\nprogram\n .command('dashboard')\n .alias('dash')\n .description('Show comprehensive goals and metrics dashboard')\n .option('-v, --verbose', 'Show additional details')\n .option('-c, --ceo', 'Executive summary with priorities and blockers')\n .option('-f, --full', 'Include GitHub PR/issue stats (slower, ~30s)')\n .action((options) => dashboardCommand({ ...options, fast: !options.full }));\n\n// Context command - show squad execution context (MCP, skills, budget, model)\nconst context = program\n .command('context')\n .description('View and manage squad execution context');\n\ncontext\n .command('show <squad>')\n .description('Show context for a squad (MCP, skills, model, budget)')\n .option('--json', 'Output as JSON')\n .action(contextShowCommand);\n\ncontext\n .command('list')\n .description('List context for all squads')\n .option('--json', 'Output as JSON')\n .action(contextListCommand);\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// 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// Issues command\nprogram\n .command('issues')\n .description('Show GitHub issues across repos')\n .option('-o, --org <org>', 'GitHub organization', 'agents-squads')\n .option('-r, --repos <repos>', 'Comma-separated repo names')\n .action(issuesCommand);\n\n// Solve issues command - close issues by creating PRs\nprogram\n .command('solve-issues')\n .description('Solve ready-to-fix issues by creating PRs')\n .option('-r, --repo <repo>', 'Target repo (hq, agents-squads-web)')\n .option('-i, --issue <number>', 'Specific issue number', parseInt)\n .option('-d, --dry-run', 'Show what would be solved')\n .option('-e, --execute', 'Execute with Claude CLI')\n .action(solveIssuesCommand);\n\n// Open issues command - run evaluators to find new issues\nprogram\n .command('open-issues')\n .description('Run evaluators/critics to find and create issues')\n .option('-s, --squad <squad>', 'Target squad (website, engineering, etc.)')\n .option('-a, --agent <agent>', 'Specific evaluator agent')\n .option('-d, --dry-run', 'Show what would run')\n .option('-e, --execute', 'Execute with Claude CLI')\n .action(openIssuesCommand);\n\n// Progress command - track agent task progress\nconst progress = program\n .command('progress')\n .description('Track active and completed agent tasks')\n .option('-v, --verbose', 'Show more activity')\n .action(progressCommand);\n\nprogress\n .command('start <squad> <description>')\n .description('Register a new active task')\n .action(progressStartCommand);\n\nprogress\n .command('complete <taskId>')\n .description('Mark a task as completed')\n .option('-f, --failed', 'Mark as failed instead')\n .action(progressCompleteCommand);\n\n// Results command - KPI goals vs actuals\nprogram\n .command('results [squad]')\n .description('Show squad results: git activity + KPI goals vs actuals')\n .option('-d, --days <days>', 'Days to look back', '7')\n .option('-v, --verbose', 'Show detailed KPIs per goal')\n .action((squad, options) => resultsCommand({ ...options, squad }));\n\n// 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// Context feed command - context injection for agents\nprogram\n .command('context-feed')\n .alias('feed')\n .description('Context feed for agents: 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// Workers command - show running processes and tasks\nprogram\n .command('workers')\n .description('Show active workers: Claude sessions, tasks, dev servers')\n .option('-v, --verbose', 'Show more details')\n .option('-k, --kill <pid>', 'Kill a process by PID')\n .action(workersCommand);\n\n// 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// Watch command - live refresh any command\nprogram\n .command('watch <command> [args...]')\n .description('Live refresh any squads command (like Unix watch)')\n .option('-n, --interval <seconds>', 'Refresh interval in seconds', '2')\n .option('--no-clear', 'Don\\'t clear screen between refreshes')\n .action((command, args, options) => watchCommand(command, args, {\n interval: parseInt(options.interval, 10),\n clear: options.clear\n }));\n\n// Live command - TUI dashboard\nprogram\n .command('live')\n .description('Live TUI dashboard with real-time metrics (like htop)')\n .option('-m, --minimal', 'Minimal view')\n .option('-f, --focus <panel>', 'Focus on specific panel (agents, cost, activity, memory)')\n .action((options) => liveCommand(options));\n\n// Top command - live process table like Unix top\nprogram\n .command('top')\n .description('Live process table (like Unix top) - numbers update in place')\n .action(() => topCommand());\n\n// Memory command group\nconst memory = program\n .command('memory')\n .description('Query and manage squad memory')\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\nmemory\n .command('show <squad>')\n .description('Show memory for a squad')\n .action(memoryShowCommand);\n\nmemory\n .command('update <squad> <content>')\n .description('Add to squad memory')\n .option('-a, --agent <agent>', 'Specific agent (default: squad-lead)')\n .option('-t, --type <type>', 'Memory type: state, learnings, feedback', 'learnings')\n .action(memoryUpdateCommand);\n\nmemory\n .command('list')\n .description('List all memory entries')\n .action(memoryListCommand);\n\nmemory\n .command('sync')\n .description('Sync memory from git: pull remote changes, process commits, optionally push')\n .option('-v, --verbose', 'Show detailed commit info')\n .option('-p, --push', 'Push local memory changes to remote after sync')\n .option('--no-pull', 'Skip pulling from remote')\n .action((options) => syncCommand({ verbose: options.verbose, push: options.push, pull: options.pull }));\n\nmemory\n .command('search <query>')\n .description('Search conversations stored in postgres (via squads-bridge)')\n .option('-l, --limit <limit>', 'Number of results', '10')\n .option('-r, --role <role>', 'Filter by role: user, assistant, thinking')\n .option('-i, --importance <importance>', 'Filter by importance: low, normal, high')\n .action((query, opts) => memorySearchCommand(query, {\n limit: parseInt(opts.limit, 10),\n role: opts.role,\n importance: opts.importance\n }));\n\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// 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 .action(goalListCommand);\n\ngoal\n .command('complete <squad> <index>')\n .description('Mark a goal as completed')\n .action(goalCompleteCommand);\n\ngoal\n .command('progress <squad> <index> <progress>')\n .description('Update goal progress')\n .action(goalProgressCommand);\n\n// Feedback command group\nconst feedback = program\n .command('feedback')\n .description('Record and view execution feedback');\n\nfeedback\n .command('add <squad> <rating> <feedback>')\n .description('Add feedback for last execution (rating 1-5)')\n .option('-l, --learning <learnings...>', 'Learnings to extract')\n .action(feedbackAddCommand);\n\nfeedback\n .command('show <squad>')\n .description('Show feedback history')\n .option('-n, --limit <n>', 'Number of entries to show', '5')\n .action(feedbackShowCommand);\n\nfeedback\n .command('stats')\n .description('Show feedback summary across all squads')\n .action(feedbackStatsCommand);\n\n// Sessions command group - list active sessions and history\nconst sessions = program\n .command('sessions')\n .description('Show active Claude Code sessions across squads')\n .option('-v, --verbose', 'Show session details')\n .option('-j, --json', 'Output as JSON')\n .action(sessionsCommand);\n\nsessions\n .command('history')\n .description('Show session history and statistics')\n .option('-d, --days <days>', 'Days of history to show', '7')\n .option('-s, --squad <squad>', 'Filter by squad')\n .option('-j, --json', 'Output as JSON')\n .action((options) => sessionsHistoryCommand({\n days: parseInt(options.days, 10),\n squad: options.squad,\n json: options.json,\n }));\n\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// Stack command group - manage local Docker stack\nconst stack = program\n .command('stack')\n .description('Manage local Docker stack (postgres, redis, langfuse, bridge)');\n\nstack\n .command('init')\n .description('Auto-detect Docker containers and configure CLI connection')\n .action(stackInitCommand);\n\nstack\n .command('status')\n .description('Show container health and connection status')\n .action(stackStatusCommand);\n\nstack\n .command('env')\n .description('Print environment variables for shell export')\n .action(stackEnvCommand);\n\nstack\n .command('up')\n .description('Start Docker containers via docker-compose')\n .action(stackUpCommand);\n\nstack\n .command('down')\n .description('Stop Docker containers')\n .action(stackDownCommand);\n\nstack\n .command('health')\n .description('Comprehensive health check with diagnostics')\n .option('-v, --verbose', 'Show logs for unhealthy services')\n .action((options) => stackHealthCommand(options.verbose));\n\nstack\n .command('logs <service>')\n .description('Show logs for a service (postgres, redis, neo4j, bridge, langfuse, mem0, engram)')\n .option('-n, --tail <lines>', 'Number of lines to show', '50')\n .action((service, options) => stackLogsCommand(service, parseInt(options.tail, 10)));\n\n// Trigger command group - smart value-driven triggers\nregisterTriggerCommand(program);\n\n// Skill command group - Agent Skills API\nregisterSkillCommand(program);\n\n// Permissions command group - Phase 3 execution contexts\nregisterPermissionsCommand(program);\n\n// Tonight command group - autonomous overnight execution\nconst tonight = program\n .command('tonight')\n .description('Run agents autonomously overnight with safety limits');\n\ntonight\n .command('run <targets...>')\n .description('Start tonight mode with specified squads/agents')\n .option('-c, --cost-cap <usd>', 'Max USD to spend (default: 50)', '50')\n .option('-s, --stop-at <time>', 'Stop time HH:MM (default: 07:00)', '07:00')\n .option('-r, --max-retries <n>', 'Max restarts per agent (default: 3)', '3')\n .option('-d, --dry-run', 'Show what would run without executing')\n .option('-v, --verbose', 'Verbose output')\n .action((targets, options) => tonightCommand(targets, {\n costCap: parseFloat(options.costCap),\n stopAt: options.stopAt,\n maxRetries: parseInt(options.maxRetries, 10),\n dryRun: options.dryRun,\n verbose: options.verbose,\n }));\n\ntonight\n .command('status')\n .description('Check tonight mode status')\n .action(tonightStatusCommand);\n\ntonight\n .command('stop')\n .description('Stop all tonight agents and generate report')\n .action(tonightStopCommand);\n\ntonight\n .command('report')\n .description('Show latest tonight report')\n .action(tonightReportCommand);\n\n// Auth commands\nprogram\n .command('login')\n .description('Log in to Squads (Pro & Enterprise)')\n .action(loginCommand);\n\nprogram\n .command('logout')\n .description('Log out from Squads')\n .action(logoutCommand);\n\nprogram\n .command('whoami')\n .description('Show current logged in user')\n .action(whoamiCommand);\n\n// Update command\nprogram\n .command('update')\n .description('Check for and install updates')\n .option('-y, --yes', 'Auto-confirm update without prompting')\n .option('-c, --check', 'Check for updates without installing')\n .action((options) => updateCommand(options));\n\n// 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// 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('\\nPossible fixes:'));\n console.error(chalk.dim(' 1. Check if Docker containers are running: squads stack status'));\n console.error(chalk.dim(' 2. Start the stack: squads stack up'));\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// Show help if no command provided\nif (!process.argv.slice(2).length) {\n console.log(`\n${chalk.bold.magenta('squads')} - AI agent squad management\n\n${chalk.dim('Quick start:')}\n ${chalk.cyan('squads status')} View all squads status\n ${chalk.cyan('squads run <squad>')} Run a squad\n ${chalk.cyan('squads memory query \"<term>\"')} Search squad memory\n\n${chalk.dim('Goals & Feedback:')}\n ${chalk.cyan('squads goal set <squad> \"<goal>\"')} Set a goal\n ${chalk.cyan('squads goal list')} View active goals\n ${chalk.cyan('squads feedback add <squad> 4 \"msg\"')} Rate last execution\n\n${chalk.dim('Smart Triggers:')}\n ${chalk.cyan('squads trigger list')} View all triggers\n ${chalk.cyan('squads trigger sync')} Sync from SQUAD.md\n ${chalk.cyan('squads trigger fire <name>')} Manually fire trigger\n\n${chalk.dim('Examples:')}\n ${chalk.cyan('squads run website')} Run website squad\n ${chalk.cyan('squads goal set finance \"Track costs\"')} Set finance goal\n ${chalk.cyan('squads trigger status')} Scheduler health\n\n${chalk.dim('Run')} ${chalk.cyan('squads --help')} ${chalk.dim('for all commands.')}\n`);\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 * Update checker for squads-cli\n * Checks npm registry for newer versions and caches result\n */\n\nimport { existsSync, readFileSync, writeFileSync, mkdirSync, unlinkSync } from 'fs';\nimport { join, dirname } from 'path';\nimport { homedir } from 'os';\nimport { execSync } from 'child_process';\nimport { fileURLToPath } from 'url';\n\n// Get current version from package.json\nfunction getPackageVersion(): string {\n try {\n // Try to find package.json relative to this module\n const __filename = fileURLToPath(import.meta.url);\n const __dirname = dirname(__filename);\n\n // Look up from dist/lib to find package.json\n const possiblePaths = [\n join(__dirname, '..', '..', 'package.json'), // From dist/lib/\n join(__dirname, '..', 'package.json'), // From dist/\n join(__dirname, 'package.json'), // Same dir\n ];\n\n for (const pkgPath of possiblePaths) {\n if (existsSync(pkgPath)) {\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'));\n return pkg.version || '0.0.0';\n }\n }\n } catch {\n // Ignore errors\n }\n return '0.0.0';\n}\n\nconst CURRENT_VERSION = getPackageVersion();\n\n// Cache settings\nconst CACHE_DIR = join(homedir(), '.squads');\nconst CACHE_FILE = join(CACHE_DIR, 'update-check.json');\nconst CACHE_TTL_MS = 24 * 60 * 60 * 1000; // 24 hours\n\ninterface UpdateCache {\n latestVersion: string;\n checkedAt: number;\n}\n\nexport interface UpdateInfo {\n currentVersion: string;\n latestVersion: string;\n updateAvailable: boolean;\n}\n\n/**\n * Compare semantic versions\n * Returns true if v2 > v1\n */\nfunction isNewerVersion(v1: string, v2: string): boolean {\n const parts1 = v1.replace(/^v/, '').split('.').map(Number);\n const parts2 = v2.replace(/^v/, '').split('.').map(Number);\n\n for (let i = 0; i < 3; i++) {\n const p1 = parts1[i] || 0;\n const p2 = parts2[i] || 0;\n if (p2 > p1) return true;\n if (p2 < p1) return false;\n }\n return false;\n}\n\n/**\n * Read cached update info\n */\nfunction readCache(): UpdateCache | null {\n try {\n if (!existsSync(CACHE_FILE)) return null;\n const data = JSON.parse(readFileSync(CACHE_FILE, 'utf-8'));\n return data as UpdateCache;\n } catch {\n return null;\n }\n}\n\n/**\n * Write update info to cache\n */\nfunction writeCache(latestVersion: string): void {\n try {\n if (!existsSync(CACHE_DIR)) {\n mkdirSync(CACHE_DIR, { recursive: true });\n }\n const cache: UpdateCache = {\n latestVersion,\n checkedAt: Date.now(),\n };\n writeFileSync(CACHE_FILE, JSON.stringify(cache, null, 2));\n } catch {\n // Ignore cache write errors\n }\n}\n\n/**\n * Fetch latest version from npm registry\n */\nfunction fetchLatestVersion(): string | null {\n try {\n const result = execSync('npm view squads-cli version 2>/dev/null', {\n encoding: 'utf-8',\n timeout: 5000,\n }).trim();\n return result || null;\n } catch {\n return null;\n }\n}\n\n/**\n * Check for updates (uses cache to avoid frequent npm calls)\n * Non-blocking: returns cached data immediately, triggers background refresh if stale\n */\nexport function checkForUpdate(): UpdateInfo {\n const result: UpdateInfo = {\n currentVersion: CURRENT_VERSION,\n latestVersion: CURRENT_VERSION,\n updateAvailable: false,\n };\n\n // Check cache first\n const cache = readCache();\n const now = Date.now();\n\n if (cache) {\n // Always use cached value immediately for fast response\n result.latestVersion = cache.latestVersion;\n result.updateAvailable = isNewerVersion(CURRENT_VERSION, cache.latestVersion);\n\n // If cache is stale, trigger background refresh (non-blocking)\n if ((now - cache.checkedAt) >= CACHE_TTL_MS) {\n // Fire and forget - don't await\n triggerBackgroundRefresh();\n }\n return result;\n }\n\n // No cache at all - trigger background refresh and return defaults\n triggerBackgroundRefresh();\n return result;\n}\n\n/**\n * Trigger a background version check that doesn't block the CLI\n * Uses spawn to run npm in a detached process\n */\nfunction triggerBackgroundRefresh(): void {\n try {\n // Use spawn with detached: true to run in background\n // This won't block the main process\n const { spawn } = require('child_process') as typeof import('child_process');\n const child = spawn('npm', ['view', 'squads-cli', 'version'], {\n detached: true,\n stdio: ['ignore', 'pipe', 'ignore'],\n shell: true,\n });\n\n // Collect output\n let output = '';\n child.stdout?.on('data', (data: Buffer) => {\n output += data.toString();\n });\n\n child.on('close', () => {\n const version = output.trim();\n if (version && /^\\d+\\.\\d+\\.\\d+/.test(version)) {\n writeCache(version);\n }\n });\n\n // Unref to allow main process to exit\n child.unref();\n } catch {\n // Ignore errors - background refresh is best effort\n }\n}\n\n/**\n * Get current version\n */\nexport function getCurrentVersion(): string {\n return CURRENT_VERSION;\n}\n\n/**\n * Perform the actual update via npm\n * Returns true if successful\n */\nexport function performUpdate(): { success: boolean; error?: string } {\n try {\n execSync('npm update -g squads-cli', {\n encoding: 'utf-8',\n stdio: 'inherit',\n timeout: 120000, // 2 minutes\n });\n // Clear cache so next check fetches fresh\n try {\n unlinkSync(CACHE_FILE);\n } catch {\n // Ignore\n }\n return { success: true };\n } catch (err) {\n return {\n success: false,\n error: err instanceof Error ? err.message : 'Unknown error',\n };\n }\n}\n\n/**\n * Force refresh the version cache (bypass TTL)\n */\nexport function refreshVersionCache(): UpdateInfo {\n const latestVersion = fetchLatestVersion();\n if (latestVersion) {\n writeCache(latestVersion);\n return {\n currentVersion: CURRENT_VERSION,\n latestVersion,\n updateAvailable: isNewerVersion(CURRENT_VERSION, latestVersion),\n };\n }\n return checkForUpdate();\n}\n\n// Auto-update settings\nconst AUTO_UPDATE_CACHE_FILE = join(CACHE_DIR, 'auto-update.json');\nconst AUTO_UPDATE_COOLDOWN_MS = 60 * 60 * 1000; // 1 hour cooldown between auto-update attempts\n\ninterface AutoUpdateCache {\n lastAttempt: number;\n lastSuccess?: number;\n}\n\nfunction readAutoUpdateCache(): AutoUpdateCache | null {\n try {\n if (!existsSync(AUTO_UPDATE_CACHE_FILE)) return null;\n return JSON.parse(readFileSync(AUTO_UPDATE_CACHE_FILE, 'utf-8'));\n } catch {\n return null;\n }\n}\n\nfunction writeAutoUpdateCache(cache: AutoUpdateCache): void {\n try {\n if (!existsSync(CACHE_DIR)) {\n mkdirSync(CACHE_DIR, { recursive: true });\n }\n writeFileSync(AUTO_UPDATE_CACHE_FILE, JSON.stringify(cache, null, 2));\n } catch {\n // Ignore errors\n }\n}\n\n/**\n * Seamless auto-update on CLI startup (like Gemini CLI)\n * Checks for updates and auto-installs without prompting.\n * Shows a message on success: \"Update successful! The new version will be used on your next run.\"\n *\n * @param silent - If true, don't show any output (for background checks)\n * @returns Promise that resolves when check/update is complete\n */\nexport async function autoUpdateOnStartup(silent = false): Promise<void> {\n // Skip in CI or if auto-update disabled\n if (process.env.CI || process.env.SQUADS_NO_AUTO_UPDATE) return;\n\n // Check cooldown - don't spam npm\n const autoCache = readAutoUpdateCache();\n const now = Date.now();\n if (autoCache && (now - autoCache.lastAttempt) < AUTO_UPDATE_COOLDOWN_MS) {\n return; // Too soon since last attempt\n }\n\n // Check if update is available\n const info = checkForUpdate();\n if (!info.updateAvailable) return;\n\n // Write attempt timestamp before trying\n writeAutoUpdateCache({ lastAttempt: now, lastSuccess: autoCache?.lastSuccess });\n\n // Perform update silently in background using spawn\n try {\n const { spawn } = await import('child_process');\n\n // Run npm update in background\n const child = spawn('npm', ['update', '-g', 'squads-cli'], {\n detached: true,\n stdio: silent ? 'ignore' : ['ignore', 'pipe', 'pipe'],\n shell: true,\n });\n\n if (!silent && child.stdout) {\n // Wait for completion and check result\n await new Promise<void>((resolve) => {\n child.on('close', (code) => {\n if (code === 0) {\n // Success - show Gemini-style message\n console.log(`\\n \\x1b[32m✓\\x1b[0m Update successful! v${info.latestVersion} will be used on your next run.\\n`);\n writeAutoUpdateCache({ lastAttempt: now, lastSuccess: now });\n // Clear version cache so next startup detects new version\n try { unlinkSync(CACHE_FILE); } catch { /* ignore */ }\n }\n resolve();\n });\n\n // Timeout after 30 seconds\n setTimeout(() => resolve(), 30000);\n });\n } else {\n // Silent mode - just fire and forget\n child.unref();\n }\n } catch {\n // Ignore errors - auto-update is best effort\n }\n}\n","import chalk from 'chalk';\nimport ora from 'ora';\nimport fs from 'fs/promises';\nimport path from 'path';\nimport { execSync, spawn } from 'child_process';\nimport { createInterface } from 'readline';\nimport { checkGitStatus, getRepoName } from '../lib/git.js';\nimport { track, Events } from '../lib/telemetry.js';\n\ninterface InitOptions {\n template: string;\n skipInfra?: boolean;\n}\n\n// Simple yes/no prompt\nasync function confirm(question: string, defaultYes = true): Promise<boolean> {\n const rl = createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n const suffix = defaultYes ? '[Y/n]' : '[y/N]';\n\n return new Promise((resolve) => {\n rl.question(` ${question} ${chalk.dim(suffix)} `, (answer) => {\n rl.close();\n const normalized = answer.toLowerCase().trim();\n if (normalized === '') {\n resolve(defaultYes);\n } else {\n resolve(normalized === 'y' || normalized === 'yes');\n }\n });\n });\n}\n\n// Optional email prompt for updates\nasync function promptEmail(): Promise<string | null> {\n const rl = createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n return new Promise((resolve) => {\n rl.question(` ${chalk.dim('📬 Get product updates? (optional, Enter to skip):')} `, (answer) => {\n rl.close();\n const email = answer.trim();\n\n // Skip if empty\n if (!email) {\n resolve(null);\n return;\n }\n\n // Basic email validation\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n if (emailRegex.test(email)) {\n resolve(email);\n } else {\n console.log(chalk.dim(' Invalid email, skipping...'));\n resolve(null);\n }\n });\n });\n}\n\n// Check if a command exists\nfunction commandExists(cmd: string): boolean {\n try {\n execSync(`which ${cmd}`, { stdio: 'ignore' });\n return true;\n } catch {\n return false;\n }\n}\n\n// Check if Docker is running\nfunction dockerRunning(): boolean {\n try {\n execSync('docker info', { stdio: 'ignore' });\n return true;\n } catch {\n return false;\n }\n}\n\ninterface RequirementCheck {\n name: string;\n status: 'ok' | 'missing' | 'warning';\n message?: string;\n hint?: string;\n}\n\n// Check if Claude CLI is installed and logged in\nfunction checkClaudeAuth(): { installed: boolean; loggedIn: boolean } {\n try {\n execSync('which claude', { stdio: 'ignore' });\n } catch {\n return { installed: false, loggedIn: false };\n }\n\n try {\n // Check if claude is authenticated\n const result = execSync('claude --version', { stdio: 'pipe' }).toString();\n // If we get here, claude is installed. Check auth status.\n // Claude CLI doesn't have a direct \"am I logged in\" check, but if it works, assume ok\n return { installed: true, loggedIn: result.includes('claude') };\n } catch {\n return { installed: true, loggedIn: false };\n }\n}\n\n// Check if gh CLI is authenticated\nfunction checkGhAuth(): boolean {\n try {\n execSync('gh auth status', { stdio: 'ignore' });\n return true;\n } catch {\n return false;\n }\n}\n\nfunction checkRequirements(): RequirementCheck[] {\n const checks: RequirementCheck[] = [];\n\n // Check Claude CLI (subscription-based auth)\n const claudeStatus = checkClaudeAuth();\n if (claudeStatus.installed && claudeStatus.loggedIn) {\n checks.push({ name: 'Claude CLI', status: 'ok' });\n } else if (claudeStatus.installed) {\n checks.push({\n name: 'Claude CLI',\n status: 'warning',\n message: 'Installed but may need login',\n hint: 'Run: claude login',\n });\n } else {\n checks.push({\n name: 'Claude CLI',\n status: 'missing',\n message: 'Required to run agents',\n hint: 'Install: npm install -g @anthropic-ai/claude-code',\n });\n }\n\n // Check GitHub CLI auth (not raw token)\n if (checkGhAuth()) {\n checks.push({ name: 'GitHub CLI', status: 'ok' });\n } else if (commandExists('gh')) {\n checks.push({\n name: 'GitHub CLI',\n status: 'warning',\n message: 'Installed but not logged in',\n hint: 'Run: gh auth login',\n });\n } else {\n checks.push({\n name: 'GitHub CLI',\n status: 'missing',\n message: 'Required for GitHub integration (issues, PRs)',\n hint: 'Install: https://cli.github.com',\n });\n }\n\n // Check Docker\n if (commandExists('docker')) {\n if (dockerRunning()) {\n checks.push({ name: 'Docker', status: 'ok' });\n } else {\n checks.push({\n name: 'Docker',\n status: 'warning',\n message: 'Installed but not running',\n hint: 'Start Docker Desktop or run: sudo systemctl start docker',\n });\n }\n } else {\n checks.push({\n name: 'Docker',\n status: 'warning',\n message: 'Optional - enables dashboard metrics',\n hint: 'Install: https://docker.com',\n });\n }\n\n return checks;\n}\n\nasync function setupInfrastructure(cwd: string): Promise<boolean> {\n const spinner = ora('Setting up infrastructure...').start();\n\n try {\n // Find docker-compose.yml - check if it's bundled with CLI or in current dir\n let dockerDir: string | null = null;\n\n // Check current directory\n const localDockerCompose = path.join(cwd, 'docker', 'docker-compose.yml');\n const localDockerComposeRoot = path.join(cwd, 'docker-compose.yml');\n\n if (await fileExists(localDockerCompose)) {\n dockerDir = path.join(cwd, 'docker');\n } else if (await fileExists(localDockerComposeRoot)) {\n dockerDir = cwd;\n } else {\n // Try to find bundled docker files from CLI package\n const cliPath = new URL('../..', import.meta.url).pathname;\n const bundledDockerCompose = path.join(cliPath, 'docker', 'docker-compose.yml');\n\n if (await fileExists(bundledDockerCompose)) {\n // Copy docker files to project\n spinner.text = 'Copying infrastructure files...';\n const targetDockerDir = path.join(cwd, 'docker');\n await fs.mkdir(targetDockerDir, { recursive: true });\n\n // Copy essential files\n const filesToCopy = [\n 'docker-compose.yml',\n '.env.example',\n 'init-db.sql',\n 'README.md',\n ];\n\n for (const file of filesToCopy) {\n const src = path.join(cliPath, 'docker', file);\n const dest = path.join(targetDockerDir, file);\n if (await fileExists(src)) {\n await fs.copyFile(src, dest);\n }\n }\n\n // Copy squads-bridge directory\n const bridgeSrc = path.join(cliPath, 'docker', 'squads-bridge');\n const bridgeDest = path.join(targetDockerDir, 'squads-bridge');\n if (await fileExists(bridgeSrc)) {\n await copyDir(bridgeSrc, bridgeDest);\n }\n\n // Create .env from example if not exists\n const envExample = path.join(targetDockerDir, '.env.example');\n const envFile = path.join(targetDockerDir, '.env');\n if (await fileExists(envExample) && !(await fileExists(envFile))) {\n await fs.copyFile(envExample, envFile);\n }\n\n dockerDir = targetDockerDir;\n }\n }\n\n if (!dockerDir) {\n spinner.fail('Could not find docker-compose.yml');\n console.log(chalk.dim(' Try cloning the full repo: git clone https://github.com/agents-squads/hq'));\n return false;\n }\n\n spinner.text = 'Starting containers...';\n\n // Run docker compose\n await new Promise<void>((resolve, reject) => {\n const proc = spawn('docker', ['compose', 'up', '-d'], {\n cwd: dockerDir!,\n stdio: 'pipe',\n });\n\n let stderr = '';\n proc.stderr?.on('data', (data) => {\n stderr += data.toString();\n });\n\n proc.on('close', (code) => {\n if (code === 0) {\n resolve();\n } else {\n reject(new Error(stderr || `docker compose failed with code ${code}`));\n }\n });\n\n proc.on('error', reject);\n });\n\n spinner.text = 'Waiting for services to be ready...';\n\n // Wait a bit for services to start\n await sleep(3000);\n\n // Verify services\n const services = ['squads-postgres', 'squads-redis', 'squads-bridge'];\n let allRunning = true;\n\n for (const service of services) {\n try {\n execSync(`docker ps --filter \"name=${service}\" --filter \"status=running\" -q`, { stdio: 'pipe' });\n } catch {\n allRunning = false;\n }\n }\n\n if (allRunning) {\n spinner.succeed('Infrastructure ready');\n console.log();\n console.log(chalk.dim(' Services running:'));\n console.log(chalk.dim(' • postgres:5432 • redis:6379 • bridge:8088'));\n return true;\n } else {\n spinner.warn('Some services may not be running');\n console.log(chalk.dim(' Check with: docker ps'));\n return true; // Still consider it a success, user can debug\n }\n\n } catch (error) {\n spinner.fail('Failed to start infrastructure');\n console.log(chalk.dim(` ${error}`));\n console.log(chalk.dim(' Try manually: cd docker && docker compose up -d'));\n return false;\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\nasync function copyDir(src: string, dest: string): Promise<void> {\n await fs.mkdir(dest, { recursive: true });\n const entries = await fs.readdir(src, { withFileTypes: true });\n\n for (const entry of entries) {\n const srcPath = path.join(src, entry.name);\n const destPath = path.join(dest, entry.name);\n\n if (entry.isDirectory()) {\n await copyDir(srcPath, destPath);\n } else {\n await fs.copyFile(srcPath, destPath);\n }\n }\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport async function initCommand(options: InitOptions): Promise<void> {\n const cwd = process.cwd();\n\n console.log();\n console.log(chalk.bold(' Checking requirements...'));\n console.log();\n\n // Check requirements\n const checks = checkRequirements();\n let hasMissingRequired = false;\n let hasDocker = false;\n let dockerReady = false;\n\n for (const check of checks) {\n if (check.status === 'ok') {\n console.log(` ${chalk.green('✓')} ${check.name}`);\n if (check.name === 'Docker') {\n hasDocker = true;\n dockerReady = true;\n }\n } else if (check.status === 'missing') {\n console.log(` ${chalk.yellow('⚠')} ${chalk.yellow(check.name)}`);\n if (check.message) {\n console.log(chalk.dim(` ${check.message}`));\n }\n if (check.hint) {\n console.log(chalk.dim(` → ${check.hint}`));\n }\n if (check.name !== 'Docker') {\n hasMissingRequired = true;\n }\n } else if (check.status === 'warning') {\n console.log(` ${chalk.dim('○')} ${check.name} ${chalk.dim(`(${check.message})`)}`);\n if (check.hint) {\n console.log(chalk.dim(` → ${check.hint}`));\n }\n if (check.name === 'Docker') {\n hasDocker = commandExists('docker');\n }\n }\n }\n\n console.log();\n\n if (hasMissingRequired) {\n console.log(chalk.yellow(' Install missing tools to continue, then run squads init again.'));\n console.log();\n\n // Track init failure for analytics\n track(Events.CLI_INIT, {\n success: false,\n reason: 'missing_requirements',\n });\n return;\n }\n\n // Check Git status\n console.log(chalk.dim(' Checking project setup...'));\n console.log();\n\n const gitStatus = checkGitStatus(cwd);\n\n if (!gitStatus.isGitRepo) {\n console.log(` ${chalk.yellow('⚠')} No git repository found`);\n console.log(chalk.dim(' Run: git init && git remote add origin <repo-url>'));\n console.log();\n } else {\n console.log(` ${chalk.green('✓')} Git repository`);\n if (gitStatus.hasRemote) {\n const repoName = getRepoName(gitStatus.remoteUrl);\n console.log(` ${chalk.green('✓')} Remote: ${chalk.cyan(repoName || gitStatus.remoteUrl)}`);\n }\n }\n\n console.log();\n\n // Create project structure\n const spinner = ora('Creating squad structure...').start();\n\n try {\n // Create directory structure\n const dirs = [\n '.agents/squads',\n '.agents/squads/demo',\n '.agents/memory',\n '.agents/outputs',\n '.claude',\n ];\n\n for (const dir of dirs) {\n await fs.mkdir(path.join(cwd, dir), { recursive: true });\n }\n\n // Create demo squad\n const demoSquadMd = `# Demo Squad\n\nDemonstrates squads functionality with safe, educational examples.\n\n## Goals\n\n- [ ] Run the demo agents and explore the dashboard\n\n## Agents\n\n| Agent | Purpose |\n|-------|---------|\n| welcome | Creates a welcome GitHub issue |\n| analyzer | Analyzes project structure |\n\n## Triggers\n\nNone (manual execution only)\n\n## Usage\n\n\\`\\`\\`bash\nsquads run demo\n\\`\\`\\`\n\nThis will:\n1. Create a GitHub issue explaining what happened\n2. Analyze your project structure\n3. Show results in the dashboard\n\nAll demo data is clearly labeled [demo] so you can distinguish it from real data.\n`;\n\n await fs.writeFile(\n path.join(cwd, '.agents/squads/demo/SQUAD.md'),\n demoSquadMd\n );\n\n // Create demo welcome agent\n const welcomeAgent = `# Welcome Agent\n\n## Purpose\nCreate a welcome GitHub issue to demonstrate squads functionality.\n\n## Model\nclaude-haiku-3-5\n\n## Tools\n- Bash (gh cli)\n\n## Instructions\n1. Check if a welcome issue already exists\n2. If not, create a new issue titled \"[Demo] Welcome to Squads!\"\n3. The issue body should explain:\n - What just happened (squads run demo executed this agent)\n - What squads are and how they work\n - Next steps to create their own agents\n\n## Output\nConfirmation message with issue URL.\n\n## Labels\n- demo\n- automated\n`;\n\n await fs.writeFile(\n path.join(cwd, '.agents/squads/demo/welcome.md'),\n welcomeAgent\n );\n\n // Create demo analyzer agent\n const analyzerAgent = `# Project Analyzer Agent\n\n## Purpose\nAnalyze project structure and provide insights.\n\n## Model\nclaude-haiku-3-5\n\n## Tools\n- Read\n- Glob\n- Bash (ls, find)\n\n## Instructions\n1. Scan the project directory structure\n2. Identify key files (package.json, Cargo.toml, pyproject.toml, etc.)\n3. Summarize the tech stack\n4. Create a brief report\n\n## Output\nMarkdown report saved to .agents/outputs/demo/project-analysis.md\n\n## Labels\n- demo\n- analysis\n`;\n\n await fs.writeFile(\n path.join(cwd, '.agents/squads/demo/analyzer.md'),\n analyzerAgent\n );\n\n // Create Claude Code settings with hooks\n const claudeSettings = {\n hooks: {\n SessionStart: [\n {\n hooks: [\n {\n type: 'command',\n command: 'squads status',\n timeout: 10,\n },\n ],\n },\n ],\n Stop: [\n {\n hooks: [\n {\n type: 'command',\n command: 'squads memory sync',\n timeout: 15,\n },\n ],\n },\n ],\n },\n };\n\n await fs.writeFile(\n path.join(cwd, '.claude/settings.json'),\n JSON.stringify(claudeSettings, null, 2)\n );\n\n // Create git commit template\n const commitTemplate = `\n# Commit message format:\n# <type>(<scope>): <subject>\n#\n# 🤖 Generated with [Agents Squads](https://agents-squads.com)\n# Co-Authored-By: Claude <model> <noreply@anthropic.com>\n`;\n\n await fs.writeFile(\n path.join(cwd, '.agents/commit-template.txt'),\n commitTemplate\n );\n\n // Create CLAUDE.md if it doesn't exist\n const claudeMdPath = path.join(cwd, 'CLAUDE.md');\n if (!(await fileExists(claudeMdPath))) {\n await fs.writeFile(\n claudeMdPath,\n `# Project Instructions\n\n## What is Squads?\n\nSquads is a framework for building AI agent teams that automate real work.\nEach **squad** is a team of **agents** (markdown prompts) that execute via Claude.\n\n## For Claude (READ THIS)\n\nWhen helping users with squad-related tasks:\n\n### Check Context First\n\\`\\`\\`bash\nsquads status # What squads exist?\nsquads memory query \"X\" # What do we know about X?\n\\`\\`\\`\n\n### Creating Agents\nAgents live in \\`.agents/squads/<squad-name>/<agent-name>.md\\`:\n\n\\`\\`\\`markdown\n# Agent Name\n\n## Purpose\nOne sentence: what this agent does.\n\n## Instructions\n1. Specific step\n2. Another step\n3. Output location\n\n## Output\nWhat it produces and where it goes.\n\\`\\`\\`\n\n### Running Agents\n\\`\\`\\`bash\nsquads run <squad> # Run all agents in squad\nsquads run <squad>/<agent> # Run specific agent\n\\`\\`\\`\n\n### Tracking Progress\n\\`\\`\\`bash\nsquads dash # Full dashboard with goals\nsquads goal list # View all goals\nsquads goal set <squad> \"X\" # Add a goal\n\\`\\`\\`\n\n### Common User Requests\n\n| User says | You should |\n|-----------|------------|\n| \"Create an agent to...\" | Create \\`.agents/squads/<squad>/<name>.md\\` |\n| \"Automate X\" | Create agent, then \\`squads run\\` |\n| \"What's the status?\" | Run \\`squads dash\\` or \\`squads status\\` |\n| \"Run the X agent\" | \\`squads run <squad>/x\\` |\n| \"Check memory\" | \\`squads memory query \"<topic>\"\\` |\n\n## Quick Reference\n\n\\`\\`\\`bash\nsquads status # Overview\nsquads dash # Full dashboard\nsquads run demo # Try demo squad\nsquads list # All agents\nsquads memory query X # Search memory\nsquads goal list # View goals\n\\`\\`\\`\n\n## Project Structure\n\n\\`\\`\\`\n.agents/\n├── squads/ # Agent teams\n│ └── <squad>/\n│ ├── SQUAD.md # Squad definition\n│ └── *.md # Agent files\n├── memory/ # Persistent context\n└── outputs/ # Agent outputs\n\\`\\`\\`\n`\n );\n }\n\n spinner.succeed('Squad structure created');\n\n // Track successful initialization\n await track(Events.CLI_INIT, {\n success: true,\n hasGit: gitStatus.isGitRepo,\n hasRemote: gitStatus.hasRemote,\n template: options.template,\n hasDocker,\n });\n\n } catch (error) {\n spinner.fail('Failed to create structure');\n console.error(chalk.red(` ${error}`));\n\n // Track init failure\n track(Events.CLI_INIT, {\n success: false,\n reason: 'structure_creation_failed',\n error: String(error),\n });\n process.exit(1);\n }\n\n // Offer infrastructure setup if Docker is available\n if (!options.skipInfra && hasDocker) {\n console.log();\n\n if (!dockerReady) {\n console.log(chalk.dim(' Docker is installed but not running.'));\n console.log(chalk.dim(' Start Docker to enable infrastructure setup.'));\n } else {\n const setupInfra = await confirm('Set up local infrastructure (postgres, redis)?', true);\n\n if (setupInfra) {\n console.log();\n const success = await setupInfrastructure(cwd);\n if (!success) {\n console.log();\n console.log(chalk.dim(' You can set up infrastructure later with:'));\n console.log(chalk.dim(' cd docker && docker compose up -d'));\n }\n }\n }\n }\n\n // Success message - clear single next action\n console.log();\n console.log(chalk.green.bold(' ✓ Squads initialized!'));\n console.log();\n\n // Show what was created (compact)\n console.log(chalk.dim(' Created:'));\n console.log(chalk.dim(' • .agents/squads/demo/ - Demo squad with 2 agents'));\n console.log(chalk.dim(' • .claude/settings.json - Claude Code hooks'));\n console.log(chalk.dim(' • CLAUDE.md - Agent instructions'));\n console.log();\n\n // Optional email capture for updates\n const email = await promptEmail();\n if (email) {\n await track(Events.CLI_INIT, {\n event: 'email_capture',\n email,\n });\n console.log(chalk.dim(` ✓ We'll send updates to ${email}`));\n console.log();\n }\n\n // Single clear next action - this is critical for activation\n console.log(chalk.bold(' 👉 Try it now:'));\n console.log();\n console.log(` ${chalk.yellow.bold('squads status')}`);\n console.log();\n console.log(chalk.dim(' Then explore:'));\n console.log(chalk.dim(` • ${chalk.cyan('squads dash')} Full dashboard`));\n console.log(chalk.dim(` • ${chalk.cyan('squads run demo')} Try demo agents`));\n console.log(chalk.dim(` • ${chalk.cyan('squads --help')} All commands`));\n console.log();\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 function getGitHubStats(basePath: string, days: number = 30): GitHubStats {\n const stats: GitHubStats = {\n prsOpened: 0,\n prsMerged: 0,\n issuesClosed: 0,\n issuesOpen: 0,\n bySquad: new Map(),\n };\n\n // Initialize squad stats\n for (const squad of Object.keys(SQUAD_REPO_MAP)) {\n stats.bySquad.set(squad, {\n prsOpened: 0,\n prsMerged: 0,\n issuesClosed: 0,\n issuesOpen: 0,\n commits: 0,\n recentIssues: [],\n recentPRs: [],\n });\n }\n\n const repos = ['hq', 'agents-squads-web'];\n const since = new Date(Date.now() - days * 24 * 60 * 60 * 1000).toISOString();\n\n for (const repo of repos) {\n const repoPath = join(basePath, repo);\n if (!existsSync(repoPath)) continue;\n\n try {\n // Get PRs\n const prsOutput = execSync(\n `gh pr list --state all --json number,title,createdAt,mergedAt,labels --limit 100 2>/dev/null`,\n { cwd: repoPath, encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] }\n );\n const prs = JSON.parse(prsOutput || '[]');\n\n for (const pr of prs) {\n const created = new Date(pr.createdAt);\n if (created < new Date(since)) continue;\n\n stats.prsOpened++;\n if (pr.mergedAt) stats.prsMerged++;\n\n // Detect squad from labels or title\n const squad = detectSquadFromPR(pr, repo);\n const squadStats = stats.bySquad.get(squad);\n if (squadStats) {\n squadStats.prsOpened++;\n if (pr.mergedAt) squadStats.prsMerged++;\n if (squadStats.recentPRs.length < 3) {\n squadStats.recentPRs.push({\n title: pr.title,\n number: pr.number,\n merged: !!pr.mergedAt,\n });\n }\n }\n }\n\n // Get Issues\n const issuesOutput = execSync(\n `gh issue list --state all --json number,title,state,closedAt,labels --limit 100 2>/dev/null`,\n { cwd: repoPath, encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] }\n );\n const issues = JSON.parse(issuesOutput || '[]');\n\n for (const issue of issues) {\n const squad = detectSquadFromIssue(issue, repo);\n const squadStats = stats.bySquad.get(squad);\n\n if (issue.state === 'CLOSED') {\n const closed = new Date(issue.closedAt);\n if (closed >= new Date(since)) {\n stats.issuesClosed++;\n if (squadStats) {\n squadStats.issuesClosed++;\n }\n }\n } else {\n stats.issuesOpen++;\n if (squadStats) {\n squadStats.issuesOpen++;\n if (squadStats.recentIssues.length < 3) {\n squadStats.recentIssues.push({\n title: issue.title,\n number: issue.number,\n state: issue.state,\n });\n }\n }\n }\n }\n } catch {\n // gh not available or not in repo\n }\n }\n\n // Add commit counts per squad\n const gitStats = getMultiRepoGitStats(basePath, days);\n for (const [repo, commits] of gitStats.commitsByRepo) {\n // Map repo to squad\n for (const [squad, repos] of Object.entries(SQUAD_REPO_MAP)) {\n if (repos.includes(repo)) {\n const squadStats = stats.bySquad.get(squad);\n if (squadStats) {\n squadStats.commits += commits;\n }\n }\n }\n }\n\n return stats;\n}\n\n/**\n * Optimized GitHub stats - fetches PRs and issues in parallel across repos\n * Uses a single combined gh api call per repo for better performance\n */\nexport function getGitHubStatsOptimized(basePath: string, days: number = 30): GitHubStats {\n const stats: GitHubStats = {\n prsOpened: 0,\n prsMerged: 0,\n issuesClosed: 0,\n issuesOpen: 0,\n bySquad: new Map(),\n };\n\n // Initialize squad stats\n for (const squad of Object.keys(SQUAD_REPO_MAP)) {\n stats.bySquad.set(squad, {\n prsOpened: 0,\n prsMerged: 0,\n issuesClosed: 0,\n issuesOpen: 0,\n commits: 0,\n recentIssues: [],\n recentPRs: [],\n });\n }\n\n const repos = ['hq', 'agents-squads-web'];\n const since = new Date(Date.now() - days * 24 * 60 * 60 * 1000).toISOString();\n\n // Fetch all data in parallel using a single combined command\n const results: { repo: string; prs: unknown[]; issues: unknown[] }[] = [];\n\n for (const repo of repos) {\n const repoPath = join(basePath, repo);\n if (!existsSync(repoPath)) continue;\n\n try {\n // Use a single shell command to get both PRs and issues\n // This reduces the number of gh CLI invocations from 4 to 2\n const output = execSync(\n `echo '{\"prs\":' && gh pr list --state all --json number,title,createdAt,mergedAt,labels --limit 50 2>/dev/null && echo ',\"issues\":' && gh issue list --state all --json number,title,state,closedAt,labels --limit 50 2>/dev/null && echo '}'`,\n { cwd: repoPath, encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'], timeout: 10000 }\n );\n\n // Parse the combined output (handle edge cases)\n const prsMatch = output.match(/\"prs\":(\\[.*?\\]),\"issues\":/s);\n const issuesMatch = output.match(/\"issues\":(\\[.*?\\])\\s*\\}/s);\n\n const prs = prsMatch ? JSON.parse(prsMatch[1]) : [];\n const issues = issuesMatch ? JSON.parse(issuesMatch[1]) : [];\n\n results.push({ repo, prs, issues });\n } catch {\n // Fallback: try individual calls with short timeout\n try {\n const prsOutput = execSync(\n `gh pr list --state all --json number,title,createdAt,mergedAt,labels --limit 50 2>/dev/null`,\n { cwd: repoPath, encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'], timeout: 5000 }\n );\n const issuesOutput = execSync(\n `gh issue list --state all --json number,title,state,closedAt,labels --limit 50 2>/dev/null`,\n { cwd: repoPath, encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'], timeout: 5000 }\n );\n results.push({\n repo,\n prs: JSON.parse(prsOutput || '[]'),\n issues: JSON.parse(issuesOutput || '[]'),\n });\n } catch {\n // Skip this repo\n }\n }\n }\n\n // Process results\n for (const { repo, prs, issues } of results) {\n // Process PRs\n for (const pr of prs as { createdAt: string; mergedAt?: string; title: string; number: number; labels: { name: string }[] }[]) {\n const created = new Date(pr.createdAt);\n if (created < new Date(since)) continue;\n\n stats.prsOpened++;\n if (pr.mergedAt) stats.prsMerged++;\n\n const squad = detectSquadFromPR(pr, repo);\n const squadStats = stats.bySquad.get(squad);\n if (squadStats) {\n squadStats.prsOpened++;\n if (pr.mergedAt) squadStats.prsMerged++;\n if (squadStats.recentPRs.length < 3) {\n squadStats.recentPRs.push({\n title: pr.title,\n number: pr.number,\n merged: !!pr.mergedAt,\n });\n }\n }\n }\n\n // Process Issues\n for (const issue of issues as { state: string; closedAt?: string; title: string; number: number; labels: { name: string }[] }[]) {\n const squad = detectSquadFromIssue(issue, repo);\n const squadStats = stats.bySquad.get(squad);\n\n if (issue.state === 'CLOSED') {\n const closed = new Date(issue.closedAt || 0);\n if (closed >= new Date(since)) {\n stats.issuesClosed++;\n if (squadStats) {\n squadStats.issuesClosed++;\n }\n }\n } else {\n stats.issuesOpen++;\n if (squadStats) {\n squadStats.issuesOpen++;\n if (squadStats.recentIssues.length < 3) {\n squadStats.recentIssues.push({\n title: issue.title,\n number: issue.number,\n state: issue.state,\n });\n }\n }\n }\n }\n }\n\n // Note: commit counts are added separately by the caller using cached git stats\n return stats;\n}\n\nfunction detectSquadFromPR(pr: { title: string; labels: { name: string }[] }, repo: string): string {\n // Check labels first\n for (const label of pr.labels || []) {\n const labelLower = label.name.toLowerCase();\n for (const [squad, patterns] of Object.entries(SQUAD_LABELS)) {\n if (patterns.some(p => labelLower.includes(p))) {\n return squad;\n }\n }\n }\n\n // Check title\n const titleLower = pr.title.toLowerCase();\n for (const [squad, patterns] of Object.entries(SQUAD_LABELS)) {\n if (patterns.some(p => titleLower.includes(p))) {\n return squad;\n }\n }\n\n // Default based on repo\n if (repo === 'agents-squads-web') return 'website';\n if (repo === 'squads-cli') return 'product';\n return 'engineering';\n}\n\nfunction detectSquadFromIssue(issue: { title: string; labels: { name: string }[] }, repo: string): string {\n // Check labels first\n for (const label of issue.labels || []) {\n const labelLower = label.name.toLowerCase();\n\n // Direct squad label match\n if (labelLower.startsWith('squad:')) {\n return labelLower.replace('squad:', '');\n }\n\n for (const [squad, patterns] of Object.entries(SQUAD_LABELS)) {\n if (patterns.some(p => labelLower.includes(p))) {\n return squad;\n }\n }\n }\n\n // Check title\n const titleLower = issue.title.toLowerCase();\n for (const [squad, patterns] of Object.entries(SQUAD_LABELS)) {\n if (patterns.some(p => titleLower.includes(p))) {\n return squad;\n }\n }\n\n // Default based on repo\n if (repo === 'agents-squads-web') return 'website';\n if (repo === 'squads-cli') return 'product';\n return 'engineering';\n}\n\nexport function getMultiRepoGitStats(basePath: string, days: number = 30): GitPerformanceStats {\n const stats: GitPerformanceStats = {\n totalCommits: 0,\n commitsByDay: new Map(),\n commitsByAuthor: new Map(),\n commitsByRepo: new Map(),\n activeDays: 0,\n avgCommitsPerDay: 0,\n peakDay: null,\n repos: [],\n recentCommits: [],\n };\n\n // Collect all commits with full info for sorting\n const allCommits: CommitInfo[] = [];\n\n for (const repo of SQUAD_REPOS) {\n const repoPath = join(basePath, repo);\n if (!existsSync(repoPath) || !existsSync(join(repoPath, '.git'))) {\n continue;\n }\n\n try {\n // Get commits from this repo (use %aN to respect .mailmap)\n const logOutput = execSync(\n `git log --since=\"${days} days ago\" --format=\"%H|%aN|%ad|%s\" --date=short 2>/dev/null`,\n { cwd: repoPath, encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] }\n ).trim();\n\n if (!logOutput) continue;\n\n const commits = logOutput.split('\\n').filter(l => l.trim());\n const authors = new Set<string>();\n let lastCommit = '';\n\n for (const line of commits) {\n const 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 } catch {\n // Skip repos that fail\n }\n }\n\n // Calculate derived stats\n stats.activeDays = stats.commitsByDay.size;\n stats.avgCommitsPerDay = stats.activeDays > 0\n ? Math.round((stats.totalCommits / days) * 10) / 10\n : 0;\n\n // Find peak day\n let peakCount = 0;\n let peakDate = '';\n for (const [date, count] of stats.commitsByDay) {\n if (count > peakCount) {\n peakCount = count;\n peakDate = date;\n }\n }\n if (peakDate) {\n stats.peakDay = { date: peakDate, count: peakCount };\n }\n\n // 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 function getActivitySparkline(basePath: string, days: number = 7): 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 for (const repo of SQUAD_REPOS) {\n const repoPath = join(basePath, repo);\n if (!existsSync(repoPath) || !existsSync(join(repoPath, '.git'))) {\n continue;\n }\n\n try {\n const logOutput = execSync(\n `git log --since=\"${days} days ago\" --format=\"%ad\" --date=short 2>/dev/null`,\n { cwd: repoPath, encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] }\n ).trim();\n\n if (!logOutput) continue;\n\n for (const dateStr of logOutput.split('\\n')) {\n const commitDate = new Date(dateStr);\n const daysAgo = Math.floor((now.getTime() - commitDate.getTime()) / (1000 * 60 * 60 * 24));\n const index = days - 1 - daysAgo;\n if (index >= 0 && index < days) {\n activity[index]++;\n }\n }\n } catch {\n // Skip\n }\n }\n\n return activity;\n}\n","import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'fs';\nimport { join } from 'path';\nimport { homedir } from 'os';\nimport { randomUUID } from 'crypto';\n\ninterface TelemetryEvent {\n event: string;\n timestamp: string;\n properties?: Record<string, string | number | boolean | undefined>;\n}\n\ninterface TelemetryConfig {\n enabled: boolean;\n anonymousId: string;\n firstRun: string;\n}\n\nconst TELEMETRY_DIR = join(homedir(), '.squads-cli');\nconst CONFIG_PATH = join(TELEMETRY_DIR, 'telemetry.json');\nconst EVENTS_PATH = join(TELEMETRY_DIR, 'events.json');\n\n// Telemetry endpoint - 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\nfunction ensureDir(): void {\n if (!existsSync(TELEMETRY_DIR)) {\n mkdirSync(TELEMETRY_DIR, { recursive: true });\n }\n}\n\nfunction getConfig(): TelemetryConfig {\n ensureDir();\n\n if (!existsSync(CONFIG_PATH)) {\n const config: TelemetryConfig = {\n enabled: true, // Opt-out by default (common for CLIs)\n anonymousId: randomUUID(),\n firstRun: new Date().toISOString(),\n };\n writeFileSync(CONFIG_PATH, JSON.stringify(config, null, 2));\n return config;\n }\n\n try {\n return JSON.parse(readFileSync(CONFIG_PATH, 'utf-8'));\n } catch {\n return { enabled: false, anonymousId: '', firstRun: '' };\n }\n}\n\nfunction saveConfig(config: TelemetryConfig): void {\n ensureDir();\n writeFileSync(CONFIG_PATH, JSON.stringify(config, null, 2));\n}\n\nexport function isEnabled(): boolean {\n // Check environment variable first (allows CI/testing override)\n if (process.env.SQUADS_TELEMETRY_DISABLED === '1') {\n return false;\n }\n if (process.env.DO_NOT_TRACK === '1') {\n return false;\n }\n\n return getConfig().enabled;\n}\n\nexport function enable(): void {\n const config = getConfig();\n config.enabled = true;\n saveConfig(config);\n}\n\nexport function disable(): void {\n const config = getConfig();\n config.enabled = false;\n saveConfig(config);\n}\n\nexport function getAnonymousId(): string {\n return getConfig().anonymousId;\n}\n\nexport async function track(event: string, properties?: Record<string, string | number | boolean | undefined>): Promise<void> {\n if (!isEnabled()) return;\n\n const config = getConfig();\n\n const telemetryEvent: TelemetryEvent = {\n event,\n timestamp: new Date().toISOString(),\n properties: {\n ...properties,\n anonymousId: config.anonymousId,\n cliVersion: process.env.npm_package_version || 'unknown',\n },\n };\n\n // Store locally (for debugging/review)\n storeEventLocally(telemetryEvent);\n\n // Queue for batch sending\n eventQueue.push(telemetryEvent);\n\n // Schedule flush if not already scheduled\n if (TELEMETRY_ENDPOINT && !flushScheduled) {\n flushScheduled = true;\n // Flush on next tick to batch events from same command\n setImmediate(() => {\n flushEvents().catch(() => {});\n });\n }\n}\n\n/**\n * Flush queued events to the telemetry endpoint\n */\nexport async function flushEvents(): Promise<void> {\n if (!TELEMETRY_ENDPOINT || eventQueue.length === 0) {\n flushScheduled = false;\n return;\n }\n\n const batch = [...eventQueue];\n eventQueue = [];\n flushScheduled = false;\n\n try {\n await fetch(TELEMETRY_ENDPOINT, {\n method: 'POST',\n headers: {\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// Pre-defined events for consistency\nexport const Events = {\n // Lifecycle\n CLI_INIT: 'cli.init',\n CLI_ERROR: 'cli.error',\n\n // Commands\n CLI_RUN: 'cli.run',\n CLI_STATUS: 'cli.status',\n CLI_DASHBOARD: 'cli.dashboard',\n CLI_WORKERS: 'cli.workers',\n CLI_TONIGHT: 'cli.tonight',\n CLI_CONTEXT: 'cli.context',\n CLI_COST: 'cli.cost',\n CLI_EXEC: 'cli.exec',\n\n // Goals\n CLI_GOAL_SET: 'cli.goal.set',\n CLI_GOAL_LIST: 'cli.goal.list',\n CLI_GOAL_COMPLETE: 'cli.goal.complete',\n CLI_GOAL_PROGRESS: 'cli.goal.progress',\n\n // Memory\n CLI_MEMORY_QUERY: 'cli.memory.query',\n CLI_MEMORY_SHOW: 'cli.memory.show',\n CLI_MEMORY_UPDATE: 'cli.memory.update',\n CLI_MEMORY_LIST: 'cli.memory.list',\n CLI_MEMORY_SYNC: 'cli.memory.sync',\n\n // Feedback\n CLI_FEEDBACK_ADD: 'cli.feedback.add',\n CLI_FEEDBACK_SHOW: 'cli.feedback.show',\n CLI_FEEDBACK_STATS: 'cli.feedback.stats',\n\n // Auth\n CLI_LOGIN: 'cli.login',\n CLI_LOGOUT: 'cli.logout',\n} as const;\n\n// Track command execution time (legacy helper)\nexport function trackCommand(command: string): () => void {\n const start = Date.now();\n\n return () => {\n const duration = Date.now() - start;\n track(`cli.${command}`, { durationMs: duration });\n };\n}\n\n// Register exit handler to flush remaining events\nlet exitHandlerRegistered = false;\n\nexport function registerExitHandler(): void {\n if (exitHandlerRegistered) return;\n exitHandlerRegistered = true;\n\n // 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","import ora from 'ora';\nimport { spawn } from 'child_process';\nimport { join, dirname } from 'path';\nimport { existsSync, readFileSync, writeFileSync, mkdirSync } from 'fs';\nimport {\n findSquadsDir,\n loadSquad,\n listAgents,\n loadAgentDefinition,\n EffortLevel\n} from '../lib/squad-parser.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';\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 (no tmux)\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}\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 * 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\n * Different squads need different tools - keeps main sessions lean\n */\nfunction selectMcpConfig(squadName: string): string {\n const home = process.env.HOME || '';\n const configsDir = join(home, '.claude', 'mcp-configs');\n\n // Squad → MCP config mapping\n const squadConfigs: Record<string, string> = {\n website: 'website.json', // chrome-devtools, nano-banana\n research: 'research.json', // x-mcp\n intelligence: 'research.json', // x-mcp\n analytics: 'data.json', // supabase, grafana, ga4-admin\n engineering: 'data.json', // supabase, grafana\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 // Fallback to default user config\n return join(home, '.claude.json');\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/**\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 * 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 'supabase',\n 'grafana',\n 'context7',\n 'huggingface',\n 'nano-banana'\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\nexport async function runCommand(\n target: string,\n options: RunOptions\n): Promise<void> {\n const squadsDir = findSquadsDir();\n\n if (!squadsDir) {\n writeLine(` ${colors.red}No .agents/squads directory found${RESET}`);\n writeLine(` ${colors.dim}Run \\`squads init\\` to create one.${RESET}`);\n process.exit(1);\n }\n\n // Check if target is a squad or an agent\n const squad = loadSquad(target);\n\n if (squad) {\n await track(Events.CLI_RUN, { type: 'squad', target: squad.name });\n await 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.name, `${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 --execute`);\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.name, 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.name, `${agentName}.md`);\n\n if (existsSync(agentPath)) {\n writeLine(` ${colors.dim}[${i + 1}/${pipeline.agents.length}]${RESET}`);\n await runAgent(agentName, agentPath, squad.name, options);\n writeLine();\n } else {\n writeLine(` ${icons.warning} ${colors.yellow}Agent ${agentName} not found, skipping${RESET}`);\n }\n }\n } else {\n // If specific agent requested via -a flag, run that agent\n if (options.agent) {\n const agentPath = join(squadsDir, squad.name, `${options.agent}.md`);\n if (existsSync(agentPath)) {\n await runAgent(options.agent, agentPath, squad.name, options);\n } else {\n writeLine(` ${icons.error} ${colors.red}Agent ${options.agent} not found${RESET}`);\n return;\n }\n } else {\n // Run orchestrator if exists, otherwise list agents\n const orchestrator = squad.agents.find(a =>\n a.name.includes('lead') || a.trigger === 'Manual'\n );\n\n if (orchestrator) {\n const agentPath = join(squadsDir, squad.name, `${orchestrator.name}.md`);\n if (existsSync(agentPath)) {\n await runAgent(orchestrator.name, agentPath, squad.name, options);\n }\n } else {\n writeLine(` ${colors.dim}No pipeline defined. Available agents:${RESET}`);\n for (const agent of squad.agents) {\n writeLine(` ${icons.empty} ${colors.cyan}${agent.name}${RESET} ${colors.dim}${agent.role}${RESET}`);\n }\n writeLine();\n writeLine(` ${colors.dim}Run a specific agent:${RESET}`);\n writeLine(` ${colors.dim}$${RESET} squads run ${colors.cyan}${squad.name}${RESET} --agent ${colors.cyan}<name>${RESET}`);\n writeLine();\n writeLine(` ${colors.dim}Run all agents in parallel:${RESET}`);\n writeLine(` ${colors.dim}$${RESET} squads run ${colors.cyan}${squad.name}${RESET} --parallel --execute`);\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.name, `${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 --execute`);\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.name}/ 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.name}/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 writeLine(` ${gradient('Launching')} lead session${options.foreground ? ' (foreground)' : ''}...`);\n writeLine();\n\n try {\n const result = await executeWithClaude(prompt, options.verbose, timeoutMins, options.foreground, options.useApi, options.effort, options.skills, options.trigger || 'manual');\n\n if (options.foreground) {\n writeLine();\n writeLine(` ${icons.success} Lead session completed`);\n } else {\n writeLine(` ${icons.success} Lead session launched`);\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 if (options.dryRun) {\n spinner.info(`[DRY RUN] Would run ${agentName}`);\n if (options.verbose) {\n writeLine(` ${colors.dim}Agent definition:${RESET}`);\n writeLine(` ${colors.dim}${definition.slice(0, 500)}...${RESET}`);\n }\n return;\n }\n\n // 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 // 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 // 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\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:\n1. Update the agent's memory in .agents/memory/${squadName}/${agentName}/state.md\n2. Log any learnings to learnings.md\n3. 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 // Check if Claude CLI is available\n const claudeAvailable = await checkClaudeCliAvailable();\n\n if (options.execute && claudeAvailable) {\n spinner.text = options.foreground\n ? `Running ${agentName} in foreground...`\n : `Launching ${agentName} as background task...`;\n\n try {\n const result = await executeWithClaude(prompt, options.verbose, options.timeout || 30, options.foreground, options.useApi, options.effort, options.skills, options.trigger || 'manual');\n\n if (options.foreground) {\n spinner.succeed(`Agent ${agentName} completed`);\n } else {\n spinner.succeed(`Agent ${agentName} launched`);\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 } catch (error) {\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 }\n } else {\n // Show instructions for manual execution\n spinner.succeed(`Agent ${agentName} ready`);\n writeLine(` ${colors.dim}Execution logged: ${startTime}${RESET}`);\n\n if (!claudeAvailable) {\n writeLine();\n writeLine(` ${colors.yellow}Claude CLI not found${RESET}`);\n writeLine(` ${colors.dim}Install: npm install -g @anthropic-ai/claude-code${RESET}`);\n }\n\n writeLine();\n writeLine(` ${colors.dim}To launch as background task:${RESET}`);\n writeLine(` ${colors.dim}$${RESET} squads run ${colors.cyan}${squadName}${RESET} -a ${colors.cyan}${agentName}${RESET} --execute`);\n writeLine();\n writeLine(` ${colors.dim}Or run interactively:${RESET}`);\n writeLine(` ${colors.dim}$${RESET} Run the ${colors.cyan}${agentName}${RESET} agent from ${agentPath}`);\n }\n}\n\nasync function checkClaudeCliAvailable(): Promise<boolean> {\n return new Promise((resolve) => {\n const check = spawn('which', ['claude'], { stdio: 'pipe' });\n check.on('close', (code) => resolve(code === 0));\n check.on('error', () => resolve(false));\n });\n}\n\nasync function executeWithClaude(\n prompt: string,\n verbose?: boolean,\n _timeoutMinutes: number = 30,\n foreground?: boolean,\n useApi?: boolean,\n effort?: EffortLevel,\n skills?: string[],\n trigger: ExecutionContext['trigger'] = 'manual'\n): Promise<string> {\n // Ensure the project is trusted (prevents workspace trust dialog)\n const projectRoot = getProjectRoot();\n ensureProjectTrusted(projectRoot);\n\n // Extract squad/agent from prompt for telemetry tagging\n const squadMatch = prompt.match(/squad (\\w+)/);\n const agentMatch = prompt.match(/(\\w+) agent/);\n const squadName = process.env.SQUADS_SQUAD || squadMatch?.[1] || 'unknown';\n const agentName = process.env.SQUADS_AGENT || agentMatch?.[1] || 'unknown';\n\n // Select MCP config based on squad (keeps main sessions lean)\n const mcpConfigPath = selectMcpConfig(squadName);\n\n // Build execution context for telemetry\n const execContext: ExecutionContext = {\n squad: squadName,\n agent: agentName,\n taskType: detectTaskType(agentName),\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 const { ANTHROPIC_API_KEY: _apiKey, ...envWithoutApiKey } = process.env;\n const spawnEnv = useApi ? process.env : 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\n if (foreground) {\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 }\n\n return new Promise((resolve, reject) => {\n const claude = spawn('claude', [\n '--dangerously-skip-permissions',\n '--mcp-config', mcpConfigPath,\n '--',\n prompt\n ], {\n stdio: 'inherit',\n cwd: projectRoot,\n env: {\n ...spawnEnv,\n // Telemetry context for per-agent cost tracking\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 // OTel resource attributes for telemetry pipeline\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 // Claude-specific options\n ...(effort && { CLAUDE_EFFORT: effort }),\n ...(skills && skills.length > 0 && { CLAUDE_SKILLS: skills.join(',') }),\n },\n });\n\n claude.on('close', (code) => {\n if (code === 0) {\n resolve('Session completed');\n } else {\n reject(new Error(`Claude exited with code ${code}`));\n }\n });\n\n claude.on('error', (err) => {\n reject(err);\n });\n });\n }\n\n // Background mode: run via tmux for session management\n const sessionName = process.env.SQUADS_TMUX_SESSION ||\n `squads-${squadName}-${agentName}-${Date.now()}`;\n\n if (verbose) {\n writeLine(` ${colors.dim}Project: ${projectRoot}${RESET}`);\n writeLine(` ${colors.dim}Session: ${sessionName}${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 }\n\n // Build Claude command with all permissions bypassed for autonomous execution\n // Auto-cleanup: kill tmux session when Claude exits (success or failure)\n const claudeCmd = `cd '${projectRoot}' && claude --dangerously-skip-permissions --mcp-config '${mcpConfigPath}' -- '${escapedPrompt}'; tmux kill-session -t ${sessionName} 2>/dev/null`;\n\n // Create detached tmux session running Claude\n const tmux = spawn('tmux', [\n 'new-session',\n '-d', // Detached\n '-s', sessionName,\n '-x', '200', // Wide terminal for better output\n '-y', '50',\n '/bin/sh', '-c', claudeCmd\n ], {\n stdio: 'ignore',\n detached: true,\n env: {\n ...spawnEnv,\n // Telemetry context for per-agent cost tracking\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 // OTel resource attributes for telemetry pipeline\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 // Claude-specific options\n ...(effort && { CLAUDE_EFFORT: effort }),\n ...(skills && skills.length > 0 && { CLAUDE_SKILLS: skills.join(',') }),\n },\n });\n\n tmux.unref();\n\n if (verbose) {\n writeLine(` ${colors.dim}Attach: tmux attach -t ${sessionName}${RESET}`);\n }\n\n return `tmux session: ${sessionName}. Attach: tmux attach -t ${sessionName}`;\n}\n\nexport async function runSquadCommand(\n squadName: string,\n options: RunOptions\n): Promise<void> {\n return runCommand(squadName, options);\n}\n","import { readFileSync, existsSync, readdirSync, writeFileSync } from 'fs';\nimport { join, basename } from 'path';\nimport matter from 'gray-matter';\n\nexport type EffortLevel = 'high' | 'medium' | 'low';\n\n// Context schema for frontmatter\nexport interface SquadContext {\n mcp?: string[];\n skills?: string[];\n memory?: {\n load?: string[];\n };\n model?: {\n default?: string;\n expensive?: string;\n cheap?: string;\n };\n budget?: {\n daily?: number;\n weekly?: number;\n perExecution?: number;\n };\n}\n\n// Frontmatter schema\nexport interface SquadFrontmatter {\n name?: string;\n mission?: string;\n repo?: string;\n stack?: string;\n context?: SquadContext;\n effort?: EffortLevel;\n}\n\nexport interface Agent {\n name: string;\n role: string;\n trigger: string;\n status?: string;\n filePath?: string;\n squad?: string;\n effort?: EffortLevel;\n}\n\nexport interface Pipeline {\n name: string;\n agents: string[];\n}\n\nexport interface Goal {\n description: string;\n completed: boolean;\n progress?: string;\n metrics?: string[];\n}\n\nexport interface Squad {\n name: string;\n mission: string;\n agents: Agent[];\n pipelines: Pipeline[];\n triggers: {\n scheduled: string[];\n event: string[];\n manual: string[];\n };\n dependencies: string[];\n outputPath: string;\n goals: Goal[];\n effort?: EffortLevel; // Squad-level default effort\n context?: SquadContext; // Frontmatter context block\n repo?: string;\n stack?: string;\n}\n\nexport function findSquadsDir(): string | null {\n // Look for .agents/squads in current directory or parent directories\n let dir = process.cwd();\n\n for (let i = 0; i < 5; i++) {\n const squadsPath = join(dir, '.agents', 'squads');\n if (existsSync(squadsPath)) {\n return squadsPath;\n }\n const parent = join(dir, '..');\n if (parent === dir) break;\n dir = parent;\n }\n\n return null;\n}\n\nexport function findProjectRoot(): string | null {\n // Find the root of the squads project (where .agents/ lives)\n const squadsDir = findSquadsDir();\n if (!squadsDir) return null;\n // squadsDir is /path/to/.agents/squads, so go up 2 levels\n return join(squadsDir, '..', '..');\n}\n\nexport function hasLocalInfraConfig(): boolean {\n // Check if the project has a local .env file with infra config\n const projectRoot = findProjectRoot();\n if (!projectRoot) return false;\n\n const envPath = join(projectRoot, '.env');\n if (!existsSync(envPath)) return false;\n\n // Check if .env has any infra-related keys\n const content = readFileSync(envPath, 'utf-8');\n const infraKeys = ['LANGFUSE_', 'SQUADS_BRIDGE', 'SQUADS_POSTGRES', 'SQUADS_REDIS'];\n return infraKeys.some(key => content.includes(key));\n}\n\nexport function listSquads(squadsDir: string): string[] {\n const squads: string[] = [];\n\n const entries = readdirSync(squadsDir, { withFileTypes: true });\n for (const entry of entries) {\n if (entry.isDirectory() && !entry.name.startsWith('_')) {\n const squadFile = join(squadsDir, entry.name, 'SQUAD.md');\n if (existsSync(squadFile)) {\n squads.push(entry.name);\n }\n }\n }\n\n return squads;\n}\n\nexport function listAgents(squadsDir: string, squadName?: string): Agent[] {\n const agents: Agent[] = [];\n\n const dirs = squadName\n ? [squadName]\n : readdirSync(squadsDir, { withFileTypes: true })\n .filter(e => e.isDirectory() && !e.name.startsWith('_'))\n .map(e => e.name);\n\n for (const dir of dirs) {\n const squadPath = join(squadsDir, dir);\n if (!existsSync(squadPath)) continue;\n\n const files = readdirSync(squadPath);\n for (const file of files) {\n if (file.endsWith('.md') && file !== 'SQUAD.md') {\n const agentName = file.replace('.md', '');\n agents.push({\n name: agentName,\n role: `Agent in ${dir}`,\n trigger: 'manual',\n filePath: join(squadPath, file)\n });\n }\n }\n }\n\n return agents;\n}\n\nexport function parseSquadFile(filePath: string): Squad {\n const rawContent = readFileSync(filePath, 'utf-8');\n\n // Parse frontmatter with gray-matter\n const { data: frontmatter, content: bodyContent } = matter(rawContent);\n const fm = frontmatter as SquadFrontmatter;\n\n const lines = bodyContent.split('\\n');\n\n const squad: Squad = {\n name: fm.name || basename(filePath).replace('.md', ''),\n mission: fm.mission || '',\n agents: [],\n pipelines: [],\n triggers: { scheduled: [], event: [], manual: [] },\n dependencies: [],\n outputPath: '',\n goals: [],\n // Apply frontmatter fields\n effort: fm.effort,\n context: fm.context,\n repo: fm.repo,\n stack: fm.stack,\n };\n\n let currentSection = '';\n let inTable = false;\n let tableHeaders: string[] = [];\n\n for (const line of lines) {\n // Extract squad name from title\n if (line.startsWith('# Squad:')) {\n squad.name = line.replace('# Squad:', '').trim().toLowerCase();\n continue;\n }\n\n // Track sections\n if (line.startsWith('## ')) {\n currentSection = line.replace('## ', '').trim().toLowerCase();\n inTable = false;\n continue;\n }\n\n // Extract mission\n if (currentSection === 'mission' && line.trim() && !line.startsWith('#')) {\n if (!squad.mission) {\n squad.mission = line.trim();\n }\n }\n\n // Extract squad-level effort (e.g., \"effort: medium\" in Context section)\n const effortMatch = line.match(/^effort:\\s*(high|medium|low)/i);\n if (effortMatch && !squad.effort) {\n squad.effort = effortMatch[1].toLowerCase() as EffortLevel;\n }\n\n // Parse agent tables\n if (currentSection.includes('agent') || currentSection.includes('orchestrator') ||\n currentSection.includes('evaluator') || currentSection.includes('builder') ||\n currentSection.includes('priority')) {\n\n if (line.includes('|') && line.includes('Agent')) {\n inTable = true;\n tableHeaders = line.split('|').map(h => h.trim().toLowerCase());\n continue;\n }\n\n if (inTable && line.includes('|') && !line.includes('---')) {\n const cells = line.split('|').map(c => c.trim().replace(/`/g, ''));\n const agentIdx = tableHeaders.findIndex(h => h === 'agent');\n const roleIdx = tableHeaders.findIndex(h => h === 'role');\n const triggerIdx = tableHeaders.findIndex(h => h === 'trigger');\n const statusIdx = tableHeaders.findIndex(h => h === 'status');\n const effortIdx = tableHeaders.findIndex(h => h === 'effort');\n\n if (agentIdx >= 0 && cells[agentIdx]) {\n const effortValue = effortIdx >= 0 ? cells[effortIdx]?.toLowerCase() : undefined;\n const effort = ['high', 'medium', 'low'].includes(effortValue || '')\n ? effortValue as EffortLevel\n : undefined;\n\n squad.agents.push({\n name: cells[agentIdx],\n role: roleIdx >= 0 ? cells[roleIdx] : '',\n trigger: triggerIdx >= 0 ? cells[triggerIdx] : 'manual',\n status: statusIdx >= 0 ? cells[statusIdx] : 'active',\n effort\n });\n }\n }\n }\n\n // Parse pipelines (looking for patterns like: agent1 → agent2 → agent3)\n if (line.includes('→') && line.includes('`')) {\n const pipelineMatch = line.match(/`([^`]+)`\\s*→\\s*`([^`]+)`/g);\n if (pipelineMatch) {\n const agentNames = line.match(/`([^`]+)`/g)?.map(m => m.replace(/`/g, '')) || [];\n if (agentNames.length >= 2) {\n squad.pipelines.push({\n name: 'default',\n agents: agentNames\n });\n }\n }\n }\n\n // Also look for Pipeline: format\n if (line.toLowerCase().includes('pipeline:')) {\n const pipelineContent = line.split(':')[1];\n if (pipelineContent && pipelineContent.includes('→')) {\n const agentNames = pipelineContent.match(/`([^`]+)`/g)?.map(m => m.replace(/`/g, '')) || [];\n if (agentNames.length >= 2) {\n squad.pipelines.push({\n name: 'default',\n agents: agentNames\n });\n }\n }\n }\n\n // Extract output path\n if (line.toLowerCase().includes('primary') && line.includes('`')) {\n const match = line.match(/`([^`]+)`/);\n if (match) {\n squad.outputPath = match[1].replace(/\\/$/, '');\n }\n }\n\n // Parse goals (checkbox format: - [ ] or - [x])\n if (currentSection === 'goals') {\n const goalMatch = line.match(/^-\\s*\\[([ x])\\]\\s*(.+)$/);\n if (goalMatch) {\n const completed = goalMatch[1] === 'x';\n let description = goalMatch[2].trim();\n let progress: string | undefined;\n\n // Check for progress annotation\n const progressMatch = description.match(/\\(progress:\\s*([^)]+)\\)/i);\n if (progressMatch) {\n progress = progressMatch[1];\n description = description.replace(progressMatch[0], '').trim();\n }\n\n squad.goals.push({\n description,\n completed,\n progress\n });\n }\n }\n }\n\n return squad;\n}\n\nexport function loadSquad(squadName: string): Squad | null {\n const squadsDir = findSquadsDir();\n if (!squadsDir) return null;\n\n const squadFile = join(squadsDir, squadName, 'SQUAD.md');\n if (!existsSync(squadFile)) return null;\n\n return parseSquadFile(squadFile);\n}\n\nexport function loadAgentDefinition(agentPath: string): string {\n if (!existsSync(agentPath)) return '';\n return readFileSync(agentPath, 'utf-8');\n}\n\nexport function addGoalToSquad(squadName: string, goal: string): boolean {\n const squadsDir = findSquadsDir();\n if (!squadsDir) return false;\n\n const squadFile = join(squadsDir, squadName, 'SQUAD.md');\n if (!existsSync(squadFile)) return false;\n\n let content = readFileSync(squadFile, 'utf-8');\n\n // Check if Goals section exists\n if (!content.includes('## Goals')) {\n // Add Goals section before Dependencies or at end\n const insertPoint = content.indexOf('## Dependencies');\n if (insertPoint > 0) {\n content = content.slice(0, insertPoint) + `## Goals\\n\\n- [ ] ${goal}\\n\\n` + content.slice(insertPoint);\n } else {\n content += `\\n## Goals\\n\\n- [ ] ${goal}\\n`;\n }\n } else {\n // Add to existing Goals section\n const goalsIdx = content.indexOf('## Goals');\n const nextSectionIdx = content.indexOf('\\n## ', goalsIdx + 1);\n const endIdx = nextSectionIdx > 0 ? nextSectionIdx : content.length;\n\n // Find last goal line or section header\n const goalsSection = content.slice(goalsIdx, endIdx);\n const lastGoalMatch = goalsSection.match(/^-\\s*\\[[ x]\\].+$/gm);\n\n if (lastGoalMatch) {\n // Add after last goal\n const lastGoal = lastGoalMatch[lastGoalMatch.length - 1];\n const lastGoalIdx = content.lastIndexOf(lastGoal, endIdx);\n const insertPos = lastGoalIdx + lastGoal.length;\n content = content.slice(0, insertPos) + `\\n- [ ] ${goal}` + content.slice(insertPos);\n } else {\n // No goals yet, add after section header\n const headerEnd = goalsIdx + '## Goals'.length;\n content = content.slice(0, headerEnd) + `\\n\\n- [ ] ${goal}` + content.slice(headerEnd);\n }\n }\n\n writeFileSync(squadFile, content);\n return true;\n}\n\nexport function updateGoalInSquad(\n squadName: string,\n goalIndex: number,\n updates: { completed?: boolean; progress?: string }\n): boolean {\n const squadsDir = findSquadsDir();\n if (!squadsDir) return false;\n\n const squadFile = join(squadsDir, squadName, 'SQUAD.md');\n if (!existsSync(squadFile)) return false;\n\n const content = readFileSync(squadFile, 'utf-8');\n const lines = content.split('\\n');\n\n let currentSection = '';\n let goalCount = 0;\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n\n if (line.startsWith('## ')) {\n currentSection = line.replace('## ', '').trim().toLowerCase();\n continue;\n }\n\n if (currentSection === 'goals') {\n const goalMatch = line.match(/^-\\s*\\[([ x])\\]\\s*(.+)$/);\n if (goalMatch) {\n if (goalCount === goalIndex) {\n let newLine = '- [' + (updates.completed ? 'x' : ' ') + '] ' + goalMatch[2];\n\n // Handle progress update\n if (updates.progress !== undefined) {\n // Remove existing progress annotation\n newLine = newLine.replace(/\\s*\\(progress:\\s*[^)]+\\)/i, '');\n if (updates.progress) {\n newLine += ` (progress: ${updates.progress})`;\n }\n }\n\n lines[i] = newLine;\n writeFileSync(squadFile, lines.join('\\n'));\n return true;\n }\n goalCount++;\n }\n }\n }\n\n return false;\n}\n","/**\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: [supabase]\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","import {\n findSquadsDir,\n listSquads,\n listAgents\n} from '../lib/squad-parser.js';\nimport {\n colors,\n bold,\n RESET,\n gradient,\n box,\n padEnd,\n icons,\n writeLine,\n} from '../lib/terminal.js';\nimport { track } from '../lib/telemetry.js';\n\ninterface ListOptions {\n squads?: boolean;\n agents?: 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 writeLine();\n writeLine(` ${gradient('squads')} ${colors.dim}list${RESET}`);\n writeLine();\n\n // Stats\n writeLine(` ${colors.cyan}${squads.length}${RESET} squads ${colors.dim}│${RESET} ${colors.cyan}${allAgents.length}${RESET} agents`);\n writeLine();\n\n if (!options.agents) {\n // Show squads table\n const w = { name: 16, agents: 8, lead: 24 };\n const tableWidth = w.name + w.agents + w.lead + 4;\n\n writeLine(` ${colors.purple}${box.topLeft}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.topRight}${RESET}`);\n\n const header = ` ${colors.purple}${box.vertical}${RESET} ` +\n `${bold}${padEnd('SQUAD', w.name)}${RESET}` +\n `${bold}${padEnd('AGENTS', w.agents)}${RESET}` +\n `${bold}LEAD${RESET}` +\n ` ${colors.purple}${box.vertical}${RESET}`;\n writeLine(header);\n\n writeLine(` ${colors.purple}${box.teeRight}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.teeLeft}${RESET}`);\n\n for (const squadName of squads) {\n const agents = listAgents(squadsDir, squadName);\n const lead = agents.find(a => a.name.includes('lead'))?.name || agents[0]?.name || '-';\n\n const row = ` ${colors.purple}${box.vertical}${RESET} ` +\n `${colors.cyan}${padEnd(squadName, w.name)}${RESET}` +\n `${padEnd(String(agents.length), w.agents)}` +\n `${colors.dim}${padEnd(lead, w.lead)}${RESET}` +\n `${colors.purple}${box.vertical}${RESET}`;\n\n writeLine(row);\n }\n\n writeLine(` ${colors.purple}${box.bottomLeft}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.bottomRight}${RESET}`);\n writeLine();\n }\n\n if (!options.squads && options.agents) {\n // Show agents list\n writeLine(` ${bold}Agents${RESET}`);\n writeLine();\n\n for (const agent of allAgents) {\n const squadPart = agent.squad ? `${colors.dim}${agent.squad}/${RESET}` : '';\n const statusIcon = agent.status?.toLowerCase() === 'active' ? icons.active : icons.pending;\n\n writeLine(` ${statusIcon} ${squadPart}${colors.white}${agent.name}${RESET}`);\n if (agent.role) {\n writeLine(` ${colors.dim}└ ${agent.role}${RESET}`);\n }\n }\n writeLine();\n }\n\n // Commands\n writeLine(` ${colors.dim}$${RESET} squads status ${colors.cyan}<squad>${RESET} ${colors.dim}Squad details${RESET}`);\n writeLine(` ${colors.dim}$${RESET} squads run ${colors.cyan}<squad>${RESET} ${colors.dim}Execute a squad${RESET}`);\n writeLine();\n}\n","import { existsSync, statSync } from 'fs';\nimport { join } from 'path';\nimport {\n findSquadsDir,\n loadSquad,\n listSquads,\n listAgents\n} from '../lib/squad-parser.js';\nimport { findMemoryDir, getSquadState } from '../lib/memory.js';\nimport { getLiveSessionSummaryAsync, cleanupStaleSessions } 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 box,\n padEnd,\n icons,\n writeLine,\n} from '../lib/terminal.js';\n\ninterface StatusOptions {\n verbose?: boolean;\n}\n\nexport async function statusCommand(\n squadName?: string,\n options: StatusOptions = {}\n): Promise<void> {\n 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 writeLine();\n writeLine(` ${gradient('squads')} ${colors.dim}status${RESET}`);\n\n // Check for updates (cached, non-blocking)\n const updateInfo = checkForUpdate();\n if (updateInfo.updateAvailable) {\n writeLine(` ${colors.cyan}⬆${RESET} Update available: ${colors.dim}${updateInfo.currentVersion}${RESET} → ${colors.green}${updateInfo.latestVersion}${RESET} ${colors.dim}(run \\`squads update\\`)${RESET}`);\n }\n\n // Session indicator line (only if there are active sessions)\n if (sessionSummary.totalSessions > 0) {\n const sessionText = sessionSummary.totalSessions === 1 ? 'session' : 'sessions';\n const squadText = sessionSummary.squadCount === 1 ? 'squad' : 'squads';\n\n // Build tool breakdown string (e.g., \"claude 4, cursor 2\")\n let toolInfo = '';\n if (sessionSummary.byTool && Object.keys(sessionSummary.byTool).length > 0) {\n const toolParts = Object.entries(sessionSummary.byTool)\n .sort((a, b) => b[1] - a[1]) // Sort by count descending\n .map(([tool, count]) => `${colors.dim}${tool}${RESET} ${colors.cyan}${count}${RESET}`);\n toolInfo = ` ${colors.dim}(${RESET}${toolParts.join(` ${colors.dim}·${RESET} `)}${colors.dim})${RESET}`;\n }\n\n writeLine(` ${colors.green}${icons.active}${RESET} ${colors.white}${sessionSummary.totalSessions}${RESET} active ${sessionText} ${colors.dim}across${RESET} ${colors.cyan}${sessionSummary.squadCount}${RESET} ${squadText}${toolInfo}`);\n }\n writeLine();\n\n // Stats row\n const totalSquads = squads.length;\n const activeCount = squads.length; // All loaded squads are \"active\"\n writeLine(` ${colors.cyan}${activeCount}${RESET}/${totalSquads} squads ${colors.dim}│${RESET} ${colors.dim}memory: ${memoryDir ? 'enabled' : 'none'}${RESET}`);\n writeLine();\n\n // Table\n const w = { name: 16, agents: 8, memory: 14, activity: 12 };\n const tableWidth = w.name + w.agents + w.memory + w.activity + 6;\n\n writeLine(` ${colors.purple}${box.topLeft}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.topRight}${RESET}`);\n\n const header = ` ${colors.purple}${box.vertical}${RESET} ` +\n `${bold}${padEnd('SQUAD', w.name)}${RESET}` +\n `${bold}${padEnd('AGENTS', w.agents)}${RESET}` +\n `${bold}${padEnd('MEMORY', w.memory)}${RESET}` +\n `${bold}ACTIVITY${RESET}` +\n ` ${colors.purple}${box.vertical}${RESET}`;\n writeLine(header);\n\n writeLine(` ${colors.purple}${box.teeRight}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.teeLeft}${RESET}`);\n\n for (const squadName of squads) {\n const agents = listAgents(squadsDir, squadName);\n\n // Check memory\n let memoryStatus = `${colors.dim}none${RESET}`;\n let lastActivity = `${colors.dim}—${RESET}`;\n let activityColor = colors.dim;\n\n if (memoryDir) {\n const squadMemoryPath = join(memoryDir, squadName);\n if (existsSync(squadMemoryPath)) {\n const states = getSquadState(squadName);\n memoryStatus = `${colors.green}${states.length} ${states.length === 1 ? 'entry' : 'entries'}${RESET}`;\n\n // Find most recent file\n let mostRecent = 0;\n for (const state of states) {\n const stat = statSync(state.path);\n if (stat.mtimeMs > mostRecent) {\n mostRecent = stat.mtimeMs;\n }\n }\n\n if (mostRecent > 0) {\n const daysAgo = Math.floor((Date.now() - mostRecent) / (1000 * 60 * 60 * 24));\n if (daysAgo === 0) {\n lastActivity = 'today';\n activityColor = colors.green;\n } else if (daysAgo === 1) {\n lastActivity = 'yesterday';\n activityColor = colors.green;\n } else if (daysAgo < 7) {\n lastActivity = `${daysAgo}d ago`;\n activityColor = colors.yellow;\n } else {\n lastActivity = `${daysAgo}d ago`;\n activityColor = colors.dim;\n }\n }\n }\n }\n\n const row = ` ${colors.purple}${box.vertical}${RESET} ` +\n `${colors.cyan}${padEnd(squadName, w.name)}${RESET}` +\n `${padEnd(String(agents.length), w.agents)}` +\n `${padEnd(memoryStatus, w.memory)}` +\n `${padEnd(`${activityColor}${lastActivity}${RESET}`, w.activity)}` +\n `${colors.purple}${box.vertical}${RESET}`;\n\n writeLine(row);\n }\n\n writeLine(` ${colors.purple}${box.bottomLeft}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.bottomRight}${RESET}`);\n writeLine();\n\n // Commands\n writeLine(` ${colors.dim}$${RESET} squads status ${colors.cyan}<squad>${RESET} ${colors.dim}Squad details${RESET}`);\n writeLine(` ${colors.dim}$${RESET} squads dash ${colors.dim}Full dashboard${RESET}`);\n writeLine(` ${colors.dim}$${RESET} squads run ${colors.cyan}<squad>${RESET} ${colors.dim}Execute a squad${RESET}`);\n writeLine();\n}\n\nasync function showSquadStatus(\n squadName: string,\n squadsDir: string,\n options: StatusOptions\n): Promise<void> {\n const squad = loadSquad(squadName);\n\n if (!squad) {\n writeLine(`${colors.red}Squad \"${squadName}\" not found.${RESET}`);\n process.exit(1);\n }\n\n writeLine();\n writeLine(` ${gradient('squads')} ${colors.dim}status${RESET} ${colors.cyan}${squad.name}${RESET}`);\n writeLine();\n\n // Mission\n if (squad.mission) {\n writeLine(` ${colors.dim}${squad.mission}${RESET}`);\n writeLine();\n }\n\n // Agents table\n const agents = listAgents(squadsDir, squadName);\n const w = { name: 24, role: 36 };\n const tableWidth = w.name + w.role + 4;\n\n writeLine(` ${bold}Agents${RESET} ${colors.dim}(${agents.length})${RESET}`);\n writeLine();\n\n writeLine(` ${colors.purple}${box.topLeft}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.topRight}${RESET}`);\n\n for (const agent of agents) {\n const status = agent.status?.toLowerCase() === 'active'\n ? icons.active\n : icons.pending;\n\n const role = options.verbose && agent.role\n ? `${colors.dim}${agent.role.substring(0, w.role - 2)}${RESET}`\n : '';\n\n const row = ` ${colors.purple}${box.vertical}${RESET} ` +\n `${status} ${padEnd(agent.name, w.name - 2)}` +\n `${padEnd(role, w.role)}` +\n `${colors.purple}${box.vertical}${RESET}`;\n\n writeLine(row);\n }\n\n writeLine(` ${colors.purple}${box.bottomLeft}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.bottomRight}${RESET}`);\n\n // Pipelines\n if (squad.pipelines.length > 0) {\n writeLine();\n writeLine(` ${bold}Pipelines${RESET}`);\n for (const pipeline of squad.pipelines) {\n writeLine(` ${colors.dim}${pipeline.agents.join(' → ')}${RESET}`);\n }\n }\n\n // Memory state\n const memoryDir = findMemoryDir();\n if (memoryDir) {\n const states = getSquadState(squadName);\n\n if (states.length > 0) {\n writeLine();\n writeLine(` ${bold}Memory${RESET} ${colors.dim}(${states.length} ${states.length === 1 ? 'entry' : 'entries'})${RESET}`);\n writeLine();\n\n for (const state of states) {\n const updated = state.content.match(/Updated:\\s*(\\S+)/)?.[1] || 'unknown';\n writeLine(` ${icons.progress} ${colors.white}${state.agent}${RESET}`);\n writeLine(` ${colors.dim}└ updated: ${updated}${RESET}`);\n\n if (options.verbose) {\n const signalsMatch = state.content.match(/## Active Signals([\\s\\S]*?)(?=##|$)/);\n if (signalsMatch) {\n const signalLines = signalsMatch[1]\n .split('\\n')\n .filter(l => l.match(/^\\d+\\./))\n .slice(0, 3);\n\n for (const sig of signalLines) {\n writeLine(` ${colors.dim} ${sig.trim()}${RESET}`);\n }\n }\n }\n }\n }\n }\n\n writeLine();\n writeLine(` ${colors.dim}$${RESET} squads run ${colors.cyan}${squadName}${RESET} ${colors.dim}Run the squad${RESET}`);\n writeLine(` ${colors.dim}$${RESET} squads memory show ${colors.cyan}${squadName}${RESET} ${colors.dim}View full memory${RESET}`);\n writeLine(` ${colors.dim}$${RESET} squads status ${colors.cyan}${squadName}${RESET} -v ${colors.dim}Verbose status${RESET}`);\n writeLine();\n}\n","import { existsSync, readFileSync, writeFileSync, mkdirSync, copyFileSync } from 'fs';\nimport { join, dirname } from 'path';\nimport { homedir } from 'os';\nimport { execSync, spawn } from 'child_process';\nimport { createInterface } from 'readline';\nimport { fileURLToPath } from 'url';\nimport {\n colors,\n bold,\n RESET,\n gradient,\n icons,\n writeLine,\n box,\n padEnd,\n} from '../lib/terminal.js';\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\ninterface StackConfig {\n SQUADS_DATABASE_URL: string;\n SQUADS_BRIDGE_URL: string;\n LANGFUSE_HOST: string;\n LANGFUSE_PUBLIC_KEY: string;\n LANGFUSE_SECRET_KEY: string;\n REDIS_URL: string;\n}\n\ninterface ContainerStatus {\n name: string;\n running: boolean;\n healthy: boolean;\n port?: string;\n}\n\nconst DEFAULT_CONFIG: StackConfig = {\n SQUADS_DATABASE_URL: 'postgresql://squads:squads@localhost:5433/squads',\n SQUADS_BRIDGE_URL: 'http://localhost:8088',\n LANGFUSE_HOST: 'http://localhost:3100',\n LANGFUSE_PUBLIC_KEY: '',\n LANGFUSE_SECRET_KEY: '',\n REDIS_URL: 'redis://localhost:6379',\n};\n\nconst CONFIG_PATH = join(homedir(), '.squadsrc');\nconst SQUADS_DATA_DIR = join(homedir(), '.squads');\n\n/**\n * Service requirements and setup guidance\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: 'Captures conversations and telemetry',\n required: true,\n healthUrl: 'http://localhost:8088/health',\n envVars: ['SQUADS_BRIDGE_URL'],\n setupGuide: [\n 'Run: squads stack up',\n 'Or manually: docker compose up -d bridge',\n ],\n },\n postgres: {\n name: 'PostgreSQL',\n description: 'Stores conversations and telemetry data',\n required: true,\n envVars: ['SQUADS_DATABASE_URL'],\n setupGuide: [\n 'Run: squads stack up',\n 'Or manually: docker compose up -d postgres',\n ],\n },\n mem0: {\n name: 'Mem0 (Engram)',\n description: 'Extracts and stores memories from conversations',\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 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\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 // Check container\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 // Check HTTP health if available\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 stack init${RESET}`);\n writeLine();\n}\n\n/**\n * Prompt user for input\n */\nasync function prompt(question: string, defaultValue?: string): Promise<string> {\n const rl = createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n const suffix = defaultValue ? ` [${defaultValue}]` : '';\n\n return new Promise((resolve) => {\n rl.question(` ${question}${suffix}: `, (answer) => {\n rl.close();\n resolve(answer.trim() || defaultValue || '');\n });\n });\n}\n\n/**\n * Prompt yes/no\n */\nasync function confirm(question: string, defaultYes = true): Promise<boolean> {\n const suffix = defaultYes ? '[Y/n]' : '[y/N]';\n const answer = await prompt(`${question} ${suffix}`);\n if (!answer) return defaultYes;\n return answer.toLowerCase().startsWith('y');\n}\n\n/**\n * Find package docker directory (from npm package or local dev)\n */\nfunction findPackageDockerDir(): string | null {\n const candidates = [\n // From npm package (relative to dist/commands/stack.js)\n join(__dirname, '..', '..', 'docker'),\n // Local development\n join(process.cwd(), 'docker'),\n join(process.cwd(), '..', 'squads-cli', 'docker'),\n join(homedir(), 'agents-squads', 'squads-cli', 'docker'),\n ];\n\n for (const dir of candidates) {\n if (existsSync(join(dir, 'docker-compose.yml'))) {\n return dir;\n }\n }\n\n return null;\n}\n\n/**\n * Load config from ~/.squadsrc\n */\nexport function loadStackConfig(): Partial<StackConfig> | null {\n if (!existsSync(CONFIG_PATH)) {\n return null;\n }\n\n try {\n const content = readFileSync(CONFIG_PATH, 'utf-8');\n const config: Partial<StackConfig> = {};\n\n for (const line of content.split('\\n')) {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith('#')) continue;\n\n const match = trimmed.match(/^export\\s+(\\w+)=[\"']?([^\"'\\n]*)[\"']?$/);\n if (match) {\n const [, key, value] = match;\n if (key in DEFAULT_CONFIG) {\n (config as Record<string, string>)[key] = value;\n }\n }\n }\n\n return config;\n } catch {\n return null;\n }\n}\n\n/**\n * Save config to ~/.squadsrc\n */\nfunction saveStackConfig(config: StackConfig): void {\n const lines = [\n '# Squads CLI Local Stack Configuration',\n '# Generated by: squads stack init',\n `# Date: ${new Date().toISOString().split('T')[0]}`,\n '',\n '# Database',\n `export SQUADS_DATABASE_URL=\"${config.SQUADS_DATABASE_URL}\"`,\n '',\n '# Bridge API',\n `export SQUADS_BRIDGE_URL=\"${config.SQUADS_BRIDGE_URL}\"`,\n '',\n '# Langfuse',\n `export LANGFUSE_HOST=\"${config.LANGFUSE_HOST}\"`,\n `export LANGFUSE_PUBLIC_KEY=\"${config.LANGFUSE_PUBLIC_KEY}\"`,\n `export LANGFUSE_SECRET_KEY=\"${config.LANGFUSE_SECRET_KEY}\"`,\n '',\n '# Redis',\n `export REDIS_URL=\"${config.REDIS_URL}\"`,\n '',\n '# To activate: source ~/.squadsrc',\n '',\n ];\n\n writeFileSync(CONFIG_PATH, lines.join('\\n'));\n}\n\n/**\n * Apply config to current process environment\n */\nexport function applyStackConfig(): void {\n const config = loadStackConfig();\n if (!config) return;\n\n for (const [key, value] of Object.entries(config)) {\n if (value && !process.env[key]) {\n process.env[key] = value;\n }\n }\n}\n\n/**\n * Check if Docker is running\n */\nfunction isDockerRunning(): boolean {\n try {\n execSync('docker info', { stdio: 'ignore' });\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Get container status\n */\nfunction getContainerStatus(name: string): ContainerStatus {\n try {\n // First check if container is running\n const runningOutput = execSync(\n `docker inspect ${name} --format '{{.State.Running}}'`,\n { encoding: 'utf-8', stdio: ['pipe', 'pipe', 'ignore'] }\n ).trim();\n\n const running = runningOutput === 'true';\n\n if (!running) {\n return { name, running: false, healthy: false };\n }\n\n // Get port info\n let port: string | undefined;\n try {\n const portOutput = execSync(\n `docker inspect ${name} --format '{{range .NetworkSettings.Ports}}{{range .}}{{.HostPort}}{{end}}{{end}}'`,\n { encoding: 'utf-8', stdio: ['pipe', 'pipe', 'ignore'] }\n ).trim();\n port = portOutput || undefined;\n } catch {\n // Ignore port errors\n }\n\n // Check health status (may not exist for all containers)\n let healthy = true; // Default to healthy if running but no health check\n try {\n const healthOutput = execSync(\n `docker inspect ${name} --format '{{if .State.Health}}{{.State.Health.Status}}{{else}}none{{end}}'`,\n { encoding: 'utf-8', stdio: ['pipe', 'pipe', 'ignore'] }\n ).trim();\n\n if (healthOutput === 'healthy' || healthOutput === 'none') {\n healthy = true;\n } else if (healthOutput === 'starting') {\n healthy = false; // Starting means not yet healthy\n } else {\n healthy = false; // unhealthy or other states\n }\n } catch {\n // If health check fails, assume healthy if running\n healthy = true;\n }\n\n return { name, running, healthy, port };\n } catch {\n return { name, running: false, healthy: false };\n }\n}\n\n/**\n * Check service connectivity\n */\nasync function checkService(url: string, timeout = 2000): Promise<boolean> {\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeout);\n\n const response = await fetch(url, { signal: controller.signal });\n clearTimeout(timeoutId);\n return response.ok;\n } catch {\n return false;\n }\n}\n\n/**\n * Get Langfuse API keys from the docker .env file\n */\nfunction getLangfuseKeysFromDockerEnv(): { publicKey: string; secretKey: string } | null {\n const envPaths = [\n join(process.cwd(), 'docker', '.env'),\n join(process.cwd(), '..', 'squads-cli', 'docker', '.env'),\n join(homedir(), 'agents-squads', 'squads-cli', 'docker', '.env'),\n ];\n\n for (const envPath of envPaths) {\n if (existsSync(envPath)) {\n const content = readFileSync(envPath, 'utf-8');\n const publicMatch = content.match(/LANGFUSE_PUBLIC_KEY=(\\S+)/);\n const secretMatch = content.match(/LANGFUSE_SECRET_KEY=(\\S+)/);\n\n if (publicMatch && secretMatch) {\n return {\n publicKey: publicMatch[1],\n secretKey: secretMatch[1],\n };\n }\n }\n }\n\n return null;\n}\n\n/**\n * Find docker-compose directory\n */\nfunction findDockerComposeDir(): string | null {\n const candidates = [\n join(process.cwd(), 'docker'),\n join(process.cwd(), '..', 'squads-cli', 'docker'),\n join(homedir(), 'agents-squads', 'squads-cli', 'docker'),\n ];\n\n for (const dir of candidates) {\n if (existsSync(join(dir, 'docker-compose.yml'))) {\n return dir;\n }\n }\n\n return null;\n}\n\n/**\n * squads stack init - setup wizard for local stack\n */\nexport async function stackInitCommand(): Promise<void> {\n writeLine();\n writeLine(` ${gradient('squads')} ${colors.dim}stack init${RESET}`);\n writeLine();\n writeLine(` ${bold}Local Infrastructure Setup Wizard${RESET}`);\n writeLine(` ${colors.dim}This will configure Docker services for conversation capture,${RESET}`);\n writeLine(` ${colors.dim}memory extraction, and telemetry.${RESET}`);\n writeLine();\n\n // Step 1: Check Docker\n writeLine(` ${bold}Step 1: Docker${RESET}`);\n if (!isDockerRunning()) {\n writeLine(` ${colors.red}${icons.error}${RESET} Docker is not running`);\n writeLine();\n writeLine(` ${colors.dim}Please start Docker Desktop and run this command again.${RESET}`);\n writeLine();\n return;\n }\n writeLine(` ${colors.green}${icons.success}${RESET} Docker is running`);\n writeLine();\n\n // Step 2: Find or setup docker compose files\n writeLine(` ${bold}Step 2: Docker Compose Files${RESET}`);\n\n let composeDir = findPackageDockerDir();\n const targetDir = join(SQUADS_DATA_DIR, 'docker');\n\n if (!composeDir) {\n writeLine(` ${colors.red}${icons.error}${RESET} Docker compose files not found`);\n writeLine(` ${colors.dim}This shouldn't happen if you installed via npm.${RESET}`);\n writeLine(` ${colors.dim}Try reinstalling: npm install -g squads-cli${RESET}`);\n writeLine();\n return;\n }\n\n // Copy to ~/.squads/docker if not already there\n if (composeDir !== targetDir && !existsSync(targetDir)) {\n writeLine(` ${colors.cyan}${icons.progress}${RESET} Copying docker files to ${colors.dim}~/.squads/docker${RESET}`);\n try {\n mkdirSync(SQUADS_DATA_DIR, { recursive: true });\n mkdirSync(targetDir, { recursive: true });\n\n // Copy essential files\n const filesToCopy = [\n 'docker-compose.yml',\n 'docker-compose.engram.yml',\n '.env.example',\n ];\n\n for (const file of filesToCopy) {\n const src = join(composeDir, file);\n const dst = join(targetDir, file);\n if (existsSync(src)) {\n copyFileSync(src, dst);\n }\n }\n\n composeDir = targetDir;\n writeLine(` ${colors.green}${icons.success}${RESET} Files copied`);\n } catch {\n writeLine(` ${colors.yellow}${icons.warning}${RESET} Could not copy files, using source location`);\n }\n } else if (existsSync(targetDir)) {\n composeDir = targetDir;\n writeLine(` ${colors.green}${icons.success}${RESET} Using ${colors.dim}~/.squads/docker${RESET}`);\n } else {\n writeLine(` ${colors.green}${icons.success}${RESET} Using ${colors.dim}${composeDir}${RESET}`);\n }\n writeLine();\n\n // Step 3: Configure .env\n writeLine(` ${bold}Step 3: Environment Configuration${RESET}`);\n\n const envPath = join(composeDir, '.env');\n const envExamplePath = join(composeDir, '.env.example');\n\n if (!existsSync(envPath)) {\n if (existsSync(envExamplePath)) {\n copyFileSync(envExamplePath, envPath);\n writeLine(` ${colors.cyan}${icons.progress}${RESET} Created .env from template`);\n } else {\n // Create minimal .env\n const minimalEnv = `# Squads Local Stack Configuration\n# Generated by: squads stack init\n\n# Langfuse API Keys (get from http://localhost:3100 after first run)\nLANGFUSE_PUBLIC_KEY=\nLANGFUSE_SECRET_KEY=\nLANGFUSE_HOST=http://langfuse:3000\n\n# Mem0/Engram LLM Provider\n# Options: ollama (free, local), openai (requires API key)\nLLM_PROVIDER=ollama\nOLLAMA_BASE_URL=http://host.docker.internal:11434\nOLLAMA_LLM_MODEL=qwen3:latest\nOLLAMA_EMBEDDING_MODEL=nomic-embed-text:latest\n\n# For OpenAI (if LLM_PROVIDER=openai)\n# OPENAI_API_KEY=sk-...\n\n# Ports (defaults)\nPOSTGRES_PORT=5433\nREDIS_PORT=6379\nLANGFUSE_PORT=3100\nOTEL_PORT=4318\nBRIDGE_PORT=8088\n`;\n writeFileSync(envPath, minimalEnv);\n writeLine(` ${colors.cyan}${icons.progress}${RESET} Created default .env`);\n }\n } else {\n writeLine(` ${colors.green}${icons.success}${RESET} .env exists`);\n }\n\n // Check for required secrets\n const envContent = readFileSync(envPath, 'utf-8');\n const missingSecrets: string[] = [];\n\n // Check LLM provider config\n const llmProvider = envContent.match(/LLM_PROVIDER=(\\w+)/)?.[1] || 'ollama';\n\n if (llmProvider === 'openai') {\n if (!envContent.match(/OPENAI_API_KEY=\\S+/)) {\n missingSecrets.push('OPENAI_API_KEY');\n }\n }\n\n if (missingSecrets.length > 0) {\n writeLine();\n writeLine(` ${colors.yellow}${icons.warning}${RESET} Missing secrets in .env:`);\n for (const secret of missingSecrets) {\n writeLine(` ${colors.red}•${RESET} ${secret}`);\n }\n writeLine();\n writeLine(` ${colors.dim}Edit: ${envPath}${RESET}`);\n }\n writeLine();\n\n // Step 4: Start containers\n writeLine(` ${bold}Step 4: Start Services${RESET}`);\n\n const containers = [\n { name: 'squads-postgres', required: true },\n { name: 'squads-redis', required: true },\n { name: 'squads-bridge', required: true },\n { name: 'squads-langfuse', required: false },\n { name: 'squads-otel-collector', required: false },\n { name: 'squads-mem0', required: false },\n ];\n\n const statuses = containers.map(c => ({ ...c, ...getContainerStatus(c.name) }));\n const requiredNotRunning = statuses.filter(s => s.required && !s.running);\n\n for (const status of statuses) {\n const icon = status.running\n ? status.healthy\n ? `${colors.green}●${RESET}`\n : `${colors.yellow}●${RESET}`\n : `${colors.red}○${RESET}`;\n const suffix = status.required ? '' : `${colors.dim}(optional)${RESET}`;\n writeLine(` ${icon} ${status.name} ${suffix}`);\n }\n writeLine();\n\n if (requiredNotRunning.length > 0) {\n const shouldStart = await confirm('Start required services now?');\n\n if (shouldStart) {\n writeLine();\n writeLine(` ${colors.cyan}${icons.progress}${RESET} Starting containers...`);\n\n try {\n execSync('docker compose up -d', {\n cwd: composeDir,\n stdio: 'inherit',\n });\n\n // Wait for services to be healthy\n writeLine(` ${colors.cyan}${icons.progress}${RESET} Waiting for services to be ready...`);\n await new Promise(resolve => setTimeout(resolve, 5000));\n\n writeLine(` ${colors.green}${icons.success}${RESET} Services started`);\n } catch {\n writeLine(` ${colors.red}${icons.error}${RESET} Failed to start services`);\n writeLine(` ${colors.dim}Try manually: cd ${composeDir} && docker compose up -d${RESET}`);\n }\n }\n writeLine();\n }\n\n // Step 5: Get Langfuse keys\n writeLine(` ${bold}Step 5: Langfuse API Keys${RESET}`);\n\n const langfuseKeys = getLangfuseKeysFromDockerEnv();\n\n if (!langfuseKeys?.publicKey || !langfuseKeys?.secretKey) {\n writeLine(` ${colors.yellow}${icons.warning}${RESET} Langfuse API keys not configured`);\n writeLine();\n writeLine(` ${colors.dim}To enable telemetry:${RESET}`);\n writeLine(` ${colors.dim}1. Open http://localhost:3100${RESET}`);\n writeLine(` ${colors.dim}2. Create account and project${RESET}`);\n writeLine(` ${colors.dim}3. Copy API keys to ${envPath}${RESET}`);\n writeLine(` ${colors.dim}4. Run: squads stack init (again)${RESET}`);\n } else {\n writeLine(` ${colors.green}${icons.success}${RESET} Langfuse keys configured`);\n }\n writeLine();\n\n // Step 6: Create ~/.squadsrc\n writeLine(` ${bold}Step 6: CLI Configuration${RESET}`);\n\n const config: StackConfig = {\n ...DEFAULT_CONFIG,\n LANGFUSE_PUBLIC_KEY: langfuseKeys?.publicKey || '',\n LANGFUSE_SECRET_KEY: langfuseKeys?.secretKey || '',\n };\n\n saveStackConfig(config);\n writeLine(` ${colors.green}${icons.success}${RESET} Config saved to ${colors.cyan}~/.squadsrc${RESET}`);\n writeLine();\n\n // Final summary\n writeLine(` ${colors.green}${bold}Setup Complete!${RESET}`);\n writeLine();\n writeLine(` ${colors.dim}To activate environment:${RESET}`);\n writeLine(` ${colors.cyan}source ~/.squadsrc${RESET}`);\n writeLine();\n writeLine(` ${colors.dim}Add to ~/.zshrc for persistence:${RESET}`);\n writeLine(` ${colors.cyan}[ -f ~/.squadsrc ] && source ~/.squadsrc${RESET}`);\n writeLine();\n writeLine(` ${colors.dim}Check status anytime:${RESET}`);\n writeLine(` ${colors.cyan}squads stack health${RESET}`);\n writeLine();\n}\n\n/**\n * squads stack status - show connection health\n */\nexport async function stackStatusCommand(): Promise<void> {\n writeLine();\n writeLine(` ${gradient('squads')} ${colors.dim}stack status${RESET}`);\n writeLine();\n\n // Check Docker\n if (!isDockerRunning()) {\n writeLine(` ${colors.red}${icons.error}${RESET} Docker is not running`);\n writeLine();\n return;\n }\n\n // Container status\n const containers = [\n { name: 'squads-postgres', service: 'Database' },\n { name: 'squads-redis', service: 'Cache' },\n { name: 'squads-bridge', service: 'Bridge API' },\n { name: 'squads-langfuse', service: 'Langfuse' },\n { name: 'squads-otel-collector', service: 'Telemetry' },\n ];\n\n const w = { service: 12, container: 22, status: 12 };\n const tableWidth = w.service + w.container + w.status + 6;\n\n writeLine(` ${colors.purple}${box.topLeft}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.topRight}${RESET}`);\n writeLine(\n ` ${colors.purple}${box.vertical}${RESET} ${bold}${padEnd('SERVICE', w.service)}${RESET}${bold}${padEnd('CONTAINER', w.container)}${RESET}${bold}STATUS${RESET} ${colors.purple}${box.vertical}${RESET}`\n );\n writeLine(` ${colors.purple}${box.teeRight}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.teeLeft}${RESET}`);\n\n for (const { name, service } of containers) {\n const status = getContainerStatus(name);\n const statusIcon = status.running\n ? status.healthy\n ? `${colors.green}● healthy${RESET}`\n : `${colors.yellow}● starting${RESET}`\n : `${colors.red}○ stopped${RESET}`;\n\n writeLine(\n ` ${colors.purple}${box.vertical}${RESET} ${colors.cyan}${padEnd(service, w.service)}${RESET}${colors.dim}${padEnd(name, w.container)}${RESET}${statusIcon} ${colors.purple}${box.vertical}${RESET}`\n );\n }\n\n writeLine(` ${colors.purple}${box.bottomLeft}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.bottomRight}${RESET}`);\n\n // Config status\n writeLine();\n const config = loadStackConfig();\n if (config) {\n writeLine(` ${colors.green}${icons.success}${RESET} Config loaded from ${colors.cyan}~/.squadsrc${RESET}`);\n\n // Check if env vars are set\n const envVars = ['SQUADS_DATABASE_URL', 'SQUADS_BRIDGE_URL', 'LANGFUSE_HOST'];\n const missing = envVars.filter((v) => !process.env[v]);\n\n if (missing.length > 0) {\n writeLine(` ${colors.yellow}${icons.warning}${RESET} Env vars not in shell: ${colors.dim}${missing.join(', ')}${RESET}`);\n writeLine(` ${colors.dim}Run: source ~/.squadsrc${RESET}`);\n } else {\n writeLine(` ${colors.green}${icons.success}${RESET} All env vars loaded`);\n }\n } else {\n writeLine(` ${colors.yellow}${icons.warning}${RESET} No config found`);\n writeLine(` ${colors.dim}Run: squads stack init${RESET}`);\n }\n\n writeLine();\n}\n\n/**\n * squads stack env - print export commands\n */\nexport function stackEnvCommand(): void {\n const config = loadStackConfig();\n\n if (!config) {\n // Output defaults if no config\n console.log(`# Squads Local Stack - Default Config`);\n console.log(`# Run 'squads stack init' to auto-detect and save`);\n console.log();\n for (const [key, value] of Object.entries(DEFAULT_CONFIG)) {\n console.log(`export ${key}=\"${value}\"`);\n }\n return;\n }\n\n // Output saved config\n console.log(`# Squads Local Stack Config`);\n console.log(`# From: ~/.squadsrc`);\n console.log();\n for (const [key, value] of Object.entries(config)) {\n console.log(`export ${key}=\"${value}\"`);\n }\n}\n\n/**\n * squads stack up - start docker compose\n */\nexport async function stackUpCommand(): Promise<void> {\n writeLine();\n writeLine(` ${gradient('squads')} ${colors.dim}stack up${RESET}`);\n writeLine();\n\n const composeDir = findDockerComposeDir();\n\n if (!composeDir) {\n writeLine(` ${colors.red}${icons.error}${RESET} docker-compose.yml not found`);\n writeLine();\n writeLine(` ${colors.dim}Expected locations:${RESET}`);\n writeLine(` ${colors.dim} ./docker/docker-compose.yml${RESET}`);\n writeLine(` ${colors.dim} ~/agents-squads/squads-cli/docker/docker-compose.yml${RESET}`);\n writeLine();\n return;\n }\n\n writeLine(` ${colors.cyan}${icons.progress}${RESET} Starting containers from ${colors.dim}${composeDir}${RESET}`);\n writeLine();\n\n try {\n const child = spawn('docker-compose', ['up', '-d'], {\n cwd: composeDir,\n stdio: 'inherit',\n });\n\n await new Promise<void>((resolve, reject) => {\n child.on('close', (code) => {\n if (code === 0) resolve();\n else reject(new Error(`docker-compose exited with code ${code}`));\n });\n child.on('error', reject);\n });\n\n writeLine();\n writeLine(` ${colors.green}${icons.success}${RESET} Stack started`);\n writeLine(` ${colors.dim}Run: squads stack init${RESET} to configure CLI`);\n writeLine();\n } catch (error) {\n writeLine(` ${colors.red}${icons.error}${RESET} Failed to start stack`);\n writeLine(` ${colors.dim}${error}${RESET}`);\n writeLine();\n }\n}\n\n/**\n * squads stack health - comprehensive health check with diagnostics\n */\nexport async function stackHealthCommand(verbose = false): Promise<void> {\n writeLine();\n writeLine(` ${gradient('squads')} ${colors.dim}stack health${RESET}`);\n writeLine();\n\n // Check Docker\n if (!isDockerRunning()) {\n writeLine(` ${colors.red}${icons.error}${RESET} Docker is not running`);\n writeLine();\n process.exitCode = 1;\n return;\n }\n\n // All containers including engram stack\n const containers = [\n { name: 'squads-postgres', service: 'postgres', healthUrl: '', critical: true },\n { name: 'squads-redis', service: 'redis', healthUrl: '', critical: true },\n { name: 'squads-neo4j', service: 'neo4j', healthUrl: 'http://localhost:7474', critical: false },\n { name: 'squads-bridge', service: 'bridge', healthUrl: 'http://localhost:8088/health', critical: true },\n { name: 'squads-otel-collector', service: 'otel', healthUrl: '', critical: false },\n { name: 'squads-langfuse', service: 'langfuse', healthUrl: 'http://localhost:3100/api/public/health', critical: false },\n { name: 'squads-mem0', service: 'mem0', healthUrl: 'http://localhost:8000/health', critical: false },\n { name: 'squads-engram-mcp', service: 'engram', healthUrl: 'http://localhost:8080/', critical: false },\n ];\n\n let hasFailures = false;\n const results: Array<{ name: string; service: string; ok: boolean; status: string; logs?: string }> = [];\n\n for (const container of containers) {\n const status = getContainerStatus(container.name);\n let ok = status.running && status.healthy;\n let statusText = '';\n\n if (!status.running) {\n statusText = 'stopped';\n ok = false;\n } else if (!status.healthy) {\n statusText = 'unhealthy';\n ok = false;\n } else if (container.healthUrl) {\n // Additional HTTP health check\n const httpOk = await checkService(container.healthUrl);\n if (!httpOk) {\n statusText = 'not responding';\n ok = false;\n } else {\n statusText = 'healthy';\n }\n } else {\n statusText = 'healthy';\n }\n\n // Get logs if unhealthy\n let logs: string | undefined;\n if (!ok && verbose) {\n try {\n logs = execSync(`docker logs ${container.name} --tail 10 2>&1`, {\n encoding: 'utf-8',\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n } catch {\n logs = '(no logs available)';\n }\n }\n\n if (!ok && container.critical) {\n hasFailures = true;\n }\n\n results.push({ name: container.name, service: container.service, ok, status: statusText, logs });\n }\n\n // Display results\n for (const r of results) {\n const icon = r.ok ? `${colors.green}✓${RESET}` : `${colors.red}✗${RESET}`;\n const statusColor = r.ok ? colors.green : colors.red;\n writeLine(` ${icon} ${padEnd(r.service, 10)} ${statusColor}${r.status}${RESET}`);\n\n if (r.logs && !r.ok) {\n writeLine(` ${colors.dim}${'-'.repeat(40)}${RESET}`);\n for (const line of r.logs.split('\\n').slice(0, 5)) {\n writeLine(` ${colors.dim}${line.substring(0, 70)}${RESET}`);\n }\n }\n }\n\n writeLine();\n\n // Summary\n const healthy = results.filter((r) => r.ok).length;\n const total = results.length;\n\n if (hasFailures) {\n writeLine(` ${colors.red}${icons.error}${RESET} ${healthy}/${total} services healthy - critical failures`);\n writeLine(` ${colors.dim}Run with -v for logs: squads stack health -v${RESET}`);\n process.exitCode = 1;\n } else if (healthy < total) {\n writeLine(` ${colors.yellow}${icons.warning}${RESET} ${healthy}/${total} services healthy - non-critical issues`);\n } else {\n writeLine(` ${colors.green}${icons.success}${RESET} ${healthy}/${total} services healthy`);\n }\n\n writeLine();\n}\n\n/**\n * squads stack logs - show logs for a specific service\n */\nexport function stackLogsCommand(service: string, tail = 50): void {\n const containerMap: Record<string, string> = {\n postgres: 'squads-postgres',\n redis: 'squads-redis',\n neo4j: 'squads-neo4j',\n bridge: 'squads-bridge',\n otel: 'squads-otel-collector',\n langfuse: 'squads-langfuse',\n mem0: 'squads-mem0',\n engram: 'squads-engram-mcp',\n };\n\n const container = containerMap[service] || `squads-${service}`;\n\n try {\n execSync(`docker logs ${container} --tail ${tail}`, { stdio: 'inherit' });\n } catch {\n writeLine(` ${colors.red}${icons.error}${RESET} Container ${container} not found`);\n }\n}\n\n/**\n * squads stack down - stop docker compose\n */\nexport async function stackDownCommand(): Promise<void> {\n writeLine();\n writeLine(` ${gradient('squads')} ${colors.dim}stack down${RESET}`);\n writeLine();\n\n const composeDir = findDockerComposeDir();\n\n if (!composeDir) {\n writeLine(` ${colors.red}${icons.error}${RESET} docker-compose.yml not found`);\n writeLine();\n return;\n }\n\n writeLine(` ${colors.cyan}${icons.progress}${RESET} Stopping containers...`);\n writeLine();\n\n try {\n const child = spawn('docker-compose', ['down'], {\n cwd: composeDir,\n stdio: 'inherit',\n });\n\n await new Promise<void>((resolve, reject) => {\n child.on('close', (code) => {\n if (code === 0) resolve();\n else reject(new Error(`docker-compose exited with code ${code}`));\n });\n child.on('error', reject);\n });\n\n writeLine();\n writeLine(` ${colors.green}${icons.success}${RESET} Stack stopped`);\n writeLine();\n } catch (error) {\n writeLine(` ${colors.red}${icons.error}${RESET} Failed to stop stack`);\n writeLine(` ${colors.dim}${error}${RESET}`);\n writeLine();\n }\n}\n","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 './stack.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 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}Database not available${RESET}`);\n writeLine(` ${colors.dim}Run: docker compose up -d${RESET}`);\n writeLine();\n return;\n }\n throw new Error(`HTTP ${response.status}`);\n }\n\n const data = await response.json() as { results: ConversationResult[]; count: number };\n const conversations = data.results;\n const total = data.count;\n\n if (conversations.length === 0) {\n writeLine(` ${colors.yellow}No conversations found for \"${query}\"${RESET}`);\n writeLine();\n writeLine(` ${colors.dim}Conversations are captured via hooks. Make sure:${RESET}`);\n writeLine(` ${colors.dim} 1. squads-bridge is running (docker compose up)${RESET}`);\n writeLine(` ${colors.dim} 2. engram hook is configured in Claude settings${RESET}`);\n writeLine();\n return;\n }\n\n writeLine(` ${colors.green}${conversations.length}${RESET} of ${total} results`);\n writeLine();\n\n // Table\n const w = { time: 12, role: 10, type: 10, content: 50 };\n const tableWidth = w.time + w.role + w.type + w.content + 6;\n\n writeLine(` ${colors.purple}${box.topLeft}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.topRight}${RESET}`);\n\n const header = ` ${colors.purple}${box.vertical}${RESET} ` +\n `${bold}${padEnd('TIME', w.time)}${RESET}` +\n `${bold}${padEnd('ROLE', w.role)}${RESET}` +\n `${bold}${padEnd('TYPE', w.type)}${RESET}` +\n `${bold}${padEnd('CONTENT', w.content)}${RESET}` +\n ` ${colors.purple}${box.vertical}${RESET}`;\n writeLine(header);\n\n writeLine(` ${colors.purple}${box.teeRight}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.teeLeft}${RESET}`);\n\n for (const conv of conversations) {\n const time = new Date(conv.created_at).toLocaleTimeString('en-US', { hour: '2-digit', minute: '2-digit' });\n const roleColor = conv.role === 'user' ? colors.cyan : conv.role === 'thinking' ? colors.yellow : colors.green;\n const importanceIcon = conv.importance === 'high' ? icons.success : '';\n\n // Highlight search term in content\n const contentPreview = truncate((conv.content || '').replace(/\\n/g, ' '), w.content - 2);\n const highlighted = contentPreview.replace(\n new RegExp(query, 'gi'),\n (m) => `${colors.yellow}${m}${RESET}${colors.dim}`\n );\n\n const row = ` ${colors.purple}${box.vertical}${RESET} ` +\n `${colors.dim}${padEnd(time, w.time)}${RESET}` +\n `${roleColor}${padEnd(conv.role || '', w.role)}${RESET}` +\n `${colors.dim}${padEnd(conv.type || 'message', w.type)}${RESET}` +\n `${colors.dim}${padEnd(highlighted + importanceIcon, w.content)}${RESET}` +\n ` ${colors.purple}${box.vertical}${RESET}`;\n\n writeLine(row);\n }\n\n writeLine(` ${colors.purple}${box.bottomLeft}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.bottomRight}${RESET}`);\n writeLine();\n\n // Expanded view of top results\n writeLine(` ${bold}Top Matches${RESET}`);\n writeLine();\n\n for (const conv of conversations.slice(0, 3)) {\n const time = new Date(conv.created_at).toLocaleString('en-US', {\n month: 'short', day: 'numeric', hour: '2-digit', minute: '2-digit'\n });\n const roleIcon = conv.role === 'user' ? '👤' : conv.role === 'thinking' ? '💭' : '🤖';\n\n writeLine(` ${roleIcon} ${colors.dim}${time}${RESET} ${conv.importance === 'high' ? colors.yellow + '[high]' + RESET : ''}`);\n\n // Show first 200 chars with highlighted search term\n const content = conv.content || '';\n const preview = content.substring(0, 200).replace(/\\n/g, ' ');\n const highlighted = preview.replace(\n new RegExp(query, 'gi'),\n (m) => `${colors.yellow}${m}${RESET}`\n );\n writeLine(` ${highlighted}${content.length > 200 ? '...' : ''}`);\n writeLine();\n }\n\n // Commands\n writeLine(` ${colors.dim}$${RESET} squads memory search ${colors.cyan}\"<term>\"${RESET} --role user ${colors.dim}Filter by role${RESET}`);\n writeLine(` ${colors.dim}$${RESET} squads memory search ${colors.cyan}\"<term>\"${RESET} --importance high ${colors.dim}Filter by importance${RESET}`);\n writeLine();\n\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n if (errorMessage.includes('ECONNREFUSED') || 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 {\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 {\n // Not in a git repo or other error\n }\n\n return commits;\n}\n\nfunction detectSquadsFromCommit(commit: CommitInfo): string[] {\n const squads = new Set<string>();\n\n // Check file paths\n for (const file of commit.files) {\n for (const [pathPattern, squad] of Object.entries(PATH_TO_SQUAD)) {\n if (file.includes(pathPattern)) {\n squads.add(squad);\n }\n }\n }\n\n // Check commit message\n const msgLower = commit.message.toLowerCase();\n for (const [keyword, squad] of Object.entries(MESSAGE_TO_SQUAD)) {\n if (msgLower.includes(keyword)) {\n squads.add(squad);\n }\n }\n\n return Array.from(squads);\n}\n\nfunction groupCommitsBySquad(commits: CommitInfo[]): Map<string, CommitInfo[]> {\n const grouped = new Map<string, CommitInfo[]>();\n\n for (const commit of commits) {\n const squads = detectSquadsFromCommit(commit);\n\n for (const squad of squads) {\n if (!grouped.has(squad)) {\n grouped.set(squad, []);\n }\n grouped.get(squad)!.push(commit);\n }\n }\n\n return grouped;\n}\n\nfunction generateSummary(commits: CommitInfo[]): string {\n if (commits.length === 0) return '';\n\n const messages = commits.map(c => `- ${c.message}`).join('\\n');\n const date = new Date().toISOString().split('T')[0];\n\n return `\n## Session Update (${date})\n\n${messages}\n`;\n}\n\nfunction appendToSquadMemory(\n memoryDir: string,\n squad: string,\n summary: string\n): boolean {\n // Find the lead agent for this squad\n const squadMemoryDir = join(memoryDir, squad);\n\n if (!existsSync(squadMemoryDir)) {\n mkdirSync(squadMemoryDir, { recursive: true });\n }\n\n // Look for existing agent directories or create default\n let agentDir: string;\n const existingDirs = existsSync(squadMemoryDir)\n ? readdirSync(squadMemoryDir, { withFileTypes: true })\n .filter((d) => d.isDirectory())\n .map((d) => d.name)\n : [];\n\n if (existingDirs.length > 0) {\n // Use first existing agent (usually the lead)\n agentDir = join(squadMemoryDir, existingDirs[0]);\n } else {\n // Create default agent directory\n agentDir = join(squadMemoryDir, `${squad}-lead`);\n mkdirSync(agentDir, { recursive: true });\n }\n\n const statePath = join(agentDir, 'state.md');\n\n let content = '';\n if (existsSync(statePath)) {\n content = readFileSync(statePath, 'utf-8');\n } else {\n content = `# ${squad} Squad - State\\n\\nUpdated: ${new Date().toISOString().split('T')[0]}\\n`;\n }\n\n // Update the \"Updated\" line\n content = content.replace(\n /Updated:\\s*\\d{4}-\\d{2}-\\d{2}/,\n `Updated: ${new Date().toISOString().split('T')[0]}`\n );\n\n // Append the summary\n content += summary;\n\n writeFileSync(statePath, content);\n return true;\n}\n\n/**\n * Pull latest memory changes from git remote\n */\nfunction gitPullMemory(): { success: boolean; output: string; behind: number; ahead: number } {\n try {\n // First fetch to see what's different\n execSync('git fetch origin', { encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] });\n\n // Check how many commits behind/ahead\n const status = execSync('git status -sb', { encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] });\n const behindMatch = status.match(/behind (\\d+)/);\n const aheadMatch = status.match(/ahead (\\d+)/);\n const behind = behindMatch ? parseInt(behindMatch[1]) : 0;\n const ahead = aheadMatch ? parseInt(aheadMatch[1]) : 0;\n\n if (behind === 0) {\n return { success: true, output: 'Already up to date', behind: 0, ahead };\n }\n\n // Pull with rebase to get latest\n const output = execSync('git pull --rebase origin main', {\n encoding: 'utf-8',\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n\n return { success: true, output: output.trim(), behind, ahead };\n } catch (error) {\n const err = error as { message?: string };\n return { success: false, output: err.message || 'Pull failed', behind: 0, ahead: 0 };\n }\n}\n\n/**\n * Push local memory changes to git remote\n */\nfunction gitPushMemory(): { success: boolean; output: string } {\n try {\n // Check if there are uncommitted changes in memory\n const status = execSync('git status --porcelain .agents/memory/', {\n encoding: 'utf-8',\n stdio: ['pipe', 'pipe', 'pipe'],\n }).trim();\n\n if (status) {\n // Stage and commit memory changes\n execSync('git add .agents/memory/', { stdio: ['pipe', 'pipe', 'pipe'] });\n execSync('git commit -m \"chore: sync squad memory\"', {\n encoding: 'utf-8',\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n }\n\n // Push to remote\n const output = execSync('git push origin main', {\n encoding: 'utf-8',\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n\n return { success: true, output: output.trim() || 'Pushed successfully' };\n } catch (error) {\n const err = error as { message?: string };\n return { success: false, output: err.message || 'Push failed' };\n }\n}\n\nexport async function syncCommand(options: { verbose?: boolean; push?: boolean; pull?: boolean } = {}): Promise<void> {\n await track(Events.CLI_MEMORY_SYNC, { push: options.push, pull: options.pull });\n const memoryDir = findMemoryDir();\n const _squadsDir = findSquadsDir();\n\n if (!memoryDir) {\n writeLine(` ${colors.yellow}No .agents/memory directory found${RESET}`);\n writeLine(` ${colors.dim}Run \\`squads init\\` to create one.${RESET}`);\n return; // Graceful exit - don't fail hooks\n }\n\n writeLine();\n writeLine(` ${gradient('squads')} ${colors.dim}memory sync${RESET}`);\n writeLine();\n\n // Default behavior: pull from remote\n const doPull = options.pull !== false; // Pull by default unless explicitly disabled\n const doPush = options.push === true; // Only push if explicitly requested\n\n // Step 1: Pull from git remote\n if (doPull) {\n writeLine(` ${icons.progress} Pulling from remote...`);\n const pullResult = gitPullMemory();\n\n if (pullResult.success) {\n if (pullResult.behind > 0) {\n writeLine(` ${icons.success} Pulled ${colors.cyan}${pullResult.behind}${RESET} commits from remote`);\n } else {\n writeLine(` ${icons.success} ${colors.dim}Already up to date${RESET}`);\n }\n if (pullResult.ahead > 0) {\n writeLine(` ${colors.dim} ${pullResult.ahead} local commits to push${RESET}`);\n }\n } else {\n writeLine(` ${icons.error} ${colors.red}Pull failed: ${pullResult.output}${RESET}`);\n }\n writeLine();\n }\n\n // Get last sync time\n const lastSync = getLastSyncTime(memoryDir);\n if (lastSync) {\n writeLine(` ${colors.dim}Last sync: ${lastSync.split('T')[0]}${RESET}`);\n } else {\n writeLine(` ${colors.dim}First sync${RESET}`);\n }\n writeLine();\n\n // Get recent commits\n const commits = getRecentCommits(lastSync || undefined);\n\n if (commits.length === 0) {\n writeLine(` ${colors.yellow}No new commits since last sync${RESET}`);\n writeLine();\n return;\n }\n\n writeLine(` ${colors.cyan}${commits.length}${RESET} commits to process`);\n writeLine();\n\n // Group by squad\n const bySquad = groupCommitsBySquad(commits);\n\n if (bySquad.size === 0) {\n writeLine(` ${colors.yellow}No squad-related commits found${RESET}`);\n writeLine();\n updateLastSyncTime(memoryDir);\n return;\n }\n\n // Update each squad's memory\n let updated = 0;\n for (const [squad, squadCommits] of bySquad) {\n const summary = generateSummary(squadCommits);\n\n if (options.verbose) {\n writeLine(` ${icons.progress} ${colors.cyan}${squad}${RESET}`);\n for (const commit of squadCommits) {\n writeLine(` ${colors.dim}${commit.hash} ${commit.message}${RESET}`);\n }\n }\n\n const success = appendToSquadMemory(memoryDir, squad, summary);\n if (success) {\n writeLine(` ${icons.success} ${colors.cyan}${squad}${RESET} ${colors.dim}(${squadCommits.length} commits)${RESET}`);\n updated++;\n }\n }\n\n writeLine();\n writeLine(` ${colors.green}${updated}${RESET} squad memories updated`);\n writeLine();\n\n // Update last sync time\n updateLastSyncTime(memoryDir);\n\n // Step 3: Push to remote if requested\n if (doPush) {\n writeLine(` ${icons.progress} Pushing to remote...`);\n const pushResult = gitPushMemory();\n\n if (pushResult.success) {\n writeLine(` ${icons.success} ${colors.green}Pushed memory updates to remote${RESET}`);\n } else {\n writeLine(` ${icons.error} ${colors.red}Push failed: ${pushResult.output}${RESET}`);\n }\n writeLine();\n }\n\n // Show helpful commands\n writeLine(` ${colors.dim}$${RESET} squads memory show ${colors.cyan}<squad>${RESET} ${colors.dim}View updated memory${RESET}`);\n writeLine(` ${colors.dim}$${RESET} squads status ${colors.dim}See all squads${RESET}`);\n if (!doPush && updated > 0) {\n writeLine(` ${colors.dim}$${RESET} squads memory sync --push ${colors.dim}Push changes to remote${RESET}`);\n }\n writeLine();\n}\n","import {\n loadSquad,\n findSquadsDir,\n listSquads,\n addGoalToSquad,\n updateGoalInSquad,\n} 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 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 { 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 } from '../lib/costs.js';\nimport { getMultiRepoGitStats, getActivitySparkline, getGitHubStatsOptimized, SquadGitHubStats, GitPerformanceStats, GitHubStats } from '../lib/git.js';\nimport { saveDashboardSnapshot, isDatabaseAvailable, getDashboardHistory, DashboardSnapshot, SquadSnapshotData, closeDatabase } 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}\n\nexport async function dashboardCommand(options: { verbose?: boolean; ceo?: boolean; fast?: 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 // Fetch all expensive data in parallel to minimize wall time\n // Wrap slow calls with race timeout to ensure CLI responsiveness\n const timeout = <T>(promise: Promise<T>, ms: number, fallback: T): Promise<T> =>\n Promise.race([promise, new Promise<T>(resolve => setTimeout(() => resolve(fallback), ms))]);\n\n // Clean up stale file-based sessions (sync, fast)\n cleanupStaleSessions();\n\n const [gitStats, ghStats, costs, bridgeStats, activity, dbAvailable, history, insights, sessionSummary, npmStats] = await Promise.all([\n // Git stats (local, ~1s)\n Promise.resolve(baseDir ? getMultiRepoGitStats(baseDir, 30) : null),\n // GitHub stats (network, ~20-30s) - skip by default for fast mode\n skipGitHub ? Promise.resolve(null) : Promise.resolve(baseDir ? getGitHubStatsOptimized(baseDir, 30) : null),\n // Langfuse costs (network, 2s timeout)\n timeout(fetchCostSummary(100), 2000, null),\n // Bridge stats (local network, 2s timeout)\n timeout(fetchBridgeStats(), 2000, null),\n // Activity sparkline (local, <1s)\n Promise.resolve(baseDir ? getActivitySparkline(baseDir, 14) : []),\n // Database availability check (1.5s timeout)\n timeout(isDatabaseAvailable(), 1500, false),\n // Dashboard history (1.5s timeout)\n timeout(getDashboardHistory(14).catch(() => [] as DashboardSnapshot[]), 1500, [] as DashboardSnapshot[]),\n // Insights (2s timeout)\n timeout(fetchInsights('week').catch(() => null), 2000, null),\n // Session summary (parallel lsof, ~1s)\n getLiveSessionSummaryAsync(),\n // NPM download stats (network, 2s timeout)\n timeout(fetchNpmStats('squads-cli'), 2000, null),\n ]);\n\n // Create cache for render functions\n const cache: DashboardCache = { gitStats, ghStats, costs, bridgeStats, activity, dbAvailable, history, insights, sessionSummary, npmStats };\n\n // === PHASE 2: Build squad metrics (sync, fast) ===\n const squadData: SquadMetrics[] = [];\n\n for (const name of squadNames) {\n const squad = loadSquad(name);\n if (!squad) continue;\n\n const lastActivity = getLastActivityDate(name);\n const github = ghStats?.bySquad.get(name) || null;\n\n let status: SquadMetrics['status'] = 'active';\n const activeGoals = squad.goals.filter(g => !g.completed);\n if (activeGoals.length === 0) {\n status = 'needs-goal';\n } else if (lastActivity.includes('w') || lastActivity === '—') {\n status = 'stale';\n }\n\n const totalGoals = squad.goals.length;\n const completedGoals = squad.goals.filter(g => g.completed).length;\n const hasProgress = squad.goals.filter(g => g.progress).length;\n const goalProgress = totalGoals > 0\n ? Math.round(((completedGoals + hasProgress * 0.3) / totalGoals) * 100)\n : 0;\n\n // Calculate commit counts from git stats\n const repoSquadMap: Record<string, string[]> = {\n website: ['agents-squads-web'],\n product: ['squads-cli'],\n engineering: ['hq', 'squads-cli'],\n research: ['research'],\n intelligence: ['intelligence'],\n customer: ['customer'],\n finance: ['finance'],\n company: ['company', 'hq'],\n marketing: ['marketing', 'agents-squads-web'],\n cli: ['squads-cli'],\n };\n\n let squadCommits = 0;\n if (gitStats) {\n for (const [repo, commits] of gitStats.commitsByRepo) {\n if (repoSquadMap[name]?.includes(repo)) {\n squadCommits += commits;\n }\n }\n }\n\n // Create github stats object (from ghStats or minimal with just commits)\n const githubStats: SquadGitHubStats = github || {\n prsOpened: 0,\n prsMerged: 0,\n issuesClosed: 0,\n issuesOpen: 0,\n commits: 0,\n recentIssues: [],\n recentPRs: [],\n };\n githubStats.commits = squadCommits;\n\n squadData.push({\n name,\n mission: squad.mission,\n goals: squad.goals,\n lastActivity,\n status,\n github: githubStats,\n goalProgress,\n });\n }\n\n // === PHASE 3: Render (sync, fast) ===\n const activeSquads = squadData.filter(s => s.status === 'active').length;\n const totalPRs = ghStats ? ghStats.prsMerged : 0;\n const totalIssuesClosed = ghStats ? ghStats.issuesClosed : 0;\n const totalIssuesOpen = ghStats ? ghStats.issuesOpen : 0;\n\n writeLine();\n writeLine(` ${gradient('squads')} ${colors.dim}dashboard${RESET}`);\n\n // Check for updates (cached, non-blocking)\n const updateInfo = checkForUpdate();\n if (updateInfo.updateAvailable) {\n writeLine(` ${colors.cyan}⬆${RESET} Update available: ${colors.dim}${updateInfo.currentVersion}${RESET} → ${colors.green}${updateInfo.latestVersion}${RESET} ${colors.dim}(run \\`squads update\\`)${RESET}`);\n }\n\n // Session indicator line (only if there are active sessions)\n if (sessionSummary.totalSessions > 0) {\n const sessionText = sessionSummary.totalSessions === 1 ? 'session' : 'sessions';\n const squadText = sessionSummary.squadCount === 1 ? 'squad' : 'squads';\n\n // Build tool breakdown string (e.g., \"claude 4, cursor 2\")\n let toolInfo = '';\n if (sessionSummary.byTool && Object.keys(sessionSummary.byTool).length > 0) {\n const toolParts = Object.entries(sessionSummary.byTool)\n .sort((a, b) => b[1] - a[1]) // Sort by count descending\n .map(([tool, count]) => `${colors.dim}${tool}${RESET} ${colors.cyan}${count}${RESET}`);\n toolInfo = ` ${colors.dim}(${RESET}${toolParts.join(` ${colors.dim}·${RESET} `)}${colors.dim})${RESET}`;\n }\n\n writeLine(` ${colors.green}${icons.active}${RESET} ${colors.white}${sessionSummary.totalSessions}${RESET} active ${sessionText} ${colors.dim}across${RESET} ${colors.cyan}${sessionSummary.squadCount}${RESET} ${squadText}${toolInfo}`);\n }\n writeLine();\n\n // Stats row - show different info based on whether GitHub data is available\n const statsParts = [`${colors.cyan}${activeSquads}${RESET}/${squadData.length} squads`];\n if (ghStats) {\n statsParts.push(`${colors.green}${totalPRs}${RESET} PRs merged`);\n statsParts.push(`${colors.purple}${totalIssuesClosed}${RESET} closed`);\n statsParts.push(`${colors.yellow}${totalIssuesOpen}${RESET} open`);\n } else {\n statsParts.push(`${colors.cyan}${gitStats?.totalCommits || 0}${RESET} commits`);\n statsParts.push(`${colors.dim}use -f for PRs/issues${RESET}`);\n }\n writeLine(` ${statsParts.join(` ${colors.dim}│${RESET} `)}`);\n writeLine();\n\n const overallProgress = squadData.length > 0\n ? Math.round(squadData.reduce((sum, s) => sum + s.goalProgress, 0) / squadData.length)\n : 0;\n writeLine(` ${progressBar(overallProgress, 32)} ${colors.dim}${overallProgress}% goal progress${RESET}`);\n writeLine();\n\n // Squad table - 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 // 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 renderInfrastructureCached(cache);\n renderAcquisitionCached(cache);\n\n // These still need async but are fast\n renderHistoricalTrendsCached(cache);\n renderInsightsCached(cache);\n\n // Working On section - shows recent commits\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 // Goals section - show 3 most relevant (prioritize squads with recent activity)\n const allActiveGoals = squadData.flatMap(s =>\n s.goals.filter(g => !g.completed).map(g => ({ squad: s.name, goal: g }))\n );\n\n if (allActiveGoals.length > 0) {\n // Get squads with recent commits for relevance scoring\n const activeSquads = new Set(gitStats?.recentCommits?.map(c => {\n // Map repo to squad\n const repoSquadMap: Record<string, string> = {\n 'agents-squads-web': 'website',\n 'squads-cli': 'cli',\n 'hq': 'engineering',\n 'company': 'company',\n 'product': 'product',\n 'research': 'research',\n 'intelligence': 'intelligence',\n 'customer': 'customer',\n 'finance': 'finance',\n 'marketing': 'marketing',\n };\n return repoSquadMap[c.repo] || c.repo;\n }) || []);\n\n // Sort goals: active squads first, then by progress\n const sortedGoals = [...allActiveGoals].sort((a, b) => {\n const aActive = activeSquads.has(a.squad) ? 1 : 0;\n const bActive = activeSquads.has(b.squad) ? 1 : 0;\n if (aActive !== bActive) return bActive - aActive;\n // Then by progress (goals with progress first)\n const aHasProgress = a.goal.progress ? 1 : 0;\n const bHasProgress = b.goal.progress ? 1 : 0;\n return bHasProgress - aHasProgress;\n });\n\n writeLine(` ${bold}Goals${RESET} ${colors.dim}(${allActiveGoals.length} active)${RESET}`);\n writeLine();\n\n const maxGoals = 3; // Show only 3 most relevant\n for (const { squad, goal } of sortedGoals.slice(0, maxGoals)) {\n const hasProgress = goal.progress && goal.progress.length > 0;\n const isActive = activeSquads.has(squad);\n const icon = isActive ? icons.active : (hasProgress ? icons.progress : icons.empty);\n writeLine(` ${icon} ${colors.dim}${squad}${RESET} ${truncate(goal.description, 48)}`);\n if (hasProgress) {\n writeLine(` ${colors.dim}└${RESET} ${colors.green}${truncate(goal.progress!, 52)}${RESET}`);\n }\n }\n\n if (allActiveGoals.length > maxGoals) {\n writeLine(` ${colors.dim} +${allActiveGoals.length - maxGoals} more${RESET}`);\n }\n writeLine();\n }\n\n writeLine(` ${colors.dim}$${RESET} squads run ${colors.cyan}<squad>${RESET} ${colors.dim}Execute a squad${RESET}`);\n writeLine(` ${colors.dim}$${RESET} squads goal set ${colors.dim}Add a goal${RESET}`);\n writeLine();\n\n // Save snapshot in background (don't block)\n saveSnapshotCached(squadData, cache, baseDir).catch(() => {});\n\n // Close database pool to allow process to exit immediately\n await closeDatabase();\n}\n\n/**\n * Save dashboard snapshot to local PostgreSQL for historical tracking\n */\nasync function _saveSnapshot(\n squadData: SquadMetrics[],\n ghStats: GitHubStats | null,\n _baseDir: string | null\n): Promise<void> {\n // Check if database is available\n const dbAvailable = await isDatabaseAvailable();\n if (!dbAvailable) return;\n\n // Fetch additional data for snapshot\n const gitStats = _baseDir ? getMultiRepoGitStats(_baseDir, 30) : null;\n const costs = await fetchCostSummary(100);\n\n // Build squad snapshot data\n const squadsData: SquadSnapshotData[] = squadData.map(s => ({\n name: s.name,\n commits: s.github?.commits || 0,\n prsOpened: s.github?.prsOpened || 0,\n prsMerged: s.github?.prsMerged || 0,\n issuesClosed: s.github?.issuesClosed || 0,\n issuesOpen: s.github?.issuesOpen || 0,\n goalsActive: s.goals.filter(g => !g.completed).length,\n goalsTotal: s.goals.length,\n progress: s.goalProgress,\n }));\n\n // Build authors data\n const authorsData = gitStats\n ? Array.from(gitStats.commitsByAuthor.entries())\n .sort((a, b) => b[1] - a[1])\n .slice(0, 10)\n .map(([name, commits]) => ({ name, commits }))\n : [];\n\n // Build repos data\n const reposData = gitStats\n ? Array.from(gitStats.commitsByRepo.entries())\n .sort((a, b) => b[1] - a[1])\n .map(([name, commits]) => ({ name, commits }))\n : [];\n\n // Calculate totals\n const totalInputTokens = costs?.bySquad.reduce((sum: 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 || 50,\n inputTokens: totalInputTokens,\n outputTokens: totalOutputTokens,\n commits30d: gitStats?.totalCommits || 0,\n avgCommitsPerDay: gitStats?.avgCommitsPerDay || 0,\n activeDays: gitStats?.activeDays || 0,\n peakCommits: gitStats?.peakDay?.count || 0,\n peakDate: gitStats?.peakDay?.date || null,\n squadsData,\n authorsData,\n reposData,\n };\n\n await saveDashboardSnapshot(snapshot);\n}\n\n// Find agents-squads base directory (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 = getMultiRepoGitStats(baseDir, 30);\n const activity = getActivitySparkline(baseDir, 14);\n\n if (stats.totalCommits === 0) {\n writeLine(` ${bold}Git Activity${RESET} ${colors.dim}(no commits in 30d)${RESET}`);\n writeLine();\n return;\n }\n\n writeLine(` ${bold}Git Activity${RESET} ${colors.dim}(30d)${RESET}`);\n writeLine();\n\n // Sparkline for last 14 days\n const spark = sparkline(activity);\n writeLine(` ${colors.dim}Last 14d:${RESET} ${spark}`);\n writeLine();\n\n // Key metrics row\n const metrics = [\n `${colors.cyan}${stats.totalCommits}${RESET} commits`,\n `${colors.green}${stats.avgCommitsPerDay}${RESET}/day`,\n `${colors.purple}${stats.activeDays}${RESET} active days`,\n ];\n if (stats.peakDay) {\n metrics.push(`${colors.yellow}${stats.peakDay.count}${RESET} peak ${colors.dim}(${stats.peakDay.date})${RESET}`);\n }\n writeLine(` ${metrics.join(` ${colors.dim}│${RESET} `)}`);\n writeLine();\n\n // Repos by commits (top 5)\n const sortedRepos = Array.from(stats.commitsByRepo.entries())\n .sort((a, b) => b[1] - a[1])\n .slice(0, 5);\n\n if (sortedRepos.length > 0) {\n const maxRepoCommits = sortedRepos[0][1];\n\n for (const [repo, commits] of sortedRepos) {\n const bar = barChart(commits, maxRepoCommits, 12);\n writeLine(` ${colors.cyan}${padEnd(repo, 20)}${RESET}${bar} ${colors.dim}${commits}${RESET}`);\n }\n writeLine();\n }\n\n // Authors (top 3)\n const sortedAuthors = Array.from(stats.commitsByAuthor.entries())\n .sort((a, b) => b[1] - a[1])\n .slice(0, 3);\n\n if (sortedAuthors.length > 0) {\n const authorLine = sortedAuthors\n .map(([author, count]) => `${colors.dim}${truncate(author, 15)}${RESET} ${colors.cyan}${count}${RESET}`)\n .join(` ${colors.dim}│${RESET} `);\n writeLine(` ${colors.dim}By author:${RESET} ${authorLine}`);\n writeLine();\n }\n}\n\nasync function _renderTokenEconomics(_squadNames: string[]): Promise<void> {\n const costs = await fetchCostSummary(100);\n\n if (!costs) {\n // No Langfuse config or API error - show hint\n writeLine(` ${bold}Token Economics${RESET} ${colors.dim}(no data)${RESET}`);\n writeLine(` ${colors.dim}Set LANGFUSE_PUBLIC_KEY & LANGFUSE_SECRET_KEY for cost tracking${RESET}`);\n writeLine();\n return;\n }\n\n writeLine(` ${bold}Token Economics${RESET} ${colors.dim}(last 100 calls)${RESET}`);\n writeLine();\n\n // Budget bar\n const barWidth = 32;\n const costBar = formatCostBar(costs.usedPercent, barWidth);\n writeLine(` ${colors.dim}Budget $${costs.dailyBudget}${RESET} [${costBar}] ${costs.usedPercent.toFixed(1)}%`);\n writeLine(` ${colors.green}$${costs.totalCost.toFixed(2)}${RESET} used ${colors.dim}│${RESET} ${colors.cyan}$${costs.idleBudget.toFixed(2)}${RESET} idle`);\n writeLine();\n\n // Anthropic tier and limits\n const tier = parseInt(process.env.ANTHROPIC_TIER || '4', 10);\n\n // RPM limits by tier (same for all models)\n const rpmByTier: Record<number, number> = { 1: 50, 2: 1000, 3: 2000, 4: 4000 };\n const rpmLimit = rpmByTier[tier] || 4000;\n\n // Token limits by tier and model family (ITPM/OTPM per minute)\n const tokenLimits: Record<number, Record<string, { itpm: number; otpm: number }>> = {\n 1: { opus: { itpm: 30000, otpm: 8000 }, sonnet: { itpm: 30000, otpm: 8000 }, haiku: { itpm: 50000, otpm: 10000 } },\n 2: { opus: { itpm: 450000, otpm: 90000 }, sonnet: { itpm: 450000, otpm: 90000 }, haiku: { itpm: 450000, otpm: 90000 } },\n 3: { opus: { itpm: 800000, otpm: 160000 }, sonnet: { itpm: 800000, otpm: 160000 }, haiku: { itpm: 1000000, otpm: 200000 } },\n 4: { opus: { itpm: 2000000, otpm: 400000 }, sonnet: { itpm: 2000000, otpm: 400000 }, haiku: { itpm: 4000000, otpm: 800000 } },\n };\n\n const modelShortNames: Record<string, string> = {\n 'claude-opus-4-5-20251101': 'opus-4.5',\n 'claude-sonnet-4-20250514': 'sonnet-4',\n 'claude-haiku-4-5-20251001': 'haiku-4.5',\n 'claude-3-5-sonnet-20241022': 'sonnet-3.5',\n 'claude-3-5-haiku-20241022': 'haiku-3.5',\n };\n\n const modelToFamily: Record<string, string> = {\n 'claude-opus-4-5-20251101': 'opus',\n 'claude-sonnet-4-20250514': 'sonnet',\n 'claude-haiku-4-5-20251001': 'haiku',\n 'claude-3-5-sonnet-20241022': 'sonnet',\n 'claude-3-5-haiku-20241022': 'haiku',\n };\n\n // Aggregate stats by model\n const modelStats: Record<string, { calls: number; input: number; output: number; cached: number }> = {};\n for (const squad of costs.bySquad) {\n for (const [model, count] of Object.entries(squad.models)) {\n if (!modelStats[model]) {\n modelStats[model] = { calls: 0, input: 0, output: 0, cached: 0 };\n }\n modelStats[model].calls += count;\n }\n // Distribute tokens proportionally (approximation since we don't have per-model token breakdown)\n const totalCalls = Object.values(squad.models).reduce((a, b) => a + b, 0);\n for (const [model, count] of Object.entries(squad.models)) {\n const ratio = totalCalls > 0 ? count / totalCalls : 0;\n modelStats[model].input += Math.round(squad.inputTokens * ratio);\n modelStats[model].output += Math.round(squad.outputTokens * ratio);\n }\n }\n\n // Total tokens for all models\n const _totalInput = costs.bySquad.reduce((sum, s) => sum + s.inputTokens, 0);\n const _totalOutput = costs.bySquad.reduce((sum, s) => sum + s.outputTokens, 0);\n const _totalCalls = costs.bySquad.reduce((sum, s) => sum + s.calls, 0);\n\n // Cost projections - extrapolate based on hours elapsed today\n const now = new Date();\n const hoursElapsed = Math.max(now.getHours() + now.getMinutes() / 60, 1); // At least 1 hour to avoid division issues\n const hourlyRate = costs.totalCost / hoursElapsed;\n const dailyProjection = hourlyRate * 24;\n const monthlyProjection = dailyProjection * 30;\n\n // Fetch real rate limits from proxy (if available)\n const rateLimits = await fetchRateLimits();\n const hasRealLimits = rateLimits.source === 'proxy' && Object.keys(rateLimits.limits).length > 0;\n\n // Display rate limits section\n if (hasRealLimits) {\n writeLine(` ${colors.dim}Rate Limits${RESET} ${colors.green}(live)${RESET}`);\n\n for (const [family, limits] of Object.entries(rateLimits.limits)) {\n const name = family === 'opus' ? 'opus' : family === 'sonnet' ? 'sonnet' : family === 'haiku' ? 'haiku' : family;\n\n // Request rate usage\n const reqUsed = limits.requestsLimit - limits.requestsRemaining;\n const reqPct = limits.requestsLimit > 0 ? (reqUsed / limits.requestsLimit) * 100 : 0;\n const reqColor = reqPct > 80 ? colors.red : reqPct > 50 ? colors.yellow : colors.green;\n\n // Token rate usage\n const tokUsed = limits.tokensLimit - limits.tokensRemaining;\n const tokPct = limits.tokensLimit > 0 ? (tokUsed / limits.tokensLimit) * 100 : 0;\n const tokColor = tokPct > 80 ? colors.red : tokPct > 50 ? colors.yellow : colors.green;\n\n writeLine(` ${colors.cyan}${padEnd(name, 8)}${RESET} ${reqColor}${String(reqUsed).padStart(4)}${RESET}${colors.dim}/${limits.requestsLimit}req${RESET} ${tokColor}${formatK(tokUsed)}${RESET}${colors.dim}/${formatK(limits.tokensLimit)}tok${RESET}`);\n }\n } else {\n writeLine(` ${colors.dim}Rate Limits (Tier ${tier})${RESET}`);\n\n const sortedModels = Object.entries(modelStats).sort((a, b) => b[1].calls - a[1].calls);\n for (const [model, stats] of sortedModels.slice(0, 3)) {\n const name = modelShortNames[model] || model.split('-').slice(1, 3).join('-');\n const family = modelToFamily[model] || 'sonnet';\n const limits = tokenLimits[tier]?.[family] || { itpm: 1000000, otpm: 200000 };\n\n // RPM\n const rpmPct = (stats.calls / rpmLimit) * 100;\n const rpmColor = rpmPct > 80 ? colors.red : rpmPct > 50 ? colors.yellow : colors.green;\n\n // Format: model [RPM bar] calls [ITPM] input [OTPM] output\n writeLine(` ${colors.cyan}${padEnd(name, 11)}${RESET} ${rpmColor}${String(stats.calls).padStart(4)}${RESET}${colors.dim}rpm${RESET} ${colors.dim}${formatK(stats.input)}${RESET}${colors.dim}/${formatK(limits.itpm)}i${RESET} ${colors.dim}${formatK(stats.output)}${RESET}${colors.dim}/${formatK(limits.otpm)}o${RESET}`);\n }\n }\n writeLine();\n\n // Cache efficiency\n if (costs.totalCachedTokens > 0 || costs.cacheHitRate > 0) {\n const cacheColor = costs.cacheHitRate > 50 ? colors.green : costs.cacheHitRate > 20 ? colors.yellow : colors.red;\n writeLine(` ${colors.dim}Cache:${RESET} ${cacheColor}${costs.cacheHitRate.toFixed(1)}%${RESET} hit rate ${colors.dim}(${formatK(costs.totalCachedTokens)} cached / ${formatK(costs.totalInputTokens + costs.totalCachedTokens)} total)${RESET}`);\n writeLine();\n }\n\n // Cost projections\n writeLine(` ${colors.dim}Projections${RESET}`);\n const projColor = dailyProjection > costs.dailyBudget ? colors.red : colors.green;\n writeLine(` ${colors.dim}Daily:${RESET} ${projColor}~$${dailyProjection.toFixed(2)}${RESET}${colors.dim}/${costs.dailyBudget}${RESET} ${colors.dim}Monthly:${RESET} ${colors.cyan}~$${monthlyProjection.toFixed(0)}${RESET}`);\n\n // Alerts\n if (dailyProjection > costs.dailyBudget * 0.8) {\n writeLine(` ${colors.yellow}⚠${RESET} ${colors.yellow}Projected to exceed daily budget${RESET}`);\n }\n if (costs.usedPercent > 80) {\n writeLine(` ${colors.red}⚠${RESET} ${colors.red}${costs.usedPercent.toFixed(0)}% of daily budget used${RESET}`);\n }\n writeLine();\n}\n\n// Format number as K/M\nfunction formatK(n: number): string {\n if (n >= 1000000) return (n / 1000000).toFixed(1) + 'M';\n if (n >= 1000) return (n / 1000).toFixed(0) + 'k';\n return String(n);\n}\n\nasync function _renderHistoricalTrends(): Promise<void> {\n // Check if database is available\n const dbAvailable = await isDatabaseAvailable();\n if (!dbAvailable) return;\n\n const history = await getDashboardHistory(14);\n if (history.length < 2) return; // Need at least 2 data points\n\n writeLine(` ${bold}Usage Trends${RESET} ${colors.dim}(${history.length}d history)${RESET}`);\n writeLine();\n\n // Daily cost sparkline (most recent first, so reverse for left-to-right)\n const dailyCosts = history.map(h => h.costUsd).reverse();\n const costSparkStr = sparkline(dailyCosts);\n const totalSpend = dailyCosts.reduce((sum, c) => sum + c, 0);\n const avgDaily = totalSpend / dailyCosts.length;\n\n writeLine(` ${colors.dim}Cost:${RESET} ${costSparkStr} ${colors.green}$${totalSpend.toFixed(2)}${RESET} total ${colors.dim}($${avgDaily.toFixed(2)}/day avg)${RESET}`);\n\n // Token usage trend\n const inputTokens = history.map(h => h.inputTokens).reverse();\n const totalInput = inputTokens.reduce((sum, t) => sum + t, 0);\n const tokenSparkStr = sparkline(inputTokens);\n\n writeLine(` ${colors.dim}Tokens:${RESET} ${tokenSparkStr} ${colors.cyan}${formatK(totalInput)}${RESET} input ${colors.dim}(${formatK(Math.round(totalInput / inputTokens.length))}/day)${RESET}`);\n\n // Goal progress trend\n const goalProgress = history.map(h => h.goalProgressPct).reverse();\n const latestProgress = goalProgress[goalProgress.length - 1] || 0;\n const earliestProgress = goalProgress[0] || 0;\n const progressDelta = latestProgress - earliestProgress;\n const progressColor = progressDelta > 0 ? colors.green : progressDelta < 0 ? colors.red : colors.dim;\n const progressSign = progressDelta > 0 ? '+' : '';\n\n writeLine(` ${colors.dim}Goals:${RESET} ${sparkline(goalProgress)} ${colors.purple}${latestProgress}%${RESET} ${progressColor}${progressSign}${progressDelta.toFixed(0)}%${RESET}${colors.dim} vs start${RESET}`);\n writeLine();\n}\n\nasync function _renderInsights(): Promise<void> {\n const insights = await fetchInsights('week');\n\n if (insights.source === 'none' || insights.taskMetrics.length === 0) {\n // No insights data available - skip section entirely\n return;\n }\n\n writeLine(` ${bold}Agent Insights${RESET} ${colors.dim}(${insights.days}d)${RESET}`);\n writeLine();\n\n // Task completion metrics (aggregated)\n const totals = insights.taskMetrics.reduce(\n (acc, t) => ({\n tasks: acc.tasks + t.tasksTotal,\n completed: acc.completed + t.tasksCompleted,\n failed: acc.failed + t.tasksFailed,\n retries: acc.retries + t.totalRetries,\n withRetries: acc.withRetries + t.tasksWithRetries,\n }),\n { tasks: 0, completed: 0, failed: 0, retries: 0, withRetries: 0 }\n );\n\n if (totals.tasks > 0) {\n const successRate = totals.tasks > 0 ? ((totals.completed / totals.tasks) * 100).toFixed(0) : '0';\n const successColor = parseInt(successRate) >= 80 ? colors.green : parseInt(successRate) >= 60 ? colors.yellow : colors.red;\n\n // Task completion row\n writeLine(` ${colors.dim}Tasks:${RESET} ${colors.green}${totals.completed}${RESET}${colors.dim}/${totals.tasks} completed${RESET} ${successColor}${successRate}%${RESET}${colors.dim} success${RESET} ${colors.red}${totals.failed}${RESET}${colors.dim} failed${RESET}`);\n\n // Retry metrics\n if (totals.retries > 0) {\n const retryRate = totals.tasks > 0 ? ((totals.withRetries / totals.tasks) * 100).toFixed(0) : '0';\n const retryColor = parseInt(retryRate) > 30 ? colors.red : parseInt(retryRate) > 15 ? colors.yellow : colors.green;\n writeLine(` ${colors.dim}Retries:${RESET} ${retryColor}${totals.retries}${RESET}${colors.dim} total${RESET} ${retryColor}${retryRate}%${RESET}${colors.dim} of tasks needed retry${RESET}`);\n }\n }\n\n // Quality metrics (if feedback exists)\n const qualityTotals = insights.qualityMetrics.reduce(\n (acc, q) => ({\n feedback: acc.feedback + q.feedbackCount,\n qualitySum: acc.qualitySum + (q.avgQuality * q.feedbackCount),\n helpfulSum: acc.helpfulSum + (q.helpfulPct * q.feedbackCount / 100),\n fixSum: acc.fixSum + (q.fixRequiredPct * q.feedbackCount / 100),\n }),\n { feedback: 0, qualitySum: 0, helpfulSum: 0, fixSum: 0 }\n );\n\n if (qualityTotals.feedback > 0) {\n const avgQuality = qualityTotals.qualitySum / qualityTotals.feedback;\n const helpfulPct = (qualityTotals.helpfulSum / qualityTotals.feedback) * 100;\n const fixPct = (qualityTotals.fixSum / qualityTotals.feedback) * 100;\n\n const qualityColor = avgQuality >= 4 ? colors.green : avgQuality >= 3 ? colors.yellow : colors.red;\n const stars = '★'.repeat(Math.round(avgQuality)) + '☆'.repeat(5 - Math.round(avgQuality));\n\n writeLine(` ${colors.dim}Quality:${RESET} ${qualityColor}${stars}${RESET} ${colors.dim}(${avgQuality.toFixed(1)}/5)${RESET} ${colors.green}${helpfulPct.toFixed(0)}%${RESET}${colors.dim} helpful${RESET} ${fixPct > 20 ? colors.red : colors.dim}${fixPct.toFixed(0)}% needed fixes${RESET}`);\n }\n\n // Context window utilization\n const contextMetrics = insights.taskMetrics.filter(t => t.avgContextPct > 0);\n if (contextMetrics.length > 0) {\n const avgContext = contextMetrics.reduce((sum, t) => sum + t.avgContextPct, 0) / contextMetrics.length;\n const maxContext = Math.max(...contextMetrics.map(t => t.maxContextTokens));\n\n // Context utilization colors: green < 40%, yellow 40-70%, red > 70%\n const contextColor = avgContext < 40 ? colors.green : avgContext < 70 ? colors.yellow : colors.red;\n const contextStatus = avgContext < 40 ? 'lean' : avgContext < 70 ? 'moderate' : 'heavy';\n\n writeLine(` ${colors.dim}Context:${RESET} ${contextColor}${avgContext.toFixed(0)}%${RESET}${colors.dim} avg utilization (${contextStatus})${RESET} ${colors.dim}peak ${formatK(maxContext)} tokens${RESET}`);\n }\n\n writeLine();\n\n // Top tools (compact)\n if (insights.topTools.length > 0) {\n const toolLine = insights.topTools.slice(0, 5).map(t => {\n const successColor = t.successRate >= 95 ? colors.green : t.successRate >= 80 ? colors.yellow : colors.red;\n return `${colors.dim}${t.toolName.replace('mcp__', '').slice(0, 12)}${RESET} ${successColor}${t.successRate.toFixed(0)}%${RESET}`;\n }).join(' ');\n\n writeLine(` ${colors.dim}Tools:${RESET} ${toolLine}`);\n\n // Tool failure alert\n if (insights.toolFailureRate > 5) {\n writeLine(` ${colors.yellow}⚠${RESET} ${colors.yellow}${insights.toolFailureRate.toFixed(1)}% tool failure rate${RESET}`);\n }\n writeLine();\n }\n}\n\nasync function _renderInfrastructure(): Promise<void> {\n const stats = await fetchBridgeStats();\n\n if (!stats) {\n writeLine(` ${bold}Infrastructure${RESET} ${colors.dim}(bridge offline)${RESET}`);\n writeLine();\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}jorge@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 (the real constraint) ===\n // Anthropic Tier 4 limits (Max plan)\n // RPM: 4000, TPM: 400k input / 80k output, TPD: 2.5M (informational)\n writeLine(` ${colors.dim}Rate Limits${RESET} ${colors.dim}(Tier ${tier})${RESET}`);\n\n // Calculate usage percentages based on typical Tier 4 limits\n const tier4Limits = {\n rpm: 4000,\n inputTpm: 400000,\n outputTpm: 80000,\n };\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 / tier4Limits.rpm) * 100;\n const tpmPct = (tokensPerMinute / (tier4Limits.inputTpm + tier4Limits.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}/${tier4Limits.rpm}${RESET}`);\n writeLine(` TPM ${tpmBar} ${tpmColor}${formatK(Math.round(tokensPerMinute))}${RESET}${colors.dim}/${formatK(tier4Limits.inputTpm + tier4Limits.outputTpm)}${RESET}`);\n\n // Capacity remaining for autonomous work\n const rpmAvailable = Math.max(0, tier4Limits.rpm - callsPerMinute);\n const tpmAvailable = Math.max(0, (tier4Limits.inputTpm + tier4Limits.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 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 || 50,\n inputTokens: totalInputTokens,\n outputTokens: totalOutputTokens,\n commits30d: gitStats?.totalCommits || 0,\n avgCommitsPerDay: gitStats?.avgCommitsPerDay || 0,\n activeDays: gitStats?.activeDays || 0,\n peakCommits: gitStats?.peakDay?.count || 0,\n peakDate: gitStats?.peakDay?.date || null,\n squadsData,\n authorsData,\n reposData,\n };\n\n // Save with timeout - don't block the CLI exit\n const saveTimeout = new Promise<void>(resolve => setTimeout(resolve, 2000));\n await Promise.race([saveDashboardSnapshot(snapshot), saveTimeout]);\n}\n\n// Priority keywords that indicate high priority goals\nconst P0_KEYWORDS = ['revenue', 'first', 'launch', 'publish', 'ship', 'critical', 'urgent'];\nconst P1_KEYWORDS = ['track', 'establish', 'identify', 'define', 'fix'];\n\nfunction inferPriority(goal: string): 'P0' | 'P1' | 'P2' {\n const lower = goal.toLowerCase();\n if (P0_KEYWORDS.some(k => lower.includes(k))) return 'P0';\n if (P1_KEYWORDS.some(k => lower.includes(k))) return 'P1';\n return 'P2';\n}\n\nasync function renderCeoReport(squadsDir: string): Promise<void> {\n const squadNames = listSquads(squadsDir);\n const allGoals: { squad: string; goal: Goal; priority: 'P0' | 'P1' | 'P2' }[] = [];\n const blockers: string[] = [];\n let activeSquads = 0;\n let staleSquads = 0;\n\n for (const name of squadNames) {\n const squad = loadSquad(name);\n if (!squad) continue;\n\n const lastActivity = getLastActivityDate(name);\n const activeGoals = squad.goals.filter(g => !g.completed);\n\n // Check for blockers\n if (activeGoals.length === 0) {\n blockers.push(`${name}: No active goals`);\n } else if (lastActivity.includes('w') || lastActivity === '—') {\n blockers.push(`${name}: Stale (${lastActivity})`);\n staleSquads++;\n } else {\n activeSquads++;\n }\n\n // Collect goals with inferred priority\n for (const goal of activeGoals) {\n allGoals.push({\n squad: name,\n goal,\n priority: inferPriority(goal.description),\n });\n }\n }\n\n // Sort by priority\n allGoals.sort((a, b) => {\n const order = { P0: 0, P1: 1, P2: 2 };\n return order[a.priority] - order[b.priority];\n });\n\n const p0Goals = allGoals.filter(g => g.priority === 'P0');\n const p1Goals = allGoals.filter(g => g.priority === 'P1');\n\n // Render\n writeLine();\n writeLine(` ${gradient('squads')} ${colors.dim}CEO Report${RESET}`);\n writeLine(` ${colors.dim}${new Date().toISOString().split('T')[0]}${RESET}`);\n writeLine();\n\n // Key metrics\n const w = { label: 20, value: 12 };\n const tableWidth = w.label + w.value + 4;\n\n writeLine(` ${colors.purple}${box.topLeft}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.topRight}${RESET}`);\n writeLine(` ${colors.purple}${box.vertical}${RESET} ${bold}${padEnd('METRIC', w.label)}${RESET}${bold}VALUE${RESET} ${colors.purple}${box.vertical}${RESET}`);\n writeLine(` ${colors.purple}${box.teeRight}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.teeLeft}${RESET}`);\n\n writeLine(` ${colors.purple}${box.vertical}${RESET} ${padEnd('Active Squads', w.label)}${colors.green}${padEnd(`${activeSquads}/${squadNames.length}`, w.value)}${RESET}${colors.purple}${box.vertical}${RESET}`);\n writeLine(` ${colors.purple}${box.vertical}${RESET} ${padEnd('P0 Goals', w.label)}${colors.red}${padEnd(String(p0Goals.length), w.value)}${RESET}${colors.purple}${box.vertical}${RESET}`);\n writeLine(` ${colors.purple}${box.vertical}${RESET} ${padEnd('P1 Goals', w.label)}${colors.yellow}${padEnd(String(p1Goals.length), w.value)}${RESET}${colors.purple}${box.vertical}${RESET}`);\n writeLine(` ${colors.purple}${box.vertical}${RESET} ${padEnd('Blockers', w.label)}${blockers.length > 0 ? colors.red : colors.green}${padEnd(String(blockers.length), w.value)}${RESET}${colors.purple}${box.vertical}${RESET}`);\n\n // Token Economics (add to metrics table)\n const costs = await fetchCostSummary(100);\n if (costs) {\n const spendStr = `$${costs.totalCost.toFixed(2)} / $${costs.dailyBudget}`;\n writeLine(` ${colors.purple}${box.vertical}${RESET} ${padEnd('Daily Spend', w.label)}${colors.green}${padEnd(spendStr, w.value)}${RESET}${colors.purple}${box.vertical}${RESET}`);\n }\n\n writeLine(` ${colors.purple}${box.bottomLeft}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.bottomRight}${RESET}`);\n writeLine();\n\n // Top Priorities (P0)\n if (p0Goals.length > 0) {\n writeLine(` ${bold}${colors.red}P0${RESET} ${bold}Priorities${RESET} ${colors.dim}(revenue/launch critical)${RESET}`);\n writeLine();\n for (const { squad, goal } of p0Goals.slice(0, 5)) {\n writeLine(` ${icons.error} ${colors.cyan}${squad}${RESET} ${goal.description}`);\n if (goal.progress) {\n writeLine(` ${colors.dim}└ ${goal.progress}${RESET}`);\n }\n }\n writeLine();\n }\n\n // P1 Goals\n if (p1Goals.length > 0) {\n writeLine(` ${bold}${colors.yellow}P1${RESET} ${bold}Important${RESET} ${colors.dim}(tracking/foundations)${RESET}`);\n writeLine();\n for (const { squad, goal } of p1Goals.slice(0, 3)) {\n writeLine(` ${icons.warning} ${colors.cyan}${squad}${RESET} ${truncate(goal.description, 50)}`);\n }\n if (p1Goals.length > 3) {\n writeLine(` ${colors.dim} +${p1Goals.length - 3} more${RESET}`);\n }\n writeLine();\n }\n\n // Blockers\n if (blockers.length > 0) {\n writeLine(` ${bold}Blockers${RESET}`);\n writeLine();\n for (const blocker of blockers.slice(0, 3)) {\n writeLine(` ${icons.error} ${colors.red}${blocker}${RESET}`);\n }\n writeLine();\n }\n\n // Next Steps\n writeLine(` ${bold}Next Steps${RESET}`);\n writeLine();\n if (p0Goals.length > 0) {\n writeLine(` ${icons.active} Focus on P0: ${colors.cyan}${p0Goals[0].squad}${RESET} - ${truncate(p0Goals[0].goal.description, 40)}`);\n }\n if (blockers.length > 0) {\n writeLine(` ${icons.warning} Unblock: ${colors.yellow}${blockers[0]}${RESET}`);\n }\n if (staleSquads > 0) {\n writeLine(` ${icons.progress} Revive ${staleSquads} stale squad(s)`);\n }\n writeLine();\n\n // Commands\n writeLine(` ${colors.dim}$${RESET} squads dash ${colors.dim}Full operational view${RESET}`);\n writeLine(` ${colors.dim}$${RESET} squads goal list ${colors.dim}All active goals${RESET}`);\n writeLine();\n}\n\nfunction renderHistoricalTrendsCached(cache: DashboardCache): void {\n if (!cache.dbAvailable) return;\n\n const history = cache.history;\n if (history.length < 2) return; // Need at least 2 data points\n\n writeLine(` ${bold}Usage Trends${RESET} ${colors.dim}(${history.length}d history)${RESET}`);\n writeLine();\n\n // Daily cost sparkline (most recent first, so reverse for left-to-right)\n const dailyCosts = history.map(h => h.costUsd).reverse();\n const costSparkStr = sparkline(dailyCosts);\n const totalSpend = dailyCosts.reduce((sum, c) => sum + c, 0);\n const avgDaily = totalSpend / dailyCosts.length;\n\n writeLine(` ${colors.dim}Cost:${RESET} ${costSparkStr} ${colors.green}$${totalSpend.toFixed(2)}${RESET} total ${colors.dim}($${avgDaily.toFixed(2)}/day avg)${RESET}`);\n\n // Token usage trend\n const inputTokens = history.map(h => h.inputTokens).reverse();\n const totalInput = inputTokens.reduce((sum, t) => sum + t, 0);\n const tokenSparkStr = sparkline(inputTokens);\n\n writeLine(` ${colors.dim}Tokens:${RESET} ${tokenSparkStr} ${colors.cyan}${formatK(totalInput)}${RESET} input ${colors.dim}(${formatK(Math.round(totalInput / inputTokens.length))}/day)${RESET}`);\n\n // Goal progress trend\n const goalProgress = history.map(h => h.goalProgressPct).reverse();\n const latestProgress = goalProgress[goalProgress.length - 1] || 0;\n const earliestProgress = goalProgress[0] || 0;\n const progressDelta = latestProgress - earliestProgress;\n const progressColor = progressDelta > 0 ? colors.green : progressDelta < 0 ? colors.red : colors.dim;\n const progressSign = progressDelta > 0 ? '+' : '';\n\n writeLine(` ${colors.dim}Goals:${RESET} ${sparkline(goalProgress)} ${colors.purple}${latestProgress}%${RESET} ${progressColor}${progressSign}${progressDelta.toFixed(0)}%${RESET}${colors.dim} vs start${RESET}`);\n writeLine();\n}\n\nfunction renderInsightsCached(cache: DashboardCache): void {\n const insights = cache.insights;\n\n if (!insights || insights.source === 'none' || insights.taskMetrics.length === 0) {\n return;\n }\n\n writeLine(` ${bold}Agent Insights${RESET} ${colors.dim}(${insights.days}d)${RESET}`);\n writeLine();\n\n // Task completion metrics (aggregated)\n const totals = insights.taskMetrics.reduce(\n (acc, t) => ({\n tasks: acc.tasks + t.tasksTotal,\n completed: acc.completed + t.tasksCompleted,\n failed: acc.failed + t.tasksFailed,\n retries: acc.retries + t.totalRetries,\n withRetries: acc.withRetries + t.tasksWithRetries,\n }),\n { tasks: 0, completed: 0, failed: 0, retries: 0, withRetries: 0 }\n );\n\n if (totals.tasks > 0) {\n const successRate = totals.tasks > 0 ? ((totals.completed / totals.tasks) * 100).toFixed(0) : '0';\n const successColor = parseInt(successRate) >= 80 ? colors.green : parseInt(successRate) >= 60 ? colors.yellow : colors.red;\n\n writeLine(` ${colors.dim}Tasks:${RESET} ${colors.green}${totals.completed}${RESET}${colors.dim}/${totals.tasks} completed${RESET} ${successColor}${successRate}%${RESET}${colors.dim} success${RESET} ${colors.red}${totals.failed}${RESET}${colors.dim} failed${RESET}`);\n\n if (totals.retries > 0) {\n const retryRate = totals.tasks > 0 ? ((totals.withRetries / totals.tasks) * 100).toFixed(0) : '0';\n const retryColor = parseInt(retryRate) > 30 ? colors.red : parseInt(retryRate) > 15 ? colors.yellow : colors.green;\n writeLine(` ${colors.dim}Retries:${RESET} ${retryColor}${totals.retries}${RESET}${colors.dim} total${RESET} ${retryColor}${retryRate}%${RESET}${colors.dim} of tasks needed retry${RESET}`);\n }\n }\n\n // Skip quality metrics for brevity in cached version\n writeLine();\n}\n","/**\n * 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 provider from model name\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 available providers from environment\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 for a specific model\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\n * @returns 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 provider display name\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 is configured (has API key)\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","/**\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 * 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 * Database utilities for local PostgreSQL persistence\n * Connects to the squads schema for storing metrics and snapshots\n */\n\nimport { createRequire } from 'module';\nconst require = createRequire(import.meta.url);\nconst pg = require('pg');\nconst { Pool } = pg;\n\n// Connection config from environment or defaults\nconst DATABASE_URL = process.env.SQUADS_DATABASE_URL ||\n 'postgresql://squads:squads_local_dev@localhost:5433/squads';\n\nlet pool: InstanceType<typeof Pool> | null = null;\n\n/**\n * Get or create the connection pool\n */\nfunction getPool(): InstanceType<typeof Pool> {\n if (!pool) {\n pool = new Pool({\n connectionString: DATABASE_URL,\n max: 5,\n idleTimeoutMillis: 30000,\n connectionTimeoutMillis: 1500, // Fast timeout for CLI responsiveness\n });\n\n // Handle pool errors\n pool.on('error', (err: Error) => {\n console.error('Unexpected database pool error:', err);\n });\n }\n return pool;\n}\n\n/**\n * Check if database is available\n */\nexport async function isDatabaseAvailable(): Promise<boolean> {\n try {\n const pool = getPool();\n const client = await pool.connect();\n await client.query('SELECT 1');\n client.release();\n return true;\n } catch (err) {\n if (process.env.DEBUG) {\n console.error('DB availability check failed:', err);\n }\n return false;\n }\n}\n\n/**\n * Dashboard snapshot data structure\n */\nexport interface DashboardSnapshot {\n // Top-level metrics\n totalSquads: number;\n totalCommits: number;\n totalPrsMerged: number;\n totalIssuesClosed: number;\n totalIssuesOpen: number;\n goalProgressPct: number;\n\n // Cost metrics\n costUsd: number;\n dailyBudgetUsd: number;\n inputTokens: number;\n outputTokens: number;\n\n // Git activity\n commits30d: number;\n avgCommitsPerDay: number;\n activeDays: number;\n peakCommits: number;\n peakDate: string | null;\n\n // Detailed breakdowns (stored as JSONB)\n squadsData: SquadSnapshotData[];\n authorsData: { name: string; commits: number }[];\n reposData: { name: string; commits: number }[];\n}\n\nexport interface SquadSnapshotData {\n name: string;\n commits: number;\n prsOpened: number;\n prsMerged: number;\n issuesClosed: number;\n issuesOpen: number;\n goalsActive: number;\n goalsTotal: number;\n progress: number;\n}\n\n/**\n * Save a dashboard snapshot to the database\n */\nexport async function saveDashboardSnapshot(snapshot: DashboardSnapshot): Promise<number | null> {\n try {\n const pool = getPool();\n const client = await pool.connect();\n\n const result = await client.query(`\n INSERT INTO squads.dashboard_snapshots (\n total_squads, total_commits, total_prs_merged, total_issues_closed, total_issues_open,\n goal_progress_pct, cost_usd, daily_budget_usd, input_tokens, output_tokens,\n commits_30d, avg_commits_per_day, active_days, peak_commits, peak_date,\n squads_data, authors_data, repos_data\n ) VALUES (\n $1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18\n ) RETURNING id\n `, [\n snapshot.totalSquads,\n snapshot.totalCommits,\n snapshot.totalPrsMerged,\n snapshot.totalIssuesClosed,\n snapshot.totalIssuesOpen,\n snapshot.goalProgressPct,\n snapshot.costUsd,\n snapshot.dailyBudgetUsd,\n snapshot.inputTokens,\n snapshot.outputTokens,\n snapshot.commits30d,\n snapshot.avgCommitsPerDay,\n snapshot.activeDays,\n snapshot.peakCommits,\n snapshot.peakDate,\n JSON.stringify(snapshot.squadsData),\n JSON.stringify(snapshot.authorsData),\n JSON.stringify(snapshot.reposData),\n ]);\n\n client.release();\n return result.rows[0]?.id ?? null;\n } catch (err) {\n // Log error for debugging, but don't crash\n if (process.env.DEBUG) {\n console.error('DB save error:', err);\n }\n return null;\n }\n}\n\n/**\n * Get recent dashboard snapshots for trend analysis\n */\nexport async function getDashboardHistory(limit: number = 30): Promise<DashboardSnapshot[]> {\n try {\n const client = await getPool().connect();\n\n const result = await client.query(`\n SELECT\n total_squads, total_commits, total_prs_merged, total_issues_closed, total_issues_open,\n goal_progress_pct, cost_usd, daily_budget_usd, input_tokens, output_tokens,\n commits_30d, avg_commits_per_day, active_days, peak_commits, peak_date,\n squads_data, authors_data, repos_data, captured_at\n FROM squads.dashboard_snapshots\n ORDER BY captured_at DESC\n LIMIT $1\n `, [limit]);\n\n client.release();\n\n return result.rows.map((row: Record<string, unknown>) => ({\n totalSquads: row.total_squads,\n totalCommits: row.total_commits,\n totalPrsMerged: row.total_prs_merged,\n totalIssuesClosed: row.total_issues_closed,\n totalIssuesOpen: row.total_issues_open,\n goalProgressPct: row.goal_progress_pct,\n costUsd: parseFloat(String(row.cost_usd)),\n dailyBudgetUsd: parseFloat(String(row.daily_budget_usd)),\n inputTokens: row.input_tokens,\n outputTokens: row.output_tokens,\n commits30d: row.commits_30d,\n avgCommitsPerDay: parseFloat(String(row.avg_commits_per_day)),\n activeDays: row.active_days,\n peakCommits: row.peak_commits,\n peakDate: row.peak_date,\n squadsData: row.squads_data || [],\n authorsData: row.authors_data || [],\n reposData: row.repos_data || [],\n }));\n } catch {\n return [];\n }\n}\n\n/**\n * Close the database connection pool\n */\nexport async function closeDatabase(): Promise<void> {\n if (pool) {\n await pool.end();\n pool = null;\n }\n}\n","import { execSync } from 'child_process';\nimport {\n colors,\n bold,\n RESET,\n gradient,\n box,\n padEnd,\n truncate,\n icons,\n writeLine,\n} from '../lib/terminal.js';\n\ninterface Label {\n name: string;\n color?: string;\n description?: string;\n}\n\ninterface Issue {\n number: number;\n title: string;\n state: string;\n labels: Label[];\n createdAt: string;\n}\n\nfunction getLabelName(label: Label | string): string {\n return typeof label === 'string' ? label : label.name;\n}\n\ninterface RepoIssues {\n repo: string;\n issues: Issue[];\n error?: string;\n}\n\ninterface IssuesOptions {\n org?: string;\n repos?: string;\n}\n\nconst DEFAULT_ORG = 'agents-squads';\nconst DEFAULT_REPOS = ['hq', 'agents-squads-web', 'squads-cli'];\n\nexport async function issuesCommand(options: IssuesOptions = {}): Promise<void> {\n const org = options.org || DEFAULT_ORG;\n const repos = options.repos ? options.repos.split(',') : DEFAULT_REPOS;\n\n writeLine();\n writeLine(` ${gradient('squads')} ${colors.dim}issues${RESET}`);\n writeLine();\n\n // Check if gh is available\n try {\n execSync('gh --version', { stdio: 'pipe' });\n } catch {\n writeLine(` ${colors.red}GitHub CLI (gh) not found${RESET}`);\n writeLine(` ${colors.dim}Install: brew install gh${RESET}`);\n writeLine();\n return;\n }\n\n // Fetch issues for each repo\n const repoData: RepoIssues[] = [];\n let totalOpen = 0;\n\n for (const repo of repos) {\n try {\n const result = execSync(\n `gh issue list -R ${org}/${repo} --state open --json number,title,state,labels,createdAt --limit 50`,\n { stdio: 'pipe', encoding: 'utf-8' }\n );\n const issues: Issue[] = JSON.parse(result);\n repoData.push({ repo, issues });\n totalOpen += issues.length;\n } catch {\n repoData.push({ repo, issues: [], error: 'not found or no access' });\n }\n }\n\n // Stats row\n const reposWithIssues = repoData.filter(r => r.issues.length > 0).length;\n writeLine(` ${colors.cyan}${totalOpen}${RESET} open issues ${colors.dim}│${RESET} ${reposWithIssues}/${repos.length} repos`);\n writeLine();\n\n // Table\n const w = { repo: 20, open: 6, latest: 40 };\n const tableWidth = w.repo + w.open + w.latest + 4;\n\n writeLine(` ${colors.purple}${box.topLeft}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.topRight}${RESET}`);\n\n const header = ` ${colors.purple}${box.vertical}${RESET} ` +\n `${bold}${padEnd('REPO', w.repo)}${RESET}` +\n `${bold}${padEnd('OPEN', w.open)}${RESET}` +\n `${bold}LATEST${RESET}` +\n ` ${colors.purple}${box.vertical}${RESET}`;\n writeLine(header);\n\n writeLine(` ${colors.purple}${box.teeRight}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.teeLeft}${RESET}`);\n\n for (const { repo, issues, error } of repoData) {\n const count = issues.length;\n const countColor = count > 5 ? colors.red : count > 0 ? colors.yellow : colors.green;\n\n let latest = `${colors.dim}—${RESET}`;\n if (error) {\n latest = `${colors.dim}${error}${RESET}`;\n } else if (issues.length > 0) {\n latest = truncate(issues[0].title, w.latest - 2);\n }\n\n const row = ` ${colors.purple}${box.vertical}${RESET} ` +\n `${colors.cyan}${padEnd(repo, w.repo)}${RESET}` +\n `${countColor}${padEnd(String(count), w.open)}${RESET}` +\n `${padEnd(latest, w.latest + 10)}` + // extra for color codes\n `${colors.purple}${box.vertical}${RESET}`;\n\n writeLine(row);\n }\n\n writeLine(` ${colors.purple}${box.bottomLeft}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.bottomRight}${RESET}`);\n writeLine();\n\n // Show recent issues\n const allIssues = repoData\n .flatMap(r => r.issues.map(i => ({ ...i, repo: r.repo })))\n .sort((a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime())\n .slice(0, 6);\n\n if (allIssues.length > 0) {\n writeLine(` ${bold}Recent${RESET}`);\n writeLine();\n\n for (const issue of allIssues) {\n const labelStr = issue.labels.length > 0\n ? `${colors.dim}[${issue.labels.map(getLabelName).join(', ')}]${RESET}`\n : '';\n\n writeLine(` ${icons.empty} ${colors.dim}#${issue.number}${RESET} ${truncate(issue.title, 50)} ${labelStr}`);\n writeLine(` ${colors.dim}└ ${issue.repo}${RESET}`);\n }\n writeLine();\n }\n\n // Commands\n writeLine(` ${colors.dim}$${RESET} gh issue list -R ${colors.cyan}${org}/<repo>${RESET} ${colors.dim}View repo issues${RESET}`);\n writeLine(` ${colors.dim}$${RESET} gh issue create -R ${colors.cyan}${org}/<repo>${RESET} ${colors.dim}Create issue${RESET}`);\n writeLine();\n}\n","import { execSync, spawn } from 'child_process';\nimport ora from 'ora';\nimport {\n colors,\n bold,\n RESET,\n gradient,\n truncate,\n icons,\n writeLine,\n} from '../lib/terminal.js';\n\ninterface Issue {\n number: number;\n title: string;\n labels: Array<{ name: string }>;\n body?: string;\n}\n\ninterface SolveOptions {\n repo?: string;\n issue?: number;\n dryRun?: boolean;\n execute?: boolean;\n}\n\nconst DEFAULT_ORG = 'agents-squads';\nconst DEFAULT_REPOS = ['hq', 'agents-squads-web', 'squads-cli', 'agents-squads'];\n\nexport async function solveIssuesCommand(options: SolveOptions = {}): Promise<void> {\n const repos = options.repo ? [options.repo] : DEFAULT_REPOS;\n\n writeLine();\n writeLine(` ${gradient('squads')} ${colors.dim}solve-issues${RESET}`);\n writeLine();\n\n // Check if gh is available\n try {\n execSync('gh --version', { stdio: 'pipe' });\n } catch {\n writeLine(` ${colors.red}GitHub CLI (gh) not found${RESET}`);\n writeLine(` ${colors.dim}Install: brew install gh${RESET}`);\n return;\n }\n\n // Collect issues to solve\n const issuesToSolve: Array<Issue & { repo: string }> = [];\n\n if (options.issue) {\n // Specific issue\n const repo = options.repo || 'hq';\n try {\n const result = execSync(\n `gh issue view ${options.issue} -R ${DEFAULT_ORG}/${repo} --json number,title,labels,body`,\n { stdio: 'pipe', encoding: 'utf-8' }\n );\n const issue = JSON.parse(result);\n issuesToSolve.push({ ...issue, repo });\n } catch {\n writeLine(` ${colors.red}Issue #${options.issue} not found in ${repo}${RESET}`);\n return;\n }\n } else {\n // All ready-to-fix issues\n for (const repo of repos) {\n try {\n const result = execSync(\n `gh issue list -R ${DEFAULT_ORG}/${repo} --label \"ready-to-fix\" --state open --json number,title,labels --limit 20`,\n { stdio: 'pipe', encoding: 'utf-8' }\n );\n const issues: Issue[] = JSON.parse(result);\n for (const issue of issues) {\n issuesToSolve.push({ ...issue, repo });\n }\n } catch {\n // Repo might not exist or no access\n }\n }\n }\n\n if (issuesToSolve.length === 0) {\n writeLine(` ${colors.yellow}No issues with 'ready-to-fix' label found${RESET}`);\n writeLine();\n writeLine(` ${colors.dim}Label an issue to make it solvable:${RESET}`);\n writeLine(` ${colors.dim}$${RESET} gh issue edit ${colors.cyan}<number>${RESET} -R ${colors.cyan}${DEFAULT_ORG}/<repo>${RESET} --add-label ready-to-fix`);\n writeLine();\n return;\n }\n\n // Show issues to solve\n writeLine(` ${colors.cyan}${issuesToSolve.length}${RESET} issue${issuesToSolve.length > 1 ? 's' : ''} to solve`);\n writeLine();\n\n for (const issue of issuesToSolve) {\n const labels = issue.labels.map(l => l.name).join(', ');\n writeLine(` ${icons.empty} ${colors.dim}#${issue.number}${RESET} ${truncate(issue.title, 50)}`);\n writeLine(` ${colors.dim}└ ${issue.repo} [${labels}]${RESET}`);\n }\n writeLine();\n\n if (options.dryRun) {\n writeLine(` ${colors.yellow}[DRY RUN] Would solve ${issuesToSolve.length} issues${RESET}`);\n return;\n }\n\n // Solve issues\n if (options.execute) {\n await solveWithClaude(issuesToSolve);\n } else {\n showSolveInstructions(issuesToSolve);\n }\n}\n\nfunction showSolveInstructions(issues: Array<Issue & { repo: string }>): void {\n writeLine(` ${bold}To solve these issues:${RESET}`);\n writeLine();\n writeLine(` ${colors.dim}Option 1: In Claude Code session${RESET}`);\n writeLine(` ${colors.dim}$${RESET} /solve-issue ${colors.cyan}${issues[0].repo}${RESET}`);\n writeLine();\n writeLine(` ${colors.dim}Option 2: Execute with Claude CLI${RESET}`);\n writeLine(` ${colors.dim}$${RESET} squads solve-issues --execute`);\n writeLine();\n writeLine(` ${colors.dim}Option 3: Solve specific issue${RESET}`);\n writeLine(` ${colors.dim}$${RESET} squads solve-issues --repo ${colors.cyan}${issues[0].repo}${RESET} --issue ${colors.cyan}${issues[0].number}${RESET} --execute`);\n writeLine();\n}\n\nasync function solveWithClaude(issues: Array<Issue & { repo: string }>): Promise<void> {\n const spinner = ora('Starting issue solver...').start();\n\n // Check if claude is available\n try {\n execSync('which claude', { stdio: 'pipe' });\n } catch {\n spinner.fail('Claude CLI not found');\n writeLine(` ${colors.dim}Install: npm install -g @anthropic-ai/claude-code${RESET}`);\n return;\n }\n\n for (const issue of issues) {\n spinner.text = `Solving #${issue.number}: ${truncate(issue.title, 40)}`;\n\n const prompt = buildSolvePrompt(issue);\n\n try {\n const result = await executeClaudePrompt(prompt);\n spinner.succeed(`Solved #${issue.number}`);\n\n // Extract PR URL if present\n const prMatch = result.match(/https:\\/\\/github\\.com\\/[^\\s]+\\/pull\\/\\d+/);\n if (prMatch) {\n writeLine(` ${colors.green}PR: ${prMatch[0]}${RESET}`);\n }\n } catch (error) {\n spinner.fail(`Failed #${issue.number}: ${error}`);\n }\n }\n\n writeLine();\n writeLine(` ${colors.dim}View results:${RESET}`);\n writeLine(` ${colors.dim}$${RESET} gh pr list -R ${colors.cyan}${DEFAULT_ORG}/<repo>${RESET}`);\n writeLine();\n}\n\nfunction buildSolvePrompt(issue: Issue & { repo: string }): string {\n return `Solve GitHub issue #${issue.number} in ${DEFAULT_ORG}/${issue.repo}.\n\nIssue: ${issue.title}\n\n## CRITICAL: Work Decisively (No Verification Loops!)\n\nRead each file ONCE, edit ONCE, commit IMMEDIATELY.\nVerify with git diff, NOT by re-reading files.\nIf reading the same file twice, STOP and move forward.\n\n## Instructions\n\n1. Read the issue: gh issue view ${issue.number} --repo ${DEFAULT_ORG}/${issue.repo}\n\n2. Set up worktree:\n git fetch origin main\n git worktree add ../.worktrees/issue-${issue.number} -b solve/issue-${issue.number} origin/main\n cd ../.worktrees/issue-${issue.number}\n\n3. Find and fix the problem (minimal changes)\n\n4. Commit: git add -A && git commit -m \"fix: ...\"\n\n5. Push and create PR:\n git push -u origin solve/issue-${issue.number}\n gh pr create --title \"fix: ...\" --body \"Fixes #${issue.number}\" --repo ${DEFAULT_ORG}/${issue.repo}\n\n6. Clean up: git worktree remove ../.worktrees/issue-${issue.number} --force\n\nReturn the PR URL when done.`;\n}\n\nfunction executeClaudePrompt(prompt: string): Promise<string> {\n return new Promise((resolve, reject) => {\n const claude = spawn('claude', ['--print', prompt], {\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n\n let output = '';\n let error = '';\n\n claude.stdout?.on('data', (data) => {\n output += data.toString();\n });\n\n claude.stderr?.on('data', (data) => {\n error += data.toString();\n });\n\n claude.on('close', (code) => {\n if (code === 0) {\n resolve(output);\n } else {\n reject(new Error(error || `Exited with code ${code}`));\n }\n });\n\n claude.on('error', reject);\n\n // 10 minute timeout\n setTimeout(() => {\n claude.kill();\n reject(new Error('Timeout after 10 minutes'));\n }, 10 * 60 * 1000);\n });\n}\n","import { execSync, spawn } from 'child_process';\nimport { readdirSync } from 'fs';\nimport { join } from 'path';\nimport ora from 'ora';\nimport {\n colors,\n bold,\n RESET,\n gradient,\n icons,\n writeLine,\n} from '../lib/terminal.js';\nimport { findSquadsDir } from '../lib/squad-parser.js';\n\ninterface OpenOptions {\n squad?: string;\n agent?: string;\n dryRun?: boolean;\n execute?: boolean;\n}\n\ninterface EvalAgent {\n name: string;\n squad: string;\n path: string;\n}\n\n// Agents that find issues (evaluators, critics, auditors)\nconst ISSUE_FINDER_PATTERNS = [\n '*-eval.md',\n '*-critic.md',\n '*-auditor.md',\n 'site-tester.md',\n];\n\nexport async function openIssuesCommand(options: OpenOptions = {}): Promise<void> {\n writeLine();\n writeLine(` ${gradient('squads')} ${colors.dim}open-issues${RESET}`);\n writeLine();\n\n const squadsDir = findSquadsDir();\n if (!squadsDir) {\n writeLine(` ${colors.red}No .agents/squads directory found${RESET}`);\n writeLine(` ${colors.dim}Run \\`squads init\\` to create one.${RESET}`);\n return;\n }\n\n // Find evaluator/critic agents\n const evalAgents = findEvalAgents(squadsDir, options.squad);\n\n if (evalAgents.length === 0) {\n writeLine(` ${colors.yellow}No evaluator agents found${RESET}`);\n writeLine(` ${colors.dim}Evaluators match: *-eval.md, *-critic.md, *-auditor.md${RESET}`);\n return;\n }\n\n // Filter by specific agent if requested\n const agents = options.agent\n ? evalAgents.filter(a => a.name === options.agent || a.name === `${options.agent}.md`)\n : evalAgents;\n\n if (agents.length === 0) {\n writeLine(` ${colors.red}Agent '${options.agent}' not found${RESET}`);\n writeLine(` ${colors.dim}Available: ${evalAgents.map(a => a.name).join(', ')}${RESET}`);\n return;\n }\n\n // Group by squad\n const bySquad = agents.reduce((acc, agent) => {\n if (!acc[agent.squad]) acc[agent.squad] = [];\n acc[agent.squad].push(agent);\n return acc;\n }, {} as Record<string, EvalAgent[]>);\n\n writeLine(` ${colors.cyan}${agents.length}${RESET} evaluator${agents.length > 1 ? 's' : ''} ready`);\n writeLine();\n\n for (const [squad, squadAgents] of Object.entries(bySquad)) {\n writeLine(` ${bold}${squad}${RESET}`);\n for (const agent of squadAgents) {\n writeLine(` ${icons.empty} ${colors.cyan}${agent.name.replace('.md', '')}${RESET}`);\n }\n }\n writeLine();\n\n if (options.dryRun) {\n writeLine(` ${colors.yellow}[DRY RUN] Would run ${agents.length} evaluators${RESET}`);\n return;\n }\n\n if (options.execute) {\n await runEvaluators(agents);\n } else {\n showRunInstructions(agents);\n }\n}\n\nfunction findEvalAgents(squadsDir: string, filterSquad?: string): EvalAgent[] {\n const agents: EvalAgent[] = [];\n const squads = readdirSync(squadsDir, { withFileTypes: true })\n .filter(d => d.isDirectory())\n .filter(d => !filterSquad || d.name === filterSquad)\n .map(d => d.name);\n\n for (const squad of squads) {\n const squadPath = join(squadsDir, squad);\n const files = readdirSync(squadPath).filter(f => f.endsWith('.md'));\n\n for (const file of files) {\n // Check if matches evaluator patterns\n const isEval = ISSUE_FINDER_PATTERNS.some(pattern => {\n const regex = new RegExp('^' + pattern.replace('*', '.*') + '$');\n return regex.test(file);\n });\n\n if (isEval) {\n agents.push({\n name: file,\n squad,\n path: join(squadPath, file),\n });\n }\n }\n }\n\n return agents;\n}\n\nfunction showRunInstructions(agents: EvalAgent[]): void {\n writeLine(` ${bold}To run evaluators:${RESET}`);\n writeLine();\n writeLine(` ${colors.dim}Option 1: In Claude Code session${RESET}`);\n writeLine(` ${colors.dim}$${RESET} /website-eval`);\n writeLine();\n writeLine(` ${colors.dim}Option 2: Execute with Claude CLI${RESET}`);\n writeLine(` ${colors.dim}$${RESET} squads open-issues --execute`);\n writeLine();\n writeLine(` ${colors.dim}Option 3: Run specific evaluator${RESET}`);\n writeLine(` ${colors.dim}$${RESET} squads open-issues --squad ${colors.cyan}${agents[0].squad}${RESET} --agent ${colors.cyan}${agents[0].name.replace('.md', '')}${RESET} --execute`);\n writeLine();\n writeLine(` ${colors.dim}Option 4: Via squads run${RESET}`);\n writeLine(` ${colors.dim}$${RESET} squads run ${colors.cyan}${agents[0].squad}/${agents[0].name.replace('.md', '')}${RESET} --execute`);\n writeLine();\n}\n\nasync function runEvaluators(agents: EvalAgent[]): Promise<void> {\n const spinner = ora('Starting evaluators...').start();\n\n // Check if claude is available\n try {\n execSync('which claude', { stdio: 'pipe' });\n } catch {\n spinner.fail('Claude CLI not found');\n writeLine(` ${colors.dim}Install: npm install -g @anthropic-ai/claude-code${RESET}`);\n return;\n }\n\n let issuesCreated = 0;\n\n for (const agent of agents) {\n spinner.text = `Running ${agent.squad}/${agent.name.replace('.md', '')}...`;\n\n const prompt = buildEvalPrompt(agent);\n\n try {\n const result = await executeClaudePrompt(prompt);\n spinner.succeed(`${agent.name.replace('.md', '')}`);\n\n // Count issues created\n const issueMatches = result.match(/Created issue #\\d+/g) || [];\n issuesCreated += issueMatches.length;\n\n if (issueMatches.length > 0) {\n writeLine(` ${colors.green}Created ${issueMatches.length} issue(s)${RESET}`);\n } else {\n writeLine(` ${colors.dim}No issues found${RESET}`);\n }\n } catch (error) {\n spinner.fail(`${agent.name.replace('.md', '')}: ${error}`);\n }\n }\n\n writeLine();\n writeLine(` ${bold}Summary${RESET}`);\n writeLine(` ${colors.cyan}${issuesCreated}${RESET} new issues created`);\n writeLine();\n writeLine(` ${colors.dim}View issues:${RESET}`);\n writeLine(` ${colors.dim}$${RESET} squads issues`);\n writeLine();\n writeLine(` ${colors.dim}Solve them:${RESET}`);\n writeLine(` ${colors.dim}$${RESET} squads solve-issues`);\n writeLine();\n}\n\nfunction buildEvalPrompt(agent: EvalAgent): string {\n return `Execute the ${agent.name.replace('.md', '')} evaluator from squad ${agent.squad}.\n\nRead the agent definition at ${agent.path} and follow its instructions exactly.\n\n## CRITICAL: Work Decisively\n\n- Evaluate the target (website, code, etc.)\n- For each finding, create a GitHub issue\n- Use: gh issue create --repo agents-squads/{repo} --title \"...\" --body \"...\" --label \"type:...,priority:P1/P2/P3,squad:${agent.squad}\"\n- Report how many issues were created\n\nDo NOT get stuck re-reading files. Evaluate, report findings, create issues, done.`;\n}\n\nfunction executeClaudePrompt(prompt: string): Promise<string> {\n return new Promise((resolve, reject) => {\n const claude = spawn('claude', ['--print', prompt], {\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n\n let output = '';\n let error = '';\n\n claude.stdout?.on('data', (data) => {\n output += data.toString();\n });\n\n claude.stderr?.on('data', (data) => {\n error += data.toString();\n });\n\n claude.on('close', (code) => {\n if (code === 0) {\n resolve(output);\n } else {\n reject(new Error(error || `Exited with code ${code}`));\n }\n });\n\n claude.on('error', reject);\n\n // 5 minute timeout per evaluator\n setTimeout(() => {\n claude.kill();\n reject(new Error('Timeout after 5 minutes'));\n }, 5 * 60 * 1000);\n });\n}\n","import chalk from 'chalk';\nimport ora from 'ora';\nimport open from 'open';\nimport {\n isPersonalEmail,\n getEmailDomain,\n saveSession,\n loadSession,\n clearSession,\n startAuthCallbackServer,\n AuthSession\n} from '../lib/auth.js';\nimport { track } from '../lib/telemetry.js';\n\nconst AUTH_URL = process.env.SQUADS_AUTH_URL || 'https://app.agents-squads.com/auth';\nconst CALLBACK_PORT = 54321;\n\nexport async function loginCommand(): Promise<void> {\n const existingSession = loadSession();\n\n if (existingSession && existingSession.status === 'active') {\n console.log(chalk.green(`✓ Already logged in as ${existingSession.email}`));\n console.log(chalk.dim(` Domain: ${existingSession.domain}`));\n console.log(chalk.dim(` Run 'squads logout' to sign out.`));\n return;\n }\n\n console.log(`\n${chalk.bold.magenta('Squads CLI Login')}\n${chalk.dim('─'.repeat(40))}\n\nOpening browser to authenticate...\n`);\n\n const spinner = ora('Waiting for authentication...').start();\n\n try {\n // Start local callback server\n const callbackPromise = startAuthCallbackServer(CALLBACK_PORT);\n\n // Open browser to auth page\n const authUrl = `${AUTH_URL}?callback=http://localhost:${CALLBACK_PORT}/callback`;\n await open(authUrl);\n\n // Wait for callback\n const { email, token } = await callbackPromise;\n\n // Check if personal email\n if (isPersonalEmail(email)) {\n spinner.fail('Personal emails not supported');\n console.log(`\n${chalk.yellow('⚠ Squads CLI is for Pro & Enterprise teams only.')}\n\nPersonal email domains (Gmail, Yahoo, etc.) are not supported.\n\n${chalk.dim('Want to stay updated?')}\n → Get our free research report: ${chalk.cyan('https://agents-squads.com/research')}\n → Follow us: ${chalk.cyan('https://x.com/agents_squads')}\n`);\n\n await track('cli.login.personal_email', { domain: getEmailDomain(email) });\n return;\n }\n\n // Save session\n const session: AuthSession = {\n email,\n domain: getEmailDomain(email),\n status: 'pending', // Will be 'active' after sales contact\n createdAt: new Date().toISOString(),\n accessToken: token,\n };\n\n saveSession(session);\n spinner.succeed(`Logged in as ${chalk.cyan(email)}`);\n\n await track('cli.login.success', { domain: session.domain });\n\n console.log(`\n${chalk.green('✓ Thanks for signing up!')}\n\n${chalk.bold('What happens next:')}\n 1. Our team will reach out within 24 hours\n 2. We'll discuss your AI agent needs\n 3. You'll get access to Pro features\n\n${chalk.dim('In the meantime:')}\n → Explore squads: ${chalk.cyan('squads status')}\n → Set goals: ${chalk.cyan('squads goal set <squad> \"<goal>\"')}\n → Read our research: ${chalk.cyan('https://agents-squads.com/research')}\n\n${chalk.dim('Questions? Email us at')} ${chalk.cyan('hello@agents-squads.com')}\n`);\n\n } catch (error) {\n spinner.fail('Login failed');\n console.error(chalk.red(error instanceof Error ? error.message : 'Unknown error'));\n }\n}\n\nexport async function logoutCommand(): Promise<void> {\n const session = loadSession();\n\n if (!session) {\n console.log(chalk.yellow('Not logged in.'));\n return;\n }\n\n clearSession();\n console.log(chalk.green(`✓ Logged out from ${session.email}`));\n await track('cli.logout');\n}\n\nexport async function whoamiCommand(): Promise<void> {\n const session = loadSession();\n\n if (!session) {\n console.log(chalk.yellow('Not logged in.'));\n console.log(chalk.dim('Run: squads login'));\n return;\n }\n\n console.log(`\n${chalk.bold('Current Session')}\n${chalk.dim('─'.repeat(30))}\nEmail: ${chalk.cyan(session.email)}\nDomain: ${session.domain}\nStatus: ${session.status === 'active' ? chalk.green('Active') : chalk.yellow('Pending')}\nSince: ${new Date(session.createdAt).toLocaleDateString()}\n`);\n}\n","import { createClient } from '@supabase/supabase-js';\nimport { existsSync, readFileSync, writeFileSync, mkdirSync } from 'fs';\nimport { join } from 'path';\nimport { homedir } from 'os';\nimport 'open';\nimport http from 'http';\n\n// Personal email domains to reject\nconst PERSONAL_DOMAINS = [\n 'gmail.com', 'googlemail.com',\n 'yahoo.com', 'yahoo.co.uk', 'yahoo.fr',\n 'hotmail.com', 'outlook.com', 'live.com', 'msn.com',\n 'icloud.com', 'me.com', 'mac.com',\n 'aol.com',\n 'protonmail.com', 'proton.me',\n 'zoho.com',\n 'mail.com',\n 'yandex.com', 'yandex.ru',\n 'gmx.com', 'gmx.de',\n 'fastmail.com',\n 'tutanota.com',\n 'hey.com',\n];\n\nconst AUTH_DIR = join(homedir(), '.squads-cli');\nconst AUTH_PATH = join(AUTH_DIR, 'auth.json');\n\nexport interface AuthSession {\n email: string;\n domain: string;\n status: 'pending' | 'contacted' | 'active';\n createdAt: string;\n accessToken?: string;\n}\n\nexport function isPersonalEmail(email: string): boolean {\n const domain = email.split('@')[1]?.toLowerCase();\n return PERSONAL_DOMAINS.includes(domain);\n}\n\nexport function getEmailDomain(email: string): string {\n return email.split('@')[1]?.toLowerCase() || '';\n}\n\nexport function saveSession(session: AuthSession): void {\n if (!existsSync(AUTH_DIR)) {\n mkdirSync(AUTH_DIR, { recursive: true });\n }\n writeFileSync(AUTH_PATH, JSON.stringify(session, null, 2));\n}\n\nexport function loadSession(): AuthSession | null {\n if (!existsSync(AUTH_PATH)) return null;\n try {\n return JSON.parse(readFileSync(AUTH_PATH, 'utf-8'));\n } catch {\n return null;\n }\n}\n\nexport function clearSession(): void {\n if (existsSync(AUTH_PATH)) {\n writeFileSync(AUTH_PATH, '');\n }\n}\n\nexport function isLoggedIn(): boolean {\n const session = loadSession();\n return session !== null && session.status === 'active';\n}\n\n// Create Supabase client (for edge function use)\nexport function createSupabaseClient(url: string, anonKey: string) {\n return createClient(url, anonKey);\n}\n\n// Local callback server for OAuth flow\nexport function startAuthCallbackServer(port: number = 54321): Promise<{ email: string; token: string }> {\n return new Promise((resolve, reject) => {\n const server = http.createServer((req, res) => {\n const url = new URL(req.url || '', `http://localhost:${port}`);\n\n if (url.pathname === '/callback') {\n const email = url.searchParams.get('email');\n const token = url.searchParams.get('token');\n const error = url.searchParams.get('error');\n\n if (error) {\n res.writeHead(200, { 'Content-Type': 'text/html' });\n res.end(`\n <html>\n <body style=\"font-family: system-ui; display: flex; justify-content: center; align-items: center; height: 100vh; margin: 0;\">\n <div style=\"text-align: center;\">\n <h1 style=\"color: #ef4444;\">❌ ${error}</h1>\n <p>You can close this window.</p>\n </div>\n </body>\n </html>\n `);\n server.close();\n reject(new Error(error));\n return;\n }\n\n if (email && token) {\n res.writeHead(200, { 'Content-Type': 'text/html' });\n res.end(`\n <html>\n <body style=\"font-family: system-ui; display: flex; justify-content: center; align-items: center; height: 100vh; margin: 0;\">\n <div style=\"text-align: center;\">\n <h1 style=\"color: #10b981;\">✓ Logged in!</h1>\n <p>Welcome, ${email}</p>\n <p style=\"color: #6b7280;\">You can close this window and return to your terminal.</p>\n </div>\n </body>\n </html>\n `);\n server.close();\n resolve({ email, token });\n } else {\n res.writeHead(400, { 'Content-Type': 'text/plain' });\n res.end('Missing email or token');\n }\n } else {\n res.writeHead(404);\n res.end();\n }\n });\n\n server.listen(port, () => {\n // Server started\n });\n\n // Timeout after 5 minutes\n setTimeout(() => {\n server.close();\n reject(new Error('Login timed out'));\n }, 5 * 60 * 1000);\n });\n}\n","/**\n * squads update - Check and install updates\n */\n\nimport { createInterface } from 'readline';\nimport {\n 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 fix: 'squads stack up postgres',\n },\n {\n name: 'Redis',\n url: `${process.env.SQUADS_BRIDGE_URL || 'http://localhost:8088'}/stats`,\n fix: 'squads stack up redis',\n },\n {\n name: 'Bridge API',\n url: `${process.env.SQUADS_BRIDGE_URL || 'http://localhost:8088'}/health`,\n fix: 'squads stack up bridge',\n },\n {\n name: 'Scheduler',\n url: `${process.env.SQUADS_SCHEDULER_URL || 'http://localhost:8090'}/health`,\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_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 // Quick tips\n 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","import { execSync } from 'child_process';\nimport { existsSync, readFileSync } from 'fs';\nimport { join } from 'path';\nimport { findMemoryDir } from '../lib/memory.js';\nimport {\n colors,\n bold,\n RESET,\n gradient,\n box,\n padEnd,\n truncate,\n icons,\n writeLine,\n} from '../lib/terminal.js';\n\ninterface TaskEntry {\n id: string;\n squad: string;\n description: string;\n status: 'active' | 'completed' | 'failed';\n startedAt: string;\n}\n\ninterface ProcessInfo {\n pid: string;\n cpu: string;\n mem: string;\n time: string;\n command: string;\n type: 'claude' | 'agent' | 'hook' | 'dev-server';\n}\n\nfunction getTasksFilePath(): string | null {\n const memoryDir = findMemoryDir();\n if (!memoryDir) return null;\n return join(memoryDir, '..', 'tasks.json');\n}\n\nfunction loadActiveTasks(): TaskEntry[] {\n const tasksPath = getTasksFilePath();\n if (!tasksPath || !existsSync(tasksPath)) return [];\n\n try {\n const data = JSON.parse(readFileSync(tasksPath, 'utf-8'));\n return data.tasks?.filter((t: TaskEntry) => t.status === 'active') || [];\n } catch {\n return [];\n }\n}\n\nfunction getRunningProcesses(): ProcessInfo[] {\n const processes: ProcessInfo[] = [];\n\n try {\n // Get Claude and related processes\n const psOutput = execSync(\n 'ps aux | grep -E \"claude|squads|astro|node.*agent\" | grep -v grep',\n { encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] }\n ).trim();\n\n if (!psOutput) return processes;\n\n for (const line of psOutput.split('\\n')) {\n const parts = line.trim().split(/\\s+/);\n if (parts.length < 11) continue;\n\n const pid = parts[1];\n const cpu = parts[2];\n const mem = parts[3];\n const time = parts[9];\n const command = parts.slice(10).join(' ');\n\n // Categorize the process\n let type: ProcessInfo['type'] = 'agent';\n if (command.includes('claude')) type = 'claude';\n else if (command.includes('squads')) type = 'hook';\n else if (command.includes('astro')) type = 'dev-server';\n\n // Skip very short-lived processes\n if (command.includes('grep')) continue;\n\n processes.push({ pid, cpu, mem, time, command, type });\n }\n } catch {\n // No matching processes\n }\n\n return processes;\n}\n\nfunction categorizeProcesses(processes: ProcessInfo[]): {\n claude: ProcessInfo[];\n hooks: ProcessInfo[];\n devServers: ProcessInfo[];\n agents: ProcessInfo[];\n} {\n return {\n claude: processes.filter(p => p.type === 'claude'),\n hooks: processes.filter(p => p.type === 'hook'),\n devServers: processes.filter(p => p.type === 'dev-server'),\n agents: processes.filter(p => p.type === 'agent'),\n };\n}\n\nfunction formatCommand(cmd: string, maxLen = 45): string {\n // Extract meaningful part of command\n if (cmd.includes('claude')) {\n return truncate('claude (session)', maxLen);\n }\n if (cmd.includes('astro dev')) {\n return truncate('astro dev server', maxLen);\n }\n if (cmd.includes('squads')) {\n const match = cmd.match(/squads\\s+(\\S+)/);\n return truncate(`squads ${match?.[1] || 'command'}`, maxLen);\n }\n return truncate(cmd, maxLen);\n}\n\nexport async function workersCommand(options: { verbose?: boolean; kill?: string } = {}): Promise<void> {\n writeLine();\n writeLine(` ${gradient('squads')} ${colors.dim}workers${RESET}`);\n writeLine();\n\n // Kill a process if requested\n if (options.kill) {\n try {\n execSync(`kill ${options.kill}`, { stdio: 'pipe' });\n writeLine(` ${icons.success} Killed process ${colors.cyan}${options.kill}${RESET}`);\n writeLine();\n return;\n } catch {\n writeLine(` ${icons.error} Failed to kill process ${colors.red}${options.kill}${RESET}`);\n writeLine();\n return;\n }\n }\n\n const activeTasks = loadActiveTasks();\n const processes = getRunningProcesses();\n const categorized = categorizeProcesses(processes);\n\n // Summary stats\n const stats = [\n `${colors.cyan}${categorized.claude.length}${RESET} claude`,\n `${colors.green}${activeTasks.length}${RESET} tasks`,\n `${colors.purple}${categorized.devServers.length}${RESET} dev servers`,\n ].join(` ${colors.dim}│${RESET} `);\n writeLine(` ${stats}`);\n writeLine();\n\n // Claude sessions\n if (categorized.claude.length > 0) {\n writeLine(` ${bold}Claude Sessions${RESET} ${colors.dim}(terminal tabs)${RESET}`);\n writeLine();\n\n const w = { pid: 8, cpu: 6, mem: 6, time: 8, cmd: 30 };\n const tableWidth = w.pid + w.cpu + w.mem + w.time + w.cmd + 8;\n\n writeLine(` ${colors.purple}${box.topLeft}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.topRight}${RESET}`);\n writeLine(` ${colors.purple}${box.vertical}${RESET} ${bold}${padEnd('PID', w.pid)}${padEnd('CPU%', w.cpu)}${padEnd('MEM%', w.mem)}${padEnd('TIME', w.time)}${padEnd('STATUS', w.cmd)}${RESET} ${colors.purple}${box.vertical}${RESET}`);\n writeLine(` ${colors.purple}${box.teeRight}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.teeLeft}${RESET}`);\n\n for (const proc of categorized.claude) {\n const cpuColor = parseFloat(proc.cpu) > 50 ? colors.yellow : colors.dim;\n const status = parseFloat(proc.cpu) > 10 ? `${icons.active} active` : `${icons.pending} idle`;\n\n const row = ` ${colors.purple}${box.vertical}${RESET} ` +\n `${colors.cyan}${padEnd(proc.pid, w.pid)}${RESET}` +\n `${cpuColor}${padEnd(proc.cpu, w.cpu)}${RESET}` +\n `${colors.dim}${padEnd(proc.mem, w.mem)}${RESET}` +\n `${colors.dim}${padEnd(proc.time, w.time)}${RESET}` +\n `${padEnd(status, w.cmd)}` +\n ` ${colors.purple}${box.vertical}${RESET}`;\n writeLine(row);\n }\n\n writeLine(` ${colors.purple}${box.bottomLeft}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.bottomRight}${RESET}`);\n writeLine();\n }\n\n // Active tasks (registered via squads progress start)\n if (activeTasks.length > 0) {\n writeLine(` ${bold}Registered Tasks${RESET} ${colors.dim}(squads progress)${RESET}`);\n writeLine();\n\n for (const task of activeTasks) {\n const elapsed = getElapsedTime(task.startedAt);\n writeLine(` ${icons.progress} ${colors.cyan}${task.squad}${RESET} ${truncate(task.description, 40)}`);\n writeLine(` ${colors.dim}id: ${task.id} · started ${elapsed} ago${RESET}`);\n }\n writeLine();\n }\n\n // Dev servers\n if (categorized.devServers.length > 0) {\n writeLine(` ${bold}Dev Servers${RESET}`);\n writeLine();\n\n for (const proc of categorized.devServers) {\n const name = formatCommand(proc.command);\n writeLine(` ${icons.active} ${colors.green}${name}${RESET} ${colors.dim}(pid: ${proc.pid})${RESET}`);\n }\n writeLine();\n }\n\n // Hooks/squads processes\n if (categorized.hooks.length > 0) {\n writeLine(` ${bold}Hook Processes${RESET}`);\n writeLine();\n\n for (const proc of categorized.hooks) {\n const name = formatCommand(proc.command);\n writeLine(` ${icons.pending} ${colors.yellow}${name}${RESET} ${colors.dim}(pid: ${proc.pid})${RESET}`);\n }\n writeLine();\n }\n\n // No workers message\n if (categorized.claude.length === 0 && activeTasks.length === 0) {\n writeLine(` ${colors.dim}No active workers${RESET}`);\n writeLine();\n }\n\n // Commands\n writeLine(` ${colors.dim}$${RESET} squads workers --kill <pid> ${colors.dim}Kill a process${RESET}`);\n writeLine(` ${colors.dim}$${RESET} squads progress ${colors.dim}Task history${RESET}`);\n writeLine();\n}\n\nfunction getElapsedTime(startTime: string): string {\n const start = new Date(startTime).getTime();\n const now = Date.now();\n const diffMs = now - start;\n\n const minutes = Math.floor(diffMs / 60000);\n const hours = Math.floor(minutes / 60);\n const days = Math.floor(hours / 24);\n\n if (days > 0) return `${days}d`;\n if (hours > 0) return `${hours}h`;\n if (minutes > 0) return `${minutes}m`;\n return '<1m';\n}\n","/**\n * 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 ? Promise.resolve(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","import { spawn } from 'child_process';\nimport { colors, RESET, gradient, writeLine } from '../lib/terminal.js';\n\ninterface WatchOptions {\n interval?: number;\n clear?: boolean;\n}\n\n/**\n * Watch command - live refresh any squads command\n * Similar to Unix `watch` but integrated with squads CLI\n */\nexport async function watchCommand(\n command: string,\n args: string[],\n options: WatchOptions\n): Promise<void> {\n const interval = (options.interval || 2) * 1000; // Default 2 seconds\n const shouldClear = options.clear !== false; // Default true\n\n // Validate command is a known squads command\n const validCommands = [\n 'status', 'workers', 'dash', 'dashboard', 'sessions',\n 'memory', 'history', 'results', 'progress', 'goal'\n ];\n\n if (!validCommands.includes(command)) {\n writeLine(` ${colors.red}Unknown command: ${command}${RESET}`);\n writeLine(` ${colors.dim}Valid commands: ${validCommands.join(', ')}${RESET}`);\n process.exit(1);\n }\n\n writeLine();\n writeLine(` ${gradient('squads')} ${colors.dim}watch${RESET} ${colors.cyan}${command}${RESET}`);\n writeLine(` ${colors.dim}Refreshing every ${options.interval || 2}s (Ctrl+C to stop)${RESET}`);\n writeLine();\n\n // Initial run\n await runCommand(command, args, shouldClear);\n\n // Set up interval\n const timer = setInterval(async () => {\n await runCommand(command, args, shouldClear);\n }, interval);\n\n // Handle Ctrl+C gracefully\n process.on('SIGINT', () => {\n clearInterval(timer);\n writeLine();\n writeLine(` ${colors.dim}Watch stopped${RESET}`);\n writeLine();\n process.exit(0);\n });\n\n // Keep process alive\n await new Promise(() => {}); // Never resolves, keeps running\n}\n\nasync function runCommand(command: string, args: string[], clear: boolean): Promise<void> {\n return new Promise((resolve) => {\n if (clear) {\n // Clear screen and move cursor to top\n process.stdout.write('\\x1b[2J\\x1b[H');\n }\n\n // Show timestamp\n const now = new Date().toLocaleTimeString();\n process.stdout.write(`\\x1b[90m${now}\\x1b[0m\\n\\n`);\n\n // Run the squads command\n const child = spawn('squads', [command, ...args], {\n stdio: 'inherit',\n env: process.env,\n });\n\n child.on('close', () => {\n resolve();\n });\n\n child.on('error', (err) => {\n writeLine(` ${colors.red}Error: ${err.message}${RESET}`);\n resolve();\n });\n });\n}\n","import blessed from 'blessed';\nimport contrib from 'blessed-contrib';\nimport { execSync } from 'child_process';\n\ninterface LiveOptions {\n minimal?: boolean;\n focus?: string;\n}\n\ninterface AgentStatus {\n name: string;\n squad: string;\n status: 'active' | 'idle' | 'done';\n duration: string;\n cpu: string;\n mem: string;\n}\n\ninterface CostData {\n today: number;\n week: number;\n budget: number;\n}\n\n/**\n * Live TUI Dashboard - Real-time squad monitoring\n * Uses blessed-contrib for terminal UI\n */\nexport async function liveCommand(_options: LiveOptions): Promise<void> {\n // Create blessed screen\n const screen = blessed.screen({\n smartCSR: true,\n title: 'Squads Live Dashboard',\n fullUnicode: true,\n });\n\n // Create grid layout\n const grid = new contrib.grid({\n rows: 12,\n cols: 12,\n screen: screen,\n });\n\n // === TOP ROW: Agents + Cost ===\n\n // Agents table (left)\n const agentsTable = grid.set(0, 0, 6, 8, contrib.table, {\n keys: true,\n fg: 'white',\n label: ' Running Agents ',\n columnSpacing: 2,\n columnWidth: [20, 12, 10, 8, 8],\n border: { type: 'line', fg: 'cyan' },\n });\n\n // Cost gauge (right)\n const costGauge = grid.set(0, 8, 3, 4, contrib.gauge, {\n label: ' Budget Used ',\n stroke: 'green',\n fill: 'white',\n border: { type: 'line', fg: 'cyan' },\n });\n\n // Cost details (right below gauge)\n const costLog = grid.set(3, 8, 3, 4, contrib.log, {\n fg: 'green',\n label: ' Cost Tracker ',\n border: { type: 'line', fg: 'cyan' },\n });\n\n // === BOTTOM ROW: Activity + Memory ===\n\n // Activity log (left)\n const activityLog = grid.set(6, 0, 6, 6, contrib.log, {\n fg: 'cyan',\n label: ' Recent Activity ',\n border: { type: 'line', fg: 'magenta' },\n });\n\n // Memory updates (right)\n const memoryLog = grid.set(6, 6, 6, 6, contrib.log, {\n fg: 'yellow',\n label: ' Memory Updates ',\n border: { type: 'line', fg: 'magenta' },\n });\n\n // === Data fetching functions ===\n\n function getAgents(): AgentStatus[] {\n try {\n const output = execSync('ps aux | grep -E \"claude|node.*squads\" | grep -v grep', {\n encoding: 'utf-8',\n timeout: 5000,\n });\n\n const agents: AgentStatus[] = [];\n const lines = output.trim().split('\\n').slice(0, 10);\n\n for (const line of lines) {\n const parts = line.trim().split(/\\s+/);\n if (parts.length >= 10) {\n const cpu = parts[2];\n const mem = parts[3];\n const time = parts[9];\n const cmd = parts.slice(10).join(' ');\n\n // Parse agent name from command\n let name = 'claude';\n let squad = 'unknown';\n\n if (cmd.includes('squads-')) {\n const match = cmd.match(/squads-(\\w+)-(\\w+)/);\n if (match) {\n squad = match[1];\n name = match[2];\n }\n }\n\n agents.push({\n name: name.substring(0, 18),\n squad: squad.substring(0, 10),\n status: parseFloat(cpu) > 5 ? 'active' : 'idle',\n duration: time,\n cpu: cpu + '%',\n mem: mem + '%',\n });\n }\n }\n\n return agents.slice(0, 8);\n } catch {\n return [];\n }\n }\n\n function getCosts(): CostData {\n // In a real implementation, this would fetch from Langfuse\n // For now, return mock data that updates\n const baseToday = 12.50;\n const baseWeek = 89.20;\n const variance = Math.random() * 0.5;\n\n return {\n today: baseToday + variance,\n week: baseWeek + variance * 10,\n budget: 200,\n };\n }\n\n function getRecentActivity(): string[] {\n try {\n const output = execSync(\n 'gh issue list --repo agents-squads/squads-cli --state open --limit 5 --json number,title,createdAt 2>/dev/null',\n { encoding: 'utf-8', timeout: 10000 }\n );\n\n const issues = JSON.parse(output);\n return issues.map((i: { number: number; title: string }) =>\n `#${i.number} ${i.title.substring(0, 40)}`\n );\n } catch {\n return ['(loading...)'];\n }\n }\n\n function getMemoryUpdates(): string[] {\n try {\n const output = execSync(\n 'find .agents/memory -name \"state.md\" -mmin -60 2>/dev/null | head -5',\n { encoding: 'utf-8', timeout: 5000 }\n );\n\n return output.trim().split('\\n')\n .filter(Boolean)\n .map(path => {\n const parts = path.split('/');\n const squad = parts[2] || '';\n const agent = parts[3] || '';\n return `${squad}/${agent}`;\n });\n } catch {\n return ['(no recent updates)'];\n }\n }\n\n // === Update functions ===\n\n function updateAgents() {\n const agents = getAgents();\n const data = agents.length > 0\n ? agents.map(a => [a.name, a.squad, a.status === 'active' ? '● active' : '○ idle', a.cpu, a.mem])\n : [['(no agents running)', '', '', '', '']];\n\n agentsTable.setData({\n headers: ['Agent', 'Squad', 'Status', 'CPU', 'MEM'],\n data: data,\n });\n }\n\n function updateCosts() {\n const costs = getCosts();\n const percent = Math.round((costs.week / costs.budget) * 100);\n\n costGauge.setPercent(percent);\n costLog.log(`Today: $${costs.today.toFixed(2)}`);\n costLog.log(`Week: $${costs.week.toFixed(2)} / $${costs.budget}`);\n }\n\n function updateActivity() {\n const activities = getRecentActivity();\n activities.forEach(a => activityLog.log(a));\n }\n\n function updateMemory() {\n const updates = getMemoryUpdates();\n updates.forEach(u => memoryLog.log(u));\n }\n\n // === Initial render ===\n updateAgents();\n updateCosts();\n updateActivity();\n updateMemory();\n screen.render();\n\n // === Set up refresh intervals ===\n const agentInterval = setInterval(() => {\n updateAgents();\n screen.render();\n }, 2000);\n\n const costInterval = setInterval(() => {\n updateCosts();\n screen.render();\n }, 5000);\n\n const activityInterval = setInterval(() => {\n updateActivity();\n screen.render();\n }, 10000);\n\n const memoryInterval = setInterval(() => {\n updateMemory();\n screen.render();\n }, 15000);\n\n // === Key bindings ===\n screen.key(['escape', 'q', 'C-c'], () => {\n clearInterval(agentInterval);\n clearInterval(costInterval);\n clearInterval(activityInterval);\n clearInterval(memoryInterval);\n return process.exit(0);\n });\n\n screen.key(['r'], () => {\n updateAgents();\n updateCosts();\n updateActivity();\n updateMemory();\n screen.render();\n });\n\n // Focus on agents table\n agentsTable.focus();\n}\n","import { execSync } from 'child_process';\n\ninterface ProcessInfo {\n pid: string;\n cpu: string;\n mem: string;\n time: string;\n status: 'active' | 'idle';\n cmd: string;\n}\n\n// ANSI escape codes\nconst ESC = '\\x1b';\nconst CLEAR_SCREEN = `${ESC}[2J`;\nconst CURSOR_HOME = `${ESC}[H`;\nconst CURSOR_HIDE = `${ESC}[?25l`;\nconst CURSOR_SHOW = `${ESC}[?25h`;\nconst BOLD = `${ESC}[1m`;\nconst DIM = `${ESC}[2m`;\nconst RESET = `${ESC}[0m`;\nconst CYAN = `${ESC}[36m`;\nconst GREEN = `${ESC}[32m`;\nconst YELLOW = `${ESC}[33m`;\nconst MAGENTA = `${ESC}[35m`;\n\n/**\n * Top command - live updating process table like Unix top\n * Single table, numbers update in place\n */\nexport async function topCommand(): Promise<void> {\n // Hide cursor and clear screen once\n process.stdout.write(CURSOR_HIDE + CLEAR_SCREEN + CURSOR_HOME);\n\n let running = true;\n\n // Handle exit\n const cleanup = () => {\n running = false;\n process.stdout.write(CURSOR_SHOW + '\\n');\n process.exit(0);\n };\n\n process.on('SIGINT', cleanup);\n process.on('SIGTERM', cleanup);\n\n // Main loop\n while (running) {\n const data = getProcessData();\n render(data);\n await sleep(1000); // Update every 1 second like top\n }\n}\n\nfunction getProcessData(): { processes: ProcessInfo[]; summary: { claude: number; tasks: number; agents: number } } {\n const processes: ProcessInfo[] = [];\n let claudeCount = 0;\n let agentCount = 0;\n\n try {\n // Get Claude processes\n const psOutput = execSync(\n 'ps aux | grep -E \"[c]laude\" | head -15',\n { encoding: 'utf-8', timeout: 5000 }\n );\n\n const lines = psOutput.trim().split('\\n').filter(Boolean);\n\n for (const line of lines) {\n const parts = line.trim().split(/\\s+/);\n if (parts.length >= 11) {\n const pid = parts[1];\n const cpu = parts[2];\n const mem = parts[3];\n const time = parts[9];\n const cmd = parts.slice(10).join(' ').substring(0, 30);\n\n const cpuNum = parseFloat(cpu);\n const status = cpuNum > 5 ? 'active' : 'idle';\n\n if (cmd.includes('squads-')) {\n agentCount++;\n }\n claudeCount++;\n\n processes.push({ pid, cpu, mem, time, status, cmd });\n }\n }\n } catch {\n // No processes found\n }\n\n // Get tmux agent sessions\n try {\n const tmuxOutput = execSync('tmux ls 2>/dev/null | grep squads- | wc -l', { encoding: 'utf-8' });\n agentCount = parseInt(tmuxOutput.trim()) || 0;\n } catch {\n // tmux not available or no sessions\n }\n\n return {\n processes: processes.slice(0, 12),\n summary: { claude: claudeCount, tasks: 0, agents: agentCount }\n };\n}\n\nfunction render(data: { processes: ProcessInfo[]; summary: { claude: number; tasks: number; agents: number } }): void {\n const now = new Date().toLocaleTimeString();\n const lines: string[] = [];\n\n // Header\n lines.push('');\n lines.push(` ${MAGENTA}squads${RESET} ${DIM}top${RESET} ${DIM}${now}${RESET} ${DIM}(q to quit)${RESET}`);\n lines.push('');\n\n // Summary line\n const activeCount = data.processes.filter(p => p.status === 'active').length;\n lines.push(` ${CYAN}${data.summary.claude}${RESET} claude ${DIM}│${RESET} ${GREEN}${activeCount}${RESET} active ${DIM}│${RESET} ${YELLOW}${data.summary.agents}${RESET} agents`);\n lines.push('');\n\n // Table header\n lines.push(` ${BOLD}PID CPU% MEM% TIME STATUS${RESET}`);\n lines.push(` ${DIM}${'─'.repeat(50)}${RESET}`);\n\n // Process rows\n if (data.processes.length === 0) {\n lines.push(` ${DIM}(no claude processes)${RESET}`);\n } else {\n for (const p of data.processes) {\n const statusIcon = p.status === 'active' ? `${GREEN}●${RESET}` : `${DIM}○${RESET}`;\n const statusText = p.status === 'active' ? `${GREEN}active${RESET}` : `${DIM}idle${RESET}`;\n const cpuColor = parseFloat(p.cpu) > 10 ? YELLOW : '';\n\n lines.push(\n ` ${CYAN}${p.pid.padEnd(8)}${RESET}` +\n `${cpuColor}${p.cpu.padStart(5)}${RESET} ` +\n `${p.mem.padStart(5)} ` +\n `${p.time.padEnd(10)}` +\n `${statusIcon} ${statusText}`\n );\n }\n }\n\n // Footer\n lines.push('');\n lines.push(` ${DIM}Press q to quit, r to refresh${RESET}`);\n lines.push('');\n\n // Move cursor home and render\n process.stdout.write(CURSOR_HOME);\n\n // Write each line, clearing to end of line\n for (const line of lines) {\n process.stdout.write(line + `${ESC}[K\\n`);\n }\n\n // Clear remaining lines\n for (let i = 0; i < 5; i++) {\n process.stdout.write(`${ESC}[K\\n`);\n }\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, ms));\n}\n\n// Handle keypress for quit\nif (process.stdin.isTTY) {\n process.stdin.setRawMode(true);\n process.stdin.resume();\n process.stdin.on('data', (key) => {\n // q or Ctrl+C\n if (key.toString() === 'q' || key[0] === 3) {\n process.stdout.write(CURSOR_SHOW + '\\n');\n process.exit(0);\n }\n // r for refresh (handled by main loop anyway)\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 * 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 { existsSync } from \"fs\";\n\nconst SCHEDULER_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(`${SCHEDULER_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 const params = squad ? `?squad=${squad}` : \"\";\n const triggers = await fetchScheduler<Trigger[]>(`/triggers${params}`);\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 // Call the Python sync script\n const { execSync } = await import(\"child_process\");\n const hqPath = process.env.HQ_PATH || `${process.env.HOME}/agents-squads/hq`;\n\n try {\n // Use venv Python if available, fallback to system python3\n const venvPython = `${hqPath}/squads-scheduler/.venv/bin/python`;\n const pythonCmd = existsSync(venvPython) ? venvPython : \"python3\";\n const output = execSync(\n `${pythonCmd} ${hqPath}/squads-scheduler/sync_triggers.py`,\n { encoding: \"utf-8\", cwd: hqPath }\n );\n console.log(output);\n } catch (error: unknown) {\n const execError = error as { stdout?: string; stderr?: string };\n console.error(chalk.red(\"Sync failed:\"), execError.stderr || execError);\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: ${SCHEDULER_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 * Skill management commands for Agent Skills API\n *\n * Commands:\n * - squads skill list # List uploaded skills\n * - squads skill upload <path> # Upload a skill directory\n * - squads skill delete <id> # Delete a skill\n * - squads skill show <id> # Show skill details\n * - squads skill convert <agent> # Convert agent.md to SKILL.md format\n */\n\nimport { Command } from 'commander';\nimport ora from 'ora';\nimport { existsSync, mkdirSync, writeFileSync, readFileSync } from 'fs';\nimport { join, basename, dirname } from 'path';\nimport {\n listSkills,\n uploadSkill,\n deleteSkill,\n getSkill,\n isApiKeyConfigured\n} from '../lib/anthropic.js';\nimport { findSquadsDir } from '../lib/squad-parser.js';\nimport {\n colors,\n RESET,\n gradient,\n icons,\n writeLine\n} from '../lib/terminal.js';\n\n/**\n * Register skill command with the CLI program\n */\nexport function registerSkillCommand(program: Command): void {\n const skill = program\n .command('skill')\n .description('Manage Agent Skills (upload, list, delete)');\n\n // List skills\n skill\n .command('list')\n .description('List uploaded skills from Anthropic API')\n .action(skillListCommand);\n\n // Upload skill\n skill\n .command('upload <path>')\n .description('Upload a skill directory to Anthropic API')\n .action(skillUploadCommand);\n\n // Delete skill\n skill\n .command('delete <skillId>')\n .description('Delete a skill from Anthropic API')\n .option('-f, --force', 'Skip confirmation prompt')\n .action(skillDeleteCommand);\n\n // Show skill details\n skill\n .command('show <skillId>')\n .description('Show details for a skill')\n .action(skillShowCommand);\n\n // Convert agent to skill format\n skill\n .command('convert <agent>')\n .description('Convert an agent.md file to SKILL.md format')\n .option('-o, --output <path>', 'Output directory (default: .agents/skills/<agent-name>)')\n .action(skillConvertCommand);\n}\n\n/**\n * List all uploaded skills\n */\nasync function skillListCommand(): Promise<void> {\n writeLine();\n writeLine(` ${gradient('Skills')} ${colors.dim}list${RESET}`);\n writeLine();\n\n if (!isApiKeyConfigured()) {\n writeLine(` ${icons.error} ${colors.red}ANTHROPIC_API_KEY not configured${RESET}`);\n writeLine(` ${colors.dim}Set the environment variable to use skills management.${RESET}`);\n writeLine();\n return;\n }\n\n const spinner = ora('Fetching skills...').start();\n\n try {\n const skills = await listSkills();\n\n if (skills.length === 0) {\n spinner.info('No skills uploaded yet');\n writeLine();\n writeLine(` ${colors.dim}Upload a skill:${RESET}`);\n writeLine(` ${colors.cyan}squads skill upload <path>${RESET}`);\n writeLine();\n writeLine(` ${colors.dim}Convert an agent to skill format:${RESET}`);\n writeLine(` ${colors.cyan}squads skill convert <squad>/<agent>${RESET}`);\n writeLine();\n return;\n }\n\n spinner.succeed(`Found ${skills.length} skill(s)`);\n writeLine();\n\n // Display skills table\n writeLine(` ${colors.dim}ID${RESET} ${colors.dim}Title${RESET} ${colors.dim}Updated${RESET}`);\n writeLine(` ${colors.dim}${'─'.repeat(60)}${RESET}`);\n\n for (const skill of skills) {\n const id = skill.id.slice(0, 20).padEnd(22);\n const title = (skill.display_title || 'Untitled').slice(0, 20).padEnd(22);\n const updated = new Date(skill.updated_at).toLocaleDateString();\n writeLine(` ${colors.cyan}${id}${RESET}${title}${colors.dim}${updated}${RESET}`);\n }\n\n writeLine();\n } catch (error) {\n spinner.fail('Failed to list skills');\n writeLine(` ${colors.red}${error instanceof Error ? error.message : String(error)}${RESET}`);\n writeLine();\n }\n}\n\n/**\n * Upload a skill directory\n */\nasync function skillUploadCommand(skillPath: string): Promise<void> {\n writeLine();\n writeLine(` ${gradient('Skills')} ${colors.dim}upload${RESET}`);\n writeLine();\n\n if (!isApiKeyConfigured()) {\n writeLine(` ${icons.error} ${colors.red}ANTHROPIC_API_KEY not configured${RESET}`);\n writeLine(` ${colors.dim}Set the environment variable to use skills management.${RESET}`);\n writeLine();\n return;\n }\n\n // Resolve path\n const fullPath = skillPath.startsWith('/') ? skillPath : join(process.cwd(), skillPath);\n\n if (!existsSync(fullPath)) {\n writeLine(` ${icons.error} ${colors.red}Directory not found: ${skillPath}${RESET}`);\n writeLine();\n return;\n }\n\n // Check for SKILL.md\n const skillMdPath = join(fullPath, 'SKILL.md');\n if (!existsSync(skillMdPath)) {\n writeLine(` ${icons.error} ${colors.red}SKILL.md not found in ${skillPath}${RESET}`);\n writeLine();\n writeLine(` ${colors.dim}Create a SKILL.md file or use:${RESET}`);\n writeLine(` ${colors.cyan}squads skill convert <squad>/<agent>${RESET}`);\n writeLine();\n return;\n }\n\n const spinner = ora('Uploading skill...').start();\n\n try {\n const skill = await uploadSkill(fullPath);\n spinner.succeed(`Skill uploaded: ${skill.display_title}`);\n writeLine();\n writeLine(` ${colors.dim}ID:${RESET} ${colors.cyan}${skill.id}${RESET}`);\n if (skill.description) {\n writeLine(` ${colors.dim}Description:${RESET} ${skill.description}`);\n }\n writeLine();\n writeLine(` ${colors.dim}Use in run command:${RESET}`);\n writeLine(` ${colors.cyan}squads run <squad> --skills ${skill.id}${RESET}`);\n writeLine();\n } catch (error) {\n spinner.fail('Failed to upload skill');\n writeLine(` ${colors.red}${error instanceof Error ? error.message : String(error)}${RESET}`);\n writeLine();\n }\n}\n\n/**\n * Delete a skill\n */\nasync function skillDeleteCommand(skillId: string, options: { force?: boolean }): Promise<void> {\n writeLine();\n writeLine(` ${gradient('Skills')} ${colors.dim}delete${RESET}`);\n writeLine();\n\n if (!isApiKeyConfigured()) {\n writeLine(` ${icons.error} ${colors.red}ANTHROPIC_API_KEY not configured${RESET}`);\n writeLine();\n return;\n }\n\n if (!options.force) {\n writeLine(` ${colors.yellow}Warning: This will permanently delete the skill.${RESET}`);\n writeLine(` ${colors.dim}Use --force to skip this confirmation.${RESET}`);\n writeLine();\n // In a real CLI, we'd prompt for confirmation here\n // For now, require --force\n return;\n }\n\n const spinner = ora('Deleting skill...').start();\n\n try {\n await deleteSkill(skillId);\n spinner.succeed(`Skill deleted: ${skillId}`);\n writeLine();\n } catch (error) {\n spinner.fail('Failed to delete skill');\n writeLine(` ${colors.red}${error instanceof Error ? error.message : String(error)}${RESET}`);\n writeLine();\n }\n}\n\n/**\n * Show skill details\n */\nasync function skillShowCommand(skillId: string): Promise<void> {\n writeLine();\n writeLine(` ${gradient('Skills')} ${colors.dim}show${RESET}`);\n writeLine();\n\n if (!isApiKeyConfigured()) {\n writeLine(` ${icons.error} ${colors.red}ANTHROPIC_API_KEY not configured${RESET}`);\n writeLine();\n return;\n }\n\n const spinner = ora('Fetching skill...').start();\n\n try {\n const skill = await getSkill(skillId);\n\n if (!skill) {\n spinner.fail(`Skill not found: ${skillId}`);\n writeLine();\n return;\n }\n\n spinner.succeed(`Found skill: ${skill.display_title}`);\n writeLine();\n writeLine(` ${colors.dim}ID:${RESET} ${colors.cyan}${skill.id}${RESET}`);\n writeLine(` ${colors.dim}Title:${RESET} ${skill.display_title}`);\n if (skill.description) {\n writeLine(` ${colors.dim}Description:${RESET} ${skill.description}`);\n }\n writeLine(` ${colors.dim}Created:${RESET} ${new Date(skill.created_at).toLocaleString()}`);\n writeLine(` ${colors.dim}Updated:${RESET} ${new Date(skill.updated_at).toLocaleString()}`);\n\n if (skill.files && skill.files.length > 0) {\n writeLine();\n writeLine(` ${colors.dim}Files:${RESET}`);\n for (const file of skill.files) {\n const size = Buffer.byteLength(file.content, 'utf-8');\n writeLine(` ${colors.cyan}${file.name}${RESET} ${colors.dim}(${formatBytes(size)})${RESET}`);\n }\n }\n\n writeLine();\n } catch (error) {\n spinner.fail('Failed to fetch skill');\n writeLine(` ${colors.red}${error instanceof Error ? error.message : String(error)}${RESET}`);\n writeLine();\n }\n}\n\n/**\n * Convert an agent.md file to SKILL.md format\n */\nasync function skillConvertCommand(\n agentPath: string,\n options: { output?: string }\n): Promise<void> {\n writeLine();\n writeLine(` ${gradient('Skills')} ${colors.dim}convert${RESET}`);\n writeLine();\n\n const squadsDir = findSquadsDir();\n if (!squadsDir) {\n writeLine(` ${icons.error} ${colors.red}No .agents/squads directory found${RESET}`);\n writeLine();\n return;\n }\n\n // Parse agent path (squad/agent or just agent)\n let agentFilePath: string;\n let squadName: string;\n let agentName: string;\n\n if (agentPath.includes('/')) {\n const [squad, agent] = agentPath.split('/');\n squadName = squad;\n agentName = agent.replace('.md', '');\n agentFilePath = join(squadsDir, squad, `${agentName}.md`);\n } else {\n // Search for agent in all squads\n agentName = agentPath.replace('.md', '');\n const foundPath = findAgentFile(squadsDir, agentName);\n if (!foundPath) {\n writeLine(` ${icons.error} ${colors.red}Agent not found: ${agentPath}${RESET}`);\n writeLine(` ${colors.dim}Use format: squad/agent (e.g., cli/code-eval)${RESET}`);\n writeLine();\n return;\n }\n agentFilePath = foundPath;\n squadName = basename(dirname(agentFilePath));\n }\n\n if (!existsSync(agentFilePath)) {\n writeLine(` ${icons.error} ${colors.red}Agent file not found: ${agentFilePath}${RESET}`);\n writeLine();\n return;\n }\n\n // Read agent definition\n const agentContent = readFileSync(agentFilePath, 'utf-8');\n\n // Determine output directory\n const skillName = `${squadName}-${agentName}`;\n const outputDir = options.output ||\n join(dirname(squadsDir), 'skills', skillName);\n\n // Create output directory\n if (!existsSync(outputDir)) {\n mkdirSync(outputDir, { recursive: true });\n }\n\n // Convert to SKILL.md format\n const skillMd = convertAgentToSkill(agentContent, squadName, agentName);\n\n // Write SKILL.md\n const skillMdPath = join(outputDir, 'SKILL.md');\n writeFileSync(skillMdPath, skillMd);\n\n writeLine(` ${icons.success} ${colors.green}Converted:${RESET} ${agentPath}`);\n writeLine();\n writeLine(` ${colors.dim}Output:${RESET} ${outputDir}`);\n writeLine(` ${colors.dim}Files:${RESET}`);\n writeLine(` ${colors.cyan}SKILL.md${RESET}`);\n writeLine();\n writeLine(` ${colors.dim}Next steps:${RESET}`);\n writeLine(` 1. Review and edit ${colors.cyan}SKILL.md${RESET}`);\n writeLine(` 2. Add scripts or examples if needed`);\n writeLine(` 3. Upload: ${colors.cyan}squads skill upload ${outputDir}${RESET}`);\n writeLine();\n}\n\n/**\n * Find an agent file by name across all squads\n */\nfunction findAgentFile(squadsDir: string, agentName: string): string | null {\n const { readdirSync } = require('fs');\n const squads = readdirSync(squadsDir, { withFileTypes: true })\n .filter((d: { isDirectory: () => boolean; name: string }) =>\n d.isDirectory() && !d.name.startsWith('_'))\n .map((d: { name: string }) => d.name);\n\n for (const squad of squads) {\n const agentPath = join(squadsDir, squad, `${agentName}.md`);\n if (existsSync(agentPath)) {\n return agentPath;\n }\n }\n\n return null;\n}\n\n/**\n * Convert agent.md content to SKILL.md format\n */\nfunction convertAgentToSkill(\n agentContent: string,\n squadName: string,\n agentName: string\n): string {\n // Extract existing frontmatter if present\n const existingMeta: Record<string, string> = {};\n let bodyContent = agentContent;\n\n const frontmatterMatch = agentContent.match(/^---\\n([\\s\\S]*?)\\n---\\n?([\\s\\S]*)/);\n if (frontmatterMatch) {\n const frontmatter = frontmatterMatch[1];\n bodyContent = frontmatterMatch[2];\n\n // Parse simple YAML key: value pairs\n for (const line of frontmatter.split('\\n')) {\n const match = line.match(/^(\\w+):\\s*(.+)$/);\n if (match) {\n existingMeta[match[1]] = match[2].trim();\n }\n }\n }\n\n // Extract title from first heading if not in frontmatter\n const title = existingMeta.name ||\n bodyContent.match(/^#\\s+(?:Agent:\\s*)?(.+)$/m)?.[1] ||\n `${squadName}-${agentName}`;\n\n // Extract role/description from agent content\n const roleMatch = bodyContent.match(/^(?:role|description):\\s*(.+)$/mi) ||\n bodyContent.match(/^##?\\s*(?:Role|Purpose|Description)\\s*\\n+(.+)/mi);\n const description = existingMeta.description ||\n roleMatch?.[1] ||\n `Agent from ${squadName} squad. Use when working on ${agentName}-related tasks.`;\n\n // Build SKILL.md\n const skillMd = `---\nname: ${squadName}-${agentName}\ndescription: ${description}\n---\n\n# ${title}\n\n${bodyContent.trim()}\n`;\n\n return skillMd;\n}\n\n/**\n * Format bytes to human readable string\n */\nfunction formatBytes(bytes: number): string {\n if (bytes < 1024) return `${bytes}B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)}KB`;\n return `${(bytes / 1024 / 1024).toFixed(2)}MB`;\n}\n","/**\n * Anthropic SDK wrapper for Skills API\n *\n * Handles direct API calls for skills management:\n * - List uploaded skills\n * - Upload new skills\n * - Delete skills\n * - Get skill details\n */\n\nimport Anthropic from '@anthropic-ai/sdk';\nimport { readFileSync, readdirSync } from 'fs';\nimport { join } from 'path';\n\n// Beta headers required for Skills API (reserved for API implementation)\nconst _SKILLS_BETA = 'skills-2025-10-02';\nconst _CODE_EXECUTION_BETA = 'code-execution-2025-08-25';\n\nexport interface Skill {\n id: string;\n display_title: string;\n description?: string;\n created_at: string;\n updated_at: string;\n files?: SkillFile[];\n}\n\nexport interface SkillFile {\n name: string;\n content: string;\n}\n\nlet client: Anthropic | null = null;\n\n/**\n * Get or create Anthropic client instance\n */\nfunction getClient(): Anthropic {\n if (!client) {\n const apiKey = process.env.ANTHROPIC_API_KEY;\n if (!apiKey) {\n throw new Error('ANTHROPIC_API_KEY environment variable is required for skills management');\n }\n client = new Anthropic({ apiKey });\n }\n return client;\n}\n\n/**\n * List all uploaded skills\n */\nexport async function listSkills(): Promise<Skill[]> {\n // Validate API key is available\n getClient();\n\n try {\n // Note: The actual Skills API may have a different endpoint\n // This is a placeholder until we have the exact API spec\n // Real implementation will use: anthropic.beta.skills.list({ betas: [SKILLS_BETA] })\n console.warn('Skills API: Using placeholder implementation. Actual API may differ.');\n return [];\n } catch (error) {\n if (error instanceof Error && error.message.includes('404')) {\n // Skills not supported yet or endpoint not found\n return [];\n }\n throw error;\n }\n}\n\n/**\n * Load skill files from a directory\n * Expects: SKILL.md and optionally scripts/, examples/, etc.\n */\nexport function loadSkillFiles(skillPath: string): SkillFile[] {\n const files: SkillFile[] = [];\n\n function walkDir(dir: string, prefix = ''): void {\n const entries = readdirSync(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n const fullPath = join(dir, entry.name);\n const relativePath = prefix ? `${prefix}/${entry.name}` : entry.name;\n\n if (entry.isDirectory()) {\n // Recursively walk subdirectories\n walkDir(fullPath, relativePath);\n } else if (entry.isFile()) {\n // Read file content\n const content = readFileSync(fullPath, 'utf-8');\n files.push({\n name: relativePath,\n content\n });\n }\n }\n }\n\n walkDir(skillPath);\n return files;\n}\n\n/**\n * Extract skill title from SKILL.md frontmatter or first heading\n */\nexport function extractSkillTitle(files: SkillFile[]): string {\n const skillMd = files.find(f => f.name === 'SKILL.md' || f.name.endsWith('/SKILL.md'));\n if (!skillMd) {\n throw new Error('SKILL.md not found in skill directory');\n }\n\n const content = skillMd.content;\n\n // Try YAML frontmatter first\n const frontmatterMatch = content.match(/^---\\n([\\s\\S]*?)\\n---/);\n if (frontmatterMatch) {\n const nameMatch = frontmatterMatch[1].match(/^name:\\s*(.+)$/m);\n if (nameMatch) {\n return nameMatch[1].trim();\n }\n }\n\n // Fall back to first markdown heading\n const headingMatch = content.match(/^#\\s+(.+)$/m);\n if (headingMatch) {\n return headingMatch[1].trim();\n }\n\n throw new Error('Could not extract skill title from SKILL.md');\n}\n\n/**\n * Extract skill description from SKILL.md\n */\nexport function extractSkillDescription(files: SkillFile[]): string | undefined {\n const skillMd = files.find(f => f.name === 'SKILL.md' || f.name.endsWith('/SKILL.md'));\n if (!skillMd) return undefined;\n\n const content = skillMd.content;\n\n // Try YAML frontmatter first\n const frontmatterMatch = content.match(/^---\\n([\\s\\S]*?)\\n---/);\n if (frontmatterMatch) {\n const descMatch = frontmatterMatch[1].match(/^description:\\s*(.+)$/m);\n if (descMatch) {\n return descMatch[1].trim();\n }\n }\n\n // Fall back to first paragraph after heading\n const paragraphMatch = content.match(/^#.+\\n+(.+)/m);\n if (paragraphMatch) {\n return paragraphMatch[1].trim();\n }\n\n return undefined;\n}\n\n/**\n * Upload a skill to Anthropic\n */\nexport async function uploadSkill(skillPath: string): Promise<Skill> {\n // Validate API key is available\n getClient();\n const files = loadSkillFiles(skillPath);\n\n if (files.length === 0) {\n throw new Error(`No files found in skill directory: ${skillPath}`);\n }\n\n // Check total size (8MB limit)\n const totalSize = files.reduce((sum, f) => sum + Buffer.byteLength(f.content, 'utf-8'), 0);\n const maxSize = 8 * 1024 * 1024; // 8MB\n if (totalSize > maxSize) {\n throw new Error(`Skill size ${(totalSize / 1024 / 1024).toFixed(2)}MB exceeds 8MB limit`);\n }\n\n const displayTitle = extractSkillTitle(files);\n const description = extractSkillDescription(files);\n\n try {\n // Note: This is a placeholder for the actual Skills API endpoint\n // The real implementation will use the correct beta endpoint\n console.log(`Uploading skill: ${displayTitle}`);\n console.log(`Files: ${files.map(f => f.name).join(', ')}`);\n console.log(`Total size: ${(totalSize / 1024).toFixed(2)}KB`);\n\n // Placeholder response until we have actual API spec\n const skill: Skill = {\n id: `skill_${Date.now()}`,\n display_title: displayTitle,\n description,\n created_at: new Date().toISOString(),\n updated_at: new Date().toISOString(),\n files\n };\n\n console.warn('Skills API: Using placeholder implementation. Skill not actually uploaded.');\n return skill;\n } catch (error) {\n throw new Error(`Failed to upload skill: ${error instanceof Error ? error.message : String(error)}`);\n }\n}\n\n/**\n * Delete a skill by ID\n */\nexport async function deleteSkill(skillId: string): Promise<void> {\n // Validate API key is available\n getClient();\n\n try {\n // Placeholder until we have actual API spec\n console.log(`Deleting skill: ${skillId}`);\n console.warn('Skills API: Using placeholder implementation. Skill not actually deleted.');\n } catch (error) {\n throw new Error(`Failed to delete skill: ${error instanceof Error ? error.message : String(error)}`);\n }\n}\n\n/**\n * Get skill details by ID\n */\nexport async function getSkill(skillId: string): Promise<Skill | null> {\n // Validate API key is available\n getClient();\n\n try {\n // Placeholder until we have actual API spec\n console.log(`Getting skill: ${skillId}`);\n console.warn('Skills API: Using placeholder implementation.');\n return null;\n } catch (error) {\n if (error instanceof Error && error.message.includes('404')) {\n return null;\n }\n throw error;\n }\n}\n\n/**\n * Check if API key is configured\n */\nexport function isApiKeyConfigured(): boolean {\n return !!process.env.ANTHROPIC_API_KEY;\n}\n","/**\n * Permission management commands\n *\n * Phase 3 of the Squads as Execution Contexts RFC (#110)\n *\n * Commands:\n * - squads permissions show <squad> Show permission context for a squad\n * - squads permissions check <squad> Validate permissions before execution\n */\n\nimport { Command } from 'commander';\nimport { readFileSync } from 'fs';\nimport { join } from 'path';\nimport {\n buildContextFromSquad,\n validateExecution,\n formatViolations,\n getDefaultContext,\n ExecutionRequest\n} from '../lib/permissions.js';\nimport { findSquadsDir, loadSquad } from '../lib/squad-parser.js';\nimport {\n colors,\n bold,\n RESET,\n gradient,\n icons,\n writeLine\n} from '../lib/terminal.js';\n\n/**\n * Register permissions command with the CLI program\n */\nexport function registerPermissionsCommand(program: Command): void {\n const permissions = program\n .command('permissions')\n .alias('perms')\n .description('Manage and validate squad permissions');\n\n // Show permission context\n permissions\n .command('show <squad>')\n .description('Show permission context for a squad')\n .action(permissionsShowCommand);\n\n // Check permissions\n permissions\n .command('check <squad>')\n .description('Validate permissions before execution')\n .option('-a, --agent <agent>', 'Specify agent for context')\n .option('--mcp <servers...>', 'MCP servers to validate')\n .option('--bash <commands...>', 'Bash commands to validate')\n .option('--write <paths...>', 'Write paths to validate')\n .option('--read <paths...>', 'Read paths to validate')\n .action(permissionsCheckCommand);\n}\n\n/**\n * Show permission context for a squad\n */\nasync function permissionsShowCommand(squadName: string): Promise<void> {\n writeLine();\n writeLine(` ${gradient('Permissions')} ${colors.dim}show${RESET} ${colors.cyan}${squadName}${RESET}`);\n writeLine();\n\n const squadsDir = findSquadsDir();\n if (!squadsDir) {\n writeLine(` ${icons.error} ${colors.red}No .agents/squads directory found${RESET}`);\n writeLine();\n return;\n }\n\n const squad = loadSquad(squadName);\n if (!squad) {\n writeLine(` ${icons.error} ${colors.red}Squad \"${squadName}\" not found${RESET}`);\n writeLine();\n return;\n }\n\n // Load permissions from SQUAD.md\n const squadFilePath = join(squadsDir, squadName, 'SQUAD.md');\n const squadContent = readFileSync(squadFilePath, 'utf-8');\n const context = buildContextFromSquad(squadName, squadContent);\n\n // Check if using defaults\n const defaults = getDefaultContext(squadName);\n const isDefault = JSON.stringify(context.permissions) === JSON.stringify(defaults.permissions);\n\n writeLine(` ${bold}Squad:${RESET} ${squadName}`);\n if (squad.mission) {\n writeLine(` ${colors.dim}${squad.mission}${RESET}`);\n }\n writeLine();\n\n if (isDefault) {\n writeLine(` ${icons.warning} ${colors.yellow}Using default (permissive) permissions${RESET}`);\n writeLine(` ${colors.dim}Add a permissions block to SQUAD.md to restrict access.${RESET}`);\n writeLine();\n }\n\n // Mode\n writeLine(` ${bold}Mode:${RESET} ${formatMode(context.permissions.mode)}`);\n writeLine();\n\n // Bash commands\n writeLine(` ${bold}Bash Commands:${RESET}`);\n if (context.permissions.bash.includes('*')) {\n writeLine(` ${colors.dim}All commands allowed (*)${RESET}`);\n } else {\n for (const cmd of context.permissions.bash) {\n writeLine(` ${icons.active} ${cmd}`);\n }\n }\n writeLine();\n\n // File access\n writeLine(` ${bold}Write Paths:${RESET}`);\n if (context.permissions.write.includes('**') || context.permissions.write.includes('*')) {\n writeLine(` ${colors.dim}All paths writable (**)${RESET}`);\n } else {\n for (const path of context.permissions.write) {\n writeLine(` ${icons.active} ${path}`);\n }\n }\n writeLine();\n\n writeLine(` ${bold}Read Paths:${RESET}`);\n if (context.permissions.read.includes('**') || context.permissions.read.includes('*')) {\n writeLine(` ${colors.dim}All paths readable (**)${RESET}`);\n } else {\n for (const path of context.permissions.read) {\n writeLine(` ${icons.active} ${path}`);\n }\n }\n writeLine();\n\n // MCP servers\n writeLine(` ${bold}MCP Servers:${RESET}`);\n if (context.permissions.mcp.allow.includes('*')) {\n writeLine(` ${colors.dim}All servers allowed (*)${RESET}`);\n } else {\n writeLine(` ${colors.green}Allow:${RESET}`);\n for (const server of context.permissions.mcp.allow) {\n writeLine(` ${icons.success} ${server}`);\n }\n }\n if (context.permissions.mcp.deny.length > 0) {\n writeLine(` ${colors.red}Deny:${RESET}`);\n for (const server of context.permissions.mcp.deny) {\n writeLine(` ${icons.error} ${server}`);\n }\n }\n writeLine();\n\n // Help for adding permissions\n if (isDefault) {\n writeLine(` ${bold}Add permissions to SQUAD.md:${RESET}`);\n writeLine();\n writeLine(` ${colors.dim}\\`\\`\\`yaml${RESET}`);\n writeLine(` ${colors.dim}permissions:${RESET}`);\n writeLine(` ${colors.dim} mode: warn # or strict, audit${RESET}`);\n writeLine(` ${colors.dim} bash: [npm, git, gh]${RESET}`);\n writeLine(` ${colors.dim} write: [agents-squads-web/**]${RESET}`);\n writeLine(` ${colors.dim} read: [hq/.agents/**]${RESET}`);\n writeLine(` ${colors.dim} mcp:${RESET}`);\n writeLine(` ${colors.dim} allow: [chrome-devtools]${RESET}`);\n writeLine(` ${colors.dim} deny: [supabase]${RESET}`);\n writeLine(` ${colors.dim}\\`\\`\\`${RESET}`);\n writeLine();\n }\n}\n\n/**\n * Check permissions before execution\n */\nasync function permissionsCheckCommand(\n squadName: string,\n options: {\n agent?: string;\n mcp?: string[];\n bash?: string[];\n write?: string[];\n read?: string[];\n }\n): Promise<void> {\n writeLine();\n writeLine(` ${gradient('Permissions')} ${colors.dim}check${RESET} ${colors.cyan}${squadName}${RESET}`);\n if (options.agent) {\n writeLine(` ${colors.dim}Agent: ${options.agent}${RESET}`);\n }\n writeLine();\n\n const squadsDir = findSquadsDir();\n if (!squadsDir) {\n writeLine(` ${icons.error} ${colors.red}No .agents/squads directory found${RESET}`);\n writeLine();\n return;\n }\n\n const squad = loadSquad(squadName);\n if (!squad) {\n writeLine(` ${icons.error} ${colors.red}Squad \"${squadName}\" not found${RESET}`);\n writeLine();\n return;\n }\n\n // Load permissions from SQUAD.md\n const squadFilePath = join(squadsDir, squadName, 'SQUAD.md');\n const squadContent = readFileSync(squadFilePath, 'utf-8');\n const context = buildContextFromSquad(squadName, squadContent, options.agent);\n\n // Build execution request from CLI options\n const request: ExecutionRequest = {\n mcpServers: options.mcp,\n bashCommands: options.bash,\n writePaths: options.write,\n readPaths: options.read\n };\n\n // Check if request is empty\n if (!options.mcp && !options.bash && !options.write && !options.read) {\n writeLine(` ${colors.yellow}No resources specified to check.${RESET}`);\n writeLine();\n writeLine(` ${colors.dim}Examples:${RESET}`);\n writeLine(` ${colors.cyan}squads perms check ${squadName} --mcp chrome-devtools firecrawl${RESET}`);\n writeLine(` ${colors.cyan}squads perms check ${squadName} --bash npm git docker${RESET}`);\n writeLine(` ${colors.cyan}squads perms check ${squadName} --write src/** --read config/**${RESET}`);\n writeLine();\n return;\n }\n\n // Validate\n const result = validateExecution(context, request);\n\n if (result.violations.length === 0) {\n writeLine(` ${icons.success} ${colors.green}All permissions valid${RESET}`);\n writeLine();\n\n // Show what was checked\n if (options.mcp) {\n writeLine(` ${colors.dim}MCP:${RESET} ${options.mcp.join(', ')}`);\n }\n if (options.bash) {\n writeLine(` ${colors.dim}Bash:${RESET} ${options.bash.join(', ')}`);\n }\n if (options.write) {\n writeLine(` ${colors.dim}Write:${RESET} ${options.write.join(', ')}`);\n }\n if (options.read) {\n writeLine(` ${colors.dim}Read:${RESET} ${options.read.join(', ')}`);\n }\n writeLine();\n } else {\n const violationLines = formatViolations(result);\n for (const line of violationLines) {\n writeLine(` ${line}`);\n }\n writeLine();\n\n // Exit with error code if strict mode blocks\n if (!result.allowed) {\n process.exit(1);\n }\n }\n}\n\n/**\n * Format enforcement mode for display\n */\nfunction formatMode(mode: string): string {\n switch (mode) {\n case 'strict':\n return `${colors.red}strict${RESET} ${colors.dim}(blocks on violation)${RESET}`;\n case 'warn':\n return `${colors.yellow}warn${RESET} ${colors.dim}(logs and continues)${RESET}`;\n case 'audit':\n return `${colors.cyan}audit${RESET} ${colors.dim}(logs to trail)${RESET}`;\n default:\n return mode;\n }\n}\n","import {\n findSquadsDir,\n loadSquad,\n listSquads,\n SquadContext,\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 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 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 }, 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 Servers\n 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\n 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","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 * 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 * 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","import ora from 'ora';\nimport fs from 'fs/promises';\nimport path, { dirname } from 'path';\nimport { execSync, spawn } from 'child_process';\nimport { findSquadsDir } from '../lib/squad-parser.js';\nimport { colors, RESET, bold, writeLine } from '../lib/terminal.js';\nimport { track, Events } from '../lib/telemetry.js';\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\nexport interface TonightOptions {\n costCap?: number; // Max USD to spend (default: 50)\n stopAt?: string; // Stop time, e.g., \"07:00\" (default: 7am)\n maxRetries?: number; // Restart crashed agents N times (default: 3)\n dryRun?: boolean; // Show what would run\n verbose?: boolean;\n notify?: string; // Notification method: \"slack\" | \"email\" | \"none\"\n}\n\ninterface TonightSession {\n id: string;\n target: string; // squad or squad/agent\n tmuxSession: string;\n startedAt: Date;\n status: 'running' | 'completed' | 'failed' | 'stopped';\n restarts: number;\n tokensUsed?: number;\n costUsd?: number;\n}\n\ninterface TonightState {\n startedAt: string;\n stopAt: string;\n costCap: number;\n maxRetries: number;\n sessions: TonightSession[];\n totalCost: number;\n stopped: boolean;\n stoppedReason?: string;\n}\n\nconst TONIGHT_STATE_FILE = '.agents/tonight-state.json';\nconst TONIGHT_LOG_DIR = '.agents/outputs/tonight';\n\n// Get current cost from bridge/langfuse\nasync function getCurrentCost(): Promise<number> {\n try {\n const response = await fetch('http://localhost:8088/api/stats/today');\n if (response.ok) {\n const data = await response.json() as { cost_usd?: number };\n return data.cost_usd || 0;\n }\n } catch {\n // Bridge not available\n }\n return 0;\n}\n\n// Check if we should stop (reserved for future use)\nfunction _shouldStop(state: TonightState): { stop: boolean; reason?: string } {\n // Cost cap reached\n if (state.totalCost >= state.costCap) {\n return { stop: true, reason: `Cost cap reached: $${state.totalCost.toFixed(2)} >= $${state.costCap}` };\n }\n\n // Time limit reached\n const now = new Date();\n const [stopHour, stopMin] = state.stopAt.split(':').map(Number);\n const stopTime = new Date();\n stopTime.setHours(stopHour, stopMin, 0, 0);\n\n // If stop time is before now, it means tomorrow\n if (stopTime <= new Date(state.startedAt)) {\n stopTime.setDate(stopTime.getDate() + 1);\n }\n\n if (now >= stopTime) {\n return { stop: true, reason: `Stop time reached: ${state.stopAt}` };\n }\n\n return { stop: false };\n}\n\n// Kill all tonight sessions\nfunction killAllSessions(): number {\n try {\n const sessions = execSync('tmux ls 2>/dev/null | grep \"squads-tonight-\" | cut -d: -f1', { encoding: 'utf-8' })\n .trim()\n .split('\\n')\n .filter(Boolean);\n\n for (const session of sessions) {\n try {\n execSync(`tmux kill-session -t \"${session}\"`, { stdio: 'ignore' });\n } catch {\n // Session may already be dead\n }\n }\n return sessions.length;\n } catch {\n return 0;\n }\n}\n\n// Get running session count\nfunction getRunningSessionCount(): number {\n try {\n const output = execSync('tmux ls 2>/dev/null | grep \"squads-tonight-\" | wc -l', { encoding: 'utf-8' });\n return parseInt(output.trim()) || 0;\n } catch {\n return 0;\n }\n}\n\n// Launch a single agent in tmux\nfunction launchAgent(\n target: string,\n projectRoot: string,\n sessionId: string,\n logFile: string\n): string {\n const sessionName = `squads-tonight-${sessionId}`;\n\n // Build the command with logging\n const claudeCmd = [\n `cd '${projectRoot}'`,\n `echo \"=== Tonight Session: ${target} ===\" >> '${logFile}'`,\n `echo \"Started: $(date)\" >> '${logFile}'`,\n `claude --dangerously-skip-permissions -p 'You are running as part of an overnight autonomous session. Execute your tasks efficiently. If you encounter errors, document them clearly and move on. Do not ask for user input.' -- \"Run squad: ${target}\" 2>&1 | tee -a '${logFile}'`,\n `echo \"Ended: $(date)\" >> '${logFile}'`,\n ].join(' && ');\n\n 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 }).unref();\n\n return sessionName;\n}\n\n// Generate morning report\nasync function generateReport(state: TonightState, projectRoot: string): Promise<string> {\n const duration = Math.round((Date.now() - new Date(state.startedAt).getTime()) / 1000 / 60);\n const completed = state.sessions.filter(s => s.status === 'completed').length;\n const failed = state.sessions.filter(s => s.status === 'failed').length;\n\n const report = `# Tonight Report - ${new Date().toLocaleDateString()}\n\n## Summary\n- **Duration**: ${duration} minutes\n- **Total Cost**: $${state.totalCost.toFixed(2)} / $${state.costCap} cap\n- **Sessions**: ${completed} completed, ${failed} failed, ${state.sessions.length} total\n- **Stopped**: ${state.stoppedReason || 'All tasks completed'}\n\n## Sessions\n\n| Target | Status | Restarts | Duration |\n|--------|--------|----------|----------|\n${state.sessions.map(s => {\n const dur = s.startedAt ? Math.round((Date.now() - new Date(s.startedAt).getTime()) / 1000 / 60) : 0;\n return `| ${s.target} | ${s.status} | ${s.restarts} | ${dur}min |`;\n}).join('\\n')}\n\n## Logs\nSee \\`.agents/outputs/tonight/\\` for detailed logs.\n\n---\n*Generated by squads tonight*\n`;\n\n const reportPath = path.join(projectRoot, TONIGHT_LOG_DIR, `report-${Date.now()}.md`);\n await fs.writeFile(reportPath, report);\n\n return reportPath;\n}\n\n// Main tonight command\nexport async function tonightCommand(\n targets: string[],\n options: TonightOptions\n): Promise<void> {\n const costCap = options.costCap ?? 50;\n const stopAt = options.stopAt ?? '07:00';\n const maxRetries = options.maxRetries ?? 3;\n const dryRun = options.dryRun ?? false;\n const verbose = options.verbose ?? false;\n\n writeLine();\n writeLine(` ${bold}squads tonight${RESET}`);\n writeLine();\n\n // Find project root\n const projectRoot = getProjectRoot();\n\n // Validate targets\n if (targets.length === 0) {\n writeLine(` ${colors.red}✖${RESET} No targets specified`);\n writeLine();\n writeLine(` ${colors.dim}Usage: squads tonight <squad> [squad/agent...]${RESET}`);\n writeLine(` ${colors.dim}Example: squads tonight intelligence customer/outreach${RESET}`);\n writeLine();\n return;\n }\n\n // Show config\n writeLine(` ${colors.dim}Config:${RESET}`);\n writeLine(` Cost cap: ${colors.cyan}$${costCap}${RESET}`);\n writeLine(` Stop at: ${colors.cyan}${stopAt}${RESET}`);\n writeLine(` Max retries: ${colors.cyan}${maxRetries}${RESET}`);\n writeLine(` Targets: ${colors.cyan}${targets.join(', ')}${RESET}`);\n writeLine();\n\n if (dryRun) {\n writeLine(` ${colors.yellow}DRY RUN${RESET} - would launch:`);\n for (const target of targets) {\n writeLine(` • ${target}`);\n }\n writeLine();\n return;\n }\n\n // Create log directory\n const logDir = path.join(projectRoot, TONIGHT_LOG_DIR);\n await fs.mkdir(logDir, { recursive: true });\n\n // Initialize state\n const state: TonightState = {\n startedAt: new Date().toISOString(),\n stopAt,\n costCap,\n maxRetries,\n sessions: [],\n totalCost: await getCurrentCost(),\n stopped: false,\n };\n\n // Launch agents\n const spinner = ora('Launching agents...').start();\n\n for (const target of targets) {\n const sessionId = `${target.replace('/', '-')}-${Date.now()}`;\n const logFile = path.join(logDir, `${sessionId}.log`);\n\n const tmuxSession = launchAgent(target, projectRoot, sessionId, logFile);\n\n state.sessions.push({\n id: sessionId,\n target,\n tmuxSession,\n startedAt: new Date(),\n status: 'running',\n restarts: 0,\n });\n }\n\n spinner.succeed(`Launched ${targets.length} agent(s)`);\n\n // Save initial state\n await fs.writeFile(\n path.join(projectRoot, TONIGHT_STATE_FILE),\n JSON.stringify(state, null, 2)\n );\n\n // Track\n await track(Events.CLI_TONIGHT, {\n targets: targets.length,\n costCap,\n stopAt,\n });\n\n writeLine();\n writeLine(` ${colors.green}✓${RESET} Tonight mode active`);\n writeLine();\n writeLine(` ${colors.dim}Monitor:${RESET}`);\n writeLine(` ${colors.cyan}squads tonight status${RESET} - Check progress`);\n writeLine(` ${colors.cyan}squads tonight stop${RESET} - Kill all agents`);\n writeLine(` ${colors.cyan}tmux ls | grep tonight${RESET} - List sessions`);\n writeLine();\n writeLine(` ${colors.dim}Logs: ${logDir}${RESET}`);\n writeLine();\n\n // Start watcher in background\n const watcherCmd = `\n while true; do\n sleep 60\n # Check cost\n COST=$(curl -s http://localhost:8088/api/stats/today 2>/dev/null | jq -r '.cost_usd // 0')\n if [ \"$(echo \"$COST >= ${costCap}\" | bc)\" -eq 1 ]; then\n echo \"Cost cap reached: $COST\" >> '${logDir}/watcher.log'\n tmux ls 2>/dev/null | grep squads-tonight | cut -d: -f1 | xargs -I{} tmux kill-session -t {}\n break\n fi\n # Check time\n HOUR=$(date +%H)\n MIN=$(date +%M)\n STOP_HOUR=${stopAt.split(':')[0]}\n STOP_MIN=${stopAt.split(':')[1]}\n if [ \"$HOUR\" -ge \"$STOP_HOUR\" ] && [ \"$MIN\" -ge \"$STOP_MIN\" ]; then\n echo \"Stop time reached\" >> '${logDir}/watcher.log'\n tmux ls 2>/dev/null | grep squads-tonight | cut -d: -f1 | xargs -I{} tmux kill-session -t {}\n break\n fi\n # Check if any sessions still running\n COUNT=$(tmux ls 2>/dev/null | grep squads-tonight | wc -l)\n if [ \"$COUNT\" -eq 0 ]; then\n echo \"All sessions completed\" >> '${logDir}/watcher.log'\n break\n fi\n done\n `;\n\n spawn('tmux', [\n 'new-session',\n '-d',\n '-s', 'squads-tonight-watcher',\n '/bin/sh', '-c', watcherCmd\n ], {\n stdio: 'ignore',\n detached: true,\n }).unref();\n\n if (verbose) {\n writeLine(` ${colors.dim}Watcher session started${RESET}`);\n }\n}\n\n// Status subcommand\nexport async function tonightStatusCommand(): Promise<void> {\n writeLine();\n writeLine(` ${bold}Tonight Status${RESET}`);\n writeLine();\n\n const projectRoot = getProjectRoot();\n const statePath = path.join(projectRoot, TONIGHT_STATE_FILE);\n\n // Check for state file\n let state: TonightState | null = null;\n try {\n const content = await fs.readFile(statePath, 'utf-8');\n state = JSON.parse(content);\n } catch {\n // No state file\n }\n\n // Count running sessions\n const running = getRunningSessionCount();\n const cost = await getCurrentCost();\n\n if (running === 0 && !state) {\n writeLine(` ${colors.dim}No tonight session active${RESET}`);\n writeLine();\n writeLine(` ${colors.dim}Start with: squads tonight <squad> [squad...]${RESET}`);\n writeLine();\n return;\n }\n\n // Show status\n writeLine(` ${colors.cyan}${running}${RESET} agents running`);\n\n if (state) {\n const duration = Math.round((Date.now() - new Date(state.startedAt).getTime()) / 1000 / 60);\n writeLine(` ${colors.dim}Duration:${RESET} ${duration} minutes`);\n writeLine(` ${colors.dim}Cost:${RESET} $${cost.toFixed(2)} / $${state.costCap} cap`);\n writeLine(` ${colors.dim}Stop at:${RESET} ${state.stopAt}`);\n }\n\n writeLine();\n\n // List sessions\n try {\n const sessions = execSync('tmux ls 2>/dev/null | grep squads-tonight', { encoding: 'utf-8' })\n .trim()\n .split('\\n')\n .filter(Boolean);\n\n if (sessions.length > 0) {\n writeLine(` ${colors.dim}Sessions:${RESET}`);\n for (const session of sessions) {\n const name = session.split(':')[0];\n writeLine(` • ${name}`);\n }\n writeLine();\n writeLine(` ${colors.dim}Attach: tmux attach -t <session>${RESET}`);\n }\n } catch {\n // No sessions\n }\n\n writeLine();\n}\n\n// Stop subcommand\nexport async function tonightStopCommand(): Promise<void> {\n writeLine();\n writeLine(` ${bold}Stopping Tonight Mode${RESET}`);\n writeLine();\n\n const killed = killAllSessions();\n\n if (killed > 0) {\n writeLine(` ${colors.green}✓${RESET} Killed ${killed} session(s)`);\n } else {\n writeLine(` ${colors.dim}No sessions to kill${RESET}`);\n }\n\n // Generate report\n const projectRoot = getProjectRoot();\n const statePath = path.join(projectRoot, TONIGHT_STATE_FILE);\n\n try {\n const content = await fs.readFile(statePath, 'utf-8');\n const state: TonightState = JSON.parse(content);\n state.stopped = true;\n state.stoppedReason = 'Manual stop';\n state.totalCost = await getCurrentCost();\n\n const reportPath = await generateReport(state, projectRoot);\n writeLine(` ${colors.green}✓${RESET} Report: ${reportPath}`);\n\n // Clean up state\n await fs.unlink(statePath).catch(() => {});\n } catch {\n // No state to report on\n }\n\n writeLine();\n}\n\n// Report subcommand\nexport async function tonightReportCommand(): Promise<void> {\n writeLine();\n writeLine(` ${bold}Tonight Report${RESET}`);\n writeLine();\n\n const projectRoot = getProjectRoot();\n const logDir = path.join(projectRoot, TONIGHT_LOG_DIR);\n\n try {\n const files = await fs.readdir(logDir);\n const reports = files.filter(f => f.startsWith('report-')).sort().reverse();\n\n if (reports.length === 0) {\n writeLine(` ${colors.dim}No reports found${RESET}`);\n writeLine();\n return;\n }\n\n // Show latest report\n const latest = reports[0];\n const content = await fs.readFile(path.join(logDir, latest), 'utf-8');\n\n writeLine(content);\n } catch {\n writeLine(` ${colors.dim}No reports found${RESET}`);\n }\n\n writeLine();\n}\n"],"mappings":"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","names":["existsSync","join","homedir","chalk","require","__filename","__dirname","pkg","spawn","version","spawn","execSync","execSync","existsSync","join","join","existsSync","execSync","existsSync","readFileSync","writeFileSync","mkdirSync","join","homedir","config","config","existsSync","readFileSync","writeFileSync","execSync","ora","spawn","join","dirname","existsSync","readFileSync","writeFileSync","mkdirSync","readFileSync","existsSync","writeFileSync","join","progress","goal","path","context","join","existsSync","config","readFileSync","writeFileSync","dirname","mkdirSync","prompt","ora","spawn","existsSync","join","join","existsSync","existsSync","readFileSync","writeFileSync","mkdirSync","join","dirname","homedir","execSync","spawn","createInterface","fileURLToPath","__filename","fileURLToPath","__dirname","dirname","CONFIG_PATH","join","homedir","createInterface","confirm","existsSync","readFileSync","config","writeFileSync","execSync","envPaths","mkdirSync","spawn","sessions","execSync","existsSync","readFileSync","writeFileSync","mkdirSync","readdirSync","join","join","existsSync","readFileSync","writeFileSync","execSync","mkdirSync","readdirSync","goal","progress","readFileSync","writeFileSync","existsSync","mkdirSync","readdirSync","join","dirname","join","existsSync","readFileSync","feedback","dirname","mkdirSync","writeFileSync","readdirSync","readdirSync","existsSync","statSync","join","config","calcCost","createRequire","require","pool","client","join","existsSync","readdirSync","statSync","activeSquads","goal","join","existsSync","goal","execSync","execSync","execSync","spawn","ora","DEFAULT_ORG","DEFAULT_REPOS","execSync","ora","prompt","spawn","execSync","spawn","readdirSync","join","ora","readdirSync","join","ora","execSync","prompt","executeClaudePrompt","spawn","chalk","ora","existsSync","readFileSync","writeFileSync","mkdirSync","join","homedir","session","chalk","ora","session","createInterface","confirm","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","exec","FETCH_TIMEOUT_MS","SERVICES","fetchWithTimeout","checkService","execSync","existsSync","readFileSync","join","getTasksFilePath","join","existsSync","readFileSync","execSync","getElapsedTime","existsSync","statSync","readdirSync","readFileSync","join","BRIDGE_URL","join","existsSync","readFileSync","sessions","readdirSync","statSync","goal","spawn","runCommand","spawn","execSync","getRecentActivity","path","execSync","RESET","sleep","session","chalk","existsSync","path","execSync","program","ora","existsSync","mkdirSync","writeFileSync","readFileSync","join","basename","dirname","readFileSync","readdirSync","join","readdirSync","join","readFileSync","program","ora","join","existsSync","basename","dirname","readFileSync","mkdirSync","writeFileSync","readdirSync","readFileSync","join","program","join","readFileSync","context","path","readFileSync","existsSync","readdirSync","join","existsSync","readFileSync","readdirSync","join","formatDuration","mins","exec","formatDuration","ora","fs","path","dirname","execSync","spawn","getProjectRoot","dirname","sessions","execSync","session","spawn","path","fs","getProjectRoot","ora","chalk","join","homedir","existsSync","exec","readFileSync"]}
|
|
1
|
+
{"version":3,"sources":["../src/cli.ts","../src/version.ts","../src/commands/init.ts","../src/lib/git.ts","../src/lib/telemetry.ts","../src/commands/run.ts","../src/lib/squad-parser.ts","../src/lib/permissions.ts","../src/commands/list.ts","../src/commands/status.ts","../src/commands/stack.ts","../src/commands/memory.ts","../src/commands/sync.ts","../src/commands/goal.ts","../src/commands/feedback.ts","../src/commands/dashboard.ts","../src/lib/providers.ts","../src/lib/costs.ts","../src/lib/db.ts","../src/commands/issues.ts","../src/commands/solve-issues.ts","../src/commands/open-issues.ts","../src/commands/login.ts","../src/lib/auth.ts","../src/commands/update.ts","../src/commands/progress.ts","../src/commands/results.ts","../src/commands/history.ts","../src/commands/health.ts","../src/commands/workers.ts","../src/commands/context-feed.ts","../src/commands/watch.ts","../src/commands/live.ts","../src/commands/top.ts","../src/commands/session.ts","../src/commands/trigger.ts","../src/commands/skill.ts","../src/lib/anthropic.ts","../src/commands/permissions.ts","../src/commands/context.ts","../src/commands/cost.ts","../src/lib/executions.ts","../src/commands/exec.ts","../src/commands/tonight.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';\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 {\n goalSetCommand,\n goalListCommand,\n goalCompleteCommand,\n goalProgressCommand\n} from './commands/goal.js';\nimport {\n feedbackAddCommand,\n feedbackShowCommand,\n feedbackStatsCommand\n} from './commands/feedback.js';\nimport { dashboardCommand } from './commands/dashboard.js';\nimport { issuesCommand } from './commands/issues.js';\nimport { solveIssuesCommand } from './commands/solve-issues.js';\nimport { openIssuesCommand } from './commands/open-issues.js';\nimport { loginCommand, logoutCommand, whoamiCommand } from './commands/login.js';\nimport { updateCommand } from './commands/update.js';\nimport { progressCommand, progressStartCommand, progressCompleteCommand } from './commands/progress.js';\nimport { resultsCommand } from './commands/results.js';\nimport { historyCommand } from './commands/history.js';\nimport { healthCommand } from './commands/health.js';\nimport { workersCommand } from './commands/workers.js';\nimport { contextFeedCommand } from './commands/context-feed.js';\nimport { watchCommand } from './commands/watch.js';\nimport { liveCommand } from './commands/live.js';\nimport { topCommand } from './commands/top.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 {\n stackInitCommand,\n stackStatusCommand,\n stackEnvCommand,\n stackUpCommand,\n stackDownCommand,\n stackHealthCommand,\n stackLogsCommand,\n applyStackConfig\n} from './commands/stack.js';\nimport { registerTriggerCommand } from './commands/trigger.js';\nimport { registerSkillCommand } from './commands/skill.js';\nimport { registerPermissionsCommand } from './commands/permissions.js';\nimport { contextShowCommand, contextListCommand } from './commands/context.js';\nimport { costCommand, budgetCheckCommand } from './commands/cost.js';\nimport { execListCommand, execShowCommand, execStatsCommand } from './commands/exec.js';\nimport {\n tonightCommand,\n tonightStatusCommand,\n tonightStopCommand,\n tonightReportCommand\n} from './commands/tonight.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\nconst program = new Command();\n\nprogram\n .name('squads')\n .description('A CLI for humans and agents')\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: (str, write) => write(str),\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// Init command\nprogram\n .command('init')\n .description('Initialize a new squad project')\n .option('-t, --template <template>', 'Project template', 'default')\n .option('--skip-infra', 'Skip infrastructure setup prompt')\n .action(initCommand);\n\n// Run command - runs squads or individual agents\nprogram\n .command('run <target>')\n .description('Run a squad or agent')\n .option('-v, --verbose', 'Verbose output')\n .option('-d, --dry-run', 'Show what would be run without executing')\n .option('-e, --execute', 'Execute agent via Claude CLI (requires claude installed)')\n .option('-a, --agent <agent>', 'Run specific agent within squad')\n .option('-t, --timeout <minutes>', 'Execution timeout in minutes (default: 30)', '30')\n .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('-f, --foreground', 'Run in foreground (no tmux, blocks terminal)')\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 .action((target, options) => runCommand(target, { ...options, timeout: parseInt(options.timeout, 10) }));\n\n// List command\nprogram\n .command('list')\n .description('List agents and squads')\n .option('-s, --squads', 'List squads only')\n .option('-a, --agents', 'List agents only')\n .action(listCommand);\n\n// Status command\nprogram\n .command('status [squad]')\n .description('Show squad status and state')\n .option('-v, --verbose', 'Show detailed status')\n .action(statusCommand);\n\n// Dashboard command\nprogram\n .command('dashboard')\n .alias('dash')\n .description('Show comprehensive goals and metrics dashboard')\n .option('-v, --verbose', 'Show additional details')\n .option('-c, --ceo', 'Executive summary with priorities and blockers')\n .option('-f, --full', 'Include GitHub PR/issue stats (slower, ~30s)')\n .action((options) => dashboardCommand({ ...options, fast: !options.full }));\n\n// Context command - show squad execution context (MCP, skills, budget, model)\nconst context = program\n .command('context')\n .description('View and manage squad execution context');\n\ncontext\n .command('show <squad>')\n .description('Show context for a squad (MCP, skills, model, budget)')\n .option('--json', 'Output as JSON')\n .action(contextShowCommand);\n\ncontext\n .command('list')\n .description('List context for all squads')\n .option('--json', 'Output as JSON')\n .action(contextListCommand);\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// 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// Issues command\nprogram\n .command('issues')\n .description('Show GitHub issues across repos')\n .option('-o, --org <org>', 'GitHub organization', 'agents-squads')\n .option('-r, --repos <repos>', 'Comma-separated repo names')\n .action(issuesCommand);\n\n// Solve issues command - close issues by creating PRs\nprogram\n .command('solve-issues')\n .description('Solve ready-to-fix issues by creating PRs')\n .option('-r, --repo <repo>', 'Target repo (hq, agents-squads-web)')\n .option('-i, --issue <number>', 'Specific issue number', parseInt)\n .option('-d, --dry-run', 'Show what would be solved')\n .option('-e, --execute', 'Execute with Claude CLI')\n .action(solveIssuesCommand);\n\n// Open issues command - run evaluators to find new issues\nprogram\n .command('open-issues')\n .description('Run evaluators/critics to find and create issues')\n .option('-s, --squad <squad>', 'Target squad (website, engineering, etc.)')\n .option('-a, --agent <agent>', 'Specific evaluator agent')\n .option('-d, --dry-run', 'Show what would run')\n .option('-e, --execute', 'Execute with Claude CLI')\n .action(openIssuesCommand);\n\n// Progress command - track agent task progress\nconst progress = program\n .command('progress')\n .description('Track active and completed agent tasks')\n .option('-v, --verbose', 'Show more activity')\n .action(progressCommand);\n\nprogress\n .command('start <squad> <description>')\n .description('Register a new active task')\n .action(progressStartCommand);\n\nprogress\n .command('complete <taskId>')\n .description('Mark a task as completed')\n .option('-f, --failed', 'Mark as failed instead')\n .action(progressCompleteCommand);\n\n// Results command - KPI goals vs actuals\nprogram\n .command('results [squad]')\n .description('Show squad results: git activity + KPI goals vs actuals')\n .option('-d, --days <days>', 'Days to look back', '7')\n .option('-v, --verbose', 'Show detailed KPIs per goal')\n .action((squad, options) => resultsCommand({ ...options, squad }));\n\n// 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// Context feed command - context injection for agents\nprogram\n .command('context-feed')\n .alias('feed')\n .description('Context feed for agents: 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// Workers command - show running processes and tasks\nprogram\n .command('workers')\n .description('Show active workers: Claude sessions, tasks, dev servers')\n .option('-v, --verbose', 'Show more details')\n .option('-k, --kill <pid>', 'Kill a process by PID')\n .action(workersCommand);\n\n// 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// Watch command - live refresh any command\nprogram\n .command('watch <command> [args...]')\n .description('Live refresh any squads command (like Unix watch)')\n .option('-n, --interval <seconds>', 'Refresh interval in seconds', '2')\n .option('--no-clear', 'Don\\'t clear screen between refreshes')\n .action((command, args, options) => watchCommand(command, args, {\n interval: parseInt(options.interval, 10),\n clear: options.clear\n }));\n\n// Live command - TUI dashboard\nprogram\n .command('live')\n .description('Live TUI dashboard with real-time metrics (like htop)')\n .option('-m, --minimal', 'Minimal view')\n .option('-f, --focus <panel>', 'Focus on specific panel (agents, cost, activity, memory)')\n .action((options) => liveCommand(options));\n\n// Top command - live process table like Unix top\nprogram\n .command('top')\n .description('Live process table (like Unix top) - numbers update in place')\n .action(() => topCommand());\n\n// Memory command group\nconst memory = program\n .command('memory')\n .description('Query and manage squad memory')\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\nmemory\n .command('show <squad>')\n .description('Show memory for a squad')\n .action(memoryShowCommand);\n\nmemory\n .command('update <squad> <content>')\n .description('Add to squad memory')\n .option('-a, --agent <agent>', 'Specific agent (default: squad-lead)')\n .option('-t, --type <type>', 'Memory type: state, learnings, feedback', 'learnings')\n .action(memoryUpdateCommand);\n\nmemory\n .command('list')\n .description('List all memory entries')\n .action(memoryListCommand);\n\nmemory\n .command('sync')\n .description('Sync memory from git: pull remote changes, process commits, optionally push')\n .option('-v, --verbose', 'Show detailed commit info')\n .option('-p, --push', 'Push local memory changes to remote after sync')\n .option('--no-pull', 'Skip pulling from remote')\n .action((options) => syncCommand({ verbose: options.verbose, push: options.push, pull: options.pull }));\n\nmemory\n .command('search <query>')\n .description('Search conversations stored in postgres (via squads-bridge)')\n .option('-l, --limit <limit>', 'Number of results', '10')\n .option('-r, --role <role>', 'Filter by role: user, assistant, thinking')\n .option('-i, --importance <importance>', 'Filter by importance: low, normal, high')\n .action((query, opts) => memorySearchCommand(query, {\n limit: parseInt(opts.limit, 10),\n role: opts.role,\n importance: opts.importance\n }));\n\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// 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 .action(goalListCommand);\n\ngoal\n .command('complete <squad> <index>')\n .description('Mark a goal as completed')\n .action(goalCompleteCommand);\n\ngoal\n .command('progress <squad> <index> <progress>')\n .description('Update goal progress')\n .action(goalProgressCommand);\n\n// Feedback command group\nconst feedback = program\n .command('feedback')\n .description('Record and view execution feedback');\n\nfeedback\n .command('add <squad> <rating> <feedback>')\n .description('Add feedback for last execution (rating 1-5)')\n .option('-l, --learning <learnings...>', 'Learnings to extract')\n .action(feedbackAddCommand);\n\nfeedback\n .command('show <squad>')\n .description('Show feedback history')\n .option('-n, --limit <n>', 'Number of entries to show', '5')\n .action(feedbackShowCommand);\n\nfeedback\n .command('stats')\n .description('Show feedback summary across all squads')\n .action(feedbackStatsCommand);\n\n// Sessions command group - list active sessions and history\nconst sessions = program\n .command('sessions')\n .description('Show active Claude Code sessions across squads')\n .option('-v, --verbose', 'Show session details')\n .option('-j, --json', 'Output as JSON')\n .action(sessionsCommand);\n\nsessions\n .command('history')\n .description('Show session history and statistics')\n .option('-d, --days <days>', 'Days of history to show', '7')\n .option('-s, --squad <squad>', 'Filter by squad')\n .option('-j, --json', 'Output as JSON')\n .action((options) => sessionsHistoryCommand({\n days: parseInt(options.days, 10),\n squad: options.squad,\n json: options.json,\n }));\n\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// Stack command group - manage local Docker stack\nconst stack = program\n .command('stack')\n .description('Manage local Docker stack (postgres, redis, langfuse, bridge)');\n\nstack\n .command('init')\n .description('Auto-detect Docker containers and configure CLI connection')\n .action(stackInitCommand);\n\nstack\n .command('status')\n .description('Show container health and connection status')\n .action(stackStatusCommand);\n\nstack\n .command('env')\n .description('Print environment variables for shell export')\n .action(stackEnvCommand);\n\nstack\n .command('up')\n .description('Start Docker containers via docker-compose')\n .action(stackUpCommand);\n\nstack\n .command('down')\n .description('Stop Docker containers')\n .action(stackDownCommand);\n\nstack\n .command('health')\n .description('Comprehensive health check with diagnostics')\n .option('-v, --verbose', 'Show logs for unhealthy services')\n .action((options) => stackHealthCommand(options.verbose));\n\nstack\n .command('logs <service>')\n .description('Show logs for a service (postgres, redis, neo4j, bridge, langfuse, mem0, engram)')\n .option('-n, --tail <lines>', 'Number of lines to show', '50')\n .action((service, options) => stackLogsCommand(service, parseInt(options.tail, 10)));\n\n// Trigger command group - smart value-driven triggers\nregisterTriggerCommand(program);\n\n// Skill command group - Agent Skills API\nregisterSkillCommand(program);\n\n// Permissions command group - Phase 3 execution contexts\nregisterPermissionsCommand(program);\n\n// Tonight command group - autonomous overnight execution\nconst tonight = program\n .command('tonight')\n .description('Run agents autonomously overnight with safety limits');\n\ntonight\n .command('run <targets...>')\n .description('Start tonight mode with specified squads/agents')\n .option('-c, --cost-cap <usd>', 'Max USD to spend (default: 50)', '50')\n .option('-s, --stop-at <time>', 'Stop time HH:MM (default: 07:00)', '07:00')\n .option('-r, --max-retries <n>', 'Max restarts per agent (default: 3)', '3')\n .option('-d, --dry-run', 'Show what would run without executing')\n .option('-v, --verbose', 'Verbose output')\n .action((targets, options) => tonightCommand(targets, {\n costCap: parseFloat(options.costCap),\n stopAt: options.stopAt,\n maxRetries: parseInt(options.maxRetries, 10),\n dryRun: options.dryRun,\n verbose: options.verbose,\n }));\n\ntonight\n .command('status')\n .description('Check tonight mode status')\n .action(tonightStatusCommand);\n\ntonight\n .command('stop')\n .description('Stop all tonight agents and generate report')\n .action(tonightStopCommand);\n\ntonight\n .command('report')\n .description('Show latest tonight report')\n .action(tonightReportCommand);\n\n// Auth commands\nprogram\n .command('login')\n .description('Log in to Squads (Pro & Enterprise)')\n .action(loginCommand);\n\nprogram\n .command('logout')\n .description('Log out from Squads')\n .action(logoutCommand);\n\nprogram\n .command('whoami')\n .description('Show current logged in user')\n .action(whoamiCommand);\n\n// Update command\nprogram\n .command('update')\n .description('Check for and install updates')\n .option('-y, --yes', 'Auto-confirm update without prompting')\n .option('-c, --check', 'Check for updates without installing')\n .action((options) => updateCommand(options));\n\n// 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// 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('\\nPossible fixes:'));\n console.error(chalk.dim(' 1. Check if Docker containers are running: squads stack status'));\n console.error(chalk.dim(' 2. Start the stack: squads stack up'));\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","import { createRequire } from 'module';\nconst require = createRequire(import.meta.url);\nconst pkg = require('../package.json');\nexport const version: string = pkg.version;\n","import chalk from 'chalk';\nimport ora from 'ora';\nimport fs from 'fs/promises';\nimport path from 'path';\nimport { execSync, spawn } from 'child_process';\nimport { createInterface } from 'readline';\nimport { checkGitStatus, getRepoName } from '../lib/git.js';\nimport { track, Events } from '../lib/telemetry.js';\n\ninterface InitOptions {\n template: string;\n skipInfra?: boolean;\n}\n\n// Simple yes/no prompt\nasync function confirm(question: string, defaultYes = true): Promise<boolean> {\n const rl = createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n const suffix = defaultYes ? '[Y/n]' : '[y/N]';\n\n return new Promise((resolve) => {\n rl.question(` ${question} ${chalk.dim(suffix)} `, (answer) => {\n rl.close();\n const normalized = answer.toLowerCase().trim();\n if (normalized === '') {\n resolve(defaultYes);\n } else {\n resolve(normalized === 'y' || normalized === 'yes');\n }\n });\n });\n}\n\n// Optional email prompt for updates\nasync function promptEmail(): Promise<string | null> {\n const rl = createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n return new Promise((resolve) => {\n rl.question(` ${chalk.dim('📬 Get product updates? (optional, Enter to skip):')} `, (answer) => {\n rl.close();\n const email = answer.trim();\n\n // Skip if empty\n if (!email) {\n resolve(null);\n return;\n }\n\n // Basic email validation\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n if (emailRegex.test(email)) {\n resolve(email);\n } else {\n console.log(chalk.dim(' Invalid email, skipping...'));\n resolve(null);\n }\n });\n });\n}\n\n// Check if a command exists\nfunction commandExists(cmd: string): boolean {\n try {\n execSync(`which ${cmd}`, { stdio: 'ignore' });\n return true;\n } catch {\n return false;\n }\n}\n\n// Check if Docker is running\nfunction dockerRunning(): boolean {\n try {\n execSync('docker info', { stdio: 'ignore' });\n return true;\n } catch {\n return false;\n }\n}\n\ninterface RequirementCheck {\n name: string;\n status: 'ok' | 'missing' | 'warning';\n message?: string;\n hint?: string;\n}\n\n// Check if Claude CLI is installed and logged in\nfunction checkClaudeAuth(): { installed: boolean; loggedIn: boolean } {\n try {\n execSync('which claude', { stdio: 'ignore' });\n } catch {\n return { installed: false, loggedIn: false };\n }\n\n try {\n // Check if claude is authenticated\n const result = execSync('claude --version', { stdio: 'pipe' }).toString();\n // If we get here, claude is installed. Check auth status.\n // Claude CLI doesn't have a direct \"am I logged in\" check, but if it works, assume ok\n return { installed: true, loggedIn: result.includes('claude') };\n } catch {\n return { installed: true, loggedIn: false };\n }\n}\n\n// Check if gh CLI is authenticated\nfunction checkGhAuth(): boolean {\n try {\n execSync('gh auth status', { stdio: 'ignore' });\n return true;\n } catch {\n return false;\n }\n}\n\nfunction checkRequirements(): RequirementCheck[] {\n const checks: RequirementCheck[] = [];\n\n // Check Claude CLI (subscription-based auth)\n const claudeStatus = checkClaudeAuth();\n if (claudeStatus.installed && claudeStatus.loggedIn) {\n checks.push({ name: 'Claude CLI', status: 'ok' });\n } else if (claudeStatus.installed) {\n checks.push({\n name: 'Claude CLI',\n status: 'warning',\n message: 'Installed but may need login',\n hint: 'Run: claude login',\n });\n } else {\n checks.push({\n name: 'Claude CLI',\n status: 'missing',\n message: 'Required to run agents',\n hint: 'Install: npm install -g @anthropic-ai/claude-code',\n });\n }\n\n // Check GitHub CLI auth (not raw token)\n if (checkGhAuth()) {\n checks.push({ name: 'GitHub CLI', status: 'ok' });\n } else if (commandExists('gh')) {\n checks.push({\n name: 'GitHub CLI',\n status: 'warning',\n message: 'Installed but not logged in',\n hint: 'Run: gh auth login',\n });\n } else {\n checks.push({\n name: 'GitHub CLI',\n status: 'missing',\n message: 'Required for GitHub integration (issues, PRs)',\n hint: 'Install: https://cli.github.com',\n });\n }\n\n // Check Docker\n if (commandExists('docker')) {\n if (dockerRunning()) {\n checks.push({ name: 'Docker', status: 'ok' });\n } else {\n checks.push({\n name: 'Docker',\n status: 'warning',\n message: 'Installed but not running',\n hint: 'Start Docker Desktop or run: sudo systemctl start docker',\n });\n }\n } else {\n checks.push({\n name: 'Docker',\n status: 'warning',\n message: 'Optional - enables dashboard metrics',\n hint: 'Install: https://docker.com',\n });\n }\n\n return checks;\n}\n\nasync function setupInfrastructure(cwd: string): Promise<boolean> {\n const spinner = ora('Setting up infrastructure...').start();\n\n try {\n // Find docker-compose.yml - check if it's bundled with CLI or in current dir\n let dockerDir: string | null = null;\n\n // Check current directory\n const localDockerCompose = path.join(cwd, 'docker', 'docker-compose.yml');\n const localDockerComposeRoot = path.join(cwd, 'docker-compose.yml');\n\n if (await fileExists(localDockerCompose)) {\n dockerDir = path.join(cwd, 'docker');\n } else if (await fileExists(localDockerComposeRoot)) {\n dockerDir = cwd;\n } else {\n // Try to find bundled docker files from CLI package\n const cliPath = new URL('../..', import.meta.url).pathname;\n const bundledDockerCompose = path.join(cliPath, 'docker', 'docker-compose.yml');\n\n if (await fileExists(bundledDockerCompose)) {\n // Copy docker files to project\n spinner.text = 'Copying infrastructure files...';\n const targetDockerDir = path.join(cwd, 'docker');\n await fs.mkdir(targetDockerDir, { recursive: true });\n\n // Copy essential files\n const filesToCopy = [\n 'docker-compose.yml',\n '.env.example',\n 'init-db.sql',\n 'README.md',\n ];\n\n for (const file of filesToCopy) {\n const src = path.join(cliPath, 'docker', file);\n const dest = path.join(targetDockerDir, file);\n if (await fileExists(src)) {\n await fs.copyFile(src, dest);\n }\n }\n\n // Copy squads-bridge directory\n const bridgeSrc = path.join(cliPath, 'docker', 'squads-bridge');\n const bridgeDest = path.join(targetDockerDir, 'squads-bridge');\n if (await fileExists(bridgeSrc)) {\n await copyDir(bridgeSrc, bridgeDest);\n }\n\n // Create .env from example if not exists\n const envExample = path.join(targetDockerDir, '.env.example');\n const envFile = path.join(targetDockerDir, '.env');\n if (await fileExists(envExample) && !(await fileExists(envFile))) {\n await fs.copyFile(envExample, envFile);\n }\n\n dockerDir = targetDockerDir;\n }\n }\n\n if (!dockerDir) {\n spinner.fail('Could not find docker-compose.yml');\n console.log(chalk.dim(' Try cloning the full repo: git clone https://github.com/agents-squads/hq'));\n return false;\n }\n\n spinner.text = 'Starting containers...';\n\n // Run docker compose\n await new Promise<void>((resolve, reject) => {\n const proc = spawn('docker', ['compose', 'up', '-d'], {\n cwd: dockerDir!,\n stdio: 'pipe',\n });\n\n let stderr = '';\n proc.stderr?.on('data', (data) => {\n stderr += data.toString();\n });\n\n proc.on('close', (code) => {\n if (code === 0) {\n resolve();\n } else {\n reject(new Error(stderr || `docker compose failed with code ${code}`));\n }\n });\n\n proc.on('error', reject);\n });\n\n spinner.text = 'Waiting for services to be ready...';\n\n // Wait a bit for services to start\n await sleep(3000);\n\n // Verify services\n const services = ['squads-postgres', 'squads-redis', 'squads-bridge'];\n let allRunning = true;\n\n for (const service of services) {\n try {\n execSync(`docker ps --filter \"name=${service}\" --filter \"status=running\" -q`, { stdio: 'pipe' });\n } catch {\n allRunning = false;\n }\n }\n\n if (allRunning) {\n spinner.succeed('Infrastructure ready');\n console.log();\n console.log(chalk.dim(' Services running:'));\n console.log(chalk.dim(' • postgres:5432 • redis:6379 • bridge:8088'));\n return true;\n } else {\n spinner.warn('Some services may not be running');\n console.log(chalk.dim(' Check with: docker ps'));\n return true; // Still consider it a success, user can debug\n }\n\n } catch (error) {\n spinner.fail('Failed to start infrastructure');\n console.log(chalk.dim(` ${error}`));\n console.log(chalk.dim(' Try manually: cd docker && docker compose up -d'));\n return false;\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\nasync function copyDir(src: string, dest: string): Promise<void> {\n await fs.mkdir(dest, { recursive: true });\n const entries = await fs.readdir(src, { withFileTypes: true });\n\n for (const entry of entries) {\n const srcPath = path.join(src, entry.name);\n const destPath = path.join(dest, entry.name);\n\n if (entry.isDirectory()) {\n await copyDir(srcPath, destPath);\n } else {\n await fs.copyFile(srcPath, destPath);\n }\n }\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport async function initCommand(options: InitOptions): Promise<void> {\n const cwd = process.cwd();\n\n console.log();\n console.log(chalk.bold(' Checking requirements...'));\n console.log();\n\n // Check requirements\n const checks = checkRequirements();\n let hasMissingRequired = false;\n let hasDocker = false;\n let dockerReady = false;\n\n for (const check of checks) {\n if (check.status === 'ok') {\n console.log(` ${chalk.green('✓')} ${check.name}`);\n if (check.name === 'Docker') {\n hasDocker = true;\n dockerReady = true;\n }\n } else if (check.status === 'missing') {\n console.log(` ${chalk.yellow('⚠')} ${chalk.yellow(check.name)}`);\n if (check.message) {\n console.log(chalk.dim(` ${check.message}`));\n }\n if (check.hint) {\n console.log(chalk.dim(` → ${check.hint}`));\n }\n if (check.name !== 'Docker') {\n hasMissingRequired = true;\n }\n } else if (check.status === 'warning') {\n console.log(` ${chalk.dim('○')} ${check.name} ${chalk.dim(`(${check.message})`)}`);\n if (check.hint) {\n console.log(chalk.dim(` → ${check.hint}`));\n }\n if (check.name === 'Docker') {\n hasDocker = commandExists('docker');\n }\n }\n }\n\n console.log();\n\n if (hasMissingRequired) {\n console.log(chalk.yellow(' Install missing tools to continue, then run squads init again.'));\n console.log();\n\n // Track init failure for analytics\n track(Events.CLI_INIT, {\n success: false,\n reason: 'missing_requirements',\n });\n return;\n }\n\n // Check Git status\n console.log(chalk.dim(' Checking project setup...'));\n console.log();\n\n const gitStatus = checkGitStatus(cwd);\n\n if (!gitStatus.isGitRepo) {\n console.log(` ${chalk.yellow('⚠')} No git repository found`);\n console.log(chalk.dim(' Run: git init && git remote add origin <repo-url>'));\n console.log();\n } else {\n console.log(` ${chalk.green('✓')} Git repository`);\n if (gitStatus.hasRemote) {\n const repoName = getRepoName(gitStatus.remoteUrl);\n console.log(` ${chalk.green('✓')} Remote: ${chalk.cyan(repoName || gitStatus.remoteUrl)}`);\n }\n }\n\n console.log();\n\n // Create project structure\n const spinner = ora('Creating squad structure...').start();\n\n try {\n // Create directory structure\n const dirs = [\n '.agents/squads',\n '.agents/squads/demo',\n '.agents/memory',\n '.agents/outputs',\n '.claude',\n ];\n\n for (const dir of dirs) {\n await fs.mkdir(path.join(cwd, dir), { recursive: true });\n }\n\n // Create demo squad\n const demoSquadMd = `# Demo Squad\n\nDemonstrates squads functionality with safe, educational examples.\n\n## Goals\n\n- [ ] Run the demo agents and explore the dashboard\n\n## Agents\n\n| Agent | Purpose |\n|-------|---------|\n| welcome | Creates a welcome GitHub issue |\n| analyzer | Analyzes project structure |\n\n## Triggers\n\nNone (manual execution only)\n\n## Usage\n\n\\`\\`\\`bash\nsquads run demo\n\\`\\`\\`\n\nThis will:\n1. Create a GitHub issue explaining what happened\n2. Analyze your project structure\n3. Show results in the dashboard\n\nAll demo data is clearly labeled [demo] so you can distinguish it from real data.\n`;\n\n await fs.writeFile(\n path.join(cwd, '.agents/squads/demo/SQUAD.md'),\n demoSquadMd\n );\n\n // Create demo welcome agent\n const welcomeAgent = `# Welcome Agent\n\n## Purpose\nCreate a welcome GitHub issue to demonstrate squads functionality.\n\n## Model\nclaude-haiku-3-5\n\n## Tools\n- Bash (gh cli)\n\n## Instructions\n1. Check if a welcome issue already exists\n2. If not, create a new issue titled \"[Demo] Welcome to Squads!\"\n3. The issue body should explain:\n - What just happened (squads run demo executed this agent)\n - What squads are and how they work\n - Next steps to create their own agents\n\n## Output\nConfirmation message with issue URL.\n\n## Labels\n- demo\n- automated\n`;\n\n await fs.writeFile(\n path.join(cwd, '.agents/squads/demo/welcome.md'),\n welcomeAgent\n );\n\n // Create demo analyzer agent\n const analyzerAgent = `# Project Analyzer Agent\n\n## Purpose\nAnalyze project structure and provide insights.\n\n## Model\nclaude-haiku-3-5\n\n## Tools\n- Read\n- Glob\n- Bash (ls, find)\n\n## Instructions\n1. Scan the project directory structure\n2. Identify key files (package.json, Cargo.toml, pyproject.toml, etc.)\n3. Summarize the tech stack\n4. Create a brief report\n\n## Output\nMarkdown report saved to .agents/outputs/demo/project-analysis.md\n\n## Labels\n- demo\n- analysis\n`;\n\n await fs.writeFile(\n path.join(cwd, '.agents/squads/demo/analyzer.md'),\n analyzerAgent\n );\n\n // Create Claude Code settings with hooks\n const claudeSettings = {\n hooks: {\n SessionStart: [\n {\n hooks: [\n {\n type: 'command',\n command: 'squads status',\n timeout: 10,\n },\n ],\n },\n ],\n Stop: [\n {\n hooks: [\n {\n type: 'command',\n command: 'squads memory sync',\n timeout: 15,\n },\n ],\n },\n ],\n },\n };\n\n await fs.writeFile(\n path.join(cwd, '.claude/settings.json'),\n JSON.stringify(claudeSettings, null, 2)\n );\n\n // Create git commit template\n const commitTemplate = `\n# Commit message format:\n# <type>(<scope>): <subject>\n#\n# 🤖 Generated with [Agents Squads](https://agents-squads.com)\n# Co-Authored-By: Claude <model> <noreply@anthropic.com>\n`;\n\n await fs.writeFile(\n path.join(cwd, '.agents/commit-template.txt'),\n commitTemplate\n );\n\n // Create CLAUDE.md if it doesn't exist\n const claudeMdPath = path.join(cwd, 'CLAUDE.md');\n if (!(await fileExists(claudeMdPath))) {\n await fs.writeFile(\n claudeMdPath,\n `# Project Instructions\n\n## What is Squads?\n\nSquads is a framework for building AI agent teams that automate real work.\nEach **squad** is a team of **agents** (markdown prompts) that execute via Claude.\n\n## For Claude (READ THIS)\n\nWhen helping users with squad-related tasks:\n\n### Check Context First\n\\`\\`\\`bash\nsquads status # What squads exist?\nsquads memory query \"X\" # What do we know about X?\n\\`\\`\\`\n\n### Creating Agents\nAgents live in \\`.agents/squads/<squad-name>/<agent-name>.md\\`:\n\n\\`\\`\\`markdown\n# Agent Name\n\n## Purpose\nOne sentence: what this agent does.\n\n## Instructions\n1. Specific step\n2. Another step\n3. Output location\n\n## Output\nWhat it produces and where it goes.\n\\`\\`\\`\n\n### Running Agents\n\\`\\`\\`bash\nsquads run <squad> # Run all agents in squad\nsquads run <squad>/<agent> # Run specific agent\n\\`\\`\\`\n\n### Tracking Progress\n\\`\\`\\`bash\nsquads dash # Full dashboard with goals\nsquads goal list # View all goals\nsquads goal set <squad> \"X\" # Add a goal\n\\`\\`\\`\n\n### Common User Requests\n\n| User says | You should |\n|-----------|------------|\n| \"Create an agent to...\" | Create \\`.agents/squads/<squad>/<name>.md\\` |\n| \"Automate X\" | Create agent, then \\`squads run\\` |\n| \"What's the status?\" | Run \\`squads dash\\` or \\`squads status\\` |\n| \"Run the X agent\" | \\`squads run <squad>/x\\` |\n| \"Check memory\" | \\`squads memory query \"<topic>\"\\` |\n\n## Quick Reference\n\n\\`\\`\\`bash\nsquads status # Overview\nsquads dash # Full dashboard\nsquads run demo # Try demo squad\nsquads list # All agents\nsquads memory query X # Search memory\nsquads goal list # View goals\n\\`\\`\\`\n\n## Project Structure\n\n\\`\\`\\`\n.agents/\n├── squads/ # Agent teams\n│ └── <squad>/\n│ ├── SQUAD.md # Squad definition\n│ └── *.md # Agent files\n├── memory/ # Persistent context\n└── outputs/ # Agent outputs\n\\`\\`\\`\n`\n );\n }\n\n spinner.succeed('Squad structure created');\n\n // Track successful initialization\n await track(Events.CLI_INIT, {\n success: true,\n hasGit: gitStatus.isGitRepo,\n hasRemote: gitStatus.hasRemote,\n template: options.template,\n hasDocker,\n });\n\n } catch (error) {\n spinner.fail('Failed to create structure');\n console.error(chalk.red(` ${error}`));\n\n // Track init failure\n track(Events.CLI_INIT, {\n success: false,\n reason: 'structure_creation_failed',\n error: String(error),\n });\n process.exit(1);\n }\n\n // Offer infrastructure setup if Docker is available\n if (!options.skipInfra && hasDocker) {\n console.log();\n\n if (!dockerReady) {\n console.log(chalk.dim(' Docker is installed but not running.'));\n console.log(chalk.dim(' Start Docker to enable infrastructure setup.'));\n } else {\n const setupInfra = await confirm('Set up local infrastructure (postgres, redis)?', true);\n\n if (setupInfra) {\n console.log();\n const success = await setupInfrastructure(cwd);\n if (!success) {\n console.log();\n console.log(chalk.dim(' You can set up infrastructure later with:'));\n console.log(chalk.dim(' cd docker && docker compose up -d'));\n }\n }\n }\n }\n\n // Success message - clear single next action\n console.log();\n console.log(chalk.green.bold(' ✓ Squads initialized!'));\n console.log();\n\n // Show what was created (compact)\n console.log(chalk.dim(' Created:'));\n console.log(chalk.dim(' • .agents/squads/demo/ - Demo squad with 2 agents'));\n console.log(chalk.dim(' • .claude/settings.json - Claude Code hooks'));\n console.log(chalk.dim(' • CLAUDE.md - Agent instructions'));\n console.log();\n\n // Optional email capture for updates\n const email = await promptEmail();\n if (email) {\n await track(Events.CLI_INIT, {\n event: 'email_capture',\n email,\n });\n console.log(chalk.dim(` ✓ We'll send updates to ${email}`));\n console.log();\n }\n\n // Single clear next action - this is critical for activation\n console.log(chalk.bold(' 👉 Try it now:'));\n console.log();\n console.log(` ${chalk.yellow.bold('squads status')}`);\n console.log();\n console.log(chalk.dim(' Then explore:'));\n console.log(chalk.dim(` • ${chalk.cyan('squads dash')} Full dashboard`));\n console.log(chalk.dim(` • ${chalk.cyan('squads run demo')} Try demo agents`));\n console.log(chalk.dim(` • ${chalk.cyan('squads --help')} All commands`));\n console.log();\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 function getGitHubStats(basePath: string, days: number = 30): GitHubStats {\n const stats: GitHubStats = {\n prsOpened: 0,\n prsMerged: 0,\n issuesClosed: 0,\n issuesOpen: 0,\n bySquad: new Map(),\n };\n\n // Initialize squad stats\n for (const squad of Object.keys(SQUAD_REPO_MAP)) {\n stats.bySquad.set(squad, {\n prsOpened: 0,\n prsMerged: 0,\n issuesClosed: 0,\n issuesOpen: 0,\n commits: 0,\n recentIssues: [],\n recentPRs: [],\n });\n }\n\n const repos = ['hq', 'agents-squads-web'];\n const since = new Date(Date.now() - days * 24 * 60 * 60 * 1000).toISOString();\n\n for (const repo of repos) {\n const repoPath = join(basePath, repo);\n if (!existsSync(repoPath)) continue;\n\n try {\n // Get PRs\n const prsOutput = execSync(\n `gh pr list --state all --json number,title,createdAt,mergedAt,labels --limit 100 2>/dev/null`,\n { cwd: repoPath, encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] }\n );\n const prs = JSON.parse(prsOutput || '[]');\n\n for (const pr of prs) {\n const created = new Date(pr.createdAt);\n if (created < new Date(since)) continue;\n\n stats.prsOpened++;\n if (pr.mergedAt) stats.prsMerged++;\n\n // Detect squad from labels or title\n const squad = detectSquadFromPR(pr, repo);\n const squadStats = stats.bySquad.get(squad);\n if (squadStats) {\n squadStats.prsOpened++;\n if (pr.mergedAt) squadStats.prsMerged++;\n if (squadStats.recentPRs.length < 3) {\n squadStats.recentPRs.push({\n title: pr.title,\n number: pr.number,\n merged: !!pr.mergedAt,\n });\n }\n }\n }\n\n // Get Issues\n const issuesOutput = execSync(\n `gh issue list --state all --json number,title,state,closedAt,labels --limit 100 2>/dev/null`,\n { cwd: repoPath, encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] }\n );\n const issues = JSON.parse(issuesOutput || '[]');\n\n for (const issue of issues) {\n const squad = detectSquadFromIssue(issue, repo);\n const squadStats = stats.bySquad.get(squad);\n\n if (issue.state === 'CLOSED') {\n const closed = new Date(issue.closedAt);\n if (closed >= new Date(since)) {\n stats.issuesClosed++;\n if (squadStats) {\n squadStats.issuesClosed++;\n }\n }\n } else {\n stats.issuesOpen++;\n if (squadStats) {\n squadStats.issuesOpen++;\n if (squadStats.recentIssues.length < 3) {\n squadStats.recentIssues.push({\n title: issue.title,\n number: issue.number,\n state: issue.state,\n });\n }\n }\n }\n }\n } catch {\n // gh not available or not in repo\n }\n }\n\n // Add commit counts per squad\n const gitStats = getMultiRepoGitStats(basePath, days);\n for (const [repo, commits] of gitStats.commitsByRepo) {\n // Map repo to squad\n for (const [squad, repos] of Object.entries(SQUAD_REPO_MAP)) {\n if (repos.includes(repo)) {\n const squadStats = stats.bySquad.get(squad);\n if (squadStats) {\n squadStats.commits += commits;\n }\n }\n }\n }\n\n return stats;\n}\n\n/**\n * Optimized GitHub stats - fetches PRs and issues in parallel across repos\n * Uses a single combined gh api call per repo for better performance\n */\nexport function getGitHubStatsOptimized(basePath: string, days: number = 30): GitHubStats {\n const stats: GitHubStats = {\n prsOpened: 0,\n prsMerged: 0,\n issuesClosed: 0,\n issuesOpen: 0,\n bySquad: new Map(),\n };\n\n // Initialize squad stats\n for (const squad of Object.keys(SQUAD_REPO_MAP)) {\n stats.bySquad.set(squad, {\n prsOpened: 0,\n prsMerged: 0,\n issuesClosed: 0,\n issuesOpen: 0,\n commits: 0,\n recentIssues: [],\n recentPRs: [],\n });\n }\n\n const repos = ['hq', 'agents-squads-web'];\n const since = new Date(Date.now() - days * 24 * 60 * 60 * 1000).toISOString();\n\n // Fetch all data in parallel using a single combined command\n const results: { repo: string; prs: unknown[]; issues: unknown[] }[] = [];\n\n for (const repo of repos) {\n const repoPath = join(basePath, repo);\n if (!existsSync(repoPath)) continue;\n\n try {\n // Use a single shell command to get both PRs and issues\n // This reduces the number of gh CLI invocations from 4 to 2\n const output = execSync(\n `echo '{\"prs\":' && gh pr list --state all --json number,title,createdAt,mergedAt,labels --limit 50 2>/dev/null && echo ',\"issues\":' && gh issue list --state all --json number,title,state,closedAt,labels --limit 50 2>/dev/null && echo '}'`,\n { cwd: repoPath, encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'], timeout: 10000 }\n );\n\n // Parse the combined output (handle edge cases)\n const prsMatch = output.match(/\"prs\":(\\[.*?\\]),\"issues\":/s);\n const issuesMatch = output.match(/\"issues\":(\\[.*?\\])\\s*\\}/s);\n\n const prs = prsMatch ? JSON.parse(prsMatch[1]) : [];\n const issues = issuesMatch ? JSON.parse(issuesMatch[1]) : [];\n\n results.push({ repo, prs, issues });\n } catch {\n // Fallback: try individual calls with short timeout\n try {\n const prsOutput = execSync(\n `gh pr list --state all --json number,title,createdAt,mergedAt,labels --limit 50 2>/dev/null`,\n { cwd: repoPath, encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'], timeout: 5000 }\n );\n const issuesOutput = execSync(\n `gh issue list --state all --json number,title,state,closedAt,labels --limit 50 2>/dev/null`,\n { cwd: repoPath, encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'], timeout: 5000 }\n );\n results.push({\n repo,\n prs: JSON.parse(prsOutput || '[]'),\n issues: JSON.parse(issuesOutput || '[]'),\n });\n } catch {\n // Skip this repo\n }\n }\n }\n\n // Process results\n for (const { repo, prs, issues } of results) {\n // Process PRs\n for (const pr of prs as { createdAt: string; mergedAt?: string; title: string; number: number; labels: { name: string }[] }[]) {\n const created = new Date(pr.createdAt);\n if (created < new Date(since)) continue;\n\n stats.prsOpened++;\n if (pr.mergedAt) stats.prsMerged++;\n\n const squad = detectSquadFromPR(pr, repo);\n const squadStats = stats.bySquad.get(squad);\n if (squadStats) {\n squadStats.prsOpened++;\n if (pr.mergedAt) squadStats.prsMerged++;\n if (squadStats.recentPRs.length < 3) {\n squadStats.recentPRs.push({\n title: pr.title,\n number: pr.number,\n merged: !!pr.mergedAt,\n });\n }\n }\n }\n\n // Process Issues\n for (const issue of issues as { state: string; closedAt?: string; title: string; number: number; labels: { name: string }[] }[]) {\n const squad = detectSquadFromIssue(issue, repo);\n const squadStats = stats.bySquad.get(squad);\n\n if (issue.state === 'CLOSED') {\n const closed = new Date(issue.closedAt || 0);\n if (closed >= new Date(since)) {\n stats.issuesClosed++;\n if (squadStats) {\n squadStats.issuesClosed++;\n }\n }\n } else {\n stats.issuesOpen++;\n if (squadStats) {\n squadStats.issuesOpen++;\n if (squadStats.recentIssues.length < 3) {\n squadStats.recentIssues.push({\n title: issue.title,\n number: issue.number,\n state: issue.state,\n });\n }\n }\n }\n }\n }\n\n // Note: commit counts are added separately by the caller using cached git stats\n return stats;\n}\n\nfunction detectSquadFromPR(pr: { title: string; labels: { name: string }[] }, repo: string): string {\n // Check labels first\n for (const label of pr.labels || []) {\n const labelLower = label.name.toLowerCase();\n for (const [squad, patterns] of Object.entries(SQUAD_LABELS)) {\n if (patterns.some(p => labelLower.includes(p))) {\n return squad;\n }\n }\n }\n\n // Check title\n const titleLower = pr.title.toLowerCase();\n for (const [squad, patterns] of Object.entries(SQUAD_LABELS)) {\n if (patterns.some(p => titleLower.includes(p))) {\n return squad;\n }\n }\n\n // Default based on repo\n if (repo === 'agents-squads-web') return 'website';\n if (repo === 'squads-cli') return 'product';\n return 'engineering';\n}\n\nfunction detectSquadFromIssue(issue: { title: string; labels: { name: string }[] }, repo: string): string {\n // Check labels first\n for (const label of issue.labels || []) {\n const labelLower = label.name.toLowerCase();\n\n // Direct squad label match\n if (labelLower.startsWith('squad:')) {\n return labelLower.replace('squad:', '');\n }\n\n for (const [squad, patterns] of Object.entries(SQUAD_LABELS)) {\n if (patterns.some(p => labelLower.includes(p))) {\n return squad;\n }\n }\n }\n\n // Check title\n const titleLower = issue.title.toLowerCase();\n for (const [squad, patterns] of Object.entries(SQUAD_LABELS)) {\n if (patterns.some(p => titleLower.includes(p))) {\n return squad;\n }\n }\n\n // Default based on repo\n if (repo === 'agents-squads-web') return 'website';\n if (repo === 'squads-cli') return 'product';\n return 'engineering';\n}\n\nexport function getMultiRepoGitStats(basePath: string, days: number = 30): GitPerformanceStats {\n const stats: GitPerformanceStats = {\n totalCommits: 0,\n commitsByDay: new Map(),\n commitsByAuthor: new Map(),\n commitsByRepo: new Map(),\n activeDays: 0,\n avgCommitsPerDay: 0,\n peakDay: null,\n repos: [],\n recentCommits: [],\n };\n\n // Collect all commits with full info for sorting\n const allCommits: CommitInfo[] = [];\n\n for (const repo of SQUAD_REPOS) {\n const repoPath = join(basePath, repo);\n if (!existsSync(repoPath) || !existsSync(join(repoPath, '.git'))) {\n continue;\n }\n\n try {\n // Get commits from this repo (use %aN to respect .mailmap)\n const logOutput = execSync(\n `git log --since=\"${days} days ago\" --format=\"%H|%aN|%ad|%s\" --date=short 2>/dev/null`,\n { cwd: repoPath, encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] }\n ).trim();\n\n if (!logOutput) continue;\n\n const commits = logOutput.split('\\n').filter(l => l.trim());\n const authors = new Set<string>();\n let lastCommit = '';\n\n for (const line of commits) {\n const 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 } catch {\n // Skip repos that fail\n }\n }\n\n // Calculate derived stats\n stats.activeDays = stats.commitsByDay.size;\n stats.avgCommitsPerDay = stats.activeDays > 0\n ? Math.round((stats.totalCommits / days) * 10) / 10\n : 0;\n\n // Find peak day\n let peakCount = 0;\n let peakDate = '';\n for (const [date, count] of stats.commitsByDay) {\n if (count > peakCount) {\n peakCount = count;\n peakDate = date;\n }\n }\n if (peakDate) {\n stats.peakDay = { date: peakDate, count: peakCount };\n }\n\n // 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 function getActivitySparkline(basePath: string, days: number = 7): 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 for (const repo of SQUAD_REPOS) {\n const repoPath = join(basePath, repo);\n if (!existsSync(repoPath) || !existsSync(join(repoPath, '.git'))) {\n continue;\n }\n\n try {\n const logOutput = execSync(\n `git log --since=\"${days} days ago\" --format=\"%ad\" --date=short 2>/dev/null`,\n { cwd: repoPath, encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] }\n ).trim();\n\n if (!logOutput) continue;\n\n for (const dateStr of logOutput.split('\\n')) {\n const commitDate = new Date(dateStr);\n const daysAgo = Math.floor((now.getTime() - commitDate.getTime()) / (1000 * 60 * 60 * 24));\n const index = days - 1 - daysAgo;\n if (index >= 0 && index < days) {\n activity[index]++;\n }\n }\n } catch {\n // Skip\n }\n }\n\n return activity;\n}\n","import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'fs';\nimport { join } from 'path';\nimport { homedir } from 'os';\nimport { randomUUID } from 'crypto';\n\ninterface TelemetryEvent {\n event: string;\n timestamp: string;\n properties?: Record<string, string | number | boolean | undefined>;\n}\n\ninterface TelemetryConfig {\n enabled: boolean;\n anonymousId: string;\n firstRun: string;\n}\n\nconst TELEMETRY_DIR = join(homedir(), '.squads-cli');\nconst CONFIG_PATH = join(TELEMETRY_DIR, 'telemetry.json');\nconst EVENTS_PATH = join(TELEMETRY_DIR, 'events.json');\n\n// Telemetry endpoint - 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\nfunction ensureDir(): void {\n if (!existsSync(TELEMETRY_DIR)) {\n mkdirSync(TELEMETRY_DIR, { recursive: true });\n }\n}\n\nfunction getConfig(): TelemetryConfig {\n ensureDir();\n\n if (!existsSync(CONFIG_PATH)) {\n const config: TelemetryConfig = {\n enabled: true, // Opt-out by default (common for CLIs)\n anonymousId: randomUUID(),\n firstRun: new Date().toISOString(),\n };\n writeFileSync(CONFIG_PATH, JSON.stringify(config, null, 2));\n return config;\n }\n\n try {\n return JSON.parse(readFileSync(CONFIG_PATH, 'utf-8'));\n } catch {\n return { enabled: false, anonymousId: '', firstRun: '' };\n }\n}\n\nfunction saveConfig(config: TelemetryConfig): void {\n ensureDir();\n writeFileSync(CONFIG_PATH, JSON.stringify(config, null, 2));\n}\n\nexport function isEnabled(): boolean {\n // Check environment variable first (allows CI/testing override)\n if (process.env.SQUADS_TELEMETRY_DISABLED === '1') {\n return false;\n }\n if (process.env.DO_NOT_TRACK === '1') {\n return false;\n }\n\n return getConfig().enabled;\n}\n\nexport function enable(): void {\n const config = getConfig();\n config.enabled = true;\n saveConfig(config);\n}\n\nexport function disable(): void {\n const config = getConfig();\n config.enabled = false;\n saveConfig(config);\n}\n\nexport function getAnonymousId(): string {\n return getConfig().anonymousId;\n}\n\nexport async function track(event: string, properties?: Record<string, string | number | boolean | undefined>): Promise<void> {\n if (!isEnabled()) return;\n\n const config = getConfig();\n\n const telemetryEvent: TelemetryEvent = {\n event,\n timestamp: new Date().toISOString(),\n properties: {\n ...properties,\n anonymousId: config.anonymousId,\n cliVersion: process.env.npm_package_version || 'unknown',\n },\n };\n\n // Store locally (for debugging/review)\n storeEventLocally(telemetryEvent);\n\n // Queue for batch sending\n eventQueue.push(telemetryEvent);\n\n // Schedule flush if not already scheduled\n if (TELEMETRY_ENDPOINT && !flushScheduled) {\n flushScheduled = true;\n // Flush on next tick to batch events from same command\n setImmediate(() => {\n flushEvents().catch(() => {});\n });\n }\n}\n\n/**\n * Flush queued events to the telemetry endpoint\n */\nexport async function flushEvents(): Promise<void> {\n if (!TELEMETRY_ENDPOINT || eventQueue.length === 0) {\n flushScheduled = false;\n return;\n }\n\n const batch = [...eventQueue];\n eventQueue = [];\n flushScheduled = false;\n\n try {\n await fetch(TELEMETRY_ENDPOINT, {\n method: 'POST',\n headers: {\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// Pre-defined events for consistency\nexport const Events = {\n // Lifecycle\n CLI_INIT: 'cli.init',\n CLI_ERROR: 'cli.error',\n\n // Commands\n CLI_RUN: 'cli.run',\n CLI_STATUS: 'cli.status',\n CLI_DASHBOARD: 'cli.dashboard',\n CLI_WORKERS: 'cli.workers',\n CLI_TONIGHT: 'cli.tonight',\n CLI_CONTEXT: 'cli.context',\n CLI_COST: 'cli.cost',\n CLI_EXEC: 'cli.exec',\n\n // Goals\n CLI_GOAL_SET: 'cli.goal.set',\n CLI_GOAL_LIST: 'cli.goal.list',\n CLI_GOAL_COMPLETE: 'cli.goal.complete',\n CLI_GOAL_PROGRESS: 'cli.goal.progress',\n\n // Memory\n CLI_MEMORY_QUERY: 'cli.memory.query',\n CLI_MEMORY_SHOW: 'cli.memory.show',\n CLI_MEMORY_UPDATE: 'cli.memory.update',\n CLI_MEMORY_LIST: 'cli.memory.list',\n CLI_MEMORY_SYNC: 'cli.memory.sync',\n\n // Feedback\n CLI_FEEDBACK_ADD: 'cli.feedback.add',\n CLI_FEEDBACK_SHOW: 'cli.feedback.show',\n CLI_FEEDBACK_STATS: 'cli.feedback.stats',\n\n // Auth\n CLI_LOGIN: 'cli.login',\n CLI_LOGOUT: 'cli.logout',\n} as const;\n\n// Track command execution time (legacy helper)\nexport function trackCommand(command: string): () => void {\n const start = Date.now();\n\n return () => {\n const duration = Date.now() - start;\n track(`cli.${command}`, { durationMs: duration });\n };\n}\n\n// Register exit handler to flush remaining events\nlet exitHandlerRegistered = false;\n\nexport function registerExitHandler(): void {\n if (exitHandlerRegistered) return;\n exitHandlerRegistered = true;\n\n // 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","import ora from 'ora';\nimport { spawn } from 'child_process';\nimport { join, dirname } from 'path';\nimport { existsSync, readFileSync, writeFileSync, mkdirSync } from 'fs';\nimport {\n findSquadsDir,\n loadSquad,\n listAgents,\n loadAgentDefinition,\n EffortLevel\n} from '../lib/squad-parser.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';\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 (no tmux)\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}\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 * 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\n * Different squads need different tools - keeps main sessions lean\n */\nfunction selectMcpConfig(squadName: string): string {\n const home = process.env.HOME || '';\n const configsDir = join(home, '.claude', 'mcp-configs');\n\n // Squad → MCP config mapping\n const squadConfigs: Record<string, string> = {\n website: 'website.json', // chrome-devtools, nano-banana\n research: 'research.json', // x-mcp\n intelligence: 'research.json', // x-mcp\n analytics: 'data.json', // supabase, grafana, ga4-admin\n engineering: 'data.json', // supabase, grafana\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 // Fallback to default user config\n return join(home, '.claude.json');\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/**\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 * 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 'supabase',\n 'grafana',\n 'context7',\n 'huggingface',\n 'nano-banana'\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\nexport async function runCommand(\n target: string,\n options: RunOptions\n): Promise<void> {\n const squadsDir = findSquadsDir();\n\n if (!squadsDir) {\n writeLine(` ${colors.red}No .agents/squads directory found${RESET}`);\n writeLine(` ${colors.dim}Run \\`squads init\\` to create one.${RESET}`);\n process.exit(1);\n }\n\n // Check if target is a squad or an agent\n const squad = loadSquad(target);\n\n if (squad) {\n await track(Events.CLI_RUN, { type: 'squad', target: squad.name });\n await 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.name, `${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 --execute`);\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.name, 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.name, `${agentName}.md`);\n\n if (existsSync(agentPath)) {\n writeLine(` ${colors.dim}[${i + 1}/${pipeline.agents.length}]${RESET}`);\n await runAgent(agentName, agentPath, squad.name, options);\n writeLine();\n } else {\n writeLine(` ${icons.warning} ${colors.yellow}Agent ${agentName} not found, skipping${RESET}`);\n }\n }\n } else {\n // If specific agent requested via -a flag, run that agent\n if (options.agent) {\n const agentPath = join(squadsDir, squad.name, `${options.agent}.md`);\n if (existsSync(agentPath)) {\n await runAgent(options.agent, agentPath, squad.name, options);\n } else {\n writeLine(` ${icons.error} ${colors.red}Agent ${options.agent} not found${RESET}`);\n return;\n }\n } else {\n // Run orchestrator if exists, otherwise list agents\n const orchestrator = squad.agents.find(a =>\n a.name.includes('lead') || a.trigger === 'Manual'\n );\n\n if (orchestrator) {\n const agentPath = join(squadsDir, squad.name, `${orchestrator.name}.md`);\n if (existsSync(agentPath)) {\n await runAgent(orchestrator.name, agentPath, squad.name, options);\n }\n } else {\n writeLine(` ${colors.dim}No pipeline defined. Available agents:${RESET}`);\n for (const agent of squad.agents) {\n writeLine(` ${icons.empty} ${colors.cyan}${agent.name}${RESET} ${colors.dim}${agent.role}${RESET}`);\n }\n writeLine();\n writeLine(` ${colors.dim}Run a specific agent:${RESET}`);\n writeLine(` ${colors.dim}$${RESET} squads run ${colors.cyan}${squad.name}${RESET} --agent ${colors.cyan}<name>${RESET}`);\n writeLine();\n writeLine(` ${colors.dim}Run all agents in parallel:${RESET}`);\n writeLine(` ${colors.dim}$${RESET} squads run ${colors.cyan}${squad.name}${RESET} --parallel --execute`);\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.name, `${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 --execute`);\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.name}/ 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.name}/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 writeLine(` ${gradient('Launching')} lead session${options.foreground ? ' (foreground)' : ''}...`);\n writeLine();\n\n try {\n const result = await executeWithClaude(prompt, options.verbose, timeoutMins, options.foreground, options.useApi, options.effort, options.skills, options.trigger || 'manual');\n\n if (options.foreground) {\n writeLine();\n writeLine(` ${icons.success} Lead session completed`);\n } else {\n writeLine(` ${icons.success} Lead session launched`);\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 if (options.dryRun) {\n spinner.info(`[DRY RUN] Would run ${agentName}`);\n if (options.verbose) {\n writeLine(` ${colors.dim}Agent definition:${RESET}`);\n writeLine(` ${colors.dim}${definition.slice(0, 500)}...${RESET}`);\n }\n return;\n }\n\n // 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 // 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 // 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\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:\n1. Update the agent's memory in .agents/memory/${squadName}/${agentName}/state.md\n2. Log any learnings to learnings.md\n3. 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 // Check if Claude CLI is available\n const claudeAvailable = await checkClaudeCliAvailable();\n\n if (options.execute && claudeAvailable) {\n spinner.text = options.foreground\n ? `Running ${agentName} in foreground...`\n : `Launching ${agentName} as background task...`;\n\n try {\n const result = await executeWithClaude(prompt, options.verbose, options.timeout || 30, options.foreground, options.useApi, options.effort, options.skills, options.trigger || 'manual');\n\n if (options.foreground) {\n spinner.succeed(`Agent ${agentName} completed`);\n } else {\n spinner.succeed(`Agent ${agentName} launched`);\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 } catch (error) {\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 }\n } else {\n // Show instructions for manual execution\n spinner.succeed(`Agent ${agentName} ready`);\n writeLine(` ${colors.dim}Execution logged: ${startTime}${RESET}`);\n\n if (!claudeAvailable) {\n writeLine();\n writeLine(` ${colors.yellow}Claude CLI not found${RESET}`);\n writeLine(` ${colors.dim}Install: npm install -g @anthropic-ai/claude-code${RESET}`);\n }\n\n writeLine();\n writeLine(` ${colors.dim}To launch as background task:${RESET}`);\n writeLine(` ${colors.dim}$${RESET} squads run ${colors.cyan}${squadName}${RESET} -a ${colors.cyan}${agentName}${RESET} --execute`);\n writeLine();\n writeLine(` ${colors.dim}Or run interactively:${RESET}`);\n writeLine(` ${colors.dim}$${RESET} Run the ${colors.cyan}${agentName}${RESET} agent from ${agentPath}`);\n }\n}\n\nasync function checkClaudeCliAvailable(): Promise<boolean> {\n return new Promise((resolve) => {\n const check = spawn('which', ['claude'], { stdio: 'pipe' });\n check.on('close', (code) => resolve(code === 0));\n check.on('error', () => resolve(false));\n });\n}\n\nasync function executeWithClaude(\n prompt: string,\n verbose?: boolean,\n _timeoutMinutes: number = 30,\n foreground?: boolean,\n useApi?: boolean,\n effort?: EffortLevel,\n skills?: string[],\n trigger: ExecutionContext['trigger'] = 'manual'\n): Promise<string> {\n // Ensure the project is trusted (prevents workspace trust dialog)\n const projectRoot = getProjectRoot();\n ensureProjectTrusted(projectRoot);\n\n // Extract squad/agent from prompt for telemetry tagging\n const squadMatch = prompt.match(/squad (\\w+)/);\n const agentMatch = prompt.match(/(\\w+) agent/);\n const squadName = process.env.SQUADS_SQUAD || squadMatch?.[1] || 'unknown';\n const agentName = process.env.SQUADS_AGENT || agentMatch?.[1] || 'unknown';\n\n // Select MCP config based on squad (keeps main sessions lean)\n const mcpConfigPath = selectMcpConfig(squadName);\n\n // Build execution context for telemetry\n const execContext: ExecutionContext = {\n squad: squadName,\n agent: agentName,\n taskType: detectTaskType(agentName),\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 const { ANTHROPIC_API_KEY: _apiKey, ...envWithoutApiKey } = process.env;\n const spawnEnv = useApi ? process.env : 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\n if (foreground) {\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 }\n\n return new Promise((resolve, reject) => {\n const claude = spawn('claude', [\n '--dangerously-skip-permissions',\n '--mcp-config', mcpConfigPath,\n '--',\n prompt\n ], {\n stdio: 'inherit',\n cwd: projectRoot,\n env: {\n ...spawnEnv,\n // Telemetry context for per-agent cost tracking\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 // OTel resource attributes for telemetry pipeline\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 // Claude-specific options\n ...(effort && { CLAUDE_EFFORT: effort }),\n ...(skills && skills.length > 0 && { CLAUDE_SKILLS: skills.join(',') }),\n },\n });\n\n claude.on('close', (code) => {\n if (code === 0) {\n resolve('Session completed');\n } else {\n reject(new Error(`Claude exited with code ${code}`));\n }\n });\n\n claude.on('error', (err) => {\n reject(err);\n });\n });\n }\n\n // Background mode: run via tmux for session management\n const sessionName = process.env.SQUADS_TMUX_SESSION ||\n `squads-${squadName}-${agentName}-${Date.now()}`;\n\n if (verbose) {\n writeLine(` ${colors.dim}Project: ${projectRoot}${RESET}`);\n writeLine(` ${colors.dim}Session: ${sessionName}${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 }\n\n // Build Claude command with all permissions bypassed for autonomous execution\n // Auto-cleanup: kill tmux session when Claude exits (success or failure)\n const claudeCmd = `cd '${projectRoot}' && claude --dangerously-skip-permissions --mcp-config '${mcpConfigPath}' -- '${escapedPrompt}'; tmux kill-session -t ${sessionName} 2>/dev/null`;\n\n // Create detached tmux session running Claude\n const tmux = spawn('tmux', [\n 'new-session',\n '-d', // Detached\n '-s', sessionName,\n '-x', '200', // Wide terminal for better output\n '-y', '50',\n '/bin/sh', '-c', claudeCmd\n ], {\n stdio: 'ignore',\n detached: true,\n env: {\n ...spawnEnv,\n // Telemetry context for per-agent cost tracking\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 // OTel resource attributes for telemetry pipeline\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 // Claude-specific options\n ...(effort && { CLAUDE_EFFORT: effort }),\n ...(skills && skills.length > 0 && { CLAUDE_SKILLS: skills.join(',') }),\n },\n });\n\n tmux.unref();\n\n if (verbose) {\n writeLine(` ${colors.dim}Attach: tmux attach -t ${sessionName}${RESET}`);\n }\n\n return `tmux session: ${sessionName}. Attach: tmux attach -t ${sessionName}`;\n}\n\nexport async function runSquadCommand(\n squadName: string,\n options: RunOptions\n): Promise<void> {\n return runCommand(squadName, options);\n}\n","import { readFileSync, existsSync, readdirSync, writeFileSync } from 'fs';\nimport { join, basename } from 'path';\nimport matter from 'gray-matter';\n\nexport type EffortLevel = 'high' | 'medium' | 'low';\n\n// Context schema for frontmatter\nexport interface SquadContext {\n mcp?: string[];\n skills?: string[];\n memory?: {\n load?: string[];\n };\n model?: {\n default?: string;\n expensive?: string;\n cheap?: string;\n };\n budget?: {\n daily?: number;\n weekly?: number;\n perExecution?: number;\n };\n}\n\n// Frontmatter schema\nexport interface SquadFrontmatter {\n name?: string;\n mission?: string;\n repo?: string;\n stack?: string;\n context?: SquadContext;\n effort?: EffortLevel;\n}\n\nexport interface Agent {\n name: string;\n role: string;\n trigger: string;\n status?: string;\n filePath?: string;\n squad?: string;\n effort?: EffortLevel;\n}\n\nexport interface Pipeline {\n name: string;\n agents: string[];\n}\n\nexport interface Goal {\n description: string;\n completed: boolean;\n progress?: string;\n metrics?: string[];\n}\n\nexport interface Squad {\n name: string;\n mission: string;\n agents: Agent[];\n pipelines: Pipeline[];\n triggers: {\n scheduled: string[];\n event: string[];\n manual: string[];\n };\n dependencies: string[];\n outputPath: string;\n goals: Goal[];\n effort?: EffortLevel; // Squad-level default effort\n context?: SquadContext; // Frontmatter context block\n repo?: string;\n stack?: string;\n}\n\nexport function findSquadsDir(): string | null {\n // Look for .agents/squads in current directory or parent directories\n let dir = process.cwd();\n\n for (let i = 0; i < 5; i++) {\n const squadsPath = join(dir, '.agents', 'squads');\n if (existsSync(squadsPath)) {\n return squadsPath;\n }\n const parent = join(dir, '..');\n if (parent === dir) break;\n dir = parent;\n }\n\n return null;\n}\n\nexport function findProjectRoot(): string | null {\n // Find the root of the squads project (where .agents/ lives)\n const squadsDir = findSquadsDir();\n if (!squadsDir) return null;\n // squadsDir is /path/to/.agents/squads, so go up 2 levels\n return join(squadsDir, '..', '..');\n}\n\nexport function hasLocalInfraConfig(): boolean {\n // Check if the project has a local .env file with infra config\n const projectRoot = findProjectRoot();\n if (!projectRoot) return false;\n\n const envPath = join(projectRoot, '.env');\n if (!existsSync(envPath)) return false;\n\n // Check if .env has any infra-related keys\n const content = readFileSync(envPath, 'utf-8');\n const infraKeys = ['LANGFUSE_', 'SQUADS_BRIDGE', 'SQUADS_POSTGRES', 'SQUADS_REDIS'];\n return infraKeys.some(key => content.includes(key));\n}\n\nexport function listSquads(squadsDir: string): string[] {\n const squads: string[] = [];\n\n const entries = readdirSync(squadsDir, { withFileTypes: true });\n for (const entry of entries) {\n if (entry.isDirectory() && !entry.name.startsWith('_')) {\n const squadFile = join(squadsDir, entry.name, 'SQUAD.md');\n if (existsSync(squadFile)) {\n squads.push(entry.name);\n }\n }\n }\n\n return squads;\n}\n\nexport function listAgents(squadsDir: string, squadName?: string): Agent[] {\n const agents: Agent[] = [];\n\n const dirs = squadName\n ? [squadName]\n : readdirSync(squadsDir, { withFileTypes: true })\n .filter(e => e.isDirectory() && !e.name.startsWith('_'))\n .map(e => e.name);\n\n for (const dir of dirs) {\n const squadPath = join(squadsDir, dir);\n if (!existsSync(squadPath)) continue;\n\n const files = readdirSync(squadPath);\n for (const file of files) {\n if (file.endsWith('.md') && file !== 'SQUAD.md') {\n const agentName = file.replace('.md', '');\n agents.push({\n name: agentName,\n role: `Agent in ${dir}`,\n trigger: 'manual',\n filePath: join(squadPath, file)\n });\n }\n }\n }\n\n return agents;\n}\n\nexport function parseSquadFile(filePath: string): Squad {\n const rawContent = readFileSync(filePath, 'utf-8');\n\n // Parse frontmatter with gray-matter\n const { data: frontmatter, content: bodyContent } = matter(rawContent);\n const fm = frontmatter as SquadFrontmatter;\n\n const lines = bodyContent.split('\\n');\n\n const squad: Squad = {\n name: fm.name || basename(filePath).replace('.md', ''),\n mission: fm.mission || '',\n agents: [],\n pipelines: [],\n triggers: { scheduled: [], event: [], manual: [] },\n dependencies: [],\n outputPath: '',\n goals: [],\n // Apply frontmatter fields\n effort: fm.effort,\n context: fm.context,\n repo: fm.repo,\n stack: fm.stack,\n };\n\n let currentSection = '';\n let inTable = false;\n let tableHeaders: string[] = [];\n\n for (const line of lines) {\n // Extract squad name from title\n if (line.startsWith('# Squad:')) {\n squad.name = line.replace('# Squad:', '').trim().toLowerCase();\n continue;\n }\n\n // Track sections\n if (line.startsWith('## ')) {\n currentSection = line.replace('## ', '').trim().toLowerCase();\n inTable = false;\n continue;\n }\n\n // Extract mission\n if (currentSection === 'mission' && line.trim() && !line.startsWith('#')) {\n if (!squad.mission) {\n squad.mission = line.trim();\n }\n }\n\n // Extract squad-level effort (e.g., \"effort: medium\" in Context section)\n const effortMatch = line.match(/^effort:\\s*(high|medium|low)/i);\n if (effortMatch && !squad.effort) {\n squad.effort = effortMatch[1].toLowerCase() as EffortLevel;\n }\n\n // Parse agent tables\n if (currentSection.includes('agent') || currentSection.includes('orchestrator') ||\n currentSection.includes('evaluator') || currentSection.includes('builder') ||\n currentSection.includes('priority')) {\n\n if (line.includes('|') && line.includes('Agent')) {\n inTable = true;\n tableHeaders = line.split('|').map(h => h.trim().toLowerCase());\n continue;\n }\n\n if (inTable && line.includes('|') && !line.includes('---')) {\n const cells = line.split('|').map(c => c.trim().replace(/`/g, ''));\n const agentIdx = tableHeaders.findIndex(h => h === 'agent');\n const roleIdx = tableHeaders.findIndex(h => h === 'role');\n const triggerIdx = tableHeaders.findIndex(h => h === 'trigger');\n const statusIdx = tableHeaders.findIndex(h => h === 'status');\n const effortIdx = tableHeaders.findIndex(h => h === 'effort');\n\n if (agentIdx >= 0 && cells[agentIdx]) {\n const effortValue = effortIdx >= 0 ? cells[effortIdx]?.toLowerCase() : undefined;\n const effort = ['high', 'medium', 'low'].includes(effortValue || '')\n ? effortValue as EffortLevel\n : undefined;\n\n squad.agents.push({\n name: cells[agentIdx],\n role: roleIdx >= 0 ? cells[roleIdx] : '',\n trigger: triggerIdx >= 0 ? cells[triggerIdx] : 'manual',\n status: statusIdx >= 0 ? cells[statusIdx] : 'active',\n effort\n });\n }\n }\n }\n\n // Parse pipelines (looking for patterns like: agent1 → agent2 → agent3)\n if (line.includes('→') && line.includes('`')) {\n const pipelineMatch = line.match(/`([^`]+)`\\s*→\\s*`([^`]+)`/g);\n if (pipelineMatch) {\n const agentNames = line.match(/`([^`]+)`/g)?.map(m => m.replace(/`/g, '')) || [];\n if (agentNames.length >= 2) {\n squad.pipelines.push({\n name: 'default',\n agents: agentNames\n });\n }\n }\n }\n\n // Also look for Pipeline: format\n if (line.toLowerCase().includes('pipeline:')) {\n const pipelineContent = line.split(':')[1];\n if (pipelineContent && pipelineContent.includes('→')) {\n const agentNames = pipelineContent.match(/`([^`]+)`/g)?.map(m => m.replace(/`/g, '')) || [];\n if (agentNames.length >= 2) {\n squad.pipelines.push({\n name: 'default',\n agents: agentNames\n });\n }\n }\n }\n\n // Extract output path\n if (line.toLowerCase().includes('primary') && line.includes('`')) {\n const match = line.match(/`([^`]+)`/);\n if (match) {\n squad.outputPath = match[1].replace(/\\/$/, '');\n }\n }\n\n // Parse goals (checkbox format: - [ ] or - [x])\n if (currentSection === 'goals') {\n const goalMatch = line.match(/^-\\s*\\[([ x])\\]\\s*(.+)$/);\n if (goalMatch) {\n const completed = goalMatch[1] === 'x';\n let description = goalMatch[2].trim();\n let progress: string | undefined;\n\n // Check for progress annotation\n const progressMatch = description.match(/\\(progress:\\s*([^)]+)\\)/i);\n if (progressMatch) {\n progress = progressMatch[1];\n description = description.replace(progressMatch[0], '').trim();\n }\n\n squad.goals.push({\n description,\n completed,\n progress\n });\n }\n }\n }\n\n return squad;\n}\n\nexport function loadSquad(squadName: string): Squad | null {\n const squadsDir = findSquadsDir();\n if (!squadsDir) return null;\n\n const squadFile = join(squadsDir, squadName, 'SQUAD.md');\n if (!existsSync(squadFile)) return null;\n\n return parseSquadFile(squadFile);\n}\n\nexport function loadAgentDefinition(agentPath: string): string {\n if (!existsSync(agentPath)) return '';\n return readFileSync(agentPath, 'utf-8');\n}\n\nexport function addGoalToSquad(squadName: string, goal: string): boolean {\n const squadsDir = findSquadsDir();\n if (!squadsDir) return false;\n\n const squadFile = join(squadsDir, squadName, 'SQUAD.md');\n if (!existsSync(squadFile)) return false;\n\n let content = readFileSync(squadFile, 'utf-8');\n\n // Check if Goals section exists\n if (!content.includes('## Goals')) {\n // Add Goals section before Dependencies or at end\n const insertPoint = content.indexOf('## Dependencies');\n if (insertPoint > 0) {\n content = content.slice(0, insertPoint) + `## Goals\\n\\n- [ ] ${goal}\\n\\n` + content.slice(insertPoint);\n } else {\n content += `\\n## Goals\\n\\n- [ ] ${goal}\\n`;\n }\n } else {\n // Add to existing Goals section\n const goalsIdx = content.indexOf('## Goals');\n const nextSectionIdx = content.indexOf('\\n## ', goalsIdx + 1);\n const endIdx = nextSectionIdx > 0 ? nextSectionIdx : content.length;\n\n // Find last goal line or section header\n const goalsSection = content.slice(goalsIdx, endIdx);\n const lastGoalMatch = goalsSection.match(/^-\\s*\\[[ x]\\].+$/gm);\n\n if (lastGoalMatch) {\n // Add after last goal\n const lastGoal = lastGoalMatch[lastGoalMatch.length - 1];\n const lastGoalIdx = content.lastIndexOf(lastGoal, endIdx);\n const insertPos = lastGoalIdx + lastGoal.length;\n content = content.slice(0, insertPos) + `\\n- [ ] ${goal}` + content.slice(insertPos);\n } else {\n // No goals yet, add after section header\n const headerEnd = goalsIdx + '## Goals'.length;\n content = content.slice(0, headerEnd) + `\\n\\n- [ ] ${goal}` + content.slice(headerEnd);\n }\n }\n\n writeFileSync(squadFile, content);\n return true;\n}\n\nexport function updateGoalInSquad(\n squadName: string,\n goalIndex: number,\n updates: { completed?: boolean; progress?: string }\n): boolean {\n const squadsDir = findSquadsDir();\n if (!squadsDir) return false;\n\n const squadFile = join(squadsDir, squadName, 'SQUAD.md');\n if (!existsSync(squadFile)) return false;\n\n const content = readFileSync(squadFile, 'utf-8');\n const lines = content.split('\\n');\n\n let currentSection = '';\n let goalCount = 0;\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n\n if (line.startsWith('## ')) {\n currentSection = line.replace('## ', '').trim().toLowerCase();\n continue;\n }\n\n if (currentSection === 'goals') {\n const goalMatch = line.match(/^-\\s*\\[([ x])\\]\\s*(.+)$/);\n if (goalMatch) {\n if (goalCount === goalIndex) {\n let newLine = '- [' + (updates.completed ? 'x' : ' ') + '] ' + goalMatch[2];\n\n // Handle progress update\n if (updates.progress !== undefined) {\n // Remove existing progress annotation\n newLine = newLine.replace(/\\s*\\(progress:\\s*[^)]+\\)/i, '');\n if (updates.progress) {\n newLine += ` (progress: ${updates.progress})`;\n }\n }\n\n lines[i] = newLine;\n writeFileSync(squadFile, lines.join('\\n'));\n return true;\n }\n goalCount++;\n }\n }\n }\n\n return false;\n}\n","/**\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: [supabase]\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","import {\n findSquadsDir,\n listSquads,\n listAgents\n} from '../lib/squad-parser.js';\nimport {\n colors,\n bold,\n RESET,\n gradient,\n box,\n padEnd,\n icons,\n writeLine,\n} from '../lib/terminal.js';\nimport { track } from '../lib/telemetry.js';\n\ninterface ListOptions {\n squads?: boolean;\n agents?: 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 writeLine();\n writeLine(` ${gradient('squads')} ${colors.dim}list${RESET}`);\n writeLine();\n\n // Stats\n writeLine(` ${colors.cyan}${squads.length}${RESET} squads ${colors.dim}│${RESET} ${colors.cyan}${allAgents.length}${RESET} agents`);\n writeLine();\n\n if (!options.agents) {\n // Show squads table\n const w = { name: 16, agents: 8, lead: 24 };\n const tableWidth = w.name + w.agents + w.lead + 4;\n\n writeLine(` ${colors.purple}${box.topLeft}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.topRight}${RESET}`);\n\n const header = ` ${colors.purple}${box.vertical}${RESET} ` +\n `${bold}${padEnd('SQUAD', w.name)}${RESET}` +\n `${bold}${padEnd('AGENTS', w.agents)}${RESET}` +\n `${bold}LEAD${RESET}` +\n ` ${colors.purple}${box.vertical}${RESET}`;\n writeLine(header);\n\n writeLine(` ${colors.purple}${box.teeRight}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.teeLeft}${RESET}`);\n\n for (const squadName of squads) {\n const agents = listAgents(squadsDir, squadName);\n const lead = agents.find(a => a.name.includes('lead'))?.name || agents[0]?.name || '-';\n\n const row = ` ${colors.purple}${box.vertical}${RESET} ` +\n `${colors.cyan}${padEnd(squadName, w.name)}${RESET}` +\n `${padEnd(String(agents.length), w.agents)}` +\n `${colors.dim}${padEnd(lead, w.lead)}${RESET}` +\n `${colors.purple}${box.vertical}${RESET}`;\n\n writeLine(row);\n }\n\n writeLine(` ${colors.purple}${box.bottomLeft}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.bottomRight}${RESET}`);\n writeLine();\n }\n\n if (!options.squads && options.agents) {\n // Show agents list\n writeLine(` ${bold}Agents${RESET}`);\n writeLine();\n\n for (const agent of allAgents) {\n const squadPart = agent.squad ? `${colors.dim}${agent.squad}/${RESET}` : '';\n const statusIcon = agent.status?.toLowerCase() === 'active' ? icons.active : icons.pending;\n\n writeLine(` ${statusIcon} ${squadPart}${colors.white}${agent.name}${RESET}`);\n if (agent.role) {\n writeLine(` ${colors.dim}└ ${agent.role}${RESET}`);\n }\n }\n writeLine();\n }\n\n // Commands\n writeLine(` ${colors.dim}$${RESET} squads status ${colors.cyan}<squad>${RESET} ${colors.dim}Squad details${RESET}`);\n writeLine(` ${colors.dim}$${RESET} squads run ${colors.cyan}<squad>${RESET} ${colors.dim}Execute a squad${RESET}`);\n writeLine();\n}\n","import { existsSync, statSync } from 'fs';\nimport { join } from 'path';\nimport {\n findSquadsDir,\n loadSquad,\n listSquads,\n listAgents\n} from '../lib/squad-parser.js';\nimport { findMemoryDir, getSquadState } from '../lib/memory.js';\nimport { getLiveSessionSummaryAsync, cleanupStaleSessions } 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 box,\n padEnd,\n icons,\n writeLine,\n} from '../lib/terminal.js';\n\ninterface StatusOptions {\n verbose?: boolean;\n}\n\nexport async function statusCommand(\n squadName?: string,\n options: StatusOptions = {}\n): Promise<void> {\n 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 writeLine();\n writeLine(` ${gradient('squads')} ${colors.dim}status${RESET}`);\n\n // Check for updates (cached, non-blocking)\n const updateInfo = checkForUpdate();\n if (updateInfo.updateAvailable) {\n writeLine(` ${colors.cyan}⬆${RESET} Update available: ${colors.dim}${updateInfo.currentVersion}${RESET} → ${colors.green}${updateInfo.latestVersion}${RESET} ${colors.dim}(run \\`squads update\\`)${RESET}`);\n }\n\n // Session indicator line (only if there are active sessions)\n if (sessionSummary.totalSessions > 0) {\n const sessionText = sessionSummary.totalSessions === 1 ? 'session' : 'sessions';\n const squadText = sessionSummary.squadCount === 1 ? 'squad' : 'squads';\n\n // Build tool breakdown string (e.g., \"claude 4, cursor 2\")\n let toolInfo = '';\n if (sessionSummary.byTool && Object.keys(sessionSummary.byTool).length > 0) {\n const toolParts = Object.entries(sessionSummary.byTool)\n .sort((a, b) => b[1] - a[1]) // Sort by count descending\n .map(([tool, count]) => `${colors.dim}${tool}${RESET} ${colors.cyan}${count}${RESET}`);\n toolInfo = ` ${colors.dim}(${RESET}${toolParts.join(` ${colors.dim}·${RESET} `)}${colors.dim})${RESET}`;\n }\n\n writeLine(` ${colors.green}${icons.active}${RESET} ${colors.white}${sessionSummary.totalSessions}${RESET} active ${sessionText} ${colors.dim}across${RESET} ${colors.cyan}${sessionSummary.squadCount}${RESET} ${squadText}${toolInfo}`);\n }\n writeLine();\n\n // Stats row\n const totalSquads = squads.length;\n const activeCount = squads.length; // All loaded squads are \"active\"\n writeLine(` ${colors.cyan}${activeCount}${RESET}/${totalSquads} squads ${colors.dim}│${RESET} ${colors.dim}memory: ${memoryDir ? 'enabled' : 'none'}${RESET}`);\n writeLine();\n\n // Table\n const w = { name: 16, agents: 8, memory: 14, activity: 12 };\n const tableWidth = w.name + w.agents + w.memory + w.activity + 6;\n\n writeLine(` ${colors.purple}${box.topLeft}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.topRight}${RESET}`);\n\n const header = ` ${colors.purple}${box.vertical}${RESET} ` +\n `${bold}${padEnd('SQUAD', w.name)}${RESET}` +\n `${bold}${padEnd('AGENTS', w.agents)}${RESET}` +\n `${bold}${padEnd('MEMORY', w.memory)}${RESET}` +\n `${bold}ACTIVITY${RESET}` +\n ` ${colors.purple}${box.vertical}${RESET}`;\n writeLine(header);\n\n writeLine(` ${colors.purple}${box.teeRight}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.teeLeft}${RESET}`);\n\n for (const squadName of squads) {\n const agents = listAgents(squadsDir, squadName);\n\n // Check memory\n let memoryStatus = `${colors.dim}none${RESET}`;\n let lastActivity = `${colors.dim}—${RESET}`;\n let activityColor = colors.dim;\n\n if (memoryDir) {\n const squadMemoryPath = join(memoryDir, squadName);\n if (existsSync(squadMemoryPath)) {\n const states = getSquadState(squadName);\n memoryStatus = `${colors.green}${states.length} ${states.length === 1 ? 'entry' : 'entries'}${RESET}`;\n\n // Find most recent file\n let mostRecent = 0;\n for (const state of states) {\n const stat = statSync(state.path);\n if (stat.mtimeMs > mostRecent) {\n mostRecent = stat.mtimeMs;\n }\n }\n\n if (mostRecent > 0) {\n const daysAgo = Math.floor((Date.now() - mostRecent) / (1000 * 60 * 60 * 24));\n if (daysAgo === 0) {\n lastActivity = 'today';\n activityColor = colors.green;\n } else if (daysAgo === 1) {\n lastActivity = 'yesterday';\n activityColor = colors.green;\n } else if (daysAgo < 7) {\n lastActivity = `${daysAgo}d ago`;\n activityColor = colors.yellow;\n } else {\n lastActivity = `${daysAgo}d ago`;\n activityColor = colors.dim;\n }\n }\n }\n }\n\n const row = ` ${colors.purple}${box.vertical}${RESET} ` +\n `${colors.cyan}${padEnd(squadName, w.name)}${RESET}` +\n `${padEnd(String(agents.length), w.agents)}` +\n `${padEnd(memoryStatus, w.memory)}` +\n `${padEnd(`${activityColor}${lastActivity}${RESET}`, w.activity)}` +\n `${colors.purple}${box.vertical}${RESET}`;\n\n writeLine(row);\n }\n\n writeLine(` ${colors.purple}${box.bottomLeft}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.bottomRight}${RESET}`);\n writeLine();\n\n // Commands\n writeLine(` ${colors.dim}$${RESET} squads status ${colors.cyan}<squad>${RESET} ${colors.dim}Squad details${RESET}`);\n writeLine(` ${colors.dim}$${RESET} squads dash ${colors.dim}Full dashboard${RESET}`);\n writeLine(` ${colors.dim}$${RESET} squads run ${colors.cyan}<squad>${RESET} ${colors.dim}Execute a squad${RESET}`);\n writeLine();\n}\n\nasync function showSquadStatus(\n squadName: string,\n squadsDir: string,\n options: StatusOptions\n): Promise<void> {\n const squad = loadSquad(squadName);\n\n if (!squad) {\n writeLine(`${colors.red}Squad \"${squadName}\" not found.${RESET}`);\n process.exit(1);\n }\n\n writeLine();\n writeLine(` ${gradient('squads')} ${colors.dim}status${RESET} ${colors.cyan}${squad.name}${RESET}`);\n writeLine();\n\n // Mission\n if (squad.mission) {\n writeLine(` ${colors.dim}${squad.mission}${RESET}`);\n writeLine();\n }\n\n // Agents table\n const agents = listAgents(squadsDir, squadName);\n const w = { name: 24, role: 36 };\n const tableWidth = w.name + w.role + 4;\n\n writeLine(` ${bold}Agents${RESET} ${colors.dim}(${agents.length})${RESET}`);\n writeLine();\n\n writeLine(` ${colors.purple}${box.topLeft}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.topRight}${RESET}`);\n\n for (const agent of agents) {\n const status = agent.status?.toLowerCase() === 'active'\n ? icons.active\n : icons.pending;\n\n const role = options.verbose && agent.role\n ? `${colors.dim}${agent.role.substring(0, w.role - 2)}${RESET}`\n : '';\n\n const row = ` ${colors.purple}${box.vertical}${RESET} ` +\n `${status} ${padEnd(agent.name, w.name - 2)}` +\n `${padEnd(role, w.role)}` +\n `${colors.purple}${box.vertical}${RESET}`;\n\n writeLine(row);\n }\n\n writeLine(` ${colors.purple}${box.bottomLeft}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.bottomRight}${RESET}`);\n\n // Pipelines\n if (squad.pipelines.length > 0) {\n writeLine();\n writeLine(` ${bold}Pipelines${RESET}`);\n for (const pipeline of squad.pipelines) {\n writeLine(` ${colors.dim}${pipeline.agents.join(' → ')}${RESET}`);\n }\n }\n\n // Memory state\n const memoryDir = findMemoryDir();\n if (memoryDir) {\n const states = getSquadState(squadName);\n\n if (states.length > 0) {\n writeLine();\n writeLine(` ${bold}Memory${RESET} ${colors.dim}(${states.length} ${states.length === 1 ? 'entry' : 'entries'})${RESET}`);\n writeLine();\n\n for (const state of states) {\n const updated = state.content.match(/Updated:\\s*(\\S+)/)?.[1] || 'unknown';\n writeLine(` ${icons.progress} ${colors.white}${state.agent}${RESET}`);\n writeLine(` ${colors.dim}└ updated: ${updated}${RESET}`);\n\n if (options.verbose) {\n const signalsMatch = state.content.match(/## Active Signals([\\s\\S]*?)(?=##|$)/);\n if (signalsMatch) {\n const signalLines = signalsMatch[1]\n .split('\\n')\n .filter(l => l.match(/^\\d+\\./))\n .slice(0, 3);\n\n for (const sig of signalLines) {\n writeLine(` ${colors.dim} ${sig.trim()}${RESET}`);\n }\n }\n }\n }\n }\n }\n\n writeLine();\n writeLine(` ${colors.dim}$${RESET} squads run ${colors.cyan}${squadName}${RESET} ${colors.dim}Run the squad${RESET}`);\n writeLine(` ${colors.dim}$${RESET} squads memory show ${colors.cyan}${squadName}${RESET} ${colors.dim}View full memory${RESET}`);\n writeLine(` ${colors.dim}$${RESET} squads status ${colors.cyan}${squadName}${RESET} -v ${colors.dim}Verbose status${RESET}`);\n writeLine();\n}\n","import { existsSync, readFileSync, writeFileSync, mkdirSync, copyFileSync } from 'fs';\nimport { join, dirname } from 'path';\nimport { homedir } from 'os';\nimport { execSync, spawn } from 'child_process';\nimport { createInterface } from 'readline';\nimport { fileURLToPath } from 'url';\nimport {\n colors,\n bold,\n RESET,\n gradient,\n icons,\n writeLine,\n box,\n padEnd,\n} from '../lib/terminal.js';\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\ninterface StackConfig {\n SQUADS_DATABASE_URL: string;\n SQUADS_BRIDGE_URL: string;\n LANGFUSE_HOST: string;\n LANGFUSE_PUBLIC_KEY: string;\n LANGFUSE_SECRET_KEY: string;\n REDIS_URL: string;\n}\n\ninterface ContainerStatus {\n name: string;\n running: boolean;\n healthy: boolean;\n port?: string;\n}\n\nconst DEFAULT_CONFIG: StackConfig = {\n SQUADS_DATABASE_URL: 'postgresql://squads:squads@localhost:5433/squads',\n SQUADS_BRIDGE_URL: 'http://localhost:8088',\n LANGFUSE_HOST: 'http://localhost:3100',\n LANGFUSE_PUBLIC_KEY: '',\n LANGFUSE_SECRET_KEY: '',\n REDIS_URL: 'redis://localhost:6379',\n};\n\nconst CONFIG_PATH = join(homedir(), '.squadsrc');\nconst SQUADS_DATA_DIR = join(homedir(), '.squads');\n\n/**\n * Service requirements and setup guidance\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: 'Captures conversations and telemetry',\n required: true,\n healthUrl: 'http://localhost:8088/health',\n envVars: ['SQUADS_BRIDGE_URL'],\n setupGuide: [\n 'Run: squads stack up',\n 'Or manually: docker compose up -d bridge',\n ],\n },\n postgres: {\n name: 'PostgreSQL',\n description: 'Stores conversations and telemetry data',\n required: true,\n envVars: ['SQUADS_DATABASE_URL'],\n setupGuide: [\n 'Run: squads stack up',\n 'Or manually: docker compose up -d postgres',\n ],\n },\n mem0: {\n name: 'Mem0 (Engram)',\n description: 'Extracts and stores memories from conversations',\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 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\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 // Check container\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 // Check HTTP health if available\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 stack init${RESET}`);\n writeLine();\n}\n\n/**\n * Prompt user for input\n */\nasync function prompt(question: string, defaultValue?: string): Promise<string> {\n const rl = createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n const suffix = defaultValue ? ` [${defaultValue}]` : '';\n\n return new Promise((resolve) => {\n rl.question(` ${question}${suffix}: `, (answer) => {\n rl.close();\n resolve(answer.trim() || defaultValue || '');\n });\n });\n}\n\n/**\n * Prompt yes/no\n */\nasync function confirm(question: string, defaultYes = true): Promise<boolean> {\n const suffix = defaultYes ? '[Y/n]' : '[y/N]';\n const answer = await prompt(`${question} ${suffix}`);\n if (!answer) return defaultYes;\n return answer.toLowerCase().startsWith('y');\n}\n\n/**\n * Find package docker directory (from npm package or local dev)\n */\nfunction findPackageDockerDir(): string | null {\n const candidates = [\n // From npm package (relative to dist/commands/stack.js)\n join(__dirname, '..', '..', 'docker'),\n // Local development\n join(process.cwd(), 'docker'),\n join(process.cwd(), '..', 'squads-cli', 'docker'),\n join(homedir(), 'agents-squads', 'squads-cli', 'docker'),\n ];\n\n for (const dir of candidates) {\n if (existsSync(join(dir, 'docker-compose.yml'))) {\n return dir;\n }\n }\n\n return null;\n}\n\n/**\n * Load config from ~/.squadsrc\n */\nexport function loadStackConfig(): Partial<StackConfig> | null {\n if (!existsSync(CONFIG_PATH)) {\n return null;\n }\n\n try {\n const content = readFileSync(CONFIG_PATH, 'utf-8');\n const config: Partial<StackConfig> = {};\n\n for (const line of content.split('\\n')) {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith('#')) continue;\n\n const match = trimmed.match(/^export\\s+(\\w+)=[\"']?([^\"'\\n]*)[\"']?$/);\n if (match) {\n const [, key, value] = match;\n if (key in DEFAULT_CONFIG) {\n (config as Record<string, string>)[key] = value;\n }\n }\n }\n\n return config;\n } catch {\n return null;\n }\n}\n\n/**\n * Save config to ~/.squadsrc\n */\nfunction saveStackConfig(config: StackConfig): void {\n const lines = [\n '# Squads CLI Local Stack Configuration',\n '# Generated by: squads stack init',\n `# Date: ${new Date().toISOString().split('T')[0]}`,\n '',\n '# Database',\n `export SQUADS_DATABASE_URL=\"${config.SQUADS_DATABASE_URL}\"`,\n '',\n '# Bridge API',\n `export SQUADS_BRIDGE_URL=\"${config.SQUADS_BRIDGE_URL}\"`,\n '',\n '# Langfuse',\n `export LANGFUSE_HOST=\"${config.LANGFUSE_HOST}\"`,\n `export LANGFUSE_PUBLIC_KEY=\"${config.LANGFUSE_PUBLIC_KEY}\"`,\n `export LANGFUSE_SECRET_KEY=\"${config.LANGFUSE_SECRET_KEY}\"`,\n '',\n '# Redis',\n `export REDIS_URL=\"${config.REDIS_URL}\"`,\n '',\n '# To activate: source ~/.squadsrc',\n '',\n ];\n\n writeFileSync(CONFIG_PATH, lines.join('\\n'));\n}\n\n/**\n * Apply config to current process environment\n */\nexport function applyStackConfig(): void {\n const config = loadStackConfig();\n if (!config) return;\n\n for (const [key, value] of Object.entries(config)) {\n if (value && !process.env[key]) {\n process.env[key] = value;\n }\n }\n}\n\n/**\n * Check if Docker is running\n */\nfunction isDockerRunning(): boolean {\n try {\n execSync('docker info', { stdio: 'ignore' });\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Get container status\n */\nfunction getContainerStatus(name: string): ContainerStatus {\n try {\n // First check if container is running\n const runningOutput = execSync(\n `docker inspect ${name} --format '{{.State.Running}}'`,\n { encoding: 'utf-8', stdio: ['pipe', 'pipe', 'ignore'] }\n ).trim();\n\n const running = runningOutput === 'true';\n\n if (!running) {\n return { name, running: false, healthy: false };\n }\n\n // Get port info\n let port: string | undefined;\n try {\n const portOutput = execSync(\n `docker inspect ${name} --format '{{range .NetworkSettings.Ports}}{{range .}}{{.HostPort}}{{end}}{{end}}'`,\n { encoding: 'utf-8', stdio: ['pipe', 'pipe', 'ignore'] }\n ).trim();\n port = portOutput || undefined;\n } catch {\n // Ignore port errors\n }\n\n // Check health status (may not exist for all containers)\n let healthy = true; // Default to healthy if running but no health check\n try {\n const healthOutput = execSync(\n `docker inspect ${name} --format '{{if .State.Health}}{{.State.Health.Status}}{{else}}none{{end}}'`,\n { encoding: 'utf-8', stdio: ['pipe', 'pipe', 'ignore'] }\n ).trim();\n\n if (healthOutput === 'healthy' || healthOutput === 'none') {\n healthy = true;\n } else if (healthOutput === 'starting') {\n healthy = false; // Starting means not yet healthy\n } else {\n healthy = false; // unhealthy or other states\n }\n } catch {\n // If health check fails, assume healthy if running\n healthy = true;\n }\n\n return { name, running, healthy, port };\n } catch {\n return { name, running: false, healthy: false };\n }\n}\n\n/**\n * Check service connectivity\n */\nasync function checkService(url: string, timeout = 2000): Promise<boolean> {\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeout);\n\n const response = await fetch(url, { signal: controller.signal });\n clearTimeout(timeoutId);\n return response.ok;\n } catch {\n return false;\n }\n}\n\n/**\n * Get Langfuse API keys from the docker .env file\n */\nfunction getLangfuseKeysFromDockerEnv(): { publicKey: string; secretKey: string } | null {\n const envPaths = [\n join(process.cwd(), 'docker', '.env'),\n join(process.cwd(), '..', 'squads-cli', 'docker', '.env'),\n join(homedir(), 'agents-squads', 'squads-cli', 'docker', '.env'),\n ];\n\n for (const envPath of envPaths) {\n if (existsSync(envPath)) {\n const content = readFileSync(envPath, 'utf-8');\n const publicMatch = content.match(/LANGFUSE_PUBLIC_KEY=(\\S+)/);\n const secretMatch = content.match(/LANGFUSE_SECRET_KEY=(\\S+)/);\n\n if (publicMatch && secretMatch) {\n return {\n publicKey: publicMatch[1],\n secretKey: secretMatch[1],\n };\n }\n }\n }\n\n return null;\n}\n\n/**\n * Find docker-compose directory\n */\nfunction findDockerComposeDir(): string | null {\n const candidates = [\n join(process.cwd(), 'docker'),\n join(process.cwd(), '..', 'squads-cli', 'docker'),\n join(homedir(), 'agents-squads', 'squads-cli', 'docker'),\n ];\n\n for (const dir of candidates) {\n if (existsSync(join(dir, 'docker-compose.yml'))) {\n return dir;\n }\n }\n\n return null;\n}\n\n/**\n * squads stack init - setup wizard for local stack\n */\nexport async function stackInitCommand(): Promise<void> {\n writeLine();\n writeLine(` ${gradient('squads')} ${colors.dim}stack init${RESET}`);\n writeLine();\n writeLine(` ${bold}Local Infrastructure Setup Wizard${RESET}`);\n writeLine(` ${colors.dim}This will configure Docker services for conversation capture,${RESET}`);\n writeLine(` ${colors.dim}memory extraction, and telemetry.${RESET}`);\n writeLine();\n\n // Step 1: Check Docker\n writeLine(` ${bold}Step 1: Docker${RESET}`);\n if (!isDockerRunning()) {\n writeLine(` ${colors.red}${icons.error}${RESET} Docker is not running`);\n writeLine();\n writeLine(` ${colors.dim}Please start Docker Desktop and run this command again.${RESET}`);\n writeLine();\n return;\n }\n writeLine(` ${colors.green}${icons.success}${RESET} Docker is running`);\n writeLine();\n\n // Step 2: Find or setup docker compose files\n writeLine(` ${bold}Step 2: Docker Compose Files${RESET}`);\n\n let composeDir = findPackageDockerDir();\n const targetDir = join(SQUADS_DATA_DIR, 'docker');\n\n if (!composeDir) {\n writeLine(` ${colors.red}${icons.error}${RESET} Docker compose files not found`);\n writeLine(` ${colors.dim}This shouldn't happen if you installed via npm.${RESET}`);\n writeLine(` ${colors.dim}Try reinstalling: npm install -g squads-cli${RESET}`);\n writeLine();\n return;\n }\n\n // Copy to ~/.squads/docker if not already there\n if (composeDir !== targetDir && !existsSync(targetDir)) {\n writeLine(` ${colors.cyan}${icons.progress}${RESET} Copying docker files to ${colors.dim}~/.squads/docker${RESET}`);\n try {\n mkdirSync(SQUADS_DATA_DIR, { recursive: true });\n mkdirSync(targetDir, { recursive: true });\n\n // Copy essential files\n const filesToCopy = [\n 'docker-compose.yml',\n 'docker-compose.engram.yml',\n '.env.example',\n ];\n\n for (const file of filesToCopy) {\n const src = join(composeDir, file);\n const dst = join(targetDir, file);\n if (existsSync(src)) {\n copyFileSync(src, dst);\n }\n }\n\n composeDir = targetDir;\n writeLine(` ${colors.green}${icons.success}${RESET} Files copied`);\n } catch {\n writeLine(` ${colors.yellow}${icons.warning}${RESET} Could not copy files, using source location`);\n }\n } else if (existsSync(targetDir)) {\n composeDir = targetDir;\n writeLine(` ${colors.green}${icons.success}${RESET} Using ${colors.dim}~/.squads/docker${RESET}`);\n } else {\n writeLine(` ${colors.green}${icons.success}${RESET} Using ${colors.dim}${composeDir}${RESET}`);\n }\n writeLine();\n\n // Step 3: Configure .env\n writeLine(` ${bold}Step 3: Environment Configuration${RESET}`);\n\n const envPath = join(composeDir, '.env');\n const envExamplePath = join(composeDir, '.env.example');\n\n if (!existsSync(envPath)) {\n if (existsSync(envExamplePath)) {\n copyFileSync(envExamplePath, envPath);\n writeLine(` ${colors.cyan}${icons.progress}${RESET} Created .env from template`);\n } else {\n // Create minimal .env\n const minimalEnv = `# Squads Local Stack Configuration\n# Generated by: squads stack init\n\n# Langfuse API Keys (get from http://localhost:3100 after first run)\nLANGFUSE_PUBLIC_KEY=\nLANGFUSE_SECRET_KEY=\nLANGFUSE_HOST=http://langfuse:3000\n\n# Mem0/Engram LLM Provider\n# Options: ollama (free, local), openai (requires API key)\nLLM_PROVIDER=ollama\nOLLAMA_BASE_URL=http://host.docker.internal:11434\nOLLAMA_LLM_MODEL=qwen3:latest\nOLLAMA_EMBEDDING_MODEL=nomic-embed-text:latest\n\n# For OpenAI (if LLM_PROVIDER=openai)\n# OPENAI_API_KEY=sk-...\n\n# Ports (defaults)\nPOSTGRES_PORT=5433\nREDIS_PORT=6379\nLANGFUSE_PORT=3100\nOTEL_PORT=4318\nBRIDGE_PORT=8088\n`;\n writeFileSync(envPath, minimalEnv);\n writeLine(` ${colors.cyan}${icons.progress}${RESET} Created default .env`);\n }\n } else {\n writeLine(` ${colors.green}${icons.success}${RESET} .env exists`);\n }\n\n // Check for required secrets\n const envContent = readFileSync(envPath, 'utf-8');\n const missingSecrets: string[] = [];\n\n // Check LLM provider config\n const llmProvider = envContent.match(/LLM_PROVIDER=(\\w+)/)?.[1] || 'ollama';\n\n if (llmProvider === 'openai') {\n if (!envContent.match(/OPENAI_API_KEY=\\S+/)) {\n missingSecrets.push('OPENAI_API_KEY');\n }\n }\n\n if (missingSecrets.length > 0) {\n writeLine();\n writeLine(` ${colors.yellow}${icons.warning}${RESET} Missing secrets in .env:`);\n for (const secret of missingSecrets) {\n writeLine(` ${colors.red}•${RESET} ${secret}`);\n }\n writeLine();\n writeLine(` ${colors.dim}Edit: ${envPath}${RESET}`);\n }\n writeLine();\n\n // Step 4: Start containers\n writeLine(` ${bold}Step 4: Start Services${RESET}`);\n\n const containers = [\n { name: 'squads-postgres', required: true },\n { name: 'squads-redis', required: true },\n { name: 'squads-bridge', required: true },\n { name: 'squads-langfuse', required: false },\n { name: 'squads-otel-collector', required: false },\n { name: 'squads-mem0', required: false },\n ];\n\n const statuses = containers.map(c => ({ ...c, ...getContainerStatus(c.name) }));\n const requiredNotRunning = statuses.filter(s => s.required && !s.running);\n\n for (const status of statuses) {\n const icon = status.running\n ? status.healthy\n ? `${colors.green}●${RESET}`\n : `${colors.yellow}●${RESET}`\n : `${colors.red}○${RESET}`;\n const suffix = status.required ? '' : `${colors.dim}(optional)${RESET}`;\n writeLine(` ${icon} ${status.name} ${suffix}`);\n }\n writeLine();\n\n if (requiredNotRunning.length > 0) {\n const shouldStart = await confirm('Start required services now?');\n\n if (shouldStart) {\n writeLine();\n writeLine(` ${colors.cyan}${icons.progress}${RESET} Starting containers...`);\n\n try {\n execSync('docker compose up -d', {\n cwd: composeDir,\n stdio: 'inherit',\n });\n\n // Wait for services to be healthy\n writeLine(` ${colors.cyan}${icons.progress}${RESET} Waiting for services to be ready...`);\n await new Promise(resolve => setTimeout(resolve, 5000));\n\n writeLine(` ${colors.green}${icons.success}${RESET} Services started`);\n } catch {\n writeLine(` ${colors.red}${icons.error}${RESET} Failed to start services`);\n writeLine(` ${colors.dim}Try manually: cd ${composeDir} && docker compose up -d${RESET}`);\n }\n }\n writeLine();\n }\n\n // Step 5: Get Langfuse keys\n writeLine(` ${bold}Step 5: Langfuse API Keys${RESET}`);\n\n const langfuseKeys = getLangfuseKeysFromDockerEnv();\n\n if (!langfuseKeys?.publicKey || !langfuseKeys?.secretKey) {\n writeLine(` ${colors.yellow}${icons.warning}${RESET} Langfuse API keys not configured`);\n writeLine();\n writeLine(` ${colors.dim}To enable telemetry:${RESET}`);\n writeLine(` ${colors.dim}1. Open http://localhost:3100${RESET}`);\n writeLine(` ${colors.dim}2. Create account and project${RESET}`);\n writeLine(` ${colors.dim}3. Copy API keys to ${envPath}${RESET}`);\n writeLine(` ${colors.dim}4. Run: squads stack init (again)${RESET}`);\n } else {\n writeLine(` ${colors.green}${icons.success}${RESET} Langfuse keys configured`);\n }\n writeLine();\n\n // Step 6: Create ~/.squadsrc\n writeLine(` ${bold}Step 6: CLI Configuration${RESET}`);\n\n const config: StackConfig = {\n ...DEFAULT_CONFIG,\n LANGFUSE_PUBLIC_KEY: langfuseKeys?.publicKey || '',\n LANGFUSE_SECRET_KEY: langfuseKeys?.secretKey || '',\n };\n\n saveStackConfig(config);\n writeLine(` ${colors.green}${icons.success}${RESET} Config saved to ${colors.cyan}~/.squadsrc${RESET}`);\n writeLine();\n\n // Final summary\n writeLine(` ${colors.green}${bold}Setup Complete!${RESET}`);\n writeLine();\n writeLine(` ${colors.dim}To activate environment:${RESET}`);\n writeLine(` ${colors.cyan}source ~/.squadsrc${RESET}`);\n writeLine();\n writeLine(` ${colors.dim}Add to ~/.zshrc for persistence:${RESET}`);\n writeLine(` ${colors.cyan}[ -f ~/.squadsrc ] && source ~/.squadsrc${RESET}`);\n writeLine();\n writeLine(` ${colors.dim}Check status anytime:${RESET}`);\n writeLine(` ${colors.cyan}squads stack health${RESET}`);\n writeLine();\n}\n\n/**\n * squads stack status - show connection health\n */\nexport async function stackStatusCommand(): Promise<void> {\n writeLine();\n writeLine(` ${gradient('squads')} ${colors.dim}stack status${RESET}`);\n writeLine();\n\n // Check Docker\n if (!isDockerRunning()) {\n writeLine(` ${colors.red}${icons.error}${RESET} Docker is not running`);\n writeLine();\n return;\n }\n\n // Container status\n const containers = [\n { name: 'squads-postgres', service: 'Database' },\n { name: 'squads-redis', service: 'Cache' },\n { name: 'squads-bridge', service: 'Bridge API' },\n { name: 'squads-langfuse', service: 'Langfuse' },\n { name: 'squads-otel-collector', service: 'Telemetry' },\n ];\n\n const w = { service: 12, container: 22, status: 12 };\n const tableWidth = w.service + w.container + w.status + 6;\n\n writeLine(` ${colors.purple}${box.topLeft}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.topRight}${RESET}`);\n writeLine(\n ` ${colors.purple}${box.vertical}${RESET} ${bold}${padEnd('SERVICE', w.service)}${RESET}${bold}${padEnd('CONTAINER', w.container)}${RESET}${bold}STATUS${RESET} ${colors.purple}${box.vertical}${RESET}`\n );\n writeLine(` ${colors.purple}${box.teeRight}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.teeLeft}${RESET}`);\n\n for (const { name, service } of containers) {\n const status = getContainerStatus(name);\n const statusIcon = status.running\n ? status.healthy\n ? `${colors.green}● healthy${RESET}`\n : `${colors.yellow}● starting${RESET}`\n : `${colors.red}○ stopped${RESET}`;\n\n writeLine(\n ` ${colors.purple}${box.vertical}${RESET} ${colors.cyan}${padEnd(service, w.service)}${RESET}${colors.dim}${padEnd(name, w.container)}${RESET}${statusIcon} ${colors.purple}${box.vertical}${RESET}`\n );\n }\n\n writeLine(` ${colors.purple}${box.bottomLeft}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.bottomRight}${RESET}`);\n\n // Config status\n writeLine();\n const config = loadStackConfig();\n if (config) {\n writeLine(` ${colors.green}${icons.success}${RESET} Config loaded from ${colors.cyan}~/.squadsrc${RESET}`);\n\n // Check if env vars are set\n const envVars = ['SQUADS_DATABASE_URL', 'SQUADS_BRIDGE_URL', 'LANGFUSE_HOST'];\n const missing = envVars.filter((v) => !process.env[v]);\n\n if (missing.length > 0) {\n writeLine(` ${colors.yellow}${icons.warning}${RESET} Env vars not in shell: ${colors.dim}${missing.join(', ')}${RESET}`);\n writeLine(` ${colors.dim}Run: source ~/.squadsrc${RESET}`);\n } else {\n writeLine(` ${colors.green}${icons.success}${RESET} All env vars loaded`);\n }\n } else {\n writeLine(` ${colors.yellow}${icons.warning}${RESET} No config found`);\n writeLine(` ${colors.dim}Run: squads stack init${RESET}`);\n }\n\n writeLine();\n}\n\n/**\n * squads stack env - print export commands\n */\nexport function stackEnvCommand(): void {\n const config = loadStackConfig();\n\n if (!config) {\n // Output defaults if no config\n console.log(`# Squads Local Stack - Default Config`);\n console.log(`# Run 'squads stack init' to auto-detect and save`);\n console.log();\n for (const [key, value] of Object.entries(DEFAULT_CONFIG)) {\n console.log(`export ${key}=\"${value}\"`);\n }\n return;\n }\n\n // Output saved config\n console.log(`# Squads Local Stack Config`);\n console.log(`# From: ~/.squadsrc`);\n console.log();\n for (const [key, value] of Object.entries(config)) {\n console.log(`export ${key}=\"${value}\"`);\n }\n}\n\n/**\n * squads stack up - start docker compose\n */\nexport async function stackUpCommand(): Promise<void> {\n writeLine();\n writeLine(` ${gradient('squads')} ${colors.dim}stack up${RESET}`);\n writeLine();\n\n const composeDir = findDockerComposeDir();\n\n if (!composeDir) {\n writeLine(` ${colors.red}${icons.error}${RESET} docker-compose.yml not found`);\n writeLine();\n writeLine(` ${colors.dim}Expected locations:${RESET}`);\n writeLine(` ${colors.dim} ./docker/docker-compose.yml${RESET}`);\n writeLine(` ${colors.dim} ~/agents-squads/squads-cli/docker/docker-compose.yml${RESET}`);\n writeLine();\n return;\n }\n\n writeLine(` ${colors.cyan}${icons.progress}${RESET} Starting containers from ${colors.dim}${composeDir}${RESET}`);\n writeLine();\n\n try {\n const child = spawn('docker-compose', ['up', '-d'], {\n cwd: composeDir,\n stdio: 'inherit',\n });\n\n await new Promise<void>((resolve, reject) => {\n child.on('close', (code) => {\n if (code === 0) resolve();\n else reject(new Error(`docker-compose exited with code ${code}`));\n });\n child.on('error', reject);\n });\n\n writeLine();\n writeLine(` ${colors.green}${icons.success}${RESET} Stack started`);\n writeLine(` ${colors.dim}Run: squads stack init${RESET} to configure CLI`);\n writeLine();\n } catch (error) {\n writeLine(` ${colors.red}${icons.error}${RESET} Failed to start stack`);\n writeLine(` ${colors.dim}${error}${RESET}`);\n writeLine();\n }\n}\n\n/**\n * squads stack health - comprehensive health check with diagnostics\n */\nexport async function stackHealthCommand(verbose = false): Promise<void> {\n writeLine();\n writeLine(` ${gradient('squads')} ${colors.dim}stack health${RESET}`);\n writeLine();\n\n // Check Docker\n if (!isDockerRunning()) {\n writeLine(` ${colors.red}${icons.error}${RESET} Docker is not running`);\n writeLine();\n process.exitCode = 1;\n return;\n }\n\n // All containers including engram stack\n const containers = [\n { name: 'squads-postgres', service: 'postgres', healthUrl: '', critical: true },\n { name: 'squads-redis', service: 'redis', healthUrl: '', critical: true },\n { name: 'squads-neo4j', service: 'neo4j', healthUrl: 'http://localhost:7474', critical: false },\n { name: 'squads-bridge', service: 'bridge', healthUrl: 'http://localhost:8088/health', critical: true },\n { name: 'squads-otel-collector', service: 'otel', healthUrl: '', critical: false },\n { name: 'squads-langfuse', service: 'langfuse', healthUrl: 'http://localhost:3100/api/public/health', critical: false },\n { name: 'squads-mem0', service: 'mem0', healthUrl: 'http://localhost:8000/health', critical: false },\n { name: 'squads-engram-mcp', service: 'engram', healthUrl: 'http://localhost:8080/', critical: false },\n ];\n\n let hasFailures = false;\n const results: Array<{ name: string; service: string; ok: boolean; status: string; logs?: string }> = [];\n\n for (const container of containers) {\n const status = getContainerStatus(container.name);\n let ok = status.running && status.healthy;\n let statusText = '';\n\n if (!status.running) {\n statusText = 'stopped';\n ok = false;\n } else if (!status.healthy) {\n statusText = 'unhealthy';\n ok = false;\n } else if (container.healthUrl) {\n // Additional HTTP health check\n const httpOk = await checkService(container.healthUrl);\n if (!httpOk) {\n statusText = 'not responding';\n ok = false;\n } else {\n statusText = 'healthy';\n }\n } else {\n statusText = 'healthy';\n }\n\n // Get logs if unhealthy\n let logs: string | undefined;\n if (!ok && verbose) {\n try {\n logs = execSync(`docker logs ${container.name} --tail 10 2>&1`, {\n encoding: 'utf-8',\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n } catch {\n logs = '(no logs available)';\n }\n }\n\n if (!ok && container.critical) {\n hasFailures = true;\n }\n\n results.push({ name: container.name, service: container.service, ok, status: statusText, logs });\n }\n\n // Display results\n for (const r of results) {\n const icon = r.ok ? `${colors.green}✓${RESET}` : `${colors.red}✗${RESET}`;\n const statusColor = r.ok ? colors.green : colors.red;\n writeLine(` ${icon} ${padEnd(r.service, 10)} ${statusColor}${r.status}${RESET}`);\n\n if (r.logs && !r.ok) {\n writeLine(` ${colors.dim}${'-'.repeat(40)}${RESET}`);\n for (const line of r.logs.split('\\n').slice(0, 5)) {\n writeLine(` ${colors.dim}${line.substring(0, 70)}${RESET}`);\n }\n }\n }\n\n writeLine();\n\n // Summary\n const healthy = results.filter((r) => r.ok).length;\n const total = results.length;\n\n if (hasFailures) {\n writeLine(` ${colors.red}${icons.error}${RESET} ${healthy}/${total} services healthy - critical failures`);\n writeLine(` ${colors.dim}Run with -v for logs: squads stack health -v${RESET}`);\n process.exitCode = 1;\n } else if (healthy < total) {\n writeLine(` ${colors.yellow}${icons.warning}${RESET} ${healthy}/${total} services healthy - non-critical issues`);\n } else {\n writeLine(` ${colors.green}${icons.success}${RESET} ${healthy}/${total} services healthy`);\n }\n\n writeLine();\n}\n\n/**\n * squads stack logs - show logs for a specific service\n */\nexport function stackLogsCommand(service: string, tail = 50): void {\n const containerMap: Record<string, string> = {\n postgres: 'squads-postgres',\n redis: 'squads-redis',\n neo4j: 'squads-neo4j',\n bridge: 'squads-bridge',\n otel: 'squads-otel-collector',\n langfuse: 'squads-langfuse',\n mem0: 'squads-mem0',\n engram: 'squads-engram-mcp',\n };\n\n const container = containerMap[service] || `squads-${service}`;\n\n try {\n execSync(`docker logs ${container} --tail ${tail}`, { stdio: 'inherit' });\n } catch {\n writeLine(` ${colors.red}${icons.error}${RESET} Container ${container} not found`);\n }\n}\n\n/**\n * squads stack down - stop docker compose\n */\nexport async function stackDownCommand(): Promise<void> {\n writeLine();\n writeLine(` ${gradient('squads')} ${colors.dim}stack down${RESET}`);\n writeLine();\n\n const composeDir = findDockerComposeDir();\n\n if (!composeDir) {\n writeLine(` ${colors.red}${icons.error}${RESET} docker-compose.yml not found`);\n writeLine();\n return;\n }\n\n writeLine(` ${colors.cyan}${icons.progress}${RESET} Stopping containers...`);\n writeLine();\n\n try {\n const child = spawn('docker-compose', ['down'], {\n cwd: composeDir,\n stdio: 'inherit',\n });\n\n await new Promise<void>((resolve, reject) => {\n child.on('close', (code) => {\n if (code === 0) resolve();\n else reject(new Error(`docker-compose exited with code ${code}`));\n });\n child.on('error', reject);\n });\n\n writeLine();\n writeLine(` ${colors.green}${icons.success}${RESET} Stack stopped`);\n writeLine();\n } catch (error) {\n writeLine(` ${colors.red}${icons.error}${RESET} Failed to stop stack`);\n writeLine(` ${colors.dim}${error}${RESET}`);\n writeLine();\n }\n}\n","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 './stack.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 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}Database not available${RESET}`);\n writeLine(` ${colors.dim}Run: docker compose up -d${RESET}`);\n writeLine();\n return;\n }\n throw new Error(`HTTP ${response.status}`);\n }\n\n const data = await response.json() as { results: ConversationResult[]; count: number };\n const conversations = data.results;\n const total = data.count;\n\n if (conversations.length === 0) {\n writeLine(` ${colors.yellow}No conversations found for \"${query}\"${RESET}`);\n writeLine();\n writeLine(` ${colors.dim}Conversations are captured via hooks. Make sure:${RESET}`);\n writeLine(` ${colors.dim} 1. squads-bridge is running (docker compose up)${RESET}`);\n writeLine(` ${colors.dim} 2. engram hook is configured in Claude settings${RESET}`);\n writeLine();\n return;\n }\n\n writeLine(` ${colors.green}${conversations.length}${RESET} of ${total} results`);\n writeLine();\n\n // Table\n const w = { time: 12, role: 10, type: 10, content: 50 };\n const tableWidth = w.time + w.role + w.type + w.content + 6;\n\n writeLine(` ${colors.purple}${box.topLeft}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.topRight}${RESET}`);\n\n const header = ` ${colors.purple}${box.vertical}${RESET} ` +\n `${bold}${padEnd('TIME', w.time)}${RESET}` +\n `${bold}${padEnd('ROLE', w.role)}${RESET}` +\n `${bold}${padEnd('TYPE', w.type)}${RESET}` +\n `${bold}${padEnd('CONTENT', w.content)}${RESET}` +\n ` ${colors.purple}${box.vertical}${RESET}`;\n writeLine(header);\n\n writeLine(` ${colors.purple}${box.teeRight}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.teeLeft}${RESET}`);\n\n for (const conv of conversations) {\n const time = new Date(conv.created_at).toLocaleTimeString('en-US', { hour: '2-digit', minute: '2-digit' });\n const roleColor = conv.role === 'user' ? colors.cyan : conv.role === 'thinking' ? colors.yellow : colors.green;\n const importanceIcon = conv.importance === 'high' ? icons.success : '';\n\n // Highlight search term in content\n const contentPreview = truncate((conv.content || '').replace(/\\n/g, ' '), w.content - 2);\n const highlighted = contentPreview.replace(\n new RegExp(query, 'gi'),\n (m) => `${colors.yellow}${m}${RESET}${colors.dim}`\n );\n\n const row = ` ${colors.purple}${box.vertical}${RESET} ` +\n `${colors.dim}${padEnd(time, w.time)}${RESET}` +\n `${roleColor}${padEnd(conv.role || '', w.role)}${RESET}` +\n `${colors.dim}${padEnd(conv.type || 'message', w.type)}${RESET}` +\n `${colors.dim}${padEnd(highlighted + importanceIcon, w.content)}${RESET}` +\n ` ${colors.purple}${box.vertical}${RESET}`;\n\n writeLine(row);\n }\n\n writeLine(` ${colors.purple}${box.bottomLeft}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.bottomRight}${RESET}`);\n writeLine();\n\n // Expanded view of top results\n writeLine(` ${bold}Top Matches${RESET}`);\n writeLine();\n\n for (const conv of conversations.slice(0, 3)) {\n const time = new Date(conv.created_at).toLocaleString('en-US', {\n month: 'short', day: 'numeric', hour: '2-digit', minute: '2-digit'\n });\n const roleIcon = conv.role === 'user' ? '👤' : conv.role === 'thinking' ? '💭' : '🤖';\n\n writeLine(` ${roleIcon} ${colors.dim}${time}${RESET} ${conv.importance === 'high' ? colors.yellow + '[high]' + RESET : ''}`);\n\n // Show first 200 chars with highlighted search term\n const content = conv.content || '';\n const preview = content.substring(0, 200).replace(/\\n/g, ' ');\n const highlighted = preview.replace(\n new RegExp(query, 'gi'),\n (m) => `${colors.yellow}${m}${RESET}`\n );\n writeLine(` ${highlighted}${content.length > 200 ? '...' : ''}`);\n writeLine();\n }\n\n // Commands\n writeLine(` ${colors.dim}$${RESET} squads memory search ${colors.cyan}\"<term>\"${RESET} --role user ${colors.dim}Filter by role${RESET}`);\n writeLine(` ${colors.dim}$${RESET} squads memory search ${colors.cyan}\"<term>\"${RESET} --importance high ${colors.dim}Filter by importance${RESET}`);\n writeLine();\n\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n if (errorMessage.includes('ECONNREFUSED') || 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 {\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 {\n // Not in a git repo or other error\n }\n\n return commits;\n}\n\nfunction detectSquadsFromCommit(commit: CommitInfo): string[] {\n const squads = new Set<string>();\n\n // Check file paths\n for (const file of commit.files) {\n for (const [pathPattern, squad] of Object.entries(PATH_TO_SQUAD)) {\n if (file.includes(pathPattern)) {\n squads.add(squad);\n }\n }\n }\n\n // Check commit message\n const msgLower = commit.message.toLowerCase();\n for (const [keyword, squad] of Object.entries(MESSAGE_TO_SQUAD)) {\n if (msgLower.includes(keyword)) {\n squads.add(squad);\n }\n }\n\n return Array.from(squads);\n}\n\nfunction groupCommitsBySquad(commits: CommitInfo[]): Map<string, CommitInfo[]> {\n const grouped = new Map<string, CommitInfo[]>();\n\n for (const commit of commits) {\n const squads = detectSquadsFromCommit(commit);\n\n for (const squad of squads) {\n if (!grouped.has(squad)) {\n grouped.set(squad, []);\n }\n grouped.get(squad)!.push(commit);\n }\n }\n\n return grouped;\n}\n\nfunction generateSummary(commits: CommitInfo[]): string {\n if (commits.length === 0) return '';\n\n const messages = commits.map(c => `- ${c.message}`).join('\\n');\n const date = new Date().toISOString().split('T')[0];\n\n return `\n## Session Update (${date})\n\n${messages}\n`;\n}\n\nfunction appendToSquadMemory(\n memoryDir: string,\n squad: string,\n summary: string\n): boolean {\n // Find the lead agent for this squad\n const squadMemoryDir = join(memoryDir, squad);\n\n if (!existsSync(squadMemoryDir)) {\n mkdirSync(squadMemoryDir, { recursive: true });\n }\n\n // Look for existing agent directories or create default\n let agentDir: string;\n const existingDirs = existsSync(squadMemoryDir)\n ? readdirSync(squadMemoryDir, { withFileTypes: true })\n .filter((d) => d.isDirectory())\n .map((d) => d.name)\n : [];\n\n if (existingDirs.length > 0) {\n // Use first existing agent (usually the lead)\n agentDir = join(squadMemoryDir, existingDirs[0]);\n } else {\n // Create default agent directory\n agentDir = join(squadMemoryDir, `${squad}-lead`);\n mkdirSync(agentDir, { recursive: true });\n }\n\n const statePath = join(agentDir, 'state.md');\n\n let content = '';\n if (existsSync(statePath)) {\n content = readFileSync(statePath, 'utf-8');\n } else {\n content = `# ${squad} Squad - State\\n\\nUpdated: ${new Date().toISOString().split('T')[0]}\\n`;\n }\n\n // Update the \"Updated\" line\n content = content.replace(\n /Updated:\\s*\\d{4}-\\d{2}-\\d{2}/,\n `Updated: ${new Date().toISOString().split('T')[0]}`\n );\n\n // Append the summary\n content += summary;\n\n writeFileSync(statePath, content);\n return true;\n}\n\n/**\n * Pull latest memory changes from git remote\n */\nfunction gitPullMemory(): { success: boolean; output: string; behind: number; ahead: number } {\n try {\n // First fetch to see what's different\n execSync('git fetch origin', { encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] });\n\n // Check how many commits behind/ahead\n const status = execSync('git status -sb', { encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] });\n const behindMatch = status.match(/behind (\\d+)/);\n const aheadMatch = status.match(/ahead (\\d+)/);\n const behind = behindMatch ? parseInt(behindMatch[1]) : 0;\n const ahead = aheadMatch ? parseInt(aheadMatch[1]) : 0;\n\n if (behind === 0) {\n return { success: true, output: 'Already up to date', behind: 0, ahead };\n }\n\n // Pull with rebase to get latest\n const output = execSync('git pull --rebase origin main', {\n encoding: 'utf-8',\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n\n return { success: true, output: output.trim(), behind, ahead };\n } catch (error) {\n const err = error as { message?: string };\n return { success: false, output: err.message || 'Pull failed', behind: 0, ahead: 0 };\n }\n}\n\n/**\n * Push local memory changes to git remote\n */\nfunction gitPushMemory(): { success: boolean; output: string } {\n try {\n // Check if there are uncommitted changes in memory\n const status = execSync('git status --porcelain .agents/memory/', {\n encoding: 'utf-8',\n stdio: ['pipe', 'pipe', 'pipe'],\n }).trim();\n\n if (status) {\n // Stage and commit memory changes\n execSync('git add .agents/memory/', { stdio: ['pipe', 'pipe', 'pipe'] });\n execSync('git commit -m \"chore: sync squad memory\"', {\n encoding: 'utf-8',\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n }\n\n // Push to remote\n const output = execSync('git push origin main', {\n encoding: 'utf-8',\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n\n return { success: true, output: output.trim() || 'Pushed successfully' };\n } catch (error) {\n const err = error as { message?: string };\n return { success: false, output: err.message || 'Push failed' };\n }\n}\n\nexport async function syncCommand(options: { verbose?: boolean; push?: boolean; pull?: boolean } = {}): Promise<void> {\n await track(Events.CLI_MEMORY_SYNC, { push: options.push, pull: options.pull });\n const memoryDir = findMemoryDir();\n const _squadsDir = findSquadsDir();\n\n if (!memoryDir) {\n writeLine(` ${colors.yellow}No .agents/memory directory found${RESET}`);\n writeLine(` ${colors.dim}Run \\`squads init\\` to create one.${RESET}`);\n return; // Graceful exit - don't fail hooks\n }\n\n writeLine();\n writeLine(` ${gradient('squads')} ${colors.dim}memory sync${RESET}`);\n writeLine();\n\n // Default behavior: pull from remote\n const doPull = options.pull !== false; // Pull by default unless explicitly disabled\n const doPush = options.push === true; // Only push if explicitly requested\n\n // Step 1: Pull from git remote\n if (doPull) {\n writeLine(` ${icons.progress} Pulling from remote...`);\n const pullResult = gitPullMemory();\n\n if (pullResult.success) {\n if (pullResult.behind > 0) {\n writeLine(` ${icons.success} Pulled ${colors.cyan}${pullResult.behind}${RESET} commits from remote`);\n } else {\n writeLine(` ${icons.success} ${colors.dim}Already up to date${RESET}`);\n }\n if (pullResult.ahead > 0) {\n writeLine(` ${colors.dim} ${pullResult.ahead} local commits to push${RESET}`);\n }\n } else {\n writeLine(` ${icons.error} ${colors.red}Pull failed: ${pullResult.output}${RESET}`);\n }\n writeLine();\n }\n\n // Get last sync time\n const lastSync = getLastSyncTime(memoryDir);\n if (lastSync) {\n writeLine(` ${colors.dim}Last sync: ${lastSync.split('T')[0]}${RESET}`);\n } else {\n writeLine(` ${colors.dim}First sync${RESET}`);\n }\n writeLine();\n\n // Get recent commits\n const commits = getRecentCommits(lastSync || undefined);\n\n if (commits.length === 0) {\n writeLine(` ${colors.yellow}No new commits since last sync${RESET}`);\n writeLine();\n return;\n }\n\n writeLine(` ${colors.cyan}${commits.length}${RESET} commits to process`);\n writeLine();\n\n // Group by squad\n const bySquad = groupCommitsBySquad(commits);\n\n if (bySquad.size === 0) {\n writeLine(` ${colors.yellow}No squad-related commits found${RESET}`);\n writeLine();\n updateLastSyncTime(memoryDir);\n return;\n }\n\n // Update each squad's memory\n let updated = 0;\n for (const [squad, squadCommits] of bySquad) {\n const summary = generateSummary(squadCommits);\n\n if (options.verbose) {\n writeLine(` ${icons.progress} ${colors.cyan}${squad}${RESET}`);\n for (const commit of squadCommits) {\n writeLine(` ${colors.dim}${commit.hash} ${commit.message}${RESET}`);\n }\n }\n\n const success = appendToSquadMemory(memoryDir, squad, summary);\n if (success) {\n writeLine(` ${icons.success} ${colors.cyan}${squad}${RESET} ${colors.dim}(${squadCommits.length} commits)${RESET}`);\n updated++;\n }\n }\n\n writeLine();\n writeLine(` ${colors.green}${updated}${RESET} squad memories updated`);\n writeLine();\n\n // Update last sync time\n updateLastSyncTime(memoryDir);\n\n // Step 3: Push to remote if requested\n if (doPush) {\n writeLine(` ${icons.progress} Pushing to remote...`);\n const pushResult = gitPushMemory();\n\n if (pushResult.success) {\n writeLine(` ${icons.success} ${colors.green}Pushed memory updates to remote${RESET}`);\n } else {\n writeLine(` ${icons.error} ${colors.red}Push failed: ${pushResult.output}${RESET}`);\n }\n writeLine();\n }\n\n // Show helpful commands\n writeLine(` ${colors.dim}$${RESET} squads memory show ${colors.cyan}<squad>${RESET} ${colors.dim}View updated memory${RESET}`);\n writeLine(` ${colors.dim}$${RESET} squads status ${colors.dim}See all squads${RESET}`);\n if (!doPush && updated > 0) {\n writeLine(` ${colors.dim}$${RESET} squads memory sync --push ${colors.dim}Push changes to remote${RESET}`);\n }\n writeLine();\n}\n","import {\n loadSquad,\n findSquadsDir,\n listSquads,\n addGoalToSquad,\n updateGoalInSquad,\n} 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 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 { 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 } from '../lib/costs.js';\nimport { getMultiRepoGitStats, getActivitySparkline, getGitHubStatsOptimized, SquadGitHubStats, GitPerformanceStats, GitHubStats } from '../lib/git.js';\nimport { saveDashboardSnapshot, isDatabaseAvailable, getDashboardHistory, DashboardSnapshot, SquadSnapshotData, closeDatabase } 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}\n\nexport async function dashboardCommand(options: { verbose?: boolean; ceo?: boolean; fast?: 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 // Fetch all expensive data in parallel to minimize wall time\n // Wrap slow calls with race timeout to ensure CLI responsiveness\n const timeout = <T>(promise: Promise<T>, ms: number, fallback: T): Promise<T> =>\n Promise.race([promise, new Promise<T>(resolve => setTimeout(() => resolve(fallback), ms))]);\n\n // Clean up stale file-based sessions (sync, fast)\n cleanupStaleSessions();\n\n const [gitStats, ghStats, costs, bridgeStats, activity, dbAvailable, history, insights, sessionSummary, npmStats] = await Promise.all([\n // Git stats (local, ~1s)\n Promise.resolve(baseDir ? getMultiRepoGitStats(baseDir, 30) : null),\n // GitHub stats (network, ~20-30s) - skip by default for fast mode\n skipGitHub ? Promise.resolve(null) : Promise.resolve(baseDir ? getGitHubStatsOptimized(baseDir, 30) : null),\n // Langfuse costs (network, 2s timeout)\n timeout(fetchCostSummary(100), 2000, null),\n // Bridge stats (local network, 2s timeout)\n timeout(fetchBridgeStats(), 2000, null),\n // Activity sparkline (local, <1s)\n Promise.resolve(baseDir ? getActivitySparkline(baseDir, 14) : []),\n // Database availability check (1.5s timeout)\n timeout(isDatabaseAvailable(), 1500, false),\n // Dashboard history (1.5s timeout)\n timeout(getDashboardHistory(14).catch(() => [] as DashboardSnapshot[]), 1500, [] as DashboardSnapshot[]),\n // Insights (2s timeout)\n timeout(fetchInsights('week').catch(() => null), 2000, null),\n // Session summary (parallel lsof, ~1s)\n getLiveSessionSummaryAsync(),\n // NPM download stats (network, 2s timeout)\n timeout(fetchNpmStats('squads-cli'), 2000, null),\n ]);\n\n // Create cache for render functions\n const cache: DashboardCache = { gitStats, ghStats, costs, bridgeStats, activity, dbAvailable, history, insights, sessionSummary, npmStats };\n\n // === PHASE 2: Build squad metrics (sync, fast) ===\n const squadData: SquadMetrics[] = [];\n\n for (const name of squadNames) {\n const squad = loadSquad(name);\n if (!squad) continue;\n\n const lastActivity = getLastActivityDate(name);\n const github = ghStats?.bySquad.get(name) || null;\n\n let status: SquadMetrics['status'] = 'active';\n const activeGoals = squad.goals.filter(g => !g.completed);\n if (activeGoals.length === 0) {\n status = 'needs-goal';\n } else if (lastActivity.includes('w') || lastActivity === '—') {\n status = 'stale';\n }\n\n const totalGoals = squad.goals.length;\n const completedGoals = squad.goals.filter(g => g.completed).length;\n const hasProgress = squad.goals.filter(g => g.progress).length;\n const goalProgress = totalGoals > 0\n ? Math.round(((completedGoals + hasProgress * 0.3) / totalGoals) * 100)\n : 0;\n\n // Calculate commit counts from git stats\n const repoSquadMap: Record<string, string[]> = {\n website: ['agents-squads-web'],\n product: ['squads-cli'],\n engineering: ['hq', 'squads-cli'],\n research: ['research'],\n intelligence: ['intelligence'],\n customer: ['customer'],\n finance: ['finance'],\n company: ['company', 'hq'],\n marketing: ['marketing', 'agents-squads-web'],\n cli: ['squads-cli'],\n };\n\n let squadCommits = 0;\n if (gitStats) {\n for (const [repo, commits] of gitStats.commitsByRepo) {\n if (repoSquadMap[name]?.includes(repo)) {\n squadCommits += commits;\n }\n }\n }\n\n // Create github stats object (from ghStats or minimal with just commits)\n const githubStats: SquadGitHubStats = github || {\n prsOpened: 0,\n prsMerged: 0,\n issuesClosed: 0,\n issuesOpen: 0,\n commits: 0,\n recentIssues: [],\n recentPRs: [],\n };\n githubStats.commits = squadCommits;\n\n squadData.push({\n name,\n mission: squad.mission,\n goals: squad.goals,\n lastActivity,\n status,\n github: githubStats,\n goalProgress,\n });\n }\n\n // === PHASE 3: Render (sync, fast) ===\n const activeSquads = squadData.filter(s => s.status === 'active').length;\n const totalPRs = ghStats ? ghStats.prsMerged : 0;\n const totalIssuesClosed = ghStats ? ghStats.issuesClosed : 0;\n const totalIssuesOpen = ghStats ? ghStats.issuesOpen : 0;\n\n writeLine();\n writeLine(` ${gradient('squads')} ${colors.dim}dashboard${RESET}`);\n\n // Check for updates (cached, non-blocking)\n const updateInfo = checkForUpdate();\n if (updateInfo.updateAvailable) {\n writeLine(` ${colors.cyan}⬆${RESET} Update available: ${colors.dim}${updateInfo.currentVersion}${RESET} → ${colors.green}${updateInfo.latestVersion}${RESET} ${colors.dim}(run \\`squads update\\`)${RESET}`);\n }\n\n // Session indicator line (only if there are active sessions)\n if (sessionSummary.totalSessions > 0) {\n const sessionText = sessionSummary.totalSessions === 1 ? 'session' : 'sessions';\n const squadText = sessionSummary.squadCount === 1 ? 'squad' : 'squads';\n\n // Build tool breakdown string (e.g., \"claude 4, cursor 2\")\n let toolInfo = '';\n if (sessionSummary.byTool && Object.keys(sessionSummary.byTool).length > 0) {\n const toolParts = Object.entries(sessionSummary.byTool)\n .sort((a, b) => b[1] - a[1]) // Sort by count descending\n .map(([tool, count]) => `${colors.dim}${tool}${RESET} ${colors.cyan}${count}${RESET}`);\n toolInfo = ` ${colors.dim}(${RESET}${toolParts.join(` ${colors.dim}·${RESET} `)}${colors.dim})${RESET}`;\n }\n\n writeLine(` ${colors.green}${icons.active}${RESET} ${colors.white}${sessionSummary.totalSessions}${RESET} active ${sessionText} ${colors.dim}across${RESET} ${colors.cyan}${sessionSummary.squadCount}${RESET} ${squadText}${toolInfo}`);\n }\n writeLine();\n\n // Stats row - show different info based on whether GitHub data is available\n const statsParts = [`${colors.cyan}${activeSquads}${RESET}/${squadData.length} squads`];\n if (ghStats) {\n statsParts.push(`${colors.green}${totalPRs}${RESET} PRs merged`);\n statsParts.push(`${colors.purple}${totalIssuesClosed}${RESET} closed`);\n statsParts.push(`${colors.yellow}${totalIssuesOpen}${RESET} open`);\n } else {\n statsParts.push(`${colors.cyan}${gitStats?.totalCommits || 0}${RESET} commits`);\n statsParts.push(`${colors.dim}use -f for PRs/issues${RESET}`);\n }\n writeLine(` ${statsParts.join(` ${colors.dim}│${RESET} `)}`);\n writeLine();\n\n const overallProgress = squadData.length > 0\n ? Math.round(squadData.reduce((sum, s) => sum + s.goalProgress, 0) / squadData.length)\n : 0;\n writeLine(` ${progressBar(overallProgress, 32)} ${colors.dim}${overallProgress}% goal progress${RESET}`);\n writeLine();\n\n // Squad table - 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 // 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 renderInfrastructureCached(cache);\n renderAcquisitionCached(cache);\n\n // These still need async but are fast\n renderHistoricalTrendsCached(cache);\n renderInsightsCached(cache);\n\n // Working On section - shows recent commits\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 // Goals section - show 3 most relevant (prioritize squads with recent activity)\n const allActiveGoals = squadData.flatMap(s =>\n s.goals.filter(g => !g.completed).map(g => ({ squad: s.name, goal: g }))\n );\n\n if (allActiveGoals.length > 0) {\n // Get squads with recent commits for relevance scoring\n const activeSquads = new Set(gitStats?.recentCommits?.map(c => {\n // Map repo to squad\n const repoSquadMap: Record<string, string> = {\n 'agents-squads-web': 'website',\n 'squads-cli': 'cli',\n 'hq': 'engineering',\n 'company': 'company',\n 'product': 'product',\n 'research': 'research',\n 'intelligence': 'intelligence',\n 'customer': 'customer',\n 'finance': 'finance',\n 'marketing': 'marketing',\n };\n return repoSquadMap[c.repo] || c.repo;\n }) || []);\n\n // Sort goals: active squads first, then by progress\n const sortedGoals = [...allActiveGoals].sort((a, b) => {\n const aActive = activeSquads.has(a.squad) ? 1 : 0;\n const bActive = activeSquads.has(b.squad) ? 1 : 0;\n if (aActive !== bActive) return bActive - aActive;\n // Then by progress (goals with progress first)\n const aHasProgress = a.goal.progress ? 1 : 0;\n const bHasProgress = b.goal.progress ? 1 : 0;\n return bHasProgress - aHasProgress;\n });\n\n writeLine(` ${bold}Goals${RESET} ${colors.dim}(${allActiveGoals.length} active)${RESET}`);\n writeLine();\n\n const maxGoals = 3; // Show only 3 most relevant\n for (const { squad, goal } of sortedGoals.slice(0, maxGoals)) {\n const hasProgress = goal.progress && goal.progress.length > 0;\n const isActive = activeSquads.has(squad);\n const icon = isActive ? icons.active : (hasProgress ? icons.progress : icons.empty);\n writeLine(` ${icon} ${colors.dim}${squad}${RESET} ${truncate(goal.description, 48)}`);\n if (hasProgress) {\n writeLine(` ${colors.dim}└${RESET} ${colors.green}${truncate(goal.progress!, 52)}${RESET}`);\n }\n }\n\n if (allActiveGoals.length > maxGoals) {\n writeLine(` ${colors.dim} +${allActiveGoals.length - maxGoals} more${RESET}`);\n }\n writeLine();\n }\n\n writeLine(` ${colors.dim}$${RESET} squads run ${colors.cyan}<squad>${RESET} ${colors.dim}Execute a squad${RESET}`);\n writeLine(` ${colors.dim}$${RESET} squads goal set ${colors.dim}Add a goal${RESET}`);\n writeLine();\n\n // Save snapshot in background (don't block)\n saveSnapshotCached(squadData, cache, baseDir).catch(() => {});\n\n // Close database pool to allow process to exit immediately\n await closeDatabase();\n}\n\n/**\n * Save dashboard snapshot to local PostgreSQL for historical tracking\n */\nasync function _saveSnapshot(\n squadData: SquadMetrics[],\n ghStats: GitHubStats | null,\n _baseDir: string | null\n): Promise<void> {\n // Check if database is available\n const dbAvailable = await isDatabaseAvailable();\n if (!dbAvailable) return;\n\n // Fetch additional data for snapshot\n const gitStats = _baseDir ? getMultiRepoGitStats(_baseDir, 30) : null;\n const costs = await fetchCostSummary(100);\n\n // Build squad snapshot data\n const squadsData: SquadSnapshotData[] = squadData.map(s => ({\n name: s.name,\n commits: s.github?.commits || 0,\n prsOpened: s.github?.prsOpened || 0,\n prsMerged: s.github?.prsMerged || 0,\n issuesClosed: s.github?.issuesClosed || 0,\n issuesOpen: s.github?.issuesOpen || 0,\n goalsActive: s.goals.filter(g => !g.completed).length,\n goalsTotal: s.goals.length,\n progress: s.goalProgress,\n }));\n\n // Build authors data\n const authorsData = gitStats\n ? Array.from(gitStats.commitsByAuthor.entries())\n .sort((a, b) => b[1] - a[1])\n .slice(0, 10)\n .map(([name, commits]) => ({ name, commits }))\n : [];\n\n // Build repos data\n const reposData = gitStats\n ? Array.from(gitStats.commitsByRepo.entries())\n .sort((a, b) => b[1] - a[1])\n .map(([name, commits]) => ({ name, commits }))\n : [];\n\n // Calculate totals\n const totalInputTokens = costs?.bySquad.reduce((sum: 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 || 50,\n inputTokens: totalInputTokens,\n outputTokens: totalOutputTokens,\n commits30d: gitStats?.totalCommits || 0,\n avgCommitsPerDay: gitStats?.avgCommitsPerDay || 0,\n activeDays: gitStats?.activeDays || 0,\n peakCommits: gitStats?.peakDay?.count || 0,\n peakDate: gitStats?.peakDay?.date || null,\n squadsData,\n authorsData,\n reposData,\n };\n\n await saveDashboardSnapshot(snapshot);\n}\n\n// Find agents-squads base directory (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 = getMultiRepoGitStats(baseDir, 30);\n const activity = getActivitySparkline(baseDir, 14);\n\n if (stats.totalCommits === 0) {\n writeLine(` ${bold}Git Activity${RESET} ${colors.dim}(no commits in 30d)${RESET}`);\n writeLine();\n return;\n }\n\n writeLine(` ${bold}Git Activity${RESET} ${colors.dim}(30d)${RESET}`);\n writeLine();\n\n // Sparkline for last 14 days\n const spark = sparkline(activity);\n writeLine(` ${colors.dim}Last 14d:${RESET} ${spark}`);\n writeLine();\n\n // Key metrics row\n const metrics = [\n `${colors.cyan}${stats.totalCommits}${RESET} commits`,\n `${colors.green}${stats.avgCommitsPerDay}${RESET}/day`,\n `${colors.purple}${stats.activeDays}${RESET} active days`,\n ];\n if (stats.peakDay) {\n metrics.push(`${colors.yellow}${stats.peakDay.count}${RESET} peak ${colors.dim}(${stats.peakDay.date})${RESET}`);\n }\n writeLine(` ${metrics.join(` ${colors.dim}│${RESET} `)}`);\n writeLine();\n\n // Repos by commits (top 5)\n const sortedRepos = Array.from(stats.commitsByRepo.entries())\n .sort((a, b) => b[1] - a[1])\n .slice(0, 5);\n\n if (sortedRepos.length > 0) {\n const maxRepoCommits = sortedRepos[0][1];\n\n for (const [repo, commits] of sortedRepos) {\n const bar = barChart(commits, maxRepoCommits, 12);\n writeLine(` ${colors.cyan}${padEnd(repo, 20)}${RESET}${bar} ${colors.dim}${commits}${RESET}`);\n }\n writeLine();\n }\n\n // Authors (top 3)\n const sortedAuthors = Array.from(stats.commitsByAuthor.entries())\n .sort((a, b) => b[1] - a[1])\n .slice(0, 3);\n\n if (sortedAuthors.length > 0) {\n const authorLine = sortedAuthors\n .map(([author, count]) => `${colors.dim}${truncate(author, 15)}${RESET} ${colors.cyan}${count}${RESET}`)\n .join(` ${colors.dim}│${RESET} `);\n writeLine(` ${colors.dim}By author:${RESET} ${authorLine}`);\n writeLine();\n }\n}\n\nasync function _renderTokenEconomics(_squadNames: string[]): Promise<void> {\n const costs = await fetchCostSummary(100);\n\n if (!costs) {\n // No Langfuse config or API error - show hint\n writeLine(` ${bold}Token Economics${RESET} ${colors.dim}(no data)${RESET}`);\n writeLine(` ${colors.dim}Set LANGFUSE_PUBLIC_KEY & LANGFUSE_SECRET_KEY for cost tracking${RESET}`);\n writeLine();\n return;\n }\n\n writeLine(` ${bold}Token Economics${RESET} ${colors.dim}(last 100 calls)${RESET}`);\n writeLine();\n\n // Budget bar\n const barWidth = 32;\n const costBar = formatCostBar(costs.usedPercent, barWidth);\n writeLine(` ${colors.dim}Budget $${costs.dailyBudget}${RESET} [${costBar}] ${costs.usedPercent.toFixed(1)}%`);\n writeLine(` ${colors.green}$${costs.totalCost.toFixed(2)}${RESET} used ${colors.dim}│${RESET} ${colors.cyan}$${costs.idleBudget.toFixed(2)}${RESET} idle`);\n writeLine();\n\n // Anthropic tier and limits\n const tier = parseInt(process.env.ANTHROPIC_TIER || '4', 10);\n\n // RPM limits by tier (same for all models)\n const rpmByTier: Record<number, number> = { 1: 50, 2: 1000, 3: 2000, 4: 4000 };\n const rpmLimit = rpmByTier[tier] || 4000;\n\n // Token limits by tier and model family (ITPM/OTPM per minute)\n const tokenLimits: Record<number, Record<string, { itpm: number; otpm: number }>> = {\n 1: { opus: { itpm: 30000, otpm: 8000 }, sonnet: { itpm: 30000, otpm: 8000 }, haiku: { itpm: 50000, otpm: 10000 } },\n 2: { opus: { itpm: 450000, otpm: 90000 }, sonnet: { itpm: 450000, otpm: 90000 }, haiku: { itpm: 450000, otpm: 90000 } },\n 3: { opus: { itpm: 800000, otpm: 160000 }, sonnet: { itpm: 800000, otpm: 160000 }, haiku: { itpm: 1000000, otpm: 200000 } },\n 4: { opus: { itpm: 2000000, otpm: 400000 }, sonnet: { itpm: 2000000, otpm: 400000 }, haiku: { itpm: 4000000, otpm: 800000 } },\n };\n\n const modelShortNames: Record<string, string> = {\n 'claude-opus-4-5-20251101': 'opus-4.5',\n 'claude-sonnet-4-20250514': 'sonnet-4',\n 'claude-haiku-4-5-20251001': 'haiku-4.5',\n 'claude-3-5-sonnet-20241022': 'sonnet-3.5',\n 'claude-3-5-haiku-20241022': 'haiku-3.5',\n };\n\n const modelToFamily: Record<string, string> = {\n 'claude-opus-4-5-20251101': 'opus',\n 'claude-sonnet-4-20250514': 'sonnet',\n 'claude-haiku-4-5-20251001': 'haiku',\n 'claude-3-5-sonnet-20241022': 'sonnet',\n 'claude-3-5-haiku-20241022': 'haiku',\n };\n\n // Aggregate stats by model\n const modelStats: Record<string, { calls: number; input: number; output: number; cached: number }> = {};\n for (const squad of costs.bySquad) {\n for (const [model, count] of Object.entries(squad.models)) {\n if (!modelStats[model]) {\n modelStats[model] = { calls: 0, input: 0, output: 0, cached: 0 };\n }\n modelStats[model].calls += count;\n }\n // Distribute tokens proportionally (approximation since we don't have per-model token breakdown)\n const totalCalls = Object.values(squad.models).reduce((a, b) => a + b, 0);\n for (const [model, count] of Object.entries(squad.models)) {\n const ratio = totalCalls > 0 ? count / totalCalls : 0;\n modelStats[model].input += Math.round(squad.inputTokens * ratio);\n modelStats[model].output += Math.round(squad.outputTokens * ratio);\n }\n }\n\n // Total tokens for all models\n const _totalInput = costs.bySquad.reduce((sum, s) => sum + s.inputTokens, 0);\n const _totalOutput = costs.bySquad.reduce((sum, s) => sum + s.outputTokens, 0);\n const _totalCalls = costs.bySquad.reduce((sum, s) => sum + s.calls, 0);\n\n // Cost projections - extrapolate based on hours elapsed today\n const now = new Date();\n const hoursElapsed = Math.max(now.getHours() + now.getMinutes() / 60, 1); // At least 1 hour to avoid division issues\n const hourlyRate = costs.totalCost / hoursElapsed;\n const dailyProjection = hourlyRate * 24;\n const monthlyProjection = dailyProjection * 30;\n\n // Fetch real rate limits from proxy (if available)\n const rateLimits = await fetchRateLimits();\n const hasRealLimits = rateLimits.source === 'proxy' && Object.keys(rateLimits.limits).length > 0;\n\n // Display rate limits section\n if (hasRealLimits) {\n writeLine(` ${colors.dim}Rate Limits${RESET} ${colors.green}(live)${RESET}`);\n\n for (const [family, limits] of Object.entries(rateLimits.limits)) {\n const name = family === 'opus' ? 'opus' : family === 'sonnet' ? 'sonnet' : family === 'haiku' ? 'haiku' : family;\n\n // Request rate usage\n const reqUsed = limits.requestsLimit - limits.requestsRemaining;\n const reqPct = limits.requestsLimit > 0 ? (reqUsed / limits.requestsLimit) * 100 : 0;\n const reqColor = reqPct > 80 ? colors.red : reqPct > 50 ? colors.yellow : colors.green;\n\n // Token rate usage\n const tokUsed = limits.tokensLimit - limits.tokensRemaining;\n const tokPct = limits.tokensLimit > 0 ? (tokUsed / limits.tokensLimit) * 100 : 0;\n const tokColor = tokPct > 80 ? colors.red : tokPct > 50 ? colors.yellow : colors.green;\n\n writeLine(` ${colors.cyan}${padEnd(name, 8)}${RESET} ${reqColor}${String(reqUsed).padStart(4)}${RESET}${colors.dim}/${limits.requestsLimit}req${RESET} ${tokColor}${formatK(tokUsed)}${RESET}${colors.dim}/${formatK(limits.tokensLimit)}tok${RESET}`);\n }\n } else {\n writeLine(` ${colors.dim}Rate Limits (Tier ${tier})${RESET}`);\n\n const sortedModels = Object.entries(modelStats).sort((a, b) => b[1].calls - a[1].calls);\n for (const [model, stats] of sortedModels.slice(0, 3)) {\n const name = modelShortNames[model] || model.split('-').slice(1, 3).join('-');\n const family = modelToFamily[model] || 'sonnet';\n const limits = tokenLimits[tier]?.[family] || { itpm: 1000000, otpm: 200000 };\n\n // RPM\n const rpmPct = (stats.calls / rpmLimit) * 100;\n const rpmColor = rpmPct > 80 ? colors.red : rpmPct > 50 ? colors.yellow : colors.green;\n\n // Format: model [RPM bar] calls [ITPM] input [OTPM] output\n writeLine(` ${colors.cyan}${padEnd(name, 11)}${RESET} ${rpmColor}${String(stats.calls).padStart(4)}${RESET}${colors.dim}rpm${RESET} ${colors.dim}${formatK(stats.input)}${RESET}${colors.dim}/${formatK(limits.itpm)}i${RESET} ${colors.dim}${formatK(stats.output)}${RESET}${colors.dim}/${formatK(limits.otpm)}o${RESET}`);\n }\n }\n writeLine();\n\n // Cache efficiency\n if (costs.totalCachedTokens > 0 || costs.cacheHitRate > 0) {\n const cacheColor = costs.cacheHitRate > 50 ? colors.green : costs.cacheHitRate > 20 ? colors.yellow : colors.red;\n writeLine(` ${colors.dim}Cache:${RESET} ${cacheColor}${costs.cacheHitRate.toFixed(1)}%${RESET} hit rate ${colors.dim}(${formatK(costs.totalCachedTokens)} cached / ${formatK(costs.totalInputTokens + costs.totalCachedTokens)} total)${RESET}`);\n writeLine();\n }\n\n // Cost projections\n writeLine(` ${colors.dim}Projections${RESET}`);\n const projColor = dailyProjection > costs.dailyBudget ? colors.red : colors.green;\n writeLine(` ${colors.dim}Daily:${RESET} ${projColor}~$${dailyProjection.toFixed(2)}${RESET}${colors.dim}/${costs.dailyBudget}${RESET} ${colors.dim}Monthly:${RESET} ${colors.cyan}~$${monthlyProjection.toFixed(0)}${RESET}`);\n\n // Alerts\n if (dailyProjection > costs.dailyBudget * 0.8) {\n writeLine(` ${colors.yellow}⚠${RESET} ${colors.yellow}Projected to exceed daily budget${RESET}`);\n }\n if (costs.usedPercent > 80) {\n writeLine(` ${colors.red}⚠${RESET} ${colors.red}${costs.usedPercent.toFixed(0)}% of daily budget used${RESET}`);\n }\n writeLine();\n}\n\n// Format number as K/M\nfunction formatK(n: number): string {\n if (n >= 1000000) return (n / 1000000).toFixed(1) + 'M';\n if (n >= 1000) return (n / 1000).toFixed(0) + 'k';\n return String(n);\n}\n\nasync function _renderHistoricalTrends(): Promise<void> {\n // Check if database is available\n const dbAvailable = await isDatabaseAvailable();\n if (!dbAvailable) return;\n\n const history = await getDashboardHistory(14);\n if (history.length < 2) return; // Need at least 2 data points\n\n writeLine(` ${bold}Usage Trends${RESET} ${colors.dim}(${history.length}d history)${RESET}`);\n writeLine();\n\n // Daily cost sparkline (most recent first, so reverse for left-to-right)\n const dailyCosts = history.map(h => h.costUsd).reverse();\n const costSparkStr = sparkline(dailyCosts);\n const totalSpend = dailyCosts.reduce((sum, c) => sum + c, 0);\n const avgDaily = totalSpend / dailyCosts.length;\n\n writeLine(` ${colors.dim}Cost:${RESET} ${costSparkStr} ${colors.green}$${totalSpend.toFixed(2)}${RESET} total ${colors.dim}($${avgDaily.toFixed(2)}/day avg)${RESET}`);\n\n // Token usage trend\n const inputTokens = history.map(h => h.inputTokens).reverse();\n const totalInput = inputTokens.reduce((sum, t) => sum + t, 0);\n const tokenSparkStr = sparkline(inputTokens);\n\n writeLine(` ${colors.dim}Tokens:${RESET} ${tokenSparkStr} ${colors.cyan}${formatK(totalInput)}${RESET} input ${colors.dim}(${formatK(Math.round(totalInput / inputTokens.length))}/day)${RESET}`);\n\n // Goal progress trend\n const goalProgress = history.map(h => h.goalProgressPct).reverse();\n const latestProgress = goalProgress[goalProgress.length - 1] || 0;\n const earliestProgress = goalProgress[0] || 0;\n const progressDelta = latestProgress - earliestProgress;\n const progressColor = progressDelta > 0 ? colors.green : progressDelta < 0 ? colors.red : colors.dim;\n const progressSign = progressDelta > 0 ? '+' : '';\n\n writeLine(` ${colors.dim}Goals:${RESET} ${sparkline(goalProgress)} ${colors.purple}${latestProgress}%${RESET} ${progressColor}${progressSign}${progressDelta.toFixed(0)}%${RESET}${colors.dim} vs start${RESET}`);\n writeLine();\n}\n\nasync function _renderInsights(): Promise<void> {\n const insights = await fetchInsights('week');\n\n if (insights.source === 'none' || insights.taskMetrics.length === 0) {\n // No insights data available - skip section entirely\n return;\n }\n\n writeLine(` ${bold}Agent Insights${RESET} ${colors.dim}(${insights.days}d)${RESET}`);\n writeLine();\n\n // Task completion metrics (aggregated)\n const totals = insights.taskMetrics.reduce(\n (acc, t) => ({\n tasks: acc.tasks + t.tasksTotal,\n completed: acc.completed + t.tasksCompleted,\n failed: acc.failed + t.tasksFailed,\n retries: acc.retries + t.totalRetries,\n withRetries: acc.withRetries + t.tasksWithRetries,\n }),\n { tasks: 0, completed: 0, failed: 0, retries: 0, withRetries: 0 }\n );\n\n if (totals.tasks > 0) {\n const successRate = totals.tasks > 0 ? ((totals.completed / totals.tasks) * 100).toFixed(0) : '0';\n const successColor = parseInt(successRate) >= 80 ? colors.green : parseInt(successRate) >= 60 ? colors.yellow : colors.red;\n\n // Task completion row\n writeLine(` ${colors.dim}Tasks:${RESET} ${colors.green}${totals.completed}${RESET}${colors.dim}/${totals.tasks} completed${RESET} ${successColor}${successRate}%${RESET}${colors.dim} success${RESET} ${colors.red}${totals.failed}${RESET}${colors.dim} failed${RESET}`);\n\n // Retry metrics\n if (totals.retries > 0) {\n const retryRate = totals.tasks > 0 ? ((totals.withRetries / totals.tasks) * 100).toFixed(0) : '0';\n const retryColor = parseInt(retryRate) > 30 ? colors.red : parseInt(retryRate) > 15 ? colors.yellow : colors.green;\n writeLine(` ${colors.dim}Retries:${RESET} ${retryColor}${totals.retries}${RESET}${colors.dim} total${RESET} ${retryColor}${retryRate}%${RESET}${colors.dim} of tasks needed retry${RESET}`);\n }\n }\n\n // Quality metrics (if feedback exists)\n const qualityTotals = insights.qualityMetrics.reduce(\n (acc, q) => ({\n feedback: acc.feedback + q.feedbackCount,\n qualitySum: acc.qualitySum + (q.avgQuality * q.feedbackCount),\n helpfulSum: acc.helpfulSum + (q.helpfulPct * q.feedbackCount / 100),\n fixSum: acc.fixSum + (q.fixRequiredPct * q.feedbackCount / 100),\n }),\n { feedback: 0, qualitySum: 0, helpfulSum: 0, fixSum: 0 }\n );\n\n if (qualityTotals.feedback > 0) {\n const avgQuality = qualityTotals.qualitySum / qualityTotals.feedback;\n const helpfulPct = (qualityTotals.helpfulSum / qualityTotals.feedback) * 100;\n const fixPct = (qualityTotals.fixSum / qualityTotals.feedback) * 100;\n\n const qualityColor = avgQuality >= 4 ? colors.green : avgQuality >= 3 ? colors.yellow : colors.red;\n const stars = '★'.repeat(Math.round(avgQuality)) + '☆'.repeat(5 - Math.round(avgQuality));\n\n writeLine(` ${colors.dim}Quality:${RESET} ${qualityColor}${stars}${RESET} ${colors.dim}(${avgQuality.toFixed(1)}/5)${RESET} ${colors.green}${helpfulPct.toFixed(0)}%${RESET}${colors.dim} helpful${RESET} ${fixPct > 20 ? colors.red : colors.dim}${fixPct.toFixed(0)}% needed fixes${RESET}`);\n }\n\n // Context window utilization\n const contextMetrics = insights.taskMetrics.filter(t => t.avgContextPct > 0);\n if (contextMetrics.length > 0) {\n const avgContext = contextMetrics.reduce((sum, t) => sum + t.avgContextPct, 0) / contextMetrics.length;\n const maxContext = Math.max(...contextMetrics.map(t => t.maxContextTokens));\n\n // Context utilization colors: green < 40%, yellow 40-70%, red > 70%\n const contextColor = avgContext < 40 ? colors.green : avgContext < 70 ? colors.yellow : colors.red;\n const contextStatus = avgContext < 40 ? 'lean' : avgContext < 70 ? 'moderate' : 'heavy';\n\n writeLine(` ${colors.dim}Context:${RESET} ${contextColor}${avgContext.toFixed(0)}%${RESET}${colors.dim} avg utilization (${contextStatus})${RESET} ${colors.dim}peak ${formatK(maxContext)} tokens${RESET}`);\n }\n\n writeLine();\n\n // Top tools (compact)\n if (insights.topTools.length > 0) {\n const toolLine = insights.topTools.slice(0, 5).map(t => {\n const successColor = t.successRate >= 95 ? colors.green : t.successRate >= 80 ? colors.yellow : colors.red;\n return `${colors.dim}${t.toolName.replace('mcp__', '').slice(0, 12)}${RESET} ${successColor}${t.successRate.toFixed(0)}%${RESET}`;\n }).join(' ');\n\n writeLine(` ${colors.dim}Tools:${RESET} ${toolLine}`);\n\n // Tool failure alert\n if (insights.toolFailureRate > 5) {\n writeLine(` ${colors.yellow}⚠${RESET} ${colors.yellow}${insights.toolFailureRate.toFixed(1)}% tool failure rate${RESET}`);\n }\n writeLine();\n }\n}\n\nasync function _renderInfrastructure(): Promise<void> {\n const stats = await fetchBridgeStats();\n\n if (!stats) {\n writeLine(` ${bold}Infrastructure${RESET} ${colors.dim}(bridge offline)${RESET}`);\n writeLine();\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}jorge@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 (the real constraint) ===\n // Anthropic Tier 4 limits (Max plan)\n // RPM: 4000, TPM: 400k input / 80k output, TPD: 2.5M (informational)\n writeLine(` ${colors.dim}Rate Limits${RESET} ${colors.dim}(Tier ${tier})${RESET}`);\n\n // Calculate usage percentages based on typical Tier 4 limits\n const tier4Limits = {\n rpm: 4000,\n inputTpm: 400000,\n outputTpm: 80000,\n };\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 / tier4Limits.rpm) * 100;\n const tpmPct = (tokensPerMinute / (tier4Limits.inputTpm + tier4Limits.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}/${tier4Limits.rpm}${RESET}`);\n writeLine(` TPM ${tpmBar} ${tpmColor}${formatK(Math.round(tokensPerMinute))}${RESET}${colors.dim}/${formatK(tier4Limits.inputTpm + tier4Limits.outputTpm)}${RESET}`);\n\n // Capacity remaining for autonomous work\n const rpmAvailable = Math.max(0, tier4Limits.rpm - callsPerMinute);\n const tpmAvailable = Math.max(0, (tier4Limits.inputTpm + tier4Limits.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 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 || 50,\n inputTokens: totalInputTokens,\n outputTokens: totalOutputTokens,\n commits30d: gitStats?.totalCommits || 0,\n avgCommitsPerDay: gitStats?.avgCommitsPerDay || 0,\n activeDays: gitStats?.activeDays || 0,\n peakCommits: gitStats?.peakDay?.count || 0,\n peakDate: gitStats?.peakDay?.date || null,\n squadsData,\n authorsData,\n reposData,\n };\n\n // Save with timeout - don't block the CLI exit\n const saveTimeout = new Promise<void>(resolve => setTimeout(resolve, 2000));\n await Promise.race([saveDashboardSnapshot(snapshot), saveTimeout]);\n}\n\n// Priority keywords that indicate high priority goals\nconst P0_KEYWORDS = ['revenue', 'first', 'launch', 'publish', 'ship', 'critical', 'urgent'];\nconst P1_KEYWORDS = ['track', 'establish', 'identify', 'define', 'fix'];\n\nfunction inferPriority(goal: string): 'P0' | 'P1' | 'P2' {\n const lower = goal.toLowerCase();\n if (P0_KEYWORDS.some(k => lower.includes(k))) return 'P0';\n if (P1_KEYWORDS.some(k => lower.includes(k))) return 'P1';\n return 'P2';\n}\n\nasync function renderCeoReport(squadsDir: string): Promise<void> {\n const squadNames = listSquads(squadsDir);\n const allGoals: { squad: string; goal: Goal; priority: 'P0' | 'P1' | 'P2' }[] = [];\n const blockers: string[] = [];\n let activeSquads = 0;\n let staleSquads = 0;\n\n for (const name of squadNames) {\n const squad = loadSquad(name);\n if (!squad) continue;\n\n const lastActivity = getLastActivityDate(name);\n const activeGoals = squad.goals.filter(g => !g.completed);\n\n // Check for blockers\n if (activeGoals.length === 0) {\n blockers.push(`${name}: No active goals`);\n } else if (lastActivity.includes('w') || lastActivity === '—') {\n blockers.push(`${name}: Stale (${lastActivity})`);\n staleSquads++;\n } else {\n activeSquads++;\n }\n\n // Collect goals with inferred priority\n for (const goal of activeGoals) {\n allGoals.push({\n squad: name,\n goal,\n priority: inferPriority(goal.description),\n });\n }\n }\n\n // Sort by priority\n allGoals.sort((a, b) => {\n const order = { P0: 0, P1: 1, P2: 2 };\n return order[a.priority] - order[b.priority];\n });\n\n const p0Goals = allGoals.filter(g => g.priority === 'P0');\n const p1Goals = allGoals.filter(g => g.priority === 'P1');\n\n // Render\n writeLine();\n writeLine(` ${gradient('squads')} ${colors.dim}CEO Report${RESET}`);\n writeLine(` ${colors.dim}${new Date().toISOString().split('T')[0]}${RESET}`);\n writeLine();\n\n // Key metrics\n const w = { label: 20, value: 12 };\n const tableWidth = w.label + w.value + 4;\n\n writeLine(` ${colors.purple}${box.topLeft}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.topRight}${RESET}`);\n writeLine(` ${colors.purple}${box.vertical}${RESET} ${bold}${padEnd('METRIC', w.label)}${RESET}${bold}VALUE${RESET} ${colors.purple}${box.vertical}${RESET}`);\n writeLine(` ${colors.purple}${box.teeRight}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.teeLeft}${RESET}`);\n\n writeLine(` ${colors.purple}${box.vertical}${RESET} ${padEnd('Active Squads', w.label)}${colors.green}${padEnd(`${activeSquads}/${squadNames.length}`, w.value)}${RESET}${colors.purple}${box.vertical}${RESET}`);\n writeLine(` ${colors.purple}${box.vertical}${RESET} ${padEnd('P0 Goals', w.label)}${colors.red}${padEnd(String(p0Goals.length), w.value)}${RESET}${colors.purple}${box.vertical}${RESET}`);\n writeLine(` ${colors.purple}${box.vertical}${RESET} ${padEnd('P1 Goals', w.label)}${colors.yellow}${padEnd(String(p1Goals.length), w.value)}${RESET}${colors.purple}${box.vertical}${RESET}`);\n writeLine(` ${colors.purple}${box.vertical}${RESET} ${padEnd('Blockers', w.label)}${blockers.length > 0 ? colors.red : colors.green}${padEnd(String(blockers.length), w.value)}${RESET}${colors.purple}${box.vertical}${RESET}`);\n\n // Token Economics (add to metrics table)\n const costs = await fetchCostSummary(100);\n if (costs) {\n const spendStr = `$${costs.totalCost.toFixed(2)} / $${costs.dailyBudget}`;\n writeLine(` ${colors.purple}${box.vertical}${RESET} ${padEnd('Daily Spend', w.label)}${colors.green}${padEnd(spendStr, w.value)}${RESET}${colors.purple}${box.vertical}${RESET}`);\n }\n\n writeLine(` ${colors.purple}${box.bottomLeft}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.bottomRight}${RESET}`);\n writeLine();\n\n // Top Priorities (P0)\n if (p0Goals.length > 0) {\n writeLine(` ${bold}${colors.red}P0${RESET} ${bold}Priorities${RESET} ${colors.dim}(revenue/launch critical)${RESET}`);\n writeLine();\n for (const { squad, goal } of p0Goals.slice(0, 5)) {\n writeLine(` ${icons.error} ${colors.cyan}${squad}${RESET} ${goal.description}`);\n if (goal.progress) {\n writeLine(` ${colors.dim}└ ${goal.progress}${RESET}`);\n }\n }\n writeLine();\n }\n\n // P1 Goals\n if (p1Goals.length > 0) {\n writeLine(` ${bold}${colors.yellow}P1${RESET} ${bold}Important${RESET} ${colors.dim}(tracking/foundations)${RESET}`);\n writeLine();\n for (const { squad, goal } of p1Goals.slice(0, 3)) {\n writeLine(` ${icons.warning} ${colors.cyan}${squad}${RESET} ${truncate(goal.description, 50)}`);\n }\n if (p1Goals.length > 3) {\n writeLine(` ${colors.dim} +${p1Goals.length - 3} more${RESET}`);\n }\n writeLine();\n }\n\n // Blockers\n if (blockers.length > 0) {\n writeLine(` ${bold}Blockers${RESET}`);\n writeLine();\n for (const blocker of blockers.slice(0, 3)) {\n writeLine(` ${icons.error} ${colors.red}${blocker}${RESET}`);\n }\n writeLine();\n }\n\n // Next Steps\n writeLine(` ${bold}Next Steps${RESET}`);\n writeLine();\n if (p0Goals.length > 0) {\n writeLine(` ${icons.active} Focus on P0: ${colors.cyan}${p0Goals[0].squad}${RESET} - ${truncate(p0Goals[0].goal.description, 40)}`);\n }\n if (blockers.length > 0) {\n writeLine(` ${icons.warning} Unblock: ${colors.yellow}${blockers[0]}${RESET}`);\n }\n if (staleSquads > 0) {\n writeLine(` ${icons.progress} Revive ${staleSquads} stale squad(s)`);\n }\n writeLine();\n\n // Commands\n writeLine(` ${colors.dim}$${RESET} squads dash ${colors.dim}Full operational view${RESET}`);\n writeLine(` ${colors.dim}$${RESET} squads goal list ${colors.dim}All active goals${RESET}`);\n writeLine();\n}\n\nfunction renderHistoricalTrendsCached(cache: DashboardCache): void {\n if (!cache.dbAvailable) return;\n\n const history = cache.history;\n if (history.length < 2) return; // Need at least 2 data points\n\n writeLine(` ${bold}Usage Trends${RESET} ${colors.dim}(${history.length}d history)${RESET}`);\n writeLine();\n\n // Daily cost sparkline (most recent first, so reverse for left-to-right)\n const dailyCosts = history.map(h => h.costUsd).reverse();\n const costSparkStr = sparkline(dailyCosts);\n const totalSpend = dailyCosts.reduce((sum, c) => sum + c, 0);\n const avgDaily = totalSpend / dailyCosts.length;\n\n writeLine(` ${colors.dim}Cost:${RESET} ${costSparkStr} ${colors.green}$${totalSpend.toFixed(2)}${RESET} total ${colors.dim}($${avgDaily.toFixed(2)}/day avg)${RESET}`);\n\n // Token usage trend\n const inputTokens = history.map(h => h.inputTokens).reverse();\n const totalInput = inputTokens.reduce((sum, t) => sum + t, 0);\n const tokenSparkStr = sparkline(inputTokens);\n\n writeLine(` ${colors.dim}Tokens:${RESET} ${tokenSparkStr} ${colors.cyan}${formatK(totalInput)}${RESET} input ${colors.dim}(${formatK(Math.round(totalInput / inputTokens.length))}/day)${RESET}`);\n\n // Goal progress trend\n const goalProgress = history.map(h => h.goalProgressPct).reverse();\n const latestProgress = goalProgress[goalProgress.length - 1] || 0;\n const earliestProgress = goalProgress[0] || 0;\n const progressDelta = latestProgress - earliestProgress;\n const progressColor = progressDelta > 0 ? colors.green : progressDelta < 0 ? colors.red : colors.dim;\n const progressSign = progressDelta > 0 ? '+' : '';\n\n writeLine(` ${colors.dim}Goals:${RESET} ${sparkline(goalProgress)} ${colors.purple}${latestProgress}%${RESET} ${progressColor}${progressSign}${progressDelta.toFixed(0)}%${RESET}${colors.dim} vs start${RESET}`);\n writeLine();\n}\n\nfunction renderInsightsCached(cache: DashboardCache): void {\n const insights = cache.insights;\n\n if (!insights || insights.source === 'none' || insights.taskMetrics.length === 0) {\n return;\n }\n\n writeLine(` ${bold}Agent Insights${RESET} ${colors.dim}(${insights.days}d)${RESET}`);\n writeLine();\n\n // Task completion metrics (aggregated)\n const totals = insights.taskMetrics.reduce(\n (acc, t) => ({\n tasks: acc.tasks + t.tasksTotal,\n completed: acc.completed + t.tasksCompleted,\n failed: acc.failed + t.tasksFailed,\n retries: acc.retries + t.totalRetries,\n withRetries: acc.withRetries + t.tasksWithRetries,\n }),\n { tasks: 0, completed: 0, failed: 0, retries: 0, withRetries: 0 }\n );\n\n if (totals.tasks > 0) {\n const successRate = totals.tasks > 0 ? ((totals.completed / totals.tasks) * 100).toFixed(0) : '0';\n const successColor = parseInt(successRate) >= 80 ? colors.green : parseInt(successRate) >= 60 ? colors.yellow : colors.red;\n\n writeLine(` ${colors.dim}Tasks:${RESET} ${colors.green}${totals.completed}${RESET}${colors.dim}/${totals.tasks} completed${RESET} ${successColor}${successRate}%${RESET}${colors.dim} success${RESET} ${colors.red}${totals.failed}${RESET}${colors.dim} failed${RESET}`);\n\n if (totals.retries > 0) {\n const retryRate = totals.tasks > 0 ? ((totals.withRetries / totals.tasks) * 100).toFixed(0) : '0';\n const retryColor = parseInt(retryRate) > 30 ? colors.red : parseInt(retryRate) > 15 ? colors.yellow : colors.green;\n writeLine(` ${colors.dim}Retries:${RESET} ${retryColor}${totals.retries}${RESET}${colors.dim} total${RESET} ${retryColor}${retryRate}%${RESET}${colors.dim} of tasks needed retry${RESET}`);\n }\n }\n\n // Skip quality metrics for brevity in cached version\n writeLine();\n}\n","/**\n * 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 provider from model name\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 available providers from environment\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 for a specific model\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\n * @returns 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 provider display name\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 is configured (has API key)\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","/**\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 * 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 * Database utilities for local PostgreSQL persistence\n * Connects to the squads schema for storing metrics and snapshots\n */\n\nimport { createRequire } from 'module';\nconst require = createRequire(import.meta.url);\nconst pg = require('pg');\nconst { Pool } = pg;\n\n// Connection config from environment or defaults\nconst DATABASE_URL = process.env.SQUADS_DATABASE_URL ||\n 'postgresql://squads:squads_local_dev@localhost:5433/squads';\n\nlet pool: InstanceType<typeof Pool> | null = null;\n\n/**\n * Get or create the connection pool\n */\nfunction getPool(): InstanceType<typeof Pool> {\n if (!pool) {\n pool = new Pool({\n connectionString: DATABASE_URL,\n max: 5,\n idleTimeoutMillis: 30000,\n connectionTimeoutMillis: 1500, // Fast timeout for CLI responsiveness\n });\n\n // Handle pool errors\n pool.on('error', (err: Error) => {\n console.error('Unexpected database pool error:', err);\n });\n }\n return pool;\n}\n\n/**\n * Check if database is available\n */\nexport async function isDatabaseAvailable(): Promise<boolean> {\n try {\n const pool = getPool();\n const client = await pool.connect();\n await client.query('SELECT 1');\n client.release();\n return true;\n } catch (err) {\n if (process.env.DEBUG) {\n console.error('DB availability check failed:', err);\n }\n return false;\n }\n}\n\n/**\n * Dashboard snapshot data structure\n */\nexport interface DashboardSnapshot {\n // Top-level metrics\n totalSquads: number;\n totalCommits: number;\n totalPrsMerged: number;\n totalIssuesClosed: number;\n totalIssuesOpen: number;\n goalProgressPct: number;\n\n // Cost metrics\n costUsd: number;\n dailyBudgetUsd: number;\n inputTokens: number;\n outputTokens: number;\n\n // Git activity\n commits30d: number;\n avgCommitsPerDay: number;\n activeDays: number;\n peakCommits: number;\n peakDate: string | null;\n\n // Detailed breakdowns (stored as JSONB)\n squadsData: SquadSnapshotData[];\n authorsData: { name: string; commits: number }[];\n reposData: { name: string; commits: number }[];\n}\n\nexport interface SquadSnapshotData {\n name: string;\n commits: number;\n prsOpened: number;\n prsMerged: number;\n issuesClosed: number;\n issuesOpen: number;\n goalsActive: number;\n goalsTotal: number;\n progress: number;\n}\n\n/**\n * Save a dashboard snapshot to the database\n */\nexport async function saveDashboardSnapshot(snapshot: DashboardSnapshot): Promise<number | null> {\n try {\n const pool = getPool();\n const client = await pool.connect();\n\n const result = await client.query(`\n INSERT INTO squads.dashboard_snapshots (\n total_squads, total_commits, total_prs_merged, total_issues_closed, total_issues_open,\n goal_progress_pct, cost_usd, daily_budget_usd, input_tokens, output_tokens,\n commits_30d, avg_commits_per_day, active_days, peak_commits, peak_date,\n squads_data, authors_data, repos_data\n ) VALUES (\n $1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18\n ) RETURNING id\n `, [\n snapshot.totalSquads,\n snapshot.totalCommits,\n snapshot.totalPrsMerged,\n snapshot.totalIssuesClosed,\n snapshot.totalIssuesOpen,\n snapshot.goalProgressPct,\n snapshot.costUsd,\n snapshot.dailyBudgetUsd,\n snapshot.inputTokens,\n snapshot.outputTokens,\n snapshot.commits30d,\n snapshot.avgCommitsPerDay,\n snapshot.activeDays,\n snapshot.peakCommits,\n snapshot.peakDate,\n JSON.stringify(snapshot.squadsData),\n JSON.stringify(snapshot.authorsData),\n JSON.stringify(snapshot.reposData),\n ]);\n\n client.release();\n return result.rows[0]?.id ?? null;\n } catch (err) {\n // Log error for debugging, but don't crash\n if (process.env.DEBUG) {\n console.error('DB save error:', err);\n }\n return null;\n }\n}\n\n/**\n * Get recent dashboard snapshots for trend analysis\n */\nexport async function getDashboardHistory(limit: number = 30): Promise<DashboardSnapshot[]> {\n try {\n const client = await getPool().connect();\n\n const result = await client.query(`\n SELECT\n total_squads, total_commits, total_prs_merged, total_issues_closed, total_issues_open,\n goal_progress_pct, cost_usd, daily_budget_usd, input_tokens, output_tokens,\n commits_30d, avg_commits_per_day, active_days, peak_commits, peak_date,\n squads_data, authors_data, repos_data, captured_at\n FROM squads.dashboard_snapshots\n ORDER BY captured_at DESC\n LIMIT $1\n `, [limit]);\n\n client.release();\n\n return result.rows.map((row: Record<string, unknown>) => ({\n totalSquads: row.total_squads,\n totalCommits: row.total_commits,\n totalPrsMerged: row.total_prs_merged,\n totalIssuesClosed: row.total_issues_closed,\n totalIssuesOpen: row.total_issues_open,\n goalProgressPct: row.goal_progress_pct,\n costUsd: parseFloat(String(row.cost_usd)),\n dailyBudgetUsd: parseFloat(String(row.daily_budget_usd)),\n inputTokens: row.input_tokens,\n outputTokens: row.output_tokens,\n commits30d: row.commits_30d,\n avgCommitsPerDay: parseFloat(String(row.avg_commits_per_day)),\n activeDays: row.active_days,\n peakCommits: row.peak_commits,\n peakDate: row.peak_date,\n squadsData: row.squads_data || [],\n authorsData: row.authors_data || [],\n reposData: row.repos_data || [],\n }));\n } catch {\n return [];\n }\n}\n\n/**\n * Close the database connection pool\n */\nexport async function closeDatabase(): Promise<void> {\n if (pool) {\n await pool.end();\n pool = null;\n }\n}\n","import { execSync } from 'child_process';\nimport {\n colors,\n bold,\n RESET,\n gradient,\n box,\n padEnd,\n truncate,\n icons,\n writeLine,\n} from '../lib/terminal.js';\n\ninterface Label {\n name: string;\n color?: string;\n description?: string;\n}\n\ninterface Issue {\n number: number;\n title: string;\n state: string;\n labels: Label[];\n createdAt: string;\n}\n\nfunction getLabelName(label: Label | string): string {\n return typeof label === 'string' ? label : label.name;\n}\n\ninterface RepoIssues {\n repo: string;\n issues: Issue[];\n error?: string;\n}\n\ninterface IssuesOptions {\n org?: string;\n repos?: string;\n}\n\nconst DEFAULT_ORG = 'agents-squads';\nconst DEFAULT_REPOS = ['hq', 'agents-squads-web', 'squads-cli'];\n\nexport async function issuesCommand(options: IssuesOptions = {}): Promise<void> {\n const org = options.org || DEFAULT_ORG;\n const repos = options.repos ? options.repos.split(',') : DEFAULT_REPOS;\n\n writeLine();\n writeLine(` ${gradient('squads')} ${colors.dim}issues${RESET}`);\n writeLine();\n\n // Check if gh is available\n try {\n execSync('gh --version', { stdio: 'pipe' });\n } catch {\n writeLine(` ${colors.red}GitHub CLI (gh) not found${RESET}`);\n writeLine(` ${colors.dim}Install: brew install gh${RESET}`);\n writeLine();\n return;\n }\n\n // Fetch issues for each repo\n const repoData: RepoIssues[] = [];\n let totalOpen = 0;\n\n for (const repo of repos) {\n try {\n const result = execSync(\n `gh issue list -R ${org}/${repo} --state open --json number,title,state,labels,createdAt --limit 50`,\n { stdio: 'pipe', encoding: 'utf-8' }\n );\n const issues: Issue[] = JSON.parse(result);\n repoData.push({ repo, issues });\n totalOpen += issues.length;\n } catch {\n repoData.push({ repo, issues: [], error: 'not found or no access' });\n }\n }\n\n // Stats row\n const reposWithIssues = repoData.filter(r => r.issues.length > 0).length;\n writeLine(` ${colors.cyan}${totalOpen}${RESET} open issues ${colors.dim}│${RESET} ${reposWithIssues}/${repos.length} repos`);\n writeLine();\n\n // Table\n const w = { repo: 20, open: 6, latest: 40 };\n const tableWidth = w.repo + w.open + w.latest + 4;\n\n writeLine(` ${colors.purple}${box.topLeft}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.topRight}${RESET}`);\n\n const header = ` ${colors.purple}${box.vertical}${RESET} ` +\n `${bold}${padEnd('REPO', w.repo)}${RESET}` +\n `${bold}${padEnd('OPEN', w.open)}${RESET}` +\n `${bold}LATEST${RESET}` +\n ` ${colors.purple}${box.vertical}${RESET}`;\n writeLine(header);\n\n writeLine(` ${colors.purple}${box.teeRight}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.teeLeft}${RESET}`);\n\n for (const { repo, issues, error } of repoData) {\n const count = issues.length;\n const countColor = count > 5 ? colors.red : count > 0 ? colors.yellow : colors.green;\n\n let latest = `${colors.dim}—${RESET}`;\n if (error) {\n latest = `${colors.dim}${error}${RESET}`;\n } else if (issues.length > 0) {\n latest = truncate(issues[0].title, w.latest - 2);\n }\n\n const row = ` ${colors.purple}${box.vertical}${RESET} ` +\n `${colors.cyan}${padEnd(repo, w.repo)}${RESET}` +\n `${countColor}${padEnd(String(count), w.open)}${RESET}` +\n `${padEnd(latest, w.latest + 10)}` + // extra for color codes\n `${colors.purple}${box.vertical}${RESET}`;\n\n writeLine(row);\n }\n\n writeLine(` ${colors.purple}${box.bottomLeft}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.bottomRight}${RESET}`);\n writeLine();\n\n // Show recent issues\n const allIssues = repoData\n .flatMap(r => r.issues.map(i => ({ ...i, repo: r.repo })))\n .sort((a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime())\n .slice(0, 6);\n\n if (allIssues.length > 0) {\n writeLine(` ${bold}Recent${RESET}`);\n writeLine();\n\n for (const issue of allIssues) {\n const labelStr = issue.labels.length > 0\n ? `${colors.dim}[${issue.labels.map(getLabelName).join(', ')}]${RESET}`\n : '';\n\n writeLine(` ${icons.empty} ${colors.dim}#${issue.number}${RESET} ${truncate(issue.title, 50)} ${labelStr}`);\n writeLine(` ${colors.dim}└ ${issue.repo}${RESET}`);\n }\n writeLine();\n }\n\n // Commands\n writeLine(` ${colors.dim}$${RESET} gh issue list -R ${colors.cyan}${org}/<repo>${RESET} ${colors.dim}View repo issues${RESET}`);\n writeLine(` ${colors.dim}$${RESET} gh issue create -R ${colors.cyan}${org}/<repo>${RESET} ${colors.dim}Create issue${RESET}`);\n writeLine();\n}\n","import { execSync, spawn } from 'child_process';\nimport ora from 'ora';\nimport {\n colors,\n bold,\n RESET,\n gradient,\n truncate,\n icons,\n writeLine,\n} from '../lib/terminal.js';\n\ninterface Issue {\n number: number;\n title: string;\n labels: Array<{ name: string }>;\n body?: string;\n}\n\ninterface SolveOptions {\n repo?: string;\n issue?: number;\n dryRun?: boolean;\n execute?: boolean;\n}\n\nconst DEFAULT_ORG = 'agents-squads';\nconst DEFAULT_REPOS = ['hq', 'agents-squads-web', 'squads-cli', 'agents-squads'];\n\nexport async function solveIssuesCommand(options: SolveOptions = {}): Promise<void> {\n const repos = options.repo ? [options.repo] : DEFAULT_REPOS;\n\n writeLine();\n writeLine(` ${gradient('squads')} ${colors.dim}solve-issues${RESET}`);\n writeLine();\n\n // Check if gh is available\n try {\n execSync('gh --version', { stdio: 'pipe' });\n } catch {\n writeLine(` ${colors.red}GitHub CLI (gh) not found${RESET}`);\n writeLine(` ${colors.dim}Install: brew install gh${RESET}`);\n return;\n }\n\n // Collect issues to solve\n const issuesToSolve: Array<Issue & { repo: string }> = [];\n\n if (options.issue) {\n // Specific issue\n const repo = options.repo || 'hq';\n try {\n const result = execSync(\n `gh issue view ${options.issue} -R ${DEFAULT_ORG}/${repo} --json number,title,labels,body`,\n { stdio: 'pipe', encoding: 'utf-8' }\n );\n const issue = JSON.parse(result);\n issuesToSolve.push({ ...issue, repo });\n } catch {\n writeLine(` ${colors.red}Issue #${options.issue} not found in ${repo}${RESET}`);\n return;\n }\n } else {\n // All ready-to-fix issues\n for (const repo of repos) {\n try {\n const result = execSync(\n `gh issue list -R ${DEFAULT_ORG}/${repo} --label \"ready-to-fix\" --state open --json number,title,labels --limit 20`,\n { stdio: 'pipe', encoding: 'utf-8' }\n );\n const issues: Issue[] = JSON.parse(result);\n for (const issue of issues) {\n issuesToSolve.push({ ...issue, repo });\n }\n } catch {\n // Repo might not exist or no access\n }\n }\n }\n\n if (issuesToSolve.length === 0) {\n writeLine(` ${colors.yellow}No issues with 'ready-to-fix' label found${RESET}`);\n writeLine();\n writeLine(` ${colors.dim}Label an issue to make it solvable:${RESET}`);\n writeLine(` ${colors.dim}$${RESET} gh issue edit ${colors.cyan}<number>${RESET} -R ${colors.cyan}${DEFAULT_ORG}/<repo>${RESET} --add-label ready-to-fix`);\n writeLine();\n return;\n }\n\n // Show issues to solve\n writeLine(` ${colors.cyan}${issuesToSolve.length}${RESET} issue${issuesToSolve.length > 1 ? 's' : ''} to solve`);\n writeLine();\n\n for (const issue of issuesToSolve) {\n const labels = issue.labels.map(l => l.name).join(', ');\n writeLine(` ${icons.empty} ${colors.dim}#${issue.number}${RESET} ${truncate(issue.title, 50)}`);\n writeLine(` ${colors.dim}└ ${issue.repo} [${labels}]${RESET}`);\n }\n writeLine();\n\n if (options.dryRun) {\n writeLine(` ${colors.yellow}[DRY RUN] Would solve ${issuesToSolve.length} issues${RESET}`);\n return;\n }\n\n // Solve issues\n if (options.execute) {\n await solveWithClaude(issuesToSolve);\n } else {\n showSolveInstructions(issuesToSolve);\n }\n}\n\nfunction showSolveInstructions(issues: Array<Issue & { repo: string }>): void {\n writeLine(` ${bold}To solve these issues:${RESET}`);\n writeLine();\n writeLine(` ${colors.dim}Option 1: In Claude Code session${RESET}`);\n writeLine(` ${colors.dim}$${RESET} /solve-issue ${colors.cyan}${issues[0].repo}${RESET}`);\n writeLine();\n writeLine(` ${colors.dim}Option 2: Execute with Claude CLI${RESET}`);\n writeLine(` ${colors.dim}$${RESET} squads solve-issues --execute`);\n writeLine();\n writeLine(` ${colors.dim}Option 3: Solve specific issue${RESET}`);\n writeLine(` ${colors.dim}$${RESET} squads solve-issues --repo ${colors.cyan}${issues[0].repo}${RESET} --issue ${colors.cyan}${issues[0].number}${RESET} --execute`);\n writeLine();\n}\n\nasync function solveWithClaude(issues: Array<Issue & { repo: string }>): Promise<void> {\n const spinner = ora('Starting issue solver...').start();\n\n // Check if claude is available\n try {\n execSync('which claude', { stdio: 'pipe' });\n } catch {\n spinner.fail('Claude CLI not found');\n writeLine(` ${colors.dim}Install: npm install -g @anthropic-ai/claude-code${RESET}`);\n return;\n }\n\n for (const issue of issues) {\n spinner.text = `Solving #${issue.number}: ${truncate(issue.title, 40)}`;\n\n const prompt = buildSolvePrompt(issue);\n\n try {\n const result = await executeClaudePrompt(prompt);\n spinner.succeed(`Solved #${issue.number}`);\n\n // Extract PR URL if present\n const prMatch = result.match(/https:\\/\\/github\\.com\\/[^\\s]+\\/pull\\/\\d+/);\n if (prMatch) {\n writeLine(` ${colors.green}PR: ${prMatch[0]}${RESET}`);\n }\n } catch (error) {\n spinner.fail(`Failed #${issue.number}: ${error}`);\n }\n }\n\n writeLine();\n writeLine(` ${colors.dim}View results:${RESET}`);\n writeLine(` ${colors.dim}$${RESET} gh pr list -R ${colors.cyan}${DEFAULT_ORG}/<repo>${RESET}`);\n writeLine();\n}\n\nfunction buildSolvePrompt(issue: Issue & { repo: string }): string {\n return `Solve GitHub issue #${issue.number} in ${DEFAULT_ORG}/${issue.repo}.\n\nIssue: ${issue.title}\n\n## CRITICAL: Work Decisively (No Verification Loops!)\n\nRead each file ONCE, edit ONCE, commit IMMEDIATELY.\nVerify with git diff, NOT by re-reading files.\nIf reading the same file twice, STOP and move forward.\n\n## Instructions\n\n1. Read the issue: gh issue view ${issue.number} --repo ${DEFAULT_ORG}/${issue.repo}\n\n2. Set up worktree:\n git fetch origin main\n git worktree add ../.worktrees/issue-${issue.number} -b solve/issue-${issue.number} origin/main\n cd ../.worktrees/issue-${issue.number}\n\n3. Find and fix the problem (minimal changes)\n\n4. Commit: git add -A && git commit -m \"fix: ...\"\n\n5. Push and create PR:\n git push -u origin solve/issue-${issue.number}\n gh pr create --title \"fix: ...\" --body \"Fixes #${issue.number}\" --repo ${DEFAULT_ORG}/${issue.repo}\n\n6. Clean up: git worktree remove ../.worktrees/issue-${issue.number} --force\n\nReturn the PR URL when done.`;\n}\n\nfunction executeClaudePrompt(prompt: string): Promise<string> {\n return new Promise((resolve, reject) => {\n const claude = spawn('claude', ['--print', prompt], {\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n\n let output = '';\n let error = '';\n\n claude.stdout?.on('data', (data) => {\n output += data.toString();\n });\n\n claude.stderr?.on('data', (data) => {\n error += data.toString();\n });\n\n claude.on('close', (code) => {\n if (code === 0) {\n resolve(output);\n } else {\n reject(new Error(error || `Exited with code ${code}`));\n }\n });\n\n claude.on('error', reject);\n\n // 10 minute timeout\n setTimeout(() => {\n claude.kill();\n reject(new Error('Timeout after 10 minutes'));\n }, 10 * 60 * 1000);\n });\n}\n","import { execSync, spawn } from 'child_process';\nimport { readdirSync } from 'fs';\nimport { join } from 'path';\nimport ora from 'ora';\nimport {\n colors,\n bold,\n RESET,\n gradient,\n icons,\n writeLine,\n} from '../lib/terminal.js';\nimport { findSquadsDir } from '../lib/squad-parser.js';\n\ninterface OpenOptions {\n squad?: string;\n agent?: string;\n dryRun?: boolean;\n execute?: boolean;\n}\n\ninterface EvalAgent {\n name: string;\n squad: string;\n path: string;\n}\n\n// Agents that find issues (evaluators, critics, auditors)\nconst ISSUE_FINDER_PATTERNS = [\n '*-eval.md',\n '*-critic.md',\n '*-auditor.md',\n 'site-tester.md',\n];\n\nexport async function openIssuesCommand(options: OpenOptions = {}): Promise<void> {\n writeLine();\n writeLine(` ${gradient('squads')} ${colors.dim}open-issues${RESET}`);\n writeLine();\n\n const squadsDir = findSquadsDir();\n if (!squadsDir) {\n writeLine(` ${colors.red}No .agents/squads directory found${RESET}`);\n writeLine(` ${colors.dim}Run \\`squads init\\` to create one.${RESET}`);\n return;\n }\n\n // Find evaluator/critic agents\n const evalAgents = findEvalAgents(squadsDir, options.squad);\n\n if (evalAgents.length === 0) {\n writeLine(` ${colors.yellow}No evaluator agents found${RESET}`);\n writeLine(` ${colors.dim}Evaluators match: *-eval.md, *-critic.md, *-auditor.md${RESET}`);\n return;\n }\n\n // Filter by specific agent if requested\n const agents = options.agent\n ? evalAgents.filter(a => a.name === options.agent || a.name === `${options.agent}.md`)\n : evalAgents;\n\n if (agents.length === 0) {\n writeLine(` ${colors.red}Agent '${options.agent}' not found${RESET}`);\n writeLine(` ${colors.dim}Available: ${evalAgents.map(a => a.name).join(', ')}${RESET}`);\n return;\n }\n\n // Group by squad\n const bySquad = agents.reduce((acc, agent) => {\n if (!acc[agent.squad]) acc[agent.squad] = [];\n acc[agent.squad].push(agent);\n return acc;\n }, {} as Record<string, EvalAgent[]>);\n\n writeLine(` ${colors.cyan}${agents.length}${RESET} evaluator${agents.length > 1 ? 's' : ''} ready`);\n writeLine();\n\n for (const [squad, squadAgents] of Object.entries(bySquad)) {\n writeLine(` ${bold}${squad}${RESET}`);\n for (const agent of squadAgents) {\n writeLine(` ${icons.empty} ${colors.cyan}${agent.name.replace('.md', '')}${RESET}`);\n }\n }\n writeLine();\n\n if (options.dryRun) {\n writeLine(` ${colors.yellow}[DRY RUN] Would run ${agents.length} evaluators${RESET}`);\n return;\n }\n\n if (options.execute) {\n await runEvaluators(agents);\n } else {\n showRunInstructions(agents);\n }\n}\n\nfunction findEvalAgents(squadsDir: string, filterSquad?: string): EvalAgent[] {\n const agents: EvalAgent[] = [];\n const squads = readdirSync(squadsDir, { withFileTypes: true })\n .filter(d => d.isDirectory())\n .filter(d => !filterSquad || d.name === filterSquad)\n .map(d => d.name);\n\n for (const squad of squads) {\n const squadPath = join(squadsDir, squad);\n const files = readdirSync(squadPath).filter(f => f.endsWith('.md'));\n\n for (const file of files) {\n // Check if matches evaluator patterns\n const isEval = ISSUE_FINDER_PATTERNS.some(pattern => {\n const regex = new RegExp('^' + pattern.replace('*', '.*') + '$');\n return regex.test(file);\n });\n\n if (isEval) {\n agents.push({\n name: file,\n squad,\n path: join(squadPath, file),\n });\n }\n }\n }\n\n return agents;\n}\n\nfunction showRunInstructions(agents: EvalAgent[]): void {\n writeLine(` ${bold}To run evaluators:${RESET}`);\n writeLine();\n writeLine(` ${colors.dim}Option 1: In Claude Code session${RESET}`);\n writeLine(` ${colors.dim}$${RESET} /website-eval`);\n writeLine();\n writeLine(` ${colors.dim}Option 2: Execute with Claude CLI${RESET}`);\n writeLine(` ${colors.dim}$${RESET} squads open-issues --execute`);\n writeLine();\n writeLine(` ${colors.dim}Option 3: Run specific evaluator${RESET}`);\n writeLine(` ${colors.dim}$${RESET} squads open-issues --squad ${colors.cyan}${agents[0].squad}${RESET} --agent ${colors.cyan}${agents[0].name.replace('.md', '')}${RESET} --execute`);\n writeLine();\n writeLine(` ${colors.dim}Option 4: Via squads run${RESET}`);\n writeLine(` ${colors.dim}$${RESET} squads run ${colors.cyan}${agents[0].squad}/${agents[0].name.replace('.md', '')}${RESET} --execute`);\n writeLine();\n}\n\nasync function runEvaluators(agents: EvalAgent[]): Promise<void> {\n const spinner = ora('Starting evaluators...').start();\n\n // Check if claude is available\n try {\n execSync('which claude', { stdio: 'pipe' });\n } catch {\n spinner.fail('Claude CLI not found');\n writeLine(` ${colors.dim}Install: npm install -g @anthropic-ai/claude-code${RESET}`);\n return;\n }\n\n let issuesCreated = 0;\n\n for (const agent of agents) {\n spinner.text = `Running ${agent.squad}/${agent.name.replace('.md', '')}...`;\n\n const prompt = buildEvalPrompt(agent);\n\n try {\n const result = await executeClaudePrompt(prompt);\n spinner.succeed(`${agent.name.replace('.md', '')}`);\n\n // Count issues created\n const issueMatches = result.match(/Created issue #\\d+/g) || [];\n issuesCreated += issueMatches.length;\n\n if (issueMatches.length > 0) {\n writeLine(` ${colors.green}Created ${issueMatches.length} issue(s)${RESET}`);\n } else {\n writeLine(` ${colors.dim}No issues found${RESET}`);\n }\n } catch (error) {\n spinner.fail(`${agent.name.replace('.md', '')}: ${error}`);\n }\n }\n\n writeLine();\n writeLine(` ${bold}Summary${RESET}`);\n writeLine(` ${colors.cyan}${issuesCreated}${RESET} new issues created`);\n writeLine();\n writeLine(` ${colors.dim}View issues:${RESET}`);\n writeLine(` ${colors.dim}$${RESET} squads issues`);\n writeLine();\n writeLine(` ${colors.dim}Solve them:${RESET}`);\n writeLine(` ${colors.dim}$${RESET} squads solve-issues`);\n writeLine();\n}\n\nfunction buildEvalPrompt(agent: EvalAgent): string {\n return `Execute the ${agent.name.replace('.md', '')} evaluator from squad ${agent.squad}.\n\nRead the agent definition at ${agent.path} and follow its instructions exactly.\n\n## CRITICAL: Work Decisively\n\n- Evaluate the target (website, code, etc.)\n- For each finding, create a GitHub issue\n- Use: gh issue create --repo agents-squads/{repo} --title \"...\" --body \"...\" --label \"type:...,priority:P1/P2/P3,squad:${agent.squad}\"\n- Report how many issues were created\n\nDo NOT get stuck re-reading files. Evaluate, report findings, create issues, done.`;\n}\n\nfunction executeClaudePrompt(prompt: string): Promise<string> {\n return new Promise((resolve, reject) => {\n const claude = spawn('claude', ['--print', prompt], {\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n\n let output = '';\n let error = '';\n\n claude.stdout?.on('data', (data) => {\n output += data.toString();\n });\n\n claude.stderr?.on('data', (data) => {\n error += data.toString();\n });\n\n claude.on('close', (code) => {\n if (code === 0) {\n resolve(output);\n } else {\n reject(new Error(error || `Exited with code ${code}`));\n }\n });\n\n claude.on('error', reject);\n\n // 5 minute timeout per evaluator\n setTimeout(() => {\n claude.kill();\n reject(new Error('Timeout after 5 minutes'));\n }, 5 * 60 * 1000);\n });\n}\n","import chalk from 'chalk';\nimport ora from 'ora';\nimport open from 'open';\nimport {\n isPersonalEmail,\n getEmailDomain,\n saveSession,\n loadSession,\n clearSession,\n startAuthCallbackServer,\n AuthSession\n} from '../lib/auth.js';\nimport { track } from '../lib/telemetry.js';\n\nconst AUTH_URL = process.env.SQUADS_AUTH_URL || 'https://app.agents-squads.com/auth';\nconst CALLBACK_PORT = 54321;\n\nexport async function loginCommand(): Promise<void> {\n const existingSession = loadSession();\n\n if (existingSession && existingSession.status === 'active') {\n console.log(chalk.green(`✓ Already logged in as ${existingSession.email}`));\n console.log(chalk.dim(` Domain: ${existingSession.domain}`));\n console.log(chalk.dim(` Run 'squads logout' to sign out.`));\n return;\n }\n\n console.log(`\n${chalk.bold.magenta('Squads CLI Login')}\n${chalk.dim('─'.repeat(40))}\n\nOpening browser to authenticate...\n`);\n\n const spinner = ora('Waiting for authentication...').start();\n\n try {\n // Start local callback server\n const callbackPromise = startAuthCallbackServer(CALLBACK_PORT);\n\n // Open browser to auth page\n const authUrl = `${AUTH_URL}?callback=http://localhost:${CALLBACK_PORT}/callback`;\n await open(authUrl);\n\n // Wait for callback\n const { email, token } = await callbackPromise;\n\n // Check if personal email\n if (isPersonalEmail(email)) {\n spinner.fail('Personal emails not supported');\n console.log(`\n${chalk.yellow('⚠ Squads CLI is for Pro & Enterprise teams only.')}\n\nPersonal email domains (Gmail, Yahoo, etc.) are not supported.\n\n${chalk.dim('Want to stay updated?')}\n → Get our free research report: ${chalk.cyan('https://agents-squads.com/research')}\n → Follow us: ${chalk.cyan('https://x.com/agents_squads')}\n`);\n\n await track('cli.login.personal_email', { domain: getEmailDomain(email) });\n return;\n }\n\n // Save session\n const session: AuthSession = {\n email,\n domain: getEmailDomain(email),\n status: 'pending', // Will be 'active' after sales contact\n createdAt: new Date().toISOString(),\n accessToken: token,\n };\n\n saveSession(session);\n spinner.succeed(`Logged in as ${chalk.cyan(email)}`);\n\n await track('cli.login.success', { domain: session.domain });\n\n console.log(`\n${chalk.green('✓ Thanks for signing up!')}\n\n${chalk.bold('What happens next:')}\n 1. Our team will reach out within 24 hours\n 2. We'll discuss your AI agent needs\n 3. You'll get access to Pro features\n\n${chalk.dim('In the meantime:')}\n → Explore squads: ${chalk.cyan('squads status')}\n → Set goals: ${chalk.cyan('squads goal set <squad> \"<goal>\"')}\n → Read our research: ${chalk.cyan('https://agents-squads.com/research')}\n\n${chalk.dim('Questions? Email us at')} ${chalk.cyan('hello@agents-squads.com')}\n`);\n\n } catch (error) {\n spinner.fail('Login failed');\n console.error(chalk.red(error instanceof Error ? error.message : 'Unknown error'));\n }\n}\n\nexport async function logoutCommand(): Promise<void> {\n const session = loadSession();\n\n if (!session) {\n console.log(chalk.yellow('Not logged in.'));\n return;\n }\n\n clearSession();\n console.log(chalk.green(`✓ Logged out from ${session.email}`));\n await track('cli.logout');\n}\n\nexport async function whoamiCommand(): Promise<void> {\n const session = loadSession();\n\n if (!session) {\n console.log(chalk.yellow('Not logged in.'));\n console.log(chalk.dim('Run: squads login'));\n return;\n }\n\n console.log(`\n${chalk.bold('Current Session')}\n${chalk.dim('─'.repeat(30))}\nEmail: ${chalk.cyan(session.email)}\nDomain: ${session.domain}\nStatus: ${session.status === 'active' ? chalk.green('Active') : chalk.yellow('Pending')}\nSince: ${new Date(session.createdAt).toLocaleDateString()}\n`);\n}\n","import { createClient } from '@supabase/supabase-js';\nimport { existsSync, readFileSync, writeFileSync, mkdirSync } from 'fs';\nimport { join } from 'path';\nimport { homedir } from 'os';\nimport 'open';\nimport http from 'http';\n\n// Personal email domains to reject\nconst PERSONAL_DOMAINS = [\n 'gmail.com', 'googlemail.com',\n 'yahoo.com', 'yahoo.co.uk', 'yahoo.fr',\n 'hotmail.com', 'outlook.com', 'live.com', 'msn.com',\n 'icloud.com', 'me.com', 'mac.com',\n 'aol.com',\n 'protonmail.com', 'proton.me',\n 'zoho.com',\n 'mail.com',\n 'yandex.com', 'yandex.ru',\n 'gmx.com', 'gmx.de',\n 'fastmail.com',\n 'tutanota.com',\n 'hey.com',\n];\n\nconst AUTH_DIR = join(homedir(), '.squads-cli');\nconst AUTH_PATH = join(AUTH_DIR, 'auth.json');\n\nexport interface AuthSession {\n email: string;\n domain: string;\n status: 'pending' | 'contacted' | 'active';\n createdAt: string;\n accessToken?: string;\n}\n\nexport function isPersonalEmail(email: string): boolean {\n const domain = email.split('@')[1]?.toLowerCase();\n return PERSONAL_DOMAINS.includes(domain);\n}\n\nexport function getEmailDomain(email: string): string {\n return email.split('@')[1]?.toLowerCase() || '';\n}\n\nexport function saveSession(session: AuthSession): void {\n if (!existsSync(AUTH_DIR)) {\n mkdirSync(AUTH_DIR, { recursive: true });\n }\n writeFileSync(AUTH_PATH, JSON.stringify(session, null, 2));\n}\n\nexport function loadSession(): AuthSession | null {\n if (!existsSync(AUTH_PATH)) return null;\n try {\n return JSON.parse(readFileSync(AUTH_PATH, 'utf-8'));\n } catch {\n return null;\n }\n}\n\nexport function clearSession(): void {\n if (existsSync(AUTH_PATH)) {\n writeFileSync(AUTH_PATH, '');\n }\n}\n\nexport function isLoggedIn(): boolean {\n const session = loadSession();\n return session !== null && session.status === 'active';\n}\n\n// Create Supabase client (for edge function use)\nexport function createSupabaseClient(url: string, anonKey: string) {\n return createClient(url, anonKey);\n}\n\n// Local callback server for OAuth flow\nexport function startAuthCallbackServer(port: number = 54321): Promise<{ email: string; token: string }> {\n return new Promise((resolve, reject) => {\n const server = http.createServer((req, res) => {\n const url = new URL(req.url || '', `http://localhost:${port}`);\n\n if (url.pathname === '/callback') {\n const email = url.searchParams.get('email');\n const token = url.searchParams.get('token');\n const error = url.searchParams.get('error');\n\n if (error) {\n res.writeHead(200, { 'Content-Type': 'text/html' });\n res.end(`\n <html>\n <body style=\"font-family: system-ui; display: flex; justify-content: center; align-items: center; height: 100vh; margin: 0;\">\n <div style=\"text-align: center;\">\n <h1 style=\"color: #ef4444;\">❌ ${error}</h1>\n <p>You can close this window.</p>\n </div>\n </body>\n </html>\n `);\n server.close();\n reject(new Error(error));\n return;\n }\n\n if (email && token) {\n res.writeHead(200, { 'Content-Type': 'text/html' });\n res.end(`\n <html>\n <body style=\"font-family: system-ui; display: flex; justify-content: center; align-items: center; height: 100vh; margin: 0;\">\n <div style=\"text-align: center;\">\n <h1 style=\"color: #10b981;\">✓ Logged in!</h1>\n <p>Welcome, ${email}</p>\n <p style=\"color: #6b7280;\">You can close this window and return to your terminal.</p>\n </div>\n </body>\n </html>\n `);\n server.close();\n resolve({ email, token });\n } else {\n res.writeHead(400, { 'Content-Type': 'text/plain' });\n res.end('Missing email or token');\n }\n } else {\n res.writeHead(404);\n res.end();\n }\n });\n\n server.listen(port, () => {\n // Server started\n });\n\n // Timeout after 5 minutes\n setTimeout(() => {\n server.close();\n reject(new Error('Login timed out'));\n }, 5 * 60 * 1000);\n });\n}\n","/**\n * squads update - Check and install updates\n */\n\nimport { createInterface } from 'readline';\nimport {\n 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 fix: 'squads stack up postgres',\n },\n {\n name: 'Redis',\n url: `${process.env.SQUADS_BRIDGE_URL || 'http://localhost:8088'}/stats`,\n fix: 'squads stack up redis',\n },\n {\n name: 'Bridge API',\n url: `${process.env.SQUADS_BRIDGE_URL || 'http://localhost:8088'}/health`,\n fix: 'squads stack up bridge',\n },\n {\n name: 'Scheduler',\n url: `${process.env.SQUADS_SCHEDULER_URL || 'http://localhost:8090'}/health`,\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_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 // Quick tips\n 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","import { execSync } from 'child_process';\nimport { existsSync, readFileSync } from 'fs';\nimport { join } from 'path';\nimport { findMemoryDir } from '../lib/memory.js';\nimport {\n colors,\n bold,\n RESET,\n gradient,\n box,\n padEnd,\n truncate,\n icons,\n writeLine,\n} from '../lib/terminal.js';\n\ninterface TaskEntry {\n id: string;\n squad: string;\n description: string;\n status: 'active' | 'completed' | 'failed';\n startedAt: string;\n}\n\ninterface ProcessInfo {\n pid: string;\n cpu: string;\n mem: string;\n time: string;\n command: string;\n type: 'claude' | 'agent' | 'hook' | 'dev-server';\n}\n\nfunction getTasksFilePath(): string | null {\n const memoryDir = findMemoryDir();\n if (!memoryDir) return null;\n return join(memoryDir, '..', 'tasks.json');\n}\n\nfunction loadActiveTasks(): TaskEntry[] {\n const tasksPath = getTasksFilePath();\n if (!tasksPath || !existsSync(tasksPath)) return [];\n\n try {\n const data = JSON.parse(readFileSync(tasksPath, 'utf-8'));\n return data.tasks?.filter((t: TaskEntry) => t.status === 'active') || [];\n } catch {\n return [];\n }\n}\n\nfunction getRunningProcesses(): ProcessInfo[] {\n const processes: ProcessInfo[] = [];\n\n try {\n // Get Claude and related processes\n const psOutput = execSync(\n 'ps aux | grep -E \"claude|squads|astro|node.*agent\" | grep -v grep',\n { encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] }\n ).trim();\n\n if (!psOutput) return processes;\n\n for (const line of psOutput.split('\\n')) {\n const parts = line.trim().split(/\\s+/);\n if (parts.length < 11) continue;\n\n const pid = parts[1];\n const cpu = parts[2];\n const mem = parts[3];\n const time = parts[9];\n const command = parts.slice(10).join(' ');\n\n // Categorize the process\n let type: ProcessInfo['type'] = 'agent';\n if (command.includes('claude')) type = 'claude';\n else if (command.includes('squads')) type = 'hook';\n else if (command.includes('astro')) type = 'dev-server';\n\n // Skip very short-lived processes\n if (command.includes('grep')) continue;\n\n processes.push({ pid, cpu, mem, time, command, type });\n }\n } catch {\n // No matching processes\n }\n\n return processes;\n}\n\nfunction categorizeProcesses(processes: ProcessInfo[]): {\n claude: ProcessInfo[];\n hooks: ProcessInfo[];\n devServers: ProcessInfo[];\n agents: ProcessInfo[];\n} {\n return {\n claude: processes.filter(p => p.type === 'claude'),\n hooks: processes.filter(p => p.type === 'hook'),\n devServers: processes.filter(p => p.type === 'dev-server'),\n agents: processes.filter(p => p.type === 'agent'),\n };\n}\n\nfunction formatCommand(cmd: string, maxLen = 45): string {\n // Extract meaningful part of command\n if (cmd.includes('claude')) {\n return truncate('claude (session)', maxLen);\n }\n if (cmd.includes('astro dev')) {\n return truncate('astro dev server', maxLen);\n }\n if (cmd.includes('squads')) {\n const match = cmd.match(/squads\\s+(\\S+)/);\n return truncate(`squads ${match?.[1] || 'command'}`, maxLen);\n }\n return truncate(cmd, maxLen);\n}\n\nexport async function workersCommand(options: { verbose?: boolean; kill?: string } = {}): Promise<void> {\n writeLine();\n writeLine(` ${gradient('squads')} ${colors.dim}workers${RESET}`);\n writeLine();\n\n // Kill a process if requested\n if (options.kill) {\n try {\n execSync(`kill ${options.kill}`, { stdio: 'pipe' });\n writeLine(` ${icons.success} Killed process ${colors.cyan}${options.kill}${RESET}`);\n writeLine();\n return;\n } catch {\n writeLine(` ${icons.error} Failed to kill process ${colors.red}${options.kill}${RESET}`);\n writeLine();\n return;\n }\n }\n\n const activeTasks = loadActiveTasks();\n const processes = getRunningProcesses();\n const categorized = categorizeProcesses(processes);\n\n // Summary stats\n const stats = [\n `${colors.cyan}${categorized.claude.length}${RESET} claude`,\n `${colors.green}${activeTasks.length}${RESET} tasks`,\n `${colors.purple}${categorized.devServers.length}${RESET} dev servers`,\n ].join(` ${colors.dim}│${RESET} `);\n writeLine(` ${stats}`);\n writeLine();\n\n // Claude sessions\n if (categorized.claude.length > 0) {\n writeLine(` ${bold}Claude Sessions${RESET} ${colors.dim}(terminal tabs)${RESET}`);\n writeLine();\n\n const w = { pid: 8, cpu: 6, mem: 6, time: 8, cmd: 30 };\n const tableWidth = w.pid + w.cpu + w.mem + w.time + w.cmd + 8;\n\n writeLine(` ${colors.purple}${box.topLeft}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.topRight}${RESET}`);\n writeLine(` ${colors.purple}${box.vertical}${RESET} ${bold}${padEnd('PID', w.pid)}${padEnd('CPU%', w.cpu)}${padEnd('MEM%', w.mem)}${padEnd('TIME', w.time)}${padEnd('STATUS', w.cmd)}${RESET} ${colors.purple}${box.vertical}${RESET}`);\n writeLine(` ${colors.purple}${box.teeRight}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.teeLeft}${RESET}`);\n\n for (const proc of categorized.claude) {\n const cpuColor = parseFloat(proc.cpu) > 50 ? colors.yellow : colors.dim;\n const status = parseFloat(proc.cpu) > 10 ? `${icons.active} active` : `${icons.pending} idle`;\n\n const row = ` ${colors.purple}${box.vertical}${RESET} ` +\n `${colors.cyan}${padEnd(proc.pid, w.pid)}${RESET}` +\n `${cpuColor}${padEnd(proc.cpu, w.cpu)}${RESET}` +\n `${colors.dim}${padEnd(proc.mem, w.mem)}${RESET}` +\n `${colors.dim}${padEnd(proc.time, w.time)}${RESET}` +\n `${padEnd(status, w.cmd)}` +\n ` ${colors.purple}${box.vertical}${RESET}`;\n writeLine(row);\n }\n\n writeLine(` ${colors.purple}${box.bottomLeft}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.bottomRight}${RESET}`);\n writeLine();\n }\n\n // Active tasks (registered via squads progress start)\n if (activeTasks.length > 0) {\n writeLine(` ${bold}Registered Tasks${RESET} ${colors.dim}(squads progress)${RESET}`);\n writeLine();\n\n for (const task of activeTasks) {\n const elapsed = getElapsedTime(task.startedAt);\n writeLine(` ${icons.progress} ${colors.cyan}${task.squad}${RESET} ${truncate(task.description, 40)}`);\n writeLine(` ${colors.dim}id: ${task.id} · started ${elapsed} ago${RESET}`);\n }\n writeLine();\n }\n\n // Dev servers\n if (categorized.devServers.length > 0) {\n writeLine(` ${bold}Dev Servers${RESET}`);\n writeLine();\n\n for (const proc of categorized.devServers) {\n const name = formatCommand(proc.command);\n writeLine(` ${icons.active} ${colors.green}${name}${RESET} ${colors.dim}(pid: ${proc.pid})${RESET}`);\n }\n writeLine();\n }\n\n // Hooks/squads processes\n if (categorized.hooks.length > 0) {\n writeLine(` ${bold}Hook Processes${RESET}`);\n writeLine();\n\n for (const proc of categorized.hooks) {\n const name = formatCommand(proc.command);\n writeLine(` ${icons.pending} ${colors.yellow}${name}${RESET} ${colors.dim}(pid: ${proc.pid})${RESET}`);\n }\n writeLine();\n }\n\n // No workers message\n if (categorized.claude.length === 0 && activeTasks.length === 0) {\n writeLine(` ${colors.dim}No active workers${RESET}`);\n writeLine();\n }\n\n // Commands\n writeLine(` ${colors.dim}$${RESET} squads workers --kill <pid> ${colors.dim}Kill a process${RESET}`);\n writeLine(` ${colors.dim}$${RESET} squads progress ${colors.dim}Task history${RESET}`);\n writeLine();\n}\n\nfunction getElapsedTime(startTime: string): string {\n const start = new Date(startTime).getTime();\n const now = Date.now();\n const diffMs = now - start;\n\n const minutes = Math.floor(diffMs / 60000);\n const hours = Math.floor(minutes / 60);\n const days = Math.floor(hours / 24);\n\n if (days > 0) return `${days}d`;\n if (hours > 0) return `${hours}h`;\n if (minutes > 0) return `${minutes}m`;\n return '<1m';\n}\n","/**\n * 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 ? Promise.resolve(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","import { spawn } from 'child_process';\nimport { colors, RESET, gradient, writeLine } from '../lib/terminal.js';\n\ninterface WatchOptions {\n interval?: number;\n clear?: boolean;\n}\n\n/**\n * Watch command - live refresh any squads command\n * Similar to Unix `watch` but integrated with squads CLI\n */\nexport async function watchCommand(\n command: string,\n args: string[],\n options: WatchOptions\n): Promise<void> {\n const interval = (options.interval || 2) * 1000; // Default 2 seconds\n const shouldClear = options.clear !== false; // Default true\n\n // Validate command is a known squads command\n const validCommands = [\n 'status', 'workers', 'dash', 'dashboard', 'sessions',\n 'memory', 'history', 'results', 'progress', 'goal'\n ];\n\n if (!validCommands.includes(command)) {\n writeLine(` ${colors.red}Unknown command: ${command}${RESET}`);\n writeLine(` ${colors.dim}Valid commands: ${validCommands.join(', ')}${RESET}`);\n process.exit(1);\n }\n\n writeLine();\n writeLine(` ${gradient('squads')} ${colors.dim}watch${RESET} ${colors.cyan}${command}${RESET}`);\n writeLine(` ${colors.dim}Refreshing every ${options.interval || 2}s (Ctrl+C to stop)${RESET}`);\n writeLine();\n\n // Initial run\n await runCommand(command, args, shouldClear);\n\n // Set up interval\n const timer = setInterval(async () => {\n await runCommand(command, args, shouldClear);\n }, interval);\n\n // Handle Ctrl+C gracefully\n process.on('SIGINT', () => {\n clearInterval(timer);\n writeLine();\n writeLine(` ${colors.dim}Watch stopped${RESET}`);\n writeLine();\n process.exit(0);\n });\n\n // Keep process alive\n await new Promise(() => {}); // Never resolves, keeps running\n}\n\nasync function runCommand(command: string, args: string[], clear: boolean): Promise<void> {\n return new Promise((resolve) => {\n if (clear) {\n // Clear screen and move cursor to top\n process.stdout.write('\\x1b[2J\\x1b[H');\n }\n\n // Show timestamp\n const now = new Date().toLocaleTimeString();\n process.stdout.write(`\\x1b[90m${now}\\x1b[0m\\n\\n`);\n\n // Run the squads command\n const child = spawn('squads', [command, ...args], {\n stdio: 'inherit',\n env: process.env,\n });\n\n child.on('close', () => {\n resolve();\n });\n\n child.on('error', (err) => {\n writeLine(` ${colors.red}Error: ${err.message}${RESET}`);\n resolve();\n });\n });\n}\n","import blessed from 'blessed';\nimport contrib from 'blessed-contrib';\nimport { execSync } from 'child_process';\n\ninterface LiveOptions {\n minimal?: boolean;\n focus?: string;\n}\n\ninterface AgentStatus {\n name: string;\n squad: string;\n status: 'active' | 'idle' | 'done';\n duration: string;\n cpu: string;\n mem: string;\n}\n\ninterface CostData {\n today: number;\n week: number;\n budget: number;\n}\n\n/**\n * Live TUI Dashboard - Real-time squad monitoring\n * Uses blessed-contrib for terminal UI\n */\nexport async function liveCommand(_options: LiveOptions): Promise<void> {\n // Create blessed screen\n const screen = blessed.screen({\n smartCSR: true,\n title: 'Squads Live Dashboard',\n fullUnicode: true,\n });\n\n // Create grid layout\n const grid = new contrib.grid({\n rows: 12,\n cols: 12,\n screen: screen,\n });\n\n // === TOP ROW: Agents + Cost ===\n\n // Agents table (left)\n const agentsTable = grid.set(0, 0, 6, 8, contrib.table, {\n keys: true,\n fg: 'white',\n label: ' Running Agents ',\n columnSpacing: 2,\n columnWidth: [20, 12, 10, 8, 8],\n border: { type: 'line', fg: 'cyan' },\n });\n\n // Cost gauge (right)\n const costGauge = grid.set(0, 8, 3, 4, contrib.gauge, {\n label: ' Budget Used ',\n stroke: 'green',\n fill: 'white',\n border: { type: 'line', fg: 'cyan' },\n });\n\n // Cost details (right below gauge)\n const costLog = grid.set(3, 8, 3, 4, contrib.log, {\n fg: 'green',\n label: ' Cost Tracker ',\n border: { type: 'line', fg: 'cyan' },\n });\n\n // === BOTTOM ROW: Activity + Memory ===\n\n // Activity log (left)\n const activityLog = grid.set(6, 0, 6, 6, contrib.log, {\n fg: 'cyan',\n label: ' Recent Activity ',\n border: { type: 'line', fg: 'magenta' },\n });\n\n // Memory updates (right)\n const memoryLog = grid.set(6, 6, 6, 6, contrib.log, {\n fg: 'yellow',\n label: ' Memory Updates ',\n border: { type: 'line', fg: 'magenta' },\n });\n\n // === Data fetching functions ===\n\n function getAgents(): AgentStatus[] {\n try {\n const output = execSync('ps aux | grep -E \"claude|node.*squads\" | grep -v grep', {\n encoding: 'utf-8',\n timeout: 5000,\n });\n\n const agents: AgentStatus[] = [];\n const lines = output.trim().split('\\n').slice(0, 10);\n\n for (const line of lines) {\n const parts = line.trim().split(/\\s+/);\n if (parts.length >= 10) {\n const cpu = parts[2];\n const mem = parts[3];\n const time = parts[9];\n const cmd = parts.slice(10).join(' ');\n\n // Parse agent name from command\n let name = 'claude';\n let squad = 'unknown';\n\n if (cmd.includes('squads-')) {\n const match = cmd.match(/squads-(\\w+)-(\\w+)/);\n if (match) {\n squad = match[1];\n name = match[2];\n }\n }\n\n agents.push({\n name: name.substring(0, 18),\n squad: squad.substring(0, 10),\n status: parseFloat(cpu) > 5 ? 'active' : 'idle',\n duration: time,\n cpu: cpu + '%',\n mem: mem + '%',\n });\n }\n }\n\n return agents.slice(0, 8);\n } catch {\n return [];\n }\n }\n\n function getCosts(): CostData {\n // In a real implementation, this would fetch from Langfuse\n // For now, return mock data that updates\n const baseToday = 12.50;\n const baseWeek = 89.20;\n const variance = Math.random() * 0.5;\n\n return {\n today: baseToday + variance,\n week: baseWeek + variance * 10,\n budget: 200,\n };\n }\n\n function getRecentActivity(): string[] {\n try {\n const output = execSync(\n 'gh issue list --repo agents-squads/squads-cli --state open --limit 5 --json number,title,createdAt 2>/dev/null',\n { encoding: 'utf-8', timeout: 10000 }\n );\n\n const issues = JSON.parse(output);\n return issues.map((i: { number: number; title: string }) =>\n `#${i.number} ${i.title.substring(0, 40)}`\n );\n } catch {\n return ['(loading...)'];\n }\n }\n\n function getMemoryUpdates(): string[] {\n try {\n const output = execSync(\n 'find .agents/memory -name \"state.md\" -mmin -60 2>/dev/null | head -5',\n { encoding: 'utf-8', timeout: 5000 }\n );\n\n return output.trim().split('\\n')\n .filter(Boolean)\n .map(path => {\n const parts = path.split('/');\n const squad = parts[2] || '';\n const agent = parts[3] || '';\n return `${squad}/${agent}`;\n });\n } catch {\n return ['(no recent updates)'];\n }\n }\n\n // === Update functions ===\n\n function updateAgents() {\n const agents = getAgents();\n const data = agents.length > 0\n ? agents.map(a => [a.name, a.squad, a.status === 'active' ? '● active' : '○ idle', a.cpu, a.mem])\n : [['(no agents running)', '', '', '', '']];\n\n agentsTable.setData({\n headers: ['Agent', 'Squad', 'Status', 'CPU', 'MEM'],\n data: data,\n });\n }\n\n function updateCosts() {\n const costs = getCosts();\n const percent = Math.round((costs.week / costs.budget) * 100);\n\n costGauge.setPercent(percent);\n costLog.log(`Today: $${costs.today.toFixed(2)}`);\n costLog.log(`Week: $${costs.week.toFixed(2)} / $${costs.budget}`);\n }\n\n function updateActivity() {\n const activities = getRecentActivity();\n activities.forEach(a => activityLog.log(a));\n }\n\n function updateMemory() {\n const updates = getMemoryUpdates();\n updates.forEach(u => memoryLog.log(u));\n }\n\n // === Initial render ===\n updateAgents();\n updateCosts();\n updateActivity();\n updateMemory();\n screen.render();\n\n // === Set up refresh intervals ===\n const agentInterval = setInterval(() => {\n updateAgents();\n screen.render();\n }, 2000);\n\n const costInterval = setInterval(() => {\n updateCosts();\n screen.render();\n }, 5000);\n\n const activityInterval = setInterval(() => {\n updateActivity();\n screen.render();\n }, 10000);\n\n const memoryInterval = setInterval(() => {\n updateMemory();\n screen.render();\n }, 15000);\n\n // === Key bindings ===\n screen.key(['escape', 'q', 'C-c'], () => {\n clearInterval(agentInterval);\n clearInterval(costInterval);\n clearInterval(activityInterval);\n clearInterval(memoryInterval);\n return process.exit(0);\n });\n\n screen.key(['r'], () => {\n updateAgents();\n updateCosts();\n updateActivity();\n updateMemory();\n screen.render();\n });\n\n // Focus on agents table\n agentsTable.focus();\n}\n","import { execSync } from 'child_process';\n\ninterface ProcessInfo {\n pid: string;\n cpu: string;\n mem: string;\n time: string;\n status: 'active' | 'idle';\n cmd: string;\n}\n\n// ANSI escape codes\nconst ESC = '\\x1b';\nconst CLEAR_SCREEN = `${ESC}[2J`;\nconst CURSOR_HOME = `${ESC}[H`;\nconst CURSOR_HIDE = `${ESC}[?25l`;\nconst CURSOR_SHOW = `${ESC}[?25h`;\nconst BOLD = `${ESC}[1m`;\nconst DIM = `${ESC}[2m`;\nconst RESET = `${ESC}[0m`;\nconst CYAN = `${ESC}[36m`;\nconst GREEN = `${ESC}[32m`;\nconst YELLOW = `${ESC}[33m`;\nconst MAGENTA = `${ESC}[35m`;\n\n/**\n * Top command - live updating process table like Unix top\n * Single table, numbers update in place\n */\nexport async function topCommand(): Promise<void> {\n // Hide cursor and clear screen once\n process.stdout.write(CURSOR_HIDE + CLEAR_SCREEN + CURSOR_HOME);\n\n let running = true;\n\n // Handle exit\n const cleanup = () => {\n running = false;\n process.stdout.write(CURSOR_SHOW + '\\n');\n process.exit(0);\n };\n\n process.on('SIGINT', cleanup);\n process.on('SIGTERM', cleanup);\n\n // Main loop\n while (running) {\n const data = getProcessData();\n render(data);\n await sleep(1000); // Update every 1 second like top\n }\n}\n\nfunction getProcessData(): { processes: ProcessInfo[]; summary: { claude: number; tasks: number; agents: number } } {\n const processes: ProcessInfo[] = [];\n let claudeCount = 0;\n let agentCount = 0;\n\n try {\n // Get Claude processes\n const psOutput = execSync(\n 'ps aux | grep -E \"[c]laude\" | head -15',\n { encoding: 'utf-8', timeout: 5000 }\n );\n\n const lines = psOutput.trim().split('\\n').filter(Boolean);\n\n for (const line of lines) {\n const parts = line.trim().split(/\\s+/);\n if (parts.length >= 11) {\n const pid = parts[1];\n const cpu = parts[2];\n const mem = parts[3];\n const time = parts[9];\n const cmd = parts.slice(10).join(' ').substring(0, 30);\n\n const cpuNum = parseFloat(cpu);\n const status = cpuNum > 5 ? 'active' : 'idle';\n\n if (cmd.includes('squads-')) {\n agentCount++;\n }\n claudeCount++;\n\n processes.push({ pid, cpu, mem, time, status, cmd });\n }\n }\n } catch {\n // No processes found\n }\n\n // Get tmux agent sessions\n try {\n const tmuxOutput = execSync('tmux ls 2>/dev/null | grep squads- | wc -l', { encoding: 'utf-8' });\n agentCount = parseInt(tmuxOutput.trim()) || 0;\n } catch {\n // tmux not available or no sessions\n }\n\n return {\n processes: processes.slice(0, 12),\n summary: { claude: claudeCount, tasks: 0, agents: agentCount }\n };\n}\n\nfunction render(data: { processes: ProcessInfo[]; summary: { claude: number; tasks: number; agents: number } }): void {\n const now = new Date().toLocaleTimeString();\n const lines: string[] = [];\n\n // Header\n lines.push('');\n lines.push(` ${MAGENTA}squads${RESET} ${DIM}top${RESET} ${DIM}${now}${RESET} ${DIM}(q to quit)${RESET}`);\n lines.push('');\n\n // Summary line\n const activeCount = data.processes.filter(p => p.status === 'active').length;\n lines.push(` ${CYAN}${data.summary.claude}${RESET} claude ${DIM}│${RESET} ${GREEN}${activeCount}${RESET} active ${DIM}│${RESET} ${YELLOW}${data.summary.agents}${RESET} agents`);\n lines.push('');\n\n // Table header\n lines.push(` ${BOLD}PID CPU% MEM% TIME STATUS${RESET}`);\n lines.push(` ${DIM}${'─'.repeat(50)}${RESET}`);\n\n // Process rows\n if (data.processes.length === 0) {\n lines.push(` ${DIM}(no claude processes)${RESET}`);\n } else {\n for (const p of data.processes) {\n const statusIcon = p.status === 'active' ? `${GREEN}●${RESET}` : `${DIM}○${RESET}`;\n const statusText = p.status === 'active' ? `${GREEN}active${RESET}` : `${DIM}idle${RESET}`;\n const cpuColor = parseFloat(p.cpu) > 10 ? YELLOW : '';\n\n lines.push(\n ` ${CYAN}${p.pid.padEnd(8)}${RESET}` +\n `${cpuColor}${p.cpu.padStart(5)}${RESET} ` +\n `${p.mem.padStart(5)} ` +\n `${p.time.padEnd(10)}` +\n `${statusIcon} ${statusText}`\n );\n }\n }\n\n // Footer\n lines.push('');\n lines.push(` ${DIM}Press q to quit, r to refresh${RESET}`);\n lines.push('');\n\n // Move cursor home and render\n process.stdout.write(CURSOR_HOME);\n\n // Write each line, clearing to end of line\n for (const line of lines) {\n process.stdout.write(line + `${ESC}[K\\n`);\n }\n\n // Clear remaining lines\n for (let i = 0; i < 5; i++) {\n process.stdout.write(`${ESC}[K\\n`);\n }\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, ms));\n}\n\n// Handle keypress for quit\nif (process.stdin.isTTY) {\n process.stdin.setRawMode(true);\n process.stdin.resume();\n process.stdin.on('data', (key) => {\n // q or Ctrl+C\n if (key.toString() === 'q' || key[0] === 3) {\n process.stdout.write(CURSOR_SHOW + '\\n');\n process.exit(0);\n }\n // r for refresh (handled by main loop anyway)\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 * 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 { existsSync } from \"fs\";\n\nconst SCHEDULER_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(`${SCHEDULER_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 const params = squad ? `?squad=${squad}` : \"\";\n const triggers = await fetchScheduler<Trigger[]>(`/triggers${params}`);\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 // Call the Python sync script\n const { execSync } = await import(\"child_process\");\n const hqPath = process.env.HQ_PATH || `${process.env.HOME}/agents-squads/hq`;\n\n try {\n // Use venv Python if available, fallback to system python3\n const venvPython = `${hqPath}/squads-scheduler/.venv/bin/python`;\n const pythonCmd = existsSync(venvPython) ? venvPython : \"python3\";\n const output = execSync(\n `${pythonCmd} ${hqPath}/squads-scheduler/sync_triggers.py`,\n { encoding: \"utf-8\", cwd: hqPath }\n );\n console.log(output);\n } catch (error: unknown) {\n const execError = error as { stdout?: string; stderr?: string };\n console.error(chalk.red(\"Sync failed:\"), execError.stderr || execError);\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: ${SCHEDULER_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 * Skill management commands for Agent Skills API\n *\n * Commands:\n * - squads skill list # List uploaded skills\n * - squads skill upload <path> # Upload a skill directory\n * - squads skill delete <id> # Delete a skill\n * - squads skill show <id> # Show skill details\n * - squads skill convert <agent> # Convert agent.md to SKILL.md format\n */\n\nimport { Command } from 'commander';\nimport ora from 'ora';\nimport { existsSync, mkdirSync, writeFileSync, readFileSync } from 'fs';\nimport { join, basename, dirname } from 'path';\nimport {\n listSkills,\n uploadSkill,\n deleteSkill,\n getSkill,\n isApiKeyConfigured\n} from '../lib/anthropic.js';\nimport { findSquadsDir } from '../lib/squad-parser.js';\nimport {\n colors,\n RESET,\n gradient,\n icons,\n writeLine\n} from '../lib/terminal.js';\n\n/**\n * Register skill command with the CLI program\n */\nexport function registerSkillCommand(program: Command): void {\n const skill = program\n .command('skill')\n .description('Manage Agent Skills (upload, list, delete)');\n\n // List skills\n skill\n .command('list')\n .description('List uploaded skills from Anthropic API')\n .action(skillListCommand);\n\n // Upload skill\n skill\n .command('upload <path>')\n .description('Upload a skill directory to Anthropic API')\n .action(skillUploadCommand);\n\n // Delete skill\n skill\n .command('delete <skillId>')\n .description('Delete a skill from Anthropic API')\n .option('-f, --force', 'Skip confirmation prompt')\n .action(skillDeleteCommand);\n\n // Show skill details\n skill\n .command('show <skillId>')\n .description('Show details for a skill')\n .action(skillShowCommand);\n\n // Convert agent to skill format\n skill\n .command('convert <agent>')\n .description('Convert an agent.md file to SKILL.md format')\n .option('-o, --output <path>', 'Output directory (default: .agents/skills/<agent-name>)')\n .action(skillConvertCommand);\n}\n\n/**\n * List all uploaded skills\n */\nasync function skillListCommand(): Promise<void> {\n writeLine();\n writeLine(` ${gradient('Skills')} ${colors.dim}list${RESET}`);\n writeLine();\n\n if (!isApiKeyConfigured()) {\n writeLine(` ${icons.error} ${colors.red}ANTHROPIC_API_KEY not configured${RESET}`);\n writeLine(` ${colors.dim}Set the environment variable to use skills management.${RESET}`);\n writeLine();\n return;\n }\n\n const spinner = ora('Fetching skills...').start();\n\n try {\n const skills = await listSkills();\n\n if (skills.length === 0) {\n spinner.info('No skills uploaded yet');\n writeLine();\n writeLine(` ${colors.dim}Upload a skill:${RESET}`);\n writeLine(` ${colors.cyan}squads skill upload <path>${RESET}`);\n writeLine();\n writeLine(` ${colors.dim}Convert an agent to skill format:${RESET}`);\n writeLine(` ${colors.cyan}squads skill convert <squad>/<agent>${RESET}`);\n writeLine();\n return;\n }\n\n spinner.succeed(`Found ${skills.length} skill(s)`);\n writeLine();\n\n // Display skills table\n writeLine(` ${colors.dim}ID${RESET} ${colors.dim}Title${RESET} ${colors.dim}Updated${RESET}`);\n writeLine(` ${colors.dim}${'─'.repeat(60)}${RESET}`);\n\n for (const skill of skills) {\n const id = skill.id.slice(0, 20).padEnd(22);\n const title = (skill.display_title || 'Untitled').slice(0, 20).padEnd(22);\n const updated = new Date(skill.updated_at).toLocaleDateString();\n writeLine(` ${colors.cyan}${id}${RESET}${title}${colors.dim}${updated}${RESET}`);\n }\n\n writeLine();\n } catch (error) {\n spinner.fail('Failed to list skills');\n writeLine(` ${colors.red}${error instanceof Error ? error.message : String(error)}${RESET}`);\n writeLine();\n }\n}\n\n/**\n * Upload a skill directory\n */\nasync function skillUploadCommand(skillPath: string): Promise<void> {\n writeLine();\n writeLine(` ${gradient('Skills')} ${colors.dim}upload${RESET}`);\n writeLine();\n\n if (!isApiKeyConfigured()) {\n writeLine(` ${icons.error} ${colors.red}ANTHROPIC_API_KEY not configured${RESET}`);\n writeLine(` ${colors.dim}Set the environment variable to use skills management.${RESET}`);\n writeLine();\n return;\n }\n\n // Resolve path\n const fullPath = skillPath.startsWith('/') ? skillPath : join(process.cwd(), skillPath);\n\n if (!existsSync(fullPath)) {\n writeLine(` ${icons.error} ${colors.red}Directory not found: ${skillPath}${RESET}`);\n writeLine();\n return;\n }\n\n // Check for SKILL.md\n const skillMdPath = join(fullPath, 'SKILL.md');\n if (!existsSync(skillMdPath)) {\n writeLine(` ${icons.error} ${colors.red}SKILL.md not found in ${skillPath}${RESET}`);\n writeLine();\n writeLine(` ${colors.dim}Create a SKILL.md file or use:${RESET}`);\n writeLine(` ${colors.cyan}squads skill convert <squad>/<agent>${RESET}`);\n writeLine();\n return;\n }\n\n const spinner = ora('Uploading skill...').start();\n\n try {\n const skill = await uploadSkill(fullPath);\n spinner.succeed(`Skill uploaded: ${skill.display_title}`);\n writeLine();\n writeLine(` ${colors.dim}ID:${RESET} ${colors.cyan}${skill.id}${RESET}`);\n if (skill.description) {\n writeLine(` ${colors.dim}Description:${RESET} ${skill.description}`);\n }\n writeLine();\n writeLine(` ${colors.dim}Use in run command:${RESET}`);\n writeLine(` ${colors.cyan}squads run <squad> --skills ${skill.id}${RESET}`);\n writeLine();\n } catch (error) {\n spinner.fail('Failed to upload skill');\n writeLine(` ${colors.red}${error instanceof Error ? error.message : String(error)}${RESET}`);\n writeLine();\n }\n}\n\n/**\n * Delete a skill\n */\nasync function skillDeleteCommand(skillId: string, options: { force?: boolean }): Promise<void> {\n writeLine();\n writeLine(` ${gradient('Skills')} ${colors.dim}delete${RESET}`);\n writeLine();\n\n if (!isApiKeyConfigured()) {\n writeLine(` ${icons.error} ${colors.red}ANTHROPIC_API_KEY not configured${RESET}`);\n writeLine();\n return;\n }\n\n if (!options.force) {\n writeLine(` ${colors.yellow}Warning: This will permanently delete the skill.${RESET}`);\n writeLine(` ${colors.dim}Use --force to skip this confirmation.${RESET}`);\n writeLine();\n // In a real CLI, we'd prompt for confirmation here\n // For now, require --force\n return;\n }\n\n const spinner = ora('Deleting skill...').start();\n\n try {\n await deleteSkill(skillId);\n spinner.succeed(`Skill deleted: ${skillId}`);\n writeLine();\n } catch (error) {\n spinner.fail('Failed to delete skill');\n writeLine(` ${colors.red}${error instanceof Error ? error.message : String(error)}${RESET}`);\n writeLine();\n }\n}\n\n/**\n * Show skill details\n */\nasync function skillShowCommand(skillId: string): Promise<void> {\n writeLine();\n writeLine(` ${gradient('Skills')} ${colors.dim}show${RESET}`);\n writeLine();\n\n if (!isApiKeyConfigured()) {\n writeLine(` ${icons.error} ${colors.red}ANTHROPIC_API_KEY not configured${RESET}`);\n writeLine();\n return;\n }\n\n const spinner = ora('Fetching skill...').start();\n\n try {\n const skill = await getSkill(skillId);\n\n if (!skill) {\n spinner.fail(`Skill not found: ${skillId}`);\n writeLine();\n return;\n }\n\n spinner.succeed(`Found skill: ${skill.display_title}`);\n writeLine();\n writeLine(` ${colors.dim}ID:${RESET} ${colors.cyan}${skill.id}${RESET}`);\n writeLine(` ${colors.dim}Title:${RESET} ${skill.display_title}`);\n if (skill.description) {\n writeLine(` ${colors.dim}Description:${RESET} ${skill.description}`);\n }\n writeLine(` ${colors.dim}Created:${RESET} ${new Date(skill.created_at).toLocaleString()}`);\n writeLine(` ${colors.dim}Updated:${RESET} ${new Date(skill.updated_at).toLocaleString()}`);\n\n if (skill.files && skill.files.length > 0) {\n writeLine();\n writeLine(` ${colors.dim}Files:${RESET}`);\n for (const file of skill.files) {\n const size = Buffer.byteLength(file.content, 'utf-8');\n writeLine(` ${colors.cyan}${file.name}${RESET} ${colors.dim}(${formatBytes(size)})${RESET}`);\n }\n }\n\n writeLine();\n } catch (error) {\n spinner.fail('Failed to fetch skill');\n writeLine(` ${colors.red}${error instanceof Error ? error.message : String(error)}${RESET}`);\n writeLine();\n }\n}\n\n/**\n * Convert an agent.md file to SKILL.md format\n */\nasync function skillConvertCommand(\n agentPath: string,\n options: { output?: string }\n): Promise<void> {\n writeLine();\n writeLine(` ${gradient('Skills')} ${colors.dim}convert${RESET}`);\n writeLine();\n\n const squadsDir = findSquadsDir();\n if (!squadsDir) {\n writeLine(` ${icons.error} ${colors.red}No .agents/squads directory found${RESET}`);\n writeLine();\n return;\n }\n\n // Parse agent path (squad/agent or just agent)\n let agentFilePath: string;\n let squadName: string;\n let agentName: string;\n\n if (agentPath.includes('/')) {\n const [squad, agent] = agentPath.split('/');\n squadName = squad;\n agentName = agent.replace('.md', '');\n agentFilePath = join(squadsDir, squad, `${agentName}.md`);\n } else {\n // Search for agent in all squads\n agentName = agentPath.replace('.md', '');\n const foundPath = findAgentFile(squadsDir, agentName);\n if (!foundPath) {\n writeLine(` ${icons.error} ${colors.red}Agent not found: ${agentPath}${RESET}`);\n writeLine(` ${colors.dim}Use format: squad/agent (e.g., cli/code-eval)${RESET}`);\n writeLine();\n return;\n }\n agentFilePath = foundPath;\n squadName = basename(dirname(agentFilePath));\n }\n\n if (!existsSync(agentFilePath)) {\n writeLine(` ${icons.error} ${colors.red}Agent file not found: ${agentFilePath}${RESET}`);\n writeLine();\n return;\n }\n\n // Read agent definition\n const agentContent = readFileSync(agentFilePath, 'utf-8');\n\n // Determine output directory\n const skillName = `${squadName}-${agentName}`;\n const outputDir = options.output ||\n join(dirname(squadsDir), 'skills', skillName);\n\n // Create output directory\n if (!existsSync(outputDir)) {\n mkdirSync(outputDir, { recursive: true });\n }\n\n // Convert to SKILL.md format\n const skillMd = convertAgentToSkill(agentContent, squadName, agentName);\n\n // Write SKILL.md\n const skillMdPath = join(outputDir, 'SKILL.md');\n writeFileSync(skillMdPath, skillMd);\n\n writeLine(` ${icons.success} ${colors.green}Converted:${RESET} ${agentPath}`);\n writeLine();\n writeLine(` ${colors.dim}Output:${RESET} ${outputDir}`);\n writeLine(` ${colors.dim}Files:${RESET}`);\n writeLine(` ${colors.cyan}SKILL.md${RESET}`);\n writeLine();\n writeLine(` ${colors.dim}Next steps:${RESET}`);\n writeLine(` 1. Review and edit ${colors.cyan}SKILL.md${RESET}`);\n writeLine(` 2. Add scripts or examples if needed`);\n writeLine(` 3. Upload: ${colors.cyan}squads skill upload ${outputDir}${RESET}`);\n writeLine();\n}\n\n/**\n * Find an agent file by name across all squads\n */\nfunction findAgentFile(squadsDir: string, agentName: string): string | null {\n const { readdirSync } = require('fs');\n const squads = readdirSync(squadsDir, { withFileTypes: true })\n .filter((d: { isDirectory: () => boolean; name: string }) =>\n d.isDirectory() && !d.name.startsWith('_'))\n .map((d: { name: string }) => d.name);\n\n for (const squad of squads) {\n const agentPath = join(squadsDir, squad, `${agentName}.md`);\n if (existsSync(agentPath)) {\n return agentPath;\n }\n }\n\n return null;\n}\n\n/**\n * Convert agent.md content to SKILL.md format\n */\nfunction convertAgentToSkill(\n agentContent: string,\n squadName: string,\n agentName: string\n): string {\n // Extract existing frontmatter if present\n const existingMeta: Record<string, string> = {};\n let bodyContent = agentContent;\n\n const frontmatterMatch = agentContent.match(/^---\\n([\\s\\S]*?)\\n---\\n?([\\s\\S]*)/);\n if (frontmatterMatch) {\n const frontmatter = frontmatterMatch[1];\n bodyContent = frontmatterMatch[2];\n\n // Parse simple YAML key: value pairs\n for (const line of frontmatter.split('\\n')) {\n const match = line.match(/^(\\w+):\\s*(.+)$/);\n if (match) {\n existingMeta[match[1]] = match[2].trim();\n }\n }\n }\n\n // Extract title from first heading if not in frontmatter\n const title = existingMeta.name ||\n bodyContent.match(/^#\\s+(?:Agent:\\s*)?(.+)$/m)?.[1] ||\n `${squadName}-${agentName}`;\n\n // Extract role/description from agent content\n const roleMatch = bodyContent.match(/^(?:role|description):\\s*(.+)$/mi) ||\n bodyContent.match(/^##?\\s*(?:Role|Purpose|Description)\\s*\\n+(.+)/mi);\n const description = existingMeta.description ||\n roleMatch?.[1] ||\n `Agent from ${squadName} squad. Use when working on ${agentName}-related tasks.`;\n\n // Build SKILL.md\n const skillMd = `---\nname: ${squadName}-${agentName}\ndescription: ${description}\n---\n\n# ${title}\n\n${bodyContent.trim()}\n`;\n\n return skillMd;\n}\n\n/**\n * Format bytes to human readable string\n */\nfunction formatBytes(bytes: number): string {\n if (bytes < 1024) return `${bytes}B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)}KB`;\n return `${(bytes / 1024 / 1024).toFixed(2)}MB`;\n}\n","/**\n * Anthropic SDK wrapper for Skills API\n *\n * Handles direct API calls for skills management:\n * - List uploaded skills\n * - Upload new skills\n * - Delete skills\n * - Get skill details\n */\n\nimport Anthropic from '@anthropic-ai/sdk';\nimport { readFileSync, readdirSync } from 'fs';\nimport { join } from 'path';\n\n// Beta headers required for Skills API (reserved for API implementation)\nconst _SKILLS_BETA = 'skills-2025-10-02';\nconst _CODE_EXECUTION_BETA = 'code-execution-2025-08-25';\n\nexport interface Skill {\n id: string;\n display_title: string;\n description?: string;\n created_at: string;\n updated_at: string;\n files?: SkillFile[];\n}\n\nexport interface SkillFile {\n name: string;\n content: string;\n}\n\nlet client: Anthropic | null = null;\n\n/**\n * Get or create Anthropic client instance\n */\nfunction getClient(): Anthropic {\n if (!client) {\n const apiKey = process.env.ANTHROPIC_API_KEY;\n if (!apiKey) {\n throw new Error('ANTHROPIC_API_KEY environment variable is required for skills management');\n }\n client = new Anthropic({ apiKey });\n }\n return client;\n}\n\n/**\n * List all uploaded skills\n */\nexport async function listSkills(): Promise<Skill[]> {\n // Validate API key is available\n getClient();\n\n try {\n // Note: The actual Skills API may have a different endpoint\n // This is a placeholder until we have the exact API spec\n // Real implementation will use: anthropic.beta.skills.list({ betas: [SKILLS_BETA] })\n console.warn('Skills API: Using placeholder implementation. Actual API may differ.');\n return [];\n } catch (error) {\n if (error instanceof Error && error.message.includes('404')) {\n // Skills not supported yet or endpoint not found\n return [];\n }\n throw error;\n }\n}\n\n/**\n * Load skill files from a directory\n * Expects: SKILL.md and optionally scripts/, examples/, etc.\n */\nexport function loadSkillFiles(skillPath: string): SkillFile[] {\n const files: SkillFile[] = [];\n\n function walkDir(dir: string, prefix = ''): void {\n const entries = readdirSync(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n const fullPath = join(dir, entry.name);\n const relativePath = prefix ? `${prefix}/${entry.name}` : entry.name;\n\n if (entry.isDirectory()) {\n // Recursively walk subdirectories\n walkDir(fullPath, relativePath);\n } else if (entry.isFile()) {\n // Read file content\n const content = readFileSync(fullPath, 'utf-8');\n files.push({\n name: relativePath,\n content\n });\n }\n }\n }\n\n walkDir(skillPath);\n return files;\n}\n\n/**\n * Extract skill title from SKILL.md frontmatter or first heading\n */\nexport function extractSkillTitle(files: SkillFile[]): string {\n const skillMd = files.find(f => f.name === 'SKILL.md' || f.name.endsWith('/SKILL.md'));\n if (!skillMd) {\n throw new Error('SKILL.md not found in skill directory');\n }\n\n const content = skillMd.content;\n\n // Try YAML frontmatter first\n const frontmatterMatch = content.match(/^---\\n([\\s\\S]*?)\\n---/);\n if (frontmatterMatch) {\n const nameMatch = frontmatterMatch[1].match(/^name:\\s*(.+)$/m);\n if (nameMatch) {\n return nameMatch[1].trim();\n }\n }\n\n // Fall back to first markdown heading\n const headingMatch = content.match(/^#\\s+(.+)$/m);\n if (headingMatch) {\n return headingMatch[1].trim();\n }\n\n throw new Error('Could not extract skill title from SKILL.md');\n}\n\n/**\n * Extract skill description from SKILL.md\n */\nexport function extractSkillDescription(files: SkillFile[]): string | undefined {\n const skillMd = files.find(f => f.name === 'SKILL.md' || f.name.endsWith('/SKILL.md'));\n if (!skillMd) return undefined;\n\n const content = skillMd.content;\n\n // Try YAML frontmatter first\n const frontmatterMatch = content.match(/^---\\n([\\s\\S]*?)\\n---/);\n if (frontmatterMatch) {\n const descMatch = frontmatterMatch[1].match(/^description:\\s*(.+)$/m);\n if (descMatch) {\n return descMatch[1].trim();\n }\n }\n\n // Fall back to first paragraph after heading\n const paragraphMatch = content.match(/^#.+\\n+(.+)/m);\n if (paragraphMatch) {\n return paragraphMatch[1].trim();\n }\n\n return undefined;\n}\n\n/**\n * Upload a skill to Anthropic\n */\nexport async function uploadSkill(skillPath: string): Promise<Skill> {\n // Validate API key is available\n getClient();\n const files = loadSkillFiles(skillPath);\n\n if (files.length === 0) {\n throw new Error(`No files found in skill directory: ${skillPath}`);\n }\n\n // Check total size (8MB limit)\n const totalSize = files.reduce((sum, f) => sum + Buffer.byteLength(f.content, 'utf-8'), 0);\n const maxSize = 8 * 1024 * 1024; // 8MB\n if (totalSize > maxSize) {\n throw new Error(`Skill size ${(totalSize / 1024 / 1024).toFixed(2)}MB exceeds 8MB limit`);\n }\n\n const displayTitle = extractSkillTitle(files);\n const description = extractSkillDescription(files);\n\n try {\n // Note: This is a placeholder for the actual Skills API endpoint\n // The real implementation will use the correct beta endpoint\n console.log(`Uploading skill: ${displayTitle}`);\n console.log(`Files: ${files.map(f => f.name).join(', ')}`);\n console.log(`Total size: ${(totalSize / 1024).toFixed(2)}KB`);\n\n // Placeholder response until we have actual API spec\n const skill: Skill = {\n id: `skill_${Date.now()}`,\n display_title: displayTitle,\n description,\n created_at: new Date().toISOString(),\n updated_at: new Date().toISOString(),\n files\n };\n\n console.warn('Skills API: Using placeholder implementation. Skill not actually uploaded.');\n return skill;\n } catch (error) {\n throw new Error(`Failed to upload skill: ${error instanceof Error ? error.message : String(error)}`);\n }\n}\n\n/**\n * Delete a skill by ID\n */\nexport async function deleteSkill(skillId: string): Promise<void> {\n // Validate API key is available\n getClient();\n\n try {\n // Placeholder until we have actual API spec\n console.log(`Deleting skill: ${skillId}`);\n console.warn('Skills API: Using placeholder implementation. Skill not actually deleted.');\n } catch (error) {\n throw new Error(`Failed to delete skill: ${error instanceof Error ? error.message : String(error)}`);\n }\n}\n\n/**\n * Get skill details by ID\n */\nexport async function getSkill(skillId: string): Promise<Skill | null> {\n // Validate API key is available\n getClient();\n\n try {\n // Placeholder until we have actual API spec\n console.log(`Getting skill: ${skillId}`);\n console.warn('Skills API: Using placeholder implementation.');\n return null;\n } catch (error) {\n if (error instanceof Error && error.message.includes('404')) {\n return null;\n }\n throw error;\n }\n}\n\n/**\n * Check if API key is configured\n */\nexport function isApiKeyConfigured(): boolean {\n return !!process.env.ANTHROPIC_API_KEY;\n}\n","/**\n * Permission management commands\n *\n * Phase 3 of the Squads as Execution Contexts RFC (#110)\n *\n * Commands:\n * - squads permissions show <squad> Show permission context for a squad\n * - squads permissions check <squad> Validate permissions before execution\n */\n\nimport { Command } from 'commander';\nimport { readFileSync } from 'fs';\nimport { join } from 'path';\nimport {\n buildContextFromSquad,\n validateExecution,\n formatViolations,\n getDefaultContext,\n ExecutionRequest\n} from '../lib/permissions.js';\nimport { findSquadsDir, loadSquad } from '../lib/squad-parser.js';\nimport {\n colors,\n bold,\n RESET,\n gradient,\n icons,\n writeLine\n} from '../lib/terminal.js';\n\n/**\n * Register permissions command with the CLI program\n */\nexport function registerPermissionsCommand(program: Command): void {\n const permissions = program\n .command('permissions')\n .alias('perms')\n .description('Manage and validate squad permissions');\n\n // Show permission context\n permissions\n .command('show <squad>')\n .description('Show permission context for a squad')\n .action(permissionsShowCommand);\n\n // Check permissions\n permissions\n .command('check <squad>')\n .description('Validate permissions before execution')\n .option('-a, --agent <agent>', 'Specify agent for context')\n .option('--mcp <servers...>', 'MCP servers to validate')\n .option('--bash <commands...>', 'Bash commands to validate')\n .option('--write <paths...>', 'Write paths to validate')\n .option('--read <paths...>', 'Read paths to validate')\n .action(permissionsCheckCommand);\n}\n\n/**\n * Show permission context for a squad\n */\nasync function permissionsShowCommand(squadName: string): Promise<void> {\n writeLine();\n writeLine(` ${gradient('Permissions')} ${colors.dim}show${RESET} ${colors.cyan}${squadName}${RESET}`);\n writeLine();\n\n const squadsDir = findSquadsDir();\n if (!squadsDir) {\n writeLine(` ${icons.error} ${colors.red}No .agents/squads directory found${RESET}`);\n writeLine();\n return;\n }\n\n const squad = loadSquad(squadName);\n if (!squad) {\n writeLine(` ${icons.error} ${colors.red}Squad \"${squadName}\" not found${RESET}`);\n writeLine();\n return;\n }\n\n // Load permissions from SQUAD.md\n const squadFilePath = join(squadsDir, squadName, 'SQUAD.md');\n const squadContent = readFileSync(squadFilePath, 'utf-8');\n const context = buildContextFromSquad(squadName, squadContent);\n\n // Check if using defaults\n const defaults = getDefaultContext(squadName);\n const isDefault = JSON.stringify(context.permissions) === JSON.stringify(defaults.permissions);\n\n writeLine(` ${bold}Squad:${RESET} ${squadName}`);\n if (squad.mission) {\n writeLine(` ${colors.dim}${squad.mission}${RESET}`);\n }\n writeLine();\n\n if (isDefault) {\n writeLine(` ${icons.warning} ${colors.yellow}Using default (permissive) permissions${RESET}`);\n writeLine(` ${colors.dim}Add a permissions block to SQUAD.md to restrict access.${RESET}`);\n writeLine();\n }\n\n // Mode\n writeLine(` ${bold}Mode:${RESET} ${formatMode(context.permissions.mode)}`);\n writeLine();\n\n // Bash commands\n writeLine(` ${bold}Bash Commands:${RESET}`);\n if (context.permissions.bash.includes('*')) {\n writeLine(` ${colors.dim}All commands allowed (*)${RESET}`);\n } else {\n for (const cmd of context.permissions.bash) {\n writeLine(` ${icons.active} ${cmd}`);\n }\n }\n writeLine();\n\n // File access\n writeLine(` ${bold}Write Paths:${RESET}`);\n if (context.permissions.write.includes('**') || context.permissions.write.includes('*')) {\n writeLine(` ${colors.dim}All paths writable (**)${RESET}`);\n } else {\n for (const path of context.permissions.write) {\n writeLine(` ${icons.active} ${path}`);\n }\n }\n writeLine();\n\n writeLine(` ${bold}Read Paths:${RESET}`);\n if (context.permissions.read.includes('**') || context.permissions.read.includes('*')) {\n writeLine(` ${colors.dim}All paths readable (**)${RESET}`);\n } else {\n for (const path of context.permissions.read) {\n writeLine(` ${icons.active} ${path}`);\n }\n }\n writeLine();\n\n // MCP servers\n writeLine(` ${bold}MCP Servers:${RESET}`);\n if (context.permissions.mcp.allow.includes('*')) {\n writeLine(` ${colors.dim}All servers allowed (*)${RESET}`);\n } else {\n writeLine(` ${colors.green}Allow:${RESET}`);\n for (const server of context.permissions.mcp.allow) {\n writeLine(` ${icons.success} ${server}`);\n }\n }\n if (context.permissions.mcp.deny.length > 0) {\n writeLine(` ${colors.red}Deny:${RESET}`);\n for (const server of context.permissions.mcp.deny) {\n writeLine(` ${icons.error} ${server}`);\n }\n }\n writeLine();\n\n // Help for adding permissions\n if (isDefault) {\n writeLine(` ${bold}Add permissions to SQUAD.md:${RESET}`);\n writeLine();\n writeLine(` ${colors.dim}\\`\\`\\`yaml${RESET}`);\n writeLine(` ${colors.dim}permissions:${RESET}`);\n writeLine(` ${colors.dim} mode: warn # or strict, audit${RESET}`);\n writeLine(` ${colors.dim} bash: [npm, git, gh]${RESET}`);\n writeLine(` ${colors.dim} write: [agents-squads-web/**]${RESET}`);\n writeLine(` ${colors.dim} read: [hq/.agents/**]${RESET}`);\n writeLine(` ${colors.dim} mcp:${RESET}`);\n writeLine(` ${colors.dim} allow: [chrome-devtools]${RESET}`);\n writeLine(` ${colors.dim} deny: [supabase]${RESET}`);\n writeLine(` ${colors.dim}\\`\\`\\`${RESET}`);\n writeLine();\n }\n}\n\n/**\n * Check permissions before execution\n */\nasync function permissionsCheckCommand(\n squadName: string,\n options: {\n agent?: string;\n mcp?: string[];\n bash?: string[];\n write?: string[];\n read?: string[];\n }\n): Promise<void> {\n writeLine();\n writeLine(` ${gradient('Permissions')} ${colors.dim}check${RESET} ${colors.cyan}${squadName}${RESET}`);\n if (options.agent) {\n writeLine(` ${colors.dim}Agent: ${options.agent}${RESET}`);\n }\n writeLine();\n\n const squadsDir = findSquadsDir();\n if (!squadsDir) {\n writeLine(` ${icons.error} ${colors.red}No .agents/squads directory found${RESET}`);\n writeLine();\n return;\n }\n\n const squad = loadSquad(squadName);\n if (!squad) {\n writeLine(` ${icons.error} ${colors.red}Squad \"${squadName}\" not found${RESET}`);\n writeLine();\n return;\n }\n\n // Load permissions from SQUAD.md\n const squadFilePath = join(squadsDir, squadName, 'SQUAD.md');\n const squadContent = readFileSync(squadFilePath, 'utf-8');\n const context = buildContextFromSquad(squadName, squadContent, options.agent);\n\n // Build execution request from CLI options\n const request: ExecutionRequest = {\n mcpServers: options.mcp,\n bashCommands: options.bash,\n writePaths: options.write,\n readPaths: options.read\n };\n\n // Check if request is empty\n if (!options.mcp && !options.bash && !options.write && !options.read) {\n writeLine(` ${colors.yellow}No resources specified to check.${RESET}`);\n writeLine();\n writeLine(` ${colors.dim}Examples:${RESET}`);\n writeLine(` ${colors.cyan}squads perms check ${squadName} --mcp chrome-devtools firecrawl${RESET}`);\n writeLine(` ${colors.cyan}squads perms check ${squadName} --bash npm git docker${RESET}`);\n writeLine(` ${colors.cyan}squads perms check ${squadName} --write src/** --read config/**${RESET}`);\n writeLine();\n return;\n }\n\n // Validate\n const result = validateExecution(context, request);\n\n if (result.violations.length === 0) {\n writeLine(` ${icons.success} ${colors.green}All permissions valid${RESET}`);\n writeLine();\n\n // Show what was checked\n if (options.mcp) {\n writeLine(` ${colors.dim}MCP:${RESET} ${options.mcp.join(', ')}`);\n }\n if (options.bash) {\n writeLine(` ${colors.dim}Bash:${RESET} ${options.bash.join(', ')}`);\n }\n if (options.write) {\n writeLine(` ${colors.dim}Write:${RESET} ${options.write.join(', ')}`);\n }\n if (options.read) {\n writeLine(` ${colors.dim}Read:${RESET} ${options.read.join(', ')}`);\n }\n writeLine();\n } else {\n const violationLines = formatViolations(result);\n for (const line of violationLines) {\n writeLine(` ${line}`);\n }\n writeLine();\n\n // Exit with error code if strict mode blocks\n if (!result.allowed) {\n process.exit(1);\n }\n }\n}\n\n/**\n * Format enforcement mode for display\n */\nfunction formatMode(mode: string): string {\n switch (mode) {\n case 'strict':\n return `${colors.red}strict${RESET} ${colors.dim}(blocks on violation)${RESET}`;\n case 'warn':\n return `${colors.yellow}warn${RESET} ${colors.dim}(logs and continues)${RESET}`;\n case 'audit':\n return `${colors.cyan}audit${RESET} ${colors.dim}(logs to trail)${RESET}`;\n default:\n return mode;\n }\n}\n","import {\n findSquadsDir,\n loadSquad,\n listSquads,\n SquadContext,\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 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 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 }, 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 Servers\n 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\n 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","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 * 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 * 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","import ora from 'ora';\nimport fs from 'fs/promises';\nimport path, { dirname } from 'path';\nimport { execSync, spawn } from 'child_process';\nimport { findSquadsDir } from '../lib/squad-parser.js';\nimport { colors, RESET, bold, writeLine } from '../lib/terminal.js';\nimport { track, Events } from '../lib/telemetry.js';\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\nexport interface TonightOptions {\n costCap?: number; // Max USD to spend (default: 50)\n stopAt?: string; // Stop time, e.g., \"07:00\" (default: 7am)\n maxRetries?: number; // Restart crashed agents N times (default: 3)\n dryRun?: boolean; // Show what would run\n verbose?: boolean;\n notify?: string; // Notification method: \"slack\" | \"email\" | \"none\"\n}\n\ninterface TonightSession {\n id: string;\n target: string; // squad or squad/agent\n tmuxSession: string;\n startedAt: Date;\n status: 'running' | 'completed' | 'failed' | 'stopped';\n restarts: number;\n tokensUsed?: number;\n costUsd?: number;\n}\n\ninterface TonightState {\n startedAt: string;\n stopAt: string;\n costCap: number;\n maxRetries: number;\n sessions: TonightSession[];\n totalCost: number;\n stopped: boolean;\n stoppedReason?: string;\n}\n\nconst TONIGHT_STATE_FILE = '.agents/tonight-state.json';\nconst TONIGHT_LOG_DIR = '.agents/outputs/tonight';\n\n// Get current cost from bridge/langfuse\nasync function getCurrentCost(): Promise<number> {\n try {\n const response = await fetch('http://localhost:8088/api/stats/today');\n if (response.ok) {\n const data = await response.json() as { cost_usd?: number };\n return data.cost_usd || 0;\n }\n } catch {\n // Bridge not available\n }\n return 0;\n}\n\n// Check if we should stop (reserved for future use)\nfunction _shouldStop(state: TonightState): { stop: boolean; reason?: string } {\n // Cost cap reached\n if (state.totalCost >= state.costCap) {\n return { stop: true, reason: `Cost cap reached: $${state.totalCost.toFixed(2)} >= $${state.costCap}` };\n }\n\n // Time limit reached\n const now = new Date();\n const [stopHour, stopMin] = state.stopAt.split(':').map(Number);\n const stopTime = new Date();\n stopTime.setHours(stopHour, stopMin, 0, 0);\n\n // If stop time is before now, it means tomorrow\n if (stopTime <= new Date(state.startedAt)) {\n stopTime.setDate(stopTime.getDate() + 1);\n }\n\n if (now >= stopTime) {\n return { stop: true, reason: `Stop time reached: ${state.stopAt}` };\n }\n\n return { stop: false };\n}\n\n// Kill all tonight sessions\nfunction killAllSessions(): number {\n try {\n const sessions = execSync('tmux ls 2>/dev/null | grep \"squads-tonight-\" | cut -d: -f1', { encoding: 'utf-8' })\n .trim()\n .split('\\n')\n .filter(Boolean);\n\n for (const session of sessions) {\n try {\n execSync(`tmux kill-session -t \"${session}\"`, { stdio: 'ignore' });\n } catch {\n // Session may already be dead\n }\n }\n return sessions.length;\n } catch {\n return 0;\n }\n}\n\n// Get running session count\nfunction getRunningSessionCount(): number {\n try {\n const output = execSync('tmux ls 2>/dev/null | grep \"squads-tonight-\" | wc -l', { encoding: 'utf-8' });\n return parseInt(output.trim()) || 0;\n } catch {\n return 0;\n }\n}\n\n// Launch a single agent in tmux\nfunction launchAgent(\n target: string,\n projectRoot: string,\n sessionId: string,\n logFile: string\n): string {\n const sessionName = `squads-tonight-${sessionId}`;\n\n // Build the command with logging\n const claudeCmd = [\n `cd '${projectRoot}'`,\n `echo \"=== Tonight Session: ${target} ===\" >> '${logFile}'`,\n `echo \"Started: $(date)\" >> '${logFile}'`,\n `claude --dangerously-skip-permissions -p 'You are running as part of an overnight autonomous session. Execute your tasks efficiently. If you encounter errors, document them clearly and move on. Do not ask for user input.' -- \"Run squad: ${target}\" 2>&1 | tee -a '${logFile}'`,\n `echo \"Ended: $(date)\" >> '${logFile}'`,\n ].join(' && ');\n\n 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 }).unref();\n\n return sessionName;\n}\n\n// Generate morning report\nasync function generateReport(state: TonightState, projectRoot: string): Promise<string> {\n const duration = Math.round((Date.now() - new Date(state.startedAt).getTime()) / 1000 / 60);\n const completed = state.sessions.filter(s => s.status === 'completed').length;\n const failed = state.sessions.filter(s => s.status === 'failed').length;\n\n const report = `# Tonight Report - ${new Date().toLocaleDateString()}\n\n## Summary\n- **Duration**: ${duration} minutes\n- **Total Cost**: $${state.totalCost.toFixed(2)} / $${state.costCap} cap\n- **Sessions**: ${completed} completed, ${failed} failed, ${state.sessions.length} total\n- **Stopped**: ${state.stoppedReason || 'All tasks completed'}\n\n## Sessions\n\n| Target | Status | Restarts | Duration |\n|--------|--------|----------|----------|\n${state.sessions.map(s => {\n const dur = s.startedAt ? Math.round((Date.now() - new Date(s.startedAt).getTime()) / 1000 / 60) : 0;\n return `| ${s.target} | ${s.status} | ${s.restarts} | ${dur}min |`;\n}).join('\\n')}\n\n## Logs\nSee \\`.agents/outputs/tonight/\\` for detailed logs.\n\n---\n*Generated by squads tonight*\n`;\n\n const reportPath = path.join(projectRoot, TONIGHT_LOG_DIR, `report-${Date.now()}.md`);\n await fs.writeFile(reportPath, report);\n\n return reportPath;\n}\n\n// Main tonight command\nexport async function tonightCommand(\n targets: string[],\n options: TonightOptions\n): Promise<void> {\n const costCap = options.costCap ?? 50;\n const stopAt = options.stopAt ?? '07:00';\n const maxRetries = options.maxRetries ?? 3;\n const dryRun = options.dryRun ?? false;\n const verbose = options.verbose ?? false;\n\n writeLine();\n writeLine(` ${bold}squads tonight${RESET}`);\n writeLine();\n\n // Find project root\n const projectRoot = getProjectRoot();\n\n // Validate targets\n if (targets.length === 0) {\n writeLine(` ${colors.red}✖${RESET} No targets specified`);\n writeLine();\n writeLine(` ${colors.dim}Usage: squads tonight <squad> [squad/agent...]${RESET}`);\n writeLine(` ${colors.dim}Example: squads tonight intelligence customer/outreach${RESET}`);\n writeLine();\n return;\n }\n\n // Show config\n writeLine(` ${colors.dim}Config:${RESET}`);\n writeLine(` Cost cap: ${colors.cyan}$${costCap}${RESET}`);\n writeLine(` Stop at: ${colors.cyan}${stopAt}${RESET}`);\n writeLine(` Max retries: ${colors.cyan}${maxRetries}${RESET}`);\n writeLine(` Targets: ${colors.cyan}${targets.join(', ')}${RESET}`);\n writeLine();\n\n if (dryRun) {\n writeLine(` ${colors.yellow}DRY RUN${RESET} - would launch:`);\n for (const target of targets) {\n writeLine(` • ${target}`);\n }\n writeLine();\n return;\n }\n\n // Create log directory\n const logDir = path.join(projectRoot, TONIGHT_LOG_DIR);\n await fs.mkdir(logDir, { recursive: true });\n\n // Initialize state\n const state: TonightState = {\n startedAt: new Date().toISOString(),\n stopAt,\n costCap,\n maxRetries,\n sessions: [],\n totalCost: await getCurrentCost(),\n stopped: false,\n };\n\n // Launch agents\n const spinner = ora('Launching agents...').start();\n\n for (const target of targets) {\n const sessionId = `${target.replace('/', '-')}-${Date.now()}`;\n const logFile = path.join(logDir, `${sessionId}.log`);\n\n const tmuxSession = launchAgent(target, projectRoot, sessionId, logFile);\n\n state.sessions.push({\n id: sessionId,\n target,\n tmuxSession,\n startedAt: new Date(),\n status: 'running',\n restarts: 0,\n });\n }\n\n spinner.succeed(`Launched ${targets.length} agent(s)`);\n\n // Save initial state\n await fs.writeFile(\n path.join(projectRoot, TONIGHT_STATE_FILE),\n JSON.stringify(state, null, 2)\n );\n\n // Track\n await track(Events.CLI_TONIGHT, {\n targets: targets.length,\n costCap,\n stopAt,\n });\n\n writeLine();\n writeLine(` ${colors.green}✓${RESET} Tonight mode active`);\n writeLine();\n writeLine(` ${colors.dim}Monitor:${RESET}`);\n writeLine(` ${colors.cyan}squads tonight status${RESET} - Check progress`);\n writeLine(` ${colors.cyan}squads tonight stop${RESET} - Kill all agents`);\n writeLine(` ${colors.cyan}tmux ls | grep tonight${RESET} - List sessions`);\n writeLine();\n writeLine(` ${colors.dim}Logs: ${logDir}${RESET}`);\n writeLine();\n\n // Start watcher in background\n const watcherCmd = `\n while true; do\n sleep 60\n # Check cost\n COST=$(curl -s http://localhost:8088/api/stats/today 2>/dev/null | jq -r '.cost_usd // 0')\n if [ \"$(echo \"$COST >= ${costCap}\" | bc)\" -eq 1 ]; then\n echo \"Cost cap reached: $COST\" >> '${logDir}/watcher.log'\n tmux ls 2>/dev/null | grep squads-tonight | cut -d: -f1 | xargs -I{} tmux kill-session -t {}\n break\n fi\n # Check time\n HOUR=$(date +%H)\n MIN=$(date +%M)\n STOP_HOUR=${stopAt.split(':')[0]}\n STOP_MIN=${stopAt.split(':')[1]}\n if [ \"$HOUR\" -ge \"$STOP_HOUR\" ] && [ \"$MIN\" -ge \"$STOP_MIN\" ]; then\n echo \"Stop time reached\" >> '${logDir}/watcher.log'\n tmux ls 2>/dev/null | grep squads-tonight | cut -d: -f1 | xargs -I{} tmux kill-session -t {}\n break\n fi\n # Check if any sessions still running\n COUNT=$(tmux ls 2>/dev/null | grep squads-tonight | wc -l)\n if [ \"$COUNT\" -eq 0 ]; then\n echo \"All sessions completed\" >> '${logDir}/watcher.log'\n break\n fi\n done\n `;\n\n spawn('tmux', [\n 'new-session',\n '-d',\n '-s', 'squads-tonight-watcher',\n '/bin/sh', '-c', watcherCmd\n ], {\n stdio: 'ignore',\n detached: true,\n }).unref();\n\n if (verbose) {\n writeLine(` ${colors.dim}Watcher session started${RESET}`);\n }\n}\n\n// Status subcommand\nexport async function tonightStatusCommand(): Promise<void> {\n writeLine();\n writeLine(` ${bold}Tonight Status${RESET}`);\n writeLine();\n\n const projectRoot = getProjectRoot();\n const statePath = path.join(projectRoot, TONIGHT_STATE_FILE);\n\n // Check for state file\n let state: TonightState | null = null;\n try {\n const content = await fs.readFile(statePath, 'utf-8');\n state = JSON.parse(content);\n } catch {\n // No state file\n }\n\n // Count running sessions\n const running = getRunningSessionCount();\n const cost = await getCurrentCost();\n\n if (running === 0 && !state) {\n writeLine(` ${colors.dim}No tonight session active${RESET}`);\n writeLine();\n writeLine(` ${colors.dim}Start with: squads tonight <squad> [squad...]${RESET}`);\n writeLine();\n return;\n }\n\n // Show status\n writeLine(` ${colors.cyan}${running}${RESET} agents running`);\n\n if (state) {\n const duration = Math.round((Date.now() - new Date(state.startedAt).getTime()) / 1000 / 60);\n writeLine(` ${colors.dim}Duration:${RESET} ${duration} minutes`);\n writeLine(` ${colors.dim}Cost:${RESET} $${cost.toFixed(2)} / $${state.costCap} cap`);\n writeLine(` ${colors.dim}Stop at:${RESET} ${state.stopAt}`);\n }\n\n writeLine();\n\n // List sessions\n try {\n const sessions = execSync('tmux ls 2>/dev/null | grep squads-tonight', { encoding: 'utf-8' })\n .trim()\n .split('\\n')\n .filter(Boolean);\n\n if (sessions.length > 0) {\n writeLine(` ${colors.dim}Sessions:${RESET}`);\n for (const session of sessions) {\n const name = session.split(':')[0];\n writeLine(` • ${name}`);\n }\n writeLine();\n writeLine(` ${colors.dim}Attach: tmux attach -t <session>${RESET}`);\n }\n } catch {\n // No sessions\n }\n\n writeLine();\n}\n\n// Stop subcommand\nexport async function tonightStopCommand(): Promise<void> {\n writeLine();\n writeLine(` ${bold}Stopping Tonight Mode${RESET}`);\n writeLine();\n\n const killed = killAllSessions();\n\n if (killed > 0) {\n writeLine(` ${colors.green}✓${RESET} Killed ${killed} session(s)`);\n } else {\n writeLine(` ${colors.dim}No sessions to kill${RESET}`);\n }\n\n // Generate report\n const projectRoot = getProjectRoot();\n const statePath = path.join(projectRoot, TONIGHT_STATE_FILE);\n\n try {\n const content = await fs.readFile(statePath, 'utf-8');\n const state: TonightState = JSON.parse(content);\n state.stopped = true;\n state.stoppedReason = 'Manual stop';\n state.totalCost = await getCurrentCost();\n\n const reportPath = await generateReport(state, projectRoot);\n writeLine(` ${colors.green}✓${RESET} Report: ${reportPath}`);\n\n // Clean up state\n await fs.unlink(statePath).catch(() => {});\n } catch {\n // No state to report on\n }\n\n writeLine();\n}\n\n// Report subcommand\nexport async function tonightReportCommand(): Promise<void> {\n writeLine();\n writeLine(` ${bold}Tonight Report${RESET}`);\n writeLine();\n\n const projectRoot = getProjectRoot();\n const logDir = path.join(projectRoot, TONIGHT_LOG_DIR);\n\n try {\n const files = await fs.readdir(logDir);\n const reports = files.filter(f => f.startsWith('report-')).sort().reverse();\n\n if (reports.length === 0) {\n writeLine(` ${colors.dim}No reports found${RESET}`);\n writeLine();\n return;\n }\n\n // Show latest report\n const latest = reports[0];\n const content = await fs.readFile(path.join(logDir, latest), 'utf-8');\n\n writeLine(content);\n } catch {\n writeLine(` ${colors.dim}No reports found${RESET}`);\n }\n\n writeLine();\n}\n"],"mappings":"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","names":["existsSync","join","homedir","chalk","require","execSync","existsSync","join","config","config","existsSync","execSync","ora","spawn","join","existsSync","readFileSync","writeFileSync","mkdirSync","readFileSync","existsSync","writeFileSync","join","progress","goal","path","context","join","existsSync","config","readFileSync","writeFileSync","mkdirSync","prompt","ora","spawn","existsSync","join","join","existsSync","existsSync","readFileSync","writeFileSync","mkdirSync","join","dirname","homedir","execSync","spawn","createInterface","__filename","__dirname","dirname","CONFIG_PATH","join","homedir","createInterface","confirm","existsSync","readFileSync","config","writeFileSync","execSync","envPaths","mkdirSync","spawn","sessions","execSync","existsSync","readFileSync","writeFileSync","mkdirSync","readdirSync","join","join","existsSync","readFileSync","writeFileSync","execSync","mkdirSync","readdirSync","goal","progress","readFileSync","writeFileSync","existsSync","mkdirSync","readdirSync","join","dirname","join","existsSync","readFileSync","feedback","dirname","mkdirSync","writeFileSync","readdirSync","readdirSync","existsSync","statSync","join","config","calcCost","createRequire","require","pool","client","join","existsSync","readdirSync","statSync","activeSquads","goal","join","existsSync","goal","execSync","execSync","execSync","spawn","ora","DEFAULT_ORG","DEFAULT_REPOS","execSync","ora","prompt","spawn","execSync","spawn","readdirSync","join","ora","readdirSync","join","ora","execSync","prompt","executeClaudePrompt","spawn","chalk","ora","existsSync","readFileSync","writeFileSync","mkdirSync","join","homedir","session","chalk","ora","session","createInterface","confirm","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","exec","FETCH_TIMEOUT_MS","SERVICES","fetchWithTimeout","checkService","execSync","existsSync","readFileSync","join","getTasksFilePath","join","existsSync","readFileSync","execSync","getElapsedTime","existsSync","statSync","readdirSync","readFileSync","join","BRIDGE_URL","join","existsSync","readFileSync","sessions","readdirSync","statSync","goal","spawn","runCommand","spawn","execSync","getRecentActivity","path","execSync","RESET","sleep","session","chalk","existsSync","path","execSync","program","ora","existsSync","mkdirSync","writeFileSync","readFileSync","join","basename","dirname","readFileSync","readdirSync","join","readdirSync","join","readFileSync","program","ora","join","existsSync","basename","dirname","readFileSync","mkdirSync","writeFileSync","readdirSync","readFileSync","join","program","join","readFileSync","context","path","readFileSync","existsSync","readdirSync","join","existsSync","readFileSync","readdirSync","join","formatDuration","mins","exec","formatDuration","ora","fs","path","dirname","execSync","spawn","getProjectRoot","dirname","sessions","execSync","session","spawn","path","fs","getProjectRoot","ora","chalk","join","homedir","existsSync","gradient","colors","RESET","checkForUpdate","exec","readFileSync"]}
|