squads-cli 0.1.2
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/LICENSE +21 -0
- package/README.md +266 -0
- package/dist/cli.js +4706 -0
- package/dist/cli.js.map +1 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.js +16 -0
- package/dist/index.js.map +1 -0
- package/package.json +79 -0
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/cli.ts","../src/version.ts","../src/commands/init.ts","../src/lib/git.ts","../src/lib/telemetry.ts","../src/commands/run.ts","../src/lib/squad-parser.ts","../src/lib/memory.ts","../src/lib/terminal.ts","../src/commands/list.ts","../src/commands/status.ts","../src/commands/memory.ts","../src/commands/sync.ts","../src/commands/goal.ts","../src/commands/feedback.ts","../src/commands/dashboard.ts","../src/lib/costs.ts","../src/lib/db.ts","../src/commands/issues.ts","../src/commands/solve-issues.ts","../src/commands/open-issues.ts","../src/commands/login.ts","../src/lib/auth.ts","../src/commands/progress.ts","../src/commands/results.ts","../src/commands/workers.ts"],"sourcesContent":["import { config } from 'dotenv';\nimport { existsSync } from 'fs';\nimport { join } from 'path';\nimport { homedir } from 'os';\nimport { Command } from 'commander';\nimport chalk from 'chalk';\nimport { version } from './version.js';\n\n// Load .env from multiple locations (first found wins)\nconst envPaths = [\n join(process.cwd(), '.env'),\n join(process.cwd(), '..', 'hq', '.env'),\n join(homedir(), 'agents-squads', 'hq', '.env'),\n];\n\nfor (const envPath of envPaths) {\n if (existsSync(envPath)) {\n config({ path: envPath, quiet: true });\n break;\n }\n}\nimport { initCommand } from './commands/init.js';\nimport { runCommand } from './commands/run.js';\nimport { listCommand } from './commands/list.js';\nimport { statusCommand } from './commands/status.js';\nimport {\n memoryQueryCommand,\n memoryShowCommand,\n memoryUpdateCommand,\n memoryListCommand,\n memorySearchCommand\n} from './commands/memory.js';\nimport { syncCommand } from './commands/sync.js';\nimport {\n goalSetCommand,\n goalListCommand,\n goalCompleteCommand,\n goalProgressCommand\n} from './commands/goal.js';\nimport {\n feedbackAddCommand,\n feedbackShowCommand,\n feedbackStatsCommand\n} from './commands/feedback.js';\nimport { dashboardCommand } from './commands/dashboard.js';\nimport { issuesCommand } from './commands/issues.js';\nimport { solveIssuesCommand } from './commands/solve-issues.js';\nimport { openIssuesCommand } from './commands/open-issues.js';\nimport { loginCommand, logoutCommand, whoamiCommand } from './commands/login.js';\nimport { progressCommand, progressStartCommand, progressCompleteCommand } from './commands/progress.js';\nimport { resultsCommand } from './commands/results.js';\nimport { workersCommand } from './commands/workers.js';\nimport { registerExitHandler } from './lib/telemetry.js';\n\n// Register telemetry exit handler early\nregisterExitHandler();\n\nconst program = new Command();\n\nprogram\n .name('squads')\n .description('A CLI for humans and agents')\n .version(version);\n\n// Init command\nprogram\n .command('init')\n .description('Initialize a new squad project')\n .option('-t, --template <template>', 'Project template', 'default')\n .action(initCommand);\n\n// Run command - runs squads or individual agents\nprogram\n .command('run <target>')\n .description('Run a squad or agent')\n .option('-v, --verbose', 'Verbose output')\n .option('-d, --dry-run', 'Show what would be run without executing')\n .option('-e, --execute', 'Execute agent via Claude CLI (requires claude installed)')\n .option('-a, --agent <agent>', 'Run specific agent within squad')\n .action(runCommand);\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 .action(dashboardCommand);\n\n// Issues command\nprogram\n .command('issues')\n .description('Show GitHub issues across repos')\n .option('-o, --org <org>', 'GitHub organization', 'agents-squads')\n .option('-r, --repos <repos>', 'Comma-separated repo names')\n .action(issuesCommand);\n\n// Solve issues command - close issues by creating PRs\nprogram\n .command('solve-issues')\n .description('Solve ready-to-fix issues by creating PRs')\n .option('-r, --repo <repo>', 'Target repo (hq, agents-squads-web)')\n .option('-i, --issue <number>', 'Specific issue number', parseInt)\n .option('-d, --dry-run', 'Show what would be solved')\n .option('-e, --execute', 'Execute with Claude CLI')\n .action(solveIssuesCommand);\n\n// Open issues command - run evaluators to find new issues\nprogram\n .command('open-issues')\n .description('Run evaluators/critics to find and create issues')\n .option('-s, --squad <squad>', 'Target squad (website, engineering, etc.)')\n .option('-a, --agent <agent>', 'Specific evaluator agent')\n .option('-d, --dry-run', 'Show what would run')\n .option('-e, --execute', 'Execute with Claude CLI')\n .action(openIssuesCommand);\n\n// Progress command - track agent task progress\nconst progress = program\n .command('progress')\n .description('Track active and completed agent tasks')\n .option('-v, --verbose', 'Show more activity')\n .action(progressCommand);\n\nprogress\n .command('start <squad> <description>')\n .description('Register a new active task')\n .action(progressStartCommand);\n\nprogress\n .command('complete <taskId>')\n .description('Mark a task as completed')\n .option('-f, --failed', 'Mark as failed instead')\n .action(progressCompleteCommand);\n\n// Results command - KPI goals vs actuals\nprogram\n .command('results [squad]')\n .description('Show squad results: git activity + KPI goals vs actuals')\n .option('-d, --days <days>', 'Days to look back', '7')\n .option('-v, --verbose', 'Show detailed KPIs per goal')\n .action((squad, options) => resultsCommand({ ...options, squad }));\n\n// Workers command - show running processes and tasks\nprogram\n .command('workers')\n .description('Show active workers: Claude sessions, tasks, dev servers')\n .option('-v, --verbose', 'Show more details')\n .option('-k, --kill <pid>', 'Kill a process by PID')\n .action(workersCommand);\n\n// Memory command group\nconst memory = program\n .command('memory')\n .description('Query and manage squad memory');\n\nmemory\n .command('query <query>')\n .description('Search across all squad memory')\n .option('-s, --squad <squad>', 'Limit search to specific squad')\n .option('-a, --agent <agent>', 'Limit search to specific agent')\n .action(memoryQueryCommand);\n\nmemory\n .command('show <squad>')\n .description('Show memory for a squad')\n .action(memoryShowCommand);\n\nmemory\n .command('update <squad> <content>')\n .description('Add to squad memory')\n .option('-a, --agent <agent>', 'Specific agent (default: squad-lead)')\n .option('-t, --type <type>', 'Memory type: state, learnings, feedback', 'learnings')\n .action(memoryUpdateCommand);\n\nmemory\n .command('list')\n .description('List all memory entries')\n .action(memoryListCommand);\n\nmemory\n .command('sync')\n .description('Sync memory from recent git commits (auto-update)')\n .option('-v, --verbose', 'Show detailed commit info')\n .action(syncCommand);\n\nmemory\n .command('search <query>')\n .description('Search conversations stored in postgres (via squads-bridge)')\n .option('-l, --limit <limit>', 'Number of results', '10')\n .option('-r, --role <role>', 'Filter by role: user, assistant, thinking')\n .option('-i, --importance <importance>', 'Filter by importance: low, normal, high')\n .action((query, opts) => memorySearchCommand(query, {\n limit: parseInt(opts.limit, 10),\n role: opts.role,\n importance: opts.importance\n }));\n\n// Goal command group\nconst goal = program\n .command('goal')\n .description('Manage squad goals');\n\ngoal\n .command('set <squad> <description>')\n .description('Set a goal for a squad')\n .option('-m, --metric <metrics...>', 'Metrics to track')\n .action(goalSetCommand);\n\ngoal\n .command('list [squad]')\n .description('List goals for squad(s)')\n .option('-a, --all', 'Show completed goals too')\n .action(goalListCommand);\n\ngoal\n .command('complete <squad> <index>')\n .description('Mark a goal as completed')\n .action(goalCompleteCommand);\n\ngoal\n .command('progress <squad> <index> <progress>')\n .description('Update goal progress')\n .action(goalProgressCommand);\n\n// Feedback command group\nconst feedback = program\n .command('feedback')\n .description('Record and view execution feedback');\n\nfeedback\n .command('add <squad> <rating> <feedback>')\n .description('Add feedback for last execution (rating 1-5)')\n .option('-l, --learning <learnings...>', 'Learnings to extract')\n .action(feedbackAddCommand);\n\nfeedback\n .command('show <squad>')\n .description('Show feedback history')\n .option('-n, --limit <n>', 'Number of entries to show', '5')\n .action(feedbackShowCommand);\n\nfeedback\n .command('stats')\n .description('Show feedback summary across all squads')\n .action(feedbackStatsCommand);\n\n// 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// Parse arguments (use parseAsync to properly await async actions)\nawait program.parseAsync();\n\n// Show help if no command provided\nif (!process.argv.slice(2).length) {\n console.log(`\n${chalk.bold.magenta('squads')} - AI agent squad management\n\n${chalk.dim('Quick start:')}\n ${chalk.cyan('squads status')} View all squads status\n ${chalk.cyan('squads run <squad>')} Run a squad\n ${chalk.cyan('squads memory query \"<term>\"')} Search squad memory\n\n${chalk.dim('Goals & Feedback:')}\n ${chalk.cyan('squads goal set <squad> \"<goal>\"')} Set a goal\n ${chalk.cyan('squads goal list')} View active goals\n ${chalk.cyan('squads feedback add <squad> 4 \"msg\"')} Rate last execution\n\n${chalk.dim('Examples:')}\n ${chalk.cyan('squads run website')} Run website squad\n ${chalk.cyan('squads goal set finance \"Track costs\"')} Set finance goal\n ${chalk.cyan('squads feedback stats')} View feedback summary\n\n${chalk.dim('Run')} ${chalk.cyan('squads --help')} ${chalk.dim('for all commands.')}\n`);\n}\n","export const version = '0.1.0';\n","import chalk from 'chalk';\nimport ora from 'ora';\nimport fs from 'fs/promises';\nimport path from 'path';\nimport { checkGitStatus, initGitRepo, getRepoName } from '../lib/git.js';\nimport { track, Events } from '../lib/telemetry.js';\n\ninterface InitOptions {\n template: string;\n}\n\nexport async function initCommand(options: InitOptions): Promise<void> {\n const cwd = process.cwd();\n\n // Check Git status first\n console.log(chalk.dim('Checking project setup...\\n'));\n\n const gitStatus = checkGitStatus(cwd);\n\n if (!gitStatus.isGitRepo) {\n console.log(chalk.yellow('⚠ No git repository found.'));\n console.log(chalk.dim(' Squads work best with git for version control and GitHub integration.'));\n console.log(chalk.dim(' Run: git init && git remote add origin <your-repo-url>\\n'));\n } else {\n console.log(chalk.green('✓ Git repository detected'));\n\n if (gitStatus.hasRemote) {\n const repoName = getRepoName(gitStatus.remoteUrl);\n console.log(chalk.green(`✓ Remote: ${chalk.cyan(repoName || gitStatus.remoteUrl)}`));\n } else {\n console.log(chalk.yellow('⚠ No remote configured.'));\n console.log(chalk.dim(' Add a remote: git remote add origin <your-repo-url>\\n'));\n }\n\n if (gitStatus.isDirty) {\n console.log(chalk.yellow(`⚠ ${gitStatus.uncommittedCount} uncommitted changes`));\n }\n }\n\n console.log();\n\n const spinner = ora('Initializing squad project...').start();\n\n try {\n // Create directory structure\n const dirs = [\n '.agents/squads',\n '.agents/memory',\n '.agents/outputs',\n '.claude',\n ];\n\n for (const dir of dirs) {\n await fs.mkdir(path.join(cwd, dir), { recursive: true });\n }\n\n // Create git commit template\n const commitTemplate = `\n\n# ────────────────────────────────────────────────────────────\n# Commit message format (delete this comment block):\n#\n# <type>(<scope>): <subject>\n#\n# <body>\n#\n# 🤖 Generated with [Agents Squads](https://agents-squads.com)\n#\n# Co-Authored-By: <model> <email>\n# ────────────────────────────────────────────────────────────\n# AI Models (add those that contributed to this commit):\n#\n# Model | Email | API Key\n# --------------------|----------------------------|------------------\n# Claude Opus 4.5 | <noreply@anthropic.com> | ANTHROPIC_API_KEY\n# Claude Sonnet 4 | <noreply@anthropic.com> | ANTHROPIC_API_KEY\n# Claude Haiku 3.5 | <noreply@anthropic.com> | ANTHROPIC_API_KEY\n# GPT-4o | <noreply@openai.com> | OPENAI_API_KEY\n# GPT-o1 | <noreply@openai.com> | OPENAI_API_KEY\n# Gemini 2.0 Flash | <noreply@google.com> | GEMINI_API_KEY\n# Grok 3 | <noreply@x.ai> | XAI_API_KEY\n# Perplexity | <noreply@perplexity.ai> | PERPLEXITY_API_KEY\n# Manus AI | <noreply@manus.im> | MANUS_API_KEY\n#\n# Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>\n# Co-Authored-By: Claude Sonnet 4 <noreply@anthropic.com>\n# Co-Authored-By: Claude Haiku 3.5 <noreply@anthropic.com>\n# Co-Authored-By: GPT-4o <noreply@openai.com>\n# Co-Authored-By: GPT-o1 <noreply@openai.com>\n# Co-Authored-By: Gemini 2.0 Flash <noreply@google.com>\n# Co-Authored-By: Grok 3 <noreply@x.ai>\n# Co-Authored-By: Perplexity <noreply@perplexity.ai>\n# Co-Authored-By: Manus AI <noreply@manus.im>\n# ────────────────────────────────────────────────────────────\n`;\n\n await fs.writeFile(\n path.join(cwd, '.agents/commit-template.txt'),\n commitTemplate\n );\n\n // Create .mailmap for author consolidation\n const mailmap = `# Git author name consolidation\n# Format: Proper Name <proper@email> Commit Name <commit@email>\n# Add entries to consolidate multiple git identities\n\n# AI Contributors\nAgents Squads <agents@agents-squads.com> Agents Squads <agents@agents-squads.com>\n`;\n\n await fs.writeFile(path.join(cwd, '.mailmap'), mailmap);\n\n // Create Claude Code settings with hooks\n const claudeSettings = {\n hooks: {\n SessionStart: [\n {\n hooks: [\n {\n type: 'command',\n command: 'squads status',\n timeout: 10,\n },\n ],\n },\n ],\n Stop: [\n {\n hooks: [\n {\n type: 'command',\n command: 'squads memory sync',\n timeout: 15,\n },\n ],\n },\n ],\n },\n };\n\n await fs.writeFile(\n path.join(cwd, '.claude/settings.json'),\n JSON.stringify(claudeSettings, null, 2)\n );\n\n // Create example agent\n const exampleAgent = `# Example Agent\n\n## Purpose\nDemonstrate basic agent structure.\n\n## Model\nclaude-sonnet-4\n\n## Tools\n- Read\n- Write\n- WebSearch\n\n## Instructions\n1. Greet the user\n2. Ask how you can help\n3. Execute the task\n\n## Output\nMarkdown summary of actions taken.\n`;\n\n await fs.writeFile(\n path.join(cwd, '.agents/squads/example-agent.md'),\n exampleAgent\n );\n\n // Create CLAUDE.md if it doesn't exist\n const claudeMdPath = path.join(cwd, 'CLAUDE.md');\n try {\n await fs.access(claudeMdPath);\n } catch {\n await fs.writeFile(\n claudeMdPath,\n `# Project Instructions\n\n## Squads CLI\n\nThis project uses AI agent squads. The \\`squads\\` CLI provides persistent memory across sessions.\n\n### Key Commands\n\n| Command | Purpose |\n|---------|---------|\n| \\`squads status\\` | Overview of all squads (runs on session start) |\n| \\`squads dash\\` | Full operational dashboard |\n| \\`squads dash --ceo\\` | Executive summary with P0/P1 priorities |\n| \\`squads goal list\\` | View all active goals |\n| \\`squads memory query \"<topic>\"\\` | Search squad memory before researching |\n| \\`squads run <squad>\\` | Execute a squad |\n\n### Workflow\n\n1. **Session Start**: \\`squads status\\` runs automatically via hook\n2. **Before Research**: Query memory to avoid re-doing work\n3. **Session End**: Memory syncs automatically from git commits\n\n### Git Commit Format\n\nAll commits should use the Agents Squads format:\n\n\\`\\`\\`\n<type>(<scope>): <subject>\n\n<body>\n\n🤖 Generated with [Agents Squads](https://agents-squads.com)\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>\n\\`\\`\\`\n\n**AI Models** (include those that contributed):\n\n| Model | Co-Author Email | API Key Required |\n|-------|-----------------|------------------|\n| Claude Opus 4.5 | \\`<noreply@anthropic.com>\\` | \\`ANTHROPIC_API_KEY\\` |\n| Claude Sonnet 4 | \\`<noreply@anthropic.com>\\` | \\`ANTHROPIC_API_KEY\\` |\n| Claude Haiku 3.5 | \\`<noreply@anthropic.com>\\` | \\`ANTHROPIC_API_KEY\\` |\n| GPT-4o | \\`<noreply@openai.com>\\` | \\`OPENAI_API_KEY\\` |\n| GPT-o1 | \\`<noreply@openai.com>\\` | \\`OPENAI_API_KEY\\` |\n| Gemini 2.0 Flash | \\`<noreply@google.com>\\` | \\`GEMINI_API_KEY\\` |\n| Grok 3 | \\`<noreply@x.ai>\\` | \\`XAI_API_KEY\\` |\n| Perplexity | \\`<noreply@perplexity.ai>\\` | \\`PERPLEXITY_API_KEY\\` |\n| Manus AI | \\`<noreply@manus.im>\\` | \\`MANUS_API_KEY\\` |\n\n### For Reports\n\nAlways use CLI commands for status reports:\n- Executive summary: \\`squads dash --ceo\\`\n- Operational view: \\`squads dash\\`\n- Goals: \\`squads goal list\\`\n`\n );\n }\n\n spinner.succeed('Squad project initialized!');\n\n // Track initialization\n await track(Events.CLI_INIT, {\n hasGit: gitStatus.isGitRepo,\n hasRemote: gitStatus.hasRemote,\n template: options.template,\n });\n\n console.log(`\n${chalk.green('Success!')} Created squad project structure:\n\n ${chalk.cyan('.agents/')}\n ${chalk.dim('├──')} ${chalk.cyan('squads/')} Squad & agent definitions\n ${chalk.dim('├──')} ${chalk.cyan('memory/')} Persistent squad memory\n ${chalk.dim('├──')} ${chalk.cyan('outputs/')} Squad outputs\n ${chalk.dim('└──')} ${chalk.cyan('commit-template.txt')} Git commit format\n\n ${chalk.cyan('.mailmap')} Author name consolidation\n\n${chalk.dim('Commit format:')}\n 🤖 Generated with [Agents Squads](https://agents-squads.com)\n Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>\n\n${chalk.dim('Next steps:')}\n ${chalk.cyan('1.')} Create a squad: ${chalk.yellow('mkdir .agents/squads/my-squad && touch .agents/squads/my-squad/SQUAD.md')}\n ${chalk.cyan('2.')} Set a goal: ${chalk.yellow('squads goal set my-squad \"Solve a problem\"')}\n ${chalk.cyan('3.')} Run it: ${chalk.yellow('squads run my-squad')}\n\n${chalk.dim('Put your first squad to work solving a problem in minutes.')}\n`);\n\n } catch (error) {\n spinner.fail('Failed to initialize project');\n console.error(chalk.red(error));\n process.exit(1);\n }\n}\n","import { execSync } from 'child_process';\nimport { existsSync } from 'fs';\nimport { join } from 'path';\n\nexport interface GitStatus {\n isGitRepo: boolean;\n hasRemote: boolean;\n remoteName?: string;\n remoteUrl?: string;\n branch?: string;\n isDirty: boolean;\n uncommittedCount: number;\n}\n\nexport function checkGitStatus(cwd: string = process.cwd()): GitStatus {\n const status: GitStatus = {\n isGitRepo: false,\n hasRemote: false,\n isDirty: false,\n uncommittedCount: 0,\n };\n\n // Check if .git directory exists\n if (!existsSync(join(cwd, '.git'))) {\n return status;\n }\n\n status.isGitRepo = true;\n\n try {\n // Get current branch\n const branch = execSync('git rev-parse --abbrev-ref HEAD', {\n cwd,\n encoding: 'utf-8',\n stdio: ['pipe', 'pipe', 'pipe']\n }).trim();\n status.branch = branch;\n\n // Check for remote\n const remotes = execSync('git remote -v', {\n cwd,\n encoding: 'utf-8',\n stdio: ['pipe', 'pipe', 'pipe']\n }).trim();\n\n if (remotes) {\n status.hasRemote = true;\n const lines = remotes.split('\\n');\n if (lines.length > 0) {\n const parts = lines[0].split(/\\s+/);\n status.remoteName = parts[0];\n status.remoteUrl = parts[1];\n }\n }\n\n // Check for uncommitted changes\n const statusOutput = execSync('git status --porcelain', {\n cwd,\n encoding: 'utf-8',\n stdio: ['pipe', 'pipe', 'pipe']\n }).trim();\n\n if (statusOutput) {\n status.isDirty = true;\n status.uncommittedCount = statusOutput.split('\\n').filter(l => l.trim()).length;\n }\n\n } catch {\n // Git commands failed, but we know it's a git repo\n }\n\n return status;\n}\n\nexport function initGitRepo(cwd: string = process.cwd()): boolean {\n try {\n execSync('git init', { cwd, stdio: 'pipe' });\n return true;\n } catch {\n return false;\n }\n}\n\nexport function getRepoName(remoteUrl?: string): string | null {\n if (!remoteUrl) return null;\n\n // Handle various remote URL formats\n // git@github.com:user/repo.git\n // https://github.com/user/repo.git\n const match = remoteUrl.match(/[:/]([^/]+\\/[^/]+?)(?:\\.git)?$/);\n return match ? match[1] : null;\n}\n\n// Multi-repo git performance stats\nexport interface GitPerformanceStats {\n totalCommits: number;\n commitsByDay: Map<string, number>; // date string -> count\n commitsByAuthor: Map<string, number>;\n commitsByRepo: Map<string, number>;\n activeDays: number;\n avgCommitsPerDay: number;\n peakDay: { date: string; count: number } | null;\n repos: RepoStats[];\n}\n\nexport interface RepoStats {\n name: string;\n path: string;\n commits: number;\n lastCommit: string;\n authors: string[];\n}\n\nexport interface CommitInfo {\n hash: string;\n author: string;\n date: string;\n message: string;\n repo: string;\n}\n\nconst SQUAD_REPOS = ['hq', 'agents-squads-web', 'squads-cli', 'company', 'product', 'engineering', 'research', 'intelligence', 'customer', 'finance', 'marketing'];\n\n// Squad to repo mapping for GitHub stats\nconst SQUAD_REPO_MAP: Record<string, string[]> = {\n website: ['agents-squads-web'],\n product: ['squads-cli'],\n engineering: ['hq', 'squads-cli'],\n research: ['research'],\n intelligence: ['intelligence'],\n customer: ['customer'],\n finance: ['finance'],\n company: ['company', 'hq'],\n marketing: ['marketing', 'agents-squads-web'],\n};\n\n// Label patterns that map to squads\nconst SQUAD_LABELS: Record<string, string[]> = {\n website: ['website', 'web', 'frontend', 'ui'],\n product: ['product', 'cli', 'feature'],\n engineering: ['engineering', 'infra', 'backend', 'bug'],\n research: ['research', 'analysis'],\n intelligence: ['intel', 'monitoring'],\n customer: ['customer', 'sales', 'lead'],\n finance: ['finance', 'cost', 'billing'],\n company: ['company', 'strategy'],\n marketing: ['marketing', 'content', 'seo'],\n};\n\nexport interface GitHubStats {\n prsOpened: number;\n prsMerged: number;\n issuesClosed: number;\n issuesOpen: number;\n bySquad: Map<string, SquadGitHubStats>;\n}\n\nexport interface SquadGitHubStats {\n prsOpened: number;\n prsMerged: number;\n issuesClosed: number;\n issuesOpen: number;\n commits: number;\n recentIssues: { title: string; number: number; state: string }[];\n recentPRs: { title: string; number: number; merged: boolean }[];\n}\n\nexport function getGitHubStats(basePath: string, days: number = 30): GitHubStats {\n const stats: GitHubStats = {\n prsOpened: 0,\n prsMerged: 0,\n issuesClosed: 0,\n issuesOpen: 0,\n bySquad: new Map(),\n };\n\n // Initialize squad stats\n for (const squad of Object.keys(SQUAD_REPO_MAP)) {\n stats.bySquad.set(squad, {\n prsOpened: 0,\n prsMerged: 0,\n issuesClosed: 0,\n issuesOpen: 0,\n commits: 0,\n recentIssues: [],\n recentPRs: [],\n });\n }\n\n const repos = ['hq', 'agents-squads-web'];\n const since = new Date(Date.now() - days * 24 * 60 * 60 * 1000).toISOString();\n\n for (const repo of repos) {\n const repoPath = join(basePath, repo);\n if (!existsSync(repoPath)) continue;\n\n try {\n // Get PRs\n const prsOutput = execSync(\n `gh pr list --state all --json number,title,createdAt,mergedAt,labels --limit 100 2>/dev/null`,\n { cwd: repoPath, encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] }\n );\n const prs = JSON.parse(prsOutput || '[]');\n\n for (const pr of prs) {\n const created = new Date(pr.createdAt);\n if (created < new Date(since)) continue;\n\n stats.prsOpened++;\n if (pr.mergedAt) stats.prsMerged++;\n\n // Detect squad from labels or title\n const squad = detectSquadFromPR(pr, repo);\n const squadStats = stats.bySquad.get(squad);\n if (squadStats) {\n squadStats.prsOpened++;\n if (pr.mergedAt) squadStats.prsMerged++;\n if (squadStats.recentPRs.length < 3) {\n squadStats.recentPRs.push({\n title: pr.title,\n number: pr.number,\n merged: !!pr.mergedAt,\n });\n }\n }\n }\n\n // Get Issues\n const issuesOutput = execSync(\n `gh issue list --state all --json number,title,state,closedAt,labels --limit 100 2>/dev/null`,\n { cwd: repoPath, encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] }\n );\n const issues = JSON.parse(issuesOutput || '[]');\n\n for (const issue of issues) {\n const squad = detectSquadFromIssue(issue, repo);\n const squadStats = stats.bySquad.get(squad);\n\n if (issue.state === 'CLOSED') {\n const closed = new Date(issue.closedAt);\n if (closed >= new Date(since)) {\n stats.issuesClosed++;\n if (squadStats) {\n squadStats.issuesClosed++;\n }\n }\n } else {\n stats.issuesOpen++;\n if (squadStats) {\n squadStats.issuesOpen++;\n if (squadStats.recentIssues.length < 3) {\n squadStats.recentIssues.push({\n title: issue.title,\n number: issue.number,\n state: issue.state,\n });\n }\n }\n }\n }\n } catch {\n // gh not available or not in repo\n }\n }\n\n // Add commit counts per squad\n const gitStats = getMultiRepoGitStats(basePath, days);\n for (const [repo, commits] of gitStats.commitsByRepo) {\n // Map repo to squad\n for (const [squad, repos] of Object.entries(SQUAD_REPO_MAP)) {\n if (repos.includes(repo)) {\n const squadStats = stats.bySquad.get(squad);\n if (squadStats) {\n squadStats.commits += commits;\n }\n }\n }\n }\n\n return stats;\n}\n\nfunction detectSquadFromPR(pr: { title: string; labels: { name: string }[] }, repo: string): string {\n // Check labels first\n for (const label of pr.labels || []) {\n const labelLower = label.name.toLowerCase();\n for (const [squad, patterns] of Object.entries(SQUAD_LABELS)) {\n if (patterns.some(p => labelLower.includes(p))) {\n return squad;\n }\n }\n }\n\n // Check title\n const titleLower = pr.title.toLowerCase();\n for (const [squad, patterns] of Object.entries(SQUAD_LABELS)) {\n if (patterns.some(p => titleLower.includes(p))) {\n return squad;\n }\n }\n\n // Default based on repo\n if (repo === 'agents-squads-web') return 'website';\n if (repo === 'squads-cli') return 'product';\n return 'engineering';\n}\n\nfunction detectSquadFromIssue(issue: { title: string; labels: { name: string }[] }, repo: string): string {\n // Check labels first\n for (const label of issue.labels || []) {\n const labelLower = label.name.toLowerCase();\n\n // Direct squad label match\n if (labelLower.startsWith('squad:')) {\n return labelLower.replace('squad:', '');\n }\n\n for (const [squad, patterns] of Object.entries(SQUAD_LABELS)) {\n if (patterns.some(p => labelLower.includes(p))) {\n return squad;\n }\n }\n }\n\n // Check title\n const titleLower = issue.title.toLowerCase();\n for (const [squad, patterns] of Object.entries(SQUAD_LABELS)) {\n if (patterns.some(p => titleLower.includes(p))) {\n return squad;\n }\n }\n\n // Default based on repo\n if (repo === 'agents-squads-web') return 'website';\n if (repo === 'squads-cli') return 'product';\n return 'engineering';\n}\n\nexport function getMultiRepoGitStats(basePath: string, days: number = 30): GitPerformanceStats {\n const stats: GitPerformanceStats = {\n totalCommits: 0,\n commitsByDay: new Map(),\n commitsByAuthor: new Map(),\n commitsByRepo: new Map(),\n activeDays: 0,\n avgCommitsPerDay: 0,\n peakDay: null,\n repos: [],\n };\n\n for (const repo of SQUAD_REPOS) {\n const repoPath = join(basePath, repo);\n if (!existsSync(repoPath) || !existsSync(join(repoPath, '.git'))) {\n continue;\n }\n\n try {\n // Get commits from this repo (use %aN to respect .mailmap)\n const logOutput = execSync(\n `git log --since=\"${days} days ago\" --format=\"%H|%aN|%ad|%s\" --date=short 2>/dev/null`,\n { cwd: repoPath, encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] }\n ).trim();\n\n if (!logOutput) continue;\n\n const commits = logOutput.split('\\n').filter(l => l.trim());\n const authors = new Set<string>();\n let lastCommit = '';\n\n for (const line of commits) {\n const [hash, author, date, message] = line.split('|');\n if (!hash) continue;\n\n stats.totalCommits++;\n authors.add(author);\n if (!lastCommit) lastCommit = date;\n\n // By day\n const dayCount = stats.commitsByDay.get(date) || 0;\n stats.commitsByDay.set(date, dayCount + 1);\n\n // By author\n const authorCount = stats.commitsByAuthor.get(author) || 0;\n stats.commitsByAuthor.set(author, authorCount + 1);\n\n // By repo\n const repoCount = stats.commitsByRepo.get(repo) || 0;\n stats.commitsByRepo.set(repo, repoCount + 1);\n }\n\n stats.repos.push({\n name: repo,\n path: repoPath,\n commits: commits.length,\n lastCommit,\n authors: Array.from(authors),\n });\n\n } catch {\n // Skip repos that fail\n }\n }\n\n // Calculate derived stats\n stats.activeDays = stats.commitsByDay.size;\n stats.avgCommitsPerDay = stats.activeDays > 0\n ? Math.round((stats.totalCommits / days) * 10) / 10\n : 0;\n\n // Find peak day\n let peakCount = 0;\n let peakDate = '';\n for (const [date, count] of stats.commitsByDay) {\n if (count > peakCount) {\n peakCount = count;\n peakDate = date;\n }\n }\n if (peakDate) {\n stats.peakDay = { date: peakDate, count: peakCount };\n }\n\n return stats;\n}\n\n// Get recent activity sparkline data (last 7 days)\nexport function getActivitySparkline(basePath: string, days: number = 7): number[] {\n const activity: number[] = [];\n const now = new Date();\n\n for (let i = days - 1; i >= 0; i--) {\n const date = new Date(now);\n date.setDate(date.getDate() - i);\n const dateStr = date.toISOString().split('T')[0];\n activity.push(0);\n }\n\n for (const repo of SQUAD_REPOS) {\n const repoPath = join(basePath, repo);\n if (!existsSync(repoPath) || !existsSync(join(repoPath, '.git'))) {\n continue;\n }\n\n try {\n const logOutput = execSync(\n `git log --since=\"${days} days ago\" --format=\"%ad\" --date=short 2>/dev/null`,\n { cwd: repoPath, encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] }\n ).trim();\n\n if (!logOutput) continue;\n\n for (const dateStr of logOutput.split('\\n')) {\n const commitDate = new Date(dateStr);\n const daysAgo = Math.floor((now.getTime() - commitDate.getTime()) / (1000 * 60 * 60 * 24));\n const index = days - 1 - daysAgo;\n if (index >= 0 && index < days) {\n activity[index]++;\n }\n }\n } catch {\n // Skip\n }\n }\n\n return activity;\n}\n","import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'fs';\nimport { join } from 'path';\nimport { homedir } from 'os';\nimport { randomUUID } from 'crypto';\n\ninterface TelemetryEvent {\n event: string;\n timestamp: string;\n properties?: Record<string, string | number | boolean | undefined>;\n}\n\ninterface TelemetryConfig {\n enabled: boolean;\n anonymousId: string;\n firstRun: string;\n}\n\nconst TELEMETRY_DIR = join(homedir(), '.squads-cli');\nconst CONFIG_PATH = join(TELEMETRY_DIR, 'telemetry.json');\nconst EVENTS_PATH = join(TELEMETRY_DIR, 'events.json');\n\n// Telemetry endpoint - bridge or cloud\nconst TELEMETRY_ENDPOINT = process.env.SQUADS_TELEMETRY_URL ||\n (process.env.SQUADS_BRIDGE_URL ? `${process.env.SQUADS_BRIDGE_URL}/api/telemetry` : null);\n\n// Event queue for batch flushing\nlet eventQueue: TelemetryEvent[] = [];\nlet flushScheduled = false;\n\nfunction ensureDir(): void {\n if (!existsSync(TELEMETRY_DIR)) {\n mkdirSync(TELEMETRY_DIR, { recursive: true });\n }\n}\n\nfunction getConfig(): TelemetryConfig {\n ensureDir();\n\n if (!existsSync(CONFIG_PATH)) {\n const config: TelemetryConfig = {\n enabled: true, // Opt-out by default (common for CLIs)\n anonymousId: randomUUID(),\n firstRun: new Date().toISOString(),\n };\n writeFileSync(CONFIG_PATH, JSON.stringify(config, null, 2));\n return config;\n }\n\n try {\n return JSON.parse(readFileSync(CONFIG_PATH, 'utf-8'));\n } catch {\n return { enabled: false, anonymousId: '', firstRun: '' };\n }\n}\n\nfunction saveConfig(config: TelemetryConfig): void {\n ensureDir();\n writeFileSync(CONFIG_PATH, JSON.stringify(config, null, 2));\n}\n\nexport function isEnabled(): boolean {\n // Check environment variable first (allows CI/testing override)\n if (process.env.SQUADS_TELEMETRY_DISABLED === '1') {\n return false;\n }\n if (process.env.DO_NOT_TRACK === '1') {\n return false;\n }\n\n return getConfig().enabled;\n}\n\nexport function enable(): void {\n const config = getConfig();\n config.enabled = true;\n saveConfig(config);\n}\n\nexport function disable(): void {\n const config = getConfig();\n config.enabled = false;\n saveConfig(config);\n}\n\nexport function getAnonymousId(): string {\n return getConfig().anonymousId;\n}\n\nexport async function track(event: string, properties?: Record<string, string | number | boolean | undefined>): Promise<void> {\n if (!isEnabled()) return;\n\n const config = getConfig();\n\n const telemetryEvent: TelemetryEvent = {\n event,\n timestamp: new Date().toISOString(),\n properties: {\n ...properties,\n anonymousId: config.anonymousId,\n cliVersion: process.env.npm_package_version || 'unknown',\n },\n };\n\n // Store locally (for debugging/review)\n storeEventLocally(telemetryEvent);\n\n // Queue for batch sending\n eventQueue.push(telemetryEvent);\n\n // Schedule flush if not already scheduled\n if (TELEMETRY_ENDPOINT && !flushScheduled) {\n flushScheduled = true;\n // Flush on next tick to batch events from same command\n setImmediate(() => {\n flushEvents().catch(() => {});\n });\n }\n}\n\n/**\n * Flush queued events to the telemetry endpoint\n */\nexport async function flushEvents(): Promise<void> {\n if (!TELEMETRY_ENDPOINT || eventQueue.length === 0) {\n flushScheduled = false;\n return;\n }\n\n const batch = [...eventQueue];\n eventQueue = [];\n flushScheduled = false;\n\n try {\n await fetch(TELEMETRY_ENDPOINT, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ events: batch }),\n });\n } catch {\n // Restore events on failure (will retry on next track)\n eventQueue = [...batch, ...eventQueue].slice(-100); // Keep max 100\n }\n}\n\n/**\n * Track an error event\n */\nexport async function trackError(\n command: string,\n error: Error,\n context?: Record<string, string | number | boolean>\n): Promise<void> {\n await track(Events.CLI_ERROR, {\n command,\n errorType: error.constructor.name,\n errorMessage: error.message.slice(0, 100), // Truncate for privacy\n ...context,\n });\n}\n\n/**\n * Wrap an async command function with telemetry\n */\nexport function instrumentCommand<T>(\n name: string,\n fn: () => Promise<T>\n): () => Promise<T> {\n return async () => {\n const start = Date.now();\n try {\n const result = await fn();\n await track(`cli.${name}`, {\n durationMs: Date.now() - start,\n success: true,\n });\n return result;\n } catch (error) {\n await trackError(name, error as Error, {\n durationMs: Date.now() - start,\n });\n throw error;\n }\n };\n}\n\nfunction storeEventLocally(event: TelemetryEvent): void {\n ensureDir();\n\n let events: TelemetryEvent[] = [];\n\n if (existsSync(EVENTS_PATH)) {\n try {\n events = JSON.parse(readFileSync(EVENTS_PATH, 'utf-8'));\n } catch {\n events = [];\n }\n }\n\n // Keep last 1000 events\n events.push(event);\n if (events.length > 1000) {\n events = events.slice(-1000);\n }\n\n writeFileSync(EVENTS_PATH, JSON.stringify(events, null, 2));\n}\n\n// Pre-defined events for consistency\nexport const Events = {\n // Lifecycle\n CLI_INIT: 'cli.init',\n CLI_ERROR: 'cli.error',\n\n // Commands\n CLI_RUN: 'cli.run',\n CLI_STATUS: 'cli.status',\n CLI_DASHBOARD: 'cli.dashboard',\n CLI_WORKERS: 'cli.workers',\n\n // Goals\n CLI_GOAL_SET: 'cli.goal.set',\n CLI_GOAL_LIST: 'cli.goal.list',\n CLI_GOAL_COMPLETE: 'cli.goal.complete',\n CLI_GOAL_PROGRESS: 'cli.goal.progress',\n\n // Memory\n CLI_MEMORY_QUERY: 'cli.memory.query',\n CLI_MEMORY_SHOW: 'cli.memory.show',\n CLI_MEMORY_UPDATE: 'cli.memory.update',\n CLI_MEMORY_LIST: 'cli.memory.list',\n CLI_MEMORY_SYNC: 'cli.memory.sync',\n\n // Feedback\n CLI_FEEDBACK_ADD: 'cli.feedback.add',\n CLI_FEEDBACK_SHOW: 'cli.feedback.show',\n CLI_FEEDBACK_STATS: 'cli.feedback.stats',\n\n // Auth\n CLI_LOGIN: 'cli.login',\n CLI_LOGOUT: 'cli.logout',\n} as const;\n\n// Track command execution time (legacy helper)\nexport function trackCommand(command: string): () => void {\n const start = Date.now();\n\n return () => {\n const duration = Date.now() - start;\n track(`cli.${command}`, { durationMs: duration });\n };\n}\n\n// Register exit handler to flush remaining events\nlet exitHandlerRegistered = false;\n\nexport function registerExitHandler(): void {\n if (exitHandlerRegistered) return;\n exitHandlerRegistered = true;\n\n const cleanup = () => {\n // Synchronous flush attempt on exit\n if (eventQueue.length > 0 && TELEMETRY_ENDPOINT) {\n // Can't do async on exit, so just log\n storeEventLocally({\n event: 'cli.exit',\n timestamp: new Date().toISOString(),\n properties: { pendingEvents: eventQueue.length },\n });\n }\n };\n\n process.on('exit', cleanup);\n process.on('SIGINT', () => {\n cleanup();\n process.exit(0);\n });\n process.on('SIGTERM', () => {\n cleanup();\n process.exit(0);\n });\n}\n","import ora from 'ora';\nimport { spawn } from 'child_process';\nimport { join, dirname } from 'path';\nimport { existsSync, readFileSync, writeFileSync, mkdirSync } from 'fs';\nimport {\n findSquadsDir,\n loadSquad,\n listAgents,\n loadAgentDefinition\n} from '../lib/squad-parser.js';\nimport { findMemoryDir } from '../lib/memory.js';\nimport { track, Events } from '../lib/telemetry.js';\nimport {\n colors,\n bold,\n RESET,\n gradient,\n box,\n icons,\n writeLine,\n} from '../lib/terminal.js';\n\ninterface RunOptions {\n verbose?: boolean;\n dryRun?: boolean;\n agent?: string;\n}\n\ninterface ExecutionRecord {\n squadName: string;\n agentName: string;\n startTime: string;\n endTime?: string;\n status: 'running' | 'completed' | 'failed';\n outcome?: string;\n}\n\nfunction getExecutionLogPath(squadName: string, agentName: string): string | null {\n const memoryDir = findMemoryDir();\n if (!memoryDir) return null;\n return join(memoryDir, squadName, agentName, 'executions.md');\n}\n\nfunction logExecution(record: ExecutionRecord): void {\n const logPath = getExecutionLogPath(record.squadName, record.agentName);\n if (!logPath) return;\n\n const dir = dirname(logPath);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n\n let content = '';\n if (existsSync(logPath)) {\n content = readFileSync(logPath, 'utf-8');\n } else {\n content = `# ${record.squadName}/${record.agentName} - Execution Log\\n\\n`;\n }\n\n const entry = `\n---\n**${record.startTime}** | Status: ${record.status}\n${record.endTime ? `Completed: ${record.endTime}` : ''}\n${record.outcome ? `Outcome: ${record.outcome}` : ''}\n`;\n\n writeFileSync(logPath, content + entry);\n}\n\nfunction updateExecutionStatus(\n squadName: string,\n agentName: string,\n status: 'completed' | 'failed',\n outcome?: string\n): void {\n const logPath = getExecutionLogPath(squadName, agentName);\n if (!logPath || !existsSync(logPath)) return;\n\n let content = readFileSync(logPath, 'utf-8');\n const endTime = new Date().toISOString();\n\n // Update the last \"running\" entry\n content = content.replace(\n /Status: running\\n$/,\n `Status: ${status}\\nCompleted: ${endTime}\\n${outcome ? `Outcome: ${outcome}\\n` : ''}`\n );\n\n writeFileSync(logPath, content);\n}\n\nexport async function runCommand(\n target: string,\n options: RunOptions\n): Promise<void> {\n const squadsDir = findSquadsDir();\n\n if (!squadsDir) {\n writeLine(` ${colors.red}No .agents/squads directory found${RESET}`);\n writeLine(` ${colors.dim}Run \\`squads init\\` to create one.${RESET}`);\n process.exit(1);\n }\n\n // Check if target is a squad or an agent\n const squad = loadSquad(target);\n\n if (squad) {\n await track(Events.CLI_RUN, { type: 'squad', target: squad.name });\n await runSquad(squad, squadsDir, options);\n } else {\n // Try to find as an agent\n const agents = listAgents(squadsDir);\n const agent = agents.find(a => a.name === target);\n\n if (agent && agent.filePath) {\n // Extract squad name from path\n const pathParts = agent.filePath.split('/');\n const squadIdx = pathParts.indexOf('squads');\n const squadName = squadIdx >= 0 ? pathParts[squadIdx + 1] : 'unknown';\n await runAgent(agent.name, agent.filePath, squadName, options);\n } else {\n writeLine(` ${colors.red}Squad or agent \"${target}\" not found${RESET}`);\n writeLine(` ${colors.dim}Run \\`squads list\\` to see available squads and agents.${RESET}`);\n process.exit(1);\n }\n }\n}\n\nasync function runSquad(\n squad: ReturnType<typeof loadSquad>,\n squadsDir: string,\n options: RunOptions\n): Promise<void> {\n if (!squad) return;\n\n const startTime = new Date().toISOString();\n\n writeLine();\n writeLine(` ${gradient('squads')} ${colors.dim}run${RESET} ${colors.cyan}${squad.name}${RESET}`);\n writeLine();\n if (squad.mission) {\n writeLine(` ${colors.dim}${squad.mission}${RESET}`);\n writeLine();\n }\n writeLine(` ${colors.dim}Started: ${startTime}${RESET}`);\n writeLine();\n\n // If there's a pipeline, run agents in order\n if (squad.pipelines.length > 0) {\n const pipeline = squad.pipelines[0];\n writeLine(` ${bold}Pipeline${RESET} ${colors.dim}${pipeline.agents.join(' → ')}${RESET}`);\n writeLine();\n\n for (let i = 0; i < pipeline.agents.length; i++) {\n const agentName = pipeline.agents[i];\n const agentPath = join(squadsDir, squad.name, `${agentName}.md`);\n\n if (existsSync(agentPath)) {\n writeLine(` ${colors.dim}[${i + 1}/${pipeline.agents.length}]${RESET}`);\n await runAgent(agentName, agentPath, squad.name, options);\n writeLine();\n } else {\n writeLine(` ${icons.warning} ${colors.yellow}Agent ${agentName} not found, skipping${RESET}`);\n }\n }\n } else {\n // Run orchestrator if exists, otherwise list agents\n const orchestrator = squad.agents.find(a =>\n a.name.includes('lead') || a.trigger === 'Manual'\n );\n\n if (orchestrator) {\n const agentPath = join(squadsDir, squad.name, `${orchestrator.name}.md`);\n if (existsSync(agentPath)) {\n await runAgent(orchestrator.name, agentPath, squad.name, options);\n }\n } else {\n writeLine(` ${colors.dim}No pipeline defined. Available agents:${RESET}`);\n for (const agent of squad.agents) {\n writeLine(` ${icons.empty} ${colors.cyan}${agent.name}${RESET} ${colors.dim}${agent.role}${RESET}`);\n }\n writeLine();\n writeLine(` ${colors.dim}Run a specific agent:${RESET}`);\n writeLine(` ${colors.dim}$${RESET} squads run ${colors.cyan}${squad.name}${RESET} --agent ${colors.cyan}<name>${RESET}`);\n }\n }\n\n writeLine();\n writeLine(` ${colors.dim}After execution, record outcome:${RESET}`);\n writeLine(` ${colors.dim}$${RESET} squads feedback add ${colors.cyan}${squad.name}${RESET} ${colors.cyan}<1-5>${RESET} ${colors.cyan}\"<feedback>\"${RESET}`);\n writeLine();\n}\n\nasync function runAgent(\n agentName: string,\n agentPath: string,\n squadName: string,\n options: RunOptions & { execute?: boolean }\n): Promise<void> {\n const spinner = ora(`Running agent: ${agentName}`).start();\n const startTime = new Date().toISOString();\n\n const definition = loadAgentDefinition(agentPath);\n\n if (options.dryRun) {\n spinner.info(`[DRY RUN] Would run ${agentName}`);\n if (options.verbose) {\n writeLine(` ${colors.dim}Agent definition:${RESET}`);\n writeLine(` ${colors.dim}${definition.slice(0, 500)}...${RESET}`);\n }\n return;\n }\n\n // Log execution start\n logExecution({\n squadName,\n agentName,\n startTime,\n status: 'running',\n });\n\n // Generate the Claude Code prompt\n const prompt = `Execute the ${agentName} agent from squad ${squadName}.\n\nRead the agent definition at ${agentPath} and follow its instructions exactly.\n\nThe agent definition contains:\n- Purpose/role\n- Tools it can use (MCP servers, skills)\n- Step-by-step instructions\n- Expected output format\n\nAfter completion:\n1. Update the agent's memory in .agents/memory/${squadName}/${agentName}/state.md\n2. Log any learnings to learnings.md\n3. Report what was accomplished`;\n\n // Check if Claude CLI is available\n const claudeAvailable = await checkClaudeCliAvailable();\n\n if (options.execute && claudeAvailable) {\n spinner.text = `Executing ${agentName} with Claude Code...`;\n\n try {\n const result = await executeWithClaude(prompt, options.verbose);\n spinner.succeed(`Agent ${agentName} completed`);\n updateExecutionStatus(squadName, agentName, 'completed', 'Executed via Claude CLI');\n\n if (result) {\n writeLine(` ${colors.dim}Output:${RESET}`);\n writeLine(` ${result.slice(0, 500)}`);\n if (result.length > 500) writeLine(` ${colors.dim}... (truncated)${RESET}`);\n }\n } catch (error) {\n spinner.fail(`Agent ${agentName} failed`);\n updateExecutionStatus(squadName, agentName, 'failed', String(error));\n writeLine(` ${colors.red}${String(error)}${RESET}`);\n }\n } else {\n // Show instructions for manual execution\n spinner.succeed(`Agent ${agentName} ready`);\n writeLine(` ${colors.dim}Execution logged: ${startTime}${RESET}`);\n\n if (!claudeAvailable) {\n writeLine();\n writeLine(` ${colors.yellow}Claude CLI not found${RESET}`);\n writeLine(` ${colors.dim}Install: npm install -g @anthropic-ai/claude-code${RESET}`);\n }\n\n writeLine();\n writeLine(` ${colors.dim}To execute with Claude Code:${RESET}`);\n writeLine(` ${colors.dim}$${RESET} claude --print \"${prompt.replace(/\"/g, '\\\\\"').replace(/\\n/g, ' ').slice(0, 80)}...\"`);\n writeLine();\n writeLine(` ${colors.dim}Or run with --execute flag:${RESET}`);\n writeLine(` ${colors.dim}$${RESET} squads run ${colors.cyan}${squadName}${RESET} --execute`);\n writeLine();\n writeLine(` ${colors.dim}Or in Claude Code session:${RESET}`);\n writeLine(` ${colors.dim}$${RESET} Run the ${colors.cyan}${agentName}${RESET} agent from ${agentPath}`);\n }\n}\n\nasync function checkClaudeCliAvailable(): Promise<boolean> {\n return new Promise((resolve) => {\n const check = spawn('which', ['claude'], { stdio: 'pipe' });\n check.on('close', (code) => resolve(code === 0));\n check.on('error', () => resolve(false));\n });\n}\n\nasync function executeWithClaude(prompt: string, verbose?: boolean): Promise<string> {\n return new Promise((resolve, reject) => {\n const args = ['--print', prompt];\n if (verbose) {\n writeLine(` ${colors.dim}Spawning: claude ${args.slice(0, 1).join(' ')} ...${RESET}`);\n }\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\n const claude = spawn('claude', args, {\n stdio: ['pipe', 'pipe', 'pipe'],\n env: {\n ...process.env,\n SQUADS_SQUAD: squadMatch?.[1] || 'unknown',\n SQUADS_AGENT: agentMatch?.[1] || 'unknown',\n },\n });\n\n let output = '';\n let error = '';\n\n claude.stdout?.on('data', (data) => {\n output += data.toString();\n if (verbose) {\n process.stdout.write(data.toString());\n }\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 || `Claude exited with code ${code}`));\n }\n });\n\n claude.on('error', (err) => {\n reject(err);\n });\n\n // Timeout after 5 minutes\n setTimeout(() => {\n claude.kill();\n reject(new Error('Execution timed out after 5 minutes'));\n }, 5 * 60 * 1000);\n });\n}\n\nexport async function runSquadCommand(\n squadName: string,\n options: RunOptions\n): Promise<void> {\n return runCommand(squadName, options);\n}\n","import { readFileSync, existsSync, readdirSync, writeFileSync } from 'fs';\nimport { join, basename } from 'path';\n\nexport interface Agent {\n name: string;\n role: string;\n trigger: string;\n status?: string;\n filePath?: string;\n squad?: string;\n}\n\nexport interface Pipeline {\n name: string;\n agents: string[];\n}\n\nexport interface Goal {\n description: string;\n completed: boolean;\n progress?: string;\n metrics?: string[];\n}\n\nexport interface Squad {\n name: string;\n mission: string;\n agents: Agent[];\n pipelines: Pipeline[];\n triggers: {\n scheduled: string[];\n event: string[];\n manual: string[];\n };\n dependencies: string[];\n outputPath: string;\n goals: Goal[];\n}\n\nexport function findSquadsDir(): string | null {\n // Look for .agents/squads in current directory or parent directories\n let dir = process.cwd();\n\n for (let i = 0; i < 5; i++) {\n const squadsPath = join(dir, '.agents', 'squads');\n if (existsSync(squadsPath)) {\n return squadsPath;\n }\n const parent = join(dir, '..');\n if (parent === dir) break;\n dir = parent;\n }\n\n return null;\n}\n\nexport function listSquads(squadsDir: string): string[] {\n const squads: string[] = [];\n\n const entries = readdirSync(squadsDir, { withFileTypes: true });\n for (const entry of entries) {\n if (entry.isDirectory() && !entry.name.startsWith('_')) {\n const squadFile = join(squadsDir, entry.name, 'SQUAD.md');\n if (existsSync(squadFile)) {\n squads.push(entry.name);\n }\n }\n }\n\n return squads;\n}\n\nexport function listAgents(squadsDir: string, squadName?: string): Agent[] {\n const agents: Agent[] = [];\n\n const dirs = squadName\n ? [squadName]\n : readdirSync(squadsDir, { withFileTypes: true })\n .filter(e => e.isDirectory() && !e.name.startsWith('_'))\n .map(e => e.name);\n\n for (const dir of dirs) {\n const squadPath = join(squadsDir, dir);\n if (!existsSync(squadPath)) continue;\n\n const files = readdirSync(squadPath);\n for (const file of files) {\n if (file.endsWith('.md') && file !== 'SQUAD.md') {\n const agentName = file.replace('.md', '');\n agents.push({\n name: agentName,\n role: `Agent in ${dir}`,\n trigger: 'manual',\n filePath: join(squadPath, file)\n });\n }\n }\n }\n\n return agents;\n}\n\nexport function parseSquadFile(filePath: string): Squad {\n const content = readFileSync(filePath, 'utf-8');\n const lines = content.split('\\n');\n\n const squad: Squad = {\n name: basename(filePath).replace('.md', ''),\n mission: '',\n agents: [],\n pipelines: [],\n triggers: { scheduled: [], event: [], manual: [] },\n dependencies: [],\n outputPath: '',\n goals: []\n };\n\n let currentSection = '';\n let inTable = false;\n let tableHeaders: string[] = [];\n\n for (const line of lines) {\n // Extract squad name from title\n if (line.startsWith('# Squad:')) {\n squad.name = line.replace('# Squad:', '').trim().toLowerCase();\n continue;\n }\n\n // Track sections\n if (line.startsWith('## ')) {\n currentSection = line.replace('## ', '').trim().toLowerCase();\n inTable = false;\n continue;\n }\n\n // Extract mission\n if (currentSection === 'mission' && line.trim() && !line.startsWith('#')) {\n if (!squad.mission) {\n squad.mission = line.trim();\n }\n }\n\n // Parse agent tables\n if (currentSection.includes('agent') || currentSection.includes('orchestrator') ||\n currentSection.includes('evaluator') || currentSection.includes('builder') ||\n currentSection.includes('priority')) {\n\n if (line.includes('|') && line.includes('Agent')) {\n inTable = true;\n tableHeaders = line.split('|').map(h => h.trim().toLowerCase());\n continue;\n }\n\n if (inTable && line.includes('|') && !line.includes('---')) {\n const cells = line.split('|').map(c => c.trim().replace(/`/g, ''));\n const agentIdx = tableHeaders.findIndex(h => h === 'agent');\n const roleIdx = tableHeaders.findIndex(h => h === 'role');\n const triggerIdx = tableHeaders.findIndex(h => h === 'trigger');\n const statusIdx = tableHeaders.findIndex(h => h === 'status');\n\n if (agentIdx >= 0 && cells[agentIdx]) {\n squad.agents.push({\n name: cells[agentIdx],\n role: roleIdx >= 0 ? cells[roleIdx] : '',\n trigger: triggerIdx >= 0 ? cells[triggerIdx] : 'manual',\n status: statusIdx >= 0 ? cells[statusIdx] : 'active'\n });\n }\n }\n }\n\n // Parse pipelines (looking for patterns like: agent1 → agent2 → agent3)\n if (line.includes('→') && line.includes('`')) {\n const pipelineMatch = line.match(/`([^`]+)`\\s*→\\s*`([^`]+)`/g);\n if (pipelineMatch) {\n const agentNames = line.match(/`([^`]+)`/g)?.map(m => m.replace(/`/g, '')) || [];\n if (agentNames.length >= 2) {\n squad.pipelines.push({\n name: 'default',\n agents: agentNames\n });\n }\n }\n }\n\n // Also look for Pipeline: format\n if (line.toLowerCase().includes('pipeline:')) {\n const pipelineContent = line.split(':')[1];\n if (pipelineContent && pipelineContent.includes('→')) {\n const agentNames = pipelineContent.match(/`([^`]+)`/g)?.map(m => m.replace(/`/g, '')) || [];\n if (agentNames.length >= 2) {\n squad.pipelines.push({\n name: 'default',\n agents: agentNames\n });\n }\n }\n }\n\n // Extract output path\n if (line.toLowerCase().includes('primary') && line.includes('`')) {\n const match = line.match(/`([^`]+)`/);\n if (match) {\n squad.outputPath = match[1].replace(/\\/$/, '');\n }\n }\n\n // Parse goals (checkbox format: - [ ] or - [x])\n if (currentSection === 'goals') {\n const goalMatch = line.match(/^-\\s*\\[([ x])\\]\\s*(.+)$/);\n if (goalMatch) {\n const completed = goalMatch[1] === 'x';\n let description = goalMatch[2].trim();\n let progress: string | undefined;\n\n // Check for progress annotation\n const progressMatch = description.match(/\\(progress:\\s*([^)]+)\\)/i);\n if (progressMatch) {\n progress = progressMatch[1];\n description = description.replace(progressMatch[0], '').trim();\n }\n\n squad.goals.push({\n description,\n completed,\n progress\n });\n }\n }\n }\n\n return squad;\n}\n\nexport function loadSquad(squadName: string): Squad | null {\n const squadsDir = findSquadsDir();\n if (!squadsDir) return null;\n\n const squadFile = join(squadsDir, squadName, 'SQUAD.md');\n if (!existsSync(squadFile)) return null;\n\n return parseSquadFile(squadFile);\n}\n\nexport function loadAgentDefinition(agentPath: string): string {\n if (!existsSync(agentPath)) return '';\n return readFileSync(agentPath, 'utf-8');\n}\n\nexport function addGoalToSquad(squadName: string, goal: string): boolean {\n const squadsDir = findSquadsDir();\n if (!squadsDir) return false;\n\n const squadFile = join(squadsDir, squadName, 'SQUAD.md');\n if (!existsSync(squadFile)) return false;\n\n let content = readFileSync(squadFile, 'utf-8');\n\n // Check if Goals section exists\n if (!content.includes('## Goals')) {\n // Add Goals section before Dependencies or at end\n const insertPoint = content.indexOf('## Dependencies');\n if (insertPoint > 0) {\n content = content.slice(0, insertPoint) + `## Goals\\n\\n- [ ] ${goal}\\n\\n` + content.slice(insertPoint);\n } else {\n content += `\\n## Goals\\n\\n- [ ] ${goal}\\n`;\n }\n } else {\n // Add to existing Goals section\n const goalsIdx = content.indexOf('## Goals');\n const nextSectionIdx = content.indexOf('\\n## ', goalsIdx + 1);\n const endIdx = nextSectionIdx > 0 ? nextSectionIdx : content.length;\n\n // Find last goal line or section header\n const goalsSection = content.slice(goalsIdx, endIdx);\n const lastGoalMatch = goalsSection.match(/^-\\s*\\[[ x]\\].+$/gm);\n\n if (lastGoalMatch) {\n // Add after last goal\n const lastGoal = lastGoalMatch[lastGoalMatch.length - 1];\n const lastGoalIdx = content.lastIndexOf(lastGoal, endIdx);\n const insertPos = lastGoalIdx + lastGoal.length;\n content = content.slice(0, insertPos) + `\\n- [ ] ${goal}` + content.slice(insertPos);\n } else {\n // No goals yet, add after section header\n const headerEnd = goalsIdx + '## Goals'.length;\n content = content.slice(0, headerEnd) + `\\n\\n- [ ] ${goal}` + content.slice(headerEnd);\n }\n }\n\n writeFileSync(squadFile, content);\n return true;\n}\n\nexport function updateGoalInSquad(\n squadName: string,\n goalIndex: number,\n updates: { completed?: boolean; progress?: string }\n): boolean {\n const squadsDir = findSquadsDir();\n if (!squadsDir) return false;\n\n const squadFile = join(squadsDir, squadName, 'SQUAD.md');\n if (!existsSync(squadFile)) return false;\n\n const content = readFileSync(squadFile, 'utf-8');\n const lines = content.split('\\n');\n\n let currentSection = '';\n let goalCount = 0;\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n\n if (line.startsWith('## ')) {\n currentSection = line.replace('## ', '').trim().toLowerCase();\n continue;\n }\n\n if (currentSection === 'goals') {\n const goalMatch = line.match(/^-\\s*\\[([ x])\\]\\s*(.+)$/);\n if (goalMatch) {\n if (goalCount === goalIndex) {\n let newLine = '- [' + (updates.completed ? 'x' : ' ') + '] ' + goalMatch[2];\n\n // Handle progress update\n if (updates.progress !== undefined) {\n // Remove existing progress annotation\n newLine = newLine.replace(/\\s*\\(progress:\\s*[^)]+\\)/i, '');\n if (updates.progress) {\n newLine += ` (progress: ${updates.progress})`;\n }\n }\n\n lines[i] = newLine;\n writeFileSync(squadFile, lines.join('\\n'));\n return true;\n }\n goalCount++;\n }\n }\n }\n\n return false;\n}\n","import { readFileSync, writeFileSync, existsSync, readdirSync, mkdirSync } from 'fs';\nimport { join, dirname } from 'path';\n\nexport interface MemoryEntry {\n squad: string;\n agent: string;\n type: 'state' | 'output' | 'learnings' | 'feedback';\n content: string;\n path: string;\n lastUpdated?: string;\n}\n\nexport interface SearchResult {\n entry: MemoryEntry;\n matches: string[];\n score: number;\n}\n\nexport function findMemoryDir(): string | null {\n let dir = process.cwd();\n\n for (let i = 0; i < 5; i++) {\n const memoryPath = join(dir, '.agents', 'memory');\n if (existsSync(memoryPath)) {\n return memoryPath;\n }\n const parent = join(dir, '..');\n if (parent === dir) break;\n dir = parent;\n }\n\n return null;\n}\n\nexport function listMemoryEntries(memoryDir: string): MemoryEntry[] {\n const entries: MemoryEntry[] = [];\n\n const squads = readdirSync(memoryDir, { withFileTypes: true })\n .filter(e => e.isDirectory())\n .map(e => e.name);\n\n for (const squad of squads) {\n const squadPath = join(memoryDir, squad);\n const agents = readdirSync(squadPath, { withFileTypes: true })\n .filter(e => e.isDirectory())\n .map(e => e.name);\n\n for (const agent of agents) {\n const agentPath = join(squadPath, agent);\n const files = readdirSync(agentPath).filter(f => f.endsWith('.md'));\n\n for (const file of files) {\n const filePath = join(agentPath, file);\n const type = file.replace('.md', '') as MemoryEntry['type'];\n\n entries.push({\n squad,\n agent,\n type,\n content: readFileSync(filePath, 'utf-8'),\n path: filePath\n });\n }\n }\n }\n\n return entries;\n}\n\n// Semantic expansions for common business terms\nconst SEMANTIC_EXPANSIONS: Record<string, string[]> = {\n 'pricing': ['price', 'cost', '$', 'revenue', 'fee', 'rate'],\n 'price': ['pricing', 'cost', '$', 'fee'],\n 'revenue': ['income', 'sales', 'mrr', 'arr', '$'],\n 'cost': ['expense', 'spend', 'budget', '$', 'price'],\n 'customer': ['client', 'lead', 'prospect', 'user'],\n 'client': ['customer', 'lead', 'prospect'],\n 'lead': ['prospect', 'customer', 'client', 'pipeline'],\n 'agent': ['squad', 'bot', 'ai'],\n 'squad': ['team', 'agent', 'group'],\n 'status': ['state', 'progress', 'health'],\n 'bug': ['issue', 'error', 'problem', 'fix'],\n 'feature': ['capability', 'function', 'ability'],\n};\n\nfunction expandQuery(query: string): string[] {\n const words = query.toLowerCase().split(/\\s+/);\n const expanded = new Set(words);\n\n for (const word of words) {\n if (SEMANTIC_EXPANSIONS[word]) {\n SEMANTIC_EXPANSIONS[word].forEach(syn => expanded.add(syn));\n }\n }\n\n return Array.from(expanded);\n}\n\nfunction getFileAge(filePath: string): number {\n try {\n const { statSync } = require('fs');\n const stats = statSync(filePath);\n const ageMs = Date.now() - stats.mtimeMs;\n const ageDays = ageMs / (1000 * 60 * 60 * 24);\n return ageDays;\n } catch {\n return 999;\n }\n}\n\nexport function searchMemory(query: string, memoryDir?: string): SearchResult[] {\n const dir = memoryDir || findMemoryDir();\n if (!dir) return [];\n\n const entries = listMemoryEntries(dir);\n const results: SearchResult[] = [];\n const queryLower = query.toLowerCase();\n const expandedTerms = expandQuery(queryLower);\n\n for (const entry of entries) {\n const contentLower = entry.content.toLowerCase();\n const lines = entry.content.split('\\n');\n const matches: string[] = [];\n let score = 0;\n let directHits = 0;\n let expandedHits = 0;\n\n // Check direct query words first\n const directWords = queryLower.split(/\\s+/);\n for (const word of directWords) {\n if (contentLower.includes(word)) {\n directHits += 1;\n score += 2; // Direct matches worth more\n }\n }\n\n // Check expanded terms\n for (const term of expandedTerms) {\n if (contentLower.includes(term)) {\n expandedHits += 1;\n score += 0.5; // Expanded matches worth less but still count\n\n // Find matching lines with context\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n if (line.toLowerCase().includes(term) && line.trim() && !matches.includes(line.trim())) {\n matches.push(line.trim());\n }\n }\n }\n }\n\n // Boost score for exact phrase match\n if (contentLower.includes(queryLower)) {\n score += 5;\n }\n\n // Recency boost - files updated recently are more relevant\n const ageDays = getFileAge(entry.path);\n if (ageDays < 1) {\n score *= 1.5; // Updated today\n } else if (ageDays < 7) {\n score *= 1.2; // Updated this week\n } else if (ageDays > 30) {\n score *= 0.8; // Stale data penalty\n }\n\n // Type weighting - balanced across types\n const typeWeights: Record<string, number> = {\n 'state': 1.2, // Current state slightly preferred\n 'learnings': 1.1, // Learnings are valuable\n 'output': 1.0, // Recent outputs\n 'feedback': 0.9, // Feedback less commonly needed\n };\n score *= typeWeights[entry.type] || 1.0;\n\n if (score > 0 && (directHits > 0 || expandedHits > 1)) {\n results.push({ entry, matches: matches.slice(0, 7), score });\n }\n }\n\n // Sort by score descending\n return results.sort((a, b) => b.score - a.score);\n}\n\nexport function getSquadState(squadName: string): MemoryEntry[] {\n const memoryDir = findMemoryDir();\n if (!memoryDir) return [];\n\n const squadPath = join(memoryDir, squadName);\n if (!existsSync(squadPath)) return [];\n\n const entries: MemoryEntry[] = [];\n const agents = readdirSync(squadPath, { withFileTypes: true })\n .filter(e => e.isDirectory())\n .map(e => e.name);\n\n for (const agent of agents) {\n const statePath = join(squadPath, agent, 'state.md');\n if (existsSync(statePath)) {\n entries.push({\n squad: squadName,\n agent,\n type: 'state',\n content: readFileSync(statePath, 'utf-8'),\n path: statePath\n });\n }\n }\n\n return entries;\n}\n\nexport function updateMemory(\n squadName: string,\n agentName: string,\n type: MemoryEntry['type'],\n content: string\n): void {\n const memoryDir = findMemoryDir();\n if (!memoryDir) {\n throw new Error('No .agents/memory directory found');\n }\n\n const filePath = join(memoryDir, squadName, agentName, `${type}.md`);\n const dir = dirname(filePath);\n\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n\n writeFileSync(filePath, content);\n}\n\nexport function appendToMemory(\n squadName: string,\n agentName: string,\n type: MemoryEntry['type'],\n addition: string\n): void {\n const memoryDir = findMemoryDir();\n if (!memoryDir) {\n throw new Error('No .agents/memory directory found');\n }\n\n const filePath = join(memoryDir, squadName, agentName, `${type}.md`);\n\n let existing = '';\n if (existsSync(filePath)) {\n existing = readFileSync(filePath, 'utf-8');\n }\n\n const timestamp = new Date().toISOString().split('T')[0];\n const newContent = existing + `\\n\\n---\\n_Added: ${timestamp}_\\n\\n${addition}`;\n\n updateMemory(squadName, agentName, type, newContent.trim());\n}\n","// Terminal utilities - Bun-style approach\n// Raw ANSI for performance, no heavy deps\n\n// ANSI escape codes\nexport const ESC = '\\x1b[';\nexport const RESET = `${ESC}0m`;\n\n// Colors (256-color mode for gradients)\nexport const rgb = (r: number, g: number, b: number) => `${ESC}38;2;${r};${g};${b}m`;\nexport const bgRgb = (r: number, g: number, b: number) => `${ESC}48;2;${r};${g};${b}m`;\n\n// Named colors (our brand palette)\nexport const colors = {\n purple: rgb(168, 85, 247), // #a855f7\n pink: rgb(236, 72, 153), // #ec4899\n cyan: rgb(6, 182, 212), // #06b6d4\n green: rgb(16, 185, 129), // #10b981\n yellow: rgb(234, 179, 8), // #eab308\n red: rgb(239, 68, 68), // #ef4444\n gray: rgb(107, 114, 128), // #6b7280\n dim: rgb(75, 85, 99), // #4b5563\n white: rgb(255, 255, 255),\n};\n\n// Styles\nexport const bold = `${ESC}1m`;\nexport const dim = `${ESC}2m`;\n\n// Cursor control\nexport const cursor = {\n hide: `${ESC}?25l`,\n show: `${ESC}?25h`,\n up: (n = 1) => `${ESC}${n}A`,\n down: (n = 1) => `${ESC}${n}B`,\n left: (n = 1) => `${ESC}${n}D`,\n right: (n = 1) => `${ESC}${n}C`,\n to: (x: number, y: number) => `${ESC}${y};${x}H`,\n save: `${ESC}s`,\n restore: `${ESC}u`,\n};\n\n// Clear\nexport const clear = {\n line: `${ESC}2K`,\n toEnd: `${ESC}0K`,\n screen: `${ESC}2J${ESC}0;0H`,\n};\n\n// Gradient text (purple → pink → cyan)\nexport function gradient(text: string): string {\n const stops = [\n [168, 85, 247], // purple\n [192, 132, 252], // purple-light\n [232, 121, 249], // pink\n [244, 114, 182], // pink-light\n [251, 113, 133], // rose\n ];\n\n let result = '';\n for (let i = 0; i < text.length; i++) {\n const t = i / Math.max(text.length - 1, 1);\n const stopIndex = t * (stops.length - 1);\n const lower = Math.floor(stopIndex);\n const upper = Math.min(lower + 1, stops.length - 1);\n const blend = stopIndex - lower;\n\n const r = Math.round(stops[lower][0] + (stops[upper][0] - stops[lower][0]) * blend);\n const g = Math.round(stops[lower][1] + (stops[upper][1] - stops[lower][1]) * blend);\n const b = Math.round(stops[lower][2] + (stops[upper][2] - stops[lower][2]) * blend);\n\n result += rgb(r, g, b) + text[i];\n }\n return result + RESET;\n}\n\n// Progress bar with gradient fill\nexport function progressBar(percent: number, width = 20): string {\n const filled = Math.round((percent / 100) * width);\n const empty = width - filled;\n\n let bar = '';\n for (let i = 0; i < filled; i++) {\n const t = i / Math.max(filled - 1, 1);\n const r = Math.round(16 + (168 - 16) * t);\n const g = Math.round(185 + (85 - 185) * t);\n const b = Math.round(129 + (247 - 129) * t);\n bar += rgb(r, g, b) + '━';\n }\n\n bar += colors.dim + '━'.repeat(empty) + RESET;\n return bar;\n}\n\n// Box drawing\nexport const box = {\n topLeft: '┌',\n topRight: '┐',\n bottomLeft: '└',\n bottomRight: '┘',\n horizontal: '─',\n vertical: '│',\n teeRight: '├',\n teeLeft: '┤',\n};\n\n// Format helpers\nexport function padEnd(str: string, len: number): string {\n // Strip ANSI codes for length calculation\n const visible = str.replace(/\\x1b\\[[0-9;]*m/g, '');\n const pad = Math.max(0, len - visible.length);\n return str + ' '.repeat(pad);\n}\n\nexport function truncate(str: string, len: number): string {\n const visible = str.replace(/\\x1b\\[[0-9;]*m/g, '');\n if (visible.length <= len) return str;\n\n // Simple truncation (won't handle mid-ANSI truncation perfectly)\n let result = '';\n let count = 0;\n let i = 0;\n\n while (i < str.length && count < len - 1) {\n if (str[i] === '\\x1b') {\n const end = str.indexOf('m', i);\n if (end !== -1) {\n result += str.slice(i, end + 1);\n i = end + 1;\n continue;\n }\n }\n result += str[i];\n count++;\n i++;\n }\n\n return result + colors.dim + '…' + RESET;\n}\n\n// Spinner frames\nexport const spinnerFrames = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];\n\n// Status icons\nexport const icons = {\n success: `${colors.green}●${RESET}`,\n warning: `${colors.yellow}○${RESET}`,\n error: `${colors.red}●${RESET}`,\n pending: `${colors.dim}○${RESET}`,\n active: `${colors.green}●${RESET}`,\n progress: `${colors.cyan}◆${RESET}`,\n empty: `${colors.dim}◇${RESET}`,\n};\n\n// Write without newline\nexport function write(str: string): void {\n process.stdout.write(str);\n}\n\n// Write line\nexport function writeLine(str = ''): void {\n process.stdout.write(str + '\\n');\n}\n\n// Sparkline chart using block characters\nexport function sparkline(values: number[], width?: number): string {\n if (values.length === 0) return '';\n\n const blocks = ['▁', '▂', '▃', '▄', '▅', '▆', '▇', '█'];\n const max = Math.max(...values, 1);\n\n let result = '';\n for (const val of values) {\n const normalized = val / max;\n const blockIndex = Math.min(Math.floor(normalized * blocks.length), blocks.length - 1);\n const intensity = normalized;\n\n // Color gradient from dim to cyan to green based on value\n if (normalized === 0) {\n result += colors.dim + blocks[0];\n } else if (normalized < 0.5) {\n result += colors.cyan + blocks[blockIndex];\n } else {\n result += colors.green + blocks[blockIndex];\n }\n }\n\n return result + RESET;\n}\n\n// Bar chart (horizontal)\nexport function barChart(value: number, max: number, width: number = 20, label?: string): string {\n const filled = Math.round((value / max) * width);\n const empty = width - filled;\n\n let bar = '';\n for (let i = 0; i < filled; i++) {\n const t = i / Math.max(filled - 1, 1);\n // Green to cyan gradient\n const r = Math.round(16 + (6 - 16) * t);\n const g = Math.round(185 + (182 - 185) * t);\n const b = Math.round(129 + (212 - 129) * t);\n bar += rgb(r, g, b) + '━';\n }\n\n bar += colors.dim + '━'.repeat(empty) + RESET;\n\n if (label) {\n return `${bar} ${label}`;\n }\n return bar;\n}\n","import {\n findSquadsDir,\n listSquads,\n listAgents\n} from '../lib/squad-parser.js';\nimport {\n colors,\n bold,\n RESET,\n gradient,\n box,\n padEnd,\n icons,\n writeLine,\n} from '../lib/terminal.js';\n\ninterface ListOptions {\n squads?: boolean;\n agents?: boolean;\n}\n\nexport async function listCommand(options: ListOptions): Promise<void> {\n const squadsDir = findSquadsDir();\n\n if (!squadsDir) {\n writeLine(` ${colors.red}No .agents/squads directory found${RESET}`);\n writeLine(` ${colors.dim}Run \\`squads init\\` to create one.${RESET}`);\n process.exit(1);\n }\n\n const squads = listSquads(squadsDir);\n const allAgents = listAgents(squadsDir);\n\n writeLine();\n writeLine(` ${gradient('squads')} ${colors.dim}list${RESET}`);\n writeLine();\n\n // Stats\n writeLine(` ${colors.cyan}${squads.length}${RESET} squads ${colors.dim}│${RESET} ${colors.cyan}${allAgents.length}${RESET} agents`);\n writeLine();\n\n if (!options.agents) {\n // Show squads table\n const w = { name: 16, agents: 8, lead: 24 };\n const tableWidth = w.name + w.agents + w.lead + 4;\n\n writeLine(` ${colors.purple}${box.topLeft}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.topRight}${RESET}`);\n\n const header = ` ${colors.purple}${box.vertical}${RESET} ` +\n `${bold}${padEnd('SQUAD', w.name)}${RESET}` +\n `${bold}${padEnd('AGENTS', w.agents)}${RESET}` +\n `${bold}LEAD${RESET}` +\n ` ${colors.purple}${box.vertical}${RESET}`;\n writeLine(header);\n\n writeLine(` ${colors.purple}${box.teeRight}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.teeLeft}${RESET}`);\n\n for (const squadName of squads) {\n const agents = listAgents(squadsDir, squadName);\n const lead = agents.find(a => a.name.includes('lead'))?.name || agents[0]?.name || '-';\n\n const row = ` ${colors.purple}${box.vertical}${RESET} ` +\n `${colors.cyan}${padEnd(squadName, w.name)}${RESET}` +\n `${padEnd(String(agents.length), w.agents)}` +\n `${colors.dim}${padEnd(lead, w.lead)}${RESET}` +\n `${colors.purple}${box.vertical}${RESET}`;\n\n writeLine(row);\n }\n\n writeLine(` ${colors.purple}${box.bottomLeft}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.bottomRight}${RESET}`);\n writeLine();\n }\n\n if (!options.squads && options.agents) {\n // Show agents list\n writeLine(` ${bold}Agents${RESET}`);\n writeLine();\n\n for (const agent of allAgents) {\n const squadPart = agent.squad ? `${colors.dim}${agent.squad}/${RESET}` : '';\n const statusIcon = agent.status?.toLowerCase() === 'active' ? icons.active : icons.pending;\n\n writeLine(` ${statusIcon} ${squadPart}${colors.white}${agent.name}${RESET}`);\n if (agent.role) {\n writeLine(` ${colors.dim}└ ${agent.role}${RESET}`);\n }\n }\n writeLine();\n }\n\n // Commands\n writeLine(` ${colors.dim}$${RESET} squads status ${colors.cyan}<squad>${RESET} ${colors.dim}Squad details${RESET}`);\n writeLine(` ${colors.dim}$${RESET} squads run ${colors.cyan}<squad>${RESET} ${colors.dim}Execute a squad${RESET}`);\n writeLine();\n}\n","import { existsSync, statSync } from 'fs';\nimport { join } from 'path';\nimport {\n findSquadsDir,\n loadSquad,\n listSquads,\n listAgents\n} from '../lib/squad-parser.js';\nimport { findMemoryDir, getSquadState } from '../lib/memory.js';\nimport {\n colors,\n bold,\n RESET,\n gradient,\n box,\n padEnd,\n icons,\n writeLine,\n} from '../lib/terminal.js';\n\ninterface StatusOptions {\n verbose?: boolean;\n}\n\nexport async function statusCommand(\n squadName?: string,\n options: StatusOptions = {}\n): Promise<void> {\n const squadsDir = findSquadsDir();\n\n if (!squadsDir) {\n writeLine(`${colors.red}No .agents/squads directory found${RESET}`);\n writeLine(`${colors.dim}Run \\`squads init\\` to create one.${RESET}`);\n process.exit(1);\n }\n\n if (squadName) {\n await showSquadStatus(squadName, squadsDir, options);\n } else {\n await showOverallStatus(squadsDir, options);\n }\n}\n\nasync function showOverallStatus(\n squadsDir: string,\n _options: StatusOptions\n): Promise<void> {\n const squads = listSquads(squadsDir);\n const memoryDir = findMemoryDir();\n\n writeLine();\n writeLine(` ${gradient('squads')} ${colors.dim}status${RESET}`);\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} 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} 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 {\n findMemoryDir,\n searchMemory,\n getSquadState,\n appendToMemory,\n listMemoryEntries\n} from '../lib/memory.js';\nimport {\n colors,\n bold,\n RESET,\n gradient,\n box,\n padEnd,\n truncate,\n icons,\n writeLine,\n} from '../lib/terminal.js';\n\nconst SQUADS_BRIDGE_URL = process.env.SQUADS_BRIDGE_URL || 'http://localhost:8088';\n\ninterface MemoryOptions {\n squad?: string;\n agent?: string;\n type?: string;\n}\n\nexport async function memoryQueryCommand(\n query: string,\n options: MemoryOptions\n): Promise<void> {\n const memoryDir = findMemoryDir();\n\n if (!memoryDir) {\n writeLine(` ${colors.red}No .agents/memory directory found${RESET}`);\n writeLine(` ${colors.dim}Run \\`squads init\\` to create one.${RESET}`);\n process.exit(1);\n }\n\n writeLine();\n writeLine(` ${gradient('squads')} ${colors.dim}memory query${RESET} \"${colors.cyan}${query}${RESET}\"`);\n writeLine();\n\n const results = searchMemory(query, memoryDir);\n\n if (results.length === 0) {\n writeLine(` ${colors.yellow}No results found.${RESET}`);\n writeLine();\n return;\n }\n\n // Filter by squad/agent if specified\n let filtered = results;\n if (options.squad) {\n filtered = filtered.filter(r => r.entry.squad === options.squad);\n }\n if (options.agent) {\n filtered = filtered.filter(r => r.entry.agent === options.agent);\n }\n\n writeLine(` ${colors.green}${filtered.length}${RESET} results found`);\n writeLine();\n\n // Table\n const w = { location: 28, type: 10, score: 8 };\n const tableWidth = w.location + w.type + w.score + 4;\n\n writeLine(` ${colors.purple}${box.topLeft}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.topRight}${RESET}`);\n\n const header = ` ${colors.purple}${box.vertical}${RESET} ` +\n `${bold}${padEnd('LOCATION', w.location)}${RESET}` +\n `${bold}${padEnd('TYPE', w.type)}${RESET}` +\n `${bold}SCORE${RESET}` +\n ` ${colors.purple}${box.vertical}${RESET}`;\n writeLine(header);\n\n writeLine(` ${colors.purple}${box.teeRight}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.teeLeft}${RESET}`);\n\n for (const result of filtered.slice(0, 8)) {\n const { entry, score } = result;\n const location = `${entry.squad}/${entry.agent}`;\n const scoreColor = score > 5 ? colors.green : score > 2 ? colors.yellow : colors.dim;\n\n const row = ` ${colors.purple}${box.vertical}${RESET} ` +\n `${colors.cyan}${padEnd(location, w.location)}${RESET}` +\n `${colors.dim}${padEnd(entry.type, w.type)}${RESET}` +\n `${scoreColor}${padEnd(score.toFixed(1), w.score)}${RESET}` +\n `${colors.purple}${box.vertical}${RESET}`;\n\n writeLine(row);\n }\n\n writeLine(` ${colors.purple}${box.bottomLeft}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.bottomRight}${RESET}`);\n writeLine();\n\n // Show matches\n writeLine(` ${bold}Matches${RESET}`);\n writeLine();\n\n for (const result of filtered.slice(0, 5)) {\n const { entry, matches } = result;\n\n for (const match of matches.slice(0, 2)) {\n const highlighted = match.replace(\n new RegExp(query, 'gi'),\n (m) => `${colors.yellow}${m}${RESET}`\n );\n writeLine(` ${icons.empty} ${truncate(highlighted, 60)}`);\n writeLine(` ${colors.dim}└ ${entry.squad}/${entry.agent}${RESET}`);\n }\n }\n\n if (filtered.length > 5) {\n writeLine(` ${colors.dim} +${filtered.length - 5} more results${RESET}`);\n }\n writeLine();\n\n // Commands\n writeLine(` ${colors.dim}$${RESET} squads memory show ${colors.cyan}<squad>${RESET} ${colors.dim}View full memory${RESET}`);\n writeLine();\n}\n\nexport async function memoryShowCommand(\n squadName: string,\n _options: MemoryOptions\n): Promise<void> {\n const memoryDir = findMemoryDir();\n\n if (!memoryDir) {\n writeLine(` ${colors.red}No .agents/memory directory found${RESET}`);\n process.exit(1);\n }\n\n const states = getSquadState(squadName);\n\n if (states.length === 0) {\n writeLine(` ${colors.yellow}No memory found for squad: ${squadName}${RESET}`);\n return;\n }\n\n writeLine();\n writeLine(` ${gradient('squads')} ${colors.dim}memory${RESET} ${colors.cyan}${squadName}${RESET}`);\n writeLine();\n\n writeLine(` ${colors.dim}${states.length} entries${RESET}`);\n writeLine();\n\n for (const state of states) {\n writeLine(` ${icons.progress} ${colors.white}${state.agent}${RESET} ${colors.dim}(${state.type || 'state'})${RESET}`);\n writeLine(` ${colors.dim}${box.horizontal.repeat(40)}${RESET}`);\n\n // Show preview\n const lines = state.content.split('\\n').slice(0, 12);\n for (const line of lines) {\n writeLine(` ${colors.dim}${truncate(line, 70)}${RESET}`);\n }\n\n if (state.content.split('\\n').length > 12) {\n writeLine(` ${colors.dim}... (more content)${RESET}`);\n }\n writeLine();\n }\n\n // Commands\n writeLine(` ${colors.dim}$${RESET} squads memory query ${colors.cyan}\"<term>\"${RESET} ${colors.dim}Search memory${RESET}`);\n writeLine();\n}\n\nexport async function memoryUpdateCommand(\n squadName: string,\n content: string,\n options: MemoryOptions\n): Promise<void> {\n const agentName = options.agent || `${squadName}-lead`;\n const type = (options.type || 'learnings') as 'state' | 'output' | 'learnings' | 'feedback';\n\n writeLine();\n\n try {\n appendToMemory(squadName, agentName, type, content);\n writeLine(` ${icons.success} Updated ${colors.cyan}${type}${RESET} for ${colors.white}${squadName}/${agentName}${RESET}`);\n } catch (error) {\n writeLine(` ${icons.error} ${colors.red}Failed to update memory: ${error}${RESET}`);\n process.exit(1);\n }\n\n writeLine();\n}\n\nexport async function memoryListCommand(): Promise<void> {\n const memoryDir = findMemoryDir();\n\n if (!memoryDir) {\n writeLine(` ${colors.red}No .agents/memory directory found${RESET}`);\n process.exit(1);\n }\n\n const entries = listMemoryEntries(memoryDir);\n\n // Group by squad\n const bySquad: Record<string, typeof entries> = {};\n for (const entry of entries) {\n if (!bySquad[entry.squad]) {\n bySquad[entry.squad] = [];\n }\n bySquad[entry.squad].push(entry);\n }\n\n writeLine();\n writeLine(` ${gradient('squads')} ${colors.dim}memory list${RESET}`);\n writeLine();\n\n const squadNames = Object.keys(bySquad);\n writeLine(` ${colors.cyan}${entries.length}${RESET} entries across ${squadNames.length} squads`);\n writeLine();\n\n // Table\n const w = { squad: 16, agents: 8, types: 28 };\n const tableWidth = w.squad + w.agents + w.types + 4;\n\n writeLine(` ${colors.purple}${box.topLeft}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.topRight}${RESET}`);\n\n const header = ` ${colors.purple}${box.vertical}${RESET} ` +\n `${bold}${padEnd('SQUAD', w.squad)}${RESET}` +\n `${bold}${padEnd('AGENTS', w.agents)}${RESET}` +\n `${bold}TYPES${RESET}` +\n ` ${colors.purple}${box.vertical}${RESET}`;\n writeLine(header);\n\n writeLine(` ${colors.purple}${box.teeRight}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.teeLeft}${RESET}`);\n\n for (const [squad, squadEntries] of Object.entries(bySquad)) {\n const agents = new Set(squadEntries.map(e => e.agent));\n const types = [...new Set(squadEntries.map(e => e.type))].join(', ');\n const typesDisplay = truncate(types, w.types - 2);\n\n const row = ` ${colors.purple}${box.vertical}${RESET} ` +\n `${colors.cyan}${padEnd(squad, w.squad)}${RESET}` +\n `${padEnd(String(agents.size), w.agents)}` +\n `${colors.dim}${padEnd(typesDisplay, w.types)}${RESET}` +\n `${colors.purple}${box.vertical}${RESET}`;\n\n writeLine(row);\n }\n\n writeLine(` ${colors.purple}${box.bottomLeft}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.bottomRight}${RESET}`);\n writeLine();\n\n // Commands\n writeLine(` ${colors.dim}$${RESET} squads memory show ${colors.cyan}<squad>${RESET} ${colors.dim}View squad memory${RESET}`);\n writeLine(` ${colors.dim}$${RESET} squads memory query ${colors.cyan}\"<term>\"${RESET} ${colors.dim}Search all memory${RESET}`);\n writeLine();\n}\n\ninterface ConversationResult {\n id: number;\n session_id: string;\n role: string;\n content: string;\n type: string; // message_type in the API response\n importance: string;\n created_at: string;\n rank: number;\n}\n\nexport async function memorySearchCommand(\n query: string,\n options: { limit?: number; role?: string; importance?: string } = {}\n): Promise<void> {\n writeLine();\n writeLine(` ${gradient('squads')} ${colors.dim}memory search${RESET} \"${colors.cyan}${query}${RESET}\"`);\n writeLine();\n\n const limit = options.limit || 10;\n const params = new URLSearchParams({ q: query, limit: String(limit) });\n\n if (options.role) {\n params.append('role', options.role);\n }\n if (options.importance) {\n params.append('importance', options.importance);\n }\n\n try {\n const response = await fetch(`${SQUADS_BRIDGE_URL}/api/conversations/search?${params}`);\n\n if (!response.ok) {\n if (response.status === 503) {\n writeLine(` ${colors.yellow}Database not available${RESET}`);\n writeLine(` ${colors.dim}Run: docker compose up -d${RESET}`);\n writeLine();\n return;\n }\n throw new Error(`HTTP ${response.status}`);\n }\n\n const data = await response.json() as { results: ConversationResult[]; count: number };\n const conversations = data.results;\n const total = data.count;\n\n if (conversations.length === 0) {\n writeLine(` ${colors.yellow}No conversations found for \"${query}\"${RESET}`);\n writeLine();\n writeLine(` ${colors.dim}Conversations are captured via hooks. Make sure:${RESET}`);\n writeLine(` ${colors.dim} 1. squads-bridge is running (docker compose up)${RESET}`);\n writeLine(` ${colors.dim} 2. engram hook is configured in Claude settings${RESET}`);\n writeLine();\n return;\n }\n\n writeLine(` ${colors.green}${conversations.length}${RESET} of ${total} results`);\n writeLine();\n\n // Table\n const w = { time: 12, role: 10, type: 10, content: 50 };\n const tableWidth = w.time + w.role + w.type + w.content + 6;\n\n writeLine(` ${colors.purple}${box.topLeft}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.topRight}${RESET}`);\n\n const header = ` ${colors.purple}${box.vertical}${RESET} ` +\n `${bold}${padEnd('TIME', w.time)}${RESET}` +\n `${bold}${padEnd('ROLE', w.role)}${RESET}` +\n `${bold}${padEnd('TYPE', w.type)}${RESET}` +\n `${bold}${padEnd('CONTENT', w.content)}${RESET}` +\n ` ${colors.purple}${box.vertical}${RESET}`;\n writeLine(header);\n\n writeLine(` ${colors.purple}${box.teeRight}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.teeLeft}${RESET}`);\n\n for (const conv of conversations) {\n const time = new Date(conv.created_at).toLocaleTimeString('en-US', { hour: '2-digit', minute: '2-digit' });\n const roleColor = conv.role === 'user' ? colors.cyan : conv.role === 'thinking' ? colors.yellow : colors.green;\n const importanceIcon = conv.importance === 'high' ? icons.success : '';\n\n // Highlight search term in content\n const contentPreview = truncate((conv.content || '').replace(/\\n/g, ' '), w.content - 2);\n const highlighted = contentPreview.replace(\n new RegExp(query, 'gi'),\n (m) => `${colors.yellow}${m}${RESET}${colors.dim}`\n );\n\n const row = ` ${colors.purple}${box.vertical}${RESET} ` +\n `${colors.dim}${padEnd(time, w.time)}${RESET}` +\n `${roleColor}${padEnd(conv.role || '', w.role)}${RESET}` +\n `${colors.dim}${padEnd(conv.type || 'message', w.type)}${RESET}` +\n `${colors.dim}${padEnd(highlighted + importanceIcon, w.content)}${RESET}` +\n ` ${colors.purple}${box.vertical}${RESET}`;\n\n writeLine(row);\n }\n\n writeLine(` ${colors.purple}${box.bottomLeft}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.bottomRight}${RESET}`);\n writeLine();\n\n // Expanded view of top results\n writeLine(` ${bold}Top Matches${RESET}`);\n writeLine();\n\n for (const conv of conversations.slice(0, 3)) {\n const time = new Date(conv.created_at).toLocaleString('en-US', {\n month: 'short', day: 'numeric', hour: '2-digit', minute: '2-digit'\n });\n const roleIcon = conv.role === 'user' ? '👤' : conv.role === 'thinking' ? '💭' : '🤖';\n\n writeLine(` ${roleIcon} ${colors.dim}${time}${RESET} ${conv.importance === 'high' ? colors.yellow + '[high]' + RESET : ''}`);\n\n // Show first 200 chars with highlighted search term\n const content = conv.content || '';\n const preview = content.substring(0, 200).replace(/\\n/g, ' ');\n const highlighted = preview.replace(\n new RegExp(query, 'gi'),\n (m) => `${colors.yellow}${m}${RESET}`\n );\n writeLine(` ${highlighted}${content.length > 200 ? '...' : ''}`);\n writeLine();\n }\n\n // Commands\n writeLine(` ${colors.dim}$${RESET} squads memory search ${colors.cyan}\"<term>\"${RESET} --role user ${colors.dim}Filter by role${RESET}`);\n writeLine(` ${colors.dim}$${RESET} squads memory search ${colors.cyan}\"<term>\"${RESET} --importance high ${colors.dim}Filter by importance${RESET}`);\n writeLine();\n\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n if (errorMessage.includes('ECONNREFUSED')) {\n writeLine(` ${colors.yellow}Cannot connect to squads-bridge${RESET}`);\n writeLine(` ${colors.dim}Run: docker compose up -d${RESET}`);\n } else {\n writeLine(` ${colors.red}Error searching conversations: ${errorMessage}${RESET}`);\n }\n writeLine();\n }\n}\n","import { execSync } from 'child_process';\nimport { existsSync, readFileSync, writeFileSync, mkdirSync, readdirSync } from 'fs';\nimport { join, dirname } from 'path';\nimport { findMemoryDir } from '../lib/memory.js';\nimport { findSquadsDir, listSquads } from '../lib/squad-parser.js';\nimport {\n colors,\n bold,\n RESET,\n gradient,\n icons,\n writeLine,\n} from '../lib/terminal.js';\n\ninterface CommitInfo {\n hash: string;\n date: string;\n message: string;\n files: string[];\n}\n\ninterface SquadUpdate {\n squad: string;\n commits: CommitInfo[];\n summary: string;\n}\n\n// Map file paths to squads\nconst PATH_TO_SQUAD: Record<string, string> = {\n 'squads-cli': 'product',\n 'agents-squads-web': 'website',\n 'research': 'research',\n 'intelligence': 'intelligence',\n 'customer': 'customer',\n 'finance': 'finance',\n 'engineering': 'engineering',\n 'product': 'product',\n 'company': 'company',\n '.agents/squads': 'engineering',\n '.agents/memory': 'engineering',\n};\n\n// Keywords in commit messages that map to squads\nconst MESSAGE_TO_SQUAD: Record<string, string> = {\n 'cli': 'product',\n 'website': 'website',\n 'web': 'website',\n 'homepage': 'website',\n 'research': 'research',\n 'intel': 'intelligence',\n 'lead': 'customer',\n 'finance': 'finance',\n 'cost': 'finance',\n 'engineering': 'engineering',\n 'infra': 'engineering',\n};\n\nfunction getLastSyncTime(memoryDir: string): string | null {\n const syncFile = join(memoryDir, '.last-sync');\n if (existsSync(syncFile)) {\n return readFileSync(syncFile, 'utf-8').trim();\n }\n return null;\n}\n\nfunction updateLastSyncTime(memoryDir: string): void {\n const syncFile = join(memoryDir, '.last-sync');\n writeFileSync(syncFile, new Date().toISOString());\n}\n\nfunction getRecentCommits(since?: string): CommitInfo[] {\n const commits: CommitInfo[] = [];\n\n try {\n // Get commits with files changed\n const sinceArg = since ? `--since=\"${since}\"` : '-n 20';\n const logOutput = execSync(\n `git log ${sinceArg} --format=\"%H|%aI|%s\" --name-only`,\n { encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] }\n ).trim();\n\n if (!logOutput) return commits;\n\n // Parse git log output\n const entries = logOutput.split('\\n\\n');\n for (const entry of entries) {\n const lines = entry.split('\\n').filter(l => l.trim());\n if (lines.length === 0) continue;\n\n const [header, ...fileLines] = lines;\n const [hash, date, ...messageParts] = header.split('|');\n const message = messageParts.join('|');\n\n if (hash && date && message) {\n commits.push({\n hash: hash.substring(0, 7),\n date: date.split('T')[0],\n message,\n files: fileLines.filter(f => f && !f.includes('|')),\n });\n }\n }\n } catch (error) {\n // Not in a git repo or other error\n }\n\n return commits;\n}\n\nfunction detectSquadsFromCommit(commit: CommitInfo): string[] {\n const squads = new Set<string>();\n\n // Check file paths\n for (const file of commit.files) {\n for (const [pathPattern, squad] of Object.entries(PATH_TO_SQUAD)) {\n if (file.includes(pathPattern)) {\n squads.add(squad);\n }\n }\n }\n\n // Check commit message\n const msgLower = commit.message.toLowerCase();\n for (const [keyword, squad] of Object.entries(MESSAGE_TO_SQUAD)) {\n if (msgLower.includes(keyword)) {\n squads.add(squad);\n }\n }\n\n return Array.from(squads);\n}\n\nfunction groupCommitsBySquad(commits: CommitInfo[]): Map<string, CommitInfo[]> {\n const grouped = new Map<string, CommitInfo[]>();\n\n for (const commit of commits) {\n const squads = detectSquadsFromCommit(commit);\n\n for (const squad of squads) {\n if (!grouped.has(squad)) {\n grouped.set(squad, []);\n }\n grouped.get(squad)!.push(commit);\n }\n }\n\n return grouped;\n}\n\nfunction generateSummary(commits: CommitInfo[]): string {\n if (commits.length === 0) return '';\n\n const messages = commits.map(c => `- ${c.message}`).join('\\n');\n const date = new Date().toISOString().split('T')[0];\n\n return `\n## Session Update (${date})\n\n${messages}\n`;\n}\n\nfunction appendToSquadMemory(\n memoryDir: string,\n squad: string,\n summary: string\n): boolean {\n // Find the lead agent for this squad\n const squadMemoryDir = join(memoryDir, squad);\n\n if (!existsSync(squadMemoryDir)) {\n mkdirSync(squadMemoryDir, { recursive: true });\n }\n\n // Look for existing agent directories or create default\n let agentDir: string;\n const existingDirs = existsSync(squadMemoryDir)\n ? readdirSync(squadMemoryDir, { withFileTypes: true })\n .filter((d) => d.isDirectory())\n .map((d) => d.name)\n : [];\n\n if (existingDirs.length > 0) {\n // Use first existing agent (usually the lead)\n agentDir = join(squadMemoryDir, existingDirs[0]);\n } else {\n // Create default agent directory\n agentDir = join(squadMemoryDir, `${squad}-lead`);\n mkdirSync(agentDir, { recursive: true });\n }\n\n const statePath = join(agentDir, 'state.md');\n\n let content = '';\n if (existsSync(statePath)) {\n content = readFileSync(statePath, 'utf-8');\n } else {\n content = `# ${squad} Squad - State\\n\\nUpdated: ${new Date().toISOString().split('T')[0]}\\n`;\n }\n\n // Update the \"Updated\" line\n content = content.replace(\n /Updated:\\s*\\d{4}-\\d{2}-\\d{2}/,\n `Updated: ${new Date().toISOString().split('T')[0]}`\n );\n\n // Append the summary\n content += summary;\n\n writeFileSync(statePath, content);\n return true;\n}\n\nexport async function syncCommand(options: { verbose?: boolean } = {}): Promise<void> {\n const memoryDir = findMemoryDir();\n const squadsDir = findSquadsDir();\n\n if (!memoryDir) {\n writeLine(` ${colors.yellow}No .agents/memory directory found${RESET}`);\n writeLine(` ${colors.dim}Run \\`squads init\\` to create one.${RESET}`);\n return; // Graceful exit - don't fail hooks\n }\n\n writeLine();\n writeLine(` ${gradient('squads')} ${colors.dim}memory sync${RESET}`);\n writeLine();\n\n // 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 // 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 writeLine();\n}\n","import {\n loadSquad,\n findSquadsDir,\n listSquads,\n addGoalToSquad,\n updateGoalInSquad,\n Goal\n} from '../lib/squad-parser.js';\nimport {\n colors,\n bold,\n RESET,\n gradient,\n box,\n padEnd,\n truncate,\n icons,\n writeLine,\n} from '../lib/terminal.js';\n\nexport async function goalSetCommand(\n squadName: string,\n description: string,\n options: { metric?: string[] }\n): Promise<void> {\n const squad = loadSquad(squadName);\n if (!squad) {\n writeLine(` ${colors.red}Squad \"${squadName}\" not found${RESET}`);\n return;\n }\n\n // Add metric annotations if provided\n let goalText = description;\n if (options.metric && options.metric.length > 0) {\n goalText += ` [metrics: ${options.metric.join(', ')}]`;\n }\n\n const success = addGoalToSquad(squadName, goalText);\n\n writeLine();\n if (success) {\n writeLine(` ${icons.success} Goal added to ${colors.cyan}${squadName}${RESET}`);\n writeLine(` ${bold}${description}${RESET}`);\n if (options.metric && options.metric.length > 0) {\n writeLine(` ${colors.dim}Metrics: ${options.metric.join(', ')}${RESET}`);\n }\n } else {\n writeLine(` ${colors.red}Failed to add goal${RESET}`);\n }\n writeLine();\n}\n\nexport async function goalListCommand(\n squadName?: string,\n options: { all?: boolean } = {}\n): Promise<void> {\n const squadsDir = findSquadsDir();\n if (!squadsDir) {\n writeLine(` ${colors.red}No .agents/squads directory found${RESET}`);\n return;\n }\n\n const squadsToCheck = squadName ? [squadName] : listSquads(squadsDir);\n\n let totalActive = 0;\n let totalCompleted = 0;\n let hasGoals = false;\n\n writeLine();\n writeLine(` ${gradient('squads')} ${colors.dim}goal list${RESET}`);\n writeLine();\n\n for (const name of squadsToCheck) {\n const squad = loadSquad(name);\n if (!squad || squad.goals.length === 0) {\n if (squadName) {\n writeLine(` ${colors.yellow}No goals set for ${name}${RESET}`);\n }\n continue;\n }\n\n hasGoals = true;\n const activeGoals = squad.goals.filter(g => !g.completed);\n const completedGoals = squad.goals.filter(g => g.completed);\n\n totalActive += activeGoals.length;\n totalCompleted += completedGoals.length;\n\n if (activeGoals.length === 0 && !options.all) continue;\n\n writeLine(` ${colors.cyan}${name}${RESET}`);\n if (squad.mission) {\n writeLine(` ${colors.dim}${truncate(squad.mission, 60)}${RESET}`);\n }\n writeLine();\n\n for (const goal of activeGoals) {\n const globalIdx = squad.goals.indexOf(goal) + 1;\n writeLine(` ${icons.active} ${colors.dim}[${globalIdx}]${RESET} ${goal.description}`);\n if (goal.progress) {\n writeLine(` ${colors.dim}└ ${goal.progress}${RESET}`);\n }\n }\n\n if (options.all && completedGoals.length > 0) {\n for (const goal of completedGoals) {\n const globalIdx = squad.goals.indexOf(goal) + 1;\n writeLine(` ${icons.success} ${colors.dim}[${globalIdx}] ${goal.description}${RESET}`);\n }\n }\n writeLine();\n }\n\n if (hasGoals) {\n writeLine(` ${colors.green}${totalActive}${RESET} active ${colors.dim}│${RESET} ${colors.dim}${totalCompleted} completed${RESET}`);\n } else if (!squadName) {\n writeLine(` ${colors.yellow}No goals defined yet${RESET}`);\n writeLine();\n writeLine(` ${colors.dim}$${RESET} squads goal set ${colors.cyan}<squad>${RESET} ${colors.cyan}\"<goal>\"${RESET}`);\n }\n writeLine();\n}\n\nexport async function goalCompleteCommand(\n squadName: string,\n goalIndex: string\n): Promise<void> {\n const squad = loadSquad(squadName);\n if (!squad) {\n writeLine(` ${colors.red}Squad \"${squadName}\" not found${RESET}`);\n return;\n }\n\n const idx = parseInt(goalIndex) - 1;\n if (idx < 0 || idx >= squad.goals.length) {\n writeLine(` ${colors.red}Invalid goal index: ${goalIndex}${RESET}`);\n writeLine(` ${colors.dim}Squad has ${squad.goals.length} goal(s)${RESET}`);\n return;\n }\n\n const success = updateGoalInSquad(squadName, idx, { completed: true });\n\n writeLine();\n if (success) {\n writeLine(` ${icons.success} Goal completed: ${colors.cyan}${squad.goals[idx].description}${RESET}`);\n } else {\n writeLine(` ${colors.red}Failed to update goal${RESET}`);\n }\n writeLine();\n}\n\nexport async function goalProgressCommand(\n squadName: string,\n goalIndex: string,\n progress: string\n): Promise<void> {\n const squad = loadSquad(squadName);\n if (!squad) {\n writeLine(` ${colors.red}Squad \"${squadName}\" not found${RESET}`);\n return;\n }\n\n const idx = parseInt(goalIndex) - 1;\n if (idx < 0 || idx >= squad.goals.length) {\n writeLine(` ${colors.red}Invalid goal index: ${goalIndex}${RESET}`);\n return;\n }\n\n const success = updateGoalInSquad(squadName, idx, { progress });\n\n writeLine();\n if (success) {\n writeLine(` ${icons.success} Progress updated: ${colors.cyan}${squad.goals[idx].description}${RESET}`);\n writeLine(` ${colors.dim}${progress}${RESET}`);\n } else {\n writeLine(` ${colors.red}Failed to update progress${RESET}`);\n }\n writeLine();\n}\n","import { readFileSync, writeFileSync, existsSync, mkdirSync, readdirSync } from 'fs';\nimport { join, dirname } from 'path';\nimport { findMemoryDir, appendToMemory } from '../lib/memory.js';\nimport { loadSquad } from '../lib/squad-parser.js';\nimport {\n colors,\n bold,\n RESET,\n gradient,\n box,\n padEnd,\n icons,\n writeLine,\n} from '../lib/terminal.js';\n\nexport interface FeedbackEntry {\n date: string;\n execution: string;\n rating: number; // 1-5\n feedback: string;\n learnings?: string[];\n}\n\nfunction getFeedbackPath(squadName: string): string | null {\n const memoryDir = findMemoryDir();\n if (!memoryDir) return null;\n\n // Find the lead agent for this squad\n const squad = loadSquad(squadName);\n const agentName = squad?.agents[0]?.name || `${squadName}-lead`;\n\n return join(memoryDir, squadName, agentName, 'feedback.md');\n}\n\nfunction getOutputPath(squadName: string): string | null {\n const memoryDir = findMemoryDir();\n if (!memoryDir) return null;\n\n const squad = loadSquad(squadName);\n const agentName = squad?.agents[0]?.name || `${squadName}-lead`;\n\n return join(memoryDir, squadName, agentName, 'output.md');\n}\n\nfunction getLastExecution(squadName: string): { date: string; summary: string } | null {\n const outputPath = getOutputPath(squadName);\n if (!outputPath || !existsSync(outputPath)) {\n return null;\n }\n\n const content = readFileSync(outputPath, 'utf-8');\n const lines = content.split('\\n');\n\n // Try to extract date from content\n let date = 'unknown';\n let summary = lines.slice(0, 5).join('\\n');\n\n // Look for date patterns\n const dateMatch = content.match(/(\\d{4}-\\d{2}-\\d{2})/);\n if (dateMatch) {\n date = dateMatch[1];\n }\n\n // Look for title\n const titleMatch = content.match(/^#\\s+(.+)$/m);\n if (titleMatch) {\n summary = titleMatch[1];\n }\n\n return { date, summary };\n}\n\nfunction parseFeedbackHistory(content: string): FeedbackEntry[] {\n const entries: FeedbackEntry[] = [];\n const sections = content.split(/---\\n/).filter(s => s.trim());\n\n for (const section of sections) {\n const dateMatch = section.match(/_Date:\\s*(.+)_/);\n const ratingMatch = section.match(/\\*\\*Rating\\*\\*:\\s*(\\d)\\/5/);\n const feedbackMatch = section.match(/\\*\\*Feedback\\*\\*:\\s*(.+)/);\n const executionMatch = section.match(/\\*\\*Execution\\*\\*:\\s*(.+)/);\n\n if (dateMatch && ratingMatch) {\n const entry: FeedbackEntry = {\n date: dateMatch[1],\n execution: executionMatch?.[1] || 'unknown',\n rating: parseInt(ratingMatch[1]),\n feedback: feedbackMatch?.[1] || '',\n learnings: [],\n };\n\n // Extract learnings\n const learningsMatch = section.match(/\\*\\*Learnings\\*\\*:\\n((?:- .+\\n?)+)/);\n if (learningsMatch) {\n entry.learnings = learningsMatch[1]\n .split('\\n')\n .filter(l => l.startsWith('- '))\n .map(l => l.replace(/^- /, ''));\n }\n\n entries.push(entry);\n }\n }\n\n return entries;\n}\n\nexport async function feedbackAddCommand(\n squadName: string,\n rating: string,\n feedback: string,\n options: { learning?: string[] }\n): Promise<void> {\n const feedbackPath = getFeedbackPath(squadName);\n if (!feedbackPath) {\n writeLine(` ${colors.red}Could not find memory directory${RESET}`);\n return;\n }\n\n const ratingNum = parseInt(rating);\n if (isNaN(ratingNum) || ratingNum < 1 || ratingNum > 5) {\n writeLine(` ${colors.red}Rating must be 1-5${RESET}`);\n return;\n }\n\n // Get last execution for context\n const lastExec = getLastExecution(squadName);\n\n // Ensure directory exists\n const dir = dirname(feedbackPath);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n\n // Build feedback entry\n const date = new Date().toISOString().split('T')[0];\n let entry = `\\n---\\n_Date: ${date}_\\n\\n`;\n entry += `**Execution**: ${lastExec?.summary || 'Manual feedback'}\\n`;\n entry += `**Rating**: ${ratingNum}/5 ${'★'.repeat(ratingNum)}${'☆'.repeat(5 - ratingNum)}\\n`;\n entry += `**Feedback**: ${feedback}\\n`;\n\n if (options.learning && options.learning.length > 0) {\n entry += `**Learnings**:\\n`;\n for (const learning of options.learning) {\n entry += `- ${learning}\\n`;\n }\n\n // Also add learnings to the learnings file\n const squad = loadSquad(squadName);\n const agentName = squad?.agents[0]?.name || `${squadName}-lead`;\n\n for (const learning of options.learning) {\n appendToMemory(squadName, agentName, 'learnings', `From feedback (${date}): ${learning}`);\n }\n }\n\n // Append to feedback file\n let existing = '';\n if (existsSync(feedbackPath)) {\n existing = readFileSync(feedbackPath, 'utf-8');\n } else {\n existing = `# ${squadName} - Feedback Log\\n\\n> Execution feedback and learnings\\n`;\n }\n\n writeFileSync(feedbackPath, existing + entry);\n\n // Display\n const stars = `${colors.yellow}${'★'.repeat(ratingNum)}${'☆'.repeat(5 - ratingNum)}${RESET}`;\n\n writeLine();\n writeLine(` ${icons.success} Feedback recorded for ${colors.cyan}${squadName}${RESET}`);\n writeLine(` Rating: ${stars}`);\n writeLine(` ${feedback}`);\n if (options.learning && options.learning.length > 0) {\n writeLine(` ${colors.dim}+ ${options.learning.length} learning(s) added${RESET}`);\n }\n writeLine();\n}\n\nexport async function feedbackShowCommand(\n squadName: string,\n options: { limit?: string }\n): Promise<void> {\n const feedbackPath = getFeedbackPath(squadName);\n if (!feedbackPath || !existsSync(feedbackPath)) {\n writeLine(` ${colors.yellow}No feedback recorded for ${squadName}${RESET}`);\n return;\n }\n\n const content = readFileSync(feedbackPath, 'utf-8');\n const entries = parseFeedbackHistory(content);\n\n const limit = options.limit ? parseInt(options.limit) : 5;\n const recent = entries.slice(-limit).reverse();\n\n writeLine();\n writeLine(` ${gradient('squads')} ${colors.dim}feedback${RESET} ${colors.cyan}${squadName}${RESET}`);\n writeLine();\n\n if (recent.length === 0) {\n writeLine(` ${colors.dim}No feedback entries yet${RESET}`);\n return;\n }\n\n // Calculate average rating\n const avgRating = entries.reduce((sum, e) => sum + e.rating, 0) / entries.length;\n\n writeLine(` ${colors.dim}Average: ${avgRating.toFixed(1)}/5 (${entries.length} entries)${RESET}`);\n writeLine();\n\n for (const entry of recent) {\n const stars = `${colors.yellow}${'★'.repeat(entry.rating)}${'☆'.repeat(5 - entry.rating)}${RESET}`;\n writeLine(` ${colors.dim}${entry.date}${RESET} ${stars}`);\n writeLine(` ${entry.feedback}`);\n if (entry.learnings && entry.learnings.length > 0) {\n for (const learning of entry.learnings) {\n writeLine(` ${colors.green}→ ${learning}${RESET}`);\n }\n }\n writeLine();\n }\n}\n\nexport async function feedbackStatsCommand(): Promise<void> {\n const memoryDir = findMemoryDir();\n if (!memoryDir) {\n writeLine(` ${colors.red}Could not find memory directory${RESET}`);\n return;\n }\n\n writeLine();\n writeLine(` ${gradient('squads')} ${colors.dim}feedback stats${RESET}`);\n writeLine();\n\n const squads = readdirSync(memoryDir, { withFileTypes: true })\n .filter(e => e.isDirectory())\n .map(e => e.name);\n\n // Table\n const w = { squad: 18, avg: 12, count: 8, trend: 6 };\n const tableWidth = w.squad + w.avg + w.count + w.trend + 4;\n\n writeLine(` ${colors.purple}${box.topLeft}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.topRight}${RESET}`);\n\n const header = ` ${colors.purple}${box.vertical}${RESET} ` +\n `${bold}${padEnd('SQUAD', w.squad)}${RESET}` +\n `${bold}${padEnd('AVG', w.avg)}${RESET}` +\n `${bold}${padEnd('COUNT', w.count)}${RESET}` +\n `${bold}TREND${RESET}` +\n ` ${colors.purple}${box.vertical}${RESET}`;\n writeLine(header);\n\n writeLine(` ${colors.purple}${box.teeRight}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.teeLeft}${RESET}`);\n\n for (const squad of squads) {\n const feedbackPath = getFeedbackPath(squad);\n if (!feedbackPath || !existsSync(feedbackPath)) {\n continue;\n }\n\n const content = readFileSync(feedbackPath, 'utf-8');\n const entries = parseFeedbackHistory(content);\n\n if (entries.length === 0) continue;\n\n const avgRating = entries.reduce((sum, e) => sum + e.rating, 0) / entries.length;\n\n // Calculate trend (last 3 vs previous)\n let trend = `${colors.dim}→${RESET}`;\n if (entries.length >= 4) {\n const recent = entries.slice(-3).reduce((s, e) => s + e.rating, 0) / 3;\n const older = entries.slice(-6, -3).reduce((s, e) => s + e.rating, 0) / Math.min(3, entries.slice(-6, -3).length);\n if (recent > older + 0.3) trend = `${colors.green}↑${RESET}`;\n else if (recent < older - 0.3) trend = `${colors.red}↓${RESET}`;\n }\n\n const stars = `${colors.yellow}${'★'.repeat(Math.round(avgRating))}${'☆'.repeat(5 - Math.round(avgRating))}${RESET}`;\n\n const row = ` ${colors.purple}${box.vertical}${RESET} ` +\n `${colors.cyan}${padEnd(squad, w.squad)}${RESET}` +\n `${padEnd(stars, w.avg + 20)}` + // extra for color codes\n `${padEnd(String(entries.length), w.count)}` +\n `${trend}` +\n ` ${colors.purple}${box.vertical}${RESET}`;\n\n writeLine(row);\n }\n\n writeLine(` ${colors.purple}${box.bottomLeft}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.bottomRight}${RESET}`);\n writeLine();\n\n // Commands\n writeLine(` ${colors.dim}$${RESET} squads feedback show ${colors.cyan}<squad>${RESET} ${colors.dim}View squad feedback${RESET}`);\n writeLine(` ${colors.dim}$${RESET} squads feedback add ${colors.cyan}<squad>${RESET} ${colors.dim}Add new feedback${RESET}`);\n writeLine();\n}\n","import { readdirSync, readFileSync, existsSync, statSync } from 'fs';\nimport { join } from 'path';\nimport { homedir } from 'os';\nimport { findSquadsDir, listSquads, loadSquad, Goal } from '../lib/squad-parser.js';\nimport { findMemoryDir } from '../lib/memory.js';\nimport { fetchCostSummary, formatCostBar, CostSummary, fetchRateLimits, RateLimits, fetchInsights, Insights } from '../lib/costs.js';\nimport { getMultiRepoGitStats, getActivitySparkline, getGitHubStats, SquadGitHubStats, GitPerformanceStats, GitHubStats } from '../lib/git.js';\nimport { saveDashboardSnapshot, isDatabaseAvailable, getDashboardHistory, DashboardSnapshot, SquadSnapshotData } from '../lib/db.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\nexport async function dashboardCommand(options: { verbose?: boolean; ceo?: boolean } = {}): Promise<void> {\n const squadsDir = findSquadsDir();\n if (!squadsDir) {\n writeLine(`${colors.red}No .agents/squads directory found${RESET}`);\n return;\n }\n\n // CEO mode: executive summary\n if (options.ceo) {\n await renderCeoReport(squadsDir);\n return;\n }\n\n const squadNames = listSquads(squadsDir);\n const squadData: SquadMetrics[] = [];\n\n // Fetch GitHub stats\n const baseDir = findAgentsSquadsDir();\n const ghStats = baseDir ? getGitHubStats(baseDir, 30) : null;\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 // Calculate goal progress based on work done\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 // Progress = completed + half credit for in-progress\n const goalProgress = totalGoals > 0\n ? Math.round(((completedGoals + hasProgress * 0.3) / totalGoals) * 100)\n : 0;\n\n squadData.push({\n name,\n mission: squad.mission,\n goals: squad.goals,\n lastActivity,\n status,\n github,\n goalProgress,\n });\n }\n\n // Stats\n const totalGoals = squadData.reduce((sum, s) => sum + s.goals.length, 0);\n const activeGoals = squadData.reduce((sum, s) => sum + s.goals.filter(g => !g.completed).length, 0);\n const completedGoals = totalGoals - activeGoals;\n const completionRate = totalGoals > 0 ? Math.round((completedGoals / totalGoals) * 100) : 0;\n const activeSquads = squadData.filter(s => s.status === 'active').length;\n\n // GitHub totals\n const totalPRs = ghStats ? ghStats.prsMerged : 0;\n const totalIssuesClosed = ghStats ? ghStats.issuesClosed : 0;\n const totalIssuesOpen = ghStats ? ghStats.issuesOpen : 0;\n\n // Render\n writeLine();\n\n // Header\n writeLine(` ${gradient('squads')} ${colors.dim}dashboard${RESET}`);\n writeLine();\n\n // Stats row\n const stats = [\n `${colors.cyan}${activeSquads}${RESET}/${squadData.length} squads`,\n `${colors.green}${totalPRs}${RESET} PRs merged`,\n `${colors.purple}${totalIssuesClosed}${RESET} closed`,\n `${colors.yellow}${totalIssuesOpen}${RESET} open`,\n ].join(` ${colors.dim}│${RESET} `);\n writeLine(` ${stats}`);\n writeLine();\n\n // Overall progress\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 // Table header - enhanced with metrics\n const w = { name: 13, commits: 7, prs: 4, issues: 6, goals: 6, bar: 10 };\n const tableWidth = w.name + w.commits + w.prs + w.issues + w.goals + w.bar + 12;\n\n writeLine(` ${colors.purple}${box.topLeft}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.topRight}${RESET}`);\n\n const header = ` ${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(header);\n\n writeLine(` ${colors.purple}${box.teeRight}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.teeLeft}${RESET}`);\n\n // Table rows - sorted by activity\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\n const activeCount = squad.goals.filter(g => !g.completed).length;\n const totalCount = squad.goals.length;\n\n // Color coding based on activity\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 // Issues display: closed/open\n const issuesDisplay = `${issuesClosed}/${issuesOpen}`;\n\n const row = ` ${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(issuesDisplay, w.issues)}${RESET}` +\n `${padEnd(`${activeCount}/${totalCount}`, w.goals)}` +\n `${progressBar(squad.goalProgress, 8)}` +\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 // Git Performance\n await renderGitPerformance();\n\n // Token Economics\n await renderTokenEconomics(squadData.map(s => s.name));\n\n // Historical Trends (if database available)\n await renderHistoricalTrends();\n\n // Agent Insights (task completion, quality, tools)\n await renderInsights();\n\n // Active goals (compact)\n const allActiveGoals = squadData.flatMap(s =>\n s.goals.filter(g => !g.completed).map(g => ({ squad: s.name, goal: g }))\n );\n\n if (allActiveGoals.length > 0) {\n writeLine(` ${bold}Goals${RESET}`);\n writeLine();\n\n const maxGoals = 6;\n for (const { squad, goal } of allActiveGoals.slice(0, maxGoals)) {\n const hasProgress = goal.progress && goal.progress.length > 0;\n const icon = hasProgress ? icons.progress : icons.empty;\n const squadLabel = `${colors.dim}${squad}${RESET}`;\n const goalText = truncate(goal.description, 48);\n\n writeLine(` ${icon} ${squadLabel} ${goalText}`);\n\n if (hasProgress) {\n const progressText = truncate(goal.progress!, 52);\n writeLine(` ${colors.dim}└${RESET} ${colors.green}${progressText}${RESET}`);\n }\n }\n\n if (allActiveGoals.length > maxGoals) {\n writeLine(` ${colors.dim} +${allActiveGoals.length - maxGoals} more${RESET}`);\n }\n writeLine();\n }\n\n // Quick actions\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 to local postgres (silent on failure)\n await saveSnapshot(squadData, ghStats, baseDir);\n}\n\n/**\n * Save dashboard snapshot to local PostgreSQL for historical tracking\n */\nasync function saveSnapshot(\n squadData: SquadMetrics[],\n ghStats: GitHubStats | null,\n baseDir: string | null\n): Promise<void> {\n // Check if database is available\n const dbAvailable = await isDatabaseAvailable();\n if (!dbAvailable) return;\n\n // Fetch additional data for snapshot\n const gitStats = baseDir ? getMultiRepoGitStats(baseDir, 30) : null;\n const costs = await fetchCostSummary(100);\n\n // Build squad snapshot data\n const squadsData: SquadSnapshotData[] = squadData.map(s => ({\n name: s.name,\n commits: s.github?.commits || 0,\n prsOpened: s.github?.prsOpened || 0,\n prsMerged: s.github?.prsMerged || 0,\n issuesClosed: s.github?.issuesClosed || 0,\n issuesOpen: s.github?.issuesOpen || 0,\n goalsActive: s.goals.filter(g => !g.completed).length,\n goalsTotal: s.goals.length,\n progress: s.goalProgress,\n }));\n\n // Build authors data\n const authorsData = gitStats\n ? Array.from(gitStats.commitsByAuthor.entries())\n .sort((a, b) => b[1] - a[1])\n .slice(0, 10)\n .map(([name, commits]) => ({ name, commits }))\n : [];\n\n // Build repos data\n const reposData = gitStats\n ? Array.from(gitStats.commitsByRepo.entries())\n .sort((a, b) => b[1] - a[1])\n .map(([name, commits]) => ({ name, commits }))\n : [];\n\n // Calculate totals\n const totalInputTokens = costs?.bySquad.reduce((sum, s) => sum + s.inputTokens, 0) || 0;\n const totalOutputTokens = costs?.bySquad.reduce((sum, s) => sum + s.outputTokens, 0) || 0;\n const overallProgress = squadData.length > 0\n ? Math.round(squadData.reduce((sum, s) => sum + s.goalProgress, 0) / squadData.length)\n : 0;\n\n const snapshot: DashboardSnapshot = {\n totalSquads: squadData.length,\n totalCommits: gitStats?.totalCommits || 0,\n totalPrsMerged: ghStats?.prsMerged || 0,\n totalIssuesClosed: ghStats?.issuesClosed || 0,\n totalIssuesOpen: ghStats?.issuesOpen || 0,\n goalProgressPct: overallProgress,\n costUsd: costs?.totalCost || 0,\n dailyBudgetUsd: costs?.dailyBudget || 50,\n inputTokens: totalInputTokens,\n outputTokens: totalOutputTokens,\n commits30d: gitStats?.totalCommits || 0,\n avgCommitsPerDay: gitStats?.avgCommitsPerDay || 0,\n activeDays: gitStats?.activeDays || 0,\n peakCommits: gitStats?.peakDay?.count || 0,\n peakDate: gitStats?.peakDay?.date || null,\n squadsData,\n authorsData,\n reposData,\n };\n\n await saveDashboardSnapshot(snapshot);\n}\n\n// Find agents-squads base directory\nfunction findAgentsSquadsDir(): string | null {\n const candidates = [\n join(process.cwd(), '..'),\n join(homedir(), 'agents-squads'),\n ];\n\n for (const dir of candidates) {\n if (existsSync(join(dir, 'hq'))) {\n return dir;\n }\n }\n return null;\n}\n\nasync function renderGitPerformance(): Promise<void> {\n const baseDir = findAgentsSquadsDir();\n\n if (!baseDir) {\n writeLine(` ${bold}Git Activity${RESET} ${colors.dim}(no repos found)${RESET}`);\n writeLine();\n return;\n }\n\n const stats = getMultiRepoGitStats(baseDir, 30);\n const activity = getActivitySparkline(baseDir, 14);\n\n if (stats.totalCommits === 0) {\n writeLine(` ${bold}Git Activity${RESET} ${colors.dim}(no commits in 30d)${RESET}`);\n writeLine();\n return;\n }\n\n writeLine(` ${bold}Git Activity${RESET} ${colors.dim}(30d)${RESET}`);\n writeLine();\n\n // Sparkline for last 14 days\n const spark = sparkline(activity);\n writeLine(` ${colors.dim}Last 14d:${RESET} ${spark}`);\n writeLine();\n\n // Key metrics row\n const metrics = [\n `${colors.cyan}${stats.totalCommits}${RESET} commits`,\n `${colors.green}${stats.avgCommitsPerDay}${RESET}/day`,\n `${colors.purple}${stats.activeDays}${RESET} active days`,\n ];\n if (stats.peakDay) {\n metrics.push(`${colors.yellow}${stats.peakDay.count}${RESET} peak ${colors.dim}(${stats.peakDay.date})${RESET}`);\n }\n writeLine(` ${metrics.join(` ${colors.dim}│${RESET} `)}`);\n writeLine();\n\n // Repos by commits (top 5)\n const sortedRepos = Array.from(stats.commitsByRepo.entries())\n .sort((a, b) => b[1] - a[1])\n .slice(0, 5);\n\n if (sortedRepos.length > 0) {\n const maxRepoCommits = sortedRepos[0][1];\n\n for (const [repo, commits] of sortedRepos) {\n const bar = barChart(commits, maxRepoCommits, 12);\n writeLine(` ${colors.cyan}${padEnd(repo, 20)}${RESET}${bar} ${colors.dim}${commits}${RESET}`);\n }\n writeLine();\n }\n\n // Authors (top 3)\n const sortedAuthors = Array.from(stats.commitsByAuthor.entries())\n .sort((a, b) => b[1] - a[1])\n .slice(0, 3);\n\n if (sortedAuthors.length > 0) {\n const authorLine = sortedAuthors\n .map(([author, count]) => `${colors.dim}${truncate(author, 15)}${RESET} ${colors.cyan}${count}${RESET}`)\n .join(` ${colors.dim}│${RESET} `);\n writeLine(` ${colors.dim}By author:${RESET} ${authorLine}`);\n writeLine();\n }\n}\n\nasync function renderTokenEconomics(squadNames: string[]): Promise<void> {\n const costs = await fetchCostSummary(100);\n\n if (!costs) {\n // No Langfuse config or API error - show hint\n writeLine(` ${bold}Token Economics${RESET} ${colors.dim}(no data)${RESET}`);\n writeLine(` ${colors.dim}Set LANGFUSE_PUBLIC_KEY & LANGFUSE_SECRET_KEY for cost tracking${RESET}`);\n writeLine();\n return;\n }\n\n writeLine(` ${bold}Token Economics${RESET} ${colors.dim}(last 100 calls)${RESET}`);\n writeLine();\n\n // Budget bar\n const barWidth = 32;\n const costBar = formatCostBar(costs.usedPercent, barWidth);\n writeLine(` ${colors.dim}Budget $${costs.dailyBudget}${RESET} [${costBar}] ${costs.usedPercent.toFixed(1)}%`);\n writeLine(` ${colors.green}$${costs.totalCost.toFixed(2)}${RESET} used ${colors.dim}│${RESET} ${colors.cyan}$${costs.idleBudget.toFixed(2)}${RESET} idle`);\n writeLine();\n\n // Anthropic tier and limits\n const tier = parseInt(process.env.ANTHROPIC_TIER || '4', 10);\n\n // RPM limits by tier (same for all models)\n const rpmByTier: Record<number, number> = { 1: 50, 2: 1000, 3: 2000, 4: 4000 };\n const rpmLimit = rpmByTier[tier] || 4000;\n\n // Token limits by tier and model family (ITPM/OTPM per minute)\n const tokenLimits: Record<number, Record<string, { itpm: number; otpm: number }>> = {\n 1: { opus: { itpm: 30000, otpm: 8000 }, sonnet: { itpm: 30000, otpm: 8000 }, haiku: { itpm: 50000, otpm: 10000 } },\n 2: { opus: { itpm: 450000, otpm: 90000 }, sonnet: { itpm: 450000, otpm: 90000 }, haiku: { itpm: 450000, otpm: 90000 } },\n 3: { opus: { itpm: 800000, otpm: 160000 }, sonnet: { itpm: 800000, otpm: 160000 }, haiku: { itpm: 1000000, otpm: 200000 } },\n 4: { opus: { itpm: 2000000, otpm: 400000 }, sonnet: { itpm: 2000000, otpm: 400000 }, haiku: { itpm: 4000000, otpm: 800000 } },\n };\n\n const modelShortNames: Record<string, string> = {\n 'claude-opus-4-5-20251101': 'opus-4.5',\n 'claude-sonnet-4-20250514': 'sonnet-4',\n 'claude-haiku-4-5-20251001': 'haiku-4.5',\n 'claude-3-5-sonnet-20241022': 'sonnet-3.5',\n 'claude-3-5-haiku-20241022': 'haiku-3.5',\n };\n\n const modelToFamily: Record<string, string> = {\n 'claude-opus-4-5-20251101': 'opus',\n 'claude-sonnet-4-20250514': 'sonnet',\n 'claude-haiku-4-5-20251001': 'haiku',\n 'claude-3-5-sonnet-20241022': 'sonnet',\n 'claude-3-5-haiku-20241022': 'haiku',\n };\n\n // Aggregate stats by model\n const modelStats: Record<string, { calls: number; input: number; output: number; cached: number }> = {};\n for (const squad of costs.bySquad) {\n for (const [model, count] of Object.entries(squad.models)) {\n if (!modelStats[model]) {\n modelStats[model] = { calls: 0, input: 0, output: 0, cached: 0 };\n }\n modelStats[model].calls += count;\n }\n // Distribute tokens proportionally (approximation since we don't have per-model token breakdown)\n const totalCalls = Object.values(squad.models).reduce((a, b) => a + b, 0);\n for (const [model, count] of Object.entries(squad.models)) {\n const ratio = totalCalls > 0 ? count / totalCalls : 0;\n modelStats[model].input += Math.round(squad.inputTokens * ratio);\n modelStats[model].output += Math.round(squad.outputTokens * ratio);\n }\n }\n\n // Total tokens for all models\n const totalInput = costs.bySquad.reduce((sum, s) => sum + s.inputTokens, 0);\n const totalOutput = costs.bySquad.reduce((sum, s) => sum + s.outputTokens, 0);\n const totalCalls = costs.bySquad.reduce((sum, s) => sum + s.calls, 0);\n\n // Cost projections\n const hourlyRate = costs.totalCost; // Based on last 100 calls, rough proxy\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\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","/**\n * Cost tracking via Squads Bridge (postgres) or Langfuse\n * Primary: Squads Bridge API → PostgreSQL\n * Fallback: Langfuse API (if bridge unavailable)\n */\n\ninterface SquadCosts {\n squad: string;\n calls: number;\n inputTokens: number;\n outputTokens: number;\n cachedTokens: number;\n cost: number;\n models: Record<string, number>;\n}\n\nexport interface CostSummary {\n totalCost: number;\n dailyBudget: number;\n usedPercent: number;\n idleBudget: number;\n totalCalls: number;\n dailyCallLimit: number;\n callsPercent: number;\n totalCachedTokens: number;\n totalInputTokens: number;\n cacheHitRate: number;\n bySquad: SquadCosts[];\n source: 'postgres' | 'langfuse' | 'none';\n}\n\n// Model pricing (per 1M tokens)\nconst MODEL_PRICING: Record<string, { input: number; output: number }> = {\n 'claude-opus-4-5-20251101': { input: 15.0, output: 75.0 },\n 'claude-sonnet-4-20250514': { input: 3.0, output: 15.0 },\n 'claude-haiku-4-5-20251001': { input: 0.80, output: 4.0 },\n 'claude-3-5-sonnet-20241022': { input: 3.0, output: 15.0 },\n 'claude-3-5-haiku-20241022': { input: 0.80, output: 4.0 },\n default: { input: 3.0, output: 15.0 },\n};\n\nconst DEFAULT_DAILY_BUDGET = 50.0;\nconst DEFAULT_DAILY_CALL_LIMIT = 1000; // Default API call limit per day\nconst BRIDGE_URL = process.env.SQUADS_BRIDGE_URL || 'http://localhost:8088';\n\nfunction calcCost(model: string, inputTokens: number, outputTokens: number): number {\n const pricing = MODEL_PRICING[model] || MODEL_PRICING.default;\n return (inputTokens / 1_000_000) * pricing.input + (outputTokens / 1_000_000) * pricing.output;\n}\n\n/**\n * Fetch cost summary from Squads Bridge (postgres)\n */\nasync function fetchFromBridge(period: 'day' | 'week' | 'month' = 'day'): Promise<CostSummary | null> {\n try {\n const response = await fetch(`${BRIDGE_URL}/api/cost/summary?period=${period}`, {\n headers: { 'Content-Type': 'application/json' },\n });\n\n if (!response.ok) {\n return null;\n }\n\n const data = await response.json() as { totals?: { cost_usd?: number }; by_squad?: Record<string, unknown>[] };\n const dailyBudget = parseFloat(process.env.SQUADS_DAILY_BUDGET || '') || DEFAULT_DAILY_BUDGET;\n const totalCost = data.totals?.cost_usd || 0;\n\n const bySquad: SquadCosts[] = (data.by_squad || []).map((s: Record<string, unknown>) => ({\n squad: s.squad as string,\n calls: (s.generations as number) || 0,\n inputTokens: (s.input_tokens as number) || 0,\n outputTokens: (s.output_tokens as number) || 0,\n cachedTokens: (s.cached_tokens as number) || 0,\n cost: (s.cost_usd as number) || 0,\n models: {},\n }));\n\n const totalCalls = bySquad.reduce((sum, s) => sum + s.calls, 0);\n const dailyCallLimit = parseFloat(process.env.SQUADS_DAILY_CALL_LIMIT || '') || DEFAULT_DAILY_CALL_LIMIT;\n const totalCachedTokens = bySquad.reduce((sum, s) => sum + s.cachedTokens, 0);\n const totalInputTokens = bySquad.reduce((sum, s) => sum + s.inputTokens, 0);\n const totalAllInput = totalInputTokens + totalCachedTokens;\n const cacheHitRate = totalAllInput > 0 ? (totalCachedTokens / totalAllInput) * 100 : 0;\n\n return {\n totalCost,\n dailyBudget,\n usedPercent: (totalCost / dailyBudget) * 100,\n idleBudget: dailyBudget - totalCost,\n totalCalls,\n dailyCallLimit,\n callsPercent: (totalCalls / dailyCallLimit) * 100,\n totalCachedTokens,\n totalInputTokens,\n cacheHitRate,\n bySquad,\n source: 'postgres',\n };\n } catch {\n return null;\n }\n}\n\n/**\n * Fetch cost summary from Langfuse API (fallback)\n */\nasync function fetchFromLangfuse(limit = 100): Promise<CostSummary | null> {\n const publicKey = process.env.LANGFUSE_PUBLIC_KEY;\n const secretKey = process.env.LANGFUSE_SECRET_KEY;\n const host = process.env.LANGFUSE_HOST || process.env.LANGFUSE_BASE_URL || 'https://us.cloud.langfuse.com';\n\n if (!publicKey || !secretKey) {\n return null;\n }\n\n try {\n const auth = Buffer.from(`${publicKey}:${secretKey}`).toString('base64');\n const url = `${host}/api/public/observations?limit=${limit}`;\n\n const response = await fetch(url, {\n headers: {\n Authorization: `Basic ${auth}`,\n 'Content-Type': 'application/json',\n },\n });\n\n if (!response.ok) {\n return null;\n }\n\n interface LangfuseObs {\n type?: string;\n model?: string;\n metadata?: { squad?: string };\n usage?: { input?: number; output?: number };\n }\n const data = await response.json() as { data?: LangfuseObs[] };\n const observations = data.data || [];\n\n // Group by squad\n const bySquad: Record<string, SquadCosts> = {};\n\n for (const obs of observations) {\n if (obs.type !== 'GENERATION') continue;\n\n const metadata = obs.metadata || {};\n const squad = metadata.squad || 'unknown';\n const model = obs.model || 'unknown';\n const usage = obs.usage || {};\n\n const inputTokens = usage.input || 0;\n const outputTokens = usage.output || 0;\n const cost = calcCost(model, inputTokens, outputTokens);\n\n if (!bySquad[squad]) {\n bySquad[squad] = {\n squad,\n calls: 0,\n inputTokens: 0,\n outputTokens: 0,\n cachedTokens: 0,\n cost: 0,\n models: {},\n };\n }\n\n bySquad[squad].calls += 1;\n bySquad[squad].inputTokens += inputTokens;\n bySquad[squad].outputTokens += outputTokens;\n bySquad[squad].cost += cost;\n bySquad[squad].models[model] = (bySquad[squad].models[model] || 0) + 1;\n }\n\n const squadList = Object.values(bySquad).sort((a, b) => b.cost - a.cost);\n const totalCost = squadList.reduce((sum, s) => sum + s.cost, 0);\n const dailyBudget = parseFloat(process.env.SQUADS_DAILY_BUDGET || '') || DEFAULT_DAILY_BUDGET;\n\n const totalCalls = squadList.reduce((sum, s) => sum + s.calls, 0);\n const dailyCallLimit = parseFloat(process.env.SQUADS_DAILY_CALL_LIMIT || '') || DEFAULT_DAILY_CALL_LIMIT;\n const totalCachedTokens = squadList.reduce((sum, s) => sum + s.cachedTokens, 0);\n const totalInputTokens = squadList.reduce((sum, s) => sum + s.inputTokens, 0);\n const totalAllInput = totalInputTokens + totalCachedTokens;\n const cacheHitRate = totalAllInput > 0 ? (totalCachedTokens / totalAllInput) * 100 : 0;\n\n return {\n totalCost,\n dailyBudget,\n usedPercent: (totalCost / dailyBudget) * 100,\n idleBudget: dailyBudget - totalCost,\n totalCalls,\n dailyCallLimit,\n callsPercent: (totalCalls / dailyCallLimit) * 100,\n totalCachedTokens,\n totalInputTokens,\n cacheHitRate,\n bySquad: squadList,\n source: 'langfuse',\n };\n } catch {\n return null;\n }\n}\n\n/**\n * Fetch cost summary - tries postgres first, falls back to Langfuse\n */\nexport async function fetchCostSummary(\n limit = 100,\n period: 'day' | 'week' | 'month' = 'day'\n): Promise<CostSummary | null> {\n // Try postgres (via bridge) first\n const bridgeResult = await fetchFromBridge(period);\n if (bridgeResult) {\n return bridgeResult;\n }\n\n // Fall back to Langfuse\n const langfuseResult = await fetchFromLangfuse(limit);\n if (langfuseResult) {\n return langfuseResult;\n }\n\n // No data source available\n const defaultBudget = parseFloat(process.env.SQUADS_DAILY_BUDGET || '') || DEFAULT_DAILY_BUDGET;\n return {\n totalCost: 0,\n dailyBudget: defaultBudget,\n usedPercent: 0,\n idleBudget: defaultBudget,\n totalCalls: 0,\n dailyCallLimit: DEFAULT_DAILY_CALL_LIMIT,\n callsPercent: 0,\n totalCachedTokens: 0,\n totalInputTokens: 0,\n cacheHitRate: 0,\n bySquad: [],\n source: 'none',\n };\n}\n\nexport function formatCostBar(usedPercent: number, width = 20): string {\n const filled = Math.min(Math.round((usedPercent / 100) * width), width);\n const empty = width - filled;\n return '█'.repeat(filled) + '░'.repeat(empty);\n}\n\n/**\n * 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 fetch(`${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 fetch(`${BRIDGE_URL}/api/insights?period=${period}`, {\n headers: { 'Content-Type': 'application/json' },\n });\n\n if (!response.ok) {\n return {\n period,\n days: period === 'day' ? 1 : period === 'week' ? 7 : 30,\n taskMetrics: [],\n qualityMetrics: [],\n topTools: [],\n toolFailureRate: 0,\n source: 'none',\n };\n }\n\n interface InsightsResponse {\n period: string;\n days: number;\n task_metrics?: Array<{\n squad: string;\n tasks_total: number;\n tasks_completed: number;\n tasks_failed: number;\n success_rate: number;\n total_retries: number;\n tasks_with_retries: number;\n avg_retries: number;\n avg_duration_ms: number;\n avg_tokens: number;\n avg_cost: number;\n avg_context_pct: number;\n max_context_tokens: number;\n }>;\n quality_metrics?: Array<{\n squad: string;\n feedback_count: number;\n avg_quality: number;\n helpful_pct: number;\n fix_required_pct: number;\n }>;\n top_tools?: Array<{\n tool_name: string;\n usage_count: number;\n success_rate: number;\n avg_duration_ms: number;\n }>;\n tool_failure_rate?: number;\n }\n\n const data = await response.json() as InsightsResponse;\n\n return {\n period: data.period || period,\n days: data.days || 7,\n taskMetrics: (data.task_metrics || []).map(t => ({\n squad: t.squad,\n tasksTotal: t.tasks_total || 0,\n tasksCompleted: t.tasks_completed || 0,\n tasksFailed: t.tasks_failed || 0,\n successRate: t.success_rate || 0,\n totalRetries: t.total_retries || 0,\n tasksWithRetries: t.tasks_with_retries || 0,\n avgRetries: t.avg_retries || 0,\n avgDurationMs: t.avg_duration_ms || 0,\n avgTokens: t.avg_tokens || 0,\n avgCost: t.avg_cost || 0,\n avgContextPct: t.avg_context_pct || 0,\n maxContextTokens: t.max_context_tokens || 0,\n })),\n qualityMetrics: (data.quality_metrics || []).map(q => ({\n squad: q.squad,\n feedbackCount: q.feedback_count || 0,\n avgQuality: q.avg_quality || 0,\n helpfulPct: q.helpful_pct || 0,\n fixRequiredPct: q.fix_required_pct || 0,\n })),\n topTools: (data.top_tools || []).map(t => ({\n toolName: t.tool_name,\n usageCount: t.usage_count || 0,\n successRate: t.success_rate || 0,\n avgDurationMs: t.avg_duration_ms || 0,\n })),\n toolFailureRate: data.tool_failure_rate || 0,\n source: 'bridge',\n };\n } catch {\n return {\n period,\n days: period === 'day' ? 1 : period === 'week' ? 7 : 30,\n taskMetrics: [],\n qualityMetrics: [],\n topTools: [],\n toolFailureRate: 0,\n source: 'none',\n };\n }\n}\n","/**\n * Database utilities for local PostgreSQL persistence\n * Connects to the squads schema for storing metrics and snapshots\n */\n\nimport { createRequire } from 'module';\nconst require = createRequire(import.meta.url);\nconst pg = require('pg');\nconst { Pool } = pg;\n\n// Connection config from environment or defaults\nconst DATABASE_URL = process.env.SQUADS_DATABASE_URL ||\n 'postgresql://squads:squads_local_dev@localhost:5433/squads';\n\nlet pool: InstanceType<typeof Pool> | null = null;\n\n/**\n * Get or create the connection pool\n */\nfunction getPool(): InstanceType<typeof Pool> {\n if (!pool) {\n pool = new Pool({\n connectionString: DATABASE_URL,\n max: 5,\n idleTimeoutMillis: 30000,\n connectionTimeoutMillis: 5000,\n });\n\n // Handle pool errors\n pool.on('error', (err: Error) => {\n console.error('Unexpected database pool error:', err);\n });\n }\n return pool;\n}\n\n/**\n * Check if database is available\n */\nexport async function isDatabaseAvailable(): Promise<boolean> {\n try {\n const pool = getPool();\n const client = await pool.connect();\n await client.query('SELECT 1');\n client.release();\n return true;\n } catch (err) {\n if (process.env.DEBUG) {\n console.error('DB availability check failed:', err);\n }\n return false;\n }\n}\n\n/**\n * Dashboard snapshot data structure\n */\nexport interface DashboardSnapshot {\n // Top-level metrics\n totalSquads: number;\n totalCommits: number;\n totalPrsMerged: number;\n totalIssuesClosed: number;\n totalIssuesOpen: number;\n goalProgressPct: number;\n\n // Cost metrics\n costUsd: number;\n dailyBudgetUsd: number;\n inputTokens: number;\n outputTokens: number;\n\n // Git activity\n commits30d: number;\n avgCommitsPerDay: number;\n activeDays: number;\n peakCommits: number;\n peakDate: string | null;\n\n // Detailed breakdowns (stored as JSONB)\n squadsData: SquadSnapshotData[];\n authorsData: { name: string; commits: number }[];\n reposData: { name: string; commits: number }[];\n}\n\nexport interface SquadSnapshotData {\n name: string;\n commits: number;\n prsOpened: number;\n prsMerged: number;\n issuesClosed: number;\n issuesOpen: number;\n goalsActive: number;\n goalsTotal: number;\n progress: number;\n}\n\n/**\n * Save a dashboard snapshot to the database\n */\nexport async function saveDashboardSnapshot(snapshot: DashboardSnapshot): Promise<number | null> {\n try {\n const pool = getPool();\n const client = await pool.connect();\n\n const result = await client.query(`\n INSERT INTO squads.dashboard_snapshots (\n total_squads, total_commits, total_prs_merged, total_issues_closed, total_issues_open,\n goal_progress_pct, cost_usd, daily_budget_usd, input_tokens, output_tokens,\n commits_30d, avg_commits_per_day, active_days, peak_commits, peak_date,\n squads_data, authors_data, repos_data\n ) VALUES (\n $1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18\n ) RETURNING id\n `, [\n snapshot.totalSquads,\n snapshot.totalCommits,\n snapshot.totalPrsMerged,\n snapshot.totalIssuesClosed,\n snapshot.totalIssuesOpen,\n snapshot.goalProgressPct,\n snapshot.costUsd,\n snapshot.dailyBudgetUsd,\n snapshot.inputTokens,\n snapshot.outputTokens,\n snapshot.commits30d,\n snapshot.avgCommitsPerDay,\n snapshot.activeDays,\n snapshot.peakCommits,\n snapshot.peakDate,\n JSON.stringify(snapshot.squadsData),\n JSON.stringify(snapshot.authorsData),\n JSON.stringify(snapshot.reposData),\n ]);\n\n client.release();\n return result.rows[0]?.id ?? null;\n } catch (err) {\n // Log error for debugging, but don't crash\n if (process.env.DEBUG) {\n console.error('DB save error:', err);\n }\n return null;\n }\n}\n\n/**\n * Get recent dashboard snapshots for trend analysis\n */\nexport async function getDashboardHistory(limit: number = 30): Promise<DashboardSnapshot[]> {\n try {\n const client = await getPool().connect();\n\n const result = await client.query(`\n SELECT\n total_squads, total_commits, total_prs_merged, total_issues_closed, total_issues_open,\n goal_progress_pct, cost_usd, daily_budget_usd, input_tokens, output_tokens,\n commits_30d, avg_commits_per_day, active_days, peak_commits, peak_date,\n squads_data, authors_data, repos_data, captured_at\n FROM squads.dashboard_snapshots\n ORDER BY captured_at DESC\n LIMIT $1\n `, [limit]);\n\n client.release();\n\n return result.rows.map((row: Record<string, unknown>) => ({\n totalSquads: row.total_squads,\n totalCommits: row.total_commits,\n totalPrsMerged: row.total_prs_merged,\n totalIssuesClosed: row.total_issues_closed,\n totalIssuesOpen: row.total_issues_open,\n goalProgressPct: row.goal_progress_pct,\n costUsd: parseFloat(String(row.cost_usd)),\n dailyBudgetUsd: parseFloat(String(row.daily_budget_usd)),\n inputTokens: row.input_tokens,\n outputTokens: row.output_tokens,\n commits30d: row.commits_30d,\n avgCommitsPerDay: parseFloat(String(row.avg_commits_per_day)),\n activeDays: row.active_days,\n peakCommits: row.peak_commits,\n peakDate: row.peak_date,\n squadsData: row.squads_data || [],\n authorsData: row.authors_data || [],\n reposData: row.repos_data || [],\n }));\n } catch {\n return [];\n }\n}\n\n/**\n * Close the database connection pool\n */\nexport async function closeDatabase(): Promise<void> {\n if (pool) {\n await pool.end();\n pool = null;\n }\n}\n","import { execSync } from 'child_process';\nimport {\n colors,\n bold,\n RESET,\n gradient,\n box,\n padEnd,\n truncate,\n icons,\n writeLine,\n} from '../lib/terminal.js';\n\ninterface Issue {\n number: number;\n title: string;\n state: string;\n labels: string[];\n createdAt: string;\n}\n\ninterface RepoIssues {\n repo: string;\n issues: Issue[];\n error?: string;\n}\n\ninterface IssuesOptions {\n org?: string;\n repos?: string;\n}\n\nconst DEFAULT_ORG = 'agents-squads';\nconst DEFAULT_REPOS = ['hq', 'agents-squads-web', 'squads-cli'];\n\nexport async function issuesCommand(options: IssuesOptions = {}): Promise<void> {\n const org = options.org || DEFAULT_ORG;\n const repos = options.repos ? options.repos.split(',') : DEFAULT_REPOS;\n\n writeLine();\n writeLine(` ${gradient('squads')} ${colors.dim}issues${RESET}`);\n writeLine();\n\n // Check if gh is available\n try {\n execSync('gh --version', { stdio: 'pipe' });\n } catch {\n writeLine(` ${colors.red}GitHub CLI (gh) not found${RESET}`);\n writeLine(` ${colors.dim}Install: brew install gh${RESET}`);\n writeLine();\n return;\n }\n\n // Fetch issues for each repo\n const repoData: RepoIssues[] = [];\n let totalOpen = 0;\n\n for (const repo of repos) {\n try {\n const result = execSync(\n `gh issue list -R ${org}/${repo} --state open --json number,title,state,labels,createdAt --limit 50`,\n { stdio: 'pipe', encoding: 'utf-8' }\n );\n const issues: Issue[] = JSON.parse(result);\n repoData.push({ repo, issues });\n totalOpen += issues.length;\n } catch (e: any) {\n repoData.push({ repo, issues: [], error: 'not found or no access' });\n }\n }\n\n // Stats row\n const reposWithIssues = repoData.filter(r => r.issues.length > 0).length;\n writeLine(` ${colors.cyan}${totalOpen}${RESET} open issues ${colors.dim}│${RESET} ${reposWithIssues}/${repos.length} repos`);\n writeLine();\n\n // Table\n const w = { repo: 20, open: 6, latest: 40 };\n const tableWidth = w.repo + w.open + w.latest + 4;\n\n writeLine(` ${colors.purple}${box.topLeft}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.topRight}${RESET}`);\n\n const header = ` ${colors.purple}${box.vertical}${RESET} ` +\n `${bold}${padEnd('REPO', w.repo)}${RESET}` +\n `${bold}${padEnd('OPEN', w.open)}${RESET}` +\n `${bold}LATEST${RESET}` +\n ` ${colors.purple}${box.vertical}${RESET}`;\n writeLine(header);\n\n writeLine(` ${colors.purple}${box.teeRight}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.teeLeft}${RESET}`);\n\n for (const { repo, issues, error } of repoData) {\n const count = issues.length;\n const countColor = count > 5 ? colors.red : count > 0 ? colors.yellow : colors.green;\n\n let latest = `${colors.dim}—${RESET}`;\n if (error) {\n latest = `${colors.dim}${error}${RESET}`;\n } else if (issues.length > 0) {\n latest = truncate(issues[0].title, w.latest - 2);\n }\n\n const row = ` ${colors.purple}${box.vertical}${RESET} ` +\n `${colors.cyan}${padEnd(repo, w.repo)}${RESET}` +\n `${countColor}${padEnd(String(count), w.open)}${RESET}` +\n `${padEnd(latest, w.latest + 10)}` + // extra for color codes\n `${colors.purple}${box.vertical}${RESET}`;\n\n writeLine(row);\n }\n\n writeLine(` ${colors.purple}${box.bottomLeft}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.bottomRight}${RESET}`);\n writeLine();\n\n // Show recent issues\n const allIssues = repoData\n .flatMap(r => r.issues.map(i => ({ ...i, repo: r.repo })))\n .sort((a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime())\n .slice(0, 6);\n\n if (allIssues.length > 0) {\n writeLine(` ${bold}Recent${RESET}`);\n writeLine();\n\n for (const issue of allIssues) {\n const labelStr = issue.labels.length > 0\n ? `${colors.dim}[${issue.labels.map((l: any) => l.name || l).join(', ')}]${RESET}`\n : '';\n\n writeLine(` ${icons.empty} ${colors.dim}#${issue.number}${RESET} ${truncate(issue.title, 50)} ${labelStr}`);\n writeLine(` ${colors.dim}└ ${issue.repo}${RESET}`);\n }\n writeLine();\n }\n\n // Commands\n writeLine(` ${colors.dim}$${RESET} gh issue list -R ${colors.cyan}${org}/<repo>${RESET} ${colors.dim}View repo issues${RESET}`);\n writeLine(` ${colors.dim}$${RESET} gh issue create -R ${colors.cyan}${org}/<repo>${RESET} ${colors.dim}Create issue${RESET}`);\n writeLine();\n}\n","import { execSync, spawn } from 'child_process';\nimport ora from 'ora';\nimport {\n colors,\n bold,\n RESET,\n gradient,\n box,\n padEnd,\n truncate,\n icons,\n writeLine,\n} from '../lib/terminal.js';\n\ninterface Issue {\n number: number;\n title: string;\n labels: Array<{ name: string }>;\n body?: string;\n}\n\ninterface SolveOptions {\n repo?: string;\n issue?: number;\n dryRun?: boolean;\n execute?: boolean;\n}\n\nconst DEFAULT_ORG = 'agents-squads';\nconst DEFAULT_REPOS = ['hq', 'agents-squads-web', 'squads-cli', 'agents-squads'];\n\nexport async function solveIssuesCommand(options: SolveOptions = {}): Promise<void> {\n const repos = options.repo ? [options.repo] : DEFAULT_REPOS;\n\n writeLine();\n writeLine(` ${gradient('squads')} ${colors.dim}solve-issues${RESET}`);\n writeLine();\n\n // Check if gh is available\n try {\n execSync('gh --version', { stdio: 'pipe' });\n } catch {\n writeLine(` ${colors.red}GitHub CLI (gh) not found${RESET}`);\n writeLine(` ${colors.dim}Install: brew install gh${RESET}`);\n return;\n }\n\n // Collect issues to solve\n const issuesToSolve: Array<Issue & { repo: string }> = [];\n\n if (options.issue) {\n // Specific issue\n const repo = options.repo || 'hq';\n try {\n const result = execSync(\n `gh issue view ${options.issue} -R ${DEFAULT_ORG}/${repo} --json number,title,labels,body`,\n { stdio: 'pipe', encoding: 'utf-8' }\n );\n const issue = JSON.parse(result);\n issuesToSolve.push({ ...issue, repo });\n } catch {\n writeLine(` ${colors.red}Issue #${options.issue} not found in ${repo}${RESET}`);\n return;\n }\n } else {\n // All ready-to-fix issues\n for (const repo of repos) {\n try {\n const result = execSync(\n `gh issue list -R ${DEFAULT_ORG}/${repo} --label \"ready-to-fix\" --state open --json number,title,labels --limit 20`,\n { stdio: 'pipe', encoding: 'utf-8' }\n );\n const issues: Issue[] = JSON.parse(result);\n for (const issue of issues) {\n issuesToSolve.push({ ...issue, repo });\n }\n } catch {\n // Repo might not exist or no access\n }\n }\n }\n\n if (issuesToSolve.length === 0) {\n writeLine(` ${colors.yellow}No issues with 'ready-to-fix' label found${RESET}`);\n writeLine();\n writeLine(` ${colors.dim}Label an issue to make it solvable:${RESET}`);\n writeLine(` ${colors.dim}$${RESET} gh issue edit ${colors.cyan}<number>${RESET} -R ${colors.cyan}${DEFAULT_ORG}/<repo>${RESET} --add-label ready-to-fix`);\n writeLine();\n return;\n }\n\n // Show issues to solve\n writeLine(` ${colors.cyan}${issuesToSolve.length}${RESET} issue${issuesToSolve.length > 1 ? 's' : ''} to solve`);\n writeLine();\n\n for (const issue of issuesToSolve) {\n const labels = issue.labels.map(l => l.name).join(', ');\n writeLine(` ${icons.empty} ${colors.dim}#${issue.number}${RESET} ${truncate(issue.title, 50)}`);\n writeLine(` ${colors.dim}└ ${issue.repo} [${labels}]${RESET}`);\n }\n writeLine();\n\n if (options.dryRun) {\n writeLine(` ${colors.yellow}[DRY RUN] Would solve ${issuesToSolve.length} issues${RESET}`);\n return;\n }\n\n // Solve issues\n if (options.execute) {\n await solveWithClaude(issuesToSolve);\n } else {\n showSolveInstructions(issuesToSolve);\n }\n}\n\nfunction showSolveInstructions(issues: Array<Issue & { repo: string }>): void {\n writeLine(` ${bold}To solve these issues:${RESET}`);\n writeLine();\n writeLine(` ${colors.dim}Option 1: In Claude Code session${RESET}`);\n writeLine(` ${colors.dim}$${RESET} /solve-issue ${colors.cyan}${issues[0].repo}${RESET}`);\n writeLine();\n writeLine(` ${colors.dim}Option 2: Execute with Claude CLI${RESET}`);\n writeLine(` ${colors.dim}$${RESET} squads solve-issues --execute`);\n writeLine();\n writeLine(` ${colors.dim}Option 3: Solve specific issue${RESET}`);\n writeLine(` ${colors.dim}$${RESET} squads solve-issues --repo ${colors.cyan}${issues[0].repo}${RESET} --issue ${colors.cyan}${issues[0].number}${RESET} --execute`);\n writeLine();\n}\n\nasync function solveWithClaude(issues: Array<Issue & { repo: string }>): Promise<void> {\n const spinner = ora('Starting issue solver...').start();\n\n // Check if claude is available\n try {\n execSync('which claude', { stdio: 'pipe' });\n } catch {\n spinner.fail('Claude CLI not found');\n writeLine(` ${colors.dim}Install: npm install -g @anthropic-ai/claude-code${RESET}`);\n return;\n }\n\n for (const issue of issues) {\n spinner.text = `Solving #${issue.number}: ${truncate(issue.title, 40)}`;\n\n const prompt = buildSolvePrompt(issue);\n\n try {\n const result = await executeClaudePrompt(prompt);\n spinner.succeed(`Solved #${issue.number}`);\n\n // Extract PR URL if present\n const prMatch = result.match(/https:\\/\\/github\\.com\\/[^\\s]+\\/pull\\/\\d+/);\n if (prMatch) {\n writeLine(` ${colors.green}PR: ${prMatch[0]}${RESET}`);\n }\n } catch (error) {\n spinner.fail(`Failed #${issue.number}: ${error}`);\n }\n }\n\n writeLine();\n writeLine(` ${colors.dim}View results:${RESET}`);\n writeLine(` ${colors.dim}$${RESET} gh pr list -R ${colors.cyan}${DEFAULT_ORG}/<repo>${RESET}`);\n writeLine();\n}\n\nfunction buildSolvePrompt(issue: Issue & { repo: string }): string {\n return `Solve GitHub issue #${issue.number} in ${DEFAULT_ORG}/${issue.repo}.\n\nIssue: ${issue.title}\n\n## CRITICAL: Work Decisively (No Verification Loops!)\n\nRead each file ONCE, edit ONCE, commit IMMEDIATELY.\nVerify with git diff, NOT by re-reading files.\nIf reading the same file twice, STOP and move forward.\n\n## Instructions\n\n1. Read the issue: gh issue view ${issue.number} --repo ${DEFAULT_ORG}/${issue.repo}\n\n2. Set up worktree:\n git fetch origin main\n git worktree add ../.worktrees/issue-${issue.number} -b solve/issue-${issue.number} origin/main\n cd ../.worktrees/issue-${issue.number}\n\n3. Find and fix the problem (minimal changes)\n\n4. Commit: git add -A && git commit -m \"fix: ...\"\n\n5. Push and create PR:\n git push -u origin solve/issue-${issue.number}\n gh pr create --title \"fix: ...\" --body \"Fixes #${issue.number}\" --repo ${DEFAULT_ORG}/${issue.repo}\n\n6. Clean up: git worktree remove ../.worktrees/issue-${issue.number} --force\n\nReturn the PR URL when done.`;\n}\n\nfunction executeClaudePrompt(prompt: string): Promise<string> {\n return new Promise((resolve, reject) => {\n const claude = spawn('claude', ['--print', prompt], {\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n\n let output = '';\n let error = '';\n\n claude.stdout?.on('data', (data) => {\n output += data.toString();\n });\n\n claude.stderr?.on('data', (data) => {\n error += data.toString();\n });\n\n claude.on('close', (code) => {\n if (code === 0) {\n resolve(output);\n } else {\n reject(new Error(error || `Exited with code ${code}`));\n }\n });\n\n claude.on('error', reject);\n\n // 10 minute timeout\n setTimeout(() => {\n claude.kill();\n reject(new Error('Timeout after 10 minutes'));\n }, 10 * 60 * 1000);\n });\n}\n","import { execSync, spawn } from 'child_process';\nimport { existsSync, readdirSync } from 'fs';\nimport { join } from 'path';\nimport ora from 'ora';\nimport {\n colors,\n bold,\n RESET,\n gradient,\n truncate,\n icons,\n writeLine,\n} from '../lib/terminal.js';\nimport { findSquadsDir } from '../lib/squad-parser.js';\n\ninterface OpenOptions {\n squad?: string;\n agent?: string;\n dryRun?: boolean;\n execute?: boolean;\n}\n\ninterface EvalAgent {\n name: string;\n squad: string;\n path: string;\n}\n\n// Agents that find issues (evaluators, critics, auditors)\nconst ISSUE_FINDER_PATTERNS = [\n '*-eval.md',\n '*-critic.md',\n '*-auditor.md',\n 'site-tester.md',\n];\n\nexport async function openIssuesCommand(options: OpenOptions = {}): Promise<void> {\n writeLine();\n writeLine(` ${gradient('squads')} ${colors.dim}open-issues${RESET}`);\n writeLine();\n\n const squadsDir = findSquadsDir();\n if (!squadsDir) {\n writeLine(` ${colors.red}No .agents/squads directory found${RESET}`);\n return;\n }\n\n // Find evaluator/critic agents\n const evalAgents = findEvalAgents(squadsDir, options.squad);\n\n if (evalAgents.length === 0) {\n writeLine(` ${colors.yellow}No evaluator agents found${RESET}`);\n writeLine(` ${colors.dim}Evaluators match: *-eval.md, *-critic.md, *-auditor.md${RESET}`);\n return;\n }\n\n // Filter by specific agent if requested\n const agents = options.agent\n ? evalAgents.filter(a => a.name === options.agent || a.name === `${options.agent}.md`)\n : evalAgents;\n\n if (agents.length === 0) {\n writeLine(` ${colors.red}Agent '${options.agent}' not found${RESET}`);\n writeLine(` ${colors.dim}Available: ${evalAgents.map(a => a.name).join(', ')}${RESET}`);\n return;\n }\n\n // Group by squad\n const bySquad = agents.reduce((acc, agent) => {\n if (!acc[agent.squad]) acc[agent.squad] = [];\n acc[agent.squad].push(agent);\n return acc;\n }, {} as Record<string, EvalAgent[]>);\n\n writeLine(` ${colors.cyan}${agents.length}${RESET} evaluator${agents.length > 1 ? 's' : ''} ready`);\n writeLine();\n\n for (const [squad, squadAgents] of Object.entries(bySquad)) {\n writeLine(` ${bold}${squad}${RESET}`);\n for (const agent of squadAgents) {\n writeLine(` ${icons.empty} ${colors.cyan}${agent.name.replace('.md', '')}${RESET}`);\n }\n }\n writeLine();\n\n if (options.dryRun) {\n writeLine(` ${colors.yellow}[DRY RUN] Would run ${agents.length} evaluators${RESET}`);\n return;\n }\n\n if (options.execute) {\n await runEvaluators(agents);\n } else {\n showRunInstructions(agents);\n }\n}\n\nfunction findEvalAgents(squadsDir: string, filterSquad?: string): EvalAgent[] {\n const agents: EvalAgent[] = [];\n const squads = readdirSync(squadsDir, { withFileTypes: true })\n .filter(d => d.isDirectory())\n .filter(d => !filterSquad || d.name === filterSquad)\n .map(d => d.name);\n\n for (const squad of squads) {\n const squadPath = join(squadsDir, squad);\n const files = readdirSync(squadPath).filter(f => f.endsWith('.md'));\n\n for (const file of files) {\n // Check if matches evaluator patterns\n const isEval = ISSUE_FINDER_PATTERNS.some(pattern => {\n const regex = new RegExp('^' + pattern.replace('*', '.*') + '$');\n return regex.test(file);\n });\n\n if (isEval) {\n agents.push({\n name: file,\n squad,\n path: join(squadPath, file),\n });\n }\n }\n }\n\n return agents;\n}\n\nfunction showRunInstructions(agents: EvalAgent[]): void {\n writeLine(` ${bold}To run evaluators:${RESET}`);\n writeLine();\n writeLine(` ${colors.dim}Option 1: In Claude Code session${RESET}`);\n writeLine(` ${colors.dim}$${RESET} /website-eval`);\n writeLine();\n writeLine(` ${colors.dim}Option 2: Execute with Claude CLI${RESET}`);\n writeLine(` ${colors.dim}$${RESET} squads open-issues --execute`);\n writeLine();\n writeLine(` ${colors.dim}Option 3: Run specific evaluator${RESET}`);\n writeLine(` ${colors.dim}$${RESET} squads open-issues --squad ${colors.cyan}${agents[0].squad}${RESET} --agent ${colors.cyan}${agents[0].name.replace('.md', '')}${RESET} --execute`);\n writeLine();\n writeLine(` ${colors.dim}Option 4: Via squads run${RESET}`);\n writeLine(` ${colors.dim}$${RESET} squads run ${colors.cyan}${agents[0].squad}/${agents[0].name.replace('.md', '')}${RESET} --execute`);\n writeLine();\n}\n\nasync function runEvaluators(agents: EvalAgent[]): Promise<void> {\n const spinner = ora('Starting evaluators...').start();\n\n // Check if claude is available\n try {\n execSync('which claude', { stdio: 'pipe' });\n } catch {\n spinner.fail('Claude CLI not found');\n writeLine(` ${colors.dim}Install: npm install -g @anthropic-ai/claude-code${RESET}`);\n return;\n }\n\n let issuesCreated = 0;\n\n for (const agent of agents) {\n spinner.text = `Running ${agent.squad}/${agent.name.replace('.md', '')}...`;\n\n const prompt = buildEvalPrompt(agent);\n\n try {\n const result = await executeClaudePrompt(prompt);\n spinner.succeed(`${agent.name.replace('.md', '')}`);\n\n // Count issues created\n const issueMatches = result.match(/Created issue #\\d+/g) || [];\n issuesCreated += issueMatches.length;\n\n if (issueMatches.length > 0) {\n writeLine(` ${colors.green}Created ${issueMatches.length} issue(s)${RESET}`);\n } else {\n writeLine(` ${colors.dim}No issues found${RESET}`);\n }\n } catch (error) {\n spinner.fail(`${agent.name.replace('.md', '')}: ${error}`);\n }\n }\n\n writeLine();\n writeLine(` ${bold}Summary${RESET}`);\n writeLine(` ${colors.cyan}${issuesCreated}${RESET} new issues created`);\n writeLine();\n writeLine(` ${colors.dim}View issues:${RESET}`);\n writeLine(` ${colors.dim}$${RESET} squads issues`);\n writeLine();\n writeLine(` ${colors.dim}Solve them:${RESET}`);\n writeLine(` ${colors.dim}$${RESET} squads solve-issues`);\n writeLine();\n}\n\nfunction buildEvalPrompt(agent: EvalAgent): string {\n return `Execute the ${agent.name.replace('.md', '')} evaluator from squad ${agent.squad}.\n\nRead the agent definition at ${agent.path} and follow its instructions exactly.\n\n## CRITICAL: Work Decisively\n\n- Evaluate the target (website, code, etc.)\n- For each finding, create a GitHub issue\n- Use: gh issue create --repo agents-squads/{repo} --title \"...\" --body \"...\" --label \"type:...,priority:P1/P2/P3,squad:${agent.squad}\"\n- Report how many issues were created\n\nDo NOT get stuck re-reading files. Evaluate, report findings, create issues, done.`;\n}\n\nfunction executeClaudePrompt(prompt: string): Promise<string> {\n return new Promise((resolve, reject) => {\n const claude = spawn('claude', ['--print', prompt], {\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n\n let output = '';\n let error = '';\n\n claude.stdout?.on('data', (data) => {\n output += data.toString();\n });\n\n claude.stderr?.on('data', (data) => {\n error += data.toString();\n });\n\n claude.on('close', (code) => {\n if (code === 0) {\n resolve(output);\n } else {\n reject(new Error(error || `Exited with code ${code}`));\n }\n });\n\n claude.on('error', reject);\n\n // 5 minute timeout per evaluator\n setTimeout(() => {\n claude.kill();\n reject(new Error('Timeout after 5 minutes'));\n }, 5 * 60 * 1000);\n });\n}\n","import chalk from 'chalk';\nimport ora from 'ora';\nimport open from 'open';\nimport {\n isPersonalEmail,\n getEmailDomain,\n saveSession,\n loadSession,\n clearSession,\n startAuthCallbackServer,\n AuthSession\n} from '../lib/auth.js';\nimport { track } from '../lib/telemetry.js';\n\nconst AUTH_URL = process.env.SQUADS_AUTH_URL || 'https://app.agents-squads.com/auth';\nconst CALLBACK_PORT = 54321;\n\nexport async function loginCommand(): Promise<void> {\n const existingSession = loadSession();\n\n if (existingSession && existingSession.status === 'active') {\n console.log(chalk.green(`✓ Already logged in as ${existingSession.email}`));\n console.log(chalk.dim(` Domain: ${existingSession.domain}`));\n console.log(chalk.dim(` Run 'squads logout' to sign out.`));\n return;\n }\n\n console.log(`\n${chalk.bold.magenta('Squads CLI Login')}\n${chalk.dim('─'.repeat(40))}\n\nOpening browser to authenticate...\n`);\n\n const spinner = ora('Waiting for authentication...').start();\n\n try {\n // Start local callback server\n const callbackPromise = startAuthCallbackServer(CALLBACK_PORT);\n\n // Open browser to auth page\n const authUrl = `${AUTH_URL}?callback=http://localhost:${CALLBACK_PORT}/callback`;\n await open(authUrl);\n\n // Wait for callback\n const { email, token } = await callbackPromise;\n\n // Check if personal email\n if (isPersonalEmail(email)) {\n spinner.fail('Personal emails not supported');\n console.log(`\n${chalk.yellow('⚠ Squads CLI is for Pro & Enterprise teams only.')}\n\nPersonal email domains (Gmail, Yahoo, etc.) are not supported.\n\n${chalk.dim('Want to stay updated?')}\n → Get our free research report: ${chalk.cyan('https://agents-squads.com/research')}\n → Follow us: ${chalk.cyan('https://x.com/agents_squads')}\n`);\n\n await track('cli.login.personal_email', { domain: getEmailDomain(email) });\n return;\n }\n\n // Save session\n const session: AuthSession = {\n email,\n domain: getEmailDomain(email),\n status: 'pending', // Will be 'active' after sales contact\n createdAt: new Date().toISOString(),\n accessToken: token,\n };\n\n saveSession(session);\n spinner.succeed(`Logged in as ${chalk.cyan(email)}`);\n\n await track('cli.login.success', { domain: session.domain });\n\n console.log(`\n${chalk.green('✓ Thanks for signing up!')}\n\n${chalk.bold('What happens next:')}\n 1. Our team will reach out within 24 hours\n 2. We'll discuss your AI agent needs\n 3. You'll get access to Pro features\n\n${chalk.dim('In the meantime:')}\n → Explore squads: ${chalk.cyan('squads status')}\n → Set goals: ${chalk.cyan('squads goal set <squad> \"<goal>\"')}\n → Read our research: ${chalk.cyan('https://agents-squads.com/research')}\n\n${chalk.dim('Questions? Email us at')} ${chalk.cyan('hello@agents-squads.com')}\n`);\n\n } catch (error) {\n spinner.fail('Login failed');\n console.error(chalk.red(error instanceof Error ? error.message : 'Unknown error'));\n }\n}\n\nexport async function logoutCommand(): Promise<void> {\n const session = loadSession();\n\n if (!session) {\n console.log(chalk.yellow('Not logged in.'));\n return;\n }\n\n clearSession();\n console.log(chalk.green(`✓ Logged out from ${session.email}`));\n await track('cli.logout');\n}\n\nexport async function whoamiCommand(): Promise<void> {\n const session = loadSession();\n\n if (!session) {\n console.log(chalk.yellow('Not logged in.'));\n console.log(chalk.dim('Run: squads login'));\n return;\n }\n\n console.log(`\n${chalk.bold('Current Session')}\n${chalk.dim('─'.repeat(30))}\nEmail: ${chalk.cyan(session.email)}\nDomain: ${session.domain}\nStatus: ${session.status === 'active' ? chalk.green('Active') : chalk.yellow('Pending')}\nSince: ${new Date(session.createdAt).toLocaleDateString()}\n`);\n}\n","import { createClient } from '@supabase/supabase-js';\nimport { existsSync, readFileSync, writeFileSync, mkdirSync } from 'fs';\nimport { join } from 'path';\nimport { homedir } from 'os';\nimport open from 'open';\nimport http from 'http';\n\n// Personal email domains to reject\nconst PERSONAL_DOMAINS = [\n 'gmail.com', 'googlemail.com',\n 'yahoo.com', 'yahoo.co.uk', 'yahoo.fr',\n 'hotmail.com', 'outlook.com', 'live.com', 'msn.com',\n 'icloud.com', 'me.com', 'mac.com',\n 'aol.com',\n 'protonmail.com', 'proton.me',\n 'zoho.com',\n 'mail.com',\n 'yandex.com', 'yandex.ru',\n 'gmx.com', 'gmx.de',\n 'fastmail.com',\n 'tutanota.com',\n 'hey.com',\n];\n\nconst AUTH_DIR = join(homedir(), '.squads-cli');\nconst AUTH_PATH = join(AUTH_DIR, 'auth.json');\n\nexport interface AuthSession {\n email: string;\n domain: string;\n status: 'pending' | 'contacted' | 'active';\n createdAt: string;\n accessToken?: string;\n}\n\nexport function isPersonalEmail(email: string): boolean {\n const domain = email.split('@')[1]?.toLowerCase();\n return PERSONAL_DOMAINS.includes(domain);\n}\n\nexport function getEmailDomain(email: string): string {\n return email.split('@')[1]?.toLowerCase() || '';\n}\n\nexport function saveSession(session: AuthSession): void {\n if (!existsSync(AUTH_DIR)) {\n mkdirSync(AUTH_DIR, { recursive: true });\n }\n writeFileSync(AUTH_PATH, JSON.stringify(session, null, 2));\n}\n\nexport function loadSession(): AuthSession | null {\n if (!existsSync(AUTH_PATH)) return null;\n try {\n return JSON.parse(readFileSync(AUTH_PATH, 'utf-8'));\n } catch {\n return null;\n }\n}\n\nexport function clearSession(): void {\n if (existsSync(AUTH_PATH)) {\n writeFileSync(AUTH_PATH, '');\n }\n}\n\nexport function isLoggedIn(): boolean {\n const session = loadSession();\n return session !== null && session.status === 'active';\n}\n\n// Create Supabase client (for edge function use)\nexport function createSupabaseClient(url: string, anonKey: string) {\n return createClient(url, anonKey);\n}\n\n// Local callback server for OAuth flow\nexport function startAuthCallbackServer(port: number = 54321): Promise<{ email: string; token: string }> {\n return new Promise((resolve, reject) => {\n const server = http.createServer((req, res) => {\n const url = new URL(req.url || '', `http://localhost:${port}`);\n\n if (url.pathname === '/callback') {\n const email = url.searchParams.get('email');\n const token = url.searchParams.get('token');\n const error = url.searchParams.get('error');\n\n if (error) {\n res.writeHead(200, { 'Content-Type': 'text/html' });\n res.end(`\n <html>\n <body style=\"font-family: system-ui; display: flex; justify-content: center; align-items: center; height: 100vh; margin: 0;\">\n <div style=\"text-align: center;\">\n <h1 style=\"color: #ef4444;\">❌ ${error}</h1>\n <p>You can close this window.</p>\n </div>\n </body>\n </html>\n `);\n server.close();\n reject(new Error(error));\n return;\n }\n\n if (email && token) {\n res.writeHead(200, { 'Content-Type': 'text/html' });\n res.end(`\n <html>\n <body style=\"font-family: system-ui; display: flex; justify-content: center; align-items: center; height: 100vh; margin: 0;\">\n <div style=\"text-align: center;\">\n <h1 style=\"color: #10b981;\">✓ Logged in!</h1>\n <p>Welcome, ${email}</p>\n <p style=\"color: #6b7280;\">You can close this window and return to your terminal.</p>\n </div>\n </body>\n </html>\n `);\n server.close();\n resolve({ email, token });\n } else {\n res.writeHead(400, { 'Content-Type': 'text/plain' });\n res.end('Missing email or token');\n }\n } else {\n res.writeHead(404);\n res.end();\n }\n });\n\n server.listen(port, () => {\n // Server started\n });\n\n // Timeout after 5 minutes\n setTimeout(() => {\n server.close();\n reject(new Error('Login timed out'));\n }, 5 * 60 * 1000);\n });\n}\n","import { execSync } from 'child_process';\nimport { existsSync, readFileSync, writeFileSync, mkdirSync } from 'fs';\nimport { join } from 'path';\nimport { findSquadsDir, listSquads, loadSquad } from '../lib/squad-parser.js';\nimport { findMemoryDir } from '../lib/memory.js';\nimport {\n colors,\n bold,\n RESET,\n gradient,\n box,\n padEnd,\n truncate,\n icons,\n writeLine,\n} from '../lib/terminal.js';\n\ninterface TaskEntry {\n id: string;\n squad: string;\n description: string;\n status: 'active' | 'completed' | 'failed';\n startedAt: string;\n completedAt?: string;\n commits?: string[];\n}\n\ninterface TasksFile {\n tasks: TaskEntry[];\n lastUpdated: string;\n}\n\nfunction getTasksFilePath(): string {\n const memoryDir = findMemoryDir();\n if (!memoryDir) {\n const cwd = process.cwd();\n const agentsDir = join(cwd, '.agents');\n if (!existsSync(agentsDir)) {\n mkdirSync(agentsDir, { recursive: true });\n }\n return join(agentsDir, 'tasks.json');\n }\n return join(memoryDir, '..', 'tasks.json');\n}\n\nfunction loadTasks(): TasksFile {\n const tasksPath = getTasksFilePath();\n if (existsSync(tasksPath)) {\n try {\n return JSON.parse(readFileSync(tasksPath, 'utf-8'));\n } catch {\n return { tasks: [], lastUpdated: new Date().toISOString() };\n }\n }\n return { tasks: [], lastUpdated: new Date().toISOString() };\n}\n\nfunction saveTasks(data: TasksFile): void {\n const tasksPath = getTasksFilePath();\n data.lastUpdated = new Date().toISOString();\n writeFileSync(tasksPath, JSON.stringify(data, null, 2));\n}\n\n// Get recent commits to infer activity\nfunction getRecentActivity(): { squad: string; message: string; hash: string; date: string }[] {\n const activity: { squad: string; message: string; hash: string; date: string }[] = [];\n\n const squadKeywords: Record<string, string[]> = {\n website: ['website', 'web', 'homepage', 'astro', 'page'],\n product: ['cli', 'squads-cli', 'command'],\n research: ['research', 'report', 'analysis'],\n engineering: ['infra', 'engineering', 'build'],\n intelligence: ['intel', 'monitor', 'competitor'],\n customer: ['lead', 'customer', 'outreach'],\n finance: ['cost', 'finance', 'budget'],\n company: ['company', 'strategy', 'mission'],\n marketing: ['marketing', 'content', 'social'],\n };\n\n try {\n const logOutput = execSync(\n 'git log --since=\"24 hours ago\" --format=\"%h|%aI|%s\" 2>/dev/null',\n { encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] }\n ).trim();\n\n if (!logOutput) return activity;\n\n for (const line of logOutput.split('\\n')) {\n const [hash, date, ...msgParts] = line.split('|');\n const message = msgParts.join('|');\n if (!hash || !message) continue;\n\n // Detect squad from commit message\n const msgLower = message.toLowerCase();\n let detectedSquad = 'unknown';\n\n for (const [squad, keywords] of Object.entries(squadKeywords)) {\n if (keywords.some(k => msgLower.includes(k))) {\n detectedSquad = squad;\n break;\n }\n }\n\n activity.push({\n squad: detectedSquad,\n message,\n hash,\n date: date.split('T')[0],\n });\n }\n } catch {\n // Not in git repo\n }\n\n return activity;\n}\n\nexport async function progressCommand(options: { verbose?: boolean } = {}): Promise<void> {\n writeLine();\n writeLine(` ${gradient('squads')} ${colors.dim}progress${RESET}`);\n writeLine();\n\n const tasksData = loadTasks();\n const recentActivity = getRecentActivity();\n\n // Active tasks\n const activeTasks = tasksData.tasks.filter(t => t.status === 'active');\n const completedToday = tasksData.tasks.filter(t =>\n t.status === 'completed' &&\n t.completedAt?.startsWith(new Date().toISOString().split('T')[0])\n );\n\n // Stats row\n const stats = [\n `${colors.cyan}${activeTasks.length}${RESET} active`,\n `${colors.green}${completedToday.length}${RESET} done today`,\n `${colors.purple}${recentActivity.length}${RESET} commits (24h)`,\n ].join(` ${colors.dim}│${RESET} `);\n writeLine(` ${stats}`);\n writeLine();\n\n // Active tasks section\n if (activeTasks.length > 0) {\n writeLine(` ${bold}Active Tasks${RESET}`);\n writeLine();\n\n for (const task of activeTasks) {\n const elapsed = getElapsedTime(task.startedAt);\n writeLine(` ${icons.progress} ${colors.cyan}${task.squad}${RESET} ${truncate(task.description, 45)}`);\n writeLine(` ${colors.dim}started ${elapsed} ago${RESET}`);\n }\n writeLine();\n } else {\n writeLine(` ${colors.dim}No active tasks${RESET}`);\n writeLine();\n }\n\n // Recent activity from git\n if (recentActivity.length > 0) {\n writeLine(` ${bold}Recent Activity${RESET} ${colors.dim}(last 24h)${RESET}`);\n writeLine();\n\n const w = { squad: 12, message: 50 };\n const tableWidth = w.squad + w.message + 4;\n\n writeLine(` ${colors.purple}${box.topLeft}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.topRight}${RESET}`);\n writeLine(` ${colors.purple}${box.vertical}${RESET} ${bold}${padEnd('SQUAD', w.squad)}${RESET}${bold}COMMIT${RESET}${' '.repeat(w.message - 6)} ${colors.purple}${box.vertical}${RESET}`);\n writeLine(` ${colors.purple}${box.teeRight}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.teeLeft}${RESET}`);\n\n const maxRows = options.verbose ? 15 : 8;\n for (const act of recentActivity.slice(0, maxRows)) {\n const squadColor = act.squad === 'unknown' ? colors.dim : colors.cyan;\n const row = ` ${colors.purple}${box.vertical}${RESET} ` +\n `${squadColor}${padEnd(act.squad, w.squad)}${RESET}` +\n `${truncate(act.message, w.message - 2)}` +\n ` ${colors.purple}${box.vertical}${RESET}`;\n writeLine(row);\n }\n\n writeLine(` ${colors.purple}${box.bottomLeft}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.bottomRight}${RESET}`);\n\n if (recentActivity.length > maxRows) {\n writeLine(` ${colors.dim}+${recentActivity.length - maxRows} more commits${RESET}`);\n }\n writeLine();\n }\n\n // Completed today\n if (completedToday.length > 0) {\n writeLine(` ${bold}Completed Today${RESET}`);\n writeLine();\n for (const task of completedToday.slice(0, 5)) {\n writeLine(` ${icons.success} ${colors.cyan}${task.squad}${RESET} ${truncate(task.description, 50)}`);\n }\n if (completedToday.length > 5) {\n writeLine(` ${colors.dim}+${completedToday.length - 5} more${RESET}`);\n }\n writeLine();\n }\n\n // Commands\n writeLine(` ${colors.dim}$${RESET} squads results ${colors.dim}KPI goals vs actuals${RESET}`);\n writeLine(` ${colors.dim}$${RESET} squads dash ${colors.dim}Full dashboard${RESET}`);\n writeLine();\n}\n\n// Register a new task (called by agents)\nexport async function progressStartCommand(\n squad: string,\n description: string\n): Promise<void> {\n const tasksData = loadTasks();\n const id = Math.random().toString(36).substring(2, 9);\n\n tasksData.tasks.push({\n id,\n squad,\n description,\n status: 'active',\n startedAt: new Date().toISOString(),\n });\n\n saveTasks(tasksData);\n writeLine(` ${icons.active} Task ${colors.cyan}${id}${RESET} started for ${colors.purple}${squad}${RESET}`);\n}\n\n// Complete a task\nexport async function progressCompleteCommand(\n taskId: string,\n options: { failed?: boolean } = {}\n): Promise<void> {\n const tasksData = loadTasks();\n const task = tasksData.tasks.find(t => t.id === taskId);\n\n if (!task) {\n writeLine(` ${icons.error} Task ${colors.red}${taskId}${RESET} not found`);\n return;\n }\n\n task.status = options.failed ? 'failed' : 'completed';\n task.completedAt = new Date().toISOString();\n\n saveTasks(tasksData);\n\n const icon = options.failed ? icons.error : icons.success;\n const status = options.failed ? 'failed' : 'completed';\n writeLine(` ${icon} Task ${colors.cyan}${taskId}${RESET} ${status}`);\n}\n\nfunction getElapsedTime(startTime: string): string {\n const start = new Date(startTime).getTime();\n const now = Date.now();\n const diffMs = now - start;\n\n const minutes = Math.floor(diffMs / 60000);\n const hours = Math.floor(minutes / 60);\n const days = Math.floor(hours / 24);\n\n if (days > 0) return `${days}d`;\n if (hours > 0) return `${hours}h`;\n if (minutes > 0) return `${minutes}m`;\n return '<1m';\n}\n","import { execSync } from 'child_process';\nimport { existsSync, readFileSync } from 'fs';\nimport { join } from 'path';\nimport { findSquadsDir, listSquads, loadSquad, Goal } from '../lib/squad-parser.js';\nimport {\n colors,\n bold,\n RESET,\n gradient,\n box,\n padEnd,\n truncate,\n icons,\n writeLine,\n progressBar,\n} from '../lib/terminal.js';\n\ninterface SquadResults {\n name: string;\n commits: number;\n prsOpened: number;\n prsMerged: number;\n issuesClosed: number;\n goals: GoalWithMetrics[];\n}\n\ninterface GoalWithMetrics {\n description: string;\n metrics: string[];\n progress?: string;\n completed: boolean;\n actual?: Record<string, number | string>;\n}\n\n// Get git stats for the past week per squad\nfunction getGitStats(days: number = 7): Map<string, { commits: number; files: string[] }> {\n const stats = new Map<string, { commits: number; files: string[] }>();\n\n const squadKeywords: Record<string, string[]> = {\n website: ['agents-squads-web', 'website', 'homepage'],\n product: ['squads-cli', 'cli'],\n research: ['research'],\n engineering: ['engineering', '.agents'],\n intelligence: ['intelligence'],\n customer: ['customer'],\n finance: ['finance'],\n company: ['company'],\n marketing: ['marketing'],\n };\n\n try {\n const logOutput = execSync(\n `git log --since=\"${days} days ago\" --format=\"%s\" --name-only 2>/dev/null`,\n { encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] }\n ).trim();\n\n if (!logOutput) return stats;\n\n const entries = logOutput.split('\\n\\n');\n for (const entry of entries) {\n const lines = entry.split('\\n').filter(l => l.trim());\n if (lines.length === 0) continue;\n\n const message = lines[0];\n const files = lines.slice(1);\n const msgLower = message.toLowerCase();\n\n // Detect squad\n let detectedSquad = 'other';\n for (const [squad, keywords] of Object.entries(squadKeywords)) {\n const inMessage = keywords.some(k => msgLower.includes(k));\n const inFiles = files.some(f =>\n keywords.some(k => f.toLowerCase().includes(k))\n );\n if (inMessage || inFiles) {\n detectedSquad = squad;\n break;\n }\n }\n\n if (!stats.has(detectedSquad)) {\n stats.set(detectedSquad, { commits: 0, files: [] });\n }\n const squadStats = stats.get(detectedSquad)!;\n squadStats.commits++;\n squadStats.files.push(...files);\n }\n } catch {\n // Not in git repo\n }\n\n return stats;\n}\n\n// Get GitHub stats via gh CLI\nfunction getGitHubStats(days: number = 7): {\n prsOpened: Map<string, number>;\n prsMerged: Map<string, number>;\n issuesClosed: Map<string, number>;\n} {\n const prsOpened = new Map<string, number>();\n const prsMerged = new Map<string, number>();\n const issuesClosed = new Map<string, number>();\n\n try {\n // Get PRs opened\n const prsOutput = execSync(\n `gh pr list --state all --json title,createdAt,mergedAt --limit 50 2>/dev/null`,\n { encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] }\n );\n const prs = JSON.parse(prsOutput || '[]');\n const since = new Date(Date.now() - days * 24 * 60 * 60 * 1000);\n\n for (const pr of prs) {\n const created = new Date(pr.createdAt);\n if (created < since) continue;\n\n const squad = detectSquadFromTitle(pr.title);\n prsOpened.set(squad, (prsOpened.get(squad) || 0) + 1);\n\n if (pr.mergedAt) {\n prsMerged.set(squad, (prsMerged.get(squad) || 0) + 1);\n }\n }\n\n // Get issues closed\n const issuesOutput = execSync(\n `gh issue list --state closed --json title,closedAt --limit 50 2>/dev/null`,\n { encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] }\n );\n const issues = JSON.parse(issuesOutput || '[]');\n\n for (const issue of issues) {\n const closed = new Date(issue.closedAt);\n if (closed < since) continue;\n\n const squad = detectSquadFromTitle(issue.title);\n issuesClosed.set(squad, (issuesClosed.get(squad) || 0) + 1);\n }\n } catch {\n // gh not available or not in repo\n }\n\n return { prsOpened, prsMerged, issuesClosed };\n}\n\nfunction detectSquadFromTitle(title: string): string {\n const lower = title.toLowerCase();\n const mapping: Record<string, string[]> = {\n website: ['website', 'web', 'homepage', 'page'],\n product: ['cli', 'squads', 'command'],\n research: ['research', 'report'],\n engineering: ['infra', 'build', 'ci'],\n intelligence: ['intel', 'monitor'],\n customer: ['lead', 'customer'],\n finance: ['cost', 'finance'],\n marketing: ['marketing', 'content'],\n };\n\n for (const [squad, keywords] of Object.entries(mapping)) {\n if (keywords.some(k => lower.includes(k))) {\n return squad;\n }\n }\n return 'other';\n}\n\n// Parse metrics from goal description\nfunction parseMetrics(goal: Goal): string[] {\n const metrics: string[] = [];\n\n // Check for explicit metrics in goal\n if (goal.metrics && goal.metrics.length > 0) {\n return goal.metrics;\n }\n\n // Infer from description\n const desc = goal.description.toLowerCase();\n\n if (desc.includes('revenue')) metrics.push('revenue_usd');\n if (desc.includes('lead')) metrics.push('leads_count');\n if (desc.includes('traffic') || desc.includes('visit')) metrics.push('page_views');\n if (desc.includes('signup') || desc.includes('email')) metrics.push('signups');\n if (desc.includes('cost')) metrics.push('cost_usd');\n if (desc.includes('publish') || desc.includes('launch')) metrics.push('shipped');\n if (desc.includes('demo')) metrics.push('demos_booked');\n\n return metrics.length > 0 ? metrics : ['progress'];\n}\n\nexport async function resultsCommand(options: {\n squad?: string;\n days?: string;\n verbose?: boolean;\n} = {}): Promise<void> {\n const squadsDir = findSquadsDir();\n if (!squadsDir) {\n writeLine(`${colors.red}No .agents/squads directory found${RESET}`);\n return;\n }\n\n const days = parseInt(options.days || '7', 10);\n\n writeLine();\n writeLine(` ${gradient('squads')} ${colors.dim}results${RESET} ${colors.dim}(${days}d)${RESET}`);\n writeLine();\n\n const squadNames = options.squad ? [options.squad] : listSquads(squadsDir);\n const gitStats = getGitStats(days);\n const ghStats = getGitHubStats(days);\n\n const results: SquadResults[] = [];\n\n for (const name of squadNames) {\n const squad = loadSquad(name);\n if (!squad) continue;\n\n const git = gitStats.get(name) || { commits: 0, files: [] };\n const activeGoals = squad.goals.filter(g => !g.completed);\n\n results.push({\n name,\n commits: git.commits,\n prsOpened: ghStats.prsOpened.get(name) || 0,\n prsMerged: ghStats.prsMerged.get(name) || 0,\n issuesClosed: ghStats.issuesClosed.get(name) || 0,\n goals: activeGoals.map(g => ({\n description: g.description,\n metrics: parseMetrics(g),\n progress: g.progress,\n completed: g.completed,\n })),\n });\n }\n\n // Summary stats\n const totalCommits = results.reduce((sum, r) => sum + r.commits, 0);\n const totalPRs = results.reduce((sum, r) => sum + r.prsMerged, 0);\n const totalGoals = results.reduce((sum, r) => sum + r.goals.length, 0);\n\n const stats = [\n `${colors.cyan}${totalCommits}${RESET} commits`,\n `${colors.green}${totalPRs}${RESET} PRs merged`,\n `${colors.purple}${totalGoals}${RESET} active goals`,\n ].join(` ${colors.dim}│${RESET} `);\n writeLine(` ${stats}`);\n writeLine();\n\n // Results table\n const w = { squad: 14, commits: 8, prs: 6, goals: 5, kpi: 20 };\n const tableWidth = w.squad + w.commits + w.prs + w.goals + w.kpi + 8;\n\n writeLine(` ${colors.purple}${box.topLeft}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.topRight}${RESET}`);\n writeLine(` ${colors.purple}${box.vertical}${RESET} ` +\n `${bold}${padEnd('SQUAD', w.squad)}${RESET}` +\n `${bold}${padEnd('COMMITS', w.commits)}${RESET}` +\n `${bold}${padEnd('PRs', w.prs)}${RESET}` +\n `${bold}${padEnd('GOALS', w.goals)}${RESET}` +\n `${bold}KEY METRIC${RESET}` +\n ` ${colors.purple}${box.vertical}${RESET}`);\n writeLine(` ${colors.purple}${box.teeRight}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.teeLeft}${RESET}`);\n\n for (const result of results) {\n const keyMetric = result.goals.length > 0\n ? result.goals[0].metrics[0] || '—'\n : '—';\n\n const commitColor = result.commits > 0 ? colors.green : colors.dim;\n const prColor = result.prsMerged > 0 ? colors.green : colors.dim;\n\n const row = ` ${colors.purple}${box.vertical}${RESET} ` +\n `${colors.cyan}${padEnd(result.name, w.squad)}${RESET}` +\n `${commitColor}${padEnd(String(result.commits), w.commits)}${RESET}` +\n `${prColor}${padEnd(String(result.prsMerged), w.prs)}${RESET}` +\n `${padEnd(String(result.goals.length), w.goals)}` +\n `${colors.dim}${truncate(keyMetric, w.kpi)}${RESET}` +\n ` ${colors.purple}${box.vertical}${RESET}`;\n writeLine(row);\n }\n\n writeLine(` ${colors.purple}${box.bottomLeft}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.bottomRight}${RESET}`);\n writeLine();\n\n // Goal details with KPIs\n if (options.verbose || options.squad) {\n writeLine(` ${bold}Goals & KPIs${RESET}`);\n writeLine();\n\n for (const result of results) {\n if (result.goals.length === 0) continue;\n\n writeLine(` ${colors.cyan}${result.name}${RESET}`);\n\n for (const goal of result.goals) {\n const statusIcon = goal.progress ? icons.progress : icons.empty;\n writeLine(` ${statusIcon} ${truncate(goal.description, 55)}`);\n\n // Show metrics\n if (goal.metrics.length > 0) {\n const metricsStr = goal.metrics.map(m => `${colors.purple}${m}${RESET}`).join(', ');\n writeLine(` ${colors.dim}metrics:${RESET} ${metricsStr}`);\n }\n\n // Show progress if any\n if (goal.progress) {\n writeLine(` ${colors.dim}progress:${RESET} ${colors.green}${goal.progress}${RESET}`);\n }\n }\n writeLine();\n }\n }\n\n // Help\n writeLine(` ${colors.dim}$${RESET} squads results ${colors.cyan}<squad>${RESET} -v ${colors.dim}Detailed squad KPIs${RESET}`);\n writeLine(` ${colors.dim}$${RESET} squads goal progress ${colors.dim}Update goal progress${RESET}`);\n writeLine();\n}\n","import { execSync } from 'child_process';\nimport { existsSync, readFileSync } from 'fs';\nimport { join } from 'path';\nimport { findMemoryDir } from '../lib/memory.js';\nimport {\n colors,\n bold,\n RESET,\n gradient,\n box,\n padEnd,\n truncate,\n icons,\n writeLine,\n} from '../lib/terminal.js';\n\ninterface TaskEntry {\n id: string;\n squad: string;\n description: string;\n status: 'active' | 'completed' | 'failed';\n startedAt: string;\n}\n\ninterface ProcessInfo {\n pid: string;\n cpu: string;\n mem: string;\n time: string;\n command: string;\n type: 'claude' | 'agent' | 'hook' | 'dev-server';\n}\n\nfunction getTasksFilePath(): string | null {\n const memoryDir = findMemoryDir();\n if (!memoryDir) return null;\n return join(memoryDir, '..', 'tasks.json');\n}\n\nfunction loadActiveTasks(): TaskEntry[] {\n const tasksPath = getTasksFilePath();\n if (!tasksPath || !existsSync(tasksPath)) return [];\n\n try {\n const data = JSON.parse(readFileSync(tasksPath, 'utf-8'));\n return data.tasks?.filter((t: TaskEntry) => t.status === 'active') || [];\n } catch {\n return [];\n }\n}\n\nfunction getRunningProcesses(): ProcessInfo[] {\n const processes: ProcessInfo[] = [];\n\n try {\n // Get Claude and related processes\n const psOutput = execSync(\n 'ps aux | grep -E \"claude|squads|astro|node.*agent\" | grep -v grep',\n { encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] }\n ).trim();\n\n if (!psOutput) return processes;\n\n for (const line of psOutput.split('\\n')) {\n const parts = line.trim().split(/\\s+/);\n if (parts.length < 11) continue;\n\n const pid = parts[1];\n const cpu = parts[2];\n const mem = parts[3];\n const time = parts[9];\n const command = parts.slice(10).join(' ');\n\n // Categorize the process\n let type: ProcessInfo['type'] = 'agent';\n if (command.includes('claude')) type = 'claude';\n else if (command.includes('squads')) type = 'hook';\n else if (command.includes('astro')) type = 'dev-server';\n\n // Skip very short-lived processes\n if (command.includes('grep')) continue;\n\n processes.push({ pid, cpu, mem, time, command, type });\n }\n } catch {\n // No matching processes\n }\n\n return processes;\n}\n\nfunction categorizeProcesses(processes: ProcessInfo[]): {\n claude: ProcessInfo[];\n hooks: ProcessInfo[];\n devServers: ProcessInfo[];\n agents: ProcessInfo[];\n} {\n return {\n claude: processes.filter(p => p.type === 'claude'),\n hooks: processes.filter(p => p.type === 'hook'),\n devServers: processes.filter(p => p.type === 'dev-server'),\n agents: processes.filter(p => p.type === 'agent'),\n };\n}\n\nfunction formatCommand(cmd: string, maxLen = 45): string {\n // Extract meaningful part of command\n if (cmd.includes('claude')) {\n return truncate('claude (session)', maxLen);\n }\n if (cmd.includes('astro dev')) {\n return truncate('astro dev server', maxLen);\n }\n if (cmd.includes('squads')) {\n const match = cmd.match(/squads\\s+(\\S+)/);\n return truncate(`squads ${match?.[1] || 'command'}`, maxLen);\n }\n return truncate(cmd, maxLen);\n}\n\nexport async function workersCommand(options: { verbose?: boolean; kill?: string } = {}): Promise<void> {\n writeLine();\n writeLine(` ${gradient('squads')} ${colors.dim}workers${RESET}`);\n writeLine();\n\n // Kill a process if requested\n if (options.kill) {\n try {\n execSync(`kill ${options.kill}`, { stdio: 'pipe' });\n writeLine(` ${icons.success} Killed process ${colors.cyan}${options.kill}${RESET}`);\n writeLine();\n return;\n } catch {\n writeLine(` ${icons.error} Failed to kill process ${colors.red}${options.kill}${RESET}`);\n writeLine();\n return;\n }\n }\n\n const activeTasks = loadActiveTasks();\n const processes = getRunningProcesses();\n const categorized = categorizeProcesses(processes);\n\n // Summary stats\n const stats = [\n `${colors.cyan}${categorized.claude.length}${RESET} claude`,\n `${colors.green}${activeTasks.length}${RESET} tasks`,\n `${colors.purple}${categorized.devServers.length}${RESET} dev servers`,\n ].join(` ${colors.dim}│${RESET} `);\n writeLine(` ${stats}`);\n writeLine();\n\n // Claude sessions\n if (categorized.claude.length > 0) {\n writeLine(` ${bold}Claude Sessions${RESET} ${colors.dim}(terminal tabs)${RESET}`);\n writeLine();\n\n const w = { pid: 8, cpu: 6, mem: 6, time: 8, cmd: 30 };\n const tableWidth = w.pid + w.cpu + w.mem + w.time + w.cmd + 8;\n\n writeLine(` ${colors.purple}${box.topLeft}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.topRight}${RESET}`);\n writeLine(` ${colors.purple}${box.vertical}${RESET} ${bold}${padEnd('PID', w.pid)}${padEnd('CPU%', w.cpu)}${padEnd('MEM%', w.mem)}${padEnd('TIME', w.time)}${padEnd('STATUS', w.cmd)}${RESET} ${colors.purple}${box.vertical}${RESET}`);\n writeLine(` ${colors.purple}${box.teeRight}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.teeLeft}${RESET}`);\n\n for (const proc of categorized.claude) {\n const cpuColor = parseFloat(proc.cpu) > 50 ? colors.yellow : colors.dim;\n const status = parseFloat(proc.cpu) > 10 ? `${icons.active} active` : `${icons.pending} idle`;\n\n const row = ` ${colors.purple}${box.vertical}${RESET} ` +\n `${colors.cyan}${padEnd(proc.pid, w.pid)}${RESET}` +\n `${cpuColor}${padEnd(proc.cpu, w.cpu)}${RESET}` +\n `${colors.dim}${padEnd(proc.mem, w.mem)}${RESET}` +\n `${colors.dim}${padEnd(proc.time, w.time)}${RESET}` +\n `${padEnd(status, w.cmd)}` +\n ` ${colors.purple}${box.vertical}${RESET}`;\n writeLine(row);\n }\n\n writeLine(` ${colors.purple}${box.bottomLeft}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.bottomRight}${RESET}`);\n writeLine();\n }\n\n // Active tasks (registered via squads progress start)\n if (activeTasks.length > 0) {\n writeLine(` ${bold}Registered Tasks${RESET} ${colors.dim}(squads progress)${RESET}`);\n writeLine();\n\n for (const task of activeTasks) {\n const elapsed = getElapsedTime(task.startedAt);\n writeLine(` ${icons.progress} ${colors.cyan}${task.squad}${RESET} ${truncate(task.description, 40)}`);\n writeLine(` ${colors.dim}id: ${task.id} · started ${elapsed} ago${RESET}`);\n }\n writeLine();\n }\n\n // Dev servers\n if (categorized.devServers.length > 0) {\n writeLine(` ${bold}Dev Servers${RESET}`);\n writeLine();\n\n for (const proc of categorized.devServers) {\n const name = formatCommand(proc.command);\n writeLine(` ${icons.active} ${colors.green}${name}${RESET} ${colors.dim}(pid: ${proc.pid})${RESET}`);\n }\n writeLine();\n }\n\n // Hooks/squads processes\n if (categorized.hooks.length > 0) {\n writeLine(` ${bold}Hook Processes${RESET}`);\n writeLine();\n\n for (const proc of categorized.hooks) {\n const name = formatCommand(proc.command);\n writeLine(` ${icons.pending} ${colors.yellow}${name}${RESET} ${colors.dim}(pid: ${proc.pid})${RESET}`);\n }\n writeLine();\n }\n\n // No workers message\n if (categorized.claude.length === 0 && activeTasks.length === 0) {\n writeLine(` ${colors.dim}No active workers${RESET}`);\n writeLine();\n }\n\n // Commands\n writeLine(` ${colors.dim}$${RESET} squads workers --kill <pid> ${colors.dim}Kill a process${RESET}`);\n writeLine(` ${colors.dim}$${RESET} squads progress ${colors.dim}Task history${RESET}`);\n writeLine();\n}\n\nfunction getElapsedTime(startTime: string): string {\n const start = new Date(startTime).getTime();\n const now = Date.now();\n const diffMs = now - start;\n\n const minutes = Math.floor(diffMs / 60000);\n const hours = Math.floor(minutes / 60);\n const days = Math.floor(hours / 24);\n\n if (days > 0) return `${days}d`;\n if (hours > 0) return `${hours}h`;\n if (minutes > 0) return `${minutes}m`;\n return '<1m';\n}\n"],"mappings":"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","names":["existsSync","join","homedir","chalk","repos","existsSync","join","config","config","existsSync","ora","join","dirname","existsSync","readFileSync","writeFileSync","mkdirSync","readFileSync","existsSync","writeFileSync","join","progress","goal","readFileSync","writeFileSync","existsSync","readdirSync","mkdirSync","join","statSync","join","dirname","existsSync","mkdirSync","readFileSync","writeFileSync","ora","existsSync","join","join","existsSync","execSync","existsSync","readFileSync","writeFileSync","mkdirSync","readdirSync","join","join","existsSync","readFileSync","writeFileSync","execSync","mkdirSync","readdirSync","goal","progress","readFileSync","writeFileSync","existsSync","mkdirSync","readdirSync","join","dirname","join","existsSync","readFileSync","feedback","dirname","mkdirSync","writeFileSync","readdirSync","readdirSync","existsSync","statSync","join","homedir","require","pool","join","existsSync","readdirSync","statSync","activeGoals","totalGoals","completedGoals","goal","homedir","totalCalls","execSync","execSync","execSync","spawn","ora","DEFAULT_ORG","DEFAULT_REPOS","execSync","ora","spawn","execSync","spawn","readdirSync","join","ora","readdirSync","join","ora","execSync","executeClaudePrompt","spawn","chalk","ora","existsSync","readFileSync","writeFileSync","mkdirSync","join","homedir","chalk","ora","execSync","existsSync","readFileSync","writeFileSync","mkdirSync","join","join","existsSync","mkdirSync","readFileSync","writeFileSync","execSync","execSync","execSync","getGitHubStats","goal","execSync","existsSync","readFileSync","join","getTasksFilePath","join","existsSync","readFileSync","execSync","getElapsedTime","join","homedir","existsSync","chalk"]}
|