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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ # MIT License
2
+
3
+ Copyright (c) 2024 Sentinel
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/dist/index.js CHANGED
@@ -142,7 +142,7 @@ async function initCommand(options) {
142
142
  } else {
143
143
  writeFileSync(
144
144
  "MASTER_PROMPT.md",
145
- "# Holdpoint\n\nRun `npx holdpoint check` before marking any task complete.\nSee `checks.yaml` for the full list of checks.\n",
145
+ "# Holdpoint\n\nRun `npx @holdpoint/cli@alpha check` before marking any task complete.\nSee `checks.yaml` for the full list of checks.\n",
146
146
  "utf8"
147
147
  );
148
148
  }
@@ -152,9 +152,9 @@ async function initCommand(options) {
152
152
  ${chalk.cyan("Next steps:")}
153
153
  1. Edit ${chalk.yellow("checks.yaml")} to customise your eval checkpoints
154
154
  2. Commit ${chalk.yellow("checks.yaml")} and the generated engine files
155
- 3. Run ${chalk.yellow("npx holdpoint check")} at any time to validate
155
+ 3. Run ${chalk.yellow("npx @holdpoint/cli@alpha check")} at any time to validate
156
156
 
157
- Visual builder: ${chalk.yellow("npx holdpoint builder")} (opens localhost:4321)
157
+ Visual builder: ${chalk.yellow("npx @holdpoint/cli@alpha builder")} (opens localhost:4321)
158
158
  Stack: ${chalk.cyan(stack)} Agent: ${chalk.cyan(agent)}
159
159
  `);
160
160
  }
@@ -592,7 +592,7 @@ async function checkCommand(options) {
592
592
  lines.push(`${staleChecks.length} stale check(s) no longer match your project:`);
593
593
  for (const s of staleChecks) lines.push(` - ${s.check.label}: ${s.reason}`);
594
594
  }
595
- lines.push("\nRun: npx holdpoint evolve --apply");
595
+ lines.push("\nRun: npx @holdpoint/cli@alpha evolve --apply");
596
596
  results.push({
597
597
  check: { id: "__holdpoint_evolve__", label: "Evolve checks with project structure" },
598
598
  status: "fail",
@@ -916,7 +916,7 @@ async function evolveCommand(options) {
916
916
  console.log(
917
917
  chalk6.red(`
918
918
  \u2717 checks.yaml is out of sync with the project profile.`) + `
919
- Run ${chalk6.bold("npx holdpoint evolve --apply")} to apply these changes.`
919
+ Run ${chalk6.bold("npx @holdpoint/cli@alpha evolve --apply")} to apply these changes.`
920
920
  );
921
921
  process.exit(1);
922
922
  }
