pure-point-guard 0.3.0 → 0.3.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.js +370 -188
- package/dist/cli.js.map +1 -1
- package/package.json +1 -1
- package/skills/ppg-conductor/SKILL.md +5 -0
- package/skills/ppg-conductor/references/commands.md +32 -0
- package/skills/ppg-conductor/references/conductor.md +52 -5
- package/skills/ppg-conductor/references/modes.md +9 -0
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/lib/errors.ts","../src/lib/output.ts","../src/lib/paths.ts","../src/core/config.ts","../src/lib/cjs-compat.ts","../src/core/manifest.ts","../src/bundled/prompts.ts","../src/bundled/swarms.ts","../src/lib/env.ts","../src/core/tmux.ts","../src/commands/init.ts","../src/core/worktree.ts","../src/core/env.ts","../src/core/template.ts","../src/core/agent.ts","../src/lib/shell.ts","../src/core/terminal.ts","../src/lib/id.ts","../src/lib/name.ts","../src/lib/vars.ts","../src/commands/spawn.ts","../src/commands/status.ts","../src/core/pr.ts","../src/core/self.ts","../src/core/cleanup.ts","../src/commands/kill.ts","../src/commands/attach.ts","../src/commands/logs.ts","../src/commands/aggregate.ts","../src/commands/merge.ts","../src/core/swarm.ts","../src/commands/swarm.ts","../src/commands/prompt.ts","../src/commands/list.ts","../src/commands/restart.ts","../src/commands/diff.ts","../src/commands/pr.ts","../src/commands/reset.ts","../src/commands/clean.ts","../src/commands/send.ts","../src/commands/wait.ts","../src/commands/worktree.ts","../src/commands/ui.ts","../src/commands/install-dashboard.ts","../src/core/schedule.ts","../src/core/cron.ts","../src/commands/cron.ts","../src/cli.ts"],"sourcesContent":["export class PpgError extends Error {\n constructor(\n message: string,\n public readonly code: string,\n public readonly exitCode: number = 1,\n ) {\n super(message);\n this.name = 'PpgError';\n }\n}\n\nexport class TmuxNotFoundError extends PpgError {\n constructor() {\n super(\n 'tmux is not installed or not in PATH. Install it with: brew install tmux',\n 'TMUX_NOT_FOUND',\n );\n this.name = 'TmuxNotFoundError';\n }\n}\n\nexport class NotGitRepoError extends PpgError {\n constructor(dir: string) {\n super(\n `Not a git repository: ${dir}`,\n 'NOT_GIT_REPO',\n );\n this.name = 'NotGitRepoError';\n }\n}\n\nexport class NotInitializedError extends PpgError {\n constructor(dir: string) {\n super(\n `Point Guard not initialized in ${dir}. Run 'ppg init' first.`,\n 'NOT_INITIALIZED',\n );\n this.name = 'NotInitializedError';\n }\n}\n\nexport class ManifestLockError extends PpgError {\n constructor() {\n super(\n 'Could not acquire manifest lock. Another ppg process may be running.',\n 'MANIFEST_LOCK',\n );\n this.name = 'ManifestLockError';\n }\n}\n\nexport class WorktreeNotFoundError extends PpgError {\n constructor(id: string) {\n super(\n `Worktree not found: ${id}`,\n 'WORKTREE_NOT_FOUND',\n );\n this.name = 'WorktreeNotFoundError';\n }\n}\n\nexport class AgentNotFoundError extends PpgError {\n constructor(id: string) {\n super(\n `Agent not found: ${id}`,\n 'AGENT_NOT_FOUND',\n );\n this.name = 'AgentNotFoundError';\n }\n}\n\nexport class MergeFailedError extends PpgError {\n constructor(message: string) {\n super(message, 'MERGE_FAILED');\n this.name = 'MergeFailedError';\n }\n}\n\nexport class GhNotFoundError extends PpgError {\n constructor() {\n super(\n 'GitHub CLI (gh) is not installed or not in PATH. Install it with: brew install gh',\n 'GH_NOT_FOUND',\n );\n this.name = 'GhNotFoundError';\n }\n}\n\nexport class UnmergedWorkError extends PpgError {\n constructor(names: string[]) {\n const list = names.map((n) => ` ${n}`).join('\\n');\n super(\n `${names.length} worktree(s) have completed work that hasn't been merged or PR'd:\\n${list}\\n\\nUse --force to reset anyway, or create PRs first with: ppg pr <worktree-id>`,\n 'UNMERGED_WORK',\n );\n this.name = 'UnmergedWorkError';\n }\n}\n","import type { AgentStatus, WorktreeStatus } from '../types/manifest.js';\n\nconst RESET = '\\x1b[0m';\nconst BOLD = '\\x1b[1m';\nconst DIM = '\\x1b[2m';\nconst RED = '\\x1b[31m';\nconst GREEN = '\\x1b[32m';\nconst YELLOW = '\\x1b[33m';\nconst BLUE = '\\x1b[34m';\nconst MAGENTA = '\\x1b[35m';\nconst CYAN = '\\x1b[36m';\nconst GRAY = '\\x1b[90m';\n\nconst STATUS_COLORS: Record<AgentStatus | WorktreeStatus, string> = {\n spawning: YELLOW,\n running: GREEN,\n waiting: CYAN,\n completed: BLUE,\n failed: RED,\n killed: MAGENTA,\n lost: RED + BOLD,\n active: GREEN,\n merging: YELLOW,\n merged: BLUE,\n cleaned: GRAY,\n};\n\nexport function formatStatus(status: AgentStatus | WorktreeStatus): string {\n const color = STATUS_COLORS[status] ?? RESET;\n return `${color}${status}${RESET}`;\n}\n\nexport function output(data: unknown, json: boolean): void {\n if (json) {\n console.log(JSON.stringify(data, null, 2));\n } else {\n console.log(data);\n }\n}\n\nexport function outputError(error: unknown, json: boolean): void {\n if (json) {\n const message = error instanceof Error ? error.message : String(error);\n const code = error instanceof Error && 'code' in error\n ? (error as { code: string }).code\n : 'UNKNOWN';\n console.error(JSON.stringify({ error: message, code }));\n } else {\n const message = error instanceof Error ? error.message : String(error);\n console.error(`${RED}Error:${RESET} ${message}`);\n }\n}\n\nexport interface Column {\n header: string;\n key: string;\n width?: number;\n format?: (value: unknown) => string;\n}\n\nexport function formatTable(rows: Record<string, unknown>[], columns: Column[]): string {\n if (rows.length === 0) return 'No results.';\n\n // Calculate column widths\n const widths = columns.map((col) => {\n const headerLen = col.header.length;\n const maxDataLen = rows.reduce((max, row) => {\n const val = col.format ? col.format(row[col.key]) : String(row[col.key] ?? '');\n // Strip ANSI for width calculation\n const stripped = val.replace(/\\x1b\\[[0-9;]*m/g, '');\n return Math.max(max, stripped.length);\n }, 0);\n return col.width ?? Math.max(headerLen, maxDataLen);\n });\n\n // Header\n const header = columns\n .map((col, i) => `${BOLD}${col.header.padEnd(widths[i])}${RESET}`)\n .join(' ');\n\n const separator = widths.map((w) => DIM + '─'.repeat(w) + RESET).join(' ');\n\n // Rows\n const body = rows.map((row) =>\n columns\n .map((col, i) => {\n const val = col.format ? col.format(row[col.key]) : String(row[col.key] ?? '');\n const stripped = val.replace(/\\x1b\\[[0-9;]*m/g, '');\n const padding = Math.max(0, widths[i] - stripped.length);\n return val + ' '.repeat(padding);\n })\n .join(' '),\n ).join('\\n');\n\n return `${header}\\n${separator}\\n${body}`;\n}\n\nexport function info(message: string): void {\n console.log(`${CYAN}▸${RESET} ${message}`);\n}\n\nexport function success(message: string): void {\n console.log(`${GREEN}✓${RESET} ${message}`);\n}\n\nexport function warn(message: string): void {\n console.log(`${YELLOW}⚠${RESET} ${message}`);\n}\n","import os from 'node:os';\nimport path from 'node:path';\n\nconst PPG_DIR = '.ppg';\n\nexport function globalPpgDir(): string {\n return path.join(os.homedir(), PPG_DIR);\n}\n\nexport function globalPromptsDir(): string {\n return path.join(globalPpgDir(), 'prompts');\n}\n\nexport function globalTemplatesDir(): string {\n return path.join(globalPpgDir(), 'templates');\n}\n\nexport function globalSwarmsDir(): string {\n return path.join(globalPpgDir(), 'swarms');\n}\n\nexport function ppgDir(projectRoot: string): string {\n return path.join(projectRoot, PPG_DIR);\n}\n\nexport function manifestPath(projectRoot: string): string {\n return path.join(ppgDir(projectRoot), 'manifest.json');\n}\n\nexport function configPath(projectRoot: string): string {\n return path.join(ppgDir(projectRoot), 'config.yaml');\n}\n\nexport function resultsDir(projectRoot: string): string {\n return path.join(ppgDir(projectRoot), 'results');\n}\n\nexport function resultFile(projectRoot: string, agentId: string): string {\n return path.join(resultsDir(projectRoot), `${agentId}.md`);\n}\n\nexport function templatesDir(projectRoot: string): string {\n return path.join(ppgDir(projectRoot), 'templates');\n}\n\nexport function logsDir(projectRoot: string): string {\n return path.join(ppgDir(projectRoot), 'logs');\n}\n\nexport function promptsDir(projectRoot: string): string {\n return path.join(ppgDir(projectRoot), 'prompts');\n}\n\nexport function swarmsDir(projectRoot: string): string {\n return path.join(ppgDir(projectRoot), 'swarms');\n}\n\nexport function promptFile(projectRoot: string, agentId: string): string {\n return path.join(promptsDir(projectRoot), `${agentId}.md`);\n}\n\nexport function agentPromptsDir(projectRoot: string): string {\n return path.join(ppgDir(projectRoot), 'agent-prompts');\n}\n\nexport function agentPromptFile(projectRoot: string, agentId: string): string {\n return path.join(agentPromptsDir(projectRoot), `${agentId}.md`);\n}\n\nexport function schedulesPath(projectRoot: string): string {\n return path.join(ppgDir(projectRoot), 'schedules.yaml');\n}\n\nexport function cronLogPath(projectRoot: string): string {\n return path.join(logsDir(projectRoot), 'cron.log');\n}\n\nexport function cronPidPath(projectRoot: string): string {\n return path.join(ppgDir(projectRoot), 'cron.pid');\n}\n\nexport function worktreeBaseDir(projectRoot: string): string {\n return path.join(projectRoot, '.worktrees');\n}\n\nexport function worktreePath(projectRoot: string, id: string): string {\n return path.join(worktreeBaseDir(projectRoot), id);\n}\n","import fs from 'node:fs/promises';\nimport YAML from 'yaml';\nimport type { Config, AgentConfig } from '../types/config.js';\nimport { configPath } from '../lib/paths.js';\n\nconst DEFAULT_CONFIG: Config = {\n sessionName: 'ppg',\n defaultAgent: 'claude',\n agents: {\n claude: {\n name: 'claude',\n command: 'claude --dangerously-skip-permissions',\n interactive: true,\n resultInstructions: [\n 'When you have completed the task:',\n '',\n '1. Stage and commit all your changes with a descriptive commit message',\n '2. Push your branch: git push -u origin {{BRANCH}}',\n '3. Create a pull request: gh pr create --head {{BRANCH}} --base main --fill',\n '4. Write your results to {{RESULT_FILE}} in this format:',\n '',\n '# Result: {{AGENT_ID}}',\n '',\n '## PR',\n '<the PR URL from step 3>',\n '',\n '## Summary',\n '<what you accomplished>',\n '',\n '## Changes',\n '<list of files changed>',\n '',\n '## Notes',\n '<any important observations>',\n ].join('\\n'),\n },\n },\n envFiles: ['.env', '.env.local'],\n symlinkNodeModules: true,\n};\n\nexport async function loadConfig(projectRoot: string): Promise<Config> {\n const cfgPath = configPath(projectRoot);\n try {\n const raw = await fs.readFile(cfgPath, 'utf-8');\n const parsed = YAML.parse(raw) as Partial<Config>;\n return mergeConfig(DEFAULT_CONFIG, parsed);\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === 'ENOENT') {\n return DEFAULT_CONFIG;\n }\n throw err;\n }\n}\n\nfunction mergeConfig(defaults: Config, overrides: Partial<Config>): Config {\n const mergedAgents: Record<string, AgentConfig> = { ...defaults.agents };\n if (overrides.agents) {\n for (const [key, override] of Object.entries(overrides.agents)) {\n if (mergedAgents[key]) {\n mergedAgents[key] = { ...mergedAgents[key], ...override };\n } else {\n mergedAgents[key] = override;\n }\n }\n }\n return {\n ...defaults,\n ...overrides,\n agents: mergedAgents,\n };\n}\n\nexport async function writeDefaultConfig(projectRoot: string): Promise<void> {\n const cfgPath = configPath(projectRoot);\n const content = YAML.stringify(DEFAULT_CONFIG, { indent: 2 });\n await fs.writeFile(cfgPath, content, 'utf-8');\n}\n\nexport function resolveAgentConfig(config: Config, name?: string): AgentConfig {\n const agentName = name ?? config.defaultAgent;\n const agent = config.agents[agentName];\n if (!agent) {\n throw new Error(`Unknown agent type: ${agentName}. Available: ${Object.keys(config.agents).join(', ')}`);\n }\n return agent;\n}\n","/**\n * Dynamic import wrappers for CJS packages that may not have proper ESM exports.\n * Uses `mod.default ?? mod` pattern to handle both CJS and ESM default exports.\n */\n\nlet _lockfile: typeof import('proper-lockfile') | undefined;\nlet _writeFileAtomic: typeof import('write-file-atomic').default | undefined;\n\nexport async function getLockfile() {\n if (!_lockfile) {\n const mod = await import('proper-lockfile');\n _lockfile = (mod.default ?? mod) as typeof import('proper-lockfile');\n }\n return _lockfile;\n}\n\nexport async function getWriteFileAtomic() {\n if (!_writeFileAtomic) {\n const mod = await import('write-file-atomic');\n _writeFileAtomic = (mod.default ?? mod) as typeof import('write-file-atomic').default;\n }\n return _writeFileAtomic;\n}\n","import fs from 'node:fs/promises';\nimport { manifestPath } from '../lib/paths.js';\nimport { getLockfile, getWriteFileAtomic } from '../lib/cjs-compat.js';\nimport { ManifestLockError, NotInitializedError } from '../lib/errors.js';\nimport type { Manifest, WorktreeEntry, AgentEntry } from '../types/manifest.js';\n\nexport function createEmptyManifest(projectRoot: string, sessionName: string): Manifest {\n const now = new Date().toISOString();\n return {\n version: 1,\n projectRoot,\n sessionName,\n worktrees: {},\n createdAt: now,\n updatedAt: now,\n };\n}\n\nexport async function readManifest(projectRoot: string): Promise<Manifest> {\n const mPath = manifestPath(projectRoot);\n const raw = await fs.readFile(mPath, 'utf-8');\n return JSON.parse(raw) as Manifest;\n}\n\nexport async function requireManifest(projectRoot: string): Promise<Manifest> {\n try {\n return await readManifest(projectRoot);\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === 'ENOENT') {\n throw new NotInitializedError(projectRoot);\n }\n throw err;\n }\n}\n\nexport async function writeManifest(projectRoot: string, manifest: Manifest): Promise<void> {\n const writeFileAtomic = await getWriteFileAtomic();\n const mPath = manifestPath(projectRoot);\n manifest.updatedAt = new Date().toISOString();\n await writeFileAtomic(mPath, JSON.stringify(manifest, null, 2) + '\\n');\n}\n\nexport async function updateManifest(\n projectRoot: string,\n updater: (manifest: Manifest) => Manifest | Promise<Manifest>,\n): Promise<Manifest> {\n const lockfile = await getLockfile();\n const mPath = manifestPath(projectRoot);\n let release: (() => Promise<void>) | undefined;\n\n try {\n release = await lockfile.lock(mPath, {\n stale: 10_000,\n retries: {\n retries: 5,\n minTimeout: 100,\n maxTimeout: 1000,\n },\n });\n } catch {\n throw new ManifestLockError();\n }\n\n try {\n const manifest = await readManifest(projectRoot);\n const updated = await updater(manifest);\n await writeManifest(projectRoot, updated);\n return updated;\n } finally {\n if (release) {\n await release();\n }\n }\n}\n\nfunction getWorktree(manifest: Manifest, id: string): WorktreeEntry | undefined {\n return manifest.worktrees[id];\n}\n\nfunction findWorktreeByName(manifest: Manifest, name: string): WorktreeEntry | undefined {\n return Object.values(manifest.worktrees).find(\n (wt) => wt.name === name || wt.branch === name,\n );\n}\n\nexport function resolveWorktree(manifest: Manifest, ref: string): WorktreeEntry | undefined {\n return getWorktree(manifest, ref) ?? findWorktreeByName(manifest, ref);\n}\n\nexport function findAgent(\n manifest: Manifest,\n agentId: string,\n): { worktree: WorktreeEntry; agent: AgentEntry } | undefined {\n for (const wt of Object.values(manifest.worktrees)) {\n const agent = wt.agents[agentId];\n if (agent) {\n return { worktree: wt, agent };\n }\n }\n return undefined;\n}\n","export const bundledPrompts: Record<string, string> = {\n 'review-quality': `# Code Quality Review\n\n## What to Review\n{{CONTEXT}}\n\n## Your Focus\nYou are a senior engineer reviewing code for quality, readability, and maintainability.\n\n- Code clarity and naming conventions\n- Function and module organization\n- Error handling completeness\n- DRY violations and unnecessary complexity\n- API design and consistency\n- Documentation gaps for non-obvious logic\n\n## Output\nWrite a structured review to {{RESULT_FILE}} with specific file:line references and improvement suggestions.\n`,\n 'review-security': `# Security Review\n\n## What to Review\n{{CONTEXT}}\n\n## Your Focus\nYou are a security engineer reviewing code for vulnerabilities and risks.\n\n- Input validation and sanitization\n- Injection vulnerabilities (SQL, XSS, command)\n- Authentication and authorization issues\n- Sensitive data exposure\n- Dependency vulnerabilities\n- Secrets or credentials in code\n\n## Output\nWrite a structured review to {{RESULT_FILE}} with severity ratings and remediation guidance.\n`,\n 'review-regression': `# Regression & Risk Review\n\n## What to Review\n{{CONTEXT}}\n\n## Your Focus\nYou are a QA engineer reviewing code for regression risks and test coverage gaps.\n\n- Behavioral changes that could break existing functionality\n- Edge cases and boundary conditions not covered\n- Missing or inadequate test coverage\n- Integration points that may be affected\n- Data migration or compatibility concerns\n- Performance regressions\n\n## Output\nWrite a structured review to {{RESULT_FILE}} with risk ratings and recommended test additions.\n`,\n};\n","export const bundledSwarms: Record<string, string> = {\n 'code-review': `name: code-review\ndescription: Multi-perspective code review\nstrategy: shared\n\nagents:\n - prompt: review-quality\n - prompt: review-security\n - prompt: review-regression\n`,\n};\n","/**\n * Augmented environment for execa calls.\n *\n * On Apple Silicon Macs, Homebrew installs to /opt/homebrew/bin/ which may not\n * be in PATH when launched from non-login shells (IDEs, GUI apps, VSCode).\n * This ensures tmux, git, and other Homebrew-installed binaries are found.\n */\n\nconst extraDirs = [\n '/opt/homebrew/bin',\n '/opt/homebrew/sbin',\n '/opt/local/bin', // MacPorts\n];\n\nconst home = process.env.HOME ?? '';\nif (home) {\n extraDirs.push(`${home}/.nix-profile/bin`);\n}\n\nconst augmentedPath = [...extraDirs, process.env.PATH].filter(Boolean).join(':');\n\nexport const execaEnv = {\n env: { PATH: augmentedPath },\n};\n","import { execa, ExecaError } from 'execa';\nimport { TmuxNotFoundError } from '../lib/errors.js';\nimport { execaEnv } from '../lib/env.js';\n\nexport async function checkTmux(): Promise<void> {\n try {\n await execa('tmux', ['-V'], execaEnv);\n } catch {\n throw new TmuxNotFoundError();\n }\n}\n\nexport async function sessionExists(name: string): Promise<boolean> {\n try {\n // Use '=' prefix for exact session name matching to avoid tmux prefix ambiguity\n await execa('tmux', ['has-session', '-t', `=${name}`], execaEnv);\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function ensureSession(name: string): Promise<void> {\n if (!(await sessionExists(name))) {\n await execa('tmux', ['new-session', '-d', '-s', name, '-x', '220', '-y', '50'], execaEnv);\n await execa('tmux', ['set-option', '-t', name, 'mouse', 'on'], execaEnv);\n await execa('tmux', ['set-option', '-t', name, 'history-limit', '50000'], execaEnv);\n }\n}\n\nexport async function createWindow(\n session: string,\n name: string,\n cwd: string,\n): Promise<string> {\n // Use '=' prefix for exact session name matching to avoid tmux prefix ambiguity\n // (e.g., 'ppg' would otherwise match both 'ppg' and 'ppg-dashboard')\n const result = await execa('tmux', [\n 'new-window',\n '-t', `=${session}`,\n '-n', name,\n '-c', cwd,\n '-P', '-F', '#{window_index}',\n ], execaEnv);\n const windowIndex = result.stdout.trim();\n return `${session}:${windowIndex}`;\n}\n\nexport async function splitPane(\n target: string,\n direction: 'horizontal' | 'vertical',\n cwd: string,\n): Promise<{ paneId: string; target: string }> {\n const flag = direction === 'horizontal' ? '-h' : '-v';\n const result = await execa('tmux', [\n 'split-window',\n flag,\n '-t', target,\n '-c', cwd,\n '-P', '-F', '#{session_name}:#{window_index}.#{pane_index}|#{pane_id}',\n ], execaEnv);\n const [canonicalTarget, paneId] = result.stdout.trim().split('|');\n return { paneId, target: canonicalTarget };\n}\n\nexport async function sendKeys(target: string, command: string): Promise<void> {\n // Send text as literal characters, then Enter as a named key.\n // Using -l sends \\n as LF (0x0a) which Ink-based CLIs like Claude Code\n // treat as text insertion. Sending 'Enter' without -l sends CR (0x0d),\n // which correctly triggers onSubmit in terminal apps.\n await execa('tmux', ['send-keys', '-t', target, '-l', command], execaEnv);\n await execa('tmux', ['send-keys', '-t', target, 'Enter'], execaEnv);\n}\n\nexport async function sendLiteral(target: string, text: string): Promise<void> {\n await execa('tmux', ['send-keys', '-t', target, '-l', text], execaEnv);\n}\n\nexport async function sendRawKeys(target: string, keys: string): Promise<void> {\n await execa('tmux', ['send-keys', '-t', target, keys], execaEnv);\n}\n\nexport async function capturePane(target: string, lines?: number): Promise<string> {\n const args = ['capture-pane', '-t', target, '-p'];\n if (lines) {\n args.push('-S', `-${lines}`);\n }\n const result = await execa('tmux', args, execaEnv);\n return result.stdout;\n}\n\nexport async function killPane(target: string): Promise<void> {\n try {\n await execa('tmux', ['kill-pane', '-t', target], execaEnv);\n } catch (err) {\n if (isTmuxNotFoundError(err)) return;\n throw err;\n }\n}\n\nexport async function killWindow(target: string): Promise<void> {\n try {\n await execa('tmux', ['kill-window', '-t', target], execaEnv);\n } catch (err) {\n if (isTmuxNotFoundError(err)) return;\n throw err;\n }\n}\n\n/**\n * Check if a tmux error is a benign \"not found\" error (target already dead/gone).\n * Returns true for errors that should be silently ignored.\n */\nfunction isTmuxNotFoundError(err: unknown): boolean {\n if (!(err instanceof ExecaError)) return false;\n const msg = (String(err.stderr ?? '')).toLowerCase();\n return msg.includes(\"can't find\") ||\n msg.includes('not found') ||\n msg.includes('no such') ||\n msg.includes('session not found') ||\n msg.includes('window not found') ||\n msg.includes('pane not found');\n}\n\nexport interface PaneInfo {\n paneId: string;\n panePid: string;\n currentCommand: string;\n isDead: boolean;\n deadStatus?: number;\n}\n\nasync function listPanes(target: string): Promise<PaneInfo[]> {\n try {\n const result = await execa('tmux', [\n 'list-panes',\n '-t', target,\n '-F', '#{pane_id}|#{pane_pid}|#{pane_current_command}|#{pane_dead}|#{pane_dead_status}',\n ], execaEnv);\n return result.stdout.trim().split('\\n').filter(Boolean).map((line) => {\n const [paneId, panePid, currentCommand, dead, deadStatus] = line.split('|');\n return {\n paneId,\n panePid,\n currentCommand,\n isDead: dead === '1',\n deadStatus: deadStatus ? parseInt(deadStatus, 10) : undefined,\n };\n });\n } catch {\n return [];\n }\n}\n\nexport async function getPaneInfo(target: string): Promise<PaneInfo | null> {\n try {\n const result = await execa('tmux', [\n 'display-message',\n '-t', target,\n '-p',\n '#{pane_id}|#{pane_pid}|#{pane_current_command}|#{pane_dead}|#{pane_dead_status}',\n ], execaEnv);\n const [paneId, panePid, currentCommand, dead, deadStatus] = result.stdout.trim().split('|');\n return {\n paneId,\n panePid,\n currentCommand,\n isDead: dead === '1',\n deadStatus: deadStatus ? parseInt(deadStatus, 10) : undefined,\n };\n } catch {\n return null;\n }\n}\n\n/**\n * List all panes in a session with a single tmux call.\n * Returns a map keyed by pane target (session:window.pane format).\n */\nexport async function listSessionPanes(session: string): Promise<Map<string, PaneInfo>> {\n const map = new Map<string, PaneInfo>();\n try {\n const result = await execa('tmux', [\n 'list-panes',\n '-s',\n '-t', `=${session}`,\n '-F', '#{session_name}:#{window_index}.#{pane_index}|#{pane_id}|#{pane_pid}|#{pane_current_command}|#{pane_dead}|#{pane_dead_status}',\n ], execaEnv);\n for (const line of result.stdout.trim().split('\\n').filter(Boolean)) {\n const [target, paneId, panePid, currentCommand, dead, deadStatus] = line.split('|');\n const info: PaneInfo = {\n paneId,\n panePid,\n currentCommand,\n isDead: dead === '1',\n deadStatus: deadStatus ? parseInt(deadStatus, 10) : undefined,\n };\n // Index by multiple target formats for flexible lookup\n map.set(target, info); // session:window.pane\n map.set(paneId, info); // %paneId\n const dotIdx = target.lastIndexOf('.');\n if (dotIdx !== -1) {\n map.set(target.slice(0, dotIdx), info); // session:window\n }\n }\n } catch {\n // Session may not exist\n }\n return map;\n}\n\nexport interface WindowInfo {\n index: number;\n name: string;\n}\n\n/**\n * List all windows in a tmux session.\n * Returns window index and name for each window.\n */\nexport async function listSessionWindows(session: string): Promise<WindowInfo[]> {\n try {\n const result = await execa('tmux', [\n 'list-windows',\n '-t', `=${session}`,\n '-F', '#{window_index} #{window_name}',\n ], execaEnv);\n return result.stdout.trim().split('\\n').filter(Boolean).map((line) => {\n const spaceIdx = line.indexOf(' ');\n return {\n index: parseInt(line.slice(0, spaceIdx), 10),\n name: line.slice(spaceIdx + 1),\n };\n });\n } catch {\n return [];\n }\n}\n\n/**\n * Kill all non-base windows in a session (orphan cleanup).\n * Window 0 is preserved as the base shell window.\n * If selfPaneId is provided, windows containing that pane are skipped.\n * Returns the number of windows killed.\n */\nexport async function killOrphanWindows(\n session: string,\n selfPaneId?: string | null,\n): Promise<number> {\n const windows = await listSessionWindows(session);\n let killed = 0;\n\n // Build pane map for self-protection if needed\n let paneMap: Map<string, PaneInfo> | undefined;\n if (selfPaneId) {\n paneMap = await listSessionPanes(session);\n }\n\n for (const win of windows) {\n if (win.index === 0) continue;\n\n // Self-protection: skip windows containing the current process\n if (selfPaneId && paneMap) {\n const windowTarget = `${session}:${win.index}`;\n let containsSelf = false;\n for (const [key, info] of paneMap) {\n if (key.startsWith(windowTarget + '.') && info.paneId === selfPaneId) {\n containsSelf = true;\n break;\n }\n if (key === windowTarget && info.paneId === selfPaneId) {\n containsSelf = true;\n break;\n }\n }\n if (containsSelf) continue;\n }\n\n try {\n await killWindow(`${session}:${win.index}`);\n killed++;\n } catch {\n // Already gone — fine\n }\n }\n return killed;\n}\n\nexport async function selectWindow(target: string): Promise<void> {\n await execa('tmux', ['select-window', '-t', target], execaEnv);\n}\n\nexport async function isInsideTmux(): Promise<boolean> {\n return !!process.env.TMUX;\n}\n\nexport async function sendCtrlC(target: string): Promise<void> {\n await execa('tmux', ['send-keys', '-t', target, 'C-c'], execaEnv);\n}\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { execa } from 'execa';\nimport { ppgDir, resultsDir, logsDir, templatesDir, promptsDir, promptFile, swarmsDir, manifestPath, agentPromptsDir, configPath } from '../lib/paths.js';\nimport { NotGitRepoError } from '../lib/errors.js';\nimport { success, info } from '../lib/output.js';\nimport { writeDefaultConfig } from '../core/config.js';\nimport { createEmptyManifest, writeManifest } from '../core/manifest.js';\nimport { bundledPrompts } from '../bundled/prompts.js';\nimport { bundledSwarms } from '../bundled/swarms.js';\nimport { execaEnv } from '../lib/env.js';\nimport { checkTmux } from '../core/tmux.js';\n\nconst CONDUCTOR_CONTEXT = `# PPG Conductor Context\n\nYou are operating on the master branch of a ppg-managed project.\n\n## Critical Rule\n**NEVER make code changes directly on the master branch.** Use \\`ppg spawn\\` to create worktrees.\n\n## Quick Reference\n- \\`ppg spawn --name <name> --prompt \"<task>\" --json\\` — Spawn worktree + agent\n- \\`ppg status --json\\` — Check statuses\n- \\`ppg aggregate --all --json\\` — Collect results (includes PR URLs)\n- \\`ppg kill --agent <id> --json\\` — Kill agent\n- \\`ppg reset --json\\` — Clean up all worktrees (skips worktrees with open PRs)\n\n## Workflow\n1. Break request into parallelizable tasks\n2. Spawn: \\`ppg spawn --name <name> --prompt \"<prompt>\" --json\\`\n3. Poll: \\`ppg status --json\\` every 5s\n4. Aggregate: \\`ppg aggregate --all --json\\` — result files include PR URLs\n5. Present PR links and summaries — let user decide next steps\n6. To merge remotely: \\`gh pr merge <url> --squash --delete-branch\\`\n7. To merge locally (power-user): \\`ppg merge <wt-id> --json\\`\n8. Cleanup: \\`ppg reset --json\\` (skips worktrees with open PRs)\n\nEach agent prompt must be self-contained — agents have no memory of this conversation.\nAlways use \\`--json\\`.\n`;\n\nconst DEFAULT_TEMPLATE = `# Task: {{TASK_NAME}}\n\n## Context\nYou are working in a git worktree at: {{WORKTREE_PATH}}\nBranch: {{BRANCH}}\nProject root: {{PROJECT_ROOT}}\n\n## Instructions\n{{PROMPT}}\n\n## Result Reporting\nWhen you have completed the task, write your results to:\n{{RESULT_FILE}}\n`;\n\nexport async function initCommand(options: { json?: boolean }): Promise<void> {\n const cwd = process.cwd();\n\n // 1. Verify git repo\n let projectRoot: string;\n try {\n const result = await execa('git', ['rev-parse', '--show-toplevel'], { ...execaEnv, cwd });\n projectRoot = result.stdout.trim();\n } catch {\n throw new NotGitRepoError(cwd);\n }\n\n // 2. Check tmux available\n await checkTmux();\n\n // 3. Create directories\n const dirs = [\n ppgDir(projectRoot),\n resultsDir(projectRoot),\n logsDir(projectRoot),\n templatesDir(projectRoot),\n promptsDir(projectRoot),\n agentPromptsDir(projectRoot),\n swarmsDir(projectRoot),\n ];\n\n for (const dir of dirs) {\n await fs.mkdir(dir, { recursive: true });\n }\n\n info('Created .ppg/ directory structure');\n\n // 4. Write default config (skip if exists)\n const cfgPath = configPath(projectRoot);\n try {\n await fs.access(cfgPath);\n info('config.yaml already exists, skipping');\n } catch {\n await writeDefaultConfig(projectRoot);\n info('Wrote default config.yaml');\n }\n\n // 5. Write empty manifest\n const dirName = path.basename(projectRoot);\n const sessionName = `ppg-${dirName}`;\n const manifest = createEmptyManifest(projectRoot, sessionName);\n await writeManifest(projectRoot, manifest);\n info('Wrote empty manifest.json');\n\n // 6. Update .gitignore\n await updateGitignore(projectRoot);\n info('Updated .gitignore');\n\n // 7. Write sample template\n const templatePath = path.join(templatesDir(projectRoot), 'default.md');\n try {\n await fs.access(templatePath);\n } catch {\n await fs.writeFile(templatePath, DEFAULT_TEMPLATE, 'utf-8');\n info('Wrote sample template: default.md');\n }\n\n // 8. Write bundled prompt files\n for (const [name, content] of Object.entries(bundledPrompts)) {\n const pPath = promptFile(projectRoot, name);\n try {\n await fs.access(pPath);\n } catch {\n await fs.writeFile(pPath, content, 'utf-8');\n info(`Wrote prompt: ${name}.md`);\n }\n }\n\n // 9. Write bundled swarm templates\n for (const [name, content] of Object.entries(bundledSwarms)) {\n const sPath = path.join(swarmsDir(projectRoot), `${name}.yaml`);\n try {\n await fs.access(sPath);\n } catch {\n await fs.writeFile(sPath, content, 'utf-8');\n info(`Wrote swarm template: ${name}.yaml`);\n }\n }\n\n // 10. Write conductor context\n const conductorPath = path.join(ppgDir(projectRoot), 'conductor-context.md');\n await fs.writeFile(conductorPath, CONDUCTOR_CONTEXT, 'utf-8');\n info('Wrote conductor-context.md');\n\n // 11. Register Claude Code plugin\n const pluginRegistered = await registerClaudePlugin();\n if (pluginRegistered) {\n info('Registered ppg Claude Code plugin');\n }\n\n if (options.json) {\n console.log(JSON.stringify({\n success: true,\n projectRoot,\n sessionName,\n ppgDir: ppgDir(projectRoot),\n pluginRegistered,\n }));\n } else {\n success(`Point Guard initialized in ${projectRoot}`);\n }\n}\n\nasync function registerClaudePlugin(): Promise<boolean> {\n try {\n const home = process.env.HOME;\n if (!home) return false;\n\n const skillsDir = path.join(home, '.claude', 'skills');\n\n // Find this package's skills directory\n // Works from both dist/cli.js (../skills/) and src/commands/init.ts (../../skills/)\n const __dirname = path.dirname(fileURLToPath(import.meta.url));\n let srcSkillsDir = path.resolve(__dirname, '..', 'skills');\n try {\n await fs.access(srcSkillsDir);\n } catch {\n srcSkillsDir = path.resolve(__dirname, '..', '..', 'skills');\n try {\n await fs.access(srcSkillsDir);\n } catch {\n return false;\n }\n }\n\n // Copy skills to ~/.claude/skills/\n await fs.mkdir(skillsDir, { recursive: true });\n const skillFolders = ['ppg', 'ppg-conductor'];\n let copied = false;\n\n for (const folder of skillFolders) {\n const srcDir = path.join(srcSkillsDir, folder);\n const destDir = path.join(skillsDir, folder);\n\n try {\n await fs.access(srcDir);\n } catch {\n continue;\n }\n\n // Copy recursively (overwrite existing)\n await fs.cp(srcDir, destDir, { recursive: true, force: true });\n copied = true;\n }\n\n return copied;\n } catch {\n // Non-fatal — skill installation is best-effort\n return false;\n }\n}\n\nasync function updateGitignore(projectRoot: string): Promise<void> {\n const gitignorePath = path.join(projectRoot, '.gitignore');\n const entriesToAdd = [\n '.ppg/results/',\n '.ppg/logs/',\n '.ppg/manifest.json',\n '.ppg/prompts/',\n '.ppg/agent-prompts/',\n '.ppg/swarms/',\n '.ppg/conductor-context.md',\n ];\n\n let content = '';\n try {\n content = await fs.readFile(gitignorePath, 'utf-8');\n } catch {\n // No .gitignore yet\n }\n\n const lines = content.split('\\n');\n const toAdd = entriesToAdd.filter((entry) => !lines.includes(entry));\n\n if (toAdd.length > 0) {\n const addition = (content.endsWith('\\n') || content === '' ? '' : '\\n')\n + '\\n# Point Guard\\n'\n + toAdd.join('\\n')\n + '\\n';\n await fs.appendFile(gitignorePath, addition, 'utf-8');\n }\n}\n","import { execa } from 'execa';\nimport { worktreePath as getWorktreePath } from '../lib/paths.js';\nimport { NotGitRepoError } from '../lib/errors.js';\nimport { execaEnv } from '../lib/env.js';\n\nexport async function getRepoRoot(cwd?: string): Promise<string> {\n try {\n const result = await execa('git', ['rev-parse', '--show-toplevel'], {\n ...execaEnv,\n cwd: cwd ?? process.cwd(),\n });\n return result.stdout.trim();\n } catch {\n throw new NotGitRepoError(cwd ?? process.cwd());\n }\n}\n\nexport async function getCurrentBranch(cwd?: string): Promise<string> {\n const result = await execa('git', ['branch', '--show-current'], {\n ...execaEnv,\n cwd: cwd ?? process.cwd(),\n });\n return result.stdout.trim();\n}\n\nexport interface CreateWorktreeOptions {\n branch: string;\n base?: string;\n}\n\nexport async function createWorktree(\n repoRoot: string,\n id: string,\n options: CreateWorktreeOptions,\n): Promise<string> {\n const wtPath = getWorktreePath(repoRoot, id);\n const args = ['worktree', 'add', wtPath, '-b', options.branch];\n if (options.base) {\n args.push(options.base);\n }\n await execa('git', args, { ...execaEnv, cwd: repoRoot });\n return wtPath;\n}\n\nexport async function removeWorktree(\n repoRoot: string,\n wtPath: string,\n options?: { force?: boolean; deleteBranch?: boolean; branchName?: string },\n): Promise<void> {\n const args = ['worktree', 'remove', wtPath];\n if (options?.force) {\n args.push('--force');\n }\n await execa('git', args, { ...execaEnv, cwd: repoRoot });\n\n if (options?.deleteBranch && options.branchName) {\n try {\n await execa('git', ['branch', '-D', options.branchName], { ...execaEnv, cwd: repoRoot });\n } catch {\n // Branch may not exist\n }\n }\n}\n\nasync function listWorktrees(repoRoot: string): Promise<string[]> {\n const result = await execa('git', ['worktree', 'list', '--porcelain'], { ...execaEnv, cwd: repoRoot });\n return result.stdout\n .split('\\n')\n .filter((line) => line.startsWith('worktree '))\n .map((line) => line.replace('worktree ', ''));\n}\n\nexport async function pruneWorktrees(repoRoot: string): Promise<void> {\n await execa('git', ['worktree', 'prune'], { ...execaEnv, cwd: repoRoot });\n}\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport type { Config } from '../types/config.js';\n\nexport async function setupWorktreeEnv(\n projectRoot: string,\n wtPath: string,\n config: Config,\n): Promise<void> {\n // Copy .env files\n for (const envFile of config.envFiles) {\n const src = path.join(projectRoot, envFile);\n const dest = path.join(wtPath, envFile);\n try {\n await fs.access(src);\n await fs.copyFile(src, dest);\n } catch {\n // Source env file doesn't exist, skip\n }\n }\n\n // Symlink node_modules\n if (config.symlinkNodeModules) {\n const src = path.join(projectRoot, 'node_modules');\n const dest = path.join(wtPath, 'node_modules');\n try {\n await fs.access(src);\n // Check if dest already exists\n try {\n await fs.lstat(dest);\n // Already exists, skip\n } catch {\n await fs.symlink(src, dest, 'dir');\n }\n } catch {\n // Source node_modules doesn't exist, skip\n }\n }\n}\n\nexport async function teardownWorktreeEnv(wtPath: string): Promise<void> {\n // Remove node_modules symlink before worktree deletion\n const nmPath = path.join(wtPath, 'node_modules');\n try {\n const stat = await fs.lstat(nmPath);\n if (stat.isSymbolicLink()) {\n await fs.unlink(nmPath);\n }\n } catch {\n // Not a symlink or doesn't exist\n }\n}\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport { templatesDir, globalTemplatesDir } from '../lib/paths.js';\n\nexport interface TemplateEntry {\n name: string;\n source: 'local' | 'global';\n}\n\nasync function readMdNames(dir: string): Promise<string[]> {\n try {\n const files = await fs.readdir(dir);\n return files.filter((f) => f.endsWith('.md')).map((f) => f.replace(/\\.md$/, ''));\n } catch {\n return [];\n }\n}\n\nexport async function listTemplates(projectRoot: string): Promise<string[]> {\n const entries = await listTemplatesWithSource(projectRoot);\n return entries.map((e) => e.name);\n}\n\nexport async function listTemplatesWithSource(projectRoot: string): Promise<TemplateEntry[]> {\n const localNames = await readMdNames(templatesDir(projectRoot));\n const globalNames = await readMdNames(globalTemplatesDir());\n\n const seen = new Set<string>();\n const result: TemplateEntry[] = [];\n\n for (const name of localNames) {\n seen.add(name);\n result.push({ name, source: 'local' });\n }\n\n for (const name of globalNames) {\n if (!seen.has(name)) {\n result.push({ name, source: 'global' });\n }\n }\n\n return result;\n}\n\nexport async function loadTemplate(projectRoot: string, name: string): Promise<string> {\n // Try project-local first\n const localPath = path.join(templatesDir(projectRoot), `${name}.md`);\n try {\n return await fs.readFile(localPath, 'utf-8');\n } catch {\n // Fall back to global\n const globalPath = path.join(globalTemplatesDir(), `${name}.md`);\n return fs.readFile(globalPath, 'utf-8');\n }\n}\n\nexport interface TemplateContext {\n WORKTREE_PATH: string;\n BRANCH: string;\n AGENT_ID: string;\n RESULT_FILE: string;\n PROJECT_ROOT: string;\n TASK_NAME?: string;\n PROMPT?: string;\n [key: string]: string | undefined;\n}\n\nexport function renderTemplate(content: string, context: TemplateContext): string {\n return content.replace(/\\{\\{(\\w+)\\}\\}/g, (_match, key: string) => {\n return context[key] ?? `{{${key}}}`;\n });\n}\n","import fs from 'node:fs/promises';\nimport { resultFile, agentPromptFile, agentPromptsDir } from '../lib/paths.js';\nimport { getPaneInfo, listSessionPanes, type PaneInfo } from './tmux.js';\nimport { updateManifest } from './manifest.js';\nimport { PpgError } from '../lib/errors.js';\nimport type { AgentEntry, AgentStatus } from '../types/manifest.js';\nimport type { AgentConfig } from '../types/config.js';\nimport { renderTemplate, type TemplateContext } from './template.js';\nimport * as tmux from './tmux.js';\n\nconst SHELL_COMMANDS = new Set(['bash', 'zsh', 'sh', 'fish', 'dash', 'tcsh', 'csh']);\n\nexport interface SpawnAgentOptions {\n agentId: string;\n agentConfig: AgentConfig;\n prompt: string;\n worktreePath: string;\n tmuxTarget: string;\n projectRoot: string;\n branch: string;\n sessionId?: string;\n skipResultInstructions?: boolean;\n}\n\nexport async function spawnAgent(options: SpawnAgentOptions): Promise<AgentEntry> {\n const {\n agentId,\n agentConfig,\n prompt,\n worktreePath,\n tmuxTarget,\n projectRoot,\n branch,\n } = options;\n\n const resFile = resultFile(projectRoot, agentId);\n\n // Build full prompt with result instructions\n let fullPrompt = prompt;\n if (agentConfig.resultInstructions && !options.skipResultInstructions) {\n const ctx: TemplateContext = {\n WORKTREE_PATH: worktreePath,\n BRANCH: branch,\n AGENT_ID: agentId,\n RESULT_FILE: resFile,\n PROJECT_ROOT: projectRoot,\n };\n const instructions = renderTemplate(agentConfig.resultInstructions, ctx);\n fullPrompt += `\\n\\n---\\n\\n${instructions}`;\n }\n\n // Write prompt to file\n const pFile = agentPromptFile(projectRoot, agentId);\n await fs.mkdir(agentPromptsDir(projectRoot), { recursive: true });\n await fs.writeFile(pFile, fullPrompt, 'utf-8');\n\n // Build and send command\n const command = buildAgentCommand(agentConfig, pFile, options.sessionId);\n await tmux.sendKeys(tmuxTarget, command);\n\n return {\n id: agentId,\n name: agentConfig.name,\n agentType: agentConfig.name,\n status: 'running',\n tmuxTarget,\n prompt: prompt.slice(0, 500), // Truncate for manifest storage\n resultFile: resFile,\n startedAt: new Date().toISOString(),\n ...(options.sessionId ? { sessionId: options.sessionId } : {}),\n };\n}\n\nfunction buildAgentCommand(agentConfig: AgentConfig, promptFilePath: string, sessionId?: string): string {\n // Unset CLAUDECODE so spawned Claude instances don't think they're nested\n const envPrefix = 'unset CLAUDECODE;';\n const { command, promptFlag } = agentConfig;\n // Inject --session-id for Claude-based commands\n const sessionFlag = sessionId && command.includes('claude') ? ` --session-id ${sessionId}` : '';\n // Single-quote the path inside $(cat ...) to handle spaces safely\n const catExpr = `\"$(cat '${promptFilePath}')\"`;\n if (promptFlag) {\n // Use explicit flag: command --flag \"$(cat 'prompt-file')\"\n return `${envPrefix} ${command}${sessionFlag} ${promptFlag} ${catExpr}`;\n }\n // Pass prompt as positional argument: command \"$(cat 'prompt-file')\"\n return `${envPrefix} ${command}${sessionFlag} ${catExpr}`;\n}\n\n/**\n * Check agent status using the layered signal stack.\n * Checked in order of signal strength:\n * 1. Result file exists → completed\n * 2. Tmux pane doesn't exist → lost\n * 3. Pane is dead → completed/failed based on exit code\n * 4. Current command is a shell → agent exited → completed/failed\n * 5. Otherwise → running\n *\n * @param paneMap Optional pre-fetched pane map from listSessionPanes() for batch queries\n */\nexport async function checkAgentStatus(\n agent: AgentEntry,\n projectRoot: string,\n paneMap?: Map<string, PaneInfo>,\n): Promise<{ status: AgentStatus; exitCode?: number }> {\n // If already in terminal state, don't re-check\n if (['completed', 'failed', 'killed', 'lost'].includes(agent.status)) {\n return { status: agent.status, exitCode: agent.exitCode };\n }\n\n // 1. Check result file\n const hasResult = await fileExists(agent.resultFile);\n if (hasResult) {\n return { status: 'completed' };\n }\n\n // 2. Check if tmux pane exists (use batch map if available)\n const paneInfo = paneMap\n ? (paneMap.get(agent.tmuxTarget) ?? null)\n : await getPaneInfo(agent.tmuxTarget);\n if (!paneInfo) {\n return { status: 'lost' };\n }\n\n // 3. Check if pane is dead\n if (paneInfo.isDead) {\n const exitCode = paneInfo.deadStatus;\n // Check result file one more time (may have been written right before exit)\n const hasResultNow = await fileExists(agent.resultFile);\n if (hasResultNow || exitCode === 0) {\n return { status: 'completed', exitCode: exitCode ?? 0 };\n }\n return { status: 'failed', exitCode };\n }\n\n // 4. Check if current command is a shell (agent process exited, returned to shell)\n if (SHELL_COMMANDS.has(paneInfo.currentCommand)) {\n // Agent process exited, back to shell prompt\n const hasResultNow = await fileExists(agent.resultFile);\n if (hasResultNow) {\n return { status: 'completed', exitCode: 0 };\n }\n return { status: 'failed', exitCode: undefined };\n }\n\n // 5. Still running\n return { status: 'running' };\n}\n\nexport async function refreshAllAgentStatuses(\n manifest: import('../types/manifest.js').Manifest,\n projectRoot: string,\n): Promise<import('../types/manifest.js').Manifest> {\n // Batch-fetch all pane info in a single tmux call\n const paneMap = await listSessionPanes(manifest.sessionName);\n\n // Collect all agents that need checking\n const checks: Array<{ agent: AgentEntry; promise: Promise<{ status: AgentStatus; exitCode?: number }> }> = [];\n for (const wt of Object.values(manifest.worktrees)) {\n for (const agent of Object.values(wt.agents)) {\n checks.push({\n agent,\n promise: checkAgentStatus(agent, projectRoot, paneMap),\n });\n }\n }\n\n // Run all status checks in parallel\n const results = await Promise.all(checks.map((c) => c.promise));\n\n // Apply results\n const now = new Date().toISOString();\n for (let i = 0; i < checks.length; i++) {\n const { agent } = checks[i];\n const { status, exitCode } = results[i];\n if (status !== agent.status) {\n agent.status = status;\n if (exitCode !== undefined) agent.exitCode = exitCode;\n if (['completed', 'failed', 'lost'].includes(status) && !agent.completedAt) {\n agent.completedAt = now;\n }\n }\n }\n\n // Check worktree directories in parallel\n const wtChecks = Object.values(manifest.worktrees)\n .filter((wt) => wt.status === 'active')\n .map(async (wt) => {\n const exists = await fileExists(wt.path);\n if (!exists) {\n wt.status = 'cleaned';\n for (const agent of Object.values(wt.agents)) {\n if (!['completed', 'failed', 'killed'].includes(agent.status)) {\n agent.status = 'lost';\n if (!agent.completedAt) agent.completedAt = now;\n }\n }\n }\n });\n await Promise.all(wtChecks);\n\n return manifest;\n}\n\nexport interface ResumeAgentOptions {\n agent: AgentEntry;\n worktreeId: string;\n sessionName: string;\n cwd: string;\n windowName: string;\n projectRoot: string;\n}\n\n/**\n * Resume a dead agent's session in a new tmux window, updating the manifest.\n * Returns the new tmux target.\n */\nexport async function resumeAgent(options: ResumeAgentOptions): Promise<string> {\n const { agent, worktreeId, sessionName, cwd, windowName, projectRoot } = options;\n\n if (!agent.sessionId) {\n throw new PpgError(\n `Agent ${agent.id} has no session ID. Cannot resume agents spawned before session tracking was added.`,\n 'NO_SESSION_ID',\n );\n }\n\n await tmux.ensureSession(sessionName);\n const newTarget = await tmux.createWindow(sessionName, windowName, cwd);\n await tmux.sendKeys(newTarget, `unset CLAUDECODE; claude --resume ${agent.sessionId}`);\n\n await updateManifest(projectRoot, (m) => {\n const mAgent = m.worktrees[worktreeId]?.agents[agent.id];\n if (mAgent) {\n mAgent.tmuxTarget = newTarget;\n mAgent.status = 'running';\n }\n return m;\n });\n\n return newTarget;\n}\n\nexport async function killAgent(agent: AgentEntry): Promise<void> {\n // Check if pane exists before attempting to kill\n const initialInfo = await getPaneInfo(agent.tmuxTarget);\n if (!initialInfo || initialInfo.isDead) return;\n\n // Send Ctrl-C first (pane may die between check and send)\n try {\n await tmux.sendCtrlC(agent.tmuxTarget);\n } catch {\n // Pane died between check and send — already gone\n return;\n }\n\n // Wait for graceful shutdown (Claude Code needs more time)\n await new Promise((resolve) => setTimeout(resolve, 2000));\n\n // Check if still alive\n const paneInfo = await getPaneInfo(agent.tmuxTarget);\n if (paneInfo && !paneInfo.isDead) {\n // Kill the pane\n await tmux.killPane(agent.tmuxTarget);\n }\n}\n\n/**\n * Kill multiple agents in parallel: send Ctrl-C to all, wait once, then force-kill survivors.\n */\nexport async function killAgents(agents: AgentEntry[]): Promise<void> {\n if (agents.length === 0) return;\n\n // Filter to only agents with live panes\n const alive: AgentEntry[] = [];\n await Promise.all(agents.map(async (a) => {\n const info = await getPaneInfo(a.tmuxTarget);\n if (info && !info.isDead) alive.push(a);\n }));\n if (alive.length === 0) return;\n\n // Send Ctrl-C to all live agents in parallel (catch pane-died-between-check-and-send)\n await Promise.all(alive.map((a) => tmux.sendCtrlC(a.tmuxTarget).catch(() => {})));\n\n // Wait for graceful shutdown (Claude Code needs more time)\n await new Promise((resolve) => setTimeout(resolve, 2000));\n\n // Check and force-kill survivors in parallel\n await Promise.all(alive.map(async (a) => {\n const paneInfo = await getPaneInfo(a.tmuxTarget);\n if (paneInfo && !paneInfo.isDead) {\n await tmux.killPane(a.tmuxTarget);\n }\n }));\n}\n\nasync function fileExists(filePath: string): Promise<boolean> {\n try {\n await fs.access(filePath);\n return true;\n } catch {\n return false;\n }\n}\n","/**\n * Escape a string for safe use with tmux send-keys -l (literal mode).\n * In literal mode, most characters are safe. We only need to handle\n * edge cases like leading dashes which tmux interprets as flags.\n */\nexport function escapeTmuxLiteral(text: string): string {\n let result = text;\n if (result.startsWith('-')) {\n result = '\\\\' + result;\n }\n return result;\n}\n\n/**\n * Shell-escape a string for use inside double quotes.\n */\nexport function shellEscape(text: string): string {\n return text\n .replace(/\\\\/g, '\\\\\\\\')\n .replace(/\"/g, '\\\\\"')\n .replace(/\\$/g, '\\\\$')\n .replace(/`/g, '\\\\`');\n}\n","import { execa } from 'execa';\nimport { warn } from '../lib/output.js';\nimport { shellEscape } from '../lib/shell.js';\n\n/**\n * Open a new Terminal.app window that attaches to a specific tmux session/window.\n */\nexport async function openTerminalWindow(\n sessionName: string,\n windowTarget: string,\n title: string,\n): Promise<void> {\n // Source shell profiles so tmux is found on M-series Macs where\n // /opt/homebrew/bin is not in the default GUI app / Terminal.app PATH.\n // Escape values for safe interpolation inside AppleScript double-quoted strings.\n const safeSession = shellEscape(sessionName);\n const safeWindow = shellEscape(windowTarget);\n const safeTitle = shellEscape(title);\n const tmuxCmd = `if [ -x /usr/libexec/path_helper ]; then eval $(/usr/libexec/path_helper -s); fi; [ -f ~/.zprofile ] && source ~/.zprofile; [ -f ~/.zshrc ] && source ~/.zshrc; tmux attach-session -t ${safeSession} \\\\\\\\; select-window -t ${safeWindow}`;\n\n const script = `\ntell application \"Terminal\"\n activate\n set newTab to do script \"${tmuxCmd}\"\n set custom title of newTab to \"${safeTitle}\"\nend tell\n`;\n\n try {\n await execa('osascript', ['-e', script]);\n } catch (err) {\n warn(`Could not open Terminal window for \"${title}\": ${err instanceof Error ? err.message : err}`);\n }\n}\n","import { randomUUID } from 'node:crypto';\nimport { customAlphabet } from 'nanoid';\n\nconst alphabet = 'abcdefghijklmnopqrstuvwxyz0123456789';\n\nconst shortId = customAlphabet(alphabet, 6);\nconst longId = customAlphabet(alphabet, 8);\n\nexport function worktreeId(): string {\n return `wt-${shortId()}`;\n}\n\nexport function agentId(): string {\n return `ag-${longId()}`;\n}\n\nexport function sessionId(): string {\n return randomUUID();\n}\n","/**\n * Normalize a user-provided name into a valid git branch name component.\n *\n * Used to sanitize `--name` values before they become part of `ppg/<name>` branches.\n */\nexport function normalizeName(raw: string, fallback: string): string {\n const name = raw\n .toLowerCase()\n // Control characters → removed\n .replace(/[\\x00-\\x1f\\x7f]+/g, '')\n // Spaces and underscores → hyphens\n .replace(/[\\s_]+/g, '-')\n // Git-invalid chars → hyphens\n .replace(/[~^:?*[\\]\\\\@{}<>]+/g, '-')\n // Collapse `..` → single dot\n .replace(/\\.{2,}/g, '.')\n // Collapse consecutive hyphens → single hyphen\n .replace(/-{2,}/g, '-')\n // Split on slash, normalize each segment, rejoin\n .split('/')\n .map(normalizeSegment)\n .filter(Boolean)\n .join('/');\n\n return name || fallback;\n}\n\nfunction normalizeSegment(segment: string): string {\n let s = segment;\n\n // Strip `.lock` suffix repeatedly (before trimming dots, so `.lock` → empty)\n while (s.endsWith('.lock')) {\n s = s.slice(0, -5);\n }\n\n // Strip leading/trailing hyphens and dots\n s = s.replace(/^[-.]+|[-.]+$/g, '');\n\n return s;\n}\n","import { PpgError } from './errors.js';\n\n/**\n * Parse CLI --var KEY=value arguments into a record.\n * Throws INVALID_ARGS if any entry is missing '=' or has an empty key.\n */\nexport function parseVars(vars: string[]): Record<string, string> {\n const result: Record<string, string> = {};\n for (const v of vars) {\n const eqIdx = v.indexOf('=');\n if (eqIdx < 1) {\n throw new PpgError(`Invalid --var format: \"${v}\" — expected KEY=value`, 'INVALID_ARGS');\n }\n result[v.slice(0, eqIdx)] = v.slice(eqIdx + 1);\n }\n return result;\n}\n","import fs from 'node:fs/promises';\nimport { loadConfig, resolveAgentConfig } from '../core/config.js';\nimport { readManifest, updateManifest, resolveWorktree } from '../core/manifest.js';\nimport { getRepoRoot, getCurrentBranch, createWorktree } from '../core/worktree.js';\nimport { setupWorktreeEnv } from '../core/env.js';\nimport { loadTemplate, renderTemplate, type TemplateContext } from '../core/template.js';\nimport { spawnAgent } from '../core/agent.js';\nimport * as tmux from '../core/tmux.js';\nimport { openTerminalWindow } from '../core/terminal.js';\nimport { worktreeId as genWorktreeId, agentId as genAgentId, sessionId as genSessionId } from '../lib/id.js';\nimport { resultFile, manifestPath } from '../lib/paths.js';\nimport { PpgError, NotInitializedError, WorktreeNotFoundError } from '../lib/errors.js';\nimport { output, success, info } from '../lib/output.js';\nimport { normalizeName } from '../lib/name.js';\nimport { parseVars } from '../lib/vars.js';\nimport type { WorktreeEntry, AgentEntry } from '../types/manifest.js';\n\nexport interface SpawnOptions {\n name?: string;\n agent?: string;\n prompt?: string;\n promptFile?: string;\n template?: string;\n var?: string[];\n base?: string;\n worktree?: string;\n count?: number;\n split?: boolean;\n open?: boolean;\n json?: boolean;\n}\n\nexport async function spawnCommand(options: SpawnOptions): Promise<void> {\n const projectRoot = await getRepoRoot();\n const config = await loadConfig(projectRoot);\n\n // Verify initialized (lightweight file check instead of full manifest read)\n try {\n await fs.access(manifestPath(projectRoot));\n } catch {\n throw new NotInitializedError(projectRoot);\n }\n\n const agentConfig = resolveAgentConfig(config, options.agent);\n const count = options.count ?? 1;\n\n // Validate vars early — before any side effects (worktree/tmux creation)\n const userVars = parseVars(options.var ?? []);\n\n // Resolve prompt\n const promptText = await resolvePrompt(options, projectRoot);\n\n if (options.worktree) {\n // Add agent(s) to existing worktree\n await spawnIntoExistingWorktree(\n projectRoot,\n config,\n agentConfig,\n options.worktree,\n promptText,\n count,\n options,\n userVars,\n );\n } else {\n // Create new worktree + agent(s)\n await spawnNewWorktree(\n projectRoot,\n config,\n agentConfig,\n promptText,\n count,\n options,\n userVars,\n );\n }\n}\n\nasync function resolvePrompt(options: SpawnOptions, projectRoot: string): Promise<string> {\n if (options.prompt) return options.prompt;\n\n if (options.promptFile) {\n return fs.readFile(options.promptFile, 'utf-8');\n }\n\n if (options.template) {\n return loadTemplate(projectRoot, options.template);\n }\n\n throw new PpgError('One of --prompt, --prompt-file, or --template is required', 'INVALID_ARGS');\n}\n\nasync function spawnNewWorktree(\n projectRoot: string,\n config: import('../types/config.js').Config,\n agentConfig: import('../types/config.js').AgentConfig,\n promptText: string,\n count: number,\n options: SpawnOptions,\n userVars: Record<string, string>,\n): Promise<void> {\n const baseBranch = options.base ?? await getCurrentBranch(projectRoot);\n const wtId = genWorktreeId();\n const name = options.name ? normalizeName(options.name, wtId) : wtId;\n const branchName = `ppg/${name}`;\n\n // Create git worktree\n info(`Creating worktree ${wtId} on branch ${branchName}`);\n const wtPath = await createWorktree(projectRoot, wtId, {\n branch: branchName,\n base: baseBranch,\n });\n\n // Setup env\n await setupWorktreeEnv(projectRoot, wtPath, config);\n\n // Ensure tmux session (manifest is the source of truth for session name)\n const manifest = await readManifest(projectRoot);\n const sessionName = manifest.sessionName;\n await tmux.ensureSession(sessionName);\n\n // Create tmux window\n const windowTarget = await tmux.createWindow(sessionName, name, wtPath);\n\n // Register skeleton worktree in manifest before spawning agents\n // so partial failures leave a record for cleanup\n const worktreeEntry: WorktreeEntry = {\n id: wtId,\n name,\n path: wtPath,\n branch: branchName,\n baseBranch,\n status: 'active',\n tmuxWindow: windowTarget,\n agents: {},\n createdAt: new Date().toISOString(),\n };\n\n await updateManifest(projectRoot, (m) => {\n m.worktrees[wtId] = worktreeEntry;\n return m;\n });\n\n // Spawn agents — one tmux window per agent (default), or split panes (--split)\n const agents: AgentEntry[] = [];\n for (let i = 0; i < count; i++) {\n const aId = genAgentId();\n let target: string;\n\n if (i === 0) {\n // First agent uses the window already created for the worktree\n target = windowTarget;\n } else if (options.split) {\n // --split: additional agents share the same window as split panes\n const direction = i % 2 === 1 ? 'horizontal' : 'vertical';\n const pane = await tmux.splitPane(windowTarget, direction, wtPath);\n target = pane.target;\n } else {\n // Default: each additional agent gets its own tmux window\n target = await tmux.createWindow(sessionName, `${name}-${i}`, wtPath);\n }\n\n // Render template variables if present\n const ctx: TemplateContext = {\n WORKTREE_PATH: wtPath,\n BRANCH: branchName,\n AGENT_ID: aId,\n RESULT_FILE: resultFile(projectRoot, aId),\n PROJECT_ROOT: projectRoot,\n TASK_NAME: name,\n PROMPT: promptText,\n };\n\n Object.assign(ctx, userVars);\n\n const renderedPrompt = renderTemplate(promptText, ctx);\n\n const agentEntry = await spawnAgent({\n agentId: aId,\n agentConfig,\n prompt: renderedPrompt,\n worktreePath: wtPath,\n tmuxTarget: target,\n projectRoot,\n branch: branchName,\n sessionId: genSessionId(),\n });\n\n agents.push(agentEntry);\n\n // Update manifest incrementally after each agent spawn\n await updateManifest(projectRoot, (m) => {\n if (m.worktrees[wtId]) {\n m.worktrees[wtId].agents[agentEntry.id] = agentEntry;\n }\n return m;\n });\n }\n\n // Only open Terminal window when explicitly requested via --open (fire-and-forget)\n if (options.open === true) {\n openTerminalWindow(sessionName, windowTarget, name).catch(() => {});\n }\n\n if (options.json) {\n output({\n success: true,\n worktree: {\n id: wtId,\n name,\n branch: branchName,\n path: wtPath,\n tmuxWindow: windowTarget,\n },\n agents: agents.map((a) => ({\n id: a.id,\n tmuxTarget: a.tmuxTarget,\n sessionId: a.sessionId,\n })),\n }, true);\n } else {\n success(`Spawned worktree ${wtId} with ${agents.length} agent(s)`);\n for (const a of agents) {\n info(` Agent ${a.id} → ${a.tmuxTarget}`);\n }\n info(`Attach: ppg attach ${wtId}`);\n }\n}\n\nasync function spawnIntoExistingWorktree(\n projectRoot: string,\n config: import('../types/config.js').Config,\n agentConfig: import('../types/config.js').AgentConfig,\n worktreeRef: string,\n promptText: string,\n count: number,\n options: SpawnOptions,\n userVars: Record<string, string>,\n): Promise<void> {\n const manifest = await readManifest(projectRoot);\n const wt = resolveWorktree(manifest, worktreeRef);\n\n if (!wt) throw new WorktreeNotFoundError(worktreeRef);\n\n // Lazily create tmux window if worktree has none (standalone worktree)\n let windowTarget = wt.tmuxWindow;\n if (!windowTarget) {\n await tmux.ensureSession(manifest.sessionName);\n windowTarget = await tmux.createWindow(manifest.sessionName, wt.name, wt.path);\n }\n\n const agents: AgentEntry[] = [];\n for (let i = 0; i < count; i++) {\n const aId = genAgentId();\n\n let target: string;\n if (i === 0 && options.split) {\n // First agent reuses the existing window pane\n target = windowTarget;\n } else if (options.split) {\n // --split: additional agents share the same window as split panes\n const direction = i % 2 === 1 ? 'horizontal' : 'vertical';\n const pane = await tmux.splitPane(windowTarget, direction, wt.path);\n target = pane.target;\n } else {\n // Default: every agent gets its own tmux window\n target = await tmux.createWindow(manifest.sessionName, `${wt.name}-agent-${i}`, wt.path);\n }\n\n const ctx: TemplateContext = {\n WORKTREE_PATH: wt.path,\n BRANCH: wt.branch,\n AGENT_ID: aId,\n RESULT_FILE: resultFile(projectRoot, aId),\n PROJECT_ROOT: projectRoot,\n TASK_NAME: wt.name,\n PROMPT: promptText,\n };\n\n Object.assign(ctx, userVars);\n\n const renderedPrompt = renderTemplate(promptText, ctx);\n\n const agentEntry = await spawnAgent({\n agentId: aId,\n agentConfig,\n prompt: renderedPrompt,\n worktreePath: wt.path,\n tmuxTarget: target,\n projectRoot,\n branch: wt.branch,\n sessionId: genSessionId(),\n });\n\n agents.push(agentEntry);\n }\n\n await updateManifest(projectRoot, (m) => {\n const mWt = m.worktrees[wt.id];\n if (!mWt) return m;\n if (!mWt.tmuxWindow) {\n mWt.tmuxWindow = windowTarget;\n }\n for (const a of agents) {\n mWt.agents[a.id] = a;\n }\n return m;\n });\n\n // Only open Terminal window when explicitly requested via --open (fire-and-forget)\n if (options.open === true) {\n openTerminalWindow(manifest.sessionName, windowTarget, wt.name).catch(() => {});\n }\n\n if (options.json) {\n output({\n success: true,\n worktree: {\n id: wt.id,\n name: wt.name,\n branch: wt.branch,\n path: wt.path,\n tmuxWindow: windowTarget,\n },\n agents: agents.map((a) => ({ id: a.id, tmuxTarget: a.tmuxTarget, sessionId: a.sessionId })),\n }, true);\n } else {\n success(`Added ${agents.length} agent(s) to worktree ${wt.id}`);\n for (const a of agents) {\n info(` Agent ${a.id} → ${a.tmuxTarget}`);\n }\n }\n}\n","import { loadConfig } from '../core/config.js';\nimport { requireManifest, updateManifest } from '../core/manifest.js';\nimport { refreshAllAgentStatuses } from '../core/agent.js';\nimport { getRepoRoot } from '../core/worktree.js';\nimport { output, formatStatus, formatTable, type Column } from '../lib/output.js';\nimport type { AgentEntry, WorktreeEntry } from '../types/manifest.js';\n\nexport interface StatusOptions {\n json?: boolean;\n watch?: boolean;\n worktree?: string;\n}\n\nexport async function statusCommand(worktreeFilter?: string, options?: StatusOptions): Promise<void> {\n const projectRoot = await getRepoRoot();\n\n // Read manifest and refresh statuses\n await requireManifest(projectRoot);\n const manifest = await updateManifest(projectRoot, async (m) => {\n return refreshAllAgentStatuses(m, projectRoot);\n });\n\n // Filter worktrees if specified\n const filter = worktreeFilter ?? options?.worktree;\n let worktrees = Object.values(manifest.worktrees);\n if (filter) {\n worktrees = worktrees.filter(\n (wt) => wt.id === filter || wt.name === filter || wt.branch === filter,\n );\n }\n\n if (options?.json) {\n output({\n session: manifest.sessionName,\n worktrees: Object.fromEntries(worktrees.map((wt) => [wt.id, wt])),\n }, true);\n return;\n }\n\n if (worktrees.length === 0) {\n console.log('No active worktrees. Use `ppg spawn` to create one.');\n return;\n }\n\n for (const wt of worktrees) {\n printWorktreeStatus(wt);\n }\n\n if (options?.watch) {\n const interval = setInterval(async () => {\n console.clear();\n try {\n const m = await updateManifest(projectRoot, async (m) => {\n return refreshAllAgentStatuses(m, projectRoot);\n });\n let wts = Object.values(m.worktrees);\n if (filter) {\n wts = wts.filter(\n (wt) => wt.id === filter || wt.name === filter || wt.branch === filter,\n );\n }\n for (const wt of wts) {\n printWorktreeStatus(wt);\n }\n } catch (err) {\n console.error('Error refreshing status:', err);\n }\n }, 2000);\n\n // Handle exit\n process.on('SIGINT', () => {\n clearInterval(interval);\n process.exit(0);\n });\n }\n}\n\nfunction printWorktreeStatus(wt: WorktreeEntry): void {\n const agents = Object.values(wt.agents);\n const statusCounts = {\n running: agents.filter((a) => a.status === 'running').length,\n completed: agents.filter((a) => a.status === 'completed').length,\n failed: agents.filter((a) => a.status === 'failed').length,\n lost: agents.filter((a) => a.status === 'lost').length,\n };\n\n console.log(\n `\\n${wt.name} (${wt.id}) [${formatStatus(wt.status)}] branch:${wt.branch}`,\n );\n\n if (agents.length === 0) {\n console.log(' No agents');\n return;\n }\n\n const columns: Column[] = [\n { header: 'Agent', key: 'id', width: 14 },\n { header: 'Type', key: 'agentType', width: 10 },\n {\n header: 'Status',\n key: 'status',\n width: 12,\n format: (v) => formatStatus(v as AgentEntry['status']),\n },\n { header: 'Started', key: 'startedAt', width: 20, format: (v) => formatTime(v as string) },\n { header: 'Pane', key: 'tmuxTarget', width: 20 },\n ];\n\n const table = formatTable(agents as unknown as Record<string, unknown>[], columns);\n console.log(table.split('\\n').map((l) => ` ${l}`).join('\\n'));\n}\n\nfunction formatTime(iso: string): string {\n if (!iso) return '—';\n const d = new Date(iso);\n const now = new Date();\n const diffMs = now.getTime() - d.getTime();\n const diffMin = Math.floor(diffMs / 60_000);\n if (diffMin < 1) return 'just now';\n if (diffMin < 60) return `${diffMin}m ago`;\n const diffHr = Math.floor(diffMin / 60);\n return `${diffHr}h ${diffMin % 60}m ago`;\n}\n","import { execa } from 'execa';\nimport { execaEnv } from '../lib/env.js';\n\nexport type PrState = 'MERGED' | 'OPEN' | 'CLOSED' | 'UNKNOWN';\n\n/**\n * Check the GitHub PR state for a given branch.\n * Uses `gh pr view` to query the PR associated with the branch.\n * Returns 'UNKNOWN' if gh is not available or the command fails.\n */\nexport async function checkPrState(branch: string): Promise<PrState> {\n try {\n const result = await execa(\n 'gh',\n ['pr', 'view', branch, '--json', 'state', '--jq', '.state'],\n execaEnv,\n );\n const state = result.stdout.trim().toUpperCase();\n if (state === 'MERGED' || state === 'OPEN' || state === 'CLOSED') {\n return state;\n }\n return 'UNKNOWN';\n } catch {\n return 'UNKNOWN';\n }\n}\n","import type { PaneInfo } from './tmux.js';\nimport type { AgentEntry, WorktreeEntry } from '../types/manifest.js';\n\n/**\n * Read the current process's tmux pane ID from the environment.\n * Returns null when not running inside tmux.\n */\nexport function getCurrentPaneId(): string | null {\n return process.env.TMUX_PANE ?? null;\n}\n\n/**\n * Check if a tmux target (pane ID, session:window, or session:window.pane)\n * would affect the pane the current process is running in.\n *\n * Uses the paneMap from listSessionPanes() which indexes by multiple formats.\n */\nexport function wouldAffectSelf(\n target: string,\n selfPaneId: string,\n paneMap: Map<string, PaneInfo>,\n): boolean {\n // Direct match: target IS the self pane\n if (target === selfPaneId) return true;\n\n // Look up the target in the pane map\n const targetInfo = paneMap.get(target);\n if (!targetInfo) return false;\n\n // If target resolves to a specific pane, check if it's self\n if (targetInfo.paneId === selfPaneId) return true;\n\n // If target is a window (session:window format, no dot), check all panes in that window\n // The pane map indexes by session:window too, which maps to the first pane.\n // But a window kill would kill ALL panes in it, so we need to check if any pane\n // in that window is self.\n if (!target.includes('.') && target.includes(':')) {\n // This is a window-level target. Scan the map for all panes in this window.\n for (const [key, info] of paneMap) {\n if (key.startsWith(target + '.') && info.paneId === selfPaneId) {\n return true;\n }\n }\n }\n\n return false;\n}\n\n/**\n * Split an agent list into safe-to-kill and must-skip sets.\n */\nexport function excludeSelf(\n agents: AgentEntry[],\n selfPaneId: string,\n paneMap: Map<string, PaneInfo>,\n): { safe: AgentEntry[]; skipped: AgentEntry[] } {\n const safe: AgentEntry[] = [];\n const skipped: AgentEntry[] = [];\n\n for (const agent of agents) {\n if (wouldAffectSelf(agent.tmuxTarget, selfPaneId, paneMap)) {\n skipped.push(agent);\n } else {\n safe.push(agent);\n }\n }\n\n return { safe, skipped };\n}\n\n/**\n * Check if cleaning up a worktree would kill the current process.\n * Checks all agent tmux targets and the worktree's own tmux window.\n */\nexport function wouldCleanupAffectSelf(\n wt: WorktreeEntry,\n selfPaneId: string,\n paneMap: Map<string, PaneInfo>,\n): boolean {\n // Check worktree-level tmux window\n if (wt.tmuxWindow && wouldAffectSelf(wt.tmuxWindow, selfPaneId, paneMap)) {\n return true;\n }\n\n // Check each agent's tmux target\n for (const agent of Object.values(wt.agents)) {\n if (agent.tmuxTarget && wouldAffectSelf(agent.tmuxTarget, selfPaneId, paneMap)) {\n return true;\n }\n }\n\n return false;\n}\n","import fs from 'node:fs/promises';\nimport { updateManifest } from './manifest.js';\nimport { removeWorktree } from './worktree.js';\nimport { teardownWorktreeEnv } from './env.js';\nimport * as tmux from './tmux.js';\nimport { agentPromptFile } from '../lib/paths.js';\nimport { warn } from '../lib/output.js';\nimport { wouldAffectSelf } from './self.js';\nimport type { PaneInfo } from './tmux.js';\nimport type { WorktreeEntry } from '../types/manifest.js';\n\nexport interface CleanupOptions {\n /** Current process's tmux pane ID (from $TMUX_PANE). Null = not inside tmux. */\n selfPaneId?: string | null;\n /** Pre-fetched pane map from listSessionPanes(). */\n paneMap?: Map<string, PaneInfo>;\n}\n\nexport interface CleanupResult {\n /** Worktree ID that was cleaned. */\n worktreeId: string;\n /** Whether manifest was updated to 'cleaned'. */\n manifestUpdated: boolean;\n /** Number of tmux windows successfully killed. */\n tmuxKilled: number;\n /** Number of tmux windows skipped (already gone). */\n tmuxSkipped: number;\n /** Number of tmux windows that failed to kill (unexpected error). */\n tmuxFailed: number;\n /** Whether any target was skipped due to self-protection. */\n selfProtected: boolean;\n /** Targets that were self-protected. */\n selfProtectedTargets: string[];\n}\n\n/**\n * Clean up a worktree: update manifest FIRST (crash-safe), then kill tmux, teardown env, remove git worktree.\n *\n * Operation order is designed so that if the process dies mid-cleanup,\n * the manifest already reflects the cleaned state.\n *\n * Idempotent: if worktree is already 'cleaned' in manifest, only attempts filesystem cleanup.\n */\nexport async function cleanupWorktree(\n projectRoot: string,\n wt: WorktreeEntry,\n options?: CleanupOptions,\n): Promise<CleanupResult> {\n const selfPaneId = options?.selfPaneId ?? null;\n const paneMap = options?.paneMap ?? new Map<string, PaneInfo>();\n\n const result: CleanupResult = {\n worktreeId: wt.id,\n manifestUpdated: false,\n tmuxKilled: 0,\n tmuxSkipped: 0,\n tmuxFailed: 0,\n selfProtected: false,\n selfProtectedTargets: [],\n };\n\n const alreadyCleaned = wt.status === 'cleaned';\n\n // 1. Update manifest FIRST — crash-safe point\n if (!alreadyCleaned) {\n await updateManifest(projectRoot, (m) => {\n if (m.worktrees[wt.id]) {\n m.worktrees[wt.id].status = 'cleaned';\n }\n return m;\n });\n result.manifestUpdated = true;\n }\n\n // 2. Kill tmux windows — skip if already cleaned (tmux already gone),\n // skip targets that match selfPaneId\n if (!alreadyCleaned) {\n const targets = new Set<string>();\n\n for (const agent of Object.values(wt.agents)) {\n if (agent.tmuxTarget) targets.add(agent.tmuxTarget);\n }\n if (wt.tmuxWindow) targets.add(wt.tmuxWindow);\n\n for (const target of targets) {\n // Self-protection check\n if (selfPaneId && wouldAffectSelf(target, selfPaneId, paneMap)) {\n result.selfProtected = true;\n result.selfProtectedTargets.push(target);\n warn(`Skipping tmux kill for ${target} — contains current process`);\n continue;\n }\n\n try {\n await tmux.killWindow(target);\n result.tmuxKilled++;\n } catch (err) {\n // killWindow now only throws on unexpected errors (not \"not found\")\n result.tmuxFailed++;\n warn(`Failed to kill tmux window ${target}: ${err instanceof Error ? err.message : err}`);\n }\n }\n }\n\n // 3. Remove agent prompt files\n for (const agent of Object.values(wt.agents)) {\n const pFile = agentPromptFile(projectRoot, agent.id);\n await fs.rm(pFile, { force: true });\n }\n\n // 4. Teardown env\n try {\n await teardownWorktreeEnv(wt.path);\n } catch { /* may already be cleaned */ }\n\n // 5. Remove git worktree + branch\n try {\n await removeWorktree(projectRoot, wt.path, {\n force: true,\n deleteBranch: true,\n branchName: wt.branch,\n });\n } catch (err) {\n warn(`Could not fully remove worktree ${wt.id}: ${err instanceof Error ? err.message : err}`);\n }\n\n return result;\n}\n","import { readManifest, updateManifest, findAgent, resolveWorktree } from '../core/manifest.js';\nimport { killAgent, killAgents } from '../core/agent.js';\nimport { checkPrState } from '../core/pr.js';\nimport { getRepoRoot } from '../core/worktree.js';\nimport { cleanupWorktree } from '../core/cleanup.js';\nimport { getCurrentPaneId, excludeSelf } from '../core/self.js';\nimport { listSessionPanes, type PaneInfo } from '../core/tmux.js';\nimport { PpgError, NotInitializedError, AgentNotFoundError, WorktreeNotFoundError } from '../lib/errors.js';\nimport { output, success, info, warn } from '../lib/output.js';\nimport type { AgentEntry } from '../types/manifest.js';\n\nexport interface KillOptions {\n agent?: string;\n worktree?: string;\n all?: boolean;\n remove?: boolean;\n delete?: boolean;\n includeOpenPrs?: boolean;\n json?: boolean;\n}\n\nexport async function killCommand(options: KillOptions): Promise<void> {\n const projectRoot = await getRepoRoot();\n\n if (!options.agent && !options.worktree && !options.all) {\n throw new PpgError('One of --agent, --worktree, or --all is required', 'INVALID_ARGS');\n }\n\n // Capture self-identification once at the start\n const selfPaneId = getCurrentPaneId();\n let paneMap: Map<string, PaneInfo> | undefined;\n if (selfPaneId) {\n const manifest = await readManifest(projectRoot);\n paneMap = await listSessionPanes(manifest.sessionName);\n }\n\n if (options.agent) {\n await killSingleAgent(projectRoot, options.agent, options, selfPaneId, paneMap);\n } else if (options.worktree) {\n await killWorktreeAgents(projectRoot, options.worktree, options, selfPaneId, paneMap);\n } else if (options.all) {\n await killAllAgents(projectRoot, options, selfPaneId, paneMap);\n }\n}\n\nasync function killSingleAgent(\n projectRoot: string,\n agentId: string,\n options: KillOptions,\n selfPaneId: string | null,\n paneMap?: Map<string, PaneInfo>,\n): Promise<void> {\n const manifest = await readManifest(projectRoot);\n const found = findAgent(manifest, agentId);\n if (!found) throw new AgentNotFoundError(agentId);\n\n const { agent } = found;\n const isTerminal = ['completed', 'failed', 'killed', 'lost'].includes(agent.status);\n\n // Self-protection check\n if (selfPaneId && paneMap) {\n const { skipped } = excludeSelf([agent], selfPaneId, paneMap);\n if (skipped.length > 0) {\n warn(`Cannot kill agent ${agentId} — it contains the current ppg process`);\n if (options.json) {\n output({ success: false, skipped: [agentId], reason: 'self-protection' }, true);\n }\n return;\n }\n }\n\n if (options.delete) {\n // For --delete: skip kill if already in terminal state, just clean up\n if (!isTerminal) {\n info(`Killing agent ${agentId}`);\n await killAgent(agent);\n }\n // Kill the tmux pane explicitly (handles already-dead)\n await import('../core/tmux.js').then((tmux) => tmux.killPane(agent.tmuxTarget));\n\n await updateManifest(projectRoot, (m) => {\n const f = findAgent(m, agentId);\n if (f) {\n delete f.worktree.agents[agentId];\n }\n return m;\n });\n\n if (options.json) {\n output({ success: true, killed: [agentId], deleted: [agentId] }, true);\n } else {\n success(`Deleted agent ${agentId}`);\n }\n } else {\n if (isTerminal) {\n if (options.json) {\n output({ success: true, killed: [], message: `Agent ${agentId} already ${agent.status}` }, true);\n } else {\n info(`Agent ${agentId} already ${agent.status}, skipping kill`);\n }\n return;\n }\n\n info(`Killing agent ${agentId}`);\n await killAgent(agent);\n\n await updateManifest(projectRoot, (m) => {\n const f = findAgent(m, agentId);\n if (f) {\n f.agent.status = 'killed';\n f.agent.completedAt = new Date().toISOString();\n }\n return m;\n });\n\n if (options.json) {\n output({ success: true, killed: [agentId] }, true);\n } else {\n success(`Killed agent ${agentId}`);\n }\n }\n}\n\nasync function killWorktreeAgents(\n projectRoot: string,\n worktreeRef: string,\n options: KillOptions,\n selfPaneId: string | null,\n paneMap?: Map<string, PaneInfo>,\n): Promise<void> {\n const manifest = await readManifest(projectRoot);\n const wt = resolveWorktree(manifest, worktreeRef);\n\n if (!wt) throw new WorktreeNotFoundError(worktreeRef);\n\n let toKill = Object.values(wt.agents)\n .filter((a) => ['running', 'spawning', 'waiting'].includes(a.status));\n\n // Self-protection: filter out agents that would kill the current process\n const skippedIds: string[] = [];\n if (selfPaneId && paneMap) {\n const { safe, skipped } = excludeSelf(toKill, selfPaneId, paneMap);\n toKill = safe;\n for (const a of skipped) {\n skippedIds.push(a.id);\n warn(`Skipping agent ${a.id} — contains current ppg process`);\n }\n }\n\n const killedIds = toKill.map((a) => a.id);\n\n for (const a of toKill) info(`Killing agent ${a.id}`);\n await killAgents(toKill);\n\n await updateManifest(projectRoot, (m) => {\n const mWt = m.worktrees[wt.id];\n if (mWt) {\n for (const agent of Object.values(mWt.agents)) {\n if (killedIds.includes(agent.id)) {\n agent.status = 'killed';\n agent.completedAt = new Date().toISOString();\n }\n }\n }\n return m;\n });\n\n // Check for open PR before deleting worktree\n let skippedOpenPr = false;\n if (options.delete && !options.includeOpenPrs) {\n const prState = await checkPrState(wt.branch);\n if (prState === 'OPEN') {\n skippedOpenPr = true;\n warn(`Skipping deletion of worktree ${wt.id} (${wt.name}) — has open PR on branch ${wt.branch}. Use --include-open-prs to override.`);\n }\n }\n\n // --delete implies --remove (always clean up worktree)\n const shouldRemove = (options.remove || options.delete) && !skippedOpenPr;\n if (shouldRemove) {\n await removeWorktreeCleanup(projectRoot, wt.id, selfPaneId, paneMap);\n }\n\n // --delete also removes the worktree entry from manifest\n if (options.delete && !skippedOpenPr) {\n await updateManifest(projectRoot, (m) => {\n delete m.worktrees[wt.id];\n return m;\n });\n }\n\n if (options.json) {\n output({\n success: true,\n killed: killedIds,\n skipped: skippedIds.length > 0 ? skippedIds : undefined,\n removed: shouldRemove ? [wt.id] : [],\n deleted: (options.delete && !skippedOpenPr) ? [wt.id] : [],\n skippedOpenPrs: skippedOpenPr ? [wt.id] : undefined,\n }, true);\n } else {\n success(`Killed ${killedIds.length} agent(s) in worktree ${wt.id}`);\n if (skippedIds.length > 0) {\n warn(`Skipped ${skippedIds.length} agent(s) due to self-protection`);\n }\n if (options.delete && !skippedOpenPr) {\n success(`Deleted worktree ${wt.id}`);\n } else if (options.remove && !skippedOpenPr) {\n success(`Removed worktree ${wt.id}`);\n }\n }\n}\n\nasync function killAllAgents(\n projectRoot: string,\n options: KillOptions,\n selfPaneId: string | null,\n paneMap?: Map<string, PaneInfo>,\n): Promise<void> {\n const manifest = await readManifest(projectRoot);\n let toKill: AgentEntry[] = [];\n\n for (const wt of Object.values(manifest.worktrees)) {\n for (const agent of Object.values(wt.agents)) {\n if (['running', 'spawning', 'waiting'].includes(agent.status)) {\n toKill.push(agent);\n }\n }\n }\n\n // Self-protection: filter out agents that would kill the current process\n const skippedIds: string[] = [];\n if (selfPaneId && paneMap) {\n const { safe, skipped } = excludeSelf(toKill, selfPaneId, paneMap);\n toKill = safe;\n for (const a of skipped) {\n skippedIds.push(a.id);\n warn(`Skipping agent ${a.id} — contains current ppg process`);\n }\n }\n\n const killedIds = toKill.map((a) => a.id);\n for (const a of toKill) info(`Killing agent ${a.id}`);\n await killAgents(toKill);\n\n // Only track active worktrees for removal (not already merged/cleaned)\n const activeWorktreeIds = Object.values(manifest.worktrees)\n .filter((wt) => wt.status === 'active')\n .map((wt) => wt.id);\n\n await updateManifest(projectRoot, (m) => {\n for (const wt of Object.values(m.worktrees)) {\n for (const agent of Object.values(wt.agents)) {\n if (killedIds.includes(agent.id)) {\n agent.status = 'killed';\n agent.completedAt = new Date().toISOString();\n }\n }\n }\n return m;\n });\n\n // Filter out worktrees with open PRs\n let worktreesToRemove = activeWorktreeIds;\n const openPrWorktreeIds: string[] = [];\n if (options.delete && !options.includeOpenPrs) {\n worktreesToRemove = [];\n for (const wtId of activeWorktreeIds) {\n const wt = manifest.worktrees[wtId];\n if (wt) {\n const prState = await checkPrState(wt.branch);\n if (prState === 'OPEN') {\n openPrWorktreeIds.push(wtId);\n warn(`Skipping deletion of worktree ${wtId} (${wt.name}) — has open PR`);\n } else {\n worktreesToRemove.push(wtId);\n }\n }\n }\n }\n\n // --delete implies --remove\n const shouldRemove = options.remove || options.delete;\n if (shouldRemove) {\n for (const wtId of worktreesToRemove) {\n await removeWorktreeCleanup(projectRoot, wtId, selfPaneId, paneMap);\n }\n }\n\n // --delete also removes worktree entries from manifest\n if (options.delete) {\n await updateManifest(projectRoot, (m) => {\n for (const wtId of worktreesToRemove) {\n delete m.worktrees[wtId];\n }\n return m;\n });\n }\n\n if (options.json) {\n output({\n success: true,\n killed: killedIds,\n skipped: skippedIds.length > 0 ? skippedIds : undefined,\n removed: shouldRemove ? worktreesToRemove : [],\n deleted: options.delete ? worktreesToRemove : [],\n skippedOpenPrs: openPrWorktreeIds.length > 0 ? openPrWorktreeIds : undefined,\n }, true);\n } else {\n success(`Killed ${killedIds.length} agent(s) across ${activeWorktreeIds.length} worktree(s)`);\n if (skippedIds.length > 0) {\n warn(`Skipped ${skippedIds.length} agent(s) due to self-protection`);\n }\n if (openPrWorktreeIds.length > 0) {\n warn(`Skipped deletion of ${openPrWorktreeIds.length} worktree(s) with open PRs`);\n }\n if (options.delete) {\n success(`Deleted ${worktreesToRemove.length} worktree(s)`);\n } else if (options.remove) {\n success(`Removed ${worktreesToRemove.length} worktree(s)`);\n }\n }\n}\n\nasync function removeWorktreeCleanup(\n projectRoot: string,\n wtId: string,\n selfPaneId: string | null,\n paneMap?: Map<string, PaneInfo>,\n): Promise<void> {\n const manifest = await readManifest(projectRoot);\n const wt = resolveWorktree(manifest, wtId);\n if (!wt) return;\n await cleanupWorktree(projectRoot, wt, {\n selfPaneId,\n paneMap,\n });\n}\n","import { requireManifest, resolveWorktree, findAgent } from '../core/manifest.js';\nimport { getRepoRoot } from '../core/worktree.js';\nimport { getPaneInfo } from '../core/tmux.js';\nimport { resumeAgent } from '../core/agent.js';\nimport * as tmux from '../core/tmux.js';\nimport { openTerminalWindow } from '../core/terminal.js';\nimport { PpgError } from '../lib/errors.js';\nimport { info, success } from '../lib/output.js';\nimport type { AgentEntry } from '../types/manifest.js';\n\nexport async function attachCommand(target: string): Promise<void> {\n const projectRoot = await getRepoRoot();\n\n const manifest = await requireManifest(projectRoot);\n\n // Try to resolve target as worktree ID, worktree name, or agent ID\n let tmuxTarget: string | undefined;\n const sessionName = manifest.sessionName;\n let agent: AgentEntry | undefined;\n let worktreeId: string | undefined;\n\n // Check worktree ID\n const wt = resolveWorktree(manifest, target);\n\n if (wt) {\n if (!wt.tmuxWindow) {\n throw new PpgError('Worktree has no tmux window. Spawn agents first with: ppg spawn --worktree ' + wt.id + ' --prompt \"your task\"', 'NO_TMUX_WINDOW');\n }\n tmuxTarget = wt.tmuxWindow;\n } else {\n // Check agent ID\n const found = findAgent(manifest, target);\n if (found) {\n agent = found.agent;\n worktreeId = found.worktree.id;\n tmuxTarget = found.agent.tmuxTarget;\n }\n }\n\n if (!tmuxTarget) {\n throw new PpgError(`Could not resolve target: ${target}. Try a worktree ID, name, or agent ID.`, 'TARGET_NOT_FOUND');\n }\n\n // Check if the pane is dead and agent has a sessionId — auto-resume\n if (agent?.sessionId && worktreeId) {\n const paneInfo = await getPaneInfo(tmuxTarget);\n if (!paneInfo || paneInfo.isDead) {\n info(`Pane is dead. Resuming session ${agent.sessionId}...`);\n const resumeWt = manifest.worktrees[worktreeId];\n const cwd = resumeWt?.path ?? projectRoot;\n const windowName = resumeWt?.name ?? agent.name ?? target;\n\n tmuxTarget = await resumeAgent({\n agent,\n worktreeId,\n sessionName,\n cwd,\n windowName,\n projectRoot,\n });\n success(`Resumed agent ${agent.id} in ${tmuxTarget}`);\n }\n }\n\n const insideTmux = await tmux.isInsideTmux();\n\n if (insideTmux) {\n // Agent targets are now window targets (e.g. \"ppg:3\"), so use selectWindow for both\n await tmux.selectWindow(tmuxTarget);\n info(`Switched to ${tmuxTarget}`);\n } else {\n // Open a new Terminal.app window attached to the target\n const title = wt ? wt.name : target;\n info(`Opening Terminal window for ${title}`);\n await openTerminalWindow(sessionName, tmuxTarget, title);\n }\n}\n","import { requireManifest, findAgent } from '../core/manifest.js';\nimport { getRepoRoot } from '../core/worktree.js';\nimport * as tmux from '../core/tmux.js';\nimport { PpgError, AgentNotFoundError } from '../lib/errors.js';\nimport { output, outputError } from '../lib/output.js';\n\nexport interface LogsOptions {\n lines?: number;\n follow?: boolean;\n full?: boolean;\n json?: boolean;\n}\n\nexport async function logsCommand(agentId: string, options: LogsOptions): Promise<void> {\n const projectRoot = await getRepoRoot();\n\n const manifest = await requireManifest(projectRoot);\n\n const found = findAgent(manifest, agentId);\n if (!found) throw new AgentNotFoundError(agentId);\n\n const { agent } = found;\n const lines = options.full ? undefined : (options.lines ?? 100);\n\n if (options.follow) {\n // Poll mode\n let lastOutput = '';\n const interval = setInterval(async () => {\n try {\n const content = await tmux.capturePane(agent.tmuxTarget, lines);\n if (content !== lastOutput) {\n // Find new lines\n if (lastOutput) {\n const oldLines = lastOutput.split('\\n');\n const newLines = content.split('\\n');\n // Output only lines that are new\n const diff = newLines.slice(oldLines.length);\n if (diff.length > 0) {\n process.stdout.write(diff.join('\\n') + '\\n');\n }\n } else {\n process.stdout.write(content + '\\n');\n }\n lastOutput = content;\n }\n } catch {\n clearInterval(interval);\n outputError(new Error('Pane no longer available'), options.json ?? false);\n process.exit(1);\n }\n }, 1000);\n\n process.on('SIGINT', () => {\n clearInterval(interval);\n process.exit(0);\n });\n } else {\n // One-shot capture\n try {\n const content = await tmux.capturePane(agent.tmuxTarget, lines);\n if (options.json) {\n output({\n agentId: agent.id,\n status: agent.status,\n tmuxTarget: agent.tmuxTarget,\n output: content,\n }, true);\n } else {\n console.log(content);\n }\n } catch {\n throw new PpgError(`Could not capture pane for agent ${agentId}. Pane may no longer exist.`, 'PANE_NOT_FOUND');\n }\n }\n}\n","import fs from 'node:fs/promises';\nimport { requireManifest, resolveWorktree, updateManifest } from '../core/manifest.js';\nimport { refreshAllAgentStatuses } from '../core/agent.js';\nimport { getRepoRoot } from '../core/worktree.js';\nimport * as tmux from '../core/tmux.js';\nimport { WorktreeNotFoundError } from '../lib/errors.js';\nimport { output, success, warn } from '../lib/output.js';\nimport type { AgentEntry, WorktreeEntry } from '../types/manifest.js';\n\nexport interface AggregateOptions {\n all?: boolean;\n output?: string;\n json?: boolean;\n}\n\nexport async function aggregateCommand(\n worktreeId?: string,\n options?: AggregateOptions,\n): Promise<void> {\n const projectRoot = await getRepoRoot();\n\n await requireManifest(projectRoot);\n const manifest = await updateManifest(projectRoot, async (m) => {\n return refreshAllAgentStatuses(m, projectRoot);\n });\n\n let worktrees: WorktreeEntry[];\n\n if (options?.all) {\n worktrees = Object.values(manifest.worktrees);\n } else if (worktreeId) {\n const wt = resolveWorktree(manifest, worktreeId);\n if (!wt) throw new WorktreeNotFoundError(worktreeId);\n worktrees = [wt];\n } else {\n // Default: all worktrees with completed agents\n worktrees = Object.values(manifest.worktrees).filter((wt) =>\n Object.values(wt.agents).some((a) => a.status === 'completed'),\n );\n }\n\n const results: AggregatedResult[] = [];\n\n for (const wt of worktrees) {\n for (const agent of Object.values(wt.agents)) {\n if (agent.status !== 'completed' && agent.status !== 'failed') continue;\n\n const result = await collectAgentResult(agent, projectRoot);\n results.push({\n agentId: agent.id,\n worktreeId: wt.id,\n worktreeName: wt.name,\n branch: wt.branch,\n status: agent.status,\n content: result,\n });\n }\n }\n\n if (results.length === 0) {\n if (options?.json) {\n output({ results: [] }, true);\n } else {\n console.log('No completed agent results to aggregate.');\n }\n return;\n }\n\n if (options?.json) {\n output({ results }, true);\n return;\n }\n\n // Build combined document\n const combined = results.map((r) => {\n return [\n `# Agent: ${r.agentId}`,\n `**Worktree:** ${r.worktreeName} (${r.worktreeId})`,\n `**Branch:** ${r.branch}`,\n `**Status:** ${r.status}`,\n '',\n r.content,\n '',\n '---',\n '',\n ].join('\\n');\n }).join('\\n');\n\n if (options?.output) {\n await fs.writeFile(options.output, combined, 'utf-8');\n success(`Wrote ${results.length} result(s) to ${options.output}`);\n } else {\n console.log(combined);\n }\n}\n\ninterface AggregatedResult {\n agentId: string;\n worktreeId: string;\n worktreeName: string;\n branch: string;\n status: string;\n content: string;\n}\n\nasync function collectAgentResult(\n agent: AgentEntry,\n projectRoot: string,\n): Promise<string> {\n // Try reading result file first\n try {\n const content = await fs.readFile(agent.resultFile, 'utf-8');\n return content;\n } catch {\n // No result file\n }\n\n // Fallback: capture pane content\n try {\n const paneContent = await tmux.capturePane(agent.tmuxTarget, 500);\n return `*[No result file — pane capture fallback]*\\n\\n\\`\\`\\`\\n${paneContent}\\n\\`\\`\\``;\n } catch {\n return '*[No result file and pane not available]*';\n }\n}\n","import { execa } from 'execa';\nimport { requireManifest, updateManifest, resolveWorktree } from '../core/manifest.js';\nimport { refreshAllAgentStatuses } from '../core/agent.js';\nimport { getRepoRoot, getCurrentBranch } from '../core/worktree.js';\nimport { cleanupWorktree } from '../core/cleanup.js';\nimport { getCurrentPaneId } from '../core/self.js';\nimport { listSessionPanes, type PaneInfo } from '../core/tmux.js';\nimport { PpgError, WorktreeNotFoundError, MergeFailedError } from '../lib/errors.js';\nimport { output, success, info, warn } from '../lib/output.js';\nimport { execaEnv } from '../lib/env.js';\n\nexport interface MergeOptions {\n strategy?: 'squash' | 'no-ff';\n cleanup?: boolean;\n dryRun?: boolean;\n force?: boolean;\n json?: boolean;\n}\n\nexport async function mergeCommand(worktreeId: string, options: MergeOptions): Promise<void> {\n const projectRoot = await getRepoRoot();\n\n await requireManifest(projectRoot);\n const manifest = await updateManifest(projectRoot, async (m) => {\n return refreshAllAgentStatuses(m, projectRoot);\n });\n\n const wt = resolveWorktree(manifest, worktreeId);\n\n if (!wt) throw new WorktreeNotFoundError(worktreeId);\n\n // Check all agents completed\n const agents = Object.values(wt.agents);\n const incomplete = agents.filter((a) => !['completed', 'failed', 'killed'].includes(a.status));\n\n if (incomplete.length > 0 && !options.force) {\n const ids = incomplete.map((a) => a.id).join(', ');\n throw new PpgError(\n `${incomplete.length} agent(s) still running: ${ids}. Use --force to merge anyway.`,\n 'AGENTS_RUNNING',\n );\n }\n\n if (options.dryRun) {\n info('Dry run — no changes will be made');\n info(`Would merge branch ${wt.branch} into ${wt.baseBranch} using ${options.strategy ?? 'squash'} strategy`);\n if (options.cleanup !== false) {\n info(`Would remove worktree ${wt.id} and delete branch ${wt.branch}`);\n }\n return;\n }\n\n // Set worktree status to merging\n await updateManifest(projectRoot, (m) => {\n if (m.worktrees[wt.id]) {\n m.worktrees[wt.id].status = 'merging';\n }\n return m;\n });\n\n const strategy = options.strategy ?? 'squash';\n\n try {\n const currentBranch = await getCurrentBranch(projectRoot);\n if (currentBranch !== wt.baseBranch) {\n info(`Switching to base branch ${wt.baseBranch}`);\n await execa('git', ['checkout', wt.baseBranch], { ...execaEnv, cwd: projectRoot });\n }\n\n info(`Merging ${wt.branch} into ${wt.baseBranch} (${strategy})`);\n\n if (strategy === 'squash') {\n await execa('git', ['merge', '--squash', wt.branch], { ...execaEnv, cwd: projectRoot });\n await execa('git', ['commit', '-m', `ppg: merge ${wt.name} (${wt.branch})`], {\n ...execaEnv,\n cwd: projectRoot,\n });\n } else {\n await execa('git', ['merge', '--no-ff', wt.branch, '-m', `ppg: merge ${wt.name} (${wt.branch})`], {\n ...execaEnv,\n cwd: projectRoot,\n });\n }\n\n success(`Merged ${wt.branch} into ${wt.baseBranch}`);\n } catch (err) {\n await updateManifest(projectRoot, (m) => {\n if (m.worktrees[wt.id]) {\n m.worktrees[wt.id].status = 'failed';\n }\n return m;\n });\n throw new MergeFailedError(\n `Merge failed: ${err instanceof Error ? err.message : err}`,\n );\n }\n\n // Mark as merged\n await updateManifest(projectRoot, (m) => {\n if (m.worktrees[wt.id]) {\n m.worktrees[wt.id].status = 'merged';\n m.worktrees[wt.id].mergedAt = new Date().toISOString();\n }\n return m;\n });\n\n // Cleanup with self-protection\n let selfProtected = false;\n if (options.cleanup !== false) {\n info('Cleaning up...');\n\n const selfPaneId = getCurrentPaneId();\n let paneMap: Map<string, PaneInfo> | undefined;\n if (selfPaneId) {\n paneMap = await listSessionPanes(manifest.sessionName);\n }\n\n const cleanupResult = await cleanupWorktree(projectRoot, wt, { selfPaneId, paneMap });\n selfProtected = cleanupResult.selfProtected;\n\n if (selfProtected) {\n warn(`Some tmux targets skipped during cleanup — contains current ppg process`);\n }\n success(`Cleaned up worktree ${wt.id}`);\n }\n\n if (options.json) {\n output({\n success: true,\n worktreeId: wt.id,\n branch: wt.branch,\n baseBranch: wt.baseBranch,\n strategy,\n cleaned: options.cleanup !== false,\n selfProtected: selfProtected || undefined,\n }, true);\n }\n}\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport YAML from 'yaml';\nimport { swarmsDir, globalSwarmsDir } from '../lib/paths.js';\nimport { PpgError } from '../lib/errors.js';\n\nexport interface SwarmAgentEntry {\n prompt: string;\n agent?: string;\n vars?: Record<string, string>;\n}\n\nexport interface SwarmTemplate {\n name: string;\n description: string;\n strategy: 'shared' | 'isolated';\n agents: SwarmAgentEntry[];\n}\n\nconst SAFE_NAME = /^[\\w-]+$/;\n\nexport interface SwarmEntry {\n name: string;\n source: 'local' | 'global';\n}\n\nasync function readSwarmNames(dir: string): Promise<string[]> {\n try {\n const files = await fs.readdir(dir);\n return files\n .filter((f) => f.endsWith('.yaml') || f.endsWith('.yml'))\n .map((f) => f.replace(/\\.ya?ml$/, ''))\n .sort();\n } catch {\n return [];\n }\n}\n\nexport async function listSwarms(projectRoot: string): Promise<string[]> {\n const entries = await listSwarmsWithSource(projectRoot);\n return entries.map((e) => e.name);\n}\n\nexport async function listSwarmsWithSource(projectRoot: string): Promise<SwarmEntry[]> {\n const localNames = await readSwarmNames(swarmsDir(projectRoot));\n const globalNames = await readSwarmNames(globalSwarmsDir());\n\n const seen = new Set<string>();\n const result: SwarmEntry[] = [];\n\n for (const name of localNames) {\n seen.add(name);\n result.push({ name, source: 'local' });\n }\n\n for (const name of globalNames) {\n if (!seen.has(name)) {\n result.push({ name, source: 'global' });\n }\n }\n\n return result;\n}\n\nasync function trySwarmFile(dir: string, name: string): Promise<string | null> {\n const yamlPath = path.join(dir, `${name}.yaml`);\n try {\n await fs.access(yamlPath);\n return yamlPath;\n } catch {\n const ymlPath = path.join(dir, `${name}.yml`);\n try {\n await fs.access(ymlPath);\n return ymlPath;\n } catch {\n return null;\n }\n }\n}\n\nasync function resolveSwarmFile(projectRoot: string, name: string): Promise<string | null> {\n // Project-local first\n const local = await trySwarmFile(swarmsDir(projectRoot), name);\n if (local) return local;\n\n // Global fallback\n return trySwarmFile(globalSwarmsDir(), name);\n}\n\nexport async function loadSwarm(projectRoot: string, name: string): Promise<SwarmTemplate> {\n if (!SAFE_NAME.test(name)) {\n throw new PpgError(\n `Invalid swarm template name: \"${name}\" — must be alphanumeric, hyphens, or underscores`,\n 'INVALID_ARGS',\n );\n }\n\n // Try project-local first, then global\n const filePath = await resolveSwarmFile(projectRoot, name);\n\n if (!filePath) {\n throw new PpgError(`Swarm template not found: ${name}`, 'INVALID_ARGS');\n }\n\n const raw = await fs.readFile(filePath, 'utf-8');\n const parsed = YAML.parse(raw) as SwarmTemplate;\n\n if (!parsed || typeof parsed !== 'object') {\n throw new PpgError(`Invalid swarm template: ${name} (empty or malformed YAML)`, 'INVALID_ARGS');\n }\n\n if (!parsed.name || !parsed.agents || !Array.isArray(parsed.agents)) {\n throw new PpgError(`Invalid swarm template: ${name} (missing name or agents)`, 'INVALID_ARGS');\n }\n\n if (!SAFE_NAME.test(parsed.name)) {\n throw new PpgError(\n `Invalid swarm name: \"${parsed.name}\" — must be alphanumeric, hyphens, or underscores`,\n 'INVALID_ARGS',\n );\n }\n\n if (parsed.strategy && parsed.strategy !== 'shared' && parsed.strategy !== 'isolated') {\n throw new PpgError(\n `Invalid swarm strategy: ${parsed.strategy}. Must be 'shared' or 'isolated'`,\n 'INVALID_ARGS',\n );\n }\n\n // Validate each agent has a valid prompt name\n for (let i = 0; i < parsed.agents.length; i++) {\n const agent = parsed.agents[i];\n if (!agent.prompt || typeof agent.prompt !== 'string') {\n throw new PpgError(\n `Invalid swarm template: ${name} — agent[${i}] missing prompt field`,\n 'INVALID_ARGS',\n );\n }\n if (!SAFE_NAME.test(agent.prompt)) {\n throw new PpgError(\n `Invalid prompt name: \"${agent.prompt}\" — must be alphanumeric, hyphens, or underscores`,\n 'INVALID_ARGS',\n );\n }\n }\n\n return {\n ...parsed,\n strategy: parsed.strategy ?? 'shared',\n description: parsed.description ?? '',\n };\n}\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport { loadConfig, resolveAgentConfig } from '../core/config.js';\nimport { readManifest, updateManifest, resolveWorktree } from '../core/manifest.js';\nimport { getRepoRoot, getCurrentBranch, createWorktree } from '../core/worktree.js';\nimport { setupWorktreeEnv } from '../core/env.js';\nimport { renderTemplate, type TemplateContext } from '../core/template.js';\nimport { loadSwarm, type SwarmAgentEntry, type SwarmTemplate } from '../core/swarm.js';\nimport { spawnAgent } from '../core/agent.js';\nimport * as tmux from '../core/tmux.js';\nimport { openTerminalWindow } from '../core/terminal.js';\nimport { worktreeId as genWorktreeId, agentId as genAgentId, sessionId as genSessionId } from '../lib/id.js';\nimport { resultFile, promptsDir, globalPromptsDir, manifestPath } from '../lib/paths.js';\nimport { PpgError, NotInitializedError, WorktreeNotFoundError } from '../lib/errors.js';\nimport { output, success, info } from '../lib/output.js';\nimport { normalizeName } from '../lib/name.js';\nimport { parseVars } from '../lib/vars.js';\nimport type { Config } from '../types/config.js';\nimport type { WorktreeEntry, AgentEntry } from '../types/manifest.js';\n\nexport interface SwarmOptions {\n worktree?: string;\n var?: string[];\n name?: string;\n base?: string;\n open?: boolean;\n json?: boolean;\n}\n\nexport async function swarmCommand(templateName: string, options: SwarmOptions): Promise<void> {\n const projectRoot = await getRepoRoot();\n const config = await loadConfig(projectRoot);\n\n // Verify initialized\n try {\n await fs.access(manifestPath(projectRoot));\n } catch {\n throw new NotInitializedError(projectRoot);\n }\n\n // Load swarm template\n const swarm = await loadSwarm(projectRoot, templateName);\n\n // Parse user vars\n const userVars = parseVars(options.var ?? []);\n\n if (options.worktree) {\n await swarmIntoExistingWorktree(projectRoot, config, swarm, options, userVars);\n } else if (swarm.strategy === 'isolated') {\n await swarmIsolated(projectRoot, config, swarm, options, userVars);\n } else {\n await swarmShared(projectRoot, config, swarm, options, userVars);\n }\n}\n\nasync function loadPromptFile(projectRoot: string, promptName: string): Promise<string> {\n // Try project-local first\n const localPath = path.join(promptsDir(projectRoot), `${promptName}.md`);\n try {\n return await fs.readFile(localPath, 'utf-8');\n } catch {\n // Fall back to global\n const globalPath = path.join(globalPromptsDir(), `${promptName}.md`);\n try {\n return await fs.readFile(globalPath, 'utf-8');\n } catch {\n throw new PpgError(\n `Prompt file not found: ${promptName}.md (checked .ppg/prompts/ and ~/.ppg/prompts/)`,\n 'INVALID_ARGS',\n );\n }\n }\n}\n\ninterface SpawnSwarmAgentOptions {\n projectRoot: string;\n config: Config;\n swarmAgent: SwarmAgentEntry;\n wtPath: string;\n branchName: string;\n tmuxTarget: string;\n taskName: string;\n userVars: Record<string, string>;\n}\n\nasync function spawnSwarmAgent(opts: SpawnSwarmAgentOptions): Promise<AgentEntry> {\n const { projectRoot, config, swarmAgent, wtPath, branchName, tmuxTarget, taskName, userVars } = opts;\n const agentConfig = resolveAgentConfig(config, swarmAgent.agent);\n const aId = genAgentId();\n\n const promptContent = await loadPromptFile(projectRoot, swarmAgent.prompt);\n const ctx: TemplateContext = {\n WORKTREE_PATH: wtPath,\n BRANCH: branchName,\n AGENT_ID: aId,\n RESULT_FILE: resultFile(projectRoot, aId),\n PROJECT_ROOT: projectRoot,\n TASK_NAME: taskName,\n ...(swarmAgent.vars ?? {}),\n ...userVars,\n };\n const renderedPrompt = renderTemplate(promptContent, ctx);\n\n return spawnAgent({\n agentId: aId,\n agentConfig,\n prompt: renderedPrompt,\n worktreePath: wtPath,\n tmuxTarget,\n projectRoot,\n branch: branchName,\n sessionId: genSessionId(),\n });\n}\n\nasync function swarmShared(\n projectRoot: string,\n config: Config,\n swarm: SwarmTemplate,\n options: SwarmOptions,\n userVars: Record<string, string>,\n): Promise<void> {\n const baseBranch = options.base ?? await getCurrentBranch(projectRoot);\n const wtId = genWorktreeId();\n const name = options.name ? normalizeName(options.name, swarm.name) : swarm.name;\n const branchName = `ppg/${name}`;\n\n info(`Creating worktree ${wtId} on branch ${branchName}`);\n const wtPath = await createWorktree(projectRoot, wtId, {\n branch: branchName,\n base: baseBranch,\n });\n\n await setupWorktreeEnv(projectRoot, wtPath, config);\n\n const manifest = await readManifest(projectRoot);\n const sessionName = manifest.sessionName;\n await tmux.ensureSession(sessionName);\n const windowTarget = await tmux.createWindow(sessionName, name, wtPath);\n\n // Register worktree in manifest before spawning agents so partial failures are tracked\n await updateManifest(projectRoot, (m) => {\n m.worktrees[wtId] = {\n id: wtId,\n name,\n path: wtPath,\n branch: branchName,\n baseBranch,\n status: 'active',\n tmuxWindow: windowTarget,\n agents: {},\n createdAt: new Date().toISOString(),\n };\n return m;\n });\n\n const agents: AgentEntry[] = [];\n for (let i = 0; i < swarm.agents.length; i++) {\n const target = i === 0\n ? windowTarget\n : await tmux.createWindow(sessionName, `${name}-${i}`, wtPath);\n\n const agentEntry = await spawnSwarmAgent({\n projectRoot, config, swarmAgent: swarm.agents[i],\n wtPath, branchName, tmuxTarget: target, taskName: name, userVars,\n });\n agents.push(agentEntry);\n\n await updateManifest(projectRoot, (m) => {\n m.worktrees[wtId].agents[agentEntry.id] = agentEntry;\n return m;\n });\n }\n\n if (options.open === true) {\n openTerminalWindow(sessionName, windowTarget, name).catch(() => {});\n }\n\n outputResult(options.json, swarm, wtId, name, branchName, wtPath, windowTarget, agents);\n}\n\nasync function swarmIsolated(\n projectRoot: string,\n config: Config,\n swarm: SwarmTemplate,\n options: SwarmOptions,\n userVars: Record<string, string>,\n): Promise<void> {\n const baseBranch = options.base ?? await getCurrentBranch(projectRoot);\n const baseName = options.name ? normalizeName(options.name, swarm.name) : swarm.name;\n const manifest = await readManifest(projectRoot);\n const sessionName = manifest.sessionName;\n await tmux.ensureSession(sessionName);\n\n const worktrees: Array<{ id: string; name: string; branch: string; path: string; tmuxWindow: string }> = [];\n const allAgents: AgentEntry[] = [];\n\n const usedNames = new Set<string>();\n for (const swarmAgent of swarm.agents) {\n const wtId = genWorktreeId();\n let wtName = `${baseName}-${swarmAgent.prompt}`;\n if (usedNames.has(wtName)) {\n let suffix = 2;\n while (usedNames.has(`${wtName}-${suffix}`)) suffix++;\n wtName = `${wtName}-${suffix}`;\n }\n usedNames.add(wtName);\n const branchName = `ppg/${wtName}`;\n\n info(`Creating worktree ${wtId} on branch ${branchName}`);\n const wtPath = await createWorktree(projectRoot, wtId, {\n branch: branchName,\n base: baseBranch,\n });\n\n await setupWorktreeEnv(projectRoot, wtPath, config);\n const windowTarget = await tmux.createWindow(sessionName, wtName, wtPath);\n\n const agentEntry = await spawnSwarmAgent({\n projectRoot, config, swarmAgent,\n wtPath, branchName, tmuxTarget: windowTarget, taskName: wtName, userVars,\n });\n\n const worktreeEntry: WorktreeEntry = {\n id: wtId,\n name: wtName,\n path: wtPath,\n branch: branchName,\n baseBranch,\n status: 'active',\n tmuxWindow: windowTarget,\n agents: { [agentEntry.id]: agentEntry },\n createdAt: new Date().toISOString(),\n };\n\n await updateManifest(projectRoot, (m) => {\n m.worktrees[wtId] = worktreeEntry;\n return m;\n });\n\n if (options.open === true) {\n openTerminalWindow(sessionName, windowTarget, wtName).catch(() => {});\n }\n\n worktrees.push({ id: wtId, name: wtName, branch: branchName, path: wtPath, tmuxWindow: windowTarget });\n allAgents.push(agentEntry);\n }\n\n if (options.json) {\n output({\n success: true,\n swarm: swarm.name,\n strategy: 'isolated',\n worktrees: worktrees.map((wt, i) => ({\n ...wt,\n agents: [{ id: allAgents[i].id, tmuxTarget: allAgents[i].tmuxTarget, sessionId: allAgents[i].sessionId }],\n })),\n }, true);\n } else {\n success(`Swarm \"${swarm.name}\" spawned ${swarm.agents.length} agent(s) in isolated worktrees`);\n for (let i = 0; i < worktrees.length; i++) {\n info(` ${worktrees[i].name} (${worktrees[i].id}) → agent ${allAgents[i].id}`);\n }\n }\n}\n\nasync function swarmIntoExistingWorktree(\n projectRoot: string,\n config: Config,\n swarm: SwarmTemplate,\n options: SwarmOptions,\n userVars: Record<string, string>,\n): Promise<void> {\n const manifest = await readManifest(projectRoot);\n const wt = resolveWorktree(manifest, options.worktree!);\n\n if (!wt) throw new WorktreeNotFoundError(options.worktree!);\n\n const sessionName = manifest.sessionName;\n\n // Lazily create tmux window if worktree has none\n let windowTarget = wt.tmuxWindow;\n if (!windowTarget) {\n await tmux.ensureSession(sessionName);\n windowTarget = await tmux.createWindow(sessionName, wt.name, wt.path);\n }\n\n // Update tmux window before spawning so partial failures are tracked\n if (!wt.tmuxWindow) {\n await updateManifest(projectRoot, (m) => {\n m.worktrees[wt.id].tmuxWindow = windowTarget;\n return m;\n });\n }\n\n const agents: AgentEntry[] = [];\n for (let i = 0; i < swarm.agents.length; i++) {\n const target = i === 0\n ? windowTarget\n : await tmux.createWindow(sessionName, `${wt.name}-${swarm.name}-${i}`, wt.path);\n\n const agentEntry = await spawnSwarmAgent({\n projectRoot, config, swarmAgent: swarm.agents[i],\n wtPath: wt.path, branchName: wt.branch, tmuxTarget: target, taskName: wt.name, userVars,\n });\n agents.push(agentEntry);\n\n await updateManifest(projectRoot, (m) => {\n m.worktrees[wt.id].agents[agentEntry.id] = agentEntry;\n return m;\n });\n }\n\n if (options.open === true) {\n openTerminalWindow(sessionName, windowTarget, wt.name).catch(() => {});\n }\n\n outputResult(options.json, swarm, wt.id, wt.name, wt.branch, wt.path, windowTarget, agents);\n}\n\nfunction outputResult(\n json: boolean | undefined,\n swarm: SwarmTemplate,\n wtId: string,\n name: string,\n branch: string,\n wtPath: string,\n tmuxWindow: string,\n agents: AgentEntry[],\n): void {\n if (json) {\n output({\n success: true,\n swarm: swarm.name,\n strategy: swarm.strategy,\n worktree: { id: wtId, name, branch, path: wtPath, tmuxWindow },\n agents: agents.map((a) => ({ id: a.id, tmuxTarget: a.tmuxTarget, sessionId: a.sessionId })),\n }, true);\n } else {\n success(`Swarm \"${swarm.name}\" spawned ${agents.length} agent(s) in worktree ${wtId}`);\n for (const a of agents) {\n info(` Agent ${a.id} → ${a.tmuxTarget}`);\n }\n info(`Attach: ppg attach ${wtId}`);\n }\n}\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport { getRepoRoot } from '../core/worktree.js';\nimport { promptsDir, globalPromptsDir } from '../lib/paths.js';\nimport { PpgError } from '../lib/errors.js';\nimport { spawnCommand, type SpawnOptions } from './spawn.js';\n\nexport interface PromptCommandOptions {\n name?: string;\n agent?: string;\n var?: string[];\n base?: string;\n count?: number;\n split?: boolean;\n open?: boolean;\n json?: boolean;\n}\n\nasync function resolvePromptFile(projectRoot: string, promptName: string): Promise<string> {\n // Try project-local first\n const localPath = path.join(promptsDir(projectRoot), `${promptName}.md`);\n try {\n await fs.access(localPath);\n return localPath;\n } catch {\n // Fall back to global\n const globalPath = path.join(globalPromptsDir(), `${promptName}.md`);\n try {\n await fs.access(globalPath);\n return globalPath;\n } catch {\n throw new PpgError(\n `Prompt not found: ${promptName} (checked .ppg/prompts/ and ~/.ppg/prompts/)`,\n 'INVALID_ARGS',\n );\n }\n }\n}\n\nexport async function promptCommand(promptName: string, options: PromptCommandOptions): Promise<void> {\n const projectRoot = await getRepoRoot();\n const promptFilePath = await resolvePromptFile(projectRoot, promptName);\n\n const spawnOpts: SpawnOptions = {\n name: options.name ?? promptName,\n agent: options.agent,\n promptFile: promptFilePath,\n var: options.var,\n base: options.base,\n count: options.count,\n split: options.split,\n open: options.open,\n json: options.json,\n };\n\n await spawnCommand(spawnOpts);\n}\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport { getRepoRoot } from '../core/worktree.js';\nimport { listTemplatesWithSource } from '../core/template.js';\nimport { listSwarmsWithSource, loadSwarm } from '../core/swarm.js';\nimport { templatesDir, promptsDir, globalTemplatesDir, globalPromptsDir } from '../lib/paths.js';\nimport { PpgError } from '../lib/errors.js';\nimport { output, formatTable, type Column } from '../lib/output.js';\n\nexport interface ListOptions {\n json?: boolean;\n}\n\nexport async function listCommand(type: string, options: ListOptions): Promise<void> {\n if (type === 'templates') {\n await listTemplatesCommand(options);\n } else if (type === 'swarms') {\n await listSwarmsCommand(options);\n } else if (type === 'prompts') {\n await listPromptsCommand(options);\n } else {\n throw new PpgError(`Unknown list type: ${type}. Available: templates, swarms, prompts`, 'INVALID_ARGS');\n }\n}\n\nasync function listTemplatesCommand(options: ListOptions): Promise<void> {\n const projectRoot = await getRepoRoot();\n\n const entries = await listTemplatesWithSource(projectRoot);\n\n if (entries.length === 0) {\n console.log('No templates found in .ppg/templates/ or ~/.ppg/templates/');\n return;\n }\n\n const templates = await Promise.all(\n entries.map(async ({ name, source }) => {\n const dir = source === 'local' ? templatesDir(projectRoot) : globalTemplatesDir();\n const filePath = path.join(dir, `${name}.md`);\n const content = await fs.readFile(filePath, 'utf-8');\n const firstLine = content.split('\\n').find((l) => l.trim().length > 0) ?? '';\n const description = firstLine.replace(/^#+\\s*/, '').trim();\n\n const vars = [...content.matchAll(/\\{\\{(\\w+)\\}\\}/g)].map((m) => m[1]);\n const uniqueVars = [...new Set(vars)];\n\n return { name, description, variables: uniqueVars, source };\n }),\n );\n\n if (options.json) {\n output({ templates }, true);\n return;\n }\n\n const columns: Column[] = [\n { header: 'Name', key: 'name', width: 20 },\n { header: 'Description', key: 'description', width: 36 },\n {\n header: 'Variables',\n key: 'variables',\n width: 24,\n format: (v) => (v as string[]).join(', '),\n },\n { header: 'Source', key: 'source', width: 8 },\n ];\n\n console.log(formatTable(templates, columns));\n}\n\nasync function listSwarmsCommand(options: ListOptions): Promise<void> {\n const projectRoot = await getRepoRoot();\n\n const entries = await listSwarmsWithSource(projectRoot);\n\n if (entries.length === 0) {\n if (options.json) {\n output({ swarms: [] }, true);\n } else {\n console.log('No swarm templates found in .ppg/swarms/ or ~/.ppg/swarms/');\n }\n return;\n }\n\n const swarms = await Promise.all(\n entries.map(async ({ name, source }) => {\n const swarm = await loadSwarm(projectRoot, name);\n return {\n name,\n description: swarm.description,\n strategy: swarm.strategy,\n agents: swarm.agents.length,\n source,\n };\n }),\n );\n\n if (options.json) {\n output({ swarms }, true);\n return;\n }\n\n const columns: Column[] = [\n { header: 'Name', key: 'name', width: 20 },\n { header: 'Description', key: 'description', width: 34 },\n { header: 'Strategy', key: 'strategy', width: 10 },\n { header: 'Agents', key: 'agents', width: 8 },\n { header: 'Source', key: 'source', width: 8 },\n ];\n\n console.log(formatTable(swarms, columns));\n}\n\ninterface PromptEntry {\n name: string;\n source: 'local' | 'global';\n}\n\nasync function listPromptEntries(projectRoot: string): Promise<PromptEntry[]> {\n const localDir = promptsDir(projectRoot);\n const globalDir = globalPromptsDir();\n\n let localFiles: string[] = [];\n try {\n localFiles = (await fs.readdir(localDir)).filter((f) => f.endsWith('.md')).sort();\n } catch {\n // directory doesn't exist\n }\n\n let globalFiles: string[] = [];\n try {\n globalFiles = (await fs.readdir(globalDir)).filter((f) => f.endsWith('.md')).sort();\n } catch {\n // directory doesn't exist\n }\n\n const seen = new Set<string>();\n const result: PromptEntry[] = [];\n\n for (const file of localFiles) {\n const name = file.replace(/\\.md$/, '');\n seen.add(name);\n result.push({ name, source: 'local' });\n }\n\n for (const file of globalFiles) {\n const name = file.replace(/\\.md$/, '');\n if (!seen.has(name)) {\n result.push({ name, source: 'global' });\n }\n }\n\n return result;\n}\n\nasync function listPromptsCommand(options: ListOptions): Promise<void> {\n const projectRoot = await getRepoRoot();\n\n const entries = await listPromptEntries(projectRoot);\n\n if (entries.length === 0) {\n if (options.json) {\n output({ prompts: [] }, true);\n } else {\n console.log('No prompts found in .ppg/prompts/ or ~/.ppg/prompts/');\n }\n return;\n }\n\n const prompts = await Promise.all(\n entries.map(async ({ name, source }) => {\n const dir = source === 'local' ? promptsDir(projectRoot) : globalPromptsDir();\n const filePath = path.join(dir, `${name}.md`);\n const content = await fs.readFile(filePath, 'utf-8');\n const firstLine = content.split('\\n').find((l) => l.trim().length > 0) ?? '';\n const description = firstLine.replace(/^#+\\s*/, '').trim();\n\n const vars = [...content.matchAll(/\\{\\{(\\w+)\\}\\}/g)].map((m) => m[1]);\n const uniqueVars = [...new Set(vars)];\n\n return { name, description, variables: uniqueVars, source };\n }),\n );\n\n if (options.json) {\n output({ prompts }, true);\n return;\n }\n\n const columns: Column[] = [\n { header: 'Name', key: 'name', width: 20 },\n { header: 'Description', key: 'description', width: 36 },\n {\n header: 'Variables',\n key: 'variables',\n width: 24,\n format: (v) => (v as string[]).join(', '),\n },\n { header: 'Source', key: 'source', width: 8 },\n ];\n\n console.log(formatTable(prompts, columns));\n}\n","import fs from 'node:fs/promises';\nimport { requireManifest, updateManifest, findAgent } from '../core/manifest.js';\nimport { loadConfig, resolveAgentConfig } from '../core/config.js';\nimport { spawnAgent, killAgent } from '../core/agent.js';\nimport { getRepoRoot } from '../core/worktree.js';\nimport * as tmux from '../core/tmux.js';\nimport { openTerminalWindow } from '../core/terminal.js';\nimport { agentId as genAgentId, sessionId as genSessionId } from '../lib/id.js';\nimport { agentPromptFile, resultFile } from '../lib/paths.js';\nimport { PpgError, AgentNotFoundError } from '../lib/errors.js';\nimport { output, success, info } from '../lib/output.js';\nimport { renderTemplate, type TemplateContext } from '../core/template.js';\n\nexport interface RestartOptions {\n prompt?: string;\n agent?: string;\n open?: boolean;\n json?: boolean;\n}\n\nexport async function restartCommand(agentRef: string, options: RestartOptions): Promise<void> {\n const projectRoot = await getRepoRoot();\n const config = await loadConfig(projectRoot);\n\n const manifest = await requireManifest(projectRoot);\n\n const found = findAgent(manifest, agentRef);\n if (!found) throw new AgentNotFoundError(agentRef);\n\n const { worktree: wt, agent: oldAgent } = found;\n\n // Kill old agent if still running\n if (['running', 'spawning', 'waiting'].includes(oldAgent.status)) {\n info(`Killing existing agent ${oldAgent.id}`);\n await killAgent(oldAgent);\n }\n\n // Read original prompt from prompt file, or use override\n let promptText: string;\n if (options.prompt) {\n promptText = options.prompt;\n } else {\n const pFile = agentPromptFile(projectRoot, oldAgent.id);\n try {\n promptText = await fs.readFile(pFile, 'utf-8');\n } catch {\n throw new PpgError(\n `Could not read original prompt for agent ${oldAgent.id}. Use --prompt to provide one.`,\n 'PROMPT_NOT_FOUND',\n );\n }\n }\n\n // Resolve agent config\n const agentConfig = resolveAgentConfig(config, options.agent ?? oldAgent.agentType);\n\n // Ensure tmux session\n await tmux.ensureSession(manifest.sessionName);\n\n // Create new tmux window in same worktree\n const newAgentId = genAgentId();\n const windowTarget = await tmux.createWindow(manifest.sessionName, `${wt.name}-restart`, wt.path);\n\n // Render template vars\n const ctx: TemplateContext = {\n WORKTREE_PATH: wt.path,\n BRANCH: wt.branch,\n AGENT_ID: newAgentId,\n RESULT_FILE: resultFile(projectRoot, newAgentId),\n PROJECT_ROOT: projectRoot,\n TASK_NAME: wt.name,\n PROMPT: promptText,\n };\n const renderedPrompt = renderTemplate(promptText, ctx);\n\n const newSessionId = genSessionId();\n const agentEntry = await spawnAgent({\n agentId: newAgentId,\n agentConfig,\n prompt: renderedPrompt,\n worktreePath: wt.path,\n tmuxTarget: windowTarget,\n projectRoot,\n branch: wt.branch,\n sessionId: newSessionId,\n skipResultInstructions: !options.prompt,\n });\n\n // Update manifest: mark old agent as killed, add new agent\n await updateManifest(projectRoot, (m) => {\n const mWt = m.worktrees[wt.id];\n if (mWt) {\n const mOldAgent = mWt.agents[oldAgent.id];\n if (mOldAgent && !['completed', 'failed', 'killed', 'lost'].includes(mOldAgent.status)) {\n mOldAgent.status = 'killed';\n mOldAgent.completedAt = new Date().toISOString();\n }\n mWt.agents[newAgentId] = agentEntry;\n }\n return m;\n });\n\n // Only open Terminal window when explicitly requested via --open (fire-and-forget)\n if (options.open === true) {\n openTerminalWindow(manifest.sessionName, windowTarget, `${wt.name}-restart`).catch(() => {});\n }\n\n if (options.json) {\n output({\n success: true,\n oldAgentId: oldAgent.id,\n newAgent: {\n id: newAgentId,\n tmuxTarget: windowTarget,\n sessionId: newSessionId,\n worktreeId: wt.id,\n worktreeName: wt.name,\n branch: wt.branch,\n path: wt.path,\n },\n }, true);\n } else {\n success(`Restarted agent ${oldAgent.id} → ${newAgentId} in worktree ${wt.name}`);\n info(` New agent ${newAgentId} → ${windowTarget}`);\n }\n}\n","import { execa } from 'execa';\nimport { requireManifest, resolveWorktree } from '../core/manifest.js';\nimport { getRepoRoot } from '../core/worktree.js';\nimport { WorktreeNotFoundError } from '../lib/errors.js';\nimport { output } from '../lib/output.js';\nimport { execaEnv } from '../lib/env.js';\n\nexport interface DiffOptions {\n stat?: boolean;\n nameOnly?: boolean;\n json?: boolean;\n}\n\nexport async function diffCommand(worktreeRef: string, options: DiffOptions): Promise<void> {\n const projectRoot = await getRepoRoot();\n\n const manifest = await requireManifest(projectRoot);\n\n const wt = resolveWorktree(manifest, worktreeRef);\n\n if (!wt) throw new WorktreeNotFoundError(worktreeRef);\n\n const diffRange = `${wt.baseBranch}...${wt.branch}`;\n\n if (options.json) {\n // Machine-readable: numstat for file-level changes\n const result = await execa('git', ['diff', '--numstat', diffRange], { ...execaEnv, cwd: projectRoot });\n const files = result.stdout.trim().split('\\n').filter(Boolean).map((line) => {\n const [added, removed, file] = line.split('\\t');\n return {\n file,\n added: added === '-' ? 0 : parseInt(added, 10),\n removed: removed === '-' ? 0 : parseInt(removed, 10),\n };\n });\n output({\n worktreeId: wt.id,\n branch: wt.branch,\n baseBranch: wt.baseBranch,\n files,\n }, true);\n } else if (options.stat) {\n const result = await execa('git', ['diff', '--stat', diffRange], { ...execaEnv, cwd: projectRoot });\n console.log(result.stdout);\n } else if (options.nameOnly) {\n const result = await execa('git', ['diff', '--name-only', diffRange], { ...execaEnv, cwd: projectRoot });\n console.log(result.stdout);\n } else {\n const result = await execa('git', ['diff', diffRange], { ...execaEnv, cwd: projectRoot });\n console.log(result.stdout);\n }\n}\n","import fs from 'node:fs/promises';\nimport { execa } from 'execa';\nimport { updateManifest, resolveWorktree } from '../core/manifest.js';\nimport { refreshAllAgentStatuses } from '../core/agent.js';\nimport { getRepoRoot } from '../core/worktree.js';\nimport { PpgError, NotInitializedError, WorktreeNotFoundError, GhNotFoundError } from '../lib/errors.js';\nimport { output, success, info } from '../lib/output.js';\nimport { execaEnv } from '../lib/env.js';\n\n// GitHub PR body limit is 65536 chars; leave room for truncation notice\nconst MAX_BODY_LENGTH = 60_000;\n\nexport interface PrOptions {\n title?: string;\n body?: string;\n draft?: boolean;\n json?: boolean;\n}\n\nexport async function prCommand(worktreeRef: string, options: PrOptions): Promise<void> {\n const projectRoot = await getRepoRoot();\n\n let manifest;\n try {\n manifest = await updateManifest(projectRoot, async (m) => {\n return refreshAllAgentStatuses(m, projectRoot);\n });\n } catch {\n throw new NotInitializedError(projectRoot);\n }\n\n const wt = resolveWorktree(manifest, worktreeRef);\n if (!wt) throw new WorktreeNotFoundError(worktreeRef);\n\n // Verify gh is available\n try {\n await execa('gh', ['--version'], execaEnv);\n } catch {\n throw new GhNotFoundError();\n }\n\n // Push the worktree branch\n info(`Pushing branch ${wt.branch} to origin`);\n try {\n await execa('git', ['push', '-u', 'origin', wt.branch], { ...execaEnv, cwd: projectRoot });\n } catch (err) {\n throw new PpgError(\n `Failed to push branch ${wt.branch}: ${err instanceof Error ? err.message : err}`,\n 'INVALID_ARGS',\n );\n }\n\n // Build PR title and body\n const title = options.title ?? wt.name;\n const body = options.body ?? await buildBodyFromResults(Object.values(wt.agents));\n\n // Build gh pr create args\n const ghArgs = [\n 'pr', 'create',\n '--head', wt.branch,\n '--base', wt.baseBranch,\n '--title', title,\n '--body', body,\n ];\n if (options.draft) {\n ghArgs.push('--draft');\n }\n\n info(`Creating PR: ${title}`);\n let prUrl: string;\n try {\n const result = await execa('gh', ghArgs, { ...execaEnv, cwd: projectRoot });\n prUrl = result.stdout.trim();\n } catch (err) {\n throw new PpgError(\n `Failed to create PR: ${err instanceof Error ? err.message : err}`,\n 'INVALID_ARGS',\n );\n }\n\n // Store PR URL in manifest\n await updateManifest(projectRoot, (m) => {\n if (m.worktrees[wt.id]) {\n m.worktrees[wt.id].prUrl = prUrl;\n }\n return m;\n });\n\n if (options.json) {\n output({\n success: true,\n worktreeId: wt.id,\n branch: wt.branch,\n baseBranch: wt.baseBranch,\n prUrl,\n }, true);\n } else {\n success(`PR created: ${prUrl}`);\n }\n}\n\n/** Read agent result files and join them into a PR body, with truncation. */\nexport async function buildBodyFromResults(agents: { resultFile: string }[]): Promise<string> {\n const reads = agents.map(async (agent) => {\n try {\n return await fs.readFile(agent.resultFile, 'utf-8');\n } catch {\n return null;\n }\n });\n const contents = (await Promise.all(reads)).filter((c): c is string => c !== null);\n if (contents.length === 0) return '';\n return truncateBody(contents.join('\\n\\n---\\n\\n'));\n}\n\n/** Truncate body to stay within GitHub's PR body size limit. */\nexport function truncateBody(body: string): string {\n if (body.length <= MAX_BODY_LENGTH) return body;\n return body.slice(0, MAX_BODY_LENGTH) + '\\n\\n---\\n\\n*[Truncated — full results available in `.ppg/results/`]*';\n}\n","import { updateManifest } from '../core/manifest.js';\nimport { refreshAllAgentStatuses, killAgents } from '../core/agent.js';\nimport { checkPrState } from '../core/pr.js';\nimport { getRepoRoot, pruneWorktrees } from '../core/worktree.js';\nimport { cleanupWorktree } from '../core/cleanup.js';\nimport { getCurrentPaneId, excludeSelf, wouldCleanupAffectSelf } from '../core/self.js';\nimport { listSessionPanes, killOrphanWindows, type PaneInfo } from '../core/tmux.js';\nimport { NotInitializedError, UnmergedWorkError } from '../lib/errors.js';\nimport { output, success, info, warn } from '../lib/output.js';\nimport type { AgentEntry, WorktreeEntry } from '../types/manifest.js';\n\n/** Identify worktrees with completed agents that haven't been merged or PR'd. */\nexport function findAtRiskWorktrees(worktrees: WorktreeEntry[]): WorktreeEntry[] {\n return worktrees.filter((wt) => {\n if (wt.status === 'merged' || wt.status === 'cleaned') return false;\n if (wt.prUrl) return false;\n return Object.values(wt.agents).some((a) => a.status === 'completed');\n });\n}\n\nexport interface ResetOptions {\n force?: boolean;\n prune?: boolean;\n includeOpenPrs?: boolean;\n json?: boolean;\n}\n\nexport async function resetCommand(options: ResetOptions): Promise<void> {\n const projectRoot = await getRepoRoot();\n\n let manifest;\n try {\n manifest = await updateManifest(projectRoot, async (m) => {\n return refreshAllAgentStatuses(m, projectRoot);\n });\n } catch {\n throw new NotInitializedError(projectRoot);\n }\n\n const worktrees = Object.values(manifest.worktrees);\n\n if (worktrees.length === 0) {\n if (options.json) {\n output({ success: true, killed: [], removed: [], warned: [] }, true);\n } else {\n info('Nothing to reset — no worktrees in manifest');\n }\n return;\n }\n\n // Safety check: identify worktrees with unmerged/un-PR'd completed work\n const atRisk = findAtRiskWorktrees(worktrees);\n\n if (atRisk.length > 0 && !options.force) {\n throw new UnmergedWorkError(atRisk.map((wt) => `${wt.name} (${wt.branch})`));\n }\n\n if (atRisk.length > 0) {\n warn(`${atRisk.length} worktree(s) have unmerged/un-PR'd work — proceeding with --force`);\n }\n\n // Build self-protection context\n const selfPaneId = getCurrentPaneId();\n let paneMap: Map<string, PaneInfo> | undefined;\n if (selfPaneId) {\n paneMap = await listSessionPanes(manifest.sessionName);\n }\n\n // Collect all running agents\n const allAgents: AgentEntry[] = [];\n for (const wt of worktrees) {\n for (const agent of Object.values(wt.agents)) {\n if (['running', 'spawning', 'waiting'].includes(agent.status)) {\n allAgents.push(agent);\n }\n }\n }\n\n // Self-protection for agents\n let agentsToKill = allAgents;\n const skippedAgentIds: string[] = [];\n if (selfPaneId && paneMap) {\n const { safe, skipped } = excludeSelf(allAgents, selfPaneId, paneMap);\n agentsToKill = safe;\n for (const a of skipped) {\n skippedAgentIds.push(a.id);\n warn(`Skipping agent ${a.id} — contains current ppg process`);\n }\n }\n\n // Kill running agents\n const killedIds = agentsToKill.map((a) => a.id);\n if (agentsToKill.length > 0) {\n info(`Killing ${agentsToKill.length} running agent(s)`);\n await killAgents(agentsToKill);\n }\n\n // Update agent statuses in manifest\n if (killedIds.length > 0) {\n await updateManifest(projectRoot, (m) => {\n const now = new Date().toISOString();\n for (const wt of Object.values(m.worktrees)) {\n for (const agent of Object.values(wt.agents)) {\n if (killedIds.includes(agent.id)) {\n agent.status = 'killed';\n agent.completedAt = now;\n }\n }\n }\n return m;\n });\n }\n\n // Check for open PRs before cleanup\n const openPrWorktreeIds: string[] = [];\n if (!options.includeOpenPrs) {\n for (const wt of worktrees) {\n if (wt.status === 'cleaned') continue;\n const prState = await checkPrState(wt.branch);\n if (prState === 'OPEN') {\n openPrWorktreeIds.push(wt.id);\n warn(`Skipping worktree ${wt.id} (${wt.name}) — has open PR on branch ${wt.branch}`);\n }\n }\n }\n\n // Cleanup all worktrees (skip already cleaned/merged that are already gone)\n const removedIds: string[] = [];\n const skippedWorktreeIds: string[] = [];\n\n for (const wt of worktrees) {\n if (openPrWorktreeIds.includes(wt.id)) {\n continue;\n }\n\n // Self-protection check for worktree cleanup\n if (selfPaneId && paneMap && wouldCleanupAffectSelf(wt, selfPaneId, paneMap)) {\n warn(`Skipping cleanup of worktree ${wt.id} (${wt.name}) — contains current ppg process`);\n skippedWorktreeIds.push(wt.id);\n continue;\n }\n\n if (wt.status !== 'cleaned') {\n info(`Removing worktree ${wt.id} (${wt.name})`);\n await cleanupWorktree(projectRoot, wt, { selfPaneId, paneMap });\n }\n removedIds.push(wt.id);\n }\n\n // Remove all cleaned worktrees from manifest\n if (removedIds.length > 0) {\n await updateManifest(projectRoot, (m) => {\n for (const id of removedIds) {\n delete m.worktrees[id];\n }\n return m;\n });\n }\n\n // Kill any orphaned tmux windows left in the session (e.g., from failed cleanups)\n // Pass selfPaneId so we don't kill the conductor's own window\n const orphansKilled = await killOrphanWindows(manifest.sessionName, selfPaneId);\n if (orphansKilled > 0) {\n info(`Killed ${orphansKilled} orphaned tmux window(s)`);\n }\n\n // Optional git worktree prune\n if (options.prune) {\n info('Pruning stale git worktrees');\n await pruneWorktrees(projectRoot);\n }\n\n const warnedNames = atRisk.map((wt) => wt.name);\n\n if (options.json) {\n output({\n success: true,\n killed: killedIds,\n removed: removedIds,\n warned: warnedNames.length > 0 ? warnedNames : undefined,\n skipped: skippedWorktreeIds.length > 0 ? skippedWorktreeIds : undefined,\n skippedOpenPrs: openPrWorktreeIds.length > 0 ? openPrWorktreeIds : undefined,\n pruned: options.prune ?? false,\n }, true);\n } else {\n if (killedIds.length > 0) {\n success(`Killed ${killedIds.length} agent(s)`);\n }\n if (removedIds.length > 0) {\n success(`Removed ${removedIds.length} worktree(s)`);\n }\n if (skippedWorktreeIds.length > 0) {\n warn(`Skipped ${skippedWorktreeIds.length} worktree(s) due to self-protection`);\n }\n if (options.prune) {\n success('Pruned stale git worktrees');\n }\n if (killedIds.length > 0 || removedIds.length > 0) {\n success('Reset complete');\n } else {\n info('Nothing to reset');\n }\n }\n}\n","import { requireManifest, updateManifest } from '../core/manifest.js';\nimport { checkPrState } from '../core/pr.js';\nimport { getRepoRoot, pruneWorktrees } from '../core/worktree.js';\nimport { cleanupWorktree } from '../core/cleanup.js';\nimport { getCurrentPaneId, wouldCleanupAffectSelf } from '../core/self.js';\nimport { listSessionPanes, type PaneInfo } from '../core/tmux.js';\nimport { output, success, info, warn } from '../lib/output.js';\nimport type { WorktreeEntry } from '../types/manifest.js';\n\nexport interface CleanOptions {\n all?: boolean;\n dryRun?: boolean;\n prune?: boolean;\n includeOpenPrs?: boolean;\n json?: boolean;\n}\n\nexport async function cleanCommand(options: CleanOptions): Promise<void> {\n const projectRoot = await getRepoRoot();\n\n const manifest = await requireManifest(projectRoot);\n\n // Build self-protection context if inside tmux\n const selfPaneId = getCurrentPaneId();\n let paneMap: Map<string, PaneInfo> | undefined;\n if (selfPaneId) {\n paneMap = await listSessionPanes(manifest.sessionName);\n }\n\n // Find worktrees in terminal states\n const terminalStatuses = ['merged', 'cleaned'];\n if (options.all) {\n terminalStatuses.push('failed');\n }\n\n const toClean = Object.values(manifest.worktrees)\n .filter((wt) => terminalStatuses.includes(wt.status));\n\n // Also find worktrees already marked 'cleaned' that still have manifest entries\n const toRemoveFromManifest = Object.values(manifest.worktrees)\n .filter((wt) => wt.status === 'cleaned');\n\n if (options.dryRun) {\n if (toClean.length === 0 && toRemoveFromManifest.length === 0) {\n info('Nothing to clean');\n } else {\n info('Dry run — would clean:');\n for (const wt of toClean) {\n if (wt.status !== 'cleaned') {\n info(` ${wt.id} (${wt.name}) — ${wt.status}`);\n }\n }\n for (const wt of toRemoveFromManifest) {\n info(` ${wt.id} (${wt.name}) — remove from manifest`);\n }\n }\n\n if (options.json) {\n output({\n dryRun: true,\n wouldClean: toClean.filter((wt) => wt.status !== 'cleaned').map((wt) => ({\n id: wt.id,\n name: wt.name,\n status: wt.status,\n })),\n wouldRemoveFromManifest: toRemoveFromManifest.map((wt) => ({\n id: wt.id,\n name: wt.name,\n })),\n }, true);\n }\n return;\n }\n\n // Check for open PRs before cleaning failed worktrees\n const openPrWorktreeIds: string[] = [];\n if (options.all && !options.includeOpenPrs) {\n for (const wt of toClean) {\n if (wt.status === 'failed') {\n const prState = await checkPrState(wt.branch);\n if (prState === 'OPEN') {\n openPrWorktreeIds.push(wt.id);\n warn(`Skipping worktree ${wt.id} (${wt.name}) — has open PR on branch ${wt.branch}`);\n }\n }\n }\n }\n\n // Clean worktrees that need cleanup (merged, failed but not yet cleaned)\n const cleaned: string[] = [];\n const skipped: string[] = [];\n const removed: string[] = [];\n\n for (const wt of toClean) {\n if (openPrWorktreeIds.includes(wt.id)) {\n continue;\n }\n\n if (wt.status !== 'cleaned') {\n // Self-protection check before cleanup\n if (selfPaneId && paneMap && wouldCleanupAffectSelf(wt, selfPaneId, paneMap)) {\n warn(`Skipping cleanup of worktree ${wt.id} (${wt.name}) — contains current ppg process`);\n skipped.push(wt.id);\n continue;\n }\n\n info(`Cleaning worktree ${wt.id} (${wt.name})`);\n await cleanupWorktree(projectRoot, wt, { selfPaneId, paneMap });\n cleaned.push(wt.id);\n }\n }\n\n // Remove cleaned entries from manifest\n const allCleanedIds = [...new Set([\n ...toRemoveFromManifest.map((wt) => wt.id),\n ...cleaned,\n ])];\n\n if (allCleanedIds.length > 0) {\n await updateManifest(projectRoot, (m) => {\n for (const id of allCleanedIds) {\n delete m.worktrees[id];\n }\n return m;\n });\n removed.push(...allCleanedIds);\n }\n\n // Git worktree prune\n if (options.prune) {\n info('Pruning stale git worktrees');\n await pruneWorktrees(projectRoot);\n }\n\n if (options.json) {\n output({\n success: true,\n cleaned,\n skipped: skipped.length > 0 ? skipped : undefined,\n skippedOpenPrs: openPrWorktreeIds.length > 0 ? openPrWorktreeIds : undefined,\n removedFromManifest: removed,\n pruned: options.prune ?? false,\n }, true);\n } else {\n if (cleaned.length > 0) {\n success(`Cleaned ${cleaned.length} worktree(s)`);\n }\n if (skipped.length > 0) {\n warn(`Skipped ${skipped.length} worktree(s) due to self-protection`);\n }\n if (removed.length > 0) {\n success(`Removed ${removed.length} worktree(s) from manifest`);\n }\n if (cleaned.length === 0 && removed.length === 0 && skipped.length === 0) {\n info('Nothing to clean');\n }\n if (options.prune) {\n success('Pruned stale git worktrees');\n }\n }\n}\n","import { requireManifest, findAgent } from '../core/manifest.js';\nimport { getRepoRoot } from '../core/worktree.js';\nimport * as tmux from '../core/tmux.js';\nimport { AgentNotFoundError } from '../lib/errors.js';\nimport { output, success } from '../lib/output.js';\n\nexport interface SendOptions {\n keys?: boolean;\n enter?: boolean;\n json?: boolean;\n}\n\nexport async function sendCommand(agentId: string, text: string, options: SendOptions): Promise<void> {\n const projectRoot = await getRepoRoot();\n\n const manifest = await requireManifest(projectRoot);\n\n const found = findAgent(manifest, agentId);\n if (!found) throw new AgentNotFoundError(agentId);\n\n const { agent } = found;\n\n if (options.keys) {\n // Raw tmux key names (e.g., \"C-c\", \"Enter\", \"Escape\")\n await tmux.sendRawKeys(agent.tmuxTarget, text);\n } else if (options.enter === false) {\n // Send literal text without Enter\n await tmux.sendLiteral(agent.tmuxTarget, text);\n } else {\n // Default: send literal text + Enter\n await tmux.sendKeys(agent.tmuxTarget, text);\n }\n\n if (options.json) {\n output({\n success: true,\n agentId: agent.id,\n tmuxTarget: agent.tmuxTarget,\n text,\n }, true);\n } else {\n success(`Sent to agent ${agent.id}`);\n }\n}\n","import { requireManifest, updateManifest, resolveWorktree } from '../core/manifest.js';\nimport { refreshAllAgentStatuses } from '../core/agent.js';\nimport { getRepoRoot } from '../core/worktree.js';\nimport { PpgError, WorktreeNotFoundError } from '../lib/errors.js';\nimport { output, info } from '../lib/output.js';\nimport type { AgentEntry, AgentStatus, Manifest } from '../types/manifest.js';\n\nexport interface WaitOptions {\n all?: boolean;\n timeout?: number;\n interval?: number;\n json?: boolean;\n}\n\nconst TERMINAL_STATUSES: AgentStatus[] = ['completed', 'failed', 'killed', 'lost'];\n\nexport async function waitCommand(worktreeRef: string | undefined, options: WaitOptions): Promise<void> {\n const projectRoot = await getRepoRoot();\n const interval = (options.interval ?? 5) * 1000;\n const timeout = options.timeout ? options.timeout * 1000 : undefined;\n const startTime = Date.now();\n\n if (!worktreeRef && !options.all) {\n throw new PpgError('Specify a worktree ID or use --all', 'INVALID_ARGS');\n }\n\n if (!options.json) {\n info('Waiting for agents to complete...');\n }\n\n while (true) {\n // Check timeout\n if (timeout && (Date.now() - startTime) >= timeout) {\n const manifest = await refreshAndGet(projectRoot);\n const agents = collectAgents(manifest, worktreeRef, options.all);\n if (options.json) {\n output({\n timedOut: true,\n agents: agents.map(formatAgent),\n }, true);\n }\n throw new PpgError('Timed out waiting for agents', 'WAIT_TIMEOUT', 2);\n }\n\n const manifest = await refreshAndGet(projectRoot);\n const agents = collectAgents(manifest, worktreeRef, options.all);\n const allTerminal = agents.every((a) => TERMINAL_STATUSES.includes(a.status));\n\n if (allTerminal) {\n const anyFailed = agents.some((a) => ['failed', 'lost'].includes(a.status));\n\n if (options.json) {\n output({\n timedOut: false,\n agents: agents.map(formatAgent),\n }, true);\n } else {\n for (const a of agents) {\n info(` ${a.id}: ${a.status}`);\n }\n }\n\n if (anyFailed) {\n throw new PpgError('Some agents failed', 'AGENTS_FAILED', 1);\n }\n return;\n }\n\n // Wait before next poll\n await new Promise((resolve) => setTimeout(resolve, interval));\n }\n}\n\nasync function refreshAndGet(projectRoot: string): Promise<Manifest> {\n await requireManifest(projectRoot);\n return await updateManifest(projectRoot, async (m) => {\n return refreshAllAgentStatuses(m, projectRoot);\n });\n}\n\nfunction collectAgents(\n manifest: Manifest,\n worktreeRef: string | undefined,\n all?: boolean,\n): AgentEntry[] {\n if (all) {\n const agents: AgentEntry[] = [];\n for (const wt of Object.values(manifest.worktrees)) {\n agents.push(...Object.values(wt.agents));\n }\n return agents;\n }\n\n const wt = resolveWorktree(manifest, worktreeRef!);\n if (!wt) throw new WorktreeNotFoundError(worktreeRef!);\n return Object.values(wt.agents);\n}\n\nfunction formatAgent(a: AgentEntry) {\n return {\n id: a.id,\n status: a.status,\n agentType: a.agentType,\n exitCode: a.exitCode,\n startedAt: a.startedAt,\n completedAt: a.completedAt,\n };\n}\n","import { loadConfig } from '../core/config.js';\nimport { requireManifest, updateManifest } from '../core/manifest.js';\nimport { getRepoRoot, getCurrentBranch, createWorktree } from '../core/worktree.js';\nimport { setupWorktreeEnv } from '../core/env.js';\nimport { worktreeId as genWorktreeId } from '../lib/id.js';\nimport { output, success, info } from '../lib/output.js';\nimport { normalizeName } from '../lib/name.js';\nimport type { WorktreeEntry } from '../types/manifest.js';\n\nexport interface WorktreeCreateOptions {\n name?: string;\n base?: string;\n json?: boolean;\n}\n\nexport async function worktreeCreateCommand(options: WorktreeCreateOptions): Promise<void> {\n const projectRoot = await getRepoRoot();\n const config = await loadConfig(projectRoot);\n\n // Verify initialized\n await requireManifest(projectRoot);\n\n const baseBranch = options.base ?? await getCurrentBranch(projectRoot);\n const wtId = genWorktreeId();\n const name = options.name ? normalizeName(options.name, wtId) : wtId;\n const branchName = `ppg/${name}`;\n\n // Create git worktree\n info(`Creating worktree ${wtId} on branch ${branchName}`);\n const wtPath = await createWorktree(projectRoot, wtId, {\n branch: branchName,\n base: baseBranch,\n });\n\n // Setup env\n await setupWorktreeEnv(projectRoot, wtPath, config);\n\n // Register in manifest with empty tmuxWindow and no agents\n const worktreeEntry: WorktreeEntry = {\n id: wtId,\n name,\n path: wtPath,\n branch: branchName,\n baseBranch,\n status: 'active',\n tmuxWindow: '',\n agents: {},\n createdAt: new Date().toISOString(),\n };\n\n await updateManifest(projectRoot, (m) => {\n m.worktrees[wtId] = worktreeEntry;\n return m;\n });\n\n if (options.json) {\n output({\n success: true,\n worktree: {\n id: wtId,\n name,\n branch: branchName,\n baseBranch,\n path: wtPath,\n },\n }, true);\n } else {\n success(`Created worktree ${wtId} (${name}) on branch ${branchName}`);\n info(`Path: ${wtPath}`);\n info(`Spawn agents: ppg spawn --worktree ${wtId} --prompt \"your task\"`);\n }\n}\n","import { access } from 'node:fs/promises';\nimport path from 'node:path';\nimport { execa } from 'execa';\nimport { getRepoRoot } from '../core/worktree.js';\nimport { readManifest } from '../core/manifest.js';\nimport { manifestPath } from '../lib/paths.js';\nimport { NotInitializedError, PpgError } from '../lib/errors.js';\nimport { info } from '../lib/output.js';\n\nexport async function findDashboardBinary(projectRoot: string): Promise<string | null> {\n const localBuild = path.join(\n projectRoot,\n 'PPG CLI',\n 'build',\n 'Build',\n 'Products',\n 'Release',\n 'PPG CLI.app',\n 'Contents',\n 'MacOS',\n 'PPG CLI',\n );\n\n try {\n await access(localBuild);\n return localBuild;\n } catch {\n // not found, fall through\n }\n\n const appsBuild = '/Applications/PPG CLI.app/Contents/MacOS/PPG CLI';\n try {\n await access(appsBuild);\n return appsBuild;\n } catch {\n // not found, fall through\n }\n\n try {\n const result = await execa('mdfind', [\n 'kMDItemCFBundleIdentifier == \"com.2wit.PPG-CLI\"',\n ]);\n const appPath = result.stdout.trim().split('\\n')[0];\n if (appPath) {\n const binaryPath = path.join(appPath, 'Contents', 'MacOS', 'PPG CLI');\n try {\n await access(binaryPath);\n return binaryPath;\n } catch {\n // found app but no binary\n }\n }\n } catch {\n // mdfind failed\n }\n\n return null;\n}\n\nexport async function uiCommand(): Promise<void> {\n const projectRoot = await getRepoRoot();\n let manifest;\n try {\n manifest = await readManifest(projectRoot);\n } catch {\n throw new NotInitializedError(projectRoot);\n }\n\n const binaryPath = await findDashboardBinary(projectRoot);\n if (!binaryPath) {\n throw new PpgError(\n `Dashboard app not found. Install it with:\\n ppg install-dashboard\\n\\nOr build from source:\\n cd \"PPG CLI\" && xcodebuild -scheme \"PPG CLI\" -configuration Release -derivedDataPath build build`,\n 'DASHBOARD_NOT_FOUND',\n );\n }\n\n const mPath = manifestPath(projectRoot);\n const proc = execa(binaryPath, [\n '--manifest-path', mPath,\n '--session-name', manifest.sessionName,\n '--project-root', projectRoot,\n ], {\n detached: true,\n stdio: 'ignore',\n });\n proc.unref();\n\n info(`Dashboard launched for ${manifest.sessionName}`);\n}\n","import { createWriteStream } from 'node:fs';\nimport { mkdir, cp, rm } from 'node:fs/promises';\nimport { createRequire } from 'node:module';\nimport { tmpdir } from 'node:os';\nimport path from 'node:path';\nimport { pipeline } from 'node:stream/promises';\nimport { Readable } from 'node:stream';\nimport { execa } from 'execa';\nimport { output, info, success } from '../lib/output.js';\nimport { PpgError } from '../lib/errors.js';\n\nconst require = createRequire(import.meta.url);\n\nconst REPO = '2witstudios/ppg-cli';\nconst ASSET_NAME = 'PPG-CLI-Dashboard.dmg';\nconst APP_NAME = 'PPG CLI.app';\n\nfunction getVersion(): string {\n const pkg = require('../package.json') as { version: string };\n return pkg.version;\n}\n\nexport async function installDashboardCommand(options: {\n dir: string;\n json: boolean;\n}): Promise<void> {\n const { dir, json } = options;\n\n try {\n const version = getVersion();\n const tag = `v${version}`;\n const url = `https://github.com/${REPO}/releases/download/${tag}/${ASSET_NAME}`;\n\n if (!json) info(`Downloading dashboard ${tag} from GitHub Releases…`);\n\n const res = await fetch(url);\n if (!res.ok) {\n if (res.status === 404) {\n throw new PpgError(\n `Dashboard release not found for ${tag}. The dashboard may not be available for this version yet.\\nCheck: https://github.com/${REPO}/releases/tag/${tag}`,\n 'DASHBOARD_NOT_FOUND',\n );\n }\n throw new PpgError(\n `Failed to download dashboard: HTTP ${res.status} ${res.statusText}`,\n 'DOWNLOAD_FAILED',\n );\n }\n\n // Download to temp directory\n const tmp = path.join(tmpdir(), `ppg-dashboard-${Date.now()}`);\n await mkdir(tmp, { recursive: true });\n const dmgPath = path.join(tmp, ASSET_NAME);\n\n const body = res.body;\n if (!body) throw new PpgError('Empty response body', 'DOWNLOAD_FAILED');\n await pipeline(\n Readable.fromWeb(body as import('stream/web').ReadableStream),\n createWriteStream(dmgPath),\n );\n\n if (!json) info('Mounting…');\n\n // Mount DMG\n const mountResult = await execa('hdiutil', ['attach', dmgPath, '-nobrowse', '-quiet']);\n const mountLine = mountResult.stdout.trim().split('\\n').pop() ?? '';\n const mountPoint = mountLine.split('\\t').pop()?.trim();\n\n if (!mountPoint) {\n throw new PpgError('Failed to mount DMG — could not determine mount point', 'INSTALL_FAILED');\n }\n\n try {\n const srcApp = path.join(mountPoint, APP_NAME);\n const destApp = path.join(dir, APP_NAME);\n\n if (!json) info('Installing…');\n\n // Remove existing installation if present\n await rm(destApp, { recursive: true, force: true });\n // Copy .app from mounted volume\n await cp(srcApp, destApp, { recursive: true });\n\n // Remove quarantine attribute\n try {\n await execa('xattr', ['-dr', 'com.apple.quarantine', destApp]);\n } catch {\n // Quarantine attribute may not exist — that's fine\n }\n\n if (json) {\n output({ success: true, version, path: destApp }, true);\n } else {\n success(`Dashboard ${tag} installed to ${destApp}`);\n }\n } finally {\n // Always unmount\n await execa('hdiutil', ['detach', mountPoint, '-quiet']).catch(() => {});\n }\n\n // Clean up temp\n await rm(tmp, { recursive: true, force: true });\n } catch (err) {\n if (err instanceof PpgError) throw err;\n const message = err instanceof Error ? err.message : String(err);\n throw new PpgError(`Dashboard installation failed: ${message}`, 'INSTALL_FAILED');\n }\n}\n","import fs from 'node:fs/promises';\nimport YAML from 'yaml';\nimport { CronExpressionParser } from 'cron-parser';\nimport { schedulesPath } from '../lib/paths.js';\nimport { PpgError } from '../lib/errors.js';\nimport type { ScheduleEntry, SchedulesConfig } from '../types/schedule.js';\n\nconst SAFE_NAME = /^[\\w-]+$/;\n\nexport async function loadSchedules(projectRoot: string): Promise<ScheduleEntry[]> {\n const filePath = schedulesPath(projectRoot);\n let raw: string;\n try {\n raw = await fs.readFile(filePath, 'utf-8');\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === 'ENOENT') {\n throw new PpgError('No schedules file found. Create .ppg/schedules.yaml first.', 'INVALID_ARGS');\n }\n throw err;\n }\n\n const parsed = YAML.parse(raw) as SchedulesConfig;\n if (!parsed || !Array.isArray(parsed.schedules)) {\n throw new PpgError('Invalid schedules.yaml: missing \"schedules\" array', 'INVALID_ARGS');\n }\n\n for (let i = 0; i < parsed.schedules.length; i++) {\n validateScheduleEntry(parsed.schedules[i], i);\n }\n\n return parsed.schedules;\n}\n\nfunction validateScheduleEntry(entry: ScheduleEntry, index: number): void {\n if (!entry.name || typeof entry.name !== 'string') {\n throw new PpgError(`schedules[${index}]: missing \"name\"`, 'INVALID_ARGS');\n }\n if (!SAFE_NAME.test(entry.name)) {\n throw new PpgError(\n `schedules[${index}]: invalid name \"${entry.name}\" — must be alphanumeric, hyphens, or underscores`,\n 'INVALID_ARGS',\n );\n }\n if (!entry.cron || typeof entry.cron !== 'string') {\n throw new PpgError(`schedules[${index}]: missing \"cron\" expression`, 'INVALID_ARGS');\n }\n validateCronExpression(entry.cron, index);\n\n const hasSwarm = entry.swarm && typeof entry.swarm === 'string';\n const hasPrompt = entry.prompt && typeof entry.prompt === 'string';\n if (!hasSwarm && !hasPrompt) {\n throw new PpgError(`schedules[${index}]: must specify either \"swarm\" or \"prompt\"`, 'INVALID_ARGS');\n }\n if (hasSwarm && hasPrompt) {\n throw new PpgError(`schedules[${index}]: specify either \"swarm\" or \"prompt\", not both`, 'INVALID_ARGS');\n }\n}\n\nexport function validateCronExpression(expr: string, index?: number): void {\n const prefix = index !== undefined ? `schedules[${index}]: ` : '';\n if (!expr || !expr.trim()) {\n throw new PpgError(`${prefix}invalid cron expression: \"${expr}\"`, 'INVALID_ARGS');\n }\n try {\n CronExpressionParser.parse(expr);\n } catch {\n throw new PpgError(`${prefix}invalid cron expression: \"${expr}\"`, 'INVALID_ARGS');\n }\n}\n\nexport function getNextRun(cronExpr: string): Date {\n const expr = CronExpressionParser.parse(cronExpr);\n return expr.next().toDate();\n}\n\nexport function formatCronHuman(cronExpr: string): string {\n // Basic human-readable descriptions for common patterns\n const parts = cronExpr.trim().split(/\\s+/);\n if (parts.length !== 5) return cronExpr;\n\n const [min, hour, dom, mon, dow] = parts;\n\n if (min === '0' && hour !== '*' && dom === '*' && mon === '*' && dow === '*') {\n return `daily at ${hour}:00`;\n }\n if (min.startsWith('*/') && hour === '*' && dom === '*' && mon === '*' && dow === '*') {\n return `every ${min.slice(2)} minutes`;\n }\n if (min !== '*' && hour === '*' && dom === '*' && mon === '*' && dow === '*') {\n return `every hour at :${min.padStart(2, '0')}`;\n }\n if (dow !== '*' && dom === '*' && mon === '*') {\n const days = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];\n const dayName = days[Number(dow)] ?? dow;\n return `${dayName} at ${hour}:${min.padStart(2, '0')}`;\n }\n\n return cronExpr;\n}\n","import fs from 'node:fs/promises';\nimport { createReadStream } from 'node:fs';\nimport path from 'node:path';\nimport readline from 'node:readline';\nimport { execa } from 'execa';\nimport { loadSchedules, getNextRun } from './schedule.js';\nimport { cronLogPath, cronPidPath, logsDir, schedulesPath } from '../lib/paths.js';\nimport type { ScheduleEntry } from '../types/schedule.js';\n\nconst CHECK_INTERVAL_MS = 30_000;\n\ninterface ScheduleState {\n entry: ScheduleEntry;\n nextRun: Date;\n lastTriggered?: Date;\n}\n\nexport async function runCronDaemon(projectRoot: string): Promise<void> {\n const pidPath = cronPidPath(projectRoot);\n\n // Write PID file\n await fs.mkdir(path.dirname(pidPath), { recursive: true });\n await fs.writeFile(pidPath, String(process.pid), 'utf-8');\n\n // Ensure logs directory\n await fs.mkdir(logsDir(projectRoot), { recursive: true });\n\n await logCron(projectRoot, 'Cron daemon starting');\n\n let states = await loadScheduleStates(projectRoot);\n let lastConfigMtime = await getFileMtime(schedulesPath(projectRoot));\n\n await logCron(projectRoot, `Loaded ${states.length} schedule(s)`);\n for (const s of states) {\n await logCron(projectRoot, ` ${s.entry.name}: next run at ${s.nextRun.toISOString()}`);\n }\n\n // Clean shutdown on SIGTERM/SIGINT\n const cleanup = async () => {\n await logCron(projectRoot, 'Cron daemon stopping');\n try {\n await fs.unlink(pidPath);\n } catch { /* already gone */ }\n process.exit(0);\n };\n process.on('SIGTERM', cleanup);\n process.on('SIGINT', cleanup);\n\n // Main loop\n const tick = async () => {\n // Reload schedules if config file changed\n const currentMtime = await getFileMtime(schedulesPath(projectRoot));\n if (currentMtime !== lastConfigMtime) {\n try {\n states = await loadScheduleStates(projectRoot);\n lastConfigMtime = currentMtime;\n await logCron(projectRoot, `Reloaded schedules (${states.length} schedule(s))`);\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n await logCron(projectRoot, `Failed to reload schedules: ${msg}`);\n }\n }\n\n const now = new Date();\n const due = states.filter((s) => now >= s.nextRun);\n // Fire all due schedules concurrently\n await Promise.allSettled(\n due.map(async (state) => {\n await triggerSchedule(state, projectRoot);\n state.nextRun = getNextRun(state.entry.cron);\n state.lastTriggered = now;\n await logCron(projectRoot, ` ${state.entry.name}: next run at ${state.nextRun.toISOString()}`);\n }),\n );\n };\n\n // Run immediately, then on interval\n await tick();\n setInterval(tick, CHECK_INTERVAL_MS);\n\n // Keep alive\n await new Promise(() => {});\n}\n\nasync function loadScheduleStates(projectRoot: string): Promise<ScheduleState[]> {\n const schedules = await loadSchedules(projectRoot);\n return schedules.map((entry) => ({\n entry,\n nextRun: getNextRun(entry.cron),\n }));\n}\n\nasync function getFileMtime(filePath: string): Promise<number> {\n try {\n const stat = await fs.stat(filePath);\n return stat.mtimeMs;\n } catch {\n return 0;\n }\n}\n\nasync function triggerSchedule(state: ScheduleState, projectRoot: string): Promise<void> {\n const { entry } = state;\n await logCron(projectRoot, `Triggering schedule: ${entry.name}`);\n\n const varArgs: string[] = [];\n if (entry.vars) {\n for (const [key, value] of Object.entries(entry.vars)) {\n varArgs.push('--var', `${key}=${value}`);\n }\n }\n\n try {\n if (entry.swarm) {\n const args = ['swarm', entry.swarm, ...varArgs, '--json'];\n await logCron(projectRoot, ` Running: ppg ${args.join(' ')}`);\n const result = await execa('ppg', args, { cwd: projectRoot, reject: false });\n if (result.exitCode === 0) {\n await logCron(projectRoot, ` Success: ${entry.name} (swarm: ${entry.swarm})`);\n } else {\n await logCron(projectRoot, ` Failed: ${entry.name} — ${result.stderr || result.stdout}`);\n }\n } else if (entry.prompt) {\n const args = [\n 'spawn',\n '--name', `cron-${entry.name}-${Date.now()}`,\n '--template', entry.prompt,\n ...varArgs,\n '--json',\n ];\n await logCron(projectRoot, ` Running: ppg ${args.join(' ')}`);\n const result = await execa('ppg', args, { cwd: projectRoot, reject: false });\n if (result.exitCode === 0) {\n await logCron(projectRoot, ` Success: ${entry.name} (prompt: ${entry.prompt})`);\n } else {\n await logCron(projectRoot, ` Failed: ${entry.name} — ${result.stderr || result.stdout}`);\n }\n }\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n await logCron(projectRoot, ` Error triggering ${entry.name}: ${message}`);\n }\n}\n\nexport async function logCron(projectRoot: string, message: string): Promise<void> {\n const logPath = cronLogPath(projectRoot);\n const timestamp = new Date().toISOString();\n const line = `[${timestamp}] ${message}\\n`;\n\n // Also write to stdout so it's visible in the tmux pane\n process.stdout.write(line);\n\n try {\n await fs.appendFile(logPath, line, 'utf-8');\n } catch {\n // Log dir may not exist yet on first call — create and retry\n await fs.mkdir(logsDir(projectRoot), { recursive: true });\n await fs.appendFile(logPath, line, 'utf-8');\n }\n}\n\nexport async function isCronRunning(projectRoot: string): Promise<boolean> {\n return (await getCronPid(projectRoot)) !== null;\n}\n\nexport async function getCronPid(projectRoot: string): Promise<number | null> {\n const pidPath = cronPidPath(projectRoot);\n let raw: string;\n try {\n raw = await fs.readFile(pidPath, 'utf-8');\n } catch {\n return null;\n }\n const pid = parseInt(raw, 10);\n if (isNaN(pid)) {\n await cleanupPidFile(pidPath);\n return null;\n }\n try {\n // Signal 0 doesn't send a signal, just checks if process is alive\n process.kill(pid, 0);\n return pid;\n } catch {\n // Process is dead — clean up stale PID file\n await cleanupPidFile(pidPath);\n return null;\n }\n}\n\nasync function cleanupPidFile(pidPath: string): Promise<void> {\n try {\n await fs.unlink(pidPath);\n } catch { /* already gone */ }\n}\n\nexport async function readCronLog(projectRoot: string, lines: number = 20): Promise<string[]> {\n const logPath = cronLogPath(projectRoot);\n try {\n await fs.access(logPath);\n } catch {\n return [];\n }\n // Stream the file and keep only the last N lines to avoid loading large logs into memory\n const result: string[] = [];\n const rl = readline.createInterface({\n input: createReadStream(logPath, { encoding: 'utf-8' }),\n crlfDelay: Infinity,\n });\n for await (const line of rl) {\n if (!line) continue;\n result.push(line);\n if (result.length > lines) {\n result.shift();\n }\n }\n return result;\n}\n","import fs from 'node:fs/promises';\nimport { getRepoRoot } from '../core/worktree.js';\nimport { readManifest } from '../core/manifest.js';\nimport { loadSchedules, getNextRun, formatCronHuman } from '../core/schedule.js';\nimport { runCronDaemon, isCronRunning, getCronPid, readCronLog } from '../core/cron.js';\nimport * as tmux from '../core/tmux.js';\nimport { cronPidPath, manifestPath } from '../lib/paths.js';\nimport { PpgError, NotInitializedError } from '../lib/errors.js';\nimport { output, formatTable, info, success, warn } from '../lib/output.js';\nimport type { Column } from '../lib/output.js';\n\nexport interface CronOptions {\n json?: boolean;\n}\n\nexport interface CronStatusOptions {\n lines?: number;\n json?: boolean;\n}\n\nconst CRON_WINDOW_NAME = 'ppg-cron';\n\nexport async function cronStartCommand(options: CronOptions): Promise<void> {\n const projectRoot = await getRepoRoot();\n await requireInit(projectRoot);\n\n // Check if already running\n if (await isCronRunning(projectRoot)) {\n const pid = await getCronPid(projectRoot);\n if (options.json) {\n output({ success: false, error: 'Cron daemon is already running', pid }, true);\n } else {\n warn(`Cron daemon is already running (PID: ${pid})`);\n }\n return;\n }\n\n // Verify schedules can be loaded before starting\n const schedules = await loadSchedules(projectRoot);\n if (schedules.length === 0) {\n throw new PpgError('No schedules defined in .ppg/schedules.yaml', 'INVALID_ARGS');\n }\n\n // Start daemon in a tmux window\n const manifest = await readManifest(projectRoot);\n const sessionName = manifest.sessionName;\n await tmux.ensureSession(sessionName);\n\n const windowTarget = await tmux.createWindow(sessionName, CRON_WINDOW_NAME, projectRoot);\n const command = `ppg cron _daemon`;\n await tmux.sendKeys(windowTarget, command);\n\n if (options.json) {\n output({\n success: true,\n tmuxWindow: windowTarget,\n scheduleCount: schedules.length,\n }, true);\n } else {\n success(`Cron daemon started in tmux window: ${windowTarget}`);\n info(`${schedules.length} schedule(s) loaded`);\n info(`Attach: tmux select-window -t ${windowTarget}`);\n }\n}\n\nexport async function cronStopCommand(options: CronOptions): Promise<void> {\n const projectRoot = await getRepoRoot();\n\n // getCronPid already cleans up stale PID files\n const pid = await getCronPid(projectRoot);\n if (!pid) {\n if (options.json) {\n output({ success: false, error: 'Cron daemon is not running' }, true);\n } else {\n warn('Cron daemon is not running');\n }\n return;\n }\n\n // Kill the process\n try {\n process.kill(pid, 'SIGTERM');\n } catch {\n // Already dead\n }\n\n // Clean up PID file (daemon cleanup handler may not have run yet)\n try {\n await fs.unlink(cronPidPath(projectRoot));\n } catch { /* already gone */ }\n\n // Try to kill the tmux window too\n try {\n const manifest = await readManifest(projectRoot);\n const windows = await tmux.listSessionWindows(manifest.sessionName);\n const cronWindow = windows.find((w) => w.name === CRON_WINDOW_NAME);\n if (cronWindow) {\n await tmux.killWindow(`${manifest.sessionName}:${cronWindow.index}`);\n }\n } catch { /* best effort */ }\n\n if (options.json) {\n output({ success: true, pid }, true);\n } else {\n success(`Cron daemon stopped (PID: ${pid})`);\n }\n}\n\nexport async function cronListCommand(options: CronOptions): Promise<void> {\n const projectRoot = await getRepoRoot();\n await requireInit(projectRoot);\n\n const schedules = await loadSchedules(projectRoot);\n\n if (options.json) {\n const data = schedules.map((s) => ({\n name: s.name,\n type: s.swarm ? 'swarm' : 'prompt',\n target: s.swarm ?? s.prompt,\n cron: s.cron,\n nextRun: getNextRun(s.cron).toISOString(),\n vars: s.vars ?? {},\n }));\n output({ schedules: data }, true);\n return;\n }\n\n const columns: Column[] = [\n { header: 'NAME', key: 'name' },\n { header: 'TYPE', key: 'type' },\n { header: 'TARGET', key: 'target' },\n { header: 'CRON', key: 'cron' },\n { header: 'SCHEDULE', key: 'human' },\n { header: 'NEXT RUN', key: 'nextRun' },\n ];\n\n const rows = schedules.map((s) => ({\n name: s.name,\n type: s.swarm ? 'swarm' : 'prompt',\n target: s.swarm ?? s.prompt,\n cron: s.cron,\n human: formatCronHuman(s.cron),\n nextRun: getNextRun(s.cron).toLocaleString(),\n }));\n\n console.log(formatTable(rows, columns));\n}\n\nexport async function cronStatusCommand(options: CronStatusOptions): Promise<void> {\n const projectRoot = await getRepoRoot();\n\n const running = await isCronRunning(projectRoot);\n const pid = running ? await getCronPid(projectRoot) : null;\n const recentLines = await readCronLog(projectRoot, options.lines ?? 20);\n\n if (options.json) {\n output({\n running,\n pid,\n recentLog: recentLines,\n }, true);\n return;\n }\n\n if (running) {\n success(`Cron daemon is running (PID: ${pid})`);\n } else {\n warn('Cron daemon is not running');\n }\n\n if (recentLines.length > 0) {\n console.log('\\nRecent log:');\n for (const line of recentLines) {\n console.log(` ${line}`);\n }\n } else {\n info('No cron log entries yet');\n }\n}\n\nexport async function cronDaemonCommand(): Promise<void> {\n const projectRoot = await getRepoRoot();\n await requireInit(projectRoot);\n await runCronDaemon(projectRoot);\n}\n\nasync function requireInit(projectRoot: string): Promise<void> {\n try {\n await fs.access(manifestPath(projectRoot));\n } catch {\n throw new NotInitializedError(projectRoot);\n }\n}\n","import { createRequire } from 'node:module';\nimport { Command } from 'commander';\nimport { PpgError } from './lib/errors.js';\nimport { outputError } from './lib/output.js';\n\nconst require = createRequire(import.meta.url);\nconst pkg = require('../package.json') as { version: string };\n\nconst program = new Command();\n\nprogram\n .name('ppg')\n .description('Pure Point Guard — local orchestration runtime for parallel CLI coding agents')\n .version(pkg.version)\n .option('--json', 'Output as JSON');\n\nprogram\n .command('init')\n .description('Initialize Point Guard in the current git repository')\n .option('--json', 'Output as JSON')\n .action(async (options) => {\n const { initCommand } = await import('./commands/init.js');\n await initCommand(options);\n });\n\nprogram\n .command('spawn')\n .description('Spawn a new worktree and agent(s), or add agents to an existing worktree')\n .option('-n, --name <name>', 'Name for the worktree/task')\n .option('-a, --agent <type>', 'Agent type to use (default: claude)')\n .option('-p, --prompt <text>', 'Prompt text for the agent')\n .option('-f, --prompt-file <path>', 'File containing the prompt')\n .option('-t, --template <name>', 'Template name from .ppg/templates/')\n .option('--var <key=value...>', 'Template variables', collectVars, [])\n .option('-b, --base <branch>', 'Base branch for the worktree')\n .option('-w, --worktree <id>', 'Add agent to existing worktree')\n .option('-c, --count <n>', 'Number of agents to spawn', parsePositiveInt('count'), 1)\n .option('--split', 'Put all agents in one window as split panes')\n .option('--open', 'Open a Terminal window for the spawned agents')\n .option('--json', 'Output as JSON')\n .action(async (options) => {\n const { spawnCommand } = await import('./commands/spawn.js');\n await spawnCommand(options);\n });\n\nprogram\n .command('status')\n .description('Show status of worktrees and agents')\n .argument('[worktree]', 'Filter by worktree ID or name')\n .option('--json', 'Output as JSON')\n .option('-w, --watch', 'Watch for status changes')\n .action(async (worktree, options) => {\n const { statusCommand } = await import('./commands/status.js');\n await statusCommand(worktree, options);\n });\n\nprogram\n .command('kill')\n .description('Kill agents or worktrees')\n .option('-a, --agent <id>', 'Kill a specific agent')\n .option('-w, --worktree <id>', 'Kill all agents in a worktree')\n .option('--all', 'Kill all agents in all worktrees')\n .option('-r, --remove', 'Also remove the worktree after killing')\n .option('-d, --delete', 'Delete agent/worktree entry from manifest after killing')\n .option('--include-open-prs', 'Include worktrees with open GitHub PRs in deletion')\n .option('--json', 'Output as JSON')\n .action(async (options) => {\n const { killCommand } = await import('./commands/kill.js');\n await killCommand(options);\n });\n\nprogram\n .command('attach')\n .description('Attach to a worktree or agent tmux pane')\n .argument('<target>', 'Worktree ID, agent ID, or name')\n .action(async (target) => {\n const { attachCommand } = await import('./commands/attach.js');\n await attachCommand(target);\n });\n\nprogram\n .command('logs')\n .description('View agent pane output')\n .argument('<agent-id>', 'Agent ID')\n .option('-l, --lines <n>', 'Number of lines to show', (v: string) => Number(v), 100)\n .option('-f, --follow', 'Follow output (poll every 1s)')\n .option('--full', 'Show full pane history')\n .option('--json', 'Output as JSON')\n .action(async (agentId, options) => {\n const { logsCommand } = await import('./commands/logs.js');\n await logsCommand(agentId, options);\n });\n\nprogram\n .command('aggregate')\n .description('Aggregate results from completed agents')\n .argument('[worktree-id]', 'Worktree ID to aggregate results from')\n .option('--all', 'Aggregate from all worktrees')\n .option('-o, --output <file>', 'Write output to file')\n .option('--json', 'Output as JSON')\n .action(async (worktreeId, options) => {\n const { aggregateCommand } = await import('./commands/aggregate.js');\n await aggregateCommand(worktreeId, options);\n });\n\nprogram\n .command('merge')\n .description('Merge a worktree branch back into base')\n .argument('<worktree-id>', 'Worktree ID to merge')\n .option('-s, --strategy <strategy>', 'Merge strategy: squash or no-ff', 'squash')\n .option('--no-cleanup', 'Do not remove worktree after merge')\n .option('--dry-run', 'Show what would be done without doing it')\n .option('--force', 'Merge even if agents are not completed')\n .option('--json', 'Output as JSON')\n .action(async (worktreeId, options) => {\n const { mergeCommand } = await import('./commands/merge.js');\n await mergeCommand(worktreeId, options);\n });\n\nprogram\n .command('swarm')\n .description('Run a swarm template — spawn multiple agents from a predefined workflow')\n .argument('<template>', 'Swarm template name from .ppg/swarms/')\n .option('-w, --worktree <ref>', 'Target an existing worktree by ID, name, or branch')\n .option('--var <key=value...>', 'Template variables', collectVars, [])\n .option('-n, --name <name>', 'Override worktree name')\n .option('-b, --base <branch>', 'Base branch for new worktree(s)')\n .option('--open', 'Open Terminal windows for spawned agents')\n .option('--json', 'Output as JSON')\n .action(async (template, options) => {\n const { swarmCommand } = await import('./commands/swarm.js');\n await swarmCommand(template, options);\n });\n\nprogram\n .command('prompt')\n .description('Spawn a worktree+agent using a named prompt from .ppg/prompts/')\n .argument('<name>', 'Prompt name (filename without .md)')\n .option('-n, --name <name>', 'Name for the worktree')\n .option('-a, --agent <type>', 'Agent type to use (default: claude)')\n .option('--var <key=value...>', 'Template variables', collectVars, [])\n .option('-b, --base <branch>', 'Base branch for the worktree')\n .option('-c, --count <n>', 'Number of agents to spawn', parsePositiveInt('count'), 1)\n .option('--split', 'Put all agents in one window as split panes')\n .option('--open', 'Open a Terminal window for the spawned agents')\n .option('--json', 'Output as JSON')\n .action(async (name, options) => {\n const { promptCommand } = await import('./commands/prompt.js');\n await promptCommand(name, options);\n });\n\nprogram\n .command('list')\n .description('List available templates, swarms, or prompts')\n .argument('<type>', 'What to list: templates, swarms, prompts')\n .option('--json', 'Output as JSON')\n .action(async (type, options) => {\n const { listCommand } = await import('./commands/list.js');\n await listCommand(type, options);\n });\n\nprogram\n .command('restart')\n .description('Restart a failed/killed agent in the same worktree')\n .argument('<agent-id>', 'Agent ID to restart')\n .option('-p, --prompt <text>', 'Override the original prompt')\n .option('-a, --agent <type>', 'Override the agent type')\n .option('--open', 'Open a Terminal window for the restarted agent')\n .option('--json', 'Output as JSON')\n .action(async (agentId, options) => {\n const { restartCommand } = await import('./commands/restart.js');\n await restartCommand(agentId, options);\n });\n\nprogram\n .command('diff')\n .description('Show changes made in a worktree branch')\n .argument('<worktree-id>', 'Worktree ID or name')\n .option('--stat', 'Show diffstat summary')\n .option('--name-only', 'Show only changed file names')\n .option('--json', 'Output as JSON')\n .action(async (worktreeId, options) => {\n const { diffCommand } = await import('./commands/diff.js');\n await diffCommand(worktreeId, options);\n });\n\nprogram\n .command('pr')\n .description('Create a GitHub PR from a worktree branch')\n .argument('<worktree-id>', 'Worktree ID or name')\n .option('--title <text>', 'PR title (default: worktree name)')\n .option('--body <text>', 'PR body (default: agent result content)')\n .option('--draft', 'Create as draft PR')\n .option('--json', 'Output as JSON')\n .action(async (worktreeId, options) => {\n const { prCommand } = await import('./commands/pr.js');\n await prCommand(worktreeId, options);\n });\n\nprogram\n .command('reset')\n .description('Kill all agents, remove all worktrees, and wipe manifest')\n .option('--force', 'Reset even if worktrees have unmerged/un-PR\\'d work')\n .option('--prune', 'Also run git worktree prune')\n .option('--include-open-prs', 'Include worktrees with open GitHub PRs in cleanup')\n .option('--json', 'Output as JSON')\n .action(async (options) => {\n const { resetCommand } = await import('./commands/reset.js');\n await resetCommand(options);\n });\n\nprogram\n .command('clean')\n .description('Remove worktrees in terminal states (merged/cleaned/failed)')\n .option('--all', 'Also clean failed worktrees')\n .option('--dry-run', 'Show what would be done without doing it')\n .option('--prune', 'Also run git worktree prune')\n .option('--include-open-prs', 'Include worktrees with open GitHub PRs in cleanup')\n .option('--json', 'Output as JSON')\n .action(async (options) => {\n const { cleanCommand } = await import('./commands/clean.js');\n await cleanCommand(options);\n });\n\nprogram\n .command('send')\n .description('Send text to an agent\\'s tmux pane')\n .argument('<agent-id>', 'Agent ID')\n .argument('<text>', 'Text to send')\n .option('--keys', 'Send raw tmux key names (e.g., C-c, Enter)')\n .option('--no-enter', 'Do not append Enter after the text')\n .option('--json', 'Output as JSON')\n .action(async (agentId, text, options) => {\n const { sendCommand } = await import('./commands/send.js');\n await sendCommand(agentId, text, options);\n });\n\nprogram\n .command('wait')\n .description('Wait for agents to reach terminal state')\n .argument('[worktree-id]', 'Worktree ID or name')\n .option('--all', 'Wait for all agents across all worktrees')\n .option('--timeout <seconds>', 'Timeout in seconds', parsePositiveInt('timeout'))\n .option('--interval <seconds>', 'Poll interval in seconds', parsePositiveInt('interval'))\n .option('--json', 'Output as JSON')\n .action(async (worktreeId, options) => {\n const { waitCommand } = await import('./commands/wait.js');\n await waitCommand(worktreeId, options);\n });\n\nconst worktreeCmd = program.command('worktree').description('Manage worktrees');\n\nworktreeCmd\n .command('create')\n .description('Create a standalone worktree without spawning agents')\n .option('-n, --name <name>', 'Name for the worktree')\n .option('-b, --base <branch>', 'Base branch for the worktree')\n .option('--json', 'Output as JSON')\n .action(async (options) => {\n const { worktreeCreateCommand } = await import('./commands/worktree.js');\n await worktreeCreateCommand(options);\n });\n\nprogram\n .command('ui')\n .alias('dashboard')\n .description('Open the native dashboard')\n .action(async () => {\n const { uiCommand } = await import('./commands/ui.js');\n await uiCommand();\n });\n\nprogram\n .command('install-dashboard')\n .description('Download and install the macOS dashboard app')\n .option('--dir <path>', 'Install directory', '/Applications')\n .option('--json', 'JSON output')\n .action(async (options) => {\n const { installDashboardCommand } = await import('./commands/install-dashboard.js');\n await installDashboardCommand(options);\n });\n\nconst cronCmd = program.command('cron').description('Manage scheduled runs');\n\ncronCmd\n .command('start')\n .description('Start the cron scheduler daemon in a tmux window')\n .option('--json', 'Output as JSON')\n .action(async (options) => {\n const { cronStartCommand } = await import('./commands/cron.js');\n await cronStartCommand(options);\n });\n\ncronCmd\n .command('stop')\n .description('Stop the cron scheduler daemon')\n .option('--json', 'Output as JSON')\n .action(async (options) => {\n const { cronStopCommand } = await import('./commands/cron.js');\n await cronStopCommand(options);\n });\n\ncronCmd\n .command('list')\n .description('List configured schedules and next run times')\n .option('--json', 'Output as JSON')\n .action(async (options) => {\n const { cronListCommand } = await import('./commands/cron.js');\n await cronListCommand(options);\n });\n\ncronCmd\n .command('status')\n .description('Show cron daemon status and recent log')\n .option('-l, --lines <n>', 'Number of recent log lines to show', (v: string) => Number(v), 20)\n .option('--json', 'Output as JSON')\n .action(async (options) => {\n const { cronStatusCommand } = await import('./commands/cron.js');\n await cronStatusCommand(options);\n });\n\ncronCmd\n .command('_daemon', { hidden: true })\n .description('Internal: run the cron daemon (called by ppg cron start)')\n .action(async () => {\n const { cronDaemonCommand } = await import('./commands/cron.js');\n await cronDaemonCommand();\n });\n\n// Error handling\nprogram.exitOverride();\n\nfunction collectVars(value: string, previous: string[]): string[] {\n return previous.concat([value]);\n}\n\nfunction parsePositiveInt(optionName: string) {\n return (v: string): number => {\n const n = Number(v);\n if (!Number.isInteger(n) || n < 1) {\n throw new Error(`--${optionName} must be a positive integer`);\n }\n return n;\n };\n}\n\nasync function main() {\n try {\n await program.parseAsync(process.argv);\n } catch (err) {\n if (err instanceof PpgError) {\n outputError(err, program.opts().json ?? false);\n process.exit(err.exitCode);\n }\n if (err instanceof Error && 'code' in err) {\n const code = (err as { code: string }).code;\n if (code === 'commander.helpDisplayed' || code === 'commander.version') {\n process.exit(0);\n }\n }\n outputError(err, program.opts().json ?? false);\n process.exit(1);\n }\n}\n\nmain();\n"],"mappings":"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","names":["agentId","fs","agentId","info","fs","path","execa","home","execa","fs","path","init_env","fs","path","fs","agentId","worktreePath","sessionId","worktreeId","info","execa","fs","init_env","m","execa","info","fs","init_env","agentId","worktreeId","agentId","fs","worktreeId","execa","worktreeId","fs","path","YAML","fs","path","init_swarm","init_env","fs","path","fs","path","fs","execa","fs","execa","init_pr","agentId","manifest","agents","wt","init_worktree","init_env","path","execa","path","execa","pkg","require","fs","YAML","SAFE_NAME","fs","path","execa","fs","init_cron","createRequire","require","initCommand","spawnCommand","statusCommand","killCommand","attachCommand","agentId","logsCommand","worktreeId","aggregateCommand","mergeCommand","swarmCommand","promptCommand","listCommand","restartCommand","diffCommand","prCommand","resetCommand","cleanCommand","sendCommand","waitCommand","worktreeCreateCommand","uiCommand","installDashboardCommand","cronStartCommand","cronStopCommand","cronListCommand","cronStatusCommand","cronDaemonCommand"]}
|
|
1
|
+
{"version":3,"sources":["../src/lib/errors.ts","../src/lib/output.ts","../src/lib/paths.ts","../src/core/config.ts","../src/lib/cjs-compat.ts","../src/core/manifest.ts","../src/bundled/prompts.ts","../src/bundled/swarms.ts","../src/lib/env.ts","../src/core/tmux.ts","../src/commands/init.ts","../src/core/worktree.ts","../src/core/env.ts","../src/core/template.ts","../src/core/agent.ts","../src/lib/shell.ts","../src/core/terminal.ts","../src/lib/id.ts","../src/lib/name.ts","../src/lib/vars.ts","../src/commands/spawn.ts","../src/commands/status.ts","../src/core/pr.ts","../src/core/self.ts","../src/core/cleanup.ts","../src/commands/kill.ts","../src/commands/attach.ts","../src/commands/logs.ts","../src/commands/aggregate.ts","../src/commands/merge.ts","../src/core/swarm.ts","../src/commands/swarm.ts","../src/commands/prompt.ts","../src/commands/list.ts","../src/commands/restart.ts","../src/commands/diff.ts","../src/commands/pr.ts","../src/commands/reset.ts","../src/commands/clean.ts","../src/commands/send.ts","../src/commands/wait.ts","../src/commands/worktree.ts","../src/commands/ui.ts","../src/commands/install-dashboard.ts","../src/core/schedule.ts","../src/core/cron.ts","../src/commands/cron.ts","../src/cli.ts"],"sourcesContent":["export class PpgError extends Error {\n constructor(\n message: string,\n public readonly code: string,\n public readonly exitCode: number = 1,\n ) {\n super(message);\n this.name = 'PpgError';\n }\n}\n\nexport class TmuxNotFoundError extends PpgError {\n constructor() {\n super(\n 'tmux is not installed or not in PATH. Install it with: brew install tmux',\n 'TMUX_NOT_FOUND',\n );\n this.name = 'TmuxNotFoundError';\n }\n}\n\nexport class NotGitRepoError extends PpgError {\n constructor(dir: string) {\n super(\n `Not a git repository: ${dir}`,\n 'NOT_GIT_REPO',\n );\n this.name = 'NotGitRepoError';\n }\n}\n\nexport class NotInitializedError extends PpgError {\n constructor(dir: string) {\n super(\n `Point Guard not initialized in ${dir}. Run 'ppg init' first.`,\n 'NOT_INITIALIZED',\n );\n this.name = 'NotInitializedError';\n }\n}\n\nexport class ManifestLockError extends PpgError {\n constructor() {\n super(\n 'Could not acquire manifest lock. Another ppg process may be running.',\n 'MANIFEST_LOCK',\n );\n this.name = 'ManifestLockError';\n }\n}\n\nexport class WorktreeNotFoundError extends PpgError {\n constructor(id: string) {\n super(\n `Worktree not found: ${id}`,\n 'WORKTREE_NOT_FOUND',\n );\n this.name = 'WorktreeNotFoundError';\n }\n}\n\nexport class AgentNotFoundError extends PpgError {\n constructor(id: string) {\n super(\n `Agent not found: ${id}`,\n 'AGENT_NOT_FOUND',\n );\n this.name = 'AgentNotFoundError';\n }\n}\n\nexport class MergeFailedError extends PpgError {\n constructor(message: string) {\n super(message, 'MERGE_FAILED');\n this.name = 'MergeFailedError';\n }\n}\n\nexport class GhNotFoundError extends PpgError {\n constructor() {\n super(\n 'GitHub CLI (gh) is not installed or not in PATH. Install it with: brew install gh',\n 'GH_NOT_FOUND',\n );\n this.name = 'GhNotFoundError';\n }\n}\n\nexport class UnmergedWorkError extends PpgError {\n constructor(names: string[]) {\n const list = names.map((n) => ` ${n}`).join('\\n');\n super(\n `${names.length} worktree(s) have unmerged work that hasn't been PR'd:\\n${list}\\n\\nUse --force to reset anyway, or create PRs first with: ppg pr <worktree-id>`,\n 'UNMERGED_WORK',\n );\n this.name = 'UnmergedWorkError';\n }\n}\n","import type { AgentStatus, WorktreeStatus } from '../types/manifest.js';\n\nconst RESET = '\\x1b[0m';\nconst BOLD = '\\x1b[1m';\nconst DIM = '\\x1b[2m';\nconst RED = '\\x1b[31m';\nconst GREEN = '\\x1b[32m';\nconst YELLOW = '\\x1b[33m';\nconst BLUE = '\\x1b[34m';\nconst MAGENTA = '\\x1b[35m';\nconst CYAN = '\\x1b[36m';\nconst GRAY = '\\x1b[90m';\n\nconst STATUS_COLORS: Record<AgentStatus | WorktreeStatus, string> = {\n running: GREEN,\n idle: CYAN,\n exited: BLUE,\n gone: GRAY,\n active: GREEN,\n merging: YELLOW,\n merged: BLUE,\n failed: RED,\n cleaned: GRAY,\n};\n\nexport function formatStatus(status: AgentStatus | WorktreeStatus): string {\n const color = STATUS_COLORS[status] ?? RESET;\n return `${color}${status}${RESET}`;\n}\n\nexport function output(data: unknown, json: boolean): void {\n if (json) {\n console.log(JSON.stringify(data, null, 2));\n } else {\n console.log(data);\n }\n}\n\nexport function outputError(error: unknown, json: boolean): void {\n if (json) {\n const message = error instanceof Error ? error.message : String(error);\n const code = error instanceof Error && 'code' in error\n ? (error as { code: string }).code\n : 'UNKNOWN';\n console.error(JSON.stringify({ error: message, code }));\n } else {\n const message = error instanceof Error ? error.message : String(error);\n console.error(`${RED}Error:${RESET} ${message}`);\n }\n}\n\nexport interface Column {\n header: string;\n key: string;\n width?: number;\n format?: (value: unknown) => string;\n}\n\nexport function formatTable(rows: Record<string, unknown>[], columns: Column[]): string {\n if (rows.length === 0) return 'No results.';\n\n // Calculate column widths\n const widths = columns.map((col) => {\n const headerLen = col.header.length;\n const maxDataLen = rows.reduce((max, row) => {\n const val = col.format ? col.format(row[col.key]) : String(row[col.key] ?? '');\n // Strip ANSI for width calculation\n const stripped = val.replace(/\\x1b\\[[0-9;]*m/g, '');\n return Math.max(max, stripped.length);\n }, 0);\n return col.width ?? Math.max(headerLen, maxDataLen);\n });\n\n // Header\n const header = columns\n .map((col, i) => `${BOLD}${col.header.padEnd(widths[i])}${RESET}`)\n .join(' ');\n\n const separator = widths.map((w) => DIM + '─'.repeat(w) + RESET).join(' ');\n\n // Rows\n const body = rows.map((row) =>\n columns\n .map((col, i) => {\n const val = col.format ? col.format(row[col.key]) : String(row[col.key] ?? '');\n const stripped = val.replace(/\\x1b\\[[0-9;]*m/g, '');\n const padding = Math.max(0, widths[i] - stripped.length);\n return val + ' '.repeat(padding);\n })\n .join(' '),\n ).join('\\n');\n\n return `${header}\\n${separator}\\n${body}`;\n}\n\nexport function info(message: string): void {\n console.log(`${CYAN}▸${RESET} ${message}`);\n}\n\nexport function success(message: string): void {\n console.log(`${GREEN}✓${RESET} ${message}`);\n}\n\nexport function warn(message: string): void {\n console.log(`${YELLOW}⚠${RESET} ${message}`);\n}\n","import os from 'node:os';\nimport path from 'node:path';\n\nconst PPG_DIR = '.ppg';\n\nexport function globalPpgDir(): string {\n return path.join(os.homedir(), PPG_DIR);\n}\n\nexport function globalPromptsDir(): string {\n return path.join(globalPpgDir(), 'prompts');\n}\n\nexport function globalTemplatesDir(): string {\n return path.join(globalPpgDir(), 'templates');\n}\n\nexport function globalSwarmsDir(): string {\n return path.join(globalPpgDir(), 'swarms');\n}\n\nexport function ppgDir(projectRoot: string): string {\n return path.join(projectRoot, PPG_DIR);\n}\n\nexport function manifestPath(projectRoot: string): string {\n return path.join(ppgDir(projectRoot), 'manifest.json');\n}\n\nexport function configPath(projectRoot: string): string {\n return path.join(ppgDir(projectRoot), 'config.yaml');\n}\n\nexport function resultsDir(projectRoot: string): string {\n return path.join(ppgDir(projectRoot), 'results');\n}\n\nexport function resultFile(projectRoot: string, agentId: string): string {\n return path.join(resultsDir(projectRoot), `${agentId}.md`);\n}\n\nexport function templatesDir(projectRoot: string): string {\n return path.join(ppgDir(projectRoot), 'templates');\n}\n\nexport function logsDir(projectRoot: string): string {\n return path.join(ppgDir(projectRoot), 'logs');\n}\n\nexport function promptsDir(projectRoot: string): string {\n return path.join(ppgDir(projectRoot), 'prompts');\n}\n\nexport function swarmsDir(projectRoot: string): string {\n return path.join(ppgDir(projectRoot), 'swarms');\n}\n\nexport function promptFile(projectRoot: string, agentId: string): string {\n return path.join(promptsDir(projectRoot), `${agentId}.md`);\n}\n\nexport function agentPromptsDir(projectRoot: string): string {\n return path.join(ppgDir(projectRoot), 'agent-prompts');\n}\n\nexport function agentPromptFile(projectRoot: string, agentId: string): string {\n return path.join(agentPromptsDir(projectRoot), `${agentId}.md`);\n}\n\nexport function schedulesPath(projectRoot: string): string {\n return path.join(ppgDir(projectRoot), 'schedules.yaml');\n}\n\nexport function cronLogPath(projectRoot: string): string {\n return path.join(logsDir(projectRoot), 'cron.log');\n}\n\nexport function cronPidPath(projectRoot: string): string {\n return path.join(ppgDir(projectRoot), 'cron.pid');\n}\n\nexport function worktreeBaseDir(projectRoot: string): string {\n return path.join(projectRoot, '.worktrees');\n}\n\nexport function worktreePath(projectRoot: string, id: string): string {\n return path.join(worktreeBaseDir(projectRoot), id);\n}\n","import fs from 'node:fs/promises';\nimport YAML from 'yaml';\nimport type { Config, AgentConfig } from '../types/config.js';\nimport { configPath } from '../lib/paths.js';\n\nconst DEFAULT_CONFIG: Config = {\n sessionName: 'ppg',\n defaultAgent: 'claude',\n agents: {\n claude: {\n name: 'claude',\n command: 'claude --dangerously-skip-permissions',\n interactive: true,\n },\n codex: {\n name: 'codex',\n command: 'codex --yolo',\n interactive: true,\n },\n opencode: {\n name: 'opencode',\n command: 'opencode --yolo',\n interactive: true,\n },\n },\n envFiles: ['.env', '.env.local'],\n symlinkNodeModules: true,\n};\n\nexport async function loadConfig(projectRoot: string): Promise<Config> {\n const cfgPath = configPath(projectRoot);\n try {\n const raw = await fs.readFile(cfgPath, 'utf-8');\n const parsed = YAML.parse(raw) as Partial<Config>;\n return mergeConfig(DEFAULT_CONFIG, parsed);\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === 'ENOENT') {\n return DEFAULT_CONFIG;\n }\n throw err;\n }\n}\n\nfunction mergeConfig(defaults: Config, overrides: Partial<Config>): Config {\n const mergedAgents: Record<string, AgentConfig> = { ...defaults.agents };\n if (overrides.agents) {\n for (const [key, override] of Object.entries(overrides.agents)) {\n if (mergedAgents[key]) {\n mergedAgents[key] = { ...mergedAgents[key], ...override };\n } else {\n mergedAgents[key] = override;\n }\n }\n }\n return {\n ...defaults,\n ...overrides,\n agents: mergedAgents,\n };\n}\n\nexport async function writeDefaultConfig(projectRoot: string): Promise<void> {\n const cfgPath = configPath(projectRoot);\n const content = YAML.stringify(DEFAULT_CONFIG, { indent: 2 });\n await fs.writeFile(cfgPath, content, 'utf-8');\n}\n\nexport function resolveAgentConfig(config: Config, name?: string): AgentConfig {\n const agentName = name ?? config.defaultAgent;\n const agent = config.agents[agentName];\n if (!agent) {\n throw new Error(`Unknown agent type: ${agentName}. Available: ${Object.keys(config.agents).join(', ')}`);\n }\n return agent;\n}\n","/**\n * Dynamic import wrappers for CJS packages that may not have proper ESM exports.\n * Uses `mod.default ?? mod` pattern to handle both CJS and ESM default exports.\n */\n\nlet _lockfile: typeof import('proper-lockfile') | undefined;\nlet _writeFileAtomic: typeof import('write-file-atomic').default | undefined;\n\nexport async function getLockfile() {\n if (!_lockfile) {\n const mod = await import('proper-lockfile');\n _lockfile = (mod.default ?? mod) as typeof import('proper-lockfile');\n }\n return _lockfile;\n}\n\nexport async function getWriteFileAtomic() {\n if (!_writeFileAtomic) {\n const mod = await import('write-file-atomic');\n _writeFileAtomic = (mod.default ?? mod) as typeof import('write-file-atomic').default;\n }\n return _writeFileAtomic;\n}\n","import fs from 'node:fs/promises';\nimport { manifestPath } from '../lib/paths.js';\nimport { getLockfile, getWriteFileAtomic } from '../lib/cjs-compat.js';\nimport { ManifestLockError, NotInitializedError } from '../lib/errors.js';\nimport type { Manifest, WorktreeEntry, AgentEntry } from '../types/manifest.js';\n\nexport function createEmptyManifest(projectRoot: string, sessionName: string): Manifest {\n const now = new Date().toISOString();\n return {\n version: 1,\n projectRoot,\n sessionName,\n worktrees: {},\n createdAt: now,\n updatedAt: now,\n };\n}\n\nexport async function readManifest(projectRoot: string): Promise<Manifest> {\n const mPath = manifestPath(projectRoot);\n const raw = await fs.readFile(mPath, 'utf-8');\n return JSON.parse(raw) as Manifest;\n}\n\nexport async function requireManifest(projectRoot: string): Promise<Manifest> {\n try {\n return await readManifest(projectRoot);\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === 'ENOENT') {\n throw new NotInitializedError(projectRoot);\n }\n throw err;\n }\n}\n\nexport async function writeManifest(projectRoot: string, manifest: Manifest): Promise<void> {\n const writeFileAtomic = await getWriteFileAtomic();\n const mPath = manifestPath(projectRoot);\n manifest.updatedAt = new Date().toISOString();\n await writeFileAtomic(mPath, JSON.stringify(manifest, null, 2) + '\\n');\n}\n\nexport async function updateManifest(\n projectRoot: string,\n updater: (manifest: Manifest) => Manifest | Promise<Manifest>,\n): Promise<Manifest> {\n const lockfile = await getLockfile();\n const mPath = manifestPath(projectRoot);\n let release: (() => Promise<void>) | undefined;\n\n try {\n release = await lockfile.lock(mPath, {\n stale: 10_000,\n retries: {\n retries: 5,\n minTimeout: 100,\n maxTimeout: 1000,\n },\n });\n } catch {\n throw new ManifestLockError();\n }\n\n try {\n const manifest = await readManifest(projectRoot);\n const updated = await updater(manifest);\n await writeManifest(projectRoot, updated);\n return updated;\n } finally {\n if (release) {\n await release();\n }\n }\n}\n\nfunction getWorktree(manifest: Manifest, id: string): WorktreeEntry | undefined {\n return manifest.worktrees[id];\n}\n\nfunction findWorktreeByName(manifest: Manifest, name: string): WorktreeEntry | undefined {\n return Object.values(manifest.worktrees).find(\n (wt) => wt.name === name || wt.branch === name,\n );\n}\n\nexport function resolveWorktree(manifest: Manifest, ref: string): WorktreeEntry | undefined {\n return getWorktree(manifest, ref) ?? findWorktreeByName(manifest, ref);\n}\n\nexport function findAgent(\n manifest: Manifest,\n agentId: string,\n): { worktree: WorktreeEntry; agent: AgentEntry } | undefined {\n for (const wt of Object.values(manifest.worktrees)) {\n const agent = wt.agents[agentId];\n if (agent) {\n return { worktree: wt, agent };\n }\n }\n return undefined;\n}\n","export const bundledPrompts: Record<string, string> = {\n 'review-quality': `# Code Quality Review\n\n## What to Review\n{{CONTEXT}}\n\n## Your Focus\nYou are a senior engineer reviewing code for quality, readability, and maintainability.\n\n- Code clarity and naming conventions\n- Function and module organization\n- Error handling completeness\n- DRY violations and unnecessary complexity\n- API design and consistency\n- Documentation gaps for non-obvious logic\n\n## Output\nWrite a structured review with specific file:line references and improvement suggestions.\n`,\n 'review-security': `# Security Review\n\n## What to Review\n{{CONTEXT}}\n\n## Your Focus\nYou are a security engineer reviewing code for vulnerabilities and risks.\n\n- Input validation and sanitization\n- Injection vulnerabilities (SQL, XSS, command)\n- Authentication and authorization issues\n- Sensitive data exposure\n- Dependency vulnerabilities\n- Secrets or credentials in code\n\n## Output\nWrite a structured review with severity ratings and remediation guidance.\n`,\n 'review-regression': `# Regression & Risk Review\n\n## What to Review\n{{CONTEXT}}\n\n## Your Focus\nYou are a QA engineer reviewing code for regression risks and test coverage gaps.\n\n- Behavioral changes that could break existing functionality\n- Edge cases and boundary conditions not covered\n- Missing or inadequate test coverage\n- Integration points that may be affected\n- Data migration or compatibility concerns\n- Performance regressions\n\n## Output\nWrite a structured review with risk ratings and recommended test additions.\n`,\n};\n","export const bundledSwarms: Record<string, string> = {\n 'code-review': `name: code-review\ndescription: Multi-perspective code review\nstrategy: shared\n\nagents:\n - prompt: review-quality\n - prompt: review-security\n - prompt: review-regression\n`,\n};\n","/**\n * Augmented environment for execa calls.\n *\n * On Apple Silicon Macs, Homebrew installs to /opt/homebrew/bin/ which may not\n * be in PATH when launched from non-login shells (IDEs, GUI apps, VSCode).\n * This ensures tmux, git, and other Homebrew-installed binaries are found.\n */\n\nconst extraDirs = [\n '/opt/homebrew/bin',\n '/opt/homebrew/sbin',\n '/opt/local/bin', // MacPorts\n];\n\nconst home = process.env.HOME ?? '';\nif (home) {\n extraDirs.push(`${home}/.nix-profile/bin`);\n}\n\nconst augmentedPath = [...extraDirs, process.env.PATH].filter(Boolean).join(':');\n\nexport const execaEnv = {\n env: { PATH: augmentedPath },\n};\n","import { execa, ExecaError } from 'execa';\nimport { TmuxNotFoundError } from '../lib/errors.js';\nimport { execaEnv } from '../lib/env.js';\n\nexport async function checkTmux(): Promise<void> {\n try {\n await execa('tmux', ['-V'], execaEnv);\n } catch {\n throw new TmuxNotFoundError();\n }\n}\n\nexport async function sessionExists(name: string): Promise<boolean> {\n try {\n // Use '=' prefix for exact session name matching to avoid tmux prefix ambiguity\n await execa('tmux', ['has-session', '-t', `=${name}`], execaEnv);\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function ensureSession(name: string): Promise<void> {\n if (!(await sessionExists(name))) {\n await execa('tmux', ['new-session', '-d', '-s', name, '-x', '220', '-y', '50'], execaEnv);\n await execa('tmux', ['set-option', '-t', name, 'mouse', 'on'], execaEnv);\n await execa('tmux', ['set-option', '-t', name, 'history-limit', '50000'], execaEnv);\n }\n}\n\nexport async function createWindow(\n session: string,\n name: string,\n cwd: string,\n): Promise<string> {\n // Use '=' prefix for exact session name matching to avoid tmux prefix ambiguity\n // (e.g., 'ppg' would otherwise match both 'ppg' and 'ppg-dashboard')\n const result = await execa('tmux', [\n 'new-window',\n '-t', `=${session}`,\n '-n', name,\n '-c', cwd,\n '-P', '-F', '#{window_index}',\n ], execaEnv);\n const windowIndex = result.stdout.trim();\n return `${session}:${windowIndex}`;\n}\n\nexport async function splitPane(\n target: string,\n direction: 'horizontal' | 'vertical',\n cwd: string,\n): Promise<{ paneId: string; target: string }> {\n const flag = direction === 'horizontal' ? '-h' : '-v';\n const result = await execa('tmux', [\n 'split-window',\n flag,\n '-t', target,\n '-c', cwd,\n '-P', '-F', '#{session_name}:#{window_index}.#{pane_index}|#{pane_id}',\n ], execaEnv);\n const [canonicalTarget, paneId] = result.stdout.trim().split('|');\n return { paneId, target: canonicalTarget };\n}\n\nexport async function sendKeys(target: string, command: string): Promise<void> {\n // Send text as literal characters, then Enter as a named key.\n // Using -l sends \\n as LF (0x0a) which Ink-based CLIs like Claude Code\n // treat as text insertion. Sending 'Enter' without -l sends CR (0x0d),\n // which correctly triggers onSubmit in terminal apps.\n await execa('tmux', ['send-keys', '-t', target, '-l', command], execaEnv);\n await execa('tmux', ['send-keys', '-t', target, 'Enter'], execaEnv);\n}\n\nexport async function sendLiteral(target: string, text: string): Promise<void> {\n await execa('tmux', ['send-keys', '-t', target, '-l', text], execaEnv);\n}\n\nexport async function sendRawKeys(target: string, keys: string): Promise<void> {\n await execa('tmux', ['send-keys', '-t', target, keys], execaEnv);\n}\n\nexport async function capturePane(target: string, lines?: number): Promise<string> {\n const args = ['capture-pane', '-t', target, '-p'];\n if (lines) {\n args.push('-S', `-${lines}`);\n }\n const result = await execa('tmux', args, execaEnv);\n return result.stdout;\n}\n\nexport async function killPane(target: string): Promise<void> {\n try {\n await execa('tmux', ['kill-pane', '-t', target], execaEnv);\n } catch (err) {\n if (isTmuxNotFoundError(err)) return;\n throw err;\n }\n}\n\nexport async function killWindow(target: string): Promise<void> {\n try {\n await execa('tmux', ['kill-window', '-t', target], execaEnv);\n } catch (err) {\n if (isTmuxNotFoundError(err)) return;\n throw err;\n }\n}\n\n/**\n * Check if a tmux error is a benign \"not found\" error (target already dead/gone).\n * Returns true for errors that should be silently ignored.\n */\nfunction isTmuxNotFoundError(err: unknown): boolean {\n if (!(err instanceof ExecaError)) return false;\n const msg = (String(err.stderr ?? '')).toLowerCase();\n return msg.includes(\"can't find\") ||\n msg.includes('not found') ||\n msg.includes('no such') ||\n msg.includes('session not found') ||\n msg.includes('window not found') ||\n msg.includes('pane not found');\n}\n\nexport interface PaneInfo {\n paneId: string;\n panePid: string;\n currentCommand: string;\n isDead: boolean;\n deadStatus?: number;\n}\n\nasync function listPanes(target: string): Promise<PaneInfo[]> {\n try {\n const result = await execa('tmux', [\n 'list-panes',\n '-t', target,\n '-F', '#{pane_id}|#{pane_pid}|#{pane_current_command}|#{pane_dead}|#{pane_dead_status}',\n ], execaEnv);\n return result.stdout.trim().split('\\n').filter(Boolean).map((line) => {\n const [paneId, panePid, currentCommand, dead, deadStatus] = line.split('|');\n return {\n paneId,\n panePid,\n currentCommand,\n isDead: dead === '1',\n deadStatus: deadStatus ? parseInt(deadStatus, 10) : undefined,\n };\n });\n } catch {\n return [];\n }\n}\n\nexport async function getPaneInfo(target: string): Promise<PaneInfo | null> {\n try {\n const result = await execa('tmux', [\n 'display-message',\n '-t', target,\n '-p',\n '#{pane_id}|#{pane_pid}|#{pane_current_command}|#{pane_dead}|#{pane_dead_status}',\n ], execaEnv);\n const [paneId, panePid, currentCommand, dead, deadStatus] = result.stdout.trim().split('|');\n return {\n paneId,\n panePid,\n currentCommand,\n isDead: dead === '1',\n deadStatus: deadStatus ? parseInt(deadStatus, 10) : undefined,\n };\n } catch {\n return null;\n }\n}\n\n/**\n * List all panes in a session with a single tmux call.\n * Returns a map keyed by pane target (session:window.pane format).\n */\nexport async function listSessionPanes(session: string): Promise<Map<string, PaneInfo>> {\n const map = new Map<string, PaneInfo>();\n try {\n const result = await execa('tmux', [\n 'list-panes',\n '-s',\n '-t', `=${session}`,\n '-F', '#{session_name}:#{window_index}.#{pane_index}|#{pane_id}|#{pane_pid}|#{pane_current_command}|#{pane_dead}|#{pane_dead_status}',\n ], execaEnv);\n for (const line of result.stdout.trim().split('\\n').filter(Boolean)) {\n const [target, paneId, panePid, currentCommand, dead, deadStatus] = line.split('|');\n const info: PaneInfo = {\n paneId,\n panePid,\n currentCommand,\n isDead: dead === '1',\n deadStatus: deadStatus ? parseInt(deadStatus, 10) : undefined,\n };\n // Index by multiple target formats for flexible lookup\n map.set(target, info); // session:window.pane\n map.set(paneId, info); // %paneId\n const dotIdx = target.lastIndexOf('.');\n if (dotIdx !== -1) {\n map.set(target.slice(0, dotIdx), info); // session:window\n }\n }\n } catch {\n // Session may not exist\n }\n return map;\n}\n\nexport interface WindowInfo {\n index: number;\n name: string;\n}\n\n/**\n * List all windows in a tmux session.\n * Returns window index and name for each window.\n */\nexport async function listSessionWindows(session: string): Promise<WindowInfo[]> {\n try {\n const result = await execa('tmux', [\n 'list-windows',\n '-t', `=${session}`,\n '-F', '#{window_index} #{window_name}',\n ], execaEnv);\n return result.stdout.trim().split('\\n').filter(Boolean).map((line) => {\n const spaceIdx = line.indexOf(' ');\n return {\n index: parseInt(line.slice(0, spaceIdx), 10),\n name: line.slice(spaceIdx + 1),\n };\n });\n } catch {\n return [];\n }\n}\n\n/**\n * Kill all non-base windows in a session (orphan cleanup).\n * Window 0 is preserved as the base shell window.\n * If selfPaneId is provided, windows containing that pane are skipped.\n * Returns the number of windows killed.\n */\nexport async function killOrphanWindows(\n session: string,\n selfPaneId?: string | null,\n): Promise<number> {\n const windows = await listSessionWindows(session);\n let killed = 0;\n\n // Build pane map for self-protection if needed\n let paneMap: Map<string, PaneInfo> | undefined;\n if (selfPaneId) {\n paneMap = await listSessionPanes(session);\n }\n\n for (const win of windows) {\n if (win.index === 0) continue;\n\n // Self-protection: skip windows containing the current process\n if (selfPaneId && paneMap) {\n const windowTarget = `${session}:${win.index}`;\n let containsSelf = false;\n for (const [key, info] of paneMap) {\n if (key.startsWith(windowTarget + '.') && info.paneId === selfPaneId) {\n containsSelf = true;\n break;\n }\n if (key === windowTarget && info.paneId === selfPaneId) {\n containsSelf = true;\n break;\n }\n }\n if (containsSelf) continue;\n }\n\n try {\n await killWindow(`${session}:${win.index}`);\n killed++;\n } catch {\n // Already gone — fine\n }\n }\n return killed;\n}\n\nexport async function selectWindow(target: string): Promise<void> {\n await execa('tmux', ['select-window', '-t', target], execaEnv);\n}\n\nexport async function isInsideTmux(): Promise<boolean> {\n return !!process.env.TMUX;\n}\n\nexport async function sendCtrlC(target: string): Promise<void> {\n await execa('tmux', ['send-keys', '-t', target, 'C-c'], execaEnv);\n}\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { execa } from 'execa';\nimport { ppgDir, resultsDir, logsDir, templatesDir, promptsDir, promptFile, swarmsDir, manifestPath, agentPromptsDir, configPath } from '../lib/paths.js';\nimport { NotGitRepoError } from '../lib/errors.js';\nimport { success, info } from '../lib/output.js';\nimport { writeDefaultConfig } from '../core/config.js';\nimport { createEmptyManifest, writeManifest } from '../core/manifest.js';\nimport { bundledPrompts } from '../bundled/prompts.js';\nimport { bundledSwarms } from '../bundled/swarms.js';\nimport { execaEnv } from '../lib/env.js';\nimport { checkTmux } from '../core/tmux.js';\n\nconst CONDUCTOR_CONTEXT = `# PPG Conductor Context\n\nYou are operating on the master branch of a ppg-managed project.\n\n## When to Use ppg\nUse \\`ppg spawn\\` whenever you want work to appear in the **ppg dashboard** — parallel tasks, code reviews,\nbatch issue work, multi-agent swarms. Agents spawned through ppg run in tmux panes the user can monitor,\ninteract with, and manage. Available agent types: \\`claude\\` (default), \\`codex\\`, \\`opencode\\` via \\`--agent\\`.\n\nDirect edits, quick commands, and research are fine to do yourself — not everything needs an agent.\nNever run \\`claude\\`, \\`codex\\`, or \\`opencode\\` directly as bash commands — they won't appear in the dashboard.\n\n## Quick Reference\n- \\`ppg spawn --name <name> --prompt \"<task>\" --json\\` — Spawn worktree + agent\n- \\`ppg spawn --name <name> --agent codex --prompt \"<task>\" --json\\` — Use Codex agent\n- \\`ppg spawn --name <name> --agent opencode --prompt \"<task>\" --json\\` — Use OpenCode agent\n- \\`ppg spawn --worktree <id> --agent codex --prompt \"review --base main\" --json\\` — Codex review\n- \\`ppg status --json\\` — Check statuses\n- \\`ppg aggregate --all --json\\` — Collect results (includes PR URLs)\n- \\`ppg kill --agent <id> --json\\` — Kill agent\n- \\`ppg reset --json\\` — Clean up all worktrees (skips worktrees with open PRs)\n\n## Workflow\n1. Break request into parallelizable tasks\n2. Spawn: \\`ppg spawn --name <name> --prompt \"<prompt>\" --json\\`\n3. Poll: \\`ppg status --json\\` every 5s\n4. Aggregate: \\`ppg aggregate --all --json\\` — result files include PR URLs\n5. Present PR links and summaries — let user decide next steps\n6. To merge remotely: \\`gh pr merge <url> --squash --delete-branch\\`\n7. To merge locally (power-user): \\`ppg merge <wt-id> --json\\`\n8. Cleanup: \\`ppg reset --json\\` (skips worktrees with open PRs)\n\nEach agent prompt must be self-contained — agents have no memory of this conversation.\nAlways use \\`--json\\`.\n`;\n\nconst DEFAULT_TEMPLATE = `# Task: {{TASK_NAME}}\n\n## Context\nYou are working in a git worktree at: {{WORKTREE_PATH}}\nBranch: {{BRANCH}}\nProject root: {{PROJECT_ROOT}}\n\n## Instructions\n{{PROMPT}}\n`;\n\nexport async function initCommand(options: { json?: boolean }): Promise<void> {\n const cwd = process.cwd();\n\n // 1. Verify git repo\n let projectRoot: string;\n try {\n const result = await execa('git', ['rev-parse', '--show-toplevel'], { ...execaEnv, cwd });\n projectRoot = result.stdout.trim();\n } catch {\n throw new NotGitRepoError(cwd);\n }\n\n // 2. Check tmux available\n await checkTmux();\n\n // 3. Create directories\n const dirs = [\n ppgDir(projectRoot),\n resultsDir(projectRoot),\n logsDir(projectRoot),\n templatesDir(projectRoot),\n promptsDir(projectRoot),\n agentPromptsDir(projectRoot),\n swarmsDir(projectRoot),\n ];\n\n for (const dir of dirs) {\n await fs.mkdir(dir, { recursive: true });\n }\n\n info('Created .ppg/ directory structure');\n\n // 4. Write default config (skip if exists)\n const cfgPath = configPath(projectRoot);\n try {\n await fs.access(cfgPath);\n info('config.yaml already exists, skipping');\n } catch {\n await writeDefaultConfig(projectRoot);\n info('Wrote default config.yaml');\n }\n\n // 5. Write empty manifest\n const dirName = path.basename(projectRoot);\n const sessionName = `ppg-${dirName}`;\n const manifest = createEmptyManifest(projectRoot, sessionName);\n await writeManifest(projectRoot, manifest);\n info('Wrote empty manifest.json');\n\n // 6. Update .gitignore\n await updateGitignore(projectRoot);\n info('Updated .gitignore');\n\n // 7. Write sample template\n const templatePath = path.join(templatesDir(projectRoot), 'default.md');\n try {\n await fs.access(templatePath);\n } catch {\n await fs.writeFile(templatePath, DEFAULT_TEMPLATE, 'utf-8');\n info('Wrote sample template: default.md');\n }\n\n // 8. Write bundled prompt files\n for (const [name, content] of Object.entries(bundledPrompts)) {\n const pPath = promptFile(projectRoot, name);\n try {\n await fs.access(pPath);\n } catch {\n await fs.writeFile(pPath, content, 'utf-8');\n info(`Wrote prompt: ${name}.md`);\n }\n }\n\n // 9. Write bundled swarm templates\n for (const [name, content] of Object.entries(bundledSwarms)) {\n const sPath = path.join(swarmsDir(projectRoot), `${name}.yaml`);\n try {\n await fs.access(sPath);\n } catch {\n await fs.writeFile(sPath, content, 'utf-8');\n info(`Wrote swarm template: ${name}.yaml`);\n }\n }\n\n // 10. Write conductor context\n const conductorPath = path.join(ppgDir(projectRoot), 'conductor-context.md');\n await fs.writeFile(conductorPath, CONDUCTOR_CONTEXT, 'utf-8');\n info('Wrote conductor-context.md');\n\n // 11. Register Claude Code plugin\n const pluginRegistered = await registerClaudePlugin();\n if (pluginRegistered) {\n info('Registered ppg Claude Code plugin');\n }\n\n if (options.json) {\n console.log(JSON.stringify({\n success: true,\n projectRoot,\n sessionName,\n ppgDir: ppgDir(projectRoot),\n pluginRegistered,\n }));\n } else {\n success(`Point Guard initialized in ${projectRoot}`);\n }\n}\n\nasync function registerClaudePlugin(): Promise<boolean> {\n try {\n const home = process.env.HOME;\n if (!home) return false;\n\n const skillsDir = path.join(home, '.claude', 'skills');\n\n // Find this package's skills directory\n // Works from both dist/cli.js (../skills/) and src/commands/init.ts (../../skills/)\n const __dirname = path.dirname(fileURLToPath(import.meta.url));\n let srcSkillsDir = path.resolve(__dirname, '..', 'skills');\n try {\n await fs.access(srcSkillsDir);\n } catch {\n srcSkillsDir = path.resolve(__dirname, '..', '..', 'skills');\n try {\n await fs.access(srcSkillsDir);\n } catch {\n return false;\n }\n }\n\n // Copy skills to ~/.claude/skills/\n await fs.mkdir(skillsDir, { recursive: true });\n const skillFolders = ['ppg', 'ppg-conductor'];\n let copied = false;\n\n for (const folder of skillFolders) {\n const srcDir = path.join(srcSkillsDir, folder);\n const destDir = path.join(skillsDir, folder);\n\n try {\n await fs.access(srcDir);\n } catch {\n continue;\n }\n\n // Copy recursively (overwrite existing)\n await fs.cp(srcDir, destDir, { recursive: true, force: true });\n copied = true;\n }\n\n return copied;\n } catch {\n // Non-fatal — skill installation is best-effort\n return false;\n }\n}\n\nasync function updateGitignore(projectRoot: string): Promise<void> {\n const gitignorePath = path.join(projectRoot, '.gitignore');\n const entriesToAdd = [\n '.ppg/results/',\n '.ppg/logs/',\n '.ppg/manifest.json',\n '.ppg/prompts/',\n '.ppg/agent-prompts/',\n '.ppg/swarms/',\n '.ppg/conductor-context.md',\n ];\n\n let content = '';\n try {\n content = await fs.readFile(gitignorePath, 'utf-8');\n } catch {\n // No .gitignore yet\n }\n\n const lines = content.split('\\n');\n const toAdd = entriesToAdd.filter((entry) => !lines.includes(entry));\n\n if (toAdd.length > 0) {\n const addition = (content.endsWith('\\n') || content === '' ? '' : '\\n')\n + '\\n# Point Guard\\n'\n + toAdd.join('\\n')\n + '\\n';\n await fs.appendFile(gitignorePath, addition, 'utf-8');\n }\n}\n","import { execa } from 'execa';\nimport { worktreePath as getWorktreePath } from '../lib/paths.js';\nimport { NotGitRepoError } from '../lib/errors.js';\nimport { execaEnv } from '../lib/env.js';\n\nexport async function getRepoRoot(cwd?: string): Promise<string> {\n try {\n const result = await execa('git', ['rev-parse', '--show-toplevel'], {\n ...execaEnv,\n cwd: cwd ?? process.cwd(),\n });\n return result.stdout.trim();\n } catch {\n throw new NotGitRepoError(cwd ?? process.cwd());\n }\n}\n\nexport async function getCurrentBranch(cwd?: string): Promise<string> {\n const result = await execa('git', ['branch', '--show-current'], {\n ...execaEnv,\n cwd: cwd ?? process.cwd(),\n });\n return result.stdout.trim();\n}\n\nexport interface CreateWorktreeOptions {\n branch: string;\n base?: string;\n}\n\nexport async function createWorktree(\n repoRoot: string,\n id: string,\n options: CreateWorktreeOptions,\n): Promise<string> {\n const wtPath = getWorktreePath(repoRoot, id);\n const args = ['worktree', 'add', wtPath, '-b', options.branch];\n if (options.base) {\n args.push(options.base);\n }\n await execa('git', args, { ...execaEnv, cwd: repoRoot });\n return wtPath;\n}\n\nexport async function adoptWorktree(\n repoRoot: string,\n id: string,\n branch: string,\n): Promise<string> {\n const wtPath = getWorktreePath(repoRoot, id);\n await execa('git', ['worktree', 'add', wtPath, branch], { ...execaEnv, cwd: repoRoot });\n return wtPath;\n}\n\nexport async function removeWorktree(\n repoRoot: string,\n wtPath: string,\n options?: { force?: boolean; deleteBranch?: boolean; branchName?: string },\n): Promise<void> {\n const args = ['worktree', 'remove', wtPath];\n if (options?.force) {\n args.push('--force');\n }\n await execa('git', args, { ...execaEnv, cwd: repoRoot });\n\n if (options?.deleteBranch && options.branchName) {\n try {\n await execa('git', ['branch', '-D', options.branchName], { ...execaEnv, cwd: repoRoot });\n } catch {\n // Branch may not exist\n }\n }\n}\n\nasync function listWorktrees(repoRoot: string): Promise<string[]> {\n const result = await execa('git', ['worktree', 'list', '--porcelain'], { ...execaEnv, cwd: repoRoot });\n return result.stdout\n .split('\\n')\n .filter((line) => line.startsWith('worktree '))\n .map((line) => line.replace('worktree ', ''));\n}\n\nexport async function pruneWorktrees(repoRoot: string): Promise<void> {\n await execa('git', ['worktree', 'prune'], { ...execaEnv, cwd: repoRoot });\n}\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport type { Config } from '../types/config.js';\n\nexport async function setupWorktreeEnv(\n projectRoot: string,\n wtPath: string,\n config: Config,\n): Promise<void> {\n // Copy .env files\n for (const envFile of config.envFiles) {\n const src = path.join(projectRoot, envFile);\n const dest = path.join(wtPath, envFile);\n try {\n await fs.access(src);\n await fs.copyFile(src, dest);\n } catch {\n // Source env file doesn't exist, skip\n }\n }\n\n // Symlink node_modules\n if (config.symlinkNodeModules) {\n const src = path.join(projectRoot, 'node_modules');\n const dest = path.join(wtPath, 'node_modules');\n try {\n await fs.access(src);\n // Check if dest already exists\n try {\n await fs.lstat(dest);\n // Already exists, skip\n } catch {\n await fs.symlink(src, dest, 'dir');\n }\n } catch {\n // Source node_modules doesn't exist, skip\n }\n }\n}\n\nexport async function teardownWorktreeEnv(wtPath: string): Promise<void> {\n // Remove node_modules symlink before worktree deletion\n const nmPath = path.join(wtPath, 'node_modules');\n try {\n const stat = await fs.lstat(nmPath);\n if (stat.isSymbolicLink()) {\n await fs.unlink(nmPath);\n }\n } catch {\n // Not a symlink or doesn't exist\n }\n}\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport { templatesDir, globalTemplatesDir } from '../lib/paths.js';\n\nexport interface TemplateEntry {\n name: string;\n source: 'local' | 'global';\n}\n\nasync function readMdNames(dir: string): Promise<string[]> {\n try {\n const files = await fs.readdir(dir);\n return files.filter((f) => f.endsWith('.md')).map((f) => f.replace(/\\.md$/, ''));\n } catch {\n return [];\n }\n}\n\nexport async function listTemplates(projectRoot: string): Promise<string[]> {\n const entries = await listTemplatesWithSource(projectRoot);\n return entries.map((e) => e.name);\n}\n\nexport async function listTemplatesWithSource(projectRoot: string): Promise<TemplateEntry[]> {\n const localNames = await readMdNames(templatesDir(projectRoot));\n const globalNames = await readMdNames(globalTemplatesDir());\n\n const seen = new Set<string>();\n const result: TemplateEntry[] = [];\n\n for (const name of localNames) {\n seen.add(name);\n result.push({ name, source: 'local' });\n }\n\n for (const name of globalNames) {\n if (!seen.has(name)) {\n result.push({ name, source: 'global' });\n }\n }\n\n return result;\n}\n\nexport async function loadTemplate(projectRoot: string, name: string): Promise<string> {\n // Try project-local first\n const localPath = path.join(templatesDir(projectRoot), `${name}.md`);\n try {\n return await fs.readFile(localPath, 'utf-8');\n } catch {\n // Fall back to global\n const globalPath = path.join(globalTemplatesDir(), `${name}.md`);\n return fs.readFile(globalPath, 'utf-8');\n }\n}\n\nexport interface TemplateContext {\n WORKTREE_PATH: string;\n BRANCH: string;\n AGENT_ID: string;\n PROJECT_ROOT: string;\n TASK_NAME?: string;\n PROMPT?: string;\n [key: string]: string | undefined;\n}\n\nexport function renderTemplate(content: string, context: TemplateContext): string {\n return content.replace(/\\{\\{(\\w+)\\}\\}/g, (_match, key: string) => {\n return context[key] ?? `{{${key}}}`;\n });\n}\n","import fs from 'node:fs/promises';\nimport { agentPromptFile, agentPromptsDir } from '../lib/paths.js';\nimport { getPaneInfo, listSessionPanes, type PaneInfo } from './tmux.js';\nimport { updateManifest } from './manifest.js';\nimport { PpgError } from '../lib/errors.js';\nimport type { AgentEntry, AgentStatus } from '../types/manifest.js';\nimport type { AgentConfig } from '../types/config.js';\nimport * as tmux from './tmux.js';\n\nconst SHELL_COMMANDS = new Set(['bash', 'zsh', 'sh', 'fish', 'dash', 'tcsh', 'csh']);\n\nexport interface SpawnAgentOptions {\n agentId: string;\n agentConfig: AgentConfig;\n prompt: string;\n worktreePath: string;\n tmuxTarget: string;\n projectRoot: string;\n branch: string;\n sessionId?: string;\n}\n\nexport async function spawnAgent(options: SpawnAgentOptions): Promise<AgentEntry> {\n const {\n agentId,\n agentConfig,\n prompt,\n tmuxTarget,\n projectRoot,\n } = options;\n\n // Write prompt to file\n const pFile = agentPromptFile(projectRoot, agentId);\n await fs.mkdir(agentPromptsDir(projectRoot), { recursive: true });\n await fs.writeFile(pFile, prompt, 'utf-8');\n\n // Build and send command\n const command = buildAgentCommand(agentConfig, pFile, options.sessionId);\n await tmux.sendKeys(tmuxTarget, command);\n\n return {\n id: agentId,\n name: agentConfig.name,\n agentType: agentConfig.name,\n status: 'running',\n tmuxTarget,\n prompt: prompt.slice(0, 500), // Truncate for manifest storage\n startedAt: new Date().toISOString(),\n ...(options.sessionId ? { sessionId: options.sessionId } : {}),\n };\n}\n\nfunction buildAgentCommand(agentConfig: AgentConfig, promptFilePath: string, sessionId?: string): string {\n // Unset CLAUDECODE so spawned Claude instances don't think they're nested\n const envPrefix = 'unset CLAUDECODE;';\n const { command, promptFlag } = agentConfig;\n // Inject --session-id for Claude-based commands\n const sessionFlag = sessionId && command.includes('claude') ? ` --session-id ${sessionId}` : '';\n // Single-quote the path inside $(cat ...) to handle spaces safely\n const catExpr = `\"$(cat '${promptFilePath}')\"`;\n if (promptFlag) {\n // Use explicit flag: command --flag \"$(cat 'prompt-file')\"\n return `${envPrefix} ${command}${sessionFlag} ${promptFlag} ${catExpr}`;\n }\n // Pass prompt as positional argument: command \"$(cat 'prompt-file')\"\n return `${envPrefix} ${command}${sessionFlag} ${catExpr}`;\n}\n\n/**\n * Check agent status by reading live tmux pane state.\n * Every call re-derives status from the pane — no cached terminal states.\n *\n * 1. getPaneInfo() → null → 'gone'\n * 2. pane.isDead → 'exited' (store exitCode)\n * 3. SHELL_COMMANDS.has(pane.currentCommand) → 'idle'\n * 4. otherwise → 'running'\n *\n * @param paneMap Optional pre-fetched pane map from listSessionPanes() for batch queries\n */\nexport async function checkAgentStatus(\n agent: AgentEntry,\n _projectRoot: string,\n paneMap?: Map<string, PaneInfo>,\n): Promise<{ status: AgentStatus; exitCode?: number }> {\n // 1. Check if tmux pane exists (use batch map if available)\n const paneInfo = paneMap\n ? (paneMap.get(agent.tmuxTarget) ?? null)\n : await getPaneInfo(agent.tmuxTarget);\n if (!paneInfo) {\n return { status: 'gone' };\n }\n\n // 2. Check if pane is dead\n if (paneInfo.isDead) {\n return { status: 'exited', exitCode: paneInfo.deadStatus };\n }\n\n // 3. Check if current command is a shell (agent process exited, returned to shell)\n if (SHELL_COMMANDS.has(paneInfo.currentCommand)) {\n return { status: 'idle' };\n }\n\n // 4. Still running\n return { status: 'running' };\n}\n\nexport async function refreshAllAgentStatuses(\n manifest: import('../types/manifest.js').Manifest,\n projectRoot: string,\n): Promise<import('../types/manifest.js').Manifest> {\n // Batch-fetch all pane info in a single tmux call\n const paneMap = await listSessionPanes(manifest.sessionName);\n\n // Collect all agents that need checking\n const checks: Array<{ agent: AgentEntry; promise: Promise<{ status: AgentStatus; exitCode?: number }> }> = [];\n for (const wt of Object.values(manifest.worktrees)) {\n for (const agent of Object.values(wt.agents)) {\n checks.push({\n agent,\n promise: checkAgentStatus(agent, projectRoot, paneMap),\n });\n }\n }\n\n // Run all status checks in parallel\n const results = await Promise.all(checks.map((c) => c.promise));\n\n // Apply results\n for (let i = 0; i < checks.length; i++) {\n const { agent } = checks[i];\n const { status, exitCode } = results[i];\n agent.status = status;\n if (exitCode !== undefined) agent.exitCode = exitCode;\n }\n\n // Check worktree directories in parallel\n const wtChecks = Object.values(manifest.worktrees)\n .filter((wt) => wt.status === 'active')\n .map(async (wt) => {\n const exists = await fileExists(wt.path);\n if (!exists) {\n wt.status = 'cleaned';\n for (const agent of Object.values(wt.agents)) {\n agent.status = 'gone';\n }\n }\n });\n await Promise.all(wtChecks);\n\n return manifest;\n}\n\nexport interface ResumeAgentOptions {\n agent: AgentEntry;\n worktreeId: string;\n sessionName: string;\n cwd: string;\n windowName: string;\n projectRoot: string;\n}\n\n/**\n * Resume a dead agent's session in a new tmux window, updating the manifest.\n * Returns the new tmux target.\n */\nexport async function resumeAgent(options: ResumeAgentOptions): Promise<string> {\n const { agent, worktreeId, sessionName, cwd, windowName, projectRoot } = options;\n\n if (!agent.sessionId) {\n throw new PpgError(\n `Agent ${agent.id} has no session ID. Cannot resume agents spawned before session tracking was added.`,\n 'NO_SESSION_ID',\n );\n }\n\n await tmux.ensureSession(sessionName);\n const newTarget = await tmux.createWindow(sessionName, windowName, cwd);\n await tmux.sendKeys(newTarget, `unset CLAUDECODE; claude --resume ${agent.sessionId}`);\n\n await updateManifest(projectRoot, (m) => {\n const mAgent = m.worktrees[worktreeId]?.agents[agent.id];\n if (mAgent) {\n mAgent.tmuxTarget = newTarget;\n mAgent.status = 'running';\n }\n return m;\n });\n\n return newTarget;\n}\n\nexport async function killAgent(agent: AgentEntry): Promise<void> {\n // Check if pane exists before attempting to kill\n const initialInfo = await getPaneInfo(agent.tmuxTarget);\n if (!initialInfo || initialInfo.isDead) return;\n\n // Send Ctrl-C first (pane may die between check and send)\n try {\n await tmux.sendCtrlC(agent.tmuxTarget);\n } catch {\n // Pane died between check and send — already gone\n return;\n }\n\n // Wait for graceful shutdown (Claude Code needs more time)\n await new Promise((resolve) => setTimeout(resolve, 2000));\n\n // Check if still alive\n const paneInfo = await getPaneInfo(agent.tmuxTarget);\n if (paneInfo && !paneInfo.isDead) {\n // Kill the pane\n await tmux.killPane(agent.tmuxTarget);\n }\n}\n\n/**\n * Kill multiple agents in parallel: send Ctrl-C to all, wait once, then force-kill survivors.\n */\nexport async function killAgents(agents: AgentEntry[]): Promise<void> {\n if (agents.length === 0) return;\n\n // Filter to only agents with live panes\n const alive: AgentEntry[] = [];\n await Promise.all(agents.map(async (a) => {\n const info = await getPaneInfo(a.tmuxTarget);\n if (info && !info.isDead) alive.push(a);\n }));\n if (alive.length === 0) return;\n\n // Send Ctrl-C to all live agents in parallel (catch pane-died-between-check-and-send)\n await Promise.all(alive.map((a) => tmux.sendCtrlC(a.tmuxTarget).catch(() => {})));\n\n // Wait for graceful shutdown (Claude Code needs more time)\n await new Promise((resolve) => setTimeout(resolve, 2000));\n\n // Check and force-kill survivors in parallel\n await Promise.all(alive.map(async (a) => {\n const paneInfo = await getPaneInfo(a.tmuxTarget);\n if (paneInfo && !paneInfo.isDead) {\n await tmux.killPane(a.tmuxTarget);\n }\n }));\n}\n\nasync function fileExists(filePath: string): Promise<boolean> {\n try {\n await fs.access(filePath);\n return true;\n } catch {\n return false;\n }\n}\n","/**\n * Escape a string for safe use with tmux send-keys -l (literal mode).\n * In literal mode, most characters are safe. We only need to handle\n * edge cases like leading dashes which tmux interprets as flags.\n */\nexport function escapeTmuxLiteral(text: string): string {\n let result = text;\n if (result.startsWith('-')) {\n result = '\\\\' + result;\n }\n return result;\n}\n\n/**\n * Shell-escape a string for use inside double quotes.\n */\nexport function shellEscape(text: string): string {\n return text\n .replace(/\\\\/g, '\\\\\\\\')\n .replace(/\"/g, '\\\\\"')\n .replace(/\\$/g, '\\\\$')\n .replace(/`/g, '\\\\`');\n}\n","import { execa } from 'execa';\nimport { warn } from '../lib/output.js';\nimport { shellEscape } from '../lib/shell.js';\n\n/**\n * Open a new Terminal.app window that attaches to a specific tmux session/window.\n */\nexport async function openTerminalWindow(\n sessionName: string,\n windowTarget: string,\n title: string,\n): Promise<void> {\n // Source shell profiles so tmux is found on M-series Macs where\n // /opt/homebrew/bin is not in the default GUI app / Terminal.app PATH.\n // Escape values for safe interpolation inside AppleScript double-quoted strings.\n const safeSession = shellEscape(sessionName);\n const safeWindow = shellEscape(windowTarget);\n const safeTitle = shellEscape(title);\n const tmuxCmd = `if [ -x /usr/libexec/path_helper ]; then eval $(/usr/libexec/path_helper -s); fi; [ -f ~/.zprofile ] && source ~/.zprofile; [ -f ~/.zshrc ] && source ~/.zshrc; tmux attach-session -t ${safeSession} \\\\\\\\; select-window -t ${safeWindow}`;\n\n const script = `\ntell application \"Terminal\"\n activate\n set newTab to do script \"${tmuxCmd}\"\n set custom title of newTab to \"${safeTitle}\"\nend tell\n`;\n\n try {\n await execa('osascript', ['-e', script]);\n } catch (err) {\n warn(`Could not open Terminal window for \"${title}\": ${err instanceof Error ? err.message : err}`);\n }\n}\n","import { randomUUID } from 'node:crypto';\nimport { customAlphabet } from 'nanoid';\n\nconst alphabet = 'abcdefghijklmnopqrstuvwxyz0123456789';\n\nconst shortId = customAlphabet(alphabet, 6);\nconst longId = customAlphabet(alphabet, 8);\n\nexport function worktreeId(): string {\n return `wt-${shortId()}`;\n}\n\nexport function agentId(): string {\n return `ag-${longId()}`;\n}\n\nexport function sessionId(): string {\n return randomUUID();\n}\n","/**\n * Normalize a user-provided name into a valid git branch name component.\n *\n * Used to sanitize `--name` values before they become part of `ppg/<name>` branches.\n */\nexport function normalizeName(raw: string, fallback: string): string {\n const name = raw\n .toLowerCase()\n // Control characters → removed\n .replace(/[\\x00-\\x1f\\x7f]+/g, '')\n // Spaces and underscores → hyphens\n .replace(/[\\s_]+/g, '-')\n // Git-invalid chars → hyphens\n .replace(/[~^:?*[\\]\\\\@{}<>]+/g, '-')\n // Collapse `..` → single dot\n .replace(/\\.{2,}/g, '.')\n // Collapse consecutive hyphens → single hyphen\n .replace(/-{2,}/g, '-')\n // Split on slash, normalize each segment, rejoin\n .split('/')\n .map(normalizeSegment)\n .filter(Boolean)\n .join('/');\n\n return name || fallback;\n}\n\nfunction normalizeSegment(segment: string): string {\n let s = segment;\n\n // Strip `.lock` suffix repeatedly (before trimming dots, so `.lock` → empty)\n while (s.endsWith('.lock')) {\n s = s.slice(0, -5);\n }\n\n // Strip leading/trailing hyphens and dots\n s = s.replace(/^[-.]+|[-.]+$/g, '');\n\n return s;\n}\n","import { PpgError } from './errors.js';\n\n/**\n * Parse CLI --var KEY=value arguments into a record.\n * Throws INVALID_ARGS if any entry is missing '=' or has an empty key.\n */\nexport function parseVars(vars: string[]): Record<string, string> {\n const result: Record<string, string> = {};\n for (const v of vars) {\n const eqIdx = v.indexOf('=');\n if (eqIdx < 1) {\n throw new PpgError(`Invalid --var format: \"${v}\" — expected KEY=value`, 'INVALID_ARGS');\n }\n result[v.slice(0, eqIdx)] = v.slice(eqIdx + 1);\n }\n return result;\n}\n","import fs from 'node:fs/promises';\nimport { loadConfig, resolveAgentConfig } from '../core/config.js';\nimport { readManifest, updateManifest, resolveWorktree } from '../core/manifest.js';\nimport { getRepoRoot, getCurrentBranch, createWorktree, adoptWorktree } from '../core/worktree.js';\nimport { setupWorktreeEnv } from '../core/env.js';\nimport { loadTemplate, renderTemplate, type TemplateContext } from '../core/template.js';\nimport { spawnAgent } from '../core/agent.js';\nimport * as tmux from '../core/tmux.js';\nimport { openTerminalWindow } from '../core/terminal.js';\nimport { worktreeId as genWorktreeId, agentId as genAgentId, sessionId as genSessionId } from '../lib/id.js';\nimport { manifestPath } from '../lib/paths.js';\nimport { PpgError, NotInitializedError, WorktreeNotFoundError } from '../lib/errors.js';\nimport { output, success, info } from '../lib/output.js';\nimport { normalizeName } from '../lib/name.js';\nimport { parseVars } from '../lib/vars.js';\nimport type { WorktreeEntry, AgentEntry } from '../types/manifest.js';\n\nexport interface SpawnOptions {\n name?: string;\n agent?: string;\n prompt?: string;\n promptFile?: string;\n template?: string;\n var?: string[];\n base?: string;\n branch?: string;\n worktree?: string;\n count?: number;\n split?: boolean;\n open?: boolean;\n json?: boolean;\n}\n\nexport async function spawnCommand(options: SpawnOptions): Promise<void> {\n const projectRoot = await getRepoRoot();\n const config = await loadConfig(projectRoot);\n\n // Verify initialized (lightweight file check instead of full manifest read)\n try {\n await fs.access(manifestPath(projectRoot));\n } catch {\n throw new NotInitializedError(projectRoot);\n }\n\n const agentConfig = resolveAgentConfig(config, options.agent);\n const count = options.count ?? 1;\n\n // Validate vars early — before any side effects (worktree/tmux creation)\n const userVars = parseVars(options.var ?? []);\n\n // Resolve prompt\n const promptText = await resolvePrompt(options, projectRoot);\n\n // Validate conflicting flags\n if (options.branch && options.worktree) {\n throw new PpgError('--branch and --worktree are mutually exclusive', 'INVALID_ARGS');\n }\n if (options.branch && options.base) {\n throw new PpgError('--branch and --base are mutually exclusive (--base is for new branches)', 'INVALID_ARGS');\n }\n\n if (options.worktree) {\n // Add agent(s) to existing worktree\n await spawnIntoExistingWorktree(\n projectRoot,\n config,\n agentConfig,\n options.worktree,\n promptText,\n count,\n options,\n userVars,\n );\n } else if (options.branch) {\n // Create worktree from existing branch\n await spawnOnExistingBranch(\n projectRoot,\n config,\n agentConfig,\n options.branch,\n promptText,\n count,\n options,\n userVars,\n );\n } else {\n // Create new worktree + agent(s)\n await spawnNewWorktree(\n projectRoot,\n config,\n agentConfig,\n promptText,\n count,\n options,\n userVars,\n );\n }\n}\n\nasync function resolvePrompt(options: SpawnOptions, projectRoot: string): Promise<string> {\n if (options.prompt) return options.prompt;\n\n if (options.promptFile) {\n return fs.readFile(options.promptFile, 'utf-8');\n }\n\n if (options.template) {\n return loadTemplate(projectRoot, options.template);\n }\n\n throw new PpgError('One of --prompt, --prompt-file, or --template is required', 'INVALID_ARGS');\n}\n\nasync function spawnNewWorktree(\n projectRoot: string,\n config: import('../types/config.js').Config,\n agentConfig: import('../types/config.js').AgentConfig,\n promptText: string,\n count: number,\n options: SpawnOptions,\n userVars: Record<string, string>,\n): Promise<void> {\n const baseBranch = options.base ?? await getCurrentBranch(projectRoot);\n const wtId = genWorktreeId();\n const name = options.name ? normalizeName(options.name, wtId) : wtId;\n const branchName = `ppg/${name}`;\n\n // Create git worktree\n info(`Creating worktree ${wtId} on branch ${branchName}`);\n const wtPath = await createWorktree(projectRoot, wtId, {\n branch: branchName,\n base: baseBranch,\n });\n\n // Setup env\n await setupWorktreeEnv(projectRoot, wtPath, config);\n\n // Ensure tmux session (manifest is the source of truth for session name)\n const manifest = await readManifest(projectRoot);\n const sessionName = manifest.sessionName;\n await tmux.ensureSession(sessionName);\n\n // Create tmux window\n const windowTarget = await tmux.createWindow(sessionName, name, wtPath);\n\n // Register skeleton worktree in manifest before spawning agents\n // so partial failures leave a record for cleanup\n const worktreeEntry: WorktreeEntry = {\n id: wtId,\n name,\n path: wtPath,\n branch: branchName,\n baseBranch,\n status: 'active',\n tmuxWindow: windowTarget,\n agents: {},\n createdAt: new Date().toISOString(),\n };\n\n await updateManifest(projectRoot, (m) => {\n m.worktrees[wtId] = worktreeEntry;\n return m;\n });\n\n // Spawn agents — one tmux window per agent (default), or split panes (--split)\n const agents: AgentEntry[] = [];\n for (let i = 0; i < count; i++) {\n const aId = genAgentId();\n let target: string;\n\n if (i === 0) {\n // First agent uses the window already created for the worktree\n target = windowTarget;\n } else if (options.split) {\n // --split: additional agents share the same window as split panes\n const direction = i % 2 === 1 ? 'horizontal' : 'vertical';\n const pane = await tmux.splitPane(windowTarget, direction, wtPath);\n target = pane.target;\n } else {\n // Default: each additional agent gets its own tmux window\n target = await tmux.createWindow(sessionName, `${name}-${i}`, wtPath);\n }\n\n // Render template variables if present\n const ctx: TemplateContext = {\n WORKTREE_PATH: wtPath,\n BRANCH: branchName,\n AGENT_ID: aId,\n PROJECT_ROOT: projectRoot,\n TASK_NAME: name,\n PROMPT: promptText,\n };\n\n Object.assign(ctx, userVars);\n\n const renderedPrompt = renderTemplate(promptText, ctx);\n\n const agentEntry = await spawnAgent({\n agentId: aId,\n agentConfig,\n prompt: renderedPrompt,\n worktreePath: wtPath,\n tmuxTarget: target,\n projectRoot,\n branch: branchName,\n sessionId: genSessionId(),\n });\n\n agents.push(agentEntry);\n\n // Update manifest incrementally after each agent spawn\n await updateManifest(projectRoot, (m) => {\n if (m.worktrees[wtId]) {\n m.worktrees[wtId].agents[agentEntry.id] = agentEntry;\n }\n return m;\n });\n }\n\n // Only open Terminal window when explicitly requested via --open (fire-and-forget)\n if (options.open === true) {\n openTerminalWindow(sessionName, windowTarget, name).catch(() => {});\n }\n\n if (options.json) {\n output({\n success: true,\n worktree: {\n id: wtId,\n name,\n branch: branchName,\n path: wtPath,\n tmuxWindow: windowTarget,\n },\n agents: agents.map((a) => ({\n id: a.id,\n tmuxTarget: a.tmuxTarget,\n sessionId: a.sessionId,\n })),\n }, true);\n } else {\n success(`Spawned worktree ${wtId} with ${agents.length} agent(s)`);\n for (const a of agents) {\n info(` Agent ${a.id} → ${a.tmuxTarget}`);\n }\n info(`Attach: ppg attach ${wtId}`);\n }\n}\n\nasync function spawnOnExistingBranch(\n projectRoot: string,\n config: import('../types/config.js').Config,\n agentConfig: import('../types/config.js').AgentConfig,\n branch: string,\n promptText: string,\n count: number,\n options: SpawnOptions,\n userVars: Record<string, string>,\n): Promise<void> {\n const baseBranch = await getCurrentBranch(projectRoot);\n const wtId = genWorktreeId();\n\n // Derive name from branch if --name not provided (strip ppg/ prefix if present)\n const derivedName = branch.startsWith('ppg/') ? branch.slice(4) : branch;\n const name = options.name ? normalizeName(options.name, wtId) : normalizeName(derivedName, wtId);\n\n // Create git worktree from existing branch (no -b flag)\n info(`Creating worktree ${wtId} from existing branch ${branch}`);\n const wtPath = await adoptWorktree(projectRoot, wtId, branch);\n\n // Setup env\n await setupWorktreeEnv(projectRoot, wtPath, config);\n\n // Ensure tmux session\n const manifest = await readManifest(projectRoot);\n const sessionName = manifest.sessionName;\n await tmux.ensureSession(sessionName);\n\n // Create tmux window\n const windowTarget = await tmux.createWindow(sessionName, name, wtPath);\n\n // Register worktree in manifest\n const worktreeEntry: WorktreeEntry = {\n id: wtId,\n name,\n path: wtPath,\n branch,\n baseBranch,\n status: 'active',\n tmuxWindow: windowTarget,\n agents: {},\n createdAt: new Date().toISOString(),\n };\n\n await updateManifest(projectRoot, (m) => {\n m.worktrees[wtId] = worktreeEntry;\n return m;\n });\n\n // Spawn agents\n const agents: AgentEntry[] = [];\n for (let i = 0; i < count; i++) {\n const aId = genAgentId();\n let target: string;\n\n if (i === 0) {\n target = windowTarget;\n } else if (options.split) {\n const direction = i % 2 === 1 ? 'horizontal' : 'vertical';\n const pane = await tmux.splitPane(windowTarget, direction, wtPath);\n target = pane.target;\n } else {\n target = await tmux.createWindow(sessionName, `${name}-${i}`, wtPath);\n }\n\n const ctx: TemplateContext = {\n WORKTREE_PATH: wtPath,\n BRANCH: branch,\n AGENT_ID: aId,\n PROJECT_ROOT: projectRoot,\n TASK_NAME: name,\n PROMPT: promptText,\n };\n\n Object.assign(ctx, userVars);\n\n const renderedPrompt = renderTemplate(promptText, ctx);\n\n const agentEntry = await spawnAgent({\n agentId: aId,\n agentConfig,\n prompt: renderedPrompt,\n worktreePath: wtPath,\n tmuxTarget: target,\n projectRoot,\n branch,\n sessionId: genSessionId(),\n });\n\n agents.push(agentEntry);\n\n await updateManifest(projectRoot, (m) => {\n if (m.worktrees[wtId]) {\n m.worktrees[wtId].agents[agentEntry.id] = agentEntry;\n }\n return m;\n });\n }\n\n if (options.open === true) {\n openTerminalWindow(sessionName, windowTarget, name).catch(() => {});\n }\n\n if (options.json) {\n output({\n success: true,\n worktree: {\n id: wtId,\n name,\n branch,\n path: wtPath,\n tmuxWindow: windowTarget,\n },\n agents: agents.map((a) => ({\n id: a.id,\n tmuxTarget: a.tmuxTarget,\n sessionId: a.sessionId,\n })),\n }, true);\n } else {\n success(`Spawned worktree ${wtId} from branch ${branch} with ${agents.length} agent(s)`);\n for (const a of agents) {\n info(` Agent ${a.id} → ${a.tmuxTarget}`);\n }\n info(`Attach: ppg attach ${wtId}`);\n }\n}\n\nasync function spawnIntoExistingWorktree(\n projectRoot: string,\n config: import('../types/config.js').Config,\n agentConfig: import('../types/config.js').AgentConfig,\n worktreeRef: string,\n promptText: string,\n count: number,\n options: SpawnOptions,\n userVars: Record<string, string>,\n): Promise<void> {\n const manifest = await readManifest(projectRoot);\n const wt = resolveWorktree(manifest, worktreeRef);\n\n if (!wt) throw new WorktreeNotFoundError(worktreeRef);\n\n // Lazily create tmux window if worktree has none (standalone worktree)\n let windowTarget = wt.tmuxWindow;\n if (!windowTarget) {\n await tmux.ensureSession(manifest.sessionName);\n windowTarget = await tmux.createWindow(manifest.sessionName, wt.name, wt.path);\n }\n\n const agents: AgentEntry[] = [];\n for (let i = 0; i < count; i++) {\n const aId = genAgentId();\n\n let target: string;\n if (i === 0 && options.split) {\n // First agent reuses the existing window pane\n target = windowTarget;\n } else if (options.split) {\n // --split: additional agents share the same window as split panes\n const direction = i % 2 === 1 ? 'horizontal' : 'vertical';\n const pane = await tmux.splitPane(windowTarget, direction, wt.path);\n target = pane.target;\n } else {\n // Default: every agent gets its own tmux window\n target = await tmux.createWindow(manifest.sessionName, `${wt.name}-agent-${i}`, wt.path);\n }\n\n const ctx: TemplateContext = {\n WORKTREE_PATH: wt.path,\n BRANCH: wt.branch,\n AGENT_ID: aId,\n PROJECT_ROOT: projectRoot,\n TASK_NAME: wt.name,\n PROMPT: promptText,\n };\n\n Object.assign(ctx, userVars);\n\n const renderedPrompt = renderTemplate(promptText, ctx);\n\n const agentEntry = await spawnAgent({\n agentId: aId,\n agentConfig,\n prompt: renderedPrompt,\n worktreePath: wt.path,\n tmuxTarget: target,\n projectRoot,\n branch: wt.branch,\n sessionId: genSessionId(),\n });\n\n agents.push(agentEntry);\n }\n\n await updateManifest(projectRoot, (m) => {\n const mWt = m.worktrees[wt.id];\n if (!mWt) return m;\n if (!mWt.tmuxWindow) {\n mWt.tmuxWindow = windowTarget;\n }\n for (const a of agents) {\n mWt.agents[a.id] = a;\n }\n return m;\n });\n\n // Only open Terminal window when explicitly requested via --open (fire-and-forget)\n if (options.open === true) {\n openTerminalWindow(manifest.sessionName, windowTarget, wt.name).catch(() => {});\n }\n\n if (options.json) {\n output({\n success: true,\n worktree: {\n id: wt.id,\n name: wt.name,\n branch: wt.branch,\n path: wt.path,\n tmuxWindow: windowTarget,\n },\n agents: agents.map((a) => ({ id: a.id, tmuxTarget: a.tmuxTarget, sessionId: a.sessionId })),\n }, true);\n } else {\n success(`Added ${agents.length} agent(s) to worktree ${wt.id}`);\n for (const a of agents) {\n info(` Agent ${a.id} → ${a.tmuxTarget}`);\n }\n }\n}\n","import { loadConfig } from '../core/config.js';\nimport { requireManifest, updateManifest } from '../core/manifest.js';\nimport { refreshAllAgentStatuses } from '../core/agent.js';\nimport { getRepoRoot } from '../core/worktree.js';\nimport { output, formatStatus, formatTable, type Column } from '../lib/output.js';\nimport type { AgentEntry, WorktreeEntry } from '../types/manifest.js';\n\nexport interface StatusOptions {\n json?: boolean;\n watch?: boolean;\n worktree?: string;\n}\n\nexport async function statusCommand(worktreeFilter?: string, options?: StatusOptions): Promise<void> {\n const projectRoot = await getRepoRoot();\n\n // Read manifest and refresh statuses\n await requireManifest(projectRoot);\n const manifest = await updateManifest(projectRoot, async (m) => {\n return refreshAllAgentStatuses(m, projectRoot);\n });\n\n // Filter worktrees if specified\n const filter = worktreeFilter ?? options?.worktree;\n let worktrees = Object.values(manifest.worktrees);\n if (filter) {\n worktrees = worktrees.filter(\n (wt) => wt.id === filter || wt.name === filter || wt.branch === filter,\n );\n }\n\n if (options?.json) {\n output({\n session: manifest.sessionName,\n worktrees: Object.fromEntries(worktrees.map((wt) => [wt.id, { ...wt, lifecycle: computeLifecycle(wt) }])),\n }, true);\n return;\n }\n\n if (worktrees.length === 0) {\n console.log('No active worktrees. Use `ppg spawn` to create one.');\n return;\n }\n\n for (const wt of worktrees) {\n printWorktreeStatus(wt);\n }\n\n if (options?.watch) {\n const interval = setInterval(async () => {\n console.clear();\n try {\n const m = await updateManifest(projectRoot, async (m) => {\n return refreshAllAgentStatuses(m, projectRoot);\n });\n let wts = Object.values(m.worktrees);\n if (filter) {\n wts = wts.filter(\n (wt) => wt.id === filter || wt.name === filter || wt.branch === filter,\n );\n }\n for (const wt of wts) {\n printWorktreeStatus(wt);\n }\n } catch (err) {\n console.error('Error refreshing status:', err);\n }\n }, 2000);\n\n // Handle exit\n process.on('SIGINT', () => {\n clearInterval(interval);\n process.exit(0);\n });\n }\n}\n\nfunction printWorktreeStatus(wt: WorktreeEntry): void {\n const agents = Object.values(wt.agents);\n\n console.log(\n `\\n${wt.name} (${wt.id}) [${formatStatus(wt.status)}] branch:${wt.branch}`,\n );\n\n if (agents.length === 0) {\n console.log(' No agents');\n return;\n }\n\n const columns: Column[] = [\n { header: 'Agent', key: 'id', width: 14 },\n { header: 'Type', key: 'agentType', width: 10 },\n {\n header: 'Status',\n key: 'status',\n width: 12,\n format: (v) => formatStatus(v as AgentEntry['status']),\n },\n { header: 'Started', key: 'startedAt', width: 20, format: (v) => formatTime(v as string) },\n { header: 'Pane', key: 'tmuxTarget', width: 20 },\n ];\n\n const table = formatTable(agents as unknown as Record<string, unknown>[], columns);\n console.log(table.split('\\n').map((l) => ` ${l}`).join('\\n'));\n}\n\nexport type WorktreeLifecycle = 'merged' | 'cleaned' | 'busy' | 'shipped' | 'idle';\n\nexport function computeLifecycle(wt: WorktreeEntry): WorktreeLifecycle {\n if (wt.status === 'merged') return 'merged';\n if (wt.status === 'cleaned') return 'cleaned';\n\n const agents = Object.values(wt.agents);\n\n if (agents.some((a) => a.status === 'running')) return 'busy';\n if (wt.prUrl) return 'shipped';\n\n return 'idle';\n}\n\nfunction formatTime(iso: string): string {\n if (!iso) return '—';\n const d = new Date(iso);\n const now = new Date();\n const diffMs = now.getTime() - d.getTime();\n const diffMin = Math.floor(diffMs / 60_000);\n if (diffMin < 1) return 'just now';\n if (diffMin < 60) return `${diffMin}m ago`;\n const diffHr = Math.floor(diffMin / 60);\n return `${diffHr}h ${diffMin % 60}m ago`;\n}\n","import { execa } from 'execa';\nimport { execaEnv } from '../lib/env.js';\n\nexport type PrState = 'MERGED' | 'OPEN' | 'CLOSED' | 'UNKNOWN';\n\n/**\n * Check the GitHub PR state for a given branch.\n * Uses `gh pr view` to query the PR associated with the branch.\n * Returns 'UNKNOWN' if gh is not available or the command fails.\n */\nexport async function checkPrState(branch: string): Promise<PrState> {\n try {\n const result = await execa(\n 'gh',\n ['pr', 'view', branch, '--json', 'state', '--jq', '.state'],\n execaEnv,\n );\n const state = result.stdout.trim().toUpperCase();\n if (state === 'MERGED' || state === 'OPEN' || state === 'CLOSED') {\n return state;\n }\n return 'UNKNOWN';\n } catch {\n return 'UNKNOWN';\n }\n}\n","import type { PaneInfo } from './tmux.js';\nimport type { AgentEntry, WorktreeEntry } from '../types/manifest.js';\n\n/**\n * Read the current process's tmux pane ID from the environment.\n * Returns null when not running inside tmux.\n */\nexport function getCurrentPaneId(): string | null {\n return process.env.TMUX_PANE ?? null;\n}\n\n/**\n * Check if a tmux target (pane ID, session:window, or session:window.pane)\n * would affect the pane the current process is running in.\n *\n * Uses the paneMap from listSessionPanes() which indexes by multiple formats.\n */\nexport function wouldAffectSelf(\n target: string,\n selfPaneId: string,\n paneMap: Map<string, PaneInfo>,\n): boolean {\n // Direct match: target IS the self pane\n if (target === selfPaneId) return true;\n\n // Look up the target in the pane map\n const targetInfo = paneMap.get(target);\n if (!targetInfo) return false;\n\n // If target resolves to a specific pane, check if it's self\n if (targetInfo.paneId === selfPaneId) return true;\n\n // If target is a window (session:window format, no dot), check all panes in that window\n // The pane map indexes by session:window too, which maps to the first pane.\n // But a window kill would kill ALL panes in it, so we need to check if any pane\n // in that window is self.\n if (!target.includes('.') && target.includes(':')) {\n // This is a window-level target. Scan the map for all panes in this window.\n for (const [key, info] of paneMap) {\n if (key.startsWith(target + '.') && info.paneId === selfPaneId) {\n return true;\n }\n }\n }\n\n return false;\n}\n\n/**\n * Split an agent list into safe-to-kill and must-skip sets.\n */\nexport function excludeSelf(\n agents: AgentEntry[],\n selfPaneId: string,\n paneMap: Map<string, PaneInfo>,\n): { safe: AgentEntry[]; skipped: AgentEntry[] } {\n const safe: AgentEntry[] = [];\n const skipped: AgentEntry[] = [];\n\n for (const agent of agents) {\n if (wouldAffectSelf(agent.tmuxTarget, selfPaneId, paneMap)) {\n skipped.push(agent);\n } else {\n safe.push(agent);\n }\n }\n\n return { safe, skipped };\n}\n\n/**\n * Check if cleaning up a worktree would kill the current process.\n * Checks all agent tmux targets and the worktree's own tmux window.\n */\nexport function wouldCleanupAffectSelf(\n wt: WorktreeEntry,\n selfPaneId: string,\n paneMap: Map<string, PaneInfo>,\n): boolean {\n // Check worktree-level tmux window\n if (wt.tmuxWindow && wouldAffectSelf(wt.tmuxWindow, selfPaneId, paneMap)) {\n return true;\n }\n\n // Check each agent's tmux target\n for (const agent of Object.values(wt.agents)) {\n if (agent.tmuxTarget && wouldAffectSelf(agent.tmuxTarget, selfPaneId, paneMap)) {\n return true;\n }\n }\n\n return false;\n}\n","import fs from 'node:fs/promises';\nimport { updateManifest } from './manifest.js';\nimport { removeWorktree } from './worktree.js';\nimport { teardownWorktreeEnv } from './env.js';\nimport * as tmux from './tmux.js';\nimport { agentPromptFile } from '../lib/paths.js';\nimport { warn } from '../lib/output.js';\nimport { wouldAffectSelf } from './self.js';\nimport type { PaneInfo } from './tmux.js';\nimport type { WorktreeEntry } from '../types/manifest.js';\n\nexport interface CleanupOptions {\n /** Current process's tmux pane ID (from $TMUX_PANE). Null = not inside tmux. */\n selfPaneId?: string | null;\n /** Pre-fetched pane map from listSessionPanes(). */\n paneMap?: Map<string, PaneInfo>;\n}\n\nexport interface CleanupResult {\n /** Worktree ID that was cleaned. */\n worktreeId: string;\n /** Whether manifest was updated to 'cleaned'. */\n manifestUpdated: boolean;\n /** Number of tmux windows successfully killed. */\n tmuxKilled: number;\n /** Number of tmux windows skipped (already gone). */\n tmuxSkipped: number;\n /** Number of tmux windows that failed to kill (unexpected error). */\n tmuxFailed: number;\n /** Whether any target was skipped due to self-protection. */\n selfProtected: boolean;\n /** Targets that were self-protected. */\n selfProtectedTargets: string[];\n}\n\n/**\n * Clean up a worktree: update manifest FIRST (crash-safe), then kill tmux, teardown env, remove git worktree.\n *\n * Operation order is designed so that if the process dies mid-cleanup,\n * the manifest already reflects the cleaned state.\n *\n * Idempotent: if worktree is already 'cleaned' in manifest, only attempts filesystem cleanup.\n */\nexport async function cleanupWorktree(\n projectRoot: string,\n wt: WorktreeEntry,\n options?: CleanupOptions,\n): Promise<CleanupResult> {\n const selfPaneId = options?.selfPaneId ?? null;\n const paneMap = options?.paneMap ?? new Map<string, PaneInfo>();\n\n const result: CleanupResult = {\n worktreeId: wt.id,\n manifestUpdated: false,\n tmuxKilled: 0,\n tmuxSkipped: 0,\n tmuxFailed: 0,\n selfProtected: false,\n selfProtectedTargets: [],\n };\n\n const alreadyCleaned = wt.status === 'cleaned';\n\n // 1. Update manifest FIRST — crash-safe point\n if (!alreadyCleaned) {\n await updateManifest(projectRoot, (m) => {\n if (m.worktrees[wt.id]) {\n m.worktrees[wt.id].status = 'cleaned';\n }\n return m;\n });\n result.manifestUpdated = true;\n }\n\n // 2. Kill tmux windows — skip if already cleaned (tmux already gone),\n // skip targets that match selfPaneId\n if (!alreadyCleaned) {\n const targets = new Set<string>();\n\n for (const agent of Object.values(wt.agents)) {\n if (agent.tmuxTarget) targets.add(agent.tmuxTarget);\n }\n if (wt.tmuxWindow) targets.add(wt.tmuxWindow);\n\n for (const target of targets) {\n // Self-protection check\n if (selfPaneId && wouldAffectSelf(target, selfPaneId, paneMap)) {\n result.selfProtected = true;\n result.selfProtectedTargets.push(target);\n warn(`Skipping tmux kill for ${target} — contains current process`);\n continue;\n }\n\n try {\n await tmux.killWindow(target);\n result.tmuxKilled++;\n } catch (err) {\n // killWindow now only throws on unexpected errors (not \"not found\")\n result.tmuxFailed++;\n warn(`Failed to kill tmux window ${target}: ${err instanceof Error ? err.message : err}`);\n }\n }\n }\n\n // 3. Remove agent prompt files\n for (const agent of Object.values(wt.agents)) {\n const pFile = agentPromptFile(projectRoot, agent.id);\n await fs.rm(pFile, { force: true });\n }\n\n // 4. Teardown env\n try {\n await teardownWorktreeEnv(wt.path);\n } catch { /* may already be cleaned */ }\n\n // 5. Remove git worktree + branch\n try {\n await removeWorktree(projectRoot, wt.path, {\n force: true,\n deleteBranch: true,\n branchName: wt.branch,\n });\n } catch (err) {\n warn(`Could not fully remove worktree ${wt.id}: ${err instanceof Error ? err.message : err}`);\n }\n\n return result;\n}\n","import { readManifest, updateManifest, findAgent, resolveWorktree } from '../core/manifest.js';\nimport { killAgent, killAgents } from '../core/agent.js';\nimport { checkPrState } from '../core/pr.js';\nimport { getRepoRoot } from '../core/worktree.js';\nimport { cleanupWorktree } from '../core/cleanup.js';\nimport { getCurrentPaneId, excludeSelf } from '../core/self.js';\nimport { listSessionPanes, type PaneInfo } from '../core/tmux.js';\nimport { PpgError, NotInitializedError, AgentNotFoundError, WorktreeNotFoundError } from '../lib/errors.js';\nimport { output, success, info, warn } from '../lib/output.js';\nimport type { AgentEntry } from '../types/manifest.js';\n\nexport interface KillOptions {\n agent?: string;\n worktree?: string;\n all?: boolean;\n remove?: boolean;\n delete?: boolean;\n includeOpenPrs?: boolean;\n json?: boolean;\n}\n\nexport async function killCommand(options: KillOptions): Promise<void> {\n const projectRoot = await getRepoRoot();\n\n if (!options.agent && !options.worktree && !options.all) {\n throw new PpgError('One of --agent, --worktree, or --all is required', 'INVALID_ARGS');\n }\n\n // Capture self-identification once at the start\n const selfPaneId = getCurrentPaneId();\n let paneMap: Map<string, PaneInfo> | undefined;\n if (selfPaneId) {\n const manifest = await readManifest(projectRoot);\n paneMap = await listSessionPanes(manifest.sessionName);\n }\n\n if (options.agent) {\n await killSingleAgent(projectRoot, options.agent, options, selfPaneId, paneMap);\n } else if (options.worktree) {\n await killWorktreeAgents(projectRoot, options.worktree, options, selfPaneId, paneMap);\n } else if (options.all) {\n await killAllAgents(projectRoot, options, selfPaneId, paneMap);\n }\n}\n\nasync function killSingleAgent(\n projectRoot: string,\n agentId: string,\n options: KillOptions,\n selfPaneId: string | null,\n paneMap?: Map<string, PaneInfo>,\n): Promise<void> {\n const manifest = await readManifest(projectRoot);\n const found = findAgent(manifest, agentId);\n if (!found) throw new AgentNotFoundError(agentId);\n\n const { agent } = found;\n const isTerminal = agent.status !== 'running';\n\n // Self-protection check\n if (selfPaneId && paneMap) {\n const { skipped } = excludeSelf([agent], selfPaneId, paneMap);\n if (skipped.length > 0) {\n warn(`Cannot kill agent ${agentId} — it contains the current ppg process`);\n if (options.json) {\n output({ success: false, skipped: [agentId], reason: 'self-protection' }, true);\n }\n return;\n }\n }\n\n if (options.delete) {\n // For --delete: skip kill if already in terminal state, just clean up\n if (!isTerminal) {\n info(`Killing agent ${agentId}`);\n await killAgent(agent);\n }\n // Kill the tmux pane explicitly (handles already-dead)\n await import('../core/tmux.js').then((tmux) => tmux.killPane(agent.tmuxTarget));\n\n await updateManifest(projectRoot, (m) => {\n const f = findAgent(m, agentId);\n if (f) {\n delete f.worktree.agents[agentId];\n }\n return m;\n });\n\n if (options.json) {\n output({ success: true, killed: [agentId], deleted: [agentId] }, true);\n } else {\n success(`Deleted agent ${agentId}`);\n }\n } else {\n if (isTerminal) {\n if (options.json) {\n output({ success: true, killed: [], message: `Agent ${agentId} already ${agent.status}` }, true);\n } else {\n info(`Agent ${agentId} already ${agent.status}, skipping kill`);\n }\n return;\n }\n\n info(`Killing agent ${agentId}`);\n await killAgent(agent);\n\n await updateManifest(projectRoot, (m) => {\n const f = findAgent(m, agentId);\n if (f) {\n f.agent.status = 'gone';\n }\n return m;\n });\n\n if (options.json) {\n output({ success: true, killed: [agentId] }, true);\n } else {\n success(`Killed agent ${agentId}`);\n }\n }\n}\n\nasync function killWorktreeAgents(\n projectRoot: string,\n worktreeRef: string,\n options: KillOptions,\n selfPaneId: string | null,\n paneMap?: Map<string, PaneInfo>,\n): Promise<void> {\n const manifest = await readManifest(projectRoot);\n const wt = resolveWorktree(manifest, worktreeRef);\n\n if (!wt) throw new WorktreeNotFoundError(worktreeRef);\n\n let toKill = Object.values(wt.agents)\n .filter((a) => a.status === 'running');\n\n // Self-protection: filter out agents that would kill the current process\n const skippedIds: string[] = [];\n if (selfPaneId && paneMap) {\n const { safe, skipped } = excludeSelf(toKill, selfPaneId, paneMap);\n toKill = safe;\n for (const a of skipped) {\n skippedIds.push(a.id);\n warn(`Skipping agent ${a.id} — contains current ppg process`);\n }\n }\n\n const killedIds = toKill.map((a) => a.id);\n\n for (const a of toKill) info(`Killing agent ${a.id}`);\n await killAgents(toKill);\n\n await updateManifest(projectRoot, (m) => {\n const mWt = m.worktrees[wt.id];\n if (mWt) {\n for (const agent of Object.values(mWt.agents)) {\n if (killedIds.includes(agent.id)) {\n agent.status = 'gone';\n }\n }\n }\n return m;\n });\n\n // Check for open PR before deleting worktree\n let skippedOpenPr = false;\n if (options.delete && !options.includeOpenPrs) {\n const prState = await checkPrState(wt.branch);\n if (prState === 'OPEN') {\n skippedOpenPr = true;\n warn(`Skipping deletion of worktree ${wt.id} (${wt.name}) — has open PR on branch ${wt.branch}. Use --include-open-prs to override.`);\n }\n }\n\n // --delete implies --remove (always clean up worktree)\n const shouldRemove = (options.remove || options.delete) && !skippedOpenPr;\n if (shouldRemove) {\n await removeWorktreeCleanup(projectRoot, wt.id, selfPaneId, paneMap);\n }\n\n // --delete also removes the worktree entry from manifest\n if (options.delete && !skippedOpenPr) {\n await updateManifest(projectRoot, (m) => {\n delete m.worktrees[wt.id];\n return m;\n });\n }\n\n if (options.json) {\n output({\n success: true,\n killed: killedIds,\n skipped: skippedIds.length > 0 ? skippedIds : undefined,\n removed: shouldRemove ? [wt.id] : [],\n deleted: (options.delete && !skippedOpenPr) ? [wt.id] : [],\n skippedOpenPrs: skippedOpenPr ? [wt.id] : undefined,\n }, true);\n } else {\n success(`Killed ${killedIds.length} agent(s) in worktree ${wt.id}`);\n if (skippedIds.length > 0) {\n warn(`Skipped ${skippedIds.length} agent(s) due to self-protection`);\n }\n if (options.delete && !skippedOpenPr) {\n success(`Deleted worktree ${wt.id}`);\n } else if (options.remove && !skippedOpenPr) {\n success(`Removed worktree ${wt.id}`);\n }\n }\n}\n\nasync function killAllAgents(\n projectRoot: string,\n options: KillOptions,\n selfPaneId: string | null,\n paneMap?: Map<string, PaneInfo>,\n): Promise<void> {\n const manifest = await readManifest(projectRoot);\n let toKill: AgentEntry[] = [];\n\n for (const wt of Object.values(manifest.worktrees)) {\n for (const agent of Object.values(wt.agents)) {\n if (agent.status === 'running') {\n toKill.push(agent);\n }\n }\n }\n\n // Self-protection: filter out agents that would kill the current process\n const skippedIds: string[] = [];\n if (selfPaneId && paneMap) {\n const { safe, skipped } = excludeSelf(toKill, selfPaneId, paneMap);\n toKill = safe;\n for (const a of skipped) {\n skippedIds.push(a.id);\n warn(`Skipping agent ${a.id} — contains current ppg process`);\n }\n }\n\n const killedIds = toKill.map((a) => a.id);\n for (const a of toKill) info(`Killing agent ${a.id}`);\n await killAgents(toKill);\n\n // Only track active worktrees for removal (not already merged/cleaned)\n const activeWorktreeIds = Object.values(manifest.worktrees)\n .filter((wt) => wt.status === 'active')\n .map((wt) => wt.id);\n\n await updateManifest(projectRoot, (m) => {\n for (const wt of Object.values(m.worktrees)) {\n for (const agent of Object.values(wt.agents)) {\n if (killedIds.includes(agent.id)) {\n agent.status = 'gone';\n }\n }\n }\n return m;\n });\n\n // Filter out worktrees with open PRs\n let worktreesToRemove = activeWorktreeIds;\n const openPrWorktreeIds: string[] = [];\n if (options.delete && !options.includeOpenPrs) {\n worktreesToRemove = [];\n for (const wtId of activeWorktreeIds) {\n const wt = manifest.worktrees[wtId];\n if (wt) {\n const prState = await checkPrState(wt.branch);\n if (prState === 'OPEN') {\n openPrWorktreeIds.push(wtId);\n warn(`Skipping deletion of worktree ${wtId} (${wt.name}) — has open PR`);\n } else {\n worktreesToRemove.push(wtId);\n }\n }\n }\n }\n\n // --delete implies --remove\n const shouldRemove = options.remove || options.delete;\n if (shouldRemove) {\n for (const wtId of worktreesToRemove) {\n await removeWorktreeCleanup(projectRoot, wtId, selfPaneId, paneMap);\n }\n }\n\n // --delete also removes worktree entries from manifest\n if (options.delete) {\n await updateManifest(projectRoot, (m) => {\n for (const wtId of worktreesToRemove) {\n delete m.worktrees[wtId];\n }\n return m;\n });\n }\n\n if (options.json) {\n output({\n success: true,\n killed: killedIds,\n skipped: skippedIds.length > 0 ? skippedIds : undefined,\n removed: shouldRemove ? worktreesToRemove : [],\n deleted: options.delete ? worktreesToRemove : [],\n skippedOpenPrs: openPrWorktreeIds.length > 0 ? openPrWorktreeIds : undefined,\n }, true);\n } else {\n success(`Killed ${killedIds.length} agent(s) across ${activeWorktreeIds.length} worktree(s)`);\n if (skippedIds.length > 0) {\n warn(`Skipped ${skippedIds.length} agent(s) due to self-protection`);\n }\n if (openPrWorktreeIds.length > 0) {\n warn(`Skipped deletion of ${openPrWorktreeIds.length} worktree(s) with open PRs`);\n }\n if (options.delete) {\n success(`Deleted ${worktreesToRemove.length} worktree(s)`);\n } else if (options.remove) {\n success(`Removed ${worktreesToRemove.length} worktree(s)`);\n }\n }\n}\n\nasync function removeWorktreeCleanup(\n projectRoot: string,\n wtId: string,\n selfPaneId: string | null,\n paneMap?: Map<string, PaneInfo>,\n): Promise<void> {\n const manifest = await readManifest(projectRoot);\n const wt = resolveWorktree(manifest, wtId);\n if (!wt) return;\n await cleanupWorktree(projectRoot, wt, {\n selfPaneId,\n paneMap,\n });\n}\n","import { requireManifest, resolveWorktree, findAgent } from '../core/manifest.js';\nimport { getRepoRoot } from '../core/worktree.js';\nimport { getPaneInfo } from '../core/tmux.js';\nimport { resumeAgent } from '../core/agent.js';\nimport * as tmux from '../core/tmux.js';\nimport { openTerminalWindow } from '../core/terminal.js';\nimport { PpgError } from '../lib/errors.js';\nimport { info, success } from '../lib/output.js';\nimport type { AgentEntry } from '../types/manifest.js';\n\nexport async function attachCommand(target: string): Promise<void> {\n const projectRoot = await getRepoRoot();\n\n const manifest = await requireManifest(projectRoot);\n\n // Try to resolve target as worktree ID, worktree name, or agent ID\n let tmuxTarget: string | undefined;\n const sessionName = manifest.sessionName;\n let agent: AgentEntry | undefined;\n let worktreeId: string | undefined;\n\n // Check worktree ID\n const wt = resolveWorktree(manifest, target);\n\n if (wt) {\n if (!wt.tmuxWindow) {\n throw new PpgError('Worktree has no tmux window. Spawn agents first with: ppg spawn --worktree ' + wt.id + ' --prompt \"your task\"', 'NO_TMUX_WINDOW');\n }\n tmuxTarget = wt.tmuxWindow;\n } else {\n // Check agent ID\n const found = findAgent(manifest, target);\n if (found) {\n agent = found.agent;\n worktreeId = found.worktree.id;\n tmuxTarget = found.agent.tmuxTarget;\n }\n }\n\n if (!tmuxTarget) {\n throw new PpgError(`Could not resolve target: ${target}. Try a worktree ID, name, or agent ID.`, 'TARGET_NOT_FOUND');\n }\n\n // Check if the pane is dead and agent has a sessionId — auto-resume\n if (agent?.sessionId && worktreeId) {\n const paneInfo = await getPaneInfo(tmuxTarget);\n if (!paneInfo || paneInfo.isDead) {\n info(`Pane is dead. Resuming session ${agent.sessionId}...`);\n const resumeWt = manifest.worktrees[worktreeId];\n const cwd = resumeWt?.path ?? projectRoot;\n const windowName = resumeWt?.name ?? agent.name ?? target;\n\n tmuxTarget = await resumeAgent({\n agent,\n worktreeId,\n sessionName,\n cwd,\n windowName,\n projectRoot,\n });\n success(`Resumed agent ${agent.id} in ${tmuxTarget}`);\n }\n }\n\n const insideTmux = await tmux.isInsideTmux();\n\n if (insideTmux) {\n // Agent targets are now window targets (e.g. \"ppg:3\"), so use selectWindow for both\n await tmux.selectWindow(tmuxTarget);\n info(`Switched to ${tmuxTarget}`);\n } else {\n // Open a new Terminal.app window attached to the target\n const title = wt ? wt.name : target;\n info(`Opening Terminal window for ${title}`);\n await openTerminalWindow(sessionName, tmuxTarget, title);\n }\n}\n","import { requireManifest, findAgent } from '../core/manifest.js';\nimport { getRepoRoot } from '../core/worktree.js';\nimport * as tmux from '../core/tmux.js';\nimport { PpgError, AgentNotFoundError } from '../lib/errors.js';\nimport { output, outputError } from '../lib/output.js';\n\nexport interface LogsOptions {\n lines?: number;\n follow?: boolean;\n full?: boolean;\n json?: boolean;\n}\n\nexport async function logsCommand(agentId: string, options: LogsOptions): Promise<void> {\n const projectRoot = await getRepoRoot();\n\n const manifest = await requireManifest(projectRoot);\n\n const found = findAgent(manifest, agentId);\n if (!found) throw new AgentNotFoundError(agentId);\n\n const { agent } = found;\n const lines = options.full ? undefined : (options.lines ?? 100);\n\n if (options.follow) {\n // Poll mode\n let lastOutput = '';\n const interval = setInterval(async () => {\n try {\n const content = await tmux.capturePane(agent.tmuxTarget, lines);\n if (content !== lastOutput) {\n // Find new lines\n if (lastOutput) {\n const oldLines = lastOutput.split('\\n');\n const newLines = content.split('\\n');\n // Output only lines that are new\n const diff = newLines.slice(oldLines.length);\n if (diff.length > 0) {\n process.stdout.write(diff.join('\\n') + '\\n');\n }\n } else {\n process.stdout.write(content + '\\n');\n }\n lastOutput = content;\n }\n } catch {\n clearInterval(interval);\n outputError(new Error('Pane no longer available'), options.json ?? false);\n process.exit(1);\n }\n }, 1000);\n\n process.on('SIGINT', () => {\n clearInterval(interval);\n process.exit(0);\n });\n } else {\n // One-shot capture\n try {\n const content = await tmux.capturePane(agent.tmuxTarget, lines);\n if (options.json) {\n output({\n agentId: agent.id,\n status: agent.status,\n tmuxTarget: agent.tmuxTarget,\n output: content,\n }, true);\n } else {\n console.log(content);\n }\n } catch {\n throw new PpgError(`Could not capture pane for agent ${agentId}. Pane may no longer exist.`, 'PANE_NOT_FOUND');\n }\n }\n}\n","import fs from 'node:fs/promises';\nimport { requireManifest, resolveWorktree, updateManifest } from '../core/manifest.js';\nimport { refreshAllAgentStatuses } from '../core/agent.js';\nimport { getRepoRoot } from '../core/worktree.js';\nimport * as tmux from '../core/tmux.js';\nimport { resultFile } from '../lib/paths.js';\nimport { WorktreeNotFoundError } from '../lib/errors.js';\nimport { output, success } from '../lib/output.js';\nimport type { AgentEntry, WorktreeEntry } from '../types/manifest.js';\n\nexport interface AggregateOptions {\n all?: boolean;\n output?: string;\n json?: boolean;\n}\n\nexport async function aggregateCommand(\n worktreeId?: string,\n options?: AggregateOptions,\n): Promise<void> {\n const projectRoot = await getRepoRoot();\n\n await requireManifest(projectRoot);\n const manifest = await updateManifest(projectRoot, async (m) => {\n return refreshAllAgentStatuses(m, projectRoot);\n });\n\n let worktrees: WorktreeEntry[];\n\n if (options?.all) {\n worktrees = Object.values(manifest.worktrees);\n } else if (worktreeId) {\n const wt = resolveWorktree(manifest, worktreeId);\n if (!wt) throw new WorktreeNotFoundError(worktreeId);\n worktrees = [wt];\n } else {\n // Default: all worktrees with non-running agents (idle, exited, or gone)\n worktrees = Object.values(manifest.worktrees).filter((wt) =>\n Object.values(wt.agents).some((a) => a.status !== 'running'),\n );\n }\n\n const results: AggregatedResult[] = [];\n\n for (const wt of worktrees) {\n for (const agent of Object.values(wt.agents)) {\n const result = await collectAgentResult(agent, projectRoot);\n results.push({\n agentId: agent.id,\n worktreeId: wt.id,\n worktreeName: wt.name,\n branch: wt.branch,\n status: agent.status,\n content: result,\n });\n }\n }\n\n if (results.length === 0) {\n if (options?.json) {\n output({ results: [] }, true);\n } else {\n console.log('No agent results to aggregate.');\n }\n return;\n }\n\n if (options?.json) {\n output({ results }, true);\n return;\n }\n\n // Build combined document\n const combined = results.map((r) => {\n return [\n `# Agent: ${r.agentId}`,\n `**Worktree:** ${r.worktreeName} (${r.worktreeId})`,\n `**Branch:** ${r.branch}`,\n `**Status:** ${r.status}`,\n '',\n r.content,\n '',\n '---',\n '',\n ].join('\\n');\n }).join('\\n');\n\n if (options?.output) {\n await fs.writeFile(options.output, combined, 'utf-8');\n success(`Wrote ${results.length} result(s) to ${options.output}`);\n } else {\n console.log(combined);\n }\n}\n\ninterface AggregatedResult {\n agentId: string;\n worktreeId: string;\n worktreeName: string;\n branch: string;\n status: string;\n content: string;\n}\n\nasync function collectAgentResult(\n agent: AgentEntry,\n projectRoot: string,\n): Promise<string> {\n // Primary: capture pane content\n try {\n const paneContent = await tmux.capturePane(agent.tmuxTarget, 500);\n return `\\`\\`\\`\\n${paneContent}\\n\\`\\`\\``;\n } catch {\n // Pane not available\n }\n\n // Fallback: try legacy result file\n try {\n const content = await fs.readFile(resultFile(projectRoot, agent.id), 'utf-8');\n return content;\n } catch {\n return '*[Pane not available and no legacy result file]*';\n }\n}\n","import { execa } from 'execa';\nimport { requireManifest, updateManifest, resolveWorktree } from '../core/manifest.js';\nimport { refreshAllAgentStatuses } from '../core/agent.js';\nimport { getRepoRoot, getCurrentBranch } from '../core/worktree.js';\nimport { cleanupWorktree } from '../core/cleanup.js';\nimport { getCurrentPaneId } from '../core/self.js';\nimport { listSessionPanes, type PaneInfo } from '../core/tmux.js';\nimport { PpgError, WorktreeNotFoundError, MergeFailedError } from '../lib/errors.js';\nimport { output, success, info, warn } from '../lib/output.js';\nimport { execaEnv } from '../lib/env.js';\n\nexport interface MergeOptions {\n strategy?: 'squash' | 'no-ff';\n cleanup?: boolean;\n dryRun?: boolean;\n force?: boolean;\n json?: boolean;\n}\n\nexport async function mergeCommand(worktreeId: string, options: MergeOptions): Promise<void> {\n const projectRoot = await getRepoRoot();\n\n await requireManifest(projectRoot);\n const manifest = await updateManifest(projectRoot, async (m) => {\n return refreshAllAgentStatuses(m, projectRoot);\n });\n\n const wt = resolveWorktree(manifest, worktreeId);\n\n if (!wt) throw new WorktreeNotFoundError(worktreeId);\n\n // Check all agents finished\n const agents = Object.values(wt.agents);\n const incomplete = agents.filter((a) => a.status === 'running');\n\n if (incomplete.length > 0 && !options.force) {\n const ids = incomplete.map((a) => a.id).join(', ');\n throw new PpgError(\n `${incomplete.length} agent(s) still running: ${ids}. Use --force to merge anyway.`,\n 'AGENTS_RUNNING',\n );\n }\n\n if (options.dryRun) {\n info('Dry run — no changes will be made');\n info(`Would merge branch ${wt.branch} into ${wt.baseBranch} using ${options.strategy ?? 'squash'} strategy`);\n if (options.cleanup !== false) {\n info(`Would remove worktree ${wt.id} and delete branch ${wt.branch}`);\n }\n return;\n }\n\n // Set worktree status to merging\n await updateManifest(projectRoot, (m) => {\n if (m.worktrees[wt.id]) {\n m.worktrees[wt.id].status = 'merging';\n }\n return m;\n });\n\n const strategy = options.strategy ?? 'squash';\n\n try {\n const currentBranch = await getCurrentBranch(projectRoot);\n if (currentBranch !== wt.baseBranch) {\n info(`Switching to base branch ${wt.baseBranch}`);\n await execa('git', ['checkout', wt.baseBranch], { ...execaEnv, cwd: projectRoot });\n }\n\n info(`Merging ${wt.branch} into ${wt.baseBranch} (${strategy})`);\n\n if (strategy === 'squash') {\n await execa('git', ['merge', '--squash', wt.branch], { ...execaEnv, cwd: projectRoot });\n await execa('git', ['commit', '-m', `ppg: merge ${wt.name} (${wt.branch})`], {\n ...execaEnv,\n cwd: projectRoot,\n });\n } else {\n await execa('git', ['merge', '--no-ff', wt.branch, '-m', `ppg: merge ${wt.name} (${wt.branch})`], {\n ...execaEnv,\n cwd: projectRoot,\n });\n }\n\n success(`Merged ${wt.branch} into ${wt.baseBranch}`);\n } catch (err) {\n await updateManifest(projectRoot, (m) => {\n if (m.worktrees[wt.id]) {\n m.worktrees[wt.id].status = 'failed';\n }\n return m;\n });\n throw new MergeFailedError(\n `Merge failed: ${err instanceof Error ? err.message : err}`,\n );\n }\n\n // Mark as merged\n await updateManifest(projectRoot, (m) => {\n if (m.worktrees[wt.id]) {\n m.worktrees[wt.id].status = 'merged';\n m.worktrees[wt.id].mergedAt = new Date().toISOString();\n }\n return m;\n });\n\n // Cleanup with self-protection\n let selfProtected = false;\n if (options.cleanup !== false) {\n info('Cleaning up...');\n\n const selfPaneId = getCurrentPaneId();\n let paneMap: Map<string, PaneInfo> | undefined;\n if (selfPaneId) {\n paneMap = await listSessionPanes(manifest.sessionName);\n }\n\n const cleanupResult = await cleanupWorktree(projectRoot, wt, { selfPaneId, paneMap });\n selfProtected = cleanupResult.selfProtected;\n\n if (selfProtected) {\n warn(`Some tmux targets skipped during cleanup — contains current ppg process`);\n }\n success(`Cleaned up worktree ${wt.id}`);\n }\n\n if (options.json) {\n output({\n success: true,\n worktreeId: wt.id,\n branch: wt.branch,\n baseBranch: wt.baseBranch,\n strategy,\n cleaned: options.cleanup !== false,\n selfProtected: selfProtected || undefined,\n }, true);\n }\n}\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport YAML from 'yaml';\nimport { swarmsDir, globalSwarmsDir } from '../lib/paths.js';\nimport { PpgError } from '../lib/errors.js';\n\nexport interface SwarmAgentEntry {\n prompt: string;\n agent?: string;\n vars?: Record<string, string>;\n}\n\nexport interface SwarmTemplate {\n name: string;\n description: string;\n strategy: 'shared' | 'isolated';\n agents: SwarmAgentEntry[];\n}\n\nconst SAFE_NAME = /^[\\w-]+$/;\n\nexport interface SwarmEntry {\n name: string;\n source: 'local' | 'global';\n}\n\nasync function readSwarmNames(dir: string): Promise<string[]> {\n try {\n const files = await fs.readdir(dir);\n return files\n .filter((f) => f.endsWith('.yaml') || f.endsWith('.yml'))\n .map((f) => f.replace(/\\.ya?ml$/, ''))\n .sort();\n } catch {\n return [];\n }\n}\n\nexport async function listSwarms(projectRoot: string): Promise<string[]> {\n const entries = await listSwarmsWithSource(projectRoot);\n return entries.map((e) => e.name);\n}\n\nexport async function listSwarmsWithSource(projectRoot: string): Promise<SwarmEntry[]> {\n const localNames = await readSwarmNames(swarmsDir(projectRoot));\n const globalNames = await readSwarmNames(globalSwarmsDir());\n\n const seen = new Set<string>();\n const result: SwarmEntry[] = [];\n\n for (const name of localNames) {\n seen.add(name);\n result.push({ name, source: 'local' });\n }\n\n for (const name of globalNames) {\n if (!seen.has(name)) {\n result.push({ name, source: 'global' });\n }\n }\n\n return result;\n}\n\nasync function trySwarmFile(dir: string, name: string): Promise<string | null> {\n const yamlPath = path.join(dir, `${name}.yaml`);\n try {\n await fs.access(yamlPath);\n return yamlPath;\n } catch {\n const ymlPath = path.join(dir, `${name}.yml`);\n try {\n await fs.access(ymlPath);\n return ymlPath;\n } catch {\n return null;\n }\n }\n}\n\nasync function resolveSwarmFile(projectRoot: string, name: string): Promise<string | null> {\n // Project-local first\n const local = await trySwarmFile(swarmsDir(projectRoot), name);\n if (local) return local;\n\n // Global fallback\n return trySwarmFile(globalSwarmsDir(), name);\n}\n\nexport async function loadSwarm(projectRoot: string, name: string): Promise<SwarmTemplate> {\n if (!SAFE_NAME.test(name)) {\n throw new PpgError(\n `Invalid swarm template name: \"${name}\" — must be alphanumeric, hyphens, or underscores`,\n 'INVALID_ARGS',\n );\n }\n\n // Try project-local first, then global\n const filePath = await resolveSwarmFile(projectRoot, name);\n\n if (!filePath) {\n throw new PpgError(`Swarm template not found: ${name}`, 'INVALID_ARGS');\n }\n\n const raw = await fs.readFile(filePath, 'utf-8');\n const parsed = YAML.parse(raw) as SwarmTemplate;\n\n if (!parsed || typeof parsed !== 'object') {\n throw new PpgError(`Invalid swarm template: ${name} (empty or malformed YAML)`, 'INVALID_ARGS');\n }\n\n if (!parsed.name || !parsed.agents || !Array.isArray(parsed.agents)) {\n throw new PpgError(`Invalid swarm template: ${name} (missing name or agents)`, 'INVALID_ARGS');\n }\n\n if (!SAFE_NAME.test(parsed.name)) {\n throw new PpgError(\n `Invalid swarm name: \"${parsed.name}\" — must be alphanumeric, hyphens, or underscores`,\n 'INVALID_ARGS',\n );\n }\n\n if (parsed.strategy && parsed.strategy !== 'shared' && parsed.strategy !== 'isolated') {\n throw new PpgError(\n `Invalid swarm strategy: ${parsed.strategy}. Must be 'shared' or 'isolated'`,\n 'INVALID_ARGS',\n );\n }\n\n // Validate each agent has a valid prompt name\n for (let i = 0; i < parsed.agents.length; i++) {\n const agent = parsed.agents[i];\n if (!agent.prompt || typeof agent.prompt !== 'string') {\n throw new PpgError(\n `Invalid swarm template: ${name} — agent[${i}] missing prompt field`,\n 'INVALID_ARGS',\n );\n }\n if (!SAFE_NAME.test(agent.prompt)) {\n throw new PpgError(\n `Invalid prompt name: \"${agent.prompt}\" — must be alphanumeric, hyphens, or underscores`,\n 'INVALID_ARGS',\n );\n }\n }\n\n return {\n ...parsed,\n strategy: parsed.strategy ?? 'shared',\n description: parsed.description ?? '',\n };\n}\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport { loadConfig, resolveAgentConfig } from '../core/config.js';\nimport { readManifest, updateManifest, resolveWorktree } from '../core/manifest.js';\nimport { getRepoRoot, getCurrentBranch, createWorktree } from '../core/worktree.js';\nimport { setupWorktreeEnv } from '../core/env.js';\nimport { renderTemplate, type TemplateContext } from '../core/template.js';\nimport { loadSwarm, type SwarmAgentEntry, type SwarmTemplate } from '../core/swarm.js';\nimport { spawnAgent } from '../core/agent.js';\nimport * as tmux from '../core/tmux.js';\nimport { openTerminalWindow } from '../core/terminal.js';\nimport { worktreeId as genWorktreeId, agentId as genAgentId, sessionId as genSessionId } from '../lib/id.js';\nimport { promptsDir, globalPromptsDir, manifestPath } from '../lib/paths.js';\nimport { PpgError, NotInitializedError, WorktreeNotFoundError } from '../lib/errors.js';\nimport { output, success, info } from '../lib/output.js';\nimport { normalizeName } from '../lib/name.js';\nimport { parseVars } from '../lib/vars.js';\nimport type { Config } from '../types/config.js';\nimport type { WorktreeEntry, AgentEntry } from '../types/manifest.js';\n\nexport interface SwarmOptions {\n worktree?: string;\n var?: string[];\n name?: string;\n base?: string;\n open?: boolean;\n json?: boolean;\n}\n\nexport async function swarmCommand(templateName: string, options: SwarmOptions): Promise<void> {\n const projectRoot = await getRepoRoot();\n const config = await loadConfig(projectRoot);\n\n // Verify initialized\n try {\n await fs.access(manifestPath(projectRoot));\n } catch {\n throw new NotInitializedError(projectRoot);\n }\n\n // Load swarm template\n const swarm = await loadSwarm(projectRoot, templateName);\n\n // Parse user vars\n const userVars = parseVars(options.var ?? []);\n\n if (options.worktree) {\n await swarmIntoExistingWorktree(projectRoot, config, swarm, options, userVars);\n } else if (swarm.strategy === 'isolated') {\n await swarmIsolated(projectRoot, config, swarm, options, userVars);\n } else {\n await swarmShared(projectRoot, config, swarm, options, userVars);\n }\n}\n\nasync function loadPromptFile(projectRoot: string, promptName: string): Promise<string> {\n // Try project-local first\n const localPath = path.join(promptsDir(projectRoot), `${promptName}.md`);\n try {\n return await fs.readFile(localPath, 'utf-8');\n } catch {\n // Fall back to global\n const globalPath = path.join(globalPromptsDir(), `${promptName}.md`);\n try {\n return await fs.readFile(globalPath, 'utf-8');\n } catch {\n throw new PpgError(\n `Prompt file not found: ${promptName}.md (checked .ppg/prompts/ and ~/.ppg/prompts/)`,\n 'INVALID_ARGS',\n );\n }\n }\n}\n\ninterface SpawnSwarmAgentOptions {\n projectRoot: string;\n config: Config;\n swarmAgent: SwarmAgentEntry;\n wtPath: string;\n branchName: string;\n tmuxTarget: string;\n taskName: string;\n userVars: Record<string, string>;\n}\n\nasync function spawnSwarmAgent(opts: SpawnSwarmAgentOptions): Promise<AgentEntry> {\n const { projectRoot, config, swarmAgent, wtPath, branchName, tmuxTarget, taskName, userVars } = opts;\n const agentConfig = resolveAgentConfig(config, swarmAgent.agent);\n const aId = genAgentId();\n\n const promptContent = await loadPromptFile(projectRoot, swarmAgent.prompt);\n const ctx: TemplateContext = {\n WORKTREE_PATH: wtPath,\n BRANCH: branchName,\n AGENT_ID: aId,\n PROJECT_ROOT: projectRoot,\n TASK_NAME: taskName,\n ...(swarmAgent.vars ?? {}),\n ...userVars,\n };\n const renderedPrompt = renderTemplate(promptContent, ctx);\n\n return spawnAgent({\n agentId: aId,\n agentConfig,\n prompt: renderedPrompt,\n worktreePath: wtPath,\n tmuxTarget,\n projectRoot,\n branch: branchName,\n sessionId: genSessionId(),\n });\n}\n\nasync function swarmShared(\n projectRoot: string,\n config: Config,\n swarm: SwarmTemplate,\n options: SwarmOptions,\n userVars: Record<string, string>,\n): Promise<void> {\n const baseBranch = options.base ?? await getCurrentBranch(projectRoot);\n const wtId = genWorktreeId();\n const name = options.name ? normalizeName(options.name, swarm.name) : swarm.name;\n const branchName = `ppg/${name}`;\n\n info(`Creating worktree ${wtId} on branch ${branchName}`);\n const wtPath = await createWorktree(projectRoot, wtId, {\n branch: branchName,\n base: baseBranch,\n });\n\n await setupWorktreeEnv(projectRoot, wtPath, config);\n\n const manifest = await readManifest(projectRoot);\n const sessionName = manifest.sessionName;\n await tmux.ensureSession(sessionName);\n const windowTarget = await tmux.createWindow(sessionName, name, wtPath);\n\n // Register worktree in manifest before spawning agents so partial failures are tracked\n await updateManifest(projectRoot, (m) => {\n m.worktrees[wtId] = {\n id: wtId,\n name,\n path: wtPath,\n branch: branchName,\n baseBranch,\n status: 'active',\n tmuxWindow: windowTarget,\n agents: {},\n createdAt: new Date().toISOString(),\n };\n return m;\n });\n\n const agents: AgentEntry[] = [];\n for (let i = 0; i < swarm.agents.length; i++) {\n const target = i === 0\n ? windowTarget\n : await tmux.createWindow(sessionName, `${name}-${i}`, wtPath);\n\n const agentEntry = await spawnSwarmAgent({\n projectRoot, config, swarmAgent: swarm.agents[i],\n wtPath, branchName, tmuxTarget: target, taskName: name, userVars,\n });\n agents.push(agentEntry);\n\n await updateManifest(projectRoot, (m) => {\n m.worktrees[wtId].agents[agentEntry.id] = agentEntry;\n return m;\n });\n }\n\n if (options.open === true) {\n openTerminalWindow(sessionName, windowTarget, name).catch(() => {});\n }\n\n outputResult(options.json, swarm, wtId, name, branchName, wtPath, windowTarget, agents);\n}\n\nasync function swarmIsolated(\n projectRoot: string,\n config: Config,\n swarm: SwarmTemplate,\n options: SwarmOptions,\n userVars: Record<string, string>,\n): Promise<void> {\n const baseBranch = options.base ?? await getCurrentBranch(projectRoot);\n const baseName = options.name ? normalizeName(options.name, swarm.name) : swarm.name;\n const manifest = await readManifest(projectRoot);\n const sessionName = manifest.sessionName;\n await tmux.ensureSession(sessionName);\n\n const worktrees: Array<{ id: string; name: string; branch: string; path: string; tmuxWindow: string }> = [];\n const allAgents: AgentEntry[] = [];\n\n const usedNames = new Set<string>();\n for (const swarmAgent of swarm.agents) {\n const wtId = genWorktreeId();\n let wtName = `${baseName}-${swarmAgent.prompt}`;\n if (usedNames.has(wtName)) {\n let suffix = 2;\n while (usedNames.has(`${wtName}-${suffix}`)) suffix++;\n wtName = `${wtName}-${suffix}`;\n }\n usedNames.add(wtName);\n const branchName = `ppg/${wtName}`;\n\n info(`Creating worktree ${wtId} on branch ${branchName}`);\n const wtPath = await createWorktree(projectRoot, wtId, {\n branch: branchName,\n base: baseBranch,\n });\n\n await setupWorktreeEnv(projectRoot, wtPath, config);\n const windowTarget = await tmux.createWindow(sessionName, wtName, wtPath);\n\n const agentEntry = await spawnSwarmAgent({\n projectRoot, config, swarmAgent,\n wtPath, branchName, tmuxTarget: windowTarget, taskName: wtName, userVars,\n });\n\n const worktreeEntry: WorktreeEntry = {\n id: wtId,\n name: wtName,\n path: wtPath,\n branch: branchName,\n baseBranch,\n status: 'active',\n tmuxWindow: windowTarget,\n agents: { [agentEntry.id]: agentEntry },\n createdAt: new Date().toISOString(),\n };\n\n await updateManifest(projectRoot, (m) => {\n m.worktrees[wtId] = worktreeEntry;\n return m;\n });\n\n if (options.open === true) {\n openTerminalWindow(sessionName, windowTarget, wtName).catch(() => {});\n }\n\n worktrees.push({ id: wtId, name: wtName, branch: branchName, path: wtPath, tmuxWindow: windowTarget });\n allAgents.push(agentEntry);\n }\n\n if (options.json) {\n output({\n success: true,\n swarm: swarm.name,\n strategy: 'isolated',\n worktrees: worktrees.map((wt, i) => ({\n ...wt,\n agents: [{ id: allAgents[i].id, tmuxTarget: allAgents[i].tmuxTarget, sessionId: allAgents[i].sessionId }],\n })),\n }, true);\n } else {\n success(`Swarm \"${swarm.name}\" spawned ${swarm.agents.length} agent(s) in isolated worktrees`);\n for (let i = 0; i < worktrees.length; i++) {\n info(` ${worktrees[i].name} (${worktrees[i].id}) → agent ${allAgents[i].id}`);\n }\n }\n}\n\nasync function swarmIntoExistingWorktree(\n projectRoot: string,\n config: Config,\n swarm: SwarmTemplate,\n options: SwarmOptions,\n userVars: Record<string, string>,\n): Promise<void> {\n const manifest = await readManifest(projectRoot);\n const wt = resolveWorktree(manifest, options.worktree!);\n\n if (!wt) throw new WorktreeNotFoundError(options.worktree!);\n\n const sessionName = manifest.sessionName;\n\n // Lazily create tmux window if worktree has none\n let windowTarget = wt.tmuxWindow;\n if (!windowTarget) {\n await tmux.ensureSession(sessionName);\n windowTarget = await tmux.createWindow(sessionName, wt.name, wt.path);\n }\n\n // Update tmux window before spawning so partial failures are tracked\n if (!wt.tmuxWindow) {\n await updateManifest(projectRoot, (m) => {\n m.worktrees[wt.id].tmuxWindow = windowTarget;\n return m;\n });\n }\n\n const agents: AgentEntry[] = [];\n for (let i = 0; i < swarm.agents.length; i++) {\n const target = i === 0\n ? windowTarget\n : await tmux.createWindow(sessionName, `${wt.name}-${swarm.name}-${i}`, wt.path);\n\n const agentEntry = await spawnSwarmAgent({\n projectRoot, config, swarmAgent: swarm.agents[i],\n wtPath: wt.path, branchName: wt.branch, tmuxTarget: target, taskName: wt.name, userVars,\n });\n agents.push(agentEntry);\n\n await updateManifest(projectRoot, (m) => {\n m.worktrees[wt.id].agents[agentEntry.id] = agentEntry;\n return m;\n });\n }\n\n if (options.open === true) {\n openTerminalWindow(sessionName, windowTarget, wt.name).catch(() => {});\n }\n\n outputResult(options.json, swarm, wt.id, wt.name, wt.branch, wt.path, windowTarget, agents);\n}\n\nfunction outputResult(\n json: boolean | undefined,\n swarm: SwarmTemplate,\n wtId: string,\n name: string,\n branch: string,\n wtPath: string,\n tmuxWindow: string,\n agents: AgentEntry[],\n): void {\n if (json) {\n output({\n success: true,\n swarm: swarm.name,\n strategy: swarm.strategy,\n worktree: { id: wtId, name, branch, path: wtPath, tmuxWindow },\n agents: agents.map((a) => ({ id: a.id, tmuxTarget: a.tmuxTarget, sessionId: a.sessionId })),\n }, true);\n } else {\n success(`Swarm \"${swarm.name}\" spawned ${agents.length} agent(s) in worktree ${wtId}`);\n for (const a of agents) {\n info(` Agent ${a.id} → ${a.tmuxTarget}`);\n }\n info(`Attach: ppg attach ${wtId}`);\n }\n}\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport { getRepoRoot } from '../core/worktree.js';\nimport { promptsDir, globalPromptsDir } from '../lib/paths.js';\nimport { PpgError } from '../lib/errors.js';\nimport { spawnCommand, type SpawnOptions } from './spawn.js';\n\nexport interface PromptCommandOptions {\n name?: string;\n agent?: string;\n var?: string[];\n base?: string;\n count?: number;\n split?: boolean;\n open?: boolean;\n json?: boolean;\n}\n\nasync function resolvePromptFile(projectRoot: string, promptName: string): Promise<string> {\n // Try project-local first\n const localPath = path.join(promptsDir(projectRoot), `${promptName}.md`);\n try {\n await fs.access(localPath);\n return localPath;\n } catch {\n // Fall back to global\n const globalPath = path.join(globalPromptsDir(), `${promptName}.md`);\n try {\n await fs.access(globalPath);\n return globalPath;\n } catch {\n throw new PpgError(\n `Prompt not found: ${promptName} (checked .ppg/prompts/ and ~/.ppg/prompts/)`,\n 'INVALID_ARGS',\n );\n }\n }\n}\n\nexport async function promptCommand(promptName: string, options: PromptCommandOptions): Promise<void> {\n const projectRoot = await getRepoRoot();\n const promptFilePath = await resolvePromptFile(projectRoot, promptName);\n\n const spawnOpts: SpawnOptions = {\n name: options.name ?? promptName,\n agent: options.agent,\n promptFile: promptFilePath,\n var: options.var,\n base: options.base,\n count: options.count,\n split: options.split,\n open: options.open,\n json: options.json,\n };\n\n await spawnCommand(spawnOpts);\n}\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport { getRepoRoot } from '../core/worktree.js';\nimport { listTemplatesWithSource } from '../core/template.js';\nimport { listSwarmsWithSource, loadSwarm } from '../core/swarm.js';\nimport { templatesDir, promptsDir, globalTemplatesDir, globalPromptsDir } from '../lib/paths.js';\nimport { PpgError } from '../lib/errors.js';\nimport { output, formatTable, type Column } from '../lib/output.js';\n\nexport interface ListOptions {\n json?: boolean;\n}\n\nexport async function listCommand(type: string, options: ListOptions): Promise<void> {\n if (type === 'templates') {\n await listTemplatesCommand(options);\n } else if (type === 'swarms') {\n await listSwarmsCommand(options);\n } else if (type === 'prompts') {\n await listPromptsCommand(options);\n } else {\n throw new PpgError(`Unknown list type: ${type}. Available: templates, swarms, prompts`, 'INVALID_ARGS');\n }\n}\n\nasync function listTemplatesCommand(options: ListOptions): Promise<void> {\n const projectRoot = await getRepoRoot();\n\n const entries = await listTemplatesWithSource(projectRoot);\n\n if (entries.length === 0) {\n console.log('No templates found in .ppg/templates/ or ~/.ppg/templates/');\n return;\n }\n\n const templates = await Promise.all(\n entries.map(async ({ name, source }) => {\n const dir = source === 'local' ? templatesDir(projectRoot) : globalTemplatesDir();\n const filePath = path.join(dir, `${name}.md`);\n const content = await fs.readFile(filePath, 'utf-8');\n const firstLine = content.split('\\n').find((l) => l.trim().length > 0) ?? '';\n const description = firstLine.replace(/^#+\\s*/, '').trim();\n\n const vars = [...content.matchAll(/\\{\\{(\\w+)\\}\\}/g)].map((m) => m[1]);\n const uniqueVars = [...new Set(vars)];\n\n return { name, description, variables: uniqueVars, source };\n }),\n );\n\n if (options.json) {\n output({ templates }, true);\n return;\n }\n\n const columns: Column[] = [\n { header: 'Name', key: 'name', width: 20 },\n { header: 'Description', key: 'description', width: 36 },\n {\n header: 'Variables',\n key: 'variables',\n width: 24,\n format: (v) => (v as string[]).join(', '),\n },\n { header: 'Source', key: 'source', width: 8 },\n ];\n\n console.log(formatTable(templates, columns));\n}\n\nasync function listSwarmsCommand(options: ListOptions): Promise<void> {\n const projectRoot = await getRepoRoot();\n\n const entries = await listSwarmsWithSource(projectRoot);\n\n if (entries.length === 0) {\n if (options.json) {\n output({ swarms: [] }, true);\n } else {\n console.log('No swarm templates found in .ppg/swarms/ or ~/.ppg/swarms/');\n }\n return;\n }\n\n const swarms = await Promise.all(\n entries.map(async ({ name, source }) => {\n const swarm = await loadSwarm(projectRoot, name);\n return {\n name,\n description: swarm.description,\n strategy: swarm.strategy,\n agents: swarm.agents.length,\n source,\n };\n }),\n );\n\n if (options.json) {\n output({ swarms }, true);\n return;\n }\n\n const columns: Column[] = [\n { header: 'Name', key: 'name', width: 20 },\n { header: 'Description', key: 'description', width: 34 },\n { header: 'Strategy', key: 'strategy', width: 10 },\n { header: 'Agents', key: 'agents', width: 8 },\n { header: 'Source', key: 'source', width: 8 },\n ];\n\n console.log(formatTable(swarms, columns));\n}\n\ninterface PromptEntry {\n name: string;\n source: 'local' | 'global';\n}\n\nasync function listPromptEntries(projectRoot: string): Promise<PromptEntry[]> {\n const localDir = promptsDir(projectRoot);\n const globalDir = globalPromptsDir();\n\n let localFiles: string[] = [];\n try {\n localFiles = (await fs.readdir(localDir)).filter((f) => f.endsWith('.md')).sort();\n } catch {\n // directory doesn't exist\n }\n\n let globalFiles: string[] = [];\n try {\n globalFiles = (await fs.readdir(globalDir)).filter((f) => f.endsWith('.md')).sort();\n } catch {\n // directory doesn't exist\n }\n\n const seen = new Set<string>();\n const result: PromptEntry[] = [];\n\n for (const file of localFiles) {\n const name = file.replace(/\\.md$/, '');\n seen.add(name);\n result.push({ name, source: 'local' });\n }\n\n for (const file of globalFiles) {\n const name = file.replace(/\\.md$/, '');\n if (!seen.has(name)) {\n result.push({ name, source: 'global' });\n }\n }\n\n return result;\n}\n\nasync function listPromptsCommand(options: ListOptions): Promise<void> {\n const projectRoot = await getRepoRoot();\n\n const entries = await listPromptEntries(projectRoot);\n\n if (entries.length === 0) {\n if (options.json) {\n output({ prompts: [] }, true);\n } else {\n console.log('No prompts found in .ppg/prompts/ or ~/.ppg/prompts/');\n }\n return;\n }\n\n const prompts = await Promise.all(\n entries.map(async ({ name, source }) => {\n const dir = source === 'local' ? promptsDir(projectRoot) : globalPromptsDir();\n const filePath = path.join(dir, `${name}.md`);\n const content = await fs.readFile(filePath, 'utf-8');\n const firstLine = content.split('\\n').find((l) => l.trim().length > 0) ?? '';\n const description = firstLine.replace(/^#+\\s*/, '').trim();\n\n const vars = [...content.matchAll(/\\{\\{(\\w+)\\}\\}/g)].map((m) => m[1]);\n const uniqueVars = [...new Set(vars)];\n\n return { name, description, variables: uniqueVars, source };\n }),\n );\n\n if (options.json) {\n output({ prompts }, true);\n return;\n }\n\n const columns: Column[] = [\n { header: 'Name', key: 'name', width: 20 },\n { header: 'Description', key: 'description', width: 36 },\n {\n header: 'Variables',\n key: 'variables',\n width: 24,\n format: (v) => (v as string[]).join(', '),\n },\n { header: 'Source', key: 'source', width: 8 },\n ];\n\n console.log(formatTable(prompts, columns));\n}\n","import fs from 'node:fs/promises';\nimport { requireManifest, updateManifest, findAgent } from '../core/manifest.js';\nimport { loadConfig, resolveAgentConfig } from '../core/config.js';\nimport { spawnAgent, killAgent } from '../core/agent.js';\nimport { getRepoRoot } from '../core/worktree.js';\nimport * as tmux from '../core/tmux.js';\nimport { openTerminalWindow } from '../core/terminal.js';\nimport { agentId as genAgentId, sessionId as genSessionId } from '../lib/id.js';\nimport { agentPromptFile } from '../lib/paths.js';\nimport { PpgError, AgentNotFoundError } from '../lib/errors.js';\nimport { output, success, info } from '../lib/output.js';\nimport { renderTemplate, type TemplateContext } from '../core/template.js';\n\nexport interface RestartOptions {\n prompt?: string;\n agent?: string;\n open?: boolean;\n json?: boolean;\n}\n\nexport async function restartCommand(agentRef: string, options: RestartOptions): Promise<void> {\n const projectRoot = await getRepoRoot();\n const config = await loadConfig(projectRoot);\n\n const manifest = await requireManifest(projectRoot);\n\n const found = findAgent(manifest, agentRef);\n if (!found) throw new AgentNotFoundError(agentRef);\n\n const { worktree: wt, agent: oldAgent } = found;\n\n // Kill old agent if still running\n if (oldAgent.status === 'running') {\n info(`Killing existing agent ${oldAgent.id}`);\n await killAgent(oldAgent);\n }\n\n // Read original prompt from prompt file, or use override\n let promptText: string;\n if (options.prompt) {\n promptText = options.prompt;\n } else {\n const pFile = agentPromptFile(projectRoot, oldAgent.id);\n try {\n promptText = await fs.readFile(pFile, 'utf-8');\n } catch {\n throw new PpgError(\n `Could not read original prompt for agent ${oldAgent.id}. Use --prompt to provide one.`,\n 'PROMPT_NOT_FOUND',\n );\n }\n }\n\n // Resolve agent config\n const agentConfig = resolveAgentConfig(config, options.agent ?? oldAgent.agentType);\n\n // Ensure tmux session\n await tmux.ensureSession(manifest.sessionName);\n\n // Create new tmux window in same worktree\n const newAgentId = genAgentId();\n const windowTarget = await tmux.createWindow(manifest.sessionName, `${wt.name}-restart`, wt.path);\n\n // Render template vars\n const ctx: TemplateContext = {\n WORKTREE_PATH: wt.path,\n BRANCH: wt.branch,\n AGENT_ID: newAgentId,\n PROJECT_ROOT: projectRoot,\n TASK_NAME: wt.name,\n PROMPT: promptText,\n };\n const renderedPrompt = renderTemplate(promptText, ctx);\n\n const newSessionId = genSessionId();\n const agentEntry = await spawnAgent({\n agentId: newAgentId,\n agentConfig,\n prompt: renderedPrompt,\n worktreePath: wt.path,\n tmuxTarget: windowTarget,\n projectRoot,\n branch: wt.branch,\n sessionId: newSessionId,\n });\n\n // Update manifest: mark old agent as gone, add new agent\n await updateManifest(projectRoot, (m) => {\n const mWt = m.worktrees[wt.id];\n if (mWt) {\n const mOldAgent = mWt.agents[oldAgent.id];\n if (mOldAgent && mOldAgent.status === 'running') {\n mOldAgent.status = 'gone';\n }\n mWt.agents[newAgentId] = agentEntry;\n }\n return m;\n });\n\n // Only open Terminal window when explicitly requested via --open (fire-and-forget)\n if (options.open === true) {\n openTerminalWindow(manifest.sessionName, windowTarget, `${wt.name}-restart`).catch(() => {});\n }\n\n if (options.json) {\n output({\n success: true,\n oldAgentId: oldAgent.id,\n newAgent: {\n id: newAgentId,\n tmuxTarget: windowTarget,\n sessionId: newSessionId,\n worktreeId: wt.id,\n worktreeName: wt.name,\n branch: wt.branch,\n path: wt.path,\n },\n }, true);\n } else {\n success(`Restarted agent ${oldAgent.id} → ${newAgentId} in worktree ${wt.name}`);\n info(` New agent ${newAgentId} → ${windowTarget}`);\n }\n}\n","import { execa } from 'execa';\nimport { requireManifest, resolveWorktree } from '../core/manifest.js';\nimport { getRepoRoot } from '../core/worktree.js';\nimport { WorktreeNotFoundError } from '../lib/errors.js';\nimport { output } from '../lib/output.js';\nimport { execaEnv } from '../lib/env.js';\n\nexport interface DiffOptions {\n stat?: boolean;\n nameOnly?: boolean;\n json?: boolean;\n}\n\nexport async function diffCommand(worktreeRef: string, options: DiffOptions): Promise<void> {\n const projectRoot = await getRepoRoot();\n\n const manifest = await requireManifest(projectRoot);\n\n const wt = resolveWorktree(manifest, worktreeRef);\n\n if (!wt) throw new WorktreeNotFoundError(worktreeRef);\n\n const diffRange = `${wt.baseBranch}...${wt.branch}`;\n\n if (options.json) {\n // Machine-readable: numstat for file-level changes\n const result = await execa('git', ['diff', '--numstat', diffRange], { ...execaEnv, cwd: projectRoot });\n const files = result.stdout.trim().split('\\n').filter(Boolean).map((line) => {\n const [added, removed, file] = line.split('\\t');\n return {\n file,\n added: added === '-' ? 0 : parseInt(added, 10),\n removed: removed === '-' ? 0 : parseInt(removed, 10),\n };\n });\n output({\n worktreeId: wt.id,\n branch: wt.branch,\n baseBranch: wt.baseBranch,\n files,\n }, true);\n } else if (options.stat) {\n const result = await execa('git', ['diff', '--stat', diffRange], { ...execaEnv, cwd: projectRoot });\n console.log(result.stdout);\n } else if (options.nameOnly) {\n const result = await execa('git', ['diff', '--name-only', diffRange], { ...execaEnv, cwd: projectRoot });\n console.log(result.stdout);\n } else {\n const result = await execa('git', ['diff', diffRange], { ...execaEnv, cwd: projectRoot });\n console.log(result.stdout);\n }\n}\n","import { execa } from 'execa';\nimport { updateManifest, resolveWorktree } from '../core/manifest.js';\nimport { refreshAllAgentStatuses } from '../core/agent.js';\nimport { getRepoRoot } from '../core/worktree.js';\nimport { PpgError, NotInitializedError, WorktreeNotFoundError, GhNotFoundError } from '../lib/errors.js';\nimport { output, success, info } from '../lib/output.js';\nimport { execaEnv } from '../lib/env.js';\n\n// GitHub PR body limit is 65536 chars; leave room for truncation notice\nconst MAX_BODY_LENGTH = 60_000;\n\nexport interface PrOptions {\n title?: string;\n body?: string;\n draft?: boolean;\n json?: boolean;\n}\n\nexport async function prCommand(worktreeRef: string, options: PrOptions): Promise<void> {\n const projectRoot = await getRepoRoot();\n\n let manifest;\n try {\n manifest = await updateManifest(projectRoot, async (m) => {\n return refreshAllAgentStatuses(m, projectRoot);\n });\n } catch {\n throw new NotInitializedError(projectRoot);\n }\n\n const wt = resolveWorktree(manifest, worktreeRef);\n if (!wt) throw new WorktreeNotFoundError(worktreeRef);\n\n // Verify gh is available\n try {\n await execa('gh', ['--version'], execaEnv);\n } catch {\n throw new GhNotFoundError();\n }\n\n // Push the worktree branch\n info(`Pushing branch ${wt.branch} to origin`);\n try {\n await execa('git', ['push', '-u', 'origin', wt.branch], { ...execaEnv, cwd: projectRoot });\n } catch (err) {\n throw new PpgError(\n `Failed to push branch ${wt.branch}: ${err instanceof Error ? err.message : err}`,\n 'INVALID_ARGS',\n );\n }\n\n // Build PR title and body\n const title = options.title ?? wt.name;\n const body = options.body ?? await buildBodyFromResults(Object.values(wt.agents));\n\n // Build gh pr create args\n const ghArgs = [\n 'pr', 'create',\n '--head', wt.branch,\n '--base', wt.baseBranch,\n '--title', title,\n '--body', body,\n ];\n if (options.draft) {\n ghArgs.push('--draft');\n }\n\n info(`Creating PR: ${title}`);\n let prUrl: string;\n try {\n const result = await execa('gh', ghArgs, { ...execaEnv, cwd: projectRoot });\n prUrl = result.stdout.trim();\n } catch (err) {\n throw new PpgError(\n `Failed to create PR: ${err instanceof Error ? err.message : err}`,\n 'INVALID_ARGS',\n );\n }\n\n // Store PR URL in manifest\n await updateManifest(projectRoot, (m) => {\n if (m.worktrees[wt.id]) {\n m.worktrees[wt.id].prUrl = prUrl;\n }\n return m;\n });\n\n if (options.json) {\n output({\n success: true,\n worktreeId: wt.id,\n branch: wt.branch,\n baseBranch: wt.baseBranch,\n prUrl,\n }, true);\n } else {\n success(`PR created: ${prUrl}`);\n }\n}\n\n/** Build PR body from agent prompts, with truncation. */\nexport async function buildBodyFromResults(agents: { id: string; prompt: string }[]): Promise<string> {\n if (agents.length === 0) return '';\n const sections = agents.map((a) => `## Agent: ${a.id}\\n\\n${a.prompt}`);\n return truncateBody(sections.join('\\n\\n---\\n\\n'));\n}\n\n/** Truncate body to stay within GitHub's PR body size limit. */\nexport function truncateBody(body: string): string {\n if (body.length <= MAX_BODY_LENGTH) return body;\n return body.slice(0, MAX_BODY_LENGTH) + '\\n\\n---\\n\\n*[Truncated — full results available in `.ppg/results/`]*';\n}\n","import { updateManifest } from '../core/manifest.js';\nimport { refreshAllAgentStatuses, killAgents } from '../core/agent.js';\nimport { checkPrState } from '../core/pr.js';\nimport { getRepoRoot, pruneWorktrees } from '../core/worktree.js';\nimport { cleanupWorktree } from '../core/cleanup.js';\nimport { getCurrentPaneId, excludeSelf, wouldCleanupAffectSelf } from '../core/self.js';\nimport { listSessionPanes, killOrphanWindows, type PaneInfo } from '../core/tmux.js';\nimport { NotInitializedError, UnmergedWorkError } from '../lib/errors.js';\nimport { output, success, info, warn } from '../lib/output.js';\nimport type { AgentEntry, WorktreeEntry } from '../types/manifest.js';\n\n/** Identify worktrees with idle/exited agents that haven't been merged or PR'd. */\nexport function findAtRiskWorktrees(worktrees: WorktreeEntry[]): WorktreeEntry[] {\n return worktrees.filter((wt) => {\n if (wt.status === 'merged' || wt.status === 'cleaned') return false;\n if (wt.prUrl) return false;\n // Agents that finished (idle or exited) represent potentially unmerged work\n return Object.values(wt.agents).some((a) => a.status === 'idle' || a.status === 'exited');\n });\n}\n\nexport interface ResetOptions {\n force?: boolean;\n prune?: boolean;\n includeOpenPrs?: boolean;\n json?: boolean;\n}\n\nexport async function resetCommand(options: ResetOptions): Promise<void> {\n const projectRoot = await getRepoRoot();\n\n let manifest;\n try {\n manifest = await updateManifest(projectRoot, async (m) => {\n return refreshAllAgentStatuses(m, projectRoot);\n });\n } catch {\n throw new NotInitializedError(projectRoot);\n }\n\n const worktrees = Object.values(manifest.worktrees);\n\n if (worktrees.length === 0) {\n if (options.json) {\n output({ success: true, killed: [], removed: [], warned: [] }, true);\n } else {\n info('Nothing to reset — no worktrees in manifest');\n }\n return;\n }\n\n // Safety check: identify worktrees with unmerged/un-PR'd completed work\n const atRisk = findAtRiskWorktrees(worktrees);\n\n if (atRisk.length > 0 && !options.force) {\n throw new UnmergedWorkError(atRisk.map((wt) => `${wt.name} (${wt.branch})`));\n }\n\n if (atRisk.length > 0) {\n warn(`${atRisk.length} worktree(s) have unmerged/un-PR'd work — proceeding with --force`);\n }\n\n // Build self-protection context\n const selfPaneId = getCurrentPaneId();\n let paneMap: Map<string, PaneInfo> | undefined;\n if (selfPaneId) {\n paneMap = await listSessionPanes(manifest.sessionName);\n }\n\n // Collect all running agents\n const allAgents: AgentEntry[] = [];\n for (const wt of worktrees) {\n for (const agent of Object.values(wt.agents)) {\n if (agent.status === 'running') {\n allAgents.push(agent);\n }\n }\n }\n\n // Self-protection for agents\n let agentsToKill = allAgents;\n const skippedAgentIds: string[] = [];\n if (selfPaneId && paneMap) {\n const { safe, skipped } = excludeSelf(allAgents, selfPaneId, paneMap);\n agentsToKill = safe;\n for (const a of skipped) {\n skippedAgentIds.push(a.id);\n warn(`Skipping agent ${a.id} — contains current ppg process`);\n }\n }\n\n // Kill running agents\n const killedIds = agentsToKill.map((a) => a.id);\n if (agentsToKill.length > 0) {\n info(`Killing ${agentsToKill.length} running agent(s)`);\n await killAgents(agentsToKill);\n }\n\n // Update agent statuses in manifest\n if (killedIds.length > 0) {\n await updateManifest(projectRoot, (m) => {\n for (const wt of Object.values(m.worktrees)) {\n for (const agent of Object.values(wt.agents)) {\n if (killedIds.includes(agent.id)) {\n agent.status = 'gone';\n }\n }\n }\n return m;\n });\n }\n\n // Check for open PRs before cleanup\n const openPrWorktreeIds: string[] = [];\n if (!options.includeOpenPrs) {\n for (const wt of worktrees) {\n if (wt.status === 'cleaned') continue;\n const prState = await checkPrState(wt.branch);\n if (prState === 'OPEN') {\n openPrWorktreeIds.push(wt.id);\n warn(`Skipping worktree ${wt.id} (${wt.name}) — has open PR on branch ${wt.branch}`);\n }\n }\n }\n\n // Cleanup all worktrees (skip already cleaned/merged that are already gone)\n const removedIds: string[] = [];\n const skippedWorktreeIds: string[] = [];\n\n for (const wt of worktrees) {\n if (openPrWorktreeIds.includes(wt.id)) {\n continue;\n }\n\n // Self-protection check for worktree cleanup\n if (selfPaneId && paneMap && wouldCleanupAffectSelf(wt, selfPaneId, paneMap)) {\n warn(`Skipping cleanup of worktree ${wt.id} (${wt.name}) — contains current ppg process`);\n skippedWorktreeIds.push(wt.id);\n continue;\n }\n\n if (wt.status !== 'cleaned') {\n info(`Removing worktree ${wt.id} (${wt.name})`);\n await cleanupWorktree(projectRoot, wt, { selfPaneId, paneMap });\n }\n removedIds.push(wt.id);\n }\n\n // Remove all cleaned worktrees from manifest\n if (removedIds.length > 0) {\n await updateManifest(projectRoot, (m) => {\n for (const id of removedIds) {\n delete m.worktrees[id];\n }\n return m;\n });\n }\n\n // Kill any orphaned tmux windows left in the session (e.g., from failed cleanups)\n // Pass selfPaneId so we don't kill the conductor's own window\n const orphansKilled = await killOrphanWindows(manifest.sessionName, selfPaneId);\n if (orphansKilled > 0) {\n info(`Killed ${orphansKilled} orphaned tmux window(s)`);\n }\n\n // Optional git worktree prune\n if (options.prune) {\n info('Pruning stale git worktrees');\n await pruneWorktrees(projectRoot);\n }\n\n const warnedNames = atRisk.map((wt) => wt.name);\n\n if (options.json) {\n output({\n success: true,\n killed: killedIds,\n removed: removedIds,\n warned: warnedNames.length > 0 ? warnedNames : undefined,\n skipped: skippedWorktreeIds.length > 0 ? skippedWorktreeIds : undefined,\n skippedOpenPrs: openPrWorktreeIds.length > 0 ? openPrWorktreeIds : undefined,\n pruned: options.prune ?? false,\n }, true);\n } else {\n if (killedIds.length > 0) {\n success(`Killed ${killedIds.length} agent(s)`);\n }\n if (removedIds.length > 0) {\n success(`Removed ${removedIds.length} worktree(s)`);\n }\n if (skippedWorktreeIds.length > 0) {\n warn(`Skipped ${skippedWorktreeIds.length} worktree(s) due to self-protection`);\n }\n if (options.prune) {\n success('Pruned stale git worktrees');\n }\n if (killedIds.length > 0 || removedIds.length > 0) {\n success('Reset complete');\n } else {\n info('Nothing to reset');\n }\n }\n}\n","import { requireManifest, updateManifest } from '../core/manifest.js';\nimport { checkPrState } from '../core/pr.js';\nimport { getRepoRoot, pruneWorktrees } from '../core/worktree.js';\nimport { cleanupWorktree } from '../core/cleanup.js';\nimport { getCurrentPaneId, wouldCleanupAffectSelf } from '../core/self.js';\nimport { listSessionPanes, type PaneInfo } from '../core/tmux.js';\nimport { output, success, info, warn } from '../lib/output.js';\nimport type { WorktreeEntry } from '../types/manifest.js';\n\nexport interface CleanOptions {\n all?: boolean;\n dryRun?: boolean;\n prune?: boolean;\n includeOpenPrs?: boolean;\n json?: boolean;\n}\n\nexport async function cleanCommand(options: CleanOptions): Promise<void> {\n const projectRoot = await getRepoRoot();\n\n const manifest = await requireManifest(projectRoot);\n\n // Build self-protection context if inside tmux\n const selfPaneId = getCurrentPaneId();\n let paneMap: Map<string, PaneInfo> | undefined;\n if (selfPaneId) {\n paneMap = await listSessionPanes(manifest.sessionName);\n }\n\n // Find worktrees in terminal states\n const terminalStatuses = ['merged', 'cleaned'];\n if (options.all) {\n terminalStatuses.push('failed');\n }\n\n const toClean = Object.values(manifest.worktrees)\n .filter((wt) => terminalStatuses.includes(wt.status));\n\n // Also find worktrees already marked 'cleaned' that still have manifest entries\n const toRemoveFromManifest = Object.values(manifest.worktrees)\n .filter((wt) => wt.status === 'cleaned');\n\n if (options.dryRun) {\n if (toClean.length === 0 && toRemoveFromManifest.length === 0) {\n info('Nothing to clean');\n } else {\n info('Dry run — would clean:');\n for (const wt of toClean) {\n if (wt.status !== 'cleaned') {\n info(` ${wt.id} (${wt.name}) — ${wt.status}`);\n }\n }\n for (const wt of toRemoveFromManifest) {\n info(` ${wt.id} (${wt.name}) — remove from manifest`);\n }\n }\n\n if (options.json) {\n output({\n dryRun: true,\n wouldClean: toClean.filter((wt) => wt.status !== 'cleaned').map((wt) => ({\n id: wt.id,\n name: wt.name,\n status: wt.status,\n })),\n wouldRemoveFromManifest: toRemoveFromManifest.map((wt) => ({\n id: wt.id,\n name: wt.name,\n })),\n }, true);\n }\n return;\n }\n\n // Check for open PRs before cleaning failed worktrees\n const openPrWorktreeIds: string[] = [];\n if (options.all && !options.includeOpenPrs) {\n for (const wt of toClean) {\n if (wt.status === 'failed') {\n const prState = await checkPrState(wt.branch);\n if (prState === 'OPEN') {\n openPrWorktreeIds.push(wt.id);\n warn(`Skipping worktree ${wt.id} (${wt.name}) — has open PR on branch ${wt.branch}`);\n }\n }\n }\n }\n\n // Clean worktrees that need cleanup (merged, failed but not yet cleaned)\n const cleaned: string[] = [];\n const skipped: string[] = [];\n const removed: string[] = [];\n\n for (const wt of toClean) {\n if (openPrWorktreeIds.includes(wt.id)) {\n continue;\n }\n\n if (wt.status !== 'cleaned') {\n // Self-protection check before cleanup\n if (selfPaneId && paneMap && wouldCleanupAffectSelf(wt, selfPaneId, paneMap)) {\n warn(`Skipping cleanup of worktree ${wt.id} (${wt.name}) — contains current ppg process`);\n skipped.push(wt.id);\n continue;\n }\n\n info(`Cleaning worktree ${wt.id} (${wt.name})`);\n await cleanupWorktree(projectRoot, wt, { selfPaneId, paneMap });\n cleaned.push(wt.id);\n }\n }\n\n // Remove cleaned entries from manifest\n const allCleanedIds = [...new Set([\n ...toRemoveFromManifest.map((wt) => wt.id),\n ...cleaned,\n ])];\n\n if (allCleanedIds.length > 0) {\n await updateManifest(projectRoot, (m) => {\n for (const id of allCleanedIds) {\n delete m.worktrees[id];\n }\n return m;\n });\n removed.push(...allCleanedIds);\n }\n\n // Git worktree prune\n if (options.prune) {\n info('Pruning stale git worktrees');\n await pruneWorktrees(projectRoot);\n }\n\n if (options.json) {\n output({\n success: true,\n cleaned,\n skipped: skipped.length > 0 ? skipped : undefined,\n skippedOpenPrs: openPrWorktreeIds.length > 0 ? openPrWorktreeIds : undefined,\n removedFromManifest: removed,\n pruned: options.prune ?? false,\n }, true);\n } else {\n if (cleaned.length > 0) {\n success(`Cleaned ${cleaned.length} worktree(s)`);\n }\n if (skipped.length > 0) {\n warn(`Skipped ${skipped.length} worktree(s) due to self-protection`);\n }\n if (removed.length > 0) {\n success(`Removed ${removed.length} worktree(s) from manifest`);\n }\n if (cleaned.length === 0 && removed.length === 0 && skipped.length === 0) {\n info('Nothing to clean');\n }\n if (options.prune) {\n success('Pruned stale git worktrees');\n }\n }\n}\n","import { requireManifest, findAgent } from '../core/manifest.js';\nimport { getRepoRoot } from '../core/worktree.js';\nimport * as tmux from '../core/tmux.js';\nimport { AgentNotFoundError } from '../lib/errors.js';\nimport { output, success } from '../lib/output.js';\n\nexport interface SendOptions {\n keys?: boolean;\n enter?: boolean;\n json?: boolean;\n}\n\nexport async function sendCommand(agentId: string, text: string, options: SendOptions): Promise<void> {\n const projectRoot = await getRepoRoot();\n\n const manifest = await requireManifest(projectRoot);\n\n const found = findAgent(manifest, agentId);\n if (!found) throw new AgentNotFoundError(agentId);\n\n const { agent } = found;\n\n if (options.keys) {\n // Raw tmux key names (e.g., \"C-c\", \"Enter\", \"Escape\")\n await tmux.sendRawKeys(agent.tmuxTarget, text);\n } else if (options.enter === false) {\n // Send literal text without Enter\n await tmux.sendLiteral(agent.tmuxTarget, text);\n } else {\n // Default: send literal text + Enter\n await tmux.sendKeys(agent.tmuxTarget, text);\n }\n\n if (options.json) {\n output({\n success: true,\n agentId: agent.id,\n tmuxTarget: agent.tmuxTarget,\n text,\n }, true);\n } else {\n success(`Sent to agent ${agent.id}`);\n }\n}\n","import { requireManifest, updateManifest, resolveWorktree } from '../core/manifest.js';\nimport { refreshAllAgentStatuses } from '../core/agent.js';\nimport { getRepoRoot } from '../core/worktree.js';\nimport { PpgError, WorktreeNotFoundError } from '../lib/errors.js';\nimport { output, info } from '../lib/output.js';\nimport type { AgentEntry, Manifest } from '../types/manifest.js';\n\nexport interface WaitOptions {\n all?: boolean;\n timeout?: number;\n interval?: number;\n json?: boolean;\n}\n\nexport async function waitCommand(worktreeRef: string | undefined, options: WaitOptions): Promise<void> {\n const projectRoot = await getRepoRoot();\n const interval = (options.interval ?? 5) * 1000;\n const timeout = options.timeout ? options.timeout * 1000 : undefined;\n const startTime = Date.now();\n\n if (!worktreeRef && !options.all) {\n throw new PpgError('Specify a worktree ID or use --all', 'INVALID_ARGS');\n }\n\n if (!options.json) {\n info('Waiting for agents to complete...');\n }\n\n while (true) {\n // Check timeout\n if (timeout && (Date.now() - startTime) >= timeout) {\n const manifest = await refreshAndGet(projectRoot);\n const agents = collectAgents(manifest, worktreeRef, options.all);\n if (options.json) {\n output({\n timedOut: true,\n agents: agents.map(formatAgent),\n }, true);\n }\n throw new PpgError('Timed out waiting for agents', 'WAIT_TIMEOUT', 2);\n }\n\n const manifest = await refreshAndGet(projectRoot);\n const agents = collectAgents(manifest, worktreeRef, options.all);\n // Wait until all agents are not running (idle, exited, or gone)\n const allDone = agents.every((a) => a.status !== 'running');\n\n if (allDone) {\n const anyFailed = agents.some((a) => a.status === 'exited' && a.exitCode !== undefined && a.exitCode !== 0);\n\n if (options.json) {\n output({\n timedOut: false,\n agents: agents.map(formatAgent),\n }, true);\n } else {\n for (const a of agents) {\n info(` ${a.id}: ${a.status}`);\n }\n }\n\n if (anyFailed) {\n throw new PpgError('Some agents failed', 'AGENTS_FAILED', 1);\n }\n return;\n }\n\n // Wait before next poll\n await new Promise((resolve) => setTimeout(resolve, interval));\n }\n}\n\nasync function refreshAndGet(projectRoot: string): Promise<Manifest> {\n await requireManifest(projectRoot);\n return await updateManifest(projectRoot, async (m) => {\n return refreshAllAgentStatuses(m, projectRoot);\n });\n}\n\nfunction collectAgents(\n manifest: Manifest,\n worktreeRef: string | undefined,\n all?: boolean,\n): AgentEntry[] {\n if (all) {\n const agents: AgentEntry[] = [];\n for (const wt of Object.values(manifest.worktrees)) {\n agents.push(...Object.values(wt.agents));\n }\n return agents;\n }\n\n const wt = resolveWorktree(manifest, worktreeRef!);\n if (!wt) throw new WorktreeNotFoundError(worktreeRef!);\n return Object.values(wt.agents);\n}\n\nfunction formatAgent(a: AgentEntry) {\n return {\n id: a.id,\n status: a.status,\n agentType: a.agentType,\n exitCode: a.exitCode,\n startedAt: a.startedAt,\n };\n}\n","import { loadConfig } from '../core/config.js';\nimport { requireManifest, updateManifest } from '../core/manifest.js';\nimport { getRepoRoot, getCurrentBranch, createWorktree, adoptWorktree } from '../core/worktree.js';\nimport { setupWorktreeEnv } from '../core/env.js';\nimport { worktreeId as genWorktreeId } from '../lib/id.js';\nimport { PpgError } from '../lib/errors.js';\nimport { output, success, info } from '../lib/output.js';\nimport { normalizeName } from '../lib/name.js';\nimport type { WorktreeEntry } from '../types/manifest.js';\n\nexport interface WorktreeCreateOptions {\n name?: string;\n base?: string;\n branch?: string;\n json?: boolean;\n}\n\nexport async function worktreeCreateCommand(options: WorktreeCreateOptions): Promise<void> {\n // Validate conflicting flags\n if (options.branch && options.base) {\n throw new PpgError('--branch and --base are mutually exclusive (--base is for new branches)', 'INVALID_ARGS');\n }\n\n const projectRoot = await getRepoRoot();\n const config = await loadConfig(projectRoot);\n\n // Verify initialized\n await requireManifest(projectRoot);\n\n const wtId = genWorktreeId();\n let name: string;\n let branchName: string;\n let baseBranch: string;\n let wtPath: string;\n\n if (options.branch) {\n // Adopt an existing branch\n branchName = options.branch;\n const derivedName = branchName.startsWith('ppg/') ? branchName.slice(4) : branchName;\n name = options.name ? normalizeName(options.name, wtId) : normalizeName(derivedName, wtId);\n baseBranch = await getCurrentBranch(projectRoot);\n\n info(`Creating worktree ${wtId} from existing branch ${branchName}`);\n wtPath = await adoptWorktree(projectRoot, wtId, branchName);\n } else {\n // Create a new branch\n baseBranch = options.base ?? await getCurrentBranch(projectRoot);\n name = options.name ? normalizeName(options.name, wtId) : wtId;\n branchName = `ppg/${name}`;\n\n info(`Creating worktree ${wtId} on branch ${branchName}`);\n wtPath = await createWorktree(projectRoot, wtId, {\n branch: branchName,\n base: baseBranch,\n });\n }\n\n // Setup env\n await setupWorktreeEnv(projectRoot, wtPath, config);\n\n // Register in manifest with empty tmuxWindow and no agents\n const worktreeEntry: WorktreeEntry = {\n id: wtId,\n name,\n path: wtPath,\n branch: branchName,\n baseBranch,\n status: 'active',\n tmuxWindow: '',\n agents: {},\n createdAt: new Date().toISOString(),\n };\n\n await updateManifest(projectRoot, (m) => {\n m.worktrees[wtId] = worktreeEntry;\n return m;\n });\n\n if (options.json) {\n output({\n success: true,\n worktree: {\n id: wtId,\n name,\n branch: branchName,\n baseBranch,\n path: wtPath,\n },\n }, true);\n } else {\n success(`Created worktree ${wtId} (${name}) on branch ${branchName}`);\n info(`Path: ${wtPath}`);\n info(`Spawn agents: ppg spawn --worktree ${wtId} --prompt \"your task\"`);\n }\n}\n","import { access } from 'node:fs/promises';\nimport path from 'node:path';\nimport { execa } from 'execa';\nimport { getRepoRoot } from '../core/worktree.js';\nimport { readManifest } from '../core/manifest.js';\nimport { manifestPath } from '../lib/paths.js';\nimport { NotInitializedError, PpgError } from '../lib/errors.js';\nimport { info } from '../lib/output.js';\n\nexport async function findDashboardBinary(projectRoot: string): Promise<string | null> {\n const localBuild = path.join(\n projectRoot,\n 'PPG CLI',\n 'build',\n 'Build',\n 'Products',\n 'Release',\n 'PPG CLI.app',\n 'Contents',\n 'MacOS',\n 'PPG CLI',\n );\n\n try {\n await access(localBuild);\n return localBuild;\n } catch {\n // not found, fall through\n }\n\n const appsBuild = '/Applications/PPG CLI.app/Contents/MacOS/PPG CLI';\n try {\n await access(appsBuild);\n return appsBuild;\n } catch {\n // not found, fall through\n }\n\n try {\n const result = await execa('mdfind', [\n 'kMDItemCFBundleIdentifier == \"com.2wit.PPG-CLI\"',\n ]);\n const appPath = result.stdout.trim().split('\\n')[0];\n if (appPath) {\n const binaryPath = path.join(appPath, 'Contents', 'MacOS', 'PPG CLI');\n try {\n await access(binaryPath);\n return binaryPath;\n } catch {\n // found app but no binary\n }\n }\n } catch {\n // mdfind failed\n }\n\n return null;\n}\n\nexport async function uiCommand(): Promise<void> {\n const projectRoot = await getRepoRoot();\n let manifest;\n try {\n manifest = await readManifest(projectRoot);\n } catch {\n throw new NotInitializedError(projectRoot);\n }\n\n const binaryPath = await findDashboardBinary(projectRoot);\n if (!binaryPath) {\n throw new PpgError(\n `Dashboard app not found. Install it with:\\n ppg install-dashboard\\n\\nOr build from source:\\n cd \"PPG CLI\" && xcodebuild -scheme \"PPG CLI\" -configuration Release -derivedDataPath build build`,\n 'DASHBOARD_NOT_FOUND',\n );\n }\n\n const mPath = manifestPath(projectRoot);\n const proc = execa(binaryPath, [\n '--manifest-path', mPath,\n '--session-name', manifest.sessionName,\n '--project-root', projectRoot,\n ], {\n detached: true,\n stdio: 'ignore',\n });\n proc.unref();\n\n info(`Dashboard launched for ${manifest.sessionName}`);\n}\n","import { createWriteStream } from 'node:fs';\nimport { mkdir, cp, rm } from 'node:fs/promises';\nimport { createRequire } from 'node:module';\nimport { tmpdir } from 'node:os';\nimport path from 'node:path';\nimport { pipeline } from 'node:stream/promises';\nimport { Readable } from 'node:stream';\nimport { execa } from 'execa';\nimport { output, info, success } from '../lib/output.js';\nimport { PpgError } from '../lib/errors.js';\n\nconst require = createRequire(import.meta.url);\n\nconst REPO = '2witstudios/ppg-cli';\nconst ASSET_NAME = 'PPG-CLI-Dashboard.dmg';\nconst APP_NAME = 'PPG CLI.app';\n\nfunction getVersion(): string {\n const pkg = require('../package.json') as { version: string };\n return pkg.version;\n}\n\nexport async function installDashboardCommand(options: {\n dir: string;\n json: boolean;\n}): Promise<void> {\n const { dir, json } = options;\n\n try {\n const version = getVersion();\n const tag = `v${version}`;\n const url = `https://github.com/${REPO}/releases/download/${tag}/${ASSET_NAME}`;\n\n if (!json) info(`Downloading dashboard ${tag} from GitHub Releases…`);\n\n const res = await fetch(url);\n if (!res.ok) {\n if (res.status === 404) {\n throw new PpgError(\n `Dashboard release not found for ${tag}. The dashboard may not be available for this version yet.\\nCheck: https://github.com/${REPO}/releases/tag/${tag}`,\n 'DASHBOARD_NOT_FOUND',\n );\n }\n throw new PpgError(\n `Failed to download dashboard: HTTP ${res.status} ${res.statusText}`,\n 'DOWNLOAD_FAILED',\n );\n }\n\n // Download to temp directory\n const tmp = path.join(tmpdir(), `ppg-dashboard-${Date.now()}`);\n await mkdir(tmp, { recursive: true });\n const dmgPath = path.join(tmp, ASSET_NAME);\n\n const body = res.body;\n if (!body) throw new PpgError('Empty response body', 'DOWNLOAD_FAILED');\n await pipeline(\n Readable.fromWeb(body as import('stream/web').ReadableStream),\n createWriteStream(dmgPath),\n );\n\n if (!json) info('Mounting…');\n\n // Mount DMG\n const mountResult = await execa('hdiutil', ['attach', dmgPath, '-nobrowse', '-quiet']);\n const mountLine = mountResult.stdout.trim().split('\\n').pop() ?? '';\n const mountPoint = mountLine.split('\\t').pop()?.trim();\n\n if (!mountPoint) {\n throw new PpgError('Failed to mount DMG — could not determine mount point', 'INSTALL_FAILED');\n }\n\n try {\n const srcApp = path.join(mountPoint, APP_NAME);\n const destApp = path.join(dir, APP_NAME);\n\n if (!json) info('Installing…');\n\n // Remove existing installation if present\n await rm(destApp, { recursive: true, force: true });\n // Copy .app from mounted volume\n await cp(srcApp, destApp, { recursive: true });\n\n // Remove quarantine attribute\n try {\n await execa('xattr', ['-dr', 'com.apple.quarantine', destApp]);\n } catch {\n // Quarantine attribute may not exist — that's fine\n }\n\n if (json) {\n output({ success: true, version, path: destApp }, true);\n } else {\n success(`Dashboard ${tag} installed to ${destApp}`);\n }\n } finally {\n // Always unmount\n await execa('hdiutil', ['detach', mountPoint, '-quiet']).catch(() => {});\n }\n\n // Clean up temp\n await rm(tmp, { recursive: true, force: true });\n } catch (err) {\n if (err instanceof PpgError) throw err;\n const message = err instanceof Error ? err.message : String(err);\n throw new PpgError(`Dashboard installation failed: ${message}`, 'INSTALL_FAILED');\n }\n}\n","import fs from 'node:fs/promises';\nimport YAML from 'yaml';\nimport { CronExpressionParser } from 'cron-parser';\nimport { schedulesPath } from '../lib/paths.js';\nimport { PpgError } from '../lib/errors.js';\nimport type { ScheduleEntry, SchedulesConfig } from '../types/schedule.js';\n\nconst SAFE_NAME = /^[\\w-]+$/;\n\nexport async function loadSchedules(projectRoot: string): Promise<ScheduleEntry[]> {\n const filePath = schedulesPath(projectRoot);\n let raw: string;\n try {\n raw = await fs.readFile(filePath, 'utf-8');\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === 'ENOENT') {\n throw new PpgError('No schedules file found. Create .ppg/schedules.yaml first.', 'INVALID_ARGS');\n }\n throw err;\n }\n\n const parsed = YAML.parse(raw) as SchedulesConfig;\n if (!parsed || !Array.isArray(parsed.schedules)) {\n throw new PpgError('Invalid schedules.yaml: missing \"schedules\" array', 'INVALID_ARGS');\n }\n\n for (let i = 0; i < parsed.schedules.length; i++) {\n validateScheduleEntry(parsed.schedules[i], i);\n }\n\n return parsed.schedules;\n}\n\nfunction validateScheduleEntry(entry: ScheduleEntry, index: number): void {\n if (!entry.name || typeof entry.name !== 'string') {\n throw new PpgError(`schedules[${index}]: missing \"name\"`, 'INVALID_ARGS');\n }\n if (!SAFE_NAME.test(entry.name)) {\n throw new PpgError(\n `schedules[${index}]: invalid name \"${entry.name}\" — must be alphanumeric, hyphens, or underscores`,\n 'INVALID_ARGS',\n );\n }\n if (!entry.cron || typeof entry.cron !== 'string') {\n throw new PpgError(`schedules[${index}]: missing \"cron\" expression`, 'INVALID_ARGS');\n }\n validateCronExpression(entry.cron, index);\n\n const hasSwarm = entry.swarm && typeof entry.swarm === 'string';\n const hasPrompt = entry.prompt && typeof entry.prompt === 'string';\n if (!hasSwarm && !hasPrompt) {\n throw new PpgError(`schedules[${index}]: must specify either \"swarm\" or \"prompt\"`, 'INVALID_ARGS');\n }\n if (hasSwarm && hasPrompt) {\n throw new PpgError(`schedules[${index}]: specify either \"swarm\" or \"prompt\", not both`, 'INVALID_ARGS');\n }\n}\n\nexport function validateCronExpression(expr: string, index?: number): void {\n const prefix = index !== undefined ? `schedules[${index}]: ` : '';\n if (!expr || !expr.trim()) {\n throw new PpgError(`${prefix}invalid cron expression: \"${expr}\"`, 'INVALID_ARGS');\n }\n try {\n CronExpressionParser.parse(expr);\n } catch {\n throw new PpgError(`${prefix}invalid cron expression: \"${expr}\"`, 'INVALID_ARGS');\n }\n}\n\nexport function getNextRun(cronExpr: string): Date {\n const expr = CronExpressionParser.parse(cronExpr);\n return expr.next().toDate();\n}\n\nexport function formatCronHuman(cronExpr: string): string {\n // Basic human-readable descriptions for common patterns\n const parts = cronExpr.trim().split(/\\s+/);\n if (parts.length !== 5) return cronExpr;\n\n const [min, hour, dom, mon, dow] = parts;\n\n if (min === '0' && hour !== '*' && dom === '*' && mon === '*' && dow === '*') {\n return `daily at ${hour}:00`;\n }\n if (min.startsWith('*/') && hour === '*' && dom === '*' && mon === '*' && dow === '*') {\n return `every ${min.slice(2)} minutes`;\n }\n if (min !== '*' && hour === '*' && dom === '*' && mon === '*' && dow === '*') {\n return `every hour at :${min.padStart(2, '0')}`;\n }\n if (dow !== '*' && dom === '*' && mon === '*') {\n const days = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];\n const dayName = days[Number(dow)] ?? dow;\n return `${dayName} at ${hour}:${min.padStart(2, '0')}`;\n }\n\n return cronExpr;\n}\n","import fs from 'node:fs/promises';\nimport { createReadStream } from 'node:fs';\nimport path from 'node:path';\nimport readline from 'node:readline';\nimport { execa } from 'execa';\nimport { loadSchedules, getNextRun } from './schedule.js';\nimport { cronLogPath, cronPidPath, logsDir, schedulesPath } from '../lib/paths.js';\nimport type { ScheduleEntry } from '../types/schedule.js';\n\nconst CHECK_INTERVAL_MS = 30_000;\n\ninterface ScheduleState {\n entry: ScheduleEntry;\n nextRun: Date;\n lastTriggered?: Date;\n}\n\nexport async function runCronDaemon(projectRoot: string): Promise<void> {\n const pidPath = cronPidPath(projectRoot);\n\n // Write PID file\n await fs.mkdir(path.dirname(pidPath), { recursive: true });\n await fs.writeFile(pidPath, String(process.pid), 'utf-8');\n\n // Ensure logs directory\n await fs.mkdir(logsDir(projectRoot), { recursive: true });\n\n await logCron(projectRoot, 'Cron daemon starting');\n\n let states = await loadScheduleStates(projectRoot);\n let lastConfigMtime = await getFileMtime(schedulesPath(projectRoot));\n\n await logCron(projectRoot, `Loaded ${states.length} schedule(s)`);\n for (const s of states) {\n await logCron(projectRoot, ` ${s.entry.name}: next run at ${s.nextRun.toISOString()}`);\n }\n\n // Clean shutdown on SIGTERM/SIGINT\n const cleanup = async () => {\n await logCron(projectRoot, 'Cron daemon stopping');\n try {\n await fs.unlink(pidPath);\n } catch { /* already gone */ }\n process.exit(0);\n };\n process.on('SIGTERM', cleanup);\n process.on('SIGINT', cleanup);\n\n // Main loop\n const tick = async () => {\n // Reload schedules if config file changed\n const currentMtime = await getFileMtime(schedulesPath(projectRoot));\n if (currentMtime !== lastConfigMtime) {\n try {\n states = await loadScheduleStates(projectRoot);\n lastConfigMtime = currentMtime;\n await logCron(projectRoot, `Reloaded schedules (${states.length} schedule(s))`);\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n await logCron(projectRoot, `Failed to reload schedules: ${msg}`);\n }\n }\n\n const now = new Date();\n const due = states.filter((s) => now >= s.nextRun);\n // Fire all due schedules concurrently\n await Promise.allSettled(\n due.map(async (state) => {\n await triggerSchedule(state, projectRoot);\n state.nextRun = getNextRun(state.entry.cron);\n state.lastTriggered = now;\n await logCron(projectRoot, ` ${state.entry.name}: next run at ${state.nextRun.toISOString()}`);\n }),\n );\n };\n\n // Run immediately, then on interval\n await tick();\n setInterval(tick, CHECK_INTERVAL_MS);\n\n // Keep alive\n await new Promise(() => {});\n}\n\nasync function loadScheduleStates(projectRoot: string): Promise<ScheduleState[]> {\n const schedules = await loadSchedules(projectRoot);\n return schedules.map((entry) => ({\n entry,\n nextRun: getNextRun(entry.cron),\n }));\n}\n\nasync function getFileMtime(filePath: string): Promise<number> {\n try {\n const stat = await fs.stat(filePath);\n return stat.mtimeMs;\n } catch {\n return 0;\n }\n}\n\nasync function triggerSchedule(state: ScheduleState, projectRoot: string): Promise<void> {\n const { entry } = state;\n await logCron(projectRoot, `Triggering schedule: ${entry.name}`);\n\n const varArgs: string[] = [];\n if (entry.vars) {\n for (const [key, value] of Object.entries(entry.vars)) {\n varArgs.push('--var', `${key}=${value}`);\n }\n }\n\n try {\n if (entry.swarm) {\n const args = ['swarm', entry.swarm, ...varArgs, '--json'];\n await logCron(projectRoot, ` Running: ppg ${args.join(' ')}`);\n const result = await execa('ppg', args, { cwd: projectRoot, reject: false });\n if (result.exitCode === 0) {\n await logCron(projectRoot, ` Success: ${entry.name} (swarm: ${entry.swarm})`);\n } else {\n await logCron(projectRoot, ` Failed: ${entry.name} — ${result.stderr || result.stdout}`);\n }\n } else if (entry.prompt) {\n const args = [\n 'spawn',\n '--name', `cron-${entry.name}-${Date.now()}`,\n '--template', entry.prompt,\n ...varArgs,\n '--json',\n ];\n await logCron(projectRoot, ` Running: ppg ${args.join(' ')}`);\n const result = await execa('ppg', args, { cwd: projectRoot, reject: false });\n if (result.exitCode === 0) {\n await logCron(projectRoot, ` Success: ${entry.name} (prompt: ${entry.prompt})`);\n } else {\n await logCron(projectRoot, ` Failed: ${entry.name} — ${result.stderr || result.stdout}`);\n }\n }\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n await logCron(projectRoot, ` Error triggering ${entry.name}: ${message}`);\n }\n}\n\nexport async function logCron(projectRoot: string, message: string): Promise<void> {\n const logPath = cronLogPath(projectRoot);\n const timestamp = new Date().toISOString();\n const line = `[${timestamp}] ${message}\\n`;\n\n // Also write to stdout so it's visible in the tmux pane\n process.stdout.write(line);\n\n try {\n await fs.appendFile(logPath, line, 'utf-8');\n } catch {\n // Log dir may not exist yet on first call — create and retry\n await fs.mkdir(logsDir(projectRoot), { recursive: true });\n await fs.appendFile(logPath, line, 'utf-8');\n }\n}\n\nexport async function isCronRunning(projectRoot: string): Promise<boolean> {\n return (await getCronPid(projectRoot)) !== null;\n}\n\nexport async function getCronPid(projectRoot: string): Promise<number | null> {\n const pidPath = cronPidPath(projectRoot);\n let raw: string;\n try {\n raw = await fs.readFile(pidPath, 'utf-8');\n } catch {\n return null;\n }\n const pid = parseInt(raw, 10);\n if (isNaN(pid)) {\n await cleanupPidFile(pidPath);\n return null;\n }\n try {\n // Signal 0 doesn't send a signal, just checks if process is alive\n process.kill(pid, 0);\n return pid;\n } catch {\n // Process is dead — clean up stale PID file\n await cleanupPidFile(pidPath);\n return null;\n }\n}\n\nasync function cleanupPidFile(pidPath: string): Promise<void> {\n try {\n await fs.unlink(pidPath);\n } catch { /* already gone */ }\n}\n\nexport async function readCronLog(projectRoot: string, lines: number = 20): Promise<string[]> {\n const logPath = cronLogPath(projectRoot);\n try {\n await fs.access(logPath);\n } catch {\n return [];\n }\n // Stream the file and keep only the last N lines to avoid loading large logs into memory\n const result: string[] = [];\n const rl = readline.createInterface({\n input: createReadStream(logPath, { encoding: 'utf-8' }),\n crlfDelay: Infinity,\n });\n for await (const line of rl) {\n if (!line) continue;\n result.push(line);\n if (result.length > lines) {\n result.shift();\n }\n }\n return result;\n}\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport YAML from 'yaml';\nimport { getRepoRoot } from '../core/worktree.js';\nimport { readManifest } from '../core/manifest.js';\nimport { loadSchedules, getNextRun, formatCronHuman, validateCronExpression } from '../core/schedule.js';\nimport { runCronDaemon, isCronRunning, getCronPid, readCronLog } from '../core/cron.js';\nimport * as tmux from '../core/tmux.js';\nimport { cronPidPath, manifestPath, schedulesPath } from '../lib/paths.js';\nimport { getLockfile, getWriteFileAtomic } from '../lib/cjs-compat.js';\nimport { PpgError, NotInitializedError } from '../lib/errors.js';\nimport { output, formatTable, info, success, warn } from '../lib/output.js';\nimport type { Column } from '../lib/output.js';\nimport type { ScheduleEntry, SchedulesConfig } from '../types/schedule.js';\n\nexport interface CronOptions {\n json?: boolean;\n}\n\nexport interface CronStatusOptions {\n lines?: number;\n json?: boolean;\n}\n\nconst CRON_WINDOW_NAME = 'ppg-cron';\n\nexport async function cronStartCommand(options: CronOptions): Promise<void> {\n const projectRoot = await getRepoRoot();\n await requireInit(projectRoot);\n\n // Check if already running\n if (await isCronRunning(projectRoot)) {\n const pid = await getCronPid(projectRoot);\n if (options.json) {\n output({ success: false, error: 'Cron daemon is already running', pid }, true);\n } else {\n warn(`Cron daemon is already running (PID: ${pid})`);\n }\n return;\n }\n\n // Verify schedules can be loaded before starting\n const schedules = await loadSchedules(projectRoot);\n if (schedules.length === 0) {\n throw new PpgError('No schedules defined in .ppg/schedules.yaml', 'INVALID_ARGS');\n }\n\n // Start daemon in a tmux window\n const manifest = await readManifest(projectRoot);\n const sessionName = manifest.sessionName;\n await tmux.ensureSession(sessionName);\n\n const windowTarget = await tmux.createWindow(sessionName, CRON_WINDOW_NAME, projectRoot);\n const command = `ppg cron _daemon`;\n await tmux.sendKeys(windowTarget, command);\n\n if (options.json) {\n output({\n success: true,\n tmuxWindow: windowTarget,\n scheduleCount: schedules.length,\n }, true);\n } else {\n success(`Cron daemon started in tmux window: ${windowTarget}`);\n info(`${schedules.length} schedule(s) loaded`);\n info(`Attach: tmux select-window -t ${windowTarget}`);\n }\n}\n\nexport async function cronStopCommand(options: CronOptions): Promise<void> {\n const projectRoot = await getRepoRoot();\n\n // getCronPid already cleans up stale PID files\n const pid = await getCronPid(projectRoot);\n if (!pid) {\n if (options.json) {\n output({ success: false, error: 'Cron daemon is not running' }, true);\n } else {\n warn('Cron daemon is not running');\n }\n return;\n }\n\n // Kill the process\n try {\n process.kill(pid, 'SIGTERM');\n } catch {\n // Already dead\n }\n\n // Clean up PID file (daemon cleanup handler may not have run yet)\n try {\n await fs.unlink(cronPidPath(projectRoot));\n } catch { /* already gone */ }\n\n // Try to kill the tmux window too\n try {\n const manifest = await readManifest(projectRoot);\n const windows = await tmux.listSessionWindows(manifest.sessionName);\n const cronWindow = windows.find((w) => w.name === CRON_WINDOW_NAME);\n if (cronWindow) {\n await tmux.killWindow(`${manifest.sessionName}:${cronWindow.index}`);\n }\n } catch { /* best effort */ }\n\n if (options.json) {\n output({ success: true, pid }, true);\n } else {\n success(`Cron daemon stopped (PID: ${pid})`);\n }\n}\n\nexport async function cronListCommand(options: CronOptions): Promise<void> {\n const projectRoot = await getRepoRoot();\n await requireInit(projectRoot);\n\n const schedules = await loadSchedules(projectRoot);\n\n if (options.json) {\n const data = schedules.map((s) => ({\n name: s.name,\n type: s.swarm ? 'swarm' : 'prompt',\n target: s.swarm ?? s.prompt,\n cron: s.cron,\n nextRun: getNextRun(s.cron).toISOString(),\n vars: s.vars ?? {},\n }));\n output({ schedules: data }, true);\n return;\n }\n\n const columns: Column[] = [\n { header: 'NAME', key: 'name' },\n { header: 'TYPE', key: 'type' },\n { header: 'TARGET', key: 'target' },\n { header: 'CRON', key: 'cron' },\n { header: 'SCHEDULE', key: 'human' },\n { header: 'NEXT RUN', key: 'nextRun' },\n ];\n\n const rows = schedules.map((s) => ({\n name: s.name,\n type: s.swarm ? 'swarm' : 'prompt',\n target: s.swarm ?? s.prompt,\n cron: s.cron,\n human: formatCronHuman(s.cron),\n nextRun: getNextRun(s.cron).toLocaleString(),\n }));\n\n console.log(formatTable(rows, columns));\n}\n\nexport async function cronStatusCommand(options: CronStatusOptions): Promise<void> {\n const projectRoot = await getRepoRoot();\n\n const running = await isCronRunning(projectRoot);\n const pid = running ? await getCronPid(projectRoot) : null;\n const recentLines = await readCronLog(projectRoot, options.lines ?? 20);\n\n if (options.json) {\n output({\n running,\n pid,\n recentLog: recentLines,\n }, true);\n return;\n }\n\n if (running) {\n success(`Cron daemon is running (PID: ${pid})`);\n } else {\n warn('Cron daemon is not running');\n }\n\n if (recentLines.length > 0) {\n console.log('\\nRecent log:');\n for (const line of recentLines) {\n console.log(` ${line}`);\n }\n } else {\n info('No cron log entries yet');\n }\n}\n\nexport async function cronDaemonCommand(): Promise<void> {\n const projectRoot = await getRepoRoot();\n await requireInit(projectRoot);\n await runCronDaemon(projectRoot);\n}\n\nexport interface CronAddOptions {\n name: string;\n cron: string;\n swarm?: string;\n prompt?: string;\n var?: string[];\n project?: string;\n json?: boolean;\n}\n\nexport interface CronRemoveOptions {\n name: string;\n project?: string;\n json?: boolean;\n}\n\nexport async function cronAddCommand(options: CronAddOptions): Promise<void> {\n const projectRoot = options.project ?? await getRepoRoot();\n await requireInit(projectRoot);\n\n // Validate name\n const SAFE_NAME = /^[\\w-]+$/;\n if (!options.name || !SAFE_NAME.test(options.name)) {\n throw new PpgError(\n `Invalid schedule name \"${options.name}\" — must be alphanumeric, hyphens, or underscores`,\n 'INVALID_ARGS',\n );\n }\n\n // Must specify exactly one of --swarm or --prompt\n if (!options.swarm && !options.prompt) {\n throw new PpgError('Must specify either --swarm or --prompt', 'INVALID_ARGS');\n }\n if (options.swarm && options.prompt) {\n throw new PpgError('Specify either --swarm or --prompt, not both', 'INVALID_ARGS');\n }\n\n // Validate cron expression\n validateCronExpression(options.cron);\n\n // Build entry before acquiring lock\n const entry: ScheduleEntry = {\n name: options.name,\n cron: options.cron,\n };\n if (options.swarm) entry.swarm = options.swarm;\n if (options.prompt) entry.prompt = options.prompt;\n\n // Parse vars\n if (options.var && options.var.length > 0) {\n const vars: Record<string, string> = {};\n for (const v of options.var) {\n const eqIdx = v.indexOf('=');\n if (eqIdx === -1) {\n throw new PpgError(`Invalid --var format: \"${v}\" (expected KEY=VALUE)`, 'INVALID_ARGS');\n }\n const key = v.slice(0, eqIdx);\n if (key.length === 0) {\n throw new PpgError(`Invalid --var format: \"${v}\" (key must not be empty)`, 'INVALID_ARGS');\n }\n vars[key] = v.slice(eqIdx + 1);\n }\n entry.vars = vars;\n }\n\n // Ensure .ppg directory exists\n const filePath = schedulesPath(projectRoot);\n const ppgDirPath = path.dirname(filePath);\n await fs.mkdir(ppgDirPath, { recursive: true });\n\n // Locked read-modify-write\n await updateSchedulesFile(filePath, (config) => {\n // Check name uniqueness\n if (config.schedules.some((s) => s.name === options.name)) {\n throw new PpgError(`Schedule \"${options.name}\" already exists`, 'INVALID_ARGS');\n }\n config.schedules.push(entry);\n return config;\n });\n\n if (options.json) {\n output({ success: true, name: options.name, schedule: entry }, true);\n } else {\n success(`Schedule \"${options.name}\" added`);\n }\n}\n\nexport async function cronRemoveCommand(options: CronRemoveOptions): Promise<void> {\n const projectRoot = options.project ?? await getRepoRoot();\n await requireInit(projectRoot);\n\n const filePath = schedulesPath(projectRoot);\n\n // Locked read-modify-write\n await updateSchedulesFile(filePath, (config) => {\n const idx = config.schedules.findIndex((s) => s.name === options.name);\n if (idx === -1) {\n throw new PpgError(`Schedule \"${options.name}\" not found`, 'INVALID_ARGS');\n }\n config.schedules.splice(idx, 1);\n return config;\n });\n\n if (options.json) {\n output({ success: true, name: options.name }, true);\n } else {\n success(`Schedule \"${options.name}\" removed`);\n }\n}\n\n/**\n * Locked read-modify-write for schedules.yaml.\n * Uses proper-lockfile + write-file-atomic, matching the manifest update pattern.\n * Fails fast if the file exists but has an invalid shape (instead of silently resetting).\n */\nasync function updateSchedulesFile(\n filePath: string,\n updater: (config: SchedulesConfig) => SchedulesConfig,\n): Promise<void> {\n const lockfile = await getLockfile();\n const writeFileAtomic = await getWriteFileAtomic();\n let release: (() => Promise<void>) | undefined;\n\n try {\n release = await lockfile.lock(filePath, {\n stale: 10_000,\n retries: { retries: 5, minTimeout: 100, maxTimeout: 1000 },\n realpath: false,\n });\n } catch {\n throw new PpgError('Could not acquire lock on schedules.yaml', 'MANIFEST_LOCK');\n }\n\n try {\n let config: SchedulesConfig;\n try {\n const raw = await fs.readFile(filePath, 'utf-8');\n const parsed = YAML.parse(raw) as SchedulesConfig;\n if (!parsed || !Array.isArray(parsed.schedules)) {\n throw new PpgError(\n 'Invalid schedules.yaml: missing or malformed \"schedules\" array. Fix the file manually or delete it to start fresh.',\n 'INVALID_ARGS',\n );\n }\n config = parsed;\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === 'ENOENT') {\n config = { schedules: [] };\n } else {\n throw err;\n }\n }\n\n const updated = updater(config);\n await writeFileAtomic(filePath, YAML.stringify(updated));\n } finally {\n if (release) await release();\n }\n}\n\nasync function requireInit(projectRoot: string): Promise<void> {\n try {\n await fs.access(manifestPath(projectRoot));\n } catch {\n throw new NotInitializedError(projectRoot);\n }\n}\n","import { createRequire } from 'node:module';\nimport { Command } from 'commander';\nimport { PpgError } from './lib/errors.js';\nimport { outputError } from './lib/output.js';\n\nconst require = createRequire(import.meta.url);\nconst pkg = require('../package.json') as { version: string };\n\nconst program = new Command();\n\nprogram\n .name('ppg')\n .description('Pure Point Guard — local orchestration runtime for parallel CLI coding agents')\n .version(pkg.version)\n .option('--json', 'Output as JSON');\n\nprogram\n .command('init')\n .description('Initialize Point Guard in the current git repository')\n .option('--json', 'Output as JSON')\n .action(async (options) => {\n const { initCommand } = await import('./commands/init.js');\n await initCommand(options);\n });\n\nprogram\n .command('spawn')\n .description('Spawn a new worktree and agent(s), or add agents to an existing worktree')\n .option('-n, --name <name>', 'Name for the worktree/task')\n .option('-a, --agent <type>', 'Agent type to use (default: claude)')\n .option('-p, --prompt <text>', 'Prompt text for the agent')\n .option('-f, --prompt-file <path>', 'File containing the prompt')\n .option('-t, --template <name>', 'Template name from .ppg/templates/')\n .option('--var <key=value...>', 'Template variables', collectVars, [])\n .option('-b, --base <branch>', 'Base branch for the worktree')\n .option('--branch <name>', 'Check out an existing branch into a new worktree')\n .option('-w, --worktree <id>', 'Add agent to existing worktree')\n .option('-c, --count <n>', 'Number of agents to spawn', parsePositiveInt('count'), 1)\n .option('--split', 'Put all agents in one window as split panes')\n .option('--open', 'Open a Terminal window for the spawned agents')\n .option('--json', 'Output as JSON')\n .action(async (options) => {\n const { spawnCommand } = await import('./commands/spawn.js');\n await spawnCommand(options);\n });\n\nprogram\n .command('status')\n .description('Show status of worktrees and agents')\n .argument('[worktree]', 'Filter by worktree ID or name')\n .option('--json', 'Output as JSON')\n .option('-w, --watch', 'Watch for status changes')\n .action(async (worktree, options) => {\n const { statusCommand } = await import('./commands/status.js');\n await statusCommand(worktree, options);\n });\n\nprogram\n .command('kill')\n .description('Kill agents or worktrees')\n .option('-a, --agent <id>', 'Kill a specific agent')\n .option('-w, --worktree <id>', 'Kill all agents in a worktree')\n .option('--all', 'Kill all agents in all worktrees')\n .option('-r, --remove', 'Also remove the worktree after killing')\n .option('-d, --delete', 'Delete agent/worktree entry from manifest after killing')\n .option('--include-open-prs', 'Include worktrees with open GitHub PRs in deletion')\n .option('--json', 'Output as JSON')\n .action(async (options) => {\n const { killCommand } = await import('./commands/kill.js');\n await killCommand(options);\n });\n\nprogram\n .command('attach')\n .description('Attach to a worktree or agent tmux pane')\n .argument('<target>', 'Worktree ID, agent ID, or name')\n .action(async (target) => {\n const { attachCommand } = await import('./commands/attach.js');\n await attachCommand(target);\n });\n\nprogram\n .command('logs')\n .description('View agent pane output')\n .argument('<agent-id>', 'Agent ID')\n .option('-l, --lines <n>', 'Number of lines to show', (v: string) => Number(v), 100)\n .option('-f, --follow', 'Follow output (poll every 1s)')\n .option('--full', 'Show full pane history')\n .option('--json', 'Output as JSON')\n .action(async (agentId, options) => {\n const { logsCommand } = await import('./commands/logs.js');\n await logsCommand(agentId, options);\n });\n\nprogram\n .command('aggregate')\n .description('Aggregate results from agents (captures pane output)')\n .argument('[worktree-id]', 'Worktree ID to aggregate results from')\n .option('--all', 'Aggregate from all worktrees')\n .option('-o, --output <file>', 'Write output to file')\n .option('--json', 'Output as JSON')\n .action(async (worktreeId, options) => {\n const { aggregateCommand } = await import('./commands/aggregate.js');\n await aggregateCommand(worktreeId, options);\n });\n\nprogram\n .command('merge')\n .description('Merge a worktree branch back into base')\n .argument('<worktree-id>', 'Worktree ID to merge')\n .option('-s, --strategy <strategy>', 'Merge strategy: squash or no-ff', 'squash')\n .option('--no-cleanup', 'Do not remove worktree after merge')\n .option('--dry-run', 'Show what would be done without doing it')\n .option('--force', 'Merge even if agents are still running')\n .option('--json', 'Output as JSON')\n .action(async (worktreeId, options) => {\n const { mergeCommand } = await import('./commands/merge.js');\n await mergeCommand(worktreeId, options);\n });\n\nprogram\n .command('swarm')\n .description('Run a swarm template — spawn multiple agents from a predefined workflow')\n .argument('<template>', 'Swarm template name from .ppg/swarms/')\n .option('-w, --worktree <ref>', 'Target an existing worktree by ID, name, or branch')\n .option('--var <key=value...>', 'Template variables', collectVars, [])\n .option('-n, --name <name>', 'Override worktree name')\n .option('-b, --base <branch>', 'Base branch for new worktree(s)')\n .option('--open', 'Open Terminal windows for spawned agents')\n .option('--json', 'Output as JSON')\n .action(async (template, options) => {\n const { swarmCommand } = await import('./commands/swarm.js');\n await swarmCommand(template, options);\n });\n\nprogram\n .command('prompt')\n .description('Spawn a worktree+agent using a named prompt from .ppg/prompts/')\n .argument('<name>', 'Prompt name (filename without .md)')\n .option('-n, --name <name>', 'Name for the worktree')\n .option('-a, --agent <type>', 'Agent type to use (default: claude)')\n .option('--var <key=value...>', 'Template variables', collectVars, [])\n .option('-b, --base <branch>', 'Base branch for the worktree')\n .option('-c, --count <n>', 'Number of agents to spawn', parsePositiveInt('count'), 1)\n .option('--split', 'Put all agents in one window as split panes')\n .option('--open', 'Open a Terminal window for the spawned agents')\n .option('--json', 'Output as JSON')\n .action(async (name, options) => {\n const { promptCommand } = await import('./commands/prompt.js');\n await promptCommand(name, options);\n });\n\nprogram\n .command('list')\n .description('List available templates, swarms, or prompts')\n .argument('<type>', 'What to list: templates, swarms, prompts')\n .option('--json', 'Output as JSON')\n .action(async (type, options) => {\n const { listCommand } = await import('./commands/list.js');\n await listCommand(type, options);\n });\n\nprogram\n .command('restart')\n .description('Restart an agent in the same worktree')\n .argument('<agent-id>', 'Agent ID to restart')\n .option('-p, --prompt <text>', 'Override the original prompt')\n .option('-a, --agent <type>', 'Override the agent type')\n .option('--open', 'Open a Terminal window for the restarted agent')\n .option('--json', 'Output as JSON')\n .action(async (agentId, options) => {\n const { restartCommand } = await import('./commands/restart.js');\n await restartCommand(agentId, options);\n });\n\nprogram\n .command('diff')\n .description('Show changes made in a worktree branch')\n .argument('<worktree-id>', 'Worktree ID or name')\n .option('--stat', 'Show diffstat summary')\n .option('--name-only', 'Show only changed file names')\n .option('--json', 'Output as JSON')\n .action(async (worktreeId, options) => {\n const { diffCommand } = await import('./commands/diff.js');\n await diffCommand(worktreeId, options);\n });\n\nprogram\n .command('pr')\n .description('Create a GitHub PR from a worktree branch')\n .argument('<worktree-id>', 'Worktree ID or name')\n .option('--title <text>', 'PR title (default: worktree name)')\n .option('--body <text>', 'PR body (default: agent result content)')\n .option('--draft', 'Create as draft PR')\n .option('--json', 'Output as JSON')\n .action(async (worktreeId, options) => {\n const { prCommand } = await import('./commands/pr.js');\n await prCommand(worktreeId, options);\n });\n\nprogram\n .command('reset')\n .description('Kill all agents, remove all worktrees, and wipe manifest')\n .option('--force', 'Reset even if worktrees have unmerged/un-PR\\'d work')\n .option('--prune', 'Also run git worktree prune')\n .option('--include-open-prs', 'Include worktrees with open GitHub PRs in cleanup')\n .option('--json', 'Output as JSON')\n .action(async (options) => {\n const { resetCommand } = await import('./commands/reset.js');\n await resetCommand(options);\n });\n\nprogram\n .command('clean')\n .description('Remove worktrees in terminal states (merged/cleaned/failed)')\n .option('--all', 'Also clean failed worktrees')\n .option('--dry-run', 'Show what would be done without doing it')\n .option('--prune', 'Also run git worktree prune')\n .option('--include-open-prs', 'Include worktrees with open GitHub PRs in cleanup')\n .option('--json', 'Output as JSON')\n .action(async (options) => {\n const { cleanCommand } = await import('./commands/clean.js');\n await cleanCommand(options);\n });\n\nprogram\n .command('send')\n .description('Send text to an agent\\'s tmux pane')\n .argument('<agent-id>', 'Agent ID')\n .argument('<text>', 'Text to send')\n .option('--keys', 'Send raw tmux key names (e.g., C-c, Enter)')\n .option('--no-enter', 'Do not append Enter after the text')\n .option('--json', 'Output as JSON')\n .action(async (agentId, text, options) => {\n const { sendCommand } = await import('./commands/send.js');\n await sendCommand(agentId, text, options);\n });\n\nprogram\n .command('wait')\n .description('Wait for agents to reach terminal state')\n .argument('[worktree-id]', 'Worktree ID or name')\n .option('--all', 'Wait for all agents across all worktrees')\n .option('--timeout <seconds>', 'Timeout in seconds', parsePositiveInt('timeout'))\n .option('--interval <seconds>', 'Poll interval in seconds', parsePositiveInt('interval'))\n .option('--json', 'Output as JSON')\n .action(async (worktreeId, options) => {\n const { waitCommand } = await import('./commands/wait.js');\n await waitCommand(worktreeId, options);\n });\n\nconst worktreeCmd = program.command('worktree').description('Manage worktrees');\n\nworktreeCmd\n .command('create')\n .description('Create a standalone worktree without spawning agents')\n .option('-n, --name <name>', 'Name for the worktree')\n .option('-b, --base <branch>', 'Base branch for the worktree')\n .option('--branch <name>', 'Check out an existing branch into a new worktree')\n .option('--json', 'Output as JSON')\n .action(async (options) => {\n const { worktreeCreateCommand } = await import('./commands/worktree.js');\n await worktreeCreateCommand(options);\n });\n\nprogram\n .command('ui')\n .alias('dashboard')\n .description('Open the native dashboard')\n .action(async () => {\n const { uiCommand } = await import('./commands/ui.js');\n await uiCommand();\n });\n\nprogram\n .command('install-dashboard')\n .description('Download and install the macOS dashboard app')\n .option('--dir <path>', 'Install directory', '/Applications')\n .option('--json', 'JSON output')\n .action(async (options) => {\n const { installDashboardCommand } = await import('./commands/install-dashboard.js');\n await installDashboardCommand(options);\n });\n\nconst cronCmd = program.command('cron').description('Manage scheduled runs');\n\ncronCmd\n .command('start')\n .description('Start the cron scheduler daemon in a tmux window')\n .option('--json', 'Output as JSON')\n .action(async (options) => {\n const { cronStartCommand } = await import('./commands/cron.js');\n await cronStartCommand(options);\n });\n\ncronCmd\n .command('stop')\n .description('Stop the cron scheduler daemon')\n .option('--json', 'Output as JSON')\n .action(async (options) => {\n const { cronStopCommand } = await import('./commands/cron.js');\n await cronStopCommand(options);\n });\n\ncronCmd\n .command('list')\n .description('List configured schedules and next run times')\n .option('--json', 'Output as JSON')\n .action(async (options) => {\n const { cronListCommand } = await import('./commands/cron.js');\n await cronListCommand(options);\n });\n\ncronCmd\n .command('status')\n .description('Show cron daemon status and recent log')\n .option('-l, --lines <n>', 'Number of recent log lines to show', (v: string) => Number(v), 20)\n .option('--json', 'Output as JSON')\n .action(async (options) => {\n const { cronStatusCommand } = await import('./commands/cron.js');\n await cronStatusCommand(options);\n });\n\ncronCmd\n .command('_daemon', { hidden: true })\n .description('Internal: run the cron daemon (called by ppg cron start)')\n .action(async () => {\n const { cronDaemonCommand } = await import('./commands/cron.js');\n await cronDaemonCommand();\n });\n\ncronCmd\n .command('add')\n .description('Add a new schedule entry')\n .requiredOption('--name <name>', 'Schedule name')\n .requiredOption('--cron <expression>', 'Cron expression')\n .option('--swarm <name>', 'Swarm template name')\n .option('--prompt <name>', 'Prompt template name')\n .option('--var <key=value...>', 'Template variables', collectVars, [])\n .option('--project <path>', 'Project root path')\n .option('--json', 'Output as JSON')\n .action(async (options) => {\n const { cronAddCommand } = await import('./commands/cron.js');\n await cronAddCommand(options);\n });\n\ncronCmd\n .command('remove')\n .description('Remove a schedule entry')\n .requiredOption('--name <name>', 'Schedule name to remove')\n .option('--project <path>', 'Project root path')\n .option('--json', 'Output as JSON')\n .action(async (options) => {\n const { cronRemoveCommand } = await import('./commands/cron.js');\n await cronRemoveCommand(options);\n });\n\n// Error handling\nprogram.exitOverride();\n\nfunction collectVars(value: string, previous: string[]): string[] {\n return previous.concat([value]);\n}\n\nfunction parsePositiveInt(optionName: string) {\n return (v: string): number => {\n const n = Number(v);\n if (!Number.isInteger(n) || n < 1) {\n throw new Error(`--${optionName} must be a positive integer`);\n }\n return n;\n };\n}\n\nasync function main() {\n try {\n await program.parseAsync(process.argv);\n } catch (err) {\n if (err instanceof PpgError) {\n outputError(err, program.opts().json ?? false);\n process.exit(err.exitCode);\n }\n if (err instanceof Error && 'code' in err) {\n const code = (err as { code: string }).code;\n if (code === 'commander.helpDisplayed' || code === 'commander.version') {\n process.exit(0);\n }\n }\n outputError(err, program.opts().json ?? false);\n process.exit(1);\n }\n}\n\nmain();\n"],"mappings":"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","names":["agentId","fs","agentId","info","fs","path","execa","home","execa","fs","path","init_env","fs","path","fs","agentId","sessionId","worktreeId","info","execa","fs","init_env","m","execa","info","fs","init_env","agentId","worktreeId","agentId","fs","worktreeId","execa","worktreeId","fs","path","YAML","fs","path","init_swarm","init_env","fs","path","fs","path","fs","execa","execa","init_pr","agentId","manifest","agents","wt","init_worktree","init_env","path","execa","path","execa","pkg","require","fs","YAML","SAFE_NAME","fs","path","execa","fs","path","YAML","SAFE_NAME","init_cron","createRequire","require","initCommand","spawnCommand","statusCommand","killCommand","attachCommand","agentId","logsCommand","worktreeId","aggregateCommand","mergeCommand","swarmCommand","promptCommand","listCommand","restartCommand","diffCommand","prCommand","resetCommand","cleanCommand","sendCommand","waitCommand","worktreeCreateCommand","uiCommand","installDashboardCommand","cronStartCommand","cronStopCommand","cronListCommand","cronStatusCommand","cronDaemonCommand","cronAddCommand","cronRemoveCommand"]}
|