@wrongstack/tools 0.287.0 → 0.289.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 (93) hide show
  1. package/dist/_fetch-guard.d.ts.map +1 -1
  2. package/dist/_redact-command.d.ts.map +1 -1
  3. package/dist/_spawn-stream.d.ts.map +1 -1
  4. package/dist/audit.js +61 -14
  5. package/dist/audit.js.map +3 -3
  6. package/dist/bash.d.ts +1 -1
  7. package/dist/bash.d.ts.map +1 -1
  8. package/dist/bash.js +97 -19
  9. package/dist/bash.js.map +3 -3
  10. package/dist/builtin.d.ts +12 -10
  11. package/dist/builtin.d.ts.map +1 -1
  12. package/dist/builtin.js +1620 -803
  13. package/dist/builtin.js.map +3 -3
  14. package/dist/codebase-index/background-indexer.d.ts.map +1 -1
  15. package/dist/codebase-index/bm25.d.ts +1 -2
  16. package/dist/codebase-index/bm25.d.ts.map +1 -1
  17. package/dist/codebase-index/codebase-index-tool.d.ts.map +1 -1
  18. package/dist/codebase-index/codebase-search-tool.d.ts.map +1 -1
  19. package/dist/codebase-index/codebase-stats-tool.d.ts +7 -0
  20. package/dist/codebase-index/codebase-stats-tool.d.ts.map +1 -1
  21. package/dist/codebase-index/index-service.d.ts +11 -1
  22. package/dist/codebase-index/index-service.d.ts.map +1 -1
  23. package/dist/codebase-index/index.d.ts +2 -1
  24. package/dist/codebase-index/index.d.ts.map +1 -1
  25. package/dist/codebase-index/index.js +749 -192
  26. package/dist/codebase-index/index.js.map +3 -3
  27. package/dist/codebase-index/indexer.d.ts.map +1 -1
  28. package/dist/codebase-index/schema.d.ts +43 -1
  29. package/dist/codebase-index/schema.d.ts.map +1 -1
  30. package/dist/codebase-index/ts-parser.d.ts.map +1 -1
  31. package/dist/codebase-index/worker-protocol.d.ts +1 -0
  32. package/dist/codebase-index/worker-protocol.d.ts.map +1 -1
  33. package/dist/codebase-index/worker.js +610 -152
  34. package/dist/codebase-index/worker.js.map +3 -3
  35. package/dist/codebase-index/writer.d.ts +27 -1
  36. package/dist/codebase-index/writer.d.ts.map +1 -1
  37. package/dist/e2e.js +477 -0
  38. package/dist/e2e.js.map +7 -0
  39. package/dist/exec.d.ts +1 -1
  40. package/dist/exec.d.ts.map +1 -1
  41. package/dist/exec.js +60 -5
  42. package/dist/exec.js.map +3 -3
  43. package/dist/fetch.js +2 -2
  44. package/dist/fetch.js.map +2 -2
  45. package/dist/format.js +61 -14
  46. package/dist/format.js.map +3 -3
  47. package/dist/glob.js +2 -2
  48. package/dist/glob.js.map +1 -1
  49. package/dist/grep.d.ts.map +1 -1
  50. package/dist/grep.js +2 -2
  51. package/dist/grep.js.map +2 -2
  52. package/dist/index.d.ts +3 -2
  53. package/dist/index.d.ts.map +1 -1
  54. package/dist/index.js +1786 -809
  55. package/dist/index.js.map +3 -3
  56. package/dist/install.js +61 -14
  57. package/dist/install.js.map +3 -3
  58. package/dist/kanban.d.ts +11 -2
  59. package/dist/kanban.d.ts.map +1 -1
  60. package/dist/kanban.js +695 -571
  61. package/dist/kanban.js.map +3 -3
  62. package/dist/languages/detect.d.ts.map +1 -1
  63. package/dist/languages/index.js +61 -14
  64. package/dist/languages/index.js.map +3 -3
  65. package/dist/languages/types.d.ts +7 -0
  66. package/dist/languages/types.d.ts.map +1 -1
  67. package/dist/lint.js +61 -14
  68. package/dist/lint.js.map +3 -3
  69. package/dist/outdated.js +61 -14
  70. package/dist/outdated.js.map +3 -3
  71. package/dist/pack.js +1617 -800
  72. package/dist/pack.js.map +3 -3
  73. package/dist/plan.js +4 -0
  74. package/dist/plan.js.map +2 -2
  75. package/dist/process-registry.js +12 -5
  76. package/dist/process-registry.js.map +2 -2
  77. package/dist/search.js +2 -2
  78. package/dist/search.js.map +2 -2
  79. package/dist/session-kanban.d.ts +9 -0
  80. package/dist/session-kanban.d.ts.map +1 -1
  81. package/dist/session-kanban.js +137 -0
  82. package/dist/session-kanban.js.map +2 -2
  83. package/dist/task.js +4 -0
  84. package/dist/task.js.map +2 -2
  85. package/dist/test.js +61 -14
  86. package/dist/test.js.map +3 -3
  87. package/dist/todo.js +4 -0
  88. package/dist/todo.js.map +2 -2
  89. package/dist/tree.js +2 -2
  90. package/dist/tree.js.map +1 -1
  91. package/dist/typecheck.js +61 -14
  92. package/dist/typecheck.js.map +3 -3
  93. package/package.json +7 -3
