pi-lens 4.4.1 → 4.4.2

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 (138) hide show
  1. package/CHANGELOG.md +63 -0
  2. package/config/dependency-cruiser-eager-allowlist.json +3 -1
  3. package/dist/{chunk-BJF25SUG.js → chunk-23WOO7TX.js} +11 -10
  4. package/dist/{chunk-WATC3IQR.js → chunk-2B73ZPOK.js} +3 -3
  5. package/dist/{chunk-N2IRDBZI.js → chunk-2BBLFX75.js} +101 -11
  6. package/dist/{chunk-TA5L5KWQ.js → chunk-2CD5RS6M.js} +2 -2
  7. package/dist/{chunk-3TTPKMEF.js → chunk-2ZGIZPDG.js} +38 -37
  8. package/dist/{chunk-LNOMA3MP.js → chunk-34WSVGEM.js} +29 -3
  9. package/dist/chunk-3JNKMP3B.js +17 -0
  10. package/dist/{chunk-H2W2AXD3.js → chunk-3UUPUE3O.js} +41 -35
  11. package/dist/{chunk-6P54TMWL.js → chunk-3VPVG5SU.js} +6 -6
  12. package/dist/chunk-3WA4HP4I.js +55 -0
  13. package/dist/chunk-466Z26MG.js +30 -0
  14. package/dist/{chunk-PCHDGUKT.js → chunk-4UNXBNE2.js} +12 -11
  15. package/dist/{chunk-J7WJZ6W7.js → chunk-4W4VLAPJ.js} +12 -11
  16. package/dist/{chunk-F5VLZHUW.js → chunk-52FUZI6K.js} +4 -2
  17. package/dist/chunk-5JM2524W.js +84 -0
  18. package/dist/{chunk-H5EV3VMF.js → chunk-5NGR67U5.js} +2 -2
  19. package/dist/{chunk-YLN4K6WD.js → chunk-66SXUJCA.js} +6 -6
  20. package/dist/{chunk-LD7WFTRX.js → chunk-66VMUL7Q.js} +16 -16
  21. package/dist/{chunk-BHWHXMQ2.js → chunk-67WMNWEE.js} +9 -8
  22. package/dist/{chunk-USHG4DLH.js → chunk-6C7JWPCP.js} +7 -7
  23. package/dist/{chunk-VPWKF3GN.js → chunk-6GFRNVYR.js} +11 -10
  24. package/dist/{chunk-3JL6IFD7.js → chunk-6SDEP3AJ.js} +9 -8
  25. package/dist/{chunk-KJCWXUUS.js → chunk-724UL2TJ.js} +6 -4
  26. package/dist/{chunk-MQA2YBAH.js → chunk-76MWC2K6.js} +3 -3
  27. package/dist/{chunk-XHSCVSOL.js → chunk-7DYBLXYA.js} +3 -3
  28. package/dist/{chunk-AFZYMAIV.js → chunk-7ULNCDCO.js} +37 -35
  29. package/dist/{chunk-VSMJK3ZJ.js → chunk-AOHZU2BM.js} +1 -1
  30. package/dist/{chunk-ZETYB3XG.js → chunk-ARJ6PLFH.js} +44 -28
  31. package/dist/{chunk-T4QZ6FEH.js → chunk-AW7R2GWG.js} +65 -8
  32. package/dist/{chunk-GAYGGICG.js → chunk-BKE7E7TC.js} +10 -9
  33. package/dist/{chunk-EUT3B22Y.js → chunk-BRGDSBJE.js} +13 -12
  34. package/dist/{chunk-T54VJRAD.js → chunk-C34ZXZ7O.js} +55 -11
  35. package/dist/{chunk-CBD2B5CP.js → chunk-CF24OIYI.js} +21 -20
  36. package/dist/{chunk-UGSMCQ4D.js → chunk-CHOW74WE.js} +1 -1
  37. package/dist/{chunk-OZJINN4O.js → chunk-CO2G5PHH.js} +2 -2
  38. package/dist/{chunk-OC7LYAU5.js → chunk-EETY4LF7.js} +24 -10
  39. package/dist/{chunk-KJN4IOEJ.js → chunk-EJIUXPBX.js} +1 -1
  40. package/dist/{chunk-IQZXOZ7S.js → chunk-ESBQHFMJ.js} +549 -271
  41. package/dist/{chunk-CFYISHUW.js → chunk-FLKWCIZH.js} +8 -5
  42. package/dist/{chunk-IUKPRZER.js → chunk-GAEGEPOC.js} +2 -2
  43. package/dist/{chunk-6XX5HCLK.js → chunk-GBPP5P7X.js} +4 -4
  44. package/dist/{chunk-3FERWMCH.js → chunk-GHB6AYCP.js} +27 -26
  45. package/dist/{chunk-NFXP47RV.js → chunk-GOYRYZ2R.js} +26 -24
  46. package/dist/{chunk-TQFBZVCG.js → chunk-GXW6K4YJ.js} +1 -1
  47. package/dist/{chunk-N7YNJE5R.js → chunk-GZYBXISR.js} +9 -9
  48. package/dist/{chunk-3JSEWUWI.js → chunk-IBGIOBEE.js} +3 -3
  49. package/dist/{chunk-OYTMZXRF.js → chunk-IBRALRBR.js} +15 -14
  50. package/dist/{chunk-5JHXUETW.js → chunk-IXXDFY73.js} +3 -3
  51. package/dist/chunk-IZSHAIJ7.js +26 -0
  52. package/dist/{chunk-7ELY2CSM.js → chunk-JAU72XNY.js} +16 -14
  53. package/dist/chunk-JMYYOTQG.js +77 -0
  54. package/dist/{chunk-ELVWJYRV.js → chunk-JSQFTSC6.js} +12 -11
  55. package/dist/{chunk-3P4PF2BX.js → chunk-JWA5I3SR.js} +34 -20
  56. package/dist/{chunk-J6DFZDFA.js → chunk-KBG47GHP.js} +4 -4
  57. package/dist/{chunk-XGUL4SLQ.js → chunk-L3BLXZG7.js} +2 -2
  58. package/dist/chunk-LOP6GRPH.js +31 -0
  59. package/dist/chunk-MQLUAEOC.js +162 -0
  60. package/dist/{chunk-3MRXIJ6I.js → chunk-MRXKYPCS.js} +2 -2
  61. package/dist/{chunk-G3RLJYA2.js → chunk-N2H3ZPZY.js} +47 -1
  62. package/dist/{chunk-HREZQCT3.js → chunk-N3X6Q4YT.js} +3 -3
  63. package/dist/{chunk-NJF2X5XF.js → chunk-NW7BOILN.js} +19 -17
  64. package/dist/{chunk-ZZUFZUQZ.js → chunk-ODBNXWT4.js} +275 -90
  65. package/dist/{chunk-HSIRMK2D.js → chunk-OG5UUPN7.js} +13 -13
  66. package/dist/{chunk-ZOEYVXSV.js → chunk-OXXKQCSV.js} +6 -6
  67. package/dist/{chunk-S6AMWKPC.js → chunk-P7266HLM.js} +2 -2
  68. package/dist/{chunk-JONGANYH.js → chunk-PFNSLWU5.js} +31 -30
  69. package/dist/{chunk-64LU2OVH.js → chunk-PHDMFAKM.js} +12 -2
  70. package/dist/{chunk-IMSQR4WO.js → chunk-PNQDPDRC.js} +1 -1
  71. package/dist/{chunk-MTDRLSI7.js → chunk-PV6LR5P5.js} +5398 -1156
  72. package/dist/{chunk-N77WFUL7.js → chunk-Q6ZWTCLY.js} +24 -22
  73. package/dist/{chunk-IUR76K6A.js → chunk-Q7DUK4LX.js} +5 -5
  74. package/dist/{chunk-CULQYFLU.js → chunk-QGQ5CCCG.js} +2 -2
  75. package/dist/{chunk-UEAHAMEI.js → chunk-QHJ6DQ2R.js} +11 -11
  76. package/dist/{chunk-BNKLYOOO.js → chunk-QILIYSJF.js} +1 -1
  77. package/dist/{chunk-VYKKMYVT.js → chunk-QOBUHWHX.js} +11 -6
  78. package/dist/{chunk-3PNFWVHT.js → chunk-QQNQ7SJW.js} +2 -75
  79. package/dist/{chunk-OEX24ECI.js → chunk-QZVW3AAK.js} +50 -41
  80. package/dist/{chunk-7M4T5N3V.js → chunk-R3PCY3YS.js} +14 -13
  81. package/dist/{chunk-MGIWSROG.js → chunk-RPLINGVB.js} +7 -7
  82. package/dist/{chunk-CMU4RMJB.js → chunk-RWWYJ623.js} +10 -1
  83. package/dist/{chunk-7BX5DWSA.js → chunk-SAEFPSB6.js} +11 -11
  84. package/dist/{chunk-6UYA642J.js → chunk-TYM6OUIT.js} +13 -12
  85. package/dist/{chunk-ALQRYH6O.js → chunk-UXGETRP4.js} +13 -12
  86. package/dist/{chunk-FGALODG3.js → chunk-UZ3TUTRV.js} +1 -1
  87. package/dist/{chunk-J3FZR3YY.js → chunk-VCHXCQFG.js} +3 -3
  88. package/dist/{chunk-DMS52BEP.js → chunk-VITUCP5A.js} +5 -5
  89. package/dist/{chunk-O7HZX7CA.js → chunk-VRZP76YM.js} +1 -1
  90. package/dist/{chunk-VZHJS6DR.js → chunk-VSSBEUFT.js} +16 -15
  91. package/dist/{chunk-U52SAGRM.js → chunk-VWCXW2E7.js} +1 -1
  92. package/dist/{chunk-WW5BLB74.js → chunk-WOA4LN2R.js} +2 -2
  93. package/dist/{chunk-IR6XFA5P.js → chunk-WOKKRCJ5.js} +15 -14
  94. package/dist/{chunk-ZMOMPX2Z.js → chunk-WU567RSC.js} +11 -10
  95. package/dist/{chunk-WSEWKCXU.js → chunk-XCJN5IJU.js} +4 -4
  96. package/dist/{chunk-D65GOCJB.js → chunk-XKIZ2HNN.js} +15 -14
  97. package/dist/{chunk-OYOB3ZFG.js → chunk-XMSXXAHW.js} +2 -2
  98. package/dist/chunk-XPZPXCBV.js +28 -0
  99. package/dist/{chunk-34OCDWOS.js → chunk-XTMJ7XDT.js} +1 -1
  100. package/dist/{chunk-Z6BB4JLQ.js → chunk-XVF2VVXP.js} +5 -3
  101. package/dist/chunk-Z527N6YQ.js +28 -0
  102. package/dist/{chunk-D6YF5HKX.js → chunk-ZANLILYD.js} +22 -2
  103. package/dist/{chunk-2UMYMRI3.js → chunk-ZGDGW2V3.js} +2 -2
  104. package/dist/{chunk-6B5I6ICN.js → chunk-ZHFZWTZV.js} +12 -11
  105. package/dist/{chunk-AXKPQ6ZI.js → chunk-ZXYDQ3TZ.js} +5 -5
  106. package/dist/index.js +72740 -70136
  107. package/dist/mcp/analyze-cli.js +18 -8
  108. package/dist/mcp/cli.js +48 -37
  109. package/dist/mcp/server.js +564 -394
  110. package/dist/mcp/worker.js +66 -55
  111. package/dist/probes/installer.js +20 -19
  112. package/docs/astplayground.md +1 -1
  113. package/docs/configuration.md +29 -0
  114. package/docs/dependencies.md +3 -0
  115. package/docs/features.md +2 -2
  116. package/docs/globalconfig.md +2 -0
  117. package/docs/language-coverage.md +2 -1
  118. package/docs/lsp-capability-matrix.md +29 -7
  119. package/docs/lsp-idle-eviction.md +38 -47
  120. package/docs/pi-lens-fixer.md +4 -0
  121. package/docs/pi-lens-merge-policy.md +5 -0
  122. package/docs/pi-lens-retro.md +2 -1
  123. package/docs/pi-lens-reviewer.md +15 -0
  124. package/docs/pi-lens-subagent.md +2 -0
  125. package/docs/real-harness.md +17 -0
  126. package/docs/schema/pi-lens-config-v1.json +37 -2
  127. package/docs/servercapabilities.md +15 -4
  128. package/docs/settings.md +2 -1
  129. package/package.json +1 -1
  130. package/dist/chunk-2FQ62SPM.js +0 -83
  131. package/dist/chunk-7AXO3ZDF.js +0 -30
  132. package/dist/chunk-KMGPUKFD.js +0 -25
  133. package/dist/chunk-RJFED73B.js +0 -79
  134. package/dist/chunk-RTQNRM5X.js +0 -27
  135. package/dist/chunk-V5MEBST3.js +0 -4139
  136. package/dist/chunk-VGEVL5EQ.js +0 -29
  137. package/dist/chunk-WPE5FPGR.js +0 -54
  138. package/dist/chunk-Z7QQA2KT.js +0 -27
