ashlr-plugin 1.36.4

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 (499) hide show
  1. package/.agents/plugins/marketplace.json +20 -0
  2. package/.claude-plugin/marketplace.json +39 -0
  3. package/.claude-plugin/plugin.json +36 -0
  4. package/.codex/agents/README.md +9 -0
  5. package/.codex/agents/ashlr-explorer.md +36 -0
  6. package/.codex/agents/ashlr-worker.md +38 -0
  7. package/.codex-plugin/plugin.json +45 -0
  8. package/.mcp.json +14 -0
  9. package/LICENSE +21 -0
  10. package/README.md +311 -0
  11. package/agents/ashlr-code.md +69 -0
  12. package/agents/ashlr-explore.md +44 -0
  13. package/agents/ashlr-plan.md +54 -0
  14. package/bench/fixtures/notebook-large.ipynb +660 -0
  15. package/bench/fixtures/notebook-small.ipynb +39 -0
  16. package/bench/fixtures/tasklist-closed.json +62 -0
  17. package/bench/fixtures/tasklist-large-mixed.json +27 -0
  18. package/bench/fixtures/tasklist-sprint-open.json +79 -0
  19. package/bench/fixtures/websearch-bun-runtime.json +32 -0
  20. package/bench/fixtures/websearch-react-hooks-patterns.json +32 -0
  21. package/bench/fixtures/websearch-typescript-generics.json +38 -0
  22. package/bench/refs/node-sdk/.refrev +1 -0
  23. package/bench/refs/node-sdk/README.md +17 -0
  24. package/bench/refs/node-sdk/src/agent/agent.ts +163 -0
  25. package/bench/refs/node-sdk/src/agent/create-agent-ui-stream.ts +83 -0
  26. package/bench/refs/node-sdk/src/agent/tool-loop-agent.ts +238 -0
  27. package/bench/refs/node-sdk/src/embed/embed-many.ts +409 -0
  28. package/bench/refs/node-sdk/src/embed/embed-result.ts +50 -0
  29. package/bench/refs/node-sdk/src/embed/embed.ts +257 -0
  30. package/bench/refs/node-sdk/src/error/invalid-argument-error.ts +34 -0
  31. package/bench/refs/node-sdk/src/error/invalid-tool-input-error.ts +33 -0
  32. package/bench/refs/node-sdk/src/error/no-object-generated-error.ts +70 -0
  33. package/bench/refs/node-sdk/src/generate-image/generate-image-result.ts +42 -0
  34. package/bench/refs/node-sdk/src/generate-image/generate-image.ts +362 -0
  35. package/bench/refs/node-sdk/src/generate-object/generate-object-result.ts +67 -0
  36. package/bench/refs/node-sdk/src/generate-object/generate-object.ts +501 -0
  37. package/bench/refs/node-sdk/src/generate-object/inject-json-instruction.ts +30 -0
  38. package/bench/refs/node-sdk/src/generate-object/output-strategy.ts +415 -0
  39. package/bench/refs/node-sdk/src/generate-object/repair-text.ts +12 -0
  40. package/bench/refs/node-sdk/src/generate-object/stream-object.ts +960 -0
  41. package/bench/refs/node-sdk/src/generate-speech/generate-speech.ts +191 -0
  42. package/bench/refs/node-sdk/src/generate-text/generate-text.ts +1484 -0
  43. package/bench/refs/node-sdk/src/generate-text/stream-text.ts +2708 -0
  44. package/bench/refs/node-sdk/src/generate-text/tool-call.ts +59 -0
  45. package/bench/refs/node-sdk/src/generate-text/tool-result.ts +36 -0
  46. package/bench/refs/node-sdk/src/telemetry/create-telemetry-dispatcher.ts +146 -0
  47. package/bench/refs/node-sdk/src/telemetry/telemetry-registry.ts +15 -0
  48. package/bench/refs/node-sdk/src/telemetry/telemetry.ts +223 -0
  49. package/bench/refs/node-sdk/src/util/async-iterable-stream.ts +94 -0
  50. package/bench/refs/node-sdk/src/util/consume-stream.ts +31 -0
  51. package/bench/refs/node-sdk/src/util/create-stitchable-stream.ts +112 -0
  52. package/bench/refs/node-sdk/src/util/download/download.ts +74 -0
  53. package/bench/refs/node-sdk/src/util/error-handler.ts +1 -0
  54. package/bench/refs/node-sdk/src/util/fix-json.ts +401 -0
  55. package/bench/refs/node-sdk/src/util/merge-objects.ts +79 -0
  56. package/bench/refs/python-lib/.refrev +1 -0
  57. package/bench/refs/python-lib/README.md +18 -0
  58. package/bench/refs/python-lib/pandas/core/_numba/executor.py +249 -0
  59. package/bench/refs/python-lib/pandas/core/_numba/extensions.py +586 -0
  60. package/bench/refs/python-lib/pandas/core/_numba/kernels/mean_.py +198 -0
  61. package/bench/refs/python-lib/pandas/core/_numba/kernels/min_max_.py +178 -0
  62. package/bench/refs/python-lib/pandas/core/_numba/kernels/sum_.py +255 -0
  63. package/bench/refs/python-lib/pandas/core/_numba/kernels/var_.py +251 -0
  64. package/bench/refs/python-lib/pandas/core/accessor.py +520 -0
  65. package/bench/refs/python-lib/pandas/core/api.py +138 -0
  66. package/bench/refs/python-lib/pandas/core/array_algos/masked_accumulations.py +97 -0
  67. package/bench/refs/python-lib/pandas/core/array_algos/masked_reductions.py +252 -0
  68. package/bench/refs/python-lib/pandas/core/array_algos/putmask.py +150 -0
  69. package/bench/refs/python-lib/pandas/core/array_algos/quantile.py +232 -0
  70. package/bench/refs/python-lib/pandas/core/array_algos/replace.py +159 -0
  71. package/bench/refs/python-lib/pandas/core/array_algos/take.py +609 -0
  72. package/bench/refs/python-lib/pandas/core/arraylike.py +534 -0
  73. package/bench/refs/python-lib/pandas/core/arrays/_arrow_string_mixins.py +434 -0
  74. package/bench/refs/python-lib/pandas/core/arrays/_mixins.py +630 -0
  75. package/bench/refs/python-lib/pandas/core/arrays/_ranges.py +276 -0
  76. package/bench/refs/python-lib/pandas/core/arrays/_utils.py +77 -0
  77. package/bench/refs/python-lib/pandas/core/arrays/arrow/accessors.py +521 -0
  78. package/bench/refs/python-lib/pandas/core/arrays/arrow/extension_types.py +174 -0
  79. package/bench/refs/python-lib/pandas/core/arrays/boolean.py +454 -0
  80. package/bench/refs/python-lib/pandas/core/arrays/floating.py +192 -0
  81. package/bench/refs/python-lib/pandas/core/arrays/integer.py +296 -0
  82. package/bench/refs/python-lib/pandas/core/arrays/masked.py +2140 -0
  83. package/bench/refs/python-lib/pandas/core/arrays/numeric.py +305 -0
  84. package/bench/refs/python-lib/pandas/core/arrays/numpy_.py +701 -0
  85. package/bench/refs/python-lib/pandas/core/arrays/period.py +1586 -0
  86. package/bench/refs/python-lib/pandas/core/arrays/sparse/accessor.py +505 -0
  87. package/bench/refs/python-lib/pandas/core/arrays/sparse/scipy_sparse.py +208 -0
  88. package/bench/refs/rust-project/.refrev +1 -0
  89. package/bench/refs/rust-project/README.md +17 -0
  90. package/bench/refs/rust-project/tokio/src/doc/os.rs +68 -0
  91. package/bench/refs/rust-project/tokio/src/fs/dir_builder.rs +129 -0
  92. package/bench/refs/rust-project/tokio/src/fs/file.rs +1113 -0
  93. package/bench/refs/rust-project/tokio/src/fs/mocks.rs +176 -0
  94. package/bench/refs/rust-project/tokio/src/fs/mod.rs +324 -0
  95. package/bench/refs/rust-project/tokio/src/fs/open_options.rs +856 -0
  96. package/bench/refs/rust-project/tokio/src/fs/read.rs +80 -0
  97. package/bench/refs/rust-project/tokio/src/fs/read_dir.rs +357 -0
  98. package/bench/refs/rust-project/tokio/src/fs/write.rs +99 -0
  99. package/bench/refs/rust-project/tokio/src/future/maybe_done.rs +123 -0
  100. package/bench/refs/rust-project/tokio/src/future/try_join.rs +82 -0
  101. package/bench/refs/rust-project/tokio/src/io/async_buf_read.rs +117 -0
  102. package/bench/refs/rust-project/tokio/src/io/async_read.rs +133 -0
  103. package/bench/refs/rust-project/tokio/src/io/async_seek.rs +96 -0
  104. package/bench/refs/rust-project/tokio/src/io/async_write.rs +402 -0
  105. package/bench/refs/rust-project/tokio/src/io/blocking.rs +339 -0
  106. package/bench/refs/rust-project/tokio/src/io/interest.rs +345 -0
  107. package/bench/refs/rust-project/tokio/src/io/join.rs +130 -0
  108. package/bench/refs/rust-project/tokio/src/io/mod.rs +308 -0
  109. package/bench/refs/rust-project/tokio/src/io/poll_evented.rs +319 -0
  110. package/bench/refs/rust-project/tokio/src/io/read_buf.rs +344 -0
  111. package/bench/refs/rust-project/tokio/src/io/ready.rs +322 -0
  112. package/bench/refs/rust-project/tokio/src/io/split.rs +166 -0
  113. package/bench/refs/rust-project/tokio/src/io/stderr.rs +148 -0
  114. package/bench/refs/rust-project/tokio/src/io/stdin.rs +98 -0
  115. package/bench/refs/rust-project/tokio/src/io/stdio_common.rs +222 -0
  116. package/bench/refs/rust-project/tokio/src/io/stdout.rs +197 -0
  117. package/bench/refs/rust-project/tokio/src/io/util/buf_reader.rs +311 -0
  118. package/bench/refs/rust-project/tokio/src/io/util/buf_stream.rs +207 -0
  119. package/bench/refs/rust-project/tokio/src/io/util/buf_writer.rs +310 -0
  120. package/bench/refs/rust-project/tokio/src/io/util/chain.rs +144 -0
  121. package/commands/_spawn-patterns.json +32 -0
  122. package/commands/ashlr-allow.md +21 -0
  123. package/commands/ashlr-benchmark.md +53 -0
  124. package/commands/ashlr-brief.md +97 -0
  125. package/commands/ashlr-budget.md +76 -0
  126. package/commands/ashlr-compact.md +54 -0
  127. package/commands/ashlr-dashboard.md +37 -0
  128. package/commands/ashlr-doctor.md +56 -0
  129. package/commands/ashlr-eco-mode.md +92 -0
  130. package/commands/ashlr-genome-init.md +24 -0
  131. package/commands/ashlr-genome-keygen.md +36 -0
  132. package/commands/ashlr-genome-loop.md +118 -0
  133. package/commands/ashlr-genome-push.md +36 -0
  134. package/commands/ashlr-genome-rewrap.md +48 -0
  135. package/commands/ashlr-genome-team-init.md +67 -0
  136. package/commands/ashlr-handoff.md +23 -0
  137. package/commands/ashlr-help.md +86 -0
  138. package/commands/ashlr-hook-timings.md +30 -0
  139. package/commands/ashlr-leaderboard.md +50 -0
  140. package/commands/ashlr-ollama-setup.md +39 -0
  141. package/commands/ashlr-orchestrate-status.md +72 -0
  142. package/commands/ashlr-orchestrate.md +83 -0
  143. package/commands/ashlr-parallelize.md +63 -0
  144. package/commands/ashlr-report-crash.md +33 -0
  145. package/commands/ashlr-resume.md +72 -0
  146. package/commands/ashlr-savings.md +24 -0
  147. package/commands/ashlr-settings.md +50 -0
  148. package/commands/ashlr-spawn.md +61 -0
  149. package/commands/ashlr-start.md +60 -0
  150. package/commands/ashlr-status.md +64 -0
  151. package/commands/ashlr-team-invite.md +47 -0
  152. package/commands/ashlr-tier.md +122 -0
  153. package/commands/ashlr-tour.md +60 -0
  154. package/commands/ashlr-update.md +155 -0
  155. package/commands/ashlr-upgrade.md +96 -0
  156. package/commands/goal.md +58 -0
  157. package/commands/loop.md +40 -0
  158. package/docs/CNAME +1 -0
  159. package/docs/PRO_TIER.md +104 -0
  160. package/docs/README.md +21 -0
  161. package/docs/architecture.md +415 -0
  162. package/docs/ashlr-pipe.md +161 -0
  163. package/docs/assets/logo.svg +19 -0
  164. package/docs/assets/og.png +0 -0
  165. package/docs/assets/og.svg +41 -0
  166. package/docs/benchmarks-v2.json +355 -0
  167. package/docs/benchmarks.json +102 -0
  168. package/docs/benchmarks.md +211 -0
  169. package/docs/billing.md +185 -0
  170. package/docs/cloud-genome.md +155 -0
  171. package/docs/competitive-wozcode.md +92 -0
  172. package/docs/deploy.md +325 -0
  173. package/docs/email-templates.md +113 -0
  174. package/docs/embed-tuning.md +103 -0
  175. package/docs/genome.md +120 -0
  176. package/docs/github-oauth-onboarding.md +127 -0
  177. package/docs/hero-video-script.md +129 -0
  178. package/docs/index.html +2262 -0
  179. package/docs/install-prompt.md +78 -0
  180. package/docs/install-windows.md +132 -0
  181. package/docs/install.ps1 +171 -0
  182. package/docs/install.sh +146 -0
  183. package/docs/launch/README.md +114 -0
  184. package/docs/launch/hn.md +49 -0
  185. package/docs/launch/reddit.md +45 -0
  186. package/docs/launch/x.md +65 -0
  187. package/docs/launch-post.md +112 -0
  188. package/docs/legal.md +78 -0
  189. package/docs/llm-providers.md +99 -0
  190. package/docs/multi-host-mcp.md +217 -0
  191. package/docs/multi-turn-architecture.md +108 -0
  192. package/docs/operations/deployment.md +108 -0
  193. package/docs/operations/error-monitoring.md +70 -0
  194. package/docs/operations/weekly-digest.md +70 -0
  195. package/docs/operations.md +494 -0
  196. package/docs/platform-support.md +133 -0
  197. package/docs/policy-packs.md +188 -0
  198. package/docs/press-kit/fact-sheet.md +78 -0
  199. package/docs/press-kit/founder-bio.md +3 -0
  200. package/docs/press-kit/logo.svg +33 -0
  201. package/docs/press-kit/screenshots.md +146 -0
  202. package/docs/pricing.md +251 -0
  203. package/docs/pro-backend-architecture.md +523 -0
  204. package/docs/producthunt.md +52 -0
  205. package/docs/router-migration.md +110 -0
  206. package/docs/session-log-schema.md +68 -0
  207. package/docs/social.md +95 -0
  208. package/docs/team-genome.md +528 -0
  209. package/docs/telemetry.md +194 -0
  210. package/docs/test-isolation.md +100 -0
  211. package/docs/upgrade.md +159 -0
  212. package/hooks/_hook-errors.ts +87 -0
  213. package/hooks/_hook-perf-emit.ts +113 -0
  214. package/hooks/_hook-timing-ledger.ts +1133 -0
  215. package/hooks/_nudge-throttle.ts +127 -0
  216. package/hooks/_recent-blocks.ts +127 -0
  217. package/hooks/audit-upload.ts +86 -0
  218. package/hooks/codex-hooks.json +171 -0
  219. package/hooks/commit-attribution.ts +179 -0
  220. package/hooks/edit-batching-nudge.ts +154 -0
  221. package/hooks/genome-scribe-hook.ts +219 -0
  222. package/hooks/hooks.json +294 -0
  223. package/hooks/orient-nudge-hook.ts +242 -0
  224. package/hooks/policy-enforce.ts +214 -0
  225. package/hooks/post-tool-use-embedding.ts +93 -0
  226. package/hooks/post-tool-use-genome.sh +37 -0
  227. package/hooks/post-tool-use-genome.ts +69 -0
  228. package/hooks/posttooluse-correlate.ts +122 -0
  229. package/hooks/posttooluse-dedupe-output.ts +241 -0
  230. package/hooks/posttooluse-genome-refresh.ts +223 -0
  231. package/hooks/posttooluse-native-nudge.ts +205 -0
  232. package/hooks/posttooluse-stale-result.ts +277 -0
  233. package/hooks/pretooluse-bash.ts +63 -0
  234. package/hooks/pretooluse-budget-guard.ts +318 -0
  235. package/hooks/pretooluse-common.ts +985 -0
  236. package/hooks/pretooluse-eco-router.ts +196 -0
  237. package/hooks/pretooluse-edit.sh +93 -0
  238. package/hooks/pretooluse-edit.ts +197 -0
  239. package/hooks/pretooluse-glob.ts +70 -0
  240. package/hooks/pretooluse-grep.sh +85 -0
  241. package/hooks/pretooluse-grep.ts +96 -0
  242. package/hooks/pretooluse-notebookedit.ts +121 -0
  243. package/hooks/pretooluse-read.sh +118 -0
  244. package/hooks/pretooluse-read.ts +118 -0
  245. package/hooks/pretooluse-task.ts +130 -0
  246. package/hooks/pretooluse-webfetch.ts +66 -0
  247. package/hooks/pretooluse-websearch.ts +85 -0
  248. package/hooks/pretooluse-write.ts +128 -0
  249. package/hooks/pulse-emit.ts +197 -0
  250. package/hooks/session-end-consolidate.sh +35 -0
  251. package/hooks/session-end-consolidate.ts +188 -0
  252. package/hooks/session-end-stats-gc.ts +80 -0
  253. package/hooks/session-log-append.sh +94 -0
  254. package/hooks/session-log-append.ts +116 -0
  255. package/hooks/session-start.ts +993 -0
  256. package/hooks/sessionend-hook-health-nudge.ts +451 -0
  257. package/hooks/sessionend-savings-nudge.ts +318 -0
  258. package/hooks/sessionend-status-line-nudge.ts +296 -0
  259. package/hooks/sessionstart-brief.ts +140 -0
  260. package/hooks/sessionstart-cost-refactor.ts +95 -0
  261. package/hooks/sessionstart-efficient.ts +110 -0
  262. package/hooks/sessionstart-genome-author.ts +93 -0
  263. package/hooks/sessionstart-lean-tools.ts +98 -0
  264. package/hooks/sessionstart-search.ts +97 -0
  265. package/hooks/stop-accounting.ts +152 -0
  266. package/hooks/subagent-stop-rollup.ts +162 -0
  267. package/hooks/userpromptsubmit-brief-trigger.ts +156 -0
  268. package/package.json +56 -0
  269. package/ports/README.md +108 -0
  270. package/ports/cursor/mcp.json +11 -0
  271. package/ports/goose/recipe.yaml +26 -0
  272. package/scripts/ashlr-mcp.ts +40 -0
  273. package/scripts/auto-update.ts +177 -0
  274. package/scripts/baseline-scan.ts +831 -0
  275. package/scripts/bench-orchestrate.ts +377 -0
  276. package/scripts/benchmark-refs.ts +292 -0
  277. package/scripts/bootstrap.mjs +100 -0
  278. package/scripts/brief-eval.ts +234 -0
  279. package/scripts/bump-version.ts +82 -0
  280. package/scripts/bun-resolve.d.mts +11 -0
  281. package/scripts/bun-resolve.mjs +59 -0
  282. package/scripts/calibrate-grep.ts +467 -0
  283. package/scripts/capture-grep-workload.ts +260 -0
  284. package/scripts/check-tier.ts +61 -0
  285. package/scripts/check-version-sync.ts +97 -0
  286. package/scripts/cli-orchestrate-status.ts +386 -0
  287. package/scripts/cli-orchestrate.ts +303 -0
  288. package/scripts/cli.ts +478 -0
  289. package/scripts/cloud-smoke-test.ts +313 -0
  290. package/scripts/coach-report.ts +373 -0
  291. package/scripts/context-db-migrate.ts +137 -0
  292. package/scripts/context-status.ts +43 -0
  293. package/scripts/demo-run.ts +255 -0
  294. package/scripts/deploy-smoke.sh +140 -0
  295. package/scripts/doctor.ts +992 -0
  296. package/scripts/embed-file-worker.ts +104 -0
  297. package/scripts/embed-tune.ts +308 -0
  298. package/scripts/errors-report.ts +428 -0
  299. package/scripts/find-test-leak.ts +69 -0
  300. package/scripts/generate-badge.ts +357 -0
  301. package/scripts/genome-auto-consolidate.ts +533 -0
  302. package/scripts/genome-auto-propose.ts +578 -0
  303. package/scripts/genome-cloud-pull.ts +363 -0
  304. package/scripts/genome-cloud-push.ts +382 -0
  305. package/scripts/genome-cloud-sync.ts +587 -0
  306. package/scripts/genome-commit-watcher.ts +295 -0
  307. package/scripts/genome-init.ts +986 -0
  308. package/scripts/genome-key.ts +233 -0
  309. package/scripts/genome-keygen.ts +168 -0
  310. package/scripts/genome-link.ts +59 -0
  311. package/scripts/genome-refresh-worker.ts +364 -0
  312. package/scripts/genome-rewrap.ts +90 -0
  313. package/scripts/genome-synthesizer.ts +679 -0
  314. package/scripts/genome-team-init.ts +312 -0
  315. package/scripts/handoff-pack.ts +438 -0
  316. package/scripts/hook-bootstrap.mjs +75 -0
  317. package/scripts/hook-timing-reader.ts +371 -0
  318. package/scripts/hook-timings-report.ts +554 -0
  319. package/scripts/install-genome-hooks.ts +196 -0
  320. package/scripts/install-onnx-model.ts +154 -0
  321. package/scripts/install-permissions.ts +276 -0
  322. package/scripts/install-status-line.ts +150 -0
  323. package/scripts/mcp-entrypoint.sh +78 -0
  324. package/scripts/mcp-entrypoint.ts +130 -0
  325. package/scripts/mdx-angle-bracket-lint.ts +152 -0
  326. package/scripts/measure-cold-start.ts +126 -0
  327. package/scripts/migrate-stats-to-sqlite.ts +86 -0
  328. package/scripts/ollama-setup.ts +498 -0
  329. package/scripts/onboarding-wizard.ts +1691 -0
  330. package/scripts/orchestrate-emit-telemetry.ts +177 -0
  331. package/scripts/orchestrate-expand.ts +517 -0
  332. package/scripts/orchestrate-run.ts +744 -0
  333. package/scripts/print-legend.ts +50 -0
  334. package/scripts/product-metadata.ts +38 -0
  335. package/scripts/prune-old-memories.ts +208 -0
  336. package/scripts/publish.sh +88 -0
  337. package/scripts/read-calibration.ts +122 -0
  338. package/scripts/report-crash.ts +226 -0
  339. package/scripts/run-benchmark.ts +750 -0
  340. package/scripts/run-root-tests.ts +28 -0
  341. package/scripts/savings-dashboard.ts +1258 -0
  342. package/scripts/savings-report-extras.ts +447 -0
  343. package/scripts/savings-status-line.ts +873 -0
  344. package/scripts/session-event-emit.ts +266 -0
  345. package/scripts/session-greet.ts +686 -0
  346. package/scripts/session-log-report.ts +551 -0
  347. package/scripts/session-resume.ts +614 -0
  348. package/scripts/set-hook-mode.ts +83 -0
  349. package/scripts/smoke-cross-platform.ts +117 -0
  350. package/scripts/smoke-realtime.ts +257 -0
  351. package/scripts/smoke-tools.ts +21 -0
  352. package/scripts/stats-cloud-pull.ts +213 -0
  353. package/scripts/stats-cloud-sync.ts +261 -0
  354. package/scripts/telemetry-flush.ts +160 -0
  355. package/scripts/telemetry-status.ts +266 -0
  356. package/scripts/timing-budget.ts +35 -0
  357. package/scripts/ui-animation.ts +120 -0
  358. package/scripts/ui.ts +431 -0
  359. package/scripts/upgrade-flow.ts +775 -0
  360. package/scripts/weekly-digest.ts +394 -0
  361. package/servers/_accounting.ts +78 -0
  362. package/servers/_ask-router.ts +84 -0
  363. package/servers/_ast-chunker.ts +434 -0
  364. package/servers/_ast-helpers.ts +183 -0
  365. package/servers/_ast-languages.ts +153 -0
  366. package/servers/_ast-refactor/_shared.ts +221 -0
  367. package/servers/_ast-refactor/cross-file-rename.ts +560 -0
  368. package/servers/_ast-refactor/extract-function.ts +357 -0
  369. package/servers/_ast-refactor/file-local-rename.ts +172 -0
  370. package/servers/_ast-refactor.ts +41 -0
  371. package/servers/_ast-skeleton.ts +107 -0
  372. package/servers/_bash-summarizers-registry.ts +1096 -0
  373. package/servers/_crash-dump.ts +210 -0
  374. package/servers/_cwd-clamp.ts +342 -0
  375. package/servers/_edit-log.ts +28 -0
  376. package/servers/_edit-match.ts +236 -0
  377. package/servers/_edit-validate.ts +196 -0
  378. package/servers/_embed-calibration.ts +123 -0
  379. package/servers/_embedding-cache.ts +401 -0
  380. package/servers/_embedding-model.ts +329 -0
  381. package/servers/_events.ts +113 -0
  382. package/servers/_genome-cache.ts +154 -0
  383. package/servers/_genome-commits.ts +172 -0
  384. package/servers/_genome-crypto-v2.ts +242 -0
  385. package/servers/_genome-crypto.ts +259 -0
  386. package/servers/_genome-discoveries.ts +140 -0
  387. package/servers/_genome-embed-populator.ts +216 -0
  388. package/servers/_genome-freshness.ts +134 -0
  389. package/servers/_genome-issues.ts +171 -0
  390. package/servers/_genome-live.ts +263 -0
  391. package/servers/_genome-prs.ts +188 -0
  392. package/servers/_genome-search.ts +479 -0
  393. package/servers/_genome-sync.ts +297 -0
  394. package/servers/_history-tracker.ts +279 -0
  395. package/servers/_http-helpers.ts +151 -0
  396. package/servers/_identity-hash.ts +151 -0
  397. package/servers/_llm-providers/anthropic.ts +132 -0
  398. package/servers/_llm-providers/cloud.ts +195 -0
  399. package/servers/_llm-providers/index.ts +350 -0
  400. package/servers/_llm-providers/local.ts +127 -0
  401. package/servers/_llm-providers/onnx.ts +393 -0
  402. package/servers/_llm-providers/types.ts +27 -0
  403. package/servers/_manifest-v2.ts +447 -0
  404. package/servers/_mcp-host.ts +93 -0
  405. package/servers/_nudge-events.ts +451 -0
  406. package/servers/_orchestrate-executor.ts +316 -0
  407. package/servers/_prefetch.ts +435 -0
  408. package/servers/_pricing.ts +256 -0
  409. package/servers/_pro.ts +381 -0
  410. package/servers/_read-cache.ts +44 -0
  411. package/servers/_router-handlers.ts +46 -0
  412. package/servers/_router.ts +55 -0
  413. package/servers/_run-with-timeout.ts +173 -0
  414. package/servers/_savings-render.ts +214 -0
  415. package/servers/_stats-sqlite.ts +640 -0
  416. package/servers/_stats.ts +1183 -0
  417. package/servers/_status-line-cells.ts +469 -0
  418. package/servers/_streaks.ts +162 -0
  419. package/servers/_summarize.ts +208 -0
  420. package/servers/_task-graph-render.ts +217 -0
  421. package/servers/_task-graph.ts +545 -0
  422. package/servers/_telemetry.ts +719 -0
  423. package/servers/_test-parsers.ts +530 -0
  424. package/servers/_test-watch.ts +626 -0
  425. package/servers/_text-helpers.ts +37 -0
  426. package/servers/_token-measure.ts +160 -0
  427. package/servers/_tool-base.ts +248 -0
  428. package/servers/_weekly-digest.ts +391 -0
  429. package/servers/ask-server-handlers.ts +49 -0
  430. package/servers/ask-server.ts +174 -0
  431. package/servers/bash-server-handlers.ts +138 -0
  432. package/servers/bash-server.ts +1136 -0
  433. package/servers/bench.ts +186 -0
  434. package/servers/diff-semantic-server-handlers.ts +39 -0
  435. package/servers/diff-semantic-server.ts +566 -0
  436. package/servers/diff-server-handlers.ts +317 -0
  437. package/servers/diff-server.ts +20 -0
  438. package/servers/edit-server-handlers.ts +31 -0
  439. package/servers/edit-server.ts +209 -0
  440. package/servers/edit-structural-server-handlers.ts +322 -0
  441. package/servers/efficiency-server-handlers.ts +161 -0
  442. package/servers/efficiency-server.ts +1135 -0
  443. package/servers/flush-server-handlers.ts +21 -0
  444. package/servers/flush-server.ts +19 -0
  445. package/servers/genome-server-handlers.ts +118 -0
  446. package/servers/genome-server.ts +397 -0
  447. package/servers/github-server-handlers.ts +187 -0
  448. package/servers/github-server.ts +856 -0
  449. package/servers/glob-server-handlers.ts +233 -0
  450. package/servers/glob-server.ts +20 -0
  451. package/servers/grep-server-handlers.ts +61 -0
  452. package/servers/grep-server.ts +564 -0
  453. package/servers/http-server-handlers.ts +36 -0
  454. package/servers/http-server.ts +149 -0
  455. package/servers/logs-server-handlers.ts +42 -0
  456. package/servers/logs-server.ts +359 -0
  457. package/servers/ls-server-handlers.ts +166 -0
  458. package/servers/ls-server.ts +20 -0
  459. package/servers/multi-edit-server-handlers.ts +51 -0
  460. package/servers/multi-edit-server.ts +422 -0
  461. package/servers/notebook-edit-server-handlers.ts +34 -0
  462. package/servers/notebook-edit-server.ts +181 -0
  463. package/servers/orient-server-handlers.ts +52 -0
  464. package/servers/orient-server.ts +436 -0
  465. package/servers/pipe-server-handlers.ts +68 -0
  466. package/servers/pipe-server.ts +300 -0
  467. package/servers/read-server-handlers.ts +42 -0
  468. package/servers/read-server.ts +206 -0
  469. package/servers/rename-file-server-handlers.ts +67 -0
  470. package/servers/rename-file-server.ts +699 -0
  471. package/servers/savings-server-handlers.ts +27 -0
  472. package/servers/savings-server.ts +54 -0
  473. package/servers/search-replace-regex-server-handlers.ts +96 -0
  474. package/servers/search-replace-regex-server.ts +751 -0
  475. package/servers/sql-server-handlers.ts +58 -0
  476. package/servers/sql-server.ts +505 -0
  477. package/servers/task-server-handlers.ts +358 -0
  478. package/servers/task-server.ts +24 -0
  479. package/servers/test-server-handlers.ts +351 -0
  480. package/servers/test-server.ts +20 -0
  481. package/servers/tree-server-handlers.ts +503 -0
  482. package/servers/tree-server.ts +20 -0
  483. package/servers/webfetch-server-handlers.ts +166 -0
  484. package/servers/webfetch-server.ts +20 -0
  485. package/servers/websearch-server-handlers.ts +215 -0
  486. package/servers/websearch-server.ts +19 -0
  487. package/servers/write-server-handlers.ts +27 -0
  488. package/servers/write-server.ts +97 -0
  489. package/skills/ashlr-brief/SKILL.md +80 -0
  490. package/skills/ashlr-codex-doctor/SKILL.md +21 -0
  491. package/skills/ashlr-codex-efficient-tools/SKILL.md +17 -0
  492. package/skills/ashlr-codex-genome-refresh/SKILL.md +20 -0
  493. package/skills/ashlr-codex-parallel-explore/SKILL.md +20 -0
  494. package/skills/ashlr-codex-savings/SKILL.md +17 -0
  495. package/skills/ashlr-cost-refactor/SKILL.md +50 -0
  496. package/skills/ashlr-efficient/SKILL.md +64 -0
  497. package/skills/ashlr-genome-author/SKILL.md +43 -0
  498. package/skills/ashlr-lean-tools/SKILL.md +43 -0
  499. package/skills/ashlr-search/SKILL.md +46 -0
