codealmanac 0.2.5 → 0.2.7

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.
Files changed (79) hide show
  1. package/README.md +25 -20
  2. package/dist/{agents-RVTQYE6A.js → agents-V2ZOIACP.js} +6 -5
  3. package/dist/{chunk-P5WGG4FJ.js → chunk-5BWUMAOX.js} +2 -2
  4. package/dist/chunk-5BWUMAOX.js.map +1 -0
  5. package/dist/{chunk-KQUVMF27.js → chunk-BFIG2CXM.js} +2 -516
  6. package/dist/chunk-BFIG2CXM.js.map +1 -0
  7. package/dist/{chunk-DL5BXZCX.js → chunk-BQY5L3DL.js} +3 -53
  8. package/dist/chunk-BQY5L3DL.js.map +1 -0
  9. package/dist/{chunk-F53U6JQG.js → chunk-CQJVM34R.js} +2 -2
  10. package/dist/chunk-FUBE6KCO.js +124 -0
  11. package/dist/chunk-FUBE6KCO.js.map +1 -0
  12. package/dist/chunk-IZBXXAVL.js +524 -0
  13. package/dist/chunk-IZBXXAVL.js.map +1 -0
  14. package/dist/{chunk-7JUX4ADQ.js → chunk-IZT6RBHS.js} +1 -1
  15. package/dist/{chunk-SMIK2YLU.js → chunk-JLQZELHQ.js} +82 -88
  16. package/dist/chunk-JLQZELHQ.js.map +1 -0
  17. package/dist/{chunk-TT6ZP4GS.js → chunk-KZXWPG4P.js} +2 -2
  18. package/dist/{chunk-6BJUYZ43.js → chunk-QIA22IAM.js} +8 -16
  19. package/dist/chunk-QIA22IAM.js.map +1 -0
  20. package/dist/{chunk-BGUID5BS.js → chunk-RALBM6HZ.js} +20 -139
  21. package/dist/chunk-RALBM6HZ.js.map +1 -0
  22. package/dist/{chunk-TILAKDN6.js → chunk-U5DLLWIC.js} +3 -3
  23. package/dist/chunk-WL4UE7Q6.js +1386 -0
  24. package/dist/chunk-WL4UE7Q6.js.map +1 -0
  25. package/dist/{chunk-GFUB57IT.js → chunk-ZUQN5Y3K.js} +48 -124
  26. package/dist/chunk-ZUQN5Y3K.js.map +1 -0
  27. package/dist/{chunk-MRRX4UQB.js → chunk-ZZLLOAI6.js} +3 -3
  28. package/dist/{cli-CL4ID7EO.js → cli-XWPNARA6.js} +35 -18
  29. package/dist/cli-XWPNARA6.js.map +1 -0
  30. package/dist/codealmanac.js +1 -1
  31. package/dist/{config-ML2RCR7J.js → config-KH3JUMG6.js} +4 -4
  32. package/dist/doctor-ENJT665Z.js +18 -0
  33. package/dist/paths-O5CZADP2.js +14 -0
  34. package/dist/process-KFSLENL3.js +61 -0
  35. package/dist/{register-commands-FBJ6XQ3L.js → register-commands-LULZUSPO.js} +993 -1015
  36. package/dist/register-commands-LULZUSPO.js.map +1 -0
  37. package/dist/uninstall-BD4MMQ7M.js +16 -0
  38. package/dist/uninstall-BD4MMQ7M.js.map +1 -0
  39. package/dist/update-XSKPDFMJ.js +11 -0
  40. package/dist/update-XSKPDFMJ.js.map +1 -0
  41. package/dist/{wiki-IGNRNLUZ.js → wiki-O4RWMAE6.js} +8 -6
  42. package/dist/wiki-O4RWMAE6.js.map +1 -0
  43. package/guides/mini.md +11 -9
  44. package/guides/reference.md +96 -39
  45. package/hooks/almanac-capture.sh +7 -8
  46. package/package.json +1 -1
  47. package/prompts/agents/.gitkeep +1 -0
  48. package/prompts/base/notability.md +139 -0
  49. package/prompts/base/purpose.md +85 -0
  50. package/prompts/base/syntax.md +114 -0
  51. package/prompts/operations/absorb.md +43 -0
  52. package/prompts/operations/build.md +49 -0
  53. package/prompts/operations/garden.md +51 -0
  54. package/dist/chunk-6BJUYZ43.js.map +0 -1
  55. package/dist/chunk-BGUID5BS.js.map +0 -1
  56. package/dist/chunk-DL5BXZCX.js.map +0 -1
  57. package/dist/chunk-GFUB57IT.js.map +0 -1
  58. package/dist/chunk-KQUVMF27.js.map +0 -1
  59. package/dist/chunk-P5WGG4FJ.js.map +0 -1
  60. package/dist/chunk-SMIK2YLU.js.map +0 -1
  61. package/dist/cli-CL4ID7EO.js.map +0 -1
  62. package/dist/doctor-DOLJRGS4.js +0 -17
  63. package/dist/register-commands-FBJ6XQ3L.js.map +0 -1
  64. package/dist/uninstall-DX6LFKMX.js +0 -15
  65. package/dist/update-P2IPG7RO.js +0 -11
  66. package/dist/wiki-IGNRNLUZ.js.map +0 -1
  67. package/prompts/bootstrap.md +0 -176
  68. package/prompts/reviewer.md +0 -129
  69. package/prompts/writer.md +0 -134
  70. /package/dist/{agents-RVTQYE6A.js.map → agents-V2ZOIACP.js.map} +0 -0
  71. /package/dist/{chunk-F53U6JQG.js.map → chunk-CQJVM34R.js.map} +0 -0
  72. /package/dist/{chunk-7JUX4ADQ.js.map → chunk-IZT6RBHS.js.map} +0 -0
  73. /package/dist/{chunk-TT6ZP4GS.js.map → chunk-KZXWPG4P.js.map} +0 -0
  74. /package/dist/{chunk-TILAKDN6.js.map → chunk-U5DLLWIC.js.map} +0 -0
  75. /package/dist/{chunk-MRRX4UQB.js.map → chunk-ZZLLOAI6.js.map} +0 -0
  76. /package/dist/{config-ML2RCR7J.js.map → config-KH3JUMG6.js.map} +0 -0
  77. /package/dist/{doctor-DOLJRGS4.js.map → doctor-ENJT665Z.js.map} +0 -0
  78. /package/dist/{uninstall-DX6LFKMX.js.map → paths-O5CZADP2.js.map} +0 -0
  79. /package/dist/{update-P2IPG7RO.js.map → process-KFSLENL3.js.map} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/process/ids.ts","../src/process/background.ts","../src/process/logs.ts","../src/process/manager.ts","../src/harness/providers/claude.ts","../src/harness/providers/metadata.ts","../src/harness/providers/codex.ts","../src/harness/providers/not-implemented.ts","../src/harness/providers/cursor.ts","../src/harness/providers/index.ts","../src/process/records.ts","../src/process/snapshots.ts","../src/process/spec.ts"],"sourcesContent":["import { randomBytes } from \"node:crypto\";\n\nexport function createRunId(now: Date = new Date()): string {\n const stamp = now\n .toISOString()\n .replace(/\\D/g, \"\")\n .slice(0, 14);\n const suffix = randomBytes(4).toString(\"hex\");\n return `run_${stamp}_${suffix}`;\n}\n","import { spawn } from \"node:child_process\";\nimport type { ChildProcess } from \"node:child_process\";\n\nimport type { AgentRunSpec, HarnessRunHooks } from \"../harness/types.js\";\nimport type { HarnessResult } from \"../harness/events.js\";\nimport { createRunId } from \"./ids.js\";\nimport { initializeRunLog } from \"./logs.js\";\nimport { startForegroundProcess, type StartProcessResult } from \"./manager.js\";\nimport {\n buildQueuedRunRecord,\n finishRunRecord,\n readRunRecord,\n runRecordPath,\n writeRunRecord,\n} from \"./records.js\";\nimport { readRunSpec, writeRunSpec } from \"./spec.js\";\nimport type { RunRecord } from \"./types.js\";\n\nexport interface BackgroundChild {\n pid?: number;\n unref?: () => void;\n}\n\nexport type SpawnBackgroundFn = (args: {\n command: string;\n args: string[];\n cwd: string;\n env: NodeJS.ProcessEnv;\n}) => BackgroundChild;\n\nexport interface StartBackgroundProcessOptions {\n repoRoot: string;\n spec: AgentRunSpec;\n runId?: string;\n now?: () => Date;\n spawnBackground?: SpawnBackgroundFn;\n entrypoint?: string;\n}\n\nexport interface StartBackgroundProcessResult {\n runId: string;\n record: RunRecord;\n childPid: number;\n}\n\nexport async function startBackgroundProcess(\n options: StartBackgroundProcessOptions,\n): Promise<StartBackgroundProcessResult> {\n const now = options.now ?? (() => new Date());\n const runId = options.runId ?? createRunId(now());\n await writeRunSpec(options.repoRoot, runId, options.spec);\n const recordPath = runRecordPath(options.repoRoot, runId);\n const queued = buildQueuedRunRecord({\n runId,\n repoRoot: options.repoRoot,\n spec: options.spec,\n queuedAt: now(),\n });\n await writeRunRecord(recordPath, queued);\n await initializeRunLog(queued.logPath);\n\n const entrypoint = options.entrypoint ?? process.argv[1];\n if (entrypoint === undefined || entrypoint.length === 0) {\n const error = \"cannot start background process without an entrypoint\";\n await writeRunRecord(\n recordPath,\n finishRunRecord({\n record: queued,\n status: \"failed\",\n finishedAt: now(),\n error,\n }),\n );\n throw new Error(error);\n }\n\n const spawnFn = options.spawnBackground ?? defaultSpawnBackground;\n let child: BackgroundChild;\n try {\n child = spawnFn({\n command: process.execPath,\n args: [entrypoint, \"__run-job\", runId],\n cwd: options.repoRoot,\n env: {\n ...process.env,\n CODEALMANAC_INTERNAL_SESSION: \"1\",\n },\n });\n } catch (err: unknown) {\n await writeRunRecord(\n recordPath,\n finishRunRecord({\n record: queued,\n status: \"failed\",\n finishedAt: now(),\n error: err instanceof Error ? err.message : String(err),\n }),\n );\n throw err;\n }\n child.unref?.();\n const childPid = child.pid ?? 0;\n return { runId, record: queued, childPid };\n}\n\nexport interface RunBackgroundChildOptions {\n repoRoot: string;\n runId: string;\n now?: () => Date;\n pid?: number;\n onEvent?: (event: import(\"../harness/events.js\").HarnessEvent) => void | Promise<void>;\n harnessRun?: (\n spec: AgentRunSpec,\n hooks?: HarnessRunHooks,\n ) => Promise<HarnessResult>;\n}\n\nexport async function runBackgroundChild(\n options: RunBackgroundChildOptions,\n): Promise<StartProcessResult> {\n const existing = await readRunRecord(runRecordPath(options.repoRoot, options.runId));\n if (existing?.status === \"cancelled\") {\n return {\n runId: options.runId,\n record: existing,\n result: {\n success: false,\n result: \"\",\n error: \"run cancelled before start\",\n },\n };\n }\n const spec = await readRunSpec(options.repoRoot, options.runId);\n return startForegroundProcess({\n repoRoot: options.repoRoot,\n spec,\n runId: options.runId,\n now: options.now,\n pid: options.pid,\n onEvent: options.onEvent,\n harnessRun: options.harnessRun,\n });\n}\n\nfunction defaultSpawnBackground(args: {\n command: string;\n args: string[];\n cwd: string;\n env: NodeJS.ProcessEnv;\n}): ChildProcess {\n return spawn(args.command, args.args, {\n cwd: args.cwd,\n env: args.env,\n detached: true,\n stdio: \"ignore\",\n });\n}\n","import { mkdir, writeFile, appendFile } from \"node:fs/promises\";\nimport { dirname } from \"node:path\";\n\nimport type { HarnessEvent } from \"../harness/events.js\";\n\nexport interface RunLogEntry {\n timestamp: string;\n event: HarnessEvent;\n}\n\nexport async function initializeRunLog(path: string): Promise<void> {\n await mkdir(dirname(path), { recursive: true });\n await writeFile(path, \"\", \"utf8\");\n}\n\nexport async function appendRunEvent(\n path: string,\n event: HarnessEvent,\n now: Date = new Date(),\n): Promise<void> {\n const entry: RunLogEntry = {\n timestamp: now.toISOString(),\n event,\n };\n await appendFile(path, `${JSON.stringify(entry)}\\n`, \"utf8\");\n}\n","import { join } from \"node:path\";\n\nimport type { HarnessEvent, HarnessResult } from \"../harness/events.js\";\nimport type { AgentRunSpec, HarnessRunHooks } from \"../harness/types.js\";\nimport { getHarnessProvider } from \"../harness/providers/index.js\";\nimport { runIndexer } from \"../indexer/index.js\";\nimport { createRunId } from \"./ids.js\";\nimport { appendRunEvent, initializeRunLog } from \"./logs.js\";\nimport {\n buildStartedRunRecord,\n finishRunRecord,\n isRunCancellationRequested,\n readRunRecord,\n runRecordPath,\n writeRunRecord,\n} from \"./records.js\";\nimport { diffPageSnapshots, snapshotPages } from \"./snapshots.js\";\nimport type { RunRecord, RunSummary } from \"./types.js\";\n\nexport interface StartProcessOptions {\n repoRoot: string;\n spec: AgentRunSpec;\n runId?: string;\n now?: () => Date;\n pid?: number;\n onEvent?: (event: HarnessEvent) => void | Promise<void>;\n harnessRun?: (\n spec: AgentRunSpec,\n hooks?: HarnessRunHooks,\n ) => Promise<HarnessResult>;\n}\n\nexport interface StartProcessResult {\n runId: string;\n record: RunRecord;\n result: HarnessResult;\n}\n\nexport async function startForegroundProcess(\n options: StartProcessOptions,\n): Promise<StartProcessResult> {\n const now = options.now ?? (() => new Date());\n const runId = options.runId ?? createRunId(now());\n const startedAt = now();\n const recordPath = runRecordPath(options.repoRoot, runId);\n const started = buildStartedRunRecord({\n runId,\n repoRoot: options.repoRoot,\n spec: options.spec,\n startedAt,\n pid: options.pid,\n });\n\n const preStart = await cancelledRecordIfRequested({\n recordPath,\n repoRoot: options.repoRoot,\n runId,\n fallback: started,\n finishedAt: now(),\n });\n if (preStart !== null) {\n return {\n runId,\n record: preStart,\n result: {\n success: false,\n result: \"\",\n error: \"run cancelled before start\",\n },\n };\n }\n\n await writeRunRecord(recordPath, started);\n await initializeRunLog(started.logPath);\n const afterStart = await cancelledRecordIfRequested({\n recordPath,\n repoRoot: options.repoRoot,\n runId,\n fallback: started,\n finishedAt: now(),\n });\n if (afterStart !== null) {\n return {\n runId,\n record: afterStart,\n result: {\n success: false,\n result: \"\",\n error: \"run cancelled before start\",\n },\n };\n }\n\n const harnessRun =\n options.harnessRun ??\n ((spec, hooks) => getHarnessProvider(spec.provider.id).run(spec, hooks));\n const eventWrites: Promise<void>[] = [];\n\n let result: HarnessResult;\n let finalRecord: RunRecord;\n try {\n const pagesDir = join(options.repoRoot, \".almanac\", \"pages\");\n const before = await snapshotPages(pagesDir);\n try {\n result = await harnessRun(options.spec, {\n onEvent: eventLogger(started.logPath, now, eventWrites, options.onEvent),\n });\n } catch (err: unknown) {\n result = {\n success: false,\n result: \"\",\n error: err instanceof Error ? err.message : String(err),\n };\n await appendRunEvent(started.logPath, {\n type: \"error\",\n error: result.error ?? \"unknown error\",\n }, now());\n }\n await Promise.allSettled(eventWrites);\n\n const after = await snapshotPages(pagesDir);\n const delta = diffPageSnapshots(before, after);\n if (result.success) {\n await runIndexer({ repoRoot: options.repoRoot });\n }\n\n const summary: RunSummary = {\n created: delta.created,\n updated: delta.updated,\n archived: delta.archived,\n costUsd: result.costUsd,\n turns: result.turns,\n usage: result.usage,\n };\n finalRecord = await finishUnlessCancelled({\n recordPath,\n fallback: started,\n status: result.success ? \"done\" : \"failed\",\n finishedAt: now(),\n providerSessionId: result.providerSessionId,\n summary,\n error: result.error,\n failure: result.failure,\n });\n } catch (err: unknown) {\n result = {\n success: false,\n result: \"\",\n error: err instanceof Error ? err.message : String(err),\n };\n try {\n await appendRunEvent(started.logPath, {\n type: \"error\",\n error: result.error ?? \"unknown error\",\n }, now());\n } catch {\n // The run record is the source of truth; do not let a broken log write\n // prevent terminal status recording.\n }\n await Promise.allSettled(eventWrites);\n finalRecord = await finishUnlessCancelled({\n recordPath,\n fallback: started,\n status: \"failed\",\n finishedAt: now(),\n error: result.error,\n failure: result.failure,\n });\n }\n\n if (finalRecord.status === \"cancelled\" && result.success) {\n result = {\n success: false,\n result: \"\",\n error: \"run cancelled before final status\",\n };\n }\n return { runId, record: finalRecord, result };\n}\n\nasync function finishUnlessCancelled(args: {\n recordPath: string;\n fallback: RunRecord;\n status: \"done\" | \"failed\";\n finishedAt: Date;\n providerSessionId?: string;\n summary?: RunSummary;\n error?: string;\n failure?: import(\"../harness/events.js\").HarnessFailure;\n}): Promise<RunRecord> {\n const current = await readRunRecord(args.recordPath);\n if (\n current?.status === \"cancelled\" ||\n isRunCancellationRequested(args.fallback.repoRoot, args.fallback.id)\n ) {\n return finishCancelled({\n recordPath: args.recordPath,\n fallback: current ?? args.fallback,\n finishedAt: args.finishedAt,\n });\n }\n const base = current ?? args.fallback;\n const finished = finishRunRecord({\n record: base,\n status: args.status,\n finishedAt: args.finishedAt,\n providerSessionId: args.providerSessionId,\n summary: args.summary,\n error: args.error,\n failure: args.failure,\n });\n await writeRunRecord(args.recordPath, finished);\n return finished;\n}\n\nasync function cancelledRecordIfRequested(args: {\n recordPath: string;\n repoRoot: string;\n runId: string;\n fallback: RunRecord;\n finishedAt: Date;\n}): Promise<RunRecord | null> {\n const current = await readRunRecord(args.recordPath);\n if (\n current?.status !== \"cancelled\" &&\n !isRunCancellationRequested(args.repoRoot, args.runId)\n ) {\n return null;\n }\n return finishCancelled({\n recordPath: args.recordPath,\n fallback: current ?? args.fallback,\n finishedAt: args.finishedAt,\n });\n}\n\nasync function finishCancelled(args: {\n recordPath: string;\n fallback: RunRecord;\n finishedAt: Date;\n}): Promise<RunRecord> {\n const cancelled =\n args.fallback.status === \"cancelled\"\n ? args.fallback\n : finishRunRecord({\n record: args.fallback,\n status: \"cancelled\",\n finishedAt: args.finishedAt,\n });\n await writeRunRecord(args.recordPath, cancelled);\n return cancelled;\n}\n\nfunction eventLogger(\n path: string,\n now: () => Date,\n writes: Promise<void>[],\n observer?: (event: HarnessEvent) => void | Promise<void>,\n): (event: HarnessEvent) => void {\n return (event) => {\n writes.push(appendRunEvent(path, event, now()));\n if (observer !== undefined) {\n writes.push(Promise.resolve(observer(event)));\n }\n };\n}\n","import {\n query,\n type AgentDefinition,\n type Options as ClaudeOptions,\n type SDKMessage,\n} from \"@anthropic-ai/claude-agent-sdk\";\n\nimport type { HarnessEvent, HarnessFailure, HarnessResult } from \"../events.js\";\nimport type { ToolRequest } from \"../tools.js\";\nimport type {\n AgentRunSpec,\n AgentSpec,\n HarnessProvider,\n HarnessRunHooks,\n ProviderStatus,\n} from \"../types.js\";\nimport { HARNESS_PROVIDER_METADATA } from \"./metadata.js\";\nimport {\n checkClaudeAuth,\n resolveClaudeExecutable,\n type ClaudeAuthStatus,\n} from \"../../agent/providers/claude/auth.js\";\n\ntype ClaudeQuery = AsyncIterable<SDKMessage>;\ntype ClaudeQueryFn = (params: {\n prompt: string;\n options?: ClaudeOptions;\n}) => ClaudeQuery;\n\nexport interface ClaudeHarnessProviderDeps {\n query?: ClaudeQueryFn;\n checkAuth?: () => Promise<ClaudeAuthStatus>;\n resolveExecutable?: () => string | undefined;\n}\n\nexport function createClaudeHarnessProvider(\n deps: ClaudeHarnessProviderDeps = {},\n): HarnessProvider {\n const queryFn = deps.query ?? query;\n const checkAuthFn = deps.checkAuth ?? (() => checkClaudeAuth());\n const resolveExecutable = deps.resolveExecutable ?? resolveClaudeExecutable;\n const metadata = HARNESS_PROVIDER_METADATA.claude;\n\n return {\n metadata,\n checkStatus: async (): Promise<ProviderStatus> => {\n let auth: ClaudeAuthStatus = { loggedIn: false };\n try {\n auth = await checkAuthFn();\n } catch {\n auth = { loggedIn: false };\n }\n const hasApiKey =\n process.env.ANTHROPIC_API_KEY !== undefined &&\n process.env.ANTHROPIC_API_KEY.length > 0;\n const installed = resolveExecutable() !== undefined;\n const authenticated = auth.loggedIn || hasApiKey;\n const detail = authenticated\n ? auth.email ?? (hasApiKey ? \"ANTHROPIC_API_KEY set\" : \"logged in\")\n : installed\n ? \"not logged in\"\n : \"claude not found on PATH\";\n return { id: metadata.id, installed, authenticated, detail };\n },\n run: async (spec, hooks): Promise<HarnessResult> =>\n runClaudeHarness(spec, hooks, queryFn, resolveExecutable),\n };\n}\n\nexport const claudeHarnessProvider = createClaudeHarnessProvider();\n\nasync function runClaudeHarness(\n spec: AgentRunSpec,\n hooks: HarnessRunHooks | undefined,\n queryFn: ClaudeQueryFn,\n resolveExecutable: () => string | undefined,\n): Promise<HarnessResult> {\n const options = buildClaudeOptions(spec, resolveExecutable);\n const stream = queryFn({\n prompt: spec.prompt,\n options,\n });\n\n let costUsd: number | undefined;\n let turns: number | undefined;\n let result = \"\";\n let providerSessionId: string | undefined;\n let success = false;\n let error: string | undefined;\n let failure: HarnessFailure | undefined;\n let usage: HarnessResult[\"usage\"];\n\n try {\n for await (const message of stream) {\n providerSessionId = providerSessionId ?? getSessionId(message);\n for (const event of toHarnessEvents(message)) {\n await hooks?.onEvent?.(event);\n }\n\n if (message.type === \"result\") {\n costUsd = message.total_cost_usd;\n turns = message.num_turns;\n usage = mapUsage(message.usage);\n providerSessionId = providerSessionId ?? message.session_id;\n if (message.subtype === \"success\") {\n success = true;\n result = message.result;\n } else {\n success = false;\n error =\n message.errors.length > 0\n ? message.errors.join(\"; \")\n : `agent error: ${message.subtype}`;\n failure = classifyClaudeFailure(error, message.subtype);\n }\n }\n }\n } catch (err: unknown) {\n success = false;\n error = err instanceof Error ? err.message : String(err);\n failure = classifyClaudeFailure(error);\n await hooks?.onEvent?.({ type: \"error\", error, failure });\n }\n\n await hooks?.onEvent?.({\n type: \"done\",\n result,\n providerSessionId,\n costUsd,\n turns,\n usage,\n error,\n failure,\n });\n\n return {\n success,\n result,\n providerSessionId,\n costUsd,\n turns,\n usage,\n error,\n failure,\n };\n}\n\nfunction classifyClaudeFailure(\n raw: string,\n subtype?: string,\n): HarnessFailure {\n if (raw.includes(\"Not logged in\") || raw.includes(\"authentication\")) {\n return {\n provider: \"claude\",\n code: \"claude.not_authenticated\",\n message: \"Claude is not authenticated in this environment.\",\n fix: \"Run `claude` and log in, or configure ANTHROPIC_API_KEY for this process.\",\n raw,\n details: subtype !== undefined ? { subtype } : undefined,\n };\n }\n\n if (subtype === \"error_max_budget_usd\") {\n return {\n provider: \"claude\",\n code: \"claude.max_budget_exceeded\",\n message: \"Claude stopped because the run exceeded its maximum budget.\",\n fix: \"Raise the budget for this run or use a cheaper model.\",\n raw,\n details: { subtype },\n };\n }\n\n return {\n provider: \"claude\",\n code: subtype !== undefined ? `claude.${subtype}` : \"claude.process_failed\",\n message: raw,\n raw,\n details: subtype !== undefined ? { subtype } : undefined,\n };\n}\n\nfunction buildClaudeOptions(\n spec: AgentRunSpec,\n resolveExecutable: () => string | undefined,\n): ClaudeOptions {\n const tools = toClaudeTools(spec.tools ?? []);\n const agents = toClaudeAgents(spec.agents ?? {});\n if (Object.keys(agents).length > 0 && !tools.includes(\"Agent\")) {\n tools.push(\"Agent\");\n }\n\n const claudeExecutable = resolveExecutable();\n return pruneUndefined({\n systemPrompt: spec.systemPrompt,\n cwd: spec.cwd,\n model: spec.provider.model ?? HARNESS_PROVIDER_METADATA.claude.defaultModel ?? undefined,\n effort: toClaudeEffort(spec.provider.effort),\n tools,\n allowedTools: tools,\n agents,\n mcpServers: spec.mcpServers as ClaudeOptions[\"mcpServers\"],\n maxTurns: spec.limits?.maxTurns ?? 100,\n maxBudgetUsd: spec.limits?.maxCostUsd,\n permissionMode: \"dontAsk\",\n includePartialMessages: true,\n env: {\n ...process.env,\n CODEALMANAC_INTERNAL_SESSION: \"1\",\n },\n ...(claudeExecutable !== undefined\n ? { pathToClaudeCodeExecutable: claudeExecutable }\n : {}),\n });\n}\n\nfunction toClaudeAgents(\n agents: Record<string, AgentSpec>,\n): Record<string, AgentDefinition> {\n const out: Record<string, AgentDefinition> = {};\n for (const [name, agent] of Object.entries(agents)) {\n out[name] = pruneUndefined({\n description: agent.description,\n prompt: agent.prompt,\n tools: agent.tools !== undefined ? toClaudeTools(agent.tools) : undefined,\n model: agent.model,\n maxTurns: agent.maxTurns,\n mcpServers: agent.mcpServers as AgentDefinition[\"mcpServers\"],\n skills: agent.skills,\n });\n }\n return out;\n}\n\nfunction toClaudeTools(tools: readonly ToolRequest[]): string[] {\n const out = new Set<string>();\n for (const tool of tools) {\n switch (tool.id) {\n case \"read\":\n out.add(\"Read\");\n break;\n case \"write\":\n out.add(\"Write\");\n break;\n case \"edit\":\n out.add(\"Edit\");\n break;\n case \"search\":\n out.add(\"Glob\");\n out.add(\"Grep\");\n break;\n case \"shell\":\n out.add(\"Bash\");\n break;\n case \"web\":\n out.add(\"WebSearch\");\n out.add(\"WebFetch\");\n break;\n case \"mcp\":\n break;\n }\n }\n return [...out];\n}\n\nfunction toClaudeEffort(effort: string | undefined): ClaudeOptions[\"effort\"] {\n if (\n effort === \"low\" ||\n effort === \"medium\" ||\n effort === \"high\" ||\n effort === \"max\"\n ) {\n return effort;\n }\n return undefined;\n}\n\nfunction toHarnessEvents(message: SDKMessage): HarnessEvent[] {\n if (message.type === \"stream_event\") {\n const text = getTextDelta(message.event);\n return text !== undefined ? [{ type: \"text_delta\", content: text }] : [];\n }\n\n if (message.type === \"assistant\") {\n const content = message.message.content;\n if (!Array.isArray(content)) return [];\n const events: HarnessEvent[] = [];\n for (const block of content) {\n if (block.type === \"text\") {\n events.push({ type: \"text\", content: block.text });\n continue;\n }\n if (block.type === \"tool_use\") {\n events.push({\n type: \"tool_use\",\n id: block.id,\n tool: block.name,\n input: stringifyInput(block.input),\n });\n }\n }\n return events;\n }\n\n if (message.type === \"user\") {\n const content = message.message.content;\n if (!Array.isArray(content)) return [];\n return content.flatMap((block) => {\n if (block.type !== \"tool_result\") return [];\n return [\n {\n type: \"tool_result\",\n id: block.tool_use_id,\n content: block.content,\n isError: block.is_error,\n } satisfies HarnessEvent,\n ];\n });\n }\n\n if (message.type === \"tool_use_summary\") {\n return [{ type: \"tool_summary\", summary: message.summary }];\n }\n\n if (message.type === \"result\" && message.subtype !== \"success\") {\n return message.errors.map((err) => ({ type: \"error\", error: err }));\n }\n\n return [];\n}\n\nfunction getTextDelta(event: unknown): string | undefined {\n if (event === null || typeof event !== \"object\") return undefined;\n const raw = event as {\n type?: unknown;\n delta?: { type?: unknown; text?: unknown };\n };\n return raw.type === \"content_block_delta\" &&\n raw.delta?.type === \"text_delta\" &&\n typeof raw.delta.text === \"string\"\n ? raw.delta.text\n : undefined;\n}\n\nfunction getSessionId(message: SDKMessage): string | undefined {\n return \"session_id\" in message && typeof message.session_id === \"string\"\n ? message.session_id\n : undefined;\n}\n\nfunction stringifyInput(input: unknown): string | undefined {\n if (input === undefined) return undefined;\n if (typeof input === \"string\") return input;\n try {\n return JSON.stringify(input);\n } catch {\n return String(input);\n }\n}\n\nfunction mapUsage(value: unknown): HarnessResult[\"usage\"] {\n if (value === null || typeof value !== \"object\") return undefined;\n const usage = value as Record<string, unknown>;\n const inputTokens = numberField(usage, \"input_tokens\");\n const cachedInputTokens = numberField(usage, \"cache_read_input_tokens\");\n const outputTokens = numberField(usage, \"output_tokens\");\n return pruneUndefined({\n inputTokens,\n cachedInputTokens,\n outputTokens,\n totalTokens:\n inputTokens !== undefined || outputTokens !== undefined\n ? (inputTokens ?? 0) + (outputTokens ?? 0)\n : undefined,\n });\n}\n\nfunction numberField(\n record: Record<string, unknown>,\n field: string,\n): number | undefined {\n const value = record[field];\n return typeof value === \"number\" ? value : undefined;\n}\n\nfunction pruneUndefined<T extends Record<string, unknown>>(value: T): T {\n for (const key of Object.keys(value)) {\n if (value[key] === undefined) {\n delete value[key];\n }\n }\n return value;\n}\n","import type {\n HarnessCapabilities,\n HarnessProviderId,\n ProviderMetadata,\n} from \"../types.js\";\n\nconst BASE_CAPABILITIES: Omit<\n HarnessCapabilities,\n | \"reasoningEffort\"\n | \"sessionPersistence\"\n | \"threadResume\"\n | \"interrupt\"\n | \"mcp\"\n | \"skills\"\n | \"usage\"\n | \"cost\"\n | \"contextUsage\"\n | \"structuredOutput\"\n | \"subagents\"\n | \"policy\"\n> = {\n nonInteractive: true,\n streaming: true,\n modelOverride: true,\n modelOptions: false,\n fileRead: true,\n fileWrite: true,\n shell: true,\n};\n\nexport const HARNESS_PROVIDER_METADATA: Record<HarnessProviderId, ProviderMetadata> = {\n claude: {\n id: \"claude\",\n displayName: \"Claude\",\n defaultModel: \"claude-sonnet-4-6\",\n capabilities: {\n ...BASE_CAPABILITIES,\n reasoningEffort: false,\n sessionPersistence: true,\n threadResume: true,\n interrupt: true,\n mcp: true,\n skills: true,\n usage: true,\n cost: true,\n contextUsage: false,\n structuredOutput: false,\n subagents: {\n supported: true,\n programmaticPerRun: true,\n enforcedToolScopes: true,\n },\n policy: {\n sandbox: true,\n strictToolAllowlist: true,\n commandApproval: true,\n toolHook: true,\n },\n },\n },\n codex: {\n id: \"codex\",\n displayName: \"Codex\",\n defaultModel: null,\n capabilities: {\n ...BASE_CAPABILITIES,\n modelOptions: true,\n reasoningEffort: false,\n sessionPersistence: false,\n threadResume: false,\n interrupt: false,\n mcp: false,\n skills: false,\n usage: true,\n cost: false,\n contextUsage: false,\n structuredOutput: true,\n subagents: {\n supported: false,\n programmaticPerRun: false,\n enforcedToolScopes: false,\n },\n policy: {\n sandbox: true,\n strictToolAllowlist: false,\n commandApproval: false,\n toolHook: false,\n },\n },\n },\n cursor: {\n id: \"cursor\",\n displayName: \"Cursor\",\n defaultModel: null,\n capabilities: {\n nonInteractive: false,\n streaming: false,\n modelOverride: false,\n modelOptions: false,\n fileRead: false,\n fileWrite: false,\n shell: false,\n reasoningEffort: false,\n sessionPersistence: false,\n threadResume: false,\n interrupt: false,\n mcp: false,\n skills: false,\n usage: false,\n cost: false,\n contextUsage: false,\n structuredOutput: false,\n subagents: {\n supported: false,\n programmaticPerRun: false,\n enforcedToolScopes: false,\n },\n policy: {\n sandbox: false,\n strictToolAllowlist: false,\n commandApproval: false,\n toolHook: false,\n },\n },\n },\n};\n","import { spawn, spawnSync, type ChildProcess } from \"node:child_process\";\n\nimport type { AgentUsage, HarnessFailure, HarnessResult } from \"../events.js\";\nimport type {\n AgentRunSpec,\n HarnessProvider,\n HarnessRunHooks,\n ProviderStatus,\n} from \"../types.js\";\nimport { HARNESS_PROVIDER_METADATA } from \"./metadata.js\";\n\nexport interface CodexExecRequest {\n command: \"codex\";\n args: string[];\n cwd: string;\n env: NodeJS.ProcessEnv;\n}\n\nexport type CodexCliRunFn = (\n request: CodexExecRequest,\n hooks?: HarnessRunHooks,\n) => Promise<HarnessResult>;\n\nexport interface CodexHarnessProviderDeps {\n commandExists?: (command: string) => boolean;\n runStatus?: (command: string, args: string[]) => Promise<{\n ok: boolean;\n detail: string;\n }>;\n runCli?: CodexCliRunFn;\n}\n\ninterface CodexRunState {\n success: boolean;\n result: string;\n providerSessionId?: string;\n turns?: number;\n usage?: AgentUsage;\n error?: string;\n failure?: HarnessFailure;\n}\n\nexport function createCodexHarnessProvider(\n deps: CodexHarnessProviderDeps = {},\n): HarnessProvider {\n const metadata = HARNESS_PROVIDER_METADATA.codex;\n const commandExists = deps.commandExists ?? defaultCommandExists;\n const runStatus = deps.runStatus ?? defaultRunStatus;\n const runCli = deps.runCli ?? runCodexCli;\n\n return {\n metadata,\n checkStatus: async (): Promise<ProviderStatus> => {\n if (!commandExists(\"codex\")) {\n return {\n id: metadata.id,\n installed: false,\n authenticated: false,\n detail: \"codex not found on PATH\",\n };\n }\n\n const auth = await runStatus(\"codex\", [\"login\", \"status\"]);\n return {\n id: metadata.id,\n installed: true,\n authenticated: auth.ok,\n detail: auth.detail,\n };\n },\n run: async (spec, hooks): Promise<HarnessResult> => {\n if (spec.agents !== undefined && Object.keys(spec.agents).length > 0) {\n return {\n success: false,\n result: \"\",\n error:\n \"Codex exec adapter does not support per-run programmatic agents\",\n failure: {\n provider: \"codex\",\n code: \"codex.unsupported_feature\",\n message:\n \"Codex exec adapter does not support per-run programmatic agents.\",\n fix: \"Run this operation with a provider that supports per-run subagents.\",\n },\n };\n }\n return runCli(buildCodexExecRequest(spec), hooks);\n },\n };\n}\n\nexport const codexHarnessProvider = createCodexHarnessProvider();\n\nexport function buildCodexExecRequest(spec: AgentRunSpec): CodexExecRequest {\n const unsupported = unsupportedCodexSpecFields(spec);\n if (unsupported.length > 0) {\n throw new Error(\n `Codex exec adapter does not support: ${unsupported.join(\", \")}`,\n );\n }\n const args = [\n \"exec\",\n \"--json\",\n \"--sandbox\",\n \"workspace-write\",\n \"--skip-git-repo-check\",\n \"-C\",\n spec.cwd,\n ];\n if (spec.provider.model !== undefined && spec.provider.model.length > 0) {\n args.push(\"--model\", spec.provider.model);\n }\n if (spec.output?.schemaPath !== undefined) {\n args.push(\"--output-schema\", spec.output.schemaPath);\n }\n args.push(combineCodexPrompt(spec));\n return {\n command: \"codex\",\n args,\n cwd: spec.cwd,\n env: {\n ...process.env,\n CODEALMANAC_INTERNAL_SESSION: \"1\",\n },\n };\n}\n\nfunction unsupportedCodexSpecFields(spec: AgentRunSpec): string[] {\n const unsupported: string[] = [];\n if (spec.provider.effort !== undefined) unsupported.push(\"provider.effort\");\n if (spec.skills !== undefined && spec.skills.length > 0) unsupported.push(\"skills\");\n if (spec.mcpServers !== undefined && Object.keys(spec.mcpServers).length > 0) {\n unsupported.push(\"mcpServers\");\n }\n if (spec.limits?.maxCostUsd !== undefined) unsupported.push(\"limits.maxCostUsd\");\n return unsupported;\n}\n\nexport function combineCodexPrompt(spec: AgentRunSpec): string {\n const blocks = [spec.systemPrompt, spec.prompt].filter(\n (block): block is string => block !== undefined && block.trim().length > 0,\n );\n return blocks.join(\"\\n\\n---\\n\\n\");\n}\n\nexport function runCodexCli(\n request: CodexExecRequest,\n hooks?: HarnessRunHooks,\n): Promise<HarnessResult> {\n return new Promise((resolve) => {\n const child = spawn(request.command, request.args, {\n cwd: request.cwd,\n env: request.env,\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n });\n\n let stdoutBuf = \"\";\n let stderr = \"\";\n const state: CodexRunState = {\n success: false,\n result: \"\",\n };\n const eventWrites: Promise<void>[] = [];\n\n const observe = (msg: Record<string, unknown>): void => {\n eventWrites.push(applyCodexJsonlEvent(state, msg, hooks));\n };\n\n const flushLines = (): void => {\n let idx = stdoutBuf.indexOf(\"\\n\");\n while (idx !== -1) {\n const rawLine = stdoutBuf.slice(0, idx);\n stdoutBuf = stdoutBuf.slice(idx + 1);\n const line = rawLine.trim();\n if (line.length > 0) {\n try {\n observe(JSON.parse(line) as Record<string, unknown>);\n } catch {\n // Ignore non-JSON chatter; stderr is captured for failures.\n }\n }\n idx = stdoutBuf.indexOf(\"\\n\");\n }\n };\n\n child.stdout.on(\"data\", (chunk) => {\n stdoutBuf += chunk.toString(\"utf8\");\n flushLines();\n });\n child.stderr.on(\"data\", (chunk) => {\n stderr += chunk.toString(\"utf8\");\n });\n child.on(\"error\", (err: NodeJS.ErrnoException) => {\n resolve({\n success: false,\n result: state.result,\n providerSessionId: state.providerSessionId,\n turns: state.turns,\n usage: state.usage,\n error:\n err.code === \"ENOENT\"\n ? `${request.command} not found on PATH`\n : err.message,\n });\n });\n child.on(\"close\", async (code) => {\n flushLines();\n if (stdoutBuf.trim().length > 0) {\n try {\n observe(JSON.parse(stdoutBuf.trim()) as Record<string, unknown>);\n } catch {\n // Ignore trailing non-JSON.\n }\n }\n await Promise.allSettled(eventWrites);\n\n if (code === 0 && state.success) {\n resolve(toHarnessResult(state));\n return;\n }\n\n const firstStderr = stderr.trim().split(\"\\n\")[0];\n const fallbackError =\n firstStderr !== undefined && firstStderr.length > 0\n ? firstStderr\n : `${request.command} exited ${code ?? 1}`;\n const failure = state.failure ?? classifyCodexFailure(fallbackError);\n resolve({\n ...toHarnessResult(state),\n success: false,\n error: state.error ?? failure.message,\n failure,\n });\n });\n });\n}\n\nexport async function applyCodexJsonlEvent(\n state: CodexRunState,\n input: Record<string, unknown>,\n hooks?: HarnessRunHooks,\n): Promise<void> {\n const msg = unwrapCodexJsonlEvent(input);\n const sessionId = stringField(msg, \"session_id\") ?? stringField(msg, \"thread_id\");\n if (state.providerSessionId === undefined && sessionId !== undefined) {\n state.providerSessionId = sessionId;\n }\n\n if (msg.type === \"item.completed\") {\n const item = objectField(msg, \"item\");\n if (item?.type === \"agent_message\") {\n const text = stringField(item, \"text\");\n if (text !== undefined) {\n state.result = text;\n await hooks?.onEvent?.({ type: \"text\", content: text });\n }\n }\n if (item?.type === \"tool_call\") {\n await emitToolUse(item, hooks);\n }\n return;\n }\n\n if (msg.type === \"turn.completed\") {\n state.success = true;\n state.turns = 1;\n state.usage = parseCodexUsage(msg.usage);\n await hooks?.onEvent?.({\n type: \"done\",\n result: state.result,\n providerSessionId: state.providerSessionId,\n turns: state.turns,\n usage: state.usage,\n });\n return;\n }\n\n if (msg.type === \"turn.failed\" || msg.type === \"error\") {\n state.success = false;\n const raw =\n stringField(msg, \"message\") ??\n stringField(msg, \"error\") ??\n \"codex turn failed\";\n const failure = classifyCodexFailure(raw);\n state.error = failure.message;\n state.failure = failure;\n await hooks?.onEvent?.({\n type: \"error\",\n error: state.error,\n failure,\n });\n }\n}\n\nfunction toHarnessResult(state: CodexRunState): HarnessResult {\n return {\n success: state.success,\n result: state.result,\n providerSessionId: state.providerSessionId,\n turns: state.turns,\n usage: state.usage,\n error: state.error,\n failure: state.failure,\n };\n}\n\nfunction unwrapCodexJsonlEvent(\n input: Record<string, unknown>,\n): Record<string, unknown> {\n const msg = objectField(input, \"msg\");\n return msg ?? input;\n}\n\nfunction classifyCodexFailure(raw: string): HarnessFailure {\n const detail = extractJsonDetail(raw);\n const text = detail ?? raw;\n const statusCode = extractStatusCode(raw);\n const model =\n matchFirst(text, /The '([^']+)' model requires a newer version of Codex/) ??\n matchFirst(text, /The '([^']+)' model is not supported/);\n\n if (text.includes(\"requires a newer version of Codex\") && model !== undefined) {\n return {\n provider: \"codex\",\n code: \"codex.model_requires_newer_cli\",\n message: `Codex model ${model} requires a newer Codex CLI.`,\n fix: \"Upgrade Codex, or run with --using codex/<supported-model>.\",\n raw,\n details: codexFailureDetails({ model, statusCode }),\n };\n }\n\n if (text.includes(\"model is not supported\") && model !== undefined) {\n return {\n provider: \"codex\",\n code: \"codex.model_unavailable\",\n message: `Codex model ${model} is not available for this account.`,\n fix: \"Choose a supported model with --using codex/<model>, or update the configured Codex model.\",\n raw,\n details: codexFailureDetails({ model, statusCode }),\n };\n }\n\n if (text.includes(\"401 Unauthorized\") || text.includes(\"Unauthorized\")) {\n return {\n provider: \"codex\",\n code: \"codex.not_authenticated\",\n message: \"Codex is not authenticated in this environment.\",\n fix: \"Run `codex login` in the same environment, or make the existing Codex auth available to this process.\",\n raw,\n details: codexFailureDetails({ statusCode: statusCode ?? 401 }),\n };\n }\n\n if (text.includes(\"not found on PATH\")) {\n return {\n provider: \"codex\",\n code: \"codex.not_installed\",\n message: \"Codex was not found on PATH.\",\n fix: \"Install Codex or update PATH so the `codex` command is available.\",\n raw,\n };\n }\n\n return {\n provider: \"codex\",\n code: \"codex.process_failed\",\n message: text,\n raw,\n details: codexFailureDetails({ statusCode }),\n };\n}\n\nfunction codexFailureDetails(\n details: Record<string, unknown>,\n): Record<string, unknown> | undefined {\n const pruned = pruneUndefined(details);\n return Object.keys(pruned).length > 0 ? pruned : undefined;\n}\n\nfunction extractJsonDetail(raw: string): string | undefined {\n const start = raw.indexOf(\"{\");\n const end = raw.lastIndexOf(\"}\");\n if (start === -1 || end <= start) return undefined;\n try {\n const parsed = JSON.parse(raw.slice(start, end + 1)) as unknown;\n if (parsed !== null && typeof parsed === \"object\") {\n const detail = (parsed as Record<string, unknown>).detail;\n return typeof detail === \"string\" && detail.length > 0 ? detail : undefined;\n }\n } catch {\n return undefined;\n }\n return undefined;\n}\n\nfunction extractStatusCode(raw: string): number | undefined {\n const match = raw.match(/status\\s+(\\d{3})|(\\d{3})\\s+(?:Bad Request|Unauthorized)/);\n if (match === null) return undefined;\n const value = match[1] ?? match[2];\n return value !== undefined ? Number.parseInt(value, 10) : undefined;\n}\n\nfunction matchFirst(text: string, pattern: RegExp): string | undefined {\n const match = text.match(pattern);\n return match?.[1];\n}\n\nasync function emitToolUse(\n item: Record<string, unknown>,\n hooks: HarnessRunHooks | undefined,\n): Promise<void> {\n const tool = stringField(item, \"name\") ?? stringField(item, \"tool_name\");\n if (tool === undefined) return;\n await hooks?.onEvent?.({\n type: \"tool_use\",\n id: stringField(item, \"id\"),\n tool,\n input: stringifyInput(item.input ?? item.arguments),\n });\n}\n\nexport function parseCodexUsage(value: unknown): AgentUsage | undefined {\n if (value === null || typeof value !== \"object\") return undefined;\n const obj = value as Record<string, unknown>;\n const inputTokens =\n numberField(obj, \"input_tokens\") ?? numberField(obj, \"inputTokens\");\n const cachedInputTokens =\n numberField(obj, \"cached_input_tokens\") ??\n numberField(obj, \"cachedInputTokens\") ??\n numberField(obj, \"cacheReadTokens\");\n const outputTokens =\n numberField(obj, \"output_tokens\") ?? numberField(obj, \"outputTokens\");\n const reasoningOutputTokens =\n numberField(obj, \"reasoning_output_tokens\") ??\n numberField(obj, \"reasoningOutputTokens\");\n return pruneUndefined({\n inputTokens,\n cachedInputTokens,\n outputTokens,\n reasoningOutputTokens,\n totalTokens:\n inputTokens !== undefined || outputTokens !== undefined\n ? (inputTokens ?? 0) + (outputTokens ?? 0)\n : undefined,\n });\n}\n\nfunction objectField(\n record: Record<string, unknown>,\n field: string,\n): Record<string, unknown> | undefined {\n const value = record[field];\n return value !== null && typeof value === \"object\"\n ? (value as Record<string, unknown>)\n : undefined;\n}\n\nfunction stringField(\n record: Record<string, unknown>,\n field: string,\n): string | undefined {\n const value = record[field];\n return typeof value === \"string\" && value.length > 0 ? value : undefined;\n}\n\nfunction numberField(\n record: Record<string, unknown>,\n field: string,\n): number | undefined {\n const value = record[field];\n return typeof value === \"number\" ? value : undefined;\n}\n\nfunction stringifyInput(input: unknown): string | undefined {\n if (input === undefined) return undefined;\n if (typeof input === \"string\") return input;\n try {\n return JSON.stringify(input);\n } catch {\n return String(input);\n }\n}\n\nfunction pruneUndefined<T extends Record<string, unknown>>(value: T): T {\n for (const key of Object.keys(value)) {\n if (value[key] === undefined) {\n delete value[key];\n }\n }\n return value;\n}\n\nfunction defaultCommandExists(command: string): boolean {\n const result = spawnSync(\"sh\", [\"-lc\", `command -v ${command}`], {\n encoding: \"utf8\",\n });\n return result.status === 0 && result.stdout.trim().length > 0;\n}\n\nfunction defaultRunStatus(\n command: string,\n args: string[],\n): Promise<{ ok: boolean; detail: string }> {\n return new Promise((resolve) => {\n let child: ChildProcess;\n let stdout = \"\";\n let stderr = \"\";\n try {\n child = spawn(command, args, { stdio: [\"ignore\", \"pipe\", \"pipe\"] });\n } catch (err: unknown) {\n resolve({\n ok: false,\n detail: err instanceof Error ? err.message : String(err),\n });\n return;\n }\n\n child.stdout?.on(\"data\", (chunk) => {\n stdout += chunk.toString(\"utf8\");\n });\n child.stderr?.on(\"data\", (chunk) => {\n stderr += chunk.toString(\"utf8\");\n });\n child.on(\"error\", (err) => {\n resolve({ ok: false, detail: err.message });\n });\n child.on(\"close\", (code) => {\n const text = `${stdout}\\n${stderr}`.trim();\n resolve({\n ok: code === 0,\n detail:\n text\n .split(\"\\n\")\n .find((line) => line.trim().length > 0)\n ?.trim() ?? (code === 0 ? \"ready\" : `${command} exited ${code ?? 1}`),\n });\n });\n });\n}\n","import type {\n AgentRunSpec,\n HarnessProvider,\n ProviderMetadata,\n ProviderStatus,\n} from \"../types.js\";\n\nexport function createNotImplementedProvider(\n metadata: ProviderMetadata,\n): HarnessProvider {\n return {\n metadata,\n checkStatus: async (): Promise<ProviderStatus> => ({\n id: metadata.id,\n installed: false,\n authenticated: false,\n detail: `${metadata.displayName} harness adapter is not implemented yet`,\n }),\n run: async (spec: AgentRunSpec) => ({\n success: false,\n result: \"\",\n error:\n `${metadata.displayName} harness adapter is not implemented yet ` +\n `for ${spec.metadata?.operation ?? \"unknown\"} runs`,\n }),\n };\n}\n","import type { HarnessProvider } from \"../types.js\";\nimport { HARNESS_PROVIDER_METADATA } from \"./metadata.js\";\nimport { createNotImplementedProvider } from \"./not-implemented.js\";\n\nexport const cursorHarnessProvider: HarnessProvider = createNotImplementedProvider(\n HARNESS_PROVIDER_METADATA.cursor,\n);\n","import type { HarnessProvider, HarnessProviderId } from \"../types.js\";\nimport { claudeHarnessProvider } from \"./claude.js\";\nimport { codexHarnessProvider } from \"./codex.js\";\nimport { cursorHarnessProvider } from \"./cursor.js\";\nimport { HARNESS_PROVIDER_METADATA } from \"./metadata.js\";\n\nconst HARNESS_PROVIDERS = {\n claude: claudeHarnessProvider,\n codex: codexHarnessProvider,\n cursor: cursorHarnessProvider,\n} satisfies Record<HarnessProviderId, HarnessProvider>;\n\nexport function getHarnessProvider(id: HarnessProviderId): HarnessProvider {\n return HARNESS_PROVIDERS[id];\n}\n\nexport function listHarnessProviders(): HarnessProvider[] {\n return Object.values(HARNESS_PROVIDERS);\n}\n\nexport { HARNESS_PROVIDER_METADATA };\n","import { existsSync } from \"node:fs\";\nimport { mkdir, readFile, readdir, rename, writeFile } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\n\nimport type { AgentRunSpec } from \"../harness/types.js\";\nimport type { HarnessFailure } from \"../harness/events.js\";\nimport { getRepoAlmanacDir } from \"../paths.js\";\nimport type { RunRecord, RunStatus, RunSummary, RunView } from \"./types.js\";\n\nexport function runsDir(repoRoot: string): string {\n return join(getRepoAlmanacDir(repoRoot), \"runs\");\n}\n\nexport function runRecordPath(repoRoot: string, runId: string): string {\n return join(runsDir(repoRoot), `${runId}.json`);\n}\n\nexport function runLogPath(repoRoot: string, runId: string): string {\n return join(runsDir(repoRoot), `${runId}.jsonl`);\n}\n\nexport function runCancelPath(repoRoot: string, runId: string): string {\n return join(runsDir(repoRoot), `${runId}.cancel`);\n}\n\nexport async function markRunCancelled(\n repoRoot: string,\n runId: string,\n): Promise<void> {\n const path = runCancelPath(repoRoot, runId);\n await mkdir(dirname(path), { recursive: true });\n await writeFile(path, \"cancelled\\n\", \"utf8\");\n}\n\nexport function isRunCancellationRequested(\n repoRoot: string,\n runId: string,\n): boolean {\n return existsSync(runCancelPath(repoRoot, runId));\n}\n\nexport async function writeRunRecord(\n path: string,\n record: RunRecord,\n): Promise<void> {\n await mkdir(dirname(path), { recursive: true });\n const tmp = `${path}.tmp-${process.pid}`;\n await writeFile(tmp, `${JSON.stringify(record, null, 2)}\\n`, \"utf8\");\n await rename(tmp, path);\n}\n\nexport function buildStartedRunRecord(args: {\n runId: string;\n repoRoot: string;\n spec: AgentRunSpec;\n startedAt: Date;\n pid?: number;\n}): RunRecord {\n return {\n version: 1,\n id: args.runId,\n operation: args.spec.metadata?.operation ?? \"absorb\",\n status: \"running\",\n repoRoot: args.repoRoot,\n pid: args.pid ?? process.pid,\n provider: args.spec.provider.id,\n model: args.spec.provider.model,\n startedAt: args.startedAt.toISOString(),\n logPath: runLogPath(args.repoRoot, args.runId),\n targetKind: args.spec.metadata?.targetKind,\n targetPaths: args.spec.metadata?.targetPaths,\n };\n}\n\nexport function buildQueuedRunRecord(args: {\n runId: string;\n repoRoot: string;\n spec: AgentRunSpec;\n queuedAt: Date;\n}): RunRecord {\n return {\n ...buildStartedRunRecord({\n runId: args.runId,\n repoRoot: args.repoRoot,\n spec: args.spec,\n startedAt: args.queuedAt,\n pid: 0,\n }),\n status: \"queued\",\n };\n}\n\nexport function finishRunRecord(args: {\n record: RunRecord;\n status: Extract<RunStatus, \"done\" | \"failed\" | \"cancelled\">;\n finishedAt: Date;\n providerSessionId?: string;\n summary?: RunSummary;\n error?: string;\n failure?: HarnessFailure;\n}): RunRecord {\n const started = Date.parse(args.record.startedAt);\n const finished = args.finishedAt.getTime();\n return {\n ...args.record,\n status: args.status,\n providerSessionId: args.providerSessionId ?? args.record.providerSessionId,\n finishedAt: args.finishedAt.toISOString(),\n durationMs: Number.isFinite(started)\n ? Math.max(0, finished - started)\n : undefined,\n summary: args.summary,\n error: args.error,\n failure: args.failure,\n };\n}\n\nexport async function readRunRecord(path: string): Promise<RunRecord | null> {\n try {\n const parsed = JSON.parse(await readFile(path, \"utf8\")) as unknown;\n return isRunRecord(parsed) ? parsed : null;\n } catch {\n return null;\n }\n}\n\nexport async function listRunRecords(repoRoot: string): Promise<RunRecord[]> {\n const dir = runsDir(repoRoot);\n if (!existsSync(dir)) return [];\n let entries: string[];\n try {\n entries = await readdir(dir);\n } catch {\n return [];\n }\n const records: RunRecord[] = [];\n for (const entry of entries) {\n if (!entry.startsWith(\"run_\") || !entry.endsWith(\".json\")) continue;\n const record = await readRunRecord(join(dir, entry));\n if (record !== null) records.push(record);\n }\n return records.sort((a, b) => b.startedAt.localeCompare(a.startedAt));\n}\n\nexport function toRunView(args: {\n record: RunRecord;\n now: Date;\n isPidAlive: (pid: number) => boolean;\n}): RunView {\n const started = Date.parse(args.record.startedAt);\n const finished =\n args.record.finishedAt !== undefined\n ? Date.parse(args.record.finishedAt)\n : undefined;\n const elapsedMs =\n args.record.durationMs ??\n (Number.isFinite(started)\n ? Math.max(0, (finished ?? args.now.getTime()) - started)\n : 0);\n const displayStatus =\n args.record.status === \"running\" && !args.isPidAlive(args.record.pid)\n ? \"stale\"\n : args.record.status;\n return {\n ...args.record,\n displayStatus,\n elapsedMs,\n error:\n displayStatus === \"stale\"\n ? \"process ended without a final status\"\n : args.record.error,\n };\n}\n\nexport function isRunRecord(value: unknown): value is RunRecord {\n if (value === null || typeof value !== \"object\") return false;\n const v = value as Partial<RunRecord>;\n return (\n v.version === 1 &&\n typeof v.id === \"string\" &&\n v.id.startsWith(\"run_\") &&\n (v.operation === \"build\" || v.operation === \"absorb\" || v.operation === \"garden\") &&\n (v.status === \"queued\" ||\n v.status === \"running\" ||\n v.status === \"done\" ||\n v.status === \"failed\" ||\n v.status === \"cancelled\") &&\n typeof v.repoRoot === \"string\" &&\n typeof v.pid === \"number\" &&\n (v.provider === \"claude\" || v.provider === \"codex\" || v.provider === \"cursor\") &&\n typeof v.startedAt === \"string\" &&\n typeof v.logPath === \"string\"\n );\n}\n","import { createHash } from \"node:crypto\";\nimport { existsSync, statSync } from \"node:fs\";\nimport { readFile, readdir } from \"node:fs/promises\";\nimport { join } from \"node:path\";\n\nimport { parseFrontmatter } from \"../indexer/frontmatter.js\";\n\nexport interface PageSnapshotEntry {\n slug: string;\n hash: string;\n archived: boolean;\n}\n\nexport type PageSnapshot = Map<string, PageSnapshotEntry>;\n\nexport interface PageSnapshotDelta {\n created: number;\n updated: number;\n archived: number;\n deleted: number;\n}\n\nexport async function snapshotPages(pagesDir: string): Promise<PageSnapshot> {\n const out: PageSnapshot = new Map();\n if (!existsSync(pagesDir)) return out;\n\n let entries: string[];\n try {\n entries = await readdir(pagesDir);\n } catch {\n return out;\n }\n\n for (const entry of entries) {\n if (!entry.endsWith(\".md\")) continue;\n const slug = entry.slice(0, -3);\n const full = join(pagesDir, entry);\n try {\n const st = statSync(full);\n if (!st.isFile()) continue;\n const content = await readFile(full, \"utf8\");\n out.set(slug, {\n slug,\n hash: createHash(\"sha256\").update(content).digest(\"hex\"),\n archived: parseFrontmatter(content).archived_at !== null,\n });\n } catch {\n continue;\n }\n }\n\n return out;\n}\n\nexport function diffPageSnapshots(\n before: PageSnapshot,\n after: PageSnapshot,\n): PageSnapshotDelta {\n let created = 0;\n let updated = 0;\n let archived = 0;\n let deleted = 0;\n\n for (const [slug, entry] of after) {\n const prev = before.get(slug);\n if (prev === undefined) {\n created += 1;\n continue;\n }\n if (prev.hash === entry.hash) continue;\n if (!prev.archived && entry.archived) {\n archived += 1;\n } else {\n updated += 1;\n }\n }\n\n for (const slug of before.keys()) {\n if (!after.has(slug)) deleted += 1;\n }\n\n return { created, updated, archived, deleted };\n}\n\nexport function isNoopPageDelta(delta: PageSnapshotDelta): boolean {\n return (\n delta.created === 0 &&\n delta.updated === 0 &&\n delta.archived === 0 &&\n delta.deleted === 0\n );\n}\n","import { mkdir, readFile, rename, writeFile } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\n\nimport type {\n AgentRunSpec,\n HarnessProviderId,\n OperationKind,\n} from \"../harness/types.js\";\nimport { runsDir } from \"./records.js\";\n\nexport function runSpecPath(repoRoot: string, runId: string): string {\n return join(runsDir(repoRoot), `${runId}.spec.json`);\n}\n\nexport async function writeRunSpec(\n repoRoot: string,\n runId: string,\n spec: AgentRunSpec,\n): Promise<void> {\n const path = runSpecPath(repoRoot, runId);\n await mkdir(dirname(path), { recursive: true });\n const tmp = `${path}.tmp-${process.pid}`;\n await writeFile(tmp, `${JSON.stringify(spec, null, 2)}\\n`, \"utf8\");\n await rename(tmp, path);\n}\n\nexport async function readRunSpec(\n repoRoot: string,\n runId: string,\n): Promise<AgentRunSpec> {\n const parsed = JSON.parse(\n await readFile(runSpecPath(repoRoot, runId), \"utf8\"),\n ) as unknown;\n if (!isAgentRunSpec(parsed)) {\n throw new Error(`invalid run spec for ${runId}`);\n }\n return parsed;\n}\n\nfunction isAgentRunSpec(value: unknown): value is AgentRunSpec {\n if (value === null || typeof value !== \"object\") return false;\n const spec = value as Partial<AgentRunSpec>;\n return (\n spec.provider !== undefined &&\n typeof spec.provider === \"object\" &&\n spec.provider !== null &&\n isProviderId((spec.provider as { id?: unknown }).id) &&\n typeof spec.cwd === \"string\" &&\n typeof spec.prompt === \"string\" &&\n (spec.metadata === undefined ||\n (typeof spec.metadata === \"object\" &&\n spec.metadata !== null &&\n ((spec.metadata as { operation?: unknown }).operation === undefined ||\n isOperationKind((spec.metadata as { operation?: unknown }).operation))))\n );\n}\n\nfunction isProviderId(value: unknown): value is HarnessProviderId {\n return value === \"claude\" || value === \"codex\" || value === \"cursor\";\n}\n\nfunction isOperationKind(value: unknown): value is OperationKind {\n return value === \"build\" || value === \"absorb\" || value === \"garden\";\n}\n"],"mappings":"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","names":["spawn","join","pruneUndefined","stringifyInput","numberField","mkdir","writeFile","dirname","mkdir","dirname","writeFile","existsSync","readFile","readdir","join","existsSync","readdir","join","readFile","join","mkdir","readFile","rename","writeFile","dirname","join","join","mkdir","dirname","writeFile","rename","readFile","spawn"]}
