@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.
Files changed (76) hide show
  1. package/dist/audit.js +50 -9
  2. package/dist/auto-proceed-loop-guard.js +8 -2
  3. package/dist/bash.js +57 -22
  4. package/dist/builtin.d.ts +6 -6
  5. package/dist/builtin.js +11315 -9317
  6. package/dist/clarify.d.ts +32 -0
  7. package/dist/codebase-index/ast-invariant-engine.d.ts +102 -0
  8. package/dist/codebase-index/ast-symbol-mutator.d.ts +28 -0
  9. package/dist/codebase-index/background-indexer.d.ts +9 -0
  10. package/dist/codebase-index/codebase-ast-replace-tool.d.ts +31 -0
  11. package/dist/codebase-index/codebase-impact-analysis-tool.d.ts +40 -0
  12. package/dist/codebase-index/codebase-invariant-check-tool.d.ts +23 -0
  13. package/dist/codebase-index/codebase-repo-map-tool.d.ts +22 -0
  14. package/dist/codebase-index/codebase-skeleton-tool.d.ts +36 -0
  15. package/dist/codebase-index/codebase-targeted-test-tool.d.ts +30 -0
  16. package/dist/codebase-index/index.d.ts +11 -1
  17. package/dist/codebase-index/index.js +4141 -1479
  18. package/dist/codebase-index/project-server-client-state.d.ts +79 -0
  19. package/dist/codebase-index/project-server-client.d.ts +3 -71
  20. package/dist/codebase-index/project-server-protocol.d.ts +1 -0
  21. package/dist/codebase-index/project-server.js +751 -909
  22. package/dist/codebase-index/repo-map.d.ts +20 -0
  23. package/dist/codebase-index/skeleton-extractor.d.ts +64 -0
  24. package/dist/codebase-index/tree-sitter-parser.d.ts +11 -0
  25. package/dist/codebase-index/worker.js +723 -891
  26. package/dist/codebase-index/writer-mutations.d.ts +26 -0
  27. package/dist/codebase-index/writer-refs.d.ts +50 -0
  28. package/dist/codebase-index/writer-search.d.ts +30 -0
  29. package/dist/codebase-index/writer.d.ts +2 -320
  30. package/dist/diff.js +3 -2
  31. package/dist/document.js +37 -2
  32. package/dist/e2e.js +3 -2
  33. package/dist/edit.js +8558 -348
  34. package/dist/exec.js +76 -22
  35. package/dist/fetch.js +11 -9
  36. package/dist/format.js +50 -9
  37. package/dist/glob.js +8 -3
  38. package/dist/grep.js +22 -10
  39. package/dist/index.d.ts +3 -1
  40. package/dist/index.js +11411 -9440
  41. package/dist/install.js +50 -9
  42. package/dist/json.js +91 -17
  43. package/dist/kanban-board-actions.d.ts +4 -0
  44. package/dist/kanban-lifecycle-actions.d.ts +4 -0
  45. package/dist/kanban-serializer.d.ts +21 -0
  46. package/dist/kanban.js +985 -1034
  47. package/dist/languages/index.js +17 -10
  48. package/dist/lint.js +50 -9
  49. package/dist/logs.js +17 -6
  50. package/dist/next-steps.d.ts +8 -0
  51. package/dist/next-steps.js +18 -0
  52. package/dist/outdated.js +18 -11
  53. package/dist/pack.js +11308 -9317
  54. package/dist/patch.js +8301 -77
  55. package/dist/plan.js +1231 -1281
  56. package/dist/process-registry.js +14 -8
  57. package/dist/ps-slash.js +65 -30
  58. package/dist/read.js +754 -912
  59. package/dist/replace.js +8456 -195
  60. package/dist/scaffold.js +36 -1
  61. package/dist/search.js +21 -15
  62. package/dist/security-ast-scan-tool.d.ts +43 -0
  63. package/dist/session-kanban-graph.d.ts +9 -0
  64. package/dist/session-kanban-sync.d.ts +31 -0
  65. package/dist/session-kanban.d.ts +5 -141
  66. package/dist/session-kanban.js +367 -360
  67. package/dist/task.js +1157 -1207
  68. package/dist/test.js +50 -9
  69. package/dist/todo.js +2187 -2237
  70. package/dist/tool-diff.js +6 -1
  71. package/dist/tool-summary.js +4 -2
  72. package/dist/tool-tier.js +11315 -9317
  73. package/dist/tree.js +36 -1
  74. package/dist/typecheck.js +51 -10
  75. package/dist/write.js +8374 -152
  76. 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 = ["env", "timeout", "nohup", "nice", "script", "expect", "tmux", "screen", "byobu", "dtach"];
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 = ["sh", "bash", "zsh", "fish", "python", "python3", "perl", "ruby", "node", "pwsh", "powershell", "cmd"];
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
- if (isInsideAny(real, realRoots)) {
491
- return pendingTail.length > 0 ? path2.join(real, ...pendingTail) : real;
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
- try {
892
- child.kill();
893
- } catch {
894
- }
895
- settle();
896
- }, Math.max(1, opts.timeoutMs ?? WIN32_TASKKILL_TIMEOUT_MS));
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 { remainingMs: Math.max(0, this.autoKillResetMs - elapsed), totalMs: this.autoKillResetMs };
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(data, (_k, v) => {
1386
- if (v instanceof Map) {
1387
- return Array.from(v.entries());
1388
- }
1389
- return v;
1390
- }, 2);
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("warn", "process_registry.dir_create_failed", "PersistentProcessRegistry: failed to create .wrongstack directory", err);
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("warn", "process_registry.sync_failed", "PersistentProcessRegistry: sync failed", err);
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("warn", "process_registry.cleanup_failed", "PersistentProcessRegistry: cleanup failed", err);
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({ name: nameMatch[1], signal, cmd: fullCommand });
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(() => ctrl.abort(new ToolError({
279
- message: "fetch timeout",
280
- code: "TOOL_TIMEOUT",
281
- toolName: "fetch"
282
- })), TIMEOUT_MS);
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
- try {
427
- child.kill();
428
- } catch {
429
- }
430
- settle();
431
- }, Math.max(1, opts.timeoutMs ?? WIN32_TASKKILL_TIMEOUT_MS));
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 { remainingMs: Math.max(0, this.autoKillResetMs - elapsed), totalMs: this.autoKillResetMs };
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 ? safeResolve(input.cwd, ctx) : ctx.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
- if (isInsideAny(real, realRoots)) {
129
- return pendingTail.length > 0 ? path2.join(real, ...pendingTail) : real;
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(remainingSubdirs, WALK_CONCURRENCY, ({ full, rel }) => walk(full, rel));
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
- if (isInsideAny(real, realRoots)) {
203
- return pendingTail.length > 0 ? path.join(real, ...pendingTail) : real;
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(() => true, () => false)) {
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(buffer, 0, Math.min(buffer.length, remaining), null);
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")) stopped = true;
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(files, NATIVE_SCAN_CONCURRENCY, ({ full, name }) => scanFile(full, name));
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 { CircuitOpenError, cancelPendingReindexes, checkCodebaseIndexServerHealth, codebaseIndexStats, codebaseIndexTool, codebaseSearchTool, codebaseStatsTool, deadCodeScanTool, enqueueReindex, ensureCodebaseIndexServer, fileGraphService, getIndexState, IndexCircuitBreaker, IndexTimeoutError, indexCircuitBreaker, isIndexableFile, isIndexing, isIndexReady, onIndexStateChange, packageGraphService, resetIndexCircuitBreaker, resolveProjectIndexDaemonAvailability, runDeadCodeScan, runStartupIndex, searchCodebaseIndex, shutdownCodebaseIndexHost, shutdownCodebaseIndexServer, symbolGraphService, } from './codebase-index/index.js';
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';