@duckmind/dm-linux-x64 0.63.9 → 0.64.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 (1467) hide show
  1. package/dm +0 -0
  2. package/extensions/.dm-extensions.json +539 -4
  3. package/extensions/dm-lens/clients/actionable-warnings-logger.js +30 -0
  4. package/extensions/dm-lens/clients/actionable-warnings.js +1002 -0
  5. package/extensions/dm-lens/clients/advisory-provenance.js +297 -0
  6. package/extensions/dm-lens/clients/agent-behavior-client.js +93 -0
  7. package/extensions/dm-lens/clients/agent-nudge.js +151 -0
  8. package/extensions/dm-lens/clients/ast-grep-client.js +546 -0
  9. package/extensions/dm-lens/clients/ast-grep-rule-manager.js +82 -0
  10. package/extensions/dm-lens/clients/ast-grep-tool-logger.js +91 -0
  11. package/extensions/dm-lens/clients/ast-grep-types.js +0 -0
  12. package/extensions/dm-lens/clients/ast-grep-yaml-synth.js +109 -0
  13. package/extensions/dm-lens/clients/atomic-write-staging.js +66 -0
  14. package/extensions/dm-lens/clients/atomic-write.js +41 -0
  15. package/extensions/dm-lens/clients/availability-probe-flight.js +11 -0
  16. package/extensions/dm-lens/clients/bash-file-access.js +693 -0
  17. package/extensions/dm-lens/clients/biome-client.js +222 -0
  18. package/extensions/dm-lens/clients/blocker-freshness.js +238 -0
  19. package/extensions/dm-lens/clients/blocker-past-eof.js +52 -0
  20. package/extensions/dm-lens/clients/bootstrap.js +260 -0
  21. package/extensions/dm-lens/clients/bounded-cache.js +105 -0
  22. package/extensions/dm-lens/clients/bounded-pid-file-lock.js +173 -0
  23. package/extensions/dm-lens/clients/bounded-telemetry.js +107 -0
  24. package/extensions/dm-lens/clients/build-identity.js +45 -0
  25. package/extensions/dm-lens/clients/bus-events-logger.js +54 -0
  26. package/extensions/dm-lens/clients/bus-publish.js +121 -0
  27. package/extensions/dm-lens/clients/cache/rule-cache.js +98 -0
  28. package/extensions/dm-lens/clients/cache-manager.js +316 -0
  29. package/extensions/dm-lens/clients/cache-observability.js +747 -0
  30. package/extensions/dm-lens/clients/call-graph.js +628 -0
  31. package/extensions/dm-lens/clients/cargo-manifest.js +148 -0
  32. package/extensions/dm-lens/clients/cascade-budget.js +55 -0
  33. package/extensions/dm-lens/clients/cascade-format.js +82 -0
  34. package/extensions/dm-lens/clients/cascade-logger.js +28 -0
  35. package/extensions/dm-lens/clients/cascade-types.js +1 -0
  36. package/extensions/dm-lens/clients/child-unref.js +63 -0
  37. package/extensions/dm-lens/clients/code-quality-warnings.js +190 -0
  38. package/extensions/dm-lens/clients/codebase-model.js +110 -0
  39. package/extensions/dm-lens/clients/collateral-test-role.js +8 -0
  40. package/extensions/dm-lens/clients/complexity-client.js +401 -0
  41. package/extensions/dm-lens/clients/config-core/deny.js +120 -0
  42. package/extensions/dm-lens/clients/config-core/index.js +68 -0
  43. package/extensions/dm-lens/clients/config-core/merge.js +255 -0
  44. package/extensions/dm-lens/clients/config-core/normalize.js +235 -0
  45. package/extensions/dm-lens/clients/config-core/process-spec.js +153 -0
  46. package/extensions/dm-lens/clients/config-core/provenance.js +55 -0
  47. package/extensions/dm-lens/clients/config-core/records.js +79 -0
  48. package/extensions/dm-lens/clients/config-core/resolve.js +51 -0
  49. package/extensions/dm-lens/clients/config-core/safe-object.js +22 -0
  50. package/extensions/dm-lens/clients/config-core/schema.js +93 -0
  51. package/extensions/dm-lens/clients/config-diagnostic-codes.js +88 -0
  52. package/extensions/dm-lens/clients/config-locations.js +61 -0
  53. package/extensions/dm-lens/clients/config-resolve.js +372 -0
  54. package/extensions/dm-lens/clients/config-schema.js +87 -0
  55. package/extensions/dm-lens/clients/config-warn.js +148 -0
  56. package/extensions/dm-lens/clients/console-guard-install.js +7 -0
  57. package/extensions/dm-lens/clients/cooperative-budget.js +36 -0
  58. package/extensions/dm-lens/clients/dead-code-client.js +347 -0
  59. package/extensions/dm-lens/clients/dead-code-logger.js +21 -0
  60. package/extensions/dm-lens/clients/deadline-utils.js +117 -0
  61. package/extensions/dm-lens/clients/debug-handles.js +121 -0
  62. package/extensions/dm-lens/clients/debug-heap.js +80 -0
  63. package/extensions/dm-lens/clients/deferred-lsp-work.js +33 -0
  64. package/extensions/dm-lens/clients/degradation-ledger.js +260 -0
  65. package/extensions/dm-lens/clients/demoted-finding-render.js +61 -0
  66. package/extensions/dm-lens/clients/dependency-checker.js +553 -0
  67. package/extensions/dm-lens/clients/deps/ast-grep-napi.js +17 -0
  68. package/extensions/dm-lens/clients/deps/dm-host-deps.js +10 -0
  69. package/extensions/dm-lens/clients/deps/dm-tui-compat.js +58 -0
  70. package/extensions/dm-lens/clients/deps/js-yaml.js +7 -0
  71. package/extensions/dm-lens/clients/deps/minimatch.js +6 -0
  72. package/extensions/dm-lens/clients/deps/pidusage.js +5 -0
  73. package/extensions/dm-lens/clients/deps/typebox.js +5 -0
  74. package/extensions/dm-lens/clients/deps/vscode-jsonrpc.js +8 -0
  75. package/extensions/dm-lens/clients/deps/web-tree-sitter.js +11 -0
  76. package/extensions/dm-lens/clients/diagnostic-dispositions.js +303 -0
  77. package/extensions/dm-lens/clients/diagnostic-line-freshness.js +144 -0
  78. package/extensions/dm-lens/clients/diagnostic-logger.js +60 -0
  79. package/extensions/dm-lens/clients/diagnostic-tracker.js +89 -0
  80. package/extensions/dm-lens/clients/diagnostics-publish.js +138 -0
  81. package/extensions/dm-lens/clients/dispatch/auxiliary-lsp.js +152 -0
  82. package/extensions/dm-lens/clients/dispatch/collect-later-tier.js +28 -0
  83. package/extensions/dm-lens/clients/dispatch/diagnostic-taxonomy.js +58 -0
  84. package/extensions/dm-lens/clients/dispatch/dispatcher.js +976 -0
  85. package/extensions/dm-lens/clients/dispatch/fact-provider-types.js +0 -0
  86. package/extensions/dm-lens/clients/dispatch/fact-rule-runner.js +17 -0
  87. package/extensions/dm-lens/clients/dispatch/fact-runner.js +18 -0
  88. package/extensions/dm-lens/clients/dispatch/fact-scheduler.js +52 -0
  89. package/extensions/dm-lens/clients/dispatch/fact-store.js +199 -0
  90. package/extensions/dm-lens/clients/dispatch/facts/comment-facts.js +20 -0
  91. package/extensions/dm-lens/clients/dispatch/facts/file-content.js +18 -0
  92. package/extensions/dm-lens/clients/dispatch/facts/function-facts.js +285 -0
  93. package/extensions/dm-lens/clients/dispatch/facts/import-facts.js +171 -0
  94. package/extensions/dm-lens/clients/dispatch/facts/tree-sitter-facts.js +24 -0
  95. package/extensions/dm-lens/clients/dispatch/facts/try-catch-facts.js +99 -0
  96. package/extensions/dm-lens/clients/dispatch/indent-detect.js +27 -0
  97. package/extensions/dm-lens/clients/dispatch/inline-suppressions.js +33 -0
  98. package/extensions/dm-lens/clients/dispatch/integration.js +1464 -0
  99. package/extensions/dm-lens/clients/dispatch/lazy.js +11 -0
  100. package/extensions/dm-lens/clients/dispatch/pending-runner-findings.js +75 -0
  101. package/extensions/dm-lens/clients/dispatch/plan.js +281 -0
  102. package/extensions/dm-lens/clients/dispatch/priorities.js +14 -0
  103. package/extensions/dm-lens/clients/dispatch/rule-id-normalize.js +42 -0
  104. package/extensions/dm-lens/clients/dispatch/rule-policy.js +73 -0
  105. package/extensions/dm-lens/clients/dispatch/rules/async-noise.js +31 -0
  106. package/extensions/dm-lens/clients/dispatch/rules/async-unnecessary-wrapper.js +27 -0
  107. package/extensions/dm-lens/clients/dispatch/rules/cors-wildcard.js +35 -0
  108. package/extensions/dm-lens/clients/dispatch/rules/error-obscuring.js +29 -0
  109. package/extensions/dm-lens/clients/dispatch/rules/error-swallowing.js +29 -0
  110. package/extensions/dm-lens/clients/dispatch/rules/framework-call-noise.js +31 -0
  111. package/extensions/dm-lens/clients/dispatch/rules/high-complexity.js +56 -0
  112. package/extensions/dm-lens/clients/dispatch/rules/high-fan-out.js +48 -0
  113. package/extensions/dm-lens/clients/dispatch/rules/high-import-coupling.js +31 -0
  114. package/extensions/dm-lens/clients/dispatch/rules/missing-error-propagation.js +45 -0
  115. package/extensions/dm-lens/clients/dispatch/rules/no-commented-credentials.js +46 -0
  116. package/extensions/dm-lens/clients/dispatch/rules/pass-through-wrappers.js +38 -0
  117. package/extensions/dm-lens/clients/dispatch/rules/placeholder-comments.js +40 -0
  118. package/extensions/dm-lens/clients/dispatch/rules/unsafe-boundary.js +101 -0
  119. package/extensions/dm-lens/clients/dispatch/runner-context.js +46 -0
  120. package/extensions/dm-lens/clients/dispatch/runners/actionlint.js +105 -0
  121. package/extensions/dm-lens/clients/dispatch/runners/ast-grep-napi.js +728 -0
  122. package/extensions/dm-lens/clients/dispatch/runners/biome-check.js +193 -0
  123. package/extensions/dm-lens/clients/dispatch/runners/cpp-check.js +209 -0
  124. package/extensions/dm-lens/clients/dispatch/runners/credo.js +63 -0
  125. package/extensions/dm-lens/clients/dispatch/runners/cue-vet.js +168 -0
  126. package/extensions/dm-lens/clients/dispatch/runners/dart-analyze.js +173 -0
  127. package/extensions/dm-lens/clients/dispatch/runners/detekt.js +151 -0
  128. package/extensions/dm-lens/clients/dispatch/runners/dotnet-build.js +153 -0
  129. package/extensions/dm-lens/clients/dispatch/runners/elixir-check.js +168 -0
  130. package/extensions/dm-lens/clients/dispatch/runners/eslint.js +115 -0
  131. package/extensions/dm-lens/clients/dispatch/runners/fact-rules.js +20 -0
  132. package/extensions/dm-lens/clients/dispatch/runners/fish-indent.js +64 -0
  133. package/extensions/dm-lens/clients/dispatch/runners/gleam-check.js +84 -0
  134. package/extensions/dm-lens/clients/dispatch/runners/go-vet.js +49 -0
  135. package/extensions/dm-lens/clients/dispatch/runners/golangci-lint.js +93 -0
  136. package/extensions/dm-lens/clients/dispatch/runners/hadolint.js +76 -0
  137. package/extensions/dm-lens/clients/dispatch/runners/helm-lint.js +145 -0
  138. package/extensions/dm-lens/clients/dispatch/runners/helm-render.js +601 -0
  139. package/extensions/dm-lens/clients/dispatch/runners/htmlhint.js +97 -0
  140. package/extensions/dm-lens/clients/dispatch/runners/index.js +100 -0
  141. package/extensions/dm-lens/clients/dispatch/runners/javac.js +81 -0
  142. package/extensions/dm-lens/clients/dispatch/runners/ktlint.js +130 -0
  143. package/extensions/dm-lens/clients/dispatch/runners/lsp.js +202 -0
  144. package/extensions/dm-lens/clients/dispatch/runners/markdownlint.js +132 -0
  145. package/extensions/dm-lens/clients/dispatch/runners/mypy.js +72 -0
  146. package/extensions/dm-lens/clients/dispatch/runners/oxlint.js +294 -0
  147. package/extensions/dm-lens/clients/dispatch/runners/php-lint.js +61 -0
  148. package/extensions/dm-lens/clients/dispatch/runners/phpstan.js +92 -0
  149. package/extensions/dm-lens/clients/dispatch/runners/prisma-validate.js +55 -0
  150. package/extensions/dm-lens/clients/dispatch/runners/psscriptanalyzer.js +314 -0
  151. package/extensions/dm-lens/clients/dispatch/runners/pyright.js +123 -0
  152. package/extensions/dm-lens/clients/dispatch/runners/rubocop.js +79 -0
  153. package/extensions/dm-lens/clients/dispatch/runners/ruff.js +82 -0
  154. package/extensions/dm-lens/clients/dispatch/runners/rust-clippy.js +156 -0
  155. package/extensions/dm-lens/clients/dispatch/runners/shellcheck.js +110 -0
  156. package/extensions/dm-lens/clients/dispatch/runners/shfmt.js +93 -0
  157. package/extensions/dm-lens/clients/dispatch/runners/spellcheck.js +67 -0
  158. package/extensions/dm-lens/clients/dispatch/runners/spotbugs.js +210 -0
  159. package/extensions/dm-lens/clients/dispatch/runners/sqlfluff.js +133 -0
  160. package/extensions/dm-lens/clients/dispatch/runners/stylelint.js +119 -0
  161. package/extensions/dm-lens/clients/dispatch/runners/swiftlint.js +138 -0
  162. package/extensions/dm-lens/clients/dispatch/runners/taplo.js +95 -0
  163. package/extensions/dm-lens/clients/dispatch/runners/terragrunt.js +112 -0
  164. package/extensions/dm-lens/clients/dispatch/runners/tflint.js +97 -0
  165. package/extensions/dm-lens/clients/dispatch/runners/tree-sitter.js +532 -0
  166. package/extensions/dm-lens/clients/dispatch/runners/trivy-config.js +155 -0
  167. package/extensions/dm-lens/clients/dispatch/runners/utils/availability-policy.js +280 -0
  168. package/extensions/dm-lens/clients/dispatch/runners/utils/candidate-probe.js +64 -0
  169. package/extensions/dm-lens/clients/dispatch/runners/utils/diagnostic-parsers.js +105 -0
  170. package/extensions/dm-lens/clients/dispatch/runners/utils/lazy-installer.js +133 -0
  171. package/extensions/dm-lens/clients/dispatch/runners/utils/runner-helpers.js +1078 -0
  172. package/extensions/dm-lens/clients/dispatch/runners/utils/spawn-outcome.js +40 -0
  173. package/extensions/dm-lens/clients/dispatch/runners/utils/tool-failure.js +120 -0
  174. package/extensions/dm-lens/clients/dispatch/runners/utils/toolchain-availability.js +91 -0
  175. package/extensions/dm-lens/clients/dispatch/runners/utils.js +25 -0
  176. package/extensions/dm-lens/clients/dispatch/runners/vale.js +101 -0
  177. package/extensions/dm-lens/clients/dispatch/runners/yaml-rule-parser.js +181 -0
  178. package/extensions/dm-lens/clients/dispatch/runners/yamllint.js +75 -0
  179. package/extensions/dm-lens/clients/dispatch/runners/zig-check.js +84 -0
  180. package/extensions/dm-lens/clients/dispatch/suppress-writer.js +50 -0
  181. package/extensions/dm-lens/clients/dispatch/tool-profile.js +30 -0
  182. package/extensions/dm-lens/clients/dispatch/types.js +4 -0
  183. package/extensions/dm-lens/clients/dispatch/utils/format-utils.js +45 -0
  184. package/extensions/dm-lens/clients/dispatch/utils/lsp-diagnostics.js +31 -0
  185. package/extensions/dm-lens/clients/disposition-logger.js +25 -0
  186. package/extensions/dm-lens/clients/disposition-publish.js +91 -0
  187. package/extensions/dm-lens/clients/durable-store.js +80 -0
  188. package/extensions/dm-lens/clients/effective-config.js +162 -0
  189. package/extensions/dm-lens/clients/env-utils.js +26 -0
  190. package/extensions/dm-lens/clients/error-class.js +3 -0
  191. package/extensions/dm-lens/clients/eval-timestamp.js +2 -0
  192. package/extensions/dm-lens/clients/event-loop-monitor.js +89 -0
  193. package/extensions/dm-lens/clients/extension-log.js +225 -0
  194. package/extensions/dm-lens/clients/extension-mode.js +20 -0
  195. package/extensions/dm-lens/clients/feature-hints.js +87 -0
  196. package/extensions/dm-lens/clients/file-kinds.js +308 -0
  197. package/extensions/dm-lens/clients/file-role.js +41 -0
  198. package/extensions/dm-lens/clients/file-time.js +112 -0
  199. package/extensions/dm-lens/clients/file-utils.js +564 -0
  200. package/extensions/dm-lens/clients/finding-delivery-gate.js +133 -0
  201. package/extensions/dm-lens/clients/finding-identity.js +23 -0
  202. package/extensions/dm-lens/clients/fix-worklog.js +75 -0
  203. package/extensions/dm-lens/clients/format-events-publish.js +234 -0
  204. package/extensions/dm-lens/clients/format-service.js +137 -0
  205. package/extensions/dm-lens/clients/formatters-lazy.js +8 -0
  206. package/extensions/dm-lens/clients/formatters.js +1362 -0
  207. package/extensions/dm-lens/clients/freshness-cadence.js +1 -0
  208. package/extensions/dm-lens/clients/freshness.js +8 -0
  209. package/extensions/dm-lens/clients/generated-artifacts.js +209 -0
  210. package/extensions/dm-lens/clients/generation-guard.js +99 -0
  211. package/extensions/dm-lens/clients/git-guard.js +721 -0
  212. package/extensions/dm-lens/clients/git-tracked-ignore.js +120 -0
  213. package/extensions/dm-lens/clients/gitleaks-client.js +262 -0
  214. package/extensions/dm-lens/clients/go-client.js +49 -0
  215. package/extensions/dm-lens/clients/govulncheck-client.js +392 -0
  216. package/extensions/dm-lens/clients/gradle-ktfmt-style.js +97 -0
  217. package/extensions/dm-lens/clients/grammar-source.js +224 -0
  218. package/extensions/dm-lens/clients/gzip-stage-write.js +85 -0
  219. package/extensions/dm-lens/clients/hashline-anchor.js +222 -0
  220. package/extensions/dm-lens/clients/hook-budgets.js +16 -0
  221. package/extensions/dm-lens/clients/host-edit-normalize.js +87 -0
  222. package/extensions/dm-lens/clients/host-ports.js +35 -0
  223. package/extensions/dm-lens/clients/indent-retarget.js +75 -0
  224. package/extensions/dm-lens/clients/install-diagnostics.js +121 -0
  225. package/extensions/dm-lens/clients/installer/index.js +3275 -0
  226. package/extensions/dm-lens/clients/installer/managed-tool-refresh-session.js +17 -0
  227. package/extensions/dm-lens/clients/installer/managed-tool-refresh.js +479 -0
  228. package/extensions/dm-lens/clients/instance-reaper.js +581 -0
  229. package/extensions/dm-lens/clients/instance-registry-lock.js +131 -0
  230. package/extensions/dm-lens/clients/instance-registry.js +426 -0
  231. package/extensions/dm-lens/clients/jscpd-client.js +250 -0
  232. package/extensions/dm-lens/clients/json-cache-read.js +25 -0
  233. package/extensions/dm-lens/clients/knip-client.js +479 -0
  234. package/extensions/dm-lens/clients/language-policy.js +242 -0
  235. package/extensions/dm-lens/clients/language-profile.js +267 -0
  236. package/extensions/dm-lens/clients/language-registry.js +422 -0
  237. package/extensions/dm-lens/clients/latency-logger.js +182 -0
  238. package/extensions/dm-lens/clients/lazy-import.js +14 -0
  239. package/extensions/dm-lens/clients/ledger-bounds.js +9 -0
  240. package/extensions/dm-lens/clients/lens-config.js +202 -0
  241. package/extensions/dm-lens/clients/lens-engine.js +221 -0
  242. package/extensions/dm-lens/clients/lens-events.js +109 -0
  243. package/extensions/dm-lens/clients/lens-flag-registry.js +257 -0
  244. package/extensions/dm-lens/clients/lens-map.js +980 -0
  245. package/extensions/dm-lens/clients/live-bus-emitter.js +53 -0
  246. package/extensions/dm-lens/clients/log-cleanup.js +166 -0
  247. package/extensions/dm-lens/clients/lsp/aggregation.js +88 -0
  248. package/extensions/dm-lens/clients/lsp/cascade-tier.js +210 -0
  249. package/extensions/dm-lens/clients/lsp/client.js +2710 -0
  250. package/extensions/dm-lens/clients/lsp/config.js +247 -0
  251. package/extensions/dm-lens/clients/lsp/diagnostic-binding.js +76 -0
  252. package/extensions/dm-lens/clients/lsp/document-drift.js +241 -0
  253. package/extensions/dm-lens/clients/lsp/edits.js +944 -0
  254. package/extensions/dm-lens/clients/lsp/index.js +4138 -0
  255. package/extensions/dm-lens/clients/lsp/inferred-project.js +123 -0
  256. package/extensions/dm-lens/clients/lsp/jvm-runtime.js +199 -0
  257. package/extensions/dm-lens/clients/lsp/language.js +29 -0
  258. package/extensions/dm-lens/clients/lsp/launch.js +469 -0
  259. package/extensions/dm-lens/clients/lsp/lombok.js +146 -0
  260. package/extensions/dm-lens/clients/lsp/path-utils.js +10 -0
  261. package/extensions/dm-lens/clients/lsp/pending-aux-coverage.js +91 -0
  262. package/extensions/dm-lens/clients/lsp/position-encoding.js +28 -0
  263. package/extensions/dm-lens/clients/lsp/ruby-drive-dirs.js +42 -0
  264. package/extensions/dm-lens/clients/lsp/server.js +2407 -0
  265. package/extensions/dm-lens/clients/lsp/session-roots.js +31 -0
  266. package/extensions/dm-lens/clients/lsp/spawn-history.js +15 -0
  267. package/extensions/dm-lens/clients/lsp/sync-kind.js +17 -0
  268. package/extensions/dm-lens/clients/lsp/tsserver-sync.js +158 -0
  269. package/extensions/dm-lens/clients/lsp/wait-policy/capability-snapshot.js +0 -0
  270. package/extensions/dm-lens/clients/lsp/wait-policy/classification.js +33 -0
  271. package/extensions/dm-lens/clients/lsp/wait-policy/index.js +3 -0
  272. package/extensions/dm-lens/clients/lsp/wait-policy/strategies.js +146 -0
  273. package/extensions/dm-lens/clients/lsp/watch-queue.js +40 -0
  274. package/extensions/dm-lens/clients/lsp/workspace-diagnostics-cache.js +247 -0
  275. package/extensions/dm-lens/clients/lsp/workspace-diagnostics-session.js +7 -0
  276. package/extensions/dm-lens/clients/lsp/workspace-sweep-hold.js +93 -0
  277. package/extensions/dm-lens/clients/lsp-budget.js +86 -0
  278. package/extensions/dm-lens/clients/lsp-document-symbols.js +93 -0
  279. package/extensions/dm-lens/clients/lsp-lazy.js +8 -0
  280. package/extensions/dm-lens/clients/lsp-mutation.js +277 -0
  281. package/extensions/dm-lens/clients/lsp-status.js +37 -0
  282. package/extensions/dm-lens/clients/map-with-concurrency.js +16 -0
  283. package/extensions/dm-lens/clients/mcp/analyze.js +261 -0
  284. package/extensions/dm-lens/clients/mcp/host-shim.js +14 -0
  285. package/extensions/dm-lens/clients/mcp/ipc.js +238 -0
  286. package/extensions/dm-lens/clients/mcp/review.js +112 -0
  287. package/extensions/dm-lens/clients/mcp/session.js +285 -0
  288. package/extensions/dm-lens/clients/memory-sampler.js +110 -0
  289. package/extensions/dm-lens/clients/message-end-attribution.js +18 -0
  290. package/extensions/dm-lens/clients/metrics-client.js +80 -0
  291. package/extensions/dm-lens/clients/metrics-history.js +320 -0
  292. package/extensions/dm-lens/clients/middle-man-analysis.js +163 -0
  293. package/extensions/dm-lens/clients/model-provider.js +31 -0
  294. package/extensions/dm-lens/clients/module-report-lsp.js +140 -0
  295. package/extensions/dm-lens/clients/module-report.js +1675 -0
  296. package/extensions/dm-lens/clients/mutating-tool.js +383 -0
  297. package/extensions/dm-lens/clients/mutation-attribution.js +168 -0
  298. package/extensions/dm-lens/clients/mutation-bridge.js +104 -0
  299. package/extensions/dm-lens/clients/ndjson-logger.js +463 -0
  300. package/extensions/dm-lens/clients/observed-mutation-sources.js +43 -0
  301. package/extensions/dm-lens/clients/observed-mutation.js +686 -0
  302. package/extensions/dm-lens/clients/oldtext-autopatch.js +100 -0
  303. package/extensions/dm-lens/clients/opaque-mutation-scan.js +303 -0
  304. package/extensions/dm-lens/clients/opengrep-client.js +134 -0
  305. package/extensions/dm-lens/clients/opengrep-config.js +52 -0
  306. package/extensions/dm-lens/clients/package-manager.js +320 -0
  307. package/extensions/dm-lens/clients/package-root.js +25 -0
  308. package/extensions/dm-lens/clients/partial-edit-apply.js +353 -0
  309. package/extensions/dm-lens/clients/path-attribution-telemetry.js +31 -0
  310. package/extensions/dm-lens/clients/path-keyed-map.js +57 -0
  311. package/extensions/dm-lens/clients/path-utils.js +285 -0
  312. package/extensions/dm-lens/clients/performance-report.js +299 -0
  313. package/extensions/dm-lens/clients/persist-debounce.js +37 -0
  314. package/extensions/dm-lens/clients/php-cs-fixer-config.js +10 -0
  315. package/extensions/dm-lens/clients/pipeline.js +1081 -0
  316. package/extensions/dm-lens/clients/post-autofix-notice.js +19 -0
  317. package/extensions/dm-lens/clients/print-mode.js +3 -0
  318. package/extensions/dm-lens/clients/probe-home-state.js +62 -0
  319. package/extensions/dm-lens/clients/process-bridge.js +20 -0
  320. package/extensions/dm-lens/clients/process-singletons.js +69 -0
  321. package/extensions/dm-lens/clients/process-snapshot.js +27 -0
  322. package/extensions/dm-lens/clients/project-changes.js +112 -0
  323. package/extensions/dm-lens/clients/project-conventions.js +152 -0
  324. package/extensions/dm-lens/clients/project-diagnostics/cache.js +77 -0
  325. package/extensions/dm-lens/clients/project-diagnostics/extractors.js +53 -0
  326. package/extensions/dm-lens/clients/project-diagnostics/fresh-fetch.js +282 -0
  327. package/extensions/dm-lens/clients/project-diagnostics/runner-adapters/call-graph-impact.js +66 -0
  328. package/extensions/dm-lens/clients/project-diagnostics/runner-adapters/dead-code.js +35 -0
  329. package/extensions/dm-lens/clients/project-diagnostics/runner-adapters/gitleaks.js +21 -0
  330. package/extensions/dm-lens/clients/project-diagnostics/runner-adapters/govulncheck.js +23 -0
  331. package/extensions/dm-lens/clients/project-diagnostics/runner-adapters/jscpd.js +28 -0
  332. package/extensions/dm-lens/clients/project-diagnostics/runner-adapters/knip.js +45 -0
  333. package/extensions/dm-lens/clients/project-diagnostics/runner-adapters/madge.js +34 -0
  334. package/extensions/dm-lens/clients/project-diagnostics/runner-adapters/opengrep.js +32 -0
  335. package/extensions/dm-lens/clients/project-diagnostics/runner-adapters/runner-findings.js +67 -0
  336. package/extensions/dm-lens/clients/project-diagnostics/runner-adapters/trivy.js +41 -0
  337. package/extensions/dm-lens/clients/project-diagnostics/scanner.js +341 -0
  338. package/extensions/dm-lens/clients/project-diagnostics/types.js +0 -0
  339. package/extensions/dm-lens/clients/project-lens-config.js +421 -0
  340. package/extensions/dm-lens/clients/project-report.js +536 -0
  341. package/extensions/dm-lens/clients/project-scale.js +60 -0
  342. package/extensions/dm-lens/clients/project-scan-policy.js +52 -0
  343. package/extensions/dm-lens/clients/project-snapshot-fingerprint.js +39 -0
  344. package/extensions/dm-lens/clients/project-snapshot-persist-worker.js +16 -0
  345. package/extensions/dm-lens/clients/project-snapshot.js +1183 -0
  346. package/extensions/dm-lens/clients/project-trust.js +104 -0
  347. package/extensions/dm-lens/clients/python-environment.js +55 -0
  348. package/extensions/dm-lens/clients/quiet-window-config.js +16 -0
  349. package/extensions/dm-lens/clients/quiet-window.js +137 -0
  350. package/extensions/dm-lens/clients/read-bridge.js +48 -0
  351. package/extensions/dm-lens/clients/read-expansion.js +218 -0
  352. package/extensions/dm-lens/clients/read-guard-logger.js +176 -0
  353. package/extensions/dm-lens/clients/read-guard-tool-lines.js +1053 -0
  354. package/extensions/dm-lens/clients/read-guard.js +1077 -0
  355. package/extensions/dm-lens/clients/recent-touches.js +126 -0
  356. package/extensions/dm-lens/clients/redact/secrets.js +386 -0
  357. package/extensions/dm-lens/clients/resource-sampler.js +297 -0
  358. package/extensions/dm-lens/clients/reverse-deps.js +230 -0
  359. package/extensions/dm-lens/clients/review-graph/builder.js +3664 -0
  360. package/extensions/dm-lens/clients/review-graph/format.js +30 -0
  361. package/extensions/dm-lens/clients/review-graph/git-identity.js +111 -0
  362. package/extensions/dm-lens/clients/review-graph/import-resolvers.js +328 -0
  363. package/extensions/dm-lens/clients/review-graph/persist-worker.js +10 -0
  364. package/extensions/dm-lens/clients/review-graph/query.js +199 -0
  365. package/extensions/dm-lens/clients/review-graph/revision-drift.js +3 -0
  366. package/extensions/dm-lens/clients/review-graph/service.js +65 -0
  367. package/extensions/dm-lens/clients/review-graph/shared-extraction-ir.js +54 -0
  368. package/extensions/dm-lens/clients/review-graph/symbol-id.js +29 -0
  369. package/extensions/dm-lens/clients/review-graph/tsconfig-paths.js +257 -0
  370. package/extensions/dm-lens/clients/review-graph/types.js +0 -0
  371. package/extensions/dm-lens/clients/review-graph/workspace-modules.js +382 -0
  372. package/extensions/dm-lens/clients/review-graph-logger.js +49 -0
  373. package/extensions/dm-lens/clients/ruff-client.js +111 -0
  374. package/extensions/dm-lens/clients/rules-scanner.js +113 -0
  375. package/extensions/dm-lens/clients/run-duration.js +9 -0
  376. package/extensions/dm-lens/clients/runtime-agent-end.js +609 -0
  377. package/extensions/dm-lens/clients/runtime-config.js +39 -0
  378. package/extensions/dm-lens/clients/runtime-context.js +157 -0
  379. package/extensions/dm-lens/clients/runtime-coordinator.js +765 -0
  380. package/extensions/dm-lens/clients/runtime-session.js +1686 -0
  381. package/extensions/dm-lens/clients/runtime-tool-call.js +917 -0
  382. package/extensions/dm-lens/clients/runtime-tool-result.js +1178 -0
  383. package/extensions/dm-lens/clients/runtime-turn.js +2158 -0
  384. package/extensions/dm-lens/clients/rust-client.js +50 -0
  385. package/extensions/dm-lens/clients/safe-spawn.js +1088 -0
  386. package/extensions/dm-lens/clients/sanitize.js +178 -0
  387. package/extensions/dm-lens/clients/scan-utils.js +48 -0
  388. package/extensions/dm-lens/clients/scratch-tree-policy.js +58 -0
  389. package/extensions/dm-lens/clients/search-read-registration.js +59 -0
  390. package/extensions/dm-lens/clients/secret-findings.js +69 -0
  391. package/extensions/dm-lens/clients/security-scan-client.js +215 -0
  392. package/extensions/dm-lens/clients/session-event-guard.js +54 -0
  393. package/extensions/dm-lens/clients/session-lifecycle.js +173 -0
  394. package/extensions/dm-lens/clients/session-start-observability.js +47 -0
  395. package/extensions/dm-lens/clients/session-state-store.js +63 -0
  396. package/extensions/dm-lens/clients/session-summary.js +33 -0
  397. package/extensions/dm-lens/clients/sessionstart-logger.js +22 -0
  398. package/extensions/dm-lens/clients/sg-runner.js +624 -0
  399. package/extensions/dm-lens/clients/sgconfig.js +228 -0
  400. package/extensions/dm-lens/clients/shared-checkout-guard.js +186 -0
  401. package/extensions/dm-lens/clients/single-flight.js +52 -0
  402. package/extensions/dm-lens/clients/slow-fs.js +77 -0
  403. package/extensions/dm-lens/clients/smells-rollup.js +118 -0
  404. package/extensions/dm-lens/clients/source-filter.js +327 -0
  405. package/extensions/dm-lens/clients/source-walker.js +96 -0
  406. package/extensions/dm-lens/clients/spawn-output-cap.js +6 -0
  407. package/extensions/dm-lens/clients/spawn-timeout-cooldown.js +51 -0
  408. package/extensions/dm-lens/clients/stale-marker.js +1 -0
  409. package/extensions/dm-lens/clients/startup-scan.js +232 -0
  410. package/extensions/dm-lens/clients/startup-timing.js +70 -0
  411. package/extensions/dm-lens/clients/string-utils.js +3 -0
  412. package/extensions/dm-lens/clients/subagent-mode.js +40 -0
  413. package/extensions/dm-lens/clients/symbol-containment.js +16 -0
  414. package/extensions/dm-lens/clients/symbol-types.js +0 -0
  415. package/extensions/dm-lens/clients/test-runner-client.js +1451 -0
  416. package/extensions/dm-lens/clients/test-runner-delivery.js +208 -0
  417. package/extensions/dm-lens/clients/todo-scanner.js +164 -0
  418. package/extensions/dm-lens/clients/tool-definition.js +5 -0
  419. package/extensions/dm-lens/clients/tool-event.js +18 -0
  420. package/extensions/dm-lens/clients/tool-policy.js +2273 -0
  421. package/extensions/dm-lens/clients/tool-render.js +79 -0
  422. package/extensions/dm-lens/clients/tool-set-policy.js +35 -0
  423. package/extensions/dm-lens/clients/tree-sitter-cache.js +206 -0
  424. package/extensions/dm-lens/clients/tree-sitter-client.js +2702 -0
  425. package/extensions/dm-lens/clients/tree-sitter-logger.js +77 -0
  426. package/extensions/dm-lens/clients/tree-sitter-navigator.js +198 -0
  427. package/extensions/dm-lens/clients/tree-sitter-query-loader.js +376 -0
  428. package/extensions/dm-lens/clients/tree-sitter-shared.js +89 -0
  429. package/extensions/dm-lens/clients/tree-sitter-symbol-extractor.js +957 -0
  430. package/extensions/dm-lens/clients/trivy-client.js +298 -0
  431. package/extensions/dm-lens/clients/tui-fit.js +29 -0
  432. package/extensions/dm-lens/clients/turn-summary-render.js +58 -0
  433. package/extensions/dm-lens/clients/turn-summary.js +84 -0
  434. package/extensions/dm-lens/clients/typos-config.js +9 -0
  435. package/extensions/dm-lens/clients/user-notify.js +20 -0
  436. package/extensions/dm-lens/clients/vanished-instance-marker.js +18 -0
  437. package/extensions/dm-lens/clients/warm-attach.js +199 -0
  438. package/extensions/dm-lens/clients/widget-state.js +788 -0
  439. package/extensions/dm-lens/clients/word-index-logger.js +27 -0
  440. package/extensions/dm-lens/clients/word-index-store.js +228 -0
  441. package/extensions/dm-lens/clients/word-index.js +1451 -0
  442. package/extensions/dm-lens/clients/workspace-topology.js +251 -0
  443. package/extensions/dm-lens/clients/write-ordering-guard.js +18 -0
  444. package/extensions/dm-lens/clients/zizmor-config.js +161 -0
  445. package/extensions/dm-lens/config/biome/core.jsonc +92 -0
  446. package/extensions/dm-lens/config/dependency-cruiser-eager-allowlist.json +90 -0
  447. package/extensions/dm-lens/config/markdownlint/core.json +6 -0
  448. package/extensions/dm-lens/config/ruff/core.toml +67 -0
  449. package/extensions/dm-lens/i18n.js +67 -0
  450. package/extensions/dm-lens/index.js +1802 -0
  451. package/extensions/dm-lens/mcp/analyze-cli.js +181 -0
  452. package/extensions/dm-lens/mcp/build-staleness.js +55 -0
  453. package/extensions/dm-lens/mcp/cli.js +84 -0
  454. package/extensions/dm-lens/mcp/server.js +1205 -0
  455. package/extensions/dm-lens/mcp/worker.js +33 -0
  456. package/extensions/dm-lens/package.json +45 -0
  457. package/extensions/dm-lens/rules/.sgconfig.yml +4 -0
  458. package/extensions/dm-lens/rules/ast-grep-rules/.sgconfig.yml +13 -0
  459. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/c/security/dont-call-system-c.yml +57 -0
  460. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/c/security/file-access-before-action-c.yml +182 -0
  461. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/c/security/file-stat-before-action-c.yml +331 -0
  462. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/c/security/insecure-hash-c.yml +286 -0
  463. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/c/security/libxml2-audit-parser-c.yml +258 -0
  464. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/c/security/null-library-function-c.yml +254 -0
  465. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/c/security/sizeof-this-c.yml +121 -0
  466. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/c/security/small-key-size-c.yml +40 -0
  467. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/c/security/world-writable-file-c.yml +317 -0
  468. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/cpp/security/dont-call-system-cpp.yml +57 -0
  469. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/cpp/security/file-access-before-action-cpp.yml +271 -0
  470. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/cpp/security/file-stat-before-action-cpp.yml +494 -0
  471. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/cpp/security/fix-format-security-error-cpp.yml +18 -0
  472. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/cpp/security/insecure-hash-cpp.yml +122 -0
  473. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/cpp/security/libxml2-audit-parser-cpp.yml +258 -0
  474. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/cpp/security/missing-nul-cpp-string-memcpy-cpp.yml +393 -0
  475. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/cpp/security/null-library-function-cpp.yml +254 -0
  476. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/cpp/security/return-c-str-cpp.yml +124 -0
  477. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/cpp/security/sizeof-this-cpp.yml +41 -0
  478. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/cpp/security/small-key-size-cpp.yml +40 -0
  479. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/cpp/security/std-return-data-cpp.yml +93 -0
  480. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/cpp/security/std-vector-invalidation-cpp.yml +147 -0
  481. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/cpp/security/string-view-temporary-string-cpp.yml +924 -0
  482. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/cpp/security/world-writable-file-cpp.yml +317 -0
  483. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/csharp/security/httponly-false-csharp.yml +42 -0
  484. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/csharp/security/insecure-binaryformatter-deserialization-csharp.yml +38 -0
  485. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/csharp/security/jwt-decode-without-verify-csharp.yml +700 -0
  486. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/csharp/security/jwt-hardcoded-secret-csharp.yml +672 -0
  487. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/csharp/security/jwt-tokenvalidationparameters-no-expiry-validation-csharp.yml +136 -0
  488. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/csharp/security/networkcredential-hardcoded-secret-python.yml +394 -0
  489. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/csharp/security/npgsqlconnectionstringbuilder-hardcoded-secret-csharp.yml +339 -0
  490. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/csharp/security/oracleconnectionstringbuilder-hardcoded-secret-csharp.yml +339 -0
  491. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/csharp/security/sqlconnectionstringbuilder-hardcoded-secret-csharp.yml +339 -0
  492. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/csharp/security/stacktrace-disclosure-csharp.yml +48 -0
  493. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/csharp/security/use-ecb-mode-csharp.yml +177 -0
  494. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/go/security/avoid-bind-to-all-interfaces-go.yml +27 -0
  495. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/go/security/gorilla-cookie-store-hardcoded-session-key-go.yml +90 -0
  496. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/go/security/gorilla-csrf-hardcoded-auth-key-go.yml +79 -0
  497. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/go/security/grpc-client-insecure-connection-go.yml +60 -0
  498. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/go/security/jwt-go-none-algorithm-go.yml +35 -0
  499. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/go/security/missing-ssl-minversion-go.yml +42 -0
  500. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/go/security/openai-empty-secret-go.yml +199 -0
  501. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/go/security/openai-hardcoded-secret-go.yml +208 -0
  502. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/go/security/ssl-v3-is-insecure-go.yml +40 -0
  503. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/go/security/tls-with-insecure-cipher-go.yml +65 -0
  504. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/go/security/use-of-weak-rsa-key-go.yml +253 -0
  505. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/html/security/plaintext-http-link-html.yml +76 -0
  506. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/java/security/cbc-padding-oracle-java.yml +17 -0
  507. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/java/security/cookie-httponly-false-java.yml +9 -0
  508. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/java/security/cookie-missing-httponly-java.yml +21 -0
  509. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/java/security/cookie-missing-samesite-java.yml +64 -0
  510. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/java/security/cookie-missing-secure-flag-java.yml +51 -0
  511. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/java/security/cookie-secure-flag-false-java.yml +13 -0
  512. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/java/security/datanucleus-hardcoded-connection-password-java.yml +575 -0
  513. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/java/security/des-is-deprecated-java.yml +15 -0
  514. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/java/security/desede-is-deprecated-java.yml +92 -0
  515. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/java/security/documentbuilderfactory-disallow-doctype-decl-false-java.yml +45 -0
  516. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/java/security/documentbuilderfactory-external-general-entities-true-java.yml +279 -0
  517. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/java/security/documentbuilderfactory-external-parameter-entities-true-java.yml +279 -0
  518. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/java/security/drivermanager-hardcoded-secret-java.yml +142 -0
  519. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/java/security/ecb-cipher-java.yml +47 -0
  520. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/java/security/hardcoded-connection-password-java.yml +341 -0
  521. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/java/security/hardcoded-secret-in-credentials-java.yml +281 -0
  522. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/java/security/java-jwt-hardcoded-secret-java.yml +124 -0
  523. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/java/security/jedis-jedisclientconfig-hardcoded-password-java.yml +804 -0
  524. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/java/security/jedis-jedisfactory-hardcoded-password-java.yml +930 -0
  525. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/java/security/missing-httponly-java.yml +583 -0
  526. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/java/security/missing-secure-java.yml +584 -0
  527. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/java/security/no-null-cipher-java.yml +38 -0
  528. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/java/security/passwordauthentication-hardcoded-password-java.yml +651 -0
  529. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/java/security/rsa-no-padding-java.yml +13 -0
  530. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/java/security/simple-command-injection-direct-input-java.yml +55 -0
  531. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/java/security/system-setproperty-hardcoded-secret-java.yml +312 -0
  532. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/java/security/unencrypted-socket-java.yml +20 -0
  533. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/java/security/use-of-aes-ecb-java.yml +68 -0
  534. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/java/security/use-of-blowfish-java.yml +45 -0
  535. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/java/security/use-of-default-aes-java.yml +318 -0
  536. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/java/security/use-of-md5-digest-utils-java.yml +38 -0
  537. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/java/security/use-of-md5-java.yml +104 -0
  538. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/java/security/use-of-rc2-java.yml +84 -0
  539. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/java/security/use-of-rc4-java.yml +38 -0
  540. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/java/security/use-of-sha1-java.yml +165 -0
  541. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/java/security/weak-ssl-context-java.yml +56 -0
  542. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/javascript/security/detect-angular-sce-disabled-javascript.yml +14 -0
  543. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/javascript/security/express-jwt-hardcoded-secret-javascript.yml +289 -0
  544. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/javascript/security/express-session-hardcoded-secret-javascript.yml +101 -0
  545. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/javascript/security/jwt-simple-noverify-javascript.yml +43 -0
  546. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/javascript/security/node-rsa-weak-key-javascript.yml +577 -0
  547. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/javascript/security/node-sequelize-empty-password-argument-javascript.yml +191 -0
  548. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/javascript/security/node-sequelize-hardcoded-secret-argument-javascript.yml +94 -0
  549. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/kotlin/security/des-is-deprecated-kotlin.yml +15 -0
  550. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/kotlin/security/desede-is-deprecated-kotlin.yml +462 -0
  551. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/kotlin/security/jwt-hardcode-kotlin.yml +567 -0
  552. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/kotlin/security/rsa-no-padding-kotlin.yml +13 -0
  553. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/kotlin/security/system-setproperty-hardcoded-secret-kotlin.yml +51 -0
  554. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/php/security/openssl-cbc-static-iv-php.yml +641 -0
  555. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/php/security/search-active-debug-php.yml +153 -0
  556. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/python/security/avoid-mktemp-python.yml +71 -0
  557. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/python/security/avoid_app_run_with_bad_host-python.yml +69 -0
  558. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/python/security/debug-enabled-python.yml +91 -0
  559. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/python/security/hashids-with-django-secret-python.yml +273 -0
  560. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/python/security/hashids-with-flask-secret-python.yml +190 -0
  561. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/python/security/insecure-cipher-algorithm-rc4-python.yml +75 -0
  562. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/python/security/jwt-python-hardcoded-secret-python.yml +116 -0
  563. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/python/security/openai-hardcoded-secret-python.yml +21 -0
  564. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/python/security/python-cassandra-empty-password-python.yml +227 -0
  565. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/python/security/python-cassandra-hardcoded-secret-python.yml +396 -0
  566. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/python/security/python-couchbase-empty-password-python.yml +72 -0
  567. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/python/security/python-couchbase-hardcoded-secret-python.yml +183 -0
  568. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/python/security/python-elasticsearch-hardcoded-bearer-auth-python.yml +64 -0
  569. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/python/security/python-ldap3-empty-password-python.yml +92 -0
  570. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/python/security/python-ldap3-hardcoded-secret-python.yml +145 -0
  571. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/python/security/python-mariadb-empty-password-python.yml +194 -0
  572. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/python/security/python-mariadb-hardcoded-secret-python.yml +193 -0
  573. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/python/security/python-mysql-empty-password-python.yml +192 -0
  574. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/python/security/python-mysql-hardcoded-secret-python.yml +195 -0
  575. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/python/security/python-mysqlclient-empty-password-python.yml +189 -0
  576. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/python/security/python-mysqlclient-hardcoded-secret-python.yml +191 -0
  577. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/python/security/python-neo4j-empty-password-python.yml +203 -0
  578. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/python/security/python-neo4j-hardcoded-secret-python.yml +205 -0
  579. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/python/security/python-peewee-mysql-empty-password-python.yml +50 -0
  580. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/python/security/python-peewee-mysql-hardcoded-secret-python.yml +48 -0
  581. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/python/security/python-peewee-pg-empty-password-python.yml +51 -0
  582. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/python/security/python-peewee-pg-hardcoded-secret-python.yml +49 -0
  583. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/python/security/python-pg8000-empty-password-python.yml +43 -0
  584. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/python/security/python-pg8000-hardcoded-secret-python.yml +67 -0
  585. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/python/security/python-psycopg2-empty-password-python.yml +65 -0
  586. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/python/security/python-psycopg2-hardcoded-secret-python.yml +64 -0
  587. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/python/security/python-pyjwt-hardcoded-secret-python.yml +38 -0
  588. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/python/security/python-pymongo-empty-password-python.yml +50 -0
  589. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/python/security/python-pymongo-hardcoded-secret-python.yml +48 -0
  590. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/python/security/python-pymssql-empty-password-python.yml +50 -0
  591. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/python/security/python-pymssql-hardcoded-secret-python.yml +48 -0
  592. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/python/security/python-pymysql-empty-password-python.yml +49 -0
  593. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/python/security/python-pymysql-hardcoded-secret-python.yml +47 -0
  594. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/python/security/python-redis-empty-password-python.yml +66 -0
  595. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/python/security/python-redis-hardcoded-secret-python.yml +65 -0
  596. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/python/security/python-requests-empty-password-python.yml +42 -0
  597. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/python/security/python-requests-hardcoded-secret-python.yml +146 -0
  598. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/python/security/python-requests-oauth-hardcoded-secret-python.yml +278 -0
  599. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/python/security/python-tormysql-empty-password-python.yml +301 -0
  600. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/python/security/python-tormysql-hardcoded-secret-python.yml +292 -0
  601. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/python/security/python-urllib3-hardcoded-secret-python.yml +52 -0
  602. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/python/security/python-webrepl-empty-password-python.yml +49 -0
  603. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/python/security/python-webrepl-hardcoded-secret-python.yml +47 -0
  604. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/ruby/security/force-ssl-false-ruby.yml +23 -0
  605. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/ruby/security/hardcoded-http-auth-in-controller-ruby.yml +55 -0
  606. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/ruby/security/hardcoded-secret-rsa-passphrase-ruby.yml +218 -0
  607. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/ruby/security/insufficient-rsa-key-size-ruby.yml +84 -0
  608. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/ruby/security/ruby-aws-sdk-hardcoded-secret-ruby.yml +140 -0
  609. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/ruby/security/ruby-cassandra-empty-password-ruby.yml +141 -0
  610. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/ruby/security/ruby-cassandra-hardcoded-secret-ruby.yml +138 -0
  611. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/ruby/security/ruby-excon-hardcoded-secret-ruby.yml +226 -0
  612. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/ruby/security/ruby-faraday-hardcoded-secret-ruby.yml +490 -0
  613. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/ruby/security/ruby-mongo-empty-password-ruby.yml +356 -0
  614. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/ruby/security/ruby-mongo-hardcoded-secret-ruby.yml +400 -0
  615. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/ruby/security/ruby-mysql2-empty-password-ruby.yml +227 -0
  616. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/ruby/security/ruby-mysql2-hardcoded-secret-ruby.yml +248 -0
  617. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/ruby/security/ruby-octokit-hardcoded-secret-ruby.yml +125 -0
  618. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/ruby/security/ruby-pg-empty-password-ruby.yml +150 -0
  619. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/ruby/security/ruby-pg-hardcoded-secret-ruby.yml +189 -0
  620. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/ruby/security/ruby-redis-empty-password-ruby.yml +72 -0
  621. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/ruby/security/ruby-redis-hardcoded-secret-ruby.yml +70 -0
  622. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/rust/security/empty-password-rust.yml +1039 -0
  623. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/rust/security/hardcoded-password-rust.yml +1016 -0
  624. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/rust/security/postgres-empty-password-rust.yml +283 -0
  625. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/rust/security/reqwest-accept-invalid-rust.yml +21 -0
  626. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/rust/security/secrets-reqwest-hardcoded-auth-rust.yml +290 -0
  627. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/rust/security/ssl-verify-none-rust.yml +100 -0
  628. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/rust/security/tokio-postgres-empty-password-rust.yml +235 -0
  629. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/rust/security/tokio-postgres-hardcoded-password-rust.yml +229 -0
  630. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/scala/security/jwt-scala-hardcode-scala.yml +109 -0
  631. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/scala/security/scala-jwt-hardcoded-secret-scala.yml +176 -0
  632. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/swift/security/aes-hardcoded-secret-swift.yml +345 -0
  633. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/swift/security/blowfish-hardcoded-secret-swift.yml +345 -0
  634. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/swift/security/chacha20-hardcoded-secret-swift.yml +345 -0
  635. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/swift/security/insecure-biometrics-swift.yml +43 -0
  636. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/swift/security/rabbit-hardcoded-secret-swift.yml +345 -0
  637. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/typescript/security/detect-angular-sce-disabled-typescript.yml +36 -0
  638. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/typescript/security/express-session-hardcoded-secret-typescript.yml +203 -0
  639. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/typescript/security/jwt-simple-noverify-typescript.yml +112 -0
  640. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/typescript/security/node-rsa-weak-key-typescript.yml +1483 -0
  641. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/typescript/security/node-sequelize-empty-password-argument-typescript.yml +169 -0
  642. package/extensions/dm-lens/rules/ast-grep-rules/coderabbit/rules/typescript/security/node-sequelize-hardcoded-secret-argument-typescript.yml +154 -0
  643. package/extensions/dm-lens/rules/ast-grep-rules/rule-schema.json +130 -0
  644. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/__snapshots__/no-reflect-get-js-snapshot.yml +23 -0
  645. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/__snapshots__/no-reflect-get-snapshot.yml +23 -0
  646. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/__snapshots__/ts-void-zero-snapshot.yml +23 -0
  647. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/array-callback-return-js-test.yml +10 -0
  648. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/array-callback-return-test.yml +10 -0
  649. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/avoid-duplicate-export-test.yml +14 -0
  650. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/c-no-malloc-free-test.yml +20 -0
  651. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/consistent-existence-index-check-js-test.yml +10 -0
  652. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/consistent-existence-index-check-test.yml +10 -0
  653. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/cpp-no-malloc-free-test.yml +25 -0
  654. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/cpp-no-printf-test.yml +19 -0
  655. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/defer-in-loop-test.yml +20 -0
  656. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/enforce-node-protocol-js-test.yml +8 -0
  657. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/enforce-node-protocol-test.yml +8 -0
  658. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/find-import-file-without-extension-test.yml +12 -0
  659. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/go-defer-func-call-antipattern-test.yml +8 -0
  660. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/go-no-fmt-println-test.yml +19 -0
  661. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/go-no-panic-in-lib-test.yml +17 -0
  662. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/go-no-underscore-func-name-test.yml +18 -0
  663. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/go-prefer-errors-is-test.yml +15 -0
  664. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/go-prefer-string-builder-test.yml +21 -0
  665. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/go-test-functions-test.yml +9 -0
  666. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/gorm-find-without-where-test.yml +15 -0
  667. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/gorm-n-plus-one-test.yml +20 -0
  668. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/hardcoded-url-js-test.yml +9 -0
  669. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/hardcoded-url-test.yml +9 -0
  670. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/hyphenated-svg-attribute-test.yml +11 -0
  671. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/incomplete-string-escaping-js-test.yml +21 -0
  672. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/incomplete-string-escaping-test.yml +21 -0
  673. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/inline-styles-test.yml +8 -0
  674. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/jsx-boolean-short-circuit-test.yml +8 -0
  675. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/jwt-no-verify-js-test.yml +9 -0
  676. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/jwt-no-verify-test.yml +9 -0
  677. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/kotlin-no-lateinit-test.yml +17 -0
  678. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/kotlin-no-nullable-boolean-test.yml +15 -0
  679. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/kotlin-no-println-test.yml +19 -0
  680. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/kotlin-no-unnecessary-let-test.yml +7 -0
  681. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/kotlin-no-unsafe-cast-test.yml +7 -0
  682. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/kotlin-no-var-test.yml +7 -0
  683. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/kotlin-prefer-data-class-test.yml +25 -0
  684. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/kotlin-prefer-is-empty-test.yml +11 -0
  685. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/large-class-test.yml +15 -0
  686. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/long-parameter-list-test.yml +8 -0
  687. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/loop-var-capture-test.yml +25 -0
  688. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/missing-component-decorator-test.yml +7 -0
  689. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/mutex-unlock-mismatch-test.yml +29 -0
  690. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/nested-ternary-js-test.yml +8 -0
  691. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/nested-ternary-test.yml +8 -0
  692. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/nil-map-assignment-test.yml +50 -0
  693. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-absolute-path-import-js-test.yml +8 -0
  694. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-absolute-path-import-test.yml +8 -0
  695. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-accumulating-spread-js-test.yml +8 -0
  696. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-alert-js-test.yml +7 -0
  697. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-alert-test.yml +7 -0
  698. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-any-type-test.yml +9 -0
  699. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-array-constructor-js-test.yml +9 -0
  700. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-array-constructor-test.yml +9 -0
  701. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-array-reverse-mutation-js-test.yml +9 -0
  702. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-array-reverse-mutation-test.yml +9 -0
  703. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-as-any-test.yml +8 -0
  704. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-assert-tuple-test.yml +13 -0
  705. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-async-promise-executor-js-test.yml +8 -0
  706. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-async-promise-executor-test.yml +8 -0
  707. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-await-expression-member-js-test.yml +8 -0
  708. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-await-expression-member-test.yml +8 -0
  709. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-await-in-promise-all-js-test.yml +7 -0
  710. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-await-in-promise-all-test.yml +7 -0
  711. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-await-in-promise-methods-js-test.yml +10 -0
  712. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-await-in-promise-methods-test.yml +10 -0
  713. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-aws-access-key-literal-test.yml +8 -0
  714. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-aws-apigateway-no-auth-test.yml +12 -0
  715. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-aws-s3-public-access-test.yml +9 -0
  716. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-bare-except-test.yml +77 -0
  717. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-bare-host-path-in-win32-branch-test.yml +87 -0
  718. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-bare-object-param-test.yml +16 -0
  719. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-blank-target-js-test.yml +8 -0
  720. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-boolean-in-except-test.yml +28 -0
  721. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-case-declarations-js-test.yml +34 -0
  722. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-case-declarations-test.yml +34 -0
  723. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-chained-type-assertions-test.yml +22 -0
  724. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-compare-neg-zero-js-test.yml +9 -0
  725. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-compare-neg-zero-test.yml +9 -0
  726. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-comparison-to-none-test.yml +11 -0
  727. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-comparison-to-true-false-test.yml +13 -0
  728. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-compile-call-test.yml +38 -0
  729. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-cond-assign-js-test.yml +9 -0
  730. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-cond-assign-test.yml +9 -0
  731. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-conditional-empty-object-spread-js-test.yml +9 -0
  732. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-conditional-empty-object-spread-test.yml +9 -0
  733. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-console-except-error-js-test.yml +13 -0
  734. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-console-except-error-test.yml +13 -0
  735. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-constant-condition-js-test.yml +10 -0
  736. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-constant-condition-test.yml +10 -0
  737. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-db-string-literal-password-test.yml +8 -0
  738. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-demeter-message-chain-test.yml +16 -0
  739. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-discarded-error-js-test.yml +9 -0
  740. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-discarded-error-test.yml +9 -0
  741. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-dunder-exit-wrong-arity-test.yml +27 -0
  742. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-dupe-class-members-test.yml +44 -0
  743. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-dupe-keys-js-test.yml +9 -0
  744. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-dupe-keys-test.yml +9 -0
  745. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-duplicate-kwarg-test.yml +8 -0
  746. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-ellipsis-body-test.yml +20 -0
  747. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-except-non-exception-test.yml +23 -0
  748. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-extra-boolean-cast-js-test.yml +9 -0
  749. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-extra-boolean-cast-test.yml +9 -0
  750. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-fastapi-router-prefix-outside-init-test.yml +8 -0
  751. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-flag-argument-js-test.yml +37 -0
  752. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-flag-argument-test.yml +37 -0
  753. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-flask-preprocess-request-ignored-test.yml +16 -0
  754. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-flask-secret-key-literal-test.yml +11 -0
  755. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-flask-sendfile-without-mimetype-test.yml +8 -0
  756. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-global-eval-js-test.yml +17 -0
  757. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-hardcoded-password-test.yml +10 -0
  758. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-html-autoescape-off-test.yml +13 -0
  759. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-http-headers-bracket-access-test.yml +7 -0
  760. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-identity-operator-on-literals-test.yml +14 -0
  761. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-implied-eval-js-test.yml +12 -0
  762. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-implied-eval-test.yml +12 -0
  763. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-important-test.yml +21 -0
  764. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-init-return-test.yml +41 -0
  765. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-inner-html-js-test.yml +14 -0
  766. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-inner-html-test.yml +14 -0
  767. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-insecure-randomness-js-test.yml +13 -0
  768. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-insecure-randomness-test.yml +13 -0
  769. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-instanceof-array-js-test.yml +8 -0
  770. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-instanceof-array-test.yml +8 -0
  771. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-instanceof-builtins-js-test.yml +11 -0
  772. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-instanceof-builtins-test.yml +11 -0
  773. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-javascript-url-js-test.yml +24 -0
  774. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-javascript-url-test.yml +28 -0
  775. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-jinja2-autoescape-off-test.yml +13 -0
  776. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-known-value-widening-test.yml +9 -0
  777. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-marshal-load-test.yml +10 -0
  778. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-mutable-contextvar-default-test.yml +9 -0
  779. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-mutable-default-test.yml +12 -0
  780. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-mutable-export-test.yml +10 -0
  781. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-nan-comparison-js-test.yml +11 -0
  782. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-nan-comparison-test.yml +11 -0
  783. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-negation-in-equality-check-js-test.yml +10 -0
  784. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-negation-in-equality-check-test.yml +10 -0
  785. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-nested-links-test.yml +18 -0
  786. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-new-symbol-js-test.yml +8 -0
  787. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-new-symbol-test.yml +8 -0
  788. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-new-wrappers-js-test.yml +9 -0
  789. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-new-wrappers-test.yml +9 -0
  790. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-non-null-assertion-test.yml +226 -0
  791. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-notimplemented-in-bool-test.yml +20 -0
  792. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-numpy-nan-equality-test.yml +22 -0
  793. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-octal-literal-test.yml +8 -0
  794. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-only-defined-names-in-dunder-all-test.yml +17 -0
  795. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-open-redirect-js-test.yml +12 -0
  796. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-open-redirect-test.yml +12 -0
  797. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-prototype-builtins-js-test.yml +9 -0
  798. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-prototype-builtins-native-test.yml +9 -0
  799. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-prototype-builtins-test.yml +9 -0
  800. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-python-sql-string-concat-test.yml +10 -0
  801. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-raise-not-implemented-test.yml +21 -0
  802. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-raise-stopiteration-in-generator-test.yml +22 -0
  803. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-raw-json-store-write-test.yml +17 -0
  804. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-raw-types-test.yml +30 -0
  805. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-reflect-apply-js-test.yml +9 -0
  806. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-reflect-apply-test.yml +9 -0
  807. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-reflect-get-js-test.yml +9 -0
  808. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-reflect-get-test.yml +9 -0
  809. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-relative-cross-package-import-test.yml +9 -0
  810. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-requests-verify-false-test.yml +11 -0
  811. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-requests-without-timeout-test.yml +10 -0
  812. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-return-await-test.yml +12 -0
  813. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-return-value-in-generator-test.yml +34 -0
  814. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-runtime-typeof-test.yml +33 -0
  815. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-secret-in-env-var-name-test.yml +11 -0
  816. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-server-bind-wildcard-test.yml +19 -0
  817. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-shape-in-symbol-names-test.yml +13 -0
  818. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-single-promise-in-promise-methods-js-test.yml +10 -0
  819. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-single-promise-in-promise-methods-test.yml +10 -0
  820. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-singledispatch-on-method-test.yml +25 -0
  821. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-sort-without-comparator-test.yml +8 -0
  822. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-sql-in-code-js-test.yml +14 -0
  823. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-sql-in-code-test.yml +14 -0
  824. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-star-imports-test.yml +9 -0
  825. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-string-concat-in-loop-test.yml +100 -0
  826. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-string-ref-test.yml +8 -0
  827. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-system-out-println-test.yml +7 -0
  828. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-template-string-concat-test.yml +14 -0
  829. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-testclient-text-without-content-test.yml +10 -0
  830. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-throw-string-js-test.yml +10 -0
  831. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-throw-string-test.yml +10 -0
  832. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-typeof-undefined-js-test.yml +19 -0
  833. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-typeof-undefined-test.yml +19 -0
  834. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-unimplemented-stub-js-test.yml +10 -0
  835. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-unimplemented-stub-test.yml +10 -0
  836. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-unknown-laundering-test.yml +11 -0
  837. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-unknown-parameters-test.yml +12 -0
  838. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-unknown-returns-test.yml +16 -0
  839. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-unnecessary-array-flat-depth-js-test.yml +8 -0
  840. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-unnecessary-array-flat-depth-test.yml +8 -0
  841. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-unnecessary-state-initializer-test.yml +7 -0
  842. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-unsafe-dictionary-any-test.yml +10 -0
  843. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-unsafe-dictionary-unknown-test.yml +8 -0
  844. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-useless-length-check-js-test.yml +9 -0
  845. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-useless-length-check-test.yml +9 -0
  846. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-useless-promise-resolve-reject-js-test.yml +8 -0
  847. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-useless-promise-resolve-reject-test.yml +8 -0
  848. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-useless-rest-spread-js-test.yml +8 -0
  849. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-useless-rest-spread-test.yml +8 -0
  850. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-uvicorn-non-import-string-test.yml +10 -0
  851. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-win32-isabsolute-for-qualification-test.yml +16 -0
  852. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-xxe-vulnerable-xml-parser-test.yml +19 -0
  853. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-yield-from-non-iterable-test.yml +11 -0
  854. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/no-yield-return-outside-function-test.yml +19 -0
  855. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/only-strings-in-dunder-all-test.yml +18 -0
  856. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/prefer-array-find-js-test.yml +8 -0
  857. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/prefer-array-find-test.yml +8 -0
  858. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/prefer-array-flat-map-js-test.yml +8 -0
  859. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/prefer-array-flat-map-test.yml +8 -0
  860. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/prefer-array-some-js-test.yml +9 -0
  861. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/prefer-array-some-test.yml +9 -0
  862. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/prefer-at-js-test.yml +8 -0
  863. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/prefer-at-test.yml +8 -0
  864. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/prefer-date-now-js-test.yml +8 -0
  865. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/prefer-date-now-test.yml +8 -0
  866. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/prefer-dom-node-append-js-test.yml +8 -0
  867. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/prefer-dom-node-append-test.yml +8 -0
  868. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/prefer-dom-node-text-content-js-test.yml +9 -0
  869. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/prefer-dom-node-text-content-test.yml +9 -0
  870. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/prefer-keyboard-event-key-js-test.yml +11 -0
  871. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/prefer-keyboard-event-key-test.yml +11 -0
  872. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/prefer-math-min-max-js-test.yml +10 -0
  873. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/prefer-math-min-max-test.yml +10 -0
  874. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/prefer-number-properties-js-test.yml +9 -0
  875. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/prefer-number-properties-test.yml +9 -0
  876. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/prefer-optional-chain-test.yml +9 -0
  877. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/prefer-prototype-methods-js-test.yml +8 -0
  878. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/prefer-prototype-methods-test.yml +8 -0
  879. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/prefer-query-selector-js-test.yml +9 -0
  880. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/prefer-query-selector-test.yml +9 -0
  881. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/prefer-string-is-empty-test.yml +7 -0
  882. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/prefer-string-slice-js-test.yml +9 -0
  883. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/prefer-string-slice-test.yml +9 -0
  884. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/prefer-string-starts-ends-with-js-test.yml +9 -0
  885. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/prefer-string-starts-ends-with-test.yml +9 -0
  886. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/prefer-string-trim-start-end-js-test.yml +9 -0
  887. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/prefer-string-trim-start-end-test.yml +9 -0
  888. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/prefer-structured-clone-js-test.yml +8 -0
  889. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/prefer-structured-clone-test.yml +8 -0
  890. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/python-optional-type-test.yml +9 -0
  891. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/redos-nested-quantifier-test.yml +14 -0
  892. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/reducible-list-comprehension-test.yml +11 -0
  893. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/redundant-state-test.yml +8 -0
  894. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/redundant-unsafe-function-test.yml +60 -0
  895. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/redundant-usestate-type-test.yml +10 -0
  896. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/require-await-test.yml +9 -0
  897. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/require-safety-comment-for-as-unknown-as-test.yml +177 -0
  898. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/ruby-detect-path-traversal-test.yml +9 -0
  899. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/ruby-symbol-to-proc-candidate-test.yml +10 -0
  900. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/rust-2024-let-chain-candidate-test.yml +27 -0
  901. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/rust-no-chars-enumerate-test.yml +7 -0
  902. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/strict-equality-js-test.yml +12 -0
  903. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/strict-equality-test.yml +12 -0
  904. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/strict-inequality-js-test.yml +12 -0
  905. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/strict-inequality-test.yml +13 -0
  906. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/string-concat-in-loop-test.yml +20 -0
  907. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/switch-without-default-test.yml +16 -0
  908. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/throw-new-error-js-test.yml +10 -0
  909. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/throw-new-error-test.yml +10 -0
  910. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/ts-array-concat-spread-test.yml +9 -0
  911. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/ts-array-every-some-test.yml +8 -0
  912. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/ts-boolean-return-if-else-test.yml +13 -0
  913. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/ts-defensive-null-guard-test.yml +14 -0
  914. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/ts-delete-property-test.yml +8 -0
  915. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/ts-double-negation-test.yml +9 -0
  916. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/ts-function-constructor-test.yml +8 -0
  917. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/ts-in-operator-loop-test.yml +13 -0
  918. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/ts-isnan-check-test.yml +9 -0
  919. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/ts-json-stringify-parse-test.yml +8 -0
  920. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/ts-manual-array-contains-test.yml +13 -0
  921. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/ts-nullish-coalescing-opportunity-test.yml +8 -0
  922. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/ts-object-hasown-check-test.yml +8 -0
  923. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/ts-optional-chaining-default-test.yml +8 -0
  924. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/ts-parseint-no-radix-test.yml +9 -0
  925. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/ts-pointless-bool-cast-test.yml +13 -0
  926. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/ts-redundant-filter-map-test.yml +8 -0
  927. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/ts-slice-copy-test.yml +8 -0
  928. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/ts-string-split-index-test.yml +9 -0
  929. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/ts-unnecessary-array-concat-test.yml +8 -0
  930. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/ts-unnecessary-array-from-test.yml +8 -0
  931. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/ts-unnecessary-bind-test.yml +9 -0
  932. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/ts-unnecessary-else-return-test.yml +13 -0
  933. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/ts-void-zero-test.yml +10 -0
  934. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/ts-while-index-length-test.yml +8 -0
  935. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/unchecked-throwing-call-js-test.yml +13 -0
  936. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/unchecked-throwing-call-python-test.yml +23 -0
  937. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/unchecked-throwing-call-test.yml +13 -0
  938. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/unlock-in-loop-test.yml +19 -0
  939. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/unmarshal-tag-is-dash-test.yml +23 -0
  940. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/unnecessary-react-hook-test.yml +8 -0
  941. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/waitgroup-done-scope-test.yml +20 -0
  942. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/weak-rsa-key-js-test.yml +9 -0
  943. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests/weak-rsa-key-test.yml +9 -0
  944. package/extensions/dm-lens/rules/ast-grep-rules/rule-tests-disabled/no-method-field-name-collision-test.yml +23 -0
  945. package/extensions/dm-lens/rules/ast-grep-rules/rules/array-callback-return-js.yml +40 -0
  946. package/extensions/dm-lens/rules/ast-grep-rules/rules/array-callback-return.yml +40 -0
  947. package/extensions/dm-lens/rules/ast-grep-rules/rules/avoid-duplicate-export.yml +19 -0
  948. package/extensions/dm-lens/rules/ast-grep-rules/rules/c-no-malloc-free.yml +39 -0
  949. package/extensions/dm-lens/rules/ast-grep-rules/rules/consistent-existence-index-check-js.yml +15 -0
  950. package/extensions/dm-lens/rules/ast-grep-rules/rules/consistent-existence-index-check.yml +15 -0
  951. package/extensions/dm-lens/rules/ast-grep-rules/rules/cpp-no-malloc-free.yml +45 -0
  952. package/extensions/dm-lens/rules/ast-grep-rules/rules/cpp-no-printf.yml +41 -0
  953. package/extensions/dm-lens/rules/ast-grep-rules/rules/defer-in-loop.yml +10 -0
  954. package/extensions/dm-lens/rules/ast-grep-rules/rules/enforce-node-protocol-js.yml +11 -0
  955. package/extensions/dm-lens/rules/ast-grep-rules/rules/enforce-node-protocol.yml +11 -0
  956. package/extensions/dm-lens/rules/ast-grep-rules/rules/find-import-file-without-extension.yml +24 -0
  957. package/extensions/dm-lens/rules/ast-grep-rules/rules/go-defer-func-call-antipattern.yml +34 -0
  958. package/extensions/dm-lens/rules/ast-grep-rules/rules/go-no-fmt-println.yml +43 -0
  959. package/extensions/dm-lens/rules/ast-grep-rules/rules/go-no-panic-in-lib.yml +41 -0
  960. package/extensions/dm-lens/rules/ast-grep-rules/rules/go-no-underscore-func-name.yml +35 -0
  961. package/extensions/dm-lens/rules/ast-grep-rules/rules/go-prefer-errors-is.yml +40 -0
  962. package/extensions/dm-lens/rules/ast-grep-rules/rules/go-prefer-string-builder.yml +43 -0
  963. package/extensions/dm-lens/rules/ast-grep-rules/rules/go-test-functions.yml +32 -0
  964. package/extensions/dm-lens/rules/ast-grep-rules/rules/gorm-find-without-where.yml +26 -0
  965. package/extensions/dm-lens/rules/ast-grep-rules/rules/gorm-n-plus-one.yml +16 -0
  966. package/extensions/dm-lens/rules/ast-grep-rules/rules/hardcoded-url-js.yml +35 -0
  967. package/extensions/dm-lens/rules/ast-grep-rules/rules/hardcoded-url.yml +35 -0
  968. package/extensions/dm-lens/rules/ast-grep-rules/rules/hyphenated-svg-attribute.yml +32 -0
  969. package/extensions/dm-lens/rules/ast-grep-rules/rules/incomplete-string-escaping-js.yml +19 -0
  970. package/extensions/dm-lens/rules/ast-grep-rules/rules/incomplete-string-escaping.yml +19 -0
  971. package/extensions/dm-lens/rules/ast-grep-rules/rules/jsx-boolean-short-circuit.yml +40 -0
  972. package/extensions/dm-lens/rules/ast-grep-rules/rules/jwt-no-verify-js.yml +27 -0
  973. package/extensions/dm-lens/rules/ast-grep-rules/rules/jwt-no-verify.yml +27 -0
  974. package/extensions/dm-lens/rules/ast-grep-rules/rules/kotlin-no-lateinit.yml +37 -0
  975. package/extensions/dm-lens/rules/ast-grep-rules/rules/kotlin-no-nullable-boolean.yml +33 -0
  976. package/extensions/dm-lens/rules/ast-grep-rules/rules/kotlin-no-println.yml +42 -0
  977. package/extensions/dm-lens/rules/ast-grep-rules/rules/kotlin-no-unnecessary-let.yml +28 -0
  978. package/extensions/dm-lens/rules/ast-grep-rules/rules/kotlin-no-unsafe-cast.yml +28 -0
  979. package/extensions/dm-lens/rules/ast-grep-rules/rules/kotlin-no-var.yml +35 -0
  980. package/extensions/dm-lens/rules/ast-grep-rules/rules/kotlin-prefer-data-class.yml +66 -0
  981. package/extensions/dm-lens/rules/ast-grep-rules/rules/kotlin-prefer-is-empty.yml +35 -0
  982. package/extensions/dm-lens/rules/ast-grep-rules/rules/large-class.yml +14 -0
  983. package/extensions/dm-lens/rules/ast-grep-rules/rules/long-parameter-list.yml +17 -0
  984. package/extensions/dm-lens/rules/ast-grep-rules/rules/loop-var-capture.yml +42 -0
  985. package/extensions/dm-lens/rules/ast-grep-rules/rules/missing-component-decorator.yml +21 -0
  986. package/extensions/dm-lens/rules/ast-grep-rules/rules/mutex-unlock-mismatch.yml +14 -0
  987. package/extensions/dm-lens/rules/ast-grep-rules/rules/nested-ternary-js.yml +12 -0
  988. package/extensions/dm-lens/rules/ast-grep-rules/rules/nested-ternary.yml +12 -0
  989. package/extensions/dm-lens/rules/ast-grep-rules/rules/nil-map-assignment.yml +43 -0
  990. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-absolute-path-import-js.yml +11 -0
  991. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-absolute-path-import.yml +11 -0
  992. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-accumulating-spread-js.yml +11 -0
  993. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-alert-js.yml +6 -0
  994. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-alert.yml +6 -0
  995. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-any-type.yml +20 -0
  996. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-array-constructor-js.yml +10 -0
  997. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-array-constructor.yml +10 -0
  998. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-array-reverse-mutation-js.yml +8 -0
  999. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-array-reverse-mutation.yml +8 -0
  1000. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-as-any.yml +8 -0
  1001. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-assert-tuple.yml +24 -0
  1002. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-async-promise-executor-js.yml +15 -0
  1003. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-async-promise-executor.yml +15 -0
  1004. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-await-expression-member-js.yml +22 -0
  1005. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-await-expression-member.yml +22 -0
  1006. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-await-in-promise-all-js.yml +20 -0
  1007. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-await-in-promise-all.yml +20 -0
  1008. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-await-in-promise-methods-js.yml +12 -0
  1009. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-await-in-promise-methods.yml +12 -0
  1010. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-aws-access-key-literal.yml +30 -0
  1011. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-aws-apigateway-no-auth.yml +29 -0
  1012. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-aws-s3-public-access.yml +28 -0
  1013. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-bare-except.yml +19 -0
  1014. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-bare-host-path-in-win32-branch.yml +27 -0
  1015. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-bare-object-param.yml +60 -0
  1016. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-blank-target-js.yml +25 -0
  1017. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-boolean-in-except.yml +23 -0
  1018. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-case-declarations-js.yml +22 -0
  1019. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-case-declarations.yml +22 -0
  1020. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-chained-type-assertions.yml +66 -0
  1021. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-compare-neg-zero-js.yml +13 -0
  1022. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-compare-neg-zero.yml +13 -0
  1023. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-comparison-to-none.yml +17 -0
  1024. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-comparison-to-true-false.yml +25 -0
  1025. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-compile-call.yml +87 -0
  1026. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-cond-assign-js.yml +36 -0
  1027. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-cond-assign.yml +36 -0
  1028. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-conditional-empty-object-spread-js.yml +21 -0
  1029. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-conditional-empty-object-spread.yml +29 -0
  1030. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-console-except-error-js.yml +30 -0
  1031. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-console-except-error.yml +30 -0
  1032. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-constant-condition-js.yml +18 -0
  1033. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-constant-condition.yml +18 -0
  1034. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-db-string-literal-password.yml +44 -0
  1035. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-demeter-message-chain.yml +25 -0
  1036. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-discarded-error-js.yml +23 -0
  1037. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-discarded-error.yml +23 -0
  1038. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-dunder-exit-wrong-arity.yml +25 -0
  1039. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-dupe-class-members.yml +120 -0
  1040. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-dupe-keys-js.yml +73 -0
  1041. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-dupe-keys.yml +73 -0
  1042. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-duplicate-kwarg.yml +26 -0
  1043. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-ellipsis-body.yml +26 -0
  1044. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-except-non-exception.yml +47 -0
  1045. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-extra-boolean-cast-js.yml +30 -0
  1046. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-extra-boolean-cast.yml +30 -0
  1047. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-fastapi-router-prefix-outside-init.yml +29 -0
  1048. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-flag-argument-js.yml +37 -0
  1049. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-flag-argument.yml +36 -0
  1050. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-flask-preprocess-request-ignored.yml +26 -0
  1051. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-flask-secret-key-literal.yml +36 -0
  1052. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-flask-sendfile-without-mimetype.yml +42 -0
  1053. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-global-eval-js.yml +19 -0
  1054. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-hardcoded-password.yml +42 -0
  1055. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-html-autoescape-off.yml +25 -0
  1056. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-http-headers-bracket-access.yml +22 -0
  1057. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-identity-operator-on-literals.yml +69 -0
  1058. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-implied-eval-js.yml +16 -0
  1059. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-implied-eval.yml +16 -0
  1060. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-important.yml +21 -0
  1061. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-init-return.yml +33 -0
  1062. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-inline-styles.yml +25 -0
  1063. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-inner-html-js.yml +38 -0
  1064. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-inner-html.yml +38 -0
  1065. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-insecure-randomness-js.yml +20 -0
  1066. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-insecure-randomness.yml +20 -0
  1067. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-instanceof-array-js.yml +9 -0
  1068. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-instanceof-array.yml +9 -0
  1069. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-instanceof-builtins-js.yml +14 -0
  1070. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-instanceof-builtins.yml +14 -0
  1071. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-javascript-url-js.yml +63 -0
  1072. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-javascript-url.yml +63 -0
  1073. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-jinja2-autoescape-off.yml +24 -0
  1074. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-known-value-widening.yml +71 -0
  1075. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-marshal-load.yml +24 -0
  1076. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-mutable-contextvar-default.yml +38 -0
  1077. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-mutable-default.yml +17 -0
  1078. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-mutable-export.yml +13 -0
  1079. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-nan-comparison-js.yml +22 -0
  1080. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-nan-comparison.yml +22 -0
  1081. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-negation-in-equality-check-js.yml +12 -0
  1082. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-negation-in-equality-check.yml +12 -0
  1083. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-nested-links.yml +35 -0
  1084. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-new-symbol-js.yml +8 -0
  1085. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-new-symbol.yml +8 -0
  1086. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-new-wrappers-js.yml +13 -0
  1087. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-new-wrappers.yml +13 -0
  1088. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-non-null-assertion.yml +330 -0
  1089. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-notimplemented-in-bool.yml +21 -0
  1090. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-numpy-nan-equality.yml +31 -0
  1091. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-octal-literal.yml +14 -0
  1092. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-only-defined-names-in-dunder-all.yml +36 -0
  1093. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-open-redirect-js.yml +15 -0
  1094. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-open-redirect.yml +15 -0
  1095. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-prototype-builtins-js.yml +15 -0
  1096. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-prototype-builtins-native.yml +17 -0
  1097. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-prototype-builtins.yml +15 -0
  1098. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-python-sql-string-concat.yml +37 -0
  1099. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-raise-not-implemented.yml +16 -0
  1100. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-raise-stopiteration-in-generator.yml +28 -0
  1101. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-raw-json-store-write.yml +37 -0
  1102. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-raw-types.yml +33 -0
  1103. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-reflect-apply-js.yml +29 -0
  1104. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-reflect-apply.yml +30 -0
  1105. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-reflect-get-js.yml +41 -0
  1106. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-reflect-get.yml +42 -0
  1107. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-relative-imports.yml +20 -0
  1108. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-requests-verify-false.yml +27 -0
  1109. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-requests-without-timeout.yml +113 -0
  1110. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-return-await.yml +15 -0
  1111. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-return-value-in-generator.yml +48 -0
  1112. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-runtime-typeof.yml +121 -0
  1113. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-secret-in-env-var-name.yml +37 -0
  1114. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-server-bind-wildcard.yml +44 -0
  1115. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-shape-in-symbol-names.yml +68 -0
  1116. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-single-promise-in-promise-methods-js.yml +12 -0
  1117. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-single-promise-in-promise-methods.yml +12 -0
  1118. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-singledispatch-on-method.yml +27 -0
  1119. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-sort-without-comparator.yml +14 -0
  1120. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-sql-in-code-js.yml +63 -0
  1121. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-sql-in-code.yml +63 -0
  1122. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-star-imports.yml +11 -0
  1123. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-string-concat-in-loop.yml +90 -0
  1124. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-string-ref.yml +22 -0
  1125. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-system-out-println.yml +16 -0
  1126. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-template-string-concat.yml +21 -0
  1127. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-testclient-text-without-content.yml +39 -0
  1128. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-throw-string-js.yml +12 -0
  1129. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-throw-string.yml +12 -0
  1130. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-typeof-undefined-js.yml +21 -0
  1131. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-typeof-undefined.yml +21 -0
  1132. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-unimplemented-stub-js.yml +11 -0
  1133. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-unimplemented-stub.yml +11 -0
  1134. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-unknown-laundering.yml +32 -0
  1135. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-unknown-parameters.yml +67 -0
  1136. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-unknown-returns.yml +106 -0
  1137. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-unnecessary-array-flat-depth-js.yml +8 -0
  1138. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-unnecessary-array-flat-depth.yml +8 -0
  1139. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-unnecessary-state-initializer.yml +17 -0
  1140. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-unsafe-dictionary-any.yml +50 -0
  1141. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-unsafe-dictionary-unknown.yml +56 -0
  1142. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-useless-length-check-js.yml +11 -0
  1143. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-useless-length-check.yml +11 -0
  1144. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-useless-promise-resolve-reject-js.yml +10 -0
  1145. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-useless-promise-resolve-reject.yml +10 -0
  1146. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-useless-rest-spread-js.yml +10 -0
  1147. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-useless-rest-spread.yml +10 -0
  1148. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-uvicorn-non-import-string.yml +46 -0
  1149. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-win32-isabsolute-for-qualification.yml +25 -0
  1150. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-xxe-vulnerable-xml-parser.yml +32 -0
  1151. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-yield-from-non-iterable.yml +33 -0
  1152. package/extensions/dm-lens/rules/ast-grep-rules/rules/no-yield-return-outside-function.yml +31 -0
  1153. package/extensions/dm-lens/rules/ast-grep-rules/rules/only-strings-in-dunder-all.yml +32 -0
  1154. package/extensions/dm-lens/rules/ast-grep-rules/rules/prefer-array-find-js.yml +10 -0
  1155. package/extensions/dm-lens/rules/ast-grep-rules/rules/prefer-array-find.yml +10 -0
  1156. package/extensions/dm-lens/rules/ast-grep-rules/rules/prefer-array-flat-map-js.yml +8 -0
  1157. package/extensions/dm-lens/rules/ast-grep-rules/rules/prefer-array-flat-map.yml +8 -0
  1158. package/extensions/dm-lens/rules/ast-grep-rules/rules/prefer-array-some-js.yml +11 -0
  1159. package/extensions/dm-lens/rules/ast-grep-rules/rules/prefer-array-some.yml +11 -0
  1160. package/extensions/dm-lens/rules/ast-grep-rules/rules/prefer-at-js.yml +10 -0
  1161. package/extensions/dm-lens/rules/ast-grep-rules/rules/prefer-at.yml +10 -0
  1162. package/extensions/dm-lens/rules/ast-grep-rules/rules/prefer-date-now-js.yml +10 -0
  1163. package/extensions/dm-lens/rules/ast-grep-rules/rules/prefer-date-now.yml +10 -0
  1164. package/extensions/dm-lens/rules/ast-grep-rules/rules/prefer-dom-node-append-js.yml +8 -0
  1165. package/extensions/dm-lens/rules/ast-grep-rules/rules/prefer-dom-node-append.yml +8 -0
  1166. package/extensions/dm-lens/rules/ast-grep-rules/rules/prefer-dom-node-text-content-js.yml +8 -0
  1167. package/extensions/dm-lens/rules/ast-grep-rules/rules/prefer-dom-node-text-content.yml +8 -0
  1168. package/extensions/dm-lens/rules/ast-grep-rules/rules/prefer-keyboard-event-key-js.yml +10 -0
  1169. package/extensions/dm-lens/rules/ast-grep-rules/rules/prefer-keyboard-event-key.yml +10 -0
  1170. package/extensions/dm-lens/rules/ast-grep-rules/rules/prefer-math-min-max-js.yml +12 -0
  1171. package/extensions/dm-lens/rules/ast-grep-rules/rules/prefer-math-min-max.yml +12 -0
  1172. package/extensions/dm-lens/rules/ast-grep-rules/rules/prefer-number-properties-js.yml +10 -0
  1173. package/extensions/dm-lens/rules/ast-grep-rules/rules/prefer-number-properties.yml +10 -0
  1174. package/extensions/dm-lens/rules/ast-grep-rules/rules/prefer-optional-chain.yml +14 -0
  1175. package/extensions/dm-lens/rules/ast-grep-rules/rules/prefer-prototype-methods-js.yml +8 -0
  1176. package/extensions/dm-lens/rules/ast-grep-rules/rules/prefer-prototype-methods.yml +8 -0
  1177. package/extensions/dm-lens/rules/ast-grep-rules/rules/prefer-query-selector-js.yml +11 -0
  1178. package/extensions/dm-lens/rules/ast-grep-rules/rules/prefer-query-selector.yml +11 -0
  1179. package/extensions/dm-lens/rules/ast-grep-rules/rules/prefer-string-is-empty.yml +11 -0
  1180. package/extensions/dm-lens/rules/ast-grep-rules/rules/prefer-string-slice-js.yml +10 -0
  1181. package/extensions/dm-lens/rules/ast-grep-rules/rules/prefer-string-slice.yml +10 -0
  1182. package/extensions/dm-lens/rules/ast-grep-rules/rules/prefer-string-starts-ends-with-js.yml +10 -0
  1183. package/extensions/dm-lens/rules/ast-grep-rules/rules/prefer-string-starts-ends-with.yml +10 -0
  1184. package/extensions/dm-lens/rules/ast-grep-rules/rules/prefer-string-trim-start-end-js.yml +10 -0
  1185. package/extensions/dm-lens/rules/ast-grep-rules/rules/prefer-string-trim-start-end.yml +10 -0
  1186. package/extensions/dm-lens/rules/ast-grep-rules/rules/prefer-structured-clone-js.yml +9 -0
  1187. package/extensions/dm-lens/rules/ast-grep-rules/rules/prefer-structured-clone.yml +9 -0
  1188. package/extensions/dm-lens/rules/ast-grep-rules/rules/python-optional-type.yml +22 -0
  1189. package/extensions/dm-lens/rules/ast-grep-rules/rules/redos-nested-quantifier.yml +23 -0
  1190. package/extensions/dm-lens/rules/ast-grep-rules/rules/reducible-list-comprehension.yml +29 -0
  1191. package/extensions/dm-lens/rules/ast-grep-rules/rules/redundant-state.yml +16 -0
  1192. package/extensions/dm-lens/rules/ast-grep-rules/rules/redundant-unsafe-function.yml +53 -0
  1193. package/extensions/dm-lens/rules/ast-grep-rules/rules/redundant-usestate-type.yml +15 -0
  1194. package/extensions/dm-lens/rules/ast-grep-rules/rules/require-await.yml +14 -0
  1195. package/extensions/dm-lens/rules/ast-grep-rules/rules/require-safety-comment-for-as-unknown-as.yml +184 -0
  1196. package/extensions/dm-lens/rules/ast-grep-rules/rules/ruby-detect-path-traversal.yml +33 -0
  1197. package/extensions/dm-lens/rules/ast-grep-rules/rules/ruby-symbol-to-proc-candidate.yml +25 -0
  1198. package/extensions/dm-lens/rules/ast-grep-rules/rules/rust-2024-let-chain-candidate.yml +56 -0
  1199. package/extensions/dm-lens/rules/ast-grep-rules/rules/rust-no-chars-enumerate.yml +19 -0
  1200. package/extensions/dm-lens/rules/ast-grep-rules/rules/strict-equality-js.yml +23 -0
  1201. package/extensions/dm-lens/rules/ast-grep-rules/rules/strict-equality.yml +23 -0
  1202. package/extensions/dm-lens/rules/ast-grep-rules/rules/strict-inequality-js.yml +23 -0
  1203. package/extensions/dm-lens/rules/ast-grep-rules/rules/strict-inequality.yml +23 -0
  1204. package/extensions/dm-lens/rules/ast-grep-rules/rules/string-concat-in-loop.yml +31 -0
  1205. package/extensions/dm-lens/rules/ast-grep-rules/rules/switch-without-default.yml +19 -0
  1206. package/extensions/dm-lens/rules/ast-grep-rules/rules/throw-new-error-js.yml +14 -0
  1207. package/extensions/dm-lens/rules/ast-grep-rules/rules/throw-new-error.yml +14 -0
  1208. package/extensions/dm-lens/rules/ast-grep-rules/rules/ts-array-concat-spread.yml +10 -0
  1209. package/extensions/dm-lens/rules/ast-grep-rules/rules/ts-array-every-some.yml +22 -0
  1210. package/extensions/dm-lens/rules/ast-grep-rules/rules/ts-boolean-return-if-else.yml +12 -0
  1211. package/extensions/dm-lens/rules/ast-grep-rules/rules/ts-defensive-null-guard.yml +12 -0
  1212. package/extensions/dm-lens/rules/ast-grep-rules/rules/ts-delete-property.yml +10 -0
  1213. package/extensions/dm-lens/rules/ast-grep-rules/rules/ts-double-negation.yml +10 -0
  1214. package/extensions/dm-lens/rules/ast-grep-rules/rules/ts-function-constructor.yml +12 -0
  1215. package/extensions/dm-lens/rules/ast-grep-rules/rules/ts-in-operator-loop.yml +22 -0
  1216. package/extensions/dm-lens/rules/ast-grep-rules/rules/ts-isnan-check.yml +10 -0
  1217. package/extensions/dm-lens/rules/ast-grep-rules/rules/ts-json-stringify-parse.yml +17 -0
  1218. package/extensions/dm-lens/rules/ast-grep-rules/rules/ts-manual-array-contains.yml +25 -0
  1219. package/extensions/dm-lens/rules/ast-grep-rules/rules/ts-nullish-coalescing-opportunity.yml +20 -0
  1220. package/extensions/dm-lens/rules/ast-grep-rules/rules/ts-object-hasown-check.yml +9 -0
  1221. package/extensions/dm-lens/rules/ast-grep-rules/rules/ts-optional-chaining-default.yml +21 -0
  1222. package/extensions/dm-lens/rules/ast-grep-rules/rules/ts-parseint-no-radix.yml +18 -0
  1223. package/extensions/dm-lens/rules/ast-grep-rules/rules/ts-pointless-bool-cast.yml +10 -0
  1224. package/extensions/dm-lens/rules/ast-grep-rules/rules/ts-redundant-filter-map.yml +10 -0
  1225. package/extensions/dm-lens/rules/ast-grep-rules/rules/ts-slice-copy.yml +11 -0
  1226. package/extensions/dm-lens/rules/ast-grep-rules/rules/ts-string-split-index.yml +12 -0
  1227. package/extensions/dm-lens/rules/ast-grep-rules/rules/ts-unnecessary-array-concat.yml +9 -0
  1228. package/extensions/dm-lens/rules/ast-grep-rules/rules/ts-unnecessary-array-from.yml +9 -0
  1229. package/extensions/dm-lens/rules/ast-grep-rules/rules/ts-unnecessary-bind.yml +10 -0
  1230. package/extensions/dm-lens/rules/ast-grep-rules/rules/ts-unnecessary-else-return.yml +19 -0
  1231. package/extensions/dm-lens/rules/ast-grep-rules/rules/ts-void-zero.yml +15 -0
  1232. package/extensions/dm-lens/rules/ast-grep-rules/rules/ts-while-index-length.yml +10 -0
  1233. package/extensions/dm-lens/rules/ast-grep-rules/rules/unchecked-throwing-call-js.yml +29 -0
  1234. package/extensions/dm-lens/rules/ast-grep-rules/rules/unchecked-throwing-call-python.yml +48 -0
  1235. package/extensions/dm-lens/rules/ast-grep-rules/rules/unchecked-throwing-call.yml +29 -0
  1236. package/extensions/dm-lens/rules/ast-grep-rules/rules/unlock-in-loop.yml +22 -0
  1237. package/extensions/dm-lens/rules/ast-grep-rules/rules/unmarshal-tag-is-dash.yml +20 -0
  1238. package/extensions/dm-lens/rules/ast-grep-rules/rules/unnecessary-react-hook.yml +27 -0
  1239. package/extensions/dm-lens/rules/ast-grep-rules/rules/waitgroup-done-scope.yml +11 -0
  1240. package/extensions/dm-lens/rules/ast-grep-rules/rules/weak-rsa-key-js.yml +28 -0
  1241. package/extensions/dm-lens/rules/ast-grep-rules/rules/weak-rsa-key.yml +28 -0
  1242. package/extensions/dm-lens/rules/ast-grep-rules/rules-disabled/constructor-super-js.yml +24 -0
  1243. package/extensions/dm-lens/rules/ast-grep-rules/rules-disabled/constructor-super.yml +25 -0
  1244. package/extensions/dm-lens/rules/ast-grep-rules/rules-disabled/gorm-unbounded-preload.yml +41 -0
  1245. package/extensions/dm-lens/rules/ast-grep-rules/rules-disabled/no-architecture-violation.yml +21 -0
  1246. package/extensions/dm-lens/rules/ast-grep-rules/rules-disabled/no-hardcoded-secrets-js.yml +20 -0
  1247. package/extensions/dm-lens/rules/ast-grep-rules/rules-disabled/no-hardcoded-secrets.yml +21 -0
  1248. package/extensions/dm-lens/rules/ast-grep-rules/rules-disabled/no-method-field-name-collision.yml +42 -0
  1249. package/extensions/dm-lens/rules/ast-grep-rules/rules-disabled/no-param-reassign.yml +16 -0
  1250. package/extensions/dm-lens/rules/ast-grep-rules/rules-disabled/no-process-env.yml +21 -0
  1251. package/extensions/dm-lens/rules/ast-grep-rules/rules-disabled/no-shadow.yml +20 -0
  1252. package/extensions/dm-lens/rules/ast-grep-rules/rules-disabled/no-this-in-static-js.yml +14 -0
  1253. package/extensions/dm-lens/rules/ast-grep-rules/rules-disabled/no-this-in-static.yml +14 -0
  1254. package/extensions/dm-lens/rules/ast-grep-rules/rules-disabled/prefer-string-raw-js.yml +9 -0
  1255. package/extensions/dm-lens/rules/ast-grep-rules/rules-disabled/prefer-string-raw.yml +9 -0
  1256. package/extensions/dm-lens/rules/ast-grep-rules/rules-disabled/shadow-err-variable.yml +38 -0
  1257. package/extensions/dm-lens/rules/ast-grep-rules/rules-disabled/unchecked-sync-fs-js.yml +47 -0
  1258. package/extensions/dm-lens/rules/ast-grep-rules/rules-disabled/unchecked-sync-fs.yml +52 -0
  1259. package/extensions/dm-lens/rules/ast-grep-rules/self-scan-baseline.json +5 -0
  1260. package/extensions/dm-lens/rules/rule-catalog.json +1725 -0
  1261. package/extensions/dm-lens/rules/tree-sitter-queries/c/goto-into-block.yml +72 -0
  1262. package/extensions/dm-lens/rules/tree-sitter-queries/c/goto-label-order.yml +65 -0
  1263. package/extensions/dm-lens/rules/tree-sitter-queries/c/hardcoded-secrets.yml +55 -0
  1264. package/extensions/dm-lens/rules/tree-sitter-queries/c/memset-sensitive-data.yml +50 -0
  1265. package/extensions/dm-lens/rules/tree-sitter-queries/c/no-bit-fields.yml +48 -0
  1266. package/extensions/dm-lens/rules/tree-sitter-queries/c/no-octal-literals.yml +46 -0
  1267. package/extensions/dm-lens/rules/tree-sitter-queries/c/no-pointer-arithmetic-array-access.yml +50 -0
  1268. package/extensions/dm-lens/rules/tree-sitter-queries/c/no-redundant-pointer-ops.yml +57 -0
  1269. package/extensions/dm-lens/rules/tree-sitter-queries/c/no-reserved-identifiers.yml +49 -0
  1270. package/extensions/dm-lens/rules/tree-sitter-queries/c/no-stdlib-name-as-id.yml +53 -0
  1271. package/extensions/dm-lens/rules/tree-sitter-queries/c/non-case-label-in-switch.yml +56 -0
  1272. package/extensions/dm-lens/rules/tree-sitter-queries/c/noreturn-returns.yml +60 -0
  1273. package/extensions/dm-lens/rules/tree-sitter-queries/c-disabled/case-range-multiple-values.yml +65 -0
  1274. package/extensions/dm-lens/rules/tree-sitter-queries/cobol-disabled/alter-statement.yml +39 -0
  1275. package/extensions/dm-lens/rules/tree-sitter-queries/cobol-disabled/lock-table-cobol.yml +35 -0
  1276. package/extensions/dm-lens/rules/tree-sitter-queries/cpp/no-auto-ptr.yml +49 -0
  1277. package/extensions/dm-lens/rules/tree-sitter-queries/cpp/no-memset-sensitive-data.yml +63 -0
  1278. package/extensions/dm-lens/rules/tree-sitter-queries/cpp/no-scoped-lock-without-args.yml +52 -0
  1279. package/extensions/dm-lens/rules/tree-sitter-queries/cpp/unnecessary-bit-ops.yml +58 -0
  1280. package/extensions/dm-lens/rules/tree-sitter-queries/csharp/async-await-identifiers.yml +50 -0
  1281. package/extensions/dm-lens/rules/tree-sitter-queries/csharp/is-with-this.yml +52 -0
  1282. package/extensions/dm-lens/rules/tree-sitter-queries/csharp/no-dangerous-get-handle.yml +59 -0
  1283. package/extensions/dm-lens/rules/tree-sitter-queries/csharp/no-operator-eq-reference.yml +60 -0
  1284. package/extensions/dm-lens/rules/tree-sitter-queries/csharp/no-thread-resume-suspend.yml +60 -0
  1285. package/extensions/dm-lens/rules/tree-sitter-queries/css/calc-spacing.yml +52 -0
  1286. package/extensions/dm-lens/rules/tree-sitter-queries/go/go-bare-error.yml +61 -0
  1287. package/extensions/dm-lens/rules/tree-sitter-queries/go/go-command-injection.yml +55 -0
  1288. package/extensions/dm-lens/rules/tree-sitter-queries/go/go-context-background-handler.yml +57 -0
  1289. package/extensions/dm-lens/rules/tree-sitter-queries/go/go-defer-in-loop.yml +49 -0
  1290. package/extensions/dm-lens/rules/tree-sitter-queries/go/go-direct-panic.yml +45 -0
  1291. package/extensions/dm-lens/rules/tree-sitter-queries/go/go-empty-if-err.yml +47 -0
  1292. package/extensions/dm-lens/rules/tree-sitter-queries/go/go-goroutine-loop-capture.yml +49 -0
  1293. package/extensions/dm-lens/rules/tree-sitter-queries/go/go-hardcoded-secrets.yml +56 -0
  1294. package/extensions/dm-lens/rules/tree-sitter-queries/go/go-ignored-call-result.yml +52 -0
  1295. package/extensions/dm-lens/rules/tree-sitter-queries/go/go-insecure-random.yml +51 -0
  1296. package/extensions/dm-lens/rules/tree-sitter-queries/go/go-log-fatal.yml +49 -0
  1297. package/extensions/dm-lens/rules/tree-sitter-queries/go/go-mutex-copy.yml +60 -0
  1298. package/extensions/dm-lens/rules/tree-sitter-queries/go/go-path-traversal.yml +51 -0
  1299. package/extensions/dm-lens/rules/tree-sitter-queries/go/go-shared-map-write-goroutine.yml +54 -0
  1300. package/extensions/dm-lens/rules/tree-sitter-queries/go/go-sql-injection.yml +55 -0
  1301. package/extensions/dm-lens/rules/tree-sitter-queries/go/go-time-sleep-test.yml +50 -0
  1302. package/extensions/dm-lens/rules/tree-sitter-queries/go/go-weak-hash.yml +51 -0
  1303. package/extensions/dm-lens/rules/tree-sitter-queries/java/infinite-loop-java.yml +58 -0
  1304. package/extensions/dm-lens/rules/tree-sitter-queries/java/infinite-recursion.yml +58 -0
  1305. package/extensions/dm-lens/rules/tree-sitter-queries/java/junit-call-super.yml +65 -0
  1306. package/extensions/dm-lens/rules/tree-sitter-queries/java/main-should-not-throw.yml +63 -0
  1307. package/extensions/dm-lens/rules/tree-sitter-queries/java/name-capitalization-conflict.yml +54 -0
  1308. package/extensions/dm-lens/rules/tree-sitter-queries/java/no-clone-override.yml +60 -0
  1309. package/extensions/dm-lens/rules/tree-sitter-queries/java/no-double-checked-locking.yml +76 -0
  1310. package/extensions/dm-lens/rules/tree-sitter-queries/java/no-exit-methods.yml +50 -0
  1311. package/extensions/dm-lens/rules/tree-sitter-queries/java/no-field-shadowing.yml +66 -0
  1312. package/extensions/dm-lens/rules/tree-sitter-queries/java/no-future-keywords.yml +49 -0
  1313. package/extensions/dm-lens/rules/tree-sitter-queries/java/no-octal-values.yml +48 -0
  1314. package/extensions/dm-lens/rules/tree-sitter-queries/java/no-threadgroup.yml +52 -0
  1315. package/extensions/dm-lens/rules/tree-sitter-queries/java/no-threads-in-constructors.yml +73 -0
  1316. package/extensions/dm-lens/rules/tree-sitter-queries/java/prepared-statement-valid-indices.yml +54 -0
  1317. package/extensions/dm-lens/rules/tree-sitter-queries/java/resources-closed.yml +57 -0
  1318. package/extensions/dm-lens/rules/tree-sitter-queries/java/springboot-default-package.yml +72 -0
  1319. package/extensions/dm-lens/rules/tree-sitter-queries/java/switch-fall-through.yml +72 -0
  1320. package/extensions/dm-lens/rules/tree-sitter-queries/java/switch-non-case-labels.yml +63 -0
  1321. package/extensions/dm-lens/rules/tree-sitter-queries/java/tests-include-assertions.yml +61 -0
  1322. package/extensions/dm-lens/rules/tree-sitter-queries/java/unnecessary-bit-ops-java.yml +57 -0
  1323. package/extensions/dm-lens/rules/tree-sitter-queries/javascript/switch-case-termination-js.yml +61 -0
  1324. package/extensions/dm-lens/rules/tree-sitter-queries/javascript/switch-non-case-labels.yml +53 -0
  1325. package/extensions/dm-lens/rules/tree-sitter-queries/kotlin/prepared-statement-indices.yml +53 -0
  1326. package/extensions/dm-lens/rules/tree-sitter-queries/php/no-exit-die.yml +52 -0
  1327. package/extensions/dm-lens/rules/tree-sitter-queries/php/this-in-static-context.yml +75 -0
  1328. package/extensions/dm-lens/rules/tree-sitter-queries/plsql-disabled/lock-table.yml +42 -0
  1329. package/extensions/dm-lens/rules/tree-sitter-queries/plsql-disabled/no-synchronize.yml +47 -0
  1330. package/extensions/dm-lens/rules/tree-sitter-queries/python/aws-public-access-policy.yml +68 -0
  1331. package/extensions/dm-lens/rules/tree-sitter-queries/python/bare-except.yml +56 -0
  1332. package/extensions/dm-lens/rules/tree-sitter-queries/python/endpoint-204-with-body.yml +62 -0
  1333. package/extensions/dm-lens/rules/tree-sitter-queries/python/eval-exec.yml +52 -0
  1334. package/extensions/dm-lens/rules/tree-sitter-queries/python/exit-signature-check.yml +59 -0
  1335. package/extensions/dm-lens/rules/tree-sitter-queries/python/in-operator-unsupported.yml +56 -0
  1336. package/extensions/dm-lens/rules/tree-sitter-queries/python/is-vs-equals.yml +62 -0
  1337. package/extensions/dm-lens/rules/tree-sitter-queries/python/iter-return-iterator.yml +59 -0
  1338. package/extensions/dm-lens/rules/tree-sitter-queries/python/mutable-default-arg.yml +59 -0
  1339. package/extensions/dm-lens/rules/tree-sitter-queries/python/no-super-torchscript.yml +48 -0
  1340. package/extensions/dm-lens/rules/tree-sitter-queries/python/notimplemented-boolean-context.yml +63 -0
  1341. package/extensions/dm-lens/rules/tree-sitter-queries/python/open-invalid-mode.yml +58 -0
  1342. package/extensions/dm-lens/rules/tree-sitter-queries/python/python-assert-production.yml +53 -0
  1343. package/extensions/dm-lens/rules/tree-sitter-queries/python/python-command-injection.yml +63 -0
  1344. package/extensions/dm-lens/rules/tree-sitter-queries/python/python-cross-language-method.yml +61 -0
  1345. package/extensions/dm-lens/rules/tree-sitter-queries/python/python-debugger.yml +48 -0
  1346. package/extensions/dm-lens/rules/tree-sitter-queries/python/python-empty-except.yml +50 -0
  1347. package/extensions/dm-lens/rules/tree-sitter-queries/python/python-hallucinated-import.yml +58 -0
  1348. package/extensions/dm-lens/rules/tree-sitter-queries/python/python-hardcoded-secrets.yml +46 -0
  1349. package/extensions/dm-lens/rules/tree-sitter-queries/python/python-insecure-deserialization.yml +48 -0
  1350. package/extensions/dm-lens/rules/tree-sitter-queries/python/python-insecure-random.yml +51 -0
  1351. package/extensions/dm-lens/rules/tree-sitter-queries/python/python-mutable-class-attr.yml +59 -0
  1352. package/extensions/dm-lens/rules/tree-sitter-queries/python/python-path-traversal.yml +55 -0
  1353. package/extensions/dm-lens/rules/tree-sitter-queries/python/python-raise-string.yml +40 -0
  1354. package/extensions/dm-lens/rules/tree-sitter-queries/python/python-sleep-in-test.yml +50 -0
  1355. package/extensions/dm-lens/rules/tree-sitter-queries/python/python-special-method-arity.yml +67 -0
  1356. package/extensions/dm-lens/rules/tree-sitter-queries/python/python-sql-injection.yml +57 -0
  1357. package/extensions/dm-lens/rules/tree-sitter-queries/python/python-ssrf.yml +50 -0
  1358. package/extensions/dm-lens/rules/tree-sitter-queries/python/python-subprocess-shell.yml +60 -0
  1359. package/extensions/dm-lens/rules/tree-sitter-queries/python/python-thread-global-write.yml +64 -0
  1360. package/extensions/dm-lens/rules/tree-sitter-queries/python/python-unsafe-regex.yml +61 -0
  1361. package/extensions/dm-lens/rules/tree-sitter-queries/python/python-weak-hash.yml +51 -0
  1362. package/extensions/dm-lens/rules/tree-sitter-queries/python/return-in-generator.yml +58 -0
  1363. package/extensions/dm-lens/rules/tree-sitter-queries/python/return-in-init.yml +57 -0
  1364. package/extensions/dm-lens/rules/tree-sitter-queries/python/send-file-mimetype.yml +53 -0
  1365. package/extensions/dm-lens/rules/tree-sitter-queries/python/slots-assignment-mismatch.yml +73 -0
  1366. package/extensions/dm-lens/rules/tree-sitter-queries/python/string-format-arity-mismatch.yml +52 -0
  1367. package/extensions/dm-lens/rules/tree-sitter-queries/python/unreachable-except.yml +62 -0
  1368. package/extensions/dm-lens/rules/tree-sitter-queries/python/wildcard-import.yml +48 -0
  1369. package/extensions/dm-lens/rules/tree-sitter-queries/python/yield-return-outside-function.yml +54 -0
  1370. package/extensions/dm-lens/rules/tree-sitter-queries/python-disabled/python-print-statement.yml +69 -0
  1371. package/extensions/dm-lens/rules/tree-sitter-queries/ruby/ruby-command-injection.yml +45 -0
  1372. package/extensions/dm-lens/rules/tree-sitter-queries/ruby/ruby-debugger.yml +46 -0
  1373. package/extensions/dm-lens/rules/tree-sitter-queries/ruby/ruby-dynamic-send.yml +54 -0
  1374. package/extensions/dm-lens/rules/tree-sitter-queries/ruby/ruby-empty-rescue.yml +49 -0
  1375. package/extensions/dm-lens/rules/tree-sitter-queries/ruby/ruby-eval.yml +45 -0
  1376. package/extensions/dm-lens/rules/tree-sitter-queries/ruby/ruby-hardcoded-secrets.yml +42 -0
  1377. package/extensions/dm-lens/rules/tree-sitter-queries/ruby/ruby-insecure-deserialization.yml +47 -0
  1378. package/extensions/dm-lens/rules/tree-sitter-queries/ruby/ruby-insecure-random.yml +47 -0
  1379. package/extensions/dm-lens/rules/tree-sitter-queries/ruby/ruby-open-struct.yml +50 -0
  1380. package/extensions/dm-lens/rules/tree-sitter-queries/ruby/ruby-puts-statement.yml +54 -0
  1381. package/extensions/dm-lens/rules/tree-sitter-queries/ruby/ruby-rescue-exception.yml +53 -0
  1382. package/extensions/dm-lens/rules/tree-sitter-queries/ruby/ruby-sleep-in-test.yml +48 -0
  1383. package/extensions/dm-lens/rules/tree-sitter-queries/ruby/ruby-string-eval.yml +56 -0
  1384. package/extensions/dm-lens/rules/tree-sitter-queries/ruby/ruby-unsafe-regex.yml +51 -0
  1385. package/extensions/dm-lens/rules/tree-sitter-queries/ruby/ruby-weak-hash.yml +50 -0
  1386. package/extensions/dm-lens/rules/tree-sitter-queries/rule-schema.json +136 -0
  1387. package/extensions/dm-lens/rules/tree-sitter-queries/rust/rust-clone-in-loop.yml +51 -0
  1388. package/extensions/dm-lens/rules/tree-sitter-queries/rust/rust-expect.yml +47 -0
  1389. package/extensions/dm-lens/rules/tree-sitter-queries/rust/rust-lock-held-across-await.yml +60 -0
  1390. package/extensions/dm-lens/rules/tree-sitter-queries/rust/rust-todo-unimplemented.yml +47 -0
  1391. package/extensions/dm-lens/rules/tree-sitter-queries/rust/rust-unsafe-block.yml +41 -0
  1392. package/extensions/dm-lens/rules/tree-sitter-queries/rust/rust-unwrap.yml +47 -0
  1393. package/extensions/dm-lens/rules/tree-sitter-queries/tsx/dangerously-set-inner-html.yml +65 -0
  1394. package/extensions/dm-lens/rules/tree-sitter-queries/tsx/no-nested-links.yml +45 -0
  1395. package/extensions/dm-lens/rules/tree-sitter-queries/typescript/console-statement.yml +59 -0
  1396. package/extensions/dm-lens/rules/tree-sitter-queries/typescript/debugger.yml +49 -0
  1397. package/extensions/dm-lens/rules/tree-sitter-queries/typescript/deep-nesting.yml +119 -0
  1398. package/extensions/dm-lens/rules/tree-sitter-queries/typescript/deep-promise-chain.yml +75 -0
  1399. package/extensions/dm-lens/rules/tree-sitter-queries/typescript/default-not-last.yml +54 -0
  1400. package/extensions/dm-lens/rules/tree-sitter-queries/typescript/duplicate-function-arg.yml +46 -0
  1401. package/extensions/dm-lens/rules/tree-sitter-queries/typescript/empty-switch-case.yml +58 -0
  1402. package/extensions/dm-lens/rules/tree-sitter-queries/typescript/eval.yml +50 -0
  1403. package/extensions/dm-lens/rules/tree-sitter-queries/typescript/incomplete-assertion.yml +50 -0
  1404. package/extensions/dm-lens/rules/tree-sitter-queries/typescript/infinite-loop.yml +55 -0
  1405. package/extensions/dm-lens/rules/tree-sitter-queries/typescript/injections.scm +40 -0
  1406. package/extensions/dm-lens/rules/tree-sitter-queries/typescript/mixed-async-styles.yml +60 -0
  1407. package/extensions/dm-lens/rules/tree-sitter-queries/typescript/no-console-in-tests.yml +54 -0
  1408. package/extensions/dm-lens/rules/tree-sitter-queries/typescript/no-equality-in-for-condition.yml +41 -0
  1409. package/extensions/dm-lens/rules/tree-sitter-queries/typescript/no-jump-in-finally.yml +48 -0
  1410. package/extensions/dm-lens/rules/tree-sitter-queries/typescript/self-assignment.yml +46 -0
  1411. package/extensions/dm-lens/rules/tree-sitter-queries/typescript/sql-injection.yml +57 -0
  1412. package/extensions/dm-lens/rules/tree-sitter-queries/typescript/switch-case-termination.yml +61 -0
  1413. package/extensions/dm-lens/rules/tree-sitter-queries/typescript/switch-non-case-labels.yml +53 -0
  1414. package/extensions/dm-lens/rules/tree-sitter-queries/typescript/ts-command-injection.yml +62 -0
  1415. package/extensions/dm-lens/rules/tree-sitter-queries/typescript/ts-detached-async-call.yml +56 -0
  1416. package/extensions/dm-lens/rules/tree-sitter-queries/typescript/ts-dynamic-require.yml +55 -0
  1417. package/extensions/dm-lens/rules/tree-sitter-queries/typescript/ts-hallucinated-react-import.yml +61 -0
  1418. package/extensions/dm-lens/rules/tree-sitter-queries/typescript/ts-insecure-random.yml +55 -0
  1419. package/extensions/dm-lens/rules/tree-sitter-queries/typescript/ts-nosql-injection.yml +54 -0
  1420. package/extensions/dm-lens/rules/tree-sitter-queries/typescript/ts-open-redirect.yml +111 -0
  1421. package/extensions/dm-lens/rules/tree-sitter-queries/typescript/ts-react-antipatterns.yml +55 -0
  1422. package/extensions/dm-lens/rules/tree-sitter-queries/typescript/ts-ssrf.yml +54 -0
  1423. package/extensions/dm-lens/rules/tree-sitter-queries/typescript/ts-weak-hash.yml +54 -0
  1424. package/extensions/dm-lens/rules/tree-sitter-queries/typescript/ts-xss-dom-sink.yml +100 -0
  1425. package/extensions/dm-lens/rules/tree-sitter-queries/typescript/unsafe-regex.yml +76 -0
  1426. package/extensions/dm-lens/rules/tree-sitter-queries/typescript/variable-shadowing.yml +53 -0
  1427. package/extensions/dm-lens/rules/tree-sitter-queries/typescript-disabled/await-in-loop.yml +58 -0
  1428. package/extensions/dm-lens/rules/tree-sitter-queries/typescript-disabled/constructor-super.yml +57 -0
  1429. package/extensions/dm-lens/rules/tree-sitter-queries/typescript-disabled/empty-catch.yml +66 -0
  1430. package/extensions/dm-lens/rules/tree-sitter-queries/typescript-disabled/hardcoded-secrets.yml +66 -0
  1431. package/extensions/dm-lens/rules/tree-sitter-queries/typescript-disabled/long-parameter-list.yml +64 -0
  1432. package/extensions/dm-lens/rules/tree-sitter-queries/typescript-disabled/nested-ternary.yml +47 -0
  1433. package/extensions/dm-lens/rules/typos/_typos.toml +17 -0
  1434. package/extensions/dm-lens/scripts/lib/process-scan.mjs +256 -0
  1435. package/extensions/dm-lens/skills/pi-lens-ast-grep/SKILL.md +177 -0
  1436. package/extensions/dm-lens/skills/pi-lens-lsp-navigation/SKILL.md +77 -0
  1437. package/extensions/dm-lens/skills/pi-lens-write-ast-grep-rule/SKILL.md +209 -0
  1438. package/extensions/dm-lens/skills/pi-lens-write-ast-grep-rule/reference.md +170 -0
  1439. package/extensions/dm-lens/skills/pi-lens-write-tree-sitter-rule/SKILL.md +129 -0
  1440. package/extensions/dm-lens/tools/activate-tools.js +58 -0
  1441. package/extensions/dm-lens/tools/ast-dump.js +101 -0
  1442. package/extensions/dm-lens/tools/ast-grep-outline.js +131 -0
  1443. package/extensions/dm-lens/tools/ast-grep-replace.js +255 -0
  1444. package/extensions/dm-lens/tools/ast-grep-search.js +666 -0
  1445. package/extensions/dm-lens/tools/effective-config.js +61 -0
  1446. package/extensions/dm-lens/tools/lens-diagnostic-mark.js +243 -0
  1447. package/extensions/dm-lens/tools/lens-diagnostics.js +1177 -0
  1448. package/extensions/dm-lens/tools/lsp-diagnostics.js +1026 -0
  1449. package/extensions/dm-lens/tools/lsp-navigation.js +1251 -0
  1450. package/extensions/dm-lens/tools/lsp-structured-output.js +277 -0
  1451. package/extensions/dm-lens/tools/module-report.js +337 -0
  1452. package/extensions/dm-lens/tools/project-report.js +84 -0
  1453. package/extensions/dm-lens/tools/render-compact.js +53 -0
  1454. package/extensions/dm-lens/tools/scan-progress.js +31 -0
  1455. package/extensions/dm-lens/tools/shared.js +26 -0
  1456. package/extensions/dm-lens/tools/symbol-search.js +137 -0
  1457. package/extensions/dm-lens/vendor/grammars/tree-sitter-cue.wasm +0 -0
  1458. package/extensions/dm-mcp-adapter/agent-dir.js +10 -10
  1459. package/extensions/dm-mcp-adapter/cli.js +10 -9
  1460. package/extensions/dm-mcp-adapter/config.js +1 -1
  1461. package/extensions/dm-mcp-adapter/dist/agent-dir.js +10 -10
  1462. package/extensions/dm-mcp-adapter/dist/config.js +1 -1
  1463. package/extensions/dm-mcp-adapter/dist/package-mcp-loader.js +5 -3
  1464. package/extensions/dm-mcp-adapter/index.js +1 -0
  1465. package/extensions/dm-mcp-adapter/mcp-oauth-provider.js +2 -2
  1466. package/extensions/dm-mcp-adapter/package-mcp-loader.js +5 -3
  1467. package/package.json +7 -1
