codealmanac 0.2.6 → 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.
- package/LICENSE +21 -133
- package/README.md +20 -15
- package/dist/{agents-HYRWRHRX.js → agents-V2ZOIACP.js} +6 -5
- package/dist/{chunk-PDFS5VFE.js → chunk-447U3GQJ.js} +5 -17
- package/dist/chunk-447U3GQJ.js.map +1 -0
- package/dist/{chunk-3E7JNMTZ.js → chunk-5BWUMAOX.js} +4 -29
- package/dist/chunk-5BWUMAOX.js.map +1 -0
- package/dist/{chunk-KQUVMF27.js → chunk-BFIG2CXM.js} +2 -516
- package/dist/chunk-BFIG2CXM.js.map +1 -0
- package/dist/{chunk-K2JBCB7R.js → chunk-BQY5L3DL.js} +7 -43
- package/dist/chunk-BQY5L3DL.js.map +1 -0
- package/dist/{chunk-F53U6JQG.js → chunk-CQJVM34R.js} +2 -2
- package/dist/chunk-FUBE6KCO.js +124 -0
- package/dist/chunk-FUBE6KCO.js.map +1 -0
- package/dist/chunk-IZBXXAVL.js +524 -0
- package/dist/chunk-IZBXXAVL.js.map +1 -0
- package/dist/{chunk-7JUX4ADQ.js → chunk-IZT6RBHS.js} +1 -1
- package/dist/{chunk-DW32TL5W.js → chunk-JLQZELHQ.js} +18 -58
- package/dist/chunk-JLQZELHQ.js.map +1 -0
- package/dist/{chunk-2BNDNGUR.js → chunk-KZXWPG4P.js} +4 -8
- package/dist/{chunk-2BNDNGUR.js.map → chunk-KZXWPG4P.js.map} +1 -1
- package/dist/{chunk-GPFVEF6V.js → chunk-QIA22IAM.js} +6 -24
- package/dist/chunk-QIA22IAM.js.map +1 -0
- package/dist/{chunk-J7DNV2DH.js → chunk-RALBM6HZ.js} +43 -355
- package/dist/chunk-RALBM6HZ.js.map +1 -0
- package/dist/{chunk-HJ3WREGP.js → chunk-U5DLLWIC.js} +3 -3
- package/dist/chunk-WL4UE7Q6.js +1386 -0
- package/dist/chunk-WL4UE7Q6.js.map +1 -0
- package/dist/{chunk-VXDPUOQ5.js → chunk-ZUQN5Y3K.js} +129 -382
- package/dist/chunk-ZUQN5Y3K.js.map +1 -0
- package/dist/{chunk-ODJAAJGZ.js → chunk-ZZLLOAI6.js} +3 -3
- package/dist/{cli-MKXCNEMW.js → cli-XWPNARA6.js} +37 -20
- package/dist/cli-XWPNARA6.js.map +1 -0
- package/dist/codealmanac.js +1 -1
- package/dist/{config-F7FKEQ7F.js → config-KH3JUMG6.js} +4 -4
- package/dist/doctor-ENJT665Z.js +18 -0
- package/dist/{hook-4SVX446M.js → hook-2NP3UE7U.js} +2 -4
- package/dist/paths-O5CZADP2.js +14 -0
- package/dist/process-KFSLENL3.js +61 -0
- package/dist/{register-commands-2F6SXLDI.js → register-commands-LULZUSPO.js} +999 -1030
- package/dist/register-commands-LULZUSPO.js.map +1 -0
- package/dist/uninstall-BD4MMQ7M.js +16 -0
- package/dist/uninstall-BD4MMQ7M.js.map +1 -0
- package/dist/update-XSKPDFMJ.js +11 -0
- package/dist/update-XSKPDFMJ.js.map +1 -0
- package/dist/{wiki-IGNRNLUZ.js → wiki-O4RWMAE6.js} +8 -6
- package/dist/wiki-O4RWMAE6.js.map +1 -0
- package/guides/mini.md +8 -6
- package/guides/reference.md +89 -32
- package/hooks/almanac-capture.sh +7 -8
- package/package.json +3 -4
- package/prompts/agents/.gitkeep +1 -0
- package/prompts/base/notability.md +139 -0
- package/prompts/base/purpose.md +85 -0
- package/prompts/base/syntax.md +114 -0
- package/prompts/operations/absorb.md +43 -0
- package/prompts/operations/build.md +49 -0
- package/prompts/operations/garden.md +51 -0
- package/COMMERCIAL.md +0 -9
- package/dist/chunk-3E7JNMTZ.js.map +0 -1
- package/dist/chunk-DW32TL5W.js.map +0 -1
- package/dist/chunk-GPFVEF6V.js.map +0 -1
- package/dist/chunk-J7DNV2DH.js.map +0 -1
- package/dist/chunk-K2JBCB7R.js.map +0 -1
- package/dist/chunk-KQUVMF27.js.map +0 -1
- package/dist/chunk-PDFS5VFE.js.map +0 -1
- package/dist/chunk-VXDPUOQ5.js.map +0 -1
- package/dist/cli-MKXCNEMW.js.map +0 -1
- package/dist/doctor-37UH3HT5.js +0 -17
- package/dist/register-commands-2F6SXLDI.js.map +0 -1
- package/dist/uninstall-C62ZOK32.js +0 -17
- package/dist/update-2UGOFN5C.js +0 -11
- package/dist/wiki-IGNRNLUZ.js.map +0 -1
- package/prompts/bootstrap.md +0 -176
- package/prompts/reviewer.md +0 -129
- package/prompts/writer.md +0 -134
- /package/dist/{agents-HYRWRHRX.js.map → agents-V2ZOIACP.js.map} +0 -0
- /package/dist/{chunk-F53U6JQG.js.map → chunk-CQJVM34R.js.map} +0 -0
- /package/dist/{chunk-7JUX4ADQ.js.map → chunk-IZT6RBHS.js.map} +0 -0
- /package/dist/{chunk-HJ3WREGP.js.map → chunk-U5DLLWIC.js.map} +0 -0
- /package/dist/{chunk-ODJAAJGZ.js.map → chunk-ZZLLOAI6.js.map} +0 -0
- /package/dist/{config-F7FKEQ7F.js.map → config-KH3JUMG6.js.map} +0 -0
- /package/dist/{doctor-37UH3HT5.js.map → doctor-ENJT665Z.js.map} +0 -0
- /package/dist/{hook-4SVX446M.js.map → hook-2NP3UE7U.js.map} +0 -0
- /package/dist/{uninstall-C62ZOK32.js.map → paths-O5CZADP2.js.map} +0 -0
- /package/dist/{update-2UGOFN5C.js.map → process-KFSLENL3.js.map} +0 -0
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
3
|
readStateForDoctor
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-U5DLLWIC.js";
|
|
5
|
+
import {
|
|
6
|
+
isNewer
|
|
7
|
+
} from "./chunk-CQJVM34R.js";
|
|
5
8
|
import {
|
|
6
9
|
formatDuration
|
|
7
10
|
} from "./chunk-4CODZRHH.js";
|
|
@@ -14,21 +17,17 @@ import {
|
|
|
14
17
|
RST
|
|
15
18
|
} from "./chunk-FM3VRDK7.js";
|
|
16
19
|
import {
|
|
17
|
-
IMPORT_LINE
|
|
18
|
-
|
|
19
|
-
resolveCodexAgentsPath
|
|
20
|
-
} from "./chunk-VXDPUOQ5.js";
|
|
20
|
+
IMPORT_LINE
|
|
21
|
+
} from "./chunk-ZUQN5Y3K.js";
|
|
21
22
|
import {
|
|
22
|
-
buildProviderSetupView
|
|
23
|
-
|
|
24
|
-
} from "./chunk-J7DNV2DH.js";
|
|
23
|
+
buildProviderSetupView
|
|
24
|
+
} from "./chunk-RALBM6HZ.js";
|
|
25
25
|
import {
|
|
26
|
-
|
|
27
|
-
} from "./chunk-
|
|
26
|
+
checkClaudeAuth
|
|
27
|
+
} from "./chunk-FUBE6KCO.js";
|
|
28
28
|
import {
|
|
29
|
-
isCursorEnabled,
|
|
30
29
|
readConfig
|
|
31
|
-
} from "./chunk-
|
|
30
|
+
} from "./chunk-5BWUMAOX.js";
|
|
32
31
|
|
|
33
32
|
// src/commands/doctor-checks/format.ts
|
|
34
33
|
function formatReport(report, options) {
|
|
@@ -213,8 +212,6 @@ async function gatherInstallChecks(options) {
|
|
|
213
212
|
const claudeDir = options.claudeDir ?? path2.join(homedir2(), ".claude");
|
|
214
213
|
checks.push(describeGuides(claudeDir));
|
|
215
214
|
checks.push(await describeImportLine(claudeDir));
|
|
216
|
-
const codexDir = options.codexDir ?? path2.join(homedir2(), ".codex");
|
|
217
|
-
checks.push(await describeCodexInstructions(codexDir));
|
|
218
215
|
return checks;
|
|
219
216
|
}
|
|
220
217
|
function describeInstallPath(installPath, isEphemeral) {
|
|
@@ -375,40 +372,6 @@ async function describeImportLine(claudeDir) {
|
|
|
375
372
|
};
|
|
376
373
|
}
|
|
377
374
|
}
|
|
378
|
-
async function describeCodexInstructions(codexDir) {
|
|
379
|
-
const agentsFile = await resolveCodexAgentsPath(codexDir);
|
|
380
|
-
if (!existsSync2(agentsFile)) {
|
|
381
|
-
return {
|
|
382
|
-
status: "problem",
|
|
383
|
-
key: "install.codexInstructions",
|
|
384
|
-
message: `Codex AGENTS instructions missing (${path2.basename(agentsFile)} not found)`,
|
|
385
|
-
fix: "run: almanac setup --yes"
|
|
386
|
-
};
|
|
387
|
-
}
|
|
388
|
-
try {
|
|
389
|
-
const contents = await readFile(agentsFile, "utf8");
|
|
390
|
-
if (hasCodexInstructions(contents)) {
|
|
391
|
-
return {
|
|
392
|
-
status: "ok",
|
|
393
|
-
key: "install.codexInstructions",
|
|
394
|
-
message: `Codex AGENTS instructions present (${path2.basename(agentsFile)})`
|
|
395
|
-
};
|
|
396
|
-
}
|
|
397
|
-
} catch (err) {
|
|
398
|
-
const msg = err instanceof Error ? err.message : String(err);
|
|
399
|
-
return {
|
|
400
|
-
status: "problem",
|
|
401
|
-
key: "install.codexInstructions",
|
|
402
|
-
message: `could not read ${agentsFile}: ${msg}`
|
|
403
|
-
};
|
|
404
|
-
}
|
|
405
|
-
return {
|
|
406
|
-
status: "problem",
|
|
407
|
-
key: "install.codexInstructions",
|
|
408
|
-
message: `Codex AGENTS instructions missing (${path2.basename(agentsFile)})`,
|
|
409
|
-
fix: "run: almanac setup --yes"
|
|
410
|
-
};
|
|
411
|
-
}
|
|
412
375
|
|
|
413
376
|
// src/commands/doctor-checks/agents.ts
|
|
414
377
|
async function gatherAgentChecks(options) {
|
|
@@ -439,7 +402,7 @@ async function injectedProviderStatuses(options) {
|
|
|
439
402
|
const auth = await checkClaudeAuth(options.spawnCli);
|
|
440
403
|
const hasApiKey = process.env.ANTHROPIC_API_KEY !== void 0 && process.env.ANTHROPIC_API_KEY.length > 0;
|
|
441
404
|
const claudeReady = auth.loggedIn || hasApiKey;
|
|
442
|
-
|
|
405
|
+
return [
|
|
443
406
|
{
|
|
444
407
|
id: "claude",
|
|
445
408
|
installed: true,
|
|
@@ -451,17 +414,14 @@ async function injectedProviderStatuses(options) {
|
|
|
451
414
|
installed: false,
|
|
452
415
|
authenticated: false,
|
|
453
416
|
detail: "codex status not injected"
|
|
454
|
-
}
|
|
455
|
-
|
|
456
|
-
if (isCursorEnabled()) {
|
|
457
|
-
statuses.push({
|
|
417
|
+
},
|
|
418
|
+
{
|
|
458
419
|
id: "cursor",
|
|
459
420
|
installed: false,
|
|
460
421
|
authenticated: false,
|
|
461
422
|
detail: "cursor-agent status not injected"
|
|
462
|
-
}
|
|
463
|
-
|
|
464
|
-
return statuses;
|
|
423
|
+
}
|
|
424
|
+
];
|
|
465
425
|
}
|
|
466
426
|
|
|
467
427
|
// src/commands/doctor-checks/updates.ts
|
|
@@ -547,7 +507,7 @@ async function runDoctor(options) {
|
|
|
547
507
|
}
|
|
548
508
|
async function safeGatherWikiChecks(options) {
|
|
549
509
|
try {
|
|
550
|
-
const { gatherWikiChecks } = await import("./wiki-
|
|
510
|
+
const { gatherWikiChecks } = await import("./wiki-O4RWMAE6.js");
|
|
551
511
|
return await gatherWikiChecks(options);
|
|
552
512
|
} catch (err) {
|
|
553
513
|
const msg = err instanceof Error ? err.message : String(err);
|
|
@@ -565,4 +525,4 @@ async function safeGatherWikiChecks(options) {
|
|
|
565
525
|
export {
|
|
566
526
|
runDoctor
|
|
567
527
|
};
|
|
568
|
-
//# sourceMappingURL=chunk-
|
|
528
|
+
//# sourceMappingURL=chunk-JLQZELHQ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/commands/doctor-checks/format.ts","../src/commands/doctor-checks/install.ts","../src/commands/doctor-checks/probes.ts","../src/commands/doctor-checks/agents.ts","../src/commands/doctor-checks/updates.ts","../src/commands/doctor.ts"],"sourcesContent":["import { BLUE, BOLD, DIM, GREEN, RED, RST } from \"../../ansi.js\";\nimport type {\n AgentDoctorCheck,\n Check,\n CheckStatus,\n DoctorOptions,\n DoctorReport,\n} from \"./types.js\";\n\nexport function formatReport(\n report: DoctorReport,\n options: DoctorOptions,\n): string {\n const color = options.stdout === undefined && process.stdout.isTTY === true;\n const lines: string[] = [];\n lines.push(`codealmanac v${report.version}`);\n lines.push(\"\");\n if (report.install.length > 0) {\n lines.push(color ? `${BOLD}## Install${RST}` : \"## Install\");\n for (const c of report.install) {\n lines.push(formatCheck(c, color));\n }\n lines.push(\"\");\n }\n if (report.agents.length > 0) {\n lines.push(color ? `${BOLD}## Agents${RST}` : \"## Agents\");\n for (const c of report.agents.map(agentToCheck)) {\n lines.push(formatCheck(c, color));\n }\n lines.push(\"\");\n }\n if (report.updates.length > 0) {\n lines.push(color ? `${BOLD}## Updates${RST}` : \"## Updates\");\n for (const c of report.updates) {\n lines.push(formatCheck(c, color));\n }\n lines.push(\"\");\n }\n if (report.wiki.length > 0) {\n lines.push(color ? `${BOLD}## Current wiki${RST}` : \"## Current wiki\");\n for (const c of report.wiki) {\n lines.push(formatCheck(c, color));\n }\n lines.push(\"\");\n }\n return `${lines.join(\"\\n\")}\\n`;\n}\n\nfunction agentToCheck(agent: AgentDoctorCheck): Check {\n const message = [\n agent.label,\n agent.selected ? \"(default)\" : null,\n agent.recommended ? \"(recommended)\" : null,\n agent.status === \"ok\" ? \"ready\" : readinessMessage(agent),\n `model: ${agent.model ?? \"provider default\"}`,\n agent.account,\n ].filter((part): part is string => part !== null).join(\" \");\n return {\n status: agent.status,\n key: `agents.${agent.id}`,\n message,\n fix: agent.fix,\n };\n}\n\nfunction readinessMessage(agent: AgentDoctorCheck): string {\n if (!agent.installed) return \"missing\";\n if (!agent.authenticated) return `not ready: ${agent.detail}`;\n return agent.detail;\n}\n\nfunction formatCheck(c: Check, color: boolean): string {\n const { icon, tint } = iconFor(c.status, color);\n const head = ` ${tint}${icon}${color ? RST : \"\"} ${c.message}`;\n if (c.fix === undefined) return head;\n const fixLine = color\n ? ` ${DIM}${c.fix}${RST}`\n : ` ${c.fix}`;\n return `${head}\\n${fixLine}`;\n}\n\nfunction iconFor(\n status: CheckStatus,\n color: boolean,\n): { icon: string; tint: string } {\n switch (status) {\n case \"ok\":\n return { icon: \"\\u2713\", tint: color ? GREEN : \"\" };\n case \"problem\":\n return { icon: \"\\u2717\", tint: color ? RED : \"\" };\n case \"info\":\n return { icon: \"\\u25c7\", tint: color ? BLUE : \"\" };\n }\n}\n","import { existsSync } from \"node:fs\";\nimport { readFile } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport path from \"node:path\";\n\nimport type { ClaudeAuthStatus } from \"../../agent/providers/claude/index.js\";\nimport { IMPORT_LINE } from \"../setup.js\";\nimport {\n classifyInstallPath,\n detectInstallPath,\n probeBetterSqlite3,\n safeCheckAuth,\n} from \"./probes.js\";\nimport type { Check, DoctorOptions } from \"./types.js\";\n\nexport async function gatherInstallChecks(\n options: DoctorOptions,\n): Promise<Check[]> {\n const checks: Check[] = [];\n\n const rawPath = options.installPath ?? detectInstallPath();\n const { installPath, isEphemeral } = classifyInstallPath(rawPath);\n checks.push(describeInstallPath(installPath, isEphemeral));\n\n const nodeVersion = options.nodeVersion ?? process.version;\n const sqlite = options.sqliteProbe ?? probeBetterSqlite3();\n checks.push({\n status: sqlite.ok ? \"ok\" : \"problem\",\n key: \"install.sqlite\",\n message: sqlite.ok\n ? `better-sqlite3 native binding OK (Node ${nodeVersion})`\n : `better-sqlite3 native binding failed: ${sqlite.summary}`,\n fix: sqlite.ok\n ? undefined\n : \"run: npm rebuild better-sqlite3 (in the install directory)\",\n });\n\n const auth = await safeCheckAuth(options.spawnCli);\n checks.push(describeAuth(auth));\n\n const settingsPath =\n options.settingsPath ?? path.join(homedir(), \".claude\", \"settings.json\");\n checks.push(await describeHook(settingsPath));\n\n const claudeDir = options.claudeDir ?? path.join(homedir(), \".claude\");\n checks.push(describeGuides(claudeDir));\n checks.push(await describeImportLine(claudeDir));\n\n return checks;\n}\n\nfunction describeInstallPath(\n installPath: string | null,\n isEphemeral: boolean,\n): Check {\n if (installPath === null) {\n return {\n status: \"problem\",\n key: \"install.path\",\n message: \"could not detect codealmanac install path\",\n fix: \"reinstall with: npm install -g codealmanac\",\n };\n }\n return {\n status: isEphemeral ? \"info\" : \"ok\",\n key: \"install.path\",\n message: isEphemeral\n ? `codealmanac running from ephemeral npx location: ${installPath}`\n : `codealmanac installed at ${installPath}`,\n fix: isEphemeral\n ? \"run: npm install -g codealmanac (to make the install permanent)\"\n : undefined,\n };\n}\n\nfunction describeAuth(auth: ClaudeAuthStatus): Check {\n if (auth.loggedIn) {\n if (auth.authMethod === \"apiKey\") {\n return {\n status: \"ok\",\n key: \"install.auth\",\n message: \"claude auth: ANTHROPIC_API_KEY set\",\n };\n }\n const who = auth.email ?? \"Claude account\";\n const plan =\n auth.subscriptionType !== undefined\n ? ` (${auth.subscriptionType} subscription)`\n : \"\";\n return {\n status: \"ok\",\n key: \"install.auth\",\n message: `claude auth: ${who}${plan}`,\n };\n }\n if (\n process.env.ANTHROPIC_API_KEY !== undefined &&\n process.env.ANTHROPIC_API_KEY.length > 0\n ) {\n return {\n status: \"ok\",\n key: \"install.auth\",\n message: \"claude auth: ANTHROPIC_API_KEY set\",\n };\n }\n return {\n status: \"problem\",\n key: \"install.auth\",\n message: \"claude auth: not signed in\",\n fix: \"run: claude auth login --claudeai (or export ANTHROPIC_API_KEY)\",\n };\n}\n\nasync function describeHook(settingsPath: string): Promise<Check> {\n if (!existsSync(settingsPath)) {\n return {\n status: \"problem\",\n key: \"install.hook\",\n message: \"SessionEnd hook not installed\",\n fix: \"run: almanac setup --yes\",\n };\n }\n try {\n const raw = await readFile(settingsPath, \"utf8\");\n const parsed = JSON.parse(raw) as {\n hooks?: {\n SessionEnd?: {\n command?: string;\n hooks?: { command?: string }[];\n }[];\n };\n };\n const entries = parsed.hooks?.SessionEnd ?? [];\n const found = entries.some((e) => {\n if (\n typeof e?.command === \"string\" &&\n e.command.endsWith(\"almanac-capture.sh\")\n ) {\n return true;\n }\n if (Array.isArray(e?.hooks)) {\n return e.hooks.some(\n (h) =>\n typeof h?.command === \"string\" &&\n h.command.endsWith(\"almanac-capture.sh\"),\n );\n }\n return false;\n });\n if (!found) {\n return {\n status: \"problem\",\n key: \"install.hook\",\n message: \"SessionEnd hook not installed\",\n fix: \"run: almanac setup --yes\",\n };\n }\n return {\n status: \"ok\",\n key: \"install.hook\",\n message: `SessionEnd hook installed at ${settingsPath}`,\n };\n } catch (err: unknown) {\n const msg = err instanceof Error ? err.message : String(err);\n return {\n status: \"problem\",\n key: \"install.hook\",\n message: `could not read ${settingsPath}: ${msg}`,\n fix: \"check the file for malformed JSON\",\n };\n }\n}\n\nfunction describeGuides(claudeDir: string): Check {\n const mini = path.join(claudeDir, \"codealmanac.md\");\n const ref = path.join(claudeDir, \"codealmanac-reference.md\");\n const haveMini = existsSync(mini);\n const haveRef = existsSync(ref);\n if (haveMini && haveRef) {\n return {\n status: \"ok\",\n key: \"install.guides\",\n message: `Agent guides installed (${path.basename(mini)}, ${path.basename(ref)})`,\n };\n }\n const missing = [\n haveMini ? null : \"codealmanac.md\",\n haveRef ? null : \"codealmanac-reference.md\",\n ].filter((s): s is string => s !== null);\n return {\n status: \"problem\",\n key: \"install.guides\",\n message: `Agent guides missing (${missing.join(\", \")})`,\n fix: \"run: almanac setup --yes\",\n };\n}\n\nasync function describeImportLine(claudeDir: string): Promise<Check> {\n const claudeMd = path.join(claudeDir, \"CLAUDE.md\");\n if (!existsSync(claudeMd)) {\n return {\n status: \"problem\",\n key: \"install.import\",\n message: \"CLAUDE.md import not present (no ~/.claude/CLAUDE.md)\",\n fix: \"run: almanac setup --yes\",\n };\n }\n try {\n const contents = await readFile(claudeMd, \"utf8\");\n const lines = contents.split(/\\r?\\n/).map((l) => l.trim());\n const present = lines.some((line) => {\n if (line === IMPORT_LINE) return true;\n if (!line.startsWith(IMPORT_LINE)) return false;\n const next = line[IMPORT_LINE.length];\n return next === \" \" || next === \"\\t\";\n });\n if (present) {\n return {\n status: \"ok\",\n key: \"install.import\",\n message: \"CLAUDE.md import present\",\n };\n }\n return {\n status: \"problem\",\n key: \"install.import\",\n message: \"CLAUDE.md import line missing\",\n fix: \"run: almanac setup --yes\",\n };\n } catch (err: unknown) {\n const msg = err instanceof Error ? err.message : String(err);\n return {\n status: \"problem\",\n key: \"install.import\",\n message: `could not read ${claudeMd}: ${msg}`,\n };\n }\n}\n","import { existsSync, readFileSync } from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport { homedir } from \"node:os\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nimport {\n checkClaudeAuth,\n type ClaudeAuthStatus,\n type SpawnCliFn,\n} from \"../../agent/providers/claude/index.js\";\nimport type { SqliteProbeResult } from \"./types.js\";\n\n// Single `createRequire` instance — used by package/binding probes.\nconst req = createRequire(import.meta.url);\n\n/**\n * Detect where codealmanac is installed by walking up from the running\n * module until we find a `package.json` whose `name` is `codealmanac`.\n */\nexport function detectInstallPath(): string | null {\n try {\n const here = fileURLToPath(import.meta.url);\n let dir = path.dirname(here);\n for (let i = 0; i < 6; i++) {\n const pkgPath = path.join(dir, \"package.json\");\n if (existsSync(pkgPath)) {\n try {\n const raw = readFileSync(pkgPath, \"utf-8\");\n const pkg = JSON.parse(raw) as { name?: unknown };\n if (pkg.name === \"codealmanac\") return dir;\n } catch {\n // ignore — keep walking\n }\n }\n const parent = path.dirname(dir);\n if (parent === dir) break;\n dir = parent;\n }\n return null;\n } catch {\n return null;\n }\n}\n\n/**\n * Classify the detected install path as permanent or ephemeral.\n * Ephemeral locations (npm npx cache, pnpm dlx cache, /tmp/) are valid\n * installs but will disappear when the cache is evicted or the machine\n * reboots. Doctor reports them as `info` rather than `ok`.\n */\nexport function classifyInstallPath(\n raw: string | null,\n): { installPath: string | null; isEphemeral: boolean } {\n if (raw === null) return { installPath: null, isEphemeral: false };\n const home = homedir();\n const ephemeralPrefixes = [\n path.join(home, \".npm\", \"_npx\"),\n path.join(home, \".local\", \"share\", \"pnpm\", \"dlx\"),\n \"/tmp/\",\n \"/var/folders/\",\n ];\n const isEphemeral = ephemeralPrefixes.some((p) => raw.startsWith(p));\n return { installPath: raw, isEphemeral };\n}\n\n/**\n * Probe the better-sqlite3 native binding by opening an in-memory DB.\n */\nexport function probeBetterSqlite3(): SqliteProbeResult {\n try {\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n const Database = req(\"better-sqlite3\") as typeof import(\"better-sqlite3\");\n const db = new Database(\":memory:\");\n db.close();\n return { ok: true, summary: \"native binding loads cleanly\" };\n } catch (err: unknown) {\n const msg = err instanceof Error ? err.message : String(err);\n const firstLine = msg.split(\"\\n\")[0] ?? msg;\n return { ok: false, summary: firstLine };\n }\n}\n\nexport async function safeCheckAuth(\n spawnCli?: SpawnCliFn,\n): Promise<ClaudeAuthStatus> {\n try {\n return await checkClaudeAuth(spawnCli);\n } catch {\n return { loggedIn: false };\n }\n}\n\nexport function readPackageVersion(): string | null {\n const candidates = [\n \"../../../package.json\",\n \"../../package.json\",\n \"../package.json\",\n ];\n for (const candidate of candidates) {\n try {\n const pkg = req(candidate) as { version?: unknown };\n if (typeof pkg.version === \"string\" && pkg.version.length > 0) {\n return pkg.version;\n }\n } catch {\n // Fall through to the next runtime layout candidate.\n }\n }\n return null;\n}\n","import { buildProviderSetupView } from \"../../agent/provider-view.js\";\nimport { checkClaudeAuth } from \"../../agent/providers/claude/index.js\";\nimport type { ProviderStatus } from \"../../agent/types.js\";\nimport type { AgentDoctorCheck, DoctorOptions } from \"./types.js\";\n\nexport async function gatherAgentChecks(\n options: DoctorOptions,\n): Promise<AgentDoctorCheck[]> {\n const view = await buildProviderSetupView({\n spawnCli: options.spawnCli,\n statuses:\n options.providerStatuses ??\n (options.spawnCli === undefined\n ? undefined\n : await injectedProviderStatuses(options)),\n });\n return view.choices.map((choice) => {\n return {\n status: choice.ready ? \"ok\" : \"problem\",\n id: choice.id,\n label: choice.label,\n readiness: choice.readiness,\n selected: choice.selected,\n recommended: choice.recommended,\n installed: choice.installed,\n authenticated: choice.authenticated,\n model: choice.effectiveModel,\n providerDefaultModel: choice.providerDefaultModel,\n configuredModel: choice.configuredModel,\n account: choice.account,\n detail: choice.detail,\n fix: choice.fixCommand ?? undefined,\n };\n });\n}\n\nasync function injectedProviderStatuses(\n options: DoctorOptions,\n): Promise<ProviderStatus[]> {\n const auth = await checkClaudeAuth(options.spawnCli);\n const hasApiKey =\n process.env.ANTHROPIC_API_KEY !== undefined &&\n process.env.ANTHROPIC_API_KEY.length > 0;\n const claudeReady = auth.loggedIn || hasApiKey;\n return [\n {\n id: \"claude\",\n installed: true,\n authenticated: claudeReady,\n detail: claudeReady\n ? auth.email ?? (hasApiKey ? \"ANTHROPIC_API_KEY set\" : \"logged in\")\n : \"not logged in\",\n },\n {\n id: \"codex\",\n installed: false,\n authenticated: false,\n detail: \"codex status not injected\",\n },\n {\n id: \"cursor\",\n installed: false,\n authenticated: false,\n detail: \"cursor-agent status not injected\",\n },\n ];\n}\n","import { readConfig } from \"../../update/config.js\";\nimport { readStateForDoctor } from \"../../update/schedule.js\";\nimport { isNewer } from \"../../update/semver.js\";\nimport { formatDuration } from \"./duration.js\";\nimport type { Check, DoctorOptions } from \"./types.js\";\n\nexport async function gatherUpdateChecks(\n options: DoctorOptions,\n installedVersion: string,\n): Promise<Check[]> {\n const checks: Check[] = [];\n const state = readStateForDoctor(options.updateStatePath);\n const config = await readConfig(options.updateConfigPath);\n\n if (state === null || state.latest_version.length === 0) {\n checks.push({\n status: \"info\",\n key: \"update.status\",\n message: `on ${installedVersion}; no update check has run yet`,\n fix: \"run: almanac update --check\",\n });\n } else if (isNewer(state.latest_version, installedVersion)) {\n const dismissed = state.dismissed_versions.includes(state.latest_version)\n ? \" (dismissed — run `almanac update` to install anyway)\"\n : \"\";\n checks.push({\n status: \"problem\",\n key: \"update.status\",\n message:\n `${state.latest_version} available (you're on ${installedVersion})${dismissed}`,\n fix: \"run: almanac update\",\n });\n } else {\n checks.push({\n status: \"ok\",\n key: \"update.status\",\n message: `on latest (${installedVersion})`,\n });\n }\n\n if (state !== null && state.last_check_at > 0) {\n const now = (options.now?.() ?? new Date()).getTime();\n const ageMs = now - state.last_check_at * 1000;\n const failedSuffix =\n state.last_fetch_failed_at !== undefined &&\n state.last_fetch_failed_at === state.last_check_at\n ? \" (last attempt failed — will retry next invocation)\"\n : \"\";\n checks.push({\n status: \"info\",\n key: \"update.last_check\",\n message: `last checked: ${formatDuration(ageMs)} ago${failedSuffix}`,\n });\n } else {\n checks.push({\n status: \"info\",\n key: \"update.last_check\",\n message: \"last checked: never\",\n });\n }\n\n checks.push({\n status: \"info\",\n key: \"update.notifier\",\n message: `update notifier: ${config.update_notifier ? \"enabled\" : \"disabled\"}`,\n fix: config.update_notifier\n ? undefined\n : \"run: almanac config set update_notifier true\",\n });\n\n if (state !== null && state.dismissed_versions.length > 0) {\n checks.push({\n status: \"info\",\n key: \"update.dismissed\",\n message: `dismissed versions: ${state.dismissed_versions.join(\", \")}`,\n });\n }\n\n return checks;\n}\n","import { formatReport } from \"./doctor-checks/format.js\";\nimport { gatherInstallChecks } from \"./doctor-checks/install.js\";\nimport { readPackageVersion } from \"./doctor-checks/probes.js\";\nimport type {\n Check,\n CheckStatus,\n AgentDoctorCheck,\n DoctorOptions,\n DoctorReport,\n DoctorResult,\n SqliteProbeResult,\n} from \"./doctor-checks/types.js\";\nimport { gatherAgentChecks } from \"./doctor-checks/agents.js\";\nimport { gatherUpdateChecks } from \"./doctor-checks/updates.js\";\n\nexport type {\n Check,\n CheckStatus,\n DoctorOptions,\n DoctorReport,\n DoctorResult,\n SqliteProbeResult,\n};\n\n/**\n * `almanac doctor` — install + wiki health report.\n *\n * Separate from `almanac health` (which checks graph integrity of a\n * specific wiki). `doctor` answers the \"is this install even set up\n * correctly?\" question that users hit when first trying the tool or when\n * sessions silently stop getting captured.\n *\n * This file is the command composition root. The section-specific probes\n * and formatting live in `doctor-checks/` so each durable fact has one\n * obvious owner.\n */\nexport async function runDoctor(\n options: DoctorOptions,\n): Promise<DoctorResult> {\n const version =\n options.versionOverride ?? readPackageVersion() ?? \"unknown\";\n\n const install: Check[] = options.wikiOnly === true\n ? []\n : await gatherInstallChecks(options);\n\n const agents: AgentDoctorCheck[] = options.wikiOnly === true\n ? []\n : await gatherAgentChecks(options);\n\n const updates: Check[] = options.wikiOnly === true\n ? []\n : await gatherUpdateChecks(options, version);\n\n const wiki: Check[] = options.installOnly === true\n ? []\n : await safeGatherWikiChecks(options);\n\n const report: DoctorReport = { version, install, agents, updates, wiki };\n\n if (options.json === true) {\n return {\n stdout: `${JSON.stringify(report, null, 2)}\\n`,\n stderr: \"\",\n exitCode: 0,\n };\n }\n\n return {\n stdout: formatReport(report, options),\n stderr: \"\",\n exitCode: 0,\n };\n}\n\nasync function safeGatherWikiChecks(\n options: DoctorOptions,\n): Promise<Check[]> {\n try {\n const { gatherWikiChecks } = await import(\"./doctor-checks/wiki.js\");\n return await gatherWikiChecks(options);\n } catch (err: unknown) {\n const msg = err instanceof Error ? err.message : String(err);\n return [\n {\n status: \"problem\",\n key: \"wiki.checks\",\n message: `could not run wiki checks: ${msg.split(\"\\n\")[0] ?? msg}`,\n fix: \"run: npm rebuild better-sqlite3 (in the install directory)\",\n },\n ];\n }\n}\n"],"mappings":"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","names":["existsSync","homedir","path","path","homedir","existsSync"]}
|
|
@@ -1,16 +1,14 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
3
|
AGENT_PROVIDER_IDS,
|
|
4
|
-
formatEnabledAgentProviderList,
|
|
5
4
|
getConfigPath,
|
|
6
5
|
getProjectConfigPath,
|
|
7
6
|
isAgentProviderId,
|
|
8
|
-
isEnabledAgentProviderId,
|
|
9
7
|
parseConfigText,
|
|
10
8
|
readConfig,
|
|
11
9
|
readConfigWithOrigins,
|
|
12
10
|
serializeConfig
|
|
13
|
-
} from "./chunk-
|
|
11
|
+
} from "./chunk-5BWUMAOX.js";
|
|
14
12
|
|
|
15
13
|
// src/commands/config.ts
|
|
16
14
|
import { mkdir, readFile, rename, writeFile } from "fs/promises";
|
|
@@ -44,10 +42,8 @@ function setConfigValue(config, key, rawValue) {
|
|
|
44
42
|
};
|
|
45
43
|
}
|
|
46
44
|
if (key === "agent.default") {
|
|
47
|
-
if (rawValue === null || !isAgentProviderId(rawValue)
|
|
48
|
-
throw new Error(
|
|
49
|
-
`agent.default must be one of: ${formatEnabledAgentProviderList()}`
|
|
50
|
-
);
|
|
45
|
+
if (rawValue === null || !isAgentProviderId(rawValue)) {
|
|
46
|
+
throw new Error("agent.default must be one of: claude, codex, cursor");
|
|
51
47
|
}
|
|
52
48
|
return {
|
|
53
49
|
...config,
|
|
@@ -283,4 +279,4 @@ export {
|
|
|
283
279
|
runConfigSet,
|
|
284
280
|
runConfigUnset
|
|
285
281
|
};
|
|
286
|
-
//# sourceMappingURL=chunk-
|
|
282
|
+
//# sourceMappingURL=chunk-KZXWPG4P.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/commands/config.ts","../src/commands/config-keys.ts"],"sourcesContent":["import { mkdir, readFile, rename, writeFile } from \"node:fs/promises\";\nimport { dirname } from \"node:path\";\n\nimport {\n CONFIG_KEYS,\n configEntries,\n formatConfigValue,\n getConfigValue,\n parseConfigKey,\n setConfigValue,\n type ConfigKey,\n} from \"./config-keys.js\";\nimport {\n getConfigPath,\n getProjectConfigPath,\n parseConfigText,\n readConfig,\n readConfigWithOrigins,\n serializeConfig,\n} from \"../update/config.js\";\n\nexport interface ConfigResult {\n stdout: string;\n stderr: string;\n exitCode: number;\n}\n\nexport async function runConfigList(opts: {\n json?: boolean;\n showOrigin?: boolean;\n} = {}): Promise<ConfigResult> {\n const { config, origins } = await readConfigWithOrigins({ cwd: process.cwd() });\n const rows = configEntries(config).map((entry) => ({\n ...entry,\n origin: origins[entry.key] ?? \"default\",\n }));\n if (opts.json === true) {\n return ok(`${JSON.stringify(rows, null, 2)}\\n`);\n }\n const lines = rows.map((row) => {\n const value = formatConfigValue(row.value);\n return opts.showOrigin === true\n ? `${row.key.padEnd(20)} ${value.padEnd(24)} ${row.origin}`\n : `${row.key.padEnd(20)} ${value}`;\n });\n return ok(`${lines.join(\"\\n\")}\\n`);\n}\n\nexport async function runConfigGet(opts: {\n key: string;\n json?: boolean;\n showOrigin?: boolean;\n}): Promise<ConfigResult> {\n const key = parseConfigKey(opts.key);\n if (key === null) return unknownKey(opts.key);\n const { config, origins } = await readConfigWithOrigins({ cwd: process.cwd() });\n const value = getConfigValue(config, key);\n const origin = origins[key] ?? \"default\";\n if (opts.json === true) {\n return ok(`${JSON.stringify({ key, value, origin }, null, 2)}\\n`);\n }\n const rendered = formatConfigValue(value);\n return ok(\n opts.showOrigin === true\n ? `${key}=${rendered} (${origin})\\n`\n : `${rendered}\\n`,\n );\n}\n\nexport async function runConfigSet(opts: {\n key: string;\n value?: string;\n project?: boolean;\n}): Promise<ConfigResult> {\n const key = parseConfigKey(opts.key);\n if (key === null) return unknownKey(opts.key);\n if (opts.project === true && key === \"update_notifier\") {\n return {\n stdout: \"\",\n stderr: \"almanac: update_notifier is user-level only.\\n\",\n exitCode: 1,\n };\n }\n if (opts.value === undefined) {\n return {\n stdout: \"\",\n stderr: `almanac: missing value for ${key}.\\n`,\n exitCode: 1,\n };\n }\n try {\n const file = targetConfigPath(opts.project === true);\n if (file === null) {\n return {\n stdout: \"\",\n stderr: \"almanac: no .almanac/ found for project config.\\n\",\n exitCode: 1,\n };\n }\n const next = setConfigValue(await readConfig({ cwd: process.cwd() }), key, opts.value);\n const raw = ensureRawObject(await readRawConfig(file));\n setRawConfigValue(raw, key, getConfigValue(next, key));\n await writeRawConfig(raw, file);\n return ok(\n `codealmanac: set ${key}=${formatConfigValue(getConfigValue(next, key))}` +\n `${opts.project === true ? \" in project config\" : \"\"}.\\n`,\n );\n } catch (err: unknown) {\n const msg = err instanceof Error ? err.message : String(err);\n return { stdout: \"\", stderr: `almanac: ${msg}\\n`, exitCode: 1 };\n }\n}\n\nexport async function runConfigUnset(opts: {\n key: string;\n project?: boolean;\n}): Promise<ConfigResult> {\n const key = parseConfigKey(opts.key);\n if (key === null) return unknownKey(opts.key);\n if (opts.project === true && key === \"update_notifier\") {\n return {\n stdout: \"\",\n stderr: \"almanac: update_notifier is user-level only.\\n\",\n exitCode: 1,\n };\n }\n const file = targetConfigPath(opts.project === true);\n if (file === null) {\n return {\n stdout: \"\",\n stderr: \"almanac: no .almanac/ found for project config.\\n\",\n exitCode: 1,\n };\n }\n const raw = ensureRawObject(await readRawConfig(file));\n deleteRawConfigValue(raw, key);\n await writeRawConfig(raw, file);\n return ok(\n `codealmanac: unset ${key}${opts.project === true ? \" in project config\" : \"\"}.\\n`,\n );\n}\n\nfunction unknownKey(key: string): ConfigResult {\n return {\n stdout: \"\",\n stderr:\n `almanac: unknown config key '${key}'. ` +\n `Expected one of: ${CONFIG_KEYS.join(\", \")}.\\n`,\n exitCode: 1,\n };\n}\n\nfunction ok(stdout: string): ConfigResult {\n return { stdout, stderr: \"\", exitCode: 0 };\n}\n\nfunction targetConfigPath(project: boolean): string | null {\n return project ? getProjectConfigPath(process.cwd()) : getConfigPath();\n}\n\nasync function readRawConfig(file = getConfigPath()): Promise<unknown> {\n try {\n return parseConfigText(await readFile(file, \"utf8\"), file);\n } catch {\n return null;\n }\n}\n\nasync function writeRawConfig(\n raw: Record<string, unknown>,\n file = getConfigPath(),\n): Promise<void> {\n await mkdir(dirname(file), { recursive: true });\n const tmp = `${file}.tmp`;\n await writeFile(tmp, serializeConfig(raw, file), \"utf8\");\n await rename(tmp, file);\n}\n\nfunction ensureRawObject(raw: unknown): Record<string, unknown> {\n if (raw !== null && typeof raw === \"object\" && !Array.isArray(raw)) {\n return raw as Record<string, unknown>;\n }\n return {};\n}\n\nfunction setRawConfigValue(\n raw: Record<string, unknown>,\n key: ConfigKey,\n value: string | boolean | null,\n): void {\n const parts = key.split(\".\");\n let cursor = raw;\n for (const part of parts.slice(0, -1)) {\n const next = cursor[part];\n if (next === null || typeof next !== \"object\" || Array.isArray(next)) {\n cursor[part] = {};\n }\n cursor = cursor[part] as Record<string, unknown>;\n }\n const leaf = parts[parts.length - 1];\n if (leaf !== undefined) cursor[leaf] = value;\n}\n\nfunction deleteRawConfigValue(raw: Record<string, unknown>, key: ConfigKey): void {\n const parts = key.split(\".\");\n const parents: Array<{ object: Record<string, unknown>; key: string }> = [];\n let cursor: unknown = raw;\n for (const part of parts.slice(0, -1)) {\n if (cursor === null || typeof cursor !== \"object\" || Array.isArray(cursor)) {\n return;\n }\n const object = cursor as Record<string, unknown>;\n parents.push({ object, key: part });\n cursor = object[part];\n }\n if (cursor === null || typeof cursor !== \"object\" || Array.isArray(cursor)) {\n return;\n }\n const leaf = parts[parts.length - 1];\n if (leaf === undefined) return;\n delete (cursor as Record<string, unknown>)[leaf];\n\n for (let i = parents.length - 1; i >= 0; i--) {\n const parent = parents[i];\n if (parent === undefined) continue;\n const value = parent.object[parent.key];\n if (\n value !== null &&\n typeof value === \"object\" &&\n !Array.isArray(value) &&\n Object.keys(value).length === 0\n ) {\n delete parent.object[parent.key];\n }\n }\n}\n","import {\n AGENT_PROVIDER_IDS,\n formatEnabledAgentProviderList,\n isAgentProviderId,\n isEnabledAgentProviderId,\n type AgentProviderId,\n type GlobalConfig,\n} from \"../update/config.js\";\n\nexport type ConfigKey =\n | \"update_notifier\"\n | \"agent.default\"\n | `agent.models.${AgentProviderId}`;\n\nexport interface ConfigEntry {\n key: ConfigKey;\n value: string | boolean | null;\n}\n\nexport const CONFIG_KEYS: ConfigKey[] = [\n \"update_notifier\",\n \"agent.default\",\n ...AGENT_PROVIDER_IDS.map((id) => `agent.models.${id}` as const),\n];\n\nexport function parseConfigKey(raw: string): ConfigKey | null {\n if (raw === \"update_notifier\" || raw === \"agent.default\") return raw;\n const prefix = \"agent.models.\";\n if (!raw.startsWith(prefix)) return null;\n const provider = raw.slice(prefix.length);\n if (!isAgentProviderId(provider)) return null;\n return `agent.models.${provider}`;\n}\n\nexport function getConfigValue(\n config: GlobalConfig,\n key: ConfigKey,\n): string | boolean | null {\n if (key === \"update_notifier\") return config.update_notifier;\n if (key === \"agent.default\") return config.agent.default;\n const provider = providerFromModelKey(key);\n return config.agent.models[provider] ?? null;\n}\n\nexport function setConfigValue(\n config: GlobalConfig,\n key: ConfigKey,\n rawValue: string | null,\n): GlobalConfig {\n if (key === \"update_notifier\") {\n return {\n ...config,\n update_notifier: parseBoolean(rawValue),\n };\n }\n if (key === \"agent.default\") {\n if (\n rawValue === null ||\n !isAgentProviderId(rawValue) ||\n !isEnabledAgentProviderId(rawValue)\n ) {\n throw new Error(\n `agent.default must be one of: ${formatEnabledAgentProviderList()}`,\n );\n }\n return {\n ...config,\n agent: {\n ...config.agent,\n default: rawValue,\n },\n };\n }\n const provider = providerFromModelKey(key);\n const model = normalizeModel(rawValue);\n return {\n ...config,\n agent: {\n ...config.agent,\n models: {\n ...config.agent.models,\n [provider]: model,\n },\n },\n };\n}\n\nexport function configEntries(config: GlobalConfig): ConfigEntry[] {\n return CONFIG_KEYS.map((key) => ({\n key,\n value: getConfigValue(config, key),\n }));\n}\n\nexport function formatConfigValue(value: string | boolean | null): string {\n if (value === null) return \"default\";\n return String(value);\n}\n\nfunction providerFromModelKey(key: ConfigKey): AgentProviderId {\n const provider = key.slice(\"agent.models.\".length);\n if (!isAgentProviderId(provider)) {\n throw new Error(`not a model key: ${key}`);\n }\n return provider;\n}\n\nfunction parseBoolean(value: string | null): boolean {\n if (value === \"true\") return true;\n if (value === \"false\") return false;\n throw new Error(\"update_notifier must be true or false\");\n}\n\nfunction normalizeModel(value: string | null): string | null {\n if (value === null) return null;\n if (value === \"default\" || value === \"null\") return null;\n if (value.length === 0) {\n throw new Error(\"model must be non-empty, default, or null\");\n }\n return value;\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/commands/config.ts","../src/commands/config-keys.ts"],"sourcesContent":["import { mkdir, readFile, rename, writeFile } from \"node:fs/promises\";\nimport { dirname } from \"node:path\";\n\nimport {\n CONFIG_KEYS,\n configEntries,\n formatConfigValue,\n getConfigValue,\n parseConfigKey,\n setConfigValue,\n type ConfigKey,\n} from \"./config-keys.js\";\nimport {\n getConfigPath,\n getProjectConfigPath,\n parseConfigText,\n readConfig,\n readConfigWithOrigins,\n serializeConfig,\n} from \"../update/config.js\";\n\nexport interface ConfigResult {\n stdout: string;\n stderr: string;\n exitCode: number;\n}\n\nexport async function runConfigList(opts: {\n json?: boolean;\n showOrigin?: boolean;\n} = {}): Promise<ConfigResult> {\n const { config, origins } = await readConfigWithOrigins({ cwd: process.cwd() });\n const rows = configEntries(config).map((entry) => ({\n ...entry,\n origin: origins[entry.key] ?? \"default\",\n }));\n if (opts.json === true) {\n return ok(`${JSON.stringify(rows, null, 2)}\\n`);\n }\n const lines = rows.map((row) => {\n const value = formatConfigValue(row.value);\n return opts.showOrigin === true\n ? `${row.key.padEnd(20)} ${value.padEnd(24)} ${row.origin}`\n : `${row.key.padEnd(20)} ${value}`;\n });\n return ok(`${lines.join(\"\\n\")}\\n`);\n}\n\nexport async function runConfigGet(opts: {\n key: string;\n json?: boolean;\n showOrigin?: boolean;\n}): Promise<ConfigResult> {\n const key = parseConfigKey(opts.key);\n if (key === null) return unknownKey(opts.key);\n const { config, origins } = await readConfigWithOrigins({ cwd: process.cwd() });\n const value = getConfigValue(config, key);\n const origin = origins[key] ?? \"default\";\n if (opts.json === true) {\n return ok(`${JSON.stringify({ key, value, origin }, null, 2)}\\n`);\n }\n const rendered = formatConfigValue(value);\n return ok(\n opts.showOrigin === true\n ? `${key}=${rendered} (${origin})\\n`\n : `${rendered}\\n`,\n );\n}\n\nexport async function runConfigSet(opts: {\n key: string;\n value?: string;\n project?: boolean;\n}): Promise<ConfigResult> {\n const key = parseConfigKey(opts.key);\n if (key === null) return unknownKey(opts.key);\n if (opts.project === true && key === \"update_notifier\") {\n return {\n stdout: \"\",\n stderr: \"almanac: update_notifier is user-level only.\\n\",\n exitCode: 1,\n };\n }\n if (opts.value === undefined) {\n return {\n stdout: \"\",\n stderr: `almanac: missing value for ${key}.\\n`,\n exitCode: 1,\n };\n }\n try {\n const file = targetConfigPath(opts.project === true);\n if (file === null) {\n return {\n stdout: \"\",\n stderr: \"almanac: no .almanac/ found for project config.\\n\",\n exitCode: 1,\n };\n }\n const next = setConfigValue(await readConfig({ cwd: process.cwd() }), key, opts.value);\n const raw = ensureRawObject(await readRawConfig(file));\n setRawConfigValue(raw, key, getConfigValue(next, key));\n await writeRawConfig(raw, file);\n return ok(\n `codealmanac: set ${key}=${formatConfigValue(getConfigValue(next, key))}` +\n `${opts.project === true ? \" in project config\" : \"\"}.\\n`,\n );\n } catch (err: unknown) {\n const msg = err instanceof Error ? err.message : String(err);\n return { stdout: \"\", stderr: `almanac: ${msg}\\n`, exitCode: 1 };\n }\n}\n\nexport async function runConfigUnset(opts: {\n key: string;\n project?: boolean;\n}): Promise<ConfigResult> {\n const key = parseConfigKey(opts.key);\n if (key === null) return unknownKey(opts.key);\n if (opts.project === true && key === \"update_notifier\") {\n return {\n stdout: \"\",\n stderr: \"almanac: update_notifier is user-level only.\\n\",\n exitCode: 1,\n };\n }\n const file = targetConfigPath(opts.project === true);\n if (file === null) {\n return {\n stdout: \"\",\n stderr: \"almanac: no .almanac/ found for project config.\\n\",\n exitCode: 1,\n };\n }\n const raw = ensureRawObject(await readRawConfig(file));\n deleteRawConfigValue(raw, key);\n await writeRawConfig(raw, file);\n return ok(\n `codealmanac: unset ${key}${opts.project === true ? \" in project config\" : \"\"}.\\n`,\n );\n}\n\nfunction unknownKey(key: string): ConfigResult {\n return {\n stdout: \"\",\n stderr:\n `almanac: unknown config key '${key}'. ` +\n `Expected one of: ${CONFIG_KEYS.join(\", \")}.\\n`,\n exitCode: 1,\n };\n}\n\nfunction ok(stdout: string): ConfigResult {\n return { stdout, stderr: \"\", exitCode: 0 };\n}\n\nfunction targetConfigPath(project: boolean): string | null {\n return project ? getProjectConfigPath(process.cwd()) : getConfigPath();\n}\n\nasync function readRawConfig(file = getConfigPath()): Promise<unknown> {\n try {\n return parseConfigText(await readFile(file, \"utf8\"), file);\n } catch {\n return null;\n }\n}\n\nasync function writeRawConfig(\n raw: Record<string, unknown>,\n file = getConfigPath(),\n): Promise<void> {\n await mkdir(dirname(file), { recursive: true });\n const tmp = `${file}.tmp`;\n await writeFile(tmp, serializeConfig(raw, file), \"utf8\");\n await rename(tmp, file);\n}\n\nfunction ensureRawObject(raw: unknown): Record<string, unknown> {\n if (raw !== null && typeof raw === \"object\" && !Array.isArray(raw)) {\n return raw as Record<string, unknown>;\n }\n return {};\n}\n\nfunction setRawConfigValue(\n raw: Record<string, unknown>,\n key: ConfigKey,\n value: string | boolean | null,\n): void {\n const parts = key.split(\".\");\n let cursor = raw;\n for (const part of parts.slice(0, -1)) {\n const next = cursor[part];\n if (next === null || typeof next !== \"object\" || Array.isArray(next)) {\n cursor[part] = {};\n }\n cursor = cursor[part] as Record<string, unknown>;\n }\n const leaf = parts[parts.length - 1];\n if (leaf !== undefined) cursor[leaf] = value;\n}\n\nfunction deleteRawConfigValue(raw: Record<string, unknown>, key: ConfigKey): void {\n const parts = key.split(\".\");\n const parents: Array<{ object: Record<string, unknown>; key: string }> = [];\n let cursor: unknown = raw;\n for (const part of parts.slice(0, -1)) {\n if (cursor === null || typeof cursor !== \"object\" || Array.isArray(cursor)) {\n return;\n }\n const object = cursor as Record<string, unknown>;\n parents.push({ object, key: part });\n cursor = object[part];\n }\n if (cursor === null || typeof cursor !== \"object\" || Array.isArray(cursor)) {\n return;\n }\n const leaf = parts[parts.length - 1];\n if (leaf === undefined) return;\n delete (cursor as Record<string, unknown>)[leaf];\n\n for (let i = parents.length - 1; i >= 0; i--) {\n const parent = parents[i];\n if (parent === undefined) continue;\n const value = parent.object[parent.key];\n if (\n value !== null &&\n typeof value === \"object\" &&\n !Array.isArray(value) &&\n Object.keys(value).length === 0\n ) {\n delete parent.object[parent.key];\n }\n }\n}\n","import {\n AGENT_PROVIDER_IDS,\n isAgentProviderId,\n type AgentProviderId,\n type GlobalConfig,\n} from \"../update/config.js\";\n\nexport type ConfigKey =\n | \"update_notifier\"\n | \"agent.default\"\n | `agent.models.${AgentProviderId}`;\n\nexport interface ConfigEntry {\n key: ConfigKey;\n value: string | boolean | null;\n}\n\nexport const CONFIG_KEYS: ConfigKey[] = [\n \"update_notifier\",\n \"agent.default\",\n ...AGENT_PROVIDER_IDS.map((id) => `agent.models.${id}` as const),\n];\n\nexport function parseConfigKey(raw: string): ConfigKey | null {\n if (raw === \"update_notifier\" || raw === \"agent.default\") return raw;\n const prefix = \"agent.models.\";\n if (!raw.startsWith(prefix)) return null;\n const provider = raw.slice(prefix.length);\n if (!isAgentProviderId(provider)) return null;\n return `agent.models.${provider}`;\n}\n\nexport function getConfigValue(\n config: GlobalConfig,\n key: ConfigKey,\n): string | boolean | null {\n if (key === \"update_notifier\") return config.update_notifier;\n if (key === \"agent.default\") return config.agent.default;\n const provider = providerFromModelKey(key);\n return config.agent.models[provider] ?? null;\n}\n\nexport function setConfigValue(\n config: GlobalConfig,\n key: ConfigKey,\n rawValue: string | null,\n): GlobalConfig {\n if (key === \"update_notifier\") {\n return {\n ...config,\n update_notifier: parseBoolean(rawValue),\n };\n }\n if (key === \"agent.default\") {\n if (rawValue === null || !isAgentProviderId(rawValue)) {\n throw new Error(\"agent.default must be one of: claude, codex, cursor\");\n }\n return {\n ...config,\n agent: {\n ...config.agent,\n default: rawValue,\n },\n };\n }\n const provider = providerFromModelKey(key);\n const model = normalizeModel(rawValue);\n return {\n ...config,\n agent: {\n ...config.agent,\n models: {\n ...config.agent.models,\n [provider]: model,\n },\n },\n };\n}\n\nexport function configEntries(config: GlobalConfig): ConfigEntry[] {\n return CONFIG_KEYS.map((key) => ({\n key,\n value: getConfigValue(config, key),\n }));\n}\n\nexport function formatConfigValue(value: string | boolean | null): string {\n if (value === null) return \"default\";\n return String(value);\n}\n\nfunction providerFromModelKey(key: ConfigKey): AgentProviderId {\n const provider = key.slice(\"agent.models.\".length);\n if (!isAgentProviderId(provider)) {\n throw new Error(`not a model key: ${key}`);\n }\n return provider;\n}\n\nfunction parseBoolean(value: string | null): boolean {\n if (value === \"true\") return true;\n if (value === \"false\") return false;\n throw new Error(\"update_notifier must be true or false\");\n}\n\nfunction normalizeModel(value: string | null): string | null {\n if (value === null) return null;\n if (value === \"default\" || value === \"null\") return null;\n if (value.length === 0) {\n throw new Error(\"model must be non-empty, default, or null\");\n }\n return value;\n}\n"],"mappings":"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","names":[]}
|
|
@@ -2,15 +2,12 @@
|
|
|
2
2
|
import {
|
|
3
3
|
buildProviderSetupView,
|
|
4
4
|
parseAgentSelection
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-RALBM6HZ.js";
|
|
6
6
|
import {
|
|
7
|
-
disabledAgentProviderMessage,
|
|
8
|
-
formatEnabledAgentProviderList,
|
|
9
7
|
isAgentProviderId,
|
|
10
|
-
isEnabledAgentProviderId,
|
|
11
8
|
readConfig,
|
|
12
9
|
writeConfig
|
|
13
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-5BWUMAOX.js";
|
|
14
11
|
|
|
15
12
|
// src/commands/agents.ts
|
|
16
13
|
async function runAgentsList() {
|
|
@@ -33,8 +30,7 @@ async function runAgentsList() {
|
|
|
33
30
|
);
|
|
34
31
|
}
|
|
35
32
|
lines.push(
|
|
36
|
-
|
|
37
|
-
Use: almanac agents use <${formatEnabledAgentProviderList().replaceAll(", ", "|")}>`,
|
|
33
|
+
"\nUse: almanac agents use <claude|codex|cursor>",
|
|
38
34
|
"Set model: almanac agents model <provider> <model>"
|
|
39
35
|
);
|
|
40
36
|
return { stdout: `${lines.join("\n")}
|
|
@@ -76,15 +72,12 @@ async function setDefaultAgent(opts) {
|
|
|
76
72
|
if (parsed.provider === null) {
|
|
77
73
|
return {
|
|
78
74
|
stdout: "",
|
|
79
|
-
stderr: `almanac: unknown agent '${opts.provider}'. Expected one of:
|
|
75
|
+
stderr: `almanac: unknown agent '${opts.provider}'. Expected one of: claude, codex, cursor.
|
|
80
76
|
`,
|
|
81
77
|
exitCode: 1
|
|
82
78
|
};
|
|
83
79
|
}
|
|
84
80
|
const provider = parsed.provider;
|
|
85
|
-
if (!isEnabledAgentProviderId(provider)) {
|
|
86
|
-
return disabledProviderResult(provider);
|
|
87
|
-
}
|
|
88
81
|
const config = await readConfig();
|
|
89
82
|
const next = {
|
|
90
83
|
...config,
|
|
@@ -123,14 +116,11 @@ async function setProviderModel(opts) {
|
|
|
123
116
|
if (!isAgentProviderId(opts.provider)) {
|
|
124
117
|
return {
|
|
125
118
|
stdout: "",
|
|
126
|
-
stderr: `almanac: unknown agent '${opts.provider}'. Expected one of:
|
|
119
|
+
stderr: `almanac: unknown agent '${opts.provider}'. Expected one of: claude, codex, cursor.
|
|
127
120
|
`,
|
|
128
121
|
exitCode: 1
|
|
129
122
|
};
|
|
130
123
|
}
|
|
131
|
-
if (!isEnabledAgentProviderId(opts.provider)) {
|
|
132
|
-
return disabledProviderResult(opts.provider);
|
|
133
|
-
}
|
|
134
124
|
if (opts.defaultModel !== true && (opts.model === void 0 || opts.model.length === 0)) {
|
|
135
125
|
return {
|
|
136
126
|
stdout: "",
|
|
@@ -166,14 +156,6 @@ function normalizeRequestedModel(opts) {
|
|
|
166
156
|
if (opts.model === "default" || opts.model === "null") return null;
|
|
167
157
|
return opts.model;
|
|
168
158
|
}
|
|
169
|
-
function disabledProviderResult(provider) {
|
|
170
|
-
return {
|
|
171
|
-
stdout: "",
|
|
172
|
-
stderr: `almanac: ${disabledAgentProviderMessage(provider)}
|
|
173
|
-
`,
|
|
174
|
-
exitCode: 1
|
|
175
|
-
};
|
|
176
|
-
}
|
|
177
159
|
function readinessLabel(readiness) {
|
|
178
160
|
switch (readiness) {
|
|
179
161
|
case "ready":
|
|
@@ -202,4 +184,4 @@ export {
|
|
|
202
184
|
runDeprecatedSetAgentModel,
|
|
203
185
|
runAgentsModel
|
|
204
186
|
};
|
|
205
|
-
//# sourceMappingURL=chunk-
|
|
187
|
+
//# sourceMappingURL=chunk-QIA22IAM.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/commands/agents.ts"],"sourcesContent":["import {\n buildProviderSetupView,\n parseAgentSelection,\n type ProviderReadiness,\n} from \"../agent/provider-view.js\";\nimport {\n isAgentProviderId,\n readConfig,\n writeConfig,\n type AgentProviderId,\n} from \"../update/config.js\";\n\nexport interface AgentsResult {\n stdout: string;\n stderr: string;\n exitCode: number;\n}\n\nexport async function runAgentsList(): Promise<AgentsResult> {\n const view = await buildProviderSetupView();\n const lines = [\"codealmanac agents\\n\"];\n for (const choice of view.choices) {\n const selected = choice.selected ? \"*\" : \" \";\n const recommended = choice.recommended ? \"recommended\" : \"\";\n const model = choice.effectiveModel ?? \"provider default\";\n const detail = choice.account ?? choice.fixCommand ?? choice.detail;\n lines.push(\n [\n selected,\n choice.label.padEnd(6),\n readinessLabel(choice.readiness).padEnd(15),\n recommended.padEnd(11),\n `model: ${model}`.padEnd(31),\n detail,\n ].join(\" \").trimEnd(),\n );\n }\n lines.push(\n \"\\nUse: almanac agents use <claude|codex|cursor>\",\n \"Set model: almanac agents model <provider> <model>\",\n );\n return { stdout: `${lines.join(\"\\n\")}\\n`, stderr: \"\", exitCode: 0 };\n}\n\nexport async function runAgentsDoctor(): Promise<AgentsResult> {\n const view = await buildProviderSetupView();\n const lines = [\"codealmanac agent doctor\\n\"];\n for (const choice of view.choices) {\n lines.push(`${choice.ready ? \"✓\" : \"✗\"} ${choice.label}`);\n lines.push(` status: ${readinessLabel(choice.readiness)}`);\n lines.push(` model: ${choice.effectiveModel ?? \"provider default\"}`);\n if (choice.account !== null) {\n lines.push(` account: ${choice.account}`);\n } else if (choice.detail.length > 0) {\n lines.push(` detail: ${choice.detail}`);\n }\n if (choice.fixCommand !== null) lines.push(` fix: ${choice.fixCommand}`);\n lines.push(\"\");\n }\n return { stdout: `${lines.join(\"\\n\").trimEnd()}\\n`, stderr: \"\", exitCode: 0 };\n}\n\nexport interface SetDefaultAgentOptions {\n provider: string;\n}\n\nexport async function runSetDefaultAgent(\n opts: SetDefaultAgentOptions,\n): Promise<AgentsResult> {\n return setDefaultAgent(opts);\n}\n\nexport async function runDeprecatedSetDefaultAgent(\n opts: SetDefaultAgentOptions,\n): Promise<AgentsResult> {\n return withDeprecation(\n await setDefaultAgent(opts),\n \"almanac set default-agent <provider>\",\n \"almanac agents use <provider>\",\n );\n}\n\nexport async function runAgentsUse(opts: SetDefaultAgentOptions): Promise<AgentsResult> {\n return setDefaultAgent(opts);\n}\n\nasync function setDefaultAgent(\n opts: SetDefaultAgentOptions,\n): Promise<AgentsResult> {\n const parsed = parseAgentSelection(opts.provider);\n if (parsed.provider === null) {\n return {\n stdout: \"\",\n stderr:\n `almanac: unknown agent '${opts.provider}'. ` +\n \"Expected one of: claude, codex, cursor.\\n\",\n exitCode: 1,\n };\n }\n const provider = parsed.provider;\n const config = await readConfig();\n const next = {\n ...config,\n agent: {\n ...config.agent,\n default: provider,\n models:\n parsed.model === undefined\n ? config.agent.models\n : {\n ...config.agent.models,\n [provider]: parsed.model,\n },\n },\n };\n await writeConfig(next);\n return {\n stdout:\n parsed.model === undefined\n ? `codealmanac: default agent set to ${provider}.\\n`\n : `codealmanac: default agent set to ${provider}; ${provider} model set to ${parsed.model}.\\n`,\n stderr: \"\",\n exitCode: 0,\n };\n}\n\nexport async function runSetAgentModel(opts: {\n provider: string;\n model?: string;\n defaultModel?: boolean;\n}): Promise<AgentsResult> {\n return setProviderModel(opts);\n}\n\nexport async function runDeprecatedSetAgentModel(opts: {\n provider: string;\n model?: string;\n defaultModel?: boolean;\n}): Promise<AgentsResult> {\n return withDeprecation(\n await setProviderModel(opts),\n \"almanac set model <provider> <model>\",\n \"almanac agents model <provider> <model>\",\n );\n}\n\nexport async function runAgentsModel(opts: {\n provider: string;\n model?: string;\n defaultModel?: boolean;\n}): Promise<AgentsResult> {\n return setProviderModel(opts);\n}\n\nasync function setProviderModel(opts: {\n provider: string;\n model?: string;\n defaultModel?: boolean;\n}): Promise<AgentsResult> {\n if (!isAgentProviderId(opts.provider)) {\n return {\n stdout: \"\",\n stderr:\n `almanac: unknown agent '${opts.provider}'. ` +\n \"Expected one of: claude, codex, cursor.\\n\",\n exitCode: 1,\n };\n }\n if (\n opts.defaultModel !== true &&\n (opts.model === undefined || opts.model.length === 0)\n ) {\n return {\n stdout: \"\",\n stderr:\n `almanac: missing model for ${opts.provider}. ` +\n \"Pass a model id or --default.\\n\",\n exitCode: 1,\n };\n }\n const provider = opts.provider as AgentProviderId;\n const config = await readConfig();\n const model = normalizeRequestedModel(opts);\n await writeConfig({\n ...config,\n agent: {\n ...config.agent,\n models: {\n ...config.agent.models,\n [provider]: model,\n },\n },\n });\n return {\n stdout:\n model === null\n ? `codealmanac: ${provider} model reset to provider default.\\n`\n : `codealmanac: ${provider} model set to ${model}.\\n`,\n stderr: \"\",\n exitCode: 0,\n };\n}\n\nfunction normalizeRequestedModel(opts: {\n provider: string;\n model?: string;\n defaultModel?: boolean;\n}): string | null {\n if (opts.defaultModel === true) return null;\n if (opts.model === undefined || opts.model.length === 0) return null;\n if (opts.model === \"default\" || opts.model === \"null\") return null;\n return opts.model;\n}\n\nfunction readinessLabel(readiness: ProviderReadiness): string {\n switch (readiness) {\n case \"ready\":\n return \"ready\";\n case \"missing\":\n return \"missing\";\n case \"not-authenticated\":\n return \"not ready\";\n }\n}\n\nfunction withDeprecation(\n result: AgentsResult,\n oldUsage: string,\n newUsage: string,\n): AgentsResult {\n return {\n ...result,\n stderr:\n `almanac: warning: \\`${oldUsage}\\` is deprecated; use \\`${newUsage}\\`.\\n` +\n result.stderr,\n };\n}\n"],"mappings":"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","names":[]}
|