package/dist/bash.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import type { Tool } from '@wrongstack/core';
1
+ import { type Tool } from '@wrongstack/core';
2
2
  interface BashInput {
3
3
  command: string;
4
4
  timeout_ms?: number | undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"bash.d.ts","sourceRoot":"","sources":["../src/bash.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAW,IAAI,EAAmB,MAAM,kBAAkB,CAAC;AASvE,UAAU,SAAS;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,UAAU,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CAClC;AAED,UAAU,UAAU;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,SAAS,EAAE,OAAO,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAChC,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC5B;AA4BD,eAAO,MAAM,QAAQ,EAAE,IAAI,CAAC,SAAS,EAAE,UAAU,CAkmBhD,CAAC;AAGF,YAAY,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC"}
1
+ {"version":3,"file":"bash.d.ts","sourceRoot":"","sources":["../src/bash.ts"],"names":[],"mappings":"AAEA,OAAO,EAKL,KAAK,IAAI,EAEV,MAAM,kBAAkB,CAAC;AAS1B,UAAU,SAAS;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,UAAU,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CAClC;AAED,UAAU,UAAU;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,SAAS,EAAE,OAAO,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAChC,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC5B;AA4BD,eAAO,MAAM,QAAQ,EAAE,IAAI,CAAC,SAAS,EAAE,UAAU,CAoqBhD,CAAC;AAGF,YAAY,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC"}
package/dist/bash.js CHANGED
@@ -1,6 +1,11 @@
1
1
  // src/bash.ts
2
2
  import { spawn as spawn2 } from "node:child_process";
3
3
  import * as os4 from "node:os";
4
+ import {
5
+ emitProcessCompleted,
6
+ emitProcessOutput,
7
+ emitProcessStarted
8
+ } from "@wrongstack/core";
4
9
 
5
10
  // src/_env.ts
6
11
  import { buildChildEnv } from "@wrongstack/core";
@@ -386,9 +391,14 @@ import { expectDefined } from "@wrongstack/core";
386
391
  var SENSITIVE_FLAG_PATTERNS = [
387
392
  // --flag=value or --flag "value" (value captured up to next space or comma)
388
393
  /--(?:token|password|passwd|pwd|secret|api[-_]?key|api[-_]?secret|auth|credential|private[-_]?key|access[-_]?key|github[-_]?token|gh[-_]?token|bearer|jwt|oauth|pin|pincode|passphrase|access[-_]?token)(?:[=\s,][^\s]*)?/gi,
389
- // -f "value" style short flags
390
- /(?<!\w)-t(?:\s+|\s*=\s*)[^\s,]+/,
391
- /(?<!\w)-(?:p|password)(?:\s+|\s*=\s*)[^\s,]+/gi,
394
+ // -t short flag (token): attached (-tVALUE), separated (-t VALUE), or -t=VALUE.
395
+ // (?<![-\w]) anchors to a token start so we don't match the `-t` inside `--token`.
396
+ // NOTE: synced with @wrongstack/core observability/redact-command.ts.
397
+ /(?<![-\w])-t(?:[=\s]+)?[^\s,-]+/,
398
+ // -p|-password|-a (redis auth) short flags: attached + separated + =value.
399
+ // Same token-start anchor; over-redaction is an accepted tradeoff for a
400
+ // redaction function. Synced with core copy.
401
+ /(?<![-\w])-(?:password|p|a)(?:[=\s]+)?[^\s,-]+/gi,
392
402
  // env var–style secrets: TOKEN=x, API_KEY=y, etc.
393
403
  /(?:TOKEN|API_KEY|API_SECRET|AUTH_TOKEN|GITHUB_TOKEN|GH_TOKEN|BEARER|JWT|OAUTH|CREDENTIAL|SECRET|PRIVATE_KEY|PASSWORD|PASSWD)\s*[=:]\s*[^\s,]+/gi,
394
404
  // Generic high-entropy look: base64 strings >32 chars or hex strings >32 digits — but only
@@ -406,8 +416,10 @@ function redactCommand(cmd) {
406
416
  const flag = match.slice(0, match.indexOf(expectDefined(delim)) + 1);
407
417
  return `${flag}[REDACTED]`;
408
418
  }
409
- const flagEnd = match.match(/^--?[a-zA-Z][a-zA-Z0-9_-]*/)?.[0] ?? match;
410
- return `${flagEnd}=**redacted**`;
419
+ if (match.startsWith("--")) {
420
+ return match;
421
+ }
422
+ return `${match.slice(0, 2)}[REDACTED]`;
411
423
  });