@@ -12,7 +12,7 @@ import {
12
12
  reportPiLensConfigRecords,
13
13
  resolveOnePiLensConfigDocument,
14
14
  warnIgnoredConfigOnce
15
- } from "./chunk-N2IRDBZI.js";
15
+ } from "./chunk-2BBLFX75.js";
16
16
  import {
17
17
  CANONICAL_GLOBAL_CONFIG_FILE,
18
18
  FRESHNESS_CADENCE_MS,
@@ -22,7 +22,7 @@ import {
22
22
  errorClassName,
23
23
  getPiLensGlobalConfigPath,
24
24
  getProductionGlobalConfigResolution
25
- } from "./chunk-Z6BB4JLQ.js";
25
+ } from "./chunk-XVF2VVXP.js";
26
26
  import {
27
27
  DEFAULT_MAX_OUTPUT_BYTES,
28
28
  createBoundedOutputSink,
@@ -42,16 +42,16 @@ import {
42
42
  readToolConfig,
43
43
  recordDegradation,
44
44
  recordDegradationOnce
45
- } from "./chunk-7ELY2CSM.js";
45
+ } from "./chunk-JAU72XNY.js";
46
46
  import {
47
47
  logExtension
48
- } from "./chunk-34OCDWOS.js";
48
+ } from "./chunk-XTMJ7XDT.js";
49
49
  import {
50
50
  logLatency
51
- } from "./chunk-3PNFWVHT.js";
51
+ } from "./chunk-QQNQ7SJW.js";
52
52
  import {
53
53
  getProcessSingleton
54
- } from "./chunk-VSMJK3ZJ.js";
54
+ } from "./chunk-AOHZU2BM.js";
55
55
  import {
56
56
  sweepOwnStagingFiles
57
57
  } from "./chunk-LJDODBBZ.js";
