codealmanac 0.2.3 → 0.2.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (58) hide show
  1. package/README.md +27 -14
  2. package/dist/agents-RVTQYE6A.js +25 -0
  3. package/dist/chunk-6BJUYZ43.js +195 -0
  4. package/dist/chunk-6BJUYZ43.js.map +1 -0
  5. package/dist/chunk-BGUID5BS.js +766 -0
  6. package/dist/chunk-BGUID5BS.js.map +1 -0
  7. package/dist/{chunk-NBVIEZZQ.js → chunk-DL5BXZCX.js} +53 -3
  8. package/dist/chunk-DL5BXZCX.js.map +1 -0
  9. package/dist/{chunk-XNTNXEWY.js → chunk-GFUB57IT.js} +243 -83
  10. package/dist/chunk-GFUB57IT.js.map +1 -0
  11. package/dist/{chunk-P3LDTCLB.js → chunk-H37GKBWI.js} +13 -1
  12. package/dist/chunk-H37GKBWI.js.map +1 -0
  13. package/dist/{chunk-QQHIVTXT.js → chunk-MRRX4UQB.js} +4 -4
  14. package/dist/{chunk-QQHIVTXT.js.map → chunk-MRRX4UQB.js.map} +1 -1
  15. package/dist/chunk-P5WGG4FJ.js +359 -0
  16. package/dist/chunk-P5WGG4FJ.js.map +1 -0
  17. package/dist/{chunk-HNVOYWC2.js → chunk-SMIK2YLU.js} +165 -76
  18. package/dist/chunk-SMIK2YLU.js.map +1 -0
  19. package/dist/{chunk-V3QOQSXI.js → chunk-TILAKDN6.js} +14 -8
  20. package/dist/chunk-TILAKDN6.js.map +1 -0
  21. package/dist/chunk-TT6ZP4GS.js +282 -0
  22. package/dist/chunk-TT6ZP4GS.js.map +1 -0
  23. package/dist/{cli-6BOB6KAN.js → cli-CL4ID7EO.js} +123 -33
  24. package/dist/cli-CL4ID7EO.js.map +1 -0
  25. package/dist/codealmanac.js +1 -1
  26. package/dist/config-ML2RCR7J.js +16 -0
  27. package/dist/doctor-DOLJRGS4.js +17 -0
  28. package/dist/{register-commands-IXYE5CNZ.js → register-commands-FBJ6XQ3L.js} +296 -398
  29. package/dist/register-commands-FBJ6XQ3L.js.map +1 -0
  30. package/dist/uninstall-DX6LFKMX.js +15 -0
  31. package/dist/{update-RAF7QRYF.js → update-P2IPG7RO.js} +3 -3
  32. package/guides/mini.md +4 -4
  33. package/guides/reference.md +75 -16
  34. package/package.json +1 -1
  35. package/dist/agents-RVYQ44DB.js +0 -16
  36. package/dist/auth-S5DVUIUJ.js +0 -18
  37. package/dist/chunk-HNVOYWC2.js.map +0 -1
  38. package/dist/chunk-NBVIEZZQ.js.map +0 -1
  39. package/dist/chunk-P3LDTCLB.js.map +0 -1
  40. package/dist/chunk-PIYJQE4Z.js +0 -102
  41. package/dist/chunk-PIYJQE4Z.js.map +0 -1
  42. package/dist/chunk-SSYMRT4I.js +0 -126
  43. package/dist/chunk-SSYMRT4I.js.map +0 -1
  44. package/dist/chunk-TWM7I2LU.js +0 -116
  45. package/dist/chunk-TWM7I2LU.js.map +0 -1
  46. package/dist/chunk-V3QOQSXI.js.map +0 -1
  47. package/dist/chunk-WRUSDYYE.js +0 -97
  48. package/dist/chunk-WRUSDYYE.js.map +0 -1
  49. package/dist/chunk-XNTNXEWY.js.map +0 -1
  50. package/dist/cli-6BOB6KAN.js.map +0 -1
  51. package/dist/doctor-DD7EQGCA.js +0 -18
  52. package/dist/register-commands-IXYE5CNZ.js.map +0 -1
  53. package/dist/uninstall-OBV4Z3JE.js +0 -16
  54. /package/dist/{agents-RVYQ44DB.js.map → agents-RVTQYE6A.js.map} +0 -0
  55. /package/dist/{auth-S5DVUIUJ.js.map → config-ML2RCR7J.js.map} +0 -0
  56. /package/dist/{doctor-DD7EQGCA.js.map → doctor-DOLJRGS4.js.map} +0 -0
  57. /package/dist/{uninstall-OBV4Z3JE.js.map → uninstall-DX6LFKMX.js.map} +0 -0
  58. /package/dist/{update-RAF7QRYF.js.map → update-P2IPG7RO.js.map} +0 -0
