@cleocode/core 2026.6.14 → 2026.6.17
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/dist/check/pr-gate.d.ts +6 -2
- package/dist/check/pr-gate.d.ts.map +1 -1
- package/dist/check/pr-gate.js +14 -32
- package/dist/check/pr-gate.js.map +1 -1
- package/dist/config/config-repair.d.ts +70 -0
- package/dist/config/config-repair.d.ts.map +1 -0
- package/dist/config/config-repair.js +248 -0
- package/dist/config/config-repair.js.map +1 -0
- package/dist/config/registry.d.ts.map +1 -1
- package/dist/config/registry.js +4 -4
- package/dist/config/registry.js.map +1 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +11 -10
- package/dist/config.js.map +1 -1
- package/dist/docs/export-document.js +58 -16
- package/dist/docs/export-document.js.map +2 -2
- package/dist/gc/cleanup.d.ts +23 -8
- package/dist/gc/cleanup.d.ts.map +1 -1
- package/dist/gc/cleanup.js +287 -22
- package/dist/gc/cleanup.js.map +1 -1
- package/dist/gc/janitor.d.ts +149 -0
- package/dist/gc/janitor.d.ts.map +1 -0
- package/dist/gc/janitor.js +760 -0
- package/dist/gc/janitor.js.map +1 -0
- package/dist/internal.d.ts +1 -0
- package/dist/internal.d.ts.map +1 -1
- package/dist/internal.js +3 -0
- package/dist/internal.js.map +1 -1
- package/dist/llm/cli-ops.d.ts +31 -4
- package/dist/llm/cli-ops.d.ts.map +1 -1
- package/dist/llm/cli-ops.js +110 -26
- package/dist/llm/cli-ops.js.map +1 -1
- package/dist/llm/credential-pool.d.ts +62 -0
- package/dist/llm/credential-pool.d.ts.map +1 -1
- package/dist/llm/credential-pool.js +161 -0
- package/dist/llm/credential-pool.js.map +1 -1
- package/dist/llm/cross-provider-selector.d.ts +254 -0
- package/dist/llm/cross-provider-selector.d.ts.map +1 -0
- package/dist/llm/cross-provider-selector.js +635 -0
- package/dist/llm/cross-provider-selector.js.map +1 -0
- package/dist/llm/index.d.ts +2 -0
- package/dist/llm/index.d.ts.map +1 -1
- package/dist/llm/index.js +1 -0
- package/dist/llm/index.js.map +1 -1
- package/dist/llm/local-model-fit.d.ts +260 -0
- package/dist/llm/local-model-fit.d.ts.map +1 -0
- package/dist/llm/local-model-fit.js +563 -0
- package/dist/llm/local-model-fit.js.map +1 -0
- package/dist/llm/plugin-facade.js +883 -231
- package/dist/llm/plugin-facade.js.map +3 -3
- package/dist/llm/provider-registry/builtin/ollama.d.ts +18 -0
- package/dist/llm/provider-registry/builtin/ollama.d.ts.map +1 -1
- package/dist/llm/provider-registry/builtin/ollama.js +20 -2
- package/dist/llm/provider-registry/builtin/ollama.js.map +1 -1
- package/dist/llm/role-resolver.d.ts.map +1 -1
- package/dist/llm/role-resolver.js +45 -10
- package/dist/llm/role-resolver.js.map +1 -1
- package/dist/llm/transports/codex-responses.d.ts +111 -88
- package/dist/llm/transports/codex-responses.d.ts.map +1 -1
- package/dist/llm/transports/codex-responses.js +456 -258
- package/dist/llm/transports/codex-responses.js.map +1 -1
- package/dist/release/index.d.ts +2 -2
- package/dist/release/index.d.ts.map +1 -1
- package/dist/release/index.js +1 -1
- package/dist/release/index.js.map +1 -1
- package/dist/release/reconcile.d.ts +97 -0
- package/dist/release/reconcile.d.ts.map +1 -1
- package/dist/release/reconcile.js +412 -5
- package/dist/release/reconcile.js.map +1 -1
- package/dist/resources/backend.d.ts +155 -0
- package/dist/resources/backend.d.ts.map +1 -0
- package/dist/resources/backend.js +23 -0
- package/dist/resources/backend.js.map +1 -0
- package/dist/resources/linux-backend.d.ts +167 -0
- package/dist/resources/linux-backend.d.ts.map +1 -0
- package/dist/resources/linux-backend.js +259 -0
- package/dist/resources/linux-backend.js.map +1 -0
- package/dist/resources/monitor.d.ts +230 -0
- package/dist/resources/monitor.d.ts.map +1 -0
- package/dist/resources/monitor.js +255 -0
- package/dist/resources/monitor.js.map +1 -0
- package/dist/resources/spawn-wrapper.d.ts +265 -0
- package/dist/resources/spawn-wrapper.d.ts.map +1 -0
- package/dist/resources/spawn-wrapper.js +304 -0
- package/dist/resources/spawn-wrapper.js.map +1 -0
- package/dist/selfimprove/budget.d.ts +11 -2
- package/dist/selfimprove/budget.d.ts.map +1 -1
- package/dist/selfimprove/budget.js +11 -2
- package/dist/selfimprove/budget.js.map +1 -1
- package/dist/selfimprove/fix-gen-context.d.ts +172 -0
- package/dist/selfimprove/fix-gen-context.d.ts.map +1 -0
- package/dist/selfimprove/fix-gen-context.js +218 -0
- package/dist/selfimprove/fix-gen-context.js.map +1 -0
- package/dist/selfimprove/fix-gen.d.ts +285 -0
- package/dist/selfimprove/fix-gen.d.ts.map +1 -0
- package/dist/selfimprove/fix-gen.js +346 -0
- package/dist/selfimprove/fix-gen.js.map +1 -0
- package/dist/selfimprove/op-source-map.d.ts +92 -0
- package/dist/selfimprove/op-source-map.d.ts.map +1 -0
- package/dist/selfimprove/op-source-map.js +187 -0
- package/dist/selfimprove/op-source-map.js.map +1 -0
- package/dist/selfimprove/probe-helper.d.ts +61 -0
- package/dist/selfimprove/probe-helper.d.ts.map +1 -0
- package/dist/selfimprove/probe-helper.js +64 -0
- package/dist/selfimprove/probe-helper.js.map +1 -0
- package/dist/selfimprove/run-loop.d.ts +44 -4
- package/dist/selfimprove/run-loop.d.ts.map +1 -1
- package/dist/selfimprove/run-loop.js +73 -6
- package/dist/selfimprove/run-loop.js.map +1 -1
- package/dist/selfimprove/scenarios/seeded-code-regression/golden.json +18 -0
- package/dist/selfimprove/scenarios/seeded-code-regression/scenario.json +12 -0
- package/dist/sentient/cross-project-hygiene.d.ts +11 -2
- package/dist/sentient/cross-project-hygiene.d.ts.map +1 -1
- package/dist/sentient/cross-project-hygiene.js +73 -10
- package/dist/sentient/cross-project-hygiene.js.map +1 -1
- package/dist/sentient/daemon.d.ts.map +1 -1
- package/dist/sentient/daemon.js +7 -2
- package/dist/sentient/daemon.js.map +1 -1
- package/dist/sentient/worktree-dispatch.d.ts.map +1 -1
- package/dist/sentient/worktree-dispatch.js +8 -1
- package/dist/sentient/worktree-dispatch.js.map +1 -1
- package/dist/setup/index.d.ts +1 -0
- package/dist/setup/index.d.ts.map +1 -1
- package/dist/setup/index.js +1 -0
- package/dist/setup/index.js.map +1 -1
- package/dist/setup/sections/models-roles.d.ts +32 -1
- package/dist/setup/sections/models-roles.d.ts.map +1 -1
- package/dist/setup/sections/models-roles.js +118 -19
- package/dist/setup/sections/models-roles.js.map +1 -1
- package/dist/setup/whoami-summary.d.ts +34 -0
- package/dist/setup/whoami-summary.d.ts.map +1 -0
- package/dist/setup/whoami-summary.js +106 -0
- package/dist/setup/whoami-summary.js.map +1 -0
- package/dist/spawn/branch-lock.d.ts.map +1 -1
- package/dist/spawn/branch-lock.js +7 -1
- package/dist/spawn/branch-lock.js.map +1 -1
- package/dist/store/attachment-repair.d.ts +110 -0
- package/dist/store/attachment-repair.d.ts.map +1 -0
- package/dist/store/attachment-repair.js +326 -0
- package/dist/store/attachment-repair.js.map +1 -0
- package/dist/store/attachment-store.d.ts.map +1 -1
- package/dist/store/attachment-store.js +24 -7
- package/dist/store/attachment-store.js.map +1 -1
- package/dist/tasks/evidence.d.ts +34 -2
- package/dist/tasks/evidence.d.ts.map +1 -1
- package/dist/tasks/evidence.js +293 -35
- package/dist/tasks/evidence.js.map +1 -1
- package/dist/verification/verify-tools.d.ts.map +1 -1
- package/dist/verification/verify-tools.js +5 -6
- package/dist/verification/verify-tools.js.map +1 -1
- package/package.json +22 -12
- package/templates/workflows/release-prepare.yml.tmpl +48 -2
package/dist/check/pr-gate.d.ts
CHANGED
|
@@ -129,10 +129,14 @@ export declare function selectPrGates(opts: Pick<RunPrGateOptions, 'full' | 'onl
|
|
|
129
129
|
};
|
|
130
130
|
/**
|
|
131
131
|
* Build the argv for a gate, wrapping heavy gates in a cgroup-capped
|
|
132
|
-
* `systemd-run --user --scope` when available
|
|
132
|
+
* `systemd-run --user --scope` (via the spawn-wrapper SSoT) when available.
|
|
133
|
+
*
|
|
134
|
+
* Delegates to {@link buildSpawnArgs} from
|
|
135
|
+
* `packages/core/src/resources/spawn-wrapper.ts` — the ONLY constructor of
|
|
136
|
+
* `systemd-run` argv for cleo children (T11993 SSoT enforcement).
|
|
133
137
|
*
|
|
134
138
|
* @param gate the gate definition
|
|
135
|
-
* @param memoryMax MemoryMax value (e.g. `16G`)
|
|
139
|
+
* @param memoryMax MemoryMax value (e.g. `16G`); passed as a resource override.
|
|
136
140
|
* @returns `{ command, args, capped }`
|
|
137
141
|
* @internal exported for unit testing
|
|
138
142
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pr-gate.d.ts","sourceRoot":"","sources":["../../src/check/pr-gate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;
|
|
1
|
+
{"version":3,"file":"pr-gate.d.ts","sourceRoot":"","sources":["../../src/check/pr-gate.ts"],"names":[],"mappings":"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"}
|
package/dist/check/pr-gate.js
CHANGED
|
@@ -27,6 +27,7 @@
|
|
|
27
27
|
*/
|
|
28
28
|
import { spawnSync } from 'node:child_process';
|
|
29
29
|
import { getProjectRoot } from '../paths.js';
|
|
30
|
+
import { buildSpawnArgs, hasSystemdRun } from '../resources/spawn-wrapper.js';
|
|
30
31
|
/**
|
|
31
32
|
* The default MemoryMax applied to heavy gates on Linux. Matches the project's
|
|
32
33
|
* standard cgroup cap for local build/test runs.
|
|
@@ -178,48 +179,29 @@ export function selectPrGates(opts) {
|
|
|
178
179
|
const skipped = tierFiltered.filter((g) => !wanted.has(g.id));
|
|
179
180
|
return { toRun, skipped };
|
|
180
181
|
}
|
|
181
|
-
/**
|
|
182
|
-
* Is `systemd-run` available on this host? Probed once and cached for the
|
|
183
|
-
* process lifetime.
|
|
184
|
-
*/
|
|
185
|
-
let systemdRunAvailable;
|
|
186
|
-
function hasSystemdRun() {
|
|
187
|
-
if (systemdRunAvailable !== undefined)
|
|
188
|
-
return systemdRunAvailable;
|
|
189
|
-
if (process.platform !== 'linux') {
|
|
190
|
-
systemdRunAvailable = false;
|
|
191
|
-
return false;
|
|
192
|
-
}
|
|
193
|
-
const probe = spawnSync('systemd-run', ['--version'], { stdio: 'ignore' });
|
|
194
|
-
systemdRunAvailable = probe.status === 0;
|
|
195
|
-
return systemdRunAvailable;
|
|
196
|
-
}
|
|
197
182
|
/**
|
|
198
183
|
* Build the argv for a gate, wrapping heavy gates in a cgroup-capped
|
|
199
|
-
* `systemd-run --user --scope` when available
|
|
184
|
+
* `systemd-run --user --scope` (via the spawn-wrapper SSoT) when available.
|
|
185
|
+
*
|
|
186
|
+
* Delegates to {@link buildSpawnArgs} from
|
|
187
|
+
* `packages/core/src/resources/spawn-wrapper.ts` — the ONLY constructor of
|
|
188
|
+
* `systemd-run` argv for cleo children (T11993 SSoT enforcement).
|
|
200
189
|
*
|
|
201
190
|
* @param gate the gate definition
|
|
202
|
-
* @param memoryMax MemoryMax value (e.g. `16G`)
|
|
191
|
+
* @param memoryMax MemoryMax value (e.g. `16G`); passed as a resource override.
|
|
203
192
|
* @returns `{ command, args, capped }`
|
|
204
193
|
* @internal exported for unit testing
|
|
205
194
|
*/
|
|
206
195
|
export function buildGateArgv(gate, memoryMax) {
|
|
207
196
|
if (gate.heavy && hasSystemdRun()) {
|
|
197
|
+
const built = buildSpawnArgs(gate.command, gate.args, {
|
|
198
|
+
scopeClass: 'test',
|
|
199
|
+
resources: { memoryMax },
|
|
200
|
+
});
|
|
208
201
|
return {
|
|
209
|
-
command:
|
|
210
|
-
args:
|
|
211
|
-
|
|
212
|
-
'--scope',
|
|
213
|
-
'--quiet',
|
|
214
|
-
'-p',
|
|
215
|
-
`MemoryMax=${memoryMax}`,
|
|
216
|
-
'-p',
|
|
217
|
-
'MemorySwapMax=0',
|
|
218
|
-
'--',
|
|
219
|
-
gate.command,
|
|
220
|
-
...gate.args,
|
|
221
|
-
],
|
|
222
|
-
capped: true,
|
|
202
|
+
command: built.command,
|
|
203
|
+
args: built.args,
|
|
204
|
+
capped: built.mode === 'systemd',
|
|
223
205
|
};
|
|
224
206
|
}
|
|
225
207
|
return { command: gate.command, args: [...gate.args], capped: false };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pr-gate.js","sourceRoot":"","sources":["../../src/check/pr-gate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"pr-gate.js","sourceRoot":"","sources":["../../src/check/pr-gate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Config file repair — crash-safe restore from backup (Amendment 1, T11997).
|
|
3
|
+
*
|
|
4
|
+
* Checks a JSON config file for parse failures. When the live file is
|
|
5
|
+
* corrupt, the routine:
|
|
6
|
+
*
|
|
7
|
+
* 1. Quarantines the corrupt file beside the target (`.corrupt-<iso>`).
|
|
8
|
+
* 2. Scans available backup snapshots for the NEWEST valid (parseable) candidate.
|
|
9
|
+
* 3. Restores the best candidate atomically (tmp-rename) only when JSON parse
|
|
10
|
+
* fails AND no active write window is detected.
|
|
11
|
+
* 4. Appends a structured audit record to `.cleo/audit/config-repair.jsonl`
|
|
12
|
+
* that the `cleo health` surface can consume.
|
|
13
|
+
*
|
|
14
|
+
* Key invariants (Amendment 1):
|
|
15
|
+
* - Never silently restore a stale backup — always quarantine first, then
|
|
16
|
+
* restore the newest valid candidate.
|
|
17
|
+
* - Restore only when `JSON.parse` fails on the live file (not merely on
|
|
18
|
+
* schema drift).
|
|
19
|
+
* - A `.tmp` survivor from a previously interrupted write (write-file-atomic
|
|
20
|
+
* pattern) takes priority over numbered backups when it is both newer and
|
|
21
|
+
* valid JSON.
|
|
22
|
+
*
|
|
23
|
+
* @task T11997
|
|
24
|
+
* @epic T11992
|
|
25
|
+
*/
|
|
26
|
+
/** Outcome of a {@link repairConfigFile} call. */
|
|
27
|
+
export type ConfigRepairOutcome = 'healthy' | 'restored-from-backup' | 'restored-from-tmp' | 'quarantined-no-candidate' | 'skipped-active-write';
|
|
28
|
+
/** Structured result of {@link repairConfigFile}. */
|
|
29
|
+
export interface ConfigRepairResult {
|
|
30
|
+
/** What happened. */
|
|
31
|
+
readonly outcome: ConfigRepairOutcome;
|
|
32
|
+
/** Absolute path to the config file that was checked/restored. */
|
|
33
|
+
readonly configPath: string;
|
|
34
|
+
/** Absolute path to the backup used for restore (when applicable). */
|
|
35
|
+
readonly restoredFrom?: string;
|
|
36
|
+
/** Absolute path to the quarantine file (when a corrupt file was renamed). */
|
|
37
|
+
readonly quarantinedTo?: string;
|
|
38
|
+
/** Human-readable detail. */
|
|
39
|
+
readonly detail: string;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Check and optionally repair a JSON config file.
|
|
43
|
+
*
|
|
44
|
+
* Safe to call on config paths that do not yet exist — returns `'healthy'`
|
|
45
|
+
* immediately when the file is absent (a missing file is not a corrupt file).
|
|
46
|
+
*
|
|
47
|
+
* @param configPath - Absolute path to the config JSON file to check.
|
|
48
|
+
* @param backupDir - Directory containing numbered `.1`, `.2`, … backups.
|
|
49
|
+
* Pass `null` to skip backup-based restore.
|
|
50
|
+
* @param cwd - Project root for audit-log path resolution.
|
|
51
|
+
* @returns Structured {@link ConfigRepairResult}.
|
|
52
|
+
*
|
|
53
|
+
* @example
|
|
54
|
+
* ```ts
|
|
55
|
+
* import { repairConfigFile } from '@cleocode/core/config/config-repair';
|
|
56
|
+
*
|
|
57
|
+
* const result = await repairConfigFile(
|
|
58
|
+
* '/home/user/.local/share/cleo/config.json',
|
|
59
|
+
* '/home/user/.local/share/cleo/backups',
|
|
60
|
+
* '/home/user/projects/myapp',
|
|
61
|
+
* );
|
|
62
|
+
* if (result.outcome === 'restored-from-backup') {
|
|
63
|
+
* console.log(`Restored from ${result.restoredFrom}`);
|
|
64
|
+
* }
|
|
65
|
+
* ```
|
|
66
|
+
*
|
|
67
|
+
* @task T11997
|
|
68
|
+
*/
|
|
69
|
+
export declare function repairConfigFile(configPath: string, backupDir: string | null, cwd: string): Promise<ConfigRepairResult>;
|
|
70
|
+
//# sourceMappingURL=config-repair.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-repair.d.ts","sourceRoot":"","sources":["../../src/config/config-repair.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAQH,kDAAkD;AAClD,MAAM,MAAM,mBAAmB,GAC3B,SAAS,GACT,sBAAsB,GACtB,mBAAmB,GACnB,0BAA0B,GAC1B,sBAAsB,CAAC;AAE3B,qDAAqD;AACrD,MAAM,WAAW,kBAAkB;IACjC,qBAAqB;IACrB,QAAQ,CAAC,OAAO,EAAE,mBAAmB,CAAC;IACtC,kEAAkE;IAClE,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,sEAAsE;IACtE,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,8EAA8E;IAC9E,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,6BAA6B;IAC7B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AA0DD;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,wBAAsB,gBAAgB,CACpC,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,GAAG,IAAI,EACxB,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,kBAAkB,CAAC,CAqJ7B"}
|
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Config file repair — crash-safe restore from backup (Amendment 1, T11997).
|
|
3
|
+
*
|
|
4
|
+
* Checks a JSON config file for parse failures. When the live file is
|
|
5
|
+
* corrupt, the routine:
|
|
6
|
+
*
|
|
7
|
+
* 1. Quarantines the corrupt file beside the target (`.corrupt-<iso>`).
|
|
8
|
+
* 2. Scans available backup snapshots for the NEWEST valid (parseable) candidate.
|
|
9
|
+
* 3. Restores the best candidate atomically (tmp-rename) only when JSON parse
|
|
10
|
+
* fails AND no active write window is detected.
|
|
11
|
+
* 4. Appends a structured audit record to `.cleo/audit/config-repair.jsonl`
|
|
12
|
+
* that the `cleo health` surface can consume.
|
|
13
|
+
*
|
|
14
|
+
* Key invariants (Amendment 1):
|
|
15
|
+
* - Never silently restore a stale backup — always quarantine first, then
|
|
16
|
+
* restore the newest valid candidate.
|
|
17
|
+
* - Restore only when `JSON.parse` fails on the live file (not merely on
|
|
18
|
+
* schema drift).
|
|
19
|
+
* - A `.tmp` survivor from a previously interrupted write (write-file-atomic
|
|
20
|
+
* pattern) takes priority over numbered backups when it is both newer and
|
|
21
|
+
* valid JSON.
|
|
22
|
+
*
|
|
23
|
+
* @task T11997
|
|
24
|
+
* @epic T11992
|
|
25
|
+
*/
|
|
26
|
+
import { existsSync } from 'node:fs';
|
|
27
|
+
import { appendFile, copyFile, mkdir, readFile, rename, stat, writeFile } from 'node:fs/promises';
|
|
28
|
+
import { basename, dirname, join } from 'node:path';
|
|
29
|
+
// ─── Constants ────────────────────────────────────────────────────────────────
|
|
30
|
+
/** Maximum age of a `.tmp` file for it to be considered a "surviving write" (1 min). */
|
|
31
|
+
const TMP_SURVIVOR_MAX_AGE_MS = 60_000;
|
|
32
|
+
/** Audit log path relative to project root. */
|
|
33
|
+
const CONFIG_REPAIR_AUDIT_FILE = '.cleo/audit/config-repair.jsonl';
|
|
34
|
+
// ─── Helpers ──────────────────────────────────────────────────────────────────
|
|
35
|
+
/** Parse JSON from a file path; returns `null` on any failure. */
|
|
36
|
+
async function tryParseJsonFile(filePath) {
|
|
37
|
+
try {
|
|
38
|
+
const raw = await readFile(filePath, 'utf-8');
|
|
39
|
+
const parsed = JSON.parse(raw);
|
|
40
|
+
if (parsed !== null && typeof parsed === 'object' && !Array.isArray(parsed)) {
|
|
41
|
+
return parsed;
|
|
42
|
+
}
|
|
43
|
+
return null;
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
return null;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Enumerate numbered backup files for `fileName` under `backupDir`,
|
|
51
|
+
* sorted NEWEST first (lowest number = most recent).
|
|
52
|
+
*/
|
|
53
|
+
async function listNumberedBackups(fileName, backupDir) {
|
|
54
|
+
if (!existsSync(backupDir))
|
|
55
|
+
return [];
|
|
56
|
+
try {
|
|
57
|
+
const { readdir } = await import('node:fs/promises');
|
|
58
|
+
const entries = await readdir(backupDir);
|
|
59
|
+
const prefix = `${fileName}.`;
|
|
60
|
+
return entries
|
|
61
|
+
.filter((e) => e.startsWith(prefix) && /^\d+$/.test(e.slice(prefix.length)))
|
|
62
|
+
.sort((a, b) => {
|
|
63
|
+
const numA = parseInt(a.slice(prefix.length), 10);
|
|
64
|
+
const numB = parseInt(b.slice(prefix.length), 10);
|
|
65
|
+
return numA - numB; // ascending number = newest first
|
|
66
|
+
})
|
|
67
|
+
.map((e) => join(backupDir, e));
|
|
68
|
+
}
|
|
69
|
+
catch {
|
|
70
|
+
return [];
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
/** Append one JSON line to the repair audit log. */
|
|
74
|
+
async function appendAuditLine(cwd, entry) {
|
|
75
|
+
const auditPath = join(cwd, CONFIG_REPAIR_AUDIT_FILE);
|
|
76
|
+
await mkdir(dirname(auditPath), { recursive: true });
|
|
77
|
+
await appendFile(auditPath, `${JSON.stringify(entry)}\n`, 'utf-8');
|
|
78
|
+
}
|
|
79
|
+
// ─── Public API ───────────────────────────────────────────────────────────────
|
|
80
|
+
/**
|
|
81
|
+
* Check and optionally repair a JSON config file.
|
|
82
|
+
*
|
|
83
|
+
* Safe to call on config paths that do not yet exist — returns `'healthy'`
|
|
84
|
+
* immediately when the file is absent (a missing file is not a corrupt file).
|
|
85
|
+
*
|
|
86
|
+
* @param configPath - Absolute path to the config JSON file to check.
|
|
87
|
+
* @param backupDir - Directory containing numbered `.1`, `.2`, … backups.
|
|
88
|
+
* Pass `null` to skip backup-based restore.
|
|
89
|
+
* @param cwd - Project root for audit-log path resolution.
|
|
90
|
+
* @returns Structured {@link ConfigRepairResult}.
|
|
91
|
+
*
|
|
92
|
+
* @example
|
|
93
|
+
* ```ts
|
|
94
|
+
* import { repairConfigFile } from '@cleocode/core/config/config-repair';
|
|
95
|
+
*
|
|
96
|
+
* const result = await repairConfigFile(
|
|
97
|
+
* '/home/user/.local/share/cleo/config.json',
|
|
98
|
+
* '/home/user/.local/share/cleo/backups',
|
|
99
|
+
* '/home/user/projects/myapp',
|
|
100
|
+
* );
|
|
101
|
+
* if (result.outcome === 'restored-from-backup') {
|
|
102
|
+
* console.log(`Restored from ${result.restoredFrom}`);
|
|
103
|
+
* }
|
|
104
|
+
* ```
|
|
105
|
+
*
|
|
106
|
+
* @task T11997
|
|
107
|
+
*/
|
|
108
|
+
export async function repairConfigFile(configPath, backupDir, cwd) {
|
|
109
|
+
// ── 1. If the file doesn't exist, nothing to do ───────────────────────────
|
|
110
|
+
if (!existsSync(configPath)) {
|
|
111
|
+
return {
|
|
112
|
+
outcome: 'healthy',
|
|
113
|
+
configPath,
|
|
114
|
+
detail: 'Config file does not exist; no repair needed',
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
// ── 2. Try parsing the live file ──────────────────────────────────────────
|
|
118
|
+
const liveData = await tryParseJsonFile(configPath);
|
|
119
|
+
if (liveData !== null) {
|
|
120
|
+
return {
|
|
121
|
+
outcome: 'healthy',
|
|
122
|
+
configPath,
|
|
123
|
+
detail: 'Config file is valid JSON; no repair needed',
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
// ── 3. Live file is corrupt — check for an active write window ───────────
|
|
127
|
+
// write-file-atomic leaves a `.tmp` file only briefly during an active write.
|
|
128
|
+
// If a `.tmp` file exists and is VERY new, we may be racing an in-progress
|
|
129
|
+
// write — wait for it to finish rather than clobbering it.
|
|
130
|
+
const tmpPath = `${configPath}.tmp`;
|
|
131
|
+
if (existsSync(tmpPath)) {
|
|
132
|
+
try {
|
|
133
|
+
const s = await stat(tmpPath);
|
|
134
|
+
const ageMs = Date.now() - s.mtimeMs;
|
|
135
|
+
if (ageMs < TMP_SURVIVOR_MAX_AGE_MS) {
|
|
136
|
+
// Active write window detected — do NOT restore yet
|
|
137
|
+
return {
|
|
138
|
+
outcome: 'skipped-active-write',
|
|
139
|
+
configPath,
|
|
140
|
+
detail: `Temp file at ${tmpPath} is ${Math.round(ageMs / 1000)}s old — possible active write; skipping repair`,
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
catch {
|
|
145
|
+
// stat failed — ignore and proceed
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
// ── 4. Quarantine the corrupt file ───────────────────────────────────────
|
|
149
|
+
const iso = new Date().toISOString().replace(/[:.]/g, '-');
|
|
150
|
+
const quarantinePath = join(dirname(configPath), `${basename(configPath)}.corrupt-${iso}`);
|
|
151
|
+
try {
|
|
152
|
+
await copyFile(configPath, quarantinePath);
|
|
153
|
+
}
|
|
154
|
+
catch {
|
|
155
|
+
// Quarantine copy failed — proceed anyway; we can still try to restore
|
|
156
|
+
}
|
|
157
|
+
// ── 5. Find the best valid candidate (tmp survivor > numbered backups) ────
|
|
158
|
+
// Check whether the `.tmp` survivor is valid (a completed-but-not-renamed write)
|
|
159
|
+
if (existsSync(tmpPath)) {
|
|
160
|
+
const tmpData = await tryParseJsonFile(tmpPath);
|
|
161
|
+
if (tmpData !== null) {
|
|
162
|
+
// Restore from surviving .tmp: rename tmp → target atomically
|
|
163
|
+
try {
|
|
164
|
+
await rename(tmpPath, configPath);
|
|
165
|
+
await appendAuditLine(cwd, {
|
|
166
|
+
ts: new Date().toISOString(),
|
|
167
|
+
event: 'config-repair:restored-from-tmp',
|
|
168
|
+
configPath,
|
|
169
|
+
restoredFrom: tmpPath,
|
|
170
|
+
quarantinedTo: quarantinePath,
|
|
171
|
+
detail: 'Corrupt config replaced by surviving .tmp file (completed-but-not-renamed write)',
|
|
172
|
+
});
|
|
173
|
+
return {
|
|
174
|
+
outcome: 'restored-from-tmp',
|
|
175
|
+
configPath,
|
|
176
|
+
restoredFrom: tmpPath,
|
|
177
|
+
quarantinedTo: quarantinePath,
|
|
178
|
+
detail: 'Config restored from surviving .tmp file',
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
catch {
|
|
182
|
+
// Rename failed — fall through to numbered backups
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
// Walk numbered backups from newest to find the first valid one
|
|
187
|
+
const backups = backupDir ? await listNumberedBackups(basename(configPath), backupDir) : [];
|
|
188
|
+
for (const backupPath of backups) {
|
|
189
|
+
const backupData = await tryParseJsonFile(backupPath);
|
|
190
|
+
if (backupData === null)
|
|
191
|
+
continue; // corrupt backup — try next
|
|
192
|
+
// Restore atomically: copy to a tmp then rename over the target
|
|
193
|
+
const restoreTmp = `${configPath}.restore-${process.pid}`;
|
|
194
|
+
try {
|
|
195
|
+
await copyFile(backupPath, restoreTmp);
|
|
196
|
+
await rename(restoreTmp, configPath);
|
|
197
|
+
await appendAuditLine(cwd, {
|
|
198
|
+
ts: new Date().toISOString(),
|
|
199
|
+
event: 'config-repair:restored-from-backup',
|
|
200
|
+
configPath,
|
|
201
|
+
restoredFrom: backupPath,
|
|
202
|
+
quarantinedTo: quarantinePath,
|
|
203
|
+
detail: `Corrupt config replaced by newest valid backup: ${basename(backupPath)}`,
|
|
204
|
+
});
|
|
205
|
+
return {
|
|
206
|
+
outcome: 'restored-from-backup',
|
|
207
|
+
configPath,
|
|
208
|
+
restoredFrom: backupPath,
|
|
209
|
+
quarantinedTo: quarantinePath,
|
|
210
|
+
detail: `Restored from backup: ${basename(backupPath)}`,
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
catch {
|
|
214
|
+
// Try next backup
|
|
215
|
+
try {
|
|
216
|
+
await import('node:fs/promises').then((m) => m.unlink(restoreTmp));
|
|
217
|
+
}
|
|
218
|
+
catch {
|
|
219
|
+
/* best-effort cleanup */
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
// ── 6. No valid candidate found — file is quarantined but not restored ────
|
|
224
|
+
await appendAuditLine(cwd, {
|
|
225
|
+
ts: new Date().toISOString(),
|
|
226
|
+
event: 'config-repair:quarantined-no-candidate',
|
|
227
|
+
configPath,
|
|
228
|
+
quarantinedTo: quarantinePath,
|
|
229
|
+
detail: 'Corrupt config quarantined; no valid backup found to restore from',
|
|
230
|
+
});
|
|
231
|
+
// Write an empty-object fallback so CLEO can start (caller may verify)
|
|
232
|
+
try {
|
|
233
|
+
const fallbackTmp = `${configPath}.fallback-${process.pid}`;
|
|
234
|
+
await writeFile(fallbackTmp, '{}\n', 'utf-8');
|
|
235
|
+
await rename(fallbackTmp, configPath);
|
|
236
|
+
}
|
|
237
|
+
catch {
|
|
238
|
+
// If even the empty-object write fails, leave the corrupt file in place
|
|
239
|
+
// and let the caller handle it
|
|
240
|
+
}
|
|
241
|
+
return {
|
|
242
|
+
outcome: 'quarantined-no-candidate',
|
|
243
|
+
configPath,
|
|
244
|
+
quarantinedTo: quarantinePath,
|
|
245
|
+
detail: 'No valid backup found; corrupt file quarantined and empty config written',
|
|
246
|
+
};
|
|
247
|
+
}
|
|
248
|
+
//# sourceMappingURL=config-repair.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-repair.js","sourceRoot":"","sources":["../../src/config/config-repair.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/config/registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/config/registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAmBH;;;;;;;;GAQG;AACH,MAAM,MAAM,YAAY,GAAG;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE,CAAC;AAEtD;;;;GAIG;AACH,MAAM,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAElD;;;;GAIG;AACH,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAErD;;;;;;;;GAQG;AACH,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,SAAS,GAAG,QAAQ,CAAC;AAE3D;;;;GAIG;AACH,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,SAAS,CAAC;AAEjD;;;;;;;GAOG;AACH,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,SAAS,GAAG,UAAU,CAAC;AAE3D;;;;GAIG;AACH,MAAM,WAAW,cAAc;IAC7B,kEAAkE;IAClE,EAAE,EAAE,OAAO,CAAC;IACZ,uDAAuD;IACvD,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED;;;;GAIG;AACH,MAAM,WAAW,WAAW;IAC1B,qCAAqC;IACrC,KAAK,EAAE,OAAO,CAAC;IACf,4DAA4D;IAC5D,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AA0GD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAsB,iBAAiB,CAAC,IAAI,EAAE;IAC5C,KAAK,EAAE,YAAY,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;CACrB,GAAG,OAAO,CAAC,YAAY,CAAC,CA2BxB;AAoBD;;;;;;;GAOG;AACH,wBAAsB,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAGtF;AAED;;;;;;;GAOG;AACH,wBAAsB,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAG5F;AAMD;;;;;;;;;GASG;AACH,wBAAsB,cAAc,CAAC,CAAC,GAAG,OAAO,EAC9C,GAAG,EAAE,MAAM,EACX,IAAI,EAAE;IAAE,KAAK,CAAC,EAAE,YAAY,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,GAClD,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC,CAIxB;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,EAAE,CAcxE;AAED;;;;GAIG;AACH,MAAM,WAAW,WAAW;IAC1B,8CAA8C;IAC9C,GAAG,EAAE,MAAM,CAAC;IACZ,sCAAsC;IACtC,KAAK,EAAE,SAAS,GAAG,QAAQ,CAAC;IAC5B,iFAAiF;IACjF,OAAO,EAAE,OAAO,CAAC;CAClB;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAsB,gBAAgB,CACpC,GAAG,EAAE,MAAM,EACX,IAAI,EAAE;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,GAC9C,OAAO,CAAC,WAAW,CAAC,CAkBtB;AAuBD;;;;;;;GAOG;AACH,wBAAsB,cAAc,CAClC,KAAK,EAAE,aAAa,EACpB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,cAAc,CAAC,CAGzB;AAgCD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,UAAU,CAAC,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAU7F"}
|
package/dist/config/registry.js
CHANGED
|
@@ -21,10 +21,11 @@
|
|
|
21
21
|
* @saga T9855
|
|
22
22
|
* @adr 076
|
|
23
23
|
*/
|
|
24
|
-
import {
|
|
25
|
-
import {
|
|
24
|
+
import { readFile } from 'node:fs/promises';
|
|
25
|
+
import { join } from 'node:path';
|
|
26
26
|
import { CLEO_CONFIG_MANIFEST, CONFIG_MANIFEST_ENTRIES, GLOBAL_CLEO_CONFIG_MANIFEST, PROJECT_CONTEXT_MANIFEST, PROJECT_INFO_MANIFEST, } from '@cleocode/contracts';
|
|
27
27
|
import { getCleoHome } from '@cleocode/paths';
|
|
28
|
+
import { atomicWriteJson } from '../store/atomic.js';
|
|
28
29
|
// ───────────────────────────────────────────────────────────────────────────
|
|
29
30
|
// Internal: path resolution + IO
|
|
30
31
|
// ───────────────────────────────────────────────────────────────────────────
|
|
@@ -286,8 +287,7 @@ export async function unsetConfigValue(key, opts) {
|
|
|
286
287
|
if (!removed) {
|
|
287
288
|
return { key, scope, removed: false };
|
|
288
289
|
}
|
|
289
|
-
await
|
|
290
|
-
await writeFile(configPath, `${JSON.stringify(existing, null, 2)}\n`, 'utf8');
|
|
290
|
+
await atomicWriteJson(configPath, existing);
|
|
291
291
|
return { key, scope, removed: true };
|
|
292
292
|
}
|
|
293
293
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/config/registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/config/registry.ts"],"names":[],"mappings":"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"}
|
package/dist/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,KAAK,EAAE,UAAU,EAAgB,aAAa,EAAE,MAAM,qBAAqB,CAAC;AA8NnF;;;;;;;GAOG;AACH,wBAAsB,UAAU,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAkClE;AAED;;;;;;;;GAQG;AACH,wBAAsB,cAAc,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAgC7F;AAED;;;;;;;;GAQG;AACH,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAQnF;AAED;;;;;;;;GAQG;AACH,wBAAsB,YAAY,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC,CAExF;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAYxD;AAED;;;;;;GAMG;AACH,wBAAsB,cAAc,CAClC,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,OAAO,EACd,GAAG,CAAC,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,GAC1B,OAAO,CAAC;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,SAAS,GAAG,QAAQ,CAAA;CAAE,CAAC,CAiBvE;AAMD,0BAA0B;AAC1B,MAAM,MAAM,gBAAgB,GAAG,QAAQ,GAAG,UAAU,GAAG,SAAS,CAAC;AAEjE,4EAA4E;AAC5E,MAAM,WAAW,gBAAgB;IAC/B,kDAAkD;IAClD,WAAW,EAAE,MAAM,CAAC;IACpB,mEAAmE;IACnE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACjC;AAED;;;;;;GAMG;AACH,eAAO,MAAM,kBAAkB,EAAE,MAAM,CAAC,gBAAgB,EAAE,gBAAgB,CAiCzE,CAAC;AAEF,mCAAmC;AACnC,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,gBAAgB,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,KAAK,EAAE,SAAS,GAAG,QAAQ,CAAC;CAC7B;AAED;;;;;;;GAOG;AACH,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,gBAAgB,EACxB,GAAG,CAAC,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,GAC1B,OAAO,CAAC,iBAAiB,CAAC,CAwB5B;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,IAAI,KAAK,CAAC;IAC7C,IAAI,EAAE,gBAAgB,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACjC,CAAC,CAQD"}
|
package/dist/config.js
CHANGED
|
@@ -8,13 +8,12 @@
|
|
|
8
8
|
* @task T067
|
|
9
9
|
*/
|
|
10
10
|
import { existsSync } from 'node:fs';
|
|
11
|
-
import { mkdir, writeFile } from 'node:fs/promises';
|
|
12
|
-
import { dirname } from 'node:path';
|
|
13
11
|
// Import from the dependency-free leaf (NOT ./llm/role-resolver.js) so this
|
|
14
12
|
// module's eager DEFAULTS read cannot enter role-resolver's circular import
|
|
15
13
|
// chain and hit a temporal-dead-zone ReferenceError. See llm/fallback-model.ts.
|
|
16
14
|
import { IMPLICIT_FALLBACK_MODEL } from './llm/fallback-model.js';
|
|
17
15
|
import { getConfigPath, getGlobalConfigPath } from './paths.js';
|
|
16
|
+
import { atomicWriteJson } from './store/atomic.js';
|
|
18
17
|
import { readJson, saveJson } from './store/json.js';
|
|
19
18
|
/** Default configuration values. */
|
|
20
19
|
const DEFAULTS = {
|
|
@@ -126,6 +125,12 @@ const DEFAULTS = {
|
|
|
126
125
|
leadRollup: {
|
|
127
126
|
mode: 'passive',
|
|
128
127
|
},
|
|
128
|
+
// T11984: daemon lifecycle — postinstall respects operator state by default.
|
|
129
|
+
// Set daemon.autoStart = false (via global config.json) for a persistent
|
|
130
|
+
// opt-out that survives npm upgrades.
|
|
131
|
+
daemon: {
|
|
132
|
+
autoStart: true,
|
|
133
|
+
},
|
|
129
134
|
};
|
|
130
135
|
/** Environment variable to config path mapping. */
|
|
131
136
|
const ENV_MAP = {
|
|
@@ -352,11 +357,9 @@ export function parseConfigValue(value) {
|
|
|
352
357
|
*/
|
|
353
358
|
export async function setConfigValue(key, value, cwd, opts) {
|
|
354
359
|
const configPath = opts?.global ? getGlobalConfigPath() : getConfigPath(cwd);
|
|
355
|
-
// Ensure file exists
|
|
360
|
+
// Ensure file exists atomically (crash-safe bootstrap, T11997)
|
|
356
361
|
if (!existsSync(configPath)) {
|
|
357
|
-
|
|
358
|
-
await mkdir(dir, { recursive: true });
|
|
359
|
-
await writeFile(configPath, '{}', 'utf-8');
|
|
362
|
+
await atomicWriteJson(configPath, {});
|
|
360
363
|
}
|
|
361
364
|
const config = (await readJson(configPath)) ?? {};
|
|
362
365
|
const parsedValue = parseConfigValue(value);
|
|
@@ -414,11 +417,9 @@ export const STRICTNESS_PRESETS = {
|
|
|
414
417
|
export async function applyStrictnessPreset(preset, cwd, opts) {
|
|
415
418
|
const definition = STRICTNESS_PRESETS[preset];
|
|
416
419
|
const configPath = opts?.global ? getGlobalConfigPath() : getConfigPath(cwd);
|
|
417
|
-
// Ensure config file exists
|
|
420
|
+
// Ensure config file exists atomically (crash-safe bootstrap, T11997)
|
|
418
421
|
if (!existsSync(configPath)) {
|
|
419
|
-
|
|
420
|
-
await mkdir(dir, { recursive: true });
|
|
421
|
-
await writeFile(configPath, '{}', 'utf-8');
|
|
422
|
+
await atomicWriteJson(configPath, {});
|
|
422
423
|
}
|
|
423
424
|
const config = (await readJson(configPath)) ?? {};
|
|
424
425
|
// Apply each preset key via dot-notation setter
|