@@ -5,14 +5,17 @@ import {
5
5
  import {
6
6
  buildProviderModelChoices,
7
7
  buildProviderSetupView,
8
- getProviderLabel,
9
8
  parseAgentSelection
10
- } from "./chunk-BGUID5BS.js";
9
+ } from "./chunk-RALBM6HZ.js";
10
+ import {
11
+ UNAUTHENTICATED_MESSAGE,
12
+ checkClaudeAuth
13
+ } from "./chunk-FUBE6KCO.js";
11
14
  import {
12
15
  isAgentProviderId,
13
16
  readConfig,
14
17
  writeConfig
15
- } from "./chunk-P5WGG4FJ.js";
18
+ } from "./chunk-5BWUMAOX.js";
16
19
 
17
20
  // src/commands/setup.ts
18
21
  import { existsSync as existsSync2 } from "fs";
@@ -126,7 +129,7 @@ function printNextSteps(out, existingPageCount) {
126
129
  );
127
130
  out.write(
128
131
  row(
129
- ` ${BLUE}2.${RST} ${BOLD}almanac bootstrap${RST} ${DIM}# scaffold the wiki${RST}`
132
+ ` ${BLUE}2.${RST} ${BOLD}almanac init${RST} ${DIM}# build the wiki${RST}`
130
133
  )
131
134
  );
