pi-lens 4.4.1 → 4.4.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.
Files changed (140) hide show
  1. package/CHANGELOG.md +88 -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-2VUQMUMT.js} +38 -37
  8. package/dist/{chunk-5JHXUETW.js → chunk-3EFKIGZN.js} +3 -3
  9. package/dist/chunk-3JNKMP3B.js +17 -0
  10. package/dist/{chunk-6P54TMWL.js → chunk-3VPVG5SU.js} +6 -6
  11. package/dist/{chunk-ZETYB3XG.js → chunk-3W7IEVVL.js} +44 -28
  12. package/dist/chunk-3YN6V5TV.js +85 -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-H5EV3VMF.js → chunk-5NGR67U5.js} +2 -2
  18. package/dist/{chunk-CBD2B5CP.js → chunk-5UCAH366.js} +21 -20
  19. package/dist/{chunk-BHWHXMQ2.js → chunk-67WMNWEE.js} +9 -8
  20. package/dist/{chunk-USHG4DLH.js → chunk-6C7JWPCP.js} +7 -7
  21. package/dist/{chunk-VPWKF3GN.js → chunk-6GFRNVYR.js} +11 -10
  22. package/dist/{chunk-3JL6IFD7.js → chunk-6SDEP3AJ.js} +9 -8
  23. package/dist/{chunk-NJF2X5XF.js → chunk-6STA6Z7I.js} +19 -17
  24. package/dist/{chunk-KJCWXUUS.js → chunk-724UL2TJ.js} +6 -4
  25. package/dist/{chunk-MQA2YBAH.js → chunk-76MWC2K6.js} +3 -3
  26. package/dist/{chunk-YLN4K6WD.js → chunk-77M37OKR.js} +10 -8
  27. package/dist/{chunk-XHSCVSOL.js → chunk-7DYBLXYA.js} +3 -3
  28. package/dist/{chunk-OC7LYAU5.js → chunk-AB3YYG6N.js} +24 -10
  29. package/dist/{chunk-LD7WFTRX.js → chunk-ACXEQZOU.js} +16 -16
  30. package/dist/{chunk-VSMJK3ZJ.js → chunk-AOHZU2BM.js} +1 -1
  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-UGSMCQ4D.js → chunk-CHOW74WE.js} +1 -1
  36. package/dist/{chunk-H2W2AXD3.js → chunk-CMMHNUZ2.js} +66 -58
  37. package/dist/chunk-CSHFH5IN.js +17 -0
  38. package/dist/chunk-EC47DWFA.js +56 -0
  39. package/dist/{chunk-KJN4IOEJ.js → chunk-EJIUXPBX.js} +1 -1
  40. package/dist/{chunk-IQZXOZ7S.js → chunk-EU63SDCG.js} +720 -334
  41. package/dist/{chunk-LNOMA3MP.js → chunk-FCSOVF55.js} +107 -3
  42. package/dist/{chunk-CFYISHUW.js → chunk-FLKWCIZH.js} +8 -5
  43. package/dist/{chunk-OYTMZXRF.js → chunk-FMSO6RDZ.js} +16 -14
  44. package/dist/{chunk-IUKPRZER.js → chunk-GAEGEPOC.js} +2 -2
  45. package/dist/{chunk-6XX5HCLK.js → chunk-GBPP5P7X.js} +4 -4
  46. package/dist/{chunk-TQFBZVCG.js → chunk-GXW6K4YJ.js} +1 -1
  47. package/dist/{chunk-ZZUFZUQZ.js → chunk-H6MF6EVN.js} +331 -107
  48. package/dist/{chunk-3JSEWUWI.js → chunk-IBGIOBEE.js} +3 -3
  49. package/dist/chunk-IZSHAIJ7.js +26 -0
  50. package/dist/{chunk-7ELY2CSM.js → chunk-JAU72XNY.js} +16 -14
  51. package/dist/chunk-JMYYOTQG.js +77 -0
  52. package/dist/{chunk-ELVWJYRV.js → chunk-JSQFTSC6.js} +12 -11
  53. package/dist/{chunk-J6DFZDFA.js → chunk-KBG47GHP.js} +4 -4
  54. package/dist/chunk-KDERNTCQ.js +28 -0
  55. package/dist/chunk-KSX3TXSZ.js +69 -0
  56. package/dist/{chunk-XGUL4SLQ.js → chunk-L3BLXZG7.js} +2 -2
  57. package/dist/chunk-LOP6GRPH.js +31 -0
  58. package/dist/{chunk-MTDRLSI7.js → chunk-M6HSLBWY.js} +1064 -986
  59. package/dist/chunk-MQLUAEOC.js +162 -0
  60. package/dist/{chunk-3MRXIJ6I.js → chunk-MRXKYPCS.js} +2 -2
  61. package/dist/{chunk-D65GOCJB.js → chunk-MXGY6KPT.js} +19 -16
  62. package/dist/{chunk-G3RLJYA2.js → chunk-N2H3ZPZY.js} +47 -1
  63. package/dist/{chunk-HREZQCT3.js → chunk-N3X6Q4YT.js} +3 -3
  64. package/dist/{chunk-HSIRMK2D.js → chunk-OCAGUNBC.js} +15 -15
  65. package/dist/{chunk-ZOEYVXSV.js → chunk-OXXKQCSV.js} +6 -6
  66. package/dist/{chunk-S6AMWKPC.js → chunk-P7266HLM.js} +2 -2
  67. package/dist/{chunk-64LU2OVH.js → chunk-PHDMFAKM.js} +12 -2
  68. package/dist/{chunk-IMSQR4WO.js → chunk-PNQDPDRC.js} +1 -1
  69. package/dist/{chunk-IUR76K6A.js → chunk-Q7DUK4LX.js} +5 -5
  70. package/dist/{chunk-CULQYFLU.js → chunk-QGQ5CCCG.js} +2 -2
  71. package/dist/{chunk-UEAHAMEI.js → chunk-QHJ6DQ2R.js} +11 -11
  72. package/dist/{chunk-BNKLYOOO.js → chunk-QILIYSJF.js} +1 -1
  73. package/dist/{chunk-VYKKMYVT.js → chunk-QOBUHWHX.js} +11 -6
  74. package/dist/{chunk-3PNFWVHT.js → chunk-QQNQ7SJW.js} +2 -75
  75. package/dist/{chunk-7M4T5N3V.js → chunk-R3PCY3YS.js} +14 -13
  76. package/dist/{chunk-MGIWSROG.js → chunk-RPLINGVB.js} +7 -7
  77. package/dist/{chunk-CMU4RMJB.js → chunk-RWWYJ623.js} +10 -1
  78. package/dist/{chunk-3FERWMCH.js → chunk-RXCOMYPY.js} +27 -26
  79. package/dist/{chunk-7BX5DWSA.js → chunk-SAEFPSB6.js} +11 -11
  80. package/dist/{chunk-N7YNJE5R.js → chunk-SQ4TVJBR.js} +10 -10
  81. package/dist/{chunk-DMS52BEP.js → chunk-SS36ZX4J.js} +9 -7
  82. package/dist/{chunk-JONGANYH.js → chunk-T6CPIZNT.js} +32 -30
  83. package/dist/{chunk-6UYA642J.js → chunk-TYM6OUIT.js} +13 -12
  84. package/dist/{chunk-ALQRYH6O.js → chunk-UXGETRP4.js} +13 -12
  85. package/dist/{chunk-FGALODG3.js → chunk-UZ3TUTRV.js} +1 -1
  86. package/dist/{chunk-J3FZR3YY.js → chunk-VCHXCQFG.js} +3 -3
  87. package/dist/{chunk-3P4PF2BX.js → chunk-VCO24T4L.js} +34 -22
  88. package/dist/{chunk-O7HZX7CA.js → chunk-VRZP76YM.js} +1 -1
  89. package/dist/{chunk-VZHJS6DR.js → chunk-VSSBEUFT.js} +16 -15
  90. package/dist/{chunk-U52SAGRM.js → chunk-VWCXW2E7.js} +1 -1
  91. package/dist/{chunk-WW5BLB74.js → chunk-WOA4LN2R.js} +2 -2
  92. package/dist/{chunk-ZMOMPX2Z.js → chunk-WU567RSC.js} +11 -10
  93. package/dist/{chunk-N77WFUL7.js → chunk-XAGLWMJ4.js} +23 -22
  94. package/dist/{chunk-WSEWKCXU.js → chunk-XCJN5IJU.js} +4 -4
  95. package/dist/{chunk-IR6XFA5P.js → chunk-XIJZVPD5.js} +16 -14
  96. package/dist/{chunk-OYOB3ZFG.js → chunk-XMSXXAHW.js} +2 -2
  97. package/dist/{chunk-34OCDWOS.js → chunk-XTMJ7XDT.js} +1 -1
  98. package/dist/{chunk-Z6BB4JLQ.js → chunk-XVF2VVXP.js} +5 -3
  99. package/dist/{chunk-AFZYMAIV.js → chunk-YIUAVF7E.js} +37 -35
  100. package/dist/{chunk-NFXP47RV.js → chunk-YSZNHOBY.js} +85 -31
  101. package/dist/{chunk-V5MEBST3.js → chunk-YYOIQFRS.js} +21 -21
  102. package/dist/chunk-Z527N6YQ.js +28 -0
  103. package/dist/{chunk-D6YF5HKX.js → chunk-ZANLILYD.js} +22 -2
  104. package/dist/{chunk-2UMYMRI3.js → chunk-ZGDGW2V3.js} +2 -2
  105. package/dist/{chunk-6B5I6ICN.js → chunk-ZHFZWTZV.js} +12 -11
  106. package/dist/{chunk-OEX24ECI.js → chunk-ZWFS3OEF.js} +51 -41
  107. package/dist/{chunk-AXKPQ6ZI.js → chunk-ZXYDQ3TZ.js} +5 -5
  108. package/dist/index.js +73783 -71033
  109. package/dist/mcp/analyze-cli.js +18 -8
  110. package/dist/mcp/cli.js +48 -37
  111. package/dist/mcp/server.js +568 -397
  112. package/dist/mcp/worker.js +67 -55
  113. package/dist/probes/installer.js +20 -19
  114. package/docs/astplayground.md +1 -1
  115. package/docs/configuration.md +29 -0
  116. package/docs/dependencies.md +3 -0
  117. package/docs/features.md +2 -2
  118. package/docs/globalconfig.md +2 -0
  119. package/docs/language-coverage.md +2 -1
  120. package/docs/lsp-capability-matrix.md +29 -7
  121. package/docs/lsp-idle-eviction.md +38 -47
  122. package/docs/pi-lens-fixer.md +4 -0
  123. package/docs/pi-lens-merge-policy.md +17 -4
  124. package/docs/pi-lens-retro.md +2 -1
  125. package/docs/pi-lens-reviewer.md +18 -0
  126. package/docs/pi-lens-subagent.md +7 -0
  127. package/docs/real-harness.md +17 -0
  128. package/docs/schema/pi-lens-config-v1.json +37 -2
  129. package/docs/servercapabilities.md +15 -4
  130. package/docs/settings.md +2 -1
  131. package/package.json +1 -1
  132. package/dist/chunk-2FQ62SPM.js +0 -83
  133. package/dist/chunk-7AXO3ZDF.js +0 -30
  134. package/dist/chunk-KMGPUKFD.js +0 -25
  135. package/dist/chunk-OZJINN4O.js +0 -84
  136. package/dist/chunk-RJFED73B.js +0 -79
  137. package/dist/chunk-RTQNRM5X.js +0 -27
  138. package/dist/chunk-VGEVL5EQ.js +0 -29
  139. package/dist/chunk-WPE5FPGR.js +0 -54
  140. package/dist/chunk-Z7QQA2KT.js +0 -27