@@ -0,0 +1,282 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ AGENT_PROVIDER_IDS,
4
+ getConfigPath,
5
+ getProjectConfigPath,
6
+ isAgentProviderId,
7
+ parseConfigText,
8
+ readConfig,
9
+ readConfigWithOrigins,
10
+ serializeConfig
11
+ } from "./chunk-P5WGG4FJ.js";
12
+
13
+ // src/commands/config.ts
14
+ import { mkdir, readFile, rename, writeFile } from "fs/promises";
15
+ import { dirname } from "path";
16
+
17
+ // src/commands/config-keys.ts
18
+ var CONFIG_KEYS = [
19
+ "update_notifier",
20
+ "agent.default",
21
+ ...AGENT_PROVIDER_IDS.map((id) => `agent.models.${id}`)
22
+ ];
23
+ function parseConfigKey(raw) {
24
+ if (raw === "update_notifier" || raw === "agent.default") return raw;
25
+ const prefix = "agent.models.";
26
+ if (!raw.startsWith(prefix)) return null;
27
+ const provider = raw.slice(prefix.length);
28
+ if (!isAgentProviderId(provider)) return null;
29
+ return `agent.models.${provider}`;
30
+ }
31
+ function getConfigValue(config, key) {
32
+ if (key === "update_notifier") return config.update_notifier;
33
+ if (key === "agent.default") return config.agent.default;
34
+ const provider = providerFromModelKey(key);
35
+ return config.agent.models[provider] ?? null;
36
+ }
37
+ function setConfigValue(config, key, rawValue) {
38
+ if (key === "update_notifier") {
39
+ return {
40
+ ...config,
41
+ update_notifier: parseBoolean(rawValue)
42
+ };
43
+ }
44
+ if (key === "agent.default") {
45
+ if (rawValue === null || !isAgentProviderId(rawValue)) {
46
+ throw new Error("agent.default must be one of: claude, codex, cursor");
47
+ }
48
+ return {
49
+ ...config,
50
+ agent: {
51
+ ...config.agent,
52
+ default: rawValue
53
+ }
54
+ };
55
+ }
56
+ const provider = providerFromModelKey(key);
57
+ const model = normalizeModel(rawValue);
58
+ return {
59
+ ...config,
60
+ agent: {
61
+ ...config.agent,
62
+ models: {
63
+ ...config.agent.models,
64
+ [provider]: model
65
+ }
66
+ }
67
+ };
68
+ }
69
+ function configEntries(config) {
70
+ return CONFIG_KEYS.map((key) => ({
71
+ key,
72
+ value: getConfigValue(config, key)
73
+ }));
74
+ }
75
+ function formatConfigValue(value) {
76
+ if (value === null) return "default";
77
+ return String(value);
78
+ }
79
+ function providerFromModelKey(key) {
80
+ const provider = key.slice("agent.models.".length);
81
+ if (!isAgentProviderId(provider)) {
82
+ throw new Error(`not a model key: ${key}`);
83
+ }
84
+ return provider;
85
+ }
86
+ function parseBoolean(value) {
87
+ if (value === "true") return true;
88
+ if (value === "false") return false;
89
+ throw new Error("update_notifier must be true or false");
90
+ }
91
+ function normalizeModel(value) {
92
+ if (value === null) return null;
93
+ if (value === "default" || value === "null") return null;
94
+ if (value.length === 0) {
95
+ throw new Error("model must be non-empty, default, or null");
96
+ }
97
+ return value;
98
+ }
99
+
100
+ // src/commands/config.ts
101
+ async function runConfigList(opts = {}) {
102
+ const { config, origins } = await readConfigWithOrigins({ cwd: process.cwd() });
103
+ const rows = configEntries(config).map((entry) => ({
104
+ ...entry,
105
+ origin: origins[entry.key] ?? "default"
106
+ }));
107
+ if (opts.json === true) {
108
+ return ok(`${JSON.stringify(rows, null, 2)}
109
+ `);
110
+ }
111
+ const lines = rows.map((row) => {
112
+ const value = formatConfigValue(row.value);
113
+ return opts.showOrigin === true ? `${row.key.padEnd(20)} ${value.padEnd(24)} ${row.origin}` : `${row.key.padEnd(20)} ${value}`;
114
+ });
115
+ return ok(`${lines.join("\n")}
116
+ `);
117
+ }
118
+ async function runConfigGet(opts) {
119
+ const key = parseConfigKey(opts.key);
120
+ if (key === null) return unknownKey(opts.key);
121
+ const { config, origins } = await readConfigWithOrigins({ cwd: process.cwd() });
122
+ const value = getConfigValue(config, key);
123
+ const origin = origins[key] ?? "default";
124
+ if (opts.json === true) {
125
+ return ok(`${JSON.stringify({ key, value, origin }, null, 2)}
126
+ `);
127
+ }
128
+ const rendered = formatConfigValue(value);
129
+ return ok(
130
+ opts.showOrigin === true ? `${key}=${rendered} (${origin})
131
+ ` : `${rendered}
132
+ `
133
+ );
134
+ }
135
+ async function runConfigSet(opts) {
136
+ const key = parseConfigKey(opts.key);
137
+ if (key === null) return unknownKey(opts.key);
138
+ if (opts.project === true && key === "update_notifier") {
139
+ return {
140
+ stdout: "",
141
+ stderr: "almanac: update_notifier is user-level only.\n",
142
+ exitCode: 1
143
+ };
144
+ }
145
+ if (opts.value === void 0) {
146
+ return {
147
+ stdout: "",
148
+ stderr: `almanac: missing value for ${key}.
149
+ `,
150
+ exitCode: 1
151
+ };
152
+ }
153
+ try {
154
+ const file = targetConfigPath(opts.project === true);
155
+ if (file === null) {
156
+ return {
157
+ stdout: "",
158
+ stderr: "almanac: no .almanac/ found for project config.\n",
159
+ exitCode: 1
160
+ };
161
+ }
162
+ const next = setConfigValue(await readConfig({ cwd: process.cwd() }), key, opts.value);
163
+ const raw = ensureRawObject(await readRawConfig(file));
164
+ setRawConfigValue(raw, key, getConfigValue(next, key));
165
+ await writeRawConfig(raw, file);
166
+ return ok(
167
+ `codealmanac: set ${key}=${formatConfigValue(getConfigValue(next, key))}${opts.project === true ? " in project config" : ""}.
168
+ `
169
+ );
170
+ } catch (err) {
171
+ const msg = err instanceof Error ? err.message : String(err);
172
+ return { stdout: "", stderr: `almanac: ${msg}
173
+ `, exitCode: 1 };
174
+ }
175
+ }
176
+ async function runConfigUnset(opts) {
177
+ const key = parseConfigKey(opts.key);
178
+ if (key === null) return unknownKey(opts.key);
179
+ if (opts.project === true && key === "update_notifier") {
180
+ return {
181
+ stdout: "",
182
+ stderr: "almanac: update_notifier is user-level only.\n",
183
+ exitCode: 1
184
+ };
185
+ }
186
+ const file = targetConfigPath(opts.project === true);
187
+ if (file === null) {
188
+ return {
189
+ stdout: "",
190
+ stderr: "almanac: no .almanac/ found for project config.\n",
191
+ exitCode: 1
192
+ };
193
+ }
194
+ const raw = ensureRawObject(await readRawConfig(file));
195
+ deleteRawConfigValue(raw, key);
196
+ await writeRawConfig(raw, file);
197
+ return ok(
198
+ `codealmanac: unset ${key}${opts.project === true ? " in project config" : ""}.
199
+ `
200
+ );
201
+ }
202
+ function unknownKey(key) {
203
+ return {
204
+ stdout: "",
205
+ stderr: `almanac: unknown config key '${key}'. Expected one of: ${CONFIG_KEYS.join(", ")}.
206
+ `,
207
+ exitCode: 1
208
+ };
209
+ }
210
+ function ok(stdout) {
211
+ return { stdout, stderr: "", exitCode: 0 };
212
+ }
213
+ function targetConfigPath(project) {
214
+ return project ? getProjectConfigPath(process.cwd()) : getConfigPath();
215
+ }
216
+ async function readRawConfig(file = getConfigPath()) {
217
+ try {
218
+ return parseConfigText(await readFile(file, "utf8"), file);
219
+ } catch {
220
+ return null;
221
+ }
222
+ }
223
+ async function writeRawConfig(raw, file = getConfigPath()) {
224
+ await mkdir(dirname(file), { recursive: true });
225
+ const tmp = `${file}.tmp`;
226
+ await writeFile(tmp, serializeConfig(raw, file), "utf8");
227
+ await rename(tmp, file);
228
+ }
229
+ function ensureRawObject(raw) {
230
+ if (raw !== null && typeof raw === "object" && !Array.isArray(raw)) {
231
+ return raw;
232
+ }
233
+ return {};
234
+ }
235
+ function setRawConfigValue(raw, key, value) {
236
+ const parts = key.split(".");
237
+ let cursor = raw;
238
+ for (const part of parts.slice(0, -1)) {
239
+ const next = cursor[part];
240
+ if (next === null || typeof next !== "object" || Array.isArray(next)) {
241
+ cursor[part] = {};
242
+ }
243
+ cursor = cursor[part];
244
+ }
245
+ const leaf = parts[parts.length - 1];
246
+ if (leaf !== void 0) cursor[leaf] = value;
247
+ }
248
+ function deleteRawConfigValue(raw, key) {
249
+ const parts = key.split(".");
250
+ const parents = [];
251
+ let cursor = raw;
252
+ for (const part of parts.slice(0, -1)) {
253
+ if (cursor === null || typeof cursor !== "object" || Array.isArray(cursor)) {
254
+ return;
255
+ }
256
+ const object = cursor;
257
+ parents.push({ object, key: part });
258
+ cursor = object[part];
259
+ }
260
+ if (cursor === null || typeof cursor !== "object" || Array.isArray(cursor)) {
261
+ return;
262
+ }
263
+ const leaf = parts[parts.length - 1];
264
+ if (leaf === void 0) return;
265
+ delete cursor[leaf];
266
+ for (let i = parents.length - 1; i >= 0; i--) {
267
+ const parent = parents[i];
268
+ if (parent === void 0) continue;
269
+ const value = parent.object[parent.key];
270
+ if (value !== null && typeof value === "object" && !Array.isArray(value) && Object.keys(value).length === 0) {
271
+ delete parent.object[parent.key];
272
+ }
273
+ }
274
+ }
275
+
276
+ export {
277
+ runConfigList,
278
+ runConfigGet,
279
+ runConfigSet,
280
+ runConfigUnset
281
+ };
282
+ //# sourceMappingURL=chunk-TT6ZP4GS.js.map
@@ -0,0 +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 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":[]}
@@ -1,11 +1,11 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  emit
4
- } from "./chunk-P3LDTCLB.js";
4
+ } from "./chunk-H37GKBWI.js";
5
5
  import {
6
6
  runInternalUpdateCheck,
7
7
  scheduleBackgroundUpdateCheck
8
- } from "./chunk-V3QOQSXI.js";
8
+ } from "./chunk-TILAKDN6.js";
9
9
  import {
10
10
  BLUE,
11
11
  BOLD,
@@ -14,17 +14,18 @@ import {
14
14
  } from "./chunk-FM3VRDK7.js";
15
15
  import {
16
16
  runSetup
17
- } from "./chunk-XNTNXEWY.js";
17
+ } from "./chunk-GFUB57IT.js";
18
18
  import "./chunk-447U3GQJ.js";
