@wrongstack/tools 0.292.1 → 0.295.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 (248) hide show
  1. package/dist/_env.d.ts +1 -1
  2. package/dist/_env.d.ts.map +1 -1
  3. package/dist/_fetch-guard.d.ts.map +1 -1
  4. package/dist/_spawn-stream.d.ts +1 -1
  5. package/dist/_spawn-stream.d.ts.map +1 -1
  6. package/dist/_util.d.ts +1 -1
  7. package/dist/_util.d.ts.map +1 -1
  8. package/dist/audit.d.ts +1 -1
  9. package/dist/audit.d.ts.map +1 -1
  10. package/dist/audit.js +81 -16
  11. package/dist/audit.js.map +2 -2
  12. package/dist/bash.d.ts +1 -1
  13. package/dist/bash.d.ts.map +1 -1
  14. package/dist/bash.js +66 -52
  15. package/dist/bash.js.map +3 -3
  16. package/dist/batch-tool-use.d.ts +1 -1
  17. package/dist/batch-tool-use.d.ts.map +1 -1
  18. package/dist/batch-tool-use.js +1 -1
  19. package/dist/batch-tool-use.js.map +1 -1
  20. package/dist/browser/index.js +10 -1
  21. package/dist/browser/index.js.map +2 -2
  22. package/dist/browser/manager.d.ts +2 -0
  23. package/dist/browser/manager.d.ts.map +1 -1
  24. package/dist/browser/tools.d.ts +1 -1
  25. package/dist/browser/tools.d.ts.map +1 -1
  26. package/dist/builtin.d.ts +1 -1
  27. package/dist/builtin.d.ts.map +1 -1
  28. package/dist/builtin.js +1394 -553
  29. package/dist/builtin.js.map +4 -4
  30. package/dist/codebase-index/background-indexer.d.ts +2 -2
  31. package/dist/codebase-index/background-indexer.d.ts.map +1 -1
  32. package/dist/codebase-index/bm25.d.ts +3 -1
  33. package/dist/codebase-index/bm25.d.ts.map +1 -1
  34. package/dist/codebase-index/codebase-index-tool.d.ts +1 -1
  35. package/dist/codebase-index/codebase-index-tool.d.ts.map +1 -1
  36. package/dist/codebase-index/codebase-search-tool.d.ts +1 -1
  37. package/dist/codebase-index/codebase-search-tool.d.ts.map +1 -1
  38. package/dist/codebase-index/codebase-stats-tool.d.ts +1 -1
  39. package/dist/codebase-index/codebase-stats-tool.d.ts.map +1 -1
  40. package/dist/codebase-index/generic-parser.d.ts +34 -0
  41. package/dist/codebase-index/generic-parser.d.ts.map +1 -0
  42. package/dist/codebase-index/go-parser.d.ts +1 -1
  43. package/dist/codebase-index/go-parser.d.ts.map +1 -1
  44. package/dist/codebase-index/index.d.ts +4 -2
  45. package/dist/codebase-index/index.d.ts.map +1 -1
  46. package/dist/codebase-index/index.js +1036 -341
  47. package/dist/codebase-index/index.js.map +4 -4
  48. package/dist/codebase-index/indexer.d.ts +6 -1
  49. package/dist/codebase-index/indexer.d.ts.map +1 -1
  50. package/dist/codebase-index/json-parser.d.ts +1 -1
  51. package/dist/codebase-index/languages.d.ts +25 -0
  52. package/dist/codebase-index/languages.d.ts.map +1 -0
  53. package/dist/codebase-index/py-parser.d.ts +9 -1
  54. package/dist/codebase-index/py-parser.d.ts.map +1 -1
  55. package/dist/codebase-index/refs-extractor.d.ts.map +1 -1
  56. package/dist/codebase-index/rs-parser.d.ts +1 -1
  57. package/dist/codebase-index/rs-parser.d.ts.map +1 -1
  58. package/dist/codebase-index/schema.d.ts +9 -2
  59. package/dist/codebase-index/schema.d.ts.map +1 -1
  60. package/dist/codebase-index/spawn-gate.d.ts +15 -0
  61. package/dist/codebase-index/spawn-gate.d.ts.map +1 -0
  62. package/dist/codebase-index/ts-parser.d.ts +2 -2
  63. package/dist/codebase-index/ts-parser.d.ts.map +1 -1
  64. package/dist/codebase-index/worker.js +961 -317
  65. package/dist/codebase-index/worker.js.map +4 -4
  66. package/dist/codebase-index/writer.d.ts +83 -4
  67. package/dist/codebase-index/writer.d.ts.map +1 -1
  68. package/dist/codebase-index/yaml-parser.d.ts +1 -1
  69. package/dist/design.d.ts +5 -2
  70. package/dist/design.d.ts.map +1 -1
  71. package/dist/design.js +36 -3
  72. package/dist/design.js.map +2 -2
  73. package/dist/diff.d.ts +1 -1
  74. package/dist/diff.d.ts.map +1 -1
  75. package/dist/diff.js +2 -2
  76. package/dist/diff.js.map +1 -1
  77. package/dist/document.d.ts +1 -1
  78. package/dist/document.d.ts.map +1 -1
  79. package/dist/document.js +1 -1
  80. package/dist/document.js.map +1 -1
  81. package/dist/e2e.d.ts +1 -1
  82. package/dist/e2e.d.ts.map +1 -1
  83. package/dist/e2e.js +1 -1
  84. package/dist/e2e.js.map +1 -1
  85. package/dist/edit.d.ts +1 -1
  86. package/dist/edit.d.ts.map +1 -1
  87. package/dist/edit.js +3 -3
  88. package/dist/edit.js.map +2 -2
  89. package/dist/exec.d.ts +1 -1
  90. package/dist/exec.d.ts.map +1 -1
  91. package/dist/exec.js +60 -21
  92. package/dist/exec.js.map +3 -3
  93. package/dist/fetch.d.ts +1 -1
  94. package/dist/fetch.d.ts.map +1 -1
  95. package/dist/fetch.js +4 -5
  96. package/dist/fetch.js.map +2 -2
  97. package/dist/format.d.ts +1 -1
  98. package/dist/format.d.ts.map +1 -1
  99. package/dist/format.js +81 -16
  100. package/dist/format.js.map +2 -2
  101. package/dist/git.d.ts +1 -1
  102. package/dist/git.d.ts.map +1 -1
  103. package/dist/git.js +3 -2
  104. package/dist/git.js.map +2 -2
  105. package/dist/glob.d.ts +1 -1
  106. package/dist/glob.d.ts.map +1 -1
  107. package/dist/glob.js +2 -2
  108. package/dist/glob.js.map +1 -1
  109. package/dist/grep.d.ts +1 -1
  110. package/dist/grep.d.ts.map +1 -1
  111. package/dist/grep.js +4 -3
  112. package/dist/grep.js.map +2 -2
  113. package/dist/index.d.ts +4 -4
  114. package/dist/index.d.ts.map +1 -1
  115. package/dist/index.js +1657 -705
  116. package/dist/index.js.map +4 -4
  117. package/dist/install.d.ts +1 -1
  118. package/dist/install.d.ts.map +1 -1
  119. package/dist/install.js +85 -17
  120. package/dist/install.js.map +2 -2
  121. package/dist/json.d.ts +1 -1
  122. package/dist/json.d.ts.map +1 -1
  123. package/dist/json.js +2 -2
  124. package/dist/json.js.map +2 -2
  125. package/dist/kanban.d.ts +4 -3
  126. package/dist/kanban.d.ts.map +1 -1
  127. package/dist/kanban.js +94 -27
  128. package/dist/kanban.js.map +2 -2
  129. package/dist/languages/execute-tool.d.ts +1 -1
  130. package/dist/languages/execute-tool.d.ts.map +1 -1
  131. package/dist/languages/execute.d.ts +1 -1
  132. package/dist/languages/execute.d.ts.map +1 -1
  133. package/dist/languages/index.d.ts +1 -1
  134. package/dist/languages/index.d.ts.map +1 -1
  135. package/dist/languages/index.js +99 -17
  136. package/dist/languages/index.js.map +2 -2
  137. package/dist/languages/package-tool.d.ts +3 -4
  138. package/dist/languages/package-tool.d.ts.map +1 -1
  139. package/dist/languages/plan.d.ts.map +1 -1
  140. package/dist/languages/profiles/additional.d.ts.map +1 -1
  141. package/dist/languages/profiles/primary.d.ts.map +1 -1
  142. package/dist/languages/tool.d.ts +1 -1
  143. package/dist/languages/tool.d.ts.map +1 -1
  144. package/dist/lint.d.ts +1 -1
  145. package/dist/lint.d.ts.map +1 -1
  146. package/dist/lint.js +81 -16
  147. package/dist/lint.js.map +2 -2
  148. package/dist/logs.d.ts +1 -1
  149. package/dist/logs.d.ts.map +1 -1
  150. package/dist/logs.js +2 -2
  151. package/dist/logs.js.map +1 -1
  152. package/dist/memory.d.ts +1 -1
  153. package/dist/memory.d.ts.map +1 -1
  154. package/dist/memory.js +1 -1
  155. package/dist/memory.js.map +1 -1
  156. package/dist/mode.d.ts +1 -1
  157. package/dist/mode.d.ts.map +1 -1
  158. package/dist/mode.js.map +1 -1
  159. package/dist/outdated.d.ts +1 -1
  160. package/dist/outdated.d.ts.map +1 -1
  161. package/dist/outdated.js +101 -19
  162. package/dist/outdated.js.map +2 -2
  163. package/dist/pack.d.ts +1 -1
  164. package/dist/pack.js +1394 -553
  165. package/dist/pack.js.map +4 -4
  166. package/dist/patch.d.ts +1 -1
  167. package/dist/patch.d.ts.map +1 -1
  168. package/dist/patch.js +2 -2
  169. package/dist/patch.js.map +1 -1
  170. package/dist/plan.d.ts +1 -1
  171. package/dist/plan.d.ts.map +1 -1
  172. package/dist/plan.js +7 -7
  173. package/dist/plan.js.map +2 -2
  174. package/dist/process-guardian.d.ts +7 -0
  175. package/dist/process-guardian.d.ts.map +1 -1
  176. package/dist/process-registry-persistent.d.ts +5 -0
  177. package/dist/process-registry-persistent.d.ts.map +1 -1
  178. package/dist/process-registry.d.ts +9 -1
  179. package/dist/process-registry.d.ts.map +1 -1
  180. package/dist/process-registry.js +18 -3
  181. package/dist/process-registry.js.map +2 -2
  182. package/dist/ps-slash.js +54 -15
  183. package/dist/ps-slash.js.map +2 -2
  184. package/dist/read.d.ts +1 -1
  185. package/dist/read.d.ts.map +1 -1
  186. package/dist/read.js +3 -2
  187. package/dist/read.js.map +2 -2
  188. package/dist/replace.d.ts +1 -1
  189. package/dist/replace.d.ts.map +1 -1
  190. package/dist/replace.js +4 -4
  191. package/dist/replace.js.map +2 -2
  192. package/dist/scaffold.d.ts +1 -1
  193. package/dist/scaffold.d.ts.map +1 -1
  194. package/dist/scaffold.js +2 -2
  195. package/dist/scaffold.js.map +1 -1
  196. package/dist/search.d.ts +1 -1
  197. package/dist/search.d.ts.map +1 -1
  198. package/dist/search.js +4 -4
  199. package/dist/search.js.map +2 -2
  200. package/dist/session-kanban.d.ts +4 -1
  201. package/dist/session-kanban.d.ts.map +1 -1
  202. package/dist/session-kanban.js +23 -15
  203. package/dist/session-kanban.js.map +2 -2
  204. package/dist/set-working-dir.d.ts +1 -1
  205. package/dist/set-working-dir.d.ts.map +1 -1
  206. package/dist/skill.d.ts +1 -1
  207. package/dist/skill.d.ts.map +1 -1
  208. package/dist/skill.js +2 -5
  209. package/dist/skill.js.map +2 -2
  210. package/dist/spawn-background.d.ts.map +1 -1
  211. package/dist/task.d.ts +3 -2
  212. package/dist/task.d.ts.map +1 -1
  213. package/dist/task.js +6 -8
  214. package/dist/task.js.map +2 -2
  215. package/dist/test.d.ts +1 -1
  216. package/dist/test.d.ts.map +1 -1
  217. package/dist/test.js +81 -16
  218. package/dist/test.js.map +2 -2
  219. package/dist/todo.d.ts +2 -1
  220. package/dist/todo.d.ts.map +1 -1
  221. package/dist/todo.js +4 -4
  222. package/dist/todo.js.map +2 -2
  223. package/dist/tool-help.d.ts +1 -1
  224. package/dist/tool-help.d.ts.map +1 -1
  225. package/dist/tool-help.js.map +1 -1
  226. package/dist/tool-search.d.ts +1 -1
  227. package/dist/tool-search.d.ts.map +1 -1
  228. package/dist/tool-search.js.map +1 -1
  229. package/dist/tool-tier.d.ts +16 -0
  230. package/dist/tool-tier.d.ts.map +1 -0
  231. package/dist/tool-tier.js +22233 -0
  232. package/dist/tool-tier.js.map +7 -0
  233. package/dist/tool-use.d.ts +1 -1
  234. package/dist/tool-use.d.ts.map +1 -1
  235. package/dist/tool-use.js.map +1 -1
  236. package/dist/tree.d.ts +1 -1
  237. package/dist/tree.d.ts.map +1 -1
  238. package/dist/tree.js +2 -2
  239. package/dist/tree.js.map +1 -1
  240. package/dist/typecheck.d.ts +1 -1
  241. package/dist/typecheck.d.ts.map +1 -1
  242. package/dist/typecheck.js +81 -16
  243. package/dist/typecheck.js.map +2 -2
  244. package/dist/write.d.ts +1 -1
  245. package/dist/write.d.ts.map +1 -1
  246. package/dist/write.js +3 -2
  247. package/dist/write.js.map +2 -2
  248. package/package.json +7 -3