@@ -1,13 +1,13 @@
1
1
  import { createRequire as __pilensCreateRequire } from "node:module"; const require = __pilensCreateRequire(import.meta.url);
2
2
  import {
3
3
  getGlobalPiLensDir
4
- } from "./chunk-T54VJRAD.js";
4
+ } from "./chunk-C34ZXZ7O.js";
5
5
  import {
6
6
  SPECIAL_FILENAMES
7
- } from "./chunk-64LU2OVH.js";
7
+ } from "./chunk-PHDMFAKM.js";
8
8
  import {
9
9
  getTurnId
10
- } from "./chunk-VSMJK3ZJ.js";
10
+ } from "./chunk-AOHZU2BM.js";
11
11
  import {
12
12
  BoundedFifoMap
13
13
  } from "./chunk-ABBOA7UD.js";
@@ -180,6 +180,7 @@ var LANGUAGES = [
180
180
  extensions: [".kt", ".kts"],
181
181
  grammar: "kotlin"
182
182
  },
183
+ { id: "lean", kind: "lean", extensions: [".lean"] },
183
184
  { id: "less", kind: "css", extensions: [".less"] },
184
185
  { id: "lua", kind: "lua", extensions: [".lua"], grammar: "lua" },
185
186
  { id: "markdown", kind: "markdown", extensions: [".md", ".mdx"] },
