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.
- package/README.md +27 -14
- package/dist/agents-RVTQYE6A.js +25 -0
- package/dist/chunk-6BJUYZ43.js +195 -0
- package/dist/chunk-6BJUYZ43.js.map +1 -0
- package/dist/chunk-BGUID5BS.js +766 -0
- package/dist/chunk-BGUID5BS.js.map +1 -0
- package/dist/{chunk-NBVIEZZQ.js → chunk-DL5BXZCX.js} +53 -3
- package/dist/chunk-DL5BXZCX.js.map +1 -0
- package/dist/{chunk-XNTNXEWY.js → chunk-GFUB57IT.js} +243 -83
- package/dist/chunk-GFUB57IT.js.map +1 -0
- package/dist/{chunk-P3LDTCLB.js → chunk-H37GKBWI.js} +13 -1
- package/dist/chunk-H37GKBWI.js.map +1 -0
- package/dist/{chunk-QQHIVTXT.js → chunk-MRRX4UQB.js} +4 -4
- package/dist/{chunk-QQHIVTXT.js.map → chunk-MRRX4UQB.js.map} +1 -1
- package/dist/chunk-P5WGG4FJ.js +359 -0
- package/dist/chunk-P5WGG4FJ.js.map +1 -0
- package/dist/{chunk-HNVOYWC2.js → chunk-SMIK2YLU.js} +165 -76
- package/dist/chunk-SMIK2YLU.js.map +1 -0
- package/dist/{chunk-V3QOQSXI.js → chunk-TILAKDN6.js} +14 -8
- package/dist/chunk-TILAKDN6.js.map +1 -0
- package/dist/chunk-TT6ZP4GS.js +282 -0
- package/dist/chunk-TT6ZP4GS.js.map +1 -0
- package/dist/{cli-6BOB6KAN.js → cli-CL4ID7EO.js} +123 -33
- package/dist/cli-CL4ID7EO.js.map +1 -0
- package/dist/codealmanac.js +1 -1
- package/dist/config-ML2RCR7J.js +16 -0
- package/dist/doctor-DOLJRGS4.js +17 -0
- package/dist/{register-commands-IXYE5CNZ.js → register-commands-FBJ6XQ3L.js} +296 -398
- package/dist/register-commands-FBJ6XQ3L.js.map +1 -0
- package/dist/uninstall-DX6LFKMX.js +15 -0
- package/dist/{update-RAF7QRYF.js → update-P2IPG7RO.js} +3 -3
- package/guides/mini.md +4 -4
- package/guides/reference.md +75 -16
- package/package.json +1 -1
- package/dist/agents-RVYQ44DB.js +0 -16
- package/dist/auth-S5DVUIUJ.js +0 -18
- package/dist/chunk-HNVOYWC2.js.map +0 -1
- package/dist/chunk-NBVIEZZQ.js.map +0 -1
- package/dist/chunk-P3LDTCLB.js.map +0 -1
- package/dist/chunk-PIYJQE4Z.js +0 -102
- package/dist/chunk-PIYJQE4Z.js.map +0 -1
- package/dist/chunk-SSYMRT4I.js +0 -126
- package/dist/chunk-SSYMRT4I.js.map +0 -1
- package/dist/chunk-TWM7I2LU.js +0 -116
- package/dist/chunk-TWM7I2LU.js.map +0 -1
- package/dist/chunk-V3QOQSXI.js.map +0 -1
- package/dist/chunk-WRUSDYYE.js +0 -97
- package/dist/chunk-WRUSDYYE.js.map +0 -1
- package/dist/chunk-XNTNXEWY.js.map +0 -1
- package/dist/cli-6BOB6KAN.js.map +0 -1
- package/dist/doctor-DD7EQGCA.js +0 -18
- package/dist/register-commands-IXYE5CNZ.js.map +0 -1
- package/dist/uninstall-OBV4Z3JE.js +0 -16
- /package/dist/{agents-RVYQ44DB.js.map → agents-RVTQYE6A.js.map} +0 -0
- /package/dist/{auth-S5DVUIUJ.js.map → config-ML2RCR7J.js.map} +0 -0
- /package/dist/{doctor-DD7EQGCA.js.map → doctor-DOLJRGS4.js.map} +0 -0
- /package/dist/{uninstall-OBV4Z3JE.js.map → uninstall-DX6LFKMX.js.map} +0 -0
- /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-
|
|
4
|
+
} from "./chunk-H37GKBWI.js";
|
|
5
5
|
import {
|
|
6
6
|
runInternalUpdateCheck,
|
|
7
7
|
scheduleBackgroundUpdateCheck
|
|
8
|
-
} from "./chunk-
|
|
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-
|
|
17
|
+
} from "./chunk-GFUB57IT.js";
|
|
18
18
|
import "./chunk-447U3GQJ.js";
|
|
19
|
-
import "./chunk-
|
|
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
|
-
|
|
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", "
|
|
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
|
|
386
|
+
return null;
|
|
373
387
|
}
|
|
374
388
|
const trimmed = raw.trim();
|
|
375
|
-
if (trimmed.length === 0) return
|
|
389
|
+
if (trimmed.length === 0) return null;
|
|
376
390
|
try {
|
|
377
|
-
|
|
378
|
-
if (parsed.update_notifier === false) return false;
|
|
379
|
-
return true;
|
|
391
|
+
return parseConfigText(trimmed, configPath);
|
|
380
392
|
} catch {
|
|
381
|
-
return
|
|
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-
|
|
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
|
|
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
|
-
|
|
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 {
|
|
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 {
|
|
603
|
+
const { runDeprecatedSetAgentModel, runDeprecatedSetDefaultAgent } = await import("./agents-RVTQYE6A.js");
|
|
529
604
|
if (subcommand === "default-agent") {
|
|
530
|
-
emit(await
|
|
605
|
+
emit(await runDeprecatedSetDefaultAgent({ provider: args[2] ?? "" }));
|
|
531
606
|
return true;
|
|
532
607
|
}
|
|
533
608
|
if (subcommand === "model") {
|
|
534
|
-
emit(await
|
|
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-
|
|
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-
|
|
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-
|
|
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
|
-
|
|
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-
|
|
698
|
+
//# sourceMappingURL=cli-CL4ID7EO.js.map
|