@@ -0,0 +1,3275 @@
1
+ import { spawn } from "node:child_process";
2
+ import { existsSync, statSync, unlinkSync } from "node:fs";
3
+ import fs from "node:fs/promises";
4
+ import https from "node:https";
5
+ import { createRequire } from "node:module";
6
+ import os from "node:os";
7
+ import path from "node:path";
8
+ import { writeFileAtomicAsync } from "../atomic-write.js";
9
+ import { BoundedLruCache } from "../bounded-cache.js";
10
+ import { logExtension } from "../extension-log.js";
11
+ import { isFullyQualified } from "../path-utils.js";
12
+ import {
13
+ assertInstallAllowed,
14
+ projectTrustDenialReason
15
+ } from "../project-trust.js";
16
+ const _installerRequire = createRequire(import.meta.url);
17
+ import { createGunzip } from "node:zlib";
18
+ import { TRANSIENT_MAX_COOLDOWN_MS } from "../dispatch/runners/utils/availability-policy.js";
19
+ import { recordDegradationOnce } from "../degradation-ledger.js";
20
+ import { commitDurableStoreAsync } from "../durable-store.js";
21
+ import { getGlobalDmLensDir } from "../file-utils.js";
22
+ import {
23
+ allAvailableGlobalBinDirs,
24
+ installArgs,
25
+ pmBinary,
26
+ resolveNodePackageManager
27
+ } from "../package-manager.js";
28
+ import {
29
+ resetSafeSpawnWindowsCommandCache,
30
+ safeSpawnAsync
31
+ } from "../safe-spawn.js";
32
+ import { logSessionStart } from "../sessionstart-logger.js";
33
+ const TOOLS_DIR = path.join(getGlobalDmLensDir(), "tools");
34
+ const INSTALL_LOCK_PATH = path.join(TOOLS_DIR, ".install.lock");
35
+ const activeInstallLocks = new Set;
36
+ let installLockExitCleanupRegistered = false;
37
+ export function getManagedToolsDir() {
38
+ return TOOLS_DIR;
39
+ }
40
+ function isProcessAlive(pid) {
41
+ try {
42
+ process.kill(pid, 0);
43
+ return true;
44
+ } catch (error) {
45
+ return error.code === "EPERM";
46
+ }
47
+ }
48
+ async function acquireInstallLock() {
49
+ await fs.mkdir(TOOLS_DIR, { recursive: true });
50
+ const timeoutMs = Number(process.env.DM_LENS_INSTALL_LOCK_TIMEOUT_MS) || 150000;
51
+ const deadline = Date.now() + timeoutMs;
52
+ let lastOwner = "unknown owner";
53
+ while (Date.now() < deadline) {
54
+ try {
55
+ const handle = await fs.open(INSTALL_LOCK_PATH, "wx");
56
+ await handle.writeFile(JSON.stringify({ pid: process.pid, createdAt: Date.now() }));
57
+ await handle.close();
58
+ activeInstallLocks.add(INSTALL_LOCK_PATH);
59
+ if (!installLockExitCleanupRegistered) {
60
+ installLockExitCleanupRegistered = true;
61
+ process.once("exit", () => {
62
+ for (const lockPath of activeInstallLocks) {
63
+ try {
64
+ unlinkSync(lockPath);
65
+ } catch {}
66
+ }
67
+ });
68
+ }
69
+ let released = false;
70
+ return {
71
+ release: async () => {
72
+ if (released)
73
+ return;
74
+ released = true;
75
+ activeInstallLocks.delete(INSTALL_LOCK_PATH);
76
+ await fs.rm(INSTALL_LOCK_PATH, { force: true });
77
+ }
78
+ };
79
+ } catch (error) {
80
+ if (error.code !== "EEXIST")
81
+ throw error;
82
+ try {
83
+ const owner = JSON.parse(await fs.readFile(INSTALL_LOCK_PATH, "utf8"));
84
+ lastOwner = `pid=${owner.pid} createdAt=${owner.createdAt}`;
85
+ const maxAgeMs = (Number(process.env.DM_LENS_INSTALL_TIMEOUT_MS) || 120000) + 60000;
86
+ const expired = Number.isFinite(owner.createdAt) && Date.now() - owner.createdAt > maxAgeMs;
87
+ if (expired || Number.isInteger(owner.pid) && owner.pid > 0 && !isProcessAlive(owner.pid)) {
88
+ await fs.rm(INSTALL_LOCK_PATH, { force: true });
89
+ continue;
90
+ }
91
+ } catch (readError) {
92
+ lastOwner = "unreadable owner";
93
+ try {
94
+ const stat = await fs.stat(INSTALL_LOCK_PATH);
95
+ const maxAgeMs = (Number(process.env.DM_LENS_INSTALL_TIMEOUT_MS) || 120000) + 60000;
96
+ if (Date.now() - stat.mtimeMs > maxAgeMs) {
97
+ await fs.rm(INSTALL_LOCK_PATH, { force: true });
98
+ continue;
99
+ }
100
+ } catch {}
101
+ }
102
+ await new Promise((resolve) => setTimeout(resolve, 100));
103
+ }
104
+ }
105
+ return {
106
+ reason: `timed out after ${timeoutMs}ms waiting for shared tools install lock (${lastOwner})`
107
+ };
108
+ }
109
+ const GITHUB_BIN_DIR = path.join(getGlobalDmLensDir(), "bin");
110
+ const DEBUG = process.env.DM_LENS_DEBUG === "1" || process.argv.includes("--debug");
111
+ function installerPlatform() {
112
+ const override = process.env.DM_LENS_TEST_PLATFORM;
113
+ if (override === "win32" || override === "linux") {
114
+ return override;
115
+ }
116
+ return process.platform;
117
+ }
118
+ function debugLog(...args) {
119
+ if (DEBUG) {
120
+ logExtension({
121
+ subsystem: "auto-install",
122
+ level: "debug",
123
+ message: args.map((arg) => typeof arg === "string" ? arg : JSON.stringify(arg)).join(" ")
124
+ });
125
+ }
126
+ }
127
+ function archAssetMatch(table) {
128
+ return (platform, arch) => {
129
+ if (arch !== "x64" && arch !== "arm64")
130
+ return;
131
+ return table[platform]?.[arch];
132
+ };
133
+ }
134
+ const OS_ARCH_ZIP_ASSETS = {
135
+ linux: { x64: "linux_amd64.zip", arm64: "linux_arm64.zip" },
136
+ darwin: { x64: "darwin_amd64.zip", arm64: "darwin_arm64.zip" },
137
+ win32: { x64: "windows_amd64.zip", arm64: "windows_arm64.zip" }
138
+ };
139
+ export const TOOLS = [
140
+ {
141
+ id: "typescript-language-server",
142
+ name: "TypeScript Language Server",
143
+ checkCommand: "typescript-language-server",
144
+ checkArgs: ["--version"],
145
+ installStrategy: "npm",
146
+ packageName: "typescript-language-server",
147
+ binaryName: "typescript-language-server"
148
+ },
149
+ {
150
+ id: "typescript",
151
+ name: "TypeScript",
152
+ checkCommand: "tsc",
153
+ checkArgs: ["--version"],
154
+ installStrategy: "npm",
155
+ packageName: "typescript@5.9.3",
156
+ binaryName: "tsc"
157
+ },
158
+ {
159
+ id: "pyright",
160
+ name: "Pyright",
161
+ checkCommand: "pyright",
162
+ checkArgs: ["--version"],
163
+ installStrategy: "npm",
164
+ packageName: "pyright",
165
+ binaryName: "pyright"
166
+ },
167
+ {
168
+ id: "prettier",
169
+ name: "Prettier",
170
+ checkCommand: "prettier",
171
+ checkArgs: ["--version"],
172
+ installStrategy: "npm",
173
+ packageName: "prettier",
174
+ binaryName: "prettier"
175
+ },
176
+ {
177
+ id: "ruff",
178
+ name: "Ruff",
179
+ checkCommand: "ruff",
180
+ checkArgs: ["--version"],
181
+ installStrategy: "pip",
182
+ packageName: "ruff",
183
+ binaryName: "ruff"
184
+ },
185
+ {
186
+ id: "jedi-language-server",
187
+ name: "Jedi Language Server",
188
+ checkCommand: "jedi-language-server",
189
+ checkArgs: ["--version"],
190
+ installStrategy: "pip",
191
+ packageName: "jedi-language-server",
192
+ binaryName: "jedi-language-server"
193
+ },
194
+ {
195
+ id: "biome",
196
+ name: "Biome",
197
+ checkCommand: "biome",
198
+ checkArgs: ["--version"],
199
+ installStrategy: "npm",
200
+ packageName: "@biomejs/biome",
201
+ binaryName: "biome",
202
+ platformPackage: {
203
+ base: "@biomejs/cli",
204
+ suffixes: {
205
+ "linux-x64": "linux-x64",
206
+ "linux-arm64": "linux-arm64",
207
+ "darwin-x64": "darwin-x64",
208
+ "darwin-arm64": "darwin-arm64",
209
+ "win32-x64": "win32-x64",
210
+ "win32-arm64": "win32-arm64"
211
+ },
212
+ binaries: ["biome"]
213
+ }
214
+ },
215
+ {
216
+ id: "madge",
217
+ name: "Madge",
218
+ checkCommand: "madge",
219
+ checkArgs: ["--version"],
220
+ installStrategy: "npm",
221
+ packageName: "madge",
222
+ binaryName: "madge"
223
+ },
224
+ {
225
+ id: "jscpd",
226
+ name: "jscpd",
227
+ checkCommand: "jscpd",
228
+ checkArgs: ["--version"],
229
+ installStrategy: "npm",
230
+ packageName: "jscpd@5.0.12",
231
+ binaryName: "jscpd"
232
+ },
233
+ {
234
+ id: "ast-grep",
235
+ name: "ast-grep CLI",
236
+ checkCommand: "ast-grep",
237
+ checkArgs: ["--version"],
238
+ installStrategy: "npm",
239
+ packageName: "@ast-grep/cli",
240
+ binaryName: "ast-grep",
241
+ platformPackage: {
242
+ suffixes: {
243
+ "linux-x64": "linux-x64-gnu",
244
+ "linux-arm64": "linux-arm64-gnu",
245
+ "darwin-x64": "darwin-x64",
246
+ "darwin-arm64": "darwin-arm64",
247
+ "win32-x64": "win32-x64-msvc",
248
+ "win32-arm64": "win32-arm64-msvc",
249
+ "win32-ia32": "win32-ia32-msvc"
250
+ },
251
+ binaries: ["ast-grep", "sg"]
252
+ }
253
+ },
254
+ {
255
+ id: "knip",
256
+ name: "Knip",
257
+ checkCommand: "knip",
258
+ checkArgs: ["--version"],
259
+ installStrategy: "npm",
260
+ packageName: "knip",
261
+ binaryName: "knip"
262
+ },
263
+ {
264
+ id: "yamllint",
265
+ name: "yamllint",
266
+ checkCommand: "yamllint",
267
+ checkArgs: ["--version"],
268
+ installStrategy: "pip",
269
+ packageName: "yamllint",
270
+ binaryName: "yamllint"
271
+ },
272
+ {
273
+ id: "sqlfluff",
274
+ name: "sqlfluff",
275
+ checkCommand: "sqlfluff",
276
+ checkArgs: ["--version"],
277
+ installStrategy: "pip",
278
+ packageName: "sqlfluff",
279
+ binaryName: "sqlfluff"
280
+ },
281
+ {
282
+ id: "bash-language-server",
283
+ name: "Bash Language Server",
284
+ checkCommand: "bash-language-server",
285
+ checkArgs: ["--version"],
286
+ verificationTimeoutMs: 20000,
287
+ installStrategy: "npm",
288
+ packageName: "bash-language-server",
289
+ binaryName: "bash-language-server"
290
+ },
291
+ {
292
+ id: "fish-lsp",
293
+ name: "Fish Language Server",
294
+ checkCommand: "fish-lsp",
295
+ checkArgs: ["--version"],
296
+ installStrategy: "npm",
297
+ packageName: "fish-lsp",
298
+ binaryName: "fish-lsp"
299
+ },
300
+ {
301
+ id: "cmake-language-server",
302
+ name: "CMake Language Server",
303
+ checkCommand: "cmake-language-server",
304
+ checkArgs: ["--version"],
305
+ installStrategy: "pip",
306
+ packageName: "cmake-language-server",
307
+ binaryName: "cmake-language-server"
308
+ },
309
+ {
310
+ id: "yaml-language-server",
311
+ name: "YAML Language Server",
312
+ checkCommand: "yaml-language-server",
313
+ checkArgs: ["--version"],
314
+ installStrategy: "npm",
315
+ packageName: "yaml-language-server",
316
+ binaryName: "yaml-language-server"
317
+ },
318
+ {
319
+ id: "vscode-json-language-server",
320
+ name: "VSCode JSON Language Server",
321
+ checkCommand: "vscode-json-language-server",
322
+ checkArgs: ["--version"],
323
+ verificationTimeoutMs: 20000,
324
+ installStrategy: "npm",
325
+ packageName: "vscode-langservers-extracted",
326
+ binaryName: "vscode-json-language-server"
327
+ },
328
+ {
329
+ id: "vscode-html-languageserver-bin",
330
+ name: "VSCode HTML Language Server",
331
+ checkCommand: "vscode-html-language-server",
332
+ checkArgs: ["--version"],
333
+ installStrategy: "npm",
334
+ packageName: "vscode-html-languageserver-bin",
335
+ binaryName: "vscode-html-language-server"
336
+ },
337
+ {
338
+ id: "htmlhint",
339
+ name: "HTMLHint",
340
+ checkCommand: "htmlhint",
341
+ checkArgs: ["--version"],
342
+ installStrategy: "npm",
343
+ packageName: "htmlhint",
344
+ binaryName: "htmlhint"
345
+ },
346
+ {
347
+ id: "hadolint",
348
+ name: "Hadolint",
349
+ checkCommand: "hadolint",
350
+ checkArgs: ["--version"],
351
+ installStrategy: "github",
352
+ binaryName: "hadolint",
353
+ github: {
354
+ repo: "hadolint/hadolint",
355
+ assetMatch: (platform, arch) => {
356
+ if (platform === "linux")
357
+ return arch === "arm64" ? "linux.aarch64" : "linux.x86_64";
358
+ if (platform === "darwin")
359
+ return arch === "arm64" ? "macos-arm64" : "macos-x86_64";
360
+ if (platform === "win32")
361
+ return "windows-x86_64.exe";
362
+ return;
363
+ }
364
+ }
365
+ },
366
+ {
367
+ id: "helm",
368
+ name: "Helm",
369
+ checkCommand: "helm",
370
+ checkArgs: ["--version"],
371
+ installStrategy: "github",
372
+ binaryName: "helm",
373
+ github: {
374
+ repo: "helm/helm",
375
+ assetMatch: (platform, arch) => {
376
+ const cpu = arch === "arm64" ? "arm64" : "amd64";
377
+ if (platform === "linux")
378
+ return `linux-${cpu}.tar.gz`;
379
+ if (platform === "darwin")
380
+ return `darwin-${cpu}.tar.gz`;
381
+ if (platform === "win32")
382
+ return `windows-${cpu}.zip`;
383
+ return;
384
+ },
385
+ binaryInArchive: "helm"
386
+ }
387
+ },
388
+ {
389
+ id: "opengrep",
390
+ name: "Opengrep",
391
+ checkCommand: "opengrep",
392
+ checkArgs: ["--version"],
393
+ installStrategy: "github",
394
+ binaryName: "opengrep",
395
+ github: {
396
+ repo: "opengrep/opengrep",
397
+ assetMatch: (platform, arch) => {
398
+ if (platform === "linux")
399
+ return arch === "arm64" ? "opengrep_manylinux_aarch64" : "opengrep_manylinux_x86";
400
+ if (platform === "darwin")
401
+ return arch === "arm64" ? "opengrep_osx_arm64" : "opengrep_osx_x86";
402
+ if (platform === "win32")
403
+ return "opengrep_windows_x86.exe";
404
+ return;
405
+ }
406
+ }
407
+ },
408
+ {
409
+ id: "vscode-css-languageserver",
410
+ name: "VSCode CSS Language Server",
411
+ checkCommand: "vscode-css-language-server",
412
+ checkArgs: ["--version"],
413
+ installStrategy: "npm",
414
+ packageName: "vscode-css-languageserver",
415
+ binaryName: "vscode-css-language-server"
416
+ },
417
+ {
418
+ id: "dockerfile-language-server-nodejs",
419
+ name: "Dockerfile Language Server",
420
+ checkCommand: "docker-langserver",
421
+ checkArgs: ["--version"],
422
+ installStrategy: "npm",
423
+ packageName: "dockerfile-language-server-nodejs",
424
+ binaryName: "docker-langserver"
425
+ },
426
+ {
427
+ id: "intelephense",
428
+ name: "Intelephense",
429
+ checkCommand: "intelephense",
430
+ checkArgs: ["--version"],
431
+ installStrategy: "npm",
432
+ packageName: "intelephense",
433
+ binaryName: "intelephense"
434
+ },
435
+ {
436
+ id: "@prisma/language-server",
437
+ name: "Prisma Language Server",
438
+ checkCommand: "prisma-language-server",
439
+ checkArgs: ["--version"],
440
+ verificationTimeoutMs: 40000,
441
+ installStrategy: "npm",
442
+ packageName: "@prisma/language-server",
443
+ binaryName: "prisma-language-server"
444
+ },
445
+ {
446
+ id: "@vue/language-server",
447
+ name: "Vue Language Server",
448
+ checkCommand: "vue-language-server",
449
+ checkArgs: ["--version"],
450
+ verificationTimeoutMs: 30000,
451
+ installStrategy: "npm",
452
+ packageName: "@vue/language-server",
453
+ binaryName: "vue-language-server"
454
+ },
455
+ {
456
+ id: "svelte-language-server",
457
+ name: "Svelte Language Server",
458
+ checkCommand: "svelteserver",
459
+ checkArgs: ["--version"],
460
+ verificationTimeoutMs: 20000,
461
+ installStrategy: "npm",
462
+ packageName: "svelte-language-server",
463
+ binaryName: "svelteserver"
464
+ },
465
+ {
466
+ id: "markdownlint",
467
+ name: "markdownlint-cli2",
468
+ checkCommand: "markdownlint-cli2",
469
+ checkArgs: ["--no-globs", "-"],
470
+ installStrategy: "npm",
471
+ packageName: "markdownlint-cli2",
472
+ binaryName: "markdownlint-cli2"
473
+ },
474
+ {
475
+ id: "mypy",
476
+ name: "mypy",
477
+ checkCommand: "mypy",
478
+ checkArgs: ["--version"],
479
+ installStrategy: "pip",
480
+ packageName: "mypy",
481
+ binaryName: "mypy"
482
+ },
483
+ {
484
+ id: "rubocop",
485
+ name: "RuboCop",
486
+ checkCommand: "rubocop",
487
+ checkArgs: ["--version"],
488
+ installStrategy: "gem",
489
+ packageName: "rubocop",
490
+ binaryName: "rubocop"
491
+ },
492
+ {
493
+ id: "stylelint",
494
+ name: "Stylelint",
495
+ checkCommand: "stylelint",
496
+ checkArgs: ["--version"],
497
+ installStrategy: "npm",
498
+ packageName: "stylelint",
499
+ binaryName: "stylelint"
500
+ },
501
+ {
502
+ id: "oxlint",
503
+ name: "Oxlint",
504
+ checkCommand: "oxlint",
505
+ checkArgs: ["--version"],
506
+ installStrategy: "npm",
507
+ packageName: "oxlint",
508
+ binaryName: "oxlint"
509
+ },
510
+ {
511
+ id: "shellcheck",
512
+ name: "ShellCheck",
513
+ checkCommand: "shellcheck",
514
+ checkArgs: ["--version"],
515
+ installStrategy: "github",
516
+ binaryName: "shellcheck",
517
+ github: {
518
+ repo: "koalaman/shellcheck",
519
+ assetMatch: (platform, arch) => {
520
+ if (platform === "linux")
521
+ return arch === "arm64" ? "linux.aarch64.tar.xz" : "linux.x86_64.tar.xz";
522
+ if (platform === "darwin")
523
+ return arch === "arm64" ? "darwin.aarch64.tar.xz" : "darwin.x86_64.tar.xz";
524
+ if (platform === "win32")
525
+ return "zip";
526
+ return;
527
+ },
528
+ binaryInArchive: "shellcheck"
529
+ }
530
+ },
531
+ {
532
+ id: "shfmt",
533
+ name: "shfmt",
534
+ checkCommand: "shfmt",
535
+ checkArgs: ["--version"],
536
+ installStrategy: "github",
537
+ binaryName: "shfmt",
538
+ github: {
539
+ repo: "mvdan/sh",
540
+ assetMatch: (platform, arch) => {
541
+ if (platform === "linux")
542
+ return arch === "arm64" ? "linux_arm64" : "linux_amd64";
543
+ if (platform === "darwin")
544
+ return arch === "arm64" ? "darwin_arm64" : "darwin_amd64";
545
+ if (platform === "win32")
546
+ return arch === "arm64" ? "windows_arm64.exe" : "windows_amd64.exe";
547
+ return;
548
+ }
549
+ }
550
+ },
551
+ {
552
+ id: "rust-analyzer",
553
+ name: "rust-analyzer",
554
+ checkCommand: "rust-analyzer",
555
+ checkArgs: ["--version"],
556
+ installStrategy: "github",
557
+ binaryName: "rust-analyzer",
558
+ github: {
559
+ repo: "rust-lang/rust-analyzer",
560
+ assetMatch: (platform, arch) => {
561
+ if (platform === "linux")
562
+ return arch === "arm64" ? "aarch64-unknown-linux-gnu.gz" : "x86_64-unknown-linux-gnu.gz";
563
+ if (platform === "darwin")
564
+ return arch === "arm64" ? "aarch64-apple-darwin.gz" : "x86_64-apple-darwin.gz";
565
+ if (platform === "win32")
566
+ return "x86_64-pc-windows-msvc.zip";
567
+ return;
568
+ }
569
+ }
570
+ },
571
+ {
572
+ id: "deno",
573
+ name: "Deno",
574
+ checkCommand: "deno",
575
+ checkArgs: ["--version"],
576
+ installStrategy: "github",
577
+ binaryName: "deno",
578
+ github: {
579
+ repo: "denoland/deno",
580
+ assetMatch: (platform, arch) => {
581
+ if (platform === "linux")
582
+ return arch === "arm64" ? "deno-aarch64-unknown-linux-gnu.zip" : "deno-x86_64-unknown-linux-gnu.zip";
583
+ if (platform === "darwin")
584
+ return arch === "arm64" ? "deno-aarch64-apple-darwin.zip" : "deno-x86_64-apple-darwin.zip";
585
+ if (platform === "win32")
586
+ return "deno-x86_64-pc-windows-msvc.zip";
587
+ return;
588
+ }
589
+ }
590
+ },
591
+ {
592
+ id: "golangci-lint",
593
+ name: "golangci-lint",
594
+ checkCommand: "golangci-lint",
595
+ checkArgs: ["--version"],
596
+ installStrategy: "github",
597
+ binaryName: "golangci-lint",
598
+ github: {
599
+ repo: "golangci/golangci-lint",
600
+ assetMatch: (platform, arch) => {
601
+ if (platform === "linux")
602
+ return arch === "arm64" ? "linux-arm64.tar.gz" : "linux-amd64.tar.gz";
603
+ if (platform === "darwin")
604
+ return arch === "arm64" ? "darwin-arm64.tar.gz" : "darwin-amd64.tar.gz";
605
+ if (platform === "win32")
606
+ return arch === "arm64" ? "windows-arm64.zip" : "windows-amd64.zip";
607
+ return;
608
+ },
609
+ binaryInArchive: "golangci-lint"
610
+ }
611
+ },
612
+ {
613
+ id: "ktlint",
614
+ name: "ktlint",
615
+ checkCommand: "ktlint",
616
+ checkArgs: ["--version"],
617
+ installStrategy: "github",
618
+ binaryName: "ktlint",
619
+ github: {
620
+ repo: "pinterest/ktlint",
621
+ assetMatch: (platform, _arch) => {
622
+ if (platform === "linux")
623
+ return "ktlint";
624
+ if (platform === "darwin")
625
+ return "ktlint";
626
+ if (platform === "win32")
627
+ return "ktlint.bat";
628
+ return;
629
+ },
630
+ extraAssets: (platform) => platform === "win32" ? ["ktlint"] : []
631
+ }
632
+ },
633
+ {
634
+ id: "ktfmt",
635
+ name: "ktfmt",
636
+ checkCommand: "ktfmt",
637
+ checkArgs: ["--version"],
638
+ installStrategy: "maven",
639
+ binaryName: "ktfmt",
640
+ maven: {
641
+ groupId: "com.facebook",
642
+ artifactId: "ktfmt",
643
+ version: "0.63",
644
+ classifier: "with-dependencies"
645
+ }
646
+ },
647
+ {
648
+ id: "spotbugs",
649
+ name: "SpotBugs",
650
+ checkCommand: "spotbugs",
651
+ checkArgs: ["--version"],
652
+ installStrategy: "archive",
653
+ binaryName: "spotbugs",
654
+ archive: {
655
+ url: "https://github.com/spotbugs/spotbugs/releases/download/4.10.2/spotbugs-4.10.2.tgz",
656
+ kind: "tgz",
657
+ launcher: "bin/spotbugs"
658
+ }
659
+ },
660
+ {
661
+ id: "powershell-editor-services",
662
+ name: "PowerShell Editor Services",
663
+ checkCommand: "pwsh",
664
+ checkArgs: [
665
+ "-NoProfile",
666
+ "-Command",
667
+ "$PSVersionTable.PSVersion.ToString()"
668
+ ],
669
+ installStrategy: "archive",
670
+ binaryName: "powershell-editor-services",
671
+ archive: {
672
+ url: "https://github.com/PowerShell/PowerShellEditorServices/releases/download/v4.6.0/PowerShellEditorServices.zip",
673
+ kind: "zip",
674
+ stripComponents: 0,
675
+ treeMarker: "PowerShellEditorServices/Start-EditorServices.ps1"
676
+ }
677
+ },
678
+ {
679
+ id: "clangd",
680
+ name: "clangd",
681
+ checkCommand: "clangd",
682
+ checkArgs: ["--version"],
683
+ installStrategy: "archive",
684
+ binaryName: "clangd",
685
+ archive: {
686
+ url: (platform, arch) => {
687
+ const version = "22.1.0";
688
+ const base = `https://github.com/clangd/clangd/releases/download/${version}`;
689
+ if (platform === "linux")
690
+ return arch === "x64" ? `${base}/clangd-linux-${version}.zip` : undefined;
691
+ if (platform === "darwin")
692
+ return `${base}/clangd-mac-${version}.zip`;
693
+ if (platform === "win32")
694
+ return `${base}/clangd-windows-${version}.zip`;
695
+ return;
696
+ },
697
+ kind: "zip",
698
+ stripComponents: 1,
699
+ treeMarker: "bin"
700
+ }
701
+ },
702
+ {
703
+ id: "lua-language-server",
704
+ name: "lua-language-server",
705
+ checkCommand: "lua-language-server",
706
+ checkArgs: ["--version"],
707
+ installStrategy: "archive",
708
+ binaryName: "lua-language-server",
709
+ archive: {
710
+ url: (platform, arch) => {
711
+ const version = "3.18.2";
712
+ const base = `https://github.com/LuaLS/lua-language-server/releases/download/${version}`;
713
+ if (platform === "linux")
714
+ return arch === "arm64" ? `${base}/lua-language-server-${version}-linux-arm64.tar.gz` : `${base}/lua-language-server-${version}-linux-x64.tar.gz`;
715
+ if (platform === "darwin")
716
+ return arch === "arm64" ? `${base}/lua-language-server-${version}-darwin-arm64.tar.gz` : `${base}/lua-language-server-${version}-darwin-x64.tar.gz`;
717
+ if (platform === "win32")
718
+ return arch === "arm64" ? undefined : `${base}/lua-language-server-${version}-win32-x64.zip`;
719
+ return;
720
+ },
721
+ kind: "zip",
722
+ stripComponents: 0,
723
+ treeMarker: "bin"
724
+ }
725
+ },
726
+ {
727
+ id: "actionlint",
728
+ name: "actionlint",
729
+ checkCommand: "actionlint",
730
+ checkArgs: ["--version"],
731
+ installStrategy: "github",
732
+ binaryName: "actionlint",
733
+ github: {
734
+ repo: "rhysd/actionlint",
735
+ assetMatch: (platform, arch) => {
736
+ if (platform === "linux")
737
+ return arch === "arm64" ? "linux_arm64.tar.gz" : "linux_amd64.tar.gz";
738
+ if (platform === "darwin")
739
+ return arch === "arm64" ? "darwin_arm64.tar.gz" : "darwin_amd64.tar.gz";
740
+ if (platform === "win32")
741
+ return arch === "arm64" ? "windows_arm64.zip" : "windows_amd64.zip";
742
+ return;
743
+ },
744
+ binaryInArchive: "actionlint"
745
+ }
746
+ },
747
+ {
748
+ id: "zizmor",
749
+ name: "zizmor",
750
+ checkCommand: "zizmor",
751
+ checkArgs: ["--version"],
752
+ installStrategy: "github",
753
+ binaryName: "zizmor",
754
+ github: {
755
+ repo: "zizmorcore/zizmor",
756
+ assetMatch: (platform, arch) => {
757
+ if (platform === "linux")
758
+ return arch === "arm64" ? "aarch64-unknown-linux-gnu.tar.gz" : "x86_64-unknown-linux-gnu.tar.gz";
759
+ if (platform === "darwin")
760
+ return arch === "arm64" ? "aarch64-apple-darwin.tar.gz" : "x86_64-apple-darwin.tar.gz";
761
+ if (platform === "win32")
762
+ return "x86_64-pc-windows-msvc.zip";
763
+ return;
764
+ },
765
+ binaryInArchive: "zizmor"
766
+ }
767
+ },
768
+ {
769
+ id: "typos-lsp",
770
+ name: "typos-lsp",
771
+ checkCommand: "typos-lsp",
772
+ checkArgs: ["--version"],
773
+ installStrategy: "github",
774
+ binaryName: "typos-lsp",
775
+ github: {
776
+ repo: "tekumara/typos-lsp",
777
+ assetMatch: (platform, arch) => {
778
+ if (platform === "linux")
779
+ return arch === "arm64" ? "aarch64-unknown-linux-gnu.tar.gz" : "x86_64-unknown-linux-gnu.tar.gz";
780
+ if (platform === "darwin")
781
+ return arch === "arm64" ? "aarch64-apple-darwin.tar.gz" : "x86_64-apple-darwin.tar.gz";
782
+ if (platform === "win32")
783
+ return arch === "arm64" ? "aarch64-pc-windows-msvc.zip" : "x86_64-pc-windows-msvc.zip";
784
+ return;
785
+ },
786
+ binaryInArchive: "typos-lsp"
787
+ }
788
+ },
789
+ {
790
+ id: "tflint",
791
+ name: "tflint",
792
+ checkCommand: "tflint",
793
+ checkArgs: ["--version"],
794
+ installStrategy: "github",
795
+ binaryName: "tflint",
796
+ github: {
797
+ repo: "terraform-linters/tflint",
798
+ assetMatch: archAssetMatch(OS_ARCH_ZIP_ASSETS),
799
+ binaryInArchive: "tflint"
800
+ }
801
+ },
802
+ {
803
+ id: "terragrunt",
804
+ name: "terragrunt",
805
+ checkCommand: "terragrunt",
806
+ checkArgs: ["--version"],
807
+ installStrategy: "github",
808
+ binaryName: "terragrunt",
809
+ github: {
810
+ repo: "gruntwork-io/terragrunt",
811
+ assetMatch: archAssetMatch({
812
+ linux: {
813
+ x64: "terragrunt_linux_amd64",
814
+ arm64: "terragrunt_linux_arm64"
815
+ },
816
+ darwin: {
817
+ x64: "terragrunt_darwin_amd64",
818
+ arm64: "terragrunt_darwin_arm64"
819
+ },
820
+ win32: {
821
+ x64: "terragrunt_windows_amd64.exe",
822
+ arm64: "terragrunt_windows_amd64.exe"
823
+ }
824
+ })
825
+ }
826
+ },
827
+ {
828
+ id: "gitleaks",
829
+ name: "gitleaks",
830
+ checkCommand: "gitleaks",
831
+ checkArgs: ["--version"],
832
+ installStrategy: "github",
833
+ binaryName: "gitleaks",
834
+ github: {
835
+ repo: "gitleaks/gitleaks",
836
+ assetMatch: archAssetMatch({
837
+ linux: { x64: "linux_x64.tar.gz", arm64: "linux_arm64.tar.gz" },
838
+ darwin: { x64: "darwin_x64.tar.gz", arm64: "darwin_arm64.tar.gz" },
839
+ win32: { x64: "windows_x64.zip", arm64: "windows_arm64.zip" }
840
+ }),
841
+ binaryInArchive: "gitleaks"
842
+ }
843
+ },
844
+ {
845
+ id: "trivy",
846
+ name: "Trivy",
847
+ checkCommand: "trivy",
848
+ checkArgs: ["--version"],
849
+ installStrategy: "github",
850
+ binaryName: "trivy",
851
+ github: {
852
+ repo: "aquasecurity/trivy",
853
+ assetMatch: archAssetMatch({
854
+ linux: { x64: "Linux-64bit.tar.gz", arm64: "Linux-ARM64.tar.gz" },
855
+ darwin: { x64: "macOS-64bit.tar.gz", arm64: "macOS-ARM64.tar.gz" },
856
+ win32: { x64: "windows-64bit.zip" }
857
+ }),
858
+ binaryInArchive: "trivy"
859
+ }
860
+ },
861
+ {
862
+ id: "swiftlint",
863
+ name: "SwiftLint",
864
+ checkCommand: "swiftlint",
865
+ checkArgs: ["--version"],
866
+ installStrategy: "github",
867
+ binaryName: "swiftlint",
868
+ github: {
869
+ repo: "realm/SwiftLint",
870
+ assetMatch: (platform, arch) => {
871
+ if (platform === "darwin")
872
+ return "portable_swiftlint.zip";
873
+ if (platform === "linux")
874
+ return arch === "arm64" ? "swiftlint_linux_arm64.zip" : "swiftlint_linux_amd64.zip";
875
+ return;
876
+ },
877
+ binaryInArchive: "swiftlint"
878
+ }
879
+ },
880
+ {
881
+ id: "taplo",
882
+ name: "taplo",
883
+ checkCommand: "taplo",
884
+ checkArgs: ["--version"],
885
+ installStrategy: "github",
886
+ binaryName: "taplo",
887
+ github: {
888
+ repo: "tamasfe/taplo",
889
+ assetMatch: (platform, arch) => {
890
+ if (platform === "linux")
891
+ return arch === "arm64" ? "taplo-linux-aarch64.gz" : "taplo-linux-x86_64.gz";
892
+ if (platform === "darwin")
893
+ return arch === "arm64" ? "taplo-darwin-aarch64.gz" : "taplo-darwin-x86_64.gz";
894
+ if (platform === "win32")
895
+ return "taplo-windows-x86_64.gz";
896
+ return;
897
+ }
898
+ }
899
+ },
900
+ {
901
+ id: "vale",
902
+ name: "Vale",
903
+ checkCommand: "vale",
904
+ checkArgs: ["--version"],
905
+ installStrategy: "github",
906
+ binaryName: "vale",
907
+ github: {
908
+ repo: "vale-cli/vale",
909
+ assetMatch: (platform, arch) => {
910
+ const version = "3.14.2";
911
+ if (platform === "linux")
912
+ return arch === "arm64" ? `vale_${version}_Linux_arm64.tar.gz` : `vale_${version}_Linux_64-bit.tar.gz`;
913
+ if (platform === "darwin")
914
+ return arch === "arm64" ? `vale_${version}_macOS_arm64.tar.gz` : `vale_${version}_macOS_64-bit.tar.gz`;
915
+ if (platform === "win32")
916
+ return `vale_${version}_Windows_64-bit.zip`;
917
+ return;
918
+ },
919
+ binaryInArchive: "vale"
920
+ }
921
+ },
922
+ {
923
+ id: "terraform-ls",
924
+ name: "terraform-ls",
925
+ checkCommand: "terraform-ls",
926
+ checkArgs: ["--version"],
927
+ installStrategy: "github",
928
+ binaryName: "terraform-ls",
929
+ github: {
930
+ repo: "hashicorp/terraform-ls",
931
+ hashiCorpReleaseProduct: "terraform-ls",
932
+ assetMatch: archAssetMatch(OS_ARCH_ZIP_ASSETS),
933
+ binaryInArchive: "terraform-ls"
934
+ }
935
+ },
936
+ {
937
+ id: "zls",
938
+ name: "zls",
939
+ checkCommand: "zls",
940
+ checkArgs: ["--version"],
941
+ installStrategy: "github",
942
+ binaryName: "zls",
943
+ github: {
944
+ repo: "zigtools/zls",
945
+ assetMatch: (platform, arch) => {
946
+ if (platform === "linux")
947
+ return arch === "arm64" ? "aarch64-linux.tar.xz" : "x86_64-linux.tar.xz";
948
+ if (platform === "darwin")
949
+ return arch === "arm64" ? "aarch64-macos.tar.xz" : "x86_64-macos.tar.xz";
950
+ if (platform === "win32")
951
+ return arch === "arm64" ? "aarch64-windows.zip" : "x86_64-windows.zip";
952
+ return;
953
+ },
954
+ binaryInArchive: "zls"
955
+ }
956
+ },
957
+ {
958
+ id: "clojure-lsp",
959
+ name: "clojure-lsp",
960
+ checkCommand: "clojure-lsp",
961
+ checkArgs: ["--version"],
962
+ installStrategy: "github",
963
+ binaryName: "clojure-lsp",
964
+ github: {
965
+ repo: "clojure-lsp/clojure-lsp",
966
+ assetMatch: (platform, arch) => {
967
+ if (platform === "linux")
968
+ return arch === "arm64" ? "native-linux-aarch64.zip" : "native-linux-amd64.zip";
969
+ if (platform === "darwin")
970
+ return arch === "arm64" ? "native-macos-aarch64.zip" : "native-macos-amd64.zip";
971
+ if (platform === "win32")
972
+ return "native-windows-amd64.zip";
973
+ return;
974
+ },
975
+ binaryInArchive: "clojure-lsp"
976
+ }
977
+ },
978
+ {
979
+ id: "cue",
980
+ name: "CUE",
981
+ checkCommand: "cue",
982
+ checkArgs: ["version"],
983
+ installStrategy: "github",
984
+ binaryName: "cue",
985
+ github: {
986
+ repo: "cue-lang/cue",
987
+ assetMatch: (platform, arch) => {
988
+ if (platform === "linux")
989
+ return arch === "arm64" ? "linux_arm64.tar.gz" : "linux_amd64.tar.gz";
990
+ if (platform === "darwin")
991
+ return arch === "arm64" ? "darwin_arm64.tar.gz" : "darwin_amd64.tar.gz";
992
+ if (platform === "win32")
993
+ return arch === "arm64" ? "windows_arm64.zip" : "windows_amd64.zip";
994
+ return;
995
+ },
996
+ binaryInArchive: "cue"
997
+ }
998
+ },
999
+ {
1000
+ id: "gleam",
1001
+ name: "Gleam",
1002
+ checkCommand: "gleam",
1003
+ checkArgs: ["--version"],
1004
+ installStrategy: "github",
1005
+ binaryName: "gleam",
1006
+ github: {
1007
+ repo: "gleam-lang/gleam",
1008
+ assetMatch: (platform, arch) => {
1009
+ if (platform === "linux")
1010
+ return arch === "arm64" ? "aarch64-unknown-linux-musl.tar.gz" : "x86_64-unknown-linux-musl.tar.gz";
1011
+ if (platform === "darwin")
1012
+ return arch === "arm64" ? "aarch64-apple-darwin.tar.gz" : "x86_64-apple-darwin.tar.gz";
1013
+ if (platform === "win32")
1014
+ return arch === "arm64" ? "aarch64-pc-windows-msvc.zip" : "x86_64-pc-windows-msvc.zip";
1015
+ return;
1016
+ },
1017
+ binaryInArchive: "gleam"
1018
+ }
1019
+ },
1020
+ {
1021
+ id: "marksman",
1022
+ name: "Marksman",
1023
+ checkCommand: "marksman",
1024
+ checkArgs: ["--version"],
1025
+ installStrategy: "github",
1026
+ binaryName: "marksman",
1027
+ github: {
1028
+ repo: "artempyanykh/marksman",
1029
+ assetMatch: (platform, arch) => {
1030
+ if (platform === "linux")
1031
+ return arch === "arm64" ? "marksman-linux-arm64" : "marksman-linux-x64";
1032
+ if (platform === "darwin")
1033
+ return "marksman-macos";
1034
+ if (platform === "win32")
1035
+ return "marksman.exe";
1036
+ return;
1037
+ }
1038
+ }
1039
+ },
1040
+ {
1041
+ id: "expert",
1042
+ name: "Expert",
1043
+ checkCommand: "expert",
1044
+ checkArgs: ["--version"],
1045
+ installStrategy: "github",
1046
+ binaryName: "expert",
1047
+ github: {
1048
+ repo: "expert-lsp/expert",
1049
+ assetMatch: (platform, arch) => {
1050
+ if (arch !== "x64" && arch !== "arm64")
1051
+ return;
1052
+ if (platform === "linux")
1053
+ return arch === "arm64" ? "expert_linux_arm64" : "expert_linux_amd64";
1054
+ if (platform === "darwin")
1055
+ return arch === "arm64" ? "expert_darwin_arm64" : "expert_darwin_amd64";
1056
+ if (platform === "win32")
1057
+ return "expert_windows_amd64.exe";
1058
+ return;
1059
+ }
1060
+ }
1061
+ }
1062
+ ];
1063
+ export function getToolVerificationTimeout(tool) {
1064
+ return tool.verificationTimeoutMs ?? 1e4;
1065
+ }
1066
+ const ensureInFlight = new Map;
1067
+ const installFailureReasons = new Map;
1068
+ export function getInstallFailureReason(toolId) {
1069
+ return installFailureReasons.get(toolId);
1070
+ }
1071
+ const installAttempts = new Map;
1072
+ function noteInstallAttempt(toolId, outcome, reason) {
1073
+ installAttempts.set(toolId, { outcome, reason, at: Date.now() });
1074
+ }
1075
+ function noteInstallAttemptIfUnrecorded(toolId, outcome, reason) {
1076
+ if (installAttempts.has(toolId))
1077
+ return;
1078
+ noteInstallAttempt(toolId, outcome, reason);
1079
+ }
1080
+ export function getInstallAttempt(toolId) {
1081
+ return installAttempts.get(toolId);
1082
+ }
1083
+ const lastEnsureResolutionSource = new Map;
1084
+ export function getLastEnsureResolutionSource(toolId) {
1085
+ return lastEnsureResolutionSource.get(toolId);
1086
+ }
1087
+ const resolvedPathCache = new BoundedLruCache(256);
1088
+ export function resetResolvedPathCache() {
1089
+ resolvedPathCache.clear();
1090
+ }
1091
+ const PROBE_CACHE_PATH = path.join(getGlobalDmLensDir(), "probe-cache.json");
1092
+ const PROBE_CACHE_LOCK_STALE_MS = 180000;
1093
+ const PROBE_CACHE_TTL_MS = 24 * 60 * 60 * 1000;
1094
+ const PROBE_CACHE_TRANSIENT_COOLDOWN_MS = TRANSIENT_MAX_COOLDOWN_MS;
1095
+ const PROBE_CACHE_FLUSH_LOCK_WAIT_MS = 250;
1096
+ const PROBE_CACHE_FLUSH_RETRY_DELAY_MS = 300;
1097
+ const PROBE_CACHE_FLUSH_RETRY_MAX_DELAY_MS = 30000;
1098
+ let _probeCache = null;
1099
+ let _probeCacheDirty = false;
1100
+ let _probeCacheFlushTimer = null;
1101
+ let _probeCacheWriteInFlight = null;
1102
+ let _probeCacheRetryAttempt = 0;
1103
+ let _probeCacheChangeGeneration = 0;
1104
+ const _probeCacheChanges = new Map;
1105
+ const _probeCacheChangeVersions = new Map;
1106
+ async function readProbeCache() {
1107
+ if (_probeCache !== null)
1108
+ return _probeCache;
1109
+ try {
1110
+ const raw = await fs.readFile(PROBE_CACHE_PATH, "utf-8");
1111
+ const parsed = JSON.parse(raw);
1112
+ if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
1113
+ throw new Error("probe-cache root is not an object");
1114
+ }
1115
+ _probeCache = parsed;
1116
+ } catch (err) {
1117
+ const code = err?.code;
1118
+ if (code !== "ENOENT") {
1119
+ logSessionStart(`auto-install probe-cache: read failed (${code ?? "invalid"}); treating cache as unavailable`);
1120
+ }
1121
+ _probeCache = {};
1122
+ }
1123
+ return _probeCache;
1124
+ }
1125
+ function markProbeCacheChange(toolId, entry) {
1126
+ _probeCacheChanges.set(toolId, entry);
1127
+ _probeCacheChangeVersions.set(toolId, ++_probeCacheChangeGeneration);
1128
+ _probeCacheDirty = true;
1129
+ scheduleProbeFlush();
1130
+ }
1131
+ function scheduleProbeFlush(delayMs = PROBE_CACHE_FLUSH_RETRY_DELAY_MS) {
1132
+ if (_probeCacheFlushTimer !== null)
1133
+ return;
1134
+ _probeCacheFlushTimer = setTimeout(() => {
1135
+ flushProbeCache();
1136
+ }, delayMs);
1137
+ _probeCacheFlushTimer.unref?.();
1138
+ }
1139
+ function scheduleProbeFlushRetry() {
1140
+ const delay = Math.min(PROBE_CACHE_FLUSH_RETRY_MAX_DELAY_MS, PROBE_CACHE_FLUSH_RETRY_DELAY_MS * 2 ** Math.min(_probeCacheRetryAttempt, 6));
1141
+ _probeCacheRetryAttempt += 1;
1142
+ scheduleProbeFlush(delay);
1143
+ }
1144
+ function snapshotProbeCacheChanges() {
1145
+ return {
1146
+ changes: new Map(_probeCacheChanges),
1147
+ versions: new Map(_probeCacheChangeVersions)
1148
+ };
1149
+ }
1150
+ function deserializeProbeCache(contents) {
1151
+ if (contents === undefined)
1152
+ return {};
1153
+ try {
1154
+ const parsed = JSON.parse(contents);
1155
+ if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
1156
+ throw new Error("probe-cache root is not an object");
1157
+ }
1158
+ return parsed;
1159
+ } catch (err) {
1160
+ logSessionStart(`auto-install probe-cache: write-side read was corrupt (${err.message}); recovering as empty`);
1161
+ return {};
1162
+ }
1163
+ }
1164
+ function applyProbeCacheChanges(disk, changes) {
1165
+ for (const [toolId, entry] of changes) {
1166
+ if (entry === null)
1167
+ delete disk[toolId];
1168
+ else
1169
+ disk[toolId] = entry;
1170
+ }
1171
+ }
1172
+ function ageProbeCache(disk) {
1173
+ const now = Date.now();
1174
+ for (const [toolId, entry] of Object.entries(disk)) {
1175
+ const ttl = entry.transient ? PROBE_CACHE_TRANSIENT_COOLDOWN_MS : PROBE_CACHE_TTL_MS;
1176
+ if (!Number.isFinite(entry.cachedAt) || entry.cachedAt < now - ttl) {
1177
+ delete disk[toolId];
1178
+ }
1179
+ }
1180
+ }
1181
+ function publishProbeCacheWrite(disk, snapshotVersions) {
1182
+ const pendingAfterWrite = new Map(_probeCacheChanges);
1183
+ _probeCache = disk;
1184
+ for (const [toolId, entry] of pendingAfterWrite) {
1185
+ if (entry === null)
1186
+ delete _probeCache[toolId];
1187
+ else
1188
+ _probeCache[toolId] = entry;
1189
+ }
1190
+ for (const [toolId, version] of snapshotVersions) {
1191
+ if (_probeCacheChangeVersions.get(toolId) === version) {
1192
+ _probeCacheChanges.delete(toolId);
1193
+ _probeCacheChangeVersions.delete(toolId);
1194
+ }
1195
+ }
1196
+ _probeCacheDirty = _probeCacheChanges.size > 0;
1197
+ _probeCacheRetryAttempt = 0;
1198
+ return _probeCacheDirty ? "written-with-pending" : "written";
1199
+ }
1200
+ async function writeProbeCache() {
1201
+ try {
1202
+ const { changes, versions } = snapshotProbeCacheChanges();
1203
+ let result = "written";
1204
+ const committed = await commitDurableStoreAsync({
1205
+ path: PROBE_CACHE_PATH,
1206
+ deserialize: deserializeProbeCache,
1207
+ merge: (disk) => {
1208
+ ageProbeCache(disk);
1209
+ applyProbeCacheChanges(disk, changes);
1210
+ return disk;
1211
+ },
1212
+ serialize: (disk) => JSON.stringify(disk, null, 2),
1213
+ waitMs: PROBE_CACHE_FLUSH_LOCK_WAIT_MS,
1214
+ retryMs: 25,
1215
+ staleMs: PROBE_CACHE_LOCK_STALE_MS,
1216
+ timeoutMessage: "Timed out waiting for probe-cache lock",
1217
+ onContention: "skip-log",
1218
+ logContention: () => {
1219
+ logSessionStart("auto-install probe-cache: flush deferred because another process owns the lock");
1220
+ },
1221
+ afterWriteLocked: (disk) => {
1222
+ result = publishProbeCacheWrite(disk, versions);
1223
+ }
1224
+ });
1225
+ if (committed === undefined) {
1226
+ scheduleProbeFlushRetry();
1227
+ return "deferred";
1228
+ }
1229
+ return result;
1230
+ } catch (err) {
1231
+ logSessionStart(`auto-install probe-cache: flush failed (${err?.code ?? "write error"}); pending update retained`);
1232
+ scheduleProbeFlushRetry();
1233
+ return "failed";
1234
+ }
1235
+ }
1236
+ export async function flushProbeCache() {
1237
+ if (_probeCacheFlushTimer !== null) {
1238
+ clearTimeout(_probeCacheFlushTimer);
1239
+ _probeCacheFlushTimer = null;
1240
+ }
1241
+ if (_probeCacheWriteInFlight) {
1242
+ await _probeCacheWriteInFlight;
1243
+ if (!_probeCacheDirty)
1244
+ return "written";
1245
+ }
1246
+ if (!_probeCacheDirty || _probeCache === null)
1247
+ return "idle";
1248
+ const write = writeProbeCache();
1249
+ _probeCacheWriteInFlight = write;
1250
+ try {
1251
+ return await write;
1252
+ } finally {
1253
+ if (_probeCacheWriteInFlight === write)
1254
+ _probeCacheWriteInFlight = null;
1255
+ }
1256
+ }
1257
+ function isAstGrepVersionOutput(output) {
1258
+ return /\bast[- ]grep\b/i.test(output);
1259
+ }
1260
+ async function verifyAstGrepProbePath(binPath) {
1261
+ return new Promise((resolve) => {
1262
+ let proc;
1263
+ try {
1264
+ proc = spawn(binPath, ["--version"], {
1265
+ stdio: ["ignore", "pipe", "pipe"],
1266
+ shell: process.platform === "win32" && /\.(cmd|bat)$/i.test(binPath),
1267
+ timeout: 5000
1268
+ });
1269
+ } catch {
1270
+ resolve(false);
1271
+ return;
1272
+ }
1273
+ let output = "";
1274
+ proc.stdout?.on("data", (data) => output += data);
1275
+ proc.stderr?.on("data", (data) => output += data);
1276
+ proc.on("exit", (code) => {
1277
+ resolve(code === 0 && isAstGrepVersionOutput(output));
1278
+ });
1279
+ proc.on("error", () => resolve(false));
1280
+ });
1281
+ }
1282
+ export async function checkProbeCache(toolId) {
1283
+ const cache = await readProbeCache();
1284
+ const entry = cache[toolId];
1285
+ if (!entry)
1286
+ return;
1287
+ const ttl = entry.transient ? PROBE_CACHE_TRANSIENT_COOLDOWN_MS : PROBE_CACHE_TTL_MS;
1288
+ if (Date.now() - entry.cachedAt > ttl) {
1289
+ logSessionStart(`auto-install probe-cache ${toolId}: miss (${entry.transient ? "transient cooldown" : "ttl"} expired)`);
1290
+ delete cache[toolId];
1291
+ markProbeCacheChange(toolId, null);
1292
+ return;
1293
+ }
1294
+ try {
1295
+ await fs.access(entry.path);
1296
+ const stat = await fs.stat(entry.path);
1297
+ if (stat.mtimeMs !== entry.mtimeMs || entry.sizeBytes !== undefined && stat.size !== entry.sizeBytes) {
1298
+ logSessionStart(`auto-install probe-cache ${toolId}: miss (mtime/size changed)`);
1299
+ delete cache[toolId];
1300
+ markProbeCacheChange(toolId, null);
1301
+ return;
1302
+ }
1303
+ if (toolId === "ast-grep" && !await verifyAstGrepProbePath(entry.path)) {
1304
+ logSessionStart(`auto-install probe-cache ${toolId}: miss (not ast-grep: ${entry.path})`);
1305
+ delete cache[toolId];
1306
+ markProbeCacheChange(toolId, null);
1307
+ return;
1308
+ }
1309
+ return entry.path;
1310
+ } catch {
1311
+ logSessionStart(`auto-install probe-cache ${toolId}: miss (gone: ${entry.path})`);
1312
+ delete cache[toolId];
1313
+ markProbeCacheChange(toolId, null);
1314
+ return;
1315
+ }
1316
+ }
1317
+ export async function updateProbeCache(toolId, resolvedPath, transient = false) {
1318
+ try {
1319
+ const stat = await fs.stat(resolvedPath);
1320
+ const cache = await readProbeCache();
1321
+ const entry = {
1322
+ path: resolvedPath,
1323
+ mtimeMs: stat.mtimeMs,
1324
+ sizeBytes: stat.size,
1325
+ cachedAt: Date.now(),
1326
+ ...transient && { transient: true }
1327
+ };
1328
+ cache[toolId] = entry;
1329
+ markProbeCacheChange(toolId, entry);
1330
+ } catch {}
1331
+ }
1332
+ export function resetProbeCacheStateForTesting() {
1333
+ _probeCache = null;
1334
+ _probeCacheDirty = false;
1335
+ _probeCacheChanges.clear();
1336
+ _probeCacheChangeVersions.clear();
1337
+ _probeCacheChangeGeneration = 0;
1338
+ _probeCacheRetryAttempt = 0;
1339
+ resetResolvedPathCache();
1340
+ ensureInFlight.clear();
1341
+ installFailureReasons.clear();
1342
+ installAttempts.clear();
1343
+ lastEnsureResolutionSource.clear();
1344
+ lastManagedInstallVersion.clear();
1345
+ lastResolveTransient.clear();
1346
+ resetPathWalkMemo();
1347
+ if (_probeCacheFlushTimer !== null) {
1348
+ clearTimeout(_probeCacheFlushTimer);
1349
+ _probeCacheFlushTimer = null;
1350
+ }
1351
+ }
1352
+ export function _peekEnsureInFlightForTesting() {
1353
+ return ensureInFlight;
1354
+ }
1355
+ const pathWalkMemo = new Map;
1356
+ function hashSync(value) {
1357
+ let hash = 2166136261;
1358
+ for (let i = 0;i < value.length; i += 1) {
1359
+ hash ^= value.charCodeAt(i);
1360
+ hash = Math.imul(hash, 16777619);
1361
+ }
1362
+ return (hash >>> 0).toString(16);
1363
+ }
1364
+ export function resetPathWalkMemo() {
1365
+ pathWalkMemo.clear();
1366
+ }
1367
+ export async function isCommandAvailable(command, _args) {
1368
+ const isWindows = installerPlatform() === "win32";
1369
+ const pathEnv = process.env.PATH || process.env.Path || process.env.path || "";
1370
+ const dirs = pathEnv.split(path.delimiter);
1371
+ const names = isWindows ? [command, `${command}.exe`, `${command}.cmd`, `${command}.bat`] : [command];
1372
+ for (const dir of dirs) {
1373
+ if (!dir)
1374
+ continue;
1375
+ for (const name of names) {
1376
+ const candidate = path.join(dir, name);
1377
+ try {
1378
+ const stat = statSync(candidate);
1379
+ if (stat.isFile() && stat.size > 0) {
1380
+ return true;
1381
+ }
1382
+ } catch {}
1383
+ }
1384
+ }
1385
+ return false;
1386
+ }
1387
+ export async function isSpawnableCommand(command) {
1388
+ if (/[\\/]/.test(command)) {
1389
+ try {
1390
+ const stat = statSync(command);
1391
+ return stat.isFile() && stat.size > 0;
1392
+ } catch {
1393
+ return false;
1394
+ }
1395
+ }
1396
+ const memoKey = `${command}:${hashSync(process.env.PATH || "")}`;
1397
+ if (pathWalkMemo.has(memoKey))
1398
+ return pathWalkMemo.get(memoKey) ?? false;
1399
+ const isSpawnable = await isCommandAvailable(command);
1400
+ pathWalkMemo.set(memoKey, isSpawnable);
1401
+ return isSpawnable;
1402
+ }
1403
+ export function isLspTransportRequiredError(output) {
1404
+ return /Connection (?:input|output) stream is not set|Use arguments of createConnection/i.test(output);
1405
+ }
1406
+ const lspTransportRequiredMatcher = /Connection (?:input|output) stream is not set|Use arguments of createConnection/i;
1407
+ function parsePinnedVersion(packageName) {
1408
+ const at = packageName.lastIndexOf("@");
1409
+ if (at <= 0)
1410
+ return;
1411
+ return packageName.slice(at + 1) || undefined;
1412
+ }
1413
+ function extractVersionToken(output) {
1414
+ return output.match(/\d+\.\d+\.\d+(?:[-+][\w.]+)?/)?.[0];
1415
+ }
1416
+ const lastManagedInstallVersion = new Map;
1417
+ export async function verifyToolBinary(binPath, onVersionOutput, onTransient, timeoutMs = 1e4, verificationArgs = ["--version"]) {
1418
+ const isWindows = installerPlatform() === "win32";
1419
+ const hasKnownWindowsExt = /\.(cmd|exe|ps1)$/i.test(binPath);
1420
+ let execPath = isWindows && !hasKnownWindowsExt ? `${binPath}.cmd` : binPath;
1421
+ if (isWindows && /\.ps1$/i.test(execPath)) {
1422
+ const cmdSibling = `${execPath.slice(0, -4)}.cmd`;
1423
+ if (require("node:fs").existsSync(cmdSibling)) {
1424
+ execPath = cmdSibling;
1425
+ }
1426
+ }
1427
+ const useShell = isWindows && /\.(cmd|bat)$/i.test(execPath);
1428
+ try {
1429
+ const result = await safeSpawnAsync(execPath, verificationArgs, {
1430
+ timeout: timeoutMs,
1431
+ input: "",
1432
+ maxOutputBytes: 64 * 1024,
1433
+ matchWhileStreaming: lspTransportRequiredMatcher
1434
+ });
1435
+ const output = `${result.stdout}
1436
+ ${result.stderr}`;
1437
+ if (result.outputTruncated) {
1438
+ recordDegradationOnce({
1439
+ kind: "installer-verification-output-truncated",
1440
+ subject: binPath,
1441
+ reason: `verification output exceeded 65536 bytes (${verificationArgs.join(" ")})`
1442
+ });
1443
+ }
1444
+ if (result.status === 0 && !result.error) {
1445
+ debugLog(`Verified: ${binPath} (${verificationArgs.join(" ")}: ${result.stdout.trim()})`);
1446
+ onVersionOutput?.(result.stdout);
1447
+ return true;
1448
+ }
1449
+ if (result.streamingMatch || isLspTransportRequiredError(output)) {
1450
+ debugLog(`Verified (stdio LSP, transport-required): ${binPath}`);
1451
+ return true;
1452
+ }
1453
+ if (result.signal !== undefined || result.spawnFailure)
1454
+ onTransient?.();
1455
+ const kind = result.spawnFailure?.kind ?? (result.signal ? `killed-signal=${result.signal}` : result.error ? "spawn-error" : "exit-nonzero");
1456
+ logSessionStart(`auto-install verify: failed for ${binPath} (check=${verificationArgs.join(" ")}, kind=${kind}${result.status !== null ? `, exit=${result.status}` : ""})`);
1457
+ return false;
1458
+ } catch (err) {
1459
+ logSessionStart(`auto-install verify: spawn threw for ${binPath} (${err instanceof Error ? err.message : String(err)})`);
1460
+ onTransient?.();
1461
+ return false;
1462
+ }
1463
+ }
1464
+ export async function getAllToolStatuses() {
1465
+ const statuses = [];
1466
+ for (const tool of TOOLS) {
1467
+ const status = {
1468
+ id: tool.id,
1469
+ name: tool.name,
1470
+ installed: false,
1471
+ source: "not-installed",
1472
+ strategy: tool.installStrategy
1473
+ };
1474
+ if (tool.installStrategy === "archive" && !tool.archive?.launcher) {
1475
+ const bundleDir = await getArchiveTreeBundlePath(tool);
1476
+ if (bundleDir) {
1477
+ status.installed = true;
1478
+ status.source = "archive-dist";
1479
+ status.path = bundleDir;
1480
+ }
1481
+ statuses.push(status);
1482
+ continue;
1483
+ }
1484
+ if (await isCommandAvailable(tool.checkCommand, tool.checkArgs)) {
1485
+ status.installed = true;
1486
+ status.source = "global-path";
1487
+ status.path = tool.checkCommand;
1488
+ const versionResult = await new Promise((resolve) => {
1489
+ let proc;
1490
+ try {
1491
+ proc = spawn(tool.checkCommand, ["--version"], {
1492
+ stdio: ["ignore", "pipe", "pipe"],
1493
+ shell: process.platform === "win32",
1494
+ timeout: 5000
1495
+ });
1496
+ } catch {
1497
+ resolve("");
1498
+ return;
1499
+ }
1500
+ let out = "";
1501
+ proc.stdout?.on("data", (d) => out += d);
1502
+ proc.stderr?.on("data", (d) => out += d);
1503
+ proc.on("exit", () => resolve(out.trim().split(`
1504
+ `)[0]?.slice(0, 30) || ""));
1505
+ proc.on("error", () => resolve(""));
1506
+ });
1507
+ status.version = versionResult || undefined;
1508
+ statuses.push(status);
1509
+ continue;
1510
+ }
1511
+ if (tool.installStrategy === "npm") {
1512
+ const npmPath = await findNpmGlobalToolPath(tool.binaryName || tool.id, undefined, tool.checkArgs, getToolVerificationTimeout(tool));
1513
+ if (npmPath) {
1514
+ status.installed = true;
1515
+ status.source = "npm-global";
1516
+ status.path = npmPath;
1517
+ statuses.push(status);
1518
+ continue;
1519
+ }
1520
+ }
1521
+ if (tool.installStrategy === "pip") {
1522
+ const pipPath = await findPipUserToolPath(tool.binaryName || tool.id, undefined, tool.checkArgs, getToolVerificationTimeout(tool));
1523
+ if (pipPath) {
1524
+ status.installed = true;
1525
+ status.source = "pip-user";
1526
+ status.path = pipPath;
1527
+ statuses.push(status);
1528
+ continue;
1529
+ }
1530
+ }
1531
+ if (tool.installStrategy === "github" || tool.installStrategy === "maven" || tool.installStrategy === "archive") {
1532
+ const githubPath = await findGitHubToolPath(tool.binaryName || tool.id);
1533
+ if (githubPath) {
1534
+ status.installed = true;
1535
+ status.source = tool.installStrategy === "maven" ? "maven-jar" : tool.installStrategy === "archive" ? "archive-dist" : "github-release";
1536
+ status.path = githubPath;
1537
+ statuses.push(status);
1538
+ continue;
1539
+ }
1540
+ }
1541
+ const localBase = path.join(TOOLS_DIR, "node_modules", ".bin", tool.binaryName || tool.id);
1542
+ const localPath = installerPlatform() === "win32" ? `${localBase}.cmd` : localBase;
1543
+ try {
1544
+ await fs.access(localPath);
1545
+ if (await verifyToolBinary(localPath, undefined, undefined, getToolVerificationTimeout(tool), tool.checkArgs)) {
1546
+ status.installed = true;
1547
+ status.source = "dm-lens-auto";
1548
+ status.path = localPath;
1549
+ statuses.push(status);
1550
+ continue;
1551
+ }
1552
+ } catch {}
1553
+ if (tool.installStrategy === "npm") {
1554
+ status.source = "npx-fallback";
1555
+ }
1556
+ statuses.push(status);
1557
+ }
1558
+ return statuses;
1559
+ }
1560
+ export async function isToolInstalled(toolId) {
1561
+ return await getToolPath(toolId) !== undefined;
1562
+ }
1563
+ async function getArchiveTreeBundlePath(tool) {
1564
+ if (tool.installStrategy !== "archive" || tool.archive?.launcher) {
1565
+ return;
1566
+ }
1567
+ const extractDir = path.join(TOOLS_DIR, tool.id);
1568
+ const marker = tool.archive?.treeMarker ? path.join(extractDir, ...tool.archive.treeMarker.split("/")) : extractDir;
1569
+ try {
1570
+ await fs.access(marker);
1571
+ return extractDir;
1572
+ } catch {
1573
+ return;
1574
+ }
1575
+ }
1576
+ export function resolvePlatformPackageBinary(tool) {
1577
+ const spec = tool.platformPackage;
1578
+ if (!spec || !tool.packageName)
1579
+ return;
1580
+ const suffix = spec.suffixes[`${installerPlatform()}-${process.arch}`];
1581
+ if (!suffix)
1582
+ return;
1583
+ const platformPkg = `${spec.base ?? tool.packageName}-${suffix}`;
1584
+ try {
1585
+ const mainPkgJson = _installerRequire.resolve(`${tool.packageName}/package.json`);
1586
+ const fromMain = createRequire(mainPkgJson);
1587
+ let pkgDir;
1588
+ try {
1589
+ pkgDir = path.dirname(fromMain.resolve(`${platformPkg}/package.json`));
1590
+ } catch {
1591
+ pkgDir = path.dirname(_installerRequire.resolve(`${platformPkg}/package.json`));
1592
+ }
1593
+ const isWin = installerPlatform() === "win32";
1594
+ for (const bin of spec.binaries) {
1595
+ for (const name of isWin ? [`${bin}.exe`, bin] : [bin]) {
1596
+ const candidate = path.join(pkgDir, name);
1597
+ if (existsSync(candidate))
1598
+ return candidate;
1599
+ }
1600
+ }
1601
+ } catch {}
1602
+ return;
1603
+ }
1604
+ const lastResolveTransient = new Map;
1605
+ const lastInstallResolutionId = new Map;
1606
+ export function wasLastResolveTransient(toolId) {
1607
+ return lastResolveTransient.get(toolId) ?? false;
1608
+ }
1609
+ export async function getToolPath(toolId) {
1610
+ let sawTransient = false;
1611
+ const markTransient = () => {
1612
+ sawTransient = true;
1613
+ };
1614
+ const result = await getToolPathResolved(toolId, markTransient);
1615
+ lastResolveTransient.set(toolId, sawTransient);
1616
+ return result;
1617
+ }
1618
+ async function getToolPathResolved(toolId, onTransient) {
1619
+ const tool = TOOLS.find((t) => t.id === toolId);
1620
+ if (!tool)
1621
+ return;
1622
+ if (tool.installStrategy === "archive" && !tool.archive?.launcher) {
1623
+ return getArchiveTreeBundlePath(tool);
1624
+ }
1625
+ const pinnedVersion = tool.installStrategy === "npm" && tool.packageName ? parsePinnedVersion(tool.packageName) : undefined;
1626
+ if (pinnedVersion)
1627
+ lastManagedInstallVersion.delete(toolId);
1628
+ const recordVersion = pinnedVersion ? (output) => {
1629
+ const seen = extractVersionToken(output);
1630
+ if (seen)
1631
+ lastManagedInstallVersion.set(toolId, seen);
1632
+ } : undefined;
1633
+ const localBase = path.join(TOOLS_DIR, "node_modules", ".bin", tool.binaryName || tool.id);
1634
+ if (installerPlatform() === "win32") {
1635
+ const cmdPath = `${localBase}.cmd`;
1636
+ try {
1637
+ await fs.access(cmdPath);
1638
+ if (await verifyToolBinary(cmdPath, recordVersion, onTransient, getToolVerificationTimeout(tool), tool.checkArgs)) {
1639
+ return cmdPath;
1640
+ }
1641
+ logSessionStart(`auto-install verify: ${cmdPath} exists but is broken, will reinstall`);
1642
+ } catch {}
1643
+ const exePath = `${localBase}.exe`;
1644
+ try {
1645
+ await fs.access(exePath);
1646
+ if (await verifyToolBinary(exePath, recordVersion, onTransient, getToolVerificationTimeout(tool), tool.checkArgs)) {
1647
+ return exePath;
1648
+ }
1649
+ logSessionStart(`auto-install verify: ${exePath} exists but is broken, will reinstall`);
1650
+ } catch {}
1651
+ }
1652
+ if (installerPlatform() !== "win32") {
1653
+ try {
1654
+ await fs.access(localBase);
1655
+ if (await verifyToolBinary(localBase, recordVersion, onTransient, getToolVerificationTimeout(tool), tool.checkArgs)) {
1656
+ return localBase;
1657
+ }
1658
+ logSessionStart(`auto-install verify: ${localBase} exists but is broken, will reinstall`);
1659
+ } catch {}
1660
+ }
1661
+ if (tool.platformPackage) {
1662
+ const platformBin = resolvePlatformPackageBinary(tool);
1663
+ if (platformBin && await verifyToolBinary(platformBin, undefined, onTransient, getToolVerificationTimeout(tool), tool.checkArgs)) {
1664
+ logSessionStart(`auto-install ${toolId}: resolved platform-package binary at ${platformBin}`);
1665
+ return platformBin;
1666
+ }
1667
+ logSessionStart(`auto-install ${toolId}: platform-package binary not resolved (${process.platform}-${process.arch}, base=${tool.platformPackage.base ?? tool.packageName}) — falling back to PATH/managed install`);
1668
+ }
1669
+ if (tool.installStrategy === "github" || tool.installStrategy === "maven" || tool.installStrategy === "archive") {
1670
+ const githubPath = await findGitHubToolPath(tool.binaryName || tool.id);
1671
+ if (githubPath)
1672
+ return githubPath;
1673
+ }
1674
+ if (await isCommandAvailable(tool.checkCommand, tool.checkArgs)) {
1675
+ return tool.checkCommand;
1676
+ }
1677
+ if (tool.installStrategy === "npm") {
1678
+ const npmPath = await findNpmGlobalToolPath(tool.binaryName || tool.id, onTransient, tool.checkArgs, getToolVerificationTimeout(tool));
1679
+ if (npmPath) {
1680
+ return npmPath;
1681
+ }
1682
+ }
1683
+ if (tool.installStrategy === "pip") {
1684
+ const pipPath = await findPipUserToolPath(tool.binaryName || tool.id, onTransient, tool.checkArgs, getToolVerificationTimeout(tool));
1685
+ if (pipPath) {
1686
+ return pipPath;
1687
+ }
1688
+ }
1689
+ return;
1690
+ }
1691
+ async function findGitHubToolPath(binaryName) {
1692
+ const isWindows = process.platform === "win32";
1693
+ const candidates = isWindows ? [
1694
+ path.join(GITHUB_BIN_DIR, `${binaryName}.exe`),
1695
+ path.join(GITHUB_BIN_DIR, `${binaryName}.bat`),
1696
+ path.join(GITHUB_BIN_DIR, `${binaryName}.cmd`),
1697
+ path.join(GITHUB_BIN_DIR, binaryName)
1698
+ ] : [path.join(GITHUB_BIN_DIR, binaryName)];
1699
+ for (const candidate of candidates) {
1700
+ try {
1701
+ await fs.access(candidate);
1702
+ return candidate;
1703
+ } catch {}
1704
+ }
1705
+ return;
1706
+ }
1707
+ export async function findManagedToolBinary(toolId) {
1708
+ const tool = TOOLS.find((candidate) => candidate.id === toolId);
1709
+ if (!tool)
1710
+ return;
1711
+ if (tool.installStrategy !== "github" && tool.installStrategy !== "maven" && tool.installStrategy !== "archive") {
1712
+ return;
1713
+ }
1714
+ return findGitHubToolPath(tool.binaryName || tool.id);
1715
+ }
1716
+ function hasExecutableExtension(name) {
1717
+ return /\.(exe|bat|cmd|ps1)$/i.test(name);
1718
+ }
1719
+ function getGitHubInstalledBinaryName(binaryName, platform, assetName) {
1720
+ if (platform !== "win32")
1721
+ return binaryName;
1722
+ if (hasExecutableExtension(binaryName))
1723
+ return binaryName;
1724
+ if (assetName.endsWith(".bat"))
1725
+ return `${binaryName}.bat`;
1726
+ if (assetName.endsWith(".cmd"))
1727
+ return `${binaryName}.cmd`;
1728
+ return `${binaryName}.exe`;
1729
+ }
1730
+ function getArchiveBinaryCandidates(binaryName, platform, assetName) {
1731
+ if (platform !== "win32")
1732
+ return [binaryName];
1733
+ if (hasExecutableExtension(binaryName))
1734
+ return [binaryName];
1735
+ const candidates = new Set;
1736
+ if (assetName.endsWith(".bat"))
1737
+ candidates.add(`${binaryName}.bat`);
1738
+ if (assetName.endsWith(".cmd"))
1739
+ candidates.add(`${binaryName}.cmd`);
1740
+ candidates.add(`${binaryName}.exe`);
1741
+ candidates.add(binaryName);
1742
+ candidates.add(`${binaryName}.bat`);
1743
+ candidates.add(`${binaryName}.cmd`);
1744
+ return [...candidates];
1745
+ }
1746
+ async function findNpmGlobalToolPath(binaryName, onTransient, verificationArgs = ["--version"], verificationTimeoutMs = 1e4) {
1747
+ const isWindows = process.platform === "win32";
1748
+ const binDirs = await getNpmGlobalBinCandidates(onTransient);
1749
+ for (const dir of binDirs) {
1750
+ const candidates = isWindows ? [
1751
+ path.join(dir, `${binaryName}.cmd`),
1752
+ path.join(dir, `${binaryName}.exe`)
1753
+ ] : [path.join(dir, binaryName)];
1754
+ for (const candidate of candidates) {
1755
+ try {
1756
+ await fs.access(candidate);
1757
+ if (await verifyToolBinary(candidate, undefined, onTransient, verificationTimeoutMs, verificationArgs)) {
1758
+ return candidate;
1759
+ }
1760
+ } catch {}
1761
+ }
1762
+ }
1763
+ return;
1764
+ }
1765
+ async function getNpmGlobalBinCandidates(onTransient) {
1766
+ const dirs = [];
1767
+ const seen = new Set;
1768
+ const add = (value) => {
1769
+ if (!value)
1770
+ return;
1771
+ const normalized = path.resolve(value.trim());
1772
+ if (!normalized)
1773
+ return;
1774
+ if (seen.has(normalized))
1775
+ return;
1776
+ seen.add(normalized);
1777
+ dirs.push(normalized);
1778
+ };
1779
+ if (process.platform === "win32") {
1780
+ add(path.join(process.env.APPDATA || "", "npm"));
1781
+ } else {
1782
+ add(path.join(os.homedir(), ".npm-global", "bin"));
1783
+ }
1784
+ for (const dir of await allAvailableGlobalBinDirs(onTransient)) {
1785
+ add(dir);
1786
+ }
1787
+ return dirs;
1788
+ }
1789
+ async function findPipUserToolPath(binaryName, onTransient, verificationArgs = ["--version"], verificationTimeoutMs = 1e4) {
1790
+ const isWindows = process.platform === "win32";
1791
+ const userBaseCandidates = await getPythonUserBaseCandidates();
1792
+ for (const userBase of userBaseCandidates) {
1793
+ const scriptDirs = [
1794
+ path.join(userBase, isWindows ? "Scripts" : "bin")
1795
+ ];
1796
+ if (isWindows) {
1797
+ try {
1798
+ const children = await fs.readdir(userBase, { withFileTypes: true });
1799
+ for (const entry of children) {
1800
+ if (!entry.isDirectory())
1801
+ continue;
1802
+ if (!/^python\d+$/i.test(entry.name))
1803
+ continue;
1804
+ scriptDirs.push(path.join(userBase, entry.name, "Scripts"));
1805
+ }
1806
+ } catch {}
1807
+ }
1808
+ for (const dir of scriptDirs) {
1809
+ const candidates = isWindows ? [
1810
+ path.join(dir, `${binaryName}.exe`),
1811
+ path.join(dir, `${binaryName}.cmd`),
1812
+ path.join(dir, binaryName)
1813
+ ] : [path.join(dir, binaryName)];
1814
+ for (const candidate of candidates) {
1815
+ try {
1816
+ await fs.access(candidate);
1817
+ if (await verifyToolBinary(candidate, undefined, onTransient, verificationTimeoutMs, verificationArgs)) {
1818
+ return candidate;
1819
+ }
1820
+ } catch {}
1821
+ }
1822
+ }
1823
+ }
1824
+ return;
1825
+ }
1826
+ async function getPythonUserBaseCandidates() {
1827
+ const candidates = [];
1828
+ const seen = new Set;
1829
+ const add = (value) => {
1830
+ if (!value)
1831
+ return;
1832
+ const normalized = value.trim();
1833
+ if (!normalized)
1834
+ return;
1835
+ if (seen.has(normalized))
1836
+ return;
1837
+ seen.add(normalized);
1838
+ candidates.push(normalized);
1839
+ };
1840
+ if (process.platform === "win32") {
1841
+ add(path.join(process.env.APPDATA || "", "Python"));
1842
+ }
1843
+ const probes = process.platform === "win32" ? [
1844
+ { command: "py", args: ["-m", "site", "--user-base"] },
1845
+ { command: "python", args: ["-m", "site", "--user-base"] }
1846
+ ] : [
1847
+ { command: "python3", args: ["-m", "site", "--user-base"] },
1848
+ { command: "python", args: ["-m", "site", "--user-base"] }
1849
+ ];
1850
+ for (const probe of probes) {
1851
+ const userBase = await new Promise((resolve) => {
1852
+ const isWin = process.platform === "win32";
1853
+ const spawnCmd = isWin ? [probe.command, ...probe.args].join(" ") : probe.command;
1854
+ let proc;
1855
+ try {
1856
+ proc = spawn(spawnCmd, isWin ? [] : probe.args, {
1857
+ stdio: ["ignore", "pipe", "pipe"],
1858
+ shell: isWin
1859
+ });
1860
+ } catch {
1861
+ resolve("");
1862
+ return;
1863
+ }
1864
+ let stdout = "";
1865
+ proc.stdout?.on("data", (data) => stdout += data);
1866
+ proc.on("exit", (code) => resolve(code === 0 ? stdout.trim() : ""));
1867
+ proc.on("error", () => resolve(""));
1868
+ });
1869
+ add(userBase);
1870
+ }
1871
+ return candidates;
1872
+ }
1873
+ function githubApiAuthHeaders() {
1874
+ const token = process.env.GITHUB_TOKEN || process.env.GH_TOKEN;
1875
+ return token ? { Authorization: `Bearer ${token}` } : {};
1876
+ }
1877
+ function sameHost(a, b) {
1878
+ try {
1879
+ return new URL(a).host === new URL(b).host;
1880
+ } catch {
1881
+ return false;
1882
+ }
1883
+ }
1884
+ function httpsGetWithMeta(url, maxRedirects = 5, headers = {}) {
1885
+ return new Promise((resolve, reject) => {
1886
+ https.get(url, { headers: { "User-Agent": "dm-lens/1.0", ...headers } }, (res) => {
1887
+ if (res.statusCode && res.statusCode >= 300 && res.statusCode < 400 && res.headers.location) {
1888
+ if (maxRedirects === 0)
1889
+ return reject(new Error("Too many redirects"));
1890
+ const location = res.headers.location;
1891
+ const nextHeaders = sameHost(url, location) ? headers : (() => {
1892
+ const { Authorization: _drop, ...rest } = headers;
1893
+ return rest;
1894
+ })();
1895
+ return resolve(httpsGetWithMeta(location, maxRedirects - 1, nextHeaders));
1896
+ }
1897
+ const etag = typeof res.headers.etag === "string" ? res.headers.etag : undefined;
1898
+ if (res.statusCode === 304) {
1899
+ res.resume();
1900
+ return resolve({ statusCode: 304, body: Buffer.alloc(0), etag });
1901
+ }
1902
+ if (res.statusCode !== 200) {
1903
+ res.resume();
1904
+ return reject(new Error(`HTTP ${res.statusCode} for ${url}`));
1905
+ }
1906
+ const chunks = [];
1907
+ res.on("data", (chunk) => chunks.push(chunk));
1908
+ res.on("end", () => resolve({ statusCode: 200, body: Buffer.concat(chunks), etag }));
1909
+ res.on("error", reject);
1910
+ }).on("error", reject);
1911
+ });
1912
+ }
1913
+ async function httpsGet(url, maxRedirects = 5, headers = {}) {
1914
+ const response = await httpsGetWithMeta(url, maxRedirects, headers);
1915
+ if (response.statusCode !== 200) {
1916
+ throw new Error(`HTTP ${response.statusCode} for ${url}`);
1917
+ }
1918
+ return response.body;
1919
+ }
1920
+ function runCommand(command, args, cwd) {
1921
+ return new Promise((resolve) => {
1922
+ let proc;
1923
+ try {
1924
+ proc = spawn(command, args, {
1925
+ cwd,
1926
+ stdio: "ignore",
1927
+ shell: process.platform === "win32"
1928
+ });
1929
+ } catch {
1930
+ resolve(false);
1931
+ return;
1932
+ }
1933
+ proc.on("exit", (code) => resolve(code === 0));
1934
+ proc.on("error", () => resolve(false));
1935
+ });
1936
+ }
1937
+ async function installGitHubTool(tool, prefetchedRelease) {
1938
+ const spec = tool.github;
1939
+ if (!spec)
1940
+ return;
1941
+ const platform = process.platform;
1942
+ const arch = process.arch;
1943
+ const assetSubstring = spec.assetMatch(platform, arch);
1944
+ if (!assetSubstring) {
1945
+ logSessionStart(`github-install ${tool.id}: unsupported platform=${platform} arch=${arch}`);
1946
+ return;
1947
+ }
1948
+ let releaseJson;
1949
+ if (prefetchedRelease) {
1950
+ releaseJson = prefetchedRelease;
1951
+ logSessionStart(`github-install ${tool.id}: using caller-supplied release metadata for ${spec.repo} (${prefetchedRelease.tag_name ?? "untagged"})`);
1952
+ } else {
1953
+ logSessionStart(`github-install ${tool.id}: fetching release metadata from ${spec.repo}`);
1954
+ try {
1955
+ const body = await httpsGet(`https://api.github.com/repos/${spec.repo}/releases/latest`, 5, githubApiAuthHeaders());
1956
+ releaseJson = JSON.parse(body.toString("utf8"));
1957
+ } catch (err) {
1958
+ logSessionStart(`github-install ${tool.id}: release fetch failed: ${err.message}`);
1959
+ return;
1960
+ }
1961
+ }
1962
+ if (releaseJson.tag_name) {
1963
+ lastInstallResolutionId.set(tool.id, releaseJson.tag_name);
1964
+ }
1965
+ if (!Array.isArray(releaseJson.assets)) {
1966
+ logSessionStart(`github-install ${tool.id}: release metadata has no assets array`);
1967
+ return;
1968
+ }
1969
+ const asset = pickReleaseAsset(releaseJson.assets, assetSubstring) ?? deriveHashiCorpReleaseAsset(tool, releaseJson.tag_name, assetSubstring);
1970
+ if (!asset) {
1971
+ logSessionStart(`github-install ${tool.id}: no asset matched "${assetSubstring}"`);
1972
+ return;
1973
+ }
1974
+ logSessionStart(`github-install ${tool.id}: downloading ${asset.name}`);
1975
+ debugLog(`[github] downloading ${asset.name} from ${asset.browser_download_url}`);
1976
+ const downloadStart = Date.now();
1977
+ let assetBuffer;
1978
+ try {
1979
+ assetBuffer = await httpsGet(asset.browser_download_url);
1980
+ logSessionStart(`github-install ${tool.id}: downloaded ${asset.name} (${assetBuffer.length} bytes, ${Date.now() - downloadStart}ms)`);
1981
+ } catch (err) {
1982
+ logSessionStart(`github-install ${tool.id}: download failed: ${err.message}`);
1983
+ return;
1984
+ }
1985
+ await fs.mkdir(GITHUB_BIN_DIR, { recursive: true });
1986
+ const binaryName = tool.binaryName ?? tool.id;
1987
+ const isWindows = platform === "win32";
1988
+ const finalBinaryName = getGitHubInstalledBinaryName(binaryName, platform, asset.name);
1989
+ const destPath = path.join(GITHUB_BIN_DIR, finalBinaryName);
1990
+ const assetName = asset.name;
1991
+ try {
1992
+ if (assetName.endsWith(".gz") && !assetName.endsWith(".tar.gz")) {
1993
+ const decompressed = await new Promise((resolve, reject) => {
1994
+ const gunzip = createGunzip();
1995
+ const chunks = [];
1996
+ gunzip.on("data", (chunk) => chunks.push(chunk));
1997
+ gunzip.on("end", () => resolve(Buffer.concat(chunks)));
1998
+ gunzip.on("error", reject);
1999
+ gunzip.end(assetBuffer);
2000
+ });
2001
+ await writeFileAtomicAsync(destPath, decompressed, {
2002
+ bestEffort: false,
2003
+ mode: 488
2004
+ });
2005
+ } else if (assetName.endsWith(".tar.gz") || assetName.endsWith(".tar.xz")) {
2006
+ const tmpArchive = path.join(GITHUB_BIN_DIR, `_tmp_${assetName}`);
2007
+ await fs.writeFile(tmpArchive, assetBuffer);
2008
+ const tmpDir = path.join(GITHUB_BIN_DIR, `_tmp_extract_${tool.id}`);
2009
+ await fs.mkdir(tmpDir, { recursive: true });
2010
+ const extracted = await runCommand("tar", ["xf", tmpArchive, "-C", tmpDir], GITHUB_BIN_DIR);
2011
+ await fs.rm(tmpArchive, { force: true });
2012
+ if (!extracted) {
2013
+ await fs.rm(tmpDir, { recursive: true, force: true });
2014
+ logSessionStart(`github-install ${tool.id}: tar extraction failed for ${assetName}`);
2015
+ return;
2016
+ }
2017
+ const tarBinaryName = spec.binaryInArchive ?? binaryName;
2018
+ const tarSrcBinary = await findFirstFileRecursive(tmpDir, getArchiveBinaryCandidates(tarBinaryName, platform, assetName));
2019
+ if (!tarSrcBinary) {
2020
+ await fs.rm(tmpDir, { recursive: true, force: true });
2021
+ logSessionStart(`github-install ${tool.id}: binary candidates ${JSON.stringify(getArchiveBinaryCandidates(tarBinaryName, platform, assetName))} not found in tar ${assetName}`);
2022
+ return;
2023
+ }
2024
+ await fs.rename(tarSrcBinary, destPath);
2025
+ await fs.rm(tmpDir, { recursive: true, force: true });
2026
+ if (!isWindows)
2027
+ await fs.chmod(destPath, 488);
2028
+ } else if (assetName.endsWith(".zip")) {
2029
+ const tmpArchive = path.join(GITHUB_BIN_DIR, `_tmp_${assetName}`);
2030
+ await fs.writeFile(tmpArchive, assetBuffer);
2031
+ const tmpDir = path.join(GITHUB_BIN_DIR, `_tmp_extract_${tool.id}`);
2032
+ await fs.mkdir(tmpDir, { recursive: true });
2033
+ const extracted = isWindows ? await runCommand("powershell", [
2034
+ "-NoProfile",
2035
+ "-Command",
2036
+ `Expand-Archive -LiteralPath '${tmpArchive}' -DestinationPath '${tmpDir}' -Force`
2037
+ ], GITHUB_BIN_DIR) : await runCommand("unzip", ["-q", "-o", tmpArchive, "-d", tmpDir], GITHUB_BIN_DIR);
2038
+ await fs.rm(tmpArchive, { force: true });
2039
+ if (!extracted) {
2040
+ await fs.rm(tmpDir, { recursive: true, force: true });
2041
+ logSessionStart(`github-install ${tool.id}: zip extraction failed for ${assetName}`);
2042
+ return;
2043
+ }
2044
+ const archiveBinaryName = spec.binaryInArchive ?? binaryName;
2045
+ const srcBinary = await findFirstFileRecursive(tmpDir, getArchiveBinaryCandidates(archiveBinaryName, platform, assetName));
2046
+ if (!srcBinary) {
2047
+ await fs.rm(tmpDir, { recursive: true, force: true });
2048
+ logSessionStart(`github-install ${tool.id}: binary candidates ${JSON.stringify(getArchiveBinaryCandidates(archiveBinaryName, platform, assetName))} not found in zip ${assetName}`);
2049
+ return;
2050
+ }
2051
+ await fs.rename(srcBinary, destPath);
2052
+ await fs.rm(tmpDir, { recursive: true, force: true });
2053
+ if (!isWindows)
2054
+ await fs.chmod(destPath, 488);
2055
+ } else {
2056
+ await writeFileAtomicAsync(destPath, assetBuffer, {
2057
+ bestEffort: false,
2058
+ mode: 488
2059
+ });
2060
+ }
2061
+ } catch (err) {
2062
+ logSessionStart(`github-install ${tool.id}: install failed: ${err.message}`);
2063
+ return;
2064
+ }
2065
+ for (const extraName of spec.extraAssets?.(platform, arch) ?? []) {
2066
+ const extraAsset = releaseJson.assets.find((a) => a.name === extraName);
2067
+ if (!extraAsset) {
2068
+ logSessionStart(`github-install ${tool.id}: required extra asset "${extraName}" not found`);
2069
+ return;
2070
+ }
2071
+ try {
2072
+ const extraBuffer = await httpsGet(extraAsset.browser_download_url);
2073
+ await writeFileAtomicAsync(path.join(GITHUB_BIN_DIR, extraName), extraBuffer, { bestEffort: false, mode: 488 });
2074
+ logSessionStart(`github-install ${tool.id}: installed extra asset ${extraName} (${extraBuffer.length} bytes)`);
2075
+ } catch (err) {
2076
+ logSessionStart(`github-install ${tool.id}: extra asset ${extraName} download failed: ${err.message}`);
2077
+ return;
2078
+ }
2079
+ }
2080
+ debugLog(`[github] installed ${tool.name} → ${destPath}`);
2081
+ logSessionStart(`github-install ${tool.id}: installed → ${destPath}`);
2082
+ return destPath;
2083
+ }
2084
+ async function findFirstFileRecursive(dir, names) {
2085
+ const wanted = new Set(names.map((name) => name.toLowerCase()));
2086
+ const entries = await fs.readdir(dir, { withFileTypes: true });
2087
+ for (const entry of entries) {
2088
+ const full = path.join(dir, entry.name);
2089
+ if (entry.isDirectory()) {
2090
+ const found = await findFirstFileRecursive(full, names);
2091
+ if (found)
2092
+ return found;
2093
+ } else if (wanted.has(entry.name.toLowerCase())) {
2094
+ return full;
2095
+ }
2096
+ }
2097
+ return;
2098
+ }
2099
+ const NEEDS_POSTINSTALL = new Set([
2100
+ "@biomejs/biome",
2101
+ "@ast-grep/cli",
2102
+ "@ast-grep/napi",
2103
+ "esbuild",
2104
+ "intelephense"
2105
+ ]);
2106
+ export function npmToolNeedsPostinstall(packageName) {
2107
+ return NEEDS_POSTINSTALL.has(packageName);
2108
+ }
2109
+ export function getRefreshableManagedNpmTools() {
2110
+ return getRefreshableManagedTools().filter((candidate) => candidate.strategy === "npm").map((candidate) => ({
2111
+ toolId: candidate.toolId,
2112
+ packageName: candidate.packageName,
2113
+ binaryName: candidate.binaryName
2114
+ }));
2115
+ }
2116
+ function mavenCoordinate(spec) {
2117
+ return [
2118
+ spec.repoBaseUrl ?? MAVEN_CENTRAL_BASE,
2119
+ spec.groupId,
2120
+ spec.artifactId,
2121
+ spec.version,
2122
+ spec.classifier ?? ""
2123
+ ].join(":");
2124
+ }
2125
+ export function getRefreshableManagedTools() {
2126
+ const refreshable = [];
2127
+ for (const tool of TOOLS) {
2128
+ switch (tool.installStrategy) {
2129
+ case "npm": {
2130
+ if (!tool.packageName)
2131
+ continue;
2132
+ if (parsePinnedVersion(tool.packageName) !== undefined)
2133
+ continue;
2134
+ if (!tool.binaryName)
2135
+ continue;
2136
+ refreshable.push({
2137
+ toolId: tool.id,
2138
+ strategy: "npm",
2139
+ checkArgs: tool.checkArgs,
2140
+ packageName: tool.packageName,
2141
+ binaryName: tool.binaryName,
2142
+ verificationTimeoutMs: tool.verificationTimeoutMs
2143
+ });
2144
+ break;
2145
+ }
2146
+ case "pip":
2147
+ case "gem": {
2148
+ if (!tool.packageName)
2149
+ continue;
2150
+ refreshable.push({
2151
+ toolId: tool.id,
2152
+ strategy: tool.installStrategy,
2153
+ checkArgs: tool.checkArgs,
2154
+ packageName: tool.packageName
2155
+ });
2156
+ break;
2157
+ }
2158
+ case "github": {
2159
+ if (!tool.github)
2160
+ continue;
2161
+ refreshable.push({
2162
+ toolId: tool.id,
2163
+ strategy: "github",
2164
+ checkArgs: tool.checkArgs
2165
+ });
2166
+ break;
2167
+ }
2168
+ case "maven": {
2169
+ if (!tool.maven)
2170
+ continue;
2171
+ refreshable.push({
2172
+ toolId: tool.id,
2173
+ strategy: "maven",
2174
+ checkArgs: tool.checkArgs,
2175
+ pinnedCoordinate: mavenCoordinate(tool.maven)
2176
+ });
2177
+ break;
2178
+ }
2179
+ case "archive": {
2180
+ if (!tool.archive)
2181
+ continue;
2182
+ const url = resolveArchiveUrl(tool.archive);
2183
+ if (!url)
2184
+ continue;
2185
+ refreshable.push({
2186
+ toolId: tool.id,
2187
+ strategy: "archive",
2188
+ checkArgs: tool.checkArgs,
2189
+ pinnedCoordinate: url
2190
+ });
2191
+ break;
2192
+ }
2193
+ }
2194
+ }
2195
+ return refreshable;
2196
+ }
2197
+ export async function isManagedToolPresent(toolId) {
2198
+ const tool = TOOLS.find((t) => t.id === toolId);
2199
+ if (!tool)
2200
+ return false;
2201
+ switch (tool.installStrategy) {
2202
+ case "npm": {
2203
+ if (!tool.packageName)
2204
+ return false;
2205
+ try {
2206
+ await fs.access(path.join(TOOLS_DIR, "node_modules", tool.packageName, "package.json"));
2207
+ return true;
2208
+ } catch {
2209
+ return false;
2210
+ }
2211
+ }
2212
+ case "github":
2213
+ case "maven":
2214
+ return await findGitHubToolPath(tool.binaryName ?? tool.id) !== undefined;
2215
+ case "archive":
2216
+ return await findGitHubToolPath(tool.binaryName ?? tool.id) !== undefined || await getArchiveTreeBundlePath(tool) !== undefined;
2217
+ case "pip":
2218
+ case "gem": {
2219
+ const cached = (await readProbeCache())[toolId];
2220
+ return cached?.path !== undefined && existsSync(cached.path);
2221
+ }
2222
+ default:
2223
+ return false;
2224
+ }
2225
+ }
2226
+ async function probeManagedToolVersion(tool) {
2227
+ const cached = (await readProbeCache())[tool.id];
2228
+ if (!cached?.path || !existsSync(cached.path))
2229
+ return;
2230
+ try {
2231
+ const result = await safeSpawnAsync(cached.path, tool.checkArgs, {
2232
+ timeout: getToolVerificationTimeout(tool),
2233
+ input: "",
2234
+ ignoreAmbientSignal: true,
2235
+ resourceLabel: `tool-refresh-version:${tool.id}`
2236
+ });
2237
+ if (result.status !== 0)
2238
+ return;
2239
+ return extractVersionToken(`${result.stdout}
2240
+ ${result.stderr}`);
2241
+ } catch {
2242
+ return;
2243
+ }
2244
+ }
2245
+ export async function acquireManagedInstallGate(context) {
2246
+ if (process.env.DM_LENS_DISABLE_TOOL_INSTALL === "1") {
2247
+ return {
2248
+ ok: false,
2249
+ reason: "installation disabled by DM_LENS_DISABLE_TOOL_INSTALL=1"
2250
+ };
2251
+ }
2252
+ if (!assertInstallAllowed(context)) {
2253
+ return {
2254
+ ok: false,
2255
+ reason: `project trust: ${projectTrustDenialReason()}`
2256
+ };
2257
+ }
2258
+ const lock = await acquireInstallLock();
2259
+ if (!lock.release) {
2260
+ return { ok: false, reason: lock.reason ?? "install lock held" };
2261
+ }
2262
+ return { ok: true, release: lock.release };
2263
+ }
2264
+ export async function refreshManagedTool(toolId, known = {}) {
2265
+ const tool = TOOLS.find((t) => t.id === toolId);
2266
+ if (!tool) {
2267
+ return { ok: false, unchanged: true, reason: "unknown tool id" };
2268
+ }
2269
+ if (tool.installStrategy !== "github" && tool.installStrategy !== "pip" && tool.installStrategy !== "gem" && tool.installStrategy !== "maven" && tool.installStrategy !== "archive") {
2270
+ return {
2271
+ ok: false,
2272
+ unchanged: true,
2273
+ reason: `strategy ${tool.installStrategy} is not refreshable here`
2274
+ };
2275
+ }
2276
+ const strategy = tool.installStrategy;
2277
+ const gate = await acquireManagedInstallGate(`managed tool refresh: ${toolId}`);
2278
+ if (!gate.ok) {
2279
+ return { ok: false, unchanged: true, declined: true, reason: gate.reason };
2280
+ }
2281
+ try {
2282
+ switch (strategy) {
2283
+ case "github":
2284
+ return await refreshGitHubManagedTool(tool, known);
2285
+ case "pip":
2286
+ case "gem":
2287
+ return await refreshPackageManagerManagedTool(tool);
2288
+ case "maven":
2289
+ case "archive":
2290
+ return await refreshPinnedManagedTool(tool, known);
2291
+ default:
2292
+ return {
2293
+ ok: false,
2294
+ unchanged: true,
2295
+ reason: `strategy ${strategy} is not refreshable here`
2296
+ };
2297
+ }
2298
+ } finally {
2299
+ await gate.release?.();
2300
+ }
2301
+ }
2302
+ async function refreshGitHubManagedTool(tool, known) {
2303
+ const spec = tool.github;
2304
+ if (!spec)
2305
+ return { ok: false, unchanged: true, reason: "no github spec" };
2306
+ let response;
2307
+ try {
2308
+ response = await httpsGetWithMeta(`https://api.github.com/repos/${spec.repo}/releases/latest`, 5, {
2309
+ ...githubApiAuthHeaders(),
2310
+ ...known.etag ? { "If-None-Match": known.etag } : {}
2311
+ });
2312
+ } catch (err) {
2313
+ return {
2314
+ ok: false,
2315
+ unchanged: true,
2316
+ reason: `release query failed: ${err.message}`
2317
+ };
2318
+ }
2319
+ if (response.statusCode === 304) {
2320
+ return {
2321
+ ok: true,
2322
+ unchanged: true,
2323
+ resolutionId: known.resolutionId,
2324
+ etag: known.etag,
2325
+ version: known.version
2326
+ };
2327
+ }
2328
+ let release;
2329
+ try {
2330
+ const parsed = JSON.parse(response.body.toString("utf8"));
2331
+ if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
2332
+ throw new Error("release metadata is not an object");
2333
+ }
2334
+ release = parsed;
2335
+ } catch (err) {
2336
+ return {
2337
+ ok: false,
2338
+ unchanged: true,
2339
+ reason: `release metadata unparseable: ${err.message}`
2340
+ };
2341
+ }
2342
+ const tag = release.tag_name;
2343
+ if (!tag) {
2344
+ return { ok: false, unchanged: true, reason: "release has no tag_name" };
2345
+ }
2346
+ if (known.resolutionId === tag) {
2347
+ return {
2348
+ ok: true,
2349
+ unchanged: true,
2350
+ resolutionId: tag,
2351
+ etag: response.etag ?? known.etag,
2352
+ version: known.version ?? tag
2353
+ };
2354
+ }
2355
+ const installed = await installGitHubTool(tool, release);
2356
+ if (!installed) {
2357
+ return {
2358
+ ok: false,
2359
+ unchanged: true,
2360
+ resolutionId: known.resolutionId,
2361
+ version: known.version,
2362
+ reason: `install from release ${tag} failed`
2363
+ };
2364
+ }
2365
+ const verified = await verifyRefreshedArtifact(tool, installed);
2366
+ if (!verified) {
2367
+ return {
2368
+ ok: false,
2369
+ unchanged: false,
2370
+ resolutionId: known.resolutionId,
2371
+ version: known.version,
2372
+ reason: `release ${tag} installed but its binary does not run`
2373
+ };
2374
+ }
2375
+ return {
2376
+ ok: true,
2377
+ unchanged: false,
2378
+ resolutionId: tag,
2379
+ etag: response.etag,
2380
+ version: tag
2381
+ };
2382
+ }
2383
+ async function verifyRefreshedArtifact(tool, installedPath) {
2384
+ if (tool.installStrategy === "archive" && !tool.archive?.launcher) {
2385
+ await updateProbeCache(tool.id, installedPath);
2386
+ return true;
2387
+ }
2388
+ if (!await verifyToolBinary(installedPath, undefined, undefined, getToolVerificationTimeout(tool), tool.checkArgs)) {
2389
+ logSessionStart(`managed-tool-refresh ${tool.id}: refreshed artifact at ${installedPath} failed its verification check`);
2390
+ return false;
2391
+ }
2392
+ await updateProbeCache(tool.id, installedPath);
2393
+ return true;
2394
+ }
2395
+ async function refreshPackageManagerManagedTool(tool) {
2396
+ if (!tool.packageName) {
2397
+ return { ok: false, unchanged: true, reason: "no package name" };
2398
+ }
2399
+ const previous = await probeManagedToolVersion(tool);
2400
+ const installed = tool.installStrategy === "pip" ? await installPipTool(tool.packageName, { upgrade: true }) : await installGemTool(tool.packageName);
2401
+ if (!installed) {
2402
+ return {
2403
+ ok: false,
2404
+ unchanged: true,
2405
+ version: previous,
2406
+ reason: `${tool.installStrategy} upgrade failed`
2407
+ };
2408
+ }
2409
+ const current = await probeManagedToolVersion(tool);
2410
+ if (previous !== undefined && current === undefined) {
2411
+ return {
2412
+ ok: false,
2413
+ unchanged: false,
2414
+ version: previous,
2415
+ reason: `${tool.installStrategy} upgrade left the binary unable to report a version`
2416
+ };
2417
+ }
2418
+ return {
2419
+ ok: true,
2420
+ unchanged: previous === undefined || current === undefined || previous === current,
2421
+ version: current ?? previous
2422
+ };
2423
+ }
2424
+ async function refreshPinnedManagedTool(tool, known) {
2425
+ const coordinate = tool.installStrategy === "maven" ? tool.maven && mavenCoordinate(tool.maven) : tool.archive && resolveArchiveUrl(tool.archive);
2426
+ if (!coordinate) {
2427
+ return {
2428
+ ok: false,
2429
+ unchanged: true,
2430
+ reason: "no coordinate for this platform"
2431
+ };
2432
+ }
2433
+ if (known.resolutionId === coordinate) {
2434
+ return {
2435
+ ok: true,
2436
+ unchanged: true,
2437
+ resolutionId: coordinate,
2438
+ version: known.version
2439
+ };
2440
+ }
2441
+ const installed = tool.installStrategy === "maven" ? await installMavenTool(tool) : await installArchiveTool(tool);
2442
+ if (!installed) {
2443
+ return {
2444
+ ok: false,
2445
+ unchanged: true,
2446
+ resolutionId: known.resolutionId,
2447
+ version: known.version,
2448
+ reason: `reinstall from ${coordinate} failed`
2449
+ };
2450
+ }
2451
+ if (!await verifyRefreshedArtifact(tool, installed)) {
2452
+ return {
2453
+ ok: false,
2454
+ unchanged: false,
2455
+ resolutionId: known.resolutionId,
2456
+ version: known.version,
2457
+ reason: `reinstall from ${coordinate} produced an artifact that does not run`
2458
+ };
2459
+ }
2460
+ return {
2461
+ ok: true,
2462
+ unchanged: known.resolutionId === undefined,
2463
+ resolutionId: coordinate,
2464
+ version: coordinate
2465
+ };
2466
+ }
2467
+ export function resolveManagedNpmBinPath(binaryName) {
2468
+ const binBase = path.join(TOOLS_DIR, "node_modules", ".bin", binaryName);
2469
+ return installerPlatform() === "win32" ? `${binBase}.cmd` : binBase;
2470
+ }
2471
+ export function invalidateManagedToolResolution(toolId) {
2472
+ resolvedPathCache.delete(toolId);
2473
+ if (_probeCache !== null)
2474
+ delete _probeCache[toolId];
2475
+ markProbeCacheChange(toolId, null);
2476
+ }
2477
+ const MAVEN_CENTRAL_BASE = "https://repo1.maven.org/maven2";
2478
+ async function installMavenTool(tool) {
2479
+ const spec = tool.maven;
2480
+ if (!spec)
2481
+ return;
2482
+ const binaryName = tool.binaryName ?? tool.id;
2483
+ const isWindows = process.platform === "win32";
2484
+ if (!await isCommandAvailable("java", ["-version"])) {
2485
+ logSessionStart(`maven-install ${tool.id}: java not found — a JAR tool can't run without a JRE`);
2486
+ return;
2487
+ }
2488
+ let base = spec.repoBaseUrl ?? MAVEN_CENTRAL_BASE;
2489
+ while (base.endsWith("/"))
2490
+ base = base.slice(0, -1);
2491
+ const groupPath = spec.groupId.replace(/\./g, "/");
2492
+ const jarFile = `${spec.artifactId}-${spec.version}${spec.classifier ? `-${spec.classifier}` : ""}.jar`;
2493
+ const url = `${base}/${groupPath}/${spec.artifactId}/${spec.version}/${jarFile}`;
2494
+ lastInstallResolutionId.set(tool.id, mavenCoordinate(spec));
2495
+ logSessionStart(`maven-install ${tool.id}: downloading ${url}`);
2496
+ let jarBuffer;
2497
+ try {
2498
+ jarBuffer = await httpsGet(url);
2499
+ } catch (err) {
2500
+ logSessionStart(`maven-install ${tool.id}: download failed: ${err.message}`);
2501
+ return;
2502
+ }
2503
+ try {
2504
+ await fs.mkdir(GITHUB_BIN_DIR, { recursive: true });
2505
+ const jarPath = path.join(GITHUB_BIN_DIR, `${tool.id}.jar`);
2506
+ await writeFileAtomicAsync(jarPath, jarBuffer, { bestEffort: false });
2507
+ const launcherName = isWindows ? `${binaryName}.bat` : binaryName;
2508
+ const launcherPath = path.join(GITHUB_BIN_DIR, launcherName);
2509
+ if (isWindows) {
2510
+ await writeFileAtomicAsync(launcherPath, `@echo off\r
2511
+ java -jar "%~dp0${tool.id}.jar" %*\r
2512
+ `, { bestEffort: false });
2513
+ } else {
2514
+ await writeFileAtomicAsync(launcherPath, `#!/bin/sh
2515
+ exec java -jar "$(dirname "$0")/${tool.id}.jar" "$@"
2516
+ `, { bestEffort: false, mode: 488 });
2517
+ }
2518
+ logSessionStart(`maven-install ${tool.id}: installed → ${launcherPath} (${jarBuffer.length} bytes)`);
2519
+ debugLog(`[maven] installed ${tool.name} → ${launcherPath}`);
2520
+ return launcherPath;
2521
+ } catch (err) {
2522
+ logSessionStart(`maven-install ${tool.id}: install failed: ${err.message}`);
2523
+ return;
2524
+ }
2525
+ }
2526
+ export function resolveArchiveUrl(spec, platform = process.platform, arch = process.arch) {
2527
+ return typeof spec.url === "function" ? spec.url(platform, arch) : spec.url;
2528
+ }
2529
+ export async function swapExtractedDir(toolId, tmpDir, finalDir) {
2530
+ const backupDir = `${finalDir}.rollback`;
2531
+ await fs.rm(backupDir, { recursive: true, force: true });
2532
+ let hadPrevious = false;
2533
+ try {
2534
+ await fs.rename(finalDir, backupDir);
2535
+ hadPrevious = true;
2536
+ } catch (err) {
2537
+ if (err.code !== "ENOENT")
2538
+ throw err;
2539
+ }
2540
+ try {
2541
+ await fs.rename(tmpDir, finalDir);
2542
+ } catch (err) {
2543
+ if (hadPrevious) {
2544
+ try {
2545
+ await fs.rename(backupDir, finalDir);
2546
+ } catch (rollbackErr) {
2547
+ recordDegradationOnce({
2548
+ kind: "managed-tool-refresh",
2549
+ subject: toolId,
2550
+ reason: `swap rollback failed after a failed install: working copy orphaned at ${backupDir} (${rollbackErr.message})`
2551
+ });
2552
+ logSessionStart(`archive-install ${toolId}: swap rollback failed — working copy orphaned at ${backupDir} (${rollbackErr.message})`);
2553
+ }
2554
+ }
2555
+ throw err;
2556
+ }
2557
+ if (hadPrevious) {
2558
+ await fs.rm(backupDir, { recursive: true, force: true }).catch(() => {});
2559
+ }
2560
+ }
2561
+ async function installArchiveTool(tool) {
2562
+ const spec = tool.archive;
2563
+ if (!spec)
2564
+ return;
2565
+ const binaryName = tool.binaryName ?? tool.id;
2566
+ const isWindows = process.platform === "win32";
2567
+ const url = resolveArchiveUrl(spec);
2568
+ if (!url) {
2569
+ logSessionStart(`archive-install ${tool.id}: no archive for ${process.platform}/${process.arch} — unsupported, skipping`);
2570
+ return;
2571
+ }
2572
+ lastInstallResolutionId.set(tool.id, url);
2573
+ logSessionStart(`archive-install ${tool.id}: downloading ${url}`);
2574
+ let archiveBuffer;
2575
+ try {
2576
+ archiveBuffer = await httpsGet(url);
2577
+ } catch (err) {
2578
+ logSessionStart(`archive-install ${tool.id}: download failed: ${err.message}`);
2579
+ return;
2580
+ }
2581
+ const extractName = tool.id;
2582
+ const tmpExtractName = `${extractName}.refresh-tmp`;
2583
+ const archiveName = `${tool.id}.download.${spec.kind === "zip" ? "zip" : "tgz"}`;
2584
+ const extractDir = path.join(TOOLS_DIR, extractName);
2585
+ const tmpExtractDir = path.join(TOOLS_DIR, tmpExtractName);
2586
+ const tmpArchive = path.join(TOOLS_DIR, archiveName);
2587
+ try {
2588
+ await fs.mkdir(TOOLS_DIR, { recursive: true });
2589
+ await fs.rm(tmpExtractDir, { recursive: true, force: true });
2590
+ await fs.mkdir(tmpExtractDir, { recursive: true });
2591
+ await fs.writeFile(tmpArchive, archiveBuffer);
2592
+ const stripComponents = spec.stripComponents ?? 1;
2593
+ const tarArgs = [
2594
+ spec.kind === "tgz" ? "-xzf" : "-xf",
2595
+ archiveName,
2596
+ "-C",
2597
+ tmpExtractName,
2598
+ ...stripComponents > 0 ? [`--strip-components=${stripComponents}`] : []
2599
+ ];
2600
+ const tarBin = isWindows ? `${process.env.SystemRoot ?? "C:\\Windows"}\\System32\\tar.exe` : "tar";
2601
+ const extractResult = await safeSpawnAsync(tarBin, tarArgs, {
2602
+ cwd: TOOLS_DIR,
2603
+ timeout: 120000,
2604
+ ignoreAmbientSignal: true,
2605
+ lifetimeCoupled: true
2606
+ });
2607
+ const extracted = {
2608
+ ok: extractResult.status === 0,
2609
+ stderr: extractResult.error?.message ?? extractResult.stderr
2610
+ };
2611
+ await fs.rm(tmpArchive, { force: true });
2612
+ if (!extracted.ok) {
2613
+ logSessionStart(`archive-install ${tool.id}: extraction failed: ${extracted.stderr} — keeping installed version`);
2614
+ await fs.rm(tmpExtractDir, { recursive: true, force: true }).catch(() => {});
2615
+ return;
2616
+ }
2617
+ if (!spec.launcher) {
2618
+ const tmpMarker = spec.treeMarker ? path.join(tmpExtractDir, ...spec.treeMarker.split("/")) : tmpExtractDir;
2619
+ try {
2620
+ await fs.access(tmpMarker);
2621
+ } catch {
2622
+ logSessionStart(`archive-install ${tool.id}: tree marker not found at ${tmpMarker} after extraction — keeping installed version`);
2623
+ await fs.rm(tmpExtractDir, { recursive: true, force: true }).catch(() => {});
2624
+ return;
2625
+ }
2626
+ await swapExtractedDir(tool.id, tmpExtractDir, extractDir);
2627
+ logSessionStart(`archive-install ${tool.id}: installed tree bundle → ${extractDir} (extracted ${archiveBuffer.length} bytes)`);
2628
+ debugLog(`[archive] installed ${tool.name} bundle → ${extractDir}`);
2629
+ return extractDir;
2630
+ }
2631
+ const launcherParts = spec.launcher.split("/").map((p) => p);
2632
+ const tmpInnerLauncher = path.join(tmpExtractDir, ...launcherParts);
2633
+ const tmpResolvedInner = isWindows ? `${tmpInnerLauncher}.bat` : tmpInnerLauncher;
2634
+ try {
2635
+ await fs.access(tmpResolvedInner);
2636
+ } catch {
2637
+ logSessionStart(`archive-install ${tool.id}: launcher not found at ${tmpResolvedInner} after extraction — keeping installed version`);
2638
+ await fs.rm(tmpExtractDir, { recursive: true, force: true }).catch(() => {});
2639
+ return;
2640
+ }
2641
+ if (!isWindows)
2642
+ await fs.chmod(tmpResolvedInner, 488).catch(() => {});
2643
+ await swapExtractedDir(tool.id, tmpExtractDir, extractDir);
2644
+ const innerLauncher = path.join(extractDir, ...launcherParts);
2645
+ const resolvedInner = isWindows ? `${innerLauncher}.bat` : innerLauncher;
2646
+ await fs.mkdir(GITHUB_BIN_DIR, { recursive: true });
2647
+ const launcherName = isWindows ? `${binaryName}.bat` : binaryName;
2648
+ const shimPath = path.join(GITHUB_BIN_DIR, launcherName);
2649
+ if (isWindows) {
2650
+ await writeFileAtomicAsync(shimPath, `@echo off\r
2651
+ call "${resolvedInner}" %*\r
2652
+ `, { bestEffort: false });
2653
+ } else {
2654
+ await writeFileAtomicAsync(shimPath, `#!/bin/sh
2655
+ exec "${resolvedInner}" "$@"
2656
+ `, { bestEffort: false, mode: 488 });
2657
+ }
2658
+ logSessionStart(`archive-install ${tool.id}: installed → ${shimPath} (extracted ${archiveBuffer.length} bytes)`);
2659
+ debugLog(`[archive] installed ${tool.name} → ${shimPath}`);
2660
+ return shimPath;
2661
+ } catch (err) {
2662
+ await fs.rm(tmpArchive, { force: true }).catch(() => {});
2663
+ await fs.rm(tmpExtractDir, { recursive: true, force: true }).catch(() => {});
2664
+ logSessionStart(`archive-install ${tool.id}: install failed: ${err.message} — keeping installed version`);
2665
+ return;
2666
+ }
2667
+ }
2668
+ async function installNpmTool(packageName, binaryName, verificationArgs = ["--version"], verificationTimeoutMs = 1e4) {
2669
+ try {
2670
+ await fs.mkdir(TOOLS_DIR, { recursive: true });
2671
+ const packageJsonPath = path.join(TOOLS_DIR, "package.json");
2672
+ try {
2673
+ await fs.access(packageJsonPath);
2674
+ } catch {
2675
+ await writeFileAtomicAsync(packageJsonPath, JSON.stringify({ name: "dm-lens-tools", version: "1.0.0" }, null, 2), { bestEffort: false });
2676
+ }
2677
+ const isWindows = installerPlatform() === "win32";
2678
+ const pm = await resolveNodePackageManager(TOOLS_DIR);
2679
+ const testNpmScript = process.env.DM_LENS_TEST_MODE === "1" ? process.env.DM_LENS_TEST_NPM_SCRIPT : undefined;
2680
+ const pmCommand = testNpmScript ? process.execPath : pmBinary(pm);
2681
+ const needsScripts = NEEDS_POSTINSTALL.has(packageName);
2682
+ const baseInstallArgs = installArgs(pm, packageName, {
2683
+ ignoreScripts: !needsScripts
2684
+ });
2685
+ const INSTALL_TIMEOUT_MS = Number(process.env.DM_LENS_INSTALL_TIMEOUT_MS) || 120000;
2686
+ const runInstallAttempt = async (args) => {
2687
+ const result = await safeSpawnAsync(pmCommand, args, {
2688
+ cwd: TOOLS_DIR,
2689
+ timeout: INSTALL_TIMEOUT_MS,
2690
+ ignoreAmbientSignal: true,
2691
+ lifetimeCoupled: true
2692
+ });
2693
+ return {
2694
+ ok: result.status === 0,
2695
+ stderr: result.error?.message ?? result.stderr
2696
+ };
2697
+ };
2698
+ let outcome = await runInstallAttempt([
2699
+ ...testNpmScript ? [testNpmScript] : [],
2700
+ ...baseInstallArgs
2701
+ ]);
2702
+ const erResolve = outcome.ok === false && /npm\s+error\s+ERESOLVE|\bERESOLVE\b|could not resolve/i.test(outcome.stderr);
2703
+ if (pm === "npm" && erResolve) {
2704
+ const retryArgs = installArgs(pm, packageName, {
2705
+ ignoreScripts: !needsScripts,
2706
+ legacyPeerDeps: true
2707
+ });
2708
+ logSessionStart(`auto-install npm ${packageName}: retry with --legacy-peer-deps after ERESOLVE`);
2709
+ outcome = await runInstallAttempt([
2710
+ ...testNpmScript ? [testNpmScript] : [],
2711
+ ...retryArgs
2712
+ ]);
2713
+ }
2714
+ if (!outcome.ok) {
2715
+ throw new Error(`Failed to install ${packageName}: ${outcome.stderr}`);
2716
+ }
2717
+ const binBase = path.join(TOOLS_DIR, "node_modules", ".bin", binaryName);
2718
+ const binPath = installerPlatform() === "win32" ? `${binBase}.cmd` : binBase;
2719
+ if (installerPlatform() !== "win32") {
2720
+ try {
2721
+ await fs.chmod(binPath, 488);
2722
+ } catch {}
2723
+ }
2724
+ await new Promise((r) => setTimeout(r, 500));
2725
+ debugLog(`Verifying ${binaryName}...`);
2726
+ let isValid = false;
2727
+ let lastAttemptTransient = false;
2728
+ for (let attempt = 1;attempt <= 3; attempt++) {
2729
+ lastAttemptTransient = false;
2730
+ isValid = await verifyToolBinary(binPath, undefined, () => {
2731
+ lastAttemptTransient = true;
2732
+ }, verificationTimeoutMs, verificationArgs);
2733
+ if (isValid)
2734
+ break;
2735
+ if (attempt < 3) {
2736
+ logSessionStart(`auto-install verify ${binaryName}: attempt ${attempt} failed, retrying in ${attempt}s`);
2737
+ await new Promise((r) => setTimeout(r, 1000 * attempt));
2738
+ }
2739
+ }
2740
+ if (!isValid && lastAttemptTransient) {
2741
+ logSessionStart(`auto-install ${packageName}: verification inconclusive (transient); keeping installation for re-probe`);
2742
+ return;
2743
+ }
2744
+ if (!isValid) {
2745
+ logSessionStart(`auto-install ${packageName}: installed but verification failed, cleaning up`);
2746
+ try {
2747
+ const packagePath = path.join(TOOLS_DIR, "node_modules", packageName);
2748
+ await fs.rm(packagePath, { recursive: true, force: true });
2749
+ await fs.rm(binBase, { force: true });
2750
+ if (isWindows) {
2751
+ await fs.rm(`${binBase}.cmd`, { force: true });
2752
+ await fs.rm(`${binBase}.ps1`, { force: true });
2753
+ }
2754
+ } catch {}
2755
+ return;
2756
+ }
2757
+ return binPath;
2758
+ } catch (err) {
2759
+ logSessionStart(`auto-install npm ${packageName}: exception: ${err.message}`);
2760
+ return;
2761
+ }
2762
+ }
2763
+ async function installPipTool(packageName, options = {}) {
2764
+ try {
2765
+ const isWindows = process.platform === "win32";
2766
+ const verb = options.upgrade ? ["install", "-U", "--user"] : ["install", "--user"];
2767
+ const pipCandidates = isWindows ? [
2768
+ { command: "pip", args: [...verb, packageName] },
2769
+ {
2770
+ command: "py",
2771
+ args: ["-m", "pip", ...verb, packageName]
2772
+ },
2773
+ {
2774
+ command: "python",
2775
+ args: ["-m", "pip", ...verb, packageName]
2776
+ }
2777
+ ] : [
2778
+ { command: "pip3", args: [...verb, packageName] },
2779
+ { command: "pip", args: [...verb, packageName] },
2780
+ {
2781
+ command: "python3",
2782
+ args: ["-m", "pip", ...verb, packageName]
2783
+ },
2784
+ {
2785
+ command: "python",
2786
+ args: ["-m", "pip", ...verb, packageName]
2787
+ }
2788
+ ];
2789
+ let lastError = "";
2790
+ for (const candidate of pipCandidates) {
2791
+ const pipResult = await safeSpawnAsync(candidate.command, candidate.args, {
2792
+ timeout: 120000,
2793
+ ignoreAmbientSignal: true,
2794
+ lifetimeCoupled: true
2795
+ });
2796
+ const outcome = {
2797
+ ok: pipResult.status === 0,
2798
+ error: (pipResult.error?.message ?? pipResult.stderr).trim()
2799
+ };
2800
+ if (outcome.ok) {
2801
+ const userBaseResult = await new Promise((resolve) => {
2802
+ let probe;
2803
+ try {
2804
+ probe = spawn(candidate.command, ["-m", "site", "--user-base"], {
2805
+ stdio: ["ignore", "pipe", "pipe"],
2806
+ shell: isWindows
2807
+ });
2808
+ } catch {
2809
+ resolve("");
2810
+ return;
2811
+ }
2812
+ let stdout = "";
2813
+ probe.stdout?.on("data", (data) => stdout += data);
2814
+ probe.on("exit", (code) => {
2815
+ if (code === 0)
2816
+ resolve(stdout.trim());
2817
+ else
2818
+ resolve("");
2819
+ });
2820
+ probe.on("error", () => resolve(""));
2821
+ });
2822
+ if (userBaseResult) {
2823
+ const candidateScriptDirs = [
2824
+ path.join(userBaseResult, isWindows ? "Scripts" : "bin")
2825
+ ];
2826
+ if (isWindows) {
2827
+ try {
2828
+ const children = await fs.readdir(userBaseResult, {
2829
+ withFileTypes: true
2830
+ });
2831
+ for (const entry of children) {
2832
+ if (!entry.isDirectory())
2833
+ continue;
2834
+ if (!/^python\d+$/i.test(entry.name))
2835
+ continue;
2836
+ candidateScriptDirs.push(path.join(userBaseResult, entry.name, "Scripts"));
2837
+ }
2838
+ } catch {}
2839
+ }
2840
+ const currentPath = process.env.PATH || process.env.Path || process.env.path || "";
2841
+ const separator = isWindows ? ";" : ":";
2842
+ const normalizedPath = currentPath.toLowerCase().split(separator).map((p) => p.trim());
2843
+ for (const scriptsDir of candidateScriptDirs) {
2844
+ try {
2845
+ await fs.access(scriptsDir);
2846
+ if (!normalizedPath.includes(scriptsDir.toLowerCase())) {
2847
+ const existingPath = process.env.PATH || process.env.Path || process.env.path || "";
2848
+ const updatedPath = `${scriptsDir}${separator}${existingPath}`;
2849
+ process.env.PATH = updatedPath;
2850
+ if (isWindows) {
2851
+ process.env.Path = updatedPath;
2852
+ }
2853
+ debugLog(`Added pip user scripts dir to PATH: ${scriptsDir}`);
2854
+ }
2855
+ } catch {
2856
+ debugLog(`pip user scripts dir not accessible: ${scriptsDir}`);
2857
+ }
2858
+ }
2859
+ }
2860
+ return packageName;
2861
+ }
2862
+ lastError = `${candidate.command} ${candidate.args.join(" ")}: ${outcome.error}`;
2863
+ debugLog(`[pip-fallback] ${lastError}`);
2864
+ }
2865
+ throw new Error(`Failed to install ${packageName}: no usable pip command found (${lastError || "unknown error"})`);
2866
+ } catch (err) {
2867
+ logSessionStart(`auto-install pip ${packageName}: exception: ${err.message}`);
2868
+ return;
2869
+ }
2870
+ }
2871
+ async function installGemTool(packageName) {
2872
+ try {
2873
+ const gemResult = await safeSpawnAsync("gem", ["install", packageName, "--no-document"], {
2874
+ timeout: 120000,
2875
+ ignoreAmbientSignal: true,
2876
+ lifetimeCoupled: true
2877
+ });
2878
+ const outcome = {
2879
+ ok: gemResult.status === 0,
2880
+ error: (gemResult.error?.message ?? gemResult.stderr).trim()
2881
+ };
2882
+ if (!outcome.ok) {
2883
+ throw new Error(`Failed to install ${packageName} via gem: ${outcome.error}`);
2884
+ }
2885
+ return packageName;
2886
+ } catch (err) {
2887
+ logSessionStart(`auto-install gem ${packageName}: exception: ${err.message}`);
2888
+ return;
2889
+ }
2890
+ }
2891
+ async function stampInstallResolution(toolId) {
2892
+ const tool = TOOLS.find((t) => t.id === toolId);
2893
+ if (tool?.installStrategy === "npm")
2894
+ return;
2895
+ try {
2896
+ const resolutionId = lastInstallResolutionId.get(toolId);
2897
+ const refresh = await import("./managed-tool-refresh.js");
2898
+ await refresh.stampManagedToolInstall(toolId, resolutionId);
2899
+ } catch {}
2900
+ }
2901
+ async function finishInstallAttempt(toolId, ok, startedAt) {
2902
+ logSessionStart(`auto-install ${toolId}: ${ok ? "success" : "failed"} (${Date.now() - startedAt}ms)`);
2903
+ if (ok)
2904
+ await stampInstallResolution(toolId);
2905
+ noteInstallAttempt(toolId, ok ? "succeeded" : "failed", ok ? undefined : installFailureReasons.get(toolId) ?? "install failed");
2906
+ if (ok) {
2907
+ resetSafeSpawnWindowsCommandCache();
2908
+ try {
2909
+ const { resetMadgeManagedPathMemo } = await import("../dependency-checker.js");
2910
+ resetMadgeManagedPathMemo();
2911
+ } catch (err) {
2912
+ logSessionStart(`auto-install ${toolId}: madge memo reset failed: ${err.message}`);
2913
+ }
2914
+ }
2915
+ return ok;
2916
+ }
2917
+ export async function installTool(toolId) {
2918
+ if (process.env.DM_LENS_DISABLE_TOOL_INSTALL === "1") {
2919
+ installFailureReasons.set(toolId, "installation disabled by DM_LENS_DISABLE_TOOL_INSTALL=1");
2920
+ noteInstallAttempt(toolId, "declined", "installation disabled by DM_LENS_DISABLE_TOOL_INSTALL=1");
2921
+ logSessionStart(`auto-install ${toolId}: refused — DM_LENS_DISABLE_TOOL_INSTALL=1`);
2922
+ return false;
2923
+ }
2924
+ const tool = TOOLS.find((t) => t.id === toolId);
2925
+ if (!tool) {
2926
+ noteInstallAttempt(toolId, "declined", "unknown tool id");
2927
+ logSessionStart(`auto-install ${toolId}: unknown tool id`);
2928
+ return false;
2929
+ }
2930
+ const startedAt = Date.now();
2931
+ logSessionStart(`auto-install ${tool.id}: start strategy=${tool.installStrategy} package=${tool.packageName ?? "n/a"}`);
2932
+ try {
2933
+ switch (tool.installStrategy) {
2934
+ case "npm": {
2935
+ if (!tool.packageName || !tool.binaryName)
2936
+ return false;
2937
+ const npmPath = await installNpmTool(tool.packageName, tool.binaryName, tool.checkArgs, getToolVerificationTimeout(tool));
2938
+ if (npmPath !== undefined) {
2939
+ await import("./managed-tool-refresh.js").then((m) => m.stampManagedToolInstalled(tool.id, tool.packageName)).catch(() => {});
2940
+ }
2941
+ return finishInstallAttempt(tool.id, npmPath !== undefined, startedAt);
2942
+ }
2943
+ case "pip": {
2944
+ if (!tool.packageName)
2945
+ return false;
2946
+ const pipPath = await installPipTool(tool.packageName);
2947
+ return finishInstallAttempt(tool.id, pipPath !== undefined, startedAt);
2948
+ }
2949
+ case "gem": {
2950
+ if (!tool.packageName)
2951
+ return false;
2952
+ const gemPath = await installGemTool(tool.packageName);
2953
+ return finishInstallAttempt(tool.id, gemPath !== undefined, startedAt);
2954
+ }
2955
+ case "github": {
2956
+ if (!tool.github)
2957
+ return false;
2958
+ const ghPath = await installGitHubTool(tool);
2959
+ return finishInstallAttempt(tool.id, ghPath !== undefined, startedAt);
2960
+ }
2961
+ case "maven": {
2962
+ if (!tool.maven)
2963
+ return false;
2964
+ const mavenPath = await installMavenTool(tool);
2965
+ return finishInstallAttempt(tool.id, mavenPath !== undefined, startedAt);
2966
+ }
2967
+ case "archive": {
2968
+ if (!tool.archive)
2969
+ return false;
2970
+ const archivePath = await installArchiveTool(tool);
2971
+ return finishInstallAttempt(tool.id, archivePath !== undefined, startedAt);
2972
+ }
2973
+ default:
2974
+ logSessionStart(`auto-install ${tool.id}: unsupported strategy`);
2975
+ return false;
2976
+ }
2977
+ } catch (err) {
2978
+ logSessionStart(`auto-install ${tool.id}: exception ${err.message} (${Date.now() - startedAt}ms)`);
2979
+ return false;
2980
+ }
2981
+ }
2982
+ export async function ensureTool(toolId, opts) {
2983
+ if (opts?.allowInstall !== false && !assertInstallAllowed(`managed tool ensure: ${toolId}`)) {
2984
+ logSessionStart(`auto-install ensure ${toolId}: install gated — ${projectTrustDenialReason()}; discovery only`);
2985
+ const denialReason = projectTrustDenialReason();
2986
+ const discovered = await ensureToolResolved(toolId, {
2987
+ ...opts,
2988
+ allowInstall: false
2989
+ });
2990
+ noteInstallAttempt(toolId, "declined", `project trust: ${denialReason}`);
2991
+ return discovered;
2992
+ }
2993
+ return ensureToolResolved(toolId, opts);
2994
+ }
2995
+ async function ensureToolResolved(toolId, opts) {
2996
+ installFailureReasons.delete(toolId);
2997
+ installAttempts.delete(toolId);
2998
+ lastEnsureResolutionSource.delete(toolId);
2999
+ const cacheResolvedPath = (result) => {
3000
+ if (result) {
3001
+ resolvedPathCache.set(toolId, result);
3002
+ updateProbeCache(toolId, result, wasLastResolveTransient(toolId));
3003
+ }
3004
+ return result;
3005
+ };
3006
+ if (opts?.forceReinstall) {
3007
+ const ensureStartMs = Date.now();
3008
+ logSessionStart(`auto-install ensure ${toolId}: force reinstall — clearing caches`);
3009
+ resolvedPathCache.delete(toolId);
3010
+ try {
3011
+ const probeCache = await readProbeCache();
3012
+ delete probeCache[toolId];
3013
+ markProbeCacheChange(toolId, null);
3014
+ } catch {}
3015
+ if (opts.allowInstall === false) {
3016
+ noteInstallAttempt(toolId, "declined", "install disabled by caller");
3017
+ logSessionStart(`auto-install ensure ${toolId}: force reinstall blocked — install disabled, discovery only (${Date.now() - ensureStartMs}ms)`);
3018
+ return cacheResolvedPath(await getToolPath(toolId));
3019
+ }
3020
+ if (process.env.DM_LENS_DISABLE_TOOL_INSTALL === "1") {
3021
+ installFailureReasons.set(toolId, "installation disabled by DM_LENS_DISABLE_TOOL_INSTALL=1");
3022
+ noteInstallAttempt(toolId, "declined", "installation disabled by DM_LENS_DISABLE_TOOL_INSTALL=1");
3023
+ logSessionStart(`auto-install ensure ${toolId}: refused — DM_LENS_DISABLE_TOOL_INSTALL=1`);
3024
+ return;
3025
+ }
3026
+ const lock = await acquireInstallLock();
3027
+ if (!lock.release) {
3028
+ noteInstallAttempt(toolId, "skipped", lock.reason ?? "install lock held");
3029
+ logSessionStart(`auto-install ensure ${toolId}: ${lock.reason}`);
3030
+ return;
3031
+ }
3032
+ let installed;
3033
+ try {
3034
+ installed = await installTool(toolId);
3035
+ } finally {
3036
+ await lock.release();
3037
+ }
3038
+ if (!installed) {
3039
+ noteInstallAttemptIfUnrecorded(toolId, "failed", "install failed");
3040
+ logSessionStart(`auto-install ensure ${toolId}: force reinstall failed (${Date.now() - ensureStartMs}ms)`);
3041
+ return;
3042
+ }
3043
+ const result = cacheResolvedPath(await getToolPath(toolId));
3044
+ if (result) {
3045
+ logSessionStart(`auto-install ensure ${toolId}: force reinstall success at ${result} (${Date.now() - ensureStartMs}ms)`);
3046
+ }
3047
+ return result;
3048
+ }
3049
+ const cached = resolvedPathCache.get(toolId);
3050
+ if (cached) {
3051
+ if (!isFullyQualified(cached)) {
3052
+ lastEnsureResolutionSource.set(toolId, "session-cache");
3053
+ return cached;
3054
+ }
3055
+ try {
3056
+ await fs.access(cached);
3057
+ lastEnsureResolutionSource.set(toolId, "session-cache");
3058
+ return cached;
3059
+ } catch {}
3060
+ resolvedPathCache.delete(toolId);
3061
+ const probeCache = await readProbeCache();
3062
+ delete probeCache[toolId];
3063
+ markProbeCacheChange(toolId, null);
3064
+ logSessionStart(`auto-install ensure ${toolId}: cached path disappeared; re-probing`);
3065
+ }
3066
+ const diskCached = await checkProbeCache(toolId);
3067
+ if (diskCached) {
3068
+ resolvedPathCache.set(toolId, diskCached);
3069
+ lastEnsureResolutionSource.set(toolId, "probe-cache");
3070
+ logSessionStart(`auto-install ensure ${toolId}: probe cache hit → ${diskCached}`);
3071
+ return diskCached;
3072
+ }
3073
+ const inFlightKey = opts?.allowInstall === false ? `${toolId}:discovery-only` : toolId;
3074
+ const inFlight = ensureInFlight.get(inFlightKey);
3075
+ if (inFlight) {
3076
+ logSessionStart(`auto-install ensure ${toolId}: waiting for in-flight ensure (${inFlightKey})`);
3077
+ return inFlight;
3078
+ }
3079
+ const ensureStartMs = Date.now();
3080
+ const ensurePromise = (async () => {
3081
+ logSessionStart(`auto-install ensure ${toolId}: start`);
3082
+ const existingPath = await getToolPath(toolId);
3083
+ if (existingPath) {
3084
+ const tool = TOOLS.find((t) => t.id === toolId);
3085
+ const pinnedVersion = tool?.installStrategy === "npm" && tool.packageName ? parsePinnedVersion(tool.packageName) : undefined;
3086
+ if (pinnedVersion) {
3087
+ const seenVersion = lastManagedInstallVersion.get(toolId);
3088
+ if (seenVersion && seenVersion !== pinnedVersion) {
3089
+ lastManagedInstallVersion.delete(toolId);
3090
+ logSessionStart(`auto-install ensure ${toolId}: version drift (installed ${seenVersion} != pinned ${pinnedVersion}) — forcing reinstall (${Date.now() - ensureStartMs}ms)`);
3091
+ return ensureTool(toolId, {
3092
+ forceReinstall: true,
3093
+ allowInstall: opts?.allowInstall
3094
+ });
3095
+ }
3096
+ }
3097
+ resolvedPathCache.set(toolId, existingPath);
3098
+ updateProbeCache(toolId, existingPath, wasLastResolveTransient(toolId));
3099
+ lastEnsureResolutionSource.set(toolId, "path");
3100
+ logSessionStart(`auto-install ensure ${toolId}: already available at ${existingPath} (${Date.now() - ensureStartMs}ms)`);
3101
+ return existingPath;
3102
+ }
3103
+ if (opts?.allowInstall === false) {
3104
+ noteInstallAttempt(toolId, "declined", "install disabled by caller");
3105
+ logSessionStart(`auto-install ensure ${toolId}: install disabled — discovery only, not found (${Date.now() - ensureStartMs}ms)`);
3106
+ return;
3107
+ }
3108
+ if (process.env.DM_LENS_DISABLE_TOOL_INSTALL === "1") {
3109
+ installFailureReasons.set(toolId, "installation disabled by DM_LENS_DISABLE_TOOL_INSTALL=1");
3110
+ noteInstallAttempt(toolId, "declined", "installation disabled by DM_LENS_DISABLE_TOOL_INSTALL=1");
3111
+ logSessionStart(`auto-install ensure ${toolId}: refused — DM_LENS_DISABLE_TOOL_INSTALL=1 (${Date.now() - ensureStartMs}ms)`);
3112
+ return;
3113
+ }
3114
+ const lock = await acquireInstallLock();
3115
+ if (!lock.release) {
3116
+ installFailureReasons.set(toolId, lock.reason ?? "install lock failed");
3117
+ noteInstallAttempt(toolId, "skipped", lock.reason ?? "install lock held");
3118
+ logSessionStart(`auto-install ensure ${toolId}: ${lock.reason}`);
3119
+ return;
3120
+ }
3121
+ let installed;
3122
+ try {
3123
+ const installedByPeer = await getToolPath(toolId);
3124
+ if (installedByPeer) {
3125
+ noteInstallAttempt(toolId, "succeeded", "installed by a concurrent process");
3126
+ resolvedPathCache.set(toolId, installedByPeer);
3127
+ updateProbeCache(toolId, installedByPeer, wasLastResolveTransient(toolId));
3128
+ return installedByPeer;
3129
+ }
3130
+ installed = await installTool(toolId);
3131
+ } finally {
3132
+ await lock.release();
3133
+ }
3134
+ if (!installed) {
3135
+ noteInstallAttemptIfUnrecorded(toolId, "failed", "install failed");
3136
+ logSessionStart(`auto-install ensure ${toolId}: unavailable (${Date.now() - ensureStartMs}ms)`);
3137
+ return;
3138
+ }
3139
+ const result = await getToolPath(toolId);
3140
+ if (result) {
3141
+ resolvedPathCache.set(toolId, result);
3142
+ updateProbeCache(toolId, result, wasLastResolveTransient(toolId));
3143
+ logSessionStart(`auto-install ensure ${toolId}: success at ${result} (${Date.now() - ensureStartMs}ms)`);
3144
+ } else {
3145
+ logSessionStart(`auto-install ensure ${toolId}: unavailable (${Date.now() - ensureStartMs}ms)`);
3146
+ }
3147
+ return result;
3148
+ })();
3149
+ ensureInFlight.set(inFlightKey, ensurePromise);
3150
+ try {
3151
+ return await ensurePromise;
3152
+ } finally {
3153
+ if (ensureInFlight.get(inFlightKey) === ensurePromise) {
3154
+ ensureInFlight.delete(inFlightKey);
3155
+ }
3156
+ }
3157
+ }
3158
+ export async function getToolEnvironment() {
3159
+ const localBin = path.join(TOOLS_DIR, "node_modules", ".bin");
3160
+ const currentPath = process.env.PATH || process.env.Path || process.env.path || "";
3161
+ const separator = process.platform === "win32" ? ";" : ":";
3162
+ const nodeDir = path.dirname(process.execPath);
3163
+ const withNode = nodeDir ? `${nodeDir}${separator}${currentPath}` : currentPath;
3164
+ const augmentedPath = `${GITHUB_BIN_DIR}${separator}${localBin}${separator}${withNode}`;
3165
+ const env = {
3166
+ ...process.env,
3167
+ PATH: augmentedPath
3168
+ };
3169
+ if (process.platform === "win32") {
3170
+ env.Path = augmentedPath;
3171
+ }
3172
+ return env;
3173
+ }
3174
+ export async function checkAllTools() {
3175
+ const results = [];
3176
+ for (const tool of TOOLS) {
3177
+ const path = await getToolPath(tool.id);
3178
+ results.push({
3179
+ id: tool.id,
3180
+ name: tool.name,
3181
+ installed: path !== undefined,
3182
+ path
3183
+ });
3184
+ }
3185
+ return results;
3186
+ }
3187
+ export function isKnownToolId(toolId) {
3188
+ return TOOLS.some((tool) => tool.id === toolId);
3189
+ }
3190
+ export function getToolInstallStrategy(toolId) {
3191
+ return TOOLS.find((tool) => tool.id === toolId)?.installStrategy;
3192
+ }
3193
+ export const GITHUB_TOOLS = [
3194
+ "shellcheck",
3195
+ "shfmt",
3196
+ "rust-analyzer",
3197
+ "golangci-lint",
3198
+ "ktlint",
3199
+ "actionlint",
3200
+ "zizmor",
3201
+ "typos-lsp",
3202
+ "tflint",
3203
+ "terragrunt",
3204
+ "terraform-ls",
3205
+ "zls",
3206
+ "hadolint",
3207
+ "helm",
3208
+ "gitleaks",
3209
+ "taplo",
3210
+ "vale",
3211
+ "opengrep",
3212
+ "deno",
3213
+ "clojure-lsp",
3214
+ "cue",
3215
+ "gleam",
3216
+ "marksman",
3217
+ "expert"
3218
+ ];
3219
+ export function resolveGitHubAsset(toolId, platform, arch) {
3220
+ const tool = TOOLS.find((t) => t.id === toolId);
3221
+ return tool?.github?.assetMatch(platform, arch);
3222
+ }
3223
+ export function resolveGitHubInstalledBinaryName(toolId, platform, assetName) {
3224
+ const tool = TOOLS.find((t) => t.id === toolId);
3225
+ if (!tool)
3226
+ return;
3227
+ return getGitHubInstalledBinaryName(tool.binaryName ?? tool.id, platform, assetName);
3228
+ }
3229
+ export function resolveGitHubArchiveBinaryCandidates(toolId, platform, assetName) {
3230
+ const tool = TOOLS.find((t) => t.id === toolId);
3231
+ if (!tool)
3232
+ return;
3233
+ const binaryName = tool.github?.binaryInArchive ?? tool.binaryName ?? tool.id;
3234
+ return getArchiveBinaryCandidates(binaryName, platform, assetName);
3235
+ }
3236
+ const ASSET_SIDECAR_SUFFIXES = [
3237
+ ".asc",
3238
+ ".sig",
3239
+ ".minisig",
3240
+ ".pem",
3241
+ ".cert",
3242
+ ".sbom",
3243
+ ".sha256",
3244
+ ".sha256sum",
3245
+ ".md5"
3246
+ ];
3247
+ function isAssetSidecar(name) {
3248
+ const lower = name.toLowerCase();
3249
+ return ASSET_SIDECAR_SUFFIXES.some((suffix) => lower.endsWith(suffix));
3250
+ }
3251
+ export function pickReleaseAsset(assets, assetSubstring) {
3252
+ return assets.find((a) => a.name === assetSubstring) ?? assets.find((a) => a.name.includes(assetSubstring) && !isAssetSidecar(a.name));
3253
+ }
3254
+ function deriveHashiCorpReleaseAsset(tool, tagName, assetSubstring) {
3255
+ const product = tool.github?.hashiCorpReleaseProduct;
3256
+ if (!product || !tagName)
3257
+ return;
3258
+ const version = tagName.replace(/^v/, "").trim();
3259
+ if (!version)
3260
+ return;
3261
+ const assetName = `${product}_${version}_${assetSubstring}`;
3262
+ return {
3263
+ name: assetName,
3264
+ browser_download_url: `https://releases.hashicorp.com/${product}/${version}/${assetName}`
3265
+ };
3266
+ }
3267
+ export function resolveDerivedHashiCorpReleaseAsset(toolId, tagName, platform, arch) {
3268
+ const tool = TOOLS.find((t) => t.id === toolId);
3269
+ if (!tool)
3270
+ return;
3271
+ const assetSubstring = tool.github?.assetMatch(platform, arch);
3272
+ if (!assetSubstring)
3273
+ return;
3274
+ return deriveHashiCorpReleaseAsset(tool, tagName, assetSubstring);
3275
+ }