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,152 @@
1
+ #!/usr/bin/env bun
2
+ /**
3
+ * stop-accounting.ts — Stop hook.
4
+ *
5
+ * Deterministic session finalization that complements SessionEnd.
6
+ *
7
+ * Idempotency guard: before appending to ~/.ashlr/session-log.jsonl, reads
8
+ * the last ~3 lines and skips if a session_end/stop entry for this session
9
+ * already exists within the last 60 seconds.
10
+ *
11
+ * Stop is a decision-control event: it does NOT support hookSpecificOutput /
12
+ * additionalContext. This hook does its side effect (the idempotent session-log
13
+ * write) and exits silently. Per-session savings are surfaced via the status
14
+ * line and /ashlr-savings — Stop fires every turn, so a summary here is noise.
15
+ *
16
+ * Env toggles:
17
+ * ASHLR_SESSION_LOG=0 — skip log append entirely
18
+ *
19
+ * Contract: never throws, always exits 0.
20
+ */
21
+
22
+ import { appendFile, readFile } from "fs/promises";
23
+ import { homedir } from "os";
24
+ import { join, dirname } from "path";
25
+
26
+ import { noteHookError } from "./_hook-errors";
27
+ import { currentSessionId } from "../servers/_stats";
28
+
29
+ interface LogEntry {
30
+ ts?: string;
31
+ event?: string;
32
+ session?: string;
33
+ [key: string]: unknown;
34
+ }
35
+
36
+ interface StopPayload {
37
+ session_id?: string;
38
+ [key: string]: unknown;
39
+ }
40
+
41
+ const IDEMPOTENCY_WINDOW_MS = 60_000;
42
+
43
+ /** Read the last N lines from a file. Returns [] if the file doesn't exist. */
44
+ async function readLastLines(path: string, n: number): Promise<string[]> {
45
+ try {
46
+ const raw = await readFile(path, "utf-8");
47
+ const lines = raw.split("\n").filter((l) => l.trim().length > 0);
48
+ return lines.slice(-n);
49
+ } catch {
50
+ return [];
51
+ }
52
+ }
53
+
54
+ /**
55
+ * Check if a session_end or stop entry for `sessionId` already exists
56
+ * within the last 60 seconds in the last 3 lines.
57
+ */
58
+ export function isAlreadyRecorded(lines: string[], sessionId: string): boolean {
59
+ const cutoff = Date.now() - IDEMPOTENCY_WINDOW_MS;
60
+ for (const line of lines) {
61
+ try {
62
+ const entry = JSON.parse(line) as LogEntry;
63
+ if (
64
+ entry.session === sessionId &&
65
+ (entry.event === "session_end" || entry.event === "stop") &&
66
+ entry.ts &&
67
+ new Date(entry.ts).getTime() >= cutoff
68
+ ) {
69
+ return true;
70
+ }
71
+ } catch { /* skip malformed lines */ }
72
+ }
73
+ return false;
74
+ }
75
+
76
+ async function main(): Promise<void> {
77
+ try {
78
+ let payload: StopPayload = {};
79
+ // Drain stdin defensively. Codex includes session_id in this payload.
80
+ try {
81
+ if (!process.stdin.isTTY) {
82
+ const chunks: Buffer[] = [];
83
+ await Promise.race([
84
+ (async () => {
85
+ for await (const chunk of process.stdin as AsyncIterable<Buffer>) {
86
+ chunks.push(chunk);
87
+ }
88
+ })(),
89
+ new Promise((r) => setTimeout(r, 50)),
90
+ ]);
91
+ const raw = Buffer.concat(chunks).toString("utf-8").trim();
92
+ if (raw) payload = JSON.parse(raw) as StopPayload;
93
+ }
94
+ } catch { /* ignore */ }
95
+
96
+ const sessionId = typeof payload.session_id === "string" && payload.session_id
97
+ ? payload.session_id
98
+ : currentSessionId();
99
+ const logPath = join(process.env.HOME ?? homedir(), ".ashlr", "session-log.jsonl");
100
+
101
+ // Read session stats.
102
+ let tokensSaved = 0;
103
+ let calls = 0;
104
+ let topTool: string | null = null;
105
+ let topCalls = 0;
106
+ try {
107
+ const statsPath = join(
108
+ process.env.CLAUDE_PLUGIN_ROOT ?? join(dirname(import.meta.url.replace("file://", "")), ".."),
109
+ "servers",
110
+ "_stats",
111
+ );
112
+ const { readCurrentSession } = await import(statsPath) as {
113
+ readCurrentSession: (id?: string) => Promise<{ tokensSaved: number; calls: number; byTool: Record<string, { calls: number }> }>;
114
+ };
115
+ const sess = await readCurrentSession(sessionId);
116
+ tokensSaved = sess.tokensSaved;
117
+ calls = sess.calls;
118
+ for (const [tool, pt] of Object.entries(sess.byTool ?? {})) {
119
+ if (pt.calls > topCalls) { topCalls = pt.calls; topTool = tool; }
120
+ }
121
+ } catch { /* best-effort */ }
122
+
123
+ // Idempotency + log append.
124
+ if (process.env.ASHLR_SESSION_LOG !== "0") {
125
+ try {
126
+ const lastLines = await readLastLines(logPath, 3);
127
+ if (!isAlreadyRecorded(lastLines, sessionId)) {
128
+ const entry = {
129
+ ts: new Date().toISOString(),
130
+ event: "stop",
131
+ session: sessionId,
132
+ tokens_saved: tokensSaved,
133
+ calls,
134
+ top_tool: topTool,
135
+ };
136
+ await appendFile(logPath, JSON.stringify(entry) + "\n");
137
+ }
138
+ } catch (e) {
139
+ noteHookError("stop-accounting", "append-log", e);
140
+ }
141
+ }
142
+
143
+ // Stop is a decision-control event: it supports no additionalContext.
144
+ // Side effects are done; exit silently (exit 0, no stdout).
145
+ } catch (e) {
146
+ noteHookError("stop-accounting", "main", e);
147
+ }
148
+ }
149
+
150
+ if (import.meta.main) {
151
+ void main();
152
+ }
@@ -0,0 +1,162 @@
1
+ #!/usr/bin/env bun
2
+ /**
3
+ * subagent-stop-rollup.ts — SubagentStop hook.
4
+ *
5
+ * When a subagent finishes:
6
+ * 1. Reads stdin payload for Claude task_id/subagent_session_id or Codex
7
+ * agent_id/session_id.
8
+ * 2. Appends a rollup line to ~/.ashlr/session-log.jsonl (unless ASHLR_SESSION_LOG=0).
9
+ * 3. Fire-and-forget genome consolidation for the cwd (unless ASHLR_GENOME_AUTO=0).
10
+ *
11
+ * SubagentStop is a decision-control event: it does NOT support
12
+ * hookSpecificOutput / additionalContext, so this hook only does its side
13
+ * effects and exits silently.
14
+ *
15
+ * Contract: never throws, always exits 0.
16
+ *
17
+ * Env toggles:
18
+ * ASHLR_SESSION_LOG=0 — skip appending to session-log.jsonl
19
+ * ASHLR_GENOME_AUTO=0 — skip genome consolidation
20
+ */
21
+
22
+ import { appendFile } from "fs/promises";
23
+ import { existsSync } from "fs";
24
+ import { homedir } from "os";
25
+ import { join, dirname } from "path";
26
+
27
+ import { noteHookError } from "./_hook-errors";
28
+
29
+ interface SubagentStopPayload {
30
+ task_id?: string;
31
+ subagent_session_id?: string;
32
+ agent_id?: string;
33
+ agent_type?: string;
34
+ session_id?: string;
35
+ [key: string]: unknown;
36
+ }
37
+
38
+ export interface RollupLine {
39
+ ts: string;
40
+ event: "subagent_stop";
41
+ task_id: string | null;
42
+ subagent_session_id: string | null;
43
+ agent_id?: string | null;
44
+ agent_type?: string | null;
45
+ tokens_saved: number;
46
+ calls: number;
47
+ top_tool: string | null;
48
+ }
49
+
50
+ export interface SubagentSummary {
51
+ tokensSaved: number;
52
+ calls: number;
53
+ topTool: string | null;
54
+ }
55
+
56
+ /** Build the JSONL rollup line for a finished subagent. */
57
+ export function buildRollupLine(opts: {
58
+ taskId: string | null;
59
+ subagentSessionId: string | null;
60
+ agentId?: string | null;
61
+ agentType?: string | null;
62
+ summary: SubagentSummary;
63
+ ts?: string;
64
+ }): RollupLine {
65
+ return {
66
+ ts: opts.ts ?? new Date().toISOString(),
67
+ event: "subagent_stop",
68
+ task_id: opts.taskId,
69
+ subagent_session_id: opts.subagentSessionId,
70
+ agent_id: opts.agentId ?? null,
71
+ agent_type: opts.agentType ?? null,
72
+ tokens_saved: opts.summary.tokensSaved,
73
+ calls: opts.summary.calls,
74
+ top_tool: opts.summary.topTool,
75
+ };
76
+ }
77
+
78
+ /** Read and parse stdin with a 200ms timeout. Returns {} on failure. */
79
+ async function readStdinPayload(): Promise<SubagentStopPayload> {
80
+ try {
81
+ if (process.stdin.isTTY) return {};
82
+ const chunks: Buffer[] = [];
83
+ await Promise.race([
84
+ (async () => {
85
+ for await (const chunk of process.stdin as AsyncIterable<Buffer>) {
86
+ chunks.push(chunk);
87
+ }
88
+ })(),
89
+ new Promise((r) => setTimeout(r, 200)),
90
+ ]);
91
+ const raw = Buffer.concat(chunks).toString("utf-8").trim();
92
+ if (!raw) return {};
93
+ return JSON.parse(raw) as SubagentStopPayload;
94
+ } catch {
95
+ return {};
96
+ }
97
+ }
98
+
99
+ async function main(): Promise<void> {
100
+ try {
101
+ const payload = await readStdinPayload();
102
+ const taskId = payload.task_id ?? payload.agent_id ?? null;
103
+ const subagentSessionId = payload.subagent_session_id ?? payload.session_id ?? null;
104
+ const agentId = payload.agent_id ?? null;
105
+ const agentType = payload.agent_type ?? null;
106
+
107
+ // Read subagent session stats.
108
+ let summary: SubagentSummary = { tokensSaved: 0, calls: 0, topTool: null };
109
+ try {
110
+ const statsPath = join(
111
+ process.env.CLAUDE_PLUGIN_ROOT ?? process.env.CODEX_PLUGIN_ROOT ?? join(dirname(import.meta.url.replace("file://", "")), ".."),
112
+ "servers",
113
+ "_stats",
114
+ );
115
+ const { readCurrentSession } = await import(statsPath) as {
116
+ readCurrentSession: (id?: string) => Promise<{ tokensSaved: number; calls: number; byTool: Record<string, { calls: number }> }>;
117
+ };
118
+ const sess = await readCurrentSession(subagentSessionId ?? undefined);
119
+ let topTool: string | null = null;
120
+ let topCalls = 0;
121
+ for (const [tool, pt] of Object.entries(sess.byTool ?? {})) {
122
+ if (pt.calls > topCalls) { topCalls = pt.calls; topTool = tool; }
123
+ }
124
+ summary = { tokensSaved: sess.tokensSaved, calls: sess.calls, topTool };
125
+ } catch { /* best-effort */ }
126
+
127
+ // 1. Append rollup line to session-log.jsonl.
128
+ if (process.env.ASHLR_SESSION_LOG !== "0") {
129
+ try {
130
+ const logPath = join(process.env.HOME ?? homedir(), ".ashlr", "session-log.jsonl");
131
+ const line = buildRollupLine({ taskId, subagentSessionId, agentId, agentType, summary });
132
+ await appendFile(logPath, JSON.stringify(line) + "\n");
133
+ } catch (e) {
134
+ noteHookError("subagent-stop-rollup", "append-log", e);
135
+ }
136
+ }
137
+
138
+ // 2. Fire-and-forget genome consolidation.
139
+ if (process.env.ASHLR_GENOME_AUTO !== "0") {
140
+ try {
141
+ const pluginRoot = process.env.CLAUDE_PLUGIN_ROOT ?? process.env.CODEX_PLUGIN_ROOT ?? join(dirname(import.meta.url.replace("file://", "")), "..");
142
+ const consolidateTs = join(pluginRoot, "scripts", "genome-auto-consolidate.ts");
143
+ if (existsSync(consolidateTs)) {
144
+ Bun.spawn(["bun", "run", consolidateTs, "--dir", process.cwd()], {
145
+ stdin: "ignore",
146
+ stdout: "ignore",
147
+ stderr: "pipe",
148
+ });
149
+ }
150
+ } catch { /* best-effort */ }
151
+ }
152
+
153
+ // SubagentStop is a decision-control event: it supports no additionalContext.
154
+ // Side effects are done; exit silently (exit 0, no stdout).
155
+ } catch (e) {
156
+ noteHookError("subagent-stop-rollup", "main", e);
157
+ }
158
+ }
159
+
160
+ if (import.meta.main) {
161
+ void main();
162
+ }
@@ -0,0 +1,156 @@
1
+ #!/usr/bin/env bun
2
+ /**
3
+ * userpromptsubmit-brief-trigger.ts — UserPromptSubmit hook that watches for
4
+ * natural-language activation phrases and toggles ashlr-brief in response.
5
+ *
6
+ * Activation phrases (case-insensitive, matches anywhere in prompt):
7
+ * "be brief", "be terse", "less tokens", "fewer tokens", "tldr",
8
+ * "/brief on", "brief mode on"
9
+ *
10
+ * Deactivation phrases:
11
+ * "stop being brief", "normal mode", "verbose mode", "brief off",
12
+ * "/brief off"
13
+ *
14
+ * Updates ~/.ashlr/brief.json and emits a status nudge in additionalContext
15
+ * so the user sees confirmation of the toggle.
16
+ *
17
+ * Hook contract (UserPromptSubmit):
18
+ * stdin → { prompt: string, ... }
19
+ * stdout → { hookSpecificOutput: { hookEventName: "UserPromptSubmit",
20
+ * additionalContext?: string } }
21
+ *
22
+ * Design:
23
+ * - Never blocks (always exits 0).
24
+ * - Best-effort stdin parse — falls through silently on any error.
25
+ * - Writes only when the toggle actually changes state.
26
+ */
27
+
28
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from "fs";
29
+ import { homedir } from "os";
30
+ import { join } from "path";
31
+
32
+ interface HookOutput {
33
+ hookSpecificOutput: {
34
+ hookEventName: "UserPromptSubmit";
35
+ additionalContext?: string;
36
+ };
37
+ }
38
+
39
+ interface BriefConfig {
40
+ level?: "off" | "lite" | "standard" | "concise";
41
+ source?: "user" | "project";
42
+ setAt?: string;
43
+ }
44
+
45
+ const ON_PATTERNS: Array<{ re: RegExp; level: "lite" | "standard" | "concise" }> = [
46
+ { re: /\bbrief\s+(?:mode\s+)?on\b/i, level: "standard" },
47
+ { re: /\bbe\s+brief\b/i, level: "standard" },
48
+ { re: /\bbe\s+terse\b/i, level: "standard" },
49
+ { re: /\bless\s+tokens?\b/i, level: "standard" },
50
+ { re: /\bfewer\s+tokens?\b/i, level: "standard" },
51
+ { re: /\btl;?dr\b/i, level: "concise" },
52
+ { re: /\/brief\s+on\b/i, level: "standard" },
53
+ ];
54
+
55
+ const OFF_PATTERNS: RegExp[] = [
56
+ /\bstop\s+(?:being\s+)?brief\b/i,
57
+ /\bnormal\s+mode\b/i,
58
+ /\bverbose\s+mode\b/i,
59
+ /\bbrief\s+off\b/i,
60
+ /\/brief\s+off\b/i,
61
+ ];
62
+
63
+ function home(): string {
64
+ return process.env.HOME ?? homedir();
65
+ }
66
+
67
+ function briefConfigPath(homeDir: string): string {
68
+ return join(homeDir, ".ashlr", "brief.json");
69
+ }
70
+
71
+ function readConfig(homeDir: string): BriefConfig {
72
+ const path = briefConfigPath(homeDir);
73
+ if (!existsSync(path)) return {};
74
+ try {
75
+ return JSON.parse(readFileSync(path, "utf-8")) as BriefConfig;
76
+ } catch {
77
+ return {};
78
+ }
79
+ }
80
+
81
+ function writeConfig(homeDir: string, cfg: BriefConfig): void {
82
+ const path = briefConfigPath(homeDir);
83
+ mkdirSync(join(homeDir, ".ashlr"), { recursive: true });
84
+ writeFileSync(path, JSON.stringify({ ...cfg, setAt: new Date().toISOString(), source: "user" }, null, 2));
85
+ }
86
+
87
+ /** Returns the new level and a human-readable message, or null when no toggle was triggered. */
88
+ export function detectToggle(prompt: string): { level: "off" | "lite" | "standard" | "concise"; reason: string } | null {
89
+ // OFF patterns first (so "stop being brief" beats "be brief")
90
+ for (const re of OFF_PATTERNS) {
91
+ if (re.test(prompt)) {
92
+ return { level: "off", reason: `matched: ${re}` };
93
+ }
94
+ }
95
+ // Explicit level via "brief = concise" / "brief on lite" / "/brief on lite" / etc.
96
+ // Allow either "brief = LEVEL", "brief on LEVEL", "brief LEVEL", or "/brief on LEVEL".
97
+ const levelMatch = prompt.match(/\/?\bbrief(?:\s*=\s*|\s+(?:mode\s+)?on\s+|\s+)(lite|standard|concise)\b/i);
98
+ if (levelMatch && levelMatch[1]) {
99
+ return { level: levelMatch[1].toLowerCase() as "lite" | "standard" | "concise", reason: "explicit level" };
100
+ }
101
+ for (const { re, level } of ON_PATTERNS) {
102
+ if (re.test(prompt)) {
103
+ return { level, reason: `matched: ${re}` };
104
+ }
105
+ }
106
+ return null;
107
+ }
108
+
109
+ async function main(): Promise<void> {
110
+ try {
111
+ let stdin = "";
112
+ process.stdin.setEncoding("utf-8");
113
+ for await (const chunk of process.stdin) stdin += chunk;
114
+ if (!stdin.trim()) {
115
+ process.stdout.write(JSON.stringify({ hookSpecificOutput: { hookEventName: "UserPromptSubmit" } }));
116
+ return;
117
+ }
118
+ const payload = JSON.parse(stdin) as { prompt?: string };
119
+ const prompt = typeof payload.prompt === "string" ? payload.prompt : "";
120
+
121
+ const toggle = detectToggle(prompt);
122
+ if (!toggle) {
123
+ process.stdout.write(JSON.stringify({ hookSpecificOutput: { hookEventName: "UserPromptSubmit" } }));
124
+ return;
125
+ }
126
+
127
+ const h = home();
128
+ const cfg = readConfig(h);
129
+ const previous = cfg.level ?? "off";
130
+ if (previous === toggle.level) {
131
+ // No state change.
132
+ process.stdout.write(JSON.stringify({ hookSpecificOutput: { hookEventName: "UserPromptSubmit" } }));
133
+ return;
134
+ }
135
+
136
+ writeConfig(h, { level: toggle.level });
137
+
138
+ const note = toggle.level === "off"
139
+ ? "[ashlr-brief] disabled — full verbosity restored for the next response."
140
+ : `[ashlr-brief] activated at level "${toggle.level}". Code blocks, errors, and destructive-action confirmations remain in full grammar. Toggle off with: stop being brief.`;
141
+
142
+ const out: HookOutput = {
143
+ hookSpecificOutput: {
144
+ hookEventName: "UserPromptSubmit",
145
+ additionalContext: note,
146
+ },
147
+ };
148
+ process.stdout.write(JSON.stringify(out));
149
+ } catch {
150
+ process.stdout.write(JSON.stringify({ hookSpecificOutput: { hookEventName: "UserPromptSubmit" } }));
151
+ }
152
+ }
153
+
154
+ if (import.meta.main) {
155
+ void main();
156
+ }
package/package.json ADDED
@@ -0,0 +1,56 @@
1
+ {
2
+ "name": "ashlr-plugin",
3
+ "version": "1.36.4",
4
+ "description": "Multi-host AI coding efficiency layer for Codex and Claude Code, powered by @ashlr/core-efficiency.",
5
+ "license": "MIT",
6
+ "type": "module",
7
+ "bin": {
8
+ "ashlr-plugin": "./scripts/cli.ts",
9
+ "ashlr-mcp": "./scripts/ashlr-mcp.ts"
10
+ },
11
+ "files": [
12
+ ".agents/plugins/marketplace.json",
13
+ ".claude-plugin/",
14
+ ".codex/agents/",
15
+ ".codex-plugin/",
16
+ ".mcp.json",
17
+ "agents/",
18
+ "bench/",
19
+ "commands/",
20
+ "docs/",
21
+ "hooks/",
22
+ "ports/",
23
+ "scripts/",
24
+ "servers/",
25
+ "skills/"
26
+ ],
27
+ "scripts": {
28
+ "server": "bun run servers/_router.ts",
29
+ "check": "bun run smoke:tools && bun run typecheck && bun run mdx-lint && bun run test && cd server && bun run check && cd ../site && bun run check && cd ../vscode && bun run check",
30
+ "smoke:tools": "bun run scripts/smoke-tools.ts",
31
+ "bench": "bun run scripts/run-benchmark.ts",
32
+ "test": "bun run scripts/run-root-tests.ts",
33
+ "typecheck": "bunx tsc --noEmit",
34
+ "mdx-lint": "bun run scripts/mdx-angle-bracket-lint.ts",
35
+ "brief-eval": "bun run scripts/brief-eval.ts",
36
+ "publish:github": "bash scripts/publish.sh",
37
+ "install-onnx-model": "bun run scripts/install-onnx-model.ts",
38
+ "version:bump": "bun run scripts/bump-version.ts",
39
+ "version:check": "bun run scripts/check-version-sync.ts"
40
+ },
41
+ "dependencies": {
42
+ "@ashlr/core-efficiency": "github:ashlrai/ashlr-core-efficiency#275610156ee314c3335025f0ba0c2379089e068c",
43
+ "@modelcontextprotocol/sdk": "^1.0.0",
44
+ "minimatch": "^10.2.5",
45
+ "postgres": "^3.4.9",
46
+ "tree-sitter-wasms": "^0.1.13",
47
+ "web-tree-sitter": "0.22.6"
48
+ },
49
+ "devDependencies": {
50
+ "@types/bun": "latest",
51
+ "typescript": "^5.7.0"
52
+ },
53
+ "optionalDependencies": {
54
+ "onnxruntime-node": "^1.20.0"
55
+ }
56
+ }
@@ -0,0 +1,108 @@
1
+ # ashlr in other MCP hosts
2
+
3
+ Ashlr is a suite of MCP servers. The servers speak the standard Model Context
4
+ Protocol over stdio and work in any MCP-compatible host, not just Claude Code.
5
+
6
+ This directory contains ready-made config snippets for Cursor and Goose. Codex
7
+ uses the repo-root `.codex-plugin/plugin.json` and `.mcp.json` files instead.
8
+
9
+ ---
10
+
11
+ ## Install
12
+
13
+ 1. Clone the repository and install dependencies:
14
+
15
+ ```bash
16
+ git clone https://github.com/ashlrai/ashlr-plugin
17
+ cd ashlr-plugin
18
+ bun install
19
+ ```
20
+
21
+ 2. Note the absolute path to your clone. You will substitute it for
22
+ `<ASHLR_PLUGIN_ROOT>` in the config files below.
23
+
24
+ The preferred MCP entry point is `scripts/ashlr-mcp.ts` or the package bin
25
+ `ashlr-mcp`. It launches the single router process with all 40 tools. The
26
+ legacy `scripts/mcp-entrypoint.sh` snippets are retained for older host
27
+ configs that still expect individual server files.
28
+
29
+ ---
30
+
31
+ ## Cursor
32
+
33
+ Cursor reads MCP server config from `.cursor/mcp.json` in your project, or from
34
+ `~/.cursor/mcp.json` globally.
35
+
36
+ Copy `ports/cursor/mcp.json` to one of those locations, then replace every
37
+ occurrence of `<ASHLR_PLUGIN_ROOT>` with the absolute path to your clone:
38
+
39
+ ```bash
40
+ # Example using sed
41
+ ASHLR_ROOT="/home/you/ashlr-plugin"
42
+ sed "s|<ASHLR_PLUGIN_ROOT>|$ASHLR_ROOT|g" \
43
+ ports/cursor/mcp.json > ~/.cursor/mcp.json
44
+ ```
45
+
46
+ Restart Cursor. The 40 ashlr tools will appear in the MCP panel.
47
+
48
+ ---
49
+
50
+ ## Goose
51
+
52
+ Goose reads extensions from a recipe file passed at run time.
53
+
54
+ Copy `ports/goose/recipe.yaml`, replace `<ASHLR_PLUGIN_ROOT>`, then run:
55
+
56
+ ```bash
57
+ ASHLR_ROOT="/home/you/ashlr-plugin"
58
+ sed "s|<ASHLR_PLUGIN_ROOT>|$ASHLR_ROOT|g" \
59
+ ports/goose/recipe.yaml > my-ashlr-recipe.yaml
60
+
61
+ goose run --recipe my-ashlr-recipe.yaml
62
+ ```
63
+
64
+ ---
65
+
66
+ ## Caveats
67
+
68
+ The following features are host-specific and are not available in Cursor or
69
+ Goose:
70
+
71
+ - **Claude slash commands** (`/ashlr-savings`, `/ashlr-genome-init`, etc.) —
72
+ defined in `.claude-plugin/plugin.json`. Codex has separate workflow skills
73
+ under `skills/` via `.codex-plugin/plugin.json`.
74
+ - **Status line** — the animated token-savings counter in the Claude Code
75
+ terminal is wired to Claude Code's `statusLine` hook.
76
+ - **Claude redirect hooks** — automatic redirect mode is Claude-only. Codex has
77
+ nudge-first hooks; Cursor and Goose expose MCP tools directly.
78
+
79
+ The underlying MCP tools (`ashlr__read`, `ashlr__grep`, `ashlr__edit`, etc.)
80
+ work identically in any host. Token savings are still tracked: the stats server
81
+ writes to `~/.ashlr/stats.json` on every call regardless of the host.
82
+
83
+ ### Shell prompt integration
84
+
85
+ If you want a savings counter in your shell prompt, run the status-line script
86
+ as a subshell command:
87
+
88
+ ```bash
89
+ # bash / zsh — add to PS1 or PROMPT
90
+ PS1='$(bun run /path/to/ashlr-plugin/scripts/savings-status-line.ts) \$ '
91
+ ```
92
+
93
+ The script reads `~/.ashlr/stats.json` and prints a compact savings summary
94
+ suitable for embedding in any shell prompt.
95
+
96
+ ---
97
+
98
+ ## Tools included
99
+
100
+ The current router exposes 40 tools from one MCP server. Run:
101
+
102
+ ```bash
103
+ ashlr-plugin tools
104
+ ```
105
+
106
+ Core tools include `ashlr__read`, `ashlr__grep`, `ashlr__edit`,
107
+ `ashlr__multi_edit`, `ashlr__bash`, `ashlr__tree`, `ashlr__savings`, and the
108
+ genome tools.
@@ -0,0 +1,11 @@
1
+ {
2
+ "mcpServers": {
3
+ "ashlr": {
4
+ "command": "bun",
5
+ "args": ["run", "<ASHLR_PLUGIN_ROOT>/scripts/ashlr-mcp.ts"],
6
+ "env": {
7
+ "ASHLR_MCP_HOST": "generic"
8
+ }
9
+ }
10
+ }
11
+ }
@@ -0,0 +1,26 @@
1
+ # Goose recipe: ashlr MCP router
2
+ # Replace <ASHLR_PLUGIN_ROOT> with the absolute path to your ashlr-plugin clone.
3
+ # Example: /home/you/ashlr-plugin
4
+ #
5
+ # Usage:
6
+ # goose run --recipe ports/goose/recipe.yaml
7
+ #
8
+ # One stdio extension registers the ashlr router with all 40 MCP tools.
9
+
10
+ version: "1.0"
11
+ title: ashlr token-efficiency suite
12
+ description: >
13
+ Registers the ashlr MCP router as one Goose extension.
14
+ Provides token-efficient Read/Grep/Edit/MultiEdit, SQL, Bash,
15
+ Tree, HTTP, Diff, Logs, Genome, Orient, GitHub, Glob, WebFetch,
16
+ Ask, savings, and orchestration tools.
17
+
18
+ extensions:
19
+ - name: ashlr
20
+ type: stdio
21
+ cmd: bun
22
+ args:
23
+ - "run"
24
+ - "<ASHLR_PLUGIN_ROOT>/scripts/ashlr-mcp.ts"
25
+ env:
26
+ ASHLR_MCP_HOST: generic