bb-cc-lite 0.1.0
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 -0
- package/README.md +62 -0
- package/assets/statusline-demo.gif +0 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +208 -0
- package/dist/cli.js.map +1 -0
- package/dist/doctor.d.ts +15 -0
- package/dist/doctor.js +116 -0
- package/dist/doctor.js.map +1 -0
- package/dist/hooks.d.ts +14 -0
- package/dist/hooks.js +127 -0
- package/dist/hooks.js.map +1 -0
- package/dist/paths.d.ts +8 -0
- package/dist/paths.js +32 -0
- package/dist/paths.js.map +1 -0
- package/dist/pricing.d.ts +14 -0
- package/dist/pricing.js +111 -0
- package/dist/pricing.js.map +1 -0
- package/dist/renderer.d.ts +2 -0
- package/dist/renderer.js +71 -0
- package/dist/renderer.js.map +1 -0
- package/dist/settings.d.ts +40 -0
- package/dist/settings.js +430 -0
- package/dist/settings.js.map +1 -0
- package/dist/signals.d.ts +6 -0
- package/dist/signals.js +245 -0
- package/dist/signals.js.map +1 -0
- package/dist/status-input.d.ts +8 -0
- package/dist/status-input.js +208 -0
- package/dist/status-input.js.map +1 -0
- package/dist/store.d.ts +12 -0
- package/dist/store.js +111 -0
- package/dist/store.js.map +1 -0
- package/dist/transcript.d.ts +6 -0
- package/dist/transcript.js +231 -0
- package/dist/transcript.js.map +1 -0
- package/dist/types.d.ts +85 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +52 -0
package/dist/settings.js
ADDED
|
@@ -0,0 +1,430 @@
|
|
|
1
|
+
import { createHash, randomUUID } from "node:crypto";
|
|
2
|
+
import { chmod, cp, mkdir, readdir, readFile, rename, rm, stat, writeFile } from "node:fs/promises";
|
|
3
|
+
import { homedir } from "node:os";
|
|
4
|
+
import { dirname, join, resolve } from "node:path";
|
|
5
|
+
import { SAFE_HOOK_EVENTS } from "./hooks.js";
|
|
6
|
+
import { appHome, backupDir, cliPath, quoteShell } from "./paths.js";
|
|
7
|
+
const PACKAGE_VERSION = "0.1.0";
|
|
8
|
+
export function resolveSettingsTarget(options = {}) {
|
|
9
|
+
const scope = options.scope || "local";
|
|
10
|
+
const projectDir = resolve(options.projectDir || process.cwd());
|
|
11
|
+
const homeDir = resolve(options.homeDir || homedir());
|
|
12
|
+
const settingsPath = scope === "user"
|
|
13
|
+
? join(homeDir, ".claude", "settings.json")
|
|
14
|
+
: scope === "project"
|
|
15
|
+
? join(projectDir, ".claude", "settings.json")
|
|
16
|
+
: join(projectDir, ".claude", "settings.local.json");
|
|
17
|
+
return { scope, settingsPath, projectDir, homeDir };
|
|
18
|
+
}
|
|
19
|
+
export async function installStatusLine(options = {}) {
|
|
20
|
+
const target = resolveSettingsTarget(options);
|
|
21
|
+
const targetRead = await readSettings(target.settingsPath);
|
|
22
|
+
const existing = targetRead.settings.statusLine;
|
|
23
|
+
const existingHooks = targetRead.settings.hooks;
|
|
24
|
+
if (existing && !isBbStatusLine(existing) && !options.replace) {
|
|
25
|
+
return {
|
|
26
|
+
status: "skipped",
|
|
27
|
+
target,
|
|
28
|
+
message: `Preserved existing statusLine in ${target.settingsPath}. Re-run with --replace to replace it.`
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
const shadowed = !existing ? await findShadowedStatusLine(target) : undefined;
|
|
32
|
+
if (shadowed && !options.replace) {
|
|
33
|
+
return {
|
|
34
|
+
status: "skipped",
|
|
35
|
+
target,
|
|
36
|
+
message: `Preserved existing ${shadowed.scope} statusLine at ${shadowed.settingsPath}. Local install would shadow it; re-run with --replace to opt in.`
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
const launchers = await ensureRuntimeLaunchers(options.cliFilePath || cliPath(), target.homeDir);
|
|
40
|
+
const statusLine = {
|
|
41
|
+
type: "command",
|
|
42
|
+
command: quoteShell(launchers.statusline),
|
|
43
|
+
padding: 0
|
|
44
|
+
};
|
|
45
|
+
if (existing && isBbStatusLine(existing)) {
|
|
46
|
+
const afterHooks = options.hooks ? mergeBbHooks(existingHooks, launchers.hook) : existingHooks;
|
|
47
|
+
const shouldWriteStatusLine = JSON.stringify(existing) !== JSON.stringify(statusLine);
|
|
48
|
+
const shouldWriteHooks = options.hooks && JSON.stringify(existingHooks) !== JSON.stringify(afterHooks);
|
|
49
|
+
if (shouldWriteStatusLine || shouldWriteHooks) {
|
|
50
|
+
const beforeRaw = targetRead.raw;
|
|
51
|
+
const beforeSettings = targetRead.settings;
|
|
52
|
+
const afterSettings = {
|
|
53
|
+
...beforeSettings,
|
|
54
|
+
statusLine,
|
|
55
|
+
...(afterHooks === undefined ? {} : { hooks: afterHooks })
|
|
56
|
+
};
|
|
57
|
+
const afterRaw = `${JSON.stringify(afterSettings, null, 2)}\n`;
|
|
58
|
+
const installId = randomUUID();
|
|
59
|
+
await writeBackup(installId, target, beforeRaw, beforeSettings.statusLine, beforeSettings.hooks, afterRaw, statusLine, afterSettings.hooks);
|
|
60
|
+
await writeFileAtomic(target.settingsPath, afterRaw, targetRead.mode);
|
|
61
|
+
return {
|
|
62
|
+
status: "updated",
|
|
63
|
+
target,
|
|
64
|
+
command: statusLine.command,
|
|
65
|
+
backupId: installId,
|
|
66
|
+
message: `bb-cc-lite statusLine is already installed in ${target.settingsPath}; ${options.hooks ? "repaired optional hooks and " : ""}refreshed runtime launcher.`
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
return {
|
|
70
|
+
status: "updated",
|
|
71
|
+
target,
|
|
72
|
+
command: statusLine.command,
|
|
73
|
+
message: `bb-cc-lite statusLine is already installed in ${target.settingsPath}; refreshed runtime launcher.`
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
const beforeRaw = targetRead.raw;
|
|
77
|
+
const beforeSettings = targetRead.settings;
|
|
78
|
+
const afterSettings = {
|
|
79
|
+
...beforeSettings,
|
|
80
|
+
statusLine,
|
|
81
|
+
...(options.hooks ? { hooks: mergeBbHooks(beforeSettings.hooks, launchers.hook) } : {})
|
|
82
|
+
};
|
|
83
|
+
const afterRaw = `${JSON.stringify(afterSettings, null, 2)}\n`;
|
|
84
|
+
const installId = randomUUID();
|
|
85
|
+
await writeBackup(installId, target, beforeRaw, beforeSettings.statusLine, beforeSettings.hooks, afterRaw, statusLine, afterSettings.hooks);
|
|
86
|
+
await writeFileAtomic(target.settingsPath, afterRaw, targetRead.mode);
|
|
87
|
+
return {
|
|
88
|
+
status: existing ? "updated" : "installed",
|
|
89
|
+
target,
|
|
90
|
+
command: statusLine.command,
|
|
91
|
+
backupId: installId,
|
|
92
|
+
message: `${existing ? "Replaced" : "Installed"} bb-cc-lite statusLine${options.hooks ? " and optional hooks" : ""} in ${target.settingsPath}.`
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
export async function uninstallStatusLine(options = {}) {
|
|
96
|
+
const target = resolveSettingsTarget(options);
|
|
97
|
+
const current = await readSettings(target.settingsPath);
|
|
98
|
+
const currentStatusLine = current.settings.statusLine;
|
|
99
|
+
const currentHasBbHooks = hasBbHooks(current.settings.hooks, target.homeDir);
|
|
100
|
+
const manifest = await latestBackupFor(target.settingsPath, target.homeDir, (candidate) => {
|
|
101
|
+
return !(candidate.before.hadStatusLine && isBbStatusLine(candidate.before.statusLine));
|
|
102
|
+
});
|
|
103
|
+
if (!currentStatusLine && !currentHasBbHooks) {
|
|
104
|
+
return {
|
|
105
|
+
status: "skipped",
|
|
106
|
+
target,
|
|
107
|
+
message: `No bb-cc-lite statusLine or hooks are configured in ${target.settingsPath}.`
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
const manifestOwned = manifest?.after.statusLine !== undefined &&
|
|
111
|
+
JSON.stringify(currentStatusLine) === JSON.stringify(manifest.after.statusLine);
|
|
112
|
+
if (currentStatusLine && !isBbStatusLine(currentStatusLine) && !currentHasBbHooks && !manifestOwned && !options.force) {
|
|
113
|
+
return {
|
|
114
|
+
status: "refused",
|
|
115
|
+
target,
|
|
116
|
+
message: `Refused to modify non-bb-cc-lite statusLine in ${target.settingsPath}.`
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
const currentRaw = current.raw;
|
|
120
|
+
if (manifest && currentRaw && sha256(currentRaw) === manifest.after.sha256) {
|
|
121
|
+
if (manifest.before.fileExisted) {
|
|
122
|
+
const beforeRaw = await readFile(join(backupDir(target.homeDir), manifest.installId, "before.settings.json"), "utf8");
|
|
123
|
+
await writeFileAtomic(target.settingsPath, beforeRaw, current.mode);
|
|
124
|
+
await markBackupUninstalled(manifest, target.homeDir);
|
|
125
|
+
return {
|
|
126
|
+
status: "restored",
|
|
127
|
+
target,
|
|
128
|
+
message: `Restored previous Claude settings from backup ${manifest.installId}.`
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
await rm(target.settingsPath, { force: true });
|
|
132
|
+
await markBackupUninstalled(manifest, target.homeDir);
|
|
133
|
+
return {
|
|
134
|
+
status: "removed",
|
|
135
|
+
target,
|
|
136
|
+
message: `Removed bb-cc-lite statusLine and deleted settings file created by install.`
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
const nextSettings = { ...current.settings };
|
|
140
|
+
if (currentStatusLine && (isBbStatusLine(currentStatusLine) || manifestOwned || options.force) && manifest?.before.hadStatusLine) {
|
|
141
|
+
nextSettings.statusLine = manifest.before.statusLine;
|
|
142
|
+
}
|
|
143
|
+
else if (!currentStatusLine || isBbStatusLine(currentStatusLine) || manifestOwned || options.force) {
|
|
144
|
+
delete nextSettings.statusLine;
|
|
145
|
+
}
|
|
146
|
+
if (currentHasBbHooks) {
|
|
147
|
+
const hooks = removeBbHooks(nextSettings.hooks, target.homeDir);
|
|
148
|
+
if (hooks === undefined) {
|
|
149
|
+
delete nextSettings.hooks;
|
|
150
|
+
}
|
|
151
|
+
else {
|
|
152
|
+
nextSettings.hooks = hooks;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
const keys = Object.keys(nextSettings);
|
|
156
|
+
if (keys.length === 0) {
|
|
157
|
+
await rm(target.settingsPath, { force: true });
|
|
158
|
+
}
|
|
159
|
+
else {
|
|
160
|
+
await writeFileAtomic(target.settingsPath, `${JSON.stringify(nextSettings, null, 2)}\n`, current.mode);
|
|
161
|
+
}
|
|
162
|
+
if (manifest) {
|
|
163
|
+
await markBackupUninstalled(manifest, target.homeDir);
|
|
164
|
+
}
|
|
165
|
+
return {
|
|
166
|
+
status: manifest?.before.hadStatusLine ? "restored" : "removed",
|
|
167
|
+
target,
|
|
168
|
+
message: manifest
|
|
169
|
+
? `Restored bb-cc-lite settings from backup ${manifest.installId} while preserving unrelated current settings.`
|
|
170
|
+
: `Removed bb-cc-lite statusLine and hooks. No backup was found, so no previous statusLine was restored.`
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
export async function readStatusLine(scope, projectDir = process.cwd(), homeDir = homedir()) {
|
|
174
|
+
const target = resolveSettingsTarget({ scope, projectDir, homeDir });
|
|
175
|
+
const read = await readSettings(target.settingsPath);
|
|
176
|
+
return read.settings.statusLine;
|
|
177
|
+
}
|
|
178
|
+
export async function readHooks(scope, projectDir = process.cwd(), homeDir = homedir()) {
|
|
179
|
+
const target = resolveSettingsTarget({ scope, projectDir, homeDir });
|
|
180
|
+
const read = await readSettings(target.settingsPath);
|
|
181
|
+
return read.settings.hooks;
|
|
182
|
+
}
|
|
183
|
+
export function isBbStatusLine(value) {
|
|
184
|
+
if (!value || typeof value !== "object") {
|
|
185
|
+
return false;
|
|
186
|
+
}
|
|
187
|
+
const command = value.command;
|
|
188
|
+
if (typeof command !== "string") {
|
|
189
|
+
return false;
|
|
190
|
+
}
|
|
191
|
+
const normalizedCommand = command.replaceAll("'", "");
|
|
192
|
+
return (/bb-cc-lite|\/bb-cc-lite\/|\\bb-cc-lite\\/u.test(command) ||
|
|
193
|
+
normalizedCommand.includes(join(appHome(), "bin", "statusline")));
|
|
194
|
+
}
|
|
195
|
+
async function ensureRuntimeLaunchers(cliFilePath, homeDir) {
|
|
196
|
+
const home = appHome(homeDir);
|
|
197
|
+
const binDir = join(home, "bin");
|
|
198
|
+
const statuslinePath = join(binDir, "statusline");
|
|
199
|
+
const hookPath = join(binDir, "hook");
|
|
200
|
+
const stableCliPath = await copyRuntime(cliFilePath, home);
|
|
201
|
+
await mkdir(binDir, { recursive: true, mode: 0o700 });
|
|
202
|
+
await writeFile(statuslinePath, `#!/bin/sh\nexec ${quoteShell(process.execPath)} ${quoteShell(stableCliPath)} statusline "$@"\n`, {
|
|
203
|
+
encoding: "utf8",
|
|
204
|
+
mode: 0o700
|
|
205
|
+
});
|
|
206
|
+
await writeFile(hookPath, `#!/bin/sh\nexec ${quoteShell(process.execPath)} ${quoteShell(stableCliPath)} hook "$@"\n`, {
|
|
207
|
+
encoding: "utf8",
|
|
208
|
+
mode: 0o700
|
|
209
|
+
});
|
|
210
|
+
await chmod(statuslinePath, 0o700);
|
|
211
|
+
await chmod(hookPath, 0o700);
|
|
212
|
+
return { statusline: statuslinePath, hook: hookPath };
|
|
213
|
+
}
|
|
214
|
+
function mergeBbHooks(existingHooks, hookPath) {
|
|
215
|
+
const result = removeBbHooks(existingHooks, undefined) ?? {};
|
|
216
|
+
for (const eventName of SAFE_HOOK_EVENTS) {
|
|
217
|
+
const entries = Array.isArray(result[eventName]) ? [...result[eventName]] : [];
|
|
218
|
+
entries.push({
|
|
219
|
+
matcher: "*",
|
|
220
|
+
hooks: [
|
|
221
|
+
{
|
|
222
|
+
type: "command",
|
|
223
|
+
command: hookPath,
|
|
224
|
+
args: ["--bb-cc-lite-hook", eventName],
|
|
225
|
+
async: true,
|
|
226
|
+
timeout: 1
|
|
227
|
+
}
|
|
228
|
+
]
|
|
229
|
+
});
|
|
230
|
+
result[eventName] = entries;
|
|
231
|
+
}
|
|
232
|
+
return result;
|
|
233
|
+
}
|
|
234
|
+
function removeBbHooks(existingHooks, homeDir) {
|
|
235
|
+
const hooks = cloneRecord(existingHooks);
|
|
236
|
+
for (const [eventName, entries] of Object.entries(hooks)) {
|
|
237
|
+
if (!Array.isArray(entries)) {
|
|
238
|
+
continue;
|
|
239
|
+
}
|
|
240
|
+
const nextEntries = entries
|
|
241
|
+
.map((entry) => removeBbHookFromEntry(entry, homeDir))
|
|
242
|
+
.filter((entry) => entry !== undefined);
|
|
243
|
+
if (nextEntries.length === 0) {
|
|
244
|
+
delete hooks[eventName];
|
|
245
|
+
}
|
|
246
|
+
else {
|
|
247
|
+
hooks[eventName] = nextEntries;
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
return Object.keys(hooks).length === 0 ? undefined : hooks;
|
|
251
|
+
}
|
|
252
|
+
export function hasBbHooks(existingHooks, homeDir) {
|
|
253
|
+
const hooks = cloneRecord(existingHooks);
|
|
254
|
+
return Object.values(hooks).some((entries) => Array.isArray(entries) && entries.some((entry) => entryHasBbHook(entry, homeDir)));
|
|
255
|
+
}
|
|
256
|
+
function removeBbHookFromEntry(entry, homeDir) {
|
|
257
|
+
if (!entry || typeof entry !== "object" || Array.isArray(entry)) {
|
|
258
|
+
return entry;
|
|
259
|
+
}
|
|
260
|
+
const record = { ...entry };
|
|
261
|
+
if (!Array.isArray(record.hooks)) {
|
|
262
|
+
return entry;
|
|
263
|
+
}
|
|
264
|
+
const nextHooks = record.hooks.filter((hook) => !isBbHookCommand(hook, homeDir));
|
|
265
|
+
if (nextHooks.length === 0) {
|
|
266
|
+
return undefined;
|
|
267
|
+
}
|
|
268
|
+
return { ...record, hooks: nextHooks };
|
|
269
|
+
}
|
|
270
|
+
function entryHasBbHook(entry, homeDir) {
|
|
271
|
+
if (!entry || typeof entry !== "object" || Array.isArray(entry)) {
|
|
272
|
+
return false;
|
|
273
|
+
}
|
|
274
|
+
const hooks = entry.hooks;
|
|
275
|
+
return Array.isArray(hooks) && hooks.some((hook) => isBbHookCommand(hook, homeDir));
|
|
276
|
+
}
|
|
277
|
+
function isBbHookCommand(value, homeDir) {
|
|
278
|
+
if (!value || typeof value !== "object" || Array.isArray(value)) {
|
|
279
|
+
return false;
|
|
280
|
+
}
|
|
281
|
+
const record = value;
|
|
282
|
+
const args = Array.isArray(record.args) ? record.args : [];
|
|
283
|
+
const command = typeof record.command === "string" ? record.command : "";
|
|
284
|
+
const normalizedCommand = command.replaceAll("'", "");
|
|
285
|
+
return (args.includes("--bb-cc-lite-hook") ||
|
|
286
|
+
/bb-cc-lite|\/bb-cc-lite\/|\\bb-cc-lite\\/u.test(command) ||
|
|
287
|
+
(homeDir !== undefined && normalizedCommand.includes(join(appHome(homeDir), "bin", "hook"))));
|
|
288
|
+
}
|
|
289
|
+
function cloneRecord(value) {
|
|
290
|
+
if (!value || typeof value !== "object" || Array.isArray(value)) {
|
|
291
|
+
return {};
|
|
292
|
+
}
|
|
293
|
+
return JSON.parse(JSON.stringify(value));
|
|
294
|
+
}
|
|
295
|
+
async function copyRuntime(cliFilePath, home) {
|
|
296
|
+
const distDir = dirname(cliFilePath);
|
|
297
|
+
const stableDistDir = join(home, "versions", PACKAGE_VERSION, "dist");
|
|
298
|
+
const stableCliPath = join(stableDistDir, "cli.js");
|
|
299
|
+
await mkdir(dirname(stableDistDir), { recursive: true, mode: 0o700 });
|
|
300
|
+
await rm(stableDistDir, { recursive: true, force: true });
|
|
301
|
+
await cp(distDir, stableDistDir, { recursive: true, force: true });
|
|
302
|
+
await chmodTree(join(home, "versions"), 0o700, 0o600);
|
|
303
|
+
await chmod(stableCliPath, 0o700);
|
|
304
|
+
return stableCliPath;
|
|
305
|
+
}
|
|
306
|
+
async function chmodTree(path, dirMode, fileMode) {
|
|
307
|
+
try {
|
|
308
|
+
const fileStat = await stat(path);
|
|
309
|
+
if (fileStat.isDirectory()) {
|
|
310
|
+
await chmod(path, dirMode);
|
|
311
|
+
const entries = await readdir(path);
|
|
312
|
+
await Promise.all(entries.map((entry) => chmodTree(join(path, entry), dirMode, fileMode)));
|
|
313
|
+
}
|
|
314
|
+
else {
|
|
315
|
+
await chmod(path, fileMode);
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
catch {
|
|
319
|
+
// Best effort. Existing umask protections still apply if chmod is unavailable.
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
async function findShadowedStatusLine(target) {
|
|
323
|
+
const scopes = target.scope === "local" ? ["project", "user"] : target.scope === "project" ? ["user"] : [];
|
|
324
|
+
for (const scope of scopes) {
|
|
325
|
+
const candidate = resolveSettingsTarget({ scope, projectDir: target.projectDir, homeDir: target.homeDir });
|
|
326
|
+
const statusLine = await readStatusLine(scope, target.projectDir, target.homeDir);
|
|
327
|
+
if (statusLine && !isBbStatusLine(statusLine)) {
|
|
328
|
+
return candidate;
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
return undefined;
|
|
332
|
+
}
|
|
333
|
+
async function readSettings(settingsPath) {
|
|
334
|
+
try {
|
|
335
|
+
const [raw, fileStat] = await Promise.all([readFile(settingsPath, "utf8"), stat(settingsPath)]);
|
|
336
|
+
const parsed = JSON.parse(raw);
|
|
337
|
+
if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed)) {
|
|
338
|
+
throw new Error(`Settings file is not a JSON object: ${settingsPath}`);
|
|
339
|
+
}
|
|
340
|
+
return { raw, settings: parsed, mode: fileStat.mode };
|
|
341
|
+
}
|
|
342
|
+
catch (error) {
|
|
343
|
+
if (isNotFound(error)) {
|
|
344
|
+
return { settings: {} };
|
|
345
|
+
}
|
|
346
|
+
throw error;
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
async function writeBackup(installId, target, beforeRaw, beforeStatusLine, beforeHooks, afterRaw, afterStatusLine, afterHooks) {
|
|
350
|
+
const dir = join(backupDir(target.homeDir), installId);
|
|
351
|
+
await mkdir(dir, { recursive: true, mode: 0o700 });
|
|
352
|
+
if (beforeRaw !== undefined) {
|
|
353
|
+
await writeFile(join(dir, "before.settings.json"), beforeRaw, { encoding: "utf8", mode: 0o600 });
|
|
354
|
+
}
|
|
355
|
+
await writeFile(join(dir, "after.settings.json"), afterRaw, { encoding: "utf8", mode: 0o600 });
|
|
356
|
+
const manifest = {
|
|
357
|
+
schema: "bb-cc-lite.install-backup.v1",
|
|
358
|
+
installId,
|
|
359
|
+
packageVersion: PACKAGE_VERSION,
|
|
360
|
+
createdAt: new Date().toISOString(),
|
|
361
|
+
scope: target.scope,
|
|
362
|
+
projectDir: target.projectDir,
|
|
363
|
+
settingsPath: target.settingsPath,
|
|
364
|
+
before: {
|
|
365
|
+
fileExisted: beforeRaw !== undefined,
|
|
366
|
+
sha256: beforeRaw === undefined ? undefined : sha256(beforeRaw),
|
|
367
|
+
hadStatusLine: beforeStatusLine !== undefined,
|
|
368
|
+
statusLine: beforeStatusLine,
|
|
369
|
+
hadHooks: beforeHooks !== undefined,
|
|
370
|
+
hooks: beforeHooks
|
|
371
|
+
},
|
|
372
|
+
after: {
|
|
373
|
+
sha256: sha256(afterRaw),
|
|
374
|
+
statusLine: afterStatusLine,
|
|
375
|
+
hooks: afterHooks
|
|
376
|
+
},
|
|
377
|
+
restoreStrategy: "raw-if-after-hash-matches-else-statusLine-only",
|
|
378
|
+
state: "active"
|
|
379
|
+
};
|
|
380
|
+
await writeFile(join(dir, "manifest.json"), `${JSON.stringify(manifest, null, 2)}\n`, {
|
|
381
|
+
encoding: "utf8",
|
|
382
|
+
mode: 0o600
|
|
383
|
+
});
|
|
384
|
+
}
|
|
385
|
+
async function latestBackupFor(settingsPath, homeDir, include = () => true) {
|
|
386
|
+
try {
|
|
387
|
+
const entries = await readdir(backupDir(homeDir), { withFileTypes: true });
|
|
388
|
+
const manifests = [];
|
|
389
|
+
for (const entry of entries) {
|
|
390
|
+
if (!entry.isDirectory()) {
|
|
391
|
+
continue;
|
|
392
|
+
}
|
|
393
|
+
try {
|
|
394
|
+
const parsed = JSON.parse(await readFile(join(backupDir(homeDir), entry.name, "manifest.json"), "utf8"));
|
|
395
|
+
if (parsed.schema === "bb-cc-lite.install-backup.v1" &&
|
|
396
|
+
parsed.settingsPath === settingsPath &&
|
|
397
|
+
parsed.state === "active" &&
|
|
398
|
+
include(parsed)) {
|
|
399
|
+
manifests.push(parsed);
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
catch {
|
|
403
|
+
// Ignore corrupt backup metadata; uninstall can still remove bb-owned statusLine.
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
return manifests.sort((a, b) => a.createdAt.localeCompare(b.createdAt)).at(-1);
|
|
407
|
+
}
|
|
408
|
+
catch {
|
|
409
|
+
return undefined;
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
async function markBackupUninstalled(manifest, homeDir) {
|
|
413
|
+
manifest.state = "uninstalled";
|
|
414
|
+
const manifestPath = join(backupDir(homeDir), manifest.installId, "manifest.json");
|
|
415
|
+
await writeFile(manifestPath, `${JSON.stringify(manifest, null, 2)}\n`, { encoding: "utf8", mode: 0o600 });
|
|
416
|
+
}
|
|
417
|
+
async function writeFileAtomic(path, data, existingMode) {
|
|
418
|
+
await mkdir(dirname(path), { recursive: true, mode: 0o700 });
|
|
419
|
+
const tempPath = `${path}.${process.pid}.${Date.now()}.tmp`;
|
|
420
|
+
await writeFile(tempPath, data, { encoding: "utf8", mode: existingMode ?? 0o600 });
|
|
421
|
+
await chmod(tempPath, existingMode ?? 0o600);
|
|
422
|
+
await rename(tempPath, path);
|
|
423
|
+
}
|
|
424
|
+
function sha256(value) {
|
|
425
|
+
return createHash("sha256").update(value).digest("hex");
|
|
426
|
+
}
|
|
427
|
+
function isNotFound(error) {
|
|
428
|
+
return typeof error === "object" && error !== null && error.code === "ENOENT";
|
|
429
|
+
}
|
|
430
|
+
//# sourceMappingURL=settings.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"settings.js","sourceRoot":"","sources":["../src/settings.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { Decision, StatusLineInput, StoredDecision, TranscriptSummary } from "./types.js";
|
|
2
|
+
export interface DecideOptions {
|
|
3
|
+
previous?: StoredDecision;
|
|
4
|
+
}
|
|
5
|
+
export declare function decide(input: StatusLineInput, transcript: TranscriptSummary, options?: DecideOptions): Decision;
|
|
6
|
+
export declare function formatCost(value: number): string;
|