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,161 @@
1
+ ---
2
+ name: ashlr-pipe
3
+ description: Run a multi-step JS expression that calls grep/read/bash/ls/glob internally — intermediate results never enter context, only the return value does.
4
+ ---
5
+
6
+ ## Overview
7
+
8
+ `ashlr__pipe` lets you run a JavaScript async expression that orchestrates multiple ashlr tool calls in a single round-trip. Intermediate results (grep output, file contents, bash stdout) are computed server-side and **never sent to the model context** — only the expression's final return value does. Typical savings: **80–95%** vs calling the same tools individually.
9
+
10
+ ### When to use it
11
+
12
+ - You need to grep for a pattern, then filter/transform the results
13
+ - You need to read several files and extract one fact from each
14
+ - You need to bash-query something and do arithmetic on the result
15
+ - Any pipeline where you'd otherwise burn context on large intermediate strings
16
+
17
+ ---
18
+
19
+ ## Security model & status
20
+
21
+ **Status: EXPERIMENTAL.** `ashlr__pipe` executes model-authored JavaScript code server-side. It is **off by default** in all releases.
22
+
23
+ ### Flags
24
+
25
+ | Flag | Effect |
26
+ |---|---|
27
+ | `ASHLR_PIPE_ENABLE=1` | Registers the tool. Required to use `ashlr__pipe` at all. |
28
+ | `ASHLR_PIPE_ALLOW_BASH=1` | Adds `ctx.bash` to the expression context. Requires `ASHLR_PIPE_ENABLE=1`. |
29
+
30
+ These are two separate, independent opt-ins. Enabling the pipe feature does **not** automatically expose shell access.
31
+
32
+ ### Default ctx — read-only tools only
33
+
34
+ By default `ctx` exposes only non-mutating, non-shell tools:
35
+
36
+ | Available by default | Requires `ASHLR_PIPE_ALLOW_BASH=1` |
37
+ |---|---|
38
+ | `ctx.grep`, `ctx.read`, `ctx.ls`, `ctx.glob` | `ctx.bash` |
39
+
40
+ If an expression calls `ctx.bash` without the flag set it receives a clear error:
41
+ ```
42
+ ctx.bash is disabled; set ASHLR_PIPE_ALLOW_BASH=1 to enable shell access in pipes
43
+ ```
44
+
45
+ ### Deny-list (best-effort)
46
+
47
+ Before execution, the expression is checked against a deny-list of blocked tokens: `process`, `Bun`, `require`, `import(`, `globalThis`, `__proto__`, `constructor[`, `eval`, `Function(`, `setTimeout`, `setInterval`, `fetch(`. This is a best-effort guardrail, **not a true sandbox**. The AsyncFunction constructor prevents module-closure access; strict mode (`"use strict"` is prepended automatically) makes `this` undefined so token-splitting attacks (`this["pro"+"cess"]`) fail at runtime.
48
+
49
+ ### Rollout flag
50
+
51
+ `ashlr__pipe` is **disabled by default**. Enable it per-session:
52
+
53
+ ```sh
54
+ ASHLR_PIPE_ENABLE=1 claude
55
+ ```
56
+
57
+ Or add it to your project's MCP environment config to enable permanently.
58
+
59
+ ---
60
+
61
+ ## Tool schema
62
+
63
+ ```
64
+ ashlr__pipe(
65
+ expr: string — async function body, ≤2000 chars (required)
66
+ cwd?: string — working directory for tool calls
67
+ timeout_ms?: number — default 10000, hard max 30000
68
+ max_output_bytes? number — default 4096 (truncates serialized return value)
69
+ )
70
+ ```
71
+
72
+ `expr` receives a single argument `ctx` with these async methods:
73
+
74
+ | Method | Equivalent tool | Args |
75
+ |---|---|---|
76
+ | `ctx.grep(args)` | `ashlr__grep` | `{ pattern, cwd?, bypassSummary?, ... }` |
77
+ | `ctx.read(args)` | `ashlr__read` | `{ path, bypassSummary? }` |
78
+ | `ctx.bash(args)` | `ashlr__bash` | `{ command, cwd?, timeout_ms? }` |
79
+ | `ctx.ls(args)` | `ashlr__ls` | `{ path? }` |
80
+ | `ctx.glob(args)` | `ashlr__glob` | `{ pattern, cwd? }` |
81
+
82
+ Each method returns the tool's text output as a plain string.
83
+
84
+ ### Security
85
+
86
+ Before execution the expression is checked against a deny-list of blocked tokens:
87
+ `process`, `Bun`, `require`, `import(`, `globalThis`, `__proto__`, `constructor[`, `eval`, `Function(`, `setTimeout`, `setInterval`, `fetch(`.
88
+
89
+ The function is built with `AsyncFunction` (not `eval`) so module-level closures and `require` are inaccessible regardless of the deny-list.
90
+
91
+ ### Return value
92
+
93
+ - The expression must `return` a value.
94
+ - The return value is `JSON.stringify`-ed. Non-serializable values (circular refs, BigInt) return `"[non-serializable result]"`.
95
+ - Output is truncated to `max_output_bytes` with a `[ashlr__pipe: output truncated]` marker.
96
+
97
+ ---
98
+
99
+ ## Worked examples
100
+
101
+ ### Example 1 — grep for TODOs, return file:line pairs
102
+
103
+ Instead of calling `ashlr__grep` and getting back potentially thousands of lines, use `ashlr__pipe` to filter down to just the file:line pairs you care about:
104
+
105
+ ```json
106
+ {
107
+ "expr": "const raw = await ctx.grep({ pattern: 'TODO', cwd: '.', bypassSummary: true }); const lines = raw.split('\\n').filter(l => l.includes(':')); return lines.slice(0, 20).map(l => l.split(':').slice(0,2).join(':'));"
108
+ }
109
+ ```
110
+
111
+ The model receives a compact JSON array of `["file.ts:42", ...]` — not the full grep output.
112
+
113
+ ### Example 2 — read several files and extract one fact each
114
+
115
+ Read the `name` field from every `package.json` found via `ctx.glob` (no shell required):
116
+
117
+ ```json
118
+ {
119
+ "expr": "const paths = (await ctx.glob({ pattern: '**/package.json', cwd: '.' })).split('\\n').filter(p => p && !p.includes('node_modules')).slice(0, 10); const names = []; for (const p of paths) { const content = await ctx.read({ path: p, bypassSummary: true }); try { const pkg = JSON.parse(content.split('\\n').slice(1).join('\\n')); if (pkg.name) names.push(pkg.name); } catch {} } return names;"
120
+ }
121
+ ```
122
+
123
+ Intermediate file contents (potentially hundreds of KB) stay on the server. The model receives only the `["name-a", "name-b", ...]` array.
124
+
125
+ ### Example 3 — shell access (requires `ASHLR_PIPE_ALLOW_BASH=1`)
126
+
127
+ `ctx.bash` is only available when the additional opt-in flag is set:
128
+
129
+ ```sh
130
+ ASHLR_PIPE_ENABLE=1 ASHLR_PIPE_ALLOW_BASH=1 claude
131
+ ```
132
+
133
+ ```json
134
+ {
135
+ "expr": "const listing = await ctx.bash({ command: 'find . -name package.json -not -path */node_modules/* -maxdepth 4' }); const paths = listing.split('\\n').filter(p => p.endsWith('package.json')); const names = []; for (const p of paths.slice(0, 10)) { const content = await ctx.read({ path: p, bypassSummary: true }); try { const pkg = JSON.parse(content.split('\\n').slice(1).join('\\n')); if (pkg.name) names.push(pkg.name); } catch {} } return names;"
136
+ }
137
+ ```
138
+
139
+ Without the flag, `ctx.bash(...)` throws: `ctx.bash is disabled; set ASHLR_PIPE_ALLOW_BASH=1 to enable shell access in pipes`.
140
+
141
+ ---
142
+
143
+ ## Savings accounting
144
+
145
+ `ashlr__pipe` records **one** aggregate saving at the end:
146
+ - `rawBytes` = sum of all intermediate result lengths (what the model would have seen)
147
+ - `compactBytes` = final output length (what the model actually sees)
148
+
149
+ Intermediate calls are suppressed from the savings ledger so there is no double-counting.
150
+
151
+ ---
152
+
153
+ ## Troubleshooting
154
+
155
+ | Symptom | Cause | Fix |
156
+ |---|---|---|
157
+ | `disallowed token "process"` | expr contains a blocked identifier | Rewrite without the blocked token |
158
+ | `expr exceeds 2000 characters` | Expression too long | Split into a shorter pipeline or use bash to do more work |
159
+ | `timed out after Nms` | Expression took longer than `timeout_ms` | Raise `timeout_ms` (max 30000) or simplify the pipeline |
160
+ | Tool count jumps by 1 | Flag was set during smoke test | Unset `ASHLR_PIPE_ENABLE` before running `bun run smoke:tools` |
161
+ | `ctx.bash is disabled` | `ASHLR_PIPE_ALLOW_BASH` not set | Set `ASHLR_PIPE_ALLOW_BASH=1` alongside `ASHLR_PIPE_ENABLE=1`, or rewrite expr using `ctx.glob`/`ctx.read` |
@@ -0,0 +1,19 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" fill="none">
2
+ <defs>
3
+ <linearGradient id="pl-grad" x1="0" y1="0" x2="64" y2="64" gradientUnits="userSpaceOnUse">
4
+ <stop offset="0%" stop-color="#c2410c"/>
5
+ <stop offset="100%" stop-color="#8B2E1A"/>
6
+ </linearGradient>
7
+ </defs>
8
+ <rect width="64" height="64" rx="14" fill="#1a0f0c"/>
9
+ <rect x="1" y="1" width="62" height="62" rx="13" fill="none" stroke="url(#pl-grad)" stroke-opacity="0.25" stroke-width="1.5"/>
10
+ <!-- Ledger lines -->
11
+ <line x1="14" y1="22" x2="50" y2="22" stroke="url(#pl-grad)" stroke-opacity="0.4" stroke-width="1"/>
12
+ <line x1="14" y1="32" x2="50" y2="32" stroke="url(#pl-grad)" stroke-opacity="0.5" stroke-width="1"/>
13
+ <line x1="14" y1="42" x2="50" y2="42" stroke="url(#pl-grad)" stroke-opacity="0.6" stroke-width="1"/>
14
+ <!-- Brand square -->
15
+ <rect x="14" y="14" width="10" height="10" fill="url(#pl-grad)"/>
16
+ <!-- Row marks -->
17
+ <circle cx="46" cy="32" r="2.5" fill="url(#pl-grad)"/>
18
+ <circle cx="46" cy="42" r="2.5" fill="url(#pl-grad)" opacity="0.7"/>
19
+ </svg>
Binary file
@@ -0,0 +1,41 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="1200" height="630" viewBox="0 0 1200 630">
2
+ <defs>
3
+ <filter id="noise" x="0" y="0" width="100%" height="100%">
4
+ <feTurbulence baseFrequency="0.9" numOctaves="3" stitchTiles="stitch" />
5
+ <feColorMatrix values="0 0 0 0 0.05 0 0 0 0 0.05 0 0 0 0 0.05 0 0 0 0.06 0" />
6
+ </filter>
7
+ <style>
8
+ @import url("https://fonts.googleapis.com/css2?family=Fraunces:opsz,wght@9..144,300;9..144,400&amp;family=JetBrains+Mono:wght@400;500&amp;family=IBM+Plex+Sans:wght@500&amp;display=swap");
9
+ </style>
10
+ </defs>
11
+
12
+ <!-- Parchment background -->
13
+ <rect width="1200" height="630" fill="#F3EADB" />
14
+
15
+ <!-- Paper grain overlay -->
16
+ <rect width="1200" height="630" filter="url(#noise)" opacity="0.6" />
17
+
18
+ <!-- Brand mark -->
19
+ <rect x="80" y="80" width="14" height="14" fill="#8B2E1A" />
20
+ <text x="108" y="96" font-family="Fraunces, serif" font-size="32" fill="#121212" font-weight="400">ashlr</text>
21
+
22
+ <!-- Top-right meta -->
23
+ <text x="1120" y="96" font-family="JetBrains Mono, monospace" font-size="14" fill="#121212" opacity="0.55" text-anchor="end" letter-spacing="1.5">v0.1.0 · MIT</text>
24
+
25
+ <!-- Eyebrow -->
26
+ <line x1="80" y1="200" x2="140" y2="200" stroke="#8B2E1A" stroke-width="2" />
27
+ <text x="160" y="205" font-family="JetBrains Mono, monospace" font-size="14" fill="#8B2E1A" letter-spacing="3" font-weight="500">THE TOKEN LEDGER</text>
28
+
29
+ <!-- Headline -->
30
+ <text x="80" y="310" font-family="Fraunces, serif" font-size="104" fill="#121212" font-weight="300" letter-spacing="-3">Every tool call,</text>
31
+ <text x="80" y="420" font-family="Fraunces, serif" font-style="italic" font-size="104" fill="#8B2E1A" font-weight="300" letter-spacing="-3">line-itemized.</text>
32
+
33
+ <!-- Sub -->
34
+ <text x="80" y="490" font-family="IBM Plex Sans, sans-serif" font-size="24" fill="#121212" opacity="0.8" font-weight="400">Open-source Codex + Claude Code plugin — token-efficient Read, Grep, Edit.</text>
35
+ <text x="80" y="524" font-family="IBM Plex Sans, sans-serif" font-size="24" fill="#121212" opacity="0.55">Mean −57% savings across reference repos.</text>
36
+
37
+ <!-- Bottom strip: install commands -->
38
+ <line x1="80" y1="570" x2="1120" y2="570" stroke="#121212" stroke-opacity="0.15" stroke-width="1" />
39
+ <text x="80" y="600" font-family="JetBrains Mono, monospace" font-size="16" fill="#121212">/plugin marketplace add ashlrai/ashlr-plugin</text>
40
+ <text x="1120" y="600" font-family="JetBrains Mono, monospace" font-size="14" fill="#8B2E1A" text-anchor="end" letter-spacing="1.5">plugin.ashlr.ai</text>
41
+ </svg>
@@ -0,0 +1,355 @@
1
+ {
2
+ "version": 2,
3
+ "measuredAt": "2026-04-26T03:27:38.258Z",
4
+ "repo": {
5
+ "url": "https://github.com/ashlrai/ashlr-plugin.git",
6
+ "commit": "b98da9c6d38a27ee35a1b9d95d9b8b99ddbc58d4",
7
+ "files": 750,
8
+ "loc": 149462
9
+ },
10
+ "samples": {
11
+ "ashlr__read": [
12
+ {
13
+ "path": "/Users/masonwyatt/Desktop/ashlr-plugin/vscode/src/extension.ts",
14
+ "bucket": "2-5KB",
15
+ "rawBytes": 3472,
16
+ "rawTokens": 867,
17
+ "ashlrBytes": 1629,
18
+ "ashlrTokens": 406,
19
+ "ratio": 0.4682814302191465
20
+ },
21
+ {
22
+ "path": "/Users/masonwyatt/Desktop/ashlr-plugin/bench/fixtures/tasklist-sprint-open.json",
23
+ "bucket": "2-5KB",
24
+ "rawBytes": 3265,
25
+ "rawTokens": 817,
26
+ "ashlrBytes": 1623,
27
+ "ashlrTokens": 406,
28
+ "ratio": 0.4969400244798042
29
+ },
30
+ {
31
+ "path": "/Users/masonwyatt/Desktop/ashlr-plugin/site/components/bits/DecryptedText.tsx",
32
+ "bucket": "2-5KB",
33
+ "rawBytes": 4079,
34
+ "rawTokens": 1020,
35
+ "ashlrBytes": 1625,
36
+ "ashlrTokens": 406,
37
+ "ratio": 0.3980392156862745
38
+ },
39
+ {
40
+ "path": "/Users/masonwyatt/Desktop/ashlr-plugin/video/src/compositions/DashboardFrame.tsx",
41
+ "bucket": "2-5KB",
42
+ "rawBytes": 4213,
43
+ "rawTokens": 1051,
44
+ "ashlrBytes": 1629,
45
+ "ashlrTokens": 406,
46
+ "ratio": 0.38629876308277833
47
+ },
48
+ {
49
+ "path": "/Users/masonwyatt/Desktop/ashlr-plugin/site/app/dpa/page.tsx",
50
+ "bucket": "5-15KB",
51
+ "rawBytes": 13288,
52
+ "rawTokens": 3321,
53
+ "ashlrBytes": 1625,
54
+ "ashlrTokens": 406,
55
+ "ratio": 0.12225233363444746
56
+ },
57
+ {
58
+ "path": "/Users/masonwyatt/Desktop/ashlr-plugin/servers/_genome-crypto-v2.ts",
59
+ "bucket": "5-15KB",
60
+ "rawBytes": 9269,
61
+ "rawTokens": 2313,
62
+ "ashlrBytes": 1627,
63
+ "ashlrTokens": 406,
64
+ "ratio": 0.17552961521833116
65
+ },
66
+ {
67
+ "path": "/Users/masonwyatt/Desktop/ashlr-plugin/__tests__/_summarize.test.ts",
68
+ "bucket": "5-15KB",
69
+ "rawBytes": 7868,
70
+ "rawTokens": 1967,
71
+ "ashlrBytes": 1623,
72
+ "ashlrTokens": 406,
73
+ "ratio": 0.20640569395017794
74
+ },
75
+ {
76
+ "path": "/Users/masonwyatt/Desktop/ashlr-plugin/__tests__/hook-timings-async.test.ts",
77
+ "bucket": "5-15KB",
78
+ "rawBytes": 5678,
79
+ "rawTokens": 1416,
80
+ "ashlrBytes": 1629,
81
+ "ashlrTokens": 406,
82
+ "ratio": 0.2867231638418079
83
+ },
84
+ {
85
+ "path": "/Users/masonwyatt/Desktop/ashlr-plugin/servers/_test-parsers.ts",
86
+ "bucket": "15-50KB",
87
+ "rawBytes": 19213,
88
+ "rawTokens": 4780,
89
+ "ashlrBytes": 1625,
90
+ "ashlrTokens": 406,
91
+ "ratio": 0.08493723849372385
92
+ },
93
+ {
94
+ "path": "/Users/masonwyatt/Desktop/ashlr-plugin/scripts/genome-auto-consolidate.ts",
95
+ "bucket": "15-50KB",
96
+ "rawBytes": 18644,
97
+ "rawTokens": 4652,
98
+ "ashlrBytes": 1631,
99
+ "ashlrTokens": 406,
100
+ "ratio": 0.08727429062768702
101
+ },
102
+ {
103
+ "path": "/Users/masonwyatt/Desktop/ashlr-plugin/scripts/savings-dashboard.ts",
104
+ "bucket": "15-50KB",
105
+ "rawBytes": 41965,
106
+ "rawTokens": 10410,
107
+ "ashlrBytes": 1627,
108
+ "ashlrTokens": 406,
109
+ "ratio": 0.03900096061479347
110
+ },
111
+ {
112
+ "path": "/Users/masonwyatt/Desktop/ashlr-plugin/__tests__/embedding-cache.test.ts",
113
+ "bucket": "15-50KB",
114
+ "rawBytes": 20709,
115
+ "rawTokens": 5171,
116
+ "ashlrBytes": 1623,
117
+ "ashlrTokens": 406,
118
+ "ratio": 0.07851479404370527
119
+ },
120
+ {
121
+ "path": "/Users/masonwyatt/Desktop/ashlr-plugin/CHANGELOG.md",
122
+ "bucket": "50+KB",
123
+ "rawBytes": 160910,
124
+ "rawTokens": 39889,
125
+ "ashlrBytes": 1640,
126
+ "ashlrTokens": 406,
127
+ "ratio": 0.010178244628845045
128
+ },
129
+ {
130
+ "path": "/Users/masonwyatt/Desktop/ashlr-plugin/.ashlrcode/genome/knowledge/discoveries-auto.md",
131
+ "bucket": "50+KB",
132
+ "rawBytes": 232920,
133
+ "rawTokens": 57674,
134
+ "ashlrBytes": 1633,
135
+ "ashlrTokens": 406,
136
+ "ratio": 0.0070395672226653255
137
+ },
138
+ {
139
+ "path": "/Users/masonwyatt/Desktop/ashlr-plugin/server/src/db.ts",
140
+ "bucket": "50+KB",
141
+ "rawBytes": 87630,
142
+ "rawTokens": 21889,
143
+ "ashlrBytes": 1627,
144
+ "ashlrTokens": 406,
145
+ "ratio": 0.01854812919731372
146
+ },
147
+ {
148
+ "path": "/Users/masonwyatt/Desktop/ashlr-plugin/site/tsconfig.tsbuildinfo",
149
+ "bucket": "50+KB",
150
+ "rawBytes": 381765,
151
+ "rawTokens": 95442,
152
+ "ashlrBytes": 1623,
153
+ "ashlrTokens": 406,
154
+ "ratio": 0.004253892416336624
155
+ }
156
+ ],
157
+ "ashlr__grep": [
158
+ {
159
+ "pattern": "function ",
160
+ "rawBytes": 850335,
161
+ "rawTokens": 212573,
162
+ "ashlrBytes": 3023,
163
+ "ashlrTokens": 756,
164
+ "ratio": 0.003556425322124635,
165
+ "method": "rg-truncated"
166
+ },
167
+ {
168
+ "pattern": "import ",
169
+ "rawBytes": 846065,
170
+ "rawTokens": 211503,
171
+ "ashlrBytes": 3023,
172
+ "ashlrTokens": 756,
173
+ "ratio": 0.0035744173841505793,
174
+ "method": "rg-truncated"
175
+ },
176
+ {
177
+ "pattern": "TODO",
178
+ "rawBytes": 12761,
179
+ "rawTokens": 3184,
180
+ "ashlrBytes": 3025,
181
+ "ashlrTokens": 756,
182
+ "ratio": 0.23743718592964824,
183
+ "method": "rg-truncated"
184
+ },
185
+ {
186
+ "pattern": "class ",
187
+ "rawBytes": 30112,
188
+ "rawTokens": 7524,
189
+ "ashlrBytes": 3025,
190
+ "ashlrTokens": 756,
191
+ "ratio": 0.10047846889952153,
192
+ "method": "rg-truncated"
193
+ },
194
+ {
195
+ "pattern": "interface ",
196
+ "rawBytes": 219322,
197
+ "rawTokens": 54830,
198
+ "ashlrBytes": 3023,
199
+ "ashlrTokens": 756,
200
+ "ratio": 0.013788072223235455,
201
+ "method": "rg-truncated"
202
+ }
203
+ ],
204
+ "ashlr__edit": [
205
+ {
206
+ "size": "small",
207
+ "searchChars": 15,
208
+ "replaceChars": 15,
209
+ "naiveBytes": 47,
210
+ "naiveTokens": 12,
211
+ "ashlrBytes": 121,
212
+ "ashlrTokens": 30,
213
+ "ratio": 2.5
214
+ },
215
+ {
216
+ "size": "medium",
217
+ "searchChars": 184,
218
+ "replaceChars": 206,
219
+ "naiveBytes": 407,
220
+ "naiveTokens": 102,
221
+ "ashlrBytes": 201,
222
+ "ashlrTokens": 49,
223
+ "ratio": 0.4803921568627451
224
+ },
225
+ {
226
+ "size": "large",
227
+ "searchChars": 2243,
228
+ "replaceChars": 2383,
229
+ "naiveBytes": 4643,
230
+ "naiveTokens": 1161,
231
+ "ashlrBytes": 167,
232
+ "ashlrTokens": 41,
233
+ "ratio": 0.03531438415159346
234
+ }
235
+ ]
236
+ },
237
+ "aggregate": {
238
+ "ashlr__read": {
239
+ "mean": 0.17938858483486492,
240
+ "p50": 0.12225233363444746,
241
+ "p90": 0.4682814302191465
242
+ },
243
+ "ashlr__grep": {
244
+ "mean": 0.0717669139517361,
245
+ "p50": 0.013788072223235455,
246
+ "p90": 0.23743718592964824
247
+ },
248
+ "ashlr__edit": {
249
+ "mean": 1.0052355136714461,
250
+ "p50": 0.4803921568627451,
251
+ "p90": 2.5
252
+ },
253
+ "overall": {
254
+ "mean": 0.26019826950545244
255
+ }
256
+ },
257
+ "methodology": "Measurement methodology (version 2):\n\n**ashlr__read**: For each sampled source file, we measure raw file bytes and\ntoken count (chars/4 heuristic). We then apply the same snipCompact\ntransformation used at runtime — wrapping the content in a tool_result message\nand calling snipCompact() — and measure the resulting byte/token count. The\nratio is ashlrTokens / rawTokens. Files below 2 KB are excluded because\nsnipCompact only fires on tool results > 2 000 chars; savings are zero by\ndesign for small files.\n\nFiles are selected deterministically: the repo HEAD commit SHA is folded into a\n32-bit seed (mulberry32 PRNG), then up to 4 files are sampled from each of four\nsize buckets (2–5 KB, 5–15 KB, 15–50 KB, 50+ KB). Re-running on the same\ncommit always picks the same files.\n\n**ashlr__grep**: Five common patterns (function, import, TODO, class, interface)\nare run via rg --json against the repo root. Raw output bytes are measured\ndirectly. The ashlr__grep fallback path (no genome) truncates output to 4 000\nchars (head 2 000 + tail 1 000). The ratio is truncated/raw.\n\nNote: when a .ashlrcode/genome/ index is present, real-world grep savings are\nsubstantially higher. This benchmark measures only the conservative\nno-genome baseline.\n\n**ashlr__edit**: Three synthetic edits (small ~15 chars, medium ~300 chars,\nlarge ~3 000 chars) compare the naive \"ship before+after as text\" approach\nagainst ashlr__edit's diff-summary format (one header line + removed/added\nfirst-lines). The ratio is summary tokens / naive tokens.\n\n**Aggregation**: per-tool mean/p50/p90 are computed over each tool's ratio\nvalues (lower ratio = more savings). The `overall.mean` is pooled across\nevery individual sample regardless of tool — so tools with more samples (read\nhas 15, grep has 5, edit has 3) weight the overall figure proportionally.\nThat makes the headline number reflect the workload mix, not a uniform\nper-tool average. The unweighted mean of per-tool means is intentionally NOT\npublished because it gives equal weight to a 3-sample tool and a 15-sample\ntool, which over-weights the synthetic edit overhead.\n\nToken counts use the chars/4 heuristic, the same estimator the plugin uses at\nruntime for savings accounting.",
258
+ "crossLanguageMeasuredAt": "2026-05-23T00:07:25.178Z",
259
+ "byRepo": {
260
+ "node-sdk": {
261
+ "repoKey": "node-sdk",
262
+ "language": "ts",
263
+ "upstreamRepo": "github.com/vercel/ai",
264
+ "refrev": "049801243cc791e0ba28910b8a638f0e05446bcd",
265
+ "meanRatio": 0.3866451136118328,
266
+ "savingsPct": 61.33548863881673,
267
+ "perTool": {
268
+ "read": {
269
+ "mean": 0.25972488616679845,
270
+ "p50": 0.2283464566929134,
271
+ "p90": 0.5638888888888889
272
+ },
273
+ "grep": {
274
+ "mean": 0.32009941944414705,
275
+ "p50": 0.2968197879858657,
276
+ "p90": 0.6948529411764706
277
+ },
278
+ "edit": {
279
+ "mean": 1.0052355136714461,
280
+ "p50": 0.4803921568627451,
281
+ "p90": 2.5
282
+ }
283
+ }
284
+ },
285
+ "python-lib": {
286
+ "repoKey": "python-lib",
287
+ "language": "py",
288
+ "upstreamRepo": "github.com/pandas-dev/pandas",
289
+ "refrev": "be0642f7cb8900282a43b53cd50cf00a05161ed6",
290
+ "meanRatio": 0.3688098954558492,
291
+ "savingsPct": 63.11901045441508,
292
+ "perTool": {
293
+ "read": {
294
+ "mean": 0.2429002666026248,
295
+ "p50": 0.230028328611898,
296
+ "p90": 0.56
297
+ },
298
+ "grep": {
299
+ "mean": 0.31431955954487434,
300
+ "p50": 0.20454545454545456,
301
+ "p90": 1
302
+ },
303
+ "edit": {
304
+ "mean": 1.0052355136714461,
305
+ "p50": 0.4803921568627451,
306
+ "p90": 2.5
307
+ }
308
+ }
309
+ },
310
+ "rust-project": {
311
+ "repoKey": "rust-project",
312
+ "language": "rs",
313
+ "upstreamRepo": "github.com/tokio-rs/tokio",
314
+ "refrev": "6c03e03898d71eca976ee1ad8481cf112ae722ba",
315
+ "meanRatio": 0.532296183969948,
316
+ "savingsPct": 46.7703816030052,
317
+ "perTool": {
318
+ "read": {
319
+ "mean": 0.24330862010197613,
320
+ "p50": 0.2088477366255144,
321
+ "p90": 0.4608399545970488
322
+ },
323
+ "grep": {
324
+ "mean": 0.826507713884993,
325
+ "p50": 1,
326
+ "p90": 1
327
+ },
328
+ "edit": {
329
+ "mean": 1.0052355136714461,
330
+ "p50": 0.4803921568627451,
331
+ "p90": 2.5
332
+ }
333
+ }
334
+ }
335
+ },
336
+ "byLanguage": {
337
+ "ts": {
338
+ "language": "ts",
339
+ "meanRatio": 0.3866451136118328,
340
+ "savingsPct": 61.33548863881673
341
+ },
342
+ "py": {
343
+ "language": "py",
344
+ "meanRatio": 0.3688098954558492,
345
+ "savingsPct": 63.11901045441508
346
+ },
347
+ "rs": {
348
+ "language": "rs",
349
+ "meanRatio": 0.532296183969948,
350
+ "savingsPct": 46.7703816030052
351
+ }
352
+ },
353
+ "crossLanguageMean": 0.42925039767920997,
354
+ "crossLanguageSavingsPct": 57.07496023207901
355
+ }
@@ -0,0 +1,102 @@
1
+ {
2
+ "generatedAt": "2026-04-15",
3
+ "method": "snipCompact via @ashlr/core-efficiency on each file; chars/4 token estimate",
4
+ "note": "Files below 2KB see 0% savings by design \u2014 snipCompact only fires on tool-results > 2000 chars. This is honest: there's nothing to trim on a small file.",
5
+ "reproducible": "legacy snapshot; use docs/benchmarks-v2.json and bun run scripts/run-benchmark.ts for current methodology",
6
+ "rows": [
7
+ {
8
+ "path": "src/compression/priority.ts",
9
+ "loc": 22,
10
+ "kb": 0.5,
11
+ "rawTokens": 117,
12
+ "ashlrTokens": 117,
13
+ "savedPct": 0
14
+ },
15
+ {
16
+ "path": "src/genome/jsonl.ts",
17
+ "loc": 42,
18
+ "kb": 1.2,
19
+ "rawTokens": 305,
20
+ "ashlrTokens": 305,
21
+ "savedPct": 0
22
+ },
23
+ {
24
+ "path": "src/tokens/index.ts",
25
+ "loc": 51,
26
+ "kb": 1.5,
27
+ "rawTokens": 372,
28
+ "ashlrTokens": 372,
29
+ "savedPct": 0
30
+ },
31
+ {
32
+ "path": "src/budget/index.ts",
33
+ "loc": 56,
34
+ "kb": 1.9,
35
+ "rawTokens": 491,
36
+ "ashlrTokens": 491,
37
+ "savedPct": 0
38
+ },
39
+ {
40
+ "path": "src/types/index.ts",
41
+ "loc": 68,
42
+ "kb": 1.9,
43
+ "rawTokens": 484,
44
+ "ashlrTokens": 484,
45
+ "savedPct": 0
46
+ },
47
+ {
48
+ "path": "src/compression/context.ts",
49
+ "loc": 186,
50
+ "kb": 5.9,
51
+ "rawTokens": 1517,
52
+ "ashlrTokens": 406,
53
+ "savedPct": 73.2
54
+ },
55
+ {
56
+ "path": "src/genome/manifest.ts",
57
+ "loc": 238,
58
+ "kb": 7.0,
59
+ "rawTokens": 1802,
60
+ "ashlrTokens": 406,
61
+ "savedPct": 77.5
62
+ },
63
+ {
64
+ "path": "src/genome/retriever.ts",
65
+ "loc": 259,
66
+ "kb": 7.8,
67
+ "rawTokens": 2001,
68
+ "ashlrTokens": 406,
69
+ "savedPct": 79.7
70
+ },
71
+ {
72
+ "path": "src/genome/fitness.ts",
73
+ "loc": 241,
74
+ "kb": 7.8,
75
+ "rawTokens": 2009,
76
+ "ashlrTokens": 406,
77
+ "savedPct": 79.8
78
+ },
79
+ {
80
+ "path": "src/genome/scribe.ts",
81
+ "loc": 276,
82
+ "kb": 8.3,
83
+ "rawTokens": 2131,
84
+ "ashlrTokens": 406,
85
+ "savedPct": 80.9
86
+ },
87
+ {
88
+ "path": "src/genome/generations.ts",
89
+ "loc": 331,
90
+ "kb": 11.2,
91
+ "rawTokens": 2878,
92
+ "ashlrTokens": 406,
93
+ "savedPct": 85.9
94
+ }
95
+ ],
96
+ "summary": {
97
+ "smallFiles (<2KB)": 5,
98
+ "mediumFiles (2-10KB)": 5,
99
+ "largeFiles (\u226510KB)": 1,
100
+ "avgSavingsLargeFiles": 79.5
101
+ }
102
+ }