harness-evolve 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +254 -0
- package/dist/cli.js +1685 -0
- package/dist/cli.js.map +1 -0
- package/dist/delivery/run-evolve.d.ts +2 -0
- package/dist/delivery/run-evolve.js +2069 -0
- package/dist/delivery/run-evolve.js.map +1 -0
- package/dist/hooks/permission-request.d.ts +8 -0
- package/dist/hooks/permission-request.js +405 -0
- package/dist/hooks/permission-request.js.map +1 -0
- package/dist/hooks/post-tool-use-failure.d.ts +9 -0
- package/dist/hooks/post-tool-use-failure.js +437 -0
- package/dist/hooks/post-tool-use-failure.js.map +1 -0
- package/dist/hooks/post-tool-use.d.ts +9 -0
- package/dist/hooks/post-tool-use.js +441 -0
- package/dist/hooks/post-tool-use.js.map +1 -0
- package/dist/hooks/pre-tool-use.d.ts +8 -0
- package/dist/hooks/pre-tool-use.js +434 -0
- package/dist/hooks/pre-tool-use.js.map +1 -0
- package/dist/hooks/stop.d.ts +8 -0
- package/dist/hooks/stop.js +1609 -0
- package/dist/hooks/stop.js.map +1 -0
- package/dist/hooks/user-prompt-submit.d.ts +8 -0
- package/dist/hooks/user-prompt-submit.js +442 -0
- package/dist/hooks/user-prompt-submit.js.map +1 -0
- package/dist/index.d.ts +1029 -0
- package/dist/index.js +3131 -0
- package/dist/index.js.map +1 -0
- package/package.json +104 -0
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/cli.ts","../src/cli/init.ts","../src/cli/utils.ts","../src/scan/context-builder.ts","../src/scan/schemas.ts","../src/scan/scanners/redundancy.ts","../src/scan/scanners/mechanization.ts","../src/scan/scanners/staleness.ts","../src/scan/scanners/index.ts","../src/scan/index.ts","../src/commands/evolve-scan.ts","../src/commands/evolve-apply.ts","../src/storage/counter.ts","../src/schemas/counter.ts","../src/storage/dirs.ts","../src/delivery/state.ts","../src/schemas/delivery.ts","../src/cli/status.ts","../src/cli/uninstall.ts","../src/cli/scan.ts","../src/cli/apply.ts","../src/schemas/recommendation.ts","../src/delivery/auto-apply.ts","../src/storage/config.ts","../src/schemas/config.ts","../src/delivery/appliers/index.ts","../src/delivery/appliers/settings-applier.ts","../src/delivery/appliers/rule-applier.ts","../src/delivery/appliers/hook-applier.ts","../src/generators/schemas.ts","../src/generators/hook-generator.ts","../src/delivery/appliers/claude-md-applier.ts"],"sourcesContent":["#!/usr/bin/env node\n// CLI entry point -- Commander.js program with init, status, and uninstall subcommands\n\nimport { Command } from '@commander-js/extra-typings';\nimport { readFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { registerInitCommand } from './cli/init.js';\nimport { registerStatusCommand } from './cli/status.js';\nimport { registerUninstallCommand } from './cli/uninstall.js';\nimport { registerScanCommand } from './cli/scan.js';\nimport { registerPendingCommand, registerApplyOneCommand, registerDismissCommand } from './cli/apply.js';\n\n// Read version from package.json at runtime\n// import.meta.dirname = dist/ (where cli.js lives after build)\nconst pkg = JSON.parse(\n readFileSync(join(import.meta.dirname, '..', 'package.json'), 'utf-8'),\n);\n\nconst program = new Command()\n .name('harness-evolve')\n .description('Self-iteration engine for Claude Code')\n .version(pkg.version);\n\n// Register all subcommands\nregisterInitCommand(program);\nregisterStatusCommand(program);\nregisterUninstallCommand(program);\nregisterScanCommand(program);\nregisterPendingCommand(program);\nregisterApplyOneCommand(program);\nregisterDismissCommand(program);\n\nprogram.parse();\n","// Init command implementation -- registers harness-evolve hooks in Claude Code settings.json\n// and runs a deep scan of existing configuration for quality issues.\n\nimport { copyFile, mkdir, access, writeFile } from 'node:fs/promises';\nimport { dirname, join } from 'node:path';\nimport type { Command } from '@commander-js/extra-typings';\nimport {\n HOOK_REGISTRATIONS,\n SETTINGS_PATH,\n resolveHookPath,\n readSettings,\n writeSettings,\n mergeHooks,\n confirm,\n} from './utils.js';\nimport { runDeepScan } from '../scan/index.js';\nimport { generateScanCommand } from '../commands/evolve-scan.js';\nimport { generateApplyCommand } from '../commands/evolve-apply.js';\n\n/**\n * Options for runInit, with test overrides.\n */\nexport interface InitOptions {\n yes: boolean;\n settingsPath?: string;\n baseDirOverride?: string;\n projectDir?: string;\n}\n\n/**\n * Check if a file exists by attempting to access it.\n */\nasync function fileExists(path: string): Promise<boolean> {\n try {\n await access(path);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Install slash command Markdown files into the project's .claude/commands/evolve/ directory.\n * Creates the directory if it doesn't exist. Skips files that already exist (create-only guard).\n */\nasync function installSlashCommands(projectDir: string): Promise<void> {\n const commandsDir = join(projectDir, '.claude', 'commands', 'evolve');\n await mkdir(commandsDir, { recursive: true });\n\n const commands = [\n { name: 'scan', generate: generateScanCommand, path: join(commandsDir, 'scan.md') },\n { name: 'apply', generate: generateApplyCommand, path: join(commandsDir, 'apply.md') },\n ];\n\n for (const cmd of commands) {\n if (await fileExists(cmd.path)) {\n console.log(` /evolve:${cmd.name} already installed, skipping`);\n } else {\n await writeFile(cmd.path, cmd.generate(), 'utf-8');\n console.log(` /evolve:${cmd.name} installed`);\n }\n }\n}\n\n/**\n * Core init logic -- exported for testing.\n *\n * 1. Resolve hook paths for all 6 events\n * 2. Display planned registrations\n * 3. Detect npx install and warn about ephemeral paths\n * 4. Confirm with user (unless --yes)\n * 5. Ensure directory exists, backup existing settings, merge, write\n */\nexport async function runInit(options: InitOptions): Promise<void> {\n const settingsPath = options.settingsPath ?? SETTINGS_PATH;\n\n // Build hook commands with resolved absolute paths\n const hookCommands = HOOK_REGISTRATIONS.map((reg) => {\n const absolutePath = resolveHookPath(reg.hookFile, options.baseDirOverride);\n return {\n event: reg.event,\n command: `node \"${absolutePath}\"`,\n timeout: reg.timeout,\n async: reg.async,\n description: reg.description,\n };\n });\n\n // Display planned registrations\n console.log('\\nPlanned hook registrations:\\n');\n for (const hc of hookCommands) {\n const asyncLabel = hc.async ? ' (async)' : '';\n console.log(` ${hc.event}${asyncLabel} -- ${hc.description}`);\n console.log(` -> ${hc.command}`);\n }\n console.log('');\n\n // Detect npx ephemeral paths\n const samplePath = hookCommands[0].command;\n if (samplePath.includes('.npm/_npx/')) {\n console.log(\n 'WARNING: Detected npx installation. Hook paths may break when the',\n );\n console.log(\n 'npx cache is cleared. For persistent installation, use: npm i -g harness-evolve\\n',\n );\n }\n\n // Confirm unless --yes\n if (!options.yes) {\n const accepted = await confirm('Register hooks in settings.json?');\n if (!accepted) {\n console.log('Aborted.');\n return;\n }\n }\n\n // Ensure settings directory exists\n await mkdir(dirname(settingsPath), { recursive: true });\n\n // Backup existing settings.json if it exists\n const exists = await fileExists(settingsPath);\n if (exists) {\n await copyFile(settingsPath, settingsPath + '.backup');\n console.log(`Backup created: ${settingsPath}.backup`);\n }\n\n // Read existing settings (returns {} if file missing)\n const settings = await readSettings(settingsPath);\n\n // Merge hooks\n const merged = mergeHooks(settings, hookCommands);\n\n // Write merged settings\n await writeSettings(merged, settingsPath);\n\n console.log(\n `Hooks registered successfully! (${hookCommands.length} events)`,\n );\n\n // Install slash commands\n console.log('\\nInstalling slash commands...\\n');\n await installSlashCommands(options.projectDir ?? process.cwd());\n\n // Deep scan: analyze existing configuration for quality issues\n try {\n console.log('\\nScanning configuration...\\n');\n const scanResult = await runDeepScan(process.cwd());\n if (scanResult.recommendations.length > 0) {\n console.log(\n `Found ${scanResult.recommendations.length} configuration suggestion(s):\\n`,\n );\n for (const rec of scanResult.recommendations) {\n console.log(` [${rec.confidence}] ${rec.title}`);\n console.log(` ${rec.description}`);\n console.log(` Suggested: ${rec.suggested_action}\\n`);\n }\n } else {\n console.log('Configuration looks clean -- no issues detected.\\n');\n }\n } catch (err) {\n // Scan is advisory -- don't block init on scan failures\n console.error(\n `Warning: Configuration scan failed: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n}\n\n/**\n * Register the init subcommand on a Commander.js program.\n */\nexport function registerInitCommand(program: Command): void {\n program\n .command('init')\n .description('Register harness-evolve hooks in Claude Code settings')\n .option('--yes', 'Skip confirmation prompt')\n .action(async (opts) => {\n await runInit({ yes: opts.yes ?? false });\n });\n}\n","// Shared CLI utilities: hook definitions, settings I/O, path resolution, confirm prompt\n\nimport { readFile } from 'node:fs/promises';\nimport { dirname, join } from 'node:path';\nimport { createInterface } from 'node:readline/promises';\nimport writeFileAtomic from 'write-file-atomic';\n\n/**\n * Marker string used to identify harness-evolve hook entries in settings.json.\n * When scanning existing hooks, any command containing this string is ours.\n */\nexport const HARNESS_EVOLVE_MARKER = 'harness-evolve';\n\n/**\n * Default path to Claude Code user-scope settings.json.\n */\nexport const SETTINGS_PATH = join(\n process.env.HOME ?? '',\n '.claude',\n 'settings.json',\n);\n\n/**\n * Hook registration definition.\n */\nexport interface HookRegistration {\n event: string;\n hookFile: string;\n timeout: number;\n async: boolean;\n description: string;\n}\n\n/**\n * All 6 hook events that harness-evolve registers.\n * Each entry maps an event name to the compiled JS hook file.\n */\nexport const HOOK_REGISTRATIONS: HookRegistration[] = [\n {\n event: 'UserPromptSubmit',\n hookFile: 'user-prompt-submit.js',\n timeout: 10,\n async: false,\n description: 'Captures prompts and delivers optimization notifications',\n },\n {\n event: 'PreToolUse',\n hookFile: 'pre-tool-use.js',\n timeout: 10,\n async: true,\n description: 'Tracks tool usage patterns before execution',\n },\n {\n event: 'PostToolUse',\n hookFile: 'post-tool-use.js',\n timeout: 10,\n async: true,\n description: 'Records tool outcomes for pattern analysis',\n },\n {\n event: 'PostToolUseFailure',\n hookFile: 'post-tool-use-failure.js',\n timeout: 10,\n async: true,\n description: 'Logs tool failures to detect correction patterns',\n },\n {\n event: 'PermissionRequest',\n hookFile: 'permission-request.js',\n timeout: 10,\n async: true,\n description: 'Monitors permission decisions for auto-approval suggestions',\n },\n {\n event: 'Stop',\n hookFile: 'stop.js',\n timeout: 10,\n async: true,\n description: 'Triggers analysis when interaction threshold is reached',\n },\n];\n\n/**\n * Resolve absolute path to a hook JS file.\n *\n * In production, import.meta.dirname of the compiled dist/cli/utils.js\n * points to <install>/dist/cli/. We go up one level to <install>/dist/,\n * then into hooks/<hookFile>.\n *\n * @param hookFile - The hook filename (e.g., 'user-prompt-submit.js')\n * @param baseDirOverride - Override for import.meta.dirname (for testing)\n */\nexport function resolveHookPath(\n hookFile: string,\n baseDirOverride?: string,\n): string {\n const baseDir = baseDirOverride ?? import.meta.dirname;\n return join(baseDir, 'hooks', hookFile);\n}\n\n/**\n * Read and parse Claude Code settings.json.\n * Returns empty object if file does not exist or JSON is invalid.\n */\nexport async function readSettings(\n settingsPath?: string,\n): Promise<Record<string, unknown>> {\n const filePath = settingsPath ?? SETTINGS_PATH;\n try {\n const raw = await readFile(filePath, 'utf-8');\n return JSON.parse(raw) as Record<string, unknown>;\n } catch {\n // ENOENT (file missing) or SyntaxError (invalid JSON)\n return {};\n }\n}\n\n/**\n * Write settings.json atomically with 2-space indentation.\n */\nexport async function writeSettings(\n settings: Record<string, unknown>,\n settingsPath?: string,\n): Promise<void> {\n const filePath = settingsPath ?? SETTINGS_PATH;\n await writeFileAtomic(filePath, JSON.stringify(settings, null, 2));\n}\n\n/**\n * Hook command entry for merge logic.\n */\ninterface HookCommand {\n event: string;\n command: string;\n timeout: number;\n async: boolean;\n}\n\n/**\n * Merge harness-evolve hooks into existing settings without destroying user hooks.\n *\n * For each hook command:\n * - If the event already has a harness-evolve entry (identified by HARNESS_EVOLVE_MARKER\n * in the command string), skip it.\n * - Otherwise, append a new matcher entry to the event array.\n *\n * User hooks are preserved untouched.\n */\nexport function mergeHooks(\n existing: Record<string, unknown>,\n hookCommands: HookCommand[],\n): Record<string, unknown> {\n const hooks = (\n existing.hooks != null ? { ...(existing.hooks as Record<string, unknown>) } : {}\n ) as Record<string, unknown[]>;\n\n for (const hc of hookCommands) {\n const eventArray = (\n Array.isArray(hooks[hc.event]) ? [...hooks[hc.event]] : []\n ) as Array<Record<string, unknown>>;\n\n // Check if harness-evolve hook already registered for this event\n const alreadyRegistered = eventArray.some((entry) => {\n const innerHooks = entry.hooks as\n | Array<Record<string, unknown>>\n | undefined;\n if (!Array.isArray(innerHooks)) return false;\n return innerHooks.some((h) =>\n String(h.command ?? '').includes(HARNESS_EVOLVE_MARKER),\n );\n });\n\n if (!alreadyRegistered) {\n const hookEntry: Record<string, unknown> = {\n type: 'command',\n command: hc.command,\n timeout: hc.timeout,\n };\n if (hc.async) {\n hookEntry.async = true;\n }\n\n eventArray.push({\n matcher: '*',\n hooks: [hookEntry],\n });\n }\n\n hooks[hc.event] = eventArray;\n }\n\n return { ...existing, hooks };\n}\n\n/**\n * Interactive confirmation prompt.\n * Returns true if user answers 'y' or 'yes' (case-insensitive).\n */\nexport async function confirm(message: string): Promise<boolean> {\n const rl = createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n try {\n const answer = await rl.question(`${message} [y/N] `);\n return /^y(es)?$/i.test(answer.trim());\n } finally {\n rl.close();\n }\n}\n","// Context builder for deep scan module.\n// Reads all Claude Code configuration sources (CLAUDE.md files, rules,\n// settings, commands, hooks) from the filesystem and produces a validated\n// ScanContext object for scanner analysis.\n\nimport { readFile, readdir } from 'node:fs/promises';\nimport { join, basename } from 'node:path';\nimport { scanContextSchema, type ScanContext } from './schemas.js';\n\n/**\n * Safely read a file, returning its content or null if it cannot be read.\n */\nasync function readFileSafe(path: string): Promise<string | null> {\n try {\n return await readFile(path, 'utf-8');\n } catch {\n return null;\n }\n}\n\n/**\n * Extract markdown headings (# through ######) from content.\n */\nexport function extractHeadings(content: string): string[] {\n const headings: string[] = [];\n const regex = /^#{1,6}\\s+(.+)$/gm;\n let match: RegExpExecArray | null;\n while ((match = regex.exec(content)) !== null) {\n headings.push(match[1].trim());\n }\n return headings;\n}\n\n/**\n * Extract @-reference paths from content (e.g., @docs/guide.md).\n * Filters out email-like patterns (user@domain).\n */\nexport function extractReferences(content: string): string[] {\n const refs: string[] = [];\n const regex = /@([\\w./-]+)/g;\n let match: RegExpExecArray | null;\n while ((match = regex.exec(content)) !== null) {\n const ref = match[1];\n // Filter out email-like patterns: if preceded by a word char, skip\n const idx = match.index;\n if (idx > 0 && /\\w/.test(content[idx - 1])) {\n continue;\n }\n // Strip trailing dots only if they don't look like file extensions\n // e.g., \"file.ts.\" -> \"file.ts\", but \"file.md\" stays as-is\n const cleaned = ref.replace(/\\.$/, '');\n refs.push(cleaned);\n }\n return refs;\n}\n\n/**\n * Read CLAUDE.md files from the 3 standard locations.\n */\nasync function readClaudeMdFiles(\n cwd: string,\n home: string,\n): Promise<ScanContext['claude_md_files']> {\n const locations: Array<{ path: string; scope: 'user' | 'project' | 'local' }> = [\n { path: join(cwd, 'CLAUDE.md'), scope: 'project' },\n { path: join(cwd, '.claude', 'CLAUDE.md'), scope: 'local' },\n { path: join(home, '.claude', 'CLAUDE.md'), scope: 'user' },\n ];\n\n const files: ScanContext['claude_md_files'] = [];\n\n for (const loc of locations) {\n const content = await readFileSafe(loc.path);\n if (content !== null) {\n files.push({\n path: loc.path,\n scope: loc.scope,\n content,\n line_count: content.split('\\n').length,\n headings: extractHeadings(content),\n references: extractReferences(content),\n });\n }\n }\n\n return files;\n}\n\n/**\n * Recursively collect all .md files from a directory.\n */\nasync function collectMdFiles(dir: string): Promise<string[]> {\n const results: string[] = [];\n try {\n const entries = await readdir(dir, { withFileTypes: true });\n for (const entry of entries) {\n const fullPath = join(dir, entry.name);\n if (entry.isDirectory()) {\n const nested = await collectMdFiles(fullPath);\n results.push(...nested);\n } else if (entry.isFile() && entry.name.endsWith('.md')) {\n results.push(fullPath);\n }\n }\n } catch {\n // Directory does not exist or is unreadable\n }\n return results;\n}\n\n/**\n * Parse simple YAML frontmatter from markdown content.\n * Looks for --- delimiters and extracts paths array if present.\n */\nfunction parseFrontmatter(\n content: string,\n): { paths?: string[] } | undefined {\n const match = content.match(/^---\\n([\\s\\S]*?)\\n---/);\n if (!match) return undefined;\n\n const frontmatter = match[1];\n const pathsMatch = frontmatter.match(\n /paths:\\s*\\n((?:\\s*-\\s*.+\\n?)*)/,\n );\n if (!pathsMatch) return {};\n\n const paths = pathsMatch[1]\n .split('\\n')\n .map((line) => line.replace(/^\\s*-\\s*/, '').trim())\n .filter((line) => line.length > 0);\n\n return paths.length > 0 ? { paths } : {};\n}\n\n/**\n * Read all rule files from .claude/rules/ recursively.\n */\nasync function readRuleFiles(cwd: string): Promise<ScanContext['rules']> {\n const rulesDir = join(cwd, '.claude', 'rules');\n const mdFiles = await collectMdFiles(rulesDir);\n\n const rules: ScanContext['rules'] = [];\n for (const filePath of mdFiles) {\n const content = await readFileSafe(filePath);\n if (content !== null) {\n rules.push({\n path: filePath,\n filename: basename(filePath),\n content,\n frontmatter: parseFrontmatter(content),\n headings: extractHeadings(content),\n });\n }\n }\n\n return rules;\n}\n\n/**\n * Read settings.json from all 3 scopes (user, project, local).\n */\nasync function readAllSettings(\n cwd: string,\n home: string,\n): Promise<ScanContext['settings']> {\n const settingsPaths = {\n user: join(home, '.claude', 'settings.json'),\n project: join(cwd, '.claude', 'settings.json'),\n local: join(cwd, '.claude', 'settings.local.json'),\n };\n\n const readJsonSafe = async (path: string): Promise<unknown | null> => {\n try {\n const raw = await readFile(path, 'utf-8');\n return JSON.parse(raw) as unknown;\n } catch {\n return null;\n }\n };\n\n const [user, project, local] = await Promise.all([\n readJsonSafe(settingsPaths.user),\n readJsonSafe(settingsPaths.project),\n readJsonSafe(settingsPaths.local),\n ]);\n\n return { user, project, local };\n}\n\n/**\n * Read command files from .claude/commands/ directory.\n */\nasync function readCommandFiles(\n cwd: string,\n): Promise<ScanContext['commands']> {\n const commandsDir = join(cwd, '.claude', 'commands');\n const commands: ScanContext['commands'] = [];\n\n try {\n const entries = await readdir(commandsDir, { withFileTypes: true });\n for (const entry of entries) {\n if (entry.isFile() && entry.name.endsWith('.md')) {\n const filePath = join(commandsDir, entry.name);\n const content = await readFileSafe(filePath);\n if (content !== null) {\n commands.push({\n path: filePath,\n name: entry.name.replace(/\\.md$/, ''),\n content,\n });\n }\n }\n }\n } catch {\n // Directory does not exist\n }\n\n return commands;\n}\n\n/**\n * Extract hook registrations from all settings scopes.\n */\nfunction extractHooksFromAllSettings(\n settings: ScanContext['settings'],\n): ScanContext['hooks_registered'] {\n const hooks: ScanContext['hooks_registered'] = [];\n\n const extractFromScope = (\n settingsObj: unknown,\n scope: 'user' | 'project' | 'local',\n ): void => {\n if (!settingsObj || typeof settingsObj !== 'object') return;\n const obj = settingsObj as Record<string, unknown>;\n if (!obj.hooks || typeof obj.hooks !== 'object') return;\n\n const hooksConfig = obj.hooks as Record<string, unknown>;\n for (const [event, defs] of Object.entries(hooksConfig)) {\n if (!Array.isArray(defs)) continue;\n for (const def of defs) {\n if (!def || typeof def !== 'object') continue;\n const hookDef = def as Record<string, unknown>;\n const type = String(hookDef.type ?? 'command');\n const command =\n typeof hookDef.command === 'string' ? hookDef.command : undefined;\n hooks.push({ event, scope, type, command });\n }\n }\n };\n\n extractFromScope(settings.user, 'user');\n extractFromScope(settings.project, 'project');\n extractFromScope(settings.local, 'local');\n\n return hooks;\n}\n\n/**\n * Build a complete ScanContext by reading all configuration sources.\n * Returns a validated ScanContext or throws if validation fails.\n *\n * @param cwd - Project root directory\n * @param home - User home directory (defaults to process.env.HOME)\n */\nexport async function buildScanContext(\n cwd: string,\n home?: string,\n): Promise<ScanContext> {\n const homeDir = home ?? process.env.HOME ?? '';\n\n const [claudeMdFiles, rules, settings, commands] = await Promise.all([\n readClaudeMdFiles(cwd, homeDir),\n readRuleFiles(cwd),\n readAllSettings(cwd, homeDir),\n readCommandFiles(cwd),\n ]);\n\n const hooksRegistered = extractHooksFromAllSettings(settings);\n\n const ctx = {\n generated_at: new Date().toISOString(),\n project_root: cwd,\n claude_md_files: claudeMdFiles,\n rules,\n settings,\n commands,\n hooks_registered: hooksRegistered,\n };\n\n return scanContextSchema.parse(ctx);\n}\n","// Scan module schemas.\n// Defines the ScanContext shape that captures all Claude Code configuration\n// sources (CLAUDE.md, rules, settings, commands, hooks) for deep analysis.\n\nimport { z } from 'zod/v4';\n\nexport const scanContextSchema = z.object({\n generated_at: z.iso.datetime(),\n project_root: z.string(),\n claude_md_files: z.array(\n z.object({\n path: z.string(),\n scope: z.enum(['user', 'project', 'local']),\n content: z.string(),\n line_count: z.number(),\n headings: z.array(z.string()),\n references: z.array(z.string()),\n }),\n ),\n rules: z.array(\n z.object({\n path: z.string(),\n filename: z.string(),\n content: z.string(),\n frontmatter: z\n .object({\n paths: z.array(z.string()).optional(),\n })\n .optional(),\n headings: z.array(z.string()),\n }),\n ),\n settings: z.object({\n user: z.unknown().nullable(),\n project: z.unknown().nullable(),\n local: z.unknown().nullable(),\n }),\n commands: z.array(\n z.object({\n path: z.string(),\n name: z.string(),\n content: z.string(),\n }),\n ),\n hooks_registered: z.array(\n z.object({\n event: z.string(),\n scope: z.enum(['user', 'project', 'local']),\n type: z.string(),\n command: z.string().optional(),\n }),\n ),\n});\nexport type ScanContext = z.infer<typeof scanContextSchema>;\n","// Redundancy scanner for deep scan module.\n// Detects duplicate headings across CLAUDE.md and rule files, and\n// duplicate rule files with highly similar heading sets.\n\nimport type { ScanContext } from '../schemas.js';\nimport type { Recommendation } from '../../schemas/recommendation.js';\n\n/**\n * Normalize text for comparison: lowercase, trim, collapse whitespace.\n */\nexport function normalizeText(text: string): string {\n return text.toLowerCase().trim().replace(/\\s+/g, ' ');\n}\n\n/**\n * Scan for redundant configuration: duplicate headings across CLAUDE.md\n * and rules, and duplicate rule files with matching heading sets.\n */\nexport function scanRedundancy(context: ScanContext): Recommendation[] {\n const recommendations: Recommendation[] = [];\n let index = 0;\n\n // Check 1: CLAUDE.md headings vs rule headings\n const claudeMdHeadings = context.claude_md_files.flatMap(f =>\n f.headings.map(h => ({ heading: normalizeText(h), source: f.path })),\n );\n const ruleHeadings = context.rules.flatMap(r =>\n r.headings.map(h => ({ heading: normalizeText(h), source: r.path })),\n );\n\n for (const cmdH of claudeMdHeadings) {\n const match = ruleHeadings.find(rH => rH.heading === cmdH.heading);\n if (match) {\n recommendations.push({\n id: `rec-scan-redundancy-${index++}`,\n target: 'RULE',\n confidence: 'MEDIUM',\n pattern_type: 'scan_redundancy',\n title: `Redundant section: \"${cmdH.heading}\"`,\n description:\n `The heading \"${cmdH.heading}\" appears in both ` +\n `${cmdH.source} and ${match.source}. ` +\n `This may indicate duplicated instructions.`,\n evidence: {\n count: 2,\n examples: [cmdH.source, match.source],\n },\n suggested_action:\n 'Consolidate into one location. If it belongs in rules, ' +\n 'remove from CLAUDE.md. If it belongs in CLAUDE.md, remove the rule file.',\n });\n }\n }\n\n // Check 2: Duplicate rule files (same heading set in 2+ rule files)\n const rulesByHeadingSet = new Map<string, string[]>();\n for (const rule of context.rules) {\n const key = rule.headings\n .map(h => normalizeText(h))\n .sort()\n .join('||');\n if (!key) continue; // Skip rules with no headings\n const existing = rulesByHeadingSet.get(key) ?? [];\n existing.push(rule.path);\n rulesByHeadingSet.set(key, existing);\n }\n\n for (const [, paths] of rulesByHeadingSet) {\n if (paths.length < 2) continue;\n recommendations.push({\n id: `rec-scan-redundancy-${index++}`,\n target: 'RULE',\n confidence: 'MEDIUM',\n pattern_type: 'scan_redundancy',\n title: `Duplicate rule files detected (${paths.length} files with same headings)`,\n description:\n `${paths.length} rule files share the same heading structure: ` +\n `${paths.join(', ')}. They may contain redundant content.`,\n evidence: {\n count: paths.length,\n examples: paths.slice(0, 3),\n },\n suggested_action:\n 'Review these rule files and merge them into a single file, ' +\n 'or differentiate their content.',\n });\n }\n\n return recommendations;\n}\n","// Mechanization scanner for deep scan module.\n// Detects operations described in rules/CLAUDE.md text that should be\n// enforced via hooks for 100% reliable execution.\n\nimport type { ScanContext } from '../schemas.js';\nimport type { Recommendation } from '../../schemas/recommendation.js';\n\n/**\n * Patterns in rule/CLAUDE.md text that suggest hookable operations.\n * Each indicator maps a text pattern to the hook event that could enforce it.\n */\nexport const MECHANIZATION_INDICATORS = [\n { regex: /always\\s+run\\s+[\"`']?(\\S+)/i, hookEvent: 'PreToolUse', label: 'always run' },\n {\n regex: /before\\s+committing?,?\\s+run\\s+[\"`']?(\\S+)/i,\n hookEvent: 'PreToolUse',\n label: 'pre-commit check',\n },\n {\n regex: /after\\s+every\\s+(?:edit|change|write)/i,\n hookEvent: 'PostToolUse',\n label: 'post-edit action',\n },\n {\n regex: /must\\s+(?:always\\s+)?check\\s+[\"`']?(\\S+)/i,\n hookEvent: 'PreToolUse',\n label: 'mandatory check',\n },\n {\n regex: /never\\s+(?:allow|permit|run)\\s+[\"`']?(\\S+)/i,\n hookEvent: 'PreToolUse',\n label: 'forbidden operation',\n },\n {\n regex: /forbidden.*(?:rm\\s+-rf|drop\\s+|delete\\s+|truncate)/i,\n hookEvent: 'PreToolUse',\n label: 'dangerous command guard',\n },\n] as const;\n\n/**\n * Scan for operations described in text that should be enforced via hooks.\n * Skips patterns that are already covered by a registered hook for the\n * corresponding event type.\n */\nexport function scanMechanization(context: ScanContext): Recommendation[] {\n const recommendations: Recommendation[] = [];\n let index = 0;\n\n // Collect all text sources: CLAUDE.md files and rule files\n const allTextSources = [\n ...context.claude_md_files.map(f => ({ content: f.content, source: f.path })),\n ...context.rules.map(r => ({ content: r.content, source: r.path })),\n ];\n\n for (const source of allTextSources) {\n for (const indicator of MECHANIZATION_INDICATORS) {\n const match = source.content.match(indicator.regex);\n if (!match) continue;\n\n // Check if a hook already covers this event\n const alreadyCovered = context.hooks_registered.some(\n h => h.event === indicator.hookEvent,\n );\n if (alreadyCovered) continue;\n\n recommendations.push({\n id: `rec-scan-mechanize-${index++}`,\n target: 'HOOK',\n confidence: 'MEDIUM',\n pattern_type: 'scan_missing_mechanization',\n title: `Mechanizable rule: \"${match[0].substring(0, 60)}\"`,\n description:\n `Found a rule in ${source.source} that describes an operation ` +\n `suitable for a ${indicator.hookEvent} hook: \"${match[0]}\". ` +\n 'Hooks provide 100% reliable execution, while rules depend on ' +\n \"Claude's probabilistic compliance.\",\n evidence: {\n count: 1,\n examples: [match[0].substring(0, 100)],\n },\n suggested_action:\n `Create a ${indicator.hookEvent} hook to enforce this rule ` +\n `automatically. See Claude Code hooks docs for ${indicator.hookEvent} event.`,\n });\n }\n }\n\n return recommendations;\n}\n","// Staleness scanner for deep scan module.\n// Detects broken @references in CLAUDE.md files and hook commands\n// pointing to non-existent scripts.\n\nimport type { ScanContext } from '../schemas.js';\nimport type { Recommendation } from '../../schemas/recommendation.js';\nimport { access } from 'node:fs/promises';\nimport { constants } from 'node:fs';\nimport { resolve, dirname } from 'node:path';\n\n/**\n * Check if a file exists on disk.\n */\nasync function fileExistsOnDisk(filePath: string): Promise<boolean> {\n try {\n await access(filePath, constants.F_OK);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Extract a file path from a hook command string.\n * Handles patterns like:\n * node \"path/to/script.js\"\n * node 'path/to/script.js'\n * node path/to/script.js\n * sh /path/to/script.sh\n * /usr/bin/node /path/to/file.js\n */\nfunction extractPathFromCommand(command: string): string | null {\n // Match quoted path: node \"path\" or node 'path'\n const quotedMatch = command.match(/(?:node|sh|bash|python)\\s+[\"']([^\"']+)[\"']/i);\n if (quotedMatch) return quotedMatch[1];\n\n // Match unquoted path after common interpreters\n const unquotedMatch = command.match(\n /(?:node|sh|bash|python)\\s+(\\S+\\.(?:js|ts|sh|py|mjs|cjs))/i,\n );\n if (unquotedMatch) return unquotedMatch[1];\n\n return null;\n}\n\n/**\n * Scan for stale references: broken @references in CLAUDE.md files and\n * hook commands pointing to non-existent scripts.\n *\n * This scanner is async because it needs to check the filesystem for\n * reference targets not present in the ScanContext.\n */\nexport async function scanStaleness(context: ScanContext): Promise<Recommendation[]> {\n const recommendations: Recommendation[] = [];\n let index = 0;\n\n // Check 1: Stale @references in CLAUDE.md files\n for (const claudeMd of context.claude_md_files) {\n for (const ref of claudeMd.references) {\n const resolved = resolve(dirname(claudeMd.path), ref);\n\n // Check if referenced path exists in context data\n const inContext =\n context.rules.some(r => r.path === resolved) ||\n context.claude_md_files.some(f => f.path === resolved) ||\n context.commands.some(c => c.path === resolved);\n\n if (inContext) continue;\n\n // Check filesystem as fallback\n const existsOnDisk = await fileExistsOnDisk(resolved);\n if (existsOnDisk) continue;\n\n recommendations.push({\n id: `rec-scan-stale-${index++}`,\n target: 'CLAUDE_MD',\n confidence: 'HIGH',\n pattern_type: 'scan_stale_reference',\n title: `Stale reference: @${ref}`,\n description: `${claudeMd.path} references @${ref}, but this file does not exist.`,\n evidence: {\n count: 1,\n examples: [`@${ref} in ${claudeMd.path}`],\n },\n suggested_action:\n `Remove the @${ref} reference from ${claudeMd.path}, ` +\n 'or create the missing file.',\n });\n }\n }\n\n // Check 2: Hook commands pointing to non-existent scripts\n for (const hook of context.hooks_registered) {\n if (!hook.command) continue;\n\n const scriptPath = extractPathFromCommand(hook.command);\n if (!scriptPath) continue;\n\n const exists = await fileExistsOnDisk(scriptPath);\n if (exists) continue;\n\n recommendations.push({\n id: `rec-scan-stale-${index++}`,\n target: 'SETTINGS',\n confidence: 'HIGH',\n pattern_type: 'scan_stale_reference',\n title: `Stale hook script: ${scriptPath}`,\n description:\n `Hook (${hook.event}, ${hook.scope}) references script \"${scriptPath}\", ` +\n 'but this file does not exist. The hook will fail when triggered.',\n evidence: {\n count: 1,\n examples: [`${hook.event} hook command: ${hook.command}`],\n },\n suggested_action:\n `Create the missing script at \"${scriptPath}\", ` +\n 'or update the hook command in settings.json.',\n });\n }\n\n return recommendations;\n}\n","// Scanner registry for deep scan module.\n// Defines the Scanner type signature and holds all registered scanner\n// functions. Supports both sync and async scanners.\n\nimport type { ScanContext } from '../schemas.js';\nimport type { Recommendation } from '../../schemas/recommendation.js';\nimport { scanRedundancy } from './redundancy.js';\nimport { scanMechanization } from './mechanization.js';\nimport { scanStaleness } from './staleness.js';\n\nexport type Scanner = (context: ScanContext) => Recommendation[] | Promise<Recommendation[]>;\n\n// Scanner registry -- all 3 scanners registered\nexport const scanners: Scanner[] = [scanRedundancy, scanMechanization, scanStaleness];\n","// Deep scan orchestrator: builds context from config files and runs all scanners.\n// Entry point for the scan module -- coordinates context building with scanner\n// execution and returns merged recommendations.\n\nimport { buildScanContext } from './context-builder.js';\nimport { scanners } from './scanners/index.js';\nimport type { ScanContext } from './schemas.js';\nimport type { Recommendation } from '../schemas/recommendation.js';\nimport type { Scanner } from './scanners/index.js';\n\nexport interface ScanResult {\n generated_at: string;\n scan_context: ScanContext;\n recommendations: Recommendation[];\n}\n\n/**\n * Run a deep scan of Claude Code configuration at the given directory.\n * Reads all config files into a ScanContext, then runs all registered\n * scanners to detect quality issues. Returns merged recommendations.\n *\n * Errors in individual scanners are caught and logged, not propagated.\n * An empty recommendations array means no issues detected.\n */\nexport async function runDeepScan(\n cwd: string,\n home?: string,\n): Promise<ScanResult> {\n const scanContext = await buildScanContext(cwd, home);\n const recommendations: Recommendation[] = [];\n\n for (const scanner of scanners) {\n try {\n const result = await scanner(scanContext);\n recommendations.push(...result);\n } catch (err) {\n // Log but don't propagate -- scan is advisory, not critical\n console.error(\n `Scanner error: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n }\n\n return {\n generated_at: new Date().toISOString(),\n scan_context: scanContext,\n recommendations,\n };\n}\n\n// Re-export key types for consumers\nexport type { ScanContext } from './schemas.js';\nexport type { Scanner } from './scanners/index.js';\n","// Slash command template generator for /evolve:scan\n\n/**\n * Generate the Markdown content for the /evolve:scan slash command.\n *\n * This command instructs Claude Code to run a deep configuration scan\n * using the harness-evolve CLI and present results grouped by confidence.\n */\nexport function generateScanCommand(): string {\n return `---\nname: scan\ndescription: Run a deep harness-evolve configuration scan to detect quality issues\ndisable-model-invocation: true\n---\n\n# Evolve Scan\n\nRun a deep scan of the current project's Claude Code configuration to detect quality issues and optimization opportunities.\n\n## What This Does\n\nAnalyzes your Claude Code configuration files to detect:\n- **Redundant rules** -- same constraint defined in multiple files (CLAUDE.md, .claude/rules/, settings.json)\n- **Missing mechanization** -- operations in rules or CLAUDE.md that should be hooks for 100% reliability\n- **Stale config** -- references to non-existent files, outdated commands, or unused settings\n- **Configuration drift** -- inconsistencies between .claude/commands/, rules, and settings\n\nFiles scanned: CLAUDE.md, .claude/rules/, settings.json, .claude/commands/\n\n## Instructions\n\nRun the scan CLI command:\n\n\\`\\`\\`bash\nnpx harness-evolve scan\n\\`\\`\\`\n\nOr if globally installed:\n\n\\`\\`\\`bash\nharness-evolve scan\n\\`\\`\\`\n\n## Presenting Results\n\nPresent the results grouped by confidence level (HIGH first, then MEDIUM, then LOW):\n\n1. **HIGH confidence** -- Issues that are very likely real problems. Recommend immediate action.\n2. **MEDIUM confidence** -- Probable issues worth reviewing. Present with context for user to decide.\n3. **LOW confidence** -- Possible improvements. Mention briefly and let user prioritize.\n\nFor each issue, show:\n- Confidence level and category\n- Description of the problem\n- Affected file(s)\n- Suggested fix\n\nIf issues are found, suggest running \\`/evolve:apply\\` to review and apply the recommendations interactively.\n\nIf no issues are found, congratulate the user on a clean configuration.\n`;\n}\n","// Slash command template generator for /evolve:apply\n\n/**\n * Generate the Markdown content for the /evolve:apply slash command.\n *\n * This command instructs Claude Code to read pending recommendations,\n * present them interactively, and let the user apply, skip, or ignore each one.\n */\nexport function generateApplyCommand(): string {\n return `---\nname: apply\ndescription: Review and apply pending harness-evolve recommendations one by one\ndisable-model-invocation: true\nargument-hint: \"[filter: all|high|medium|low]\"\n---\n\n# Evolve Apply\n\nReview pending harness-evolve recommendations interactively. For each recommendation, you can choose to apply it, skip it for later, or permanently dismiss it.\n\n## Arguments\n\nIf \\`$ARGUMENTS\\` is provided (e.g., \"high\", \"medium\", or \"low\"), filter recommendations to only show that confidence level. If empty or \"all\", show all pending recommendations.\n\n## Instructions\n\n### Step 1: Read Pending Recommendations\n\n\\`\\`\\`bash\nnpx harness-evolve pending\n\\`\\`\\`\n\nIf the command outputs no pending recommendations, inform the user:\n> No pending recommendations. Run \\`/evolve:scan\\` to analyze your configuration and generate new recommendations.\n\n### Step 2: Present Each Recommendation\n\nFor each pending recommendation, present the following:\n\n- **Confidence level** (HIGH / MEDIUM / LOW)\n- **Title** -- what the recommendation is about\n- **Description** -- detailed explanation of the issue\n- **Evidence** -- what data or pattern triggered this recommendation\n- **Suggested action** -- what change is proposed\n\n### Step 3: Ask User to Choose\n\nFor each recommendation, ask the user to choose one of three actions:\n\n1. **Apply** -- Execute the recommendation. Run:\n \\`\\`\\`bash\n npx harness-evolve apply-one <id>\n \\`\\`\\`\n Report the result (success or failure) and show what changed.\n\n2. **Skip** -- Do nothing for now. The recommendation stays pending for future review. No command needed.\n\n3. **Ignore** -- Permanently dismiss this recommendation. Run:\n \\`\\`\\`bash\n npx harness-evolve dismiss <id>\n \\`\\`\\`\n Confirm the recommendation has been dismissed.\n\n### Step 4: Continue or Finish\n\nAfter processing each recommendation, move to the next one. When all recommendations have been processed, summarize what was done:\n- How many applied\n- How many skipped\n- How many ignored\n\n## Notes\n\n- Recommendations are generated by \\`harness-evolve scan\\` or automatic background analysis\n- Applied recommendations modify configuration files (settings.json, CLAUDE.md, .claude/rules/, etc.)\n- Ignored recommendations will not appear in future \\`/evolve:apply\\` sessions\n- Skipped recommendations remain pending and will reappear next time\n`;\n}\n","import { readFile } from 'node:fs/promises';\nimport { lock } from 'proper-lockfile';\nimport writeFileAtomic from 'write-file-atomic';\nimport { counterSchema, type Counter } from '../schemas/counter.js';\nimport { paths, ensureInit } from './dirs.js';\n\n/**\n * Read the current counter state from disk.\n * Returns defaults (total=0, session={}) if no counter file exists.\n */\nexport async function readCounter(): Promise<Counter> {\n await ensureInit();\n try {\n const raw = await readFile(paths.counter, 'utf-8');\n return counterSchema.parse(JSON.parse(raw));\n } catch {\n // File doesn't exist or invalid -- return defaults\n return {\n total: 0,\n session: {},\n last_updated: new Date().toISOString(),\n };\n }\n}\n\n/**\n * Atomically increment the interaction counter with cross-process safety.\n *\n * Uses proper-lockfile (mkdir-based, macOS-safe) for cross-process locking\n * and write-file-atomic for crash-safe writes inside the lock.\n *\n * Pattern: ensure-file -> lock -> read -> increment -> atomic-write -> unlock\n */\nexport async function incrementCounter(sessionId: string): Promise<number> {\n await ensureInit();\n\n // Ensure counter file exists before locking (proper-lockfile requires existing file)\n try {\n await readFile(paths.counter, 'utf-8');\n } catch {\n const initial: Counter = {\n total: 0,\n session: {},\n last_updated: new Date().toISOString(),\n };\n await writeFileAtomic(paths.counter, JSON.stringify(initial, null, 2));\n }\n\n const release = await lock(paths.counter, {\n retries: { retries: 50, minTimeout: 20, maxTimeout: 1000, randomize: true },\n stale: 10000, // Consider lock stale after 10 seconds\n });\n\n try {\n const raw = await readFile(paths.counter, 'utf-8');\n const data = counterSchema.parse(JSON.parse(raw));\n data.total += 1;\n data.session[sessionId] = (data.session[sessionId] ?? 0) + 1;\n data.last_updated = new Date().toISOString();\n await writeFileAtomic(paths.counter, JSON.stringify(data, null, 2));\n return data.total;\n } finally {\n await release();\n }\n}\n\n/**\n * Reset the counter to zero. Used for testing and post-analysis reset.\n */\nexport async function resetCounter(): Promise<void> {\n await ensureInit();\n const data: Counter = {\n total: 0,\n session: {},\n last_updated: new Date().toISOString(),\n };\n await writeFileAtomic(paths.counter, JSON.stringify(data, null, 2));\n}\n","import { z } from 'zod/v4';\n\nexport const counterSchema = z.object({\n total: z.number().default(0),\n session: z.record(z.string(), z.number()).default({}),\n last_analysis: z.iso.datetime().optional(),\n last_updated: z.iso.datetime(),\n});\nexport type Counter = z.infer<typeof counterSchema>;\n","import { mkdir } from 'node:fs/promises';\nimport { join } from 'node:path';\n\nconst BASE_DIR = join(process.env.HOME ?? '', '.harness-evolve');\n\nexport const paths = {\n base: BASE_DIR,\n logs: {\n prompts: join(BASE_DIR, 'logs', 'prompts'),\n tools: join(BASE_DIR, 'logs', 'tools'),\n permissions: join(BASE_DIR, 'logs', 'permissions'),\n sessions: join(BASE_DIR, 'logs', 'sessions'),\n },\n analysis: join(BASE_DIR, 'analysis'),\n analysisPreProcessed: join(BASE_DIR, 'analysis', 'pre-processed'),\n summary: join(BASE_DIR, 'analysis', 'pre-processed', 'summary.json'),\n environmentSnapshot: join(BASE_DIR, 'analysis', 'environment-snapshot.json'),\n analysisResult: join(BASE_DIR, 'analysis', 'analysis-result.json'),\n pending: join(BASE_DIR, 'pending'),\n config: join(BASE_DIR, 'config.json'),\n counter: join(BASE_DIR, 'counter.json'),\n recommendations: join(BASE_DIR, 'recommendations.md'),\n recommendationState: join(BASE_DIR, 'analysis', 'recommendation-state.json'),\n recommendationArchive: join(BASE_DIR, 'analysis', 'recommendations-archive'),\n notificationFlag: join(BASE_DIR, 'analysis', 'has-pending-notifications'),\n autoApplyLog: join(BASE_DIR, 'analysis', 'auto-apply-log.jsonl'),\n outcomeHistory: join(BASE_DIR, 'analysis', 'outcome-history.jsonl'),\n} as const;\n\nlet initialized = false;\n\nexport async function ensureInit(): Promise<void> {\n if (initialized) return;\n await mkdir(paths.logs.prompts, { recursive: true });\n await mkdir(paths.logs.tools, { recursive: true });\n await mkdir(paths.logs.permissions, { recursive: true });\n await mkdir(paths.logs.sessions, { recursive: true });\n await mkdir(paths.analysis, { recursive: true });\n await mkdir(paths.analysisPreProcessed, { recursive: true });\n await mkdir(paths.pending, { recursive: true });\n await mkdir(paths.recommendationArchive, { recursive: true });\n initialized = true;\n}\n\n// For testing: reset the initialized flag\nexport function resetInit(): void {\n initialized = false;\n}\n","// Recommendation state lifecycle management.\n// Tracks recommendation statuses (pending/applied/dismissed) in a JSON file\n// that survives across analysis re-runs and sessions.\n\nimport { readFile } from 'node:fs/promises';\nimport writeFileAtomic from 'write-file-atomic';\nimport { paths } from '../storage/dirs.js';\nimport {\n recommendationStateSchema,\n type RecommendationState,\n type RecommendationStatus,\n} from '../schemas/delivery.js';\n\n/**\n * Load the recommendation state from disk.\n * Returns an empty state when the file does not exist.\n */\nexport async function loadState(): Promise<RecommendationState> {\n try {\n const raw = await readFile(paths.recommendationState, 'utf-8');\n return recommendationStateSchema.parse(JSON.parse(raw));\n } catch (err: unknown) {\n // File not found or invalid JSON: return empty state\n if (isNodeError(err) && err.code === 'ENOENT') {\n return { entries: [], last_updated: new Date().toISOString() };\n }\n // Re-throw unexpected errors\n throw err;\n }\n}\n\n/**\n * Save the recommendation state atomically to disk.\n */\nexport async function saveState(state: RecommendationState): Promise<void> {\n await writeFileAtomic(\n paths.recommendationState,\n JSON.stringify(state, null, 2),\n );\n}\n\n/**\n * Update the status of a recommendation by ID.\n * Creates a new entry if the ID is not found.\n */\nexport async function updateStatus(\n id: string,\n status: RecommendationStatus,\n details?: string,\n): Promise<void> {\n const state = await loadState();\n const now = new Date().toISOString();\n\n const existing = state.entries.find((e) => e.id === id);\n if (existing) {\n existing.status = status;\n existing.updated_at = now;\n if (status === 'applied' && details !== undefined) {\n existing.applied_details = details;\n } else if (status !== 'applied') {\n // Clear applied_details when not in applied status\n existing.applied_details = undefined;\n }\n } else {\n state.entries.push({\n id,\n status,\n updated_at: now,\n ...(status === 'applied' && details !== undefined\n ? { applied_details: details }\n : {}),\n });\n }\n\n state.last_updated = now;\n await saveState(state);\n}\n\n/**\n * Get a Map of recommendation ID to status for quick lookups.\n */\nexport async function getStatusMap(): Promise<Map<string, RecommendationStatus>> {\n const state = await loadState();\n return new Map(state.entries.map((e) => [e.id, e.status]));\n}\n\n// Type guard for Node.js errors with code property\nfunction isNodeError(err: unknown): err is NodeJS.ErrnoException {\n return err instanceof Error && 'code' in err;\n}\n","// Delivery schemas for recommendation state tracking and auto-apply logging.\n// Defines: recommendation status lifecycle (pending/applied/dismissed),\n// state entries persisted in JSON, and auto-apply audit log entries.\n\nimport { z } from 'zod/v4';\n\nexport const recommendationStatusSchema = z.enum(['pending', 'applied', 'dismissed']);\nexport type RecommendationStatus = z.infer<typeof recommendationStatusSchema>;\n\nexport const recommendationStateEntrySchema = z.object({\n id: z.string(),\n status: recommendationStatusSchema,\n updated_at: z.iso.datetime(),\n applied_details: z.string().optional(),\n});\nexport type RecommendationStateEntry = z.infer<typeof recommendationStateEntrySchema>;\n\nexport const recommendationStateSchema = z.object({\n entries: z.array(recommendationStateEntrySchema),\n last_updated: z.iso.datetime(),\n});\nexport type RecommendationState = z.infer<typeof recommendationStateSchema>;\n\nexport const autoApplyLogEntrySchema = z.object({\n timestamp: z.iso.datetime(),\n recommendation_id: z.string(),\n target: z.string(),\n action: z.string(),\n success: z.boolean(),\n details: z.string().optional(),\n backup_path: z.string().optional(),\n});\nexport type AutoApplyLogEntry = z.infer<typeof autoApplyLogEntrySchema>;\n","// Status command implementation -- shows harness-evolve status and statistics\n\nimport type { Command } from '@commander-js/extra-typings';\nimport { readCounter } from '../storage/counter.js';\nimport { loadState } from '../delivery/state.js';\nimport { readSettings, HARNESS_EVOLVE_MARKER, SETTINGS_PATH } from './utils.js';\n\n/**\n * Options for runStatus, with test overrides.\n */\nexport interface StatusOptions {\n settingsPath?: string;\n}\n\n/**\n * Core status logic -- exported for testing.\n *\n * Reads counter, recommendation state, and settings to display:\n * - Total interaction count\n * - Last analysis timestamp\n * - Pending recommendations count\n * - Hook registration status\n */\nexport async function runStatus(options: StatusOptions): Promise<void> {\n const settingsPath = options.settingsPath ?? SETTINGS_PATH;\n\n // Read counter data (returns defaults if counter.json missing)\n const counter = await readCounter();\n\n // Read recommendation state (returns empty entries if file missing)\n const state = await loadState();\n\n // Count pending recommendations\n const pendingCount = state.entries.filter(\n (e) => e.status === 'pending',\n ).length;\n\n // Check hook registration in settings.json\n const settings = await readSettings(settingsPath);\n const hooksRegistered = JSON.stringify(settings.hooks ?? {}).includes(\n HARNESS_EVOLVE_MARKER,\n );\n\n // Display status\n console.log('');\n console.log('harness-evolve status');\n console.log('=====================');\n console.log(`Interactions: ${counter.total}`);\n console.log(`Last analysis: ${counter.last_analysis ?? 'never'}`);\n console.log(`Pending recs: ${pendingCount}`);\n console.log(`Hooks registered: ${hooksRegistered ? 'Yes' : 'No'}`);\n console.log('');\n}\n\n/**\n * Register the status subcommand on a Commander.js program.\n */\nexport function registerStatusCommand(program: Command): void {\n program\n .command('status')\n .description('Show harness-evolve status and statistics')\n .action(async () => {\n await runStatus({});\n });\n}\n","// Uninstall command implementation -- removes harness-evolve hooks and optionally deletes data\n\nimport { copyFile, rm, rmdir, access } from 'node:fs/promises';\nimport { constants } from 'node:fs';\nimport { join } from 'node:path';\nimport type { Command } from '@commander-js/extra-typings';\nimport {\n readSettings,\n writeSettings,\n HARNESS_EVOLVE_MARKER,\n SETTINGS_PATH,\n confirm,\n} from './utils.js';\nimport { paths } from '../storage/dirs.js';\n\n/**\n * Options for runUninstall, with test overrides.\n */\nexport interface UninstallOptions {\n purge: boolean;\n yes: boolean;\n settingsPath?: string;\n projectDir?: string;\n}\n\n/**\n * Remove slash command files from the project's .claude/commands/evolve/ directory.\n * Handles missing files gracefully. Attempts to remove the evolve/ directory if empty.\n */\nasync function removeSlashCommands(projectDir: string): Promise<void> {\n const commandsDir = join(projectDir, '.claude', 'commands', 'evolve');\n\n for (const file of ['scan.md', 'apply.md']) {\n try {\n await rm(join(commandsDir, file));\n console.log(` Removed /evolve:${file.replace('.md', '')}`);\n } catch {\n // File doesn't exist -- nothing to remove\n }\n }\n\n // Try to remove empty directory\n try {\n await rmdir(commandsDir);\n } catch {\n // Directory not empty (user added files) or doesn't exist\n }\n}\n\n/**\n * Core uninstall logic -- exported for testing.\n *\n * 1. Remove harness-evolve hook entries from settings.json (preserve user hooks)\n * 2. Optionally delete ~/.harness-evolve/ data directory with --purge\n */\nexport async function runUninstall(options: UninstallOptions): Promise<void> {\n const settingsPath = options.settingsPath ?? SETTINGS_PATH;\n\n // --- Remove hooks from settings.json ---\n const settings = await readSettings(settingsPath);\n const hooks = settings.hooks as Record<string, unknown[]> | undefined;\n\n if (!hooks || Object.keys(hooks).length === 0) {\n console.log('No harness-evolve hooks found in settings.json');\n } else {\n let removedCount = 0;\n const filteredHooks: Record<string, unknown[]> = {};\n\n for (const [event, entries] of Object.entries(hooks)) {\n if (!Array.isArray(entries)) {\n filteredHooks[event] = entries;\n continue;\n }\n\n // Filter out entries whose hooks sub-array contains harness-evolve\n const kept = entries.filter((entry) => {\n const innerHooks = (entry as Record<string, unknown>).hooks as\n | Array<Record<string, unknown>>\n | undefined;\n if (!Array.isArray(innerHooks)) return true;\n const isHarnessEvolve = innerHooks.some((h) =>\n String(h.command ?? '').includes(HARNESS_EVOLVE_MARKER),\n );\n if (isHarnessEvolve) removedCount++;\n return !isHarnessEvolve;\n });\n\n // Only keep the event key if there are remaining entries\n if (kept.length > 0) {\n filteredHooks[event] = kept;\n }\n }\n\n if (removedCount > 0) {\n // Backup before modification\n await copyFile(settingsPath, settingsPath + '.backup');\n console.log(`Backup created: ${settingsPath}.backup`);\n\n // Write filtered settings\n settings.hooks = filteredHooks;\n await writeSettings(settings, settingsPath);\n console.log('Removed harness-evolve hooks from settings.json');\n } else {\n console.log('No harness-evolve hooks found in settings.json');\n }\n }\n\n // --- Remove slash commands ---\n console.log('\\nRemoving slash commands...');\n await removeSlashCommands(options.projectDir ?? process.cwd());\n\n // --- Optionally delete data directory ---\n if (options.purge) {\n if (!options.yes) {\n const accepted = await confirm(\n 'Delete all harness-evolve data (~/.harness-evolve/)?',\n );\n if (!accepted) {\n console.log('Data directory preserved.');\n return;\n }\n }\n\n try {\n await access(paths.base, constants.F_OK);\n await rm(paths.base, { recursive: true, force: true });\n console.log(`Deleted data directory: ${paths.base}`);\n } catch {\n console.log(`Data directory not found: ${paths.base}`);\n }\n }\n}\n\n/**\n * Register the uninstall subcommand on a Commander.js program.\n */\nexport function registerUninstallCommand(program: Command): void {\n program\n .command('uninstall')\n .description('Remove harness-evolve hooks and optionally delete data')\n .option('--purge', 'Also delete ~/.harness-evolve/ data directory')\n .option('--yes', 'Skip confirmation prompt')\n .action(async (opts) => {\n await runUninstall({\n purge: opts.purge ?? false,\n yes: opts.yes ?? false,\n });\n });\n}\n","// Scan CLI subcommand -- triggers deep configuration scan and outputs JSON results.\n// Used by the /evolve:scan slash command to programmatically invoke scanning.\n\nimport type { Command } from '@commander-js/extra-typings';\nimport { runDeepScan } from '../scan/index.js';\n\n/** Confidence tier ordering: HIGH (0) -> MEDIUM (1) -> LOW (2) */\nconst CONFIDENCE_ORDER: Record<string, number> = { HIGH: 0, MEDIUM: 1, LOW: 2 };\n\n/**\n * Register the 'scan' subcommand on a Commander.js program.\n *\n * Runs a full deep configuration scan (CLAUDE.md, rules, settings, hooks)\n * and outputs the results as structured JSON to stdout. The output omits\n * scan_context to keep it concise for slash command consumers.\n */\nexport function registerScanCommand(program: Command): void {\n program\n .command('scan')\n .description('Run deep configuration scan and output results as JSON')\n .action(async () => {\n try {\n const result = await runDeepScan(process.cwd());\n // Sort recommendations by confidence: HIGH -> MEDIUM -> LOW\n const sorted = [...result.recommendations].sort((a, b) =>\n (CONFIDENCE_ORDER[a.confidence] ?? 3) - (CONFIDENCE_ORDER[b.confidence] ?? 3)\n );\n // Output minimal JSON (no scan_context to keep output clean for slash command)\n const output = {\n generated_at: result.generated_at,\n recommendation_count: sorted.length,\n recommendations: sorted,\n };\n console.log(JSON.stringify(output, null, 2));\n } catch (err) {\n console.log(JSON.stringify({\n error: err instanceof Error ? err.message : String(err),\n recommendations: [],\n }, null, 2));\n process.exitCode = 1;\n }\n });\n}\n","// Apply CLI subcommands -- pending, apply-one, dismiss.\n// Used by the /evolve:apply slash command for interactive recommendation management.\n\nimport { readFile, appendFile } from 'node:fs/promises';\nimport type { Command } from '@commander-js/extra-typings';\nimport { loadState, updateStatus } from '../delivery/state.js';\nimport { paths } from '../storage/dirs.js';\nimport type { Recommendation } from '../schemas/recommendation.js';\nimport { analysisResultSchema } from '../schemas/recommendation.js';\n\n// Trigger applier registration by importing auto-apply (registers all 4 appliers as side effect)\nimport '../delivery/auto-apply.js';\nimport { getApplier } from '../delivery/appliers/index.js';\n\n/** Confidence tier ordering: HIGH (0) -> MEDIUM (1) -> LOW (2) */\nconst CONFIDENCE_ORDER: Record<string, number> = { HIGH: 0, MEDIUM: 1, LOW: 2 };\n\n/**\n * Load recommendations from the analysis result file.\n * Returns an empty array when the file does not exist or is invalid.\n */\nasync function loadAnalysisResult(): Promise<Recommendation[]> {\n try {\n const raw = await readFile(paths.analysisResult, 'utf-8');\n const parsed = analysisResultSchema.parse(JSON.parse(raw));\n return parsed.recommendations;\n } catch {\n return [];\n }\n}\n\n/**\n * Register the 'pending' subcommand on a Commander.js program.\n *\n * Reads the analysis result and recommendation state, filters to\n * recommendations that are not yet applied or dismissed, and outputs\n * the pending list as structured JSON.\n */\nexport function registerPendingCommand(program: Command): void {\n program\n .command('pending')\n .description('List pending recommendations as JSON')\n .action(async () => {\n const allRecs = await loadAnalysisResult();\n const state = await loadState();\n const statusMap = new Map(state.entries.map(e => [e.id, e.status]));\n\n // Filter to pending: recommendations not in state, or explicitly pending\n // Sort by confidence: HIGH -> MEDIUM -> LOW\n const pending = allRecs\n .filter(rec => {\n const status = statusMap.get(rec.id);\n return status === undefined || status === 'pending';\n })\n .sort((a, b) =>\n (CONFIDENCE_ORDER[a.confidence] ?? 3) - (CONFIDENCE_ORDER[b.confidence] ?? 3)\n );\n\n console.log(JSON.stringify({ pending, count: pending.length }, null, 2));\n });\n}\n\n/**\n * Register the 'apply-one' subcommand on a Commander.js program.\n *\n * Loads the recommendation by ID from analysis result, finds the correct\n * applier from the registry, applies the recommendation, logs the attempt,\n * and updates the recommendation status on success.\n */\nexport function registerApplyOneCommand(program: Command): void {\n program\n .command('apply-one')\n .description('Apply a single recommendation by ID')\n .argument('<id>', 'Recommendation ID to apply')\n .action(async (id) => {\n try {\n const allRecs = await loadAnalysisResult();\n const rec = allRecs.find(r => r.id === id);\n if (!rec) {\n console.log(JSON.stringify({\n recommendation_id: id,\n success: false,\n details: `Recommendation '${id}' not found`,\n }));\n process.exitCode = 1;\n return;\n }\n\n const applier = getApplier(rec.target);\n if (!applier || !applier.canApply(rec)) {\n console.log(JSON.stringify({\n recommendation_id: id,\n success: false,\n details: `No applicable applier for target '${rec.target}'`,\n }));\n process.exitCode = 1;\n return;\n }\n\n const result = await applier.apply(rec);\n\n // Log the attempt (non-critical -- ignore write failures)\n const logEntry = {\n timestamp: new Date().toISOString(),\n recommendation_id: rec.id,\n target: rec.target,\n action: rec.suggested_action,\n success: result.success,\n details: result.details,\n };\n try {\n await appendFile(paths.autoApplyLog, JSON.stringify(logEntry) + '\\n', 'utf-8');\n } catch {\n // Log failure is non-critical\n }\n\n // Update status to applied on success\n if (result.success) {\n await updateStatus(id, 'applied', `Applied via /evolve:apply: ${result.details}`);\n }\n\n console.log(JSON.stringify(result, null, 2));\n } catch (err) {\n console.log(JSON.stringify({\n recommendation_id: id,\n success: false,\n details: err instanceof Error ? err.message : String(err),\n }));\n process.exitCode = 1;\n }\n });\n}\n\n/**\n * Register the 'dismiss' subcommand on a Commander.js program.\n *\n * Permanently dismisses a recommendation by updating its status to 'dismissed'.\n * Outputs JSON confirmation with the recommendation ID and status.\n */\nexport function registerDismissCommand(program: Command): void {\n program\n .command('dismiss')\n .description('Permanently dismiss a recommendation by ID')\n .argument('<id>', 'Recommendation ID to dismiss')\n .action(async (id) => {\n try {\n await updateStatus(id, 'dismissed', 'Dismissed by user via /evolve:apply');\n console.log(JSON.stringify({ id, status: 'dismissed' }, null, 2));\n } catch (err) {\n console.log(JSON.stringify({\n id,\n error: err instanceof Error ? err.message : String(err),\n }));\n process.exitCode = 1;\n }\n });\n}\n","// Recommendation and analysis result schemas.\n// Defines the output contracts for the analysis engine: routing targets,\n// confidence tiers, recommendation structure, and analysis configuration.\n\nimport { z } from 'zod/v4';\n\nexport const routingTargetSchema = z.enum([\n 'HOOK',\n 'SKILL',\n 'RULE',\n 'CLAUDE_MD',\n 'MEMORY',\n 'SETTINGS',\n]);\nexport type RoutingTarget = z.infer<typeof routingTargetSchema>;\n\nexport const confidenceSchema = z.enum(['HIGH', 'MEDIUM', 'LOW']);\nexport type Confidence = z.infer<typeof confidenceSchema>;\n\nexport const patternTypeSchema = z.enum([\n 'repeated_prompt',\n 'long_prompt',\n 'permission-always-approved',\n 'code_correction',\n 'personal_info',\n 'config_drift',\n 'version_update',\n 'ecosystem_gsd',\n 'ecosystem_cog',\n 'onboarding_start_hooks',\n 'onboarding_start_rules',\n 'onboarding_start_claudemd',\n 'onboarding_optimize',\n 'scan_redundancy',\n 'scan_missing_mechanization',\n 'scan_stale_reference',\n]);\nexport type PatternType = z.infer<typeof patternTypeSchema>;\n\nexport const recommendationSchema = z.object({\n id: z.string(),\n target: routingTargetSchema,\n confidence: confidenceSchema,\n pattern_type: patternTypeSchema,\n title: z.string(),\n description: z.string(),\n evidence: z.object({\n count: z.number(),\n sessions: z.number().optional(),\n examples: z.array(z.string()).max(3),\n }),\n suggested_action: z.string(),\n ecosystem_context: z.string().optional(),\n});\nexport type Recommendation = z.infer<typeof recommendationSchema>;\n\n// Default threshold values for classifiers\nconst DEFAULT_THRESHOLDS = {\n repeated_prompt_min_count: 5,\n repeated_prompt_high_count: 10,\n repeated_prompt_high_sessions: 3,\n repeated_prompt_medium_sessions: 2,\n long_prompt_min_words: 200,\n long_prompt_min_count: 2,\n long_prompt_high_words: 300,\n long_prompt_high_count: 3,\n permission_approval_min_count: 10,\n permission_approval_min_sessions: 3,\n permission_approval_high_count: 15,\n permission_approval_high_sessions: 4,\n code_correction_min_failure_rate: 0.3,\n code_correction_min_failures: 3,\n} as const;\n\nexport const analysisConfigSchema = z.object({\n thresholds: z.object({\n repeated_prompt_min_count: z.number().default(DEFAULT_THRESHOLDS.repeated_prompt_min_count),\n repeated_prompt_high_count: z.number().default(DEFAULT_THRESHOLDS.repeated_prompt_high_count),\n repeated_prompt_high_sessions: z.number().default(DEFAULT_THRESHOLDS.repeated_prompt_high_sessions),\n repeated_prompt_medium_sessions: z.number().default(DEFAULT_THRESHOLDS.repeated_prompt_medium_sessions),\n long_prompt_min_words: z.number().default(DEFAULT_THRESHOLDS.long_prompt_min_words),\n long_prompt_min_count: z.number().default(DEFAULT_THRESHOLDS.long_prompt_min_count),\n long_prompt_high_words: z.number().default(DEFAULT_THRESHOLDS.long_prompt_high_words),\n long_prompt_high_count: z.number().default(DEFAULT_THRESHOLDS.long_prompt_high_count),\n permission_approval_min_count: z.number().default(DEFAULT_THRESHOLDS.permission_approval_min_count),\n permission_approval_min_sessions: z.number().default(DEFAULT_THRESHOLDS.permission_approval_min_sessions),\n permission_approval_high_count: z.number().default(DEFAULT_THRESHOLDS.permission_approval_high_count),\n permission_approval_high_sessions: z.number().default(DEFAULT_THRESHOLDS.permission_approval_high_sessions),\n code_correction_min_failure_rate: z.number().default(DEFAULT_THRESHOLDS.code_correction_min_failure_rate),\n code_correction_min_failures: z.number().default(DEFAULT_THRESHOLDS.code_correction_min_failures),\n }).default(() => ({ ...DEFAULT_THRESHOLDS })),\n max_recommendations: z.number().default(20),\n}).default(() => ({\n thresholds: { ...DEFAULT_THRESHOLDS },\n max_recommendations: 20,\n}));\nexport type AnalysisConfig = z.infer<typeof analysisConfigSchema>;\n\nexport const analysisResultSchema = z.object({\n generated_at: z.iso.datetime(),\n summary_period: z.object({\n since: z.string(),\n until: z.string(),\n days: z.number(),\n }),\n recommendations: z.array(recommendationSchema),\n metadata: z.object({\n classifier_count: z.number(),\n patterns_evaluated: z.number(),\n environment_ecosystems: z.array(z.string()),\n claude_code_version: z.string(),\n }),\n});\nexport type AnalysisResult = z.infer<typeof analysisResultSchema>;\n","// Auto-apply module for high-confidence recommendations.\n// When fullAuto mode is enabled (config.delivery.fullAuto=true), this module\n// automatically applies HIGH-confidence recommendations that have a registered\n// applier. Dispatches to the correct applier via the strategy pattern registry.\n// v1 appliers: SettingsApplier (permission-always-approved), RuleApplier (create-only rules).\n// v2 appliers: HookApplier (hook script generation + settings registration), ClaudeMdApplier (CLAUDE.md append).\n\nimport { appendFile } from 'node:fs/promises';\nimport { paths, ensureInit } from '../storage/dirs.js';\nimport { loadConfig } from '../storage/config.js';\nimport { updateStatus, getStatusMap } from './state.js';\nimport {\n registerApplier,\n getApplier,\n hasApplier,\n} from './appliers/index.js';\nimport { SettingsApplier } from './appliers/settings-applier.js';\nimport { RuleApplier } from './appliers/rule-applier.js';\nimport { HookApplier } from './appliers/hook-applier.js';\nimport { ClaudeMdApplier } from './appliers/claude-md-applier.js';\nimport type { Recommendation } from '../schemas/recommendation.js';\nimport type { AutoApplyLogEntry } from '../schemas/delivery.js';\nimport type { ApplierOptions } from './appliers/index.js';\n\nexport interface AutoApplyResult {\n recommendation_id: string;\n success: boolean;\n details: string;\n}\n\nexport interface AutoApplyOptions extends ApplierOptions {}\n\n// Register all built-in appliers\nregisterApplier(new SettingsApplier());\nregisterApplier(new RuleApplier());\nregisterApplier(new HookApplier());\nregisterApplier(new ClaudeMdApplier());\n\n/**\n * Auto-apply HIGH-confidence recommendations when fullAuto is enabled.\n * Returns an empty array when fullAuto is false (default, per QUA-01).\n *\n * Dispatches to the appropriate Applier based on rec.target via the\n * applier registry. Only processes recommendations whose target has a\n * registered applier and whose applier.canApply() returns true.\n */\nexport async function autoApplyRecommendations(\n recommendations: Recommendation[],\n options?: AutoApplyOptions,\n): Promise<AutoApplyResult[]> {\n const config = await loadConfig();\n if (!config.delivery.fullAuto) return [];\n\n await ensureInit();\n const stateMap = await getStatusMap();\n const results: AutoApplyResult[] = [];\n\n // Filter: only HIGH confidence + has registered applier + pending status\n const candidates = recommendations.filter(\n (rec) =>\n rec.confidence === 'HIGH' &&\n hasApplier(rec.target) &&\n (stateMap.get(rec.id) ?? 'pending') === 'pending',\n );\n\n for (const rec of candidates) {\n const applier = getApplier(rec.target);\n let result: AutoApplyResult;\n\n if (!applier || !applier.canApply(rec)) {\n result = {\n recommendation_id: rec.id,\n success: false,\n details: `No applicable applier for target '${rec.target}' with pattern_type '${rec.pattern_type}'`,\n };\n } else {\n result = await applier.apply(rec, options);\n }\n\n results.push(result);\n\n // Log the attempt\n const logEntry: AutoApplyLogEntry = {\n timestamp: new Date().toISOString(),\n recommendation_id: rec.id,\n target: rec.target,\n action: rec.suggested_action,\n success: result.success,\n details: result.details,\n backup_path: undefined,\n };\n await appendFile(\n paths.autoApplyLog,\n JSON.stringify(logEntry) + '\\n',\n 'utf-8',\n );\n\n // Update status on success\n if (result.success) {\n await updateStatus(rec.id, 'applied', `Auto-applied: ${result.details}`);\n }\n }\n\n return results;\n}\n","import { readFile } from 'node:fs/promises';\nimport writeFileAtomic from 'write-file-atomic';\nimport { configSchema, type Config } from '../schemas/config.js';\nimport { paths } from './dirs.js';\n\nexport async function loadConfig(): Promise<Config> {\n try {\n const raw = await readFile(paths.config, 'utf-8');\n return configSchema.parse(JSON.parse(raw));\n } catch {\n // File doesn't exist, is invalid JSON, or fails strict validation\n const defaults = configSchema.parse({});\n await writeFileAtomic(paths.config, JSON.stringify(defaults, null, 2));\n return defaults;\n }\n}\n","import { z } from 'zod/v4';\n\nexport const configSchema = z.object({\n version: z.number().default(1),\n analysis: z.object({\n threshold: z.number().min(1).default(50),\n enabled: z.boolean().default(true),\n classifierThresholds: z.record(z.string(), z.number()).default({}),\n }).default({ threshold: 50, enabled: true, classifierThresholds: {} }),\n hooks: z.object({\n capturePrompts: z.boolean().default(true),\n captureTools: z.boolean().default(true),\n capturePermissions: z.boolean().default(true),\n captureSessions: z.boolean().default(true),\n }).default({\n capturePrompts: true,\n captureTools: true,\n capturePermissions: true,\n captureSessions: true,\n }),\n scrubbing: z.object({\n enabled: z.boolean().default(true),\n highEntropyDetection: z.boolean().default(false),\n customPatterns: z.array(z.object({\n name: z.string(),\n regex: z.string(),\n replacement: z.string(),\n })).default([]),\n }).default({\n enabled: true,\n highEntropyDetection: false,\n customPatterns: [],\n }),\n delivery: z.object({\n stdoutInjection: z.boolean().default(true),\n maxTokens: z.number().default(200),\n fullAuto: z.boolean().default(false),\n maxRecommendationsInFile: z.number().default(20),\n archiveAfterDays: z.number().default(7),\n }).default({\n stdoutInjection: true,\n maxTokens: 200,\n fullAuto: false,\n maxRecommendationsInFile: 20,\n archiveAfterDays: 7,\n }),\n}).strict();\n\nexport type Config = z.infer<typeof configSchema>;\n","// Applier interface, options, and registry for auto-apply dispatch.\n// The registry maps routing targets (e.g. 'SETTINGS', 'RULE') to their\n// corresponding Applier implementations. Adding a new applier requires\n// only implementing the Applier interface and calling registerApplier().\n\nimport type { Recommendation } from '../../schemas/recommendation.js';\nimport type { AutoApplyResult } from '../auto-apply.js';\n\nexport interface ApplierOptions {\n /** Override settings.json path (used in testing) */\n settingsPath?: string;\n /** Override rules directory (used in testing) */\n rulesDir?: string;\n /** Override hooks directory (used in testing) */\n hooksDir?: string;\n /** Override CLAUDE.md path (used in testing) */\n claudeMdPath?: string;\n}\n\nexport interface Applier {\n readonly target: string;\n canApply(rec: Recommendation): boolean;\n apply(rec: Recommendation, options?: ApplierOptions): Promise<AutoApplyResult>;\n}\n\nconst registry = new Map<string, Applier>();\n\nexport function registerApplier(applier: Applier): void {\n registry.set(applier.target, applier);\n}\n\nexport function getApplier(target: string): Applier | undefined {\n return registry.get(target);\n}\n\nexport function hasApplier(target: string): boolean {\n return registry.has(target);\n}\n","// SettingsApplier: handles auto-apply for SETTINGS/permission-always-approved.\n// Extracted from auto-apply.ts — adds tools to allowedTools in settings.json\n// with atomic writes and backup creation before modification.\n\nimport { readFile, copyFile, mkdir } from 'node:fs/promises';\nimport { join, dirname } from 'node:path';\nimport writeFileAtomic from 'write-file-atomic';\nimport type { Applier, ApplierOptions } from './index.js';\nimport type { Recommendation } from '../../schemas/recommendation.js';\nimport type { AutoApplyResult } from '../auto-apply.js';\nimport { paths } from '../../storage/dirs.js';\n\nexport class SettingsApplier implements Applier {\n readonly target = 'SETTINGS';\n\n canApply(rec: Recommendation): boolean {\n return (\n rec.confidence === 'HIGH' &&\n rec.target === 'SETTINGS' &&\n rec.pattern_type === 'permission-always-approved'\n );\n }\n\n async apply(\n rec: Recommendation,\n options?: ApplierOptions,\n ): Promise<AutoApplyResult> {\n try {\n // v1 scope: only handle permission-always-approved pattern\n if (rec.pattern_type !== 'permission-always-approved') {\n return {\n recommendation_id: rec.id,\n success: false,\n details: `Skipped: pattern_type '${rec.pattern_type}' not supported for auto-apply in v1`,\n };\n }\n\n const settingsFilePath =\n options?.settingsPath ??\n join(process.env.HOME ?? '', '.claude', 'settings.json');\n\n // Read current settings\n const raw = await readFile(settingsFilePath, 'utf-8');\n const settings = JSON.parse(raw) as Record<string, unknown>;\n\n // Create backup before modification\n const backup = join(\n paths.analysis,\n 'backups',\n `settings-backup-${rec.id}.json`,\n );\n await mkdir(dirname(backup), { recursive: true });\n await copyFile(settingsFilePath, backup);\n\n // Extract tool name from evidence\n const toolName = extractToolName(rec);\n if (!toolName) {\n return {\n recommendation_id: rec.id,\n success: false,\n details:\n 'Could not extract tool name from recommendation evidence',\n };\n }\n\n // Get or create allowedTools array\n const allowedTools = Array.isArray(settings.allowedTools)\n ? (settings.allowedTools as string[])\n : [];\n\n // Add tool if not already present\n if (!allowedTools.includes(toolName)) {\n allowedTools.push(toolName);\n }\n settings.allowedTools = allowedTools;\n\n // Write modified settings atomically\n await writeFileAtomic(\n settingsFilePath,\n JSON.stringify(settings, null, 2),\n );\n\n return {\n recommendation_id: rec.id,\n success: true,\n details: `Added ${toolName} to allowedTools`,\n };\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : String(err);\n return {\n recommendation_id: rec.id,\n success: false,\n details: message,\n };\n }\n }\n}\n\n/**\n * Extract tool name from recommendation evidence examples.\n * Looks for patterns like \"Bash(npm test)\" -> \"Bash\"\n * or \"ToolName(args)\" -> \"ToolName\".\n */\nfunction extractToolName(rec: Recommendation): string | undefined {\n for (const example of rec.evidence.examples) {\n const match = example.match(/^(\\w+)\\(/);\n if (match) return match[1];\n }\n return undefined;\n}\n","// RuleApplier: handles auto-apply for HIGH-confidence RULE recommendations.\n// Creates .claude/rules/evolve-{pattern_type}.md files with the recommendation\n// title, description, and suggested action. Create-only: never overwrites\n// existing rule files to respect user customizations (Pitfall 18).\n\nimport { writeFile, access, mkdir } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport type { Applier, ApplierOptions } from './index.js';\nimport type { Recommendation } from '../../schemas/recommendation.js';\nimport type { AutoApplyResult } from '../auto-apply.js';\n\nexport class RuleApplier implements Applier {\n readonly target = 'RULE';\n\n canApply(rec: Recommendation): boolean {\n return rec.confidence === 'HIGH' && rec.target === 'RULE';\n }\n\n async apply(\n rec: Recommendation,\n options?: ApplierOptions,\n ): Promise<AutoApplyResult> {\n const rulesDir =\n options?.rulesDir ??\n join(process.env.HOME ?? '', '.claude', 'rules');\n const fileName = `evolve-${rec.pattern_type}.md`;\n const filePath = join(rulesDir, fileName);\n\n // Create-only guard: never overwrite existing files (Pitfall 18)\n try {\n await access(filePath);\n return {\n recommendation_id: rec.id,\n success: false,\n details: `Rule file already exists: ${fileName}`,\n };\n } catch {\n // File does not exist — proceed to create\n }\n\n try {\n await mkdir(rulesDir, { recursive: true });\n\n const content = [\n `# ${rec.title}`,\n '',\n rec.description,\n '',\n '## Action',\n '',\n rec.suggested_action,\n '',\n '---',\n `*Auto-generated by harness-evolve (${rec.id})*`,\n ].join('\\n');\n\n await writeFile(filePath, content, 'utf-8');\n\n return {\n recommendation_id: rec.id,\n success: true,\n details: `Created rule file: ${fileName}`,\n };\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : String(err);\n return {\n recommendation_id: rec.id,\n success: false,\n details: message,\n };\n }\n }\n}\n","// HookApplier: handles auto-apply for HIGH-confidence HOOK recommendations.\n// Generates a bash hook script via generateHook(), writes it to disk with +x\n// permission, and registers the hook in settings.json via mergeHooks().\n// Create-only: never overwrites existing hook files.\n\nimport { writeFile, access, mkdir, chmod, copyFile } from 'node:fs/promises';\nimport { join, basename, dirname } from 'node:path';\nimport type { Applier, ApplierOptions } from './index.js';\nimport type { Recommendation } from '../../schemas/recommendation.js';\nimport type { AutoApplyResult } from '../auto-apply.js';\nimport { generateHook } from '../../generators/hook-generator.js';\nimport {\n readSettings,\n writeSettings,\n mergeHooks,\n} from '../../cli/utils.js';\nimport { paths } from '../../storage/dirs.js';\n\nexport class HookApplier implements Applier {\n readonly target = 'HOOK';\n\n canApply(rec: Recommendation): boolean {\n return rec.confidence === 'HIGH' && rec.target === 'HOOK';\n }\n\n async apply(\n rec: Recommendation,\n options?: ApplierOptions,\n ): Promise<AutoApplyResult> {\n try {\n // Generate hook script from recommendation\n const artifact = generateHook(rec);\n if (!artifact) {\n return {\n recommendation_id: rec.id,\n success: false,\n details: 'Generator returned null — recommendation not applicable for hook generation',\n };\n }\n\n // Resolve hooks directory\n const hooksDir =\n options?.hooksDir ??\n join(process.env.HOME ?? '', '.claude', 'hooks');\n\n // Extract script filename from artifact path\n const scriptFilename = basename(artifact.filename);\n const scriptPath = join(hooksDir, scriptFilename);\n\n // Create-only guard: never overwrite existing hook files\n try {\n await access(scriptPath);\n return {\n recommendation_id: rec.id,\n success: false,\n details: `Hook file already exists: ${scriptFilename}`,\n };\n } catch {\n // File does not exist — proceed to create\n }\n\n // Create hooks directory\n await mkdir(hooksDir, { recursive: true });\n\n // Write hook script file\n await writeFile(scriptPath, artifact.content, 'utf-8');\n\n // Set executable permission\n await chmod(scriptPath, 0o755);\n\n // Resolve settings.json path\n const settingsPath =\n options?.settingsPath ??\n join(process.env.HOME ?? '', '.claude', 'settings.json');\n\n // Read current settings\n const settings = await readSettings(settingsPath);\n\n // Create backup before modification\n const backupDir = join(paths.analysis, 'backups');\n await mkdir(backupDir, { recursive: true });\n const backupFile = join(backupDir, `settings-backup-${rec.id}.json`);\n // Only backup if settings file exists and has content\n try {\n await copyFile(settingsPath, backupFile);\n } catch {\n // Settings file may not exist yet — write current state as backup\n await writeFile(backupFile, JSON.stringify(settings, null, 2), 'utf-8');\n }\n\n // Extract hook event from generated content\n const eventMatch = artifact.content.match(/# Hook event: (\\w+)/);\n const hookEvent = eventMatch?.[1] ?? 'PreToolUse';\n\n // Merge hook into settings\n const merged = mergeHooks(settings, [\n {\n event: hookEvent,\n command: `bash \"${scriptPath}\"`,\n timeout: 10,\n async: true,\n },\n ]);\n\n // Write merged settings\n await writeSettings(merged, settingsPath);\n\n return {\n recommendation_id: rec.id,\n success: true,\n details: `Created hook script: ${scriptFilename} and registered under ${hookEvent}`,\n };\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : String(err);\n return {\n recommendation_id: rec.id,\n success: false,\n details: message,\n };\n }\n }\n}\n","// Generator module schemas and shared utilities.\n// Defines the GeneratedArtifact output contract for all generators,\n// plus helper functions (toSlug, escapeYaml) used across generator implementations.\n\nimport { z } from 'zod/v4';\n\n// Version stamp embedded in every generated artifact\nexport const GENERATOR_VERSION = '1.0.0';\n\n// Return current time as ISO 8601 string\nexport function nowISO(): string {\n return new Date().toISOString();\n}\n\n/**\n * Convert text to a URL/filename-safe slug.\n * Lowercases, replaces non-alphanumeric with hyphens,\n * collapses consecutive hyphens, strips leading/trailing hyphens,\n * and caps at 50 characters.\n */\nexport function toSlug(text: string): string {\n if (!text) return '';\n return text\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/-+/g, '-')\n .replace(/^-|-$/g, '')\n .slice(0, 50);\n}\n\n// Characters that require quoting in YAML values\nconst YAML_SPECIAL = /[:\"'{}[\\]#&*!|>\\\\,\\n]/;\n\n/**\n * Escape a string for safe inclusion as a YAML frontmatter value.\n * Wraps in double quotes and escapes internal double quotes\n * when the text contains YAML-special characters.\n */\nexport function escapeYaml(text: string): string {\n if (!YAML_SPECIAL.test(text)) return text;\n return `\"${text.replace(/\"/g, '\\\\\"')}\"`;\n}\n\nexport const generatedArtifactSchema = z.object({\n type: z.enum(['skill', 'hook', 'claude_md_patch']),\n filename: z.string(),\n content: z.string(),\n source_recommendation_id: z.string(),\n metadata: z.object({\n generated_at: z.iso.datetime(),\n generator_version: z.string(),\n pattern_type: z.string(),\n }),\n});\nexport type GeneratedArtifact = z.infer<typeof generatedArtifactSchema>;\n\nexport interface GeneratorOptions {\n projectRoot?: string;\n}\n","// Hook generator: converts HOOK-targeted recommendations into bash hook\n// script drafts. Handles both scan_missing_mechanization and repeated_prompt\n// pattern types. Pure function -- no filesystem access, no side effects.\n// Returns null for non-applicable recommendations.\n\nimport type { Recommendation } from '../schemas/recommendation.js';\nimport type { GeneratedArtifact } from './schemas.js';\nimport { toSlug, GENERATOR_VERSION, nowISO } from './schemas.js';\n\n/**\n * Extract the hook event name from a recommendation's description\n * or suggested_action field.\n *\n * Tries these patterns in order:\n * 1. \"suitable for a <HookEvent> hook\" in description\n * 2. \"Create a <HookEvent> hook\" in suggested_action\n * 3. Falls back to 'PreToolUse' if no match\n */\nfunction extractHookEvent(rec: Recommendation): string {\n const descMatch = rec.description.match(/suitable for a (\\w+) hook/i);\n if (descMatch) return descMatch[1];\n\n const actionMatch = rec.suggested_action.match(/Create a (\\w+) hook/i);\n if (actionMatch) return actionMatch[1];\n\n return 'PreToolUse';\n}\n\n/**\n * Generate a bash hook script draft from a HOOK-targeted recommendation.\n *\n * @param rec - A Recommendation object (from mechanization scanner or repeated-prompts classifier)\n * @returns GeneratedArtifact with type 'hook', or null if the recommendation\n * is not applicable (wrong target)\n */\nexport function generateHook(rec: Recommendation): GeneratedArtifact | null {\n if (rec.target !== 'HOOK') return null;\n\n const hookEvent = extractHookEvent(rec);\n const slugName = toSlug(rec.title);\n\n const content = [\n '#!/usr/bin/env bash',\n `# Auto-generated hook for: ${rec.title}`,\n `# Hook event: ${hookEvent}`,\n `# Source: harness-evolve (${rec.id})`,\n '#',\n '# TODO: Review and customize this script before use.',\n '',\n '# Read hook input from stdin',\n 'INPUT=$(cat)',\n '',\n '# Extract relevant fields',\n `# Adjust jq path based on your ${hookEvent} event schema`,\n '',\n `# ${rec.suggested_action}`,\n '',\n '# Exit 0 to allow, exit 2 to block',\n 'exit 0',\n ].join('\\n');\n\n return {\n type: 'hook',\n filename: `.claude/hooks/evolve-${slugName}.sh`,\n content,\n source_recommendation_id: rec.id,\n metadata: {\n generated_at: nowISO(),\n generator_version: GENERATOR_VERSION,\n pattern_type: rec.pattern_type,\n },\n };\n}\n","// ClaudeMdApplier: handles auto-apply for HIGH-confidence CLAUDE_MD recommendations.\n// Appends new sections to CLAUDE.md for generic pattern types. Refuses to\n// auto-apply destructive patterns (scan_stale_reference, scan_redundancy) that\n// require manual review. Uses write-file-atomic for safe writes.\n// Creates backup of original CLAUDE.md before modification.\n\nimport { readFile, mkdir } from 'node:fs/promises';\nimport { join, dirname } from 'node:path';\nimport writeFileAtomic from 'write-file-atomic';\nimport type { Applier, ApplierOptions } from './index.js';\nimport type { Recommendation } from '../../schemas/recommendation.js';\nimport type { AutoApplyResult } from '../auto-apply.js';\nimport { paths } from '../../storage/dirs.js';\n\n/** Pattern types that require manual review — no destructive auto-apply. */\nconst DESTRUCTIVE_PATTERNS = new Set([\n 'scan_stale_reference',\n 'scan_redundancy',\n]);\n\nexport class ClaudeMdApplier implements Applier {\n readonly target = 'CLAUDE_MD';\n\n canApply(rec: Recommendation): boolean {\n return rec.confidence === 'HIGH' && rec.target === 'CLAUDE_MD';\n }\n\n async apply(\n rec: Recommendation,\n options?: ApplierOptions,\n ): Promise<AutoApplyResult> {\n try {\n // Pattern-type guard: refuse destructive patterns\n if (DESTRUCTIVE_PATTERNS.has(rec.pattern_type)) {\n return {\n recommendation_id: rec.id,\n success: false,\n details: `Pattern type '${rec.pattern_type}' requires manual review — cannot safely auto-apply`,\n };\n }\n\n // Resolve CLAUDE.md path\n const claudeMdPath =\n options?.claudeMdPath ??\n join(process.cwd(), 'CLAUDE.md');\n\n // Read existing content (empty string if file doesn't exist)\n let existingContent = '';\n try {\n existingContent = await readFile(claudeMdPath, 'utf-8');\n } catch {\n // File does not exist — will be created\n }\n\n // Create backup if content exists\n if (existingContent) {\n const backupDir = join(paths.analysis, 'backups');\n await mkdir(backupDir, { recursive: true });\n const backupFile = join(backupDir, `claudemd-backup-${rec.id}.md`);\n await writeFileAtomic(backupFile, existingContent);\n }\n\n // Build new section to append\n const newSection = [\n '',\n '',\n `## ${rec.title}`,\n '',\n rec.suggested_action,\n '',\n '---',\n `*Auto-generated by harness-evolve (${rec.id})*`,\n '',\n ].join('\\n');\n\n // Append section to existing content\n const updatedContent = existingContent + newSection;\n\n // Ensure parent directory exists\n await mkdir(dirname(claudeMdPath), { recursive: true });\n\n // Write updated content atomically\n await writeFileAtomic(claudeMdPath, updatedContent);\n\n return {\n recommendation_id: rec.id,\n success: true,\n details: `Appended section: ${rec.title}`,\n };\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : String(err);\n return {\n recommendation_id: rec.id,\n success: false,\n details: message,\n };\n }\n }\n}\n"],"mappings":"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","names":["join","access","dirname","join","readFile","join","readFile","join","paths","paths","dirname","access","join","dirname","program","readFile","writeFileAtomic","z","mkdir","join","readFile","readFile","writeFileAtomic","z","readFile","writeFileAtomic","program","copyFile","access","constants","join","join","copyFile","access","constants","program","program","readFile","appendFile","z","readFile","writeFileAtomic","z","readFile","copyFile","mkdir","join","dirname","writeFileAtomic","join","readFile","mkdir","dirname","copyFile","writeFileAtomic","writeFile","access","mkdir","join","writeFile","access","mkdir","copyFile","join","basename","z","z","join","basename","access","mkdir","writeFile","copyFile","readFile","mkdir","join","dirname","writeFileAtomic","join","readFile","mkdir","writeFileAtomic","dirname","CONFIDENCE_ORDER","readFile","program","appendFile","join"]}
|