@@ -71,7 +71,7 @@ import {
71
71
  normalizeLoggedPath,
72
72
  normalizeMapKey,
73
73
  toProjectRelativePath
74
- } from "./chunk-G3RLJYA2.js";
74
+ } from "./chunk-N2H3ZPZY.js";
75
75
  import {
76
76
  __commonJS,
77
77
  __require,
@@ -1744,6 +1744,15 @@ function loadPiLensGlobalConfig(configPath) {
1744
1744
  warnInvalid("actionableWarnings.autoFix.maxFixes must be a non-negative finite number");
1745
1745
  }
1746
1746
  }
1747
+ const contextInjection = asConfigObject(raw.contextInjection);
1748
+ if (contextInjection && "requirePreExistingFixes" in contextInjection) {
1749
+ if (typeof contextInjection.requirePreExistingFixes === "boolean") {
1750
+ config.contextInjection ??= {};
1751
+ config.contextInjection.requirePreExistingFixes = contextInjection.requirePreExistingFixes;
1752
+ } else {
1753
+ warnInvalid("contextInjection.requirePreExistingFixes must be a boolean");
1754
+ }
1755
+ }
1747
1756
  const widget = asConfigObject(raw.widget);
1748
1757
  if (widget) {
1749
1758
  if (typeof widget.visible === "boolean") {
@@ -1876,6 +1885,17 @@ function classifyTmpDir(dir) {
1876
1885
  function ephemeralStagingRoot(filePath) {
1877
1886
  return classifyTmpDir(path6.dirname(path6.resolve(filePath))).stagingRoot;
1878
1887
  }
1888
+ function isPiOwnedTempPath(filePath) {
1889
+ const tmpRoot = realPathOfNearestExisting(os.tmpdir());
1890
+ const real = realPathOfNearestExisting(filePath);
1891
+ if (!isUnderDir(real, tmpRoot))
1892
+ return false;
1893
+ const relative3 = path6.relative(tmpRoot, real);
1894
+ if (relative3.length === 0 || path6.isAbsolute(relative3))
1895
+ return false;
1896
+ const segments = relative3.split(path6.sep);
1897
+ return segments.length === 1 || /^pi-/i.test(segments[0] ?? "");
1898
+ }
1879
1899
  function isEphemeralCheckoutRoot(dir) {
1880
1900
  return classifyTmpDir(dir).checkout;
1881
1901
  }
@@ -2049,6 +2069,21 @@ function getGlobalPiLensDir() {
2049
2069
  return path7.resolve(override);
2050
2070
  return path7.join(os2.homedir(), ".pi-lens");
2051
2071
  }
2072
+ function isPiLensInternalPath(filePath, projectRoot) {
2073
+ const absolute = path7.resolve(filePath);
2074
+ const home = path7.resolve(os2.homedir());
2075
+ const candidates = [
2076
+ getGlobalPiLensDir(),
2077
+ getProjectDataDir(projectRoot),
2078
+ path7.join(home, ".pi"),
2079
+ path7.join(home, ".pi-lens")
2080
+ ];
2081
+ if (candidates.some((dir) => isUnderDir(absolute, dir)))
2082
+ return true;
2083
+ if (isPiOwnedTempPath(absolute))
2084
+ return true;
2085
+ return false;
2086
+ }
2052
2087
  var EXCLUDED_DIRS = [
2053
2088
  "node_modules",
2054
2089
  ".git",
@@ -4592,8 +4627,16 @@ function resolveWindowsCommandForEnvironment(command, cwd, env) {
4592
4627
  function resolveWindowsCommand(command, cwd, env) {
4593
4628
  return resolveWindowsCommandForEnvironment(command, cwd, env);
4594
4629
  }
4595
- function getSpawnEnvironment(overrides) {
4596
- return process.platform === "win32" ? mergeWindowsEnvironment(process.env, overrides) : { ...process.env, ...overrides };
4630
+ function getSpawnEnvironment(overrides, stripNpmConfig) {
4631
+ const merged = process.platform === "win32" ? mergeWindowsEnvironment(process.env, overrides) : { ...process.env, ...overrides };
4632
+ if (!stripNpmConfig)
4633
+ return merged;
4634
+ const stripped = {};
4635
+ for (const [key, value] of Object.entries(merged)) {
4636
+ if (!/^npm_config_/i.test(key))
4637
+ stripped[key] = value;
4638
+ }
4639
+ return stripped;
4597
4640
  }
4598
4641
  var CMD_UNSAFE_CHARS = /["%!\r\n]/;
4599
4642
  function findCmdUnsafeValue(command, args) {
@@ -4786,7 +4829,7 @@ async function safeSpawnAsync(command, args, options) {
4786
4829
  }
4787
4830
  };
4788
4831
  const isWindows2 = process.platform === "win32";
4789
- const spawnEnv = getSpawnEnvironment(options?.env);
4832
+ const spawnEnv = getSpawnEnvironment(options?.env, options?.stripNpmConfig);
4790
4833
  const spawnCwd = isWindows2 ? resolveEffectiveWindowsCwd(options?.cwd, spawnEnv) ?? options?.cwd : options?.cwd;
4791
4834
  let spawnCmd = command;
4792
4835
  let spawnArgs = args;
@@ -5270,7 +5313,7 @@ async function findCommandAsync(command) {
5270
5313
  return result.stdout.trim().split("\n")[0] || null;
5271
5314
  }
5272
5315
  function safeSpawn(command, args, options) {
5273
- const spawnEnv = getSpawnEnvironment(options?.env);
5316
+ const spawnEnv = getSpawnEnvironment(options?.env, options?.stripNpmConfig);
5274
5317
  if (process.platform === "win32") {
5275
5318
  const spawnCwd = resolveEffectiveWindowsCwd(options?.cwd, spawnEnv) ?? options?.cwd;
5276
5319
  const resolved = resolveWindowsCommand(command, options?.cwd, spawnEnv);
@@ -5439,6 +5482,7 @@ export {
5439
5482
  drainProjectDataDirMigrations,
5440
5483
  displayProjectDataPath,
5441
5484
  getGlobalPiLensDir,
5485
+ isPiLensInternalPath,
5442
5486
  EXCLUDED_DIRS,
5443
5487
  getProjectIgnoreMatcher,
5444
5488
  isPathIgnoredByProject,
@@ -6,7 +6,7 @@ import {
6
6
  import {
7
7
  HOOK_WALL_BUDGET_MS,
8
8
  bounded
9
- } from "./chunk-F5VLZHUW.js";
9
+ } from "./chunk-52FUZI6K.js";
10
10
  import {
11
11
  acquireManagedInstallGate,
12
12
  commitDurableStoreAsync,
@@ -19,38 +19,39 @@ import {
19
19
  refreshManagedTool,
20
20
  resolveManagedNpmBinPath,
21
21
  verifyToolBinary
22
- } from "./chunk-LD7WFTRX.js";
23
- import "./chunk-IUR76K6A.js";
22
+ } from "./chunk-66VMUL7Q.js";
23
+ import "./chunk-Q7DUK4LX.js";
24
24
  import {
25
25
  pmBinary,
26
26
  resolveNodePackageManager,
27
27
  updateArgs
28
- } from "./chunk-T4QZ6FEH.js";
29
- import "./chunk-D6YF5HKX.js";
30
- import "./chunk-CMU4RMJB.js";
31
- import "./chunk-O7HZX7CA.js";
32
- import "./chunk-VYKKMYVT.js";
33
- import "./chunk-BNKLYOOO.js";
34
- import "./chunk-USHG4DLH.js";
35
- import "./chunk-H5EV3VMF.js";
28
+ } from "./chunk-AW7R2GWG.js";
29
+ import "./chunk-RWWYJ623.js";
30
+ import "./chunk-VRZP76YM.js";
31
+ import "./chunk-QOBUHWHX.js";
32
+ import "./chunk-QILIYSJF.js";
33
+ import "./chunk-6C7JWPCP.js";
34
+ import "./chunk-5NGR67U5.js";
36
35
  import {
37
36
  safeSpawnAsync
38
- } from "./chunk-T54VJRAD.js";
37
+ } from "./chunk-C34ZXZ7O.js";
39
38
  import "./chunk-BW5KFIQC.js";
40
39
  import "./chunk-QYF5S6P6.js";
41
- import "./chunk-64LU2OVH.js";
42
- import "./chunk-N2IRDBZI.js";
43
- import "./chunk-Z6BB4JLQ.js";
40
+ import "./chunk-PHDMFAKM.js";
41
+ import "./chunk-2BBLFX75.js";
42
+ import "./chunk-XVF2VVXP.js";
43
+ import "./chunk-ZANLILYD.js";
44
44
  import "./chunk-2EECBNC5.js";
45
45
  import {
46
46
  recordDegradationOnce
47
- } from "./chunk-7ELY2CSM.js";
48
- import "./chunk-34OCDWOS.js";
49
- import "./chunk-3PNFWVHT.js";
50
- import "./chunk-VSMJK3ZJ.js";
47
+ } from "./chunk-JAU72XNY.js";
48
+ import "./chunk-XTMJ7XDT.js";
49
+ import "./chunk-JMYYOTQG.js";
50
+ import "./chunk-QQNQ7SJW.js";
51
+ import "./chunk-AOHZU2BM.js";
51
52
  import "./chunk-LJDODBBZ.js";
52
53
  import "./chunk-ABBOA7UD.js";
53
- import "./chunk-G3RLJYA2.js";
54
+ import "./chunk-N2H3ZPZY.js";
54
55
  import "./chunk-NXL4FFQQ.js";
55
56
 
56
57
  // dist/clients/installer/managed-tool-refresh.js
@@ -4,7 +4,7 @@ import {
4
4
  } from "./chunk-ABBOA7UD.js";
5
5
  import {
6
6
  normalizeMapKey
7
- } from "./chunk-G3RLJYA2.js";
7
+ } from "./chunk-N2H3ZPZY.js";
8
8
 
9
9
  // dist/clients/dispatch/fact-store.js
10
10
  var capacityEvictionReporter;
@@ -1,10 +1,10 @@
1
1
  import { createRequire as __pilensCreateRequire } from "node:module"; const require = __pilensCreateRequire(import.meta.url);
2
2
  import {
3
3
  incrementDegradationCount
4
- } from "./chunk-7ELY2CSM.js";
4
+ } from "./chunk-JAU72XNY.js";
5
5
  import {
6
6
  logLatency
7
- } from "./chunk-3PNFWVHT.js";
7
+ } from "./chunk-QQNQ7SJW.js";
8
8
 
9
9
  // dist/clients/bounded-telemetry.js
10
10
  var MAX_TRACKED_TURN_CAPS = 64;
@@ -4,29 +4,32 @@ import {
4
4
  discoverManagedTool,
5
5
  getManagedToolEnvironment,
6
6
  resolveAvailableOrInstall
7
- } from "./chunk-NFXP47RV.js";
7
+ } from "./chunk-GOYRYZ2R.js";
8
8
  import {
9
9
  mapWithConcurrency
10
10
  } from "./chunk-XIMYZ3JA.js";
11
11
  import {
12
12
  findNodeToolBinary
13
- } from "./chunk-T4QZ6FEH.js";
13
+ } from "./chunk-AW7R2GWG.js";
14
+ import {
15
+ getIsolatedNpxSpawnOptions
16
+ } from "./chunk-RWWYJ623.js";
14
17
  import {
15
18
  createAvailabilityLatch
16
- } from "./chunk-O7HZX7CA.js";
19
+ } from "./chunk-VRZP76YM.js";
17
20
  import {
18
21
  safeSpawnAsync
19
- } from "./chunk-T54VJRAD.js";
22
+ } from "./chunk-C34ZXZ7O.js";
20
23
  import {
21
24
  compareOrdinal,
22
25
  recordDegradationOnce
23
- } from "./chunk-7ELY2CSM.js";
26
+ } from "./chunk-JAU72XNY.js";
24
27
  import {
25
28
  createSubsystemLogger
26
- } from "./chunk-34OCDWOS.js";
29
+ } from "./chunk-XTMJ7XDT.js";
27
30
  import {
28
31
  isFullyQualified
29
- } from "./chunk-G3RLJYA2.js";
32
+ } from "./chunk-N2H3ZPZY.js";
30
33
 