package/dist/test.js CHANGED
@@ -4,17 +4,17 @@ import * as path9 from "node:path";
4
4
  // src/_spawn-stream.ts
5
5
  import { spawn as spawn2 } from "node:child_process";
6
6
  import {
7
- buildChildEnv,
8
7
  emitProcessCompleted,
9
8
  emitProcessOutput,
10
9
  emitProcessStarted
11
- } from "@wrongstack/core";
10
+ } from "@wrongstack/core/observability";
11
+ import { buildChildEnv } from "@wrongstack/core/utils";
12
12
 
13
13
  // src/_output-spool.ts
14
14
  import { createWriteStream, mkdirSync } from "node:fs";
15
15
  import * as fsp from "node:fs/promises";
16
16
  import * as path from "node:path";
17
- import { wstackGlobalRoot } from "@wrongstack/core";
17
+ import { wstackGlobalRoot } from "@wrongstack/core/utils";
18
18
  var SPOOL_RETENTION_MS = 7 * 24 * 60 * 60 * 1e3;
19
19
  var SPOOL_WRITE_HWM_BYTES = 4 * 1024 * 1024;
20
20
  var sweepStarted = false;
@@ -314,7 +314,7 @@ var CircuitBreaker = class {
314
314
  };
315
315
 
316
316
  // src/_redact-command.ts
