@wrongstack/tools 0.306.3 → 0.307.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/audit.js +50 -9
- package/dist/auto-proceed-loop-guard.js +8 -2
- package/dist/bash.js +57 -22
- package/dist/builtin.d.ts +6 -6
- package/dist/builtin.js +11315 -9317
- package/dist/clarify.d.ts +32 -0
- package/dist/codebase-index/ast-invariant-engine.d.ts +102 -0
- package/dist/codebase-index/ast-symbol-mutator.d.ts +28 -0
- package/dist/codebase-index/background-indexer.d.ts +9 -0
- package/dist/codebase-index/codebase-ast-replace-tool.d.ts +31 -0
- package/dist/codebase-index/codebase-impact-analysis-tool.d.ts +40 -0
- package/dist/codebase-index/codebase-invariant-check-tool.d.ts +23 -0
- package/dist/codebase-index/codebase-repo-map-tool.d.ts +22 -0
- package/dist/codebase-index/codebase-skeleton-tool.d.ts +36 -0
- package/dist/codebase-index/codebase-targeted-test-tool.d.ts +30 -0
- package/dist/codebase-index/index.d.ts +11 -1
- package/dist/codebase-index/index.js +4141 -1479
- package/dist/codebase-index/project-server-client-state.d.ts +79 -0
- package/dist/codebase-index/project-server-client.d.ts +3 -71
- package/dist/codebase-index/project-server-protocol.d.ts +1 -0
- package/dist/codebase-index/project-server.js +751 -909
- package/dist/codebase-index/repo-map.d.ts +20 -0
- package/dist/codebase-index/skeleton-extractor.d.ts +64 -0
- package/dist/codebase-index/tree-sitter-parser.d.ts +11 -0
- package/dist/codebase-index/worker.js +723 -891
- package/dist/codebase-index/writer-mutations.d.ts +26 -0
- package/dist/codebase-index/writer-refs.d.ts +50 -0
- package/dist/codebase-index/writer-search.d.ts +30 -0
- package/dist/codebase-index/writer.d.ts +2 -320
- package/dist/diff.js +3 -2
- package/dist/document.js +37 -2
- package/dist/e2e.js +3 -2
- package/dist/edit.js +8558 -348
- package/dist/exec.js +76 -22
- package/dist/fetch.js +11 -9
- package/dist/format.js +50 -9
- package/dist/glob.js +8 -3
- package/dist/grep.js +22 -10
- package/dist/index.d.ts +3 -1
- package/dist/index.js +11411 -9440
- package/dist/install.js +50 -9
- package/dist/json.js +91 -17
- package/dist/kanban-board-actions.d.ts +4 -0
- package/dist/kanban-lifecycle-actions.d.ts +4 -0
- package/dist/kanban-serializer.d.ts +21 -0
- package/dist/kanban.js +985 -1034
- package/dist/languages/index.js +17 -10
- package/dist/lint.js +50 -9
- package/dist/logs.js +17 -6
- package/dist/next-steps.d.ts +8 -0
- package/dist/next-steps.js +18 -0
- package/dist/outdated.js +18 -11
- package/dist/pack.js +11308 -9317
- package/dist/patch.js +8301 -77
- package/dist/plan.js +1231 -1281
- package/dist/process-registry.js +14 -8
- package/dist/ps-slash.js +65 -30
- package/dist/read.js +754 -912
- package/dist/replace.js +8456 -195
- package/dist/scaffold.js +36 -1
- package/dist/search.js +21 -15
- package/dist/security-ast-scan-tool.d.ts +43 -0
- package/dist/session-kanban-graph.d.ts +9 -0
- package/dist/session-kanban-sync.d.ts +31 -0
- package/dist/session-kanban.d.ts +5 -141
- package/dist/session-kanban.js +367 -360
- package/dist/task.js +1157 -1207
- package/dist/test.js +50 -9
- package/dist/todo.js +2187 -2237
- package/dist/tool-diff.js +6 -1
- package/dist/tool-summary.js +4 -2
- package/dist/tool-tier.js +11315 -9317
- package/dist/tree.js +36 -1
- package/dist/typecheck.js +51 -10
- package/dist/write.js +8374 -152
- package/package.json +7 -7
package/dist/exec.js
CHANGED
|
@@ -289,9 +289,33 @@ var RULES = [
|
|
|
289
289
|
id: "shell-launcher",
|
|
290
290
|
level: "caution",
|
|
291
291
|
test: (cmd, args) => {
|
|
292
|
-
const launchers = [
|
|
292
|
+
const launchers = [
|
|
293
|
+
"env",
|
|
294
|
+
"timeout",
|
|
295
|
+
"nohup",
|
|
296
|
+
"nice",
|
|
297
|
+
"script",
|
|
298
|
+
"expect",
|
|
299
|
+
"tmux",
|
|
300
|
+
"screen",
|
|
301
|
+
"byobu",
|
|
302
|
+
"dtach"
|
|
303
|
+
];
|
|
293
304
|
if (!launchers.includes(cmd)) return false;
|
|
294
|
-
const shells = [
|
|
305
|
+
const shells = [
|
|
306
|
+
"sh",
|
|
307
|
+
"bash",
|
|
308
|
+
"zsh",
|
|
309
|
+
"fish",
|
|
310
|
+
"python",
|
|
311
|
+
"python3",
|
|
312
|
+
"perl",
|
|
313
|
+
"ruby",
|
|
314
|
+
"node",
|
|
315
|
+
"pwsh",
|
|
316
|
+
"powershell",
|
|
317
|
+
"cmd"
|
|
318
|
+
];
|
|
295
319
|
if (cmd === "env") {
|
|
296
320
|
const prog = args.find((a) => !a.includes("=") && !a.startsWith("-"));
|
|
297
321
|
return prog !== void 0 && shells.includes(prog);
|
|
@@ -487,8 +511,9 @@ async function resolveRealInsideRoot(absPath, ctx) {
|
|
|
487
511
|
}
|
|
488
512
|
throw err;
|
|
489
513
|
}
|
|
490
|
-
|
|
491
|
-
|
|
514
|
+
const candidate = pendingTail.length > 0 ? path2.join(real, ...pendingTail) : real;
|
|
515
|
+
if (isInsideAny(candidate, realRoots)) {
|
|
516
|
+
return candidate;
|
|
492
517
|
}
|
|
493
518
|
throw new Error(
|
|
494
519
|
`Path "${absPath}" resolves through a symlink outside project root "${realRoots[0]}"`
|
|
@@ -887,13 +912,16 @@ function killWin32Tree(pid, opts = {}) {
|
|
|
887
912
|
};
|
|
888
913
|
child.on("error", settle);
|
|
889
914
|
child.on("close", settle);
|
|
890
|
-
timeout = setTimeout(
|
|
891
|
-
|
|
892
|
-
|
|
893
|
-
|
|
894
|
-
|
|
895
|
-
|
|
896
|
-
|
|
915
|
+
timeout = setTimeout(
|
|
916
|
+
() => {
|
|
917
|
+
try {
|
|
918
|
+
child.kill();
|
|
919
|
+
} catch {
|
|
920
|
+
}
|
|
921
|
+
settle();
|
|
922
|
+
},
|
|
923
|
+
Math.max(1, opts.timeoutMs ?? WIN32_TASKKILL_TIMEOUT_MS)
|
|
924
|
+
);
|
|
897
925
|
timeout.unref?.();
|
|
898
926
|
child.unref();
|
|
899
927
|
return true;
|
|
@@ -1067,7 +1095,10 @@ var ProcessRegistryImpl = class {
|
|
|
1067
1095
|
getBreakerCountdown() {
|
|
1068
1096
|
if (this.autoKillArmedAt === null || this.autoKillResetMs <= 0) return null;
|
|
1069
1097
|
const elapsed = Date.now() - this.autoKillArmedAt;
|
|
1070
|
-
return {
|
|
1098
|
+
return {
|
|
1099
|
+
remainingMs: Math.max(0, this.autoKillResetMs - elapsed),
|
|
1100
|
+
totalMs: this.autoKillResetMs
|
|
1101
|
+
};
|
|
1071
1102
|
}
|
|
1072
1103
|
/**
|
|
1073
1104
|
* Subscribe to countdown arm/cancel events. Returns an unsubscribe function.
|
|
@@ -1382,12 +1413,16 @@ async function readRegistryFile(filePath) {
|
|
|
1382
1413
|
}
|
|
1383
1414
|
async function writeRegistryFile(filePath, data) {
|
|
1384
1415
|
const tmpPath = `${filePath}.tmp.${process.pid}`;
|
|
1385
|
-
const content = JSON.stringify(
|
|
1386
|
-
|
|
1387
|
-
|
|
1388
|
-
|
|
1389
|
-
|
|
1390
|
-
|
|
1416
|
+
const content = JSON.stringify(
|
|
1417
|
+
data,
|
|
1418
|
+
(_k, v) => {
|
|
1419
|
+
if (v instanceof Map) {
|
|
1420
|
+
return Array.from(v.entries());
|
|
1421
|
+
}
|
|
1422
|
+
return v;
|
|
1423
|
+
},
|
|
1424
|
+
2
|
|
1425
|
+
);
|
|
1391
1426
|
await fs2.writeFile(tmpPath, content, "utf-8");
|
|
1392
1427
|
await fs2.rename(tmpPath, filePath);
|
|
1393
1428
|
}
|
|
@@ -1415,7 +1450,12 @@ var PersistentProcessRegistry = class {
|
|
|
1415
1450
|
this.lockPath = path4.join(globalRoot, LOCKFILE);
|
|
1416
1451
|
this.baseRegistry = baseRegistry ?? getProcessRegistry();
|
|
1417
1452
|
this.ensureDirectory().catch((err) => {
|
|
1418
|
-
emitStructuredLog(
|
|
1453
|
+
emitStructuredLog(
|
|
1454
|
+
"warn",
|
|
1455
|
+
"process_registry.dir_create_failed",
|
|
1456
|
+
"PersistentProcessRegistry: failed to create .wrongstack directory",
|
|
1457
|
+
err
|
|
1458
|
+
);
|
|
1419
1459
|
});
|
|
1420
1460
|
}
|
|
1421
1461
|
async ensureDirectory() {
|
|
@@ -1606,7 +1646,12 @@ var PersistentProcessRegistry = class {
|
|
|
1606
1646
|
data.lastCleanup = now;
|
|
1607
1647
|
await writeRegistryFile(this.registryPath, data);
|
|
1608
1648
|
} catch (err) {
|
|
1609
|
-
emitStructuredLog(
|
|
1649
|
+
emitStructuredLog(
|
|
1650
|
+
"warn",
|
|
1651
|
+
"process_registry.sync_failed",
|
|
1652
|
+
"PersistentProcessRegistry: sync failed",
|
|
1653
|
+
err
|
|
1654
|
+
);
|
|
1610
1655
|
} finally {
|
|
1611
1656
|
await release();
|
|
1612
1657
|
}
|
|
@@ -1645,7 +1690,12 @@ var PersistentProcessRegistry = class {
|
|
|
1645
1690
|
await writeRegistryFile(this.registryPath, data);
|
|
1646
1691
|
}
|
|
1647
1692
|
} catch (err) {
|
|
1648
|
-
emitStructuredLog(
|
|
1693
|
+
emitStructuredLog(
|
|
1694
|
+
"warn",
|
|
1695
|
+
"process_registry.cleanup_failed",
|
|
1696
|
+
"PersistentProcessRegistry: cleanup failed",
|
|
1697
|
+
err
|
|
1698
|
+
);
|
|
1649
1699
|
} finally {
|
|
1650
1700
|
await release();
|
|
1651
1701
|
}
|
|
@@ -1794,7 +1844,11 @@ async function checkExecKillCommand(cmd, args) {
|
|
|
1794
1844
|
if (filterArg) {
|
|
1795
1845
|
const nameMatch = filterArg.match(/IMAGENAME\s+eq\s+"?([^"\s]+)/i);
|
|
1796
1846
|
if (nameMatch?.[1]) {
|
|
1797
|
-
const result = await checkKillTarget({
|
|
1847
|
+
const result = await checkKillTarget({
|
|
1848
|
+
name: nameMatch[1],
|
|
1849
|
+
signal,
|
|
1850
|
+
cmd: fullCommand
|
|
1851
|
+
});
|
|
1798
1852
|
if (result.blocked) return result;
|
|
1799
1853
|
}
|
|
1800
1854
|
}
|
package/dist/fetch.js
CHANGED
|
@@ -5,10 +5,7 @@ import TurndownService from "turndown";
|
|
|
5
5
|
// src/_fetch-guard.ts
|
|
6
6
|
import * as dns from "node:dns/promises";
|
|
7
7
|
import * as net from "node:net";
|
|
8
|
-
import {
|
|
9
|
-
isPrivateIPv4,
|
|
10
|
-
isPrivateIPv6
|
|
11
|
-
} from "@wrongstack/core/utils";
|
|
8
|
+
import { isPrivateIPv4, isPrivateIPv6 } from "@wrongstack/core/utils";
|
|
12
9
|
import { FetchError, ToolValidationError } from "@wrongstack/core/types";
|
|
13
10
|
import { Agent, fetch as undiciFetch } from "undici";
|
|
14
11
|
var nativeGlobalFetch = globalThis.fetch;
|
|
@@ -275,11 +272,16 @@ var fetchTool = {
|
|
|
275
272
|
await assertNotPrivate(u.hostname);
|
|
276
273
|
yield { type: "log", text: `GET ${input.url}` };
|
|
277
274
|
const ctrl = new AbortController();
|
|
278
|
-
const timer = setTimeout(
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
275
|
+
const timer = setTimeout(
|
|
276
|
+
() => ctrl.abort(
|
|
277
|
+
new ToolError({
|
|
278
|
+
message: "fetch timeout",
|
|
279
|
+
code: "TOOL_TIMEOUT",
|
|
280
|
+
toolName: "fetch"
|
|
281
|
+
})
|
|
282
|
+
),
|
|
283
|
+
TIMEOUT_MS
|
|
284
|
+
);
|
|
283
285
|
const combined = combineSignals([opts.signal, ctrl.signal]);
|
|
284
286
|
try {
|
|
285
287
|
let res;
|
package/dist/format.js
CHANGED
|
@@ -422,13 +422,16 @@ function killWin32Tree(pid, opts = {}) {
|
|
|
422
422
|
};
|
|
423
423
|
child.on("error", settle);
|
|
424
424
|
child.on("close", settle);
|
|
425
|
-
timeout = setTimeout(
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
425
|
+
timeout = setTimeout(
|
|
426
|
+
() => {
|
|
427
|
+
try {
|
|
428
|
+
child.kill();
|
|
429
|
+
} catch {
|
|
430
|
+
}
|
|
431
|
+
settle();
|
|
432
|
+
},
|
|
433
|
+
Math.max(1, opts.timeoutMs ?? WIN32_TASKKILL_TIMEOUT_MS)
|
|
434
|
+
);
|
|
432
435
|
timeout.unref?.();
|
|
433
436
|
child.unref();
|
|
434
437
|
return true;
|
|
@@ -602,7 +605,10 @@ var ProcessRegistryImpl = class {
|
|
|
602
605
|
getBreakerCountdown() {
|
|
603
606
|
if (this.autoKillArmedAt === null || this.autoKillResetMs <= 0) return null;
|
|
604
607
|
const elapsed = Date.now() - this.autoKillArmedAt;
|
|
605
|
-
return {
|
|
608
|
+
return {
|
|
609
|
+
remainingMs: Math.max(0, this.autoKillResetMs - elapsed),
|
|
610
|
+
totalMs: this.autoKillResetMs
|
|
611
|
+
};
|
|
606
612
|
}
|
|
607
613
|
/**
|
|
608
614
|
* Subscribe to countdown arm/cancel events. Returns an unsubscribe function.
|
|
@@ -1041,6 +1047,7 @@ function utf8Prefix(text, maxBytes) {
|
|
|
1041
1047
|
}
|
|
1042
1048
|
|
|
1043
1049
|
// src/_util.ts
|
|
1050
|
+
import * as fsp2 from "node:fs/promises";
|
|
1044
1051
|
import * as path3 from "node:path";
|
|
1045
1052
|
import * as Core from "@wrongstack/core/utils";
|
|
1046
1053
|
function resolvePath(input, ctx) {
|
|
@@ -1064,6 +1071,40 @@ function ensureInsideRoot(absPath, ctx) {
|
|
|
1064
1071
|
function safeResolve(input, ctx) {
|
|
1065
1072
|
return ensureInsideRoot(resolvePath(input, ctx), ctx);
|
|
1066
1073
|
}
|
|
1074
|
+
async function resolveRealInsideRoot(absPath, ctx) {
|
|
1075
|
+
if (ctx.allowOutsideProjectRoot) return absPath;
|
|
1076
|
+
const realRoots = await Promise.all(
|
|
1077
|
+
allowedRoots(ctx).map((r) => fsp2.realpath(r).catch(() => path3.resolve(r)))
|
|
1078
|
+
);
|
|
1079
|
+
let probe = absPath;
|
|
1080
|
+
const pendingTail = [];
|
|
1081
|
+
for (; ; ) {
|
|
1082
|
+
let real;
|
|
1083
|
+
try {
|
|
1084
|
+
real = await fsp2.realpath(probe);
|
|
1085
|
+
} catch (err) {
|
|
1086
|
+
if (err.code === "ENOENT") {
|
|
1087
|
+
const parent = path3.dirname(probe);
|
|
1088
|
+
if (parent === probe) return absPath;
|
|
1089
|
+
pendingTail.unshift(path3.basename(probe));
|
|
1090
|
+
probe = parent;
|
|
1091
|
+
continue;
|
|
1092
|
+
}
|
|
1093
|
+
throw err;
|
|
1094
|
+
}
|
|
1095
|
+
const candidate = pendingTail.length > 0 ? path3.join(real, ...pendingTail) : real;
|
|
1096
|
+
if (isInsideAny(candidate, realRoots)) {
|
|
1097
|
+
return candidate;
|
|
1098
|
+
}
|
|
1099
|
+
throw new Error(
|
|
1100
|
+
`Path "${absPath}" resolves through a symlink outside project root "${realRoots[0]}"`
|
|
1101
|
+
);
|
|
1102
|
+
}
|
|
1103
|
+
}
|
|
1104
|
+
async function safeResolveReal(input, ctx) {
|
|
1105
|
+
const abs = safeResolve(input, ctx);
|
|
1106
|
+
return await resolveRealInsideRoot(abs, ctx);
|
|
1107
|
+
}
|
|
1067
1108
|
var COMMAND_OUTPUT_MAX_BYTES = 32768;
|
|
1068
1109
|
var REPEAT_RUN_THRESHOLD = 3;
|
|
1069
1110
|
function collapseCarriageReturns(text) {
|
|
@@ -3590,7 +3631,7 @@ var formatTool = {
|
|
|
3590
3631
|
return final;
|
|
3591
3632
|
},
|
|
3592
3633
|
async *executeStream(input, ctx, opts) {
|
|
3593
|
-
const cwd = input.cwd ?
|
|
3634
|
+
const cwd = input.cwd ? await safeResolveReal(input.cwd, ctx) : ctx.cwd;
|
|
3594
3635
|
const fixer = input.fixer ?? "auto";
|
|
3595
3636
|
if (fixer === "auto" && !input.files) {
|
|
3596
3637
|
const op = input.check ? "format-check" : "format-write";
|
package/dist/glob.js
CHANGED
|
@@ -125,8 +125,9 @@ async function resolveRealInsideRoot(absPath, ctx) {
|
|
|
125
125
|
}
|
|
126
126
|
throw err;
|
|
127
127
|
}
|
|
128
|
-
|
|
129
|
-
|
|
128
|
+
const candidate = pendingTail.length > 0 ? path2.join(real, ...pendingTail) : real;
|
|
129
|
+
if (isInsideAny(candidate, realRoots)) {
|
|
130
|
+
return candidate;
|
|
130
131
|
}
|
|
131
132
|
throw new Error(
|
|
132
133
|
`Path "${absPath}" resolves through a symlink outside project root "${realRoots[0]}"`
|
|
@@ -266,7 +267,11 @@ var globTool = {
|
|
|
266
267
|
await mapWithConcurrency(matchedFiles, WALK_CONCURRENCY, pushResult);
|
|
267
268
|
if (truncated) return;
|
|
268
269
|
const remainingSubdirs = truncated ? [] : subdirs;
|
|
269
|
-
await mapWithConcurrency(
|
|
270
|
+
await mapWithConcurrency(
|
|
271
|
+
remainingSubdirs,
|
|
272
|
+
WALK_CONCURRENCY,
|
|
273
|
+
({ full, rel }) => walk(full, rel)
|
|
274
|
+
);
|
|
270
275
|
};
|
|
271
276
|
await walk(base, "");
|
|
272
277
|
results.sort((a, b) => b.mtime - a.mtime);
|
package/dist/grep.js
CHANGED
|
@@ -199,8 +199,9 @@ async function resolveRealInsideRoot(absPath, ctx) {
|
|
|
199
199
|
}
|
|
200
200
|
throw err;
|
|
201
201
|
}
|
|
202
|
-
|
|
203
|
-
|
|
202
|
+
const candidate = pendingTail.length > 0 ? path.join(real, ...pendingTail) : real;
|
|
203
|
+
if (isInsideAny(candidate, realRoots)) {
|
|
204
|
+
return candidate;
|
|
204
205
|
}
|
|
205
206
|
throw new Error(
|
|
206
207
|
`Path "${absPath}" resolves through a symlink outside project root "${realRoots[0]}"`
|
|
@@ -405,7 +406,10 @@ async function* runRgStream(input, base, mode, limit, signal) {
|
|
|
405
406
|
args.push("--glob", `!${ignored}/**`, "--glob", `!**/${ignored}/**`);
|
|
406
407
|
}
|
|
407
408
|
const gitignorePath = path3.join(base, ".gitignore");
|
|
408
|
-
if (await fs2.access(gitignorePath).then(
|
|
409
|
+
if (await fs2.access(gitignorePath).then(
|
|
410
|
+
() => true,
|
|
411
|
+
() => false
|
|
412
|
+
)) {
|
|
409
413
|
args.push("--ignore-file", gitignorePath);
|
|
410
414
|
}
|
|
411
415
|
if (input.glob) args.push("--glob", input.glob);
|
|
@@ -439,14 +443,12 @@ async function* runRgStream(input, base, mode, limit, signal) {
|
|
|
439
443
|
}
|
|
440
444
|
};
|
|
441
445
|
const pauseIfFlooded = () => {
|
|
442
|
-
if (paused || queue.length < RG_MAX_QUEUE_CHUNKS && queuedChars < RG_MAX_QUEUE_CHARS)
|
|
443
|
-
return;
|
|
446
|
+
if (paused || queue.length < RG_MAX_QUEUE_CHUNKS && queuedChars < RG_MAX_QUEUE_CHARS) return;
|
|
444
447
|
paused = true;
|
|
445
448
|
child.stdout?.pause();
|
|
446
449
|
};
|
|
447
450
|
const resumeIfDrained = () => {
|
|
448
|
-
if (!paused || queue.length >= RG_MAX_QUEUE_CHUNKS || queuedChars >= RG_MAX_QUEUE_CHARS)
|
|
449
|
-
return;
|
|
451
|
+
if (!paused || queue.length >= RG_MAX_QUEUE_CHUNKS || queuedChars >= RG_MAX_QUEUE_CHARS) return;
|
|
450
452
|
paused = false;
|
|
451
453
|
child.stdout?.resume();
|
|
452
454
|
};
|
|
@@ -606,7 +608,12 @@ async function runNative(input, base, mode, limit, signal) {
|
|
|
606
608
|
const buffer = Buffer.allocUnsafe(Math.min(NATIVE_READ_CHUNK_BYTES, maxBytes));
|
|
607
609
|
while (!stopped && !signal.aborted && bytesReadTotal < maxBytes) {
|
|
608
610
|
const remaining = maxBytes - bytesReadTotal;
|
|
609
|
-
const { bytesRead } = await file.read(
|
|
611
|
+
const { bytesRead } = await file.read(
|
|
612
|
+
buffer,
|
|
613
|
+
0,
|
|
614
|
+
Math.min(buffer.length, remaining),
|
|
615
|
+
null
|
|
616
|
+
);
|
|
610
617
|
if (bytesRead === 0) break;
|
|
611
618
|
const chunk = buffer.subarray(0, bytesRead);
|
|
612
619
|
if (!binaryChecked) {
|
|
@@ -664,7 +671,8 @@ async function runNative(input, base, mode, limit, signal) {
|
|
|
664
671
|
if (mode === "files_with_matches" && matches.length >= limit) stopped = true;
|
|
665
672
|
}
|
|
666
673
|
if (mode === "content" && matches.length >= limit) stopped = true;
|
|
667
|
-
if (mode === "count" && matches.length >= limit && (countOnlyFirstHit || mode !== "count"))
|
|
674
|
+
if (mode === "count" && matches.length >= limit && (countOnlyFirstHit || mode !== "count"))
|
|
675
|
+
stopped = true;
|
|
668
676
|
} finally {
|
|
669
677
|
await file.close();
|
|
670
678
|
}
|
|
@@ -695,7 +703,11 @@ async function runNative(input, base, mode, limit, signal) {
|
|
|
695
703
|
files.push({ full, name: e.name });
|
|
696
704
|
}
|
|
697
705
|
}
|
|
698
|
-
await mapWithConcurrency(
|
|
706
|
+
await mapWithConcurrency(
|
|
707
|
+
files,
|
|
708
|
+
NATIVE_SCAN_CONCURRENCY,
|
|
709
|
+
({ full, name }) => scanFile(full, name)
|
|
710
|
+
);
|
|
699
711
|
await mapWithConcurrency(
|
|
700
712
|
subdirs,
|
|
701
713
|
Math.min(16, NATIVE_SCAN_CONCURRENCY),
|
package/dist/index.d.ts
CHANGED
|
@@ -8,7 +8,8 @@ export * from './browser/index.js';
|
|
|
8
8
|
export { builtinTools, OFF_ONLY_TOOLS, OPTIONAL_TOOLS, TIER1_TOOLS, TIER2_TOOLS, TIER3_TOOLS, } from './builtin.js';
|
|
9
9
|
export { CircuitBreaker, type CircuitBreakerConfig, type CircuitBreakerSnapshot, } from './circuit-breaker.js';
|
|
10
10
|
export type { CircuitSnapshot, CircuitState, CodeMapGraph, DeadCodeScanInput, DeadCodeScanOutput, DeadFile, DeadPackage, DeadSymbol, GraphEdge, GraphNode, ProjectIndexDaemonAvailability, ProjectIndexServerActivity, ProjectIndexServerClientHealth, ProjectIndexServerConnectionState, ProjectIndexServerConnectionStatus, ProjectIndexServerHealth, } from './codebase-index/index.js';
|
|
11
|
-
export {
|
|
11
|
+
export { clarifyTool, type ClarifyQuestionInput, type ClarifyOutput, } from './clarify.js';
|
|
12
|
+
export { CircuitOpenError, cancelPendingReindexes, checkCodebaseIndexServerHealth, codebaseAstReplaceTool, codebaseImpactAnalysisTool, codebaseIndexStats, codebaseIndexTool, codebaseRepoMapTool, codebaseSearchTool, codebaseSkeletonTool, codebaseStatsTool, codebaseTargetedTestTool, deadCodeScanTool, enqueueReindex, ensureCodebaseIndexServer, extractDirectorySkeleton, extractFileSkeleton, generateRepoMap, replaceSymbolInFile, type FileSkeletonResult, type MutateSymbolOptions, type MutateSymbolResult, type RepoMapOptions, type RepoMapResult, type SkeletonOptions, type SkeletonSymbolRange, fileGraphService, getIndexState, IndexCircuitBreaker, IndexTimeoutError, indexCircuitBreaker, isIndexableFile, isIndexing, isIndexReady, onIndexStateChange, packageGraphService, resetIndexCircuitBreaker, resolveProjectIndexDaemonAvailability, runDeadCodeScan, runStartupIndex, searchCodebaseIndex, shutdownCodebaseIndexHost, shutdownCodebaseIndexServer, symbolGraphService, } from './codebase-index/index.js';
|
|
12
13
|
export { designTool } from './design.js';
|
|
13
14
|
export { diffTool } from './diff.js';
|
|
14
15
|
export { documentTool } from './document.js';
|
|
@@ -43,6 +44,7 @@ export { readTool } from './read.js';
|
|
|
43
44
|
export { replaceTool } from './replace.js';
|
|
44
45
|
export { scaffoldTool } from './scaffold.js';
|
|
45
46
|
export { searchTool } from './search.js';
|
|
47
|
+
export { analyzeSecurityAndPerformance, securityAstScanTool, type SecurityFinding, type SecurityScanInput, type SecurityScanOutput, } from './security-ast-scan-tool.js';
|
|
46
48
|
export { applySessionKanbanBoardToTodos, applySessionKanbanTaskToSource, attachSessionKanbanMirror, ensureSessionKanbanBoard, hydrateSessionKanban, mirrorSessionPlanToKanban, mirrorSessionTasksToKanban, mirrorSessionTodosToKanban, projectSessionPlanToKanban, projectSessionTasksToKanban, projectSessionTodosToKanban, rebindSessionKanbanTask, SESSION_KANBAN_COLUMNS, } from './session-kanban.js';
|
|
47
49
|
export { makeSkillTool } from './skill.js';
|
|
48
50
|
export { taskTool } from './task.js';
|