pi-lens 4.4.0 → 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 (150) hide show
  1. package/CHANGELOG.md +158 -0
  2. package/README.md +1 -0
  3. package/config/dependency-cruiser-eager-allowlist.json +3 -1
  4. package/dist/{chunk-IXEBJSUE.js → chunk-23WOO7TX.js} +11 -10
  5. package/dist/{chunk-E2WFBRHM.js → chunk-2B73ZPOK.js} +3 -3
  6. package/dist/{chunk-DQ2NZ7C4.js → chunk-2BBLFX75.js} +139 -11
  7. package/dist/{chunk-ZMOL6RQC.js → chunk-2CD5RS6M.js} +2 -2
  8. package/dist/{chunk-VD4JQCQC.js → chunk-2ZGIZPDG.js} +38 -37
  9. package/dist/{chunk-DIULIWKU.js → chunk-34WSVGEM.js} +29 -3
  10. package/dist/chunk-3JNKMP3B.js +17 -0
  11. package/dist/{chunk-HVUZXSWK.js → chunk-3UUPUE3O.js} +45 -41
  12. package/dist/{chunk-5RXBNSW2.js → chunk-3VPVG5SU.js} +16 -8
  13. package/dist/chunk-3WA4HP4I.js +55 -0
  14. package/dist/chunk-466Z26MG.js +30 -0
  15. package/dist/{chunk-34U7PLGE.js → chunk-4UNXBNE2.js} +12 -11
  16. package/dist/{chunk-E4MAEDPM.js → chunk-4W4VLAPJ.js} +12 -11
  17. package/dist/{chunk-GUOGVTCQ.js → chunk-52FUZI6K.js} +4 -2
  18. package/dist/chunk-5JM2524W.js +84 -0
  19. package/dist/{chunk-VHQLPIRJ.js → chunk-5NGR67U5.js} +2 -2
  20. package/dist/{chunk-DFVMIKMQ.js → chunk-66SXUJCA.js} +45 -9
  21. package/dist/{chunk-OQGFCZJ4.js → chunk-66VMUL7Q.js} +16 -16
  22. package/dist/{chunk-HWBZIGMJ.js → chunk-67WMNWEE.js} +9 -8
  23. package/dist/{chunk-6QIUX4EP.js → chunk-6C7JWPCP.js} +7 -7
  24. package/dist/{chunk-47D2BO4S.js → chunk-6GFRNVYR.js} +11 -10
  25. package/dist/{chunk-ZAWW3AF6.js → chunk-6SDEP3AJ.js} +9 -8
  26. package/dist/{chunk-TGPXLY2J.js → chunk-724UL2TJ.js} +38 -2
  27. package/dist/{chunk-YLF3PPT5.js → chunk-76MWC2K6.js} +3 -3
  28. package/dist/{chunk-F3P7VQ7H.js → chunk-7DYBLXYA.js} +3 -3
  29. package/dist/{chunk-AJ3QXTRQ.js → chunk-7ULNCDCO.js} +37 -35
  30. package/dist/{chunk-UK3CMEAL.js → chunk-AOHZU2BM.js} +1 -1
  31. package/dist/{chunk-F3AU2TMM.js → chunk-ARJ6PLFH.js} +44 -28
  32. package/dist/{chunk-U3VGR4VU.js → chunk-AW7R2GWG.js} +65 -8
  33. package/dist/{chunk-FJNKANOS.js → chunk-BKE7E7TC.js} +10 -9
  34. package/dist/{chunk-4W2PLC4J.js → chunk-BRGDSBJE.js} +13 -12
  35. package/dist/{chunk-VN2AXLEX.js → chunk-C34ZXZ7O.js} +102 -16
  36. package/dist/{chunk-T4ERT73Y.js → chunk-CF24OIYI.js} +21 -20
  37. package/dist/{chunk-NMABWBZN.js → chunk-CHOW74WE.js} +1 -1
  38. package/dist/{chunk-ARFCXG7S.js → chunk-CO2G5PHH.js} +2 -2
  39. package/dist/{chunk-AS44CFQ4.js → chunk-EETY4LF7.js} +24 -10
  40. package/dist/{chunk-I3R7GKDR.js → chunk-EJIUXPBX.js} +1 -1
  41. package/dist/{chunk-B3I2UUT4.js → chunk-ESBQHFMJ.js} +653 -251
  42. package/dist/{chunk-O5WILGMI.js → chunk-FLKWCIZH.js} +8 -5
  43. package/dist/{chunk-LNAKEO63.js → chunk-GAEGEPOC.js} +4 -4
  44. package/dist/{chunk-V7R425XG.js → chunk-GBPP5P7X.js} +4 -4
  45. package/dist/{chunk-XK4CIILI.js → chunk-GHB6AYCP.js} +27 -26
  46. package/dist/{chunk-7FBF7NPR.js → chunk-GOYRYZ2R.js} +29 -26
  47. package/dist/{chunk-JOLITGCC.js → chunk-GXW6K4YJ.js} +1 -1
  48. package/dist/{chunk-NXPS2L6U.js → chunk-GZYBXISR.js} +9 -9
  49. package/dist/{chunk-OAXNDZJ7.js → chunk-IBGIOBEE.js} +8 -4
  50. package/dist/{chunk-IIXOAGHR.js → chunk-IBRALRBR.js} +19 -15
  51. package/dist/{chunk-7F72PXY2.js → chunk-IXXDFY73.js} +3 -3
  52. package/dist/chunk-IZSHAIJ7.js +26 -0
  53. package/dist/{chunk-N3YQJI6O.js → chunk-JAU72XNY.js} +20 -15
  54. package/dist/chunk-JMYYOTQG.js +77 -0
  55. package/dist/{chunk-NL5GLMFI.js → chunk-JSQFTSC6.js} +12 -11
  56. package/dist/{chunk-IVP5KAB7.js → chunk-JWA5I3SR.js} +35 -21
  57. package/dist/{chunk-Y4T27COV.js → chunk-KBG47GHP.js} +4 -4
  58. package/dist/{chunk-PWFHBTSF.js → chunk-L3BLXZG7.js} +2 -2
  59. package/dist/chunk-LOP6GRPH.js +31 -0
  60. package/dist/chunk-MQLUAEOC.js +162 -0
  61. package/dist/{chunk-RPD5K5NC.js → chunk-MRXKYPCS.js} +2 -2
  62. package/dist/{chunk-Q5U6FMDI.js → chunk-N2H3ZPZY.js} +59 -7
  63. package/dist/{chunk-27BBHSZC.js → chunk-N3X6Q4YT.js} +3 -3
  64. package/dist/{chunk-UY752QSN.js → chunk-NW7BOILN.js} +19 -17
  65. package/dist/{chunk-TLGFBM3F.js → chunk-ODBNXWT4.js} +302 -113
  66. package/dist/{chunk-TT22N74J.js → chunk-OG5UUPN7.js} +13 -13
  67. package/dist/{chunk-C2AUYXQH.js → chunk-OXXKQCSV.js} +6 -6
  68. package/dist/{chunk-PAK6IDME.js → chunk-P7266HLM.js} +2 -2
  69. package/dist/{chunk-52H5B5TC.js → chunk-PFNSLWU5.js} +31 -30
  70. package/dist/{chunk-5ZEJHV35.js → chunk-PHDMFAKM.js} +12 -2
  71. package/dist/{chunk-3I5QFT3N.js → chunk-PNQDPDRC.js} +6 -3
  72. package/dist/{chunk-TVN5N6GY.js → chunk-PV6LR5P5.js} +6057 -1311
  73. package/dist/{chunk-AHDW3GPE.js → chunk-Q6ZWTCLY.js} +24 -22
  74. package/dist/{chunk-RUOG5D2C.js → chunk-Q7DUK4LX.js} +5 -5
  75. package/dist/{chunk-YSNFMJKN.js → chunk-QGQ5CCCG.js} +2 -2
  76. package/dist/{chunk-LW6XKDZQ.js → chunk-QHJ6DQ2R.js} +287 -38
  77. package/dist/{chunk-GVXA6CCE.js → chunk-QILIYSJF.js} +1 -1
  78. package/dist/{chunk-22AVIGXS.js → chunk-QOBUHWHX.js} +12 -7
  79. package/dist/{chunk-5THXD6X5.js → chunk-QQNQ7SJW.js} +2 -75
  80. package/dist/{chunk-4RERDEXR.js → chunk-QZVW3AAK.js} +50 -41
  81. package/dist/{chunk-AWE5TMPO.js → chunk-R3PCY3YS.js} +14 -13
  82. package/dist/{chunk-HHYAELLJ.js → chunk-RPLINGVB.js} +7 -7
  83. package/dist/{chunk-EOKRQ3SA.js → chunk-RWWYJ623.js} +10 -1
  84. package/dist/{chunk-YGVYKNSN.js → chunk-SAEFPSB6.js} +59 -12
  85. package/dist/{chunk-K6VYLB2U.js → chunk-TYM6OUIT.js} +13 -12
  86. package/dist/{chunk-AJXODZY6.js → chunk-UXGETRP4.js} +13 -12
  87. package/dist/{chunk-I7SPGOWI.js → chunk-UZ3TUTRV.js} +1 -1
  88. package/dist/{chunk-TO6WL3GM.js → chunk-VCHXCQFG.js} +12 -2
  89. package/dist/{chunk-BRJKOBZP.js → chunk-VITUCP5A.js} +17 -6
  90. package/dist/{chunk-WONERJTP.js → chunk-VRZP76YM.js} +1 -1
  91. package/dist/{chunk-OS32RNR2.js → chunk-VSSBEUFT.js} +16 -15
  92. package/dist/{chunk-VDBPVIKD.js → chunk-VWCXW2E7.js} +1 -1
  93. package/dist/{chunk-NKOUFPQF.js → chunk-WOA4LN2R.js} +2 -2
  94. package/dist/{chunk-RIISMHKN.js → chunk-WOKKRCJ5.js} +15 -13
  95. package/dist/{chunk-XECLWQZN.js → chunk-WU567RSC.js} +13 -10
  96. package/dist/{chunk-V5PXFSZK.js → chunk-XCJN5IJU.js} +4 -4
  97. package/dist/{chunk-ORTMY4Q4.js → chunk-XKIZ2HNN.js} +22 -14
  98. package/dist/{chunk-6VCD4VKZ.js → chunk-XMSXXAHW.js} +2 -2
  99. package/dist/chunk-XPZPXCBV.js +28 -0
  100. package/dist/{chunk-O6TQT6RI.js → chunk-XTMJ7XDT.js} +1 -1
  101. package/dist/{chunk-VNMT7C64.js → chunk-XVF2VVXP.js} +5 -3
  102. package/dist/chunk-Z527N6YQ.js +28 -0
  103. package/dist/{chunk-NTUJEGDZ.js → chunk-ZANLILYD.js} +22 -2
  104. package/dist/{chunk-6P62QVEA.js → chunk-ZGDGW2V3.js} +2 -2
  105. package/dist/{chunk-ODEEOXPH.js → chunk-ZHFZWTZV.js} +12 -11
  106. package/dist/{chunk-AJVLWNFN.js → chunk-ZXYDQ3TZ.js} +5 -5
  107. package/dist/index.js +102097 -97778
  108. package/dist/mcp/analyze-cli.js +18 -8
  109. package/dist/mcp/cli.js +48 -37
  110. package/dist/mcp/server.js +695 -426
  111. package/dist/mcp/worker.js +66 -55
  112. package/dist/probes/installer.js +20 -19
  113. package/docs/ast-grep_rules_catalog.md +2 -2
  114. package/docs/astplayground.md +1 -1
  115. package/docs/configuration.md +38 -2
  116. package/docs/custom-rules.md +25 -2
  117. package/docs/dependencies.md +3 -0
  118. package/docs/environment-variables.md +34 -6
  119. package/docs/features.md +39 -3
  120. package/docs/globalconfig.md +3 -1
  121. package/docs/language-coverage.md +2 -1
  122. package/docs/lsp-capability-matrix.md +29 -6
  123. package/docs/lsp-idle-eviction.md +38 -47
  124. package/docs/pi-lens-fixer.md +13 -5
  125. package/docs/pi-lens-merge-policy.md +48 -1
  126. package/docs/pi-lens-monitor.md +3 -1
  127. package/docs/pi-lens-retro.md +2 -1
  128. package/docs/pi-lens-reviewer.md +19 -3
  129. package/docs/pi-lens-subagent.md +2 -0
  130. package/docs/real-harness.md +17 -0
  131. package/docs/schema/pi-lens-config-v1.json +565 -0
  132. package/docs/servercapabilities.md +18 -4
  133. package/docs/settings.md +2 -1
  134. package/docs/word-index.md +6 -0
  135. package/package.json +1 -1
  136. package/rules/ast-grep-rules/rule-tests/no-identity-operator-on-literals-test.yml +12 -2
  137. package/rules/ast-grep-rules/rule-tests/throw-new-error-js-test.yml +2 -0
  138. package/rules/ast-grep-rules/rule-tests/throw-new-error-test.yml +2 -0
  139. package/rules/ast-grep-rules/rules/no-identity-operator-on-literals.yml +20 -12
  140. package/rules/ast-grep-rules/rules/throw-new-error-js.yml +2 -2
  141. package/rules/ast-grep-rules/rules/throw-new-error.yml +2 -2
  142. package/dist/chunk-54B42YRX.js +0 -27
  143. package/dist/chunk-CGGAIP7J.js +0 -29
  144. package/dist/chunk-D6QS3U6M.js +0 -30
  145. package/dist/chunk-HMFXILPV.js +0 -83
  146. package/dist/chunk-LSMJ6KBE.js +0 -4139
  147. package/dist/chunk-NTHH2J74.js +0 -27
  148. package/dist/chunk-RPD4ZSB7.js +0 -25
  149. package/dist/chunk-T6D4Q4AQ.js +0 -54
  150. package/dist/chunk-VCSRSYLF.js +0 -81