317
- import { expectDefined } from "@wrongstack/core";
317
+ import { expectDefined } from "@wrongstack/core/utils";
318
318
  var SENSITIVE_FLAG_PATTERNS = [
319
319
  // --flag=value or --flag "value" (value captured up to next space or comma)
320
320
  /--(?: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,
@@ -408,7 +408,12 @@ var ProcessRegistryImpl = class {
408
408
  this.breaker.setEnabled(false);
409
409
  }
410
410
  register(info) {
411
- this.processes.set(info.pid, { ...info, killed: false, protected: info.protected ?? false });
411
+ this.processes.set(info.pid, {
412
+ ...info,
413
+ killed: false,
414
+ protected: info.protected ?? false,
415
+ background: info.background ?? false
416
+ });
412
417
  }
413
418
  _isSafeSignalPid(pid) {
414
419
  return Number.isInteger(pid) && pid > 1 && pid !== process.pid && pid !== process.ppid;
@@ -461,12 +466,21 @@ var ProcessRegistryImpl = class {
461
466
  }
462
467
  return n;
463
468
  }
469
+ /** Count of active jobs explicitly launched in background mode. */
470
+ get activeBackgroundCount() {
471
+ let n = 0;
472
+ for (const p of this.processes.values()) {
473
+ if (p.background && !p.killed) n++;
474
+ }
475
+ return n;
476
+ }
464
477
  /**
465
478
  * Combined stats for observability — used by /ps and the TUI status bar.
466
479
  */
467
480
  stats() {
468
481
  return {
469
482
  activeCount: this.activeCount,
483
+ backgroundCount: this.activeBackgroundCount,
470
484
  totalCount: this.processes.size,
471
485
  breaker: this.breaker.snapshot()
472
486
  };
@@ -567,7 +581,7 @@ var ProcessRegistryImpl = class {
567
581
  this.autoKillTimer = setTimeout(() => {
568
582
  this.autoKillTimer = null;
569
583
  this.autoKillArmedAt = null;
570
- this.killAll({ force: false });
584
+ this.killAll({ force: false, preserveBackground: true });
571
585
  this.breaker.forceReset();
572
586
  this._emitBreakerCountdown();
573
587
  }, this.autoKillResetMs);
@@ -607,6 +621,7 @@ var ProcessRegistryImpl = class {
607
621
  if (!p) return false;
608
622
  if (p.killed) return true;
609
623
  if (p.protected) return false;
624
+ if (opts.preserveBackground && p.background) return false;
610
625
  const { force = false, graceMs = DEFAULT_GRACE_MS } = opts;
611
626
  const isWin2 = os.platform() === "win32";
612
627
  if (isWin2) {
@@ -958,7 +973,7 @@ async function* spawnStream(opts) {
958
973
 
959
974
  // src/_util.ts
960
975
  import * as path3 from "node:path";
961
- import * as Core from "@wrongstack/core";
976
+ import * as Core from "@wrongstack/core/utils";
962
977
  function resolvePath(input, ctx) {
963
978
  return path3.isAbsolute(input) ? path3.normalize(input) : path3.resolve(ctx.workingDir ?? ctx.cwd, input);
964
979
  }
@@ -1144,7 +1159,20 @@ function pythonProfile() {
1144
1159
  ]),
1145
1160
  ignoredDirectories: IGNORES,
1146
1161
  packageManagers: Object.freeze(["pip", "poetry", "pipenv", "uv"]),
1147
- executables: Object.freeze(["python", "python3", "ruff", "black", "pytest", "mypy", "pyright"]),
1162
+ executables: Object.freeze([
1163
+ "python",
1164
+ "python3",
1165
+ "pip",
1166
+ "pip3",
1167
+ "poetry",
1168
+ "pipenv",
1169
+ "uv",
1170
+ "ruff",
1171
+ "black",
1172
+ "pytest",
1173
+ "mypy",
1174
+ "pyright"
1175
+ ]),
1148
1176
  operations: Object.freeze({
1149
1177
  syntax: async (ctx) => {
1150
1178
  const py = ctx.options.target ? "python3" : "python3";
@@ -1204,6 +1232,14 @@ function pythonProfile() {
1204
1232
  network: true
1205
1233
  });
1206
1234
  },
1235
+ "package-remove": async (ctx) => {
1236
+ const names = packageNames(ctx);
1237
+ return names.length === 0 ? unavailable(ctx, "package-remove", "At least one package name is required.") : processPlan(ctx, "package-remove", "pip", ["uninstall", "--yes", ...names], {
1238
+ parser: "package-text",
1239
+ reason: "Remove validated Python packages.",
1240
+ mutating: true
1241
+ });
1242
+ },
1207
1243
  "package-audit": async (ctx) => processPlan(ctx, "package-audit", "pip", ["audit"], {
1208
1244
  parser: "pip-audit",
1209
1245
  reason: "Audit Python dependencies for vulnerabilities.",
@@ -1811,6 +1847,19 @@ function typescriptProfile() {
1811
1847
  network: true
1812
1848
  });
1813
1849
  },
1850
+ "package-remove": async (ctx) => {
1851
+ const names = packageNames(ctx);
1852
+ if (names.length === 0)
1853
+ return unavailable(ctx, "package-remove", "At least one package name is required.");
1854
+ const manager = ctx.workspace.packageManager ?? "npm";
1855
+ const args = manager === "npm" ? ["uninstall", "--ignore-scripts", ...names] : ["remove", "--ignore-scripts", ...names];
1856
+ return processPlan(ctx, "package-remove", manager, args, {
1857
+ parser: "package-text",
1858
+ reason: `Remove validated packages with ${manager} and lifecycle scripts disabled.`,
1859
+ mutating: true,
1860
+ network: true
1861
+ });
1862
+ },
1814
1863
  "package-audit": async (ctx) => {
1815
1864
  const manager = ctx.workspace.packageManager ?? "npm";
1816
1865
  return processPlan(ctx, "package-audit", manager, ["audit", "--json"], {
@@ -2246,13 +2295,28 @@ var csharpProfile = {
2246
2295
  }),
2247
2296
  "package-add": async (ctx) => {
2248
2297
  const names = packageNames(ctx);
2249
- return names.length === 0 ? unavailable(ctx, "package-add", "At least one NuGet package is required.") : processPlan(ctx, "package-add", "dotnet", ["add", "package", ...names], {
2250
- parser: "dotnet-package",
2251
- reason: "Add validated NuGet packages.",
2252
- mutating: true,
2253
- network: true,
2254
- executesProjectCode: true
2255
- });
2298
+ const [spec] = names;
2299
+ const versionAt = spec?.lastIndexOf("@") ?? -1;
2300
+ const packageName = versionAt > 0 ? spec?.slice(0, versionAt) : spec;
2301
+ const packageVersion = versionAt > 0 ? spec?.slice(versionAt + 1) : void 0;
2302
+ return names.length === 0 ? unavailable(ctx, "package-add", "At least one NuGet package is required.") : names.length > 1 ? unavailable(ctx, "package-add", "NuGet package changes run one package at a time.") : processPlan(
2303
+ ctx,
2304
+ "package-add",
2305
+ "dotnet",
2306
+ [
2307
+ "add",
2308
+ "package",
2309
+ packageName ?? "",
2310
+ ...packageVersion ? ["--version", packageVersion] : []
2311
+ ],
2312
+ {
2313
+ parser: "dotnet-package",
2314
+ reason: "Add validated NuGet packages.",
2315
+ mutating: true,
2316
+ network: true,
2317
+ executesProjectCode: true
2318
+ }
2319
+ );
2256
2320
  },
2257
2321
  "package-remove": async (ctx) => {
2258
2322
  const names = packageNames(ctx);
@@ -2906,6 +2970,7 @@ var MAX_ARGUMENT_LENGTH = 4096;
2906
2970
  var PACKAGE_NAME_RE = /^(?:@[a-z0-9._-]+\/)?[a-z0-9._-]+(?:@[a-z0-9*+._~^<>=|-]+)?$/i;
2907
2971
  var COMPOSER_PACKAGE_RE = /^[a-z0-9_.-]+\/[a-z0-9_.-]+(?::[a-z0-9*+._~^<>=|-]+)?$/i;
2908
2972
  var GO_MODULE_RE = /^(?:[a-z0-9.-]+\.)+[a-z0-9.-]+\/[a-z0-9._~+/@-]+$/i;
2973
+ var PYTHON_PACKAGE_RE = /^[a-z0-9._-]+(?:\[[a-z0-9._,-]+\])?==[a-z0-9*+._!~-]+$/i;
2909
2974
  async function planLanguageOperation(options) {
2910
2975
  validateOperationOptions(options.operation, options.operationOptions?.packages);
2911
2976
  const detection = await detectLanguageWorkspaces(options);
@@ -3089,7 +3154,7 @@ function validateOperationOptions(operation, packages) {
3089
3154
  if (value.startsWith(".") || value.startsWith("/") || /^[A-Za-z]:/.test(value) || value.includes("://")) {
3090
3155
  throw new Error(`Package paths and URLs are not supported: "${value}"`);
3091
3156
  }
3092
- if (!PACKAGE_NAME_RE.test(value) && !COMPOSER_PACKAGE_RE.test(value) && !GO_MODULE_RE.test(value)) {
3157
+ if (!PACKAGE_NAME_RE.test(value) && !COMPOSER_PACKAGE_RE.test(value) && !GO_MODULE_RE.test(value) && !PYTHON_PACKAGE_RE.test(value)) {
3093
3158
  throw new Error(`Invalid package identifier "${value}"`);
3094
3159
  }
3095
3160
  }