132
135
  out.write(
@@ -191,7 +194,7 @@ function printBanner(out) {
191
194
  `);
192
195
  }
193
196
  out.write(`
194
- ${WHITE_BOLD2} Install provider integrations${RST2}
197
+ ${WHITE_BOLD2} Install the hook + agent guides${RST2}
195
198
  `);
196
199
  }
197
200
  function printBadge(out) {
@@ -224,6 +227,9 @@ async function runSetup(options = {}) {
224
227
  }
225
228
  printBanner(out);
226
229
  printBadge(out);
230
+ const auth = await safeCheckAuth(options.spawnCli);
231
+ reportAuth(out, auth);
232
+ out.write(BAR + "\n");
227
233
  const agentChoice = await chooseDefaultAgent({
228
234
  out,
229
235
  interactive,
@@ -241,7 +247,7 @@ async function runSetup(options = {}) {
241
247
  }
242
248
  stepDone(
243
249
  out,
244
- `Default provider: ${WHITE_BOLD2}${agentChoice.provider}${RST2} (${agentChoice.model ?? "provider default"})`
250
+ `Default agent: ${WHITE_BOLD2}${agentChoice.provider}${RST2} (${agentChoice.model ?? "provider default"})`
245
251
  );
246
252
  out.write(BAR + "\n");
247
253
  const ephem = options.installPath !== void 0 ? options.installPath !== null ? detectEphemeral(options.installPath) : false : detectEphemeral(detectCurrentInstallPath());
@@ -281,7 +287,7 @@ async function runSetup(options = {}) {
281
287
  } else if (interactive) {
282
288
  hookAction = await confirm(
283
289
  out,
284
- "Install auto-capture hooks for supported agents?",
290
+ "Install auto-capture hooks for Claude, Codex, and Cursor?",
285
291
  true
286
292
  );
287
293
  }
@@ -294,7 +300,7 @@ async function runSetup(options = {}) {
294
300
  stableHooksDir: options.stableHooksDir
295
301
  });
296
302
  if (res.exitCode !== 0) {
297
- stepActive(out, `Auto-capture hook: ${res.stderr.trim()}`);
303
+ stepActive(out, `SessionEnd hook: ${res.stderr.trim()}`);
298
304
  return {
299
305
  stdout: "",
300
306
  stderr: res.stderr,
@@ -304,17 +310,16 @@ async function runSetup(options = {}) {
304
310
  hookResultLine = res.stdout.includes("already installed") ? `Auto-capture hooks ${DIM2}already installed${RST2}` : `Auto-capture hooks installed`;
305
311
  stepDone(out, hookResultLine);
306
312
  } else {
307
- stepSkipped(out, `Auto-capture hooks ${DIM2}skipped${RST2}`);
313
+ stepSkipped(out, `SessionEnd hook ${DIM2}skipped${RST2}`);
308
314
  }
309
315
  out.write(BAR + "\n");
310
316
  let guidesAction = "install";
311
- const providerLabel = getProviderLabel(agentChoice.provider);
312
317
  if (options.skipGuides === true) {
313
318
  guidesAction = "skip";
314
319
  } else if (interactive) {
315
320
  guidesAction = await confirm(
316
321
  out,
317
- `Install the codealmanac guide for ${providerLabel}?`,
322
+ "Install the codealmanac usage guides into ~/.claude/ and import them from CLAUDE.md?",
318
323
  true
319
324
  );
320
325
  }
@@ -322,12 +327,10 @@ async function runSetup(options = {}) {
322
327
  if (guidesAction === "install") {
323
328
  try {
324
329
  const summary = await installGuides({
325
- provider: agentChoice.provider,
326
330
  claudeDir: options.claudeDir ?? path3.join(homedir2(), ".claude"),
327
- guidesDir: options.guidesDir ?? resolveGuidesDir(),
328
- cwd: process.cwd()
331
+ guidesDir: options.guidesDir ?? resolveGuidesDir()
329
332
  });
330
- guidesSummary = summary.anyChanges ? `Guide installed for ${summary.providerLabel} (${summary.filesWritten.join(", ")})` : `Guide for ${summary.providerLabel} ${DIM2}already installed${RST2}`;
333
+ guidesSummary = summary.anyChanges ? `Guides installed (${summary.filesWritten.join(", ")})` : `Guides ${DIM2}already installed${RST2}`;
331
334
  stepDone(out, guidesSummary);
332
335
  } catch (err) {
333
336
  const msg = err instanceof Error ? err.message : String(err);
@@ -346,9 +349,15 @@ async function runSetup(options = {}) {
346
349
  out.write("\n");
347
350
  const existingPageCount = countExistingPages(process.cwd());
348
351
  printNextSteps(out, existingPageCount);
349
- printProviderNextSteps(out);
350
352
  return { stdout: "", stderr: "", exitCode: 0 };
351
353
  }
354
+ async function safeCheckAuth(spawnCli) {
355
+ try {
356
+ return await checkClaudeAuth(spawnCli);
357
+ } catch {
358
+ return { loggedIn: false };
359
+ }
360
+ }
352
361
  async function chooseDefaultAgent(args) {
353
362
  const config = await readConfig();
354
363
  let view = null;
@@ -357,7 +366,7 @@ async function chooseDefaultAgent(args) {
357
366
  view = await buildProviderSetupView({ config, spawnCli: args.spawnCli });
358
367
  }
359
368
  if (args.interactive && args.requested === void 0 && view !== null) {
360
- args.out.write(" Choose default provider for bootstrap/capture:\n");
369
+ args.out.write(" Choose default agent:\n");
361
370
  view.choices.forEach((choice, index) => {
362
371
  const tag = choice.recommended ? " recommended" : "";
363
372
  const status = choice.ready ? "ready" : "not ready";
@@ -369,7 +378,7 @@ async function chooseDefaultAgent(args) {
369
378
  });
370
379
  selected = (await promptText(
371
380
  args.out,
372
- "Default provider",
381
+ "Default agent",
373
382
  view.recommendedProvider
374
383
  )).toLowerCase();
375
384
  const number = Number.parseInt(selected, 10);
@@ -434,7 +443,7 @@ async function chooseProviderModel(args) {
434
443
  if (!args.interactive) {
435
444
  return args.configuredModel ?? recommended?.value ?? null;
436
445
  }
437
- args.out.write(` Choose model for ${getProviderLabel(args.provider)}:
446
+ args.out.write(` Choose ${args.provider} model:
438
447
  `);
439
448
  choices.forEach((choice, index) => {
440
449
  const marker = choice.recommended ? " recommended" : "";
@@ -481,9 +490,25 @@ async function runLoginCommand(command) {
481
490
  });
482
491
  });
483
492
  }