@@ -3,10 +3,16 @@ import {
3
3
  extractTomlTableSection,
4
4
  hasTomlTable,
5
5
  parseTomlStringArray
6
- } from "./chunk-PAK6IDME.js";
6
+ } from "./chunk-P7266HLM.js";
7
+ import {
8
+ getProjectTrustState
9
+ } from "./chunk-ZANLILYD.js";
7
10
  import {
8
11
  recordDegradationOnce
9
- } from "./chunk-N3YQJI6O.js";
12
+ } from "./chunk-JAU72XNY.js";
13
+ import {
14
+ logExtension
15
+ } from "./chunk-XTMJ7XDT.js";
10
16
  import {
11
17
  UV_WORKSPACE_EXCLUDE_DIALECT,
12
18
  UV_WORKSPACE_MEMBERS_DIALECT,
@@ -14,7 +20,7 @@ import {
14
20
  matchesWorkspaceMemberPattern,
15
21
  toPosix,
16
22
  walkUpDirs
17
- } from "./chunk-Q5U6FMDI.js";
23
+ } from "./chunk-N2H3ZPZY.js";
18
24
 
19
25
  // dist/clients/python-environment.js
20
26
  import { access, readFile } from "node:fs/promises";
@@ -68,6 +74,11 @@ function isUvWorkspaceMember(workspace, projectRoot) {
68
74
  }));
