@wrongstack/tools 0.276.2 → 0.276.3

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/pack.js CHANGED
@@ -833,8 +833,8 @@ async function* spawnStream(opts) {
833
833
  try {
834
834
  for (; ; ) {
835
835
  while (queue.length === 0) {
836
- await new Promise((resolve6) => {
837
- waiter = resolve6;
836
+ await new Promise((resolve7) => {
837
+ waiter = resolve7;
838
838
  });
839
839
  }
840
840
  const chunk = queue.shift();
@@ -2133,10 +2133,10 @@ var bashTool = {
2133
2133
  queue.push(c);
2134
2134
  }
2135
2135
  };
2136
- const next = () => new Promise((resolve6) => {
2136
+ const next = () => new Promise((resolve7) => {
2137
2137
  const c = queue.shift();
2138
- if (c) resolve6(c);
2139
- else resolveNext = resolve6;
2138
+ if (c) resolve7(c);
2139
+ else resolveNext = resolve7;
2140
2140
  });
2141
2141
  let lastFlush = Date.now();
2142
2142
  const flush = () => {
@@ -3716,8 +3716,8 @@ async function syncGoParse(filePath, content, lang) {
3716
3716
  proc.stdin?.write(content);
3717
3717
  proc.stdin?.end();
3718
3718
  const { code } = await Promise.race([
3719
- new Promise((resolve6) => {
3720
- proc.on("close", (c) => resolve6({ code: c }));
3719
+ new Promise((resolve7) => {
3720
+ proc.on("close", (c) => resolve7({ code: c }));
3721
3721
  }),
3722
3722
  new Promise(
3723
3723
  (_, reject) => setTimeout(() => {
@@ -3979,8 +3979,8 @@ async function syncPyParse(filePath, content, lang) {
3979
3979
  stdout += chunk.toString();
3980
3980
  });
3981
3981
  const { code } = await Promise.race([
3982
- new Promise((resolve6) => {
3983
- proc.on("close", (c) => resolve6({ code: c }));
3982
+ new Promise((resolve7) => {
3983
+ proc.on("close", (c) => resolve7({ code: c }));
3984
3984
  }),
3985
3985
  new Promise(
3986
3986
  (_, reject) => setTimeout(() => {
@@ -4065,8 +4065,8 @@ async function tryNativeParse(file, content) {
4065
4065
  stdout += chunk.toString();
4066
4066
  });
4067
4067
  const { code } = await Promise.race([
4068
- new Promise((resolve6) => {
4069
- proc.on("close", (c) => resolve6({ code: c }));
4068
+ new Promise((resolve7) => {
4069
+ proc.on("close", (c) => resolve7({ code: c }));
4070
4070
  }),
4071
4071
  new Promise(
4072
4072
  (_, reject) => setTimeout(() => {
@@ -4556,7 +4556,7 @@ async function loadGitignoreMatcher(projectRoot) {
4556
4556
  var YIELD_EVERY_N = 50;
4557
4557
  var PARALLEL_BATCH = 20;
4558
4558
  function yieldEventLoop() {
4559
- return new Promise((resolve6) => setImmediate(resolve6));
4559
+ return new Promise((resolve7) => setImmediate(resolve7));
4560
4560
  }
4561
4561
  function throwIfAborted(signal) {
4562
4562
  if (!signal?.aborted) return;
@@ -5034,7 +5034,7 @@ function terminateWorker(reason) {
5034
5034
  function callIndexOp(op, args, opts) {
5035
5035
  const w = ensureWorker();
5036
5036
  if (!w) return callInline(op, args, opts);
5037
- return new Promise((resolve6, reject) => {
5037
+ return new Promise((resolve7, reject) => {
5038
5038
  const id = nextRpcId++;
5039
5039
  const timer = setTimeout(() => {
5040
5040
  pending.delete(id);
@@ -5057,7 +5057,7 @@ function callIndexOp(op, args, opts) {
5057
5057
  pending.set(id, {
5058
5058
  resolve: (v) => {
5059
5059
  cleanup();
5060
- resolve6(v);
5060
+ resolve7(v);
5061
5061
  },
5062
5062
  reject: (e) => {
5063
5063
  cleanup();
@@ -5551,7 +5551,14 @@ These win over kit tokens. Run \`design {action:"materialize"}\` to write them t
5551
5551
  kitId: active.kit,
5552
5552
  outPath: input.out
5553
5553
  });
5554
- const abs = path3.join(ctx.projectRoot, result.path);
5554
+ const root = path3.resolve(ctx.projectRoot);
5555
+ const abs = path3.resolve(path3.join(ctx.projectRoot, result.path));
5556
+ const rel = path3.relative(root, abs);
5557
+ if (rel.startsWith("..") || path3.isAbsolute(rel)) {
5558
+ throw new Error(
5559
+ `design: materialize path "${result.path}" would escape the project root`
5560
+ );
5561
+ }
5555
5562
  let exists = false;
5556
5563
  try {
5557
5564
  await fs2.access(abs);
@@ -5710,7 +5717,7 @@ function findGitDir(cwd) {
5710
5717
  return null;
5711
5718
  }
5712
5719
  function runGit(args, cwd, signal) {
5713
- return new Promise((resolve6) => {
5720
+ return new Promise((resolve7) => {
5714
5721
  let stdout = "";
5715
5722
  let stderr = "";
5716
5723
  const child = spawn("git", args, {
@@ -5726,8 +5733,8 @@ function runGit(args, cwd, signal) {
5726
5733
  child.stderr?.on("data", (c) => {
5727
5734
  stderr += c.toString();
5728
5735
  });
5729
- child.on("close", (code) => resolve6({ stdout, stderr, exitCode: code ?? 0 }));
5730
- child.on("error", (e) => resolve6({ stdout: "", stderr: e.message, exitCode: 1 }));
5736
+ child.on("close", (code) => resolve7({ stdout, stderr, exitCode: code ?? 0 }));
5737
+ child.on("error", (e) => resolve7({ stdout: "", stderr: e.message, exitCode: 1 }));
5731
5738
  });
5732
5739
  }
5733
5740
  async function fileDiff(input, ctx, _signal) {
@@ -6356,7 +6363,7 @@ var execTool = {
6356
6363
  }
6357
6364
  };
6358
6365
  function runCommand(cmd, args, cwd, timeout, signal, sessionId) {
6359
- return new Promise((resolve6) => {
6366
+ return new Promise((resolve7) => {
6360
6367
  let stdout = "";
6361
6368
  let stderr = "";
6362
6369
  let killed = false;
@@ -6364,7 +6371,7 @@ function runCommand(cmd, args, cwd, timeout, signal, sessionId) {
6364
6371
  const finish = (result) => {
6365
6372
  if (resolvedOnce.value) return;
6366
6373
  resolvedOnce.value = true;
6367
- resolve6(result);
6374
+ resolve7(result);
6368
6375
  };
6369
6376
  const startedAt = Date.now();
6370
6377
  const spool = createOutputSpool({ tool: `exec-${cmd}`, thresholdBytes: MAX_OUTPUT2 });
@@ -7157,7 +7164,7 @@ function buildArgs(input) {
7157
7164
  }
7158
7165
  }
7159
7166
  function runGit2(args, cwd, signal) {
7160
- return new Promise((resolve6) => {
7167
+ return new Promise((resolve7) => {
7161
7168
  let stdout = "";
7162
7169
  let stderr = "";
7163
7170
  const child = spawn("git", args, {
@@ -7178,7 +7185,7 @@ function runGit2(args, cwd, signal) {
7178
7185
  }
7179
7186
  });
7180
7187
  child.on("error", (err) => {
7181
- resolve6({
7188
+ resolve7({
7182
7189
  command: args[0],
7183
7190
  stdout: normalizeCommandOutput(stdout),
7184
7191
  stderr: err.message,
@@ -7187,7 +7194,7 @@ function runGit2(args, cwd, signal) {
7187
7194
  });
7188
7195
  });
7189
7196
  child.on("close", (code) => {
7190
- resolve6({
7197
+ resolve7({
7191
7198
  command: args[0],
7192
7199
  stdout: normalizeCommandOutput(stdout),
7193
7200
  stderr: normalizeCommandOutput(stderr),
@@ -7477,13 +7484,13 @@ var grepTool = {
7477
7484
  }
7478
7485
  };
7479
7486
  async function detectRg(signal) {
7480
- return new Promise((resolve6) => {
7487
+ return new Promise((resolve7) => {
7481
7488
  try {
7482
7489
  const p = spawn("rg", ["--version"], { env: buildChildEnv(), stdio: "ignore", signal, windowsHide: true });
7483
- p.on("error", () => resolve6(false));
7484
- p.on("close", (code) => resolve6(code === 0));
7490
+ p.on("error", () => resolve7(false));
7491
+ p.on("close", (code) => resolve7(code === 0));
7485
7492
  } catch {
7486
- resolve6(false);
7493
+ resolve7(false);
7487
7494
  }
7488
7495
  });
7489
7496
  }
@@ -7946,30 +7953,30 @@ var jsonTool = {
7946
7953
  }
7947
7954
  }
7948
7955
  },
7949
- async execute(input) {
7956
+ async execute(input, ctx) {
7950
7957
  const action = input.action ?? "parse";
7951
7958
  switch (action) {
7952
7959
  case "query":
7953
- return executeQuery(input);
7960
+ return executeQuery(input, ctx);
7954
7961
  case "validate":
7955
- return executeValidate(input);
7962
+ return executeValidate(input, ctx);
7956
7963
  case "transform":
7957
- return executeTransform(input);
7964
+ return executeTransform(input, ctx);
7958
7965
  case "merge":
7959
7966
  return executeMerge(input);
7960
7967
  case "parse":
7961
7968
  default:
7962
- return executeParse(input);
7969
+ return executeParse(input, ctx);
7963
7970
  }
7964
7971
  }
7965
7972
  };
7966
- async function executeParse(input) {
7973
+ async function executeParse(input, ctx) {
7967
7974
  const format = input.format ?? "json";
7968
7975
  let parsed;
7969
7976
  let raw;
7970
7977
  if (input.file) {
7971
7978
  try {
7972
- raw = await fs2.readFile(input.file, "utf8");
7979
+ raw = await fs2.readFile(await safeResolveReal(input.file, ctx), "utf8");
7973
7980
  } catch {
7974
7981
  return { data: null, formatted: "", type: "unknown", action: "parse", error: "Could not read file" };
7975
7982
  }
@@ -8020,14 +8027,14 @@ async function executeParse(input) {
8020
8027
  keys: typeof parsed === "object" && parsed !== null ? Object.keys(parsed) : void 0
8021
8028
  };
8022
8029
  }
8023
- async function executeQuery(input) {
8030
+ async function executeQuery(input, ctx) {
8024
8031
  if (!input.query) {
8025
8032
  return { data: null, formatted: "", type: "unknown", action: "query", error: "query is required for action: query" };
8026
8033
  }
8027
8034
  let parsed;
8028
8035
  if (input.file) {
8029
8036
  try {
8030
- const raw = await fs2.readFile(input.file, "utf8");
8037
+ const raw = await fs2.readFile(await safeResolveReal(input.file, ctx), "utf8");
8031
8038
  parsed = JSON.parse(raw);
8032
8039
  } catch {
8033
8040
  return { data: null, formatted: "", type: "unknown", action: "query", error: "Could not read/parse file" };
@@ -8062,14 +8069,14 @@ async function executeQuery(input) {
8062
8069
  };
8063
8070
  }
8064
8071
  }
8065
- async function executeValidate(input) {
8072
+ async function executeValidate(input, ctx) {
8066
8073
  if (!input.schema) {
8067
8074
  return { data: null, formatted: "", type: "unknown", action: "validate", error: "schema is required for action: validate" };
8068
8075
  }
8069
8076
  let parsed;
8070
8077
  if (input.file) {
8071
8078
  try {
8072
- const raw = await fs2.readFile(input.file, "utf8");
8079
+ const raw = await fs2.readFile(await safeResolveReal(input.file, ctx), "utf8");
8073
8080
  parsed = JSON.parse(raw);
8074
8081
  } catch {
8075
8082
  return { data: null, formatted: "", type: "unknown", action: "validate", error: "Could not read/parse file" };
@@ -8104,14 +8111,14 @@ async function executeValidate(input) {
8104
8111
  };
8105
8112
  }
8106
8113
  }
8107
- async function executeTransform(input) {
8114
+ async function executeTransform(input, ctx) {
8108
8115
  if (!input.transforms || input.transforms.length === 0) {
8109
8116
  return { data: null, formatted: "", type: "unknown", action: "transform", error: "transforms array is required for action: transform" };
8110
8117
  }
8111
8118
  let parsed;
8112
8119
  if (input.file) {
8113
8120
  try {
8114
- const raw = await fs2.readFile(input.file, "utf8");
8121
+ const raw = await fs2.readFile(await safeResolveReal(input.file, ctx), "utf8");
8115
8122
  parsed = JSON.parse(raw);
8116
8123
  } catch {
8117
8124
  return { data: null, formatted: "", type: "unknown", action: "transform", error: "Could not read/parse file" };
@@ -8548,7 +8555,7 @@ async function dockerLogs(service, lines, filterRe, cwd, signal, since) {
8548
8555
  };
8549
8556
  }
8550
8557
  args.push("--timestamps", service);
8551
- return new Promise((resolve6) => {
8558
+ return new Promise((resolve7) => {
8552
8559
  let stdout = "";
8553
8560
  let stderr = "";
8554
8561
  const MAX = 2e5;
@@ -8564,7 +8571,7 @@ async function dockerLogs(service, lines, filterRe, cwd, signal, since) {
8564
8571
  if (settled) return;
8565
8572
  settled = true;
8566
8573
  clearTimeout(timer);
8567
- resolve6(result);
8574
+ resolve7(result);
8568
8575
  };
8569
8576
  const child = spawn("docker", args, { cwd, signal, env: buildChildEnv(), stdio: ["ignore", "pipe", "pipe"], windowsHide: true });
8570
8577
  const timer = setTimeout(() => {
@@ -8726,7 +8733,7 @@ var outdatedTool = {
8726
8733
  }
8727
8734
  };
8728
8735
  function runOutdated(manager, args, cwd, signal) {
8729
- return new Promise((resolve6) => {
8736
+ return new Promise((resolve7) => {
8730
8737
  let stdout = "";
8731
8738
  let stderr = "";
8732
8739
  const MAX = 1e5;
@@ -8743,10 +8750,10 @@ function runOutdated(manager, args, cwd, signal) {
8743
8750
  });
8744
8751
  child.on("close", (code) => {
8745
8752
  const result = parseOutdatedOutput(stdout, code ?? 0);
8746
- resolve6(result);
8753
+ resolve7(result);
8747
8754
  });
8748
8755
  child.on("error", (e) => {
8749
- resolve6({
8756
+ resolve7({
8750
8757
  exit_code: 1,
8751
8758
  packages: [],
8752
8759
  total: 0,
@@ -8880,7 +8887,7 @@ function stripPathComponents(p, strip) {
8880
8887
  return parts.slice(strip).join("/");
8881
8888
  }
8882
8889
  function runPatch(args, cwd, signal) {
8883
- return new Promise((resolve6) => {
8890
+ return new Promise((resolve7) => {
8884
8891
  let stdout = "";
8885
8892
  let stderr = "";
8886
8893
  const env = { ...buildChildEnv(), LANG: "C", LC_ALL: "C" };
@@ -8891,8 +8898,8 @@ function runPatch(args, cwd, signal) {
8891
8898
  child.stderr?.on("data", (c) => {
8892
8899
  stderr += c.toString();
8893
8900
  });
8894
- child.on("close", (code) => resolve6({ exitCode: code ?? 1, stdout, stderr }));
8895
- child.on("error", (e) => resolve6({ exitCode: 1, stdout: "", stderr: e.message }));
8901
+ child.on("close", (code) => resolve7({ exitCode: code ?? 1, stdout, stderr }));
8902
+ child.on("error", (e) => resolve7({ exitCode: 1, stdout: "", stderr: e.message }));
8896
8903
  });
8897
8904
  }
8898
8905
  function extractPatchedFiles(output) {
@@ -9515,13 +9522,13 @@ async function globFiles(pattern, base, extraGlob) {
9515
9522
  return await globNative(pattern, base, extraGlob);
9516
9523
  }
9517
9524
  function checkRg() {
9518
- return new Promise((resolve6) => {
9525
+ return new Promise((resolve7) => {
9519
9526
  try {
9520
9527
  const p = spawn("rg", ["--version"], { env: buildChildEnv(), stdio: "ignore", windowsHide: true });
9521
- p.on("error", () => resolve6(false));
9522
- p.on("close", (code) => resolve6(code === 0));
9528
+ p.on("error", () => resolve7(false));
9529
+ p.on("close", (code) => resolve7(code === 0));
9523
9530
  } catch {
9524
- resolve6(false);
9531
+ resolve7(false);
9525
9532
  }
9526
9533
  });
9527
9534
  }
@@ -9538,10 +9545,10 @@ function spawnRgFind(pattern, base) {
9538
9545
  buf += chunk.toString();
9539
9546
  });
9540
9547
  return {
9541
- promise: new Promise((resolve6, reject) => {
9548
+ promise: new Promise((resolve7, reject) => {
9542
9549
  child.on("error", reject);
9543
9550
  child.on("close", () => {
9544
- resolve6(buf.split("\n").filter(Boolean));
9551
+ resolve7(buf.split("\n").filter(Boolean));
9545
9552
  });
9546
9553
  })
9547
9554
  };