@wrongstack/tools 0.276.2 → 0.276.4

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/index.js CHANGED
@@ -807,13 +807,13 @@ async function globFiles(pattern, base, extraGlob) {
807
807
  return await globNative(pattern, base, extraGlob);
808
808
  }
809
809
  function checkRg() {
810
- return new Promise((resolve6) => {
810
+ return new Promise((resolve7) => {
811
811
  try {
812
812
  const p = spawn("rg", ["--version"], { env: buildChildEnv(), stdio: "ignore", windowsHide: true });
813
- p.on("error", () => resolve6(false));
814
- p.on("close", (code) => resolve6(code === 0));
813
+ p.on("error", () => resolve7(false));
814
+ p.on("close", (code) => resolve7(code === 0));
815
815
  } catch {
816
- resolve6(false);
816
+ resolve7(false);
817
817
  }
818
818
  });
819
819
  }
@@ -830,10 +830,10 @@ function spawnRgFind(pattern, base) {
830
830
  buf += chunk.toString();
831
831
  });
832
832
  return {
833
- promise: new Promise((resolve6, reject) => {
833
+ promise: new Promise((resolve7, reject) => {
834
834
  child.on("error", reject);
835
835
  child.on("close", () => {
836
- resolve6(buf.split("\n").filter(Boolean));
836
+ resolve7(buf.split("\n").filter(Boolean));
837
837
  });
838
838
  })
839
839
  };
@@ -1106,13 +1106,13 @@ var grepTool = {
1106
1106
  }
1107
1107
  };
1108
1108
  async function detectRg(signal) {
1109
- return new Promise((resolve6) => {
1109
+ return new Promise((resolve7) => {
1110
1110
  try {
1111
1111
  const p = spawn("rg", ["--version"], { env: buildChildEnv(), stdio: "ignore", signal, windowsHide: true });
1112
- p.on("error", () => resolve6(false));
1113
- p.on("close", (code) => resolve6(code === 0));
1112
+ p.on("error", () => resolve7(false));
1113
+ p.on("close", (code) => resolve7(code === 0));
1114
1114
  } catch {
1115
- resolve6(false);
1115
+ resolve7(false);
1116
1116
  }
1117
1117
  });
1118
1118
  }
@@ -3081,10 +3081,10 @@ var bashTool = {
3081
3081
  queue.push(c);
3082
3082
  }
3083
3083
  };
3084
- const next = () => new Promise((resolve6) => {
3084
+ const next = () => new Promise((resolve7) => {
3085
3085
  const c = queue.shift();
3086
- if (c) resolve6(c);
3087
- else resolveNext = resolve6;
3086
+ if (c) resolve7(c);
3087
+ else resolveNext = resolve7;
3088
3088
  });
3089
3089
  let lastFlush = Date.now();
3090
3090
  const flush = () => {
@@ -3545,7 +3545,7 @@ var execTool = {
3545
3545
  }
3546
3546
  };
3547
3547
  function runCommand(cmd, args, cwd, timeout, signal, sessionId) {
3548
- return new Promise((resolve6) => {
3548
+ return new Promise((resolve7) => {
3549
3549
  let stdout = "";
3550
3550
  let stderr = "";
3551
3551
  let killed = false;
@@ -3553,7 +3553,7 @@ function runCommand(cmd, args, cwd, timeout, signal, sessionId) {
3553
3553
  const finish = (result) => {
3554
3554
  if (resolvedOnce.value) return;
3555
3555
  resolvedOnce.value = true;
3556
- resolve6(result);
3556
+ resolve7(result);
3557
3557
  };
3558
3558
  const startedAt = Date.now();
3559
3559
  const spool = createOutputSpool({ tool: `exec-${cmd}`, thresholdBytes: MAX_OUTPUT2 });
@@ -4916,7 +4916,7 @@ function buildArgs(input) {
4916
4916
  }
4917
4917
  }
4918
4918
  function runGit(args, cwd, signal) {
4919
- return new Promise((resolve6) => {
4919
+ return new Promise((resolve7) => {
4920
4920
  let stdout = "";
4921
4921
  let stderr = "";
4922
4922
  const child = spawn("git", args, {
@@ -4937,7 +4937,7 @@ function runGit(args, cwd, signal) {
4937
4937
  }
4938
4938
  });
4939
4939
  child.on("error", (err) => {
4940
- resolve6({
4940
+ resolve7({
4941
4941
  command: args[0],
4942
4942
  stdout: normalizeCommandOutput(stdout),
4943
4943
  stderr: err.message,
@@ -4946,7 +4946,7 @@ function runGit(args, cwd, signal) {
4946
4946
  });
4947
4947
  });
4948
4948
  child.on("close", (code) => {
4949
- resolve6({
4949
+ resolve7({
4950
4950
  command: args[0],
4951
4951
  stdout: normalizeCommandOutput(stdout),
4952
4952
  stderr: normalizeCommandOutput(stderr),
@@ -5046,7 +5046,7 @@ function stripPathComponents(p, strip) {
5046
5046
  return parts.slice(strip).join("/");
5047
5047
  }
5048
5048
  function runPatch(args, cwd, signal) {
5049
- return new Promise((resolve6) => {
5049
+ return new Promise((resolve7) => {
5050
5050
  let stdout = "";
5051
5051
  let stderr = "";
5052
5052
  const env = { ...buildChildEnv(), LANG: "C", LC_ALL: "C" };
@@ -5057,8 +5057,8 @@ function runPatch(args, cwd, signal) {
5057
5057
  child.stderr?.on("data", (c) => {
5058
5058
  stderr += c.toString();
5059
5059
  });
5060
- child.on("close", (code) => resolve6({ exitCode: code ?? 1, stdout, stderr }));
5061
- child.on("error", (e) => resolve6({ exitCode: 1, stdout: "", stderr: e.message }));
5060
+ child.on("close", (code) => resolve7({ exitCode: code ?? 1, stdout, stderr }));
5061
+ child.on("error", (e) => resolve7({ exitCode: 1, stdout: "", stderr: e.message }));
5062
5062
  });
5063
5063
  }
5064
5064
  function extractPatchedFiles(output) {
@@ -5120,30 +5120,30 @@ var jsonTool = {
5120
5120
  }
5121
5121
  }
5122
5122
  },
5123
- async execute(input) {
5123
+ async execute(input, ctx) {
5124
5124
  const action = input.action ?? "parse";
5125
5125
  switch (action) {
5126
5126
  case "query":
5127
- return executeQuery(input);
5127
+ return executeQuery(input, ctx);
5128
5128
  case "validate":
5129
- return executeValidate(input);
5129
+ return executeValidate(input, ctx);
5130
5130
  case "transform":
5131
- return executeTransform(input);
5131
+ return executeTransform(input, ctx);
5132
5132
  case "merge":
5133
5133
  return executeMerge(input);
5134
5134
  case "parse":
5135
5135
  default:
5136
- return executeParse(input);
5136
+ return executeParse(input, ctx);
5137
5137
  }
5138
5138
  }
5139
5139
  };
5140
- async function executeParse(input) {
5140
+ async function executeParse(input, ctx) {
5141
5141
  const format = input.format ?? "json";
5142
5142
  let parsed;
5143
5143
  let raw;
5144
5144
  if (input.file) {
5145
5145
  try {
5146
- raw = await fs7.readFile(input.file, "utf8");
5146
+ raw = await fs7.readFile(await safeResolveReal(input.file, ctx), "utf8");
5147
5147
  } catch {
5148
5148
  return { data: null, formatted: "", type: "unknown", action: "parse", error: "Could not read file" };
5149
5149
  }
@@ -5194,14 +5194,14 @@ async function executeParse(input) {
5194
5194
  keys: typeof parsed === "object" && parsed !== null ? Object.keys(parsed) : void 0
5195
5195
  };
5196
5196
  }
5197
- async function executeQuery(input) {
5197
+ async function executeQuery(input, ctx) {
5198
5198
  if (!input.query) {
5199
5199
  return { data: null, formatted: "", type: "unknown", action: "query", error: "query is required for action: query" };
5200
5200
  }
5201
5201
  let parsed;
5202
5202
  if (input.file) {
5203
5203
  try {
5204
- const raw = await fs7.readFile(input.file, "utf8");
5204
+ const raw = await fs7.readFile(await safeResolveReal(input.file, ctx), "utf8");
5205
5205
  parsed = JSON.parse(raw);
5206
5206
  } catch {
5207
5207
  return { data: null, formatted: "", type: "unknown", action: "query", error: "Could not read/parse file" };
@@ -5236,14 +5236,14 @@ async function executeQuery(input) {
5236
5236
  };
5237
5237
  }
5238
5238
  }
5239
- async function executeValidate(input) {
5239
+ async function executeValidate(input, ctx) {
5240
5240
  if (!input.schema) {
5241
5241
  return { data: null, formatted: "", type: "unknown", action: "validate", error: "schema is required for action: validate" };
5242
5242
  }
5243
5243
  let parsed;
5244
5244
  if (input.file) {
5245
5245
  try {
5246
- const raw = await fs7.readFile(input.file, "utf8");
5246
+ const raw = await fs7.readFile(await safeResolveReal(input.file, ctx), "utf8");
5247
5247
  parsed = JSON.parse(raw);
5248
5248
  } catch {
5249
5249
  return { data: null, formatted: "", type: "unknown", action: "validate", error: "Could not read/parse file" };
@@ -5278,14 +5278,14 @@ async function executeValidate(input) {
5278
5278
  };
5279
5279
  }
5280
5280
  }
5281
- async function executeTransform(input) {
5281
+ async function executeTransform(input, ctx) {
5282
5282
  if (!input.transforms || input.transforms.length === 0) {
5283
5283
  return { data: null, formatted: "", type: "unknown", action: "transform", error: "transforms array is required for action: transform" };
5284
5284
  }
5285
5285
  let parsed;
5286
5286
  if (input.file) {
5287
5287
  try {
5288
- const raw = await fs7.readFile(input.file, "utf8");
5288
+ const raw = await fs7.readFile(await safeResolveReal(input.file, ctx), "utf8");
5289
5289
  parsed = JSON.parse(raw);
5290
5290
  } catch {
5291
5291
  return { data: null, formatted: "", type: "unknown", action: "transform", error: "Could not read/parse file" };
@@ -5637,7 +5637,7 @@ function findGitDir2(cwd) {
5637
5637
  return null;
5638
5638
  }
5639
5639
  function runGit2(args, cwd, signal) {
5640
- return new Promise((resolve6) => {
5640
+ return new Promise((resolve7) => {
5641
5641
  let stdout = "";
5642
5642
  let stderr = "";
5643
5643
  const child = spawn("git", args, {
@@ -5653,8 +5653,8 @@ function runGit2(args, cwd, signal) {
5653
5653
  child.stderr?.on("data", (c) => {
5654
5654
  stderr += c.toString();
5655
5655
  });
5656
- child.on("close", (code) => resolve6({ stdout, stderr, exitCode: code ?? 0 }));
5657
- child.on("error", (e) => resolve6({ stdout: "", stderr: e.message, exitCode: 1 }));
5656
+ child.on("close", (code) => resolve7({ stdout, stderr, exitCode: code ?? 0 }));
5657
+ child.on("error", (e) => resolve7({ stdout: "", stderr: e.message, exitCode: 1 }));
5658
5658
  });
5659
5659
  }
5660
5660
  async function fileDiff(input, ctx, _signal) {
@@ -5975,8 +5975,8 @@ async function* spawnStream(opts) {
5975
5975
  try {
5976
5976
  for (; ; ) {
5977
5977
  while (queue.length === 0) {
5978
- await new Promise((resolve6) => {
5979
- waiter = resolve6;
5978
+ await new Promise((resolve7) => {
5979
+ waiter = resolve7;
5980
5980
  });
5981
5981
  }
5982
5982
  const chunk = queue.shift();
@@ -6782,7 +6782,7 @@ var outdatedTool = {
6782
6782
  }
6783
6783
  };
6784
6784
  function runOutdated(manager, args, cwd, signal) {
6785
- return new Promise((resolve6) => {
6785
+ return new Promise((resolve7) => {
6786
6786
  let stdout = "";
6787
6787
  let stderr = "";
6788
6788
  const MAX = 1e5;
@@ -6799,10 +6799,10 @@ function runOutdated(manager, args, cwd, signal) {
6799
6799
  });
6800
6800
  child.on("close", (code) => {
6801
6801
  const result = parseOutdatedOutput(stdout, code ?? 0);
6802
- resolve6(result);
6802
+ resolve7(result);
6803
6803
  });
6804
6804
  child.on("error", (e) => {
6805
- resolve6({
6805
+ resolve7({
6806
6806
  exit_code: 1,
6807
6807
  packages: [],
6808
6808
  total: 0,
@@ -6928,7 +6928,7 @@ async function dockerLogs(service, lines, filterRe, cwd, signal, since) {
6928
6928
  };
6929
6929
  }
6930
6930
  args.push("--timestamps", service);
6931
- return new Promise((resolve6) => {
6931
+ return new Promise((resolve7) => {
6932
6932
  let stdout = "";
6933
6933
  let stderr = "";
6934
6934
  const MAX = 2e5;
@@ -6944,7 +6944,7 @@ async function dockerLogs(service, lines, filterRe, cwd, signal, since) {
6944
6944
  if (settled) return;
6945
6945
  settled = true;
6946
6946
  clearTimeout(timer);
6947
- resolve6(result);
6947
+ resolve7(result);
6948
6948
  };
6949
6949
  const child = spawn("docker", args, { cwd, signal, env: buildChildEnv(), stdio: ["ignore", "pipe", "pipe"], windowsHide: true });
6950
6950
  const timer = setTimeout(() => {
@@ -7538,7 +7538,14 @@ These win over kit tokens. Run \`design {action:"materialize"}\` to write them t
7538
7538
  kitId: active.kit,
7539
7539
  outPath: input.out
7540
7540
  });
7541
- const abs = path.join(ctx.projectRoot, result.path);
7541
+ const root = path.resolve(ctx.projectRoot);
7542
+ const abs = path.resolve(path.join(ctx.projectRoot, result.path));
7543
+ const rel = path.relative(root, abs);
7544
+ if (rel.startsWith("..") || path.isAbsolute(rel)) {
7545
+ throw new Error(
7546
+ `design: materialize path "${result.path}" would escape the project root`
7547
+ );
7548
+ }
7542
7549
  let exists = false;
7543
7550
  try {
7544
7551
  await fs7.access(abs);
@@ -10139,8 +10146,8 @@ async function syncGoParse(filePath, content, lang) {
10139
10146
  proc.stdin?.write(content);
10140
10147
  proc.stdin?.end();
10141
10148
  const { code } = await Promise.race([
10142
- new Promise((resolve6) => {
10143
- proc.on("close", (c) => resolve6({ code: c }));
10149
+ new Promise((resolve7) => {
10150
+ proc.on("close", (c) => resolve7({ code: c }));
10144
10151
  }),
10145
10152
  new Promise(
10146
10153
  (_, reject) => setTimeout(() => {
@@ -10402,8 +10409,8 @@ async function syncPyParse(filePath, content, lang) {
10402
10409
  stdout += chunk.toString();
10403
10410
  });
10404
10411
  const { code } = await Promise.race([
10405
- new Promise((resolve6) => {
10406
- proc.on("close", (c) => resolve6({ code: c }));
10412
+ new Promise((resolve7) => {
10413
+ proc.on("close", (c) => resolve7({ code: c }));
10407
10414
  }),
10408
10415
  new Promise(
10409
10416
  (_, reject) => setTimeout(() => {
@@ -10488,8 +10495,8 @@ async function tryNativeParse(file, content) {
10488
10495
  stdout += chunk.toString();
10489
10496
  });
10490
10497
  const { code } = await Promise.race([
10491
- new Promise((resolve6) => {
10492
- proc.on("close", (c) => resolve6({ code: c }));
10498
+ new Promise((resolve7) => {
10499
+ proc.on("close", (c) => resolve7({ code: c }));
10493
10500
  }),
10494
10501
  new Promise(
10495
10502
  (_, reject) => setTimeout(() => {
@@ -10979,7 +10986,7 @@ async function loadGitignoreMatcher(projectRoot) {
10979
10986
  var YIELD_EVERY_N = 50;
10980
10987
  var PARALLEL_BATCH = 20;
10981
10988
  function yieldEventLoop() {
10982
- return new Promise((resolve6) => setImmediate(resolve6));
10989
+ return new Promise((resolve7) => setImmediate(resolve7));
10983
10990
  }
10984
10991
  function throwIfAborted(signal) {
10985
10992
  if (!signal?.aborted) return;
@@ -11472,7 +11479,7 @@ function shutdownCodebaseIndexHost() {
11472
11479
  function callIndexOp(op, args, opts) {
11473
11480
  const w = ensureWorker();
11474
11481
  if (!w) return callInline(op, args, opts);
11475
- return new Promise((resolve6, reject) => {
11482
+ return new Promise((resolve7, reject) => {
11476
11483
  const id = nextRpcId++;
11477
11484
  const timer = setTimeout(() => {
11478
11485
  pending.delete(id);
@@ -11495,7 +11502,7 @@ function callIndexOp(op, args, opts) {
11495
11502
  pending.set(id, {
11496
11503
  resolve: (v) => {
11497
11504
  cleanup();
11498
- resolve6(v);
11505
+ resolve7(v);
11499
11506
  },
11500
11507
  reject: (e) => {
11501
11508
  cleanup();