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,310 @@
1
+ use crate::io::util::DEFAULT_BUF_SIZE;
2
+ use crate::io::{AsyncBufRead, AsyncRead, AsyncSeek, AsyncWrite, ReadBuf};
3
+
4
+ use pin_project_lite::pin_project;
5
+ use std::fmt;
6
+ use std::io::{self, IoSlice, SeekFrom, Write};
7
+ use std::pin::Pin;
8
+ use std::task::{ready, Context, Poll};
9
+
10
+ pin_project! {
11
+ /// Wraps a writer and buffers its output.
12
+ ///
13
+ /// It can be excessively inefficient to work directly with something that
14
+ /// implements [`AsyncWrite`]. A `BufWriter` keeps an in-memory buffer of data and
15
+ /// writes it to an underlying writer in large, infrequent batches.
16
+ ///
17
+ /// `BufWriter` can improve the speed of programs that make *small* and
18
+ /// *repeated* write calls to the same file or network socket. It does not
19
+ /// help when writing very large amounts at once, or writing just one or a few
20
+ /// times. It also provides no advantage when writing to a destination that is
21
+ /// in memory, like a `Vec<u8>`.
22
+ ///
23
+ /// When the `BufWriter` is dropped, the contents of its buffer will be
24
+ /// discarded. Creating multiple instances of a `BufWriter` on the same
25
+ /// stream can cause data loss. If you need to write out the contents of its
26
+ /// buffer, you must manually call flush before the writer is dropped.
27
+ ///
28
+ /// [`AsyncWrite`]: AsyncWrite
29
+ /// [`flush`]: super::AsyncWriteExt::flush
30
+ ///
31
+ #[cfg_attr(docsrs, doc(cfg(feature = "io-util")))]
32
+ pub struct BufWriter<W> {
33
+ #[pin]
34
+ pub(super) inner: W,
35
+ pub(super) buf: Vec<u8>,
36
+ pub(super) written: usize,
37
+ pub(super) seek_state: SeekState,
38
+ }
39
+ }
40
+
41
+ impl<W: AsyncWrite> BufWriter<W> {
42
+ /// Creates a new `BufWriter` with a default buffer capacity. The default is currently 8 KB,
43
+ /// but may change in the future.
44
+ pub fn new(inner: W) -> Self {
45
+ Self::with_capacity(DEFAULT_BUF_SIZE, inner)
46
+ }
47
+
48
+ /// Creates a new `BufWriter` with the specified buffer capacity.
49
+ pub fn with_capacity(cap: usize, inner: W) -> Self {
50
+ Self {
51
+ inner,
52
+ buf: Vec::with_capacity(cap),
53
+ written: 0,
54
+ seek_state: SeekState::Init,
55
+ }
56
+ }
57
+
58
+ fn flush_buf(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<io::Result<()>> {
59
+ let mut me = self.project();
60
+
61
+ let len = me.buf.len();
62
+ let mut ret = Ok(());
63
+ while *me.written < len {
64
+ match ready!(me.inner.as_mut().poll_write(cx, &me.buf[*me.written..])) {
65
+ Ok(0) => {
66
+ ret = Err(io::Error::new(
67
+ io::ErrorKind::WriteZero,
68
+ "failed to write the buffered data",
69
+ ));
70
+ break;
71
+ }
72
+ Ok(n) => *me.written += n,
73
+ Err(e) => {
74
+ ret = Err(e);
75
+ break;
76
+ }
77
+ }
78
+ }
79
+ if *me.written > 0 {
80
+ me.buf.drain(..*me.written);
81
+ }
82
+ *me.written = 0;
83
+ Poll::Ready(ret)
84
+ }
85
+
86
+ /// Gets a reference to the underlying writer.
87
+ pub fn get_ref(&self) -> &W {
88
+ &self.inner
89
+ }
90
+
91
+ /// Gets a mutable reference to the underlying writer.
92
+ ///
93
+ /// It is inadvisable to directly write to the underlying writer.
94
+ pub fn get_mut(&mut self) -> &mut W {
95
+ &mut self.inner
96
+ }
97
+
98
+ /// Gets a pinned mutable reference to the underlying writer.
99
+ ///
100
+ /// It is inadvisable to directly write to the underlying writer.
101
+ pub fn get_pin_mut(self: Pin<&mut Self>) -> Pin<&mut W> {
102
+ self.project().inner
103
+ }
104
+
105
+ /// Consumes this `BufWriter`, returning the underlying writer.
106
+ ///
107
+ /// Note that any leftover data in the internal buffer is lost.
108
+ pub fn into_inner(self) -> W {
109
+ self.inner
110
+ }
111
+
112
+ /// Returns a reference to the internally buffered data.
113
+ pub fn buffer(&self) -> &[u8] {
114
+ &self.buf
115
+ }
116
+ }
117
+
118
+ impl<W: AsyncWrite> AsyncWrite for BufWriter<W> {
119
+ fn poll_write(
120
+ mut self: Pin<&mut Self>,
121
+ cx: &mut Context<'_>,
122
+ buf: &[u8],
123
+ ) -> Poll<io::Result<usize>> {
124
+ if self.buf.len() + buf.len() > self.buf.capacity() {
125
+ ready!(self.as_mut().flush_buf(cx))?;
126
+ }
127
+
128
+ let me = self.project();
129
+ if buf.len() >= me.buf.capacity() {
130
+ me.inner.poll_write(cx, buf)
131
+ } else {
132
+ Poll::Ready(me.buf.write(buf))
133
+ }
134
+ }
135
+
136
+ fn poll_write_vectored(
137
+ mut self: Pin<&mut Self>,
138
+ cx: &mut Context<'_>,
139
+ mut bufs: &[IoSlice<'_>],
140
+ ) -> Poll<io::Result<usize>> {
141
+ if self.inner.is_write_vectored() {
142
+ let total_len = bufs
143
+ .iter()
144
+ .fold(0usize, |acc, b| acc.saturating_add(b.len()));
145
+ if total_len > self.buf.capacity() - self.buf.len() {
146
+ ready!(self.as_mut().flush_buf(cx))?;
147
+ }
148
+ let me = self.as_mut().project();
149
+ if total_len >= me.buf.capacity() {
150
+ // It's more efficient to pass the slices directly to the
151
+ // underlying writer than to buffer them.
152
+ // The case when the total_len calculation saturates at
153
+ // usize::MAX is also handled here.
154
+ me.inner.poll_write_vectored(cx, bufs)
155
+ } else {
156
+ bufs.iter().for_each(|b| me.buf.extend_from_slice(b));
157
+ Poll::Ready(Ok(total_len))
158
+ }
159
+ } else {
160
+ // Remove empty buffers at the beginning of bufs.
161
+ while bufs.first().map(|buf| buf.len()) == Some(0) {
162
+ bufs = &bufs[1..];
163
+ }
164
+ if bufs.is_empty() {
165
+ return Poll::Ready(Ok(0));
166
+ }
167
+ // Flush if the first buffer doesn't fit.
168
+ let first_len = bufs[0].len();
169
+ if first_len > self.buf.capacity() - self.buf.len() {
170
+ ready!(self.as_mut().flush_buf(cx))?;
171
+ debug_assert!(self.buf.is_empty());
172
+ }
173
+ let me = self.as_mut().project();
174
+ if first_len >= me.buf.capacity() {
175
+ // The slice is at least as large as the buffering capacity,
176
+ // so it's better to write it directly, bypassing the buffer.
177
+ debug_assert!(me.buf.is_empty());
178
+ return me.inner.poll_write(cx, &bufs[0]);
179
+ } else {
180
+ me.buf.extend_from_slice(&bufs[0]);
181
+ bufs = &bufs[1..];
182
+ }
183
+ let mut total_written = first_len;
184
+ debug_assert!(total_written != 0);
185
+ // Append the buffers that fit in the internal buffer.
186
+ for buf in bufs {
187
+ if buf.len() > me.buf.capacity() - me.buf.len() {
188
+ break;
189
+ } else {
190
+ me.buf.extend_from_slice(buf);
191
+ total_written += buf.len();
192
+ }
193
+ }
194
+ Poll::Ready(Ok(total_written))
195
+ }
196
+ }
197
+
198
+ fn is_write_vectored(&self) -> bool {
199
+ true
200
+ }
201
+
202
+ fn poll_flush(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<io::Result<()>> {
203
+ ready!(self.as_mut().flush_buf(cx))?;
204
+ self.get_pin_mut().poll_flush(cx)
205
+ }
206
+
207
+ fn poll_shutdown(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<io::Result<()>> {
208
+ ready!(self.as_mut().flush_buf(cx))?;
209
+ self.get_pin_mut().poll_shutdown(cx)
210
+ }
211
+ }
212
+
213
+ #[derive(Debug, Clone, Copy)]
214
+ pub(super) enum SeekState {
215
+ /// `start_seek` has not been called.
216
+ Init,
217
+ /// `start_seek` has been called, but `poll_complete` has not yet been called.
218
+ Start(SeekFrom),
219
+ /// Waiting for completion of `poll_complete`.
220
+ Pending,
221
+ }
222
+
223
+ /// Seek to the offset, in bytes, in the underlying writer.
224
+ ///
225
+ /// Seeking always writes out the internal buffer before seeking.
226
+ impl<W: AsyncWrite + AsyncSeek> AsyncSeek for BufWriter<W> {
227
+ fn start_seek(self: Pin<&mut Self>, pos: SeekFrom) -> io::Result<()> {
228
+ // We need to flush the internal buffer before seeking.
229
+ // It receives a `Context` and returns a `Poll`, so it cannot be called
230
+ // inside `start_seek`.
231
+ *self.project().seek_state = SeekState::Start(pos);
232
+ Ok(())
233
+ }
234
+
235
+ fn poll_complete(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<io::Result<u64>> {
236
+ let pos = match self.seek_state {
237
+ SeekState::Init => {
238
+ return self.project().inner.poll_complete(cx);
239
+ }
240
+ SeekState::Start(pos) => Some(pos),
241
+ SeekState::Pending => None,
242
+ };
243
+
244
+ // Flush the internal buffer before seeking.
245
+ ready!(self.as_mut().flush_buf(cx))?;
246
+
247
+ let mut me = self.project();
248
+ if let Some(pos) = pos {
249
+ // Ensure previous seeks have finished before starting a new one
250
+ ready!(me.inner.as_mut().poll_complete(cx))?;
251
+ if let Err(e) = me.inner.as_mut().start_seek(pos) {
252
+ *me.seek_state = SeekState::Init;
253
+ return Poll::Ready(Err(e));
254
+ }
255
+ }
256
+ match me.inner.poll_complete(cx) {
257
+ Poll::Ready(res) => {
258
+ *me.seek_state = SeekState::Init;
259
+ Poll::Ready(res)
260
+ }
261
+ Poll::Pending => {
262
+ *me.seek_state = SeekState::Pending;
263
+ Poll::Pending
264
+ }
265
+ }
266
+ }
267
+ }
268
+
269
+ impl<W: AsyncWrite + AsyncRead> AsyncRead for BufWriter<W> {
270
+ fn poll_read(
271
+ self: Pin<&mut Self>,
272
+ cx: &mut Context<'_>,
273
+ buf: &mut ReadBuf<'_>,
274
+ ) -> Poll<io::Result<()>> {
275
+ self.get_pin_mut().poll_read(cx, buf)
276
+ }
277
+ }
278
+
279
+ impl<W: AsyncWrite + AsyncBufRead> AsyncBufRead for BufWriter<W> {
280
+ fn poll_fill_buf(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<io::Result<&[u8]>> {
281
+ self.get_pin_mut().poll_fill_buf(cx)
282
+ }
283
+
284
+ fn consume(self: Pin<&mut Self>, amt: usize) {
285
+ self.get_pin_mut().consume(amt);
286
+ }
287
+ }
288
+
289
+ impl<W: fmt::Debug> fmt::Debug for BufWriter<W> {
290
+ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
291
+ f.debug_struct("BufWriter")
292
+ .field("writer", &self.inner)
293
+ .field(
294
+ "buffer",
295
+ &format_args!("{}/{}", self.buf.len(), self.buf.capacity()),
296
+ )
297
+ .field("written", &self.written)
298
+ .finish()
299
+ }
300
+ }
301
+
302
+ #[cfg(test)]
303
+ mod tests {
304
+ use super::*;
305
+
306
+ #[test]
307
+ fn assert_unpin() {
308
+ crate::is_unpin::<BufWriter<()>>();
309
+ }
310
+ }
@@ -0,0 +1,144 @@
1
+ use crate::io::{AsyncBufRead, AsyncRead, ReadBuf};
2
+
3
+ use pin_project_lite::pin_project;
4
+ use std::fmt;
5
+ use std::io;
6
+ use std::pin::Pin;
7
+ use std::task::{ready, Context, Poll};
8
+
9
+ pin_project! {
10
+ /// Stream for the [`chain`](super::AsyncReadExt::chain) method.
11
+ #[must_use = "streams do nothing unless polled"]
12
+ #[cfg_attr(docsrs, doc(cfg(feature = "io-util")))]
13
+ pub struct Chain<T, U> {
14
+ #[pin]
15
+ first: T,
16
+ #[pin]
17
+ second: U,
18
+ done_first: bool,
19
+ }
20
+ }
21
+
22
+ pub(super) fn chain<T, U>(first: T, second: U) -> Chain<T, U>
23
+ where
24
+ T: AsyncRead,
25
+ U: AsyncRead,
26
+ {
27
+ Chain {
28
+ first,
29
+ second,
30
+ done_first: false,
31
+ }
32
+ }
33
+
34
+ impl<T, U> Chain<T, U>
35
+ where
36
+ T: AsyncRead,
37
+ U: AsyncRead,
38
+ {
39
+ /// Gets references to the underlying readers in this `Chain`.
40
+ pub fn get_ref(&self) -> (&T, &U) {
41
+ (&self.first, &self.second)
42
+ }
43
+
44
+ /// Gets mutable references to the underlying readers in this `Chain`.
45
+ ///
46
+ /// Care should be taken to avoid modifying the internal I/O state of the
47
+ /// underlying readers as doing so may corrupt the internal state of this
48
+ /// `Chain`.
49
+ pub fn get_mut(&mut self) -> (&mut T, &mut U) {
50
+ (&mut self.first, &mut self.second)
51
+ }
52
+
53
+ /// Gets pinned mutable references to the underlying readers in this `Chain`.
54
+ ///
55
+ /// Care should be taken to avoid modifying the internal I/O state of the
56
+ /// underlying readers as doing so may corrupt the internal state of this
57
+ /// `Chain`.
58
+ pub fn get_pin_mut(self: Pin<&mut Self>) -> (Pin<&mut T>, Pin<&mut U>) {
59
+ let me = self.project();
60
+ (me.first, me.second)
61
+ }
62
+
63
+ /// Consumes the `Chain`, returning the wrapped readers.
64
+ pub fn into_inner(self) -> (T, U) {
65
+ (self.first, self.second)
66
+ }
67
+ }
68
+
69
+ impl<T, U> fmt::Debug for Chain<T, U>
70
+ where
71
+ T: fmt::Debug,
72
+ U: fmt::Debug,
73
+ {
74
+ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
75
+ f.debug_struct("Chain")
76
+ .field("t", &self.first)
77
+ .field("u", &self.second)
78
+ .finish()
79
+ }
80
+ }
81
+
82
+ impl<T, U> AsyncRead for Chain<T, U>
83
+ where
84
+ T: AsyncRead,
85
+ U: AsyncRead,
86
+ {
87
+ fn poll_read(
88
+ self: Pin<&mut Self>,
89
+ cx: &mut Context<'_>,
90
+ buf: &mut ReadBuf<'_>,
91
+ ) -> Poll<io::Result<()>> {
92
+ let me = self.project();
93
+
94
+ if !*me.done_first {
95
+ let rem = buf.remaining();
96
+ ready!(me.first.poll_read(cx, buf))?;
97
+ if buf.remaining() == rem {
98
+ *me.done_first = true;
99
+ } else {
100
+ return Poll::Ready(Ok(()));
101
+ }
102
+ }
103
+ me.second.poll_read(cx, buf)
104
+ }
105
+ }
106
+
107
+ impl<T, U> AsyncBufRead for Chain<T, U>
108
+ where
109
+ T: AsyncBufRead,
110
+ U: AsyncBufRead,
111
+ {
112
+ fn poll_fill_buf(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<io::Result<&[u8]>> {
113
+ let me = self.project();
114
+
115
+ if !*me.done_first {
116
+ match ready!(me.first.poll_fill_buf(cx)?) {
117
+ [] => {
118
+ *me.done_first = true;
119
+ }
120
+ buf => return Poll::Ready(Ok(buf)),
121
+ }
122
+ }
123
+ me.second.poll_fill_buf(cx)
124
+ }
125
+
126
+ fn consume(self: Pin<&mut Self>, amt: usize) {
127
+ let me = self.project();
128
+ if !*me.done_first {
129
+ me.first.consume(amt)
130
+ } else {
131
+ me.second.consume(amt)
132
+ }
133
+ }
134
+ }
135
+
136
+ #[cfg(test)]
137
+ mod tests {
138
+ use super::*;
139
+
140
+ #[test]
141
+ fn assert_unpin() {
142
+ crate::is_unpin::<Chain<(), ()>>();
143
+ }
144
+ }
@@ -0,0 +1,32 @@
1
+ {
2
+ "triage-issues": {
3
+ "subagent_type": "ashlr:ashlr:explore",
4
+ "model": "haiku",
5
+ "prompt_template": "You are triaging GitHub issues for a codebase. Classify each issue by: severity (critical/high/medium/low), label category (bug/feature/docs/chore), and age bucket (<7d / 7-30d / 30-90d / 90d+).\n\nFor each issue produce one line: `#<id> [<severity>] [<label>] [<age>] — <one-sentence summary>`.\n\nAt the end output a counts table:\n```\nseverity | count\ncritical | N\nhigh | N\nmedium | N\nlow | N\n```\n\nArgs: {{args}}",
6
+ "fanout_strategy": "batch"
7
+ },
8
+ "refactor-files": {
9
+ "subagent_type": "ashlr:ashlr:code",
10
+ "model": "sonnet",
11
+ "prompt_template": "Refactor the following files according to this description:\n\n> {{args}}\n\nFiles to refactor: {{files}}\n\nFor each file:\n1. Read the current content.\n2. Apply the described refactor.\n3. Write the updated file.\n4. Summarize changes in one line per file.\n\nDo NOT change public interfaces unless the refactor description explicitly requires it. Preserve existing tests.",
12
+ "fanout_strategy": "parallel-per-file"
13
+ },
14
+ "codebase-explain": {
15
+ "subagent_type": "ashlr:ashlr:explore",
16
+ "model": "haiku",
17
+ "prompt_template": "Explain the following area of this codebase: {{args}}\n\nUse the standard explore output shape:\n\n## What it does\n[2-4 sentences.]\n\n## Key files\n- path/to/file.ts:L42–58 — [role]\n\n## Flow\n1. entry → [fn] at [path:line]\n2. → [fn] at [path:line]\n\n## Gotchas / risks\n- [concrete, cited]\n\n## Unknowns\n- [what you'd need to read to go deeper]\n\nStay within 400 words. Cite file:line for every claim.",
18
+ "fanout_strategy": "tiered"
19
+ },
20
+ "pr-review-sweep": {
21
+ "subagent_type": "ashlr:ashlr:code",
22
+ "model": "sonnet",
23
+ "prompt_template": "Review PR #{{args}} for correctness, security, and style.\n\nFor each changed file:\n- Note bugs, logic errors, or security issues (cite file:line).\n- Note style violations or naming inconsistencies.\n- Suggest concrete improvements (show the diff, not just prose).\n\nOutput format per file:\n```\n### path/to/file.ts\n- [severity: critical|high|medium|low] file:line — issue description\n Suggestion: <concrete fix>\n```\n\nAt the end: overall LGTM / Request Changes verdict with 1-sentence rationale.",
24
+ "fanout_strategy": "parallel-per-file-changed"
25
+ },
26
+ "parallel-test-fix": {
27
+ "subagent_type": "ashlr:ashlr:code",
28
+ "model": "sonnet",
29
+ "prompt_template": "Fix failing tests in: {{files}}\n\nFor each failing test file:\n1. Read the test file and the source file it tests.\n2. Identify the root cause of each failure.\n3. Fix the source (not the test) unless the test expectation is clearly wrong.\n4. Verify the fix is consistent with other tests in the file.\n5. Report: `<file> — <N> failures fixed, root cause: <one line>`.\n\nDo NOT add new tests. Do NOT change test expectations without a clear reason. Preserve all passing tests.",
30
+ "fanout_strategy": "parallel-per-file"
31
+ }
32
+ }
@@ -0,0 +1,21 @@
1
+ ---
2
+ name: ashlr-allow
3
+ description: Auto-approve every ashlr MCP tool so Claude Code stops prompting in bypass-permissions mode.
4
+ ---
5
+
6
+ Run the permissions installer and render its output.
7
+
8
+ ```sh
9
+ bun run "${CLAUDE_PLUGIN_ROOT}/scripts/install-permissions.ts"
10
+ ```
11
+
12
+ Capture stdout and display it to the user verbatim.
13
+
14
+ Then tell the user:
15
+
16
+ - Which entries were added (or that all were already present).
17
+ - That Claude Code must be **restarted** (or `/reload-plugins` run) to pick up the settings change before the prompts disappear.
18
+ - If they want to undo, they can run: `bun run "${CLAUDE_PLUGIN_ROOT}/scripts/install-permissions.ts" --remove`
19
+ - If they want to preview without writing, they can run with `--dry-run`.
20
+
21
+ Do not paraphrase the installer output — show it as-is, then add the above notes only if the installer did not already mention them.
@@ -0,0 +1,53 @@
1
+ ---
2
+ name: ashlr-benchmark
3
+ description: Run the ashlr-plugin token-savings benchmark against the current project.
4
+ ---
5
+
6
+ Benchmark the plugin's `snipCompact` savings on the user's actual code.
7
+
8
+ Steps:
9
+
10
+ 1. Determine a target directory:
11
+ - Prefer `<cwd>/src` if it exists.
12
+ - Otherwise try `<cwd>/lib`, `<cwd>/app`, then `<cwd>` itself.
13
+ - If none of these contain any `.ts`, `.tsx`, `.js`, `.jsx`, `.py`, `.go`,
14
+ `.rs`, `.java`, or similar source files, tell the user:
15
+
16
+ ```
17
+ ashlr-benchmark: no source files detected in <cwd>.
18
+ Run it against a specific file instead, e.g.:
19
+ bun run ${CLAUDE_PLUGIN_ROOT}/servers/bench.ts --path <file>
20
+ ```
21
+
22
+ and stop.
23
+
24
+ 2. Run via Bash. The plugin root is exposed to hooks and commands via the
25
+ `${CLAUDE_PLUGIN_ROOT}` environment variable. If that variable is empty or
26
+ unset, the plugin is not loaded — abort with this exact message and stop:
27
+
28
+ ```
29
+ ashlr plugin not loaded — run /plugin install ashlr@ashlr-marketplace first.
30
+ ```
31
+
32
+ Otherwise:
33
+
34
+ ```
35
+ bun run ${CLAUDE_PLUGIN_ROOT}/servers/bench.ts --dir <target-dir>
36
+ ```
37
+
38
+ 3. Parse the output. The bench script prints a table of files with their raw
39
+ byte counts vs. snipCompact byte counts and a percent saved. Reproduce the
40
+ table in the response, then prepend a one-line headline:
41
+
42
+ ```
43
+ mean savings on files ≥ 2KB: X%
44
+ ```
45
+
46
+ Compute the mean across only files whose raw size is ≥ 2048 bytes (smaller
47
+ files are pass-through in the redirect hook and skew the average).
48
+
49
+ 4. If the bench script fails (missing file, exit non-zero), surface stderr
50
+ verbatim and suggest running with `--path <single-file>` to narrow the
51
+ problem.
52
+
53
+ No preamble, no trailing summary — just the headline plus the table.
@@ -0,0 +1,97 @@
1
+ ---
2
+ name: ashlr-brief
3
+ description: Toggle response-shortening (caveman-inspired, ashlr-flavored) with three intensity levels. Trims filler from Claude's prose to save 30–55% on output tokens while keeping code blocks, errors, and destructive-action confirmations in full grammar.
4
+ argument-hint: "on [lite|standard|concise] | off | status | --project [level]"
5
+ ---
6
+
7
+ Toggle ashlr-brief — a tunable, opt-in response-shortening layer. Free users get user-level preferences; Pro/Team users get project-level enforcement.
8
+
9
+ ## Usage
10
+
11
+ ```
12
+ /ashlr-brief on # enable at default level (standard)
13
+ /ashlr-brief on lite # mild trim — keeps full grammar
14
+ /ashlr-brief on standard # default — drop padding
15
+ /ashlr-brief on concise # max — fragments + arrows allowed
16
+ /ashlr-brief off # disable
17
+ /ashlr-brief status # show current level + active source
18
+ /ashlr-brief --project standard # write `.ashlr/brief.json` (Pro/Team only)
19
+ ```
20
+
21
+ ## What it does
22
+
23
+ | Level | Reduction | Effect |
24
+ |-------|-----------|--------|
25
+ | `lite` | ~25–35% | Drops filler; keeps full grammar |
26
+ | `standard` (default) | ~35–45% | Drops padding + transitions; keeps grammar |
27
+ | `concise` | ~50–60% | Fragments + arrows OK; abbreviations allowed for prose only |
28
+
29
+ Code blocks, error messages, file paths, and destructive-action confirmations are always rendered in full grammar regardless of level. See `skills/ashlr-brief/SKILL.md` for the full ruleset.
30
+
31
+ ## Steps
32
+
33
+ ### `on [level]`
34
+
35
+ 1. Default level if omitted: `standard`. Validate level is one of `lite | standard | concise`.
36
+ 2. Write to `~/.ashlr/brief.json`:
37
+ ```json
38
+ { "level": "standard", "setAt": "<ISO8601>", "source": "user" }
39
+ ```
40
+ Use `mkdir -p ~/.ashlr` first if needed.
41
+ 3. Print:
42
+ ```
43
+ ashlr-brief: <level> ON. Effective on the next response.
44
+ - Code blocks, errors, and destructive confirmations remain in full grammar.
45
+ - Status line shows `[brief: <level>]` while active.
46
+ Toggle off with: /ashlr-brief off
47
+ ```
48
+
49
+ ### `off`
50
+
51
+ 1. Write to `~/.ashlr/brief.json`:
52
+ ```json
53
+ { "level": "off", "setAt": "<ISO8601>", "source": "user" }
54
+ ```
55
+ 2. Print: `ashlr-brief: OFF. Default verbosity restored.`
56
+
57
+ ### `status`
58
+
59
+ 1. Read `~/.ashlr/brief.json` (level field).
60
+ 2. Read `<repo-root>/.ashlr/brief.json` if present (project override).
61
+ 3. Print:
62
+ ```
63
+ ashlr-brief status
64
+ user-level: <level> (~/.ashlr/brief.json)
65
+ project-level: <level> (.ashlr/brief.json) — Pro-enforced
66
+ effective: <project wins if Pro-set, else user>
67
+ ```
68
+ If no file exists for either, show `<not set>`.
69
+
70
+ ### `--project [level]`
71
+
72
+ 1. Check Pro/Team tier via `bun run ${CLAUDE_PLUGIN_ROOT}/scripts/check-tier.ts` (or read `~/.ashlr/pro-token-cache.json`). If free, print:
73
+ ```
74
+ ashlr-brief: --project requires Pro or Team tier.
75
+ Run /ashlr-upgrade to enable project-level enforcement.
76
+ ```
77
+ and stop.
78
+ 2. Otherwise write `.ashlr/brief.json` in the current repo root with:
79
+ ```json
80
+ { "level": "<level>", "setAt": "<ISO8601>", "source": "project", "writtenBy": "<email>" }
81
+ ```
82
+ 3. Print:
83
+ ```
84
+ ashlr-brief: project-level <level> written to .ashlr/brief.json.
85
+ Commit this file so teammates pick it up. Project setting overrides user-level.
86
+ ```
87
+
88
+ ### No argument
89
+
90
+ Show `status` (above).
91
+
92
+ ## Notes
93
+
94
+ - The skill content is in `skills/ashlr-brief/SKILL.md` and is auto-injected into session context by `hooks/sessionstart-brief.ts`.
95
+ - Natural-language activators ("be brief", "tldr", "less tokens", "stop being brief") are handled by `hooks/userpromptsubmit-brief-trigger.ts` — no slash command required.
96
+ - `/ashlr-eco-mode on` auto-activates `standard` if user hasn't already chosen a level.
97
+ - Real-data evaluation: `bun run scripts/brief-eval.ts` runs a 3-arm comparison (verbose / brief / "be terse" raw instruction) to verify reduction claims with real token counts.