@@ -0,0 +1,153 @@
1
+ /**
2
+ * _ast-languages.ts — Language registry for AST-aware editing (Track C, Sprint 1).
3
+ *
4
+ * Uses web-tree-sitter@0.22.6 (WASM) rather than native tree-sitter bindings.
5
+ *
6
+ * Why WASM over native tree-sitter:
7
+ * Native tree-sitter fails on macOS/Bun — node-gyp requires C++20 but the
8
+ * cached Node.js headers (node@25.x / node-gyp@12.x) emit flags that clang
9
+ * rejects. web-tree-sitter ships a self-contained WASM bundle with no native
10
+ * build step.
11
+ *
12
+ * Why web-tree-sitter@0.22.6 (not latest 0.26.x):
13
+ * web-tree-sitter 0.25+ requires grammar WASM files to contain a `dylink.0`
14
+ * custom section (Emscripten side-module format). The `tree-sitter-wasms`
15
+ * package (0.1.13) ships grammars built with older Emscripten that omit this
16
+ * section, so they fail to load under 0.26.x with "need dylink section".
17
+ * Version 0.22.6 uses the pre-dylink loading path and accepts these grammars.
18
+ * Sprint-2 can upgrade if a compatible grammar bundle ships for 0.26.x.
19
+ *
20
+ * Grammar WASM files: `tree-sitter-wasms` npm package (pre-built assets).
21
+ *
22
+ * Supported languages: TypeScript (.ts), TSX (.tsx), JavaScript (.js/.mjs/.cjs/.jsx).
23
+ *
24
+ * NOT YET SUPPORTED: Python, Go, Rust. Calls to getParser() for these languages
25
+ * throw immediately with a clear error. Callers (e.g. _ast-chunker.ts) catch
26
+ * the throw and fall back to line-based chunking, so no user-visible breakage
27
+ * occurs — but semantic-diff/chunker features are unavailable for those files.
28
+ * Re-enable by wiring grammar WASM files compatible with web-tree-sitter@0.22.6
29
+ * and adding the language to WIRED_LANGUAGES (tracked as a future sprint item).
30
+ */
31
+
32
+ // web-tree-sitter@0.22.x uses a default export. Sub-types (Tree, Language, etc.)
33
+ // live in the Parser namespace.
34
+ import Parser from "web-tree-sitter";
35
+ import { resolve } from "path";
36
+ import { fileURLToPath } from "url";
37
+
38
+ // Re-export the Parser class so consumers can use `import type { WTSParser }` for
39
+ // instance-type annotations without importing the whole module.
40
+ export type WTSParser = Parser;
41
+
42
+ // ---------------------------------------------------------------------------
43
+ // Public types
44
+ // ---------------------------------------------------------------------------
45
+
46
+ export type Language = "typescript" | "tsx" | "javascript" | "python" | "go" | "rust";
47
+
48
+ // ---------------------------------------------------------------------------
49
+ // Extension → Language map
50
+ // ---------------------------------------------------------------------------
51
+
52
+ const EXT_MAP: Record<string, Language> = {
53
+ ".ts": "typescript",
54
+ ".tsx": "tsx",
55
+ ".js": "javascript",
56
+ ".mjs": "javascript",
57
+ ".cjs": "javascript",
58
+ ".jsx": "javascript",
59
+ // Stubs — resolveLanguage returns them so callers can check,
60
+ // but getParser throws for these until sprint 2.
61
+ ".py": "python",
62
+ ".go": "go",
63
+ ".rs": "rust",
64
+ };
65
+
66
+ /**
67
+ * Map a filename (or bare extension) to its Language key.
68
+ * Returns null for unrecognised extensions.
69
+ */
70
+ export function resolveLanguage(filename: string): Language | null {
71
+ // Accept both "foo.ts" and ".ts"
72
+ const dot = filename.lastIndexOf(".");
73
+ if (dot === -1) return null;
74
+ const ext = filename.slice(dot).toLowerCase();
75
+ return EXT_MAP[ext] ?? null;
76
+ }
77
+
78
+ // ---------------------------------------------------------------------------
79
+ // Lazy parser cache (one Parser instance per Language per process)
80
+ // ---------------------------------------------------------------------------
81
+
82
+ /** Set of languages with fully wired grammars in this sprint. */
83
+ const WIRED_LANGUAGES: ReadonlySet<Language> = new Set(["typescript", "tsx", "javascript"]);
84
+
85
+ let _tsInitialized = false;
86
+
87
+ /** Absolute path to the tree-sitter-wasms/out directory. */
88
+ function wasmDir(): string {
89
+ // Resolve relative to this file so it works from any cwd.
90
+ const here = fileURLToPath(import.meta.url);
91
+ // servers/_ast-languages.ts → root → node_modules
92
+ return resolve(here, "../../node_modules/tree-sitter-wasms/out");
93
+ }
94
+
95
+ /** Grammar file names for each supported language. */
96
+ const GRAMMAR_FILES: Record<Language, string> = {
97
+ typescript: "tree-sitter-typescript.wasm",
98
+ tsx: "tree-sitter-tsx.wasm",
99
+ javascript: "tree-sitter-javascript.wasm",
100
+ // Not yet supported — getParser() throws for these before the path below is
101
+ // reached. Grammar WASM files are present in tree-sitter-wasms but not wired
102
+ // into WIRED_LANGUAGES. See module-level comment for re-enable instructions.
103
+ python: "tree-sitter-python.wasm",
104
+ go: "tree-sitter-go.wasm",
105
+ rust: "tree-sitter-rust.wasm",
106
+ };
107
+
108
+ const _parserCache = new Map<Language, Parser>();
109
+ let _initPromise: Promise<void> | null = null;
110
+
111
+ /** Ensure web-tree-sitter WASM runtime is initialized (idempotent). */
112
+ async function ensureInit(): Promise<void> {
113
+ if (_tsInitialized) return;
114
+ if (_initPromise) return _initPromise;
115
+ _initPromise = (async () => {
116
+ const wasmPath = resolve(
117
+ fileURLToPath(import.meta.url),
118
+ "../../node_modules/web-tree-sitter/tree-sitter.wasm"
119
+ );
120
+ await Parser.init({
121
+ locateFile: () => wasmPath,
122
+ });
123
+ _tsInitialized = true;
124
+ })();
125
+ return _initPromise;
126
+ }
127
+
128
+ /**
129
+ * Return a cached (or freshly constructed) Parser for the given Language key.
130
+ *
131
+ * Throws for languages not yet wired in this sprint (Python, Go, Rust).
132
+ */
133
+ export async function getParser(lang: Language): Promise<Parser> {
134
+ if (!WIRED_LANGUAGES.has(lang)) {
135
+ throw new Error(
136
+ `[ast-languages] Grammar for '${lang}' is not wired yet (sprint-2 deliverable). ` +
137
+ `Call resolveLanguage() and check before calling getParser().`
138
+ );
139
+ }
140
+
141
+ const cached = _parserCache.get(lang);
142
+ if (cached) return cached;
143
+
144
+ await ensureInit();
145
+
146
+ const grammarPath = resolve(wasmDir(), GRAMMAR_FILES[lang]);
147
+ const language = await Parser.Language.load(grammarPath);
148
+ const parser = new Parser();
149
+ parser.setLanguage(language);
150
+
151
+ _parserCache.set(lang, parser);
152
+ return parser;
153
+ }
@@ -0,0 +1,221 @@
1
+ /**
2
+ * _ast-refactor/_shared.ts — Shared types, constants, and helpers for all
3
+ * AST-refactor operations (file-local rename, cross-file rename,
4
+ * extract-function).
5
+ *
6
+ * Nothing in this module has file-system side-effects. It is pure logic
7
+ * operating on tree-sitter trees and source strings.
8
+ */
9
+
10
+ import type Parser from "web-tree-sitter";
11
+ import { walkNodes } from "../_ast-helpers";
12
+
13
+ // ---------------------------------------------------------------------------
14
+ // Public types
15
+ // ---------------------------------------------------------------------------
16
+
17
+ /**
18
+ * A single byte-range edit. Replaces `[start, end)` with `replacement`.
19
+ * Compatible with the shape needed by an in-place file write.
20
+ */
21
+ export interface RangeEdit {
22
+ start: number;
23
+ end: number;
24
+ replacement: string;
25
+ }
26
+
27
+ export type RefactorKind = "value" | "type";
28
+
29
+ // ---------------------------------------------------------------------------
30
+ // Declaration detection constants
31
+ // ---------------------------------------------------------------------------
32
+
33
+ /**
34
+ * Parent-node types whose identifier child is a binding *declaration* site.
35
+ * Used by the shadowing guard to decide whether multiple same-name
36
+ * identifiers in the file actually introduce distinct bindings (→ refuse)
37
+ * or are just references to a single declaration (→ safe to rename).
38
+ */
39
+ export const VALUE_DECLARATION_PARENTS = new Set([
40
+ "variable_declarator", // const X = …
41
+ "function_declaration", // function X() {}
42
+ "function_signature", // declare function X()
43
+ "method_definition", // class body: X() {}
44
+ "class_declaration", // class X {}
45
+ "required_parameter", // fn(X: T)
46
+ "optional_parameter", // fn(X?: T)
47
+ "rest_parameter", // fn(...X: T[])
48
+ "formal_parameters", // bare parameter id
49
+ "import_specifier", // import { X }
50
+ "import_clause", // import X from …
51
+ "namespace_import", // import * as X from …
52
+ "enum_declaration", // enum X {}
53
+ ]);
54
+
55
+ export const TYPE_DECLARATION_PARENTS = new Set([
56
+ "type_alias_declaration", // type X = …
57
+ "interface_declaration", // interface X {}
58
+ "enum_declaration", // enum X {} (also type-side)
59
+ "type_parameter", // generic <X>
60
+ ]);
61
+
62
+ /**
63
+ * Pattern-wrapper node types that can sit between an identifier and its
64
+ * declaration parent (e.g., `const { a } = obj` → identifier → object_pattern
65
+ * → variable_declarator). We walk upward THROUGH these, but refuse to skip
66
+ * arbitrary expressions — otherwise `const x = a + b` would count `a` as a
67
+ * declaration of itself (since its grandparent is `variable_declarator`).
68
+ */
69
+ export const PATTERN_INTERMEDIATE_TYPES = new Set([
70
+ "array_pattern",
71
+ "object_pattern",
72
+ "pair_pattern",
73
+ "rest_pattern",
74
+ "assignment_pattern",
75
+ "object_assignment_pattern",
76
+ ]);
77
+
78
+ // ---------------------------------------------------------------------------
79
+ // Node comparison helpers
80
+ // ---------------------------------------------------------------------------
81
+
82
+ /**
83
+ * Compare two SyntaxNode references by byte range. web-tree-sitter does NOT
84
+ * guarantee reference stability — `parent.childForFieldName("name")` returns
85
+ * a fresh JS object each call, so `===` always fails even when the underlying
86
+ * node is the same. Comparing start/end indexes is the canonical approach.
87
+ */
88
+ export function sameNode(a: Parser.SyntaxNode | null, b: Parser.SyntaxNode | null): boolean {
89
+ if (!a || !b) return false;
90
+ return a.startIndex === b.startIndex && a.endIndex === b.endIndex && a.type === b.type;
91
+ }
92
+
93
+ // ---------------------------------------------------------------------------
94
+ // Declaration site detection
95
+ // ---------------------------------------------------------------------------
96
+
97
+ export function isDeclarationSite(node: Parser.SyntaxNode, kind: RefactorKind): boolean {
98
+ const parent = node.parent;
99
+ if (!parent) return false;
100
+ const set = kind === "value" ? VALUE_DECLARATION_PARENTS : TYPE_DECLARATION_PARENTS;
101
+ if (set.has(parent.type)) {
102
+ // Field-aware check: in a variable_declarator the identifier at field
103
+ // `name` is the binding, and the identifier at field `value` is a
104
+ // reference to another binding. Without this check,
105
+ // const msg = greet;
106
+ // counts `greet` (the initializer) as a declaration of itself.
107
+ if (parent.type === "variable_declarator") {
108
+ const nameField = parent.childForFieldName
109
+ ? parent.childForFieldName("name")
110
+ : null;
111
+ return sameNode(nameField, node);
112
+ }
113
+ return true;
114
+ }
115
+ // Walk upward ONLY through pattern intermediate nodes (destructuring).
116
+ // Skipping through arbitrary expressions misidentifies every identifier
117
+ // inside an initializer as a declaration of itself.
118
+ if (!PATTERN_INTERMEDIATE_TYPES.has(parent.type)) return false;
119
+ let up: Parser.SyntaxNode | null = parent.parent;
120
+ while (up && PATTERN_INTERMEDIATE_TYPES.has(up.type)) up = up.parent;
121
+ if (up === null || !set.has(up.type)) return false;
122
+ // If we walked through patterns to a variable_declarator, confirm we came
123
+ // from the `name` field (left side) not `value` (right side). Compare by
124
+ // byte-range containment since refs aren't stable.
125
+ if (up.type === "variable_declarator") {
126
+ const nameField = up.childForFieldName
127
+ ? up.childForFieldName("name")
128
+ : null;
129
+ if (!nameField) return false;
130
+ // node lies inside nameField iff [node.start, node.end] ⊆ [nameField.start, nameField.end].
131
+ return (
132
+ node.startIndex >= nameField.startIndex &&
133
+ node.endIndex <= nameField.endIndex
134
+ );
135
+ }
136
+ return true;
137
+ }
138
+
139
+ // ---------------------------------------------------------------------------
140
+ // Range edit applicator
141
+ // ---------------------------------------------------------------------------
142
+
143
+ /**
144
+ * Apply a set of byte-range edits to a source string. Edits are sorted
145
+ * right-to-left so offsets stay valid during the rewrite. Overlapping
146
+ * ranges (which should never come out of planRenameInFile) are detected
147
+ * and throw.
148
+ */
149
+ export function applyRangeEdits(source: string, edits: RangeEdit[]): string {
150
+ const sorted = [...edits].sort((a, b) => b.start - a.start);
151
+ let out = source;
152
+ let prevStart: number | null = null;
153
+ for (const edit of sorted) {
154
+ if (edit.start < 0 || edit.end > source.length || edit.start > edit.end) {
155
+ throw new Error(
156
+ `applyRangeEdits: invalid range [${edit.start}, ${edit.end}] for source of length ${source.length}`,
157
+ );
158
+ }
159
+ if (prevStart !== null && edit.end > prevStart) {
160
+ throw new Error(
161
+ `applyRangeEdits: overlapping edits at [${edit.start}, ${edit.end}] vs prior start ${prevStart}`,
162
+ );
163
+ }
164
+ out = out.slice(0, edit.start) + edit.replacement + out.slice(edit.end);
165
+ prevStart = edit.start;
166
+ }
167
+ return out;
168
+ }
169
+
170
+ // ---------------------------------------------------------------------------
171
+ // Identifier validation
172
+ // ---------------------------------------------------------------------------
173
+
174
+ /**
175
+ * JS/TS identifier syntax check.
176
+ *
177
+ * Uses the ECMAScript ID_Start / ID_Continue Unicode sets (ES2018+ `/\p{}/u`
178
+ * regex) so identifiers like `café`, `π`, `日本語` are accepted. ZWNJ (U+200C)
179
+ * and ZWJ (U+200D) are allowed in continue position per spec.
180
+ *
181
+ * Tree-sitter TS/TSX/JS grammars all tokenize Unicode identifiers correctly
182
+ * (verified — a `const café = 1` source parses as `identifier` node with
183
+ * text "café"), so a rename plan produced here applies cleanly.
184
+ */
185
+ export function validateIdentifier(name: string): string | null {
186
+ if (!name) return "new name is empty";
187
+ // ES identifier: first char is ID_Start | _ | $; rest is ID_Continue | _ | $
188
+ // | ZWNJ (U+200C) | ZWJ (U+200D).
189
+ if (!/^[\p{ID_Start}_$][\p{ID_Continue}_$‌‍]*$/u.test(name)) {
190
+ return `'${name}' is not a valid JS identifier (must start with a letter, '_' or '$' and contain only ID_Continue characters)`;
191
+ }
192
+ // Refuse reserved words proactively so the edit doesn't brick the file.
193
+ const RESERVED = new Set([
194
+ "break","case","catch","class","const","continue","debugger","default",
195
+ "delete","do","else","enum","export","extends","false","finally","for",
196
+ "function","if","import","in","instanceof","new","null","return","super",
197
+ "switch","this","throw","true","try","typeof","var","void","while","with",
198
+ "yield","let","static","async","await",
199
+ ]);
200
+ if (RESERVED.has(name)) return `'${name}' is a reserved word`;
201
+ return null;
202
+ }
203
+
204
+ // ---------------------------------------------------------------------------
205
+ // rangesToNodes — range-to-node round-trip (used by file-local rename)
206
+ // ---------------------------------------------------------------------------
207
+
208
+ /**
209
+ * Resolve a list of [start, end] ranges back to concrete tree nodes by
210
+ * re-walking the tree. Inefficient (O(nodes) per plan) — deferred to v1.14
211
+ * when `extractIdentifiers` returns SyntaxNode refs alongside the
212
+ * {name, kind, range} tuples, making the round-trip walk unnecessary.
213
+ */
214
+ export function rangesToNodes(tree: Parser.Tree, ranges: Array<[number, number]>): Parser.SyntaxNode[] {
215
+ const wanted = new Set(ranges.map((r) => `${r[0]}:${r[1]}`));
216
+ const out: Parser.SyntaxNode[] = [];
217
+ walkNodes(tree, (n) => {
218
+ if (wanted.has(`${n.startIndex}:${n.endIndex}`)) out.push(n);
219
+ });
220
+ return out;
221
+ }