@@ -409,7 +410,8 @@ var SCAN_LANGUAGE_PRIORITY = [
409
410
  ["json", "jsonc"],
410
411
  ["yaml"],
411
412
  ["toml"],
412
- ["prisma"]
413
+ ["prisma"],
414
+ ["lean"]
413
415
  ];
414
416
 
415
417
  export {
@@ -1,17 +1,17 @@
1
1
  import { createRequire as __pilensCreateRequire } from "node:module"; const require = __pilensCreateRequire(import.meta.url);
2
2
  import {
3
3
  extractFactsFromTree
4
- } from "./chunk-TQFBZVCG.js";
4
+ } from "./chunk-GXW6K4YJ.js";
5
5
  import {
6
6
  findOwnerName
7
7
  } from "./chunk-5W3R6LFT.js";
8
8
  import {
9
9
  firstChildOfType,
10
10
  walk
11
- } from "./chunk-UEAHAMEI.js";
11
+ } from "./chunk-QHJ6DQ2R.js";
12
12
  import {
13
13
  isJstsFactFile
14
- } from "./chunk-64LU2OVH.js";
14
+ } from "./chunk-PHDMFAKM.js";
15
15
 
16
16
  // dist/clients/dispatch/facts/function-facts.js
17
17
  var BOUNDARY_PREFIXES = [
@@ -1,27 +1,29 @@
1
1
  import { createRequire as __pilensCreateRequire } from "node:module"; const require = __pilensCreateRequire(import.meta.url);
2
+ import {
3
+ scannerReportParentDir
4
+ } from "./chunk-CSHFH5IN.js";
2
5
  import {
3
6
  getScratchTreeGlobPatterns,
4
7
  nestedWorktreeOffsets
5
- } from "./chunk-J3FZR3YY.js";
8
+ } from "./chunk-VCHXCQFG.js";
6
9
  import {
7
10
  SecurityScanClient
8
- } from "./chunk-5JHXUETW.js";
11
+ } from "./chunk-3EFKIGZN.js";
9
12
  import {
10
13
  safeSpawnAsync
11
- } from "./chunk-T54VJRAD.js";
14
+ } from "./chunk-C34ZXZ7O.js";
12
15
  import {
13
16
  loadPiLensProjectConfig
14
- } from "./chunk-N2IRDBZI.js";
17
+ } from "./chunk-2BBLFX75.js";
15
18
  import {
16
19
  incrementDegradationCount
17
- } from "./chunk-7ELY2CSM.js";
20
+ } from "./chunk-JAU72XNY.js";
18
21
  import {
19
22
  toPosix
20
- } from "./chunk-G3RLJYA2.js";
23
+ } from "./chunk-N2H3ZPZY.js";
21
24
 