31
34
  // dist/clients/dependency-checker.js
32
35
  import * as fs from "node:fs";
@@ -41,7 +44,12 @@ function buildMadgeArgs(target, projectRoot) {
41
44
  return args;
42
45
  }
43
46
  function parseMadgeCycles(stdout, baseDir, projectRoot) {
44
- const parsed = JSON.parse(stdout || "[]");
47
+ let parsed;
48
+ try {
49
+ parsed = JSON.parse(stdout || "[]");
50
+ } catch (err) {
51
+ throw new Error(`madge report is not valid JSON: ${err instanceof Error ? err.message : String(err)}`);
52
+ }
45
53
  const cycles = Array.isArray(parsed) ? parsed : [];
46
54
  const circular = [];
47
55
  const circularFiles = /* @__PURE__ */ new Set();
@@ -446,7 +454,10 @@ var DependencyChecker = class _DependencyChecker {
446
454
  try {
447
455
  const result = await safeSpawnAsync(cmd, [...prefix, ...buildMadgeArgs(normalized, projectRoot)], {
448
456
  timeout: 15e3,
449
- cwd: projectRoot
457
+ // A cache-only npx fallback must not read the project's `.npmrc`
458
+ // (#4268 acceptance 3); a resolved madge keeps the project cwd.
459
+ cwd: projectRoot,
460
+ ...cmd === "npx" ? getIsolatedNpxSpawnOptions() : {}
450
461
  });
451
462
  if (result.error) {
452
463
  this.log(`Check error: ${result.error.message}`);
@@ -661,7 +672,10 @@ var DependencyChecker = class _DependencyChecker {
661
672
  const { cmd, prefix } = await this.resolveMadge(projectRoot);
662
673
  const result = await safeSpawnAsync(cmd, [...prefix, ...buildMadgeArgs(projectRoot, projectRoot)], {
663
674
  timeout: 3e4,
664
- cwd: projectRoot
675
+ // A cache-only npx fallback must not read the project's `.npmrc`
676
+ // (#4268 acceptance 3); a resolved madge keeps the project cwd.
677
+ cwd: projectRoot,
678
+ ...cmd === "npx" ? getIsolatedNpxSpawnOptions() : {}
665
679
  });
666
680
  if (result.error) {
667
681
  this.log(`Scan error: ${result.error.message}`);
@@ -1,7 +1,7 @@
1
1
  import { createRequire as __pilensCreateRequire } from "node:module"; const require = __pilensCreateRequire(import.meta.url);
2
2
  import {
3
3
  detectFileRole
4
- } from "./chunk-N2IRDBZI.js";
4
+ } from "./chunk-2BBLFX75.js";
5
5
 
6
6
  // dist/clients/collateral-test-role.js
7
7
  function isTestRoleCollateral(filePath) {