@holdpoint/cli 0.1.0-alpha.2 → 0.1.0-alpha.21

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.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/commands/init.ts","../src/detect.ts","../src/commands/check.ts","../src/evolve/scanner.ts","../src/evolve/templates.ts","../src/evolve/dead-checker.ts","../src/commands/validate.ts","../src/commands/update.ts","../src/commands/build.ts","../src/commands/evolve.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\";\n\nconst program = new Command();\n\nprogram\n .name(\"holdpoint\")\n .description(\"Universal eval-guard for AI coding agents (alpha)\")\n .version(\"0.1.0-alpha.2\");\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(\"--agent <agent>\", \"Agent type: copilot | claude | cursor\")\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(\"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 { existsSync, readFileSync, writeFileSync, mkdirSync, copyFileSync } from \"node:fs\";\nimport { join, dirname } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport chalk from \"chalk\";\nimport ora from \"ora\";\nimport { buildHookJson, buildCheckScript, buildConfigJson } from \"@holdpoint/engine-copilot\";\nimport { buildEngineJson as buildClaudeEngineJson } from \"@holdpoint/engine-claude\";\nimport { buildEngine as buildCursorEngine } from \"@holdpoint/engine-cursor\";\nimport { parseHoldpointYaml } from \"@holdpoint/yaml-core\";\nimport type { AgentType, StackType } from \"@holdpoint/types\";\nimport { detectAgent, detectStack } from \"../detect.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\nfunction getMasterPromptPath(): string {\n const candidates = [\n join(__dirname, \"templates/MASTER_PROMPT.md\"), // dist/templates/ (published package)\n join(__dirname, \"../../../templates/MASTER_PROMPT.md\"), // monorepo dev fallback\n join(process.cwd(), \"templates/MASTER_PROMPT.md\"), // 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\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 const agent = (options.agent as AgentType | undefined) ?? detectAgent();\n\n spinner.text = `Detected stack: ${chalk.cyan(stack)}, agent: ${chalk.cyan(agent)}`;\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 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\n if (agent === \"copilot\" || agent === \"unknown\") {\n const hooksDir = \".github/hooks\";\n mkdirSync(hooksDir, { recursive: true });\n writeFileSync(join(hooksDir, \"holdpoint.json\"), buildHookJson(config), \"utf8\");\n writeFileSync(join(hooksDir, \"holdpoint-check.mjs\"), buildCheckScript(config), \"utf8\");\n }\n\n if (agent === \"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 (agent === \"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 // 4. Create MASTER_PROMPT.md if not present\n if (!existsSync(\"MASTER_PROMPT.md\")) {\n const guidePath = getMasterPromptPath();\n if (guidePath) {\n copyFileSync(guidePath, \"MASTER_PROMPT.md\");\n } else {\n // Fallback: minimal prompt if template file is not bundled\n writeFileSync(\n \"MASTER_PROMPT.md\",\n \"# Holdpoint\\n\\nRun `npx @holdpoint/cli@alpha check` before marking any task complete.\\nSee `checks.yaml` for the full list of checks.\\n\",\n \"utf8\",\n );\n }\n }\n\n spinner.succeed(chalk.bold.green(\"Holdpoint initialised!\"));\n\n console.log(`\n${chalk.cyan(\"Next steps:\")}\n 1. Edit ${chalk.yellow(\"checks.yaml\")} to customise your eval checkpoints\n 2. Commit ${chalk.yellow(\"checks.yaml\")} and the generated engine files\n 3. Run ${chalk.yellow(\"npx @holdpoint/cli@alpha check\")} at any time to validate\n\n Visual builder: ${chalk.yellow(\"npx @holdpoint/cli@alpha builder\")} (opens localhost:4321)\n Stack: ${chalk.cyan(stack)} Agent: ${chalk.cyan(agent)}\n`);\n}\n","import { existsSync } from \"node:fs\";\nimport type { AgentType, StackType } from \"@holdpoint/types\";\n\nexport function detectAgent(): AgentType {\n // Copilot CLI: check for extensions dir or copilot binary in path\n if (existsSync(\".github/extensions\")) return \"copilot\";\n // Claude Code: check for .claude dir\n if (existsSync(\".claude\")) return \"claude\";\n // Cursor: check for .cursorrules\n if (existsSync(\".cursorrules\")) return \"cursor\";\n return \"unknown\";\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 { existsSync, readFileSync } from \"node:fs\";\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 } from \"@holdpoint/types\";\nimport { execSync } from \"node:child_process\";\nimport { scanProject } from \"../evolve/scanner.js\";\nimport { getTemplates } from \"../evolve/templates.js\";\nimport { detectStaleChecks, getRepoFiles } from \"../evolve/dead-checker.js\";\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\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 const changedFiles = options.staged ? getStagedFiles() : getAllChangedFiles();\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 if (changedFiles.length === 0) {\n console.log(chalk.yellow(\"No changed files detected. Running all checks with no file filter.\"));\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 // Built-in structural drift detection — hardcoded into holdpoint, not user-configurable.\n // Fires when structural indicator files changed (or when all checks run with no staged files).\n const runDrift = matchesWhen(\"structural\", effectiveFiles);\n if (runDrift) {\n const profile = scanProject();\n const existingIds = new Set(config.checks.map((c) => c.id));\n const templates = getTemplates(profile);\n const proposals = templates.filter((t) => t.trigger(profile) && !existingIds.has(t.id));\n const repoFiles = getRepoFiles(process.cwd());\n const staleChecks = detectStaleChecks(config, repoFiles);\n\n if (proposals.length > 0 || staleChecks.length > 0) {\n const lines: string[] = [];\n if (proposals.length > 0) {\n lines.push(`${proposals.length} new check(s) available for your project stack:`);\n for (const p of proposals) lines.push(` + ${p.label}`);\n }\n if (staleChecks.length > 0) {\n lines.push(`${staleChecks.length} stale check(s) no longer match your project:`);\n for (const s of staleChecks) lines.push(` - ${s.check.label}: ${s.reason}`);\n }\n lines.push(\"\\nRun: npx @holdpoint/cli@alpha evolve --apply\");\n results.push({\n check: { id: \"__holdpoint_evolve__\", label: \"Evolve checks with project structure\" },\n status: \"fail\",\n output: lines.join(\"\\n\"),\n });\n }\n }\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 if (failed.length > 0) {\n process.exit(1);\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, 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 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 { 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 { 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 { buildHookJson, buildCheckScript, buildConfigJson } from \"@holdpoint/engine-copilot\";\nimport { buildEngineJson as buildClaudeEngineJson } from \"@holdpoint/engine-claude\";\nimport { buildEngine as buildCursorEngine } from \"@holdpoint/engine-cursor\";\nimport { detectAgent } from \"../detect.js\";\nimport type { AgentType } from \"@holdpoint/types\";\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 agent = detectAgent();\n const config = parseHoldpointYaml(readFileSync(\"checks.yaml\", \"utf8\"));\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 (agent === \"copilot\" || agent === \"unknown\") {\n const hooksDir = \".github/hooks\";\n mkdirSync(hooksDir, { recursive: true });\n writeFileSync(`${hooksDir}/holdpoint.json`, buildHookJson(config), \"utf8\");\n writeFileSync(`${hooksDir}/holdpoint-check.mjs`, buildCheckScript(config), \"utf8\");\n spinner.text = `Updated ${chalk.green(\".github/hooks/holdpoint.json\")} and ${chalk.green(\".github/hooks/holdpoint-check.mjs\")}`;\n }\n\n if (agent === \"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(settingsPath, JSON.stringify({ ...existing, hooks: hooks.hooks }, null, 2));\n }\n\n if (agent === \"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 spinner.succeed(chalk.green(\"Engine files updated from current checks.yaml\"));\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`, and all other paths as static files from `uiDir` with\n * 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 // 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"],"mappings":"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","names":["existsSync","existsSync","existsSync","readFileSync","chalk","ora","parseHoldpointYaml","execSync","existsSync","readFileSync","join","existsSync","join","execSync","readdirSync","existsSync","join","execSync","existsSync","chalk","readFileSync","parseHoldpointYaml","ora","existsSync","readFileSync","chalk","parseHoldpointYaml","existsSync","readFileSync","writeFileSync","mkdirSync","chalk","ora","parseHoldpointYaml","buildHookJson","buildCheckScript","buildConfigJson","buildClaudeEngineJson","buildCursorEngine","existsSync","chalk","ora","parseHoldpointYaml","readFileSync","mkdirSync","writeFileSync","buildConfigJson","buildHookJson","buildCheckScript","buildClaudeEngineJson","buildCursorEngine","existsSync","join","dirname","fileURLToPath","execSync","chalk","__dirname","existsSync","readFileSync","writeFileSync","execSync","chalk","ora","parseHoldpointYaml","existsSync","chalk","ora","readFileSync","parseHoldpointYaml","writeFileSync","execSync"]}
1
+ {"version":3,"sources":["../src/index.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 .option(\"--hook <event>\", \"Only run checks bound to this lifecycle hook (default: before_done)\")\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 { 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, HookEvent } from \"@holdpoint/types\";\nimport { HOOK_EVENTS, checkHook } 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; hook?: string }): Promise<void> {\n const hook: HookEvent =\n options.hook && (HOOK_EVENTS as string[]).includes(options.hook)\n ? (options.hook as HookEvent)\n : \"before_done\";\n if (!existsSync(\"checks.yaml\")) {\n // Three flavours of \"no checks.yaml here\":\n // 1. Agent hook fired with --staged → no prompting possible, never reached\n // in practice (hooks only exist if init ran) but fail-fast on the\n // pathological case so a misconfigured engine doesn't loop silently.\n // 2. Interactive shell on TTY → offer to bootstrap via `init`. This is\n // the cd-into-fresh-repo case for users who installed holdpoint\n // globally and expect it to \"just work\" wherever they run it.\n // 3. Non-TTY non-staged (CI, piped scripts) → print the actionable\n // error and exit, same as before. Don't silently bootstrap.\n if (options.staged || !process.stdout.isTTY || !process.stdin.isTTY) {\n console.error(chalk.red(\"No checks.yaml found. Run `holdpoint init` first.\"));\n process.exit(1);\n }\n const { promptYesNo } = await import(\"../lib/prompt.js\");\n console.log(\n chalk.yellow(\"No checks.yaml in this directory.\") +\n chalk.dim(\" (\") +\n process.cwd() +\n chalk.dim(\")\"),\n );\n const shouldInit = await promptYesNo(chalk.bold(\"Initialise Holdpoint here?\"), true);\n if (!shouldInit) {\n console.error(chalk.dim(\"Skipped. Run `holdpoint init` when you're ready.\"));\n process.exit(1);\n }\n const { initCommand } = await import(\"./init.js\");\n await initCommand({});\n // init prints its own preflight + next-steps block. We deliberately don't\n // continue to run checks afterwards — the user just got bootstrapped and\n // hasn't reviewed the generated checks.yaml yet. Tell them what's next\n // and exit cleanly so they can iterate before the first real run.\n console.log(\n chalk.dim(\"\\nReview \") +\n chalk.yellow(\"checks.yaml\") +\n chalk.dim(\" and run \") +\n chalk.yellow(\"holdpoint check\") +\n chalk.dim(\" again when you're ready.\"),\n );\n return;\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(\n (c) => c.cmd !== undefined && checkHook(c) === hook,\n ).length;\n const spinner = ora(`Running ${taskCount} task(s)…`).start();\n const effectiveFiles = changedFiles.length > 0 ? changedFiles : [\"__all__\"];\n const results = runDeterministicChecks(config, effectiveFiles, hook);\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 fire as advisory reminders RELATIVE to a diff. With no\n // changed files (fresh init, scratch repo, no commits yet), the old\n // behavior used \"__all__\" as a fallback that matched every `when:` scope\n // and printed every prompt — which on the unified default.yaml meant a\n // 12-line wall of universal advice the user hadn't asked for. Suppress\n // the prompt list in that mode and print one informational line instead.\n const promptChecks =\n changedFiles.length > 0\n ? config.checks.filter(\n (c) =>\n c.prompt !== undefined &&\n checkHook(c) === hook &&\n matchesWhen(c.when, changedFiles, config.patterns),\n )\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 } else if (changedFiles.length === 0) {\n const totalPromptChecks = config.checks.filter((c) => c.prompt !== undefined).length;\n if (totalPromptChecks > 0) {\n console.log(\n chalk.dim(\n `\\n (${totalPromptChecks} prompt-style checks defined; they fire relative to changed files — none surfaced with no diff context)`,\n ),\n );\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 check editor through the singleton daemon.\n *\n * The builder is now the \"Checks\" tab of the unified Live UI, so this opens\n * `/live/?tab=checks` — one browser surface, one auth flow, and one localhost\n * 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\", \"/live/\");\n url.searchParams.set(\"tab\", \"checks\");\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 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 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 // Release tooling\n hasChangesets: 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 // Release tooling — gates the `changelog-update` suggest template,\n // since projects using changesets get release notes from .changeset\n // files automatically and don't want a manual-CHANGELOG-entry check.\n hasChangesets: exists(\".changeset/config.json\"),\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 // Don't propose this for changesets-using projects — those get\n // release notes from .changeset/*.md files automatically and the\n // sibling `changelog-changeset` check is what they should use\n // instead. Proposing both would be confusing and contradictory.\n trigger: (p) => !p.hasChangesets,\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":["initCommand","existsSync","readFileSync","chalk","parseHoldpointYaml","existsSync","readFileSync","writeFileSync","mkdirSync","chalk","ora","parseHoldpointYaml","existsSync","chalk","ora","parseHoldpointYaml","readFileSync","mkdirSync","writeFileSync","chalk","execSync","existsSync","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","require","chalk","readFileSync","parseEventV1","BridgeClient","readFileSync","BridgeClient","parseEventV1","execSync","existsSync","readdirSync","readFileSync","join","chalk","existsSync","readFileSync","join","readdirSync","chalk"]}
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ initCommand
4
+ } from "./chunk-D7ZF5JJH.js";
5
+ export {
6
+ initCommand
7
+ };
8
+ //# sourceMappingURL=init-Y7NZBMU6.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}