panopticon-cli 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +242 -0
- package/dist/chunk-FR2P66GU.js +352 -0
- package/dist/chunk-FR2P66GU.js.map +1 -0
- package/dist/cli/index.d.ts +1 -0
- package/dist/cli/index.js +3439 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/index.d.ts +108 -0
- package/dist/index.js +69 -0
- package/dist/index.js.map +1 -0
- package/package.json +69 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/cli/index.ts","../../src/cli/commands/init.ts","../../src/cli/commands/sync.ts","../../src/cli/commands/restore.ts","../../src/cli/commands/skills.ts","../../src/cli/commands/work/issue.ts","../../src/lib/agents.ts","../../src/lib/tmux.ts","../../src/lib/hooks.ts","../../src/lib/cv.ts","../../src/cli/commands/work/status.ts","../../src/cli/commands/work/tell.ts","../../src/cli/commands/work/kill.ts","../../src/cli/commands/work/pending.ts","../../src/cli/commands/work/approve.ts","../../src/cli/commands/work/plan.ts","../../src/cli/commands/work/list.ts","../../src/cli/commands/work/triage.ts","../../src/cli/commands/work/hook.ts","../../src/cli/commands/work/recover.ts","../../src/cli/commands/work/cv.ts","../../src/cli/commands/work/context.ts","../../src/lib/context.ts","../../src/cli/commands/work/health.ts","../../src/lib/health.ts","../../src/cli/commands/work/index.ts","../../src/cli/commands/workspace.ts","../../src/lib/worktree.ts","../../src/lib/template.ts","../../src/lib/skills-merge.ts","../../src/cli/commands/install.ts","../../src/cli/commands/project.ts","../../src/cli/commands/doctor.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { Command } from 'commander';\nimport chalk from 'chalk';\nimport { initCommand } from './commands/init.js';\nimport { syncCommand } from './commands/sync.js';\nimport { restoreCommand } from './commands/restore.js';\nimport { skillsCommand } from './commands/skills.js';\nimport { registerWorkCommands, statusCommand } from './commands/work/index.js';\nimport { registerWorkspaceCommands } from './commands/workspace.js';\nimport { registerInstallCommand } from './commands/install.js';\nimport { projectAddCommand, projectListCommand, projectRemoveCommand } from './commands/project.js';\nimport { doctorCommand } from './commands/doctor.js';\n\nconst program = new Command();\n\nprogram\n .name('pan')\n .description('Multi-agent orchestration for AI coding assistants')\n .version('0.1.0');\n\nprogram\n .command('init')\n .description('Initialize Panopticon (~/.panopticon/)')\n .action(initCommand);\n\nprogram\n .command('sync')\n .description('Sync skills/commands to AI tools')\n .option('--dry-run', 'Show what would be synced')\n .option('--force', 'Overwrite without prompts')\n .option('--backup-only', 'Only create backup')\n .action(syncCommand);\n\nprogram\n .command('restore [timestamp]')\n .description('Restore from backup')\n .action(restoreCommand);\n\nprogram\n .command('skills')\n .description('List and manage skills')\n .option('--json', 'Output as JSON')\n .action(skillsCommand);\n\n// Register work commands (pan work issue, pan work status, etc.)\nregisterWorkCommands(program);\n\n// Register workspace commands (pan workspace create, pan workspace list, etc.)\nregisterWorkspaceCommands(program);\n\n// Register install command\nregisterInstallCommand(program);\n\n// Shorthand: pan status = pan work status\nprogram\n .command('status')\n .description('Show running agents (shorthand for work status)')\n .option('--json', 'Output as JSON')\n .action(statusCommand);\n\n// Dashboard commands\nprogram\n .command('up')\n .description('Start dashboard')\n .option('--detach', 'Run in background')\n .action(async (options) => {\n const { spawn, execSync } = await import('child_process');\n const { join, dirname } = await import('path');\n const { fileURLToPath } = await import('url');\n\n // Find dashboard directory relative to CLI\n const __dirname = dirname(fileURLToPath(import.meta.url));\n const dashboardDir = join(__dirname, '..', 'dashboard');\n\n console.log(chalk.bold('Starting Panopticon dashboard...\\n'));\n\n if (options.detach) {\n // Run in background\n const child = spawn('npm', ['run', 'dev'], {\n cwd: dashboardDir,\n detached: true,\n stdio: 'ignore',\n });\n child.unref();\n console.log(chalk.green('Dashboard started in background'));\n console.log(`Frontend: ${chalk.cyan('http://localhost:3001')}`);\n console.log(`API: ${chalk.cyan('http://localhost:3002')}`);\n } else {\n // Run in foreground\n console.log(`Frontend: ${chalk.cyan('http://localhost:3001')}`);\n console.log(`API: ${chalk.cyan('http://localhost:3002')}`);\n console.log(chalk.dim('\\nPress Ctrl+C to stop\\n'));\n\n const child = spawn('npm', ['run', 'dev'], {\n cwd: dashboardDir,\n stdio: 'inherit',\n });\n\n child.on('error', (err) => {\n console.error(chalk.red('Failed to start dashboard:'), err.message);\n process.exit(1);\n });\n }\n });\n\nprogram\n .command('down')\n .description('Stop dashboard')\n .action(async () => {\n const { execSync } = await import('child_process');\n try {\n // Kill processes on dashboard ports\n execSync('lsof -ti:3001 | xargs kill -9 2>/dev/null || true', { stdio: 'pipe' });\n execSync('lsof -ti:3002 | xargs kill -9 2>/dev/null || true', { stdio: 'pipe' });\n console.log(chalk.green('Dashboard stopped'));\n } catch {\n console.log(chalk.dim('No dashboard processes found'));\n }\n });\n\n// Project management commands\nconst project = program.command('project').description('Project management');\n\nproject\n .command('add <path>')\n .description('Register a project with Panopticon')\n .option('--name <name>', 'Project name')\n .option('--type <type>', 'Project type (standalone/monorepo)', 'standalone')\n .option('--linear-team <team>', 'Linear team prefix')\n .action(projectAddCommand);\n\nproject\n .command('list')\n .description('List all managed projects')\n .option('--json', 'Output as JSON')\n .action(projectListCommand);\n\nproject\n .command('remove <nameOrPath>')\n .description('Remove a project from Panopticon')\n .action(projectRemoveCommand);\n\n// Doctor command\nprogram\n .command('doctor')\n .description('Check system health and dependencies')\n .action(doctorCommand);\n\n// Parse and execute\nprogram.parse();\n","import { existsSync, mkdirSync } from 'fs';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport { INIT_DIRS, CONFIG_FILE, PANOPTICON_HOME } from '../../lib/paths.js';\nimport { getDefaultConfig, saveConfig } from '../../lib/config.js';\nimport { detectShell, getShellRcFile, addAlias, getAliasInstructions } from '../../lib/shell.js';\n\nexport async function initCommand(): Promise<void> {\n const spinner = ora('Initializing Panopticon...').start();\n\n // Check if already initialized\n if (existsSync(CONFIG_FILE)) {\n spinner.info('Panopticon already initialized');\n console.log(chalk.dim(` Config: ${CONFIG_FILE}`));\n console.log(chalk.dim(` Home: ${PANOPTICON_HOME}`));\n return;\n }\n\n try {\n // Create all directories\n for (const dir of INIT_DIRS) {\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n }\n spinner.text = 'Created directories...';\n\n // Write default config\n const config = getDefaultConfig();\n saveConfig(config);\n spinner.text = 'Created config...';\n\n // Detect shell and add alias\n const shell = detectShell();\n const rcFile = getShellRcFile(shell);\n\n if (rcFile && existsSync(rcFile)) {\n addAlias(rcFile);\n spinner.succeed('Panopticon initialized!');\n console.log('');\n console.log(chalk.green('✓') + ' Created ' + chalk.cyan(PANOPTICON_HOME));\n console.log(chalk.green('✓') + ' Created ' + chalk.cyan(CONFIG_FILE));\n console.log(chalk.green('✓') + ' ' + getAliasInstructions(shell));\n } else {\n spinner.succeed('Panopticon initialized!');\n console.log('');\n console.log(chalk.green('✓') + ' Created ' + chalk.cyan(PANOPTICON_HOME));\n console.log(chalk.green('✓') + ' Created ' + chalk.cyan(CONFIG_FILE));\n console.log(chalk.yellow('!') + ' Could not detect shell. Add alias manually:');\n console.log(chalk.dim(' alias pan=\"panopticon\"'));\n }\n\n console.log('');\n console.log('Next steps:');\n console.log(chalk.dim(' 1. Add skills to ~/.panopticon/skills/'));\n console.log(chalk.dim(' 2. Run: pan sync'));\n\n } catch (error: any) {\n spinner.fail('Failed to initialize');\n console.error(chalk.red(error.message));\n process.exit(1);\n }\n}\n","import chalk from 'chalk';\nimport ora from 'ora';\nimport { loadConfig } from '../../lib/config.js';\nimport { createBackup } from '../../lib/backup.js';\nimport { planSync, executeSync } from '../../lib/sync.js';\nimport { SYNC_TARGETS, Runtime } from '../../lib/paths.js';\n\ninterface SyncOptions {\n dryRun?: boolean;\n force?: boolean;\n backupOnly?: boolean;\n}\n\nexport async function syncCommand(options: SyncOptions): Promise<void> {\n const config = loadConfig();\n const targets = config.sync.targets as Runtime[];\n\n if (targets.length === 0) {\n console.log(chalk.yellow('No sync targets configured.'));\n console.log(chalk.dim('Edit ~/.panopticon/config.toml to add targets.'));\n return;\n }\n\n // Dry run mode\n if (options.dryRun) {\n console.log(chalk.bold('Sync Plan (dry run):\\n'));\n\n for (const runtime of targets) {\n const plan = planSync(runtime);\n\n console.log(chalk.cyan(`${runtime}:`));\n\n if (plan.skills.length === 0 && plan.commands.length === 0) {\n console.log(chalk.dim(' (nothing to sync)'));\n continue;\n }\n\n for (const item of plan.skills) {\n const icon = item.status === 'conflict' ? chalk.yellow('!') : chalk.green('+');\n const status = item.status === 'conflict' ? chalk.yellow('[conflict]') : '';\n console.log(` ${icon} skill/${item.name} ${status}`);\n }\n\n for (const item of plan.commands) {\n const icon = item.status === 'conflict' ? chalk.yellow('!') : chalk.green('+');\n const status = item.status === 'conflict' ? chalk.yellow('[conflict]') : '';\n console.log(` ${icon} command/${item.name} ${status}`);\n }\n\n console.log('');\n }\n\n console.log(chalk.dim('Run without --dry-run to apply changes.'));\n return;\n }\n\n // Create backup if enabled\n if (config.sync.backup_before_sync) {\n const spinner = ora('Creating backup...').start();\n\n const backupDirs = targets.flatMap((r) => [\n SYNC_TARGETS[r].skills,\n SYNC_TARGETS[r].commands,\n ]);\n\n const backup = createBackup(backupDirs);\n\n if (backup.targets.length > 0) {\n spinner.succeed(`Backup created: ${backup.timestamp}`);\n } else {\n spinner.info('No existing content to backup');\n }\n\n if (options.backupOnly) {\n return;\n }\n }\n\n // Execute sync\n const spinner = ora('Syncing...').start();\n\n let totalCreated = 0;\n let totalConflicts = 0;\n\n for (const runtime of targets) {\n spinner.text = `Syncing to ${runtime}...`;\n\n const result = executeSync(runtime, { force: options.force });\n\n totalCreated += result.created.length;\n totalConflicts += result.conflicts.length;\n\n if (result.conflicts.length > 0 && !options.force) {\n console.log('');\n console.log(chalk.yellow(`Conflicts in ${runtime}:`));\n for (const name of result.conflicts) {\n console.log(chalk.dim(` - ${name} (use --force to overwrite)`));\n }\n }\n }\n\n if (totalConflicts > 0 && !options.force) {\n spinner.warn(`Synced ${totalCreated} items, ${totalConflicts} conflicts`);\n console.log('');\n console.log(chalk.dim('Use --force to overwrite conflicting items.'));\n } else {\n spinner.succeed(`Synced ${totalCreated} items to ${targets.join(', ')}`);\n }\n}\n","import chalk from 'chalk';\nimport ora from 'ora';\nimport inquirer from 'inquirer';\nimport { listBackups, restoreBackup } from '../../lib/backup.js';\nimport { loadConfig } from '../../lib/config.js';\nimport { SYNC_TARGETS, Runtime } from '../../lib/paths.js';\n\nexport async function restoreCommand(timestamp?: string): Promise<void> {\n const backups = listBackups();\n\n if (backups.length === 0) {\n console.log(chalk.yellow('No backups found.'));\n return;\n }\n\n // If no timestamp provided, let user choose\n if (!timestamp) {\n console.log(chalk.bold('Available backups:\\n'));\n\n for (const backup of backups.slice(0, 10)) {\n console.log(` ${chalk.cyan(backup.timestamp)} - ${backup.targets.join(', ')}`);\n }\n\n if (backups.length > 10) {\n console.log(chalk.dim(` ... and ${backups.length - 10} more`));\n }\n\n console.log('');\n\n const { selected } = await inquirer.prompt([\n {\n type: 'list',\n name: 'selected',\n message: 'Select backup to restore:',\n choices: backups.slice(0, 10).map((b) => ({\n name: `${b.timestamp} (${b.targets.join(', ')})`,\n value: b.timestamp,\n })),\n },\n ]);\n\n timestamp = selected;\n }\n\n // Confirm restore\n const { confirm } = await inquirer.prompt([\n {\n type: 'confirm',\n name: 'confirm',\n message: `Restore backup ${timestamp}? This will overwrite current files.`,\n default: false,\n },\n ]);\n\n if (!confirm) {\n console.log(chalk.dim('Restore cancelled.'));\n return;\n }\n\n const spinner = ora('Restoring backup...').start();\n\n try {\n const config = loadConfig();\n const targets = config.sync.targets as Runtime[];\n\n // Build target dirs map\n const targetDirs: Record<string, string> = {};\n\n for (const runtime of targets) {\n targetDirs[`${runtime}-skills`] = SYNC_TARGETS[runtime].skills;\n targetDirs[`${runtime}-commands`] = SYNC_TARGETS[runtime].commands;\n // Also try simple names for backwards compatibility\n targetDirs['skills'] = SYNC_TARGETS[runtime].skills;\n targetDirs['commands'] = SYNC_TARGETS[runtime].commands;\n }\n\n restoreBackup(timestamp!, targetDirs);\n\n spinner.succeed(`Restored backup: ${timestamp}`);\n\n } catch (error: any) {\n spinner.fail('Failed to restore');\n console.error(chalk.red(error.message));\n process.exit(1);\n }\n}\n","import { readdirSync, readFileSync, existsSync } from 'fs';\nimport { join } from 'path';\nimport chalk from 'chalk';\nimport { SKILLS_DIR } from '../../lib/paths.js';\n\nexport interface SkillMeta {\n name: string;\n description: string;\n path: string;\n}\n\nfunction parseSkillFrontmatter(content: string): { name?: string; description?: string } {\n const match = content.match(/^---\\n([\\s\\S]*?)\\n---/);\n if (!match) return {};\n\n const frontmatter = match[1];\n const name = frontmatter.match(/name:\\s*(.+)/)?.[1]?.trim();\n const description = frontmatter.match(/description:\\s*(.+)/)?.[1]?.trim();\n\n return { name, description };\n}\n\nexport function listSkills(): SkillMeta[] {\n if (!existsSync(SKILLS_DIR)) return [];\n\n const skills: SkillMeta[] = [];\n const dirs = readdirSync(SKILLS_DIR, { withFileTypes: true })\n .filter(d => d.isDirectory());\n\n for (const dir of dirs) {\n const skillFile = join(SKILLS_DIR, dir.name, 'SKILL.md');\n if (!existsSync(skillFile)) continue;\n\n const content = readFileSync(skillFile, 'utf8');\n const { name, description } = parseSkillFrontmatter(content);\n\n skills.push({\n name: name || dir.name,\n description: description || '(no description)',\n path: skillFile,\n });\n }\n\n return skills.sort((a, b) => a.name.localeCompare(b.name));\n}\n\nexport async function skillsCommand(options: { json?: boolean }): Promise<void> {\n const skills = listSkills();\n\n if (options.json) {\n console.log(JSON.stringify(skills, null, 2));\n return;\n }\n\n console.log(chalk.bold(`\\nPanopticon Skills (${skills.length})\\n`));\n\n if (skills.length === 0) {\n console.log(chalk.yellow('No skills found.'));\n console.log(chalk.dim('Skills should be in ~/.panopticon/skills/<name>/SKILL.md'));\n return;\n }\n\n for (const skill of skills) {\n console.log(chalk.cyan(skill.name));\n console.log(chalk.dim(` ${skill.description}`));\n }\n\n console.log(`\\n${chalk.dim('Run \"pan sync\" to sync skills to Claude Code')}`);\n}\n","import chalk from 'chalk';\nimport ora from 'ora';\nimport { spawnAgent } from '../../../lib/agents.js';\n\ninterface IssueOptions {\n model: string;\n runtime: string;\n dryRun?: boolean;\n}\n\nexport async function issueCommand(id: string, options: IssueOptions): Promise<void> {\n const spinner = ora(`Preparing workspace for ${id}...`).start();\n\n try {\n // Normalize issue ID (MIN-648 -> min-648 for tmux session name)\n const normalizedId = id.toLowerCase();\n\n // For now, use current directory as workspace\n // Phase 5 will add proper workspace creation with worktrees\n const workspace = process.cwd();\n\n if (options.dryRun) {\n spinner.info('Dry run mode');\n console.log('');\n console.log(chalk.bold('Would create:'));\n console.log(` Agent ID: agent-${normalizedId}`);\n console.log(` Workspace: ${workspace}`);\n console.log(` Runtime: ${options.runtime}`);\n console.log(` Model: ${options.model}`);\n return;\n }\n\n spinner.text = 'Spawning agent...';\n\n const agent = spawnAgent({\n issueId: id,\n workspace,\n runtime: options.runtime,\n model: options.model,\n prompt: `You are working on issue ${id}. Check beads for context: bd show ${id}`,\n });\n\n spinner.succeed(`Agent spawned: ${agent.id}`);\n\n console.log('');\n console.log(chalk.bold('Agent Details:'));\n console.log(` Session: ${chalk.cyan(agent.id)}`);\n console.log(` Workspace: ${workspace}`);\n console.log(` Runtime: ${agent.runtime} (${agent.model})`);\n console.log('');\n console.log(chalk.dim('Commands:'));\n console.log(` Attach: tmux attach -t ${agent.id}`);\n console.log(` Message: pan work tell ${id} \"your message\"`);\n console.log(` Kill: pan work kill ${id}`);\n\n } catch (error: any) {\n spinner.fail(error.message);\n process.exit(1);\n }\n}\n","import { existsSync, mkdirSync, writeFileSync, readFileSync, readdirSync } from 'fs';\nimport { join } from 'path';\nimport { AGENTS_DIR } from './paths.js';\nimport { createSession, killSession, sendKeys, sessionExists, getAgentSessions } from './tmux.js';\nimport { initHook, checkHook, generateGUPPPrompt } from './hooks.js';\nimport { startWork, completeWork, getAgentCV } from './cv.js';\n\nexport interface AgentState {\n id: string;\n issueId: string;\n workspace: string;\n runtime: string;\n model: string;\n status: 'starting' | 'running' | 'stopped' | 'error';\n startedAt: string;\n lastActivity?: string;\n}\n\nexport function getAgentDir(agentId: string): string {\n return join(AGENTS_DIR, agentId);\n}\n\nexport function getAgentState(agentId: string): AgentState | null {\n const stateFile = join(getAgentDir(agentId), 'state.json');\n if (!existsSync(stateFile)) return null;\n\n const content = readFileSync(stateFile, 'utf8');\n return JSON.parse(content);\n}\n\nexport function saveAgentState(state: AgentState): void {\n const dir = getAgentDir(state.id);\n mkdirSync(dir, { recursive: true });\n\n writeFileSync(\n join(dir, 'state.json'),\n JSON.stringify(state, null, 2)\n );\n}\n\nexport interface SpawnOptions {\n issueId: string;\n workspace: string;\n runtime?: string;\n model?: string;\n prompt?: string;\n}\n\nexport function spawnAgent(options: SpawnOptions): AgentState {\n const agentId = `agent-${options.issueId.toLowerCase()}`;\n\n // Check if already running\n if (sessionExists(agentId)) {\n throw new Error(`Agent ${agentId} already running. Use 'pan work tell' to message it.`);\n }\n\n // Initialize hook for this agent (GUPP support)\n initHook(agentId);\n\n // Create state\n const state: AgentState = {\n id: agentId,\n issueId: options.issueId,\n workspace: options.workspace,\n runtime: options.runtime || 'claude',\n model: options.model || 'sonnet',\n status: 'starting',\n startedAt: new Date().toISOString(),\n };\n\n saveAgentState(state);\n\n // Build prompt with GUPP work if available\n let prompt = options.prompt || '';\n\n // GUPP: Check for pending work on hook\n const { hasWork, items } = checkHook(agentId);\n if (hasWork) {\n const guppPrompt = generateGUPPPrompt(agentId);\n if (guppPrompt) {\n prompt = guppPrompt + '\\n\\n---\\n\\n' + prompt;\n }\n }\n\n // Create tmux session with claude command\n const claudeCmd = prompt\n ? `claude --model ${state.model} \"${prompt.replace(/\"/g, '\\\\\"').replace(/\\n/g, '\\\\n')}\"`\n : `claude --model ${state.model}`;\n\n createSession(agentId, options.workspace, claudeCmd);\n\n // Update status\n state.status = 'running';\n saveAgentState(state);\n\n // Track work in CV\n startWork(agentId, options.issueId);\n\n return state;\n}\n\nexport function listRunningAgents(): (AgentState & { tmuxActive: boolean })[] {\n const tmuxSessions = getAgentSessions();\n const tmuxNames = new Set(tmuxSessions.map(s => s.name));\n\n const agents: (AgentState & { tmuxActive: boolean })[] = [];\n\n // Read all agent states\n if (!existsSync(AGENTS_DIR)) return agents;\n\n const dirs = readdirSync(AGENTS_DIR, { withFileTypes: true })\n .filter(d => d.isDirectory());\n\n for (const dir of dirs) {\n const state = getAgentState(dir.name);\n if (state) {\n agents.push({\n ...state,\n tmuxActive: tmuxNames.has(state.id),\n });\n }\n }\n\n return agents;\n}\n\nexport function stopAgent(agentId: string): void {\n // Normalize agent ID\n const normalizedId = agentId.startsWith('agent-') ? agentId : `agent-${agentId.toLowerCase()}`;\n\n if (sessionExists(normalizedId)) {\n killSession(normalizedId);\n }\n\n const state = getAgentState(normalizedId);\n if (state) {\n state.status = 'stopped';\n saveAgentState(state);\n }\n}\n\nexport function messageAgent(agentId: string, message: string): void {\n // Normalize agent ID\n const normalizedId = agentId.startsWith('agent-') ? agentId : `agent-${agentId.toLowerCase()}`;\n\n if (!sessionExists(normalizedId)) {\n throw new Error(`Agent ${normalizedId} not running`);\n }\n\n sendKeys(normalizedId, message);\n\n // Also save to mail queue\n const mailDir = join(getAgentDir(normalizedId), 'mail');\n mkdirSync(mailDir, { recursive: true });\n\n const timestamp = new Date().toISOString().replace(/[:.]/g, '-');\n writeFileSync(\n join(mailDir, `${timestamp}.md`),\n `# Message\\n\\n${message}\\n`\n );\n}\n\n/**\n * Detect crashed agents (state shows running but tmux session is gone)\n */\nexport function detectCrashedAgents(): AgentState[] {\n const agents = listRunningAgents();\n return agents.filter(\n (agent) => agent.status === 'running' && !agent.tmuxActive\n );\n}\n\n/**\n * Recover a crashed agent by restarting it with context\n */\nexport function recoverAgent(agentId: string): AgentState | null {\n const normalizedId = agentId.startsWith('agent-') ? agentId : `agent-${agentId.toLowerCase()}`;\n const state = getAgentState(normalizedId);\n\n if (!state) {\n return null;\n }\n\n // Check if already running\n if (sessionExists(normalizedId)) {\n return state;\n }\n\n // Update crash count in health file\n const healthFile = join(getAgentDir(normalizedId), 'health.json');\n let health = { consecutiveFailures: 0, killCount: 0, recoveryCount: 0 };\n if (existsSync(healthFile)) {\n try {\n health = { ...health, ...JSON.parse(readFileSync(healthFile, 'utf-8')) };\n } catch {}\n }\n health.recoveryCount = (health.recoveryCount || 0) + 1;\n writeFileSync(healthFile, JSON.stringify(health, null, 2));\n\n // Build recovery prompt\n const recoveryPrompt = generateRecoveryPrompt(state);\n\n // Restart the agent with recovery context\n const claudeCmd = `claude --model ${state.model} \"${recoveryPrompt.replace(/\"/g, '\\\\\"').replace(/\\n/g, '\\\\n')}\"`;\n createSession(normalizedId, state.workspace, claudeCmd);\n\n // Update state\n state.status = 'running';\n state.lastActivity = new Date().toISOString();\n saveAgentState(state);\n\n return state;\n}\n\n/**\n * Generate a recovery prompt for a crashed agent\n */\nfunction generateRecoveryPrompt(state: AgentState): string {\n const lines: string[] = [\n '# Agent Recovery',\n '',\n '⚠️ This agent session was recovered after a crash.',\n '',\n '## Previous Context',\n `- Issue: ${state.issueId}`,\n `- Workspace: ${state.workspace}`,\n `- Started: ${state.startedAt}`,\n '',\n '## Recovery Steps',\n '1. Check beads for context: `bd show ' + state.issueId + '`',\n '2. Review recent git commits: `git log --oneline -10`',\n '3. Check hook for pending work: `pan work hook check`',\n '4. Resume from last known state',\n '',\n '## GUPP Reminder',\n '> \"If there is work on your Hook, YOU MUST RUN IT.\"',\n '',\n ];\n\n // Add GUPP work if available\n const { hasWork } = checkHook(state.id);\n if (hasWork) {\n const guppPrompt = generateGUPPPrompt(state.id);\n if (guppPrompt) {\n lines.push('---');\n lines.push('');\n lines.push(guppPrompt);\n }\n }\n\n return lines.join('\\n');\n}\n\n/**\n * Auto-recover all crashed agents\n */\nexport function autoRecoverAgents(): { recovered: string[]; failed: string[] } {\n const crashed = detectCrashedAgents();\n const recovered: string[] = [];\n const failed: string[] = [];\n\n for (const agent of crashed) {\n try {\n const result = recoverAgent(agent.id);\n if (result) {\n recovered.push(agent.id);\n } else {\n failed.push(agent.id);\n }\n } catch (error) {\n failed.push(agent.id);\n }\n }\n\n return { recovered, failed };\n}\n","import { execSync } from 'child_process';\n\nexport interface TmuxSession {\n name: string;\n created: Date;\n attached: boolean;\n windows: number;\n}\n\nexport function listSessions(): TmuxSession[] {\n try {\n const output = execSync('tmux list-sessions -F \"#{session_name}|#{session_created}|#{session_attached}|#{session_windows}\"', {\n encoding: 'utf8',\n });\n\n return output.trim().split('\\n').filter(Boolean).map(line => {\n const [name, created, attached, windows] = line.split('|');\n return {\n name,\n created: new Date(parseInt(created) * 1000),\n attached: attached === '1',\n windows: parseInt(windows),\n };\n });\n } catch {\n return []; // No sessions\n }\n}\n\nexport function sessionExists(name: string): boolean {\n try {\n execSync(`tmux has-session -t ${name} 2>/dev/null`);\n return true;\n } catch {\n return false;\n }\n}\n\nexport function createSession(name: string, cwd: string, initialCommand?: string): void {\n const escapedCwd = cwd.replace(/\"/g, '\\\\\"');\n const cmd = initialCommand\n ? `tmux new-session -d -s ${name} -c \"${escapedCwd}\" \"${initialCommand.replace(/\"/g, '\\\\\"')}\"`\n : `tmux new-session -d -s ${name} -c \"${escapedCwd}\"`;\n\n execSync(cmd);\n}\n\nexport function killSession(name: string): void {\n execSync(`tmux kill-session -t ${name}`);\n}\n\nexport function sendKeys(sessionName: string, keys: string): void {\n // CRITICAL: Send keys and Enter as separate commands\n // This is the correct way - combining them doesn't work\n const escapedKeys = keys.replace(/\"/g, '\\\\\"');\n execSync(`tmux send-keys -t ${sessionName} \"${escapedKeys}\"`);\n execSync(`tmux send-keys -t ${sessionName} Enter`);\n}\n\nexport function capturePane(sessionName: string, lines: number = 50): string {\n try {\n return execSync(`tmux capture-pane -t ${sessionName} -p -S -${lines}`, {\n encoding: 'utf8',\n });\n } catch {\n return '';\n }\n}\n\nexport function getAgentSessions(): TmuxSession[] {\n return listSessions().filter(s => s.name.startsWith('agent-'));\n}\n","/**\n * GUPP Hooks System\n *\n * \"If there is work on your Hook, YOU MUST RUN IT.\"\n *\n * Hooks are persistent work queues for agents. When an agent starts,\n * it checks its hook for pending work and executes immediately.\n */\n\nimport { existsSync, mkdirSync, readFileSync, writeFileSync, readdirSync, unlinkSync } from 'fs';\nimport { join } from 'path';\nimport { AGENTS_DIR } from './paths.js';\n\nexport interface HookItem {\n id: string;\n type: 'task' | 'message' | 'notification';\n priority: 'urgent' | 'high' | 'normal' | 'low';\n source: string;\n payload: {\n issueId?: string;\n message?: string;\n action?: string;\n context?: Record<string, any>;\n };\n createdAt: string;\n expiresAt?: string;\n}\n\nexport interface Hook {\n agentId: string;\n items: HookItem[];\n lastChecked?: string;\n}\n\nfunction getHookDir(agentId: string): string {\n return join(AGENTS_DIR, agentId);\n}\n\nfunction getHookFile(agentId: string): string {\n return join(getHookDir(agentId), 'hook.json');\n}\n\nfunction getMailDir(agentId: string): string {\n return join(getHookDir(agentId), 'mail');\n}\n\n/**\n * Initialize hook structure for an agent\n */\nexport function initHook(agentId: string): void {\n const hookDir = getHookDir(agentId);\n const mailDir = getMailDir(agentId);\n\n mkdirSync(hookDir, { recursive: true });\n mkdirSync(mailDir, { recursive: true });\n\n const hookFile = getHookFile(agentId);\n if (!existsSync(hookFile)) {\n const hook: Hook = {\n agentId,\n items: [],\n };\n writeFileSync(hookFile, JSON.stringify(hook, null, 2));\n }\n}\n\n/**\n * Get the hook for an agent\n */\nexport function getHook(agentId: string): Hook | null {\n const hookFile = getHookFile(agentId);\n if (!existsSync(hookFile)) {\n return null;\n }\n\n try {\n const content = readFileSync(hookFile, 'utf-8');\n return JSON.parse(content);\n } catch {\n return null;\n }\n}\n\n/**\n * Add work to an agent's hook (GUPP trigger)\n */\nexport function pushToHook(agentId: string, item: Omit<HookItem, 'id' | 'createdAt'>): HookItem {\n initHook(agentId);\n\n const hook = getHook(agentId) || { agentId, items: [] };\n\n const newItem: HookItem = {\n ...item,\n id: `hook-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`,\n createdAt: new Date().toISOString(),\n };\n\n hook.items.push(newItem);\n writeFileSync(getHookFile(agentId), JSON.stringify(hook, null, 2));\n\n return newItem;\n}\n\n/**\n * Check if agent has pending work (GUPP check)\n */\nexport function checkHook(agentId: string): { hasWork: boolean; urgentCount: number; items: HookItem[] } {\n const hook = getHook(agentId);\n\n if (!hook || hook.items.length === 0) {\n // Also check mail directory for incoming messages\n const mailDir = getMailDir(agentId);\n if (existsSync(mailDir)) {\n const mails = readdirSync(mailDir).filter((f) => f.endsWith('.json'));\n if (mails.length > 0) {\n // Convert mail to hook items\n const mailItems: HookItem[] = mails.map((file) => {\n try {\n const content = readFileSync(join(mailDir, file), 'utf-8');\n return JSON.parse(content);\n } catch {\n return null;\n }\n }).filter(Boolean) as HookItem[];\n\n return {\n hasWork: mailItems.length > 0,\n urgentCount: mailItems.filter((i) => i.priority === 'urgent').length,\n items: mailItems,\n };\n }\n }\n\n return { hasWork: false, urgentCount: 0, items: [] };\n }\n\n // Filter out expired items\n const now = new Date();\n const activeItems = hook.items.filter((item) => {\n if (item.expiresAt) {\n return new Date(item.expiresAt) > now;\n }\n return true;\n });\n\n // Sort by priority: urgent > high > normal > low\n const priorityOrder = { urgent: 0, high: 1, normal: 2, low: 3 };\n activeItems.sort((a, b) => priorityOrder[a.priority] - priorityOrder[b.priority]);\n\n return {\n hasWork: activeItems.length > 0,\n urgentCount: activeItems.filter((i) => i.priority === 'urgent').length,\n items: activeItems,\n };\n}\n\n/**\n * Pop the next work item from hook (after execution)\n */\nexport function popFromHook(agentId: string, itemId: string): boolean {\n const hook = getHook(agentId);\n if (!hook) return false;\n\n const index = hook.items.findIndex((i) => i.id === itemId);\n if (index === -1) return false;\n\n hook.items.splice(index, 1);\n hook.lastChecked = new Date().toISOString();\n writeFileSync(getHookFile(agentId), JSON.stringify(hook, null, 2));\n\n return true;\n}\n\n/**\n * Clear all items from hook\n */\nexport function clearHook(agentId: string): void {\n const hook = getHook(agentId);\n if (!hook) return;\n\n hook.items = [];\n hook.lastChecked = new Date().toISOString();\n writeFileSync(getHookFile(agentId), JSON.stringify(hook, null, 2));\n}\n\n/**\n * Send a message to an agent's mailbox\n */\nexport function sendMail(\n toAgentId: string,\n from: string,\n message: string,\n priority: HookItem['priority'] = 'normal'\n): void {\n initHook(toAgentId);\n const mailDir = getMailDir(toAgentId);\n\n const mailItem: HookItem = {\n id: `mail-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`,\n type: 'message',\n priority,\n source: from,\n payload: { message },\n createdAt: new Date().toISOString(),\n };\n\n writeFileSync(\n join(mailDir, `${mailItem.id}.json`),\n JSON.stringify(mailItem, null, 2)\n );\n}\n\n/**\n * Get and clear mail for an agent\n */\nexport function collectMail(agentId: string): HookItem[] {\n const mailDir = getMailDir(agentId);\n if (!existsSync(mailDir)) return [];\n\n const mails: HookItem[] = [];\n const files = readdirSync(mailDir).filter((f) => f.endsWith('.json'));\n\n for (const file of files) {\n const filePath = join(mailDir, file);\n try {\n const content = readFileSync(filePath, 'utf-8');\n mails.push(JSON.parse(content));\n unlinkSync(filePath); // Remove after reading\n } catch {\n // Skip invalid mail\n }\n }\n\n return mails;\n}\n\n/**\n * Generate GUPP prompt for agent startup\n */\nexport function generateGUPPPrompt(agentId: string): string | null {\n const { hasWork, urgentCount, items } = checkHook(agentId);\n\n if (!hasWork) return null;\n\n const lines: string[] = [\n '# GUPP: Work Found on Your Hook',\n '',\n '> \"If there is work on your Hook, YOU MUST RUN IT.\"',\n '',\n ];\n\n if (urgentCount > 0) {\n lines.push(`⚠️ **${urgentCount} URGENT item(s) require immediate attention**`);\n lines.push('');\n }\n\n lines.push(`## Pending Work Items (${items.length})`);\n lines.push('');\n\n for (const item of items) {\n const priorityEmoji = {\n urgent: '🔴',\n high: '🟠',\n normal: '🟢',\n low: '⚪',\n }[item.priority];\n\n lines.push(`### ${priorityEmoji} ${item.type.toUpperCase()}: ${item.id}`);\n lines.push(`- Source: ${item.source}`);\n lines.push(`- Created: ${item.createdAt}`);\n\n if (item.payload.issueId) {\n lines.push(`- Issue: ${item.payload.issueId}`);\n }\n if (item.payload.message) {\n lines.push(`- Message: ${item.payload.message}`);\n }\n if (item.payload.action) {\n lines.push(`- Action: ${item.payload.action}`);\n }\n lines.push('');\n }\n\n lines.push('---');\n lines.push('');\n lines.push('Execute these items in priority order. Use `bd hook pop <id>` after completing each item.');\n\n return lines.join('\\n');\n}\n","/**\n * Agent CV (Work History) System\n *\n * Tracks agent performance over time to enable capability-based routing.\n */\n\nimport { existsSync, mkdirSync, readFileSync, writeFileSync, readdirSync } from 'fs';\nimport { join } from 'path';\nimport { AGENTS_DIR } from './paths.js';\n\nexport interface WorkEntry {\n issueId: string;\n startedAt: string;\n completedAt?: string;\n outcome: 'success' | 'failed' | 'abandoned' | 'in_progress';\n duration?: number; // minutes\n skills?: string[];\n failureReason?: string;\n commits?: number;\n linesChanged?: number;\n}\n\nexport interface AgentCV {\n agentId: string;\n createdAt: string;\n lastActive: string;\n runtime: string;\n model: string;\n stats: {\n totalIssues: number;\n successCount: number;\n failureCount: number;\n abandonedCount: number;\n avgDuration: number; // minutes\n successRate: number; // 0-1\n };\n skillsUsed: string[];\n recentWork: WorkEntry[];\n}\n\nfunction getCVFile(agentId: string): string {\n return join(AGENTS_DIR, agentId, 'cv.json');\n}\n\n/**\n * Get or create an agent's CV\n */\nexport function getAgentCV(agentId: string): AgentCV {\n const cvFile = getCVFile(agentId);\n\n if (existsSync(cvFile)) {\n try {\n return JSON.parse(readFileSync(cvFile, 'utf-8'));\n } catch {}\n }\n\n // Create new CV\n const cv: AgentCV = {\n agentId,\n createdAt: new Date().toISOString(),\n lastActive: new Date().toISOString(),\n runtime: 'claude',\n model: 'sonnet',\n stats: {\n totalIssues: 0,\n successCount: 0,\n failureCount: 0,\n abandonedCount: 0,\n avgDuration: 0,\n successRate: 0,\n },\n skillsUsed: [],\n recentWork: [],\n };\n\n saveAgentCV(cv);\n return cv;\n}\n\n/**\n * Save an agent's CV\n */\nexport function saveAgentCV(cv: AgentCV): void {\n const dir = join(AGENTS_DIR, cv.agentId);\n mkdirSync(dir, { recursive: true });\n writeFileSync(getCVFile(cv.agentId), JSON.stringify(cv, null, 2));\n}\n\n/**\n * Start tracking work for an agent\n */\nexport function startWork(agentId: string, issueId: string, skills?: string[]): void {\n const cv = getAgentCV(agentId);\n\n const entry: WorkEntry = {\n issueId,\n startedAt: new Date().toISOString(),\n outcome: 'in_progress',\n skills,\n };\n\n cv.recentWork.unshift(entry);\n cv.stats.totalIssues++;\n cv.lastActive = new Date().toISOString();\n\n // Track skills\n if (skills) {\n for (const skill of skills) {\n if (!cv.skillsUsed.includes(skill)) {\n cv.skillsUsed.push(skill);\n }\n }\n }\n\n // Keep only last 50 entries\n if (cv.recentWork.length > 50) {\n cv.recentWork = cv.recentWork.slice(0, 50);\n }\n\n saveAgentCV(cv);\n}\n\n/**\n * Complete work for an agent\n */\nexport function completeWork(\n agentId: string,\n issueId: string,\n outcome: 'success' | 'failed' | 'abandoned',\n details?: { commits?: number; linesChanged?: number; failureReason?: string }\n): void {\n const cv = getAgentCV(agentId);\n\n // Find the work entry\n const entry = cv.recentWork.find(\n (w) => w.issueId === issueId && w.outcome === 'in_progress'\n );\n\n if (entry) {\n entry.outcome = outcome;\n entry.completedAt = new Date().toISOString();\n entry.duration = Math.round(\n (new Date().getTime() - new Date(entry.startedAt).getTime()) / (1000 * 60)\n );\n if (details?.commits) entry.commits = details.commits;\n if (details?.linesChanged) entry.linesChanged = details.linesChanged;\n if (details?.failureReason) entry.failureReason = details.failureReason;\n }\n\n // Update stats\n if (outcome === 'success') {\n cv.stats.successCount++;\n } else if (outcome === 'failed') {\n cv.stats.failureCount++;\n } else if (outcome === 'abandoned') {\n cv.stats.abandonedCount++;\n }\n\n // Calculate success rate\n const completed = cv.stats.successCount + cv.stats.failureCount + cv.stats.abandonedCount;\n cv.stats.successRate = completed > 0 ? cv.stats.successCount / completed : 0;\n\n // Calculate average duration (only from completed work)\n const completedEntries = cv.recentWork.filter(\n (w) => w.duration !== undefined && w.outcome !== 'in_progress'\n );\n if (completedEntries.length > 0) {\n const totalDuration = completedEntries.reduce((sum, w) => sum + (w.duration || 0), 0);\n cv.stats.avgDuration = Math.round(totalDuration / completedEntries.length);\n }\n\n cv.lastActive = new Date().toISOString();\n saveAgentCV(cv);\n}\n\n/**\n * Get agent rankings by success rate\n */\nexport function getAgentRankings(): Array<{\n agentId: string;\n successRate: number;\n totalIssues: number;\n avgDuration: number;\n}> {\n const rankings: Array<{\n agentId: string;\n successRate: number;\n totalIssues: number;\n avgDuration: number;\n }> = [];\n\n if (!existsSync(AGENTS_DIR)) return rankings;\n\n const dirs = readdirSync(AGENTS_DIR, { withFileTypes: true }).filter(\n (d) => d.isDirectory()\n );\n\n for (const dir of dirs) {\n const cv = getAgentCV(dir.name);\n if (cv.stats.totalIssues > 0) {\n rankings.push({\n agentId: dir.name,\n successRate: cv.stats.successRate,\n totalIssues: cv.stats.totalIssues,\n avgDuration: cv.stats.avgDuration,\n });\n }\n }\n\n // Sort by success rate, then by total issues\n rankings.sort((a, b) => {\n if (b.successRate !== a.successRate) {\n return b.successRate - a.successRate;\n }\n return b.totalIssues - a.totalIssues;\n });\n\n return rankings;\n}\n\n/**\n * Format CV for display\n */\nexport function formatCV(cv: AgentCV): string {\n const lines: string[] = [\n `# Agent CV: ${cv.agentId}`,\n '',\n `Runtime: ${cv.runtime} (${cv.model})`,\n `Created: ${cv.createdAt}`,\n `Last Active: ${cv.lastActive}`,\n '',\n '## Statistics',\n '',\n `- Total Issues: ${cv.stats.totalIssues}`,\n `- Success Rate: ${(cv.stats.successRate * 100).toFixed(1)}%`,\n `- Successes: ${cv.stats.successCount}`,\n `- Failures: ${cv.stats.failureCount}`,\n `- Abandoned: ${cv.stats.abandonedCount}`,\n `- Avg Duration: ${cv.stats.avgDuration} minutes`,\n '',\n ];\n\n if (cv.skillsUsed.length > 0) {\n lines.push('## Skills Used');\n lines.push('');\n lines.push(cv.skillsUsed.join(', '));\n lines.push('');\n }\n\n if (cv.recentWork.length > 0) {\n lines.push('## Recent Work');\n lines.push('');\n\n for (const work of cv.recentWork.slice(0, 10)) {\n const statusIcon = {\n success: '✓',\n failed: '✗',\n abandoned: '⊘',\n in_progress: '●',\n }[work.outcome];\n\n const duration = work.duration ? ` (${work.duration}m)` : '';\n lines.push(`${statusIcon} ${work.issueId}${duration}`);\n\n if (work.failureReason) {\n lines.push(` Reason: ${work.failureReason}`);\n }\n }\n lines.push('');\n }\n\n return lines.join('\\n');\n}\n","import chalk from 'chalk';\nimport { listRunningAgents } from '../../../lib/agents.js';\n\ninterface StatusOptions {\n json?: boolean;\n}\n\nexport async function statusCommand(options: StatusOptions): Promise<void> {\n const agents = listRunningAgents();\n\n if (options.json) {\n console.log(JSON.stringify(agents, null, 2));\n return;\n }\n\n if (agents.length === 0) {\n console.log(chalk.dim('No running agents.'));\n console.log(chalk.dim('Use \"pan work issue <id>\" to spawn one.'));\n return;\n }\n\n console.log(chalk.bold('\\nRunning Agents\\n'));\n\n for (const agent of agents) {\n const statusColor = agent.tmuxActive ? chalk.green : chalk.red;\n const status = agent.tmuxActive ? 'running' : 'stopped';\n\n const startedAt = new Date(agent.startedAt);\n const duration = Math.floor((Date.now() - startedAt.getTime()) / 1000 / 60);\n\n console.log(`${chalk.cyan(agent.id)}`);\n console.log(` Issue: ${agent.issueId}`);\n console.log(` Status: ${statusColor(status)}`);\n console.log(` Runtime: ${agent.runtime} (${agent.model})`);\n console.log(` Duration: ${duration} min`);\n console.log(` Workspace: ${chalk.dim(agent.workspace)}`);\n console.log('');\n }\n}\n","import chalk from 'chalk';\nimport { messageAgent } from '../../../lib/agents.js';\n\nexport async function tellCommand(id: string, message: string): Promise<void> {\n const agentId = id.startsWith('agent-') ? id : `agent-${id.toLowerCase()}`;\n\n try {\n messageAgent(agentId, message);\n console.log(chalk.green('Message sent to ' + agentId));\n console.log(chalk.dim(` \"${message}\"`));\n } catch (error: any) {\n console.error(chalk.red('Error: ' + error.message));\n process.exit(1);\n }\n}\n","import chalk from 'chalk';\nimport { stopAgent, getAgentState } from '../../../lib/agents.js';\nimport { sessionExists } from '../../../lib/tmux.js';\n\ninterface KillOptions {\n force?: boolean;\n}\n\nexport async function killCommand(id: string, options: KillOptions): Promise<void> {\n const agentId = id.startsWith('agent-') ? id : `agent-${id.toLowerCase()}`;\n\n // Check if exists\n const state = getAgentState(agentId);\n const isRunning = sessionExists(agentId);\n\n if (!state && !isRunning) {\n console.log(chalk.yellow(`Agent ${agentId} not found.`));\n return;\n }\n\n if (!options.force && isRunning) {\n // In a real implementation, we'd prompt for confirmation\n // For now, just proceed\n }\n\n try {\n stopAgent(agentId);\n console.log(chalk.green(`Killed agent: ${agentId}`));\n } catch (error: any) {\n console.error(chalk.red('Error: ' + error.message));\n process.exit(1);\n }\n}\n","import chalk from 'chalk';\nimport { listRunningAgents } from '../../../lib/agents.js';\nimport { existsSync, readFileSync, readdirSync } from 'fs';\nimport { join } from 'path';\nimport { AGENTS_DIR } from '../../../lib/paths.js';\n\nexport async function pendingCommand(): Promise<void> {\n // Find agents with completed work (status file or convention)\n // For now, show stopped agents that might have completed work\n\n const agents = listRunningAgents().filter(a => !a.tmuxActive && a.status !== 'error');\n\n if (agents.length === 0) {\n console.log(chalk.dim('No pending reviews.'));\n console.log(chalk.dim('Agents will appear here when they complete work.'));\n return;\n }\n\n console.log(chalk.bold('\\nPending Reviews\\n'));\n\n for (const agent of agents) {\n console.log(`${chalk.cyan(agent.issueId)}`);\n console.log(` Agent: ${agent.id}`);\n console.log(` Workspace: ${chalk.dim(agent.workspace)}`);\n\n // Check for completion notes\n const completionFile = join(AGENTS_DIR, agent.id, 'completion.md');\n if (existsSync(completionFile)) {\n const content = readFileSync(completionFile, 'utf8');\n const firstLine = content.split('\\n').find(l => l.trim() && !l.startsWith('#'));\n if (firstLine) {\n console.log(` Summary: ${chalk.dim(firstLine.trim())}`);\n }\n }\n\n console.log('');\n }\n\n console.log(chalk.dim('Run \"pan work approve <id>\" to approve and merge.'));\n}\n","import chalk from 'chalk';\nimport ora from 'ora';\nimport { getAgentState, saveAgentState } from '../../../lib/agents.js';\nimport { existsSync, writeFileSync, readFileSync } from 'fs';\nimport { join } from 'path';\nimport { homedir } from 'os';\nimport { execSync } from 'child_process';\nimport { AGENTS_DIR } from '../../../lib/paths.js';\n\ninterface ApproveOptions {\n merge?: boolean;\n noLinear?: boolean;\n}\n\nfunction getLinearApiKey(): string | null {\n const envFile = join(homedir(), '.panopticon.env');\n if (existsSync(envFile)) {\n const content = readFileSync(envFile, 'utf-8');\n const match = content.match(/LINEAR_API_KEY=(.+)/);\n if (match) return match[1].trim();\n }\n return process.env.LINEAR_API_KEY || null;\n}\n\nfunction checkGhCli(): boolean {\n try {\n execSync('which gh', { stdio: 'pipe' });\n return true;\n } catch {\n return false;\n }\n}\n\nfunction findPRForBranch(workspace: string): { number: number; url: string } | null {\n try {\n // Get current branch\n const branch = execSync('git rev-parse --abbrev-ref HEAD', {\n cwd: workspace,\n encoding: 'utf-8',\n stdio: ['pipe', 'pipe', 'pipe'],\n }).trim();\n\n // Find PR for this branch\n const prJson = execSync(`gh pr list --head \"${branch}\" --json number,url --limit 1`, {\n cwd: workspace,\n encoding: 'utf-8',\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n\n const prs = JSON.parse(prJson);\n if (prs.length > 0) {\n return { number: prs[0].number, url: prs[0].url };\n }\n return null;\n } catch {\n return null;\n }\n}\n\nfunction mergePR(workspace: string, prNumber: number): { success: boolean; error?: string } {\n try {\n execSync(`gh pr merge ${prNumber} --squash --delete-branch`, {\n cwd: workspace,\n encoding: 'utf-8',\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n return { success: true };\n } catch (error: any) {\n return { success: false, error: error.message };\n }\n}\n\nasync function updateLinearStatus(apiKey: string, issueIdentifier: string): Promise<boolean> {\n try {\n const { LinearClient } = await import('@linear/sdk');\n const client = new LinearClient({ apiKey });\n\n // Get the team and find the Done state\n const me = await client.viewer;\n const teams = await me.teams();\n const team = teams.nodes[0];\n\n if (!team) return false;\n\n // Find the issue\n const issues = await team.issues({ first: 100 });\n const issue = issues.nodes.find(\n (i) => i.identifier.toUpperCase() === issueIdentifier.toUpperCase()\n );\n\n if (!issue) return false;\n\n // Find the Done state\n const states = await team.states();\n const doneState = states.nodes.find((s) => s.type === 'completed' && s.name === 'Done');\n\n if (!doneState) return false;\n\n // Update issue\n await issue.update({ stateId: doneState.id });\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function approveCommand(id: string, options: ApproveOptions = {}): Promise<void> {\n const agentId = id.startsWith('agent-') ? id : `agent-${id.toLowerCase()}`;\n const state = getAgentState(agentId);\n\n if (!state) {\n console.log(chalk.yellow(`Agent ${agentId} not found.`));\n console.log(chalk.dim('Run \"pan work status\" to see running agents.'));\n return;\n }\n\n const spinner = ora('Approving work...').start();\n\n try {\n const workspace = state.workspace;\n let prMerged = false;\n let linearUpdated = false;\n\n // Step 1: Find and merge PR if requested\n if (options.merge !== false) {\n if (!checkGhCli()) {\n spinner.warn('gh CLI not found - skipping PR merge');\n console.log(chalk.dim(' Install: https://cli.github.com/'));\n } else {\n spinner.text = 'Looking for PR...';\n const pr = findPRForBranch(workspace);\n\n if (pr) {\n spinner.text = `Merging PR #${pr.number}...`;\n const result = mergePR(workspace, pr.number);\n\n if (result.success) {\n prMerged = true;\n console.log(chalk.green(` ✓ Merged PR #${pr.number}`));\n } else {\n console.log(chalk.yellow(` ⚠ Failed to merge: ${result.error}`));\n console.log(chalk.dim(` Merge manually: gh pr merge ${pr.number} --squash`));\n }\n } else {\n console.log(chalk.dim(' No PR found for this branch'));\n }\n }\n }\n\n // Step 2: Update Linear status\n if (options.noLinear !== true) {\n const apiKey = getLinearApiKey();\n if (apiKey) {\n spinner.text = 'Updating Linear status...';\n linearUpdated = await updateLinearStatus(apiKey, state.issueId);\n if (linearUpdated) {\n console.log(chalk.green(` ✓ Updated ${state.issueId} to Done`));\n } else {\n console.log(chalk.yellow(` ⚠ Failed to update Linear status`));\n }\n } else {\n console.log(chalk.dim(' LINEAR_API_KEY not set - skipping status update'));\n }\n }\n\n // Step 3: Update agent state\n state.status = 'stopped';\n state.lastActivity = new Date().toISOString();\n saveAgentState(state);\n\n // Mark as approved\n const approvedFile = join(AGENTS_DIR, agentId, 'approved');\n writeFileSync(approvedFile, JSON.stringify({\n timestamp: new Date().toISOString(),\n prMerged,\n linearUpdated,\n }));\n\n spinner.succeed(`Approved: ${state.issueId}`);\n console.log('');\n\n // Summary\n console.log(chalk.bold('Summary:'));\n console.log(` Issue: ${chalk.cyan(state.issueId)}`);\n console.log(` PR: ${prMerged ? chalk.green('Merged') : chalk.dim('Not merged')}`);\n console.log(` Linear: ${linearUpdated ? chalk.green('Updated to Done') : chalk.dim('Not updated')}`);\n console.log('');\n\n console.log(chalk.dim('Workspace can be cleaned up with:'));\n console.log(chalk.dim(` pan workspace destroy ${state.issueId}`));\n\n } catch (error: any) {\n spinner.fail(error.message);\n process.exit(1);\n }\n}\n","import chalk from 'chalk';\nimport ora from 'ora';\nimport { readFileSync, writeFileSync, existsSync } from 'fs';\nimport { join } from 'path';\nimport { homedir } from 'os';\nimport { execSync } from 'child_process';\n\ninterface PlanOptions {\n output?: string;\n json?: boolean;\n}\n\ninterface LinearIssue {\n id: string;\n identifier: string;\n title: string;\n description?: string;\n state: { name: string };\n priority: number;\n url: string;\n labels?: { name: string }[];\n assignee?: { name: string };\n project?: { name: string };\n}\n\nfunction getLinearApiKey(): string | null {\n const envFile = join(homedir(), '.panopticon.env');\n if (existsSync(envFile)) {\n const content = readFileSync(envFile, 'utf-8');\n const match = content.match(/LINEAR_API_KEY=(.+)/);\n if (match) return match[1].trim();\n }\n return process.env.LINEAR_API_KEY || null;\n}\n\nfunction findPRDFiles(issueId: string): string[] {\n const found: string[] = [];\n const cwd = process.cwd();\n\n // Common PRD locations\n const searchPaths = [\n 'docs/prds',\n 'docs/prd',\n 'prds',\n 'docs',\n ];\n\n const issueIdLower = issueId.toLowerCase();\n\n for (const searchPath of searchPaths) {\n const fullPath = join(cwd, searchPath);\n if (!existsSync(fullPath)) continue;\n\n try {\n // Use find to search for files containing the issue ID\n const result = execSync(\n `find \"${fullPath}\" -type f -name \"*.md\" 2>/dev/null | xargs grep -l -i \"${issueIdLower}\" 2>/dev/null || true`,\n { encoding: 'utf-8' }\n );\n\n const files = result.trim().split('\\n').filter(f => f);\n found.push(...files);\n } catch {\n // Ignore search errors\n }\n }\n\n return [...new Set(found)];\n}\n\nfunction generatePlan(issue: LinearIssue, prdFiles: string[]): string {\n const sections: string[] = [];\n\n // Header\n sections.push(`# Execution Plan: ${issue.identifier}`);\n sections.push('');\n sections.push(`**Title:** ${issue.title}`);\n sections.push(`**Status:** ${issue.state.name}`);\n if (issue.project) {\n sections.push(`**Project:** ${issue.project.name}`);\n }\n sections.push(`**Linear:** ${issue.url}`);\n sections.push('');\n\n // Description\n if (issue.description) {\n sections.push('## Issue Description');\n sections.push('');\n sections.push(issue.description);\n sections.push('');\n }\n\n // PRD References\n if (prdFiles.length > 0) {\n sections.push('## Related PRDs');\n sections.push('');\n for (const prd of prdFiles) {\n sections.push(`- [${prd.replace(process.cwd() + '/', '')}](${prd})`);\n }\n sections.push('');\n sections.push('> **IMPORTANT:** Review the PRD before starting implementation.');\n sections.push('');\n }\n\n // Implementation checklist (template)\n sections.push('## Implementation Steps');\n sections.push('');\n sections.push('<!-- Edit these steps based on the issue requirements -->');\n sections.push('');\n sections.push('- [ ] Understand requirements and existing code');\n sections.push('- [ ] Design approach (document in comments if complex)');\n sections.push('- [ ] Implement core functionality');\n sections.push('- [ ] Add tests');\n sections.push('- [ ] Verify linting/type checks pass');\n sections.push('- [ ] Manual testing');\n sections.push('- [ ] Update documentation if needed');\n sections.push('');\n\n // Files to modify (placeholder)\n sections.push('## Files to Modify');\n sections.push('');\n sections.push('<!-- List files that will need changes -->');\n sections.push('');\n sections.push('- TBD after codebase exploration');\n sections.push('');\n\n // Test strategy\n sections.push('## Test Strategy');\n sections.push('');\n sections.push('<!-- Define how this will be tested -->');\n sections.push('');\n sections.push('- Unit tests: TBD');\n sections.push('- Integration tests: TBD');\n sections.push('- E2E tests: TBD');\n sections.push('');\n\n // Acceptance criteria\n sections.push('## Acceptance Criteria');\n sections.push('');\n sections.push('<!-- What must be true for this to be complete? -->');\n sections.push('');\n sections.push('- [ ] Feature works as described');\n sections.push('- [ ] Tests pass');\n sections.push('- [ ] No regressions');\n sections.push('');\n\n // Notes for agent\n sections.push('## Notes for Agent');\n sections.push('');\n sections.push('<!-- Add any special instructions or context -->');\n sections.push('');\n sections.push('- Review this plan before starting');\n sections.push('- Ask clarifying questions if requirements are unclear');\n sections.push('- Commit frequently with descriptive messages');\n sections.push('');\n\n return sections.join('\\n');\n}\n\nexport async function planCommand(id: string, options: PlanOptions = {}): Promise<void> {\n const spinner = ora(`Creating execution plan for ${id}...`).start();\n\n try {\n const apiKey = getLinearApiKey();\n if (!apiKey) {\n spinner.fail('LINEAR_API_KEY not found');\n console.log('');\n console.log(chalk.dim('Set it in ~/.panopticon.env:'));\n console.log(' LINEAR_API_KEY=lin_api_xxxxx');\n process.exit(1);\n }\n\n // Fetch issue from Linear\n spinner.text = 'Fetching issue from Linear...';\n const { LinearClient } = await import('@linear/sdk');\n const client = new LinearClient({ apiKey });\n\n // Get the current user's teams to search within\n const me = await client.viewer;\n const teams = await me.teams();\n const team = teams.nodes[0];\n\n if (!team) {\n spinner.fail('No Linear team found');\n process.exit(1);\n }\n\n // Fetch recent issues and find by identifier\n const searchResult = await team.issues({\n first: 100,\n });\n\n // Find exact match by identifier\n const issue = searchResult.nodes.find(\n (i) => i.identifier.toUpperCase() === id.toUpperCase()\n );\n\n if (!issue) {\n spinner.fail(`Issue not found: ${id}`);\n process.exit(1);\n }\n\n // Get full issue details\n const state = await issue.state;\n const assignee = await issue.assignee;\n const project = await issue.project;\n const labels = await issue.labels();\n\n const issueData: LinearIssue = {\n id: issue.id,\n identifier: issue.identifier,\n title: issue.title,\n description: issue.description || undefined,\n state: { name: state?.name || 'Unknown' },\n priority: issue.priority,\n url: issue.url,\n labels: labels.nodes.map(l => ({ name: l.name })),\n assignee: assignee ? { name: assignee.name } : undefined,\n project: project ? { name: project.name } : undefined,\n };\n\n // Look for related PRD files\n spinner.text = 'Searching for related PRDs...';\n const prdFiles = findPRDFiles(id);\n\n // Generate plan\n spinner.text = 'Generating execution plan...';\n const plan = generatePlan(issueData, prdFiles);\n\n if (options.json) {\n spinner.stop();\n console.log(JSON.stringify({\n issue: issueData,\n prdFiles,\n plan,\n }, null, 2));\n return;\n }\n\n // Determine output path\n const outputPath = options.output || `PLAN-${issue.identifier}.md`;\n\n // Write plan file\n writeFileSync(outputPath, plan);\n\n spinner.succeed(`Execution plan created: ${outputPath}`);\n console.log('');\n\n // Show summary\n console.log(chalk.bold('Issue Details:'));\n console.log(` ${chalk.cyan(issue.identifier)} ${issue.title}`);\n console.log(` Status: ${state?.name}`);\n if (prdFiles.length > 0) {\n console.log(` PRDs found: ${chalk.green(prdFiles.length)}`);\n }\n console.log('');\n\n console.log(chalk.bold('Next steps:'));\n console.log(` 1. Review and edit ${chalk.cyan(outputPath)}`);\n console.log(` 2. Run ${chalk.cyan(`pan work issue ${id}`)} to spawn agent`);\n console.log('');\n\n if (prdFiles.length > 0) {\n console.log(chalk.yellow('PRD files found - agent will reference these:'));\n for (const prd of prdFiles) {\n console.log(` ${chalk.dim(prd.replace(process.cwd() + '/', ''))}`);\n }\n console.log('');\n }\n\n } catch (error: any) {\n spinner.fail(error.message);\n process.exit(1);\n }\n}\n","import chalk from 'chalk';\nimport ora from 'ora';\nimport { readFileSync, existsSync } from 'fs';\nimport { join } from 'path';\nimport { homedir } from 'os';\n\ninterface ListOptions {\n all?: boolean;\n mine?: boolean;\n json?: boolean;\n}\n\ninterface LinearIssue {\n id: string;\n identifier: string;\n title: string;\n state: string;\n priority: number;\n assignee?: { name: string };\n url: string;\n}\n\nfunction getLinearApiKey(): string | null {\n // Check ~/.panopticon.env\n const envFile = join(homedir(), '.panopticon.env');\n if (existsSync(envFile)) {\n const content = readFileSync(envFile, 'utf-8');\n const match = content.match(/LINEAR_API_KEY=(.+)/);\n if (match) return match[1].trim();\n }\n // Check environment\n return process.env.LINEAR_API_KEY || null;\n}\n\nconst PRIORITY_LABELS: Record<number, string> = {\n 0: chalk.dim('None'),\n 1: chalk.red('Urgent'),\n 2: chalk.yellow('High'),\n 3: chalk.blue('Medium'),\n 4: chalk.dim('Low'),\n};\n\nconst STATE_COLORS: Record<string, (s: string) => string> = {\n 'Backlog': chalk.dim,\n 'Todo': chalk.white,\n 'In Progress': chalk.yellow,\n 'In Review': chalk.magenta,\n 'Done': chalk.green,\n 'Canceled': chalk.strikethrough,\n};\n\nexport async function listCommand(options: ListOptions): Promise<void> {\n const spinner = ora('Fetching issues from Linear...').start();\n\n try {\n const apiKey = getLinearApiKey();\n if (!apiKey) {\n spinner.fail('LINEAR_API_KEY not found');\n console.log('');\n console.log(chalk.dim('Set it in ~/.panopticon.env:'));\n console.log(' LINEAR_API_KEY=lin_api_xxxxx');\n process.exit(1);\n }\n\n // Dynamic import to avoid loading if not needed\n const { LinearClient } = await import('@linear/sdk');\n const client = new LinearClient({ apiKey });\n\n // Get current user\n const me = await client.viewer;\n\n // Get teams\n const teams = await me.teams();\n const team = teams.nodes[0];\n\n if (!team) {\n spinner.fail('No Linear team found');\n process.exit(1);\n }\n\n spinner.text = `Fetching issues from ${team.name}...`;\n\n // Fetch issues\n let issues;\n if (options.mine) {\n const assignedIssues = await me.assignedIssues({\n first: 50,\n filter: options.all ? {} : { state: { type: { neq: 'completed' } } },\n });\n issues = assignedIssues.nodes;\n } else {\n const teamIssues = await team.issues({\n first: 50,\n filter: options.all ? {} : { state: { type: { neq: 'completed' } } },\n });\n issues = teamIssues.nodes;\n }\n\n spinner.stop();\n\n if (options.json) {\n const formatted = await Promise.all(issues.map(async (issue) => {\n const state = await issue.state;\n const assignee = await issue.assignee;\n return {\n id: issue.id,\n identifier: issue.identifier,\n title: issue.title,\n state: state?.name,\n priority: issue.priority,\n assignee: assignee?.name,\n url: issue.url,\n };\n }));\n console.log(JSON.stringify(formatted, null, 2));\n return;\n }\n\n if (issues.length === 0) {\n console.log(chalk.dim('No issues found.'));\n return;\n }\n\n console.log(chalk.bold(`\\n${team.name} Issues\\n`));\n\n // Group by state\n const byState: Record<string, typeof issues> = {};\n for (const issue of issues) {\n const state = await issue.state;\n const stateName = state?.name || 'Unknown';\n if (!byState[stateName]) byState[stateName] = [];\n byState[stateName].push(issue);\n }\n\n // Display order\n const stateOrder = ['In Progress', 'In Review', 'Todo', 'Backlog', 'Done', 'Canceled'];\n\n for (const stateName of stateOrder) {\n const stateIssues = byState[stateName];\n if (!stateIssues || stateIssues.length === 0) continue;\n\n const colorFn = STATE_COLORS[stateName] || chalk.white;\n console.log(colorFn(`── ${stateName} (${stateIssues.length}) ──`));\n console.log('');\n\n for (const issue of stateIssues) {\n const assignee = await issue.assignee;\n const priorityLabel = PRIORITY_LABELS[issue.priority] || '';\n const assigneeStr = assignee ? chalk.dim(` @${assignee.name.split(' ')[0]}`) : '';\n\n console.log(` ${chalk.cyan(issue.identifier)} ${issue.title}${assigneeStr}`);\n if (issue.priority > 0 && issue.priority < 3) {\n console.log(` ${priorityLabel}`);\n }\n }\n console.log('');\n }\n\n console.log(chalk.dim(`Showing ${issues.length} issues. Use --all to include completed.`));\n\n } catch (error: any) {\n spinner.fail(error.message);\n process.exit(1);\n }\n}\n","import chalk from 'chalk';\nimport ora from 'ora';\nimport { readFileSync, writeFileSync, existsSync } from 'fs';\nimport { join } from 'path';\nimport { homedir } from 'os';\nimport { execSync } from 'child_process';\n\ninterface TriageOptions {\n create?: boolean;\n dismiss?: string;\n}\n\ninterface GitHubIssue {\n number: number;\n title: string;\n body: string;\n state: string;\n html_url: string;\n labels: { name: string }[];\n created_at: string;\n user: { login: string };\n}\n\ninterface TriageState {\n dismissed: number[];\n created: { [githubNumber: number]: string }; // GitHub number -> Linear ID\n}\n\nfunction getConfig(): { githubToken?: string; githubRepo?: string; linearApiKey?: string } {\n const envFile = join(homedir(), '.panopticon.env');\n const config: { githubToken?: string; githubRepo?: string; linearApiKey?: string } = {};\n\n if (existsSync(envFile)) {\n const content = readFileSync(envFile, 'utf-8');\n\n const ghMatch = content.match(/GITHUB_TOKEN=(.+)/);\n if (ghMatch) config.githubToken = ghMatch[1].trim();\n\n const repoMatch = content.match(/GITHUB_REPO=(.+)/);\n if (repoMatch) config.githubRepo = repoMatch[1].trim();\n\n const linearMatch = content.match(/LINEAR_API_KEY=(.+)/);\n if (linearMatch) config.linearApiKey = linearMatch[1].trim();\n }\n\n // Also check environment\n config.githubToken = config.githubToken || process.env.GITHUB_TOKEN;\n config.githubRepo = config.githubRepo || process.env.GITHUB_REPO;\n config.linearApiKey = config.linearApiKey || process.env.LINEAR_API_KEY;\n\n return config;\n}\n\nfunction getTriageStatePath(): string {\n return join(homedir(), '.panopticon', 'triage-state.json');\n}\n\nfunction loadTriageState(): TriageState {\n const path = getTriageStatePath();\n if (existsSync(path)) {\n return JSON.parse(readFileSync(path, 'utf-8'));\n }\n return { dismissed: [], created: {} };\n}\n\nfunction saveTriageState(state: TriageState): void {\n const path = getTriageStatePath();\n writeFileSync(path, JSON.stringify(state, null, 2));\n}\n\nasync function fetchGitHubIssues(token: string, repo: string): Promise<GitHubIssue[]> {\n const response = await fetch(`https://api.github.com/repos/${repo}/issues?state=open&per_page=50`, {\n headers: {\n Authorization: `Bearer ${token}`,\n Accept: 'application/vnd.github.v3+json',\n },\n });\n\n if (!response.ok) {\n throw new Error(`GitHub API error: ${response.status} ${response.statusText}`);\n }\n\n const issues = await response.json() as GitHubIssue[];\n // Filter out PRs (they also appear in /issues endpoint)\n return issues.filter(i => !('pull_request' in i));\n}\n\nasync function createLinearIssue(\n apiKey: string,\n title: string,\n description: string,\n githubUrl: string\n): Promise<string> {\n const { LinearClient } = await import('@linear/sdk');\n const client = new LinearClient({ apiKey });\n\n const me = await client.viewer;\n const teams = await me.teams();\n const team = teams.nodes[0];\n\n if (!team) {\n throw new Error('No Linear team found');\n }\n\n const fullDescription = `${description}\\n\\n---\\n\\n**From GitHub:** ${githubUrl}`;\n\n const result = await client.createIssue({\n teamId: team.id,\n title,\n description: fullDescription,\n });\n\n const issue = await result.issue;\n return issue?.identifier || 'unknown';\n}\n\nexport async function triageCommand(id?: string, options: TriageOptions = {}): Promise<void> {\n const spinner = ora('Loading triage queue...').start();\n\n try {\n const config = getConfig();\n\n // Check for required config\n if (!config.githubToken || !config.githubRepo) {\n spinner.info('GitHub integration not configured');\n console.log('');\n console.log(chalk.bold('Setup Instructions:'));\n console.log('');\n console.log('Add to ~/.panopticon.env:');\n console.log(chalk.dim(' GITHUB_TOKEN=ghp_xxxxx'));\n console.log(chalk.dim(' GITHUB_REPO=owner/repo'));\n console.log('');\n console.log(chalk.dim('Get a token at: https://github.com/settings/tokens'));\n console.log(chalk.dim('Required scopes: repo (for private repos) or public_repo'));\n return;\n }\n\n const triageState = loadTriageState();\n\n // If specific ID provided, handle create/dismiss\n if (id) {\n const issueNumber = parseInt(id.replace('#', ''), 10);\n\n if (options.dismiss) {\n if (!triageState.dismissed.includes(issueNumber)) {\n triageState.dismissed.push(issueNumber);\n saveTriageState(triageState);\n }\n spinner.succeed(`Dismissed #${issueNumber}: ${options.dismiss}`);\n return;\n }\n\n if (options.create) {\n if (!config.linearApiKey) {\n spinner.fail('LINEAR_API_KEY not configured');\n return;\n }\n\n // Fetch the specific issue\n spinner.text = `Fetching GitHub issue #${issueNumber}...`;\n const response = await fetch(\n `https://api.github.com/repos/${config.githubRepo}/issues/${issueNumber}`,\n {\n headers: {\n Authorization: `Bearer ${config.githubToken}`,\n Accept: 'application/vnd.github.v3+json',\n },\n }\n );\n\n if (!response.ok) {\n spinner.fail(`GitHub issue #${issueNumber} not found`);\n return;\n }\n\n const ghIssue = await response.json() as GitHubIssue;\n\n spinner.text = 'Creating Linear issue...';\n const linearId = await createLinearIssue(\n config.linearApiKey,\n ghIssue.title,\n ghIssue.body || '',\n ghIssue.html_url\n );\n\n triageState.created[issueNumber] = linearId;\n saveTriageState(triageState);\n\n spinner.succeed(`Created ${linearId} from GitHub #${issueNumber}`);\n console.log('');\n console.log(` GitHub: ${chalk.dim(ghIssue.html_url)}`);\n console.log(` Linear: ${chalk.cyan(linearId)}`);\n return;\n }\n }\n\n // List all GitHub issues needing triage\n spinner.text = 'Fetching GitHub issues...';\n const issues = await fetchGitHubIssues(config.githubToken, config.githubRepo);\n\n // Filter out dismissed and already created\n const pending = issues.filter(\n (i) => !triageState.dismissed.includes(i.number) && !triageState.created[i.number]\n );\n\n spinner.stop();\n\n if (pending.length === 0) {\n console.log(chalk.green('No issues pending triage.'));\n console.log(chalk.dim(`${issues.length} total open, ${triageState.dismissed.length} dismissed, ${Object.keys(triageState.created).length} created`));\n return;\n }\n\n console.log(chalk.bold(`\\nGitHub Issues Pending Triage (${pending.length})\\n`));\n\n for (const issue of pending) {\n const labels = issue.labels.map((l) => chalk.dim(`[${l.name}]`)).join(' ');\n console.log(` ${chalk.cyan(`#${issue.number}`)} ${issue.title} ${labels}`);\n console.log(` ${chalk.dim(issue.html_url)}`);\n }\n\n console.log('');\n console.log(chalk.bold('Commands:'));\n console.log(` ${chalk.dim('Create Linear issue:')} pan work triage <number> --create`);\n console.log(` ${chalk.dim('Dismiss from queue:')} pan work triage <number> --dismiss \"reason\"`);\n console.log('');\n\n } catch (error: any) {\n spinner.fail(error.message);\n process.exit(1);\n }\n}\n","import chalk from 'chalk';\nimport {\n checkHook,\n pushToHook,\n popFromHook,\n clearHook,\n sendMail,\n generateGUPPPrompt,\n HookItem,\n} from '../../../lib/hooks.js';\n\ninterface HookOptions {\n json?: boolean;\n}\n\nexport async function hookCommand(\n action: string,\n idOrMessage?: string,\n options: HookOptions = {}\n): Promise<void> {\n // Normalize agent ID\n const agentId = process.env.PANOPTICON_AGENT_ID || 'default';\n\n switch (action) {\n case 'check': {\n const result = checkHook(idOrMessage || agentId);\n\n if (options.json) {\n console.log(JSON.stringify(result, null, 2));\n return;\n }\n\n if (!result.hasWork) {\n console.log(chalk.green('✓ No pending work on hook'));\n return;\n }\n\n console.log(chalk.yellow(`⚠ ${result.items.length} item(s) on hook`));\n if (result.urgentCount > 0) {\n console.log(chalk.red(` ${result.urgentCount} URGENT`));\n }\n console.log('');\n\n for (const item of result.items) {\n const priorityColor = {\n urgent: chalk.red,\n high: chalk.yellow,\n normal: chalk.white,\n low: chalk.dim,\n }[item.priority];\n\n console.log(`${priorityColor(`[${item.priority.toUpperCase()}]`)} ${item.id}`);\n console.log(` Type: ${item.type}`);\n console.log(` From: ${item.source}`);\n if (item.payload.message) {\n console.log(` Message: ${item.payload.message}`);\n }\n console.log('');\n }\n break;\n }\n\n case 'push': {\n if (!idOrMessage) {\n console.log(chalk.red('Usage: pan work hook push <agent-id> <message>'));\n process.exit(1);\n }\n\n const [targetAgent, ...messageParts] = idOrMessage.split(' ');\n const message = messageParts.join(' ');\n\n if (!message) {\n console.log(chalk.red('Message required'));\n process.exit(1);\n }\n\n const item = pushToHook(targetAgent.startsWith('agent-') ? targetAgent : `agent-${targetAgent}`, {\n type: 'task',\n priority: 'normal',\n source: 'cli',\n payload: { message },\n });\n\n console.log(chalk.green(`✓ Pushed to hook: ${item.id}`));\n break;\n }\n\n case 'pop': {\n if (!idOrMessage) {\n console.log(chalk.red('Usage: pan work hook pop <item-id>'));\n process.exit(1);\n }\n\n const success = popFromHook(agentId, idOrMessage);\n if (success) {\n console.log(chalk.green(`✓ Popped: ${idOrMessage}`));\n } else {\n console.log(chalk.yellow(`Item not found: ${idOrMessage}`));\n }\n break;\n }\n\n case 'clear': {\n clearHook(idOrMessage || agentId);\n console.log(chalk.green('✓ Hook cleared'));\n break;\n }\n\n case 'mail': {\n if (!idOrMessage) {\n console.log(chalk.red('Usage: pan work hook mail <agent-id> <message>'));\n process.exit(1);\n }\n\n const [targetAgent, ...messageParts] = idOrMessage.split(' ');\n const message = messageParts.join(' ');\n\n if (!message) {\n console.log(chalk.red('Message required'));\n process.exit(1);\n }\n\n sendMail(\n targetAgent.startsWith('agent-') ? targetAgent : `agent-${targetAgent}`,\n 'cli',\n message\n );\n\n console.log(chalk.green(`✓ Mail sent to ${targetAgent}`));\n break;\n }\n\n case 'gupp': {\n const prompt = generateGUPPPrompt(idOrMessage || agentId);\n\n if (!prompt) {\n console.log(chalk.green('No GUPP work found'));\n return;\n }\n\n console.log(prompt);\n break;\n }\n\n default:\n console.log(chalk.bold('Hook Commands:'));\n console.log('');\n console.log(` ${chalk.cyan('pan work hook check [agent-id]')} - Check for pending work`);\n console.log(` ${chalk.cyan('pan work hook push <agent-id> <msg>')} - Push task to hook`);\n console.log(` ${chalk.cyan('pan work hook pop <item-id>')} - Remove completed item`);\n console.log(` ${chalk.cyan('pan work hook clear [agent-id]')} - Clear all hook items`);\n console.log(` ${chalk.cyan('pan work hook mail <agent-id> <msg>')} - Send mail to agent`);\n console.log(` ${chalk.cyan('pan work hook gupp [agent-id]')} - Generate GUPP prompt`);\n }\n}\n","import chalk from 'chalk';\nimport ora from 'ora';\nimport {\n detectCrashedAgents,\n recoverAgent,\n autoRecoverAgents,\n} from '../../../lib/agents.js';\n\ninterface RecoverOptions {\n all?: boolean;\n json?: boolean;\n}\n\nexport async function recoverCommand(id?: string, options: RecoverOptions = {}): Promise<void> {\n const spinner = ora('Checking for crashed agents...').start();\n\n try {\n // Auto-recover all crashed agents\n if (options.all || !id) {\n const crashed = detectCrashedAgents();\n\n if (crashed.length === 0) {\n spinner.succeed('No crashed agents found');\n return;\n }\n\n if (options.json) {\n spinner.stop();\n console.log(JSON.stringify({ crashed: crashed.map((a) => a.id) }, null, 2));\n\n if (!options.all) {\n console.log(chalk.dim('\\nUse --all to auto-recover all crashed agents'));\n return;\n }\n }\n\n if (!options.all) {\n spinner.info(`Found ${crashed.length} crashed agent(s)`);\n console.log('');\n\n for (const agent of crashed) {\n console.log(` ${chalk.red('●')} ${chalk.cyan(agent.id)}`);\n console.log(` Issue: ${agent.issueId}`);\n console.log(` Started: ${agent.startedAt}`);\n console.log('');\n }\n\n console.log(chalk.dim('Use --all to auto-recover, or specify an agent ID'));\n return;\n }\n\n spinner.text = 'Auto-recovering agents...';\n const result = autoRecoverAgents();\n\n spinner.stop();\n\n if (options.json) {\n console.log(JSON.stringify(result, null, 2));\n return;\n }\n\n if (result.recovered.length > 0) {\n console.log(chalk.green(`✓ Recovered ${result.recovered.length} agent(s):`));\n for (const agentId of result.recovered) {\n console.log(` ${chalk.cyan(agentId)}`);\n }\n }\n\n if (result.failed.length > 0) {\n console.log(chalk.red(`✗ Failed to recover ${result.failed.length} agent(s):`));\n for (const agentId of result.failed) {\n console.log(` ${chalk.dim(agentId)}`);\n }\n }\n\n return;\n }\n\n // Recover specific agent\n const agentId = id.startsWith('agent-') ? id : `agent-${id.toLowerCase()}`;\n spinner.text = `Recovering ${agentId}...`;\n\n const state = recoverAgent(agentId);\n\n if (!state) {\n spinner.fail(`Agent not found: ${agentId}`);\n process.exit(1);\n }\n\n spinner.succeed(`Recovered: ${agentId}`);\n console.log('');\n console.log(chalk.bold('Agent Details:'));\n console.log(` Issue: ${chalk.cyan(state.issueId)}`);\n console.log(` Workspace: ${chalk.dim(state.workspace)}`);\n console.log(` Model: ${state.model}`);\n console.log('');\n console.log(chalk.dim('Commands:'));\n console.log(` Attach: tmux attach -t ${state.id}`);\n console.log(` Message: pan work tell ${state.issueId} \"your message\"`);\n\n } catch (error: any) {\n spinner.fail(error.message);\n process.exit(1);\n }\n}\n","import chalk from 'chalk';\nimport {\n getAgentCV,\n getAgentRankings,\n formatCV,\n startWork,\n completeWork,\n} from '../../../lib/cv.js';\n\ninterface CVOptions {\n json?: boolean;\n rankings?: boolean;\n}\n\nexport async function cvCommand(agentId?: string, options: CVOptions = {}): Promise<void> {\n // Show rankings\n if (options.rankings || !agentId) {\n const rankings = getAgentRankings();\n\n if (options.json) {\n console.log(JSON.stringify(rankings, null, 2));\n return;\n }\n\n if (rankings.length === 0) {\n console.log(chalk.dim('No agent work history yet.'));\n console.log(chalk.dim('CVs are created as agents complete work.'));\n return;\n }\n\n console.log(chalk.bold('\\nAgent Rankings\\n'));\n\n // Header\n console.log(\n `${'Agent'.padEnd(25)} ${'Success'.padStart(8)} ${'Total'.padStart(6)} ${'Avg Time'.padStart(10)}`\n );\n console.log(chalk.dim('─'.repeat(52)));\n\n for (let i = 0; i < rankings.length; i++) {\n const r = rankings[i];\n const medal = i === 0 ? '🥇' : i === 1 ? '🥈' : i === 2 ? '🥉' : ' ';\n const successPct = `${(r.successRate * 100).toFixed(0)}%`;\n const avgTime = r.avgDuration > 0 ? `${r.avgDuration}m` : '-';\n\n console.log(\n `${medal} ${r.agentId.padEnd(22)} ${successPct.padStart(8)} ${r.totalIssues\n .toString()\n .padStart(6)} ${avgTime.padStart(10)}`\n );\n }\n\n console.log('');\n console.log(chalk.dim(`Use: pan work cv <agent-id> for details`));\n return;\n }\n\n // Show specific agent CV\n const normalizedId = agentId.startsWith('agent-') ? agentId : `agent-${agentId.toLowerCase()}`;\n const cv = getAgentCV(normalizedId);\n\n if (options.json) {\n console.log(JSON.stringify(cv, null, 2));\n return;\n }\n\n console.log('');\n console.log(formatCV(cv));\n}\n\n// Export helper functions for integration\nexport { startWork, completeWork };\n","import chalk from 'chalk';\nimport {\n readAgentState,\n writeAgentState,\n updateCheckpoint,\n appendSummary,\n logHistory,\n searchHistory,\n getRecentHistory,\n materializeOutput,\n listMaterialized,\n readMaterialized,\n estimateTokens,\n AgentStateContext,\n} from '../../../lib/context.js';\nimport { readFileSync, existsSync } from 'fs';\nimport { join } from 'path';\nimport { AGENTS_DIR } from '../../../lib/paths.js';\n\ninterface ContextOptions {\n json?: boolean;\n}\n\nexport async function contextCommand(\n action: string,\n arg1?: string,\n arg2?: string,\n options: ContextOptions = {}\n): Promise<void> {\n // Get agent ID from environment or argument\n const agentId = process.env.PANOPTICON_AGENT_ID || arg1 || 'default';\n\n switch (action) {\n case 'state': {\n // Show or update STATE.md\n const state = readAgentState(agentId);\n\n if (options.json) {\n console.log(JSON.stringify(state, null, 2));\n return;\n }\n\n if (!state) {\n console.log(chalk.dim('No state found for agent.'));\n console.log(chalk.dim('Initialize with: pan work context init <agent-id> <issue-id>'));\n return;\n }\n\n console.log(chalk.bold(`\\nAgent State: ${state.issueId}\\n`));\n console.log(`Status: ${chalk.cyan(state.status)}`);\n console.log(`Last Activity: ${chalk.dim(state.lastActivity)}`);\n\n if (state.lastCheckpoint) {\n console.log('');\n console.log(chalk.bold('Session Continuity:'));\n console.log(` Checkpoint: ${chalk.yellow(state.lastCheckpoint)}`);\n if (state.resumePoint) {\n console.log(` Resume: ${chalk.green(state.resumePoint)}`);\n }\n }\n\n if (state.contextRefs.workspace || state.contextRefs.prd) {\n console.log('');\n console.log(chalk.bold('Context References:'));\n if (state.contextRefs.workspace) {\n console.log(` Workspace: ${chalk.dim(state.contextRefs.workspace)}`);\n }\n if (state.contextRefs.prd) {\n console.log(` PRD: ${chalk.dim(state.contextRefs.prd)}`);\n }\n if (state.contextRefs.beads) {\n console.log(` Beads: ${chalk.dim(state.contextRefs.beads)}`);\n }\n }\n console.log('');\n break;\n }\n\n case 'init': {\n // Initialize STATE.md for an agent\n const issueId = arg2 || arg1 || 'UNKNOWN';\n const targetAgent = arg2 ? arg1 : agentId;\n\n const state: AgentStateContext = {\n issueId: issueId.toUpperCase(),\n status: 'In Progress',\n lastActivity: new Date().toISOString(),\n contextRefs: {},\n };\n\n writeAgentState(targetAgent!, state);\n logHistory(targetAgent!, 'context:init', { issueId });\n\n console.log(chalk.green(`✓ Initialized state for ${targetAgent}`));\n break;\n }\n\n case 'checkpoint': {\n // Update checkpoint\n const checkpoint = arg1;\n const resume = arg2;\n\n if (!checkpoint) {\n console.log(chalk.red('Checkpoint message required'));\n console.log(chalk.dim('Usage: pan work context checkpoint \"message\" [\"resume point\"]'));\n return;\n }\n\n updateCheckpoint(agentId, checkpoint, resume);\n logHistory(agentId, 'context:checkpoint', { checkpoint, resume });\n\n console.log(chalk.green(`✓ Checkpoint saved: \"${checkpoint}\"`));\n if (resume) {\n console.log(chalk.dim(` Resume point: \"${resume}\"`));\n }\n break;\n }\n\n case 'summary': {\n // Add a work summary\n const title = arg1 || 'Work Session';\n\n // Read summary from stdin or prompt\n const summary = {\n title,\n completedAt: new Date().toISOString(),\n whatWasDone: ['Completed assigned work'],\n };\n\n appendSummary(agentId, summary);\n logHistory(agentId, 'context:summary', { title });\n\n console.log(chalk.green(`✓ Summary added: \"${title}\"`));\n break;\n }\n\n case 'history': {\n // Search or show history\n const pattern = arg1;\n\n if (pattern) {\n const results = searchHistory(agentId, pattern);\n if (results.length === 0) {\n console.log(chalk.dim('No matches found.'));\n return;\n }\n\n console.log(chalk.bold(`\\nHistory matches for \"${pattern}\":\\n`));\n for (const line of results.slice(0, 50)) {\n console.log(line);\n }\n } else {\n const recent = getRecentHistory(agentId, 20);\n if (recent.length === 0) {\n console.log(chalk.dim('No history yet.'));\n return;\n }\n\n console.log(chalk.bold('\\nRecent History:\\n'));\n for (const line of recent) {\n console.log(line);\n }\n }\n console.log('');\n break;\n }\n\n case 'materialize': {\n // List or read materialized outputs\n const filepath = arg1;\n\n if (filepath && existsSync(filepath)) {\n const content = readMaterialized(filepath);\n if (content) {\n console.log(content);\n }\n return;\n }\n\n const outputs = listMaterialized(agentId);\n if (outputs.length === 0) {\n console.log(chalk.dim('No materialized outputs.'));\n return;\n }\n\n console.log(chalk.bold('\\nMaterialized Outputs:\\n'));\n for (const out of outputs) {\n const date = new Date(out.timestamp).toLocaleString();\n console.log(` ${chalk.cyan(out.tool)} ${chalk.dim(date)}`);\n console.log(` ${chalk.dim(out.file)}`);\n }\n console.log('');\n break;\n }\n\n case 'tokens': {\n // Estimate tokens for a file or text\n const target = arg1;\n\n if (!target) {\n console.log(chalk.dim('Usage: pan work context tokens <file-or-text>'));\n return;\n }\n\n let text = target;\n if (existsSync(target)) {\n text = readFileSync(target, 'utf-8');\n }\n\n const tokens = estimateTokens(text);\n console.log(`Estimated tokens: ${chalk.cyan(tokens.toLocaleString())}`);\n break;\n }\n\n default:\n console.log(chalk.bold('Context Commands:'));\n console.log('');\n console.log(` ${chalk.cyan('pan work context state [agent-id]')} - Show current state`);\n console.log(` ${chalk.cyan('pan work context init <agent> <issue>')} - Initialize state`);\n console.log(` ${chalk.cyan('pan work context checkpoint \"msg\"')} - Save checkpoint`);\n console.log(` ${chalk.cyan('pan work context summary [title]')} - Add work summary`);\n console.log(` ${chalk.cyan('pan work context history [pattern]')} - Search history`);\n console.log(` ${chalk.cyan('pan work context materialize [file]')} - List/read outputs`);\n console.log(` ${chalk.cyan('pan work context tokens <file>')} - Estimate token count`);\n console.log('');\n }\n}\n","/**\n * Context Engineering System\n *\n * Implements GSD-Plus patterns for structured context management:\n * - STATE.md: Agent state that survives compaction\n * - WORKSPACE.md: Project context\n * - SUMMARY.md: Work artifacts\n * - Queryable history files\n */\n\nimport { existsSync, mkdirSync, readFileSync, writeFileSync, appendFileSync, readdirSync } from 'fs';\nimport { join, basename } from 'path';\nimport { AGENTS_DIR } from './paths.js';\n\nexport interface AgentStateContext {\n issueId: string;\n status: string;\n lastActivity: string;\n lastCheckpoint?: string;\n resumePoint?: string;\n contextRefs: {\n workspace?: string;\n prd?: string;\n beads?: string;\n };\n}\n\nexport interface WorkspaceMdContext {\n projectName: string;\n branch: string;\n issueId: string;\n description: string;\n constraints: string[];\n activeWork: string[];\n}\n\nexport interface SummaryEntry {\n title: string;\n completedAt: string;\n duration?: number;\n whatWasDone: string[];\n keyInsights?: string[];\n filesModified?: string[];\n}\n\n// ============== STATE.md ==============\n\nfunction getStateFile(agentId: string): string {\n return join(AGENTS_DIR, agentId, 'STATE.md');\n}\n\n/**\n * Read current STATE.md for an agent\n */\nexport function readAgentState(agentId: string): AgentStateContext | null {\n const stateFile = getStateFile(agentId);\n if (!existsSync(stateFile)) return null;\n\n try {\n const content = readFileSync(stateFile, 'utf-8');\n return parseStateMd(content);\n } catch {\n return null;\n }\n}\n\n/**\n * Write STATE.md for an agent\n */\nexport function writeAgentState(agentId: string, state: AgentStateContext): void {\n const dir = join(AGENTS_DIR, agentId);\n mkdirSync(dir, { recursive: true });\n\n const content = generateStateMd(state);\n writeFileSync(getStateFile(agentId), content);\n}\n\n/**\n * Update checkpoint in STATE.md\n */\nexport function updateCheckpoint(agentId: string, checkpoint: string, resumePoint?: string): void {\n const state = readAgentState(agentId);\n if (!state) return;\n\n state.lastActivity = new Date().toISOString();\n state.lastCheckpoint = checkpoint;\n if (resumePoint) {\n state.resumePoint = resumePoint;\n }\n\n writeAgentState(agentId, state);\n}\n\nfunction generateStateMd(state: AgentStateContext): string {\n const lines: string[] = [\n `# Agent State: ${state.issueId}`,\n '',\n '## Current Position',\n '',\n `Issue: ${state.issueId}`,\n `Status: ${state.status}`,\n `Last activity: ${state.lastActivity}`,\n '',\n ];\n\n if (state.lastCheckpoint) {\n lines.push('## Session Continuity');\n lines.push('');\n lines.push(`Last checkpoint: \"${state.lastCheckpoint}\"`);\n if (state.resumePoint) {\n lines.push(`Resume point: \"${state.resumePoint}\"`);\n }\n lines.push('');\n }\n\n if (state.contextRefs.workspace || state.contextRefs.prd || state.contextRefs.beads) {\n lines.push('## Context References');\n lines.push('');\n if (state.contextRefs.workspace) {\n lines.push(`- Workspace: ${state.contextRefs.workspace}`);\n }\n if (state.contextRefs.prd) {\n lines.push(`- PRD: ${state.contextRefs.prd}`);\n }\n if (state.contextRefs.beads) {\n lines.push(`- Beads: ${state.contextRefs.beads}`);\n }\n lines.push('');\n }\n\n return lines.join('\\n');\n}\n\nfunction parseStateMd(content: string): AgentStateContext {\n const state: AgentStateContext = {\n issueId: '',\n status: '',\n lastActivity: '',\n contextRefs: {},\n };\n\n // Parse issue ID from title\n const titleMatch = content.match(/# Agent State: (.+)/);\n if (titleMatch) state.issueId = titleMatch[1].trim();\n\n // Parse status\n const statusMatch = content.match(/Status: (.+)/);\n if (statusMatch) state.status = statusMatch[1].trim();\n\n // Parse last activity\n const activityMatch = content.match(/Last activity: (.+)/);\n if (activityMatch) state.lastActivity = activityMatch[1].trim();\n\n // Parse checkpoint\n const checkpointMatch = content.match(/Last checkpoint: \"(.+)\"/);\n if (checkpointMatch) state.lastCheckpoint = checkpointMatch[1];\n\n // Parse resume point\n const resumeMatch = content.match(/Resume point: \"(.+)\"/);\n if (resumeMatch) state.resumePoint = resumeMatch[1];\n\n // Parse context refs\n const workspaceMatch = content.match(/- Workspace: (.+)/);\n if (workspaceMatch) state.contextRefs.workspace = workspaceMatch[1].trim();\n\n const prdMatch = content.match(/- PRD: (.+)/);\n if (prdMatch) state.contextRefs.prd = prdMatch[1].trim();\n\n const beadsMatch = content.match(/- Beads: (.+)/);\n if (beadsMatch) state.contextRefs.beads = beadsMatch[1].trim();\n\n return state;\n}\n\n// ============== WORKSPACE.md ==============\n\n/**\n * Generate WORKSPACE.md for a workspace\n */\nexport function generateWorkspaceMd(ctx: WorkspaceMdContext): string {\n const lines: string[] = [\n `# ${ctx.projectName}`,\n '',\n ctx.description,\n '',\n '## Core Value',\n '',\n `Working on ${ctx.issueId} to deliver requested functionality.`,\n '',\n '## Active Work',\n '',\n ];\n\n for (const work of ctx.activeWork) {\n lines.push(`- [ ] ${work}`);\n }\n\n lines.push('');\n lines.push('## Constraints');\n lines.push('');\n\n for (const constraint of ctx.constraints) {\n lines.push(`- ${constraint}`);\n }\n\n lines.push('');\n lines.push('## Context');\n lines.push('');\n lines.push(`- Branch: \\`${ctx.branch}\\``);\n lines.push(`- Issue: ${ctx.issueId}`);\n lines.push('');\n\n return lines.join('\\n');\n}\n\n// ============== SUMMARY.md ==============\n\nfunction getSummaryFile(agentId: string): string {\n return join(AGENTS_DIR, agentId, 'SUMMARY.md');\n}\n\n/**\n * Append a work summary to SUMMARY.md\n */\nexport function appendSummary(agentId: string, summary: SummaryEntry): void {\n const dir = join(AGENTS_DIR, agentId);\n mkdirSync(dir, { recursive: true });\n\n const summaryFile = getSummaryFile(agentId);\n const content = generateSummaryEntry(summary);\n\n if (existsSync(summaryFile)) {\n appendFileSync(summaryFile, '\\n---\\n\\n' + content);\n } else {\n writeFileSync(summaryFile, '# Work Summaries\\n\\n' + content);\n }\n}\n\nfunction generateSummaryEntry(summary: SummaryEntry): string {\n const lines: string[] = [\n `## ${summary.title}`,\n '',\n `**Completed:** ${summary.completedAt}`,\n ];\n\n if (summary.duration) {\n lines.push(`**Duration:** ${summary.duration} minutes`);\n }\n\n lines.push('');\n lines.push('### What Was Done');\n lines.push('');\n\n for (let i = 0; i < summary.whatWasDone.length; i++) {\n lines.push(`${i + 1}. ${summary.whatWasDone[i]}`);\n }\n\n if (summary.keyInsights && summary.keyInsights.length > 0) {\n lines.push('');\n lines.push('### Key Insights');\n lines.push('');\n for (let i = 0; i < summary.keyInsights.length; i++) {\n lines.push(`${i + 1}. ${summary.keyInsights[i]}`);\n }\n }\n\n if (summary.filesModified && summary.filesModified.length > 0) {\n lines.push('');\n lines.push('### Files Modified');\n lines.push('');\n for (const file of summary.filesModified) {\n lines.push(`- ${file}`);\n }\n }\n\n lines.push('');\n return lines.join('\\n');\n}\n\n// ============== History Files ==============\n\nfunction getHistoryDir(agentId: string): string {\n return join(AGENTS_DIR, agentId, 'history');\n}\n\n/**\n * Log an action to queryable history\n */\nexport function logHistory(\n agentId: string,\n action: string,\n details?: Record<string, any>\n): void {\n const historyDir = getHistoryDir(agentId);\n mkdirSync(historyDir, { recursive: true });\n\n const date = new Date();\n const dateStr = date.toISOString().split('T')[0];\n const historyFile = join(historyDir, `${dateStr}.log`);\n\n const timestamp = date.toISOString();\n const detailsStr = details ? ` ${JSON.stringify(details)}` : '';\n const logLine = `[${timestamp}] ${action}${detailsStr}\\n`;\n\n appendFileSync(historyFile, logLine);\n}\n\n/**\n * Search history files for a pattern\n */\nexport function searchHistory(agentId: string, pattern: string): string[] {\n const historyDir = getHistoryDir(agentId);\n if (!existsSync(historyDir)) return [];\n\n const results: string[] = [];\n const regex = new RegExp(pattern, 'i');\n\n const files = readdirSync(historyDir).filter((f) => f.endsWith('.log'));\n files.sort().reverse(); // Most recent first\n\n for (const file of files) {\n const content = readFileSync(join(historyDir, file), 'utf-8');\n const lines = content.split('\\n');\n\n for (const line of lines) {\n if (regex.test(line)) {\n results.push(line);\n }\n }\n }\n\n return results;\n}\n\n/**\n * Get recent history entries\n */\nexport function getRecentHistory(agentId: string, limit: number = 20): string[] {\n const historyDir = getHistoryDir(agentId);\n if (!existsSync(historyDir)) return [];\n\n const results: string[] = [];\n\n const files = readdirSync(historyDir).filter((f) => f.endsWith('.log'));\n files.sort().reverse(); // Most recent first\n\n for (const file of files) {\n if (results.length >= limit) break;\n\n const content = readFileSync(join(historyDir, file), 'utf-8');\n const lines = content.split('\\n').filter((l) => l.trim());\n\n for (const line of lines.reverse()) {\n if (results.length >= limit) break;\n results.push(line);\n }\n }\n\n return results;\n}\n\n// ============== Context Budget ==============\n\nexport interface ContextBudget {\n maxTokens: number;\n usedTokens: number;\n warningThreshold: number; // e.g., 0.8 = warn at 80%\n}\n\n/**\n * Estimate token count (rough approximation: ~4 chars per token)\n */\nexport function estimateTokens(text: string): number {\n return Math.ceil(text.length / 4);\n}\n\n/**\n * Check if context budget allows adding more content\n */\nexport function checkContextBudget(\n budget: ContextBudget,\n newContent: string\n): { allowed: boolean; warning: boolean; remaining: number } {\n const newTokens = estimateTokens(newContent);\n const totalUsed = budget.usedTokens + newTokens;\n const remaining = budget.maxTokens - totalUsed;\n const usageRatio = totalUsed / budget.maxTokens;\n\n return {\n allowed: totalUsed <= budget.maxTokens,\n warning: usageRatio >= budget.warningThreshold,\n remaining,\n };\n}\n\n/**\n * Create a context budget for a session\n */\nexport function createContextBudget(maxTokens: number = 100000): ContextBudget {\n return {\n maxTokens,\n usedTokens: 0,\n warningThreshold: 0.8,\n };\n}\n\n// ============== Context Materialization ==============\n\nfunction getMaterializedDir(agentId: string): string {\n return join(AGENTS_DIR, agentId, 'materialized');\n}\n\n/**\n * Materialize tool output for later retrieval\n */\nexport function materializeOutput(\n agentId: string,\n toolName: string,\n output: string,\n metadata?: Record<string, any>\n): string {\n const dir = getMaterializedDir(agentId);\n mkdirSync(dir, { recursive: true });\n\n const timestamp = Date.now();\n const filename = `${toolName}-${timestamp}.md`;\n const filepath = join(dir, filename);\n\n const lines: string[] = [\n `# Tool Output: ${toolName}`,\n '',\n `**Timestamp:** ${new Date(timestamp).toISOString()}`,\n ];\n\n if (metadata) {\n for (const [key, value] of Object.entries(metadata)) {\n lines.push(`**${key}:** ${value}`);\n }\n }\n\n lines.push('');\n lines.push('## Output');\n lines.push('');\n lines.push('```');\n lines.push(output);\n lines.push('```');\n lines.push('');\n\n writeFileSync(filepath, lines.join('\\n'));\n\n // Log to history\n logHistory(agentId, `materialized:${toolName}`, { file: filename });\n\n return filepath;\n}\n\n/**\n * List materialized outputs for an agent\n */\nexport function listMaterialized(agentId: string): Array<{\n tool: string;\n timestamp: number;\n file: string;\n}> {\n const dir = getMaterializedDir(agentId);\n if (!existsSync(dir)) return [];\n\n return readdirSync(dir)\n .filter((f) => f.endsWith('.md'))\n .map((f) => {\n const match = f.match(/^(.+)-(\\d+)\\.md$/);\n if (!match) return null;\n return {\n tool: match[1],\n timestamp: parseInt(match[2], 10),\n file: join(dir, f),\n };\n })\n .filter(Boolean) as Array<{ tool: string; timestamp: number; file: string }>;\n}\n\n/**\n * Read materialized output\n */\nexport function readMaterialized(filepath: string): string | null {\n if (!existsSync(filepath)) return null;\n return readFileSync(filepath, 'utf-8');\n}\n","import chalk from 'chalk';\nimport {\n getAgentHealth,\n pingAgent,\n handleStuckAgent,\n runHealthCheck,\n startHealthDaemon,\n formatHealthStatus,\n DEFAULT_PING_TIMEOUT_MS,\n DEFAULT_CONSECUTIVE_FAILURES,\n DEFAULT_COOLDOWN_MS,\n DEFAULT_CHECK_INTERVAL_MS,\n type HealthConfig,\n} from '../../../lib/health.js';\nimport { listRunningAgents } from '../../../lib/agents.js';\n\ninterface HealthOptions {\n json?: boolean;\n daemon?: boolean;\n interval?: number;\n}\n\nexport async function healthCommand(\n action?: string,\n arg?: string,\n options: HealthOptions = {}\n): Promise<void> {\n const config: HealthConfig = {\n pingTimeoutMs: DEFAULT_PING_TIMEOUT_MS,\n consecutiveFailures: DEFAULT_CONSECUTIVE_FAILURES,\n cooldownMs: DEFAULT_COOLDOWN_MS,\n checkIntervalMs: options.interval ? options.interval * 1000 : DEFAULT_CHECK_INTERVAL_MS,\n };\n\n switch (action) {\n case 'check': {\n // Run a single health check\n console.log(chalk.bold('Running health check...\\n'));\n\n const results = await runHealthCheck(config);\n\n if (options.json) {\n console.log(JSON.stringify(results, null, 2));\n return;\n }\n\n console.log(`Checked: ${results.checked} agents`);\n console.log(` ${chalk.green('\\u2705 Healthy:')} ${results.healthy}`);\n console.log(` ${chalk.yellow('\\u26a0\\ufe0f Warning:')} ${results.warning}`);\n console.log(` ${chalk.hex('#FFA500')('\\u{1f7e0} Stuck:')} ${results.stuck}`);\n console.log(` ${chalk.red('\\u274c Dead:')} ${results.dead}`);\n\n if (results.recovered.length > 0) {\n console.log('');\n console.log(chalk.green('Recovered agents:'));\n for (const agentId of results.recovered) {\n console.log(` - ${agentId}`);\n }\n }\n break;\n }\n\n case 'status': {\n // Show health status of all agents\n const agents = listRunningAgents();\n\n if (agents.length === 0) {\n console.log(chalk.dim('No agents found.'));\n return;\n }\n\n const healthData = agents.map((agent) => {\n const health = getAgentHealth(agent.id);\n return { agent, health };\n });\n\n if (options.json) {\n console.log(JSON.stringify(healthData.map((d) => d.health), null, 2));\n return;\n }\n\n console.log(chalk.bold('Agent Health Status:\\n'));\n\n for (const { health } of healthData) {\n console.log(formatHealthStatus(health));\n console.log('');\n }\n break;\n }\n\n case 'ping': {\n // Ping a specific agent\n if (!arg) {\n console.log(chalk.red('Agent ID required'));\n console.log(chalk.dim('Usage: pan work health ping <agent-id>'));\n return;\n }\n\n const agentId = arg.startsWith('agent-') ? arg : `agent-${arg.toLowerCase()}`;\n console.log(chalk.dim(`Pinging ${agentId}...`));\n\n const health = pingAgent(agentId, config);\n\n if (options.json) {\n console.log(JSON.stringify(health, null, 2));\n return;\n }\n\n console.log('');\n console.log(formatHealthStatus(health));\n break;\n }\n\n case 'recover': {\n // Force recovery of a specific agent\n if (!arg) {\n console.log(chalk.red('Agent ID required'));\n console.log(chalk.dim('Usage: pan work health recover <agent-id>'));\n return;\n }\n\n const agentId = arg.startsWith('agent-') ? arg : `agent-${arg.toLowerCase()}`;\n console.log(chalk.dim(`Attempting recovery of ${agentId}...`));\n\n // Override config to allow immediate recovery\n const forceConfig = { ...config, consecutiveFailures: 0 };\n const result = await handleStuckAgent(agentId, forceConfig);\n\n if (options.json) {\n console.log(JSON.stringify(result, null, 2));\n return;\n }\n\n if (result.action === 'recovered') {\n console.log(chalk.green(`\\u2705 ${result.reason}`));\n } else if (result.action === 'cooldown') {\n console.log(chalk.yellow(`\\u26a0\\ufe0f ${result.reason}`));\n } else {\n console.log(chalk.dim(result.reason));\n }\n break;\n }\n\n case 'daemon': {\n // Start the health monitoring daemon\n console.log(chalk.bold('Starting Panopticon Health Daemon'));\n console.log(chalk.dim(`Check interval: ${config.checkIntervalMs / 1000}s`));\n console.log(chalk.dim(`Failure threshold: ${config.consecutiveFailures}`));\n console.log(chalk.dim(`Cooldown: ${config.cooldownMs / (1000 * 60)}m`));\n console.log('');\n console.log(chalk.dim('Press Ctrl+C to stop...\\n'));\n\n const stop = startHealthDaemon(config, (results) => {\n const timestamp = new Date().toLocaleTimeString();\n const statusParts = [\n `[${timestamp}]`,\n `\\u2705${results.healthy}`,\n `\\u26a0\\ufe0f${results.warning}`,\n `\\u{1f7e0}${results.stuck}`,\n `\\u274c${results.dead}`,\n ];\n\n if (results.recovered.length > 0) {\n statusParts.push(chalk.green(`+${results.recovered.length} recovered`));\n }\n\n console.log(statusParts.join(' '));\n });\n\n // Handle graceful shutdown\n process.on('SIGINT', () => {\n console.log('\\n' + chalk.dim('Stopping health daemon...'));\n stop();\n process.exit(0);\n });\n\n // Keep process running\n await new Promise(() => {});\n break;\n }\n\n default:\n console.log(chalk.bold('Health Monitoring Commands:'));\n console.log('');\n console.log(` ${chalk.cyan('pan work health check')} - Run single health check`);\n console.log(` ${chalk.cyan('pan work health status')} - Show all agent health`);\n console.log(` ${chalk.cyan('pan work health ping <id>')} - Ping specific agent`);\n console.log(` ${chalk.cyan('pan work health recover <id>')} - Force recover agent`);\n console.log(` ${chalk.cyan('pan work health daemon')} - Start health daemon`);\n console.log('');\n console.log(chalk.bold('Options:'));\n console.log(` ${chalk.dim('--json')} Output as JSON`);\n console.log(` ${chalk.dim('--interval <sec>')} Check interval for daemon (default: 30)`);\n console.log('');\n console.log(chalk.bold('Deacon Pattern Defaults:'));\n console.log(` Ping timeout: ${DEFAULT_PING_TIMEOUT_MS / 1000}s`);\n console.log(` Consecutive failures: ${DEFAULT_CONSECUTIVE_FAILURES}`);\n console.log(` Cooldown after kill: ${DEFAULT_COOLDOWN_MS / (1000 * 60)}m`);\n console.log('');\n }\n}\n","/**\n * Health Monitoring System (Deacon Pattern)\n *\n * Implements stuck detection and auto-recovery with cooldown:\n * - Default ping timeout: 30 seconds\n * - Default consecutive failures: 3\n * - Default cooldown: 5 minutes\n */\n\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from 'fs';\nimport { join } from 'path';\nimport { execSync } from 'child_process';\nimport { AGENTS_DIR } from './paths.js';\nimport { recoverAgent, stopAgent, getAgentState } from './agents.js';\n\n// Deacon pattern defaults\nexport const DEFAULT_PING_TIMEOUT_MS = 30 * 1000; // 30 seconds\nexport const DEFAULT_CONSECUTIVE_FAILURES = 3;\nexport const DEFAULT_COOLDOWN_MS = 5 * 60 * 1000; // 5 minutes\nexport const DEFAULT_CHECK_INTERVAL_MS = 30 * 1000; // 30 seconds\n\nexport interface AgentHealth {\n agentId: string;\n status: 'healthy' | 'warning' | 'stuck' | 'dead';\n lastActivity?: string;\n lastPing?: string;\n lastPingResponse?: string;\n consecutiveFailures: number;\n lastForceKill?: string;\n forceKillCount: number;\n recoveryCount: number;\n inCooldown: boolean;\n}\n\nexport interface HealthConfig {\n pingTimeoutMs: number;\n consecutiveFailures: number;\n cooldownMs: number;\n checkIntervalMs: number;\n}\n\nfunction getHealthFile(agentId: string): string {\n return join(AGENTS_DIR, agentId, 'health.json');\n}\n\n/**\n * Get or create health record for an agent\n */\nexport function getAgentHealth(agentId: string): AgentHealth {\n const healthFile = getHealthFile(agentId);\n\n const defaultHealth: AgentHealth = {\n agentId,\n status: 'healthy',\n consecutiveFailures: 0,\n forceKillCount: 0,\n recoveryCount: 0,\n inCooldown: false,\n };\n\n if (existsSync(healthFile)) {\n try {\n const stored = JSON.parse(readFileSync(healthFile, 'utf-8'));\n return { ...defaultHealth, ...stored };\n } catch {}\n }\n\n return defaultHealth;\n}\n\n/**\n * Save health record for an agent\n */\nexport function saveAgentHealth(health: AgentHealth): void {\n const dir = join(AGENTS_DIR, health.agentId);\n mkdirSync(dir, { recursive: true });\n writeFileSync(getHealthFile(health.agentId), JSON.stringify(health, null, 2));\n}\n\n/**\n * Check if agent's tmux session is alive\n */\nexport function isAgentAlive(agentId: string): boolean {\n try {\n execSync(`tmux has-session -t \"${agentId}\" 2>/dev/null`, { encoding: 'utf-8' });\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Get recent output from agent's terminal\n */\nexport function getAgentOutput(agentId: string, lines: number = 20): string | null {\n try {\n const output = execSync(\n `tmux capture-pane -t \"${agentId}\" -p -S -${lines} 2>/dev/null`,\n { encoding: 'utf-8', maxBuffer: 1024 * 1024 }\n );\n return output.trim();\n } catch {\n return null;\n }\n}\n\n/**\n * Send a health check nudge to the agent\n * Returns true if we detect activity, false otherwise\n */\nexport function sendHealthNudge(agentId: string): boolean {\n if (!isAgentAlive(agentId)) {\n return false;\n }\n\n // Capture output before nudge\n const outputBefore = getAgentOutput(agentId, 5);\n\n // Send a gentle nudge - just check if the session is responsive\n // We don't want to interrupt actual work, just verify the session exists\n try {\n // Check if there's been any recent output change\n // For now, we consider alive = responsive\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Ping an agent and update health status\n */\nexport function pingAgent(\n agentId: string,\n config: HealthConfig = {\n pingTimeoutMs: DEFAULT_PING_TIMEOUT_MS,\n consecutiveFailures: DEFAULT_CONSECUTIVE_FAILURES,\n cooldownMs: DEFAULT_COOLDOWN_MS,\n checkIntervalMs: DEFAULT_CHECK_INTERVAL_MS,\n }\n): AgentHealth {\n const health = getAgentHealth(agentId);\n health.lastPing = new Date().toISOString();\n\n // Check if session is alive\n const alive = isAgentAlive(agentId);\n\n if (!alive) {\n // Session is dead\n health.status = 'dead';\n health.consecutiveFailures++;\n } else {\n // Session is alive - check for activity\n const state = getAgentState(agentId);\n const lastActivity = state?.lastActivity ? new Date(state.lastActivity) : null;\n\n if (lastActivity) {\n const ageMs = Date.now() - lastActivity.getTime();\n const ageMinutes = ageMs / (1000 * 60);\n\n if (ageMinutes > 30) {\n health.status = 'stuck';\n health.consecutiveFailures++;\n } else if (ageMinutes > 15) {\n health.status = 'warning';\n // Don't increment failures for warning, just monitor\n } else {\n health.status = 'healthy';\n health.consecutiveFailures = 0;\n }\n } else {\n // No activity tracking, assume healthy if alive\n health.status = 'healthy';\n health.consecutiveFailures = 0;\n }\n\n health.lastPingResponse = new Date().toISOString();\n }\n\n // Check cooldown status\n if (health.lastForceKill) {\n const timeSinceKill = Date.now() - new Date(health.lastForceKill).getTime();\n health.inCooldown = timeSinceKill < config.cooldownMs;\n } else {\n health.inCooldown = false;\n }\n\n saveAgentHealth(health);\n return health;\n}\n\n/**\n * Handle a stuck agent - force kill and respawn with context\n */\nexport async function handleStuckAgent(\n agentId: string,\n config: HealthConfig = {\n pingTimeoutMs: DEFAULT_PING_TIMEOUT_MS,\n consecutiveFailures: DEFAULT_CONSECUTIVE_FAILURES,\n cooldownMs: DEFAULT_COOLDOWN_MS,\n checkIntervalMs: DEFAULT_CHECK_INTERVAL_MS,\n }\n): Promise<{ action: 'recovered' | 'cooldown' | 'skipped'; reason: string }> {\n const health = getAgentHealth(agentId);\n\n // Check if failures meet threshold\n if (health.consecutiveFailures < config.consecutiveFailures) {\n return {\n action: 'skipped',\n reason: `Only ${health.consecutiveFailures} failures (need ${config.consecutiveFailures})`,\n };\n }\n\n // Check cooldown\n if (health.lastForceKill) {\n const timeSinceKill = Date.now() - new Date(health.lastForceKill).getTime();\n if (timeSinceKill < config.cooldownMs) {\n const remainingMs = config.cooldownMs - timeSinceKill;\n const remainingMin = Math.ceil(remainingMs / (1000 * 60));\n return {\n action: 'cooldown',\n reason: `In cooldown (${remainingMin}m remaining)`,\n };\n }\n }\n\n // Force kill the agent\n try {\n stopAgent(agentId);\n } catch {}\n\n // Record the force kill\n health.lastForceKill = new Date().toISOString();\n health.forceKillCount++;\n health.consecutiveFailures = 0;\n health.status = 'dead';\n health.inCooldown = true;\n saveAgentHealth(health);\n\n // Attempt recovery\n try {\n const recovered = recoverAgent(agentId);\n if (recovered) {\n health.status = 'healthy';\n health.recoveryCount++;\n saveAgentHealth(health);\n return { action: 'recovered', reason: 'Force killed and respawned' };\n }\n } catch {}\n\n return { action: 'recovered', reason: 'Force killed (respawn failed)' };\n}\n\n/**\n * Run a single health check cycle for all agents\n */\nexport async function runHealthCheck(\n config: HealthConfig = {\n pingTimeoutMs: DEFAULT_PING_TIMEOUT_MS,\n consecutiveFailures: DEFAULT_CONSECUTIVE_FAILURES,\n cooldownMs: DEFAULT_COOLDOWN_MS,\n checkIntervalMs: DEFAULT_CHECK_INTERVAL_MS,\n }\n): Promise<{\n checked: number;\n healthy: number;\n warning: number;\n stuck: number;\n dead: number;\n recovered: string[];\n}> {\n const results = {\n checked: 0,\n healthy: 0,\n warning: 0,\n stuck: 0,\n dead: 0,\n recovered: [] as string[],\n };\n\n // Get all agent sessions\n let sessions: string[] = [];\n try {\n const output = execSync(\n 'tmux list-sessions -F \"#{session_name}\" 2>/dev/null || true',\n { encoding: 'utf-8' }\n );\n sessions = output\n .trim()\n .split('\\n')\n .filter((s) => s.startsWith('agent-'));\n } catch {}\n\n // Also check agents dir for crashed agents\n if (existsSync(AGENTS_DIR)) {\n const { readdirSync } = await import('fs');\n const dirs = readdirSync(AGENTS_DIR, { withFileTypes: true })\n .filter((d) => d.isDirectory() && d.name.startsWith('agent-'))\n .map((d) => d.name);\n\n for (const dir of dirs) {\n if (!sessions.includes(dir)) {\n sessions.push(dir);\n }\n }\n }\n\n // Check each agent\n for (const agentId of sessions) {\n results.checked++;\n\n const health = pingAgent(agentId, config);\n\n switch (health.status) {\n case 'healthy':\n results.healthy++;\n break;\n case 'warning':\n results.warning++;\n break;\n case 'stuck':\n results.stuck++;\n // Handle stuck agent\n const result = await handleStuckAgent(agentId, config);\n if (result.action === 'recovered') {\n results.recovered.push(agentId);\n }\n break;\n case 'dead':\n results.dead++;\n // Handle dead agent\n const deadResult = await handleStuckAgent(agentId, config);\n if (deadResult.action === 'recovered') {\n results.recovered.push(agentId);\n }\n break;\n }\n }\n\n return results;\n}\n\n/**\n * Start the health monitoring daemon\n * Returns a stop function\n */\nexport function startHealthDaemon(\n config: HealthConfig = {\n pingTimeoutMs: DEFAULT_PING_TIMEOUT_MS,\n consecutiveFailures: DEFAULT_CONSECUTIVE_FAILURES,\n cooldownMs: DEFAULT_COOLDOWN_MS,\n checkIntervalMs: DEFAULT_CHECK_INTERVAL_MS,\n },\n onCheck?: (results: Awaited<ReturnType<typeof runHealthCheck>>) => void\n): () => void {\n let running = true;\n\n const runLoop = async () => {\n while (running) {\n try {\n const results = await runHealthCheck(config);\n if (onCheck) {\n onCheck(results);\n }\n } catch (error) {\n console.error('Health check error:', error);\n }\n\n // Wait for next interval\n await new Promise((resolve) => setTimeout(resolve, config.checkIntervalMs));\n }\n };\n\n // Start the loop\n runLoop();\n\n // Return stop function\n return () => {\n running = false;\n };\n}\n\n/**\n * Format health status for display\n */\nexport function formatHealthStatus(health: AgentHealth): string {\n const statusIcons = {\n healthy: '\\u2705',\n warning: '\\u26a0\\ufe0f',\n stuck: '\\u{1f7e0}',\n dead: '\\u274c',\n };\n\n const lines: string[] = [\n `${statusIcons[health.status]} ${health.agentId}: ${health.status.toUpperCase()}`,\n ];\n\n if (health.lastPing) {\n lines.push(` Last ping: ${health.lastPing}`);\n }\n\n if (health.consecutiveFailures > 0) {\n lines.push(` Consecutive failures: ${health.consecutiveFailures}`);\n }\n\n if (health.forceKillCount > 0) {\n lines.push(` Force kills: ${health.forceKillCount}`);\n }\n\n if (health.recoveryCount > 0) {\n lines.push(` Recoveries: ${health.recoveryCount}`);\n }\n\n if (health.inCooldown) {\n lines.push(` Status: IN COOLDOWN`);\n }\n\n return lines.join('\\n');\n}\n","import { Command } from 'commander';\nimport { issueCommand } from './issue.js';\nimport { statusCommand } from './status.js';\nimport { tellCommand } from './tell.js';\nimport { killCommand } from './kill.js';\nimport { pendingCommand } from './pending.js';\nimport { approveCommand } from './approve.js';\nimport { planCommand } from './plan.js';\nimport { listCommand } from './list.js';\nimport { triageCommand } from './triage.js';\nimport { hookCommand } from './hook.js';\nimport { recoverCommand } from './recover.js';\nimport { cvCommand } from './cv.js';\nimport { contextCommand } from './context.js';\nimport { healthCommand } from './health.js';\n\nexport function registerWorkCommands(program: Command): void {\n const work = program\n .command('work')\n .description('Agent and work management');\n\n work\n .command('issue <id>')\n .description('Spawn agent for Linear issue')\n .option('--model <model>', 'Claude model (sonnet/opus/haiku)', 'sonnet')\n .option('--runtime <runtime>', 'AI runtime (claude/codex)', 'claude')\n .option('--dry-run', 'Show what would be created')\n .action(issueCommand);\n\n work\n .command('status')\n .description('Show all running agents')\n .option('--json', 'Output as JSON')\n .action(statusCommand);\n\n work\n .command('tell <id> <message>')\n .description('Send message to running agent')\n .action(tellCommand);\n\n work\n .command('kill <id>')\n .description('Kill an agent')\n .option('--force', 'Kill without confirmation')\n .action(killCommand);\n\n work\n .command('pending')\n .description('Show completed work awaiting review')\n .action(pendingCommand);\n\n work\n .command('approve <id>')\n .description('Approve agent work, merge MR, update Linear')\n .option('--no-merge', 'Skip MR merge')\n .option('--no-linear', 'Skip Linear status update')\n .action(approveCommand);\n\n work\n .command('plan <id>')\n .description('Create execution plan before spawning')\n .option('-o, --output <path>', 'Output file path')\n .option('--json', 'Output as JSON')\n .action(planCommand);\n\n work\n .command('list')\n .description('List Linear issues')\n .option('--all', 'Include completed issues')\n .option('--mine', 'Show only my assigned issues')\n .option('--json', 'Output as JSON')\n .action(listCommand);\n\n work\n .command('triage [id]')\n .description('Triage secondary tracker issues')\n .option('--create', 'Create primary issue from secondary')\n .option('--dismiss <reason>', 'Dismiss from triage')\n .action(triageCommand);\n\n work\n .command('hook [action] [idOrMessage...]')\n .description('GUPP hooks: check, push, pop, clear, mail, gupp')\n .option('--json', 'Output as JSON')\n .action((action, idOrMessage, options) => {\n hookCommand(action || 'help', idOrMessage?.join(' '), options);\n });\n\n work\n .command('recover [id]')\n .description('Recover crashed agents')\n .option('--all', 'Auto-recover all crashed agents')\n .option('--json', 'Output as JSON')\n .action(recoverCommand);\n\n work\n .command('cv [agentId]')\n .description('View agent CVs (work history) and rankings')\n .option('--json', 'Output as JSON')\n .option('--rankings', 'Show agent rankings')\n .action(cvCommand);\n\n work\n .command('context [action] [arg1] [arg2]')\n .description('Context engineering: state, checkpoint, history, materialize')\n .option('--json', 'Output as JSON')\n .action((action, arg1, arg2, options) => {\n contextCommand(action || 'help', arg1, arg2, options);\n });\n\n work\n .command('health [action] [id]')\n .description('Health monitoring: check, status, ping, recover, daemon')\n .option('--json', 'Output as JSON')\n .option('--interval <seconds>', 'Daemon check interval', '30')\n .action((action, id, options) => {\n healthCommand(action || 'help', id, {\n json: options.json,\n interval: parseInt(options.interval, 10),\n });\n });\n}\n\n// Re-export individual commands for direct use\nexport { statusCommand } from './status.js';\nexport { issueCommand } from './issue.js';\nexport { tellCommand } from './tell.js';\nexport { killCommand } from './kill.js';\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport { existsSync, mkdirSync, writeFileSync } from 'fs';\nimport { join, basename } from 'path';\nimport { createWorktree, removeWorktree, listWorktrees } from '../../lib/worktree.js';\nimport { generateClaudeMd, TemplateVariables } from '../../lib/template.js';\nimport { mergeSkillsIntoWorkspace } from '../../lib/skills-merge.js';\n\nexport function registerWorkspaceCommands(program: Command): void {\n const workspace = program.command('workspace').description('Workspace management');\n\n workspace\n .command('create <issueId>')\n .description('Create workspace for issue')\n .option('--dry-run', 'Show what would be created')\n .option('--no-skills', 'Skip skills symlink setup')\n .action(createCommand);\n\n workspace\n .command('list')\n .description('List all workspaces')\n .option('--json', 'Output as JSON')\n .action(listCommand);\n\n workspace\n .command('destroy <issueId>')\n .description('Destroy workspace')\n .option('--force', 'Force removal even with uncommitted changes')\n .action(destroyCommand);\n}\n\ninterface CreateOptions {\n dryRun?: boolean;\n skills?: boolean;\n}\n\nasync function createCommand(issueId: string, options: CreateOptions): Promise<void> {\n const spinner = ora('Creating workspace...').start();\n\n try {\n // Normalize issue ID (e.g., MIN-123 -> min-123)\n const normalizedId = issueId.toLowerCase().replace(/[^a-z0-9-]/g, '-');\n const branchName = `feature/${normalizedId}`;\n const folderName = `feature-${normalizedId}`;\n\n // Determine paths\n const projectRoot = process.cwd();\n const workspacesDir = join(projectRoot, 'workspaces');\n const workspacePath = join(workspacesDir, folderName);\n\n if (options.dryRun) {\n spinner.info('Dry run mode');\n console.log('');\n console.log(chalk.bold('Would create:'));\n console.log(` Workspace: ${chalk.cyan(workspacePath)}`);\n console.log(` Branch: ${chalk.cyan(branchName)}`);\n console.log(` CLAUDE.md: ${chalk.dim(join(workspacePath, 'CLAUDE.md'))}`);\n if (options.skills !== false) {\n console.log(` Skills: ${chalk.dim(join(workspacePath, '.claude', 'skills'))}`);\n }\n return;\n }\n\n // Check if already exists\n if (existsSync(workspacePath)) {\n spinner.fail(`Workspace already exists: ${workspacePath}`);\n process.exit(1);\n }\n\n // Check if we're in a git repo\n if (!existsSync(join(projectRoot, '.git'))) {\n spinner.fail('Not a git repository. Run this from the project root.');\n process.exit(1);\n }\n\n // Create worktree\n spinner.text = 'Creating git worktree...';\n createWorktree(projectRoot, workspacePath, branchName);\n\n // Generate CLAUDE.md\n spinner.text = 'Generating CLAUDE.md...';\n const variables: TemplateVariables = {\n FEATURE_FOLDER: folderName,\n BRANCH_NAME: branchName,\n ISSUE_ID: issueId.toUpperCase(),\n WORKSPACE_PATH: workspacePath,\n FRONTEND_URL: `https://${folderName}.localhost:3000`,\n API_URL: `https://api-${folderName}.localhost:8080`,\n };\n\n const claudeMd = generateClaudeMd(projectRoot, variables);\n writeFileSync(join(workspacePath, 'CLAUDE.md'), claudeMd);\n\n // Merge skills (unless disabled)\n let skillsResult = { added: [] as string[], skipped: [] as string[] };\n if (options.skills !== false) {\n spinner.text = 'Merging skills...';\n mkdirSync(join(workspacePath, '.claude', 'skills'), { recursive: true });\n skillsResult = mergeSkillsIntoWorkspace(workspacePath);\n }\n\n spinner.succeed('Workspace created!');\n\n console.log('');\n console.log(chalk.bold('Workspace Details:'));\n console.log(` Path: ${chalk.cyan(workspacePath)}`);\n console.log(` Branch: ${chalk.dim(branchName)}`);\n console.log('');\n\n if (options.skills !== false) {\n console.log(chalk.bold('Skills:'));\n console.log(` Added: ${skillsResult.added.length} Panopticon skills`);\n if (skillsResult.skipped.length > 0) {\n console.log(` Skipped: ${chalk.dim(skillsResult.skipped.join(', '))}`);\n }\n console.log('');\n }\n\n console.log(chalk.dim(`Next: cd ${workspacePath}`));\n\n } catch (error: any) {\n spinner.fail(error.message);\n process.exit(1);\n }\n}\n\nasync function listCommand(options: { json?: boolean }): Promise<void> {\n const projectRoot = process.cwd();\n\n // Check if we're in a git repo\n if (!existsSync(join(projectRoot, '.git'))) {\n console.error(chalk.red('Not a git repository.'));\n process.exit(1);\n }\n\n const worktrees = listWorktrees(projectRoot);\n\n // Filter to workspaces directory only\n const workspaces = worktrees.filter((w) =>\n w.path.includes('/workspaces/') || w.path.includes('\\\\workspaces\\\\')\n );\n\n if (options.json) {\n console.log(JSON.stringify(workspaces, null, 2));\n return;\n }\n\n if (workspaces.length === 0) {\n console.log(chalk.dim('No workspaces found.'));\n console.log(chalk.dim('Create one with: pan workspace create <issue-id>'));\n return;\n }\n\n console.log(chalk.bold('\\nWorkspaces\\n'));\n\n for (const ws of workspaces) {\n const name = basename(ws.path);\n const status = ws.prunable ? chalk.yellow(' (prunable)') : '';\n console.log(`${chalk.cyan(name)}${status}`);\n console.log(` Branch: ${ws.branch || chalk.dim('(detached)')}`);\n console.log(` Path: ${chalk.dim(ws.path)}`);\n console.log('');\n }\n}\n\nasync function destroyCommand(\n issueId: string,\n options: { force?: boolean }\n): Promise<void> {\n const spinner = ora('Destroying workspace...').start();\n\n try {\n const normalizedId = issueId.toLowerCase().replace(/[^a-z0-9-]/g, '-');\n const folderName = `feature-${normalizedId}`;\n const projectRoot = process.cwd();\n const workspacePath = join(projectRoot, 'workspaces', folderName);\n\n if (!existsSync(workspacePath)) {\n spinner.fail(`Workspace not found: ${workspacePath}`);\n process.exit(1);\n }\n\n spinner.text = 'Removing git worktree...';\n removeWorktree(projectRoot, workspacePath);\n\n spinner.succeed(`Workspace destroyed: ${folderName}`);\n\n } catch (error: any) {\n spinner.fail(error.message);\n if (!options.force) {\n console.log(chalk.dim('Tip: Use --force to remove even with uncommitted changes'));\n }\n process.exit(1);\n }\n}\n","import { execSync } from 'child_process';\nimport { mkdirSync } from 'fs';\nimport { dirname } from 'path';\n\nexport interface WorktreeInfo {\n path: string;\n branch: string;\n head: string;\n prunable: boolean;\n}\n\nexport function listWorktrees(repoPath: string): WorktreeInfo[] {\n const output = execSync('git worktree list --porcelain', {\n cwd: repoPath,\n encoding: 'utf8',\n });\n\n const worktrees: WorktreeInfo[] = [];\n let current: Partial<WorktreeInfo> = {};\n\n for (const line of output.split('\\n')) {\n if (line.startsWith('worktree ')) {\n if (current.path) worktrees.push(current as WorktreeInfo);\n current = { path: line.slice(9), prunable: false };\n } else if (line.startsWith('HEAD ')) {\n current.head = line.slice(5);\n } else if (line.startsWith('branch ')) {\n current.branch = line.slice(7).replace('refs/heads/', '');\n } else if (line === 'prunable') {\n current.prunable = true;\n }\n }\n if (current.path) worktrees.push(current as WorktreeInfo);\n\n return worktrees;\n}\n\nexport function createWorktree(\n repoPath: string,\n targetPath: string,\n branchName: string\n): void {\n // Ensure parent directory exists\n mkdirSync(dirname(targetPath), { recursive: true });\n\n // Check if branch exists\n try {\n execSync(`git show-ref --verify --quiet refs/heads/${branchName}`, {\n cwd: repoPath,\n });\n // Branch exists, just add worktree\n execSync(`git worktree add \"${targetPath}\" \"${branchName}\"`, {\n cwd: repoPath,\n stdio: 'pipe',\n });\n } catch {\n // Branch doesn't exist, create it\n execSync(`git worktree add -b \"${branchName}\" \"${targetPath}\"`, {\n cwd: repoPath,\n stdio: 'pipe',\n });\n }\n}\n\nexport function removeWorktree(repoPath: string, worktreePath: string): void {\n execSync(`git worktree remove \"${worktreePath}\" --force`, {\n cwd: repoPath,\n stdio: 'pipe',\n });\n}\n\nexport function pruneWorktrees(repoPath: string): void {\n execSync('git worktree prune', { cwd: repoPath, stdio: 'pipe' });\n}\n","import { readFileSync, existsSync, readdirSync } from 'fs';\nimport { join } from 'path';\nimport { CLAUDE_MD_TEMPLATES } from './paths.js';\n\nexport interface TemplateVariables {\n FEATURE_FOLDER: string;\n BRANCH_NAME: string;\n ISSUE_ID: string;\n WORKSPACE_PATH: string;\n FRONTEND_URL?: string;\n API_URL?: string;\n PROJECT_NAME?: string;\n PROJECT_DOMAIN?: string;\n [key: string]: string | undefined;\n}\n\nexport function loadTemplate(templatePath: string): string {\n if (!existsSync(templatePath)) {\n throw new Error(`Template not found: ${templatePath}`);\n }\n return readFileSync(templatePath, 'utf8');\n}\n\nexport function substituteVariables(\n template: string,\n variables: TemplateVariables\n): string {\n let result = template;\n\n for (const [key, value] of Object.entries(variables)) {\n if (value !== undefined) {\n // Replace {{KEY}} and ${KEY} patterns\n result = result.replace(new RegExp(`\\\\{\\\\{${key}\\\\}\\\\}`, 'g'), value);\n result = result.replace(new RegExp(`\\\\$\\\\{${key}\\\\}`, 'g'), value);\n }\n }\n\n return result;\n}\n\nexport function generateClaudeMd(\n projectPath: string,\n variables: TemplateVariables\n): string {\n const sections: string[] = [];\n\n // Layer 1: Panopticon default sections\n const defaultOrder = [\n 'workspace-info.md',\n 'beads.md',\n 'commands-skills.md',\n 'warnings.md',\n ];\n\n for (const section of defaultOrder) {\n const sectionPath = join(CLAUDE_MD_TEMPLATES, section);\n if (existsSync(sectionPath)) {\n const content = loadTemplate(sectionPath);\n sections.push(substituteVariables(content, variables));\n }\n }\n\n // Layer 2: Project-specific sections\n const projectSections = join(projectPath, '.panopticon', 'claude-md', 'sections');\n if (existsSync(projectSections)) {\n const projectFiles = readdirSync(projectSections)\n .filter((f) => f.endsWith('.md'))\n .sort();\n\n for (const file of projectFiles) {\n const content = loadTemplate(join(projectSections, file));\n sections.push(substituteVariables(content, variables));\n }\n }\n\n // If no sections found, return minimal CLAUDE.md\n if (sections.length === 0) {\n return `# Workspace: ${variables.FEATURE_FOLDER}\n\n**Issue:** ${variables.ISSUE_ID}\n**Branch:** ${variables.BRANCH_NAME}\n**Path:** ${variables.WORKSPACE_PATH}\n\n## Getting Started\n\nThis workspace was created by Panopticon. Use \\`bd\\` commands to track your work.\n`;\n }\n\n return sections.join('\\n\\n---\\n\\n');\n}\n","import {\n existsSync,\n readdirSync,\n lstatSync,\n readlinkSync,\n symlinkSync,\n mkdirSync,\n appendFileSync,\n} from 'fs';\nimport { join } from 'path';\nimport { execSync } from 'child_process';\nimport { SKILLS_DIR } from './paths.js';\n\ntype ContentOrigin = 'git-tracked' | 'panopticon' | 'user-untracked';\n\nfunction detectContentOrigin(path: string, repoPath: string): ContentOrigin {\n try {\n const stat = lstatSync(path);\n\n // Check if symlink pointing to panopticon\n if (stat.isSymbolicLink()) {\n const target = readlinkSync(path);\n if (target.includes('.panopticon')) {\n return 'panopticon';\n }\n }\n\n // Check if git-tracked\n try {\n execSync(`git ls-files --error-unmatch \"${path}\" 2>/dev/null`, {\n cwd: repoPath,\n stdio: 'pipe',\n });\n return 'git-tracked';\n } catch {\n return 'user-untracked';\n }\n } catch {\n return 'user-untracked';\n }\n}\n\nexport function mergeSkillsIntoWorkspace(workspacePath: string): {\n added: string[];\n skipped: string[];\n} {\n const skillsTarget = join(workspacePath, '.claude', 'skills');\n const added: string[] = [];\n const skipped: string[] = [];\n\n // Ensure target directory exists\n mkdirSync(skillsTarget, { recursive: true });\n\n // Get existing skills in workspace\n const existingSkills = new Set<string>();\n if (existsSync(skillsTarget)) {\n for (const item of readdirSync(skillsTarget)) {\n existingSkills.add(item);\n }\n }\n\n // Get panopticon skills\n if (!existsSync(SKILLS_DIR)) return { added, skipped };\n\n const panopticonSkills = readdirSync(SKILLS_DIR, { withFileTypes: true })\n .filter((d) => d.isDirectory())\n .map((d) => d.name);\n\n for (const skill of panopticonSkills) {\n const targetPath = join(skillsTarget, skill);\n const sourcePath = join(SKILLS_DIR, skill);\n\n // Skip if exists and is git-tracked\n if (existingSkills.has(skill)) {\n const origin = detectContentOrigin(targetPath, workspacePath);\n if (origin === 'git-tracked') {\n skipped.push(`${skill} (git-tracked)`);\n continue;\n }\n if (origin === 'panopticon') {\n // Already ours, skip silently\n continue;\n }\n }\n\n // Create symlink\n try {\n symlinkSync(sourcePath, targetPath);\n added.push(skill);\n } catch (error: any) {\n if (error.code !== 'EEXIST') {\n // If exists but not symlink, skip\n skipped.push(`${skill} (exists)`);\n }\n }\n }\n\n // Update .gitignore if we added anything\n if (added.length > 0) {\n updateGitignore(skillsTarget, added);\n }\n\n return { added, skipped };\n}\n\nfunction updateGitignore(skillsDir: string, skills: string[]): void {\n const gitignorePath = join(skillsDir, '.gitignore');\n\n const content = `# Panopticon-managed symlinks (not committed)\n${skills.join('\\n')}\n`;\n\n try {\n appendFileSync(gitignorePath, content);\n } catch {\n // Ignore errors writing .gitignore\n }\n}\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport { execSync } from 'child_process';\nimport { existsSync, mkdirSync, writeFileSync, readFileSync } from 'fs';\nimport { join } from 'path';\nimport { homedir, platform } from 'os';\nimport { PANOPTICON_HOME, INIT_DIRS } from '../../lib/paths.js';\n\nexport function registerInstallCommand(program: Command): void {\n program\n .command('install')\n .description('Install Panopticon prerequisites')\n .option('--check', 'Check prerequisites only')\n .option('--minimal', 'Skip Traefik and mkcert (use port-based routing)')\n .option('--skip-mkcert', 'Skip mkcert/HTTPS setup')\n .option('--skip-docker', 'Skip Docker network setup')\n .action(installCommand);\n}\n\ninterface InstallOptions {\n check?: boolean;\n minimal?: boolean;\n skipMkcert?: boolean;\n skipDocker?: boolean;\n}\n\ninterface PrereqResult {\n name: string;\n passed: boolean;\n message: string;\n fix?: string;\n}\n\nfunction detectPlatform(): 'linux' | 'darwin' | 'win32' | 'wsl' {\n const os = platform();\n if (os === 'linux') {\n // Check for WSL\n try {\n const release = readFileSync('/proc/version', 'utf8').toLowerCase();\n if (release.includes('microsoft') || release.includes('wsl')) {\n return 'wsl';\n }\n } catch {}\n return 'linux';\n }\n return os as 'darwin' | 'win32';\n}\n\nfunction checkCommand(cmd: string): boolean {\n try {\n execSync(`which ${cmd}`, { stdio: 'pipe' });\n return true;\n } catch {\n return false;\n }\n}\n\nfunction checkPrerequisites(): { results: PrereqResult[]; allPassed: boolean } {\n const results: PrereqResult[] = [];\n\n // Node.js\n const nodeVersion = process.version;\n const nodeMajor = parseInt(nodeVersion.slice(1).split('.')[0]);\n results.push({\n name: 'Node.js',\n passed: nodeMajor >= 18,\n message: nodeMajor >= 18 ? `v${nodeVersion}` : `v${nodeVersion} (need v18+)`,\n fix: 'Install Node.js 18+ from https://nodejs.org',\n });\n\n // Git\n const hasGit = checkCommand('git');\n results.push({\n name: 'Git',\n passed: hasGit,\n message: hasGit ? 'installed' : 'not found',\n fix: 'Install git from your package manager',\n });\n\n // Docker\n const hasDocker = checkCommand('docker');\n let dockerRunning = false;\n if (hasDocker) {\n try {\n execSync('docker info', { stdio: 'pipe' });\n dockerRunning = true;\n } catch {}\n }\n results.push({\n name: 'Docker',\n passed: dockerRunning,\n message: dockerRunning ? 'running' : hasDocker ? 'not running' : 'not found',\n fix: hasDocker ? 'Start Docker Desktop or docker service' : 'Install Docker',\n });\n\n // tmux\n const hasTmux = checkCommand('tmux');\n results.push({\n name: 'tmux',\n passed: hasTmux,\n message: hasTmux ? 'installed' : 'not found',\n fix: 'apt install tmux / brew install tmux',\n });\n\n // mkcert (optional but recommended)\n const hasMkcert = checkCommand('mkcert');\n results.push({\n name: 'mkcert',\n passed: hasMkcert,\n message: hasMkcert ? 'installed' : 'not found (optional)',\n fix: 'brew install mkcert / apt install mkcert',\n });\n\n // Beads CLI\n const hasBeads = checkCommand('bd');\n results.push({\n name: 'Beads CLI (bd)',\n passed: hasBeads,\n message: hasBeads ? 'installed' : 'not found',\n fix: 'cargo install beads-cli',\n });\n\n return {\n results,\n allPassed: results.filter((r) => r.name !== 'mkcert').every((r) => r.passed),\n };\n}\n\nfunction printPrereqStatus(prereqs: { results: PrereqResult[]; allPassed: boolean }): void {\n console.log(chalk.bold('Prerequisites:\\n'));\n\n for (const result of prereqs.results) {\n const icon = result.passed ? chalk.green('✓') : chalk.red('✗');\n const msg = result.passed ? chalk.dim(result.message) : chalk.yellow(result.message);\n console.log(` ${icon} ${result.name}: ${msg}`);\n if (!result.passed && result.fix) {\n console.log(` ${chalk.dim('→ ' + result.fix)}`);\n }\n }\n console.log('');\n}\n\nasync function installCommand(options: InstallOptions): Promise<void> {\n console.log(chalk.bold('\\nPanopticon Installation\\n'));\n\n const plat = detectPlatform();\n console.log(`Platform: ${chalk.cyan(plat)}\\n`);\n\n // Step 1: Check prerequisites\n const prereqs = checkPrerequisites();\n\n if (options.check) {\n printPrereqStatus(prereqs);\n process.exit(prereqs.allPassed ? 0 : 1);\n }\n\n printPrereqStatus(prereqs);\n\n if (!prereqs.allPassed) {\n console.log(chalk.red('Fix prerequisites above before continuing.'));\n console.log(chalk.dim('Tip: Run with --minimal to skip optional components'));\n process.exit(1);\n }\n\n // Step 2: Initialize directories\n const spinner = ora('Initializing Panopticon directories...').start();\n for (const dir of INIT_DIRS) {\n mkdirSync(dir, { recursive: true });\n }\n spinner.succeed('Directories initialized');\n\n // Step 3: Docker network\n if (!options.skipDocker) {\n spinner.start('Creating Docker network...');\n try {\n execSync('docker network create panopticon 2>/dev/null || true', { stdio: 'pipe' });\n spinner.succeed('Docker network ready');\n } catch (error) {\n spinner.warn('Docker network setup failed (may already exist)');\n }\n }\n\n // Step 4: mkcert setup\n if (!options.skipMkcert && !options.minimal) {\n const hasMkcert = checkCommand('mkcert');\n if (hasMkcert) {\n spinner.start('Setting up mkcert CA...');\n try {\n execSync('mkcert -install', { stdio: 'pipe' });\n\n // Generate certs for localhost\n const certsDir = join(PANOPTICON_HOME, 'certs');\n mkdirSync(certsDir, { recursive: true });\n\n execSync(\n `mkcert -cert-file \"${join(certsDir, 'localhost.pem')}\" -key-file \"${join(certsDir, 'localhost-key.pem')}\" localhost \"*.localhost\" 127.0.0.1 ::1`,\n { stdio: 'pipe' }\n );\n spinner.succeed('mkcert certificates generated');\n } catch (error) {\n spinner.warn('mkcert setup failed (HTTPS may not work)');\n }\n } else {\n spinner.info('Skipping mkcert (not installed)');\n }\n }\n\n // Step 5: Create config file if doesn't exist\n const configFile = join(PANOPTICON_HOME, 'config.toml');\n if (!existsSync(configFile)) {\n spinner.start('Creating default config...');\n writeFileSync(\n configFile,\n `# Panopticon configuration\n[panopticon]\nversion = \"1.0.0\"\ndefault_runtime = \"claude\"\n\n[dashboard]\nport = 3001\napi_port = 3002\n\n[sync]\nauto_sync = true\nstrategy = \"symlink\"\n\n[health]\nping_timeout = \"30s\"\nconsecutive_failures = 3\n`\n );\n spinner.succeed('Config created');\n }\n\n // Done!\n console.log('');\n console.log(chalk.green.bold('Installation complete!'));\n console.log('');\n console.log(chalk.bold('Next steps:'));\n console.log(` 1. Run ${chalk.cyan('pan sync')} to sync skills to ~/.claude/`);\n console.log(` 2. Run ${chalk.cyan('pan up')} to start the dashboard`);\n console.log(` 3. Create a workspace with ${chalk.cyan('pan workspace create <issue-id>')}`);\n console.log('');\n}\n","import chalk from 'chalk';\nimport { existsSync, readFileSync, writeFileSync, mkdirSync } from 'fs';\nimport { join, resolve } from 'path';\nimport { PANOPTICON_HOME } from '../../lib/paths.js';\n\nconst PROJECTS_FILE = join(PANOPTICON_HOME, 'projects.json');\n\nexport interface Project {\n name: string;\n path: string;\n type: 'standalone' | 'monorepo';\n linearTeam?: string;\n addedAt: string;\n}\n\nfunction loadProjects(): Project[] {\n if (!existsSync(PROJECTS_FILE)) {\n return [];\n }\n try {\n return JSON.parse(readFileSync(PROJECTS_FILE, 'utf-8'));\n } catch {\n return [];\n }\n}\n\nfunction saveProjects(projects: Project[]): void {\n mkdirSync(PANOPTICON_HOME, { recursive: true });\n writeFileSync(PROJECTS_FILE, JSON.stringify(projects, null, 2));\n}\n\ninterface AddOptions {\n name?: string;\n type?: 'standalone' | 'monorepo';\n linearTeam?: string;\n}\n\nexport async function projectAddCommand(\n projectPath: string,\n options: AddOptions = {}\n): Promise<void> {\n const fullPath = resolve(projectPath);\n\n if (!existsSync(fullPath)) {\n console.log(chalk.red(`Path does not exist: ${fullPath}`));\n return;\n }\n\n const projects = loadProjects();\n\n // Check if already registered\n const existing = projects.find((p) => p.path === fullPath);\n if (existing) {\n console.log(chalk.yellow(`Project already registered: ${existing.name}`));\n return;\n }\n\n // Determine name from directory if not provided\n const name = options.name || fullPath.split('/').pop() || 'unknown';\n\n // Try to detect Linear team from .panopticon/project.toml or package.json\n let linearTeam = options.linearTeam;\n if (!linearTeam) {\n const projectToml = join(fullPath, '.panopticon', 'project.toml');\n if (existsSync(projectToml)) {\n const content = readFileSync(projectToml, 'utf-8');\n const match = content.match(/team\\s*=\\s*\"([^\"]+)\"/);\n if (match) linearTeam = match[1];\n }\n }\n\n const project: Project = {\n name,\n path: fullPath,\n type: options.type || 'standalone',\n linearTeam,\n addedAt: new Date().toISOString(),\n };\n\n projects.push(project);\n saveProjects(projects);\n\n console.log(chalk.green(`\\u2713 Added project: ${name}`));\n console.log(chalk.dim(` Path: ${fullPath}`));\n if (linearTeam) {\n console.log(chalk.dim(` Linear team: ${linearTeam}`));\n }\n}\n\ninterface ListOptions {\n json?: boolean;\n}\n\nexport async function projectListCommand(options: ListOptions = {}): Promise<void> {\n const projects = loadProjects();\n\n if (projects.length === 0) {\n console.log(chalk.dim('No projects registered.'));\n console.log(chalk.dim('Add one with: pan project add <path>'));\n return;\n }\n\n if (options.json) {\n console.log(JSON.stringify(projects, null, 2));\n return;\n }\n\n console.log(chalk.bold('\\nRegistered Projects:\\n'));\n\n for (const project of projects) {\n const exists = existsSync(project.path);\n const statusIcon = exists ? chalk.green('\\u2713') : chalk.red('\\u2717');\n\n console.log(`${statusIcon} ${chalk.bold(project.name)}`);\n console.log(` ${chalk.dim(project.path)}`);\n if (project.linearTeam) {\n console.log(` ${chalk.cyan(`Linear: ${project.linearTeam}`)}`);\n }\n console.log(` ${chalk.dim(`Type: ${project.type}`)}`);\n console.log('');\n }\n}\n\nexport async function projectRemoveCommand(nameOrPath: string): Promise<void> {\n const projects = loadProjects();\n\n const index = projects.findIndex(\n (p) => p.name === nameOrPath || p.path === resolve(nameOrPath)\n );\n\n if (index === -1) {\n console.log(chalk.red(`Project not found: ${nameOrPath}`));\n return;\n }\n\n const removed = projects.splice(index, 1)[0];\n saveProjects(projects);\n\n console.log(chalk.green(`\\u2713 Removed project: ${removed.name}`));\n}\n","import chalk from 'chalk';\nimport { existsSync, readdirSync } from 'fs';\nimport { execSync } from 'child_process';\nimport { homedir } from 'os';\nimport { join } from 'path';\nimport {\n PANOPTICON_HOME,\n SKILLS_DIR,\n COMMANDS_DIR,\n AGENTS_DIR,\n CLAUDE_DIR,\n} from '../../lib/paths.js';\n\ninterface CheckResult {\n name: string;\n status: 'ok' | 'warn' | 'error';\n message: string;\n fix?: string;\n}\n\nfunction checkCommand(cmd: string): boolean {\n try {\n execSync(`which ${cmd}`, { encoding: 'utf-8', stdio: 'pipe' });\n return true;\n } catch {\n return false;\n }\n}\n\nfunction checkDirectory(path: string): boolean {\n return existsSync(path);\n}\n\nfunction countItems(path: string): number {\n if (!existsSync(path)) return 0;\n try {\n return readdirSync(path).length;\n } catch {\n return 0;\n }\n}\n\nexport async function doctorCommand(): Promise<void> {\n console.log(chalk.bold('\\nPanopticon Doctor\\n'));\n console.log(chalk.dim('Checking system health...\\n'));\n\n const checks: CheckResult[] = [];\n\n // Check required commands\n const requiredCommands = [\n { cmd: 'git', name: 'Git', fix: 'Install git' },\n { cmd: 'tmux', name: 'tmux', fix: 'Install tmux: apt install tmux / brew install tmux' },\n { cmd: 'node', name: 'Node.js', fix: 'Install Node.js 18+' },\n { cmd: 'claude', name: 'Claude CLI', fix: 'Install: npm install -g @anthropic-ai/claude-code' },\n ];\n\n for (const { cmd, name, fix } of requiredCommands) {\n if (checkCommand(cmd)) {\n checks.push({ name, status: 'ok', message: 'Installed' });\n } else {\n checks.push({ name, status: 'error', message: 'Not found', fix });\n }\n }\n\n // Check optional commands\n const optionalCommands = [\n { cmd: 'gh', name: 'GitHub CLI', fix: 'Install: gh auth login' },\n { cmd: 'bd', name: 'Beads CLI', fix: 'Install beads for task tracking' },\n { cmd: 'docker', name: 'Docker', fix: 'Install Docker for workspace containers' },\n ];\n\n for (const { cmd, name, fix } of optionalCommands) {\n if (checkCommand(cmd)) {\n checks.push({ name, status: 'ok', message: 'Installed' });\n } else {\n checks.push({ name, status: 'warn', message: 'Not installed (optional)', fix });\n }\n }\n\n // Check Panopticon directories\n const directories = [\n { path: PANOPTICON_HOME, name: 'Panopticon Home', fix: 'Run: pan init' },\n { path: SKILLS_DIR, name: 'Skills Directory', fix: 'Run: pan init' },\n { path: COMMANDS_DIR, name: 'Commands Directory', fix: 'Run: pan init' },\n { path: AGENTS_DIR, name: 'Agents Directory', fix: 'Run: pan init' },\n ];\n\n for (const { path, name, fix } of directories) {\n if (checkDirectory(path)) {\n const count = countItems(path);\n checks.push({ name, status: 'ok', message: `Exists (${count} items)` });\n } else {\n checks.push({ name, status: 'error', message: 'Missing', fix });\n }\n }\n\n // Check Claude Code integration\n if (checkDirectory(CLAUDE_DIR)) {\n const skillsCount = countItems(join(CLAUDE_DIR, 'skills'));\n const commandsCount = countItems(join(CLAUDE_DIR, 'commands'));\n checks.push({\n name: 'Claude Code Skills',\n status: skillsCount > 0 ? 'ok' : 'warn',\n message: `${skillsCount} skills`,\n fix: skillsCount === 0 ? 'Run: pan sync' : undefined,\n });\n checks.push({\n name: 'Claude Code Commands',\n status: commandsCount > 0 ? 'ok' : 'warn',\n message: `${commandsCount} commands`,\n fix: commandsCount === 0 ? 'Run: pan sync' : undefined,\n });\n } else {\n checks.push({\n name: 'Claude Code Directory',\n status: 'warn',\n message: 'Not found',\n fix: 'Install Claude Code first',\n });\n }\n\n // Check environment variables\n const envFile = join(homedir(), '.panopticon.env');\n if (existsSync(envFile)) {\n checks.push({ name: 'Config File', status: 'ok', message: '~/.panopticon.env exists' });\n } else {\n checks.push({\n name: 'Config File',\n status: 'warn',\n message: '~/.panopticon.env not found',\n fix: 'Create ~/.panopticon.env with LINEAR_API_KEY=...',\n });\n }\n\n // Check for LINEAR_API_KEY\n if (process.env.LINEAR_API_KEY) {\n checks.push({ name: 'LINEAR_API_KEY', status: 'ok', message: 'Set in environment' });\n } else if (existsSync(envFile)) {\n const content = require('fs').readFileSync(envFile, 'utf-8');\n if (content.includes('LINEAR_API_KEY')) {\n checks.push({ name: 'LINEAR_API_KEY', status: 'ok', message: 'Set in config file' });\n } else {\n checks.push({\n name: 'LINEAR_API_KEY',\n status: 'warn',\n message: 'Not configured',\n fix: 'Add LINEAR_API_KEY to ~/.panopticon.env',\n });\n }\n } else {\n checks.push({\n name: 'LINEAR_API_KEY',\n status: 'warn',\n message: 'Not configured',\n fix: 'Set LINEAR_API_KEY environment variable or add to ~/.panopticon.env',\n });\n }\n\n // Check tmux sessions\n try {\n const sessions = execSync('tmux list-sessions 2>/dev/null || true', { encoding: 'utf-8' });\n const agentSessions = sessions.split('\\n').filter((s) => s.includes('agent-')).length;\n checks.push({\n name: 'Running Agents',\n status: 'ok',\n message: `${agentSessions} agent sessions`,\n });\n } catch {\n checks.push({\n name: 'Running Agents',\n status: 'ok',\n message: '0 agent sessions',\n });\n }\n\n // Print results\n const icons = {\n ok: chalk.green('\\u2713'),\n warn: chalk.yellow('\\u26a0'),\n error: chalk.red('\\u2717'),\n };\n\n let hasErrors = false;\n let hasWarnings = false;\n\n for (const check of checks) {\n const icon = icons[check.status];\n const message = check.status === 'error' ? chalk.red(check.message) :\n check.status === 'warn' ? chalk.yellow(check.message) :\n chalk.dim(check.message);\n\n console.log(`${icon} ${check.name}: ${message}`);\n\n if (check.fix && check.status !== 'ok') {\n console.log(chalk.dim(` Fix: ${check.fix}`));\n }\n\n if (check.status === 'error') hasErrors = true;\n if (check.status === 'warn') hasWarnings = true;\n }\n\n console.log('');\n\n if (hasErrors) {\n console.log(chalk.red('Some required components are missing.'));\n console.log(chalk.dim('Fix the errors above before using Panopticon.'));\n } else if (hasWarnings) {\n console.log(chalk.yellow('System is functional with some optional features missing.'));\n } else {\n console.log(chalk.green('All systems operational!'));\n }\n console.log('');\n}\n"],"mappings":"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","names":["chalk","chalk","ora","chalk","spinner","ora","chalk","ora","chalk","ora","existsSync","chalk","existsSync","chalk","chalk","ora","existsSync","mkdirSync","writeFileSync","readFileSync","readdirSync","join","existsSync","mkdirSync","readFileSync","readdirSync","join","join","mkdirSync","existsSync","readFileSync","readdirSync","existsSync","mkdirSync","readFileSync","writeFileSync","readdirSync","join","join","existsSync","readFileSync","mkdirSync","writeFileSync","existsSync","readdirSync","join","existsSync","readFileSync","mkdirSync","writeFileSync","readdirSync","ora","chalk","chalk","chalk","chalk","chalk","chalk","chalk","chalk","existsSync","readFileSync","join","chalk","join","existsSync","readFileSync","chalk","ora","existsSync","writeFileSync","readFileSync","join","execSync","join","existsSync","readFileSync","execSync","chalk","ora","writeFileSync","chalk","ora","readFileSync","writeFileSync","existsSync","join","homedir","execSync","getLinearApiKey","project","chalk","ora","readFileSync","existsSync","join","homedir","getLinearApiKey","chalk","ora","readFileSync","writeFileSync","existsSync","join","homedir","chalk","chalk","chalk","ora","ora","chalk","agentId","chalk","chalk","chalk","existsSync","mkdirSync","readFileSync","writeFileSync","readdirSync","join","join","existsSync","readFileSync","mkdirSync","writeFileSync","join","mkdirSync","existsSync","writeFileSync","readdirSync","readFileSync","join","existsSync","readdirSync","join","readFileSync","readFileSync","existsSync","chalk","chalk","existsSync","mkdirSync","readFileSync","writeFileSync","join","execSync","join","existsSync","readFileSync","mkdirSync","writeFileSync","execSync","execSync","existsSync","readdirSync","resolve","chalk","program","chalk","ora","existsSync","mkdirSync","writeFileSync","join","basename","execSync","mkdirSync","readFileSync","existsSync","readdirSync","join","existsSync","readFileSync","join","readdirSync","existsSync","readdirSync","mkdirSync","appendFileSync","join","execSync","execSync","join","mkdirSync","existsSync","readdirSync","appendFileSync","program","listCommand","ora","join","chalk","existsSync","writeFileSync","mkdirSync","basename","chalk","ora","execSync","existsSync","mkdirSync","writeFileSync","readFileSync","join","program","readFileSync","execSync","chalk","ora","mkdirSync","join","existsSync","writeFileSync","chalk","existsSync","readFileSync","writeFileSync","mkdirSync","join","join","existsSync","readFileSync","mkdirSync","writeFileSync","chalk","project","chalk","existsSync","readdirSync","execSync","homedir","join","checkCommand","execSync","existsSync","readdirSync","chalk","join","homedir","execSync","join","dirname","__dirname","chalk"]}
|