@codemoot/cli 0.2.6 → 0.2.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +307 -65
- package/dist/index.js.map +1 -1
- package/dist/prompts-GB7HH4EL.js +0 -0
- package/package.json +2 -2
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/commands/build.ts","../src/progress.ts","../src/utils.ts","../src/commands/debate.ts","../src/commands/cleanup.ts","../src/commands/cost.ts","../src/commands/doctor.ts","../src/commands/events.ts","../src/commands/fix.ts","../src/commands/init.ts","../src/commands/install-skills.ts","../src/commands/session.ts","../src/commands/jobs.ts","../src/commands/plan.ts","../src/render.ts","../src/commands/review.ts","../src/commands/run.ts","../src/commands/shipit.ts","../src/commands/start.ts","../src/commands/watch.ts","../src/watch/debouncer.ts","../src/commands/worker.ts"],"sourcesContent":["import { Command, InvalidArgumentError, Option } from 'commander';\r\n\r\nimport { CLEANUP_TIMEOUT_SEC, VERSION } from '@codemoot/core';\r\n\r\nimport {\r\n buildEventCommand,\r\n buildListCommand,\r\n buildReviewCommand,\r\n buildStartCommand,\r\n buildStatusCommand,\r\n} from './commands/build.js';\r\nimport {\r\n debateCompleteCommand,\r\n debateHistoryCommand,\r\n debateListCommand,\r\n debateStartCommand,\r\n debateStatusCommand,\r\n debateTurnCommand,\r\n} from './commands/debate.js';\r\nimport { cleanupCommand } from './commands/cleanup.js';\r\nimport { costCommand } from './commands/cost.js';\r\nimport { doctorCommand } from './commands/doctor.js';\r\nimport { eventsCommand } from './commands/events.js';\r\nimport { fixCommand } from './commands/fix.js';\r\nimport { initCommand } from './commands/init.js';\r\nimport { installSkillsCommand } from './commands/install-skills.js';\r\nimport {\r\n sessionStartCommand,\r\n sessionCurrentCommand,\r\n sessionListCommand,\r\n sessionStatusCommand,\r\n sessionCloseCommand,\r\n} from './commands/session.js';\r\nimport {\r\n jobsListCommand,\r\n jobsLogsCommand,\r\n jobsCancelCommand,\r\n jobsRetryCommand,\r\n jobsStatusCommand,\r\n} from './commands/jobs.js';\r\nimport { planCommand } from './commands/plan.js';\r\nimport { reviewCommand } from './commands/review.js';\r\nimport { runCommand } from './commands/run.js';\r\nimport { shipitCommand } from './commands/shipit.js';\r\nimport { startCommand } from './commands/start.js';\r\nimport { watchCommand } from './commands/watch.js';\r\nimport { workerCommand } from './commands/worker.js';\r\n\r\nconst program = new Command();\r\n\r\nprogram\r\n .name('codemoot')\r\n .description('Multi-model collaborative AI development tool')\r\n .version(VERSION)\r\n .option('--verbose', 'Enable debug logging');\r\n\r\nprogram\r\n .command('start')\r\n .description('First-run setup: verify codex, init config, run quick review')\r\n .action(startCommand);\r\n\r\nprogram\r\n .command('doctor')\r\n .description('Preflight diagnostics: check codex, config, database, git, node')\r\n .action(doctorCommand);\r\n\r\nprogram\r\n .command('install-skills')\r\n .description('Install Claude Code slash commands (/debate, /build, /codex-review, /cleanup)')\r\n .option('--force', 'Overwrite existing skill files', false)\r\n .action(installSkillsCommand);\r\n\r\nprogram\r\n .command('init')\r\n .description('Initialize CodeMoot in the current project')\r\n .option('--preset <name>', 'Use preset (cli-first)')\r\n .option('--non-interactive', 'Skip prompts, use defaults')\r\n .option('--force', 'Overwrite existing .cowork.yml')\r\n .action(initCommand);\r\n\r\nprogram\r\n .command('run')\r\n .description('Run a task through the full workflow')\r\n .argument('<task>', 'Task description (natural language)')\r\n .option('--mode <mode>', 'Execution mode (autonomous|interactive)', 'autonomous')\r\n .option('--max-iterations <n>', 'Max review loop iterations', (v: string) => Number.parseInt(v, 10), 3)\r\n .option('--no-stream', 'Disable streaming output')\r\n .action(runCommand);\r\n\r\nprogram\r\n .command('review')\r\n .description('Review code via codex — files, prompts, or diffs')\r\n .argument('[file-or-glob]', 'File path or glob pattern to review')\r\n .option('--prompt <instruction>', 'Freeform prompt — codex explores codebase via tools')\r\n .option('--stdin', 'Read prompt from stdin')\r\n .option('--diff <revspec>', 'Review a git diff (e.g., HEAD~3..HEAD, origin/main...HEAD)')\r\n .option('--scope <glob>', 'Restrict codex exploration to matching files (only with --prompt/--stdin)')\r\n .addOption(new Option('--focus <area>', 'Focus area').choices(['security', 'performance', 'bugs', 'all']).default('all'))\r\n .option('--preset <name>', 'Use named preset (security-audit|performance|quick-scan|pre-commit|api-review)')\r\n .option('--session <id>', 'Use specific session (default: active session)')\r\n .option('--background', 'Enqueue review and return immediately')\r\n .option('--timeout <seconds>', 'Timeout in seconds', (v: string) => {\r\n if (!/^\\d+$/.test(v)) throw new InvalidArgumentError('Timeout must be a positive integer');\r\n const n = Number.parseInt(v, 10);\r\n if (n <= 0) throw new InvalidArgumentError('Timeout must be a positive integer');\r\n return n;\r\n }, 600)\r\n .action(reviewCommand);\r\n\r\nprogram\r\n .command('cleanup')\r\n .description('Scan codebase for AI slop: security vulns, anti-patterns, near-duplicates, dead code, and more')\r\n .argument('[path]', 'Project path to scan', '.')\r\n .addOption(new Option('--scope <scope>', 'What to scan for').choices(['deps', 'unused-exports', 'hardcoded', 'duplicates', 'deadcode', 'security', 'near-duplicates', 'anti-patterns', 'all']).default('all'))\r\n .option('--timeout <seconds>', 'Codex scan timeout in seconds', (v: string) => {\r\n if (!/^\\d+$/.test(v)) throw new InvalidArgumentError('Timeout must be a positive integer');\r\n const n = Number.parseInt(v, 10);\r\n if (n <= 0) throw new InvalidArgumentError('Timeout must be a positive integer');\r\n return n;\r\n }, CLEANUP_TIMEOUT_SEC)\r\n .option('--max-disputes <n>', 'Max findings to adjudicate', (v: string) => {\r\n if (!/^\\d+$/.test(v)) throw new InvalidArgumentError('Must be a non-negative integer');\r\n return Number.parseInt(v, 10);\r\n }, 10)\r\n .option('--host-findings <path>', 'JSON file with host AI findings for 3-way merge')\r\n .option('--output <path>', 'Write findings report to JSON file')\r\n .option('--background', 'Enqueue cleanup and return immediately')\r\n .option('--no-gitignore', 'Skip .gitignore rules (scan everything)')\r\n .option('--quiet', 'Suppress human-readable summary')\r\n .action(cleanupCommand);\r\n\r\nprogram\r\n .command('plan')\r\n .description('Generate a plan using architect + reviewer loop')\r\n .argument('<task>', 'Task to plan')\r\n .option('--rounds <n>', 'Max plan-review rounds', (v: string) => Number.parseInt(v, 10), 3)\r\n .option('--output <file>', 'Save plan to file')\r\n .action(planCommand);\r\n\r\nconst debate = program\r\n .command('debate')\r\n .description('Multi-model debate with session persistence');\r\n\r\ndebate\r\n .command('start')\r\n .description('Start a new debate')\r\n .argument('<topic>', 'Debate topic or question')\r\n .option('--max-rounds <n>', 'Max debate rounds', (v: string) => Number.parseInt(v, 10), 5)\r\n .action(debateStartCommand);\r\n\r\ndebate\r\n .command('turn')\r\n .description('Send a prompt to GPT and get critique (with session resume)')\r\n .argument('<debate-id>', 'Debate ID from start command')\r\n .argument('<prompt>', 'Prompt to send to GPT')\r\n .option('--round <n>', 'Round number', (v: string) => Number.parseInt(v, 10))\r\n .option('--timeout <seconds>', 'Timeout in seconds', (v: string) => Number.parseInt(v, 10), 600)\r\n .action(debateTurnCommand);\r\n\r\ndebate\r\n .command('status')\r\n .description('Show debate status and session info')\r\n .argument('<debate-id>', 'Debate ID')\r\n .action(debateStatusCommand);\r\n\r\ndebate\r\n .command('list')\r\n .description('List all debates')\r\n .option('--status <status>', 'Filter by status (active|completed|stale)')\r\n .option('--limit <n>', 'Max results', (v: string) => Number.parseInt(v, 10), 20)\r\n .action(debateListCommand);\r\n\r\ndebate\r\n .command('history')\r\n .description('Show full message history with token budget')\r\n .argument('<debate-id>', 'Debate ID')\r\n .action(debateHistoryCommand);\r\n\r\ndebate\r\n .command('complete')\r\n .description('Mark a debate as completed')\r\n .argument('<debate-id>', 'Debate ID')\r\n .action(debateCompleteCommand);\r\n\r\nconst build = program\r\n .command('build')\r\n .description('Automated build loop: debate → plan → implement → review → fix');\r\n\r\nbuild\r\n .command('start')\r\n .description('Start a new build session')\r\n .argument('<task>', 'Task description')\r\n .option('--max-rounds <n>', 'Max debate rounds', (v: string) => Number.parseInt(v, 10), 5)\r\n .option('--allow-dirty', 'Allow starting with dirty working tree (auto-stashes)')\r\n .action(buildStartCommand);\r\n\r\nbuild\r\n .command('status')\r\n .description('Show build status and event log')\r\n .argument('<build-id>', 'Build ID')\r\n .action(buildStatusCommand);\r\n\r\nbuild\r\n .command('list')\r\n .description('List all builds')\r\n .option('--status <status>', 'Filter by status')\r\n .option('--limit <n>', 'Max results', (v: string) => Number.parseInt(v, 10), 20)\r\n .action(buildListCommand);\r\n\r\nbuild\r\n .command('event')\r\n .description('Record a build event (phase transition)')\r\n .argument('<build-id>', 'Build ID')\r\n .argument('<event-type>', 'Event type (plan_approved|impl_completed|fix_completed|etc)')\r\n .option('--loop <n>', 'Loop index', (v: string) => Number.parseInt(v, 10))\r\n .option('--tokens <n>', 'Tokens used', (v: string) => Number.parseInt(v, 10))\r\n .action(buildEventCommand);\r\n\r\nbuild\r\n .command('review')\r\n .description('Send implementation to codex for review (with codebase access)')\r\n .argument('<build-id>', 'Build ID')\r\n .action(buildReviewCommand);\r\n\r\nconst session = program\r\n .command('session')\r\n .description('Unified session management — persistent GPT context across commands');\r\n\r\nsession\r\n .command('start')\r\n .description('Start a new session')\r\n .option('--name <name>', 'Session name')\r\n .action(sessionStartCommand);\r\n\r\nsession\r\n .command('current')\r\n .description('Show the active session')\r\n .action(sessionCurrentCommand);\r\n\r\nsession\r\n .command('list')\r\n .description('List all sessions')\r\n .option('--status <status>', 'Filter by status (active|completed|stale)')\r\n .option('--limit <n>', 'Max results', (v: string) => Number.parseInt(v, 10), 20)\r\n .action(sessionListCommand);\r\n\r\nsession\r\n .command('status')\r\n .description('Show detailed session info with events')\r\n .argument('<session-id>', 'Session ID')\r\n .action(sessionStatusCommand);\r\n\r\nsession\r\n .command('close')\r\n .description('Mark a session as completed')\r\n .argument('<session-id>', 'Session ID')\r\n .action(sessionCloseCommand);\r\n\r\n// ── Jobs (background async queue) ──\r\n\r\nconst jobs = program\r\n .command('jobs')\r\n .description('Background job queue — async reviews, cleanups, and more');\r\n\r\njobs\r\n .command('list')\r\n .description('List jobs')\r\n .option('--status <status>', 'Filter by status (queued|running|succeeded|failed|canceled)')\r\n .option('--type <type>', 'Filter by type (review|cleanup|build-review|composite|watch-review)')\r\n .option('--limit <n>', 'Max results', (v: string) => Number.parseInt(v, 10), 20)\r\n .action(jobsListCommand);\r\n\r\njobs\r\n .command('status')\r\n .description('Show job details with recent logs')\r\n .argument('<job-id>', 'Job ID')\r\n .action(jobsStatusCommand);\r\n\r\njobs\r\n .command('logs')\r\n .description('Show job logs')\r\n .argument('<job-id>', 'Job ID')\r\n .option('--from-seq <n>', 'Start from log sequence number', (v: string) => Number.parseInt(v, 10), 0)\r\n .option('--limit <n>', 'Max log entries', (v: string) => Number.parseInt(v, 10), 100)\r\n .action(jobsLogsCommand);\r\n\r\njobs\r\n .command('cancel')\r\n .description('Cancel a queued or running job')\r\n .argument('<job-id>', 'Job ID')\r\n .action(jobsCancelCommand);\r\n\r\njobs\r\n .command('retry')\r\n .description('Retry a failed job')\r\n .argument('<job-id>', 'Job ID')\r\n .action(jobsRetryCommand);\r\n\r\n// ── Fix (autofix loop: review → fix → re-review) ──\r\n\r\nprogram\r\n .command('fix')\r\n .description('Autofix loop: review code, apply fixes, re-review until approved')\r\n .argument('<file-or-glob>', 'File path or glob pattern to fix')\r\n .option('--max-rounds <n>', 'Max review-fix rounds', (v: string) => Number.parseInt(v, 10), 3)\r\n .addOption(new Option('--focus <area>', 'Focus area').choices(['security', 'performance', 'bugs', 'all']).default('bugs'))\r\n .option('--timeout <seconds>', 'Timeout per round', (v: string) => Number.parseInt(v, 10), 600)\r\n .option('--dry-run', 'Review only, do not apply fixes', false)\r\n .option('--no-stage', 'Do not git-stage applied fixes')\r\n .option('--diff <revspec>', 'Fix issues in a git diff')\r\n .option('--session <id>', 'Use specific session')\r\n .action(fixCommand);\r\n\r\n// ── Shipit (composite workflow profiles) ──\r\n\r\nprogram\r\n .command('shipit')\r\n .description('Run composite workflow: lint → test → review → cleanup → commit')\r\n .addOption(new Option('--profile <profile>', 'Workflow profile').choices(['fast', 'safe', 'full']).default('safe'))\r\n .option('--dry-run', 'Print planned steps without executing', false)\r\n .option('--no-commit', 'Run checks but skip commit step')\r\n .option('--json', 'Machine-readable JSON output', false)\r\n .option('--strict-output', 'Strict model output parsing', false)\r\n .action(shipitCommand);\r\n\r\n// ── Cost dashboard ──\r\n\r\nprogram\r\n .command('cost')\r\n .description('Token usage and cost dashboard')\r\n .addOption(new Option('--scope <scope>', 'Time scope').choices(['session', 'daily', 'all']).default('daily'))\r\n .option('--days <n>', 'Number of days for daily scope', (v: string) => Number.parseInt(v, 10), 30)\r\n .option('--session <id>', 'Session ID for session scope')\r\n .action(costCommand);\r\n\r\n// ── Watch (file change → background review) ──\r\n\r\nprogram\r\n .command('watch')\r\n .description('Watch files and enqueue reviews on change')\r\n .option('--glob <pattern>', 'Glob pattern to watch', '**/*.{ts,tsx,js,jsx}')\r\n .addOption(new Option('--focus <area>', 'Focus area').choices(['security', 'performance', 'bugs', 'all']).default('all'))\r\n .option('--timeout <seconds>', 'Review timeout', (v: string) => Number.parseInt(v, 10), 600)\r\n .option('--quiet-ms <ms>', 'Quiet period before flush', (v: string) => Number.parseInt(v, 10), 800)\r\n .option('--max-wait-ms <ms>', 'Max wait before forced flush', (v: string) => Number.parseInt(v, 10), 5000)\r\n .option('--cooldown-ms <ms>', 'Cooldown after flush', (v: string) => Number.parseInt(v, 10), 1500)\r\n .action(watchCommand);\r\n\r\n// ── Events (tail logs as JSONL) ──\r\n\r\nprogram\r\n .command('events')\r\n .description('Stream session events and job logs as JSONL')\r\n .option('--follow', 'Follow mode — poll for new events', false)\r\n .option('--since-seq <n>', 'Start from sequence number', (v: string) => Number.parseInt(v, 10), 0)\r\n .option('--limit <n>', 'Max events per poll', (v: string) => Number.parseInt(v, 10), 100)\r\n .addOption(new Option('--type <type>', 'Event source filter').choices(['all', 'sessions', 'jobs']).default('all'))\r\n .action(eventsCommand);\r\n\r\n// ── Worker (background job processor) ──\r\n\r\njobs\r\n .command('worker')\r\n .description('Start background job worker (processes queued jobs)')\r\n .option('--once', 'Process one job and exit', false)\r\n .option('--poll-ms <ms>', 'Poll interval in milliseconds', (v: string) => Number.parseInt(v, 10), 2000)\r\n .option('--worker-id <id>', 'Worker identifier', `w-${Date.now()}`)\r\n .action(workerCommand);\r\n\r\nprogram.parse();\r\n\r\nexport { program };\r\n","// packages/cli/src/commands/build.ts — CLI build commands\n\nimport type { BuildRun, BuildSummary } from '@codemoot/core';\nimport { BuildStore, DebateStore, REVIEW_DIFF_MAX_CHARS, REVIEW_TEXT_MAX_CHARS, SessionManager, buildHandoffEnvelope, generateId, loadConfig, openDatabase } from '@codemoot/core';\nimport chalk from 'chalk';\nimport { execFileSync, execSync } from 'node:child_process';\nimport { unlinkSync } from 'node:fs';\nimport { join } from 'node:path';\n\nimport { createProgressCallbacks } from '../progress.js';\nimport { getDbPath } from '../utils.js';\n\n// ── codemoot build start ──\n\ninterface StartOptions {\n maxRounds?: number;\n allowDirty?: boolean;\n}\n\nexport async function buildStartCommand(task: string, options: StartOptions): Promise<void> {\n let db: ReturnType<typeof openDatabase> | undefined;\n try {\n const buildId = generateId();\n const dbPath = getDbPath();\n db = openDatabase(dbPath);\n const buildStore = new BuildStore(db);\n const debateStore = new DebateStore(db);\n const projectDir = process.cwd();\n\n // Check git status\n let baselineRef: string | null = null;\n try {\n const dirty = execSync('git status --porcelain', { cwd: projectDir, encoding: 'utf-8' }).trim();\n if (dirty && !options.allowDirty) {\n db.close();\n console.error(chalk.red('Working tree is dirty. Commit or stash your changes first.'));\n console.error(chalk.yellow('Use --allow-dirty to auto-stash.'));\n process.exit(1);\n }\n if (dirty && options.allowDirty) {\n execSync('git stash push -u -m \"codemoot-build-baseline\"', { cwd: projectDir, encoding: 'utf-8' });\n console.error(chalk.yellow('Auto-stashed dirty changes with marker \"codemoot-build-baseline\"'));\n }\n baselineRef = execSync('git rev-parse HEAD', { cwd: projectDir, encoding: 'utf-8' }).trim();\n } catch {\n // Not a git repo — no baseline\n console.error(chalk.yellow('Warning: Not a git repository. No baseline tracking.'));\n }\n\n // Create debate for planning phase\n const debateId = generateId();\n debateStore.upsert({ debateId, role: 'proposer', status: 'active' });\n debateStore.upsert({ debateId, role: 'critic', status: 'active' });\n debateStore.saveState(debateId, 'proposer', {\n debateId,\n question: task,\n models: ['codex-architect', 'codex-reviewer'],\n round: 0,\n turn: 0,\n thread: [],\n runningSummary: '',\n stanceHistory: [],\n usage: { totalPromptTokens: 0, totalCompletionTokens: 0, totalCalls: 0, startedAt: Date.now() },\n status: 'running',\n sessionIds: {},\n resumeStats: { attempted: 0, succeeded: 0, fallbacks: 0 },\n });\n\n // Resolve unified session for the build\n const sessionMgr = new SessionManager(db);\n const session = sessionMgr.resolveActive('build');\n sessionMgr.recordEvent({\n sessionId: session.id,\n command: 'build',\n subcommand: 'start',\n promptPreview: `Build started: ${task}`,\n });\n\n // Create build run\n buildStore.create({ buildId, task, debateId, baselineRef: baselineRef ?? undefined });\n\n // Record start event\n buildStore.updateWithEvent(\n buildId,\n { debateId },\n { eventType: 'debate_started', actor: 'system', phase: 'debate', payload: { task, debateId, baselineRef } },\n );\n\n const output = {\n buildId,\n debateId,\n task,\n baselineRef,\n sessionId: session.id,\n maxRounds: options.maxRounds ?? 5,\n status: 'planning',\n phase: 'debate',\n };\n console.log(JSON.stringify(output, null, 2));\n\n db.close();\n } catch (error) {\n db?.close();\n console.error(chalk.red(`Error: ${error instanceof Error ? error.message : String(error)}`));\n process.exit(1);\n }\n}\n\n// ── codemoot build status ──\n\nexport async function buildStatusCommand(buildId: string): Promise<void> {\n let db: ReturnType<typeof openDatabase> | undefined;\n try {\n const dbPath = getDbPath();\n db = openDatabase(dbPath);\n const store = new BuildStore(db);\n\n const run = store.get(buildId);\n if (!run) {\n db.close();\n console.error(chalk.red(`No build found with ID: ${buildId}`));\n process.exit(1);\n }\n\n const events = store.getEvents(buildId);\n const bugsFound = store.countEventsByType(buildId, 'bug_found');\n const fixesApplied = store.countEventsByType(buildId, 'fix_completed');\n\n const output = {\n buildId: run.buildId,\n task: run.task,\n status: run.status,\n phase: run.currentPhase,\n loop: run.currentLoop,\n debateId: run.debateId,\n baselineRef: run.baselineRef,\n planCodexSession: run.planCodexSession,\n reviewCodexSession: run.reviewCodexSession,\n planVersion: run.planVersion,\n reviewCycles: run.reviewCycles,\n bugsFound,\n bugsFixed: fixesApplied,\n totalEvents: events.length,\n createdAt: new Date(run.createdAt).toISOString(),\n updatedAt: new Date(run.updatedAt).toISOString(),\n completedAt: run.completedAt ? new Date(run.completedAt).toISOString() : null,\n recentEvents: events.slice(-10).map((e) => ({\n seq: e.seq,\n type: e.eventType,\n actor: e.actor,\n phase: e.phase,\n loop: e.loopIndex,\n tokens: e.tokensUsed,\n time: new Date(e.createdAt).toISOString(),\n })),\n };\n console.log(JSON.stringify(output, null, 2));\n\n db.close();\n } catch (error) {\n db?.close();\n console.error(chalk.red(`Error: ${error instanceof Error ? error.message : String(error)}`));\n process.exit(1);\n }\n}\n\n// ── codemoot build list ──\n\ninterface ListOptions {\n status?: string;\n limit?: number;\n}\n\nexport async function buildListCommand(options: ListOptions): Promise<void> {\n let db: ReturnType<typeof openDatabase> | undefined;\n try {\n const dbPath = getDbPath();\n db = openDatabase(dbPath);\n const store = new BuildStore(db);\n\n const builds = store.list({\n status: options.status as BuildRun['status'] | undefined,\n limit: options.limit ?? 20,\n });\n\n const output = builds.map((b: BuildSummary) => ({\n buildId: b.buildId,\n task: b.task,\n status: b.status,\n phase: b.phase,\n loop: b.loop,\n reviewCycles: b.reviewCycles,\n createdAt: new Date(b.createdAt).toISOString(),\n updatedAt: new Date(b.updatedAt).toISOString(),\n }));\n\n console.log(JSON.stringify(output, null, 2));\n\n db.close();\n } catch (error) {\n db?.close();\n console.error(chalk.red(`Error: ${error instanceof Error ? error.message : String(error)}`));\n process.exit(1);\n }\n}\n\n// ── codemoot build event ──\n\ninterface EventOptions {\n loop?: number;\n tokens?: number;\n}\n\nexport async function buildEventCommand(\n buildId: string,\n eventType: string,\n options: EventOptions,\n): Promise<void> {\n let db: ReturnType<typeof openDatabase> | undefined;\n try {\n const dbPath = getDbPath();\n db = openDatabase(dbPath);\n const store = new BuildStore(db);\n\n const run = store.get(buildId);\n if (!run) {\n db.close();\n console.error(chalk.red(`No build found with ID: ${buildId}`));\n process.exit(1);\n }\n\n // Read payload from stdin if available\n let payload: Record<string, unknown> | undefined;\n if (!process.stdin.isTTY) {\n const chunks: Buffer[] = [];\n for await (const chunk of process.stdin) {\n chunks.push(chunk as Buffer);\n }\n const input = Buffer.concat(chunks).toString('utf-8').trim();\n if (input) {\n try { payload = JSON.parse(input); } catch { payload = { text: input }; }\n }\n }\n\n // Determine phase transitions\n const updates: Record<string, unknown> = {};\n if (eventType === 'plan_approved') {\n updates.currentPhase = 'plan_approved';\n updates.status = 'implementing';\n updates.planVersion = run.planVersion + 1;\n } else if (eventType === 'impl_completed') {\n updates.currentPhase = 'review';\n updates.status = 'reviewing';\n } else if (eventType === 'review_verdict') {\n const verdict = payload?.verdict as string;\n if (verdict === 'approved') {\n updates.currentPhase = 'done';\n updates.status = 'completed';\n updates.completedAt = Date.now();\n } else {\n updates.currentPhase = 'fix';\n updates.status = 'fixing';\n updates.reviewCycles = run.reviewCycles + 1;\n }\n } else if (eventType === 'fix_completed') {\n updates.currentPhase = 'review';\n updates.status = 'reviewing';\n updates.currentLoop = run.currentLoop + 1;\n }\n\n store.updateWithEvent(\n buildId,\n updates as Parameters<BuildStore['updateWithEvent']>[1],\n {\n eventType: eventType as Parameters<BuildStore['updateWithEvent']>[2]['eventType'],\n actor: 'system',\n phase: (updates.currentPhase ?? run.currentPhase) as Parameters<BuildStore['updateWithEvent']>[2]['phase'],\n loopIndex: options.loop ?? run.currentLoop,\n payload,\n tokensUsed: options.tokens ?? 0,\n },\n );\n\n const updated = store.get(buildId);\n console.log(JSON.stringify({\n buildId,\n eventType,\n newStatus: updated?.status,\n newPhase: updated?.currentPhase,\n seq: updated?.lastEventSeq,\n }));\n\n db.close();\n } catch (error) {\n db?.close();\n console.error(chalk.red(`Error: ${error instanceof Error ? error.message : String(error)}`));\n process.exit(1);\n }\n}\n\n// ── codemoot build review ──\n\nexport async function buildReviewCommand(buildId: string): Promise<void> {\n let db: ReturnType<typeof openDatabase> | undefined;\n try {\n const dbPath = getDbPath();\n db = openDatabase(dbPath);\n const buildStore = new BuildStore(db);\n const config = loadConfig();\n const projectDir = process.cwd();\n\n const run = buildStore.get(buildId);\n if (!run) {\n db.close();\n console.error(chalk.red(`No build found with ID: ${buildId}`));\n process.exit(1);\n }\n\n // Get diff against baseline\n let diff = '';\n if (run.baselineRef) {\n try {\n // Use a temporary index file to avoid mutating user's staging state\n const tmpIndex = join(projectDir, '.git', 'codemoot-review-index');\n try {\n // Copy current HEAD tree into temp index, then add all working tree changes\n execSync(`git read-tree HEAD`, { cwd: projectDir, encoding: 'utf-8', env: { ...process.env, GIT_INDEX_FILE: tmpIndex } });\n execSync('git add -A', { cwd: projectDir, encoding: 'utf-8', env: { ...process.env, GIT_INDEX_FILE: tmpIndex } });\n diff = execFileSync('git', ['diff', '--cached', '--', run.baselineRef], { cwd: projectDir, encoding: 'utf-8', maxBuffer: 1024 * 1024, env: { ...process.env, GIT_INDEX_FILE: tmpIndex } });\n } finally {\n try { unlinkSync(tmpIndex); } catch { /* already cleaned */ }\n }\n } catch (err) {\n console.error(chalk.red(`Failed to generate diff: ${err instanceof Error ? err.message : String(err)}`));\n db.close();\n process.exit(1);\n }\n }\n\n if (!diff.trim()) {\n db.close();\n console.error(chalk.yellow('No changes detected against baseline.'));\n process.exit(0);\n }\n\n // Call codex for review with codebase access\n const { ModelRegistry, CliAdapter: CliAdapterClass } = await import('@codemoot/core');\n const registry = ModelRegistry.fromConfig(config, projectDir);\n const adapter = registry.getAdapter('codex-reviewer') ?? registry.getAdapter('codex-architect');\n if (!adapter) {\n db.close();\n console.error(chalk.red('No codex adapter found in config'));\n process.exit(1);\n }\n\n // Resolve unified session\n const sessionMgr = new SessionManager(db);\n const session = sessionMgr.resolveActive('build-review');\n const overflowCheck = sessionMgr.preCallOverflowCheck(session.id);\n if (overflowCheck.rolled) {\n console.error(chalk.yellow(` ${overflowCheck.message}`));\n }\n\n // After rollover, re-read session to get cleared thread ID\n const currentSession = sessionMgr.get(session.id);\n const existingSession = overflowCheck.rolled\n ? undefined // Don't reuse old thread after rollover\n : (currentSession?.codexThreadId ?? run.reviewCodexSession ?? undefined);\n\n const prompt = buildHandoffEnvelope({\n command: 'build-review',\n task: `Review code changes for the task: \"${run.task}\"\\n\\nGIT DIFF (against baseline ${run.baselineRef}):\\n${diff.slice(0, REVIEW_DIFF_MAX_CHARS)}\\n\\nReview for:\\n1. Correctness — does the code work as intended?\\n2. Bugs — any logic errors, edge cases, or crashes?\\n3. Security — any vulnerabilities introduced?\\n4. Code quality — naming, structure, patterns\\n5. Completeness — does it fully implement the task?`,\n resumed: Boolean(existingSession),\n constraints: run.reviewCycles > 0 ? [`This is review cycle ${run.reviewCycles + 1}. Focus on whether prior issues were addressed.`] : undefined,\n });\n\n const progress = createProgressCallbacks('build-review');\n const result = await (adapter as InstanceType<typeof CliAdapterClass>).callWithResume(prompt, {\n sessionId: existingSession,\n timeout: 600_000,\n ...progress,\n });\n\n // Update unified session\n if (result.sessionId) {\n sessionMgr.updateThreadId(session.id, result.sessionId);\n }\n sessionMgr.addUsageFromResult(session.id, result.usage, prompt, result.text);\n sessionMgr.recordEvent({\n sessionId: session.id,\n command: 'build',\n subcommand: 'review',\n promptPreview: `Build review for ${buildId}: ${run.task}`,\n responsePreview: result.text.slice(0, 500),\n promptFull: prompt,\n responseFull: result.text,\n usageJson: JSON.stringify(result.usage),\n durationMs: result.durationMs,\n codexThreadId: result.sessionId,\n });\n\n // Determine if approved — search only the tail of the response to avoid echoed instructions\n const tail = result.text.slice(-500);\n const verdictMatch = tail.match(/^(?:-\\s*)?VERDICT:\\s*(APPROVED|NEEDS_REVISION)/m);\n const approved = verdictMatch?.[1] === 'APPROVED';\n\n // Save review session\n buildStore.updateWithEvent(\n buildId,\n {\n reviewCodexSession: result.sessionId ?? existingSession,\n reviewCycles: run.reviewCycles + 1,\n },\n {\n eventType: 'review_verdict',\n actor: 'codex',\n phase: 'review',\n loopIndex: run.currentLoop,\n payload: {\n verdict: approved ? 'approved' : 'needs_revision',\n response: result.text.slice(0, REVIEW_TEXT_MAX_CHARS),\n sessionId: result.sessionId,\n resumed: existingSession ? result.sessionId === existingSession : false,\n },\n codexThreadId: result.sessionId,\n tokensUsed: result.usage.totalTokens,\n },\n );\n if (approved) {\n buildStore.updateWithEvent(\n buildId,\n { currentPhase: 'done', status: 'completed', completedAt: Date.now() },\n { eventType: 'phase_transition', actor: 'system', phase: 'done', payload: { reason: 'review_approved' } },\n );\n } else {\n buildStore.updateWithEvent(\n buildId,\n { currentPhase: 'fix', status: 'fixing' },\n { eventType: 'phase_transition', actor: 'system', phase: 'fix', payload: { reason: 'review_needs_revision' } },\n );\n }\n\n const output = {\n buildId,\n review: result.text,\n verdict: approved ? 'approved' : 'needs_revision',\n sessionId: result.sessionId,\n resumed: existingSession ? result.sessionId === existingSession : false,\n tokens: result.usage,\n durationMs: result.durationMs,\n };\n console.log(JSON.stringify(output, null, 2));\n\n db.close();\n } catch (error) {\n db?.close();\n console.error(chalk.red(`Error: ${error instanceof Error ? error.message : String(error)}`));\n process.exit(1);\n }\n}\n","// packages/cli/src/progress.ts — Shared progress callbacks for CLI commands\n\nimport type { ProgressCallbacks } from '@codemoot/core';\nimport chalk from 'chalk';\n\nconst THROTTLE_MS = 3_000;\n\n/**\n * Create progress callbacks for CLI commands that show real-time\n * codex activity on stderr. Parses JSONL events to surface what\n * codex is actually doing (reading files, running tools, thinking).\n */\nexport function createProgressCallbacks(label = 'codex'): ProgressCallbacks {\n let lastActivityAt = 0;\n let lastMessage = '';\n let carryOver = '';\n\n function printActivity(msg: string) {\n const now = Date.now();\n // Dedupe identical messages and throttle\n if (msg === lastMessage && now - lastActivityAt < THROTTLE_MS) return;\n lastActivityAt = now;\n lastMessage = msg;\n console.error(chalk.dim(` [${label}] ${msg}`));\n }\n\n return {\n onSpawn(pid: number, command: string) {\n console.error(chalk.dim(` [${label}] Started (PID: ${pid}, cmd: ${command})`));\n },\n\n onStderr(_chunk: string) {\n // Codex stderr is mostly internal noise — skip\n },\n\n onProgress(chunk: string) {\n // Parse JSONL events from codex stdout — handle lines split across chunks\n const data = carryOver + chunk;\n const lines = data.split('\\n');\n // Last element may be incomplete — carry it over to next chunk\n carryOver = lines.pop() ?? '';\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n try {\n const event = JSON.parse(trimmed);\n formatEvent(event, printActivity);\n } catch {\n // Not JSON — skip\n }\n }\n },\n\n onHeartbeat(elapsedSec: number) {\n // Only show heartbeats every 30s to reduce noise\n if (elapsedSec % 30 === 0) {\n printActivity(`${elapsedSec}s elapsed...`);\n }\n },\n };\n}\n\n/** Extract a human-readable summary from a codex JSONL event. */\nfunction formatEvent(\n event: Record<string, unknown>,\n print: (msg: string) => void,\n): void {\n const type = event.type as string;\n\n if (type === 'thread.started') {\n const tid = (event.thread_id as string) ?? '';\n print(`Thread: ${tid.slice(0, 12)}...`);\n return;\n }\n\n // Tool calls — show which tool codex is invoking\n if (type === 'item.completed') {\n const item = event.item as Record<string, unknown> | undefined;\n if (!item) return;\n\n if (item.type === 'tool_call' || item.type === 'function_call') {\n const name = (item.name as string) ?? (item.function as string) ?? 'tool';\n const rawArgs = item.arguments ?? item.input ?? '';\n const args = (typeof rawArgs === 'string' ? rawArgs : JSON.stringify(rawArgs)).slice(0, 80);\n // Extract file paths from tool args for readability\n const pathMatch = args.match(/[\"']([^\"']*\\.[a-z]{1,4})[\"']/i);\n if (pathMatch) {\n print(`${name}: ${pathMatch[1]}`);\n } else {\n print(`${name}${args ? `: ${args.slice(0, 60)}` : ''}`);\n }\n return;\n }\n\n if (item.type === 'agent_message') {\n const text = String(item.text ?? '');\n // Show first meaningful line of the response\n const firstLine = text.split('\\n').find(l => l.trim().length > 10);\n if (firstLine) {\n const preview = firstLine.trim().slice(0, 80);\n print(`Response: ${preview}${firstLine.trim().length > 80 ? '...' : ''}`);\n }\n return;\n }\n }\n\n if (type === 'turn.completed') {\n const usage = event.usage as Record<string, number> | undefined;\n if (usage) {\n const input = (usage.input_tokens ?? 0) + (usage.cached_input_tokens ?? 0);\n const output = usage.output_tokens ?? 0;\n print(`Turn done (${input} in / ${output} out tokens)`);\n }\n return;\n }\n}\n","import { openDatabase } from '@codemoot/core';\nimport chalk from 'chalk';\nimport { mkdirSync } from 'node:fs';\nimport { join } from 'node:path';\n\nexport function getDbPath(projectDir?: string): string {\n const base = projectDir ?? process.cwd();\n const dbDir = join(base, '.cowork', 'db');\n mkdirSync(dbDir, { recursive: true });\n return join(dbDir, 'cowork.db');\n}\n\n/**\n * Run a command function with a database connection that is guaranteed to close,\n * even on errors or process.exit calls.\n */\nexport async function withDatabase<T>(fn: (db: ReturnType<typeof openDatabase>) => Promise<T>): Promise<T> {\n const db = openDatabase(getDbPath());\n const originalExit = process.exit;\n let requestedExitCode: number | undefined;\n\n process.exit = ((code?: number) => {\n requestedExitCode = typeof code === 'number' ? code : 1;\n throw new Error('__WITH_DATABASE_EXIT__');\n }) as typeof process.exit;\n\n try {\n return await fn(db);\n } catch (error) {\n if (requestedExitCode === undefined) {\n console.error(chalk.red(`Error: ${error instanceof Error ? error.message : String(error)}`));\n }\n throw error;\n } finally {\n process.exit = originalExit;\n db.close();\n if (requestedExitCode !== undefined) {\n originalExit(requestedExitCode);\n }\n }\n}\n","// packages/cli/src/commands/debate.ts — CLI debate commands wired to core backend\r\n\r\nimport type { DebateEngineState, DebateTurnRow } from '@codemoot/core';\r\nimport {\r\n CliAdapter,\r\n DebateStore,\r\n MessageStore,\r\n ModelRegistry,\r\n SessionManager,\r\n buildReconstructionPrompt,\r\n generateId,\r\n getTokenBudgetStatus,\r\n loadConfig,\r\n openDatabase,\r\n parseDebateVerdict,\r\n preflightTokenCheck,\r\n} from '@codemoot/core';\r\nimport chalk from 'chalk';\r\n\r\nimport { createProgressCallbacks } from '../progress.js';\r\nimport { getDbPath } from '../utils.js';\r\n\r\n// ── codemoot debate start ──\r\n\r\ninterface StartOptions {\r\n maxRounds?: number;\r\n}\r\n\r\nexport async function debateStartCommand(topic: string, options: StartOptions): Promise<void> {\r\n let db: ReturnType<typeof openDatabase> | undefined;\r\n try {\r\n const debateId = generateId();\r\n const dbPath = getDbPath();\r\n db = openDatabase(dbPath);\r\n const store = new DebateStore(db);\r\n\r\n // Create rows for both participants\r\n store.upsert({ debateId, role: 'proposer', status: 'active' });\r\n store.upsert({ debateId, role: 'critic', status: 'active' });\r\n\r\n // Persist the topic as state_json on the proposer row\r\n store.saveState(debateId, 'proposer', {\r\n debateId,\r\n question: topic,\r\n models: ['codex-architect', 'codex-reviewer'],\r\n round: 0,\r\n turn: 0,\r\n thread: [],\r\n runningSummary: '',\r\n stanceHistory: [],\r\n usage: { totalPromptTokens: 0, totalCompletionTokens: 0, totalCalls: 0, startedAt: Date.now() },\r\n status: 'running',\r\n sessionIds: {},\r\n resumeStats: { attempted: 0, succeeded: 0, fallbacks: 0 },\r\n maxRounds: options.maxRounds ?? 5,\r\n } as DebateEngineState & { maxRounds: number });\r\n\r\n // Output JSON for the /debate skill to parse\r\n const output = {\r\n debateId,\r\n topic,\r\n maxRounds: options.maxRounds ?? 5,\r\n status: 'started',\r\n };\r\n console.log(JSON.stringify(output, null, 2));\r\n\r\n db.close();\r\n } catch (error) {\r\n db?.close();\r\n console.error(chalk.red(`Error: ${error instanceof Error ? error.message : String(error)}`));\r\n process.exit(1);\r\n }\r\n}\r\n\r\n// ── codemoot debate turn ──\r\n\r\ninterface TurnOptions {\r\n round?: number;\r\n timeout?: number;\r\n}\r\n\r\nexport async function debateTurnCommand(\r\n debateId: string,\r\n prompt: string,\r\n options: TurnOptions,\r\n): Promise<void> {\r\n let db: ReturnType<typeof openDatabase> | undefined;\r\n try {\r\n const dbPath = getDbPath();\r\n db = openDatabase(dbPath);\r\n const store = new DebateStore(db);\r\n const msgStore = new MessageStore(db);\r\n const config = loadConfig();\r\n const projectDir = process.cwd();\r\n const registry = ModelRegistry.fromConfig(config, projectDir);\r\n\r\n // Get existing critic row for session resume\r\n const criticRow = store.get(debateId, 'critic');\r\n if (!criticRow) {\r\n db.close();\r\n console.error(chalk.red(`No debate found with ID: ${debateId}`));\r\n process.exit(1);\r\n }\r\n if (criticRow.status === 'completed') {\r\n db.close();\r\n console.error(chalk.red(`Debate ${debateId} is already completed. Start a new debate to continue discussion.`));\r\n process.exit(1);\r\n }\r\n\r\n // Get the codex adapter (try reviewer first, fallback to architect)\r\n const adapter = registry.tryGetAdapter('codex-reviewer') ?? registry.tryGetAdapter('codex-architect');\r\n if (!adapter) {\r\n db.close();\r\n console.error(chalk.red('No codex adapter found in config. Available: codex-reviewer or codex-architect'));\r\n process.exit(1);\r\n }\r\n\r\n const rawRound = options.round ?? (criticRow.round + 1);\r\n const newRound = Number.isFinite(rawRound) && rawRound > 0 ? rawRound : criticRow.round + 1;\r\n const rawTimeout = options.timeout ?? 600;\r\n const timeout = (Number.isFinite(rawTimeout) && rawTimeout > 0 ? rawTimeout : 600) * 1000;\r\n\r\n // Enforce maxRounds from persisted state\r\n const proposerStateForLimit = store.loadState(debateId, 'proposer');\r\n const rawMax = (proposerStateForLimit as (typeof proposerStateForLimit & { maxRounds?: number }))?.maxRounds ?? 5;\r\n const maxRounds = Number.isFinite(rawMax) && rawMax > 0 ? rawMax : 5;\r\n if (newRound > maxRounds) {\r\n console.error(chalk.red(`Round ${newRound} exceeds max rounds (${maxRounds}). Complete or increase limit.`));\r\n db.close();\r\n process.exit(1);\r\n }\r\n\r\n // Idempotency: check for existing message at this (debate, round, role)\r\n const existing = msgStore.getByRound(debateId, newRound, 'critic');\r\n if (existing?.status === 'completed') {\r\n // Reconcile debate_turns round in case of prior crash between markCompleted and upsert\r\n if (criticRow.round < newRound) {\r\n store.upsert({\r\n debateId,\r\n role: 'critic',\r\n codexSessionId: existing.sessionId ?? criticRow.codexSessionId ?? undefined,\r\n round: newRound,\r\n status: 'active',\r\n });\r\n }\r\n // Return cached response\r\n const output = {\r\n debateId,\r\n round: newRound,\r\n response: existing.responseText,\r\n sessionId: existing.sessionId,\r\n resumed: false,\r\n cached: true,\r\n usage: existing.usageJson ? (() => { try { return JSON.parse(existing.usageJson); } catch { return null; } })() : null,\r\n durationMs: existing.durationMs,\r\n };\r\n console.log(JSON.stringify(output, null, 2));\r\n db.close();\r\n return;\r\n }\r\n\r\n // Recover stale running rows for THIS debate only (use timeout + buffer to avoid killing active turns)\r\n const staleThreshold = timeout + 60_000; // turn timeout + 1 min buffer\r\n const recovered = msgStore.recoverStaleForDebate(debateId, staleThreshold);\r\n if (recovered > 0) {\r\n console.error(chalk.yellow(` Recovered ${recovered} stale message(s) from prior crash.`));\r\n }\r\n\r\n // Re-fetch after recovery (status may have changed from running → failed)\r\n const current = msgStore.getByRound(debateId, newRound, 'critic');\r\n\r\n // Insert or reuse message row (update prompt if retrying with different text)\r\n let msgId: number;\r\n if (current) {\r\n msgId = current.id;\r\n if (current.status === 'failed' || current.status === 'queued') {\r\n msgStore.updatePrompt(msgId, prompt);\r\n }\r\n } else {\r\n msgId = msgStore.insertQueued({\r\n debateId,\r\n round: newRound,\r\n role: 'critic',\r\n bridge: 'codex',\r\n model: (adapter as CliAdapter).modelId ?? 'codex',\r\n promptText: prompt,\r\n });\r\n }\r\n\r\n // Transition to running (if another process completed it in between, return cached)\r\n if (!msgStore.markRunning(msgId)) {\r\n const recheckRow = msgStore.getByRound(debateId, newRound, 'critic');\r\n if (recheckRow?.status === 'completed') {\r\n const output = {\r\n debateId,\r\n round: newRound,\r\n response: recheckRow.responseText,\r\n sessionId: recheckRow.sessionId,\r\n resumed: false,\r\n cached: true,\r\n usage: recheckRow.usageJson ? (() => { try { return JSON.parse(recheckRow.usageJson); } catch { return null; } })() : null,\r\n durationMs: recheckRow.durationMs,\r\n };\r\n console.log(JSON.stringify(output, null, 2));\r\n db.close();\r\n return;\r\n }\r\n db.close();\r\n console.error(chalk.red(`Cannot transition message ${msgId} to running (current status: ${recheckRow?.status})`));\r\n process.exit(1);\r\n }\r\n\r\n // Resolve unified session (source of truth for thread_id)\r\n const sessionMgr = new SessionManager(db);\r\n const unifiedSession = sessionMgr.resolveActive('debate');\r\n let existingSessionId = unifiedSession.codexThreadId ?? criticRow.codexSessionId ?? undefined;\r\n const attemptedResume = existingSessionId != null;\r\n\r\n // Token budget preflight check (only completed rows = real conversation context)\r\n const completedHistory = msgStore.getHistory(debateId).filter(m => m.status === 'completed');\r\n const maxContext = (adapter as CliAdapter).capabilities.maxContextTokens;\r\n const preflight = preflightTokenCheck(completedHistory, prompt, maxContext);\r\n if (preflight.shouldStop) {\r\n console.error(chalk.yellow(` Token budget at ${Math.round(preflight.utilizationRatio * 100)}% (${preflight.totalTokensUsed}/${maxContext}). Consider completing this debate.`));\r\n } else if (preflight.shouldSummarize) {\r\n console.error(chalk.yellow(` Token budget at ${Math.round(preflight.utilizationRatio * 100)}%. Older rounds will be summarized on resume failure.`));\r\n }\r\n\r\n // Auto-rollover on session overflow\r\n const overflowCheck = sessionMgr.preCallOverflowCheck(unifiedSession.id);\r\n if (overflowCheck.rolled) {\r\n console.error(chalk.yellow(` ${overflowCheck.message}`));\r\n existingSessionId = undefined; // Don't reuse old thread after rollover\r\n }\r\n\r\n try {\r\n // Call GPT via codex with session resume + progress feedback\r\n const progress = createProgressCallbacks('debate');\r\n let result = await (adapter as CliAdapter).callWithResume(prompt, {\r\n sessionId: existingSessionId,\r\n timeout,\r\n ...progress,\r\n });\r\n\r\n // Detect resume outcome\r\n const resumed = attemptedResume && result.sessionId === existingSessionId;\r\n const resumeFailed = attemptedResume && !resumed;\r\n\r\n // If resume failed, reconstruct context from stored history and retry\r\n if (resumeFailed && result.text.length < 50) {\r\n console.error(chalk.yellow(' Resume failed with minimal response. Reconstructing from ledger...'));\r\n const history = msgStore.getHistory(debateId);\r\n const reconstructed = buildReconstructionPrompt(history, prompt);\r\n result = await (adapter as CliAdapter).callWithResume(reconstructed, {\r\n timeout,\r\n ...progress,\r\n });\r\n }\r\n\r\n // Warn about possible codex output truncation\r\n if (result.text.length < 200 && (result.durationMs ?? 0) > 60_000) {\r\n console.error(chalk.yellow(` Warning: GPT response is only ${result.text.length} chars after ${Math.round((result.durationMs ?? 0) / 1000)}s — possible output truncation (codex may have spent its turn on tool calls).`));\r\n }\r\n\r\n // Parse verdict from response\r\n const verdict = parseDebateVerdict(result.text);\r\n\r\n // Mark completed in message ledger\r\n const completed = msgStore.markCompleted(msgId, {\r\n responseText: result.text,\r\n verdict,\r\n usageJson: JSON.stringify(result.usage),\r\n durationMs: result.durationMs ?? 0,\r\n sessionId: result.sessionId ?? null,\r\n });\r\n if (!completed) {\r\n console.error(chalk.red(`Message ${msgId} ledger transition to completed failed (possible concurrent invocation or state drift).`));\r\n db.close();\r\n process.exit(1);\r\n }\r\n\r\n // Track resume failure\r\n if (resumeFailed) {\r\n store.incrementResumeFailCount(debateId, 'critic');\r\n }\r\n\r\n // Update unified session with thread ID and token usage\r\n if (result.sessionId) {\r\n sessionMgr.updateThreadId(unifiedSession.id, result.sessionId);\r\n }\r\n sessionMgr.addUsageFromResult(unifiedSession.id, result.usage, prompt, result.text);\r\n\r\n // Record event in session audit trail\r\n sessionMgr.recordEvent({\r\n sessionId: unifiedSession.id,\r\n command: 'debate',\r\n subcommand: 'turn',\r\n promptPreview: prompt.slice(0, 500),\r\n responsePreview: result.text.slice(0, 500),\r\n promptFull: prompt,\r\n responseFull: result.text,\r\n usageJson: JSON.stringify(result.usage),\r\n durationMs: result.durationMs,\r\n codexThreadId: result.sessionId,\r\n });\r\n\r\n // Persist session state in debate_turns (legacy mirror)\r\n store.upsert({\r\n debateId,\r\n role: 'critic',\r\n codexSessionId: result.sessionId ?? existingSessionId,\r\n round: newRound,\r\n status: 'active',\r\n });\r\n\r\n // Update proposer state with resume stats (defensive for older state_json without resumeStats)\r\n const proposerState = store.loadState(debateId, 'proposer');\r\n if (proposerState) {\r\n const stats = proposerState.resumeStats ?? { attempted: 0, succeeded: 0, fallbacks: 0 };\r\n if (attemptedResume) stats.attempted++;\r\n if (resumed) stats.succeeded++;\r\n if (resumeFailed) stats.fallbacks++;\r\n proposerState.resumeStats = stats;\r\n store.saveState(debateId, 'proposer', proposerState);\r\n }\r\n\r\n // Output JSON for the /debate skill to parse\r\n const output = {\r\n debateId,\r\n round: newRound,\r\n response: result.text,\r\n sessionId: result.sessionId,\r\n resumed,\r\n cached: false,\r\n stance: verdict.stance,\r\n usage: result.usage,\r\n durationMs: result.durationMs,\r\n };\r\n // Human-readable summary on stderr\r\n const stanceColor = verdict.stance === 'SUPPORT' ? chalk.green :\r\n verdict.stance === 'OPPOSE' ? chalk.red : chalk.yellow;\r\n console.error(stanceColor(`\\nRound ${newRound} — Stance: ${verdict.stance}`));\r\n // Show first 3 meaningful lines of the response\r\n const previewLines = result.text.split('\\n').filter(l => l.trim().length > 10).slice(0, 3);\r\n for (const line of previewLines) {\r\n console.error(chalk.dim(` ${line.trim().slice(0, 120)}`));\r\n }\r\n console.error(chalk.dim(`Duration: ${(result.durationMs / 1000).toFixed(1)}s | Tokens: ${result.usage?.totalTokens ?? '?'} | Resumed: ${resumed}`));\r\n\r\n console.log(JSON.stringify(output, null, 2));\r\n } catch (error) {\r\n // Mark failed in message ledger\r\n msgStore.markFailed(msgId, error instanceof Error ? error.message : String(error));\r\n throw error;\r\n }\r\n\r\n db.close();\r\n } catch (error) {\r\n db?.close();\r\n console.error(chalk.red(`Error: ${error instanceof Error ? error.message : String(error)}`));\r\n process.exit(1);\r\n }\r\n}\r\n\r\n// ── codemoot debate status ──\r\n\r\nexport async function debateStatusCommand(debateId: string): Promise<void> {\r\n let db: ReturnType<typeof openDatabase> | undefined;\r\n try {\r\n const dbPath = getDbPath();\r\n db = openDatabase(dbPath);\r\n const store = new DebateStore(db);\r\n\r\n const turns = store.getByDebateId(debateId);\r\n if (turns.length === 0) {\r\n db.close();\r\n console.error(chalk.red(`No debate found with ID: ${debateId}`));\r\n process.exit(1);\r\n }\r\n\r\n const state = store.loadState(debateId, 'proposer');\r\n const msgStore = new MessageStore(db);\r\n const msgHistory = msgStore.getHistory(debateId);\r\n const tokenStatus = getTokenBudgetStatus(msgHistory, 400_000);\r\n\r\n const output = {\r\n debateId,\r\n topic: state?.question ?? 'unknown',\r\n status: turns.some((t: DebateTurnRow) => t.status === 'active') ? 'active' : turns[0].status,\r\n round: Math.max(...turns.map((t: DebateTurnRow) => t.round)),\r\n participants: turns.map((t: DebateTurnRow) => ({\r\n role: t.role,\r\n codexSessionId: t.codexSessionId,\r\n round: t.round,\r\n status: t.status,\r\n resumeFailCount: t.resumeFailCount,\r\n lastActivity: new Date(t.lastActivityAt).toISOString(),\r\n })),\r\n resumeStats: state?.resumeStats ?? null,\r\n tokenBudget: {\r\n used: tokenStatus.totalTokensUsed,\r\n max: tokenStatus.maxContextTokens,\r\n utilization: `${Math.round(tokenStatus.utilizationRatio * 100)}%`,\r\n messages: msgHistory.length,\r\n },\r\n };\r\n console.log(JSON.stringify(output, null, 2));\r\n\r\n db.close();\r\n } catch (error) {\r\n db?.close();\r\n console.error(chalk.red(`Error: ${error instanceof Error ? error.message : String(error)}`));\r\n process.exit(1);\r\n }\r\n}\r\n\r\n// ── codemoot debate list ──\r\n\r\ninterface ListOptions {\r\n status?: string;\r\n limit?: number;\r\n}\r\n\r\nexport async function debateListCommand(options: ListOptions): Promise<void> {\r\n let db: ReturnType<typeof openDatabase> | undefined;\r\n try {\r\n const dbPath = getDbPath();\r\n db = openDatabase(dbPath);\r\n const store = new DebateStore(db);\r\n\r\n const desiredLimit = options.limit ?? 20;\r\n // Fetch extra rows since each debate has ~2 participant rows; limit after grouping\r\n const rows = store.list({\r\n status: options.status as 'active' | 'completed' | undefined,\r\n limit: desiredLimit * 3,\r\n });\r\n\r\n // Group by debate_id\r\n const debates = new Map<string, typeof rows>();\r\n for (const row of rows) {\r\n const existing = debates.get(row.debateId) ?? [];\r\n existing.push(row);\r\n debates.set(row.debateId, existing);\r\n }\r\n\r\n const output = Array.from(debates.entries()).slice(0, desiredLimit).map(([id, turns]) => {\r\n const state = store.loadState(id, 'proposer');\r\n return {\r\n debateId: id,\r\n topic: state?.question ?? 'unknown',\r\n status: turns.some((t: DebateTurnRow) => t.status === 'active') ? 'active' : turns[0].status,\r\n round: Math.max(...turns.map((t: DebateTurnRow) => t.round)),\r\n lastActivity: new Date(Math.max(...turns.map((t: DebateTurnRow) => t.lastActivityAt))).toISOString(),\r\n };\r\n });\r\n\r\n console.log(JSON.stringify(output, null, 2));\r\n\r\n db.close();\r\n } catch (error) {\r\n db?.close();\r\n console.error(chalk.red(`Error: ${error instanceof Error ? error.message : String(error)}`));\r\n process.exit(1);\r\n }\r\n}\r\n\r\n// ── codemoot debate history ──\r\n\r\nexport async function debateHistoryCommand(debateId: string): Promise<void> {\r\n let db: ReturnType<typeof openDatabase> | undefined;\r\n try {\r\n const dbPath = getDbPath();\r\n db = openDatabase(dbPath);\r\n const msgStore = new MessageStore(db);\r\n\r\n const history = msgStore.getHistory(debateId);\r\n if (history.length === 0) {\r\n // Check if the debate exists but predates message persistence (Phase 1)\r\n const debateStore = new DebateStore(db);\r\n const turns = debateStore.getByDebateId(debateId);\r\n if (turns.length > 0) {\r\n console.error(chalk.yellow(`No messages stored for debate ${debateId} — this debate predates message persistence (schema v4). Only metadata is available via \"debate status\".`));\r\n } else {\r\n console.error(chalk.red(`No debate found with ID: ${debateId}`));\r\n }\r\n db.close();\r\n process.exit(1);\r\n }\r\n\r\n const tokenStatus = getTokenBudgetStatus(history, 400_000);\r\n\r\n const output = {\r\n debateId,\r\n messageCount: history.length,\r\n tokenBudget: {\r\n used: tokenStatus.totalTokensUsed,\r\n max: tokenStatus.maxContextTokens,\r\n utilization: `${Math.round(tokenStatus.utilizationRatio * 100)}%`,\r\n },\r\n messages: history.map(m => ({\r\n round: m.round,\r\n role: m.role,\r\n bridge: m.bridge,\r\n model: m.model,\r\n status: m.status,\r\n stance: m.stance,\r\n confidence: m.confidence,\r\n durationMs: m.durationMs,\r\n sessionId: m.sessionId,\r\n promptPreview: m.promptText.slice(0, 200),\r\n responsePreview: m.responseText?.slice(0, 200) ?? null,\r\n error: m.error,\r\n createdAt: new Date(m.createdAt).toISOString(),\r\n completedAt: m.completedAt ? new Date(m.completedAt).toISOString() : null,\r\n })),\r\n };\r\n\r\n console.log(JSON.stringify(output, null, 2));\r\n db.close();\r\n } catch (error) {\r\n db?.close();\r\n console.error(chalk.red(`Error: ${error instanceof Error ? error.message : String(error)}`));\r\n process.exit(1);\r\n }\r\n}\r\n\r\n// ── codemoot debate complete ──\r\n\r\nexport async function debateCompleteCommand(debateId: string): Promise<void> {\r\n let db: ReturnType<typeof openDatabase> | undefined;\r\n try {\r\n const dbPath = getDbPath();\r\n db = openDatabase(dbPath);\r\n const store = new DebateStore(db);\r\n\r\n const turns = store.getByDebateId(debateId);\r\n if (turns.length === 0) {\r\n console.error(chalk.red(`No debate found with ID: ${debateId}`));\r\n db.close();\r\n process.exit(1);\r\n }\r\n\r\n const completeTransaction = db.transaction(() => {\r\n store.updateStatus(debateId, 'proposer', 'completed');\r\n store.updateStatus(debateId, 'critic', 'completed');\r\n });\r\n completeTransaction();\r\n\r\n console.log(JSON.stringify({ debateId, status: 'completed' }));\r\n db.close();\r\n } catch (error) {\r\n db?.close();\r\n console.error(chalk.red(`Error: ${error instanceof Error ? error.message : String(error)}`));\r\n process.exit(1);\r\n }\r\n}\r\n\r\n","// packages/cli/src/commands/cleanup.ts — AI slop scanner with 3-way merge (deterministic + codex + host)\r\n\r\nimport type { CleanupFinding, CleanupReport, CleanupScope } from '@codemoot/core';\r\nimport {\r\n BuildStore,\r\n CliAdapter,\r\n JobStore,\r\n ModelRegistry,\r\n SessionManager,\r\n buildHandoffEnvelope,\r\n computeThreeWayStats,\r\n createIgnoreFilter,\r\n generateId,\r\n hostFindingsSchema,\r\n loadConfig,\r\n mergeThreeWay,\r\n openDatabase,\r\n recalculateConfidenceStats,\r\n runAllScanners,\r\n} from '@codemoot/core';\r\nimport chalk from 'chalk';\r\nimport { readFileSync } from 'node:fs';\r\n\r\nimport { createProgressCallbacks } from '../progress.js';\r\nimport { getDbPath } from '../utils.js';\r\n\r\ninterface CleanupOptions {\r\n scope: string;\r\n timeout: number;\r\n maxDisputes: number;\r\n hostFindings?: string;\r\n background?: boolean;\r\n output?: string;\r\n noGitignore?: boolean;\r\n quiet?: boolean;\r\n}\r\n\r\nexport async function cleanupCommand(path: string, options: CleanupOptions): Promise<void> {\r\n let db: ReturnType<typeof openDatabase> | undefined;\r\n try {\r\n const { resolve } = await import('node:path');\r\n const projectDir = resolve(path);\r\n\r\n // ── Background mode: enqueue and return immediately ──\r\n if (options.background) {\r\n const bgDb = openDatabase(getDbPath());\r\n const jobStore = new JobStore(bgDb);\r\n const jobId = jobStore.enqueue({\r\n type: 'cleanup',\r\n payload: { path: projectDir, scope: options.scope, timeout: options.timeout, maxDisputes: options.maxDisputes, hostFindings: options.hostFindings, output: options.output },\r\n });\r\n console.log(JSON.stringify({ jobId, status: 'queued', message: 'Cleanup enqueued. Check with: codemoot jobs status ' + jobId }));\r\n bgDb.close();\r\n return;\r\n }\r\n\r\n const scopes = options.scope === 'all'\r\n ? ['deps', 'unused-exports', 'hardcoded', 'duplicates', 'deadcode', 'security', 'near-duplicates', 'anti-patterns'] as CleanupScope[]\r\n : [options.scope as CleanupScope];\r\n\r\n const dbPath = getDbPath();\r\n db = openDatabase(dbPath);\r\n const buildStore = new BuildStore(db);\r\n const buildId = generateId();\r\n const startTime = Date.now();\r\n\r\n // Create build run for tracking\r\n buildStore.create({ buildId, task: `cleanup:${options.scope}` });\r\n\r\n console.error(chalk.cyan(`Cleanup scan started (ID: ${buildId})`));\r\n console.error(chalk.cyan(`Scopes: ${scopes.join(', ')}`));\r\n console.error(chalk.cyan(`Project: ${projectDir}`));\r\n\r\n // ── Load host findings if provided ──\r\n let hostFindings: CleanupFinding[] = [];\r\n if (options.hostFindings) {\r\n console.error(chalk.cyan(`Host findings: ${options.hostFindings}`));\r\n try {\r\n const raw = readFileSync(options.hostFindings, 'utf-8');\r\n const parsed = JSON.parse(raw);\r\n const validated = hostFindingsSchema.parse(parsed);\r\n\r\n hostFindings = validated.map(f => ({\r\n key: `${f.scope}:${f.file}:${f.symbol}`,\r\n scope: f.scope as CleanupScope,\r\n confidence: f.confidence as CleanupFinding['confidence'],\r\n file: f.file,\r\n line: f.line,\r\n description: f.description,\r\n recommendation: f.recommendation,\r\n deterministicEvidence: [],\r\n semanticEvidence: [],\r\n hostEvidence: [`Host: ${f.description}`],\r\n sources: ['host'] as CleanupFinding['sources'],\r\n disputed: false,\r\n }));\r\n console.error(chalk.dim(` [host] Loaded ${hostFindings.length} findings`));\r\n } catch (err) {\r\n console.error(chalk.red(`Failed to load host findings: ${err instanceof Error ? err.message : String(err)}`));\r\n db.close();\r\n process.exit(1);\r\n }\r\n }\r\n\r\n // ── Build ignore filter ──\r\n const ig = createIgnoreFilter(projectDir, { skipGitignore: options.noGitignore });\r\n\r\n // ── Phase 1: Parallel scan ──\r\n console.error(chalk.yellow('\\nPhase 1: Scanning (parallel)...'));\r\n\r\n // Resolve codex adapter\r\n let codexAdapter: CliAdapter | null = null;\r\n try {\r\n const config = loadConfig();\r\n const registry = ModelRegistry.fromConfig(config, projectDir);\r\n try {\r\n codexAdapter = registry.getAdapter('codex-reviewer') as CliAdapter;\r\n } catch {\r\n try {\r\n codexAdapter = registry.getAdapter('codex-architect') as CliAdapter;\r\n } catch { /* no adapter */ }\r\n }\r\n } catch { /* config not found */ }\r\n\r\n // Resolve unified session\r\n const sessionMgr = new SessionManager(db);\r\n const session = sessionMgr.resolveActive('cleanup');\r\n const overflowCheck = sessionMgr.preCallOverflowCheck(session.id);\r\n if (overflowCheck.rolled) {\r\n console.error(chalk.yellow(` ${overflowCheck.message}`));\r\n }\r\n const currentSession = sessionMgr.get(session.id);\r\n const sessionThreadId = currentSession?.codexThreadId ?? undefined;\r\n\r\n // Run both scanners in parallel\r\n const [deterministicFindings, semanticFindings] = await Promise.all([\r\n Promise.resolve().then(() => {\r\n console.error(chalk.dim(' [deterministic] Starting...'));\r\n const findings = runAllScanners(projectDir, scopes, ig);\r\n console.error(chalk.dim(` [deterministic] Done: ${findings.length} findings`));\r\n return findings;\r\n }),\r\n runCodexScan(codexAdapter, projectDir, scopes, options.timeout, sessionMgr, session.id, sessionThreadId),\r\n ]);\r\n\r\n // Record scan event\r\n buildStore.updateWithEvent(\r\n buildId,\r\n { status: 'reviewing', currentPhase: 'review', metadata: { cleanupPhase: 'scan' } },\r\n {\r\n eventType: 'scan_completed',\r\n actor: 'system',\r\n phase: 'review',\r\n payload: {\r\n deterministicCount: deterministicFindings.length,\r\n semanticCount: semanticFindings.length,\r\n hostCount: hostFindings.length,\r\n },\r\n },\r\n );\r\n\r\n // ── Phase 2: 3-way merge ──\r\n console.error(chalk.yellow('\\nPhase 2: Merging findings (3-way)...'));\r\n\r\n const mergedFindings = mergeThreeWay(deterministicFindings, semanticFindings, hostFindings);\r\n const stats = computeThreeWayStats(deterministicFindings, semanticFindings, hostFindings, mergedFindings);\r\n\r\n console.error(chalk.dim(` Merged: ${mergedFindings.length} total, ${stats.agreed} agreed, ${stats.disputed} disputed`));\r\n if (hostFindings.length > 0) {\r\n console.error(chalk.dim(` Sources: deterministic=${stats.deterministic}, codex=${stats.semantic}, host=${stats.host}`));\r\n }\r\n\r\n buildStore.updateWithEvent(\r\n buildId,\r\n { metadata: { cleanupPhase: 'merge' } },\r\n {\r\n eventType: 'merge_completed',\r\n actor: 'system',\r\n phase: 'review',\r\n payload: { totalFindings: mergedFindings.length, ...stats },\r\n },\r\n );\r\n\r\n // ── Phase 2.5: Adjudicate disputed findings ──\r\n const hasAdjudicatable = stats.disputed > 0 || mergedFindings.some(f => f.confidence === 'medium');\r\n if (codexAdapter && hasAdjudicatable && options.maxDisputes > 0) {\r\n console.error(chalk.yellow(`\\nPhase 2.5: Adjudicating up to ${options.maxDisputes} disputed findings...`));\r\n await adjudicateFindings(codexAdapter, mergedFindings, options.maxDisputes, stats);\r\n\r\n buildStore.updateWithEvent(\r\n buildId,\r\n { metadata: { cleanupPhase: 'adjudicate' } },\r\n {\r\n eventType: 'adjudicated',\r\n actor: 'codex',\r\n phase: 'review',\r\n payload: { adjudicated: stats.adjudicated },\r\n },\r\n );\r\n }\r\n\r\n // ── Phase 3: Output report ──\r\n const durationMs = Date.now() - startTime;\r\n\r\n const actionableScopes = new Set<CleanupScope>(['deps', 'unused-exports', 'hardcoded']);\r\n const actionableCount = mergedFindings.filter(f =>\r\n actionableScopes.has(f.scope) && (f.confidence === 'high' || f.confidence === 'medium'),\r\n ).length;\r\n\r\n const report: CleanupReport = {\r\n scopes,\r\n findings: mergedFindings.sort((a, b) => {\r\n const confOrder = { high: 0, medium: 1, low: 2 };\r\n const confDiff = confOrder[a.confidence] - confOrder[b.confidence];\r\n if (confDiff !== 0) return confDiff;\r\n return a.key.localeCompare(b.key);\r\n }),\r\n stats,\r\n durationMs,\r\n };\r\n\r\n buildStore.updateWithEvent(\r\n buildId,\r\n { status: 'completed', currentPhase: 'done', completedAt: Date.now() },\r\n {\r\n eventType: 'phase_transition',\r\n actor: 'system',\r\n phase: 'done',\r\n payload: {\r\n totalFindings: mergedFindings.length,\r\n actionable: actionableCount,\r\n reportOnly: mergedFindings.length - actionableCount,\r\n },\r\n },\r\n );\r\n\r\n console.error(chalk.green(`\\nScan complete in ${(durationMs / 1000).toFixed(1)}s`));\r\n console.error(chalk.green(`Build ID: ${buildId}`));\r\n console.error(` Actionable: ${chalk.red(String(actionableCount))}`);\r\n console.error(` Report-only: ${chalk.dim(String(mergedFindings.length - actionableCount))}`);\r\n console.error(` High: ${stats.highConfidence} | Medium: ${stats.mediumConfidence} | Low: ${stats.lowConfidence}`);\r\n if (stats.adjudicated > 0) console.error(` Adjudicated: ${stats.adjudicated}`);\r\n\r\n // ── Human-readable summary (stderr) ──\r\n if (!options.quiet && mergedFindings.length > 0) {\r\n console.error(chalk.yellow('\\n── Findings Summary ──'));\r\n const byScope = new Map<string, CleanupFinding[]>();\r\n for (const f of report.findings) {\r\n const arr = byScope.get(f.scope) ?? [];\r\n arr.push(f);\r\n byScope.set(f.scope, arr);\r\n }\r\n for (const [scope, items] of byScope) {\r\n const high = items.filter(f => f.confidence === 'high').length;\r\n const med = items.filter(f => f.confidence === 'medium').length;\r\n const low = items.filter(f => f.confidence === 'low').length;\r\n console.error(chalk.cyan(`\\n ${scope} (${items.length})`));\r\n // Show up to 5 high/medium findings per scope\r\n for (const f of items.filter(i => i.confidence !== 'low').slice(0, 5)) {\r\n const conf = f.confidence === 'high' ? chalk.red('HIGH') : chalk.yellow('MED');\r\n const loc = f.line ? `${f.file}:${f.line}` : f.file;\r\n console.error(` ${conf} ${loc} — ${f.description}`);\r\n }\r\n if (high + med > 5) {\r\n console.error(chalk.dim(` ... and ${high + med - 5} more`));\r\n }\r\n if (low > 0) {\r\n console.error(chalk.dim(` + ${low} low-confidence (report-only)`));\r\n }\r\n }\r\n console.error('');\r\n }\r\n\r\n // Persist findings in session_events.response_full\r\n sessionMgr.recordEvent({\r\n sessionId: session.id,\r\n command: 'cleanup',\r\n subcommand: 'report',\r\n promptPreview: `Cleanup: ${scopes.join(', ')} on ${projectDir}`,\r\n responsePreview: `${mergedFindings.length} findings (${stats.highConfidence} high, ${stats.mediumConfidence} med, ${stats.lowConfidence} low)`,\r\n responseFull: JSON.stringify(report),\r\n durationMs,\r\n });\r\n\r\n // --output: write findings to file\r\n if (options.output) {\r\n const { writeFileSync } = await import('node:fs');\r\n // Write directly (atomic rename fails on Windows if target exists)\r\n writeFileSync(options.output, JSON.stringify(report, null, 2), 'utf-8');\r\n console.error(chalk.green(` Findings written to ${options.output}`));\r\n }\r\n\r\n console.log(JSON.stringify(report, null, 2));\r\n\r\n db.close();\r\n } catch (error) {\r\n db?.close();\r\n console.error(chalk.red(`Error: ${error instanceof Error ? error.message : String(error)}`));\r\n process.exit(1);\r\n }\r\n}\r\n\r\n// ── Codex semantic scan ──\r\n\r\nasync function runCodexScan(\r\n adapter: CliAdapter | null,\r\n _projectDir: string,\r\n scopes: CleanupScope[],\r\n timeoutSec: number,\r\n sessionMgr?: SessionManager,\r\n sessionId?: string,\r\n sessionThreadId?: string,\r\n): Promise<CleanupFinding[]> {\r\n if (!adapter) {\r\n console.error(chalk.yellow(' [codex] No adapter available — skipping semantic scan'));\r\n return [];\r\n }\r\n\r\n console.error(chalk.dim(' [codex] Starting semantic scan...'));\r\n\r\n const scopeDescriptions = scopes.map(s => {\r\n if (s === 'deps') return 'unused dependencies (check each package.json dep, including dynamic imports)';\r\n if (s === 'unused-exports') return 'unused exports (exported but never imported anywhere)';\r\n if (s === 'hardcoded') return 'hardcoded values (magic numbers, URLs, credentials)';\r\n if (s === 'duplicates') return 'duplicate logic (similar function bodies across files)';\r\n if (s === 'deadcode') return 'dead code (unreachable or unused internal code)';\r\n return s;\r\n }).join(', ');\r\n\r\n const prompt = buildHandoffEnvelope({\r\n command: 'cleanup',\r\n task: `Scan this codebase for AI slop and code quality issues.\r\n\r\nSCAN FOR: ${scopeDescriptions}\r\n\r\nWhere scope/confidence/file/line/symbol fields are:\r\n- scope: deps, unused-exports, hardcoded, duplicates, or deadcode\r\n- confidence: high, medium, or low\r\n- file: relative path from project root (forward slashes)\r\n- line: line number (or 0 if N/A)\r\n- symbol: the specific identifier (dep name, export name, variable name, or content hash)\r\n\r\nIMPORTANT KEY FORMAT: The key will be built as scope:file:symbol — use the SAME symbol that a static scanner would use:\r\n- deps: the package name (e.g. \"lodash\")\r\n- unused-exports: the export name (e.g. \"myFunction\")\r\n- hardcoded: for numbers use \"num:VALUE:LLINE\" (e.g. \"num:42:L15\"), for URLs use \"url:HOSTNAME:LLINE\" (e.g. \"url:api.example.com:L20\"), for credentials use \"cred:LLINE\" (e.g. \"cred:L15\")\r\n- duplicates: \"HASH:FUNCNAME\" where HASH is first 8 chars of md5 of normalized body (e.g. \"a1b2c3d4:myFunction\")\r\n- deadcode: the function/variable name`,\r\n constraints: [\r\n 'Be thorough but precise. Only report real issues you can verify.',\r\n 'Check for dynamic imports (import()) before flagging unused deps',\r\n 'Check barrel re-exports and index files before flagging unused exports',\r\n 'Check type-only imports (import type)',\r\n 'Check framework conventions and cross-package monorepo dependencies',\r\n ],\r\n resumed: Boolean(sessionThreadId),\r\n });\r\n\r\n try {\r\n const progress = createProgressCallbacks('cleanup-scan');\r\n const result = await adapter.callWithResume(prompt, { sessionId: sessionThreadId, timeout: timeoutSec * 1000, ...progress });\r\n\r\n // Update unified session\r\n if (sessionMgr && sessionId) {\r\n if (result.sessionId) {\r\n sessionMgr.updateThreadId(sessionId, result.sessionId);\r\n }\r\n sessionMgr.addUsageFromResult(sessionId, result.usage, prompt, result.text);\r\n sessionMgr.recordEvent({\r\n sessionId,\r\n command: 'cleanup',\r\n subcommand: 'scan',\r\n promptPreview: `Cleanup scan: ${scopes.join(', ')}`,\r\n responsePreview: result.text.slice(0, 500),\r\n usageJson: JSON.stringify(result.usage),\r\n durationMs: result.durationMs,\r\n codexThreadId: result.sessionId,\r\n });\r\n }\r\n\r\n const findings: CleanupFinding[] = [];\r\n for (const line of result.text.split('\\n')) {\r\n const match = line.match(/^FINDING:\\s*([^|]+)\\|([^|]+)\\|([^|]+)\\|(\\d+)\\|([^|]+)\\|([^|]+)\\|(.+)/);\r\n if (match) {\r\n const scope = match[1].trim() as CleanupScope;\r\n if (!scopes.includes(scope)) continue;\r\n\r\n const file = match[3].trim();\r\n const symbol = match[5].trim();\r\n findings.push({\r\n key: `${scope}:${file}:${symbol}`,\r\n scope,\r\n confidence: match[2].trim() as CleanupFinding['confidence'],\r\n file,\r\n line: Number.parseInt(match[4], 10) || undefined,\r\n description: match[6].trim(),\r\n recommendation: match[7].trim(),\r\n deterministicEvidence: [],\r\n semanticEvidence: [`Codex: ${match[6].trim()}`],\r\n hostEvidence: [],\r\n sources: ['semantic'],\r\n disputed: false,\r\n });\r\n }\r\n }\r\n\r\n console.error(chalk.dim(` [codex] Done: ${findings.length} findings`));\r\n return findings;\r\n } catch (error) {\r\n console.error(chalk.yellow(` [codex] Scan failed: ${error instanceof Error ? error.message : String(error)}`));\r\n return [];\r\n }\r\n}\r\n\r\n// ── Adjudication ──\r\n\r\nasync function adjudicateFindings(\r\n adapter: CliAdapter,\r\n findings: CleanupFinding[],\r\n maxDisputes: number,\r\n stats: CleanupReport['stats'],\r\n): Promise<void> {\r\n const toAdjudicate = findings\r\n .filter(f => f.disputed || f.confidence === 'medium')\r\n .slice(0, maxDisputes);\r\n\r\n for (const finding of toAdjudicate) {\r\n try {\r\n const allEvidence = [...finding.deterministicEvidence, ...finding.semanticEvidence, ...finding.hostEvidence];\r\n const prompt = buildHandoffEnvelope({\r\n command: 'adjudicate',\r\n task: `Verify this finding.\\n\\nFINDING: ${finding.description}\\nFILE: ${finding.file}${finding.line ? `:${finding.line}` : ''}\\nSCOPE: ${finding.scope}\\nSOURCES: ${finding.sources.join(', ')}\\nEVIDENCE: ${allEvidence.join('; ')}`,\r\n constraints: ['Check for dynamic imports, barrel re-exports, type-only usage, runtime/indirect usage'],\r\n resumed: false,\r\n });\r\n\r\n const adjProgress = createProgressCallbacks('adjudicate');\r\n const result = await adapter.callWithResume(prompt, { timeout: 60_000, ...adjProgress });\r\n\r\n const match = result.text.match(/ADJUDICATE:\\s*(CONFIRMED|DISMISSED|UNCERTAIN)\\s+(.*)/);\r\n if (match) {\r\n const verdict = match[1];\r\n if (verdict === 'CONFIRMED') {\r\n finding.confidence = 'high';\r\n finding.semanticEvidence.push(`Adjudicated: CONFIRMED — ${match[2]}`);\r\n } else if (verdict === 'DISMISSED') {\r\n finding.confidence = 'low';\r\n finding.semanticEvidence.push(`Adjudicated: DISMISSED — ${match[2]}`);\r\n } else {\r\n // UNCERTAIN — keep disputed, don't count as adjudicated\r\n finding.semanticEvidence.push(`Adjudicated: UNCERTAIN — ${match[2]}`);\r\n continue;\r\n }\r\n finding.disputed = false;\r\n stats.adjudicated++;\r\n }\r\n } catch {\r\n // Adjudication failed — keep as-is\r\n }\r\n }\r\n\r\n recalculateConfidenceStats(findings, stats);\r\n}\r\n","// packages/cli/src/commands/cost.ts — Cost and usage dashboard\n\nimport { openDatabase, SessionManager } from '@codemoot/core';\nimport chalk from 'chalk';\n\nimport { getDbPath } from '../utils.js';\n\ninterface CostOptions {\n scope: string;\n days: number;\n session?: string;\n}\n\ninterface UsageRow {\n command: string;\n subcommand: string;\n usage_json: string;\n duration_ms: number;\n created_at: number;\n}\n\nfunction parseUsage(usageJson: string): { input: number; output: number; total: number } {\n try {\n const u = JSON.parse(usageJson);\n const input = u.inputTokens ?? u.input_tokens ?? 0;\n const output = u.outputTokens ?? u.output_tokens ?? 0;\n const total = u.totalTokens ?? u.total_tokens ?? input + output;\n return { input, output, total };\n } catch {\n return { input: 0, output: 0, total: 0 };\n }\n}\n\nexport async function costCommand(options: CostOptions): Promise<void> {\n const db = openDatabase(getDbPath());\n\n try {\n let rows: UsageRow[];\n let scopeLabel: string;\n\n if (options.scope === 'session') {\n const sessionMgr = new SessionManager(db);\n const session = options.session\n ? sessionMgr.get(options.session)\n : sessionMgr.resolveActive('cost');\n if (!session) {\n console.error(chalk.red(options.session ? `Session not found: ${options.session}` : 'No active session. Run: codemoot init'));\n db.close();\n process.exit(1);\n }\n rows = db\n .prepare(\n 'SELECT command, subcommand, usage_json, duration_ms, created_at FROM session_events WHERE session_id = ? ORDER BY created_at ASC',\n )\n .all(session.id) as UsageRow[];\n scopeLabel = `session ${session.id.slice(0, 8)}`;\n } else if (options.scope === 'all') {\n rows = db\n .prepare(\n 'SELECT command, subcommand, usage_json, duration_ms, created_at FROM session_events ORDER BY created_at ASC',\n )\n .all() as UsageRow[];\n scopeLabel = 'all-time';\n } else {\n const cutoff = Date.now() - options.days * 24 * 60 * 60 * 1000;\n rows = db\n .prepare(\n 'SELECT command, subcommand, usage_json, duration_ms, created_at FROM session_events WHERE created_at > ? ORDER BY created_at ASC',\n )\n .all(cutoff) as UsageRow[];\n scopeLabel = `last ${options.days} days`;\n }\n\n let totalInput = 0;\n let totalOutput = 0;\n let totalTokens = 0;\n let totalDuration = 0;\n const byCommand: Record<string, { calls: number; tokens: number; durationMs: number }> = {};\n const byDay: Record<string, { calls: number; tokens: number }> = {};\n\n for (const row of rows) {\n const usage = parseUsage(row.usage_json);\n totalInput += usage.input;\n totalOutput += usage.output;\n totalTokens += usage.total;\n totalDuration += row.duration_ms ?? 0;\n\n const cmd = row.command ?? 'unknown';\n if (!byCommand[cmd]) byCommand[cmd] = { calls: 0, tokens: 0, durationMs: 0 };\n byCommand[cmd].calls++;\n byCommand[cmd].tokens += usage.total;\n byCommand[cmd].durationMs += row.duration_ms ?? 0;\n\n const day = new Date(row.created_at).toISOString().slice(0, 10);\n if (!byDay[day]) byDay[day] = { calls: 0, tokens: 0 };\n byDay[day].calls++;\n byDay[day].tokens += usage.total;\n }\n\n const output = {\n scope: scopeLabel,\n totalCalls: rows.length,\n totalTokens,\n totalInputTokens: totalInput,\n totalOutputTokens: totalOutput,\n totalDurationMs: totalDuration,\n avgTokensPerCall: rows.length > 0 ? Math.round(totalTokens / rows.length) : 0,\n avgDurationMs: rows.length > 0 ? Math.round(totalDuration / rows.length) : 0,\n byCommand,\n byDay,\n };\n\n console.log(JSON.stringify(output, null, 2));\n db.close();\n } catch (error) {\n db.close();\n console.error(chalk.red(`Error: ${error instanceof Error ? error.message : String(error)}`));\n process.exit(1);\n }\n}\n","// packages/cli/src/commands/doctor.ts — Preflight diagnostics for CodeMoot\n\nimport { existsSync, accessSync, constants } from 'node:fs';\nimport { execSync } from 'node:child_process';\nimport { join } from 'node:path';\nimport chalk from 'chalk';\nimport { VERSION } from '@codemoot/core';\n\ninterface Check {\n name: string;\n status: 'pass' | 'warn' | 'fail';\n message: string;\n fix?: string;\n}\n\nexport async function doctorCommand(): Promise<void> {\n const cwd = process.cwd();\n const checks: Check[] = [];\n\n console.error(chalk.cyan(`\\n CodeMoot Doctor v${VERSION}\\n`));\n\n // 1. Codex CLI\n try {\n const version = execSync('codex --version', { stdio: 'pipe', encoding: 'utf-8' }).trim();\n checks.push({ name: 'codex-cli', status: 'pass', message: `Codex CLI ${version}` });\n } catch {\n checks.push({\n name: 'codex-cli',\n status: 'fail',\n message: 'Codex CLI not found in PATH',\n fix: 'npm install -g @openai/codex',\n });\n }\n\n // 2. Config file\n const configPath = join(cwd, '.cowork.yml');\n if (existsSync(configPath)) {\n checks.push({ name: 'config', status: 'pass', message: '.cowork.yml found' });\n } else {\n checks.push({\n name: 'config',\n status: 'fail',\n message: '.cowork.yml not found',\n fix: 'codemoot init',\n });\n }\n\n // 3. Database writable\n const dbDir = join(cwd, '.cowork', 'db');\n const dbPath = join(dbDir, 'cowork.db');\n if (existsSync(dbDir)) {\n try {\n accessSync(dbDir, constants.W_OK);\n checks.push({\n name: 'database',\n status: existsSync(dbPath) ? 'pass' : 'warn',\n message: existsSync(dbPath) ? 'Database exists and writable' : 'Database directory exists, DB will be created on first use',\n });\n } catch {\n checks.push({\n name: 'database',\n status: 'fail',\n message: '.cowork/db/ is not writable',\n fix: 'Check file permissions on .cowork/db/',\n });\n }\n } else {\n checks.push({\n name: 'database',\n status: 'warn',\n message: '.cowork/db/ not found — will be created by codemoot init',\n fix: 'codemoot init',\n });\n }\n\n // 4. Git repo — traverse up to find .git\n let gitFound = false;\n let searchDir = cwd;\n while (searchDir) {\n if (existsSync(join(searchDir, '.git'))) {\n gitFound = true;\n break;\n }\n const parent = join(searchDir, '..');\n if (parent === searchDir) break;\n searchDir = parent;\n }\n if (gitFound) {\n checks.push({ name: 'git', status: 'pass', message: 'Git repository detected' });\n } else {\n checks.push({\n name: 'git',\n status: 'warn',\n message: 'Not a git repository — diff/shipit/watch features limited',\n });\n }\n\n // 5. Node version\n const nodeVersion = process.version;\n const major = Number.parseInt(nodeVersion.slice(1).split('.')[0], 10);\n if (major >= 18) {\n checks.push({ name: 'node', status: 'pass', message: `Node.js ${nodeVersion}` });\n } else {\n checks.push({\n name: 'node',\n status: 'fail',\n message: `Node.js ${nodeVersion} — requires >= 18`,\n fix: 'Install Node.js 18+',\n });\n }\n\n // 6. Schema version check\n if (existsSync(dbPath)) {\n try {\n const { openDatabase } = await import('@codemoot/core');\n const db = openDatabase(dbPath);\n const row = db.prepare('PRAGMA user_version').get() as { user_version: number } | undefined;\n const version = row?.user_version ?? 0;\n if (version >= 7) {\n checks.push({ name: 'schema', status: 'pass', message: `Schema version ${version}` });\n } else {\n checks.push({\n name: 'schema',\n status: 'warn',\n message: `Schema version ${version} — will auto-migrate on next command`,\n });\n }\n db.close();\n } catch {\n checks.push({ name: 'schema', status: 'warn', message: 'Could not read schema version' });\n }\n }\n\n // Print results\n let hasFailure = false;\n for (const check of checks) {\n const icon = check.status === 'pass'\n ? chalk.green('PASS')\n : check.status === 'warn'\n ? chalk.yellow('WARN')\n : chalk.red('FAIL');\n console.error(` ${icon} ${check.name}: ${check.message}`);\n if (check.fix) {\n console.error(chalk.dim(` → ${check.fix}`));\n }\n if (check.status === 'fail') hasFailure = true;\n }\n\n console.error('');\n\n // JSON output\n const output = {\n version: VERSION,\n checks,\n healthy: !hasFailure,\n };\n console.log(JSON.stringify(output, null, 2));\n\n if (hasFailure) {\n process.exit(1);\n }\n}\n","// packages/cli/src/commands/events.ts — Tail session events + job logs as JSONL\n\nimport { openDatabase } from '@codemoot/core';\nimport chalk from 'chalk';\n\nimport { getDbPath } from '../utils.js';\n\ninterface EventsOptions {\n follow: boolean;\n sinceSeq: number;\n limit: number;\n type: string;\n}\n\nexport async function eventsCommand(options: EventsOptions): Promise<void> {\n const db = openDatabase(getDbPath());\n\n const query =\n options.type === 'all'\n ? db.prepare(`\n SELECT 'session_event' as source, id, session_id, command, subcommand, prompt_preview, response_preview, usage_json, duration_ms, created_at\n FROM session_events\n WHERE id > ?\n ORDER BY id ASC\n LIMIT ?\n `)\n : options.type === 'jobs'\n ? db.prepare(`\n SELECT 'job_log' as source, id, job_id, seq, level, event_type, message, payload_json, created_at\n FROM job_logs\n WHERE id > ?\n ORDER BY id ASC\n LIMIT ?\n `)\n : db.prepare(`\n SELECT 'session_event' as source, id, session_id, command, subcommand, prompt_preview, response_preview, usage_json, duration_ms, created_at\n FROM session_events\n WHERE id > ?\n ORDER BY id ASC\n LIMIT ?\n `);\n\n let cursor = options.sinceSeq;\n\n const poll = () => {\n const rows = query.all(cursor, options.limit) as Record<string, unknown>[];\n for (const row of rows) {\n console.log(JSON.stringify(row));\n cursor = row.id as number;\n }\n return rows.length;\n };\n\n // Initial dump\n poll();\n\n if (!options.follow) {\n db.close();\n return;\n }\n\n // Follow mode: poll every 1s\n console.error(chalk.dim('Following events... (Ctrl+C to stop)'));\n\n const interval = setInterval(() => {\n poll();\n }, 1000);\n\n const shutdown = () => {\n clearInterval(interval);\n db.close();\n process.exit(0);\n };\n\n process.on('SIGINT', shutdown);\n process.on('SIGTERM', shutdown);\n}\n","// packages/cli/src/commands/fix.ts — Autofix loop: GPT reviews → CLI applies fixes → GPT re-reviews\n\nimport { execFileSync, execSync } from 'node:child_process';\nimport { readFileSync, writeFileSync } from 'node:fs';\nimport { resolve } from 'node:path';\nimport {\n type CliAdapter,\n DEFAULT_RULES,\n ModelRegistry,\n type PolicyContext,\n SessionManager,\n buildHandoffEnvelope,\n evaluatePolicy,\n loadConfig,\n openDatabase,\n REVIEW_DIFF_MAX_CHARS,\n} from '@codemoot/core';\nimport chalk from 'chalk';\n\nimport { createProgressCallbacks } from '../progress.js';\nimport { getDbPath } from '../utils.js';\n\ninterface FixOptions {\n maxRounds: number;\n focus: string;\n timeout: number;\n dryRun: boolean;\n diff?: string;\n session?: string;\n noStage?: boolean;\n}\n\ninterface ParsedFix {\n file: string;\n line: number;\n description: string;\n oldCode: string;\n newCode: string;\n}\n\ninterface FixRound {\n round: number;\n reviewVerdict: string;\n reviewScore: number | null;\n criticalCount: number;\n warningCount: number;\n fixesProposed: number;\n fixesApplied: number;\n fixesFailed: number;\n exitReason: string;\n durationMs: number;\n}\n\n/**\n * Parse FIX blocks from GPT review output.\n * Expected format:\n * FIX: <file>:<line> <description>\n * ```old\n * <old code>\n * ```\n * ```new\n * <new code>\n * ```\n *\n * Also supports simpler format:\n * FIX: <file>:<line> <description>\n * ```\n * <replacement code>\n * ```\n */\nfunction parseFixes(text: string): ParsedFix[] {\n const fixes: ParsedFix[] = [];\n\n // Match FIX: lines followed by code blocks\n const fixPattern = /FIX:\\s*(\\S+?):(\\d+)\\s+(.+?)(?:\\n```old\\n([\\s\\S]*?)\\n```\\s*\\n```new\\n([\\s\\S]*?)\\n```|(?:\\n```\\n([\\s\\S]*?)\\n```))/g;\n\n let match: RegExpExecArray | null;\n match = fixPattern.exec(text);\n while (match !== null) {\n const file = match[1];\n const line = Number.parseInt(match[2], 10);\n const description = match[3].trim();\n\n if (match[4] !== undefined && match[5] !== undefined) {\n // old/new format\n fixes.push({ file, line, description, oldCode: match[4], newCode: match[5] });\n } else if (match[6] !== undefined) {\n // Simple replacement format — we'll need the old code from the file\n fixes.push({ file, line, description, oldCode: '', newCode: match[6] });\n }\n match = fixPattern.exec(text);\n }\n\n return fixes;\n}\n\n/**\n * Apply a single fix to a file. Returns true if applied successfully.\n */\nfunction applyFix(fix: ParsedFix, projectDir: string): boolean {\n const filePath = resolve(projectDir, fix.file);\n\n // Path traversal guard: resolved path must stay within projectDir\n const normalizedProject = resolve(projectDir) + (process.platform === 'win32' ? '\\\\' : '/');\n if (!resolve(filePath).startsWith(normalizedProject)) {\n return false;\n }\n\n let content: string;\n try {\n content = readFileSync(filePath, 'utf-8');\n } catch {\n return false;\n }\n\n const lines = content.split('\\n');\n\n if (fix.oldCode) {\n // Exact string replacement\n const trimmedOld = fix.oldCode.trim();\n if (content.includes(trimmedOld)) {\n const updated = content.replace(trimmedOld, fix.newCode.trim());\n writeFileSync(filePath, updated, 'utf-8');\n return true;\n }\n return false;\n }\n\n // Line-based replacement (simple format)\n const lineIdx = fix.line - 1;\n if (lineIdx < 0 || lineIdx >= lines.length) return false;\n\n const newLines = fix.newCode.trim().split('\\n');\n // Replace the target line(s) with the new code\n const oldLineCount = Math.max(1, newLines.length);\n lines.splice(lineIdx, oldLineCount, ...newLines);\n writeFileSync(filePath, lines.join('\\n'), 'utf-8');\n return true;\n}\n\nexport async function fixCommand(fileOrGlob: string, options: FixOptions): Promise<void> {\n const projectDir = process.cwd();\n const db = openDatabase(getDbPath());\n const config = loadConfig();\n const registry = ModelRegistry.fromConfig(config, projectDir);\n const adapter =\n registry.tryGetAdapter('codex-reviewer') ?? registry.tryGetAdapter('codex-architect');\n\n if (!adapter) {\n try {\n execSync('codex --version', { stdio: 'pipe', encoding: 'utf-8' });\n } catch {\n console.error(chalk.red('Codex CLI is not installed or not in PATH.'));\n console.error(chalk.yellow('Install it: npm install -g @openai/codex'));\n db.close();\n process.exit(1);\n }\n console.error(chalk.red('No codex adapter found in config. Run: codemoot init'));\n db.close();\n process.exit(1);\n }\n\n const sessionMgr = new SessionManager(db);\n const session = options.session\n ? sessionMgr.get(options.session)\n : sessionMgr.resolveActive('fix');\n\n if (!session) {\n console.error(chalk.red(options.session\n ? `Session not found: ${options.session}`\n : 'No active session. Run: codemoot init'));\n db.close();\n process.exit(1);\n }\n\n const currentSession = sessionMgr.get(session.id);\n let threadId = currentSession?.codexThreadId ?? undefined;\n const rounds: FixRound[] = [];\n let converged = false;\n const stuckFingerprints = new Set<string>();\n let prevFingerprints = new Set<string>();\n\n console.error(\n chalk.cyan(\n `Autofix loop: ${fileOrGlob} (max ${options.maxRounds} rounds, focus: ${options.focus})`,\n ),\n );\n\n for (let round = 1; round <= options.maxRounds; round++) {\n const overflowCheck = sessionMgr.preCallOverflowCheck(session.id);\n if (overflowCheck.rolled) {\n console.error(chalk.yellow(` ${overflowCheck.message}`));\n threadId = undefined;\n }\n\n const roundStart = Date.now();\n console.error(chalk.dim(`\\n── Round ${round}/${options.maxRounds} ──`));\n\n // Step 1: GPT reviews and proposes fixes\n let diffContent = '';\n if (options.diff) {\n try {\n diffContent = execFileSync('git', ['diff', '--', ...options.diff.split(/\\s+/)], {\n cwd: projectDir,\n encoding: 'utf-8',\n maxBuffer: 1024 * 1024,\n });\n } catch {\n diffContent = '';\n }\n }\n\n const fixOutputContract = [\n 'You are an autofix engine. For EVERY fixable issue, you MUST output this EXACT format:',\n '',\n 'FIX: path/to/file.ts:42 Description of the bug',\n '```old',\n 'exact old code copied from the file',\n '```',\n '```new',\n 'exact replacement code',\n '```',\n '',\n 'Then end with:',\n 'VERDICT: APPROVED or VERDICT: NEEDS_REVISION',\n 'SCORE: X/10',\n '',\n 'Rules:',\n '- The ```old block MUST be an exact substring copy from the file (whitespace-sensitive).',\n '- One FIX block per issue.',\n '- Issues without a FIX block are IGNORED by the autofix engine.',\n '- If the code is clean, output VERDICT: APPROVED with no FIX blocks.',\n ].join('\\n');\n\n const reviewPrompt = buildHandoffEnvelope({\n command: 'custom',\n task: options.diff\n ? `Review and identify fixable issues in this diff.\\n\\nGIT DIFF (${options.diff}):\\n${diffContent.slice(0, REVIEW_DIFF_MAX_CHARS)}\\n\\n${fixOutputContract}`\n : `Review ${fileOrGlob} and identify fixable issues. Read the file(s) first, then report issues with exact line numbers and exact fixes.\\n\\n${fixOutputContract}`,\n constraints: [\n `Focus: ${options.focus}`,\n round > 1\n ? `This is re-review round ${round}. Previous fixes were applied by the host. Only report REMAINING unfixed issues.`\n : '',\n ].filter(Boolean),\n resumed: Boolean(threadId),\n });\n\n const timeoutMs = options.timeout * 1000;\n const progress = createProgressCallbacks('fix-review');\n\n console.error(chalk.dim(' GPT reviewing...'));\n const reviewResult = await (adapter as CliAdapter).callWithResume(reviewPrompt, {\n sessionId: threadId,\n timeout: timeoutMs,\n ...progress,\n });\n\n if (reviewResult.sessionId) {\n threadId = reviewResult.sessionId;\n sessionMgr.updateThreadId(session.id, reviewResult.sessionId);\n }\n sessionMgr.addUsageFromResult(session.id, reviewResult.usage, reviewPrompt, reviewResult.text);\n\n sessionMgr.recordEvent({\n sessionId: session.id,\n command: 'fix',\n subcommand: `review-round-${round}`,\n promptPreview: `Fix review round ${round}: ${fileOrGlob}`,\n responsePreview: reviewResult.text.slice(0, 500),\n promptFull: reviewPrompt,\n responseFull: reviewResult.text,\n usageJson: JSON.stringify(reviewResult.usage),\n durationMs: reviewResult.durationMs,\n codexThreadId: reviewResult.sessionId,\n });\n\n // Parse verdict\n const tail = reviewResult.text.slice(-500);\n const verdictMatch = tail.match(/VERDICT:\\s*(APPROVED|NEEDS_REVISION)/i);\n const scoreMatch = tail.match(/SCORE:\\s*(\\d+)\\/10/);\n const verdict = verdictMatch ? verdictMatch[1].toLowerCase() : 'unknown';\n const score = scoreMatch ? Number.parseInt(scoreMatch[1], 10) : null;\n const criticalCount = (reviewResult.text.match(/CRITICAL/gi) ?? []).length;\n const warningCount = (reviewResult.text.match(/WARNING/gi) ?? []).length;\n\n console.error(\n ` Verdict: ${verdict}, Score: ${score ?? '?'}/10, Critical: ${criticalCount}, Warning: ${warningCount}`,\n );\n\n // Check if approved\n if (verdict === 'approved' && criticalCount === 0) {\n rounds.push({\n round,\n reviewVerdict: verdict,\n reviewScore: score,\n criticalCount,\n warningCount,\n fixesProposed: 0,\n fixesApplied: 0,\n fixesFailed: 0,\n exitReason: 'all_resolved',\n durationMs: Date.now() - roundStart,\n });\n converged = true;\n console.error(chalk.green(' APPROVED — all issues resolved.'));\n break;\n }\n\n // Parse fixes from GPT output\n const fixes = parseFixes(reviewResult.text);\n console.error(chalk.dim(` Found ${fixes.length} fix proposal(s)`));\n\n if (fixes.length === 0) {\n rounds.push({\n round,\n reviewVerdict: verdict,\n reviewScore: score,\n criticalCount,\n warningCount,\n fixesProposed: 0,\n fixesApplied: 0,\n fixesFailed: 0,\n exitReason: 'no_fixes_proposed',\n durationMs: Date.now() - roundStart,\n });\n console.error(chalk.yellow(' GPT found issues but proposed no structured fixes. Stopping.'));\n break;\n }\n\n if (options.dryRun) {\n console.error(chalk.yellow(' Dry-run: showing proposed fixes without applying.'));\n for (const fix of fixes) {\n console.error(chalk.dim(` ${fix.file}:${fix.line} — ${fix.description}`));\n }\n rounds.push({\n round,\n reviewVerdict: verdict,\n reviewScore: score,\n criticalCount,\n warningCount,\n fixesProposed: fixes.length,\n fixesApplied: 0,\n fixesFailed: 0,\n exitReason: 'dry_run',\n durationMs: Date.now() - roundStart,\n });\n continue;\n }\n\n // Step 2: Apply fixes locally (host applies, not GPT)\n let applied = 0;\n let failed = 0;\n const currentFingerprints = new Set<string>();\n\n for (const fix of fixes) {\n const fingerprint = `${fix.file}:${fix.description}`;\n currentFingerprints.add(fingerprint);\n\n if (stuckFingerprints.has(fingerprint)) {\n console.error(chalk.dim(` Skip (stuck): ${fix.file}:${fix.line}`));\n continue;\n }\n\n // Mark as stuck if same fingerprint appeared in previous round\n if (prevFingerprints.has(fingerprint)) {\n stuckFingerprints.add(fingerprint);\n console.error(chalk.yellow(` Stuck (recurring): ${fix.file}:${fix.line} — ${fix.description}`));\n failed++;\n continue;\n }\n\n const success = applyFix(fix, projectDir);\n if (success) {\n applied++;\n console.error(chalk.green(` Fixed: ${fix.file}:${fix.line} — ${fix.description}`));\n } else {\n failed++;\n console.error(chalk.red(` Failed: ${fix.file}:${fix.line} — could not match old code`));\n }\n }\n\n prevFingerprints = currentFingerprints;\n\n // Stage changes unless --no-stage\n if (applied > 0 && !options.noStage) {\n try {\n execFileSync('git', ['add', '-A'], { cwd: projectDir, stdio: 'pipe' });\n console.error(chalk.dim(' Changes staged.'));\n } catch {\n console.error(chalk.yellow(' Could not stage changes (not a git repo?).'));\n }\n }\n\n const exitReason = applied === 0 ? 'no_diff' : 'continue';\n\n rounds.push({\n round,\n reviewVerdict: verdict,\n reviewScore: score,\n criticalCount,\n warningCount,\n fixesProposed: fixes.length,\n fixesApplied: applied,\n fixesFailed: failed,\n exitReason,\n durationMs: Date.now() - roundStart,\n });\n\n if (applied === 0) {\n console.error(chalk.yellow(' No fixes applied — stopping loop.'));\n break;\n }\n\n // Check if all remaining are stuck\n if (stuckFingerprints.size >= fixes.length) {\n console.error(chalk.yellow(' All remaining issues are stuck — stopping.'));\n break;\n }\n\n console.error(chalk.dim(` Applied ${applied}, failed ${failed}. Continuing to re-review...`));\n }\n\n // Final summary\n const lastRound = rounds[rounds.length - 1];\n const totalApplied = rounds.reduce((sum, r) => sum + r.fixesApplied, 0);\n const totalProposed = rounds.reduce((sum, r) => sum + r.fixesProposed, 0);\n\n const policyCtx: PolicyContext = {\n criticalCount: lastRound?.criticalCount ?? 0,\n warningCount: lastRound?.warningCount ?? 0,\n verdict: lastRound?.reviewVerdict ?? 'unknown',\n stepsCompleted: { fix: converged ? 'passed' : 'failed' },\n cleanupHighCount: 0,\n };\n const policy = evaluatePolicy('review.completed', policyCtx, DEFAULT_RULES);\n\n const exitReason = converged\n ? 'all_resolved'\n : stuckFingerprints.size > 0\n ? 'all_stuck'\n : lastRound?.exitReason ?? 'max_iterations';\n\n const output = {\n target: fileOrGlob,\n converged,\n exitReason,\n rounds,\n totalRounds: rounds.length,\n totalFixesProposed: totalProposed,\n totalFixesApplied: totalApplied,\n stuckCount: stuckFingerprints.size,\n finalVerdict: lastRound?.reviewVerdict ?? 'unknown',\n finalScore: lastRound?.reviewScore ?? null,\n policy,\n sessionId: session.id,\n codexThreadId: threadId,\n };\n\n // Human-readable summary\n const color = converged ? chalk.green : chalk.red;\n console.error(color(`\\nResult: ${converged ? 'CONVERGED' : 'NOT CONVERGED'} (${exitReason})`));\n console.error(` Rounds: ${rounds.length}/${options.maxRounds}`);\n console.error(` Fixes: ${totalApplied} applied, ${totalProposed - totalApplied} failed/skipped`);\n if (stuckFingerprints.size > 0) {\n console.error(chalk.yellow(` Stuck issues: ${stuckFingerprints.size}`));\n }\n console.error(` Final: ${lastRound?.reviewVerdict ?? '?'} (${lastRound?.reviewScore ?? '?'}/10)`);\n\n console.log(JSON.stringify(output, null, 2));\n db.close();\n}\n","import { existsSync } from 'node:fs';\nimport { basename, join } from 'node:path';\n\nimport type { PresetName } from '@codemoot/core';\nimport { loadConfig, writeConfig } from '@codemoot/core';\nimport chalk from 'chalk';\n\ninterface InitOptions {\n preset?: string;\n nonInteractive?: boolean;\n force?: boolean;\n}\n\nexport async function initCommand(options: InitOptions): Promise<void> {\n const cwd = process.cwd();\n const configPath = join(cwd, '.cowork.yml');\n\n // Check existing config\n if (existsSync(configPath) && !options.force) {\n console.error(chalk.red('Already initialized. Use --force to overwrite.'));\n process.exit(1);\n }\n\n // Validate preset name\n const validPresets: PresetName[] = ['cli-first'];\n // Select preset\n let presetName: PresetName = 'cli-first';\n if (options.preset) {\n if (!validPresets.includes(options.preset as PresetName)) {\n console.error(chalk.red(`Unknown preset: ${options.preset}. Available: ${validPresets.join(', ')}`));\n process.exit(1);\n }\n presetName = options.preset as PresetName;\n } else if (options.nonInteractive) {\n presetName = 'cli-first';\n } else {\n const { selectPreset } = await import('../prompts.js');\n presetName = await selectPreset();\n }\n\n // Load config with preset (skip existing file on --force)\n const config = loadConfig({ preset: presetName, skipFile: options.force });\n // Set project name to directory name\n config.project.name = basename(cwd);\n\n // Write config\n writeConfig(config, cwd);\n\n console.log(chalk.green(`\\nInitialized with '${presetName}' preset`));\n\n // Show model assignments from config\n const modelEntries = Object.entries(config.models);\n for (const [alias, modelConfig] of modelEntries) {\n console.log(chalk.gray(` ${alias}: ${modelConfig.model}`));\n }\n\n console.log(chalk.gray('\\nNext: codemoot plan \"describe your task\"'));\n}\n","// packages/cli/src/commands/install-skills.ts — Install Claude Code skills, agents, hooks, and CLAUDE.md into current project\n\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport chalk from 'chalk';\n\ninterface InstallOptions {\n force: boolean;\n}\n\ninterface SkillFile {\n path: string;\n content: string;\n description: string;\n}\n\nconst SKILLS: SkillFile[] = [\n {\n path: '.claude/skills/codex-review/SKILL.md',\n description: '/codex-review — Get GPT review via Codex CLI',\n content: `---\nname: codex-review\ndescription: Get an independent GPT review via Codex CLI. Use when you want a second opinion on code, plans, or architecture from a different AI model.\nuser-invocable: true\n---\n\n# /codex-review — Get GPT Review via Codex CLI\n\n## Usage\n\\`/codex-review <file, glob, or description of what to review>\\`\n\n## Description\nSends content to GPT via \\`codemoot review\\` for an independent review with session persistence. GPT has full codebase access and reviews are tracked in SQLite. Uses your ChatGPT subscription — zero API cost.\n\n## Instructions\n\nWhen the user invokes \\`/codex-review\\`, follow these steps:\n\n### Step 1: Gather project context\nBefore sending to GPT, gather relevant context so GPT understands the project:\n\n1. Check if \\`CLAUDE.md\\` or \\`README.md\\` exists — read the first 200 lines for project overview\n2. Check if \\`.claude/settings.json\\` or similar config exists\n3. Note the project language, framework, and key patterns\n\nThis context will be included in the prompt to reduce false positives.\n\n### Step 2: Determine review mode\n\n**If the user specifies a file or glob:**\n\\`\\`\\`bash\ncodemoot review <file-or-glob> --focus all\n\\`\\`\\`\n\n**If the user specifies a diff:**\n\\`\\`\\`bash\ncodemoot review --diff HEAD~3..HEAD\n\\`\\`\\`\n\n**If the user gives a freeform description:**\n\\`\\`\\`bash\ncodemoot review --prompt \"PROJECT CONTEXT: <context from step 1>\n\nREVIEW TASK: <user's description>\n\nEvaluate on: Correctness, Completeness, Quality, Security, Feasibility.\nFor security findings, verify by reading the actual code before flagging.\nProvide SCORE: X/10 and VERDICT: APPROVED or NEEDS_REVISION\"\n\\`\\`\\`\n\n**For presets:**\n\\`\\`\\`bash\ncodemoot review <target> --preset security-audit\ncodemoot review <target> --preset quick-scan\ncodemoot review <target> --preset performance\n\\`\\`\\`\n\n### Step 3: Parse and present the output\nThe command outputs JSON to stdout. Parse it and present as clean markdown:\n\n\\`\\`\\`\n## GPT Review Results\n\n**Score**: X/10 | **Verdict**: APPROVED/NEEDS_REVISION\n\n### Findings\n- [CRITICAL] file:line — description\n- [WARNING] file:line — description\n\n### GPT's Full Analysis\n<review text>\n\nSession: <sessionId> | Tokens: <usage> | Duration: <durationMs>ms\n\\`\\`\\`\n\n### Step 4: If NEEDS_REVISION\nAsk if user wants to fix and re-review. If yes:\n1. Fix the issues\n2. Run \\`codemoot review\\` again — session resume gives GPT context of prior review\n3. GPT will check if previous issues were addressed\n\n### Important Notes\n- **Session resume**: Each review builds on prior context. GPT remembers what it reviewed before.\n- **Codebase access**: GPT can read project files during review via codex tools.\n- **No arg size limits**: Content is piped via stdin, not passed as CLI args.\n- **Presets**: Use --preset for specialized reviews (security-audit, performance, quick-scan, pre-commit, api-review).\n- **Background mode**: Add --background to enqueue and continue working.\n`,\n },\n {\n path: '.claude/skills/debate/SKILL.md',\n description: '/debate — Claude vs GPT multi-round debate',\n content: `---\nname: debate\ndescription: Real Claude vs GPT multi-round debate. Use when you need a second opinion, want to debate architecture decisions, or evaluate competing approaches.\nuser-invocable: true\n---\n\n# /debate — Real Claude vs GPT Multi-Round Debate\n\n## Usage\n\\`/debate <topic or question>\\`\n\n## Description\nStructured debate: Claude proposes, GPT critiques, Claude revises, GPT re-evaluates — looping until convergence or max rounds. Real multi-model collaboration via codemoot CLI with session persistence.\n\n## Instructions\n\n### Phase 0: Setup\n1. Parse topic from user's message\n2. Start debate:\n\\`\\`\\`bash\ncodemoot debate start \"TOPIC_HERE\"\n\\`\\`\\`\n3. Save the \\`debateId\\` from JSON output\n4. Announce: \"Entering debate mode: Claude vs GPT\"\n\n### Phase 1: Claude's Opening Proposal\nThink deeply. Generate your genuine proposal. Be thorough and specific.\n\n### Phase 1.5: Gather Codebase Context\nIf topic relates to code, use Grep/Glob/Read to find relevant files. Summarize for GPT.\n\n### Phase 2: Send to GPT\n\\`\\`\\`bash\ncodemoot debate turn DEBATE_ID \"You are a senior technical reviewer debating with Claude about a codebase. You have full access to project files.\n\nDEBATE TOPIC: <topic>\nCODEBASE CONTEXT: <summary>\nCLAUDE'S PROPOSAL: <proposal>\n\nRespond with:\n1. What you agree with\n2. What you disagree with\n3. Suggested improvements\n4. STANCE: SUPPORT, OPPOSE, or UNCERTAIN\" --round N\n\\`\\`\\`\n\n### Phase 3: Check Convergence\n- STANCE: SUPPORT → go to Phase 5\n- Max rounds reached → go to Phase 5\n- Otherwise → Phase 4\n\n### Phase 4: Claude's Revision\nRead GPT's critique. Revise genuinely. Send back to GPT.\n\n### Phase 5: Final Synthesis\n\\`\\`\\`bash\ncodemoot debate complete DEBATE_ID\n\\`\\`\\`\nPresent: final position, agreements, disagreements, stats.\n\n### Rules\n1. Be genuine — don't just agree to end the debate\n2. Session resume is automatic via callWithResume()\n3. State persisted to SQLite\n4. Zero API cost (ChatGPT subscription)\n5. 600s default timeout per turn\n`,\n },\n {\n path: '.claude/skills/build/SKILL.md',\n description: '/build — Autonomous build loop with GPT review',\n content: `---\nname: build\ndescription: Autonomous build loop — debate, plan, implement, review, fix — all in one session with GPT review.\nuser-invocable: true\n---\n\n# /build — Autonomous Build Loop\n\n## Usage\n\\`/build <task description>\\`\n\n## Description\nFull pipeline: debate approach with GPT → user approval → implement → GPT review → fix → re-review until approved. SQLite tracking throughout.\n\n## Instructions\n\n### Phase 0: Initialize\n1. Record user's exact request (acceptance criteria)\n2. \\`codemoot build start \"TASK\"\\`\n3. Save buildId and debateId\n\n### Phase 1: Debate the Approach (MANDATORY)\nUse /debate protocol. Loop until GPT says STANCE: SUPPORT.\n- Gather codebase context first\n- Send detailed implementation plan to GPT\n- Revise on OPPOSE/UNCERTAIN — never skip\n\n### Phase 1.5: User Approval Gate\nPresent agreed plan. Wait for explicit approval via AskUserQuestion.\n\\`\\`\\`bash\ncodemoot build event BUILD_ID plan_approved\ncodemoot debate complete DEBATE_ID\n\\`\\`\\`\n\n### Phase 2: Implement\nWrite code. Run tests: \\`pnpm run test\\`\nNever send broken code to review.\n\\`\\`\\`bash\ncodemoot build event BUILD_ID impl_completed\n\\`\\`\\`\n\n### Phase 3: GPT Review\n\\`\\`\\`bash\ncodemoot build review BUILD_ID\n\\`\\`\\`\nParse verdict: approved → Phase 4.5, needs_revision → Phase 4\n\n### Phase 4: Fix Issues\nFix every CRITICAL and BUG. Run tests. Back to Phase 3.\n\\`\\`\\`bash\ncodemoot build event BUILD_ID fix_completed\n\\`\\`\\`\n\n### Phase 4.5: Completeness Check\nCompare deliverables against original request. Every requirement must be met.\n\n### Phase 5: Done\n\\`\\`\\`bash\ncodemoot build status BUILD_ID\n\\`\\`\\`\nPresent summary with metrics, requirements checklist, GPT verdict.\n\n### Rules\n1. NEVER skip debate rounds\n2. NEVER skip user approval\n3. NEVER declare done without completeness check\n4. Run tests after every implementation/fix\n5. Zero API cost (ChatGPT subscription)\n`,\n },\n {\n path: '.claude/skills/cleanup/SKILL.md',\n description: '/cleanup — Bidirectional AI slop scanner',\n content: `---\nname: cleanup\ndescription: Bidirectional AI slop scanner — Claude + GPT independently analyze, then debate disagreements.\nuser-invocable: true\n---\n\n# /cleanup — Bidirectional AI Slop Scanner\n\n## Usage\n\\`/cleanup [scope]\\` where scope is: deps, unused-exports, hardcoded, duplicates, deadcode, or all\n\n## Description\nClaude analyzes independently, then codemoot cleanup runs deterministic regex + GPT scans. 3-way merge with majority-vote confidence.\n\n## Instructions\n\n### Phase 1: Claude Independent Analysis\nScan the codebase yourself using Grep/Glob/Read. For each scope:\n- **deps**: Check package.json deps against actual imports\n- **unused-exports**: Find exported symbols not imported elsewhere\n- **hardcoded**: Magic numbers, URLs, credentials\n- **duplicates**: Similar function logic across files\n- **deadcode**: Declared but never referenced\n\nSave findings as JSON to a temp file.\n\n### Phase 2: Run codemoot cleanup\n\\`\\`\\`bash\ncodemoot cleanup --scope SCOPE --host-findings /path/to/claude-findings.json\n\\`\\`\\`\n\n### Phase 3: Present merged results\nShow summary: total, high confidence, disputed, adjudicated, by source.\n\n### Phase 4: Rebuttal Round\nFor Claude/GPT disagreements, optionally debate via \\`codemoot debate turn\\`.\n`,\n },\n {\n path: '.claude/agents/codex-liaison.md',\n description: 'Codex Liaison agent — iterates with GPT until 9.5/10',\n content: `# Codex Liaison Agent\n\n## Role\nSpecialized teammate that communicates with GPT via Codex CLI to get independent reviews and iterate until quality reaches 9.5/10.\n\n## How You Work\n1. Send content to GPT via \\`codex exec\\` for review\n2. Parse feedback and score\n3. If score < 9.5: revise and re-submit\n4. Loop until 9.5/10 or max 7 iterations\n5. Report final version back to team lead\n\n## Calling Codex CLI\n\\`\\`\\`bash\ncodex exec --skip-git-repo-check -o \".codex-liaison-output.txt\" \"PROMPT_HERE\"\n\\`\\`\\`\n\n## Important Rules\n- NEVER fabricate GPT's responses\n- NEVER skip iterations if GPT says NEEDS_REVISION\n- Use your own judgment when GPT's feedback conflicts with project requirements\n- 9.5/10 threshold is strict\n`,\n },\n];\n\nconst CLAUDE_MD_SECTION = `\n## CodeMoot — Multi-Model Collaboration\n\nThis project uses [CodeMoot](https://github.com/katarmal-ram/codemoot) for Claude + GPT collaboration. CodeMoot bridges Claude Code and Codex CLI so they work as partners — one plans, the other reviews.\n\n### How Sessions Work\n- Every \\`codemoot\\` command uses a **unified session** with GPT via Codex CLI\n- Sessions persist across commands — GPT remembers prior reviews, debates, and fixes\n- Sessions are stored in \\`.cowork/db/cowork.db\\` (SQLite)\n- When a session's token budget fills up, it auto-rolls to a new thread\n- Run \\`codemoot session current\\` to see the active session\n\n### Available Commands (use these, not raw codex)\n- \\`codemoot review <file-or-dir>\\` — GPT reviews code with codebase access\n- \\`codemoot review --prompt \"question\"\\` — GPT explores codebase to answer\n- \\`codemoot review --diff HEAD~3..HEAD\\` — Review git changes\n- \\`codemoot review --preset security-audit\\` — Specialized review presets\n- \\`codemoot fix <file>\\` — Autofix loop: review → apply fixes → re-review\n- \\`codemoot debate start \"topic\"\\` — Multi-round Claude vs GPT debate\n- \\`codemoot cleanup\\` — Scan for unused deps, dead code, duplicates\n- \\`codemoot shipit --profile safe\\` — Composite workflow (lint+test+review)\n- \\`codemoot cost\\` — Token usage dashboard\n- \\`codemoot doctor\\` — Check prerequisites\n\n### Slash Commands\n- \\`/codex-review\\` — Quick GPT review (uses codemoot review internally)\n- \\`/debate\\` — Start a Claude vs GPT debate\n- \\`/build\\` — Full build loop: debate → plan → implement → GPT review → fix\n- \\`/cleanup\\` — Bidirectional AI slop scanner\n\n### When to Use CodeMoot\n- After implementing a feature → \\`codemoot review src/\\`\n- Before committing → \\`codemoot review --diff HEAD --preset pre-commit\\`\n- Architecture decisions → \\`/debate \"REST vs GraphQL?\"\\`\n- Full feature build → \\`/build \"add user authentication\"\\`\n- After shipping → \\`codemoot shipit --profile safe\\`\n\n### Session Tips\n- Sessions auto-resume — GPT retains context from prior commands\n- \\`codemoot session list\\` shows all sessions with token usage\n- \\`codemoot cost --scope session\\` shows current session spend\n- Start fresh with \\`codemoot session start --name \"new-feature\"\\`\n`;\n\nconst HOOKS_CONFIG = {\n hooks: {\n PostToolUse: [\n {\n matcher: 'Bash',\n pattern: 'git commit',\n command: 'echo \"Tip: Run codemoot review --diff HEAD~1 for a GPT review of this commit\"',\n },\n ],\n },\n};\n\nexport async function installSkillsCommand(options: InstallOptions): Promise<void> {\n const cwd = process.cwd();\n let installed = 0;\n let skipped = 0;\n\n console.error(chalk.cyan('\\n Installing CodeMoot integration for Claude Code\\n'));\n\n // ── 1. Install skill files ──\n console.error(chalk.dim(' Skills & Agents:'));\n for (const skill of SKILLS) {\n const fullPath = join(cwd, skill.path);\n const dir = dirname(fullPath);\n\n if (existsSync(fullPath) && !options.force) {\n console.error(chalk.dim(` SKIP ${skill.path} (exists)`));\n skipped++;\n continue;\n }\n\n mkdirSync(dir, { recursive: true });\n writeFileSync(fullPath, skill.content, 'utf-8');\n console.error(chalk.green(` OK ${skill.path}`));\n installed++;\n }\n\n // ── 2. Append CodeMoot section to CLAUDE.md ──\n console.error('');\n console.error(chalk.dim(' CLAUDE.md:'));\n const claudeMdPath = join(cwd, 'CLAUDE.md');\n const marker = '## CodeMoot — Multi-Model Collaboration';\n\n if (existsSync(claudeMdPath)) {\n const existing = readFileSync(claudeMdPath, 'utf-8');\n if (existing.includes(marker)) {\n if (options.force) {\n // Replace existing section, preserving content after it\n const markerIdx = existing.indexOf(marker);\n const before = existing.slice(0, markerIdx);\n // Find the next top-level heading (## ) after our section, or end of file\n const afterMarker = existing.slice(markerIdx + marker.length);\n // Find next heading at any level (# or ##) that isn't part of our section\n const nextHeadingMatch = afterMarker.match(/\\n#{1,2} (?!#)(?!CodeMoot)/);\n const after = nextHeadingMatch ? afterMarker.slice(nextHeadingMatch.index as number) : '';\n writeFileSync(claudeMdPath, before.trimEnd() + '\\n' + CLAUDE_MD_SECTION + after, 'utf-8');\n console.error(chalk.green(' OK CLAUDE.md (updated CodeMoot section)'));\n installed++;\n } else {\n console.error(chalk.dim(' SKIP CLAUDE.md (CodeMoot section exists)'));\n skipped++;\n }\n } else {\n // Append section\n writeFileSync(claudeMdPath, existing.trimEnd() + '\\n' + CLAUDE_MD_SECTION, 'utf-8');\n console.error(chalk.green(' OK CLAUDE.md (appended CodeMoot section)'));\n installed++;\n }\n } else {\n writeFileSync(claudeMdPath, `# Project Instructions\\n${CLAUDE_MD_SECTION}`, 'utf-8');\n console.error(chalk.green(' OK CLAUDE.md (created with CodeMoot section)'));\n installed++;\n }\n\n // ── 3. Install hooks config ──\n console.error('');\n console.error(chalk.dim(' Hooks:'));\n const settingsDir = join(cwd, '.claude');\n const settingsPath = join(settingsDir, 'settings.json');\n\n if (existsSync(settingsPath)) {\n try {\n const existing = JSON.parse(readFileSync(settingsPath, 'utf-8'));\n const hasCodemootHook = Array.isArray(existing.hooks?.PostToolUse) &&\n existing.hooks.PostToolUse.some((h: { command?: string }) => h.command?.includes('codemoot'));\n if (hasCodemootHook && !options.force) {\n console.error(chalk.dim(' SKIP .claude/settings.json (codemoot hook exists)'));\n skipped++;\n } else {\n // Merge: keep existing hooks, add/replace codemoot hook\n const otherHooks = Array.isArray(existing.hooks?.PostToolUse)\n ? existing.hooks.PostToolUse.filter((h: { command?: string }) => !h.command?.includes('codemoot'))\n : [];\n existing.hooks = {\n ...existing.hooks,\n PostToolUse: [...otherHooks, ...HOOKS_CONFIG.hooks.PostToolUse],\n };\n writeFileSync(settingsPath, JSON.stringify(existing, null, 2), 'utf-8');\n console.error(chalk.green(' OK .claude/settings.json (added post-commit hint hook)'));\n installed++;\n }\n } catch (err) {\n console.error(chalk.yellow(` WARN .claude/settings.json parse error: ${(err as Error).message}`));\n console.error(chalk.yellow(' Back up and delete the file, then re-run install-skills'));\n skipped++;\n }\n } else {\n mkdirSync(settingsDir, { recursive: true });\n writeFileSync(settingsPath, JSON.stringify(HOOKS_CONFIG, null, 2), 'utf-8');\n console.error(chalk.green(' OK .claude/settings.json (created with post-commit hook)'));\n installed++;\n }\n\n // ── Summary ──\n console.error('');\n console.error(chalk.cyan(` Installed: ${installed}, Skipped: ${skipped}`));\n console.error('');\n console.error(chalk.dim(' Slash commands: /codex-review, /debate, /build, /cleanup'));\n console.error(chalk.dim(' CLAUDE.md: Claude now knows about codemoot commands & sessions'));\n console.error(chalk.dim(' Hook: Post-commit hint to run codemoot review'));\n console.error('');\n\n const output = {\n installed,\n skipped,\n total: SKILLS.length + 2, // +CLAUDE.md +hooks\n skills: SKILLS.map(s => ({ path: s.path, description: s.description })),\n };\n console.log(JSON.stringify(output, null, 2));\n}\n","// packages/cli/src/commands/session.ts — Unified session CLI commands\n\nimport { SessionManager } from '@codemoot/core';\nimport chalk from 'chalk';\n\nimport { withDatabase } from '../utils.js';\n\n// ── codemoot session start ──\n\ninterface StartOptions {\n name?: string;\n}\n\nexport async function sessionStartCommand(options: StartOptions): Promise<void> {\n await withDatabase(async (db) => {\n const mgr = new SessionManager(db);\n const id = mgr.create(options.name);\n const session = mgr.get(id);\n\n mgr.recordEvent({\n sessionId: id,\n command: 'session',\n subcommand: 'start',\n promptPreview: `Session started: ${session?.name ?? id}`,\n });\n\n console.log(JSON.stringify({\n sessionId: id,\n name: session?.name ?? null,\n status: 'active',\n message: 'Session created. All GPT commands will now use this session.',\n }, null, 2));\n });\n}\n\n// ── codemoot session current ──\n\nexport async function sessionCurrentCommand(): Promise<void> {\n await withDatabase(async (db) => {\n const mgr = new SessionManager(db);\n const session = mgr.getActive();\n if (!session) {\n console.log(JSON.stringify({ active: false, message: 'No active session. Run \"codemoot session start\" to create one.' }));\n return;\n }\n\n const events = mgr.getEvents(session.id, 5);\n const overflow = mgr.getOverflowStatus(session.id);\n\n console.log(JSON.stringify({\n sessionId: session.id,\n name: session.name,\n codexThreadId: session.codexThreadId,\n status: session.status,\n tokenBudget: {\n used: overflow.cumulativeTokens,\n lastTurnInput: overflow.lastTurnInputTokens,\n max: overflow.maxContext,\n utilization: `${Math.round(overflow.utilizationRatio * 100)}%`,\n },\n recentEvents: events.map(e => ({\n command: e.command,\n subcommand: e.subcommand,\n durationMs: e.durationMs,\n createdAt: new Date(e.createdAt).toISOString(),\n })),\n createdAt: new Date(session.createdAt).toISOString(),\n updatedAt: new Date(session.updatedAt).toISOString(),\n }, null, 2));\n });\n}\n\n// ── codemoot session list ──\n\ninterface ListOptions {\n status?: string;\n limit?: number;\n}\n\nexport async function sessionListCommand(options: ListOptions): Promise<void> {\n await withDatabase(async (db) => {\n const mgr = new SessionManager(db);\n const sessions = mgr.list({\n status: options.status,\n limit: options.limit ?? 20,\n });\n\n const output = sessions.map(s => ({\n sessionId: s.id,\n name: s.name,\n status: s.status,\n codexThreadId: s.codexThreadId ? `${s.codexThreadId.slice(0, 12)}...` : null,\n tokenUsage: s.tokenUsage,\n createdAt: new Date(s.createdAt).toISOString(),\n updatedAt: new Date(s.updatedAt).toISOString(),\n }));\n\n console.log(JSON.stringify(output, null, 2));\n });\n}\n\n// ── codemoot session status ──\n\nexport async function sessionStatusCommand(sessionId: string): Promise<void> {\n await withDatabase(async (db) => {\n const mgr = new SessionManager(db);\n const session = mgr.get(sessionId);\n if (!session) {\n console.error(chalk.red(`No session found with ID: ${sessionId}`));\n process.exit(1);\n }\n\n const events = mgr.getEvents(sessionId, 20);\n const overflow = mgr.getOverflowStatus(sessionId);\n\n console.log(JSON.stringify({\n sessionId: session.id,\n name: session.name,\n codexThreadId: session.codexThreadId,\n status: session.status,\n tokenBudget: {\n used: overflow.cumulativeTokens,\n lastTurnInput: overflow.lastTurnInputTokens,\n max: overflow.maxContext,\n utilization: `${Math.round(overflow.utilizationRatio * 100)}%`,\n shouldWarn: overflow.shouldWarn,\n shouldReconstruct: overflow.shouldReconstruct,\n },\n eventCount: events.length,\n events: events.map(e => ({\n command: e.command,\n subcommand: e.subcommand,\n promptPreview: e.promptPreview,\n responsePreview: e.responsePreview,\n durationMs: e.durationMs,\n createdAt: new Date(e.createdAt).toISOString(),\n })),\n createdAt: new Date(session.createdAt).toISOString(),\n updatedAt: new Date(session.updatedAt).toISOString(),\n completedAt: session.completedAt ? new Date(session.completedAt).toISOString() : null,\n }, null, 2));\n });\n}\n\n// ── codemoot session close ──\n\nexport async function sessionCloseCommand(sessionId: string): Promise<void> {\n await withDatabase(async (db) => {\n const mgr = new SessionManager(db);\n const session = mgr.get(sessionId);\n if (!session) {\n console.error(chalk.red(`No session found with ID: ${sessionId}`));\n process.exit(1);\n }\n\n mgr.complete(sessionId);\n console.log(JSON.stringify({ sessionId, status: 'completed' }));\n });\n}\n","// packages/cli/src/commands/jobs.ts — Background job queue CLI commands\n\nimport { JobStore, openDatabase } from '@codemoot/core';\nimport type { JobStatus, JobType } from '@codemoot/core';\nimport chalk from 'chalk';\n\nimport { getDbPath } from '../utils.js';\n\n// ── codemoot jobs list ──\n\ninterface ListOptions {\n status?: string;\n type?: string;\n limit?: number;\n}\n\nexport async function jobsListCommand(options: ListOptions): Promise<void> {\n let db: ReturnType<typeof openDatabase> | undefined;\n try {\n db = openDatabase(getDbPath());\n const store = new JobStore(db);\n\n const jobs = store.list({\n status: options.status as JobStatus | undefined,\n type: options.type as JobType | undefined,\n limit: options.limit ?? 20,\n });\n\n const output = jobs.map(j => ({\n id: j.id,\n type: j.type,\n status: j.status,\n priority: j.priority,\n retryCount: j.retryCount,\n workerId: j.workerId,\n createdAt: new Date(j.createdAt).toISOString(),\n startedAt: j.startedAt ? new Date(j.startedAt).toISOString() : null,\n finishedAt: j.finishedAt ? new Date(j.finishedAt).toISOString() : null,\n }));\n\n console.log(JSON.stringify(output, null, 2));\n db.close();\n } catch (error) {\n db?.close();\n console.error(chalk.red(`Error: ${error instanceof Error ? error.message : String(error)}`));\n process.exit(1);\n }\n}\n\n// ── codemoot jobs logs ──\n\ninterface LogsOptions {\n fromSeq?: number;\n limit?: number;\n}\n\nexport async function jobsLogsCommand(jobId: string, options: LogsOptions): Promise<void> {\n let db: ReturnType<typeof openDatabase> | undefined;\n try {\n db = openDatabase(getDbPath());\n const store = new JobStore(db);\n\n const job = store.get(jobId);\n if (!job) {\n console.error(chalk.red(`No job found with ID: ${jobId}`));\n db.close();\n process.exit(1);\n }\n\n const logs = store.getLogs(jobId, options.fromSeq ?? 0, options.limit ?? 100);\n\n const output = {\n jobId: job.id,\n type: job.type,\n status: job.status,\n logs: logs.map(l => ({\n seq: l.seq,\n level: l.level,\n event: l.eventType,\n message: l.message,\n time: new Date(l.createdAt).toISOString(),\n })),\n };\n\n console.log(JSON.stringify(output, null, 2));\n db.close();\n } catch (error) {\n db?.close();\n console.error(chalk.red(`Error: ${error instanceof Error ? error.message : String(error)}`));\n process.exit(1);\n }\n}\n\n// ── codemoot jobs cancel ──\n\nexport async function jobsCancelCommand(jobId: string): Promise<void> {\n let db: ReturnType<typeof openDatabase> | undefined;\n try {\n db = openDatabase(getDbPath());\n const store = new JobStore(db);\n\n const job = store.get(jobId);\n if (!job) {\n console.error(chalk.red(`No job found with ID: ${jobId}`));\n db.close();\n process.exit(1);\n }\n\n store.cancel(jobId);\n console.log(JSON.stringify({ jobId, status: 'canceled' }));\n db.close();\n } catch (error) {\n db?.close();\n console.error(chalk.red(`Error: ${error instanceof Error ? error.message : String(error)}`));\n process.exit(1);\n }\n}\n\n// ── codemoot jobs retry ──\n\nexport async function jobsRetryCommand(jobId: string): Promise<void> {\n let db: ReturnType<typeof openDatabase> | undefined;\n try {\n db = openDatabase(getDbPath());\n const store = new JobStore(db);\n\n const job = store.get(jobId);\n if (!job) {\n console.error(chalk.red(`No job found with ID: ${jobId}`));\n db.close();\n process.exit(1);\n }\n\n const retried = store.retry(jobId);\n if (!retried) {\n console.error(chalk.red(`Cannot retry job ${jobId}: status=${job.status}, retries=${job.retryCount}/${job.maxRetries}`));\n db.close();\n process.exit(1);\n }\n\n console.log(JSON.stringify({ jobId, status: 'queued', retryCount: job.retryCount + 1 }));\n db.close();\n } catch (error) {\n db?.close();\n console.error(chalk.red(`Error: ${error instanceof Error ? error.message : String(error)}`));\n process.exit(1);\n }\n}\n\n// ── codemoot jobs status ──\n\nexport async function jobsStatusCommand(jobId: string): Promise<void> {\n let db: ReturnType<typeof openDatabase> | undefined;\n try {\n db = openDatabase(getDbPath());\n const store = new JobStore(db);\n\n const job = store.get(jobId);\n if (!job) {\n console.error(chalk.red(`No job found with ID: ${jobId}`));\n db.close();\n process.exit(1);\n }\n\n const logs = store.getLogs(jobId, 0, 5);\n\n const output = {\n id: job.id,\n type: job.type,\n status: job.status,\n priority: job.priority,\n retryCount: job.retryCount,\n maxRetries: job.maxRetries,\n workerId: job.workerId,\n sessionId: job.sessionId,\n payload: JSON.parse(job.payloadJson),\n result: job.resultJson ? JSON.parse(job.resultJson) : null,\n error: job.errorText,\n recentLogs: logs.map(l => ({\n seq: l.seq,\n level: l.level,\n event: l.eventType,\n message: l.message,\n })),\n createdAt: new Date(job.createdAt).toISOString(),\n startedAt: job.startedAt ? new Date(job.startedAt).toISOString() : null,\n finishedAt: job.finishedAt ? new Date(job.finishedAt).toISOString() : null,\n };\n\n console.log(JSON.stringify(output, null, 2));\n db.close();\n } catch (error) {\n db?.close();\n console.error(chalk.red(`Error: ${error instanceof Error ? error.message : String(error)}`));\n process.exit(1);\n }\n}\n","import { writeFileSync } from 'node:fs';\n\nimport { ModelRegistry, Orchestrator, loadConfig, openDatabase } from '@codemoot/core';\nimport chalk from 'chalk';\n\nimport { printSessionSummary, renderEvent } from '../render.js';\nimport { getDbPath } from '../utils.js';\n\ninterface PlanOptions {\n rounds?: number;\n output?: string;\n}\n\nexport async function planCommand(task: string, options: PlanOptions): Promise<void> {\n try {\n const config = loadConfig();\n const projectDir = process.cwd();\n const registry = ModelRegistry.fromConfig(config, projectDir);\n\n const health = await registry.healthCheckAll();\n for (const [alias, hasKey] of health) {\n if (!hasKey) {\n console.warn(chalk.yellow(`Warning: No API key for model \"${alias}\"`));\n }\n }\n\n const dbPath = getDbPath();\n const db = openDatabase(dbPath);\n\n const orchestrator = new Orchestrator({ registry, db, config });\n orchestrator.on('event', (event) => renderEvent(event, config));\n\n const result = await orchestrator.plan(task, {\n maxRounds: options.rounds,\n });\n\n // Save to file if requested\n if (options.output) {\n writeFileSync(options.output, result.finalOutput, 'utf-8');\n console.log(chalk.green(`Plan saved to ${options.output}`));\n }\n\n printSessionSummary(result);\n\n db.close();\n process.exit(result.status === 'completed' ? 0 : 2);\n } catch (error) {\n console.error(chalk.red(`Error: ${error instanceof Error ? error.message : String(error)}`));\n process.exit(1);\n }\n}\n","// packages/cli/src/render.ts — Terminal rendering for AG-UI events\r\n\r\nimport type { EngineEvent, ProjectConfig } from '@codemoot/core';\r\nimport chalk from 'chalk';\r\nimport ora from 'ora';\r\n\r\n// Color scheme per role\r\nconst roleColors: Record<string, (text: string) => string> = {\r\n architect: chalk.blue,\r\n reviewer: chalk.yellow,\r\n implementer: chalk.green,\r\n};\r\n\r\nfunction getRoleColor(role: string): (text: string) => string {\r\n return roleColors[role] ?? chalk.white;\r\n}\r\n\r\n/**\r\n * Render a single AG-UI event to the terminal.\r\n */\r\nexport function renderEvent(event: EngineEvent, _config?: ProjectConfig): void {\r\n switch (event.type) {\r\n case 'session.started':\r\n console.log(chalk.gray(`\\n━━━ Session ${event.sessionId} ━━━`));\r\n console.log(chalk.gray(`Workflow: ${event.workflow}`));\r\n console.log(chalk.gray(`Task: ${event.task}\\n`));\r\n break;\r\n\r\n case 'session.completed':\r\n console.log(chalk.green('\\n━━━ Session Complete ━━━'));\r\n console.log(chalk.cyan(` Cost: $${event.totalCost.toFixed(4)}`));\r\n console.log(chalk.cyan(` Tokens: ${event.totalTokens.toLocaleString()}`));\r\n console.log(chalk.cyan(` Duration: ${(event.durationMs / 1000).toFixed(1)}s`));\r\n break;\r\n\r\n case 'session.failed':\r\n console.log(chalk.red('\\n━━━ Session Failed ━━━'));\r\n console.log(chalk.red(` Error: ${event.error}`));\r\n console.log(chalk.red(` Last step: ${event.lastStep}`));\r\n break;\r\n\r\n case 'step.started': {\r\n const color = getRoleColor(event.role);\r\n console.log(\r\n color(`\\n▶ [${event.role}] ${event.stepId} (${event.model}, iter ${event.iteration})`),\r\n );\r\n break;\r\n }\r\n\r\n case 'step.completed':\r\n console.log(\r\n chalk.gray(\r\n ` ✓ ${event.stepId} (${(event.durationMs / 1000).toFixed(1)}s, ${event.tokenUsage.totalTokens} tokens)`,\r\n ),\r\n );\r\n break;\r\n\r\n case 'step.failed':\r\n console.log(chalk.red(` ✗ ${event.stepId}: ${event.error}`));\r\n break;\r\n\r\n case 'text.delta': {\r\n const deltaColor = getRoleColor(event.role);\r\n process.stdout.write(deltaColor(event.delta));\r\n break;\r\n }\r\n\r\n case 'text.done':\r\n process.stdout.write('\\n');\r\n break;\r\n\r\n case 'loop.iteration': {\r\n const verdictColor = event.verdict === 'approved' ? chalk.green : chalk.yellow;\r\n console.log(\r\n verdictColor(`\\n ↻ Loop ${event.iteration}/${event.maxIterations}: ${event.verdict}`),\r\n );\r\n if (event.feedback) {\r\n console.log(chalk.gray(` Feedback: ${event.feedback.slice(0, 200)}...`));\r\n }\r\n break;\r\n }\r\n\r\n case 'cost.update':\r\n console.log(\r\n chalk.cyan(\r\n ` $${event.costUsd.toFixed(4)} (cumulative: $${event.cumulativeSessionCost.toFixed(4)})`,\r\n ),\r\n );\r\n break;\r\n }\r\n}\r\n\r\n// Spinner helpers for step lifecycle\r\nlet activeSpinner: ReturnType<typeof ora> | null = null;\r\n\r\nexport function startStepSpinner(stepId: string, role: string, model: string): void {\r\n const color = getRoleColor(role);\r\n activeSpinner = ora({\r\n text: color(`${role} working on ${stepId} (${model})...`),\r\n color: role === 'architect' ? 'blue' : role === 'reviewer' ? 'yellow' : 'green',\r\n }).start();\r\n}\r\n\r\nexport function stopStepSpinner(success: boolean): void {\r\n if (activeSpinner) {\r\n if (success) {\r\n activeSpinner.succeed();\r\n } else {\r\n activeSpinner.fail();\r\n }\r\n activeSpinner = null;\r\n }\r\n}\r\n\r\n/**\r\n * Print a final session summary with formatted output.\r\n */\r\nexport function printSessionSummary(result: {\r\n sessionId: string;\r\n status: string;\r\n totalCost: number;\r\n totalTokens: number;\r\n durationMs: number;\r\n iterations: number;\r\n}): void {\r\n console.log(chalk.bold('\\nSession Summary'));\r\n console.log(chalk.gray('-'.repeat(40)));\r\n console.log(` Session: ${chalk.white(result.sessionId)}`);\r\n console.log(\r\n ` Status: ${result.status === 'completed' ? chalk.green('completed') : chalk.red(result.status)}`,\r\n );\r\n console.log(` Cost: ${chalk.cyan(`$${result.totalCost.toFixed(4)}`)}`);\r\n console.log(` Tokens: ${chalk.cyan(result.totalTokens.toLocaleString())}`);\r\n console.log(` Duration: ${chalk.cyan(`${(result.durationMs / 1000).toFixed(1)}s`)}`);\r\n console.log(` Iterations: ${chalk.cyan(String(result.iterations))}`);\r\n console.log(chalk.gray('-'.repeat(40)));\r\n}\r\n","// packages/cli/src/commands/review.ts — unified review via codex: files, prompts, diffs + session continuity\r\n\r\nimport { loadConfig, ModelRegistry, BINARY_SNIFF_BYTES, REVIEW_DIFF_MAX_CHARS, SessionManager, JobStore, openDatabase, buildHandoffEnvelope, getReviewPreset, type CliAdapter } from '@codemoot/core';\r\nimport chalk from 'chalk';\r\nimport { execFileSync, execSync } from 'node:child_process';\r\nimport { closeSync, globSync, openSync, readFileSync, readSync, statSync, existsSync } from 'node:fs';\r\nimport { resolve } from 'node:path';\r\n\r\nimport { createProgressCallbacks } from '../progress.js';\r\nimport { getDbPath } from '../utils.js';\r\n\r\nconst MAX_FILE_SIZE = 100 * 1024; // 100KB per file\r\nconst MAX_TOTAL_SIZE = 200 * 1024; // 200KB total content\r\n\r\ninterface ReviewOptions {\r\n focus?: string;\r\n timeout?: number;\r\n session?: string;\r\n prompt?: string;\r\n stdin?: boolean;\r\n diff?: string;\r\n scope?: string;\r\n preset?: string;\r\n background?: boolean;\r\n}\r\n\r\nexport async function reviewCommand(fileOrGlob: string | undefined, options: ReviewOptions): Promise<void> {\r\n try {\r\n const projectDir = process.cwd();\r\n\r\n // ── Validate input modes: exactly one of file-or-glob, --prompt, --stdin, --diff ──\r\n const modes = [\r\n fileOrGlob ? 'file' : '',\r\n options.prompt ? 'prompt' : '',\r\n options.stdin ? 'stdin' : '',\r\n options.diff ? 'diff' : '',\r\n ].filter(Boolean);\r\n\r\n if (modes.length === 0) {\r\n console.error(chalk.red('No input specified. Use: <file-or-glob>, --prompt, --stdin, or --diff'));\r\n process.exit(1);\r\n }\r\n if (modes.length > 1) {\r\n console.error(chalk.red(`Conflicting input modes: ${modes.join(', ')}. Use exactly one.`));\r\n process.exit(1);\r\n }\r\n\r\n if (options.scope && !options.prompt && !options.stdin) {\r\n console.error(chalk.red('--scope can only be used with --prompt or --stdin'));\r\n process.exit(1);\r\n }\r\n\r\n const config = loadConfig();\r\n const registry = ModelRegistry.fromConfig(config, projectDir);\r\n const adapter = registry.tryGetAdapter('codex-reviewer') ?? registry.tryGetAdapter('codex-architect');\r\n\r\n if (!adapter) {\r\n // Check if codex CLI is actually installed\r\n try {\r\n execSync('codex --version', { stdio: 'pipe', encoding: 'utf-8' });\r\n } catch {\r\n console.error(chalk.red('Codex CLI is not installed or not in PATH.'));\r\n console.error(chalk.yellow('Install it: npm install -g @openai/codex'));\r\n console.error(chalk.yellow('Then run: codemoot init'));\r\n process.exit(1);\r\n }\r\n console.error(chalk.red('No codex adapter found in config. Run: codemoot init'));\r\n console.error(chalk.dim('Diagnose: codemoot doctor'));\r\n process.exit(1);\r\n }\r\n\r\n // ── Background mode: enqueue and return immediately ──\r\n if (options.background) {\r\n const db = openDatabase(getDbPath());\r\n const jobStore = new JobStore(db);\r\n const jobId = jobStore.enqueue({\r\n type: 'review',\r\n payload: {\r\n fileOrGlob: fileOrGlob ?? null,\r\n focus: options.focus,\r\n timeout: options.timeout,\r\n prompt: options.prompt,\r\n stdin: options.stdin,\r\n diff: options.diff,\r\n scope: options.scope,\r\n cwd: projectDir,\r\n },\r\n });\r\n console.log(JSON.stringify({ jobId, status: 'queued', message: 'Review enqueued. Check with: codemoot jobs status ' + jobId }));\r\n db.close();\r\n return;\r\n }\r\n\r\n // Resolve unified session\r\n const db = openDatabase(getDbPath());\r\n const sessionMgr = new SessionManager(db);\r\n const session = options.session\r\n ? sessionMgr.get(options.session)\r\n : sessionMgr.resolveActive('review');\r\n\r\n if (!session) {\r\n console.error(chalk.red(options.session\r\n ? `Session not found: ${options.session}`\r\n : 'No active session. Run: codemoot init'));\r\n db.close();\r\n process.exit(1);\r\n }\r\n\r\n // Check overflow — auto-rollover if needed\r\n const overflowCheck = sessionMgr.preCallOverflowCheck(session.id);\r\n if (overflowCheck.rolled) {\r\n console.error(chalk.yellow(` ${overflowCheck.message}`));\r\n }\r\n\r\n // ── Resolve preset (overrides focus/timeout if set) ──\r\n const preset = options.preset ? getReviewPreset(options.preset) : undefined;\r\n if (options.preset && !preset) {\r\n console.error(chalk.red(`Unknown preset: ${options.preset}. Use: security-audit, performance, quick-scan, pre-commit, api-review`));\r\n db.close();\r\n process.exit(1);\r\n }\r\n\r\n // ── Build prompt based on input mode ──\r\n const focusArea = preset?.focus ?? options.focus ?? 'all';\r\n const focusConstraint = focusArea === 'all'\r\n ? 'Review for: correctness, bugs, security, performance, code quality'\r\n : `Focus specifically on: ${focusArea}`;\r\n const presetConstraints = preset?.constraints ?? [];\r\n\r\n const currentSession = sessionMgr.get(session.id);\r\n const sessionThreadId = currentSession?.codexThreadId ?? undefined;\r\n const isResumed = Boolean(sessionThreadId);\r\n\r\n let prompt: string;\r\n let promptPreview: string;\r\n const mode = modes[0];\r\n\r\n if (mode === 'prompt' || mode === 'stdin') {\r\n // ── Prompt mode: codex explores codebase via tools ──\r\n let instruction = options.prompt ?? '';\r\n if (mode === 'stdin') {\r\n const chunks: Buffer[] = [];\r\n for await (const chunk of process.stdin) {\r\n chunks.push(chunk as Buffer);\r\n }\r\n instruction = Buffer.concat(chunks).toString('utf-8').trim();\r\n if (!instruction) {\r\n console.error(chalk.red('No input received from stdin'));\r\n db.close();\r\n process.exit(1);\r\n }\r\n }\r\n\r\n prompt = buildHandoffEnvelope({\r\n command: 'review',\r\n task: `TASK: ${instruction}\\n\\nStart by listing candidate files, then inspect them thoroughly.`,\r\n constraints: [focusConstraint, ...presetConstraints],\r\n scope: options.scope,\r\n resumed: isResumed,\r\n });\r\n\r\n promptPreview = `Prompt review: ${instruction.slice(0, 100)}`;\r\n console.error(chalk.cyan(`Reviewing via prompt (session: ${session.id.slice(0, 8)}...)...`));\r\n\r\n } else if (mode === 'diff') {\r\n // ── Diff mode: review git changes ──\r\n let diff: string;\r\n try {\r\n diff = execFileSync('git', ['diff', '--', ...(options.diff as string).split(/\\s+/)], {\r\n cwd: projectDir,\r\n encoding: 'utf-8',\r\n maxBuffer: 1024 * 1024,\r\n });\r\n } catch (err) {\r\n console.error(chalk.red(`Failed to get diff for ${options.diff}: ${err instanceof Error ? err.message : String(err)}`));\r\n db.close();\r\n process.exit(1);\r\n }\r\n\r\n if (!diff.trim()) {\r\n console.error(chalk.yellow(`No changes in diff: ${options.diff}`));\r\n db.close();\r\n process.exit(0);\r\n }\r\n\r\n prompt = buildHandoffEnvelope({\r\n command: 'review',\r\n task: `Review the following code changes.\\n\\nGIT DIFF (${options.diff}):\\n${diff.slice(0, REVIEW_DIFF_MAX_CHARS)}`,\r\n constraints: [focusConstraint, ...presetConstraints],\r\n resumed: isResumed,\r\n });\r\n\r\n promptPreview = `Diff review: ${options.diff}`;\r\n console.error(chalk.cyan(`Reviewing diff ${options.diff} (session: ${session.id.slice(0, 8)}...)...`));\r\n\r\n } else {\r\n // ── File mode (original behavior) ──\r\n // If input is a directory, auto-expand to recursive glob\r\n let globPattern = fileOrGlob as string;\r\n const resolvedInput = resolve(projectDir, globPattern);\r\n if (existsSync(resolvedInput) && statSync(resolvedInput).isDirectory()) {\r\n globPattern = `${globPattern}/**/*`;\r\n console.error(chalk.dim(` Expanding directory to: ${globPattern}`));\r\n }\r\n const projectRoot = resolve(projectDir) + (process.platform === 'win32' ? '\\\\' : '/');\r\n const paths = globSync(globPattern, { cwd: projectDir })\r\n .map(p => resolve(projectDir, p))\r\n .filter(p => p.startsWith(projectRoot) || p === resolve(projectDir));\r\n if (paths.length === 0) {\r\n console.error(chalk.red(`No files matched: ${fileOrGlob}`));\r\n db.close();\r\n process.exit(1);\r\n }\r\n\r\n const files: { path: string; content: string }[] = [];\r\n let totalSize = 0;\r\n\r\n for (const filePath of paths) {\r\n const stat = statSync(filePath);\r\n if (!stat.isFile()) continue;\r\n if (stat.size > MAX_FILE_SIZE) {\r\n console.error(chalk.yellow(`Skipping ${filePath} (${(stat.size / 1024).toFixed(0)}KB > 100KB limit)`));\r\n continue;\r\n }\r\n if (totalSize + stat.size > MAX_TOTAL_SIZE) {\r\n console.error(chalk.yellow(`Skipping remaining files (total would exceed 200KB)`));\r\n break;\r\n }\r\n\r\n const buf = Buffer.alloc(BINARY_SNIFF_BYTES);\r\n const fd = openSync(filePath, 'r');\r\n const bytesRead = readSync(fd, buf, 0, BINARY_SNIFF_BYTES, 0);\r\n closeSync(fd);\r\n if (buf.subarray(0, bytesRead).includes(0)) {\r\n console.error(chalk.yellow(`Skipping ${filePath} (binary file)`));\r\n continue;\r\n }\r\n\r\n const content = readFileSync(filePath, 'utf-8');\r\n const relativePath = filePath.replace(projectDir, '').replace(/\\\\/g, '/').replace(/^\\//, '');\r\n files.push({ path: relativePath, content });\r\n totalSize += stat.size;\r\n }\r\n\r\n if (files.length === 0) {\r\n console.error(chalk.red('No readable files to review'));\r\n db.close();\r\n process.exit(1);\r\n }\r\n\r\n const fileContents = files.map(f => `--- ${f.path} ---\\n${f.content}`).join('\\n\\n');\r\n\r\n prompt = buildHandoffEnvelope({\r\n command: 'review',\r\n task: `Review the following code files.\\n\\nFILES TO REVIEW:\\n${fileContents}`,\r\n constraints: [focusConstraint, ...presetConstraints],\r\n resumed: isResumed,\r\n });\r\n\r\n promptPreview = `Review ${files.length} file(s): ${files.map(f => f.path).join(', ')}`;\r\n console.error(chalk.cyan(`Reviewing ${files.length} file(s) via codex (session: ${session.id.slice(0, 8)}...)...`));\r\n }\r\n\r\n // ── Execute review via codex with session resume ──\r\n const timeoutMs = (options.timeout ?? 600) * 1000;\r\n const progress = createProgressCallbacks('review');\r\n\r\n const result = await (adapter as CliAdapter).callWithResume(prompt, {\r\n sessionId: sessionThreadId,\r\n timeout: timeoutMs,\r\n ...progress,\r\n });\r\n\r\n // Update session\r\n if (result.sessionId) {\r\n sessionMgr.updateThreadId(session.id, result.sessionId);\r\n }\r\n sessionMgr.addUsageFromResult(session.id, result.usage, prompt, result.text);\r\n\r\n sessionMgr.recordEvent({\r\n sessionId: session.id,\r\n command: 'review',\r\n subcommand: mode,\r\n promptPreview: promptPreview.slice(0, 500),\r\n responsePreview: result.text.slice(0, 500),\r\n promptFull: prompt,\r\n responseFull: result.text,\r\n usageJson: JSON.stringify(result.usage),\r\n durationMs: result.durationMs,\r\n codexThreadId: result.sessionId,\r\n });\r\n\r\n // ── Parse findings ──\r\n const findings: { severity: string; file: string; line: string; message: string }[] = [];\r\n for (const line of result.text.split('\\n')) {\r\n const match = line.match(/^-\\s*(CRITICAL|WARNING|INFO):\\s*(\\S+?)(?::(\\d+))?\\s+(.+)/);\r\n if (match) {\r\n findings.push({\r\n severity: match[1].toLowerCase(),\r\n file: match[2],\r\n line: match[3] ?? '?',\r\n message: match[4],\r\n });\r\n }\r\n }\r\n\r\n const tail = result.text.slice(-500);\r\n const verdictMatch = tail.match(/^(?:-\\s*)?VERDICT:\\s*(APPROVED|NEEDS_REVISION)/m);\r\n const scoreMatch = tail.match(/SCORE:\\s*(\\d+)\\/10/);\r\n\r\n const output = {\r\n mode,\r\n findings,\r\n verdict: verdictMatch ? verdictMatch[1].toLowerCase() : 'unknown',\r\n score: scoreMatch ? Number.parseInt(scoreMatch[1], 10) : null,\r\n review: result.text,\r\n sessionId: session.id,\r\n codexThreadId: result.sessionId,\r\n resumed: sessionThreadId ? result.sessionId === sessionThreadId : false,\r\n usage: result.usage,\r\n durationMs: result.durationMs,\r\n };\r\n\r\n // Human-readable summary on stderr\r\n const verdictColor = output.verdict === 'approved' ? chalk.green : chalk.red;\r\n console.error(verdictColor(`\\nVerdict: ${output.verdict.toUpperCase()} (${output.score ?? '?'}/10)`));\r\n if (findings.length > 0) {\r\n console.error(chalk.yellow(`Findings (${findings.length}):`));\r\n for (const f of findings) {\r\n const sev = f.severity === 'critical' ? chalk.red('CRITICAL') :\r\n f.severity === 'warning' ? chalk.yellow('WARNING') : chalk.dim('INFO');\r\n console.error(` ${sev} ${f.file}:${f.line} — ${f.message}`);\r\n }\r\n } else {\r\n console.error(chalk.green('No issues found.'));\r\n }\r\n console.error(chalk.dim(`Duration: ${(output.durationMs / 1000).toFixed(1)}s | Tokens: ${output.usage?.totalTokens ?? '?'}`));\r\n\r\n console.log(JSON.stringify(output, null, 2));\r\n db.close();\r\n } catch (error) {\r\n console.error(chalk.red(`Error: ${error instanceof Error ? error.message : String(error)}`));\r\n process.exit(1);\r\n }\r\n}\r\n","import type { ExecutionMode } from '@codemoot/core';\nimport { ModelRegistry, Orchestrator, loadConfig, openDatabase } from '@codemoot/core';\nimport chalk from 'chalk';\n\nimport { printSessionSummary, renderEvent } from '../render.js';\nimport { getDbPath } from '../utils.js';\n\ninterface RunOptions {\n mode?: string;\n maxIterations?: number;\n stream?: boolean;\n}\n\nexport async function runCommand(task: string, options: RunOptions): Promise<void> {\n try {\n // 1. Load config\n const config = loadConfig();\n\n // 2. Create model registry (pass cwd so codex runs in the project dir)\n const projectDir = process.cwd();\n const registry = ModelRegistry.fromConfig(config, projectDir);\n\n // 3. Health check\n const health = await registry.healthCheckAll();\n for (const [alias, hasKey] of health) {\n if (!hasKey) {\n console.warn(chalk.yellow(`Warning: No API key for model \"${alias}\"`));\n }\n }\n\n // 4. Open database\n const dbPath = getDbPath();\n const db = openDatabase(dbPath);\n\n // 5. Create orchestrator\n const orchestrator = new Orchestrator({ registry, db, config });\n\n // 6. Subscribe to events\n orchestrator.on('event', (event) => renderEvent(event, config));\n\n // 7. Execute\n const result = await orchestrator.run(task, {\n mode: (options.mode as ExecutionMode) ?? config.mode,\n maxIterations: options.maxIterations,\n stream: options.stream,\n });\n\n // 8. Print summary\n printSessionSummary(result);\n\n db.close();\n process.exit(result.status === 'completed' ? 0 : 2);\n } catch (error) {\n console.error(chalk.red(`Error: ${error instanceof Error ? error.message : String(error)}`));\n process.exit(1);\n }\n}\n","// packages/cli/src/commands/shipit.ts — Composite workflow profiles\n\nimport { execSync } from 'node:child_process';\nimport { DEFAULT_RULES, type PolicyContext, evaluatePolicy } from '@codemoot/core';\nimport chalk from 'chalk';\n\ninterface ShipitOptions {\n profile: string;\n dryRun: boolean;\n noCommit: boolean;\n json: boolean;\n strictOutput: boolean;\n}\n\ninterface StepResult {\n name: string;\n status: 'passed' | 'failed' | 'skipped';\n output?: string;\n durationMs: number;\n}\n\nconst PROFILES: Record<string, string[]> = {\n fast: ['review'],\n safe: ['lint', 'test', 'review', 'cleanup'],\n full: ['lint', 'test', 'review', 'cleanup', 'commit'],\n};\n\nfunction runStep(name: string, dryRun: boolean): StepResult {\n const start = Date.now();\n if (dryRun) {\n return { name, status: 'skipped', output: 'dry-run', durationMs: 0 };\n }\n\n try {\n let cmd: string;\n switch (name) {\n case 'lint':\n cmd = 'npx biome check .';\n break;\n case 'test':\n cmd = 'pnpm run test';\n break;\n case 'review':\n cmd = 'codemoot review --preset pre-commit --diff HEAD';\n break;\n case 'cleanup':\n cmd = 'codemoot cleanup --scope deps';\n break;\n case 'commit':\n return { name, status: 'skipped', output: 'handled by shipit', durationMs: 0 };\n default:\n return { name, status: 'skipped', output: `unknown step: ${name}`, durationMs: 0 };\n }\n\n const output = execSync(cmd, {\n encoding: 'utf-8',\n timeout: 300000,\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n return {\n name,\n status: 'passed',\n output: output.slice(0, 2000),\n durationMs: Date.now() - start,\n };\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n return { name, status: 'failed', output: msg.slice(0, 2000), durationMs: Date.now() - start };\n }\n}\n\nexport async function shipitCommand(options: ShipitOptions): Promise<void> {\n const profile = options.profile;\n const steps = PROFILES[profile];\n\n if (!steps) {\n console.error(chalk.red(`Unknown profile: ${profile}. Use: fast, safe, full`));\n process.exit(1);\n }\n\n if (options.dryRun) {\n console.error(chalk.cyan(`Shipit dry-run (profile: ${profile})`));\n console.error(chalk.dim(`Steps: ${steps.join(' → ')}`));\n } else {\n console.error(chalk.cyan(`Shipit (profile: ${profile}): ${steps.join(' → ')}`));\n }\n\n const results: StepResult[] = [];\n let shouldStop = false;\n\n for (const step of steps) {\n if (shouldStop) {\n results.push({ name: step, status: 'skipped', durationMs: 0 });\n continue;\n }\n\n const result = runStep(step, options.dryRun);\n results.push(result);\n\n if (!options.dryRun) {\n const icon =\n result.status === 'passed'\n ? chalk.green('OK')\n : result.status === 'failed'\n ? chalk.red('FAIL')\n : chalk.dim('SKIP');\n console.error(` ${icon} ${result.name} (${result.durationMs}ms)`);\n }\n\n if (result.status === 'failed' && (step === 'lint' || step === 'test')) {\n shouldStop = true;\n }\n }\n\n // Policy evaluation\n const reviewResult = results.find((r) => r.name === 'review');\n const criticalCount = reviewResult?.output?.match(/CRITICAL/gi)?.length ?? 0;\n const warningCount = reviewResult?.output?.match(/WARNING/gi)?.length ?? 0;\n const verdictMatch = reviewResult?.output?.match(/VERDICT:\\s*(APPROVED|NEEDS_REVISION)/i);\n\n const policyCtx: PolicyContext = {\n criticalCount,\n warningCount,\n verdict: verdictMatch ? verdictMatch[1].toLowerCase() : 'unknown',\n stepsCompleted: Object.fromEntries(results.map((r) => [r.name, r.status])),\n cleanupHighCount: 0,\n };\n\n const policyResult = evaluatePolicy('review.completed', policyCtx, DEFAULT_RULES);\n\n if (policyResult.decision === 'block') {\n console.error(chalk.red('Policy BLOCKED:'));\n for (const v of policyResult.violations) {\n console.error(chalk.red(` - ${v.message}`));\n }\n } else if (policyResult.decision === 'warn') {\n for (const v of policyResult.violations) {\n console.error(chalk.yellow(` Warning: ${v.message}`));\n }\n }\n\n const output = {\n profile,\n steps: results,\n policy: policyResult,\n canCommit: policyResult.decision !== 'block' && !shouldStop && !options.noCommit,\n };\n\n if (options.json) {\n console.log(JSON.stringify(output, null, 2));\n } else {\n const allPassed = results.every((r) => r.status === 'passed' || r.status === 'skipped');\n if (allPassed && policyResult.decision !== 'block') {\n console.error(chalk.green('\\nAll checks passed. Ready to commit.'));\n } else {\n console.error(chalk.red('\\nSome checks failed or policy blocked.'));\n }\n }\n}\n","// packages/cli/src/commands/start.ts — First-run concierge: verify → init → quick review\n\nimport { existsSync } from 'node:fs';\nimport { execFileSync, execSync } from 'node:child_process';\nimport { join, basename } from 'node:path';\nimport chalk from 'chalk';\nimport { loadConfig, writeConfig, type PresetName } from '@codemoot/core';\n\nexport async function startCommand(): Promise<void> {\n const cwd = process.cwd();\n console.error(chalk.cyan('\\n CodeMoot — First Run Setup\\n'));\n\n // Step 1: Verify Codex CLI\n console.error(chalk.dim(' [1/4] Checking Codex CLI...'));\n let codexVersion: string | null = null;\n try {\n codexVersion = execSync('codex --version', { stdio: 'pipe', encoding: 'utf-8' }).trim();\n } catch {\n // not installed\n }\n\n if (!codexVersion) {\n console.error(chalk.red(' Codex CLI is not installed.'));\n console.error(chalk.yellow(' Install it: npm install -g @openai/codex'));\n console.error(chalk.yellow(' Then run: codemoot start'));\n process.exit(1);\n }\n console.error(chalk.green(` Codex CLI ${codexVersion} found.`));\n\n // Step 2: Check/create config\n console.error(chalk.dim(' [2/4] Checking project config...'));\n const configPath = join(cwd, '.cowork.yml');\n if (existsSync(configPath)) {\n console.error(chalk.green(' .cowork.yml exists — using it.'));\n } else {\n const config = loadConfig({ preset: 'cli-first' as PresetName, skipFile: true });\n config.project.name = basename(cwd);\n writeConfig(config, cwd);\n console.error(chalk.green(' Created .cowork.yml with cli-first preset.'));\n }\n\n // Step 3: Detect project type\n console.error(chalk.dim(' [3/4] Detecting project...'));\n const hasGit = existsSync(join(cwd, '.git'));\n const hasSrc = existsSync(join(cwd, 'src'));\n const hasPackageJson = existsSync(join(cwd, 'package.json'));\n\n let reviewTarget = '';\n if (hasGit) {\n try {\n const diff = execSync('git diff --name-only HEAD', { cwd, encoding: 'utf-8', stdio: 'pipe' }).trim();\n if (diff) {\n const files = diff.split('\\n').filter(f => f.endsWith('.ts') || f.endsWith('.js') || f.endsWith('.tsx') || f.endsWith('.jsx') || f.endsWith('.py'));\n if (files.length > 0) {\n reviewTarget = files.slice(0, 10).join(' ');\n console.error(chalk.green(` Found ${files.length} changed file(s) — reviewing those.`));\n }\n }\n } catch {\n // no git diff available\n }\n }\n\n if (!reviewTarget) {\n if (hasSrc) {\n reviewTarget = 'src/';\n console.error(chalk.green(' Found src/ directory — reviewing it.'));\n } else if (hasPackageJson) {\n reviewTarget = '**/*.ts';\n console.error(chalk.green(' TypeScript project — reviewing *.ts files.'));\n } else {\n console.error(chalk.yellow(' No src/ or package.json found. Try: codemoot review <path>'));\n process.exit(0);\n }\n }\n\n // Step 4: Run quick review\n console.error(chalk.dim(' [4/4] Running quick review...'));\n console.error(chalk.cyan(`\\n codemoot review ${reviewTarget} --preset quick-scan\\n`));\n\n try {\n const output = execFileSync('codemoot', ['review', reviewTarget, '--preset', 'quick-scan'], {\n cwd,\n encoding: 'utf-8',\n timeout: 300000,\n stdio: ['pipe', 'pipe', 'inherit'],\n shell: process.platform === 'win32',\n });\n\n // Parse and display summary\n try {\n const result = JSON.parse(output);\n const findingCount = result.findings?.length ?? 0;\n const verdict = result.verdict ?? 'unknown';\n const score = result.score;\n\n console.error('');\n if (findingCount > 0) {\n console.error(chalk.yellow(` Found ${findingCount} issue(s). Score: ${score ?? '?'}/10`));\n console.error('');\n console.error(chalk.cyan(' Next steps:'));\n console.error(chalk.dim(` codemoot fix ${reviewTarget} --dry-run # preview fixes`));\n console.error(chalk.dim(` codemoot fix ${reviewTarget} # apply fixes`));\n console.error(chalk.dim(' codemoot review --preset security-audit # deeper scan'));\n } else if (verdict === 'approved') {\n console.error(chalk.green(` Code looks good! Score: ${score ?? '?'}/10`));\n console.error('');\n console.error(chalk.cyan(' Next steps:'));\n console.error(chalk.dim(' codemoot review --preset security-audit # security scan'));\n console.error(chalk.dim(' codemoot debate start \"your question\" # debate with GPT'));\n console.error(chalk.dim(' codemoot watch # watch for changes'));\n } else {\n console.error(chalk.dim(` Review complete. Verdict: ${verdict}, Score: ${score ?? '?'}/10`));\n }\n } catch {\n // Raw output if not JSON\n console.log(output);\n }\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n if (msg.includes('ETIMEDOUT') || msg.includes('timeout')) {\n console.error(chalk.yellow(' Review timed out. Try: codemoot review --preset quick-scan'));\n } else {\n console.error(chalk.red(` Review failed: ${msg.slice(0, 200)}`));\n }\n }\n\n console.error(chalk.dim(' Tip: Run codemoot install-skills to add /debate, /build, /cleanup'));\n console.error(chalk.dim(' slash commands to Claude Code in this project.'));\n console.error('');\n}\n","// packages/cli/src/commands/watch.ts — File watcher that enqueues review jobs on change\n\nimport { JobStore, openDatabase } from '@codemoot/core';\nimport chalk from 'chalk';\nimport { watch } from 'chokidar';\n\nimport { getDbPath } from '../utils.js';\nimport { Debouncer } from '../watch/debouncer.js';\n\ninterface WatchOptions {\n glob: string;\n focus: string;\n timeout: number;\n quietMs: number;\n maxWaitMs: number;\n cooldownMs: number;\n}\n\nexport async function watchCommand(options: WatchOptions): Promise<void> {\n const projectDir = process.cwd();\n const db = openDatabase(getDbPath());\n const jobStore = new JobStore(db);\n\n const debouncer = new Debouncer(\n (batch) => {\n // Dedupe: skip if a watch-review job is already queued for same scope\n const dedupeKey = `watch-review:${batch.files.sort().join(',')}`.slice(0, 255);\n if (jobStore.hasActiveByType('watch-review')) {\n console.error(\n chalk.yellow(` Skipping batch ${batch.batchId} — watch-review already queued/running`),\n );\n return;\n }\n\n const jobId = jobStore.enqueue({\n type: 'watch-review',\n payload: {\n files: batch.files,\n focus: options.focus,\n timeout: options.timeout,\n cwd: projectDir,\n batchId: batch.batchId,\n reason: batch.reason,\n },\n dedupeKey,\n });\n\n const event = {\n type: 'watch_batch',\n jobId,\n batchId: batch.batchId,\n files: batch.files.length,\n reason: batch.reason,\n ts: new Date().toISOString(),\n };\n console.log(JSON.stringify(event));\n },\n {\n quietMs: options.quietMs,\n maxWaitMs: options.maxWaitMs,\n cooldownMs: options.cooldownMs,\n },\n );\n\n const ignored = [\n '**/node_modules/**',\n '**/.git/**',\n '**/dist/**',\n '**/.cowork/**',\n '**/coverage/**',\n '**/*.db',\n '**/*.db-journal',\n '**/*.db-wal',\n ];\n\n console.error(chalk.cyan(`Watching ${options.glob} for changes...`));\n console.error(\n chalk.dim(\n ` quiet=${options.quietMs}ms, maxWait=${options.maxWaitMs}ms, cooldown=${options.cooldownMs}ms`,\n ),\n );\n\n const watcher = watch(options.glob, {\n cwd: projectDir,\n ignored,\n ignoreInitial: true,\n awaitWriteFinish: { stabilityThreshold: 200, pollInterval: 50 },\n });\n\n watcher.on('all', (event, path) => {\n if (event === 'add' || event === 'change' || event === 'unlink') {\n debouncer.push({ path, event, ts: Date.now() });\n }\n });\n\n // Graceful shutdown\n const shutdown = () => {\n console.error(chalk.dim('\\nShutting down watcher...'));\n debouncer.flushNow();\n debouncer.destroy();\n watcher.close();\n db.close();\n process.exit(0);\n };\n\n process.on('SIGINT', shutdown);\n process.on('SIGTERM', shutdown);\n}\n","// packages/cli/src/watch/debouncer.ts — Coalescing debouncer for file watch events\n\nexport interface ChangeEvent {\n path: string;\n event: 'add' | 'change' | 'unlink';\n ts: number;\n}\n\nexport interface DebounceConfig {\n quietMs: number; // ms of quiet before flushing (default 800)\n maxWaitMs: number; // max ms before forced flush (default 5000)\n cooldownMs: number; // ms after flush before accepting new batch (default 1500)\n maxBatchSize: number; // max files per batch (default 50)\n}\n\nexport interface FlushBatch {\n files: string[];\n batchId: string;\n windowStart: number;\n windowEnd: number;\n reason: 'quiet' | 'maxWait' | 'maxBatch' | 'manual';\n}\n\nconst DEFAULT_CONFIG: DebounceConfig = {\n quietMs: 800,\n maxWaitMs: 5000,\n cooldownMs: 1500,\n maxBatchSize: 50,\n};\n\nlet batchCounter = 0;\n\nexport class Debouncer {\n private config: DebounceConfig;\n private pending: Map<string, ChangeEvent> = new Map();\n private quietTimer: ReturnType<typeof setTimeout> | null = null;\n private maxWaitTimer: ReturnType<typeof setTimeout> | null = null;\n private cooldownUntil = 0;\n private windowStart = 0;\n private onFlush: (batch: FlushBatch) => void;\n private destroyed = false;\n\n constructor(onFlush: (batch: FlushBatch) => void, config?: Partial<DebounceConfig>) {\n this.onFlush = onFlush;\n this.config = { ...DEFAULT_CONFIG, ...config };\n }\n\n push(e: ChangeEvent): boolean {\n if (this.destroyed) return false;\n if (e.ts < this.cooldownUntil) return false;\n\n if (this.pending.size === 0) {\n this.windowStart = e.ts;\n this.startMaxWaitTimer();\n }\n\n this.pending.set(e.path, e);\n this.restartQuietTimer();\n\n if (this.pending.size >= this.config.maxBatchSize) {\n this.flush('maxBatch');\n }\n\n return true;\n }\n\n flushNow(): void {\n this.flush('manual');\n }\n\n cancel(): void {\n this.clearTimers();\n this.pending.clear();\n }\n\n destroy(): void {\n this.cancel();\n this.destroyed = true;\n }\n\n getPendingCount(): number {\n return this.pending.size;\n }\n\n private flush(reason: FlushBatch['reason']): void {\n if (this.pending.size === 0) return;\n this.clearTimers();\n\n const now = Date.now();\n const batch: FlushBatch = {\n files: [...this.pending.keys()],\n batchId: `wb-${++batchCounter}`,\n windowStart: this.windowStart,\n windowEnd: now,\n reason,\n };\n\n this.pending.clear();\n this.cooldownUntil = now + this.config.cooldownMs;\n this.onFlush(batch);\n }\n\n private restartQuietTimer(): void {\n if (this.quietTimer) clearTimeout(this.quietTimer);\n this.quietTimer = setTimeout(() => this.flush('quiet'), this.config.quietMs);\n }\n\n private startMaxWaitTimer(): void {\n if (this.maxWaitTimer) return;\n this.maxWaitTimer = setTimeout(() => this.flush('maxWait'), this.config.maxWaitMs);\n }\n\n private clearTimers(): void {\n if (this.quietTimer) {\n clearTimeout(this.quietTimer);\n this.quietTimer = null;\n }\n if (this.maxWaitTimer) {\n clearTimeout(this.maxWaitTimer);\n this.maxWaitTimer = null;\n }\n }\n}\n","// packages/cli/src/commands/worker.ts — Background job worker that processes queued jobs\n\nimport {\n type CliAdapter,\n JobStore,\n ModelRegistry,\n REVIEW_DIFF_MAX_CHARS,\n buildHandoffEnvelope,\n loadConfig,\n openDatabase,\n} from '@codemoot/core';\nimport chalk from 'chalk';\nimport { execSync } from 'node:child_process';\n\nimport { createProgressCallbacks } from '../progress.js';\nimport { getDbPath } from '../utils.js';\n\ninterface WorkerOptions {\n once: boolean;\n pollMs: number;\n workerId: string;\n}\n\nexport async function workerCommand(options: WorkerOptions): Promise<void> {\n const projectDir = process.cwd();\n const db = openDatabase(getDbPath());\n const jobStore = new JobStore(db);\n const config = loadConfig();\n const registry = ModelRegistry.fromConfig(config, projectDir);\n const adapter =\n registry.tryGetAdapter('codex-reviewer') ?? registry.tryGetAdapter('codex-architect');\n if (!adapter) {\n try {\n execSync('codex --version', { stdio: 'pipe', encoding: 'utf-8' });\n } catch {\n console.error(chalk.red('Codex CLI is not installed or not in PATH.'));\n console.error(chalk.yellow('Install it: npm install -g @openai/codex'));\n db.close();\n process.exit(1);\n }\n console.error(chalk.red('No codex adapter found in config. Run: codemoot init'));\n db.close();\n process.exit(1);\n }\n\n const workerId = options.workerId;\n console.error(\n chalk.cyan(`Worker ${workerId} started (poll: ${options.pollMs}ms, once: ${options.once})`),\n );\n\n let running = true;\n const shutdown = () => {\n running = false;\n console.error(chalk.dim('\\nWorker shutting down...'));\n };\n process.on('SIGINT', shutdown);\n process.on('SIGTERM', shutdown);\n\n while (running) {\n const job = jobStore.claimNext(workerId)[0];\n\n if (!job) {\n if (options.once) {\n console.error(chalk.dim('No jobs in queue. Exiting (--once mode).'));\n break;\n }\n await new Promise((r) => setTimeout(r, options.pollMs));\n continue;\n }\n\n console.error(chalk.cyan(`Processing job ${job.id} (type: ${job.type})`));\n jobStore.appendLog(job.id, 'info', 'job_started', `Worker ${workerId} claimed job`);\n\n try {\n const { resolve, normalize } = await import('node:path');\n const payload = JSON.parse(job.payloadJson) as Record<string, unknown>;\n const rawCwd = resolve((payload.path as string) ?? (payload.cwd as string) ?? projectDir);\n const cwd = normalize(rawCwd);\n // Prevent path traversal — resolved path must be within projectDir\n const sep = process.platform === 'win32' ? '\\\\' : '/';\n if (cwd !== normalize(projectDir) && !cwd.startsWith(normalize(projectDir) + sep)) {\n throw new Error(`Path traversal blocked: \"${cwd}\" is outside project directory \"${projectDir}\"`);\n }\n const timeout = ((payload.timeout as number) ?? 600) * 1000;\n\n let prompt: string;\n\n if (job.type === 'review' || job.type === 'watch-review') {\n const focus = (payload.focus as string) ?? 'all';\n const focusConstraint =\n focus === 'all'\n ? 'Review for: correctness, bugs, security, performance, code quality'\n : `Focus specifically on: ${focus}`;\n\n if (payload.prompt) {\n prompt = buildHandoffEnvelope({\n command: 'review',\n task: `TASK: ${payload.prompt}\\n\\nStart by listing candidate files, then inspect them thoroughly.`,\n constraints: [focusConstraint],\n resumed: false,\n });\n } else if (payload.diff) {\n const { execFileSync } = await import('node:child_process');\n // Validate diff args — only allow safe git ref patterns (no flag injection)\n const diffArgs = (payload.diff as string).split(/\\s+/).filter(a => a.length > 0);\n for (const arg of diffArgs) {\n if (arg.startsWith('-') || !/^[a-zA-Z0-9_.~^:\\/\\\\@{}]+$/.test(arg)) {\n throw new Error(`Invalid diff argument: \"${arg}\" — only git refs and paths allowed`);\n }\n }\n const diff = execFileSync('git', ['diff', ...diffArgs], {\n cwd,\n encoding: 'utf-8',\n maxBuffer: 1024 * 1024,\n });\n prompt = buildHandoffEnvelope({\n command: 'review',\n task: `Review these code changes.\\n\\nGIT DIFF:\\n${diff.slice(0, REVIEW_DIFF_MAX_CHARS)}`,\n constraints: [focusConstraint],\n resumed: false,\n });\n } else if (payload.files && Array.isArray(payload.files)) {\n prompt = buildHandoffEnvelope({\n command: 'review',\n task: `Review these files: ${(payload.files as string[]).join(', ')}. Read each file and report issues.`,\n constraints: [focusConstraint],\n resumed: false,\n });\n } else {\n prompt = buildHandoffEnvelope({\n command: 'review',\n task: 'Review the codebase for issues. Start by listing key files.',\n constraints: [focusConstraint],\n resumed: false,\n });\n }\n } else if (job.type === 'cleanup') {\n prompt = buildHandoffEnvelope({\n command: 'cleanup',\n task: `Scan ${cwd} for: unused dependencies, dead code, duplicates, hardcoded values. Report findings with confidence levels.`,\n constraints: [`Scope: ${payload.scope ?? 'all'}`],\n resumed: false,\n });\n } else {\n jobStore.fail(job.id, `Unsupported job type: ${job.type}`);\n continue;\n }\n\n jobStore.appendLog(job.id, 'info', 'codex_started', 'Sending to codex...');\n const progress = createProgressCallbacks('worker');\n\n const result = await (adapter as CliAdapter).callWithResume(prompt, {\n timeout,\n ...progress,\n });\n\n jobStore.appendLog(\n job.id,\n 'info',\n 'codex_completed',\n `Received ${result.text.length} chars in ${result.durationMs}ms`,\n );\n\n // Store result\n const resultData: Record<string, unknown> = {\n text: result.text,\n usage: result.usage,\n durationMs: result.durationMs,\n sessionId: result.sessionId,\n };\n\n jobStore.succeed(job.id, resultData);\n console.error(chalk.green(`Job ${job.id} completed (${result.durationMs}ms)`));\n } catch (err) {\n const errMsg = err instanceof Error ? err.message : String(err);\n jobStore.appendLog(job.id, 'error', 'job_failed', errMsg);\n jobStore.fail(job.id, errMsg);\n console.error(chalk.red(`Job ${job.id} failed: ${errMsg}`));\n }\n\n if (options.once) break;\n }\n\n db.close();\n console.error(chalk.dim('Worker stopped.'));\n}\n"],"mappings":"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","names":["VERSION","openDatabase","chalk","join","chalk","openDatabase","chalk","session","join","ModelRegistry","DebateStore","SessionManager","generateId","loadConfig","openDatabase","chalk","generateId","openDatabase","DebateStore","chalk","loadConfig","SessionManager","BuildStore","ModelRegistry","SessionManager","buildHandoffEnvelope","generateId","loadConfig","openDatabase","chalk","resolve","openDatabase","BuildStore","generateId","chalk","loadConfig","ModelRegistry","SessionManager","session","writeFileSync","buildHandoffEnvelope","openDatabase","SessionManager","chalk","openDatabase","SessionManager","session","chalk","execSync","join","chalk","openDatabase","openDatabase","chalk","openDatabase","chalk","execFileSync","execSync","readFileSync","ModelRegistry","SessionManager","buildHandoffEnvelope","loadConfig","openDatabase","REVIEW_DIFF_MAX_CHARS","chalk","readFileSync","openDatabase","loadConfig","ModelRegistry","execSync","chalk","SessionManager","session","execFileSync","buildHandoffEnvelope","REVIEW_DIFF_MAX_CHARS","exitReason","existsSync","join","loadConfig","chalk","existsSync","mkdirSync","readFileSync","writeFileSync","join","chalk","SessionManager","chalk","SessionManager","session","chalk","JobStore","openDatabase","chalk","openDatabase","JobStore","jobs","chalk","writeFileSync","ModelRegistry","loadConfig","openDatabase","chalk","chalk","chalk","loadConfig","ModelRegistry","chalk","openDatabase","writeFileSync","loadConfig","ModelRegistry","REVIEW_DIFF_MAX_CHARS","SessionManager","JobStore","openDatabase","buildHandoffEnvelope","chalk","execFileSync","execSync","readFileSync","existsSync","resolve","chalk","loadConfig","ModelRegistry","execSync","db","openDatabase","JobStore","SessionManager","session","buildHandoffEnvelope","execFileSync","REVIEW_DIFF_MAX_CHARS","resolve","existsSync","readFileSync","ModelRegistry","Orchestrator","loadConfig","openDatabase","chalk","loadConfig","ModelRegistry","chalk","openDatabase","Orchestrator","execSync","DEFAULT_RULES","evaluatePolicy","chalk","existsSync","execFileSync","execSync","join","basename","chalk","loadConfig","writeConfig","JobStore","openDatabase","chalk","openDatabase","JobStore","chalk","JobStore","ModelRegistry","REVIEW_DIFF_MAX_CHARS","buildHandoffEnvelope","loadConfig","openDatabase","chalk","execSync","openDatabase","JobStore","loadConfig","ModelRegistry","execSync","chalk","resolve","buildHandoffEnvelope","execFileSync","REVIEW_DIFF_MAX_CHARS","VERSION"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/commands/build.ts","../src/progress.ts","../src/utils.ts","../src/commands/debate.ts","../src/commands/cleanup.ts","../src/commands/cost.ts","../src/commands/doctor.ts","../src/commands/events.ts","../src/commands/fix.ts","../src/commands/init.ts","../src/commands/install-skills.ts","../src/commands/session.ts","../src/commands/jobs.ts","../src/commands/plan.ts","../src/render.ts","../src/commands/review.ts","../src/commands/run.ts","../src/commands/shipit.ts","../src/commands/start.ts","../src/commands/watch.ts","../src/watch/debouncer.ts","../src/commands/worker.ts"],"sourcesContent":["import { Command, InvalidArgumentError, Option } from 'commander';\n\nimport { CLEANUP_TIMEOUT_SEC, VERSION } from '@codemoot/core';\n\nimport {\n buildEventCommand,\n buildListCommand,\n buildReviewCommand,\n buildStartCommand,\n buildStatusCommand,\n} from './commands/build.js';\nimport {\n debateCompleteCommand,\n debateHistoryCommand,\n debateListCommand,\n debateStartCommand,\n debateStatusCommand,\n debateTurnCommand,\n} from './commands/debate.js';\nimport { cleanupCommand } from './commands/cleanup.js';\nimport { costCommand } from './commands/cost.js';\nimport { doctorCommand } from './commands/doctor.js';\nimport { eventsCommand } from './commands/events.js';\nimport { fixCommand } from './commands/fix.js';\nimport { initCommand } from './commands/init.js';\nimport { installSkillsCommand } from './commands/install-skills.js';\nimport {\n sessionStartCommand,\n sessionCurrentCommand,\n sessionListCommand,\n sessionStatusCommand,\n sessionCloseCommand,\n} from './commands/session.js';\nimport {\n jobsListCommand,\n jobsLogsCommand,\n jobsCancelCommand,\n jobsRetryCommand,\n jobsStatusCommand,\n} from './commands/jobs.js';\nimport { planGenerateCommand, planReviewCommand } from './commands/plan.js';\nimport { reviewCommand } from './commands/review.js';\nimport { runCommand } from './commands/run.js';\nimport { shipitCommand } from './commands/shipit.js';\nimport { startCommand } from './commands/start.js';\nimport { watchCommand } from './commands/watch.js';\nimport { workerCommand } from './commands/worker.js';\n\nconst program = new Command();\n\nprogram\n .name('codemoot')\n .description('Multi-model collaborative AI development tool')\n .version(VERSION)\n .option('--verbose', 'Enable debug logging');\n\nprogram\n .command('start')\n .description('First-run setup: verify codex, init config, run quick review')\n .action(startCommand);\n\nprogram\n .command('doctor')\n .description('Preflight diagnostics: check codex, config, database, git, node')\n .action(doctorCommand);\n\nprogram\n .command('install-skills')\n .description('Install Claude Code slash commands (/debate, /build, /codex-review, /cleanup)')\n .option('--force', 'Overwrite existing skill files', false)\n .action(installSkillsCommand);\n\nprogram\n .command('init')\n .description('Initialize CodeMoot in the current project')\n .option('--preset <name>', 'Use preset (cli-first)')\n .option('--non-interactive', 'Skip prompts, use defaults')\n .option('--force', 'Overwrite existing .cowork.yml')\n .action(initCommand);\n\nprogram\n .command('run')\n .description('Run a task through the full workflow')\n .argument('<task>', 'Task description (natural language)')\n .option('--mode <mode>', 'Execution mode (autonomous|interactive)', 'autonomous')\n .option('--max-iterations <n>', 'Max review loop iterations', (v: string) => Number.parseInt(v, 10), 3)\n .option('--no-stream', 'Disable streaming output')\n .action(runCommand);\n\nprogram\n .command('review')\n .description('Review code via codex — files, prompts, or diffs')\n .argument('[file-or-glob]', 'File path or glob pattern to review')\n .option('--prompt <instruction>', 'Freeform prompt — codex explores codebase via tools')\n .option('--stdin', 'Read prompt from stdin')\n .option('--diff <revspec>', 'Review a git diff (e.g., HEAD~3..HEAD, origin/main...HEAD)')\n .option('--scope <glob>', 'Restrict codex exploration to matching files (only with --prompt/--stdin)')\n .addOption(new Option('--focus <area>', 'Focus area').choices(['security', 'performance', 'bugs', 'all']).default('all'))\n .option('--preset <name>', 'Use named preset (security-audit|performance|quick-scan|pre-commit|api-review)')\n .option('--session <id>', 'Use specific session (default: active session)')\n .option('--background', 'Enqueue review and return immediately')\n .option('--timeout <seconds>', 'Timeout in seconds', (v: string) => {\n if (!/^\\d+$/.test(v)) throw new InvalidArgumentError('Timeout must be a positive integer');\n const n = Number.parseInt(v, 10);\n if (n <= 0) throw new InvalidArgumentError('Timeout must be a positive integer');\n return n;\n }, 600)\n .action(reviewCommand);\n\nprogram\n .command('cleanup')\n .description('Scan codebase for AI slop: security vulns, anti-patterns, near-duplicates, dead code, and more')\n .argument('[path]', 'Project path to scan', '.')\n .addOption(new Option('--scope <scope>', 'What to scan for').choices(['deps', 'unused-exports', 'hardcoded', 'duplicates', 'deadcode', 'security', 'near-duplicates', 'anti-patterns', 'all']).default('all'))\n .option('--timeout <seconds>', 'Codex scan timeout in seconds', (v: string) => {\n if (!/^\\d+$/.test(v)) throw new InvalidArgumentError('Timeout must be a positive integer');\n const n = Number.parseInt(v, 10);\n if (n <= 0) throw new InvalidArgumentError('Timeout must be a positive integer');\n return n;\n }, CLEANUP_TIMEOUT_SEC)\n .option('--max-disputes <n>', 'Max findings to adjudicate', (v: string) => {\n if (!/^\\d+$/.test(v)) throw new InvalidArgumentError('Must be a non-negative integer');\n return Number.parseInt(v, 10);\n }, 10)\n .option('--host-findings <path>', 'JSON file with host AI findings for 3-way merge')\n .option('--output <path>', 'Write findings report to JSON file')\n .option('--background', 'Enqueue cleanup and return immediately')\n .option('--no-gitignore', 'Skip .gitignore rules (scan everything)')\n .option('--quiet', 'Suppress human-readable summary')\n .action(cleanupCommand);\n\nconst plan = program\n .command('plan')\n .description('Plan generation and review — write plans, get GPT review');\n\nplan\n .command('generate')\n .description('Generate a plan using architect + reviewer loop')\n .argument('<task>', 'Task to plan')\n .option('--rounds <n>', 'Max plan-review rounds', (v: string) => Number.parseInt(v, 10), 3)\n .option('--output <file>', 'Save plan to file')\n .action(planGenerateCommand);\n\nplan\n .command('review')\n .description('Send a host-authored plan to codex for review')\n .argument('<plan-file>', 'Plan file to review (use - for stdin)')\n .option('--build <id>', 'Link review to a build ID')\n .option('--phase <id>', 'Phase identifier (e.g. \"1\", \"setup\")')\n .option('--timeout <seconds>', 'Review timeout', (v: string) => Number.parseInt(v, 10), 300)\n .option('--output <file>', 'Save review result to file')\n .action(planReviewCommand);\n\nconst debate = program\n .command('debate')\n .description('Multi-model debate with session persistence');\n\ndebate\n .command('start')\n .description('Start a new debate')\n .argument('<topic>', 'Debate topic or question')\n .option('--max-rounds <n>', 'Max debate rounds', (v: string) => Number.parseInt(v, 10), 5)\n .action(debateStartCommand);\n\ndebate\n .command('turn')\n .description('Send a prompt to GPT and get critique (with session resume)')\n .argument('<debate-id>', 'Debate ID from start command')\n .argument('<prompt>', 'Prompt to send to GPT')\n .option('--round <n>', 'Round number', (v: string) => Number.parseInt(v, 10))\n .option('--timeout <seconds>', 'Timeout in seconds', (v: string) => Number.parseInt(v, 10), 600)\n .action(debateTurnCommand);\n\ndebate\n .command('status')\n .description('Show debate status and session info')\n .argument('<debate-id>', 'Debate ID')\n .action(debateStatusCommand);\n\ndebate\n .command('list')\n .description('List all debates')\n .option('--status <status>', 'Filter by status (active|completed|stale)')\n .option('--limit <n>', 'Max results', (v: string) => Number.parseInt(v, 10), 20)\n .action(debateListCommand);\n\ndebate\n .command('history')\n .description('Show full message history with token budget')\n .argument('<debate-id>', 'Debate ID')\n .action(debateHistoryCommand);\n\ndebate\n .command('complete')\n .description('Mark a debate as completed')\n .argument('<debate-id>', 'Debate ID')\n .action(debateCompleteCommand);\n\nconst build = program\n .command('build')\n .description('Automated build loop: debate → plan → implement → review → fix');\n\nbuild\n .command('start')\n .description('Start a new build session')\n .argument('<task>', 'Task description')\n .option('--max-rounds <n>', 'Max debate rounds', (v: string) => Number.parseInt(v, 10), 5)\n .option('--allow-dirty', 'Allow starting with dirty working tree (auto-stashes)')\n .action(buildStartCommand);\n\nbuild\n .command('status')\n .description('Show build status and event log')\n .argument('<build-id>', 'Build ID')\n .action(buildStatusCommand);\n\nbuild\n .command('list')\n .description('List all builds')\n .option('--status <status>', 'Filter by status')\n .option('--limit <n>', 'Max results', (v: string) => Number.parseInt(v, 10), 20)\n .action(buildListCommand);\n\nbuild\n .command('event')\n .description('Record a build event (phase transition)')\n .argument('<build-id>', 'Build ID')\n .argument('<event-type>', 'Event type (plan_approved|impl_completed|fix_completed|etc)')\n .option('--loop <n>', 'Loop index', (v: string) => Number.parseInt(v, 10))\n .option('--tokens <n>', 'Tokens used', (v: string) => Number.parseInt(v, 10))\n .action(buildEventCommand);\n\nbuild\n .command('review')\n .description('Send implementation to codex for review (with codebase access)')\n .argument('<build-id>', 'Build ID')\n .action(buildReviewCommand);\n\nconst session = program\n .command('session')\n .description('Unified session management — persistent GPT context across commands');\n\nsession\n .command('start')\n .description('Start a new session')\n .option('--name <name>', 'Session name')\n .action(sessionStartCommand);\n\nsession\n .command('current')\n .description('Show the active session')\n .action(sessionCurrentCommand);\n\nsession\n .command('list')\n .description('List all sessions')\n .option('--status <status>', 'Filter by status (active|completed|stale)')\n .option('--limit <n>', 'Max results', (v: string) => Number.parseInt(v, 10), 20)\n .action(sessionListCommand);\n\nsession\n .command('status')\n .description('Show detailed session info with events')\n .argument('<session-id>', 'Session ID')\n .action(sessionStatusCommand);\n\nsession\n .command('close')\n .description('Mark a session as completed')\n .argument('<session-id>', 'Session ID')\n .action(sessionCloseCommand);\n\n// ── Jobs (background async queue) ──\n\nconst jobs = program\n .command('jobs')\n .description('Background job queue — async reviews, cleanups, and more');\n\njobs\n .command('list')\n .description('List jobs')\n .option('--status <status>', 'Filter by status (queued|running|succeeded|failed|canceled)')\n .option('--type <type>', 'Filter by type (review|cleanup|build-review|composite|watch-review)')\n .option('--limit <n>', 'Max results', (v: string) => Number.parseInt(v, 10), 20)\n .action(jobsListCommand);\n\njobs\n .command('status')\n .description('Show job details with recent logs')\n .argument('<job-id>', 'Job ID')\n .action(jobsStatusCommand);\n\njobs\n .command('logs')\n .description('Show job logs')\n .argument('<job-id>', 'Job ID')\n .option('--from-seq <n>', 'Start from log sequence number', (v: string) => Number.parseInt(v, 10), 0)\n .option('--limit <n>', 'Max log entries', (v: string) => Number.parseInt(v, 10), 100)\n .action(jobsLogsCommand);\n\njobs\n .command('cancel')\n .description('Cancel a queued or running job')\n .argument('<job-id>', 'Job ID')\n .action(jobsCancelCommand);\n\njobs\n .command('retry')\n .description('Retry a failed job')\n .argument('<job-id>', 'Job ID')\n .action(jobsRetryCommand);\n\n// ── Fix (autofix loop: review → fix → re-review) ──\n\nprogram\n .command('fix')\n .description('Autofix loop: review code, apply fixes, re-review until approved')\n .argument('<file-or-glob>', 'File path or glob pattern to fix')\n .option('--max-rounds <n>', 'Max review-fix rounds', (v: string) => Number.parseInt(v, 10), 3)\n .addOption(new Option('--focus <area>', 'Focus area').choices(['security', 'performance', 'bugs', 'all']).default('bugs'))\n .option('--timeout <seconds>', 'Timeout per round', (v: string) => Number.parseInt(v, 10), 600)\n .option('--dry-run', 'Review only, do not apply fixes', false)\n .option('--no-stage', 'Do not git-stage applied fixes')\n .option('--diff <revspec>', 'Fix issues in a git diff')\n .option('--session <id>', 'Use specific session')\n .action(fixCommand);\n\n// ── Shipit (composite workflow profiles) ──\n\nprogram\n .command('shipit')\n .description('Run composite workflow: lint → test → review → cleanup → commit')\n .addOption(new Option('--profile <profile>', 'Workflow profile').choices(['fast', 'safe', 'full']).default('safe'))\n .option('--dry-run', 'Print planned steps without executing', false)\n .option('--no-commit', 'Run checks but skip commit step')\n .option('--json', 'Machine-readable JSON output', false)\n .option('--strict-output', 'Strict model output parsing', false)\n .action(shipitCommand);\n\n// ── Cost dashboard ──\n\nprogram\n .command('cost')\n .description('Token usage and cost dashboard')\n .addOption(new Option('--scope <scope>', 'Time scope').choices(['session', 'daily', 'all']).default('daily'))\n .option('--days <n>', 'Number of days for daily scope', (v: string) => Number.parseInt(v, 10), 30)\n .option('--session <id>', 'Session ID for session scope')\n .action(costCommand);\n\n// ── Watch (file change → background review) ──\n\nprogram\n .command('watch')\n .description('Watch files and enqueue reviews on change')\n .option('--glob <pattern>', 'Glob pattern to watch', '**/*.{ts,tsx,js,jsx}')\n .addOption(new Option('--focus <area>', 'Focus area').choices(['security', 'performance', 'bugs', 'all']).default('all'))\n .option('--timeout <seconds>', 'Review timeout', (v: string) => Number.parseInt(v, 10), 600)\n .option('--quiet-ms <ms>', 'Quiet period before flush', (v: string) => Number.parseInt(v, 10), 800)\n .option('--max-wait-ms <ms>', 'Max wait before forced flush', (v: string) => Number.parseInt(v, 10), 5000)\n .option('--cooldown-ms <ms>', 'Cooldown after flush', (v: string) => Number.parseInt(v, 10), 1500)\n .action(watchCommand);\n\n// ── Events (tail logs as JSONL) ──\n\nprogram\n .command('events')\n .description('Stream session events and job logs as JSONL')\n .option('--follow', 'Follow mode — poll for new events', false)\n .option('--since-seq <n>', 'Start from sequence number', (v: string) => Number.parseInt(v, 10), 0)\n .option('--limit <n>', 'Max events per poll', (v: string) => Number.parseInt(v, 10), 100)\n .addOption(new Option('--type <type>', 'Event source filter').choices(['all', 'sessions', 'jobs']).default('all'))\n .action(eventsCommand);\n\n// ── Worker (background job processor) ──\n\njobs\n .command('worker')\n .description('Start background job worker (processes queued jobs)')\n .option('--once', 'Process one job and exit', false)\n .option('--poll-ms <ms>', 'Poll interval in milliseconds', (v: string) => Number.parseInt(v, 10), 2000)\n .option('--worker-id <id>', 'Worker identifier', `w-${Date.now()}`)\n .action(workerCommand);\n\nprogram.parse();\n\nexport { program };\n","// packages/cli/src/commands/build.ts — CLI build commands\n\nimport type { BuildRun, BuildSummary } from '@codemoot/core';\nimport { BuildStore, DebateStore, REVIEW_DIFF_MAX_CHARS, REVIEW_TEXT_MAX_CHARS, SessionManager, buildHandoffEnvelope, generateId, loadConfig, openDatabase } from '@codemoot/core';\nimport chalk from 'chalk';\nimport { execFileSync, execSync } from 'node:child_process';\nimport { unlinkSync } from 'node:fs';\nimport { join } from 'node:path';\n\nimport { createProgressCallbacks } from '../progress.js';\nimport { getDbPath } from '../utils.js';\n\n// ── codemoot build start ──\n\ninterface StartOptions {\n maxRounds?: number;\n allowDirty?: boolean;\n}\n\nexport async function buildStartCommand(task: string, options: StartOptions): Promise<void> {\n let db: ReturnType<typeof openDatabase> | undefined;\n try {\n const buildId = generateId();\n const dbPath = getDbPath();\n db = openDatabase(dbPath);\n const buildStore = new BuildStore(db);\n const debateStore = new DebateStore(db);\n const projectDir = process.cwd();\n\n // Check git status\n let baselineRef: string | null = null;\n try {\n const dirty = execSync('git status --porcelain', { cwd: projectDir, encoding: 'utf-8' }).trim();\n if (dirty && !options.allowDirty) {\n db.close();\n console.error(chalk.red('Working tree is dirty. Commit or stash your changes first.'));\n console.error(chalk.yellow('Use --allow-dirty to auto-stash.'));\n process.exit(1);\n }\n if (dirty && options.allowDirty) {\n execSync('git stash push -u -m \"codemoot-build-baseline\"', { cwd: projectDir, encoding: 'utf-8' });\n console.error(chalk.yellow('Auto-stashed dirty changes with marker \"codemoot-build-baseline\"'));\n }\n baselineRef = execSync('git rev-parse HEAD', { cwd: projectDir, encoding: 'utf-8' }).trim();\n } catch {\n // Not a git repo — no baseline\n console.error(chalk.yellow('Warning: Not a git repository. No baseline tracking.'));\n }\n\n // Create debate for planning phase\n const debateId = generateId();\n debateStore.upsert({ debateId, role: 'proposer', status: 'active' });\n debateStore.upsert({ debateId, role: 'critic', status: 'active' });\n debateStore.saveState(debateId, 'proposer', {\n debateId,\n question: task,\n models: ['codex-architect', 'codex-reviewer'],\n round: 0,\n turn: 0,\n thread: [],\n runningSummary: '',\n stanceHistory: [],\n usage: { totalPromptTokens: 0, totalCompletionTokens: 0, totalCalls: 0, startedAt: Date.now() },\n status: 'running',\n sessionIds: {},\n resumeStats: { attempted: 0, succeeded: 0, fallbacks: 0 },\n });\n\n // Resolve unified session for the build\n const sessionMgr = new SessionManager(db);\n const session = sessionMgr.resolveActive('build');\n sessionMgr.recordEvent({\n sessionId: session.id,\n command: 'build',\n subcommand: 'start',\n promptPreview: `Build started: ${task}`,\n });\n\n // Create build run\n buildStore.create({ buildId, task, debateId, baselineRef: baselineRef ?? undefined });\n\n // Record start event\n buildStore.updateWithEvent(\n buildId,\n { debateId },\n { eventType: 'debate_started', actor: 'system', phase: 'debate', payload: { task, debateId, baselineRef } },\n );\n\n const output = {\n buildId,\n debateId,\n task,\n baselineRef,\n sessionId: session.id,\n maxRounds: options.maxRounds ?? 5,\n status: 'planning',\n phase: 'debate',\n };\n console.log(JSON.stringify(output, null, 2));\n\n db.close();\n } catch (error) {\n db?.close();\n console.error(chalk.red(`Error: ${error instanceof Error ? error.message : String(error)}`));\n process.exit(1);\n }\n}\n\n// ── codemoot build status ──\n\nexport async function buildStatusCommand(buildId: string): Promise<void> {\n let db: ReturnType<typeof openDatabase> | undefined;\n try {\n const dbPath = getDbPath();\n db = openDatabase(dbPath);\n const store = new BuildStore(db);\n\n const run = store.get(buildId);\n if (!run) {\n db.close();\n console.error(chalk.red(`No build found with ID: ${buildId}`));\n process.exit(1);\n }\n\n const events = store.getEvents(buildId);\n const bugsFound = store.countEventsByType(buildId, 'bug_found');\n const fixesApplied = store.countEventsByType(buildId, 'fix_completed');\n\n const output = {\n buildId: run.buildId,\n task: run.task,\n status: run.status,\n phase: run.currentPhase,\n loop: run.currentLoop,\n debateId: run.debateId,\n baselineRef: run.baselineRef,\n planCodexSession: run.planCodexSession,\n reviewCodexSession: run.reviewCodexSession,\n planVersion: run.planVersion,\n reviewCycles: run.reviewCycles,\n bugsFound,\n bugsFixed: fixesApplied,\n totalEvents: events.length,\n createdAt: new Date(run.createdAt).toISOString(),\n updatedAt: new Date(run.updatedAt).toISOString(),\n completedAt: run.completedAt ? new Date(run.completedAt).toISOString() : null,\n recentEvents: events.slice(-10).map((e) => ({\n seq: e.seq,\n type: e.eventType,\n actor: e.actor,\n phase: e.phase,\n loop: e.loopIndex,\n tokens: e.tokensUsed,\n time: new Date(e.createdAt).toISOString(),\n })),\n };\n console.log(JSON.stringify(output, null, 2));\n\n db.close();\n } catch (error) {\n db?.close();\n console.error(chalk.red(`Error: ${error instanceof Error ? error.message : String(error)}`));\n process.exit(1);\n }\n}\n\n// ── codemoot build list ──\n\ninterface ListOptions {\n status?: string;\n limit?: number;\n}\n\nexport async function buildListCommand(options: ListOptions): Promise<void> {\n let db: ReturnType<typeof openDatabase> | undefined;\n try {\n const dbPath = getDbPath();\n db = openDatabase(dbPath);\n const store = new BuildStore(db);\n\n const builds = store.list({\n status: options.status as BuildRun['status'] | undefined,\n limit: options.limit ?? 20,\n });\n\n const output = builds.map((b: BuildSummary) => ({\n buildId: b.buildId,\n task: b.task,\n status: b.status,\n phase: b.phase,\n loop: b.loop,\n reviewCycles: b.reviewCycles,\n createdAt: new Date(b.createdAt).toISOString(),\n updatedAt: new Date(b.updatedAt).toISOString(),\n }));\n\n console.log(JSON.stringify(output, null, 2));\n\n db.close();\n } catch (error) {\n db?.close();\n console.error(chalk.red(`Error: ${error instanceof Error ? error.message : String(error)}`));\n process.exit(1);\n }\n}\n\n// ── codemoot build event ──\n\ninterface EventOptions {\n loop?: number;\n tokens?: number;\n}\n\nexport async function buildEventCommand(\n buildId: string,\n eventType: string,\n options: EventOptions,\n): Promise<void> {\n let db: ReturnType<typeof openDatabase> | undefined;\n try {\n const dbPath = getDbPath();\n db = openDatabase(dbPath);\n const store = new BuildStore(db);\n\n const run = store.get(buildId);\n if (!run) {\n db.close();\n console.error(chalk.red(`No build found with ID: ${buildId}`));\n process.exit(1);\n }\n\n // Read payload from stdin if available\n let payload: Record<string, unknown> | undefined;\n if (!process.stdin.isTTY) {\n const chunks: Buffer[] = [];\n for await (const chunk of process.stdin) {\n chunks.push(chunk as Buffer);\n }\n const input = Buffer.concat(chunks).toString('utf-8').trim();\n if (input) {\n try { payload = JSON.parse(input); } catch { payload = { text: input }; }\n }\n }\n\n // Determine phase transitions\n const updates: Record<string, unknown> = {};\n if (eventType === 'plan_approved') {\n updates.currentPhase = 'plan_approved';\n updates.status = 'implementing';\n updates.planVersion = run.planVersion + 1;\n } else if (eventType === 'impl_completed') {\n updates.currentPhase = 'review';\n updates.status = 'reviewing';\n } else if (eventType === 'review_verdict') {\n const verdict = payload?.verdict as string;\n if (verdict === 'approved') {\n updates.currentPhase = 'done';\n updates.status = 'completed';\n updates.completedAt = Date.now();\n } else {\n updates.currentPhase = 'fix';\n updates.status = 'fixing';\n updates.reviewCycles = run.reviewCycles + 1;\n }\n } else if (eventType === 'fix_completed') {\n updates.currentPhase = 'review';\n updates.status = 'reviewing';\n updates.currentLoop = run.currentLoop + 1;\n }\n\n store.updateWithEvent(\n buildId,\n updates as Parameters<BuildStore['updateWithEvent']>[1],\n {\n eventType: eventType as Parameters<BuildStore['updateWithEvent']>[2]['eventType'],\n actor: 'system',\n phase: (updates.currentPhase ?? run.currentPhase) as Parameters<BuildStore['updateWithEvent']>[2]['phase'],\n loopIndex: options.loop ?? run.currentLoop,\n payload,\n tokensUsed: options.tokens ?? 0,\n },\n );\n\n const updated = store.get(buildId);\n console.log(JSON.stringify({\n buildId,\n eventType,\n newStatus: updated?.status,\n newPhase: updated?.currentPhase,\n seq: updated?.lastEventSeq,\n }));\n\n db.close();\n } catch (error) {\n db?.close();\n console.error(chalk.red(`Error: ${error instanceof Error ? error.message : String(error)}`));\n process.exit(1);\n }\n}\n\n// ── codemoot build review ──\n\nexport async function buildReviewCommand(buildId: string): Promise<void> {\n let db: ReturnType<typeof openDatabase> | undefined;\n try {\n const dbPath = getDbPath();\n db = openDatabase(dbPath);\n const buildStore = new BuildStore(db);\n const config = loadConfig();\n const projectDir = process.cwd();\n\n const run = buildStore.get(buildId);\n if (!run) {\n db.close();\n console.error(chalk.red(`No build found with ID: ${buildId}`));\n process.exit(1);\n }\n\n // Get diff against baseline\n let diff = '';\n if (run.baselineRef) {\n try {\n // Use a temporary index file to avoid mutating user's staging state\n const tmpIndex = join(projectDir, '.git', 'codemoot-review-index');\n try {\n // Copy current HEAD tree into temp index, then add all working tree changes\n execFileSync('git', ['read-tree', 'HEAD'], { cwd: projectDir, encoding: 'utf-8', env: { ...process.env, GIT_INDEX_FILE: tmpIndex } });\n execFileSync('git', ['add', '-A'], { cwd: projectDir, encoding: 'utf-8', env: { ...process.env, GIT_INDEX_FILE: tmpIndex } });\n diff = execFileSync('git', ['diff', '--cached', run.baselineRef, '--'], { cwd: projectDir, encoding: 'utf-8', maxBuffer: 1024 * 1024, env: { ...process.env, GIT_INDEX_FILE: tmpIndex } });\n } finally {\n try { unlinkSync(tmpIndex); } catch { /* already cleaned */ }\n }\n } catch (err) {\n console.error(chalk.red(`Failed to generate diff: ${err instanceof Error ? err.message : String(err)}`));\n db.close();\n process.exit(1);\n }\n }\n\n if (!diff.trim()) {\n db.close();\n console.error(chalk.yellow('No changes detected against baseline.'));\n process.exit(0);\n }\n\n // Call codex for review with codebase access\n const { ModelRegistry, CliAdapter: CliAdapterClass } = await import('@codemoot/core');\n const registry = ModelRegistry.fromConfig(config, projectDir);\n const adapter = registry.getAdapter('codex-reviewer') ?? registry.getAdapter('codex-architect');\n if (!adapter) {\n db.close();\n console.error(chalk.red('No codex adapter found in config'));\n process.exit(1);\n }\n\n // Resolve unified session\n const sessionMgr = new SessionManager(db);\n const session = sessionMgr.resolveActive('build-review');\n const overflowCheck = sessionMgr.preCallOverflowCheck(session.id);\n if (overflowCheck.rolled) {\n console.error(chalk.yellow(` ${overflowCheck.message}`));\n }\n\n // After rollover, re-read session to get cleared thread ID\n const currentSession = sessionMgr.get(session.id);\n const existingSession = overflowCheck.rolled\n ? undefined // Don't reuse old thread after rollover\n : (currentSession?.codexThreadId ?? run.reviewCodexSession ?? undefined);\n\n const prompt = buildHandoffEnvelope({\n command: 'build-review',\n task: `Review code changes for the task: \"${run.task}\"\\n\\nGIT DIFF (against baseline ${run.baselineRef}):\\n${diff.slice(0, REVIEW_DIFF_MAX_CHARS)}\\n\\nReview for:\\n1. Correctness — does the code work as intended?\\n2. Bugs — any logic errors, edge cases, or crashes?\\n3. Security — any vulnerabilities introduced?\\n4. Code quality — naming, structure, patterns\\n5. Completeness — does it fully implement the task?`,\n resumed: Boolean(existingSession),\n constraints: run.reviewCycles > 0 ? [`This is review cycle ${run.reviewCycles + 1}. Focus on whether prior issues were addressed.`] : undefined,\n });\n\n const progress = createProgressCallbacks('build-review');\n const result = await (adapter as InstanceType<typeof CliAdapterClass>).callWithResume(prompt, {\n sessionId: existingSession,\n timeout: 600_000,\n ...progress,\n });\n\n // Update unified session\n if (result.sessionId) {\n sessionMgr.updateThreadId(session.id, result.sessionId);\n }\n sessionMgr.addUsageFromResult(session.id, result.usage, prompt, result.text);\n sessionMgr.recordEvent({\n sessionId: session.id,\n command: 'build',\n subcommand: 'review',\n promptPreview: `Build review for ${buildId}: ${run.task}`,\n responsePreview: result.text.slice(0, 500),\n promptFull: prompt,\n responseFull: result.text,\n usageJson: JSON.stringify(result.usage),\n durationMs: result.durationMs,\n codexThreadId: result.sessionId,\n });\n\n // Determine if approved — search only the tail of the response to avoid echoed instructions\n const tail = result.text.slice(-500);\n const verdictMatch = tail.match(/^(?:-\\s*)?VERDICT:\\s*(APPROVED|NEEDS_REVISION)/m);\n const approved = verdictMatch?.[1] === 'APPROVED';\n\n // Save review session\n buildStore.updateWithEvent(\n buildId,\n {\n reviewCodexSession: result.sessionId ?? existingSession,\n reviewCycles: run.reviewCycles + 1,\n },\n {\n eventType: 'review_verdict',\n actor: 'codex',\n phase: 'review',\n loopIndex: run.currentLoop,\n payload: {\n verdict: approved ? 'approved' : 'needs_revision',\n response: result.text.slice(0, REVIEW_TEXT_MAX_CHARS),\n sessionId: result.sessionId,\n resumed: existingSession ? result.sessionId === existingSession : false,\n },\n codexThreadId: result.sessionId,\n tokensUsed: result.usage.totalTokens,\n },\n );\n if (approved) {\n buildStore.updateWithEvent(\n buildId,\n { currentPhase: 'done', status: 'completed', completedAt: Date.now() },\n { eventType: 'phase_transition', actor: 'system', phase: 'done', payload: { reason: 'review_approved' } },\n );\n } else {\n buildStore.updateWithEvent(\n buildId,\n { currentPhase: 'fix', status: 'fixing' },\n { eventType: 'phase_transition', actor: 'system', phase: 'fix', payload: { reason: 'review_needs_revision' } },\n );\n }\n\n const output = {\n buildId,\n review: result.text.slice(0, 2000),\n verdict: approved ? 'approved' : 'needs_revision',\n sessionId: result.sessionId,\n resumed: existingSession ? result.sessionId === existingSession : false,\n tokens: result.usage,\n durationMs: result.durationMs,\n };\n console.log(JSON.stringify(output, null, 2));\n\n db.close();\n } catch (error) {\n db?.close();\n console.error(chalk.red(`Error: ${error instanceof Error ? error.message : String(error)}`));\n process.exit(1);\n }\n}\n","// packages/cli/src/progress.ts — Shared progress callbacks for CLI commands\n\nimport type { ProgressCallbacks } from '@codemoot/core';\nimport chalk from 'chalk';\n\nconst THROTTLE_MS = 30_000;\nconst MAX_CARRY_OVER = 64 * 1024; // 64KB — prevent unbounded buffer growth\n\n/**\n * Create progress callbacks for CLI commands that show real-time\n * codex activity on stderr. Parses JSONL events to surface what\n * codex is actually doing (reading files, running tools, thinking).\n */\nexport function createProgressCallbacks(label = 'codex'): ProgressCallbacks {\n let lastActivityAt = 0;\n let lastMessage = '';\n let carryOver = '';\n let droppedEvents = 0;\n\n function printActivity(msg: string) {\n const now = Date.now();\n // Dedupe identical messages and throttle\n if (msg === lastMessage && now - lastActivityAt < THROTTLE_MS) return;\n lastActivityAt = now;\n lastMessage = msg;\n console.error(chalk.dim(` [${label}] ${msg}`));\n }\n\n function parseLine(line: string) {\n const trimmed = line.trim();\n if (!trimmed) return;\n try {\n const event = JSON.parse(trimmed);\n formatEvent(event, printActivity);\n } catch {\n droppedEvents++;\n }\n }\n\n return {\n onSpawn(pid: number, command: string) {\n // Redact args to avoid leaking tokens/credentials in logs — keep only basename\n const exe = command.replace(/^\"([^\"]+)\".*/, '$1').split(/[\\s/\\\\]+/).pop() ?? command;\n console.error(chalk.dim(` [${label}] Started (PID: ${pid}, cmd: ${exe})`));\n },\n\n onStderr(_chunk: string) {\n // Codex stderr is mostly internal noise — skip\n },\n\n onProgress(chunk: string) {\n // Parse JSONL events from codex stdout — handle lines split across chunks\n const data = carryOver + chunk;\n const lines = data.split('\\n');\n // Last element may be incomplete — carry it over to next chunk\n carryOver = lines.pop() ?? '';\n\n // Cap carryOver to prevent unbounded memory growth on malformed streams\n if (carryOver.length > MAX_CARRY_OVER) {\n carryOver = '';\n droppedEvents++;\n }\n\n for (const line of lines) {\n parseLine(line);\n }\n },\n\n onClose() {\n // Flush remaining carryOver on stream end (final event without trailing newline)\n if (carryOver.trim()) {\n parseLine(carryOver);\n carryOver = '';\n }\n if (droppedEvents > 0) {\n console.error(chalk.dim(` [${label}] ${droppedEvents} event(s) dropped (parse errors or buffer overflow)`));\n droppedEvents = 0;\n }\n },\n\n onHeartbeat(elapsedSec: number) {\n // Show heartbeats every 60s to reduce noise\n if (elapsedSec % 60 === 0) {\n printActivity(`${elapsedSec}s elapsed...`);\n }\n },\n };\n}\n\n/** Extract a human-readable summary from a codex JSONL event. */\nfunction formatEvent(\n event: Record<string, unknown>,\n print: (msg: string) => void,\n): void {\n const type = event.type as string;\n\n if (type === 'thread.started') {\n const tid = (event.thread_id as string) ?? '';\n print(`Thread: ${tid.slice(0, 12)}...`);\n return;\n }\n\n // Tool calls — show which tool codex is invoking\n if (type === 'item.completed') {\n const item = event.item as Record<string, unknown> | undefined;\n if (!item) return;\n\n if (item.type === 'tool_call' || item.type === 'function_call') {\n const name = (item.name as string) ?? (item.function as string) ?? 'tool';\n const rawArgs = item.arguments ?? item.input ?? '';\n const args = (typeof rawArgs === 'string' ? rawArgs : JSON.stringify(rawArgs)).slice(0, 80);\n // Extract file paths from tool args for readability\n const pathMatch = args.match(/[\"']([^\"']*\\.[a-z]{1,4})[\"']/i);\n if (pathMatch) {\n print(`${name}: ${pathMatch[1]}`);\n } else {\n print(`${name}${args ? `: ${args.slice(0, 60)}` : ''}`);\n }\n return;\n }\n }\n\n if (type === 'turn.completed') {\n const usage = event.usage as Record<string, number> | undefined;\n if (usage) {\n const input = (usage.input_tokens ?? 0) + (usage.cached_input_tokens ?? 0);\n const output = usage.output_tokens ?? 0;\n print(`Turn done (${input} in / ${output} out tokens)`);\n }\n return;\n }\n}\n","import { openDatabase } from '@codemoot/core';\nimport chalk from 'chalk';\nimport { mkdirSync } from 'node:fs';\nimport { join } from 'node:path';\n\nexport function getDbPath(projectDir?: string): string {\n const base = projectDir ?? process.cwd();\n const dbDir = join(base, '.cowork', 'db');\n mkdirSync(dbDir, { recursive: true });\n return join(dbDir, 'cowork.db');\n}\n\n/**\n * Run a command function with a database connection that is guaranteed to close,\n * even on errors or process.exit calls.\n */\nexport async function withDatabase<T>(fn: (db: ReturnType<typeof openDatabase>) => Promise<T>): Promise<T> {\n const db = openDatabase(getDbPath());\n const originalExit = process.exit;\n let requestedExitCode: number | undefined;\n\n process.exit = ((code?: number) => {\n requestedExitCode = typeof code === 'number' ? code : 1;\n throw new Error('__WITH_DATABASE_EXIT__');\n }) as typeof process.exit;\n\n try {\n return await fn(db);\n } catch (error) {\n if (requestedExitCode === undefined) {\n console.error(chalk.red(`Error: ${error instanceof Error ? error.message : String(error)}`));\n }\n throw error;\n } finally {\n process.exit = originalExit;\n db.close();\n if (requestedExitCode !== undefined) {\n originalExit(requestedExitCode);\n }\n }\n}\n","// packages/cli/src/commands/debate.ts — CLI debate commands wired to core backend\n\nimport type { DebateEngineState, DebateTurnRow } from '@codemoot/core';\nimport {\n CliAdapter,\n DebateStore,\n MessageStore,\n ModelRegistry,\n SessionManager,\n buildReconstructionPrompt,\n generateId,\n getTokenBudgetStatus,\n loadConfig,\n openDatabase,\n parseDebateVerdict,\n preflightTokenCheck,\n} from '@codemoot/core';\nimport chalk from 'chalk';\n\nimport { createProgressCallbacks } from '../progress.js';\nimport { getDbPath } from '../utils.js';\n\n// ── codemoot debate start ──\n\ninterface StartOptions {\n maxRounds?: number;\n}\n\nexport async function debateStartCommand(topic: string, options: StartOptions): Promise<void> {\n let db: ReturnType<typeof openDatabase> | undefined;\n try {\n const debateId = generateId();\n const dbPath = getDbPath();\n db = openDatabase(dbPath);\n const store = new DebateStore(db);\n\n // Create rows for both participants\n store.upsert({ debateId, role: 'proposer', status: 'active' });\n store.upsert({ debateId, role: 'critic', status: 'active' });\n\n // Persist the topic as state_json on the proposer row\n store.saveState(debateId, 'proposer', {\n debateId,\n question: topic,\n models: ['codex-architect', 'codex-reviewer'],\n round: 0,\n turn: 0,\n thread: [],\n runningSummary: '',\n stanceHistory: [],\n usage: { totalPromptTokens: 0, totalCompletionTokens: 0, totalCalls: 0, startedAt: Date.now() },\n status: 'running',\n sessionIds: {},\n resumeStats: { attempted: 0, succeeded: 0, fallbacks: 0 },\n maxRounds: options.maxRounds ?? 5,\n } as DebateEngineState & { maxRounds: number });\n\n // Output JSON for the /debate skill to parse\n const output = {\n debateId,\n topic,\n maxRounds: options.maxRounds ?? 5,\n status: 'started',\n };\n console.log(JSON.stringify(output, null, 2));\n\n db.close();\n } catch (error) {\n db?.close();\n console.error(chalk.red(`Error: ${error instanceof Error ? error.message : String(error)}`));\n process.exit(1);\n }\n}\n\n// ── codemoot debate turn ──\n\ninterface TurnOptions {\n round?: number;\n timeout?: number;\n}\n\nexport async function debateTurnCommand(\n debateId: string,\n prompt: string,\n options: TurnOptions,\n): Promise<void> {\n let db: ReturnType<typeof openDatabase> | undefined;\n try {\n const dbPath = getDbPath();\n db = openDatabase(dbPath);\n const store = new DebateStore(db);\n const msgStore = new MessageStore(db);\n const config = loadConfig();\n const projectDir = process.cwd();\n const registry = ModelRegistry.fromConfig(config, projectDir);\n\n // Get existing critic row for session resume\n const criticRow = store.get(debateId, 'critic');\n if (!criticRow) {\n db.close();\n console.error(chalk.red(`No debate found with ID: ${debateId}`));\n process.exit(1);\n }\n if (criticRow.status === 'completed') {\n db.close();\n console.error(chalk.red(`Debate ${debateId} is already completed. Start a new debate to continue discussion.`));\n process.exit(1);\n }\n\n // Get the codex adapter (try reviewer first, fallback to architect)\n const adapter = registry.tryGetAdapter('codex-reviewer') ?? registry.tryGetAdapter('codex-architect');\n if (!adapter) {\n db.close();\n console.error(chalk.red('No codex adapter found in config. Available: codex-reviewer or codex-architect'));\n process.exit(1);\n }\n\n const rawRound = options.round ?? (criticRow.round + 1);\n const newRound = Number.isFinite(rawRound) && rawRound > 0 ? rawRound : criticRow.round + 1;\n const rawTimeout = options.timeout ?? 600;\n const timeout = (Number.isFinite(rawTimeout) && rawTimeout > 0 ? rawTimeout : 600) * 1000;\n\n // Enforce maxRounds from persisted state\n const proposerStateForLimit = store.loadState(debateId, 'proposer');\n const rawMax = (proposerStateForLimit as (typeof proposerStateForLimit & { maxRounds?: number }))?.maxRounds ?? 5;\n const maxRounds = Number.isFinite(rawMax) && rawMax > 0 ? rawMax : 5;\n if (newRound > maxRounds) {\n console.error(chalk.red(`Round ${newRound} exceeds max rounds (${maxRounds}). Complete or increase limit.`));\n db.close();\n process.exit(1);\n }\n\n // Idempotency: check for existing message at this (debate, round, role)\n const existing = msgStore.getByRound(debateId, newRound, 'critic');\n if (existing?.status === 'completed') {\n // Reconcile debate_turns round in case of prior crash between markCompleted and upsert\n if (criticRow.round < newRound) {\n store.upsert({\n debateId,\n role: 'critic',\n codexSessionId: existing.sessionId ?? criticRow.codexSessionId ?? undefined,\n round: newRound,\n status: 'active',\n });\n }\n // Return cached response\n const output = {\n debateId,\n round: newRound,\n response: existing.responseText?.slice(0, 2000) ?? '',\n sessionId: existing.sessionId,\n resumed: false,\n cached: true,\n usage: existing.usageJson ? (() => { try { return JSON.parse(existing.usageJson); } catch { return null; } })() : null,\n durationMs: existing.durationMs,\n };\n console.log(JSON.stringify(output, null, 2));\n db.close();\n return;\n }\n\n // Recover stale running rows for THIS debate only (use timeout + buffer to avoid killing active turns)\n const staleThreshold = timeout + 60_000; // turn timeout + 1 min buffer\n const recovered = msgStore.recoverStaleForDebate(debateId, staleThreshold);\n if (recovered > 0) {\n console.error(chalk.yellow(` Recovered ${recovered} stale message(s) from prior crash.`));\n }\n\n // Re-fetch after recovery (status may have changed from running → failed)\n const current = msgStore.getByRound(debateId, newRound, 'critic');\n\n // Insert or reuse message row (update prompt if retrying with different text)\n let msgId: number;\n if (current) {\n msgId = current.id;\n if (current.status === 'failed' || current.status === 'queued') {\n msgStore.updatePrompt(msgId, prompt);\n }\n } else {\n msgId = msgStore.insertQueued({\n debateId,\n round: newRound,\n role: 'critic',\n bridge: 'codex',\n model: (adapter as CliAdapter).modelId ?? 'codex',\n promptText: prompt,\n });\n }\n\n // Transition to running (if another process completed it in between, return cached)\n if (!msgStore.markRunning(msgId)) {\n const recheckRow = msgStore.getByRound(debateId, newRound, 'critic');\n if (recheckRow?.status === 'completed') {\n const output = {\n debateId,\n round: newRound,\n response: recheckRow.responseText?.slice(0, 2000) ?? '',\n sessionId: recheckRow.sessionId,\n resumed: false,\n cached: true,\n usage: recheckRow.usageJson ? (() => { try { return JSON.parse(recheckRow.usageJson); } catch { return null; } })() : null,\n durationMs: recheckRow.durationMs,\n };\n console.log(JSON.stringify(output, null, 2));\n db.close();\n return;\n }\n db.close();\n console.error(chalk.red(`Cannot transition message ${msgId} to running (current status: ${recheckRow?.status})`));\n process.exit(1);\n }\n\n // Resolve unified session (source of truth for thread_id)\n const sessionMgr = new SessionManager(db);\n const unifiedSession = sessionMgr.resolveActive('debate');\n let existingSessionId = unifiedSession.codexThreadId ?? criticRow.codexSessionId ?? undefined;\n const attemptedResume = existingSessionId != null;\n\n // Token budget preflight check (only completed rows = real conversation context)\n const completedHistory = msgStore.getHistory(debateId).filter(m => m.status === 'completed');\n const maxContext = (adapter as CliAdapter).capabilities.maxContextTokens;\n const preflight = preflightTokenCheck(completedHistory, prompt, maxContext);\n if (preflight.shouldStop) {\n console.error(chalk.yellow(` Token budget at ${Math.round(preflight.utilizationRatio * 100)}% (${preflight.totalTokensUsed}/${maxContext}). Consider completing this debate.`));\n } else if (preflight.shouldSummarize) {\n console.error(chalk.yellow(` Token budget at ${Math.round(preflight.utilizationRatio * 100)}%. Older rounds will be summarized on resume failure.`));\n }\n\n // Auto-rollover on session overflow\n const overflowCheck = sessionMgr.preCallOverflowCheck(unifiedSession.id);\n if (overflowCheck.rolled) {\n console.error(chalk.yellow(` ${overflowCheck.message}`));\n existingSessionId = undefined; // Don't reuse old thread after rollover\n }\n\n try {\n // Call GPT via codex with session resume + progress feedback\n const progress = createProgressCallbacks('debate');\n let result = await (adapter as CliAdapter).callWithResume(prompt, {\n sessionId: existingSessionId,\n timeout,\n ...progress,\n });\n\n // Detect resume outcome\n const resumed = attemptedResume && result.sessionId === existingSessionId;\n const resumeFailed = attemptedResume && !resumed;\n\n // If resume failed, reconstruct context from stored history and retry\n if (resumeFailed && result.text.length < 50) {\n console.error(chalk.yellow(' Resume failed with minimal response. Reconstructing from ledger...'));\n const history = msgStore.getHistory(debateId);\n const reconstructed = buildReconstructionPrompt(history, prompt);\n result = await (adapter as CliAdapter).callWithResume(reconstructed, {\n timeout,\n ...progress,\n });\n }\n\n // Warn about possible codex output truncation\n if (result.text.length < 200 && (result.durationMs ?? 0) > 60_000) {\n console.error(chalk.yellow(` Warning: GPT response is only ${result.text.length} chars after ${Math.round((result.durationMs ?? 0) / 1000)}s — possible output truncation (codex may have spent its turn on tool calls).`));\n }\n\n // Parse verdict from response\n const verdict = parseDebateVerdict(result.text);\n\n // Mark completed in message ledger\n const completed = msgStore.markCompleted(msgId, {\n responseText: result.text,\n verdict,\n usageJson: JSON.stringify(result.usage),\n durationMs: result.durationMs ?? 0,\n sessionId: result.sessionId ?? null,\n });\n if (!completed) {\n console.error(chalk.red(`Message ${msgId} ledger transition to completed failed (possible concurrent invocation or state drift).`));\n db.close();\n process.exit(1);\n }\n\n // Track resume failure\n if (resumeFailed) {\n store.incrementResumeFailCount(debateId, 'critic');\n }\n\n // Update unified session with thread ID and token usage\n if (result.sessionId) {\n sessionMgr.updateThreadId(unifiedSession.id, result.sessionId);\n }\n sessionMgr.addUsageFromResult(unifiedSession.id, result.usage, prompt, result.text);\n\n // Record event in session audit trail\n sessionMgr.recordEvent({\n sessionId: unifiedSession.id,\n command: 'debate',\n subcommand: 'turn',\n promptPreview: prompt.slice(0, 500),\n responsePreview: result.text.slice(0, 500),\n promptFull: prompt,\n responseFull: result.text,\n usageJson: JSON.stringify(result.usage),\n durationMs: result.durationMs,\n codexThreadId: result.sessionId,\n });\n\n // Persist session state in debate_turns (legacy mirror)\n store.upsert({\n debateId,\n role: 'critic',\n codexSessionId: result.sessionId ?? existingSessionId,\n round: newRound,\n status: 'active',\n });\n\n // Update proposer state with resume stats (defensive for older state_json without resumeStats)\n const proposerState = store.loadState(debateId, 'proposer');\n if (proposerState) {\n const stats = proposerState.resumeStats ?? { attempted: 0, succeeded: 0, fallbacks: 0 };\n if (attemptedResume) stats.attempted++;\n if (resumed) stats.succeeded++;\n if (resumeFailed) stats.fallbacks++;\n proposerState.resumeStats = stats;\n store.saveState(debateId, 'proposer', proposerState);\n }\n\n // Output JSON for the /debate skill to parse\n const output = {\n debateId,\n round: newRound,\n response: result.text.slice(0, 2000),\n responseTruncated: result.text.length > 2000,\n sessionId: result.sessionId,\n resumed,\n cached: false,\n stance: verdict.stance,\n usage: result.usage,\n durationMs: result.durationMs,\n };\n // Human-readable summary on stderr\n const stanceColor = verdict.stance === 'SUPPORT' ? chalk.green :\n verdict.stance === 'OPPOSE' ? chalk.red : chalk.yellow;\n console.error(stanceColor(`\\nRound ${newRound} — Stance: ${verdict.stance}`));\n // Show first 3 meaningful lines of the response\n const previewLines = result.text.split('\\n').filter(l => l.trim().length > 10).slice(0, 3);\n for (const line of previewLines) {\n console.error(chalk.dim(` ${line.trim().slice(0, 120)}`));\n }\n console.error(chalk.dim(`Duration: ${(result.durationMs / 1000).toFixed(1)}s | Tokens: ${result.usage?.totalTokens ?? '?'} | Resumed: ${resumed}`));\n\n console.log(JSON.stringify(output, null, 2));\n } catch (error) {\n // Mark failed in message ledger\n msgStore.markFailed(msgId, error instanceof Error ? error.message : String(error));\n throw error;\n }\n\n db.close();\n } catch (error) {\n db?.close();\n console.error(chalk.red(`Error: ${error instanceof Error ? error.message : String(error)}`));\n process.exit(1);\n }\n}\n\n// ── codemoot debate status ──\n\nexport async function debateStatusCommand(debateId: string): Promise<void> {\n let db: ReturnType<typeof openDatabase> | undefined;\n try {\n const dbPath = getDbPath();\n db = openDatabase(dbPath);\n const store = new DebateStore(db);\n\n const turns = store.getByDebateId(debateId);\n if (turns.length === 0) {\n db.close();\n console.error(chalk.red(`No debate found with ID: ${debateId}`));\n process.exit(1);\n }\n\n const state = store.loadState(debateId, 'proposer');\n const msgStore = new MessageStore(db);\n const msgHistory = msgStore.getHistory(debateId);\n const tokenStatus = getTokenBudgetStatus(msgHistory, 400_000);\n\n const output = {\n debateId,\n topic: state?.question ?? 'unknown',\n status: turns.some((t: DebateTurnRow) => t.status === 'active') ? 'active' : turns[0].status,\n round: Math.max(...turns.map((t: DebateTurnRow) => t.round)),\n participants: turns.map((t: DebateTurnRow) => ({\n role: t.role,\n codexSessionId: t.codexSessionId,\n round: t.round,\n status: t.status,\n resumeFailCount: t.resumeFailCount,\n lastActivity: new Date(t.lastActivityAt).toISOString(),\n })),\n resumeStats: state?.resumeStats ?? null,\n tokenBudget: {\n used: tokenStatus.totalTokensUsed,\n max: tokenStatus.maxContextTokens,\n utilization: `${Math.round(tokenStatus.utilizationRatio * 100)}%`,\n messages: msgHistory.length,\n },\n };\n console.log(JSON.stringify(output, null, 2));\n\n db.close();\n } catch (error) {\n db?.close();\n console.error(chalk.red(`Error: ${error instanceof Error ? error.message : String(error)}`));\n process.exit(1);\n }\n}\n\n// ── codemoot debate list ──\n\ninterface ListOptions {\n status?: string;\n limit?: number;\n}\n\nexport async function debateListCommand(options: ListOptions): Promise<void> {\n let db: ReturnType<typeof openDatabase> | undefined;\n try {\n const dbPath = getDbPath();\n db = openDatabase(dbPath);\n const store = new DebateStore(db);\n\n const desiredLimit = options.limit ?? 20;\n // Fetch extra rows since each debate has ~2 participant rows; limit after grouping\n const rows = store.list({\n status: options.status as 'active' | 'completed' | undefined,\n limit: desiredLimit * 3,\n });\n\n // Group by debate_id\n const debates = new Map<string, typeof rows>();\n for (const row of rows) {\n const existing = debates.get(row.debateId) ?? [];\n existing.push(row);\n debates.set(row.debateId, existing);\n }\n\n const output = Array.from(debates.entries()).slice(0, desiredLimit).map(([id, turns]) => {\n const state = store.loadState(id, 'proposer');\n return {\n debateId: id,\n topic: state?.question ?? 'unknown',\n status: turns.some((t: DebateTurnRow) => t.status === 'active') ? 'active' : turns[0].status,\n round: Math.max(...turns.map((t: DebateTurnRow) => t.round)),\n lastActivity: new Date(Math.max(...turns.map((t: DebateTurnRow) => t.lastActivityAt))).toISOString(),\n };\n });\n\n console.log(JSON.stringify(output, null, 2));\n\n db.close();\n } catch (error) {\n db?.close();\n console.error(chalk.red(`Error: ${error instanceof Error ? error.message : String(error)}`));\n process.exit(1);\n }\n}\n\n// ── codemoot debate history ──\n\nexport async function debateHistoryCommand(debateId: string): Promise<void> {\n let db: ReturnType<typeof openDatabase> | undefined;\n try {\n const dbPath = getDbPath();\n db = openDatabase(dbPath);\n const msgStore = new MessageStore(db);\n\n const history = msgStore.getHistory(debateId);\n if (history.length === 0) {\n // Check if the debate exists but predates message persistence (Phase 1)\n const debateStore = new DebateStore(db);\n const turns = debateStore.getByDebateId(debateId);\n if (turns.length > 0) {\n console.error(chalk.yellow(`No messages stored for debate ${debateId} — this debate predates message persistence (schema v4). Only metadata is available via \"debate status\".`));\n } else {\n console.error(chalk.red(`No debate found with ID: ${debateId}`));\n }\n db.close();\n process.exit(1);\n }\n\n const tokenStatus = getTokenBudgetStatus(history, 400_000);\n\n const output = {\n debateId,\n messageCount: history.length,\n tokenBudget: {\n used: tokenStatus.totalTokensUsed,\n max: tokenStatus.maxContextTokens,\n utilization: `${Math.round(tokenStatus.utilizationRatio * 100)}%`,\n },\n messages: history.map(m => ({\n round: m.round,\n role: m.role,\n bridge: m.bridge,\n model: m.model,\n status: m.status,\n stance: m.stance,\n confidence: m.confidence,\n durationMs: m.durationMs,\n sessionId: m.sessionId,\n promptPreview: m.promptText.slice(0, 200),\n responsePreview: m.responseText?.slice(0, 200) ?? null,\n error: m.error,\n createdAt: new Date(m.createdAt).toISOString(),\n completedAt: m.completedAt ? new Date(m.completedAt).toISOString() : null,\n })),\n };\n\n console.log(JSON.stringify(output, null, 2));\n db.close();\n } catch (error) {\n db?.close();\n console.error(chalk.red(`Error: ${error instanceof Error ? error.message : String(error)}`));\n process.exit(1);\n }\n}\n\n// ── codemoot debate complete ──\n\nexport async function debateCompleteCommand(debateId: string): Promise<void> {\n let db: ReturnType<typeof openDatabase> | undefined;\n try {\n const dbPath = getDbPath();\n db = openDatabase(dbPath);\n const store = new DebateStore(db);\n\n const turns = store.getByDebateId(debateId);\n if (turns.length === 0) {\n console.error(chalk.red(`No debate found with ID: ${debateId}`));\n db.close();\n process.exit(1);\n }\n\n const completeTransaction = db.transaction(() => {\n store.updateStatus(debateId, 'proposer', 'completed');\n store.updateStatus(debateId, 'critic', 'completed');\n });\n completeTransaction();\n\n console.log(JSON.stringify({ debateId, status: 'completed' }));\n db.close();\n } catch (error) {\n db?.close();\n console.error(chalk.red(`Error: ${error instanceof Error ? error.message : String(error)}`));\n process.exit(1);\n }\n}\n\n","// packages/cli/src/commands/cleanup.ts — AI slop scanner with 3-way merge (deterministic + codex + host)\n\nimport type { CleanupFinding, CleanupReport, CleanupScope } from '@codemoot/core';\nimport {\n BuildStore,\n CliAdapter,\n JobStore,\n ModelRegistry,\n SessionManager,\n buildHandoffEnvelope,\n computeThreeWayStats,\n createIgnoreFilter,\n generateId,\n hostFindingsSchema,\n loadConfig,\n mergeThreeWay,\n openDatabase,\n recalculateConfidenceStats,\n runAllScanners,\n} from '@codemoot/core';\nimport chalk from 'chalk';\nimport { readFileSync } from 'node:fs';\n\nimport { createProgressCallbacks } from '../progress.js';\nimport { getDbPath } from '../utils.js';\n\ninterface CleanupOptions {\n scope: string;\n timeout: number;\n maxDisputes: number;\n hostFindings?: string;\n background?: boolean;\n output?: string;\n noGitignore?: boolean;\n quiet?: boolean;\n}\n\nexport async function cleanupCommand(path: string, options: CleanupOptions): Promise<void> {\n let db: ReturnType<typeof openDatabase> | undefined;\n try {\n const { resolve } = await import('node:path');\n const projectDir = resolve(path);\n\n // ── Background mode: enqueue and return immediately ──\n if (options.background) {\n const bgDb = openDatabase(getDbPath());\n const jobStore = new JobStore(bgDb);\n const jobId = jobStore.enqueue({\n type: 'cleanup',\n payload: { path: projectDir, scope: options.scope, timeout: options.timeout, maxDisputes: options.maxDisputes, hostFindings: options.hostFindings, output: options.output },\n });\n console.log(JSON.stringify({ jobId, status: 'queued', message: 'Cleanup enqueued. Check with: codemoot jobs status ' + jobId }));\n bgDb.close();\n return;\n }\n\n const scopes = options.scope === 'all'\n ? ['deps', 'unused-exports', 'hardcoded', 'duplicates', 'deadcode', 'security', 'near-duplicates', 'anti-patterns'] as CleanupScope[]\n : [options.scope as CleanupScope];\n\n const dbPath = getDbPath();\n db = openDatabase(dbPath);\n const buildStore = new BuildStore(db);\n const buildId = generateId();\n const startTime = Date.now();\n\n // Create build run for tracking\n buildStore.create({ buildId, task: `cleanup:${options.scope}` });\n\n console.error(chalk.cyan(`Cleanup scan started (ID: ${buildId})`));\n console.error(chalk.cyan(`Scopes: ${scopes.join(', ')}`));\n console.error(chalk.cyan(`Project: ${projectDir}`));\n\n // ── Load host findings if provided ──\n let hostFindings: CleanupFinding[] = [];\n if (options.hostFindings) {\n console.error(chalk.cyan(`Host findings: ${options.hostFindings}`));\n try {\n const raw = readFileSync(options.hostFindings, 'utf-8');\n const parsed = JSON.parse(raw);\n const validated = hostFindingsSchema.parse(parsed);\n\n hostFindings = validated.map(f => ({\n key: `${f.scope}:${f.file}:${f.symbol}`,\n scope: f.scope as CleanupScope,\n confidence: f.confidence as CleanupFinding['confidence'],\n file: f.file,\n line: f.line,\n description: f.description,\n recommendation: f.recommendation,\n deterministicEvidence: [],\n semanticEvidence: [],\n hostEvidence: [`Host: ${f.description}`],\n sources: ['host'] as CleanupFinding['sources'],\n disputed: false,\n }));\n console.error(chalk.dim(` [host] Loaded ${hostFindings.length} findings`));\n } catch (err) {\n console.error(chalk.red(`Failed to load host findings: ${err instanceof Error ? err.message : String(err)}`));\n db.close();\n process.exit(1);\n }\n }\n\n // ── Build ignore filter ──\n const ig = createIgnoreFilter(projectDir, { skipGitignore: options.noGitignore });\n\n // ── Phase 1: Parallel scan ──\n console.error(chalk.yellow('\\nPhase 1: Scanning (parallel)...'));\n\n // Resolve codex adapter\n let codexAdapter: CliAdapter | null = null;\n try {\n const config = loadConfig();\n const registry = ModelRegistry.fromConfig(config, projectDir);\n try {\n codexAdapter = registry.getAdapter('codex-reviewer') as CliAdapter;\n } catch {\n try {\n codexAdapter = registry.getAdapter('codex-architect') as CliAdapter;\n } catch { /* no adapter */ }\n }\n } catch { /* config not found */ }\n\n // Resolve unified session\n const sessionMgr = new SessionManager(db);\n const session = sessionMgr.resolveActive('cleanup');\n const overflowCheck = sessionMgr.preCallOverflowCheck(session.id);\n if (overflowCheck.rolled) {\n console.error(chalk.yellow(` ${overflowCheck.message}`));\n }\n const currentSession = sessionMgr.get(session.id);\n const sessionThreadId = currentSession?.codexThreadId ?? undefined;\n\n // Run both scanners in parallel\n const [deterministicFindings, semanticFindings] = await Promise.all([\n Promise.resolve().then(() => {\n console.error(chalk.dim(' [deterministic] Starting...'));\n const findings = runAllScanners(projectDir, scopes, ig);\n console.error(chalk.dim(` [deterministic] Done: ${findings.length} findings`));\n return findings;\n }),\n runCodexScan(codexAdapter, projectDir, scopes, options.timeout, sessionMgr, session.id, sessionThreadId),\n ]);\n\n // Record scan event\n buildStore.updateWithEvent(\n buildId,\n { status: 'reviewing', currentPhase: 'review', metadata: { cleanupPhase: 'scan' } },\n {\n eventType: 'scan_completed',\n actor: 'system',\n phase: 'review',\n payload: {\n deterministicCount: deterministicFindings.length,\n semanticCount: semanticFindings.length,\n hostCount: hostFindings.length,\n },\n },\n );\n\n // ── Phase 2: 3-way merge ──\n console.error(chalk.yellow('\\nPhase 2: Merging findings (3-way)...'));\n\n const mergedFindings = mergeThreeWay(deterministicFindings, semanticFindings, hostFindings);\n const stats = computeThreeWayStats(deterministicFindings, semanticFindings, hostFindings, mergedFindings);\n\n console.error(chalk.dim(` Merged: ${mergedFindings.length} total, ${stats.agreed} agreed, ${stats.disputed} disputed`));\n if (hostFindings.length > 0) {\n console.error(chalk.dim(` Sources: deterministic=${stats.deterministic}, codex=${stats.semantic}, host=${stats.host}`));\n }\n\n buildStore.updateWithEvent(\n buildId,\n { metadata: { cleanupPhase: 'merge' } },\n {\n eventType: 'merge_completed',\n actor: 'system',\n phase: 'review',\n payload: { totalFindings: mergedFindings.length, ...stats },\n },\n );\n\n // ── Phase 2.5: Adjudicate disputed findings ──\n const hasAdjudicatable = stats.disputed > 0 || mergedFindings.some(f => f.confidence === 'medium');\n if (codexAdapter && hasAdjudicatable && options.maxDisputes > 0) {\n console.error(chalk.yellow(`\\nPhase 2.5: Adjudicating up to ${options.maxDisputes} disputed findings...`));\n await adjudicateFindings(codexAdapter, mergedFindings, options.maxDisputes, stats);\n\n buildStore.updateWithEvent(\n buildId,\n { metadata: { cleanupPhase: 'adjudicate' } },\n {\n eventType: 'adjudicated',\n actor: 'codex',\n phase: 'review',\n payload: { adjudicated: stats.adjudicated },\n },\n );\n }\n\n // ── Phase 3: Output report ──\n const durationMs = Date.now() - startTime;\n\n const actionableScopes = new Set<CleanupScope>(['deps', 'unused-exports', 'hardcoded']);\n const actionableCount = mergedFindings.filter(f =>\n actionableScopes.has(f.scope) && (f.confidence === 'high' || f.confidence === 'medium'),\n ).length;\n\n const report: CleanupReport = {\n scopes,\n findings: mergedFindings.sort((a, b) => {\n const confOrder = { high: 0, medium: 1, low: 2 };\n const confDiff = confOrder[a.confidence] - confOrder[b.confidence];\n if (confDiff !== 0) return confDiff;\n return a.key.localeCompare(b.key);\n }),\n stats,\n durationMs,\n };\n\n buildStore.updateWithEvent(\n buildId,\n { status: 'completed', currentPhase: 'done', completedAt: Date.now() },\n {\n eventType: 'phase_transition',\n actor: 'system',\n phase: 'done',\n payload: {\n totalFindings: mergedFindings.length,\n actionable: actionableCount,\n reportOnly: mergedFindings.length - actionableCount,\n },\n },\n );\n\n console.error(chalk.green(`\\nScan complete in ${(durationMs / 1000).toFixed(1)}s`));\n console.error(chalk.green(`Build ID: ${buildId}`));\n console.error(` Actionable: ${chalk.red(String(actionableCount))}`);\n console.error(` Report-only: ${chalk.dim(String(mergedFindings.length - actionableCount))}`);\n console.error(` High: ${stats.highConfidence} | Medium: ${stats.mediumConfidence} | Low: ${stats.lowConfidence}`);\n if (stats.adjudicated > 0) console.error(` Adjudicated: ${stats.adjudicated}`);\n\n // ── Human-readable summary (stderr) ──\n if (!options.quiet && mergedFindings.length > 0) {\n console.error(chalk.yellow('\\n── Findings Summary ──'));\n const byScope = new Map<string, CleanupFinding[]>();\n for (const f of report.findings) {\n const arr = byScope.get(f.scope) ?? [];\n arr.push(f);\n byScope.set(f.scope, arr);\n }\n for (const [scope, items] of byScope) {\n const high = items.filter(f => f.confidence === 'high').length;\n const med = items.filter(f => f.confidence === 'medium').length;\n const low = items.filter(f => f.confidence === 'low').length;\n console.error(chalk.cyan(`\\n ${scope} (${items.length})`));\n // Show up to 5 high/medium findings per scope\n for (const f of items.filter(i => i.confidence !== 'low').slice(0, 5)) {\n const conf = f.confidence === 'high' ? chalk.red('HIGH') : chalk.yellow('MED');\n const loc = f.line ? `${f.file}:${f.line}` : f.file;\n console.error(` ${conf} ${loc} — ${f.description}`);\n }\n if (high + med > 5) {\n console.error(chalk.dim(` ... and ${high + med - 5} more`));\n }\n if (low > 0) {\n console.error(chalk.dim(` + ${low} low-confidence (report-only)`));\n }\n }\n console.error('');\n }\n\n // Persist findings in session_events.response_full\n sessionMgr.recordEvent({\n sessionId: session.id,\n command: 'cleanup',\n subcommand: 'report',\n promptPreview: `Cleanup: ${scopes.join(', ')} on ${projectDir}`,\n responsePreview: `${mergedFindings.length} findings (${stats.highConfidence} high, ${stats.mediumConfidence} med, ${stats.lowConfidence} low)`,\n responseFull: JSON.stringify(report),\n durationMs,\n });\n\n // --output: write findings to file\n if (options.output) {\n const { writeFileSync } = await import('node:fs');\n // Write directly (atomic rename fails on Windows if target exists)\n writeFileSync(options.output, JSON.stringify(report, null, 2), 'utf-8');\n console.error(chalk.green(` Findings written to ${options.output}`));\n }\n\n const reportJson = JSON.stringify(report, null, 2);\n console.log(reportJson.length > 2000 ? `${reportJson.slice(0, 2000)}\\n... (truncated, ${reportJson.length} chars total — use --output to save full report)` : reportJson);\n\n db.close();\n } catch (error) {\n db?.close();\n console.error(chalk.red(`Error: ${error instanceof Error ? error.message : String(error)}`));\n process.exit(1);\n }\n}\n\n// ── Codex semantic scan ──\n\nasync function runCodexScan(\n adapter: CliAdapter | null,\n _projectDir: string,\n scopes: CleanupScope[],\n timeoutSec: number,\n sessionMgr?: SessionManager,\n sessionId?: string,\n sessionThreadId?: string,\n): Promise<CleanupFinding[]> {\n if (!adapter) {\n console.error(chalk.yellow(' [codex] No adapter available — skipping semantic scan'));\n return [];\n }\n\n console.error(chalk.dim(' [codex] Starting semantic scan...'));\n\n const scopeDescriptions = scopes.map(s => {\n if (s === 'deps') return 'unused dependencies (check each package.json dep, including dynamic imports)';\n if (s === 'unused-exports') return 'unused exports (exported but never imported anywhere)';\n if (s === 'hardcoded') return 'hardcoded values (magic numbers, URLs, credentials)';\n if (s === 'duplicates') return 'duplicate logic (similar function bodies across files)';\n if (s === 'deadcode') return 'dead code (unreachable or unused internal code)';\n return s;\n }).join(', ');\n\n const prompt = buildHandoffEnvelope({\n command: 'cleanup',\n task: `Scan this codebase for AI slop and code quality issues.\n\nSCAN FOR: ${scopeDescriptions}\n\nWhere scope/confidence/file/line/symbol fields are:\n- scope: deps, unused-exports, hardcoded, duplicates, or deadcode\n- confidence: high, medium, or low\n- file: relative path from project root (forward slashes)\n- line: line number (or 0 if N/A)\n- symbol: the specific identifier (dep name, export name, variable name, or content hash)\n\nIMPORTANT KEY FORMAT: The key will be built as scope:file:symbol — use the SAME symbol that a static scanner would use:\n- deps: the package name (e.g. \"lodash\")\n- unused-exports: the export name (e.g. \"myFunction\")\n- hardcoded: for numbers use \"num:VALUE:LLINE\" (e.g. \"num:42:L15\"), for URLs use \"url:HOSTNAME:LLINE\" (e.g. \"url:api.example.com:L20\"), for credentials use \"cred:LLINE\" (e.g. \"cred:L15\")\n- duplicates: \"HASH:FUNCNAME\" where HASH is first 8 chars of md5 of normalized body (e.g. \"a1b2c3d4:myFunction\")\n- deadcode: the function/variable name`,\n constraints: [\n 'Be thorough but precise. Only report real issues you can verify.',\n 'Check for dynamic imports (import()) before flagging unused deps',\n 'Check barrel re-exports and index files before flagging unused exports',\n 'Check type-only imports (import type)',\n 'Check framework conventions and cross-package monorepo dependencies',\n ],\n resumed: Boolean(sessionThreadId),\n });\n\n try {\n const progress = createProgressCallbacks('cleanup-scan');\n const result = await adapter.callWithResume(prompt, { sessionId: sessionThreadId, timeout: timeoutSec * 1000, ...progress });\n\n // Update unified session\n if (sessionMgr && sessionId) {\n if (result.sessionId) {\n sessionMgr.updateThreadId(sessionId, result.sessionId);\n }\n sessionMgr.addUsageFromResult(sessionId, result.usage, prompt, result.text);\n sessionMgr.recordEvent({\n sessionId,\n command: 'cleanup',\n subcommand: 'scan',\n promptPreview: `Cleanup scan: ${scopes.join(', ')}`,\n responsePreview: result.text.slice(0, 500),\n usageJson: JSON.stringify(result.usage),\n durationMs: result.durationMs,\n codexThreadId: result.sessionId,\n });\n }\n\n const findings: CleanupFinding[] = [];\n for (const line of result.text.split('\\n')) {\n const match = line.match(/^FINDING:\\s*([^|]+)\\|([^|]+)\\|([^|]+)\\|(\\d+)\\|([^|]+)\\|([^|]+)\\|(.+)/);\n if (match) {\n const scope = match[1].trim() as CleanupScope;\n if (!scopes.includes(scope)) continue;\n\n const file = match[3].trim();\n const symbol = match[5].trim();\n findings.push({\n key: `${scope}:${file}:${symbol}`,\n scope,\n confidence: match[2].trim() as CleanupFinding['confidence'],\n file,\n line: Number.parseInt(match[4], 10) || undefined,\n description: match[6].trim(),\n recommendation: match[7].trim(),\n deterministicEvidence: [],\n semanticEvidence: [`Codex: ${match[6].trim()}`],\n hostEvidence: [],\n sources: ['semantic'],\n disputed: false,\n });\n }\n }\n\n console.error(chalk.dim(` [codex] Done: ${findings.length} findings`));\n return findings;\n } catch (error) {\n console.error(chalk.yellow(` [codex] Scan failed: ${error instanceof Error ? error.message : String(error)}`));\n return [];\n }\n}\n\n// ── Adjudication ──\n\nasync function adjudicateFindings(\n adapter: CliAdapter,\n findings: CleanupFinding[],\n maxDisputes: number,\n stats: CleanupReport['stats'],\n): Promise<void> {\n const toAdjudicate = findings\n .filter(f => f.disputed || f.confidence === 'medium')\n .slice(0, maxDisputes);\n\n for (const finding of toAdjudicate) {\n try {\n const allEvidence = [...finding.deterministicEvidence, ...finding.semanticEvidence, ...finding.hostEvidence];\n const prompt = buildHandoffEnvelope({\n command: 'adjudicate',\n task: `Verify this finding.\\n\\nFINDING: ${finding.description}\\nFILE: ${finding.file}${finding.line ? `:${finding.line}` : ''}\\nSCOPE: ${finding.scope}\\nSOURCES: ${finding.sources.join(', ')}\\nEVIDENCE: ${allEvidence.join('; ')}`,\n constraints: ['Check for dynamic imports, barrel re-exports, type-only usage, runtime/indirect usage'],\n resumed: false,\n });\n\n const adjProgress = createProgressCallbacks('adjudicate');\n const result = await adapter.callWithResume(prompt, { timeout: 60_000, ...adjProgress });\n\n const match = result.text.match(/ADJUDICATE:\\s*(CONFIRMED|DISMISSED|UNCERTAIN)\\s+(.*)/);\n if (match) {\n const verdict = match[1];\n if (verdict === 'CONFIRMED') {\n finding.confidence = 'high';\n finding.semanticEvidence.push(`Adjudicated: CONFIRMED — ${match[2]}`);\n } else if (verdict === 'DISMISSED') {\n finding.confidence = 'low';\n finding.semanticEvidence.push(`Adjudicated: DISMISSED — ${match[2]}`);\n } else {\n // UNCERTAIN — keep disputed, don't count as adjudicated\n finding.semanticEvidence.push(`Adjudicated: UNCERTAIN — ${match[2]}`);\n continue;\n }\n finding.disputed = false;\n stats.adjudicated++;\n }\n } catch {\n // Adjudication failed — keep as-is\n }\n }\n\n recalculateConfidenceStats(findings, stats);\n}\n","// packages/cli/src/commands/cost.ts — Cost and usage dashboard\n\nimport { openDatabase, SessionManager } from '@codemoot/core';\nimport chalk from 'chalk';\n\nimport { getDbPath } from '../utils.js';\n\ninterface CostOptions {\n scope: string;\n days: number;\n session?: string;\n}\n\ninterface UsageRow {\n command: string;\n subcommand: string;\n usage_json: string;\n duration_ms: number;\n created_at: number;\n}\n\nfunction parseUsage(usageJson: string): { input: number; output: number; total: number } {\n try {\n const u = JSON.parse(usageJson);\n const input = u.inputTokens ?? u.input_tokens ?? 0;\n const output = u.outputTokens ?? u.output_tokens ?? 0;\n const total = u.totalTokens ?? u.total_tokens ?? input + output;\n return { input, output, total };\n } catch {\n return { input: 0, output: 0, total: 0 };\n }\n}\n\nexport async function costCommand(options: CostOptions): Promise<void> {\n const db = openDatabase(getDbPath());\n\n try {\n let rows: UsageRow[];\n let scopeLabel: string;\n\n if (options.scope === 'session') {\n const sessionMgr = new SessionManager(db);\n const session = options.session\n ? sessionMgr.get(options.session)\n : sessionMgr.resolveActive('cost');\n if (!session) {\n console.error(chalk.red(options.session ? `Session not found: ${options.session}` : 'No active session. Run: codemoot init'));\n db.close();\n process.exit(1);\n }\n rows = db\n .prepare(\n 'SELECT command, subcommand, usage_json, duration_ms, created_at FROM session_events WHERE session_id = ? ORDER BY created_at ASC',\n )\n .all(session.id) as UsageRow[];\n scopeLabel = `session ${session.id.slice(0, 8)}`;\n } else if (options.scope === 'all') {\n rows = db\n .prepare(\n 'SELECT command, subcommand, usage_json, duration_ms, created_at FROM session_events ORDER BY created_at ASC',\n )\n .all() as UsageRow[];\n scopeLabel = 'all-time';\n } else {\n const cutoff = Date.now() - options.days * 24 * 60 * 60 * 1000;\n rows = db\n .prepare(\n 'SELECT command, subcommand, usage_json, duration_ms, created_at FROM session_events WHERE created_at > ? ORDER BY created_at ASC',\n )\n .all(cutoff) as UsageRow[];\n scopeLabel = `last ${options.days} days`;\n }\n\n let totalInput = 0;\n let totalOutput = 0;\n let totalTokens = 0;\n let totalDuration = 0;\n const byCommand: Record<string, { calls: number; tokens: number; durationMs: number }> = {};\n const byDay: Record<string, { calls: number; tokens: number }> = {};\n\n for (const row of rows) {\n const usage = parseUsage(row.usage_json);\n totalInput += usage.input;\n totalOutput += usage.output;\n totalTokens += usage.total;\n totalDuration += row.duration_ms ?? 0;\n\n const cmd = row.command ?? 'unknown';\n if (!byCommand[cmd]) byCommand[cmd] = { calls: 0, tokens: 0, durationMs: 0 };\n byCommand[cmd].calls++;\n byCommand[cmd].tokens += usage.total;\n byCommand[cmd].durationMs += row.duration_ms ?? 0;\n\n const day = new Date(row.created_at).toISOString().slice(0, 10);\n if (!byDay[day]) byDay[day] = { calls: 0, tokens: 0 };\n byDay[day].calls++;\n byDay[day].tokens += usage.total;\n }\n\n const output = {\n scope: scopeLabel,\n totalCalls: rows.length,\n totalTokens,\n totalInputTokens: totalInput,\n totalOutputTokens: totalOutput,\n totalDurationMs: totalDuration,\n avgTokensPerCall: rows.length > 0 ? Math.round(totalTokens / rows.length) : 0,\n avgDurationMs: rows.length > 0 ? Math.round(totalDuration / rows.length) : 0,\n byCommand,\n byDay,\n };\n\n console.log(JSON.stringify(output, null, 2));\n db.close();\n } catch (error) {\n db.close();\n console.error(chalk.red(`Error: ${error instanceof Error ? error.message : String(error)}`));\n process.exit(1);\n }\n}\n","// packages/cli/src/commands/doctor.ts — Preflight diagnostics for CodeMoot\n\nimport { existsSync, accessSync, constants } from 'node:fs';\nimport { execSync } from 'node:child_process';\nimport { join } from 'node:path';\nimport chalk from 'chalk';\nimport { VERSION } from '@codemoot/core';\n\ninterface Check {\n name: string;\n status: 'pass' | 'warn' | 'fail';\n message: string;\n fix?: string;\n}\n\nexport async function doctorCommand(): Promise<void> {\n const cwd = process.cwd();\n const checks: Check[] = [];\n\n console.error(chalk.cyan(`\\n CodeMoot Doctor v${VERSION}\\n`));\n\n // 1. Codex CLI\n try {\n const version = execSync('codex --version', { stdio: 'pipe', encoding: 'utf-8' }).trim();\n checks.push({ name: 'codex-cli', status: 'pass', message: `Codex CLI ${version}` });\n } catch {\n checks.push({\n name: 'codex-cli',\n status: 'fail',\n message: 'Codex CLI not found in PATH',\n fix: 'npm install -g @openai/codex',\n });\n }\n\n // 2. Config file\n const configPath = join(cwd, '.cowork.yml');\n if (existsSync(configPath)) {\n checks.push({ name: 'config', status: 'pass', message: '.cowork.yml found' });\n } else {\n checks.push({\n name: 'config',\n status: 'fail',\n message: '.cowork.yml not found',\n fix: 'codemoot init',\n });\n }\n\n // 3. Database writable\n const dbDir = join(cwd, '.cowork', 'db');\n const dbPath = join(dbDir, 'cowork.db');\n if (existsSync(dbDir)) {\n try {\n accessSync(dbDir, constants.W_OK);\n checks.push({\n name: 'database',\n status: existsSync(dbPath) ? 'pass' : 'warn',\n message: existsSync(dbPath) ? 'Database exists and writable' : 'Database directory exists, DB will be created on first use',\n });\n } catch {\n checks.push({\n name: 'database',\n status: 'fail',\n message: '.cowork/db/ is not writable',\n fix: 'Check file permissions on .cowork/db/',\n });\n }\n } else {\n checks.push({\n name: 'database',\n status: 'warn',\n message: '.cowork/db/ not found — will be created by codemoot init',\n fix: 'codemoot init',\n });\n }\n\n // 4. Git repo — traverse up to find .git\n let gitFound = false;\n let searchDir = cwd;\n while (searchDir) {\n if (existsSync(join(searchDir, '.git'))) {\n gitFound = true;\n break;\n }\n const parent = join(searchDir, '..');\n if (parent === searchDir) break;\n searchDir = parent;\n }\n if (gitFound) {\n checks.push({ name: 'git', status: 'pass', message: 'Git repository detected' });\n } else {\n checks.push({\n name: 'git',\n status: 'warn',\n message: 'Not a git repository — diff/shipit/watch features limited',\n });\n }\n\n // 5. Node version\n const nodeVersion = process.version;\n const major = Number.parseInt(nodeVersion.slice(1).split('.')[0], 10);\n if (major >= 18) {\n checks.push({ name: 'node', status: 'pass', message: `Node.js ${nodeVersion}` });\n } else {\n checks.push({\n name: 'node',\n status: 'fail',\n message: `Node.js ${nodeVersion} — requires >= 18`,\n fix: 'Install Node.js 18+',\n });\n }\n\n // 6. Schema version check\n if (existsSync(dbPath)) {\n try {\n const { openDatabase } = await import('@codemoot/core');\n const db = openDatabase(dbPath);\n const row = db.prepare('PRAGMA user_version').get() as { user_version: number } | undefined;\n const version = row?.user_version ?? 0;\n if (version >= 7) {\n checks.push({ name: 'schema', status: 'pass', message: `Schema version ${version}` });\n } else {\n checks.push({\n name: 'schema',\n status: 'warn',\n message: `Schema version ${version} — will auto-migrate on next command`,\n });\n }\n db.close();\n } catch {\n checks.push({ name: 'schema', status: 'warn', message: 'Could not read schema version' });\n }\n }\n\n // Print results\n let hasFailure = false;\n for (const check of checks) {\n const icon = check.status === 'pass'\n ? chalk.green('PASS')\n : check.status === 'warn'\n ? chalk.yellow('WARN')\n : chalk.red('FAIL');\n console.error(` ${icon} ${check.name}: ${check.message}`);\n if (check.fix) {\n console.error(chalk.dim(` → ${check.fix}`));\n }\n if (check.status === 'fail') hasFailure = true;\n }\n\n console.error('');\n\n // JSON output\n const output = {\n version: VERSION,\n checks,\n healthy: !hasFailure,\n };\n console.log(JSON.stringify(output, null, 2));\n\n if (hasFailure) {\n process.exit(1);\n }\n}\n","// packages/cli/src/commands/events.ts — Tail session events + job logs as JSONL\n\nimport { openDatabase } from '@codemoot/core';\nimport chalk from 'chalk';\n\nimport { getDbPath } from '../utils.js';\n\ninterface EventsOptions {\n follow: boolean;\n sinceSeq: number;\n limit: number;\n type: string;\n}\n\nexport async function eventsCommand(options: EventsOptions): Promise<void> {\n const db = openDatabase(getDbPath());\n\n const query =\n options.type === 'all'\n ? db.prepare(`\n SELECT 'session_event' as source, id, session_id, command, subcommand, prompt_preview, response_preview, usage_json, duration_ms, created_at\n FROM session_events\n WHERE id > ?\n ORDER BY id ASC\n LIMIT ?\n `)\n : options.type === 'jobs'\n ? db.prepare(`\n SELECT 'job_log' as source, id, job_id, seq, level, event_type, message, payload_json, created_at\n FROM job_logs\n WHERE id > ?\n ORDER BY id ASC\n LIMIT ?\n `)\n : db.prepare(`\n SELECT 'session_event' as source, id, session_id, command, subcommand, prompt_preview, response_preview, usage_json, duration_ms, created_at\n FROM session_events\n WHERE id > ?\n ORDER BY id ASC\n LIMIT ?\n `);\n\n let cursor = options.sinceSeq;\n\n const poll = () => {\n const rows = query.all(cursor, options.limit) as Record<string, unknown>[];\n for (const row of rows) {\n console.log(JSON.stringify(row));\n cursor = row.id as number;\n }\n return rows.length;\n };\n\n // Initial dump\n poll();\n\n if (!options.follow) {\n db.close();\n return;\n }\n\n // Follow mode: poll every 1s\n console.error(chalk.dim('Following events... (Ctrl+C to stop)'));\n\n const interval = setInterval(() => {\n poll();\n }, 1000);\n\n const shutdown = () => {\n clearInterval(interval);\n db.close();\n process.exit(0);\n };\n\n process.on('SIGINT', shutdown);\n process.on('SIGTERM', shutdown);\n}\n","// packages/cli/src/commands/fix.ts — Autofix loop: GPT reviews → CLI applies fixes → GPT re-reviews\n\nimport { execFileSync, execSync } from 'node:child_process';\nimport { readFileSync, writeFileSync } from 'node:fs';\nimport { resolve } from 'node:path';\nimport {\n type CliAdapter,\n DEFAULT_RULES,\n ModelRegistry,\n type PolicyContext,\n SessionManager,\n buildHandoffEnvelope,\n evaluatePolicy,\n loadConfig,\n openDatabase,\n REVIEW_DIFF_MAX_CHARS,\n} from '@codemoot/core';\nimport chalk from 'chalk';\n\nimport { createProgressCallbacks } from '../progress.js';\nimport { getDbPath } from '../utils.js';\n\ninterface FixOptions {\n maxRounds: number;\n focus: string;\n timeout: number;\n dryRun: boolean;\n diff?: string;\n session?: string;\n noStage?: boolean;\n}\n\ninterface ParsedFix {\n file: string;\n line: number;\n description: string;\n oldCode: string;\n newCode: string;\n}\n\ninterface FixRound {\n round: number;\n reviewVerdict: string;\n reviewScore: number | null;\n criticalCount: number;\n warningCount: number;\n fixesProposed: number;\n fixesApplied: number;\n fixesFailed: number;\n exitReason: string;\n durationMs: number;\n}\n\n/**\n * Parse FIX blocks from GPT review output.\n * Expected format:\n * FIX: <file>:<line> <description>\n * ```old\n * <old code>\n * ```\n * ```new\n * <new code>\n * ```\n *\n * Also supports simpler format:\n * FIX: <file>:<line> <description>\n * ```\n * <replacement code>\n * ```\n */\nfunction parseFixes(text: string): ParsedFix[] {\n const fixes: ParsedFix[] = [];\n\n // Match FIX: lines followed by code blocks\n const fixPattern = /FIX:\\s*(\\S+?):(\\d+)\\s+(.+?)(?:\\n```old\\n([\\s\\S]*?)\\n```\\s*\\n```new\\n([\\s\\S]*?)\\n```|(?:\\n```\\n([\\s\\S]*?)\\n```))/g;\n\n let match: RegExpExecArray | null;\n match = fixPattern.exec(text);\n while (match !== null) {\n const file = match[1];\n const line = Number.parseInt(match[2], 10);\n const description = match[3].trim();\n\n if (match[4] !== undefined && match[5] !== undefined) {\n // old/new format\n fixes.push({ file, line, description, oldCode: match[4], newCode: match[5] });\n } else if (match[6] !== undefined) {\n // Simple replacement format — we'll need the old code from the file\n fixes.push({ file, line, description, oldCode: '', newCode: match[6] });\n }\n match = fixPattern.exec(text);\n }\n\n return fixes;\n}\n\n/**\n * Apply a single fix to a file. Returns true if applied successfully.\n */\nfunction applyFix(fix: ParsedFix, projectDir: string): boolean {\n const filePath = resolve(projectDir, fix.file);\n\n // Path traversal guard: resolved path must stay within projectDir\n const normalizedProject = resolve(projectDir) + (process.platform === 'win32' ? '\\\\' : '/');\n if (!resolve(filePath).startsWith(normalizedProject)) {\n return false;\n }\n\n let content: string;\n try {\n content = readFileSync(filePath, 'utf-8');\n } catch {\n return false;\n }\n\n const lines = content.split('\\n');\n\n if (fix.oldCode) {\n // Exact string replacement\n const trimmedOld = fix.oldCode.trim();\n if (content.includes(trimmedOld)) {\n const updated = content.replace(trimmedOld, fix.newCode.trim());\n writeFileSync(filePath, updated, 'utf-8');\n return true;\n }\n return false;\n }\n\n // Line-based replacement (simple format)\n const lineIdx = fix.line - 1;\n if (lineIdx < 0 || lineIdx >= lines.length) return false;\n\n const newLines = fix.newCode.trim().split('\\n');\n // Replace the target line(s) with the new code\n const oldLineCount = Math.max(1, newLines.length);\n lines.splice(lineIdx, oldLineCount, ...newLines);\n writeFileSync(filePath, lines.join('\\n'), 'utf-8');\n return true;\n}\n\nexport async function fixCommand(fileOrGlob: string, options: FixOptions): Promise<void> {\n const projectDir = process.cwd();\n const db = openDatabase(getDbPath());\n const config = loadConfig();\n const registry = ModelRegistry.fromConfig(config, projectDir);\n const adapter =\n registry.tryGetAdapter('codex-reviewer') ?? registry.tryGetAdapter('codex-architect');\n\n if (!adapter) {\n try {\n execSync('codex --version', { stdio: 'pipe', encoding: 'utf-8' });\n } catch {\n console.error(chalk.red('Codex CLI is not installed or not in PATH.'));\n console.error(chalk.yellow('Install it: npm install -g @openai/codex'));\n db.close();\n process.exit(1);\n }\n console.error(chalk.red('No codex adapter found in config. Run: codemoot init'));\n db.close();\n process.exit(1);\n }\n\n const sessionMgr = new SessionManager(db);\n const session = options.session\n ? sessionMgr.get(options.session)\n : sessionMgr.resolveActive('fix');\n\n if (!session) {\n console.error(chalk.red(options.session\n ? `Session not found: ${options.session}`\n : 'No active session. Run: codemoot init'));\n db.close();\n process.exit(1);\n }\n\n const currentSession = sessionMgr.get(session.id);\n let threadId = currentSession?.codexThreadId ?? undefined;\n const rounds: FixRound[] = [];\n let converged = false;\n const stuckFingerprints = new Set<string>();\n let prevFingerprints = new Set<string>();\n\n console.error(\n chalk.cyan(\n `Autofix loop: ${fileOrGlob} (max ${options.maxRounds} rounds, focus: ${options.focus})`,\n ),\n );\n\n for (let round = 1; round <= options.maxRounds; round++) {\n const overflowCheck = sessionMgr.preCallOverflowCheck(session.id);\n if (overflowCheck.rolled) {\n console.error(chalk.yellow(` ${overflowCheck.message}`));\n threadId = undefined;\n }\n\n const roundStart = Date.now();\n console.error(chalk.dim(`\\n── Round ${round}/${options.maxRounds} ──`));\n\n // Step 1: GPT reviews and proposes fixes\n let diffContent = '';\n if (options.diff) {\n try {\n diffContent = execFileSync('git', ['diff', '--', ...options.diff.split(/\\s+/)], {\n cwd: projectDir,\n encoding: 'utf-8',\n maxBuffer: 1024 * 1024,\n });\n } catch {\n diffContent = '';\n }\n }\n\n const fixOutputContract = [\n 'You are an autofix engine. For EVERY fixable issue, you MUST output this EXACT format:',\n '',\n 'FIX: path/to/file.ts:42 Description of the bug',\n '```old',\n 'exact old code copied from the file',\n '```',\n '```new',\n 'exact replacement code',\n '```',\n '',\n 'Then end with:',\n 'VERDICT: APPROVED or VERDICT: NEEDS_REVISION',\n 'SCORE: X/10',\n '',\n 'Rules:',\n '- The ```old block MUST be an exact substring copy from the file (whitespace-sensitive).',\n '- One FIX block per issue.',\n '- Issues without a FIX block are IGNORED by the autofix engine.',\n '- If the code is clean, output VERDICT: APPROVED with no FIX blocks.',\n ].join('\\n');\n\n const reviewPrompt = buildHandoffEnvelope({\n command: 'custom',\n task: options.diff\n ? `Review and identify fixable issues in this diff.\\n\\nGIT DIFF (${options.diff}):\\n${diffContent.slice(0, REVIEW_DIFF_MAX_CHARS)}\\n\\n${fixOutputContract}`\n : `Review ${fileOrGlob} and identify fixable issues. Read the file(s) first, then report issues with exact line numbers and exact fixes.\\n\\n${fixOutputContract}`,\n constraints: [\n `Focus: ${options.focus}`,\n round > 1\n ? `This is re-review round ${round}. Previous fixes were applied by the host. Only report REMAINING unfixed issues.`\n : '',\n ].filter(Boolean),\n resumed: Boolean(threadId),\n });\n\n const timeoutMs = options.timeout * 1000;\n const progress = createProgressCallbacks('fix-review');\n\n console.error(chalk.dim(' GPT reviewing...'));\n const reviewResult = await (adapter as CliAdapter).callWithResume(reviewPrompt, {\n sessionId: threadId,\n timeout: timeoutMs,\n ...progress,\n });\n\n if (reviewResult.sessionId) {\n threadId = reviewResult.sessionId;\n sessionMgr.updateThreadId(session.id, reviewResult.sessionId);\n }\n sessionMgr.addUsageFromResult(session.id, reviewResult.usage, reviewPrompt, reviewResult.text);\n\n sessionMgr.recordEvent({\n sessionId: session.id,\n command: 'fix',\n subcommand: `review-round-${round}`,\n promptPreview: `Fix review round ${round}: ${fileOrGlob}`,\n responsePreview: reviewResult.text.slice(0, 500),\n promptFull: reviewPrompt,\n responseFull: reviewResult.text,\n usageJson: JSON.stringify(reviewResult.usage),\n durationMs: reviewResult.durationMs,\n codexThreadId: reviewResult.sessionId,\n });\n\n // Parse verdict\n const tail = reviewResult.text.slice(-500);\n const verdictMatch = tail.match(/VERDICT:\\s*(APPROVED|NEEDS_REVISION)/i);\n const scoreMatch = tail.match(/SCORE:\\s*(\\d+)\\/10/);\n const verdict = verdictMatch ? verdictMatch[1].toLowerCase() : 'unknown';\n const score = scoreMatch ? Number.parseInt(scoreMatch[1], 10) : null;\n const criticalCount = (reviewResult.text.match(/CRITICAL/gi) ?? []).length;\n const warningCount = (reviewResult.text.match(/WARNING/gi) ?? []).length;\n\n console.error(\n ` Verdict: ${verdict}, Score: ${score ?? '?'}/10, Critical: ${criticalCount}, Warning: ${warningCount}`,\n );\n\n // Check if approved\n if (verdict === 'approved' && criticalCount === 0) {\n rounds.push({\n round,\n reviewVerdict: verdict,\n reviewScore: score,\n criticalCount,\n warningCount,\n fixesProposed: 0,\n fixesApplied: 0,\n fixesFailed: 0,\n exitReason: 'all_resolved',\n durationMs: Date.now() - roundStart,\n });\n converged = true;\n console.error(chalk.green(' APPROVED — all issues resolved.'));\n break;\n }\n\n // Parse fixes from GPT output\n const fixes = parseFixes(reviewResult.text);\n console.error(chalk.dim(` Found ${fixes.length} fix proposal(s)`));\n\n if (fixes.length === 0) {\n rounds.push({\n round,\n reviewVerdict: verdict,\n reviewScore: score,\n criticalCount,\n warningCount,\n fixesProposed: 0,\n fixesApplied: 0,\n fixesFailed: 0,\n exitReason: 'no_fixes_proposed',\n durationMs: Date.now() - roundStart,\n });\n console.error(chalk.yellow(' GPT found issues but proposed no structured fixes. Stopping.'));\n break;\n }\n\n if (options.dryRun) {\n console.error(chalk.yellow(' Dry-run: showing proposed fixes without applying.'));\n for (const fix of fixes) {\n console.error(chalk.dim(` ${fix.file}:${fix.line} — ${fix.description}`));\n }\n rounds.push({\n round,\n reviewVerdict: verdict,\n reviewScore: score,\n criticalCount,\n warningCount,\n fixesProposed: fixes.length,\n fixesApplied: 0,\n fixesFailed: 0,\n exitReason: 'dry_run',\n durationMs: Date.now() - roundStart,\n });\n continue;\n }\n\n // Step 2: Apply fixes locally (host applies, not GPT)\n let applied = 0;\n let failed = 0;\n const currentFingerprints = new Set<string>();\n\n for (const fix of fixes) {\n const fingerprint = `${fix.file}:${fix.description}`;\n currentFingerprints.add(fingerprint);\n\n if (stuckFingerprints.has(fingerprint)) {\n console.error(chalk.dim(` Skip (stuck): ${fix.file}:${fix.line}`));\n continue;\n }\n\n // Mark as stuck if same fingerprint appeared in previous round\n if (prevFingerprints.has(fingerprint)) {\n stuckFingerprints.add(fingerprint);\n console.error(chalk.yellow(` Stuck (recurring): ${fix.file}:${fix.line} — ${fix.description}`));\n failed++;\n continue;\n }\n\n const success = applyFix(fix, projectDir);\n if (success) {\n applied++;\n console.error(chalk.green(` Fixed: ${fix.file}:${fix.line} — ${fix.description}`));\n } else {\n failed++;\n console.error(chalk.red(` Failed: ${fix.file}:${fix.line} — could not match old code`));\n }\n }\n\n prevFingerprints = currentFingerprints;\n\n // Stage changes unless --no-stage\n if (applied > 0 && !options.noStage) {\n try {\n execFileSync('git', ['add', '-A'], { cwd: projectDir, stdio: 'pipe' });\n console.error(chalk.dim(' Changes staged.'));\n } catch {\n console.error(chalk.yellow(' Could not stage changes (not a git repo?).'));\n }\n }\n\n const exitReason = applied === 0 ? 'no_diff' : 'continue';\n\n rounds.push({\n round,\n reviewVerdict: verdict,\n reviewScore: score,\n criticalCount,\n warningCount,\n fixesProposed: fixes.length,\n fixesApplied: applied,\n fixesFailed: failed,\n exitReason,\n durationMs: Date.now() - roundStart,\n });\n\n if (applied === 0) {\n console.error(chalk.yellow(' No fixes applied — stopping loop.'));\n break;\n }\n\n // Check if all remaining are stuck\n if (stuckFingerprints.size >= fixes.length) {\n console.error(chalk.yellow(' All remaining issues are stuck — stopping.'));\n break;\n }\n\n console.error(chalk.dim(` Applied ${applied}, failed ${failed}. Continuing to re-review...`));\n }\n\n // Final summary\n const lastRound = rounds[rounds.length - 1];\n const totalApplied = rounds.reduce((sum, r) => sum + r.fixesApplied, 0);\n const totalProposed = rounds.reduce((sum, r) => sum + r.fixesProposed, 0);\n\n const policyCtx: PolicyContext = {\n criticalCount: lastRound?.criticalCount ?? 0,\n warningCount: lastRound?.warningCount ?? 0,\n verdict: lastRound?.reviewVerdict ?? 'unknown',\n stepsCompleted: { fix: converged ? 'passed' : 'failed' },\n cleanupHighCount: 0,\n };\n const policy = evaluatePolicy('review.completed', policyCtx, DEFAULT_RULES);\n\n const exitReason = converged\n ? 'all_resolved'\n : stuckFingerprints.size > 0\n ? 'all_stuck'\n : lastRound?.exitReason ?? 'max_iterations';\n\n const output = {\n target: fileOrGlob,\n converged,\n exitReason,\n rounds,\n totalRounds: rounds.length,\n totalFixesProposed: totalProposed,\n totalFixesApplied: totalApplied,\n stuckCount: stuckFingerprints.size,\n finalVerdict: lastRound?.reviewVerdict ?? 'unknown',\n finalScore: lastRound?.reviewScore ?? null,\n policy,\n sessionId: session.id,\n codexThreadId: threadId,\n };\n\n // Human-readable summary\n const color = converged ? chalk.green : chalk.red;\n console.error(color(`\\nResult: ${converged ? 'CONVERGED' : 'NOT CONVERGED'} (${exitReason})`));\n console.error(` Rounds: ${rounds.length}/${options.maxRounds}`);\n console.error(` Fixes: ${totalApplied} applied, ${totalProposed - totalApplied} failed/skipped`);\n if (stuckFingerprints.size > 0) {\n console.error(chalk.yellow(` Stuck issues: ${stuckFingerprints.size}`));\n }\n console.error(` Final: ${lastRound?.reviewVerdict ?? '?'} (${lastRound?.reviewScore ?? '?'}/10)`);\n\n console.log(JSON.stringify(output, null, 2));\n db.close();\n}\n","import { existsSync } from 'node:fs';\nimport { basename, join } from 'node:path';\n\nimport type { PresetName } from '@codemoot/core';\nimport { loadConfig, writeConfig } from '@codemoot/core';\nimport chalk from 'chalk';\n\ninterface InitOptions {\n preset?: string;\n nonInteractive?: boolean;\n force?: boolean;\n}\n\nexport async function initCommand(options: InitOptions): Promise<void> {\n const cwd = process.cwd();\n const configPath = join(cwd, '.cowork.yml');\n\n // Check existing config\n if (existsSync(configPath) && !options.force) {\n console.error(chalk.red('Already initialized. Use --force to overwrite.'));\n process.exit(1);\n }\n\n // Validate preset name\n const validPresets: PresetName[] = ['cli-first'];\n // Select preset\n let presetName: PresetName = 'cli-first';\n if (options.preset) {\n if (!validPresets.includes(options.preset as PresetName)) {\n console.error(chalk.red(`Unknown preset: ${options.preset}. Available: ${validPresets.join(', ')}`));\n process.exit(1);\n }\n presetName = options.preset as PresetName;\n } else if (options.nonInteractive) {\n presetName = 'cli-first';\n } else {\n const { selectPreset } = await import('../prompts.js');\n presetName = await selectPreset();\n }\n\n // Load config with preset (skip existing file on --force)\n const config = loadConfig({ preset: presetName, skipFile: options.force });\n // Set project name to directory name\n config.project.name = basename(cwd);\n\n // Write config\n writeConfig(config, cwd);\n\n console.log(chalk.green(`\\nInitialized with '${presetName}' preset`));\n\n // Show model assignments from config\n const modelEntries = Object.entries(config.models);\n for (const [alias, modelConfig] of modelEntries) {\n console.log(chalk.gray(` ${alias}: ${modelConfig.model}`));\n }\n\n console.log(chalk.gray('\\nNext: codemoot plan \"describe your task\"'));\n}\n","// packages/cli/src/commands/install-skills.ts — Install Claude Code skills, agents, hooks, and CLAUDE.md into current project\n\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport chalk from 'chalk';\n\ninterface InstallOptions {\n force: boolean;\n}\n\ninterface SkillFile {\n path: string;\n content: string;\n description: string;\n}\n\nconst SKILLS: SkillFile[] = [\n {\n path: '.claude/skills/codex-review/SKILL.md',\n description: '/codex-review — Get GPT review via Codex CLI',\n content: `---\nname: codex-review\ndescription: Get an independent GPT review via Codex CLI. Use when you want a second opinion on code, plans, or architecture from a different AI model.\nuser-invocable: true\n---\n\n# /codex-review — Get GPT Review via Codex CLI\n\n## Usage\n\\`/codex-review <file, glob, or description of what to review>\\`\n\n## Description\nSends content to GPT via \\`codemoot review\\` for an independent review with session persistence. GPT has full codebase access and reviews are tracked in SQLite. Uses your ChatGPT subscription — zero API cost.\n\n## Instructions\n\nWhen the user invokes \\`/codex-review\\`, follow these steps:\n\n### Step 1: Gather project context\nBefore sending to GPT, gather relevant context so GPT understands the project:\n\n1. Check if \\`CLAUDE.md\\` or \\`README.md\\` exists — read the first 200 lines for project overview\n2. Check if \\`.claude/settings.json\\` or similar config exists\n3. Note the project language, framework, and key patterns\n\nThis context will be included in the prompt to reduce false positives.\n\n### Step 2: Determine review mode\n\n**If the user specifies a file or glob:**\n\\`\\`\\`bash\ncodemoot review <file-or-glob> --focus all\n\\`\\`\\`\n\n**If the user specifies a diff:**\n\\`\\`\\`bash\ncodemoot review --diff HEAD~3..HEAD\n\\`\\`\\`\n\n**If the user gives a freeform description:**\n\\`\\`\\`bash\ncodemoot review --prompt \"PROJECT CONTEXT: <context from step 1>\n\nREVIEW TASK: <user's description>\n\nEvaluate on: Correctness, Completeness, Quality, Security, Feasibility.\nFor security findings, verify by reading the actual code before flagging.\nProvide SCORE: X/10 and VERDICT: APPROVED or NEEDS_REVISION\"\n\\`\\`\\`\n\n**For presets:**\n\\`\\`\\`bash\ncodemoot review <target> --preset security-audit\ncodemoot review <target> --preset quick-scan\ncodemoot review <target> --preset performance\n\\`\\`\\`\n\n### Step 3: Parse and present the output\nThe command outputs JSON to stdout. Parse it and present as clean markdown:\n\n\\`\\`\\`\n## GPT Review Results\n\n**Score**: X/10 | **Verdict**: APPROVED/NEEDS_REVISION\n\n### Findings\n- [CRITICAL] file:line — description\n- [WARNING] file:line — description\n\n### GPT's Full Analysis\n<review text>\n\nSession: <sessionId> | Tokens: <usage> | Duration: <durationMs>ms\n\\`\\`\\`\n\n### Step 4: If NEEDS_REVISION\nAsk if user wants to fix and re-review. If yes:\n1. Fix the issues\n2. Run \\`codemoot review\\` again — session resume gives GPT context of prior review\n3. GPT will check if previous issues were addressed\n\n### Important Notes\n- **Session resume**: Each review builds on prior context. GPT remembers what it reviewed before.\n- **Codebase access**: GPT can read project files during review via codex tools.\n- **No arg size limits**: Content is piped via stdin, not passed as CLI args.\n- **Presets**: Use --preset for specialized reviews (security-audit, performance, quick-scan, pre-commit, api-review).\n- **Background mode**: Add --background to enqueue and continue working.\n- **Output capped**: JSON \\`review\\` field is capped to 2KB to prevent terminal crashes. Full text is stored in session_events.\n- **Progress**: Heartbeat every 60s, throttled to 30s intervals. No agent_message dumps.\n`,\n },\n {\n path: '.claude/skills/plan-review/SKILL.md',\n description: '/plan-review — GPT review of execution plans',\n content: `---\nname: plan-review\ndescription: Send execution plans to GPT for structured review via Codex CLI. Use when you have a written plan and want independent validation before implementation.\nuser-invocable: true\n---\n\n# /plan-review — GPT Review of Execution Plans\n\n## Usage\n\\`/plan-review <plan-file-or-description>\\`\n\n## Description\nSends a Claude-authored execution plan to GPT via \\`codemoot plan review\\` for structured critique. GPT returns ISSUE (HIGH/MEDIUM/LOW) and SUGGEST lines with file-level references.\n\n## Instructions\n\n### Step 1: Prepare the plan\n- If the user provides a file path, use it directly\n- If reviewing the current conversation's plan, write to a temp file first\n\n### Step 2: Run plan review\n\\`\\`\\`bash\ncodemoot plan review <plan-file> [--phase N] [--build BUILD_ID] [--timeout ms] [--output file]\n\\`\\`\\`\n\n### Step 3: Parse and present output\nJSON output includes: \\`verdict\\`, \\`score\\`, \\`issues[]\\` (severity + message), \\`suggestions[]\\`.\n\nPresent as:\n\\`\\`\\`\n## GPT Plan Review\n**Score**: X/10 | **Verdict**: APPROVED/NEEDS_REVISION\n### Issues\n- [HIGH] description\n### Suggestions\n- suggestion text\n\\`\\`\\`\n\n### Step 4: If NEEDS_REVISION\nFix HIGH issues, revise the plan, re-run. Session resume gives GPT context of prior review.\n\n### Important Notes\n- **Session resume**: GPT remembers prior reviews via thread resume\n- **Codebase access**: GPT reads actual project files to verify plan references\n- **Output capped**: JSON \\`review\\` field is capped to 2KB. Use \\`--output\\` for full text\n- **Zero API cost**: Uses ChatGPT subscription via Codex CLI\n`,\n },\n {\n path: '.claude/skills/debate/SKILL.md',\n description: '/debate — Claude vs GPT multi-round debate',\n content: `---\nname: debate\ndescription: Real Claude vs GPT multi-round debate. Use when you need a second opinion, want to debate architecture decisions, or evaluate competing approaches.\nuser-invocable: true\n---\n\n# /debate — Real Claude vs GPT Multi-Round Debate\n\n## Usage\n\\`/debate <topic or question>\\`\n\n## Description\nStructured debate: Claude proposes, GPT critiques, Claude revises, GPT re-evaluates — looping until convergence or max rounds. Real multi-model collaboration via codemoot CLI with session persistence.\n\n## Instructions\n\n### Phase 0: Setup\n1. Parse topic from user's message\n2. Start debate:\n\\`\\`\\`bash\ncodemoot debate start \"TOPIC_HERE\"\n\\`\\`\\`\n3. Save the \\`debateId\\` from JSON output\n4. Announce: \"Entering debate mode: Claude vs GPT\"\n\n### Phase 1: Claude's Opening Proposal\nThink deeply. Generate your genuine proposal. Be thorough and specific.\n\n### Phase 1.5: Gather Codebase Context\nIf topic relates to code, use Grep/Glob/Read to find relevant files. Summarize for GPT.\n\n### Phase 2: Send to GPT\n\\`\\`\\`bash\ncodemoot debate turn DEBATE_ID \"You are a senior technical reviewer debating with Claude about a codebase. You have full access to project files.\n\nDEBATE TOPIC: <topic>\nCODEBASE CONTEXT: <summary>\nCLAUDE'S PROPOSAL: <proposal>\n\nRespond with:\n1. What you agree with\n2. What you disagree with\n3. Suggested improvements\n4. STANCE: SUPPORT, OPPOSE, or UNCERTAIN\" --round N\n\\`\\`\\`\n\n### Phase 3: Check Convergence\n- STANCE: SUPPORT → go to Phase 5\n- Max rounds reached → go to Phase 5\n- Otherwise → Phase 4\n\n### Phase 4: Claude's Revision\nRead GPT's critique. Revise genuinely. Send back to GPT.\n\n### Phase 5: Final Synthesis\n\\`\\`\\`bash\ncodemoot debate complete DEBATE_ID\n\\`\\`\\`\nPresent: final position, agreements, disagreements, stats.\n\n### Rules\n1. Be genuine — don't just agree to end the debate\n2. Session resume is automatic via callWithResume()\n3. State persisted to SQLite\n4. Zero API cost (ChatGPT subscription)\n5. 600s default timeout per turn\n6. JSON \\`response\\` field capped to 2KB — check \\`responseTruncated\\` boolean\n7. Progress heartbeat every 60s, throttled to 30s intervals\n`,\n },\n {\n path: '.claude/skills/build/SKILL.md',\n description: '/build — Autonomous build loop with GPT review',\n content: `---\nname: build\ndescription: Autonomous build loop — debate, plan, implement, review, fix — all in one session with GPT review.\nuser-invocable: true\n---\n\n# /build — Autonomous Build Loop\n\n## Usage\n\\`/build <task description>\\`\n\n## Description\nFull pipeline: debate approach with GPT → user approval → implement → GPT review → fix → re-review until approved. SQLite tracking throughout.\n\n## Instructions\n\n### Phase 0: Initialize\n1. Record user's exact request (acceptance criteria)\n2. \\`codemoot build start \"TASK\"\\`\n3. Save buildId and debateId\n\n### Phase 1: Debate the Approach (MANDATORY)\nUse /debate protocol. Loop until GPT says STANCE: SUPPORT.\n- Gather codebase context first\n- Send detailed implementation plan to GPT\n- Revise on OPPOSE/UNCERTAIN — never skip\n\n### Phase 1.25: Plan Review (Recommended)\nBefore user approval, validate the plan with GPT:\n\\`\\`\\`bash\ncodemoot plan review /path/to/plan.md --build BUILD_ID\n\\`\\`\\`\nGPT reviews the plan against actual codebase, returns ISSUE/SUGGEST lines.\nFix HIGH issues before presenting to user.\n\n### Phase 1.5: User Approval Gate\nPresent agreed plan. Wait for explicit approval via AskUserQuestion.\n\\`\\`\\`bash\ncodemoot build event BUILD_ID plan_approved\ncodemoot debate complete DEBATE_ID\n\\`\\`\\`\n\n### Phase 2: Implement\nWrite code. Run tests: \\`pnpm run test\\`\nNever send broken code to review.\n\\`\\`\\`bash\ncodemoot build event BUILD_ID impl_completed\n\\`\\`\\`\n\n### Phase 3: GPT Review\n\\`\\`\\`bash\ncodemoot build review BUILD_ID\n\\`\\`\\`\nParse verdict: approved → Phase 4.5, needs_revision → Phase 4\n\n### Phase 4: Fix Issues\nFix every CRITICAL and BUG. Run tests. Back to Phase 3.\n\\`\\`\\`bash\ncodemoot build event BUILD_ID fix_completed\n\\`\\`\\`\n\n### Phase 4.5: Completeness Check\nCompare deliverables against original request. Every requirement must be met.\n\n### Phase 5: Done\n\\`\\`\\`bash\ncodemoot build status BUILD_ID\n\\`\\`\\`\nPresent summary with metrics, requirements checklist, GPT verdict.\n\n### Rules\n1. NEVER skip debate rounds\n2. NEVER skip user approval\n3. NEVER declare done without completeness check\n4. Run tests after every implementation/fix\n5. Zero API cost (ChatGPT subscription)\n`,\n },\n {\n path: '.claude/skills/cleanup/SKILL.md',\n description: '/cleanup — Bidirectional AI slop scanner',\n content: `---\nname: cleanup\ndescription: Bidirectional AI slop scanner — Claude + GPT independently analyze, then debate disagreements.\nuser-invocable: true\n---\n\n# /cleanup — Bidirectional AI Slop Scanner\n\n## Usage\n\\`/cleanup [scope]\\` where scope is: deps, unused-exports, hardcoded, duplicates, deadcode, or all\n\n## Description\nClaude analyzes independently, then codemoot cleanup runs deterministic regex + GPT scans. 3-way merge with majority-vote confidence.\n\n## Instructions\n\n### Phase 1: Claude Independent Analysis\nScan the codebase yourself using Grep/Glob/Read. For each scope:\n- **deps**: Check package.json deps against actual imports\n- **unused-exports**: Find exported symbols not imported elsewhere\n- **hardcoded**: Magic numbers, URLs, credentials\n- **duplicates**: Similar function logic across files\n- **deadcode**: Declared but never referenced\n\nSave findings as JSON to a temp file.\n\n### Phase 2: Run codemoot cleanup\n\\`\\`\\`bash\ncodemoot cleanup --scope SCOPE --host-findings /path/to/claude-findings.json\n\\`\\`\\`\n\n### Phase 3: Present merged results\nShow summary: total, high confidence, disputed, adjudicated, by source.\n\n### Phase 4: Rebuttal Round\nFor Claude/GPT disagreements, optionally debate via \\`codemoot debate turn\\`.\n`,\n },\n {\n path: '.claude/agents/codex-liaison.md',\n description: 'Codex Liaison agent — iterates with GPT until 9.5/10',\n content: `# Codex Liaison Agent\n\n## Role\nSpecialized teammate that communicates with GPT via codemoot CLI to get independent reviews and iterate until quality threshold is met.\n\n## How You Work\n1. Send content to GPT via \\`codemoot review\\` or \\`codemoot plan review\\`\n2. Parse JSON output for score, verdict, findings\n3. If NEEDS_REVISION: fix issues and re-submit (session resume retains context)\n4. Loop until APPROVED or max iterations\n5. Report final version back to team lead\n\n## Available Commands\n\\`\\`\\`bash\ncodemoot review <file-or-glob> # Code review\ncodemoot review --diff HEAD~3..HEAD # Diff review\ncodemoot plan review <plan-file> # Plan review\ncodemoot debate turn DEBATE_ID \"prompt\" # Debate turn\ncodemoot fix <file-or-glob> # Autofix loop\n\\`\\`\\`\n\n## Important Rules\n- NEVER fabricate GPT's responses — always parse actual JSON output\n- NEVER skip iterations if GPT says NEEDS_REVISION\n- Use your own judgment when GPT's feedback conflicts with project requirements\n- JSON \\`review\\`/\\`response\\` fields are capped to 2KB; use \\`--output\\` for full text\n- All commands use session resume — GPT retains context across calls\n- Zero API cost (ChatGPT subscription via Codex CLI)\n`,\n },\n];\n\nconst CLAUDE_MD_SECTION = `\n## CodeMoot — Multi-Model Collaboration\n\nThis project uses [CodeMoot](https://github.com/katarmal-ram/codemoot) for Claude + GPT collaboration. CodeMoot bridges Claude Code and Codex CLI so they work as partners — one plans, the other reviews.\n\n### How Sessions Work\n- Every \\`codemoot\\` command uses a **unified session** with GPT via Codex CLI\n- Sessions persist across commands — GPT remembers prior reviews, debates, and fixes\n- Sessions are stored in \\`.cowork/db/cowork.db\\` (SQLite)\n- When a session's token budget fills up, it auto-rolls to a new thread\n- Run \\`codemoot session current\\` to see the active session\n\n### Available Commands (use these, not raw codex)\n- \\`codemoot review <file-or-dir>\\` — GPT reviews code with codebase access\n- \\`codemoot review --prompt \"question\"\\` — GPT explores codebase to answer\n- \\`codemoot review --diff HEAD~3..HEAD\\` — Review git changes\n- \\`codemoot review --preset security-audit\\` — Specialized review presets\n- \\`codemoot fix <file>\\` — Autofix loop: review → apply fixes → re-review\n- \\`codemoot debate start \"topic\"\\` — Multi-round Claude vs GPT debate\n- \\`codemoot cleanup\\` — Scan for unused deps, dead code, duplicates\n- \\`codemoot plan generate \"task\"\\` — Generate plans via multi-model loop\n- \\`codemoot plan review <plan-file>\\` — GPT review of execution plans\n- \\`codemoot shipit --profile safe\\` — Composite workflow (lint+test+review)\n- \\`codemoot cost\\` — Token usage dashboard\n- \\`codemoot doctor\\` — Check prerequisites\n\n### Slash Commands\n- \\`/codex-review\\` — Quick GPT review (uses codemoot review internally)\n- \\`/debate\\` — Start a Claude vs GPT debate\n- \\`/plan-review\\` — GPT review of execution plans\n- \\`/build\\` — Full build loop: debate → plan → implement → GPT review → fix\n- \\`/cleanup\\` — Bidirectional AI slop scanner\n\n### When to Use CodeMoot\n- After implementing a feature → \\`codemoot review src/\\`\n- Before committing → \\`codemoot review --diff HEAD --preset pre-commit\\`\n- Architecture decisions → \\`/debate \"REST vs GraphQL?\"\\`\n- Full feature build → \\`/build \"add user authentication\"\\`\n- After shipping → \\`codemoot shipit --profile safe\\`\n\n### Session Tips\n- Sessions auto-resume — GPT retains context from prior commands\n- \\`codemoot session list\\` shows all sessions with token usage\n- \\`codemoot cost --scope session\\` shows current session spend\n- Start fresh with \\`codemoot session start --name \"new-feature\"\\`\n`;\n\nconst HOOKS_CONFIG = {\n hooks: {\n PostToolUse: [\n {\n matcher: 'Bash',\n pattern: 'git commit',\n command: 'echo \"Tip: Run codemoot review --diff HEAD~1 for a GPT review of this commit\"',\n },\n ],\n },\n};\n\nexport async function installSkillsCommand(options: InstallOptions): Promise<void> {\n const cwd = process.cwd();\n let installed = 0;\n let skipped = 0;\n\n console.error(chalk.cyan('\\n Installing CodeMoot integration for Claude Code\\n'));\n\n // ── 1. Install skill files ──\n console.error(chalk.dim(' Skills & Agents:'));\n for (const skill of SKILLS) {\n const fullPath = join(cwd, skill.path);\n const dir = dirname(fullPath);\n\n if (existsSync(fullPath) && !options.force) {\n console.error(chalk.dim(` SKIP ${skill.path} (exists)`));\n skipped++;\n continue;\n }\n\n mkdirSync(dir, { recursive: true });\n writeFileSync(fullPath, skill.content, 'utf-8');\n console.error(chalk.green(` OK ${skill.path}`));\n installed++;\n }\n\n // ── 2. Append CodeMoot section to CLAUDE.md ──\n console.error('');\n console.error(chalk.dim(' CLAUDE.md:'));\n const claudeMdPath = join(cwd, 'CLAUDE.md');\n const marker = '## CodeMoot — Multi-Model Collaboration';\n\n if (existsSync(claudeMdPath)) {\n const existing = readFileSync(claudeMdPath, 'utf-8');\n if (existing.includes(marker)) {\n if (options.force) {\n // Replace existing section, preserving content after it\n const markerIdx = existing.indexOf(marker);\n const before = existing.slice(0, markerIdx);\n // Find the next heading after our section ends, or end of file\n // Our section uses ### subheadings, so we detect the end by finding\n // the CLAUDE_MD_SECTION's last line, then take everything after it\n const sectionEnd = existing.indexOf(CLAUDE_MD_SECTION.trimEnd(), markerIdx);\n const afterMarker = sectionEnd >= 0\n ? existing.slice(sectionEnd + CLAUDE_MD_SECTION.trimEnd().length)\n : existing.slice(markerIdx + marker.length);\n // Fallback: find next heading at any level that isn't part of our section\n const nextHeadingMatch = sectionEnd >= 0 ? null : afterMarker.match(/\\n#{1,6} (?!CodeMoot)/);\n const after = nextHeadingMatch ? afterMarker.slice(nextHeadingMatch.index as number) : '';\n writeFileSync(claudeMdPath, before.trimEnd() + '\\n' + CLAUDE_MD_SECTION + after, 'utf-8');\n console.error(chalk.green(' OK CLAUDE.md (updated CodeMoot section)'));\n installed++;\n } else {\n console.error(chalk.dim(' SKIP CLAUDE.md (CodeMoot section exists)'));\n skipped++;\n }\n } else {\n // Append section\n writeFileSync(claudeMdPath, existing.trimEnd() + '\\n' + CLAUDE_MD_SECTION, 'utf-8');\n console.error(chalk.green(' OK CLAUDE.md (appended CodeMoot section)'));\n installed++;\n }\n } else {\n writeFileSync(claudeMdPath, `# Project Instructions\\n${CLAUDE_MD_SECTION}`, 'utf-8');\n console.error(chalk.green(' OK CLAUDE.md (created with CodeMoot section)'));\n installed++;\n }\n\n // ── 3. Install hooks config ──\n console.error('');\n console.error(chalk.dim(' Hooks:'));\n const settingsDir = join(cwd, '.claude');\n const settingsPath = join(settingsDir, 'settings.json');\n\n if (existsSync(settingsPath)) {\n try {\n const existing = JSON.parse(readFileSync(settingsPath, 'utf-8'));\n const hasCodemootHook = Array.isArray(existing.hooks?.PostToolUse) &&\n existing.hooks.PostToolUse.some((h: { command?: string }) => h.command?.includes('codemoot'));\n if (hasCodemootHook && !options.force) {\n console.error(chalk.dim(' SKIP .claude/settings.json (codemoot hook exists)'));\n skipped++;\n } else {\n // Merge: keep existing hooks, add/replace codemoot hook\n const otherHooks = Array.isArray(existing.hooks?.PostToolUse)\n ? existing.hooks.PostToolUse.filter((h: { command?: string }) => !h.command?.includes('codemoot'))\n : [];\n existing.hooks = {\n ...existing.hooks,\n PostToolUse: [...otherHooks, ...HOOKS_CONFIG.hooks.PostToolUse],\n };\n writeFileSync(settingsPath, JSON.stringify(existing, null, 2), 'utf-8');\n console.error(chalk.green(' OK .claude/settings.json (added post-commit hint hook)'));\n installed++;\n }\n } catch (err) {\n console.error(chalk.yellow(` WARN .claude/settings.json parse error: ${(err as Error).message}`));\n console.error(chalk.yellow(' Back up and delete the file, then re-run install-skills'));\n skipped++;\n }\n } else {\n mkdirSync(settingsDir, { recursive: true });\n writeFileSync(settingsPath, JSON.stringify(HOOKS_CONFIG, null, 2), 'utf-8');\n console.error(chalk.green(' OK .claude/settings.json (created with post-commit hook)'));\n installed++;\n }\n\n // ── Summary ──\n console.error('');\n console.error(chalk.cyan(` Installed: ${installed}, Skipped: ${skipped}`));\n console.error('');\n console.error(chalk.dim(' Slash commands: /codex-review, /debate, /plan-review, /build, /cleanup'));\n console.error(chalk.dim(' CLAUDE.md: Claude now knows about codemoot commands & sessions'));\n console.error(chalk.dim(' Hook: Post-commit hint to run codemoot review'));\n console.error('');\n\n const output = {\n installed,\n skipped,\n total: SKILLS.length + 2, // +CLAUDE.md +hooks\n skills: SKILLS.map(s => ({ path: s.path, description: s.description })),\n };\n console.log(JSON.stringify(output, null, 2));\n}\n","// packages/cli/src/commands/session.ts — Unified session CLI commands\n\nimport { SessionManager } from '@codemoot/core';\nimport chalk from 'chalk';\n\nimport { withDatabase } from '../utils.js';\n\n// ── codemoot session start ──\n\ninterface StartOptions {\n name?: string;\n}\n\nexport async function sessionStartCommand(options: StartOptions): Promise<void> {\n await withDatabase(async (db) => {\n const mgr = new SessionManager(db);\n const id = mgr.create(options.name);\n const session = mgr.get(id);\n\n mgr.recordEvent({\n sessionId: id,\n command: 'session',\n subcommand: 'start',\n promptPreview: `Session started: ${session?.name ?? id}`,\n });\n\n console.log(JSON.stringify({\n sessionId: id,\n name: session?.name ?? null,\n status: 'active',\n message: 'Session created. All GPT commands will now use this session.',\n }, null, 2));\n });\n}\n\n// ── codemoot session current ──\n\nexport async function sessionCurrentCommand(): Promise<void> {\n await withDatabase(async (db) => {\n const mgr = new SessionManager(db);\n const session = mgr.getActive();\n if (!session) {\n console.log(JSON.stringify({ active: false, message: 'No active session. Run \"codemoot session start\" to create one.' }));\n return;\n }\n\n const events = mgr.getEvents(session.id, 5);\n const overflow = mgr.getOverflowStatus(session.id);\n\n console.log(JSON.stringify({\n sessionId: session.id,\n name: session.name,\n codexThreadId: session.codexThreadId,\n status: session.status,\n tokenBudget: {\n used: overflow.cumulativeTokens,\n lastTurnInput: overflow.lastTurnInputTokens,\n max: overflow.maxContext,\n utilization: `${Math.round(overflow.utilizationRatio * 100)}%`,\n },\n recentEvents: events.map(e => ({\n command: e.command,\n subcommand: e.subcommand,\n durationMs: e.durationMs,\n createdAt: new Date(e.createdAt).toISOString(),\n })),\n createdAt: new Date(session.createdAt).toISOString(),\n updatedAt: new Date(session.updatedAt).toISOString(),\n }, null, 2));\n });\n}\n\n// ── codemoot session list ──\n\ninterface ListOptions {\n status?: string;\n limit?: number;\n}\n\nexport async function sessionListCommand(options: ListOptions): Promise<void> {\n await withDatabase(async (db) => {\n const mgr = new SessionManager(db);\n const sessions = mgr.list({\n status: options.status,\n limit: options.limit ?? 20,\n });\n\n const output = sessions.map(s => ({\n sessionId: s.id,\n name: s.name,\n status: s.status,\n codexThreadId: s.codexThreadId ? `${s.codexThreadId.slice(0, 12)}...` : null,\n tokenUsage: s.tokenUsage,\n createdAt: new Date(s.createdAt).toISOString(),\n updatedAt: new Date(s.updatedAt).toISOString(),\n }));\n\n console.log(JSON.stringify(output, null, 2));\n });\n}\n\n// ── codemoot session status ──\n\nexport async function sessionStatusCommand(sessionId: string): Promise<void> {\n await withDatabase(async (db) => {\n const mgr = new SessionManager(db);\n const session = mgr.get(sessionId);\n if (!session) {\n console.error(chalk.red(`No session found with ID: ${sessionId}`));\n process.exit(1);\n }\n\n const events = mgr.getEvents(sessionId, 20);\n const overflow = mgr.getOverflowStatus(sessionId);\n\n console.log(JSON.stringify({\n sessionId: session.id,\n name: session.name,\n codexThreadId: session.codexThreadId,\n status: session.status,\n tokenBudget: {\n used: overflow.cumulativeTokens,\n lastTurnInput: overflow.lastTurnInputTokens,\n max: overflow.maxContext,\n utilization: `${Math.round(overflow.utilizationRatio * 100)}%`,\n shouldWarn: overflow.shouldWarn,\n shouldReconstruct: overflow.shouldReconstruct,\n },\n eventCount: events.length,\n events: events.map(e => ({\n command: e.command,\n subcommand: e.subcommand,\n promptPreview: e.promptPreview,\n responsePreview: e.responsePreview,\n durationMs: e.durationMs,\n createdAt: new Date(e.createdAt).toISOString(),\n })),\n createdAt: new Date(session.createdAt).toISOString(),\n updatedAt: new Date(session.updatedAt).toISOString(),\n completedAt: session.completedAt ? new Date(session.completedAt).toISOString() : null,\n }, null, 2));\n });\n}\n\n// ── codemoot session close ──\n\nexport async function sessionCloseCommand(sessionId: string): Promise<void> {\n await withDatabase(async (db) => {\n const mgr = new SessionManager(db);\n const session = mgr.get(sessionId);\n if (!session) {\n console.error(chalk.red(`No session found with ID: ${sessionId}`));\n process.exit(1);\n }\n\n mgr.complete(sessionId);\n console.log(JSON.stringify({ sessionId, status: 'completed' }));\n });\n}\n","// packages/cli/src/commands/jobs.ts — Background job queue CLI commands\n\nimport { JobStore, openDatabase } from '@codemoot/core';\nimport type { JobStatus, JobType } from '@codemoot/core';\nimport chalk from 'chalk';\n\nimport { getDbPath } from '../utils.js';\n\n// ── codemoot jobs list ──\n\ninterface ListOptions {\n status?: string;\n type?: string;\n limit?: number;\n}\n\nexport async function jobsListCommand(options: ListOptions): Promise<void> {\n let db: ReturnType<typeof openDatabase> | undefined;\n try {\n db = openDatabase(getDbPath());\n const store = new JobStore(db);\n\n const jobs = store.list({\n status: options.status as JobStatus | undefined,\n type: options.type as JobType | undefined,\n limit: options.limit ?? 20,\n });\n\n const output = jobs.map(j => ({\n id: j.id,\n type: j.type,\n status: j.status,\n priority: j.priority,\n retryCount: j.retryCount,\n workerId: j.workerId,\n createdAt: new Date(j.createdAt).toISOString(),\n startedAt: j.startedAt ? new Date(j.startedAt).toISOString() : null,\n finishedAt: j.finishedAt ? new Date(j.finishedAt).toISOString() : null,\n }));\n\n console.log(JSON.stringify(output, null, 2));\n db.close();\n } catch (error) {\n db?.close();\n console.error(chalk.red(`Error: ${error instanceof Error ? error.message : String(error)}`));\n process.exit(1);\n }\n}\n\n// ── codemoot jobs logs ──\n\ninterface LogsOptions {\n fromSeq?: number;\n limit?: number;\n}\n\nexport async function jobsLogsCommand(jobId: string, options: LogsOptions): Promise<void> {\n let db: ReturnType<typeof openDatabase> | undefined;\n try {\n db = openDatabase(getDbPath());\n const store = new JobStore(db);\n\n const job = store.get(jobId);\n if (!job) {\n console.error(chalk.red(`No job found with ID: ${jobId}`));\n db.close();\n process.exit(1);\n }\n\n const logs = store.getLogs(jobId, options.fromSeq ?? 0, options.limit ?? 100);\n\n const output = {\n jobId: job.id,\n type: job.type,\n status: job.status,\n logs: logs.map(l => ({\n seq: l.seq,\n level: l.level,\n event: l.eventType,\n message: l.message,\n time: new Date(l.createdAt).toISOString(),\n })),\n };\n\n console.log(JSON.stringify(output, null, 2));\n db.close();\n } catch (error) {\n db?.close();\n console.error(chalk.red(`Error: ${error instanceof Error ? error.message : String(error)}`));\n process.exit(1);\n }\n}\n\n// ── codemoot jobs cancel ──\n\nexport async function jobsCancelCommand(jobId: string): Promise<void> {\n let db: ReturnType<typeof openDatabase> | undefined;\n try {\n db = openDatabase(getDbPath());\n const store = new JobStore(db);\n\n const job = store.get(jobId);\n if (!job) {\n console.error(chalk.red(`No job found with ID: ${jobId}`));\n db.close();\n process.exit(1);\n }\n\n store.cancel(jobId);\n console.log(JSON.stringify({ jobId, status: 'canceled' }));\n db.close();\n } catch (error) {\n db?.close();\n console.error(chalk.red(`Error: ${error instanceof Error ? error.message : String(error)}`));\n process.exit(1);\n }\n}\n\n// ── codemoot jobs retry ──\n\nexport async function jobsRetryCommand(jobId: string): Promise<void> {\n let db: ReturnType<typeof openDatabase> | undefined;\n try {\n db = openDatabase(getDbPath());\n const store = new JobStore(db);\n\n const job = store.get(jobId);\n if (!job) {\n console.error(chalk.red(`No job found with ID: ${jobId}`));\n db.close();\n process.exit(1);\n }\n\n const retried = store.retry(jobId);\n if (!retried) {\n console.error(chalk.red(`Cannot retry job ${jobId}: status=${job.status}, retries=${job.retryCount}/${job.maxRetries}`));\n db.close();\n process.exit(1);\n }\n\n console.log(JSON.stringify({ jobId, status: 'queued', retryCount: job.retryCount + 1 }));\n db.close();\n } catch (error) {\n db?.close();\n console.error(chalk.red(`Error: ${error instanceof Error ? error.message : String(error)}`));\n process.exit(1);\n }\n}\n\n// ── codemoot jobs status ──\n\nexport async function jobsStatusCommand(jobId: string): Promise<void> {\n let db: ReturnType<typeof openDatabase> | undefined;\n try {\n db = openDatabase(getDbPath());\n const store = new JobStore(db);\n\n const job = store.get(jobId);\n if (!job) {\n console.error(chalk.red(`No job found with ID: ${jobId}`));\n db.close();\n process.exit(1);\n }\n\n const logs = store.getLogs(jobId, 0, 5);\n\n const output = {\n id: job.id,\n type: job.type,\n status: job.status,\n priority: job.priority,\n retryCount: job.retryCount,\n maxRetries: job.maxRetries,\n workerId: job.workerId,\n sessionId: job.sessionId,\n payload: JSON.parse(job.payloadJson),\n result: job.resultJson ? JSON.parse(job.resultJson) : null,\n error: job.errorText,\n recentLogs: logs.map(l => ({\n seq: l.seq,\n level: l.level,\n event: l.eventType,\n message: l.message,\n })),\n createdAt: new Date(job.createdAt).toISOString(),\n startedAt: job.startedAt ? new Date(job.startedAt).toISOString() : null,\n finishedAt: job.finishedAt ? new Date(job.finishedAt).toISOString() : null,\n };\n\n console.log(JSON.stringify(output, null, 2));\n db.close();\n } catch (error) {\n db?.close();\n console.error(chalk.red(`Error: ${error instanceof Error ? error.message : String(error)}`));\n process.exit(1);\n }\n}\n","// packages/cli/src/commands/plan.ts — Plan generation and review commands\n\nimport { readFileSync, writeFileSync } from 'node:fs';\n\nimport {\n type CliAdapter,\n ModelRegistry,\n Orchestrator,\n SessionManager,\n buildHandoffEnvelope,\n loadConfig,\n openDatabase,\n} from '@codemoot/core';\nimport chalk from 'chalk';\n\nimport { createProgressCallbacks } from '../progress.js';\nimport { printSessionSummary, renderEvent } from '../render.js';\nimport { getDbPath } from '../utils.js';\n\n// ── codemoot plan generate <task> (legacy behavior) ──\n\ninterface GenerateOptions {\n rounds?: number;\n output?: string;\n}\n\nexport async function planGenerateCommand(task: string, options: GenerateOptions): Promise<void> {\n let db: ReturnType<typeof openDatabase> | undefined;\n try {\n const config = loadConfig();\n const projectDir = process.cwd();\n const registry = ModelRegistry.fromConfig(config, projectDir);\n\n const dbPath = getDbPath();\n db = openDatabase(dbPath);\n\n const orchestrator = new Orchestrator({ registry, db, config });\n orchestrator.on('event', (event) => renderEvent(event, config));\n\n const result = await orchestrator.plan(task, {\n maxRounds: options.rounds,\n });\n\n if (options.output) {\n writeFileSync(options.output, result.finalOutput, 'utf-8');\n console.error(chalk.green(`Plan saved to ${options.output}`));\n }\n\n printSessionSummary(result);\n\n db.close();\n process.exit(result.status === 'completed' ? 0 : 2);\n } catch (error) {\n db?.close();\n console.error(chalk.red(`Error: ${error instanceof Error ? error.message : String(error)}`));\n process.exit(1);\n }\n}\n\n// ── codemoot plan review <plan-file> ──\n\ninterface ReviewOptions {\n build?: string;\n phase?: string;\n timeout?: number;\n output?: string;\n}\n\nexport async function planReviewCommand(planFile: string, options: ReviewOptions): Promise<void> {\n let db: ReturnType<typeof openDatabase> | undefined;\n try {\n // Read plan content\n let planContent: string;\n if (planFile === '-') {\n // Read from stdin\n const chunks: Buffer[] = [];\n for await (const chunk of process.stdin) {\n chunks.push(chunk as Buffer);\n }\n planContent = Buffer.concat(chunks).toString('utf-8');\n } else {\n planContent = readFileSync(planFile, 'utf-8');\n }\n\n if (!planContent.trim()) {\n console.error(chalk.red('Plan file is empty.'));\n process.exit(1);\n }\n\n const config = loadConfig();\n const projectDir = process.cwd();\n const registry = ModelRegistry.fromConfig(config, projectDir);\n const adapter =\n registry.tryGetAdapter('codex-reviewer') ?? registry.tryGetAdapter('codex-architect');\n\n if (!adapter) {\n console.error(chalk.red('No codex adapter found in config. Run: codemoot init'));\n process.exit(1);\n }\n\n const dbPath = getDbPath();\n db = openDatabase(dbPath);\n const sessionMgr = new SessionManager(db);\n const session = sessionMgr.resolveActive('plan-review');\n\n const overflowCheck = sessionMgr.preCallOverflowCheck(session.id);\n if (overflowCheck.rolled) {\n console.error(chalk.yellow(` ${overflowCheck.message}`));\n }\n\n const currentSession = sessionMgr.get(session.id);\n const threadId = overflowCheck.rolled\n ? undefined\n : (currentSession?.codexThreadId ?? undefined);\n\n // Build review prompt — send the plan to codex for structured review\n const phaseContext = options.phase ? `\\nThis is Phase ${options.phase} of a multi-phase plan.` : '';\n const buildContext = options.build ? `\\nBuild ID: ${options.build}` : '';\n\n const prompt = buildHandoffEnvelope({\n command: 'plan-review',\n task: `Review the following execution plan for completeness, correctness, and feasibility. Read relevant codebase files to verify the plan's assumptions.${phaseContext}${buildContext}\n\nPLAN:\n${planContent.slice(0, 50_000)}\n\nReview criteria:\n1. Are all files/functions mentioned actually present in the codebase?\n2. Are there missing steps or dependencies between phases?\n3. Are there architectural concerns or better approaches?\n4. Is the scope realistic for the described phases?\n5. Are there security or performance concerns?\n\nOutput format:\n- For each issue, output: ISSUE: [HIGH|MEDIUM|LOW] <description>\n- For each suggestion, output: SUGGEST: <description>\n- End with: VERDICT: APPROVED or VERDICT: NEEDS_REVISION\n- End with: SCORE: X/10`,\n constraints: [\n 'Verify file paths and function names against the actual codebase before flagging issues.',\n 'Be specific — reference exact files and line numbers when possible.',\n 'Focus on feasibility, not style preferences.',\n ],\n resumed: Boolean(threadId),\n });\n\n const timeoutMs = (options.timeout ?? 300) * 1000;\n const progress = createProgressCallbacks('plan-review');\n\n console.error(chalk.cyan('Sending plan to codex for review...'));\n const result = await (adapter as CliAdapter).callWithResume(prompt, {\n sessionId: threadId,\n timeout: timeoutMs,\n ...progress,\n });\n\n // Update session\n if (result.sessionId) {\n sessionMgr.updateThreadId(session.id, result.sessionId);\n }\n sessionMgr.addUsageFromResult(session.id, result.usage, prompt, result.text);\n sessionMgr.recordEvent({\n sessionId: session.id,\n command: 'plan',\n subcommand: 'review',\n promptPreview: `Plan review: ${planFile}${options.phase ? ` (phase ${options.phase})` : ''}`,\n responsePreview: result.text.slice(0, 500),\n promptFull: prompt,\n responseFull: result.text,\n usageJson: JSON.stringify(result.usage),\n durationMs: result.durationMs,\n codexThreadId: result.sessionId,\n });\n\n // Parse verdict\n const tail = result.text.slice(-500);\n const verdictMatch = tail.match(/VERDICT:\\s*(APPROVED|NEEDS_REVISION)/i);\n const scoreMatch = tail.match(/SCORE:\\s*(\\d+)\\/10/);\n const verdict = verdictMatch ? verdictMatch[1].toLowerCase() : 'unknown';\n const score = scoreMatch ? Number.parseInt(scoreMatch[1], 10) : null;\n\n // Parse issues and suggestions\n const issues: Array<{ severity: string; message: string }> = [];\n const suggestions: string[] = [];\n for (const line of result.text.split('\\n')) {\n const issueMatch = line.match(/^[-*]?\\s*ISSUE:\\s*\\[(HIGH|MEDIUM|LOW)]\\s*(.*)/i);\n if (issueMatch) {\n issues.push({ severity: issueMatch[1].toLowerCase(), message: issueMatch[2].trim() });\n }\n const suggestMatch = line.match(/^[-*]?\\s*SUGGEST:\\s*(.*)/i);\n if (suggestMatch) {\n suggestions.push(suggestMatch[1].trim());\n }\n }\n\n // Human-readable output on stderr\n const verdictColor = verdict === 'approved' ? chalk.green : chalk.red;\n console.error(verdictColor(`\\nVerdict: ${verdict.toUpperCase()} (${score ?? '?'}/10)`));\n if (issues.length > 0) {\n console.error(chalk.yellow(`Issues (${issues.length}):`));\n for (const issue of issues) {\n const sevColor = issue.severity === 'high' ? chalk.red : issue.severity === 'medium' ? chalk.yellow : chalk.dim;\n console.error(` ${sevColor(issue.severity.toUpperCase())} ${issue.message}`);\n }\n }\n if (suggestions.length > 0) {\n console.error(chalk.cyan(`Suggestions (${suggestions.length}):`));\n for (const s of suggestions) {\n console.error(` ${chalk.dim('→')} ${s}`);\n }\n }\n console.error(chalk.dim(`Duration: ${(result.durationMs / 1000).toFixed(1)}s | Tokens: ${result.usage.totalTokens}`));\n\n // JSON output on stdout (capped)\n const output = {\n planFile,\n phase: options.phase ?? null,\n buildId: options.build ?? null,\n verdict,\n score,\n issues,\n suggestions,\n review: result.text.slice(0, 2000),\n sessionId: result.sessionId,\n resumed: threadId ? result.sessionId === threadId : false,\n usage: result.usage,\n durationMs: result.durationMs,\n };\n console.log(JSON.stringify(output, null, 2));\n\n // Save to file if requested\n if (options.output) {\n writeFileSync(options.output, JSON.stringify(output, null, 2), 'utf-8');\n console.error(chalk.green(`Review saved to ${options.output}`));\n }\n\n db.close();\n } catch (error) {\n db?.close();\n console.error(chalk.red(`Error: ${error instanceof Error ? error.message : String(error)}`));\n process.exit(1);\n }\n}\n","// packages/cli/src/render.ts — Terminal rendering for AG-UI events\n\nimport type { EngineEvent, ProjectConfig } from '@codemoot/core';\nimport chalk from 'chalk';\nimport ora from 'ora';\n\n// Color scheme per role\nconst roleColors: Record<string, (text: string) => string> = {\n architect: chalk.blue,\n reviewer: chalk.yellow,\n implementer: chalk.green,\n};\n\nfunction getRoleColor(role: string): (text: string) => string {\n return roleColors[role] ?? chalk.white;\n}\n\n/**\n * Render a single AG-UI event to the terminal.\n */\nexport function renderEvent(event: EngineEvent, _config?: ProjectConfig): void {\n switch (event.type) {\n case 'session.started':\n console.log(chalk.gray(`\\n━━━ Session ${event.sessionId} ━━━`));\n console.log(chalk.gray(`Workflow: ${event.workflow}`));\n console.log(chalk.gray(`Task: ${event.task}\\n`));\n break;\n\n case 'session.completed':\n console.log(chalk.green('\\n━━━ Session Complete ━━━'));\n console.log(chalk.cyan(` Cost: $${event.totalCost.toFixed(4)}`));\n console.log(chalk.cyan(` Tokens: ${event.totalTokens.toLocaleString()}`));\n console.log(chalk.cyan(` Duration: ${(event.durationMs / 1000).toFixed(1)}s`));\n break;\n\n case 'session.failed':\n console.log(chalk.red('\\n━━━ Session Failed ━━━'));\n console.log(chalk.red(` Error: ${event.error}`));\n console.log(chalk.red(` Last step: ${event.lastStep}`));\n break;\n\n case 'step.started': {\n const color = getRoleColor(event.role);\n console.log(\n color(`\\n▶ [${event.role}] ${event.stepId} (${event.model}, iter ${event.iteration})`),\n );\n break;\n }\n\n case 'step.completed':\n console.log(\n chalk.gray(\n ` ✓ ${event.stepId} (${(event.durationMs / 1000).toFixed(1)}s, ${event.tokenUsage.totalTokens} tokens)`,\n ),\n );\n break;\n\n case 'step.failed':\n console.log(chalk.red(` ✗ ${event.stepId}: ${event.error}`));\n break;\n\n case 'text.delta': {\n const deltaColor = getRoleColor(event.role);\n process.stdout.write(deltaColor(event.delta));\n break;\n }\n\n case 'text.done':\n process.stdout.write('\\n');\n break;\n\n case 'loop.iteration': {\n const verdictColor = event.verdict === 'approved' ? chalk.green : chalk.yellow;\n console.log(\n verdictColor(`\\n ↻ Loop ${event.iteration}/${event.maxIterations}: ${event.verdict}`),\n );\n if (event.feedback) {\n console.log(chalk.gray(` Feedback: ${event.feedback.slice(0, 200)}...`));\n }\n break;\n }\n\n case 'cost.update':\n console.log(\n chalk.cyan(\n ` $${event.costUsd.toFixed(4)} (cumulative: $${event.cumulativeSessionCost.toFixed(4)})`,\n ),\n );\n break;\n }\n}\n\n// Spinner helpers for step lifecycle\nlet activeSpinner: ReturnType<typeof ora> | null = null;\n\nexport function startStepSpinner(stepId: string, role: string, model: string): void {\n const color = getRoleColor(role);\n activeSpinner = ora({\n text: color(`${role} working on ${stepId} (${model})...`),\n color: role === 'architect' ? 'blue' : role === 'reviewer' ? 'yellow' : 'green',\n }).start();\n}\n\nexport function stopStepSpinner(success: boolean): void {\n if (activeSpinner) {\n if (success) {\n activeSpinner.succeed();\n } else {\n activeSpinner.fail();\n }\n activeSpinner = null;\n }\n}\n\n/**\n * Print a final session summary with formatted output.\n */\nexport function printSessionSummary(result: {\n sessionId: string;\n status: string;\n totalCost: number;\n totalTokens: number;\n durationMs: number;\n iterations: number;\n}): void {\n console.log(chalk.bold('\\nSession Summary'));\n console.log(chalk.gray('-'.repeat(40)));\n console.log(` Session: ${chalk.white(result.sessionId)}`);\n console.log(\n ` Status: ${result.status === 'completed' ? chalk.green('completed') : chalk.red(result.status)}`,\n );\n console.log(` Cost: ${chalk.cyan(`$${result.totalCost.toFixed(4)}`)}`);\n console.log(` Tokens: ${chalk.cyan(result.totalTokens.toLocaleString())}`);\n console.log(` Duration: ${chalk.cyan(`${(result.durationMs / 1000).toFixed(1)}s`)}`);\n console.log(` Iterations: ${chalk.cyan(String(result.iterations))}`);\n console.log(chalk.gray('-'.repeat(40)));\n}\n","// packages/cli/src/commands/review.ts — unified review via codex: files, prompts, diffs + session continuity\n\nimport { loadConfig, ModelRegistry, BINARY_SNIFF_BYTES, REVIEW_DIFF_MAX_CHARS, SessionManager, JobStore, openDatabase, buildHandoffEnvelope, getReviewPreset, type CliAdapter } from '@codemoot/core';\nimport chalk from 'chalk';\nimport { execFileSync, execSync } from 'node:child_process';\nimport { closeSync, globSync, openSync, readFileSync, readSync, statSync, existsSync } from 'node:fs';\nimport { resolve } from 'node:path';\n\nimport { createProgressCallbacks } from '../progress.js';\nimport { getDbPath } from '../utils.js';\n\nconst MAX_FILE_SIZE = 100 * 1024; // 100KB per file\nconst MAX_TOTAL_SIZE = 200 * 1024; // 200KB total content\n\ninterface ReviewOptions {\n focus?: string;\n timeout?: number;\n session?: string;\n prompt?: string;\n stdin?: boolean;\n diff?: string;\n scope?: string;\n preset?: string;\n background?: boolean;\n}\n\nexport async function reviewCommand(fileOrGlob: string | undefined, options: ReviewOptions): Promise<void> {\n try {\n const projectDir = process.cwd();\n\n // ── Validate input modes: exactly one of file-or-glob, --prompt, --stdin, --diff ──\n const modes = [\n fileOrGlob ? 'file' : '',\n options.prompt ? 'prompt' : '',\n options.stdin ? 'stdin' : '',\n options.diff ? 'diff' : '',\n ].filter(Boolean);\n\n if (modes.length === 0) {\n console.error(chalk.red('No input specified. Use: <file-or-glob>, --prompt, --stdin, or --diff'));\n process.exit(1);\n }\n if (modes.length > 1) {\n console.error(chalk.red(`Conflicting input modes: ${modes.join(', ')}. Use exactly one.`));\n process.exit(1);\n }\n\n if (options.scope && !options.prompt && !options.stdin) {\n console.error(chalk.red('--scope can only be used with --prompt or --stdin'));\n process.exit(1);\n }\n\n const config = loadConfig();\n const registry = ModelRegistry.fromConfig(config, projectDir);\n const adapter = registry.tryGetAdapter('codex-reviewer') ?? registry.tryGetAdapter('codex-architect');\n\n if (!adapter) {\n // Check if codex CLI is actually installed\n try {\n execSync('codex --version', { stdio: 'pipe', encoding: 'utf-8' });\n } catch {\n console.error(chalk.red('Codex CLI is not installed or not in PATH.'));\n console.error(chalk.yellow('Install it: npm install -g @openai/codex'));\n console.error(chalk.yellow('Then run: codemoot init'));\n process.exit(1);\n }\n console.error(chalk.red('No codex adapter found in config. Run: codemoot init'));\n console.error(chalk.dim('Diagnose: codemoot doctor'));\n process.exit(1);\n }\n\n // ── Background mode: enqueue and return immediately ──\n if (options.background) {\n const db = openDatabase(getDbPath());\n const jobStore = new JobStore(db);\n const jobId = jobStore.enqueue({\n type: 'review',\n payload: {\n fileOrGlob: fileOrGlob ?? null,\n focus: options.focus,\n timeout: options.timeout,\n prompt: options.prompt,\n stdin: options.stdin,\n diff: options.diff,\n scope: options.scope,\n cwd: projectDir,\n },\n });\n console.log(JSON.stringify({ jobId, status: 'queued', message: 'Review enqueued. Check with: codemoot jobs status ' + jobId }));\n db.close();\n return;\n }\n\n // Resolve unified session\n const db = openDatabase(getDbPath());\n const sessionMgr = new SessionManager(db);\n const session = options.session\n ? sessionMgr.get(options.session)\n : sessionMgr.resolveActive('review');\n\n if (!session) {\n console.error(chalk.red(options.session\n ? `Session not found: ${options.session}`\n : 'No active session. Run: codemoot init'));\n db.close();\n process.exit(1);\n }\n\n // Check overflow — auto-rollover if needed\n const overflowCheck = sessionMgr.preCallOverflowCheck(session.id);\n if (overflowCheck.rolled) {\n console.error(chalk.yellow(` ${overflowCheck.message}`));\n }\n\n // ── Resolve preset (overrides focus/timeout if set) ──\n const preset = options.preset ? getReviewPreset(options.preset) : undefined;\n if (options.preset && !preset) {\n console.error(chalk.red(`Unknown preset: ${options.preset}. Use: security-audit, performance, quick-scan, pre-commit, api-review`));\n db.close();\n process.exit(1);\n }\n\n // ── Build prompt based on input mode ──\n const focusArea = preset?.focus ?? options.focus ?? 'all';\n const focusConstraint = focusArea === 'all'\n ? 'Review for: correctness, bugs, security, performance, code quality'\n : `Focus specifically on: ${focusArea}`;\n const presetConstraints = preset?.constraints ?? [];\n\n const currentSession = sessionMgr.get(session.id);\n const sessionThreadId = currentSession?.codexThreadId ?? undefined;\n const isResumed = Boolean(sessionThreadId);\n\n let prompt: string;\n let promptPreview: string;\n const mode = modes[0];\n\n if (mode === 'prompt' || mode === 'stdin') {\n // ── Prompt mode: codex explores codebase via tools ──\n let instruction = options.prompt ?? '';\n if (mode === 'stdin') {\n const chunks: Buffer[] = [];\n for await (const chunk of process.stdin) {\n chunks.push(chunk as Buffer);\n }\n instruction = Buffer.concat(chunks).toString('utf-8').trim();\n if (!instruction) {\n console.error(chalk.red('No input received from stdin'));\n db.close();\n process.exit(1);\n }\n }\n\n prompt = buildHandoffEnvelope({\n command: 'review',\n task: `TASK: ${instruction}\\n\\nStart by listing candidate files, then inspect them thoroughly.`,\n constraints: [focusConstraint, ...presetConstraints],\n scope: options.scope,\n resumed: isResumed,\n });\n\n promptPreview = `Prompt review: ${instruction.slice(0, 100)}`;\n console.error(chalk.cyan(`Reviewing via prompt (session: ${session.id.slice(0, 8)}...)...`));\n\n } else if (mode === 'diff') {\n // ── Diff mode: review git changes ──\n let diff: string;\n try {\n diff = execFileSync('git', ['diff', '--', ...(options.diff as string).split(/\\s+/)], {\n cwd: projectDir,\n encoding: 'utf-8',\n maxBuffer: 1024 * 1024,\n });\n } catch (err) {\n console.error(chalk.red(`Failed to get diff for ${options.diff}: ${err instanceof Error ? err.message : String(err)}`));\n db.close();\n process.exit(1);\n }\n\n if (!diff.trim()) {\n console.error(chalk.yellow(`No changes in diff: ${options.diff}`));\n db.close();\n process.exit(0);\n }\n\n prompt = buildHandoffEnvelope({\n command: 'review',\n task: `Review the following code changes.\\n\\nGIT DIFF (${options.diff}):\\n${diff.slice(0, REVIEW_DIFF_MAX_CHARS)}`,\n constraints: [focusConstraint, ...presetConstraints],\n resumed: isResumed,\n });\n\n promptPreview = `Diff review: ${options.diff}`;\n console.error(chalk.cyan(`Reviewing diff ${options.diff} (session: ${session.id.slice(0, 8)}...)...`));\n\n } else {\n // ── File mode (original behavior) ──\n // If input is a directory, auto-expand to recursive glob\n let globPattern = fileOrGlob as string;\n const resolvedInput = resolve(projectDir, globPattern);\n if (existsSync(resolvedInput) && statSync(resolvedInput).isDirectory()) {\n globPattern = `${globPattern}/**/*`;\n console.error(chalk.dim(` Expanding directory to: ${globPattern}`));\n }\n const projectRoot = resolve(projectDir) + (process.platform === 'win32' ? '\\\\' : '/');\n const paths = globSync(globPattern, { cwd: projectDir })\n .map(p => resolve(projectDir, p))\n .filter(p => p.startsWith(projectRoot) || p === resolve(projectDir));\n if (paths.length === 0) {\n console.error(chalk.red(`No files matched: ${fileOrGlob}`));\n db.close();\n process.exit(1);\n }\n\n const files: { path: string; content: string }[] = [];\n let totalSize = 0;\n\n for (const filePath of paths) {\n const stat = statSync(filePath);\n if (!stat.isFile()) continue;\n if (stat.size > MAX_FILE_SIZE) {\n console.error(chalk.yellow(`Skipping ${filePath} (${(stat.size / 1024).toFixed(0)}KB > 100KB limit)`));\n continue;\n }\n if (totalSize + stat.size > MAX_TOTAL_SIZE) {\n console.error(chalk.yellow(`Skipping remaining files (total would exceed 200KB)`));\n break;\n }\n\n const buf = Buffer.alloc(BINARY_SNIFF_BYTES);\n const fd = openSync(filePath, 'r');\n const bytesRead = readSync(fd, buf, 0, BINARY_SNIFF_BYTES, 0);\n closeSync(fd);\n if (buf.subarray(0, bytesRead).includes(0)) {\n console.error(chalk.yellow(`Skipping ${filePath} (binary file)`));\n continue;\n }\n\n const content = readFileSync(filePath, 'utf-8');\n const relativePath = filePath.replace(projectDir, '').replace(/\\\\/g, '/').replace(/^\\//, '');\n files.push({ path: relativePath, content });\n totalSize += stat.size;\n }\n\n if (files.length === 0) {\n console.error(chalk.red('No readable files to review'));\n db.close();\n process.exit(1);\n }\n\n const fileContents = files.map(f => `--- ${f.path} ---\\n${f.content}`).join('\\n\\n');\n\n prompt = buildHandoffEnvelope({\n command: 'review',\n task: `Review the following code files.\\n\\nFILES TO REVIEW:\\n${fileContents}`,\n constraints: [focusConstraint, ...presetConstraints],\n resumed: isResumed,\n });\n\n promptPreview = `Review ${files.length} file(s): ${files.map(f => f.path).join(', ')}`;\n console.error(chalk.cyan(`Reviewing ${files.length} file(s) via codex (session: ${session.id.slice(0, 8)}...)...`));\n }\n\n // ── Execute review via codex with session resume ──\n const timeoutMs = (options.timeout ?? 600) * 1000;\n const progress = createProgressCallbacks('review');\n\n const result = await (adapter as CliAdapter).callWithResume(prompt, {\n sessionId: sessionThreadId,\n timeout: timeoutMs,\n ...progress,\n });\n\n // Update session\n if (result.sessionId) {\n sessionMgr.updateThreadId(session.id, result.sessionId);\n }\n sessionMgr.addUsageFromResult(session.id, result.usage, prompt, result.text);\n\n sessionMgr.recordEvent({\n sessionId: session.id,\n command: 'review',\n subcommand: mode,\n promptPreview: promptPreview.slice(0, 500),\n responsePreview: result.text.slice(0, 500),\n promptFull: prompt,\n responseFull: result.text,\n usageJson: JSON.stringify(result.usage),\n durationMs: result.durationMs,\n codexThreadId: result.sessionId,\n });\n\n // ── Parse findings ──\n const findings: { severity: string; file: string; line: string; message: string }[] = [];\n for (const line of result.text.split('\\n')) {\n const match = line.match(/^-\\s*(CRITICAL|WARNING|INFO):\\s*(\\S+?)(?::(\\d+))?\\s+(.+)/);\n if (match) {\n findings.push({\n severity: match[1].toLowerCase(),\n file: match[2],\n line: match[3] ?? '?',\n message: match[4],\n });\n }\n }\n\n const tail = result.text.slice(-500);\n const verdictMatch = tail.match(/^(?:-\\s*)?VERDICT:\\s*(APPROVED|NEEDS_REVISION)/m);\n const scoreMatch = tail.match(/SCORE:\\s*(\\d+)\\/10/);\n\n const output = {\n mode,\n findings,\n verdict: verdictMatch ? verdictMatch[1].toLowerCase() : 'unknown',\n score: scoreMatch ? Number.parseInt(scoreMatch[1], 10) : null,\n review: result.text.slice(0, 2000),\n sessionId: session.id,\n codexThreadId: result.sessionId,\n resumed: sessionThreadId ? result.sessionId === sessionThreadId : false,\n usage: result.usage,\n durationMs: result.durationMs,\n };\n\n // Human-readable summary on stderr\n const verdictColor = output.verdict === 'approved' ? chalk.green : chalk.red;\n console.error(verdictColor(`\\nVerdict: ${output.verdict.toUpperCase()} (${output.score ?? '?'}/10)`));\n if (findings.length > 0) {\n console.error(chalk.yellow(`Findings (${findings.length}):`));\n for (const f of findings) {\n const sev = f.severity === 'critical' ? chalk.red('CRITICAL') :\n f.severity === 'warning' ? chalk.yellow('WARNING') : chalk.dim('INFO');\n console.error(` ${sev} ${f.file}:${f.line} — ${f.message}`);\n }\n } else {\n console.error(chalk.green('No issues found.'));\n }\n console.error(chalk.dim(`Duration: ${(output.durationMs / 1000).toFixed(1)}s | Tokens: ${output.usage?.totalTokens ?? '?'}`));\n\n console.log(JSON.stringify(output, null, 2));\n db.close();\n } catch (error) {\n console.error(chalk.red(`Error: ${error instanceof Error ? error.message : String(error)}`));\n process.exit(1);\n }\n}\n","import type { ExecutionMode } from '@codemoot/core';\nimport { ModelRegistry, Orchestrator, loadConfig, openDatabase } from '@codemoot/core';\nimport chalk from 'chalk';\n\nimport { printSessionSummary, renderEvent } from '../render.js';\nimport { getDbPath } from '../utils.js';\n\ninterface RunOptions {\n mode?: string;\n maxIterations?: number;\n stream?: boolean;\n}\n\nexport async function runCommand(task: string, options: RunOptions): Promise<void> {\n try {\n // 1. Load config\n const config = loadConfig();\n\n // 2. Create model registry (pass cwd so codex runs in the project dir)\n const projectDir = process.cwd();\n const registry = ModelRegistry.fromConfig(config, projectDir);\n\n // 3. Health check\n const health = await registry.healthCheckAll();\n for (const [alias, hasKey] of health) {\n if (!hasKey) {\n console.warn(chalk.yellow(`Warning: No API key for model \"${alias}\"`));\n }\n }\n\n // 4. Open database\n const dbPath = getDbPath();\n const db = openDatabase(dbPath);\n\n // 5. Create orchestrator\n const orchestrator = new Orchestrator({ registry, db, config });\n\n // 6. Subscribe to events\n orchestrator.on('event', (event) => renderEvent(event, config));\n\n // 7. Execute\n const result = await orchestrator.run(task, {\n mode: (options.mode as ExecutionMode) ?? config.mode,\n maxIterations: options.maxIterations,\n stream: options.stream,\n });\n\n // 8. Print summary\n printSessionSummary(result);\n\n db.close();\n process.exit(result.status === 'completed' ? 0 : 2);\n } catch (error) {\n console.error(chalk.red(`Error: ${error instanceof Error ? error.message : String(error)}`));\n process.exit(1);\n }\n}\n","// packages/cli/src/commands/shipit.ts — Composite workflow profiles\n\nimport { execSync } from 'node:child_process';\nimport { DEFAULT_RULES, type PolicyContext, evaluatePolicy } from '@codemoot/core';\nimport chalk from 'chalk';\n\ninterface ShipitOptions {\n profile: string;\n dryRun: boolean;\n noCommit: boolean;\n json: boolean;\n strictOutput: boolean;\n}\n\ninterface StepResult {\n name: string;\n status: 'passed' | 'failed' | 'skipped';\n output?: string;\n durationMs: number;\n}\n\nconst PROFILES: Record<string, string[]> = {\n fast: ['review'],\n safe: ['lint', 'test', 'review', 'cleanup'],\n full: ['lint', 'test', 'review', 'cleanup', 'commit'],\n};\n\nfunction runStep(name: string, dryRun: boolean): StepResult {\n const start = Date.now();\n if (dryRun) {\n return { name, status: 'skipped', output: 'dry-run', durationMs: 0 };\n }\n\n try {\n let cmd: string;\n switch (name) {\n case 'lint':\n cmd = 'npx biome check .';\n break;\n case 'test':\n cmd = 'pnpm run test';\n break;\n case 'review':\n cmd = 'codemoot review --preset pre-commit --diff HEAD';\n break;\n case 'cleanup':\n cmd = 'codemoot cleanup --scope deps';\n break;\n case 'commit':\n return { name, status: 'skipped', output: 'handled by shipit', durationMs: 0 };\n default:\n return { name, status: 'skipped', output: `unknown step: ${name}`, durationMs: 0 };\n }\n\n const output = execSync(cmd, {\n encoding: 'utf-8',\n timeout: 300000,\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n return {\n name,\n status: 'passed',\n output: output.slice(0, 2000),\n durationMs: Date.now() - start,\n };\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n return { name, status: 'failed', output: msg.slice(0, 2000), durationMs: Date.now() - start };\n }\n}\n\nexport async function shipitCommand(options: ShipitOptions): Promise<void> {\n const profile = options.profile;\n const steps = PROFILES[profile];\n\n if (!steps) {\n console.error(chalk.red(`Unknown profile: ${profile}. Use: fast, safe, full`));\n process.exit(1);\n }\n\n if (options.dryRun) {\n console.error(chalk.cyan(`Shipit dry-run (profile: ${profile})`));\n console.error(chalk.dim(`Steps: ${steps.join(' → ')}`));\n } else {\n console.error(chalk.cyan(`Shipit (profile: ${profile}): ${steps.join(' → ')}`));\n }\n\n const results: StepResult[] = [];\n let shouldStop = false;\n\n for (const step of steps) {\n if (shouldStop) {\n results.push({ name: step, status: 'skipped', durationMs: 0 });\n continue;\n }\n\n const result = runStep(step, options.dryRun);\n results.push(result);\n\n if (!options.dryRun) {\n const icon =\n result.status === 'passed'\n ? chalk.green('OK')\n : result.status === 'failed'\n ? chalk.red('FAIL')\n : chalk.dim('SKIP');\n console.error(` ${icon} ${result.name} (${result.durationMs}ms)`);\n }\n\n if (result.status === 'failed' && (step === 'lint' || step === 'test')) {\n shouldStop = true;\n }\n }\n\n // Policy evaluation\n const reviewResult = results.find((r) => r.name === 'review');\n const criticalCount = reviewResult?.output?.match(/CRITICAL/gi)?.length ?? 0;\n const warningCount = reviewResult?.output?.match(/WARNING/gi)?.length ?? 0;\n const verdictMatch = reviewResult?.output?.match(/VERDICT:\\s*(APPROVED|NEEDS_REVISION)/i);\n\n const policyCtx: PolicyContext = {\n criticalCount,\n warningCount,\n verdict: verdictMatch ? verdictMatch[1].toLowerCase() : 'unknown',\n stepsCompleted: Object.fromEntries(results.map((r) => [r.name, r.status])),\n cleanupHighCount: 0,\n };\n\n const policyResult = evaluatePolicy('review.completed', policyCtx, DEFAULT_RULES);\n\n if (policyResult.decision === 'block') {\n console.error(chalk.red('Policy BLOCKED:'));\n for (const v of policyResult.violations) {\n console.error(chalk.red(` - ${v.message}`));\n }\n } else if (policyResult.decision === 'warn') {\n for (const v of policyResult.violations) {\n console.error(chalk.yellow(` Warning: ${v.message}`));\n }\n }\n\n const output = {\n profile,\n steps: results,\n policy: policyResult,\n canCommit: policyResult.decision !== 'block' && !shouldStop && !options.noCommit,\n };\n\n if (options.json) {\n console.log(JSON.stringify(output, null, 2));\n } else {\n const allPassed = results.every((r) => r.status === 'passed' || r.status === 'skipped');\n if (allPassed && policyResult.decision !== 'block') {\n console.error(chalk.green('\\nAll checks passed. Ready to commit.'));\n } else {\n console.error(chalk.red('\\nSome checks failed or policy blocked.'));\n }\n }\n}\n","// packages/cli/src/commands/start.ts — First-run concierge: verify → init → quick review\n\nimport { existsSync } from 'node:fs';\nimport { execFileSync, execSync } from 'node:child_process';\nimport { join, basename } from 'node:path';\nimport chalk from 'chalk';\nimport { loadConfig, writeConfig, type PresetName } from '@codemoot/core';\n\nexport async function startCommand(): Promise<void> {\n const cwd = process.cwd();\n console.error(chalk.cyan('\\n CodeMoot — First Run Setup\\n'));\n\n // Step 1: Verify Codex CLI\n console.error(chalk.dim(' [1/4] Checking Codex CLI...'));\n let codexVersion: string | null = null;\n try {\n codexVersion = execSync('codex --version', { stdio: 'pipe', encoding: 'utf-8' }).trim();\n } catch {\n // not installed\n }\n\n if (!codexVersion) {\n console.error(chalk.red(' Codex CLI is not installed.'));\n console.error(chalk.yellow(' Install it: npm install -g @openai/codex'));\n console.error(chalk.yellow(' Then run: codemoot start'));\n process.exit(1);\n }\n console.error(chalk.green(` Codex CLI ${codexVersion} found.`));\n\n // Step 2: Check/create config\n console.error(chalk.dim(' [2/4] Checking project config...'));\n const configPath = join(cwd, '.cowork.yml');\n if (existsSync(configPath)) {\n console.error(chalk.green(' .cowork.yml exists — using it.'));\n } else {\n const config = loadConfig({ preset: 'cli-first' as PresetName, skipFile: true });\n config.project.name = basename(cwd);\n writeConfig(config, cwd);\n console.error(chalk.green(' Created .cowork.yml with cli-first preset.'));\n }\n\n // Step 3: Detect project type\n console.error(chalk.dim(' [3/4] Detecting project...'));\n const hasGit = existsSync(join(cwd, '.git'));\n const hasSrc = existsSync(join(cwd, 'src'));\n const hasPackageJson = existsSync(join(cwd, 'package.json'));\n\n let reviewTarget = '';\n if (hasGit) {\n try {\n const diff = execSync('git diff --name-only HEAD', { cwd, encoding: 'utf-8', stdio: 'pipe' }).trim();\n if (diff) {\n const files = diff.split('\\n').filter(f => f.endsWith('.ts') || f.endsWith('.js') || f.endsWith('.tsx') || f.endsWith('.jsx') || f.endsWith('.py'));\n if (files.length > 0) {\n reviewTarget = files.slice(0, 10).join(' ');\n console.error(chalk.green(` Found ${files.length} changed file(s) — reviewing those.`));\n }\n }\n } catch {\n // no git diff available\n }\n }\n\n if (!reviewTarget) {\n if (hasSrc) {\n reviewTarget = 'src/';\n console.error(chalk.green(' Found src/ directory — reviewing it.'));\n } else if (hasPackageJson) {\n reviewTarget = '**/*.ts';\n console.error(chalk.green(' TypeScript project — reviewing *.ts files.'));\n } else {\n console.error(chalk.yellow(' No src/ or package.json found. Try: codemoot review <path>'));\n process.exit(0);\n }\n }\n\n // Step 4: Run quick review\n console.error(chalk.dim(' [4/4] Running quick review...'));\n console.error(chalk.cyan(`\\n codemoot review ${reviewTarget} --preset quick-scan\\n`));\n\n try {\n const output = execFileSync('codemoot', ['review', reviewTarget, '--preset', 'quick-scan'], {\n cwd,\n encoding: 'utf-8',\n timeout: 300000,\n stdio: ['pipe', 'pipe', 'inherit'],\n shell: process.platform === 'win32',\n });\n\n // Parse and display summary\n try {\n const result = JSON.parse(output);\n const findingCount = result.findings?.length ?? 0;\n const verdict = result.verdict ?? 'unknown';\n const score = result.score;\n\n console.error('');\n if (findingCount > 0) {\n console.error(chalk.yellow(` Found ${findingCount} issue(s). Score: ${score ?? '?'}/10`));\n console.error('');\n console.error(chalk.cyan(' Next steps:'));\n console.error(chalk.dim(` codemoot fix ${reviewTarget} --dry-run # preview fixes`));\n console.error(chalk.dim(` codemoot fix ${reviewTarget} # apply fixes`));\n console.error(chalk.dim(' codemoot review --preset security-audit # deeper scan'));\n } else if (verdict === 'approved') {\n console.error(chalk.green(` Code looks good! Score: ${score ?? '?'}/10`));\n console.error('');\n console.error(chalk.cyan(' Next steps:'));\n console.error(chalk.dim(' codemoot review --preset security-audit # security scan'));\n console.error(chalk.dim(' codemoot debate start \"your question\" # debate with GPT'));\n console.error(chalk.dim(' codemoot watch # watch for changes'));\n } else {\n console.error(chalk.dim(` Review complete. Verdict: ${verdict}, Score: ${score ?? '?'}/10`));\n }\n } catch {\n // Raw output if not JSON\n console.log(output);\n }\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n if (msg.includes('ETIMEDOUT') || msg.includes('timeout')) {\n console.error(chalk.yellow(' Review timed out. Try: codemoot review --preset quick-scan'));\n } else {\n console.error(chalk.red(` Review failed: ${msg.slice(0, 200)}`));\n }\n }\n\n console.error(chalk.dim(' Tip: Run codemoot install-skills to add /debate, /build, /cleanup'));\n console.error(chalk.dim(' slash commands to Claude Code in this project.'));\n console.error('');\n}\n","// packages/cli/src/commands/watch.ts — File watcher that enqueues review jobs on change\n\nimport { JobStore, openDatabase } from '@codemoot/core';\nimport chalk from 'chalk';\nimport { watch } from 'chokidar';\n\nimport { getDbPath } from '../utils.js';\nimport { Debouncer } from '../watch/debouncer.js';\n\ninterface WatchOptions {\n glob: string;\n focus: string;\n timeout: number;\n quietMs: number;\n maxWaitMs: number;\n cooldownMs: number;\n}\n\nexport async function watchCommand(options: WatchOptions): Promise<void> {\n const projectDir = process.cwd();\n const db = openDatabase(getDbPath());\n const jobStore = new JobStore(db);\n\n const debouncer = new Debouncer(\n (batch) => {\n // Dedupe: skip if a watch-review job is already queued for same scope\n const dedupeKey = `watch-review:${batch.files.sort().join(',')}`.slice(0, 255);\n if (jobStore.hasActiveByType('watch-review')) {\n console.error(\n chalk.yellow(` Skipping batch ${batch.batchId} — watch-review already queued/running`),\n );\n return;\n }\n\n const jobId = jobStore.enqueue({\n type: 'watch-review',\n payload: {\n files: batch.files,\n focus: options.focus,\n timeout: options.timeout,\n cwd: projectDir,\n batchId: batch.batchId,\n reason: batch.reason,\n },\n dedupeKey,\n });\n\n const event = {\n type: 'watch_batch',\n jobId,\n batchId: batch.batchId,\n files: batch.files.length,\n reason: batch.reason,\n ts: new Date().toISOString(),\n };\n console.log(JSON.stringify(event));\n },\n {\n quietMs: options.quietMs,\n maxWaitMs: options.maxWaitMs,\n cooldownMs: options.cooldownMs,\n },\n );\n\n const ignored = [\n '**/node_modules/**',\n '**/.git/**',\n '**/dist/**',\n '**/.cowork/**',\n '**/coverage/**',\n '**/*.db',\n '**/*.db-journal',\n '**/*.db-wal',\n ];\n\n console.error(chalk.cyan(`Watching ${options.glob} for changes...`));\n console.error(\n chalk.dim(\n ` quiet=${options.quietMs}ms, maxWait=${options.maxWaitMs}ms, cooldown=${options.cooldownMs}ms`,\n ),\n );\n\n const watcher = watch(options.glob, {\n cwd: projectDir,\n ignored,\n ignoreInitial: true,\n awaitWriteFinish: { stabilityThreshold: 200, pollInterval: 50 },\n });\n\n watcher.on('all', (event, path) => {\n if (event === 'add' || event === 'change' || event === 'unlink') {\n debouncer.push({ path, event, ts: Date.now() });\n }\n });\n\n // Graceful shutdown\n const shutdown = () => {\n console.error(chalk.dim('\\nShutting down watcher...'));\n debouncer.flushNow();\n debouncer.destroy();\n watcher.close();\n db.close();\n process.exit(0);\n };\n\n process.on('SIGINT', shutdown);\n process.on('SIGTERM', shutdown);\n}\n","// packages/cli/src/watch/debouncer.ts — Coalescing debouncer for file watch events\n\nexport interface ChangeEvent {\n path: string;\n event: 'add' | 'change' | 'unlink';\n ts: number;\n}\n\nexport interface DebounceConfig {\n quietMs: number; // ms of quiet before flushing (default 800)\n maxWaitMs: number; // max ms before forced flush (default 5000)\n cooldownMs: number; // ms after flush before accepting new batch (default 1500)\n maxBatchSize: number; // max files per batch (default 50)\n}\n\nexport interface FlushBatch {\n files: string[];\n batchId: string;\n windowStart: number;\n windowEnd: number;\n reason: 'quiet' | 'maxWait' | 'maxBatch' | 'manual';\n}\n\nconst DEFAULT_CONFIG: DebounceConfig = {\n quietMs: 800,\n maxWaitMs: 5000,\n cooldownMs: 1500,\n maxBatchSize: 50,\n};\n\nlet batchCounter = 0;\n\nexport class Debouncer {\n private config: DebounceConfig;\n private pending: Map<string, ChangeEvent> = new Map();\n private quietTimer: ReturnType<typeof setTimeout> | null = null;\n private maxWaitTimer: ReturnType<typeof setTimeout> | null = null;\n private cooldownUntil = 0;\n private windowStart = 0;\n private onFlush: (batch: FlushBatch) => void;\n private destroyed = false;\n\n constructor(onFlush: (batch: FlushBatch) => void, config?: Partial<DebounceConfig>) {\n this.onFlush = onFlush;\n this.config = { ...DEFAULT_CONFIG, ...config };\n }\n\n push(e: ChangeEvent): boolean {\n if (this.destroyed) return false;\n if (e.ts < this.cooldownUntil) return false;\n\n if (this.pending.size === 0) {\n this.windowStart = e.ts;\n this.startMaxWaitTimer();\n }\n\n this.pending.set(e.path, e);\n this.restartQuietTimer();\n\n if (this.pending.size >= this.config.maxBatchSize) {\n this.flush('maxBatch');\n }\n\n return true;\n }\n\n flushNow(): void {\n this.flush('manual');\n }\n\n cancel(): void {\n this.clearTimers();\n this.pending.clear();\n }\n\n destroy(): void {\n this.cancel();\n this.destroyed = true;\n }\n\n getPendingCount(): number {\n return this.pending.size;\n }\n\n private flush(reason: FlushBatch['reason']): void {\n if (this.pending.size === 0) return;\n this.clearTimers();\n\n const now = Date.now();\n const batch: FlushBatch = {\n files: [...this.pending.keys()],\n batchId: `wb-${++batchCounter}`,\n windowStart: this.windowStart,\n windowEnd: now,\n reason,\n };\n\n this.pending.clear();\n this.cooldownUntil = now + this.config.cooldownMs;\n this.onFlush(batch);\n }\n\n private restartQuietTimer(): void {\n if (this.quietTimer) clearTimeout(this.quietTimer);\n this.quietTimer = setTimeout(() => this.flush('quiet'), this.config.quietMs);\n }\n\n private startMaxWaitTimer(): void {\n if (this.maxWaitTimer) return;\n this.maxWaitTimer = setTimeout(() => this.flush('maxWait'), this.config.maxWaitMs);\n }\n\n private clearTimers(): void {\n if (this.quietTimer) {\n clearTimeout(this.quietTimer);\n this.quietTimer = null;\n }\n if (this.maxWaitTimer) {\n clearTimeout(this.maxWaitTimer);\n this.maxWaitTimer = null;\n }\n }\n}\n","// packages/cli/src/commands/worker.ts — Background job worker that processes queued jobs\n\nimport {\n type CliAdapter,\n JobStore,\n ModelRegistry,\n REVIEW_DIFF_MAX_CHARS,\n buildHandoffEnvelope,\n loadConfig,\n openDatabase,\n} from '@codemoot/core';\nimport chalk from 'chalk';\nimport { execSync } from 'node:child_process';\n\nimport { createProgressCallbacks } from '../progress.js';\nimport { getDbPath } from '../utils.js';\n\ninterface WorkerOptions {\n once: boolean;\n pollMs: number;\n workerId: string;\n}\n\nexport async function workerCommand(options: WorkerOptions): Promise<void> {\n const projectDir = process.cwd();\n const db = openDatabase(getDbPath());\n const jobStore = new JobStore(db);\n const config = loadConfig();\n const registry = ModelRegistry.fromConfig(config, projectDir);\n const adapter =\n registry.tryGetAdapter('codex-reviewer') ?? registry.tryGetAdapter('codex-architect');\n if (!adapter) {\n try {\n execSync('codex --version', { stdio: 'pipe', encoding: 'utf-8' });\n } catch {\n console.error(chalk.red('Codex CLI is not installed or not in PATH.'));\n console.error(chalk.yellow('Install it: npm install -g @openai/codex'));\n db.close();\n process.exit(1);\n }\n console.error(chalk.red('No codex adapter found in config. Run: codemoot init'));\n db.close();\n process.exit(1);\n }\n\n const workerId = options.workerId;\n console.error(\n chalk.cyan(`Worker ${workerId} started (poll: ${options.pollMs}ms, once: ${options.once})`),\n );\n\n let running = true;\n const shutdown = () => {\n running = false;\n console.error(chalk.dim('\\nWorker shutting down...'));\n };\n process.on('SIGINT', shutdown);\n process.on('SIGTERM', shutdown);\n\n while (running) {\n const job = jobStore.claimNext(workerId)[0];\n\n if (!job) {\n if (options.once) {\n console.error(chalk.dim('No jobs in queue. Exiting (--once mode).'));\n break;\n }\n await new Promise((r) => setTimeout(r, options.pollMs));\n continue;\n }\n\n console.error(chalk.cyan(`Processing job ${job.id} (type: ${job.type})`));\n jobStore.appendLog(job.id, 'info', 'job_started', `Worker ${workerId} claimed job`);\n\n try {\n const { resolve, normalize } = await import('node:path');\n const payload = JSON.parse(job.payloadJson) as Record<string, unknown>;\n const rawCwd = resolve((payload.path as string) ?? (payload.cwd as string) ?? projectDir);\n const cwd = normalize(rawCwd);\n // Prevent path traversal — resolved path must be within projectDir\n const sep = process.platform === 'win32' ? '\\\\' : '/';\n if (cwd !== normalize(projectDir) && !cwd.startsWith(normalize(projectDir) + sep)) {\n throw new Error(`Path traversal blocked: \"${cwd}\" is outside project directory \"${projectDir}\"`);\n }\n const timeout = ((payload.timeout as number) ?? 600) * 1000;\n\n let prompt: string;\n\n if (job.type === 'review' || job.type === 'watch-review') {\n const focus = (payload.focus as string) ?? 'all';\n const focusConstraint =\n focus === 'all'\n ? 'Review for: correctness, bugs, security, performance, code quality'\n : `Focus specifically on: ${focus}`;\n\n if (payload.prompt) {\n prompt = buildHandoffEnvelope({\n command: 'review',\n task: `TASK: ${payload.prompt}\\n\\nStart by listing candidate files, then inspect them thoroughly.`,\n constraints: [focusConstraint],\n resumed: false,\n });\n } else if (payload.diff) {\n const { execFileSync } = await import('node:child_process');\n // Validate diff args — only allow safe git ref patterns (no flag injection)\n const diffArgs = (payload.diff as string).split(/\\s+/).filter(a => a.length > 0);\n for (const arg of diffArgs) {\n if (arg.startsWith('-') || !/^[a-zA-Z0-9_.~^:\\/\\\\@{}]+$/.test(arg)) {\n throw new Error(`Invalid diff argument: \"${arg}\" — only git refs and paths allowed`);\n }\n }\n const diff = execFileSync('git', ['diff', ...diffArgs], {\n cwd,\n encoding: 'utf-8',\n maxBuffer: 1024 * 1024,\n });\n prompt = buildHandoffEnvelope({\n command: 'review',\n task: `Review these code changes.\\n\\nGIT DIFF:\\n${diff.slice(0, REVIEW_DIFF_MAX_CHARS)}`,\n constraints: [focusConstraint],\n resumed: false,\n });\n } else if (payload.files && Array.isArray(payload.files)) {\n prompt = buildHandoffEnvelope({\n command: 'review',\n task: `Review these files: ${(payload.files as string[]).join(', ')}. Read each file and report issues.`,\n constraints: [focusConstraint],\n resumed: false,\n });\n } else {\n prompt = buildHandoffEnvelope({\n command: 'review',\n task: 'Review the codebase for issues. Start by listing key files.',\n constraints: [focusConstraint],\n resumed: false,\n });\n }\n } else if (job.type === 'cleanup') {\n prompt = buildHandoffEnvelope({\n command: 'cleanup',\n task: `Scan ${cwd} for: unused dependencies, dead code, duplicates, hardcoded values. Report findings with confidence levels.`,\n constraints: [`Scope: ${payload.scope ?? 'all'}`],\n resumed: false,\n });\n } else {\n jobStore.fail(job.id, `Unsupported job type: ${job.type}`);\n continue;\n }\n\n jobStore.appendLog(job.id, 'info', 'codex_started', 'Sending to codex...');\n const progress = createProgressCallbacks('worker');\n\n const result = await (adapter as CliAdapter).callWithResume(prompt, {\n timeout,\n ...progress,\n });\n\n jobStore.appendLog(\n job.id,\n 'info',\n 'codex_completed',\n `Received ${result.text.length} chars in ${result.durationMs}ms`,\n );\n\n // Store result\n const resultData: Record<string, unknown> = {\n text: result.text,\n usage: result.usage,\n durationMs: result.durationMs,\n sessionId: result.sessionId,\n };\n\n jobStore.succeed(job.id, resultData);\n console.error(chalk.green(`Job ${job.id} completed (${result.durationMs}ms)`));\n } catch (err) {\n const errMsg = err instanceof Error ? err.message : String(err);\n jobStore.appendLog(job.id, 'error', 'job_failed', errMsg);\n jobStore.fail(job.id, errMsg);\n console.error(chalk.red(`Job ${job.id} failed: ${errMsg}`));\n }\n\n if (options.once) break;\n }\n\n db.close();\n console.error(chalk.dim('Worker stopped.'));\n}\n"],"mappings":"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","names":["VERSION","openDatabase","chalk","join","chalk","openDatabase","chalk","session","join","ModelRegistry","DebateStore","SessionManager","generateId","loadConfig","openDatabase","chalk","generateId","openDatabase","DebateStore","chalk","loadConfig","SessionManager","BuildStore","ModelRegistry","SessionManager","buildHandoffEnvelope","generateId","loadConfig","openDatabase","chalk","resolve","openDatabase","BuildStore","generateId","chalk","loadConfig","ModelRegistry","SessionManager","session","writeFileSync","buildHandoffEnvelope","openDatabase","SessionManager","chalk","openDatabase","SessionManager","session","chalk","execSync","join","chalk","openDatabase","openDatabase","chalk","openDatabase","chalk","execFileSync","execSync","readFileSync","ModelRegistry","SessionManager","buildHandoffEnvelope","loadConfig","openDatabase","REVIEW_DIFF_MAX_CHARS","chalk","readFileSync","openDatabase","loadConfig","ModelRegistry","execSync","chalk","SessionManager","session","execFileSync","buildHandoffEnvelope","REVIEW_DIFF_MAX_CHARS","exitReason","existsSync","join","loadConfig","chalk","existsSync","mkdirSync","readFileSync","writeFileSync","join","chalk","SessionManager","chalk","SessionManager","session","chalk","JobStore","openDatabase","chalk","openDatabase","JobStore","jobs","chalk","readFileSync","writeFileSync","ModelRegistry","SessionManager","buildHandoffEnvelope","loadConfig","openDatabase","chalk","chalk","chalk","loadConfig","ModelRegistry","openDatabase","writeFileSync","chalk","readFileSync","SessionManager","session","buildHandoffEnvelope","loadConfig","ModelRegistry","REVIEW_DIFF_MAX_CHARS","SessionManager","JobStore","openDatabase","buildHandoffEnvelope","chalk","execFileSync","execSync","readFileSync","existsSync","resolve","chalk","loadConfig","ModelRegistry","execSync","db","openDatabase","JobStore","SessionManager","session","buildHandoffEnvelope","execFileSync","REVIEW_DIFF_MAX_CHARS","resolve","existsSync","readFileSync","ModelRegistry","Orchestrator","loadConfig","openDatabase","chalk","loadConfig","ModelRegistry","chalk","openDatabase","Orchestrator","execSync","DEFAULT_RULES","evaluatePolicy","chalk","existsSync","execFileSync","execSync","join","basename","chalk","loadConfig","writeConfig","JobStore","openDatabase","chalk","openDatabase","JobStore","chalk","JobStore","ModelRegistry","REVIEW_DIFF_MAX_CHARS","buildHandoffEnvelope","loadConfig","openDatabase","chalk","execSync","openDatabase","JobStore","loadConfig","ModelRegistry","execSync","chalk","resolve","buildHandoffEnvelope","execFileSync","REVIEW_DIFF_MAX_CHARS","VERSION"]}
|