412
424
  }
413
425
  return result;
@@ -1669,6 +1681,32 @@ var bashTool = {
1669
1681
  }
1670
1682
  }
1671
1683
  const pid2 = child2.pid;
1684
+ let stdoutBytes2 = 0;
1685
+ let stderrBytes2 = 0;
1686
+ let telemetryCompleted2 = false;
1687
+ emitProcessStarted({
1688
+ ...pid2 !== void 0 ? { pid: pid2 } : {},
1689
+ parentPid: process.pid,
1690
+ command: redactCommand(`${shell} ${args.join(" ")}`),
1691
+ args: redactCommand(args.join(" ")).split(" ").filter(Boolean),
1692
+ cwd: ctx.projectRoot,
1693
+ background: true,
1694
+ startedAt: new Date(startedAt).toISOString()
1695
+ });
1696
+ const completeBackground = (exitCode, signal) => {
1697
+ if (telemetryCompleted2) return;
1698
+ telemetryCompleted2 = true;
1699
+ emitProcessCompleted({
1700
+ ...pid2 !== void 0 ? { pid: pid2 } : {},
1701
+ exitCode,
1702
+ ...signal ? { signal } : {},
1703
+ durationMs: Date.now() - startedAt,
1704
+ stdoutBytes: stdoutBytes2,
1705
+ stderrBytes: stderrBytes2,
1706
+ timedOut: false,
1707
+ endedAt: (/* @__PURE__ */ new Date()).toISOString()
1708
+ });
1709
+ };
1672
1710
  if (typeof pid2 === "number") {
1673
1711
  registry.register({
1674
1712
  pid: pid2,
@@ -1681,7 +1719,10 @@ var bashTool = {
1681
1719
  });
1682
1720
  child2.on("close", () => registry.unregister(pid2));
1683
1721
  }
1684
- const onBgData = (chunk) => {
1722
+ const onBgData = (chunk, stream) => {
1723
+ if (stream === "stdout") stdoutBytes2 += chunk.byteLength;
1724
+ else stderrBytes2 += chunk.byteLength;
1725
+ emitProcessOutput({ pid: pid2, stream, chunk });
1685
1726
  if (truncated) return;
1686
1727
  const remain = MAX_OUTPUT - buf2.length;
1687
1728
  if (remain > 0) {
@@ -1689,24 +1730,28 @@ var bashTool = {
1689
1730
  }
1690
1731
  if (buf2.length >= MAX_OUTPUT) {
1691
1732
  truncated = true;
1692
- child2.stdout?.off("data", onBgData);
1693
- child2.stderr?.off("data", onBgData);
1733
+ child2.stdout?.off("data", onBgStdout);
1734
+ child2.stderr?.off("data", onBgStderr);
1694
1735
  }
1695
1736
  };
1696
- child2.stdout?.on("data", onBgData);
1697
- child2.stderr?.on("data", onBgData);
1737
+ const onBgStdout = (chunk) => onBgData(chunk, "stdout");
1738
+ const onBgStderr = (chunk) => onBgData(chunk, "stderr");
1739
+ child2.stdout?.on("data", onBgStdout);
1740
+ child2.stderr?.on("data", onBgStderr);
1698
1741
  const cleanupBackground = () => {
1699
- child2.stdout?.off("data", onBgData);
1700
- child2.stderr?.off("data", onBgData);
1742
+ child2.stdout?.off("data", onBgStdout);
1743
+ child2.stderr?.off("data", onBgStderr);
1701
1744
  };
1702
1745
  child2.on("error", () => {
1703
1746
  cleanupBackground();
1704
1747
  if (typeof pid2 === "number") registry.unregister(pid2);
1705
1748
  registry.afterCall(Date.now() - startedAt, true, bypassBreaker);
1749
+ completeBackground(1);
1706
1750
  });
1707
- child2.on("close", () => {
1751
+ child2.on("close", (code, signal) => {
1708
1752
  cleanupBackground();
1709
1753
  registry.afterCall(Date.now() - startedAt, false, bypassBreaker);
1754
+ completeBackground(code ?? (signal ? 1 : 0), signal ?? void 0);
1710
1755
  });
1711
1756
  if (typeof pid2 === "number") child2.unref();
1712
1757
  yield {
@@ -1746,6 +1791,32 @@ var bashTool = {
1746
1791
  }
1747
1792
  }
1748
1793
  const pid = child.pid;
1794
+ let stdoutBytes = 0;
1795
+ let stderrBytes = 0;
1796
+ let telemetryCompleted = false;
1797
+ emitProcessStarted({
1798
+ ...pid !== void 0 ? { pid } : {},
1799
+ parentPid: process.pid,
1800
+ command: redactCommand(`${shell} ${args.join(" ")}`),
1801
+ args: redactCommand(args.join(" ")).split(" ").filter(Boolean),
1802
+ cwd: ctx.projectRoot,
1803
+ background: false,
1804
+ startedAt: new Date(startedAt).toISOString()
1805
+ });
1806
+ const completeForeground = (exitCode, signal) => {
1807
+ if (telemetryCompleted) return;
1808
+ telemetryCompleted = true;
1809
+ emitProcessCompleted({
1810
+ ...pid !== void 0 ? { pid } : {},
1811
+ exitCode,
1812
+ ...signal ? { signal } : {},
1813
+ durationMs: Date.now() - startedAt,
1814
+ stdoutBytes,
1815
+ stderrBytes,
1816
+ timedOut,
1817
+ endedAt: (/* @__PURE__ */ new Date()).toISOString()
1818
+ });
1819
+ };
1749
1820
  if (typeof pid === "number") {
1750
1821
  registry.register({
1751
1822
  pid,
@@ -1847,8 +1918,11 @@ var bashTool = {
1847
1918
  child.stderr?.resume();
1848
1919
  }
1849
1920
  };
1850
- const onData = (chunk) => {
1921
+ const onData = (chunk, stream) => {
1851
1922
  const text = chunk.toString();
1923
+ if (stream === "stdout") stdoutBytes += chunk.byteLength;
1924
+ else stderrBytes += chunk.byteLength;
1925
+ emitProcessOutput({ pid, stream, chunk });
1852
1926
  if (buf.length < MAX_OUTPUT) {
1853
1927
  buf += text.slice(0, MAX_OUTPUT - buf.length);
1854
1928
  }
@@ -1857,17 +1931,21 @@ var bashTool = {
1857
1931
  push({ kind: "data", text });
1858
1932
  pauseIfFlooded();
1859
1933
  };
1860
- child.stdout?.on("data", onData);
1861
- child.stderr?.on("data", onData);
1934
+ const onStdoutData = (chunk) => onData(chunk, "stdout");
1935
+ const onStderrData = (chunk) => onData(chunk, "stderr");
1936
+ child.stdout?.on("data", onStdoutData);
1937
+ child.stderr?.on("data", onStderrData);
1862
1938
  child.on("error", (err) => {
1863
1939
  for (const t of timers) clearTimeout(t);
1864
1940
  registry.afterCall(Date.now() - startedAt, true);
1941
+ completeForeground(1);
1865
1942
  push({ kind: "error", err });
1866
1943
  });
1867
- child.on("close", (code) => {
1944
+ child.on("close", (code, signal) => {
1868
1945
  for (const t of timers) clearTimeout(t);
1869
1946
  if (typeof pid === "number") registry.unregister(pid);
1870
1947
  registry.afterCall(Date.now() - startedAt, code !== 0 && code !== null);
1948
+ completeForeground(timedOut ? 124 : code ?? (signal ? 1 : 0), signal ?? void 0);
1871
1949
  push({ kind: "end", code });
1872
1950
  });
1873
1951
  try {
@@ -1912,8 +1990,8 @@ ${hint}` : ""),
1912
1990
  for (const t of timers) clearTimeout(t);
1913
1991
  spool.finalize();
1914
1992
  if (isWin2) opts.signal.removeEventListener("abort", onAbort);
1915
- child.stdout?.off("data", onData);
1916
- child.stderr?.off("data", onData);
1993
+ child.stdout?.off("data", onStdoutData);
1994
+ child.stderr?.off("data", onStderrData);
1917
1995
  child.stdout?.destroy();
1918
1996
  child.stderr?.destroy();
1919
1997
  if (child.exitCode === null && !child.killed) {