69
75
  return !workspace.exclude.some(matches(UV_WORKSPACE_EXCLUDE_DIALECT)) && workspace.members.some(matches(UV_WORKSPACE_MEMBERS_DIALECT));
70
76
  }
77
+ var PROJECT_SOURCED_PYTHON_SOURCES = /* @__PURE__ */ new Set([
78
+ "project-dot-venv",
79
+ "project-venv",
80
+ "uv-workspace"
81
+ ]);
71
82
  var AMBIENT_ENVIRONMENT_VARIABLES = {
72
83
  "uv-project-environment": "UV_PROJECT_ENVIRONMENT",
73
84
  "virtual-env": "VIRTUAL_ENV",
@@ -115,6 +126,21 @@ async function detectPythonEnvironment(projectRoot, homeDir = os.homedir(), opti
115
126
  continue;
116
127
  if (!allowAmbient && candidate.source in AMBIENT_ENVIRONMENT_VARIABLES && !isWithinProjectRoot(candidate.root))
117
128
  continue;
129
+ if (PROJECT_SOURCED_PYTHON_SOURCES.has(candidate.source) && getProjectTrustState() !== "trusted") {
130
+ if (recordDegradationOnce({
131
+ kind: "trust-refusal",
132
+ subject: `python-environment:${candidate.root}`,
133
+ reason: `project Python environment refused: pi project trust is ${getProjectTrustState()}`
134
+ })) {
135
+ logExtension({
136
+ subsystem: "project-trust",
137
+ level: "warn",
138
+ message: "project Python environment refused: mark the project trusted in pi or upgrade pi",
139
+ metadata: { source: candidate.source }
140
+ });
141
+ }
142
+ continue;
143
+ }
118
144
  const binDir = path.join(candidate.root, process.platform === "win32" ? "Scripts" : "bin");
119
145
  const pythonPath = path.join(binDir, process.platform === "win32" ? "python.exe" : "python");
120
146
  try {
@@ -0,0 +1,17 @@
1
+ import { createRequire as __pilensCreateRequire } from "node:module"; const require = __pilensCreateRequire(import.meta.url);
2
+ import {
3
+ configureLspServiceLifecycle,
4
+ getOwnedLspService,
5
+ peekOwnedLspService,
6
+ resetOwnedLspService
7
+ } from "./chunk-MQLUAEOC.js";
8
+ import "./chunk-QQNQ7SJW.js";
9
+ import "./chunk-AOHZU2BM.js";
10
+ import "./chunk-N2H3ZPZY.js";
11
+ import "./chunk-NXL4FFQQ.js";
12
+ export {
13
+ configureLspServiceLifecycle,
14
+ getOwnedLspService,
15
+ peekOwnedLspService,
16
+ resetOwnedLspService
17
+ };
@@ -1,74 +1,77 @@
1
1
  import { createRequire as __pilensCreateRequire } from "node:module"; const require = __pilensCreateRequire(import.meta.url);
2
+ import {
3
+ nestedWorktreeOffsets
4
+ } from "./chunk-VCHXCQFG.js";
2
5
  import {
3
6
  formatToolFailure
4
- } from "./chunk-ZMOL6RQC.js";
5
- import "./chunk-I7SPGOWI.js";
7
+ } from "./chunk-2CD5RS6M.js";
8
+ import "./chunk-UZ3TUTRV.js";
6
9
  import {
7
10
  createAvailabilityChecker,
8
11
  findManagedNodeToolBinary,
9
12
  resolveAvailableOrInstall
10
- } from "./chunk-7FBF7NPR.js";
11
- import "./chunk-HHYAELLJ.js";
12
- import {
13
- canonicalDirectory,
14
- listNestedLinkedWorktreeRoots
15
- } from "./chunk-3I5QFT3N.js";
16
- import "./chunk-B3I2UUT4.js";
17
- import "./chunk-DIULIWKU.js";
18
- import "./chunk-VDBPVIKD.js";
19
- import "./chunk-TGPXLY2J.js";
13
+ } from "./chunk-GOYRYZ2R.js";
14
+ import "./chunk-RPLINGVB.js";
15
+ import "./chunk-PNQDPDRC.js";
16
+ import "./chunk-ESBQHFMJ.js";
17
+ import "./chunk-34WSVGEM.js";
18
+ import "./chunk-VWCXW2E7.js";
19
+ import "./chunk-ZXYDQ3TZ.js";
20
+ import "./chunk-724UL2TJ.js";
20
21
  import "./chunk-QOZXJ4NA.js";
21
- import "./chunk-PAK6IDME.js";
22
- import "./chunk-GUOGVTCQ.js";
23
- import "./chunk-AJVLWNFN.js";
24
- import "./chunk-YGVYKNSN.js";
22
+ import "./chunk-P7266HLM.js";
23
+ import "./chunk-52FUZI6K.js";
24
+ import "./chunk-SAEFPSB6.js";
25
25
  import {
26
26
  getJscpdMaxEntriesDerived
27
- } from "./chunk-LNAKEO63.js";
27
+ } from "./chunk-GAEGEPOC.js";
28
28
  import "./chunk-Z3CCVDUB.js";