@@ -960,7 +960,7 @@ async function evolveCommand(options) {
960
960
  writeFileSync3("checks.yaml", newYaml, "utf8");
961
961
  applySpinner.text = "Running holdpoint update\u2026";
962
962
  try {
963
- execSync5("npx holdpoint update", { stdio: "pipe" });
963
+ execSync5("npx @holdpoint/cli@alpha update", { stdio: "pipe" });
964
964
  } catch {
965
965
  applySpinner.warn(
966
966
  chalk6.yellow("checks.yaml updated, but `holdpoint update` failed \u2014 run it manually.")
@@ -984,7 +984,7 @@ function printAppliedSummary(added, wrapped) {
984
984
 
985
985
  // src/index.ts
986
986
  var program = new Command();
987
- program.name("holdpoint").description("Universal eval-guard for AI coding agents (alpha)").version("0.1.0-alpha.0");
987
+ program.name("holdpoint").description("Universal eval-guard for AI coding agents (alpha)").version("0.1.0-alpha.2");
988
988
  program.command("init").description("Initialise Holdpoint in the current project").option("--stack <stack>", "Stack type: typescript | python | nextjs | fullstack").option("--agent <agent>", "Agent type: copilot | claude | cursor").action(initCommand);
989
989
  program.command("check").description("Run task checks from checks.yaml").option("--staged", "Only check against git-staged files").action(checkCommand);
990
990
  program.command("validate").description("Validate checks.yaml schema and print any errors").action(validateCommand);
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.0\");\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 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 check\")} at any time to validate\n\n Visual builder: ${chalk.yellow(\"npx holdpoint 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 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 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 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/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":";;;AAAA,SAAS,eAAe;;;ACAxB,SAAS,cAAAA,aAAY,cAAc,eAAe,WAAW,oBAAoB;AACjF,SAAS,MAAM,eAAe;AAC9B,SAAS,qBAAqB;AAC9B,OAAO,WAAW;AAClB,OAAO,SAAS;AAChB,SAAS,eAAe,kBAAkB,uBAAuB;AACjE,SAAS,mBAAmB,6BAA6B;AACzD,SAAS,eAAe,yBAAyB;AACjD,SAAS,0BAA0B;;;ACRnC,SAAS,kBAAkB;AAGpB,SAAS,cAAyB;AAEvC,MAAI,WAAW,oBAAoB,EAAG,QAAO;AAE7C,MAAI,WAAW,SAAS,EAAG,QAAO;AAElC,MAAI,WAAW,cAAc,EAAG,QAAO;AACvC,SAAO;AACT;AAEO,SAAS,cAAyB;AACvC,QAAM,UACJ,WAAW,gBAAgB,KAAK,WAAW,gBAAgB,KAAK,WAAW,iBAAiB;AAC9F,QAAM,cAAc,WAAW,eAAe;AAC9C,QAAM,eACJ,WAAW,gBAAgB,KAAK,WAAW,kBAAkB,KAAK,WAAW,UAAU;AACzF,QAAM,YAAY,WAAW,sBAAsB;AACnD,QAAM,SAAS,WAAW,QAAQ,KAAK,WAAW,KAAK,KAAK,WAAW,SAAS;AAChF,QAAM,WAAW,WAAW,QAAQ;AAEpC,MAAI,YAAY,aAAa,QAAS,QAAO;AAC7C,MAAI,QAAS,QAAO;AACpB,MAAI,YAAa,QAAO;AACxB,MAAI,aAAc,QAAO;AACzB,MAAI,SAAU,QAAO;AACrB,SAAO;AACT;;;ADjBA,IAAM,YAAY,QAAQ,cAAc,YAAY,GAAG,CAAC;AAExD,SAAS,gBAAgB,OAA0B;AACjD,QAAM,OAAO,UAAU,YAAY,UAAU;AAC7C,QAAM,aAAa;AAAA,IACjB,KAAK,WAAW,aAAa,GAAG,IAAI,OAAO;AAAA;AAAA,IAC3C,KAAK,WAAW,sBAAsB,GAAG,IAAI,OAAO;AAAA;AAAA,IACpD,KAAK,QAAQ,IAAI,GAAG,aAAa,GAAG,IAAI,OAAO;AAAA;AAAA,EACjD;AACA,aAAW,KAAK,YAAY;AAC1B,QAAIC,YAAW,CAAC,EAAG,QAAO;AAAA,EAC5B;AACA,SAAO;AACT;AAEA,SAAS,sBAA8B;AACrC,QAAM,aAAa;AAAA,IACjB,KAAK,WAAW,4BAA4B;AAAA;AAAA,IAC5C,KAAK,WAAW,qCAAqC;AAAA;AAAA,IACrD,KAAK,QAAQ,IAAI,GAAG,4BAA4B;AAAA;AAAA,EAClD;AACA,aAAW,KAAK,YAAY;AAC1B,QAAIA,YAAW,CAAC,EAAG,QAAO;AAAA,EAC5B;AACA,SAAO;AACT;AAEA,IAAM,sBAAsB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAc5B,eAAsB,YAAY,SAA4D;AAC5F,QAAM,UAAU,IAAI,8BAAyB,EAAE,MAAM;AAErD,QAAM,QAAS,QAAQ,SAAmC,YAAY;AACtE,QAAM,QAAS,QAAQ,SAAmC,YAAY;AAEtE,UAAQ,OAAO,mBAAmB,MAAM,KAAK,KAAK,CAAC,YAAY,MAAM,KAAK,KAAK,CAAC;AAGhF,MAAI,cAAc;AAClB,MAAI,CAACA,YAAW,aAAa,GAAG;AAC9B,UAAM,eAAe,gBAAgB,KAAK;AAC1C,QAAI,cAAc;AAChB,oBAAc,aAAa,cAAc,MAAM;AAAA,IACjD;AACA,kBAAc,eAAe,aAAa,MAAM;AAAA,EAClD,OAAO;AACL,kBAAc,aAAa,eAAe,MAAM;AAAA,EAClD;AAEA,QAAM,SAAS,mBAAmB,WAAW;AAG7C,QAAM,eAAe;AACrB,YAAU,cAAc,EAAE,WAAW,KAAK,CAAC;AAC3C,gBAAc,GAAG,YAAY,0BAA0B,gBAAgB,MAAM,GAAG,MAAM;AAGtF,MAAI,UAAU,aAAa,UAAU,WAAW;AAC9C,UAAM,WAAW;AACjB,cAAU,UAAU,EAAE,WAAW,KAAK,CAAC;AACvC,kBAAc,KAAK,UAAU,gBAAgB,GAAG,cAAc,MAAM,GAAG,MAAM;AAC7E,kBAAc,KAAK,UAAU,qBAAqB,GAAG,iBAAiB,MAAM,GAAG,MAAM;AAAA,EACvF;AAEA,MAAI,UAAU,UAAU;AACtB,cAAU,WAAW,EAAE,WAAW,KAAK,CAAC;AACxC,UAAM,eAAe;AACrB,QAAI,WAAoC,CAAC;AACzC,QAAIA,YAAW,YAAY,GAAG;AAC5B,UAAI;AACF,mBAAW,KAAK,MAAM,aAAa,cAAc,MAAM,CAAC;AAAA,MAC1D,QAAQ;AAAA,MAER;AAAA,IACF;AACA,UAAM,iBAAiB,KAAK,MAAM,sBAAsB,MAAM,CAAC;AAC/D;AAAA,MACE;AAAA,MACA,KAAK,UAAU,EAAE,GAAG,UAAU,OAAO,eAAe,MAAM,GAAG,MAAM,CAAC;AAAA,MACpE;AAAA,IACF;AAAA,EACF;AAEA,MAAI,UAAU,UAAU;AACtB,UAAM,cAAc,kBAAkB,MAAM;AAC5C,UAAM,aAAa;AACnB,QAAIA,YAAW,UAAU,GAAG;AAC1B,YAAM,WAAW,aAAa,YAAY,MAAM;AAChD,UAAI,CAAC,SAAS,SAAS,iBAAiB,GAAG;AACzC,sBAAc,YAAY,WAAW,OAAO,aAAa,MAAM;AAAA,MACjE;AAAA,IACF,OAAO;AACL,oBAAc,YAAY,aAAa,MAAM;AAAA,IAC/C;AAAA,EACF;AAGA,MAAI,CAACA,YAAW,kBAAkB,GAAG;AACnC,UAAM,YAAY,oBAAoB;AACtC,QAAI,WAAW;AACb,mBAAa,WAAW,kBAAkB;AAAA,IAC5C,OAAO;AAEL;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,UAAQ,QAAQ,MAAM,KAAK,MAAM,wBAAwB,CAAC;AAE1D,UAAQ,IAAI;AAAA,EACZ,MAAM,KAAK,aAAa,CAAC;AAAA,YACf,MAAM,OAAO,aAAa,CAAC;AAAA,cACzB,MAAM,OAAO,aAAa,CAAC;AAAA,WAC9B,MAAM,OAAO,gCAAgC,CAAC;AAAA;AAAA,oBAErC,MAAM,OAAO,kCAAkC,CAAC;AAAA,WACzD,MAAM,KAAK,KAAK,CAAC,YAAY,MAAM,KAAK,KAAK,CAAC;AAAA,CACxD;AACD;;;AElJA,SAAS,cAAAC,aAAY,gBAAAC,qBAAoB;AACzC,OAAOC,YAAW;AAClB,OAAOC,UAAS;AAChB,SAAS,sBAAAC,qBAAoB,mBAAmB;AAChD,SAAS,8BAA8B;AAEvC,SAAS,YAAAC,iBAAgB;;;ACNzB,SAAS,cAAAC,aAAY,gBAAAC,eAAc,mBAAmB;AACtD,SAAS,QAAAC,aAAY;AACrB,SAAS,gBAAgB;AAiDzB,SAAS,YAAe,MAAwB;AAC9C,MAAI;AACF,WAAO,KAAK,MAAMD,cAAa,MAAM,MAAM,CAAC;AAAA,EAC9C,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,YAAY,MAAsB;AACzC,MAAI;AACF,WAAOA,cAAa,MAAM,MAAM;AAAA,EAClC,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AA6JO,SAAS,YAAY,MAAM,QAAQ,IAAI,GAAmB;AAC/D,QAAM,SAAS,CAAC,MAAcE,YAAWC,MAAK,KAAK,CAAC,CAAC;AAGrD,QAAM,iBAAmD,OAAO,gBAAgB,IAC5E,SACA,OAAO,WAAW,IAChB,SACA,OAAO,WAAW,IAChB,QACA;AAGR,QAAM,MAAM,YAAqBA,MAAK,KAAK,cAAc,CAAC;AAC1D,QAAM,UAAU,KAAK,WAAW,CAAC;AACjC,QAAM,OAAO,oBAAI,IAAY;AAAA,IAC3B,GAAG,OAAO,KAAK,KAAK,gBAAgB,CAAC,CAAC;AAAA,IACtC,GAAG,OAAO,KAAK,KAAK,mBAAmB,CAAC,CAAC;AAAA,EAC3C,CAAC;AAGD,QAAM,gBAAgB,YAAYA,MAAK,KAAK,gBAAgB,CAAC;AAC7D,QAAM,mBAAmB,YAAYA,MAAK,KAAK,kBAAkB,CAAC;AAClE,QAAM,cAAc,YAAYA,MAAK,KAAK,SAAS,CAAC;AACpD,QAAM,YAAY,gBAAgB,mBAAmB;AAErD,QAAM,YACJ,OAAO,YAAY,KACnB,OAAO,WAAW,KAClB,UAAU,SAAS,QAAQ,KAC3B,UAAU,SAAS,cAAc;AACnC,QAAM,UAAU,UAAU,SAAS,MAAM,KAAK,KAAK,IAAI,MAAM;AAC7D,QAAM,aAAa,UAAU,SAAS,SAAS,KAAK,KAAK,IAAI,SAAS;AAGtE,MAAI,YAAsB,CAAC;AAC3B,MAAI;AACF,gBAAY,YAAY,GAAG;AAAA,EAC7B,QAAQ;AAAA,EAER;AAEA,QAAM,YACJ,UAAU,KAAK,CAAC,MAAM,MAAM,gBAAgB,EAAE,WAAW,aAAa,CAAC,KACvE,OAAO,oBAAoB,KAC3B,OAAO,qBAAqB,KAC5B,OAAO,wBAAwB;AAEjC,QAAM,eACJ,UAAU,KAAK,CAAC,MAAM,EAAE,SAAS,KAAK,CAAC,KAAK,OAAO,WAAW,KAAK,OAAO,OAAO;AAEnF,SAAO;AAAA;AAAA,IAEL,eAAe,OAAO,eAAe,KAAK,KAAK,IAAI,YAAY;AAAA,IAC/D,WACE,QAAQ,aAAa,KACrB,QAAQ,gBAAgB,KACxB,QAAQ,WAAW,KACnB,OAAO,UAAU;AAAA,IACnB,OAAO,OAAO,QAAQ;AAAA,IACtB,SAAS,OAAO,YAAY;AAAA,IAC5B,SAAS,OAAO,SAAS,KAAK,OAAO,cAAc,KAAK,OAAO,kBAAkB;AAAA,IACjF,SAAS,OAAO,SAAS;AAAA;AAAA,IAGzB,SACE,OAAO,gBAAgB,KACvB,OAAO,gBAAgB,KACvB,OAAO,iBAAiB,KACxB,KAAK,IAAI,MAAM;AAAA,IACjB,UAAU,KAAK,IAAI,OAAO;AAAA;AAAA,IAG1B,WACE,OAAO,kBAAkB,KACzB,OAAO,kBAAkB,KACzB,OAAO,mBAAmB,KAC1B,OAAO,cAAc,KACrB,OAAO,gBAAgB,KACvB,OAAO,eAAe,KACtB,OAAO,gBAAgB,KACvB,KAAK,IAAI,QAAQ;AAAA,IACnB,UAAU,OAAO,YAAY,KAAK,OAAO,aAAa,KAAK,KAAK,IAAI,gBAAgB;AAAA,IACpF;AAAA,IACA,aACE,OAAO,oBAAoB,KAC3B,OAAO,oBAAoB,KAC3B,OAAO,qBAAqB,KAC5B,OAAO,aAAa,KACpB,OAAO,kBAAkB,KACzB,KAAK,IAAI,UAAU;AAAA;AAAA,IAGrB,WAAW,KAAK,IAAI,QAAQ,KAAK,QAAQ,QAAQ,MAAM,GAAG,SAAS,QAAQ,CAAC;AAAA,IAC5E,SAAS,KAAK,IAAI,MAAM,KAAK,QAAQ,QAAQ,MAAM,GAAG,SAAS,MAAM,CAAC;AAAA,IACtE;AAAA;AAAA,IAGA,WAAW,OAAO,sBAAsB,KAAK,KAAK,IAAI,gBAAgB;AAAA,IACtE,YAAY,KAAK,IAAI,aAAa;AAAA,IAClC,eAAe,OAAO,YAAY,KAAK,OAAO,eAAe,KAAK,OAAO,qBAAqB;AAAA,IAC9F;AAAA;AAAA,IAGA;AAAA,IACA;AAAA,IACA,eAAe,OAAO,KAAK,KAAK,OAAO,YAAY,KAAK,OAAO,MAAM;AAAA;AAAA,IAGrE,YACE,OAAO,cAAc,KACrB,OAAO,aAAa,KACpB,OAAO,cAAc,KACrB,OAAO,kBAAkB;AAAA;AAAA,IAG3B,kBAAkB,OAAO,mBAAmB;AAAA,IAE5C;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;ACvUA,SAAS,SAAS,SAAyB,QAAgB,UAA0B;AACnF,MAAI,CAAC,QAAQ,QAAQ,MAAM,EAAG,QAAO;AACrC,MAAI,QAAQ,mBAAmB,MAAO,QAAO,WAAW,MAAM;AAC9D,SAAO,GAAG,QAAQ,cAAc,IAAI,MAAM;AAC5C;AAMO,SAAS,aAAa,SAA2C;AACtE,SAAO;AAAA;AAAA,IAEL;AAAA,MACE,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,KAAK;AAAA,MACL,SAAS,MAAM;AAAA,IACjB;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,QACE;AAAA,MAIF,SAAS,MAAM;AAAA,IACjB;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,QACE;AAAA,MAGF,SAAS,MAAM;AAAA,IACjB;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,QACE;AAAA,MAGF,SAAS,MAAM;AAAA,IACjB;AAAA;AAAA,IAGA;AAAA,MACE,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,KAAK,SAAS,SAAS,aAAa,kBAAkB;AAAA,MACtD,SAAS,CAAC,MAAM,EAAE;AAAA,IACpB;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,KAAK,QAAQ,YACT,SAAS,SAAS,QAAQ,cAAc,IACxC,QAAQ,WACN,SAAS,SAAS,QAAQ,4BAA4B,IACtD,SAAS,SAAS,QAAQ,2BAA2B;AAAA,MAC3D,SAAS,CAAC,MAAM,EAAE,aAAa,EAAE;AAAA,IACnC;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,KAAK,SAAS,SAAS,gBAAgB,wBAAwB;AAAA,MAC/D,SAAS,CAAC,MAAM,EAAE;AAAA,IACpB;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,KAAK,QAAQ,YACT,SAAS,SAAS,QAAQ,gBAAgB,IAC1C,SAAS,SAAS,QAAQ,4BAA4B;AAAA,MAC1D,SAAS,CAAC,MAAM,EAAE,aAAa,EAAE;AAAA,IACnC;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,QACE;AAAA,MAEF,SAAS,CAAC,MAAM,EAAE,iBAAiB,EAAE;AAAA,IACvC;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,KAAK,SAAS,SAAS,SAAS,iCAAiC;AAAA,MACjE,SAAS,CAAC,MAAM,QAAQ,EAAE,QAAQ,OAAO,CAAC;AAAA,IAC5C;AAAA;AAAA,IAGA;AAAA,MACE,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,KAAK;AAAA,MACL,MAAM;AAAA,MACN,SAAS,CAAC,MAAM,EAAE,aAAa,EAAE;AAAA,IACnC;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,KAAK;AAAA,MACL,MAAM;AAAA,MACN,SAAS,CAAC,MAAM,EAAE,aAAa,EAAE;AAAA,IACnC;AAAA;AAAA,IAGA;AAAA,MACE,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,KAAK;AAAA,MACL,MAAM;AAAA,MACN,SAAS,CAAC,MAAM,EAAE;AAAA,IACpB;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,KAAK;AAAA,MACL,MAAM;AAAA,MACN,SAAS,CAAC,MAAM,EAAE;AAAA,IACpB;AAAA;AAAA,IAGA;AAAA,MACE,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,MAAM;AAAA,MACN,QACE;AAAA,MAGF,SAAS,CAAC,MAAM,EAAE,aAAa,EAAE,cAAc,EAAE,iBAAiB,EAAE;AAAA,IACtE;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,MAAM;AAAA,MACN,KAAK;AAAA,MACL,aAAa;AAAA,MACb,WAAW;AAAA,QACT,IAAI;AAAA,QACJ,UAAU;AAAA,QACV,MAAM;AAAA,MACR;AAAA,MACA,SAAS,CAAC,MAAM,EAAE;AAAA,IACpB;AAAA;AAAA,IAGA;AAAA,MACE,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,MAAM;AAAA,MACN,aAAa;AAAA,MACb,WAAW;AAAA,QACT,IAAI;AAAA,QACJ,UAAU;AAAA,QACV,MAAM;AAAA,MACR;AAAA,MACA,QACE;AAAA,MAEF,SAAS,CAAC,MAAM,EAAE;AAAA,IACpB;AAAA;AAAA,IAGA;AAAA,MACE,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,MAAM;AAAA,MACN,KAAK;AAAA,MACL,aAAa;AAAA,MACb,WAAW;AAAA,QACT,IAAI;AAAA,QACJ,UAAU;AAAA,QACV,MAAM;AAAA,MACR;AAAA,MACA,SAAS,CAAC,MAAM,EAAE;AAAA,IACpB;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,MAAM;AAAA,MACN,KAAK;AAAA,MACL,SAAS,CAAC,MAAM,EAAE;AAAA,IACpB;AAAA;AAAA,IAGA;AAAA,MACE,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,MAAM;AAAA,MACN,QACE;AAAA,MAGF,SAAS,CAAC,MAAM,EAAE,WAAW,EAAE;AAAA,IACjC;AAAA,EACF;AACF;;;AC3NA,SAAS,YAAAC,iBAAgB;AACzB,SAAS,eAAAC,cAAa,cAAAC,mBAAkB;AACxC,SAAS,QAAAC,aAAY;AAWrB,IAAM,eAAe,oBAAI,IAAI;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAED,IAAM,eAAe,oBAAI,IAAI;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAED,SAAS,QAAQ,KAAa,MAAc,OAAe,UAA4B;AACrF,MAAI,QAAQ,SAAU,QAAO,CAAC;AAC9B,MAAI,UAAoB,CAAC;AACzB,MAAI;AACF,cAAUF,aAAY,GAAG;AAAA,EAC3B,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACA,QAAM,UAAoB,CAAC;AAC3B,aAAW,SAAS,SAAS;AAC3B,QAAI,aAAa,IAAI,KAAK,KAAK,MAAM,WAAW,GAAG,EAAG;AACtD,UAAM,OAAOE,MAAK,KAAK,KAAK;AAC5B,UAAM,MAAM,KAAK,MAAM,KAAK,SAAS,CAAC;AACtC,YAAQ,KAAK,GAAG;AAEhB,UAAM,WAAW,QAAQ,MAAM,MAAM,QAAQ,GAAG,QAAQ;AACxD,YAAQ,KAAK,GAAG,QAAQ;AAAA,EAC1B;AACA,SAAO;AACT;AAMO,SAAS,aAAa,KAAuB;AAClD,MAAI;AACF,UAAM,MAAMH,UAAS,gBAAgB;AAAA,MACnC;AAAA,MACA,UAAU;AAAA,MACV,OAAO,CAAC,QAAQ,QAAQ,QAAQ;AAAA,IAClC,CAAC;AACD,UAAM,QAAQ,IAAI,KAAK,EAAE,MAAM,IAAI,EAAE,OAAO,OAAO;AACnD,QAAI,MAAM,SAAS,EAAG,QAAO;AAAA,EAC/B,QAAQ;AAAA,EAER;AACA,SAAO,QAAQ,KAAK,KAAK,GAAG,CAAC;AAC/B;AAOA,SAAS,qBAAqB,SAAqC;AACjE,QAAM,UAAU,QACb,QAAQ,OAAO,EAAE,EACjB,QAAQ,OAAO,EAAE,EACjB,QAAQ,SAAS,GAAG,EACpB,QAAQ,UAAU,EAAE,EACpB,QAAQ,OAAO,EAAE,EACjB,QAAQ,kBAAkB,EAAE;AAC/B,QAAM,YAAY,QAAQ,QAAQ,OAAO,EAAE,EAAE,KAAK;AAClD,MAAI,UAAU,SAAS,KAAK,cAAc,KAAK,SAAS,EAAG,QAAO;AAClE,SAAO;AACT;AAQO,SAAS,kBAAkB,QAAyB,WAAmC;AAC5F,QAAM,QAAsB,CAAC;AAC7B,QAAM,eAAe,OAAO,YAAY,CAAC;AAEzC,aAAW,SAAS,OAAO,QAAQ;AACjC,QAAI,CAAC,MAAM,KAAM;AACjB,QAAI,aAAa,IAAI,MAAM,IAAI,EAAG;AAClC,QAAI,MAAM,YAAa;AAGvB,UAAM,eAAe,MAAM,QAAQ,eAAe,MAAM,OAAO;AAC/D,UAAM,WAAW,eAAe,aAAa,YAAY,IAAK,MAAM;AAEpE,QAAI;AACJ,QAAI;AACF,WAAK,IAAI,OAAO,QAAQ;AAAA,IAC1B,QAAQ;AACN,YAAM,KAAK,EAAE,OAAO,QAAQ,mBAAmB,QAAQ,IAAI,CAAC;AAC5D;AAAA,IACF;AAEA,UAAM,UAAU,UAAU,OAAO,CAAC,MAAM,GAAG,KAAK,CAAC,CAAC;AAClD,QAAI,QAAQ,WAAW,GAAG;AACxB,YAAM,QAAQ,eACV,YAAY,YAAY,SAAS,QAAQ,OACzC,UAAU,QAAQ;AACtB,YAAM,yBAAyB,qBAAqB,QAAQ;AAE5D,YAAM,WACJ,CAAC,0BAA0B,CAACE,YAAWC,MAAK,QAAQ,IAAI,GAAG,sBAAsB,CAAC;AACpF,UAAI,UAAU;AACZ,cAAM,KAAK;AAAA,UACT;AAAA,UACA,QAAQ,GAAG,KAAK;AAAA,UAChB,GAAI,yBAAyB,EAAE,uBAAuB,IAAI,CAAC;AAAA,QAC7D,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;;;AH9IA,SAAS,iBAA2B;AAClC,MAAI;AACF,UAAM,MAAMC,UAAS,iCAAiC;AAAA,MACpD,UAAU;AAAA,MACV,OAAO,CAAC,QAAQ,QAAQ,QAAQ;AAAA,IAClC,CAAC;AACD,WAAO,IAAI,KAAK,EAAE,MAAM,IAAI,EAAE,OAAO,OAAO;AAAA,EAC9C,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;AAEA,SAAS,qBAA+B;AACtC,MAAI;AACF,UAAM,MAAMA,UAAS,6BAA6B;AAAA,MAChD,UAAU;AAAA,MACV,OAAO,CAAC,QAAQ,QAAQ,QAAQ;AAAA,IAClC,CAAC;AACD,WAAO,IAAI,KAAK,EAAE,MAAM,IAAI,EAAE,OAAO,OAAO;AAAA,EAC9C,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;AAEA,eAAsB,aAAa,SAA8C;AAC/E,MAAI,CAACC,YAAW,aAAa,GAAG;AAC9B,YAAQ,MAAMC,OAAM,IAAI,mDAAmD,CAAC;AAC5E,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,cAAcC,cAAa,eAAe,MAAM;AACtD,MAAI;AACJ,MAAI;AACF,aAASC,oBAAmB,WAAW;AAAA,EACzC,SAAS,KAAc;AACrB,YAAQ,MAAMF,OAAM,IAAI,sBAAsB,GAAI,IAAc,OAAO;AACvE,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,eAAe,QAAQ,SAAS,eAAe,IAAI,mBAAmB;AAG5E,QAAM,SAAS,OAAO,QAAQ,OAAO,SAAS,UAAU,CAAC,CAAC;AAC1D,MAAI,OAAO,SAAS,GAAG;AACrB,YAAQ,IAAIA,OAAM,KAAK,mBAAmB,CAAC;AAC3C,eAAW,CAAC,KAAK,IAAI,KAAK,QAAQ;AAChC,cAAQ,IAAIA,OAAM,KAAK,KAAK,GAAG,GAAG,GAAGA,OAAM,IAAI,OAAO,IAAI,EAAE,KAAK,CAAC,CAAC;AAAA,IACrE;AACA,YAAQ,IAAI,EAAE;AAAA,EAChB;AAEA,MAAI,aAAa,WAAW,GAAG;AAC7B,YAAQ,IAAIA,OAAM,OAAO,oEAAoE,CAAC;AAAA,EAChG;AAEA,QAAM,YAAY,OAAO,OAAO,OAAO,CAAC,MAAM,EAAE,QAAQ,MAAS,EAAE;AACnE,QAAM,UAAUG,KAAI,WAAW,SAAS,gBAAW,EAAE,MAAM;AAC3D,QAAM,iBAAiB,aAAa,SAAS,IAAI,eAAe,CAAC,SAAS;AAC1E,QAAM,UAAU,uBAAuB,QAAQ,cAAc;AAI7D,QAAM,WAAW,YAAY,cAAc,cAAc;AACzD,MAAI,UAAU;AACZ,UAAM,UAAU,YAAY;AAC5B,UAAM,cAAc,IAAI,IAAI,OAAO,OAAO,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;AAC1D,UAAM,YAAY,aAAa,OAAO;AACtC,UAAM,YAAY,UAAU,OAAO,CAAC,MAAM,EAAE,QAAQ,OAAO,KAAK,CAAC,YAAY,IAAI,EAAE,EAAE,CAAC;AACtF,UAAM,YAAY,aAAa,QAAQ,IAAI,CAAC;AAC5C,UAAM,cAAc,kBAAkB,QAAQ,SAAS;AAEvD,QAAI,UAAU,SAAS,KAAK,YAAY,SAAS,GAAG;AAClD,YAAM,QAAkB,CAAC;AACzB,UAAI,UAAU,SAAS,GAAG;AACxB,cAAM,KAAK,GAAG,UAAU,MAAM,iDAAiD;AAC/E,mBAAW,KAAK,UAAW,OAAM,KAAK,OAAO,EAAE,KAAK,EAAE;AAAA,MACxD;AACA,UAAI,YAAY,SAAS,GAAG;AAC1B,cAAM,KAAK,GAAG,YAAY,MAAM,+CAA+C;AAC/E,mBAAW,KAAK,YAAa,OAAM,KAAK,OAAO,EAAE,MAAM,KAAK,KAAK,EAAE,MAAM,EAAE;AAAA,MAC7E;AACA,YAAM,KAAK,gDAAgD;AAC3D,cAAQ,KAAK;AAAA,QACX,OAAO,EAAE,IAAI,wBAAwB,OAAO,uCAAuC;AAAA,QACnF,QAAQ;AAAA,QACR,QAAQ,MAAM,KAAK,IAAI;AAAA,MACzB,CAAC;AAAA,IACH;AAAA,EACF;AAEA,QAAM,SAAS,QAAQ,OAAO,CAAC,MAAM,EAAE,WAAW,MAAM;AACxD,QAAM,SAAS,QAAQ,OAAO,CAAC,MAAM,EAAE,WAAW,MAAM;AACxD,QAAM,UAAU,QAAQ,OAAO,CAAC,MAAM,EAAE,WAAW,MAAM;AAEzD,UAAQ,KAAK;AAGb,aAAW,UAAU,SAAS;AAC5B,gBAAY,MAAM;AAAA,EACpB;AAGA,UAAQ,IAAI,EAAE;AACd,UAAQ;AAAA,IACN;AAAA,MACEH,OAAM,MAAM,UAAK,OAAO,MAAM,SAAS;AAAA,MACvC,OAAO,SAAS,IAAIA,OAAM,IAAI,UAAK,OAAO,MAAM,SAAS,IAAI;AAAA,MAC7D,QAAQ,SAAS,IAAIA,OAAM,KAAK,UAAK,QAAQ,MAAM,UAAU,IAAI;AAAA,IACnE,EACG,OAAO,OAAO,EACd,KAAK,IAAI;AAAA,EACd;AAGA,QAAM,eAAe,OAAO,OAAO;AAAA,IACjC,CAAC,MACC,EAAE,WAAW,UACb,YAAY,EAAE,MAAM,aAAa,SAAS,IAAI,eAAe,CAAC,SAAS,GAAG,OAAO,QAAQ;AAAA,EAC7F;AACA,MAAI,aAAa,SAAS,GAAG;AAC3B,YAAQ,IAAI;AAAA,EAAKA,OAAM,KAAK,0BAA0B,CAAC,EAAE;AACzD,eAAW,KAAK,cAAc;AAC5B,cAAQ,IAAI,KAAKA,OAAM,OAAO,QAAG,CAAC,KAAK,EAAE,KAAK,KAAK,EAAE,UAAU,EAAE,EAAE;AAAA,IACrE;AAAA,EACF;AAEA,MAAI,OAAO,SAAS,GAAG;AACrB,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;AAEA,SAAS,YAAY,QAA2B;AAC9C,QAAM,OACJ,OAAO,WAAW,SACdA,OAAM,MAAM,QAAG,IACf,OAAO,WAAW,SAChBA,OAAM,IAAI,QAAG,IACb,OAAO,WAAW,SAChBA,OAAM,KAAK,QAAG,IACdA,OAAM,OAAO,QAAG;AAE1B,QAAM,QAAQ,OAAO,MAAM;AAC3B,UAAQ,IAAI,GAAG,IAAI,IAAI,KAAK,EAAE;AAE9B,MAAI,OAAO,WAAW,UAAU,OAAO,QAAQ;AAC7C,UAAM,UAAU,OAAO,OAAO,KAAK,EAAE,MAAM,IAAI,EAAE,MAAM,GAAG,EAAE,EAAE,KAAK,IAAI;AACvE,YAAQ,IAAIA,OAAM,IAAI,QAAQ,QAAQ,OAAO,MAAM,CAAC,CAAC;AAAA,EACvD;AACA,MAAI,OAAO,WAAW,UAAU,OAAO,YAAY;AACjD,YAAQ,IAAIA,OAAM,IAAI,OAAO,OAAO,UAAU,EAAE,CAAC;AAAA,EACnD;AACF;;;AIlKA,SAAS,cAAAI,aAAY,gBAAAC,qBAAoB;AACzC,OAAOC,YAAW;AAClB,SAAS,sBAAAC,qBAAoB,sBAAsB;AAEnD,eAAsB,kBAAiC;AACrD,MAAI,CAACH,YAAW,aAAa,GAAG;AAC9B,YAAQ,MAAME,OAAM,IAAI,mDAAmD,CAAC;AAC5E,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,OAAOD,cAAa,eAAe,MAAM;AAE/C,MAAI;AACJ,MAAI;AACF,aAASE,oBAAmB,IAAI;AAAA,EAClC,SAAS,KAAc;AACrB,YAAQ,MAAMD,OAAM,IAAI,cAAc,GAAI,IAAc,OAAO;AAC/D,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,SAAS,eAAe,MAAM;AAEpC,MAAI,OAAO,OAAO;AAChB,YAAQ,IAAIA,OAAM,MAAM,6BAAwB,CAAC;AACjD,YAAQ;AAAA,MACNA,OAAM;AAAA,QACJ,KAAK,OAAO,OAAO,OAAO,CAAC,MAAM,EAAE,QAAQ,MAAS,EAAE,MAAM,WAAW,OAAO,OAAO,OAAO,CAAC,MAAM,EAAE,WAAW,MAAS,EAAE,MAAM,aAAa,OAAO,WAAW,MAAM;AAAA,MACxK;AAAA,IACF;AAAA,EACF,OAAO;AACL,YAAQ,MAAMA,OAAM,IAAI,gCAA2B,CAAC;AACpD,eAAW,OAAO,OAAO,QAAQ;AAC/B,cAAQ,MAAM,KAAKA,OAAM,OAAO,IAAI,IAAI,CAAC,KAAK,IAAI,OAAO,EAAE;AAAA,IAC7D;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;;;ACpCA,SAAS,cAAAE,aAAY,gBAAAC,eAAc,iBAAAC,gBAAe,aAAAC,kBAAiB;AACnE,OAAOC,YAAW;AAClB,OAAOC,UAAS;AAChB,SAAS,sBAAAC,2BAA0B;AACnC,SAAS,iBAAAC,gBAAe,oBAAAC,mBAAkB,mBAAAC,wBAAuB;AACjE,SAAS,mBAAmBC,8BAA6B;AACzD,SAAS,eAAeC,0BAAyB;AAIjD,eAAsB,gBAA+B;AACnD,MAAI,CAACC,YAAW,aAAa,GAAG;AAC9B,YAAQ,MAAMC,OAAM,IAAI,mDAAmD,CAAC;AAC5E,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,UAAUC,KAAI,uCAAkC,EAAE,MAAM;AAC9D,QAAM,QAAQ,YAAY;AAC1B,QAAM,SAASC,oBAAmBC,cAAa,eAAe,MAAM,CAAC;AAGrE,QAAM,eAAe;AACrB,EAAAC,WAAU,cAAc,EAAE,WAAW,KAAK,CAAC;AAC3C,EAAAC,eAAc,GAAG,YAAY,0BAA0BC,iBAAgB,MAAM,GAAG,MAAM;AAEtF,MAAI,UAAU,aAAa,UAAU,WAAW;AAC9C,UAAM,WAAW;AACjB,IAAAF,WAAU,UAAU,EAAE,WAAW,KAAK,CAAC;AACvC,IAAAC,eAAc,GAAG,QAAQ,mBAAmBE,eAAc,MAAM,GAAG,MAAM;AACzE,IAAAF,eAAc,GAAG,QAAQ,wBAAwBG,kBAAiB,MAAM,GAAG,MAAM;AACjF,YAAQ,OAAO,WAAWR,OAAM,MAAM,8BAA8B,CAAC,QAAQA,OAAM,MAAM,mCAAmC,CAAC;AAAA,EAC/H;AAEA,MAAI,UAAU,UAAU;AACtB,IAAAI,WAAU,WAAW,EAAE,WAAW,KAAK,CAAC;AACxC,UAAM,eAAe;AACrB,QAAI,WAAoC,CAAC;AACzC,QAAIL,YAAW,YAAY,GAAG;AAC5B,UAAI;AACF,mBAAW,KAAK,MAAMI,cAAa,cAAc,MAAM,CAAC;AAAA,MAC1D,QAAQ;AAAA,MAER;AAAA,IACF;AACA,UAAM,QAAQ,KAAK,MAAMM,uBAAsB,MAAM,CAAC;AACtD,IAAAJ,eAAc,cAAc,KAAK,UAAU,EAAE,GAAG,UAAU,OAAO,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC;AAAA,EAC1F;AAEA,MAAI,UAAU,UAAU;AACtB,UAAM,cAAcK,mBAAkB,MAAM;AAC5C,UAAM,aAAa;AACnB,QAAIX,YAAW,UAAU,GAAG;AAC1B,YAAM,UAAUI,cAAa,YAAY,MAAM;AAC/C,YAAM,QAAQ,QAAQ,QAAQ,sCAAuB;AACrD,YAAM,MAAM,QAAQ,QAAQ,6DAA+B;AAC3D,UAAI,UAAU,MAAM,QAAQ,IAAI;AAE9B,cAAM,WAAW,QAAQ,QAAQ,MAAM,GAAG;AAC1C,cAAM,UACJ,QAAQ,MAAM,GAAG,KAAK,IACtB,cACA,QAAQ,MAAM,aAAa,KAAK,MAAM,WAAW,CAAC;AACpD,QAAAE,eAAc,YAAY,OAAO;AAAA,MACnC,OAAO;AACL,QAAAA,eAAc,YAAY,UAAU,OAAO,WAAW;AAAA,MACxD;AAAA,IACF;AAAA,EACF;AAEA,UAAQ,QAAQL,OAAM,MAAM,+CAA+C,CAAC;AAC9E;;;ACtEA,SAAS,oBAA+D;AACxE,SAAS,kBAAkB,cAAAW,mBAAkB;AAC7C,SAAS,QAAAC,OAAM,SAAS,WAAAC,gBAAe;AACvC,SAAS,iBAAAC,sBAAqB;AAC9B,SAAS,YAAAC,iBAAgB;AACzB,OAAOC,YAAW;AAElB,IAAMC,aAAYJ,SAAQC,eAAc,YAAY,GAAG,CAAC;AAExD,IAAM,OAA+B;AAAA,EACnC,SAAS;AAAA,EACT,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,SAAS;AACX;AAKA,SAAS,UAAU,KAAqB,UAAwB;AAC9D,QAAM,OAAO,KAAK,QAAQ,QAAQ,CAAC,KAAK;AACxC,MAAI,UAAU,KAAK,EAAE,gBAAgB,KAAK,CAAC;AAC3C,mBAAiB,QAAQ,EAAE,KAAK,GAAG;AACrC;AAOA,SAAS,cAAc,KAAsB,KAAqB,OAAqB;AACrF,QAAM,OAAO,IAAI,OAAO,KAAK,MAAM,GAAG,EAAE,CAAC,KAAK;AAG9C,MAAI,QAAQ,6BAA6B;AACvC,UAAM,aAAaF,MAAK,QAAQ,IAAI,GAAG,aAAa;AACpD,QAAID,YAAW,UAAU,GAAG;AAC1B,UAAI,UAAU,KAAK,EAAE,gBAAgB,2BAA2B,CAAC;AACjE,uBAAiB,UAAU,EAAE,KAAK,GAAG;AAAA,IACvC,OAAO;AACL,UAAI,UAAU,KAAK,EAAE,gBAAgB,aAAa,CAAC;AACnD,UAAI,IAAI,4CAA4C;AAAA,IACtD;AACA;AAAA,EACF;AAGA,QAAM,YAAYC,MAAK,OAAO,QAAQ,MAAM,eAAe,GAAG;AAC9D,QAAM,WAAWD,YAAW,SAAS,IAAI,YAAYC,MAAK,OAAO,YAAY;AAC7E,YAAU,KAAK,QAAQ;AACzB;AASA,eAAsB,eAA8B;AAClD,QAAM,OAAO;AACb,QAAM,QAAQA,MAAKK,YAAW,YAAY;AAE1C,MAAI,CAACN,YAAW,KAAK,GAAG;AACtB,YAAQ,MAAMK,OAAM,IAAI,gCAA2B,CAAC;AACpD,YAAQ,IAAIA,OAAM,IAAI,+DAA+D,CAAC;AACtF,YAAQ,IAAIA,OAAM,IAAI,kEAAkE,CAAC;AACzF,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,SAAS,aAAa,CAAC,KAAK,QAAQ,cAAc,KAAK,KAAK,KAAK,CAAC;AAExE,QAAM,IAAI,QAAc,CAAC,SAAS,WAAW;AAC3C,WAAO,OAAO,MAAM,MAAM;AACxB,cAAQ;AAAA,QACN;AAAA,EAAKA,OAAM,MAAM,QAAG,CAAC,iCAAiCA,OAAM,KAAK,oBAAoB,IAAI,EAAE,CAAC;AAAA,MAC9F;AACA,cAAQ,IAAIA,OAAM,IAAI,yDAAyD,CAAC;AAChF,cAAQ,IAAIA,OAAM,IAAI,0BAA0B,CAAC;AAEjD,YAAM,UACJ,QAAQ,aAAa,WACjB,SACA,QAAQ,aAAa,UACnB,UACA;AACR,UAAI;AACF,QAAAD,UAAS,GAAG,OAAO,qBAAqB,IAAI,IAAI,EAAE,OAAO,SAAS,CAAC;AAAA,MACrE,QAAQ;AAAA,MAER;AAAA,IACF,CAAC;AAED,WAAO,GAAG,SAAS,MAAM;AAEzB,YAAQ,GAAG,UAAU,MAAM;AACzB,cAAQ,IAAIC,OAAM,IAAI,4BAAuB,CAAC;AAC9C,aAAO,MAAM,MAAM,QAAQ,CAAC;AAAA,IAC9B,CAAC;AAAA,EACH,CAAC;AACH;;;AC3GA,SAAS,cAAAE,aAAY,gBAAAC,eAAc,iBAAAC,sBAAqB;AACxD,SAAS,YAAAC,iBAAgB;AACzB,OAAOC,YAAW;AAClB,OAAOC,UAAS;AAChB,SAAS,sBAAAC,qBAAoB,oBAAoB;AAYjD,SAAS,cAAc,MAAsB;AAC3C,QAAM,QAAQ,KAAK,MAAM,IAAI;AAC7B,QAAM,eAAyB,CAAC;AAChC,aAAW,QAAQ,OAAO;AACxB,QAAI,KAAK,WAAW,GAAG,KAAM,aAAa,SAAS,KAAK,KAAK,KAAK,MAAM,IAAK;AAC3E,mBAAa,KAAK,IAAI;AAAA,IACxB,OAAO;AACL;AAAA,IACF;AAAA,EACF;AAEA,SAAO,aAAa,SAAS,KAAK,aAAa,aAAa,SAAS,CAAC,GAAG,KAAK,MAAM,IAAI;AACtF,iBAAa,IAAI;AAAA,EACnB;AACA,SAAO,aAAa,KAAK,IAAI;AAC/B;AAEA,SAAS,WAAW,QAAgB,SAAyB;AAC3D,MAAI,CAAC,OAAQ,QAAO;AACpB,SAAO,SAAS,SAAS;AAC3B;AAIA,eAAsB,cAAc,SAA6C;AAC/E,MAAI,CAACC,YAAW,aAAa,GAAG;AAC9B,YAAQ,MAAMC,OAAM,IAAI,mDAAmD,CAAC;AAC5E,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,UAAUC,KAAI,gCAA2B,EAAE,MAAM;AACvD,QAAM,MAAM,QAAQ,IAAI;AAGxB,QAAM,UAAU,YAAY,GAAG;AAC/B,QAAM,YAAY,aAAa,GAAG;AAGlC,QAAM,cAAcC,cAAa,eAAe,MAAM;AACtD,MAAI;AACJ,MAAI;AACF,aAASC,oBAAmB,WAAW;AAAA,EACzC,SAAS,KAAc;AACrB,YAAQ,KAAKH,OAAM,IAAI,sBAAsB,IAAI,MAAO,IAAc,OAAO;AAC7E,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,UAAQ,KAAK;AAGb,QAAM,cAAc,IAAI,IAAI,OAAO,OAAO,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;AAC1D,QAAM,uBAAuB,IAAI,IAAI,OAAO,WAAW,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;AACvE,QAAM,eAAe,aAAa,OAAO;AACzC,QAAM,YAAY,aAAa,OAAO,CAAC,MAAM,EAAE,QAAQ,OAAO,KAAK,CAAC,YAAY,IAAI,EAAE,EAAE,CAAC;AAGzF,QAAM,cAAc,kBAAkB,QAAQ,SAAS;AAKvD,UAAQ,IAAIA,OAAM,KAAK,8BAAuB,CAAC;AAC/C,QAAM,SAAsC;AAAA,IAC1C,CAAC,cAAc,QAAQ,eAAe,eAAe;AAAA,IACrD,CAAC,UAAU,QAAQ,WAAW,iBAAiB;AAAA,IAC/C,CAAC,SAAS,QAAQ,UAAU,YAAY;AAAA,IACxC,CAAC,QAAQ,QAAQ,SAAS,uBAAuB;AAAA,IACjD,CAAC,YAAY,QAAQ,aAAa,aAAa;AAAA,IAC/C,CAAC,UAAU,QAAQ,WAAW,iBAAiB;AAAA,IAC/C,CAAC,QAAQ,QAAQ,SAAS,iBAAiB;AAAA,IAC3C,CAAC,UAAU,QAAQ,WAAW,gBAAgB;AAAA,IAC9C,CAAC,UAAU,QAAQ,WAAW,YAAY;AAAA,IAC1C,CAAC,MAAM,QAAQ,OAAO,QAAQ;AAAA,IAC9B,CAAC,QAAQ,QAAQ,SAAS,YAAY;AAAA,IACtC,CAAC,WAAW,QAAQ,SAAS,eAAe;AAAA,IAC5C,CAAC,SAAS,QAAQ,UAAU,cAAc;AAAA,IAC1C,CAAC,UAAU,QAAQ,WAAW,sBAAsB;AAAA,IACpD,CAAC,WAAW,QAAQ,YAAY,aAAa;AAAA,IAC7C,CAAC,cAAc,QAAQ,eAAe,aAAa;AAAA,IACnD,CAAC,UAAU,QAAQ,WAAW,YAAY;AAAA,IAC1C,CAAC,aAAa,QAAQ,cAAc,MAAM;AAAA,IAC1C,CAAC,cAAc,QAAQ,eAAe,MAAM;AAAA,IAC5C,CAAC,WAAW,QAAQ,YAAY,cAAc;AAAA,IAC9C,CAAC,kBAAkB,QAAQ,kBAAkB,oBAAoB;AAAA,EACnE;AACA,QAAM,WAAW,OAAO,OAAO,CAAC,CAAC,EAAE,GAAG,MAAM,GAAG;AAC/C,MAAI,SAAS,WAAW,GAAG;AACzB,YAAQ,IAAIA,OAAM,IAAI,sDAAiD,CAAC;AAAA,EAC1E,OAAO;AACL,eAAW,CAAC,MAAM,EAAE,IAAI,KAAK,UAAU;AACrC,cAAQ,IAAI,KAAKA,OAAM,MAAM,QAAG,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC,IAAIA,OAAM,IAAI,IAAI,CAAC,EAAE;AAAA,IAC3E;AAAA,EACF;AAGA,MAAI,YAAY,SAAS,GAAG;AAC1B,YAAQ,IAAIA,OAAM,KAAK;AAAA,8BAAuB,YAAY,MAAM,IAAI,CAAC;AACrE,eAAW,EAAE,OAAO,QAAQ,uBAAuB,KAAK,aAAa;AACnE,YAAM,MAAM,yBACRA,OAAM,IAAI,oDAA+C,sBAAsB,EAAE,IACjFA,OAAM,IAAI,2CAAsC;AACpD,cAAQ,IAAI,KAAKA,OAAM,OAAO,QAAG,CAAC,IAAIA,OAAM,KAAK,MAAM,EAAE,CAAC,KAAKA,OAAM,IAAI,MAAM,CAAC,GAAG,GAAG,EAAE;AAAA,IAC1F;AAAA,EACF;AAGA,MAAI,UAAU,WAAW,KAAK,YAAY,WAAW,GAAG;AACtD,YAAQ,IAAIA,OAAM,MAAM,iEAA4D,CAAC;AACrF;AAAA,EACF;AAEA,MAAI,UAAU,SAAS,GAAG;AACxB,YAAQ,IAAIA,OAAM,KAAK;AAAA,gCAA4B,UAAU,MAAM,IAAI,CAAC;AACxE,eAAW,KAAK,WAAW;AACzB,YAAM,QAAQ,EAAE,OAAOA,OAAM,KAAK,UAAU,EAAE,IAAI,EAAE,IAAI;AACxD,YAAM,OAAO,EAAE,MAAMA,OAAM,IAAI,KAAK,IAAIA,OAAM,IAAI,QAAQ;AAC1D,YAAM,UAAU,EAAE,MACdA,OAAM,IAAI,KAAK,EAAE,IAAI,MAAM,GAAG,EAAE,CAAC,GAAG,EAAE,IAAI,SAAS,KAAK,WAAM,EAAE,EAAE,IAClEA,OAAM,IAAI,MAAM,EAAE,UAAU,IAAI,MAAM,GAAG,EAAE,CAAC,IAAI,EAAE,QAAQ,UAAU,KAAK,KAAK,WAAM,EAAE,EAAE;AAC5F,cAAQ,IAAI,KAAKA,OAAM,MAAM,GAAG,CAAC,IAAIA,OAAM,KAAK,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC,KAAK,IAAI,IAAI,KAAK,EAAE;AACpF,cAAQ,IAAI,OAAO,OAAO,EAAE;AAAA,IAC9B;AAAA,EACF;AAEA,MAAI,CAAC,QAAQ,OAAO;AAClB,YAAQ;AAAA,MACNA,OAAM,IAAI;AAAA,4DAA0D,IAClE;AAAA,QAAWA,OAAM,KAAK,yCAAyC,CAAC;AAAA,IACpE;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AAIA,QAAM,eAAeC,KAAI,uCAAkC,EAAE,MAAM;AAGnE,QAAM,gBAAgB,CAAC,GAAG,OAAO,UAAU;AAG3C,aAAW,KAAK,WAAW;AACzB,QAAI,EAAE,aAAa,CAAC,qBAAqB,IAAI,EAAE,UAAU,EAAE,GAAG;AAC5D,oBAAc,KAAK,EAAE,SAAyB;AAC9C,2BAAqB,IAAI,EAAE,UAAU,EAAE;AAAA,IACzC;AAAA,EACF;AAGA,QAAM,gBAA4B,OAAO,OAAO,IAAI,CAAC,UAAU;AAC7D,UAAM,QAAQ,YAAY,KAAK,CAAC,MAAM,EAAE,MAAM,OAAO,MAAM,EAAE;AAC7D,QAAI,CAAC,SAAS,CAAC,MAAM,uBAAwB,QAAO;AAEpD,UAAM,SAAS,OAAO,MAAM,EAAE;AAC9B,QAAI,CAAC,qBAAqB,IAAI,MAAM,GAAG;AACrC,oBAAc,KAAK;AAAA,QACjB,IAAI;AAAA,QACJ,UAAU;AAAA,QACV,MAAM,MAAM;AAAA,MACd,CAAC;AACD,2BAAqB,IAAI,MAAM;AAAA,IACjC;AACA,WAAO,EAAE,GAAG,OAAO,aAAa,OAAO;AAAA,EACzC,CAAC;AAGD,QAAM,YAAwB,UAAU,IAAI,CAAC,OAAO;AAAA,IAClD,IAAI,EAAE;AAAA,IACN,OAAO,EAAE;AAAA,IACT,GAAI,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;AAAA,IACjC,GAAI,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,IAAI,CAAC;AAAA,IAC9B,GAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,IAAI,CAAC;AAAA,IACvC,GAAI,EAAE,cAAc,EAAE,aAAa,EAAE,YAAY,IAAI,CAAC;AAAA,EACxD,EAAE;AAEF,QAAM,gBAAiC;AAAA,IACrC,GAAG;AAAA,IACH,YAAY;AAAA,IACZ,QAAQ,CAAC,GAAG,eAAe,GAAG,SAAS;AAAA,EACzC;AAEA,QAAM,SAAS,cAAc,WAAW;AACxC,QAAM,UAAU,WAAW,QAAQ,aAAa,aAAa,CAAC;AAC9D,EAAAG,eAAc,eAAe,SAAS,MAAM;AAG5C,eAAa,OAAO;AACpB,MAAI;AACF,IAAAC,UAAS,mCAAmC,EAAE,OAAO,OAAO,CAAC;AAAA,EAC/D,QAAQ;AAEN,iBAAa;AAAA,MACXL,OAAM,OAAO,4EAAuE;AAAA,IACtF;AACA,wBAAoB,UAAU,QAAQ,YAAY,MAAM;AACxD;AAAA,EACF;AAEA,eAAa,QAAQA,OAAM,MAAM,mDAAmD,CAAC;AACrF,sBAAoB,UAAU,QAAQ,YAAY,MAAM;AAC1D;AAEA,SAAS,oBAAoB,OAAe,SAAuB;AACjE,QAAM,QAAkB,CAAC;AACzB,MAAI,QAAQ,EAAG,OAAM,KAAKA,OAAM,MAAM,GAAG,KAAK,SAAS,UAAU,IAAI,KAAK,GAAG,QAAQ,CAAC;AACtF,MAAI,UAAU;AACZ,UAAM,KAAKA,OAAM,OAAO,GAAG,OAAO,eAAe,YAAY,IAAI,KAAK,GAAG,UAAU,CAAC;AACtF,MAAI,MAAM,SAAS,EAAG,SAAQ,IAAI,OAAO,MAAM,KAAK,UAAO,CAAC;AAC5D,UAAQ;AAAA,IACNA,OAAM,IAAI,uCAAuC,IAC/CA,OAAM,OAAO,uEAAuE;AAAA,EACxF;AACF;;;AV3NA,IAAM,UAAU,IAAI,QAAQ;AAE5B,QACG,KAAK,WAAW,EAChB,YAAY,mDAAmD,EAC/D,QAAQ,eAAe;AAE1B,QACG,QAAQ,MAAM,EACd,YAAY,6CAA6C,EACzD,OAAO,mBAAmB,sDAAsD,EAChF,OAAO,mBAAmB,uCAAuC,EACjE,OAAO,WAAW;AAErB,QACG,QAAQ,OAAO,EACf,YAAY,kCAAkC,EAC9C,OAAO,YAAY,qCAAqC,EACxD,OAAO,YAAY;AAEtB,QACG,QAAQ,UAAU,EAClB,YAAY,kDAAkD,EAC9D,OAAO,eAAe;AAEzB,QACG,QAAQ,QAAQ,EAChB,YAAY,0EAA0E,EACtF,OAAO,aAAa;AAEvB,QACG,QAAQ,SAAS,EACjB,YAAY,8CAA8C,EAC1D,OAAO,YAAY;AAEtB,QACG,QAAQ,QAAQ,EAChB,YAAY,4EAA4E,EACxF,OAAO,WAAW,mEAAmE,EACrF,OAAO,aAAa;AAEvB,QAAQ,MAAM;","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"]}
@@ -9,7 +9,7 @@ eval checkpoints. Before marking any task done, all checks must pass.
9
9
 
10
10
  Before marking **any** task complete:
11
11
 
12
- 1. Run `npx holdpoint check` — all tasks must exit 0.
12
+ 1. Run `npx @holdpoint/cli@alpha check` — all tasks must exit 0.
13
13
  2. `holdpoint check` also prints every **prompt** check whose `when` matches the
14
14
  files you changed. Read and act on each listed instruction before finishing.
15
15
 
@@ -19,12 +19,12 @@ Before marking **any** task complete:
19
19
 
20
20
  `checks.yaml` is not static — it grows alongside the project automatically.
21
21
 
22
- **`holdpoint-evolve` is a deterministic check** in `checks.yaml` that fires whenever you change a structural file (`package.json`, `pyproject.toml`, `go.mod`, `Dockerfile`, `tsconfig.json`, `vitest.config.*`, etc.). When it fires, `npx holdpoint evolve` runs and **exits 1 if `checks.yaml` is out of sync** — blocking task completion until you apply the proposals.
22
+ **`holdpoint-evolve` is a deterministic check** in `checks.yaml` that fires whenever you change a structural file (`package.json`, `pyproject.toml`, `go.mod`, `Dockerfile`, `tsconfig.json`, `vitest.config.*`, etc.). When it fires, `npx @holdpoint/cli@alpha evolve` runs and **exits 1 if `checks.yaml` is out of sync** — blocking task completion until you apply the proposals.
23
23
 
24
24
  When blocked by `holdpoint-evolve`, run:
25
25
 
26
26
  ```
27
- npx holdpoint evolve --apply # scan, apply proposals, regenerate engine files
27
+ npx @holdpoint/cli@alpha evolve --apply # scan, apply proposals, regenerate engine files
28
28
  ```
29
29
 
30
30
  Then commit:
@@ -56,7 +56,7 @@ remove, or change checkpoints.
56
56
  After every edit, regenerate the engine files and commit everything together:
57
57
 
58
58
  ```
59
- npx holdpoint update
59
+ npx @holdpoint/cli@alpha update
60
60
  git add checks.yaml .github/holdpoint/generated/ .github/hooks/
61
61
  git commit -m "chore: update holdpoint checks"
62
62
  ```
@@ -200,7 +200,7 @@ context:
200
200
 
201
201
  1. Open `checks.yaml`.
202
202
  2. Add your entry under `checks:`.
203
- 3. Run `npx holdpoint update`.
203
+ 3. Run `npx @holdpoint/cli@alpha update`.
204
204
  4. Commit `checks.yaml` and the generated files.
205
205
 
206
206
  **Add a task check (runs a shell command automatically):**
@@ -285,12 +285,12 @@ skipped.
285
285
 
286
286
  | Command | What it does |
287
287
  | ---------------------------------- | ------------------------------------------------------- |
288
- | `npx holdpoint check` | Run checks against all files changed vs HEAD |
289
- | `npx holdpoint check --staged` | Run checks against staged files only |
290
- | `npx holdpoint evolve` | Scan project and show proposed additions to checks.yaml |
291
- | `npx holdpoint evolve --apply` | Apply proposals and regenerate engine files |
292
- | `npx holdpoint update` | Regenerate engine files from the current `checks.yaml` |
293
- | `npx holdpoint validate` | Validate `checks.yaml` schema (no commands run) |
288
+ | `npx @holdpoint/cli@alpha check` | Run checks against all files changed vs HEAD |
289
+ | `npx @holdpoint/cli@alpha check --staged` | Run checks against staged files only |
290
+ | `npx @holdpoint/cli@alpha evolve` | Scan project and show proposed additions to checks.yaml |
291
+ | `npx @holdpoint/cli@alpha evolve --apply` | Apply proposals and regenerate engine files |
292
+ | `npx @holdpoint/cli@alpha update` | Regenerate engine files from the current `checks.yaml` |
293
+ | `npx @holdpoint/cli@alpha validate` | Validate `checks.yaml` schema (no commands run) |
294
294
  | `npx @holdpoint/cli@alpha builder` | Open the visual builder UI at localhost:4321 |
295
295
 
296
296
  ---
@@ -305,5 +305,5 @@ skipped.
305
305
  | `.claude/settings.json` | Claude |
306
306
  | `.cursorrules` (Holdpoint section) | Cursor |
307
307
 
308
- All generated files are overwritten by `npx holdpoint update`. Edit `checks.yaml`,
308
+ All generated files are overwritten by `npx @holdpoint/cli@alpha update`. Edit `checks.yaml`,
309
309
  then run `update` — never edit the generated files directly.
@@ -45,7 +45,7 @@ checks:
45
45
  - id: holdpoint-evolve
46
46
  label: "Evolve checks when project structure changes"
47
47
  when: structural
48
- cmd: "npx holdpoint evolve"
48
+ cmd: "npx @holdpoint/cli@alpha evolve"
49
49
 
50
50
  - id: git-commit
51
51
  label: "Commit all changes before finishing"
@@ -86,7 +86,7 @@ checks:
86
86
  - id: holdpoint-evolve
87
87
  label: "Evolve checks when project structure changes"
88
88
  when: structural
89
- cmd: "npx holdpoint evolve"
89
+ cmd: "npx @holdpoint/cli@alpha evolve"
90
90
 
91
91
  - id: git-commit
92
92
  label: "Commit all changes before finishing"
@@ -53,7 +53,7 @@ checks:
53
53
  - id: holdpoint-evolve
54
54
  label: "Evolve checks when project structure changes"
55
55
  when: structural
56
- cmd: "npx holdpoint evolve"
56
+ cmd: "npx @holdpoint/cli@alpha evolve"
57
57
 
58
58
  - id: git-commit
59
59
  label: "Commit all changes before finishing"
@@ -69,7 +69,7 @@ checks:
69
69
  - id: holdpoint-evolve
70
70
  label: "Evolve checks when project structure changes"
71
71
  when: structural
72
- cmd: "npx holdpoint evolve"
72
+ cmd: "npx @holdpoint/cli@alpha evolve"
73
73
 
74
74
  - id: git-commit
75
75
  label: "Commit all changes before finishing"
@@ -53,7 +53,7 @@ checks:
53
53
  - id: holdpoint-evolve
54
54
  label: "Evolve checks when project structure changes"
55
55
  when: structural
56
- cmd: "npx holdpoint evolve"
56
+ cmd: "npx @holdpoint/cli@alpha evolve"
57
57
 
58
58
  - id: git-commit
59
59
  label: "Commit all changes before finishing"
@@ -48,7 +48,7 @@ checks:
48
48
  - id: holdpoint-evolve
49
49
  label: "Evolve checks when project structure changes"
50
50
  when: structural
51
- cmd: "npx holdpoint evolve"
51
+ cmd: "npx @holdpoint/cli@alpha evolve"
52
52
 
53
53
  - id: git-commit
54
54
  label: "Commit all changes before finishing"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@holdpoint/cli",
3
- "version": "0.1.0-alpha.0",
3
+ "version": "0.1.0-alpha.2",
4
4
  "publishConfig": {
5
5
  "access": "public",
6
6
  "tag": "alpha"
@@ -45,28 +45,28 @@
45
45
  "README.md",
46
46
  "LICENSE"
47
47
  ],
48
- "scripts": {
49
- "build": "tsup",
50
- "typecheck": "tsc --noEmit",
51
- "test": "vitest run --passWithNoTests",
52
- "dev": "tsup --watch",
53
- "clean": "rm -rf dist *.tsbuildinfo"
54
- },
55
48
  "dependencies": {
56
- "@holdpoint/engine-claude": "workspace:*",
57
- "@holdpoint/engine-copilot": "workspace:*",
58
- "@holdpoint/engine-cursor": "workspace:*",
59
- "@holdpoint/types": "workspace:*",
60
- "@holdpoint/yaml-core": "workspace:*",
61
49
  "chalk": "^5.3.0",
62
50
  "commander": "^12.1.0",
63
- "ora": "^8.1.1"
51
+ "ora": "^8.1.1",
52
+ "@holdpoint/engine-claude": "0.1.0-alpha.2",
53
+ "@holdpoint/types": "0.1.0-alpha.2",
54
+ "@holdpoint/engine-cursor": "0.1.0-alpha.2",
55
+ "@holdpoint/engine-copilot": "0.1.0-alpha.2",
56
+ "@holdpoint/yaml-core": "0.1.0-alpha.2"
64
57
  },
65
58
  "devDependencies": {
66
- "@holdpoint/builder": "workspace:*",
67
59
  "@types/node": "^22.10.2",
68
60
  "tsup": "^8.3.5",
69
61
  "typescript": "^5.7.2",
70
- "vitest": "^2.1.8"
62
+ "vitest": "^2.1.8",
63
+ "@holdpoint/builder": "0.1.0"
64
+ },
65
+ "scripts": {
66
+ "build": "tsup",
67
+ "typecheck": "tsc --noEmit",
68
+ "test": "vitest run --passWithNoTests",
69
+ "dev": "tsup --watch",
70
+ "clean": "rm -rf dist *.tsbuildinfo"
71
71
  }
72
- }
72
+ }