@inerrata-corporation/errata 2.0.17-dev.3571 → 2.0.17-dev.3577
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/errata.mjs +320 -172
- package/package.json +1 -1
- package/resources/claude-mods/errata-minimap/.claude-plugin/plugin.json +7 -0
- package/resources/claude-mods/errata-minimap/hooks/hooks.json +1 -0
- package/resources/claude-mods/errata-minimap/hooks/minimap.ts +632 -0
- package/resources/claude-mods/errata-minimap/hooks/register.tsx +484 -0
- package/resources/claude-mods/errata-minimap/tsconfig.json +3 -0
- package/resources/claude-mods/errata-minimap/types/index.d.ts +74 -0
package/errata.mjs
CHANGED
|
@@ -960,7 +960,7 @@ function lemma(token) {
|
|
|
960
960
|
}
|
|
961
961
|
return token;
|
|
962
962
|
}
|
|
963
|
-
function tokenize(text,
|
|
963
|
+
function tokenize(text, resolve10) {
|
|
964
964
|
const matches = text.normalize("NFC").toLowerCase().match(TOKEN_RE) ?? [];
|
|
965
965
|
const out2 = /* @__PURE__ */ new Set();
|
|
966
966
|
for (const raw2 of matches) {
|
|
@@ -970,7 +970,7 @@ function tokenize(text, resolve9) {
|
|
|
970
970
|
out2.add(token);
|
|
971
971
|
continue;
|
|
972
972
|
}
|
|
973
|
-
const canonical =
|
|
973
|
+
const canonical = resolve10(token);
|
|
974
974
|
out2.add(canonical ?? lemma(token));
|
|
975
975
|
}
|
|
976
976
|
return [...out2].sort();
|
|
@@ -2302,8 +2302,8 @@ var init_regexes = __esm({
|
|
|
2302
2302
|
_emoji = `^(\\p{Extended_Pictographic}|\\p{Emoji_Component})+$`;
|
|
2303
2303
|
ipv4 = /^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$/;
|
|
2304
2304
|
ipv6 = /^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:))$/;
|
|
2305
|
-
mac = (
|
|
2306
|
-
const escapedDelim = escapeRegex(
|
|
2305
|
+
mac = (delimiter3) => {
|
|
2306
|
+
const escapedDelim = escapeRegex(delimiter3 ?? ":");
|
|
2307
2307
|
return new RegExp(`^(?:[0-9A-F]{2}${escapedDelim}){5}[0-9A-F]{2}$|^(?:[0-9a-f]{2}${escapedDelim}){5}[0-9a-f]{2}$`);
|
|
2308
2308
|
};
|
|
2309
2309
|
cidrv4 = /^((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\/([0-9]|[1-2][0-9]|3[0-2])$/;
|
|
@@ -17754,8 +17754,8 @@ ${endMarker}
|
|
|
17754
17754
|
const startM = current.match(START_RE);
|
|
17755
17755
|
const endM = current.match(END_RE);
|
|
17756
17756
|
if (!startM || !endM || startM.index === void 0 || endM.index === void 0) {
|
|
17757
|
-
const
|
|
17758
|
-
writeFileSync(filePath, `${current}${
|
|
17757
|
+
const sep6 = current.endsWith("\n") ? "" : "\n";
|
|
17758
|
+
writeFileSync(filePath, `${current}${sep6}
|
|
17759
17759
|
${blockText}`, "utf8");
|
|
17760
17760
|
return { kind: "created", newHash };
|
|
17761
17761
|
}
|
|
@@ -36918,13 +36918,13 @@ async function Module2(moduleArg = {}) {
|
|
|
36918
36918
|
}
|
|
36919
36919
|
readAsync = /* @__PURE__ */ __name(async (url2) => {
|
|
36920
36920
|
if (isFileURI(url2)) {
|
|
36921
|
-
return new Promise((
|
|
36921
|
+
return new Promise((resolve10, reject) => {
|
|
36922
36922
|
var xhr = new XMLHttpRequest();
|
|
36923
36923
|
xhr.open("GET", url2, true);
|
|
36924
36924
|
xhr.responseType = "arraybuffer";
|
|
36925
36925
|
xhr.onload = () => {
|
|
36926
36926
|
if (xhr.status == 200 || xhr.status == 0 && xhr.response) {
|
|
36927
|
-
|
|
36927
|
+
resolve10(xhr.response);
|
|
36928
36928
|
return;
|
|
36929
36929
|
}
|
|
36930
36930
|
reject(xhr.status);
|
|
@@ -37120,9 +37120,9 @@ async function Module2(moduleArg = {}) {
|
|
|
37120
37120
|
__name(receiveInstantiationResult, "receiveInstantiationResult");
|
|
37121
37121
|
var info2 = getWasmImports();
|
|
37122
37122
|
if (Module["instantiateWasm"]) {
|
|
37123
|
-
return new Promise((
|
|
37123
|
+
return new Promise((resolve10, reject) => {
|
|
37124
37124
|
Module["instantiateWasm"](info2, (mod, inst) => {
|
|
37125
|
-
|
|
37125
|
+
resolve10(receiveInstance(mod, inst));
|
|
37126
37126
|
});
|
|
37127
37127
|
});
|
|
37128
37128
|
}
|
|
@@ -38453,8 +38453,8 @@ async function Module2(moduleArg = {}) {
|
|
|
38453
38453
|
if (runtimeInitialized) {
|
|
38454
38454
|
moduleRtn = Module;
|
|
38455
38455
|
} else {
|
|
38456
|
-
moduleRtn = new Promise((
|
|
38457
|
-
readyPromiseResolve =
|
|
38456
|
+
moduleRtn = new Promise((resolve10, reject) => {
|
|
38457
|
+
readyPromiseResolve = resolve10;
|
|
38458
38458
|
readyPromiseReject = reject;
|
|
38459
38459
|
});
|
|
38460
38460
|
}
|
|
@@ -43780,7 +43780,7 @@ async function findStaleFiles(store, rootPath, workspaceId2) {
|
|
|
43780
43780
|
}
|
|
43781
43781
|
if (++scanned % SCAN_YIELD_EVERY === 0) {
|
|
43782
43782
|
check2();
|
|
43783
|
-
await new Promise((
|
|
43783
|
+
await new Promise((resolve10) => setImmediate(resolve10));
|
|
43784
43784
|
}
|
|
43785
43785
|
}
|
|
43786
43786
|
check2();
|
|
@@ -56619,9 +56619,9 @@ var require_dispatcher_base = __commonJS({
|
|
|
56619
56619
|
}
|
|
56620
56620
|
close(callback) {
|
|
56621
56621
|
if (callback === void 0) {
|
|
56622
|
-
return new Promise((
|
|
56622
|
+
return new Promise((resolve10, reject) => {
|
|
56623
56623
|
this.close((err2, data) => {
|
|
56624
|
-
return err2 ? reject(err2) :
|
|
56624
|
+
return err2 ? reject(err2) : resolve10(data);
|
|
56625
56625
|
});
|
|
56626
56626
|
});
|
|
56627
56627
|
}
|
|
@@ -56659,12 +56659,12 @@ var require_dispatcher_base = __commonJS({
|
|
|
56659
56659
|
err2 = null;
|
|
56660
56660
|
}
|
|
56661
56661
|
if (callback === void 0) {
|
|
56662
|
-
return new Promise((
|
|
56662
|
+
return new Promise((resolve10, reject) => {
|
|
56663
56663
|
this.destroy(err2, (err3, data) => {
|
|
56664
56664
|
return err3 ? (
|
|
56665
56665
|
/* istanbul ignore next: should never error */
|
|
56666
56666
|
reject(err3)
|
|
56667
|
-
) :
|
|
56667
|
+
) : resolve10(data);
|
|
56668
56668
|
});
|
|
56669
56669
|
});
|
|
56670
56670
|
}
|
|
@@ -58931,8 +58931,8 @@ var require_util2 = __commonJS({
|
|
|
58931
58931
|
function createDeferredPromise() {
|
|
58932
58932
|
let res;
|
|
58933
58933
|
let rej;
|
|
58934
|
-
const promise2 = new Promise((
|
|
58935
|
-
res =
|
|
58934
|
+
const promise2 = new Promise((resolve10, reject) => {
|
|
58935
|
+
res = resolve10;
|
|
58936
58936
|
rej = reject;
|
|
58937
58937
|
});
|
|
58938
58938
|
return { promise: promise2, resolve: res, reject: rej };
|
|
@@ -61073,12 +61073,12 @@ upgrade: ${upgrade}\r
|
|
|
61073
61073
|
cb();
|
|
61074
61074
|
}
|
|
61075
61075
|
}
|
|
61076
|
-
const waitForDrain = () => new Promise((
|
|
61076
|
+
const waitForDrain = () => new Promise((resolve10, reject) => {
|
|
61077
61077
|
assert2(callback === null);
|
|
61078
61078
|
if (socket[kError]) {
|
|
61079
61079
|
reject(socket[kError]);
|
|
61080
61080
|
} else {
|
|
61081
|
-
callback =
|
|
61081
|
+
callback = resolve10;
|
|
61082
61082
|
}
|
|
61083
61083
|
});
|
|
61084
61084
|
socket.on("close", onDrain).on("drain", onDrain);
|
|
@@ -61715,12 +61715,12 @@ var require_client_h2 = __commonJS({
|
|
|
61715
61715
|
cb();
|
|
61716
61716
|
}
|
|
61717
61717
|
}
|
|
61718
|
-
const waitForDrain = () => new Promise((
|
|
61718
|
+
const waitForDrain = () => new Promise((resolve10, reject) => {
|
|
61719
61719
|
assert2(callback === null);
|
|
61720
61720
|
if (socket[kError]) {
|
|
61721
61721
|
reject(socket[kError]);
|
|
61722
61722
|
} else {
|
|
61723
|
-
callback =
|
|
61723
|
+
callback = resolve10;
|
|
61724
61724
|
}
|
|
61725
61725
|
});
|
|
61726
61726
|
h2stream.on("close", onDrain).on("drain", onDrain);
|
|
@@ -62197,16 +62197,16 @@ var require_client = __commonJS({
|
|
|
62197
62197
|
return this[kNeedDrain] < 2;
|
|
62198
62198
|
}
|
|
62199
62199
|
async [kClose]() {
|
|
62200
|
-
return new Promise((
|
|
62200
|
+
return new Promise((resolve10) => {
|
|
62201
62201
|
if (this[kSize]) {
|
|
62202
|
-
this[kClosedResolve] =
|
|
62202
|
+
this[kClosedResolve] = resolve10;
|
|
62203
62203
|
} else {
|
|
62204
|
-
|
|
62204
|
+
resolve10(null);
|
|
62205
62205
|
}
|
|
62206
62206
|
});
|
|
62207
62207
|
}
|
|
62208
62208
|
async [kDestroy](err2) {
|
|
62209
|
-
return new Promise((
|
|
62209
|
+
return new Promise((resolve10) => {
|
|
62210
62210
|
const requests = this[kQueue].splice(this[kPendingIdx]);
|
|
62211
62211
|
for (let i2 = 0; i2 < requests.length; i2++) {
|
|
62212
62212
|
const request = requests[i2];
|
|
@@ -62217,7 +62217,7 @@ var require_client = __commonJS({
|
|
|
62217
62217
|
this[kClosedResolve]();
|
|
62218
62218
|
this[kClosedResolve] = null;
|
|
62219
62219
|
}
|
|
62220
|
-
|
|
62220
|
+
resolve10(null);
|
|
62221
62221
|
};
|
|
62222
62222
|
if (this[kHTTPContext]) {
|
|
62223
62223
|
this[kHTTPContext].destroy(err2, callback);
|
|
@@ -62268,7 +62268,7 @@ var require_client = __commonJS({
|
|
|
62268
62268
|
});
|
|
62269
62269
|
}
|
|
62270
62270
|
try {
|
|
62271
|
-
const socket = await new Promise((
|
|
62271
|
+
const socket = await new Promise((resolve10, reject) => {
|
|
62272
62272
|
client[kConnector]({
|
|
62273
62273
|
host,
|
|
62274
62274
|
hostname: hostname3,
|
|
@@ -62280,7 +62280,7 @@ var require_client = __commonJS({
|
|
|
62280
62280
|
if (err2) {
|
|
62281
62281
|
reject(err2);
|
|
62282
62282
|
} else {
|
|
62283
|
-
|
|
62283
|
+
resolve10(socket2);
|
|
62284
62284
|
}
|
|
62285
62285
|
});
|
|
62286
62286
|
});
|
|
@@ -62616,8 +62616,8 @@ var require_pool_base = __commonJS({
|
|
|
62616
62616
|
if (this[kQueue].isEmpty()) {
|
|
62617
62617
|
await Promise.all(this[kClients].map((c) => c.close()));
|
|
62618
62618
|
} else {
|
|
62619
|
-
await new Promise((
|
|
62620
|
-
this[kClosedResolve] =
|
|
62619
|
+
await new Promise((resolve10) => {
|
|
62620
|
+
this[kClosedResolve] = resolve10;
|
|
62621
62621
|
});
|
|
62622
62622
|
}
|
|
62623
62623
|
}
|
|
@@ -63832,7 +63832,7 @@ var require_readable = __commonJS({
|
|
|
63832
63832
|
if (this._readableState.closeEmitted) {
|
|
63833
63833
|
return null;
|
|
63834
63834
|
}
|
|
63835
|
-
return await new Promise((
|
|
63835
|
+
return await new Promise((resolve10, reject) => {
|
|
63836
63836
|
if (this[kContentLength] > limit) {
|
|
63837
63837
|
this.destroy(new AbortError());
|
|
63838
63838
|
}
|
|
@@ -63845,7 +63845,7 @@ var require_readable = __commonJS({
|
|
|
63845
63845
|
if (signal?.aborted) {
|
|
63846
63846
|
reject(signal.reason ?? new AbortError());
|
|
63847
63847
|
} else {
|
|
63848
|
-
|
|
63848
|
+
resolve10(null);
|
|
63849
63849
|
}
|
|
63850
63850
|
}).on("error", noop).on("data", function(chunk) {
|
|
63851
63851
|
limit -= chunk.length;
|
|
@@ -63864,7 +63864,7 @@ var require_readable = __commonJS({
|
|
|
63864
63864
|
}
|
|
63865
63865
|
async function consume(stream, type) {
|
|
63866
63866
|
assert2(!stream[kConsume]);
|
|
63867
|
-
return new Promise((
|
|
63867
|
+
return new Promise((resolve10, reject) => {
|
|
63868
63868
|
if (isUnusable(stream)) {
|
|
63869
63869
|
const rState = stream._readableState;
|
|
63870
63870
|
if (rState.destroyed && rState.closeEmitted === false) {
|
|
@@ -63881,7 +63881,7 @@ var require_readable = __commonJS({
|
|
|
63881
63881
|
stream[kConsume] = {
|
|
63882
63882
|
type,
|
|
63883
63883
|
stream,
|
|
63884
|
-
resolve:
|
|
63884
|
+
resolve: resolve10,
|
|
63885
63885
|
reject,
|
|
63886
63886
|
length: 0,
|
|
63887
63887
|
body: []
|
|
@@ -63951,18 +63951,18 @@ var require_readable = __commonJS({
|
|
|
63951
63951
|
return buffer;
|
|
63952
63952
|
}
|
|
63953
63953
|
function consumeEnd(consume2) {
|
|
63954
|
-
const { type, body: body2, resolve:
|
|
63954
|
+
const { type, body: body2, resolve: resolve10, stream, length } = consume2;
|
|
63955
63955
|
try {
|
|
63956
63956
|
if (type === "text") {
|
|
63957
|
-
|
|
63957
|
+
resolve10(chunksDecode(body2, length));
|
|
63958
63958
|
} else if (type === "json") {
|
|
63959
|
-
|
|
63959
|
+
resolve10(JSON.parse(chunksDecode(body2, length)));
|
|
63960
63960
|
} else if (type === "arrayBuffer") {
|
|
63961
|
-
|
|
63961
|
+
resolve10(chunksConcat(body2, length).buffer);
|
|
63962
63962
|
} else if (type === "blob") {
|
|
63963
|
-
|
|
63963
|
+
resolve10(new Blob(body2, { type: stream[kContentType] }));
|
|
63964
63964
|
} else if (type === "bytes") {
|
|
63965
|
-
|
|
63965
|
+
resolve10(chunksConcat(body2, length));
|
|
63966
63966
|
}
|
|
63967
63967
|
consumeFinish(consume2);
|
|
63968
63968
|
} catch (err2) {
|
|
@@ -64219,9 +64219,9 @@ var require_api_request = __commonJS({
|
|
|
64219
64219
|
};
|
|
64220
64220
|
function request(opts, callback) {
|
|
64221
64221
|
if (callback === void 0) {
|
|
64222
|
-
return new Promise((
|
|
64222
|
+
return new Promise((resolve10, reject) => {
|
|
64223
64223
|
request.call(this, opts, (err2, data) => {
|
|
64224
|
-
return err2 ? reject(err2) :
|
|
64224
|
+
return err2 ? reject(err2) : resolve10(data);
|
|
64225
64225
|
});
|
|
64226
64226
|
});
|
|
64227
64227
|
}
|
|
@@ -64444,9 +64444,9 @@ var require_api_stream = __commonJS({
|
|
|
64444
64444
|
};
|
|
64445
64445
|
function stream(opts, factory, callback) {
|
|
64446
64446
|
if (callback === void 0) {
|
|
64447
|
-
return new Promise((
|
|
64447
|
+
return new Promise((resolve10, reject) => {
|
|
64448
64448
|
stream.call(this, opts, factory, (err2, data) => {
|
|
64449
|
-
return err2 ? reject(err2) :
|
|
64449
|
+
return err2 ? reject(err2) : resolve10(data);
|
|
64450
64450
|
});
|
|
64451
64451
|
});
|
|
64452
64452
|
}
|
|
@@ -64731,9 +64731,9 @@ var require_api_upgrade = __commonJS({
|
|
|
64731
64731
|
};
|
|
64732
64732
|
function upgrade(opts, callback) {
|
|
64733
64733
|
if (callback === void 0) {
|
|
64734
|
-
return new Promise((
|
|
64734
|
+
return new Promise((resolve10, reject) => {
|
|
64735
64735
|
upgrade.call(this, opts, (err2, data) => {
|
|
64736
|
-
return err2 ? reject(err2) :
|
|
64736
|
+
return err2 ? reject(err2) : resolve10(data);
|
|
64737
64737
|
});
|
|
64738
64738
|
});
|
|
64739
64739
|
}
|
|
@@ -64825,9 +64825,9 @@ var require_api_connect = __commonJS({
|
|
|
64825
64825
|
};
|
|
64826
64826
|
function connect(opts, callback) {
|
|
64827
64827
|
if (callback === void 0) {
|
|
64828
|
-
return new Promise((
|
|
64828
|
+
return new Promise((resolve10, reject) => {
|
|
64829
64829
|
connect.call(this, opts, (err2, data) => {
|
|
64830
|
-
return err2 ? reject(err2) :
|
|
64830
|
+
return err2 ? reject(err2) : resolve10(data);
|
|
64831
64831
|
});
|
|
64832
64832
|
});
|
|
64833
64833
|
}
|
|
@@ -66296,10 +66296,10 @@ var require_headers = __commonJS({
|
|
|
66296
66296
|
const lowercaseName = isLowerCase ? name2 : name2.toLowerCase();
|
|
66297
66297
|
const exists = this[kHeadersMap].get(lowercaseName);
|
|
66298
66298
|
if (exists) {
|
|
66299
|
-
const
|
|
66299
|
+
const delimiter3 = lowercaseName === "cookie" ? "; " : ", ";
|
|
66300
66300
|
this[kHeadersMap].set(lowercaseName, {
|
|
66301
66301
|
name: exists.name,
|
|
66302
|
-
value: `${exists.value}${
|
|
66302
|
+
value: `${exists.value}${delimiter3}${value}`
|
|
66303
66303
|
});
|
|
66304
66304
|
} else {
|
|
66305
66305
|
this[kHeadersMap].set(lowercaseName, { name: name2, value });
|
|
@@ -68689,7 +68689,7 @@ var require_fetch = __commonJS({
|
|
|
68689
68689
|
function dispatch({ body: body2 }) {
|
|
68690
68690
|
const url2 = requestCurrentURL(request);
|
|
68691
68691
|
const agent = fetchParams.controller.dispatcher;
|
|
68692
|
-
return new Promise((
|
|
68692
|
+
return new Promise((resolve10, reject) => agent.dispatch(
|
|
68693
68693
|
{
|
|
68694
68694
|
path: url2.pathname + url2.search,
|
|
68695
68695
|
origin: url2.origin,
|
|
@@ -68765,7 +68765,7 @@ var require_fetch = __commonJS({
|
|
|
68765
68765
|
}
|
|
68766
68766
|
}
|
|
68767
68767
|
const onError = this.onError.bind(this);
|
|
68768
|
-
|
|
68768
|
+
resolve10({
|
|
68769
68769
|
status,
|
|
68770
68770
|
statusText,
|
|
68771
68771
|
headersList,
|
|
@@ -68811,7 +68811,7 @@ var require_fetch = __commonJS({
|
|
|
68811
68811
|
for (let i2 = 0; i2 < rawHeaders.length; i2 += 2) {
|
|
68812
68812
|
headersList.append(bufferToLowerCasedHeaderName(rawHeaders[i2]), rawHeaders[i2 + 1].toString("latin1"), true);
|
|
68813
68813
|
}
|
|
68814
|
-
|
|
68814
|
+
resolve10({
|
|
68815
68815
|
status,
|
|
68816
68816
|
statusText: STATUS_CODES[status],
|
|
68817
68817
|
headersList,
|
|
@@ -72450,8 +72450,8 @@ var require_util8 = __commonJS({
|
|
|
72450
72450
|
return true;
|
|
72451
72451
|
}
|
|
72452
72452
|
function delay(ms) {
|
|
72453
|
-
return new Promise((
|
|
72454
|
-
setTimeout(
|
|
72453
|
+
return new Promise((resolve10) => {
|
|
72454
|
+
setTimeout(resolve10, ms).unref();
|
|
72455
72455
|
});
|
|
72456
72456
|
}
|
|
72457
72457
|
module2.exports = {
|
|
@@ -73598,8 +73598,8 @@ var init_report_render = __esm({
|
|
|
73598
73598
|
|
|
73599
73599
|
// src/cli.ts
|
|
73600
73600
|
init_src6();
|
|
73601
|
-
import { closeSync as closeSync2, existsSync as
|
|
73602
|
-
import { join as
|
|
73601
|
+
import { closeSync as closeSync2, existsSync as existsSync39, openSync as openSync2, readFileSync as readFileSync42, renameSync as renameSync6, statSync as statSync12 } from "node:fs";
|
|
73602
|
+
import { join as join48, resolve as pathResolve2 } from "node:path";
|
|
73603
73603
|
import { spawn as spawn5 } from "node:child_process";
|
|
73604
73604
|
|
|
73605
73605
|
// src/daemon.ts
|
|
@@ -74033,7 +74033,7 @@ var responseViaResponseObject = async (res, outgoing, options = {}) => {
|
|
|
74033
74033
|
});
|
|
74034
74034
|
if (!chunk) {
|
|
74035
74035
|
if (i2 === 1) {
|
|
74036
|
-
await new Promise((
|
|
74036
|
+
await new Promise((resolve10) => setTimeout(resolve10));
|
|
74037
74037
|
maxReadCount = 3;
|
|
74038
74038
|
continue;
|
|
74039
74039
|
}
|
|
@@ -74961,9 +74961,9 @@ var NodeFsHandler = class {
|
|
|
74961
74961
|
if (this.fsw.closed) {
|
|
74962
74962
|
return;
|
|
74963
74963
|
}
|
|
74964
|
-
const
|
|
74964
|
+
const dirname16 = sysPath.dirname(file2);
|
|
74965
74965
|
const basename9 = sysPath.basename(file2);
|
|
74966
|
-
const parent = this.fsw._getWatchedDir(
|
|
74966
|
+
const parent = this.fsw._getWatchedDir(dirname16);
|
|
74967
74967
|
let prevStats = stats;
|
|
74968
74968
|
if (parent.has(basename9))
|
|
74969
74969
|
return;
|
|
@@ -74990,7 +74990,7 @@ var NodeFsHandler = class {
|
|
|
74990
74990
|
prevStats = newStats2;
|
|
74991
74991
|
}
|
|
74992
74992
|
} catch (error48) {
|
|
74993
|
-
this.fsw._remove(
|
|
74993
|
+
this.fsw._remove(dirname16, basename9);
|
|
74994
74994
|
}
|
|
74995
74995
|
} else if (parent.has(basename9)) {
|
|
74996
74996
|
const at = newStats.atimeMs;
|
|
@@ -75086,7 +75086,7 @@ var NodeFsHandler = class {
|
|
|
75086
75086
|
this._addToNodeFs(path2, initialAdd, wh, depth + 1);
|
|
75087
75087
|
}
|
|
75088
75088
|
}).on(EV.ERROR, this._boundHandleError);
|
|
75089
|
-
return new Promise((
|
|
75089
|
+
return new Promise((resolve10, reject) => {
|
|
75090
75090
|
if (!stream)
|
|
75091
75091
|
return reject();
|
|
75092
75092
|
stream.once(STR_END, () => {
|
|
@@ -75095,7 +75095,7 @@ var NodeFsHandler = class {
|
|
|
75095
75095
|
return;
|
|
75096
75096
|
}
|
|
75097
75097
|
const wasThrottled = throttler ? throttler.clear() : false;
|
|
75098
|
-
|
|
75098
|
+
resolve10(void 0);
|
|
75099
75099
|
previous.getChildren().filter((item2) => {
|
|
75100
75100
|
return item2 !== directory && !current.has(item2);
|
|
75101
75101
|
}).forEach((item2) => {
|
|
@@ -75239,11 +75239,11 @@ function createPattern(matcher) {
|
|
|
75239
75239
|
if (matcher.path === string4)
|
|
75240
75240
|
return true;
|
|
75241
75241
|
if (matcher.recursive) {
|
|
75242
|
-
const
|
|
75243
|
-
if (!
|
|
75242
|
+
const relative8 = sysPath2.relative(matcher.path, string4);
|
|
75243
|
+
if (!relative8) {
|
|
75244
75244
|
return false;
|
|
75245
75245
|
}
|
|
75246
|
-
return !
|
|
75246
|
+
return !relative8.startsWith("..") && !sysPath2.isAbsolute(relative8);
|
|
75247
75247
|
}
|
|
75248
75248
|
return false;
|
|
75249
75249
|
};
|
|
@@ -76860,9 +76860,9 @@ function subagentTranscripts(mainTranscriptPath, sessionId) {
|
|
|
76860
76860
|
refs.sort((a, b) => b.mtimeMs - a.mtimeMs);
|
|
76861
76861
|
return refs;
|
|
76862
76862
|
}
|
|
76863
|
-
function splitPathList(value,
|
|
76863
|
+
function splitPathList(value, sep6 = delimiter) {
|
|
76864
76864
|
if (!value) return [];
|
|
76865
|
-
return value.split(
|
|
76865
|
+
return value.split(sep6).map((d) => d.trim()).filter(Boolean).map((d) => normalize3(d));
|
|
76866
76866
|
}
|
|
76867
76867
|
function codexSessionRoots(env2 = process.env, home = homedir4()) {
|
|
76868
76868
|
const roots = /* @__PURE__ */ new Set();
|
|
@@ -79006,8 +79006,8 @@ var PassWorker = class {
|
|
|
79006
79006
|
const id = this.nextId++;
|
|
79007
79007
|
try {
|
|
79008
79008
|
await this.ready;
|
|
79009
|
-
return await new Promise((
|
|
79010
|
-
this.pending.set(id, { resolve:
|
|
79009
|
+
return await new Promise((resolve10, reject) => {
|
|
79010
|
+
this.pending.set(id, { resolve: resolve10, reject });
|
|
79011
79011
|
this.worker.postMessage({ id, kind, ...payload !== void 0 ? { payload } : {} });
|
|
79012
79012
|
});
|
|
79013
79013
|
} finally {
|
|
@@ -79041,12 +79041,12 @@ var PassWorker = class {
|
|
|
79041
79041
|
});
|
|
79042
79042
|
noteIsolateSpawned();
|
|
79043
79043
|
this.worker = worker;
|
|
79044
|
-
this.ready = new Promise((
|
|
79044
|
+
this.ready = new Promise((resolve10, reject) => {
|
|
79045
79045
|
const onReady = (m) => {
|
|
79046
79046
|
if (m?.ready) {
|
|
79047
79047
|
worker.off("message", onReady);
|
|
79048
79048
|
worker.off("error", onErr);
|
|
79049
|
-
|
|
79049
|
+
resolve10();
|
|
79050
79050
|
}
|
|
79051
79051
|
};
|
|
79052
79052
|
const onErr = (err2) => reject(err2);
|
|
@@ -80209,7 +80209,7 @@ function startGitSensor(gitDir, onEvent, opts = {}) {
|
|
|
80209
80209
|
// src/git-delta.ts
|
|
80210
80210
|
import { execFile } from "node:child_process";
|
|
80211
80211
|
function git(repoDir, args2) {
|
|
80212
|
-
return new Promise((
|
|
80212
|
+
return new Promise((resolve10, reject) => {
|
|
80213
80213
|
execFile(
|
|
80214
80214
|
"git",
|
|
80215
80215
|
["-C", repoDir, ...args2],
|
|
@@ -80220,7 +80220,7 @@ function git(repoDir, args2) {
|
|
|
80220
80220
|
// git-sensor runs on every commit/checkout.
|
|
80221
80221
|
windowsHide: true
|
|
80222
80222
|
},
|
|
80223
|
-
(err2, stdout) => err2 ? reject(err2) :
|
|
80223
|
+
(err2, stdout) => err2 ? reject(err2) : resolve10(stdout)
|
|
80224
80224
|
);
|
|
80225
80225
|
});
|
|
80226
80226
|
}
|
|
@@ -81382,12 +81382,12 @@ function headerPaths(diff) {
|
|
|
81382
81382
|
return out2.filter((p) => p !== "/dev/null");
|
|
81383
81383
|
}
|
|
81384
81384
|
function git2(repoDir, args2) {
|
|
81385
|
-
return new Promise((
|
|
81385
|
+
return new Promise((resolve10, reject) => {
|
|
81386
81386
|
execFile2(
|
|
81387
81387
|
"git",
|
|
81388
81388
|
["-C", repoDir, ...args2],
|
|
81389
81389
|
{ encoding: "utf8", maxBuffer: 64 * 1024 * 1024, windowsHide: true },
|
|
81390
|
-
(err2, stdout) => err2 ? reject(err2) :
|
|
81390
|
+
(err2, stdout) => err2 ? reject(err2) : resolve10(stdout)
|
|
81391
81391
|
);
|
|
81392
81392
|
});
|
|
81393
81393
|
}
|
|
@@ -82685,7 +82685,7 @@ function createWatchBreaker(deps) {
|
|
|
82685
82685
|
}
|
|
82686
82686
|
|
|
82687
82687
|
// src/engine.ts
|
|
82688
|
-
var DAEMON_VERSION = true ? "2.0.17-dev.
|
|
82688
|
+
var DAEMON_VERSION = true ? "2.0.17-dev.3577" : "2.0.0-alpha.0";
|
|
82689
82689
|
var IGNORED_PATH = /[\\/](?:\.git|node_modules|\.errata|\.claude|\.codex|\.cursor|\.turbo|\.next|dist|coverage|test-results|playwright-report|__pycache__)(?:[\\/]|$)/;
|
|
82690
82690
|
var IGNORED_NOISE = /castalia\.db|eventlog\.sqlite|turn-cursors/;
|
|
82691
82691
|
var GIT_OP_MUTE_MS = 4e3;
|
|
@@ -82720,8 +82720,8 @@ function loadTurnOffsets(path2) {
|
|
|
82720
82720
|
const raw2 = JSON.parse(readFileSync32(path2, "utf8"));
|
|
82721
82721
|
const out2 = /* @__PURE__ */ new Map();
|
|
82722
82722
|
for (const [k, v] of Object.entries(raw2)) {
|
|
82723
|
-
const
|
|
82724
|
-
if (typeof
|
|
82723
|
+
const off2 = typeof v === "object" && v !== null ? v.offset : void 0;
|
|
82724
|
+
if (typeof off2 === "number" && off2 >= 0) out2.set(k, off2);
|
|
82725
82725
|
}
|
|
82726
82726
|
return out2;
|
|
82727
82727
|
} catch {
|
|
@@ -84703,7 +84703,7 @@ function createWorkspaceEngine(opts) {
|
|
|
84703
84703
|
}
|
|
84704
84704
|
turns = next.turns;
|
|
84705
84705
|
nextOffset = next.nextOffset;
|
|
84706
|
-
await new Promise((
|
|
84706
|
+
await new Promise((resolve10) => setImmediate(resolve10));
|
|
84707
84707
|
}
|
|
84708
84708
|
};
|
|
84709
84709
|
const seenMessageIds = /* @__PURE__ */ new Set();
|
|
@@ -85407,9 +85407,9 @@ async function startDaemon(opts) {
|
|
|
85407
85407
|
};
|
|
85408
85408
|
}
|
|
85409
85409
|
async function listenServer(fetchFn, port) {
|
|
85410
|
-
return new Promise((
|
|
85410
|
+
return new Promise((resolve10) => {
|
|
85411
85411
|
const server = serve({ fetch: fetchFn, hostname: "127.0.0.1", port }, (info2) => {
|
|
85412
|
-
|
|
85412
|
+
resolve10({ server, port: info2.port });
|
|
85413
85413
|
});
|
|
85414
85414
|
});
|
|
85415
85415
|
}
|
|
@@ -86763,8 +86763,8 @@ var ConsolidateWorker = class {
|
|
|
86763
86763
|
const id = this.nextId++;
|
|
86764
86764
|
try {
|
|
86765
86765
|
await this.ready;
|
|
86766
|
-
return await new Promise((
|
|
86767
|
-
this.pending.set(id, { resolve:
|
|
86766
|
+
return await new Promise((resolve10, reject) => {
|
|
86767
|
+
this.pending.set(id, { resolve: resolve10, reject });
|
|
86768
86768
|
this.worker.postMessage({ ...req, id });
|
|
86769
86769
|
});
|
|
86770
86770
|
} finally {
|
|
@@ -86793,12 +86793,12 @@ var ConsolidateWorker = class {
|
|
|
86793
86793
|
});
|
|
86794
86794
|
noteIsolateSpawned();
|
|
86795
86795
|
this.worker = worker;
|
|
86796
|
-
this.ready = new Promise((
|
|
86796
|
+
this.ready = new Promise((resolve10, reject) => {
|
|
86797
86797
|
const onReady = (m) => {
|
|
86798
86798
|
if (m?.ready) {
|
|
86799
86799
|
worker.off("message", onReady);
|
|
86800
86800
|
worker.off("error", onErr);
|
|
86801
|
-
|
|
86801
|
+
resolve10();
|
|
86802
86802
|
}
|
|
86803
86803
|
};
|
|
86804
86804
|
const onErr = (err2) => {
|
|
@@ -87016,17 +87016,17 @@ function startUpdatePoller(opts) {
|
|
|
87016
87016
|
};
|
|
87017
87017
|
}
|
|
87018
87018
|
function runNpmInstall(channel) {
|
|
87019
|
-
return new Promise((
|
|
87019
|
+
return new Promise((resolve10) => {
|
|
87020
87020
|
const child = spawn2("npm", ["install", "-g", `${PACKAGE_NAME}@${channel}`], {
|
|
87021
87021
|
stdio: "inherit",
|
|
87022
87022
|
shell: true
|
|
87023
87023
|
});
|
|
87024
|
-
child.on("close", (code) =>
|
|
87025
|
-
child.on("error", () =>
|
|
87024
|
+
child.on("close", (code) => resolve10(code ?? 1));
|
|
87025
|
+
child.on("error", () => resolve10(1));
|
|
87026
87026
|
});
|
|
87027
87027
|
}
|
|
87028
87028
|
async function runInstalledHookRefresh() {
|
|
87029
|
-
const root = await new Promise((
|
|
87029
|
+
const root = await new Promise((resolve10) => {
|
|
87030
87030
|
const child = spawn2("npm", ["root", "-g"], {
|
|
87031
87031
|
shell: true,
|
|
87032
87032
|
windowsHide: true,
|
|
@@ -87038,18 +87038,18 @@ async function runInstalledHookRefresh() {
|
|
|
87038
87038
|
output += chunk;
|
|
87039
87039
|
if (output.length > 32768) child.kill();
|
|
87040
87040
|
});
|
|
87041
|
-
child.on("error", () =>
|
|
87042
|
-
child.on("close", (code) =>
|
|
87041
|
+
child.on("error", () => resolve10(""));
|
|
87042
|
+
child.on("close", (code) => resolve10(code === 0 ? output.trim() : ""));
|
|
87043
87043
|
});
|
|
87044
87044
|
if (!isAbsolute5(root)) return 1;
|
|
87045
|
-
return new Promise((
|
|
87045
|
+
return new Promise((resolve10) => {
|
|
87046
87046
|
const child = spawn2(process.execPath, [join38(root, PACKAGE_NAME, "errata.mjs"), "install-hooks", "codex", "--refresh-existing"], {
|
|
87047
87047
|
windowsHide: true,
|
|
87048
87048
|
stdio: "inherit",
|
|
87049
87049
|
timeout: 3e4
|
|
87050
87050
|
});
|
|
87051
|
-
child.on("error", () =>
|
|
87052
|
-
child.on("close", (code) =>
|
|
87051
|
+
child.on("error", () => resolve10(1));
|
|
87052
|
+
child.on("close", (code) => resolve10(code ?? 1));
|
|
87053
87053
|
});
|
|
87054
87054
|
}
|
|
87055
87055
|
|
|
@@ -87064,7 +87064,7 @@ function liveCloudClient(src) {
|
|
|
87064
87064
|
let current = null;
|
|
87065
87065
|
let currentKey = "";
|
|
87066
87066
|
let checkedAt = -Infinity;
|
|
87067
|
-
const
|
|
87067
|
+
const resolve10 = () => {
|
|
87068
87068
|
const t = now();
|
|
87069
87069
|
if (current && t - checkedAt < recheckMs) return current;
|
|
87070
87070
|
checkedAt = t;
|
|
@@ -87084,7 +87084,7 @@ function liveCloudClient(src) {
|
|
|
87084
87084
|
};
|
|
87085
87085
|
return new Proxy({}, {
|
|
87086
87086
|
get(_target, prop) {
|
|
87087
|
-
const client =
|
|
87087
|
+
const client = resolve10();
|
|
87088
87088
|
const value = Reflect.get(client, prop, client);
|
|
87089
87089
|
return typeof value === "function" ? value.bind(client) : value;
|
|
87090
87090
|
}
|
|
@@ -87630,7 +87630,7 @@ async function syncHistoryRevision(opts) {
|
|
|
87630
87630
|
changed += result.changed;
|
|
87631
87631
|
remaining = result.remaining;
|
|
87632
87632
|
if (!remaining || Date.now() - started2 >= (opts.budgetMs ?? 45e3)) break;
|
|
87633
|
-
await new Promise((
|
|
87633
|
+
await new Promise((resolve10) => setImmediate(resolve10));
|
|
87634
87634
|
}
|
|
87635
87635
|
return { changed, remaining };
|
|
87636
87636
|
})();
|
|
@@ -88155,8 +88155,8 @@ var GitBlobReader = class {
|
|
|
88155
88155
|
if (this.failed) return Promise.reject(this.failed);
|
|
88156
88156
|
if (/[\r\n]/.test(spec)) return Promise.resolve(null);
|
|
88157
88157
|
const proc = this.start();
|
|
88158
|
-
return new Promise((
|
|
88159
|
-
this.queue.push({ resolve:
|
|
88158
|
+
return new Promise((resolve10, reject) => {
|
|
88159
|
+
this.queue.push({ resolve: resolve10, reject });
|
|
88160
88160
|
proc.stdin.write(`${spec}
|
|
88161
88161
|
`);
|
|
88162
88162
|
});
|
|
@@ -88170,14 +88170,14 @@ var GitBlobReader = class {
|
|
|
88170
88170
|
const proc = this.proc;
|
|
88171
88171
|
this.proc = null;
|
|
88172
88172
|
if (!proc || proc.exitCode !== null) return Promise.resolve();
|
|
88173
|
-
return new Promise((
|
|
88173
|
+
return new Promise((resolve10) => {
|
|
88174
88174
|
const timer = setTimeout(() => {
|
|
88175
88175
|
proc.kill();
|
|
88176
|
-
|
|
88176
|
+
resolve10();
|
|
88177
88177
|
}, timeoutMs);
|
|
88178
88178
|
proc.once("exit", () => {
|
|
88179
88179
|
clearTimeout(timer);
|
|
88180
|
-
|
|
88180
|
+
resolve10();
|
|
88181
88181
|
});
|
|
88182
88182
|
proc.stdin.end();
|
|
88183
88183
|
});
|
|
@@ -88973,7 +88973,7 @@ async function loginOAuthDevice(opts) {
|
|
|
88973
88973
|
let deviceSession = null;
|
|
88974
88974
|
let approvedInstallation = null;
|
|
88975
88975
|
while (Date.now() < deadline) {
|
|
88976
|
-
await (opts.sleep ?? ((ms) => new Promise((
|
|
88976
|
+
await (opts.sleep ?? ((ms) => new Promise((resolve10) => setTimeout(resolve10, ms))))(waitMs);
|
|
88977
88977
|
waitMs = intervalMs;
|
|
88978
88978
|
const poll = await fetchDevicePoll(fetchFn, device.token, {
|
|
88979
88979
|
method: "POST",
|
|
@@ -89098,7 +89098,7 @@ async function loginOAuthLoopback(opts) {
|
|
|
89098
89098
|
const state = randomState();
|
|
89099
89099
|
const scope = opts.scope ?? DEFAULT_OAUTH_SCOPE;
|
|
89100
89100
|
const { code, redirectUri, clientId } = await new Promise(
|
|
89101
|
-
(
|
|
89101
|
+
(resolve10, reject) => {
|
|
89102
89102
|
const server = createServer((req, res) => {
|
|
89103
89103
|
const u = new URL(req.url ?? "/", "http://127.0.0.1");
|
|
89104
89104
|
if (u.pathname !== "/callback") {
|
|
@@ -89121,7 +89121,7 @@ async function loginOAuthLoopback(opts) {
|
|
|
89121
89121
|
res.writeHead(200, { "content-type": "text/html" });
|
|
89122
89122
|
res.end("<html><body>inErrata: you're logged in. You can close this tab.</body></html>");
|
|
89123
89123
|
server.close();
|
|
89124
|
-
|
|
89124
|
+
resolve10({ code: code2, redirectUri: `http://127.0.0.1:${port}/callback`, clientId: activeClientId });
|
|
89125
89125
|
});
|
|
89126
89126
|
let activeClientId = oauthClientId();
|
|
89127
89127
|
server.on("error", reject);
|
|
@@ -89220,7 +89220,7 @@ async function linkThroughConsole(opts) {
|
|
|
89220
89220
|
const deadline = Date.now() + Math.min(code.expires_in * 1e3, opts.timeoutMs ?? Number.POSITIVE_INFINITY);
|
|
89221
89221
|
let intervalMs = Math.max(2, code.interval ?? 5) * 1e3;
|
|
89222
89222
|
let waitMs = intervalMs;
|
|
89223
|
-
const sleep = opts.sleep ?? ((ms) => new Promise((
|
|
89223
|
+
const sleep = opts.sleep ?? ((ms) => new Promise((resolve10) => setTimeout(resolve10, ms)));
|
|
89224
89224
|
while (Date.now() < deadline) {
|
|
89225
89225
|
await sleep(waitMs);
|
|
89226
89226
|
waitMs = intervalMs;
|
|
@@ -90716,7 +90716,7 @@ async function startMultiDaemon(opts = {}) {
|
|
|
90716
90716
|
const packageAutoAll = async () => {
|
|
90717
90717
|
const out2 = /* @__PURE__ */ new Map();
|
|
90718
90718
|
for (const r of records) {
|
|
90719
|
-
await new Promise((
|
|
90719
|
+
await new Promise((resolve10) => setImmediate(resolve10));
|
|
90720
90720
|
const done = markPass(`package-index:${r.entry.name}`);
|
|
90721
90721
|
try {
|
|
90722
90722
|
out2.set(
|
|
@@ -92285,7 +92285,7 @@ function inspectCodexContext(cwd) {
|
|
|
92285
92285
|
return { id: "codex_context", status: "fail", detail: "No usable saved workspace context; run errata start here and check the daemon log if context.md remains unavailable" };
|
|
92286
92286
|
}
|
|
92287
92287
|
function readCodexHookState(cwd, options = {}) {
|
|
92288
|
-
return new Promise((
|
|
92288
|
+
return new Promise((resolve10, reject) => {
|
|
92289
92289
|
const child = spawn4(options.bin ?? resolveCodexExecutable(), options.args ?? ["app-server", "--stdio"], {
|
|
92290
92290
|
cwd,
|
|
92291
92291
|
windowsHide: true,
|
|
@@ -92306,7 +92306,7 @@ function readCodexHookState(cwd, options = {}) {
|
|
|
92306
92306
|
child.once("close", () => {
|
|
92307
92307
|
clearTimeout(reap);
|
|
92308
92308
|
if (error48) reject(error48);
|
|
92309
|
-
else
|
|
92309
|
+
else resolve10({ ...hooks, features });
|
|
92310
92310
|
});
|
|
92311
92311
|
child.kill();
|
|
92312
92312
|
};
|
|
@@ -92548,8 +92548,8 @@ function userClaudeSettingsPath() {
|
|
|
92548
92548
|
}
|
|
92549
92549
|
function ensureUserStatusLine(opts) {
|
|
92550
92550
|
const env2 = opts.env ?? process.env;
|
|
92551
|
-
const
|
|
92552
|
-
if (
|
|
92551
|
+
const off2 = (env2["ERRATA_STATUSLINE"] ?? "").trim().toLowerCase();
|
|
92552
|
+
if (off2 === "0" || off2 === "off" || off2 === "false" || off2 === "no") return "disabled";
|
|
92553
92553
|
const settingsPath = opts.userSettingsPath ?? userClaudeSettingsPath();
|
|
92554
92554
|
let settings = {};
|
|
92555
92555
|
if (existsSync37(settingsPath)) {
|
|
@@ -92598,6 +92598,142 @@ function describeStatusLineOutcome(outcome) {
|
|
|
92598
92598
|
}
|
|
92599
92599
|
}
|
|
92600
92600
|
|
|
92601
|
+
// src/claude-mods.ts
|
|
92602
|
+
import { createHash as createHash20 } from "node:crypto";
|
|
92603
|
+
import { cpSync as cpSync2, existsSync as existsSync38, mkdirSync as mkdirSync11, readFileSync as readFileSync41, readdirSync as readdirSync14, rmSync as rmSync4, statSync as statSync11, writeFileSync as writeFileSync29 } from "node:fs";
|
|
92604
|
+
import { delimiter as delimiter2, dirname as dirname15, join as join47, relative as relative7, resolve as resolve9, sep as sep5 } from "node:path";
|
|
92605
|
+
import { fileURLToPath as fileURLToPath2 } from "node:url";
|
|
92606
|
+
var CLAUDE_PLUGIN_DIRS_ENV = "CLAUDE_CODE_PLUGIN_DIRS";
|
|
92607
|
+
var HASH_FILE = ".errata-mod-hash";
|
|
92608
|
+
function bundledClaudeModsDir() {
|
|
92609
|
+
const rel = import.meta.url.endsWith(".mjs") ? "./resources/claude-mods/" : "../claude-mods/";
|
|
92610
|
+
return fileURLToPath2(new URL(rel, import.meta.url));
|
|
92611
|
+
}
|
|
92612
|
+
function isEngineOwned(relPath) {
|
|
92613
|
+
const p = relPath.split(sep5).join("/");
|
|
92614
|
+
return p === ".claude-plugin/types" || p.startsWith(".claude-plugin/types/") || p === HASH_FILE;
|
|
92615
|
+
}
|
|
92616
|
+
function listFiles(root, dir = root) {
|
|
92617
|
+
const out2 = [];
|
|
92618
|
+
for (const name2 of readdirSync14(dir)) {
|
|
92619
|
+
const abs = join47(dir, name2);
|
|
92620
|
+
if (isEngineOwned(relative7(root, abs))) continue;
|
|
92621
|
+
if (statSync11(abs).isDirectory()) out2.push(...listFiles(root, abs));
|
|
92622
|
+
else out2.push(abs);
|
|
92623
|
+
}
|
|
92624
|
+
return out2;
|
|
92625
|
+
}
|
|
92626
|
+
function modHash(dir) {
|
|
92627
|
+
const h = createHash20("sha256");
|
|
92628
|
+
for (const abs of listFiles(dir).sort()) {
|
|
92629
|
+
h.update(relative7(dir, abs).split(sep5).join("/"));
|
|
92630
|
+
h.update("\0");
|
|
92631
|
+
h.update(readFileSync41(abs));
|
|
92632
|
+
h.update("\0");
|
|
92633
|
+
}
|
|
92634
|
+
return h.digest("hex");
|
|
92635
|
+
}
|
|
92636
|
+
function bundledMods(bundleDir) {
|
|
92637
|
+
if (!existsSync38(bundleDir)) return [];
|
|
92638
|
+
return readdirSync14(bundleDir).filter((name2) => existsSync38(join47(bundleDir, name2, ".claude-plugin", "plugin.json")));
|
|
92639
|
+
}
|
|
92640
|
+
function sameDir(a, b) {
|
|
92641
|
+
const norm = (p) => resolve9(p).replace(/[\\/]+$/, "").toLowerCase();
|
|
92642
|
+
return norm(a) === norm(b);
|
|
92643
|
+
}
|
|
92644
|
+
function isUnder(path2, root) {
|
|
92645
|
+
const rel = relative7(resolve9(root), resolve9(path2));
|
|
92646
|
+
return rel !== "" && !rel.startsWith("..") && !rel.includes(":");
|
|
92647
|
+
}
|
|
92648
|
+
function off(env2) {
|
|
92649
|
+
const v = (env2["ERRATA_CLAUDE_MODS"] ?? "").trim().toLowerCase();
|
|
92650
|
+
return v === "0" || v === "off" || v === "false" || v === "no";
|
|
92651
|
+
}
|
|
92652
|
+
function readSettings(path2) {
|
|
92653
|
+
if (!existsSync38(path2)) return {};
|
|
92654
|
+
try {
|
|
92655
|
+
const parsed = JSON.parse(readFileSync41(path2, "utf8"));
|
|
92656
|
+
if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) return null;
|
|
92657
|
+
return parsed;
|
|
92658
|
+
} catch {
|
|
92659
|
+
return null;
|
|
92660
|
+
}
|
|
92661
|
+
}
|
|
92662
|
+
function setPluginDirs(settings, dirs) {
|
|
92663
|
+
const env2 = settings["env"] && typeof settings["env"] === "object" && !Array.isArray(settings["env"]) ? { ...settings["env"] } : {};
|
|
92664
|
+
const before = typeof env2[CLAUDE_PLUGIN_DIRS_ENV] === "string" ? env2[CLAUDE_PLUGIN_DIRS_ENV] : void 0;
|
|
92665
|
+
const after = dirs.length > 0 ? dirs.join(delimiter2) : void 0;
|
|
92666
|
+
if (before === after) return false;
|
|
92667
|
+
if (after === void 0) delete env2[CLAUDE_PLUGIN_DIRS_ENV];
|
|
92668
|
+
else env2[CLAUDE_PLUGIN_DIRS_ENV] = after;
|
|
92669
|
+
if (Object.keys(env2).length > 0) settings["env"] = env2;
|
|
92670
|
+
else delete settings["env"];
|
|
92671
|
+
return true;
|
|
92672
|
+
}
|
|
92673
|
+
function currentDirs(settings) {
|
|
92674
|
+
const env2 = settings["env"];
|
|
92675
|
+
const raw2 = env2 && typeof env2[CLAUDE_PLUGIN_DIRS_ENV] === "string" ? env2[CLAUDE_PLUGIN_DIRS_ENV] : "";
|
|
92676
|
+
return raw2.split(delimiter2).map((s) => s.trim()).filter(Boolean);
|
|
92677
|
+
}
|
|
92678
|
+
function writeSettings(path2, settings) {
|
|
92679
|
+
mkdirSync11(dirname15(path2), { recursive: true });
|
|
92680
|
+
writeFileSync29(path2, JSON.stringify(settings, null, 2) + "\n", "utf8");
|
|
92681
|
+
}
|
|
92682
|
+
function ensureClaudeMods(opts) {
|
|
92683
|
+
const env2 = opts.env ?? process.env;
|
|
92684
|
+
const settingsPath = opts.userSettingsPath ?? userClaudeSettingsPath();
|
|
92685
|
+
const modsRoot = join47(opts.installRoot, "claude-mods");
|
|
92686
|
+
if (off(env2)) {
|
|
92687
|
+
const settings2 = readSettings(settingsPath);
|
|
92688
|
+
if (!settings2) return { kind: "unreadable" };
|
|
92689
|
+
const dirs2 = currentDirs(settings2);
|
|
92690
|
+
const kept = dirs2.filter((d) => !isUnder(d, modsRoot));
|
|
92691
|
+
if (setPluginDirs(settings2, kept)) writeSettings(settingsPath, settings2);
|
|
92692
|
+
return { kind: "disabled", removed: dirs2.length - kept.length };
|
|
92693
|
+
}
|
|
92694
|
+
const bundleDir = opts.bundleDir ?? bundledClaudeModsDir();
|
|
92695
|
+
const names = bundledMods(bundleDir);
|
|
92696
|
+
if (names.length === 0) return { kind: "no-bundle" };
|
|
92697
|
+
const settings = readSettings(settingsPath);
|
|
92698
|
+
if (!settings) return { kind: "unreadable" };
|
|
92699
|
+
let changed = false;
|
|
92700
|
+
const installed = [];
|
|
92701
|
+
for (const name2 of names) {
|
|
92702
|
+
const src = join47(bundleDir, name2);
|
|
92703
|
+
const dest = join47(modsRoot, name2);
|
|
92704
|
+
const hash2 = modHash(src);
|
|
92705
|
+
const hashFile = join47(dest, HASH_FILE);
|
|
92706
|
+
if (!existsSync38(hashFile) || readFileSync41(hashFile, "utf8") !== hash2) {
|
|
92707
|
+
rmSync4(dest, { recursive: true, force: true });
|
|
92708
|
+
cpSync2(src, dest, { recursive: true, filter: (p) => !isEngineOwned(relative7(src, p)) });
|
|
92709
|
+
writeFileSync29(hashFile, hash2, "utf8");
|
|
92710
|
+
changed = true;
|
|
92711
|
+
}
|
|
92712
|
+
installed.push(dest);
|
|
92713
|
+
}
|
|
92714
|
+
const others = currentDirs(settings).filter((d) => !isUnder(d, modsRoot));
|
|
92715
|
+
const dirs = [...installed, ...others.filter((d) => !installed.some((m) => sameDir(m, d)))];
|
|
92716
|
+
if (setPluginDirs(settings, dirs)) {
|
|
92717
|
+
writeSettings(settingsPath, settings);
|
|
92718
|
+
changed = true;
|
|
92719
|
+
}
|
|
92720
|
+
return { kind: changed ? "installed" : "unchanged", mods: names };
|
|
92721
|
+
}
|
|
92722
|
+
function describeClaudeModsOutcome(outcome) {
|
|
92723
|
+
switch (outcome.kind) {
|
|
92724
|
+
case "installed":
|
|
92725
|
+
return `Claude Code mods: installed ${outcome.mods.join(", ")} \u2014 new Claude Code sessions load them`;
|
|
92726
|
+
case "unchanged":
|
|
92727
|
+
return `Claude Code mods: ${outcome.mods.join(", ")} up to date`;
|
|
92728
|
+
case "disabled":
|
|
92729
|
+
return `Claude Code mods: off (ERRATA_CLAUDE_MODS)${outcome.removed > 0 ? ` \u2014 removed ${outcome.removed} from settings` : ""}`;
|
|
92730
|
+
case "unreadable":
|
|
92731
|
+
return "Claude Code mods: not installed \u2014 ~/.claude/settings.json is not valid JSON (left untouched)";
|
|
92732
|
+
case "no-bundle":
|
|
92733
|
+
return "Claude Code mods: none bundled with this build";
|
|
92734
|
+
}
|
|
92735
|
+
}
|
|
92736
|
+
|
|
92601
92737
|
// src/opencode-plugin.ts
|
|
92602
92738
|
var OPENCODE_PLUGIN_MARKER = "// @inerrata opencode plugin \u2014 errata-managed (errata install-hooks opencode)";
|
|
92603
92739
|
var OPENCODE_D1_CONTRACT = "Behavioral contract: (1) On ANY error, call search() BEFORE debugging \u2014 costs ~400 tokens vs 5,000\u201350,000 cold. (2) After solving non-trivial problems, contribute back: if your harness emits typed nodes (canonicalId + label + attrs), use ingest \u2014 the typed door; otherwise call contribute(), the prose fallback. (3) Before web search, try search() first \u2014 graph is 2\u201315\xD7 cheaper. (4) At session end, review what you solved and contribute anything novel.";
|
|
@@ -92981,9 +93117,9 @@ function resolveHookPort(explicit) {
|
|
|
92981
93117
|
}
|
|
92982
93118
|
}
|
|
92983
93119
|
}
|
|
92984
|
-
const settingsPath =
|
|
93120
|
+
const settingsPath = join48(ROOT, ".claude", "settings.json");
|
|
92985
93121
|
try {
|
|
92986
|
-
if (
|
|
93122
|
+
if (existsSync39(settingsPath)) return installedHookPort(readFileSync42(settingsPath, "utf8")) ?? 7891;
|
|
92987
93123
|
} catch {
|
|
92988
93124
|
}
|
|
92989
93125
|
return 7891;
|
|
@@ -93008,14 +93144,14 @@ async function cmdInit() {
|
|
|
93008
93144
|
if (!skipHooks) {
|
|
93009
93145
|
console.log("");
|
|
93010
93146
|
console.log("installing harness hooks...");
|
|
93011
|
-
const { existsSync:
|
|
93012
|
-
const { join:
|
|
93147
|
+
const { existsSync: existsSync40 } = await import("node:fs");
|
|
93148
|
+
const { join: join49 } = await import("node:path");
|
|
93013
93149
|
try {
|
|
93014
93150
|
await installClaudeHooks(port);
|
|
93015
93151
|
} catch (err2) {
|
|
93016
93152
|
console.warn(` \u26A0\uFE0F Claude hook install failed: ${err2 instanceof Error ? err2.message : err2}`);
|
|
93017
93153
|
}
|
|
93018
|
-
if (
|
|
93154
|
+
if (existsSync40(join49(ROOT, ".cursor"))) {
|
|
93019
93155
|
try {
|
|
93020
93156
|
await installCursorMcpConfig();
|
|
93021
93157
|
} catch (err2) {
|
|
@@ -93228,9 +93364,9 @@ async function cmdStatus() {
|
|
|
93228
93364
|
console.log(` stack: ${profile.stack.join(", ") || "(none)"}`);
|
|
93229
93365
|
console.log(` languages: ${profile.languages.join(", ") || "(none)"}`);
|
|
93230
93366
|
}
|
|
93231
|
-
console.log(` graph db: ${
|
|
93232
|
-
console.log(` event log: ${
|
|
93233
|
-
if (
|
|
93367
|
+
console.log(` graph db: ${existsSync39(paths.castalia) ? "yes" : "no"} (${paths.castalia})`);
|
|
93368
|
+
console.log(` event log: ${existsSync39(paths.eventLog) ? "yes" : "no"} (${paths.eventLog})`);
|
|
93369
|
+
if (existsSync39(paths.castalia)) {
|
|
93234
93370
|
try {
|
|
93235
93371
|
const { openGraphStore: openGraphStore2 } = await Promise.resolve().then(() => (init_src5(), src_exports2));
|
|
93236
93372
|
const store = openGraphStore2({ path: paths.castalia });
|
|
@@ -93853,6 +93989,7 @@ async function cmdLink(args2) {
|
|
|
93853
93989
|
return;
|
|
93854
93990
|
}
|
|
93855
93991
|
console.log(ensureStatusLine(resolveHookPort()));
|
|
93992
|
+
console.log(installClaudeMods().line);
|
|
93856
93993
|
delete profile.projectLinkDisabled;
|
|
93857
93994
|
const remote = flag("--remote");
|
|
93858
93995
|
if (remote) {
|
|
@@ -94203,11 +94340,11 @@ async function cmdInstallationProfile(args2) {
|
|
|
94203
94340
|
}
|
|
94204
94341
|
async function cmdReview() {
|
|
94205
94342
|
const paths = workspacePaths(ROOT);
|
|
94206
|
-
if (!
|
|
94343
|
+
if (!existsSync39(paths.reviewQueue)) {
|
|
94207
94344
|
console.log("(review queue empty)");
|
|
94208
94345
|
return;
|
|
94209
94346
|
}
|
|
94210
|
-
const queue = JSON.parse(
|
|
94347
|
+
const queue = JSON.parse(readFileSync42(paths.reviewQueue, "utf8"));
|
|
94211
94348
|
if (queue.length === 0) {
|
|
94212
94349
|
console.log("(review queue empty)");
|
|
94213
94350
|
return;
|
|
@@ -94878,7 +95015,7 @@ async function gatherRepo(store, ws) {
|
|
|
94878
95015
|
};
|
|
94879
95016
|
}
|
|
94880
95017
|
async function gatherReportData(generatedAt) {
|
|
94881
|
-
const { existsSync:
|
|
95018
|
+
const { existsSync: existsSync40 } = await import("node:fs");
|
|
94882
95019
|
const { openGraphStore: openGraphStore2 } = await Promise.resolve().then(() => (init_src5(), src_exports2));
|
|
94883
95020
|
const cfg = loadConfig();
|
|
94884
95021
|
const outbound = cfg.consent.sync ? "auto" : "off";
|
|
@@ -94886,7 +95023,7 @@ async function gatherReportData(generatedAt) {
|
|
|
94886
95023
|
for (const ws of listWorkspaces()) {
|
|
94887
95024
|
if (ws.missing) continue;
|
|
94888
95025
|
const dbPath = workspacePaths(ws.path).castalia;
|
|
94889
|
-
if (!
|
|
95026
|
+
if (!existsSync40(dbPath)) continue;
|
|
94890
95027
|
let store = null;
|
|
94891
95028
|
try {
|
|
94892
95029
|
store = openGraphStore2({ path: dbPath });
|
|
@@ -94917,7 +95054,7 @@ async function gatherReportData(generatedAt) {
|
|
|
94917
95054
|
};
|
|
94918
95055
|
}
|
|
94919
95056
|
async function cmdReport(args2) {
|
|
94920
|
-
const { mkdirSync:
|
|
95057
|
+
const { mkdirSync: mkdirSync12, writeFileSync: writeFileSync30 } = await import("node:fs");
|
|
94921
95058
|
const { renderReport: renderReport2 } = await Promise.resolve().then(() => (init_report_render(), report_render_exports));
|
|
94922
95059
|
const includeFutureVerbs = args2.includes("--future-verbs");
|
|
94923
95060
|
const now = /* @__PURE__ */ new Date();
|
|
@@ -94928,10 +95065,10 @@ async function cmdReport(args2) {
|
|
|
94928
95065
|
process.exit(2);
|
|
94929
95066
|
}
|
|
94930
95067
|
const outDir = workspacePaths(ROOT).configDir;
|
|
94931
|
-
|
|
95068
|
+
mkdirSync12(outDir, { recursive: true });
|
|
94932
95069
|
const files = renderReport2(data, { includeFutureVerbs });
|
|
94933
|
-
for (const f of files)
|
|
94934
|
-
const indexPath =
|
|
95070
|
+
for (const f of files) writeFileSync30(join48(outDir, f.name), f.html, "utf8");
|
|
95071
|
+
const indexPath = join48(outDir, "report.html");
|
|
94935
95072
|
console.log(`report \u2192 ${indexPath}`);
|
|
94936
95073
|
console.log(
|
|
94937
95074
|
` ${data.repos.length} repo(s) \xB7 ${files.length} file(s) \xB7 ${data.rollup.nodes.toLocaleString("en-US")} nodes`
|
|
@@ -94975,7 +95112,7 @@ function spawnDaemonDetached(options = {}) {
|
|
|
94975
95112
|
try {
|
|
94976
95113
|
const logPath = daemonLogPath();
|
|
94977
95114
|
try {
|
|
94978
|
-
if (
|
|
95115
|
+
if (statSync12(logPath).size > 5 * 1024 * 1024) renameSync6(logPath, `${logPath}.1`);
|
|
94979
95116
|
} catch {
|
|
94980
95117
|
}
|
|
94981
95118
|
out2 = openSync2(logPath, "a");
|
|
@@ -95044,24 +95181,24 @@ async function cmdInstallHooks(args2) {
|
|
|
95044
95181
|
}
|
|
95045
95182
|
}
|
|
95046
95183
|
async function installOpencodePlugin(port) {
|
|
95047
|
-
const { mkdirSync:
|
|
95048
|
-
const { join:
|
|
95049
|
-
const dir =
|
|
95050
|
-
if (!
|
|
95051
|
-
const file2 =
|
|
95052
|
-
if (
|
|
95053
|
-
const head2 =
|
|
95184
|
+
const { mkdirSync: mkdirSync12, existsSync: existsSync40, readFileSync: readFileSync43, writeFileSync: writeFileSync30 } = await import("node:fs");
|
|
95185
|
+
const { join: join49 } = await import("node:path");
|
|
95186
|
+
const dir = join49(ROOT, ".opencode", "plugin");
|
|
95187
|
+
if (!existsSync40(dir)) mkdirSync12(dir, { recursive: true });
|
|
95188
|
+
const file2 = join49(dir, "inerrata.js");
|
|
95189
|
+
if (existsSync40(file2)) {
|
|
95190
|
+
const head2 = readFileSync43(file2, "utf8").split("\n")[0] ?? "";
|
|
95054
95191
|
if (head2.trim() !== OPENCODE_PLUGIN_MARKER) {
|
|
95055
95192
|
console.error(`refusing to overwrite ${file2}: not an errata-managed plugin (line 1 lacks the marker)`);
|
|
95056
95193
|
process.exit(2);
|
|
95057
95194
|
}
|
|
95058
95195
|
}
|
|
95059
|
-
|
|
95060
|
-
const cfgFile =
|
|
95196
|
+
writeFileSync30(file2, buildOpencodePluginSource(port, { version: DAEMON_VERSION }), "utf8");
|
|
95197
|
+
const cfgFile = join49(ROOT, "opencode.json");
|
|
95061
95198
|
let cfg = { $schema: "https://opencode.ai/config.json" };
|
|
95062
|
-
if (
|
|
95199
|
+
if (existsSync40(cfgFile)) {
|
|
95063
95200
|
try {
|
|
95064
|
-
cfg = JSON.parse(
|
|
95201
|
+
cfg = JSON.parse(readFileSync43(cfgFile, "utf8"));
|
|
95065
95202
|
} catch {
|
|
95066
95203
|
console.error(`refusing to touch invalid JSON at ${cfgFile} \u2014 fix it and re-run`);
|
|
95067
95204
|
process.exit(2);
|
|
@@ -95072,7 +95209,7 @@ async function installOpencodePlugin(port) {
|
|
|
95072
95209
|
if (!hadErrata) {
|
|
95073
95210
|
const inv = errataMcpInvocation();
|
|
95074
95211
|
cfg.mcp["errata"] = { type: "local", command: [inv.command, ...inv.args] };
|
|
95075
|
-
|
|
95212
|
+
writeFileSync30(cfgFile, JSON.stringify(cfg, null, 2) + "\n", "utf8");
|
|
95076
95213
|
}
|
|
95077
95214
|
console.log(`installed OpenCode plugin \u2192 ${file2}`);
|
|
95078
95215
|
if (hadErrata) console.log(` mcp.errata already present in ${cfgFile} \u2014 left untouched`);
|
|
@@ -95098,16 +95235,24 @@ function ensureStatusLine(port) {
|
|
|
95098
95235
|
return `status line: not installed (${err2 instanceof Error ? err2.message : err2})`;
|
|
95099
95236
|
}
|
|
95100
95237
|
}
|
|
95238
|
+
function installClaudeMods() {
|
|
95239
|
+
try {
|
|
95240
|
+
const outcome = ensureClaudeMods({ installRoot: globalDir() });
|
|
95241
|
+
return { line: describeClaudeModsOutcome(outcome), changed: outcome.kind !== "unchanged" && outcome.kind !== "no-bundle" };
|
|
95242
|
+
} catch (err2) {
|
|
95243
|
+
return { line: `Claude Code mods: not installed (${err2 instanceof Error ? err2.message : err2})`, changed: true };
|
|
95244
|
+
}
|
|
95245
|
+
}
|
|
95101
95246
|
async function installClaudeHooks(port) {
|
|
95102
|
-
const { mkdirSync:
|
|
95103
|
-
const { join:
|
|
95104
|
-
const dir =
|
|
95105
|
-
if (!
|
|
95106
|
-
const file2 =
|
|
95247
|
+
const { mkdirSync: mkdirSync12, existsSync: existsSync40, readFileSync: readFileSync43, writeFileSync: writeFileSync30 } = await import("node:fs");
|
|
95248
|
+
const { join: join49 } = await import("node:path");
|
|
95249
|
+
const dir = join49(ROOT, ".claude");
|
|
95250
|
+
if (!existsSync40(dir)) mkdirSync12(dir, { recursive: true });
|
|
95251
|
+
const file2 = join49(dir, "settings.json");
|
|
95107
95252
|
let settings = {};
|
|
95108
|
-
if (
|
|
95253
|
+
if (existsSync40(file2)) {
|
|
95109
95254
|
try {
|
|
95110
|
-
settings = JSON.parse(
|
|
95255
|
+
settings = JSON.parse(readFileSync43(file2, "utf8"));
|
|
95111
95256
|
} catch {
|
|
95112
95257
|
console.error(`refusing to overwrite invalid JSON at ${file2}`);
|
|
95113
95258
|
process.exit(2);
|
|
@@ -95156,11 +95301,12 @@ async function installClaudeHooks(port) {
|
|
|
95156
95301
|
list.push({ hooks: [{ type: "command", command: injectCmd }] });
|
|
95157
95302
|
}
|
|
95158
95303
|
removeProjectStatusLine(settings);
|
|
95159
|
-
|
|
95304
|
+
writeFileSync30(file2, JSON.stringify(settings, null, 2) + "\n", "utf8");
|
|
95160
95305
|
console.log(`installed Claude Code hooks \u2192 ${file2}`);
|
|
95161
95306
|
console.log(` ${ensureStatusLine(port)}`);
|
|
95307
|
+
console.log(` ${installClaudeMods().line}`);
|
|
95162
95308
|
await installClaudeMcpConfig();
|
|
95163
|
-
const claudeMd =
|
|
95309
|
+
const claudeMd = join49(ROOT, "CLAUDE.md");
|
|
95164
95310
|
const recall = writeManagedBlock(claudeMd, { body: RECALL_FIRST_BLOCK });
|
|
95165
95311
|
if (recall.kind === "collision") {
|
|
95166
95312
|
console.warn(
|
|
@@ -95172,15 +95318,15 @@ async function installClaudeHooks(port) {
|
|
|
95172
95318
|
console.log(` endpoint: http://127.0.0.1:${port}/api/hook`);
|
|
95173
95319
|
}
|
|
95174
95320
|
async function installClaudeMcpConfig() {
|
|
95175
|
-
const { mkdirSync:
|
|
95176
|
-
const { join:
|
|
95177
|
-
const file2 =
|
|
95178
|
-
const dir =
|
|
95179
|
-
if (!
|
|
95321
|
+
const { mkdirSync: mkdirSync12, existsSync: existsSync40, readFileSync: readFileSync43, writeFileSync: writeFileSync30 } = await import("node:fs");
|
|
95322
|
+
const { join: join49, dirname: dirname16 } = await import("node:path");
|
|
95323
|
+
const file2 = join49(ROOT, ".mcp.json");
|
|
95324
|
+
const dir = dirname16(file2);
|
|
95325
|
+
if (!existsSync40(dir)) mkdirSync12(dir, { recursive: true });
|
|
95180
95326
|
let cfg = {};
|
|
95181
|
-
if (
|
|
95327
|
+
if (existsSync40(file2)) {
|
|
95182
95328
|
try {
|
|
95183
|
-
cfg = JSON.parse(
|
|
95329
|
+
cfg = JSON.parse(readFileSync43(file2, "utf8"));
|
|
95184
95330
|
} catch {
|
|
95185
95331
|
console.error(`refusing to overwrite invalid JSON at ${file2}`);
|
|
95186
95332
|
process.exit(2);
|
|
@@ -95188,21 +95334,21 @@ async function installClaudeMcpConfig() {
|
|
|
95188
95334
|
}
|
|
95189
95335
|
cfg.mcpServers ??= {};
|
|
95190
95336
|
cfg.mcpServers["errata"] = errataMcpInvocation();
|
|
95191
|
-
|
|
95337
|
+
writeFileSync30(file2, JSON.stringify(cfg, null, 2) + "\n", "utf8");
|
|
95192
95338
|
console.log(`installed Claude Code MCP server config \u2192 ${file2}`);
|
|
95193
95339
|
console.log(` Claude Code will spawn \`errata mcp\` on workspace open.`);
|
|
95194
95340
|
console.log(` Tools: errata.search / locate / neighbors / callers_of / what_uses / show / similar`);
|
|
95195
95341
|
}
|
|
95196
95342
|
async function installCursorMcpConfig() {
|
|
95197
|
-
const { mkdirSync:
|
|
95198
|
-
const { join:
|
|
95199
|
-
const dir =
|
|
95200
|
-
if (!
|
|
95201
|
-
const file2 =
|
|
95343
|
+
const { mkdirSync: mkdirSync12, existsSync: existsSync40, readFileSync: readFileSync43, writeFileSync: writeFileSync30 } = await import("node:fs");
|
|
95344
|
+
const { join: join49 } = await import("node:path");
|
|
95345
|
+
const dir = join49(ROOT, ".cursor");
|
|
95346
|
+
if (!existsSync40(dir)) mkdirSync12(dir, { recursive: true });
|
|
95347
|
+
const file2 = join49(dir, "mcp.json");
|
|
95202
95348
|
let cfg = {};
|
|
95203
|
-
if (
|
|
95349
|
+
if (existsSync40(file2)) {
|
|
95204
95350
|
try {
|
|
95205
|
-
cfg = JSON.parse(
|
|
95351
|
+
cfg = JSON.parse(readFileSync43(file2, "utf8"));
|
|
95206
95352
|
} catch {
|
|
95207
95353
|
console.error(`refusing to overwrite invalid JSON at ${file2}`);
|
|
95208
95354
|
process.exit(2);
|
|
@@ -95210,7 +95356,7 @@ async function installCursorMcpConfig() {
|
|
|
95210
95356
|
}
|
|
95211
95357
|
cfg.mcpServers ??= {};
|
|
95212
95358
|
cfg.mcpServers["errata"] = errataMcpInvocation();
|
|
95213
|
-
|
|
95359
|
+
writeFileSync30(file2, JSON.stringify(cfg, null, 2) + "\n", "utf8");
|
|
95214
95360
|
console.log(`installed Cursor MCP server config \u2192 ${file2}`);
|
|
95215
95361
|
console.log(` Cursor will spawn \`errata mcp\` on workspace open.`);
|
|
95216
95362
|
console.log(` Tools: errata.search / locate / neighbors / callers_of / what_uses`);
|
|
@@ -95221,7 +95367,7 @@ async function installCodexHooks(port) {
|
|
|
95221
95367
|
const gitRoot = nearestGitRoot(process.cwd());
|
|
95222
95368
|
const hookRoot = gitRoot && mainCheckoutOfWorktree(gitRoot) ? gitRoot : ROOT;
|
|
95223
95369
|
const file2 = writeCodexHooks(hookRoot, port);
|
|
95224
|
-
const instructions = writeManagedBlock(
|
|
95370
|
+
const instructions = writeManagedBlock(join48(hookRoot, "AGENTS.md"), {
|
|
95225
95371
|
body: AGENTS_POINTER_BODY,
|
|
95226
95372
|
stable: true
|
|
95227
95373
|
});
|
|
@@ -95414,6 +95560,8 @@ async function cmdDash(args2) {
|
|
|
95414
95560
|
const reindexOnStart = !args2.includes("--no-reindex");
|
|
95415
95561
|
const skipEmbed = !args2.includes("--embed");
|
|
95416
95562
|
const skipWatchers = args2.includes("--no-watch");
|
|
95563
|
+
const mods = installClaudeMods();
|
|
95564
|
+
if (mods.changed) console.log(`[errata] ${mods.line}`);
|
|
95417
95565
|
const handle2 = await startMultiDaemon({
|
|
95418
95566
|
webPort: port,
|
|
95419
95567
|
reindexOnStart,
|
|
@@ -95563,7 +95711,7 @@ async function cmdDash(args2) {
|
|
|
95563
95711
|
const hotspotScanMark = /* @__PURE__ */ new Map();
|
|
95564
95712
|
const HOTSPOT_FANIN = 20;
|
|
95565
95713
|
const runNightlyPass = async (dueIds) => {
|
|
95566
|
-
const yieldToLoop2 = () => new Promise((
|
|
95714
|
+
const yieldToLoop2 = () => new Promise((resolve10) => setImmediate(resolve10));
|
|
95567
95715
|
const fullReclusterPass = nightlyCount++ % FULL_RECLUSTER_EVERY === 0;
|
|
95568
95716
|
const m = dueIds ? await handle2.nightlyFor(dueIds) : await handle2.nightlyAll();
|
|
95569
95717
|
let skillsLearned = 0;
|
|
@@ -95641,9 +95789,9 @@ async function cmdDash(args2) {
|
|
|
95641
95789
|
await yieldToLoop2();
|
|
95642
95790
|
try {
|
|
95643
95791
|
const items = selectDurableMemory(handle2.sharedStore, r.engine.profile, {
|
|
95644
|
-
atCommit: readGitRefState(
|
|
95792
|
+
atCommit: readGitRefState(join48(r.root, ".git")).sha ?? void 0
|
|
95645
95793
|
});
|
|
95646
|
-
const res = bleedRules(
|
|
95794
|
+
const res = bleedRules(join48(r.root, ".claude", "rules"), items);
|
|
95647
95795
|
if (res.written || res.pruned) {
|
|
95648
95796
|
console.log(
|
|
95649
95797
|
`[rules:${r.entry.name}] ${res.written} collective principle(s) \u2192 .claude/rules` + (res.pruned ? `, ${res.pruned} pruned` : "")
|