29
29
  import "./chunk-2BEMIWEW.js";
30
- import "./chunk-OQGFCZJ4.js";
31
- import "./chunk-RUOG5D2C.js";
30
+ import "./chunk-66VMUL7Q.js";
31
+ import "./chunk-Q7DUK4LX.js";
32
32
  import {
33
33
  findNodeToolBinary
34
- } from "./chunk-U3VGR4VU.js";
35
- import "./chunk-NTUJEGDZ.js";
36
- import "./chunk-EOKRQ3SA.js";
37
- import "./chunk-WONERJTP.js";
38
- import "./chunk-22AVIGXS.js";
39
- import "./chunk-GVXA6CCE.js";
40
- import "./chunk-6QIUX4EP.js";
34
+ } from "./chunk-AW7R2GWG.js";
35
+ import {
36
+ getIsolatedNpxSpawnOptions
37
+ } from "./chunk-RWWYJ623.js";
38
+ import "./chunk-VRZP76YM.js";
39
+ import "./chunk-QOBUHWHX.js";
40
+ import "./chunk-QILIYSJF.js";
41
+ import "./chunk-6C7JWPCP.js";
41
42
  import {
42
43
  shouldRecurseIntoDir,
43
44
  walkTreeStackSync
44
- } from "./chunk-VHQLPIRJ.js";
45
+ } from "./chunk-5NGR67U5.js";
45
46
  import {
46
47
  getExcludedDirGlobs,
47
48
  getProjectIgnoreGlobs,
48
49
  getProjectIgnoreMatcher,
49
50
  safeSpawnAsync
50
- } from "./chunk-VN2AXLEX.js";
51
+ } from "./chunk-C34ZXZ7O.js";
51
52
  import "./chunk-BW5KFIQC.js";
52
53
  import "./chunk-QYF5S6P6.js";
53
- import "./chunk-5ZEJHV35.js";
54
- import "./chunk-DQ2NZ7C4.js";
55
- import "./chunk-VNMT7C64.js";
54
+ import "./chunk-PHDMFAKM.js";
55
+ import "./chunk-2BBLFX75.js";
56
+ import "./chunk-XVF2VVXP.js";
57
+ import "./chunk-ZANLILYD.js";
56
58
  import "./chunk-2EECBNC5.js";
57
59
  import {
58
60
  incrementDegradationCount
59
- } from "./chunk-N3YQJI6O.js";
61
+ } from "./chunk-JAU72XNY.js";
60
62
  import {
61
63
  createSubsystemLogger
62
- } from "./chunk-O6TQT6RI.js";
63
- import "./chunk-5THXD6X5.js";
64
- import "./chunk-UK3CMEAL.js";
64
+ } from "./chunk-XTMJ7XDT.js";
65
+ import "./chunk-JMYYOTQG.js";
66
+ import "./chunk-QQNQ7SJW.js";
67
+ import "./chunk-AOHZU2BM.js";
65
68
  import "./chunk-LJDODBBZ.js";
66
69
  import "./chunk-ABBOA7UD.js";
67
70
  import {
68
71
  isAtOrAboveHomeDir,
69
72
  isFullyQualified,
70
73
  toPosix
71
- } from "./chunk-Q5U6FMDI.js";
74
+ } from "./chunk-N2H3ZPZY.js";
72
75
  import "./chunk-NXL4FFQQ.js";
73
76
 
74
77
  // dist/clients/jscpd-client.js