484
- var CODEX_BLOCK_START = "<!-- codealmanac:start -->";
485
- var CODEX_BLOCK_END = "<!-- codealmanac:end -->";
493
+ function reportAuth(out, auth) {
494
+ if (auth.loggedIn) {
495
+ const who = auth.email ?? "Claude account";
496
+ const plan = auth.subscriptionType !== void 0 ? ` ${DIM2}(${auth.subscriptionType})${RST2}` : "";
497
+ stepDone(out, `Claude auth: ${WHITE_BOLD2}${who}${RST2}${plan}`);
498
+ return;
499
+ }
500
+ if (process.env.ANTHROPIC_API_KEY !== void 0 && process.env.ANTHROPIC_API_KEY.length > 0) {
501
+ stepDone(out, `Claude auth: ${WHITE_BOLD2}ANTHROPIC_API_KEY${RST2} set`);
502
+ return;
503
+ }
504
+ stepActive(out, `Claude auth: ${DIM2}not signed in${RST2}`);
505
+ for (const line of UNAUTHENTICATED_MESSAGE.split("\n")) {
506
+ out.write(` ${DIM2}\u2502 ${line}${RST2}
507
+ `);
508
+ }
509
+ }
486
510
  async function installGuides(options) {
511
+ await mkdir(options.claudeDir, { recursive: true });
487
512
  const srcMini = path3.join(options.guidesDir, "mini.md");
488
513
  const srcRef = path3.join(options.guidesDir, "reference.md");
489
514
  if (!existsSync2(srcMini)) {
@@ -492,17 +517,6 @@ async function installGuides(options) {
492
517
  if (!existsSync2(srcRef)) {
493
518
  throw new Error(`missing bundled guide: ${srcRef}`);
494
519
  }
495
- switch (options.provider) {
496
- case "claude":
497
- return await installClaudeGuides(options, srcMini, srcRef);
498
- case "codex":
499
- return await installCodexGuides(srcMini, srcRef);
500
- case "cursor":
501
- return await installCursorGuides(options.cwd, srcMini);
502
- }
503
- }
504
- async function installClaudeGuides(options, srcMini, srcRef) {
505
- await mkdir(options.claudeDir, { recursive: true });
506
520
  const destMini = path3.join(options.claudeDir, "codealmanac.md");
507
521
  const destRef = path3.join(options.claudeDir, "codealmanac-reference.md");
508
522
  const miniChanged = await copyIfChanged(srcMini, destMini);
@@ -513,45 +527,7 @@ async function installClaudeGuides(options, srcMini, srcRef) {
513
527
  if (miniChanged) filesWritten.push("codealmanac.md");
514
528
  if (refChanged) filesWritten.push("codealmanac-reference.md");
515
529
  if (importChanged) filesWritten.push("CLAUDE.md");
516
- return {
517
- providerLabel: "Claude",
518
- anyChanges: filesWritten.length > 0,
519
- filesWritten
520
- };
521
- }
522
- async function installCodexGuides(srcMini, srcRef) {
523
- const codexDir = path3.join(homedir2(), ".codex");
524
- await mkdir(codexDir, { recursive: true });
525
- const destMini = path3.join(codexDir, "codealmanac.md");
526
- const destRef = path3.join(codexDir, "codealmanac-reference.md");
527
- const miniChanged = await copyIfChanged(srcMini, destMini);
528
- const refChanged = await copyIfChanged(srcRef, destRef);
529
- const agentsChanged = await ensureManagedBlock(
530
- path3.join(codexDir, "AGENTS.md"),
531
- codexGuideBlock()
532
- );
533
- const filesWritten = [];
534
- if (miniChanged) filesWritten.push("codealmanac.md");
535
- if (refChanged) filesWritten.push("codealmanac-reference.md");
536
- if (agentsChanged) filesWritten.push("AGENTS.md");
537
- return {
538
- providerLabel: "Codex",
539
- anyChanges: filesWritten.length > 0,
540
- filesWritten
541
- };
542
- }
543
- async function installCursorGuides(cwd, srcMini) {
544
- const rulesDir = path3.join(cwd, ".cursor", "rules");
545
- await mkdir(rulesDir, { recursive: true });
546
- const mini = await readFile(srcMini, "utf8");
547
- const dest = path3.join(rulesDir, "codealmanac.mdc");
548
- const body = "---\ndescription: Use codealmanac wiki context during coding work\nalwaysApply: true\n---\n\n" + mini;
549
- const changed = await writeIfChanged(dest, body);
550
- return {
551
- providerLabel: "Cursor",
552
- anyChanges: changed,
553
- filesWritten: changed ? [".cursor/rules/codealmanac.mdc"] : []
554
- };
530
+ return { anyChanges: filesWritten.length > 0, filesWritten };
555
531
  }
556
532
  async function copyIfChanged(src, dest) {
557
533
  const srcBytes = await readFile(src);
@@ -565,45 +541,6 @@ async function copyIfChanged(src, dest) {
565
541
  await copyFile(src, dest);
566
542
  return true;
567
543
  }
568
- async function writeIfChanged(dest, body) {
569
- if (existsSync2(dest)) {
570
- try {
571
- if (await readFile(dest, "utf8") === body) return false;
572
- } catch {
573
- }
574
- }
575
- await writeFile(dest, body, "utf8");
576
- return true;
577
- }
578
- async function ensureManagedBlock(file, block) {
579
- let existing = "";
580
- if (existsSync2(file)) existing = await readFile(file, "utf8");
581
- const pattern = new RegExp(
582
- `${escapeRegex(CODEX_BLOCK_START)}[\\s\\S]*?${escapeRegex(CODEX_BLOCK_END)}`
583
- );
584
- const next = pattern.test(existing) ? existing.replace(pattern, block.trimEnd()) : `${existing.trimEnd()}${existing.trim().length > 0 ? "\n\n" : ""}${block.trimEnd()}
585
- `;
586
- const normalized = next.endsWith("\n") ? next : `${next}
587
- `;
588
- if (normalized === existing) return false;
589
- await writeFile(file, normalized, "utf8");
590
- return true;
591
- }
592
- function codexGuideBlock() {
593
- return [
594
- CODEX_BLOCK_START,
595
- "# codealmanac",
596
- "",
597
- "This machine has codealmanac installed: a local wiki for codebases.",
598
- "Before codealmanac/wiki-related work, read `~/.codex/codealmanac.md`.",
599
- "For the full command reference, read `~/.codex/codealmanac-reference.md` on demand.",
600
- CODEX_BLOCK_END,
601
- ""
602
- ].join("\n");
603
- }
604
- function escapeRegex(value) {
605
- return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
606
- }
607
544
  var IMPORT_LINE = "@~/.claude/codealmanac.md";
608
545
  async function ensureImport(claudeMdPath) {
609
546
  let existing = "";
@@ -690,22 +627,9 @@ function resolveGuidesDir() {
690
627
  function looksLikeGuidesDir(dir) {
691
628
  return existsSync2(path3.join(dir, "mini.md"));
692
629
  }
693
- function printProviderNextSteps(out) {
694
- out.write(` ${DIM2}Change provider/model later:${RST2}
695
- `);
696
- out.write(` ${DIM2} almanac agents list${RST2}
697
- `);
698
- out.write(` ${DIM2} almanac agents use <claude|codex|cursor>${RST2}
699
- `);
700
- out.write(
701
- ` ${DIM2} almanac agents model <provider> <model|--default>${RST2}
702
-
703
- `
704
- );
705
- }
706
630
 
707
631
  export {
708
632
  runSetup,
709
633
  IMPORT_LINE
710
634
  };
711
- //# sourceMappingURL=chunk-GFUB57IT.js.map
635
+ //# sourceMappingURL=chunk-ZUQN5Y3K.js.map