22
25
  // dist/clients/trivy-client.js
23
26
  import * as fs from "node:fs";
24
- import * as os from "node:os";
25
27
  import * as path from "node:path";
26
28
  import { mkdtempSync } from "node:fs";
27
29
  var EMPTY_RESULT = {
@@ -178,7 +180,7 @@ var TrivyClient = class extends SecurityScanClient {
178
180
  const scannedAt = (/* @__PURE__ */ new Date()).toISOString();
179
181
  const bin = this.binaryPath ?? "trivy";
180
182
  const severities = resolveSeverityFloor(cwd);
181
- const outDir = mkdtempSync(path.join(os.tmpdir(), "pi-lens-trivy-"));
183
+ const outDir = mkdtempSync(path.join(scannerReportParentDir(), "pi-lens-trivy-"));
182
184
  const reportPath = path.join(outDir, "trivy-report.json");
183
185
  try {
184
186
  const result = await safeSpawnAsync(bin, [
@@ -2,16 +2,16 @@ import { createRequire as __pilensCreateRequire } from "node:module"; const requ
2
2
  import {
3
3
  createAvailabilityProbeFlight,
4
4
  probeToolAsync
5
- } from "./chunk-CMU4RMJB.js";
5
+ } from "./chunk-RWWYJ623.js";
6
6
  import {
7
7
  classifyProbeFailure,
8
8
  createAvailabilityLatch,
9
9
  logAvailabilityDecision,
10
10
  startHostStallSampler
11
- } from "./chunk-O7HZX7CA.js";
11
+ } from "./chunk-VRZP76YM.js";
12
12
  import {
13
13
  createGenerationSource
14
- } from "./chunk-T54VJRAD.js";
14
+ } from "./chunk-C34ZXZ7O.js";
15
15
  import {
16
16
  createSingleFlight
17
17
  } from "./chunk-BW5KFIQC.js";
@@ -4,29 +4,32 @@ import {
4
4
  discoverManagedTool,
5
5
  getManagedToolEnvironment,
6
6
  resolveAvailableOrInstall
7
- } from "./chunk-NFXP47RV.js";
7
+ } from "./chunk-YSZNHOBY.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,27 +1,23 @@
1
1
  import { createRequire as __pilensCreateRequire } from "node:module"; const require = __pilensCreateRequire(import.meta.url);
2
2
  import {
3
3
  resolveToolCwd
4
- } from "./chunk-IUR76K6A.js";
4
+ } from "./chunk-Q7DUK4LX.js";
5
5
  import {
6
6
  allAvailableGlobalBinDirs,
7
7
  installArgs,
8
8
  pmBinary,
9
9
  resolveNodePackageManager
10
- } from "./chunk-T4QZ6FEH.js";
11
- import {
12
- assertInstallAllowed,
13
- projectTrustDenialReason
14
- } from "./chunk-D6YF5HKX.js";
10
+ } from "./chunk-AW7R2GWG.js";
15
11
  import {
16
12
  probeToolAsync
17
- } from "./chunk-CMU4RMJB.js";
13
+ } from "./chunk-RWWYJ623.js";
18
14
  import {
19
15
  TRANSIENT_MAX_COOLDOWN_MS,
20
16
  classifyProbeFailure,
21
17
  createAvailabilityLatch,
22
18
  logAvailabilityDecision,
23
19
  startHostStallSampler
24
- } from "./chunk-O7HZX7CA.js";
20
+ } from "./chunk-VRZP76YM.js";
25
21
  import {
26
22
  acquireBoundedPidFileLock,
27
23
  acquireQuarantinePidFileLock,
@@ -37,7 +33,11 @@ import {
37
33
  safeSpawnAsync,
38
34
  startGenerationHeartbeat,
39
35
  tryAcquireGeneration
40
- } from "./chunk-T54VJRAD.js";
36
+ } from "./chunk-C34ZXZ7O.js";
37
+ import {
38
+ assertInstallAllowed,
39
+ projectTrustDenialReason
40
+ } from "./chunk-ZANLILYD.js";
41
41
  import {
42
42
  DEFAULT_MAX_OUTPUT_BYTES,
43
43
  createBoundedOutputSink,
@@ -48,23 +48,23 @@ import {
48
48
  getDegradationLedgerGeneration,
49
49
  incrementDegradationCount,
50
50
  recordDegradationOnce
51
- } from "./chunk-7ELY2CSM.js";
51
+ } from "./chunk-JAU72XNY.js";
52
52
  import {
53
53
  logExtension
54
- } from "./chunk-34OCDWOS.js";
54
+ } from "./chunk-XTMJ7XDT.js";
55
55
  import {
56
56
  createNdjsonLogger,
57
57
  getGlobalPiLensLogDir,
58
58
  getMaxLogSizeMB,
59
59
  isTestMode
60
- } from "./chunk-VSMJK3ZJ.js";
60
+ } from "./chunk-AOHZU2BM.js";
61
61
  import {
62
62
  BoundedLruCache
63
63
  } from "./chunk-ABBOA7UD.js";