@@ -76,7 +79,6 @@ import * as fs from "node:fs";
76
79
  import { mkdtempSync } from "node:fs";
77
80
  import * as os from "node:os";
78
81
  import * as path from "node:path";
79
- import { relative } from "node:path";
80
82
  var EMPTY_RESULT = {
81
83
  success: false,
82
84
  clones: [],
@@ -113,10 +115,9 @@ function readProjectJscpdConfig(cwd) {
113
115
  return null;
114
116
  }
115
117
  function worktreeIgnoreGlobs(cwd) {
116
- const base = canonicalDirectory(cwd);
117
118
  const globs = [];
118
- for (const worktree of listNestedLinkedWorktreeRoots(cwd)) {
119
- const inside = toPosix(relative(base, worktree));
119
+ for (const offset of nestedWorktreeOffsets(cwd)) {
120
+ const inside = toPosix(offset);
120
121
  const unsafe = inside.includes(",") ? "comma-in-path" : /[*?[\]{}()!\\]/.test(inside) ? "glob-char-in-path" : null;
121
122
  if (unsafe) {
122
123
  incrementDegradationCount({
@@ -322,7 +323,10 @@ var JscpdClient = class {
322
323
  ...patterns === void 0 ? [] : ["--ignore", patterns.join(",")]
323
324
  ], {
324
325
  timeout: SCAN_TIMEOUT_MS,
325
- cwd
326
+ // A cache-only npx fallback must not read the project's `.npmrc`
327
+ // (#4268 acceptance 3); local/managed jscpd keeps the project cwd.
328
+ cwd,
329
+ ...cmd === "npx" ? getIsolatedNpxSpawnOptions() : {}
326
330
  });
327
331
  if (result.error) {
328
332
  this.log(`Scan error: ${result.error.message}`);
@@ -1,29 +1,29 @@
1
1
  import { createRequire as __pilensCreateRequire } from "node:module"; const require = __pilensCreateRequire(import.meta.url);
2
2
  import {
3
3
  getStartupScanMaxSourceFilesDerived
4
- } from "./chunk-LNAKEO63.js";
4
+ } from "./chunk-GAEGEPOC.js";
5
5
  import {
6
6
  shouldRecurseIntoDir,
7
7
  walkTreeStackAsync,
8
8
  walkTreeStackSync
9
- } from "./chunk-VHQLPIRJ.js";
9
+ } from "./chunk-5NGR67U5.js";
10
10
  import {
11
11
  getProjectIgnoreMatcher
12
- } from "./chunk-VN2AXLEX.js";
12
+ } from "./chunk-C34ZXZ7O.js";
13
13
  import {
14
14
  getDirectoryMarkers,
15
15
  registerWorkspaceTopologyReset
16
- } from "./chunk-VNMT7C64.js";
16
+ } from "./chunk-XVF2VVXP.js";
17
17
  import {
18
18
  lazyEnvNumber
19
- } from "./chunk-UK3CMEAL.js";
19
+ } from "./chunk-AOHZU2BM.js";
20
20
  import {
21
21
  BoundedLruCache
22
22
  } from "./chunk-ABBOA7UD.js";
23
23
  import {
24
24
  isAtOrAboveHomeDir,
25
25
  normalizeMapKey
26
- } from "./chunk-Q5U6FMDI.js";
26
+ } from "./chunk-N2H3ZPZY.js";
27
27
 
28
28
  // dist/clients/startup-scan.js
29
29
  import * as os from "node:os";
@@ -50,6 +50,10 @@ function isStartupScanVerdictFresh(verdict, now = Date.now()) {
50
50
  return true;
51
51
  if (typeof verdict.computedAt !== "number")
52
52
  return false;
53
+ if (verdict.maxProjectFiles !== getStartupScanMaxSourceFilesDerived(verdict.cwd))
54
+ return false;
55
+ if (verdict.maxScanEntries !== getStartupScanMaxEntries())
56
+ return false;
53
57
  return now - verdict.computedAt < getStartupScanVerdictTtlMs();
54
58
  }
55
59
  function findNearestProjectRoot(startDir) {
@@ -160,7 +164,9 @@ function computeStartupScanContext(cwd, options = {}) {
160
164
  projectRoot,
161
165
  canWarmCaches: false,
162
166
  reason: entryBudgetExceeded ? "too-many-entries" : "too-many-source-files",
163
- sourceFileCount
167
+ sourceFileCount,
168
+ maxProjectFiles: maxSourceFiles,
169
+ maxScanEntries
164
170
  };
165
171
  }
166
172
  return {
@@ -233,7 +239,9 @@ async function resolveStartupScanContextAsync(cwd, options = {}) {
233
239
  projectRoot,
234
240
  canWarmCaches: false,
235
241
  reason: entryBudgetExceeded ? "too-many-entries" : "too-many-source-files",
236
- sourceFileCount
242
+ sourceFileCount,
243
+ maxProjectFiles: maxSourceFiles,
244
+ maxScanEntries
237
245
  };
238
246
  } else {
239
247
  result = {
@@ -0,0 +1,55 @@
1
+ import { createRequire as __pilensCreateRequire } from "node:module"; const require = __pilensCreateRequire(import.meta.url);
2
+ import {
3
+ DependencyChecker,
4
+ buildMadgeArgs,
5
+ resetMadgeManagedPathMemo
6
+ } from "./chunk-EETY4LF7.js";
7
+ import "./chunk-GOYRYZ2R.js";
8
+ import "./chunk-RPLINGVB.js";
9
+ import {
10
+ mapWithConcurrency
11
+ } from "./chunk-XIMYZ3JA.js";
12
+ import "./chunk-ESBQHFMJ.js";
13
+ import "./chunk-34WSVGEM.js";
14
+ import "./chunk-VWCXW2E7.js";
15
+ import "./chunk-ZXYDQ3TZ.js";
16
+ import "./chunk-724UL2TJ.js";
17
+ import "./chunk-QOZXJ4NA.js";
18
+ import "./chunk-P7266HLM.js";
19
+ import "./chunk-52FUZI6K.js";
20
+ import "./chunk-SAEFPSB6.js";
21
+ import "./chunk-GAEGEPOC.js";
22
+ import "./chunk-Z3CCVDUB.js";
23
+ import "./chunk-2BEMIWEW.js";
24
+ import "./chunk-66VMUL7Q.js";
25
+ import "./chunk-Q7DUK4LX.js";
26
+ import "./chunk-AW7R2GWG.js";
27
+ import "./chunk-RWWYJ623.js";
28
+ import "./chunk-VRZP76YM.js";
29
+ import "./chunk-QOBUHWHX.js";
30
+ import "./chunk-QILIYSJF.js";
31
+ import "./chunk-6C7JWPCP.js";
32
+ import "./chunk-5NGR67U5.js";
33
+ import "./chunk-C34ZXZ7O.js";
34
+ import "./chunk-BW5KFIQC.js";
35
+ import "./chunk-QYF5S6P6.js";
36
+ import "./chunk-PHDMFAKM.js";
37
+ import "./chunk-2BBLFX75.js";
38
+ import "./chunk-XVF2VVXP.js";
39
+ import "./chunk-ZANLILYD.js";
40
+ import "./chunk-2EECBNC5.js";
41
+ import "./chunk-JAU72XNY.js";
42
+ import "./chunk-XTMJ7XDT.js";
43
+ import "./chunk-JMYYOTQG.js";
44
+ import "./chunk-QQNQ7SJW.js";
45
+ import "./chunk-AOHZU2BM.js";
46
+ import "./chunk-LJDODBBZ.js";
47
+ import "./chunk-ABBOA7UD.js";
48
+ import "./chunk-N2H3ZPZY.js";
49
+ import "./chunk-NXL4FFQQ.js";
50
+ export {
51
+ DependencyChecker,
52
+ buildMadgeArgs,
53
+ mapWithConcurrency,
54
+ resetMadgeManagedPathMemo
55
+ };
@@ -0,0 +1,30 @@
1
+ import { createRequire as __pilensCreateRequire } from "node:module"; const require = __pilensCreateRequire(import.meta.url);
2
+ import {
3
+ importFactProvider,
4
+ importFactsApplyTo
5
+ } from "./chunk-XCJN5IJU.js";
6
+ import "./chunk-GXW6K4YJ.js";
7
+ import "./chunk-QHJ6DQ2R.js";
8
+ import "./chunk-Z54ZSOBZ.js";
9
+ import "./chunk-724UL2TJ.js";
10
+ import "./chunk-QOZXJ4NA.js";
11
+ import "./chunk-VRZP76YM.js";
12
+ import "./chunk-C34ZXZ7O.js";
13
+ import "./chunk-PHDMFAKM.js";
14
+ import "./chunk-2BBLFX75.js";
15
+ import "./chunk-XVF2VVXP.js";
16
+ import "./chunk-ZANLILYD.js";
17
+ import "./chunk-2EECBNC5.js";
18
+ import "./chunk-JAU72XNY.js";
19
+ import "./chunk-XTMJ7XDT.js";
20
+ import "./chunk-JMYYOTQG.js";
21
+ import "./chunk-QQNQ7SJW.js";
22
+ import "./chunk-AOHZU2BM.js";
23
+ import "./chunk-LJDODBBZ.js";
24
+ import "./chunk-ABBOA7UD.js";
25
+ import "./chunk-N2H3ZPZY.js";
26
+ import "./chunk-NXL4FFQQ.js";
27
+ export {
28
+ importFactProvider,
29
+ importFactsApplyTo
30
+ };
@@ -2,20 +2,21 @@ import { createRequire as __pilensCreateRequire } from "node:module"; const requ
2
2
  import {
3
3
  computeImpactCascade,
4
4
  computeTransitiveImpact
5
- } from "./chunk-E2WFBRHM.js";
6
- import "./chunk-V7R425XG.js";
7
- import "./chunk-PAK6IDME.js";
8
- import "./chunk-VN2AXLEX.js";
9
- import "./chunk-DQ2NZ7C4.js";
10
- import "./chunk-VNMT7C64.js";
5
+ } from "./chunk-2B73ZPOK.js";
6
+ import "./chunk-GBPP5P7X.js";
7
+ import "./chunk-P7266HLM.js";
8
+ import "./chunk-C34ZXZ7O.js";
9
+ import "./chunk-2BBLFX75.js";
10
+ import "./chunk-XVF2VVXP.js";
11
11
  import "./chunk-2EECBNC5.js";
12
- import "./chunk-N3YQJI6O.js";
13
- import "./chunk-O6TQT6RI.js";
14
- import "./chunk-5THXD6X5.js";
15
- import "./chunk-UK3CMEAL.js";
12
+ import "./chunk-JAU72XNY.js";
13
+ import "./chunk-XTMJ7XDT.js";
14
+ import "./chunk-JMYYOTQG.js";
15
+ import "./chunk-QQNQ7SJW.js";
16
+ import "./chunk-AOHZU2BM.js";
16
17
  import "./chunk-LJDODBBZ.js";
17
18
  import "./chunk-ABBOA7UD.js";
18
- import "./chunk-Q5U6FMDI.js";
19
+ import "./chunk-N2H3ZPZY.js";
19
20
  import "./chunk-NXL4FFQQ.js";
20
21
  export {
21
22
  computeImpactCascade,
@@ -15,21 +15,22 @@ import {
15
15
  getFilterStats,
16
16
  isBuildArtifact,
17
17
  sourceTwinCandidates
18
- } from "./chunk-6QIUX4EP.js";
19
- import "./chunk-VHQLPIRJ.js";
20
- import "./chunk-VN2AXLEX.js";
18
+ } from "./chunk-6C7JWPCP.js";
19
+ import "./chunk-5NGR67U5.js";
20
+ import "./chunk-C34ZXZ7O.js";
21
21
  import "./chunk-QYF5S6P6.js";
22
- import "./chunk-5ZEJHV35.js";
23
- import "./chunk-DQ2NZ7C4.js";
24
- import "./chunk-VNMT7C64.js";
22
+ import "./chunk-PHDMFAKM.js";
23
+ import "./chunk-2BBLFX75.js";
24
+ import "./chunk-XVF2VVXP.js";
25
25
  import "./chunk-2EECBNC5.js";
26
- import "./chunk-N3YQJI6O.js";
27
- import "./chunk-O6TQT6RI.js";
28
- import "./chunk-5THXD6X5.js";
29
- import "./chunk-UK3CMEAL.js";
26
+ import "./chunk-JAU72XNY.js";
27
+ import "./chunk-XTMJ7XDT.js";
28
+ import "./chunk-JMYYOTQG.js";
29
+ import "./chunk-QQNQ7SJW.js";
30
+ import "./chunk-AOHZU2BM.js";
30
31
  import "./chunk-LJDODBBZ.js";
31
32
  import "./chunk-ABBOA7UD.js";
32
- import "./chunk-Q5U6FMDI.js";
33
+ import "./chunk-N2H3ZPZY.js";
33
34
  import "./chunk-NXL4FFQQ.js";
34
35
  export {
35
36
  ALL_SCANNABLE_EXTENSIONS,
@@ -1,7 +1,7 @@
1
1
  import { createRequire as __pilensCreateRequire } from "node:module"; const require = __pilensCreateRequire(import.meta.url);
2
2
  import {
3
3
  recordDegradationOnce
4
- } from "./chunk-N3YQJI6O.js";
4
+ } from "./chunk-JAU72XNY.js";
5
5
 
6
6
  // dist/clients/deadline-utils.js
7
7
  function combineAbortSignals(...signals) {
@@ -128,8 +128,10 @@ var HOOK_WALL_BUDGET_MS = Object.freeze({
128
128
  tool_result_read_only: 500,
129
129
  /** The ONLY path the contract lets block the host, and only this long. */
130
130
  tool_result_edit: 1e4,
131
- /** Teardown: spawning or awaiting here aborts libuv (#234). */
131
+ /** Replacement teardown is synchronous so its successor ordering is preserved (#3881). */
132
132
  session_shutdown: 0,
133
+ /** The maintainer amendment permits quit-only sink draining before process exit (#2523). */
134
+ session_shutdown_quit: 500,
133
135
  /** Synchronous message contribution; the host is blocked on the answer. */
134
136
  context: 0,
135
137
  /** Fork bookkeeping; the session is being replaced under it. */
@@ -0,0 +1,84 @@
1
+ import { createRequire as __pilensCreateRequire } from "node:module"; const require = __pilensCreateRequire(import.meta.url);
2
+ import {
3
+ _getWarmWordIndexCacheStateForTests,
4
+ _resetWarmWordIndexCacheForTests,
5
+ acquireWarmWordIndex,
6
+ analyzeFile,
7
+ summarizeWarningTiers
8
+ } from "./chunk-ODBNXWT4.js";
9
+ import "./chunk-OXXKQCSV.js";
10
+ import "./chunk-EJIUXPBX.js";
11
+ import "./chunk-FC4RP4I2.js";
12
+ import "./chunk-66SXUJCA.js";
13
+ import "./chunk-VCHXCQFG.js";
14
+ import "./chunk-IXXDFY73.js";
15
+ import "./chunk-MRXKYPCS.js";
16
+ import "./chunk-2CD5RS6M.js";
17
+ import "./chunk-UZ3TUTRV.js";
18
+ import "./chunk-EETY4LF7.js";
19
+ import "./chunk-GOYRYZ2R.js";
20
+ import "./chunk-RPLINGVB.js";
21
+ import "./chunk-XCJN5IJU.js";
22
+ import "./chunk-76MWC2K6.js";
23
+ import "./chunk-GXW6K4YJ.js";
24
+ import "./chunk-2B73ZPOK.js";
25
+ import "./chunk-XMSXXAHW.js";
26
+ import "./chunk-7DYBLXYA.js";
27
+ import "./chunk-PV6LR5P5.js";
28
+ import "./chunk-3MED75HT.js";
29
+ import "./chunk-CO2G5PHH.js";
30
+ import "./chunk-IBGIOBEE.js";
31
+ import "./chunk-PNQDPDRC.js";
32
+ import "./chunk-XIMYZ3JA.js";
33
+ import "./chunk-ESBQHFMJ.js";
34
+ import "./chunk-34WSVGEM.js";
35
+ import "./chunk-VWCXW2E7.js";
36
+ import "./chunk-ZXYDQ3TZ.js";
37
+ import "./chunk-5W3R6LFT.js";
38
+ import "./chunk-QHJ6DQ2R.js";
39
+ import "./chunk-Z54ZSOBZ.js";
40
+ import "./chunk-724UL2TJ.js";
41
+ import "./chunk-QOZXJ4NA.js";
42
+ import "./chunk-GBPP5P7X.js";
43
+ import "./chunk-P7266HLM.js";
44
+ import "./chunk-MQLUAEOC.js";
45
+ import "./chunk-52FUZI6K.js";
46
+ import "./chunk-SAEFPSB6.js";
47
+ import "./chunk-GAEGEPOC.js";
48
+ import "./chunk-Z3CCVDUB.js";
49
+ import "./chunk-L3BLXZG7.js";
50
+ import "./chunk-2BEMIWEW.js";
51
+ import "./chunk-66VMUL7Q.js";
52
+ import "./chunk-Q7DUK4LX.js";
53
+ import "./chunk-AW7R2GWG.js";
54
+ import "./chunk-RWWYJ623.js";
55
+ import "./chunk-VRZP76YM.js";
56
+ import "./chunk-QOBUHWHX.js";
57
+ import "./chunk-QILIYSJF.js";
58
+ import "./chunk-6C7JWPCP.js";
59
+ import "./chunk-5NGR67U5.js";
60
+ import "./chunk-C34ZXZ7O.js";
61
+ import "./chunk-BW5KFIQC.js";
62
+ import "./chunk-QYF5S6P6.js";
63
+ import "./chunk-PHDMFAKM.js";
64
+ import "./chunk-2BBLFX75.js";
65
+ import "./chunk-XVF2VVXP.js";
66
+ import "./chunk-ZANLILYD.js";
67
+ import "./chunk-2EECBNC5.js";
68
+ import "./chunk-JAU72XNY.js";
69
+ import "./chunk-XTMJ7XDT.js";
70
+ import "./chunk-JMYYOTQG.js";
71
+ import "./chunk-QQNQ7SJW.js";
72
+ import "./chunk-AOHZU2BM.js";
73
+ import "./chunk-LJDODBBZ.js";
74
+ import "./chunk-CHOW74WE.js";
75
+ import "./chunk-ABBOA7UD.js";
76
+ import "./chunk-N2H3ZPZY.js";
77
+ import "./chunk-NXL4FFQQ.js";
78
+ export {
79
+ _getWarmWordIndexCacheStateForTests,
80
+ _resetWarmWordIndexCacheForTests,
81
+ acquireWarmWordIndex,
82
+ analyzeFile,
83
+ summarizeWarningTiers
84
+ };
@@ -1,14 +1,14 @@
1
1
  import { createRequire as __pilensCreateRequire } from "node:module"; const require = __pilensCreateRequire(import.meta.url);
2
2
  import {
3
3
  isExcludedDirName
4
- } from "./chunk-VN2AXLEX.js";
4
+ } from "./chunk-C34ZXZ7O.js";
5
5
  import {
6
6
  createDeadline,
7
7
  yieldIfOverBudget
8
8
  } from "./chunk-QYF5S6P6.js";
9
9
  import {
10
10
  isGeneratedArtifactDirectoryName
11
- } from "./chunk-DQ2NZ7C4.js";
11
+ } from "./chunk-2BBLFX75.js";
12
12
 
13
13
  // dist/clients/source-walker.js
14
14
  import * as fs from "node:fs";
@@ -1,16 +1,23 @@
1
1
  import { createRequire as __pilensCreateRequire } from "node:module"; const require = __pilensCreateRequire(import.meta.url);
2
2
  import {
3
- getScratchTreeGlobPatterns
4
- } from "./chunk-TO6WL3GM.js";
3
+ getScratchTreeGlobPatterns,
4
+ nestedWorktreeOffsets
5
+ } from "./chunk-VCHXCQFG.js";
5
6
  import {
6
7
  SecurityScanClient
7
- } from "./chunk-7F72PXY2.js";
8
+ } from "./chunk-IXXDFY73.js";
8
9
  import {
9
10
  safeSpawnAsync
10
- } from "./chunk-VN2AXLEX.js";
11
+ } from "./chunk-C34ZXZ7O.js";
11
12
  import {
12
13
  loadPiLensProjectConfig
13
- } from "./chunk-DQ2NZ7C4.js";
14
+ } from "./chunk-2BBLFX75.js";
15
+ import {
16
+ incrementDegradationCount
17
+ } from "./chunk-JAU72XNY.js";
18
+ import {
19
+ toPosix
20
+ } from "./chunk-N2H3ZPZY.js";
14
21
 
