agent-gauntlet 0.13.1 → 0.14.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -201
- package/README.md +1 -1
- package/dist/index.js +610 -293
- package/dist/index.js.map +22 -19
- package/dist/skill-templates/help-ref-stop-hook-troubleshooting.md +1 -1
- package/dist/skill-templates/status.md +1 -1
- package/package.json +3 -2
package/dist/index.js.map
CHANGED
|
@@ -1,37 +1,37 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../src/index.ts", "../src/commands/check.ts", "../src/config/global.ts", "../src/config/loader.ts", "../src/built-in-reviews/index.ts", "../src/config/schema.ts", "../src/core/change-detector.ts", "../src/core/entry-point.ts", "../src/core/job.ts", "../src/gates/check.ts", "../src/gates/resolve-check-command.ts", "../src/gates/review.ts", "../src/cli-adapters/index.ts", "../src/cli-adapters/claude.ts", "../src/commands/stop-hook.ts", "../src/hooks/adapters/claude-stop-hook.ts", "../src/hooks/adapters/cursor-stop-hook.ts", "../src/hooks/stop-hook-handler.ts", "../src/config/stop-hook-config.ts", "../src/output/app-logger.ts", "../src/output/sinks/console-sink.ts", "../src/hooks/stop-hook-state.ts", "../src/utils/execution-state.ts", "../src/utils/debug-log.ts", "../src/types/gauntlet-status.ts", "../src/cli-adapters/thinking-budget.ts", "../src/cli-adapters/codex.ts", "../src/cli-adapters/cursor.ts", "../src/cli-adapters/gemini.ts", "../src/cli-adapters/github-copilot.ts", "../src/utils/diff-parser.ts", "../src/utils/sanitizer.ts", "../src/core/runner.ts", "../src/output/console.ts", "../src/utils/log-parser.ts", "../src/output/console-log.ts", "../src/output/logger.ts", "../src/commands/shared.ts", "../src/commands/ci/init.ts", "../src/config/ci-loader.ts", "../src/config/ci-schema.ts", "../src/commands/ci/list-jobs.ts", "../src/commands/ci/index.ts", "../src/commands/clean.ts", "../src/commands/detect.ts", "../src/commands/health.ts", "../src/config/validator.ts", "../src/commands/help.ts", "../src/commands/init.ts", "../src/commands/list.ts", "../src/commands/review.ts", "../src/core/run-executor.ts", "../src/core/diff-stats.ts", "../src/commands/run.ts", "../src/commands/validate.ts", "../src/commands/wait-ci.ts"],
|
|
3
|
+
"sources": ["../src/index.ts", "../src/commands/check.ts", "../src/config/global.ts", "../src/config/loader.ts", "../src/built-in-reviews/index.ts", "../src/config/schema.ts", "../src/core/change-detector.ts", "../src/core/entry-point.ts", "../src/core/job.ts", "../src/gates/check.ts", "../src/gates/resolve-check-command.ts", "../src/gates/review.ts", "../src/cli-adapters/index.ts", "../src/cli-adapters/claude.ts", "../src/commands/stop-hook.ts", "../src/hooks/adapters/claude-stop-hook.ts", "../src/hooks/adapters/cursor-stop-hook.ts", "../src/hooks/stop-hook-handler.ts", "../src/config/stop-hook-config.ts", "../src/output/app-logger.ts", "../src/output/sinks/console-sink.ts", "../src/hooks/stop-hook-state.ts", "../src/utils/execution-state.ts", "../src/utils/debug-log.ts", "../src/types/gauntlet-status.ts", "../src/cli-adapters/thinking-budget.ts", "../src/cli-adapters/codex.ts", "../src/cli-adapters/cursor.ts", "../src/cli-adapters/gemini.ts", "../src/cli-adapters/github-copilot.ts", "../src/utils/diff-parser.ts", "../src/utils/sanitizer.ts", "../src/core/runner.ts", "../src/output/console.ts", "../src/utils/log-parser.ts", "../src/output/console-log.ts", "../src/output/logger.ts", "../src/commands/shared.ts", "../src/commands/ci/init.ts", "../src/config/ci-loader.ts", "../src/config/ci-schema.ts", "../src/commands/ci/list-jobs.ts", "../src/commands/ci/index.ts", "../src/commands/clean.ts", "../src/commands/detect.ts", "../src/commands/health.ts", "../src/config/validator.ts", "../src/commands/help.ts", "../src/commands/init.ts", "../src/commands/init-checksums.ts", "../src/commands/init-prompts.ts", "../src/commands/list.ts", "../src/commands/review.ts", "../src/core/run-executor.ts", "../src/core/diff-stats.ts", "../src/commands/run.ts", "../src/commands/start-hook.ts", "../src/commands/validate.ts", "../src/commands/wait-ci.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
|
-
"#!/usr/bin/env node\nimport { Command } from \"commander\";\nimport packageJson from \"../package.json\" with { type: \"json\" };\nimport {\n\tregisterCheckCommand,\n\tregisterCICommand,\n\tregisterCleanCommand,\n\tregisterDetectCommand,\n\tregisterHealthCommand,\n\tregisterHelpCommand,\n\tregisterInitCommand,\n\tregisterListCommand,\n\tregisterReviewCommand,\n\tregisterRunCommand,\n\tregisterStopHookCommand,\n\tregisterValidateCommand,\n\tregisterWaitCICommand,\n} from \"./commands/index.js\";\n\nconst program = new Command();\n\nprogram\n\t.name(\"agent-gauntlet\")\n\t.description(\"AI-assisted quality gates\")\n\t.version(packageJson.version);\n\n// Register all commands\nregisterRunCommand(program);\nregisterCheckCommand(program);\nregisterCICommand(program);\nregisterCleanCommand(program);\nregisterReviewCommand(program);\nregisterDetectCommand(program);\nregisterListCommand(program);\nregisterHealthCommand(program);\nregisterInitCommand(program);\nregisterValidateCommand(program);\nregisterStopHookCommand(program);\nregisterWaitCICommand(program);\nregisterHelpCommand(program);\n\n// Default action: help\nif (process.argv.length < 3) {\n\tprocess.argv.push(\"help\");\n}\n\nprogram.parse(process.argv);\n",
|
|
5
|
+
"#!/usr/bin/env node\nimport { Command } from \"commander\";\nimport packageJson from \"../package.json\" with { type: \"json\" };\nimport {\n\tregisterCheckCommand,\n\tregisterCICommand,\n\tregisterCleanCommand,\n\tregisterDetectCommand,\n\tregisterHealthCommand,\n\tregisterHelpCommand,\n\tregisterInitCommand,\n\tregisterListCommand,\n\tregisterReviewCommand,\n\tregisterRunCommand,\n\tregisterStartHookCommand,\n\tregisterStopHookCommand,\n\tregisterValidateCommand,\n\tregisterWaitCICommand,\n} from \"./commands/index.js\";\n\nconst program = new Command();\n\nprogram\n\t.name(\"agent-gauntlet\")\n\t.description(\"AI-assisted quality gates\")\n\t.version(packageJson.version);\n\n// Register all commands\nregisterRunCommand(program);\nregisterCheckCommand(program);\nregisterCICommand(program);\nregisterCleanCommand(program);\nregisterReviewCommand(program);\nregisterDetectCommand(program);\nregisterListCommand(program);\nregisterHealthCommand(program);\nregisterInitCommand(program);\nregisterValidateCommand(program);\nregisterStartHookCommand(program);\nregisterStopHookCommand(program);\nregisterWaitCICommand(program);\nregisterHelpCommand(program);\n\n// Default action: help\nif (process.argv.length < 3) {\n\tprocess.argv.push(\"help\");\n}\n\nprogram.parse(process.argv);\n",
|
|
6
6
|
"import chalk from \"chalk\";\nimport type { Command } from \"commander\";\nimport { loadGlobalConfig } from \"../config/global.js\";\nimport { loadConfig } from \"../config/loader.js\";\nimport { ChangeDetector } from \"../core/change-detector.js\";\nimport { EntryPointExpander } from \"../core/entry-point.js\";\nimport { JobGenerator } from \"../core/job.js\";\nimport { Runner } from \"../core/runner.js\";\nimport { ConsoleReporter } from \"../output/console.js\";\nimport {\n\ttype ConsoleLogHandle,\n\tstartConsoleLog,\n} from \"../output/console-log.js\";\nimport { Logger } from \"../output/logger.js\";\nimport {\n\tgetDebugLogger,\n\tinitDebugLogger,\n\tmergeDebugLogConfig,\n} from \"../utils/debug-log.js\";\nimport {\n\treadExecutionState,\n\tresolveFixBase,\n\twriteExecutionState,\n} from \"../utils/execution-state.js\";\nimport {\n\tfindPreviousFailures,\n\ttype PassedSlot,\n\ttype PreviousViolation,\n} from \"../utils/log-parser.js\";\nimport {\n\tacquireLock,\n\tcleanLogs,\n\thasExistingLogs,\n\tperformAutoClean,\n\treleaseLock,\n\tshouldAutoClean,\n} from \"./shared.js\";\n\nexport function registerCheckCommand(program: Command): void {\n\tprogram\n\t\t.command(\"check\")\n\t\t.description(\"Run only applicable checks for detected changes\")\n\t\t.option(\n\t\t\t\"-b, --base-branch <branch>\",\n\t\t\t\"Override base branch for change detection\",\n\t\t)\n\t\t.option(\"-g, --gate <name>\", \"Run specific check gate only\")\n\t\t.option(\"-c, --commit <sha>\", \"Use diff for a specific commit\")\n\t\t.option(\n\t\t\t\"-u, --uncommitted\",\n\t\t\t\"Use diff for current uncommitted changes (staged and unstaged)\",\n\t\t)\n\t\t.action(async (options) => {\n\t\t\tlet config: Awaited<ReturnType<typeof loadConfig>> | undefined;\n\t\t\tlet lockAcquired = false;\n\t\t\tlet restoreConsole: ConsoleLogHandle | undefined;\n\t\t\ttry {\n\t\t\t\tconfig = await loadConfig();\n\n\t\t\t\t// Initialize debug logger\n\t\t\t\tconst globalConfig = await loadGlobalConfig();\n\t\t\t\tconst debugLogConfig = mergeDebugLogConfig(\n\t\t\t\t\tconfig.project.debug_log,\n\t\t\t\t\tglobalConfig.debug_log,\n\t\t\t\t);\n\t\t\t\tinitDebugLogger(config.project.log_dir, debugLogConfig);\n\n\t\t\t\t// Log the command invocation\n\t\t\t\tconst debugLogger = getDebugLogger();\n\t\t\t\tconst args = [\n\t\t\t\t\toptions.baseBranch ? `-b ${options.baseBranch}` : \"\",\n\t\t\t\t\toptions.gate ? `-g ${options.gate}` : \"\",\n\t\t\t\t\toptions.commit ? `-c ${options.commit}` : \"\",\n\t\t\t\t\toptions.uncommitted ? \"-u\" : \"\",\n\t\t\t\t].filter(Boolean);\n\t\t\t\tawait debugLogger?.logCommand(\"check\", args);\n\n\t\t\t\t// Determine effective base branch first (needed for auto-clean)\n\t\t\t\tconst effectiveBaseBranch =\n\t\t\t\t\toptions.baseBranch ||\n\t\t\t\t\t(process.env.GITHUB_BASE_REF &&\n\t\t\t\t\t(process.env.CI === \"true\" || process.env.GITHUB_ACTIONS === \"true\")\n\t\t\t\t\t\t? process.env.GITHUB_BASE_REF\n\t\t\t\t\t\t: null) ||\n\t\t\t\t\tconfig.project.base_branch;\n\n\t\t\t\t// Auto-clean on context change (branch changed, commit merged)\n\t\t\t\tconst autoCleanResult = await shouldAutoClean(\n\t\t\t\t\tconfig.project.log_dir,\n\t\t\t\t\teffectiveBaseBranch,\n\t\t\t\t);\n\t\t\t\tif (autoCleanResult.clean) {\n\t\t\t\t\tconsole.log(\n\t\t\t\t\t\tchalk.dim(`Auto-cleaning logs (${autoCleanResult.reason})...`),\n\t\t\t\t\t);\n\t\t\t\t\tawait debugLogger?.logClean(\n\t\t\t\t\t\t\"auto\",\n\t\t\t\t\t\tautoCleanResult.reason || \"unknown\",\n\t\t\t\t\t);\n\t\t\t\t\tawait performAutoClean(config.project.log_dir, autoCleanResult);\n\t\t\t\t}\n\n\t\t\t\t// Detect rerun mode after auto-clean (clean may have removed logs)\n\t\t\t\tconst logsExist = await hasExistingLogs(config.project.log_dir);\n\t\t\t\tconst isRerun = logsExist && !options.commit;\n\n\t\t\t\t// Acquire lock BEFORE starting console log (prevents orphaned log files)\n\t\t\t\tawait acquireLock(config.project.log_dir);\n\t\t\t\tlockAcquired = true;\n\n\t\t\t\t// Initialize Logger early to get unified run number for console log\n\t\t\t\tconst logger = new Logger(config.project.log_dir);\n\t\t\t\tawait logger.init();\n\t\t\t\tconst runNumber = logger.getRunNumber();\n\n\t\t\t\trestoreConsole = await startConsoleLog(\n\t\t\t\t\tconfig.project.log_dir,\n\t\t\t\t\trunNumber,\n\t\t\t\t);\n\n\t\t\t\tlet failuresMap:\n\t\t\t\t\t| Map<string, Map<string, PreviousViolation[]>>\n\t\t\t\t\t| undefined;\n\t\t\t\tlet changeOptions:\n\t\t\t\t\t| { commit?: string; uncommitted?: boolean; fixBase?: string }\n\t\t\t\t\t| undefined;\n\n\t\t\t\tlet passedSlotsMap: Map<string, Map<number, PassedSlot>> | undefined;\n\n\t\t\t\tif (isRerun) {\n\t\t\t\t\tconsole.log(\n\t\t\t\t\t\tchalk.dim(\n\t\t\t\t\t\t\t\"Existing logs detected — running in verification mode...\",\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t\tconst { failures: previousFailures, passedSlots } =\n\t\t\t\t\t\tawait findPreviousFailures(\n\t\t\t\t\t\t\tconfig.project.log_dir,\n\t\t\t\t\t\t\toptions.gate,\n\t\t\t\t\t\t\ttrue,\n\t\t\t\t\t\t);\n\n\t\t\t\t\tfailuresMap = new Map();\n\t\t\t\t\tfor (const gateFailure of previousFailures) {\n\t\t\t\t\t\tconst adapterMap = new Map<string, PreviousViolation[]>();\n\t\t\t\t\t\tfor (const af of gateFailure.adapterFailures) {\n\t\t\t\t\t\t\tconst key = af.reviewIndex\n\t\t\t\t\t\t\t\t? String(af.reviewIndex)\n\t\t\t\t\t\t\t\t: af.adapterName;\n\t\t\t\t\t\t\tadapterMap.set(key, af.violations);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tfailuresMap.set(gateFailure.jobId, adapterMap);\n\t\t\t\t\t}\n\n\t\t\t\t\tpassedSlotsMap = passedSlots;\n\n\t\t\t\t\tif (previousFailures.length > 0) {\n\t\t\t\t\t\tconst totalViolations = previousFailures.reduce(\n\t\t\t\t\t\t\t(sum, gf) =>\n\t\t\t\t\t\t\t\tsum +\n\t\t\t\t\t\t\t\tgf.adapterFailures.reduce(\n\t\t\t\t\t\t\t\t\t(s, af) => s + af.violations.length,\n\t\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\tchalk.yellow(\n\t\t\t\t\t\t\t\t`Found ${previousFailures.length} gate(s) with ${totalViolations} previous violation(s)`,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\tchangeOptions = { uncommitted: true };\n\t\t\t\t\t// Use working_tree_ref from execution state for rerun diff scoping\n\t\t\t\t\tconst executionState = await readExecutionState(\n\t\t\t\t\t\tconfig.project.log_dir,\n\t\t\t\t\t);\n\t\t\t\t\tif (executionState?.working_tree_ref) {\n\t\t\t\t\t\tchangeOptions.fixBase = executionState.working_tree_ref;\n\t\t\t\t\t}\n\t\t\t\t} else if (!logsExist) {\n\t\t\t\t\t// Post-clean run: check if execution state has a working_tree_ref to use as fixBase\n\t\t\t\t\tconst executionState = await readExecutionState(\n\t\t\t\t\t\tconfig.project.log_dir,\n\t\t\t\t\t);\n\t\t\t\t\tif (executionState) {\n\t\t\t\t\t\tconst resolved = await resolveFixBase(\n\t\t\t\t\t\t\texecutionState,\n\t\t\t\t\t\t\teffectiveBaseBranch,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (resolved.warning) {\n\t\t\t\t\t\t\tconsole.log(chalk.yellow(`Warning: ${resolved.warning}`));\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (resolved.fixBase) {\n\t\t\t\t\t\t\tchangeOptions = { fixBase: resolved.fixBase };\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Allow explicit commit or uncommitted options to override fixBase\n\t\t\t\tif (options.commit || options.uncommitted) {\n\t\t\t\t\tchangeOptions = {\n\t\t\t\t\t\tcommit: options.commit,\n\t\t\t\t\t\tuncommitted: options.uncommitted,\n\t\t\t\t\t\tfixBase: changeOptions?.fixBase,\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tconst changeDetector = new ChangeDetector(\n\t\t\t\t\teffectiveBaseBranch,\n\t\t\t\t\tchangeOptions || {\n\t\t\t\t\t\tcommit: options.commit,\n\t\t\t\t\t\tuncommitted: options.uncommitted,\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t\tconst expander = new EntryPointExpander();\n\t\t\t\tconst jobGen = new JobGenerator(config);\n\n\t\t\t\tconsole.log(chalk.dim(\"Detecting changes...\"));\n\t\t\t\tconst changes = await changeDetector.getChangedFiles();\n\n\t\t\t\tif (changes.length === 0) {\n\t\t\t\t\tconsole.log(chalk.green(\"No changes detected.\"));\n\t\t\t\t\tawait writeExecutionState(config.project.log_dir);\n\t\t\t\t\tawait releaseLock(config.project.log_dir);\n\t\t\t\t\trestoreConsole?.restore();\n\t\t\t\t\tprocess.exit(0);\n\t\t\t\t}\n\n\t\t\t\tconsole.log(chalk.dim(`Found ${changes.length} changed files.`));\n\n\t\t\t\tconst entryPoints = await expander.expand(\n\t\t\t\t\tconfig.project.entry_points,\n\t\t\t\t\tchanges,\n\t\t\t\t);\n\t\t\t\tlet jobs = jobGen.generateJobs(entryPoints);\n\n\t\t\t\t// Filter to only checks\n\t\t\t\tjobs = jobs.filter((j) => j.type === \"check\");\n\n\t\t\t\tif (options.gate) {\n\t\t\t\t\tjobs = jobs.filter((j) => j.name === options.gate);\n\t\t\t\t}\n\n\t\t\t\tif (jobs.length === 0) {\n\t\t\t\t\tconsole.log(chalk.yellow(\"No applicable checks for these changes.\"));\n\t\t\t\t\tawait writeExecutionState(config.project.log_dir);\n\t\t\t\t\tawait releaseLock(config.project.log_dir);\n\t\t\t\t\trestoreConsole?.restore();\n\t\t\t\t\tprocess.exit(0);\n\t\t\t\t}\n\n\t\t\t\tconsole.log(chalk.dim(`Running ${jobs.length} check(s)...`));\n\n\t\t\t\t// Log run start\n\t\t\t\tconst runMode = isRerun ? \"verification\" : \"full\";\n\t\t\t\tawait debugLogger?.logRunStart(runMode, changes.length, jobs.length);\n\n\t\t\t\tconst reporter = new ConsoleReporter();\n\t\t\t\tconst runner = new Runner(\n\t\t\t\t\tconfig,\n\t\t\t\t\tlogger,\n\t\t\t\t\treporter,\n\t\t\t\t\tfailuresMap,\n\t\t\t\t\tchangeOptions,\n\t\t\t\t\teffectiveBaseBranch,\n\t\t\t\t\tpassedSlotsMap,\n\t\t\t\t\tdebugLogger ?? undefined,\n\t\t\t\t\tisRerun,\n\t\t\t\t);\n\n\t\t\t\tconst outcome = await runner.run(jobs);\n\n\t\t\t\t// Log run end with actual statistics from runner\n\t\t\t\tawait debugLogger?.logRunEnd(\n\t\t\t\t\toutcome.allPassed ? \"pass\" : \"fail\",\n\t\t\t\t\toutcome.stats.fixed,\n\t\t\t\t\toutcome.stats.skipped,\n\t\t\t\t\toutcome.stats.failed,\n\t\t\t\t\tlogger.getRunNumber(),\n\t\t\t\t);\n\n\t\t\t\t// Write execution state before releasing lock (for interval checks)\n\t\t\t\t// This now captures working_tree_ref which is used for rerun diff scoping\n\t\t\t\tawait writeExecutionState(config.project.log_dir);\n\n\t\t\t\tif (outcome.allPassed) {\n\t\t\t\t\tawait debugLogger?.logClean(\"auto\", \"all_passed\");\n\t\t\t\t\tawait cleanLogs(config.project.log_dir);\n\t\t\t\t}\n\t\t\t\tawait releaseLock(config.project.log_dir);\n\t\t\t\trestoreConsole?.restore();\n\t\t\t\tprocess.exit(outcome.allPassed ? 0 : 1);\n\t\t\t} catch (error: unknown) {\n\t\t\t\t// Write execution state even on error (if lock was acquired)\n\t\t\t\tif (config && lockAcquired) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait writeExecutionState(config.project.log_dir);\n\t\t\t\t\t} catch {\n\t\t\t\t\t\t// Ignore errors writing state during error handling\n\t\t\t\t\t}\n\t\t\t\t\tawait releaseLock(config.project.log_dir);\n\t\t\t\t}\n\t\t\t\tconst err = error as { message?: string };\n\t\t\t\tconsole.error(chalk.red(\"Error:\"), err.message);\n\t\t\t\trestoreConsole?.restore();\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\t\t});\n}\n",
|
|
7
7
|
"import fs from \"node:fs/promises\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport YAML from \"yaml\";\nimport { z } from \"zod\";\n\nconst GLOBAL_CONFIG_PATH = path.join(\n\tos.homedir(),\n\t\".config\",\n\t\"agent-gauntlet\",\n\t\"config.yml\",\n);\n\nexport const debugLogConfigSchema = z.object({\n\tenabled: z.boolean().default(false),\n\tmax_size_mb: z.number().default(10),\n});\n\nexport type DebugLogConfig = z.infer<typeof debugLogConfigSchema>;\n\nconst globalConfigSchema = z.object({\n\tstop_hook: z\n\t\t.object({\n\t\t\tenabled: z.boolean().default(false),\n\t\t\trun_interval_minutes: z.number().default(5),\n\t\t\tauto_push_pr: z.boolean().default(false),\n\t\t\tauto_fix_pr: z.boolean().default(false),\n\t\t})\n\t\t.default({\n\t\t\tenabled: false,\n\t\t\trun_interval_minutes: 5,\n\t\t\tauto_push_pr: false,\n\t\t\tauto_fix_pr: false,\n\t\t}),\n\tdebug_log: debugLogConfigSchema.default({ enabled: false, max_size_mb: 10 }),\n});\n\nexport type GlobalConfig = z.infer<typeof globalConfigSchema>;\n\nexport const DEFAULT_GLOBAL_CONFIG: GlobalConfig = {\n\tstop_hook: {\n\t\tenabled: false,\n\t\trun_interval_minutes: 5,\n\t\tauto_push_pr: false,\n\t\tauto_fix_pr: false,\n\t},\n\tdebug_log: {\n\t\tenabled: false,\n\t\tmax_size_mb: 10,\n\t},\n};\n\n/**\n * Load the global agent-gauntlet configuration.\n * Returns default values if the file doesn't exist or is invalid.\n */\nexport async function loadGlobalConfig(): Promise<GlobalConfig> {\n\ttry {\n\t\tconst content = await fs.readFile(GLOBAL_CONFIG_PATH, \"utf-8\");\n\t\tconst raw = YAML.parse(content);\n\t\treturn globalConfigSchema.parse(raw);\n\t} catch (error) {\n\t\t// Check if file doesn't exist (expected case)\n\t\tif (\n\t\t\ttypeof error === \"object\" &&\n\t\t\terror !== null &&\n\t\t\t\"code\" in error &&\n\t\t\t(error as { code: string }).code === \"ENOENT\"\n\t\t) {\n\t\t\treturn DEFAULT_GLOBAL_CONFIG;\n\t\t}\n\n\t\t// File exists but is invalid - log warning and use defaults\n\t\tconsole.error(\n\t\t\t`[gauntlet] Warning: Failed to parse global config at ${GLOBAL_CONFIG_PATH}, using defaults`,\n\t\t);\n\t\treturn DEFAULT_GLOBAL_CONFIG;\n\t}\n}\n\n/**\n * Get the path to the global config file.\n * Useful for debugging or documentation.\n */\nexport function getGlobalConfigPath(): string {\n\treturn GLOBAL_CONFIG_PATH;\n}\n",
|
|
8
8
|
"import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport matter from \"gray-matter\";\nimport YAML from \"yaml\";\nimport {\n\tisBuiltInReview,\n\tloadBuiltInReview,\n} from \"../built-in-reviews/index.js\";\nimport {\n\tcheckGateSchema,\n\tgauntletConfigSchema,\n\treviewPromptFrontmatterSchema,\n\treviewYamlSchema,\n} from \"./schema.js\";\nimport type {\n\tCheckGateConfig,\n\tLoadedCheckGateConfig,\n\tLoadedConfig,\n\tLoadedReviewGateConfig,\n} from \"./types.js\";\n\nconst GAUNTLET_DIR = \".gauntlet\";\nconst CONFIG_FILE = \"config.yml\";\nconst CHECKS_DIR = \"checks\";\nconst REVIEWS_DIR = \"reviews\";\n\nexport async function loadConfig(\n\trootDir: string = process.cwd(),\n): Promise<LoadedConfig> {\n\tconst gauntletPath = path.join(rootDir, GAUNTLET_DIR);\n\tconst configPath = path.join(gauntletPath, CONFIG_FILE);\n\n\t// 1. Load project config\n\tif (!(await fileExists(configPath))) {\n\t\tthrow new Error(`Configuration file not found at ${configPath}`);\n\t}\n\n\tconst configContent = await fs.readFile(configPath, \"utf-8\");\n\tconst projectConfigRaw = YAML.parse(configContent);\n\tconst projectConfig = gauntletConfigSchema.parse(projectConfigRaw);\n\n\t// 2. Load checks\n\tconst checksPath = path.join(gauntletPath, CHECKS_DIR);\n\tconst checks: Record<string, LoadedCheckGateConfig> = {};\n\n\tif (await dirExists(checksPath)) {\n\t\tconst checkFiles = await fs.readdir(checksPath);\n\t\tfor (const file of checkFiles) {\n\t\t\tif (file.endsWith(\".yml\") || file.endsWith(\".yaml\")) {\n\t\t\t\tconst filePath = path.join(checksPath, file);\n\t\t\t\tconst content = await fs.readFile(filePath, \"utf-8\");\n\t\t\t\tconst raw = YAML.parse(content);\n\t\t\t\tconst name = path.basename(file, path.extname(file));\n\t\t\t\tconst parsed: CheckGateConfig = checkGateSchema.parse(raw);\n\n\t\t\t\t// Normalize deprecated alias in loader (not schema) for reliability\n\t\t\t\tconst fixFile = parsed.fix_instructions_file || parsed.fix_instructions;\n\n\t\t\t\tconst loadedCheck: LoadedCheckGateConfig = {\n\t\t\t\t\t...parsed,\n\t\t\t\t\tname,\n\t\t\t\t};\n\n\t\t\t\t// Load fix instructions file if specified\n\t\t\t\tif (fixFile) {\n\t\t\t\t\tloadedCheck.fixInstructionsContent = await loadPromptFile(\n\t\t\t\t\t\tfixFile,\n\t\t\t\t\t\tgauntletPath,\n\t\t\t\t\t\t`check \"${name}\"`,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\t// Store fix_with_skill if specified\n\t\t\t\tif (parsed.fix_with_skill) {\n\t\t\t\t\tloadedCheck.fixWithSkill = parsed.fix_with_skill;\n\t\t\t\t}\n\n\t\t\t\tchecks[name] = loadedCheck;\n\t\t\t}\n\t\t}\n\t}\n\n\t// 3. Load reviews (prompts + frontmatter from .md, or .yml/.yaml configs)\n\tconst reviewsPath = path.join(gauntletPath, REVIEWS_DIR);\n\tconst reviews: LoadedConfig[\"reviews\"] = {};\n\n\tif (await dirExists(reviewsPath)) {\n\t\tconst reviewFiles = await fs.readdir(reviewsPath);\n\n\t\t// Detect duplicate names across formats\n\t\tconst reviewNameSources = new Map<string, string[]>();\n\t\tfor (const file of reviewFiles) {\n\t\t\tif (\n\t\t\t\tfile.endsWith(\".md\") ||\n\t\t\t\tfile.endsWith(\".yml\") ||\n\t\t\t\tfile.endsWith(\".yaml\")\n\t\t\t) {\n\t\t\t\tconst name = path.basename(file, path.extname(file));\n\n\t\t\t\t// Reject user-defined review files with the reserved built-in: prefix\n\t\t\t\tif (isBuiltInReview(name)) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`Review file \"${file}\" uses the reserved \"built-in:\" prefix. Rename the file to avoid conflicts with built-in reviews.`,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tconst sources = reviewNameSources.get(name) || [];\n\t\t\t\tsources.push(file);\n\t\t\t\treviewNameSources.set(name, sources);\n\t\t\t}\n\t\t}\n\t\tfor (const [name, sources] of reviewNameSources) {\n\t\t\tif (sources.length > 1) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Duplicate review name \"${name}\" found across files: ${sources.join(\", \")}. Each review name must be unique.`,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tfor (const file of reviewFiles) {\n\t\t\tif (file.endsWith(\".md\")) {\n\t\t\t\t// Markdown review file\n\t\t\t\tconst filePath = path.join(reviewsPath, file);\n\t\t\t\tconst content = await fs.readFile(filePath, \"utf-8\");\n\t\t\t\tconst { data: frontmatter, content: promptBody } = matter(content);\n\n\t\t\t\tconst parsedFrontmatter =\n\t\t\t\t\treviewPromptFrontmatterSchema.parse(frontmatter);\n\t\t\t\tconst name = path.basename(file, \".md\");\n\n\t\t\t\tconst review: LoadedReviewGateConfig = {\n\t\t\t\t\tname,\n\t\t\t\t\tprompt: file,\n\t\t\t\t\tpromptContent: promptBody,\n\t\t\t\t\tmodel: parsedFrontmatter.model,\n\t\t\t\t\tcli_preference: parsedFrontmatter.cli_preference,\n\t\t\t\t\tnum_reviews: parsedFrontmatter.num_reviews,\n\t\t\t\t\tparallel: parsedFrontmatter.parallel,\n\t\t\t\t\trun_in_ci: parsedFrontmatter.run_in_ci,\n\t\t\t\t\trun_locally: parsedFrontmatter.run_locally,\n\t\t\t\t\ttimeout: parsedFrontmatter.timeout,\n\t\t\t\t};\n\n\t\t\t\t// If prompt_file is specified, override the markdown body\n\t\t\t\tif (parsedFrontmatter.prompt_file) {\n\t\t\t\t\treview.promptContent = await loadPromptFile(\n\t\t\t\t\t\tparsedFrontmatter.prompt_file,\n\t\t\t\t\t\tgauntletPath,\n\t\t\t\t\t\t`review \"${name}\"`,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\t// If skill_name is specified, ignore body and set skillName\n\t\t\t\tif (parsedFrontmatter.skill_name) {\n\t\t\t\t\treview.promptContent = undefined;\n\t\t\t\t\treview.skillName = parsedFrontmatter.skill_name;\n\t\t\t\t}\n\n\t\t\t\treviews[name] = review;\n\t\t\t} else if (file.endsWith(\".yml\") || file.endsWith(\".yaml\")) {\n\t\t\t\t// YAML review file\n\t\t\t\tconst filePath = path.join(reviewsPath, file);\n\t\t\t\tconst content = await fs.readFile(filePath, \"utf-8\");\n\t\t\t\tconst raw = YAML.parse(content);\n\t\t\t\tconst parsed = reviewYamlSchema.parse(raw);\n\t\t\t\tconst name = path.basename(file, path.extname(file));\n\n\t\t\t\tconst review: LoadedReviewGateConfig = {\n\t\t\t\t\tname,\n\t\t\t\t\tprompt: file,\n\t\t\t\t\tmodel: parsed.model,\n\t\t\t\t\tcli_preference: parsed.cli_preference,\n\t\t\t\t\tnum_reviews: parsed.num_reviews,\n\t\t\t\t\tparallel: parsed.parallel,\n\t\t\t\t\trun_in_ci: parsed.run_in_ci,\n\t\t\t\t\trun_locally: parsed.run_locally,\n\t\t\t\t\ttimeout: parsed.timeout,\n\t\t\t\t};\n\n\t\t\t\tif (parsed.prompt_file) {\n\t\t\t\t\treview.promptContent = await loadPromptFile(\n\t\t\t\t\t\tparsed.prompt_file,\n\t\t\t\t\t\tgauntletPath,\n\t\t\t\t\t\t`review \"${name}\"`,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tif (parsed.skill_name) {\n\t\t\t\t\treview.skillName = parsed.skill_name;\n\t\t\t\t}\n\n\t\t\t\tif (parsed.builtin) {\n\t\t\t\t\treview.promptContent = loadBuiltInReview(parsed.builtin);\n\t\t\t\t}\n\n\t\t\t\treviews[name] = review;\n\t\t\t}\n\t\t}\n\t}\n\n\t// 3b. Merge default CLI preference if not specified (applies to all reviews)\n\tfor (const [name, review] of Object.entries(reviews)) {\n\t\tif (!review.cli_preference) {\n\t\t\treview.cli_preference = projectConfig.cli.default_preference;\n\t\t} else {\n\t\t\tconst allowedTools = new Set(projectConfig.cli.default_preference);\n\t\t\tfor (const tool of review.cli_preference) {\n\t\t\t\tif (!allowedTools.has(tool)) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`Review \"${name}\" uses CLI tool \"${tool}\" which is not in the project-level allowed list (cli.default_preference).`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// 4. Validate entry point references\n\tconst checkNames = new Set(Object.keys(checks));\n\tconst reviewNames = new Set(Object.keys(reviews));\n\n\tfor (const entryPoint of projectConfig.entry_points) {\n\t\tif (entryPoint.checks) {\n\t\t\tfor (const checkName of entryPoint.checks) {\n\t\t\t\tif (!checkNames.has(checkName)) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`Entry point \"${entryPoint.path}\" references non-existent check gate: \"${checkName}\"`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (entryPoint.reviews) {\n\t\t\tfor (const reviewName of entryPoint.reviews) {\n\t\t\t\tif (!reviewNames.has(reviewName)) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`Entry point \"${entryPoint.path}\" references non-existent review gate: \"${reviewName}\"`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn {\n\t\tproject: projectConfig,\n\t\tchecks,\n\t\treviews,\n\t};\n}\n\nasync function loadPromptFile(\n\tfilePath: string,\n\tgauntletPath: string,\n\tsource: string,\n): Promise<string> {\n\tlet resolvedPath: string;\n\tif (path.isAbsolute(filePath)) {\n\t\tconsole.warn(\n\t\t\t`Warning: ${source} uses absolute path \"${filePath}\". Prefer relative paths for portability.`,\n\t\t);\n\t\tresolvedPath = filePath;\n\t} else {\n\t\tresolvedPath = path.resolve(gauntletPath, filePath);\n\t}\n\t// Warn if resolved path escapes the .gauntlet/ directory (including via relative traversal)\n\tconst normalizedGauntletPath = path.resolve(gauntletPath);\n\tconst relativeToDotGauntlet = path.relative(\n\t\tnormalizedGauntletPath,\n\t\tresolvedPath,\n\t);\n\tif (\n\t\trelativeToDotGauntlet.startsWith(\"..\") ||\n\t\tpath.isAbsolute(relativeToDotGauntlet)\n\t) {\n\t\tconsole.warn(\n\t\t\t`Warning: ${source} references file outside .gauntlet/ directory: \"${filePath}\" (resolves to ${resolvedPath}). Review .gauntlet/ config changes carefully in PRs.`,\n\t\t);\n\t}\n\tif (!(await fileExists(resolvedPath))) {\n\t\tthrow new Error(\n\t\t\t`File not found: ${resolvedPath} (referenced by ${source})`,\n\t\t);\n\t}\n\treturn fs.readFile(resolvedPath, \"utf-8\");\n}\n\nasync function fileExists(path: string): Promise<boolean> {\n\ttry {\n\t\tconst stat = await fs.stat(path);\n\t\treturn stat.isFile();\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nasync function dirExists(path: string): Promise<boolean> {\n\ttry {\n\t\tconst stat = await fs.stat(path);\n\t\treturn stat.isDirectory();\n\t} catch {\n\t\treturn false;\n\t}\n}\n",
|
|
9
9
|
"// @ts-expect-error Bun text import\nimport codeQualityContent from \"./code-quality.md\" with { type: \"text\" };\n\nconst BUILT_IN_PREFIX = \"built-in:\";\n\nconst builtInSources: Record<string, string> = {\n\t\"code-quality\": codeQualityContent,\n};\n\n/**\n * Check if a review name uses the built-in prefix.\n */\nexport function isBuiltInReview(name: string): boolean {\n\treturn name.startsWith(BUILT_IN_PREFIX);\n}\n\n/**\n * Load a built-in review prompt by name. Returns the raw markdown content.\n */\nexport function loadBuiltInReview(name: string): string {\n\tconst source = builtInSources[name];\n\n\tif (!source) {\n\t\tthrow new Error(`Unknown built-in review: \"${name}\"`);\n\t}\n\n\treturn source;\n}\n",
|
|
10
10
|
"import { z } from \"zod\";\n\nexport const adapterConfigSchema = z.object({\n\tallow_tool_use: z.boolean().default(true),\n\tthinking_budget: z.enum([\"off\", \"low\", \"medium\", \"high\"]).optional(),\n});\n\nexport const cliConfigSchema = z.object({\n\tdefault_preference: z.array(z.string().min(1)).min(1),\n\tadapters: z.record(z.string(), adapterConfigSchema).optional(),\n});\n\nexport const checkGateSchema = z\n\t.object({\n\t\tcommand: z.string().min(1),\n\t\trerun_command: z.string().min(1).optional(),\n\t\tworking_directory: z.string().optional(),\n\t\tparallel: z.boolean().default(false),\n\t\trun_in_ci: z.boolean().default(true),\n\t\trun_locally: z.boolean().default(true),\n\t\ttimeout: z.number().optional(),\n\t\tfail_fast: z.boolean().optional(),\n\t\tfix_instructions: z.string().optional(), // Deprecated alias for fix_instructions_file\n\t\tfix_instructions_file: z.string().optional(),\n\t\tfix_with_skill: z.string().optional(),\n\t})\n\t.superRefine((data, ctx) => {\n\t\t// fail_fast can only be used when parallel is false\n\t\tif (data.fail_fast === true && data.parallel === true) {\n\t\t\tctx.addIssue({\n\t\t\t\tcode: z.ZodIssueCode.custom,\n\t\t\t\tmessage: \"fail_fast can only be used when parallel is false\",\n\t\t\t});\n\t\t}\n\t\t// Cannot specify both deprecated fix_instructions and fix_instructions_file\n\t\tif (data.fix_instructions && data.fix_instructions_file) {\n\t\t\tctx.addIssue({\n\t\t\t\tcode: z.ZodIssueCode.custom,\n\t\t\t\tmessage:\n\t\t\t\t\t\"Cannot specify both 'fix_instructions' (deprecated) and 'fix_instructions_file'. Use only 'fix_instructions_file'.\",\n\t\t\t});\n\t\t}\n\t\t// fix_instructions_file (or its deprecated alias) and fix_with_skill are mutually exclusive\n\t\tconst effectiveFixFile =\n\t\t\tdata.fix_instructions_file || data.fix_instructions;\n\t\tif (effectiveFixFile && data.fix_with_skill) {\n\t\t\tctx.addIssue({\n\t\t\t\tcode: z.ZodIssueCode.custom,\n\t\t\t\tmessage:\n\t\t\t\t\t\"'fix_instructions_file' and 'fix_with_skill' are mutually exclusive. Specify only one.\",\n\t\t\t});\n\t\t}\n\t});\n\nexport const reviewGateSchema = z.object({\n\tname: z.string().min(1),\n\tprompt: z.string().min(1), // Path relative to .gauntlet/reviews/\n\tcli_preference: z.array(z.string().min(1)).optional(),\n\tnum_reviews: z.number().default(1),\n\tparallel: z.boolean().default(true),\n\trun_in_ci: z.boolean().default(true),\n\trun_locally: z.boolean().default(true),\n\ttimeout: z.number().optional(),\n});\n\nexport const reviewPromptFrontmatterSchema = z\n\t.object({\n\t\tmodel: z.string().optional(),\n\t\tcli_preference: z.array(z.string().min(1)).optional(),\n\t\tnum_reviews: z.number().default(1),\n\t\tparallel: z.boolean().default(true),\n\t\trun_in_ci: z.boolean().default(true),\n\t\trun_locally: z.boolean().default(true),\n\t\ttimeout: z.number().optional(),\n\t\tprompt_file: z.string().optional(),\n\t\tskill_name: z.string().optional(),\n\t})\n\t.refine((data) => !(data.prompt_file && data.skill_name), {\n\t\tmessage:\n\t\t\t\"'prompt_file' and 'skill_name' are mutually exclusive. Specify only one.\",\n\t});\n\nexport const reviewYamlSchema = z\n\t.object({\n\t\tmodel: z.string().optional(),\n\t\tcli_preference: z.array(z.string().min(1)).optional(),\n\t\tnum_reviews: z.number().default(1),\n\t\tparallel: z.boolean().default(true),\n\t\trun_in_ci: z.boolean().default(true),\n\t\trun_locally: z.boolean().default(true),\n\t\ttimeout: z.number().optional(),\n\t\tprompt_file: z.string().optional(),\n\t\tskill_name: z.string().optional(),\n\t\tbuiltin: z.string().optional(),\n\t})\n\t.superRefine((data, ctx) => {\n\t\tconst sources = [data.prompt_file, data.skill_name, data.builtin].filter(\n\t\t\tBoolean,\n\t\t);\n\t\tif (sources.length > 1) {\n\t\t\tctx.addIssue({\n\t\t\t\tcode: z.ZodIssueCode.custom,\n\t\t\t\tmessage:\n\t\t\t\t\t\"'prompt_file', 'skill_name', and 'builtin' are mutually exclusive. Specify only one.\",\n\t\t\t});\n\t\t}\n\t\tif (sources.length === 0) {\n\t\t\tctx.addIssue({\n\t\t\t\tcode: z.ZodIssueCode.custom,\n\t\t\t\tmessage:\n\t\t\t\t\t\"YAML review files must specify exactly one of 'prompt_file', 'skill_name', or 'builtin'.\",\n\t\t\t});\n\t\t}\n\t});\n\nexport const entryPointSchema = z.object({\n\tpath: z.string().min(1),\n\texclude: z.array(z.string().min(1)).optional(),\n\tchecks: z.array(z.string().min(1)).optional(),\n\treviews: z.array(z.string().min(1)).optional(),\n});\n\nexport const debugLogConfigSchema = z.object({\n\tenabled: z.boolean().default(false),\n\tmax_size_mb: z.number().default(10),\n});\n\nexport const loggingConsoleConfigSchema = z.object({\n\tenabled: z.boolean().default(true),\n\tformat: z.enum([\"pretty\", \"json\"]).default(\"pretty\"),\n});\n\nexport const loggingFileConfigSchema = z.object({\n\tenabled: z.boolean().default(true),\n\tformat: z.enum([\"text\", \"json\"]).default(\"text\"),\n});\n\nexport const loggingConfigSchema = z.object({\n\tlevel: z.enum([\"debug\", \"info\", \"warning\", \"error\"]).default(\"debug\"),\n\tconsole: loggingConsoleConfigSchema.optional(),\n\tfile: loggingFileConfigSchema.optional(),\n});\n\nexport const stopHookConfigSchema = z.object({\n\tenabled: z.boolean().optional(),\n\trun_interval_minutes: z.number().int().min(0).optional(),\n\tauto_push_pr: z.boolean().optional(),\n\tauto_fix_pr: z.boolean().optional(),\n});\n\nexport const gauntletConfigSchema = z.object({\n\tbase_branch: z.string().min(1).default(\"origin/main\"),\n\tlog_dir: z.string().min(1).default(\"gauntlet_logs\"),\n\tallow_parallel: z.boolean().default(true),\n\tmax_retries: z.number().default(3),\n\tmax_previous_logs: z.number().int().min(0).default(3),\n\trerun_new_issue_threshold: z\n\t\t.enum([\"critical\", \"high\", \"medium\", \"low\"])\n\t\t.default(\"medium\"),\n\tcli: cliConfigSchema,\n\tentry_points: z.array(entryPointSchema).min(1),\n\tdebug_log: debugLogConfigSchema.optional(),\n\tlogging: loggingConfigSchema.optional(),\n\tstop_hook: stopHookConfigSchema.optional(),\n});\n",
|
|
11
11
|
"import { exec } from \"node:child_process\";\nimport { promisify } from \"node:util\";\n\nconst execAsync = promisify(exec);\n\n/** Validate that a string is a safe git ref (hex SHA or branch-like name). */\nfunction isValidGitRef(ref: string): boolean {\n\treturn /^[a-zA-Z0-9._\\-/]+$/.test(ref);\n}\n\nexport interface ChangeDetectorOptions {\n\tcommit?: string; // If provided, get diff for this commit vs its parent\n\tuncommitted?: boolean; // If true, only get uncommitted changes (staged + unstaged)\n\tfixBase?: string; // If provided, get diff from this ref to current working tree\n}\n\nexport class ChangeDetector {\n\tconstructor(\n\t\tprivate baseBranch: string = \"origin/main\",\n\t\tprivate options: ChangeDetectorOptions = {},\n\t) {}\n\n\tasync getChangedFiles(): Promise<string[]> {\n\t\t// Priority 1: If commit option is provided, use that\n\t\tif (this.options.commit) {\n\t\t\treturn this.getCommitChangedFiles(this.options.commit);\n\t\t}\n\n\t\t// Priority 2: If uncommitted option is provided, only get uncommitted changes\n\t\tif (this.options.uncommitted) {\n\t\t\treturn this.getUncommittedChangedFiles();\n\t\t}\n\n\t\t// Priority 3: If fixBase is provided, diff against it\n\t\tif (this.options.fixBase && isValidGitRef(this.options.fixBase)) {\n\t\t\treturn this.getFixBaseChangedFiles(this.options.fixBase);\n\t\t}\n\n\t\t// Priority 4: CI detection / local base branch diff\n\t\tconst isCI =\n\t\t\tprocess.env.CI === \"true\" || process.env.GITHUB_ACTIONS === \"true\";\n\n\t\tif (isCI) {\n\t\t\treturn this.getCIChangedFiles();\n\t\t} else {\n\t\t\treturn this.getLocalChangedFiles();\n\t\t}\n\t}\n\n\tprivate async getCIChangedFiles(): Promise<string[]> {\n\t\t// In GitHub Actions, GITHUB_SHA is the commit being built\n\t\t// Base branch priority is already resolved by caller\n\t\tconst baseRef = this.baseBranch;\n\t\tconst headRef = process.env.GITHUB_SHA || \"HEAD\";\n\n\t\t// We might need to fetch first in some shallow clones, but assuming strictly for now\n\t\t// git diff --name-only base...head\n\t\ttry {\n\t\t\tconst { stdout } = await execAsync(\n\t\t\t\t`git diff --name-only ${baseRef}...${headRef}`,\n\t\t\t);\n\t\t\treturn this.parseOutput(stdout);\n\t\t} catch (error) {\n\t\t\tconsole.warn(\n\t\t\t\t\"Failed to detect changes via git diff in CI, falling back to HEAD^...HEAD\",\n\t\t\t\terror,\n\t\t\t);\n\t\t\t// Fallback for push events where base ref might not be available\n\t\t\tconst { stdout } = await execAsync(\"git diff --name-only HEAD^...HEAD\");\n\t\t\treturn this.parseOutput(stdout);\n\t\t}\n\t}\n\n\t/** Collect uncommitted (staged + unstaged) and untracked file paths. */\n\tprivate async getWorkingTreeFiles(): Promise<string[]> {\n\t\tconst { stdout: staged } = await execAsync(\"git diff --name-only --cached\");\n\t\tconst { stdout: unstaged } = await execAsync(\"git diff --name-only\");\n\t\tconst { stdout: untracked } = await execAsync(\n\t\t\t\"git ls-files --others --exclude-standard\",\n\t\t);\n\t\treturn [\n\t\t\t...this.parseOutput(staged),\n\t\t\t...this.parseOutput(unstaged),\n\t\t\t...this.parseOutput(untracked),\n\t\t];\n\t}\n\n\t/** Combine committed diff (against a base ref) with working tree changes. */\n\tprivate async getDiffWithWorkingTree(baseRef: string): Promise<string[]> {\n\t\tconst { stdout: committed } = await execAsync(\n\t\t\t`git diff --name-only ${baseRef}...HEAD`,\n\t\t);\n\t\tconst files = new Set([\n\t\t\t...this.parseOutput(committed),\n\t\t\t...(await this.getWorkingTreeFiles()),\n\t\t]);\n\t\treturn Array.from(files);\n\t}\n\n\tprivate async getLocalChangedFiles(): Promise<string[]> {\n\t\treturn this.getDiffWithWorkingTree(this.baseBranch);\n\t}\n\n\tprivate async getCommitChangedFiles(commit: string): Promise<string[]> {\n\t\ttry {\n\t\t\tconst { stdout } = await execAsync(\n\t\t\t\t`git diff --name-only ${commit}^..${commit}`,\n\t\t\t);\n\t\t\treturn this.parseOutput(stdout);\n\t\t} catch (_error) {\n\t\t\ttry {\n\t\t\t\tconst { stdout } = await execAsync(\n\t\t\t\t\t`git diff --name-only --root ${commit}`,\n\t\t\t\t);\n\t\t\t\treturn this.parseOutput(stdout);\n\t\t\t} catch {\n\t\t\t\tthrow new Error(`Failed to get changes for commit ${commit}`);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate async getFixBaseChangedFiles(fixBase: string): Promise<string[]> {\n\t\treturn this.getDiffWithWorkingTree(fixBase);\n\t}\n\n\tprivate async getUncommittedChangedFiles(): Promise<string[]> {\n\t\tconst files = new Set(await this.getWorkingTreeFiles());\n\t\treturn Array.from(files);\n\t}\n\n\tprivate parseOutput(stdout: string): string[] {\n\t\treturn stdout\n\t\t\t.split(\"\\n\")\n\t\t\t.map((line) => line.trim())\n\t\t\t.filter((line) => line.length > 0);\n\t}\n}\n",
|
|
12
|
-
"import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport picomatch from \"picomatch\";\nimport type { EntryPointConfig } from \"../config/types.js\";\n\nexport interface ExpandedEntryPoint {\n\tpath: string; // The specific directory (e.g., \"engines/billing\")\n\tconfig: EntryPointConfig; // The config that generated this (e.g., \"engines/*\")\n}\n\nexport class EntryPointExpander {\n\tasync expand(\n\t\tentryPoints: EntryPointConfig[],\n\t\tchangedFiles: string[],\n\t): Promise<ExpandedEntryPoint[]> {\n\t\tconst results: ExpandedEntryPoint[] = [];\n\t\tconst rootEntryPoint = entryPoints.find((ep) => ep.path === \".\");\n\n\t\t// Always include root entry point if configured and there are ANY changes\n\t\tif (changedFiles.length > 0) {\n\t\t\tconst rootConfig = rootEntryPoint ?? { path: \".\" };\n\t\t\t// Apply exclusion filtering for root if configured\n\t\t\tconst filteredRootChanges = this.filterExcludedFiles(\n\t\t\t\tchangedFiles,\n\t\t\t\trootConfig.exclude,\n\t\t\t);\n\n\t\t\tif (filteredRootChanges.length > 0) {\n\t\t\t\tresults.push({ path: \".\", config: rootConfig });\n\t\t\t}\n\t\t}\n\n\t\tfor (const ep of entryPoints) {\n\t\t\tif (ep.path === \".\") continue; // Handled above\n\n\t\t\t// Apply exclusion filtering first!\n\t\t\tconst filteredChanges = this.filterExcludedFiles(\n\t\t\t\tchangedFiles,\n\t\t\t\tep.exclude,\n\t\t\t);\n\n\t\t\t// If no relevant files remain, skip this entry point\n\t\t\tif (filteredChanges.length === 0) continue;\n\n\t\t\tif (ep.path.endsWith(\"*\") && !ep.path.includes(\"**\")) {\n\t\t\t\t// Single-level wildcard directory (e.g., \"engines/*\")\n\t\t\t\tconst parentDir = ep.path.slice(0, -2); // \"engines\"\n\t\t\t\tconst expandedPaths = await this.expandWildcard(\n\t\t\t\t\tparentDir,\n\t\t\t\t\tfilteredChanges,\n\t\t\t\t);\n\n\t\t\t\tfor (const subDir of expandedPaths) {\n\t\t\t\t\tresults.push({\n\t\t\t\t\t\tpath: subDir,\n\t\t\t\t\t\tconfig: ep,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t} else if (this.isGlobPattern(ep.path)) {\n\t\t\t\t// Glob pattern (e.g., \"openspec/changes/**/
|
|
12
|
+
"import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport picomatch from \"picomatch\";\nimport type { EntryPointConfig } from \"../config/types.js\";\n\nexport interface ExpandedEntryPoint {\n\tpath: string; // The specific directory (e.g., \"engines/billing\")\n\tconfig: EntryPointConfig; // The config that generated this (e.g., \"engines/*\")\n}\n\nexport class EntryPointExpander {\n\tasync expand(\n\t\tentryPoints: EntryPointConfig[],\n\t\tchangedFiles: string[],\n\t): Promise<ExpandedEntryPoint[]> {\n\t\tconst results: ExpandedEntryPoint[] = [];\n\t\tconst rootEntryPoint = entryPoints.find((ep) => ep.path === \".\");\n\n\t\t// Always include root entry point if configured and there are ANY changes\n\t\tif (changedFiles.length > 0) {\n\t\t\tconst rootConfig = rootEntryPoint ?? { path: \".\" };\n\t\t\t// Apply exclusion filtering for root if configured\n\t\t\tconst filteredRootChanges = this.filterExcludedFiles(\n\t\t\t\tchangedFiles,\n\t\t\t\trootConfig.exclude,\n\t\t\t);\n\n\t\t\tif (filteredRootChanges.length > 0) {\n\t\t\t\tresults.push({ path: \".\", config: rootConfig });\n\t\t\t}\n\t\t}\n\n\t\tfor (const ep of entryPoints) {\n\t\t\tif (ep.path === \".\") continue; // Handled above\n\n\t\t\t// Apply exclusion filtering first!\n\t\t\tconst filteredChanges = this.filterExcludedFiles(\n\t\t\t\tchangedFiles,\n\t\t\t\tep.exclude,\n\t\t\t);\n\n\t\t\t// If no relevant files remain, skip this entry point\n\t\t\tif (filteredChanges.length === 0) continue;\n\n\t\t\tif (ep.path.endsWith(\"*\") && !ep.path.includes(\"**\")) {\n\t\t\t\t// Single-level wildcard directory (e.g., \"engines/*\")\n\t\t\t\tconst parentDir = ep.path.slice(0, -2); // \"engines\"\n\t\t\t\tconst expandedPaths = await this.expandWildcard(\n\t\t\t\t\tparentDir,\n\t\t\t\t\tfilteredChanges,\n\t\t\t\t);\n\n\t\t\t\tfor (const subDir of expandedPaths) {\n\t\t\t\t\tresults.push({\n\t\t\t\t\t\tpath: subDir,\n\t\t\t\t\t\tconfig: ep,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t} else if (this.isGlobPattern(ep.path)) {\n\t\t\t\t// Glob pattern (e.g., \"openspec/changes/**/spec.md\")\n\t\t\t\tif (this.hasMatchingFiles(ep.path, filteredChanges)) {\n\t\t\t\t\tresults.push({\n\t\t\t\t\t\tpath: ep.path,\n\t\t\t\t\t\tconfig: ep,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Fixed directory (e.g., \"apps/api\")\n\t\t\t\tif (this.hasChangesInDir(ep.path, filteredChanges)) {\n\t\t\t\t\tresults.push({\n\t\t\t\t\t\tpath: ep.path,\n\t\t\t\t\t\tconfig: ep,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn results;\n\t}\n\n\tasync expandAll(\n\t\tentryPoints: EntryPointConfig[],\n\t): Promise<ExpandedEntryPoint[]> {\n\t\tconst results: ExpandedEntryPoint[] = [];\n\n\t\tfor (const ep of entryPoints) {\n\t\t\tif (ep.path === \".\") {\n\t\t\t\tresults.push({ path: \".\", config: ep });\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (ep.path.endsWith(\"*\") && !ep.path.includes(\"**\")) {\n\t\t\t\t// Single-level wildcard directory (e.g., \"engines/*\")\n\t\t\t\tconst parentDir = ep.path.slice(0, -2);\n\t\t\t\tconst subDirs = await this.listSubDirectories(parentDir);\n\t\t\t\tfor (const subDir of subDirs) {\n\t\t\t\t\tresults.push({ path: subDir, config: ep });\n\t\t\t\t}\n\t\t\t} else if (this.isGlobPattern(ep.path)) {\n\t\t\t\t// Glob pattern (e.g., \"openspec/changes/**/spec.md\")\n\t\t\t\t// Include as-is for expandAll since it's a virtual entry point\n\t\t\t\tresults.push({ path: ep.path, config: ep });\n\t\t\t} else {\n\t\t\t\tresults.push({ path: ep.path, config: ep });\n\t\t\t}\n\t\t}\n\n\t\treturn results;\n\t}\n\n\tprivate filterExcludedFiles(files: string[], patterns?: string[]): string[] {\n\t\tif (!patterns || patterns.length === 0) {\n\t\t\treturn files;\n\t\t}\n\n\t\t// Pre-compile matchers\n\t\tconst matchers: picomatch.Matcher[] = [];\n\t\tconst prefixes: string[] = [];\n\n\t\tfor (const pattern of patterns) {\n\t\t\tif (pattern.match(/[*?[{]/)) {\n\t\t\t\tmatchers.push(picomatch(pattern));\n\t\t\t} else {\n\t\t\t\tprefixes.push(pattern);\n\t\t\t}\n\t\t}\n\n\t\treturn files.filter((file) => {\n\t\t\t// If matches ANY pattern, exclude it\n\t\t\tconst isExcluded =\n\t\t\t\tprefixes.some((p) => file === p || file.startsWith(`${p}/`)) ||\n\t\t\t\tmatchers.some((m) => m(file));\n\n\t\t\treturn !isExcluded;\n\t\t});\n\t}\n\n\tprivate async expandWildcard(\n\t\tparentDir: string,\n\t\tchangedFiles: string[],\n\t): Promise<string[]> {\n\t\tconst affectedSubDirs = new Set<string>();\n\n\t\t// Filter changes that are inside this parent directory\n\t\tconst relevantChanges = changedFiles.filter((f) =>\n\t\t\tf.startsWith(`${parentDir}/`),\n\t\t);\n\n\t\tfor (const file of relevantChanges) {\n\t\t\t// file: \"engines/billing/src/foo.ts\", parentDir: \"engines\"\n\t\t\t// relPath: \"billing/src/foo.ts\"\n\t\t\tconst relPath = file.slice(parentDir.length + 1);\n\t\t\tconst subDirName = relPath.split(\"/\")[0];\n\n\t\t\tif (subDirName) {\n\t\t\t\taffectedSubDirs.add(path.join(parentDir, subDirName));\n\t\t\t}\n\t\t}\n\n\t\treturn Array.from(affectedSubDirs);\n\t}\n\n\tprivate async listSubDirectories(parentDir: string): Promise<string[]> {\n\t\ttry {\n\t\t\tconst dirents = await fs.readdir(parentDir, { withFileTypes: true });\n\t\t\treturn dirents\n\t\t\t\t.filter((d) => d.isDirectory())\n\t\t\t\t.map((d) => path.join(parentDir, d.name));\n\t\t} catch {\n\t\t\treturn [];\n\t\t}\n\t}\n\n\tprivate hasChangesInDir(dirPath: string, changedFiles: string[]): boolean {\n\t\t// Check if any changed file starts with the dirPath\n\t\t// Need to ensure exact match or subdirectory (e.g. \"app\" should not match \"apple\")\n\t\tconst dirPrefix = dirPath.endsWith(\"/\") ? dirPath : `${dirPath}/`;\n\t\treturn changedFiles.some((f) => f === dirPath || f.startsWith(dirPrefix));\n\t}\n\n\tprivate isGlobPattern(pattern: string): boolean {\n\t\t// Check if the pattern contains glob characters\n\t\treturn /[*?[{]/.test(pattern);\n\t}\n\n\tprivate hasMatchingFiles(pattern: string, changedFiles: string[]): boolean {\n\t\tconst matcher = picomatch(pattern);\n\t\treturn changedFiles.some((file) => matcher(file));\n\t}\n}\n",
|
|
13
13
|
"import type {\n\tCheckGateConfig,\n\tLoadedConfig,\n\tLoadedReviewGateConfig,\n} from \"../config/types.js\";\nimport type { ExpandedEntryPoint } from \"./entry-point.js\";\n\nexport type JobType = \"check\" | \"review\";\n\nexport interface Job {\n\tid: string; // unique id for logging/tracking\n\ttype: JobType;\n\tname: string;\n\tentryPoint: string;\n\tgateConfig: CheckGateConfig | LoadedReviewGateConfig;\n\tworkingDirectory: string;\n}\n\nexport class JobGenerator {\n\tconstructor(private config: LoadedConfig) {}\n\n\tgenerateJobs(expandedEntryPoints: ExpandedEntryPoint[]): Job[] {\n\t\tconst jobs: Job[] = [];\n\t\tconst seenJobs = new Set<string>();\n\t\tconst isCI =\n\t\t\tprocess.env.CI === \"true\" || process.env.GITHUB_ACTIONS === \"true\";\n\n\t\tfor (const ep of expandedEntryPoints) {\n\t\t\t// 1. Process Checks\n\t\t\tif (ep.config.checks) {\n\t\t\t\tfor (const checkName of ep.config.checks) {\n\t\t\t\t\tconst checkConfig = this.config.checks[checkName];\n\t\t\t\t\tif (!checkConfig) {\n\t\t\t\t\t\tconsole.warn(\n\t\t\t\t\t\t\t`Warning: Check gate '${checkName}' configured in entry point '${ep.path}' but not found in checks definitions.`,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Filter based on environment\n\t\t\t\t\tif (isCI && !checkConfig.run_in_ci) continue;\n\t\t\t\t\tif (!isCI && !checkConfig.run_locally) continue;\n\n\t\t\t\t\tconst workingDirectory =\n\t\t\t\t\t\tcheckConfig.working_directory === \"entrypoint\"\n\t\t\t\t\t\t\t? ep.path\n\t\t\t\t\t\t\t: checkConfig.working_directory || ep.path;\n\t\t\t\t\tconst jobKey = `check:${checkName}:${workingDirectory}`;\n\n\t\t\t\t\t// Skip if we've already created a job for this check/working-directory combination\n\t\t\t\t\tif (seenJobs.has(jobKey)) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tseenJobs.add(jobKey);\n\n\t\t\t\t\tjobs.push({\n\t\t\t\t\t\tid: `check:${workingDirectory}:${checkName}`,\n\t\t\t\t\t\ttype: \"check\",\n\t\t\t\t\t\tname: checkName,\n\t\t\t\t\t\tentryPoint: ep.path,\n\t\t\t\t\t\tgateConfig: checkConfig,\n\t\t\t\t\t\tworkingDirectory: workingDirectory,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// 2. Process Reviews\n\t\t\tif (ep.config.reviews) {\n\t\t\t\tfor (const reviewName of ep.config.reviews) {\n\t\t\t\t\tconst reviewConfig = this.config.reviews[reviewName];\n\t\t\t\t\tif (!reviewConfig) {\n\t\t\t\t\t\tconsole.warn(\n\t\t\t\t\t\t\t`Warning: Review gate '${reviewName}' configured in entry point '${ep.path}' but not found in reviews definitions.`,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Filter based on environment\n\t\t\t\t\tif (isCI && !reviewConfig.run_in_ci) continue;\n\t\t\t\t\tif (!isCI && !reviewConfig.run_locally) continue;\n\n\t\t\t\t\tjobs.push({\n\t\t\t\t\t\tid: `review:${ep.path}:${reviewName}`,\n\t\t\t\t\t\ttype: \"review\",\n\t\t\t\t\t\tname: reviewName,\n\t\t\t\t\t\tentryPoint: ep.path,\n\t\t\t\t\t\tgateConfig: reviewConfig,\n\t\t\t\t\t\tworkingDirectory: ep.path, // Reviews always run in context of entry point\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn jobs;\n\t}\n}\n",
|
|
14
14
|
"import { exec } from \"node:child_process\";\nimport { promisify } from \"node:util\";\nimport type { LoadedCheckGateConfig } from \"../config/types.js\";\nimport { resolveCheckCommand } from \"./resolve-check-command.js\";\nimport type { GateResult } from \"./result.js\";\n\nconst execAsync = promisify(exec);\nconst MAX_BUFFER_BYTES = 10 * 1024 * 1024;\n\nexport class CheckGateExecutor {\n\tasync execute(\n\t\tjobId: string,\n\t\tconfig: LoadedCheckGateConfig,\n\t\tworkingDirectory: string,\n\t\tlogger: (output: string) => Promise<void>,\n\t\toptions?: { baseBranch?: string; isRerun?: boolean },\n\t): Promise<GateResult> {\n\t\tconst startTime = Date.now();\n\n\t\tconst command = resolveCheckCommand(config, options);\n\n\t\ttry {\n\t\t\tawait logger(\n\t\t\t\t`[${new Date().toISOString()}] Starting check: ${config.name}\\n`,\n\t\t\t);\n\t\t\tawait logger(`Executing command: ${command}\\n`);\n\t\t\tawait logger(`Working directory: ${workingDirectory}\\n\\n`);\n\n\t\t\tconst { stdout, stderr } = await execAsync(command, {\n\t\t\t\tcwd: workingDirectory,\n\t\t\t\ttimeout: config.timeout ? config.timeout * 1000 : undefined,\n\t\t\t\tmaxBuffer: MAX_BUFFER_BYTES,\n\t\t\t});\n\n\t\t\tif (stdout) await logger(stdout);\n\t\t\tif (stderr) await logger(`\\nSTDERR:\\n${stderr}`);\n\n\t\t\tconst result: GateResult = {\n\t\t\t\tjobId,\n\t\t\t\tstatus: \"pass\",\n\t\t\t\tduration: Date.now() - startTime,\n\t\t\t\tmessage: \"Command exited with code 0\",\n\t\t\t};\n\n\t\t\tawait logger(`Result: ${result.status} - ${result.message}\\n`);\n\t\t\treturn result;\n\t\t} catch (error: unknown) {\n\t\t\tconst err = error as {\n\t\t\t\tstdout?: string;\n\t\t\t\tstderr?: string;\n\t\t\t\tmessage?: string;\n\t\t\t\tsignal?: string;\n\t\t\t\tcode?: number;\n\t\t\t};\n\t\t\tif (err.stdout) await logger(err.stdout);\n\t\t\tif (err.stderr) await logger(`\\nSTDERR:\\n${err.stderr}`);\n\n\t\t\tawait logger(`\\nCommand failed: ${err.message}`);\n\n\t\t\t// If it's a timeout\n\t\t\tif (err.signal === \"SIGTERM\" && config.timeout) {\n\t\t\t\tconst result: GateResult = {\n\t\t\t\t\tjobId,\n\t\t\t\t\tstatus: \"fail\",\n\t\t\t\t\tduration: Date.now() - startTime,\n\t\t\t\t\tmessage: `Timed out after ${config.timeout}s`,\n\t\t\t\t\tfixInstructions: config.fixInstructionsContent,\n\t\t\t\t\tfixWithSkill: config.fixWithSkill,\n\t\t\t\t};\n\t\t\t\tawait logger(`Result: ${result.status} - ${result.message}\\n`);\n\t\t\t\tawait this.logFixInfo(config, logger);\n\t\t\t\treturn result;\n\t\t\t}\n\n\t\t\t// If it's a non-zero exit code\n\t\t\tif (typeof err.code === \"number\") {\n\t\t\t\tconst result: GateResult = {\n\t\t\t\t\tjobId,\n\t\t\t\t\tstatus: \"fail\",\n\t\t\t\t\tduration: Date.now() - startTime,\n\t\t\t\t\tmessage: `Exited with code ${err.code}`,\n\t\t\t\t\tfixInstructions: config.fixInstructionsContent,\n\t\t\t\t\tfixWithSkill: config.fixWithSkill,\n\t\t\t\t};\n\t\t\t\tawait logger(`Result: ${result.status} - ${result.message}\\n`);\n\t\t\t\tawait this.logFixInfo(config, logger);\n\t\t\t\treturn result;\n\t\t\t}\n\n\t\t\t// Other errors\n\t\t\tconst result: GateResult = {\n\t\t\t\tjobId,\n\t\t\t\tstatus: \"error\",\n\t\t\t\tduration: Date.now() - startTime,\n\t\t\t\tmessage: err.message || \"Unknown error\",\n\t\t\t\tfixInstructions: config.fixInstructionsContent,\n\t\t\t\tfixWithSkill: config.fixWithSkill,\n\t\t\t};\n\t\t\tawait logger(`Result: ${result.status} - ${result.message}\\n`);\n\t\t\tawait this.logFixInfo(config, logger);\n\t\t\treturn result;\n\t\t}\n\t}\n\n\tprivate async logFixInfo(\n\t\tconfig: LoadedCheckGateConfig,\n\t\tlogger: (output: string) => Promise<void>,\n\t): Promise<void> {\n\t\tif (config.fixInstructionsContent) {\n\t\t\tawait logger(\n\t\t\t\t`\\n--- Fix Instructions ---\\n${config.fixInstructionsContent}\\n`,\n\t\t\t);\n\t\t}\n\t\tif (config.fixWithSkill) {\n\t\t\tawait logger(`\\n--- Fix Skill: ${config.fixWithSkill} ---\\n`);\n\t\t}\n\t}\n}\n",
|
|
15
15
|
"import type { LoadedCheckGateConfig } from \"../config/types.js\";\n\n/**\n * Resolves which command to execute for a check gate, selecting rerun_command\n * when in rerun mode and performing variable substitution.\n */\nexport function resolveCheckCommand(\n\tconfig: Pick<LoadedCheckGateConfig, \"command\" | \"rerun_command\">,\n\toptions?: { baseBranch?: string; isRerun?: boolean },\n): string {\n\tconst rawCommand =\n\t\toptions?.isRerun && config.rerun_command\n\t\t\t? config.rerun_command\n\t\t\t: config.command;\n\tlet result = rawCommand;\n\tconst baseBranch = options?.baseBranch;\n\tif (baseBranch) {\n\t\tresult = result.replace(/\\$\\{BASE_BRANCH\\}/g, () => baseBranch);\n\t}\n\treturn result;\n}\n",
|
|
16
16
|
"import { exec } from \"node:child_process\";\nimport fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { promisify } from \"node:util\";\nimport { getAdapter, isUsageLimit } from \"../cli-adapters/index.js\";\nimport type { AdapterConfig, LoadedReviewGateConfig } from \"../config/types.js\";\nimport { getCategoryLogger } from \"../output/app-logger.js\";\nimport {\n\ttype DiffFileRange,\n\tisValidViolationLocation,\n\tparseDiff,\n} from \"../utils/diff-parser.js\";\nimport {\n\tgetUnhealthyAdapters,\n\tisAdapterCoolingDown,\n\tmarkAdapterHealthy,\n\tmarkAdapterUnhealthy,\n} from \"../utils/execution-state.js\";\nimport type {\n\tGateResult,\n\tPreviousViolation,\n\tReviewFullJsonOutput,\n} from \"./result.js\";\n\nconst log = getCategoryLogger(\"gate\", \"review\");\n\nconst execAsync = promisify(exec);\n\nconst MAX_BUFFER_BYTES = 10 * 1024 * 1024;\nconst MAX_LOG_BUFFER_SIZE = 10000;\nconst REVIEW_ADAPTER_TIMEOUT_MS = 5 * 60 * 1000; // 5 minutes\n\n/** Chars-per-token approximation for rough token estimates. */\nconst CHARS_PER_TOKEN = 4;\n\nexport const JSON_SYSTEM_INSTRUCTION = `\nYou are in a read-only mode. You may read files in the repository to gather context.\nDo NOT attempt to modify files or run shell commands that change system state.\nDo NOT access files outside the repository root.\nDo NOT access the .git/ directory or read git history/commit information.\nUse your available file-reading and search tools to find information.\nIf the diff is insufficient or ambiguous, use your tools to read the full file content or related files.\n\nCRITICAL SCOPE RESTRICTIONS:\n- ONLY review the code changes shown in the diff below\n- DO NOT review commit history or existing code outside the diff\n- All violations MUST reference file paths and line numbers that appear IN THE DIFF\n- The \"file\" field must match a file from the diff\n- The \"line\" field must be within a changed region (lines starting with + in the diff)\n\nIMPORTANT: You must output ONLY a valid JSON object. Do not output any markdown text, explanations, or code blocks outside of the JSON.\nEach violation MUST include a \"priority\" field with one of: \"critical\", \"high\", \"medium\", \"low\".\nEach violation MUST include a \"status\" field set to \"new\".\n\nIf violations are found:\n{\n \"status\": \"fail\",\n \"violations\": [\n {\n \"file\": \"path/to/file.rb\",\n \"line\": 10,\n \"issue\": \"Description of the violation\",\n \"fix\": \"Suggestion on how to fix it\",\n \"priority\": \"high\",\n \"status\": \"new\"\n }\n ]\n}\n\nIf NO violations are found:\n{\n \"status\": \"pass\",\n \"message\": \"No problems found\"\n}\n`;\n\ntype ReviewConfig = LoadedReviewGateConfig;\n\ninterface ReviewJsonOutput {\n\tstatus: \"pass\" | \"fail\";\n\tmessage?: string;\n\tviolations?: Array<{\n\t\tfile: string;\n\t\tline: number | string;\n\t\tissue: string;\n\t\tfix?: string;\n\t\tpriority: \"critical\" | \"high\" | \"medium\" | \"low\";\n\t\tstatus: \"new\" | \"fixed\" | \"skipped\";\n\t\tresult?: string | null;\n\t}>;\n}\n\nexport class ReviewGateExecutor {\n\tprivate constructPrompt(\n\t\tconfig: ReviewConfig,\n\t\tpreviousViolations: PreviousViolation[] = [],\n\t): string {\n\t\tconst baseContent = config.promptContent || \"\";\n\n\t\tif (previousViolations.length > 0) {\n\t\t\treturn (\n\t\t\t\tbaseContent +\n\t\t\t\t\"\\n\\n\" +\n\t\t\t\tthis.buildPreviousFailuresSection(previousViolations) +\n\t\t\t\t\"\\n\" +\n\t\t\t\tJSON_SYSTEM_INSTRUCTION\n\t\t\t);\n\t\t}\n\n\t\treturn `${baseContent}\\n${JSON_SYSTEM_INSTRUCTION}`;\n\t}\n\n\tasync execute(\n\t\tjobId: string,\n\t\tconfig: ReviewConfig,\n\t\tentryPointPath: string,\n\t\tloggerFactory: (\n\t\t\tadapterName?: string,\n\t\t\treviewIndex?: number,\n\t\t) => Promise<{\n\t\t\tlogger: (output: string) => Promise<void>;\n\t\t\tlogPath: string;\n\t\t}>,\n\t\tbaseBranch: string,\n\t\tpreviousFailures?: Map<string, PreviousViolation[]>,\n\t\tchangeOptions?: {\n\t\t\tcommit?: string;\n\t\t\tuncommitted?: boolean;\n\t\t\tfixBase?: string;\n\t\t},\n\t\trerunThreshold: \"critical\" | \"high\" | \"medium\" | \"low\" = \"high\",\n\t\tpassedSlots?: Map<number, { adapter: string; passIteration: number }>,\n\t\tlogDir?: string,\n\t\tadapterConfigs?: Record<string, AdapterConfig>,\n\t): Promise<GateResult> {\n\t\tconst startTime = Date.now();\n\t\tconst logBuffer: string[] = [];\n\t\tlet logSequence = 0;\n\t\tconst activeLoggers: Array<\n\t\t\t(output: string, index: number) => Promise<void>\n\t\t> = [];\n\t\tconst logPaths: string[] = [];\n\t\tconst logPathsSet = new Set<string>();\n\n\t\tconst mainLogger = async (output: string) => {\n\t\t\tconst seq = logSequence++;\n\t\t\tif (logBuffer.length < MAX_LOG_BUFFER_SIZE) {\n\t\t\t\tlogBuffer.push(output);\n\t\t\t}\n\t\t\tawait Promise.allSettled(activeLoggers.map((l) => l(output, seq)));\n\t\t};\n\n\t\tconst getAdapterLogger = async (\n\t\t\tadapterName: string,\n\t\t\treviewIndex: number,\n\t\t) => {\n\t\t\tconst { logger, logPath } = await loggerFactory(adapterName, reviewIndex);\n\t\t\tif (!logPathsSet.has(logPath)) {\n\t\t\t\tlogPathsSet.add(logPath);\n\t\t\t\tlogPaths.push(logPath);\n\t\t\t}\n\n\t\t\tconst seenIndices = new Set<number>();\n\n\t\t\tconst safeLogger = async (msg: string, index: number) => {\n\t\t\t\tif (seenIndices.has(index)) return;\n\t\t\t\tseenIndices.add(index);\n\t\t\t\tawait logger(msg);\n\t\t\t};\n\n\t\t\tactiveLoggers.push(safeLogger);\n\n\t\t\tconst snapshot = [...logBuffer];\n\t\t\tawait Promise.all(snapshot.map((msg, i) => safeLogger(msg, i)));\n\n\t\t\treturn logger;\n\t\t};\n\n\t\ttry {\n\t\t\tlog.debug(`Starting review: ${config.name} | entry=${entryPointPath}`);\n\t\t\tawait mainLogger(`Starting review: ${config.name}\\n`);\n\t\t\tawait mainLogger(`Entry point: ${entryPointPath}\\n`);\n\t\t\tawait mainLogger(`Base branch: ${baseBranch}\\n`);\n\n\t\t\tconst diff = await this.getDiff(\n\t\t\t\tentryPointPath,\n\t\t\t\tbaseBranch,\n\t\t\t\tchangeOptions,\n\t\t\t);\n\n\t\t\t// Compute and log diff size stats\n\t\t\tconst diffLines = diff.split(\"\\n\").length;\n\t\t\tconst diffChars = diff.length;\n\t\t\tconst diffEstTokens = Math.ceil(diffChars / CHARS_PER_TOKEN);\n\t\t\tconst diffFileRanges = parseDiff(diff);\n\t\t\tconst diffFiles = diffFileRanges.size;\n\t\t\tconst diffSizeMsg = `[diff-stats] files=${diffFiles} lines=${diffLines} chars=${diffChars} est_tokens=${diffEstTokens}`;\n\t\t\tlog.debug(diffSizeMsg);\n\t\t\tawait mainLogger(`${diffSizeMsg}\\n`);\n\n\t\t\tif (!diff.trim()) {\n\t\t\t\tlog.debug(`Empty diff after trim, returning pass`);\n\t\t\t\tawait mainLogger(\"No changes found in entry point, skipping review.\\n\");\n\t\t\t\tawait mainLogger(\"Result: pass - No changes to review\\n\");\n\t\t\t\treturn {\n\t\t\t\t\tjobId,\n\t\t\t\t\tstatus: \"pass\",\n\t\t\t\t\tduration: Date.now() - startTime,\n\t\t\t\t\tmessage: \"No changes to review\",\n\t\t\t\t\tlogPaths,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tconst required = config.num_reviews ?? 1;\n\t\t\tconst outputs: Array<{\n\t\t\t\tadapter: string;\n\t\t\t\treviewIndex: number;\n\t\t\t\tduration?: number;\n\t\t\t\tstatus: \"pass\" | \"fail\" | \"error\";\n\t\t\t\tmessage: string;\n\t\t\t\tjson?: ReviewJsonOutput;\n\t\t\t\tskipped?: Array<{\n\t\t\t\t\tfile: string;\n\t\t\t\t\tline: number | string;\n\t\t\t\t\tissue: string;\n\t\t\t\t\tresult?: string | null;\n\t\t\t\t}>;\n\t\t\t}> = [];\n\n\t\t\tconst preferences = config.cli_preference || [];\n\t\t\tconst parallel = config.parallel ?? false;\n\t\t\tlog.debug(\n\t\t\t\t`Checking adapters: ${preferences.join(\", \") || \"(none configured)\"}`,\n\t\t\t);\n\n\t\t\t// Determine healthy adapters using cooldown-based filtering\n\t\t\tconst healthyAdapters: string[] = [];\n\t\t\tconst unhealthyMap = logDir ? await getUnhealthyAdapters(logDir) : {};\n\n\t\t\tfor (const toolName of preferences) {\n\t\t\t\tconst adapter = getAdapter(toolName);\n\t\t\t\tif (!adapter) {\n\t\t\t\t\tlog.debug(`Adapter ${toolName}: not found`);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Check cooldown status\n\t\t\t\tconst unhealthyEntry = unhealthyMap[toolName];\n\t\t\t\tif (unhealthyEntry) {\n\t\t\t\t\tif (isAdapterCoolingDown(unhealthyEntry)) {\n\t\t\t\t\t\tlog.debug(`Adapter ${toolName}: cooling down`);\n\t\t\t\t\t\tawait mainLogger(\n\t\t\t\t\t\t\t`Skipping ${toolName}: cooling down (${unhealthyEntry.reason})\\n`,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Cooldown expired - probe binary availability\n\t\t\t\t\tconst health = await adapter.checkHealth();\n\t\t\t\t\tif (health.status === \"healthy\") {\n\t\t\t\t\t\tlog.debug(\n\t\t\t\t\t\t\t`Adapter ${toolName}: cooldown expired, binary available, clearing unhealthy flag`,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (logDir) {\n\t\t\t\t\t\t\tawait markAdapterHealthy(logDir, toolName);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tlog.debug(\n\t\t\t\t\t\t\t`Adapter ${toolName}: cooldown expired but binary missing`,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tawait mainLogger(\n\t\t\t\t\t\t\t`Skipping ${toolName}: ${health.message || \"Missing\"}\\n`,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// Not in unhealthy list - check binary availability\n\t\t\t\t\tconst health = await adapter.checkHealth();\n\t\t\t\t\tif (health.status !== \"healthy\") {\n\t\t\t\t\t\tlog.debug(\n\t\t\t\t\t\t\t`Adapter ${toolName}: ${health.status}${health.message ? ` - ${health.message}` : \"\"}`,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tawait mainLogger(\n\t\t\t\t\t\t\t`Skipping ${toolName}: ${health.message || \"Unhealthy\"}\\n`,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\thealthyAdapters.push(toolName);\n\t\t\t}\n\n\t\t\tif (healthyAdapters.length === 0) {\n\t\t\t\tconst msg = \"Review dispatch failed: no healthy adapters available\";\n\t\t\t\tlog.error(`ERROR: ${msg}`);\n\t\t\t\tawait mainLogger(`Result: error - ${msg}\\n`);\n\t\t\t\treturn {\n\t\t\t\t\tjobId,\n\t\t\t\t\tstatus: \"error\",\n\t\t\t\t\tduration: Date.now() - startTime,\n\t\t\t\t\tmessage: msg,\n\t\t\t\t\tlogPaths,\n\t\t\t\t};\n\t\t\t}\n\t\t\tlog.debug(`Healthy adapters: ${healthyAdapters.join(\", \")}`);\n\n\t\t\t// Round-robin assignment over healthy adapters\n\t\t\tconst assignments: Array<{\n\t\t\t\tadapter: string;\n\t\t\t\treviewIndex: number;\n\t\t\t\tskip?: boolean;\n\t\t\t\tskipReason?: string;\n\t\t\t\tpassIteration?: number;\n\t\t\t}> = [];\n\t\t\tfor (let i = 0; i < required; i++) {\n\t\t\t\tconst adapter = healthyAdapters[i % healthyAdapters.length];\n\t\t\t\tif (!adapter) continue;\n\t\t\t\tassignments.push({\n\t\t\t\t\tadapter,\n\t\t\t\t\treviewIndex: i + 1,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// Skip logic for passed slots (only when num_reviews > 1 and in rerun mode)\n\t\t\tif (required > 1 && passedSlots && passedSlots.size > 0) {\n\t\t\t\t// Identify which slots passed (with same adapter) and which failed\n\t\t\t\tconst passedIndexes: number[] = [];\n\t\t\t\tconst failedIndexes: number[] = [];\n\n\t\t\t\tfor (const assignment of assignments) {\n\t\t\t\t\tconst passed = passedSlots.get(assignment.reviewIndex);\n\t\t\t\t\t// Only consider as passed if same adapter is assigned\n\t\t\t\t\tif (passed && passed.adapter === assignment.adapter) {\n\t\t\t\t\t\tpassedIndexes.push(assignment.reviewIndex);\n\t\t\t\t\t\tassignment.passIteration = passed.passIteration;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tfailedIndexes.push(assignment.reviewIndex);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (failedIndexes.length > 0) {\n\t\t\t\t\t// Some slots failed: run failed slots, skip passed slots\n\t\t\t\t\tfor (const assignment of assignments) {\n\t\t\t\t\t\tif (assignment.passIteration !== undefined) {\n\t\t\t\t\t\t\tassignment.skip = true;\n\t\t\t\t\t\t\tassignment.skipReason = `previously passed in iteration ${assignment.passIteration} (num_reviews > 1)`;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else if (passedIndexes.length === assignments.length) {\n\t\t\t\t\t// All slots passed: safety latch - run slot 1, skip rest\n\t\t\t\t\tfor (const assignment of assignments) {\n\t\t\t\t\t\tif (assignment.reviewIndex === 1) {\n\t\t\t\t\t\t\tassignment.skip = false;\n\t\t\t\t\t\t\t// Log safety latch message\n\t\t\t\t\t\t\tawait mainLogger(\n\t\t\t\t\t\t\t\t`Running @1: safety latch (all slots previously passed)\\n`,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tassignment.skip = true;\n\t\t\t\t\t\t\tassignment.skipReason = `previously passed in iteration ${assignment.passIteration} (num_reviews > 1)`;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Log skip messages\n\t\t\tfor (const assignment of assignments) {\n\t\t\t\tif (assignment.skip && assignment.skipReason) {\n\t\t\t\t\tawait mainLogger(\n\t\t\t\t\t\t`Skipping @${assignment.reviewIndex}: ${assignment.skipReason}\\n`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst dispatchMsg = `Dispatching ${required} review(s) via round-robin: ${assignments.map((a) => `${a.adapter}@${a.reviewIndex}`).join(\", \")}`;\n\t\t\tlog.debug(dispatchMsg);\n\t\t\tawait mainLogger(`${dispatchMsg}\\n`);\n\n\t\t\t// Separate assignments into running and skipped\n\t\t\tconst runningAssignments = assignments.filter((a) => !a.skip);\n\t\t\tconst skippedAssignments = assignments.filter((a) => a.skip);\n\t\t\tlog.debug(\n\t\t\t\t`Running: ${runningAssignments.length}, Skipped: ${skippedAssignments.length}`,\n\t\t\t);\n\n\t\t\t// Track skipped slots for output\n\t\t\tconst skippedSlotOutputs: Array<{\n\t\t\t\tadapter: string;\n\t\t\t\treviewIndex: number;\n\t\t\t\tstatus: \"skipped_prior_pass\";\n\t\t\t\tmessage: string;\n\t\t\t\tpassIteration: number;\n\t\t\t}> = [];\n\n\t\t\t// Handle skipped slots: write JSON log with status \"skipped_prior_pass\"\n\t\t\tfor (const assignment of skippedAssignments) {\n\t\t\t\tconst { logger, logPath } = await loggerFactory(\n\t\t\t\t\tassignment.adapter,\n\t\t\t\t\tassignment.reviewIndex,\n\t\t\t\t);\n\n\t\t\t\t// Write to log file explaining the skip\n\t\t\t\tconst skipMessage = `[${new Date().toISOString()}] Review skipped: previously passed in iteration ${assignment.passIteration}\\n`;\n\t\t\t\tawait logger(skipMessage);\n\t\t\t\tawait logger(`Adapter: ${assignment.adapter}\\n`);\n\t\t\t\tawait logger(`Review index: @${assignment.reviewIndex}\\n`);\n\t\t\t\tawait logger(`Status: skipped_prior_pass\\n`);\n\n\t\t\t\tconst jsonPath = logPath.replace(/\\.log$/, \".json\");\n\t\t\t\tconst skippedOutput: ReviewFullJsonOutput = {\n\t\t\t\t\tadapter: assignment.adapter,\n\t\t\t\t\ttimestamp: new Date().toISOString(),\n\t\t\t\t\tstatus: \"skipped_prior_pass\",\n\t\t\t\t\trawOutput: \"\",\n\t\t\t\t\tviolations: [],\n\t\t\t\t\tpassIteration: assignment.passIteration,\n\t\t\t\t};\n\t\t\t\tawait fs.writeFile(jsonPath, JSON.stringify(skippedOutput, null, 2));\n\n\t\t\t\tif (!logPathsSet.has(logPath)) {\n\t\t\t\t\tlogPathsSet.add(logPath);\n\t\t\t\t\tlogPaths.push(logPath);\n\t\t\t\t}\n\n\t\t\t\tskippedSlotOutputs.push({\n\t\t\t\t\tadapter: assignment.adapter,\n\t\t\t\t\treviewIndex: assignment.reviewIndex,\n\t\t\t\t\tstatus: \"skipped_prior_pass\",\n\t\t\t\t\tmessage: `Skipped: previously passed in iteration ${assignment.passIteration}`,\n\t\t\t\t\tpassIteration: assignment.passIteration ?? 0,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (parallel && runningAssignments.length > 1) {\n\t\t\t\t// Parallel execution\n\t\t\t\tconst results = await Promise.all(\n\t\t\t\t\trunningAssignments.map((assignment) =>\n\t\t\t\t\t\tthis.runSingleReview(\n\t\t\t\t\t\t\tassignment.adapter,\n\t\t\t\t\t\t\tassignment.reviewIndex,\n\t\t\t\t\t\t\tconfig,\n\t\t\t\t\t\t\tdiff,\n\t\t\t\t\t\t\tgetAdapterLogger,\n\t\t\t\t\t\t\tmainLogger,\n\t\t\t\t\t\t\tloggerFactory,\n\t\t\t\t\t\t\tpreviousFailures,\n\t\t\t\t\t\t\trerunThreshold,\n\t\t\t\t\t\t\tlogDir,\n\t\t\t\t\t\t\tadapterConfigs,\n\t\t\t\t\t\t),\n\t\t\t\t\t),\n\t\t\t\t);\n\n\t\t\t\tfor (const res of results) {\n\t\t\t\t\tif (res) {\n\t\t\t\t\t\toutputs.push({\n\t\t\t\t\t\t\tadapter: res.adapter,\n\t\t\t\t\t\t\treviewIndex: res.reviewIndex,\n\t\t\t\t\t\t\tduration: res.duration,\n\t\t\t\t\t\t\t...res.evaluation,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Sequential execution\n\t\t\t\tfor (const assignment of runningAssignments) {\n\t\t\t\t\tconst res = await this.runSingleReview(\n\t\t\t\t\t\tassignment.adapter,\n\t\t\t\t\t\tassignment.reviewIndex,\n\t\t\t\t\t\tconfig,\n\t\t\t\t\t\tdiff,\n\t\t\t\t\t\tgetAdapterLogger,\n\t\t\t\t\t\tmainLogger,\n\t\t\t\t\t\tloggerFactory,\n\t\t\t\t\t\tpreviousFailures,\n\t\t\t\t\t\trerunThreshold,\n\t\t\t\t\t\tlogDir,\n\t\t\t\t\t\tadapterConfigs,\n\t\t\t\t\t);\n\t\t\t\t\tif (res) {\n\t\t\t\t\t\toutputs.push({\n\t\t\t\t\t\t\tadapter: res.adapter,\n\t\t\t\t\t\t\treviewIndex: res.reviewIndex,\n\t\t\t\t\t\t\tduration: res.duration,\n\t\t\t\t\t\t\t...res.evaluation,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Check if all running reviews completed (skipped ones don't count)\n\t\t\tif (outputs.length < runningAssignments.length) {\n\t\t\t\tconst msg = `Failed to complete reviews. Expected: ${runningAssignments.length}, Completed: ${outputs.length}. See logs for details.`;\n\t\t\t\tawait mainLogger(`Result: error - ${msg}\\n`);\n\t\t\t\treturn {\n\t\t\t\t\tjobId,\n\t\t\t\t\tstatus: \"error\",\n\t\t\t\t\tduration: Date.now() - startTime,\n\t\t\t\t\tmessage: msg,\n\t\t\t\t\tlogPaths,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tconst failed = outputs.filter((result) => result.status === \"fail\");\n\t\t\tconst errored = outputs.filter((result) => result.status === \"error\");\n\t\t\tconst allSkipped = outputs.flatMap((result) => result.skipped || []);\n\n\t\t\tlet status: \"pass\" | \"fail\" | \"error\" = \"pass\";\n\t\t\tlet message = \"Passed\";\n\n\t\t\tif (errored.length > 0) {\n\t\t\t\tstatus = \"error\";\n\t\t\t\tmessage = `Error in ${errored.length} adapter(s)`;\n\t\t\t} else if (failed.length > 0) {\n\t\t\t\tstatus = \"fail\";\n\t\t\t\tmessage = `Failed by ${failed.length} adapter(s)`;\n\t\t\t}\n\n\t\t\t// Add skipped slot count to message if any\n\t\t\tif (skippedSlotOutputs.length > 0) {\n\t\t\t\tmessage += ` (${skippedSlotOutputs.length} skipped due to prior pass)`;\n\t\t\t}\n\n\t\t\tconst subResults = outputs.map((out) => {\n\t\t\t\tconst specificLog = logPaths.find((p) => {\n\t\t\t\t\tconst filename = path.basename(p);\n\t\t\t\t\treturn (\n\t\t\t\t\t\tfilename.includes(`_${out.adapter}@${out.reviewIndex}.`) &&\n\t\t\t\t\t\tfilename.endsWith(\".log\")\n\t\t\t\t\t);\n\t\t\t\t});\n\n\t\t\t\tlet logPath = specificLog;\n\t\t\t\tif (specificLog && out.json && out.status === \"fail\") {\n\t\t\t\t\tlogPath = specificLog.replace(/\\.log$/, \".json\");\n\t\t\t\t}\n\n\t\t\t\tconst errorCount =\n\t\t\t\t\tout.json && Array.isArray(out.json.violations)\n\t\t\t\t\t\t? out.json.violations.filter((v) => !v.status || v.status === \"new\")\n\t\t\t\t\t\t\t\t.length\n\t\t\t\t\t\t: out.status === \"fail\" || out.status === \"error\"\n\t\t\t\t\t\t\t? 1\n\t\t\t\t\t\t\t: 0;\n\n\t\t\t\tconst fixedCount =\n\t\t\t\t\tout.json && Array.isArray(out.json.violations)\n\t\t\t\t\t\t? out.json.violations.filter((v) => v.status === \"fixed\").length\n\t\t\t\t\t\t: 0;\n\n\t\t\t\treturn {\n\t\t\t\t\tnameSuffix: `(${out.adapter}@${out.reviewIndex})`,\n\t\t\t\t\tstatus: out.status,\n\t\t\t\t\tduration: out.duration,\n\t\t\t\t\tmessage: out.message,\n\t\t\t\t\tlogPath,\n\t\t\t\t\terrorCount,\n\t\t\t\t\tfixedCount,\n\t\t\t\t\tskipped: out.skipped,\n\t\t\t\t};\n\t\t\t});\n\n\t\t\t// Add skipped slot subResults (they don't affect gate status)\n\t\t\tfor (const skipped of skippedSlotOutputs) {\n\t\t\t\tconst specificLog = logPaths.find((p) => {\n\t\t\t\t\tconst filename = path.basename(p);\n\t\t\t\t\treturn (\n\t\t\t\t\t\tfilename.includes(`_${skipped.adapter}@${skipped.reviewIndex}.`) &&\n\t\t\t\t\t\tfilename.endsWith(\".log\")\n\t\t\t\t\t);\n\t\t\t\t});\n\n\t\t\t\tsubResults.push({\n\t\t\t\t\tnameSuffix: `(${skipped.adapter}@${skipped.reviewIndex})`,\n\t\t\t\t\tstatus: \"pass\" as const, // Show as pass since it previously passed\n\t\t\t\t\tduration: undefined,\n\t\t\t\t\tmessage: skipped.message,\n\t\t\t\t\tlogPath: specificLog?.replace(/\\.log$/, \".json\"),\n\t\t\t\t\terrorCount: 0,\n\t\t\t\t\tfixedCount: 0,\n\t\t\t\t\tskipped: undefined,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// Sort subResults by review index for consistent ordering\n\t\t\tsubResults.sort((a, b) => {\n\t\t\t\tconst aIndex = parseInt(a.nameSuffix.match(/@(\\d+)/)?.[1] || \"0\", 10);\n\t\t\t\tconst bIndex = parseInt(b.nameSuffix.match(/@(\\d+)/)?.[1] || \"0\", 10);\n\t\t\t\treturn aIndex - bIndex;\n\t\t\t});\n\n\t\t\tlog.debug(`Complete: ${status} - ${message}`);\n\t\t\tawait mainLogger(`Result: ${status} - ${message}\\n`);\n\n\t\t\treturn {\n\t\t\t\tjobId,\n\t\t\t\tstatus,\n\t\t\t\tduration: Date.now() - startTime,\n\t\t\t\tmessage,\n\t\t\t\tlogPaths,\n\t\t\t\tsubResults,\n\t\t\t\tskipped: allSkipped,\n\t\t\t};\n\t\t} catch (error: unknown) {\n\t\t\tconst err = error as { message?: string; stack?: string };\n\t\t\tconst errMsg = err.message || \"Unknown error\";\n\t\t\tconst errStack = err.stack || \"\";\n\t\t\t// nosemgrep: javascript.lang.security.audit.unsafe-formatstring.unsafe-formatstring\n\t\t\tlog.error(`CRITICAL ERROR: ${errMsg} ${errStack}`);\n\t\t\tawait mainLogger(`Critical Error: ${errMsg}\\n`);\n\t\t\tawait mainLogger(\"Result: error\\n\");\n\t\t\treturn {\n\t\t\t\tjobId,\n\t\t\t\tstatus: \"error\",\n\t\t\t\tduration: Date.now() - startTime,\n\t\t\t\tmessage: errMsg,\n\t\t\t\tlogPaths,\n\t\t\t};\n\t\t}\n\t}\n\n\tprivate async runSingleReview(\n\t\ttoolName: string,\n\t\treviewIndex: number,\n\t\tconfig: ReviewConfig,\n\t\tdiff: string,\n\t\tgetAdapterLogger: (\n\t\t\tadapterName: string,\n\t\t\treviewIndex: number,\n\t\t) => Promise<(output: string) => Promise<void>>,\n\t\tmainLogger: (output: string) => Promise<void>,\n\t\tloggerFactory: (\n\t\t\tadapterName?: string,\n\t\t\treviewIndex?: number,\n\t\t) => Promise<{\n\t\t\tlogger: (output: string) => Promise<void>;\n\t\t\tlogPath: string;\n\t\t}>,\n\t\tpreviousFailures?: Map<string, PreviousViolation[]>,\n\t\trerunThreshold: \"critical\" | \"high\" | \"medium\" | \"low\" = \"high\",\n\t\tlogDir?: string,\n\t\tadapterConfigs?: Record<string, AdapterConfig>,\n\t): Promise<{\n\t\tadapter: string;\n\t\treviewIndex: number;\n\t\tduration: number;\n\t\tevaluation: {\n\t\t\tstatus: \"pass\" | \"fail\" | \"error\";\n\t\t\tmessage: string;\n\t\t\tjson?: ReviewJsonOutput;\n\t\t\tskipped?: Array<{\n\t\t\t\tfile: string;\n\t\t\t\tline: number | string;\n\t\t\t\tissue: string;\n\t\t\t\tresult?: string | null;\n\t\t\t}>;\n\t\t};\n\t} | null> {\n\t\tconst reviewStartTime = Date.now();\n\t\tconst adapter = getAdapter(toolName);\n\t\tif (!adapter) return null;\n\n\t\tif (!adapter.name || typeof adapter.name !== \"string\") {\n\t\t\tawait mainLogger(\n\t\t\t\t`Error: Invalid adapter name: ${JSON.stringify(adapter.name)}\\n`,\n\t\t\t);\n\t\t\treturn null;\n\t\t}\n\t\tconst adapterLogger = await getAdapterLogger(adapter.name, reviewIndex);\n\t\tconst { logPath } = await loggerFactory(adapter.name, reviewIndex);\n\n\t\ttry {\n\t\t\tconst startMsg = `[START] review:.:${config.name} (${adapter.name}@${reviewIndex})`;\n\t\t\tawait adapterLogger(`${startMsg}\\n`);\n\n\t\t\t// Look up previous violations by review index key, falling back to adapter name for legacy logs\n\t\t\tconst indexKey = String(reviewIndex);\n\t\t\tconst adapterPreviousViolations =\n\t\t\t\tpreviousFailures?.get(indexKey) ??\n\t\t\t\tpreviousFailures?.get(adapter.name) ??\n\t\t\t\t[];\n\t\t\tconst finalPrompt = this.constructPrompt(\n\t\t\t\tconfig,\n\t\t\t\tadapterPreviousViolations,\n\t\t\t);\n\n\t\t\t// Log prompt + diff size so we can compare against actual token usage from telemetry\n\t\t\tconst promptChars = finalPrompt.length;\n\t\t\tconst diffChars = diff.length;\n\t\t\tconst totalInputChars = promptChars + diffChars;\n\t\t\tconst promptEstTokens = Math.ceil(promptChars / CHARS_PER_TOKEN);\n\t\t\tconst diffEstTokens = Math.ceil(diffChars / CHARS_PER_TOKEN);\n\t\t\tconst totalEstTokens = promptEstTokens + diffEstTokens;\n\t\t\tconst inputSizeMsg = `[input-stats] prompt_chars=${promptChars} diff_chars=${diffChars} total_chars=${totalInputChars} prompt_est_tokens=${promptEstTokens} diff_est_tokens=${diffEstTokens} total_est_tokens=${totalEstTokens}`;\n\t\t\tawait adapterLogger(`${inputSizeMsg}\\n`);\n\t\t\tawait adapterLogger(`[diff]\\n${diff}\\n`);\n\n\t\t\tconst adapterCfg = adapterConfigs?.[toolName];\n\t\t\tconst output = await adapter.execute({\n\t\t\t\tprompt: finalPrompt,\n\t\t\t\tdiff,\n\t\t\t\tmodel: config.model,\n\t\t\t\ttimeoutMs: config.timeout\n\t\t\t\t\t? config.timeout * 1000\n\t\t\t\t\t: REVIEW_ADAPTER_TIMEOUT_MS,\n\t\t\t\tonOutput: (chunk: string) => {\n\t\t\t\t\t// Stream output to log file in real-time\n\t\t\t\t\tadapterLogger(chunk);\n\t\t\t\t},\n\t\t\t\tallowToolUse: adapterCfg?.allow_tool_use,\n\t\t\t\tthinkingBudget: adapterCfg?.thinking_budget,\n\t\t\t});\n\n\t\t\tawait adapterLogger(\n\t\t\t\t`\\n--- Review Output (${adapter.name}) ---\\n${output}\\n`,\n\t\t\t);\n\n\t\t\tconst evaluation = this.evaluateOutput(output, diff);\n\n\t\t\t// Check for usage limit only when output failed to parse as valid JSON.\n\t\t\t// This avoids false positives when a review legitimately mentions \"usage limit\".\n\t\t\tif (evaluation.status === \"error\" && isUsageLimit(output)) {\n\t\t\t\tconst reason = \"Usage limit exceeded\";\n\t\t\t\tif (logDir) {\n\t\t\t\t\tawait markAdapterUnhealthy(logDir, adapter.name, reason);\n\t\t\t\t\tlog.debug(\n\t\t\t\t\t\t`Adapter ${adapter.name} marked unhealthy for 1 hour: ${reason}`,\n\t\t\t\t\t);\n\t\t\t\t\tawait mainLogger(\n\t\t\t\t\t\t`${adapter.name} marked unhealthy for 1 hour: ${reason}\\n`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\treturn {\n\t\t\t\t\tadapter: adapter.name,\n\t\t\t\t\treviewIndex,\n\t\t\t\t\tduration: Date.now() - reviewStartTime,\n\t\t\t\t\tevaluation: {\n\t\t\t\t\t\tstatus: \"error\",\n\t\t\t\t\t\tmessage: reason,\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// Rerun Filtering: If we have previous failures, filter new violations by threshold\n\t\t\tif (\n\t\t\t\tadapterPreviousViolations.length > 0 &&\n\t\t\t\tevaluation.json?.violations &&\n\t\t\t\tevaluation.status === \"fail\"\n\t\t\t) {\n\t\t\t\tconst priorities = [\"critical\", \"high\", \"medium\", \"low\"];\n\t\t\t\tconst thresholdIndex = priorities.indexOf(rerunThreshold);\n\n\t\t\t\tconst originalCount = evaluation.json.violations.length;\n\n\t\t\t\tevaluation.json.violations = evaluation.json.violations.filter((v) => {\n\t\t\t\t\tconst priority = v.priority || \"low\";\n\t\t\t\t\tconst priorityIndex = priorities.indexOf(priority);\n\n\t\t\t\t\tif (priorityIndex === -1) return true;\n\n\t\t\t\t\treturn priorityIndex <= thresholdIndex;\n\t\t\t\t});\n\n\t\t\t\tconst filteredByThreshold =\n\t\t\t\t\toriginalCount - evaluation.json.violations.length;\n\n\t\t\t\tif (filteredByThreshold > 0) {\n\t\t\t\t\tawait adapterLogger(\n\t\t\t\t\t\t`Note: ${filteredByThreshold} new violations filtered due to rerun threshold (${rerunThreshold})\\n`,\n\t\t\t\t\t);\n\t\t\t\t\tevaluation.filteredCount =\n\t\t\t\t\t\t(evaluation.filteredCount || 0) + filteredByThreshold;\n\n\t\t\t\t\tif (evaluation.json.violations.length === 0) {\n\t\t\t\t\t\tevaluation.status = \"pass\";\n\t\t\t\t\t\tevaluation.message = `Passed (${filteredByThreshold} below-threshold violations filtered)`;\n\t\t\t\t\t\tevaluation.json.status = \"pass\";\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (evaluation.status === \"error\") {\n\t\t\t\tawait adapterLogger(`Error: ${evaluation.message}\\n`);\n\t\t\t\tawait mainLogger(\n\t\t\t\t\t`Error parsing review from ${adapter.name}: ${evaluation.message}\\n`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (evaluation.filteredCount && evaluation.filteredCount > 0) {\n\t\t\t\tawait adapterLogger(\n\t\t\t\t\t`Note: ${evaluation.filteredCount} out-of-scope violations filtered\\n`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tlet skipped: Array<{\n\t\t\t\tfile: string;\n\t\t\t\tline: number | string;\n\t\t\t\tissue: string;\n\t\t\t\tresult?: string | null;\n\t\t\t}> = [];\n\n\t\t\tif (evaluation.json) {\n\t\t\t\tif (evaluation.json.status === \"fail\") {\n\t\t\t\t\tif (!Array.isArray(evaluation.json.violations)) {\n\t\t\t\t\t\tawait adapterLogger(\n\t\t\t\t\t\t\t\"Warning: Missing 'violations' array in failure response\\n\",\n\t\t\t\t\t\t);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tfor (const v of evaluation.json.violations) {\n\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t!v.file ||\n\t\t\t\t\t\t\t\tv.line === undefined ||\n\t\t\t\t\t\t\t\tv.line === null ||\n\t\t\t\t\t\t\t\t!v.issue ||\n\t\t\t\t\t\t\t\t!v.priority ||\n\t\t\t\t\t\t\t\t!v.status\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\tawait adapterLogger(\n\t\t\t\t\t\t\t\t\t`Warning: Violation missing required fields: ${JSON.stringify(v)}\\n`,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tconst jsonPath = await this.writeJsonResult(\n\t\t\t\t\tlogPath,\n\t\t\t\t\tadapter.name,\n\t\t\t\t\tevaluation.status,\n\t\t\t\t\toutput,\n\t\t\t\t\tevaluation.json,\n\t\t\t\t);\n\n\t\t\t\tskipped = (evaluation.json.violations || [])\n\t\t\t\t\t.filter((v) => v.status === \"skipped\")\n\t\t\t\t\t.map((v) => ({\n\t\t\t\t\t\tfile: v.file,\n\t\t\t\t\t\tline: v.line,\n\t\t\t\t\t\tissue: v.issue,\n\t\t\t\t\t\tresult: v.result,\n\t\t\t\t\t}));\n\n\t\t\t\tawait adapterLogger(`\\n--- Parsed Result (${adapter.name}) ---\\n`);\n\t\t\t\tif (\n\t\t\t\t\tevaluation.json.status === \"fail\" &&\n\t\t\t\t\tArray.isArray(evaluation.json.violations)\n\t\t\t\t) {\n\t\t\t\t\tawait adapterLogger(`Status: FAIL\\n`);\n\t\t\t\t\tawait adapterLogger(`Review: ${jsonPath}\\n`);\n\t\t\t\t\tawait adapterLogger(`Violations:\\n`);\n\t\t\t\t\tfor (const [i, v] of evaluation.json.violations.entries()) {\n\t\t\t\t\t\tawait adapterLogger(\n\t\t\t\t\t\t\t`${i + 1}. ${v.file}:${v.line || \"?\"} - ${v.issue}\\n`,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (v.fix) await adapterLogger(` Fix: ${v.fix}\\n`);\n\t\t\t\t\t}\n\t\t\t\t} else if (evaluation.json.status === \"pass\") {\n\t\t\t\t\tawait adapterLogger(`Status: PASS\\n`);\n\t\t\t\t\tif (evaluation.json.message)\n\t\t\t\t\t\tawait adapterLogger(`Message: ${evaluation.json.message}\\n`);\n\t\t\t\t} else {\n\t\t\t\t\tawait adapterLogger(`Status: ${evaluation.json.status}\\n`);\n\t\t\t\t\tawait adapterLogger(\n\t\t\t\t\t\t`Raw: ${JSON.stringify(evaluation.json, null, 2)}\\n`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tawait adapterLogger(`---------------------\\n`);\n\t\t\t}\n\n\t\t\tconst resultMsg = `Review result (${adapter.name}@${reviewIndex}): ${evaluation.status} - ${evaluation.message}`;\n\t\t\tawait adapterLogger(`${resultMsg}\\n`);\n\n\t\t\treturn {\n\t\t\t\tadapter: adapter.name,\n\t\t\t\treviewIndex,\n\t\t\t\tduration: Date.now() - reviewStartTime,\n\t\t\t\tevaluation: {\n\t\t\t\t\tstatus: evaluation.status,\n\t\t\t\t\tmessage: evaluation.message,\n\t\t\t\t\tjson: evaluation.json,\n\t\t\t\t\tskipped,\n\t\t\t\t},\n\t\t\t};\n\t\t} catch (error: unknown) {\n\t\t\tconst err = error as { message?: string };\n\t\t\tconst errorMsg = `Error running ${adapter.name}@${reviewIndex}: ${err.message}`;\n\t\t\tlog.error(errorMsg);\n\t\t\tawait adapterLogger(`${errorMsg}\\n`);\n\t\t\tawait mainLogger(`${errorMsg}\\n`);\n\n\t\t\t// Check if the error is a usage limit\n\t\t\tif (err.message && isUsageLimit(err.message)) {\n\t\t\t\tconst reason = \"Usage limit exceeded\";\n\t\t\t\tif (logDir) {\n\t\t\t\t\tawait markAdapterUnhealthy(logDir, adapter.name, reason);\n\t\t\t\t\tlog.debug(\n\t\t\t\t\t\t`Adapter ${adapter.name} marked unhealthy for 1 hour: ${reason}`,\n\t\t\t\t\t);\n\t\t\t\t\tawait mainLogger(\n\t\t\t\t\t\t`${adapter.name} marked unhealthy for 1 hour: ${reason}\\n`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\treturn {\n\t\t\t\t\tadapter: adapter.name,\n\t\t\t\t\treviewIndex,\n\t\t\t\t\tduration: Date.now() - reviewStartTime,\n\t\t\t\t\tevaluation: {\n\t\t\t\t\t\tstatus: \"error\",\n\t\t\t\t\t\tmessage: reason,\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn null;\n\t\t}\n\t}\n\n\tprivate async getDiff(\n\t\tentryPointPath: string,\n\t\tbaseBranch: string,\n\t\toptions?: { commit?: string; uncommitted?: boolean; fixBase?: string },\n\t): Promise<string> {\n\t\t// Debug: log which diff mode is active\n\t\tlog.debug(\n\t\t\t`getDiff: entryPoint=${entryPointPath}, fixBase=${options?.fixBase ?? \"none\"}, uncommitted=${options?.uncommitted ?? false}, commit=${options?.commit ?? \"none\"}`,\n\t\t);\n\n\t\t// If fixBase is provided (rerun mode)\n\t\tif (options?.fixBase) {\n\t\t\t// Validate fixBase to prevent command injection\n\t\t\tif (!/^[a-f0-9]+$/.test(options.fixBase)) {\n\t\t\t\tthrow new Error(`Invalid session ref: ${options.fixBase}`);\n\t\t\t}\n\n\t\t\tconst pathArg = this.pathArg(entryPointPath);\n\t\t\ttry {\n\t\t\t\tconst diff = await this.execDiff(\n\t\t\t\t\t`git diff ${options.fixBase}${pathArg}`,\n\t\t\t\t);\n\n\t\t\t\tconst { stdout: untrackedStdout } = await execAsync(\n\t\t\t\t\t`git ls-files --others --exclude-standard${pathArg}`,\n\t\t\t\t\t{ maxBuffer: MAX_BUFFER_BYTES },\n\t\t\t\t);\n\t\t\t\tconst currentUntracked = new Set(this.parseLines(untrackedStdout));\n\n\t\t\t\tconst { stdout: snapshotFilesStdout } = await execAsync(\n\t\t\t\t\t`git ls-tree -r --name-only ${options.fixBase}${pathArg}`,\n\t\t\t\t\t{ maxBuffer: MAX_BUFFER_BYTES },\n\t\t\t\t);\n\t\t\t\tconst snapshotFiles = new Set(this.parseLines(snapshotFilesStdout));\n\n\t\t\t\tconst newUntracked = [...currentUntracked].filter(\n\t\t\t\t\t(f) => !snapshotFiles.has(f),\n\t\t\t\t);\n\t\t\t\tconst newUntrackedDiffs: string[] = [];\n\n\t\t\t\tfor (const file of newUntracked) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst d = await this.execDiff(\n\t\t\t\t\t\t\t`git diff --no-index -- /dev/null ${this.quoteArg(file)}`,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (d.trim()) newUntrackedDiffs.push(d);\n\t\t\t\t\t} catch (error: unknown) {\n\t\t\t\t\t\tconst err = error as { message?: string; stderr?: string };\n\t\t\t\t\t\tconst msg = [err.message, err.stderr].filter(Boolean).join(\"\\n\");\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t!msg.includes(\"Could not access\") &&\n\t\t\t\t\t\t\t!msg.includes(\"ENOENT\") &&\n\t\t\t\t\t\t\t!msg.includes(\"No such file\")\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tthrow error;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tconst scopedDiff = [diff, ...newUntrackedDiffs]\n\t\t\t\t\t.filter(Boolean)\n\t\t\t\t\t.join(\"\\n\");\n\t\t\t\tlog.debug(\n\t\t\t\t\t`Scoped diff via fixBase: ${scopedDiff.split(\"\\n\").length} lines`,\n\t\t\t\t);\n\t\t\t\treturn scopedDiff;\n\t\t\t} catch (error) {\n\t\t\t\tlog.warn(\n\t\t\t\t\t`Failed to compute diff against fixBase ${options.fixBase}, falling back to full uncommitted diff. ${error instanceof Error ? error.message : error}`,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tif (options?.uncommitted) {\n\t\t\tlog.debug(`Using full uncommitted diff (no fixBase)`);\n\t\t\tconst pathArg = this.pathArg(entryPointPath);\n\t\t\tconst staged = await this.execDiff(`git diff --cached${pathArg}`);\n\t\t\tconst unstaged = await this.execDiff(`git diff${pathArg}`);\n\t\t\tconst untracked = await this.untrackedDiff(entryPointPath);\n\t\t\treturn [staged, unstaged, untracked].filter(Boolean).join(\"\\n\");\n\t\t}\n\n\t\tif (options?.commit) {\n\t\t\tconst pathArg = this.pathArg(entryPointPath);\n\t\t\ttry {\n\t\t\t\treturn await this.execDiff(\n\t\t\t\t\t`git diff ${options.commit}^..${options.commit}${pathArg}`,\n\t\t\t\t);\n\t\t\t} catch (error: unknown) {\n\t\t\t\tconst err = error as { message?: string; stderr?: string };\n\t\t\t\tif (\n\t\t\t\t\terr.message?.includes(\"unknown revision\") ||\n\t\t\t\t\terr.stderr?.includes(\"unknown revision\")\n\t\t\t\t) {\n\t\t\t\t\treturn await this.execDiff(\n\t\t\t\t\t\t`git diff --root ${options.commit}${pathArg}`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t}\n\n\t\tconst isCI =\n\t\t\tprocess.env.CI === \"true\" || process.env.GITHUB_ACTIONS === \"true\";\n\t\treturn isCI\n\t\t\t? this.getCIDiff(entryPointPath, baseBranch)\n\t\t\t: this.getLocalDiff(entryPointPath, baseBranch);\n\t}\n\n\tprivate async getCIDiff(\n\t\tentryPointPath: string,\n\t\tbaseBranch: string,\n\t): Promise<string> {\n\t\tconst baseRef = baseBranch;\n\t\tconst headRef = process.env.GITHUB_SHA || \"HEAD\";\n\t\tconst pathArg = this.pathArg(entryPointPath);\n\n\t\ttry {\n\t\t\treturn await this.execDiff(`git diff ${baseRef}...${headRef}${pathArg}`);\n\t\t} catch (_error) {\n\t\t\tconst fallback = await this.execDiff(`git diff HEAD^...HEAD${pathArg}`);\n\t\t\treturn fallback;\n\t\t}\n\t}\n\n\tprivate async getLocalDiff(\n\t\tentryPointPath: string,\n\t\tbaseBranch: string,\n\t): Promise<string> {\n\t\tconst pathArg = this.pathArg(entryPointPath);\n\t\tconst committed = await this.execDiff(\n\t\t\t`git diff ${baseBranch}...HEAD${pathArg}`,\n\t\t);\n\t\tconst uncommitted = await this.execDiff(`git diff HEAD${pathArg}`);\n\t\tconst untracked = await this.untrackedDiff(entryPointPath);\n\n\t\treturn [committed, uncommitted, untracked].filter(Boolean).join(\"\\n\");\n\t}\n\n\tprivate async untrackedDiff(entryPointPath: string): Promise<string> {\n\t\tconst pathArg = this.pathArg(entryPointPath);\n\t\tconst { stdout } = await execAsync(\n\t\t\t`git ls-files --others --exclude-standard${pathArg}`,\n\t\t\t{\n\t\t\t\tmaxBuffer: MAX_BUFFER_BYTES,\n\t\t\t},\n\t\t);\n\t\tconst files = this.parseLines(stdout);\n\t\tconst diffs: string[] = [];\n\n\t\tfor (const file of files) {\n\t\t\ttry {\n\t\t\t\tconst diff = await this.execDiff(\n\t\t\t\t\t`git diff --no-index -- /dev/null ${this.quoteArg(file)}`,\n\t\t\t\t);\n\t\t\t\tif (diff.trim()) diffs.push(diff);\n\t\t\t} catch (error: unknown) {\n\t\t\t\tconst err = error as { message?: string; stderr?: string };\n\t\t\t\tconst msg = [err.message, err.stderr].filter(Boolean).join(\"\\n\");\n\t\t\t\tif (\n\t\t\t\t\tmsg.includes(\"Could not access\") ||\n\t\t\t\t\tmsg.includes(\"ENOENT\") ||\n\t\t\t\t\tmsg.includes(\"No such file\")\n\t\t\t\t) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t}\n\n\t\treturn diffs.join(\"\\n\");\n\t}\n\n\tprivate async execDiff(command: string): Promise<string> {\n\t\ttry {\n\t\t\tconst { stdout } = await execAsync(command, {\n\t\t\t\tmaxBuffer: MAX_BUFFER_BYTES,\n\t\t\t});\n\t\t\treturn stdout;\n\t\t} catch (error: unknown) {\n\t\t\tconst err = error as { code?: number; stdout?: string };\n\t\t\tif (typeof err.code === \"number\" && err.stdout) {\n\t\t\t\treturn err.stdout;\n\t\t\t}\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\tprivate buildPreviousFailuresSection(\n\t\tviolations: PreviousViolation[],\n\t): string {\n\t\tconst toVerify = violations.filter((v) => v.status === \"fixed\");\n\t\tconst unaddressed = violations.filter(\n\t\t\t(v) => v.status === \"new\" || !v.status,\n\t\t);\n\n\t\tconst affectedFiles = [...new Set(violations.map((v) => v.file))];\n\n\t\tconst lines: string[] = [];\n\n\t\tlines.push(`━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\nRERUN MODE: VERIFY PREVIOUS FIXES ONLY\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\nThis is a RERUN review. The agent attempted to fix some of the violations listed below.\nYour task is STRICTLY LIMITED to verifying the fixes for violations marked as FIXED.\n\nPREVIOUS VIOLATIONS TO VERIFY:\n`);\n\n\t\tif (toVerify.length === 0) {\n\t\t\tlines.push(\"(No violations were marked as FIXED for verification)\\n\");\n\t\t} else {\n\t\t\ttoVerify.forEach((v, i) => {\n\t\t\t\tlines.push(`${i + 1}. ${v.file}:${v.line} - ${v.issue}`);\n\t\t\t\tif (v.fix) {\n\t\t\t\t\tlines.push(` Suggested fix: ${v.fix}`);\n\t\t\t\t}\n\t\t\t\tif (v.result) {\n\t\t\t\t\tlines.push(` Agent result: ${v.result}`);\n\t\t\t\t}\n\t\t\t\tlines.push(\"\");\n\t\t\t});\n\t\t}\n\n\t\tif (unaddressed.length > 0) {\n\t\t\tlines.push(`UNADDRESSED VIOLATIONS (STILL FAILING):\nThe following violations were NOT marked as fixed or skipped and are still active failures:\n`);\n\t\t\tunaddressed.forEach((v, i) => {\n\t\t\t\tlines.push(`${i + 1}. ${v.file}:${v.line} - ${v.issue}`);\n\t\t\t});\n\t\t\tlines.push(\"\");\n\t\t}\n\n\t\tlines.push(`STRICT INSTRUCTIONS FOR RERUN MODE:\n\n1. VERIFY FIXES: Check if each violation marked as FIXED above has been addressed\n - For violations that are fixed, confirm they no longer appear\n - For violations that remain unfixed, include them in your violations array (status: \"new\")\n\n2. UNADDRESSED VIOLATIONS: You MUST include all UNADDRESSED violations listed above in your output array if they still exist.\n\n3. CHECK FOR REGRESSIONS ONLY: You may ONLY report NEW violations if they:\n - Are in FILES that were modified to fix the above violations: ${affectedFiles.join(\", \")}\n - Are DIRECTLY caused by the fix changes (e.g., a fix introduced a new bug)\n - Are in the same function/region that was modified to address a previous violation\n\n4. Return status \"pass\" ONLY if ALL previous violations (including unaddressed ones) are now fixed AND no regressions were introduced.\n Otherwise, return status \"fail\" and list all remaining violations.\n\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━`);\n\n\t\treturn lines.join(\"\\n\");\n\t}\n\n\tpublic evaluateOutput(\n\t\toutput: string,\n\t\tdiff?: string,\n\t): {\n\t\tstatus: \"pass\" | \"fail\" | \"error\";\n\t\tmessage: string;\n\t\tjson?: ReviewJsonOutput;\n\t\tfilteredCount?: number;\n\t} {\n\t\tconst diffRanges = diff ? parseDiff(diff) : undefined;\n\n\t\ttry {\n\t\t\tconst jsonBlockMatch = output.match(/```json\\s*([\\s\\S]*?)\\s*```/);\n\t\t\tif (jsonBlockMatch?.[1]) {\n\t\t\t\ttry {\n\t\t\t\t\tconst json = JSON.parse(jsonBlockMatch[1]);\n\t\t\t\t\treturn this.validateAndReturn(json, diffRanges);\n\t\t\t\t} catch {\n\t\t\t\t\t// Fall through\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst end = output.lastIndexOf(\"}\");\n\t\t\tif (end !== -1) {\n\t\t\t\tlet start = output.lastIndexOf(\"{\", end);\n\t\t\t\twhile (start !== -1) {\n\t\t\t\t\tconst candidate = output.substring(start, end + 1);\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst json = JSON.parse(candidate);\n\t\t\t\t\t\tif (json.status) {\n\t\t\t\t\t\t\treturn this.validateAndReturn(json, diffRanges);\n\t\t\t\t\t\t}\n\t\t\t\t\t} catch {\n\t\t\t\t\t\t// Not valid JSON, keep searching\n\t\t\t\t\t}\n\t\t\t\t\tstart = output.lastIndexOf(\"{\", start - 1);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst firstStart = output.indexOf(\"{\");\n\t\t\tif (firstStart !== -1 && end !== -1 && end > firstStart) {\n\t\t\t\ttry {\n\t\t\t\t\tconst candidate = output.substring(firstStart, end + 1);\n\t\t\t\t\tconst json = JSON.parse(candidate);\n\t\t\t\t\treturn this.validateAndReturn(json, diffRanges);\n\t\t\t\t} catch {\n\t\t\t\t\t// Ignore\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tstatus: \"error\",\n\t\t\t\tmessage: \"No valid JSON object found in output\",\n\t\t\t};\n\t\t} catch (error: unknown) {\n\t\t\tconst err = error as { message?: string };\n\t\t\treturn {\n\t\t\t\tstatus: \"error\",\n\t\t\t\tmessage: `Failed to parse JSON output: ${err.message}`,\n\t\t\t};\n\t\t}\n\t}\n\n\tprivate validateAndReturn(\n\t\tjson: ReviewJsonOutput,\n\t\tdiffRanges?: Map<string, DiffFileRange>,\n\t): {\n\t\tstatus: \"pass\" | \"fail\" | \"error\";\n\t\tmessage: string;\n\t\tjson?: ReviewJsonOutput;\n\t\tfilteredCount?: number;\n\t} {\n\t\tif (!json.status || (json.status !== \"pass\" && json.status !== \"fail\")) {\n\t\t\treturn {\n\t\t\t\tstatus: \"error\",\n\t\t\t\tmessage: 'Invalid JSON: missing or invalid \"status\" field',\n\t\t\t\tjson,\n\t\t\t};\n\t\t}\n\n\t\tif (json.status === \"pass\") {\n\t\t\treturn { status: \"pass\", message: json.message || \"Passed\", json };\n\t\t}\n\n\t\tlet filteredCount = 0;\n\n\t\tif (Array.isArray(json.violations) && diffRanges?.size) {\n\t\t\tconst originalCount = json.violations.length;\n\n\t\t\tjson.violations = json.violations.filter(\n\t\t\t\t(v: { file: string; line: number | string }) => {\n\t\t\t\t\t// Coerce string line numbers to numbers for validation\n\t\t\t\t\tconst lineStr =\n\t\t\t\t\t\ttypeof v.line === \"string\" ? v.line.trim() : undefined;\n\t\t\t\t\tconst lineNum =\n\t\t\t\t\t\ttypeof v.line === \"number\"\n\t\t\t\t\t\t\t? v.line\n\t\t\t\t\t\t\t: lineStr && /^\\d+$/.test(lineStr)\n\t\t\t\t\t\t\t\t? Number(lineStr)\n\t\t\t\t\t\t\t\t: undefined;\n\t\t\t\t\tconst isValid = isValidViolationLocation(v.file, lineNum, diffRanges);\n\t\t\t\t\treturn isValid;\n\t\t\t\t},\n\t\t\t);\n\n\t\t\tfilteredCount = originalCount - json.violations.length;\n\n\t\t\tif (json.violations.length === 0) {\n\t\t\t\treturn {\n\t\t\t\t\tstatus: \"pass\",\n\t\t\t\t\tmessage: `Passed (${filteredCount} out-of-scope violations filtered)`,\n\t\t\t\t\tjson: { status: \"pass\" },\n\t\t\t\t\tfilteredCount,\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\tconst violationCount = Array.isArray(json.violations)\n\t\t\t? json.violations.length\n\t\t\t: \"some\";\n\n\t\tconst msg = `Found ${violationCount} violations`;\n\n\t\treturn { status: \"fail\", message: msg, json, filteredCount };\n\t}\n\n\tprivate async writeJsonResult(\n\t\tlogPath: string,\n\t\tadapter: string,\n\t\tstatus: \"pass\" | \"fail\" | \"error\",\n\t\trawOutput: string,\n\t\tjson: ReviewJsonOutput,\n\t): Promise<string> {\n\t\tconst jsonPath = logPath.replace(/\\.log$/, \".json\");\n\t\tconst fullOutput: ReviewFullJsonOutput = {\n\t\t\tadapter,\n\t\t\ttimestamp: new Date().toISOString(),\n\t\t\tstatus,\n\t\t\trawOutput,\n\t\t\tviolations: json.violations || [],\n\t\t};\n\n\t\tawait fs.writeFile(jsonPath, JSON.stringify(fullOutput, null, 2));\n\t\treturn jsonPath;\n\t}\n\n\tprivate parseLines(stdout: string): string[] {\n\t\treturn stdout\n\t\t\t.split(\"\\n\")\n\t\t\t.map((line) => line.trim())\n\t\t\t.filter((line) => line.length > 0);\n\t}\n\n\tprivate pathArg(entryPointPath: string): string {\n\t\treturn ` -- ${this.quoteArg(entryPointPath)}`;\n\t}\n\n\tprivate quoteArg(value: string): string {\n\t\treturn `\"${value.replace(/([\"\\\\$`])/g, \"\\\\$1\")}\"`;\n\t}\n}\n",
|
|
17
|
-
"import { type ChildProcess, spawn } from \"node:child_process\";\nimport type { FileHandle } from \"node:fs/promises\";\nimport fs from \"node:fs/promises\";\n\nexport interface CLIAdapterHealth {\n\tavailable: boolean;\n\tstatus: \"healthy\" | \"missing\" | \"unhealthy\";\n\tmessage?: string;\n}\n\n/**\n * Collects stderr from a child process and returns a getter for the accumulated output.\n * Also forwards each chunk to the optional onOutput callback.\n */\nexport function collectStderr(\n\tchild: ChildProcess,\n\tonOutput?: (text: string) => void,\n): () => string {\n\tconst chunks: string[] = [];\n\tchild.stderr?.on(\"data\", (data: Buffer) => {\n\t\tconst text = data.toString();\n\t\tchunks.push(text);\n\t\tonOutput?.(text);\n\t});\n\treturn () => chunks.join(\"\");\n}\n\n/**\n * Builds an Error for a non-zero process exit, including stdout and stderr if available.\n * Both stdout and stderr are included to ensure usage limit messages are captured\n * regardless of which stream the CLI writes them to.\n */\nexport function processExitError(\n\tcode: number | null,\n\tgetStderr: () => string,\n\tgetStdout?: () => string,\n): Error {\n\tconst stderr = getStderr();\n\tconst stdout = getStdout?.() ?? \"\";\n\tconst output = [stdout, stderr].filter(Boolean).join(\"\\n\");\n\treturn new Error(\n\t\t`Process exited with code ${code}${output ? `\\n${output}` : \"\"}`,\n\t);\n}\n\nexport async function runStreamingCommand(opts: {\n\tcommand: string;\n\targs: string[];\n\ttmpFile: string;\n\ttimeoutMs?: number;\n\tonOutput?: (chunk: string) => void;\n\tcleanup: () => Promise<void>;\n\tenv?: NodeJS.ProcessEnv;\n}): Promise<string> {\n\treturn new Promise((resolve, reject) => {\n\t\tconst chunks: string[] = [];\n\t\tconst inputStream = fs.open(opts.tmpFile, \"r\").then((handle) => {\n\t\t\tconst stream = handle.createReadStream();\n\t\t\treturn { stream, handle };\n\t\t});\n\n\t\tinputStream\n\t\t\t.then(({ stream, handle }) => {\n\t\t\t\tconst child = spawn(opts.command, opts.args, {\n\t\t\t\t\tstdio: [\"pipe\", \"pipe\", \"pipe\"],\n\t\t\t\t\tenv: opts.env,\n\t\t\t\t});\n\n\t\t\t\tstream.pipe(child.stdin);\n\n\t\t\t\tlet timeoutId: ReturnType<typeof setTimeout> | undefined;\n\t\t\t\tif (opts.timeoutMs) {\n\t\t\t\t\ttimeoutId = setTimeout(() => {\n\t\t\t\t\t\tchild.kill(\"SIGTERM\");\n\t\t\t\t\t\treject(new Error(\"Command timed out\"));\n\t\t\t\t\t}, opts.timeoutMs);\n\t\t\t\t}\n\n\t\t\t\tchild.stdout.on(\"data\", (data: Buffer) => {\n\t\t\t\t\tconst chunk = data.toString();\n\t\t\t\t\tchunks.push(chunk);\n\t\t\t\t\topts.onOutput?.(chunk);\n\t\t\t\t});\n\n\t\t\t\tconst getStderr = collectStderr(child, opts.onOutput);\n\n\t\t\t\tchild.on(\"close\", (code) => {\n\t\t\t\t\tvoid finalizeProcessClose({\n\t\t\t\t\t\tcode,\n\t\t\t\t\t\ttimeoutId,\n\t\t\t\t\t\thandle,\n\t\t\t\t\t\tcleanup: opts.cleanup,\n\t\t\t\t\t\tchunks,\n\t\t\t\t\t\tgetStderr,\n\t\t\t\t\t\tresolve,\n\t\t\t\t\t\treject,\n\t\t\t\t\t});\n\t\t\t\t});\n\n\t\t\t\tchild.on(\"error\", (err) => {\n\t\t\t\t\tif (timeoutId) clearTimeout(timeoutId);\n\t\t\t\t\thandle.close().catch(() => {});\n\t\t\t\t\topts.cleanup().then(() => reject(err));\n\t\t\t\t});\n\t\t\t})\n\t\t\t.catch((err) => {\n\t\t\t\topts.cleanup().then(() => reject(err));\n\t\t\t});\n\t});\n}\n\nexport async function finalizeProcessClose(opts: {\n\tcode: number | null;\n\ttimeoutId?: ReturnType<typeof setTimeout>;\n\thandle: FileHandle;\n\tcleanup: () => Promise<void>;\n\tchunks: string[];\n\tgetStderr: () => string;\n\tresolve: (value: string) => void;\n\treject: (error: Error) => void;\n}): Promise<void> {\n\tif (opts.timeoutId) clearTimeout(opts.timeoutId);\n\tawait opts.handle.close().catch(() => {});\n\tawait opts.cleanup();\n\n\tif (opts.code === 0 || opts.code === null) {\n\t\topts.resolve(opts.chunks.join(\"\"));\n\t} else {\n\t\topts.reject(\n\t\t\tprocessExitError(opts.code, opts.getStderr, () => opts.chunks.join(\"\")),\n\t\t);\n\t}\n}\n\nexport function isUsageLimit(output: string): boolean {\n\tconst lower = output.toLowerCase();\n\treturn (\n\t\tlower.includes(\"usage limit\") ||\n\t\tlower.includes(\"quota exceeded\") ||\n\t\tlower.includes(\"quota will reset\") ||\n\t\tlower.includes(\"credit balance is too low\") ||\n\t\tlower.includes(\"out of extra usage\") ||\n\t\tlower.includes(\"out of usage\")\n\t);\n}\n\nexport interface CLIAdapter {\n\tname: string;\n\tisAvailable(): Promise<boolean>;\n\tcheckHealth(): Promise<CLIAdapterHealth>;\n\texecute(opts: {\n\t\tprompt: string;\n\t\tdiff: string;\n\t\tmodel?: string;\n\t\ttimeoutMs?: number;\n\t\t/** Optional callback for real-time output streaming */\n\t\tonOutput?: (chunk: string) => void;\n\t\t/** Whether to allow tool use for this adapter. Defaults to true. */\n\t\tallowToolUse?: boolean;\n\t\t/** Thinking budget level (off/low/medium/high). */\n\t\tthinkingBudget?: string;\n\t}): Promise<string>;\n\t/**\n\t * Returns the project-scoped command directory path (relative to project root).\n\t * Returns null if the CLI only supports user-level commands.\n\t */\n\tgetProjectCommandDir(): string | null;\n\t/**\n\t * Returns the user-level command directory path (absolute path).\n\t * Returns null if the CLI doesn't support user-level commands.\n\t */\n\tgetUserCommandDir(): string | null;\n\t/**\n\t * Returns the project-scoped skill directory path (relative to project root).\n\t * Returns null if the CLI doesn't support the skills model.\n\t */\n\tgetProjectSkillDir(): string | null;\n\t/**\n\t * Returns the user-level skill directory path (absolute path).\n\t * Returns null if the CLI doesn't support the skills model.\n\t */\n\tgetUserSkillDir(): string | null;\n\t/**\n\t * Returns the command file extension used by this CLI.\n\t */\n\tgetCommandExtension(): string;\n\t/**\n\t * Returns true if this adapter can use symlinks (same format as source Markdown).\n\t */\n\tcanUseSymlink(): boolean;\n\t/**\n\t * Transforms gauntlet command content to this CLI's format.\n\t * The source content is always Markdown with YAML frontmatter.\n\t */\n\ttransformCommand(markdownContent: string): string;\n}\n\nimport { ClaudeAdapter } from \"./claude.js\";\nimport { CodexAdapter } from \"./codex.js\";\nimport { CursorAdapter } from \"./cursor.js\";\nimport { GeminiAdapter } from \"./gemini.js\";\nimport { GitHubCopilotAdapter } from \"./github-copilot.js\";\n\nexport {\n\tGeminiAdapter,\n\tCodexAdapter,\n\tClaudeAdapter,\n\tGitHubCopilotAdapter,\n\tCursorAdapter,\n};\n\n// Adapter registry: keys should use lowercase with hyphens for multi-word names\nconst adapters: Record<string, CLIAdapter> = {\n\tgemini: new GeminiAdapter(),\n\tcodex: new CodexAdapter(),\n\tclaude: new ClaudeAdapter(),\n\t\"github-copilot\": new GitHubCopilotAdapter(),\n\tcursor: new CursorAdapter(),\n};\n\nexport function getAdapter(name: string): CLIAdapter | undefined {\n\treturn adapters[name];\n}\n\nexport function getAllAdapters(): CLIAdapter[] {\n\treturn Object.values(adapters);\n}\n\n/**\n * Returns all adapters that support project-scoped commands.\n */\nexport function getProjectCommandAdapters(): CLIAdapter[] {\n\treturn Object.values(adapters).filter(\n\t\t(a) => a.getProjectCommandDir() !== null,\n\t);\n}\n\n/**\n * Returns all adapters that support user-level commands.\n */\nexport function getUserCommandAdapters(): CLIAdapter[] {\n\treturn Object.values(adapters).filter((a) => a.getUserCommandDir() !== null);\n}\n\n/**\n * Returns all valid CLI tool names (adapter registry keys).\n */\nexport function getValidCLITools(): string[] {\n\treturn Object.keys(adapters);\n}\n",
|
|
18
|
-
"import { exec } from \"node:child_process\";\nimport fs from \"node:fs/promises\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { promisify } from \"node:util\";\nimport { GAUNTLET_STOP_HOOK_ACTIVE_ENV } from \"../commands/stop-hook.js\";\nimport { getDebugLogger } from \"../utils/debug-log.js\";\nimport { type CLIAdapter, runStreamingCommand } from \"./index.js\";\nimport { CLAUDE_THINKING_TOKENS } from \"./thinking-budget.js\";\n\nconst execAsync = promisify(exec);\nconst MAX_BUFFER_BYTES = 10 * 1024 * 1024;\n\n// Matches OTel console exporter metric blocks dumped to stdout at process exit.\n// Requires `descriptor`, `dataPointType`, and `dataPoints` fields which are\n// unique to OTel SDK output and won't appear in normal code review content.\n// Optionally matches [otel] prefix that some exporters add.\nconst OTEL_METRIC_BLOCK_RE =\n\t/(?:\\[otel\\]\\s*)?\\{\\s*\\n\\s*descriptor:\\s*\\{[\\s\\S]*?dataPointType:\\s*\\d+[\\s\\S]*?dataPoints:\\s*\\[[\\s\\S]*?\\]\\s*,?\\s*\\n\\}/g;\n\ninterface OtelUsage {\n\tcost?: number;\n\tinput?: number;\n\toutput?: number;\n\tcacheRead?: number;\n\tcacheCreation?: number;\n\ttoolCalls?: number;\n\ttoolContentBytes?: number;\n\tapiRequests?: number;\n}\n\nconst TOKEN_TYPES = [\"input\", \"output\", \"cacheRead\", \"cacheCreation\"] as const;\n\nfunction parseCostBlock(block: string): number | undefined {\n\tconst match = block.match(/value:\\s*([\\d.]+)/);\n\treturn match?.[1] ? Number.parseFloat(match[1]) : undefined;\n}\n\nfunction parseTokenBlock(block: string): Partial<OtelUsage> {\n\tconst result: Partial<OtelUsage> = {};\n\tconst re = /type:\\s*\"(\\w+)\"[\\s\\S]*?value:\\s*(\\d+)(?:,|\\s*\\})/g;\n\tfor (const match of block.matchAll(re)) {\n\t\tconst type = match[1] as (typeof TOKEN_TYPES)[number] | undefined;\n\t\tconst value = match[2];\n\t\tif (!type || !value) continue;\n\t\tif (TOKEN_TYPES.includes(type)) {\n\t\t\tresult[type] = Number.parseInt(value, 10);\n\t\t}\n\t}\n\treturn result;\n}\n\nfunction parseOtelMetrics(blocks: string[]): OtelUsage {\n\tconst usage: OtelUsage = {};\n\tfor (const block of blocks) {\n\t\tconst nameMatch = block.match(/name:\\s*\"([^\"]+)\"/);\n\t\tif (!nameMatch) continue;\n\n\t\tif (nameMatch[1] === \"claude_code.cost.usage\") {\n\t\t\tusage.cost = parseCostBlock(block);\n\t\t} else if (nameMatch[1] === \"claude_code.token.usage\") {\n\t\t\tObject.assign(usage, parseTokenBlock(block));\n\t\t}\n\t}\n\treturn usage;\n}\n\n// Matches OTel console log exporter event records emitted by Claude Code.\n// The Node.js SDK console exporter uses util.inspect() format with unquoted keys\n// and single-quoted strings. Blocks start with `resource:` and contain a `body:`\n// field with the event name (e.g. 'claude_code.tool_result').\nconst OTEL_LOG_BLOCK_RE =\n\t/\\{\\s*\\n\\s*resource:\\s*\\{[\\s\\S]*?body:\\s*'claude_code\\.\\w+'[\\s\\S]*?\\n\\}/g;\n\n/** Pre-compiled regexes for extracting single-quoted attribute values from OTel log blocks. */\nconst OTEL_ATTR_RE = {\n\tbody: /body:\\s*'([^']*)'/,\n\ttool_result_size_bytes: /tool_result_size_bytes:\\s*'([^']*)'/,\n\tinput_tokens: /input_tokens:\\s*'([^']*)'/,\n\toutput_tokens: /output_tokens:\\s*'([^']*)'/,\n\tcache_read_tokens: /cache_read_tokens:\\s*'([^']*)'/,\n\tcache_creation_tokens: /cache_creation_tokens:\\s*'([^']*)'/,\n\tcost_usd: /cost_usd:\\s*'([^']*)'/,\n} as const;\n\n/** Maps OTel api_request attribute regexes to OtelUsage fields. */\nconst API_REQUEST_FIELDS: Array<[RegExp, keyof OtelUsage]> = [\n\t[OTEL_ATTR_RE.input_tokens, \"input\"],\n\t[OTEL_ATTR_RE.output_tokens, \"output\"],\n\t[OTEL_ATTR_RE.cache_read_tokens, \"cacheRead\"],\n\t[OTEL_ATTR_RE.cache_creation_tokens, \"cacheCreation\"],\n\t[OTEL_ATTR_RE.cost_usd, \"cost\"],\n];\n\n/** Accumulate a tool_result log block into usage. */\nfunction accumulateToolResult(block: string, usage: OtelUsage): void {\n\tusage.toolCalls = (usage.toolCalls || 0) + 1;\n\tconst bytes = block.match(OTEL_ATTR_RE.tool_result_size_bytes)?.[1];\n\tif (bytes !== undefined) {\n\t\tusage.toolContentBytes = (usage.toolContentBytes || 0) + Number(bytes);\n\t}\n}\n\n/** Accumulate an api_request log block into usage. */\nfunction accumulateApiRequest(block: string, usage: OtelUsage): void {\n\tusage.apiRequests = (usage.apiRequests || 0) + 1;\n\tfor (const [re, field] of API_REQUEST_FIELDS) {\n\t\tconst val = block.match(re)?.[1];\n\t\tif (val !== undefined) {\n\t\t\tusage[field] = (usage[field] || 0) + Number(val);\n\t\t}\n\t}\n}\n\n/** Accumulate tool_result and api_request event data from OTel log blocks. */\nfunction parseOtelLogEvents(raw: string, usage: OtelUsage): void {\n\tconst blocks = raw.match(OTEL_LOG_BLOCK_RE);\n\tif (!blocks) return;\n\tfor (const block of blocks) {\n\t\tconst body = block.match(OTEL_ATTR_RE.body)?.[1];\n\t\tif (body === \"claude_code.tool_result\") {\n\t\t\taccumulateToolResult(block, usage);\n\t\t} else if (body === \"claude_code.api_request\") {\n\t\t\taccumulateApiRequest(block, usage);\n\t\t}\n\t}\n}\n\nconst OTEL_SUMMARY_FIELDS: Array<[keyof OtelUsage, string]> = [\n\t[\"input\", \"in\"],\n\t[\"output\", \"out\"],\n\t[\"cacheRead\", \"cacheRead\"],\n\t[\"cacheCreation\", \"cacheWrite\"],\n\t[\"toolCalls\", \"tool_calls\"],\n\t[\"toolContentBytes\", \"tool_content_bytes\"],\n\t[\"apiRequests\", \"api_requests\"],\n];\n\nfunction formatOtelSummary(usage: OtelUsage): string | null {\n\tif (usage.cost === undefined && usage.input === undefined) return null;\n\n\tconst parts: string[] = [];\n\tif (usage.cost !== undefined) parts.push(`cost=$${usage.cost.toFixed(4)}`);\n\tfor (const [key, label] of OTEL_SUMMARY_FIELDS) {\n\t\tif (usage[key] !== undefined) parts.push(`${label}=${usage[key]}`);\n\t}\n\n\treturn `[otel] ${parts.join(\" \")}`;\n}\n\nfunction extractOtelMetrics(\n\traw: string,\n\tonLog?: (msg: string) => void,\n): string {\n\tconst metricBlocks = raw.match(OTEL_METRIC_BLOCK_RE);\n\tconst usage = metricBlocks ? parseOtelMetrics(metricBlocks) : {};\n\n\t// Also parse log events for tool call and API request counts\n\tparseOtelLogEvents(raw, usage);\n\n\tconst summary = formatOtelSummary(usage);\n\tif (summary) {\n\t\tonLog?.(`\\n${summary}\\n`);\n\t\tprocess.stderr.write(`${summary}\\n`);\n\t\tgetDebugLogger()?.logTelemetry({ adapter: \"claude\", summary });\n\t}\n\n\treturn raw\n\t\t.replace(OTEL_METRIC_BLOCK_RE, \"\")\n\t\t.replace(OTEL_LOG_BLOCK_RE, \"\")\n\t\t.trimEnd();\n}\n\n/** Build OTel environment overrides for console export. */\nfunction buildOtelEnv(): Record<string, string> {\n\tconst env: Record<string, string> = {};\n\tif (!process.env.CLAUDE_CODE_ENABLE_TELEMETRY) {\n\t\tenv.CLAUDE_CODE_ENABLE_TELEMETRY = \"1\";\n\t}\n\tif (!process.env.OTEL_METRICS_EXPORTER) {\n\t\tenv.OTEL_METRICS_EXPORTER = \"console\";\n\t}\n\tif (!process.env.OTEL_LOGS_EXPORTER) {\n\t\tenv.OTEL_LOGS_EXPORTER = \"console\";\n\t}\n\treturn env;\n}\n\n/** Strip OTel metric and log blocks from raw output. */\nfunction stripOtelBlocks(raw: string): string {\n\treturn raw\n\t\t.replace(OTEL_METRIC_BLOCK_RE, \"\")\n\t\t.replace(OTEL_LOG_BLOCK_RE, \"\")\n\t\t.trimEnd();\n}\n\nexport class ClaudeAdapter implements CLIAdapter {\n\tname = \"claude\";\n\n\tasync isAvailable(): Promise<boolean> {\n\t\ttry {\n\t\t\tawait execAsync(\"which claude\");\n\t\t\treturn true;\n\t\t} catch {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tasync checkHealth(): Promise<{\n\t\tavailable: boolean;\n\t\tstatus: \"healthy\" | \"missing\" | \"unhealthy\";\n\t\tmessage?: string;\n\t}> {\n\t\tconst available = await this.isAvailable();\n\t\tif (!available) {\n\t\t\treturn {\n\t\t\t\tavailable: false,\n\t\t\t\tstatus: \"missing\",\n\t\t\t\tmessage: \"Command not found\",\n\t\t\t};\n\t\t}\n\n\t\treturn { available: true, status: \"healthy\", message: \"Ready\" };\n\t}\n\n\tgetProjectCommandDir(): string | null {\n\t\treturn \".claude/commands\";\n\t}\n\n\tgetUserCommandDir(): string | null {\n\t\treturn path.join(os.homedir(), \".claude\", \"commands\");\n\t}\n\n\tgetProjectSkillDir(): string | null {\n\t\treturn \".claude/skills\";\n\t}\n\n\tgetUserSkillDir(): string | null {\n\t\treturn path.join(os.homedir(), \".claude\", \"skills\");\n\t}\n\n\tgetCommandExtension(): string {\n\t\treturn \".md\";\n\t}\n\n\tcanUseSymlink(): boolean {\n\t\treturn true;\n\t}\n\n\ttransformCommand(markdownContent: string): string {\n\t\treturn markdownContent;\n\t}\n\n\tasync execute(opts: {\n\t\tprompt: string;\n\t\tdiff: string;\n\t\tmodel?: string;\n\t\ttimeoutMs?: number;\n\t\tonOutput?: (chunk: string) => void;\n\t\tallowToolUse?: boolean;\n\t\tthinkingBudget?: string;\n\t}): Promise<string> {\n\t\tconst fullContent = `${opts.prompt}\\n\\n--- DIFF ---\\n${opts.diff}`;\n\n\t\tconst tmpDir = os.tmpdir();\n\t\tconst tmpFile = path.join(\n\t\t\ttmpDir,\n\t\t\t`gauntlet-claude-${process.pid}-${Date.now()}.txt`,\n\t\t);\n\t\tawait fs.writeFile(tmpFile, fullContent);\n\n\t\tconst args = [\"-p\"];\n\t\tif (opts.allowToolUse === false) {\n\t\t\targs.push(\"--tools\", \"\");\n\t\t} else {\n\t\t\targs.push(\"--allowedTools\", \"Read,Glob,Grep\");\n\t\t}\n\t\targs.push(\"--max-turns\", \"10\");\n\n\t\tconst otelEnv = buildOtelEnv();\n\t\tconst thinkingEnv: Record<string, string> = {};\n\t\tif (opts.thinkingBudget && opts.thinkingBudget in CLAUDE_THINKING_TOKENS) {\n\t\t\tthinkingEnv.MAX_THINKING_TOKENS = String(\n\t\t\t\tCLAUDE_THINKING_TOKENS[opts.thinkingBudget],\n\t\t\t);\n\t\t}\n\n\t\tconst cleanup = () => fs.unlink(tmpFile).catch(() => {});\n\t\tconst execEnv = {\n\t\t\t...process.env,\n\t\t\t[GAUNTLET_STOP_HOOK_ACTIVE_ENV]: \"1\",\n\t\t\t...otelEnv,\n\t\t\t...thinkingEnv,\n\t\t};\n\n\t\tif (opts.onOutput) {\n\t\t\tconst outputBuffer: string[] = [];\n\t\t\tconst raw = await runStreamingCommand({\n\t\t\t\tcommand: \"claude\",\n\t\t\t\targs,\n\t\t\t\ttmpFile,\n\t\t\t\ttimeoutMs: opts.timeoutMs,\n\t\t\t\tonOutput: (chunk: string) => {\n\t\t\t\t\toutputBuffer.push(chunk);\n\t\t\t\t},\n\t\t\t\tcleanup,\n\t\t\t\tenv: execEnv,\n\t\t\t});\n\t\t\tconst cleanedOutput = extractOtelMetrics(\n\t\t\t\toutputBuffer.join(\"\"),\n\t\t\t\topts.onOutput,\n\t\t\t);\n\t\t\topts.onOutput(cleanedOutput);\n\t\t\treturn stripOtelBlocks(raw);\n\t\t}\n\n\t\ttry {\n\t\t\tconst cmd = `cat \"${tmpFile}\" | claude ${args.map((a) => (a === \"\" ? '\"\"' : a)).join(\" \")}`;\n\t\t\tconst { stdout } = await execAsync(cmd, {\n\t\t\t\ttimeout: opts.timeoutMs,\n\t\t\t\tmaxBuffer: MAX_BUFFER_BYTES,\n\t\t\t\tenv: execEnv,\n\t\t\t});\n\t\t\treturn extractOtelMetrics(stdout);\n\t\t} finally {\n\t\t\tawait cleanup();\n\t\t}\n\t}\n}\n",
|
|
17
|
+
"import { type ChildProcess, spawn } from \"node:child_process\";\nimport type { FileHandle } from \"node:fs/promises\";\nimport fs from \"node:fs/promises\";\n\nexport interface CLIAdapterHealth {\n\tavailable: boolean;\n\tstatus: \"healthy\" | \"missing\" | \"unhealthy\";\n\tmessage?: string;\n}\n\n/**\n * Collects stderr from a child process and returns a getter for the accumulated output.\n * Also forwards each chunk to the optional onOutput callback.\n */\nexport function collectStderr(\n\tchild: ChildProcess,\n\tonOutput?: (text: string) => void,\n): () => string {\n\tconst chunks: string[] = [];\n\tchild.stderr?.on(\"data\", (data: Buffer) => {\n\t\tconst text = data.toString();\n\t\tchunks.push(text);\n\t\tonOutput?.(text);\n\t});\n\treturn () => chunks.join(\"\");\n}\n\n/**\n * Builds an Error for a non-zero process exit, including stdout and stderr if available.\n * Both stdout and stderr are included to ensure usage limit messages are captured\n * regardless of which stream the CLI writes them to.\n */\nexport function processExitError(\n\tcode: number | null,\n\tgetStderr: () => string,\n\tgetStdout?: () => string,\n): Error {\n\tconst stderr = getStderr();\n\tconst stdout = getStdout?.() ?? \"\";\n\tconst output = [stdout, stderr].filter(Boolean).join(\"\\n\");\n\treturn new Error(\n\t\t`Process exited with code ${code}${output ? `\\n${output}` : \"\"}`,\n\t);\n}\n\nexport async function runStreamingCommand(opts: {\n\tcommand: string;\n\targs: string[];\n\ttmpFile: string;\n\ttimeoutMs?: number;\n\tonOutput?: (chunk: string) => void;\n\tcleanup: () => Promise<void>;\n\tenv?: NodeJS.ProcessEnv;\n}): Promise<string> {\n\treturn new Promise((resolve, reject) => {\n\t\tconst chunks: string[] = [];\n\t\tconst inputStream = fs.open(opts.tmpFile, \"r\").then((handle) => {\n\t\t\tconst stream = handle.createReadStream();\n\t\t\treturn { stream, handle };\n\t\t});\n\n\t\tinputStream\n\t\t\t.then(({ stream, handle }) => {\n\t\t\t\tconst child = spawn(opts.command, opts.args, {\n\t\t\t\t\tstdio: [\"pipe\", \"pipe\", \"pipe\"],\n\t\t\t\t\tenv: opts.env,\n\t\t\t\t});\n\n\t\t\t\tstream.pipe(child.stdin);\n\n\t\t\t\tlet timeoutId: ReturnType<typeof setTimeout> | undefined;\n\t\t\t\tif (opts.timeoutMs) {\n\t\t\t\t\ttimeoutId = setTimeout(() => {\n\t\t\t\t\t\tchild.kill(\"SIGTERM\");\n\t\t\t\t\t\treject(new Error(\"Command timed out\"));\n\t\t\t\t\t}, opts.timeoutMs);\n\t\t\t\t}\n\n\t\t\t\tchild.stdout.on(\"data\", (data: Buffer) => {\n\t\t\t\t\tconst chunk = data.toString();\n\t\t\t\t\tchunks.push(chunk);\n\t\t\t\t\topts.onOutput?.(chunk);\n\t\t\t\t});\n\n\t\t\t\tconst getStderr = collectStderr(child, opts.onOutput);\n\n\t\t\t\tchild.on(\"close\", (code) => {\n\t\t\t\t\tvoid finalizeProcessClose({\n\t\t\t\t\t\tcode,\n\t\t\t\t\t\ttimeoutId,\n\t\t\t\t\t\thandle,\n\t\t\t\t\t\tcleanup: opts.cleanup,\n\t\t\t\t\t\tchunks,\n\t\t\t\t\t\tgetStderr,\n\t\t\t\t\t\tresolve,\n\t\t\t\t\t\treject,\n\t\t\t\t\t});\n\t\t\t\t});\n\n\t\t\t\tchild.on(\"error\", (err) => {\n\t\t\t\t\tif (timeoutId) clearTimeout(timeoutId);\n\t\t\t\t\thandle.close().catch(() => {});\n\t\t\t\t\topts.cleanup().then(() => reject(err));\n\t\t\t\t});\n\t\t\t})\n\t\t\t.catch((err) => {\n\t\t\t\topts.cleanup().then(() => reject(err));\n\t\t\t});\n\t});\n}\n\nexport async function finalizeProcessClose(opts: {\n\tcode: number | null;\n\ttimeoutId?: ReturnType<typeof setTimeout>;\n\thandle: FileHandle;\n\tcleanup: () => Promise<void>;\n\tchunks: string[];\n\tgetStderr: () => string;\n\tresolve: (value: string) => void;\n\treject: (error: Error) => void;\n}): Promise<void> {\n\tif (opts.timeoutId) clearTimeout(opts.timeoutId);\n\tawait opts.handle.close().catch(() => {});\n\tawait opts.cleanup();\n\n\tif (opts.code === 0 || opts.code === null) {\n\t\topts.resolve(opts.chunks.join(\"\"));\n\t} else {\n\t\topts.reject(\n\t\t\tprocessExitError(opts.code, opts.getStderr, () => opts.chunks.join(\"\")),\n\t\t);\n\t}\n}\n\nexport function isUsageLimit(output: string): boolean {\n\tconst lower = output.toLowerCase();\n\treturn (\n\t\tlower.includes(\"usage limit\") ||\n\t\tlower.includes(\"quota exceeded\") ||\n\t\tlower.includes(\"quota will reset\") ||\n\t\tlower.includes(\"credit balance is too low\") ||\n\t\tlower.includes(\"out of extra usage\") ||\n\t\tlower.includes(\"out of usage\")\n\t);\n}\n\nexport interface CLIAdapter {\n\tname: string;\n\tisAvailable(): Promise<boolean>;\n\tcheckHealth(): Promise<CLIAdapterHealth>;\n\texecute(opts: {\n\t\tprompt: string;\n\t\tdiff: string;\n\t\tmodel?: string;\n\t\ttimeoutMs?: number;\n\t\t/** Optional callback for real-time output streaming */\n\t\tonOutput?: (chunk: string) => void;\n\t\t/** Whether to allow tool use for this adapter. Defaults to true. */\n\t\tallowToolUse?: boolean;\n\t\t/** Thinking budget level (off/low/medium/high). */\n\t\tthinkingBudget?: string;\n\t}): Promise<string>;\n\t/**\n\t * Returns the project-scoped command directory path (relative to project root).\n\t * Returns null if the CLI only supports user-level commands.\n\t */\n\tgetProjectCommandDir(): string | null;\n\t/**\n\t * Returns the user-level command directory path (absolute path).\n\t * Returns null if the CLI doesn't support user-level commands.\n\t */\n\tgetUserCommandDir(): string | null;\n\t/**\n\t * Returns the project-scoped skill directory path (relative to project root).\n\t * Returns null if the CLI doesn't support the skills model.\n\t */\n\tgetProjectSkillDir(): string | null;\n\t/**\n\t * Returns the user-level skill directory path (absolute path).\n\t * Returns null if the CLI doesn't support the skills model.\n\t */\n\tgetUserSkillDir(): string | null;\n\t/**\n\t * Returns the command file extension used by this CLI.\n\t */\n\tgetCommandExtension(): string;\n\t/**\n\t * Returns true if this adapter can use symlinks (same format as source Markdown).\n\t */\n\tcanUseSymlink(): boolean;\n\t/**\n\t * Transforms gauntlet command content to this CLI's format.\n\t * The source content is always Markdown with YAML frontmatter.\n\t */\n\ttransformCommand(markdownContent: string): string;\n\t/**\n\t * Returns true if this CLI supports hooks (stop hook, start hook).\n\t */\n\tsupportsHooks(): boolean;\n}\n\nimport { ClaudeAdapter } from \"./claude.js\";\nimport { CodexAdapter } from \"./codex.js\";\nimport { CursorAdapter } from \"./cursor.js\";\nimport { GeminiAdapter } from \"./gemini.js\";\nimport { GitHubCopilotAdapter } from \"./github-copilot.js\";\n\nexport {\n\tGeminiAdapter,\n\tCodexAdapter,\n\tClaudeAdapter,\n\tGitHubCopilotAdapter,\n\tCursorAdapter,\n};\n\n// Adapter registry: keys should use lowercase with hyphens for multi-word names\nconst adapters: Record<string, CLIAdapter> = {\n\tgemini: new GeminiAdapter(),\n\tcodex: new CodexAdapter(),\n\tclaude: new ClaudeAdapter(),\n\t\"github-copilot\": new GitHubCopilotAdapter(),\n\tcursor: new CursorAdapter(),\n};\n\nexport function getAdapter(name: string): CLIAdapter | undefined {\n\treturn adapters[name];\n}\n\nexport function getAllAdapters(): CLIAdapter[] {\n\treturn Object.values(adapters);\n}\n\n/**\n * Returns all adapters that support project-scoped commands.\n */\nexport function getProjectCommandAdapters(): CLIAdapter[] {\n\treturn Object.values(adapters).filter(\n\t\t(a) => a.getProjectCommandDir() !== null,\n\t);\n}\n\n/**\n * Returns all adapters that support user-level commands.\n */\nexport function getUserCommandAdapters(): CLIAdapter[] {\n\treturn Object.values(adapters).filter((a) => a.getUserCommandDir() !== null);\n}\n\n/**\n * Returns all valid CLI tool names (adapter registry keys).\n */\nexport function getValidCLITools(): string[] {\n\treturn Object.keys(adapters);\n}\n",
|
|
18
|
+
"import { exec } from \"node:child_process\";\nimport fs from \"node:fs/promises\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { promisify } from \"node:util\";\nimport { GAUNTLET_STOP_HOOK_ACTIVE_ENV } from \"../commands/stop-hook.js\";\nimport { getDebugLogger } from \"../utils/debug-log.js\";\nimport { type CLIAdapter, runStreamingCommand } from \"./index.js\";\nimport { CLAUDE_THINKING_TOKENS } from \"./thinking-budget.js\";\n\nconst execAsync = promisify(exec);\nconst MAX_BUFFER_BYTES = 10 * 1024 * 1024;\n\n// Matches OTel console exporter metric blocks dumped to stdout at process exit.\n// Requires `descriptor`, `dataPointType`, and `dataPoints` fields which are\n// unique to OTel SDK output and won't appear in normal code review content.\n// Optionally matches [otel] prefix that some exporters add.\nconst OTEL_METRIC_BLOCK_RE =\n\t/(?:\\[otel\\]\\s*)?\\{\\s*\\n\\s*descriptor:\\s*\\{[\\s\\S]*?dataPointType:\\s*\\d+[\\s\\S]*?dataPoints:\\s*\\[[\\s\\S]*?\\]\\s*,?\\s*\\n\\}/g;\n\ninterface OtelUsage {\n\tcost?: number;\n\tinput?: number;\n\toutput?: number;\n\tcacheRead?: number;\n\tcacheCreation?: number;\n\ttoolCalls?: number;\n\ttoolContentBytes?: number;\n\tapiRequests?: number;\n}\n\nconst TOKEN_TYPES = [\"input\", \"output\", \"cacheRead\", \"cacheCreation\"] as const;\n\nfunction parseCostBlock(block: string): number | undefined {\n\tconst match = block.match(/value:\\s*([\\d.]+)/);\n\treturn match?.[1] ? Number.parseFloat(match[1]) : undefined;\n}\n\nfunction parseTokenBlock(block: string): Partial<OtelUsage> {\n\tconst result: Partial<OtelUsage> = {};\n\tconst re = /type:\\s*\"(\\w+)\"[\\s\\S]*?value:\\s*(\\d+)(?:,|\\s*\\})/g;\n\tfor (const match of block.matchAll(re)) {\n\t\tconst type = match[1] as (typeof TOKEN_TYPES)[number] | undefined;\n\t\tconst value = match[2];\n\t\tif (!type || !value) continue;\n\t\tif (TOKEN_TYPES.includes(type)) {\n\t\t\tresult[type] = Number.parseInt(value, 10);\n\t\t}\n\t}\n\treturn result;\n}\n\nfunction parseOtelMetrics(blocks: string[]): OtelUsage {\n\tconst usage: OtelUsage = {};\n\tfor (const block of blocks) {\n\t\tconst nameMatch = block.match(/name:\\s*\"([^\"]+)\"/);\n\t\tif (!nameMatch) continue;\n\n\t\tif (nameMatch[1] === \"claude_code.cost.usage\") {\n\t\t\tusage.cost = parseCostBlock(block);\n\t\t} else if (nameMatch[1] === \"claude_code.token.usage\") {\n\t\t\tObject.assign(usage, parseTokenBlock(block));\n\t\t}\n\t}\n\treturn usage;\n}\n\n// Matches OTel console log exporter event records emitted by Claude Code.\n// The Node.js SDK console exporter uses util.inspect() format with unquoted keys\n// and single-quoted strings. Blocks start with `resource:` and contain a `body:`\n// field with the event name (e.g. 'claude_code.tool_result').\nconst OTEL_LOG_BLOCK_RE =\n\t/\\{\\s*\\n\\s*resource:\\s*\\{[\\s\\S]*?body:\\s*'claude_code\\.\\w+'[\\s\\S]*?\\n\\}/g;\n\n/** Pre-compiled regexes for extracting single-quoted attribute values from OTel log blocks. */\nconst OTEL_ATTR_RE = {\n\tbody: /body:\\s*'([^']*)'/,\n\ttool_result_size_bytes: /tool_result_size_bytes:\\s*'([^']*)'/,\n\tinput_tokens: /input_tokens:\\s*'([^']*)'/,\n\toutput_tokens: /output_tokens:\\s*'([^']*)'/,\n\tcache_read_tokens: /cache_read_tokens:\\s*'([^']*)'/,\n\tcache_creation_tokens: /cache_creation_tokens:\\s*'([^']*)'/,\n\tcost_usd: /cost_usd:\\s*'([^']*)'/,\n} as const;\n\n/** Maps OTel api_request attribute regexes to OtelUsage fields. */\nconst API_REQUEST_FIELDS: Array<[RegExp, keyof OtelUsage]> = [\n\t[OTEL_ATTR_RE.input_tokens, \"input\"],\n\t[OTEL_ATTR_RE.output_tokens, \"output\"],\n\t[OTEL_ATTR_RE.cache_read_tokens, \"cacheRead\"],\n\t[OTEL_ATTR_RE.cache_creation_tokens, \"cacheCreation\"],\n\t[OTEL_ATTR_RE.cost_usd, \"cost\"],\n];\n\n/** Accumulate a tool_result log block into usage. */\nfunction accumulateToolResult(block: string, usage: OtelUsage): void {\n\tusage.toolCalls = (usage.toolCalls || 0) + 1;\n\tconst bytes = block.match(OTEL_ATTR_RE.tool_result_size_bytes)?.[1];\n\tif (bytes !== undefined) {\n\t\tusage.toolContentBytes = (usage.toolContentBytes || 0) + Number(bytes);\n\t}\n}\n\n/** Accumulate an api_request log block into usage. */\nfunction accumulateApiRequest(block: string, usage: OtelUsage): void {\n\tusage.apiRequests = (usage.apiRequests || 0) + 1;\n\tfor (const [re, field] of API_REQUEST_FIELDS) {\n\t\tconst val = block.match(re)?.[1];\n\t\tif (val !== undefined) {\n\t\t\tusage[field] = (usage[field] || 0) + Number(val);\n\t\t}\n\t}\n}\n\n/** Accumulate tool_result and api_request event data from OTel log blocks. */\nfunction parseOtelLogEvents(raw: string, usage: OtelUsage): void {\n\tconst blocks = raw.match(OTEL_LOG_BLOCK_RE);\n\tif (!blocks) return;\n\tfor (const block of blocks) {\n\t\tconst body = block.match(OTEL_ATTR_RE.body)?.[1];\n\t\tif (body === \"claude_code.tool_result\") {\n\t\t\taccumulateToolResult(block, usage);\n\t\t} else if (body === \"claude_code.api_request\") {\n\t\t\taccumulateApiRequest(block, usage);\n\t\t}\n\t}\n}\n\nconst OTEL_SUMMARY_FIELDS: Array<[keyof OtelUsage, string]> = [\n\t[\"input\", \"in\"],\n\t[\"output\", \"out\"],\n\t[\"cacheRead\", \"cacheRead\"],\n\t[\"cacheCreation\", \"cacheWrite\"],\n\t[\"toolCalls\", \"tool_calls\"],\n\t[\"toolContentBytes\", \"tool_content_bytes\"],\n\t[\"apiRequests\", \"api_requests\"],\n];\n\nfunction formatOtelSummary(usage: OtelUsage): string | null {\n\tif (usage.cost === undefined && usage.input === undefined) return null;\n\n\tconst parts: string[] = [];\n\tif (usage.cost !== undefined) parts.push(`cost=$${usage.cost.toFixed(4)}`);\n\tfor (const [key, label] of OTEL_SUMMARY_FIELDS) {\n\t\tif (usage[key] !== undefined) parts.push(`${label}=${usage[key]}`);\n\t}\n\n\treturn `[otel] ${parts.join(\" \")}`;\n}\n\nfunction extractOtelMetrics(\n\traw: string,\n\tonLog?: (msg: string) => void,\n): string {\n\tconst metricBlocks = raw.match(OTEL_METRIC_BLOCK_RE);\n\tconst usage = metricBlocks ? parseOtelMetrics(metricBlocks) : {};\n\n\t// Also parse log events for tool call and API request counts\n\tparseOtelLogEvents(raw, usage);\n\n\tconst summary = formatOtelSummary(usage);\n\tif (summary) {\n\t\tonLog?.(`\\n${summary}\\n`);\n\t\tprocess.stderr.write(`${summary}\\n`);\n\t\tgetDebugLogger()?.logTelemetry({ adapter: \"claude\", summary });\n\t}\n\n\treturn raw\n\t\t.replace(OTEL_METRIC_BLOCK_RE, \"\")\n\t\t.replace(OTEL_LOG_BLOCK_RE, \"\")\n\t\t.trimEnd();\n}\n\n/** Build OTel environment overrides for console export. */\nfunction buildOtelEnv(): Record<string, string> {\n\tconst env: Record<string, string> = {};\n\tif (!process.env.CLAUDE_CODE_ENABLE_TELEMETRY) {\n\t\tenv.CLAUDE_CODE_ENABLE_TELEMETRY = \"1\";\n\t}\n\tif (!process.env.OTEL_METRICS_EXPORTER) {\n\t\tenv.OTEL_METRICS_EXPORTER = \"console\";\n\t}\n\tif (!process.env.OTEL_LOGS_EXPORTER) {\n\t\tenv.OTEL_LOGS_EXPORTER = \"console\";\n\t}\n\treturn env;\n}\n\n/** Strip OTel metric and log blocks from raw output. */\nfunction stripOtelBlocks(raw: string): string {\n\treturn raw\n\t\t.replace(OTEL_METRIC_BLOCK_RE, \"\")\n\t\t.replace(OTEL_LOG_BLOCK_RE, \"\")\n\t\t.trimEnd();\n}\n\nexport class ClaudeAdapter implements CLIAdapter {\n\tname = \"claude\";\n\n\tasync isAvailable(): Promise<boolean> {\n\t\ttry {\n\t\t\tawait execAsync(\"which claude\");\n\t\t\treturn true;\n\t\t} catch {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tasync checkHealth(): Promise<{\n\t\tavailable: boolean;\n\t\tstatus: \"healthy\" | \"missing\" | \"unhealthy\";\n\t\tmessage?: string;\n\t}> {\n\t\tconst available = await this.isAvailable();\n\t\tif (!available) {\n\t\t\treturn {\n\t\t\t\tavailable: false,\n\t\t\t\tstatus: \"missing\",\n\t\t\t\tmessage: \"Command not found\",\n\t\t\t};\n\t\t}\n\n\t\treturn { available: true, status: \"healthy\", message: \"Ready\" };\n\t}\n\n\tgetProjectCommandDir(): string | null {\n\t\treturn \".claude/commands\";\n\t}\n\n\tgetUserCommandDir(): string | null {\n\t\treturn path.join(os.homedir(), \".claude\", \"commands\");\n\t}\n\n\tgetProjectSkillDir(): string | null {\n\t\treturn \".claude/skills\";\n\t}\n\n\tgetUserSkillDir(): string | null {\n\t\treturn path.join(os.homedir(), \".claude\", \"skills\");\n\t}\n\n\tgetCommandExtension(): string {\n\t\treturn \".md\";\n\t}\n\n\tcanUseSymlink(): boolean {\n\t\treturn true;\n\t}\n\n\ttransformCommand(markdownContent: string): string {\n\t\treturn markdownContent;\n\t}\n\n\tsupportsHooks(): boolean {\n\t\treturn true;\n\t}\n\n\tasync execute(opts: {\n\t\tprompt: string;\n\t\tdiff: string;\n\t\tmodel?: string;\n\t\ttimeoutMs?: number;\n\t\tonOutput?: (chunk: string) => void;\n\t\tallowToolUse?: boolean;\n\t\tthinkingBudget?: string;\n\t}): Promise<string> {\n\t\tconst fullContent = `${opts.prompt}\\n\\n--- DIFF ---\\n${opts.diff}`;\n\n\t\tconst tmpDir = os.tmpdir();\n\t\tconst tmpFile = path.join(\n\t\t\ttmpDir,\n\t\t\t`gauntlet-claude-${process.pid}-${Date.now()}.txt`,\n\t\t);\n\t\tawait fs.writeFile(tmpFile, fullContent);\n\n\t\tconst args = [\"-p\"];\n\t\tif (opts.allowToolUse === false) {\n\t\t\targs.push(\"--tools\", \"\");\n\t\t} else {\n\t\t\targs.push(\"--allowedTools\", \"Read,Glob,Grep\");\n\t\t}\n\t\targs.push(\"--max-turns\", \"10\");\n\n\t\tconst otelEnv = buildOtelEnv();\n\t\tconst thinkingEnv: Record<string, string> = {};\n\t\tif (opts.thinkingBudget && opts.thinkingBudget in CLAUDE_THINKING_TOKENS) {\n\t\t\tthinkingEnv.MAX_THINKING_TOKENS = String(\n\t\t\t\tCLAUDE_THINKING_TOKENS[opts.thinkingBudget],\n\t\t\t);\n\t\t}\n\n\t\tconst cleanup = () => fs.unlink(tmpFile).catch(() => {});\n\t\tconst execEnv = {\n\t\t\t...process.env,\n\t\t\t[GAUNTLET_STOP_HOOK_ACTIVE_ENV]: \"1\",\n\t\t\t...otelEnv,\n\t\t\t...thinkingEnv,\n\t\t};\n\n\t\tif (opts.onOutput) {\n\t\t\tconst outputBuffer: string[] = [];\n\t\t\tconst raw = await runStreamingCommand({\n\t\t\t\tcommand: \"claude\",\n\t\t\t\targs,\n\t\t\t\ttmpFile,\n\t\t\t\ttimeoutMs: opts.timeoutMs,\n\t\t\t\tonOutput: (chunk: string) => {\n\t\t\t\t\toutputBuffer.push(chunk);\n\t\t\t\t},\n\t\t\t\tcleanup,\n\t\t\t\tenv: execEnv,\n\t\t\t});\n\t\t\tconst cleanedOutput = extractOtelMetrics(\n\t\t\t\toutputBuffer.join(\"\"),\n\t\t\t\topts.onOutput,\n\t\t\t);\n\t\t\topts.onOutput(cleanedOutput);\n\t\t\treturn stripOtelBlocks(raw);\n\t\t}\n\n\t\ttry {\n\t\t\tconst cmd = `cat \"${tmpFile}\" | claude ${args.map((a) => (a === \"\" ? '\"\"' : a)).join(\" \")}`;\n\t\t\tconst { stdout } = await execAsync(cmd, {\n\t\t\t\ttimeout: opts.timeoutMs,\n\t\t\t\tmaxBuffer: MAX_BUFFER_BYTES,\n\t\t\t\tenv: execEnv,\n\t\t\t});\n\t\t\treturn extractOtelMetrics(stdout);\n\t\t} finally {\n\t\t\tawait cleanup();\n\t\t}\n\t}\n}\n",
|
|
19
19
|
"import fsSync from \"node:fs\";\nimport fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport type { Command } from \"commander\";\nimport { loadGlobalConfig } from \"../config/global.js\";\nimport { ClaudeStopHookAdapter } from \"../hooks/adapters/claude-stop-hook.js\";\nimport { CursorStopHookAdapter } from \"../hooks/adapters/cursor-stop-hook.js\";\nimport type {\n\tStopHookAdapter,\n\tStopHookResult,\n} from \"../hooks/adapters/types.js\";\nimport {\n\tgetDebugLogConfig,\n\tgetLogDir,\n\tgetStatusMessage,\n\tStopHookHandler,\n} from \"../hooks/stop-hook-handler.js\";\nimport {\n\tLOOP_THRESHOLD,\n\trecordBlockTimestamp,\n\tresetBlockTimestamps,\n} from \"../hooks/stop-hook-state.js\";\nimport {\n\tgetCategoryLogger,\n\tinitLogger,\n\tresetLogger,\n} from \"../output/app-logger.js\";\nimport {\n\ttype GauntletStatus,\n\tisBlockingStatus,\n} from \"../types/gauntlet-status.js\";\nimport { DebugLogger, mergeDebugLogConfig } from \"../utils/debug-log.js\";\n\n/**\n * Timeout for reading stdin (in milliseconds).\n * Claude Code sends JSON input immediately on hook invocation.\n * The 5-second timeout is a safety net for edge cases where stdin is delayed.\n */\nconst STDIN_TIMEOUT_MS = 5000;\n\n/**\n * Environment variable to prevent stop-hook recursion in child Claude processes.\n *\n * **How it works:**\n * When the gauntlet runs review gates, it spawns child Claude processes to analyze code.\n * These child processes inherit environment variables. If a child Claude tries to stop,\n * its stop hook would normally run the gauntlet again, potentially creating infinite\n * recursion or redundant checks.\n *\n * **Where it's set:**\n * - In `src/cli-adapters/claude.ts` when spawning Claude for review execution\n * - Set to \"1\" in the spawn/exec environment: `{ [GAUNTLET_STOP_HOOK_ACTIVE_ENV]: \"1\" }`\n *\n * **Effect:**\n * When this env var is set, stop-hooks exit immediately with \"approve\" decision,\n * skipping all validation. This is safe because:\n * 1. The parent gauntlet process is already running validation\n * 2. Child processes are short-lived review executors, not user sessions\n * 3. Debug logging is skipped to avoid polluting logs with child process entries\n */\nexport const GAUNTLET_STOP_HOOK_ACTIVE_ENV = \"GAUNTLET_STOP_HOOK_ACTIVE\";\n\n/**\n * Marker file to detect nested stop-hook invocations.\n *\n * **Why this exists:**\n * When the gauntlet spawns child Claude processes for code reviews, those child\n * processes may trigger stop hooks when they exit. Claude Code does NOT pass\n * environment variables to hooks, so GAUNTLET_STOP_HOOK_ACTIVE_ENV doesn't work.\n *\n * **How it works:**\n * 1. Stop-hook creates this file (containing PID) before running the gauntlet\n * 2. If another stop-hook fires during execution, it sees this file and fast-exits\n * 3. Stop-hook removes this file when complete (success, failure, or error)\n *\n * This prevents nested stop-hooks from attempting to run concurrent gauntlets\n * (which would hit lock_conflict anyway, but this is faster and quieter).\n */\nconst STOP_HOOK_MARKER_FILE = \".stop-hook-active\";\n\n/**\n * Hard ceiling for the stop hook process.\n * If the process runs longer than this, it outputs an allow response and exits.\n * This prevents zombie processes when Claude Code times out reading stdout\n * but the process keeps running.\n */\nconst STOP_HOOK_TIMEOUT_MS = 5 * 60 * 1000; // 5 minutes\n\n/**\n * Available adapters in detection order.\n * Cursor adapter is checked first because it has a positive detection (cursor_version present).\n * Claude adapter is the fallback (detected by absence of cursor_version).\n */\nconst adapters: StopHookAdapter[] = [\n\tnew CursorStopHookAdapter(),\n\tnew ClaudeStopHookAdapter(),\n];\n\n/**\n * Read hook input from stdin with a timeout.\n *\n * **Claude Code Hook Protocol:**\n * Claude Code invokes stop hooks as shell commands and passes context via stdin\n * as newline-terminated JSON. The input includes:\n * - `cwd`: The project working directory (where Claude Code is running)\n * - `stop_hook_active`: True if already inside a stop hook context (see below)\n * - `session_id`, `transcript_path`: Session context (not currently used)\n *\n * **The `stop_hook_active` field (stdin):**\n * This is set by Claude Code itself when invoking a stop hook while already inside\n * a stop hook context. This is a second layer of infinite loop prevention (in addition\n * to the GAUNTLET_STOP_HOOK_ACTIVE env var). If true, we allow stop immediately.\n *\n * **Timeout behavior:**\n * This function reads stdin with a 5-second timeout to handle cases where:\n * - Claude Code sends input quickly (normal case - resolves on newline)\n * - No input is sent (timeout returns empty string, allowing stop)\n * - stdin is already closed (returns immediately)\n *\n * The timeout ensures the stop hook doesn't hang indefinitely waiting for input.\n */\nasync function readStdin(): Promise<string> {\n\treturn new Promise((resolve) => {\n\t\tlet data = \"\";\n\t\tlet resolved = false;\n\n\t\tconst onEnd = () => cleanup(data.trim());\n\t\tconst onError = () => cleanup(\"\");\n\n\t\tconst cleanup = (result: string) => {\n\t\t\tif (!resolved) {\n\t\t\t\tresolved = true;\n\t\t\t\tclearTimeout(timeout);\n\t\t\t\tprocess.stdin.removeListener(\"data\", onData);\n\t\t\t\tprocess.stdin.removeListener(\"end\", onEnd);\n\t\t\t\tprocess.stdin.removeListener(\"error\", onError);\n\t\t\t\tresolve(result);\n\t\t\t}\n\t\t};\n\n\t\tconst timeout = setTimeout(() => {\n\t\t\tcleanup(data.trim());\n\t\t}, STDIN_TIMEOUT_MS);\n\n\t\tconst onData = (chunk: Buffer) => {\n\t\t\tdata += chunk.toString();\n\t\t\t// Claude Code sends newline-terminated JSON\n\t\t\tif (data.includes(\"\\n\")) {\n\t\t\t\tcleanup(data.trim());\n\t\t\t}\n\t\t};\n\n\t\tprocess.stdin.on(\"data\", onData);\n\t\tprocess.stdin.on(\"end\", onEnd);\n\t\tprocess.stdin.on(\"error\", onError);\n\n\t\t// Handle case where stdin is already closed or empty\n\t\tif (process.stdin.readableEnded) {\n\t\t\tcleanup(data.trim());\n\t\t}\n\t});\n}\n\n/**\n * Check if a file exists at the given path.\n */\nasync function fileExists(filePath: string): Promise<boolean> {\n\ttry {\n\t\tawait fs.stat(filePath);\n\t\treturn true;\n\t} catch {\n\t\treturn false;\n\t}\n}\n\n/**\n * Get a logger for stop-hook operations.\n */\nfunction getStopHookLogger() {\n\treturn getCategoryLogger(\"stop-hook\");\n}\n\n/**\n * Output a result using the given adapter's format.\n */\nfunction outputResult(adapter: StopHookAdapter, result: StopHookResult): void {\n\tconsole.log(adapter.formatOutput(result));\n}\n\n/**\n * Create a simple result for early exit conditions.\n */\nfunction createEarlyExitResult(\n\tstatus: GauntletStatus,\n\toptions?: { intervalMinutes?: number; errorMessage?: string },\n): StopHookResult {\n\treturn {\n\t\tstatus,\n\t\tshouldBlock: false,\n\t\tmessage: getStatusMessage(status, options),\n\t\tintervalMinutes: options?.intervalMinutes,\n\t};\n}\n\n/**\n * Apply loop detection to a blocking result.\n * Records the block timestamp and checks if the threshold is reached.\n * Returns the original result if not looping, or an allow result if loop detected.\n */\nasync function applyLoopDetection(\n\tresult: StopHookResult,\n\tlogDir: string,\n\tlog: ReturnType<typeof getStopHookLogger>,\n\tdebugLogger: DebugLogger | null,\n): Promise<StopHookResult> {\n\tif (!result.shouldBlock) {\n\t\tresetBlockTimestamps(logDir).catch(() => {});\n\t\treturn result;\n\t}\n\ttry {\n\t\tconst timestamps = await recordBlockTimestamp(logDir);\n\t\tif (timestamps.length >= LOOP_THRESHOLD) {\n\t\t\tlog.info(\n\t\t\t\t`Loop detected: ${timestamps.length} blocks within window — overriding to allow`,\n\t\t\t);\n\t\t\tawait debugLogger?.logStopHook(\"allow\", \"loop_detected\");\n\t\t\treturn {\n\t\t\t\tstatus: \"loop_detected\",\n\t\t\t\tshouldBlock: false,\n\t\t\t\tmessage: getStatusMessage(\"loop_detected\"),\n\t\t\t};\n\t\t}\n\t} catch (loopErr: unknown) {\n\t\tconst errMsg = (loopErr as { message?: string }).message ?? \"unknown\";\n\t\tlog.warn(\n\t\t\t`Loop detection error: ${errMsg} — proceeding with original result`,\n\t\t);\n\t}\n\treturn result;\n}\n\n/**\n * Output a hook response to stdout using Claude protocol format.\n * This is the legacy API for backward compatibility.\n * Uses the Claude Code hook protocol format:\n * - decision: \"block\" | \"approve\" - whether to block or allow the stop\n * - reason: string - when blocking, this becomes the prompt fed back to Claude automatically\n * - stopReason: string - always displayed to user regardless of decision\n * - status: machine-readable status code for transparency (unified GauntletStatus)\n * - message: human-friendly explanation of the outcome\n */\nexport function outputHookResponse(\n\tstatus: GauntletStatus,\n\toptions?: {\n\t\treason?: string;\n\t\tintervalMinutes?: number;\n\t\terrorMessage?: string;\n\t},\n): void {\n\tconst claudeAdapter = new ClaudeStopHookAdapter();\n\tconst shouldBlock = isBlockingStatus(status);\n\tconst message = getStatusMessage(status, {\n\t\tintervalMinutes: options?.intervalMinutes,\n\t\terrorMessage: options?.errorMessage,\n\t});\n\n\tconst result: StopHookResult = {\n\t\tstatus,\n\t\tshouldBlock,\n\t\tmessage,\n\t\treason: options?.reason,\n\t\tintervalMinutes: options?.intervalMinutes,\n\t};\n\n\tconsole.log(claudeAdapter.formatOutput(result));\n}\n\n// Export for testing\nexport { getStatusMessage };\nexport type {\n\tGauntletStatus as StopHookStatus,\n\tStopHookResult as HookResponse,\n};\n\nexport function registerStopHookCommand(program: Command): void {\n\tprogram\n\t\t.command(\"stop-hook\")\n\t\t.description(\"Claude Code stop hook - validates gauntlet completion\")\n\t\t.action(async () => {\n\t\t\t// Default to Claude adapter for error handling before detection\n\t\t\tlet adapter: StopHookAdapter = adapters[1] as StopHookAdapter;\n\t\t\tlet debugLogger: DebugLogger | null = null;\n\t\t\tlet loggerInitialized = false;\n\t\t\tlet markerFilePath: string | null = null;\n\t\t\tconst log = getStopHookLogger();\n\n\t\t\t// Self-timeout: kill this process if it runs too long.\n\t\t\t// Claude Code may timeout reading stdout, but the process keeps running\n\t\t\t// as a zombie holding the lock and marker file.\n\t\t\tconst selfTimeout = setTimeout(() => {\n\t\t\t\t// Clean up marker file synchronously before exiting\n\t\t\t\tif (markerFilePath) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tfsSync.rmSync(markerFilePath, { force: true });\n\t\t\t\t\t} catch {\n\t\t\t\t\t\t// Best-effort cleanup\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\toutputResult(\n\t\t\t\t\tadapter,\n\t\t\t\t\tcreateEarlyExitResult(\"error\", {\n\t\t\t\t\t\terrorMessage: \"stop hook timed out\",\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t\tprocess.exit(0);\n\t\t\t}, STOP_HOOK_TIMEOUT_MS);\n\t\t\tselfTimeout.unref();\n\n\t\t\t// Capture diagnostic info early for later logging\n\t\t\tconst diagnostics = {\n\t\t\t\tpid: process.pid,\n\t\t\t\tppid: process.ppid,\n\t\t\t\tenvVarSet: !!process.env[GAUNTLET_STOP_HOOK_ACTIVE_ENV],\n\t\t\t\tprocessCwd: process.cwd(),\n\t\t\t\trawStdin: \"\",\n\t\t\t\tstdinSessionId: undefined as string | undefined,\n\t\t\t\tstdinStopHookActive: undefined as boolean | undefined,\n\t\t\t\tstdinCwd: undefined as string | undefined,\n\t\t\t\tstdinHookEventName: undefined as string | undefined,\n\t\t\t};\n\n\t\t\ttry {\n\t\t\t\t// ============================================================\n\t\t\t\t// FAST EXIT CHECKS (no stdin read, minimal logging)\n\t\t\t\t// These checks allow quick exit without the 5-second stdin timeout\n\t\t\t\t// ============================================================\n\n\t\t\t\t// 1. Check env var FIRST - fast exit for child Claude processes\n\t\t\t\tif (process.env[GAUNTLET_STOP_HOOK_ACTIVE_ENV]) {\n\t\t\t\t\toutputResult(adapter, createEarlyExitResult(\"stop_hook_active\"));\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// 2. Check if this is a gauntlet project BEFORE reading stdin\n\t\t\t\tconst quickConfigCheck = path.join(\n\t\t\t\t\tprocess.cwd(),\n\t\t\t\t\t\".gauntlet\",\n\t\t\t\t\t\"config.yml\",\n\t\t\t\t);\n\t\t\t\tif (!(await fileExists(quickConfigCheck))) {\n\t\t\t\t\toutputResult(adapter, createEarlyExitResult(\"no_config\"));\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// ============================================================\n\t\t\t\t// EARLY DEBUG LOGGER INIT (before marker/stdin checks)\n\t\t\t\t// ============================================================\n\t\t\t\tconst earlyLogDir = path.join(\n\t\t\t\t\tprocess.cwd(),\n\t\t\t\t\tawait getLogDir(process.cwd()),\n\t\t\t\t);\n\t\t\t\ttry {\n\t\t\t\t\tconst globalConfig = await loadGlobalConfig();\n\t\t\t\t\tconst projectDebugLogConfig = await getDebugLogConfig(process.cwd());\n\t\t\t\t\tconst debugLogConfig = mergeDebugLogConfig(\n\t\t\t\t\t\tprojectDebugLogConfig,\n\t\t\t\t\t\tglobalConfig.debug_log,\n\t\t\t\t\t);\n\t\t\t\t\tdebugLogger = new DebugLogger(earlyLogDir, debugLogConfig);\n\t\t\t\t} catch (initErr: unknown) {\n\t\t\t\t\tlog.warn(\n\t\t\t\t\t\t`Debug logger init failed: ${(initErr as { message?: string }).message ?? \"unknown\"}`,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tawait debugLogger?.logCommand(\"stop-hook\", []);\n\n\t\t\t\t// 3. Check marker file - fast exit for nested stop-hooks\n\t\t\t\tconst markerLogDir = await getLogDir(process.cwd());\n\t\t\t\tconst markerPath = path.join(\n\t\t\t\t\tprocess.cwd(),\n\t\t\t\t\tmarkerLogDir,\n\t\t\t\t\tSTOP_HOOK_MARKER_FILE,\n\t\t\t\t);\n\t\t\t\tif (await fileExists(markerPath)) {\n\t\t\t\t\tconst STALE_MARKER_MS = 10 * 60 * 1000;\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst stat = await fs.stat(markerPath);\n\t\t\t\t\t\tconst ageMs = Date.now() - stat.mtimeMs;\n\t\t\t\t\t\tif (ageMs > STALE_MARKER_MS) {\n\t\t\t\t\t\t\tawait debugLogger?.logStopHookEarlyExit(\n\t\t\t\t\t\t\t\t\"marker_stale\",\n\t\t\t\t\t\t\t\t\"proceeding\",\n\t\t\t\t\t\t\t\t`age=${Math.round(ageMs / 1000)}s threshold=${Math.round(STALE_MARKER_MS / 1000)}s`,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tawait fs.rm(markerPath, { force: true });\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tawait debugLogger?.logStopHookEarlyExit(\n\t\t\t\t\t\t\t\t\"marker_fresh\",\n\t\t\t\t\t\t\t\t\"stop_hook_active\",\n\t\t\t\t\t\t\t\t`age=${Math.round(ageMs / 1000)}s`,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\toutputResult(adapter, createEarlyExitResult(\"stop_hook_active\"));\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t} catch (markerErr: unknown) {\n\t\t\t\t\t\tconst errMsg =\n\t\t\t\t\t\t\t(markerErr as { message?: string }).message ?? \"unknown\";\n\t\t\t\t\t\tawait debugLogger?.logStopHookEarlyExit(\n\t\t\t\t\t\t\t\"marker_stat_error\",\n\t\t\t\t\t\t\t\"stop_hook_active\",\n\t\t\t\t\t\t\t`error=${errMsg}`,\n\t\t\t\t\t\t);\n\t\t\t\t\t\toutputResult(adapter, createEarlyExitResult(\"stop_hook_active\"));\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// ============================================================\n\t\t\t\t// STDIN PARSING AND ADAPTER DETECTION\n\t\t\t\t// ============================================================\n\n\t\t\t\tconst input = await readStdin();\n\t\t\t\tdiagnostics.rawStdin = input;\n\n\t\t\t\tlet parsed: Record<string, unknown> = {};\n\t\t\t\ttry {\n\t\t\t\t\tif (input.trim()) {\n\t\t\t\t\t\tparsed = JSON.parse(input);\n\t\t\t\t\t\t// Capture parsed fields for diagnostics\n\t\t\t\t\t\tdiagnostics.stdinSessionId = parsed.session_id as\n\t\t\t\t\t\t\t| string\n\t\t\t\t\t\t\t| undefined;\n\t\t\t\t\t\tdiagnostics.stdinStopHookActive = parsed.stop_hook_active as\n\t\t\t\t\t\t\t| boolean\n\t\t\t\t\t\t\t| undefined;\n\t\t\t\t\t\tdiagnostics.stdinCwd = parsed.cwd as string | undefined;\n\t\t\t\t\t\tdiagnostics.stdinHookEventName = parsed.hook_event_name as\n\t\t\t\t\t\t\t| string\n\t\t\t\t\t\t\t| undefined;\n\t\t\t\t\t}\n\t\t\t\t} catch (parseErr: unknown) {\n\t\t\t\t\tconst errMsg =\n\t\t\t\t\t\t(parseErr as { message?: string }).message ?? \"unknown\";\n\t\t\t\t\tlog.info(`Invalid hook input (${errMsg}), allowing stop`);\n\t\t\t\t\tawait debugLogger?.logStopHookEarlyExit(\n\t\t\t\t\t\t\"stdin_parse_error\",\n\t\t\t\t\t\t\"invalid_input\",\n\t\t\t\t\t\t`error=${errMsg}`,\n\t\t\t\t\t);\n\t\t\t\t\toutputResult(adapter, createEarlyExitResult(\"invalid_input\"));\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Detect protocol and select adapter\n\t\t\t\t// biome-ignore lint/style/noNonNullAssertion: adapters array always has index 1\n\t\t\t\tadapter = adapters.find((a) => a.detect(parsed)) ?? adapters[1]!;\n\n\t\t\t\t// Parse input using selected adapter\n\t\t\t\tconst ctx = adapter.parseInput(parsed);\n\n\t\t\t\t// Check for adapter-specific early exit (e.g., Cursor loop_count)\n\t\t\t\tconst skipResult = adapter.shouldSkipExecution(ctx);\n\t\t\t\tif (skipResult) {\n\t\t\t\t\tawait debugLogger?.logStopHookEarlyExit(\n\t\t\t\t\t\t\"adapter_skip\",\n\t\t\t\t\t\tskipResult.status,\n\t\t\t\t\t\t`adapter=${adapter.name}`,\n\t\t\t\t\t);\n\t\t\t\t\toutputResult(adapter, skipResult);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// ============================================================\n\t\t\t\t// GAUNTLET EXECUTION\n\t\t\t\t// ============================================================\n\n\t\t\t\tlog.info(\"Starting gauntlet validation...\");\n\n\t\t\t\t// Re-check config if cwd differs from process.cwd()\n\t\t\t\tconst projectCwd = ctx.cwd;\n\t\t\t\tif (ctx.cwd !== process.cwd()) {\n\t\t\t\t\tconst configPath = path.join(projectCwd, \".gauntlet\", \"config.yml\");\n\t\t\t\t\tif (!(await fileExists(configPath))) {\n\t\t\t\t\t\tlog.info(\"No gauntlet config found at hook cwd, allowing stop\");\n\t\t\t\t\t\tawait debugLogger?.logStopHookEarlyExit(\n\t\t\t\t\t\t\t\"no_config_at_cwd\",\n\t\t\t\t\t\t\t\"no_config\",\n\t\t\t\t\t\t\t`cwd=${projectCwd}`,\n\t\t\t\t\t\t);\n\t\t\t\t\t\toutputResult(adapter, createEarlyExitResult(\"no_config\"));\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Get log directory from project config\n\t\t\t\tconst logDir = path.join(projectCwd, await getLogDir(projectCwd));\n\n\t\t\t\t// Initialize app logger in stop-hook mode\n\t\t\t\tawait initLogger({\n\t\t\t\t\tmode: \"stop-hook\",\n\t\t\t\t\tlogDir,\n\t\t\t\t});\n\t\t\t\tloggerInitialized = true;\n\n\t\t\t\t// Re-init debug logger with the final logDir if cwd differed\n\t\t\t\tif (logDir !== earlyLogDir) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst globalCfg = await loadGlobalConfig();\n\t\t\t\t\t\tconst projDbgCfg = await getDebugLogConfig(projectCwd);\n\t\t\t\t\t\tconst dbgCfg = mergeDebugLogConfig(projDbgCfg, globalCfg.debug_log);\n\t\t\t\t\t\tdebugLogger = new DebugLogger(logDir, dbgCfg);\n\t\t\t\t\t} catch (reinitErr: unknown) {\n\t\t\t\t\t\tlog.warn(\n\t\t\t\t\t\t\t`Debug logger re-init failed: ${(reinitErr as { message?: string }).message ?? \"unknown\"}`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Log diagnostic info\n\t\t\t\tawait debugLogger?.logStopHookDiagnostics(diagnostics);\n\n\t\t\t\t// Create marker file to signal nested stop-hooks to fast-exit\n\t\t\t\tmarkerFilePath = path.join(logDir, STOP_HOOK_MARKER_FILE);\n\t\t\t\ttry {\n\t\t\t\t\tawait fs.writeFile(markerFilePath, `${process.pid}`, \"utf-8\");\n\t\t\t\t} catch (mkErr: unknown) {\n\t\t\t\t\tconst errMsg = (mkErr as { message?: string }).message ?? \"unknown\";\n\t\t\t\t\tlog.warn(`Failed to create marker file: ${errMsg}`);\n\t\t\t\t\tmarkerFilePath = null;\n\t\t\t\t}\n\n\t\t\t\t// Execute handler (includes gauntlet run + post-gauntlet PR check)\n\t\t\t\tlog.info(\"Running gauntlet gates...\");\n\t\t\t\tconst handler = new StopHookHandler(debugLogger ?? undefined);\n\t\t\t\thandler.setLogDir(logDir); // Pass logDir for execution state refresh\n\t\t\t\tlet result: StopHookResult;\n\t\t\t\ttry {\n\t\t\t\t\tresult = await handler.execute(ctx);\n\t\t\t\t} finally {\n\t\t\t\t\t// Clean up marker file regardless of success/failure\n\t\t\t\t\tif (markerFilePath) {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tawait fs.rm(markerFilePath, { force: true });\n\t\t\t\t\t\t} catch (rmErr: unknown) {\n\t\t\t\t\t\t\tconst errMsg =\n\t\t\t\t\t\t\t\t(rmErr as { message?: string }).message ?? \"unknown\";\n\t\t\t\t\t\t\tlog.warn(`Failed to remove marker file: ${errMsg}`);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tmarkerFilePath = null;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Loop detection: track rapid-fire blocks and override if looping\n\t\t\t\tresult = await applyLoopDetection(result, logDir, log, debugLogger);\n\n\t\t\t\t// Output result using adapter format\n\t\t\t\toutputResult(adapter, result);\n\n\t\t\t\t// Clean up logger\n\t\t\t\tif (loggerInitialized) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait resetLogger();\n\t\t\t\t\t} catch (resetErr: unknown) {\n\t\t\t\t\t\tconst resetMsg =\n\t\t\t\t\t\t\t(resetErr as { message?: string }).message ?? \"unknown\";\n\t\t\t\t\t\tlog.warn(`Logger reset failed: ${resetMsg}`);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} catch (error: unknown) {\n\t\t\t\t// On any unexpected error, allow stop to avoid blocking indefinitely\n\t\t\t\tconst err = error as { message?: string };\n\t\t\t\tconst errorMessage = err.message || \"unknown error\";\n\t\t\t\tlog.error(`Stop hook error: ${errorMessage}`);\n\t\t\t\tawait debugLogger?.logStopHook(\"allow\", `error: ${errorMessage}`);\n\t\t\t\toutputResult(adapter, createEarlyExitResult(\"error\", { errorMessage }));\n\n\t\t\t\t// Clean up marker file if it was created\n\t\t\t\tif (markerFilePath) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait fs.rm(markerFilePath, { force: true });\n\t\t\t\t\t} catch (rmErr: unknown) {\n\t\t\t\t\t\tconst rmMsg = (rmErr as { message?: string }).message ?? \"unknown\";\n\t\t\t\t\t\tlog.warn(`Failed to remove marker file in error handler: ${rmMsg}`);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Clean up logger\n\t\t\t\tif (loggerInitialized) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait resetLogger();\n\t\t\t\t\t} catch (resetErr: unknown) {\n\t\t\t\t\t\tconst resetMsg =\n\t\t\t\t\t\t\t(resetErr as { message?: string }).message ?? \"unknown\";\n\t\t\t\t\t\tprocess.stderr.write(\n\t\t\t\t\t\t\t`stop-hook: logger reset failed: ${resetMsg}\\n`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} finally {\n\t\t\t\tclearTimeout(selfTimeout);\n\t\t\t}\n\t\t});\n}\n",
|
|
20
|
-
"import type {\n\tStopHookAdapter,\n\tStopHookContext,\n\tStopHookResult,\n} from \"./types.js\";\n\n/**\n * Claude Code hook response format.\n */\ninterface ClaudeHookResponse {\n\tdecision: \"block\" | \"approve\";\n\treason?: string;\n\tstopReason
|
|
21
|
-
"import type {\n\tStopHookAdapter,\n\tStopHookContext,\n\tStopHookResult,\n} from \"./types.js\";\n\n/**\n * Cursor hook response format.\n * - Empty object {} = allow stop (no feedback)\n * - { systemMessage: \"...\" } = allow stop with user-visible message\n * - { followup_message: \"...\" } = block stop and continue with message\n */\ninterface CursorHookResponse {\n\tfollowup_message?: string;\n\tsystemMessage?: string;\n}\n\n/**\n * Default maximum loop count before allowing stop.\n * Cursor has built-in loop_limit (default 5, configurable in hooks.json),\n * but we provide defense-in-depth with our own check.\n */\nconst DEFAULT_MAX_LOOPS = 10;\n\n/**\n * Adapter for Cursor IDE stop hook protocol.\n *\n * Cursor protocol:\n * - Input: { status, loop_count, cursor_version, workspace_roots, conversation_id, ... }\n * - Output: { followup_message?: \"...\" } or {}\n * - Block mechanism: { followup_message: \"instructions\" } - continues agent with message\n * - Allow mechanism: {} (empty object) - allows stop\n * - Loop prevention: loop_count field (Cursor has built-in loop_limit)\n */\nexport class CursorStopHookAdapter implements StopHookAdapter {\n\tname = \"cursor\";\n\n\t/**\n\t * Maximum loop count before forcing stop.\n\t * Can be configured via hooks.json loop_limit.\n\t */\n\tprivate maxLoops: number;\n\n\tconstructor(maxLoops: number = DEFAULT_MAX_LOOPS) {\n\t\tthis.maxLoops = maxLoops;\n\t}\n\n\t/**\n\t * Detect if this adapter should handle the given input.\n\t * Cursor sends cursor_version in hook input.\n\t */\n\tdetect(raw: Record<string, unknown>): boolean {\n\t\treturn \"cursor_version\" in raw;\n\t}\n\n\t/**\n\t * Parse Cursor input into normalized context.\n\t */\n\tparseInput(raw: Record<string, unknown>): StopHookContext {\n\t\tconst workspaceRoots = raw.workspace_roots;\n\t\tconst loopCount = raw.loop_count as number | undefined;\n\n\t\treturn {\n\t\t\tcwd:\n\t\t\t\t(Array.isArray(workspaceRoots) ? workspaceRoots[0] : null) ??\n\t\t\t\tprocess.cwd(),\n\t\t\tisNestedHook: false, // Cursor uses loop_count instead of nested hook flag\n\t\t\tloopCount,\n\t\t\tsessionId: raw.conversation_id as string | undefined,\n\t\t\trawInput: raw,\n\t\t};\n\t}\n\n\t/**\n\t * Get the block message for a given result based on status.\n\t */\n\tprivate getBlockMessage(result: StopHookResult): string {\n\t\treturn result.reason || result.message;\n\t}\n\n\t/**\n\t * Format handler result into Cursor protocol output.\n\t */\n\tformatOutput(result: StopHookResult): string {\n\t\tif (result.shouldBlock) {\n\t\t\tconst response: CursorHookResponse = {\n\t\t\t\tfollowup_message: this.getBlockMessage(result),\n\t\t\t};\n\t\t\treturn JSON.stringify(response);\n\t\t}\n\n\t\t// Include systemMessage for user feedback even when not blocking\n\t\tconst response: CursorHookResponse = {\n\t\t\
|
|
22
|
-
"import { execFile } from \"node:child_process\";\nimport fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { promisify } from \"node:util\";\nimport YAML from \"yaml\";\nimport { loadGlobalConfig } from \"../config/global.js\";\nimport type { StopHookConfig } from \"../config/stop-hook-config.js\";\nimport { resolveStopHookConfig } from \"../config/stop-hook-config.js\";\nimport { getCategoryLogger } from \"../output/app-logger.js\";\nimport type { GauntletStatus } from \"../types/gauntlet-status.js\";\nimport type { DebugLogger } from \"../utils/debug-log.js\";\nimport type {\n\tPRStatusResult,\n\tStopHookContext,\n\tStopHookResult,\n} from \"./adapters/types.js\";\nimport {\n\tcheckRunInterval,\n\tgetLastRunStatus,\n\thasChangesSinceLastRun,\n\thasChangesVsBaseBranch,\n\thasFailedRunLogs,\n} from \"./stop-hook-state.js\";\n\nconst execFileAsync = promisify(execFile);\n\ninterface MinimalConfig {\n\tlog_dir?: string;\n\tdebug_log?: {\n\t\tenabled?: boolean;\n\t\tmax_size_mb?: number;\n\t};\n\tstop_hook?: {\n\t\tauto_push_pr?: boolean;\n\t\tauto_fix_pr?: boolean;\n\t};\n\tbase_branch?: string;\n}\n\n/**\n * Internal context passed to private handler methods.\n */\ninterface HandlerCtx {\n\tlogDir: string;\n\tcwd: string;\n\tlog: ReturnType<typeof getStopHookLogger>;\n}\n\n/**\n * Default log directory when config doesn't specify one.\n */\nconst DEFAULT_LOG_DIR = \"gauntlet_logs\";\n\n/**\n * Skill instructions returned as the `reason` field when blocking stop.\n * These are concise directives — the skills contain full workflow logic.\n */\nconst SKILL_INSTRUCTIONS = {\n\tvalidation_required:\n\t\t\"Changes detected, you must use the `gauntlet-run` skill to validate them now.\",\n\tpr_push_required:\n\t\t\"Gauntlet passed. You must use the `gauntlet-push-pr` skill to create or update your pull request.\",\n\tpr_push_required_with_warnings:\n\t\t\"Gauntlet passed with warnings (some issues were skipped). You must use the `gauntlet-push-pr` skill to create or update your pull request. Include a summary of skipped issues in the PR description.\",\n\tci_pending:\n\t\t\"PR is up to date but CI checks are still running. You must use the `gauntlet-fix-pr` skill to poll CI status until checks complete, then fix any failures.\",\n\tci_failed:\n\t\t\"PR is up to date but CI checks have failed. You must use the `gauntlet-fix-pr` skill to check which CI checks failed, fix the issues, and push.\",\n} as const;\n\n/**\n * Read and parse the project config file.\n * Returns undefined if the file doesn't exist or can't be parsed.\n */\nasync function readProjectConfig(\n\tprojectCwd: string,\n): Promise<MinimalConfig | undefined> {\n\ttry {\n\t\tconst configPath = path.join(projectCwd, \".gauntlet\", \"config.yml\");\n\t\tconst content = await fs.readFile(configPath, \"utf-8\");\n\t\treturn YAML.parse(content) as MinimalConfig;\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\n/**\n * Get a logger for stop-hook operations.\n */\nfunction getStopHookLogger() {\n\treturn getCategoryLogger(\"stop-hook\");\n}\n\n/**\n * Static status messages for statuses that don't need dynamic context.\n */\nconst STATUS_MESSAGES: Record<string, string> = {\n\tpassed: \"✓ Gauntlet passed — all gates completed successfully.\",\n\tpassed_with_warnings:\n\t\t\"✓ Gauntlet completed — passed with warnings (some issues were skipped).\",\n\tno_applicable_gates:\n\t\t\"✓ Gauntlet passed — no applicable gates matched current changes.\",\n\tno_changes: \"✓ Gauntlet passed — no changes detected.\",\n\tretry_limit_exceeded:\n\t\t\"⚠ Gauntlet terminated — retry limit exceeded. Run `agent-gauntlet clean` to archive and continue.\",\n\tlock_conflict:\n\t\t\"⏭ Gauntlet skipped — another gauntlet run is already in progress.\",\n\tfailed: \"✗ Gauntlet failed — issues must be fixed before stopping.\",\n\tpr_push_required:\n\t\t\"✓ Gauntlet passed — PR needs to be created or updated before stopping.\",\n\tci_pending: \"⏳ CI checks still running — waiting for completion.\",\n\tci_failed: \"✗ CI failed or review changes requested — fix issues and push.\",\n\tci_passed: \"✓ CI passed — all checks completed and no blocking reviews.\",\n\tvalidation_required:\n\t\t\"✗ Validation required — changes detected that need validation before stopping.\",\n\tno_config: \"○ Not a gauntlet project — no .gauntlet/config.yml found.\",\n\tstop_hook_active:\n\t\t\"↺ Stop hook cycle detected — allowing stop to prevent infinite loop.\",\n\tloop_detected:\n\t\t\"↺ Loop detected — stop hook blocked 3 times within 60s. Allowing stop to prevent infinite loop.\",\n\tstop_hook_disabled: \"○ Stop hook is disabled via configuration.\",\n\tinvalid_input: \"⚠ Invalid hook input — could not parse JSON, allowing stop.\",\n};\n\n/**\n * Get a human-friendly message for each status code.\n * These messages explain why the stop was approved or blocked.\n */\nexport function getStatusMessage(\n\tstatus: GauntletStatus,\n\tcontext?: { intervalMinutes?: number; errorMessage?: string },\n): string {\n\t// Handle statuses that need dynamic context\n\tif (status === \"interval_not_elapsed\") {\n\t\treturn context?.intervalMinutes\n\t\t\t? `⏭ Gauntlet skipped — run interval (${context.intervalMinutes} min) not elapsed since last run.`\n\t\t\t: \"⏭ Gauntlet skipped — run interval not elapsed since last run.\";\n\t}\n\n\tif (status === \"error\") {\n\t\treturn context?.errorMessage\n\t\t\t? `⚠ Stop hook error — ${context.errorMessage}`\n\t\t\t: \"⚠ Stop hook error — unexpected error occurred.\";\n\t}\n\n\t// Use static lookup for all other statuses\n\treturn STATUS_MESSAGES[status] ?? `Unknown status: ${status}`;\n}\n\n/**\n * Read the log_dir from project config without full validation.\n */\nexport async function getLogDir(projectCwd: string): Promise<string> {\n\tconst config = await readProjectConfig(projectCwd);\n\treturn config?.log_dir || DEFAULT_LOG_DIR;\n}\n\n/**\n * Read the debug_log config from project config without full validation.\n */\nexport async function getDebugLogConfig(\n\tprojectCwd: string,\n): Promise<MinimalConfig[\"debug_log\"]> {\n\tconst config = await readProjectConfig(projectCwd);\n\treturn config?.debug_log;\n}\n\n/**\n * Get resolved stop hook config with 3-tier precedence.\n */\nasync function getResolvedStopHookConfig(\n\tprojectCwd: string,\n): Promise<StopHookConfig | null> {\n\ttry {\n\t\tconst configPath = path.join(projectCwd, \".gauntlet\", \"config.yml\");\n\t\tconst content = await fs.readFile(configPath, \"utf-8\");\n\t\tconst raw = YAML.parse(content) as { stop_hook?: Record<string, unknown> };\n\t\tconst projectStopHookConfig = raw?.stop_hook as\n\t\t\t| { auto_push_pr?: boolean; auto_fix_pr?: boolean }\n\t\t\t| undefined;\n\t\tconst globalConfig = await loadGlobalConfig();\n\t\treturn resolveStopHookConfig(projectStopHookConfig, globalConfig);\n\t} catch {\n\t\treturn null;\n\t}\n}\n\n/**\n * Check if we should verify PR status after gates pass.\n * Loads stop hook config with 3-tier precedence and checks auto_push_pr.\n */\nasync function shouldCheckPR(projectCwd: string): Promise<boolean> {\n\tconst config = await getResolvedStopHookConfig(projectCwd);\n\treturn config?.auto_push_pr ?? false;\n}\n\n/**\n * Check PR existence and whether local commits have been pushed.\n *\n * Uses `gh pr view` to get PR info and compares head SHA with local HEAD.\n * Gracefully degrades if `gh` is not installed or any error occurs.\n */\nasync function checkPRStatus(cwd: string): Promise<PRStatusResult> {\n\ttry {\n\t\t// Check if gh CLI is available\n\t\ttry {\n\t\t\tawait execFileAsync(\"gh\", [\"--version\"], { cwd });\n\t\t} catch {\n\t\t\treturn {\n\t\t\t\tprExists: false,\n\t\t\t\tupToDate: false,\n\t\t\t\terror: \"gh CLI not installed\",\n\t\t\t};\n\t\t}\n\n\t\t// Get PR info for current branch\n\t\tlet prInfo: { number: number; state: string; headRefOid: string };\n\t\ttry {\n\t\t\tconst { stdout } = await execFileAsync(\n\t\t\t\t\"gh\",\n\t\t\t\t[\"pr\", \"view\", \"--json\", \"number,state,headRefOid\"],\n\t\t\t\t{ cwd },\n\t\t\t);\n\t\t\tprInfo = JSON.parse(stdout.trim());\n\t\t} catch (e: unknown) {\n\t\t\tconst errMsg = (e as { message?: string }).message ?? \"unknown\";\n\t\t\t// gh pr view exits with code 1 and specific message when no PR exists\n\t\t\tif (\n\t\t\t\terrMsg.includes(\"no pull requests found\") ||\n\t\t\t\terrMsg.includes(\"Could not resolve\")\n\t\t\t) {\n\t\t\t\treturn { prExists: false, upToDate: false };\n\t\t\t}\n\t\t\t// Other failures (network, auth, etc.) — return error for graceful degradation\n\t\t\treturn {\n\t\t\t\tprExists: false,\n\t\t\t\tupToDate: false,\n\t\t\t\terror: `gh pr view failed: ${errMsg}`,\n\t\t\t};\n\t\t}\n\n\t\t// Only consider OPEN PRs - closed/merged PRs should not block stop\n\t\tif (prInfo.state !== \"OPEN\") {\n\t\t\treturn { prExists: false, upToDate: false };\n\t\t}\n\n\t\t// Get local HEAD SHA\n\t\tconst { stdout: localHead } = await execFileAsync(\n\t\t\t\"git\",\n\t\t\t[\"rev-parse\", \"HEAD\"],\n\t\t\t{ cwd },\n\t\t);\n\t\tconst localSha = localHead.trim();\n\n\t\tconst upToDate = prInfo.headRefOid === localSha;\n\t\treturn {\n\t\t\tprExists: true,\n\t\t\tupToDate,\n\t\t\tprNumber: prInfo.number,\n\t\t};\n\t} catch (error: unknown) {\n\t\tconst errMsg = (error as { message?: string }).message ?? \"unknown\";\n\t\treturn {\n\t\t\tprExists: false,\n\t\t\tupToDate: false,\n\t\t\terror: `PR status check failed: ${errMsg}`,\n\t\t};\n\t}\n}\n\n/**\n * Check CI status for the current branch's PR via a single `gh pr checks` read.\n * No polling loop, no cross-invocation state. Returns status immediately.\n */\nexport async function checkCIStatus(cwd: string): Promise<{\n\tstatus: \"passed\" | \"pending\" | \"failed\" | \"error\";\n\terror?: string;\n}> {\n\ttry {\n\t\tconst { stdout } = await execFileAsync(\n\t\t\t\"gh\",\n\t\t\t[\"pr\", \"checks\", \"--json\", \"name,state\"],\n\t\t\t{ cwd },\n\t\t);\n\n\t\tconst checks = JSON.parse(stdout.trim()) as Array<{\n\t\t\tname: string;\n\t\t\tstate: string;\n\t\t}>;\n\n\t\tif (checks.length === 0) {\n\t\t\t// No checks configured — treat as passed\n\t\t\treturn { status: \"passed\" };\n\t\t}\n\n\t\tconst hasFailed = checks.some(\n\t\t\t(c) => c.state === \"FAILURE\" || c.state === \"ERROR\",\n\t\t);\n\t\tif (hasFailed) return { status: \"failed\" };\n\n\t\tconst hasPending = checks.some(\n\t\t\t(c) => c.state === \"PENDING\" || c.state === \"EXPECTED\",\n\t\t);\n\t\tif (hasPending) return { status: \"pending\" };\n\n\t\treturn { status: \"passed\" };\n\t} catch (e: unknown) {\n\t\tconst errMsg = (e as { message?: string }).message ?? \"unknown\";\n\t\treturn { status: \"error\", error: errMsg };\n\t}\n}\n\n/**\n * Core stop hook handler that reads state and determines whether to block stop.\n * Protocol-agnostic: works with any adapter that provides a StopHookContext.\n *\n * This handler is stateless — it only READS state (logs, execution state,\n * PR status, CI status) and returns skill instructions. It never executes\n * gates, polls CI, or tracks attempts.\n */\nexport class StopHookHandler {\n\tprivate debugLogger?: DebugLogger;\n\tprivate logDir?: string;\n\n\tconstructor(debugLogger?: DebugLogger) {\n\t\tthis.debugLogger = debugLogger;\n\t}\n\n\t/**\n\t * Set the debug logger (can be updated after construction).\n\t */\n\tsetDebugLogger(debugLogger: DebugLogger): void {\n\t\tthis.debugLogger = debugLogger;\n\t}\n\n\t/**\n\t * Set the log directory (needed for state reads).\n\t */\n\tsetLogDir(logDir: string): void {\n\t\tthis.logDir = logDir;\n\t}\n\n\t/**\n\t * Read state and determine whether to block the stop.\n\t * Returns a skill instruction when blocking, or allows the stop.\n\t */\n\tasync execute(ctx: StopHookContext): Promise<StopHookResult> {\n\t\tconst logDir = this.logDir;\n\n\t\tif (!logDir) {\n\t\t\treturn this.allow(\"passed\");\n\t\t}\n\n\t\tconst hctx: HandlerCtx = {\n\t\t\tlogDir,\n\t\t\tcwd: ctx.cwd,\n\t\t\tlog: getStopHookLogger(),\n\t\t};\n\n\t\tconst config = await getResolvedStopHookConfig(hctx.cwd);\n\n\t\tif (config?.enabled === false) {\n\t\t\treturn this.allow(\"stop_hook_disabled\");\n\t\t}\n\n\t\tif (await hasFailedRunLogs(logDir)) {\n\t\t\thctx.log.info(\n\t\t\t\t\"Failed run logs found — blocking with validation_required\",\n\t\t\t);\n\t\t\treturn this.block(\n\t\t\t\t\"validation_required\",\n\t\t\t\tSKILL_INSTRUCTIONS.validation_required,\n\t\t\t);\n\t\t}\n\n\t\tconst intervalResult = await this.checkInterval(hctx, config);\n\t\tif (intervalResult) return intervalResult;\n\n\t\tconst changesResult = await this.checkForChanges(hctx);\n\t\tif (changesResult) return changesResult;\n\n\t\tconst prCiResult = await this.checkPRAndCI(hctx, config);\n\t\tif (prCiResult) return prCiResult;\n\n\t\thctx.log.info(\"All checks passed — allowing stop\");\n\t\treturn this.allow(\"passed\");\n\t}\n\n\t/**\n\t * Check if the run interval has elapsed.\n\t * Returns a StopHookResult to allow stop if interval hasn't elapsed, null to continue.\n\t */\n\tprivate async checkInterval(\n\t\thctx: HandlerCtx,\n\t\tconfig: StopHookConfig | null,\n\t): Promise<StopHookResult | null> {\n\t\tif (!config || config.run_interval_minutes <= 0) return null;\n\t\tconst intervalElapsed = await checkRunInterval(\n\t\t\thctx.logDir,\n\t\t\tconfig.run_interval_minutes,\n\t\t);\n\t\tif (!intervalElapsed) {\n\t\t\thctx.log.info(\n\t\t\t\t`Run interval (${config.run_interval_minutes} min) not elapsed — allowing stop`,\n\t\t\t);\n\t\t\treturn this.allow(\"interval_not_elapsed\", {\n\t\t\t\tintervalMinutes: config.run_interval_minutes,\n\t\t\t});\n\t\t}\n\t\treturn null;\n\t}\n\n\t/**\n\t * Check for changes since last passing run or vs base branch.\n\t * Returns a StopHookResult if action is needed, null to continue.\n\t */\n\tprivate async checkForChanges(\n\t\thctx: HandlerCtx,\n\t): Promise<StopHookResult | null> {\n\t\tconst changesResult = await hasChangesSinceLastRun(hctx.logDir);\n\t\tif (changesResult === null) {\n\t\t\tconst projectConfig = await readProjectConfig(hctx.cwd);\n\t\t\tconst rawBranch = projectConfig?.base_branch;\n\t\t\tconst baseBranch =\n\t\t\t\ttypeof rawBranch === \"string\" && rawBranch.length > 0\n\t\t\t\t\t? rawBranch\n\t\t\t\t\t: \"origin/main\";\n\t\t\tconst hasChanges = await hasChangesVsBaseBranch(hctx.cwd, baseBranch);\n\t\t\tif (hasChanges) {\n\t\t\t\thctx.log.info(\n\t\t\t\t\t\"Changes detected vs base branch (no prior state) — blocking\",\n\t\t\t\t);\n\t\t\t\treturn this.block(\n\t\t\t\t\t\"validation_required\",\n\t\t\t\t\tSKILL_INSTRUCTIONS.validation_required,\n\t\t\t\t);\n\t\t\t}\n\t\t\thctx.log.info(\"No changes vs base branch — allowing stop\");\n\t\t\treturn this.allow(\"passed\");\n\t\t}\n\t\tif (changesResult) {\n\t\t\thctx.log.info(\"Changes detected since last passing run — blocking\");\n\t\t\treturn this.block(\n\t\t\t\t\"validation_required\",\n\t\t\t\tSKILL_INSTRUCTIONS.validation_required,\n\t\t\t);\n\t\t}\n\t\treturn null;\n\t}\n\n\t/**\n\t * Check PR existence/push status and CI status.\n\t * Returns a StopHookResult if action is needed, null to continue.\n\t */\n\tprivate async checkPRAndCI(\n\t\thctx: HandlerCtx,\n\t\tconfig: StopHookConfig | null,\n\t): Promise<StopHookResult | null> {\n\t\tif (!config?.auto_push_pr) return null;\n\n\t\tconst prStatus = await checkPRStatus(hctx.cwd);\n\t\tif (prStatus.error) {\n\t\t\thctx.log.warn(\n\t\t\t\t`PR status check failed: ${prStatus.error} — allowing stop`,\n\t\t\t);\n\t\t\treturn null;\n\t\t}\n\t\tif (!prStatus.prExists || !prStatus.upToDate) {\n\t\t\thctx.log.info(\"PR missing or outdated — blocking with pr_push_required\");\n\t\t\treturn this.blockForPR(hctx);\n\t\t}\n\t\tif (!config?.auto_fix_pr) return null;\n\n\t\treturn this.checkCI(hctx);\n\t}\n\n\t/**\n\t * Block with PR push required, selecting the appropriate instruction\n\t * based on whether the last run had warnings.\n\t */\n\tprivate async blockForPR(hctx: HandlerCtx): Promise<StopHookResult> {\n\t\tconst lastStatus = await getLastRunStatus(hctx.logDir);\n\t\tconst instruction =\n\t\t\tlastStatus === \"passed_with_warnings\"\n\t\t\t\t? SKILL_INSTRUCTIONS.pr_push_required_with_warnings\n\t\t\t\t: SKILL_INSTRUCTIONS.pr_push_required;\n\t\treturn this.block(\"pr_push_required\", instruction);\n\t}\n\n\t/**\n\t * Check CI status and return block/allow result.\n\t */\n\tprivate async checkCI(hctx: HandlerCtx): Promise<StopHookResult | null> {\n\t\tconst ciResult = await checkCIStatus(hctx.cwd);\n\t\tif (ciResult.status === \"error\") {\n\t\t\thctx.log.warn(\n\t\t\t\t`CI status check failed: ${ciResult.error} — allowing stop`,\n\t\t\t);\n\t\t\treturn null;\n\t\t}\n\t\tif (ciResult.status === \"pending\") {\n\t\t\thctx.log.info(\"CI pending — blocking\");\n\t\t\treturn this.block(\"ci_pending\", SKILL_INSTRUCTIONS.ci_pending);\n\t\t}\n\t\tif (ciResult.status === \"failed\") {\n\t\t\thctx.log.info(\"CI failed — blocking\");\n\t\t\treturn this.block(\"ci_failed\", SKILL_INSTRUCTIONS.ci_failed);\n\t\t}\n\t\thctx.log.info(\"CI passed — allowing stop\");\n\t\treturn this.allow(\"ci_passed\");\n\t}\n\n\t/** Create a blocking result */\n\tprivate async block(\n\t\tstatus: GauntletStatus,\n\t\treason: string,\n\t): Promise<StopHookResult> {\n\t\tawait this.debugLogger?.logStopHook(\"block\", status);\n\t\treturn {\n\t\t\tstatus,\n\t\t\tshouldBlock: true,\n\t\t\treason,\n\t\t\tmessage: getStatusMessage(status),\n\t\t};\n\t}\n\n\t/** Create an allowing result */\n\tprivate async allow(\n\t\tstatus: GauntletStatus,\n\t\tcontext?: { intervalMinutes?: number },\n\t): Promise<StopHookResult> {\n\t\tawait this.debugLogger?.logStopHook(\"allow\", status);\n\t\treturn {\n\t\t\tstatus,\n\t\t\tshouldBlock: false,\n\t\t\tmessage: getStatusMessage(status, context),\n\t\t\tintervalMinutes: context?.intervalMinutes,\n\t\t};\n\t}\n}\n\n// Re-export types and functions for backward compatibility\nexport type { PRStatusResult };\nexport { checkPRStatus, shouldCheckPR };\n",
|
|
20
|
+
"import type {\n\tStopHookAdapter,\n\tStopHookContext,\n\tStopHookResult,\n} from \"./types.js\";\n\n/**\n * Claude Code hook response format.\n */\ninterface ClaudeHookResponse {\n\tdecision: \"block\" | \"approve\";\n\treason?: string;\n\tstopReason?: string;\n\tsystemMessage?: string;\n\tstatus: string;\n\tmessage?: string;\n}\n\n/**\n * Adapter for Claude Code stop hook protocol.\n *\n * Claude Code protocol:\n * - Input: { cwd, stop_hook_active, session_id, transcript_path, hook_event_name, permission_mode }\n * - Output: { decision: \"block\"|\"approve\", reason?, stopReason, systemMessage?, status, message }\n * - Block mechanism: decision: \"block\" with reason (fed back to Claude as prompt)\n * - Allow mechanism: decision: \"approve\"\n */\nexport class ClaudeStopHookAdapter implements StopHookAdapter {\n\tname = \"claude\";\n\n\t/**\n\t * Detect if this adapter should handle the given input.\n\t * Claude Code doesn't send cursor_version, so we detect by absence.\n\t */\n\tdetect(raw: Record<string, unknown>): boolean {\n\t\t// Claude Code doesn't send cursor_version\n\t\treturn !(\"cursor_version\" in raw);\n\t}\n\n\t/**\n\t * Parse Claude Code input into normalized context.\n\t */\n\tparseInput(raw: Record<string, unknown>): StopHookContext {\n\t\treturn {\n\t\t\tcwd: (raw.cwd as string) ?? process.cwd(),\n\t\t\tisNestedHook: raw.stop_hook_active === true,\n\t\t\tsessionId: raw.session_id as string | undefined,\n\t\t\trawInput: raw,\n\t\t};\n\t}\n\n\t/**\n\t * Get the block reason for a given result based on status.\n\t */\n\tprivate getBlockReason(result: StopHookResult): string | undefined {\n\t\treturn result.reason;\n\t}\n\n\t/**\n\t * Format handler result into Claude Code protocol output.\n\t */\n\tformatOutput(result: StopHookResult): string {\n\t\tconst blockReason = this.getBlockReason(result);\n\t\tconst stopReason =\n\t\t\tresult.shouldBlock && blockReason ? blockReason : result.message;\n\n\t\tconst response: ClaudeHookResponse = {\n\t\t\tdecision: result.shouldBlock ? \"block\" : \"approve\",\n\t\t\tstatus: result.status,\n\t\t};\n\n\t\tif (stopReason) response.stopReason = stopReason;\n\t\tif (result.message) {\n\t\t\tresponse.systemMessage = result.message;\n\t\t\tresponse.message = result.message;\n\t\t}\n\t\tif (result.shouldBlock && blockReason) {\n\t\t\tresponse.reason = blockReason;\n\t\t}\n\n\t\treturn JSON.stringify(response);\n\t}\n\n\t/**\n\t * Check if execution should be skipped based on Claude-specific conditions.\n\t * Note: stop_hook_active from stdin is currently disabled in the main entry point\n\t * because Claude Code sends it after blocking twice, but we need to re-run.\n\t */\n\tshouldSkipExecution(_ctx: StopHookContext): StopHookResult | null {\n\t\t// The isNestedHook check is handled at the entry point level\n\t\t// via the marker file mechanism, not here.\n\t\t// This method is available for future protocol-specific skip conditions.\n\t\treturn null;\n\t}\n}\n",
|
|
21
|
+
"import type {\n\tStopHookAdapter,\n\tStopHookContext,\n\tStopHookResult,\n} from \"./types.js\";\n\n/**\n * Cursor hook response format.\n * - Empty object {} = allow stop (no feedback)\n * - { systemMessage: \"...\" } = allow stop with user-visible message\n * - { followup_message: \"...\" } = block stop and continue with message\n */\ninterface CursorHookResponse {\n\tfollowup_message?: string;\n\tsystemMessage?: string;\n}\n\n/**\n * Default maximum loop count before allowing stop.\n * Cursor has built-in loop_limit (default 5, configurable in hooks.json),\n * but we provide defense-in-depth with our own check.\n */\nconst DEFAULT_MAX_LOOPS = 10;\n\n/**\n * Adapter for Cursor IDE stop hook protocol.\n *\n * Cursor protocol:\n * - Input: { status, loop_count, cursor_version, workspace_roots, conversation_id, ... }\n * - Output: { followup_message?: \"...\" } or {}\n * - Block mechanism: { followup_message: \"instructions\" } - continues agent with message\n * - Allow mechanism: {} (empty object) - allows stop\n * - Loop prevention: loop_count field (Cursor has built-in loop_limit)\n */\nexport class CursorStopHookAdapter implements StopHookAdapter {\n\tname = \"cursor\";\n\n\t/**\n\t * Maximum loop count before forcing stop.\n\t * Can be configured via hooks.json loop_limit.\n\t */\n\tprivate maxLoops: number;\n\n\tconstructor(maxLoops: number = DEFAULT_MAX_LOOPS) {\n\t\tthis.maxLoops = maxLoops;\n\t}\n\n\t/**\n\t * Detect if this adapter should handle the given input.\n\t * Cursor sends cursor_version in hook input.\n\t */\n\tdetect(raw: Record<string, unknown>): boolean {\n\t\treturn \"cursor_version\" in raw;\n\t}\n\n\t/**\n\t * Parse Cursor input into normalized context.\n\t */\n\tparseInput(raw: Record<string, unknown>): StopHookContext {\n\t\tconst workspaceRoots = raw.workspace_roots;\n\t\tconst loopCount = raw.loop_count as number | undefined;\n\n\t\treturn {\n\t\t\tcwd:\n\t\t\t\t(Array.isArray(workspaceRoots) ? workspaceRoots[0] : null) ??\n\t\t\t\tprocess.cwd(),\n\t\t\tisNestedHook: false, // Cursor uses loop_count instead of nested hook flag\n\t\t\tloopCount,\n\t\t\tsessionId: raw.conversation_id as string | undefined,\n\t\t\trawInput: raw,\n\t\t};\n\t}\n\n\t/**\n\t * Get the block message for a given result based on status.\n\t */\n\tprivate getBlockMessage(result: StopHookResult): string {\n\t\treturn result.reason || result.message;\n\t}\n\n\t/**\n\t * Format handler result into Cursor protocol output.\n\t */\n\tformatOutput(result: StopHookResult): string {\n\t\tif (result.shouldBlock) {\n\t\t\tconst response: CursorHookResponse = {\n\t\t\t\tfollowup_message: this.getBlockMessage(result),\n\t\t\t};\n\t\t\treturn JSON.stringify(response);\n\t\t}\n\n\t\t// Include systemMessage for user feedback even when not blocking\n\t\tconst response: CursorHookResponse = {\n\t\t\t...(result.message ? { systemMessage: result.message } : {}),\n\t\t};\n\t\treturn JSON.stringify(response);\n\t}\n\n\t/**\n\t * Check if execution should be skipped based on Cursor-specific conditions.\n\t * Returns early if loop_count exceeds threshold.\n\t */\n\tshouldSkipExecution(ctx: StopHookContext): StopHookResult | null {\n\t\t// Cursor has built-in loop_limit (default 5), but we can check here too\n\t\t// for defense-in-depth\n\t\tif (ctx.loopCount !== undefined && ctx.loopCount >= this.maxLoops) {\n\t\t\treturn {\n\t\t\t\tstatus: \"retry_limit_exceeded\",\n\t\t\t\tshouldBlock: false,\n\t\t\t\tmessage:\n\t\t\t\t\t\"Loop limit reached — run `agent-gauntlet clean` to archive and continue.\",\n\t\t\t};\n\t\t}\n\t\treturn null;\n\t}\n}\n",
|
|
22
|
+
"import { execFile } from \"node:child_process\";\nimport fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { promisify } from \"node:util\";\nimport YAML from \"yaml\";\nimport { loadGlobalConfig } from \"../config/global.js\";\nimport type { StopHookConfig } from \"../config/stop-hook-config.js\";\nimport { resolveStopHookConfig } from \"../config/stop-hook-config.js\";\nimport { getCategoryLogger } from \"../output/app-logger.js\";\nimport type { GauntletStatus } from \"../types/gauntlet-status.js\";\nimport type { DebugLogger } from \"../utils/debug-log.js\";\nimport type {\n\tPRStatusResult,\n\tStopHookContext,\n\tStopHookResult,\n} from \"./adapters/types.js\";\nimport {\n\tcheckRunInterval,\n\tgetLastRunStatus,\n\thasChangesSinceLastRun,\n\thasChangesVsBaseBranch,\n\thasFailedRunLogs,\n} from \"./stop-hook-state.js\";\n\nconst execFileAsync = promisify(execFile);\n\ninterface MinimalConfig {\n\tlog_dir?: string;\n\tdebug_log?: {\n\t\tenabled?: boolean;\n\t\tmax_size_mb?: number;\n\t};\n\tstop_hook?: {\n\t\tauto_push_pr?: boolean;\n\t\tauto_fix_pr?: boolean;\n\t};\n\tbase_branch?: string;\n}\n\n/**\n * Internal context passed to private handler methods.\n */\ninterface HandlerCtx {\n\tlogDir: string;\n\tcwd: string;\n\tlog: ReturnType<typeof getStopHookLogger>;\n}\n\n/**\n * Default log directory when config doesn't specify one.\n */\nconst DEFAULT_LOG_DIR = \"gauntlet_logs\";\n\n/**\n * Skill instructions returned as the `reason` field when blocking stop.\n * These are concise directives — the skills contain full workflow logic.\n */\nconst SKILL_INSTRUCTIONS = {\n\tvalidation_required:\n\t\t\"Changes detected, you must use the `gauntlet-run` skill to validate them now.\",\n\tpr_push_required:\n\t\t\"Gauntlet passed. You must use the `gauntlet-push-pr` skill to create or update your pull request.\",\n\tpr_push_required_with_warnings:\n\t\t\"Gauntlet passed with warnings (some issues were skipped). You must use the `gauntlet-push-pr` skill to create or update your pull request. Include a summary of skipped issues in the PR description.\",\n\tci_pending:\n\t\t\"PR is up to date but CI checks are still running. You must use the `gauntlet-fix-pr` skill to poll CI status until checks complete, then fix any failures.\",\n\tci_failed:\n\t\t\"PR is up to date but CI checks have failed. You must use the `gauntlet-fix-pr` skill to check which CI checks failed, fix the issues, and push.\",\n} as const;\n\n/**\n * Read and parse the project config file.\n * Returns undefined if the file doesn't exist or can't be parsed.\n */\nasync function readProjectConfig(\n\tprojectCwd: string,\n): Promise<MinimalConfig | undefined> {\n\ttry {\n\t\tconst configPath = path.join(projectCwd, \".gauntlet\", \"config.yml\");\n\t\tconst content = await fs.readFile(configPath, \"utf-8\");\n\t\treturn YAML.parse(content) as MinimalConfig;\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\n/**\n * Get a logger for stop-hook operations.\n */\nfunction getStopHookLogger() {\n\treturn getCategoryLogger(\"stop-hook\");\n}\n\n/**\n * Static status messages for statuses that don't need dynamic context.\n */\nconst STATUS_MESSAGES: Record<string, string> = {\n\tpassed: \"✓ Gauntlet passed — all gates completed successfully.\",\n\tpassed_with_warnings:\n\t\t\"✓ Gauntlet completed — passed with warnings (some issues were skipped).\",\n\tno_applicable_gates:\n\t\t\"✓ Gauntlet passed — no applicable gates matched current changes.\",\n\tno_changes: \"✓ Gauntlet passed — no changes detected.\",\n\tretry_limit_exceeded:\n\t\t\"⚠ Gauntlet terminated — retry limit exceeded. Run `agent-gauntlet clean` to archive and continue.\",\n\tlock_conflict:\n\t\t\"⏭ Gauntlet skipped — another gauntlet run is already in progress.\",\n\tfailed: \"✗ Gauntlet failed — issues must be fixed before stopping.\",\n\tpr_push_required:\n\t\t\"✓ Gauntlet passed — PR needs to be created or updated before stopping.\",\n\tci_pending: \"⏳ CI checks still running — waiting for completion.\",\n\tci_failed: \"✗ CI failed or review changes requested — fix issues and push.\",\n\tci_passed: \"✓ CI passed — all checks completed and no blocking reviews.\",\n\tvalidation_required:\n\t\t\"✗ Validation required — changes detected that need validation before stopping.\",\n\tno_config: \"○ Not a gauntlet project — no .gauntlet/config.yml found.\",\n\tstop_hook_active:\n\t\t\"↺ Stop hook cycle detected — allowing stop to prevent infinite loop.\",\n\tloop_detected:\n\t\t\"↺ Loop detected — stop hook blocked 3 times within 60s. Allowing stop to prevent infinite loop.\",\n\tstop_hook_disabled: \"\",\n\tinvalid_input: \"⚠ Invalid hook input — could not parse JSON, allowing stop.\",\n};\n\n/**\n * Get a human-friendly message for each status code.\n * These messages explain why the stop was approved or blocked.\n */\nexport function getStatusMessage(\n\tstatus: GauntletStatus,\n\tcontext?: { intervalMinutes?: number; errorMessage?: string },\n): string {\n\t// Handle statuses that need dynamic context\n\tif (status === \"interval_not_elapsed\") {\n\t\treturn context?.intervalMinutes\n\t\t\t? `⏭ Gauntlet skipped — run interval (${context.intervalMinutes} min) not elapsed since last run.`\n\t\t\t: \"⏭ Gauntlet skipped — run interval not elapsed since last run.\";\n\t}\n\n\tif (status === \"error\") {\n\t\treturn context?.errorMessage\n\t\t\t? `⚠ Stop hook error — ${context.errorMessage}`\n\t\t\t: \"⚠ Stop hook error — unexpected error occurred.\";\n\t}\n\n\t// Use static lookup for all other statuses\n\treturn STATUS_MESSAGES[status] ?? `Unknown status: ${status}`;\n}\n\n/**\n * Read the log_dir from project config without full validation.\n */\nexport async function getLogDir(projectCwd: string): Promise<string> {\n\tconst config = await readProjectConfig(projectCwd);\n\treturn config?.log_dir || DEFAULT_LOG_DIR;\n}\n\n/**\n * Read the debug_log config from project config without full validation.\n */\nexport async function getDebugLogConfig(\n\tprojectCwd: string,\n): Promise<MinimalConfig[\"debug_log\"]> {\n\tconst config = await readProjectConfig(projectCwd);\n\treturn config?.debug_log;\n}\n\n/**\n * Get resolved stop hook config with 3-tier precedence.\n */\nasync function getResolvedStopHookConfig(\n\tprojectCwd: string,\n): Promise<StopHookConfig | null> {\n\ttry {\n\t\tconst configPath = path.join(projectCwd, \".gauntlet\", \"config.yml\");\n\t\tconst content = await fs.readFile(configPath, \"utf-8\");\n\t\tconst raw = YAML.parse(content) as { stop_hook?: Record<string, unknown> };\n\t\tconst projectStopHookConfig = raw?.stop_hook as\n\t\t\t| { auto_push_pr?: boolean; auto_fix_pr?: boolean }\n\t\t\t| undefined;\n\t\tconst globalConfig = await loadGlobalConfig();\n\t\treturn resolveStopHookConfig(projectStopHookConfig, globalConfig);\n\t} catch {\n\t\treturn null;\n\t}\n}\n\n/**\n * Check if we should verify PR status after gates pass.\n * Loads stop hook config with 3-tier precedence and checks auto_push_pr.\n */\nasync function shouldCheckPR(projectCwd: string): Promise<boolean> {\n\tconst config = await getResolvedStopHookConfig(projectCwd);\n\treturn config?.auto_push_pr ?? false;\n}\n\n/**\n * Check PR existence and whether local commits have been pushed.\n *\n * Uses `gh pr view` to get PR info and compares head SHA with local HEAD.\n * Gracefully degrades if `gh` is not installed or any error occurs.\n */\nasync function checkPRStatus(cwd: string): Promise<PRStatusResult> {\n\ttry {\n\t\t// Check if gh CLI is available\n\t\ttry {\n\t\t\tawait execFileAsync(\"gh\", [\"--version\"], { cwd });\n\t\t} catch {\n\t\t\treturn {\n\t\t\t\tprExists: false,\n\t\t\t\tupToDate: false,\n\t\t\t\terror: \"gh CLI not installed\",\n\t\t\t};\n\t\t}\n\n\t\t// Get PR info for current branch\n\t\tlet prInfo: { number: number; state: string; headRefOid: string };\n\t\ttry {\n\t\t\tconst { stdout } = await execFileAsync(\n\t\t\t\t\"gh\",\n\t\t\t\t[\"pr\", \"view\", \"--json\", \"number,state,headRefOid\"],\n\t\t\t\t{ cwd },\n\t\t\t);\n\t\t\tprInfo = JSON.parse(stdout.trim());\n\t\t} catch (e: unknown) {\n\t\t\tconst errMsg = (e as { message?: string }).message ?? \"unknown\";\n\t\t\t// gh pr view exits with code 1 and specific message when no PR exists\n\t\t\tif (\n\t\t\t\terrMsg.includes(\"no pull requests found\") ||\n\t\t\t\terrMsg.includes(\"Could not resolve\")\n\t\t\t) {\n\t\t\t\treturn { prExists: false, upToDate: false };\n\t\t\t}\n\t\t\t// Other failures (network, auth, etc.) — return error for graceful degradation\n\t\t\treturn {\n\t\t\t\tprExists: false,\n\t\t\t\tupToDate: false,\n\t\t\t\terror: `gh pr view failed: ${errMsg}`,\n\t\t\t};\n\t\t}\n\n\t\t// Only consider OPEN PRs - closed/merged PRs should not block stop\n\t\tif (prInfo.state !== \"OPEN\") {\n\t\t\treturn { prExists: false, upToDate: false };\n\t\t}\n\n\t\t// Get local HEAD SHA\n\t\tconst { stdout: localHead } = await execFileAsync(\n\t\t\t\"git\",\n\t\t\t[\"rev-parse\", \"HEAD\"],\n\t\t\t{ cwd },\n\t\t);\n\t\tconst localSha = localHead.trim();\n\n\t\tconst upToDate = prInfo.headRefOid === localSha;\n\t\treturn {\n\t\t\tprExists: true,\n\t\t\tupToDate,\n\t\t\tprNumber: prInfo.number,\n\t\t};\n\t} catch (error: unknown) {\n\t\tconst errMsg = (error as { message?: string }).message ?? \"unknown\";\n\t\treturn {\n\t\t\tprExists: false,\n\t\t\tupToDate: false,\n\t\t\terror: `PR status check failed: ${errMsg}`,\n\t\t};\n\t}\n}\n\n/**\n * Check CI status for the current branch's PR via a single `gh pr checks` read.\n * No polling loop, no cross-invocation state. Returns status immediately.\n */\nexport async function checkCIStatus(cwd: string): Promise<{\n\tstatus: \"passed\" | \"pending\" | \"failed\" | \"error\";\n\terror?: string;\n}> {\n\ttry {\n\t\tconst { stdout } = await execFileAsync(\n\t\t\t\"gh\",\n\t\t\t[\"pr\", \"checks\", \"--json\", \"name,state\"],\n\t\t\t{ cwd },\n\t\t);\n\n\t\tconst checks = JSON.parse(stdout.trim()) as Array<{\n\t\t\tname: string;\n\t\t\tstate: string;\n\t\t}>;\n\n\t\tif (checks.length === 0) {\n\t\t\t// No checks configured — treat as passed\n\t\t\treturn { status: \"passed\" };\n\t\t}\n\n\t\tconst hasFailed = checks.some(\n\t\t\t(c) => c.state === \"FAILURE\" || c.state === \"ERROR\",\n\t\t);\n\t\tif (hasFailed) return { status: \"failed\" };\n\n\t\tconst hasPending = checks.some(\n\t\t\t(c) => c.state === \"PENDING\" || c.state === \"EXPECTED\",\n\t\t);\n\t\tif (hasPending) return { status: \"pending\" };\n\n\t\treturn { status: \"passed\" };\n\t} catch (e: unknown) {\n\t\tconst errMsg = (e as { message?: string }).message ?? \"unknown\";\n\t\treturn { status: \"error\", error: errMsg };\n\t}\n}\n\n/**\n * Core stop hook handler that reads state and determines whether to block stop.\n * Protocol-agnostic: works with any adapter that provides a StopHookContext.\n *\n * This handler is stateless — it only READS state (logs, execution state,\n * PR status, CI status) and returns skill instructions. It never executes\n * gates, polls CI, or tracks attempts.\n */\nexport class StopHookHandler {\n\tprivate debugLogger?: DebugLogger;\n\tprivate logDir?: string;\n\n\tconstructor(debugLogger?: DebugLogger) {\n\t\tthis.debugLogger = debugLogger;\n\t}\n\n\t/**\n\t * Set the debug logger (can be updated after construction).\n\t */\n\tsetDebugLogger(debugLogger: DebugLogger): void {\n\t\tthis.debugLogger = debugLogger;\n\t}\n\n\t/**\n\t * Set the log directory (needed for state reads).\n\t */\n\tsetLogDir(logDir: string): void {\n\t\tthis.logDir = logDir;\n\t}\n\n\t/**\n\t * Read state and determine whether to block the stop.\n\t * Returns a skill instruction when blocking, or allows the stop.\n\t */\n\tasync execute(ctx: StopHookContext): Promise<StopHookResult> {\n\t\tconst logDir = this.logDir;\n\n\t\tif (!logDir) {\n\t\t\treturn this.allow(\"passed\");\n\t\t}\n\n\t\tconst hctx: HandlerCtx = {\n\t\t\tlogDir,\n\t\t\tcwd: ctx.cwd,\n\t\t\tlog: getStopHookLogger(),\n\t\t};\n\n\t\tconst config = await getResolvedStopHookConfig(hctx.cwd);\n\n\t\tif (config?.enabled === false) {\n\t\t\treturn this.allow(\"stop_hook_disabled\");\n\t\t}\n\n\t\tif (await hasFailedRunLogs(logDir)) {\n\t\t\thctx.log.info(\n\t\t\t\t\"Failed run logs found — blocking with validation_required\",\n\t\t\t);\n\t\t\treturn this.block(\n\t\t\t\t\"validation_required\",\n\t\t\t\tSKILL_INSTRUCTIONS.validation_required,\n\t\t\t);\n\t\t}\n\n\t\tconst intervalResult = await this.checkInterval(hctx, config);\n\t\tif (intervalResult) return intervalResult;\n\n\t\tconst changesResult = await this.checkForChanges(hctx);\n\t\tif (changesResult) return changesResult;\n\n\t\tconst prCiResult = await this.checkPRAndCI(hctx, config);\n\t\tif (prCiResult) return prCiResult;\n\n\t\thctx.log.info(\"All checks passed — allowing stop\");\n\t\treturn this.allow(\"passed\");\n\t}\n\n\t/**\n\t * Check if the run interval has elapsed.\n\t * Returns a StopHookResult to allow stop if interval hasn't elapsed, null to continue.\n\t */\n\tprivate async checkInterval(\n\t\thctx: HandlerCtx,\n\t\tconfig: StopHookConfig | null,\n\t): Promise<StopHookResult | null> {\n\t\tif (!config || config.run_interval_minutes <= 0) return null;\n\t\tconst intervalElapsed = await checkRunInterval(\n\t\t\thctx.logDir,\n\t\t\tconfig.run_interval_minutes,\n\t\t);\n\t\tif (!intervalElapsed) {\n\t\t\thctx.log.info(\n\t\t\t\t`Run interval (${config.run_interval_minutes} min) not elapsed — allowing stop`,\n\t\t\t);\n\t\t\treturn this.allow(\"interval_not_elapsed\", {\n\t\t\t\tintervalMinutes: config.run_interval_minutes,\n\t\t\t});\n\t\t}\n\t\treturn null;\n\t}\n\n\t/**\n\t * Check for changes since last passing run or vs base branch.\n\t * Returns a StopHookResult if action is needed, null to continue.\n\t */\n\tprivate async checkForChanges(\n\t\thctx: HandlerCtx,\n\t): Promise<StopHookResult | null> {\n\t\tconst changesResult = await hasChangesSinceLastRun(hctx.logDir);\n\t\tif (changesResult === null) {\n\t\t\tconst projectConfig = await readProjectConfig(hctx.cwd);\n\t\t\tconst rawBranch = projectConfig?.base_branch;\n\t\t\tconst baseBranch =\n\t\t\t\ttypeof rawBranch === \"string\" && rawBranch.length > 0\n\t\t\t\t\t? rawBranch\n\t\t\t\t\t: \"origin/main\";\n\t\t\tconst hasChanges = await hasChangesVsBaseBranch(hctx.cwd, baseBranch);\n\t\t\tif (hasChanges) {\n\t\t\t\thctx.log.info(\n\t\t\t\t\t\"Changes detected vs base branch (no prior state) — blocking\",\n\t\t\t\t);\n\t\t\t\treturn this.block(\n\t\t\t\t\t\"validation_required\",\n\t\t\t\t\tSKILL_INSTRUCTIONS.validation_required,\n\t\t\t\t);\n\t\t\t}\n\t\t\thctx.log.info(\"No changes vs base branch — allowing stop\");\n\t\t\treturn this.allow(\"passed\");\n\t\t}\n\t\tif (changesResult) {\n\t\t\thctx.log.info(\"Changes detected since last passing run — blocking\");\n\t\t\treturn this.block(\n\t\t\t\t\"validation_required\",\n\t\t\t\tSKILL_INSTRUCTIONS.validation_required,\n\t\t\t);\n\t\t}\n\t\treturn null;\n\t}\n\n\t/**\n\t * Check PR existence/push status and CI status.\n\t * Returns a StopHookResult if action is needed, null to continue.\n\t */\n\tprivate async checkPRAndCI(\n\t\thctx: HandlerCtx,\n\t\tconfig: StopHookConfig | null,\n\t): Promise<StopHookResult | null> {\n\t\tif (!config?.auto_push_pr) return null;\n\n\t\tconst prStatus = await checkPRStatus(hctx.cwd);\n\t\tif (prStatus.error) {\n\t\t\thctx.log.warn(\n\t\t\t\t`PR status check failed: ${prStatus.error} — allowing stop`,\n\t\t\t);\n\t\t\treturn null;\n\t\t}\n\t\tif (!prStatus.prExists || !prStatus.upToDate) {\n\t\t\thctx.log.info(\"PR missing or outdated — blocking with pr_push_required\");\n\t\t\treturn this.blockForPR(hctx);\n\t\t}\n\t\tif (!config?.auto_fix_pr) return null;\n\n\t\treturn this.checkCI(hctx);\n\t}\n\n\t/**\n\t * Block with PR push required, selecting the appropriate instruction\n\t * based on whether the last run had warnings.\n\t */\n\tprivate async blockForPR(hctx: HandlerCtx): Promise<StopHookResult> {\n\t\tconst lastStatus = await getLastRunStatus(hctx.logDir);\n\t\tconst instruction =\n\t\t\tlastStatus === \"passed_with_warnings\"\n\t\t\t\t? SKILL_INSTRUCTIONS.pr_push_required_with_warnings\n\t\t\t\t: SKILL_INSTRUCTIONS.pr_push_required;\n\t\treturn this.block(\"pr_push_required\", instruction);\n\t}\n\n\t/**\n\t * Check CI status and return block/allow result.\n\t */\n\tprivate async checkCI(hctx: HandlerCtx): Promise<StopHookResult | null> {\n\t\tconst ciResult = await checkCIStatus(hctx.cwd);\n\t\tif (ciResult.status === \"error\") {\n\t\t\thctx.log.warn(\n\t\t\t\t`CI status check failed: ${ciResult.error} — allowing stop`,\n\t\t\t);\n\t\t\treturn null;\n\t\t}\n\t\tif (ciResult.status === \"pending\") {\n\t\t\thctx.log.info(\"CI pending — blocking\");\n\t\t\treturn this.block(\"ci_pending\", SKILL_INSTRUCTIONS.ci_pending);\n\t\t}\n\t\tif (ciResult.status === \"failed\") {\n\t\t\thctx.log.info(\"CI failed — blocking\");\n\t\t\treturn this.block(\"ci_failed\", SKILL_INSTRUCTIONS.ci_failed);\n\t\t}\n\t\thctx.log.info(\"CI passed — allowing stop\");\n\t\treturn this.allow(\"ci_passed\");\n\t}\n\n\t/** Create a blocking result */\n\tprivate async block(\n\t\tstatus: GauntletStatus,\n\t\treason: string,\n\t): Promise<StopHookResult> {\n\t\tawait this.debugLogger?.logStopHook(\"block\", status);\n\t\treturn {\n\t\t\tstatus,\n\t\t\tshouldBlock: true,\n\t\t\treason,\n\t\t\tmessage: getStatusMessage(status),\n\t\t};\n\t}\n\n\t/** Create an allowing result */\n\tprivate async allow(\n\t\tstatus: GauntletStatus,\n\t\tcontext?: { intervalMinutes?: number },\n\t): Promise<StopHookResult> {\n\t\tawait this.debugLogger?.logStopHook(\"allow\", status);\n\t\treturn {\n\t\t\tstatus,\n\t\t\tshouldBlock: false,\n\t\t\tmessage: getStatusMessage(status, context),\n\t\t\tintervalMinutes: context?.intervalMinutes,\n\t\t};\n\t}\n}\n\n// Re-export types and functions for backward compatibility\nexport type { PRStatusResult };\nexport { checkPRStatus, shouldCheckPR };\n",
|
|
23
23
|
"import type { z } from \"zod\";\nimport type { GlobalConfig } from \"./global.js\";\nimport type { stopHookConfigSchema } from \"./schema.js\";\n\n/**\n * Environment variable names for stop hook configuration.\n */\nexport const GAUNTLET_STOP_HOOK_ENABLED = \"GAUNTLET_STOP_HOOK_ENABLED\";\nexport const GAUNTLET_STOP_HOOK_INTERVAL_MINUTES =\n\t\"GAUNTLET_STOP_HOOK_INTERVAL_MINUTES\";\nexport const GAUNTLET_AUTO_PUSH_PR = \"GAUNTLET_AUTO_PUSH_PR\";\nexport const GAUNTLET_AUTO_FIX_PR = \"GAUNTLET_AUTO_FIX_PR\";\n\n/**\n * Resolved stop hook configuration.\n */\nexport interface StopHookConfig {\n\tenabled: boolean;\n\trun_interval_minutes: number;\n\tauto_push_pr: boolean;\n\tauto_fix_pr: boolean;\n}\n\ntype ProjectStopHookConfig = z.infer<typeof stopHookConfigSchema> | undefined;\n\n/**\n * Parse a boolean environment variable (accepts \"true\", \"1\", \"false\", \"0\").\n * Returns undefined for unset or invalid values.\n */\nfunction parseBooleanEnv(envVar: string | undefined): boolean | undefined {\n\tif (envVar === undefined) return undefined;\n\tconst normalized = envVar.toLowerCase().trim();\n\tif (normalized === \"true\" || normalized === \"1\") return true;\n\tif (normalized === \"false\" || normalized === \"0\") return false;\n\treturn undefined;\n}\n\n/**\n * Parse an integer environment variable (accepts non-negative integers only).\n * Returns undefined for unset or invalid values.\n */\nfunction parseIntegerEnv(envVar: string | undefined): number | undefined {\n\tif (envVar === undefined) return undefined;\n\tconst normalized = envVar.trim();\n\tconst parsed = Number(normalized);\n\tif (normalized.length > 0 && Number.isInteger(parsed) && parsed >= 0) {\n\t\treturn parsed;\n\t}\n\treturn undefined;\n}\n\n/**\n * Parse environment variables for stop hook configuration.\n * Returns undefined for fields that are not set or have invalid values.\n */\nexport function parseStopHookEnvVars(): {\n\tenabled?: boolean;\n\trun_interval_minutes?: number;\n\tauto_push_pr?: boolean;\n\tauto_fix_pr?: boolean;\n} {\n\treturn {\n\t\tenabled: parseBooleanEnv(process.env[GAUNTLET_STOP_HOOK_ENABLED]),\n\t\trun_interval_minutes: parseIntegerEnv(\n\t\t\tprocess.env[GAUNTLET_STOP_HOOK_INTERVAL_MINUTES],\n\t\t),\n\t\tauto_push_pr: parseBooleanEnv(process.env[GAUNTLET_AUTO_PUSH_PR]),\n\t\tauto_fix_pr: parseBooleanEnv(process.env[GAUNTLET_AUTO_FIX_PR]),\n\t};\n}\n\n/**\n * Resolve a single config field with 3-tier precedence: env > project > global.\n */\nfunction resolveField<T>(\n\tenvValue: T | undefined,\n\tprojectValue: T | undefined,\n\tglobalValue: T,\n): T {\n\tif (envValue !== undefined) return envValue;\n\tif (projectValue !== undefined) return projectValue;\n\treturn globalValue;\n}\n\n/**\n * Resolve stop hook configuration from three sources with precedence:\n * 1. Environment variables (highest)\n * 2. Project config (.gauntlet/config.yml)\n * 3. Global config (~/.config/agent-gauntlet/config.yml) (lowest)\n *\n * Each field is resolved independently.\n */\nexport function resolveStopHookConfig(\n\tprojectConfig: ProjectStopHookConfig,\n\tglobalConfig: GlobalConfig,\n): StopHookConfig {\n\tconst envVars = parseStopHookEnvVars();\n\tconst globalStop = globalConfig.stop_hook;\n\n\tconst enabled = resolveField(\n\t\tenvVars.enabled,\n\t\tprojectConfig?.enabled,\n\t\tglobalStop.enabled,\n\t);\n\tconst run_interval_minutes = resolveField(\n\t\tenvVars.run_interval_minutes,\n\t\tprojectConfig?.run_interval_minutes,\n\t\tglobalStop.run_interval_minutes,\n\t);\n\tconst auto_push_pr = resolveField(\n\t\tenvVars.auto_push_pr,\n\t\tprojectConfig?.auto_push_pr,\n\t\tglobalStop.auto_push_pr,\n\t);\n\tlet auto_fix_pr = resolveField(\n\t\tenvVars.auto_fix_pr,\n\t\tprojectConfig?.auto_fix_pr,\n\t\tglobalStop.auto_fix_pr,\n\t);\n\n\t// Validation: auto_fix_pr requires auto_push_pr\n\tif (auto_fix_pr && !auto_push_pr) {\n\t\tconsole.error(\n\t\t\t\"[gauntlet] Warning: auto_fix_pr=true requires auto_push_pr=true. Treating auto_fix_pr as false.\",\n\t\t);\n\t\tauto_fix_pr = false;\n\t}\n\n\treturn { enabled, run_interval_minutes, auto_push_pr, auto_fix_pr };\n}\n",
|
|
24
24
|
"import fs from \"node:fs\";\nimport fsPromises from \"node:fs/promises\";\nimport path from \"node:path\";\nimport {\n\tconfigure,\n\tgetLogger,\n\ttype LogRecord,\n\ttype Logger as LogTapeLogger,\n} from \"@logtape/logtape\";\nimport { createConsoleSink } from \"./sinks/console-sink.js\";\n\n/**\n * Logger modes that determine sink configuration:\n * - \"interactive\": Console output to stderr (file capture via console-log.ts)\n * - \"stop-hook\": NO console output (JSON protocol on stdout must be clean)\n * - \"ci\": Console output to stderr\n */\nexport type LoggerMode = \"interactive\" | \"stop-hook\" | \"ci\";\n\n/**\n * Log level options.\n */\nexport type LogLevel = \"debug\" | \"info\" | \"warning\" | \"error\";\n\n/**\n * App logger configuration options.\n */\nexport interface AppLoggerConfig {\n\tmode: LoggerMode;\n\tlogDir?: string;\n\tlevel?: LogLevel;\n\tdebugLog?: {\n\t\tenabled: boolean;\n\t\tmaxSizeMb?: number;\n\t};\n}\n\n// Global state for cleanup (file descriptor for debug log, configuration flag)\nlet debugLogFd: number | null = null;\nlet isConfigured = false;\n\n/**\n * Safely serialize a value, handling circular references.\n */\nfunction safeStringify(value: unknown): string {\n\ttry {\n\t\treturn JSON.stringify(value);\n\t} catch {\n\t\treturn \"[Unserializable]\";\n\t}\n}\n\n/**\n * Create a debug log sink that writes to .debug.log file.\n * Format matches existing DebugLogger: [ISO_TIMESTAMP] message\n */\nfunction createDebugLogSink(logDir: string): (record: LogRecord) => void {\n\tconst debugLogPath = path.join(logDir, \".debug.log\");\n\n\t// Open file for append\n\tdebugLogFd = fs.openSync(\n\t\tdebugLogPath,\n\t\tfs.constants.O_WRONLY | fs.constants.O_CREAT | fs.constants.O_APPEND,\n\t);\n\n\treturn (record: LogRecord) => {\n\t\tif (debugLogFd === null) return;\n\n\t\tconst timestamp = new Date(record.timestamp).toISOString();\n\t\tconst level = record.level.toUpperCase();\n\t\tconst category = record.category.join(\".\");\n\t\tconst message = record.message\n\t\t\t.map((part) => (typeof part === \"string\" ? part : safeStringify(part)))\n\t\t\t.join(\"\");\n\n\t\tconst line = `[${timestamp}] ${level} [${category}] ${message}\\n`;\n\n\t\ttry {\n\t\t\tfs.writeSync(debugLogFd, line);\n\t\t} catch {\n\t\t\t// Suppress write errors\n\t\t}\n\t};\n}\n\n/**\n * Initialize the application logger with LogTape.\n *\n * IMPORTANT: In stop-hook mode, NO console output is generated.\n * stdout must remain clean for the JSON protocol response.\n * File logging is handled separately by console-log.ts which captures stderr.\n *\n * @param config - Logger configuration\n * @returns Promise that resolves when logger is configured\n */\nexport async function initLogger(config: AppLoggerConfig): Promise<void> {\n\t// Reset if already configured\n\tif (isConfigured) {\n\t\tawait resetLogger();\n\t}\n\n\tconst { mode, level = \"info\", logDir, debugLog } = config;\n\n\t// Ensure log directory exists if we need it for debug log\n\tif (logDir && debugLog?.enabled) {\n\t\tawait fsPromises.mkdir(logDir, { recursive: true });\n\t}\n\n\t// Build sink configuration\n\tconst sinks: Record<string, (record: LogRecord) => void> = {};\n\tconst activeSinks: string[] = [];\n\n\t// Console sink (only for interactive and ci modes)\n\t// Outputs to stderr, which gets captured by console-log.ts\n\tif (mode !== \"stop-hook\") {\n\t\tsinks.console = createConsoleSink();\n\t\tactiveSinks.push(\"console\");\n\t}\n\n\t// Debug log sink (writes directly to .debug.log)\n\tif (logDir && debugLog?.enabled) {\n\t\tsinks.debugLog = createDebugLogSink(logDir);\n\t\tactiveSinks.push(\"debugLog\");\n\t}\n\n\t// Configure LogTape (reset: true needed if LogTape was previously configured)\n\t// IMPORTANT: Configure the meta logger to suppress its default stdout output.\n\t// Without this, LogTape writes \"LogTape loggers are configured...\" to stdout,\n\t// which breaks the stop-hook JSON protocol.\n\ttry {\n\t\tawait configure({\n\t\t\tsinks,\n\t\t\tloggers: [\n\t\t\t\t{\n\t\t\t\t\tcategory: [\"gauntlet\"],\n\t\t\t\t\tlowestLevel: level,\n\t\t\t\t\tsinks: activeSinks,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t// Suppress LogTape's internal meta logger (writes to stdout by default)\n\t\t\t\t\tcategory: [\"logtape\", \"meta\"],\n\t\t\t\t\tlowestLevel: \"fatal\",\n\t\t\t\t\tsinks: [],\n\t\t\t\t},\n\t\t\t],\n\t\t\treset: true,\n\t\t});\n\t\tisConfigured = true;\n\t} catch (error) {\n\t\t// Close debug log fd if initialization fails to prevent leaks\n\t\tif (debugLogFd !== null) {\n\t\t\ttry {\n\t\t\t\tfs.closeSync(debugLogFd);\n\t\t\t} catch {\n\t\t\t\t// Ignore close errors\n\t\t\t}\n\t\t\tdebugLogFd = null;\n\t\t}\n\t\tthrow error;\n\t}\n}\n\n/**\n * Reset the logger configuration and close file handles.\n */\nexport async function resetLogger(): Promise<void> {\n\tif (debugLogFd !== null) {\n\t\ttry {\n\t\t\tfs.closeSync(debugLogFd);\n\t\t} catch {\n\t\t\t// Ignore close errors\n\t\t}\n\t\tdebugLogFd = null;\n\t}\n\n\t// Reset LogTape configuration (reset: true required after initial configure)\n\t// Also suppress meta logger to avoid stdout pollution\n\tawait configure({\n\t\tsinks: {},\n\t\tloggers: [\n\t\t\t{\n\t\t\t\tcategory: [\"logtape\", \"meta\"],\n\t\t\t\tlowestLevel: \"fatal\",\n\t\t\t\tsinks: [],\n\t\t\t},\n\t\t],\n\t\treset: true,\n\t});\n\tisConfigured = false;\n}\n\n/**\n * Get the root application logger.\n */\nexport function getAppLogger(): LogTapeLogger {\n\treturn getLogger([\"gauntlet\"]);\n}\n\n/**\n * Get a child logger for a specific category.\n * Categories are hierarchical, e.g., [\"gauntlet\", \"runner\"] or [\"gauntlet\", \"gate\", \"check\"]\n *\n * @param category - The category path (after \"gauntlet\" prefix)\n */\nexport function getCategoryLogger(...category: string[]): LogTapeLogger {\n\treturn getLogger([\"gauntlet\", ...category]);\n}\n\n/**\n * Check if the logger has been configured.\n */\nexport function isLoggerConfigured(): boolean {\n\treturn isConfigured;\n}\n",
|
|
25
25
|
"import type { LogRecord, Sink } from \"@logtape/logtape\";\nimport chalk from \"chalk\";\n\n/**\n * Safely serialize a value, handling circular references.\n */\nfunction safeStringify(value: unknown): string {\n\ttry {\n\t\treturn JSON.stringify(value);\n\t} catch {\n\t\treturn \"[Unserializable]\";\n\t}\n}\n\n/**\n * Format a log record with chalk colors for console output.\n * Level prefixes: [DEBUG] dim, [INFO] blue, [WARN] yellow, [ERROR] red\n */\nfunction formatLogRecord(record: LogRecord): string {\n\tconst level = record.level.toUpperCase();\n\tconst category = record.category.join(\".\");\n\tconst message = record.message\n\t\t.map((part) => (typeof part === \"string\" ? part : safeStringify(part)))\n\t\t.join(\"\");\n\n\tlet levelStr: string;\n\tswitch (record.level) {\n\t\tcase \"debug\":\n\t\t\tlevelStr = chalk.dim(`[${level}]`);\n\t\t\tbreak;\n\t\tcase \"info\":\n\t\t\tlevelStr = chalk.blue(`[${level}]`);\n\t\t\tbreak;\n\t\tcase \"warning\":\n\t\t\tlevelStr = chalk.yellow(`[${level}]`);\n\t\t\tbreak;\n\t\tcase \"error\":\n\t\tcase \"fatal\":\n\t\t\tlevelStr = chalk.red(`[${level}]`);\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tlevelStr = `[${level}]`;\n\t}\n\n\tconst categoryStr = category ? chalk.dim(`[${category}]`) : \"\";\n\n\treturn `${levelStr}${categoryStr} ${message}`;\n}\n\n/**\n * Create a console sink that outputs to stderr with chalk formatting.\n * Uses stderr to keep stdout clean for JSON protocol responses (stop-hook).\n */\nexport function createConsoleSink(): Sink {\n\treturn (record: LogRecord) => {\n\t\tconst formatted = formatLogRecord(record);\n\t\tconsole.error(formatted);\n\t};\n}\n",
|
|
26
26
|
"import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport {\n\tcreateWorkingTreeRef,\n\treadExecutionState,\n} from \"../utils/execution-state.js\";\n\n/** Window in milliseconds to detect rapid-fire blocks */\nexport const LOOP_WINDOW_MS = 60_000;\n\n/** Number of blocks within the window to trigger loop detection */\nexport const LOOP_THRESHOLD = 3;\n\n/** Filename for storing block timestamps */\nconst BLOCK_TIMESTAMPS_FILE = \".block-timestamps\";\n\n/** Lock file for atomic timestamp updates */\nconst BLOCK_TIMESTAMPS_LOCK = \".block-timestamps.lock\";\n\n/** Max time to wait for lock acquisition (ms) */\nconst LOCK_TIMEOUT_MS = 2000;\n\n/** Retry interval when waiting for lock (ms) */\nconst LOCK_RETRY_MS = 50;\n\n/**\n * Acquire a file-based lock using exclusive create (wx flag).\n * Returns a release function. Throws if lock cannot be acquired within timeout.\n */\nasync function acquireTimestampLock(\n\tlogDir: string,\n): Promise<() => Promise<void>> {\n\tconst lockPath = path.join(logDir, BLOCK_TIMESTAMPS_LOCK);\n\tconst deadline = Date.now() + LOCK_TIMEOUT_MS;\n\n\twhile (Date.now() < deadline) {\n\t\ttry {\n\t\t\tconst handle = await fs.open(lockPath, \"wx\");\n\t\t\tawait handle.close();\n\t\t\treturn async () => {\n\t\t\t\tawait fs.rm(lockPath, { force: true }).catch(() => {});\n\t\t\t};\n\t\t} catch (err: unknown) {\n\t\t\tconst code = (err as { code?: string }).code;\n\t\t\tif (code !== \"EEXIST\") throw err;\n\t\t\t// Lock held by another process — wait and retry\n\t\t\tawait new Promise((r) => setTimeout(r, LOCK_RETRY_MS));\n\t\t}\n\t}\n\t// Timeout: another process may legitimately hold the lock — throw\n\t// so the caller can proceed with the original result safely.\n\tthrow new Error(\"Could not acquire block-timestamps lock within timeout\");\n}\n\n/**\n * Check if the log directory contains gate result files (indicating a\n * failed or in-progress run that hasn't been archived).\n *\n * Reuses the same detection logic as `hasExistingLogs()` in shared.ts —\n * looks for .log and .json files, ignoring dot-files, console.* files,\n * and the \"previous\" directory.\n */\nexport async function hasFailedRunLogs(logDir: string): Promise<boolean> {\n\ttry {\n\t\tconst entries = await fs.readdir(logDir);\n\t\treturn entries.some(\n\t\t\t(f) =>\n\t\t\t\t(f.endsWith(\".log\") || f.endsWith(\".json\")) &&\n\t\t\t\tf !== \"previous\" &&\n\t\t\t\t!f.startsWith(\"console.\") &&\n\t\t\t\t!f.startsWith(\".\"),\n\t\t);\n\t} catch {\n\t\treturn false;\n\t}\n}\n\n/**\n * Check if the working tree has changed since the last passing run.\n *\n * Reads the stored `working_tree_ref` from `.execution_state`, creates\n * a new working tree ref via `git stash create`, and compares.\n * Returns true if changes exist (refs differ), false if identical.\n * Returns null if no execution state exists (caller should fall back).\n */\nexport async function hasChangesSinceLastRun(\n\tlogDir: string,\n): Promise<boolean | null> {\n\tconst state = await readExecutionState(logDir);\n\tif (!state?.working_tree_ref) {\n\t\treturn null; // No execution state — caller should use fallback\n\t}\n\n\ttry {\n\t\tconst currentRef = await createWorkingTreeRef();\n\t\treturn currentRef !== state.working_tree_ref;\n\t} catch {\n\t\t// If git fails, assume changes exist so the caller can block safely\n\t\treturn true;\n\t}\n}\n\n/**\n * Check if the run interval has elapsed since the last gauntlet run.\n * Returns true if the interval has elapsed (should run/block).\n * Returns true if no execution state exists or state is corrupted.\n * Returns true if intervalMinutes is 0 (always run).\n */\nexport async function checkRunInterval(\n\tlogDir: string,\n\tintervalMinutes: number,\n): Promise<boolean> {\n\tif (intervalMinutes <= 0) return true;\n\n\tconst state = await readExecutionState(logDir);\n\tif (!state) return true;\n\n\tconst lastRun = new Date(state.last_run_completed_at);\n\tif (Number.isNaN(lastRun.getTime())) return true;\n\n\tconst elapsedMinutes = (Date.now() - lastRun.getTime()) / (1000 * 60);\n\treturn elapsedMinutes >= intervalMinutes;\n}\n\n/**\n * Check if changes exist vs the base branch.\n * Used as fallback when no execution state exists.\n * Uses `git diff --name-only <baseBranch>...HEAD` to detect changes.\n */\nexport async function hasChangesVsBaseBranch(\n\tcwd: string,\n\tbaseBranch: string,\n): Promise<boolean> {\n\tconst { execFile } = await import(\"node:child_process\");\n\tconst { promisify } = await import(\"node:util\");\n\tconst execFileAsync = promisify(execFile);\n\n\ttry {\n\t\tconst { stdout } = await execFileAsync(\n\t\t\t\"git\",\n\t\t\t[\"diff\", \"--name-only\", `${baseBranch}...HEAD`],\n\t\t\t{ cwd },\n\t\t);\n\t\treturn stdout.trim().length > 0;\n\t} catch {\n\t\t// If the base branch doesn't exist or git fails, assume changes exist\n\t\treturn true;\n\t}\n}\n\n/**\n * Get the last run status from execution state.\n * Returns the status string if determinable, null otherwise.\n */\nexport async function getLastRunStatus(logDir: string): Promise<string | null> {\n\tconst state = await readExecutionState(logDir);\n\tif (!state) return null;\n\t// ExecutionState has no status field yet — return null until schema is extended\n\treturn null;\n}\n\n/**\n * Read block timestamps from the timestamps file.\n * Returns an empty array if the file is missing or corrupt.\n */\nexport async function readBlockTimestamps(logDir: string): Promise<number[]> {\n\ttry {\n\t\tconst filePath = path.join(logDir, BLOCK_TIMESTAMPS_FILE);\n\t\tconst content = await fs.readFile(filePath, \"utf-8\");\n\t\tconst parsed = JSON.parse(content);\n\t\tif (!Array.isArray(parsed)) return [];\n\t\treturn parsed.filter((ts): ts is number => typeof ts === \"number\");\n\t} catch {\n\t\treturn [];\n\t}\n}\n\n/**\n * Record a block timestamp: read existing timestamps, filter to the\n * detection window, append the current time, and write back.\n * Uses a file-based lock for atomicity under concurrent invocations.\n * Returns the updated (filtered + appended) array.\n */\nexport async function recordBlockTimestamp(logDir: string): Promise<number[]> {\n\tconst release = await acquireTimestampLock(logDir);\n\ttry {\n\t\tconst now = Date.now();\n\t\tconst existing = await readBlockTimestamps(logDir);\n\t\tconst recent = existing.filter((ts) => now - ts < LOOP_WINDOW_MS);\n\t\trecent.push(now);\n\t\tconst filePath = path.join(logDir, BLOCK_TIMESTAMPS_FILE);\n\t\tawait fs.writeFile(filePath, JSON.stringify(recent), \"utf-8\");\n\t\treturn recent;\n\t} finally {\n\t\tawait release();\n\t}\n}\n\n/**\n * Reset (delete) the block timestamps file.\n * Called when a non-blocking result occurs, indicating the loop is resolved.\n */\nexport async function resetBlockTimestamps(logDir: string): Promise<void> {\n\ttry {\n\t\tconst filePath = path.join(logDir, BLOCK_TIMESTAMPS_FILE);\n\t\tawait fs.rm(filePath, { force: true });\n\t} catch {\n\t\t// Best-effort cleanup — ignore errors\n\t}\n}\n",
|
|
27
|
-
"import { spawn } from \"node:child_process\";\nimport fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { getDebugLogger } from \"./debug-log.js\";\n\nconst EXECUTION_STATE_FILENAME = \".execution_state\";\nconst SESSION_REF_FILENAME = \".session_ref\";\n\nfunction isPlainRecord(value: unknown): value is Record<string, unknown> {\n\t// Use loose equality to check both null and undefined in one comparison\n\tif (value == null) return false;\n\tif (Array.isArray(value)) return false;\n\treturn typeof value === \"object\";\n}\n\nfunction extractUnhealthyAdapters(\n\trawData: Record<string, unknown> | null,\n): Record<string, UnhealthyAdapter> | undefined {\n\tconst adapters = rawData?.unhealthy_adapters;\n\tif (!isPlainRecord(adapters)) {\n\t\treturn undefined;\n\t}\n\treturn adapters as Record<string, UnhealthyAdapter>;\n}\n\nexport interface UnhealthyAdapter {\n\tmarked_at: string;\n\treason: string;\n}\n\nexport interface ExecutionState {\n\tlast_run_completed_at: string;\n\tbranch: string;\n\tcommit: string;\n\tworking_tree_ref?: string;\n\tunhealthy_adapters?: Record<string, UnhealthyAdapter>;\n}\n\n/**\n * Read the execution state from the log directory.\n * Returns null if the state file or directory doesn't exist.\n */\nfunction isValidStateData(data: unknown): data is Record<string, unknown> & {\n\tlast_run_completed_at: string;\n\tbranch: string;\n\tcommit: string;\n} {\n\tif (typeof data !== \"object\" || data === null) return false;\n\tconst record = data as Record<string, unknown>;\n\treturn (\n\t\ttypeof record.last_run_completed_at === \"string\" &&\n\t\ttypeof record.branch === \"string\" &&\n\t\ttypeof record.commit === \"string\"\n\t);\n}\n\nexport async function readExecutionState(\n\tlogDir: string,\n): Promise<ExecutionState | null> {\n\ttry {\n\t\tconst statePath = path.join(logDir, EXECUTION_STATE_FILENAME);\n\t\tconst content = await fs.readFile(statePath, \"utf-8\");\n\t\tconst data = JSON.parse(content) as unknown;\n\n\t\tif (!isValidStateData(data)) return null;\n\n\t\tconst state: ExecutionState = {\n\t\t\tlast_run_completed_at: data.last_run_completed_at,\n\t\t\tbranch: data.branch,\n\t\t\tcommit: data.commit,\n\t\t};\n\n\t\tif (typeof data.working_tree_ref === \"string\") {\n\t\t\tstate.working_tree_ref = data.working_tree_ref;\n\t\t}\n\n\t\tif (\n\t\t\tdata.unhealthy_adapters &&\n\t\t\ttypeof data.unhealthy_adapters === \"object\"\n\t\t) {\n\t\t\tstate.unhealthy_adapters = data.unhealthy_adapters as Record<\n\t\t\t\tstring,\n\t\t\t\tUnhealthyAdapter\n\t\t\t>;\n\t\t}\n\n\t\treturn state;\n\t} catch {\n\t\treturn null;\n\t}\n}\n\n/**\n * Create a stash SHA that captures the current working tree state.\n * Uses `git stash create --include-untracked` which creates a stash commit\n * without modifying the working tree.\n * Returns the stash SHA, or HEAD SHA if working tree is clean.\n */\nexport async function createWorkingTreeRef(): Promise<string> {\n\treturn new Promise((resolve, reject) => {\n\t\tconst child = spawn(\"git\", [\"stash\", \"create\", \"--include-untracked\"], {\n\t\t\tstdio: [\"ignore\", \"pipe\", \"pipe\"],\n\t\t});\n\n\t\tlet stdout = \"\";\n\t\tchild.stdout.on(\"data\", (data: Buffer) => {\n\t\t\tstdout += data.toString();\n\t\t});\n\n\t\tchild.on(\"close\", async (code) => {\n\t\t\tif (code === 0) {\n\t\t\t\tconst sha = stdout.trim();\n\t\t\t\tif (sha) {\n\t\t\t\t\t// Stash created with working tree changes\n\t\t\t\t\tresolve(sha);\n\t\t\t\t} else {\n\t\t\t\t\t// Clean working tree - use HEAD instead\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst headSha = await getCurrentCommit();\n\t\t\t\t\t\tresolve(headSha);\n\t\t\t\t\t} catch (err) {\n\t\t\t\t\t\treject(err);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Try to fall back to HEAD\n\t\t\t\ttry {\n\t\t\t\t\tconst headSha = await getCurrentCommit();\n\t\t\t\t\tresolve(headSha);\n\t\t\t\t} catch {\n\t\t\t\t\treject(new Error(`git stash create failed with code ${code}`));\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\tchild.on(\"error\", reject);\n\t});\n}\n\n/**\n * Write the execution state to the log directory.\n * Records the current branch, commit SHA, working tree ref, and timestamp.\n * Also cleans up legacy .session_ref file if it exists.\n */\nexport async function writeExecutionState(logDir: string): Promise<void> {\n\tconst statePath = path.join(logDir, EXECUTION_STATE_FILENAME);\n\tconst [branch, commit, workingTreeRef, rawState] = await Promise.all([\n\t\tgetCurrentBranch(),\n\t\tgetCurrentCommit(),\n\t\tcreateWorkingTreeRef(),\n\t\treadRawState(statePath),\n\t]);\n\tconst existingUnhealthy = extractUnhealthyAdapters(rawState);\n\n\tconst state: ExecutionState = {\n\t\tlast_run_completed_at: new Date().toISOString(),\n\t\tbranch,\n\t\tcommit,\n\t\tworking_tree_ref: workingTreeRef,\n\t};\n\n\t// Preserve unhealthy_adapters from existing state\n\tif (existingUnhealthy) {\n\t\tstate.unhealthy_adapters = existingUnhealthy;\n\t}\n\n\t// Log changed fields (skip last_run_completed_at since every log line is timestamped)\n\tconst changes: Record<string, string> = {};\n\tconst oldState = rawState as Record<string, unknown> | null;\n\tif (oldState) {\n\t\tif (oldState.branch !== branch) changes.branch = branch;\n\t\tif (oldState.commit !== commit) changes.commit = commit;\n\t\tif (oldState.working_tree_ref !== workingTreeRef)\n\t\t\tchanges.working_tree_ref = workingTreeRef;\n\t} else {\n\t\t// First write - log all fields\n\t\tchanges.branch = branch;\n\t\tchanges.commit = commit;\n\t\tchanges.working_tree_ref = workingTreeRef;\n\t}\n\tawait getDebugLogger()?.logStateWrite(changes);\n\n\t// Ensure the log directory exists\n\tawait fs.mkdir(logDir, { recursive: true });\n\tawait fs.writeFile(statePath, JSON.stringify(state, null, 2), \"utf-8\");\n\n\t// Clean up legacy .session_ref file if it exists\n\ttry {\n\t\tconst sessionRefPath = path.join(logDir, SESSION_REF_FILENAME);\n\t\tawait fs.rm(sessionRefPath, { force: true });\n\t} catch {\n\t\t// Ignore errors\n\t}\n}\n\n/**\n * Get the current git branch name.\n */\nexport async function getCurrentBranch(): Promise<string> {\n\treturn new Promise((resolve, reject) => {\n\t\tconst child = spawn(\"git\", [\"rev-parse\", \"--abbrev-ref\", \"HEAD\"], {\n\t\t\tstdio: [\"ignore\", \"pipe\", \"pipe\"],\n\t\t});\n\n\t\tlet stdout = \"\";\n\t\tchild.stdout.on(\"data\", (data: Buffer) => {\n\t\t\tstdout += data.toString();\n\t\t});\n\n\t\tchild.on(\"close\", (code) => {\n\t\t\tif (code === 0) {\n\t\t\t\tresolve(stdout.trim());\n\t\t\t} else {\n\t\t\t\treject(new Error(`git rev-parse failed with code ${code}`));\n\t\t\t}\n\t\t});\n\n\t\tchild.on(\"error\", reject);\n\t});\n}\n\n/**\n * Get the current HEAD commit SHA.\n */\nexport async function getCurrentCommit(): Promise<string> {\n\treturn new Promise((resolve, reject) => {\n\t\tconst child = spawn(\"git\", [\"rev-parse\", \"HEAD\"], {\n\t\t\tstdio: [\"ignore\", \"pipe\", \"pipe\"],\n\t\t});\n\n\t\tlet stdout = \"\";\n\t\tchild.stdout.on(\"data\", (data: Buffer) => {\n\t\t\tstdout += data.toString();\n\t\t});\n\n\t\tchild.on(\"close\", (code) => {\n\t\t\tif (code === 0) {\n\t\t\t\tresolve(stdout.trim());\n\t\t\t} else {\n\t\t\t\treject(new Error(`git rev-parse failed with code ${code}`));\n\t\t\t}\n\t\t});\n\n\t\tchild.on(\"error\", reject);\n\t});\n}\n\n/**\n * Check if a commit is an ancestor of a branch (i.e., the commit has been merged).\n * Uses `git merge-base --is-ancestor`.\n * Returns true if commit is reachable from branch.\n */\nexport async function isCommitInBranch(\n\tcommit: string,\n\tbranch: string,\n): Promise<boolean> {\n\treturn new Promise((resolve) => {\n\t\tconst child = spawn(\n\t\t\t\"git\",\n\t\t\t[\"merge-base\", \"--is-ancestor\", commit, branch],\n\t\t\t{ stdio: [\"ignore\", \"pipe\", \"pipe\"] },\n\t\t);\n\n\t\tchild.on(\"close\", (code) => {\n\t\t\t// Exit 0 = is ancestor (merged), exit 1 = not ancestor\n\t\t\tresolve(code === 0);\n\t\t});\n\n\t\tchild.on(\"error\", () => {\n\t\t\tresolve(false);\n\t\t});\n\t});\n}\n\n/**\n * Get the execution state filename (for use in clean operations).\n */\nexport function getExecutionStateFilename(): string {\n\treturn EXECUTION_STATE_FILENAME;\n}\n\n/**\n * Check if a git object (commit, tree, blob, etc.) exists in the repository.\n * Uses `git cat-file -t <sha>` to check object type.\n */\nexport async function gitObjectExists(sha: string): Promise<boolean> {\n\treturn new Promise((resolve) => {\n\t\tconst child = spawn(\"git\", [\"cat-file\", \"-t\", sha], {\n\t\t\tstdio: [\"ignore\", \"pipe\", \"pipe\"],\n\t\t});\n\n\t\tchild.on(\"close\", (code) => {\n\t\t\tresolve(code === 0);\n\t\t});\n\n\t\tchild.on(\"error\", () => {\n\t\t\tresolve(false);\n\t\t});\n\t});\n}\n\n/**\n * When a commit has been merged, check if working_tree_ref still scopes valid changes.\n */\nasync function resolveFixBaseForMergedCommit(\n\tworking_tree_ref: string | undefined,\n): Promise<{ fixBase: string | null; warning?: string }> {\n\tif (!working_tree_ref) {\n\t\treturn { fixBase: null };\n\t}\n\tconst refExists = await gitObjectExists(working_tree_ref);\n\tif (!refExists) {\n\t\treturn { fixBase: null };\n\t}\n\treturn {\n\t\tfixBase: working_tree_ref,\n\t\twarning:\n\t\t\t\"Commit merged into base branch, using working tree ref for diff scope\",\n\t};\n}\n\n/**\n * Resolve the fixBase for change detection based on execution state.\n * Used for post-clean runs to scope diffs to changes since the last passing run.\n *\n * Returns:\n * - working_tree_ref if valid (not gc'd) and commit not merged\n * - commit as fallback if working_tree_ref is gc'd\n * - null if state is stale (commit merged) or all refs are invalid\n */\nexport async function resolveFixBase(\n\texecutionState: ExecutionState,\n\tbaseBranch: string,\n): Promise<{ fixBase: string | null; warning?: string }> {\n\tconst { commit, working_tree_ref } = executionState;\n\n\t// Check if commit has been merged into base branch (state is stale)\n\tconst commitMerged = await isCommitInBranch(commit, baseBranch);\n\tif (commitMerged) {\n\t\treturn resolveFixBaseForMergedCommit(working_tree_ref);\n\t}\n\n\t// Check if working_tree_ref exists\n\tif (working_tree_ref) {\n\t\tconst refExists = await gitObjectExists(working_tree_ref);\n\t\tif (refExists) {\n\t\t\t// Use working tree ref for precise diff\n\t\t\treturn { fixBase: working_tree_ref };\n\t\t}\n\t}\n\n\t// working_tree_ref doesn't exist or was gc'd, try commit as fallback\n\tconst commitExists = await gitObjectExists(commit);\n\tif (commitExists) {\n\t\treturn {\n\t\t\tfixBase: commit,\n\t\t\twarning: \"Session stash was garbage collected, using commit as fallback\",\n\t\t};\n\t}\n\n\t// Everything is gone, fall back to base branch\n\treturn { fixBase: null };\n}\n\nconst COOLDOWN_MS = 60 * 60 * 1000; // 1 hour\n\n/**\n * Check if an unhealthy adapter entry is still within the cooldown period.\n * Returns true if marked_at is less than 1 hour ago.\n * Invalid or missing timestamps default to \"expired\" (returns false).\n */\nexport function isAdapterCoolingDown(entry: UnhealthyAdapter): boolean {\n\tconst markedAt = new Date(entry.marked_at).getTime();\n\tif (Number.isNaN(markedAt)) return false;\n\treturn Date.now() - markedAt < COOLDOWN_MS;\n}\n\n/**\n * Get the unhealthy adapters map from execution state.\n * Returns an empty object if no unhealthy adapters are recorded.\n */\nexport async function getUnhealthyAdapters(\n\tlogDir: string,\n): Promise<Record<string, UnhealthyAdapter>> {\n\tconst statePath = path.join(logDir, EXECUTION_STATE_FILENAME);\n\tconst rawState = await readRawState(statePath);\n\treturn extractUnhealthyAdapters(rawState) ?? {};\n}\n\n/**\n * Read raw state data from the state file.\n * Returns null if the file doesn't exist or is invalid.\n */\nasync function readRawState(\n\tstatePath: string,\n): Promise<Record<string, unknown> | null> {\n\ttry {\n\t\tconst content = await fs.readFile(statePath, \"utf-8\");\n\t\treturn JSON.parse(content) as Record<string, unknown>;\n\t} catch {\n\t\treturn null;\n\t}\n}\n\n/**\n * Mark an adapter as unhealthy in the execution state.\n * Reads the current state, upserts the entry, and writes back.\n */\nexport async function markAdapterUnhealthy(\n\tlogDir: string,\n\tadapterName: string,\n\treason: string,\n): Promise<void> {\n\tawait getDebugLogger()?.logAdapterHealthChange(adapterName, false, reason);\n\n\tconst statePath = path.join(logDir, EXECUTION_STATE_FILENAME);\n\tconst rawData = (await readRawState(statePath)) ?? {};\n\n\tconst adapters =\n\t\t(rawData.unhealthy_adapters as Record<string, UnhealthyAdapter>) ?? {};\n\tadapters[adapterName] = {\n\t\tmarked_at: new Date().toISOString(),\n\t\treason,\n\t};\n\trawData.unhealthy_adapters = adapters;\n\n\tawait fs.mkdir(logDir, { recursive: true });\n\tawait fs.writeFile(statePath, JSON.stringify(rawData, null, 2), \"utf-8\");\n}\n\n/**\n * Mark an adapter as healthy by removing it from the unhealthy list.\n * Reads the current state, removes the entry, and writes back.\n */\nexport async function markAdapterHealthy(\n\tlogDir: string,\n\tadapterName: string,\n): Promise<void> {\n\tawait getDebugLogger()?.logAdapterHealthChange(adapterName, true);\n\n\tconst statePath = path.join(logDir, EXECUTION_STATE_FILENAME);\n\tconst rawData = await readRawState(statePath);\n\tif (!rawData) return;\n\n\tconst adapters = rawData.unhealthy_adapters as\n\t\t| Record<string, UnhealthyAdapter>\n\t\t| undefined;\n\tif (!adapters || !(adapterName in adapters)) return;\n\n\tdelete adapters[adapterName];\n\tif (Object.keys(adapters).length === 0) {\n\t\tdelete rawData.unhealthy_adapters;\n\t} else {\n\t\trawData.unhealthy_adapters = adapters;\n\t}\n\n\tawait fs.writeFile(statePath, JSON.stringify(rawData, null, 2), \"utf-8\");\n}\n\n/**\n * Delete the execution state file.\n * Used when auto-clean resets state due to context change.\n */\nexport async function deleteExecutionState(logDir: string): Promise<void> {\n\ttry {\n\t\tawait getDebugLogger()?.logStateDelete();\n\t\tconst statePath = path.join(logDir, EXECUTION_STATE_FILENAME);\n\t\tawait fs.rm(statePath, { force: true });\n\t} catch {\n\t\t// Ignore errors\n\t}\n}\n",
|
|
28
|
-
"import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport type { DebugLogConfig as GlobalDebugLogConfig } from \"../config/global.js\";\nimport type { DiffStats } from \"../core/diff-stats.js\";\n\nconst DEBUG_LOG_FILENAME = \".debug.log\";\nconst DEBUG_LOG_BACKUP_FILENAME = \".debug.log.1\";\n\nexport interface DebugLogConfig {\n\tenabled: boolean;\n\tmaxSizeMb: number;\n}\n\n/**\n * Get the debug log filename constant.\n * Useful for excluding from clean operations.\n */\nexport function getDebugLogFilename(): string {\n\treturn DEBUG_LOG_FILENAME;\n}\n\n/**\n * Get the debug log backup filename constant.\n * Useful for excluding from clean operations.\n */\nexport function getDebugLogBackupFilename(): string {\n\treturn DEBUG_LOG_BACKUP_FILENAME;\n}\n\n/**\n * DebugLogger class for persistent debug logging.\n * Writes to a single, append-only file that survives clean operations.\n */\nexport class DebugLogger {\n\tprivate logPath: string;\n\tprivate backupPath: string;\n\tprivate maxSizeBytes: number;\n\tprivate enabled: boolean;\n\tprivate runStartTime: number | undefined;\n\n\tconstructor(logDir: string, config: DebugLogConfig) {\n\t\tthis.logPath = path.join(logDir, DEBUG_LOG_FILENAME);\n\t\tthis.backupPath = path.join(logDir, DEBUG_LOG_BACKUP_FILENAME);\n\t\tthis.maxSizeBytes = config.maxSizeMb * 1024 * 1024;\n\t\tthis.enabled = config.enabled;\n\t}\n\n\t/**\n\t * Check if debug logging is enabled.\n\t */\n\tisEnabled(): boolean {\n\t\treturn this.enabled;\n\t}\n\n\t/**\n\t * Log a CLI command invocation.\n\t */\n\tasync logCommand(command: string, args: string[]): Promise<void> {\n\t\tconst argsStr = args.length > 0 ? ` ${args.join(\" \")}` : \"\";\n\t\tawait this.write(`COMMAND ${command}${argsStr}`);\n\t}\n\n\t/**\n\t * Log the start of a run/check/review command.\n\t */\n\tasync logRunStart(\n\t\tmode: \"full\" | \"verification\",\n\t\tchanges: number,\n\t\tgates: number,\n\t): Promise<void> {\n\t\tthis.runStartTime = Date.now();\n\t\tawait this.write(\n\t\t\t`RUN_START mode=${mode} changes=${changes} gates=${gates}`,\n\t\t);\n\t}\n\n\t/**\n\t * Log the start of a run/check/review command with diff statistics.\n\t */\n\tasync logRunStartWithDiff(\n\t\tmode: \"full\" | \"verification\",\n\t\tdiffStats: DiffStats,\n\t\tgates: number,\n\t): Promise<void> {\n\t\tthis.runStartTime = Date.now();\n\t\tconst parts = [\n\t\t\t\"RUN_START\",\n\t\t\t`mode=${mode}`,\n\t\t\t`base_ref=${diffStats.baseRef}`,\n\t\t\t`files_changed=${diffStats.total}`,\n\t\t\t`files_new=${diffStats.newFiles}`,\n\t\t\t`files_modified=${diffStats.modifiedFiles}`,\n\t\t\t`files_deleted=${diffStats.deletedFiles}`,\n\t\t\t`lines_added=${diffStats.linesAdded}`,\n\t\t\t`lines_removed=${diffStats.linesRemoved}`,\n\t\t\t`gates=${gates}`,\n\t\t];\n\t\tawait this.write(parts.join(\" \"));\n\t}\n\n\t/**\n\t * Log the start of preflight checks.\n\t */\n\tasync logPreflightStart(jobCount: number): Promise<void> {\n\t\tawait this.write(`PREFLIGHT_START jobs=${jobCount}`);\n\t}\n\n\t/**\n\t * Log the result of a single preflight check.\n\t */\n\tasync logPreflightResult(\n\t\t_jobId: string,\n\t\t_status: \"pass\" | \"fail\",\n\t\t_reason?: string,\n\t): Promise<void> {\n\t\t// TODO enable at debug level with logtape\n\t\t// const reasonStr = reason ? ` reason=${reason}` : \"\";\n\t\t// await this.write(`PREFLIGHT_CHECK ${jobId} status=${status}${reasonStr}`);\n\t}\n\n\t/**\n\t * Log the end of preflight checks.\n\t */\n\tasync logPreflightEnd(\n\t\trunnable: number,\n\t\tfailed: number,\n\t\tdurationMs: number,\n\t): Promise<void> {\n\t\tawait this.write(\n\t\t\t`PREFLIGHT_END runnable=${runnable} failed=${failed} duration=${durationMs}ms`,\n\t\t);\n\t}\n\n\t/**\n\t * Log the result of a gate execution.\n\t * When `cli` is provided, the adapter name is included in the log entry.\n\t */\n\tasync logGateResult(\n\t\tgateId: string,\n\t\tstatus: string,\n\t\tduration: number,\n\t\topts?: { violations?: number; cli?: string },\n\t): Promise<void> {\n\t\tconst durationStr = `${(duration / 1000).toFixed(1)}s`;\n\t\tconst cliStr = opts?.cli ? ` cli=${opts.cli}` : \"\";\n\t\tconst violationsStr =\n\t\t\topts?.violations !== undefined ? ` violations=${opts.violations}` : \"\";\n\t\tawait this.write(\n\t\t\t`GATE_RESULT ${gateId}${cliStr} status=${status} duration=${durationStr}${violationsStr}`,\n\t\t);\n\t}\n\n\t/**\n\t * Log the end of a run/check/review command.\n\t */\n\tasync logRunEnd(\n\t\tstatus: string,\n\t\tfixed: number,\n\t\tskipped: number,\n\t\tfailed: number,\n\t\titerations: number,\n\t): Promise<void> {\n\t\tconst durationStr =\n\t\t\tthis.runStartTime !== undefined\n\t\t\t\t? ` duration=${((Date.now() - this.runStartTime) / 1000).toFixed(1)}s`\n\t\t\t\t: \"\";\n\t\tawait this.write(\n\t\t\t`RUN_END status=${status} fixed=${fixed} skipped=${skipped} failed=${failed} iterations=${iterations}${durationStr}`,\n\t\t);\n\t}\n\n\t/**\n\t * Log a clean operation.\n\t */\n\tasync logClean(type: \"auto\" | \"manual\", reason: string): Promise<void> {\n\t\tawait this.write(`CLEAN type=${type} reason=${reason}`);\n\t}\n\n\t/**\n\t * Log a stop hook decision.\n\t */\n\tasync logStopHook(\n\t\tdecision: \"allow\" | \"block\",\n\t\treason: string,\n\t): Promise<void> {\n\t\tawait this.write(`STOP_HOOK decision=${decision} reason=${reason}`);\n\t}\n\n\t/**\n\t * Log stop hook diagnostic information.\n\t * Used to debug duplicate/unexpected stop hook invocations.\n\t */\n\tasync logStopHookDiagnostics(diagnostics: {\n\t\tpid: number;\n\t\tppid: number;\n\t\tenvVarSet: boolean;\n\t\tprocessCwd: string;\n\t\trawStdin: string;\n\t\tstdinSessionId?: string;\n\t\tstdinStopHookActive?: boolean;\n\t\tstdinCwd?: string;\n\t\tstdinHookEventName?: string;\n\t}): Promise<void> {\n\t\tconst parts = [\n\t\t\t\"STOP_HOOK_DIAG\",\n\t\t\t`pid=${diagnostics.pid}`,\n\t\t\t`ppid=${diagnostics.ppid}`,\n\t\t\t`env_var_set=${diagnostics.envVarSet}`,\n\t\t\t`session_id=${diagnostics.stdinSessionId ?? \"none\"}`,\n\t\t\t`stop_hook_active=${diagnostics.stdinStopHookActive ?? \"none\"}`,\n\t\t\t`hook_event=${diagnostics.stdinHookEventName ?? \"none\"}`,\n\t\t\t`stdin_cwd=${diagnostics.stdinCwd ?? \"none\"}`,\n\t\t\t`process_cwd=${diagnostics.processCwd}`,\n\t\t];\n\t\tawait this.write(parts.join(\" \"));\n\t}\n\n\t/**\n\t * Log a stop hook early exit decision.\n\t * These exits happen before full initialization, so a specific event\n\t * is needed to distinguish which code path was taken.\n\t */\n\tasync logStopHookEarlyExit(\n\t\tsource: string,\n\t\tstatus: string,\n\t\tdetail?: string,\n\t): Promise<void> {\n\t\tconst detailStr = detail ? ` detail=${detail}` : \"\";\n\t\tawait this.write(\n\t\t\t`STOP_HOOK_EARLY_EXIT source=${source} status=${status}${detailStr}`,\n\t\t);\n\t}\n\n\t/**\n\t * Log an execution state write, showing only changed fields.\n\t * Skips `last_run_completed_at` since every log line is already timestamped.\n\t */\n\tasync logStateWrite(changes: Record<string, string>): Promise<void> {\n\t\tconst parts = Object.entries(changes).map(\n\t\t\t([key, value]) => `${key}=${value}`,\n\t\t);\n\t\tawait this.write(\n\t\t\t`STATE_WRITE${parts.length > 0 ? ` ${parts.join(\" \")}` : \"\"}`,\n\t\t);\n\t}\n\n\t/**\n\t * Log an execution state deletion.\n\t */\n\tasync logStateDelete(): Promise<void> {\n\t\tawait this.write(\"STATE_DELETE\");\n\t}\n\n\t/**\n\t * Log an adapter health change.\n\t */\n\tasync logAdapterHealthChange(\n\t\tadapter: string,\n\t\thealthy: boolean,\n\t\treason?: string,\n\t): Promise<void> {\n\t\tif (healthy) {\n\t\t\tawait this.write(`STATE_ADAPTER_HEALTHY adapter=${adapter}`);\n\t\t} else {\n\t\t\tconst reasonStr = reason ? ` reason=${reason}` : \"\";\n\t\t\tawait this.write(\n\t\t\t\t`STATE_ADAPTER_UNHEALTHY adapter=${adapter}${reasonStr}`,\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Log a telemetry summary line from an adapter.\n\t * Persists the summary (e.g. \"[otel] cost=$0.12 in=5 out=100\")\n\t * so it survives log cleaning for longitudinal analysis.\n\t */\n\tasync logTelemetry(entry: {\n\t\tadapter: string;\n\t\tsummary: string;\n\t}): Promise<void> {\n\t\tawait this.write(`TELEMETRY adapter=${entry.adapter} ${entry.summary}`);\n\t}\n\n\t/**\n\t * Write a log entry with timestamp.\n\t */\n\tprivate async write(message: string): Promise<void> {\n\t\tif (!this.enabled) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst now = new Date();\n\t\tconst timestamp = `${now.getFullYear()}-${String(now.getMonth() + 1).padStart(2, \"0\")}-${String(now.getDate()).padStart(2, \"0\")}T${String(now.getHours()).padStart(2, \"0\")}:${String(now.getMinutes()).padStart(2, \"0\")}:${String(now.getSeconds()).padStart(2, \"0\")}.${String(now.getMilliseconds()).padStart(3, \"0\")}`;\n\t\tconst entry = `[${timestamp}] ${message}\\n`;\n\n\t\ttry {\n\t\t\t// Check if rotation is needed before writing\n\t\t\tawait this.rotateIfNeeded();\n\n\t\t\t// Ensure directory exists\n\t\t\tawait fs.mkdir(path.dirname(this.logPath), { recursive: true });\n\n\t\t\t// Append the entry\n\t\t\tawait fs.appendFile(this.logPath, entry, \"utf-8\");\n\t\t} catch {\n\t\t\t// Silently fail - debug logging should never break the application\n\t\t}\n\t}\n\n\t/**\n\t * Rotate the log file if it exceeds the size limit.\n\t */\n\tprivate async rotateIfNeeded(): Promise<void> {\n\t\ttry {\n\t\t\tconst stat = await fs.stat(this.logPath);\n\t\t\tif (stat.size >= this.maxSizeBytes) {\n\t\t\t\t// Delete the backup if it exists\n\t\t\t\ttry {\n\t\t\t\t\tawait fs.rm(this.backupPath, { force: true });\n\t\t\t\t} catch {\n\t\t\t\t\t// Ignore\n\t\t\t\t}\n\n\t\t\t\t// Rename current log to backup\n\t\t\t\tawait fs.rename(this.logPath, this.backupPath);\n\t\t\t}\n\t\t} catch {\n\t\t\t// File doesn't exist yet, no rotation needed\n\t\t}\n\t}\n}\n\n/**\n * Merge project and global debug log configs.\n * Project config overrides global config.\n * If neither specifies enabled, debug logging is disabled.\n */\nexport function mergeDebugLogConfig(\n\tprojectConfig?: { enabled?: boolean; max_size_mb?: number },\n\tglobalConfig?: GlobalDebugLogConfig,\n): DebugLogConfig {\n\t// Default values\n\tlet enabled = false;\n\tlet maxSizeMb = 10;\n\n\t// Apply global config if present\n\tif (globalConfig) {\n\t\tenabled = globalConfig.enabled;\n\t\tmaxSizeMb = globalConfig.max_size_mb;\n\t}\n\n\t// Apply project config if present (overrides global)\n\tif (projectConfig !== undefined) {\n\t\tif (projectConfig.enabled !== undefined) {\n\t\t\tenabled = projectConfig.enabled;\n\t\t}\n\t\tif (projectConfig.max_size_mb !== undefined) {\n\t\t\tmaxSizeMb = projectConfig.max_size_mb;\n\t\t}\n\t}\n\n\treturn {\n\t\tenabled,\n\t\tmaxSizeMb,\n\t};\n}\n\n// Singleton instance for global access\nlet debugLoggerInstance: DebugLogger | null = null;\n\n/**\n * Initialize the global debug logger.\n * Should be called early in command execution.\n */\nexport function initDebugLogger(logDir: string, config: DebugLogConfig): void {\n\tdebugLoggerInstance = new DebugLogger(logDir, config);\n}\n\n/**\n * Get the global debug logger instance.\n * Returns null if not initialized.\n */\nexport function getDebugLogger(): DebugLogger | null {\n\treturn debugLoggerInstance;\n}\n\n/**\n * Reset the global debug logger (for testing).\n */\nexport function resetDebugLogger(): void {\n\tdebugLoggerInstance = null;\n}\n",
|
|
27
|
+
"import { spawn } from \"node:child_process\";\nimport fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { getDebugLogger } from \"./debug-log.js\";\n\nconst EXECUTION_STATE_FILENAME = \".execution_state\";\nconst SESSION_REF_FILENAME = \".session_ref\";\n\nfunction isPlainRecord(value: unknown): value is Record<string, unknown> {\n\t// Use loose equality to check both null and undefined in one comparison\n\tif (value == null) return false;\n\tif (Array.isArray(value)) return false;\n\treturn typeof value === \"object\";\n}\n\nfunction extractUnhealthyAdapters(\n\trawData: Record<string, unknown> | null,\n): Record<string, UnhealthyAdapter> | undefined {\n\tconst adapters = rawData?.unhealthy_adapters;\n\tif (!isPlainRecord(adapters)) {\n\t\treturn undefined;\n\t}\n\treturn adapters as Record<string, UnhealthyAdapter>;\n}\n\nexport interface UnhealthyAdapter {\n\tmarked_at: string;\n\treason: string;\n}\n\nexport interface ExecutionState {\n\tlast_run_completed_at: string;\n\tbranch: string;\n\tcommit: string;\n\tworking_tree_ref?: string;\n\tunhealthy_adapters?: Record<string, UnhealthyAdapter>;\n}\n\n/**\n * Read the execution state from the log directory.\n * Returns null if the state file or directory doesn't exist.\n */\nfunction isValidStateData(data: unknown): data is Record<string, unknown> & {\n\tlast_run_completed_at: string;\n\tbranch: string;\n\tcommit: string;\n} {\n\tif (typeof data !== \"object\" || data === null) return false;\n\tconst record = data as Record<string, unknown>;\n\treturn (\n\t\ttypeof record.last_run_completed_at === \"string\" &&\n\t\ttypeof record.branch === \"string\" &&\n\t\ttypeof record.commit === \"string\"\n\t);\n}\n\nexport async function readExecutionState(\n\tlogDir: string,\n): Promise<ExecutionState | null> {\n\ttry {\n\t\tconst statePath = path.join(logDir, EXECUTION_STATE_FILENAME);\n\t\tconst content = await fs.readFile(statePath, \"utf-8\");\n\t\tconst data = JSON.parse(content) as unknown;\n\n\t\tif (!isValidStateData(data)) return null;\n\n\t\tconst state: ExecutionState = {\n\t\t\tlast_run_completed_at: data.last_run_completed_at,\n\t\t\tbranch: data.branch,\n\t\t\tcommit: data.commit,\n\t\t};\n\n\t\tif (typeof data.working_tree_ref === \"string\") {\n\t\t\tstate.working_tree_ref = data.working_tree_ref;\n\t\t}\n\n\t\tif (\n\t\t\tdata.unhealthy_adapters &&\n\t\t\ttypeof data.unhealthy_adapters === \"object\"\n\t\t) {\n\t\t\tstate.unhealthy_adapters = data.unhealthy_adapters as Record<\n\t\t\t\tstring,\n\t\t\t\tUnhealthyAdapter\n\t\t\t>;\n\t\t}\n\n\t\treturn state;\n\t} catch {\n\t\treturn null;\n\t}\n}\n\n/**\n * Create a stash SHA that captures the current working tree state.\n * Uses `git stash create --include-untracked` which creates a stash commit\n * without modifying the working tree.\n * Returns the stash SHA, or HEAD SHA if working tree is clean.\n */\nexport async function createWorkingTreeRef(): Promise<string> {\n\treturn new Promise((resolve, reject) => {\n\t\tconst child = spawn(\"git\", [\"stash\", \"create\", \"--include-untracked\"], {\n\t\t\tstdio: [\"ignore\", \"pipe\", \"pipe\"],\n\t\t});\n\n\t\tlet stdout = \"\";\n\t\tchild.stdout.on(\"data\", (data: Buffer) => {\n\t\t\tstdout += data.toString();\n\t\t});\n\n\t\tchild.on(\"close\", async (code) => {\n\t\t\tif (code === 0) {\n\t\t\t\tconst sha = stdout.trim();\n\t\t\t\tif (sha) {\n\t\t\t\t\t// Stash created with working tree changes\n\t\t\t\t\tresolve(sha);\n\t\t\t\t} else {\n\t\t\t\t\t// Clean working tree - use HEAD instead\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst headSha = await getCurrentCommit();\n\t\t\t\t\t\tresolve(headSha);\n\t\t\t\t\t} catch (err) {\n\t\t\t\t\t\treject(err);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Try to fall back to HEAD\n\t\t\t\ttry {\n\t\t\t\t\tconst headSha = await getCurrentCommit();\n\t\t\t\t\tresolve(headSha);\n\t\t\t\t} catch {\n\t\t\t\t\treject(new Error(`git stash create failed with code ${code}`));\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\tchild.on(\"error\", reject);\n\t});\n}\n\n/**\n * Write the execution state to the log directory.\n * Records the current branch, commit SHA, working tree ref, and timestamp.\n * Also cleans up legacy .session_ref file if it exists.\n */\nexport async function writeExecutionState(logDir: string): Promise<void> {\n\tconst statePath = path.join(logDir, EXECUTION_STATE_FILENAME);\n\tconst [branch, commit, workingTreeRef, rawState] = await Promise.all([\n\t\tgetCurrentBranch(),\n\t\tgetCurrentCommit(),\n\t\tcreateWorkingTreeRef(),\n\t\treadRawState(statePath),\n\t]);\n\tconst existingUnhealthy = extractUnhealthyAdapters(rawState);\n\n\tconst state: ExecutionState = {\n\t\tlast_run_completed_at: new Date().toISOString(),\n\t\tbranch,\n\t\tcommit,\n\t\tworking_tree_ref: workingTreeRef,\n\t};\n\n\t// Preserve unhealthy_adapters from existing state\n\tif (existingUnhealthy) {\n\t\tstate.unhealthy_adapters = existingUnhealthy;\n\t}\n\n\t// Log changed fields (skip last_run_completed_at since every log line is timestamped)\n\tconst changes: Record<string, string> = {};\n\tconst oldState = rawState as Record<string, unknown> | null;\n\tif (oldState) {\n\t\tif (oldState.branch !== branch) changes.branch = branch;\n\t\tif (oldState.commit !== commit) changes.commit = commit;\n\t\tif (oldState.working_tree_ref !== workingTreeRef)\n\t\t\tchanges.working_tree_ref = workingTreeRef;\n\t} else {\n\t\t// First write - log all fields\n\t\tchanges.branch = branch;\n\t\tchanges.commit = commit;\n\t\tchanges.working_tree_ref = workingTreeRef;\n\t}\n\tawait getDebugLogger()?.logStateWrite(changes);\n\n\t// Ensure the log directory exists\n\tawait fs.mkdir(logDir, { recursive: true });\n\tawait fs.writeFile(statePath, JSON.stringify(state, null, 2), \"utf-8\");\n\n\t// Clean up legacy .session_ref file if it exists\n\ttry {\n\t\tconst sessionRefPath = path.join(logDir, SESSION_REF_FILENAME);\n\t\tawait fs.rm(sessionRefPath, { force: true });\n\t} catch {\n\t\t// Ignore errors\n\t}\n}\n\n/**\n * Get the current git branch name.\n */\nexport async function getCurrentBranch(): Promise<string> {\n\treturn new Promise((resolve, reject) => {\n\t\tconst child = spawn(\"git\", [\"rev-parse\", \"--abbrev-ref\", \"HEAD\"], {\n\t\t\tstdio: [\"ignore\", \"pipe\", \"pipe\"],\n\t\t});\n\n\t\tlet stdout = \"\";\n\t\tchild.stdout.on(\"data\", (data: Buffer) => {\n\t\t\tstdout += data.toString();\n\t\t});\n\n\t\tchild.on(\"close\", (code) => {\n\t\t\tif (code === 0) {\n\t\t\t\tresolve(stdout.trim());\n\t\t\t} else {\n\t\t\t\treject(new Error(`git rev-parse failed with code ${code}`));\n\t\t\t}\n\t\t});\n\n\t\tchild.on(\"error\", reject);\n\t});\n}\n\n/**\n * Get the current HEAD commit SHA.\n */\nexport async function getCurrentCommit(): Promise<string> {\n\treturn new Promise((resolve, reject) => {\n\t\tconst child = spawn(\"git\", [\"rev-parse\", \"HEAD\"], {\n\t\t\tstdio: [\"ignore\", \"pipe\", \"pipe\"],\n\t\t});\n\n\t\tlet stdout = \"\";\n\t\tchild.stdout.on(\"data\", (data: Buffer) => {\n\t\t\tstdout += data.toString();\n\t\t});\n\n\t\tchild.on(\"close\", (code) => {\n\t\t\tif (code === 0) {\n\t\t\t\tresolve(stdout.trim());\n\t\t\t} else {\n\t\t\t\treject(new Error(`git rev-parse failed with code ${code}`));\n\t\t\t}\n\t\t});\n\n\t\tchild.on(\"error\", reject);\n\t});\n}\n\n/**\n * Check if a commit is an ancestor of a branch (i.e., the commit has been merged).\n * Uses `git merge-base --is-ancestor`.\n * Returns true if commit is reachable from branch.\n */\nexport async function isCommitInBranch(\n\tcommit: string,\n\tbranch: string,\n): Promise<boolean> {\n\treturn new Promise((resolve) => {\n\t\tconst child = spawn(\n\t\t\t\"git\",\n\t\t\t[\"merge-base\", \"--is-ancestor\", commit, branch],\n\t\t\t{ stdio: [\"ignore\", \"pipe\", \"pipe\"] },\n\t\t);\n\n\t\tchild.on(\"close\", (code) => {\n\t\t\t// Exit 0 = is ancestor (merged), exit 1 = not ancestor\n\t\t\tresolve(code === 0);\n\t\t});\n\n\t\tchild.on(\"error\", () => {\n\t\t\tresolve(false);\n\t\t});\n\t});\n}\n\n/**\n * Get the execution state filename (for use in clean operations).\n */\nexport function getExecutionStateFilename(): string {\n\treturn EXECUTION_STATE_FILENAME;\n}\n\n/**\n * Check if the working tree has any changes (staged, unstaged, or untracked files).\n * Uses `git status --porcelain` which correctly reports all change types,\n * unlike `git stash create --include-untracked` which returns empty for untracked-only changes.\n */\nexport async function hasWorkingTreeChanges(): Promise<boolean> {\n\treturn new Promise((resolve) => {\n\t\tconst child = spawn(\"git\", [\"status\", \"--porcelain\"], {\n\t\t\tstdio: [\"ignore\", \"pipe\", \"pipe\"],\n\t\t});\n\n\t\tlet stdout = \"\";\n\t\tchild.stdout.on(\"data\", (data: Buffer) => {\n\t\t\tstdout += data.toString();\n\t\t});\n\n\t\tchild.on(\"close\", (code) => {\n\t\t\tif (code === 0) {\n\t\t\t\tresolve(stdout.trim().length > 0);\n\t\t\t} else {\n\t\t\t\t// If git status fails, assume changes exist to prevent accidental state deletion\n\t\t\t\tresolve(true);\n\t\t\t}\n\t\t});\n\n\t\tchild.on(\"error\", () => {\n\t\t\tresolve(true);\n\t\t});\n\t});\n}\n\n/**\n * Check if a git object (commit, tree, blob, etc.) exists in the repository.\n * Uses `git cat-file -t <sha>` to check object type.\n */\nexport async function gitObjectExists(sha: string): Promise<boolean> {\n\treturn new Promise((resolve) => {\n\t\tconst child = spawn(\"git\", [\"cat-file\", \"-t\", sha], {\n\t\t\tstdio: [\"ignore\", \"pipe\", \"pipe\"],\n\t\t});\n\n\t\tchild.on(\"close\", (code) => {\n\t\t\tresolve(code === 0);\n\t\t});\n\n\t\tchild.on(\"error\", () => {\n\t\t\tresolve(false);\n\t\t});\n\t});\n}\n\n/**\n * When a commit has been merged, check if working_tree_ref still scopes valid changes.\n */\nasync function resolveFixBaseForMergedCommit(\n\tworking_tree_ref: string | undefined,\n): Promise<{ fixBase: string | null; warning?: string }> {\n\tif (!working_tree_ref) {\n\t\treturn { fixBase: null };\n\t}\n\tconst refExists = await gitObjectExists(working_tree_ref);\n\tif (!refExists) {\n\t\treturn { fixBase: null };\n\t}\n\treturn {\n\t\tfixBase: working_tree_ref,\n\t\twarning:\n\t\t\t\"Commit merged into base branch, using working tree ref for diff scope\",\n\t};\n}\n\n/**\n * Resolve the fixBase for change detection based on execution state.\n * Used for post-clean runs to scope diffs to changes since the last passing run.\n *\n * Returns:\n * - working_tree_ref if valid (not gc'd) and commit not merged\n * - commit as fallback if working_tree_ref is gc'd\n * - null if state is stale (commit merged) or all refs are invalid\n */\nexport async function resolveFixBase(\n\texecutionState: ExecutionState,\n\tbaseBranch: string,\n): Promise<{ fixBase: string | null; warning?: string }> {\n\tconst { commit, working_tree_ref } = executionState;\n\n\t// Check if commit has been merged into base branch (state is stale)\n\tconst commitMerged = await isCommitInBranch(commit, baseBranch);\n\tif (commitMerged) {\n\t\treturn resolveFixBaseForMergedCommit(working_tree_ref);\n\t}\n\n\t// Check if working_tree_ref exists\n\tif (working_tree_ref) {\n\t\tconst refExists = await gitObjectExists(working_tree_ref);\n\t\tif (refExists) {\n\t\t\t// Use working tree ref for precise diff\n\t\t\treturn { fixBase: working_tree_ref };\n\t\t}\n\t}\n\n\t// working_tree_ref doesn't exist or was gc'd, try commit as fallback\n\tconst commitExists = await gitObjectExists(commit);\n\tif (commitExists) {\n\t\treturn {\n\t\t\tfixBase: commit,\n\t\t\twarning: \"Session stash was garbage collected, using commit as fallback\",\n\t\t};\n\t}\n\n\t// Everything is gone, fall back to base branch\n\treturn { fixBase: null };\n}\n\nconst COOLDOWN_MS = 60 * 60 * 1000; // 1 hour\n\n/**\n * Check if an unhealthy adapter entry is still within the cooldown period.\n * Returns true if marked_at is less than 1 hour ago.\n * Invalid or missing timestamps default to \"expired\" (returns false).\n */\nexport function isAdapterCoolingDown(entry: UnhealthyAdapter): boolean {\n\tconst markedAt = new Date(entry.marked_at).getTime();\n\tif (Number.isNaN(markedAt)) return false;\n\treturn Date.now() - markedAt < COOLDOWN_MS;\n}\n\n/**\n * Get the unhealthy adapters map from execution state.\n * Returns an empty object if no unhealthy adapters are recorded.\n */\nexport async function getUnhealthyAdapters(\n\tlogDir: string,\n): Promise<Record<string, UnhealthyAdapter>> {\n\tconst statePath = path.join(logDir, EXECUTION_STATE_FILENAME);\n\tconst rawState = await readRawState(statePath);\n\treturn extractUnhealthyAdapters(rawState) ?? {};\n}\n\n/**\n * Read raw state data from the state file.\n * Returns null if the file doesn't exist or is invalid.\n */\nasync function readRawState(\n\tstatePath: string,\n): Promise<Record<string, unknown> | null> {\n\ttry {\n\t\tconst content = await fs.readFile(statePath, \"utf-8\");\n\t\treturn JSON.parse(content) as Record<string, unknown>;\n\t} catch {\n\t\treturn null;\n\t}\n}\n\n/**\n * Mark an adapter as unhealthy in the execution state.\n * Reads the current state, upserts the entry, and writes back.\n */\nexport async function markAdapterUnhealthy(\n\tlogDir: string,\n\tadapterName: string,\n\treason: string,\n): Promise<void> {\n\tawait getDebugLogger()?.logAdapterHealthChange(adapterName, false, reason);\n\n\tconst statePath = path.join(logDir, EXECUTION_STATE_FILENAME);\n\tconst rawData = (await readRawState(statePath)) ?? {};\n\n\tconst adapters =\n\t\t(rawData.unhealthy_adapters as Record<string, UnhealthyAdapter>) ?? {};\n\tadapters[adapterName] = {\n\t\tmarked_at: new Date().toISOString(),\n\t\treason,\n\t};\n\trawData.unhealthy_adapters = adapters;\n\n\tawait fs.mkdir(logDir, { recursive: true });\n\tawait fs.writeFile(statePath, JSON.stringify(rawData, null, 2), \"utf-8\");\n}\n\n/**\n * Mark an adapter as healthy by removing it from the unhealthy list.\n * Reads the current state, removes the entry, and writes back.\n */\nexport async function markAdapterHealthy(\n\tlogDir: string,\n\tadapterName: string,\n): Promise<void> {\n\tawait getDebugLogger()?.logAdapterHealthChange(adapterName, true);\n\n\tconst statePath = path.join(logDir, EXECUTION_STATE_FILENAME);\n\tconst rawData = await readRawState(statePath);\n\tif (!rawData) return;\n\n\tconst adapters = rawData.unhealthy_adapters as\n\t\t| Record<string, UnhealthyAdapter>\n\t\t| undefined;\n\tif (!adapters || !(adapterName in adapters)) return;\n\n\tdelete adapters[adapterName];\n\tif (Object.keys(adapters).length === 0) {\n\t\tdelete rawData.unhealthy_adapters;\n\t} else {\n\t\trawData.unhealthy_adapters = adapters;\n\t}\n\n\tawait fs.writeFile(statePath, JSON.stringify(rawData, null, 2), \"utf-8\");\n}\n\n/**\n * Delete the execution state file.\n * Used when auto-clean resets state due to context change.\n */\nexport async function deleteExecutionState(logDir: string): Promise<void> {\n\ttry {\n\t\tawait getDebugLogger()?.logStateDelete();\n\t\tconst statePath = path.join(logDir, EXECUTION_STATE_FILENAME);\n\t\tawait fs.rm(statePath, { force: true });\n\t} catch {\n\t\t// Ignore errors\n\t}\n}\n",
|
|
28
|
+
"import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport type { DebugLogConfig as GlobalDebugLogConfig } from \"../config/global.js\";\nimport type { DiffStats } from \"../core/diff-stats.js\";\n\nconst DEBUG_LOG_FILENAME = \".debug.log\";\nconst DEBUG_LOG_BACKUP_FILENAME = \".debug.log.1\";\n\nexport interface DebugLogConfig {\n\tenabled: boolean;\n\tmaxSizeMb: number;\n}\n\n/**\n * Get the debug log filename constant.\n * Useful for excluding from clean operations.\n */\nexport function getDebugLogFilename(): string {\n\treturn DEBUG_LOG_FILENAME;\n}\n\n/**\n * Get the debug log backup filename constant.\n * Useful for excluding from clean operations.\n */\nexport function getDebugLogBackupFilename(): string {\n\treturn DEBUG_LOG_BACKUP_FILENAME;\n}\n\n/**\n * DebugLogger class for persistent debug logging.\n * Writes to a single, append-only file that survives clean operations.\n */\nexport class DebugLogger {\n\tprivate logPath: string;\n\tprivate backupPath: string;\n\tprivate maxSizeBytes: number;\n\tprivate enabled: boolean;\n\tprivate runStartTime: number | undefined;\n\n\tconstructor(logDir: string, config: DebugLogConfig) {\n\t\tthis.logPath = path.join(logDir, DEBUG_LOG_FILENAME);\n\t\tthis.backupPath = path.join(logDir, DEBUG_LOG_BACKUP_FILENAME);\n\t\tthis.maxSizeBytes = config.maxSizeMb * 1024 * 1024;\n\t\tthis.enabled = config.enabled;\n\t}\n\n\t/**\n\t * Check if debug logging is enabled.\n\t */\n\tisEnabled(): boolean {\n\t\treturn this.enabled;\n\t}\n\n\t/**\n\t * Log a CLI command invocation.\n\t */\n\tasync logCommand(command: string, args: string[]): Promise<void> {\n\t\tconst argsStr = args.length > 0 ? ` ${args.join(\" \")}` : \"\";\n\t\tawait this.write(`COMMAND ${command}${argsStr}`);\n\t}\n\n\t/**\n\t * Log the start of a run/check/review command.\n\t */\n\tasync logRunStart(\n\t\tmode: \"full\" | \"verification\",\n\t\tchanges: number,\n\t\tgates: number,\n\t): Promise<void> {\n\t\tthis.runStartTime = Date.now();\n\t\tawait this.write(\n\t\t\t`RUN_START mode=${mode} changes=${changes} gates=${gates}`,\n\t\t);\n\t}\n\n\t/**\n\t * Log the start of a run/check/review command with diff statistics.\n\t */\n\tasync logRunStartWithDiff(\n\t\tmode: \"full\" | \"verification\",\n\t\tdiffStats: DiffStats,\n\t\tgates: number,\n\t): Promise<void> {\n\t\tthis.runStartTime = Date.now();\n\t\tconst parts = [\n\t\t\t\"RUN_START\",\n\t\t\t`mode=${mode}`,\n\t\t\t`base_ref=${diffStats.baseRef}`,\n\t\t\t`files_changed=${diffStats.total}`,\n\t\t\t`files_new=${diffStats.newFiles}`,\n\t\t\t`files_modified=${diffStats.modifiedFiles}`,\n\t\t\t`files_deleted=${diffStats.deletedFiles}`,\n\t\t\t`lines_added=${diffStats.linesAdded}`,\n\t\t\t`lines_removed=${diffStats.linesRemoved}`,\n\t\t\t`gates=${gates}`,\n\t\t];\n\t\tawait this.write(parts.join(\" \"));\n\t}\n\n\t/**\n\t * Log the start of preflight checks.\n\t */\n\tasync logPreflightStart(jobCount: number): Promise<void> {\n\t\tawait this.write(`PREFLIGHT_START jobs=${jobCount}`);\n\t}\n\n\t/**\n\t * Log the result of a single preflight check.\n\t */\n\tasync logPreflightResult(\n\t\t_jobId: string,\n\t\t_status: \"pass\" | \"fail\",\n\t\t_reason?: string,\n\t): Promise<void> {\n\t\t// TODO enable at debug level with logtape\n\t\t// const reasonStr = reason ? ` reason=${reason}` : \"\";\n\t\t// await this.write(`PREFLIGHT_CHECK ${jobId} status=${status}${reasonStr}`);\n\t}\n\n\t/**\n\t * Log the end of preflight checks.\n\t */\n\tasync logPreflightEnd(\n\t\trunnable: number,\n\t\tfailed: number,\n\t\tdurationMs: number,\n\t): Promise<void> {\n\t\tawait this.write(\n\t\t\t`PREFLIGHT_END runnable=${runnable} failed=${failed} duration=${durationMs}ms`,\n\t\t);\n\t}\n\n\t/**\n\t * Log the result of a gate execution.\n\t * When `cli` is provided, the adapter name is included in the log entry.\n\t */\n\tasync logGateResult(\n\t\tgateId: string,\n\t\tstatus: string,\n\t\tduration: number,\n\t\topts?: { violations?: number; cli?: string },\n\t): Promise<void> {\n\t\tconst durationStr = `${(duration / 1000).toFixed(1)}s`;\n\t\tconst cliStr = opts?.cli ? ` cli=${opts.cli}` : \"\";\n\t\tconst violationsStr =\n\t\t\topts?.violations !== undefined ? ` violations=${opts.violations}` : \"\";\n\t\tawait this.write(\n\t\t\t`GATE_RESULT ${gateId}${cliStr} status=${status} duration=${durationStr}${violationsStr}`,\n\t\t);\n\t}\n\n\t/**\n\t * Log the end of a run/check/review command.\n\t */\n\tasync logRunEnd(\n\t\tstatus: string,\n\t\tfixed: number,\n\t\tskipped: number,\n\t\tfailed: number,\n\t\titerations: number,\n\t): Promise<void> {\n\t\tconst durationStr =\n\t\t\tthis.runStartTime !== undefined\n\t\t\t\t? ` duration=${((Date.now() - this.runStartTime) / 1000).toFixed(1)}s`\n\t\t\t\t: \"\";\n\t\tawait this.write(\n\t\t\t`RUN_END status=${status} fixed=${fixed} skipped=${skipped} failed=${failed} iterations=${iterations}${durationStr}`,\n\t\t);\n\t}\n\n\t/**\n\t * Log a clean operation.\n\t */\n\tasync logClean(type: \"auto\" | \"manual\", reason: string): Promise<void> {\n\t\tawait this.write(`CLEAN type=${type} reason=${reason}`);\n\t}\n\n\t/**\n\t * Log a stop hook decision.\n\t */\n\tasync logStopHook(\n\t\tdecision: \"allow\" | \"block\",\n\t\treason: string,\n\t): Promise<void> {\n\t\tawait this.write(`STOP_HOOK decision=${decision} reason=${reason}`);\n\t}\n\n\t/**\n\t * Log a start hook invocation.\n\t */\n\tasync logStartHook(adapter: string): Promise<void> {\n\t\tawait this.write(`START_HOOK adapter=${adapter}`);\n\t}\n\n\t/**\n\t * Log stop hook diagnostic information.\n\t * Used to debug duplicate/unexpected stop hook invocations.\n\t */\n\tasync logStopHookDiagnostics(diagnostics: {\n\t\tpid: number;\n\t\tppid: number;\n\t\tenvVarSet: boolean;\n\t\tprocessCwd: string;\n\t\trawStdin: string;\n\t\tstdinSessionId?: string;\n\t\tstdinStopHookActive?: boolean;\n\t\tstdinCwd?: string;\n\t\tstdinHookEventName?: string;\n\t}): Promise<void> {\n\t\tconst parts = [\n\t\t\t\"STOP_HOOK_DIAG\",\n\t\t\t`pid=${diagnostics.pid}`,\n\t\t\t`ppid=${diagnostics.ppid}`,\n\t\t\t`env_var_set=${diagnostics.envVarSet}`,\n\t\t\t`session_id=${diagnostics.stdinSessionId ?? \"none\"}`,\n\t\t\t`stop_hook_active=${diagnostics.stdinStopHookActive ?? \"none\"}`,\n\t\t\t`hook_event=${diagnostics.stdinHookEventName ?? \"none\"}`,\n\t\t\t`stdin_cwd=${diagnostics.stdinCwd ?? \"none\"}`,\n\t\t\t`process_cwd=${diagnostics.processCwd}`,\n\t\t];\n\t\tawait this.write(parts.join(\" \"));\n\t}\n\n\t/**\n\t * Log a stop hook early exit decision.\n\t * These exits happen before full initialization, so a specific event\n\t * is needed to distinguish which code path was taken.\n\t */\n\tasync logStopHookEarlyExit(\n\t\tsource: string,\n\t\tstatus: string,\n\t\tdetail?: string,\n\t): Promise<void> {\n\t\tconst detailStr = detail ? ` detail=${detail}` : \"\";\n\t\tawait this.write(\n\t\t\t`STOP_HOOK_EARLY_EXIT source=${source} status=${status}${detailStr}`,\n\t\t);\n\t}\n\n\t/**\n\t * Log an execution state write, showing only changed fields.\n\t * Skips `last_run_completed_at` since every log line is already timestamped.\n\t */\n\tasync logStateWrite(changes: Record<string, string>): Promise<void> {\n\t\tconst parts = Object.entries(changes).map(\n\t\t\t([key, value]) => `${key}=${value}`,\n\t\t);\n\t\tawait this.write(\n\t\t\t`STATE_WRITE${parts.length > 0 ? ` ${parts.join(\" \")}` : \"\"}`,\n\t\t);\n\t}\n\n\t/**\n\t * Log an execution state deletion.\n\t */\n\tasync logStateDelete(): Promise<void> {\n\t\tawait this.write(\"STATE_DELETE\");\n\t}\n\n\t/**\n\t * Log an adapter health change.\n\t */\n\tasync logAdapterHealthChange(\n\t\tadapter: string,\n\t\thealthy: boolean,\n\t\treason?: string,\n\t): Promise<void> {\n\t\tif (healthy) {\n\t\t\tawait this.write(`STATE_ADAPTER_HEALTHY adapter=${adapter}`);\n\t\t} else {\n\t\t\tconst reasonStr = reason ? ` reason=${reason}` : \"\";\n\t\t\tawait this.write(\n\t\t\t\t`STATE_ADAPTER_UNHEALTHY adapter=${adapter}${reasonStr}`,\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Log a telemetry summary line from an adapter.\n\t * Persists the summary (e.g. \"[otel] cost=$0.12 in=5 out=100\")\n\t * so it survives log cleaning for longitudinal analysis.\n\t */\n\tasync logTelemetry(entry: {\n\t\tadapter: string;\n\t\tsummary: string;\n\t}): Promise<void> {\n\t\tawait this.write(`TELEMETRY adapter=${entry.adapter} ${entry.summary}`);\n\t}\n\n\t/**\n\t * Write a log entry with timestamp.\n\t */\n\tprivate async write(message: string): Promise<void> {\n\t\tif (!this.enabled) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst now = new Date();\n\t\tconst timestamp = `${now.getFullYear()}-${String(now.getMonth() + 1).padStart(2, \"0\")}-${String(now.getDate()).padStart(2, \"0\")}T${String(now.getHours()).padStart(2, \"0\")}:${String(now.getMinutes()).padStart(2, \"0\")}:${String(now.getSeconds()).padStart(2, \"0\")}.${String(now.getMilliseconds()).padStart(3, \"0\")}`;\n\t\tconst entry = `[${timestamp}] ${message}\\n`;\n\n\t\ttry {\n\t\t\t// Check if rotation is needed before writing\n\t\t\tawait this.rotateIfNeeded();\n\n\t\t\t// Ensure directory exists\n\t\t\tawait fs.mkdir(path.dirname(this.logPath), { recursive: true });\n\n\t\t\t// Append the entry\n\t\t\tawait fs.appendFile(this.logPath, entry, \"utf-8\");\n\t\t} catch {\n\t\t\t// Silently fail - debug logging should never break the application\n\t\t}\n\t}\n\n\t/**\n\t * Rotate the log file if it exceeds the size limit.\n\t */\n\tprivate async rotateIfNeeded(): Promise<void> {\n\t\ttry {\n\t\t\tconst stat = await fs.stat(this.logPath);\n\t\t\tif (stat.size >= this.maxSizeBytes) {\n\t\t\t\t// Delete the backup if it exists\n\t\t\t\ttry {\n\t\t\t\t\tawait fs.rm(this.backupPath, { force: true });\n\t\t\t\t} catch {\n\t\t\t\t\t// Ignore\n\t\t\t\t}\n\n\t\t\t\t// Rename current log to backup\n\t\t\t\tawait fs.rename(this.logPath, this.backupPath);\n\t\t\t}\n\t\t} catch {\n\t\t\t// File doesn't exist yet, no rotation needed\n\t\t}\n\t}\n}\n\n/**\n * Merge project and global debug log configs.\n * Project config overrides global config.\n * If neither specifies enabled, debug logging is disabled.\n */\nexport function mergeDebugLogConfig(\n\tprojectConfig?: { enabled?: boolean; max_size_mb?: number },\n\tglobalConfig?: GlobalDebugLogConfig,\n): DebugLogConfig {\n\t// Default values\n\tlet enabled = false;\n\tlet maxSizeMb = 10;\n\n\t// Apply global config if present\n\tif (globalConfig) {\n\t\tenabled = globalConfig.enabled;\n\t\tmaxSizeMb = globalConfig.max_size_mb;\n\t}\n\n\t// Apply project config if present (overrides global)\n\tif (projectConfig !== undefined) {\n\t\tif (projectConfig.enabled !== undefined) {\n\t\t\tenabled = projectConfig.enabled;\n\t\t}\n\t\tif (projectConfig.max_size_mb !== undefined) {\n\t\t\tmaxSizeMb = projectConfig.max_size_mb;\n\t\t}\n\t}\n\n\treturn {\n\t\tenabled,\n\t\tmaxSizeMb,\n\t};\n}\n\n// Singleton instance for global access\nlet debugLoggerInstance: DebugLogger | null = null;\n\n/**\n * Initialize the global debug logger.\n * Should be called early in command execution.\n */\nexport function initDebugLogger(logDir: string, config: DebugLogConfig): void {\n\tdebugLoggerInstance = new DebugLogger(logDir, config);\n}\n\n/**\n * Get the global debug logger instance.\n * Returns null if not initialized.\n */\nexport function getDebugLogger(): DebugLogger | null {\n\treturn debugLoggerInstance;\n}\n\n/**\n * Reset the global debug logger (for testing).\n */\nexport function resetDebugLogger(): void {\n\tdebugLoggerInstance = null;\n}\n",
|
|
29
29
|
"/**\n * All possible outcomes from gauntlet operations.\n * Used by both the run executor and stop-hook - NO MAPPING REQUIRED.\n */\nexport type GauntletStatus =\n\t// Run outcomes (from executor)\n\t| \"passed\" // All gates passed\n\t| \"passed_with_warnings\" // Some issues were skipped\n\t| \"no_applicable_gates\" // No gates matched current changes\n\t| \"no_changes\" // No changes detected\n\t| \"failed\" // Gates failed, retries remaining\n\t| \"retry_limit_exceeded\" // Max retries reached\n\t| \"lock_conflict\" // Another run in progress\n\t| \"error\" // Unexpected error (includes config errors)\n\t| \"pr_push_required\" // Gates passed but PR needs to be created/updated\n\t// CI workflow statuses (after PR is pushed)\n\t| \"ci_pending\" // CI checks still running\n\t| \"ci_failed\" // CI checks failed or review changes requested\n\t| \"ci_passed\" // CI checks passed, no blocking reviews\n\t// Stop-hook pre-checks (before running executor)\n\t| \"validation_required\" // Changes need validation or previous run has unresolved failures\n\t| \"no_config\" // No .gauntlet/config.yml found\n\t| \"stop_hook_active\" // Infinite loop prevention\n\t| \"loop_detected\" // Rapid-fire block loop detected\n\t| \"interval_not_elapsed\" // Run interval hasn't passed\n\t| \"invalid_input\" // Failed to parse hook JSON input\n\t| \"stop_hook_disabled\"; // Stop hook disabled via configuration\n\nexport interface RunResult {\n\tstatus: GauntletStatus;\n\t/** Human-friendly message explaining the outcome */\n\tmessage: string;\n\t/** Number of gates that ran */\n\tgatesRun?: number;\n\t/** Number of gates that failed */\n\tgatesFailed?: number;\n\t/** Path to latest console log file */\n\tconsoleLogPath?: string;\n\t/** Error message if status is \"error\" */\n\terrorMessage?: string;\n\t/** Interval minutes (when status is \"interval_not_elapsed\") */\n\tintervalMinutes?: number;\n\t/** Individual gate results (available when gates were executed) */\n\tgateResults?: Array<{\n\t\tjobId: string;\n\t\tstatus: \"pass\" | \"fail\" | \"error\";\n\t\tlogPath?: string;\n\t\tlogPaths?: string[];\n\t\tsubResults?: Array<{\n\t\t\tnameSuffix: string;\n\t\t\tstatus: \"pass\" | \"fail\" | \"error\";\n\t\t\tlogPath?: string;\n\t\t}>;\n\t}>;\n}\n\n/**\n * Determine if a status should block the stop hook.\n */\nexport function isBlockingStatus(status: GauntletStatus): boolean {\n\treturn (\n\t\tstatus === \"failed\" ||\n\t\tstatus === \"validation_required\" ||\n\t\tstatus === \"pr_push_required\" ||\n\t\tstatus === \"ci_pending\" ||\n\t\tstatus === \"ci_failed\"\n\t);\n}\n\n/**\n * Determine if a status indicates successful completion (exit code 0).\n */\nexport function isSuccessStatus(status: GauntletStatus): boolean {\n\treturn (\n\t\tstatus === \"passed\" ||\n\t\tstatus === \"passed_with_warnings\" ||\n\t\tstatus === \"no_applicable_gates\" ||\n\t\tstatus === \"no_changes\" ||\n\t\tstatus === \"ci_passed\"\n\t);\n}\n",
|
|
30
30
|
"/** Maps unified thinking budget levels to Claude MAX_THINKING_TOKENS values. */\nexport const CLAUDE_THINKING_TOKENS: Record<string, number> = {\n\toff: 0,\n\tlow: 8000,\n\tmedium: 16000,\n\thigh: 31999,\n};\n\n/** Maps unified thinking budget levels to Codex model_reasoning_effort values. */\nexport const CODEX_REASONING_EFFORT: Record<string, string> = {\n\toff: \"minimal\",\n\tlow: \"low\",\n\tmedium: \"medium\",\n\thigh: \"high\",\n};\n\n/** Maps unified thinking budget levels to Gemini thinkingBudget values. */\nexport const GEMINI_THINKING_BUDGET: Record<string, number> = {\n\toff: 0,\n\tlow: 4096,\n\tmedium: 8192,\n\thigh: 24576,\n};\n",
|
|
31
|
-
"import { exec } from \"node:child_process\";\nimport fs from \"node:fs/promises\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { promisify } from \"node:util\";\nimport { getDebugLogger } from \"../utils/debug-log.js\";\nimport { type CLIAdapter, runStreamingCommand } from \"./index.js\";\nimport { CODEX_REASONING_EFFORT } from \"./thinking-budget.js\";\n\nconst execAsync = promisify(exec);\nconst MAX_BUFFER_BYTES = 10 * 1024 * 1024;\n\ninterface CodexUsage {\n\tinputTokens?: number;\n\tcachedInputTokens?: number;\n\toutputTokens?: number;\n\ttoolCalls?: number;\n\tapiRequests?: number;\n}\n\n/** Parse a single JSONL line into a typed event, or undefined on failure. */\nfunction parseJsonlLine(\n\tline: string,\n): { type: string; [key: string]: unknown } | undefined {\n\ttry {\n\t\tconst obj = JSON.parse(line);\n\t\tif (obj && typeof obj.type === \"string\") return obj;\n\t} catch {\n\t\t/* skip malformed lines */\n\t}\n\treturn undefined;\n}\n\n/** Maps Codex turn usage JSON fields to CodexUsage fields. */\nconst TURN_USAGE_MAP: Array<[string, keyof CodexUsage]> = [\n\t[\"input_tokens\", \"inputTokens\"],\n\t[\"cached_input_tokens\", \"cachedInputTokens\"],\n\t[\"output_tokens\", \"outputTokens\"],\n];\n\n/** Accumulate a turn.completed event's usage into totals. */\nfunction accumulateTurnUsage(\n\tevent: { type: string; [key: string]: unknown },\n\tusage: CodexUsage,\n): void {\n\tconst u = event.usage as Record<string, number | undefined> | undefined;\n\tif (!u) return;\n\tusage.apiRequests = (usage.apiRequests || 0) + 1;\n\tfor (const [jsonKey, usageKey] of TURN_USAGE_MAP) {\n\t\tif (u[jsonKey] !== undefined) {\n\t\t\tusage[usageKey] = (usage[usageKey] || 0) + (u[jsonKey] ?? 0);\n\t\t}\n\t}\n}\n\n/** Check if an item.completed event represents a tool call (command, file, mcp). */\nfunction isToolCallItem(event: {\n\ttype: string;\n\t[key: string]: unknown;\n}): boolean {\n\tconst item = event.item as { type?: string } | undefined;\n\tif (!item?.type) return false;\n\treturn (\n\t\titem.type === \"command_execution\" ||\n\t\titem.type === \"file_change\" ||\n\t\titem.type === \"mcp_tool_call\"\n\t);\n}\n\n/** Extract the final agent message text from a completed item. */\nfunction extractAgentMessage(event: {\n\ttype: string;\n\t[key: string]: unknown;\n}): string | undefined {\n\tconst item = event.item as { type?: string; text?: string } | undefined;\n\tif (item?.type === \"agent_message\" && typeof item.text === \"string\") {\n\t\treturn item.text;\n\t}\n\treturn undefined;\n}\n\nconst SUMMARY_FIELDS: Array<[keyof CodexUsage, string]> = [\n\t[\"inputTokens\", \"in\"],\n\t[\"cachedInputTokens\", \"cache\"],\n\t[\"outputTokens\", \"out\"],\n\t[\"toolCalls\", \"tool_calls\"],\n\t[\"apiRequests\", \"api_requests\"],\n];\n\nfunction formatCodexSummary(usage: CodexUsage): string | null {\n\tconst parts = SUMMARY_FIELDS.filter(([key]) => usage[key] !== undefined).map(\n\t\t([key, label]) => `${label}=${usage[key]}`,\n\t);\n\treturn parts.length > 0 ? `[codex-telemetry] ${parts.join(\" \")}` : null;\n}\n\n/** Process a single item.completed event, updating usage and returning any agent message. */\nfunction processItemCompleted(\n\tevent: { type: string; [key: string]: unknown },\n\tusage: CodexUsage,\n): string | undefined {\n\tif (isToolCallItem(event)) {\n\t\tusage.toolCalls = (usage.toolCalls || 0) + 1;\n\t}\n\treturn extractAgentMessage(event);\n}\n\n/** Route a parsed JSONL event to the appropriate handler, returning any agent message. */\nfunction processCodexEvent(\n\tevent: { type: string; [key: string]: unknown },\n\tusage: CodexUsage,\n): string | undefined {\n\tif (event.type === \"turn.completed\") {\n\t\taccumulateTurnUsage(event, usage);\n\t\treturn undefined;\n\t}\n\tif (event.type === \"item.completed\") {\n\t\treturn processItemCompleted(event, usage);\n\t}\n\treturn undefined;\n}\n\n/** Emit a telemetry summary to logs and debug log. */\nfunction emitCodexSummary(\n\tusage: CodexUsage,\n\tonLog?: (msg: string) => void,\n): void {\n\tconst summary = formatCodexSummary(usage);\n\tif (!summary) return;\n\tonLog?.(`\\n${summary}\\n`);\n\tprocess.stderr.write(`${summary}\\n`);\n\tgetDebugLogger()?.logTelemetry({ adapter: \"codex\", summary });\n}\n\n/**\n * Parse JSONL output from `codex exec --json`, extracting the final agent\n * message, token usage, and tool call counts.\n */\nfunction parseCodexJsonl(\n\traw: string,\n\tonLog?: (msg: string) => void,\n): { text: string; usage: CodexUsage } {\n\tconst usage: CodexUsage = {};\n\tlet lastAgentMessage = \"\";\n\n\tfor (const line of raw.split(\"\\n\")) {\n\t\tconst event = parseJsonlLine(line.trim());\n\t\tif (!event) continue;\n\t\tconst msg = processCodexEvent(event, usage);\n\t\tif (msg !== undefined) lastAgentMessage = msg;\n\t}\n\n\temitCodexSummary(usage, onLog);\n\treturn { text: lastAgentMessage, usage };\n}\n\nexport class CodexAdapter implements CLIAdapter {\n\tname = \"codex\";\n\n\tasync isAvailable(): Promise<boolean> {\n\t\ttry {\n\t\t\tawait execAsync(\"which codex\");\n\t\t\treturn true;\n\t\t} catch {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tasync checkHealth(): Promise<{\n\t\tavailable: boolean;\n\t\tstatus: \"healthy\" | \"missing\" | \"unhealthy\";\n\t\tmessage?: string;\n\t}> {\n\t\tconst available = await this.isAvailable();\n\t\tif (!available) {\n\t\t\treturn {\n\t\t\t\tavailable: false,\n\t\t\t\tstatus: \"missing\",\n\t\t\t\tmessage: \"Command not found\",\n\t\t\t};\n\t\t}\n\n\t\treturn { available: true, status: \"healthy\", message: \"Installed\" };\n\t}\n\n\tgetProjectCommandDir(): string | null {\n\t\t// Codex only supports user-level prompts at ~/.codex/prompts/\n\t\t// No project-scoped commands available\n\t\treturn null;\n\t}\n\n\tgetUserCommandDir(): string | null {\n\t\t// Codex uses user-level prompts at ~/.codex/prompts/\n\t\treturn path.join(os.homedir(), \".codex\", \"prompts\");\n\t}\n\n\tgetProjectSkillDir(): string | null {\n\t\treturn null;\n\t}\n\n\tgetUserSkillDir(): string | null {\n\t\treturn null;\n\t}\n\n\tgetCommandExtension(): string {\n\t\treturn \".md\";\n\t}\n\n\tcanUseSymlink(): boolean {\n\t\t// Codex uses the same Markdown format as our canonical file\n\t\treturn true;\n\t}\n\n\ttransformCommand(markdownContent: string): string {\n\t\t// Codex uses the same Markdown format as Claude, no transformation needed\n\t\treturn markdownContent;\n\t}\n\n\tprivate buildArgs(allowToolUse?: boolean, thinkingBudget?: string): string[] {\n\t\tconst args = [\n\t\t\t\"exec\",\n\t\t\t\"--cd\",\n\t\t\tprocess.cwd(),\n\t\t\t\"--sandbox\",\n\t\t\t\"read-only\",\n\t\t\t\"-c\",\n\t\t\t'ask_for_approval=\"never\"',\n\t\t];\n\t\tif (allowToolUse === false) {\n\t\t\targs.push(\"--disable\", \"shell_tool\");\n\t\t}\n\t\tif (thinkingBudget && thinkingBudget in CODEX_REASONING_EFFORT) {\n\t\t\tconst effort = CODEX_REASONING_EFFORT[thinkingBudget];\n\t\t\targs.push(\"-c\", `model_reasoning_effort=\"${effort}\"`);\n\t\t}\n\t\targs.push(\"--json\", \"-\");\n\t\treturn args;\n\t}\n\n\tasync execute(opts: {\n\t\tprompt: string;\n\t\tdiff: string;\n\t\tmodel?: string;\n\t\ttimeoutMs?: number;\n\t\tonOutput?: (chunk: string) => void;\n\t\tallowToolUse?: boolean;\n\t\tthinkingBudget?: string;\n\t}): Promise<string> {\n\t\tconst fullContent = `${opts.prompt}\\n\\n--- DIFF ---\\n${opts.diff}`;\n\n\t\tconst tmpDir = os.tmpdir();\n\t\tconst tmpFile = path.join(tmpDir, `gauntlet-codex-${Date.now()}.txt`);\n\t\tawait fs.writeFile(tmpFile, fullContent);\n\n\t\tconst args = this.buildArgs(opts.allowToolUse, opts.thinkingBudget);\n\n\t\tconst cleanup = () => fs.unlink(tmpFile).catch(() => {});\n\n\t\t// If onOutput callback is provided, use spawn for real-time streaming\n\t\tif (opts.onOutput) {\n\t\t\tconst raw = await runStreamingCommand({\n\t\t\t\tcommand: \"codex\",\n\t\t\t\targs,\n\t\t\t\ttmpFile,\n\t\t\t\ttimeoutMs: opts.timeoutMs,\n\t\t\t\tonOutput: (chunk: string) => {\n\t\t\t\t\topts.onOutput?.(chunk);\n\t\t\t\t},\n\t\t\t\tcleanup,\n\t\t\t});\n\n\t\t\tconst { text } = parseCodexJsonl(raw, opts.onOutput);\n\t\t\treturn text || raw.trimEnd();\n\t\t}\n\n\t\t// Otherwise use exec for buffered output\n\t\ttry {\n\t\t\tconst quoteArg = (a: string) => `\"${a.replace(/([\"\\\\$`])/g, \"\\\\$1\")}\"`;\n\t\t\tconst cmd = `cat \"${tmpFile}\" | codex ${args.map(quoteArg).join(\" \")}`;\n\t\t\tconst { stdout } = await execAsync(cmd, {\n\t\t\t\ttimeout: opts.timeoutMs,\n\t\t\t\tmaxBuffer: MAX_BUFFER_BYTES,\n\t\t\t});\n\t\t\tconst { text } = parseCodexJsonl(stdout);\n\t\t\treturn text || stdout.trimEnd();\n\t\t} finally {\n\t\t\tawait cleanup();\n\t\t}\n\t}\n}\n",
|
|
32
|
-
"import { exec } from \"node:child_process\";\nimport fs from \"node:fs/promises\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { promisify } from \"node:util\";\nimport { type CLIAdapter, runStreamingCommand } from \"./index.js\";\n\nconst execAsync = promisify(exec);\nconst MAX_BUFFER_BYTES = 10 * 1024 * 1024;\n\nexport class CursorAdapter implements CLIAdapter {\n\tname = \"cursor\";\n\n\tasync isAvailable(): Promise<boolean> {\n\t\ttry {\n\t\t\t// Note: Cursor's CLI binary is named \"agent\", not \"cursor\"\n\t\t\tawait execAsync(\"which agent\");\n\t\t\treturn true;\n\t\t} catch {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tasync checkHealth(): Promise<{\n\t\tavailable: boolean;\n\t\tstatus: \"healthy\" | \"missing\" | \"unhealthy\";\n\t\tmessage?: string;\n\t}> {\n\t\tconst available = await this.isAvailable();\n\t\tif (!available) {\n\t\t\treturn {\n\t\t\t\tavailable: false,\n\t\t\t\tstatus: \"missing\",\n\t\t\t\tmessage: \"Command not found\",\n\t\t\t};\n\t\t}\n\n\t\treturn { available: true, status: \"healthy\", message: \"Ready\" };\n\t}\n\n\tgetProjectCommandDir(): string | null {\n\t\t// Cursor does not support custom commands\n\t\treturn null;\n\t}\n\n\tgetUserCommandDir(): string | null {\n\t\t// Cursor does not support custom commands\n\t\treturn null;\n\t}\n\n\tgetProjectSkillDir(): string | null {\n\t\treturn null;\n\t}\n\n\tgetUserSkillDir(): string | null {\n\t\treturn null;\n\t}\n\n\tgetCommandExtension(): string {\n\t\treturn \".md\";\n\t}\n\n\tcanUseSymlink(): boolean {\n\t\t// Not applicable - no command directory support\n\t\treturn false;\n\t}\n\n\ttransformCommand(markdownContent: string): string {\n\t\t// Not applicable - no command directory support\n\t\treturn markdownContent;\n\t}\n\n\tasync execute(opts: {\n\t\tprompt: string;\n\t\tdiff: string;\n\t\tmodel?: string;\n\t\ttimeoutMs?: number;\n\t\tonOutput?: (chunk: string) => void;\n\t}): Promise<string> {\n\t\tconst fullContent = `${opts.prompt}\\n\\n--- DIFF ---\\n${opts.diff}`;\n\n\t\tconst tmpDir = os.tmpdir();\n\t\t// Include process.pid for uniqueness across concurrent processes\n\t\tconst tmpFile = path.join(\n\t\t\ttmpDir,\n\t\t\t`gauntlet-cursor-${process.pid}-${Date.now()}.txt`,\n\t\t);\n\t\tawait fs.writeFile(tmpFile, fullContent);\n\n\t\t// Cursor agent command reads from stdin\n\t\t// Note: As of the current version, the Cursor 'agent' CLI does not expose\n\t\t// flags for restricting tools or enforcing read-only mode (unlike claude's --allowedTools\n\t\t// or codex's --sandbox read-only). The agent is assumed to be repo-scoped and\n\t\t// safe for code review use. If Cursor adds such flags in the future, they should\n\t\t// be added here for defense-in-depth.\n\n\t\tconst cleanup = () => fs.unlink(tmpFile).catch(() => {});\n\n\t\t// If onOutput callback is provided, use spawn for real-time streaming\n\t\tif (opts.onOutput) {\n\t\t\treturn runStreamingCommand({\n\t\t\t\tcommand: \"agent\",\n\t\t\t\targs: [],\n\t\t\t\ttmpFile,\n\t\t\t\ttimeoutMs: opts.timeoutMs,\n\t\t\t\tonOutput: opts.onOutput,\n\t\t\t\tcleanup,\n\t\t\t});\n\t\t}\n\n\t\t// Otherwise use exec for buffered output\n\t\t// Shell command construction: We use exec() with shell piping\n\t\t// because the agent requires stdin input. The tmpFile path is system-controlled\n\t\t// (os.tmpdir() + Date.now() + process.pid), not user-supplied, eliminating injection risk.\n\t\t// Double quotes handle paths with spaces.\n\t\ttry {\n\t\t\tconst cmd = `cat \"${tmpFile}\" | agent`;\n\t\t\tconst { stdout } = await execAsync(cmd, {\n\t\t\t\ttimeout: opts.timeoutMs,\n\t\t\t\tmaxBuffer: MAX_BUFFER_BYTES,\n\t\t\t});\n\t\t\treturn stdout;\n\t\t} finally {\n\t\t\t// Cleanup errors are intentionally ignored - the tmp file will be cleaned up by OS\n\t\t\tawait cleanup();\n\t\t}\n\t}\n}\n",
|
|
33
|
-
"import { exec } from \"node:child_process\";\nimport fs from \"node:fs/promises\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { promisify } from \"node:util\";\nimport { getDebugLogger } from \"../utils/debug-log.js\";\nimport { type CLIAdapter, runStreamingCommand } from \"./index.js\";\nimport { GEMINI_THINKING_BUDGET } from \"./thinking-budget.js\";\n\nconst execAsync = promisify(exec);\nconst MAX_BUFFER_BYTES = 10 * 1024 * 1024;\n\ninterface GeminiTelemetryUsage {\n\tinputTokens?: number;\n\toutputTokens?: number;\n\tthoughtTokens?: number;\n\tcacheTokens?: number;\n\ttoolTokens?: number;\n\ttoolCalls?: number;\n\ttoolContentChars?: number;\n\tapiRequests?: number;\n}\n\ntype TokenType = \"input\" | \"output\" | \"thought\" | \"cache\" | \"tool\";\nconst TOKEN_TYPE_MAP: Record<TokenType, keyof GeminiTelemetryUsage> = {\n\tinput: \"inputTokens\",\n\toutput: \"outputTokens\",\n\tthought: \"thoughtTokens\",\n\tcache: \"cacheTokens\",\n\ttool: \"toolTokens\",\n};\n\n// Gemini CLI telemetry file contains pretty-printed JSON objects (not OTLP).\n// The metric object has { resource, scopeMetrics: [{ scope, metrics }] }.\n// Each metric has { descriptor: { name, type }, dataPoints: [{ value, attributes }] }.\n\ninterface SdkDataPoint {\n\tvalue: number | { sum?: number };\n\tattributes?: Record<string, string | number | boolean>;\n}\n\ninterface SdkMetric {\n\tdescriptor?: { name?: string };\n\tdataPoints?: SdkDataPoint[];\n}\n\ninterface SdkScopeMetrics {\n\tmetrics?: SdkMetric[];\n}\n\nfunction extractTokenType(dp: SdkDataPoint): TokenType | null {\n\tconst type =\n\t\tdp.attributes?.type ?? dp.attributes?.[\"gen_ai.token.type\"] ?? null;\n\treturn typeof type === \"string\" && type in TOKEN_TYPE_MAP\n\t\t? (type as TokenType)\n\t\t: null;\n}\n\nfunction extractValue(dp: SdkDataPoint): number {\n\tif (typeof dp.value === \"number\") return dp.value;\n\treturn dp.value?.sum ?? 0;\n}\n\nfunction processDataPoints(\n\tdataPoints: SdkDataPoint[],\n\tusage: GeminiTelemetryUsage,\n): void {\n\tfor (const dp of dataPoints) {\n\t\tconst tokenType = extractTokenType(dp);\n\t\tif (!tokenType) continue;\n\t\tconst key = TOKEN_TYPE_MAP[tokenType];\n\t\tusage[key] = (usage[key] || 0) + extractValue(dp);\n\t}\n}\n\nconst TOKEN_METRIC_NAMES = new Set([\n\t\"gemini_cli.token.usage\",\n\t\"gen_ai.client.token.usage\",\n]);\n\n/**\n * Find [start, end) index pairs for each top-level `{…}` in a string\n * whose JSON string literals have already been blanked out.\n */\nfunction handleOpen(i: number, depth: number, start: number): [number, number] {\n\treturn [depth + 1, depth === 0 ? i : start];\n}\n\nfunction handleClose(\n\ti: number,\n\tdepth: number,\n\tstart: number,\n\tranges: Array<[number, number]>,\n): [number, number] {\n\tconst next = depth - 1;\n\tif (next === 0 && start >= 0) {\n\t\tranges.push([start, i + 1]);\n\t\treturn [next, -1];\n\t}\n\treturn [next, start];\n}\n\nfunction findObjectBoundaries(stripped: string): Array<[number, number]> {\n\tconst ranges: Array<[number, number]> = [];\n\tlet depth = 0;\n\tlet start = -1;\n\tfor (let i = 0; i < stripped.length; i++) {\n\t\tconst ch = stripped[i];\n\t\tif (ch === \"{\") [depth, start] = handleOpen(i, depth, start);\n\t\telse if (ch === \"}\") [depth, start] = handleClose(i, depth, start, ranges);\n\t}\n\treturn ranges;\n}\n\n/**\n * Parse top-level JSON objects from telemetry content.\n * Blanks string literals (preserving length) before brace-counting\n * so braces inside strings are ignored.\n */\nfunction parseJsonObjects(content: string): unknown[] {\n\tconst stripped = content.replace(/\"(?:[^\"\\\\]|\\\\.)*\"/g, (m) =>\n\t\t\" \".repeat(m.length),\n\t);\n\tconst objects: unknown[] = [];\n\tfor (const [s, e] of findObjectBoundaries(stripped)) {\n\t\ttry {\n\t\t\tobjects.push(JSON.parse(content.slice(s, e)));\n\t\t} catch {\n\t\t\t// Skip malformed objects\n\t\t}\n\t}\n\treturn objects;\n}\n\n/** Sum all data point values for a counter metric. */\nfunction sumDataPoints(dataPoints: SdkDataPoint[]): number {\n\tlet total = 0;\n\tfor (const dp of dataPoints) {\n\t\ttotal += extractValue(dp);\n\t}\n\treturn total;\n}\n\n/** Route a single metric to the appropriate usage field. */\nfunction processMetric(metric: SdkMetric, usage: GeminiTelemetryUsage): void {\n\tconst name = metric.descriptor?.name;\n\tif (!name) return;\n\tconst dataPoints = metric.dataPoints ?? [];\n\n\tif (TOKEN_METRIC_NAMES.has(name)) {\n\t\tprocessDataPoints(dataPoints, usage);\n\t\treturn;\n\t}\n\tif (name === \"gemini_cli.tool.call.count\") {\n\t\tusage.toolCalls = (usage.toolCalls || 0) + sumDataPoints(dataPoints);\n\t\treturn;\n\t}\n\tif (name === \"gemini_cli.api.request.count\") {\n\t\tusage.apiRequests = (usage.apiRequests || 0) + sumDataPoints(dataPoints);\n\t}\n}\n\nfunction processMetricObject(data: unknown, usage: GeminiTelemetryUsage): void {\n\tconst obj = data as { scopeMetrics?: SdkScopeMetrics[] };\n\tif (!obj?.scopeMetrics) return;\n\tfor (const sm of obj.scopeMetrics) {\n\t\tfor (const metric of sm.metrics ?? []) {\n\t\t\tprocessMetric(metric, usage);\n\t\t}\n\t}\n}\n\n/**\n * Extract tool call details from OTel log records.\n * The Gemini CLI emits `gemini_cli.tool_call` log events with\n * content_length attributes that reveal how much data tools read.\n */\ninterface SdkLogRecord {\n\tbody?: { stringValue?: string };\n\tattributes?: Array<{\n\t\tkey: string;\n\t\tvalue: { intValue?: string; stringValue?: string };\n\t}>;\n}\n\ninterface SdkScopeLogs {\n\tlogRecords?: SdkLogRecord[];\n}\n\n/** Extract content_length from a tool_call log record, or 0 if absent. */\nfunction extractToolContentLength(record: SdkLogRecord): number {\n\tconst attr = record.attributes?.find((a) => a.key === \"content_length\");\n\tif (!attr?.value?.intValue) return 0;\n\tconst len = parseInt(attr.value.intValue, 10);\n\treturn Number.isNaN(len) ? 0 : len;\n}\n\n/** Sum content_length across all tool_call log records in a scope. */\nfunction sumToolContentChars(records: SdkLogRecord[]): number {\n\tlet total = 0;\n\tfor (const record of records) {\n\t\tif (record.body?.stringValue !== \"gemini_cli.tool_call\") continue;\n\t\ttotal += extractToolContentLength(record);\n\t}\n\treturn total;\n}\n\nfunction processLogObject(data: unknown, usage: GeminiTelemetryUsage): void {\n\tconst obj = data as { scopeLogs?: SdkScopeLogs[] };\n\tif (!obj?.scopeLogs) return;\n\tfor (const sl of obj.scopeLogs) {\n\t\tconst chars = sumToolContentChars(sl.logRecords ?? []);\n\t\tif (chars > 0) {\n\t\t\tusage.toolContentChars = (usage.toolContentChars || 0) + chars;\n\t\t}\n\t}\n}\n\nasync function parseGeminiTelemetry(\n\tfilePath: string,\n): Promise<GeminiTelemetryUsage> {\n\tconst usage: GeminiTelemetryUsage = {};\n\tlet content: string;\n\n\ttry {\n\t\tcontent = await fs.readFile(filePath, \"utf-8\");\n\t} catch {\n\t\treturn usage;\n\t}\n\n\tfor (const obj of parseJsonObjects(content)) {\n\t\tprocessMetricObject(obj, usage);\n\t\tprocessLogObject(obj, usage);\n\t}\n\n\treturn usage;\n}\n\nconst SUMMARY_FIELDS: Array<[keyof GeminiTelemetryUsage, string]> = [\n\t[\"inputTokens\", \"in\"],\n\t[\"outputTokens\", \"out\"],\n\t[\"thoughtTokens\", \"thought\"],\n\t[\"cacheTokens\", \"cache\"],\n\t[\"toolTokens\", \"tool\"],\n\t[\"toolCalls\", \"tool_calls\"],\n\t[\"toolContentChars\", \"tool_content_chars\"],\n\t[\"apiRequests\", \"api_requests\"],\n];\n\nfunction formatGeminiSummary(usage: GeminiTelemetryUsage): string | null {\n\tconst parts = SUMMARY_FIELDS.filter(([key]) => usage[key] !== undefined).map(\n\t\t([key, label]) => `${label}=${usage[key]}`,\n\t);\n\treturn parts.length > 0 ? `[telemetry] ${parts.join(\" \")}` : null;\n}\n\nasync function logTelemetryToStderr(telemetryFile: string): Promise<void> {\n\tif (process.env.GEMINI_TELEMETRY_OUTFILE) return;\n\tconst usage = await parseGeminiTelemetry(telemetryFile);\n\tconst summary = formatGeminiSummary(usage);\n\tif (summary) {\n\t\tprocess.stderr.write(`${summary}\\n`);\n\t\tgetDebugLogger()?.logTelemetry({ adapter: \"gemini\", summary });\n\t}\n}\n\nexport class GeminiAdapter implements CLIAdapter {\n\tname = \"gemini\";\n\n\tasync isAvailable(): Promise<boolean> {\n\t\ttry {\n\t\t\tawait execAsync(\"which gemini\");\n\t\t\treturn true;\n\t\t} catch {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tasync checkHealth(): Promise<{\n\t\tavailable: boolean;\n\t\tstatus: \"healthy\" | \"missing\" | \"unhealthy\";\n\t\tmessage?: string;\n\t}> {\n\t\tconst available = await this.isAvailable();\n\t\tif (!available) {\n\t\t\treturn {\n\t\t\t\tavailable: false,\n\t\t\t\tstatus: \"missing\",\n\t\t\t\tmessage: \"Command not found\",\n\t\t\t};\n\t\t}\n\n\t\treturn { available: true, status: \"healthy\", message: \"Installed\" };\n\t}\n\n\tgetProjectCommandDir(): string | null {\n\t\treturn \".gemini/commands\";\n\t}\n\n\tgetUserCommandDir(): string | null {\n\t\treturn path.join(os.homedir(), \".gemini\", \"commands\");\n\t}\n\n\tgetProjectSkillDir(): string | null {\n\t\treturn null;\n\t}\n\n\tgetUserSkillDir(): string | null {\n\t\treturn null;\n\t}\n\n\tgetCommandExtension(): string {\n\t\treturn \".toml\";\n\t}\n\n\tcanUseSymlink(): boolean {\n\t\treturn false;\n\t}\n\n\ttransformCommand(markdownContent: string): string {\n\t\tconst fmMatch = markdownContent.match(/^---\\n([\\s\\S]*?)\\n---\\n([\\s\\S]*)$/);\n\t\tlet description = \"Run the gauntlet verification suite\";\n\t\tconst body = fmMatch ? (fmMatch[2] ?? \"\") : markdownContent;\n\n\t\tif (fmMatch) {\n\t\t\tfor (const line of (fmMatch[1] ?? \"\").split(\"\\n\")) {\n\t\t\t\tconst kv = line.match(/^description:\\s*(.*)$/);\n\t\t\t\tif (kv?.[1]) description = kv[1].trim();\n\t\t\t}\n\t\t}\n\n\t\treturn `description = ${JSON.stringify(description)}\nprompt = \"\"\"\n${body.trim()}\n\"\"\"\n`;\n\t}\n\n\tprivate async logTelemetry(\n\t\ttelemetryFile: string,\n\t\tonOutput: (chunk: string) => void,\n\t): Promise<void> {\n\t\tif (process.env.GEMINI_TELEMETRY_OUTFILE) return;\n\t\tconst usage = await parseGeminiTelemetry(telemetryFile);\n\t\tconst summary = formatGeminiSummary(usage);\n\t\tif (summary) {\n\t\t\tonOutput(`\\n${summary}\\n`);\n\t\t\tprocess.stderr.write(`${summary}\\n`);\n\t\t\tgetDebugLogger()?.logTelemetry({ adapter: \"gemini\", summary });\n\t\t}\n\t}\n\n\t/**\n\t * Serialize access to .gemini/settings.json across concurrent Gemini instances.\n\t * When multiple Gemini adapters run in parallel (num_reviews > 1 with\n\t * cli_preference: [\"gemini\"]), each waits for the previous to finish\n\t * before writing its settings.\n\t */\n\tprivate static settingsLock: Promise<void> = Promise.resolve();\n\n\tprivate async applyThinkingSettings(\n\t\tbudget: number,\n\t): Promise<() => Promise<void>> {\n\t\tlet releaseLock = () => {};\n\t\tconst prev = GeminiAdapter.settingsLock;\n\t\tGeminiAdapter.settingsLock = new Promise((resolve) => {\n\t\t\treleaseLock = resolve;\n\t\t});\n\t\tawait prev;\n\n\t\tconst settingsPath = path.join(process.cwd(), \".gemini\", \"settings.json\");\n\t\tlet backup: string | null = null;\n\t\tlet existed = false;\n\n\t\ttry {\n\t\t\ttry {\n\t\t\t\tbackup = await fs.readFile(settingsPath, \"utf-8\");\n\t\t\t\texisted = true;\n\t\t\t} catch {\n\t\t\t\t// No existing file\n\t\t\t}\n\n\t\t\tconst existing = backup ? JSON.parse(backup) : {};\n\t\t\tconst merged = {\n\t\t\t\t...existing,\n\t\t\t\tthinkingConfig: { ...existing.thinkingConfig, thinkingBudget: budget },\n\t\t\t};\n\n\t\t\tawait fs.mkdir(path.dirname(settingsPath), { recursive: true });\n\t\t\tawait fs.writeFile(settingsPath, JSON.stringify(merged, null, 2));\n\t\t} catch (err) {\n\t\t\treleaseLock();\n\t\t\tthrow err;\n\t\t}\n\n\t\treturn async () => {\n\t\t\ttry {\n\t\t\t\tif (existed && backup !== null) {\n\t\t\t\t\tawait fs.writeFile(settingsPath, backup);\n\t\t\t\t} else {\n\t\t\t\t\tawait fs.unlink(settingsPath).catch(() => {});\n\t\t\t\t}\n\t\t\t} finally {\n\t\t\t\treleaseLock();\n\t\t\t}\n\t\t};\n\t}\n\n\tprivate buildTelemetryEnv(telemetryFile: string): Record<string, string> {\n\t\tconst env: Record<string, string> = {};\n\t\tif (!process.env.GEMINI_TELEMETRY_ENABLED) {\n\t\t\tenv.GEMINI_TELEMETRY_ENABLED = \"true\";\n\t\t}\n\t\tif (!process.env.GEMINI_TELEMETRY_TARGET) {\n\t\t\tenv.GEMINI_TELEMETRY_TARGET = \"local\";\n\t\t}\n\t\tif (!process.env.GEMINI_TELEMETRY_OUTFILE) {\n\t\t\tenv.GEMINI_TELEMETRY_OUTFILE = telemetryFile;\n\t\t}\n\t\treturn env;\n\t}\n\n\tprivate buildArgs(allowToolUse?: boolean): string[] {\n\t\tconst args = [\"--sandbox\"];\n\t\tif (allowToolUse !== false) {\n\t\t\targs.push(\n\t\t\t\t\"--allowed-tools\",\n\t\t\t\t\"read_file,list_directory,glob,search_file_content\",\n\t\t\t);\n\t\t}\n\t\targs.push(\"--output-format\", \"text\");\n\t\treturn args;\n\t}\n\n\tprivate async maybeApplyThinking(\n\t\tlevel?: string,\n\t): Promise<(() => Promise<void>) | undefined> {\n\t\tif (!level || !(level in GEMINI_THINKING_BUDGET)) return undefined;\n\t\treturn this.applyThinkingSettings(GEMINI_THINKING_BUDGET[level] as number);\n\t}\n\n\tasync execute(opts: {\n\t\tprompt: string;\n\t\tdiff: string;\n\t\tmodel?: string;\n\t\ttimeoutMs?: number;\n\t\tonOutput?: (chunk: string) => void;\n\t\tallowToolUse?: boolean;\n\t\tthinkingBudget?: string;\n\t}): Promise<string> {\n\t\tconst fullContent = `${opts.prompt}\\n\\n--- DIFF ---\\n${opts.diff}`;\n\n\t\tconst tmpDir = os.tmpdir();\n\t\tconst tmpFile = path.join(\n\t\t\ttmpDir,\n\t\t\t`gauntlet-gemini-${process.pid}-${Date.now()}.txt`,\n\t\t);\n\t\tawait fs.writeFile(tmpFile, fullContent);\n\n\t\t// Use cwd for telemetry file — Gemini's --sandbox restricts writes\n\t\t// to the project directory, so os.tmpdir() would fail with EPERM.\n\t\tconst telemetryFile = path.join(\n\t\t\tprocess.cwd(),\n\t\t\t`.gauntlet-gemini-telemetry-${process.pid}-${Date.now()}.log`,\n\t\t);\n\n\t\tconst telemetryEnv = this.buildTelemetryEnv(telemetryFile);\n\t\tconst args = this.buildArgs(opts.allowToolUse);\n\t\tconst cleanupThinking = await this.maybeApplyThinking(opts.thinkingBudget);\n\n\t\tconst cleanup = () => fs.unlink(tmpFile).catch(() => {});\n\t\tconst cleanupTelemetry = () => fs.unlink(telemetryFile).catch(() => {});\n\n\t\ttry {\n\t\t\tif (opts.onOutput) {\n\t\t\t\ttry {\n\t\t\t\t\tconst result = await runStreamingCommand({\n\t\t\t\t\t\tcommand: \"gemini\",\n\t\t\t\t\t\targs,\n\t\t\t\t\t\ttmpFile,\n\t\t\t\t\t\ttimeoutMs: opts.timeoutMs,\n\t\t\t\t\t\tonOutput: opts.onOutput,\n\t\t\t\t\t\tcleanup,\n\t\t\t\t\t\tenv: { ...process.env, ...telemetryEnv },\n\t\t\t\t\t});\n\t\t\t\t\tawait this.logTelemetry(telemetryFile, opts.onOutput);\n\t\t\t\t\treturn result;\n\t\t\t\t} finally {\n\t\t\t\t\tawait cleanupTelemetry();\n\t\t\t\t}\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tconst cmd = `gemini ${args.join(\" \")} < \"${tmpFile}\"`;\n\t\t\t\tconst { stdout } = await execAsync(cmd, {\n\t\t\t\t\ttimeout: opts.timeoutMs,\n\t\t\t\t\tmaxBuffer: MAX_BUFFER_BYTES,\n\t\t\t\t\tenv: { ...process.env, ...telemetryEnv },\n\t\t\t\t});\n\t\t\t\tawait logTelemetryToStderr(telemetryFile);\n\t\t\t\treturn stdout;\n\t\t\t} finally {\n\t\t\t\tawait cleanup();\n\t\t\t\tawait cleanupTelemetry();\n\t\t\t}\n\t\t} finally {\n\t\t\tawait cleanupThinking?.();\n\t\t}\n\t}\n}\n",
|
|
34
|
-
"import { exec } from \"node:child_process\";\nimport fs from \"node:fs/promises\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { promisify } from \"node:util\";\nimport { type CLIAdapter, runStreamingCommand } from \"./index.js\";\n\nconst execAsync = promisify(exec);\nconst MAX_BUFFER_BYTES = 10 * 1024 * 1024;\n\nexport class GitHubCopilotAdapter implements CLIAdapter {\n\tname = \"github-copilot\";\n\n\tasync isAvailable(): Promise<boolean> {\n\t\ttry {\n\t\t\tawait execAsync(\"which copilot\");\n\t\t\treturn true;\n\t\t} catch {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tasync checkHealth(): Promise<{\n\t\tavailable: boolean;\n\t\tstatus: \"healthy\" | \"missing\" | \"unhealthy\";\n\t\tmessage?: string;\n\t}> {\n\t\tconst available = await this.isAvailable();\n\t\tif (!available) {\n\t\t\treturn {\n\t\t\t\tavailable: false,\n\t\t\t\tstatus: \"missing\",\n\t\t\t\tmessage: \"Command not found\",\n\t\t\t};\n\t\t}\n\n\t\treturn { available: true, status: \"healthy\", message: \"Ready\" };\n\t}\n\n\tgetProjectCommandDir(): string | null {\n\t\t// GitHub Copilot CLI does not support custom commands (feature request #618)\n\t\treturn null;\n\t}\n\n\tgetUserCommandDir(): string | null {\n\t\t// GitHub Copilot CLI does not support custom commands (feature request #618)\n\t\treturn null;\n\t}\n\n\tgetProjectSkillDir(): string | null {\n\t\treturn null;\n\t}\n\n\tgetUserSkillDir(): string | null {\n\t\treturn null;\n\t}\n\n\tgetCommandExtension(): string {\n\t\treturn \".md\";\n\t}\n\n\tcanUseSymlink(): boolean {\n\t\t// Not applicable - no command directory support\n\t\treturn false;\n\t}\n\n\ttransformCommand(markdownContent: string): string {\n\t\t// Not applicable - no command directory support\n\t\treturn markdownContent;\n\t}\n\n\tasync execute(opts: {\n\t\tprompt: string;\n\t\tdiff: string;\n\t\tmodel?: string;\n\t\ttimeoutMs?: number;\n\t\tonOutput?: (chunk: string) => void;\n\t}): Promise<string> {\n\t\tconst fullContent = `${opts.prompt}\\n\\n--- DIFF ---\\n${opts.diff}`;\n\n\t\tconst tmpDir = os.tmpdir();\n\t\t// Include process.pid for uniqueness across concurrent processes\n\t\tconst tmpFile = path.join(\n\t\t\ttmpDir,\n\t\t\t`gauntlet-copilot-${process.pid}-${Date.now()}.txt`,\n\t\t);\n\t\tawait fs.writeFile(tmpFile, fullContent);\n\n\t\t// Copilot reads from stdin when no -p flag is provided\n\t\t// Tool whitelist: cat/grep/ls/find/head/tail are required for the AI to read\n\t\t// and analyze code files during review. While these tools can access files,\n\t\t// they are read-only and necessary for code review functionality.\n\t\t// The copilot CLI is scoped to the repo directory by default.\n\t\t// git is excluded to prevent access to commit history (review should only see diff).\n\t\tconst args = [\n\t\t\t\"--allow-tool\",\n\t\t\t\"shell(cat)\",\n\t\t\t\"--allow-tool\",\n\t\t\t\"shell(grep)\",\n\t\t\t\"--allow-tool\",\n\t\t\t\"shell(ls)\",\n\t\t\t\"--allow-tool\",\n\t\t\t\"shell(find)\",\n\t\t\t\"--allow-tool\",\n\t\t\t\"shell(head)\",\n\t\t\t\"--allow-tool\",\n\t\t\t\"shell(tail)\",\n\t\t];\n\n\t\tconst cleanup = () => fs.unlink(tmpFile).catch(() => {});\n\n\t\t// If onOutput callback is provided, use spawn for real-time streaming\n\t\tif (opts.onOutput) {\n\t\t\treturn runStreamingCommand({\n\t\t\t\tcommand: \"copilot\",\n\t\t\t\targs,\n\t\t\t\ttmpFile,\n\t\t\t\ttimeoutMs: opts.timeoutMs,\n\t\t\t\tonOutput: opts.onOutput,\n\t\t\t\tcleanup,\n\t\t\t});\n\t\t}\n\n\t\t// Otherwise use exec for buffered output\n\t\t// Shell command construction: We use exec() with shell piping instead of execFile()\n\t\t// because copilot requires stdin input. The tmpFile path is system-controlled\n\t\t// (os.tmpdir() + Date.now() + process.pid), not user-supplied, eliminating injection risk.\n\t\t// Double quotes handle paths with spaces. This pattern matches claude.ts:131.\n\t\ttry {\n\t\t\tconst cmd = `cat \"${tmpFile}\" | copilot --allow-tool \"shell(cat)\" --allow-tool \"shell(grep)\" --allow-tool \"shell(ls)\" --allow-tool \"shell(find)\" --allow-tool \"shell(head)\" --allow-tool \"shell(tail)\"`;\n\t\t\tconst { stdout } = await execAsync(cmd, {\n\t\t\t\ttimeout: opts.timeoutMs,\n\t\t\t\tmaxBuffer: MAX_BUFFER_BYTES,\n\t\t\t});\n\t\t\treturn stdout;\n\t\t} finally {\n\t\t\t// Cleanup errors are intentionally ignored - the tmp file will be cleaned up by OS\n\t\t\tawait cleanup();\n\t\t}\n\t}\n}\n",
|
|
31
|
+
"import { exec } from \"node:child_process\";\nimport fs from \"node:fs/promises\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { promisify } from \"node:util\";\nimport { getDebugLogger } from \"../utils/debug-log.js\";\nimport { type CLIAdapter, runStreamingCommand } from \"./index.js\";\nimport { CODEX_REASONING_EFFORT } from \"./thinking-budget.js\";\n\nconst execAsync = promisify(exec);\nconst MAX_BUFFER_BYTES = 10 * 1024 * 1024;\n\ninterface CodexUsage {\n\tinputTokens?: number;\n\tcachedInputTokens?: number;\n\toutputTokens?: number;\n\ttoolCalls?: number;\n\tapiRequests?: number;\n}\n\n/** Parse a single JSONL line into a typed event, or undefined on failure. */\nfunction parseJsonlLine(\n\tline: string,\n): { type: string; [key: string]: unknown } | undefined {\n\ttry {\n\t\tconst obj = JSON.parse(line);\n\t\tif (obj && typeof obj.type === \"string\") return obj;\n\t} catch {\n\t\t/* skip malformed lines */\n\t}\n\treturn undefined;\n}\n\n/** Maps Codex turn usage JSON fields to CodexUsage fields. */\nconst TURN_USAGE_MAP: Array<[string, keyof CodexUsage]> = [\n\t[\"input_tokens\", \"inputTokens\"],\n\t[\"cached_input_tokens\", \"cachedInputTokens\"],\n\t[\"output_tokens\", \"outputTokens\"],\n];\n\n/** Accumulate a turn.completed event's usage into totals. */\nfunction accumulateTurnUsage(\n\tevent: { type: string; [key: string]: unknown },\n\tusage: CodexUsage,\n): void {\n\tconst u = event.usage as Record<string, number | undefined> | undefined;\n\tif (!u) return;\n\tusage.apiRequests = (usage.apiRequests || 0) + 1;\n\tfor (const [jsonKey, usageKey] of TURN_USAGE_MAP) {\n\t\tif (u[jsonKey] !== undefined) {\n\t\t\tusage[usageKey] = (usage[usageKey] || 0) + (u[jsonKey] ?? 0);\n\t\t}\n\t}\n}\n\n/** Check if an item.completed event represents a tool call (command, file, mcp). */\nfunction isToolCallItem(event: {\n\ttype: string;\n\t[key: string]: unknown;\n}): boolean {\n\tconst item = event.item as { type?: string } | undefined;\n\tif (!item?.type) return false;\n\treturn (\n\t\titem.type === \"command_execution\" ||\n\t\titem.type === \"file_change\" ||\n\t\titem.type === \"mcp_tool_call\"\n\t);\n}\n\n/** Extract the final agent message text from a completed item. */\nfunction extractAgentMessage(event: {\n\ttype: string;\n\t[key: string]: unknown;\n}): string | undefined {\n\tconst item = event.item as { type?: string; text?: string } | undefined;\n\tif (item?.type === \"agent_message\" && typeof item.text === \"string\") {\n\t\treturn item.text;\n\t}\n\treturn undefined;\n}\n\nconst SUMMARY_FIELDS: Array<[keyof CodexUsage, string]> = [\n\t[\"inputTokens\", \"in\"],\n\t[\"cachedInputTokens\", \"cache\"],\n\t[\"outputTokens\", \"out\"],\n\t[\"toolCalls\", \"tool_calls\"],\n\t[\"apiRequests\", \"api_requests\"],\n];\n\nfunction formatCodexSummary(usage: CodexUsage): string | null {\n\tconst parts = SUMMARY_FIELDS.filter(([key]) => usage[key] !== undefined).map(\n\t\t([key, label]) => `${label}=${usage[key]}`,\n\t);\n\treturn parts.length > 0 ? `[codex-telemetry] ${parts.join(\" \")}` : null;\n}\n\n/** Process a single item.completed event, updating usage and returning any agent message. */\nfunction processItemCompleted(\n\tevent: { type: string; [key: string]: unknown },\n\tusage: CodexUsage,\n): string | undefined {\n\tif (isToolCallItem(event)) {\n\t\tusage.toolCalls = (usage.toolCalls || 0) + 1;\n\t}\n\treturn extractAgentMessage(event);\n}\n\n/** Route a parsed JSONL event to the appropriate handler, returning any agent message. */\nfunction processCodexEvent(\n\tevent: { type: string; [key: string]: unknown },\n\tusage: CodexUsage,\n): string | undefined {\n\tif (event.type === \"turn.completed\") {\n\t\taccumulateTurnUsage(event, usage);\n\t\treturn undefined;\n\t}\n\tif (event.type === \"item.completed\") {\n\t\treturn processItemCompleted(event, usage);\n\t}\n\treturn undefined;\n}\n\n/** Emit a telemetry summary to logs and debug log. */\nfunction emitCodexSummary(\n\tusage: CodexUsage,\n\tonLog?: (msg: string) => void,\n): void {\n\tconst summary = formatCodexSummary(usage);\n\tif (!summary) return;\n\tonLog?.(`\\n${summary}\\n`);\n\tprocess.stderr.write(`${summary}\\n`);\n\tgetDebugLogger()?.logTelemetry({ adapter: \"codex\", summary });\n}\n\n/**\n * Parse JSONL output from `codex exec --json`, extracting the final agent\n * message, token usage, and tool call counts.\n */\nfunction parseCodexJsonl(\n\traw: string,\n\tonLog?: (msg: string) => void,\n): { text: string; usage: CodexUsage } {\n\tconst usage: CodexUsage = {};\n\tlet lastAgentMessage = \"\";\n\n\tfor (const line of raw.split(\"\\n\")) {\n\t\tconst event = parseJsonlLine(line.trim());\n\t\tif (!event) continue;\n\t\tconst msg = processCodexEvent(event, usage);\n\t\tif (msg !== undefined) lastAgentMessage = msg;\n\t}\n\n\temitCodexSummary(usage, onLog);\n\treturn { text: lastAgentMessage, usage };\n}\n\nexport class CodexAdapter implements CLIAdapter {\n\tname = \"codex\";\n\n\tasync isAvailable(): Promise<boolean> {\n\t\ttry {\n\t\t\tawait execAsync(\"which codex\");\n\t\t\treturn true;\n\t\t} catch {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tasync checkHealth(): Promise<{\n\t\tavailable: boolean;\n\t\tstatus: \"healthy\" | \"missing\" | \"unhealthy\";\n\t\tmessage?: string;\n\t}> {\n\t\tconst available = await this.isAvailable();\n\t\tif (!available) {\n\t\t\treturn {\n\t\t\t\tavailable: false,\n\t\t\t\tstatus: \"missing\",\n\t\t\t\tmessage: \"Command not found\",\n\t\t\t};\n\t\t}\n\n\t\treturn { available: true, status: \"healthy\", message: \"Installed\" };\n\t}\n\n\tgetProjectCommandDir(): string | null {\n\t\t// Codex only supports user-level prompts at ~/.codex/prompts/\n\t\t// No project-scoped commands available\n\t\treturn null;\n\t}\n\n\tgetUserCommandDir(): string | null {\n\t\t// Codex uses user-level prompts at ~/.codex/prompts/\n\t\treturn path.join(os.homedir(), \".codex\", \"prompts\");\n\t}\n\n\tgetProjectSkillDir(): string | null {\n\t\treturn null;\n\t}\n\n\tgetUserSkillDir(): string | null {\n\t\treturn null;\n\t}\n\n\tgetCommandExtension(): string {\n\t\treturn \".md\";\n\t}\n\n\tcanUseSymlink(): boolean {\n\t\t// Codex uses the same Markdown format as our canonical file\n\t\treturn true;\n\t}\n\n\ttransformCommand(markdownContent: string): string {\n\t\t// Codex uses the same Markdown format as Claude, no transformation needed\n\t\treturn markdownContent;\n\t}\n\n\tsupportsHooks(): boolean {\n\t\treturn false;\n\t}\n\n\tprivate buildArgs(allowToolUse?: boolean, thinkingBudget?: string): string[] {\n\t\tconst args = [\n\t\t\t\"exec\",\n\t\t\t\"--cd\",\n\t\t\tprocess.cwd(),\n\t\t\t\"--sandbox\",\n\t\t\t\"read-only\",\n\t\t\t\"-c\",\n\t\t\t'ask_for_approval=\"never\"',\n\t\t];\n\t\tif (allowToolUse === false) {\n\t\t\targs.push(\"--disable\", \"shell_tool\");\n\t\t}\n\t\tif (thinkingBudget && thinkingBudget in CODEX_REASONING_EFFORT) {\n\t\t\tconst effort = CODEX_REASONING_EFFORT[thinkingBudget];\n\t\t\targs.push(\"-c\", `model_reasoning_effort=\"${effort}\"`);\n\t\t}\n\t\targs.push(\"--json\", \"-\");\n\t\treturn args;\n\t}\n\n\tasync execute(opts: {\n\t\tprompt: string;\n\t\tdiff: string;\n\t\tmodel?: string;\n\t\ttimeoutMs?: number;\n\t\tonOutput?: (chunk: string) => void;\n\t\tallowToolUse?: boolean;\n\t\tthinkingBudget?: string;\n\t}): Promise<string> {\n\t\tconst fullContent = `${opts.prompt}\\n\\n--- DIFF ---\\n${opts.diff}`;\n\n\t\tconst tmpDir = os.tmpdir();\n\t\tconst tmpFile = path.join(tmpDir, `gauntlet-codex-${Date.now()}.txt`);\n\t\tawait fs.writeFile(tmpFile, fullContent);\n\n\t\tconst args = this.buildArgs(opts.allowToolUse, opts.thinkingBudget);\n\n\t\tconst cleanup = () => fs.unlink(tmpFile).catch(() => {});\n\n\t\t// If onOutput callback is provided, use spawn for real-time streaming\n\t\tif (opts.onOutput) {\n\t\t\tconst raw = await runStreamingCommand({\n\t\t\t\tcommand: \"codex\",\n\t\t\t\targs,\n\t\t\t\ttmpFile,\n\t\t\t\ttimeoutMs: opts.timeoutMs,\n\t\t\t\tonOutput: (chunk: string) => {\n\t\t\t\t\topts.onOutput?.(chunk);\n\t\t\t\t},\n\t\t\t\tcleanup,\n\t\t\t});\n\n\t\t\tconst { text } = parseCodexJsonl(raw, opts.onOutput);\n\t\t\treturn text || raw.trimEnd();\n\t\t}\n\n\t\t// Otherwise use exec for buffered output\n\t\ttry {\n\t\t\tconst quoteArg = (a: string) => `\"${a.replace(/([\"\\\\$`])/g, \"\\\\$1\")}\"`;\n\t\t\tconst cmd = `cat \"${tmpFile}\" | codex ${args.map(quoteArg).join(\" \")}`;\n\t\t\tconst { stdout } = await execAsync(cmd, {\n\t\t\t\ttimeout: opts.timeoutMs,\n\t\t\t\tmaxBuffer: MAX_BUFFER_BYTES,\n\t\t\t});\n\t\t\tconst { text } = parseCodexJsonl(stdout);\n\t\t\treturn text || stdout.trimEnd();\n\t\t} finally {\n\t\t\tawait cleanup();\n\t\t}\n\t}\n}\n",
|
|
32
|
+
"import { exec } from \"node:child_process\";\nimport fs from \"node:fs/promises\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { promisify } from \"node:util\";\nimport { type CLIAdapter, runStreamingCommand } from \"./index.js\";\n\nconst execAsync = promisify(exec);\nconst MAX_BUFFER_BYTES = 10 * 1024 * 1024;\n\nexport class CursorAdapter implements CLIAdapter {\n\tname = \"cursor\";\n\n\tasync isAvailable(): Promise<boolean> {\n\t\ttry {\n\t\t\t// Note: Cursor's CLI binary is named \"agent\", not \"cursor\"\n\t\t\tawait execAsync(\"which agent\");\n\t\t\treturn true;\n\t\t} catch {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tasync checkHealth(): Promise<{\n\t\tavailable: boolean;\n\t\tstatus: \"healthy\" | \"missing\" | \"unhealthy\";\n\t\tmessage?: string;\n\t}> {\n\t\tconst available = await this.isAvailable();\n\t\tif (!available) {\n\t\t\treturn {\n\t\t\t\tavailable: false,\n\t\t\t\tstatus: \"missing\",\n\t\t\t\tmessage: \"Command not found\",\n\t\t\t};\n\t\t}\n\n\t\treturn { available: true, status: \"healthy\", message: \"Ready\" };\n\t}\n\n\tgetProjectCommandDir(): string | null {\n\t\t// Cursor does not support custom commands\n\t\treturn null;\n\t}\n\n\tgetUserCommandDir(): string | null {\n\t\t// Cursor does not support custom commands\n\t\treturn null;\n\t}\n\n\tgetProjectSkillDir(): string | null {\n\t\treturn null;\n\t}\n\n\tgetUserSkillDir(): string | null {\n\t\treturn null;\n\t}\n\n\tgetCommandExtension(): string {\n\t\treturn \".md\";\n\t}\n\n\tcanUseSymlink(): boolean {\n\t\t// Not applicable - no command directory support\n\t\treturn false;\n\t}\n\n\ttransformCommand(markdownContent: string): string {\n\t\t// Not applicable - no command directory support\n\t\treturn markdownContent;\n\t}\n\n\tsupportsHooks(): boolean {\n\t\treturn true;\n\t}\n\n\tasync execute(opts: {\n\t\tprompt: string;\n\t\tdiff: string;\n\t\tmodel?: string;\n\t\ttimeoutMs?: number;\n\t\tonOutput?: (chunk: string) => void;\n\t}): Promise<string> {\n\t\tconst fullContent = `${opts.prompt}\\n\\n--- DIFF ---\\n${opts.diff}`;\n\n\t\tconst tmpDir = os.tmpdir();\n\t\t// Include process.pid for uniqueness across concurrent processes\n\t\tconst tmpFile = path.join(\n\t\t\ttmpDir,\n\t\t\t`gauntlet-cursor-${process.pid}-${Date.now()}.txt`,\n\t\t);\n\t\tawait fs.writeFile(tmpFile, fullContent);\n\n\t\t// Cursor agent command reads from stdin\n\t\t// Note: As of the current version, the Cursor 'agent' CLI does not expose\n\t\t// flags for restricting tools or enforcing read-only mode (unlike claude's --allowedTools\n\t\t// or codex's --sandbox read-only). The agent is assumed to be repo-scoped and\n\t\t// safe for code review use. If Cursor adds such flags in the future, they should\n\t\t// be added here for defense-in-depth.\n\n\t\tconst cleanup = () => fs.unlink(tmpFile).catch(() => {});\n\n\t\t// If onOutput callback is provided, use spawn for real-time streaming\n\t\tif (opts.onOutput) {\n\t\t\treturn runStreamingCommand({\n\t\t\t\tcommand: \"agent\",\n\t\t\t\targs: [],\n\t\t\t\ttmpFile,\n\t\t\t\ttimeoutMs: opts.timeoutMs,\n\t\t\t\tonOutput: opts.onOutput,\n\t\t\t\tcleanup,\n\t\t\t});\n\t\t}\n\n\t\t// Otherwise use exec for buffered output\n\t\t// Shell command construction: We use exec() with shell piping\n\t\t// because the agent requires stdin input. The tmpFile path is system-controlled\n\t\t// (os.tmpdir() + Date.now() + process.pid), not user-supplied, eliminating injection risk.\n\t\t// Double quotes handle paths with spaces.\n\t\ttry {\n\t\t\tconst cmd = `cat \"${tmpFile}\" | agent`;\n\t\t\tconst { stdout } = await execAsync(cmd, {\n\t\t\t\ttimeout: opts.timeoutMs,\n\t\t\t\tmaxBuffer: MAX_BUFFER_BYTES,\n\t\t\t});\n\t\t\treturn stdout;\n\t\t} finally {\n\t\t\t// Cleanup errors are intentionally ignored - the tmp file will be cleaned up by OS\n\t\t\tawait cleanup();\n\t\t}\n\t}\n}\n",
|
|
33
|
+
"import { exec } from \"node:child_process\";\nimport fs from \"node:fs/promises\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { promisify } from \"node:util\";\nimport { getDebugLogger } from \"../utils/debug-log.js\";\nimport { type CLIAdapter, runStreamingCommand } from \"./index.js\";\nimport { GEMINI_THINKING_BUDGET } from \"./thinking-budget.js\";\n\nconst execAsync = promisify(exec);\nconst MAX_BUFFER_BYTES = 10 * 1024 * 1024;\n\ninterface GeminiTelemetryUsage {\n\tinputTokens?: number;\n\toutputTokens?: number;\n\tthoughtTokens?: number;\n\tcacheTokens?: number;\n\ttoolTokens?: number;\n\ttoolCalls?: number;\n\ttoolContentChars?: number;\n\tapiRequests?: number;\n}\n\ntype TokenType = \"input\" | \"output\" | \"thought\" | \"cache\" | \"tool\";\nconst TOKEN_TYPE_MAP: Record<TokenType, keyof GeminiTelemetryUsage> = {\n\tinput: \"inputTokens\",\n\toutput: \"outputTokens\",\n\tthought: \"thoughtTokens\",\n\tcache: \"cacheTokens\",\n\ttool: \"toolTokens\",\n};\n\n// Gemini CLI telemetry file contains pretty-printed JSON objects (not OTLP).\n// The metric object has { resource, scopeMetrics: [{ scope, metrics }] }.\n// Each metric has { descriptor: { name, type }, dataPoints: [{ value, attributes }] }.\n\ninterface SdkDataPoint {\n\tvalue: number | { sum?: number };\n\tattributes?: Record<string, string | number | boolean>;\n}\n\ninterface SdkMetric {\n\tdescriptor?: { name?: string };\n\tdataPoints?: SdkDataPoint[];\n}\n\ninterface SdkScopeMetrics {\n\tmetrics?: SdkMetric[];\n}\n\nfunction extractTokenType(dp: SdkDataPoint): TokenType | null {\n\tconst type =\n\t\tdp.attributes?.type ?? dp.attributes?.[\"gen_ai.token.type\"] ?? null;\n\treturn typeof type === \"string\" && type in TOKEN_TYPE_MAP\n\t\t? (type as TokenType)\n\t\t: null;\n}\n\nfunction extractValue(dp: SdkDataPoint): number {\n\tif (typeof dp.value === \"number\") return dp.value;\n\treturn dp.value?.sum ?? 0;\n}\n\nfunction processDataPoints(\n\tdataPoints: SdkDataPoint[],\n\tusage: GeminiTelemetryUsage,\n): void {\n\tfor (const dp of dataPoints) {\n\t\tconst tokenType = extractTokenType(dp);\n\t\tif (!tokenType) continue;\n\t\tconst key = TOKEN_TYPE_MAP[tokenType];\n\t\tusage[key] = (usage[key] || 0) + extractValue(dp);\n\t}\n}\n\nconst TOKEN_METRIC_NAMES = new Set([\n\t\"gemini_cli.token.usage\",\n\t\"gen_ai.client.token.usage\",\n]);\n\n/**\n * Find [start, end) index pairs for each top-level `{…}` in a string\n * whose JSON string literals have already been blanked out.\n */\nfunction handleOpen(i: number, depth: number, start: number): [number, number] {\n\treturn [depth + 1, depth === 0 ? i : start];\n}\n\nfunction handleClose(\n\ti: number,\n\tdepth: number,\n\tstart: number,\n\tranges: Array<[number, number]>,\n): [number, number] {\n\tconst next = depth - 1;\n\tif (next === 0 && start >= 0) {\n\t\tranges.push([start, i + 1]);\n\t\treturn [next, -1];\n\t}\n\treturn [next, start];\n}\n\nfunction findObjectBoundaries(stripped: string): Array<[number, number]> {\n\tconst ranges: Array<[number, number]> = [];\n\tlet depth = 0;\n\tlet start = -1;\n\tfor (let i = 0; i < stripped.length; i++) {\n\t\tconst ch = stripped[i];\n\t\tif (ch === \"{\") [depth, start] = handleOpen(i, depth, start);\n\t\telse if (ch === \"}\") [depth, start] = handleClose(i, depth, start, ranges);\n\t}\n\treturn ranges;\n}\n\n/**\n * Parse top-level JSON objects from telemetry content.\n * Blanks string literals (preserving length) before brace-counting\n * so braces inside strings are ignored.\n */\nfunction parseJsonObjects(content: string): unknown[] {\n\tconst stripped = content.replace(/\"(?:[^\"\\\\]|\\\\.)*\"/g, (m) =>\n\t\t\" \".repeat(m.length),\n\t);\n\tconst objects: unknown[] = [];\n\tfor (const [s, e] of findObjectBoundaries(stripped)) {\n\t\ttry {\n\t\t\tobjects.push(JSON.parse(content.slice(s, e)));\n\t\t} catch {\n\t\t\t// Skip malformed objects\n\t\t}\n\t}\n\treturn objects;\n}\n\n/** Sum all data point values for a counter metric. */\nfunction sumDataPoints(dataPoints: SdkDataPoint[]): number {\n\tlet total = 0;\n\tfor (const dp of dataPoints) {\n\t\ttotal += extractValue(dp);\n\t}\n\treturn total;\n}\n\n/** Route a single metric to the appropriate usage field. */\nfunction processMetric(metric: SdkMetric, usage: GeminiTelemetryUsage): void {\n\tconst name = metric.descriptor?.name;\n\tif (!name) return;\n\tconst dataPoints = metric.dataPoints ?? [];\n\n\tif (TOKEN_METRIC_NAMES.has(name)) {\n\t\tprocessDataPoints(dataPoints, usage);\n\t\treturn;\n\t}\n\tif (name === \"gemini_cli.tool.call.count\") {\n\t\tusage.toolCalls = (usage.toolCalls || 0) + sumDataPoints(dataPoints);\n\t\treturn;\n\t}\n\tif (name === \"gemini_cli.api.request.count\") {\n\t\tusage.apiRequests = (usage.apiRequests || 0) + sumDataPoints(dataPoints);\n\t}\n}\n\nfunction processMetricObject(data: unknown, usage: GeminiTelemetryUsage): void {\n\tconst obj = data as { scopeMetrics?: SdkScopeMetrics[] };\n\tif (!obj?.scopeMetrics) return;\n\tfor (const sm of obj.scopeMetrics) {\n\t\tfor (const metric of sm.metrics ?? []) {\n\t\t\tprocessMetric(metric, usage);\n\t\t}\n\t}\n}\n\n/**\n * Extract tool call details from OTel log records.\n * The Gemini CLI emits `gemini_cli.tool_call` log events with\n * content_length attributes that reveal how much data tools read.\n */\ninterface SdkLogRecord {\n\tbody?: { stringValue?: string };\n\tattributes?: Array<{\n\t\tkey: string;\n\t\tvalue: { intValue?: string; stringValue?: string };\n\t}>;\n}\n\ninterface SdkScopeLogs {\n\tlogRecords?: SdkLogRecord[];\n}\n\n/** Extract content_length from a tool_call log record, or 0 if absent. */\nfunction extractToolContentLength(record: SdkLogRecord): number {\n\tconst attr = record.attributes?.find((a) => a.key === \"content_length\");\n\tif (!attr?.value?.intValue) return 0;\n\tconst len = parseInt(attr.value.intValue, 10);\n\treturn Number.isNaN(len) ? 0 : len;\n}\n\n/** Sum content_length across all tool_call log records in a scope. */\nfunction sumToolContentChars(records: SdkLogRecord[]): number {\n\tlet total = 0;\n\tfor (const record of records) {\n\t\tif (record.body?.stringValue !== \"gemini_cli.tool_call\") continue;\n\t\ttotal += extractToolContentLength(record);\n\t}\n\treturn total;\n}\n\nfunction processLogObject(data: unknown, usage: GeminiTelemetryUsage): void {\n\tconst obj = data as { scopeLogs?: SdkScopeLogs[] };\n\tif (!obj?.scopeLogs) return;\n\tfor (const sl of obj.scopeLogs) {\n\t\tconst chars = sumToolContentChars(sl.logRecords ?? []);\n\t\tif (chars > 0) {\n\t\t\tusage.toolContentChars = (usage.toolContentChars || 0) + chars;\n\t\t}\n\t}\n}\n\nasync function parseGeminiTelemetry(\n\tfilePath: string,\n): Promise<GeminiTelemetryUsage> {\n\tconst usage: GeminiTelemetryUsage = {};\n\tlet content: string;\n\n\ttry {\n\t\tcontent = await fs.readFile(filePath, \"utf-8\");\n\t} catch {\n\t\treturn usage;\n\t}\n\n\tfor (const obj of parseJsonObjects(content)) {\n\t\tprocessMetricObject(obj, usage);\n\t\tprocessLogObject(obj, usage);\n\t}\n\n\treturn usage;\n}\n\nconst SUMMARY_FIELDS: Array<[keyof GeminiTelemetryUsage, string]> = [\n\t[\"inputTokens\", \"in\"],\n\t[\"outputTokens\", \"out\"],\n\t[\"thoughtTokens\", \"thought\"],\n\t[\"cacheTokens\", \"cache\"],\n\t[\"toolTokens\", \"tool\"],\n\t[\"toolCalls\", \"tool_calls\"],\n\t[\"toolContentChars\", \"tool_content_chars\"],\n\t[\"apiRequests\", \"api_requests\"],\n];\n\nfunction formatGeminiSummary(usage: GeminiTelemetryUsage): string | null {\n\tconst parts = SUMMARY_FIELDS.filter(([key]) => usage[key] !== undefined).map(\n\t\t([key, label]) => `${label}=${usage[key]}`,\n\t);\n\treturn parts.length > 0 ? `[telemetry] ${parts.join(\" \")}` : null;\n}\n\nasync function logTelemetryToStderr(telemetryFile: string): Promise<void> {\n\tif (process.env.GEMINI_TELEMETRY_OUTFILE) return;\n\tconst usage = await parseGeminiTelemetry(telemetryFile);\n\tconst summary = formatGeminiSummary(usage);\n\tif (summary) {\n\t\tprocess.stderr.write(`${summary}\\n`);\n\t\tgetDebugLogger()?.logTelemetry({ adapter: \"gemini\", summary });\n\t}\n}\n\nexport class GeminiAdapter implements CLIAdapter {\n\tname = \"gemini\";\n\n\tasync isAvailable(): Promise<boolean> {\n\t\ttry {\n\t\t\tawait execAsync(\"which gemini\");\n\t\t\treturn true;\n\t\t} catch {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tasync checkHealth(): Promise<{\n\t\tavailable: boolean;\n\t\tstatus: \"healthy\" | \"missing\" | \"unhealthy\";\n\t\tmessage?: string;\n\t}> {\n\t\tconst available = await this.isAvailable();\n\t\tif (!available) {\n\t\t\treturn {\n\t\t\t\tavailable: false,\n\t\t\t\tstatus: \"missing\",\n\t\t\t\tmessage: \"Command not found\",\n\t\t\t};\n\t\t}\n\n\t\treturn { available: true, status: \"healthy\", message: \"Installed\" };\n\t}\n\n\tgetProjectCommandDir(): string | null {\n\t\treturn \".gemini/commands\";\n\t}\n\n\tgetUserCommandDir(): string | null {\n\t\treturn path.join(os.homedir(), \".gemini\", \"commands\");\n\t}\n\n\tgetProjectSkillDir(): string | null {\n\t\treturn null;\n\t}\n\n\tgetUserSkillDir(): string | null {\n\t\treturn null;\n\t}\n\n\tgetCommandExtension(): string {\n\t\treturn \".toml\";\n\t}\n\n\tcanUseSymlink(): boolean {\n\t\treturn false;\n\t}\n\n\tsupportsHooks(): boolean {\n\t\treturn false;\n\t}\n\n\ttransformCommand(markdownContent: string): string {\n\t\tconst fmMatch = markdownContent.match(/^---\\n([\\s\\S]*?)\\n---\\n([\\s\\S]*)$/);\n\t\tlet description = \"Run the gauntlet verification suite\";\n\t\tconst body = fmMatch ? (fmMatch[2] ?? \"\") : markdownContent;\n\n\t\tif (fmMatch) {\n\t\t\tfor (const line of (fmMatch[1] ?? \"\").split(\"\\n\")) {\n\t\t\t\tconst kv = line.match(/^description:\\s*(.*)$/);\n\t\t\t\tif (kv?.[1]) description = kv[1].trim();\n\t\t\t}\n\t\t}\n\n\t\treturn `description = ${JSON.stringify(description)}\nprompt = \"\"\"\n${body.trim()}\n\"\"\"\n`;\n\t}\n\n\tprivate async logTelemetry(\n\t\ttelemetryFile: string,\n\t\tonOutput: (chunk: string) => void,\n\t): Promise<void> {\n\t\tif (process.env.GEMINI_TELEMETRY_OUTFILE) return;\n\t\tconst usage = await parseGeminiTelemetry(telemetryFile);\n\t\tconst summary = formatGeminiSummary(usage);\n\t\tif (summary) {\n\t\t\tonOutput(`\\n${summary}\\n`);\n\t\t\tprocess.stderr.write(`${summary}\\n`);\n\t\t\tgetDebugLogger()?.logTelemetry({ adapter: \"gemini\", summary });\n\t\t}\n\t}\n\n\t/**\n\t * Serialize access to .gemini/settings.json across concurrent Gemini instances.\n\t * When multiple Gemini adapters run in parallel (num_reviews > 1 with\n\t * cli_preference: [\"gemini\"]), each waits for the previous to finish\n\t * before writing its settings.\n\t */\n\tprivate static settingsLock: Promise<void> = Promise.resolve();\n\n\tprivate async applyThinkingSettings(\n\t\tbudget: number,\n\t): Promise<() => Promise<void>> {\n\t\tlet releaseLock = () => {};\n\t\tconst prev = GeminiAdapter.settingsLock;\n\t\tGeminiAdapter.settingsLock = new Promise((resolve) => {\n\t\t\treleaseLock = resolve;\n\t\t});\n\t\tawait prev;\n\n\t\tconst settingsPath = path.join(process.cwd(), \".gemini\", \"settings.json\");\n\t\tlet backup: string | null = null;\n\t\tlet existed = false;\n\n\t\ttry {\n\t\t\ttry {\n\t\t\t\tbackup = await fs.readFile(settingsPath, \"utf-8\");\n\t\t\t\texisted = true;\n\t\t\t} catch {\n\t\t\t\t// No existing file\n\t\t\t}\n\n\t\t\tconst existing = backup ? JSON.parse(backup) : {};\n\t\t\tconst merged = {\n\t\t\t\t...existing,\n\t\t\t\tthinkingConfig: { ...existing.thinkingConfig, thinkingBudget: budget },\n\t\t\t};\n\n\t\t\tawait fs.mkdir(path.dirname(settingsPath), { recursive: true });\n\t\t\tawait fs.writeFile(settingsPath, JSON.stringify(merged, null, 2));\n\t\t} catch (err) {\n\t\t\treleaseLock();\n\t\t\tthrow err;\n\t\t}\n\n\t\treturn async () => {\n\t\t\ttry {\n\t\t\t\tif (existed && backup !== null) {\n\t\t\t\t\tawait fs.writeFile(settingsPath, backup);\n\t\t\t\t} else {\n\t\t\t\t\tawait fs.unlink(settingsPath).catch(() => {});\n\t\t\t\t}\n\t\t\t} finally {\n\t\t\t\treleaseLock();\n\t\t\t}\n\t\t};\n\t}\n\n\tprivate buildTelemetryEnv(telemetryFile: string): Record<string, string> {\n\t\tconst env: Record<string, string> = {};\n\t\tif (!process.env.GEMINI_TELEMETRY_ENABLED) {\n\t\t\tenv.GEMINI_TELEMETRY_ENABLED = \"true\";\n\t\t}\n\t\tif (!process.env.GEMINI_TELEMETRY_TARGET) {\n\t\t\tenv.GEMINI_TELEMETRY_TARGET = \"local\";\n\t\t}\n\t\tif (!process.env.GEMINI_TELEMETRY_OUTFILE) {\n\t\t\tenv.GEMINI_TELEMETRY_OUTFILE = telemetryFile;\n\t\t}\n\t\treturn env;\n\t}\n\n\tprivate buildArgs(allowToolUse?: boolean): string[] {\n\t\tconst args = [\"--sandbox\"];\n\t\tif (allowToolUse !== false) {\n\t\t\targs.push(\n\t\t\t\t\"--allowed-tools\",\n\t\t\t\t\"read_file,list_directory,glob,search_file_content\",\n\t\t\t);\n\t\t}\n\t\targs.push(\"--output-format\", \"text\");\n\t\treturn args;\n\t}\n\n\tprivate async maybeApplyThinking(\n\t\tlevel?: string,\n\t): Promise<(() => Promise<void>) | undefined> {\n\t\tif (!level || !(level in GEMINI_THINKING_BUDGET)) return undefined;\n\t\treturn this.applyThinkingSettings(GEMINI_THINKING_BUDGET[level] as number);\n\t}\n\n\tasync execute(opts: {\n\t\tprompt: string;\n\t\tdiff: string;\n\t\tmodel?: string;\n\t\ttimeoutMs?: number;\n\t\tonOutput?: (chunk: string) => void;\n\t\tallowToolUse?: boolean;\n\t\tthinkingBudget?: string;\n\t}): Promise<string> {\n\t\tconst fullContent = `${opts.prompt}\\n\\n--- DIFF ---\\n${opts.diff}`;\n\n\t\tconst tmpDir = os.tmpdir();\n\t\tconst tmpFile = path.join(\n\t\t\ttmpDir,\n\t\t\t`gauntlet-gemini-${process.pid}-${Date.now()}.txt`,\n\t\t);\n\t\tawait fs.writeFile(tmpFile, fullContent);\n\n\t\t// Use cwd for telemetry file — Gemini's --sandbox restricts writes\n\t\t// to the project directory, so os.tmpdir() would fail with EPERM.\n\t\tconst telemetryFile = path.join(\n\t\t\tprocess.cwd(),\n\t\t\t`.gauntlet-gemini-telemetry-${process.pid}-${Date.now()}.log`,\n\t\t);\n\n\t\tconst telemetryEnv = this.buildTelemetryEnv(telemetryFile);\n\t\tconst args = this.buildArgs(opts.allowToolUse);\n\t\tconst cleanupThinking = await this.maybeApplyThinking(opts.thinkingBudget);\n\n\t\tconst cleanup = () => fs.unlink(tmpFile).catch(() => {});\n\t\tconst cleanupTelemetry = () => fs.unlink(telemetryFile).catch(() => {});\n\n\t\ttry {\n\t\t\tif (opts.onOutput) {\n\t\t\t\ttry {\n\t\t\t\t\tconst result = await runStreamingCommand({\n\t\t\t\t\t\tcommand: \"gemini\",\n\t\t\t\t\t\targs,\n\t\t\t\t\t\ttmpFile,\n\t\t\t\t\t\ttimeoutMs: opts.timeoutMs,\n\t\t\t\t\t\tonOutput: opts.onOutput,\n\t\t\t\t\t\tcleanup,\n\t\t\t\t\t\tenv: { ...process.env, ...telemetryEnv },\n\t\t\t\t\t});\n\t\t\t\t\tawait this.logTelemetry(telemetryFile, opts.onOutput);\n\t\t\t\t\treturn result;\n\t\t\t\t} finally {\n\t\t\t\t\tawait cleanupTelemetry();\n\t\t\t\t}\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tconst cmd = `gemini ${args.join(\" \")} < \"${tmpFile}\"`;\n\t\t\t\tconst { stdout } = await execAsync(cmd, {\n\t\t\t\t\ttimeout: opts.timeoutMs,\n\t\t\t\t\tmaxBuffer: MAX_BUFFER_BYTES,\n\t\t\t\t\tenv: { ...process.env, ...telemetryEnv },\n\t\t\t\t});\n\t\t\t\tawait logTelemetryToStderr(telemetryFile);\n\t\t\t\treturn stdout;\n\t\t\t} finally {\n\t\t\t\tawait cleanup();\n\t\t\t\tawait cleanupTelemetry();\n\t\t\t}\n\t\t} finally {\n\t\t\tawait cleanupThinking?.();\n\t\t}\n\t}\n}\n",
|
|
34
|
+
"import { exec } from \"node:child_process\";\nimport fs from \"node:fs/promises\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { promisify } from \"node:util\";\nimport { type CLIAdapter, runStreamingCommand } from \"./index.js\";\n\nconst execAsync = promisify(exec);\nconst MAX_BUFFER_BYTES = 10 * 1024 * 1024;\n\nexport class GitHubCopilotAdapter implements CLIAdapter {\n\tname = \"github-copilot\";\n\n\tasync isAvailable(): Promise<boolean> {\n\t\ttry {\n\t\t\tawait execAsync(\"which copilot\");\n\t\t\treturn true;\n\t\t} catch {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tasync checkHealth(): Promise<{\n\t\tavailable: boolean;\n\t\tstatus: \"healthy\" | \"missing\" | \"unhealthy\";\n\t\tmessage?: string;\n\t}> {\n\t\tconst available = await this.isAvailable();\n\t\tif (!available) {\n\t\t\treturn {\n\t\t\t\tavailable: false,\n\t\t\t\tstatus: \"missing\",\n\t\t\t\tmessage: \"Command not found\",\n\t\t\t};\n\t\t}\n\n\t\treturn { available: true, status: \"healthy\", message: \"Ready\" };\n\t}\n\n\tgetProjectCommandDir(): string | null {\n\t\t// GitHub Copilot CLI does not support custom commands (feature request #618)\n\t\treturn null;\n\t}\n\n\tgetUserCommandDir(): string | null {\n\t\t// GitHub Copilot CLI does not support custom commands (feature request #618)\n\t\treturn null;\n\t}\n\n\tgetProjectSkillDir(): string | null {\n\t\treturn null;\n\t}\n\n\tgetUserSkillDir(): string | null {\n\t\treturn null;\n\t}\n\n\tgetCommandExtension(): string {\n\t\treturn \".md\";\n\t}\n\n\tcanUseSymlink(): boolean {\n\t\t// Not applicable - no command directory support\n\t\treturn false;\n\t}\n\n\ttransformCommand(markdownContent: string): string {\n\t\t// Not applicable - no command directory support\n\t\treturn markdownContent;\n\t}\n\n\tsupportsHooks(): boolean {\n\t\treturn false;\n\t}\n\n\tasync execute(opts: {\n\t\tprompt: string;\n\t\tdiff: string;\n\t\tmodel?: string;\n\t\ttimeoutMs?: number;\n\t\tonOutput?: (chunk: string) => void;\n\t}): Promise<string> {\n\t\tconst fullContent = `${opts.prompt}\\n\\n--- DIFF ---\\n${opts.diff}`;\n\n\t\tconst tmpDir = os.tmpdir();\n\t\t// Include process.pid for uniqueness across concurrent processes\n\t\tconst tmpFile = path.join(\n\t\t\ttmpDir,\n\t\t\t`gauntlet-copilot-${process.pid}-${Date.now()}.txt`,\n\t\t);\n\t\tawait fs.writeFile(tmpFile, fullContent);\n\n\t\t// Copilot reads from stdin when no -p flag is provided\n\t\t// Tool whitelist: cat/grep/ls/find/head/tail are required for the AI to read\n\t\t// and analyze code files during review. While these tools can access files,\n\t\t// they are read-only and necessary for code review functionality.\n\t\t// The copilot CLI is scoped to the repo directory by default.\n\t\t// git is excluded to prevent access to commit history (review should only see diff).\n\t\tconst args = [\n\t\t\t\"--allow-tool\",\n\t\t\t\"shell(cat)\",\n\t\t\t\"--allow-tool\",\n\t\t\t\"shell(grep)\",\n\t\t\t\"--allow-tool\",\n\t\t\t\"shell(ls)\",\n\t\t\t\"--allow-tool\",\n\t\t\t\"shell(find)\",\n\t\t\t\"--allow-tool\",\n\t\t\t\"shell(head)\",\n\t\t\t\"--allow-tool\",\n\t\t\t\"shell(tail)\",\n\t\t];\n\n\t\tconst cleanup = () => fs.unlink(tmpFile).catch(() => {});\n\n\t\t// If onOutput callback is provided, use spawn for real-time streaming\n\t\tif (opts.onOutput) {\n\t\t\treturn runStreamingCommand({\n\t\t\t\tcommand: \"copilot\",\n\t\t\t\targs,\n\t\t\t\ttmpFile,\n\t\t\t\ttimeoutMs: opts.timeoutMs,\n\t\t\t\tonOutput: opts.onOutput,\n\t\t\t\tcleanup,\n\t\t\t});\n\t\t}\n\n\t\t// Otherwise use exec for buffered output\n\t\t// Shell command construction: We use exec() with shell piping instead of execFile()\n\t\t// because copilot requires stdin input. The tmpFile path is system-controlled\n\t\t// (os.tmpdir() + Date.now() + process.pid), not user-supplied, eliminating injection risk.\n\t\t// Double quotes handle paths with spaces. This pattern matches claude.ts:131.\n\t\ttry {\n\t\t\tconst cmd = `cat \"${tmpFile}\" | copilot --allow-tool \"shell(cat)\" --allow-tool \"shell(grep)\" --allow-tool \"shell(ls)\" --allow-tool \"shell(find)\" --allow-tool \"shell(head)\" --allow-tool \"shell(tail)\"`;\n\t\t\tconst { stdout } = await execAsync(cmd, {\n\t\t\t\ttimeout: opts.timeoutMs,\n\t\t\t\tmaxBuffer: MAX_BUFFER_BYTES,\n\t\t\t});\n\t\t\treturn stdout;\n\t\t} finally {\n\t\t\t// Cleanup errors are intentionally ignored - the tmp file will be cleaned up by OS\n\t\t\tawait cleanup();\n\t\t}\n\t}\n}\n",
|
|
35
35
|
"export type DiffFileRange = Set<number>;\n\n/**\n * Parses a unified diff string into a map of filenames to sets of valid line numbers.\n * Valid line numbers are those that appear in the diff as added or modified lines.\n */\nexport function parseDiff(diff: string): Map<string, DiffFileRange> {\n\treturn new DiffParser().parse(diff);\n}\n\nclass DiffParser {\n\tprivate fileRanges = new Map<string, DiffFileRange>();\n\tprivate currentFile: string | null = null;\n\tprivate currentRanges: DiffFileRange | null = null;\n\tprivate currentLineNumber = 0;\n\n\tparse(diff: string): Map<string, DiffFileRange> {\n\t\tconst lines = diff.split(\"\\n\");\n\t\tfor (const line of lines) {\n\t\t\tthis.processLine(line);\n\t\t}\n\t\treturn this.fileRanges;\n\t}\n\n\tprivate processLine(line: string): void {\n\t\tif (this.tryParseFileHeader(line)) return;\n\t\tif (!this.currentFile || !this.currentRanges) return;\n\t\tif (this.tryParseHunkHeader(line)) return;\n\t\tthis.processContentLine(line);\n\t}\n\n\tprivate tryParseFileHeader(line: string): boolean {\n\t\tif (!line.startsWith(\"diff --git\")) return false;\n\n\t\tconst result = parseFileHeader(line);\n\t\tif (result) {\n\t\t\tthis.currentFile = result;\n\t\t\tthis.currentRanges = new Set<number>();\n\t\t\tthis.fileRanges.set(this.currentFile, this.currentRanges);\n\t\t} else {\n\t\t\tthis.currentFile = null;\n\t\t\tthis.currentRanges = null;\n\t\t}\n\t\treturn true;\n\t}\n\n\tprivate tryParseHunkHeader(line: string): boolean {\n\t\tif (!line.startsWith(\"@@\")) return false;\n\n\t\tconst newLine = parseHunkHeader(line);\n\t\tif (newLine !== null) {\n\t\t\tthis.currentLineNumber = newLine;\n\t\t}\n\t\treturn true;\n\t}\n\n\tprivate processContentLine(line: string): void {\n\t\tif (!this.currentRanges) return;\n\n\t\tif (line.startsWith(\"+\")) {\n\t\t\tif (line.startsWith(\"+++ \") || line.startsWith(\"+++\\t\")) return;\n\t\t\tthis.currentRanges.add(this.currentLineNumber);\n\t\t\tthis.currentLineNumber++;\n\t\t} else if (line.startsWith(\" \")) {\n\t\t\tthis.currentLineNumber++;\n\t\t}\n\t}\n}\n\nfunction parseFileHeader(line: string): string | null {\n\tconst match = line.match(/^diff --git a\\/.+ b\\/(.+)$/);\n\tif (!match?.[1]) return null;\n\tconst file = match[1];\n\treturn file.startsWith(\".git/\") ? null : file;\n}\n\nfunction parseHunkHeader(line: string): number | null {\n\tconst match = line.match(/@@ -\\d+(?:,\\d+)? \\+(\\d+)(?:,\\d+)? @@/);\n\treturn match?.[1] ? parseInt(match[1], 10) : null;\n}\n\n/**\n * Checks if a violation is valid based on the parsed diff ranges.\n */\nexport function isValidViolationLocation(\n\tfile: string,\n\tline: number | undefined,\n\tdiffRanges: Map<string, DiffFileRange> | undefined,\n): boolean {\n\t// If no diff ranges provided (e.g. full file review), assume valid\n\tif (!diffRanges) return true;\n\n\t// Line is required for diff-scoped reviews\n\tif (line === undefined) return false;\n\n\tconst validLines = diffRanges.get(file);\n\tif (!validLines) {\n\t\t// File not in diff\n\t\treturn false;\n\t}\n\n\treturn validLines.has(line);\n}\n",
|
|
36
36
|
"export function sanitizeJobId(jobId: string): string {\n\treturn jobId.replace(/[^a-zA-Z0-9._-]/g, \"_\");\n}\n",
|
|
37
37
|
"import type {\n\tLoadedCheckGateConfig,\n\tLoadedConfig,\n\tLoadedReviewGateConfig,\n} from \"../config/types.js\";\nimport { CheckGateExecutor } from \"../gates/check.js\";\nimport type { GateResult } from \"../gates/result.js\";\nimport { ReviewGateExecutor } from \"../gates/review.js\";\nimport type { ConsoleReporter } from \"../output/console.js\";\nimport type { Logger } from \"../output/logger.js\";\nimport type { DebugLogger } from \"../utils/debug-log.js\";\nimport type { PreviousViolation } from \"../utils/log-parser.js\";\nimport { sanitizeJobId } from \"../utils/sanitizer.js\";\nimport type { Job } from \"./job.js\";\n\n/**\n * Iteration statistics for RUN_END logging.\n */\nexport interface IterationStats {\n\t/** Number of violations marked as fixed */\n\tfixed: number;\n\t/** Number of violations marked as skipped */\n\tskipped: number;\n\t/** Number of remaining active violations (failures) */\n\tfailed: number;\n}\n\n/**\n * Structured result from Runner.run() for proper status mapping.\n */\nexport interface RunnerOutcome {\n\t/** Whether all gates passed */\n\tallPassed: boolean;\n\t/** Whether any violations were skipped (for passed_with_warnings) */\n\tanySkipped: boolean;\n\t/** Whether retry limit was exceeded */\n\tretryLimitExceeded: boolean;\n\t/** Whether any gates had errors */\n\tanyErrors: boolean;\n\t/** Iteration statistics for debug logging */\n\tstats: IterationStats;\n\t/** Individual gate results */\n\tgateResults: GateResult[];\n}\n\n/**\n * Calculate iteration statistics from gate results.\n * Aggregates fixed, skipped, and failed counts from all results and subResults.\n * For CHECK gates that don't set errorCount, count failed/error status as 1 failure.\n */\nfunction calculateStats(results: GateResult[]): IterationStats {\n\tlet fixed = 0;\n\tlet skipped = 0;\n\tlet failed = 0;\n\n\tfor (const result of results) {\n\t\t// Count from top-level result\n\t\tif (result.fixedCount) fixed += result.fixedCount;\n\t\tif (result.skipped) skipped += result.skipped.length;\n\n\t\t// For failed gates, use errorCount if set, otherwise count as 1 failure\n\t\t// This handles CHECK gates which only set status but not errorCount\n\t\tif (result.errorCount) {\n\t\t\tfailed += result.errorCount;\n\t\t} else if (result.status === \"fail\" || result.status === \"error\") {\n\t\t\tfailed += 1;\n\t\t}\n\n\t\t// Count from subResults (review gates)\n\t\tif (result.subResults) {\n\t\t\tfor (const sub of result.subResults) {\n\t\t\t\tif (sub.fixedCount) fixed += sub.fixedCount;\n\t\t\t\tif (sub.skipped) skipped += sub.skipped.length;\n\n\t\t\t\tif (sub.errorCount) {\n\t\t\t\t\tfailed += sub.errorCount;\n\t\t\t\t} else if (sub.status === \"fail\" || sub.status === \"error\") {\n\t\t\t\t\tfailed += 1;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn { fixed, skipped, failed };\n}\n\nexport class Runner {\n\tprivate checkExecutor = new CheckGateExecutor();\n\tprivate reviewExecutor = new ReviewGateExecutor();\n\tprivate results: GateResult[] = [];\n\tprivate shouldStop = false;\n\n\tconstructor(\n\t\tprivate config: LoadedConfig,\n\t\tprivate logger: Logger,\n\t\tprivate reporter: ConsoleReporter,\n\t\tprivate previousFailuresMap?: Map<string, Map<string, PreviousViolation[]>>,\n\t\tprivate changeOptions?: { commit?: string; uncommitted?: boolean },\n\t\tprivate baseBranchOverride?: string,\n\t\tprivate passedSlotsMap?: Map<\n\t\t\tstring,\n\t\t\tMap<number, { adapter: string; passIteration: number }>\n\t\t>,\n\t\tprivate debugLogger?: DebugLogger,\n\t\tprivate isRerun?: boolean,\n\t) {}\n\n\tasync run(jobs: Job[]): Promise<RunnerOutcome> {\n\t\t// Note: logger.init() is called by the caller (run-executor, check, review)\n\t\t// before startConsoleLog to ensure unified numbering\n\n\t\t// Enforce retry limit before executing gates\n\t\tconst maxRetries = this.config.project.max_retries ?? 3;\n\t\tconst currentRunNumber = this.logger.getRunNumber();\n\t\tconst maxAllowedRuns = maxRetries + 1;\n\n\t\tif (currentRunNumber > maxAllowedRuns) {\n\t\t\tconsole.error(\n\t\t\t\t`Retry limit exceeded: run ${currentRunNumber} exceeds max allowed ${maxAllowedRuns} (max_retries: ${maxRetries}). Human input required on what to do next.`,\n\t\t\t);\n\t\t\tprocess.exitCode = 1;\n\t\t\treturn {\n\t\t\t\tallPassed: false,\n\t\t\t\tanySkipped: false,\n\t\t\t\tretryLimitExceeded: true,\n\t\t\t\tanyErrors: false,\n\t\t\t\tstats: { fixed: 0, skipped: 0, failed: 0 },\n\t\t\t\tgateResults: [],\n\t\t\t};\n\t\t}\n\n\t\tconst parallelEnabled = this.config.project.allow_parallel;\n\t\tconst parallelJobs = parallelEnabled\n\t\t\t? jobs.filter((j) => j.gateConfig.parallel)\n\t\t\t: [];\n\t\tconst sequentialJobs = parallelEnabled\n\t\t\t? jobs.filter((j) => !j.gateConfig.parallel)\n\t\t\t: jobs;\n\n\t\t// Start parallel jobs\n\t\tconst parallelPromises = parallelJobs.map((job) => this.executeJob(job));\n\n\t\t// Start sequential jobs\n\t\tconst sequentialPromise = (async () => {\n\t\t\tfor (const job of sequentialJobs) {\n\t\t\t\tif (this.shouldStop) break;\n\t\t\t\tawait this.executeJob(job);\n\t\t\t}\n\t\t})();\n\n\t\tawait Promise.all([...parallelPromises, sequentialPromise]);\n\n\t\tconst allPassed = this.results.every((r) => r.status === \"pass\");\n\t\tconst anySkipped = this.results.some(\n\t\t\t(r) => r.skipped && r.skipped.length > 0,\n\t\t);\n\t\tconst anyErrors = this.results.some((r) => r.status === \"error\");\n\t\tconst retryLimitExceeded =\n\t\t\t!allPassed && currentRunNumber === maxAllowedRuns;\n\n\t\t// Calculate statistics from results\n\t\tconst stats = calculateStats(this.results);\n\n\t\t// If on the final allowed run and gates failed, report \"Retry limit exceeded\"\n\t\tif (retryLimitExceeded) {\n\t\t\tawait this.reporter.printSummary(\n\t\t\t\tthis.results,\n\t\t\t\tthis.config.project.log_dir,\n\t\t\t\t\"Retry limit exceeded\",\n\t\t\t);\n\t\t\treturn {\n\t\t\t\tallPassed: false,\n\t\t\t\tanySkipped,\n\t\t\t\tretryLimitExceeded: true,\n\t\t\t\tanyErrors,\n\t\t\t\tstats,\n\t\t\t\tgateResults: this.results,\n\t\t\t};\n\t\t}\n\n\t\tawait this.reporter.printSummary(this.results, this.config.project.log_dir);\n\n\t\treturn {\n\t\t\tallPassed,\n\t\t\tanySkipped,\n\t\t\tretryLimitExceeded: false,\n\t\t\tanyErrors,\n\t\t\tstats,\n\t\t\tgateResults: this.results,\n\t\t};\n\t}\n\n\tprivate async executeJob(job: Job): Promise<void> {\n\t\tif (this.shouldStop) return;\n\n\t\tthis.reporter.onJobStart(job);\n\n\t\tlet result: GateResult;\n\n\t\tconst effectiveBaseBranch =\n\t\t\tthis.baseBranchOverride || this.config.project.base_branch;\n\n\t\ttry {\n\t\t\tif (job.type === \"check\") {\n\t\t\t\tconst logPath = await this.logger.getLogPath(job.id);\n\t\t\t\tconst jobLogger = await this.logger.createJobLogger(job.id);\n\t\t\t\tresult = await this.checkExecutor.execute(\n\t\t\t\t\tjob.id,\n\t\t\t\t\tjob.gateConfig as LoadedCheckGateConfig,\n\t\t\t\t\tjob.workingDirectory,\n\t\t\t\t\tjobLogger,\n\t\t\t\t\t{ baseBranch: effectiveBaseBranch, isRerun: this.isRerun },\n\t\t\t\t);\n\t\t\t\tresult.logPath = logPath;\n\t\t\t} else {\n\t\t\t\t// Use sanitized Job ID for lookup because that's what log-parser uses (based on filenames)\n\t\t\t\tconst safeJobId = sanitizeJobId(job.id);\n\t\t\t\tresult = await this.reviewExecutor.execute(\n\t\t\t\t\tjob.id,\n\t\t\t\t\tjob.gateConfig as LoadedReviewGateConfig,\n\t\t\t\t\tjob.entryPoint,\n\t\t\t\t\tthis.logger.createLoggerFactory(job.id),\n\t\t\t\t\teffectiveBaseBranch,\n\t\t\t\t\tthis.previousFailuresMap?.get(safeJobId),\n\t\t\t\t\tthis.changeOptions,\n\t\t\t\t\tthis.config.project.rerun_new_issue_threshold,\n\t\t\t\t\tthis.passedSlotsMap?.get(safeJobId),\n\t\t\t\t\tthis.config.project.log_dir,\n\t\t\t\t\tthis.config.project.cli?.adapters,\n\t\t\t\t);\n\t\t\t}\n\t\t} catch (err) {\n\t\t\tconsole.error(\"[ERROR] Execution failed for\", job.id, \":\", err);\n\t\t\tresult = {\n\t\t\t\tjobId: job.id,\n\t\t\t\tstatus: \"error\",\n\t\t\t\tduration: 0,\n\t\t\t\tmessage: err instanceof Error ? err.message : String(err),\n\t\t\t};\n\t\t}\n\n\t\tthis.results.push(result);\n\t\tthis.reporter.onJobComplete(job, result);\n\t\tawait this.logGateResults(job.id, result);\n\n\t\tthis.checkFailFast(job, result);\n\t}\n\n\tprivate checkFailFast(job: Job, result: GateResult): void {\n\t\tif (result.status === \"pass\") return;\n\t\tif (job.type !== \"check\") return;\n\n\t\t// We know it's a check gate, so cast to check config to access fail_fast safely\n\t\tconst config = job.gateConfig as LoadedCheckGateConfig;\n\t\tif (config.fail_fast) {\n\t\t\tthis.shouldStop = true;\n\t\t}\n\t}\n\n\t/**\n\t * Log gate results to the debug log.\n\t * For review gates with subResults, logs one entry per reviewer.\n\t * For check gates, logs a single entry.\n\t */\n\tprivate async logGateResults(\n\t\tjobId: string,\n\t\tresult: GateResult,\n\t): Promise<void> {\n\t\tif (!this.debugLogger) return;\n\n\t\tif (result.subResults && result.subResults.length > 0) {\n\t\t\tfor (const sub of result.subResults) {\n\t\t\t\tconst cli = sub.nameSuffix.match(/\\((.+?)@\\d+\\)/)?.[1];\n\t\t\t\tawait this.debugLogger.logGateResult(\n\t\t\t\t\tjobId,\n\t\t\t\t\tsub.status,\n\t\t\t\t\tsub.duration ?? result.duration,\n\t\t\t\t\t{ violations: sub.errorCount, cli },\n\t\t\t\t);\n\t\t\t}\n\t\t} else {\n\t\t\tawait this.debugLogger.logGateResult(\n\t\t\t\tjobId,\n\t\t\t\tresult.status,\n\t\t\t\tresult.duration,\n\t\t\t\t{ violations: result.errorCount },\n\t\t\t);\n\t\t}\n\t}\n}\n",
|
|
@@ -39,7 +39,7 @@
|
|
|
39
39
|
"import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport type { ReviewFullJsonOutput } from \"../gates/result.js\";\nimport { getCategoryLogger } from \"../output/app-logger.js\";\n\nexport type { PreviousViolation } from \"../gates/result.js\";\n\nimport type { PreviousViolation } from \"../gates/result.js\";\n\nconst log = getCategoryLogger(\"log-parser\");\n\nexport interface AdapterFailure {\n\tadapterName: string; // e.g., 'claude', 'gemini'\n\treviewIndex?: number; // 1-based review index from @N in filename\n\tviolations: PreviousViolation[];\n}\n\nexport interface PassedSlot {\n\treviewIndex: number; // 1-based review index\n\tpassIteration: number; // Iteration number when this slot passed\n\tadapter: string; // Adapter name that passed the review\n}\n\n/**\n * Result from findPreviousFailures that includes both failures and passed slots.\n * passedSlots maps jobId -> reviewIndex -> { adapter, passIteration }\n */\nexport interface PreviousFailuresResult {\n\tfailures: GateFailures[];\n\tpassedSlots: Map<string, Map<number, PassedSlot>>;\n}\n\nexport interface GateFailures {\n\tjobId: string; // This will be the sanitized Job ID (filename without extension)\n\tgateName: string; // Parsed or empty\n\tentryPoint: string; // Parsed or empty\n\tadapterFailures: AdapterFailure[]; // Failures grouped by adapter\n\tlogPath: string;\n}\n\n/**\n * Parse a review filename to extract the job ID, adapter, review index, and run number.\n * Pattern: <jobId>_<adapter>@<reviewIndex>.<runNumber>.(log|json)\n * Returns null if the filename doesn't match the review pattern.\n */\nexport function parseReviewFilename(filename: string): {\n\tjobId: string;\n\tadapter: string;\n\treviewIndex: number;\n\trunNumber: number;\n\text: string;\n} | null {\n\t// Match: <prefix>_<adapter>@<index>.<runNum>.(log|json)\n\tconst m = filename.match(/^(.+)_([^@]+)@(\\d+)\\.(\\d+)\\.(log|json)$/);\n\tif (!m) return null;\n\tconst [, jobId, adapter, indexStr, runStr, ext] = m;\n\tif (!jobId || !adapter || !indexStr || !runStr || !ext) return null;\n\treturn {\n\t\tjobId,\n\t\tadapter,\n\t\treviewIndex: parseInt(indexStr, 10),\n\t\trunNumber: parseInt(runStr, 10),\n\t\text,\n\t};\n}\n\n/**\n * Parses a JSON review file.\n */\nexport async function parseJsonReviewFile(\n\tjsonPath: string,\n): Promise<GateFailures | null> {\n\ttry {\n\t\tconst content = await fs.readFile(jsonPath, \"utf-8\");\n\t\tconst data: ReviewFullJsonOutput = JSON.parse(content);\n\t\tconst filename = path.basename(jsonPath);\n\n\t\t// Extract jobId: strip the _adapter@index.runNum.json suffix\n\t\tconst parsed = parseReviewFilename(filename);\n\t\tconst jobId = parsed ? parsed.jobId : filename.replace(/\\.\\d+\\.json$/, \"\");\n\n\t\tif (data.status === \"pass\" || data.status === \"skipped_prior_pass\") {\n\t\t\treturn null;\n\t\t}\n\n\t\tconst violations = (data.violations || []).map((v) => ({\n\t\t\t...v,\n\t\t\tstatus: v.status || \"new\",\n\t\t}));\n\n\t\tif (violations.length === 0 && data.status === \"fail\") {\n\t\t\tviolations.push({\n\t\t\t\tfile: \"unknown\",\n\t\t\t\tline: \"?\",\n\t\t\t\tissue: \"Previous run failed but no violations found in JSON\",\n\t\t\t\tstatus: \"new\",\n\t\t\t});\n\t\t}\n\n\t\tif (violations.length === 0) return null;\n\n\t\treturn {\n\t\t\tjobId,\n\t\t\tgateName: \"\",\n\t\t\tentryPoint: \"\",\n\t\t\tadapterFailures: [\n\t\t\t\t{\n\t\t\t\t\tadapterName: data.adapter,\n\t\t\t\t\treviewIndex: parsed?.reviewIndex,\n\t\t\t\t\tviolations,\n\t\t\t\t},\n\t\t\t],\n\t\t\tlogPath: jsonPath.replace(/\\.json$/, \".log\"),\n\t\t};\n\t} catch (error) {\n\t\tlog.warn(`Failed to parse JSON review file: ${jsonPath} - ${error}`);\n\t\treturn null;\n\t}\n}\n\n/**\n * Extract the log prefix (job ID) from a numbered log filename.\n * Handles both patterns:\n * - Check: `check_src_test.2.log` -> `check_src_test`\n * - Review (new): `review_src_claude@1.2.log` -> `review_src_claude@1`\n */\nexport function extractPrefix(filename: string): string {\n\t// Pattern: <prefix>.<number>.(log|json)\n\tconst m = filename.match(/^(.+)\\.\\d+\\.(log|json)$/);\n\tif (m?.[1]) return m[1];\n\t// Fallback for non-numbered files\n\treturn filename.replace(/\\.(log|json)$/, \"\");\n}\n\n/**\n * Parses a single log file to extract failures per adapter.\n * Processes both review and check gates.\n */\nexport async function parseLogFile(\n\tlogPath: string,\n): Promise<GateFailures | null> {\n\ttry {\n\t\tconst content = await fs.readFile(logPath, \"utf-8\");\n\t\tconst filename = path.basename(logPath);\n\n\t\t// Try to parse as review filename with @index pattern\n\t\tconst parsed = parseReviewFilename(filename);\n\t\tconst jobId = parsed ? parsed.jobId : extractPrefix(filename);\n\n\t\t// Check if it's a review log\n\t\tif (content.includes(\"--- Review Output\")) {\n\t\t\tconst adapterFailures: AdapterFailure[] = [];\n\t\t\tconst sectionRegex = /--- Review Output \\(([^)]+)\\) ---/g;\n\n\t\t\tlet match: RegExpExecArray | null;\n\t\t\tconst sections: { adapter: string; startIndex: number }[] = [];\n\n\t\t\tfor (;;) {\n\t\t\t\tmatch = sectionRegex.exec(content);\n\t\t\t\tif (!match || !match[1]) break;\n\t\t\t\tsections.push({\n\t\t\t\t\tadapter: match[1],\n\t\t\t\t\tstartIndex: match.index,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (sections.length === 0) return null;\n\n\t\t\tfor (let i = 0; i < sections.length; i++) {\n\t\t\t\tconst currentSection = sections[i];\n\t\t\t\tif (!currentSection) continue;\n\t\t\t\tconst nextSection = sections[i + 1];\n\t\t\t\tconst endIndex = nextSection ? nextSection.startIndex : content.length;\n\t\t\t\tconst sectionContent = content.substring(\n\t\t\t\t\tcurrentSection.startIndex,\n\t\t\t\t\tendIndex,\n\t\t\t\t);\n\n\t\t\t\tconst violations: PreviousViolation[] = [];\n\t\t\t\tconst parsedResultMatch = sectionContent.match(\n\t\t\t\t\t/---\\s*Parsed Result(?:\\s+\\(([^)]+)\\))?\\s*---([\\s\\S]*?)(?:$|---)/,\n\t\t\t\t);\n\n\t\t\t\tif (parsedResultMatch?.[2]) {\n\t\t\t\t\tconst parsedContent = parsedResultMatch[2];\n\t\t\t\t\tif (parsedContent.includes(\"Status: PASS\")) continue;\n\t\t\t\t\tconst violationRegex = /^\\d+\\.\\s+(.+?):(\\d+|NaN|\\?)\\s+-\\s+(.+)$/gm;\n\t\t\t\t\tlet vMatch: RegExpExecArray | null;\n\t\t\t\t\tfor (;;) {\n\t\t\t\t\t\tvMatch = violationRegex.exec(parsedContent);\n\t\t\t\t\t\tif (!vMatch || !vMatch[1] || !vMatch[2] || !vMatch[3]) break;\n\t\t\t\t\t\tconst file = vMatch[1].trim();\n\t\t\t\t\t\tlet line: number | string = vMatch[2];\n\t\t\t\t\t\tif (line !== \"NaN\" && line !== \"?\")\n\t\t\t\t\t\t\tline = parseInt(line as string, 10);\n\t\t\t\t\t\tconst issue = vMatch[3].trim();\n\t\t\t\t\t\tlet fix: string | undefined;\n\t\t\t\t\t\tconst remainder = parsedContent.substring(\n\t\t\t\t\t\t\tvMatch.index + vMatch[0].length,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tconst fixMatch = remainder.match(/^\\s+Fix:\\s+(.+)$/m);\n\t\t\t\t\t\tconst nextViolationIndex = remainder.search(/^\\d+\\./m);\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tfixMatch?.index !== undefined &&\n\t\t\t\t\t\t\tfixMatch[1] &&\n\t\t\t\t\t\t\t(nextViolationIndex === -1 || fixMatch.index < nextViolationIndex)\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tfix = fixMatch[1].trim();\n\t\t\t\t\t\t}\n\t\t\t\t\t\tviolations.push({ file, line, issue, fix });\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// Fallback JSON\n\t\t\t\t\tconst firstBrace = sectionContent.indexOf(\"{\");\n\t\t\t\t\tconst lastBrace = sectionContent.lastIndexOf(\"}\");\n\t\t\t\t\tif (firstBrace !== -1 && lastBrace !== -1 && lastBrace > firstBrace) {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst jsonStr = sectionContent.substring(\n\t\t\t\t\t\t\t\tfirstBrace,\n\t\t\t\t\t\t\t\tlastBrace + 1,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tconst json = JSON.parse(jsonStr);\n\t\t\t\t\t\t\tif (json.violations && Array.isArray(json.violations)) {\n\t\t\t\t\t\t\t\tfor (const v of json.violations) {\n\t\t\t\t\t\t\t\t\tif (v.file && v.issue) {\n\t\t\t\t\t\t\t\t\t\tviolations.push({\n\t\t\t\t\t\t\t\t\t\t\tfile: v.file,\n\t\t\t\t\t\t\t\t\t\t\tline: v.line || 0,\n\t\t\t\t\t\t\t\t\t\t\tissue: v.issue,\n\t\t\t\t\t\t\t\t\t\t\tfix: v.fix,\n\t\t\t\t\t\t\t\t\t\t\tstatus: v.status,\n\t\t\t\t\t\t\t\t\t\t\tresult: v.result,\n\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} catch (_e) {}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (violations.length > 0) {\n\t\t\t\t\tadapterFailures.push({\n\t\t\t\t\t\tadapterName: currentSection.adapter,\n\t\t\t\t\t\treviewIndex: parsed?.reviewIndex,\n\t\t\t\t\t\tviolations,\n\t\t\t\t\t});\n\t\t\t\t} else if (parsedResultMatch?.[2]?.includes(\"Status: FAIL\")) {\n\t\t\t\t\tadapterFailures.push({\n\t\t\t\t\t\tadapterName: currentSection.adapter,\n\t\t\t\t\t\treviewIndex: parsed?.reviewIndex,\n\t\t\t\t\t\tviolations: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tfile: \"unknown\",\n\t\t\t\t\t\t\t\tline: \"?\",\n\t\t\t\t\t\t\t\tissue:\n\t\t\t\t\t\t\t\t\t\"Previous run failed but specific violations could not be parsed\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (adapterFailures.length === 0) return null;\n\t\t\treturn { jobId, gateName: \"\", entryPoint: \"\", adapterFailures, logPath };\n\t\t} else {\n\t\t\t// Check log\n\t\t\tif (content.includes(\"Result: pass\")) return null;\n\n\t\t\tconst hasFailure =\n\t\t\t\tcontent.includes(\"Result: fail\") ||\n\t\t\t\tcontent.includes(\"Result: error\") ||\n\t\t\t\tcontent.includes(\"Command failed:\");\n\n\t\t\tif (!hasFailure) return null;\n\n\t\t\treturn {\n\t\t\t\tjobId,\n\t\t\t\tgateName: \"\",\n\t\t\t\tentryPoint: \"\",\n\t\t\t\tadapterFailures: [\n\t\t\t\t\t{\n\t\t\t\t\t\tadapterName: \"check\",\n\t\t\t\t\t\tviolations: [{ file: \"check\", line: 0, issue: \"Check failed\" }],\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\tlogPath,\n\t\t\t};\n\t\t}\n\t} catch (_error) {\n\t\treturn null;\n\t}\n}\n\nexport interface RunIteration {\n\titeration: number;\n\tfixed: Array<{\n\t\tjobId: string;\n\t\tadapter?: string;\n\t\tdetails: string;\n\t}>;\n\tskipped: Array<{\n\t\tjobId: string;\n\t\tadapter?: string;\n\t\tfile: string;\n\t\tline: number | string;\n\t\tissue: string;\n\t\tresult?: string | null;\n\t}>;\n}\n\n/**\n * Reconstructs the history of fixes and skips after all iterations.\n */\nexport async function reconstructHistory(\n\tlogDir: string,\n): Promise<RunIteration[]> {\n\ttry {\n\t\tconst files = await fs.readdir(logDir);\n\t\tconst runNumbers = new Set<number>();\n\t\tfor (const file of files) {\n\t\t\tconst m = file.match(/\\.(\\d+)\\.(log|json)$/);\n\t\t\tif (m?.[1]) runNumbers.add(parseInt(m[1], 10));\n\t\t}\n\n\t\tconst sortedRuns = Array.from(runNumbers).sort((a, b) => a - b);\n\t\tconst iterations: RunIteration[] = [];\n\n\t\tlet previousFailuresByJob = new Map<string, PreviousViolation[]>();\n\n\t\tfor (const runNum of sortedRuns) {\n\t\t\tconst currentFailuresByJob = new Map<string, PreviousViolation[]>();\n\t\t\tconst iteration: RunIteration = {\n\t\t\t\titeration: runNum,\n\t\t\t\tfixed: [],\n\t\t\t\tskipped: [],\n\t\t\t};\n\n\t\t\tconst runFiles = files.filter((f) => f.includes(`.${runNum}.`));\n\t\t\tconst prefixes = new Set(runFiles.map((f) => extractPrefix(f)));\n\n\t\t\tfor (const prefix of prefixes) {\n\t\t\t\tconst jsonFile = runFiles.find(\n\t\t\t\t\t(f) => f.startsWith(`${prefix}.${runNum}.`) && f.endsWith(\".json\"),\n\t\t\t\t);\n\t\t\t\tconst logFile = runFiles.find(\n\t\t\t\t\t(f) => f.startsWith(`${prefix}.${runNum}.`) && f.endsWith(\".log\"),\n\t\t\t\t);\n\n\t\t\t\tlet failure: GateFailures | null = null;\n\t\t\t\tif (jsonFile) {\n\t\t\t\t\tfailure = await parseJsonReviewFile(path.join(logDir, jsonFile));\n\t\t\t\t} else if (logFile) {\n\t\t\t\t\tfailure = await parseLogFile(path.join(logDir, logFile));\n\t\t\t\t}\n\n\t\t\t\tif (failure) {\n\t\t\t\t\tfor (const af of failure.adapterFailures) {\n\t\t\t\t\t\tconst key = af.reviewIndex\n\t\t\t\t\t\t\t? `${failure.jobId}:${af.reviewIndex}`\n\t\t\t\t\t\t\t: `${failure.jobId}:${af.adapterName}`;\n\t\t\t\t\t\tcurrentFailuresByJob.set(key, af.violations);\n\n\t\t\t\t\t\tfor (const v of af.violations) {\n\t\t\t\t\t\t\tif (v.status === \"skipped\") {\n\t\t\t\t\t\t\t\titeration.skipped.push({\n\t\t\t\t\t\t\t\t\tjobId: failure.jobId,\n\t\t\t\t\t\t\t\t\tadapter: af.adapterName,\n\t\t\t\t\t\t\t\t\tfile: v.file,\n\t\t\t\t\t\t\t\t\tline: v.line,\n\t\t\t\t\t\t\t\t\tissue: v.issue,\n\t\t\t\t\t\t\t\t\tresult: v.result,\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor (const [key, prevViolations] of previousFailuresByJob.entries()) {\n\t\t\t\tconst current = currentFailuresByJob.get(key);\n\t\t\t\tconst sep = key.lastIndexOf(\":\");\n\t\t\t\tconst jobId = key.substring(0, sep);\n\t\t\t\tconst adapter = key.substring(sep + 1);\n\n\t\t\t\tconst trulyFixed = prevViolations.filter((pv) => {\n\t\t\t\t\tif (pv.status === \"skipped\") return false;\n\t\t\t\t\treturn !current?.some(\n\t\t\t\t\t\t(cv) =>\n\t\t\t\t\t\t\tcv.file === pv.file &&\n\t\t\t\t\t\t\tcv.line === pv.line &&\n\t\t\t\t\t\t\tcv.issue === pv.issue,\n\t\t\t\t\t);\n\t\t\t\t});\n\n\t\t\t\tif (trulyFixed.length > 0) {\n\t\t\t\t\tif (jobId.startsWith(\"check_\")) {\n\t\t\t\t\t\titeration.fixed.push({\n\t\t\t\t\t\t\tjobId,\n\t\t\t\t\t\t\tdetails: `${trulyFixed.length} violations resolved`,\n\t\t\t\t\t\t});\n\t\t\t\t\t} else {\n\t\t\t\t\t\tfor (const f of trulyFixed) {\n\t\t\t\t\t\t\titeration.fixed.push({\n\t\t\t\t\t\t\t\tjobId,\n\t\t\t\t\t\t\t\tadapter,\n\t\t\t\t\t\t\t\tdetails: `${f.file}:${f.line} ${f.issue}`,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\titerations.push(iteration);\n\t\t\tpreviousFailuresByJob = currentFailuresByJob;\n\t\t}\n\n\t\treturn iterations;\n\t} catch (_e) {\n\t\treturn [];\n\t}\n}\n\n/**\n * Checks if a JSON review file has status \"pass\" or \"skipped_prior_pass\".\n * Skipped slots are treated as passing since they represent a previously-passed review.\n */\nasync function isJsonReviewPassing(jsonPath: string): Promise<boolean> {\n\ttry {\n\t\tconst content = await fs.readFile(jsonPath, \"utf-8\");\n\t\tconst data: ReviewFullJsonOutput = JSON.parse(content);\n\t\treturn data.status === \"pass\" || data.status === \"skipped_prior_pass\";\n\t} catch {\n\t\treturn false;\n\t}\n}\n\n/**\n * Checks if a log file represents a passing review.\n * Treats both \"Status: PASS\" and \"Status: skipped_prior_pass\" as passing.\n */\nasync function isLogReviewPassing(logPath: string): Promise<boolean> {\n\ttry {\n\t\tconst content = await fs.readFile(logPath, \"utf-8\");\n\t\t// Check for skipped review log (skipped slots are treated as passing)\n\t\tif (content.includes(\"Status: skipped_prior_pass\")) {\n\t\t\treturn true;\n\t\t}\n\t\t// Check for review log passing\n\t\tif (content.includes(\"--- Review Output\")) {\n\t\t\treturn content.includes(\"Status: PASS\");\n\t\t}\n\t\t// Check for check log passing\n\t\treturn content.includes(\"Result: pass\");\n\t} catch {\n\t\treturn false;\n\t}\n}\n\n/**\n * Finds all previous failures and passed slots from the log directory.\n * For review gates with the @<index> pattern, groups by (jobId, reviewIndex)\n * and returns the highest-numbered run for each index.\n * The resulting Map keys are the review index (as string) for lookup by the review gate.\n *\n * Also returns passedSlots: a map of jobId -> reviewIndex -> passIteration\n * for slots that passed in their most recent run.\n */\nexport async function findPreviousFailures(\n\tlogDir: string,\n\tgateFilter?: string,\n): Promise<GateFailures[]>;\nexport async function findPreviousFailures(\n\tlogDir: string,\n\tgateFilter: string | undefined,\n\tincludePassedSlots: true,\n): Promise<PreviousFailuresResult>;\nexport async function findPreviousFailures(\n\tlogDir: string,\n\tgateFilter?: string,\n\tincludePassedSlots?: boolean,\n): Promise<GateFailures[] | PreviousFailuresResult> {\n\ttry {\n\t\tconst files = await fs.readdir(logDir);\n\t\tconst gateFailures: GateFailures[] = [];\n\t\t// Map: jobId -> reviewIndex -> { adapter, passIteration }\n\t\tconst passedSlots = new Map<string, Map<number, PassedSlot>>();\n\n\t\t// Separate review files (with @index) from check files\n\t\t// Group review files by (jobId, reviewIndex) -> highest run number\n\t\tconst reviewSlotMap = new Map<\n\t\t\tstring,\n\t\t\t{ filename: string; runNumber: number; ext: string }\n\t\t>();\n\t\tconst checkPrefixMap = new Map<string, Map<number, Set<string>>>();\n\n\t\tfor (const file of files) {\n\t\t\tconst isLog = file.endsWith(\".log\");\n\t\t\tconst isJson = file.endsWith(\".json\");\n\t\t\tif (!isLog && !isJson) continue;\n\t\t\tif (gateFilter && !file.includes(gateFilter)) continue;\n\n\t\t\tconst parsed = parseReviewFilename(file);\n\t\t\tif (parsed) {\n\t\t\t\t// Review file with @index pattern\n\t\t\t\tconst slotKey = `${parsed.jobId}:${parsed.reviewIndex}`;\n\t\t\t\tconst existing = reviewSlotMap.get(slotKey);\n\t\t\t\t// Update if: no existing entry, higher run number, or same run number but .json (prefer .json over .log)\n\t\t\t\tconst shouldUpdate =\n\t\t\t\t\t!existing ||\n\t\t\t\t\tparsed.runNumber > existing.runNumber ||\n\t\t\t\t\t(parsed.runNumber === existing.runNumber &&\n\t\t\t\t\t\tparsed.ext === \"json\" &&\n\t\t\t\t\t\texisting.ext === \"log\");\n\t\t\t\tif (shouldUpdate) {\n\t\t\t\t\treviewSlotMap.set(slotKey, {\n\t\t\t\t\t\tfilename: file,\n\t\t\t\t\t\trunNumber: parsed.runNumber,\n\t\t\t\t\t\text: parsed.ext,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Check file or legacy review file\n\t\t\t\tconst m = file.match(/^(.+)\\.(\\d+)\\.(log|json)$/);\n\t\t\t\tif (!m || !m[1] || !m[2] || !m[3]) continue;\n\n\t\t\t\tconst prefix = m[1];\n\t\t\t\tconst runNum = parseInt(m[2], 10);\n\t\t\t\tconst ext = m[3];\n\n\t\t\t\tlet runMap = checkPrefixMap.get(prefix);\n\t\t\t\tif (!runMap) {\n\t\t\t\t\trunMap = new Map();\n\t\t\t\t\tcheckPrefixMap.set(prefix, runMap);\n\t\t\t\t}\n\n\t\t\t\tlet exts = runMap.get(runNum);\n\t\t\t\tif (!exts) {\n\t\t\t\t\texts = new Set();\n\t\t\t\t\trunMap.set(runNum, exts);\n\t\t\t\t}\n\t\t\t\texts.add(ext);\n\t\t\t}\n\t\t}\n\n\t\t// Process review files grouped by slot (jobId + reviewIndex)\n\t\t// Group by jobId to produce a single GateFailures per job\n\t\tconst jobReviewFailures = new Map<string, AdapterFailure[]>();\n\n\t\tfor (const [slotKey, fileInfo] of reviewSlotMap.entries()) {\n\t\t\tconst sepIdx = slotKey.lastIndexOf(\":\");\n\t\t\tconst jobId = slotKey.substring(0, sepIdx);\n\t\t\tconst reviewIndex = parseInt(slotKey.substring(sepIdx + 1), 10);\n\n\t\t\t// Extract adapter from filename\n\t\t\tconst parsed = parseReviewFilename(fileInfo.filename);\n\t\t\tconst adapter = parsed?.adapter || \"unknown\";\n\n\t\t\t// Check if this slot passed\n\t\t\tconst filePath = path.join(logDir, fileInfo.filename);\n\t\t\tlet isPassing = false;\n\t\t\tif (fileInfo.ext === \"json\") {\n\t\t\t\tisPassing = await isJsonReviewPassing(filePath);\n\t\t\t} else {\n\t\t\t\tisPassing = await isLogReviewPassing(filePath);\n\t\t\t}\n\n\t\t\tif (isPassing && includePassedSlots) {\n\t\t\t\t// Record this as a passed slot with adapter info\n\t\t\t\tlet jobSlots = passedSlots.get(jobId);\n\t\t\t\tif (!jobSlots) {\n\t\t\t\t\tjobSlots = new Map();\n\t\t\t\t\tpassedSlots.set(jobId, jobSlots);\n\t\t\t\t}\n\t\t\t\tjobSlots.set(reviewIndex, {\n\t\t\t\t\treviewIndex,\n\t\t\t\t\tpassIteration: fileInfo.runNumber,\n\t\t\t\t\tadapter,\n\t\t\t\t});\n\t\t\t\tcontinue; // Don't process as failure\n\t\t\t}\n\n\t\t\tlet failure: GateFailures | null = null;\n\t\t\tif (fileInfo.ext === \"json\") {\n\t\t\t\tfailure = await parseJsonReviewFile(filePath);\n\t\t\t} else {\n\t\t\t\tfailure = await parseLogFile(filePath);\n\t\t\t}\n\n\t\t\tif (failure) {\n\t\t\t\t// Apply status filtering\n\t\t\t\tfor (const af of failure.adapterFailures) {\n\t\t\t\t\taf.reviewIndex = reviewIndex;\n\t\t\t\t\tconst filteredViolations: PreviousViolation[] = [];\n\t\t\t\t\tfor (const v of af.violations) {\n\t\t\t\t\t\tconst status = v.status || \"new\";\n\t\t\t\t\t\tif (status === \"skipped\") continue;\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tstatus !== \"new\" &&\n\t\t\t\t\t\t\tstatus !== \"fixed\" &&\n\t\t\t\t\t\t\tstatus !== \"skipped\"\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tlog.warn(\n\t\t\t\t\t\t\t\t`Unexpected status \"${status}\" for violation in ${jobId}. Treating as \"new\".`,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tv.status = \"new\";\n\t\t\t\t\t\t}\n\t\t\t\t\t\tfilteredViolations.push(v);\n\t\t\t\t\t}\n\t\t\t\t\taf.violations = filteredViolations;\n\n\t\t\t\t\tif (af.violations.length > 0) {\n\t\t\t\t\t\tlet failures = jobReviewFailures.get(jobId);\n\t\t\t\t\t\tif (!failures) {\n\t\t\t\t\t\t\tfailures = [];\n\t\t\t\t\t\t\tjobReviewFailures.set(jobId, failures);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tfailures.push(af);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor (const [jobId, adapterFailures] of jobReviewFailures.entries()) {\n\t\t\tgateFailures.push({\n\t\t\t\tjobId,\n\t\t\t\tgateName: \"\",\n\t\t\t\tentryPoint: \"\",\n\t\t\t\tadapterFailures,\n\t\t\t\tlogPath: path.join(logDir, `${jobId}.log`),\n\t\t\t});\n\t\t}\n\n\t\t// Process check files (non-review)\n\t\tfor (const [prefix, runMap] of checkPrefixMap.entries()) {\n\t\t\tconst latestRun = Math.max(...runMap.keys());\n\t\t\tconst exts = runMap.get(latestRun);\n\t\t\tif (!exts) continue;\n\n\t\t\tlet failure: GateFailures | null = null;\n\t\t\tif (exts.has(\"json\")) {\n\t\t\t\tfailure = await parseJsonReviewFile(\n\t\t\t\t\tpath.join(logDir, `${prefix}.${latestRun}.json`),\n\t\t\t\t);\n\t\t\t} else if (exts.has(\"log\")) {\n\t\t\t\tfailure = await parseLogFile(\n\t\t\t\t\tpath.join(logDir, `${prefix}.${latestRun}.log`),\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (failure) {\n\t\t\t\tfor (const af of failure.adapterFailures) {\n\t\t\t\t\tconst filteredViolations: PreviousViolation[] = [];\n\t\t\t\t\tfor (const v of af.violations) {\n\t\t\t\t\t\tconst status = v.status || \"new\";\n\t\t\t\t\t\tif (status === \"skipped\") continue;\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tstatus !== \"new\" &&\n\t\t\t\t\t\t\tstatus !== \"fixed\" &&\n\t\t\t\t\t\t\tstatus !== \"skipped\"\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tlog.warn(\n\t\t\t\t\t\t\t\t`Unexpected status \"${status}\" for violation in ${failure.jobId}. Treating as \"new\".`,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tv.status = \"new\";\n\t\t\t\t\t\t}\n\t\t\t\t\t\tfilteredViolations.push(v);\n\t\t\t\t\t}\n\t\t\t\t\taf.violations = filteredViolations;\n\t\t\t\t}\n\n\t\t\t\tconst totalViolations = failure.adapterFailures.reduce(\n\t\t\t\t\t(sum, af) => sum + af.violations.length,\n\t\t\t\t\t0,\n\t\t\t\t);\n\t\t\t\tif (totalViolations > 0) {\n\t\t\t\t\tgateFailures.push(failure);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (includePassedSlots) {\n\t\t\treturn { failures: gateFailures, passedSlots };\n\t\t}\n\t\treturn gateFailures;\n\t} catch (error: unknown) {\n\t\tif (\n\t\t\ttypeof error === \"object\" &&\n\t\t\terror !== null &&\n\t\t\t\"code\" in error &&\n\t\t\t(error as { code: string }).code === \"ENOENT\"\n\t\t) {\n\t\t\treturn includePassedSlots ? { failures: [], passedSlots: new Map() } : [];\n\t\t}\n\t\treturn includePassedSlots ? { failures: [], passedSlots: new Map() } : [];\n\t}\n}\n",
|
|
40
40
|
"import fs from \"node:fs\";\nimport fsPromises from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { inspect } from \"node:util\";\n\n// biome-ignore lint/suspicious/noControlCharactersInRegex: Required for ANSI escape code stripping\nconst ANSI_REGEX = /\\x1b(?:\\[[0-9;?]*[A-Za-z]|[78])/g;\n\nfunction stripAnsi(text: string): string {\n\treturn text.replace(ANSI_REGEX, \"\");\n}\n\nfunction formatArgs(args: unknown[]): string {\n\treturn args\n\t\t.map((a) => (typeof a === \"string\" ? a : inspect(a, { depth: 4 })))\n\t\t.join(\" \");\n}\n\nfunction openLogFileExclusive(\n\tlogDir: string,\n\trunNum: number,\n): { fd: number; logPath: string } {\n\tconst logPath = path.join(logDir, `console.${runNum}.log`);\n\ttry {\n\t\tconst fd = fs.openSync(\n\t\t\tlogPath,\n\t\t\tfs.constants.O_WRONLY | fs.constants.O_CREAT | fs.constants.O_EXCL,\n\t\t);\n\t\treturn { fd, logPath };\n\t} catch (e: unknown) {\n\t\tconst error = e as { code?: string };\n\t\tif (error.code === \"EEXIST\") {\n\t\t\t// If file exists, something is wrong with our numbering logic\n\t\t\t// Log warning and try incrementing as fallback\n\t\t\tconsole.error(`Warning: console.${runNum}.log already exists`);\n\t\t\treturn openLogFileFallback(logDir, runNum + 1);\n\t\t}\n\t\tthrow e;\n\t}\n}\n\nfunction openLogFileFallback(\n\tlogDir: string,\n\tstartNum: number,\n): { fd: number; logPath: string } {\n\tlet runNum = startNum;\n\tfor (let attempts = 0; attempts < 100; attempts++) {\n\t\tconst logPath = path.join(logDir, `console.${runNum}.log`);\n\t\ttry {\n\t\t\tconst fd = fs.openSync(\n\t\t\t\tlogPath,\n\t\t\t\tfs.constants.O_WRONLY | fs.constants.O_CREAT | fs.constants.O_EXCL,\n\t\t\t);\n\t\t\treturn { fd, logPath };\n\t\t} catch (e: unknown) {\n\t\t\tconst error = e as { code?: string };\n\t\t\tif (error.code === \"EEXIST\") {\n\t\t\t\trunNum++;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tthrow e;\n\t\t}\n\t}\n\tthrow new Error(\"Failed to create console log file after 100 attempts\");\n}\n\nexport interface ConsoleLogHandle {\n\t/** Restore original console functions */\n\trestore: () => void;\n\t/** Write directly to the log file without terminal output */\n\twriteToLogOnly: (text: string) => void;\n}\n\n/**\n * Start console logging with unified run numbering.\n * @param logDir The directory to write logs to\n * @param runNumber The run number from Logger (ensures console.N.log matches check.N.log)\n */\nexport async function startConsoleLog(\n\tlogDir: string,\n\trunNumber: number,\n): Promise<ConsoleLogHandle> {\n\tawait fsPromises.mkdir(logDir, { recursive: true });\n\tconst { fd } = openLogFileExclusive(logDir, runNumber);\n\n\ttry {\n\t\tconst originalLog = console.log;\n\t\tconst originalError = console.error;\n\t\tconst originalWarn = console.warn;\n\t\tconst originalStdoutWrite = process.stdout.write.bind(process.stdout);\n\t\tconst originalStderrWrite = process.stderr.write.bind(process.stderr);\n\n\t\tlet isClosed = false;\n\n\t\tfunction writeToLog(text: string): void {\n\t\t\tif (isClosed) return;\n\t\t\ttry {\n\t\t\t\tfs.writeSync(fd, stripAnsi(text));\n\t\t\t} catch {\n\t\t\t\t// Suppress logging failures to prevent crashing the application\n\t\t\t}\n\t\t}\n\n\t\t// Only patch console methods in bun (bun's console.log bypasses stdout.write)\n\t\t// In Node.js, console.log goes through stdout.write, so patching both would cause double logging\n\t\tconst isBun = typeof globalThis.Bun !== \"undefined\";\n\t\tif (isBun) {\n\t\t\tconsole.log = (...args: unknown[]) => {\n\t\t\t\twriteToLog(`${formatArgs(args)}\\n`);\n\t\t\t\toriginalLog(...args);\n\t\t\t};\n\n\t\t\tconsole.error = (...args: unknown[]) => {\n\t\t\t\twriteToLog(`${formatArgs(args)}\\n`);\n\t\t\t\toriginalError(...args);\n\t\t\t};\n\n\t\t\tconsole.warn = (...args: unknown[]) => {\n\t\t\t\twriteToLog(`${formatArgs(args)}\\n`);\n\t\t\t\toriginalWarn(...args);\n\t\t\t};\n\t\t}\n\n\t\tprocess.stdout.write = ((\n\t\t\tchunk: string | Uint8Array,\n\t\t\t...args: unknown[]\n\t\t): boolean => {\n\t\t\tconst text =\n\t\t\t\ttypeof chunk === \"string\" ? chunk : Buffer.from(chunk).toString();\n\t\t\twriteToLog(text);\n\t\t\treturn originalStdoutWrite(chunk, ...(args as []));\n\t\t}) as typeof process.stdout.write;\n\n\t\tprocess.stderr.write = ((\n\t\t\tchunk: string | Uint8Array,\n\t\t\t...args: unknown[]\n\t\t): boolean => {\n\t\t\tconst text =\n\t\t\t\ttypeof chunk === \"string\" ? chunk : Buffer.from(chunk).toString();\n\t\t\twriteToLog(text);\n\t\t\treturn originalStderrWrite(chunk, ...(args as []));\n\t\t}) as typeof process.stderr.write;\n\n\t\treturn {\n\t\t\trestore: () => {\n\t\t\t\tisClosed = true;\n\t\t\t\tif (isBun) {\n\t\t\t\t\tconsole.log = originalLog;\n\t\t\t\t\tconsole.error = originalError;\n\t\t\t\t\tconsole.warn = originalWarn;\n\t\t\t\t}\n\t\t\t\tprocess.stdout.write = originalStdoutWrite;\n\t\t\t\tprocess.stderr.write = originalStderrWrite;\n\t\t\t\ttry {\n\t\t\t\t\tfs.closeSync(fd);\n\t\t\t\t} catch {\n\t\t\t\t\t// Ignore close errors\n\t\t\t\t}\n\t\t\t},\n\t\t\twriteToLogOnly: (text: string) => {\n\t\t\t\twriteToLog(text);\n\t\t\t},\n\t\t};\n\t} catch (error) {\n\t\tfs.closeSync(fd);\n\t\tthrow error;\n\t}\n}\n",
|
|
41
41
|
"import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { sanitizeJobId } from \"../utils/sanitizer.js\";\n\nfunction formatTimestamp(): string {\n\treturn new Date().toISOString();\n}\n\n/**\n * Compute the global run number for the log directory.\n * Finds the highest run-number suffix across ALL log files and returns max+1.\n */\nasync function computeGlobalRunNumber(logDir: string): Promise<number> {\n\ttry {\n\t\tconst files = await fs.readdir(logDir);\n\t\tlet max = 0;\n\t\tfor (const file of files) {\n\t\t\tif (!file.endsWith(\".log\") && !file.endsWith(\".json\")) continue;\n\t\t\t// Pattern: <anything>.<number>.(log|json)\n\t\t\tconst m = file.match(/\\.(\\d+)\\.(log|json)$/);\n\t\t\tif (m?.[1]) {\n\t\t\t\tconst n = parseInt(m[1], 10);\n\t\t\t\tif (n > max) max = n;\n\t\t\t}\n\t\t}\n\t\treturn max + 1;\n\t} catch {\n\t\treturn 1;\n\t}\n}\n\nexport class Logger {\n\tprivate initializedFiles: Set<string> = new Set();\n\tprivate globalRunNumber: number | null = null;\n\n\tconstructor(private logDir: string) {}\n\n\tasync init() {\n\t\tawait fs.mkdir(this.logDir, { recursive: true });\n\t\tthis.globalRunNumber = await computeGlobalRunNumber(this.logDir);\n\t}\n\n\tasync close() {\n\t\t// No-op - using append mode\n\t}\n\n\tgetRunNumber(): number {\n\t\treturn this.globalRunNumber ?? 1;\n\t}\n\n\tasync getLogPath(\n\t\tjobId: string,\n\t\tadapterName?: string,\n\t\treviewIndex?: number,\n\t): Promise<string> {\n\t\tconst safeName = sanitizeJobId(jobId);\n\t\tconst runNum = this.globalRunNumber ?? 1;\n\n\t\tlet filename: string;\n\t\tif (adapterName && reviewIndex !== undefined) {\n\t\t\t// Review gate with index: <jobId>_<adapter>@<index>.<runNum>.log\n\t\t\tfilename = `${safeName}_${adapterName}@${reviewIndex}.${runNum}.log`;\n\t\t} else if (adapterName) {\n\t\t\t// Review gate without explicit index (backwards compat for single review)\n\t\t\tfilename = `${safeName}_${adapterName}@1.${runNum}.log`;\n\t\t} else {\n\t\t\t// Check gate: <jobId>.<runNum>.log\n\t\t\tfilename = `${safeName}.${runNum}.log`;\n\t\t}\n\n\t\treturn path.join(this.logDir, filename);\n\t}\n\n\tprivate async initFile(logPath: string): Promise<void> {\n\t\tif (this.initializedFiles.has(logPath)) {\n\t\t\treturn;\n\t\t}\n\t\tthis.initializedFiles.add(logPath);\n\t\tawait fs.writeFile(logPath, \"\");\n\t}\n\n\tasync createJobLogger(\n\t\tjobId: string,\n\t): Promise<(text: string) => Promise<void>> {\n\t\tconst logPath = await this.getLogPath(jobId);\n\t\tawait this.initFile(logPath);\n\n\t\treturn async (text: string) => {\n\t\t\tconst timestamp = formatTimestamp();\n\t\t\tconst lines = text.split(\"\\n\");\n\t\t\tif (lines.length > 0) {\n\t\t\t\tlines[0] = `[${timestamp}] ${lines[0]}`;\n\t\t\t}\n\t\t\tawait fs.appendFile(\n\t\t\t\tlogPath,\n\t\t\t\tlines.join(\"\\n\") + (text.endsWith(\"\\n\") ? \"\" : \"\\n\"),\n\t\t\t);\n\t\t};\n\t}\n\n\tcreateLoggerFactory(\n\t\tjobId: string,\n\t): (\n\t\tadapterName?: string,\n\t\treviewIndex?: number,\n\t) => Promise<{ logger: (text: string) => Promise<void>; logPath: string }> {\n\t\treturn async (adapterName?: string, reviewIndex?: number) => {\n\t\t\tconst logPath = await this.getLogPath(jobId, adapterName, reviewIndex);\n\t\t\tawait this.initFile(logPath);\n\n\t\t\tconst logger = async (text: string) => {\n\t\t\t\tconst timestamp = formatTimestamp();\n\t\t\t\tconst lines = text.split(\"\\n\");\n\t\t\t\tif (lines.length > 0) {\n\t\t\t\t\tlines[0] = `[${timestamp}] ${lines[0]}`;\n\t\t\t\t}\n\t\t\t\tawait fs.appendFile(\n\t\t\t\t\tlogPath,\n\t\t\t\t\tlines.join(\"\\n\") + (text.endsWith(\"\\n\") ? \"\" : \"\\n\"),\n\t\t\t\t);\n\t\t\t};\n\n\t\t\treturn { logger, logPath };\n\t\t};\n\t}\n}\n",
|
|
42
|
-
"import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport {\n\tgetDebugLogBackupFilename,\n\tgetDebugLogFilename,\n} from \"../utils/debug-log.js\";\nimport {\n\tdeleteExecutionState,\n\tgetCurrentBranch,\n\tgetExecutionStateFilename,\n\tisCommitInBranch,\n\treadExecutionState,\n} from \"../utils/execution-state.js\";\n\nconst LOCK_FILENAME = \".gauntlet-run.lock\";\nconst SESSION_REF_FILENAME = \".session_ref\";\n\nexport interface AutoCleanResult {\n\tclean: boolean;\n\treason?: string;\n\tresetState?: boolean;\n}\n\n/**\n * Check if logs should be auto-cleaned based on execution context changes.\n * Returns { clean: true, reason, resetState } if context has changed.\n * Returns { clean: false } if context is unchanged or state file doesn't exist.\n * When resetState is true, the execution state should be deleted (not just logs).\n */\nexport async function shouldAutoClean(\n\tlogDir: string,\n\tbaseBranch: string,\n): Promise<AutoCleanResult> {\n\tconst state = await readExecutionState(logDir);\n\n\t// No state file = no auto-clean needed\n\tif (!state) {\n\t\treturn { clean: false };\n\t}\n\n\t// Check if branch changed\n\ttry {\n\t\tconst currentBranch = await getCurrentBranch();\n\t\tif (currentBranch !== state.branch) {\n\t\t\treturn { clean: true, reason: \"branch changed\", resetState: true };\n\t\t}\n\t} catch {\n\t\t// If we can't get the current branch, don't auto-clean\n\t\treturn { clean: false };\n\t}\n\n\t// Check if commit was merged into base branch.\n\t// Skip this check when
|
|
42
|
+
"import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport {\n\tgetDebugLogBackupFilename,\n\tgetDebugLogFilename,\n} from \"../utils/debug-log.js\";\nimport {\n\tdeleteExecutionState,\n\tgetCurrentBranch,\n\tgetExecutionStateFilename,\n\thasWorkingTreeChanges,\n\tisCommitInBranch,\n\treadExecutionState,\n} from \"../utils/execution-state.js\";\n\nconst LOCK_FILENAME = \".gauntlet-run.lock\";\nconst SESSION_REF_FILENAME = \".session_ref\";\n\nexport interface AutoCleanResult {\n\tclean: boolean;\n\treason?: string;\n\tresetState?: boolean;\n}\n\n/**\n * Check if logs should be auto-cleaned based on execution context changes.\n * Returns { clean: true, reason, resetState } if context has changed.\n * Returns { clean: false } if context is unchanged or state file doesn't exist.\n * When resetState is true, the execution state should be deleted (not just logs).\n */\nexport async function shouldAutoClean(\n\tlogDir: string,\n\tbaseBranch: string,\n): Promise<AutoCleanResult> {\n\tconst state = await readExecutionState(logDir);\n\n\t// No state file = no auto-clean needed\n\tif (!state) {\n\t\treturn { clean: false };\n\t}\n\n\t// Check if branch changed\n\ttry {\n\t\tconst currentBranch = await getCurrentBranch();\n\t\tif (currentBranch !== state.branch) {\n\t\t\treturn { clean: true, reason: \"branch changed\", resetState: true };\n\t\t}\n\t} catch {\n\t\t// If we can't get the current branch, don't auto-clean\n\t\treturn { clean: false };\n\t}\n\n\t// Check if commit was merged into base branch.\n\t// Skip this check when the working tree has uncommitted changes (staged,\n\t// unstaged, or untracked). In that case, the execution state still holds\n\t// meaningful context and cleaning would destroy the retry counter and\n\t// narrowed diff capability.\n\t// Note: We use `git status --porcelain` instead of comparing working_tree_ref\n\t// vs commit because `git stash create --include-untracked` returns empty when\n\t// only untracked files exist, causing working_tree_ref to equal commit even\n\t// though the tree is dirty.\n\tconst hasChanges = await hasWorkingTreeChanges();\n\tif (!hasChanges) {\n\t\ttry {\n\t\t\tconst isMerged = await isCommitInBranch(state.commit, baseBranch);\n\t\t\tif (isMerged) {\n\t\t\t\treturn { clean: true, reason: \"commit merged\", resetState: true };\n\t\t\t}\n\t\t} catch {\n\t\t\t// If we can't check merge status, don't auto-clean\n\t\t}\n\t}\n\n\treturn { clean: false };\n}\n\n/**\n * Perform auto-clean with state reset if needed.\n */\nexport async function performAutoClean(\n\tlogDir: string,\n\tresult: AutoCleanResult,\n\tmaxPreviousLogs = 3,\n): Promise<void> {\n\tawait cleanLogs(logDir, maxPreviousLogs);\n\n\t// Delete execution state if context changed (branch changed or commit merged)\n\tif (result.resetState) {\n\t\tawait deleteExecutionState(logDir);\n\t}\n}\n\n/**\n * Get the lock filename constant.\n * Useful for checking lock status from other modules.\n */\nexport function getLockFilename(): string {\n\treturn LOCK_FILENAME;\n}\n\nexport async function exists(filePath: string): Promise<boolean> {\n\ttry {\n\t\tawait fs.stat(filePath);\n\t\treturn true;\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nexport async function acquireLock(logDir: string): Promise<void> {\n\tawait fs.mkdir(logDir, { recursive: true });\n\tconst lockPath = path.resolve(logDir, LOCK_FILENAME);\n\ttry {\n\t\tawait fs.writeFile(lockPath, String(process.pid), { flag: \"wx\" });\n\t} catch (err: unknown) {\n\t\tif (\n\t\t\ttypeof err === \"object\" &&\n\t\t\terr !== null &&\n\t\t\t\"code\" in err &&\n\t\t\t(err as { code: string }).code === \"EEXIST\"\n\t\t) {\n\t\t\tconsole.error(\n\t\t\t\t`Error: A gauntlet run is already in progress (lock file: ${lockPath}).`,\n\t\t\t);\n\t\t\tconsole.error(\n\t\t\t\t\"If no run is actually in progress, delete the lock file manually.\",\n\t\t\t);\n\t\t\tprocess.exit(1);\n\t\t}\n\t\tthrow err;\n\t}\n}\n\nexport async function releaseLock(logDir: string): Promise<void> {\n\tconst lockPath = path.resolve(logDir, LOCK_FILENAME);\n\ttry {\n\t\tawait fs.rm(lockPath, { force: true });\n\t} catch {\n\t\t// no-op if missing\n\t}\n}\n\nexport async function hasExistingLogs(logDir: string): Promise<boolean> {\n\ttry {\n\t\tconst entries = await fs.readdir(logDir);\n\t\treturn entries.some(\n\t\t\t(f) =>\n\t\t\t\t(f.endsWith(\".log\") || f.endsWith(\".json\")) &&\n\t\t\t\tf !== \"previous\" &&\n\t\t\t\t!f.startsWith(\"console.\") &&\n\t\t\t\t!f.startsWith(\".\"),\n\t\t);\n\t} catch {\n\t\treturn false;\n\t}\n}\n\n/**\n * Get the set of persistent files that should never be moved during clean.\n */\n/**\n * Marker file used by stop-hook to detect nested invocations.\n * Must match STOP_HOOK_MARKER_FILE in stop-hook.ts.\n */\nconst STOP_HOOK_MARKER_FILE = \".stop-hook-active\";\n\nfunction getPersistentFiles(): Set<string> {\n\treturn new Set([\n\t\tgetExecutionStateFilename(),\n\t\tgetDebugLogFilename(),\n\t\tgetDebugLogBackupFilename(),\n\t\tLOCK_FILENAME,\n\t\tSESSION_REF_FILENAME, // Will be deleted, not moved\n\t\tSTOP_HOOK_MARKER_FILE, // Cleaned up by stop-hook finally block, not cleanLogs\n\t]);\n}\n\n/**\n * Check if there are current logs to archive.\n * Returns true if there are .log or .json files in the log directory root.\n * Excludes persistent files (.execution_state, .debug.log, etc.)\n */\nasync function hasCurrentLogs(logDir: string): Promise<boolean> {\n\ttry {\n\t\tconst files = await fs.readdir(logDir);\n\t\tconst persistentFiles = getPersistentFiles();\n\t\treturn files.some(\n\t\t\t(f) =>\n\t\t\t\t(f.endsWith(\".log\") || f.endsWith(\".json\")) &&\n\t\t\t\tf !== \"previous\" &&\n\t\t\t\t!persistentFiles.has(f),\n\t\t);\n\t} catch {\n\t\treturn false;\n\t}\n}\n\n/** Get current log files (excludes previous dirs and persistent files). */\nfunction getCurrentLogFiles(files: string[]): string[] {\n\tconst persistentFiles = getPersistentFiles();\n\treturn files.filter(\n\t\t(file) => !file.startsWith(\"previous\") && !persistentFiles.has(file),\n\t);\n}\n\n/** Delete current logs without archiving (maxPreviousLogs === 0). */\nasync function deleteCurrentLogs(logDir: string): Promise<void> {\n\tconst files = await fs.readdir(logDir);\n\tawait Promise.all(\n\t\tgetCurrentLogFiles(files).map((file) =>\n\t\t\tfs.rm(path.join(logDir, file), { recursive: true, force: true }),\n\t\t),\n\t);\n}\n\n/** Rotate existing previous/ directories to make room for a new archive. */\nasync function rotatePreviousDirs(\n\tlogDir: string,\n\tmaxPreviousLogs: number,\n): Promise<void> {\n\tconst oldestSuffix = maxPreviousLogs - 1;\n\tconst oldestDir =\n\t\toldestSuffix === 0 ? \"previous\" : `previous.${oldestSuffix}`;\n\tconst oldestPath = path.join(logDir, oldestDir);\n\tif (await exists(oldestPath)) {\n\t\tawait fs.rm(oldestPath, { recursive: true, force: true });\n\t}\n\n\tfor (let i = oldestSuffix - 1; i >= 0; i--) {\n\t\tconst fromName = i === 0 ? \"previous\" : `previous.${i}`;\n\t\tconst toName = `previous.${i + 1}`;\n\t\tconst fromPath = path.join(logDir, fromName);\n\t\tconst toPath = path.join(logDir, toName);\n\t\tif (await exists(fromPath)) {\n\t\t\tawait fs.rename(fromPath, toPath);\n\t\t}\n\t}\n}\n\nexport async function cleanLogs(\n\tlogDir: string,\n\tmaxPreviousLogs = 3,\n): Promise<void> {\n\ttry {\n\t\tif (!(await exists(logDir))) return;\n\t\tif (!(await hasCurrentLogs(logDir))) return;\n\n\t\tif (maxPreviousLogs === 0) {\n\t\t\tawait deleteCurrentLogs(logDir);\n\t\t\treturn;\n\t\t}\n\n\t\tawait rotatePreviousDirs(logDir, maxPreviousLogs);\n\n\t\tconst previousDir = path.join(logDir, \"previous\");\n\t\tawait fs.mkdir(previousDir, { recursive: true });\n\n\t\tconst files = await fs.readdir(logDir);\n\t\tawait Promise.all(\n\t\t\tgetCurrentLogFiles(files).map((file) =>\n\t\t\t\tfs.rename(path.join(logDir, file), path.join(previousDir, file)),\n\t\t\t),\n\t\t);\n\n\t\t// Delete legacy .session_ref if it exists (migration cleanup)\n\t\ttry {\n\t\t\tawait fs.rm(path.join(logDir, SESSION_REF_FILENAME), { force: true });\n\t\t} catch {\n\t\t\t// Ignore errors\n\t\t}\n\t} catch (error) {\n\t\tconsole.warn(\n\t\t\t\"Failed to clean logs in\",\n\t\t\tlogDir,\n\t\t\t\":\",\n\t\t\terror instanceof Error ? error.message : error,\n\t\t);\n\t}\n}\n",
|
|
43
43
|
"import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport chalk from \"chalk\";\nimport YAML from \"yaml\";\nimport { loadCIConfig } from \"../../config/ci-loader.js\";\nimport type { CIConfig } from \"../../config/types.js\";\nimport workflowTemplate from \"../../templates/workflow.yml\" with {\n\ttype: \"text\",\n};\n\nexport async function initCI(): Promise<void> {\n\tconst workflowDir = path.join(process.cwd(), \".github\", \"workflows\");\n\tconst workflowPath = path.join(workflowDir, \"gauntlet.yml\");\n\tconst gauntletDir = path.join(process.cwd(), \".gauntlet\");\n\tconst ciConfigPath = path.join(gauntletDir, \"ci.yml\");\n\n\t// 1. Ensure .gauntlet/ci.yml exists\n\tif (!(await fileExists(ciConfigPath))) {\n\t\tconsole.log(chalk.yellow(\"Creating starter .gauntlet/ci.yml...\"));\n\t\tawait fs.mkdir(gauntletDir, { recursive: true });\n\t\tconst starterContent = `# CI Configuration for Agent Gauntlet\n# Define runtimes, services, and which checks to run in CI.\n\nruntimes:\n # ruby:\n # version: \"3.3\"\n # bundler_cache: true\n\nservices:\n # postgres:\n # image: postgres:16\n # ports: [\"5432:5432\"]\n\nsetup:\n # - name: Global Setup\n # run: echo \"Setting up...\"\n\nchecks:\n # - name: linter\n # requires_runtimes: [ruby]\n`;\n\t\tawait fs.writeFile(ciConfigPath, starterContent);\n\t} else {\n\t\tconsole.log(chalk.dim(\"Found existing .gauntlet/ci.yml\"));\n\t}\n\n\t// 2. Load CI config to get services\n\tlet ciConfig: CIConfig | undefined;\n\ttry {\n\t\tciConfig = await loadCIConfig();\n\t} catch (_e) {\n\t\tconsole.warn(\n\t\t\tchalk.yellow(\n\t\t\t\t\"Could not load CI config to inject services. Workflow will have no services defined.\",\n\t\t\t),\n\t\t);\n\t}\n\n\t// 3. Generate workflow file\n\tconsole.log(chalk.dim(`Generating ${workflowPath}...`));\n\tawait fs.mkdir(workflowDir, { recursive: true });\n\n\tlet templateContent = workflowTemplate;\n\n\t// Inject services\n\tif (ciConfig?.services && Object.keys(ciConfig.services).length > 0) {\n\t\tconst servicesYaml = YAML.stringify({ services: ciConfig.services });\n\t\t// Indent services\n\t\tconst indentedServices = servicesYaml\n\t\t\t.split(\"\\n\")\n\t\t\t.map((line) => (line.trim() ? ` ${line}` : line))\n\t\t\t.join(\"\\n\");\n\n\t\ttemplateContent = templateContent.replace(\n\t\t\t\" # Services will be injected here by agent-gauntlet\",\n\t\t\tindentedServices,\n\t\t);\n\t} else {\n\t\ttemplateContent = templateContent.replace(\n\t\t\t\" # Services will be injected here by agent-gauntlet\\n\",\n\t\t\t\"\",\n\t\t);\n\t}\n\n\tawait fs.writeFile(workflowPath, templateContent);\n\tconsole.log(chalk.green(\"Successfully generated GitHub Actions workflow!\"));\n}\n\nasync function fileExists(path: string): Promise<boolean> {\n\ttry {\n\t\tconst stat = await fs.stat(path);\n\t\treturn stat.isFile();\n\t} catch {\n\t\treturn false;\n\t}\n}\n",
|
|
44
44
|
"import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport YAML from \"yaml\";\nimport { ciConfigSchema } from \"./ci-schema.js\";\nimport type { CIConfig } from \"./types.js\";\n\nconst GAUNTLET_DIR = \".gauntlet\";\nconst CI_FILE = \"ci.yml\";\n\nexport async function loadCIConfig(\n\trootDir: string = process.cwd(),\n): Promise<CIConfig> {\n\tconst ciPath = path.join(rootDir, GAUNTLET_DIR, CI_FILE);\n\n\tif (!(await fileExists(ciPath))) {\n\t\tthrow new Error(\n\t\t\t`CI configuration file not found at ${ciPath}. Run 'agent-gauntlet ci init' to create it.`,\n\t\t);\n\t}\n\n\tconst content = await fs.readFile(ciPath, \"utf-8\");\n\tconst raw = YAML.parse(content);\n\treturn ciConfigSchema.parse(raw);\n}\n\nasync function fileExists(path: string): Promise<boolean> {\n\ttry {\n\t\tconst stat = await fs.stat(path);\n\t\treturn stat.isFile();\n\t} catch {\n\t\treturn false;\n\t}\n}\n",
|
|
45
45
|
"import { z } from \"zod\";\n\n// Runtime and service schemas use z.any() to allow flexibility for different CI providers\n// Each provider (GitHub Actions, GitLab CI, etc.) has its own configuration structure\nexport const runtimeConfigSchema = z.record(z.string(), z.any());\n\nexport const serviceConfigSchema = z.record(z.string(), z.any());\n\nexport const ciSetupStepSchema = z.object({\n\tname: z.string().min(1),\n\trun: z.string().min(1),\n\tworking_directory: z.string().optional(),\n\tif: z.string().optional(),\n});\n\nexport const ciCheckConfigSchema = z.object({\n\tname: z.string().min(1),\n\trequires_runtimes: z.array(z.string()).optional(),\n\trequires_services: z.array(z.string()).optional(),\n\tsetup: z.array(ciSetupStepSchema).optional(),\n});\n\nexport const ciConfigSchema = z.object({\n\truntimes: runtimeConfigSchema.nullable().optional(),\n\tservices: serviceConfigSchema.nullable().optional(),\n\tsetup: z.array(ciSetupStepSchema).nullable().optional(),\n\tchecks: z.array(ciCheckConfigSchema).nullable().optional(),\n});\n",
|
|
@@ -50,16 +50,19 @@
|
|
|
50
50
|
"import path from \"node:path\";\nimport chalk from \"chalk\";\nimport type { Command } from \"commander\";\nimport { getAdapter, getAllAdapters } from \"../cli-adapters/index.js\";\nimport { loadConfig } from \"../config/loader.js\";\nimport { validateConfig } from \"../config/validator.js\";\n\nexport function registerHealthCommand(program: Command): void {\n\tprogram\n\t\t.command(\"health\")\n\t\t.description(\"Check CLI tool availability\")\n\t\t.action(async () => {\n\t\t\t// 1. Config validation\n\t\t\tconsole.log(chalk.bold(\"Config validation:\"));\n\t\t\tconst validationResult = await validateConfig();\n\n\t\t\tif (validationResult.filesChecked.length === 0) {\n\t\t\t\tconsole.log(chalk.yellow(\" No config files found\"));\n\t\t\t} else {\n\t\t\t\t// List all files checked\n\t\t\t\tfor (const file of validationResult.filesChecked) {\n\t\t\t\t\tconst relativePath = path.relative(process.cwd(), file);\n\t\t\t\t\tconsole.log(chalk.dim(` ${relativePath}`));\n\t\t\t\t}\n\n\t\t\t\t// Show validation results\n\t\t\t\tif (validationResult.valid && validationResult.issues.length === 0) {\n\t\t\t\t\tconsole.log(chalk.green(\" ✓ All config files are valid\"));\n\t\t\t\t} else {\n\t\t\t\t\t// Group issues by file\n\t\t\t\t\tconst issuesByFile = new Map<\n\t\t\t\t\t\tstring,\n\t\t\t\t\t\ttypeof validationResult.issues\n\t\t\t\t\t>();\n\t\t\t\t\tfor (const issue of validationResult.issues) {\n\t\t\t\t\t\tconst relativeFile = path.relative(process.cwd(), issue.file);\n\t\t\t\t\t\tif (!issuesByFile.has(relativeFile)) {\n\t\t\t\t\t\t\tissuesByFile.set(relativeFile, []);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tissuesByFile.get(relativeFile)?.push(issue);\n\t\t\t\t\t}\n\n\t\t\t\t\t// Display issues\n\t\t\t\t\tfor (const [file, issues] of issuesByFile.entries()) {\n\t\t\t\t\t\tfor (const issue of issues) {\n\t\t\t\t\t\t\tconst icon =\n\t\t\t\t\t\t\t\tissue.severity === \"error\" ? chalk.red(\"✗\") : chalk.yellow(\"⚠\");\n\t\t\t\t\t\t\tconst fieldInfo = issue.field\n\t\t\t\t\t\t\t\t? chalk.dim(` (${issue.field})`)\n\t\t\t\t\t\t\t\t: \"\";\n\t\t\t\t\t\t\tconsole.log(` ${icon} ${file}${fieldInfo}`);\n\t\t\t\t\t\t\tconsole.log(` ${issue.message}`);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconsole.log();\n\n\t\t\t// 2. CLI Tool Health Check\n\t\t\tconsole.log(chalk.bold(\"CLI Tool Health Check:\"));\n\n\t\t\ttry {\n\t\t\t\tconst config = await loadConfig();\n\n\t\t\t\t// Check for reviews configuration\n\t\t\t\tconst reviewEntries = Object.entries(config.reviews);\n\n\t\t\t\tif (reviewEntries.length === 0) {\n\t\t\t\t\tconsole.log(chalk.yellow(\" No CLI tools configured\"));\n\t\t\t\t\tconsole.log(\n\t\t\t\t\t\tchalk.dim(\n\t\t\t\t\t\t\t\" No review gates found. Add review gates with cli_preference to check tool availability.\",\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Collect all unique agent names from review gate cli_preference settings\n\t\t\t\tconst preferredAgents = new Set<string>();\n\t\t\t\tconst reviewsWithEmptyPreference: string[] = [];\n\n\t\t\t\treviewEntries.forEach(([reviewName, review]) => {\n\t\t\t\t\tif (!review.cli_preference || review.cli_preference.length === 0) {\n\t\t\t\t\t\treviewsWithEmptyPreference.push(reviewName);\n\t\t\t\t\t} else {\n\t\t\t\t\t\treview.cli_preference.forEach((agent) => {\n\t\t\t\t\t\t\tpreferredAgents.add(agent);\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\t// Report Empty Preferences (Loader should handle this via default merging, but good to check)\n\t\t\t\tif (reviewsWithEmptyPreference.length > 0) {\n\t\t\t\t\tconsole.log(chalk.yellow(\" ⚠️ Misconfiguration detected:\"));\n\t\t\t\t\treviewsWithEmptyPreference.forEach((name) => {\n\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\tchalk.yellow(\n\t\t\t\t\t\t\t\t` Review gate \"${name}\" has empty cli_preference`,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\t\t\t\t\t});\n\t\t\t\t\tconsole.log();\n\t\t\t\t}\n\n\t\t\t\t// If no agents are configured, show message\n\t\t\t\tif (preferredAgents.size === 0) {\n\t\t\t\t\tconsole.log(chalk.yellow(\" No CLI tools configured\"));\n\t\t\t\t\tconsole.log(\n\t\t\t\t\t\tchalk.dim(\n\t\t\t\t\t\t\t\" All review gates have empty cli_preference. Add tools to cli_preference to check availability.\",\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Check the configured agents\n\t\t\t\tfor (const agentName of Array.from(preferredAgents).sort()) {\n\t\t\t\t\tconst adapter = getAdapter(agentName);\n\t\t\t\t\tif (adapter) {\n\t\t\t\t\t\tconst health = await adapter.checkHealth();\n\t\t\t\t\t\tlet statusStr = \"\";\n\n\t\t\t\t\t\tswitch (health.status) {\n\t\t\t\t\t\t\tcase \"healthy\":\n\t\t\t\t\t\t\t\tstatusStr = chalk.green(\"Installed\");\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase \"missing\":\n\t\t\t\t\t\t\t\tstatusStr = chalk.red(\"Missing\");\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase \"unhealthy\":\n\t\t\t\t\t\t\t\tstatusStr = chalk.red(`${health.message || \"Unhealthy\"}`);\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconsole.log(` ${adapter.name.padEnd(10)} : ${statusStr}`);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\t` ${agentName.padEnd(10)} : ${chalk.yellow(\"Unknown\")}`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} catch (_error: unknown) {\n\t\t\t\t// If config can't be loaded, fall back to checking all adapters\n\t\t\t\tconst adapters = getAllAdapters();\n\t\t\t\tconsole.log(\n\t\t\t\t\tchalk.dim(\" (Config not found, checking all supported agents)\"),\n\t\t\t\t);\n\n\t\t\t\tfor (const adapter of adapters) {\n\t\t\t\t\tconst health = await adapter.checkHealth();\n\t\t\t\t\tlet statusStr = \"\";\n\n\t\t\t\t\tswitch (health.status) {\n\t\t\t\t\t\tcase \"healthy\":\n\t\t\t\t\t\t\tstatusStr = chalk.green(\"Installed\");\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \"missing\":\n\t\t\t\t\t\t\tstatusStr = chalk.red(\"Missing\");\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \"unhealthy\":\n\t\t\t\t\t\t\tstatusStr = chalk.red(`${health.message || \"Unhealthy\"}`);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tconsole.log(` ${adapter.name.padEnd(10)} : ${statusStr}`);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n}\n",
|
|
51
51
|
"import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport matter from \"gray-matter\";\nimport YAML from \"yaml\";\nimport { ZodError } from \"zod\";\nimport { getValidCLITools } from \"../cli-adapters/index.js\";\nimport {\n\tcheckGateSchema,\n\tentryPointSchema,\n\tgauntletConfigSchema,\n\treviewPromptFrontmatterSchema,\n\treviewYamlSchema,\n} from \"./schema.js\";\nimport type {\n\tCheckGateConfig,\n\tGauntletConfig,\n\tReviewPromptFrontmatter,\n} from \"./types.js\";\n\nconst GAUNTLET_DIR = \".gauntlet\";\nconst CONFIG_FILE = \"config.yml\";\nconst CHECKS_DIR = \"checks\";\nconst REVIEWS_DIR = \"reviews\";\n\nexport interface ValidationIssue {\n\tfile: string;\n\tseverity: \"error\" | \"warning\";\n\tmessage: string;\n\tfield?: string;\n}\n\nexport interface ValidationResult {\n\tvalid: boolean;\n\tissues: ValidationIssue[];\n\tfilesChecked: string[];\n}\n\nexport async function validateConfig(\n\trootDir: string = process.cwd(),\n): Promise<ValidationResult> {\n\tconst issues: ValidationIssue[] = [];\n\tconst filesChecked: string[] = [];\n\tconst gauntletPath = path.join(rootDir, GAUNTLET_DIR);\n\tconst existingCheckNames = new Set<string>(); // Track all check files that exist (even if invalid)\n\tconst existingReviewNames = new Set<string>(); // Track all review files that exist (even if invalid)\n\n\t// 1. Validate project config\n\tconst configPath = path.join(gauntletPath, CONFIG_FILE);\n\tlet projectConfig: GauntletConfig | null = null;\n\tconst checks: Record<string, CheckGateConfig> = {};\n\tconst reviews: Record<string, ReviewPromptFrontmatter> = {};\n\tconst reviewSourceFiles: Record<string, string> = {}; // reviewName -> filePath\n\n\ttry {\n\t\tif (await fileExists(configPath)) {\n\t\t\tfilesChecked.push(configPath);\n\t\t\tconst configContent = await fs.readFile(configPath, \"utf-8\");\n\t\t\ttry {\n\t\t\t\tconst raw = YAML.parse(configContent);\n\t\t\t\tprojectConfig = gauntletConfigSchema.parse(raw);\n\t\t\t} catch (error: unknown) {\n\t\t\t\tif (error instanceof ZodError) {\n\t\t\t\t\terror.issues.forEach((err) => {\n\t\t\t\t\t\tissues.push({\n\t\t\t\t\t\t\tfile: configPath,\n\t\t\t\t\t\t\tseverity: \"error\",\n\t\t\t\t\t\t\tmessage: err.message,\n\t\t\t\t\t\t\tfield: err.path.join(\".\"),\n\t\t\t\t\t\t});\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tconst err = error as { name?: string; message?: string };\n\t\t\t\t\tif (err.name === \"YAMLSyntaxError\" || err.message?.includes(\"YAML\")) {\n\t\t\t\t\t\tissues.push({\n\t\t\t\t\t\t\tfile: configPath,\n\t\t\t\t\t\t\tseverity: \"error\",\n\t\t\t\t\t\t\tmessage: `Malformed YAML: ${err.message}`,\n\t\t\t\t\t\t});\n\t\t\t\t\t} else {\n\t\t\t\t\t\tissues.push({\n\t\t\t\t\t\t\tfile: configPath,\n\t\t\t\t\t\t\tseverity: \"error\",\n\t\t\t\t\t\t\tmessage: `Parse error: ${err.message}`,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tissues.push({\n\t\t\t\tfile: configPath,\n\t\t\t\tseverity: \"error\",\n\t\t\t\tmessage: \"Config file not found\",\n\t\t\t});\n\t\t}\n\t} catch (error: unknown) {\n\t\tconst err = error as { message?: string };\n\t\tissues.push({\n\t\t\tfile: configPath,\n\t\t\tseverity: \"error\",\n\t\t\tmessage: `Error reading file: ${err.message}`,\n\t\t});\n\t}\n\n\t// 2. Validate check gates\n\tconst checksPath = path.join(gauntletPath, CHECKS_DIR);\n\tif (await dirExists(checksPath)) {\n\t\ttry {\n\t\t\tconst checkFiles = await fs.readdir(checksPath);\n\t\t\tfor (const file of checkFiles) {\n\t\t\t\tif (file.endsWith(\".yml\") || file.endsWith(\".yaml\")) {\n\t\t\t\t\tconst filePath = path.join(checksPath, file);\n\t\t\t\t\tfilesChecked.push(filePath);\n\t\t\t\t\tconst name = path.basename(file, path.extname(file));\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst content = await fs.readFile(filePath, \"utf-8\");\n\t\t\t\t\t\tconst raw = YAML.parse(content);\n\t\t\t\t\t\tconst parsed = checkGateSchema.parse(raw);\n\t\t\t\t\t\texistingCheckNames.add(name); // Track that this check exists\n\t\t\t\t\t\tchecks[name] = parsed;\n\n\t\t\t\t\t\t// Semantic validation\n\t\t\t\t\t\tif (!parsed.command || parsed.command.trim() === \"\") {\n\t\t\t\t\t\t\tissues.push({\n\t\t\t\t\t\t\t\tfile: filePath,\n\t\t\t\t\t\t\t\tseverity: \"error\",\n\t\t\t\t\t\t\t\tmessage: \"command field is required and cannot be empty\",\n\t\t\t\t\t\t\t\tfield: \"command\",\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t} catch (error: unknown) {\n\t\t\t\t\t\t// Track that this check file exists even if parsing failed\n\t\t\t\t\t\t// Use filename-based name since name is no longer in YAML\n\t\t\t\t\t\texistingCheckNames.add(name);\n\t\t\t\t\t\tif (error instanceof ZodError) {\n\t\t\t\t\t\t\terror.issues.forEach((err) => {\n\t\t\t\t\t\t\t\tissues.push({\n\t\t\t\t\t\t\t\t\tfile: filePath,\n\t\t\t\t\t\t\t\t\tseverity: \"error\",\n\t\t\t\t\t\t\t\t\tmessage: err.message,\n\t\t\t\t\t\t\t\t\tfield: err.path.join(\".\"),\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tconst err = error as { name?: string; message?: string };\n\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\terr.name === \"YAMLSyntaxError\" ||\n\t\t\t\t\t\t\t\terr.message?.includes(\"YAML\")\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\tissues.push({\n\t\t\t\t\t\t\t\t\tfile: filePath,\n\t\t\t\t\t\t\t\t\tseverity: \"error\",\n\t\t\t\t\t\t\t\t\tmessage: `Malformed YAML: ${err.message}`,\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tissues.push({\n\t\t\t\t\t\t\t\t\tfile: filePath,\n\t\t\t\t\t\t\t\t\tseverity: \"error\",\n\t\t\t\t\t\t\t\t\tmessage: `Parse error: ${err.message}`,\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (error: unknown) {\n\t\t\tconst err = error as { message?: string };\n\t\t\tissues.push({\n\t\t\t\tfile: checksPath,\n\t\t\t\tseverity: \"error\",\n\t\t\t\tmessage: `Error reading checks directory: ${err.message}`,\n\t\t\t});\n\t\t}\n\t}\n\n\t// 3. Validate review gates\n\tconst reviewsPath = path.join(gauntletPath, REVIEWS_DIR);\n\tif (await dirExists(reviewsPath)) {\n\t\ttry {\n\t\t\tconst reviewFiles = await fs.readdir(reviewsPath);\n\n\t\t\t// Detect duplicate names across formats\n\t\t\tconst reviewNameSources = new Map<string, string[]>();\n\t\t\tfor (const file of reviewFiles) {\n\t\t\t\tif (\n\t\t\t\t\tfile.endsWith(\".md\") ||\n\t\t\t\t\tfile.endsWith(\".yml\") ||\n\t\t\t\t\tfile.endsWith(\".yaml\")\n\t\t\t\t) {\n\t\t\t\t\tconst name = path.basename(file, path.extname(file));\n\t\t\t\t\tconst sources = reviewNameSources.get(name) || [];\n\t\t\t\t\tsources.push(file);\n\t\t\t\t\treviewNameSources.set(name, sources);\n\t\t\t\t}\n\t\t\t}\n\t\t\tfor (const [name, sources] of reviewNameSources) {\n\t\t\t\tif (sources.length > 1) {\n\t\t\t\t\tissues.push({\n\t\t\t\t\t\tfile: reviewsPath,\n\t\t\t\t\t\tseverity: \"error\",\n\t\t\t\t\t\tmessage: `Duplicate review name \"${name}\" found across files: ${sources.join(\", \")}`,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor (const file of reviewFiles) {\n\t\t\t\tif (file.endsWith(\".md\")) {\n\t\t\t\t\tconst filePath = path.join(reviewsPath, file);\n\t\t\t\t\tconst reviewName = path.basename(file, \".md\");\n\t\t\t\t\texistingReviewNames.add(reviewName);\n\t\t\t\t\tfilesChecked.push(filePath);\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst content = await fs.readFile(filePath, \"utf-8\");\n\t\t\t\t\t\tconst { data: frontmatter, content: _promptBody } = matter(content);\n\n\t\t\t\t\t\tif (!frontmatter || Object.keys(frontmatter).length === 0) {\n\t\t\t\t\t\t\tissues.push({\n\t\t\t\t\t\t\t\tfile: filePath,\n\t\t\t\t\t\t\t\tseverity: \"error\",\n\t\t\t\t\t\t\t\tmessage: \"Review gate must have YAML frontmatter\",\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tvalidateCliPreferenceTools(frontmatter, filePath, issues);\n\n\t\t\t\t\t\tconst parsedFrontmatter =\n\t\t\t\t\t\t\treviewPromptFrontmatterSchema.parse(frontmatter);\n\t\t\t\t\t\tconst name = path.basename(file, \".md\");\n\t\t\t\t\t\treviews[name] = parsedFrontmatter;\n\t\t\t\t\t\treviewSourceFiles[name] = filePath;\n\n\t\t\t\t\t\tvalidateReviewSemantics(parsedFrontmatter, filePath, issues);\n\t\t\t\t\t} catch (error: unknown) {\n\t\t\t\t\t\thandleReviewValidationError(error, filePath, issues);\n\t\t\t\t\t}\n\t\t\t\t} else if (file.endsWith(\".yml\") || file.endsWith(\".yaml\")) {\n\t\t\t\t\tconst filePath = path.join(reviewsPath, file);\n\t\t\t\t\tconst reviewName = path.basename(file, path.extname(file));\n\t\t\t\t\texistingReviewNames.add(reviewName);\n\t\t\t\t\tfilesChecked.push(filePath);\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst content = await fs.readFile(filePath, \"utf-8\");\n\t\t\t\t\t\tconst raw = YAML.parse(content);\n\n\t\t\t\t\t\tvalidateCliPreferenceTools(raw, filePath, issues);\n\n\t\t\t\t\t\tconst parsed = reviewYamlSchema.parse(raw);\n\t\t\t\t\t\treviews[reviewName] = parsed;\n\t\t\t\t\t\treviewSourceFiles[reviewName] = filePath;\n\n\t\t\t\t\t\tvalidateReviewSemantics(parsed, filePath, issues);\n\t\t\t\t\t} catch (error: unknown) {\n\t\t\t\t\t\thandleReviewValidationError(error, filePath, issues);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (error: unknown) {\n\t\t\tconst err = error as { message?: string };\n\t\t\tissues.push({\n\t\t\t\tfile: reviewsPath,\n\t\t\t\tseverity: \"error\",\n\t\t\t\tmessage: `Error reading reviews directory: ${\n\t\t\t\t\terr.message || String(error)\n\t\t\t\t}`,\n\t\t\t});\n\t\t}\n\t}\n\n\t// 4. Cross-reference validation (entry points referencing gates)\n\tif (projectConfig?.entry_points) {\n\t\tfor (let i = 0; i < projectConfig.entry_points.length; i++) {\n\t\t\t// biome-ignore lint/style/noNonNullAssertion: index within bounds\n\t\t\tconst entryPoint = projectConfig.entry_points[i]!;\n\t\t\tconst entryPointPath = `entry_points[${i}]`;\n\n\t\t\t// Validate entry point schema\n\t\t\ttry {\n\t\t\t\tentryPointSchema.parse(entryPoint);\n\t\t\t} catch (error: unknown) {\n\t\t\t\tif (error instanceof ZodError) {\n\t\t\t\t\terror.issues.forEach((err) => {\n\t\t\t\t\t\tissues.push({\n\t\t\t\t\t\t\tfile: configPath,\n\t\t\t\t\t\t\tseverity: \"error\",\n\t\t\t\t\t\t\tmessage: err.message,\n\t\t\t\t\t\t\tfield: `${entryPointPath}.${err.path.join(\".\")}`,\n\t\t\t\t\t\t});\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Check referenced checks exist\n\t\t\tif (entryPoint.checks) {\n\t\t\t\tfor (const checkName of entryPoint.checks) {\n\t\t\t\t\t// Only report as \"non-existent\" if the file doesn't exist at all\n\t\t\t\t\t// If the file exists but has validation errors, those are already reported\n\t\t\t\t\tif (!existingCheckNames.has(checkName)) {\n\t\t\t\t\t\tissues.push({\n\t\t\t\t\t\t\tfile: configPath,\n\t\t\t\t\t\t\tseverity: \"error\",\n\t\t\t\t\t\t\tmessage: `Entry point references non-existent check gate: \"${checkName}\"`,\n\t\t\t\t\t\t\tfield: `${entryPointPath}.checks`,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\t// If the check file exists but wasn't successfully parsed (has errors),\n\t\t\t\t\t// we don't report it here - the validation errors for that file are already shown\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Check referenced reviews exist\n\t\t\tif (entryPoint.reviews) {\n\t\t\t\tfor (const reviewName of entryPoint.reviews) {\n\t\t\t\t\t// Only report as \"non-existent\" if the file doesn't exist at all\n\t\t\t\t\t// If the file exists but has validation errors, those are already reported\n\t\t\t\t\tif (!existingReviewNames.has(reviewName)) {\n\t\t\t\t\t\tissues.push({\n\t\t\t\t\t\t\tfile: configPath,\n\t\t\t\t\t\t\tseverity: \"error\",\n\t\t\t\t\t\t\tmessage: `Entry point references non-existent review gate: \"${reviewName}\"`,\n\t\t\t\t\t\t\tfield: `${entryPointPath}.reviews`,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\t// If the review file exists but wasn't successfully parsed (has errors),\n\t\t\t\t\t// we don't report it here - the validation errors for that file are already shown\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Validate entry point has at least one gate\n\t\t\tif (\n\t\t\t\t(!entryPoint.checks || entryPoint.checks.length === 0) &&\n\t\t\t\t(!entryPoint.reviews || entryPoint.reviews.length === 0)\n\t\t\t) {\n\t\t\t\tissues.push({\n\t\t\t\t\tfile: configPath,\n\t\t\t\t\tseverity: \"warning\",\n\t\t\t\t\tmessage: `Entry point at \"${entryPoint.path}\" has no checks or reviews configured`,\n\t\t\t\t\tfield: `${entryPointPath}`,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// Validate path format (basic check)\n\t\t\tif (!entryPoint.path || entryPoint.path.trim() === \"\") {\n\t\t\t\tissues.push({\n\t\t\t\t\tfile: configPath,\n\t\t\t\t\tseverity: \"error\",\n\t\t\t\t\tmessage: \"Entry point path cannot be empty\",\n\t\t\t\t\tfield: `${entryPointPath}.path`,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\t// 5. Validate project-level config values\n\tif (projectConfig) {\n\t\tif (\n\t\t\tprojectConfig.log_dir !== undefined &&\n\t\t\tprojectConfig.log_dir.trim() === \"\"\n\t\t) {\n\t\t\tissues.push({\n\t\t\t\tfile: configPath,\n\t\t\t\tseverity: \"error\",\n\t\t\t\tmessage: \"log_dir cannot be empty\",\n\t\t\t\tfield: \"log_dir\",\n\t\t\t});\n\t\t}\n\n\t\tif (\n\t\t\tprojectConfig.base_branch !== undefined &&\n\t\t\tprojectConfig.base_branch.trim() === \"\"\n\t\t) {\n\t\t\tissues.push({\n\t\t\t\tfile: configPath,\n\t\t\t\tseverity: \"error\",\n\t\t\t\tmessage: \"base_branch cannot be empty\",\n\t\t\t\tfield: \"base_branch\",\n\t\t\t});\n\t\t}\n\n\t\tif (\n\t\t\tprojectConfig.entry_points === undefined ||\n\t\t\tprojectConfig.entry_points.length === 0\n\t\t) {\n\t\t\tissues.push({\n\t\t\t\tfile: configPath,\n\t\t\t\tseverity: \"error\",\n\t\t\t\tmessage: \"entry_points is required and cannot be empty\",\n\t\t\t\tfield: \"entry_points\",\n\t\t\t});\n\t\t}\n\n\t\t// Validate CLI config\n\t\tif (projectConfig.cli) {\n\t\t\tconst defaults = projectConfig.cli.default_preference;\n\t\t\tif (!defaults || !Array.isArray(defaults) || defaults.length === 0) {\n\t\t\t\tissues.push({\n\t\t\t\t\tfile: configPath,\n\t\t\t\t\tseverity: \"error\",\n\t\t\t\t\tmessage: \"cli.default_preference is required and cannot be empty\",\n\t\t\t\t\tfield: \"cli.default_preference\",\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\t// Validate defaults are valid tools\n\t\t\t\tfor (let i = 0; i < defaults.length; i++) {\n\t\t\t\t\tconst toolName = defaults[i] as string;\n\t\t\t\t\tif (!getValidCLITools().includes(toolName)) {\n\t\t\t\t\t\tissues.push({\n\t\t\t\t\t\t\tfile: configPath,\n\t\t\t\t\t\t\tseverity: \"error\",\n\t\t\t\t\t\t\tmessage: `Invalid CLI tool \"${toolName}\" in default_preference. Valid options are: ${getValidCLITools().join(\", \")}`,\n\t\t\t\t\t\t\tfield: `cli.default_preference[${i}]`,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Validate review preferences against defaults\n\t\t\t\tconst allowedTools = new Set(defaults);\n\t\t\t\tfor (const [reviewName, reviewConfig] of Object.entries(reviews)) {\n\t\t\t\t\tconst pref = reviewConfig.cli_preference;\n\t\t\t\t\tif (pref && Array.isArray(pref)) {\n\t\t\t\t\t\tconst reviewFile =\n\t\t\t\t\t\t\treviewSourceFiles[reviewName] ||\n\t\t\t\t\t\t\tpath.join(reviewsPath, `${reviewName}.md`);\n\t\t\t\t\t\tfor (let i = 0; i < pref.length; i++) {\n\t\t\t\t\t\t\tconst tool = pref[i] as string;\n\t\t\t\t\t\t\tif (!allowedTools.has(tool)) {\n\t\t\t\t\t\t\t\tissues.push({\n\t\t\t\t\t\t\t\t\tfile: reviewFile,\n\t\t\t\t\t\t\t\t\tseverity: \"error\",\n\t\t\t\t\t\t\t\t\tmessage: `CLI tool \"${tool}\" is not in project-level default_preference. Review gates can only use tools enabled in config.yml`,\n\t\t\t\t\t\t\t\t\tfield: `cli_preference[${i}]`,\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tconst valid = issues.filter((i) => i.severity === \"error\").length === 0;\n\treturn { valid, issues, filesChecked };\n}\n\nfunction validateCliPreferenceTools(\n\tdata: Record<string, unknown>,\n\tfilePath: string,\n\tissues: ValidationIssue[],\n): void {\n\tif (data.cli_preference && Array.isArray(data.cli_preference)) {\n\t\tfor (let i = 0; i < data.cli_preference.length; i++) {\n\t\t\tconst toolName = data.cli_preference[i];\n\t\t\tif (\n\t\t\t\ttypeof toolName === \"string\" &&\n\t\t\t\t!getValidCLITools().includes(toolName)\n\t\t\t) {\n\t\t\t\tissues.push({\n\t\t\t\t\tfile: filePath,\n\t\t\t\t\tseverity: \"error\",\n\t\t\t\t\tmessage: `Invalid CLI tool \"${toolName}\" in cli_preference. Valid options are: ${getValidCLITools().join(\", \")}`,\n\t\t\t\t\tfield: `cli_preference[${i}]`,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction validateReviewSemantics(\n\tparsed: { cli_preference?: string[]; num_reviews?: number; timeout?: number },\n\tfilePath: string,\n\tissues: ValidationIssue[],\n): void {\n\tif (parsed.cli_preference !== undefined) {\n\t\tif (parsed.cli_preference.length === 0) {\n\t\t\tissues.push({\n\t\t\t\tfile: filePath,\n\t\t\t\tseverity: \"error\",\n\t\t\t\tmessage:\n\t\t\t\t\t\"cli_preference if provided cannot be an empty array. Remove it to use defaults.\",\n\t\t\t\tfield: \"cli_preference\",\n\t\t\t});\n\t\t} else {\n\t\t\tfor (let i = 0; i < parsed.cli_preference.length; i++) {\n\t\t\t\tconst toolName = parsed.cli_preference[i] as string;\n\t\t\t\tif (!getValidCLITools().includes(toolName)) {\n\t\t\t\t\tissues.push({\n\t\t\t\t\t\tfile: filePath,\n\t\t\t\t\t\tseverity: \"error\",\n\t\t\t\t\t\tmessage: `Invalid CLI tool \"${toolName}\" in cli_preference. Valid options are: ${getValidCLITools().join(\", \")}`,\n\t\t\t\t\t\tfield: `cli_preference[${i}]`,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tif (parsed.num_reviews !== undefined && parsed.num_reviews < 1) {\n\t\tissues.push({\n\t\t\tfile: filePath,\n\t\t\tseverity: \"error\",\n\t\t\tmessage: \"num_reviews must be at least 1\",\n\t\t\tfield: \"num_reviews\",\n\t\t});\n\t}\n\n\tif (parsed.timeout !== undefined && parsed.timeout <= 0) {\n\t\tissues.push({\n\t\t\tfile: filePath,\n\t\t\tseverity: \"error\",\n\t\t\tmessage: \"timeout must be greater than 0\",\n\t\t\tfield: \"timeout\",\n\t\t});\n\t}\n}\n\nfunction handleReviewValidationError(\n\terror: unknown,\n\tfilePath: string,\n\tissues: ValidationIssue[],\n): void {\n\tif (error instanceof ZodError) {\n\t\terror.issues.forEach((err) => {\n\t\t\tconst fieldPath =\n\t\t\t\terr.path && Array.isArray(err.path) ? err.path.join(\".\") : undefined;\n\t\t\tconst message =\n\t\t\t\terr.message || `Invalid value for ${fieldPath || \"field\"}`;\n\t\t\tissues.push({\n\t\t\t\tfile: filePath,\n\t\t\t\tseverity: \"error\",\n\t\t\t\tmessage,\n\t\t\t\tfield: fieldPath,\n\t\t\t});\n\t\t});\n\t} else {\n\t\tconst err = error as { name?: string; message?: string };\n\t\tif (err.name === \"YAMLSyntaxError\" || err.message?.includes(\"YAML\")) {\n\t\t\tissues.push({\n\t\t\t\tfile: filePath,\n\t\t\t\tseverity: \"error\",\n\t\t\t\tmessage: `Malformed YAML: ${err.message || \"Unknown YAML error\"}`,\n\t\t\t});\n\t\t} else {\n\t\t\tconst errorMessage = err.message || String(error);\n\t\t\ttry {\n\t\t\t\tconst parsed = JSON.parse(errorMessage);\n\t\t\t\tif (Array.isArray(parsed)) {\n\t\t\t\t\tparsed.forEach((err: { path: string[]; message: string }) => {\n\t\t\t\t\t\tconst fieldPath =\n\t\t\t\t\t\t\terr.path && Array.isArray(err.path)\n\t\t\t\t\t\t\t\t? err.path.join(\".\")\n\t\t\t\t\t\t\t\t: undefined;\n\t\t\t\t\t\tissues.push({\n\t\t\t\t\t\t\tfile: filePath,\n\t\t\t\t\t\t\tseverity: \"error\",\n\t\t\t\t\t\t\tmessage:\n\t\t\t\t\t\t\t\terr.message || `Invalid value for ${fieldPath || \"field\"}`,\n\t\t\t\t\t\t\tfield: fieldPath,\n\t\t\t\t\t\t});\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tissues.push({\n\t\t\t\t\t\tfile: filePath,\n\t\t\t\t\t\tseverity: \"error\",\n\t\t\t\t\t\tmessage: errorMessage,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t} catch {\n\t\t\t\tissues.push({\n\t\t\t\t\tfile: filePath,\n\t\t\t\t\tseverity: \"error\",\n\t\t\t\t\tmessage: errorMessage,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n}\n\nasync function fileExists(path: string): Promise<boolean> {\n\ttry {\n\t\tconst stat = await fs.stat(path);\n\t\treturn stat.isFile();\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nasync function dirExists(path: string): Promise<boolean> {\n\ttry {\n\t\tconst stat = await fs.stat(path);\n\t\treturn stat.isDirectory();\n\t} catch {\n\t\treturn false;\n\t}\n}\n",
|
|
52
52
|
"import chalk from \"chalk\";\nimport type { Command } from \"commander\";\n\nexport function registerHelpCommand(program: Command): void {\n\tprogram\n\t\t.command(\"help\")\n\t\t.description(\"Show help information\")\n\t\t.action(() => {\n\t\t\tconsole.log(chalk.bold(\"Agent Gauntlet - AI-assisted quality gates\\n\"));\n\t\t\tconsole.log(\n\t\t\t\t\"Agent Gauntlet runs quality gates (checks + AI reviews) for only the parts\",\n\t\t\t);\n\t\t\tconsole.log(\n\t\t\t\t\"of your repo that changed, based on a configurable set of entry points.\\n\",\n\t\t\t);\n\t\t\tconsole.log(chalk.bold(\"Commands:\\n\"));\n\t\t\tconsole.log(\" run Run gates for detected changes\");\n\t\t\tconsole.log(\" check Run only applicable checks\");\n\t\t\tconsole.log(\" review Run only applicable reviews\");\n\t\t\tconsole.log(\" clean Archive logs (move current logs into previous/)\");\n\t\t\tconsole.log(\n\t\t\t\t\" detect Show what gates would run (without executing them)\",\n\t\t\t);\n\t\t\tconsole.log(\" list List configured gates\");\n\t\t\tconsole.log(\" health Check CLI tool availability\");\n\t\t\tconsole.log(\" init Initialize .gauntlet configuration\");\n\t\t\tconsole.log(\" ci CI integration commands (init, list-jobs)\");\n\t\t\tconsole.log(\" help Show this help message\\n\");\n\t\t\tconsole.log(\n\t\t\t\t\"For more information, see: https://github.com/your-repo/agent-gauntlet\",\n\t\t\t);\n\t\t\tconsole.log(\"Or run: agent-gauntlet <command> --help\");\n\t\t});\n}\n",
|
|
53
|
-
"import { readFileSync } from \"node:fs\";\nimport fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport chalk from \"chalk\";\nimport type { Command } from \"commander\";\nimport { type CLIAdapter, getAllAdapters } from \"../cli-adapters/index.js\";\nimport { exists } from \"./shared.js\";\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\n\nfunction readSkillTemplate(filename: string): string {\n\tconst templatePath = path.join(__dirname, \"skill-templates\", filename);\n\treturn readFileSync(templatePath, \"utf-8\");\n}\n\nconst CLI_PREFERENCE_ORDER = [\n\t\"codex\",\n\t\"claude\",\n\t\"cursor\",\n\t\"github-copilot\",\n\t\"gemini\",\n];\n\n// Recommended adapter config: https://github.com/pacaplan/agent-gauntlet/blob/main/docs/eval-results.md\ntype AdapterCfg = { allow_tool_use: boolean; thinking_budget: string };\nconst ADAPTER_CONFIG: Record<string, AdapterCfg> = {\n\tclaude: { allow_tool_use: false, thinking_budget: \"high\" },\n\tcodex: { allow_tool_use: false, thinking_budget: \"low\" },\n\tgemini: { allow_tool_use: false, thinking_budget: \"low\" },\n};\n\n// --- Skill content templates ---\n// These are used for both skills (Claude) and flat commands (other agents).\n// The frontmatter fields (name, disable-model-invocation) are only meaningful\n// for skills but are harmless in flat command files.\n\n/**\n * Build gauntlet run/check skill content. Shared structure avoids duplication\n * between the \"run\" and \"check\" skills.\n */\nfunction buildGauntletSkillContent(mode: \"run\" | \"check\"): string {\n\tconst isRun = mode === \"run\";\n\tconst name = isRun ? \"run\" : \"check\";\n\tconst description = isRun\n\t\t? \"Run the full verification gauntlet\"\n\t\t: \"Run checks only (no reviews)\";\n\tconst command = isRun ? \"agent-gauntlet run\" : \"agent-gauntlet check\";\n\tconst heading = isRun\n\t\t? \"Execute the autonomous verification suite.\"\n\t\t: \"Run the gauntlet checks only \\u2014 no AI reviews.\";\n\n\tconst frontmatter = `---\nname: gauntlet-${name}\ndescription: ${description}\ndisable-model-invocation: true\nallowed-tools: Bash\n---`;\n\n\t// Common prefix: archive old logs, then run the command\n\tconst steps = [\n\t\t`1. Run \\`agent-gauntlet clean\\` to archive any previous log files`,\n\t\t`2. Run \\`${command}\\``,\n\t];\n\n\tif (isRun) {\n\t\tsteps.push(\n\t\t\t`3. If it fails:\n - Identify the failed gates from the console output.\n - For CHECK failures: Read the \\`.log\\` file path provided in the output. If the log contains a \\`--- Fix Instructions ---\\` section, follow those instructions to fix the issue. If it contains a \\`--- Fix Skill: <name> ---\\` section, invoke that skill.\n - For REVIEW failures: Read the \\`.json\\` file path provided in the \"Review: <path>\" output.\n4. Address the violations:\n - For REVIEW violations: You MUST update the \\`\"status\"\\` and \\`\"result\"\\` fields in the provided \\`.json\\` file for EACH violation.\n - Set \\`\"status\": \"fixed\"\\` and add a brief description to \\`\"result\"\\` for issues you fix.\n - Set \\`\"status\": \"skipped\"\\` and add a brief reason to \\`\"result\"\\` for issues you skip (based on the trust level).\n - Do NOT modify any other attributes (file, line, issue, priority) in the JSON file.\n - Apply the trust level above when deciding whether to act on AI reviewer feedback.\n5. Run \\`${command}\\` again to verify your fixes. Do NOT run \\`agent-gauntlet clean\\` between retries. The tool detects existing logs and automatically switches to verification mode.\n6. Repeat steps 3-5 until one of the following termination conditions is met:\n - \"Status: Passed\" appears in the output (logs are automatically archived)\n - \"Status: Passed with warnings\" appears in the output (remaining issues were skipped)\n - \"Status: Retry limit exceeded\" appears in the output -> Run \\`agent-gauntlet clean\\` to archive logs for the session record. Do NOT retry after cleaning.\n7. Provide a summary of the session:\n - Issues Fixed: (list key fixes)\n - Issues Skipped: (list skipped items and reasons)\n - Outstanding Failures: (if retry limit exceeded, list unverified fixes and remaining issues)`,\n\t\t);\n\t} else {\n\t\tsteps.push(\n\t\t\t`3. If any checks fail:\n - Read the \\`.log\\` file path provided in the output for each failed check. If the log contains a \\`--- Fix Instructions ---\\` section, follow those instructions. If it contains a \\`--- Fix Skill: <name> ---\\` section, invoke that skill.\n - Fix the issues found.\n4. Run \\`${command}\\` again to verify your fixes. Do NOT run \\`agent-gauntlet clean\\` between retries.\n5. Repeat steps 3-4 until all checks pass or you've made 3 attempts.\n6. Provide a summary of the session:\n - Checks Passed: (list)\n - Checks Failed: (list with brief reason)\n - Fixes Applied: (list key fixes)`,\n\t\t);\n\t}\n\n\tif (isRun) {\n\t\treturn `${frontmatter}\n<!--\n REVIEW TRUST LEVEL\n Controls how aggressively the agent acts on AI reviewer feedback.\n Change the trust_level value below to one of: high, medium, low\n\n - high: Fix all issues unless you strongly disagree or have low confidence the human wants the change.\n - medium: Fix issues you reasonably agree with or believe the human wants fixed. (DEFAULT)\n - low: Fix only issues you strongly agree with or are confident the human wants fixed.\n-->\n<!-- trust_level: medium -->\n\n# /gauntlet-${name}\n${heading}\n\n**Review trust level: medium** \\u2014 Fix issues you reasonably agree with or believe the human wants to be fixed. Skip issues that are purely stylistic, subjective, or that you believe the human would not want changed. When you skip an issue, briefly state what was skipped and why.\n\n${steps.join(\"\\n\")}\n`;\n\t}\n\n\treturn `${frontmatter}\n\n# /gauntlet-${name}\n${heading}\n\n${steps.join(\"\\n\")}\n`;\n}\n\nconst GAUNTLET_RUN_SKILL_CONTENT = buildGauntletSkillContent(\"run\");\nconst GAUNTLET_CHECK_SKILL_CONTENT = buildGauntletSkillContent(\"check\");\n\nconst PUSH_PR_SKILL_CONTENT = readSkillTemplate(\"push-pr.md\");\n\nconst FIX_PR_SKILL_CONTENT = readSkillTemplate(\"fix-pr.md\");\n\nconst GAUNTLET_STATUS_SKILL_CONTENT = readSkillTemplate(\"status.md\");\n\nconst HELP_SKILL_BUNDLE = {\n\tcontent: readSkillTemplate(\"help-skill.md\"),\n\treferences: {\n\t\t\"stop-hook-troubleshooting.md\": readSkillTemplate(\n\t\t\t\"help-ref-stop-hook-troubleshooting.md\",\n\t\t),\n\t\t\"config-troubleshooting.md\": readSkillTemplate(\n\t\t\t\"help-ref-config-troubleshooting.md\",\n\t\t),\n\t\t\"gate-troubleshooting.md\": readSkillTemplate(\n\t\t\t\"help-ref-gate-troubleshooting.md\",\n\t\t),\n\t\t\"lock-troubleshooting.md\": readSkillTemplate(\n\t\t\t\"help-ref-lock-troubleshooting.md\",\n\t\t),\n\t\t\"adapter-troubleshooting.md\": readSkillTemplate(\n\t\t\t\"help-ref-adapter-troubleshooting.md\",\n\t\t),\n\t\t\"ci-pr-troubleshooting.md\": readSkillTemplate(\n\t\t\t\"help-ref-ci-pr-troubleshooting.md\",\n\t\t),\n\t},\n};\n\nconst SETUP_SKILL_CONTENT = readSkillTemplate(\"setup-skill.md\");\n\nconst CHECK_CATALOG_REFERENCE = readSkillTemplate(\"check-catalog.md\");\n\nconst PROJECT_STRUCTURE_REFERENCE = readSkillTemplate(\n\t\"setup-ref-project-structure.md\",\n);\n\n/**\n * Skill definitions used by installCommands.\n * Each entry maps a skill action name to its content and metadata.\n */\nconst SKILL_DEFINITIONS = [\n\t{ action: \"run\", content: GAUNTLET_RUN_SKILL_CONTENT },\n\t{ action: \"check\", content: GAUNTLET_CHECK_SKILL_CONTENT },\n\t{ action: \"push-pr\", content: PUSH_PR_SKILL_CONTENT },\n\t{ action: \"fix-pr\", content: FIX_PR_SKILL_CONTENT },\n\t{ action: \"status\", content: GAUNTLET_STATUS_SKILL_CONTENT },\n\t{\n\t\taction: \"help\",\n\t\tcontent: HELP_SKILL_BUNDLE.content,\n\t\treferences: HELP_SKILL_BUNDLE.references,\n\t\tskillsOnly: true,\n\t},\n\t{\n\t\taction: \"setup\",\n\t\tcontent: SETUP_SKILL_CONTENT,\n\t\treferences: {\n\t\t\t\"check-catalog.md\": CHECK_CATALOG_REFERENCE,\n\t\t\t\"project-structure.md\": PROJECT_STRUCTURE_REFERENCE,\n\t\t},\n\t\tskillsOnly: true,\n\t},\n] as const;\n\ntype InstallLevel = \"none\" | \"project\" | \"user\";\n\ninterface InitOptions {\n\tyes?: boolean;\n}\n\nexport function registerInitCommand(program: Command): void {\n\tprogram\n\t\t.command(\"init\")\n\t\t.description(\"Initialize .gauntlet configuration\")\n\t\t.option(\"-y, --yes\", \"Skip prompts and use defaults\")\n\t\t.action(async (options: InitOptions) => {\n\t\t\tconst projectRoot = process.cwd();\n\t\t\tconst targetDir = path.join(projectRoot, \".gauntlet\");\n\n\t\t\tif (await exists(targetDir)) {\n\t\t\t\tconsole.log(chalk.yellow(\".gauntlet directory already exists.\"));\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// 1. CLI Detection\n\t\t\tconsole.log(\"Detecting available CLI agents...\");\n\t\t\tconst availableAdapters = await detectAvailableCLIs();\n\n\t\t\tif (availableAdapters.length === 0) {\n\t\t\t\tprintNoCLIsMessage();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// 2. Scaffold .gauntlet directory, config, reviews, skills\n\t\t\tawait scaffoldProject({\n\t\t\t\tprojectRoot,\n\t\t\t\ttargetDir,\n\t\t\t\tavailableAdapters,\n\t\t\t\tskipPrompts: options.yes ?? false,\n\t\t\t});\n\n\t\t\t// 3. Auto-install stop hooks for detected CLIs\n\t\t\tif (availableAdapters.some((a) => a.name === \"claude\")) {\n\t\t\t\tawait installStopHook(projectRoot);\n\t\t\t}\n\t\t\tif (availableAdapters.some((a) => a.name === \"cursor\")) {\n\t\t\t\tawait installCursorStopHook(projectRoot);\n\t\t\t}\n\n\t\t\t// 4. Add log directory to .gitignore\n\t\t\tawait addToGitignore(projectRoot, \"gauntlet_logs\");\n\n\t\t\t// 5. Next-step message\n\t\t\tconsole.log();\n\t\t\tconsole.log(\n\t\t\t\tchalk.bold(\"Run /gauntlet-setup to configure your checks and reviews\"),\n\t\t\t);\n\t\t});\n}\n\nfunction printNoCLIsMessage(): void {\n\tconsole.log();\n\tconsole.log(chalk.red(\"Error: No CLI agents found. Install at least one:\"));\n\tconsole.log(\" - Claude: https://docs.anthropic.com/en/docs/claude-code\");\n\tconsole.log(\" - Gemini: https://github.com/google-gemini/gemini-cli\");\n\tconsole.log(\" - Codex: https://github.com/openai/codex\");\n\tconsole.log();\n}\n\ninterface ScaffoldOptions {\n\tprojectRoot: string;\n\ttargetDir: string;\n\tavailableAdapters: CLIAdapter[];\n\tskipPrompts: boolean;\n}\n\nasync function scaffoldProject(options: ScaffoldOptions): Promise<void> {\n\tconst { projectRoot, targetDir, availableAdapters, skipPrompts } = options;\n\n\t// Create base directory structure\n\tawait fs.mkdir(targetDir);\n\tawait fs.mkdir(path.join(targetDir, \"checks\"));\n\tawait fs.mkdir(path.join(targetDir, \"reviews\"));\n\n\t// Build and install skills\n\tconst commands: SkillCommand[] = SKILL_DEFINITIONS.map((skill) => ({\n\t\taction: skill.action,\n\t\tcontent: skill.content,\n\t\t...(\"references\" in skill ? { references: skill.references } : {}),\n\t\t...(\"skillsOnly\" in skill ? { skillsOnly: skill.skillsOnly } : {}),\n\t}));\n\n\tif (skipPrompts) {\n\t\tawait installCommands({\n\t\t\tlevel: \"project\",\n\t\t\tagentNames: [\"claude\"],\n\t\t\tprojectRoot,\n\t\t\tcommands,\n\t\t});\n\t} else {\n\t\tawait promptAndInstallCommands({ projectRoot, commands });\n\t}\n\n\t// Generate config.yml\n\tawait writeConfigYml(targetDir, availableAdapters);\n\n\t// Default code review\n\tawait fs.writeFile(\n\t\tpath.join(targetDir, \"reviews\", \"code-quality.yml\"),\n\t\t\"builtin: code-quality\\nnum_reviews: 1\\n\",\n\t);\n\tconsole.log(chalk.green(\"Created .gauntlet/reviews/code-quality.yml\"));\n\n\t// Copy status script bundle\n\tawait copyStatusScript(targetDir);\n}\n\nasync function writeConfigYml(\n\ttargetDir: string,\n\tadapters: CLIAdapter[],\n): Promise<void> {\n\tconst baseBranch = await detectBaseBranch();\n\tconst sortedAdapters = [...adapters].sort(\n\t\t(a, b) =>\n\t\t\tCLI_PREFERENCE_ORDER.indexOf(a.name) -\n\t\t\tCLI_PREFERENCE_ORDER.indexOf(b.name),\n\t);\n\tconst cliList = sortedAdapters.map((a) => ` - ${a.name}`).join(\"\\n\");\n\tconst adapterSettings = buildAdapterSettingsBlock(adapters);\n\n\tconst content = `# Ordered list of CLI agents to try for reviews\ncli:\n default_preference:\n${cliList}\n${adapterSettings}\n# entry_points configured by /gauntlet-setup\nentry_points: []\n\n# -------------------------------------------------------------------\n# All settings below are optional. Uncomment and change as needed.\n# -------------------------------------------------------------------\n\n# Git ref for detecting local changes via git diff (default: origin/main)\n# base_branch: ${baseBranch}\n\n# Directory for per-job logs (default: gauntlet_logs)\n# log_dir: gauntlet_logs\n\n# Run gates in parallel when possible (default: true)\n# allow_parallel: true\n\n# Maximum retry attempts before declaring \"Retry limit exceeded\" (default: 3)\n# max_retries: 3\n\n# Archived session directories to keep during log rotation (default: 3, 0 = disable)\n# max_previous_logs: 3\n\n# Priority threshold for filtering new violations during reruns (default: medium)\n# Options: critical, high, medium, low\n# rerun_new_issue_threshold: medium\n\n# Stop hook — auto-run gauntlet when the agent stops\n# Precedence: env vars > project config > global config (~/.config/agent-gauntlet/config.yml)\n# Env overrides: GAUNTLET_STOP_HOOK_ENABLED, GAUNTLET_STOP_HOOK_INTERVAL_MINUTES,\n# GAUNTLET_AUTO_PUSH_PR, GAUNTLET_AUTO_FIX_PR\n# stop_hook:\n# enabled: false\n# run_interval_minutes: 5 # Minimum minutes between runs (0 = always run)\n# auto_push_pr: false # Check/create PR after gates pass\n# auto_fix_pr: false # Wait for CI checks after PR (requires auto_push_pr)\n\n# Debug log — persistent debug logging to .debug.log\n# debug_log:\n# enabled: false\n# max_size_mb: 10 # Max size before rotation to .debug.log.1\n\n# Structured logging via LogTape\n# logging:\n# level: debug # Options: debug, info, warning, error\n# console:\n# enabled: true\n# format: pretty # Options: pretty, json\n# file:\n# enabled: true\n# format: text # Options: text, json\n`;\n\tawait fs.writeFile(path.join(targetDir, \"config.yml\"), content);\n\tconsole.log(chalk.green(\"Created .gauntlet/config.yml\"));\n}\n\n/**\n * Append an entry to .gitignore if it isn't already present.\n */\nasync function addToGitignore(\n\tprojectRoot: string,\n\tentry: string,\n): Promise<void> {\n\tconst gitignorePath = path.join(projectRoot, \".gitignore\");\n\n\tlet content = \"\";\n\tif (await exists(gitignorePath)) {\n\t\tcontent = await fs.readFile(gitignorePath, \"utf-8\");\n\t\tconst lines = content.split(\"\\n\").map((l) => l.trim());\n\t\tif (lines.includes(entry)) {\n\t\t\treturn;\n\t\t}\n\t}\n\n\tconst suffix = content.length > 0 && !content.endsWith(\"\\n\") ? \"\\n\" : \"\";\n\tawait fs.appendFile(gitignorePath, `${suffix}${entry}\\n`);\n\tconsole.log(chalk.green(`Added ${entry} to .gitignore`));\n}\n\nfunction gitSilent(args: string[], opts?: { timeout?: number }): string | null {\n\tconst { execFileSync } = require(\"node:child_process\");\n\ttry {\n\t\treturn (\n\t\t\texecFileSync(\"git\", args, {\n\t\t\t\tencoding: \"utf-8\",\n\t\t\t\ttimeout: opts?.timeout,\n\t\t\t\tstdio: [\"pipe\", \"pipe\", \"ignore\"],\n\t\t\t}) as string\n\t\t).trim();\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nasync function detectBaseBranch(): Promise<string> {\n\t// Fetch the remote's default branch from the server and cache it locally\n\tgitSilent([\"remote\", \"set-head\", \"origin\", \"--auto\"], { timeout: 5000 });\n\n\t// Read the (possibly just-updated) cached remote HEAD\n\tconst ref = gitSilent([\"symbolic-ref\", \"refs/remotes/origin/HEAD\"]);\n\tif (ref) {\n\t\treturn ref.replace(\"refs/remotes/\", \"\");\n\t}\n\n\t// Check which common default branches actually exist locally\n\tfor (const candidate of [\"origin/main\", \"origin/master\"]) {\n\t\tif (gitSilent([\"rev-parse\", \"--verify\", candidate]) !== null) {\n\t\t\treturn candidate;\n\t\t}\n\t}\n\n\treturn \"origin/main\";\n}\n\nfunction buildAdapterSettingsBlock(adapters: CLIAdapter[]): string {\n\tconst items = adapters.filter((a) => ADAPTER_CONFIG[a.name]);\n\tif (items.length === 0) return \"\";\n\tconst lines = items.map((a) => {\n\t\tconst c = ADAPTER_CONFIG[a.name];\n\t\treturn ` ${a.name}:\\n allow_tool_use: ${c?.allow_tool_use}\\n thinking_budget: ${c?.thinking_budget}`;\n\t});\n\treturn ` # Recommended settings (see docs/eval-results.md)\\n adapters:\\n${lines.join(\"\\n\")}\\n`;\n}\n\nasync function detectAvailableCLIs(): Promise<CLIAdapter[]> {\n\tconst allAdapters = [...getAllAdapters()].sort(\n\t\t(a, b) =>\n\t\t\tCLI_PREFERENCE_ORDER.indexOf(a.name) -\n\t\t\tCLI_PREFERENCE_ORDER.indexOf(b.name),\n\t);\n\tconst available: CLIAdapter[] = [];\n\n\tfor (const adapter of allAdapters) {\n\t\tconst isAvailable = await adapter.isAvailable();\n\t\tif (isAvailable) {\n\t\t\tconsole.log(chalk.green(` \\u2713 ${adapter.name}`));\n\t\t\tavailable.push(adapter);\n\t\t} else {\n\t\t\tconsole.log(chalk.dim(` \\u2717 ${adapter.name} (not installed)`));\n\t\t}\n\t}\n\treturn available;\n}\n\n/**\n * Copy the status script bundle into .gauntlet/skills/gauntlet/status/scripts/.\n * The script is sourced from the package's src/scripts/status.ts.\n */\nasync function copyStatusScript(targetDir: string): Promise<void> {\n\tconst statusScriptDir = path.join(\n\t\ttargetDir,\n\t\t\"skills\",\n\t\t\"gauntlet\",\n\t\t\"status\",\n\t\t\"scripts\",\n\t);\n\tconst statusScriptPath = path.join(statusScriptDir, \"status.ts\");\n\tawait fs.mkdir(statusScriptDir, { recursive: true });\n\n\tif (await exists(statusScriptPath)) return;\n\n\tconst bundledScript = path.join(\n\t\tpath.dirname(new URL(import.meta.url).pathname),\n\t\t\"..\",\n\t\t\"scripts\",\n\t\t\"status.ts\",\n\t);\n\tif (await exists(bundledScript)) {\n\t\tawait fs.copyFile(bundledScript, statusScriptPath);\n\t\tconsole.log(\n\t\t\tchalk.green(\"Created .gauntlet/skills/gauntlet/status/scripts/status.ts\"),\n\t\t);\n\t} else {\n\t\tconsole.log(\n\t\t\tchalk.yellow(\n\t\t\t\t\"Warning: bundled status script not found; /gauntlet-status may fail.\",\n\t\t\t),\n\t\t);\n\t}\n}\n\ninterface PromptAndInstallOptions {\n\tprojectRoot: string;\n\tcommands: SkillCommand[];\n}\n\nasync function promptAndInstallCommands(\n\toptions: PromptAndInstallOptions,\n): Promise<void> {\n\tconst { projectRoot, commands } = options;\n\n\tawait installCommands({\n\t\tlevel: \"project\",\n\t\tagentNames: [\"claude\"],\n\t\tprojectRoot,\n\t\tcommands,\n\t});\n}\n\n/**\n * A skill/command to be installed.\n */\ninterface SkillCommand {\n\t/** The skill action name (e.g., \"run\", \"check\", \"push-pr\"). */\n\taction: string;\n\t/** The Markdown content (with YAML frontmatter). */\n\tcontent: string;\n\t/** Optional reference files to install alongside SKILL.md (skills-only). */\n\treferences?: Record<string, string>;\n\t/** If true, this skill is only installed for skills-capable adapters (not flat commands). */\n\tskillsOnly?: boolean;\n}\n\ninterface InstallContext {\n\tisUserLevel: boolean;\n\tprojectRoot: string;\n}\n\ninterface InstallCommandsOptions {\n\tlevel: InstallLevel;\n\tagentNames: string[];\n\tprojectRoot: string;\n\tcommands: SkillCommand[];\n}\n\n/**\n * Install a single skill for Claude as a SKILL.md in a nested directory.\n */\nasync function installSkill(\n\tskillDir: string,\n\tctx: InstallContext,\n\tcommand: SkillCommand,\n): Promise<void> {\n\tconst actionDir = path.join(skillDir, `gauntlet-${command.action}`);\n\tconst skillPath = path.join(actionDir, \"SKILL.md\");\n\n\tawait fs.mkdir(actionDir, { recursive: true });\n\n\tif (await exists(skillPath)) {\n\t\tconst relPath = ctx.isUserLevel\n\t\t\t? skillPath\n\t\t\t: path.relative(ctx.projectRoot, skillPath);\n\t\tconsole.log(chalk.dim(` claude: ${relPath} already exists, skipping`));\n\t\treturn;\n\t}\n\n\tawait fs.writeFile(skillPath, command.content);\n\tconst relPath = ctx.isUserLevel\n\t\t? skillPath\n\t\t: path.relative(ctx.projectRoot, skillPath);\n\tconsole.log(chalk.green(`Created ${relPath}`));\n\n\t// Install reference files if present\n\tif (command.references) {\n\t\tconst refsDir = path.join(actionDir, \"references\");\n\t\tawait fs.mkdir(refsDir, { recursive: true });\n\t\tfor (const [fileName, fileContent] of Object.entries(command.references)) {\n\t\t\tconst refPath = path.join(refsDir, fileName);\n\t\t\tif (await exists(refPath)) continue;\n\t\t\tawait fs.writeFile(refPath, fileContent);\n\t\t\tconst refRelPath = ctx.isUserLevel\n\t\t\t\t? refPath\n\t\t\t\t: path.relative(ctx.projectRoot, refPath);\n\t\t\tconsole.log(chalk.green(`Created ${refRelPath}`));\n\t\t}\n\t}\n}\n\n/**\n * Install a single flat command file for a non-Claude adapter.\n * Uses the \"gauntlet\" name prefix for non-namespaced agents.\n */\nasync function installFlatCommand(\n\tadapter: CLIAdapter,\n\tcommandDir: string,\n\tctx: InstallContext,\n\tcommand: SkillCommand,\n): Promise<void> {\n\t// Non-Claude agents get flat files named \"gauntlet\" (for run) or the action name\n\tconst name = command.action === \"run\" ? \"gauntlet\" : command.action;\n\tconst fileName = `${name}${adapter.getCommandExtension()}`;\n\tconst filePath = path.join(commandDir, fileName);\n\n\tif (await exists(filePath)) {\n\t\tconst relPath = ctx.isUserLevel\n\t\t\t? filePath\n\t\t\t: path.relative(ctx.projectRoot, filePath);\n\t\tconsole.log(\n\t\t\tchalk.dim(` ${adapter.name}: ${relPath} already exists, skipping`),\n\t\t);\n\t\treturn;\n\t}\n\n\tconst transformedContent = adapter.transformCommand(command.content);\n\tawait fs.writeFile(filePath, transformedContent);\n\tconst relPath = ctx.isUserLevel\n\t\t? filePath\n\t\t: path.relative(ctx.projectRoot, filePath);\n\tconsole.log(chalk.green(`Created ${relPath}`));\n}\n\n/**\n * Install skills for a skills-capable adapter (e.g., Claude).\n */\nasync function installSkillsForAdapter(\n\tadapter: CLIAdapter,\n\tskillDir: string,\n\tctx: InstallContext,\n\tcommands: SkillCommand[],\n): Promise<void> {\n\tconst resolvedSkillDir = ctx.isUserLevel\n\t\t? skillDir\n\t\t: path.join(ctx.projectRoot, skillDir);\n\ttry {\n\t\tfor (const command of commands) {\n\t\t\tawait installSkill(resolvedSkillDir, ctx, command);\n\t\t}\n\t} catch (error: unknown) {\n\t\tconst err = error as { message?: string };\n\t\tconsole.log(\n\t\t\tchalk.yellow(\n\t\t\t\t` ${adapter.name}: Could not create skill - ${err.message}`,\n\t\t\t),\n\t\t);\n\t}\n}\n\n/**\n * Install flat command files for a non-skills adapter.\n */\nasync function installFlatCommandsForAdapter(\n\tadapter: CLIAdapter,\n\tcommandDir: string,\n\tctx: InstallContext,\n\tcommands: SkillCommand[],\n): Promise<void> {\n\tconst resolvedCommandDir = ctx.isUserLevel\n\t\t? commandDir\n\t\t: path.join(ctx.projectRoot, commandDir);\n\ttry {\n\t\tawait fs.mkdir(resolvedCommandDir, { recursive: true });\n\t\t// Non-Claude agents only get run, push-pr, and fix-pr (not check/status/help)\n\t\tconst flatCommands = commands.filter(\n\t\t\t(c) => c.action !== \"check\" && c.action !== \"status\" && !c.skillsOnly,\n\t\t);\n\t\tfor (const command of flatCommands) {\n\t\t\tawait installFlatCommand(adapter, resolvedCommandDir, ctx, command);\n\t\t}\n\t} catch (error: unknown) {\n\t\tconst err = error as { message?: string };\n\t\tconsole.log(\n\t\t\tchalk.yellow(\n\t\t\t\t` ${adapter.name}: Could not create command - ${err.message}`,\n\t\t\t),\n\t\t);\n\t}\n}\n\nasync function installCommands(options: InstallCommandsOptions): Promise<void> {\n\tconst { level, agentNames, projectRoot, commands } = options;\n\tif (level === \"none\" || agentNames.length === 0) return;\n\n\tconsole.log();\n\tconst allAdapters = getAllAdapters();\n\n\tconst isUserLevel = level === \"user\";\n\tconst ctx: InstallContext = { isUserLevel, projectRoot };\n\n\tfor (const agentName of agentNames) {\n\t\tconst adapter = allAdapters.find((a) => a.name === agentName);\n\t\tif (!adapter) continue;\n\n\t\tconst skillDir = isUserLevel\n\t\t\t? adapter.getUserSkillDir()\n\t\t\t: adapter.getProjectSkillDir();\n\n\t\tif (skillDir) {\n\t\t\tawait installSkillsForAdapter(adapter, skillDir, ctx, commands);\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst commandDir = isUserLevel\n\t\t\t? adapter.getUserCommandDir()\n\t\t\t: adapter.getProjectCommandDir();\n\t\tif (!commandDir) continue;\n\n\t\tawait installFlatCommandsForAdapter(adapter, commandDir, ctx, commands);\n\t}\n}\n\n/**\n * The stop hook configuration for Claude Code.\n */\nconst STOP_HOOK_CONFIG = {\n\thooks: {\n\t\tStop: [\n\t\t\t{\n\t\t\t\thooks: [\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: \"command\",\n\t\t\t\t\t\tcommand: \"agent-gauntlet stop-hook\",\n\t\t\t\t\t\ttimeout: 300,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t},\n\t\t],\n\t},\n};\n\n/**\n * The stop hook configuration for Cursor.\n */\nconst CURSOR_STOP_HOOK_CONFIG = {\n\tversion: 1,\n\thooks: {\n\t\tstop: [\n\t\t\t{\n\t\t\t\tcommand: \"agent-gauntlet stop-hook\",\n\t\t\t\tloop_limit: 10,\n\t\t\t},\n\t\t],\n\t},\n};\n\n/**\n * Install the stop hook configuration to .claude/settings.local.json.\n */\nexport async function installStopHook(projectRoot: string): Promise<void> {\n\tconst claudeDir = path.join(projectRoot, \".claude\");\n\tconst settingsPath = path.join(claudeDir, \"settings.local.json\");\n\n\t// Ensure .claude directory exists\n\tawait fs.mkdir(claudeDir, { recursive: true });\n\n\tlet existingSettings: Record<string, unknown> = {};\n\n\t// Check if settings.local.json already exists\n\tif (await exists(settingsPath)) {\n\t\ttry {\n\t\t\tconst content = await fs.readFile(settingsPath, \"utf-8\");\n\t\t\texistingSettings = JSON.parse(content);\n\t\t} catch {\n\t\t\t// If parsing fails, start fresh\n\t\t\texistingSettings = {};\n\t\t}\n\t}\n\n\t// Merge hooks configuration\n\tconst existingHooks =\n\t\t(existingSettings.hooks as Record<string, unknown>) || {};\n\tconst existingStopHooks = Array.isArray(existingHooks.Stop)\n\t\t? existingHooks.Stop\n\t\t: [];\n\n\t// Check if stop hook already exists to avoid duplicates\n\tconst hookExists = existingStopHooks.some((hook: unknown) =>\n\t\t(hook as { hooks?: { command?: string }[] })?.hooks?.some?.(\n\t\t\t(h) => h?.command === \"agent-gauntlet stop-hook\",\n\t\t),\n\t);\n\tif (hookExists) {\n\t\tconsole.log(chalk.dim(\"Stop hook already installed\"));\n\t\treturn;\n\t}\n\n\t// Add our stop hook to the existing Stop hooks\n\tconst newStopHooks = [...existingStopHooks, ...STOP_HOOK_CONFIG.hooks.Stop];\n\n\tconst mergedSettings = {\n\t\t...existingSettings,\n\t\thooks: {\n\t\t\t...existingHooks,\n\t\t\tStop: newStopHooks,\n\t\t},\n\t};\n\n\t// Write with pretty formatting\n\tawait fs.writeFile(\n\t\tsettingsPath,\n\t\t`${JSON.stringify(mergedSettings, null, 2)}\\n`,\n\t);\n\n\tconsole.log(\n\t\tchalk.green(\n\t\t\t\"Stop hook installed - gauntlet will run automatically when agent stops\",\n\t\t),\n\t);\n}\n\n/**\n * Install the stop hook configuration to .cursor/hooks.json.\n */\nexport async function installCursorStopHook(\n\tprojectRoot: string,\n): Promise<void> {\n\tconst cursorDir = path.join(projectRoot, \".cursor\");\n\tconst hooksPath = path.join(cursorDir, \"hooks.json\");\n\n\t// Ensure .cursor directory exists\n\tawait fs.mkdir(cursorDir, { recursive: true });\n\n\tlet existingConfig: Record<string, unknown> = {};\n\n\t// Check if hooks.json already exists\n\tif (await exists(hooksPath)) {\n\t\ttry {\n\t\t\tconst content = await fs.readFile(hooksPath, \"utf-8\");\n\t\t\texistingConfig = JSON.parse(content);\n\t\t} catch {\n\t\t\t// If parsing fails, start fresh\n\t\t\texistingConfig = {};\n\t\t}\n\t}\n\n\t// Merge hooks configuration\n\tconst existingHooks = (existingConfig.hooks as Record<string, unknown>) || {};\n\tconst existingStopHooks = Array.isArray(existingHooks.stop)\n\t\t? existingHooks.stop\n\t\t: [];\n\n\t// Check if stop hook already exists to avoid duplicates\n\tconst hookExists = existingStopHooks.some(\n\t\t(hook: unknown) =>\n\t\t\t(hook as { command?: string })?.command === \"agent-gauntlet stop-hook\",\n\t);\n\tif (hookExists) {\n\t\tconsole.log(chalk.dim(\"Cursor stop hook already installed\"));\n\t\treturn;\n\t}\n\n\t// Add our stop hook to the existing stop hooks\n\tconst newStopHooks = [\n\t\t...existingStopHooks,\n\t\t...CURSOR_STOP_HOOK_CONFIG.hooks.stop,\n\t];\n\n\tconst mergedConfig = {\n\t\t...existingConfig,\n\t\tversion:\n\t\t\t(existingConfig.version as number) ?? CURSOR_STOP_HOOK_CONFIG.version,\n\t\thooks: {\n\t\t\t...existingHooks,\n\t\t\tstop: newStopHooks,\n\t\t},\n\t};\n\n\t// Write with pretty formatting\n\tawait fs.writeFile(hooksPath, `${JSON.stringify(mergedConfig, null, 2)}\\n`);\n\n\tconsole.log(\n\t\tchalk.green(\n\t\t\t\"Cursor stop hook installed - gauntlet will run automatically when agent stops\",\n\t\t),\n\t);\n}\n",
|
|
53
|
+
"import { readFileSync } from \"node:fs\";\nimport fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport chalk from \"chalk\";\nimport type { Command } from \"commander\";\nimport { type CLIAdapter, getAllAdapters } from \"../cli-adapters/index.js\";\nimport {\n\tcomputeExpectedHookChecksum,\n\tcomputeExpectedSkillChecksum,\n\tcomputeHookChecksum,\n\tcomputeSkillChecksum,\n\tisGauntletHookEntry,\n} from \"./init-checksums.js\";\nimport {\n\tpromptDevCLIs,\n\tpromptFileOverwrite,\n\tpromptHookOverwrite,\n\tpromptNumReviews,\n\tpromptReviewCLIs,\n} from \"./init-prompts.js\";\nimport { exists } from \"./shared.js\";\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\n\nfunction readSkillTemplate(filename: string): string {\n\tconst templatePath = path.join(__dirname, \"skill-templates\", filename);\n\treturn readFileSync(templatePath, \"utf-8\");\n}\n\nconst CLI_PREFERENCE_ORDER = [\n\t\"codex\",\n\t\"claude\",\n\t\"cursor\",\n\t\"github-copilot\",\n\t\"gemini\",\n];\n\n// Recommended adapter config: https://github.com/pacaplan/agent-gauntlet/blob/main/docs/eval-results.md\ntype AdapterCfg = { allow_tool_use: boolean; thinking_budget: string };\nconst ADAPTER_CONFIG: Record<string, AdapterCfg> = {\n\tclaude: { allow_tool_use: false, thinking_budget: \"high\" },\n\tcodex: { allow_tool_use: false, thinking_budget: \"low\" },\n\tgemini: { allow_tool_use: false, thinking_budget: \"low\" },\n};\n\n// --- Skill content templates ---\n// These are used for both skills (Claude) and flat commands (other agents).\n// The frontmatter fields (name, disable-model-invocation) are only meaningful\n// for skills but are harmless in flat command files.\n\n/**\n * Build gauntlet run/check skill content. Shared structure avoids duplication\n * between the \"run\" and \"check\" skills.\n */\nfunction buildGauntletSkillContent(mode: \"run\" | \"check\"): string {\n\tconst isRun = mode === \"run\";\n\tconst name = isRun ? \"run\" : \"check\";\n\tconst description = isRun\n\t\t? \"Run the full verification gauntlet. Use this as the final step after completing a coding task — verifies quality, runs checks, and ensures all gates pass. Must be run before committing, pushing, or creating PRs.\"\n\t\t: \"Run checks only (no reviews)\";\n\tconst command = isRun ? \"agent-gauntlet run\" : \"agent-gauntlet check\";\n\tconst heading = isRun\n\t\t? \"Execute the autonomous verification suite.\"\n\t\t: \"Run the gauntlet checks only \\u2014 no AI reviews.\";\n\tconst disableModelInvocation = isRun ? \"false\" : \"true\";\n\n\tconst frontmatter = `---\nname: gauntlet-${name}\ndescription: >-\n ${description}\ndisable-model-invocation: ${disableModelInvocation}\nallowed-tools: Bash\n---`;\n\n\t// Common prefix: archive old logs, then run the command\n\tconst steps = [\n\t\t`1. Run \\`agent-gauntlet clean\\` to archive any previous log files`,\n\t\t`2. Run \\`${command}\\``,\n\t];\n\n\tif (isRun) {\n\t\tsteps.push(\n\t\t\t`3. If it fails:\n - Identify the failed gates from the console output.\n - For CHECK failures: Read the \\`.log\\` file path provided in the output. If the log contains a \\`--- Fix Instructions ---\\` section, follow those instructions to fix the issue. If it contains a \\`--- Fix Skill: <name> ---\\` section, invoke that skill.\n - For REVIEW failures: Read the \\`.json\\` file path provided in the \"Review: <path>\" output.\n4. Address the violations:\n - For REVIEW violations: You MUST update the \\`\"status\"\\` and \\`\"result\"\\` fields in the provided \\`.json\\` file for EACH violation.\n - Set \\`\"status\": \"fixed\"\\` and add a brief description to \\`\"result\"\\` for issues you fix.\n - Set \\`\"status\": \"skipped\"\\` and add a brief reason to \\`\"result\"\\` for issues you skip (based on the trust level).\n - Do NOT modify any other attributes (file, line, issue, priority) in the JSON file.\n - Apply the trust level above when deciding whether to act on AI reviewer feedback.\n5. Run \\`${command}\\` again to verify your fixes. Do NOT run \\`agent-gauntlet clean\\` between retries. The tool detects existing logs and automatically switches to verification mode.\n6. Repeat steps 3-5 until one of the following termination conditions is met:\n - \"Status: Passed\" appears in the output (logs are automatically archived)\n - \"Status: Passed with warnings\" appears in the output (remaining issues were skipped)\n - \"Status: Retry limit exceeded\" appears in the output -> Run \\`agent-gauntlet clean\\` to archive logs for the session record. Do NOT retry after cleaning.\n7. Provide a summary of the session:\n - Issues Fixed: (list key fixes)\n - Issues Skipped: (list skipped items and reasons)\n - Outstanding Failures: (if retry limit exceeded, list unverified fixes and remaining issues)`,\n\t\t);\n\t} else {\n\t\tsteps.push(\n\t\t\t`3. If any checks fail:\n - Read the \\`.log\\` file path provided in the output for each failed check. If the log contains a \\`--- Fix Instructions ---\\` section, follow those instructions. If it contains a \\`--- Fix Skill: <name> ---\\` section, invoke that skill.\n - Fix the issues found.\n4. Run \\`${command}\\` again to verify your fixes. Do NOT run \\`agent-gauntlet clean\\` between retries.\n5. Repeat steps 3-4 until all checks pass or you've made 3 attempts.\n6. Provide a summary of the session:\n - Checks Passed: (list)\n - Checks Failed: (list with brief reason)\n - Fixes Applied: (list key fixes)`,\n\t\t);\n\t}\n\n\tif (isRun) {\n\t\treturn `${frontmatter}\n<!--\n REVIEW TRUST LEVEL\n Controls how aggressively the agent acts on AI reviewer feedback.\n Change the trust_level value below to one of: high, medium, low\n\n - high: Fix all issues unless you strongly disagree or have low confidence the human wants the change.\n - medium: Fix issues you reasonably agree with or believe the human wants fixed. (DEFAULT)\n - low: Fix only issues you strongly agree with or are confident the human wants fixed.\n-->\n<!-- trust_level: medium -->\n\n# /gauntlet-${name}\n${heading}\n\n**Review trust level: medium** \\u2014 Fix issues you reasonably agree with or believe the human wants to be fixed. Skip issues that are purely stylistic, subjective, or that you believe the human would not want changed. When you skip an issue, briefly state what was skipped and why.\n\n${steps.join(\"\\n\")}\n`;\n\t}\n\n\treturn `${frontmatter}\n\n# /gauntlet-${name}\n${heading}\n\n${steps.join(\"\\n\")}\n`;\n}\n\nconst GAUNTLET_RUN_SKILL_CONTENT = buildGauntletSkillContent(\"run\");\nconst GAUNTLET_CHECK_SKILL_CONTENT = buildGauntletSkillContent(\"check\");\n\nconst PUSH_PR_SKILL_CONTENT = readSkillTemplate(\"push-pr.md\");\n\nconst FIX_PR_SKILL_CONTENT = readSkillTemplate(\"fix-pr.md\");\n\nconst GAUNTLET_STATUS_SKILL_CONTENT = readSkillTemplate(\"status.md\");\n\nconst HELP_SKILL_BUNDLE = {\n\tcontent: readSkillTemplate(\"help-skill.md\"),\n\treferences: {\n\t\t\"stop-hook-troubleshooting.md\": readSkillTemplate(\n\t\t\t\"help-ref-stop-hook-troubleshooting.md\",\n\t\t),\n\t\t\"config-troubleshooting.md\": readSkillTemplate(\n\t\t\t\"help-ref-config-troubleshooting.md\",\n\t\t),\n\t\t\"gate-troubleshooting.md\": readSkillTemplate(\n\t\t\t\"help-ref-gate-troubleshooting.md\",\n\t\t),\n\t\t\"lock-troubleshooting.md\": readSkillTemplate(\n\t\t\t\"help-ref-lock-troubleshooting.md\",\n\t\t),\n\t\t\"adapter-troubleshooting.md\": readSkillTemplate(\n\t\t\t\"help-ref-adapter-troubleshooting.md\",\n\t\t),\n\t\t\"ci-pr-troubleshooting.md\": readSkillTemplate(\n\t\t\t\"help-ref-ci-pr-troubleshooting.md\",\n\t\t),\n\t},\n};\n\nconst SETUP_SKILL_CONTENT = readSkillTemplate(\"setup-skill.md\");\n\nconst CHECK_CATALOG_REFERENCE = readSkillTemplate(\"check-catalog.md\");\n\nconst PROJECT_STRUCTURE_REFERENCE = readSkillTemplate(\n\t\"setup-ref-project-structure.md\",\n);\n\n/**\n * Skill definitions used by installExternalFiles.\n * Each entry maps a skill action name to its content and metadata.\n */\nconst SKILL_DEFINITIONS = [\n\t{\n\t\taction: \"run\",\n\t\tcontent: GAUNTLET_RUN_SKILL_CONTENT,\n\t\tdescription: \"Run the verification suite\",\n\t},\n\t{\n\t\taction: \"check\",\n\t\tcontent: GAUNTLET_CHECK_SKILL_CONTENT,\n\t\tdescription: \"Run a single check gate\",\n\t},\n\t{\n\t\taction: \"push-pr\",\n\t\tcontent: PUSH_PR_SKILL_CONTENT,\n\t\tdescription: \"Commit, push, and create a PR\",\n\t},\n\t{\n\t\taction: \"fix-pr\",\n\t\tcontent: FIX_PR_SKILL_CONTENT,\n\t\tdescription: \"Fix PR review comments and CI failures\",\n\t},\n\t{\n\t\taction: \"status\",\n\t\tcontent: GAUNTLET_STATUS_SKILL_CONTENT,\n\t\tdescription: \"Show gauntlet status\",\n\t},\n\t{\n\t\taction: \"help\",\n\t\tcontent: HELP_SKILL_BUNDLE.content,\n\t\treferences: HELP_SKILL_BUNDLE.references,\n\t\tskillsOnly: true,\n\t\tdescription: \"Diagnose and explain gauntlet behavior\",\n\t},\n\t{\n\t\taction: \"setup\",\n\t\tcontent: SETUP_SKILL_CONTENT,\n\t\treferences: {\n\t\t\t\"check-catalog.md\": CHECK_CATALOG_REFERENCE,\n\t\t\t\"project-structure.md\": PROJECT_STRUCTURE_REFERENCE,\n\t\t},\n\t\tskillsOnly: true,\n\t\tdescription: \"Configure checks and reviews interactively\",\n\t},\n] as const;\n\ninterface InitOptions {\n\tyes?: boolean;\n}\n\ninterface HookTarget {\n\tprojectRoot: string;\n\tvariant: \"claude\" | \"cursor\";\n\tkind: \"stop\" | \"start\";\n}\n\n/**\n * Native CLIs that support the /gauntlet-setup skill invocation.\n */\nconst NATIVE_CLIS = new Set([\"claude\", \"cursor\"]);\n\nexport function registerInitCommand(program: Command): void {\n\tprogram\n\t\t.command(\"init\")\n\t\t.description(\"Initialize .gauntlet configuration\")\n\t\t.option(\"-y, --yes\", \"Skip prompts and use defaults\")\n\t\t.action(async (options: InitOptions) => {\n\t\t\tconst projectRoot = process.cwd();\n\t\t\tconst targetDir = path.join(projectRoot, \".gauntlet\");\n\t\t\tconst skipPrompts = options.yes ?? false;\n\n\t\t\t// Phase 1: CLI Detection\n\t\t\tconsole.log(\"Detecting available CLI agents...\");\n\t\t\tconst availableAdapters = await detectAvailableCLIs();\n\n\t\t\tif (availableAdapters.length === 0) {\n\t\t\t\tprintNoCLIsMessage();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst detectedNames = availableAdapters.map((a) => a.name);\n\t\t\tconst gauntletExists = await exists(targetDir);\n\n\t\t\tlet hookAdapters: CLIAdapter[];\n\t\t\tlet instructionCLINames: string[];\n\n\t\t\tif (gauntletExists) {\n\t\t\t\t// Re-run: skip Phases 2-4, use all detected adapters\n\t\t\t\tconsole.log(\n\t\t\t\t\tchalk.dim(\".gauntlet/ already exists, skipping scaffolding\"),\n\t\t\t\t);\n\t\t\t\thookAdapters = availableAdapters;\n\t\t\t\tinstructionCLINames = detectedNames;\n\t\t\t} else {\n\t\t\t\t// Phase 2: Dev CLI Selection\n\t\t\t\tconst devCLINames = await promptDevCLIs(detectedNames, skipPrompts);\n\t\t\t\thookAdapters = availableAdapters.filter((a) =>\n\t\t\t\t\tdevCLINames.includes(a.name),\n\t\t\t\t);\n\n\t\t\t\t// Warn about CLIs without hook support\n\t\t\t\tfor (const adapter of hookAdapters) {\n\t\t\t\t\tif (!adapter.supportsHooks()) {\n\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\tchalk.yellow(\n\t\t\t\t\t\t\t\t` ${adapter.name} doesn't support hooks yet, skipping hook installation`,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Phase 3: Review CLI Selection & Config\n\t\t\t\tconst reviewCLINames = await promptReviewCLIs(\n\t\t\t\t\tdetectedNames,\n\t\t\t\t\tskipPrompts,\n\t\t\t\t);\n\t\t\t\tconst numReviews = await promptNumReviews(\n\t\t\t\t\treviewCLINames.length,\n\t\t\t\t\tskipPrompts,\n\t\t\t\t);\n\t\t\t\tconsole.log(\n\t\t\t\t\tchalk.cyan(\n\t\t\t\t\t\t\"Agent Gauntlet's built-in code quality reviewer will be installed.\",\n\t\t\t\t\t),\n\t\t\t\t);\n\n\t\t\t\t// Phase 4: Scaffold .gauntlet/\n\t\t\t\tawait scaffoldGauntletDir(\n\t\t\t\t\tprojectRoot,\n\t\t\t\t\ttargetDir,\n\t\t\t\t\treviewCLINames,\n\t\t\t\t\tnumReviews,\n\t\t\t\t);\n\n\t\t\t\tinstructionCLINames = devCLINames;\n\t\t\t}\n\n\t\t\t// Phase 5: Install External Files (ALWAYS runs)\n\t\t\tawait installExternalFiles(projectRoot, hookAdapters, skipPrompts);\n\n\t\t\t// Add log directory to .gitignore\n\t\t\tawait addToGitignore(projectRoot, \"gauntlet_logs\");\n\n\t\t\t// Phase 6: Instructions\n\t\t\tprintPostInitInstructions(instructionCLINames);\n\t\t});\n}\n\nfunction printNoCLIsMessage(): void {\n\tconsole.log();\n\tconsole.log(chalk.red(\"Error: No CLI agents found. Install at least one:\"));\n\tconsole.log(\" - Claude: https://docs.anthropic.com/en/docs/claude-code\");\n\tconsole.log(\" - Gemini: https://github.com/google-gemini/gemini-cli\");\n\tconsole.log(\" - Codex: https://github.com/openai/codex\");\n\tconsole.log();\n}\n\n/**\n * Phase 4: Scaffold the .gauntlet/ directory.\n * If .gauntlet/ already exists, skip scaffolding entirely.\n * No early return — Phase 5 always runs after this.\n */\nasync function scaffoldGauntletDir(\n\t_projectRoot: string,\n\ttargetDir: string,\n\treviewCLINames: string[],\n\tnumReviews: number,\n): Promise<void> {\n\tif (await exists(targetDir)) {\n\t\tconsole.log(chalk.dim(\".gauntlet/ already exists, skipping scaffolding\"));\n\t\treturn;\n\t}\n\n\t// Create base directory structure\n\tawait fs.mkdir(targetDir);\n\tawait fs.mkdir(path.join(targetDir, \"checks\"));\n\tawait fs.mkdir(path.join(targetDir, \"reviews\"));\n\n\t// Generate config.yml\n\tawait writeConfigYml(targetDir, reviewCLINames);\n\n\t// Default code review\n\tawait fs.writeFile(\n\t\tpath.join(targetDir, \"reviews\", \"code-quality.yml\"),\n\t\t`builtin: code-quality\\nnum_reviews: ${numReviews}\\n`,\n\t);\n\tconsole.log(chalk.green(\"Created .gauntlet/reviews/code-quality.yml\"));\n}\n\n/**\n * Write a skill's SKILL.md and optional reference files into a directory.\n */\nasync function writeSkillFiles(\n\tactionDir: string,\n\tcontent: string,\n\treferences: Record<string, string> | undefined,\n): Promise<void> {\n\tawait fs.mkdir(actionDir, { recursive: true });\n\tawait fs.writeFile(path.join(actionDir, \"SKILL.md\"), content);\n\tif (references) {\n\t\tconst refsDir = path.join(actionDir, \"references\");\n\t\tawait fs.mkdir(refsDir, { recursive: true });\n\t\tfor (const [fileName, fileContent] of Object.entries(references)) {\n\t\t\tawait fs.writeFile(path.join(refsDir, fileName), fileContent);\n\t\t}\n\t}\n}\n\n/**\n * Install or update skills using checksum-based comparison.\n */\nasync function installSkillsWithChecksums(\n\tprojectRoot: string,\n\tskipPrompts: boolean,\n): Promise<void> {\n\tconst skillsDir = path.join(projectRoot, \".claude\", \"skills\");\n\tfor (const skill of SKILL_DEFINITIONS) {\n\t\tconst actionDir = path.join(skillsDir, `gauntlet-${skill.action}`);\n\t\tconst skillPath = path.join(actionDir, \"SKILL.md\");\n\t\tconst references =\n\t\t\t\"references\" in skill\n\t\t\t\t? (skill.references as Record<string, string>)\n\t\t\t\t: undefined;\n\n\t\tif (!(await exists(actionDir))) {\n\t\t\tawait writeSkillFiles(actionDir, skill.content, references);\n\t\t\tconsole.log(\n\t\t\t\tchalk.green(`Created ${path.relative(projectRoot, skillPath)}`),\n\t\t\t);\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst expectedChecksum = computeExpectedSkillChecksum(\n\t\t\tskill.content,\n\t\t\treferences,\n\t\t);\n\t\tconst actualChecksum = await computeSkillChecksum(actionDir);\n\t\tif (expectedChecksum === actualChecksum) continue;\n\n\t\tconst shouldOverwrite = await promptFileOverwrite(\n\t\t\t`gauntlet-${skill.action}`,\n\t\t\tskipPrompts,\n\t\t);\n\t\tif (!shouldOverwrite) continue;\n\n\t\t// Clean and rewrite to remove stale files\n\t\tawait fs.rm(actionDir, { recursive: true, force: true });\n\t\tawait writeSkillFiles(actionDir, skill.content, references);\n\t\tconsole.log(\n\t\t\tchalk.green(`Updated ${path.relative(projectRoot, skillPath)}`),\n\t\t);\n\t}\n}\n\n/**\n * Install or update hooks for a single adapter + kind using checksum-based comparison.\n */\nasync function installHookWithChecksums(\n\ttarget: HookTarget,\n\tskipPrompts: boolean,\n): Promise<void> {\n\tconst spec = buildHookSpec(target);\n\n\tlet existingConfig: Record<string, unknown> = {};\n\tif (await exists(spec.config.filePath)) {\n\t\ttry {\n\t\t\texistingConfig = JSON.parse(\n\t\t\t\tawait fs.readFile(spec.config.filePath, \"utf-8\"),\n\t\t\t);\n\t\t} catch {\n\t\t\texistingConfig = {};\n\t\t}\n\t}\n\n\tconst existingHooks = (existingConfig.hooks as Record<string, unknown>) || {};\n\tconst existingEntries = Array.isArray(existingHooks[spec.config.hookKey])\n\t\t? (existingHooks[spec.config.hookKey] as Record<string, unknown>[])\n\t\t: [];\n\n\tconst gauntletEntries = existingEntries.filter((e) => isGauntletHookEntry(e));\n\n\t// No existing gauntlet entries — install normally\n\tif (gauntletEntries.length === 0) {\n\t\tawait installHookWithLog(spec.config, spec.installedMsg, spec.existsMsg);\n\t\treturn;\n\t}\n\n\t// Build expected entries for comparison\n\tconst expectedEntry = spec.config.wrapInHooksArray\n\t\t? { hooks: [spec.config.hookEntry] }\n\t\t: spec.config.hookEntry;\n\tconst expectedChecksum = computeExpectedHookChecksum([\n\t\texpectedEntry as Record<string, unknown>,\n\t]);\n\tconst actualChecksum = computeHookChecksum(existingEntries);\n\n\tif (expectedChecksum === actualChecksum) {\n\t\tconsole.log(chalk.dim(spec.existsMsg));\n\t\treturn;\n\t}\n\n\tconst shouldOverwrite = await promptHookOverwrite(\n\t\tspec.config.filePath,\n\t\tskipPrompts,\n\t);\n\tif (!shouldOverwrite) {\n\t\tconsole.log(chalk.dim(spec.existsMsg));\n\t\treturn;\n\t}\n\n\t// Remove old gauntlet entries, then re-add\n\tconst nonGauntletEntries = existingEntries.filter(\n\t\t(e) => !isGauntletHookEntry(e),\n\t);\n\tconst entryToAdd = spec.config.wrapInHooksArray\n\t\t? { hooks: [spec.config.hookEntry] }\n\t\t: spec.config.hookEntry;\n\tconst newEntries = [...nonGauntletEntries, entryToAdd];\n\n\tconst merged: Record<string, unknown> = {\n\t\t...(spec.config.baseConfig ?? {}),\n\t\t...existingConfig,\n\t\thooks: {\n\t\t\t...existingHooks,\n\t\t\t[spec.config.hookKey]: newEntries,\n\t\t},\n\t};\n\tawait fs.mkdir(path.dirname(spec.config.filePath), { recursive: true });\n\tawait fs.writeFile(\n\t\tspec.config.filePath,\n\t\t`${JSON.stringify(merged, null, 2)}\\n`,\n\t);\n\tconsole.log(chalk.green(spec.installedMsg));\n}\n\n/**\n * Phase 5: Install external files (skills + hooks).\n * Always runs, even if .gauntlet/ already existed.\n */\nasync function installExternalFiles(\n\tprojectRoot: string,\n\tdevAdapters: CLIAdapter[],\n\tskipPrompts: boolean,\n): Promise<void> {\n\tawait installSkillsWithChecksums(projectRoot, skipPrompts);\n\tawait copyStatusScript(path.join(projectRoot, \".gauntlet\"));\n\n\tfor (const adapter of devAdapters) {\n\t\tif (!adapter.supportsHooks()) continue;\n\t\tif (adapter.name !== \"claude\" && adapter.name !== \"cursor\") continue;\n\t\tfor (const kind of [\"stop\", \"start\"] as const) {\n\t\t\tconst target: HookTarget = {\n\t\t\t\tprojectRoot,\n\t\t\t\tvariant: adapter.name,\n\t\t\t\tkind,\n\t\t\t};\n\t\t\tawait installHookWithChecksums(target, skipPrompts);\n\t\t}\n\t}\n}\n\n/**\n * Phase 6: Print post-init instructions based on detected CLIs.\n */\nfunction printPostInitInstructions(devCLINames: string[]): void {\n\tconst hasNative = devCLINames.some((name) => NATIVE_CLIS.has(name));\n\tconst nonNativeNames = devCLINames.filter((name) => !NATIVE_CLIS.has(name));\n\tconst hasNonNative = nonNativeNames.length > 0;\n\n\tconsole.log();\n\tif (hasNative) {\n\t\tconsole.log(\n\t\t\tchalk.bold(\n\t\t\t\t\"To complete setup, run /gauntlet-setup in your CLI. This will guide you through configuring the static checks (unit tests, linters, etc.) that Agent Gauntlet will run.\",\n\t\t\t),\n\t\t);\n\t}\n\tif (hasNonNative) {\n\t\tconsole.log(\n\t\t\tchalk.bold(\n\t\t\t\t\"To complete setup, reference the setup skill in your CLI: @.claude/skills/gauntlet-setup/SKILL.md. This will guide you through configuring the static checks (unit tests, linters, etc.) that Agent Gauntlet will run.\",\n\t\t\t),\n\t\t);\n\t\tconsole.log();\n\t\tconsole.log(\"Available skills:\");\n\t\tfor (const s of SKILL_DEFINITIONS) {\n\t\t\tconsole.log(\n\t\t\t\t` @.claude/skills/gauntlet-${s.action}/SKILL.md — ${s.description}`,\n\t\t\t);\n\t\t}\n\t}\n}\n\nasync function writeConfigYml(\n\ttargetDir: string,\n\treviewCLINames: string[],\n): Promise<void> {\n\tconst baseBranch = await detectBaseBranch();\n\tconst cliList = reviewCLINames.map((name) => ` - ${name}`).join(\"\\n\");\n\tconst adapterSettings = buildAdapterSettingsBlock(reviewCLINames);\n\n\tconst content = `# Ordered list of CLI agents to try for reviews\ncli:\n default_preference:\n${cliList}\n${adapterSettings}\n# entry_points configured by /gauntlet-setup\nentry_points: []\n\n# -------------------------------------------------------------------\n# All settings below are optional. Uncomment and change as needed.\n# -------------------------------------------------------------------\n\n# Git ref for detecting local changes via git diff (default: origin/main)\n# base_branch: ${baseBranch}\n\n# Directory for per-job logs (default: gauntlet_logs)\n# log_dir: gauntlet_logs\n\n# Run gates in parallel when possible (default: true)\n# allow_parallel: true\n\n# Maximum retry attempts before declaring \"Retry limit exceeded\" (default: 3)\n# max_retries: 3\n\n# Archived session directories to keep during log rotation (default: 3, 0 = disable)\n# max_previous_logs: 3\n\n# Priority threshold for filtering new violations during reruns (default: medium)\n# Options: critical, high, medium, low\n# rerun_new_issue_threshold: medium\n\n# Stop hook — auto-run gauntlet when the agent stops\n# Precedence: env vars > project config > global config (~/.config/agent-gauntlet/config.yml)\n# Env overrides: GAUNTLET_STOP_HOOK_ENABLED, GAUNTLET_STOP_HOOK_INTERVAL_MINUTES,\n# GAUNTLET_AUTO_PUSH_PR, GAUNTLET_AUTO_FIX_PR\n# stop_hook:\n# enabled: false\n# run_interval_minutes: 5 # Minimum minutes between runs (0 = always run)\n# auto_push_pr: false # Check/create PR after gates pass\n# auto_fix_pr: false # Wait for CI checks after PR (requires auto_push_pr)\n\n# Debug log — persistent debug logging to .debug.log\n# debug_log:\n# enabled: false\n# max_size_mb: 10 # Max size before rotation to .debug.log.1\n\n# Structured logging via LogTape\n# logging:\n# level: debug # Options: debug, info, warning, error\n# console:\n# enabled: true\n# format: pretty # Options: pretty, json\n# file:\n# enabled: true\n# format: text # Options: text, json\n`;\n\tawait fs.writeFile(path.join(targetDir, \"config.yml\"), content);\n\tconsole.log(chalk.green(\"Created .gauntlet/config.yml\"));\n}\n\n/**\n * Append an entry to .gitignore if it isn't already present.\n */\nasync function addToGitignore(\n\tprojectRoot: string,\n\tentry: string,\n): Promise<void> {\n\tconst gitignorePath = path.join(projectRoot, \".gitignore\");\n\n\tlet content = \"\";\n\tif (await exists(gitignorePath)) {\n\t\tcontent = await fs.readFile(gitignorePath, \"utf-8\");\n\t\tconst lines = content.split(\"\\n\").map((l) => l.trim());\n\t\tif (lines.includes(entry)) {\n\t\t\treturn;\n\t\t}\n\t}\n\n\tconst suffix = content.length > 0 && !content.endsWith(\"\\n\") ? \"\\n\" : \"\";\n\tawait fs.appendFile(gitignorePath, `${suffix}${entry}\\n`);\n\tconsole.log(chalk.green(`Added ${entry} to .gitignore`));\n}\n\nfunction gitSilent(args: string[], opts?: { timeout?: number }): string | null {\n\tconst { execFileSync } = require(\"node:child_process\");\n\ttry {\n\t\treturn (\n\t\t\texecFileSync(\"git\", args, {\n\t\t\t\tencoding: \"utf-8\",\n\t\t\t\ttimeout: opts?.timeout,\n\t\t\t\tstdio: [\"pipe\", \"pipe\", \"ignore\"],\n\t\t\t}) as string\n\t\t).trim();\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nasync function detectBaseBranch(): Promise<string> {\n\t// Fetch the remote's default branch from the server and cache it locally\n\tgitSilent([\"remote\", \"set-head\", \"origin\", \"--auto\"], { timeout: 5000 });\n\n\t// Read the (possibly just-updated) cached remote HEAD\n\tconst ref = gitSilent([\"symbolic-ref\", \"refs/remotes/origin/HEAD\"]);\n\tif (ref) {\n\t\treturn ref.replace(\"refs/remotes/\", \"\");\n\t}\n\n\t// Check which common default branches actually exist locally\n\tfor (const candidate of [\"origin/main\", \"origin/master\"]) {\n\t\tif (gitSilent([\"rev-parse\", \"--verify\", candidate]) !== null) {\n\t\t\treturn candidate;\n\t\t}\n\t}\n\n\treturn \"origin/main\";\n}\n\nfunction buildAdapterSettingsBlock(adapterNames: string[]): string {\n\tconst items = adapterNames.filter((name) => ADAPTER_CONFIG[name]);\n\tif (items.length === 0) return \"\";\n\tconst lines = items.map((name) => {\n\t\tconst c = ADAPTER_CONFIG[name];\n\t\treturn ` ${name}:\\n allow_tool_use: ${c?.allow_tool_use}\\n thinking_budget: ${c?.thinking_budget}`;\n\t});\n\treturn ` # Recommended settings (see docs/eval-results.md)\\n adapters:\\n${lines.join(\"\\n\")}\\n`;\n}\n\nasync function detectAvailableCLIs(): Promise<CLIAdapter[]> {\n\tconst allAdapters = [...getAllAdapters()].sort(\n\t\t(a, b) =>\n\t\t\tCLI_PREFERENCE_ORDER.indexOf(a.name) -\n\t\t\tCLI_PREFERENCE_ORDER.indexOf(b.name),\n\t);\n\tconst available: CLIAdapter[] = [];\n\n\tfor (const adapter of allAdapters) {\n\t\tconst isAvailable = await adapter.isAvailable();\n\t\tif (isAvailable) {\n\t\t\tconsole.log(chalk.green(` \\u2713 ${adapter.name}`));\n\t\t\tavailable.push(adapter);\n\t\t} else {\n\t\t\tconsole.log(chalk.dim(` \\u2717 ${adapter.name} (not installed)`));\n\t\t}\n\t}\n\treturn available;\n}\n\n/**\n * Copy the status script into .gauntlet/scripts/.\n * The script is sourced from the package's src/scripts/status.ts.\n */\nasync function copyStatusScript(targetDir: string): Promise<void> {\n\tconst statusScriptDir = path.join(targetDir, \"scripts\");\n\tconst statusScriptPath = path.join(statusScriptDir, \"status.ts\");\n\tawait fs.mkdir(statusScriptDir, { recursive: true });\n\n\tif (await exists(statusScriptPath)) return;\n\n\tconst bundledScript = path.join(\n\t\tpath.dirname(new URL(import.meta.url).pathname),\n\t\t\"..\",\n\t\t\"scripts\",\n\t\t\"status.ts\",\n\t);\n\tif (await exists(bundledScript)) {\n\t\tawait fs.copyFile(bundledScript, statusScriptPath);\n\t\tconsole.log(chalk.green(\"Created .gauntlet/scripts/status.ts\"));\n\t} else {\n\t\tconsole.log(\n\t\t\tchalk.yellow(\n\t\t\t\t\"Warning: bundled status script not found; /gauntlet-status may fail.\",\n\t\t\t),\n\t\t);\n\t}\n}\n\n/**\n * Check whether a command string already exists in a hook entries array.\n * Handles both flat format (hook.command) and nested format (hook.hooks[].command).\n */\nfunction hookHasCommand(\n\tentries: Record<string, unknown>[],\n\tcmd: string,\n): boolean {\n\treturn entries.some((hook) => {\n\t\tif (hook.command === cmd) return true;\n\t\tconst nested = hook.hooks as { command?: string }[] | undefined;\n\t\treturn Array.isArray(nested) && nested.some((h) => h.command === cmd);\n\t});\n}\n\n/**\n * Shared helper: read/create a JSON config file, merge a hook entry under the\n * given hookKey, deduplicate, and write back. Returns true if the entry was\n * added, false if it was already present.\n */\nexport async function mergeHookConfig(opts: {\n\tfilePath: string;\n\thookKey: string;\n\thookEntry: Record<string, unknown>;\n\tdeduplicateCmd: string;\n\twrapInHooksArray: boolean;\n\tbaseConfig?: Record<string, unknown>;\n}): Promise<boolean> {\n\tconst {\n\t\tfilePath,\n\t\thookKey,\n\t\thookEntry,\n\t\tdeduplicateCmd,\n\t\twrapInHooksArray,\n\t\tbaseConfig,\n\t} = opts;\n\n\t// Ensure parent directory exists\n\tawait fs.mkdir(path.dirname(filePath), { recursive: true });\n\n\tlet existing: Record<string, unknown> = {};\n\tif (await exists(filePath)) {\n\t\ttry {\n\t\t\texisting = JSON.parse(await fs.readFile(filePath, \"utf-8\"));\n\t\t} catch {\n\t\t\texisting = {};\n\t\t}\n\t}\n\n\tconst existingHooks = (existing.hooks as Record<string, unknown>) || {};\n\tconst existingEntries = Array.isArray(existingHooks[hookKey])\n\t\t? (existingHooks[hookKey] as Record<string, unknown>[])\n\t\t: [];\n\n\tif (hookHasCommand(existingEntries, deduplicateCmd)) {\n\t\treturn false;\n\t}\n\n\t// Wrap entry if needed (Claude Code format wraps in { hooks: [...] })\n\tconst entryToAdd = wrapInHooksArray ? { hooks: [hookEntry] } : hookEntry;\n\n\tconst newEntries = [...existingEntries, entryToAdd];\n\n\tconst merged: Record<string, unknown> = {\n\t\t...(baseConfig ?? {}),\n\t\t...existing,\n\t\thooks: {\n\t\t\t...existingHooks,\n\t\t\t[hookKey]: newEntries,\n\t\t},\n\t};\n\n\tawait fs.writeFile(filePath, `${JSON.stringify(merged, null, 2)}\\n`);\n\treturn true;\n}\n\n/**\n * The start hook configuration for Claude Code.\n */\nconst START_HOOK_ENTRY = {\n\tmatcher: \"startup|resume|clear|compact\",\n\thooks: [\n\t\t{\n\t\t\ttype: \"command\",\n\t\t\tcommand: \"agent-gauntlet start-hook\",\n\t\t\tasync: false,\n\t\t},\n\t],\n} as const;\n\n/**\n * The start hook configuration for Cursor.\n */\nconst CURSOR_START_HOOK_ENTRY = {\n\tcommand: \"agent-gauntlet start-hook --adapter cursor\",\n} as const;\n\n/**\n * The stop hook configuration for Claude Code.\n */\nconst STOP_HOOK_ENTRY = {\n\ttype: \"command\",\n\tcommand: \"agent-gauntlet stop-hook\",\n\ttimeout: 300,\n} as const;\n\n/**\n * The stop hook configuration for Cursor.\n */\nconst CURSOR_STOP_HOOK_ENTRY = {\n\tcommand: \"agent-gauntlet stop-hook\",\n\tloop_limit: 10,\n} as const;\n\n/**\n * Install a hook and log the result.\n */\nasync function installHookWithLog(\n\tconfig: Parameters<typeof mergeHookConfig>[0],\n\tinstalledMsg: string,\n\texistsMsg: string,\n): Promise<void> {\n\tconst added = await mergeHookConfig(config);\n\tconsole.log(added ? chalk.green(installedMsg) : chalk.dim(existsMsg));\n}\n\ninterface HookInstallSpec {\n\tconfig: Parameters<typeof mergeHookConfig>[0];\n\tinstalledMsg: string;\n\texistsMsg: string;\n}\n\nfunction buildHookSpec(target: HookTarget): HookInstallSpec {\n\tconst { projectRoot, variant, kind } = target;\n\tconst isCursor = variant === \"cursor\";\n\tconst isStop = kind === \"stop\";\n\tconst hookConfigs = {\n\t\t\"claude-stop\": {\n\t\t\tdir: \".claude\",\n\t\t\tfile: \"settings.local.json\",\n\t\t\thookKey: \"Stop\",\n\t\t\tentry: STOP_HOOK_ENTRY as Record<string, unknown>,\n\t\t\tcmd: \"agent-gauntlet stop-hook\",\n\t\t\twrap: true,\n\t\t},\n\t\t\"cursor-stop\": {\n\t\t\tdir: \".cursor\",\n\t\t\tfile: \"hooks.json\",\n\t\t\thookKey: \"stop\",\n\t\t\tentry: CURSOR_STOP_HOOK_ENTRY as Record<string, unknown>,\n\t\t\tcmd: \"agent-gauntlet stop-hook\",\n\t\t\twrap: false,\n\t\t},\n\t\t\"claude-start\": {\n\t\t\tdir: \".claude\",\n\t\t\tfile: \"settings.local.json\",\n\t\t\thookKey: \"SessionStart\",\n\t\t\tentry: START_HOOK_ENTRY as Record<string, unknown>,\n\t\t\tcmd: \"agent-gauntlet start-hook\",\n\t\t\twrap: false,\n\t\t},\n\t\t\"cursor-start\": {\n\t\t\tdir: \".cursor\",\n\t\t\tfile: \"hooks.json\",\n\t\t\thookKey: \"sessionStart\",\n\t\t\tentry: CURSOR_START_HOOK_ENTRY as Record<string, unknown>,\n\t\t\tcmd: \"agent-gauntlet start-hook --adapter cursor\",\n\t\t\twrap: false,\n\t\t},\n\t} as const;\n\n\tconst key = `${variant}-${kind}` as keyof typeof hookConfigs;\n\tconst cfg = hookConfigs[key];\n\tconst prefix = isCursor ? \"Cursor \" : \"\";\n\tconst kindLabel = isCursor ? kind : isStop ? \"Stop\" : \"Start\";\n\tconst purpose = isStop\n\t\t? \"gauntlet will run automatically when agent stops\"\n\t\t: \"agent will be primed with gauntlet instructions at session start\";\n\n\treturn {\n\t\tconfig: {\n\t\t\tfilePath: path.join(projectRoot, cfg.dir, cfg.file),\n\t\t\thookKey: cfg.hookKey,\n\t\t\thookEntry: cfg.entry,\n\t\t\tdeduplicateCmd: cfg.cmd,\n\t\t\twrapInHooksArray: cfg.wrap,\n\t\t\t...(isCursor ? { baseConfig: { version: 1 } } : {}),\n\t\t},\n\t\tinstalledMsg: `${prefix}${kindLabel} hook installed - ${purpose}`,\n\t\texistsMsg: `${prefix}${kindLabel} hook already installed`,\n\t};\n}\n\nasync function installHookBySpec(target: HookTarget): Promise<void> {\n\tconst spec = buildHookSpec(target);\n\tawait installHookWithLog(spec.config, spec.installedMsg, spec.existsMsg);\n}\n\nexport async function installStopHook(projectRoot: string): Promise<void> {\n\tawait installHookBySpec({ projectRoot, variant: \"claude\", kind: \"stop\" });\n}\n\nexport async function installCursorStopHook(\n\tprojectRoot: string,\n): Promise<void> {\n\tawait installHookBySpec({ projectRoot, variant: \"cursor\", kind: \"stop\" });\n}\n\nexport async function installStartHook(projectRoot: string): Promise<void> {\n\tawait installHookBySpec({ projectRoot, variant: \"claude\", kind: \"start\" });\n}\n\nexport async function installCursorStartHook(\n\tprojectRoot: string,\n): Promise<void> {\n\tawait installHookBySpec({ projectRoot, variant: \"cursor\", kind: \"start\" });\n}\n",
|
|
54
|
+
"import { createHash } from \"node:crypto\";\nimport fs from \"node:fs/promises\";\nimport path from \"node:path\";\n\n/**\n * Compute SHA-256 checksum of all files in a skill directory.\n * Files are sorted by relative path for determinism.\n */\nexport async function computeSkillChecksum(skillDir: string): Promise<string> {\n\tconst files = await collectFiles(skillDir);\n\tfiles.sort((a, b) => a.relativePath.localeCompare(b.relativePath));\n\n\tconst hash = createHash(\"sha256\");\n\tfor (const file of files) {\n\t\thash.update(file.relativePath);\n\t\thash.update(file.content);\n\t}\n\treturn hash.digest(\"hex\");\n}\n\n/**\n * Compute the expected checksum for a skill from its template content\n * and references (without needing files on disk).\n */\nexport function computeExpectedSkillChecksum(\n\tcontent: string,\n\treferences?: Record<string, string>,\n): string {\n\tconst entries: { relativePath: string; content: string }[] = [\n\t\t{ relativePath: \"SKILL.md\", content },\n\t];\n\tif (references) {\n\t\tfor (const [name, refContent] of Object.entries(references)) {\n\t\t\tentries.push({\n\t\t\t\trelativePath: path.join(\"references\", name),\n\t\t\t\tcontent: refContent,\n\t\t\t});\n\t\t}\n\t}\n\tentries.sort((a, b) => a.relativePath.localeCompare(b.relativePath));\n\n\tconst hash = createHash(\"sha256\");\n\tfor (const entry of entries) {\n\t\thash.update(entry.relativePath);\n\t\thash.update(entry.content);\n\t}\n\treturn hash.digest(\"hex\");\n}\n\n/**\n * Compute checksum over gauntlet-specific hook entries only.\n */\nexport function computeHookChecksum(\n\tentries: Record<string, unknown>[],\n): string {\n\tconst gauntletEntries = entries.filter((entry) => isGauntletHookEntry(entry));\n\tconst hash = createHash(\"sha256\");\n\thash.update(JSON.stringify(gauntletEntries));\n\treturn hash.digest(\"hex\");\n}\n\n/**\n * Compute the expected checksum for hook entries from their definitions.\n */\nexport function computeExpectedHookChecksum(\n\thookEntries: Record<string, unknown>[],\n): string {\n\treturn computeHookChecksum(hookEntries);\n}\n\n/**\n * Returns true if the hook entry contains an \"agent-gauntlet\" command.\n */\nexport function isGauntletHookEntry(entry: Record<string, unknown>): boolean {\n\tif (\n\t\ttypeof entry.command === \"string\" &&\n\t\tentry.command.startsWith(\"agent-gauntlet\")\n\t) {\n\t\treturn true;\n\t}\n\tconst nested = entry.hooks as { command?: string }[] | undefined;\n\tif (Array.isArray(nested)) {\n\t\treturn nested.some(\n\t\t\t(h) =>\n\t\t\t\ttypeof h.command === \"string\" && h.command.startsWith(\"agent-gauntlet\"),\n\t\t);\n\t}\n\treturn false;\n}\n\nasync function collectFiles(\n\tdir: string,\n\tbaseDir?: string,\n): Promise<{ relativePath: string; content: string }[]> {\n\tconst base = baseDir ?? dir;\n\tconst results: { relativePath: string; content: string }[] = [];\n\tconst entries = await fs.readdir(dir, { withFileTypes: true });\n\n\tfor (const entry of entries) {\n\t\tconst fullPath = path.join(dir, entry.name);\n\t\tif (entry.isDirectory()) {\n\t\t\tresults.push(...(await collectFiles(fullPath, base)));\n\t\t} else if (entry.isFile()) {\n\t\t\tconst content = await fs.readFile(fullPath, \"utf-8\");\n\t\t\tresults.push({ relativePath: path.relative(base, fullPath), content });\n\t\t}\n\t}\n\treturn results;\n}\n",
|
|
55
|
+
"import { checkbox, confirm, number } from \"@inquirer/prompts\";\nimport chalk from \"chalk\";\n\nexport async function promptDevCLIs(\n\tdetectedNames: string[],\n\tskipPrompts: boolean,\n): Promise<string[]> {\n\tif (skipPrompts) return detectedNames;\n\n\tconsole.log();\n\tconsole.log(\n\t\tchalk.bold(\n\t\t\t\"Select your development CLI(s). These are the main tools you work in.\",\n\t\t),\n\t);\n\tconst selected = await checkbox({\n\t\tmessage: \"Development CLIs:\",\n\t\tchoices: detectedNames.map((name) => ({ name, value: name })),\n\t\trequired: true,\n\t});\n\treturn selected;\n}\n\nexport async function promptReviewCLIs(\n\tdetectedNames: string[],\n\tskipPrompts: boolean,\n): Promise<string[]> {\n\tif (skipPrompts) return detectedNames;\n\n\tconsole.log();\n\tconsole.log(\n\t\tchalk.bold(\n\t\t\t\"Select your reviewer CLI(s). These are the CLIs that will be used for AI code reviews.\",\n\t\t),\n\t);\n\tconst selected = await checkbox({\n\t\tmessage: \"Review CLIs:\",\n\t\tchoices: detectedNames.map((name) => ({ name, value: name })),\n\t\trequired: true,\n\t});\n\treturn selected;\n}\n\nexport async function promptNumReviews(\n\treviewCliCount: number,\n\tskipPrompts: boolean,\n): Promise<number> {\n\tif (reviewCliCount === 1) return 1;\n\tif (skipPrompts) return reviewCliCount;\n\n\tconst result = await number({\n\t\tmessage: \"How many of these CLIs would you like to run on every review?\",\n\t\tmin: 1,\n\t\tmax: reviewCliCount,\n\t\tdefault: 1,\n\t});\n\treturn result ?? 1;\n}\n\nexport async function promptFileOverwrite(\n\tname: string,\n\tskipPrompts: boolean,\n): Promise<boolean> {\n\tif (skipPrompts) return true;\n\n\treturn confirm({\n\t\tmessage: `Skill \\`${name}\\` has changed, update it?`,\n\t\tdefault: true,\n\t});\n}\n\nexport async function promptHookOverwrite(\n\thookFile: string,\n\tskipPrompts: boolean,\n): Promise<boolean> {\n\tif (skipPrompts) return true;\n\n\treturn confirm({\n\t\tmessage: `Hook configuration in ${hookFile} has changed, update it?`,\n\t\tdefault: true,\n\t});\n}\n",
|
|
54
56
|
"import chalk from \"chalk\";\nimport type { Command } from \"commander\";\nimport { loadConfig } from \"../config/loader.js\";\n\nexport function registerListCommand(program: Command): void {\n\tprogram\n\t\t.command(\"list\")\n\t\t.description(\"List configured gates\")\n\t\t.action(async () => {\n\t\t\ttry {\n\t\t\t\tconst config = await loadConfig();\n\t\t\t\tconsole.log(chalk.bold(\"Check Gates:\"));\n\t\t\t\tObject.values(config.checks).forEach((c) => {\n\t\t\t\t\tconsole.log(` - ${c.name}`);\n\t\t\t\t});\n\n\t\t\t\tconsole.log(chalk.bold(\"\\nReview Gates:\"));\n\t\t\t\tObject.values(config.reviews).forEach((r) => {\n\t\t\t\t\tconsole.log(` - ${r.name} (Tools: ${r.cli_preference?.join(\", \")})`);\n\t\t\t\t});\n\n\t\t\t\tconsole.log(chalk.bold(\"\\nEntry Points:\"));\n\t\t\t\tconfig.project.entry_points.forEach((ep) => {\n\t\t\t\t\tconsole.log(` - ${ep.path}`);\n\t\t\t\t\tif (ep.checks) console.log(` Checks: ${ep.checks.join(\", \")}`);\n\t\t\t\t\tif (ep.reviews) console.log(` Reviews: ${ep.reviews.join(\", \")}`);\n\t\t\t\t});\n\t\t\t} catch (error: unknown) {\n\t\t\t\tconst err = error as { message?: string };\n\t\t\t\tconsole.error(chalk.red(\"Error:\"), err.message);\n\t\t\t}\n\t\t});\n}\n",
|
|
55
57
|
"import chalk from \"chalk\";\nimport type { Command } from \"commander\";\nimport { loadGlobalConfig } from \"../config/global.js\";\nimport { loadConfig } from \"../config/loader.js\";\nimport { ChangeDetector } from \"../core/change-detector.js\";\nimport { EntryPointExpander } from \"../core/entry-point.js\";\nimport { JobGenerator } from \"../core/job.js\";\nimport { Runner } from \"../core/runner.js\";\nimport { ConsoleReporter } from \"../output/console.js\";\nimport {\n\ttype ConsoleLogHandle,\n\tstartConsoleLog,\n} from \"../output/console-log.js\";\nimport { Logger } from \"../output/logger.js\";\nimport {\n\tgetDebugLogger,\n\tinitDebugLogger,\n\tmergeDebugLogConfig,\n} from \"../utils/debug-log.js\";\nimport {\n\treadExecutionState,\n\tresolveFixBase,\n\twriteExecutionState,\n} from \"../utils/execution-state.js\";\nimport {\n\tfindPreviousFailures,\n\ttype PassedSlot,\n\ttype PreviousViolation,\n} from \"../utils/log-parser.js\";\nimport {\n\tacquireLock,\n\tcleanLogs,\n\thasExistingLogs,\n\tperformAutoClean,\n\treleaseLock,\n\tshouldAutoClean,\n} from \"./shared.js\";\n\nexport function registerReviewCommand(program: Command): void {\n\tprogram\n\t\t.command(\"review\")\n\t\t.description(\"Run only applicable reviews for detected changes\")\n\t\t.option(\n\t\t\t\"-b, --base-branch <branch>\",\n\t\t\t\"Override base branch for change detection\",\n\t\t)\n\t\t.option(\"-g, --gate <name>\", \"Run specific review gate only\")\n\t\t.option(\"-c, --commit <sha>\", \"Use diff for a specific commit\")\n\t\t.option(\n\t\t\t\"-u, --uncommitted\",\n\t\t\t\"Use diff for current uncommitted changes (staged and unstaged)\",\n\t\t)\n\t\t.action(async (options) => {\n\t\t\tlet config: Awaited<ReturnType<typeof loadConfig>> | undefined;\n\t\t\tlet lockAcquired = false;\n\t\t\tlet restoreConsole: ConsoleLogHandle | undefined;\n\t\t\ttry {\n\t\t\t\tconfig = await loadConfig();\n\n\t\t\t\t// Initialize debug logger\n\t\t\t\tconst globalConfig = await loadGlobalConfig();\n\t\t\t\tconst debugLogConfig = mergeDebugLogConfig(\n\t\t\t\t\tconfig.project.debug_log,\n\t\t\t\t\tglobalConfig.debug_log,\n\t\t\t\t);\n\t\t\t\tinitDebugLogger(config.project.log_dir, debugLogConfig);\n\n\t\t\t\t// Log the command invocation\n\t\t\t\tconst debugLogger = getDebugLogger();\n\t\t\t\tconst args = [\n\t\t\t\t\toptions.baseBranch ? `-b ${options.baseBranch}` : \"\",\n\t\t\t\t\toptions.gate ? `-g ${options.gate}` : \"\",\n\t\t\t\t\toptions.commit ? `-c ${options.commit}` : \"\",\n\t\t\t\t\toptions.uncommitted ? \"-u\" : \"\",\n\t\t\t\t].filter(Boolean);\n\t\t\t\tawait debugLogger?.logCommand(\"review\", args);\n\n\t\t\t\t// Determine effective base branch first (needed for auto-clean)\n\t\t\t\tconst effectiveBaseBranch =\n\t\t\t\t\toptions.baseBranch ||\n\t\t\t\t\t(process.env.GITHUB_BASE_REF &&\n\t\t\t\t\t(process.env.CI === \"true\" || process.env.GITHUB_ACTIONS === \"true\")\n\t\t\t\t\t\t? process.env.GITHUB_BASE_REF\n\t\t\t\t\t\t: null) ||\n\t\t\t\t\tconfig.project.base_branch;\n\n\t\t\t\t// Auto-clean on context change (branch changed, commit merged)\n\t\t\t\tconst autoCleanResult = await shouldAutoClean(\n\t\t\t\t\tconfig.project.log_dir,\n\t\t\t\t\teffectiveBaseBranch,\n\t\t\t\t);\n\t\t\t\tif (autoCleanResult.clean) {\n\t\t\t\t\tconsole.log(\n\t\t\t\t\t\tchalk.dim(`Auto-cleaning logs (${autoCleanResult.reason})...`),\n\t\t\t\t\t);\n\t\t\t\t\tawait debugLogger?.logClean(\n\t\t\t\t\t\t\"auto\",\n\t\t\t\t\t\tautoCleanResult.reason || \"unknown\",\n\t\t\t\t\t);\n\t\t\t\t\tawait performAutoClean(config.project.log_dir, autoCleanResult);\n\t\t\t\t}\n\n\t\t\t\t// Detect rerun mode after auto-clean (clean may have removed logs)\n\t\t\t\tconst logsExist = await hasExistingLogs(config.project.log_dir);\n\t\t\t\tconst isRerun = logsExist && !options.commit;\n\n\t\t\t\t// Acquire lock BEFORE starting console log (prevents orphaned log files)\n\t\t\t\tawait acquireLock(config.project.log_dir);\n\t\t\t\tlockAcquired = true;\n\n\t\t\t\t// Initialize Logger early to get unified run number for console log\n\t\t\t\tconst logger = new Logger(config.project.log_dir);\n\t\t\t\tawait logger.init();\n\t\t\t\tconst runNumber = logger.getRunNumber();\n\n\t\t\t\trestoreConsole = await startConsoleLog(\n\t\t\t\t\tconfig.project.log_dir,\n\t\t\t\t\trunNumber,\n\t\t\t\t);\n\n\t\t\t\tlet failuresMap:\n\t\t\t\t\t| Map<string, Map<string, PreviousViolation[]>>\n\t\t\t\t\t| undefined;\n\t\t\t\tlet changeOptions:\n\t\t\t\t\t| { commit?: string; uncommitted?: boolean; fixBase?: string }\n\t\t\t\t\t| undefined;\n\n\t\t\t\tlet passedSlotsMap: Map<string, Map<number, PassedSlot>> | undefined;\n\n\t\t\t\tif (isRerun) {\n\t\t\t\t\tconsole.log(\n\t\t\t\t\t\tchalk.dim(\n\t\t\t\t\t\t\t\"Existing logs detected — running in verification mode...\",\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t\tconst { failures: previousFailures, passedSlots } =\n\t\t\t\t\t\tawait findPreviousFailures(\n\t\t\t\t\t\t\tconfig.project.log_dir,\n\t\t\t\t\t\t\toptions.gate,\n\t\t\t\t\t\t\ttrue,\n\t\t\t\t\t\t);\n\n\t\t\t\t\tfailuresMap = new Map();\n\t\t\t\t\tfor (const gateFailure of previousFailures) {\n\t\t\t\t\t\tconst adapterMap = new Map<string, PreviousViolation[]>();\n\t\t\t\t\t\tfor (const af of gateFailure.adapterFailures) {\n\t\t\t\t\t\t\tconst key = af.reviewIndex\n\t\t\t\t\t\t\t\t? String(af.reviewIndex)\n\t\t\t\t\t\t\t\t: af.adapterName;\n\t\t\t\t\t\t\tadapterMap.set(key, af.violations);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tfailuresMap.set(gateFailure.jobId, adapterMap);\n\t\t\t\t\t}\n\n\t\t\t\t\tpassedSlotsMap = passedSlots;\n\n\t\t\t\t\tif (previousFailures.length > 0) {\n\t\t\t\t\t\tconst totalViolations = previousFailures.reduce(\n\t\t\t\t\t\t\t(sum, gf) =>\n\t\t\t\t\t\t\t\tsum +\n\t\t\t\t\t\t\t\tgf.adapterFailures.reduce(\n\t\t\t\t\t\t\t\t\t(s, af) => s + af.violations.length,\n\t\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\tchalk.yellow(\n\t\t\t\t\t\t\t\t`Found ${previousFailures.length} gate(s) with ${totalViolations} previous violation(s)`,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\tchangeOptions = { uncommitted: true };\n\t\t\t\t\t// Use working_tree_ref from execution state for rerun diff scoping\n\t\t\t\t\tconst executionState = await readExecutionState(\n\t\t\t\t\t\tconfig.project.log_dir,\n\t\t\t\t\t);\n\t\t\t\t\tif (executionState?.working_tree_ref) {\n\t\t\t\t\t\tchangeOptions.fixBase = executionState.working_tree_ref;\n\t\t\t\t\t}\n\t\t\t\t} else if (!logsExist) {\n\t\t\t\t\t// Post-clean run: check if execution state has a working_tree_ref to use as fixBase\n\t\t\t\t\tconst executionState = await readExecutionState(\n\t\t\t\t\t\tconfig.project.log_dir,\n\t\t\t\t\t);\n\t\t\t\t\tif (executionState) {\n\t\t\t\t\t\tconst resolved = await resolveFixBase(\n\t\t\t\t\t\t\texecutionState,\n\t\t\t\t\t\t\teffectiveBaseBranch,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (resolved.warning) {\n\t\t\t\t\t\t\tconsole.log(chalk.yellow(`Warning: ${resolved.warning}`));\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (resolved.fixBase) {\n\t\t\t\t\t\t\tchangeOptions = { fixBase: resolved.fixBase };\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Allow explicit commit or uncommitted options to override fixBase\n\t\t\t\tif (options.commit || options.uncommitted) {\n\t\t\t\t\tchangeOptions = {\n\t\t\t\t\t\tcommit: options.commit,\n\t\t\t\t\t\tuncommitted: options.uncommitted,\n\t\t\t\t\t\tfixBase: changeOptions?.fixBase,\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tconst changeDetector = new ChangeDetector(\n\t\t\t\t\teffectiveBaseBranch,\n\t\t\t\t\tchangeOptions || {\n\t\t\t\t\t\tcommit: options.commit,\n\t\t\t\t\t\tuncommitted: options.uncommitted,\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t\tconst expander = new EntryPointExpander();\n\t\t\t\tconst jobGen = new JobGenerator(config);\n\n\t\t\t\tconsole.log(chalk.dim(\"Detecting changes...\"));\n\t\t\t\tconst changes = await changeDetector.getChangedFiles();\n\n\t\t\t\tif (changes.length === 0) {\n\t\t\t\t\tconsole.log(chalk.green(\"No changes detected.\"));\n\t\t\t\t\tawait writeExecutionState(config.project.log_dir);\n\t\t\t\t\tawait releaseLock(config.project.log_dir);\n\t\t\t\t\trestoreConsole?.restore();\n\t\t\t\t\tprocess.exit(0);\n\t\t\t\t}\n\n\t\t\t\tconsole.log(chalk.dim(`Found ${changes.length} changed files.`));\n\n\t\t\t\tconst entryPoints = await expander.expand(\n\t\t\t\t\tconfig.project.entry_points,\n\t\t\t\t\tchanges,\n\t\t\t\t);\n\t\t\t\tlet jobs = jobGen.generateJobs(entryPoints);\n\n\t\t\t\t// Filter to only reviews\n\t\t\t\tjobs = jobs.filter((j) => j.type === \"review\");\n\n\t\t\t\tif (options.gate) {\n\t\t\t\t\tjobs = jobs.filter((j) => j.name === options.gate);\n\t\t\t\t}\n\n\t\t\t\tif (jobs.length === 0) {\n\t\t\t\t\tconsole.log(chalk.yellow(\"No applicable reviews for these changes.\"));\n\t\t\t\t\tawait writeExecutionState(config.project.log_dir);\n\t\t\t\t\tawait releaseLock(config.project.log_dir);\n\t\t\t\t\trestoreConsole?.restore();\n\t\t\t\t\tprocess.exit(0);\n\t\t\t\t}\n\n\t\t\t\tconsole.log(chalk.dim(`Running ${jobs.length} review(s)...`));\n\n\t\t\t\t// Log run start\n\t\t\t\tconst runMode = isRerun ? \"verification\" : \"full\";\n\t\t\t\tawait debugLogger?.logRunStart(runMode, changes.length, jobs.length);\n\n\t\t\t\tconst reporter = new ConsoleReporter();\n\t\t\t\tconst runner = new Runner(\n\t\t\t\t\tconfig,\n\t\t\t\t\tlogger,\n\t\t\t\t\treporter,\n\t\t\t\t\tfailuresMap,\n\t\t\t\t\tchangeOptions,\n\t\t\t\t\teffectiveBaseBranch,\n\t\t\t\t\tpassedSlotsMap,\n\t\t\t\t\tdebugLogger ?? undefined,\n\t\t\t\t\tisRerun,\n\t\t\t\t);\n\n\t\t\t\tconst outcome = await runner.run(jobs);\n\n\t\t\t\t// Log run end with actual statistics from runner\n\t\t\t\tawait debugLogger?.logRunEnd(\n\t\t\t\t\toutcome.allPassed ? \"pass\" : \"fail\",\n\t\t\t\t\toutcome.stats.fixed,\n\t\t\t\t\toutcome.stats.skipped,\n\t\t\t\t\toutcome.stats.failed,\n\t\t\t\t\tlogger.getRunNumber(),\n\t\t\t\t);\n\n\t\t\t\t// Write execution state before releasing lock (for interval checks)\n\t\t\t\t// This now captures working_tree_ref which is used for rerun diff scoping\n\t\t\t\tawait writeExecutionState(config.project.log_dir);\n\n\t\t\t\tif (outcome.allPassed) {\n\t\t\t\t\tawait debugLogger?.logClean(\"auto\", \"all_passed\");\n\t\t\t\t\tawait cleanLogs(config.project.log_dir);\n\t\t\t\t}\n\t\t\t\tawait releaseLock(config.project.log_dir);\n\t\t\t\trestoreConsole?.restore();\n\t\t\t\tprocess.exit(outcome.allPassed ? 0 : 1);\n\t\t\t} catch (error: unknown) {\n\t\t\t\t// Write execution state even on error (if lock was acquired)\n\t\t\t\tif (config && lockAcquired) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait writeExecutionState(config.project.log_dir);\n\t\t\t\t\t} catch {\n\t\t\t\t\t\t// Ignore errors writing state during error handling\n\t\t\t\t\t}\n\t\t\t\t\tawait releaseLock(config.project.log_dir);\n\t\t\t\t}\n\t\t\t\tconst err = error as { message?: string };\n\t\t\t\tconsole.error(chalk.red(\"Error:\"), err.message);\n\t\t\t\trestoreConsole?.restore();\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\t\t});\n}\n",
|
|
56
|
-
"import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport {\n\tcleanLogs,\n\thasExistingLogs,\n\tperformAutoClean,\n\treleaseLock,\n\tshouldAutoClean,\n} from \"../commands/shared.js\";\nimport { loadGlobalConfig } from \"../config/global.js\";\nimport { loadConfig } from \"../config/loader.js\";\nimport { resolveStopHookConfig } from \"../config/stop-hook-config.js\";\nimport {\n\tgetCategoryLogger,\n\tinitLogger,\n\tisLoggerConfigured,\n\tresetLogger,\n} from \"../output/app-logger.js\";\nimport { ConsoleReporter } from \"../output/console.js\";\nimport {\n\ttype ConsoleLogHandle,\n\tstartConsoleLog,\n} from \"../output/console-log.js\";\nimport { Logger } from \"../output/logger.js\";\nimport type { GauntletStatus, RunResult } from \"../types/gauntlet-status.js\";\nimport {\n\tgetDebugLogger,\n\tinitDebugLogger,\n\tmergeDebugLogConfig,\n} from \"../utils/debug-log.js\";\nimport {\n\treadExecutionState,\n\tresolveFixBase,\n\twriteExecutionState,\n} from \"../utils/execution-state.js\";\nimport {\n\tfindPreviousFailures,\n\ttype PassedSlot,\n\ttype PreviousViolation,\n} from \"../utils/log-parser.js\";\nimport { ChangeDetector } from \"./change-detector.js\";\nimport { computeDiffStats } from \"./diff-stats.js\";\nimport { EntryPointExpander } from \"./entry-point.js\";\nimport { JobGenerator } from \"./job.js\";\nimport { Runner } from \"./runner.js\";\n\nconst LOCK_FILENAME = \".gauntlet-run.lock\";\n\nexport interface ExecuteRunOptions {\n\tbaseBranch?: string;\n\tgate?: string;\n\tcommit?: string;\n\tuncommitted?: boolean;\n\t/** Working directory for config loading (defaults to process.cwd()) */\n\tcwd?: string;\n\t/**\n\t * When true, check if run interval has elapsed before proceeding.\n\t * Only stop-hook uses this; CLI commands (run, check, review) always run immediately.\n\t * If interval hasn't elapsed, returns { status: \"interval_not_elapsed\", ... }.\n\t */\n\tcheckInterval?: boolean;\n}\n\n/**\n * Maximum age for a lock file before it's considered stale (10 minutes).\n * Matches the stale marker threshold in stop-hook.ts.\n */\nconst STALE_LOCK_MS = 10 * 60 * 1000;\n\n/**\n * Check if a process with the given PID is still alive.\n */\nfunction isProcessAlive(pid: number): boolean {\n\ttry {\n\t\tprocess.kill(pid, 0); // Signal 0 = check existence without killing\n\t\treturn true;\n\t} catch (err: unknown) {\n\t\t// EPERM means the process exists but we lack permission to signal it\n\t\tif (\n\t\t\ttypeof err === \"object\" &&\n\t\t\terr !== null &&\n\t\t\t\"code\" in err &&\n\t\t\t(err as { code: string }).code === \"EPERM\"\n\t\t) {\n\t\t\treturn true;\n\t\t}\n\t\t// ESRCH or other errors mean the process doesn't exist\n\t\treturn false;\n\t}\n}\n\n/**\n * Acquire the lock file. Returns true if successful, false if lock exists.\n * Unlike acquireLock() in shared.ts, this doesn't call process.exit().\n *\n * If the lock file already exists, checks for staleness:\n * - If the PID in the lock file is no longer alive, removes the lock and retries.\n * - If the lock file is older than STALE_LOCK_MS, removes the lock and retries.\n * This prevents zombie processes from holding locks indefinitely.\n */\nasync function tryAcquireLock(logDir: string): Promise<boolean> {\n\tawait fs.mkdir(logDir, { recursive: true });\n\tconst lockPath = path.resolve(logDir, LOCK_FILENAME);\n\ttry {\n\t\tawait fs.writeFile(lockPath, String(process.pid), { flag: \"wx\" });\n\t\treturn true;\n\t} catch (err: unknown) {\n\t\tif (\n\t\t\ttypeof err === \"object\" &&\n\t\t\terr !== null &&\n\t\t\t\"code\" in err &&\n\t\t\t(err as { code: string }).code === \"EEXIST\"\n\t\t) {\n\t\t\t// Lock exists — check if the holding process is still alive\n\t\t\ttry {\n\t\t\t\tconst lockContent = await fs.readFile(lockPath, \"utf-8\");\n\t\t\t\tconst lockPid = parseInt(lockContent.trim(), 10);\n\t\t\t\tconst lockStat = await fs.stat(lockPath);\n\t\t\t\tconst lockAgeMs = Date.now() - lockStat.mtimeMs;\n\n\t\t\t\tconst pidValid = !Number.isNaN(lockPid);\n\t\t\t\tconst pidDead = pidValid && !isProcessAlive(lockPid);\n\t\t\t\t// Only use time-based staleness when we can't determine the PID\n\t\t\t\t// (e.g. lock file is empty or contains non-numeric content).\n\t\t\t\t// If the PID is valid and alive, never steal the lock regardless of age.\n\t\t\t\tconst lockStale = !pidValid && lockAgeMs > STALE_LOCK_MS;\n\n\t\t\t\tif (pidDead || lockStale) {\n\t\t\t\t\t// Stale lock — remove and retry once\n\t\t\t\t\tawait fs.rm(lockPath, { force: true });\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait fs.writeFile(lockPath, String(process.pid), {\n\t\t\t\t\t\t\tflag: \"wx\",\n\t\t\t\t\t\t});\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t} catch {\n\t\t\t\t\t\t// Another process beat us to it\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} catch {\n\t\t\t\t// Can't read/stat lock file — treat as active lock\n\t\t\t}\n\t\t\treturn false;\n\t\t}\n\t\tthrow err;\n\t}\n}\n\n/**\n * Find the latest console.N.log file in the log directory.\n */\nasync function findLatestConsoleLog(logDir: string): Promise<string | null> {\n\ttry {\n\t\tconst files = await fs.readdir(logDir);\n\t\tlet maxNum = -1;\n\t\tlet latestFile: string | null = null;\n\n\t\tfor (const file of files) {\n\t\t\tif (!file.startsWith(\"console.\") || !file.endsWith(\".log\")) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst middle = file.slice(\"console.\".length, file.length - \".log\".length);\n\t\t\tif (/^\\d+$/.test(middle)) {\n\t\t\t\tconst n = parseInt(middle, 10);\n\t\t\t\tif (n > maxNum) {\n\t\t\t\t\tmaxNum = n;\n\t\t\t\t\tlatestFile = file;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn latestFile ? path.join(logDir, latestFile) : null;\n\t} catch {\n\t\treturn null;\n\t}\n}\n\n/**\n * Check if the run interval has elapsed since the last gauntlet run.\n * Returns true if gauntlet should run, false if interval hasn't elapsed.\n */\nasync function shouldRunBasedOnInterval(\n\tlogDir: string,\n\tintervalMinutes: number,\n): Promise<boolean> {\n\tconst state = await readExecutionState(logDir);\n\tif (!state) {\n\t\t// No execution state = always run\n\t\treturn true;\n\t}\n\n\tconst lastRun = new Date(state.last_run_completed_at);\n\t// Handle invalid date (corrupted state) - treat as needing to run\n\tif (Number.isNaN(lastRun.getTime())) {\n\t\treturn true;\n\t}\n\n\tconst now = new Date();\n\tconst elapsedMinutes = (now.getTime() - lastRun.getTime()) / (1000 * 60);\n\n\treturn elapsedMinutes >= intervalMinutes;\n}\n\n/**\n * Get status message for a given status.\n */\nconst statusMessages: Record<GauntletStatus, string> = {\n\tpassed: \"All gates passed.\",\n\tpassed_with_warnings: \"Passed with warnings — some issues were skipped.\",\n\tno_applicable_gates: \"No applicable gates for these changes.\",\n\tno_changes: \"No changes detected.\",\n\tfailed: \"Gates failed — issues must be fixed.\",\n\tretry_limit_exceeded:\n\t\t\"Retry limit exceeded — logs have been automatically archived.\",\n\tlock_conflict: \"Another gauntlet run is already in progress.\",\n\terror: \"Unexpected error occurred.\",\n\tno_config: \"No .gauntlet/config.yml found.\",\n\tstop_hook_active: \"Stop hook already active.\",\n\tloop_detected: \"Loop detected — rapid blocks overridden.\",\n\tinterval_not_elapsed: \"Run interval not elapsed.\",\n\tinvalid_input: \"Invalid input.\",\n\tstop_hook_disabled: \"Stop hook is disabled via configuration.\",\n\tpr_push_required: \"Gates passed — PR needs to be created/updated.\",\n\tci_pending: \"CI checks still running.\",\n\tci_failed: \"CI checks failed or review changes requested.\",\n\tci_passed: \"CI checks passed, no blocking reviews.\",\n\tvalidation_required:\n\t\t\"Changes need validation or previous run has unresolved failures.\",\n};\n\nfunction getStatusMessage(status: GauntletStatus): string {\n\treturn statusMessages[status] || \"Unknown status\";\n}\n\n/**\n * Get the run executor logger.\n */\nfunction getRunLogger() {\n\treturn getCategoryLogger(\"run\");\n}\n\n/**\n * Execute the gauntlet run logic. Returns a structured RunResult.\n * This function never calls process.exit() - the caller is responsible for that.\n */\nexport async function executeRun(\n\toptions: ExecuteRunOptions = {},\n): Promise<RunResult> {\n\tconst { cwd } = options;\n\tlet config: Awaited<ReturnType<typeof loadConfig>> | undefined;\n\tlet lockAcquired = false;\n\tlet consoleLogHandle: ConsoleLogHandle | undefined;\n\tlet loggerInitializedHere = false;\n\tconst log = getRunLogger();\n\n\ttry {\n\t\tconfig = await loadConfig(cwd);\n\n\t\t// Initialize app logger if not already configured (e.g., by stop-hook)\n\t\tif (!isLoggerConfigured()) {\n\t\t\tawait initLogger({\n\t\t\t\tmode: \"interactive\",\n\t\t\t\tlogDir: config.project.log_dir,\n\t\t\t});\n\t\t\tloggerInitializedHere = true;\n\t\t}\n\n\t\t// Initialize debug logger\n\t\tconst globalConfig = await loadGlobalConfig();\n\t\tconst debugLogConfig = mergeDebugLogConfig(\n\t\t\tconfig.project.debug_log,\n\t\t\tglobalConfig.debug_log,\n\t\t);\n\t\tinitDebugLogger(config.project.log_dir, debugLogConfig);\n\n\t\t// Log the command invocation\n\t\tconst debugLogger = getDebugLogger();\n\t\tconst args = [\n\t\t\toptions.baseBranch ? `-b ${options.baseBranch}` : \"\",\n\t\t\toptions.gate ? `-g ${options.gate}` : \"\",\n\t\t\toptions.commit ? `-c ${options.commit}` : \"\",\n\t\t\toptions.uncommitted ? \"-u\" : \"\",\n\t\t\toptions.checkInterval ? \"--check-interval\" : \"\",\n\t\t].filter(Boolean);\n\t\tawait debugLogger?.logCommand(\"run\", args);\n\n\t\t// Interval check: only stop-hook passes checkInterval: true\n\t\t// CLI commands (run, check, review) always run immediately\n\t\tif (options.checkInterval) {\n\t\t\t// Resolve stop hook config from env > project > global\n\t\t\tconst stopHookConfig = resolveStopHookConfig(\n\t\t\t\tconfig.project.stop_hook,\n\t\t\t\tglobalConfig,\n\t\t\t);\n\n\t\t\t// Check if stop hook is disabled\n\t\t\tif (!stopHookConfig.enabled) {\n\t\t\t\tlog.debug(\"Stop hook is disabled via configuration, skipping\");\n\t\t\t\t// Clean up logger if we initialized it\n\t\t\t\tif (loggerInitializedHere) {\n\t\t\t\t\tawait resetLogger();\n\t\t\t\t}\n\t\t\t\treturn {\n\t\t\t\t\tstatus: \"stop_hook_disabled\",\n\t\t\t\t\tmessage: getStatusMessage(\"stop_hook_disabled\"),\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tconst logsExist = await hasExistingLogs(config.project.log_dir);\n\t\t\t// Only check interval if there are no existing logs (not in rerun mode)\n\t\t\t// and interval > 0 (interval 0 means always run)\n\t\t\tif (!logsExist && stopHookConfig.run_interval_minutes > 0) {\n\t\t\t\tconst intervalMinutes = stopHookConfig.run_interval_minutes;\n\t\t\t\tconst shouldRun = await shouldRunBasedOnInterval(\n\t\t\t\t\tconfig.project.log_dir,\n\t\t\t\t\tintervalMinutes,\n\t\t\t\t);\n\t\t\t\tif (!shouldRun) {\n\t\t\t\t\tlog.debug(\n\t\t\t\t\t\t`Run interval (${intervalMinutes} min) not elapsed, skipping`,\n\t\t\t\t\t);\n\t\t\t\t\t// Clean up logger if we initialized it\n\t\t\t\t\tif (loggerInitializedHere) {\n\t\t\t\t\t\tawait resetLogger();\n\t\t\t\t\t}\n\t\t\t\t\treturn {\n\t\t\t\t\t\tstatus: \"interval_not_elapsed\",\n\t\t\t\t\t\tmessage: `Run interval (${intervalMinutes} min) not elapsed.`,\n\t\t\t\t\t\tintervalMinutes,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Determine effective base branch first (needed for auto-clean)\n\t\tconst effectiveBaseBranch =\n\t\t\toptions.baseBranch ||\n\t\t\t(process.env.GITHUB_BASE_REF &&\n\t\t\t(process.env.CI === \"true\" || process.env.GITHUB_ACTIONS === \"true\")\n\t\t\t\t? process.env.GITHUB_BASE_REF\n\t\t\t\t: null) ||\n\t\t\tconfig.project.base_branch;\n\n\t\t// Auto-clean on context change (branch changed, commit merged)\n\t\tconst autoCleanResult = await shouldAutoClean(\n\t\t\tconfig.project.log_dir,\n\t\t\teffectiveBaseBranch,\n\t\t);\n\t\tif (autoCleanResult.clean) {\n\t\t\tlog.debug(`Auto-cleaning logs (${autoCleanResult.reason})...`);\n\t\t\tawait debugLogger?.logClean(\"auto\", autoCleanResult.reason || \"unknown\");\n\t\t\tawait performAutoClean(\n\t\t\t\tconfig.project.log_dir,\n\t\t\t\tautoCleanResult,\n\t\t\t\tconfig.project.max_previous_logs,\n\t\t\t);\n\t\t}\n\n\t\t// Detect rerun mode after auto-clean (clean may have removed logs)\n\t\tconst logsExist = await hasExistingLogs(config.project.log_dir);\n\t\tconst isRerun = logsExist && !options.commit;\n\n\t\t// Try to acquire lock (non-exiting version)\n\t\tlockAcquired = await tryAcquireLock(config.project.log_dir);\n\t\tif (!lockAcquired) {\n\t\t\t// Clean up logger if we initialized it\n\t\t\tif (loggerInitializedHere) {\n\t\t\t\tawait resetLogger();\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tstatus: \"lock_conflict\",\n\t\t\t\tmessage: getStatusMessage(\"lock_conflict\"),\n\t\t\t};\n\t\t}\n\n\t\t// Lock acquired — wrap in try/finally to guarantee release on all paths\n\t\ttry {\n\t\t\t// Initialize Logger early to get unified run number for console log\n\t\t\tconst logger = new Logger(config.project.log_dir);\n\t\t\tawait logger.init();\n\t\t\tconst runNumber = logger.getRunNumber();\n\n\t\t\tconsoleLogHandle = await startConsoleLog(\n\t\t\t\tconfig.project.log_dir,\n\t\t\t\trunNumber,\n\t\t\t);\n\n\t\t\tlet failuresMap:\n\t\t\t\t| Map<string, Map<string, PreviousViolation[]>>\n\t\t\t\t| undefined;\n\t\t\tlet changeOptions:\n\t\t\t\t| { commit?: string; uncommitted?: boolean; fixBase?: string }\n\t\t\t\t| undefined;\n\n\t\t\tlet passedSlotsMap: Map<string, Map<number, PassedSlot>> | undefined;\n\n\t\t\tif (isRerun) {\n\t\t\t\tlog.debug(\"Existing logs detected — running in verification mode...\");\n\t\t\t\tconst { failures: previousFailures, passedSlots } =\n\t\t\t\t\tawait findPreviousFailures(\n\t\t\t\t\t\tconfig.project.log_dir,\n\t\t\t\t\t\toptions.gate,\n\t\t\t\t\t\ttrue,\n\t\t\t\t\t);\n\n\t\t\t\tfailuresMap = new Map();\n\t\t\t\tfor (const gateFailure of previousFailures) {\n\t\t\t\t\tconst adapterMap = new Map<string, PreviousViolation[]>();\n\t\t\t\t\tfor (const af of gateFailure.adapterFailures) {\n\t\t\t\t\t\tconst key = af.reviewIndex\n\t\t\t\t\t\t\t? String(af.reviewIndex)\n\t\t\t\t\t\t\t: af.adapterName;\n\t\t\t\t\t\tadapterMap.set(key, af.violations);\n\t\t\t\t\t}\n\t\t\t\t\tfailuresMap.set(gateFailure.jobId, adapterMap);\n\t\t\t\t}\n\n\t\t\t\tpassedSlotsMap = passedSlots;\n\n\t\t\t\tif (previousFailures.length > 0) {\n\t\t\t\t\tconst totalViolations = previousFailures.reduce(\n\t\t\t\t\t\t(sum, gf) =>\n\t\t\t\t\t\t\tsum +\n\t\t\t\t\t\t\tgf.adapterFailures.reduce((s, af) => s + af.violations.length, 0),\n\t\t\t\t\t\t0,\n\t\t\t\t\t);\n\t\t\t\t\tlog.warn(\n\t\t\t\t\t\t`Found ${previousFailures.length} gate(s) with ${totalViolations} previous violation(s)`,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tchangeOptions = { uncommitted: true };\n\t\t\t\tconst executionState = await readExecutionState(config.project.log_dir);\n\t\t\t\tif (executionState?.working_tree_ref) {\n\t\t\t\t\tchangeOptions.fixBase = executionState.working_tree_ref;\n\t\t\t\t}\n\t\t\t} else if (!logsExist) {\n\t\t\t\tconst executionState = await readExecutionState(config.project.log_dir);\n\t\t\t\tif (executionState) {\n\t\t\t\t\tconst resolved = await resolveFixBase(\n\t\t\t\t\t\texecutionState,\n\t\t\t\t\t\teffectiveBaseBranch,\n\t\t\t\t\t);\n\t\t\t\t\tif (resolved.warning) {\n\t\t\t\t\t\tlog.warn(`Warning: ${resolved.warning}`);\n\t\t\t\t\t}\n\t\t\t\t\tif (resolved.fixBase) {\n\t\t\t\t\t\tchangeOptions = { fixBase: resolved.fixBase };\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Allow explicit commit or uncommitted options to override fixBase\n\t\t\tif (options.commit || options.uncommitted) {\n\t\t\t\tchangeOptions = {\n\t\t\t\t\tcommit: options.commit,\n\t\t\t\t\tuncommitted: options.uncommitted,\n\t\t\t\t\tfixBase: changeOptions?.fixBase,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tconst changeDetector = new ChangeDetector(\n\t\t\t\teffectiveBaseBranch,\n\t\t\t\tchangeOptions || {\n\t\t\t\t\tcommit: options.commit,\n\t\t\t\t\tuncommitted: options.uncommitted,\n\t\t\t\t},\n\t\t\t);\n\t\t\tconst expander = new EntryPointExpander();\n\t\t\tconst jobGen = new JobGenerator(config);\n\n\t\t\tlog.debug(\"Detecting changes...\");\n\t\t\tconst changes = await changeDetector.getChangedFiles();\n\n\t\t\tif (changes.length === 0) {\n\t\t\t\tlog.info(\"No changes detected.\");\n\t\t\t\t// Do not write execution state - no gates ran\n\t\t\t\tconsoleLogHandle?.restore();\n\t\t\t\tif (loggerInitializedHere) {\n\t\t\t\t\tawait resetLogger();\n\t\t\t\t}\n\t\t\t\treturn {\n\t\t\t\t\tstatus: \"no_changes\",\n\t\t\t\t\tmessage: getStatusMessage(\"no_changes\"),\n\t\t\t\t\tgatesRun: 0,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tlog.debug(`Found ${changes.length} changed files.`);\n\n\t\t\tconst entryPoints = await expander.expand(\n\t\t\t\tconfig.project.entry_points,\n\t\t\t\tchanges,\n\t\t\t);\n\t\t\tlet jobs = jobGen.generateJobs(entryPoints);\n\n\t\t\tif (options.gate) {\n\t\t\t\tjobs = jobs.filter((j) => j.name === options.gate);\n\t\t\t}\n\n\t\t\tif (jobs.length === 0) {\n\t\t\t\tlog.warn(\"No applicable gates for these changes.\");\n\t\t\t\t// Do not write execution state - no gates ran\n\t\t\t\tconsoleLogHandle?.restore();\n\t\t\t\tif (loggerInitializedHere) {\n\t\t\t\t\tawait resetLogger();\n\t\t\t\t}\n\t\t\t\treturn {\n\t\t\t\t\tstatus: \"no_applicable_gates\",\n\t\t\t\t\tmessage: getStatusMessage(\"no_applicable_gates\"),\n\t\t\t\t\tgatesRun: 0,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tlog.debug(`Running ${jobs.length} gates...`);\n\n\t\t\t// Compute diff stats and log run start\n\t\t\tconst runMode = isRerun ? \"verification\" : \"full\";\n\t\t\tconst diffStats = await computeDiffStats(\n\t\t\t\teffectiveBaseBranch,\n\t\t\t\tchangeOptions || {\n\t\t\t\t\tcommit: options.commit,\n\t\t\t\t\tuncommitted: options.uncommitted,\n\t\t\t\t},\n\t\t\t);\n\t\t\tawait debugLogger?.logRunStartWithDiff(runMode, diffStats, jobs.length);\n\n\t\t\tconst reporter = new ConsoleReporter();\n\t\t\tconst runner = new Runner(\n\t\t\t\tconfig,\n\t\t\t\tlogger,\n\t\t\t\treporter,\n\t\t\t\tfailuresMap,\n\t\t\t\tchangeOptions,\n\t\t\t\teffectiveBaseBranch,\n\t\t\t\tpassedSlotsMap,\n\t\t\t\tdebugLogger ?? undefined,\n\t\t\t\tisRerun,\n\t\t\t);\n\n\t\t\tconst outcome = await runner.run(jobs);\n\n\t\t\t// Log run end with actual statistics from runner\n\t\t\tawait debugLogger?.logRunEnd(\n\t\t\t\toutcome.allPassed ? \"pass\" : \"fail\",\n\t\t\t\toutcome.stats.fixed,\n\t\t\t\toutcome.stats.skipped,\n\t\t\t\toutcome.stats.failed,\n\t\t\t\tlogger.getRunNumber(),\n\t\t\t);\n\n\t\t\t// Write execution state before releasing lock\n\t\t\tawait writeExecutionState(config.project.log_dir);\n\n\t\t\tconst consoleLogPath = await findLatestConsoleLog(config.project.log_dir);\n\n\t\t\t// Determine the correct status based on runner outcome\n\t\t\tlet status: GauntletStatus;\n\t\t\tif (outcome.retryLimitExceeded) {\n\t\t\t\tstatus = \"retry_limit_exceeded\";\n\t\t\t} else if (outcome.allPassed && outcome.anySkipped) {\n\t\t\t\tstatus = \"passed_with_warnings\";\n\t\t\t} else if (outcome.allPassed) {\n\t\t\t\tstatus = \"passed\";\n\t\t\t} else {\n\t\t\t\tstatus = \"failed\";\n\t\t\t}\n\n\t\t\t// Clean logs on success or retry limit exceeded\n\t\t\tif (status === \"passed\") {\n\t\t\t\tawait debugLogger?.logClean(\"auto\", \"all_passed\");\n\t\t\t\tawait cleanLogs(\n\t\t\t\t\tconfig.project.log_dir,\n\t\t\t\t\tconfig.project.max_previous_logs,\n\t\t\t\t);\n\t\t\t} else if (status === \"retry_limit_exceeded\") {\n\t\t\t\tawait debugLogger?.logClean(\"auto\", \"retry_limit_exceeded\");\n\t\t\t\tawait cleanLogs(\n\t\t\t\t\tconfig.project.log_dir,\n\t\t\t\t\tconfig.project.max_previous_logs,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconsoleLogHandle?.restore();\n\n\t\t\t// Clean up logger if we initialized it\n\t\t\tif (loggerInitializedHere) {\n\t\t\t\tawait resetLogger();\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tstatus,\n\t\t\t\tmessage: getStatusMessage(status),\n\t\t\t\tgatesRun: jobs.length,\n\t\t\t\tgatesFailed: outcome.allPassed ? 0 : jobs.length,\n\t\t\t\tconsoleLogPath: consoleLogPath ?? undefined,\n\t\t\t\tgateResults: outcome.gateResults,\n\t\t\t};\n\t\t} finally {\n\t\t\t// Guarantee lock release regardless of how we exit the post-lock section\n\t\t\tawait releaseLock(config.project.log_dir);\n\t\t}\n\t} catch (error: unknown) {\n\t\t// Do not write execution state on error - no gates completed successfully\n\t\t// Lock release is handled by the inner finally block if lock was acquired.\n\t\t// If error occurred before lock acquisition, no release needed.\n\t\tconsoleLogHandle?.restore();\n\n\t\t// Clean up logger if we initialized it\n\t\tif (loggerInitializedHere) {\n\t\t\tawait resetLogger();\n\t\t}\n\n\t\tconst err = error as { message?: string };\n\t\tconst errorMessage = err.message || \"unknown error\";\n\t\treturn {\n\t\t\tstatus: \"error\",\n\t\t\tmessage: getStatusMessage(\"error\"),\n\t\t\terrorMessage,\n\t\t};\n\t}\n}\n",
|
|
58
|
+
"import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport {\n\tcleanLogs,\n\thasExistingLogs,\n\tperformAutoClean,\n\treleaseLock,\n\tshouldAutoClean,\n} from \"../commands/shared.js\";\nimport { loadGlobalConfig } from \"../config/global.js\";\nimport { loadConfig } from \"../config/loader.js\";\nimport { resolveStopHookConfig } from \"../config/stop-hook-config.js\";\nimport {\n\tgetCategoryLogger,\n\tinitLogger,\n\tisLoggerConfigured,\n\tresetLogger,\n} from \"../output/app-logger.js\";\nimport { ConsoleReporter } from \"../output/console.js\";\nimport {\n\ttype ConsoleLogHandle,\n\tstartConsoleLog,\n} from \"../output/console-log.js\";\nimport { Logger } from \"../output/logger.js\";\nimport type { GauntletStatus, RunResult } from \"../types/gauntlet-status.js\";\nimport {\n\tgetDebugLogger,\n\tinitDebugLogger,\n\tmergeDebugLogConfig,\n} from \"../utils/debug-log.js\";\nimport {\n\treadExecutionState,\n\tresolveFixBase,\n\twriteExecutionState,\n} from \"../utils/execution-state.js\";\nimport {\n\tfindPreviousFailures,\n\ttype PassedSlot,\n\ttype PreviousViolation,\n} from \"../utils/log-parser.js\";\nimport { ChangeDetector } from \"./change-detector.js\";\nimport { computeDiffStats } from \"./diff-stats.js\";\nimport { EntryPointExpander } from \"./entry-point.js\";\nimport { JobGenerator } from \"./job.js\";\nimport { Runner } from \"./runner.js\";\n\nconst LOCK_FILENAME = \".gauntlet-run.lock\";\n\nexport interface ExecuteRunOptions {\n\tbaseBranch?: string;\n\tgate?: string;\n\tcommit?: string;\n\tuncommitted?: boolean;\n\t/** Working directory for config loading (defaults to process.cwd()) */\n\tcwd?: string;\n\t/**\n\t * When true, check if run interval has elapsed before proceeding.\n\t * Only stop-hook uses this; CLI commands (run, check, review) always run immediately.\n\t * If interval hasn't elapsed, returns { status: \"interval_not_elapsed\", ... }.\n\t */\n\tcheckInterval?: boolean;\n}\n\n/**\n * Maximum age for a lock file before it's considered stale (10 minutes).\n * Matches the stale marker threshold in stop-hook.ts.\n */\nconst STALE_LOCK_MS = 10 * 60 * 1000;\n\n/**\n * Check if a process with the given PID is still alive.\n */\nfunction isProcessAlive(pid: number): boolean {\n\ttry {\n\t\tprocess.kill(pid, 0); // Signal 0 = check existence without killing\n\t\treturn true;\n\t} catch (err: unknown) {\n\t\t// EPERM means the process exists but we lack permission to signal it\n\t\tif (\n\t\t\ttypeof err === \"object\" &&\n\t\t\terr !== null &&\n\t\t\t\"code\" in err &&\n\t\t\t(err as { code: string }).code === \"EPERM\"\n\t\t) {\n\t\t\treturn true;\n\t\t}\n\t\t// ESRCH or other errors mean the process doesn't exist\n\t\treturn false;\n\t}\n}\n\n/**\n * Acquire the lock file. Returns true if successful, false if lock exists.\n * Unlike acquireLock() in shared.ts, this doesn't call process.exit().\n *\n * If the lock file already exists, checks for staleness:\n * - If the PID in the lock file is no longer alive, removes the lock and retries.\n * - If the lock file is older than STALE_LOCK_MS, removes the lock and retries.\n * This prevents zombie processes from holding locks indefinitely.\n */\nasync function tryAcquireLock(logDir: string): Promise<boolean> {\n\tawait fs.mkdir(logDir, { recursive: true });\n\tconst lockPath = path.resolve(logDir, LOCK_FILENAME);\n\ttry {\n\t\tawait fs.writeFile(lockPath, String(process.pid), { flag: \"wx\" });\n\t\treturn true;\n\t} catch (err: unknown) {\n\t\tif (\n\t\t\ttypeof err === \"object\" &&\n\t\t\terr !== null &&\n\t\t\t\"code\" in err &&\n\t\t\t(err as { code: string }).code === \"EEXIST\"\n\t\t) {\n\t\t\t// Lock exists — check if the holding process is still alive\n\t\t\ttry {\n\t\t\t\tconst lockContent = await fs.readFile(lockPath, \"utf-8\");\n\t\t\t\tconst lockPid = parseInt(lockContent.trim(), 10);\n\t\t\t\tconst lockStat = await fs.stat(lockPath);\n\t\t\t\tconst lockAgeMs = Date.now() - lockStat.mtimeMs;\n\n\t\t\t\tconst pidValid = !Number.isNaN(lockPid);\n\t\t\t\tconst pidDead = pidValid && !isProcessAlive(lockPid);\n\t\t\t\t// Only use time-based staleness when we can't determine the PID\n\t\t\t\t// (e.g. lock file is empty or contains non-numeric content).\n\t\t\t\t// If the PID is valid and alive, never steal the lock regardless of age.\n\t\t\t\tconst lockStale = !pidValid && lockAgeMs > STALE_LOCK_MS;\n\n\t\t\t\tif (pidDead || lockStale) {\n\t\t\t\t\t// Stale lock — remove and retry once\n\t\t\t\t\tawait fs.rm(lockPath, { force: true });\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait fs.writeFile(lockPath, String(process.pid), {\n\t\t\t\t\t\t\tflag: \"wx\",\n\t\t\t\t\t\t});\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t} catch {\n\t\t\t\t\t\t// Another process beat us to it\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} catch {\n\t\t\t\t// Can't read/stat lock file — treat as active lock\n\t\t\t}\n\t\t\treturn false;\n\t\t}\n\t\tthrow err;\n\t}\n}\n\n/**\n * Find the latest console.N.log file in the log directory.\n */\nasync function findLatestConsoleLog(logDir: string): Promise<string | null> {\n\ttry {\n\t\tconst files = await fs.readdir(logDir);\n\t\tlet maxNum = -1;\n\t\tlet latestFile: string | null = null;\n\n\t\tfor (const file of files) {\n\t\t\tif (!file.startsWith(\"console.\") || !file.endsWith(\".log\")) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst middle = file.slice(\"console.\".length, file.length - \".log\".length);\n\t\t\tif (/^\\d+$/.test(middle)) {\n\t\t\t\tconst n = parseInt(middle, 10);\n\t\t\t\tif (n > maxNum) {\n\t\t\t\t\tmaxNum = n;\n\t\t\t\t\tlatestFile = file;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn latestFile ? path.join(logDir, latestFile) : null;\n\t} catch {\n\t\treturn null;\n\t}\n}\n\n/**\n * Check if the run interval has elapsed since the last gauntlet run.\n * Returns true if gauntlet should run, false if interval hasn't elapsed.\n */\nasync function shouldRunBasedOnInterval(\n\tlogDir: string,\n\tintervalMinutes: number,\n): Promise<boolean> {\n\tconst state = await readExecutionState(logDir);\n\tif (!state) {\n\t\t// No execution state = always run\n\t\treturn true;\n\t}\n\n\tconst lastRun = new Date(state.last_run_completed_at);\n\t// Handle invalid date (corrupted state) - treat as needing to run\n\tif (Number.isNaN(lastRun.getTime())) {\n\t\treturn true;\n\t}\n\n\tconst now = new Date();\n\tconst elapsedMinutes = (now.getTime() - lastRun.getTime()) / (1000 * 60);\n\n\treturn elapsedMinutes >= intervalMinutes;\n}\n\n/**\n * Get status message for a given status.\n */\nconst statusMessages: Record<GauntletStatus, string> = {\n\tpassed: \"All gates passed.\",\n\tpassed_with_warnings: \"Passed with warnings — some issues were skipped.\",\n\tno_applicable_gates: \"No applicable gates for these changes.\",\n\tno_changes: \"No changes detected.\",\n\tfailed: \"Gates failed — issues must be fixed.\",\n\tretry_limit_exceeded:\n\t\t\"Retry limit exceeded — logs have been automatically archived.\",\n\tlock_conflict: \"Another gauntlet run is already in progress.\",\n\terror: \"Unexpected error occurred.\",\n\tno_config: \"No .gauntlet/config.yml found.\",\n\tstop_hook_active: \"Stop hook already active.\",\n\tloop_detected: \"Loop detected — rapid blocks overridden.\",\n\tinterval_not_elapsed: \"Run interval not elapsed.\",\n\tinvalid_input: \"Invalid input.\",\n\tstop_hook_disabled: \"\",\n\tpr_push_required: \"Gates passed — PR needs to be created/updated.\",\n\tci_pending: \"CI checks still running.\",\n\tci_failed: \"CI checks failed or review changes requested.\",\n\tci_passed: \"CI checks passed, no blocking reviews.\",\n\tvalidation_required:\n\t\t\"Changes need validation or previous run has unresolved failures.\",\n};\n\nfunction getStatusMessage(status: GauntletStatus): string {\n\treturn statusMessages[status] || \"Unknown status\";\n}\n\n/**\n * Get the run executor logger.\n */\nfunction getRunLogger() {\n\treturn getCategoryLogger(\"run\");\n}\n\n/**\n * Execute the gauntlet run logic. Returns a structured RunResult.\n * This function never calls process.exit() - the caller is responsible for that.\n */\nexport async function executeRun(\n\toptions: ExecuteRunOptions = {},\n): Promise<RunResult> {\n\tconst { cwd } = options;\n\tlet config: Awaited<ReturnType<typeof loadConfig>> | undefined;\n\tlet lockAcquired = false;\n\tlet consoleLogHandle: ConsoleLogHandle | undefined;\n\tlet loggerInitializedHere = false;\n\tconst log = getRunLogger();\n\n\ttry {\n\t\tconfig = await loadConfig(cwd);\n\n\t\t// Initialize app logger if not already configured (e.g., by stop-hook)\n\t\tif (!isLoggerConfigured()) {\n\t\t\tawait initLogger({\n\t\t\t\tmode: \"interactive\",\n\t\t\t\tlogDir: config.project.log_dir,\n\t\t\t});\n\t\t\tloggerInitializedHere = true;\n\t\t}\n\n\t\t// Initialize debug logger\n\t\tconst globalConfig = await loadGlobalConfig();\n\t\tconst debugLogConfig = mergeDebugLogConfig(\n\t\t\tconfig.project.debug_log,\n\t\t\tglobalConfig.debug_log,\n\t\t);\n\t\tinitDebugLogger(config.project.log_dir, debugLogConfig);\n\n\t\t// Log the command invocation\n\t\tconst debugLogger = getDebugLogger();\n\t\tconst args = [\n\t\t\toptions.baseBranch ? `-b ${options.baseBranch}` : \"\",\n\t\t\toptions.gate ? `-g ${options.gate}` : \"\",\n\t\t\toptions.commit ? `-c ${options.commit}` : \"\",\n\t\t\toptions.uncommitted ? \"-u\" : \"\",\n\t\t\toptions.checkInterval ? \"--check-interval\" : \"\",\n\t\t].filter(Boolean);\n\t\tawait debugLogger?.logCommand(\"run\", args);\n\n\t\t// Interval check: only stop-hook passes checkInterval: true\n\t\t// CLI commands (run, check, review) always run immediately\n\t\tif (options.checkInterval) {\n\t\t\t// Resolve stop hook config from env > project > global\n\t\t\tconst stopHookConfig = resolveStopHookConfig(\n\t\t\t\tconfig.project.stop_hook,\n\t\t\t\tglobalConfig,\n\t\t\t);\n\n\t\t\t// Check if stop hook is disabled\n\t\t\tif (!stopHookConfig.enabled) {\n\t\t\t\tlog.debug(\"Stop hook is disabled via configuration, skipping\");\n\t\t\t\t// Clean up logger if we initialized it\n\t\t\t\tif (loggerInitializedHere) {\n\t\t\t\t\tawait resetLogger();\n\t\t\t\t}\n\t\t\t\treturn {\n\t\t\t\t\tstatus: \"stop_hook_disabled\",\n\t\t\t\t\tmessage: getStatusMessage(\"stop_hook_disabled\"),\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tconst logsExist = await hasExistingLogs(config.project.log_dir);\n\t\t\t// Only check interval if there are no existing logs (not in rerun mode)\n\t\t\t// and interval > 0 (interval 0 means always run)\n\t\t\tif (!logsExist && stopHookConfig.run_interval_minutes > 0) {\n\t\t\t\tconst intervalMinutes = stopHookConfig.run_interval_minutes;\n\t\t\t\tconst shouldRun = await shouldRunBasedOnInterval(\n\t\t\t\t\tconfig.project.log_dir,\n\t\t\t\t\tintervalMinutes,\n\t\t\t\t);\n\t\t\t\tif (!shouldRun) {\n\t\t\t\t\tlog.debug(\n\t\t\t\t\t\t`Run interval (${intervalMinutes} min) not elapsed, skipping`,\n\t\t\t\t\t);\n\t\t\t\t\t// Clean up logger if we initialized it\n\t\t\t\t\tif (loggerInitializedHere) {\n\t\t\t\t\t\tawait resetLogger();\n\t\t\t\t\t}\n\t\t\t\t\treturn {\n\t\t\t\t\t\tstatus: \"interval_not_elapsed\",\n\t\t\t\t\t\tmessage: `Run interval (${intervalMinutes} min) not elapsed.`,\n\t\t\t\t\t\tintervalMinutes,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Determine effective base branch first (needed for auto-clean)\n\t\tconst effectiveBaseBranch =\n\t\t\toptions.baseBranch ||\n\t\t\t(process.env.GITHUB_BASE_REF &&\n\t\t\t(process.env.CI === \"true\" || process.env.GITHUB_ACTIONS === \"true\")\n\t\t\t\t? process.env.GITHUB_BASE_REF\n\t\t\t\t: null) ||\n\t\t\tconfig.project.base_branch;\n\n\t\t// Auto-clean on context change (branch changed, commit merged)\n\t\tconst autoCleanResult = await shouldAutoClean(\n\t\t\tconfig.project.log_dir,\n\t\t\teffectiveBaseBranch,\n\t\t);\n\t\tif (autoCleanResult.clean) {\n\t\t\tlog.debug(`Auto-cleaning logs (${autoCleanResult.reason})...`);\n\t\t\tawait debugLogger?.logClean(\"auto\", autoCleanResult.reason || \"unknown\");\n\t\t\tawait performAutoClean(\n\t\t\t\tconfig.project.log_dir,\n\t\t\t\tautoCleanResult,\n\t\t\t\tconfig.project.max_previous_logs,\n\t\t\t);\n\t\t}\n\n\t\t// Detect rerun mode after auto-clean (clean may have removed logs)\n\t\tconst logsExist = await hasExistingLogs(config.project.log_dir);\n\t\tconst isRerun = logsExist && !options.commit;\n\n\t\t// Try to acquire lock (non-exiting version)\n\t\tlockAcquired = await tryAcquireLock(config.project.log_dir);\n\t\tif (!lockAcquired) {\n\t\t\t// Clean up logger if we initialized it\n\t\t\tif (loggerInitializedHere) {\n\t\t\t\tawait resetLogger();\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tstatus: \"lock_conflict\",\n\t\t\t\tmessage: getStatusMessage(\"lock_conflict\"),\n\t\t\t};\n\t\t}\n\n\t\t// Lock acquired — wrap in try/finally to guarantee release on all paths\n\t\ttry {\n\t\t\t// Initialize Logger early to get unified run number for console log\n\t\t\tconst logger = new Logger(config.project.log_dir);\n\t\t\tawait logger.init();\n\t\t\tconst runNumber = logger.getRunNumber();\n\n\t\t\tconsoleLogHandle = await startConsoleLog(\n\t\t\t\tconfig.project.log_dir,\n\t\t\t\trunNumber,\n\t\t\t);\n\n\t\t\tlet failuresMap:\n\t\t\t\t| Map<string, Map<string, PreviousViolation[]>>\n\t\t\t\t| undefined;\n\t\t\tlet changeOptions:\n\t\t\t\t| { commit?: string; uncommitted?: boolean; fixBase?: string }\n\t\t\t\t| undefined;\n\n\t\t\tlet passedSlotsMap: Map<string, Map<number, PassedSlot>> | undefined;\n\n\t\t\tif (isRerun) {\n\t\t\t\tlog.debug(\"Existing logs detected — running in verification mode...\");\n\t\t\t\tconst { failures: previousFailures, passedSlots } =\n\t\t\t\t\tawait findPreviousFailures(\n\t\t\t\t\t\tconfig.project.log_dir,\n\t\t\t\t\t\toptions.gate,\n\t\t\t\t\t\ttrue,\n\t\t\t\t\t);\n\n\t\t\t\tfailuresMap = new Map();\n\t\t\t\tfor (const gateFailure of previousFailures) {\n\t\t\t\t\tconst adapterMap = new Map<string, PreviousViolation[]>();\n\t\t\t\t\tfor (const af of gateFailure.adapterFailures) {\n\t\t\t\t\t\tconst key = af.reviewIndex\n\t\t\t\t\t\t\t? String(af.reviewIndex)\n\t\t\t\t\t\t\t: af.adapterName;\n\t\t\t\t\t\tadapterMap.set(key, af.violations);\n\t\t\t\t\t}\n\t\t\t\t\tfailuresMap.set(gateFailure.jobId, adapterMap);\n\t\t\t\t}\n\n\t\t\t\tpassedSlotsMap = passedSlots;\n\n\t\t\t\tif (previousFailures.length > 0) {\n\t\t\t\t\tconst totalViolations = previousFailures.reduce(\n\t\t\t\t\t\t(sum, gf) =>\n\t\t\t\t\t\t\tsum +\n\t\t\t\t\t\t\tgf.adapterFailures.reduce((s, af) => s + af.violations.length, 0),\n\t\t\t\t\t\t0,\n\t\t\t\t\t);\n\t\t\t\t\tlog.warn(\n\t\t\t\t\t\t`Found ${previousFailures.length} gate(s) with ${totalViolations} previous violation(s)`,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tchangeOptions = { uncommitted: true };\n\t\t\t\tconst executionState = await readExecutionState(config.project.log_dir);\n\t\t\t\tif (executionState?.working_tree_ref) {\n\t\t\t\t\tchangeOptions.fixBase = executionState.working_tree_ref;\n\t\t\t\t}\n\t\t\t} else if (!logsExist) {\n\t\t\t\tconst executionState = await readExecutionState(config.project.log_dir);\n\t\t\t\tif (executionState) {\n\t\t\t\t\tconst resolved = await resolveFixBase(\n\t\t\t\t\t\texecutionState,\n\t\t\t\t\t\teffectiveBaseBranch,\n\t\t\t\t\t);\n\t\t\t\t\tif (resolved.warning) {\n\t\t\t\t\t\tlog.warn(`Warning: ${resolved.warning}`);\n\t\t\t\t\t}\n\t\t\t\t\tif (resolved.fixBase) {\n\t\t\t\t\t\tchangeOptions = { fixBase: resolved.fixBase };\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Allow explicit commit or uncommitted options to override fixBase\n\t\t\tif (options.commit || options.uncommitted) {\n\t\t\t\tchangeOptions = {\n\t\t\t\t\tcommit: options.commit,\n\t\t\t\t\tuncommitted: options.uncommitted,\n\t\t\t\t\tfixBase: changeOptions?.fixBase,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tconst changeDetector = new ChangeDetector(\n\t\t\t\teffectiveBaseBranch,\n\t\t\t\tchangeOptions || {\n\t\t\t\t\tcommit: options.commit,\n\t\t\t\t\tuncommitted: options.uncommitted,\n\t\t\t\t},\n\t\t\t);\n\t\t\tconst expander = new EntryPointExpander();\n\t\t\tconst jobGen = new JobGenerator(config);\n\n\t\t\tlog.debug(\"Detecting changes...\");\n\t\t\tconst changes = await changeDetector.getChangedFiles();\n\n\t\t\tif (changes.length === 0) {\n\t\t\t\tlog.info(\"No changes detected.\");\n\t\t\t\t// Do not write execution state - no gates ran\n\t\t\t\tconsoleLogHandle?.restore();\n\t\t\t\tif (loggerInitializedHere) {\n\t\t\t\t\tawait resetLogger();\n\t\t\t\t}\n\t\t\t\treturn {\n\t\t\t\t\tstatus: \"no_changes\",\n\t\t\t\t\tmessage: getStatusMessage(\"no_changes\"),\n\t\t\t\t\tgatesRun: 0,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tlog.debug(`Found ${changes.length} changed files.`);\n\n\t\t\tconst entryPoints = await expander.expand(\n\t\t\t\tconfig.project.entry_points,\n\t\t\t\tchanges,\n\t\t\t);\n\t\t\tlet jobs = jobGen.generateJobs(entryPoints);\n\n\t\t\tif (options.gate) {\n\t\t\t\tjobs = jobs.filter((j) => j.name === options.gate);\n\t\t\t}\n\n\t\t\tif (jobs.length === 0) {\n\t\t\t\tlog.warn(\"No applicable gates for these changes.\");\n\t\t\t\t// Do not write execution state - no gates ran\n\t\t\t\tconsoleLogHandle?.restore();\n\t\t\t\tif (loggerInitializedHere) {\n\t\t\t\t\tawait resetLogger();\n\t\t\t\t}\n\t\t\t\treturn {\n\t\t\t\t\tstatus: \"no_applicable_gates\",\n\t\t\t\t\tmessage: getStatusMessage(\"no_applicable_gates\"),\n\t\t\t\t\tgatesRun: 0,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tlog.debug(`Running ${jobs.length} gates...`);\n\n\t\t\t// Compute diff stats and log run start\n\t\t\tconst runMode = isRerun ? \"verification\" : \"full\";\n\t\t\tconst diffStats = await computeDiffStats(\n\t\t\t\teffectiveBaseBranch,\n\t\t\t\tchangeOptions || {\n\t\t\t\t\tcommit: options.commit,\n\t\t\t\t\tuncommitted: options.uncommitted,\n\t\t\t\t},\n\t\t\t);\n\t\t\tawait debugLogger?.logRunStartWithDiff(runMode, diffStats, jobs.length);\n\n\t\t\tconst reporter = new ConsoleReporter();\n\t\t\tconst runner = new Runner(\n\t\t\t\tconfig,\n\t\t\t\tlogger,\n\t\t\t\treporter,\n\t\t\t\tfailuresMap,\n\t\t\t\tchangeOptions,\n\t\t\t\teffectiveBaseBranch,\n\t\t\t\tpassedSlotsMap,\n\t\t\t\tdebugLogger ?? undefined,\n\t\t\t\tisRerun,\n\t\t\t);\n\n\t\t\tconst outcome = await runner.run(jobs);\n\n\t\t\t// Log run end with actual statistics from runner\n\t\t\tawait debugLogger?.logRunEnd(\n\t\t\t\toutcome.allPassed ? \"pass\" : \"fail\",\n\t\t\t\toutcome.stats.fixed,\n\t\t\t\toutcome.stats.skipped,\n\t\t\t\toutcome.stats.failed,\n\t\t\t\tlogger.getRunNumber(),\n\t\t\t);\n\n\t\t\t// Write execution state before releasing lock\n\t\t\tawait writeExecutionState(config.project.log_dir);\n\n\t\t\tconst consoleLogPath = await findLatestConsoleLog(config.project.log_dir);\n\n\t\t\t// Determine the correct status based on runner outcome\n\t\t\tlet status: GauntletStatus;\n\t\t\tif (outcome.retryLimitExceeded) {\n\t\t\t\tstatus = \"retry_limit_exceeded\";\n\t\t\t} else if (outcome.allPassed && outcome.anySkipped) {\n\t\t\t\tstatus = \"passed_with_warnings\";\n\t\t\t} else if (outcome.allPassed) {\n\t\t\t\tstatus = \"passed\";\n\t\t\t} else {\n\t\t\t\tstatus = \"failed\";\n\t\t\t}\n\n\t\t\t// Clean logs on success or retry limit exceeded\n\t\t\tif (status === \"passed\") {\n\t\t\t\tawait debugLogger?.logClean(\"auto\", \"all_passed\");\n\t\t\t\tawait cleanLogs(\n\t\t\t\t\tconfig.project.log_dir,\n\t\t\t\t\tconfig.project.max_previous_logs,\n\t\t\t\t);\n\t\t\t} else if (status === \"retry_limit_exceeded\") {\n\t\t\t\tawait debugLogger?.logClean(\"auto\", \"retry_limit_exceeded\");\n\t\t\t\tawait cleanLogs(\n\t\t\t\t\tconfig.project.log_dir,\n\t\t\t\t\tconfig.project.max_previous_logs,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconsoleLogHandle?.restore();\n\n\t\t\t// Clean up logger if we initialized it\n\t\t\tif (loggerInitializedHere) {\n\t\t\t\tawait resetLogger();\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tstatus,\n\t\t\t\tmessage: getStatusMessage(status),\n\t\t\t\tgatesRun: jobs.length,\n\t\t\t\tgatesFailed: outcome.allPassed ? 0 : jobs.length,\n\t\t\t\tconsoleLogPath: consoleLogPath ?? undefined,\n\t\t\t\tgateResults: outcome.gateResults,\n\t\t\t};\n\t\t} finally {\n\t\t\t// Guarantee lock release regardless of how we exit the post-lock section\n\t\t\tawait releaseLock(config.project.log_dir);\n\t\t}\n\t} catch (error: unknown) {\n\t\t// Do not write execution state on error - no gates completed successfully\n\t\t// Lock release is handled by the inner finally block if lock was acquired.\n\t\t// If error occurred before lock acquisition, no release needed.\n\t\tconsoleLogHandle?.restore();\n\n\t\t// Clean up logger if we initialized it\n\t\tif (loggerInitializedHere) {\n\t\t\tawait resetLogger();\n\t\t}\n\n\t\tconst err = error as { message?: string };\n\t\tconst errorMessage = err.message || \"unknown error\";\n\t\treturn {\n\t\t\tstatus: \"error\",\n\t\t\tmessage: getStatusMessage(\"error\"),\n\t\t\terrorMessage,\n\t\t};\n\t}\n}\n",
|
|
57
59
|
"import { execFile } from \"node:child_process\";\nimport { promisify } from \"node:util\";\n\nconst execFileAsyncOriginal = promisify(execFile);\nexport let execFileAsync = execFileAsyncOriginal;\n\nexport function setExecFileAsync(fn: typeof execFileAsyncOriginal) {\n\texecFileAsync = fn;\n}\n\n/**\n * Run a git command safely using execFile (no shell interpolation).\n */\nasync function gitExec(args: string[]): Promise<string> {\n\tconst { stdout } = await execFileAsync(\"git\", args);\n\treturn stdout;\n}\n\nexport interface DiffStats {\n\tbaseRef: string; // e.g., \"origin/main\", \"abc123\", \"uncommitted\"\n\ttotal: number; // Total files changed\n\tnewFiles: number; // Files added\n\tmodifiedFiles: number; // Files modified\n\tdeletedFiles: number; // Files deleted\n\tlinesAdded: number; // Total lines added\n\tlinesRemoved: number; // Total lines removed\n}\n\nexport interface DiffStatsOptions {\n\tcommit?: string; // If provided, get diff for this commit vs its parent\n\tuncommitted?: boolean; // If true, only get uncommitted changes\n\tfixBase?: string; // If provided, get diff from this ref to current working tree\n}\n\n/**\n * Compute diff statistics for changed files.\n */\nexport async function computeDiffStats(\n\tbaseBranch: string,\n\toptions: DiffStatsOptions = {},\n): Promise<DiffStats> {\n\t// Determine what we're diffing\n\tif (options.commit) {\n\t\treturn computeCommitDiffStats(options.commit);\n\t}\n\n\t// If fixBase is provided, compute diff from that ref to current working tree\n\t// This is used in verification mode to show only NEW changes since the snapshot\n\tif (options.fixBase) {\n\t\treturn computeFixBaseDiffStats(options.fixBase);\n\t}\n\n\tif (options.uncommitted) {\n\t\treturn computeUncommittedDiffStats();\n\t}\n\n\tconst isCI =\n\t\tprocess.env.CI === \"true\" || process.env.GITHUB_ACTIONS === \"true\";\n\n\tif (isCI) {\n\t\treturn computeCIDiffStats(baseBranch);\n\t}\n\n\treturn computeLocalDiffStats(baseBranch);\n}\n\n/**\n * Compute diff stats for a specific commit vs its parent.\n */\nasync function computeCommitDiffStats(commit: string): Promise<DiffStats> {\n\ttry {\n\t\t// Get numstat for line counts\n\t\tconst numstat = await gitExec([\n\t\t\t\"diff\",\n\t\t\t\"--numstat\",\n\t\t\t`${commit}^..${commit}`,\n\t\t]);\n\t\tconst lineStats = parseNumstat(numstat);\n\n\t\t// Get name-status for file categorization\n\t\tconst nameStatus = await gitExec([\n\t\t\t\"diff\",\n\t\t\t\"--name-status\",\n\t\t\t`${commit}^..${commit}`,\n\t\t]);\n\t\tconst fileStats = parseNameStatus(nameStatus);\n\n\t\treturn {\n\t\t\tbaseRef: `${commit}^`,\n\t\t\t...fileStats,\n\t\t\t...lineStats,\n\t\t};\n\t} catch {\n\t\t// If commit has no parent (initial commit), try --root\n\t\ttry {\n\t\t\tconst numstat = await gitExec([\"diff\", \"--numstat\", \"--root\", commit]);\n\t\t\tconst lineStats = parseNumstat(numstat);\n\n\t\t\tconst nameStatus = await gitExec([\n\t\t\t\t\"diff\",\n\t\t\t\t\"--name-status\",\n\t\t\t\t\"--root\",\n\t\t\t\tcommit,\n\t\t\t]);\n\t\t\tconst fileStats = parseNameStatus(nameStatus);\n\n\t\t\treturn {\n\t\t\t\tbaseRef: \"root\",\n\t\t\t\t...fileStats,\n\t\t\t\t...lineStats,\n\t\t\t};\n\t\t} catch {\n\t\t\treturn emptyDiffStats(commit);\n\t\t}\n\t}\n}\n\n/**\n * Compute diff stats for uncommitted changes (staged + unstaged + untracked).\n */\nasync function computeUncommittedDiffStats(): Promise<DiffStats> {\n\t// Get stats for staged changes\n\tconst stagedNumstat = await gitExec([\"diff\", \"--numstat\", \"--cached\"]);\n\tconst stagedLines = parseNumstat(stagedNumstat);\n\n\tconst stagedStatus = await gitExec([\"diff\", \"--name-status\", \"--cached\"]);\n\tconst stagedFiles = parseNameStatus(stagedStatus);\n\n\t// Get stats for unstaged changes\n\tconst unstagedNumstat = await gitExec([\"diff\", \"--numstat\"]);\n\tconst unstagedLines = parseNumstat(unstagedNumstat);\n\n\tconst unstagedStatus = await gitExec([\"diff\", \"--name-status\"]);\n\tconst unstagedFiles = parseNameStatus(unstagedStatus);\n\n\t// Get untracked files (all count as new, lines unknown)\n\tconst untrackedList = await gitExec([\n\t\t\"ls-files\",\n\t\t\"--others\",\n\t\t\"--exclude-standard\",\n\t]);\n\tconst untrackedFiles = untrackedList\n\t\t.split(\"\\n\")\n\t\t.filter((f) => f.trim().length > 0);\n\n\treturn {\n\t\tbaseRef: \"uncommitted\",\n\t\ttotal:\n\t\t\tstagedFiles.total +\n\t\t\tunstagedFiles.total +\n\t\t\tuntrackedFiles.length -\n\t\t\tcountOverlap(stagedStatus, unstagedStatus),\n\t\tnewFiles:\n\t\t\tstagedFiles.newFiles + unstagedFiles.newFiles + untrackedFiles.length,\n\t\tmodifiedFiles: stagedFiles.modifiedFiles + unstagedFiles.modifiedFiles,\n\t\tdeletedFiles: stagedFiles.deletedFiles + unstagedFiles.deletedFiles,\n\t\tlinesAdded: stagedLines.linesAdded + unstagedLines.linesAdded,\n\t\tlinesRemoved: stagedLines.linesRemoved + unstagedLines.linesRemoved,\n\t};\n}\n\n/**\n * Compute diff stats from a fixBase ref (stash or commit) to current working tree.\n * Used in verification mode to show only NEW changes since the snapshot.\n * This includes staged changes, unstaged changes, and new untracked files.\n */\nasync function computeFixBaseDiffStats(fixBase: string): Promise<DiffStats> {\n\ttry {\n\t\t// Get line stats for tracked file changes since fixBase\n\t\t// We need to diff against working tree (staged + unstaged changes)\n\t\tconst numstat = await gitExec([\"diff\", \"--numstat\", fixBase]);\n\t\tconst lineStats = parseNumstat(numstat);\n\n\t\t// Get file categorization for tracked file changes\n\t\tconst nameStatus = await gitExec([\"diff\", \"--name-status\", fixBase]);\n\t\tconst fileStats = parseNameStatus(nameStatus);\n\n\t\t// Handle untracked files: only count NEW untracked files that weren't in fixBase\n\t\t// Current untracked files\n\t\tconst currentUntracked = (\n\t\t\tawait gitExec([\"ls-files\", \"--others\", \"--exclude-standard\"])\n\t\t)\n\t\t\t.split(\"\\n\")\n\t\t\t.filter((f) => f.trim().length > 0);\n\n\t\t// Files that existed in fixBase\n\t\tlet fixBaseFiles: Set<string>;\n\t\ttry {\n\t\t\tconst treeFiles = await gitExec([\n\t\t\t\t\"ls-tree\",\n\t\t\t\t\"-r\",\n\t\t\t\t\"--name-only\",\n\t\t\t\tfixBase,\n\t\t\t]);\n\t\t\tfixBaseFiles = new Set(\n\t\t\t\ttreeFiles.split(\"\\n\").filter((f) => f.trim().length > 0),\n\t\t\t);\n\t\t} catch {\n\t\t\t// If fixBase is invalid or has no tree, assume empty\n\t\t\tfixBaseFiles = new Set();\n\t\t}\n\n\t\t// New untracked files = current untracked - files that existed in fixBase\n\t\tconst newUntrackedFiles = currentUntracked.filter(\n\t\t\t(f) => !fixBaseFiles.has(f),\n\t\t);\n\n\t\treturn {\n\t\t\tbaseRef: fixBase,\n\t\t\ttotal: fileStats.total + newUntrackedFiles.length,\n\t\t\tnewFiles: fileStats.newFiles + newUntrackedFiles.length,\n\t\t\tmodifiedFiles: fileStats.modifiedFiles,\n\t\t\tdeletedFiles: fileStats.deletedFiles,\n\t\t\tlinesAdded: lineStats.linesAdded,\n\t\t\tlinesRemoved: lineStats.linesRemoved,\n\t\t};\n\t} catch {\n\t\treturn emptyDiffStats(fixBase);\n\t}\n}\n\n/**\n * Compute diff stats in CI environment.\n */\nasync function computeCIDiffStats(baseBranch: string): Promise<DiffStats> {\n\tconst headRef = process.env.GITHUB_SHA || \"HEAD\";\n\n\ttry {\n\t\tconst numstat = await gitExec([\n\t\t\t\"diff\",\n\t\t\t\"--numstat\",\n\t\t\t`${baseBranch}...${headRef}`,\n\t\t]);\n\t\tconst lineStats = parseNumstat(numstat);\n\n\t\tconst nameStatus = await gitExec([\n\t\t\t\"diff\",\n\t\t\t\"--name-status\",\n\t\t\t`${baseBranch}...${headRef}`,\n\t\t]);\n\t\tconst fileStats = parseNameStatus(nameStatus);\n\n\t\treturn {\n\t\t\tbaseRef: baseBranch,\n\t\t\t...fileStats,\n\t\t\t...lineStats,\n\t\t};\n\t} catch {\n\t\t// Fallback for push events\n\t\ttry {\n\t\t\tconst numstat = await gitExec([\"diff\", \"--numstat\", \"HEAD^...HEAD\"]);\n\t\t\tconst lineStats = parseNumstat(numstat);\n\n\t\t\tconst nameStatus = await gitExec([\n\t\t\t\t\"diff\",\n\t\t\t\t\"--name-status\",\n\t\t\t\t\"HEAD^...HEAD\",\n\t\t\t]);\n\t\t\tconst fileStats = parseNameStatus(nameStatus);\n\n\t\t\treturn {\n\t\t\t\tbaseRef: \"HEAD^\",\n\t\t\t\t...fileStats,\n\t\t\t\t...lineStats,\n\t\t\t};\n\t\t} catch {\n\t\t\treturn emptyDiffStats(baseBranch);\n\t\t}\n\t}\n}\n\n/**\n * Compute diff stats for local development.\n */\nasync function computeLocalDiffStats(baseBranch: string): Promise<DiffStats> {\n\t// 1. Committed changes relative to base branch\n\tconst committedNumstat = await gitExec([\n\t\t\"diff\",\n\t\t\"--numstat\",\n\t\t`${baseBranch}...HEAD`,\n\t]);\n\tconst committedLines = parseNumstat(committedNumstat);\n\n\tconst committedStatus = await gitExec([\n\t\t\"diff\",\n\t\t\"--name-status\",\n\t\t`${baseBranch}...HEAD`,\n\t]);\n\tconst committedFiles = parseNameStatus(committedStatus);\n\n\t// 2. Uncommitted changes (staged and unstaged)\n\tconst uncommittedNumstat = await gitExec([\"diff\", \"--numstat\", \"HEAD\"]);\n\tconst uncommittedLines = parseNumstat(uncommittedNumstat);\n\n\tconst uncommittedStatus = await gitExec([\"diff\", \"--name-status\", \"HEAD\"]);\n\tconst uncommittedFiles = parseNameStatus(uncommittedStatus);\n\n\t// 3. Untracked files\n\tconst untrackedList = await gitExec([\n\t\t\"ls-files\",\n\t\t\"--others\",\n\t\t\"--exclude-standard\",\n\t]);\n\tconst untrackedFiles = untrackedList\n\t\t.split(\"\\n\")\n\t\t.filter((f) => f.trim().length > 0);\n\n\t// Combine counts (with overlap detection)\n\tconst totalNew =\n\t\tcommittedFiles.newFiles + uncommittedFiles.newFiles + untrackedFiles.length;\n\tconst totalModified =\n\t\tcommittedFiles.modifiedFiles + uncommittedFiles.modifiedFiles;\n\tconst totalDeleted =\n\t\tcommittedFiles.deletedFiles + uncommittedFiles.deletedFiles;\n\n\treturn {\n\t\tbaseRef: baseBranch,\n\t\ttotal: totalNew + totalModified + totalDeleted,\n\t\tnewFiles: totalNew,\n\t\tmodifiedFiles: totalModified,\n\t\tdeletedFiles: totalDeleted,\n\t\tlinesAdded: committedLines.linesAdded + uncommittedLines.linesAdded,\n\t\tlinesRemoved: committedLines.linesRemoved + uncommittedLines.linesRemoved,\n\t};\n}\n\n/**\n * Parse git diff --numstat output for line counts.\n * Format: <added>\\t<removed>\\t<file>\n * Binary files show as \"-\\t-\\t<file>\"\n */\nfunction parseNumstat(output: string): {\n\tlinesAdded: number;\n\tlinesRemoved: number;\n} {\n\tlet linesAdded = 0;\n\tlet linesRemoved = 0;\n\n\tfor (const line of output.split(\"\\n\")) {\n\t\tif (!line.trim()) continue;\n\t\tconst parts = line.split(\"\\t\");\n\t\tif (parts.length < 3) continue;\n\n\t\tconst added = parts[0];\n\t\tconst removed = parts[1];\n\t\t// Binary files show as \"-\"\n\t\tif (added && added !== \"-\") {\n\t\t\tlinesAdded += parseInt(added, 10) || 0;\n\t\t}\n\t\tif (removed && removed !== \"-\") {\n\t\t\tlinesRemoved += parseInt(removed, 10) || 0;\n\t\t}\n\t}\n\n\treturn { linesAdded, linesRemoved };\n}\n\n/**\n * Parse git diff --name-status output for file categorization.\n * Format: <status>\\t<file> (and optionally \\t<new-file> for renames)\n * Status codes: A=added, M=modified, D=deleted, R=renamed, C=copied, T=type-change\n */\nfunction parseNameStatus(output: string): {\n\ttotal: number;\n\tnewFiles: number;\n\tmodifiedFiles: number;\n\tdeletedFiles: number;\n} {\n\tlet newFiles = 0;\n\tlet modifiedFiles = 0;\n\tlet deletedFiles = 0;\n\n\tfor (const line of output.split(\"\\n\")) {\n\t\tif (!line.trim()) continue;\n\t\tconst status = line[0];\n\n\t\tswitch (status) {\n\t\t\tcase \"A\":\n\t\t\t\tnewFiles++;\n\t\t\t\tbreak;\n\t\t\tcase \"M\":\n\t\t\tcase \"R\":\n\t\t\tcase \"C\":\n\t\t\tcase \"T\":\n\t\t\t\tmodifiedFiles++;\n\t\t\t\tbreak;\n\t\t\tcase \"D\":\n\t\t\t\tdeletedFiles++;\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\treturn {\n\t\ttotal: newFiles + modifiedFiles + deletedFiles,\n\t\tnewFiles,\n\t\tmodifiedFiles,\n\t\tdeletedFiles,\n\t};\n}\n\n/**\n * Count overlapping files between two name-status outputs.\n * Used to avoid double-counting files that appear in both staged and unstaged.\n */\nfunction countOverlap(status1: string, status2: string): number {\n\tconst files1 = new Set<string>();\n\tfor (const line of status1.split(\"\\n\")) {\n\t\tif (!line.trim()) continue;\n\t\tconst parts = line.split(\"\\t\");\n\t\tconst file = parts[1];\n\t\tif (parts.length >= 2 && file) {\n\t\t\tfiles1.add(file);\n\t\t}\n\t}\n\n\tlet overlap = 0;\n\tfor (const line of status2.split(\"\\n\")) {\n\t\tif (!line.trim()) continue;\n\t\tconst parts = line.split(\"\\t\");\n\t\tconst file = parts[1];\n\t\tif (parts.length >= 2 && file && files1.has(file)) {\n\t\t\toverlap++;\n\t\t}\n\t}\n\n\treturn overlap;\n}\n\n/**\n * Return empty diff stats with the given base ref.\n */\nfunction emptyDiffStats(baseRef: string): DiffStats {\n\treturn {\n\t\tbaseRef,\n\t\ttotal: 0,\n\t\tnewFiles: 0,\n\t\tmodifiedFiles: 0,\n\t\tdeletedFiles: 0,\n\t\tlinesAdded: 0,\n\t\tlinesRemoved: 0,\n\t};\n}\n",
|
|
58
60
|
"import type { Command } from \"commander\";\nimport { executeRun } from \"../core/run-executor.js\";\nimport { isSuccessStatus } from \"../types/gauntlet-status.js\";\n\nexport function registerRunCommand(program: Command): void {\n\tprogram\n\t\t.command(\"run\")\n\t\t.description(\"Run gates for detected changes\")\n\t\t.option(\n\t\t\t\"-b, --base-branch <branch>\",\n\t\t\t\"Override base branch for change detection\",\n\t\t)\n\t\t.option(\"-g, --gate <name>\", \"Run specific gate only\")\n\t\t.option(\"-c, --commit <sha>\", \"Use diff for a specific commit\")\n\t\t.option(\n\t\t\t\"-u, --uncommitted\",\n\t\t\t\"Use diff for current uncommitted changes (staged and unstaged)\",\n\t\t)\n\t\t.action(async (options) => {\n\t\t\tconst result = await executeRun({\n\t\t\t\tbaseBranch: options.baseBranch,\n\t\t\t\tgate: options.gate,\n\t\t\t\tcommit: options.commit,\n\t\t\t\tuncommitted: options.uncommitted,\n\t\t\t});\n\n\t\t\tprocess.exit(isSuccessStatus(result.status) ? 0 : 1);\n\t\t});\n}\n",
|
|
61
|
+
"import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport type { Command } from \"commander\";\nimport YAML from \"yaml\";\nimport { loadGlobalConfig } from \"../config/global.js\";\nimport { getDebugLogConfig, getLogDir } from \"../hooks/stop-hook-handler.js\";\nimport { DebugLogger, mergeDebugLogConfig } from \"../utils/debug-log.js\";\n\nconst START_HOOK_MESSAGE = `<IMPORTANT>\nThis project uses Agent Gauntlet for automated quality verification.\n\nBEFORE reporting any coding task as complete, you MUST run /gauntlet-run\nto verify your changes pass all quality gates.\n\nRun /gauntlet-run when ALL of these are true:\n 1. You completed a coding task (implemented a feature, fixed a bug,\n refactored code, or made other substantive code changes)\n 2. You are about to report the work as done, complete, or fixed\n\nDo NOT run /gauntlet-run when:\n - You only answered questions, explored code, or ran read-only commands\n - You are in the middle of a multi-step task (run it at the end, not\n after every individual change)\n - The user explicitly asked to skip verification\n\nIf you are unsure whether to run it, run it. False positives (running\nunnecessarily) are far less costly than false negatives (skipping\nverification on code that needed it).\n</IMPORTANT>`;\n\nfunction formatClaudeOutput(message: string): string {\n\treturn JSON.stringify({\n\t\thookSpecificOutput: {\n\t\t\thookEventName: \"SessionStart\",\n\t\t\tadditionalContext: message,\n\t\t},\n\t});\n}\n\nfunction formatCursorOutput(message: string): string {\n\treturn message;\n}\n\n/**\n * Validate that the config file contains parseable YAML with at least some content.\n * Returns true if valid, false if empty or invalid.\n */\nfunction isValidConfig(content: string): boolean {\n\tconst trimmed = content.trim();\n\tif (!trimmed) {\n\t\treturn false;\n\t}\n\ttry {\n\t\tconst parsed = YAML.parse(trimmed);\n\t\t// YAML.parse returns null for empty documents, undefined for some edge cases\n\t\treturn parsed != null && typeof parsed === \"object\";\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nexport function registerStartHookCommand(program: Command): void {\n\tprogram\n\t\t.command(\"start-hook\")\n\t\t.description(\n\t\t\t\"Session start hook - primes agent with gauntlet verification instructions\",\n\t\t)\n\t\t.option(\"--adapter <adapter>\", \"Output format: claude or cursor\", \"claude\")\n\t\t.action(async (options: { adapter: string }) => {\n\t\t\t// Fast exit if not a gauntlet project\n\t\t\tconst configPath = path.join(process.cwd(), \".gauntlet\", \"config.yml\");\n\t\t\ttry {\n\t\t\t\tconst content = await fs.readFile(configPath, \"utf-8\");\n\t\t\t\tif (!isValidConfig(content)) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t} catch {\n\t\t\t\t// No config file — silent exit\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst adapter = options.adapter;\n\n\t\t\t// Log to .debug.log\n\t\t\ttry {\n\t\t\t\tconst cwd = process.cwd();\n\t\t\t\tconst logDir = path.join(cwd, await getLogDir(cwd));\n\t\t\t\tconst globalConfig = await loadGlobalConfig();\n\t\t\t\tconst projectDebugLogConfig = await getDebugLogConfig(cwd);\n\t\t\t\tconst debugLogConfig = mergeDebugLogConfig(\n\t\t\t\t\tprojectDebugLogConfig,\n\t\t\t\t\tglobalConfig.debug_log,\n\t\t\t\t);\n\t\t\t\tconst debugLogger = new DebugLogger(logDir, debugLogConfig);\n\t\t\t\tawait debugLogger.logStartHook(adapter);\n\t\t\t} catch {\n\t\t\t\t// Debug logging should never break the hook\n\t\t\t}\n\n\t\t\tconst output =\n\t\t\t\tadapter === \"cursor\"\n\t\t\t\t\t? formatCursorOutput(START_HOOK_MESSAGE)\n\t\t\t\t\t: formatClaudeOutput(START_HOOK_MESSAGE);\n\n\t\t\tconsole.log(output);\n\t\t});\n}\n",
|
|
59
62
|
"import chalk from \"chalk\";\nimport type { Command } from \"commander\";\nimport { loadConfig } from \"../config/loader.js\";\n\nexport function registerValidateCommand(program: Command): void {\n\tprogram\n\t\t.command(\"validate\")\n\t\t.description(\"Validate .gauntlet/ config files against schemas\")\n\t\t.action(async () => {\n\t\t\ttry {\n\t\t\t\tawait loadConfig();\n\t\t\t\tconsole.log(chalk.green(\"All config files are valid.\"));\n\t\t\t\tprocess.exitCode = 0;\n\t\t\t} catch (error: unknown) {\n\t\t\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\t\t\tconsole.error(chalk.red(\"Validation failed:\"), message);\n\t\t\t\tprocess.exitCode = 1;\n\t\t\t}\n\t\t});\n}\n",
|
|
60
63
|
"import { spawn } from \"node:child_process\";\nimport type { Command } from \"commander\";\n\n/**\n * Output structure from wait-ci command.\n */\nexport interface WaitCIResult {\n\tci_status: \"passed\" | \"failed\" | \"pending\" | \"error\";\n\tpr_number?: number;\n\tpr_url?: string;\n\tfailed_checks: Array<{\n\t\tname: string;\n\t\tconclusion: string;\n\t\tdetails_url: string;\n\t\t/** Actual error output from GitHub Actions logs (if available) */\n\t\tlog_output?: string;\n\t}>;\n\treview_comments: Array<{\n\t\tauthor: string;\n\t\tbody: string;\n\t\tpath?: string;\n\t\tline?: number;\n\t}>;\n\telapsed_seconds: number;\n\terror_message?: string;\n}\n\n/**\n * Check if gh CLI is available.\n */\nasync function isGhAvailable(): Promise<boolean> {\n\treturn new Promise((resolve) => {\n\t\tconst proc = spawn(\"gh\", [\"--version\"], { stdio: \"pipe\" });\n\t\tproc.on(\"close\", (code) => resolve(code === 0));\n\t\tproc.on(\"error\", () => resolve(false));\n\t});\n}\n\n/**\n * Run a gh command and return the output.\n */\nasync function runGh(\n\targs: string[],\n\tcwd?: string,\n): Promise<{ code: number; stdout: string; stderr: string }> {\n\treturn new Promise((resolve) => {\n\t\tconst proc = spawn(\"gh\", args, { stdio: \"pipe\", cwd });\n\t\tlet stdout = \"\";\n\t\tlet stderr = \"\";\n\n\t\tproc.stdout.on(\"data\", (data) => {\n\t\t\tstdout += data.toString();\n\t\t});\n\t\tproc.stderr.on(\"data\", (data) => {\n\t\t\tstderr += data.toString();\n\t\t});\n\n\t\tproc.on(\"close\", (code) => {\n\t\t\tresolve({ code: code ?? 1, stdout, stderr });\n\t\t});\n\t\tproc.on(\"error\", (err) => {\n\t\t\tresolve({ code: 1, stdout: \"\", stderr: err.message });\n\t\t});\n\t});\n}\n\n/**\n * Get PR info for the current branch.\n * Returns null if no PR found or on error.\n */\nasync function getPRInfo(\n\tcwd?: string,\n): Promise<{ number: number; url: string; headRefName: string } | null> {\n\tconst result = await runGh(\n\t\t[\"pr\", \"view\", \"--json\", \"number,url,headRefName\"],\n\t\tcwd,\n\t);\n\tif (result.code !== 0) {\n\t\treturn null;\n\t}\n\ttry {\n\t\treturn JSON.parse(result.stdout.trim());\n\t} catch {\n\t\treturn null;\n\t}\n}\n\n/**\n * Get CI check statuses for a PR.\n * Returns null on error, empty array if no checks.\n * Note: gh pr checks uses 'state' (FAILURE/SUCCESS/PENDING) and 'link' (not conclusion/detailsUrl)\n */\nasync function getChecks(cwd?: string): Promise<Array<{\n\tname: string;\n\tstate: string;\n\tlink: string;\n}> | null> {\n\tconst result = await runGh(\n\t\t[\"pr\", \"checks\", \"--json\", \"name,state,link\"],\n\t\tcwd,\n\t);\n\tconst output = result.stdout.trim();\n\tif (!output) {\n\t\treturn result.code === 0 ? [] : null;\n\t}\n\ttry {\n\t\treturn JSON.parse(output) || [];\n\t} catch {\n\t\treturn result.code === 0 ? [] : null;\n\t}\n}\n\n/**\n * Get reviews for a PR.\n * Returns null on error, empty array if no reviews.\n */\nasync function getReviews(\n\tprNumber: number,\n\tcwd?: string,\n): Promise<Array<{\n\tauthor: { login: string };\n\tstate: string;\n\tbody: string;\n}> | null> {\n\t// Get owner/repo from gh\n\tconst repoResult = await runGh([\"repo\", \"view\", \"--json\", \"owner,name\"], cwd);\n\tif (repoResult.code !== 0) {\n\t\treturn null;\n\t}\n\tlet owner: string;\n\tlet repo: string;\n\ttry {\n\t\tconst repoInfo = JSON.parse(repoResult.stdout.trim());\n\t\towner = repoInfo.owner.login;\n\t\trepo = repoInfo.name;\n\t} catch {\n\t\treturn null;\n\t}\n\n\tconst result = await runGh(\n\t\t[\n\t\t\t\"api\",\n\t\t\t\"--paginate\",\n\t\t\t`repos/${owner}/${repo}/pulls/${prNumber}/reviews?per_page=100`,\n\t\t],\n\t\tcwd,\n\t);\n\tif (result.code !== 0) {\n\t\treturn null;\n\t}\n\ttry {\n\t\t// GitHub API returns 'user' not 'author', so we transform the response\n\t\tconst rawReviews = JSON.parse(result.stdout.trim()) || [];\n\t\treturn rawReviews\n\t\t\t.filter(\n\t\t\t\t(r: { user?: { login: string }; state: string; body: string }) =>\n\t\t\t\t\tr.user?.login,\n\t\t\t)\n\t\t\t.map((r: { user: { login: string }; state: string; body: string }) => ({\n\t\t\t\tauthor: { login: r.user.login },\n\t\t\t\tstate: r.state,\n\t\t\t\tbody: r.body || \"\",\n\t\t\t}));\n\t} catch {\n\t\treturn null;\n\t}\n}\n\n/**\n * Get the latest review state per author.\n * GitHub API returns all historical reviews, so we need to deduplicate\n * to find each reviewer's current state.\n */\nfunction getLatestReviewsByAuthor(\n\treviews: Array<{ author: { login: string }; state: string; body: string }>,\n): Array<{ author: { login: string }; state: string; body: string }> {\n\tconst latestByAuthor = new Map<\n\t\tstring,\n\t\t{ author: { login: string }; state: string; body: string }\n\t>();\n\t// Process in order - later reviews override earlier ones\n\tfor (const review of reviews) {\n\t\tlatestByAuthor.set(review.author.login, review);\n\t}\n\treturn Array.from(latestByAuthor.values());\n}\n\n/**\n * Sleep for a given number of milliseconds.\n */\nfunction sleep(ms: number): Promise<void> {\n\treturn new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/**\n * Extract GitHub Actions run ID from a check link.\n * Links look like: https://github.com/owner/repo/actions/runs/RUN_ID/job/JOB_ID\n * Returns null if the link is not a GitHub Actions link.\n */\nfunction extractRunId(link: string): string | null {\n\tconst match = link.match(/\\/actions\\/runs\\/(\\d+)/);\n\treturn match?.[1] ?? null;\n}\n\n/**\n * Fetch failed job logs for a GitHub Actions run.\n * Uses `gh run view <run-id> --log-failed` to get actual error output.\n * Returns null if logs can't be fetched.\n */\nasync function getFailedRunLogs(\n\trunId: string,\n\tcwd?: string,\n): Promise<string | null> {\n\tconst result = await runGh([\"run\", \"view\", runId, \"--log-failed\"], cwd);\n\tif (result.code !== 0 || !result.stdout.trim()) {\n\t\treturn null;\n\t}\n\t// Limit output to avoid huge payloads (keep last ~100 lines)\n\tconst lines = result.stdout.trim().split(\"\\n\");\n\tconst maxLines = 100;\n\tif (lines.length > maxLines) {\n\t\treturn `... (${lines.length - maxLines} lines truncated)\\n${lines.slice(-maxLines).join(\"\\n\")}`;\n\t}\n\treturn result.stdout.trim();\n}\n\n/** Group checks by run ID, separating GitHub Actions from external checks */\nfunction groupChecksByRunId(\n\tfailedChecks: Array<{ name: string; state: string; link: string }>,\n): Map<string, Array<{ name: string; state: string; link: string }>> {\n\tconst runIdToChecks = new Map<\n\t\tstring,\n\t\tArray<{ name: string; state: string; link: string }>\n\t>();\n\n\tfor (const check of failedChecks) {\n\t\tconst runId = extractRunId(check.link);\n\t\t// Use empty string for external checks (no run ID)\n\t\tconst key = runId ?? \"\";\n\t\tconst existing = runIdToChecks.get(key) ?? [];\n\t\texisting.push(check);\n\t\trunIdToChecks.set(key, existing);\n\t}\n\n\treturn runIdToChecks;\n}\n\n/**\n * Fetch failure logs for failed checks.\n * Only works for GitHub Actions checks; external checks (CodeScene, etc.) return null.\n * Fetches logs in parallel for better performance.\n */\nasync function enrichFailedChecksWithLogs(\n\tfailedChecks: Array<{ name: string; state: string; link: string }>,\n\tcwd?: string,\n): Promise<\n\tArray<{ name: string; state: string; link: string; log_output?: string }>\n> {\n\tconst runIdToChecks = groupChecksByRunId(failedChecks);\n\n\t// Fetch logs in parallel for all unique run IDs\n\tconst entries = Array.from(runIdToChecks.entries());\n\tconst logResults = await Promise.all(\n\t\tentries.map(([runId]) =>\n\t\t\trunId ? getFailedRunLogs(runId, cwd) : Promise.resolve(null),\n\t\t),\n\t);\n\n\t// Build results with fetched logs\n\tconst results: Array<{\n\t\tname: string;\n\t\tstate: string;\n\t\tlink: string;\n\t\tlog_output?: string;\n\t}> = [];\n\n\tfor (let i = 0; i < entries.length; i++) {\n\t\t// biome-ignore lint/style/noNonNullAssertion: index within bounds\n\t\tconst [, checks] = entries[i]!;\n\t\tconst logs = logResults[i];\n\t\tfor (const check of checks) {\n\t\t\tresults.push({ ...check, log_output: logs ?? undefined });\n\t\t}\n\t}\n\n\treturn results;\n}\n\n/** Options for creating a WaitCIResult */\ninterface ResultOptions {\n\tstatus: WaitCIResult[\"ci_status\"];\n\tstartTime: number;\n\tprInfo?: { number: number; url: string };\n\terrorMessage?: string;\n\tfailedChecks?: Array<{\n\t\tname: string;\n\t\tstate: string;\n\t\tlink: string;\n\t\tlog_output?: string;\n\t}>;\n\treviewComments?: Array<{ author: string; body: string }>;\n}\n\n/** Create a WaitCIResult with the given options */\nfunction createResult(opts: ResultOptions): WaitCIResult {\n\tconst elapsed = Math.round((Date.now() - opts.startTime) / 1000);\n\treturn {\n\t\tci_status: opts.status,\n\t\tpr_number: opts.prInfo?.number,\n\t\tpr_url: opts.prInfo?.url,\n\t\tfailed_checks:\n\t\t\topts.failedChecks?.map((c) => ({\n\t\t\t\tname: c.name,\n\t\t\t\tconclusion: c.state.toLowerCase(),\n\t\t\t\tdetails_url: c.link,\n\t\t\t\tlog_output: c.log_output,\n\t\t\t})) || [],\n\t\treview_comments: opts.reviewComments || [],\n\t\telapsed_seconds: elapsed,\n\t\terror_message: opts.errorMessage,\n\t};\n}\n\n/** Poll outcome from a single CI status check */\ninterface PollOutcome {\n\terror?: string;\n\tnoChecksYet?: boolean;\n\tnoChecksConfigured?: boolean;\n\tshouldFail?: boolean;\n\tshouldPass?: boolean;\n\tfailedChecks?: Array<{\n\t\tname: string;\n\t\tstate: string;\n\t\tlink: string;\n\t\tlog_output?: string;\n\t}>;\n\treviewComments?: Array<{ author: string; body: string }>;\n}\n\n/** Poll CI status and reviews once, returning the outcome */\nasync function pollCIStatus(\n\tcwd: string | undefined,\n\tprNumber: number,\n\tisFirstPoll: boolean,\n): Promise<PollOutcome> {\n\tconst checks = await getChecks(cwd);\n\tconst reviews = await getReviews(prNumber, cwd);\n\n\tif (checks === null || reviews === null) {\n\t\treturn { error: \"Failed to fetch CI status or reviews from GitHub\" };\n\t}\n\n\t// Handle zero checks case\n\tif (checks.length === 0) {\n\t\treturn isFirstPoll ? { noChecksYet: true } : { noChecksConfigured: true };\n\t}\n\n\t// Process checks and reviews\n\tconst latestReviews = getLatestReviewsByAuthor(reviews);\n\tconst failedChecks = checks.filter((c) => c.state === \"FAILURE\");\n\tconst blockingReviews = latestReviews.filter(\n\t\t(r) => r.state === \"CHANGES_REQUESTED\",\n\t);\n\tconst reviewComments = blockingReviews.map((r) => ({\n\t\tauthor: r.author.login,\n\t\tbody: r.body || \"\",\n\t}));\n\tconst pendingChecks = checks.filter(\n\t\t(c) =>\n\t\t\tc.state === \"PENDING\" ||\n\t\t\tc.state === \"QUEUED\" ||\n\t\t\tc.state === \"IN_PROGRESS\",\n\t);\n\n\tconst shouldFail = failedChecks.length > 0 || blockingReviews.length > 0;\n\tconst shouldPass = pendingChecks.length === 0;\n\n\treturn { shouldFail, shouldPass, failedChecks, reviewComments };\n}\n\n/**\n * Wait for CI to complete and check for blocking reviews.\n * @param timeoutSeconds Maximum time to wait for CI\n * @param pollIntervalSeconds Time between polls\n * @param cwd Working directory for gh commands (defaults to process.cwd())\n */\nexport async function waitForCI(\n\ttimeoutSeconds: number,\n\tpollIntervalSeconds: number,\n\tcwd?: string,\n): Promise<WaitCIResult> {\n\tconst startTime = Date.now();\n\tlet isFirstPoll = true;\n\n\tif (!(await isGhAvailable())) {\n\t\treturn createResult({\n\t\t\tstatus: \"error\",\n\t\t\tstartTime,\n\t\t\terrorMessage: \"gh CLI is not installed or not authenticated\",\n\t\t});\n\t}\n\n\tconst prInfo = await getPRInfo(cwd);\n\tif (!prInfo) {\n\t\treturn createResult({\n\t\t\tstatus: \"error\",\n\t\t\tstartTime,\n\t\t\terrorMessage: \"No PR found for current branch\",\n\t\t});\n\t}\n\n\tconst timeoutMs = timeoutSeconds * 1000;\n\n\twhile (Date.now() - startTime < timeoutMs) {\n\t\tconst pollOutcome = await pollCIStatus(cwd, prInfo.number, isFirstPoll);\n\t\tisFirstPoll = false;\n\n\t\tif (pollOutcome.error) {\n\t\t\treturn createResult({\n\t\t\t\tstatus: \"error\",\n\t\t\t\tstartTime,\n\t\t\t\tprInfo,\n\t\t\t\terrorMessage: pollOutcome.error,\n\t\t\t});\n\t\t}\n\n\t\tif (pollOutcome.noChecksYet) {\n\t\t\tawait sleep(pollIntervalSeconds * 1000);\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (pollOutcome.noChecksConfigured) {\n\t\t\treturn createResult({ status: \"passed\", startTime, prInfo });\n\t\t}\n\n\t\tif (pollOutcome.shouldFail && pollOutcome.failedChecks) {\n\t\t\t// Enrich failed checks with actual log output from GitHub Actions\n\t\t\tconst enrichedChecks = await enrichFailedChecksWithLogs(\n\t\t\t\tpollOutcome.failedChecks,\n\t\t\t\tcwd,\n\t\t\t);\n\t\t\treturn createResult({\n\t\t\t\tstatus: \"failed\",\n\t\t\t\tstartTime,\n\t\t\t\tprInfo,\n\t\t\t\tfailedChecks: enrichedChecks,\n\t\t\t\treviewComments: pollOutcome.reviewComments,\n\t\t\t});\n\t\t}\n\n\t\tif (pollOutcome.shouldPass) {\n\t\t\treturn createResult({ status: \"passed\", startTime, prInfo });\n\t\t}\n\n\t\tawait sleep(pollIntervalSeconds * 1000);\n\t}\n\n\treturn createResult({ status: \"pending\", startTime, prInfo });\n}\n\nexport function registerWaitCICommand(program: Command): void {\n\tprogram\n\t\t.command(\"wait-ci\")\n\t\t.description(\n\t\t\t\"Wait for CI checks to complete and check for blocking reviews\",\n\t\t)\n\t\t.option(\n\t\t\t\"--timeout <seconds>\",\n\t\t\t\"Maximum time to wait for CI (default: 270)\",\n\t\t\t\"270\",\n\t\t)\n\t\t.option(\n\t\t\t\"--poll-interval <seconds>\",\n\t\t\t\"Time between CI status checks (default: 15)\",\n\t\t\t\"15\",\n\t\t)\n\t\t.action(async (options) => {\n\t\t\tconst timeout = Number.parseInt(options.timeout, 10);\n\t\t\tconst pollInterval = Number.parseInt(options.pollInterval, 10);\n\n\t\t\tif (Number.isNaN(timeout) || timeout <= 0) {\n\t\t\t\tconsole.log(\n\t\t\t\t\tJSON.stringify({\n\t\t\t\t\t\tci_status: \"error\",\n\t\t\t\t\t\tfailed_checks: [],\n\t\t\t\t\t\treview_comments: [],\n\t\t\t\t\t\telapsed_seconds: 0,\n\t\t\t\t\t\terror_message: \"Invalid timeout value\",\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\n\t\t\tif (Number.isNaN(pollInterval) || pollInterval <= 0) {\n\t\t\t\tconsole.log(\n\t\t\t\t\tJSON.stringify({\n\t\t\t\t\t\tci_status: \"error\",\n\t\t\t\t\t\tfailed_checks: [],\n\t\t\t\t\t\treview_comments: [],\n\t\t\t\t\t\telapsed_seconds: 0,\n\t\t\t\t\t\terror_message: \"Invalid poll-interval value\",\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\n\t\t\tconst result = await waitForCI(timeout, pollInterval);\n\t\t\tconsole.log(JSON.stringify(result));\n\n\t\t\t// Exit codes: 0=passed, 1=failed/error, 2=pending (timeout)\n\t\t\tif (result.ci_status === \"passed\") {\n\t\t\t\tprocess.exit(0);\n\t\t\t} else if (result.ci_status === \"pending\") {\n\t\t\t\tprocess.exit(2);\n\t\t\t} else {\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\t\t});\n}\n"
|
|
61
64
|
],
|
|
62
|
-
"mappings": "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",
|
|
63
|
-
"debugId": "
|
|
65
|
+
"mappings": "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",
|
|
66
|
+
"debugId": "27272999504866CC64756E2164756E21",
|
|
64
67
|
"names": []
|
|
65
68
|
}
|