64
64
  import {
65
65
  findLocalToolConfig,
66
66
  isFullyQualified
67
- } from "./chunk-G3RLJYA2.js";
67
+ } from "./chunk-N2H3ZPZY.js";
68
68
  import {
69
69
  __require
70
70
  } from "./chunk-NXL4FFQQ.js";
@@ -4057,7 +4057,7 @@ async function stampInstallResolution(toolId) {
4057
4057
  return;
4058
4058
  try {
4059
4059
  const resolutionId = lastInstallResolutionId.get(toolId);
4060
- const refresh = await import("./chunk-CBD2B5CP.js");
4060
+ const refresh = await import("./chunk-5UCAH366.js");
4061
4061
  await refresh.stampManagedToolInstall(toolId, resolutionId);
4062
4062
  } catch {
4063
4063
  }
@@ -4070,7 +4070,7 @@ async function finishInstallAttempt(toolId, ok, startedAt) {
4070
4070
  if (ok) {
4071
4071
  resetSafeSpawnWindowsCommandCache();
4072
4072
  try {
4073
- const { resetMadgeManagedPathMemo } = await import("./chunk-WPE5FPGR.js");
4073
+ const { resetMadgeManagedPathMemo } = await import("./chunk-EC47DWFA.js");
4074
4074
  resetMadgeManagedPathMemo();
4075
4075
  } catch (err) {
4076
4076
  logSessionStart(`auto-install ${toolId}: madge memo reset failed: ${err.message}`);
@@ -4100,7 +4100,7 @@ async function installTool(toolId, ownsLock) {
4100
4100
  return false;
4101
4101
  const npmPath = await installNpmTool(tool.id, tool.packageName, tool.binaryName, tool.checkArgs, getToolVerificationTimeout(tool), packageEntryVerification(tool), ownsLock);
4102
4102
  if (npmPath !== void 0) {
4103
- await import("./chunk-CBD2B5CP.js").then((m) => m.stampManagedToolInstalled(tool.id, tool.packageName)).catch(() => {
4103
+ await import("./chunk-5UCAH366.js").then((m) => m.stampManagedToolInstalled(tool.id, tool.packageName)).catch(() => {
4104
4104
  });
4105
4105
  }
4106
4106
  return finishInstallAttempt(tool.id, npmPath !== void 0, startedAt);
@@ -3,7 +3,7 @@ import {
3
3
  isUnderDir,
4
4
  normalizeFilePath,
5
5
  pathsEqual
6
- } from "./chunk-G3RLJYA2.js";
6
+ } from "./chunk-N2H3ZPZY.js";
7
7
 
8
8
  // dist/clients/env-utils.js
9
9
  function isTestMode() {
@@ -2,27 +2,38 @@ import { createRequire as __pilensCreateRequire } from "node:module"; const requ
2
2
  import {
3
3
  createAvailabilityProbeFlight,
4
4
  probeToolAsync
5
- } from "./chunk-CMU4RMJB.js";
5
+ } from "./chunk-RWWYJ623.js";
6
6
  import {
7
7
  classifyProbeFailure,
8
8
  createAvailabilityLatch,
9
9
  isTransientDecision,
10
10
  logAvailabilityDecision,
11
11
  startHostStallSampler
12
- } from "./chunk-O7HZX7CA.js";
12
+ } from "./chunk-VRZP76YM.js";
13
13
  import {
14
14
  createGenerationSource,
15
15
  safeSpawnAsync
16
- } from "./chunk-T54VJRAD.js";
16
+ } from "./chunk-C34ZXZ7O.js";
17
+ import {
18
+ getProjectTrustState
19
+ } from "./chunk-ZANLILYD.js";
20
+ import {
21
+ recordDegradationOnce
22
+ } from "./chunk-JAU72XNY.js";
23
+ import {
24
+ logExtension
25
+ } from "./chunk-XTMJ7XDT.js";
17
26
  import {
18
27
  isAtOrAboveHomeDir,
28
+ isUnderDir,
19
29
  walkUpDirs
20
- } from "./chunk-G3RLJYA2.js";
30
+ } from "./chunk-N2H3ZPZY.js";
21
31
 
22
32
  // dist/clients/package-manager.js
23
33
  import * as fs from "node:fs";
24
34
  import * as os from "node:os";
25
35
  import * as path from "node:path";
36
+ import { resolve as resolvePath } from "node:path";
26
37
  var PREFERENCE = [
27
38
  "npm",
28
39
  "pnpm",
@@ -254,6 +265,41 @@ var VENV_BIN_DIRS = [
254
265
  path.join(".venv", "Scripts"),
255
266
  path.join("venv", "Scripts")
256
267
  ];
268
+ var PROJECT_LOCAL_BIN_DIRS = [
269
+ ...NODE_MODULES_BIN_DIRS,
270
+ ...VENDOR_BIN_DIRS,
271
+ ...VENV_BIN_DIRS
272
+ ];
273
+ function localBinPath(value) {
274
+ return typeof value === "string" ? value : void 0;
275
+ }
276
+ function refuseLocalBin(tool, root) {
277
+ const trust = getProjectTrustState();
278
+ const resolvedRoot = resolvePath(root);
279
+ const subject = `project-local-binary:${resolvedRoot}:${tool}`;
280
+ if (recordDegradationOnce({
281
+ kind: "trust-refusal",
282
+ subject,
283
+ reason: `project-local binary refused: pi project trust is ${trust}`
284
+ })) {
285
+ logExtension({
286
+ subsystem: "project-trust",
287
+ level: "warn",
288
+ message: "project-local binary refused: mark the project trusted in pi or upgrade pi",
289
+ metadata: { tool, root: resolvedRoot, trust }
290
+ });
291
+ }
292
+ return { kind: "refused-by-trust", tool, root: resolvedRoot, trust };
293
+ }
294
+ function isProjectLocalBinPath(resolvedCommand, cwd) {
295
+ for (const ancestor of walkUpDirs(cwd)) {
296
+ if (isAtOrAboveHomeDir(ancestor, os.homedir()))
297
+ break;
298
+ if (PROJECT_LOCAL_BIN_DIRS.some((binDir) => isUnderDir(resolvedCommand, path.join(ancestor, binDir))))
299
+ return true;
300
+ }
301
+ return false;
302
+ }
257
303
  function expandCandidateNames(tools, windowsExt, isWindows) {
258
304
  return isWindows && windowsExt !== "" ? tools.flatMap((tool) => [`${tool}${windowsExt}`, tool]) : [...tools];
259
305
  }
@@ -276,18 +322,27 @@ function* localBinMatches(tools, startDir, options) {
276
322
  }
277
323
  }
278
324
  function findLocalBinUpwards(tool, startDir, options = {}) {
279
- return localBinMatches([tool], startDir, options).next().value;
325
+ const match = localBinMatches([tool], startDir, options).next().value;
326
+ if (match === void 0 || options.ceiling === false)
327
+ return match;
328
+ if (getProjectTrustState() !== "trusted")
329
+ return refuseLocalBin(tool, startDir);
330
+ return match;
280
331
  }
281
332
  function findLocalBinsAt(tools, dir, options = {}) {
282
333
  const { windowsExt = ".cmd", binDirs = NODE_MODULES_BIN_DIRS, isWindows = onWindows() } = options;
283
334
  const names = expandCandidateNames(tools, windowsExt, isWindows);
284
- return [...matchesInDir(path.resolve(dir), names, binDirs)];
335
+ const matches = [...matchesInDir(path.resolve(dir), names, binDirs)];
336
+ if (matches.length === 0 || getProjectTrustState() === "trusted")
337
+ return matches;
338
+ return [refuseLocalBin(tools.join(","), dir)];
285
339
  }
286
340
  function findLocalBinAt(tool, dir, options = {}) {
287
- return findLocalBinsAt([tool], dir, options)[0];
341
+ const match = findLocalBinsAt([tool], dir, options)[0];
342
+ return match;
288
343
  }
289
344
  async function findNodeToolBinary(tool, cwd, windowsExt = ".cmd") {
290
- return findLocalBinUpwards(tool, cwd, { windowsExt }) ?? await findGlobalBinary(tool, windowsExt);
345
+ return localBinPath(findLocalBinUpwards(tool, cwd, { windowsExt })) ?? await findGlobalBinary(tool, windowsExt);
291
346
  }
292
347
 
293
348
  export {
@@ -301,6 +356,8 @@ export {
301
356
  findGlobalBinary,
302
357
  VENDOR_BIN_DIRS,
303
358
  VENV_BIN_DIRS,
359
+ localBinPath,
360
+ isProjectLocalBinPath,
304
361
  findLocalBinUpwards,
305
362
  findLocalBinsAt,
306
363
  findLocalBinAt,
@@ -7,19 +7,20 @@ import {
7
7
  loadCallGraph,
8
8
  parseSymbolKey,
9
9
  saveCallGraph
10
- } from "./chunk-WW5BLB74.js";
10
+ } from "./chunk-WOA4LN2R.js";
11
11
  import "./chunk-3MED75HT.js";
12
- import "./chunk-T54VJRAD.js";
13
- import "./chunk-N2IRDBZI.js";
14
- import "./chunk-Z6BB4JLQ.js";
12
+ import "./chunk-C34ZXZ7O.js";
13
+ import "./chunk-2BBLFX75.js";
14
+ import "./chunk-XVF2VVXP.js";
15
15
  import "./chunk-2EECBNC5.js";
16
- import "./chunk-7ELY2CSM.js";
17
- import "./chunk-34OCDWOS.js";
18
- import "./chunk-3PNFWVHT.js";
19
- import "./chunk-VSMJK3ZJ.js";
16
+ import "./chunk-JAU72XNY.js";
17
+ import "./chunk-XTMJ7XDT.js";
18
+ import "./chunk-JMYYOTQG.js";
19
+ import "./chunk-QQNQ7SJW.js";
20
+ import "./chunk-AOHZU2BM.js";
20
21
  import "./chunk-LJDODBBZ.js";
21
22
  import "./chunk-ABBOA7UD.js";
22
- import "./chunk-G3RLJYA2.js";
23
+ import "./chunk-N2H3ZPZY.js";
23
24
  import "./chunk-NXL4FFQQ.js";
24
25
  export {
25
26
  CALL_GRAPH_CACHE_VERSION,
@@ -3,22 +3,23 @@ import {
3
3
  RustClient,
4
4
  resetRustAvailability,
5
5
  rustClient
6
- } from "./chunk-3MRXIJ6I.js";
7
- import "./chunk-XHSCVSOL.js";
8
- import "./chunk-CMU4RMJB.js";
9
- import "./chunk-O7HZX7CA.js";
10
- import "./chunk-T54VJRAD.js";
6
+ } from "./chunk-MRXKYPCS.js";
7
+ import "./chunk-7DYBLXYA.js";
8
+ import "./chunk-RWWYJ623.js";
9
+ import "./chunk-VRZP76YM.js";
10
+ import "./chunk-C34ZXZ7O.js";
11
11
  import "./chunk-BW5KFIQC.js";
12
- import "./chunk-N2IRDBZI.js";
13
- import "./chunk-Z6BB4JLQ.js";
12
+ import "./chunk-2BBLFX75.js";
13
+ import "./chunk-XVF2VVXP.js";
14
14
  import "./chunk-2EECBNC5.js";
15
- import "./chunk-7ELY2CSM.js";
16
- import "./chunk-34OCDWOS.js";
17
- import "./chunk-3PNFWVHT.js";
18
- import "./chunk-VSMJK3ZJ.js";
15
+ import "./chunk-JAU72XNY.js";
16
+ import "./chunk-XTMJ7XDT.js";
17
+ import "./chunk-JMYYOTQG.js";
18
+ import "./chunk-QQNQ7SJW.js";
19
+ import "./chunk-AOHZU2BM.js";
19
20
  import "./chunk-LJDODBBZ.js";
20
21
  import "./chunk-ABBOA7UD.js";
21
- import "./chunk-G3RLJYA2.js";
22
+ import "./chunk-N2H3ZPZY.js";
22
23
  import "./chunk-NXL4FFQQ.js";
23
24
  export {
24
25
  RustClient,
@@ -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,
@@ -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;