15
22
  // dist/clients/trivy-client.js
16
23
  import * as fs from "node:fs";
@@ -96,6 +103,34 @@ function resolveSeverityFloor(cwd) {
96
103
  const floor = Math.min(requested ?? SEVERITY_RANK.HIGH, SEVERITY_RANK.HIGH);
97
104
  return ["LOW", "MEDIUM", "HIGH", "CRITICAL"].filter((s) => SEVERITY_RANK[s] >= floor);
98
105
  }
106
+ function worktreeSkipDirs(cwd, separator = path.sep, maxArgumentChars = separator === "\\" ? 3e4 : Number.POSITIVE_INFINITY) {
107
+ const unsafe = separator === "\\" ? /[,"*?[\]{}]/ : /[,"*?[\]{}\\]/;
108
+ const skips = [];
109
+ let argumentChars = 0;
110
+ for (const offset of nestedWorktreeOffsets(cwd)) {
111
+ if (unsafe.test(offset)) {
112
+ incrementDegradationCount({
113
+ kind: "scan-worktree-exclusion-skipped",
114
+ subject: "trivy",
115
+ reason: `csv-or-glob-char-in-path: ${offset} not skipped under ${cwd}`
116
+ });
117
+ continue;
118
+ }
119
+ const value = toPosix(offset);
120
+ const addedChars = "--skip-dirs".length + value.length + 2;
121
+ if (argumentChars + addedChars > maxArgumentChars) {
122
+ incrementDegradationCount({
123
+ kind: "scan-worktree-exclusion-skipped",
124
+ subject: "trivy",
125
+ reason: `windows-command-line-cap: ${offset} not skipped under ${cwd}`
126
+ });
127
+ continue;
128
+ }
129
+ skips.push(value);
130
+ argumentChars += addedChars;
131
+ }
132
+ return skips;
133
+ }
99
134
  var TrivyClient = class extends SecurityScanClient {
100
135
  constructor(verbose = false) {
101
136
  super("trivy", verbose);
@@ -158,10 +193,10 @@ var TrivyClient = class extends SecurityScanClient {
158
193
  reportPath,
159
194
  "--quiet",
160
195
  "--no-progress",
161
- ...getScratchTreeGlobPatterns().flatMap((glob) => [
162
- "--skip-dirs",
163
- glob
164
- ]),
196
+ ...[
197
+ ...getScratchTreeGlobPatterns(),
198
+ ...worktreeSkipDirs(cwd)
199
+ ].flatMap((glob) => ["--skip-dirs", glob]),
165
200
  cwd
166
201
  ], { cwd, timeout: SCAN_TIMEOUT_MS });
167
202
  if (result.error) {
@@ -342,6 +377,7 @@ export {
342
377
  isTrivyEnabled,
343
378
  shouldScanTrivy,
344
379
  resolveSeverityFloor,
380
+ worktreeSkipDirs,
345
381
  TrivyClient,
346
382
  parseTrivyReport,
347
383
  parseTrivySecrets,