@holdpoint/cli 0.1.0-alpha.16 → 0.1.0-alpha.17
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +880 -390
- package/dist/index.js.map +1 -1
- package/dist/templates/HOLDPOINT_PREREQUISITES.md +1 -0
- package/dist/templates/HOLDPOINT_REFERENCE.md +341 -0
- package/dist/templates/MASTER_PROMPT.md +25 -295
- package/dist/templates/default.yaml +239 -0
- package/package.json +16 -17
- package/dist/builder-ui/assets/index-3J1uDBNl.css +0 -1
- package/dist/builder-ui/assets/index-DezgTDRo.js +0 -457
- package/dist/builder-ui/assets/index-DezgTDRo.js.map +0 -1
- package/dist/builder-ui/favicon.svg +0 -10
- package/dist/builder-ui/index.html +0 -14
- package/dist/templates/_base.yaml +0 -57
- package/dist/templates/fullstack.yaml +0 -93
- package/dist/templates/go.yaml +0 -60
- package/dist/templates/nextjs.yaml +0 -76
- package/dist/templates/python.yaml +0 -60
- package/dist/templates/typescript.yaml +0 -52
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/commands/init.ts","../src/detect.ts","../src/templates.ts","../src/commands/check.ts","../src/commands/validate.ts","../src/commands/update.ts","../src/commands/build.ts","../src/commands/evolve.ts","../src/evolve/scanner.ts","../src/evolve/dead-checker.ts","../src/evolve/templates.ts","../src/commands/live.ts","../src/lib/ensure-daemon.ts","../src/lib/open-browser.ts","../src/commands/daemon.ts","../src/version.ts","../src/commands/engines.ts","../src/engines.ts","../src/commands/event.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport { initCommand } from \"./commands/init.js\";\nimport { checkCommand } from \"./commands/check.js\";\nimport { validateCommand } from \"./commands/validate.js\";\nimport { updateCommand } from \"./commands/update.js\";\nimport { buildCommand } from \"./commands/build.js\";\nimport { evolveCommand } from \"./commands/evolve.js\";\nimport { liveCommand } from \"./commands/live.js\";\nimport {\n daemonServeCommand,\n daemonStartCommand,\n daemonStatusCommand,\n daemonStopCommand,\n} from \"./commands/daemon.js\";\nimport { enginesCommand } from \"./commands/engines.js\";\nimport { eventCommand } from \"./commands/event.js\";\nimport { CLI_VERSION } from \"./version.js\";\n\nconst program = new Command();\n\nprogram\n .name(\"holdpoint\")\n .description(\"Universal eval-guard for AI coding agents (alpha)\")\n .version(CLI_VERSION)\n .action(() => {\n void liveCommand();\n });\n\nprogram\n .command(\"init\")\n .description(\"Initialise Holdpoint in the current project\")\n .option(\"--stack <stack>\", \"Stack type: typescript | python | nextjs | fullstack\")\n .option(\n \"--agent <agent>\",\n \"Agent to install for: copilot | claude | cursor | codex (default: all four)\",\n )\n .action(initCommand);\n\nprogram\n .command(\"check\")\n .description(\"Run task checks from checks.yaml\")\n .option(\"--staged\", \"Only check against git-staged files\")\n .action(checkCommand);\n\nprogram\n .command(\"validate\")\n .description(\"Validate checks.yaml schema and print any errors\")\n .action(validateCommand);\n\nprogram\n .command(\"update\")\n .description(\"Regenerate engine files from current checks.yaml (preserves checks.yaml)\")\n .action(updateCommand);\n\nprogram\n .command(\"builder\")\n .description(\"Open the visual builder UI on localhost:4321\")\n .action(buildCommand);\n\nprogram\n .command(\"live\")\n .description(\"Open the Holdpoint Live UI\")\n .option(\"--project <project>\", \"Open the UI focused on a specific project hash\")\n .action(liveCommand);\n\nconst daemon = program.command(\"daemon\").description(\"Manage the Holdpoint Live daemon\");\n\ndaemon\n .command(\"start\")\n .description(\"Start or connect to the singleton Holdpoint Live daemon\")\n .action(daemonStartCommand);\n\ndaemon\n .command(\"status\")\n .description(\"Show Holdpoint Live daemon status\")\n .action(daemonStatusCommand);\n\ndaemon\n .command(\"stop\")\n .description(\"Stop the running Holdpoint Live daemon\")\n .action(daemonStopCommand);\n\nprogram\n .command(\"event\")\n .description(\"Internal: read event JSON from stdin and publish it to Holdpoint Live\")\n .option(\"--engine <engine>\", \"Engine name when converting native hook payloads\")\n .option(\"--from-hook\", \"Interpret stdin as an engine-native hook payload\")\n .action(eventCommand);\n\nprogram\n .command(\"engines\")\n .description(\"List discovered Holdpoint Live adapter packages\")\n .option(\"--json\", \"Print machine-readable discovery output\")\n .action(enginesCommand);\n\nprogram\n .command(\"daemon-serve\")\n .description(\"Internal: run the Holdpoint Live daemon in the foreground\")\n .option(\"--port <port>\", \"Fixed port for the daemon process\")\n .action(daemonServeCommand);\n\nprogram\n .command(\"evolve\")\n .description(\"Scan project and propose (or apply) new checks to keep checks.yaml in sync\")\n .option(\"--apply\", \"Write proposed changes to checks.yaml and regenerate engine files\")\n .action(evolveCommand);\n\nprogram.parse();\n","import { execSync } from \"node:child_process\";\nimport { existsSync, readFileSync, writeFileSync, mkdirSync } from \"node:fs\";\nimport { join, dirname } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport chalk from \"chalk\";\nimport ora from \"ora\";\nimport { buildConfigJson, buildEngine } from \"@holdpoint/engine-copilot\";\nimport { buildEngineJson as buildClaudeEngineJson } from \"@holdpoint/engine-claude\";\nimport { buildEngine as buildCursorEngine } from \"@holdpoint/engine-cursor\";\nimport {\n buildConfigToml as buildCodexConfigToml,\n buildHooksJson as buildCodexHooksJson,\n buildCheckScript as buildCodexCheckScript,\n spliceAgentsMd,\n buildAgentsMd,\n} from \"@holdpoint/engine-codex\";\nimport { parseHoldpointYaml } from \"@holdpoint/yaml-core\";\nimport type { AgentType, StackType } from \"@holdpoint/types\";\nimport { detectStack, detectPackageManager, type PackageManager } from \"../detect.js\";\nimport { ensureBundledFile } from \"../templates.js\";\n\nconst __dirname = dirname(fileURLToPath(import.meta.url));\n\nfunction getTemplatePath(stack: StackType): string {\n const name = stack === \"unknown\" ? \"_base\" : stack;\n const candidates = [\n join(__dirname, \"templates\", `${name}.yaml`), // dist/templates/ (published package)\n join(__dirname, \"../../../templates\", `${name}.yaml`), // monorepo dev fallback\n join(process.cwd(), \"templates\", `${name}.yaml`), // cwd fallback\n ];\n for (const p of candidates) {\n if (existsSync(p)) return p;\n }\n return \"\";\n}\n\nconst MINIMAL_CHECKS_YAML = `version: 1\ncontext:\n guides: {}\nconditions: []\nchecks:\n - id: lint\n label: \"Lint codebase\"\n cmd: \"echo 'Add your lint command here'\"\n\n - id: jsdoc\n label: \"JSDoc on changed public functions\"\n prompt: \"Ensure all changed public functions and exports have JSDoc comments.\"\n`;\n\nconst MINIMAL_MASTER_PROMPT = `# Holdpoint\n\nRun \\`holdpoint check\\` before marking any task complete.\nSee \\`checks.yaml\\` for the full list of checks.\n`;\n\nconst MINIMAL_PREREQUISITES = `# Holdpoint prerequisites\n\nHoldpoint installed repo-local adapters for one or more AI coding agents. Before relying on them locally, review these setup notes:\n\n- **GitHub Copilot CLI** — Holdpoint's \\`.github/extensions/holdpoint/extension.mjs\\` uses the Copilot CLI **EXTENSIONS** feature. Today that feature is gated behind experimental mode. In Copilot CLI, run \\`/experimental on\\` so **EXTENSIONS** appears in the enabled feature set before using Holdpoint locally.\n- **OpenAI Codex** — project-level hooks require trust approval. Run \\`codex trust\\` in the Codex TUI or review the hook with \\`/hooks\\`.\n- **General** — Holdpoint expects Node.js 18+ and a git repository so \\`holdpoint init\\`, \\`holdpoint update\\`, and \\`holdpoint check\\` can run normally.\n\nDocs: https://holdpoint.dev/docs\n`;\n\n/**\n * Initialise Holdpoint in the current project.\n *\n * Writes `checks.yaml` (from a stack template if available), `checks.immutable.json`,\n * engine adapter files for each target agent (Copilot, Claude, Cursor, Codex),\n * and repo-local handoff docs such as `HOLDPOINT_PREREQUISITES.md`.\n * Defaults to installing all four agents; pass `--agent` to restrict to one.\n */\nexport async function initCommand(options: { stack?: string; agent?: string }): Promise<void> {\n const spinner = ora(\"Initialising Holdpoint…\").start();\n\n const stack = (options.stack as StackType | undefined) ?? detectStack();\n\n // Default: install for all agents. Pass --agent=copilot|claude|cursor to restrict.\n const agentOpt = options.agent;\n const agents: AgentType[] =\n !agentOpt || agentOpt === \"all\"\n ? [\"copilot\", \"claude\", \"cursor\", \"codex\"]\n : [agentOpt as AgentType];\n\n spinner.text = `Stack: ${chalk.cyan(stack)} — installing for: ${chalk.cyan(agents.join(\", \"))}`;\n\n // Detect package manager once — used both for template substitution and devDep install.\n const pm = detectPackageManager();\n\n // 1. Read or create checks.yaml\n let yamlContent = MINIMAL_CHECKS_YAML;\n if (!existsSync(\"checks.yaml\")) {\n const templatePath = getTemplatePath(stack);\n if (templatePath) {\n yamlContent = readFileSync(templatePath, \"utf8\");\n }\n // Substitute the package manager so checks use the right runner (npm/yarn/pnpm).\n if (pm !== \"pnpm\") {\n yamlContent = yamlContent.replace(/\\bpnpm\\b/g, pm);\n }\n writeFileSync(\"checks.yaml\", yamlContent, \"utf8\");\n } else {\n yamlContent = readFileSync(\"checks.yaml\", \"utf8\");\n }\n\n const config = parseHoldpointYaml(yamlContent);\n\n // 2. Write checks.immutable.json — read by holdpoint-check.mjs at runtime\n const generatedDir = \".github/holdpoint/generated\";\n mkdirSync(generatedDir, { recursive: true });\n writeFileSync(`${generatedDir}/checks.immutable.json`, buildConfigJson(config), \"utf8\");\n\n // 3. Install engine files for each target agent\n if (agents.includes(\"copilot\")) {\n // extension.mjs handles both session context injection (onSessionStart) and\n // check enforcement (onPreToolUse → task_complete). No separate hooks files needed.\n const extDir = \".github/extensions/holdpoint\";\n mkdirSync(extDir, { recursive: true });\n writeFileSync(join(extDir, \"extension.mjs\"), buildEngine(config), \"utf8\");\n }\n\n if (agents.includes(\"claude\")) {\n mkdirSync(\".claude\", { recursive: true });\n const settingsPath = \".claude/settings.json\";\n let existing: Record<string, unknown> = {};\n if (existsSync(settingsPath)) {\n try {\n existing = JSON.parse(readFileSync(settingsPath, \"utf8\")) as Record<string, unknown>;\n } catch {\n /* ignore */\n }\n }\n const holdpointHooks = JSON.parse(buildClaudeEngineJson(config)) as Record<string, unknown>;\n writeFileSync(\n settingsPath,\n JSON.stringify({ ...existing, hooks: holdpointHooks.hooks }, null, 2),\n \"utf8\",\n );\n }\n\n if (agents.includes(\"cursor\")) {\n const cursorRules = buildCursorEngine(config);\n const cursorPath = \".cursorrules\";\n if (existsSync(cursorPath)) {\n const existing = readFileSync(cursorPath, \"utf8\");\n if (!existing.includes(\"Holdpoint Rules\")) {\n writeFileSync(cursorPath, existing + \"\\n\" + cursorRules, \"utf8\");\n }\n } else {\n writeFileSync(cursorPath, cursorRules, \"utf8\");\n }\n }\n\n if (agents.includes(\"codex\")) {\n mkdirSync(\".codex\", { recursive: true });\n writeFileSync(\".codex/hooks.json\", buildCodexHooksJson(config), \"utf8\");\n writeFileSync(\".codex/holdpoint-check.mjs\", buildCodexCheckScript(config), \"utf8\");\n writeFileSync(\".codex/config.toml\", buildCodexConfigToml(), \"utf8\");\n const agentsMdPath = \"AGENTS.md\";\n const existing = existsSync(agentsMdPath) ? readFileSync(agentsMdPath, \"utf8\") : \"\";\n writeFileSync(agentsMdPath, spliceAgentsMd(existing, config), \"utf8\");\n }\n\n // 4. Create repo-local guidance files if not present\n ensureBundledFile(\"MASTER_PROMPT.md\", \"MASTER_PROMPT.md\", MINIMAL_MASTER_PROMPT);\n ensureBundledFile(\n \"HOLDPOINT_PREREQUISITES.md\",\n \"HOLDPOINT_PREREQUISITES.md\",\n MINIMAL_PREREQUISITES,\n );\n\n // Install holdpoint as a devDependency so hooks resolve via node_modules/.bin\n // rather than downloading on every hook fire via npx.\n spinner.text = \"Installing holdpoint as a devDependency…\";\n const installCmds: Record<PackageManager, string> = {\n pnpm: \"pnpm add -D holdpoint@alpha\",\n yarn: \"yarn add --dev holdpoint@alpha\",\n npm: \"npm install --save-dev holdpoint@alpha\",\n };\n const installCmd = installCmds[pm];\n try {\n execSync(installCmd, { stdio: \"pipe\" });\n spinner.succeed(chalk.bold.green(\"Holdpoint initialised!\"));\n } catch {\n spinner.warn(\n chalk.yellow(`Holdpoint initialised, but could not install the package automatically.`) +\n `\\n Run manually: ${chalk.yellow(installCmd)}`,\n );\n }\n\n console.log(`\n${chalk.cyan(\"Next steps:\")}\n 1. Edit ${chalk.yellow(\"checks.yaml\")} to customise your eval checkpoints\n 2. Review ${chalk.yellow(\"HOLDPOINT_PREREQUISITES.md\")} for agent setup notes\n 3. Commit ${chalk.yellow(\"checks.yaml\")}, ${chalk.yellow(\"HOLDPOINT_PREREQUISITES.md\")}, and the generated engine files\n 4. Run ${chalk.yellow(\"holdpoint check\")} at any time to validate\n\n${chalk.bgYellow.black(\" Copilot local use \")} Run ${chalk.yellow(\"/experimental on\")} in GitHub Copilot CLI so the\n${chalk.yellow(\"EXTENSIONS\")} feature is enabled before using Holdpoint locally.\nSee ${chalk.yellow(\"HOLDPOINT_PREREQUISITES.md\")} for the full handoff notes.\n\n Visual builder: ${chalk.yellow(\"holdpoint builder\")} (opens localhost:4321)\n Stack: ${chalk.cyan(stack)} Agents: ${chalk.cyan(agents.join(\", \"))}\n`);\n}\n","import { existsSync, readFileSync } from \"node:fs\";\nimport type { AgentType, StackType } from \"@holdpoint/types\";\n\nexport type PackageManager = \"pnpm\" | \"yarn\" | \"npm\";\n\n/** Detect which package manager owns the current project by checking lock files. */\nexport function detectPackageManager(): PackageManager {\n if (existsSync(\"pnpm-lock.yaml\")) return \"pnpm\";\n if (existsSync(\"yarn.lock\")) return \"yarn\";\n return \"npm\";\n}\n\n/** @deprecated Use detectInstalledAgents() — single-agent detection is no longer the default. */\nexport function detectAgent(): AgentType {\n if (existsSync(\".github/extensions\")) return \"copilot\";\n if (existsSync(\".claude\")) return \"claude\";\n if (existsSync(\".cursorrules\")) return \"cursor\";\n if (existsSync(\".codex\")) return \"codex\";\n return \"unknown\";\n}\n\n/**\n * Returns every agent whose Holdpoint engine files are already present in the\n * current working directory. Used by `holdpoint update` so it regenerates only\n * the engines that were previously installed.\n */\nexport function detectInstalledAgents(): AgentType[] {\n const agents: AgentType[] = [];\n if (existsSync(\".github/extensions/holdpoint/extension.mjs\")) agents.push(\"copilot\");\n if (existsSync(\".claude/settings.json\")) agents.push(\"claude\");\n if (existsSync(\".cursorrules\")) {\n try {\n if (readFileSync(\".cursorrules\", \"utf8\").includes(\"Holdpoint Rules\")) {\n agents.push(\"cursor\");\n }\n } catch {\n /* ignore unreadable file */\n }\n }\n // Detect Codex by the generated check script (more specific than .codex/ existence)\n if (existsSync(\".codex/holdpoint-check.mjs\")) agents.push(\"codex\");\n return agents;\n}\n\nexport function detectStack(): StackType {\n const hasNext =\n existsSync(\"next.config.ts\") || existsSync(\"next.config.js\") || existsSync(\"next.config.mjs\");\n const hasTsConfig = existsSync(\"tsconfig.json\");\n const hasPyproject =\n existsSync(\"pyproject.toml\") || existsSync(\"requirements.txt\") || existsSync(\"setup.py\");\n const hasPrisma = existsSync(\"prisma/schema.prisma\");\n const hasApi = existsSync(\"server\") || existsSync(\"api\") || existsSync(\"backend\");\n const hasGoMod = existsSync(\"go.mod\");\n\n if (hasNext && (hasPrisma || hasApi)) return \"fullstack\";\n if (hasNext) return \"nextjs\";\n if (hasTsConfig) return \"typescript\";\n if (hasPyproject) return \"python\";\n if (hasGoMod) return \"go\";\n return \"unknown\";\n}\n","import { copyFileSync, existsSync, writeFileSync } from \"node:fs\";\nimport { join, dirname } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nconst __dirname = dirname(fileURLToPath(import.meta.url));\n\nexport function getBundledTemplatePath(filename: string): string {\n const candidates = [\n join(__dirname, \"templates\", filename), // dist/templates/ (published package)\n join(__dirname, \"../../../templates\", filename), // monorepo dev fallback\n join(process.cwd(), \"templates\", filename), // cwd fallback\n ];\n for (const candidate of candidates) {\n if (existsSync(candidate)) return candidate;\n }\n return \"\";\n}\n\nexport function ensureBundledFile(\n outputPath: string,\n templateFilename: string,\n fallbackContent: string,\n): boolean {\n if (existsSync(outputPath)) {\n return false;\n }\n\n const templatePath = getBundledTemplatePath(templateFilename);\n if (templatePath) {\n copyFileSync(templatePath, outputPath);\n } else {\n writeFileSync(outputPath, fallbackContent, \"utf8\");\n }\n\n return true;\n}\n","import { existsSync, readFileSync, writeFileSync, mkdirSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport chalk from \"chalk\";\nimport ora from \"ora\";\nimport { parseHoldpointYaml, matchesWhen } from \"@holdpoint/yaml-core\";\nimport { runDeterministicChecks } from \"@holdpoint/yaml-core/runner\";\nimport type { CheckResult, CheckRun, CheckReports } from \"@holdpoint/types\";\nimport { execSync } from \"node:child_process\";\nimport { randomUUID } from \"node:crypto\";\nimport { identifyProject } from \"@holdpoint/live-daemon\";\nimport type { EventV1 } from \"@holdpoint/live-protocol\";\nimport { BridgeClient } from \"@holdpoint/sdk\";\n\nconst COMMIT_CACHE_PATH = \".holdpoint/checked-commits.json\";\nconst COMMIT_CACHE_MAX = 100;\nconst CHECK_REPORTS_PATH = \".holdpoint/check-reports.json\";\nconst CHECK_REPORTS_MAX = 50;\n\nfunction getStagedFiles(): string[] {\n try {\n const out = execSync(\"git diff --cached --name-only\", {\n encoding: \"utf8\",\n stdio: [\"pipe\", \"pipe\", \"ignore\"],\n });\n return out.trim().split(\"\\n\").filter(Boolean);\n } catch {\n return [];\n }\n}\n\nfunction getAllChangedFiles(): string[] {\n try {\n const out = execSync(\"git diff --name-only HEAD\", {\n encoding: \"utf8\",\n stdio: [\"pipe\", \"pipe\", \"ignore\"],\n });\n return out.trim().split(\"\\n\").filter(Boolean);\n } catch {\n return [];\n }\n}\n\n/**\n * Returns the files changed in the most recent commit (HEAD vs HEAD~1).\n * Used as a fallback when no staged files exist but the agent has already committed.\n */\nfunction getLastCommitFiles(): string[] {\n try {\n const out = execSync(\"git diff --name-only HEAD~1 HEAD\", {\n encoding: \"utf8\",\n stdio: [\"pipe\", \"pipe\", \"ignore\"],\n });\n return out.trim().split(\"\\n\").filter(Boolean);\n } catch {\n return [];\n }\n}\n\n/** Returns the current HEAD commit SHA, or null if unavailable. */\nfunction getHeadSha(): string | null {\n try {\n return execSync(\"git rev-parse HEAD\", {\n encoding: \"utf8\",\n stdio: [\"pipe\", \"pipe\", \"ignore\"],\n }).trim();\n } catch {\n return null;\n }\n}\n\n/** Returns the set of already-verified commit SHAs from the local cache. */\nfunction readCommitCache(): Set<string> {\n try {\n const raw = readFileSync(COMMIT_CACHE_PATH, \"utf8\");\n const parsed = JSON.parse(raw) as { verified?: unknown };\n return new Set(Array.isArray(parsed.verified) ? (parsed.verified as string[]) : []);\n } catch {\n return new Set();\n }\n}\n\n/**\n * Records a commit SHA as verified in the local cache.\n * Caps the cache at COMMIT_CACHE_MAX entries (newest first).\n */\nfunction recordCommitCache(sha: string): void {\n try {\n const existing = readCommitCache();\n const updated = [sha, ...[...existing].filter((s) => s !== sha)].slice(0, COMMIT_CACHE_MAX);\n mkdirSync(join(COMMIT_CACHE_PATH, \"..\"), { recursive: true });\n writeFileSync(COMMIT_CACHE_PATH, JSON.stringify({ verified: updated }, null, 2) + \"\\n\", \"utf8\");\n } catch {\n // Non-fatal: cache write failure just means the next run re-checks this commit.\n }\n}\n\n/**\n * Appends a check run report to `.holdpoint/check-reports.json`.\n * Caps to CHECK_REPORTS_MAX runs, newest first. Non-fatal if write fails.\n */\nfunction recordCheckReport(run: CheckRun): void {\n try {\n mkdirSync(join(CHECK_REPORTS_PATH, \"..\"), { recursive: true });\n let existing: CheckReports = { runs: [] };\n if (existsSync(CHECK_REPORTS_PATH)) {\n try {\n existing = JSON.parse(readFileSync(CHECK_REPORTS_PATH, \"utf8\")) as CheckReports;\n if (!Array.isArray(existing.runs)) existing.runs = [];\n } catch {\n existing = { runs: [] };\n }\n }\n const updated: CheckReports = {\n runs: [run, ...existing.runs].slice(0, CHECK_REPORTS_MAX),\n };\n writeFileSync(CHECK_REPORTS_PATH, JSON.stringify(updated, null, 2) + \"\\n\", \"utf8\");\n } catch {\n // Non-fatal: report write failure does not affect check outcomes.\n }\n}\n\nexport async function checkCommand(options: { staged?: boolean }): Promise<void> {\n if (!existsSync(\"checks.yaml\")) {\n console.error(chalk.red(\"No checks.yaml found. Run `holdpoint init` first.\"));\n process.exit(1);\n }\n\n const yamlContent = readFileSync(\"checks.yaml\", \"utf8\");\n let config;\n try {\n config = parseHoldpointYaml(yamlContent);\n } catch (err: unknown) {\n console.error(chalk.red(\"Invalid checks.yaml:\"), (err as Error).message);\n process.exit(1);\n }\n\n // Always resolve HEAD SHA — used for both cache and reports.\n const headSha = getHeadSha();\n\n let changedFiles: string[];\n let usedHeadShaForCache = false;\n\n if (options.staged) {\n const staged = getStagedFiles();\n if (staged.length > 0) {\n changedFiles = staged;\n } else {\n // Nothing staged — check if HEAD was already verified to avoid a check loop.\n if (headSha && readCommitCache().has(headSha)) {\n console.log(\n chalk.green(`✓ Commit ${headSha.slice(0, 8)} already verified — nothing to re-check.`),\n );\n process.exit(0);\n }\n\n // Fall back to files in the most recent commit (covers the\n // \"agent committed then called task_complete\" workflow).\n const lastCommit = getLastCommitFiles();\n if (lastCommit.length > 0) {\n changedFiles = lastCommit;\n usedHeadShaForCache = true;\n console.log(\n chalk.yellow(\"No staged files. Running checks scoped to the most recent commit's files.\"),\n );\n } else {\n // Truly nothing changed (investigative session, no recent commit).\n console.log(chalk.green(\"✓ No staged changes and no recent commit — nothing to check.\"));\n process.exit(0);\n }\n }\n } else {\n changedFiles = getAllChangedFiles();\n if (changedFiles.length === 0) {\n console.log(\n chalk.yellow(\"No changed files detected. Running all checks with no file filter.\"),\n );\n console.log(\n chalk.dim(\n \" Tip: if you just ran `holdpoint init`, commit the generated files to clear the git-commit check.\",\n ),\n );\n }\n }\n\n // Print project guides so the agent/human sees them before running checks\n const guides = Object.entries(config.context?.guides ?? {});\n if (guides.length > 0) {\n console.log(chalk.cyan(\"\\nProject guides:\"));\n for (const [key, text] of guides) {\n console.log(chalk.bold(` ${key}:`), chalk.dim(String(text).trim()));\n }\n console.log(\"\");\n }\n\n const taskCount = config.checks.filter((c) => c.cmd !== undefined).length;\n const spinner = ora(`Running ${taskCount} task(s)…`).start();\n const effectiveFiles = changedFiles.length > 0 ? changedFiles : [\"__all__\"];\n const results = runDeterministicChecks(config, effectiveFiles);\n\n const passed = results.filter((r) => r.status === \"pass\");\n const failed = results.filter((r) => r.status === \"fail\");\n const skipped = results.filter((r) => r.status === \"skip\");\n\n spinner.stop();\n\n // Print results\n for (const result of results) {\n printResult(result);\n }\n\n // Summary\n console.log(\"\");\n console.log(\n [\n chalk.green(`✓ ${passed.length} passed`),\n failed.length > 0 ? chalk.red(`✗ ${failed.length} failed`) : \"\",\n skipped.length > 0 ? chalk.gray(`◌ ${skipped.length} skipped`) : \"\",\n ]\n .filter(Boolean)\n .join(\" \"),\n );\n\n // Prompt checks: show those whose when filter matches the changed files\n const promptChecks = config.checks.filter(\n (c) =>\n c.prompt !== undefined &&\n matchesWhen(c.when, changedFiles.length > 0 ? changedFiles : [\"__all__\"], config.patterns),\n );\n if (promptChecks.length > 0) {\n console.log(`\\n${chalk.cyan(\"Agent prompts to act on:\")}`);\n for (const c of promptChecks) {\n console.log(` ${chalk.yellow(\"□\")} [${c.label}] ${c.prompt ?? \"\"}`);\n }\n }\n\n // Write rich check run report BEFORE exiting so failed runs are always recorded.\n const reportResults = [\n ...results.map((r) => ({\n id: r.check.id,\n label: r.check.label,\n kind: \"cmd\" as const,\n status: r.status as \"pass\" | \"fail\" | \"skip\",\n ...(r.output !== undefined ? { output: r.output } : {}),\n ...(r.exitCode !== undefined ? { exitCode: r.exitCode } : {}),\n ...(r.skipReason !== undefined ? { skipReason: r.skipReason } : {}),\n })),\n ...promptChecks.map((c) => ({\n id: c.id,\n label: c.label,\n kind: \"prompt\" as const,\n status: \"shown\" as const,\n })),\n ];\n\n const run = {\n sha: headSha,\n shortSha: headSha ? headSha.slice(0, 8) : null,\n timestamp: new Date().toISOString(),\n files: changedFiles.length > 0 ? changedFiles : [],\n results: reportResults,\n summary: {\n passed: passed.length,\n failed: failed.length,\n skipped: skipped.length,\n shown: promptChecks.length,\n },\n };\n recordCheckReport(run);\n\n const project = identifyProject(process.cwd());\n const bridge = new BridgeClient();\n const liveEvents: EventV1[] = reportResults\n .filter(\n (result): result is Extract<(typeof reportResults)[number], { kind: \"cmd\" }> =>\n result.kind === \"cmd\",\n )\n .map((result, index) => ({\n v: 1,\n id: randomUUID(),\n ts: Date.now() + index,\n engine: \"holdpoint\",\n session_id: \"check-runner\",\n project_hash: project.hash,\n cwd: process.cwd(),\n type: \"check_run\",\n payload: {\n check_id: result.id,\n label: result.label,\n status: result.status,\n duration_ms: 0,\n ...(result.output ? { output: result.output } : {}),\n },\n }));\n if (liveEvents.length > 0) {\n await bridge.sendEvents(liveEvents);\n }\n\n if (failed.length > 0) {\n process.exit(1);\n }\n\n // All checks passed — if we ran against a committed HEAD (no staged files), mark it verified.\n if (usedHeadShaForCache && headSha) {\n recordCommitCache(headSha);\n }\n}\n\nfunction printResult(result: CheckResult): void {\n const icon =\n result.status === \"pass\"\n ? chalk.green(\"✓\")\n : result.status === \"fail\"\n ? chalk.red(\"✗\")\n : result.status === \"skip\"\n ? chalk.gray(\"◌\")\n : chalk.yellow(\"…\");\n\n const label = result.check.label;\n console.log(`${icon} ${label}`);\n\n if (result.status === \"fail\" && result.output) {\n const trimmed = result.output.trim().split(\"\\n\").slice(0, 10).join(\"\\n\");\n console.log(chalk.dim(trimmed.replace(/^/gm, \" \")));\n }\n if (result.status === \"skip\" && result.skipReason) {\n console.log(chalk.dim(` ${result.skipReason}`));\n }\n}\n","import { existsSync, readFileSync } from \"node:fs\";\nimport chalk from \"chalk\";\nimport { parseHoldpointYaml, validateConfig } from \"@holdpoint/yaml-core\";\n\nexport async function validateCommand(): Promise<void> {\n if (!existsSync(\"checks.yaml\")) {\n console.error(chalk.red(\"No checks.yaml found. Run `holdpoint init` first.\"));\n process.exit(1);\n }\n\n const text = readFileSync(\"checks.yaml\", \"utf8\");\n\n let config;\n try {\n config = parseHoldpointYaml(text);\n } catch (err: unknown) {\n console.error(chalk.red(\"Parse error:\"), (err as Error).message);\n process.exit(1);\n }\n\n const result = validateConfig(config);\n\n if (result.valid) {\n console.log(chalk.green(\"✓ checks.yaml is valid\"));\n console.log(\n chalk.dim(\n ` ${config.checks.filter((c) => c.cmd !== undefined).length} tasks, ${config.checks.filter((c) => c.prompt !== undefined).length} prompts, ${config.conditions.length} conditions`,\n ),\n );\n } else {\n console.error(chalk.red(\"✗ checks.yaml has errors:\"));\n for (const err of result.errors) {\n console.error(` ${chalk.yellow(err.path)}: ${err.message}`);\n }\n process.exit(1);\n }\n}\n","import { existsSync, readFileSync, writeFileSync, mkdirSync } from \"node:fs\";\nimport chalk from \"chalk\";\nimport ora from \"ora\";\nimport { parseHoldpointYaml } from \"@holdpoint/yaml-core\";\nimport { buildConfigJson, buildEngine } from \"@holdpoint/engine-copilot\";\nimport { buildEngineJson as buildClaudeEngineJson } from \"@holdpoint/engine-claude\";\nimport { buildEngine as buildCursorEngine } from \"@holdpoint/engine-cursor\";\nimport {\n buildConfigToml as buildCodexConfigToml,\n buildHooksJson as buildCodexHooksJson,\n buildCheckScript as buildCodexCheckScript,\n spliceAgentsMd,\n} from \"@holdpoint/engine-codex\";\nimport { detectInstalledAgents } from \"../detect.js\";\nimport type { AgentType } from \"@holdpoint/types\";\nimport { ensureBundledFile } from \"../templates.js\";\n\nconst MINIMAL_PREREQUISITES = `# Holdpoint prerequisites\n\nHoldpoint installed repo-local adapters for one or more AI coding agents. Before relying on them locally, review these setup notes:\n\n- **GitHub Copilot CLI** — Holdpoint's \\`.github/extensions/holdpoint/extension.mjs\\` uses the Copilot CLI **EXTENSIONS** feature. Today that feature is gated behind experimental mode. In Copilot CLI, run \\`/experimental on\\` so **EXTENSIONS** appears in the enabled feature set before using Holdpoint locally.\n- **OpenAI Codex** — project-level hooks require trust approval. Run \\`codex trust\\` in the Codex TUI or review the hook with \\`/hooks\\`.\n- **General** — Holdpoint expects Node.js 18+ and a git repository so \\`holdpoint init\\`, \\`holdpoint update\\`, and \\`holdpoint check\\` can run normally.\n\nDocs: https://holdpoint.dev/docs\n`;\n\n/**\n * Regenerate all Holdpoint engine adapter files from the current `checks.yaml`.\n *\n * Detects which agents were previously installed via `detectInstalledAgents()` and\n * regenerates only their files. Falls back to all four agents if no engine files\n * are found (e.g. first run after a manual `checks.yaml` edit).\n */\nexport async function updateCommand(): Promise<void> {\n if (!existsSync(\"checks.yaml\")) {\n console.error(chalk.red(\"No checks.yaml found. Run `holdpoint init` first.\"));\n process.exit(1);\n }\n\n const spinner = ora(\"Updating Holdpoint engine files…\").start();\n const config = parseHoldpointYaml(readFileSync(\"checks.yaml\", \"utf8\"));\n\n // Regenerate for every agent that was previously installed.\n // Fall back to all four if no engine files exist yet (e.g. first run after manual checks.yaml edit).\n const detected = detectInstalledAgents();\n const agents: AgentType[] =\n detected.length > 0 ? detected : [\"copilot\", \"claude\", \"cursor\", \"codex\"];\n\n // Always write checks.immutable.json — read by holdpoint-check.mjs at runtime\n const generatedDir = \".github/holdpoint/generated\";\n mkdirSync(generatedDir, { recursive: true });\n writeFileSync(`${generatedDir}/checks.immutable.json`, buildConfigJson(config), \"utf8\");\n\n if (agents.includes(\"copilot\")) {\n const extDir = \".github/extensions/holdpoint\";\n mkdirSync(extDir, { recursive: true });\n writeFileSync(`${extDir}/extension.mjs`, buildEngine(config), \"utf8\");\n }\n\n if (agents.includes(\"claude\")) {\n mkdirSync(\".claude\", { recursive: true });\n const settingsPath = \".claude/settings.json\";\n let existing: Record<string, unknown> = {};\n if (existsSync(settingsPath)) {\n try {\n existing = JSON.parse(readFileSync(settingsPath, \"utf8\")) as Record<string, unknown>;\n } catch {\n /* */\n }\n }\n const hooks = JSON.parse(buildClaudeEngineJson(config)) as Record<string, unknown>;\n writeFileSync(\n settingsPath,\n JSON.stringify({ ...existing, hooks: hooks.hooks }, null, 2) + \"\\n\",\n );\n }\n\n if (agents.includes(\"cursor\")) {\n const cursorRules = buildCursorEngine(config);\n const cursorPath = \".cursorrules\";\n if (existsSync(cursorPath)) {\n const content = readFileSync(cursorPath, \"utf8\");\n const start = content.indexOf(\"# ─── Holdpoint Rules\");\n const end = content.indexOf(\"# ─── End Holdpoint Rules ───\");\n if (start !== -1 && end !== -1) {\n // Slice past the end-marker line (find its newline to avoid hardcoded offsets)\n const afterEnd = content.indexOf(\"\\n\", end);\n const updated =\n content.slice(0, start) +\n cursorRules +\n content.slice(afterEnd === -1 ? end : afterEnd + 1);\n writeFileSync(cursorPath, updated);\n } else {\n writeFileSync(cursorPath, content + \"\\n\" + cursorRules);\n }\n }\n }\n\n if (agents.includes(\"codex\")) {\n mkdirSync(\".codex\", { recursive: true });\n // hooks.json is fully managed by Holdpoint; users who need additional Codex hooks\n // should add them in .codex/config.toml (Codex merges both sources).\n writeFileSync(\".codex/hooks.json\", buildCodexHooksJson(config), \"utf8\");\n writeFileSync(\".codex/holdpoint-check.mjs\", buildCodexCheckScript(config), \"utf8\");\n // Ensure hooks are explicitly enabled at the repo level.\n const configTomlPath = \".codex/config.toml\";\n if (!existsSync(configTomlPath)) {\n writeFileSync(configTomlPath, buildCodexConfigToml(), \"utf8\");\n } else {\n const existing = readFileSync(configTomlPath, \"utf8\");\n if (!existing.includes(\"[features]\")) {\n writeFileSync(configTomlPath, existing.trimEnd() + \"\\n\\n\" + buildCodexConfigToml(), \"utf8\");\n }\n // [features] already present — trust the user's settings\n }\n const agentsMdPath = \"AGENTS.md\";\n const existing = existsSync(agentsMdPath) ? readFileSync(agentsMdPath, \"utf8\") : \"\";\n writeFileSync(agentsMdPath, spliceAgentsMd(existing, config), \"utf8\");\n }\n\n const wrotePrerequisites = ensureBundledFile(\n \"HOLDPOINT_PREREQUISITES.md\",\n \"HOLDPOINT_PREREQUISITES.md\",\n MINIMAL_PREREQUISITES,\n );\n\n spinner.succeed(chalk.green(\"Engine files updated from current checks.yaml\"));\n if (wrotePrerequisites) {\n console.log(\n chalk.cyan(\n \"Created HOLDPOINT_PREREQUISITES.md with Copilot experimental-mode and other agent setup notes.\",\n ),\n );\n }\n}\n","import { createServer, type IncomingMessage, type ServerResponse } from \"node:http\";\nimport { createReadStream, existsSync } from \"node:fs\";\nimport { join, extname, dirname } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { execSync } from \"node:child_process\";\nimport chalk from \"chalk\";\n\nconst __dirname = dirname(fileURLToPath(import.meta.url));\n\nconst MIME: Record<string, string> = {\n \".html\": \"text/html; charset=utf-8\",\n \".js\": \"text/javascript\",\n \".mjs\": \"text/javascript\",\n \".css\": \"text/css\",\n \".svg\": \"image/svg+xml\",\n \".png\": \"image/png\",\n \".ico\": \"image/x-icon\",\n \".woff\": \"font/woff\",\n \".woff2\": \"font/woff2\",\n \".ttf\": \"font/ttf\",\n \".json\": \"application/json\",\n};\n\n/**\n * Serve a static file with the appropriate MIME type.\n */\nfunction serveFile(res: ServerResponse, filePath: string): void {\n const mime = MIME[extname(filePath)] ?? \"application/octet-stream\";\n res.writeHead(200, { \"Content-Type\": mime });\n createReadStream(filePath).pipe(res);\n}\n\n/**\n * Handle an incoming HTTP request: serve `/__holdpoint/initial-yaml` from the\n * user's `checks.yaml`, `/__holdpoint/initial-reports` from the run history,\n * and all other paths as static files from `uiDir` with a SPA fallback to `index.html`.\n */\nfunction handleRequest(req: IncomingMessage, res: ServerResponse, uiDir: string): void {\n const url = (req.url ?? \"/\").split(\"?\")[0] ?? \"/\";\n\n // Serve the user's checks.yaml for the builder UI to load\n if (url === \"/__holdpoint/initial-yaml\") {\n const checksPath = join(process.cwd(), \"checks.yaml\");\n if (existsSync(checksPath)) {\n res.writeHead(200, { \"Content-Type\": \"text/yaml; charset=utf-8\" });\n createReadStream(checksPath).pipe(res);\n } else {\n res.writeHead(404, { \"Content-Type\": \"text/plain\" });\n res.end(\"checks.yaml not found in current directory\");\n }\n return;\n }\n\n // Serve the check run history for the History tab\n if (url === \"/__holdpoint/initial-reports\") {\n const reportsPath = join(process.cwd(), \".holdpoint\", \"check-reports.json\");\n if (existsSync(reportsPath)) {\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n createReadStream(reportsPath).pipe(res);\n } else {\n res.writeHead(404, { \"Content-Type\": \"text/plain\" });\n res.end(\"No check reports found\");\n }\n return;\n }\n\n // Static files\n const candidate = join(uiDir, url === \"/\" ? \"index.html\" : url);\n const filePath = existsSync(candidate) ? candidate : join(uiDir, \"index.html\"); // SPA fallback\n serveFile(res, filePath);\n}\n\n/**\n * Start the Holdpoint visual builder on localhost:4321.\n *\n * Serves the pre-built React SPA from `dist/builder-ui/` (bundled into the CLI\n * package at publish time) and exposes a `/__holdpoint/initial-yaml` endpoint\n * that returns the user's `checks.yaml` so the builder can load it on startup.\n */\nexport async function buildCommand(): Promise<void> {\n const port = 4321;\n const uiDir = join(__dirname, \"builder-ui\");\n\n if (!existsSync(uiDir)) {\n console.error(chalk.red(\"✗ Builder UI not found.\\n\"));\n console.log(chalk.dim(\" This is unexpected for a published build of @holdpoint/cli.\"));\n console.log(chalk.dim(\" If you installed from source, rebuild with: pnpm turbo build\\n\"));\n process.exit(1);\n }\n\n const server = createServer((req, res) => handleRequest(req, res, uiDir));\n\n await new Promise<void>((resolve, reject) => {\n server.listen(port, () => {\n console.log(\n `\\n${chalk.green(\"✓\")} Holdpoint builder running at ${chalk.cyan(`http://localhost:${port}`)}`,\n );\n console.log(chalk.dim(\" Edit checks.yaml, then reload the page to see updates\"));\n console.log(chalk.dim(\" Press Ctrl+C to stop\\n\"));\n\n const openCmd =\n process.platform === \"darwin\"\n ? \"open\"\n : process.platform === \"win32\"\n ? \"start\"\n : \"xdg-open\";\n try {\n execSync(`${openCmd} http://localhost:${port}`, { stdio: \"ignore\" });\n } catch {\n /* non-fatal */\n }\n });\n\n server.on(\"error\", reject);\n\n process.on(\"SIGINT\", () => {\n console.log(chalk.dim(\"\\n Stopping builder…\"));\n server.close(() => resolve());\n });\n });\n}\n","import { existsSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { execSync } from \"node:child_process\";\nimport chalk from \"chalk\";\nimport ora from \"ora\";\nimport { parseHoldpointYaml, generateYaml } from \"@holdpoint/yaml-core\";\nimport type { HoldpointConfig, CheckDef, ConditionDef } from \"@holdpoint/types\";\nimport { scanProject } from \"../evolve/scanner.js\";\nimport { getRepoFiles, detectStaleChecks } from \"../evolve/dead-checker.js\";\nimport { getTemplates } from \"../evolve/templates.js\";\n\n// ── Helpers ───────────────────────────────────────────────────────────────────\n\n/**\n * Strip leading comment lines from a checks.yaml so we can re-prepend them\n * after re-serialising — preserves the documentation header.\n */\nfunction extractHeader(yaml: string): string {\n const lines = yaml.split(\"\\n\");\n const commentLines: string[] = [];\n for (const line of lines) {\n if (line.startsWith(\"#\") || (commentLines.length > 0 && line.trim() === \"\")) {\n commentLines.push(line);\n } else {\n break;\n }\n }\n // Trim trailing blank lines\n while (commentLines.length > 0 && commentLines[commentLines.length - 1]?.trim() === \"\") {\n commentLines.pop();\n }\n return commentLines.join(\"\\n\");\n}\n\nfunction withHeader(header: string, newYaml: string): string {\n if (!header) return newYaml;\n return header + \"\\n\\n\" + newYaml;\n}\n\n// ── The command ───────────────────────────────────────────────────────────────\n\nexport async function evolveCommand(options: { apply?: boolean }): Promise<void> {\n if (!existsSync(\"checks.yaml\")) {\n console.error(chalk.red(\"No checks.yaml found. Run `holdpoint init` first.\"));\n process.exit(1);\n }\n\n const spinner = ora(\"Scanning project profile…\").start();\n const cwd = process.cwd();\n\n // 1. Scan project\n const profile = scanProject(cwd);\n const repoFiles = getRepoFiles(cwd);\n\n // 2. Parse checks.yaml\n const yamlContent = readFileSync(\"checks.yaml\", \"utf8\");\n let config: HoldpointConfig;\n try {\n config = parseHoldpointYaml(yamlContent);\n } catch (err: unknown) {\n spinner.fail(chalk.red(\"Invalid checks.yaml:\") + \" \" + (err as Error).message);\n process.exit(1);\n }\n\n spinner.stop();\n\n // 3. Compute proposals — templates whose trigger matches AND id not already in config\n const existingIds = new Set(config.checks.map((c) => c.id));\n const existingConditionIds = new Set(config.conditions.map((c) => c.id));\n const allTemplates = getTemplates(profile);\n const proposals = allTemplates.filter((t) => t.trigger(profile) && !existingIds.has(t.id));\n\n // 4. Detect stale checks\n const staleChecks = detectStaleChecks(config, repoFiles);\n\n // ── Print report ─────────────────────────────────────────────────────────\n\n // Profile summary — show detected items\n console.log(chalk.bold(\"\\n📋 Project profile:\"));\n const traits: [string, boolean, string][] = [\n [\"TypeScript\", profile.hasTypeScript, \"tsconfig.json\"],\n [\"ESLint\", profile.hasEslint, \"eslint.config.*\"],\n [\"Biome\", profile.hasBiome, \"biome.json\"],\n [\"Ruff\", profile.hasRuff, \"pyproject.toml / ruff\"],\n [\"Prettier\", profile.hasPrettier, \".prettierrc\"],\n [\"Vitest\", profile.hasVitest, \"devDependencies\"],\n [\"Jest\", profile.hasJest, \"devDependencies\"],\n [\"Python\", profile.hasPython, \"pyproject.toml\"],\n [\"Pytest\", profile.hasPytest, \"pytest.ini\"],\n [\"Go\", profile.hasGo, \"go.mod\"],\n [\"Rust\", profile.hasRust, \"Cargo.toml\"],\n [\"Next.js\", profile.hasNext, \"next.config.*\"],\n [\"React\", profile.hasReact, \"dependencies\"],\n [\"Prisma\", profile.hasPrisma, \"prisma/schema.prisma\"],\n [\"Drizzle\", profile.hasDrizzle, \"drizzle-orm\"],\n [\"Migrations\", profile.hasMigrations, \"migrations/\"],\n [\"Docker\", profile.hasDocker, \"Dockerfile\"],\n [\"Terraform\", profile.hasTerraform, \"*.tf\"],\n [\"Kubernetes\", profile.hasKubernetes, \"k8s/\"],\n [\"OpenAPI\", profile.hasOpenApi, \"openapi.yaml\"],\n [\"GitHub Actions\", profile.hasGithubActions, \".github/workflows/\"],\n ];\n const detected = traits.filter(([, yes]) => yes);\n if (detected.length === 0) {\n console.log(chalk.dim(\" (empty project — only universal checks apply)\"));\n } else {\n for (const [name, , hint] of detected) {\n console.log(` ${chalk.green(\"✓\")} ${name.padEnd(18)} ${chalk.dim(hint)}`);\n }\n }\n\n // Stale checks\n if (staleChecks.length > 0) {\n console.log(chalk.bold(`\\n⚠️ Stale checks (${staleChecks.length}):`));\n for (const { check, reason, suggestedConditionPath } of staleChecks) {\n const fix = suggestedConditionPath\n ? chalk.dim(` → will wrap with conditionId: file_exists: ${suggestedConditionPath}`)\n : chalk.dim(\" → no path inferred; review manually\");\n console.log(` ${chalk.yellow(\"◌\")} ${chalk.bold(check.id)} ${chalk.dim(reason)}${fix}`);\n }\n }\n\n // Proposals\n if (proposals.length === 0 && staleChecks.length === 0) {\n console.log(chalk.green(\"\\n✓ checks.yaml is fully in sync with the project profile.\"));\n return;\n }\n\n if (proposals.length > 0) {\n console.log(chalk.bold(`\\n💡 Proposed additions (${proposals.length}):`));\n for (const t of proposals) {\n const scope = t.when ? chalk.cyan(` when: ${t.when}`) : \"\";\n const type = t.cmd ? chalk.dim(\"cmd\") : chalk.dim(\"prompt\");\n const preview = t.cmd\n ? chalk.dim(` ${t.cmd.slice(0, 80)}${t.cmd.length > 80 ? \"…\" : \"\"}`)\n : chalk.dim(` ${(t.prompt ?? \"\").slice(0, 80)}${(t.prompt?.length ?? 0) > 80 ? \"…\" : \"\"}`);\n console.log(` ${chalk.green(\"+\")} ${chalk.bold(t.id.padEnd(24))} [${type}]${scope}`);\n console.log(` ${preview}`);\n }\n }\n\n if (!options.apply) {\n console.log(\n chalk.red(`\\n✗ checks.yaml is out of sync with the project profile.`) +\n `\\n Run ${chalk.bold(\"npx @holdpoint/cli@alpha evolve --apply\")} to apply these changes.`,\n );\n process.exit(1);\n }\n\n // ── Apply ───────────────────────────────────────────────────────────────\n\n const applySpinner = ora(\"Applying changes to checks.yaml…\").start();\n\n // Build updated conditions list\n const newConditions = [...config.conditions];\n\n // Collect conditions needed by proposals\n for (const t of proposals) {\n if (t.condition && !existingConditionIds.has(t.condition.id)) {\n newConditions.push(t.condition as ConditionDef);\n existingConditionIds.add(t.condition.id);\n }\n }\n\n // Wrap stale checks with file_exists conditions\n const updatedChecks: CheckDef[] = config.checks.map((check) => {\n const stale = staleChecks.find((s) => s.check.id === check.id);\n if (!stale || !stale.suggestedConditionPath) return check;\n\n const condId = `has-${check.id}`;\n if (!existingConditionIds.has(condId)) {\n newConditions.push({\n id: condId,\n operator: \"file_exists\",\n path: stale.suggestedConditionPath,\n });\n existingConditionIds.add(condId);\n }\n return { ...check, conditionId: condId };\n });\n\n // Append proposed checks\n const newChecks: CheckDef[] = proposals.map((t) => ({\n id: t.id,\n label: t.label,\n ...(t.when ? { when: t.when } : {}),\n ...(t.cmd ? { cmd: t.cmd } : {}),\n ...(t.prompt ? { prompt: t.prompt } : {}),\n ...(t.conditionId ? { conditionId: t.conditionId } : {}),\n }));\n\n const updatedConfig: HoldpointConfig = {\n ...config,\n conditions: newConditions,\n checks: [...updatedChecks, ...newChecks],\n };\n\n const header = extractHeader(yamlContent);\n const newYaml = withHeader(header, generateYaml(updatedConfig));\n writeFileSync(\"checks.yaml\", newYaml, \"utf8\");\n\n // Regenerate engine files\n applySpinner.text = \"Running holdpoint update…\";\n try {\n execSync(\"npx @holdpoint/cli@alpha update\", { stdio: \"pipe\" });\n } catch {\n // holdpoint update failure is non-fatal — checks.yaml is already written\n applySpinner.warn(\n chalk.yellow(\"checks.yaml updated, but `holdpoint update` failed — run it manually.\"),\n );\n printAppliedSummary(proposals.length, staleChecks.length);\n return;\n }\n\n applySpinner.succeed(chalk.green(\"checks.yaml updated and engine files regenerated.\"));\n printAppliedSummary(proposals.length, staleChecks.length);\n}\n\nfunction printAppliedSummary(added: number, wrapped: number): void {\n const parts: string[] = [];\n if (added > 0) parts.push(chalk.green(`${added} check${added === 1 ? \"\" : \"s\"} added`));\n if (wrapped > 0)\n parts.push(chalk.yellow(`${wrapped} stale check${wrapped === 1 ? \"\" : \"s\"} wrapped`));\n if (parts.length > 0) console.log(\" \" + parts.join(\" · \"));\n console.log(\n chalk.dim(\"\\n Review checks.yaml, then commit: \") +\n chalk.yellow(\"git add checks.yaml && git commit -m 'chore: evolve holdpoint checks'\"),\n );\n}\n","import { existsSync, readFileSync, readdirSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { execSync } from \"node:child_process\";\n\nexport interface ProjectProfile {\n // Languages\n hasTypeScript: boolean;\n hasPython: boolean;\n hasGo: boolean;\n hasRust: boolean;\n hasJava: boolean;\n hasRuby: boolean;\n // Frameworks\n hasNext: boolean;\n hasReact: boolean;\n // Linting\n hasEslint: boolean;\n hasBiome: boolean;\n hasRuff: boolean;\n hasPrettier: boolean;\n // Testing\n hasVitest: boolean;\n hasJest: boolean;\n hasPytest: boolean;\n // DB\n hasPrisma: boolean;\n hasDrizzle: boolean;\n hasMigrations: boolean;\n hasAlembic: boolean;\n // Infra\n hasDocker: boolean;\n hasTerraform: boolean;\n hasKubernetes: boolean;\n // API\n hasOpenApi: boolean;\n // CI\n hasGithubActions: boolean;\n // Package manager\n packageManager: \"pnpm\" | \"yarn\" | \"bun\" | \"npm\";\n // Raw scripts from package.json\n scripts: Record<string, string>;\n // All dep names (deps + devDeps)\n deps: Set<string>;\n}\n\ntype PkgJson = {\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n scripts?: Record<string, string>;\n};\n\nfunction tryReadJson<T>(path: string): T | null {\n try {\n return JSON.parse(readFileSync(path, \"utf8\")) as T;\n } catch {\n return null;\n }\n}\n\nfunction tryReadText(path: string): string {\n try {\n return readFileSync(path, \"utf8\");\n } catch {\n return \"\";\n }\n}\n\n/**\n * Walk a directory up to maxDepth levels, returning all file paths relative to root.\n * Excludes common build artifacts and dependency directories.\n */\nfunction walkDir(\n dir: string,\n root: string,\n depth: number,\n maxDepth: number,\n ignored: Set<string>,\n): string[] {\n if (depth > maxDepth) return [];\n let entries: string[] = [];\n try {\n entries = readdirSync(dir);\n } catch {\n return [];\n }\n const results: string[] = [];\n for (const entry of entries) {\n if (ignored.has(entry)) continue;\n const full = join(dir, entry);\n const rel = full.slice(root.length + 1);\n try {\n // Use stat-free heuristic: if it has an extension it's likely a file\n // If no extension and doesn't start with \".\", try as directory\n const hasExt = entry.includes(\".\");\n if (!hasExt || entry.startsWith(\".\")) {\n // Could be a dir — try recursing\n const children = walkDir(full, root, depth + 1, maxDepth, ignored);\n if (children.length > 0) {\n results.push(...children);\n } else if (hasExt) {\n results.push(rel);\n }\n } else {\n results.push(rel);\n }\n } catch {\n // skip\n }\n }\n return results;\n}\n\nconst WALK_IGNORED = new Set([\n \"node_modules\",\n \".git\",\n \"dist\",\n \"build\",\n \".next\",\n \".turbo\",\n \"__pycache__\",\n \".venv\",\n \"venv\",\n \".mypy_cache\",\n \"target\",\n \".cache\",\n \"coverage\",\n \".nyc_output\",\n]);\n\n/**\n * Returns a list of all files in the repo (relative paths from cwd).\n * Uses `git ls-files` when inside a git repo; falls back to directory walk.\n */\nexport function getRepoFiles(cwd: string): string[] {\n try {\n const out = execSync(\"git ls-files\", {\n cwd,\n encoding: \"utf8\",\n stdio: [\"pipe\", \"pipe\", \"ignore\"],\n });\n const files = out.trim().split(\"\\n\").filter(Boolean);\n if (files.length > 0) return files;\n } catch {\n // not a git repo or git not available\n }\n return walkDir(cwd, cwd, 0, 6, WALK_IGNORED);\n}\n\n/**\n * Returns true if the file path is a structural project indicator — i.e., a file\n * whose addition or modification may require new checks to be added to checks.yaml.\n * Mirrors the detection patterns used in `scanProject()`.\n */\nexport function isStructuralFile(file: string): boolean {\n const f = file.replace(/\\\\/g, \"/\");\n\n // JS / TS project structure\n if (f === \"package.json\") return true;\n if (/^tsconfig[^/]*\\.json$/.test(f)) return true;\n\n // Python\n if (/^requirements[^/]*\\.txt$/.test(f)) return true;\n if (f === \"pyproject.toml\") return true;\n if (f === \"Pipfile\") return true;\n if (f === \"setup.py\") return true;\n if (f === \"setup.cfg\") return true;\n if (f === \"pytest.ini\") return true;\n if (f === \"tox.ini\") return true;\n\n // Go\n if (f === \"go.mod\") return true;\n\n // Rust\n if (f === \"Cargo.toml\") return true;\n\n // Java / Kotlin\n if (f === \"pom.xml\") return true;\n if (/^build\\.gradle(\\.kts)?$/.test(f)) return true;\n\n // Ruby\n if (f === \"Gemfile\") return true;\n\n // Test frameworks\n if (/^vitest\\.config\\.[^/]+$/.test(f)) return true;\n if (/^jest\\.config\\.[^/]+$/.test(f)) return true;\n if (/^playwright\\.config\\.[^/]+$/.test(f)) return true;\n\n // Linters / formatters\n if (/^eslint\\.config\\.[^/]+$/.test(f)) return true;\n if (/^\\.eslintrc[^/]*$/.test(f)) return true;\n if (/^biome\\.jsonc?$/.test(f)) return true;\n if (/^prettier\\.config\\.[^/]+$/.test(f)) return true;\n if (/^\\.prettierrc[^/]*$/.test(f)) return true;\n\n // Next.js\n if (/^next\\.config\\.[^/]+$/.test(f)) return true;\n\n // Docker / infra\n if (/^Dockerfile[^/]*$/.test(f)) return true;\n if (/^docker-compose[^/]*\\.ya?ml$/.test(f)) return true;\n if (/[^/]*\\.tf$/.test(f)) return true;\n\n // Database\n if (f === \"prisma/schema.prisma\") return true;\n\n // OpenAPI\n if (/^(api\\/)?openapi\\.(yaml|yml|json)$/.test(f)) return true;\n\n // CI\n if (/^\\.github\\/workflows\\/[^/]+\\.ya?ml$/.test(f)) return true;\n if (/^\\.circleci\\/.+$/.test(f)) return true;\n if (f === \"Jenkinsfile\") return true;\n if (f === \".gitlab-ci.yml\") return true;\n if (f === \".travis.yml\") return true;\n\n return false;\n}\n\n/**\n * Scan the project at `cwd` and return a `ProjectProfile`.\n * All detection is pure filesystem reads — no shell commands executed.\n */\nexport function scanProject(cwd = process.cwd()): ProjectProfile {\n const exists = (p: string) => existsSync(join(cwd, p));\n\n // Package manager\n const packageManager: ProjectProfile[\"packageManager\"] = exists(\"pnpm-lock.yaml\")\n ? \"pnpm\"\n : exists(\"yarn.lock\")\n ? \"yarn\"\n : exists(\"bun.lockb\")\n ? \"bun\"\n : \"npm\";\n\n // package.json\n const pkg = tryReadJson<PkgJson>(join(cwd, \"package.json\"));\n const scripts = pkg?.scripts ?? {};\n const deps = new Set<string>([\n ...Object.keys(pkg?.dependencies ?? {}),\n ...Object.keys(pkg?.devDependencies ?? {}),\n ]);\n\n // Python manifest scanning\n const pyprojectText = tryReadText(join(cwd, \"pyproject.toml\"));\n const requirementsText = tryReadText(join(cwd, \"requirements.txt\"));\n const pipfileText = tryReadText(join(cwd, \"Pipfile\"));\n const allPyText = pyprojectText + requirementsText + pipfileText;\n\n const hasPytest =\n exists(\"pytest.ini\") ||\n exists(\"setup.cfg\") ||\n allPyText.includes(\"pytest\") ||\n allPyText.includes(\"[tool.pytest\");\n const hasRuff = allPyText.includes(\"ruff\") || deps.has(\"ruff\");\n const hasAlembic = allPyText.includes(\"alembic\") || deps.has(\"alembic\");\n\n // Root-level file listing (for Dockerfile variants and .tf files)\n let rootFiles: string[] = [];\n try {\n rootFiles = readdirSync(cwd);\n } catch {\n // ignore\n }\n\n const hasDocker =\n rootFiles.some((f) => f === \"Dockerfile\" || f.startsWith(\"Dockerfile.\")) ||\n exists(\"docker-compose.yml\") ||\n exists(\"docker-compose.yaml\") ||\n exists(\"docker-compose.dev.yml\");\n\n const hasTerraform =\n rootFiles.some((f) => f.endsWith(\".tf\")) || exists(\"terraform\") || exists(\"infra\");\n\n return {\n // Languages\n hasTypeScript: exists(\"tsconfig.json\") || deps.has(\"typescript\"),\n hasPython:\n Boolean(pyprojectText) ||\n Boolean(requirementsText) ||\n Boolean(pipfileText) ||\n exists(\"setup.py\"),\n hasGo: exists(\"go.mod\"),\n hasRust: exists(\"Cargo.toml\"),\n hasJava: exists(\"pom.xml\") || exists(\"build.gradle\") || exists(\"build.gradle.kts\"),\n hasRuby: exists(\"Gemfile\"),\n\n // Frameworks\n hasNext:\n exists(\"next.config.ts\") ||\n exists(\"next.config.js\") ||\n exists(\"next.config.mjs\") ||\n deps.has(\"next\"),\n hasReact: deps.has(\"react\"),\n\n // Linting\n hasEslint:\n exists(\"eslint.config.js\") ||\n exists(\"eslint.config.ts\") ||\n exists(\"eslint.config.mjs\") ||\n exists(\".eslintrc.js\") ||\n exists(\".eslintrc.json\") ||\n exists(\".eslintrc.yml\") ||\n exists(\".eslintrc.yaml\") ||\n deps.has(\"eslint\"),\n hasBiome: exists(\"biome.json\") || exists(\"biome.jsonc\") || deps.has(\"@biomejs/biome\"),\n hasRuff,\n hasPrettier:\n exists(\"prettier.config.js\") ||\n exists(\"prettier.config.ts\") ||\n exists(\"prettier.config.mjs\") ||\n exists(\".prettierrc\") ||\n exists(\".prettierrc.json\") ||\n deps.has(\"prettier\"),\n\n // Testing\n hasVitest: deps.has(\"vitest\") || Boolean(scripts[\"test\"]?.includes(\"vitest\")),\n hasJest: deps.has(\"jest\") || Boolean(scripts[\"test\"]?.includes(\"jest\")),\n hasPytest,\n\n // DB\n hasPrisma: exists(\"prisma/schema.prisma\") || deps.has(\"@prisma/client\"),\n hasDrizzle: deps.has(\"drizzle-orm\"),\n hasMigrations: exists(\"migrations\") || exists(\"db/migrations\") || exists(\"database/migrations\"),\n hasAlembic,\n\n // Infra\n hasDocker,\n hasTerraform,\n hasKubernetes: exists(\"k8s\") || exists(\"kubernetes\") || exists(\"helm\"),\n\n // API\n hasOpenApi:\n exists(\"openapi.yaml\") ||\n exists(\"openapi.yml\") ||\n exists(\"openapi.json\") ||\n exists(\"api/openapi.yaml\"),\n\n // CI\n hasGithubActions: exists(\".github/workflows\"),\n\n packageManager,\n scripts,\n deps,\n };\n}\n","import { execSync } from \"node:child_process\";\nimport { readdirSync, existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { CheckDef, HoldpointConfig } from \"@holdpoint/types\";\n\nexport interface StaleCheck {\n check: CheckDef;\n reason: string;\n /** Path to use in a file_exists condition, if it can be inferred from the when: regex */\n suggestedConditionPath?: string;\n}\n\n/** Named scopes handled by matchesWhen() — these are never \"stale\" (intentionally broad) */\nconst NAMED_SCOPES = new Set([\n \"frontend\",\n \"backend\",\n \"socket\",\n \"visual\",\n \"python\",\n \"go\",\n \"rust\",\n \"java\",\n \"ruby\",\n \"database\",\n \"prisma\",\n \"testing\",\n \"infra\",\n \"ci\",\n \"docs\",\n \"structural\",\n]);\n\nconst WALK_IGNORED = new Set([\n \"node_modules\",\n \".git\",\n \"dist\",\n \"build\",\n \".next\",\n \".turbo\",\n \"__pycache__\",\n \".venv\",\n \"venv\",\n \".mypy_cache\",\n \"target\",\n \".cache\",\n \"coverage\",\n]);\n\nfunction walkDir(dir: string, root: string, depth: number, maxDepth: number): string[] {\n if (depth > maxDepth) return [];\n let entries: string[] = [];\n try {\n entries = readdirSync(dir);\n } catch {\n return [];\n }\n const results: string[] = [];\n for (const entry of entries) {\n if (WALK_IGNORED.has(entry) || entry.startsWith(\".\")) continue;\n const full = join(dir, entry);\n const rel = full.slice(root.length + 1);\n results.push(rel);\n // Try to recurse (will just return [] if it's a file, not a dir)\n const children = walkDir(full, root, depth + 1, maxDepth);\n results.push(...children);\n }\n return results;\n}\n\n/**\n * Returns a list of all files in the repo (relative paths from cwd).\n * Uses `git ls-files` when available; falls back to directory walk.\n */\nexport function getRepoFiles(cwd: string): string[] {\n try {\n const out = execSync(\"git ls-files\", {\n cwd,\n encoding: \"utf8\",\n stdio: [\"pipe\", \"pipe\", \"ignore\"],\n });\n const files = out.trim().split(\"\\n\").filter(Boolean);\n if (files.length > 0) return files;\n } catch {\n // not a git repo or git not available\n }\n return walkDir(cwd, cwd, 0, 6);\n}\n\n/**\n * Try to extract a simple path hint from a regex pattern, for use as a\n * `file_exists` condition path.\n * e.g. \"^prisma/\" → \"prisma\", \"^checks\\\\.yaml$\" → \"checks.yaml\"\n */\nfunction extractPathFromRegex(pattern: string): string | undefined {\n const cleaned = pattern\n .replace(/^\\^/, \"\")\n .replace(/\\$$/, \"\")\n .replace(/\\\\\\./g, \".\")\n .replace(/\\(\\?:/g, \"\")\n .replace(/\\)/g, \"\")\n .replace(/[|*+?[\\]{}()]/g, \"\");\n const candidate = cleaned.replace(/\\/$/, \"\").trim();\n if (candidate.length > 0 && /^[\\w\\-./]+$/.test(candidate)) return candidate;\n return undefined;\n}\n\n/**\n * Detect checks whose `when:` regex pattern matches zero files in the repo.\n * Named scope whens (frontend, backend, structural, etc.) are never flagged as stale.\n * User-defined named patterns (from config.patterns) are resolved to their regex before checking.\n * Checks that already have a conditionId are skipped (already guarded).\n */\nexport function detectStaleChecks(config: HoldpointConfig, repoFiles: string[]): StaleCheck[] {\n const stale: StaleCheck[] = [];\n const userPatterns = config.patterns ?? {};\n\n for (const check of config.checks) {\n if (!check.when) continue;\n if (NAMED_SCOPES.has(check.when)) continue;\n if (check.conditionId) continue; // already guarded by a condition\n\n // Resolve user-defined named patterns to their regex value\n const patternAlias = check.when in userPatterns ? check.when : undefined;\n const regexStr = patternAlias ? userPatterns[patternAlias]! : check.when;\n\n let re: RegExp;\n try {\n re = new RegExp(regexStr);\n } catch {\n stale.push({ check, reason: `Invalid regex: '${regexStr}'` });\n continue;\n }\n\n const matches = repoFiles.filter((f) => re.test(f));\n if (matches.length === 0) {\n const label = patternAlias\n ? `Pattern '${patternAlias}' (= '${regexStr}')`\n : `Regex '${regexStr}'`;\n const suggestedConditionPath = extractPathFromRegex(regexStr);\n // Verify the suggested path doesn't actually exist either\n const pathGone =\n !suggestedConditionPath || !existsSync(join(process.cwd(), suggestedConditionPath));\n if (pathGone) {\n stale.push({\n check,\n reason: `${label} matches 0 files in the repo`,\n ...(suggestedConditionPath ? { suggestedConditionPath } : {}),\n });\n }\n }\n }\n\n return stale;\n}\n","import type { ConditionDef } from \"@holdpoint/types\";\nimport type { ProjectProfile } from \"./scanner.js\";\n\nexport interface EvolveTemplate {\n id: string;\n label: string;\n when?: string;\n cmd?: string;\n prompt?: string;\n conditionId?: string;\n /** Condition to add to checks.yaml alongside the check (only if conditionId is set) */\n condition?: Omit<ConditionDef, \"id\"> & { id: string };\n /** Returns true if this check is relevant to the given project profile */\n trigger: (p: ProjectProfile) => boolean;\n}\n\n/** Returns the correct run command for a package.json script, respecting the detected package manager. */\nfunction pmScript(profile: ProjectProfile, script: string, fallback: string): string {\n if (!profile.scripts[script]) return fallback;\n if (profile.packageManager === \"npm\") return `npm run ${script}`;\n return `${profile.packageManager} ${script}`;\n}\n\n/**\n * Returns all applicable check templates for the given project profile.\n * Caller should filter out templates whose IDs already exist in checks.yaml.\n */\nexport function getTemplates(profile: ProjectProfile): EvolveTemplate[] {\n return [\n // ── Universal checks (always proposed for any project) ──────────────────\n {\n id: \"git-commit\",\n label: \"Commit all changes before finishing\",\n cmd: 'git rev-parse --is-inside-work-tree 2>/dev/null || exit 0; [ -z \"$(git status --porcelain)\" ] && exit 0; git status --short; exit 1',\n trigger: () => true,\n },\n {\n id: \"changelog-update\",\n label: \"Add a CHANGELOG.md entry for this session\",\n prompt:\n \"Before committing, add an entry to CHANGELOG.md describing what was done. \" +\n \"Use Keep a Changelog format — add under ## [Unreleased] (create the file \" +\n \"and that section if absent). Group entries as Added, Changed, Fixed, or Removed. \" +\n \"Be concise but specific. The entry text will serve as the commit message.\",\n trigger: () => true,\n },\n {\n id: \"readme-sync\",\n label: \"Update README.md if user-facing changes were made\",\n prompt:\n \"If you added, changed, or removed user-facing functionality — CLI commands, \" +\n \"configuration options, public APIs, or significant new features — update \" +\n \"README.md to reflect those changes.\",\n trigger: () => true,\n },\n {\n id: \"no-todos\",\n label: \"No TODO/FIXME left in changed code\",\n prompt:\n \"Scan the files you changed for any TODO, FIXME, HACK, or XXX comments. \" +\n \"Either resolve them before finishing or convert them to GitHub issues. \" +\n \"Don't leave incomplete work silently behind.\",\n trigger: () => true,\n },\n\n // ── TypeScript / JavaScript ──────────────────────────────────────────────\n {\n id: \"typecheck\",\n label: \"TypeScript type check\",\n cmd: pmScript(profile, \"typecheck\", \"npx tsc --noEmit\"),\n trigger: (p) => p.hasTypeScript,\n },\n {\n id: \"lint\",\n label: \"Lint codebase\",\n cmd: profile.hasEslint\n ? pmScript(profile, \"lint\", \"npx eslint .\")\n : profile.hasBiome\n ? pmScript(profile, \"lint\", \"npx @biomejs/biome check .\")\n : pmScript(profile, \"lint\", \"echo 'No linter detected'\"),\n trigger: (p) => p.hasEslint || p.hasBiome,\n },\n {\n id: \"format-check\",\n label: \"Prettier — format check\",\n cmd: pmScript(profile, \"format:check\", \"npx prettier --check .\"),\n trigger: (p) => p.hasPrettier,\n },\n {\n id: \"test\",\n label: \"Unit tests\",\n cmd: profile.hasVitest\n ? pmScript(profile, \"test\", \"npx vitest run\")\n : pmScript(profile, \"test\", \"npx jest --passWithNoTests\"),\n trigger: (p) => p.hasVitest || p.hasJest,\n },\n {\n id: \"jsdoc\",\n label: \"JSDoc on changed public functions\",\n prompt:\n \"Ensure all changed public functions, classes, and module exports have \" +\n \"accurate JSDoc comments (description + @param + @returns where applicable).\",\n trigger: (p) => p.hasTypeScript || p.hasReact,\n },\n {\n id: \"build\",\n label: \"Production build passes\",\n cmd: pmScript(profile, \"build\", \"echo 'No build script detected'\"),\n trigger: (p) => Boolean(p.scripts[\"build\"]),\n },\n\n // ── Python ───────────────────────────────────────────────────────────────\n {\n id: \"python-lint\",\n label: \"Ruff — Python linting\",\n cmd: \"ruff check .\",\n when: \"python\",\n trigger: (p) => p.hasPython && p.hasRuff,\n },\n {\n id: \"python-test\",\n label: \"Pytest — Python unit tests\",\n cmd: \"pytest\",\n when: \"python\",\n trigger: (p) => p.hasPython && p.hasPytest,\n },\n\n // ── Go ───────────────────────────────────────────────────────────────────\n {\n id: \"go-test\",\n label: \"Go tests\",\n cmd: \"go test ./...\",\n when: \"go\",\n trigger: (p) => p.hasGo,\n },\n {\n id: \"go-vet\",\n label: \"Go vet\",\n cmd: \"go vet ./...\",\n when: \"go\",\n trigger: (p) => p.hasGo,\n },\n\n // ── Database ─────────────────────────────────────────────────────────────\n {\n id: \"db-migrations\",\n label: \"Database migration for schema changes\",\n when: \"database\",\n prompt:\n \"If schema or migration files changed, ensure the appropriate migration was \" +\n \"generated with your ORM tool (e.g. `prisma migrate dev`, `alembic revision`, \" +\n \"`rails db:migrate`) and committed alongside the schema change.\",\n trigger: (p) => p.hasPrisma || p.hasAlembic || p.hasMigrations || p.hasDrizzle,\n },\n {\n id: \"prisma-format\",\n label: \"Prisma schema format check\",\n when: \"prisma\",\n cmd: \"npx prisma format --check 2>/dev/null || npx prisma format\",\n conditionId: \"has-prisma\",\n condition: {\n id: \"has-prisma\",\n operator: \"file_exists\",\n path: \"prisma/schema.prisma\",\n },\n trigger: (p) => p.hasPrisma,\n },\n\n // ── OpenAPI ──────────────────────────────────────────────────────────────\n {\n id: \"openapi-sync\",\n label: \"OpenAPI spec updated for API changes\",\n when: \"backend\",\n conditionId: \"has-openapi\",\n condition: {\n id: \"has-openapi\",\n operator: \"file_exists\",\n path: \"openapi.yaml\",\n },\n prompt:\n \"If any API routes were added or changed, update openapi.yaml (or openapi.json) \" +\n \"to reflect the new endpoints, request/response shapes, and error codes.\",\n trigger: (p) => p.hasOpenApi,\n },\n\n // ── Infra ─────────────────────────────────────────────────────────────────\n {\n id: \"docker-build\",\n label: \"Docker build passes\",\n when: \"infra\",\n cmd: \"docker build . --quiet -t app:ci\",\n conditionId: \"has-dockerfile\",\n condition: {\n id: \"has-dockerfile\",\n operator: \"file_exists\",\n path: \"Dockerfile\",\n },\n trigger: (p) => p.hasDocker,\n },\n {\n id: \"terraform-validate\",\n label: \"Terraform validate\",\n when: \"infra\",\n cmd: \"terraform validate\",\n trigger: (p) => p.hasTerraform,\n },\n\n // ── Frontend ─────────────────────────────────────────────────────────────\n {\n id: \"i18n\",\n label: \"i18n — no hardcoded user-facing strings\",\n when: \"frontend\",\n prompt:\n \"Confirm all user-visible strings are wrapped in the project's i18n function \" +\n \"(e.g. `t()`, `useTranslation`, `<Trans>`) and that locale files are updated \" +\n \"for any new copy.\",\n trigger: (p) => p.hasNext && p.hasReact,\n },\n ];\n}\n","import { existsSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport chalk from \"chalk\";\nimport { identifyProject } from \"@holdpoint/live-daemon\";\nimport { ensureDaemon } from \"../lib/ensure-daemon.js\";\nimport { openBrowser } from \"../lib/open-browser.js\";\n\ninterface LiveCommandOptions {\n project?: string;\n}\n\nfunction findChecksYaml(startDir: string): string | null {\n let current = startDir;\n for (;;) {\n const candidate = join(current, \"checks.yaml\");\n if (existsSync(candidate)) {\n return candidate;\n }\n const parent = dirname(current);\n if (parent === current) {\n return null;\n }\n current = parent;\n }\n}\n\nfunction tryResolveCurrentProject(): { hash: string; name: string; root: string } | null {\n const checksYaml = findChecksYaml(process.cwd());\n if (checksYaml) {\n return identifyProject(dirname(checksYaml));\n }\n\n try {\n return identifyProject(process.cwd());\n } catch {\n return null;\n }\n}\n\nexport async function liveCommand(options: LiveCommandOptions = {}): Promise<void> {\n const { info, started } = await ensureDaemon();\n const baseUrl = new URL(`/__holdpoint/live-auth`, `http://127.0.0.1:${info.port}`);\n baseUrl.searchParams.set(\"token\", info.token);\n\n const currentProject = options.project ? null : tryResolveCurrentProject();\n if (options.project) {\n baseUrl.searchParams.set(\"project\", options.project);\n } else if (currentProject) {\n baseUrl.searchParams.set(\"project\", currentProject.hash);\n baseUrl.searchParams.set(\"name\", currentProject.name);\n baseUrl.searchParams.set(\"root\", currentProject.root);\n }\n\n openBrowser(baseUrl.toString());\n\n console.log(\n chalk.green(\n started ? \"✓ Started Holdpoint Live and opened the browser\" : \"✓ Opened Holdpoint Live\",\n ),\n );\n console.log(` url: ${chalk.cyan(baseUrl.toString())}`);\n}\n","import { spawn } from \"node:child_process\";\nimport { readHealthyDaemonLock, type DaemonLock } from \"@holdpoint/live-daemon\";\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolvePromise) => setTimeout(resolvePromise, ms));\n}\n\nexport async function ensureDaemon(timeoutMs = 5_000): Promise<{\n info: DaemonLock;\n started: boolean;\n}> {\n const existing = await readHealthyDaemonLock();\n if (existing) {\n return { info: existing, started: false };\n }\n\n const cliEntry = process.argv[1];\n if (!cliEntry) {\n throw new Error(\"Cannot determine the current holdpoint CLI entrypoint\");\n }\n const child = spawn(process.execPath, [cliEntry, \"daemon-serve\"], {\n stdio: \"ignore\",\n env: process.env,\n cwd: process.cwd(),\n });\n child.unref();\n\n const deadline = Date.now() + timeoutMs;\n while (Date.now() < deadline) {\n const lock = await readHealthyDaemonLock();\n if (lock) {\n return { info: lock, started: true };\n }\n await sleep(100);\n }\n\n throw new Error(\"Daemon unavailable + cannot spawn\");\n}\n","import { execSync } from \"node:child_process\";\n\nexport function openBrowser(url: string): void {\n const openCmd =\n process.platform === \"darwin\" ? \"open\" : process.platform === \"win32\" ? \"start\" : \"xdg-open\";\n\n try {\n execSync(`${openCmd} ${JSON.stringify(url)}`, { stdio: \"ignore\" });\n } catch {\n /* non-fatal */\n }\n}\n","import chalk from \"chalk\";\nimport {\n DaemonAlreadyRunningError,\n isProcessAlive,\n readDaemonLock,\n readHealthyDaemonLock,\n removeDaemonLock,\n startDaemonProcess,\n type DaemonLock,\n} from \"@holdpoint/live-daemon\";\nimport { ensureDaemon } from \"../lib/ensure-daemon.js\";\nimport { CLI_VERSION } from \"../version.js\";\n\nfunction formatUptime(lock: DaemonLock): string {\n const seconds = Math.max(0, Math.floor((Date.now() - lock.started_at) / 1000));\n const minutes = Math.floor(seconds / 60);\n const remainingSeconds = seconds % 60;\n return minutes > 0 ? `${minutes}m ${remainingSeconds}s` : `${remainingSeconds}s`;\n}\n\nasync function fetchSessionCount(lock: DaemonLock): Promise<number | null> {\n try {\n const response = await fetch(`http://127.0.0.1:${lock.port}/v1/sessions`, {\n headers: {\n authorization: `Bearer ${lock.token}`,\n },\n });\n if (!response.ok) return null;\n const parsed = (await response.json()) as { sessions?: unknown[] };\n return Array.isArray(parsed.sessions) ? parsed.sessions.length : null;\n } catch {\n return null;\n }\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolvePromise) => setTimeout(resolvePromise, ms));\n}\n\nexport async function daemonStartCommand(): Promise<void> {\n const { info, started } = await ensureDaemon();\n const sessionCount = await fetchSessionCount(info);\n const headline = started\n ? \"Started Holdpoint Live daemon\"\n : \"Reused existing Holdpoint Live daemon\";\n console.log(chalk.green(`✓ ${headline}`));\n console.log(` pid: ${chalk.cyan(String(info.pid))}`);\n console.log(` port: ${chalk.cyan(String(info.port))}`);\n console.log(` uptime: ${chalk.cyan(formatUptime(info))}`);\n if (sessionCount !== null) {\n console.log(` sessions: ${chalk.cyan(String(sessionCount))}`);\n }\n}\n\nexport async function daemonStatusCommand(): Promise<void> {\n const lock = await readHealthyDaemonLock();\n if (!lock) {\n console.log(chalk.yellow(\"Holdpoint Live daemon is not running.\"));\n return;\n }\n\n const sessionCount = await fetchSessionCount(lock);\n console.log(chalk.green(\"✓ Holdpoint Live daemon is running\"));\n console.log(` pid: ${chalk.cyan(String(lock.pid))}`);\n console.log(` port: ${chalk.cyan(String(lock.port))}`);\n console.log(` uptime: ${chalk.cyan(formatUptime(lock))}`);\n if (sessionCount !== null) {\n console.log(` sessions: ${chalk.cyan(String(sessionCount))}`);\n }\n}\n\nexport async function daemonStopCommand(): Promise<void> {\n const lock = readDaemonLock();\n if (!lock) {\n console.log(chalk.yellow(\"Holdpoint Live daemon is not running.\"));\n return;\n }\n\n if (!isProcessAlive(lock.pid)) {\n removeDaemonLock(undefined, lock.token);\n console.log(chalk.yellow(\"Removed stale Holdpoint Live lockfile.\"));\n return;\n }\n\n process.kill(lock.pid, \"SIGTERM\");\n const deadline = Date.now() + 5_000;\n while (Date.now() < deadline) {\n if (!isProcessAlive(lock.pid)) {\n removeDaemonLock(undefined, lock.token);\n console.log(chalk.green(`✓ Stopped Holdpoint Live daemon (${lock.pid})`));\n return;\n }\n await sleep(100);\n }\n\n process.kill(lock.pid, \"SIGKILL\");\n await sleep(100);\n removeDaemonLock(undefined, lock.token);\n console.log(chalk.green(`✓ Force-stopped Holdpoint Live daemon (${lock.pid})`));\n}\n\nexport async function daemonServeCommand(options: { port?: string }): Promise<void> {\n try {\n const daemon = await startDaemonProcess({\n version: CLI_VERSION,\n ...(options.port ? { port: Number(options.port) } : {}),\n });\n await daemon.closed;\n } catch (error) {\n if (error instanceof DaemonAlreadyRunningError) {\n process.exit(0);\n }\n throw error;\n }\n}\n","export const CLI_VERSION = \"0.1.0-alpha.15\";\n","import chalk from \"chalk\";\nimport { discoverLiveEngines } from \"../engines.js\";\n\nexport async function enginesCommand(options: { json?: boolean } = {}): Promise<void> {\n const engines = await discoverLiveEngines();\n\n if (options.json) {\n console.log(JSON.stringify(engines, null, 2));\n return;\n }\n\n if (engines.length === 0) {\n console.log(\"No Holdpoint live adapters were discovered.\");\n return;\n }\n\n for (const engine of engines) {\n if (engine.status === \"loaded\" && engine.manifest) {\n console.log(\n `${chalk.green(\"loaded\")} ${chalk.cyan(engine.manifest.id)} (${engine.manifest.displayName}) ` +\n `from ${chalk.yellow(engine.packageName)} [${engine.source}]`,\n );\n continue;\n }\n\n console.log(\n `${chalk.yellow(\"ignored\")} ${chalk.yellow(engine.packageName)} [${engine.source}] — ${engine.reason ?? \"unknown reason\"}`,\n );\n }\n}\n","import { existsSync, readFileSync } from \"node:fs\";\nimport { dirname, join, resolve, sep } from \"node:path\";\nimport { createRequire } from \"node:module\";\nimport { fileURLToPath, pathToFileURL } from \"node:url\";\nimport { parseEventV1 } from \"@holdpoint/live-protocol\";\nimport type { LiveCapabilities } from \"@holdpoint/live-protocol\";\nimport type { HoldpointEngineManifest, LiveAdapter } from \"@holdpoint/sdk\";\n\nconst require = createRequire(import.meta.url);\nconst CLI_SRC_DIR = dirname(fileURLToPath(import.meta.url));\nconst MONOREPO_ROOT = resolve(CLI_SRC_DIR, \"../../..\");\nconst BUILTIN_LIVE_ENGINE_PACKAGES = [\"@holdpoint/engine-claude\"] as const;\nconst HOLDPOINT_ENGINE_KEYWORD = \"holdpoint-engine\";\n\nexport type LiveEngineSource = \"built-in\" | \"dependency\";\n\nexport interface DiscoveredLiveEngine {\n packageName: string;\n source: LiveEngineSource;\n status: \"loaded\" | \"ignored\";\n reason?: string;\n manifest?: HoldpointEngineManifest;\n}\n\ninterface HoldpointPackageMetadata {\n manifest?: string;\n adapter?: string;\n}\n\ninterface ResolvedLiveEngine extends DiscoveredLiveEngine {\n packageRoot?: string;\n adapterPath?: string;\n}\n\nfunction isObject(value: unknown): value is Record<string, unknown> {\n return value != null && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction isExternalLiveEnginePackageName(packageName: string): boolean {\n return (\n /^holdpoint-engine-[a-z0-9-]+$/.test(packageName) ||\n /^@[a-z0-9_.-]+\\/holdpoint-engine-[a-z0-9-]+$/.test(packageName)\n );\n}\n\nfunction readJsonFile(path: string): Record<string, unknown> | null {\n if (!existsSync(path)) {\n return null;\n }\n try {\n const parsed = JSON.parse(readFileSync(path, \"utf8\"));\n return isObject(parsed) ? parsed : null;\n } catch {\n return null;\n }\n}\n\nfunction findNearestPackageRoot(startDir: string): string {\n let current = resolve(startDir);\n while (true) {\n if (existsSync(join(current, \"package.json\"))) {\n return current;\n }\n const parent = dirname(current);\n if (parent === current) {\n return resolve(startDir);\n }\n current = parent;\n }\n}\n\nfunction findPackageRootFromFile(path: string): string | null {\n let current = dirname(path);\n while (true) {\n if (existsSync(join(current, \"package.json\"))) {\n return current;\n }\n const parent = dirname(current);\n if (parent === current) {\n return null;\n }\n current = parent;\n }\n}\n\nfunction getDependencyEnginePackageNames(projectRoot: string): string[] {\n const packageJson = readJsonFile(join(projectRoot, \"package.json\"));\n if (!packageJson) {\n return [];\n }\n\n const packageNames = new Set<string>();\n for (const field of [\"dependencies\", \"devDependencies\", \"optionalDependencies\"]) {\n const deps = packageJson[field];\n if (!isObject(deps)) {\n continue;\n }\n for (const packageName of Object.keys(deps)) {\n if (isExternalLiveEnginePackageName(packageName)) {\n packageNames.add(packageName);\n }\n }\n }\n\n return [...packageNames];\n}\n\nfunction resolvePackageRoot(packageName: string, projectRoot: string): string | null {\n try {\n const entryPath = require.resolve(packageName);\n return findPackageRootFromFile(entryPath);\n } catch {\n // Fall through to project-local lookup for external adapters.\n }\n\n try {\n const entryPath = require.resolve(packageName, {\n paths: [projectRoot, process.cwd()],\n });\n return findPackageRootFromFile(entryPath);\n } catch {\n // Fall through to package.json lookup for packages without an exports entry.\n }\n\n try {\n const packageJsonPath = require.resolve(`${packageName}/package.json`, {\n paths: [projectRoot, process.cwd()],\n });\n return dirname(packageJsonPath);\n } catch {\n if (packageName.startsWith(\"@holdpoint/\")) {\n const scopedName = packageName.split(\"/\")[1];\n if (scopedName) {\n const packageDir = resolve(MONOREPO_ROOT, \"packages\", scopedName);\n if (existsSync(join(packageDir, \"package.json\"))) {\n return packageDir;\n }\n }\n }\n return null;\n }\n}\n\nfunction formatImportError(error: unknown): string {\n return error instanceof Error && error.message ? error.message : String(error);\n}\n\nfunction parseManifest(value: unknown): HoldpointEngineManifest | null {\n if (!isObject(value)) {\n return null;\n }\n if (value.manifestVersion !== 1) {\n return null;\n }\n if (typeof value.id !== \"string\" || !/^[a-z0-9-]+$/.test(value.id)) {\n return null;\n }\n if (typeof value.displayName !== \"string\" || !value.displayName.trim()) {\n return null;\n }\n return {\n manifestVersion: 1,\n id: value.id,\n displayName: value.displayName,\n };\n}\n\nfunction parseLiveCapabilities(value: unknown): LiveCapabilities | null {\n if (!isObject(value)) {\n return null;\n }\n\n const capabilities: LiveCapabilities = {};\n for (const key of [\n \"can_stream\",\n \"can_control\",\n \"can_modify_context\",\n \"can_register_tools\",\n \"control_online\",\n ] as const) {\n const entry = value[key];\n if (entry === undefined) {\n continue;\n }\n if (typeof entry !== \"boolean\") {\n return null;\n }\n capabilities[key] = entry;\n }\n\n return capabilities;\n}\n\nfunction parseLiveAdapter(value: unknown, manifest: HoldpointEngineManifest): LiveAdapter | null {\n if (!isObject(value)) {\n return null;\n }\n if (typeof value.id !== \"string\" || typeof value.displayName !== \"string\") {\n return null;\n }\n if (value.id !== manifest.id || value.displayName !== manifest.displayName) {\n return null;\n }\n const capabilities = parseLiveCapabilities(value.capabilities);\n if (!capabilities) {\n return null;\n }\n const generateBridgeCommand = value.generateBridgeCommand;\n if (typeof generateBridgeCommand !== \"function\") {\n return null;\n }\n const translateHookInput = value.translateHookInput;\n if (typeof translateHookInput !== \"function\") {\n return null;\n }\n return {\n id: value.id,\n displayName: value.displayName,\n capabilities,\n generateBridgeCommand: () => {\n const command = generateBridgeCommand();\n if (typeof command !== \"string\") {\n throw new Error(\"adapter.generateBridgeCommand() must return a string\");\n }\n return command;\n },\n translateHookInput: (raw, options) => {\n const event = translateHookInput(raw, options);\n return event == null ? null : parseEventV1(event);\n },\n };\n}\n\nasync function importModule(modulePath: string): Promise<Record<string, unknown>> {\n const moduleUrl = pathToFileURL(modulePath).href;\n return (await import(moduleUrl)) as Record<string, unknown>;\n}\n\nfunction resolvePackageAssetPath(packageRoot: string, relativePath: string): string {\n const declaredPath = resolve(packageRoot, relativePath);\n const sourceFallback = resolve(\n packageRoot,\n relativePath.replace(/^\\.\\/dist\\//, \"./src/\").replace(/\\.js$/, \".ts\"),\n );\n if (\n packageRoot.startsWith(resolve(MONOREPO_ROOT, \"packages\") + sep) &&\n existsSync(sourceFallback)\n ) {\n return sourceFallback;\n }\n if (existsSync(declaredPath)) {\n return declaredPath;\n }\n return sourceFallback;\n}\n\nasync function resolveCandidate(\n packageName: string,\n source: LiveEngineSource,\n projectRoot: string,\n): Promise<ResolvedLiveEngine> {\n const packageRoot = resolvePackageRoot(packageName, projectRoot);\n if (!packageRoot) {\n return {\n packageName,\n source,\n status: \"ignored\",\n reason: \"package could not be resolved from this project\",\n };\n }\n\n const packageJson = readJsonFile(join(packageRoot, \"package.json\"));\n if (!packageJson) {\n return {\n packageName,\n source,\n status: \"ignored\",\n reason: \"package.json could not be read\",\n };\n }\n\n const keywords = Array.isArray(packageJson.keywords) ? packageJson.keywords : [];\n if (!keywords.includes(HOLDPOINT_ENGINE_KEYWORD)) {\n return {\n packageName,\n source,\n status: \"ignored\",\n reason: `missing \\`${HOLDPOINT_ENGINE_KEYWORD}\\` keyword`,\n };\n }\n\n const metadata = isObject(packageJson.holdpoint)\n ? (packageJson.holdpoint as HoldpointPackageMetadata)\n : undefined;\n if (!metadata?.manifest) {\n return {\n packageName,\n source,\n status: \"ignored\",\n reason: \"missing `holdpoint.manifest` package.json field\",\n };\n }\n if (!metadata.adapter) {\n return {\n packageName,\n source,\n status: \"ignored\",\n reason: \"missing `holdpoint.adapter` package.json field\",\n };\n }\n\n const manifestPath = resolvePackageAssetPath(packageRoot, metadata.manifest);\n const adapterPath = resolvePackageAssetPath(packageRoot, metadata.adapter);\n if (!existsSync(manifestPath)) {\n return {\n packageName,\n source,\n status: \"ignored\",\n reason: \"manifest file does not exist\",\n };\n }\n if (!existsSync(adapterPath)) {\n return {\n packageName,\n source,\n status: \"ignored\",\n reason: \"adapter file does not exist\",\n };\n }\n\n try {\n const manifestModule = await importModule(manifestPath);\n const manifest = parseManifest(manifestModule.manifest);\n if (!manifest) {\n return {\n packageName,\n source,\n status: \"ignored\",\n reason: \"manifest export is invalid\",\n };\n }\n return {\n packageName,\n source,\n status: \"loaded\",\n manifest,\n packageRoot,\n adapterPath,\n };\n } catch (error) {\n return {\n packageName,\n source,\n status: \"ignored\",\n reason: `manifest import failed: ${formatImportError(error)}`,\n };\n }\n}\n\nasync function discoverLiveEnginesDetailed(options?: {\n cwd?: string;\n}): Promise<ResolvedLiveEngine[]> {\n const projectRoot = findNearestPackageRoot(options?.cwd ?? process.cwd());\n const dependencyPackages = getDependencyEnginePackageNames(projectRoot);\n const seenPackages = new Set<string>();\n const results: ResolvedLiveEngine[] = [];\n const loadedIds = new Set<string>();\n\n const candidates: Array<{ packageName: string; source: LiveEngineSource }> = [\n ...BUILTIN_LIVE_ENGINE_PACKAGES.map((packageName) => ({\n packageName,\n source: \"built-in\" as const,\n })),\n ...dependencyPackages.map((packageName) => ({ packageName, source: \"dependency\" as const })),\n ];\n\n for (const candidate of candidates) {\n if (seenPackages.has(candidate.packageName)) {\n continue;\n }\n seenPackages.add(candidate.packageName);\n const result = await resolveCandidate(candidate.packageName, candidate.source, projectRoot);\n if (result.status === \"loaded\" && result.manifest) {\n if (loadedIds.has(result.manifest.id)) {\n results.push({\n packageName: result.packageName,\n source: result.source,\n status: \"ignored\",\n reason: `engine id \\`${result.manifest.id}\\` collides with an already loaded adapter`,\n manifest: result.manifest,\n });\n continue;\n }\n loadedIds.add(result.manifest.id);\n }\n results.push(result);\n }\n\n return results;\n}\n\nexport async function discoverLiveEngines(options?: {\n cwd?: string;\n}): Promise<DiscoveredLiveEngine[]> {\n const results = await discoverLiveEnginesDetailed(options);\n return results.map(({ packageName, source, status, reason, manifest }) => ({\n packageName,\n source,\n status,\n ...(reason ? { reason } : {}),\n ...(manifest ? { manifest } : {}),\n }));\n}\n\nexport async function loadLiveAdapter(\n engineId: string,\n options?: { cwd?: string },\n): Promise<LiveAdapter | null> {\n const results = await discoverLiveEnginesDetailed(options);\n const match = results.find(\n (result) => result.status === \"loaded\" && result.manifest?.id === engineId,\n );\n if (!match?.adapterPath || !match.manifest) {\n return null;\n }\n\n try {\n const adapterModule = await importModule(match.adapterPath);\n return parseLiveAdapter(adapterModule.adapter, match.manifest);\n } catch {\n return null;\n }\n}\n","import { readFileSync } from \"node:fs\";\nimport { parseEventV1, parseEventsBatch } from \"@holdpoint/live-protocol\";\nimport { BridgeClient } from \"@holdpoint/sdk\";\nimport { loadLiveAdapter } from \"../engines.js\";\n\nfunction readStdin(): string {\n return readFileSync(0, \"utf8\");\n}\n\nexport async function eventCommand(options: {\n engine?: string;\n fromHook?: boolean;\n}): Promise<void> {\n const stdin = readStdin().trim();\n if (!stdin) {\n if (options.fromHook) {\n process.exit(0);\n }\n console.error(\"No JSON input received on stdin.\");\n process.exit(3);\n }\n\n let raw: unknown;\n try {\n raw = JSON.parse(stdin);\n } catch {\n if (options.fromHook) {\n process.exit(0);\n }\n console.error(\"Invalid JSON input.\");\n process.exit(3);\n }\n\n const client = new BridgeClient();\n\n try {\n if (options.fromHook) {\n if (!options.engine) {\n process.exit(0);\n }\n const adapter = await loadLiveAdapter(options.engine);\n if (!adapter) {\n process.exit(0);\n }\n const event = adapter.translateHookInput(raw, { cwd: process.cwd() });\n if (!event) {\n process.exit(0);\n }\n await client.sendEvent(event);\n process.exit(0);\n }\n\n if (Array.isArray(raw)) {\n await client.sendEvents(parseEventsBatch(raw));\n } else {\n await client.sendEvent(parseEventV1(raw));\n }\n } catch (error) {\n console.error((error as Error).message);\n process.exit(3);\n }\n}\n"],"mappings":"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","names":["existsSync","readFileSync","writeFileSync","join","dirname","fileURLToPath","existsSync","__dirname","dirname","fileURLToPath","join","existsSync","readFileSync","writeFileSync","existsSync","readFileSync","writeFileSync","mkdirSync","join","chalk","ora","parseHoldpointYaml","execSync","existsSync","readFileSync","chalk","parseHoldpointYaml","existsSync","readFileSync","writeFileSync","mkdirSync","chalk","ora","parseHoldpointYaml","buildConfigJson","buildEngine","buildClaudeEngineJson","buildCursorEngine","buildCodexConfigToml","buildCodexHooksJson","buildCodexCheckScript","spliceAgentsMd","MINIMAL_PREREQUISITES","existsSync","chalk","ora","parseHoldpointYaml","readFileSync","mkdirSync","writeFileSync","buildConfigJson","buildEngine","buildClaudeEngineJson","buildCursorEngine","buildCodexHooksJson","buildCodexCheckScript","buildCodexConfigToml","existing","spliceAgentsMd","existsSync","join","dirname","fileURLToPath","execSync","chalk","__dirname","resolve","existsSync","readFileSync","writeFileSync","execSync","chalk","ora","parseHoldpointYaml","existsSync","readFileSync","join","execSync","existsSync","join","execSync","readdirSync","existsSync","join","existsSync","chalk","ora","readFileSync","parseHoldpointYaml","writeFileSync","execSync","existsSync","dirname","join","chalk","identifyProject","execSync","join","existsSync","dirname","identifyProject","chalk","chalk","readHealthyDaemonLock","sleep","chalk","readHealthyDaemonLock","daemon","chalk","existsSync","readFileSync","dirname","join","fileURLToPath","require","chalk","readFileSync","parseEventV1","BridgeClient","readFileSync","BridgeClient","parseEventV1"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/commands/init.ts","../src/detect.ts","../src/templates.ts","../src/lib/preflight.ts","../src/claude-settings.ts","../src/cursor-hooks.ts","../src/lib/instructions-breadcrumb.ts","../src/commands/check.ts","../src/commands/validate.ts","../src/commands/update.ts","../src/commands/build.ts","../src/lib/ensure-daemon.ts","../src/lib/open-browser.ts","../src/lib/project.ts","../src/commands/evolve.ts","../src/evolve/scanner.ts","../src/evolve/dead-checker.ts","../src/evolve/templates.ts","../src/commands/live.ts","../src/commands/daemon.ts","../src/version.ts","../src/commands/engines.ts","../src/engines.ts","../src/commands/event.ts","../src/commands/changeset.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport { initCommand } from \"./commands/init.js\";\nimport { checkCommand } from \"./commands/check.js\";\nimport { validateCommand } from \"./commands/validate.js\";\nimport { updateCommand } from \"./commands/update.js\";\nimport { buildCommand } from \"./commands/build.js\";\nimport { evolveCommand } from \"./commands/evolve.js\";\nimport { liveCommand } from \"./commands/live.js\";\nimport {\n daemonServeCommand,\n daemonStartCommand,\n daemonStatusCommand,\n daemonStopCommand,\n} from \"./commands/daemon.js\";\nimport { enginesCommand } from \"./commands/engines.js\";\nimport { eventCommand } from \"./commands/event.js\";\nimport { requireChangesetCommand } from \"./commands/changeset.js\";\nimport { CLI_VERSION } from \"./version.js\";\n\nconst program = new Command();\n\nprogram\n .name(\"holdpoint\")\n .description(\"Universal eval-guard for AI coding agents (alpha)\")\n .version(CLI_VERSION);\n\n// Bare `holdpoint` (no subcommand) prints help. Earlier alphas auto-launched\n// Holdpoint Live here, which surprised users and broke scripts that\n// accidentally invoked the binary. Use `holdpoint live` for the browser UI.\nprogram.action(() => {\n program.outputHelp();\n});\n\nprogram\n .command(\"init\")\n .description(\"Initialise Holdpoint in the current project\")\n .option(\n \"--agent <agent>\",\n \"Agent to install for: copilot | claude | cursor | codex (default: all four)\",\n )\n .action(initCommand);\n\nprogram\n .command(\"check\")\n .description(\"Run task checks from checks.yaml\")\n .option(\"--staged\", \"Only check against git-staged files\")\n .action(checkCommand);\n\nprogram\n .command(\"validate\")\n .description(\"Validate checks.yaml schema and print any errors\")\n .action(validateCommand);\n\nprogram\n .command(\"update\")\n .description(\"Regenerate engine files from current checks.yaml (preserves checks.yaml)\")\n .action(updateCommand);\n\nprogram\n .command(\"builder\")\n .description(\"Open the visual builder UI in the Holdpoint daemon\")\n .action(buildCommand);\n\nprogram\n .command(\"live\")\n .description(\"Open the Holdpoint Live UI\")\n .option(\"--project <project>\", \"Open the UI focused on a specific project hash\")\n .action(liveCommand);\n\nconst daemon = program.command(\"daemon\").description(\"Manage the Holdpoint Live daemon\");\n\ndaemon\n .command(\"start\")\n .description(\"Start or connect to the singleton Holdpoint Live daemon\")\n .action(daemonStartCommand);\n\ndaemon\n .command(\"status\")\n .description(\"Show Holdpoint Live daemon status\")\n .action(daemonStatusCommand);\n\ndaemon\n .command(\"stop\")\n .description(\"Stop the running Holdpoint Live daemon\")\n .action(daemonStopCommand);\n\nprogram\n .command(\"event\")\n .description(\"Internal: read event JSON from stdin and publish it to Holdpoint Live\")\n .option(\"--engine <engine>\", \"Engine name when converting native hook payloads\")\n .option(\"--from-hook\", \"Interpret stdin as an engine-native hook payload\")\n .action(eventCommand);\n\nprogram\n .command(\"engines\")\n .description(\"List discovered Holdpoint Live engine packages\")\n .option(\"--json\", \"Print machine-readable discovery output\")\n .action(enginesCommand);\n\nprogram\n .command(\"require-changeset\")\n .description(\"Ensure release-affecting package changes include a changeset\")\n .option(\"--staged\", \"Prefer git-staged files when deciding what changed\")\n .option(\n \"--include <pattern...>\",\n \"Package directory glob(s) to enforce, e.g. packages/* apps/builder\",\n )\n .action(requireChangesetCommand);\n\nprogram\n .command(\"daemon-serve\")\n .description(\"Internal: run the Holdpoint Live daemon in the foreground\")\n .option(\"--port <port>\", \"Fixed port for the daemon process\")\n .action(daemonServeCommand);\n\nprogram\n .command(\"suggest\")\n .description(\"Scan project and propose (or apply) new checks to keep checks.yaml in sync\")\n .option(\"--apply\", \"Write proposed changes to checks.yaml and regenerate engine files\")\n .action(evolveCommand);\n\n// `evolve` is the pre-alpha.17 name for `suggest`. Kept as a hidden alias\n// for one or two alpha bumps so existing scripts don't break overnight;\n// prints a deprecation notice to stderr and then delegates. Drop before 1.0.\nprogram\n .command(\"evolve\", { hidden: true })\n .description(\"Deprecated alias for `holdpoint suggest`\")\n .option(\"--apply\", \"Write proposed changes to checks.yaml and regenerate engine files\")\n .action(async (options: { apply?: boolean }) => {\n process.stderr.write(\n \"warning: `holdpoint evolve` is deprecated; use `holdpoint suggest` instead.\\n\",\n );\n await evolveCommand(options);\n });\n\nprogram.parse();\n","import { execSync } from \"node:child_process\";\nimport { existsSync, readFileSync, writeFileSync, mkdirSync } from \"node:fs\";\nimport { join, dirname } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport chalk from \"chalk\";\nimport ora from \"ora\";\nimport { buildConfigJson, buildEngine } from \"@holdpoint/engine-copilot\";\nimport { buildEngineJson as buildClaudeEngineJson } from \"@holdpoint/engine-claude\";\nimport {\n buildCheckScript as buildCursorCheckScript,\n buildEngine as buildCursorEngine,\n buildHooksJson as buildCursorHooksJson,\n} from \"@holdpoint/engine-cursor\";\nimport {\n buildConfigToml as buildCodexConfigToml,\n buildHooksJson as buildCodexHooksJson,\n buildCheckScript as buildCodexCheckScript,\n} from \"@holdpoint/engine-codex\";\nimport { parseHoldpointYaml } from \"@holdpoint/yaml-core\";\nimport type { AgentType } from \"@holdpoint/types\";\nimport { detectPackageManager, type PackageManager } from \"../detect.js\";\nimport { ensureBundledFile } from \"../templates.js\";\nimport { runPreflight, printPreflight } from \"../lib/preflight.js\";\nimport { mergeClaudeSettings } from \"../claude-settings.js\";\nimport { mergeCursorHooks } from \"../cursor-hooks.js\";\nimport { spliceBreadcrumb } from \"../lib/instructions-breadcrumb.js\";\n\nconst __dirname = dirname(fileURLToPath(import.meta.url));\n\nfunction getDefaultTemplatePath(): string {\n const candidates = [\n join(__dirname, \"templates\", \"default.yaml\"), // dist/templates/ (published package)\n join(__dirname, \"../../../templates\", \"default.yaml\"), // monorepo dev fallback\n join(process.cwd(), \"templates\", \"default.yaml\"), // cwd fallback\n ];\n for (const p of candidates) {\n if (existsSync(p)) return p;\n }\n return \"\";\n}\n\nconst MINIMAL_CHECKS_YAML = `version: 1\ncontext:\n guides: {}\nconditions: []\nchecks:\n - id: lint\n label: \"Lint codebase\"\n cmd: \"echo 'Add your lint command here'\"\n\n - id: jsdoc\n label: \"JSDoc on changed public functions\"\n prompt: \"Ensure all changed public functions and exports have JSDoc comments.\"\n`;\n\nconst MINIMAL_MASTER_PROMPT = `# Holdpoint\n\nRun \\`holdpoint check\\` before marking any task complete.\nSee \\`checks.yaml\\` for the full list of checks.\n`;\n\nconst MINIMAL_HOLDPOINT_REFERENCE = `# Holdpoint reference\n\nRead \\`MASTER_PROMPT.md\\` first for the mandatory workflow, then use this file for deeper project-specific Holdpoint notes.\n`;\n\nconst MINIMAL_PREREQUISITES = `# Holdpoint prerequisites\n\nHoldpoint installed repo-local engine integrations for one or more AI coding agents. Before relying on them locally, review these setup notes:\n\n- **GitHub Copilot CLI** — Holdpoint's \\`.github/extensions/holdpoint/extension.mjs\\` uses the Copilot CLI **EXTENSIONS** feature. Today that feature is gated behind experimental mode. In Copilot CLI, run \\`/experimental on\\` so **EXTENSIONS** appears in the enabled feature set before using Holdpoint locally.\n- **Cursor** — project-level hooks run in trusted workspaces. After opening the repo in Cursor, confirm the workspace is trusted and review Settings → Hooks if hooks do not fire.\n- **OpenAI Codex** — project-level hooks require trust approval. Run \\`codex trust\\` in the Codex TUI or review the hook with \\`/hooks\\`.\n- **General** — Holdpoint expects Node.js 18+ and a git repository so \\`holdpoint init\\`, \\`holdpoint update\\`, and \\`holdpoint check\\` can run normally.\n\nDocs: https://holdpoint.dev/docs\n`;\n\n/**\n * Initialise Holdpoint in the current project.\n *\n * Writes `checks.yaml` (from the unified default template), `checks.immutable.json`,\n * engine files for each target agent (Copilot, Claude, Cursor, Codex),\n * and repo-local handoff docs such as `HOLDPOINT_PREREQUISITES.md`.\n * Defaults to installing all four agents; pass `--agent` to restrict to one.\n */\nexport async function initCommand(options: { agent?: string }): Promise<void> {\n const spinner = ora(\"Initialising Holdpoint…\").start();\n\n // Default: install for all agents. Pass --agent=copilot|claude|cursor to restrict.\n const agentOpt = options.agent;\n const agents: AgentType[] =\n !agentOpt || agentOpt === \"all\"\n ? [\"copilot\", \"claude\", \"cursor\", \"codex\"]\n : [agentOpt as AgentType];\n\n spinner.text = `Installing for: ${chalk.cyan(agents.join(\", \"))}`;\n\n // Detect package manager once — used both for template substitution and devDep install.\n const pm = detectPackageManager();\n\n // 1. Read or create checks.yaml\n let yamlContent = MINIMAL_CHECKS_YAML;\n if (!existsSync(\"checks.yaml\")) {\n const templatePath = getDefaultTemplatePath();\n if (templatePath) {\n yamlContent = readFileSync(templatePath, \"utf8\");\n }\n // Substitute the package manager so checks use the right runner (npm/yarn/pnpm).\n if (pm !== \"pnpm\") {\n yamlContent = yamlContent.replace(/\\bpnpm\\b/g, pm);\n }\n writeFileSync(\"checks.yaml\", yamlContent, \"utf8\");\n } else {\n yamlContent = readFileSync(\"checks.yaml\", \"utf8\");\n }\n\n const config = parseHoldpointYaml(yamlContent);\n\n // 2. Write checks.immutable.json — read by holdpoint-check.mjs at runtime\n const generatedDir = \".github/holdpoint/generated\";\n mkdirSync(generatedDir, { recursive: true });\n writeFileSync(`${generatedDir}/checks.immutable.json`, buildConfigJson(config), \"utf8\");\n\n // 3. Install engine files for each target agent\n if (agents.includes(\"copilot\")) {\n // extension.mjs handles both session context injection (onSessionStart) and\n // check enforcement (onPreToolUse → task_complete). No separate hooks files needed.\n const extDir = \".github/extensions/holdpoint\";\n mkdirSync(extDir, { recursive: true });\n writeFileSync(join(extDir, \"extension.mjs\"), buildEngine(config), \"utf8\");\n spliceBreadcrumb(\".github/copilot-instructions.md\");\n }\n\n if (agents.includes(\"claude\")) {\n mkdirSync(\".claude\", { recursive: true });\n const settingsPath = \".claude/settings.json\";\n let existing: Record<string, unknown> = {};\n if (existsSync(settingsPath)) {\n try {\n existing = JSON.parse(readFileSync(settingsPath, \"utf8\")) as Record<string, unknown>;\n } catch {\n /* ignore */\n }\n }\n const holdpointHooks = JSON.parse(buildClaudeEngineJson(config)) as Record<string, unknown>;\n writeFileSync(\n settingsPath,\n JSON.stringify(mergeClaudeSettings(existing, holdpointHooks), null, 2),\n \"utf8\",\n );\n spliceBreadcrumb(\"CLAUDE.md\");\n }\n\n if (agents.includes(\"cursor\")) {\n mkdirSync(\".cursor\", { recursive: true });\n const cursorHooksPath = \".cursor/hooks.json\";\n let existingHooks: Record<string, unknown> = {};\n if (existsSync(cursorHooksPath)) {\n try {\n existingHooks = JSON.parse(readFileSync(cursorHooksPath, \"utf8\")) as Record<\n string,\n unknown\n >;\n } catch {\n /* ignore */\n }\n }\n const cursorHooks = JSON.parse(buildCursorHooksJson(config)) as Record<string, unknown>;\n writeFileSync(\n cursorHooksPath,\n JSON.stringify(mergeCursorHooks(existingHooks, cursorHooks), null, 2) + \"\\n\",\n \"utf8\",\n );\n writeFileSync(\".cursor/holdpoint-hook.mjs\", buildCursorCheckScript(), \"utf8\");\n\n const cursorRules = buildCursorEngine(config);\n const cursorPath = \".cursorrules\";\n if (existsSync(cursorPath)) {\n const existing = readFileSync(cursorPath, \"utf8\");\n if (!existing.includes(\"Holdpoint Rules\")) {\n writeFileSync(cursorPath, `${existing.trimEnd()}\\n\\n${cursorRules}`, \"utf8\");\n }\n } else {\n writeFileSync(cursorPath, cursorRules, \"utf8\");\n }\n spliceBreadcrumb(\".cursor/rules/holdpoint.md\");\n }\n\n if (agents.includes(\"codex\")) {\n mkdirSync(\".codex\", { recursive: true });\n writeFileSync(\".codex/hooks.json\", buildCodexHooksJson(config), \"utf8\");\n writeFileSync(\".codex/holdpoint-check.mjs\", buildCodexCheckScript(config), \"utf8\");\n writeFileSync(\".codex/config.toml\", buildCodexConfigToml(), \"utf8\");\n spliceBreadcrumb(\"AGENTS.md\");\n }\n\n // 4. Create repo-local guidance files if not present\n ensureBundledFile(\"MASTER_PROMPT.md\", \"MASTER_PROMPT.md\", MINIMAL_MASTER_PROMPT);\n ensureBundledFile(\n \"HOLDPOINT_REFERENCE.md\",\n \"HOLDPOINT_REFERENCE.md\",\n MINIMAL_HOLDPOINT_REFERENCE,\n );\n ensureBundledFile(\n \"HOLDPOINT_PREREQUISITES.md\",\n \"HOLDPOINT_PREREQUISITES.md\",\n MINIMAL_PREREQUISITES,\n );\n\n // Install holdpoint as a devDependency so hooks resolve via node_modules/.bin\n // rather than downloading on every hook fire via npx.\n spinner.text = \"Installing holdpoint as a devDependency…\";\n const installCmds: Record<PackageManager, string> = {\n pnpm: \"pnpm add -D holdpoint@alpha\",\n yarn: \"yarn add --dev holdpoint@alpha\",\n npm: \"npm install --save-dev holdpoint@alpha\",\n };\n const installCmd = installCmds[pm];\n try {\n execSync(installCmd, { stdio: \"pipe\" });\n spinner.succeed(chalk.bold.green(\"Holdpoint initialised!\"));\n } catch {\n spinner.warn(\n chalk.yellow(`Holdpoint initialised, but could not install the package automatically.`) +\n `\\n Run manually: ${chalk.yellow(installCmd)}`,\n );\n }\n\n // Per-agent preflight: surface the Copilot `/experimental on` step and Codex\n // `codex trust` step at install time.\n // instead of burying them in HOLDPOINT_PREREQUISITES.md where users\n // routinely miss them.\n const preflight = runPreflight(agents);\n printPreflight(preflight);\n\n console.log(`\n${chalk.cyan(\"Next steps:\")}\n 1. Edit ${chalk.yellow(\"checks.yaml\")} to customise your eval checkpoints\n 2. Address any ${chalk.yellow(\"→\")} items above (full notes in ${chalk.yellow(\"HOLDPOINT_PREREQUISITES.md\")})\n 3. Commit ${chalk.yellow(\"checks.yaml\")}, ${chalk.yellow(\"HOLDPOINT_PREREQUISITES.md\")}, and the generated engine files\n 4. Run ${chalk.yellow(\"holdpoint check\")} at any time to validate\n\n Visual builder: ${chalk.yellow(\"holdpoint builder\")} (opens the daemon at /builder)\n Agents: ${chalk.cyan(agents.join(\", \"))}\n`);\n}\n","import { existsSync, readFileSync } from \"node:fs\";\nimport type { AgentType } from \"@holdpoint/types\";\n\nexport type PackageManager = \"pnpm\" | \"yarn\" | \"npm\";\n\n/** Detect which package manager owns the current project by checking lock files. */\nexport function detectPackageManager(): PackageManager {\n if (existsSync(\"pnpm-lock.yaml\")) return \"pnpm\";\n if (existsSync(\"yarn.lock\")) return \"yarn\";\n return \"npm\";\n}\n\n/** @deprecated Use detectInstalledAgents() — single-agent detection is no longer the default. */\nexport function detectAgent(): AgentType {\n if (existsSync(\".github/extensions\")) return \"copilot\";\n if (existsSync(\".claude\")) return \"claude\";\n if (existsSync(\".cursor/hooks.json\")) return \"cursor\";\n if (existsSync(\".cursorrules\")) return \"cursor\";\n if (existsSync(\".codex\")) return \"codex\";\n return \"unknown\";\n}\n\n/**\n * Returns every agent whose Holdpoint engine files are already present in the\n * current working directory. Used by `holdpoint update` so it regenerates only\n * the engines that were previously installed.\n */\nexport function detectInstalledAgents(): AgentType[] {\n const agents: AgentType[] = [];\n if (existsSync(\".github/extensions/holdpoint/extension.mjs\")) agents.push(\"copilot\");\n if (existsSync(\".claude/settings.json\")) agents.push(\"claude\");\n if (existsSync(\".cursor/hooks.json\")) {\n try {\n if (readFileSync(\".cursor/hooks.json\", \"utf8\").includes(\"HOLDPOINT_MANAGED=cursor\")) {\n agents.push(\"cursor\");\n }\n } catch {\n /* ignore unreadable file */\n }\n }\n if (existsSync(\".cursorrules\")) {\n try {\n if (\n !agents.includes(\"cursor\") &&\n readFileSync(\".cursorrules\", \"utf8\").includes(\"Holdpoint Rules\")\n ) {\n agents.push(\"cursor\");\n }\n } catch {\n /* ignore unreadable file */\n }\n }\n // Detect Codex by the generated check script (more specific than .codex/ existence)\n if (existsSync(\".codex/holdpoint-check.mjs\")) agents.push(\"codex\");\n return agents;\n}\n","import { copyFileSync, existsSync, writeFileSync } from \"node:fs\";\nimport { join, dirname } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nconst __dirname = dirname(fileURLToPath(import.meta.url));\n\nexport function getBundledTemplatePath(filename: string): string {\n const candidates = [\n join(__dirname, \"templates\", filename), // dist/templates/ (published package)\n join(__dirname, \"../../../templates\", filename), // monorepo dev fallback\n join(process.cwd(), \"templates\", filename), // cwd fallback\n ];\n for (const candidate of candidates) {\n if (existsSync(candidate)) return candidate;\n }\n return \"\";\n}\n\nexport function ensureBundledFile(\n outputPath: string,\n templateFilename: string,\n fallbackContent: string,\n): boolean {\n if (existsSync(outputPath)) {\n return false;\n }\n\n const templatePath = getBundledTemplatePath(templateFilename);\n if (templatePath) {\n copyFileSync(templatePath, outputPath);\n } else {\n writeFileSync(outputPath, fallbackContent, \"utf8\");\n }\n\n return true;\n}\n","import { execSync } from \"node:child_process\";\nimport chalk from \"chalk\";\nimport type { AgentType } from \"@holdpoint/types\";\n\n/**\n * Result of a single preflight check for one agent.\n *\n * - `ok`: the agent's toolchain is detected and ready to use.\n * - `action_required`: we can be specific about something the user must do\n * (install a tool, enable a feature, approve a hook) — `command` is set.\n * - `unknown`: detection failed but we can't be sure what the user needs.\n */\nexport type PreflightStatus = \"ok\" | \"action_required\" | \"unknown\";\n\nexport interface PreflightResult {\n agent: AgentType;\n status: PreflightStatus;\n /** One-line human-readable summary, no trailing newline. */\n message: string;\n /** When `action_required`, the exact command the user should run next. */\n command?: string;\n /** When set, points at HOLDPOINT_PREREQUISITES.md or external docs. */\n docs?: string;\n}\n\n/**\n * Run silently — used for tool detection where we expect failure to be common\n * and don't want stderr bleeding into the init spinner output.\n */\nfunction silentExec(cmd: string): { ok: boolean; stdout: string } {\n try {\n const stdout = execSync(cmd, { stdio: [\"ignore\", \"pipe\", \"ignore\"] }).toString();\n return { ok: true, stdout };\n } catch {\n return { ok: false, stdout: \"\" };\n }\n}\n\n/**\n * Copilot CLI preflight.\n *\n * We can detect `gh` and the `gh-copilot` extension reliably, but the\n * `/experimental on` requirement is runtime state inside the Copilot CLI\n * session itself — there's no clean filesystem signal. So we always remind\n * users to enable it, even when everything else looks healthy.\n */\nfunction checkCopilot(): PreflightResult {\n const gh = silentExec(\"gh --version\");\n if (!gh.ok) {\n return {\n agent: \"copilot\",\n status: \"action_required\",\n message: \"GitHub CLI not found on PATH\",\n command: \"brew install gh # or: https://cli.github.com/\",\n };\n }\n\n // `gh copilot --version` exits non-zero if the extension isn't installed.\n const copilot = silentExec(\"gh copilot --version\");\n if (!copilot.ok) {\n return {\n agent: \"copilot\",\n status: \"action_required\",\n message: \"Copilot CLI extension not installed\",\n command: \"gh extension install github/gh-copilot\",\n };\n }\n\n return {\n agent: \"copilot\",\n status: \"action_required\",\n message: \"Copilot CLI detected — experimental mode required for EXTENSIONS\",\n command: \"Inside Copilot CLI, run: /experimental on\",\n };\n}\n\n/**\n * Claude Code preflight. Settings live at `.claude/settings.json`, which we\n * write ourselves during init, so the only failure mode is the binary\n * missing from PATH (in which case the user still wants the settings file\n * written — they may be invoking Claude Code from a different machine).\n */\nfunction checkClaude(): PreflightResult {\n const claude = silentExec(\"claude --version\");\n if (!claude.ok) {\n return {\n agent: \"claude\",\n status: \"unknown\",\n message: \"Claude Code binary not on PATH (hooks still written for when it is)\",\n };\n }\n return {\n agent: \"claude\",\n status: \"ok\",\n message: \"Claude Code detected — hooks installed at .claude/settings.json\",\n };\n}\n\n/**\n * Cursor preflight. Project `.cursor/hooks.json` hooks run only in trusted\n * workspaces, which is runtime state inside Cursor and not reliably readable\n * from disk, so init prints the trust/debugging reminder every time.\n */\nfunction checkCursor(): PreflightResult {\n return {\n agent: \"cursor\",\n status: \"ok\",\n message: \"Cursor — .cursor/hooks.json gate + .cursor/rules breadcrumb installed\",\n docs: \"https://holdpoint.dev/docs#cursor\",\n };\n}\n\n/**\n * Codex preflight. Project-level hooks require trust approval inside the\n * Codex TUI, which is runtime state we can't read from disk reliably across\n * Codex versions — so this mirrors the Copilot pattern: detect the binary,\n * always remind the user about `codex trust`.\n */\nfunction checkCodex(): PreflightResult {\n const codex = silentExec(\"codex --version\");\n if (!codex.ok) {\n return {\n agent: \"codex\",\n status: \"action_required\",\n message: \"Codex CLI not found on PATH\",\n command: \"Install Codex: https://github.com/openai/codex\",\n };\n }\n return {\n agent: \"codex\",\n status: \"action_required\",\n message: \"Codex detected — project-level hooks require trust approval\",\n command: \"In the Codex TUI: codex trust (or /hooks to review)\",\n };\n}\n\n// `AgentType` includes \"unknown\" for the stack-detection fallback path, but\n// only the four real agents have a preflight to run. `Partial` keeps this\n// honest instead of forcing a no-op stub.\nconst CHECKS: Partial<Record<AgentType, () => PreflightResult>> = {\n copilot: checkCopilot,\n claude: checkClaude,\n cursor: checkCursor,\n codex: checkCodex,\n};\n\n/**\n * Run preflight for the given agents and return results in input order.\n * Agents without a registered check are silently skipped — the caller's\n * agent list is the source of truth.\n *\n * Intentionally pure apart from `execSync` so callers can decide whether\n * to print, summarise, or fail-fast on the results.\n */\nexport function runPreflight(agents: readonly AgentType[]): PreflightResult[] {\n return agents.flatMap((agent) => {\n const check = CHECKS[agent];\n return check ? [check()] : [];\n });\n}\n\n/**\n * Pretty-print preflight results to stdout in the style used by `holdpoint init`.\n * Always groups by status so action items don't get lost between OKs.\n */\nexport function printPreflight(results: readonly PreflightResult[]): void {\n if (results.length === 0) return;\n\n const ok = results.filter((r) => r.status === \"ok\");\n const unknown = results.filter((r) => r.status === \"unknown\");\n const action = results.filter((r) => r.status === \"action_required\");\n\n console.log(\"\");\n console.log(chalk.bold(\"Agent preflight:\"));\n\n for (const r of ok) {\n console.log(` ${chalk.green(\"✓\")} ${r.agent.padEnd(7)} ${chalk.dim(r.message)}`);\n }\n for (const r of unknown) {\n console.log(` ${chalk.dim(\"?\")} ${r.agent.padEnd(7)} ${chalk.dim(r.message)}`);\n }\n for (const r of action) {\n console.log(` ${chalk.yellow(\"→\")} ${chalk.bold(r.agent.padEnd(7))} ${r.message}`);\n if (r.command) console.log(` ${chalk.cyan(r.command)}`);\n }\n}\n","type JsonObject = Record<string, unknown>;\n\nconst HOLDPOINT_CLAUDE_HOOK_MARKER = \"HOLDPOINT_MANAGED=claude\";\n\nfunction isObject(value: unknown): value is JsonObject {\n return value != null && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction asHookArray(value: unknown): unknown[] {\n return Array.isArray(value) ? value : [];\n}\n\nfunction isManagedHookCommand(value: unknown): boolean {\n return (\n isObject(value) &&\n typeof value.command === \"string\" &&\n value.command.includes(HOLDPOINT_CLAUDE_HOOK_MARKER)\n );\n}\n\nfunction isLegacyManagedHookCommand(value: unknown): boolean {\n if (!isObject(value) || typeof value.command !== \"string\") return false;\n return (\n value.command === \"node_modules/.bin/holdpoint event --engine claude --from-hook || true\" ||\n value.command === \"node_modules/.bin/holdpoint check --staged\"\n );\n}\n\nfunction isManagedHookEntry(value: unknown): boolean {\n if (!isObject(value)) return false;\n const hooks = asHookArray(value.hooks);\n return (\n hooks.length > 0 &&\n (hooks.every(isManagedHookCommand) || hooks.every(isLegacyManagedHookCommand))\n );\n}\n\n/**\n * Merge generated Holdpoint hooks into .claude/settings.json without clobbering\n * user-owned hooks. Re-runs remove only entries carrying Holdpoint's marker.\n */\nexport function mergeClaudeSettings(existing: JsonObject, generated: JsonObject): JsonObject {\n const existingHooks = isObject(existing.hooks) ? existing.hooks : {};\n const generatedHooks = isObject(generated.hooks) ? generated.hooks : {};\n const mergedHooks: JsonObject = {};\n\n for (const eventName of new Set([\n ...Object.keys(existingHooks),\n ...Object.keys(generatedHooks),\n ])) {\n const preserved = asHookArray(existingHooks[eventName]).filter(\n (entry) => !isManagedHookEntry(entry),\n );\n const next = asHookArray(generatedHooks[eventName]);\n if (preserved.length > 0 || next.length > 0) {\n mergedHooks[eventName] = [...preserved, ...next];\n }\n }\n\n return { ...existing, ...generated, hooks: mergedHooks };\n}\n","type JsonObject = Record<string, unknown>;\n\nconst HOLDPOINT_CURSOR_HOOK_MARKER = \"HOLDPOINT_MANAGED=cursor\";\n\nfunction isObject(value: unknown): value is JsonObject {\n return value != null && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction asHookArray(value: unknown): unknown[] {\n return Array.isArray(value) ? value : [];\n}\n\nfunction isManagedCursorHook(value: unknown): boolean {\n return (\n isObject(value) &&\n typeof value.command === \"string\" &&\n (value.command.includes(HOLDPOINT_CURSOR_HOOK_MARKER) ||\n value.command.includes(\".cursor/holdpoint-hook.mjs\"))\n );\n}\n\n/**\n * Merge generated Holdpoint Cursor hooks into `.cursor/hooks.json` without\n * clobbering user/partner hooks. Re-runs remove only entries carrying\n * Holdpoint's marker or the generated hook script path.\n */\nexport function mergeCursorHooks(existing: JsonObject, generated: JsonObject): JsonObject {\n const existingHooks = isObject(existing.hooks) ? existing.hooks : {};\n const generatedHooks = isObject(generated.hooks) ? generated.hooks : {};\n const mergedHooks: JsonObject = {};\n\n for (const eventName of new Set([\n ...Object.keys(existingHooks),\n ...Object.keys(generatedHooks),\n ])) {\n const preserved = asHookArray(existingHooks[eventName]).filter(\n (entry) => !isManagedCursorHook(entry),\n );\n const next = asHookArray(generatedHooks[eventName]);\n if (preserved.length > 0 || next.length > 0) {\n mergedHooks[eventName] = [...preserved, ...next];\n }\n }\n\n return { ...existing, ...generated, hooks: mergedHooks };\n}\n","import { existsSync, readFileSync, writeFileSync, mkdirSync } from \"node:fs\";\nimport { dirname } from \"node:path\";\n\nconst START_MARKER =\n \"<!-- HOLDPOINT_MANAGED — content between these markers is auto-generated by holdpoint init / holdpoint update -->\";\nconst END_MARKER = \"<!-- /HOLDPOINT_MANAGED -->\";\n\n/** Canonical breadcrumb content. Same wording for every agent on purpose. */\nexport const BREADCRUMB_BODY = `## Holdpoint workflow\n\nThis repo uses [Holdpoint](https://holdpoint.dev) to gate task completion on deterministic checks.\n\nBefore marking any task done:\n\n1. Run \\`holdpoint check\\` (or it will run automatically via Stop / TaskCompleted hooks).\n2. Fix any failures. Re-run until exit 0.\n3. Never bypass with \\`--no-verify\\` or by skipping the agent's stop hook.\n\nFull workflow reference: [\\`MASTER_PROMPT.md\\`](./MASTER_PROMPT.md) (always injected at session start).\nDeep reference: [\\`HOLDPOINT_REFERENCE.md\\`](./HOLDPOINT_REFERENCE.md) (read on demand).\nActive checks: [\\`checks.yaml\\`](./checks.yaml).`;\n\n/**\n * Idempotently splice the Holdpoint breadcrumb into a markdown instructions file.\n * - If the file is missing and createIfMissing: write a new file containing only the breadcrumb block.\n * - If the file has the markers: replace content between them.\n * - If the file exists but has no markers: append the breadcrumb block separated by a blank line.\n * Content outside the markers is never touched.\n */\nexport function spliceBreadcrumb(\n filePath: string,\n body: string = BREADCRUMB_BODY,\n createIfMissing = true,\n): void {\n const block = `${START_MARKER}\\n\\n${body}\\n\\n${END_MARKER}`;\n if (!existsSync(filePath)) {\n if (!createIfMissing) return;\n mkdirSync(dirname(filePath), { recursive: true });\n writeFileSync(filePath, block + \"\\n\", \"utf8\");\n return;\n }\n const existing = readFileSync(filePath, \"utf8\");\n const startIdx = existing.indexOf(START_MARKER);\n const endIdx = existing.indexOf(END_MARKER);\n if (startIdx !== -1 && endIdx !== -1 && endIdx > startIdx) {\n const before = existing.slice(0, startIdx);\n const after = existing.slice(endIdx + END_MARKER.length);\n writeFileSync(filePath, before + block + after, \"utf8\");\n return;\n }\n const sep = existing.endsWith(\"\\n\") ? \"\\n\" : \"\\n\\n\";\n writeFileSync(filePath, existing + sep + block + \"\\n\", \"utf8\");\n}\n","import { existsSync, readFileSync, writeFileSync, mkdirSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport chalk from \"chalk\";\nimport ora from \"ora\";\nimport { parseHoldpointYaml, matchesWhen } from \"@holdpoint/yaml-core\";\nimport { runDeterministicChecks } from \"@holdpoint/yaml-core/runner\";\nimport type { CheckResult, CheckRun, CheckReports } from \"@holdpoint/types\";\nimport { execSync } from \"node:child_process\";\nimport { randomUUID } from \"node:crypto\";\nimport { identifyProject } from \"@holdpoint/live-daemon\";\nimport type { EventV1 } from \"@holdpoint/live-protocol\";\nimport { BridgeClient } from \"@holdpoint/sdk\";\n\nconst COMMIT_CACHE_PATH = \".holdpoint/checked-commits.json\";\nconst COMMIT_CACHE_MAX = 100;\nconst CHECK_REPORTS_PATH = \".holdpoint/check-reports.json\";\nconst CHECK_REPORTS_MAX = 50;\n\nfunction getStagedFiles(): string[] {\n try {\n const out = execSync(\"git diff --cached --name-only\", {\n encoding: \"utf8\",\n stdio: [\"pipe\", \"pipe\", \"ignore\"],\n });\n return out.trim().split(\"\\n\").filter(Boolean);\n } catch {\n return [];\n }\n}\n\nfunction getAllChangedFiles(): string[] {\n try {\n const out = execSync(\"git diff --name-only HEAD\", {\n encoding: \"utf8\",\n stdio: [\"pipe\", \"pipe\", \"ignore\"],\n });\n return out.trim().split(\"\\n\").filter(Boolean);\n } catch {\n return [];\n }\n}\n\n/**\n * Returns the files changed in the most recent commit (HEAD vs HEAD~1).\n * Used as a fallback when no staged files exist but the agent has already committed.\n */\nfunction getLastCommitFiles(): string[] {\n try {\n const out = execSync(\"git diff --name-only HEAD~1 HEAD\", {\n encoding: \"utf8\",\n stdio: [\"pipe\", \"pipe\", \"ignore\"],\n });\n return out.trim().split(\"\\n\").filter(Boolean);\n } catch {\n return [];\n }\n}\n\n/** Returns the current HEAD commit SHA, or null if unavailable. */\nfunction getHeadSha(): string | null {\n try {\n return execSync(\"git rev-parse HEAD\", {\n encoding: \"utf8\",\n stdio: [\"pipe\", \"pipe\", \"ignore\"],\n }).trim();\n } catch {\n return null;\n }\n}\n\n/** Returns the set of already-verified commit SHAs from the local cache. */\nfunction readCommitCache(): Set<string> {\n try {\n const raw = readFileSync(COMMIT_CACHE_PATH, \"utf8\");\n const parsed = JSON.parse(raw) as { verified?: unknown };\n return new Set(Array.isArray(parsed.verified) ? (parsed.verified as string[]) : []);\n } catch {\n return new Set();\n }\n}\n\n/**\n * Records a commit SHA as verified in the local cache.\n * Caps the cache at COMMIT_CACHE_MAX entries (newest first).\n */\nfunction recordCommitCache(sha: string): void {\n try {\n const existing = readCommitCache();\n const updated = [sha, ...[...existing].filter((s) => s !== sha)].slice(0, COMMIT_CACHE_MAX);\n mkdirSync(join(COMMIT_CACHE_PATH, \"..\"), { recursive: true });\n writeFileSync(COMMIT_CACHE_PATH, JSON.stringify({ verified: updated }, null, 2) + \"\\n\", \"utf8\");\n } catch {\n // Non-fatal: cache write failure just means the next run re-checks this commit.\n }\n}\n\n/**\n * Appends a check run report to `.holdpoint/check-reports.json`.\n * Caps to CHECK_REPORTS_MAX runs, newest first. Non-fatal if write fails.\n */\nfunction recordCheckReport(run: CheckRun): void {\n try {\n mkdirSync(join(CHECK_REPORTS_PATH, \"..\"), { recursive: true });\n let existing: CheckReports = { runs: [] };\n if (existsSync(CHECK_REPORTS_PATH)) {\n try {\n existing = JSON.parse(readFileSync(CHECK_REPORTS_PATH, \"utf8\")) as CheckReports;\n if (!Array.isArray(existing.runs)) existing.runs = [];\n } catch {\n existing = { runs: [] };\n }\n }\n const updated: CheckReports = {\n runs: [run, ...existing.runs].slice(0, CHECK_REPORTS_MAX),\n };\n writeFileSync(CHECK_REPORTS_PATH, JSON.stringify(updated, null, 2) + \"\\n\", \"utf8\");\n } catch {\n // Non-fatal: report write failure does not affect check outcomes.\n }\n}\n\nexport async function checkCommand(options: { staged?: boolean }): Promise<void> {\n if (!existsSync(\"checks.yaml\")) {\n console.error(chalk.red(\"No checks.yaml found. Run `holdpoint init` first.\"));\n process.exit(1);\n }\n\n const yamlContent = readFileSync(\"checks.yaml\", \"utf8\");\n let config;\n try {\n config = parseHoldpointYaml(yamlContent);\n } catch (err: unknown) {\n console.error(chalk.red(\"Invalid checks.yaml:\"), (err as Error).message);\n process.exit(1);\n }\n\n // Always resolve HEAD SHA — used for both cache and reports.\n const headSha = getHeadSha();\n\n let changedFiles: string[];\n let usedHeadShaForCache = false;\n\n if (options.staged) {\n const staged = getStagedFiles();\n if (staged.length > 0) {\n changedFiles = staged;\n } else {\n // Nothing staged — check if HEAD was already verified to avoid a check loop.\n if (headSha && readCommitCache().has(headSha)) {\n console.log(\n chalk.green(`✓ Commit ${headSha.slice(0, 8)} already verified — nothing to re-check.`),\n );\n process.exit(0);\n }\n\n // Fall back to files in the most recent commit (covers the\n // \"agent committed then called task_complete\" workflow).\n const lastCommit = getLastCommitFiles();\n if (lastCommit.length > 0) {\n changedFiles = lastCommit;\n usedHeadShaForCache = true;\n console.log(\n chalk.yellow(\"No staged files. Running checks scoped to the most recent commit's files.\"),\n );\n } else {\n // Truly nothing changed (investigative session, no recent commit).\n console.log(chalk.green(\"✓ No staged changes and no recent commit — nothing to check.\"));\n process.exit(0);\n }\n }\n } else {\n changedFiles = getAllChangedFiles();\n if (changedFiles.length === 0) {\n console.log(\n chalk.yellow(\"No changed files detected. Running all checks with no file filter.\"),\n );\n console.log(\n chalk.dim(\n \" Tip: if you just ran `holdpoint init`, commit the generated files to clear the git-commit check.\",\n ),\n );\n }\n }\n\n // Print project guides so the agent/human sees them before running checks\n const guides = Object.entries(config.context?.guides ?? {});\n if (guides.length > 0) {\n console.log(chalk.cyan(\"\\nProject guides:\"));\n for (const [key, text] of guides) {\n console.log(chalk.bold(` ${key}:`), chalk.dim(String(text).trim()));\n }\n console.log(\"\");\n }\n\n const taskCount = config.checks.filter((c) => c.cmd !== undefined).length;\n const spinner = ora(`Running ${taskCount} task(s)…`).start();\n const effectiveFiles = changedFiles.length > 0 ? changedFiles : [\"__all__\"];\n const results = runDeterministicChecks(config, effectiveFiles);\n\n const passed = results.filter((r) => r.status === \"pass\");\n const failed = results.filter((r) => r.status === \"fail\");\n const skipped = results.filter((r) => r.status === \"skip\");\n\n spinner.stop();\n\n // Print results\n for (const result of results) {\n printResult(result);\n }\n\n // Summary\n console.log(\"\");\n console.log(\n [\n chalk.green(`✓ ${passed.length} passed`),\n failed.length > 0 ? chalk.red(`✗ ${failed.length} failed`) : \"\",\n skipped.length > 0 ? chalk.gray(`◌ ${skipped.length} skipped`) : \"\",\n ]\n .filter(Boolean)\n .join(\" \"),\n );\n\n // Prompt checks: show those whose when filter matches the changed files\n const promptChecks = config.checks.filter(\n (c) =>\n c.prompt !== undefined &&\n matchesWhen(c.when, changedFiles.length > 0 ? changedFiles : [\"__all__\"], config.patterns),\n );\n if (promptChecks.length > 0) {\n console.log(`\\n${chalk.cyan(\"Agent prompts to act on:\")}`);\n for (const c of promptChecks) {\n console.log(` ${chalk.yellow(\"□\")} [${c.label}] ${c.prompt ?? \"\"}`);\n }\n }\n\n // Write rich check run report BEFORE exiting so failed runs are always recorded.\n const reportResults = [\n ...results.map((r) => ({\n id: r.check.id,\n label: r.check.label,\n kind: \"cmd\" as const,\n status: r.status as \"pass\" | \"fail\" | \"skip\",\n ...(r.output !== undefined ? { output: r.output } : {}),\n ...(r.exitCode !== undefined ? { exitCode: r.exitCode } : {}),\n ...(r.skipReason !== undefined ? { skipReason: r.skipReason } : {}),\n })),\n ...promptChecks.map((c) => ({\n id: c.id,\n label: c.label,\n kind: \"prompt\" as const,\n status: \"shown\" as const,\n })),\n ];\n\n const run = {\n sha: headSha,\n shortSha: headSha ? headSha.slice(0, 8) : null,\n timestamp: new Date().toISOString(),\n files: changedFiles.length > 0 ? changedFiles : [],\n results: reportResults,\n summary: {\n passed: passed.length,\n failed: failed.length,\n skipped: skipped.length,\n shown: promptChecks.length,\n },\n };\n recordCheckReport(run);\n\n const project = identifyProject(process.cwd());\n const bridge = new BridgeClient();\n const liveEvents: EventV1[] = reportResults\n .filter(\n (result): result is Extract<(typeof reportResults)[number], { kind: \"cmd\" }> =>\n result.kind === \"cmd\",\n )\n .map((result, index) => ({\n v: 1,\n id: randomUUID(),\n ts: Date.now() + index,\n engine: \"holdpoint\",\n session_id: \"check-runner\",\n project_hash: project.hash,\n cwd: process.cwd(),\n type: \"check_run\",\n payload: {\n check_id: result.id,\n label: result.label,\n status: result.status,\n duration_ms: 0,\n ...(result.output ? { output: result.output } : {}),\n },\n }));\n if (liveEvents.length > 0) {\n await bridge.sendEvents(liveEvents);\n }\n\n if (failed.length > 0) {\n process.exit(1);\n }\n\n // All checks passed — if we ran against a committed HEAD (no staged files), mark it verified.\n if (usedHeadShaForCache && headSha) {\n recordCommitCache(headSha);\n }\n}\n\nfunction printResult(result: CheckResult): void {\n const icon =\n result.status === \"pass\"\n ? chalk.green(\"✓\")\n : result.status === \"fail\"\n ? chalk.red(\"✗\")\n : result.status === \"skip\"\n ? chalk.gray(\"◌\")\n : chalk.yellow(\"…\");\n\n const label = result.check.label;\n console.log(`${icon} ${label}`);\n\n if (result.status === \"fail\" && result.output) {\n const trimmed = result.output.trim().split(\"\\n\").slice(0, 10).join(\"\\n\");\n console.log(chalk.dim(trimmed.replace(/^/gm, \" \")));\n }\n if (result.status === \"skip\" && result.skipReason) {\n console.log(chalk.dim(` ${result.skipReason}`));\n }\n}\n","import { existsSync, readFileSync } from \"node:fs\";\nimport chalk from \"chalk\";\nimport { parseHoldpointYaml, validateConfig } from \"@holdpoint/yaml-core\";\n\nexport async function validateCommand(): Promise<void> {\n if (!existsSync(\"checks.yaml\")) {\n console.error(chalk.red(\"No checks.yaml found. Run `holdpoint init` first.\"));\n process.exit(1);\n }\n\n const text = readFileSync(\"checks.yaml\", \"utf8\");\n\n let config;\n try {\n config = parseHoldpointYaml(text);\n } catch (err: unknown) {\n console.error(chalk.red(\"Parse error:\"), (err as Error).message);\n process.exit(1);\n }\n\n const result = validateConfig(config);\n\n if (result.valid) {\n console.log(chalk.green(\"✓ checks.yaml is valid\"));\n console.log(\n chalk.dim(\n ` ${config.checks.filter((c) => c.cmd !== undefined).length} tasks, ${config.checks.filter((c) => c.prompt !== undefined).length} prompts, ${config.conditions.length} conditions`,\n ),\n );\n } else {\n console.error(chalk.red(\"✗ checks.yaml has errors:\"));\n for (const err of result.errors) {\n console.error(` ${chalk.yellow(err.path)}: ${err.message}`);\n }\n process.exit(1);\n }\n}\n","import { existsSync, readFileSync, writeFileSync, mkdirSync } from \"node:fs\";\nimport chalk from \"chalk\";\nimport ora from \"ora\";\nimport { parseHoldpointYaml } from \"@holdpoint/yaml-core\";\nimport { buildConfigJson, buildEngine } from \"@holdpoint/engine-copilot\";\nimport { buildEngineJson as buildClaudeEngineJson } from \"@holdpoint/engine-claude\";\nimport {\n buildCheckScript as buildCursorCheckScript,\n buildEngine as buildCursorEngine,\n buildHooksJson as buildCursorHooksJson,\n} from \"@holdpoint/engine-cursor\";\nimport {\n buildConfigToml as buildCodexConfigToml,\n buildHooksJson as buildCodexHooksJson,\n buildCheckScript as buildCodexCheckScript,\n} from \"@holdpoint/engine-codex\";\nimport { detectInstalledAgents } from \"../detect.js\";\nimport type { AgentType } from \"@holdpoint/types\";\nimport { ensureBundledFile } from \"../templates.js\";\nimport { mergeClaudeSettings } from \"../claude-settings.js\";\nimport { mergeCursorHooks } from \"../cursor-hooks.js\";\nimport { spliceBreadcrumb } from \"../lib/instructions-breadcrumb.js\";\n\nconst MINIMAL_PREREQUISITES = `# Holdpoint prerequisites\n\nHoldpoint installed repo-local engine integrations for one or more AI coding agents. Before relying on them locally, review these setup notes:\n\n- **GitHub Copilot CLI** — Holdpoint's \\`.github/extensions/holdpoint/extension.mjs\\` uses the Copilot CLI **EXTENSIONS** feature. Today that feature is gated behind experimental mode. In Copilot CLI, run \\`/experimental on\\` so **EXTENSIONS** appears in the enabled feature set before using Holdpoint locally.\n- **Cursor** — project-level hooks run in trusted workspaces. After opening the repo in Cursor, confirm the workspace is trusted and review Settings → Hooks if hooks do not fire.\n- **OpenAI Codex** — project-level hooks require trust approval. Run \\`codex trust\\` in the Codex TUI or review the hook with \\`/hooks\\`.\n- **General** — Holdpoint expects Node.js 18+ and a git repository so \\`holdpoint init\\`, \\`holdpoint update\\`, and \\`holdpoint check\\` can run normally.\n\nDocs: https://holdpoint.dev/docs\n`;\n\nconst MINIMAL_HOLDPOINT_REFERENCE = `# Holdpoint reference\n\nRead \\`MASTER_PROMPT.md\\` first for the mandatory workflow, then use this file for deeper project-specific Holdpoint notes.\n`;\n\n/**\n * Regenerate all Holdpoint engine files from the current `checks.yaml`.\n *\n * Detects which agents were previously installed via `detectInstalledAgents()` and\n * regenerates only their files. Falls back to all four agents if no engine files\n * are found (e.g. first run after a manual `checks.yaml` edit).\n */\nexport async function updateCommand(): Promise<void> {\n if (!existsSync(\"checks.yaml\")) {\n console.error(chalk.red(\"No checks.yaml found. Run `holdpoint init` first.\"));\n process.exit(1);\n }\n\n const spinner = ora(\"Updating Holdpoint engine files…\").start();\n const config = parseHoldpointYaml(readFileSync(\"checks.yaml\", \"utf8\"));\n\n // Regenerate for every agent that was previously installed.\n // Fall back to all four if no engine files exist yet (e.g. first run after manual checks.yaml edit).\n const detected = detectInstalledAgents();\n const agents: AgentType[] =\n detected.length > 0 ? detected : [\"copilot\", \"claude\", \"cursor\", \"codex\"];\n\n // Always write checks.immutable.json — read by holdpoint-check.mjs at runtime\n const generatedDir = \".github/holdpoint/generated\";\n mkdirSync(generatedDir, { recursive: true });\n writeFileSync(`${generatedDir}/checks.immutable.json`, buildConfigJson(config), \"utf8\");\n\n if (agents.includes(\"copilot\")) {\n const extDir = \".github/extensions/holdpoint\";\n mkdirSync(extDir, { recursive: true });\n writeFileSync(`${extDir}/extension.mjs`, buildEngine(config), \"utf8\");\n spliceBreadcrumb(\".github/copilot-instructions.md\");\n }\n\n if (agents.includes(\"claude\")) {\n mkdirSync(\".claude\", { recursive: true });\n const settingsPath = \".claude/settings.json\";\n let existing: Record<string, unknown> = {};\n if (existsSync(settingsPath)) {\n try {\n existing = JSON.parse(readFileSync(settingsPath, \"utf8\")) as Record<string, unknown>;\n } catch {\n /* */\n }\n }\n const hooks = JSON.parse(buildClaudeEngineJson(config)) as Record<string, unknown>;\n writeFileSync(\n settingsPath,\n JSON.stringify(mergeClaudeSettings(existing, hooks), null, 2) + \"\\n\",\n );\n spliceBreadcrumb(\"CLAUDE.md\");\n }\n\n if (agents.includes(\"cursor\")) {\n mkdirSync(\".cursor\", { recursive: true });\n const cursorHooksPath = \".cursor/hooks.json\";\n let existingHooks: Record<string, unknown> = {};\n if (existsSync(cursorHooksPath)) {\n try {\n existingHooks = JSON.parse(readFileSync(cursorHooksPath, \"utf8\")) as Record<\n string,\n unknown\n >;\n } catch {\n /* */\n }\n }\n const cursorHooks = JSON.parse(buildCursorHooksJson(config)) as Record<string, unknown>;\n writeFileSync(\n cursorHooksPath,\n JSON.stringify(mergeCursorHooks(existingHooks, cursorHooks), null, 2) + \"\\n\",\n \"utf8\",\n );\n writeFileSync(\".cursor/holdpoint-hook.mjs\", buildCursorCheckScript(), \"utf8\");\n\n const cursorRules = buildCursorEngine(config);\n const cursorPath = \".cursorrules\";\n if (existsSync(cursorPath)) {\n const content = readFileSync(cursorPath, \"utf8\");\n const start = content.indexOf(\"# ─── Holdpoint Rules\");\n const end = content.indexOf(\"# ─── End Holdpoint Rules ───\");\n if (start !== -1 && end !== -1) {\n // Slice past the end-marker line (find its newline to avoid hardcoded offsets)\n const afterEnd = content.indexOf(\"\\n\", end);\n const prefix = content.slice(0, start).trimEnd();\n const suffix = content.slice(afterEnd === -1 ? end : afterEnd + 1).trimStart();\n const updated =\n (prefix ? `${prefix}\\n\\n` : \"\") + cursorRules + (suffix ? `\\n${suffix}` : \"\");\n writeFileSync(cursorPath, updated);\n } else {\n writeFileSync(cursorPath, `${content.trimEnd()}\\n\\n${cursorRules}`);\n }\n } else {\n writeFileSync(cursorPath, cursorRules);\n }\n spliceBreadcrumb(\".cursor/rules/holdpoint.md\");\n }\n\n if (agents.includes(\"codex\")) {\n mkdirSync(\".codex\", { recursive: true });\n // hooks.json is fully managed by Holdpoint; users who need additional Codex hooks\n // should add them in .codex/config.toml (Codex merges both sources).\n writeFileSync(\".codex/hooks.json\", buildCodexHooksJson(config), \"utf8\");\n writeFileSync(\".codex/holdpoint-check.mjs\", buildCodexCheckScript(config), \"utf8\");\n // Ensure hooks are explicitly enabled at the repo level.\n const configTomlPath = \".codex/config.toml\";\n if (!existsSync(configTomlPath)) {\n writeFileSync(configTomlPath, buildCodexConfigToml(), \"utf8\");\n } else {\n const existing = readFileSync(configTomlPath, \"utf8\");\n if (!existing.includes(\"[features]\")) {\n writeFileSync(configTomlPath, existing.trimEnd() + \"\\n\\n\" + buildCodexConfigToml(), \"utf8\");\n }\n // [features] already present — trust the user's settings\n }\n spliceBreadcrumb(\"AGENTS.md\");\n }\n\n const wroteReference = ensureBundledFile(\n \"HOLDPOINT_REFERENCE.md\",\n \"HOLDPOINT_REFERENCE.md\",\n MINIMAL_HOLDPOINT_REFERENCE,\n );\n\n const wrotePrerequisites = ensureBundledFile(\n \"HOLDPOINT_PREREQUISITES.md\",\n \"HOLDPOINT_PREREQUISITES.md\",\n MINIMAL_PREREQUISITES,\n );\n\n spinner.succeed(chalk.green(\"Engine files updated from current checks.yaml\"));\n if (wroteReference) {\n console.log(\n chalk.cyan(\"Created HOLDPOINT_REFERENCE.md with the full Holdpoint workflow reference.\"),\n );\n }\n if (wrotePrerequisites) {\n console.log(\n chalk.cyan(\n \"Created HOLDPOINT_PREREQUISITES.md with Copilot experimental-mode and other agent setup notes.\",\n ),\n );\n }\n}\n","import chalk from \"chalk\";\nimport { ensureDaemon } from \"../lib/ensure-daemon.js\";\nimport { openBrowser } from \"../lib/open-browser.js\";\nimport { appendProjectAuthParams, tryResolveCurrentProject } from \"../lib/project.js\";\n\n/**\n * Open the Holdpoint visual builder through the singleton daemon.\n *\n * The daemon serves both `/live/` and `/builder/`, so users get one browser\n * surface, one auth flow, and one localhost port for watching and editing checks.\n */\nexport async function buildCommand(): Promise<void> {\n const { info, started } = await ensureDaemon();\n const url = new URL(\"/__holdpoint/live-auth\", `http://127.0.0.1:${info.port}`);\n url.searchParams.set(\"token\", info.token);\n url.searchParams.set(\"path\", \"/builder/\");\n appendProjectAuthParams(url, tryResolveCurrentProject());\n\n openBrowser(url.toString());\n\n console.log(\n chalk.green(\n started ? \"✓ Started Holdpoint Live and opened the builder\" : \"✓ Opened Holdpoint builder\",\n ),\n );\n console.log(` url: ${chalk.cyan(url.toString())}`);\n}\n","import { spawn } from \"node:child_process\";\nimport { readHealthyDaemonLock, type DaemonLock } from \"@holdpoint/live-daemon\";\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolvePromise) => setTimeout(resolvePromise, ms));\n}\n\nexport async function ensureDaemon(timeoutMs = 5_000): Promise<{\n info: DaemonLock;\n started: boolean;\n}> {\n const existing = await readHealthyDaemonLock();\n if (existing) {\n return { info: existing, started: false };\n }\n\n const cliEntry = process.argv[1];\n if (!cliEntry) {\n throw new Error(\"Cannot determine the current holdpoint CLI entrypoint\");\n }\n const child = spawn(process.execPath, [cliEntry, \"daemon-serve\"], {\n stdio: \"ignore\",\n env: process.env,\n cwd: process.cwd(),\n });\n child.unref();\n\n const deadline = Date.now() + timeoutMs;\n while (Date.now() < deadline) {\n const lock = await readHealthyDaemonLock();\n if (lock) {\n return { info: lock, started: true };\n }\n await sleep(100);\n }\n\n throw new Error(\"Daemon unavailable + cannot spawn\");\n}\n","import { execSync } from \"node:child_process\";\n\nexport function openBrowser(url: string): void {\n const openCmd =\n process.platform === \"darwin\" ? \"open\" : process.platform === \"win32\" ? \"start\" : \"xdg-open\";\n\n try {\n execSync(`${openCmd} ${JSON.stringify(url)}`, { stdio: \"ignore\" });\n } catch {\n /* non-fatal */\n }\n}\n","import { existsSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport { identifyProject } from \"@holdpoint/live-daemon\";\n\nexport interface CurrentProject {\n hash: string;\n name: string;\n root: string;\n}\n\nfunction findChecksYaml(startDir: string): string | null {\n let current = startDir;\n for (;;) {\n const candidate = join(current, \"checks.yaml\");\n if (existsSync(candidate)) {\n return candidate;\n }\n const parent = dirname(current);\n if (parent === current) {\n return null;\n }\n current = parent;\n }\n}\n\nexport function tryResolveCurrentProject(): CurrentProject | null {\n const checksYaml = findChecksYaml(process.cwd());\n if (checksYaml) {\n return identifyProject(dirname(checksYaml));\n }\n\n try {\n return identifyProject(process.cwd());\n } catch {\n return null;\n }\n}\n\nexport function appendProjectAuthParams(url: URL, project: CurrentProject | null): void {\n if (!project) {\n return;\n }\n url.searchParams.set(\"project\", project.hash);\n url.searchParams.set(\"name\", project.name);\n url.searchParams.set(\"root\", project.root);\n}\n","import { existsSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { execSync } from \"node:child_process\";\nimport chalk from \"chalk\";\nimport ora from \"ora\";\nimport { parseHoldpointYaml, generateYaml } from \"@holdpoint/yaml-core\";\nimport type { HoldpointConfig, CheckDef, ConditionDef } from \"@holdpoint/types\";\nimport { scanProject } from \"../evolve/scanner.js\";\nimport { getRepoFiles, detectStaleChecks } from \"../evolve/dead-checker.js\";\nimport { getTemplates } from \"../evolve/templates.js\";\n\n// ── Helpers ───────────────────────────────────────────────────────────────────\n\n/**\n * Strip leading comment lines from a checks.yaml so we can re-prepend them\n * after re-serialising — preserves the documentation header.\n */\nfunction extractHeader(yaml: string): string {\n const lines = yaml.split(\"\\n\");\n const commentLines: string[] = [];\n for (const line of lines) {\n if (line.startsWith(\"#\") || (commentLines.length > 0 && line.trim() === \"\")) {\n commentLines.push(line);\n } else {\n break;\n }\n }\n // Trim trailing blank lines\n while (commentLines.length > 0 && commentLines[commentLines.length - 1]?.trim() === \"\") {\n commentLines.pop();\n }\n return commentLines.join(\"\\n\");\n}\n\nfunction withHeader(header: string, newYaml: string): string {\n if (!header) return newYaml;\n return header + \"\\n\\n\" + newYaml;\n}\n\n// ── The command ───────────────────────────────────────────────────────────────\n\nexport async function evolveCommand(options: { apply?: boolean }): Promise<void> {\n if (!existsSync(\"checks.yaml\")) {\n console.error(chalk.red(\"No checks.yaml found. Run `holdpoint init` first.\"));\n process.exit(1);\n }\n\n const spinner = ora(\"Scanning project profile…\").start();\n const cwd = process.cwd();\n\n // 1. Scan project\n const profile = scanProject(cwd);\n const repoFiles = getRepoFiles(cwd);\n\n // 2. Parse checks.yaml\n const yamlContent = readFileSync(\"checks.yaml\", \"utf8\");\n let config: HoldpointConfig;\n try {\n config = parseHoldpointYaml(yamlContent);\n } catch (err: unknown) {\n spinner.fail(chalk.red(\"Invalid checks.yaml:\") + \" \" + (err as Error).message);\n process.exit(1);\n }\n\n spinner.stop();\n\n // 3. Compute proposals — templates whose trigger matches AND id not already in config\n const existingIds = new Set(config.checks.map((c) => c.id));\n const existingConditionIds = new Set(config.conditions.map((c) => c.id));\n const allTemplates = getTemplates(profile);\n const proposals = allTemplates.filter((t) => t.trigger(profile) && !existingIds.has(t.id));\n\n // 4. Detect stale checks\n const staleChecks = detectStaleChecks(config, repoFiles);\n\n // ── Print report ─────────────────────────────────────────────────────────\n\n // Profile summary — show detected items\n console.log(chalk.bold(\"\\n📋 Project profile:\"));\n const traits: [string, boolean, string][] = [\n [\"TypeScript\", profile.hasTypeScript, \"tsconfig.json\"],\n [\"ESLint\", profile.hasEslint, \"eslint.config.*\"],\n [\"Biome\", profile.hasBiome, \"biome.json\"],\n [\"Ruff\", profile.hasRuff, \"pyproject.toml / ruff\"],\n [\"Prettier\", profile.hasPrettier, \".prettierrc\"],\n [\"Vitest\", profile.hasVitest, \"devDependencies\"],\n [\"Jest\", profile.hasJest, \"devDependencies\"],\n [\"Python\", profile.hasPython, \"pyproject.toml\"],\n [\"Pytest\", profile.hasPytest, \"pytest.ini\"],\n [\"Go\", profile.hasGo, \"go.mod\"],\n [\"Rust\", profile.hasRust, \"Cargo.toml\"],\n [\"Next.js\", profile.hasNext, \"next.config.*\"],\n [\"React\", profile.hasReact, \"dependencies\"],\n [\"Prisma\", profile.hasPrisma, \"prisma/schema.prisma\"],\n [\"Drizzle\", profile.hasDrizzle, \"drizzle-orm\"],\n [\"Migrations\", profile.hasMigrations, \"migrations/\"],\n [\"Docker\", profile.hasDocker, \"Dockerfile\"],\n [\"Terraform\", profile.hasTerraform, \"*.tf\"],\n [\"Kubernetes\", profile.hasKubernetes, \"k8s/\"],\n [\"OpenAPI\", profile.hasOpenApi, \"openapi.yaml\"],\n [\"GitHub Actions\", profile.hasGithubActions, \".github/workflows/\"],\n ];\n const detected = traits.filter(([, yes]) => yes);\n if (detected.length === 0) {\n console.log(chalk.dim(\" (empty project — only universal checks apply)\"));\n } else {\n for (const [name, , hint] of detected) {\n console.log(` ${chalk.green(\"✓\")} ${name.padEnd(18)} ${chalk.dim(hint)}`);\n }\n }\n\n // Stale checks\n if (staleChecks.length > 0) {\n console.log(chalk.bold(`\\n⚠️ Stale checks (${staleChecks.length}):`));\n for (const { check, reason, suggestedConditionPath } of staleChecks) {\n const fix = suggestedConditionPath\n ? chalk.dim(` → will wrap with conditionId: file_exists: ${suggestedConditionPath}`)\n : chalk.dim(\" → no path inferred; review manually\");\n console.log(` ${chalk.yellow(\"◌\")} ${chalk.bold(check.id)} ${chalk.dim(reason)}${fix}`);\n }\n }\n\n // Proposals\n if (proposals.length === 0 && staleChecks.length === 0) {\n console.log(chalk.green(\"\\n✓ checks.yaml is fully in sync with the project profile.\"));\n return;\n }\n\n if (proposals.length > 0) {\n console.log(chalk.bold(`\\n💡 Proposed additions (${proposals.length}):`));\n for (const t of proposals) {\n const scope = t.when ? chalk.cyan(` when: ${t.when}`) : \"\";\n const type = t.cmd ? chalk.dim(\"cmd\") : chalk.dim(\"prompt\");\n const preview = t.cmd\n ? chalk.dim(` ${t.cmd.slice(0, 80)}${t.cmd.length > 80 ? \"…\" : \"\"}`)\n : chalk.dim(` ${(t.prompt ?? \"\").slice(0, 80)}${(t.prompt?.length ?? 0) > 80 ? \"…\" : \"\"}`);\n console.log(` ${chalk.green(\"+\")} ${chalk.bold(t.id.padEnd(24))} [${type}]${scope}`);\n console.log(` ${preview}`);\n }\n }\n\n if (!options.apply) {\n console.log(\n chalk.red(`\\n✗ checks.yaml is out of sync with the project profile.`) +\n `\\n Run ${chalk.bold(\"npx @holdpoint/cli@alpha suggest --apply\")} to apply these changes.`,\n );\n process.exit(1);\n }\n\n // ── Apply ───────────────────────────────────────────────────────────────\n\n const applySpinner = ora(\"Applying changes to checks.yaml…\").start();\n\n // Build updated conditions list\n const newConditions = [...config.conditions];\n\n // Collect conditions needed by proposals\n for (const t of proposals) {\n if (t.condition && !existingConditionIds.has(t.condition.id)) {\n newConditions.push(t.condition as ConditionDef);\n existingConditionIds.add(t.condition.id);\n }\n }\n\n // Wrap stale checks with file_exists conditions\n const updatedChecks: CheckDef[] = config.checks.map((check) => {\n const stale = staleChecks.find((s) => s.check.id === check.id);\n if (!stale || !stale.suggestedConditionPath) return check;\n\n const condId = `has-${check.id}`;\n if (!existingConditionIds.has(condId)) {\n newConditions.push({\n id: condId,\n operator: \"file_exists\",\n path: stale.suggestedConditionPath,\n });\n existingConditionIds.add(condId);\n }\n return { ...check, conditionId: condId };\n });\n\n // Append proposed checks\n const newChecks: CheckDef[] = proposals.map((t) => ({\n id: t.id,\n label: t.label,\n ...(t.when ? { when: t.when } : {}),\n ...(t.cmd ? { cmd: t.cmd } : {}),\n ...(t.prompt ? { prompt: t.prompt } : {}),\n ...(t.conditionId ? { conditionId: t.conditionId } : {}),\n }));\n\n const updatedConfig: HoldpointConfig = {\n ...config,\n conditions: newConditions,\n checks: [...updatedChecks, ...newChecks],\n };\n\n const header = extractHeader(yamlContent);\n const newYaml = withHeader(header, generateYaml(updatedConfig));\n writeFileSync(\"checks.yaml\", newYaml, \"utf8\");\n\n // Regenerate engine files\n applySpinner.text = \"Running holdpoint update…\";\n try {\n execSync(\"npx @holdpoint/cli@alpha update\", { stdio: \"pipe\" });\n } catch {\n // holdpoint update failure is non-fatal — checks.yaml is already written\n applySpinner.warn(\n chalk.yellow(\"checks.yaml updated, but `holdpoint update` failed — run it manually.\"),\n );\n printAppliedSummary(proposals.length, staleChecks.length);\n return;\n }\n\n applySpinner.succeed(chalk.green(\"checks.yaml updated and engine files regenerated.\"));\n printAppliedSummary(proposals.length, staleChecks.length);\n}\n\nfunction printAppliedSummary(added: number, wrapped: number): void {\n const parts: string[] = [];\n if (added > 0) parts.push(chalk.green(`${added} check${added === 1 ? \"\" : \"s\"} added`));\n if (wrapped > 0)\n parts.push(chalk.yellow(`${wrapped} stale check${wrapped === 1 ? \"\" : \"s\"} wrapped`));\n if (parts.length > 0) console.log(\" \" + parts.join(\" · \"));\n console.log(\n chalk.dim(\"\\n Review checks.yaml, then commit: \") +\n chalk.yellow(\"git add checks.yaml && git commit -m 'chore: update holdpoint checks'\"),\n );\n}\n","import { existsSync, readFileSync, readdirSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { execSync } from \"node:child_process\";\n\nexport interface ProjectProfile {\n // Languages\n hasTypeScript: boolean;\n hasPython: boolean;\n hasGo: boolean;\n hasRust: boolean;\n hasJava: boolean;\n hasRuby: boolean;\n // Frameworks\n hasNext: boolean;\n hasReact: boolean;\n // Linting\n hasEslint: boolean;\n hasBiome: boolean;\n hasRuff: boolean;\n hasPrettier: boolean;\n // Testing\n hasVitest: boolean;\n hasJest: boolean;\n hasPytest: boolean;\n // DB\n hasPrisma: boolean;\n hasDrizzle: boolean;\n hasMigrations: boolean;\n hasAlembic: boolean;\n // Infra\n hasDocker: boolean;\n hasTerraform: boolean;\n hasKubernetes: boolean;\n // API\n hasOpenApi: boolean;\n // CI\n hasGithubActions: boolean;\n // Package manager\n packageManager: \"pnpm\" | \"yarn\" | \"bun\" | \"npm\";\n // Raw scripts from package.json\n scripts: Record<string, string>;\n // All dep names (deps + devDeps)\n deps: Set<string>;\n}\n\ntype PkgJson = {\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n scripts?: Record<string, string>;\n};\n\nfunction tryReadJson<T>(path: string): T | null {\n try {\n return JSON.parse(readFileSync(path, \"utf8\")) as T;\n } catch {\n return null;\n }\n}\n\nfunction tryReadText(path: string): string {\n try {\n return readFileSync(path, \"utf8\");\n } catch {\n return \"\";\n }\n}\n\n/**\n * Walk a directory up to maxDepth levels, returning all file paths relative to root.\n * Excludes common build artifacts and dependency directories.\n */\nfunction walkDir(\n dir: string,\n root: string,\n depth: number,\n maxDepth: number,\n ignored: Set<string>,\n): string[] {\n if (depth > maxDepth) return [];\n let entries: string[] = [];\n try {\n entries = readdirSync(dir);\n } catch {\n return [];\n }\n const results: string[] = [];\n for (const entry of entries) {\n if (ignored.has(entry)) continue;\n const full = join(dir, entry);\n const rel = full.slice(root.length + 1);\n try {\n // Use stat-free heuristic: if it has an extension it's likely a file\n // If no extension and doesn't start with \".\", try as directory\n const hasExt = entry.includes(\".\");\n if (!hasExt || entry.startsWith(\".\")) {\n // Could be a dir — try recursing\n const children = walkDir(full, root, depth + 1, maxDepth, ignored);\n if (children.length > 0) {\n results.push(...children);\n } else if (hasExt) {\n results.push(rel);\n }\n } else {\n results.push(rel);\n }\n } catch {\n // skip\n }\n }\n return results;\n}\n\nconst WALK_IGNORED = new Set([\n \"node_modules\",\n \".git\",\n \"dist\",\n \"build\",\n \".next\",\n \".turbo\",\n \"__pycache__\",\n \".venv\",\n \"venv\",\n \".mypy_cache\",\n \"target\",\n \".cache\",\n \"coverage\",\n \".nyc_output\",\n]);\n\n/**\n * Returns a list of all files in the repo (relative paths from cwd).\n * Uses `git ls-files` when inside a git repo; falls back to directory walk.\n */\nexport function getRepoFiles(cwd: string): string[] {\n try {\n const out = execSync(\"git ls-files\", {\n cwd,\n encoding: \"utf8\",\n stdio: [\"pipe\", \"pipe\", \"ignore\"],\n });\n const files = out.trim().split(\"\\n\").filter(Boolean);\n if (files.length > 0) return files;\n } catch {\n // not a git repo or git not available\n }\n return walkDir(cwd, cwd, 0, 6, WALK_IGNORED);\n}\n\n/**\n * Returns true if the file path is a structural project indicator — i.e., a file\n * whose addition or modification may require new checks to be added to checks.yaml.\n * Mirrors the detection patterns used in `scanProject()`.\n */\nexport function isStructuralFile(file: string): boolean {\n const f = file.replace(/\\\\/g, \"/\");\n\n // JS / TS project structure\n if (f === \"package.json\") return true;\n if (/^tsconfig[^/]*\\.json$/.test(f)) return true;\n\n // Python\n if (/^requirements[^/]*\\.txt$/.test(f)) return true;\n if (f === \"pyproject.toml\") return true;\n if (f === \"Pipfile\") return true;\n if (f === \"setup.py\") return true;\n if (f === \"setup.cfg\") return true;\n if (f === \"pytest.ini\") return true;\n if (f === \"tox.ini\") return true;\n\n // Go\n if (f === \"go.mod\") return true;\n\n // Rust\n if (f === \"Cargo.toml\") return true;\n\n // Java / Kotlin\n if (f === \"pom.xml\") return true;\n if (/^build\\.gradle(\\.kts)?$/.test(f)) return true;\n\n // Ruby\n if (f === \"Gemfile\") return true;\n\n // Test frameworks\n if (/^vitest\\.config\\.[^/]+$/.test(f)) return true;\n if (/^jest\\.config\\.[^/]+$/.test(f)) return true;\n if (/^playwright\\.config\\.[^/]+$/.test(f)) return true;\n\n // Linters / formatters\n if (/^eslint\\.config\\.[^/]+$/.test(f)) return true;\n if (/^\\.eslintrc[^/]*$/.test(f)) return true;\n if (/^biome\\.jsonc?$/.test(f)) return true;\n if (/^prettier\\.config\\.[^/]+$/.test(f)) return true;\n if (/^\\.prettierrc[^/]*$/.test(f)) return true;\n\n // Next.js\n if (/^next\\.config\\.[^/]+$/.test(f)) return true;\n\n // Docker / infra\n if (/^Dockerfile[^/]*$/.test(f)) return true;\n if (/^docker-compose[^/]*\\.ya?ml$/.test(f)) return true;\n if (/[^/]*\\.tf$/.test(f)) return true;\n\n // Database\n if (f === \"prisma/schema.prisma\") return true;\n\n // OpenAPI\n if (/^(api\\/)?openapi\\.(yaml|yml|json)$/.test(f)) return true;\n\n // CI\n if (/^\\.github\\/workflows\\/[^/]+\\.ya?ml$/.test(f)) return true;\n if (/^\\.circleci\\/.+$/.test(f)) return true;\n if (f === \"Jenkinsfile\") return true;\n if (f === \".gitlab-ci.yml\") return true;\n if (f === \".travis.yml\") return true;\n\n return false;\n}\n\n/**\n * Scan the project at `cwd` and return a `ProjectProfile`.\n * All detection is pure filesystem reads — no shell commands executed.\n */\nexport function scanProject(cwd = process.cwd()): ProjectProfile {\n const exists = (p: string) => existsSync(join(cwd, p));\n\n // Package manager\n const packageManager: ProjectProfile[\"packageManager\"] = exists(\"pnpm-lock.yaml\")\n ? \"pnpm\"\n : exists(\"yarn.lock\")\n ? \"yarn\"\n : exists(\"bun.lockb\")\n ? \"bun\"\n : \"npm\";\n\n // package.json\n const pkg = tryReadJson<PkgJson>(join(cwd, \"package.json\"));\n const scripts = pkg?.scripts ?? {};\n const deps = new Set<string>([\n ...Object.keys(pkg?.dependencies ?? {}),\n ...Object.keys(pkg?.devDependencies ?? {}),\n ]);\n\n // Python manifest scanning\n const pyprojectText = tryReadText(join(cwd, \"pyproject.toml\"));\n const requirementsText = tryReadText(join(cwd, \"requirements.txt\"));\n const pipfileText = tryReadText(join(cwd, \"Pipfile\"));\n const allPyText = pyprojectText + requirementsText + pipfileText;\n\n const hasPytest =\n exists(\"pytest.ini\") ||\n exists(\"setup.cfg\") ||\n allPyText.includes(\"pytest\") ||\n allPyText.includes(\"[tool.pytest\");\n const hasRuff = allPyText.includes(\"ruff\") || deps.has(\"ruff\");\n const hasAlembic = allPyText.includes(\"alembic\") || deps.has(\"alembic\");\n\n // Root-level file listing (for Dockerfile variants and .tf files)\n let rootFiles: string[] = [];\n try {\n rootFiles = readdirSync(cwd);\n } catch {\n // ignore\n }\n\n const hasDocker =\n rootFiles.some((f) => f === \"Dockerfile\" || f.startsWith(\"Dockerfile.\")) ||\n exists(\"docker-compose.yml\") ||\n exists(\"docker-compose.yaml\") ||\n exists(\"docker-compose.dev.yml\");\n\n const hasTerraform =\n rootFiles.some((f) => f.endsWith(\".tf\")) || exists(\"terraform\") || exists(\"infra\");\n\n return {\n // Languages\n hasTypeScript: exists(\"tsconfig.json\") || deps.has(\"typescript\"),\n hasPython:\n Boolean(pyprojectText) ||\n Boolean(requirementsText) ||\n Boolean(pipfileText) ||\n exists(\"setup.py\"),\n hasGo: exists(\"go.mod\"),\n hasRust: exists(\"Cargo.toml\"),\n hasJava: exists(\"pom.xml\") || exists(\"build.gradle\") || exists(\"build.gradle.kts\"),\n hasRuby: exists(\"Gemfile\"),\n\n // Frameworks\n hasNext:\n exists(\"next.config.ts\") ||\n exists(\"next.config.js\") ||\n exists(\"next.config.mjs\") ||\n deps.has(\"next\"),\n hasReact: deps.has(\"react\"),\n\n // Linting\n hasEslint:\n exists(\"eslint.config.js\") ||\n exists(\"eslint.config.ts\") ||\n exists(\"eslint.config.mjs\") ||\n exists(\".eslintrc.js\") ||\n exists(\".eslintrc.json\") ||\n exists(\".eslintrc.yml\") ||\n exists(\".eslintrc.yaml\") ||\n deps.has(\"eslint\"),\n hasBiome: exists(\"biome.json\") || exists(\"biome.jsonc\") || deps.has(\"@biomejs/biome\"),\n hasRuff,\n hasPrettier:\n exists(\"prettier.config.js\") ||\n exists(\"prettier.config.ts\") ||\n exists(\"prettier.config.mjs\") ||\n exists(\".prettierrc\") ||\n exists(\".prettierrc.json\") ||\n deps.has(\"prettier\"),\n\n // Testing\n hasVitest: deps.has(\"vitest\") || Boolean(scripts[\"test\"]?.includes(\"vitest\")),\n hasJest: deps.has(\"jest\") || Boolean(scripts[\"test\"]?.includes(\"jest\")),\n hasPytest,\n\n // DB\n hasPrisma: exists(\"prisma/schema.prisma\") || deps.has(\"@prisma/client\"),\n hasDrizzle: deps.has(\"drizzle-orm\"),\n hasMigrations: exists(\"migrations\") || exists(\"db/migrations\") || exists(\"database/migrations\"),\n hasAlembic,\n\n // Infra\n hasDocker,\n hasTerraform,\n hasKubernetes: exists(\"k8s\") || exists(\"kubernetes\") || exists(\"helm\"),\n\n // API\n hasOpenApi:\n exists(\"openapi.yaml\") ||\n exists(\"openapi.yml\") ||\n exists(\"openapi.json\") ||\n exists(\"api/openapi.yaml\"),\n\n // CI\n hasGithubActions: exists(\".github/workflows\"),\n\n packageManager,\n scripts,\n deps,\n };\n}\n","import { execSync } from \"node:child_process\";\nimport { readdirSync, existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { CheckDef, HoldpointConfig } from \"@holdpoint/types\";\n\nexport interface StaleCheck {\n check: CheckDef;\n reason: string;\n /** Path to use in a file_exists condition, if it can be inferred from the when: regex */\n suggestedConditionPath?: string;\n}\n\n/** Named scopes handled by matchesWhen() — these are never \"stale\" (intentionally broad) */\nconst NAMED_SCOPES = new Set([\n \"frontend\",\n \"backend\",\n \"socket\",\n \"visual\",\n \"python\",\n \"go\",\n \"rust\",\n \"java\",\n \"ruby\",\n \"database\",\n \"prisma\",\n \"testing\",\n \"infra\",\n \"ci\",\n \"docs\",\n \"structural\",\n]);\n\nconst WALK_IGNORED = new Set([\n \"node_modules\",\n \".git\",\n \"dist\",\n \"build\",\n \".next\",\n \".turbo\",\n \"__pycache__\",\n \".venv\",\n \"venv\",\n \".mypy_cache\",\n \"target\",\n \".cache\",\n \"coverage\",\n]);\n\nfunction walkDir(dir: string, root: string, depth: number, maxDepth: number): string[] {\n if (depth > maxDepth) return [];\n let entries: string[] = [];\n try {\n entries = readdirSync(dir);\n } catch {\n return [];\n }\n const results: string[] = [];\n for (const entry of entries) {\n if (WALK_IGNORED.has(entry) || entry.startsWith(\".\")) continue;\n const full = join(dir, entry);\n const rel = full.slice(root.length + 1);\n results.push(rel);\n // Try to recurse (will just return [] if it's a file, not a dir)\n const children = walkDir(full, root, depth + 1, maxDepth);\n results.push(...children);\n }\n return results;\n}\n\n/**\n * Returns a list of all files in the repo (relative paths from cwd).\n * Uses `git ls-files` when available; falls back to directory walk.\n */\nexport function getRepoFiles(cwd: string): string[] {\n try {\n const out = execSync(\"git ls-files\", {\n cwd,\n encoding: \"utf8\",\n stdio: [\"pipe\", \"pipe\", \"ignore\"],\n });\n const files = out.trim().split(\"\\n\").filter(Boolean);\n if (files.length > 0) return files;\n } catch {\n // not a git repo or git not available\n }\n return walkDir(cwd, cwd, 0, 6);\n}\n\n/**\n * Try to extract a simple path hint from a regex pattern, for use as a\n * `file_exists` condition path.\n * e.g. \"^prisma/\" → \"prisma\", \"^checks\\\\.yaml$\" → \"checks.yaml\"\n */\nfunction extractPathFromRegex(pattern: string): string | undefined {\n const cleaned = pattern\n .replace(/^\\^/, \"\")\n .replace(/\\$$/, \"\")\n .replace(/\\\\\\./g, \".\")\n .replace(/\\(\\?:/g, \"\")\n .replace(/\\)/g, \"\")\n .replace(/[|*+?[\\]{}()]/g, \"\");\n const candidate = cleaned.replace(/\\/$/, \"\").trim();\n if (candidate.length > 0 && /^[\\w\\-./]+$/.test(candidate)) return candidate;\n return undefined;\n}\n\n/**\n * Detect checks whose `when:` regex pattern matches zero files in the repo.\n * Named scope whens (frontend, backend, structural, etc.) are never flagged as stale.\n * User-defined named patterns (from config.patterns) are resolved to their regex before checking.\n * Checks that already have a conditionId are skipped (already guarded).\n */\nexport function detectStaleChecks(config: HoldpointConfig, repoFiles: string[]): StaleCheck[] {\n const stale: StaleCheck[] = [];\n const userPatterns = config.patterns ?? {};\n\n for (const check of config.checks) {\n if (!check.when) continue;\n if (NAMED_SCOPES.has(check.when)) continue;\n if (check.conditionId) continue; // already guarded by a condition\n\n // Resolve user-defined named patterns to their regex value\n const patternAlias = check.when in userPatterns ? check.when : undefined;\n const regexStr = patternAlias ? userPatterns[patternAlias]! : check.when;\n\n let re: RegExp;\n try {\n re = new RegExp(regexStr);\n } catch {\n stale.push({ check, reason: `Invalid regex: '${regexStr}'` });\n continue;\n }\n\n const matches = repoFiles.filter((f) => re.test(f));\n if (matches.length === 0) {\n const label = patternAlias\n ? `Pattern '${patternAlias}' (= '${regexStr}')`\n : `Regex '${regexStr}'`;\n const suggestedConditionPath = extractPathFromRegex(regexStr);\n // Verify the suggested path doesn't actually exist either\n const pathGone =\n !suggestedConditionPath || !existsSync(join(process.cwd(), suggestedConditionPath));\n if (pathGone) {\n stale.push({\n check,\n reason: `${label} matches 0 files in the repo`,\n ...(suggestedConditionPath ? { suggestedConditionPath } : {}),\n });\n }\n }\n }\n\n return stale;\n}\n","import type { ConditionDef } from \"@holdpoint/types\";\nimport type { ProjectProfile } from \"./scanner.js\";\n\nexport interface EvolveTemplate {\n id: string;\n label: string;\n when?: string;\n cmd?: string;\n prompt?: string;\n conditionId?: string;\n /** Condition to add to checks.yaml alongside the check (only if conditionId is set) */\n condition?: Omit<ConditionDef, \"id\"> & { id: string };\n /** Returns true if this check is relevant to the given project profile */\n trigger: (p: ProjectProfile) => boolean;\n}\n\n/** Returns the correct run command for a package.json script, respecting the detected package manager. */\nfunction pmScript(profile: ProjectProfile, script: string, fallback: string): string {\n if (!profile.scripts[script]) return fallback;\n if (profile.packageManager === \"npm\") return `npm run ${script}`;\n return `${profile.packageManager} ${script}`;\n}\n\nconst blockedMarkerTerms = [\"TO\" + \"DO\", \"FIX\" + \"ME\", \"HA\" + \"CK\", \"X\" + \"XX\"];\nconst blockedMarkerLabel = `No ${blockedMarkerTerms[0]}/${blockedMarkerTerms[1]} left in changed code`;\nconst blockedMarkerPrompt =\n `Scan the files you changed for any ${blockedMarkerTerms.join(\", \")} comments. ` +\n \"Either resolve them before finishing or convert them to GitHub issues. \" +\n \"Don't leave incomplete work silently behind.\";\n\n/**\n * Returns all applicable check templates for the given project profile.\n * Caller should filter out templates whose IDs already exist in checks.yaml.\n */\nexport function getTemplates(profile: ProjectProfile): EvolveTemplate[] {\n return [\n // ── Universal checks (always proposed for any project) ──────────────────\n {\n id: \"git-commit\",\n label: \"Commit all changes before finishing\",\n cmd: 'git rev-parse --is-inside-work-tree 2>/dev/null || exit 0; [ -z \"$(git status --porcelain)\" ] && exit 0; git status --short; exit 1',\n trigger: () => true,\n },\n {\n id: \"changelog-update\",\n label: \"Add a CHANGELOG.md entry for this session\",\n prompt:\n \"Before committing, add an entry to CHANGELOG.md describing what was done. \" +\n \"Use Keep a Changelog format — add under ## [Unreleased] (create the file \" +\n \"and that section if absent). Group entries as Added, Changed, Fixed, or Removed. \" +\n \"Be concise but specific. The entry text will serve as the commit message.\",\n trigger: () => true,\n },\n {\n id: \"readme-sync\",\n label: \"Update README.md if user-facing changes were made\",\n prompt:\n \"If you added, changed, or removed user-facing functionality — CLI commands, \" +\n \"configuration options, public APIs, or significant new features — update \" +\n \"README.md to reflect those changes.\",\n trigger: () => true,\n },\n {\n id: \"no-todos\",\n label: blockedMarkerLabel,\n prompt: blockedMarkerPrompt,\n trigger: () => true,\n },\n\n // ── TypeScript / JavaScript ──────────────────────────────────────────────\n {\n id: \"typecheck\",\n label: \"TypeScript type check\",\n cmd: pmScript(profile, \"typecheck\", \"npx tsc --noEmit\"),\n trigger: (p) => p.hasTypeScript,\n },\n {\n id: \"lint\",\n label: \"Lint codebase\",\n cmd: profile.hasEslint\n ? pmScript(profile, \"lint\", \"npx eslint .\")\n : profile.hasBiome\n ? pmScript(profile, \"lint\", \"npx @biomejs/biome check .\")\n : pmScript(profile, \"lint\", \"echo 'No linter detected'\"),\n trigger: (p) => p.hasEslint || p.hasBiome,\n },\n {\n id: \"format-check\",\n label: \"Prettier — format check\",\n cmd: pmScript(profile, \"format:check\", \"npx prettier --check .\"),\n trigger: (p) => p.hasPrettier,\n },\n {\n id: \"test\",\n label: \"Unit tests\",\n cmd: profile.hasVitest\n ? pmScript(profile, \"test\", \"npx vitest run\")\n : pmScript(profile, \"test\", \"npx jest --passWithNoTests\"),\n trigger: (p) => p.hasVitest || p.hasJest,\n },\n {\n id: \"jsdoc\",\n label: \"JSDoc on changed public functions\",\n prompt:\n \"Ensure all changed public functions, classes, and module exports have \" +\n \"accurate JSDoc comments (description + @param + @returns where applicable).\",\n trigger: (p) => p.hasTypeScript || p.hasReact,\n },\n {\n id: \"build\",\n label: \"Production build passes\",\n cmd: pmScript(profile, \"build\", \"echo 'No build script detected'\"),\n trigger: (p) => Boolean(p.scripts[\"build\"]),\n },\n\n // ── Python ───────────────────────────────────────────────────────────────\n {\n id: \"python-lint\",\n label: \"Ruff — Python linting\",\n cmd: \"ruff check .\",\n when: \"python\",\n trigger: (p) => p.hasPython && p.hasRuff,\n },\n {\n id: \"python-test\",\n label: \"Pytest — Python unit tests\",\n cmd: \"pytest\",\n when: \"python\",\n trigger: (p) => p.hasPython && p.hasPytest,\n },\n\n // ── Go ───────────────────────────────────────────────────────────────────\n {\n id: \"go-test\",\n label: \"Go tests\",\n cmd: \"go test ./...\",\n when: \"go\",\n trigger: (p) => p.hasGo,\n },\n {\n id: \"go-vet\",\n label: \"Go vet\",\n cmd: \"go vet ./...\",\n when: \"go\",\n trigger: (p) => p.hasGo,\n },\n\n // ── Database ─────────────────────────────────────────────────────────────\n {\n id: \"db-migrations\",\n label: \"Database migration for schema changes\",\n when: \"database\",\n prompt:\n \"If schema or migration files changed, ensure the appropriate migration was \" +\n \"generated with your ORM tool (e.g. `prisma migrate dev`, `alembic revision`, \" +\n \"`rails db:migrate`) and committed alongside the schema change.\",\n trigger: (p) => p.hasPrisma || p.hasAlembic || p.hasMigrations || p.hasDrizzle,\n },\n {\n id: \"prisma-format\",\n label: \"Prisma schema format check\",\n when: \"prisma\",\n cmd: \"npx prisma format --check 2>/dev/null || npx prisma format\",\n conditionId: \"has-prisma\",\n condition: {\n id: \"has-prisma\",\n operator: \"file_exists\",\n path: \"prisma/schema.prisma\",\n },\n trigger: (p) => p.hasPrisma,\n },\n\n // ── OpenAPI ──────────────────────────────────────────────────────────────\n {\n id: \"openapi-sync\",\n label: \"OpenAPI spec updated for API changes\",\n when: \"backend\",\n conditionId: \"has-openapi\",\n condition: {\n id: \"has-openapi\",\n operator: \"file_exists\",\n path: \"openapi.yaml\",\n },\n prompt:\n \"If any API routes were added or changed, update openapi.yaml (or openapi.json) \" +\n \"to reflect the new endpoints, request/response shapes, and error codes.\",\n trigger: (p) => p.hasOpenApi,\n },\n\n // ── Infra ─────────────────────────────────────────────────────────────────\n {\n id: \"docker-build\",\n label: \"Docker build passes\",\n when: \"infra\",\n cmd: \"docker build . --quiet -t app:ci\",\n conditionId: \"has-dockerfile\",\n condition: {\n id: \"has-dockerfile\",\n operator: \"file_exists\",\n path: \"Dockerfile\",\n },\n trigger: (p) => p.hasDocker,\n },\n {\n id: \"terraform-validate\",\n label: \"Terraform validate\",\n when: \"infra\",\n cmd: \"terraform validate\",\n trigger: (p) => p.hasTerraform,\n },\n\n // ── Frontend ─────────────────────────────────────────────────────────────\n {\n id: \"i18n\",\n label: \"i18n — no hardcoded user-facing strings\",\n when: \"frontend\",\n prompt:\n \"Confirm all user-visible strings are wrapped in the project's i18n function \" +\n \"(e.g. `t()`, `useTranslation`, `<Trans>`) and that locale files are updated \" +\n \"for any new copy.\",\n trigger: (p) => p.hasNext && p.hasReact,\n },\n ];\n}\n","import chalk from \"chalk\";\nimport { ensureDaemon } from \"../lib/ensure-daemon.js\";\nimport { openBrowser } from \"../lib/open-browser.js\";\nimport { appendProjectAuthParams, tryResolveCurrentProject } from \"../lib/project.js\";\n\ninterface LiveCommandOptions {\n project?: string;\n}\n\nexport async function liveCommand(options: LiveCommandOptions = {}): Promise<void> {\n const { info, started } = await ensureDaemon();\n const baseUrl = new URL(`/__holdpoint/live-auth`, `http://127.0.0.1:${info.port}`);\n baseUrl.searchParams.set(\"token\", info.token);\n baseUrl.searchParams.set(\"path\", \"/live/\");\n\n const currentProject = options.project ? null : tryResolveCurrentProject();\n if (options.project) {\n baseUrl.searchParams.set(\"project\", options.project);\n } else if (currentProject) {\n appendProjectAuthParams(baseUrl, currentProject);\n }\n\n openBrowser(baseUrl.toString());\n\n console.log(\n chalk.green(\n started ? \"✓ Started Holdpoint Live and opened the browser\" : \"✓ Opened Holdpoint Live\",\n ),\n );\n console.log(` url: ${chalk.cyan(baseUrl.toString())}`);\n}\n","import chalk from \"chalk\";\nimport {\n DaemonAlreadyRunningError,\n isProcessAlive,\n readDaemonLock,\n readHealthyDaemonLock,\n removeDaemonLock,\n startDaemonProcess,\n type DaemonLock,\n} from \"@holdpoint/live-daemon\";\nimport { ensureDaemon } from \"../lib/ensure-daemon.js\";\nimport { CLI_VERSION } from \"../version.js\";\n\nfunction formatUptime(lock: DaemonLock): string {\n const seconds = Math.max(0, Math.floor((Date.now() - lock.started_at) / 1000));\n const minutes = Math.floor(seconds / 60);\n const remainingSeconds = seconds % 60;\n return minutes > 0 ? `${minutes}m ${remainingSeconds}s` : `${remainingSeconds}s`;\n}\n\nasync function fetchSessionCount(lock: DaemonLock): Promise<number | null> {\n try {\n const response = await fetch(`http://127.0.0.1:${lock.port}/v1/sessions`, {\n headers: {\n authorization: `Bearer ${lock.token}`,\n },\n });\n if (!response.ok) return null;\n const parsed = (await response.json()) as { sessions?: unknown[] };\n return Array.isArray(parsed.sessions) ? parsed.sessions.length : null;\n } catch {\n return null;\n }\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolvePromise) => setTimeout(resolvePromise, ms));\n}\n\nexport async function daemonStartCommand(): Promise<void> {\n const { info, started } = await ensureDaemon();\n const sessionCount = await fetchSessionCount(info);\n const headline = started\n ? \"Started Holdpoint Live daemon\"\n : \"Reused existing Holdpoint Live daemon\";\n console.log(chalk.green(`✓ ${headline}`));\n console.log(` pid: ${chalk.cyan(String(info.pid))}`);\n console.log(` port: ${chalk.cyan(String(info.port))}`);\n console.log(` uptime: ${chalk.cyan(formatUptime(info))}`);\n if (sessionCount !== null) {\n console.log(` sessions: ${chalk.cyan(String(sessionCount))}`);\n }\n}\n\nexport async function daemonStatusCommand(): Promise<void> {\n const lock = await readHealthyDaemonLock();\n if (!lock) {\n console.log(chalk.yellow(\"Holdpoint Live daemon is not running.\"));\n return;\n }\n\n const sessionCount = await fetchSessionCount(lock);\n console.log(chalk.green(\"✓ Holdpoint Live daemon is running\"));\n console.log(` pid: ${chalk.cyan(String(lock.pid))}`);\n console.log(` port: ${chalk.cyan(String(lock.port))}`);\n console.log(` uptime: ${chalk.cyan(formatUptime(lock))}`);\n if (sessionCount !== null) {\n console.log(` sessions: ${chalk.cyan(String(sessionCount))}`);\n }\n}\n\nexport async function daemonStopCommand(): Promise<void> {\n const lock = readDaemonLock();\n if (!lock) {\n console.log(chalk.yellow(\"Holdpoint Live daemon is not running.\"));\n return;\n }\n\n if (!isProcessAlive(lock.pid)) {\n removeDaemonLock(undefined, lock.token);\n console.log(chalk.yellow(\"Removed stale Holdpoint Live lockfile.\"));\n return;\n }\n\n process.kill(lock.pid, \"SIGTERM\");\n const deadline = Date.now() + 5_000;\n while (Date.now() < deadline) {\n if (!isProcessAlive(lock.pid)) {\n removeDaemonLock(undefined, lock.token);\n console.log(chalk.green(`✓ Stopped Holdpoint Live daemon (${lock.pid})`));\n return;\n }\n await sleep(100);\n }\n\n process.kill(lock.pid, \"SIGKILL\");\n await sleep(100);\n removeDaemonLock(undefined, lock.token);\n console.log(chalk.green(`✓ Force-stopped Holdpoint Live daemon (${lock.pid})`));\n}\n\nexport async function daemonServeCommand(options: { port?: string }): Promise<void> {\n try {\n const daemon = await startDaemonProcess({\n version: CLI_VERSION,\n ...(options.port ? { port: Number(options.port) } : {}),\n });\n await daemon.closed;\n } catch (error) {\n if (error instanceof DaemonAlreadyRunningError) {\n process.exit(0);\n }\n throw error;\n }\n}\n","export const CLI_VERSION = \"0.1.0-alpha.15\";\n","import chalk from \"chalk\";\nimport { discoverLiveEngines } from \"../engines.js\";\n\nexport async function enginesCommand(options: { json?: boolean } = {}): Promise<void> {\n const engines = await discoverLiveEngines();\n\n if (options.json) {\n console.log(JSON.stringify(engines, null, 2));\n return;\n }\n\n if (engines.length === 0) {\n console.log(\"No Holdpoint Live engines were discovered.\");\n return;\n }\n\n for (const engine of engines) {\n if (engine.status === \"loaded\" && engine.manifest) {\n console.log(\n `${chalk.green(\"loaded\")} ${chalk.cyan(engine.manifest.id)} (${engine.manifest.displayName}) ` +\n `from ${chalk.yellow(engine.packageName)} [${engine.source}]`,\n );\n continue;\n }\n\n console.log(\n `${chalk.yellow(\"ignored\")} ${chalk.yellow(engine.packageName)} [${engine.source}] — ${engine.reason ?? \"unknown reason\"}`,\n );\n }\n}\n","import { existsSync, readFileSync } from \"node:fs\";\nimport { dirname, join, resolve, sep } from \"node:path\";\nimport { createRequire } from \"node:module\";\nimport { fileURLToPath, pathToFileURL } from \"node:url\";\nimport { parseEventV1 } from \"@holdpoint/live-protocol\";\nimport type { LiveCapabilities } from \"@holdpoint/live-protocol\";\nimport type { HoldpointEngineManifest, LiveAdapter } from \"@holdpoint/sdk\";\n\nconst require = createRequire(import.meta.url);\nconst CLI_SRC_DIR = dirname(fileURLToPath(import.meta.url));\nconst MONOREPO_ROOT = resolve(CLI_SRC_DIR, \"../../..\");\nconst BUILTIN_LIVE_ENGINE_PACKAGES = [\n \"@holdpoint/engine-claude\",\n \"@holdpoint/engine-codex\",\n \"@holdpoint/engine-cursor\",\n] as const;\nconst HOLDPOINT_ENGINE_KEYWORD = \"holdpoint-engine\";\n\nexport type LiveEngineSource = \"built-in\" | \"dependency\";\n\nexport interface DiscoveredLiveEngine {\n packageName: string;\n source: LiveEngineSource;\n status: \"loaded\" | \"ignored\";\n reason?: string;\n manifest?: HoldpointEngineManifest;\n}\n\ninterface HoldpointPackageMetadata {\n manifest?: string;\n adapter?: string;\n}\n\ninterface ResolvedLiveEngine extends DiscoveredLiveEngine {\n packageRoot?: string;\n adapterPath?: string;\n}\n\nfunction isObject(value: unknown): value is Record<string, unknown> {\n return value != null && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction isExternalLiveEnginePackageName(packageName: string): boolean {\n return (\n /^holdpoint-engine-[a-z0-9-]+$/.test(packageName) ||\n /^@[a-z0-9_.-]+\\/holdpoint-engine-[a-z0-9-]+$/.test(packageName)\n );\n}\n\nfunction readJsonFile(path: string): Record<string, unknown> | null {\n if (!existsSync(path)) {\n return null;\n }\n try {\n const parsed = JSON.parse(readFileSync(path, \"utf8\"));\n return isObject(parsed) ? parsed : null;\n } catch {\n return null;\n }\n}\n\nfunction findNearestPackageRoot(startDir: string): string {\n let current = resolve(startDir);\n while (true) {\n if (existsSync(join(current, \"package.json\"))) {\n return current;\n }\n const parent = dirname(current);\n if (parent === current) {\n return resolve(startDir);\n }\n current = parent;\n }\n}\n\nfunction findPackageRootFromFile(path: string): string | null {\n let current = dirname(path);\n while (true) {\n if (existsSync(join(current, \"package.json\"))) {\n return current;\n }\n const parent = dirname(current);\n if (parent === current) {\n return null;\n }\n current = parent;\n }\n}\n\nfunction getDependencyEnginePackageNames(projectRoot: string): string[] {\n const packageJson = readJsonFile(join(projectRoot, \"package.json\"));\n if (!packageJson) {\n return [];\n }\n\n const packageNames = new Set<string>();\n for (const field of [\"dependencies\", \"devDependencies\", \"optionalDependencies\"]) {\n const deps = packageJson[field];\n if (!isObject(deps)) {\n continue;\n }\n for (const packageName of Object.keys(deps)) {\n if (isExternalLiveEnginePackageName(packageName)) {\n packageNames.add(packageName);\n }\n }\n }\n\n return [...packageNames];\n}\n\nfunction resolvePackageRoot(packageName: string, projectRoot: string): string | null {\n try {\n const entryPath = require.resolve(packageName);\n return findPackageRootFromFile(entryPath);\n } catch {\n // Fall through to project-local lookup for external adapters.\n }\n\n try {\n const entryPath = require.resolve(packageName, {\n paths: [projectRoot, process.cwd()],\n });\n return findPackageRootFromFile(entryPath);\n } catch {\n // Fall through to package.json lookup for packages without an exports entry.\n }\n\n try {\n const packageJsonPath = require.resolve(`${packageName}/package.json`, {\n paths: [projectRoot, process.cwd()],\n });\n return dirname(packageJsonPath);\n } catch {\n if (packageName.startsWith(\"@holdpoint/\")) {\n const scopedName = packageName.split(\"/\")[1];\n if (scopedName) {\n const packageDir = resolve(MONOREPO_ROOT, \"packages\", scopedName);\n if (existsSync(join(packageDir, \"package.json\"))) {\n return packageDir;\n }\n }\n }\n return null;\n }\n}\n\nfunction formatImportError(error: unknown): string {\n return error instanceof Error && error.message ? error.message : String(error);\n}\n\nfunction parseManifest(value: unknown): HoldpointEngineManifest | null {\n if (!isObject(value)) {\n return null;\n }\n if (value.manifestVersion !== 1) {\n return null;\n }\n if (typeof value.id !== \"string\" || !/^[a-z0-9-]+$/.test(value.id)) {\n return null;\n }\n if (typeof value.displayName !== \"string\" || !value.displayName.trim()) {\n return null;\n }\n return {\n manifestVersion: 1,\n id: value.id,\n displayName: value.displayName,\n };\n}\n\nfunction parseLiveCapabilities(value: unknown): LiveCapabilities | null {\n if (!isObject(value)) {\n return null;\n }\n\n const capabilities: LiveCapabilities = {};\n for (const key of [\n \"can_stream\",\n \"can_control\",\n \"can_modify_context\",\n \"can_register_tools\",\n \"control_online\",\n ] as const) {\n const entry = value[key];\n if (entry === undefined) {\n continue;\n }\n if (typeof entry !== \"boolean\") {\n return null;\n }\n capabilities[key] = entry;\n }\n\n return capabilities;\n}\n\nfunction parseLiveAdapter(value: unknown, manifest: HoldpointEngineManifest): LiveAdapter | null {\n if (!isObject(value)) {\n return null;\n }\n if (typeof value.id !== \"string\" || typeof value.displayName !== \"string\") {\n return null;\n }\n if (value.id !== manifest.id || value.displayName !== manifest.displayName) {\n return null;\n }\n const capabilities = parseLiveCapabilities(value.capabilities);\n if (!capabilities) {\n return null;\n }\n const generateBridgeCommand = value.generateBridgeCommand;\n if (typeof generateBridgeCommand !== \"function\") {\n return null;\n }\n const translateHookInput = value.translateHookInput;\n if (typeof translateHookInput !== \"function\") {\n return null;\n }\n return {\n id: value.id,\n displayName: value.displayName,\n capabilities,\n generateBridgeCommand: () => {\n const command = generateBridgeCommand();\n if (typeof command !== \"string\") {\n throw new Error(\"adapter.generateBridgeCommand() must return a string\");\n }\n return command;\n },\n translateHookInput: (raw, options) => {\n const event = translateHookInput(raw, options);\n return event == null ? null : parseEventV1(event);\n },\n };\n}\n\nasync function importModule(modulePath: string): Promise<Record<string, unknown>> {\n const moduleUrl = pathToFileURL(modulePath).href;\n return (await import(moduleUrl)) as Record<string, unknown>;\n}\n\nfunction resolvePackageAssetPath(packageRoot: string, relativePath: string): string {\n const declaredPath = resolve(packageRoot, relativePath);\n const sourceFallback = resolve(\n packageRoot,\n relativePath.replace(/^\\.\\/dist\\//, \"./src/\").replace(/\\.js$/, \".ts\"),\n );\n if (\n packageRoot.startsWith(resolve(MONOREPO_ROOT, \"packages\") + sep) &&\n existsSync(sourceFallback)\n ) {\n return sourceFallback;\n }\n if (existsSync(declaredPath)) {\n return declaredPath;\n }\n return sourceFallback;\n}\n\nasync function resolveCandidate(\n packageName: string,\n source: LiveEngineSource,\n projectRoot: string,\n): Promise<ResolvedLiveEngine> {\n const packageRoot = resolvePackageRoot(packageName, projectRoot);\n if (!packageRoot) {\n return {\n packageName,\n source,\n status: \"ignored\",\n reason: \"package could not be resolved from this project\",\n };\n }\n\n const packageJson = readJsonFile(join(packageRoot, \"package.json\"));\n if (!packageJson) {\n return {\n packageName,\n source,\n status: \"ignored\",\n reason: \"package.json could not be read\",\n };\n }\n\n const keywords = Array.isArray(packageJson.keywords) ? packageJson.keywords : [];\n if (!keywords.includes(HOLDPOINT_ENGINE_KEYWORD)) {\n return {\n packageName,\n source,\n status: \"ignored\",\n reason: `missing \\`${HOLDPOINT_ENGINE_KEYWORD}\\` keyword`,\n };\n }\n\n const metadata = isObject(packageJson.holdpoint)\n ? (packageJson.holdpoint as HoldpointPackageMetadata)\n : undefined;\n if (!metadata?.manifest) {\n return {\n packageName,\n source,\n status: \"ignored\",\n reason: \"missing `holdpoint.manifest` package.json field\",\n };\n }\n if (!metadata.adapter) {\n return {\n packageName,\n source,\n status: \"ignored\",\n reason: \"missing `holdpoint.adapter` package.json field\",\n };\n }\n\n const manifestPath = resolvePackageAssetPath(packageRoot, metadata.manifest);\n const adapterPath = resolvePackageAssetPath(packageRoot, metadata.adapter);\n if (!existsSync(manifestPath)) {\n return {\n packageName,\n source,\n status: \"ignored\",\n reason: \"manifest file does not exist\",\n };\n }\n if (!existsSync(adapterPath)) {\n return {\n packageName,\n source,\n status: \"ignored\",\n reason: \"adapter file does not exist\",\n };\n }\n\n try {\n const manifestModule = await importModule(manifestPath);\n const manifest = parseManifest(manifestModule.manifest);\n if (!manifest) {\n return {\n packageName,\n source,\n status: \"ignored\",\n reason: \"manifest export is invalid\",\n };\n }\n return {\n packageName,\n source,\n status: \"loaded\",\n manifest,\n packageRoot,\n adapterPath,\n };\n } catch (error) {\n return {\n packageName,\n source,\n status: \"ignored\",\n reason: `manifest import failed: ${formatImportError(error)}`,\n };\n }\n}\n\nasync function discoverLiveEnginesDetailed(options?: {\n cwd?: string;\n}): Promise<ResolvedLiveEngine[]> {\n const projectRoot = findNearestPackageRoot(options?.cwd ?? process.cwd());\n const dependencyPackages = getDependencyEnginePackageNames(projectRoot);\n const seenPackages = new Set<string>();\n const results: ResolvedLiveEngine[] = [];\n const loadedIds = new Set<string>();\n\n const candidates: Array<{ packageName: string; source: LiveEngineSource }> = [\n ...BUILTIN_LIVE_ENGINE_PACKAGES.map((packageName) => ({\n packageName,\n source: \"built-in\" as const,\n })),\n ...dependencyPackages.map((packageName) => ({ packageName, source: \"dependency\" as const })),\n ];\n\n for (const candidate of candidates) {\n if (seenPackages.has(candidate.packageName)) {\n continue;\n }\n seenPackages.add(candidate.packageName);\n const result = await resolveCandidate(candidate.packageName, candidate.source, projectRoot);\n if (result.status === \"loaded\" && result.manifest) {\n if (loadedIds.has(result.manifest.id)) {\n results.push({\n packageName: result.packageName,\n source: result.source,\n status: \"ignored\",\n reason: `engine id \\`${result.manifest.id}\\` collides with an already loaded adapter`,\n manifest: result.manifest,\n });\n continue;\n }\n loadedIds.add(result.manifest.id);\n }\n results.push(result);\n }\n\n return results;\n}\n\nexport async function discoverLiveEngines(options?: {\n cwd?: string;\n}): Promise<DiscoveredLiveEngine[]> {\n const results = await discoverLiveEnginesDetailed(options);\n return results.map(({ packageName, source, status, reason, manifest }) => ({\n packageName,\n source,\n status,\n ...(reason ? { reason } : {}),\n ...(manifest ? { manifest } : {}),\n }));\n}\n\nexport async function loadLiveAdapter(\n engineId: string,\n options?: { cwd?: string },\n): Promise<LiveAdapter | null> {\n const results = await discoverLiveEnginesDetailed(options);\n const match = results.find(\n (result) => result.status === \"loaded\" && result.manifest?.id === engineId,\n );\n if (!match?.adapterPath || !match.manifest) {\n return null;\n }\n\n try {\n const adapterModule = await importModule(match.adapterPath);\n return parseLiveAdapter(adapterModule.adapter, match.manifest);\n } catch {\n return null;\n }\n}\n","import { readFileSync } from \"node:fs\";\nimport { parseEventV1, parseEventsBatch } from \"@holdpoint/live-protocol\";\nimport { BridgeClient } from \"@holdpoint/sdk\";\nimport { loadLiveAdapter } from \"../engines.js\";\n\nfunction readStdin(): string {\n return readFileSync(0, \"utf8\");\n}\n\nexport async function eventCommand(options: {\n engine?: string;\n fromHook?: boolean;\n}): Promise<void> {\n const stdin = readStdin().trim();\n if (!stdin) {\n if (options.fromHook) {\n process.exit(0);\n }\n console.error(\"No JSON input received on stdin.\");\n process.exit(3);\n }\n\n let raw: unknown;\n try {\n raw = JSON.parse(stdin);\n } catch {\n if (options.fromHook) {\n process.exit(0);\n }\n console.error(\"Invalid JSON input.\");\n process.exit(3);\n }\n\n const client = new BridgeClient();\n\n try {\n if (options.fromHook) {\n if (!options.engine) {\n process.exit(0);\n }\n const adapter = await loadLiveAdapter(options.engine);\n if (!adapter) {\n process.exit(0);\n }\n const event = adapter.translateHookInput(raw, { cwd: process.cwd() });\n if (!event) {\n process.exit(0);\n }\n await client.sendEvent(event);\n process.exit(0);\n }\n\n if (Array.isArray(raw)) {\n await client.sendEvents(parseEventsBatch(raw));\n } else {\n await client.sendEvent(parseEventV1(raw));\n }\n } catch (error) {\n console.error((error as Error).message);\n process.exit(3);\n }\n}\n","import { execSync } from \"node:child_process\";\nimport { existsSync, readdirSync, readFileSync, statSync, type Stats } from \"node:fs\";\nimport { join, relative } from \"node:path\";\nimport chalk from \"chalk\";\n\ninterface RequireChangesetOptions {\n staged?: boolean;\n include?: string[];\n}\n\ninterface PackageRoot {\n path: string;\n name: string;\n private: boolean;\n}\n\ninterface ChangesetCheckInput {\n changedFiles: string[];\n packageRoots: PackageRoot[];\n}\n\nconst IGNORED_DIRS = new Set([\n \".git\",\n \".next\",\n \".turbo\",\n \"coverage\",\n \"dist\",\n \"node_modules\",\n \"test-results\",\n]);\n\nfunction runGit(command: string): string[] {\n try {\n const out = execSync(command, {\n encoding: \"utf8\",\n stdio: [\"pipe\", \"pipe\", \"ignore\"],\n });\n return out.trim().split(\"\\n\").filter(Boolean);\n } catch {\n return [];\n }\n}\n\nfunction readJson(path: string): Record<string, unknown> | null {\n try {\n return JSON.parse(readFileSync(path, \"utf8\")) as Record<string, unknown>;\n } catch {\n return null;\n }\n}\n\nfunction normalizePath(path: string): string {\n return path.replace(/\\\\/g, \"/\").replace(/^\\.\\//, \"\");\n}\n\nfunction getDefaultBranchRef(): string | null {\n const [symbolic] = runGit(\"git symbolic-ref --quiet --short refs/remotes/origin/HEAD\");\n if (symbolic) return symbolic;\n const candidates = [\"origin/main\", \"origin/master\"];\n for (const candidate of candidates) {\n if (runGit(`git rev-parse --verify ${candidate}`).length > 0) {\n return candidate;\n }\n }\n return null;\n}\n\nfunction getBranchChangedFiles(): string[] {\n const defaultBranch = getDefaultBranchRef();\n if (!defaultBranch) return [];\n const [base] = runGit(`git merge-base HEAD ${defaultBranch}`);\n if (!base) return [];\n return runGit(`git diff --name-only ${base}...HEAD`);\n}\n\nfunction uniqueFiles(files: string[]): string[] {\n return [...new Set(files.map(normalizePath))];\n}\n\nfunction getChangedFiles(options: RequireChangesetOptions): string[] {\n const staged = runGit(\"git diff --cached --name-only\");\n if (options.staged && staged.length > 0) return staged;\n const untracked = runGit(\"git ls-files --others --exclude-standard\");\n if (!options.staged) {\n const unstaged = runGit(\"git diff --name-only HEAD\");\n const workingTree = uniqueFiles([...unstaged, ...untracked]);\n if (workingTree.length > 0) return workingTree;\n }\n\n const branch = getBranchChangedFiles();\n if (branch.length > 0 || untracked.length > 0) return uniqueFiles([...branch, ...untracked]);\n\n return runGit(\"git diff --name-only HEAD~1 HEAD\");\n}\n\nfunction toRegex(pattern: string): RegExp {\n const normalized = normalizePath(pattern);\n let source = \"\";\n for (let i = 0; i < normalized.length; i += 1) {\n const char = normalized[i]!;\n const next = normalized[i + 1];\n if (char === \"*\" && next === \"*\") {\n source += \".*\";\n i += 1;\n continue;\n }\n if (char === \"*\") {\n source += \"[^/]+\";\n continue;\n }\n source += char.replace(/[|\\\\{}()[\\]^$+?.]/g, \"\\\\$&\");\n }\n return new RegExp(`^${source}$`);\n}\n\nfunction matchesAny(path: string, patterns: string[]): boolean {\n return patterns.some((pattern) => toRegex(pattern).test(path));\n}\n\nfunction parsePnpmWorkspacePatterns(): string[] {\n if (!existsSync(\"pnpm-workspace.yaml\")) return [];\n const lines = readFileSync(\"pnpm-workspace.yaml\", \"utf8\").split(/\\r?\\n/);\n return lines\n .map((line) => line.match(/^\\s*-\\s*['\"]?([^'\"]+)['\"]?\\s*$/)?.[1])\n .filter((line): line is string => Boolean(line))\n .filter((line) => !line.startsWith(\"!\"));\n}\n\nfunction expandOneLevelWorkspacePattern(pattern: string): string[] {\n const normalized = normalizePath(pattern).replace(/\\/package\\.json$/, \"\");\n if (!normalized.includes(\"*\")) {\n return existsSync(join(normalized, \"package.json\")) ? [normalized] : [];\n }\n\n const starIndex = normalized.indexOf(\"*\");\n const parent = normalized.slice(0, starIndex).replace(/\\/$/, \"\");\n const suffix = normalized.slice(starIndex + 1).replace(/^\\//, \"\");\n if (!parent || suffix.includes(\"*\") || !existsSync(parent)) {\n return [];\n }\n\n return readdirSync(parent)\n .map((entry) => join(parent, entry, suffix))\n .map(normalizePath)\n .filter((candidate) => existsSync(join(candidate, \"package.json\")));\n}\n\nfunction walkPackageRoots(start: string, roots: string[]): void {\n let entries: string[];\n try {\n entries = readdirSync(start);\n } catch {\n return;\n }\n\n if (start !== \".\" && existsSync(join(start, \"package.json\"))) {\n roots.push(normalizePath(start));\n return;\n }\n\n for (const entry of entries) {\n if (IGNORED_DIRS.has(entry)) continue;\n const candidate = join(start, entry);\n let stats: Stats;\n try {\n stats = statSync(candidate);\n } catch {\n continue;\n }\n if (stats.isDirectory()) {\n walkPackageRoots(candidate, roots);\n }\n }\n}\n\nfunction readPackageRoot(path: string): PackageRoot | null {\n const pkg = readJson(join(path, \"package.json\"));\n if (!pkg) return null;\n return {\n path: normalizePath(path === \".\" ? \"\" : path),\n name: typeof pkg.name === \"string\" ? pkg.name : path || \"root\",\n private: pkg.private === true,\n };\n}\n\nfunction discoverPackageRoots(includePatterns: string[] = []): PackageRoot[] {\n const explicitRoots = includePatterns.flatMap(expandOneLevelWorkspacePattern);\n if (explicitRoots.length > 0) {\n return uniquePackageRoots(\n explicitRoots.map(readPackageRoot).filter((pkg): pkg is PackageRoot => Boolean(pkg)),\n );\n }\n\n const rootPackage = readJson(\"package.json\");\n const workspacePatterns = [\n ...parsePnpmWorkspacePatterns(),\n ...extractPackageJsonWorkspacePatterns(rootPackage),\n ];\n const workspaceRoots = workspacePatterns.flatMap(expandOneLevelWorkspacePattern);\n if (workspaceRoots.length > 0) {\n return uniquePackageRoots(\n workspaceRoots\n .map(readPackageRoot)\n .filter((pkg): pkg is PackageRoot => Boolean(pkg))\n .filter((pkg) => !pkg.private),\n );\n }\n\n const discovered: string[] = [];\n walkPackageRoots(\".\", discovered);\n const roots = discovered.length > 0 ? discovered : existsSync(\"package.json\") ? [\".\"] : [];\n return uniquePackageRoots(\n roots\n .map(readPackageRoot)\n .filter((pkg): pkg is PackageRoot => Boolean(pkg))\n .filter((pkg) => !pkg.private),\n );\n}\n\nfunction extractPackageJsonWorkspacePatterns(pkg: Record<string, unknown> | null): string[] {\n const workspaces = pkg?.workspaces;\n if (Array.isArray(workspaces)) {\n return workspaces.filter((entry): entry is string => typeof entry === \"string\");\n }\n if (\n workspaces &&\n typeof workspaces === \"object\" &&\n \"packages\" in workspaces &&\n Array.isArray((workspaces as { packages?: unknown }).packages)\n ) {\n return (workspaces as { packages: unknown[] }).packages.filter(\n (entry): entry is string => typeof entry === \"string\",\n );\n }\n return [];\n}\n\nfunction uniquePackageRoots(packages: PackageRoot[]): PackageRoot[] {\n const byPath = new Map<string, PackageRoot>();\n for (const pkg of packages) {\n byPath.set(pkg.path, pkg);\n }\n return [...byPath.values()].sort((left, right) => right.path.length - left.path.length);\n}\n\nfunction isChangesetFile(file: string): boolean {\n return /^\\.changeset\\/(?!README\\.md$)[^/]+\\.md$/.test(file);\n}\n\nfunction isReleaseAffectingPackageFile(relativePath: string): boolean {\n if (\n /(^|\\/)(__tests__|test|tests|spec|e2e)\\//.test(relativePath) ||\n /\\.(test|spec)\\.[cm]?[jt]sx?$/.test(relativePath)\n ) {\n return false;\n }\n if (\n relativePath === \"README.md\" ||\n relativePath === \"CHANGELOG.md\" ||\n relativePath.startsWith(\"docs/\") ||\n relativePath.startsWith(\"dist/\") ||\n relativePath.startsWith(\"coverage/\")\n ) {\n return false;\n }\n return /^(package\\.json|src\\/|lib\\/|bin\\/|templates\\/|scripts\\/|[^/]+\\.config\\.)/.test(\n relativePath,\n );\n}\n\nfunction findPackageForFile(file: string, packageRoots: PackageRoot[]): PackageRoot | null {\n const normalized = normalizePath(file);\n return (\n packageRoots.find((pkg) => {\n if (pkg.path === \"\") return true;\n return normalized === pkg.path || normalized.startsWith(`${pkg.path}/`);\n }) ?? null\n );\n}\n\nfunction analyzeChangesetRequirement(input: ChangesetCheckInput): {\n requiredFiles: { file: string; packageName: string }[];\n hasChangeset: boolean;\n} {\n const changedFiles = input.changedFiles.map(normalizePath);\n const hasChangeset = changedFiles.some(isChangesetFile);\n const requiredFiles = changedFiles.flatMap((file) => {\n if (file.startsWith(\".changeset/\")) return [];\n const pkg = findPackageForFile(file, input.packageRoots);\n if (!pkg) return [];\n const relativePath = pkg.path === \"\" ? file : normalizePath(relative(pkg.path, file));\n if (!isReleaseAffectingPackageFile(relativePath)) return [];\n return [{ file, packageName: pkg.name }];\n });\n return { requiredFiles, hasChangeset };\n}\n\nexport async function requireChangesetCommand(options: RequireChangesetOptions): Promise<void> {\n const changedFiles = getChangedFiles(options);\n if (changedFiles.length === 0) {\n console.log(chalk.green(\"✓ No changed files detected — no changeset required.\"));\n return;\n }\n\n const packageRoots = discoverPackageRoots(options.include ?? []);\n if (packageRoots.length === 0) {\n console.log(chalk.green(\"✓ No package roots detected — no changeset required.\"));\n return;\n }\n\n const hasChangesetSetup = existsSync(\".changeset\");\n const { requiredFiles, hasChangeset } = analyzeChangesetRequirement({\n changedFiles,\n packageRoots,\n });\n if (requiredFiles.length === 0) {\n console.log(chalk.green(\"✓ No release-affecting package files changed.\"));\n return;\n }\n if (hasChangeset) {\n console.log(chalk.green(\"✓ Package changes include a changeset.\"));\n return;\n }\n\n console.error(chalk.red(\"✗ Package changes need a changeset.\"));\n console.error(\"\");\n console.error(chalk.bold(\"Changed package files:\"));\n for (const item of requiredFiles.slice(0, 12)) {\n console.error(` - ${item.file} (${item.packageName})`);\n }\n if (requiredFiles.length > 12) {\n console.error(` - …and ${requiredFiles.length - 12} more`);\n }\n console.error(\"\");\n if (!hasChangesetSetup) {\n console.error(\n \"No .changeset directory was found. Create one and add a changeset before finishing:\",\n );\n console.error(chalk.yellow(\" mkdir -p .changeset\"));\n } else {\n console.error(\"Add a changeset before finishing:\");\n }\n console.error(chalk.yellow(\" pnpm changeset\"));\n console.error(chalk.dim(\" or add a .changeset/<name>.md file manually\"));\n process.exit(1);\n}\n\nexport const changesetTestInternals = {\n analyzeChangesetRequirement,\n discoverPackageRoots,\n isReleaseAffectingPackageFile,\n matchesAny,\n toRegex,\n};\n"],"mappings":"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","names":["execSync","existsSync","readFileSync","writeFileSync","mkdirSync","join","dirname","fileURLToPath","chalk","existsSync","isObject","asHookArray","existsSync","readFileSync","writeFileSync","dirname","sep","__dirname","dirname","fileURLToPath","join","existsSync","chalk","readFileSync","writeFileSync","mkdirSync","execSync","existsSync","readFileSync","writeFileSync","mkdirSync","join","chalk","ora","parseHoldpointYaml","execSync","existsSync","readFileSync","chalk","parseHoldpointYaml","existsSync","readFileSync","writeFileSync","mkdirSync","chalk","ora","parseHoldpointYaml","buildConfigJson","buildEngine","buildClaudeEngineJson","buildCursorCheckScript","buildCursorEngine","buildCursorHooksJson","buildCodexConfigToml","buildCodexHooksJson","buildCodexCheckScript","MINIMAL_PREREQUISITES","MINIMAL_HOLDPOINT_REFERENCE","existsSync","chalk","ora","parseHoldpointYaml","readFileSync","mkdirSync","writeFileSync","buildConfigJson","buildEngine","buildClaudeEngineJson","buildCursorHooksJson","buildCursorCheckScript","buildCursorEngine","buildCodexHooksJson","buildCodexCheckScript","buildCodexConfigToml","chalk","execSync","existsSync","dirname","join","identifyProject","chalk","existsSync","readFileSync","writeFileSync","execSync","chalk","ora","parseHoldpointYaml","existsSync","readFileSync","join","execSync","existsSync","join","execSync","readdirSync","existsSync","join","existsSync","chalk","ora","readFileSync","parseHoldpointYaml","writeFileSync","execSync","chalk","chalk","chalk","readHealthyDaemonLock","sleep","chalk","readHealthyDaemonLock","daemon","chalk","existsSync","readFileSync","dirname","join","fileURLToPath","require","isObject","chalk","readFileSync","parseEventV1","BridgeClient","readFileSync","BridgeClient","parseEventV1","execSync","existsSync","readdirSync","readFileSync","join","chalk","existsSync","readFileSync","join","readdirSync","chalk"]}
|