@holdpoint/cli 0.1.0-alpha.3 → 0.1.0-alpha.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/builder-ui/assets/index-3J1uDBNl.css +1 -0
- package/dist/builder-ui/assets/index-BqVxTIWS.js +457 -0
- package/dist/builder-ui/assets/index-BqVxTIWS.js.map +1 -0
- package/dist/builder-ui/index.html +2 -2
- package/dist/index.js +72 -3
- package/dist/index.js.map +1 -1
- package/dist/templates/MASTER_PROMPT.md +1 -1
- package/dist/templates/_base.yaml +7 -2
- package/package.json +18 -18
- package/LICENSE +0 -21
- package/dist/builder-ui/assets/index-BxfWKnb5.js +0 -437
- package/dist/builder-ui/assets/index-BxfWKnb5.js.map +0 -1
- package/dist/builder-ui/assets/index-DkLHZ-in.css +0 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/commands/init.ts","../src/detect.ts","../src/commands/check.ts","../src/evolve/scanner.ts","../src/evolve/templates.ts","../src/evolve/dead-checker.ts","../src/commands/validate.ts","../src/commands/update.ts","../src/commands/build.ts","../src/commands/evolve.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport { initCommand } from \"./commands/init.js\";\nimport { checkCommand } from \"./commands/check.js\";\nimport { validateCommand } from \"./commands/validate.js\";\nimport { updateCommand } from \"./commands/update.js\";\nimport { buildCommand } from \"./commands/build.js\";\nimport { evolveCommand } from \"./commands/evolve.js\";\n\nconst program = new Command();\n\nprogram\n .name(\"holdpoint\")\n .description(\"Universal eval-guard for AI coding agents (alpha)\")\n .version(\"0.1.0-alpha.2\");\n\nprogram\n .command(\"init\")\n .description(\"Initialise Holdpoint in the current project\")\n .option(\"--stack <stack>\", \"Stack type: typescript | python | nextjs | fullstack\")\n .option(\n \"--agent <agent>\",\n \"Agent to install for: copilot | claude | cursor | codex (default: all four)\",\n )\n .action(initCommand);\n\nprogram\n .command(\"check\")\n .description(\"Run task checks from checks.yaml\")\n .option(\"--staged\", \"Only check against git-staged files\")\n .action(checkCommand);\n\nprogram\n .command(\"validate\")\n .description(\"Validate checks.yaml schema and print any errors\")\n .action(validateCommand);\n\nprogram\n .command(\"update\")\n .description(\"Regenerate engine files from current checks.yaml (preserves checks.yaml)\")\n .action(updateCommand);\n\nprogram\n .command(\"builder\")\n .description(\"Open the visual builder UI on localhost:4321\")\n .action(buildCommand);\n\nprogram\n .command(\"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 {\n buildHookJson,\n buildCheckScript,\n buildConfigJson,\n buildEngine,\n} from \"@holdpoint/engine-copilot\";\nimport { buildEngineJson as buildClaudeEngineJson } from \"@holdpoint/engine-claude\";\nimport { buildEngine as buildCursorEngine } from \"@holdpoint/engine-cursor\";\nimport {\n buildHooksJson as buildCodexHooksJson,\n buildCheckScript as buildCodexCheckScript,\n spliceAgentsMd,\n buildAgentsMd,\n} from \"@holdpoint/engine-codex\";\nimport { parseHoldpointYaml } from \"@holdpoint/yaml-core\";\nimport type { AgentType, StackType } from \"@holdpoint/types\";\nimport { detectStack } 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\n/**\n * Initialise Holdpoint in the current project.\n *\n * Writes `checks.yaml` (from a stack template if available), `checks.immutable.json`,\n * and engine adapter files for each target agent (Copilot, Claude, Cursor, Codex).\n * Defaults to installing all four agents; pass `--agent` to restrict to one.\n */\nexport async function initCommand(options: { stack?: string; agent?: string }): Promise<void> {\n const spinner = ora(\"Initialising Holdpoint…\").start();\n\n const stack = (options.stack as StackType | undefined) ?? detectStack();\n\n // Default: install for all agents. Pass --agent=copilot|claude|cursor to restrict.\n const agentOpt = options.agent;\n const agents: AgentType[] =\n !agentOpt || agentOpt === \"all\"\n ? [\"copilot\", \"claude\", \"cursor\", \"codex\"]\n : [agentOpt as AgentType];\n\n spinner.text = `Stack: ${chalk.cyan(stack)} — installing for: ${chalk.cyan(agents.join(\", \"))}`;\n\n // 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 for each target agent\n if (agents.includes(\"copilot\")) {\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 // extension.mjs: loaded by the Copilot CLI local agent at session start\n const extDir = \".github/extensions/holdpoint\";\n mkdirSync(extDir, { recursive: true });\n writeFileSync(join(extDir, \"extension.mjs\"), buildEngine(config), \"utf8\");\n }\n\n if (agents.includes(\"claude\")) {\n mkdirSync(\".claude\", { recursive: true });\n const settingsPath = \".claude/settings.json\";\n let existing: Record<string, unknown> = {};\n if (existsSync(settingsPath)) {\n try {\n existing = JSON.parse(readFileSync(settingsPath, \"utf8\")) as Record<string, unknown>;\n } catch {\n /* ignore */\n }\n }\n const holdpointHooks = JSON.parse(buildClaudeEngineJson(config)) as Record<string, unknown>;\n writeFileSync(\n settingsPath,\n JSON.stringify({ ...existing, hooks: holdpointHooks.hooks }, null, 2),\n \"utf8\",\n );\n }\n\n if (agents.includes(\"cursor\")) {\n const cursorRules = buildCursorEngine(config);\n const cursorPath = \".cursorrules\";\n if (existsSync(cursorPath)) {\n const existing = readFileSync(cursorPath, \"utf8\");\n if (!existing.includes(\"Holdpoint Rules\")) {\n writeFileSync(cursorPath, existing + \"\\n\" + cursorRules, \"utf8\");\n }\n } else {\n writeFileSync(cursorPath, cursorRules, \"utf8\");\n }\n }\n\n if (agents.includes(\"codex\")) {\n mkdirSync(\".codex\", { recursive: true });\n writeFileSync(\".codex/hooks.json\", buildCodexHooksJson(config), \"utf8\");\n writeFileSync(\".codex/holdpoint-check.mjs\", buildCodexCheckScript(), \"utf8\");\n const agentsMdPath = \"AGENTS.md\";\n const existing = existsSync(agentsMdPath) ? readFileSync(agentsMdPath, \"utf8\") : \"\";\n writeFileSync(agentsMdPath, spliceAgentsMd(existing, config), \"utf8\");\n }\n\n // 4. Create 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)} Agents: ${chalk.cyan(agents.join(\", \"))}\n`);\n}\n","import { existsSync, readFileSync } from \"node:fs\";\nimport type { AgentType, StackType } from \"@holdpoint/types\";\n\n/** @deprecated Use detectInstalledAgents() — single-agent detection is no longer the default. */\nexport function detectAgent(): AgentType {\n if (existsSync(\".github/extensions\")) return \"copilot\";\n if (existsSync(\".claude\")) return \"claude\";\n if (existsSync(\".cursorrules\")) return \"cursor\";\n if (existsSync(\".codex\")) return \"codex\";\n return \"unknown\";\n}\n\n/**\n * Returns every agent whose Holdpoint engine files are already present in the\n * current working directory. Used by `holdpoint update` so it regenerates only\n * the engines that were previously installed.\n */\nexport function detectInstalledAgents(): AgentType[] {\n const agents: AgentType[] = [];\n if (existsSync(\".github/hooks/holdpoint.json\")) agents.push(\"copilot\");\n if (existsSync(\".claude/settings.json\")) agents.push(\"claude\");\n if (existsSync(\".cursorrules\")) {\n try {\n if (readFileSync(\".cursorrules\", \"utf8\").includes(\"Holdpoint Rules\")) {\n agents.push(\"cursor\");\n }\n } catch {\n /* ignore unreadable file */\n }\n }\n // Detect Codex by the generated check script (more specific than .codex/ existence)\n if (existsSync(\".codex/holdpoint-check.mjs\")) agents.push(\"codex\");\n return agents;\n}\n\nexport function detectStack(): StackType {\n const hasNext =\n existsSync(\"next.config.ts\") || existsSync(\"next.config.js\") || existsSync(\"next.config.mjs\");\n const hasTsConfig = existsSync(\"tsconfig.json\");\n const hasPyproject =\n existsSync(\"pyproject.toml\") || existsSync(\"requirements.txt\") || existsSync(\"setup.py\");\n const hasPrisma = existsSync(\"prisma/schema.prisma\");\n const hasApi = existsSync(\"server\") || existsSync(\"api\") || existsSync(\"backend\");\n const hasGoMod = existsSync(\"go.mod\");\n\n if (hasNext && (hasPrisma || hasApi)) return \"fullstack\";\n if (hasNext) return \"nextjs\";\n if (hasTsConfig) return \"typescript\";\n if (hasPyproject) return \"python\";\n if (hasGoMod) return \"go\";\n return \"unknown\";\n}\n","import { existsSync, readFileSync, writeFileSync, mkdirSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport chalk from \"chalk\";\nimport ora from \"ora\";\nimport { parseHoldpointYaml, matchesWhen } from \"@holdpoint/yaml-core\";\nimport { runDeterministicChecks } from \"@holdpoint/yaml-core/runner\";\nimport type { CheckResult } 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\nconst COMMIT_CACHE_PATH = \".holdpoint/checked-commits.json\";\nconst COMMIT_CACHE_MAX = 100;\n\nfunction getStagedFiles(): string[] {\n try {\n const out = execSync(\"git diff --cached --name-only\", {\n encoding: \"utf8\",\n stdio: [\"pipe\", \"pipe\", \"ignore\"],\n });\n return out.trim().split(\"\\n\").filter(Boolean);\n } catch {\n return [];\n }\n}\n\nfunction getAllChangedFiles(): string[] {\n try {\n const out = execSync(\"git diff --name-only HEAD\", {\n encoding: \"utf8\",\n stdio: [\"pipe\", \"pipe\", \"ignore\"],\n });\n return out.trim().split(\"\\n\").filter(Boolean);\n } catch {\n return [];\n }\n}\n\n/**\n * Returns the files changed in the most recent commit (HEAD vs HEAD~1).\n * Used as a fallback when no staged files exist but the agent has already committed.\n */\nfunction getLastCommitFiles(): string[] {\n try {\n const out = execSync(\"git diff --name-only HEAD~1 HEAD\", {\n encoding: \"utf8\",\n stdio: [\"pipe\", \"pipe\", \"ignore\"],\n });\n return out.trim().split(\"\\n\").filter(Boolean);\n } catch {\n return [];\n }\n}\n\n/** Returns the current HEAD commit SHA, or null if unavailable. */\nfunction getHeadSha(): string | null {\n try {\n return execSync(\"git rev-parse HEAD\", {\n encoding: \"utf8\",\n stdio: [\"pipe\", \"pipe\", \"ignore\"],\n }).trim();\n } catch {\n return null;\n }\n}\n\n/** Returns the set of already-verified commit SHAs from the local cache. */\nfunction readCommitCache(): Set<string> {\n try {\n const raw = readFileSync(COMMIT_CACHE_PATH, \"utf8\");\n const parsed = JSON.parse(raw) as { verified?: unknown };\n return new Set(Array.isArray(parsed.verified) ? (parsed.verified as string[]) : []);\n } catch {\n return new Set();\n }\n}\n\n/**\n * Records a commit SHA as verified in the local cache.\n * Caps the cache at COMMIT_CACHE_MAX entries (newest first).\n */\nfunction recordCommitCache(sha: string): void {\n try {\n const existing = readCommitCache();\n const updated = [sha, ...[...existing].filter((s) => s !== sha)].slice(0, COMMIT_CACHE_MAX);\n mkdirSync(join(COMMIT_CACHE_PATH, \"..\"), { recursive: true });\n writeFileSync(COMMIT_CACHE_PATH, JSON.stringify({ verified: updated }, null, 2) + \"\\n\", \"utf8\");\n } catch {\n // Non-fatal: cache write failure just means the next run re-checks this commit.\n }\n}\n\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 let changedFiles: string[];\n let headSha: string | null = null;\n\n if (options.staged) {\n const staged = getStagedFiles();\n if (staged.length > 0) {\n changedFiles = staged;\n } else {\n // Nothing staged — check if HEAD was already verified to avoid a check loop.\n headSha = getHeadSha();\n if (headSha && readCommitCache().has(headSha)) {\n console.log(\n chalk.green(`✓ Commit ${headSha.slice(0, 8)} already verified — nothing to re-check.`),\n );\n process.exit(0);\n }\n\n // Fall back to files in the most recent commit (covers the\n // \"agent committed then called task_complete\" workflow).\n const lastCommit = getLastCommitFiles();\n if (lastCommit.length > 0) {\n changedFiles = lastCommit;\n console.log(\n chalk.yellow(\"No staged files. Running checks scoped to the most recent commit's files.\"),\n );\n } else {\n // Truly nothing changed (investigative session, no recent commit).\n console.log(chalk.green(\"✓ No staged changes and no recent commit — nothing to check.\"));\n process.exit(0);\n }\n }\n } else {\n changedFiles = getAllChangedFiles();\n if (changedFiles.length === 0) {\n console.log(\n chalk.yellow(\"No changed files detected. Running all checks with no file filter.\"),\n );\n }\n }\n\n // Print project guides so the agent/human sees them before running checks\n const guides = Object.entries(config.context?.guides ?? {});\n if (guides.length > 0) {\n console.log(chalk.cyan(\"\\nProject guides:\"));\n for (const [key, text] of guides) {\n console.log(chalk.bold(` ${key}:`), chalk.dim(String(text).trim()));\n }\n console.log(\"\");\n }\n\n const taskCount = config.checks.filter((c) => c.cmd !== undefined).length;\n const spinner = ora(`Running ${taskCount} task(s)…`).start();\n const effectiveFiles = changedFiles.length > 0 ? changedFiles : [\"__all__\"];\n const results = runDeterministicChecks(config, effectiveFiles);\n\n // 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 // All checks passed — if we ran against a committed HEAD (no staged files), mark it verified\n // so subsequent task_complete calls on the same commit skip straight through.\n if (headSha) {\n recordCommitCache(headSha);\n }\n}\n\nfunction printResult(result: CheckResult): void {\n const icon =\n result.status === \"pass\"\n ? chalk.green(\"✓\")\n : result.status === \"fail\"\n ? chalk.red(\"✗\")\n : result.status === \"skip\"\n ? chalk.gray(\"◌\")\n : chalk.yellow(\"…\");\n\n const label = result.check.label;\n console.log(`${icon} ${label}`);\n\n if (result.status === \"fail\" && result.output) {\n const trimmed = result.output.trim().split(\"\\n\").slice(0, 10).join(\"\\n\");\n console.log(chalk.dim(trimmed.replace(/^/gm, \" \")));\n }\n if (result.status === \"skip\" && result.skipReason) {\n console.log(chalk.dim(` ${result.skipReason}`));\n }\n}\n","import { existsSync, readFileSync, 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 {\n buildHookJson,\n buildCheckScript,\n buildConfigJson,\n buildEngine,\n} from \"@holdpoint/engine-copilot\";\nimport { buildEngineJson as buildClaudeEngineJson } from \"@holdpoint/engine-claude\";\nimport { buildEngine as buildCursorEngine } from \"@holdpoint/engine-cursor\";\nimport {\n buildHooksJson as buildCodexHooksJson,\n buildCheckScript as buildCodexCheckScript,\n spliceAgentsMd,\n} from \"@holdpoint/engine-codex\";\nimport { detectInstalledAgents } from \"../detect.js\";\nimport type { AgentType } from \"@holdpoint/types\";\n\n/**\n * Regenerate all Holdpoint engine adapter files from the current `checks.yaml`.\n *\n * Detects which agents were previously installed via `detectInstalledAgents()` and\n * regenerates only their files. Falls back to all four agents if no engine files\n * are found (e.g. first run after a manual `checks.yaml` edit).\n */\nexport async function updateCommand(): Promise<void> {\n if (!existsSync(\"checks.yaml\")) {\n console.error(chalk.red(\"No checks.yaml found. Run `holdpoint init` first.\"));\n process.exit(1);\n }\n\n const spinner = ora(\"Updating Holdpoint engine files…\").start();\n const config = parseHoldpointYaml(readFileSync(\"checks.yaml\", \"utf8\"));\n\n // Regenerate for every agent that was previously installed.\n // Fall back to all four if no engine files exist yet (e.g. first run after manual checks.yaml edit).\n const detected = detectInstalledAgents();\n const agents: AgentType[] =\n detected.length > 0 ? detected : [\"copilot\", \"claude\", \"cursor\", \"codex\"];\n\n // Always write checks.immutable.json — read by holdpoint-check.mjs at runtime\n const generatedDir = \".github/holdpoint/generated\";\n mkdirSync(generatedDir, { recursive: true });\n writeFileSync(`${generatedDir}/checks.immutable.json`, buildConfigJson(config), \"utf8\");\n\n if (agents.includes(\"copilot\")) {\n const 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 const extDir = \".github/extensions/holdpoint\";\n mkdirSync(extDir, { recursive: true });\n writeFileSync(`${extDir}/extension.mjs`, buildEngine(config), \"utf8\");\n }\n\n if (agents.includes(\"claude\")) {\n mkdirSync(\".claude\", { recursive: true });\n const settingsPath = \".claude/settings.json\";\n let existing: Record<string, unknown> = {};\n if (existsSync(settingsPath)) {\n try {\n existing = JSON.parse(readFileSync(settingsPath, \"utf8\")) as Record<string, unknown>;\n } catch {\n /* */\n }\n }\n const hooks = JSON.parse(buildClaudeEngineJson(config)) as Record<string, unknown>;\n writeFileSync(\n settingsPath,\n JSON.stringify({ ...existing, hooks: hooks.hooks }, null, 2) + \"\\n\",\n );\n }\n\n if (agents.includes(\"cursor\")) {\n const cursorRules = buildCursorEngine(config);\n const cursorPath = \".cursorrules\";\n if (existsSync(cursorPath)) {\n const content = readFileSync(cursorPath, \"utf8\");\n const start = content.indexOf(\"# ─── Holdpoint Rules\");\n const end = content.indexOf(\"# ─── End Holdpoint Rules ───\");\n if (start !== -1 && end !== -1) {\n // Slice past the end-marker line (find its newline to avoid hardcoded offsets)\n const afterEnd = content.indexOf(\"\\n\", end);\n const updated =\n content.slice(0, start) +\n cursorRules +\n content.slice(afterEnd === -1 ? end : afterEnd + 1);\n writeFileSync(cursorPath, updated);\n } else {\n writeFileSync(cursorPath, content + \"\\n\" + cursorRules);\n }\n }\n }\n\n if (agents.includes(\"codex\")) {\n mkdirSync(\".codex\", { recursive: true });\n // hooks.json is fully managed by Holdpoint; users who need additional Codex hooks\n // should add them in .codex/config.toml (Codex merges both sources).\n writeFileSync(\".codex/hooks.json\", buildCodexHooksJson(config), \"utf8\");\n writeFileSync(\".codex/holdpoint-check.mjs\", buildCodexCheckScript(), \"utf8\");\n const agentsMdPath = \"AGENTS.md\";\n const existing = existsSync(agentsMdPath) ? readFileSync(agentsMdPath, \"utf8\") : \"\";\n writeFileSync(agentsMdPath, spliceAgentsMd(existing, config), \"utf8\");\n }\n\n spinner.succeed(chalk.green(\"Engine files updated from current checks.yaml\"));\n}\n","import { createServer, type IncomingMessage, type ServerResponse } from \"node:http\";\nimport { createReadStream, existsSync } from \"node:fs\";\nimport { join, extname, dirname } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { execSync } from \"node:child_process\";\nimport chalk from \"chalk\";\n\nconst __dirname = dirname(fileURLToPath(import.meta.url));\n\nconst MIME: Record<string, string> = {\n \".html\": \"text/html; charset=utf-8\",\n \".js\": \"text/javascript\",\n \".mjs\": \"text/javascript\",\n \".css\": \"text/css\",\n \".svg\": \"image/svg+xml\",\n \".png\": \"image/png\",\n \".ico\": \"image/x-icon\",\n \".woff\": \"font/woff\",\n \".woff2\": \"font/woff2\",\n \".ttf\": \"font/ttf\",\n \".json\": \"application/json\",\n};\n\n/**\n * Serve a static file with the appropriate MIME type.\n */\nfunction serveFile(res: ServerResponse, filePath: string): void {\n const mime = MIME[extname(filePath)] ?? \"application/octet-stream\";\n res.writeHead(200, { \"Content-Type\": mime });\n createReadStream(filePath).pipe(res);\n}\n\n/**\n * Handle an incoming HTTP request: serve `/__holdpoint/initial-yaml` from the\n * user's `checks.yaml`, and all other paths as static files from `uiDir` with\n * a SPA fallback to `index.html`.\n */\nfunction handleRequest(req: IncomingMessage, res: ServerResponse, uiDir: string): void {\n const url = (req.url ?? \"/\").split(\"?\")[0] ?? \"/\";\n\n // Serve the user's checks.yaml for the builder UI to load\n if (url === \"/__holdpoint/initial-yaml\") {\n const checksPath = join(process.cwd(), \"checks.yaml\");\n if (existsSync(checksPath)) {\n res.writeHead(200, { \"Content-Type\": \"text/yaml; charset=utf-8\" });\n createReadStream(checksPath).pipe(res);\n } else {\n res.writeHead(404, { \"Content-Type\": \"text/plain\" });\n res.end(\"checks.yaml not found in current directory\");\n }\n return;\n }\n\n // Static files\n const candidate = join(uiDir, url === \"/\" ? \"index.html\" : url);\n const filePath = existsSync(candidate) ? candidate : join(uiDir, \"index.html\"); // SPA fallback\n serveFile(res, filePath);\n}\n\n/**\n * Start the Holdpoint visual builder on localhost:4321.\n *\n * Serves the pre-built React SPA from `dist/builder-ui/` (bundled into the CLI\n * package at publish time) and exposes a `/__holdpoint/initial-yaml` endpoint\n * that returns the user's `checks.yaml` so the builder can load it on startup.\n */\nexport async function buildCommand(): Promise<void> {\n const port = 4321;\n const uiDir = join(__dirname, \"builder-ui\");\n\n if (!existsSync(uiDir)) {\n console.error(chalk.red(\"✗ Builder UI not found.\\n\"));\n console.log(chalk.dim(\" This is unexpected for a published build of @holdpoint/cli.\"));\n console.log(chalk.dim(\" If you installed from source, rebuild with: pnpm turbo build\\n\"));\n process.exit(1);\n }\n\n const server = createServer((req, res) => handleRequest(req, res, uiDir));\n\n await new Promise<void>((resolve, reject) => {\n server.listen(port, () => {\n console.log(\n `\\n${chalk.green(\"✓\")} Holdpoint builder running at ${chalk.cyan(`http://localhost:${port}`)}`,\n );\n console.log(chalk.dim(\" Edit checks.yaml, then reload the page to see updates\"));\n console.log(chalk.dim(\" Press Ctrl+C to stop\\n\"));\n\n const openCmd =\n process.platform === \"darwin\"\n ? \"open\"\n : process.platform === \"win32\"\n ? \"start\"\n : \"xdg-open\";\n try {\n execSync(`${openCmd} http://localhost:${port}`, { stdio: \"ignore\" });\n } catch {\n /* non-fatal */\n }\n });\n\n server.on(\"error\", reject);\n\n process.on(\"SIGINT\", () => {\n console.log(chalk.dim(\"\\n Stopping builder…\"));\n server.close(() => resolve());\n });\n });\n}\n","import { existsSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { execSync } from \"node:child_process\";\nimport chalk from \"chalk\";\nimport ora from \"ora\";\nimport { parseHoldpointYaml, generateYaml } from \"@holdpoint/yaml-core\";\nimport type { HoldpointConfig, CheckDef, ConditionDef } from \"@holdpoint/types\";\nimport { scanProject } from \"../evolve/scanner.js\";\nimport { getRepoFiles, detectStaleChecks } from \"../evolve/dead-checker.js\";\nimport { getTemplates } from \"../evolve/templates.js\";\n\n// ── Helpers ───────────────────────────────────────────────────────────────────\n\n/**\n * Strip leading comment lines from a checks.yaml so we can re-prepend them\n * after re-serialising — preserves the documentation header.\n */\nfunction extractHeader(yaml: string): string {\n const lines = yaml.split(\"\\n\");\n const commentLines: string[] = [];\n for (const line of lines) {\n if (line.startsWith(\"#\") || (commentLines.length > 0 && line.trim() === \"\")) {\n commentLines.push(line);\n } else {\n break;\n }\n }\n // Trim trailing blank lines\n while (commentLines.length > 0 && commentLines[commentLines.length - 1]?.trim() === \"\") {\n commentLines.pop();\n }\n return commentLines.join(\"\\n\");\n}\n\nfunction withHeader(header: string, newYaml: string): string {\n if (!header) return newYaml;\n return header + \"\\n\\n\" + newYaml;\n}\n\n// ── The command ───────────────────────────────────────────────────────────────\n\nexport async function evolveCommand(options: { apply?: boolean }): Promise<void> {\n if (!existsSync(\"checks.yaml\")) {\n console.error(chalk.red(\"No checks.yaml found. Run `holdpoint init` first.\"));\n process.exit(1);\n }\n\n const spinner = ora(\"Scanning project profile…\").start();\n const cwd = process.cwd();\n\n // 1. Scan project\n const profile = scanProject(cwd);\n const repoFiles = getRepoFiles(cwd);\n\n // 2. Parse checks.yaml\n const yamlContent = readFileSync(\"checks.yaml\", \"utf8\");\n let config: HoldpointConfig;\n try {\n config = parseHoldpointYaml(yamlContent);\n } catch (err: unknown) {\n spinner.fail(chalk.red(\"Invalid checks.yaml:\") + \" \" + (err as Error).message);\n process.exit(1);\n }\n\n spinner.stop();\n\n // 3. Compute proposals — templates whose trigger matches AND id not already in config\n const existingIds = new Set(config.checks.map((c) => c.id));\n const existingConditionIds = new Set(config.conditions.map((c) => c.id));\n const allTemplates = getTemplates(profile);\n const proposals = allTemplates.filter((t) => t.trigger(profile) && !existingIds.has(t.id));\n\n // 4. Detect stale checks\n const staleChecks = detectStaleChecks(config, repoFiles);\n\n // ── Print report ─────────────────────────────────────────────────────────\n\n // Profile summary — show detected items\n console.log(chalk.bold(\"\\n📋 Project profile:\"));\n const traits: [string, boolean, string][] = [\n [\"TypeScript\", profile.hasTypeScript, \"tsconfig.json\"],\n [\"ESLint\", profile.hasEslint, \"eslint.config.*\"],\n [\"Biome\", profile.hasBiome, \"biome.json\"],\n [\"Ruff\", profile.hasRuff, \"pyproject.toml / ruff\"],\n [\"Prettier\", profile.hasPrettier, \".prettierrc\"],\n [\"Vitest\", profile.hasVitest, \"devDependencies\"],\n [\"Jest\", profile.hasJest, \"devDependencies\"],\n [\"Python\", profile.hasPython, \"pyproject.toml\"],\n [\"Pytest\", profile.hasPytest, \"pytest.ini\"],\n [\"Go\", profile.hasGo, \"go.mod\"],\n [\"Rust\", profile.hasRust, \"Cargo.toml\"],\n [\"Next.js\", profile.hasNext, \"next.config.*\"],\n [\"React\", profile.hasReact, \"dependencies\"],\n [\"Prisma\", profile.hasPrisma, \"prisma/schema.prisma\"],\n [\"Drizzle\", profile.hasDrizzle, \"drizzle-orm\"],\n [\"Migrations\", profile.hasMigrations, \"migrations/\"],\n [\"Docker\", profile.hasDocker, \"Dockerfile\"],\n [\"Terraform\", profile.hasTerraform, \"*.tf\"],\n [\"Kubernetes\", profile.hasKubernetes, \"k8s/\"],\n [\"OpenAPI\", profile.hasOpenApi, \"openapi.yaml\"],\n [\"GitHub Actions\", profile.hasGithubActions, \".github/workflows/\"],\n ];\n const detected = traits.filter(([, yes]) => yes);\n if (detected.length === 0) {\n console.log(chalk.dim(\" (empty project — only universal checks apply)\"));\n } else {\n for (const [name, , hint] of detected) {\n console.log(` ${chalk.green(\"✓\")} ${name.padEnd(18)} ${chalk.dim(hint)}`);\n }\n }\n\n // Stale checks\n if (staleChecks.length > 0) {\n console.log(chalk.bold(`\\n⚠️ Stale checks (${staleChecks.length}):`));\n for (const { check, reason, suggestedConditionPath } of staleChecks) {\n const fix = suggestedConditionPath\n ? chalk.dim(` → will wrap with conditionId: file_exists: ${suggestedConditionPath}`)\n : chalk.dim(\" → no path inferred; review manually\");\n console.log(` ${chalk.yellow(\"◌\")} ${chalk.bold(check.id)} ${chalk.dim(reason)}${fix}`);\n }\n }\n\n // Proposals\n if (proposals.length === 0 && staleChecks.length === 0) {\n console.log(chalk.green(\"\\n✓ checks.yaml is fully in sync with the project profile.\"));\n return;\n }\n\n if (proposals.length > 0) {\n console.log(chalk.bold(`\\n💡 Proposed additions (${proposals.length}):`));\n for (const t of proposals) {\n const scope = t.when ? chalk.cyan(` when: ${t.when}`) : \"\";\n const type = t.cmd ? chalk.dim(\"cmd\") : chalk.dim(\"prompt\");\n const preview = t.cmd\n ? chalk.dim(` ${t.cmd.slice(0, 80)}${t.cmd.length > 80 ? \"…\" : \"\"}`)\n : chalk.dim(` ${(t.prompt ?? \"\").slice(0, 80)}${(t.prompt?.length ?? 0) > 80 ? \"…\" : \"\"}`);\n console.log(` ${chalk.green(\"+\")} ${chalk.bold(t.id.padEnd(24))} [${type}]${scope}`);\n console.log(` ${preview}`);\n }\n }\n\n if (!options.apply) {\n console.log(\n chalk.red(`\\n✗ checks.yaml is out of sync with the project profile.`) +\n `\\n Run ${chalk.bold(\"npx @holdpoint/cli@alpha evolve --apply\")} to apply these changes.`,\n );\n process.exit(1);\n }\n\n // ── Apply ───────────────────────────────────────────────────────────────\n\n const applySpinner = ora(\"Applying changes to checks.yaml…\").start();\n\n // Build updated conditions list\n const newConditions = [...config.conditions];\n\n // Collect conditions needed by proposals\n for (const t of proposals) {\n if (t.condition && !existingConditionIds.has(t.condition.id)) {\n newConditions.push(t.condition as ConditionDef);\n existingConditionIds.add(t.condition.id);\n }\n }\n\n // Wrap stale checks with file_exists conditions\n const updatedChecks: CheckDef[] = config.checks.map((check) => {\n const stale = staleChecks.find((s) => s.check.id === check.id);\n if (!stale || !stale.suggestedConditionPath) return check;\n\n const condId = `has-${check.id}`;\n if (!existingConditionIds.has(condId)) {\n newConditions.push({\n id: condId,\n operator: \"file_exists\",\n path: stale.suggestedConditionPath,\n });\n existingConditionIds.add(condId);\n }\n return { ...check, conditionId: condId };\n });\n\n // Append proposed checks\n const newChecks: CheckDef[] = proposals.map((t) => ({\n id: t.id,\n label: t.label,\n ...(t.when ? { when: t.when } : {}),\n ...(t.cmd ? { cmd: t.cmd } : {}),\n ...(t.prompt ? { prompt: t.prompt } : {}),\n ...(t.conditionId ? { conditionId: t.conditionId } : {}),\n }));\n\n const updatedConfig: HoldpointConfig = {\n ...config,\n conditions: newConditions,\n checks: [...updatedChecks, ...newChecks],\n };\n\n const header = extractHeader(yamlContent);\n const newYaml = withHeader(header, generateYaml(updatedConfig));\n writeFileSync(\"checks.yaml\", newYaml, \"utf8\");\n\n // Regenerate engine files\n applySpinner.text = \"Running holdpoint update…\";\n try {\n execSync(\"npx @holdpoint/cli@alpha update\", { stdio: \"pipe\" });\n } catch {\n // holdpoint update failure is non-fatal — checks.yaml is already written\n applySpinner.warn(\n chalk.yellow(\"checks.yaml updated, but `holdpoint update` failed — run it manually.\"),\n );\n printAppliedSummary(proposals.length, staleChecks.length);\n return;\n }\n\n applySpinner.succeed(chalk.green(\"checks.yaml updated and engine files regenerated.\"));\n printAppliedSummary(proposals.length, staleChecks.length);\n}\n\nfunction printAppliedSummary(added: number, wrapped: number): void {\n const parts: string[] = [];\n if (added > 0) parts.push(chalk.green(`${added} check${added === 1 ? \"\" : \"s\"} added`));\n if (wrapped > 0)\n parts.push(chalk.yellow(`${wrapped} stale check${wrapped === 1 ? \"\" : \"s\"} wrapped`));\n if (parts.length > 0) console.log(\" \" + parts.join(\" · \"));\n console.log(\n chalk.dim(\"\\n Review checks.yaml, then commit: \") +\n chalk.yellow(\"git add checks.yaml && git commit -m 'chore: evolve holdpoint checks'\"),\n );\n}\n"],"mappings":"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","names":["existsSync","readFileSync","existsSync","readFileSync","existsSync","readFileSync","writeFileSync","mkdirSync","join","chalk","ora","parseHoldpointYaml","execSync","existsSync","readFileSync","join","existsSync","join","execSync","readdirSync","existsSync","join","execSync","readFileSync","mkdirSync","join","writeFileSync","existsSync","chalk","parseHoldpointYaml","ora","existsSync","readFileSync","chalk","parseHoldpointYaml","existsSync","readFileSync","writeFileSync","mkdirSync","chalk","ora","parseHoldpointYaml","buildHookJson","buildCheckScript","buildConfigJson","buildEngine","buildClaudeEngineJson","buildCursorEngine","buildCodexHooksJson","buildCodexCheckScript","spliceAgentsMd","existsSync","chalk","ora","parseHoldpointYaml","readFileSync","mkdirSync","writeFileSync","buildConfigJson","buildHookJson","buildCheckScript","buildEngine","buildClaudeEngineJson","buildCursorEngine","buildCodexHooksJson","buildCodexCheckScript","spliceAgentsMd","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(\n \"--agent <agent>\",\n \"Agent to install for: copilot | claude | cursor | codex (default: all four)\",\n )\n .action(initCommand);\n\nprogram\n .command(\"check\")\n .description(\"Run task checks from checks.yaml\")\n .option(\"--staged\", \"Only check against git-staged files\")\n .action(checkCommand);\n\nprogram\n .command(\"validate\")\n .description(\"Validate checks.yaml schema and print any errors\")\n .action(validateCommand);\n\nprogram\n .command(\"update\")\n .description(\"Regenerate engine files from current checks.yaml (preserves checks.yaml)\")\n .action(updateCommand);\n\nprogram\n .command(\"builder\")\n .description(\"Open the visual builder UI on localhost:4321\")\n .action(buildCommand);\n\nprogram\n .command(\"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 {\n buildHookJson,\n buildCheckScript,\n buildConfigJson,\n buildEngine,\n} from \"@holdpoint/engine-copilot\";\nimport { buildEngineJson as buildClaudeEngineJson } from \"@holdpoint/engine-claude\";\nimport { buildEngine as buildCursorEngine } from \"@holdpoint/engine-cursor\";\nimport {\n buildHooksJson as buildCodexHooksJson,\n buildCheckScript as buildCodexCheckScript,\n spliceAgentsMd,\n buildAgentsMd,\n} from \"@holdpoint/engine-codex\";\nimport { parseHoldpointYaml } from \"@holdpoint/yaml-core\";\nimport type { AgentType, StackType } from \"@holdpoint/types\";\nimport { detectStack } 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\n/**\n * Initialise Holdpoint in the current project.\n *\n * Writes `checks.yaml` (from a stack template if available), `checks.immutable.json`,\n * and engine adapter files for each target agent (Copilot, Claude, Cursor, Codex).\n * Defaults to installing all four agents; pass `--agent` to restrict to one.\n */\nexport async function initCommand(options: { stack?: string; agent?: string }): Promise<void> {\n const spinner = ora(\"Initialising Holdpoint…\").start();\n\n const stack = (options.stack as StackType | undefined) ?? detectStack();\n\n // Default: install for all agents. Pass --agent=copilot|claude|cursor to restrict.\n const agentOpt = options.agent;\n const agents: AgentType[] =\n !agentOpt || agentOpt === \"all\"\n ? [\"copilot\", \"claude\", \"cursor\", \"codex\"]\n : [agentOpt as AgentType];\n\n spinner.text = `Stack: ${chalk.cyan(stack)} — installing for: ${chalk.cyan(agents.join(\", \"))}`;\n\n // 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 for each target agent\n if (agents.includes(\"copilot\")) {\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 // extension.mjs: loaded by the Copilot CLI local agent at session start\n const extDir = \".github/extensions/holdpoint\";\n mkdirSync(extDir, { recursive: true });\n writeFileSync(join(extDir, \"extension.mjs\"), buildEngine(config), \"utf8\");\n }\n\n if (agents.includes(\"claude\")) {\n mkdirSync(\".claude\", { recursive: true });\n const settingsPath = \".claude/settings.json\";\n let existing: Record<string, unknown> = {};\n if (existsSync(settingsPath)) {\n try {\n existing = JSON.parse(readFileSync(settingsPath, \"utf8\")) as Record<string, unknown>;\n } catch {\n /* ignore */\n }\n }\n const holdpointHooks = JSON.parse(buildClaudeEngineJson(config)) as Record<string, unknown>;\n writeFileSync(\n settingsPath,\n JSON.stringify({ ...existing, hooks: holdpointHooks.hooks }, null, 2),\n \"utf8\",\n );\n }\n\n if (agents.includes(\"cursor\")) {\n const cursorRules = buildCursorEngine(config);\n const cursorPath = \".cursorrules\";\n if (existsSync(cursorPath)) {\n const existing = readFileSync(cursorPath, \"utf8\");\n if (!existing.includes(\"Holdpoint Rules\")) {\n writeFileSync(cursorPath, existing + \"\\n\" + cursorRules, \"utf8\");\n }\n } else {\n writeFileSync(cursorPath, cursorRules, \"utf8\");\n }\n }\n\n if (agents.includes(\"codex\")) {\n mkdirSync(\".codex\", { recursive: true });\n writeFileSync(\".codex/hooks.json\", buildCodexHooksJson(config), \"utf8\");\n writeFileSync(\".codex/holdpoint-check.mjs\", buildCodexCheckScript(), \"utf8\");\n const agentsMdPath = \"AGENTS.md\";\n const existing = existsSync(agentsMdPath) ? readFileSync(agentsMdPath, \"utf8\") : \"\";\n writeFileSync(agentsMdPath, spliceAgentsMd(existing, config), \"utf8\");\n }\n\n // 4. Create 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)} Agents: ${chalk.cyan(agents.join(\", \"))}\n`);\n}\n","import { existsSync, readFileSync } from \"node:fs\";\nimport type { AgentType, StackType } from \"@holdpoint/types\";\n\n/** @deprecated Use detectInstalledAgents() — single-agent detection is no longer the default. */\nexport function detectAgent(): AgentType {\n if (existsSync(\".github/extensions\")) return \"copilot\";\n if (existsSync(\".claude\")) return \"claude\";\n if (existsSync(\".cursorrules\")) return \"cursor\";\n if (existsSync(\".codex\")) return \"codex\";\n return \"unknown\";\n}\n\n/**\n * Returns every agent whose Holdpoint engine files are already present in the\n * current working directory. Used by `holdpoint update` so it regenerates only\n * the engines that were previously installed.\n */\nexport function detectInstalledAgents(): AgentType[] {\n const agents: AgentType[] = [];\n if (existsSync(\".github/hooks/holdpoint.json\")) agents.push(\"copilot\");\n if (existsSync(\".claude/settings.json\")) agents.push(\"claude\");\n if (existsSync(\".cursorrules\")) {\n try {\n if (readFileSync(\".cursorrules\", \"utf8\").includes(\"Holdpoint Rules\")) {\n agents.push(\"cursor\");\n }\n } catch {\n /* ignore unreadable file */\n }\n }\n // Detect Codex by the generated check script (more specific than .codex/ existence)\n if (existsSync(\".codex/holdpoint-check.mjs\")) agents.push(\"codex\");\n return agents;\n}\n\nexport function detectStack(): StackType {\n const hasNext =\n existsSync(\"next.config.ts\") || existsSync(\"next.config.js\") || existsSync(\"next.config.mjs\");\n const hasTsConfig = existsSync(\"tsconfig.json\");\n const hasPyproject =\n existsSync(\"pyproject.toml\") || existsSync(\"requirements.txt\") || existsSync(\"setup.py\");\n const hasPrisma = existsSync(\"prisma/schema.prisma\");\n const hasApi = existsSync(\"server\") || existsSync(\"api\") || existsSync(\"backend\");\n const hasGoMod = existsSync(\"go.mod\");\n\n if (hasNext && (hasPrisma || hasApi)) return \"fullstack\";\n if (hasNext) return \"nextjs\";\n if (hasTsConfig) return \"typescript\";\n if (hasPyproject) return \"python\";\n if (hasGoMod) return \"go\";\n return \"unknown\";\n}\n","import { existsSync, readFileSync, writeFileSync, mkdirSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport chalk from \"chalk\";\nimport ora from \"ora\";\nimport { parseHoldpointYaml, matchesWhen } from \"@holdpoint/yaml-core\";\nimport { runDeterministicChecks } from \"@holdpoint/yaml-core/runner\";\nimport type { CheckResult, CheckRun, CheckReports } from \"@holdpoint/types\";\nimport { execSync } from \"node:child_process\";\nimport { scanProject } from \"../evolve/scanner.js\";\nimport { getTemplates } from \"../evolve/templates.js\";\nimport { detectStaleChecks, getRepoFiles } from \"../evolve/dead-checker.js\";\n\nconst COMMIT_CACHE_PATH = \".holdpoint/checked-commits.json\";\nconst COMMIT_CACHE_MAX = 100;\nconst CHECK_REPORTS_PATH = \".holdpoint/check-reports.json\";\nconst CHECK_REPORTS_MAX = 50;\n\nfunction getStagedFiles(): string[] {\n try {\n const out = execSync(\"git diff --cached --name-only\", {\n encoding: \"utf8\",\n stdio: [\"pipe\", \"pipe\", \"ignore\"],\n });\n return out.trim().split(\"\\n\").filter(Boolean);\n } catch {\n return [];\n }\n}\n\nfunction getAllChangedFiles(): string[] {\n try {\n const out = execSync(\"git diff --name-only HEAD\", {\n encoding: \"utf8\",\n stdio: [\"pipe\", \"pipe\", \"ignore\"],\n });\n return out.trim().split(\"\\n\").filter(Boolean);\n } catch {\n return [];\n }\n}\n\n/**\n * Returns the files changed in the most recent commit (HEAD vs HEAD~1).\n * Used as a fallback when no staged files exist but the agent has already committed.\n */\nfunction getLastCommitFiles(): string[] {\n try {\n const out = execSync(\"git diff --name-only HEAD~1 HEAD\", {\n encoding: \"utf8\",\n stdio: [\"pipe\", \"pipe\", \"ignore\"],\n });\n return out.trim().split(\"\\n\").filter(Boolean);\n } catch {\n return [];\n }\n}\n\n/** Returns the current HEAD commit SHA, or null if unavailable. */\nfunction getHeadSha(): string | null {\n try {\n return execSync(\"git rev-parse HEAD\", {\n encoding: \"utf8\",\n stdio: [\"pipe\", \"pipe\", \"ignore\"],\n }).trim();\n } catch {\n return null;\n }\n}\n\n/** Returns the set of already-verified commit SHAs from the local cache. */\nfunction readCommitCache(): Set<string> {\n try {\n const raw = readFileSync(COMMIT_CACHE_PATH, \"utf8\");\n const parsed = JSON.parse(raw) as { verified?: unknown };\n return new Set(Array.isArray(parsed.verified) ? (parsed.verified as string[]) : []);\n } catch {\n return new Set();\n }\n}\n\n/**\n * Records a commit SHA as verified in the local cache.\n * Caps the cache at COMMIT_CACHE_MAX entries (newest first).\n */\nfunction recordCommitCache(sha: string): void {\n try {\n const existing = readCommitCache();\n const updated = [sha, ...[...existing].filter((s) => s !== sha)].slice(0, COMMIT_CACHE_MAX);\n mkdirSync(join(COMMIT_CACHE_PATH, \"..\"), { recursive: true });\n writeFileSync(COMMIT_CACHE_PATH, JSON.stringify({ verified: updated }, null, 2) + \"\\n\", \"utf8\");\n } catch {\n // Non-fatal: cache write failure just means the next run re-checks this commit.\n }\n}\n\n/**\n * Appends a check run report to `.holdpoint/check-reports.json`.\n * Caps to CHECK_REPORTS_MAX runs, newest first. Non-fatal if write fails.\n */\nfunction recordCheckReport(run: CheckRun): void {\n try {\n mkdirSync(join(CHECK_REPORTS_PATH, \"..\"), { recursive: true });\n let existing: CheckReports = { runs: [] };\n if (existsSync(CHECK_REPORTS_PATH)) {\n try {\n existing = JSON.parse(readFileSync(CHECK_REPORTS_PATH, \"utf8\")) as CheckReports;\n if (!Array.isArray(existing.runs)) existing.runs = [];\n } catch {\n existing = { runs: [] };\n }\n }\n const updated: CheckReports = {\n runs: [run, ...existing.runs].slice(0, CHECK_REPORTS_MAX),\n };\n writeFileSync(CHECK_REPORTS_PATH, JSON.stringify(updated, null, 2) + \"\\n\", \"utf8\");\n } catch {\n // Non-fatal: report write failure does not affect check outcomes.\n }\n}\n\nexport async function checkCommand(options: { staged?: boolean }): Promise<void> {\n if (!existsSync(\"checks.yaml\")) {\n console.error(chalk.red(\"No checks.yaml found. Run `holdpoint init` first.\"));\n process.exit(1);\n }\n\n const yamlContent = readFileSync(\"checks.yaml\", \"utf8\");\n let config;\n try {\n config = parseHoldpointYaml(yamlContent);\n } catch (err: unknown) {\n console.error(chalk.red(\"Invalid checks.yaml:\"), (err as Error).message);\n process.exit(1);\n }\n\n // Always resolve HEAD SHA — used for both cache and reports.\n const headSha = getHeadSha();\n\n let changedFiles: string[];\n let usedHeadShaForCache = false;\n\n if (options.staged) {\n const staged = getStagedFiles();\n if (staged.length > 0) {\n changedFiles = staged;\n } else {\n // Nothing staged — check if HEAD was already verified to avoid a check loop.\n if (headSha && readCommitCache().has(headSha)) {\n console.log(\n chalk.green(`✓ Commit ${headSha.slice(0, 8)} already verified — nothing to re-check.`),\n );\n process.exit(0);\n }\n\n // Fall back to files in the most recent commit (covers the\n // \"agent committed then called task_complete\" workflow).\n const lastCommit = getLastCommitFiles();\n if (lastCommit.length > 0) {\n changedFiles = lastCommit;\n usedHeadShaForCache = true;\n console.log(\n chalk.yellow(\"No staged files. Running checks scoped to the most recent commit's files.\"),\n );\n } else {\n // Truly nothing changed (investigative session, no recent commit).\n console.log(chalk.green(\"✓ No staged changes and no recent commit — nothing to check.\"));\n process.exit(0);\n }\n }\n } else {\n changedFiles = getAllChangedFiles();\n if (changedFiles.length === 0) {\n console.log(\n chalk.yellow(\"No changed files detected. Running all checks with no file filter.\"),\n );\n console.log(\n chalk.dim(\n \" Tip: if you just ran `holdpoint init`, commit the generated files to clear the git-commit check.\",\n ),\n );\n }\n }\n\n // Print project guides so the agent/human sees them before running checks\n const guides = Object.entries(config.context?.guides ?? {});\n if (guides.length > 0) {\n console.log(chalk.cyan(\"\\nProject guides:\"));\n for (const [key, text] of guides) {\n console.log(chalk.bold(` ${key}:`), chalk.dim(String(text).trim()));\n }\n console.log(\"\");\n }\n\n const taskCount = config.checks.filter((c) => c.cmd !== undefined).length;\n const spinner = ora(`Running ${taskCount} task(s)…`).start();\n const effectiveFiles = changedFiles.length > 0 ? changedFiles : [\"__all__\"];\n const results = runDeterministicChecks(config, effectiveFiles);\n\n // 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 // Write rich check run report BEFORE exiting so failed runs are always recorded.\n const reportResults = [\n ...results.map((r) => ({\n id: r.check.id,\n label: r.check.label,\n kind: \"cmd\" as const,\n status: r.status as \"pass\" | \"fail\" | \"skip\",\n ...(r.output !== undefined ? { output: r.output } : {}),\n ...(r.exitCode !== undefined ? { exitCode: r.exitCode } : {}),\n ...(r.skipReason !== undefined ? { skipReason: r.skipReason } : {}),\n })),\n ...promptChecks.map((c) => ({\n id: c.id,\n label: c.label,\n kind: \"prompt\" as const,\n status: \"shown\" as const,\n })),\n ];\n\n const run = {\n sha: headSha,\n shortSha: headSha ? headSha.slice(0, 8) : null,\n timestamp: new Date().toISOString(),\n files: changedFiles.length > 0 ? changedFiles : [],\n results: reportResults,\n summary: {\n passed: passed.length,\n failed: failed.length,\n skipped: skipped.length,\n shown: promptChecks.length,\n },\n };\n recordCheckReport(run);\n\n if (failed.length > 0) {\n process.exit(1);\n }\n\n // All checks passed — if we ran against a committed HEAD (no staged files), mark it verified.\n if (usedHeadShaForCache && headSha) {\n recordCommitCache(headSha);\n }\n}\n\nfunction printResult(result: CheckResult): void {\n const icon =\n result.status === \"pass\"\n ? chalk.green(\"✓\")\n : result.status === \"fail\"\n ? chalk.red(\"✗\")\n : result.status === \"skip\"\n ? chalk.gray(\"◌\")\n : chalk.yellow(\"…\");\n\n const label = result.check.label;\n console.log(`${icon} ${label}`);\n\n if (result.status === \"fail\" && result.output) {\n const trimmed = result.output.trim().split(\"\\n\").slice(0, 10).join(\"\\n\");\n console.log(chalk.dim(trimmed.replace(/^/gm, \" \")));\n }\n if (result.status === \"skip\" && result.skipReason) {\n console.log(chalk.dim(` ${result.skipReason}`));\n }\n}\n","import { existsSync, readFileSync, 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 {\n buildHookJson,\n buildCheckScript,\n buildConfigJson,\n buildEngine,\n} from \"@holdpoint/engine-copilot\";\nimport { buildEngineJson as buildClaudeEngineJson } from \"@holdpoint/engine-claude\";\nimport { buildEngine as buildCursorEngine } from \"@holdpoint/engine-cursor\";\nimport {\n buildHooksJson as buildCodexHooksJson,\n buildCheckScript as buildCodexCheckScript,\n spliceAgentsMd,\n} from \"@holdpoint/engine-codex\";\nimport { detectInstalledAgents } from \"../detect.js\";\nimport type { AgentType } from \"@holdpoint/types\";\n\n/**\n * Regenerate all Holdpoint engine adapter files from the current `checks.yaml`.\n *\n * Detects which agents were previously installed via `detectInstalledAgents()` and\n * regenerates only their files. Falls back to all four agents if no engine files\n * are found (e.g. first run after a manual `checks.yaml` edit).\n */\nexport async function updateCommand(): Promise<void> {\n if (!existsSync(\"checks.yaml\")) {\n console.error(chalk.red(\"No checks.yaml found. Run `holdpoint init` first.\"));\n process.exit(1);\n }\n\n const spinner = ora(\"Updating Holdpoint engine files…\").start();\n const config = parseHoldpointYaml(readFileSync(\"checks.yaml\", \"utf8\"));\n\n // Regenerate for every agent that was previously installed.\n // Fall back to all four if no engine files exist yet (e.g. first run after manual checks.yaml edit).\n const detected = detectInstalledAgents();\n const agents: AgentType[] =\n detected.length > 0 ? detected : [\"copilot\", \"claude\", \"cursor\", \"codex\"];\n\n // Always write checks.immutable.json — read by holdpoint-check.mjs at runtime\n const generatedDir = \".github/holdpoint/generated\";\n mkdirSync(generatedDir, { recursive: true });\n writeFileSync(`${generatedDir}/checks.immutable.json`, buildConfigJson(config), \"utf8\");\n\n if (agents.includes(\"copilot\")) {\n const 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 const extDir = \".github/extensions/holdpoint\";\n mkdirSync(extDir, { recursive: true });\n writeFileSync(`${extDir}/extension.mjs`, buildEngine(config), \"utf8\");\n }\n\n if (agents.includes(\"claude\")) {\n mkdirSync(\".claude\", { recursive: true });\n const settingsPath = \".claude/settings.json\";\n let existing: Record<string, unknown> = {};\n if (existsSync(settingsPath)) {\n try {\n existing = JSON.parse(readFileSync(settingsPath, \"utf8\")) as Record<string, unknown>;\n } catch {\n /* */\n }\n }\n const hooks = JSON.parse(buildClaudeEngineJson(config)) as Record<string, unknown>;\n writeFileSync(\n settingsPath,\n JSON.stringify({ ...existing, hooks: hooks.hooks }, null, 2) + \"\\n\",\n );\n }\n\n if (agents.includes(\"cursor\")) {\n const cursorRules = buildCursorEngine(config);\n const cursorPath = \".cursorrules\";\n if (existsSync(cursorPath)) {\n const content = readFileSync(cursorPath, \"utf8\");\n const start = content.indexOf(\"# ─── Holdpoint Rules\");\n const end = content.indexOf(\"# ─── End Holdpoint Rules ───\");\n if (start !== -1 && end !== -1) {\n // Slice past the end-marker line (find its newline to avoid hardcoded offsets)\n const afterEnd = content.indexOf(\"\\n\", end);\n const updated =\n content.slice(0, start) +\n cursorRules +\n content.slice(afterEnd === -1 ? end : afterEnd + 1);\n writeFileSync(cursorPath, updated);\n } else {\n writeFileSync(cursorPath, content + \"\\n\" + cursorRules);\n }\n }\n }\n\n if (agents.includes(\"codex\")) {\n mkdirSync(\".codex\", { recursive: true });\n // hooks.json is fully managed by Holdpoint; users who need additional Codex hooks\n // should add them in .codex/config.toml (Codex merges both sources).\n writeFileSync(\".codex/hooks.json\", buildCodexHooksJson(config), \"utf8\");\n writeFileSync(\".codex/holdpoint-check.mjs\", buildCodexCheckScript(), \"utf8\");\n const agentsMdPath = \"AGENTS.md\";\n const existing = existsSync(agentsMdPath) ? readFileSync(agentsMdPath, \"utf8\") : \"\";\n writeFileSync(agentsMdPath, spliceAgentsMd(existing, config), \"utf8\");\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`, `/__holdpoint/initial-reports` from the run history,\n * and all other paths as static files from `uiDir` with a SPA fallback to `index.html`.\n */\nfunction handleRequest(req: IncomingMessage, res: ServerResponse, uiDir: string): void {\n const url = (req.url ?? \"/\").split(\"?\")[0] ?? \"/\";\n\n // Serve the user's checks.yaml for the builder UI to load\n if (url === \"/__holdpoint/initial-yaml\") {\n const checksPath = join(process.cwd(), \"checks.yaml\");\n if (existsSync(checksPath)) {\n res.writeHead(200, { \"Content-Type\": \"text/yaml; charset=utf-8\" });\n createReadStream(checksPath).pipe(res);\n } else {\n res.writeHead(404, { \"Content-Type\": \"text/plain\" });\n res.end(\"checks.yaml not found in current directory\");\n }\n return;\n }\n\n // Serve the check run history for the History tab\n if (url === \"/__holdpoint/initial-reports\") {\n const reportsPath = join(process.cwd(), \".holdpoint\", \"check-reports.json\");\n if (existsSync(reportsPath)) {\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n createReadStream(reportsPath).pipe(res);\n } else {\n res.writeHead(404, { \"Content-Type\": \"text/plain\" });\n res.end(\"No check reports found\");\n }\n return;\n }\n\n // Static files\n const candidate = join(uiDir, url === \"/\" ? \"index.html\" : url);\n const filePath = existsSync(candidate) ? candidate : join(uiDir, \"index.html\"); // SPA fallback\n serveFile(res, filePath);\n}\n\n/**\n * Start the Holdpoint visual builder on localhost:4321.\n *\n * Serves the pre-built React SPA from `dist/builder-ui/` (bundled into the CLI\n * package at publish time) and exposes a `/__holdpoint/initial-yaml` endpoint\n * that returns the user's `checks.yaml` so the builder can load it on startup.\n */\nexport async function buildCommand(): Promise<void> {\n const port = 4321;\n const uiDir = join(__dirname, \"builder-ui\");\n\n if (!existsSync(uiDir)) {\n console.error(chalk.red(\"✗ Builder UI not found.\\n\"));\n console.log(chalk.dim(\" This is unexpected for a published build of @holdpoint/cli.\"));\n console.log(chalk.dim(\" If you installed from source, rebuild with: pnpm turbo build\\n\"));\n process.exit(1);\n }\n\n const server = createServer((req, res) => handleRequest(req, res, uiDir));\n\n await new Promise<void>((resolve, reject) => {\n server.listen(port, () => {\n console.log(\n `\\n${chalk.green(\"✓\")} Holdpoint builder running at ${chalk.cyan(`http://localhost:${port}`)}`,\n );\n console.log(chalk.dim(\" Edit checks.yaml, then reload the page to see updates\"));\n console.log(chalk.dim(\" Press Ctrl+C to stop\\n\"));\n\n const openCmd =\n process.platform === \"darwin\"\n ? \"open\"\n : process.platform === \"win32\"\n ? \"start\"\n : \"xdg-open\";\n try {\n execSync(`${openCmd} http://localhost:${port}`, { stdio: \"ignore\" });\n } catch {\n /* non-fatal */\n }\n });\n\n server.on(\"error\", reject);\n\n process.on(\"SIGINT\", () => {\n console.log(chalk.dim(\"\\n Stopping builder…\"));\n server.close(() => resolve());\n });\n });\n}\n","import { existsSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { execSync } from \"node:child_process\";\nimport chalk from \"chalk\";\nimport ora from \"ora\";\nimport { parseHoldpointYaml, generateYaml } from \"@holdpoint/yaml-core\";\nimport type { HoldpointConfig, CheckDef, ConditionDef } from \"@holdpoint/types\";\nimport { scanProject } from \"../evolve/scanner.js\";\nimport { getRepoFiles, detectStaleChecks } from \"../evolve/dead-checker.js\";\nimport { getTemplates } from \"../evolve/templates.js\";\n\n// ── Helpers ───────────────────────────────────────────────────────────────────\n\n/**\n * Strip leading comment lines from a checks.yaml so we can re-prepend them\n * after re-serialising — preserves the documentation header.\n */\nfunction extractHeader(yaml: string): string {\n const lines = yaml.split(\"\\n\");\n const commentLines: string[] = [];\n for (const line of lines) {\n if (line.startsWith(\"#\") || (commentLines.length > 0 && line.trim() === \"\")) {\n commentLines.push(line);\n } else {\n break;\n }\n }\n // Trim trailing blank lines\n while (commentLines.length > 0 && commentLines[commentLines.length - 1]?.trim() === \"\") {\n commentLines.pop();\n }\n return commentLines.join(\"\\n\");\n}\n\nfunction withHeader(header: string, newYaml: string): string {\n if (!header) return newYaml;\n return header + \"\\n\\n\" + newYaml;\n}\n\n// ── The command ───────────────────────────────────────────────────────────────\n\nexport async function evolveCommand(options: { apply?: boolean }): Promise<void> {\n if (!existsSync(\"checks.yaml\")) {\n console.error(chalk.red(\"No checks.yaml found. Run `holdpoint init` first.\"));\n process.exit(1);\n }\n\n const spinner = ora(\"Scanning project profile…\").start();\n const cwd = process.cwd();\n\n // 1. Scan project\n const profile = scanProject(cwd);\n const repoFiles = getRepoFiles(cwd);\n\n // 2. Parse checks.yaml\n const yamlContent = readFileSync(\"checks.yaml\", \"utf8\");\n let config: HoldpointConfig;\n try {\n config = parseHoldpointYaml(yamlContent);\n } catch (err: unknown) {\n spinner.fail(chalk.red(\"Invalid checks.yaml:\") + \" \" + (err as Error).message);\n process.exit(1);\n }\n\n spinner.stop();\n\n // 3. Compute proposals — templates whose trigger matches AND id not already in config\n const existingIds = new Set(config.checks.map((c) => c.id));\n const existingConditionIds = new Set(config.conditions.map((c) => c.id));\n const allTemplates = getTemplates(profile);\n const proposals = allTemplates.filter((t) => t.trigger(profile) && !existingIds.has(t.id));\n\n // 4. Detect stale checks\n const staleChecks = detectStaleChecks(config, repoFiles);\n\n // ── Print report ─────────────────────────────────────────────────────────\n\n // Profile summary — show detected items\n console.log(chalk.bold(\"\\n📋 Project profile:\"));\n const traits: [string, boolean, string][] = [\n [\"TypeScript\", profile.hasTypeScript, \"tsconfig.json\"],\n [\"ESLint\", profile.hasEslint, \"eslint.config.*\"],\n [\"Biome\", profile.hasBiome, \"biome.json\"],\n [\"Ruff\", profile.hasRuff, \"pyproject.toml / ruff\"],\n [\"Prettier\", profile.hasPrettier, \".prettierrc\"],\n [\"Vitest\", profile.hasVitest, \"devDependencies\"],\n [\"Jest\", profile.hasJest, \"devDependencies\"],\n [\"Python\", profile.hasPython, \"pyproject.toml\"],\n [\"Pytest\", profile.hasPytest, \"pytest.ini\"],\n [\"Go\", profile.hasGo, \"go.mod\"],\n [\"Rust\", profile.hasRust, \"Cargo.toml\"],\n [\"Next.js\", profile.hasNext, \"next.config.*\"],\n [\"React\", profile.hasReact, \"dependencies\"],\n [\"Prisma\", profile.hasPrisma, \"prisma/schema.prisma\"],\n [\"Drizzle\", profile.hasDrizzle, \"drizzle-orm\"],\n [\"Migrations\", profile.hasMigrations, \"migrations/\"],\n [\"Docker\", profile.hasDocker, \"Dockerfile\"],\n [\"Terraform\", profile.hasTerraform, \"*.tf\"],\n [\"Kubernetes\", profile.hasKubernetes, \"k8s/\"],\n [\"OpenAPI\", profile.hasOpenApi, \"openapi.yaml\"],\n [\"GitHub Actions\", profile.hasGithubActions, \".github/workflows/\"],\n ];\n const detected = traits.filter(([, yes]) => yes);\n if (detected.length === 0) {\n console.log(chalk.dim(\" (empty project — only universal checks apply)\"));\n } else {\n for (const [name, , hint] of detected) {\n console.log(` ${chalk.green(\"✓\")} ${name.padEnd(18)} ${chalk.dim(hint)}`);\n }\n }\n\n // Stale checks\n if (staleChecks.length > 0) {\n console.log(chalk.bold(`\\n⚠️ Stale checks (${staleChecks.length}):`));\n for (const { check, reason, suggestedConditionPath } of staleChecks) {\n const fix = suggestedConditionPath\n ? chalk.dim(` → will wrap with conditionId: file_exists: ${suggestedConditionPath}`)\n : chalk.dim(\" → no path inferred; review manually\");\n console.log(` ${chalk.yellow(\"◌\")} ${chalk.bold(check.id)} ${chalk.dim(reason)}${fix}`);\n }\n }\n\n // Proposals\n if (proposals.length === 0 && staleChecks.length === 0) {\n console.log(chalk.green(\"\\n✓ checks.yaml is fully in sync with the project profile.\"));\n return;\n }\n\n if (proposals.length > 0) {\n console.log(chalk.bold(`\\n💡 Proposed additions (${proposals.length}):`));\n for (const t of proposals) {\n const scope = t.when ? chalk.cyan(` when: ${t.when}`) : \"\";\n const type = t.cmd ? chalk.dim(\"cmd\") : chalk.dim(\"prompt\");\n const preview = t.cmd\n ? chalk.dim(` ${t.cmd.slice(0, 80)}${t.cmd.length > 80 ? \"…\" : \"\"}`)\n : chalk.dim(` ${(t.prompt ?? \"\").slice(0, 80)}${(t.prompt?.length ?? 0) > 80 ? \"…\" : \"\"}`);\n console.log(` ${chalk.green(\"+\")} ${chalk.bold(t.id.padEnd(24))} [${type}]${scope}`);\n console.log(` ${preview}`);\n }\n }\n\n if (!options.apply) {\n console.log(\n chalk.red(`\\n✗ checks.yaml is out of sync with the project profile.`) +\n `\\n Run ${chalk.bold(\"npx @holdpoint/cli@alpha evolve --apply\")} to apply these changes.`,\n );\n process.exit(1);\n }\n\n // ── Apply ───────────────────────────────────────────────────────────────\n\n const applySpinner = ora(\"Applying changes to checks.yaml…\").start();\n\n // Build updated conditions list\n const newConditions = [...config.conditions];\n\n // Collect conditions needed by proposals\n for (const t of proposals) {\n if (t.condition && !existingConditionIds.has(t.condition.id)) {\n newConditions.push(t.condition as ConditionDef);\n existingConditionIds.add(t.condition.id);\n }\n }\n\n // Wrap stale checks with file_exists conditions\n const updatedChecks: CheckDef[] = config.checks.map((check) => {\n const stale = staleChecks.find((s) => s.check.id === check.id);\n if (!stale || !stale.suggestedConditionPath) return check;\n\n const condId = `has-${check.id}`;\n if (!existingConditionIds.has(condId)) {\n newConditions.push({\n id: condId,\n operator: \"file_exists\",\n path: stale.suggestedConditionPath,\n });\n existingConditionIds.add(condId);\n }\n return { ...check, conditionId: condId };\n });\n\n // Append proposed checks\n const newChecks: CheckDef[] = proposals.map((t) => ({\n id: t.id,\n label: t.label,\n ...(t.when ? { when: t.when } : {}),\n ...(t.cmd ? { cmd: t.cmd } : {}),\n ...(t.prompt ? { prompt: t.prompt } : {}),\n ...(t.conditionId ? { conditionId: t.conditionId } : {}),\n }));\n\n const updatedConfig: HoldpointConfig = {\n ...config,\n conditions: newConditions,\n checks: [...updatedChecks, ...newChecks],\n };\n\n const header = extractHeader(yamlContent);\n const newYaml = withHeader(header, generateYaml(updatedConfig));\n writeFileSync(\"checks.yaml\", newYaml, \"utf8\");\n\n // Regenerate engine files\n applySpinner.text = \"Running holdpoint update…\";\n try {\n execSync(\"npx @holdpoint/cli@alpha update\", { stdio: \"pipe\" });\n } catch {\n // holdpoint update failure is non-fatal — checks.yaml is already written\n applySpinner.warn(\n chalk.yellow(\"checks.yaml updated, but `holdpoint update` failed — run it manually.\"),\n );\n printAppliedSummary(proposals.length, staleChecks.length);\n return;\n }\n\n applySpinner.succeed(chalk.green(\"checks.yaml updated and engine files regenerated.\"));\n printAppliedSummary(proposals.length, staleChecks.length);\n}\n\nfunction printAppliedSummary(added: number, wrapped: number): void {\n const parts: string[] = [];\n if (added > 0) parts.push(chalk.green(`${added} check${added === 1 ? \"\" : \"s\"} added`));\n if (wrapped > 0)\n parts.push(chalk.yellow(`${wrapped} stale check${wrapped === 1 ? \"\" : \"s\"} wrapped`));\n if (parts.length > 0) console.log(\" \" + parts.join(\" · \"));\n console.log(\n chalk.dim(\"\\n Review checks.yaml, then commit: \") +\n chalk.yellow(\"git add checks.yaml && git commit -m 'chore: evolve holdpoint checks'\"),\n );\n}\n"],"mappings":"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","names":["existsSync","readFileSync","existsSync","readFileSync","existsSync","readFileSync","writeFileSync","mkdirSync","join","chalk","ora","parseHoldpointYaml","execSync","existsSync","readFileSync","join","existsSync","join","execSync","readdirSync","existsSync","join","execSync","readFileSync","mkdirSync","join","writeFileSync","existsSync","chalk","parseHoldpointYaml","ora","existsSync","readFileSync","chalk","parseHoldpointYaml","existsSync","readFileSync","writeFileSync","mkdirSync","chalk","ora","parseHoldpointYaml","buildHookJson","buildCheckScript","buildConfigJson","buildEngine","buildClaudeEngineJson","buildCursorEngine","buildCodexHooksJson","buildCodexCheckScript","spliceAgentsMd","existsSync","chalk","ora","parseHoldpointYaml","readFileSync","mkdirSync","writeFileSync","buildConfigJson","buildHookJson","buildCheckScript","buildEngine","buildClaudeEngineJson","buildCursorEngine","buildCodexHooksJson","buildCodexCheckScript","spliceAgentsMd","existsSync","join","dirname","fileURLToPath","execSync","chalk","__dirname","existsSync","readFileSync","writeFileSync","execSync","chalk","ora","parseHoldpointYaml","existsSync","chalk","ora","readFileSync","parseHoldpointYaml","writeFileSync","execSync"]}
|
|
@@ -254,7 +254,7 @@ checks:
|
|
|
254
254
|
|
|
255
255
|
- id: git-commit
|
|
256
256
|
label: "Commit all changes before finishing"
|
|
257
|
-
cmd: 'git rev-parse --is-inside-work-tree
|
|
257
|
+
cmd: 'git rev-parse --is-inside-work-tree >/dev/null 2>&1 || exit 0; [ -z "$(git status --porcelain)" ] && exit 0; git status --short; exit 1'
|
|
258
258
|
```
|
|
259
259
|
|
|
260
260
|
When the `git-commit` check fails (uncommitted changes remain), the agent will also see
|
|
@@ -3,16 +3,21 @@ version: 1
|
|
|
3
3
|
context:
|
|
4
4
|
guides: {}
|
|
5
5
|
|
|
6
|
-
conditions:
|
|
6
|
+
conditions:
|
|
7
|
+
- id: is_node
|
|
8
|
+
operator: file_exists
|
|
9
|
+
path: package.json
|
|
7
10
|
|
|
8
11
|
checks:
|
|
9
12
|
- id: lint
|
|
10
13
|
label: "Lint codebase"
|
|
11
14
|
cmd: "pnpm lint --max-warnings 0"
|
|
15
|
+
conditionId: is_node
|
|
12
16
|
|
|
13
17
|
- id: typecheck
|
|
14
18
|
label: "TypeScript type check"
|
|
15
19
|
cmd: "pnpm typecheck"
|
|
20
|
+
conditionId: is_node
|
|
16
21
|
|
|
17
22
|
- id: jsdoc
|
|
18
23
|
label: "JSDoc on changed public functions"
|
|
@@ -49,4 +54,4 @@ checks:
|
|
|
49
54
|
|
|
50
55
|
- id: git-commit
|
|
51
56
|
label: "Commit all changes before finishing"
|
|
52
|
-
cmd: 'git rev-parse --is-inside-work-tree
|
|
57
|
+
cmd: 'git rev-parse --is-inside-work-tree >/dev/null 2>&1 || exit 0; [ -z "$(git status --porcelain)" ] && exit 0; git status --short; exit 1'
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@holdpoint/cli",
|
|
3
|
-
"version": "0.1.0-alpha.
|
|
3
|
+
"version": "0.1.0-alpha.5",
|
|
4
4
|
"publishConfig": {
|
|
5
5
|
"access": "public",
|
|
6
6
|
"tag": "alpha"
|
|
@@ -45,29 +45,29 @@
|
|
|
45
45
|
"README.md",
|
|
46
46
|
"LICENSE"
|
|
47
47
|
],
|
|
48
|
+
"scripts": {
|
|
49
|
+
"build": "tsup && node scripts/copy-builder.mjs",
|
|
50
|
+
"typecheck": "tsc --noEmit",
|
|
51
|
+
"test": "vitest run --passWithNoTests",
|
|
52
|
+
"dev": "tsup --watch",
|
|
53
|
+
"clean": "rm -rf dist *.tsbuildinfo"
|
|
54
|
+
},
|
|
48
55
|
"dependencies": {
|
|
56
|
+
"@holdpoint/engine-claude": "workspace:*",
|
|
57
|
+
"@holdpoint/engine-codex": "workspace:*",
|
|
58
|
+
"@holdpoint/engine-copilot": "workspace:*",
|
|
59
|
+
"@holdpoint/engine-cursor": "workspace:*",
|
|
60
|
+
"@holdpoint/types": "workspace:*",
|
|
61
|
+
"@holdpoint/yaml-core": "workspace:*",
|
|
49
62
|
"chalk": "^5.3.0",
|
|
50
63
|
"commander": "^12.1.0",
|
|
51
|
-
"ora": "^8.1.1"
|
|
52
|
-
"@holdpoint/engine-claude": "0.1.0-alpha.3",
|
|
53
|
-
"@holdpoint/engine-cursor": "0.1.0-alpha.3",
|
|
54
|
-
"@holdpoint/engine-codex": "0.1.0-alpha.3",
|
|
55
|
-
"@holdpoint/types": "0.1.0-alpha.3",
|
|
56
|
-
"@holdpoint/engine-copilot": "0.1.0-alpha.3",
|
|
57
|
-
"@holdpoint/yaml-core": "0.1.0-alpha.3"
|
|
64
|
+
"ora": "^8.1.1"
|
|
58
65
|
},
|
|
59
66
|
"devDependencies": {
|
|
67
|
+
"@holdpoint/builder": "workspace:*",
|
|
60
68
|
"@types/node": "^22.10.2",
|
|
61
69
|
"tsup": "^8.3.5",
|
|
62
70
|
"typescript": "^5.7.2",
|
|
63
|
-
"vitest": "^2.1.8"
|
|
64
|
-
"@holdpoint/builder": "0.1.1-alpha.0"
|
|
65
|
-
},
|
|
66
|
-
"scripts": {
|
|
67
|
-
"build": "tsup",
|
|
68
|
-
"typecheck": "tsc --noEmit",
|
|
69
|
-
"test": "vitest run --passWithNoTests",
|
|
70
|
-
"dev": "tsup --watch",
|
|
71
|
-
"clean": "rm -rf dist *.tsbuildinfo"
|
|
71
|
+
"vitest": "^2.1.8"
|
|
72
72
|
}
|
|
73
|
-
}
|
|
73
|
+
}
|