19
- import "./chunk-TWM7I2LU.js";
20
- import "./chunk-SSYMRT4I.js";
19
+ import "./chunk-BGUID5BS.js";
21
20
  import {
22
21
  getStatePath,
23
22
  isNewer
24
23
  } from "./chunk-F53U6JQG.js";
25
24
  import {
26
- getConfigPath
27
- } from "./chunk-WRUSDYYE.js";
25
+ getConfigPath,
26
+ getLegacyConfigPath,
27
+ parseConfigText
28
+ } from "./chunk-P5WGG4FJ.js";
28
29
  import "./chunk-7JUX4ADQ.js";
29
30
 
30
31
  // src/cli.ts
@@ -44,11 +45,15 @@ var HELP_GROUPS = [
44
45
  },
45
46
  {
46
47
  title: "Wiki lifecycle",
47
- commands: ["bootstrap", "capture", "ps", "hook", "reindex"]
48
+ commands: ["bootstrap", "capture", "hook", "reindex"]
48
49
  },
49
50
  {
50
51
  title: "Setup",
51
- commands: ["setup", "uninstall", "doctor", "update"]
52
+ commands: ["agents", "config", "setup", "uninstall", "doctor", "update"]
53
+ },
54
+ {
55
+ title: "Deprecated",
56
+ commands: ["set", "ps"]
52
57
  }
53
58
  ];
54
59
  function configureGroupedHelp(program) {
@@ -365,20 +370,27 @@ function readStateSync(path2) {
365
370
  }
366
371
  }
367
372
  function shouldNotify(configPath) {
373
+ const loaded = readConfigSync(configPath);
374
+ if (loaded === null) {
375
+ const legacy = configPath.endsWith(".toml") ? readConfigSync(getLegacyConfigPath()) : null;
376
+ if (legacy === null) return true;
377
+ return legacy.update_notifier !== false;
378
+ }
379
+ return loaded.update_notifier !== false;
380
+ }
381
+ function readConfigSync(configPath) {
368
382
  let raw;
369
383
  try {
370
384
  raw = readFileSync(configPath, "utf8");
371
385
  } catch {
372
- return true;
386
+ return null;
373
387
  }
374
388
  const trimmed = raw.trim();
375
- if (trimmed.length === 0) return true;
389
+ if (trimmed.length === 0) return null;
376
390
  try {
377
- const parsed = JSON.parse(trimmed);
378
- if (parsed.update_notifier === false) return false;
379
- return true;
391
+ return parseConfigText(trimmed, configPath);
380
392
  } catch {
381
- return true;
393
+ return null;
382
394
  }
383
395
  }
384
396
  function readInstalledVersion() {
@@ -449,7 +461,7 @@ async function run(argv, deps = {}) {
449
461
  if (await tryRunSqliteFreeCommand(argv.slice(2), runSetupFn)) {
450
462
  return;
451
463
  }
452
- const { registerCommands } = await import("./register-commands-IXYE5CNZ.js");
464
+ const { registerCommands } = await import("./register-commands-FBJ6XQ3L.js");
453
465
  registerCommands(program);
454
466
  configureGroupedHelp(program);
455
467
  await program.parseAsync(argv);
@@ -462,13 +474,8 @@ function isRootVersionInvocation(args) {
462
474
  return args.length === 1 && (args[0] === "--version" || args[0] === "-v");
463
475
  }
464
476
  function parseSetupFlags(args) {
465
- const agentIdx = args.indexOf("--agent");
466
- return {
467
- yes: args.includes("--yes") || args.includes("-y"),
468
- agent: agentIdx === -1 ? void 0 : args[agentIdx + 1],
469
- skipHook: args.includes("--skip-hook"),
470
- skipGuides: args.includes("--skip-guides")
471
- };
477
+ const options = parseSetupShortcutFlags(args);
478
+ return options === null ? { ok: false, error: "invalid setup option value" } : { ok: true, options };
472
479
  }
473
480
  function parseUpdateFlags(args) {
474
481
  return {
@@ -497,7 +504,13 @@ async function tryRunSqliteFreeCommand(args, runSetupFn) {
497
504
  const [command, subcommand] = args;
498
505
  if (command === void 0) return false;
499
506
  if (command === "setup") {
500
- emit(await runSetupFn(parseSetupFlags(args.slice(1))));
507
+ const parsed = parseSetupFlags(args.slice(1));
508
+ if (parsed.ok === false) {
509
+ emit({ stdout: "", stderr: `almanac: ${parsed.error}
510
+ `, exitCode: 1 });
511
+ return true;
512
+ }
513
+ emit(await runSetupFn(parsed.options));
501
514
  return true;
502
515
  }
503
516
  if (command === "hook") {
@@ -517,32 +530,97 @@ async function tryRunSqliteFreeCommand(args, runSetupFn) {
517
530
  return false;
518
531
  }
519
532
  if (command === "agents") {
520
- const { runAgentsList } = await import("./agents-RVYQ44DB.js");
533
+ const {
534
+ runAgentsDoctor,
535
+ runAgentsList,
536
+ runAgentsModel,
537
+ runAgentsUse
538
+ } = await import("./agents-RVTQYE6A.js");
521
539
  if (subcommand === "list" || subcommand === void 0) {
522
540
  emit(await runAgentsList());
523
541
  return true;
524
542
  }
543
+ if (subcommand === "doctor") {
544
+ emit(await runAgentsDoctor());
545
+ return true;
546
+ }
547
+ if (subcommand === "use") {
548
+ emit(await runAgentsUse({ provider: args[2] ?? "" }));
549
+ return true;
550
+ }
551
+ if (subcommand === "model") {
552
+ emit(await runAgentsModel({
553
+ provider: args[2] ?? "",
554
+ model: args[3] === "--default" ? void 0 : args[3],
555
+ defaultModel: args.includes("--default")
556
+ }));
557
+ return true;
558
+ }
559
+ return false;
560
+ }
561
+ if (command === "config") {
562
+ const {
563
+ runConfigGet,
564
+ runConfigList,
565
+ runConfigSet,
566
+ runConfigUnset
567
+ } = await import("./config-ML2RCR7J.js");
568
+ if (subcommand === "list" || subcommand === void 0) {
569
+ emit(await runConfigList({
570
+ json: args.includes("--json"),
571
+ showOrigin: args.includes("--show-origin")
572
+ }));
573
+ return true;
574
+ }
575
+ if (subcommand === "get") {
576
+ emit(await runConfigGet({
577
+ key: args[2] ?? "",
578
+ json: args.includes("--json"),
579
+ showOrigin: args.includes("--show-origin")
580
+ }));
581
+ return true;
582
+ }
583
+ if (subcommand === "set") {
584
+ const values = args.slice(2).filter((arg) => arg !== "--project");
585
+ emit(await runConfigSet({
586
+ key: values[0] ?? "",
587
+ value: values[1],
588
+ project: args.includes("--project")
589
+ }));
590
+ return true;
591
+ }
592
+ if (subcommand === "unset") {
593
+ const values = args.slice(2).filter((arg) => arg !== "--project");
594
+ emit(await runConfigUnset({
595
+ key: values[0] ?? "",
596
+ project: args.includes("--project")
597
+ }));
598
+ return true;
599
+ }
525
600
  return false;
526
601
  }
527
602
  if (command === "set") {
528
- const { runSetAgentModel, runSetDefaultAgent } = await import("./agents-RVYQ44DB.js");
603
+ const { runDeprecatedSetAgentModel, runDeprecatedSetDefaultAgent } = await import("./agents-RVTQYE6A.js");
529
604
  if (subcommand === "default-agent") {
530
- emit(await runSetDefaultAgent({ provider: args[2] ?? "" }));
605
+ emit(await runDeprecatedSetDefaultAgent({ provider: args[2] ?? "" }));
531
606
  return true;
532
607
  }
533
608
  if (subcommand === "model") {
534
- emit(await runSetAgentModel({ provider: args[2] ?? "", model: args[3] }));
609
+ emit(await runDeprecatedSetAgentModel({
610
+ provider: args[2] ?? "",
611
+ model: args[3]
612
+ }));
535
613
  return true;
536
614
  }
537
615
  return false;
538
616
  }
539
617
  if (command === "update") {
540
- const { runUpdate } = await import("./update-RAF7QRYF.js");
618
+ const { runUpdate } = await import("./update-P2IPG7RO.js");
541
619
  emit(await runUpdate(parseUpdateFlags(args.slice(1))));
542
620
  return true;
543
621
  }
544
622
  if (command === "doctor") {
545
- const { runDoctor } = await import("./doctor-DD7EQGCA.js");
623
+ const { runDoctor } = await import("./doctor-DOLJRGS4.js");
546
624
  emit(await runDoctor({
547
625
  cwd: process.cwd(),
548
626
  ...parseDoctorFlags(args.slice(1))
@@ -550,7 +628,7 @@ async function tryRunSqliteFreeCommand(args, runSetupFn) {
550
628
  return true;
551
629
  }
552
630
  if (command === "uninstall") {
553
- const { runUninstall } = await import("./uninstall-OBV4Z3JE.js");
631
+ const { runUninstall } = await import("./uninstall-DX6LFKMX.js");
554
632
  emit(await runUninstall(parseUninstallFlags(args.slice(1))));
555
633
  return true;
556
634
  }
@@ -577,6 +655,9 @@ function readPackageVersion2() {
577
655
  }
578
656
  function tryParseSetupShortcut(args) {
579
657
  if (args.length === 0) return {};
658
+ return parseSetupShortcutFlags(args);
659
+ }
660
+ function parseSetupShortcutFlags(args) {
580
661
  const opts = {};
581
662
  for (let i = 0; i < args.length; i++) {
582
663
  const arg = args[i];
@@ -585,7 +666,16 @@ function tryParseSetupShortcut(args) {
585
666
  continue;
586
667
  }
587
668
  if (arg === "--agent") {
588
- opts.agent = args[i + 1];
669
+ const value = args[i + 1];
670
+ if (value === void 0 || value.startsWith("-")) return null;
671
+ opts.agent = value;
672
+ i += 1;
673
+ continue;
674
+ }
675
+ if (arg === "--model") {
676
+ const value = args[i + 1];
677
+ if (value === void 0 || value.startsWith("-")) return null;
678
+ opts.model = value;
589
679
  i += 1;
590
680
  continue;
591
681
  }
@@ -605,4 +695,4 @@ export {
605
695
  run,
606
696
  tryParseSetupShortcut
607
697
  };
608
- //# sourceMappingURL=cli-6BOB6KAN.js.map
698
+ //# sourceMappingURL=cli-CL4ID7EO.js.map