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,211 @@
1
+ # ashlr-plugin Token-Savings Benchmarks
2
+
3
+ > **Latest run:** v1.36.0 (`docs/benchmarks-v2.json`)
4
+ > **Headline:** `−57%` cross-language mean on real open-source codebases
5
+ > (TS/vercel-ai `−62%`, Python/pandas `−65%`, Rust/tokio `−44%`)
6
+ >
7
+ > _Prior self-repo figure (`−74%`) is preserved in `docs/benchmarks-v2.json`
8
+ > under `aggregate.overall.mean` but is no longer the headline — it reflects
9
+ > the plugin's own repo which includes large generated JSON and media files._
10
+
11
+ ## How the numbers are produced
12
+
13
+ `scripts/run-benchmark.ts` measures real byte/token reduction by calling the
14
+ handler functions directly — no MCP layer, no Claude Code in the loop. For
15
+ each tool, we sample representative inputs from a target repo, run them
16
+ through the canonical compression pipeline, and report:
17
+
18
+ - `rawBytes` / `rawTokens` — what the native tool would have shipped
19
+ - `ashlrBytes` / `ashlrTokens` — what the ashlr handler returned
20
+ - `ratio` — `ashlrBytes / rawBytes` (lower is better)
21
+
22
+ The output is a stable JSON shape (`docs/benchmarks-v2.json`) that downstream
23
+ tools (dashboard, README badges) can read without re-running the bench.
24
+
25
+ ```bash
26
+ # Run against the current repo
27
+ bun run scripts/run-benchmark.ts
28
+
29
+ # Run against another repo (must be a git checkout)
30
+ bun run scripts/run-benchmark.ts --repo /path/to/other-repo --out /tmp/other.json
31
+
32
+ # Dry-run: print results, don't write JSON
33
+ bun run scripts/run-benchmark.ts --dry-run
34
+ ```
35
+
36
+ ## What the headline number actually means
37
+
38
+ `overall.mean = arithmetic mean of all sample ratios across read/grep/edit.`
39
+
40
+ This is **a specific number for a specific repo and a specific tool mix**.
41
+ It is NOT a marketing estimate; it is what the compression layer measured on
42
+ actual files. Three things shape it:
43
+
44
+ 1. **File mix.** A repo full of large source files (well-suited to read
45
+ compression) will show higher savings than a repo full of media or
46
+ generated artifacts. The ashlr-plugin's own repo includes `hero.mp4`,
47
+ `bench/refs/`, `docs/benchmarks-v2.json` itself (large) — these drag
48
+ `ashlr__read` mean savings down vs a typical user codebase.
49
+
50
+ 2. **Tool mix.** Read and grep typically save 80-95%. Edit savings depend on
51
+ *where* the edit lives:
52
+ - Small edits (≤ 80 chars combined old+new) skip the redirect entirely
53
+ in real use (Track A `ASHLR_EDIT_MIN_CHARS` guard) — but the bench
54
+ calls handlers directly and so reports the negative-savings the guard
55
+ prevents in practice. Treat the edit headline as a ceiling for
56
+ "redirect-eligible edits," not a typical-user number.
57
+ - Medium edits (20-200 LOC range) save ~50%.
58
+ - Large edits (> 200 LOC) save 90%+.
59
+
60
+ 3. **Workload shape.** A user who reads many files but edits few will see
61
+ higher savings than a user who edits constantly with small touches.
62
+
63
+ ## Per-tool savings (measured 2026-04-26)
64
+
65
+ | Tool | Mean savings | Notes |
66
+ |---------------------|--------------|-------|
67
+ | `ashlr__read` | **−82.1%** | snipCompact head/tail + LLM summarization for >16KB files |
68
+ | `ashlr__grep` | **−92.8%** | Genome-RAG when available; ripgrep-summarize fallback |
69
+ | `ashlr__edit` | **~0%** raw bench | But hook now skips micro-edits below `ASHLR_EDIT_MIN_CHARS=80`, so real-world is ≥0 |
70
+ | `ashlr__multi_edit` | not in bench | Track B baseline fix (v1.22) — was 5-10× over-credited |
71
+ | `ashlr__websearch` | not in bench | Estimated 60-80% (per fixture inspection) |
72
+ | `ashlr__task_list` | not in bench | Estimated 70-85% (per fixture inspection) |
73
+ | `ashlr__notebook_edit` | not in bench | Estimated 65-75% on multi-cell notebooks |
74
+ | `ashlr__write` | not in bench | Identical to `ashlr__edit` for existing files |
75
+
76
+ **Future work**: extend `scripts/run-benchmark.ts` to include the new tool
77
+ families using `bench/fixtures/{websearch,tasklist,notebook}-*.{json,ipynb}`
78
+ + a curated multi-repo reference set (Node SDK, Python lib, Rust project).
79
+
80
+ ## Reproducing the numbers
81
+
82
+ The bench is deterministic given a repo + commit SHA. To verify a number:
83
+
84
+ ```bash
85
+ git checkout <sha> # the commit you want to reproduce
86
+ bun install
87
+ bun run scripts/run-benchmark.ts --dry-run
88
+ ```
89
+
90
+ The bench seeds its file sampler with the commit SHA (when run in a clean
91
+ checkout) so two people on the same SHA get the same sample set.
92
+
93
+ ## Multi-repo reference set
94
+
95
+ ### Why a multi-repo headline?
96
+
97
+ The ashlr-plugin's own repo contains `hero.mp4`, large generated JSON
98
+ (`docs/benchmarks-v2.json`), the `.ashlrcode/genome/` knowledge base, and
99
+ `site/tsconfig.tsbuildinfo`. These files make the self-repo benchmark
100
+ non-representative — they inflate `ashlr__read` savings beyond what a typical
101
+ user codebase would see.
102
+
103
+ ### The three reference repos
104
+
105
+ | Key | Language | Upstream | Sampled commit | Files |
106
+ |-----|----------|----------|----------------|-------|
107
+ | `node-sdk` | TypeScript | [vercel/ai](https://github.com/vercel/ai) | `0498012` | 32 TS files from `packages/ai/src/` |
108
+ | `python-lib` | Python | [pandas-dev/pandas](https://github.com/pandas-dev/pandas) | `be0642f` | 30 Py files from `pandas/core/` |
109
+ | `rust-project` | Rust | [tokio-rs/tokio](https://github.com/tokio-rs/tokio) | `6c03e03` | 31 Rs files from `tokio/src/` |
110
+
111
+ Each ref directory lives in `bench/refs/<key>/` and is itself a git repo.
112
+ A `.refrev` file records the upstream commit SHA sampled from.
113
+
114
+ **Why these three?** TypeScript + Python + Rust are the top three languages in
115
+ the ashlr-plugin user base (based on install telemetry). Each project is a
116
+ well-maintained OSS library with realistic file size distributions: small
117
+ utilities, medium modules, and large implementation files. They collectively
118
+ represent agentic AI SDK code, data-science library internals, and systems
119
+ async runtime code — meaningfully different workloads.
120
+
121
+ ### Results (measured 2026-04-26)
122
+
123
+ | Repo | Overall | Read | Grep | Edit |
124
+ |------|---------|------|------|------|
125
+ | `node-sdk` (TS) | **−61.6%** | −75.3% | −66.1% | ~0%* |
126
+ | `python-lib` (Py) | **−64.9%** | −78.8% | −67.9% | ~0%* |
127
+ | `rust-project` (Rs) | **−43.6%** | −70.0% | −17.2% | ~0%* |
128
+ | **Cross-language mean** | **−57%** | **−75%** | **−50%** | ~0%* |
129
+
130
+ _*Edit savings at ~0% in the bench reflects the synthetic small-edit overhead
131
+ (see edit caveat above). Real-world medium/large edits save 50-96%._
132
+
133
+ **Note on grep for Rust:** ripgrep patterns `import`, `TODO`, `class`, and
134
+ `interface` have low match rates in Rust source (Rust uses `use`, `//TODO:`,
135
+ struct/enum, and traits instead). This suppresses the grep headline for the
136
+ rust-project repo. With Rust-idiomatic patterns (`fn `, `use `, `impl `, etc.)
137
+ savings would be comparable to TS/Py. The bench intentionally uses
138
+ language-agnostic patterns to expose this; the genome-RAG path (not measured
139
+ here) adapts to file content automatically.
140
+
141
+ ### How the aggregate is computed
142
+
143
+ `crossLanguageMean = arithmetic mean of the 3 repo overall.mean values`
144
+
145
+ The per-repo mean is itself the pooled mean across all individual read/grep/edit
146
+ sample ratios (same as the per-repo bench). See `scripts/benchmark-refs.ts` for
147
+ the exact computation.
148
+
149
+ ### Running the multi-repo bench yourself
150
+
151
+ ```bash
152
+ # Run all three ref repos and merge into docs/benchmarks-v2.json
153
+ bun run scripts/benchmark-refs.ts
154
+
155
+ # Dry run (no file write)
156
+ bun run scripts/benchmark-refs.ts --dry-run
157
+
158
+ # Write to a different output path
159
+ bun run scripts/benchmark-refs.ts --out /tmp/my-bench.json
160
+ ```
161
+
162
+ ### Extending with your own repo
163
+
164
+ You can add your own codebase to the reference set:
165
+
166
+ 1. Create a directory under `bench/refs/<your-key>/` and populate it with
167
+ source files (must be a git checkout — `git init && git add . && git commit`).
168
+ 2. Add a `.refrev` file with the upstream commit SHA.
169
+ 3. Add your config to the `REFS` array in `scripts/benchmark-refs.ts`.
170
+
171
+ The bench uses `git ls-files` to enumerate tracked files, so you control
172
+ exactly which files are measured by what you commit to the ref repo.
173
+
174
+ ## Trust pass — what `v1.22` fixed in the math
175
+
176
+ Per the v1.22 audit (`~/.claude/plans/ultrathink-deploy-agents-to-jazzy-hoare.md`),
177
+ four bugs distorted reported savings prior to this release:
178
+
179
+ 1. **Edit micro-edit penalty.** Sub-80-char edits on >5KB files were
180
+ redirected through the diff round-trip and produced *negative* savings
181
+ (~−150% at p90 in `docs/benchmarks-v2.json`). Track A added an
182
+ `ASHLR_EDIT_MIN_CHARS` guard that passes those through to native Edit.
183
+
184
+ 2. **Multi-edit baseline inflation.** `ashlr__multi_edit` baseline was
185
+ `original.length + updated.length` per file (full file twice) — the
186
+ pre-v1.18 formula. Track A aligned it with single-edit:
187
+ `Σ hunk.search.length + hunk.replace.length`. Removed 5-10× over-credit.
188
+
189
+ 3. **Pricing map.** Default model was `sonnet-4.5` ($3/MTok). Track A
190
+ added `sonnet-4.6` ($2.5) as new default plus `opus-4.7` ($18 in / $90 out).
191
+ Opus users were under-priced ~2× before.
192
+
193
+ 4. **`tool_noop` mislabeling.** Low-confidence paths emitted `tool_noop`
194
+ events even when content WAS shipped. Track A renamed to
195
+ `tool_low_confidence_shipped` so the savings-accounting signal is
196
+ accurate. `tool_noop` now reserved for actual zero-bytes-shipped no-ops.
197
+
198
+ ## Telemetry that grounds the bench in real usage
199
+
200
+ v1.22 Track G adds dashboard sections that show real-world data:
201
+
202
+ - **"Where savings come from"** — per-mechanism breakdown
203
+ (snipCompact / LLM-anthropic / LLM-onnx / LLM-local / genome / embed-cache /
204
+ structured-render).
205
+ - **"Adoption funnel"** — blocks emitted vs blocks → ashlr-call rate (7-day
206
+ rolling). Run `/ashlr-dashboard` to see it.
207
+ - **`/ashlr-status`** — LLM provider availability + embed-cache hit rate +
208
+ genome fire-rate + 24h block→ashlr-call ratio.
209
+
210
+ These are the numbers worth tracking weekly. The bench is a calibration
211
+ tool; the telemetry is the live feedback loop.
@@ -0,0 +1,185 @@
1
+ # ashlr billing
2
+
3
+ ashlr uses Stripe for subscription billing. This document covers the tiers,
4
+ the integration architecture, and what happens at each lifecycle event.
5
+
6
+ ## Tiers
7
+
8
+ | Tier | Price | Features |
9
+ |------|-------|----------|
10
+ | Free | $0 | Full local plugin, 40 MCP tools, 34 slash commands, Codex workflow skills, local genome scribe loop |
11
+ | Pro | $12/mo or $120/yr | Everything in Free + cloud LLM summarizer, cross-machine stats sync, hosted retrieval, live auto-updating badge |
12
+ | Team | $24/user/mo or $240/user/yr | Everything in Pro + shared team genome sync, team dashboard, priority support (min 3 users) |
13
+
14
+ Free users who attempt to use gated endpoints receive HTTP 403 with
15
+ `{ "error": "This feature requires a paid plan.", "upgrade_url": "/billing/checkout" }`.
16
+
17
+ ## How users get access
18
+
19
+ The fastest way to upgrade is `/ashlr-upgrade` — a terminal-native flow that
20
+ takes under 90 seconds without leaving Claude Code. See [upgrade.md](upgrade.md)
21
+ for the full walkthrough.
22
+
23
+ Users can also sign up and sign in through a passwordless magic-link flow:
24
+
25
+ 1. Visit `/signin` on the site and enter an email address.
26
+ 2. The backend creates a user record (if new) and sends a one-time link via
27
+ [SendGrid](https://sendgrid.com). The link is valid for 15 minutes.
28
+ 3. Clicking the link calls `POST /auth/verify`, which issues a permanent API
29
+ token and stores it in the user's browser (`localStorage`). The token is
30
+ used as a `Bearer` credential for all subsequent API calls.
31
+ 4. To upgrade to Pro or Team, the user visits `/pricing` and completes a
32
+ Stripe Checkout session. The webhook at `POST /billing/webhook` promotes the
33
+ user's tier in the database.
34
+
35
+ **Rate limit:** The `/auth/send` endpoint accepts at most 5 requests per email
36
+ address per hour. The 6th request returns HTTP 429.
37
+
38
+ **Self-serve:** There is no longer a manual CLI provisioning step for new users.
39
+ The `bun run src/cli/issue-token.ts <email>` CLI is retained for internal use
40
+ and emergency provisioning only.
41
+
42
+ ## Stripe integration
43
+
44
+ ### Products and prices
45
+
46
+ The `stripe-setup` CLI creates two Stripe products ("ashlr Pro" and "ashlr Team")
47
+ with four prices (monthly and annual for each). IDs are stored in the
48
+ `stripe_products` database table so the runtime never hard-codes them.
49
+
50
+ To bootstrap a new environment:
51
+
52
+ ```sh
53
+ STRIPE_SECRET_KEY=sk_live_... bun run src/cli/stripe-setup.ts
54
+ ```
55
+
56
+ The script is idempotent — re-running it skips any prices already in the DB.
57
+
58
+ ### Checkout flow
59
+
60
+ 1. Authenticated user POSTs to `POST /billing/checkout` with `{ tier, seats? }`.
61
+ 2. Server creates a Stripe Checkout Session and returns `{ url }`.
62
+ 3. Client redirects user to `url`.
63
+ 4. On success, Stripe redirects to `/billing/return?session={CHECKOUT_SESSION_ID}`
64
+ and fires a `checkout.session.completed` webhook.
65
+ 5. Webhook handler creates the subscription record and upgrades `users.tier`.
66
+
67
+ ### Customer portal
68
+
69
+ `GET /billing/portal` creates a Stripe Customer Portal session for the
70
+ authenticated user. The portal lets them update their payment method, view
71
+ invoices, change plan, or cancel. Returns `{ url }` for a client-side redirect.
72
+
73
+ Users without a billing record receive 404.
74
+
75
+ ### Subscription status
76
+
77
+ `GET /billing/status` returns:
78
+
79
+ ```json
80
+ {
81
+ "tier": "pro",
82
+ "seats": 1,
83
+ "renewsAt": "2026-05-17T00:00:00.000Z",
84
+ "cancelAt": null
85
+ }
86
+ ```
87
+
88
+ Free users with no subscription record receive `{ "tier": "free", ... }`.
89
+
90
+ ## Webhook events
91
+
92
+ The webhook endpoint is `POST /billing/webhook`. Register it in the Stripe
93
+ dashboard pointing at `https://api.ashlr.ai/billing/webhook`.
94
+
95
+ Events handled:
96
+
97
+ | Event | Action |
98
+ |-------|--------|
99
+ | `checkout.session.completed` | Creates subscription record, sets `users.tier` to the purchased tier |
100
+ | `customer.subscription.updated` | Updates `current_period_end`, `seats`, and `status`; reactivates tier if status returns to `active` |
101
+ | `customer.subscription.deleted` | Sets subscription `status` to `canceled`, downgrades `users.tier` to `free` |
102
+ | `invoice.payment_failed` | Sets subscription `status` to `past_due`; tier remains for the 7-day grace period while Stripe retries |
103
+
104
+ Webhook idempotency is enforced via the `stripe_events` table. Duplicate
105
+ `event.id` deliveries return 200 immediately without re-processing.
106
+
107
+ All events are verified via `stripe.webhooks.constructEvent` using the
108
+ `STRIPE_WEBHOOK_SECRET` environment variable. Invalid signatures return 400.
109
+
110
+ ## What happens on cancellation
111
+
112
+ When a user cancels, Stripe fires `customer.subscription.deleted` at the end
113
+ of the paid period. The webhook handler downgrades `users.tier` to `free`.
114
+ The subscription record is retained for auditing with `status = 'canceled'`.
115
+
116
+ Users on an annual plan who cancel mid-year retain access until the period end
117
+ (`current_period_end`). Refunds are handled through the Stripe dashboard.
118
+
119
+ ## Dispute policy
120
+
121
+ Disputes should be handled through the Stripe dashboard. Contact
122
+ support@ashlr.ai for billing questions before initiating a chargeback.
123
+
124
+ ## Environment variables
125
+
126
+ | Variable | Required | Description |
127
+ |----------|----------|-------------|
128
+ | `STRIPE_SECRET_KEY` | Yes (production) | Stripe secret key (`sk_live_...` or `sk_test_...`) |
129
+ | `STRIPE_WEBHOOK_SECRET` | Yes (production) | Signing secret from Stripe webhook dashboard (`whsec_...`) |
130
+ | `BASE_URL` | No | Base URL for success/return redirects (default: `https://api.ashlr.ai`) |
131
+ | `SITE_URL` | No | Site URL for cancel redirect (default: `https://plugin.ashlr.ai`) |
132
+ | `TESTING` | Tests only | Set to `1` to stub Stripe client; no real API calls are made |
133
+
134
+ ## Database tables
135
+
136
+ Three tables support billing:
137
+
138
+ - **`subscriptions`** — one row per Stripe subscription; tracks tier, status,
139
+ seats, `current_period_end`, and `cancel_at`.
140
+ - **`stripe_events`** — event IDs from processed webhook deliveries; prevents
141
+ double-processing on Stripe retries.
142
+ - **`stripe_products`** — caches Stripe product and price IDs seeded by the
143
+ `stripe-setup` CLI; keyed by `pro`, `pro-annual`, `team`, `team-annual`.
144
+
145
+ The `users` table has a `tier` column (`free` | `pro` | `team`) that is the
146
+ single source of truth for access control checks at request time.
147
+
148
+ ## Audit log and policy packs (team tier)
149
+
150
+ Both features require the **team** tier or higher. Free and Pro users receive
151
+ HTTP 403 if they attempt to call these endpoints.
152
+
153
+ ### Policy packs
154
+
155
+ Team admins can upload YAML/JSON allow-deny-confirm rule sets via
156
+ `POST /policy/upload`. The server stores each upload as an immutable versioned
157
+ snapshot. Members fetch the current pack via `GET /policy/current` (cached
158
+ 5 minutes via ETag). Admins can roll back to any prior version via
159
+ `POST /policy/rollback`. See `docs/policy-packs.md` for rule syntax and
160
+ examples.
161
+
162
+ Only users with `org_role = "admin"` can upload or roll back. Members can
163
+ read the current pack. Free and Pro users are rejected at the tier gate before
164
+ org-role checks run.
165
+
166
+ ### Audit log
167
+
168
+ The `POST /audit/event` endpoint accepts tool-call events from the
169
+ `audit-upload` hook. Events are written to `audit_events` in an append-only
170
+ fashion — no updates or deletes are issued outside of explicit admin purges.
171
+
172
+ Paths and cwds in event arguments are replaced with a 16-char SHA-256
173
+ fingerprint before storage. File contents are never stored. This satisfies
174
+ GDPR path-data minimisation while preserving correlation for compliance audits.
175
+
176
+ Org admins can query events with filters (`GET /audit/events`) or export the
177
+ full log as NDJSON (`GET /audit/export`). Non-admin members are blocked at the
178
+ org-role gate with 403.
179
+
180
+ ### Database tables (Phase 4)
181
+
182
+ - **`policy_packs`** — immutable versioned snapshots; unique on `(org_id, name, version)`.
183
+ - **`policy_current`** — one row per org; points to the active pack.
184
+ - **`audit_events`** — append-only event log; indexed by `(org_id, at)` and `(user_id, at)`.
185
+ - **`users.org_id`** / **`users.org_role`** — org membership and role columns added in Phase 4 migration.
@@ -0,0 +1,155 @@
1
+ # Cloud Genome Pipeline
2
+
3
+ Architecture reference for the server-side genome build, encryption, and client pull pipeline introduced in v1.13.
4
+
5
+ ---
6
+
7
+ ## Overview
8
+
9
+ ```
10
+ User CLI (session start)
11
+ │
12
+ │ hooks/session-start.ts
13
+ │ └─ scripts/genome-cloud-pull.ts
14
+ │ parse cwd git remote
15
+ │ canonicalize repo URL
16
+ │ GET /genome/personal/find?repo_url=<canon>
17
+ │ ├─ found: download sections
18
+ │ └─ not found: skip silently
19
+ │ decrypt sections (user genome key)
20
+ │ write to ~/.ashlr/genomes/<projectHash>/
21
+ │ write .ashlr-cloud-genome marker
22
+ │
23
+ ▼
24
+ ashlr__grep retrieval chain
25
+ ├─ 1. local .ashlrcode/genome/ (always wins if present)
26
+ ├─ 2. ~/.ashlr/genomes/<hash>/ (cloud cache, via findParentGenome)
27
+ └─ 3. ripgrep full-tree fallback
28
+ ```
29
+
30
+ The cloud genome supplements local genomes — it never replaces them. If `.ashlrcode/genome/` exists in the project, it is used exclusively and the cloud cache is ignored for that session.
31
+
32
+ ---
33
+
34
+ ## File locations
35
+
36
+ | Path | Purpose |
37
+ |---|---|
38
+ | `~/.ashlr/genomes/<projectHash>/` | Per-project cloud genome cache directory |
39
+ | `~/.ashlr/genomes/<projectHash>/.ashlr-cloud-genome` | Marker file; presence indicates a cloud genome is loaded |
40
+ | `~/.ashlr/genome-key` | Per-user master genome decryption key, mode `0o600`. Fetched once from `GET /user/genome-key` and cached locally. |
41
+ | `~/.ashlr/genome-cloud-pull.log` | Pull log: timestamps, section counts, errors |
42
+
43
+ `<projectHash>` is a SHA-256 of the canonical repo URL (e.g. `github.com/owner/repo`), truncated to 16 hex chars.
44
+
45
+ ---
46
+
47
+ ## Build pipeline
48
+
49
+ Source: `server/src/services/genome-build.ts`
50
+
51
+ ```
52
+ POST /genome/build { userId, owner, repo }
53
+ │
54
+ ▼
55
+ buildGenomeFromGitHub(userId, owner, repo)
56
+ │
57
+ ├─ tier check: free tier → visibility must be "public"
58
+ │ live check via api.github.com/repos/<owner>/<repo>
59
+ │ (server-enforced; client cannot bypass)
60
+ │
61
+ ├─ git clone --depth 1 (60s timeout)
62
+ │
63
+ ├─ bun run scripts/genome-init.ts --minimal (120s timeout)
64
+ │ produces: architecture.md, conventions.md, decisions.md
65
+ │ + top-level file index
66
+ │
67
+ ├─ per-section AES-GCM encrypt
68
+ │ key: users.genome_encryption_key_encrypted (auto-generated on first build)
69
+ │
70
+ └─ upsertSection → genomes table
71
+ sets build_status = "ready", last_built_at = now()
72
+ ```
73
+
74
+ Rate limit: 5 builds per user per hour (`POST /genome/build`).
75
+
76
+ ---
77
+
78
+ ## Tier gating
79
+
80
+ | Tier | Repo visibility | Enforcement |
81
+ |---|---|---|
82
+ | Free | Public repos only | Server performs live `api.github.com` check on every build request. `repo_visibility` stored in `genomes` table for audit. |
83
+ | Pro | Public + private | `repo` scope step-up consent required. Server verifies token has `repo` scope before cloning. |
84
+
85
+ The client cannot fake visibility. The live API check is performed server-side regardless of what the client reports.
86
+
87
+ ---
88
+
89
+ ## Encryption
90
+
91
+ ### Per-user genome key
92
+
93
+ Each user has a `genome_encryption_key_encrypted` column in the `users` table. This is a random 32-byte key, itself encrypted with the server's `ASHLR_MASTER_KEY`. The key is auto-generated on first private-repo build (or first genome build for Pro users).
94
+
95
+ `GET /user/genome-key` returns the decrypted key over TLS. The client caches it at `~/.ashlr/genome-key` with mode `0o600`. This file is never included in git history or synced.
96
+
97
+ ### Section encryption
98
+
99
+ Each genome section is encrypted individually with AES-256-GCM:
100
+ - Random 12-byte IV per section
101
+ - Auth tag appended
102
+ - Implementation: `servers/_genome-crypto.ts`
103
+
104
+ The server stores ciphertext; plaintext never touches disk on the server after the build completes.
105
+
106
+ ---
107
+
108
+ ## Webhook-driven delta rebuild
109
+
110
+ Source: `server/src/routes/webhooks.ts`
111
+
112
+ GitHub push events trigger incremental re-indexing of affected genome sections rather than a full rebuild.
113
+
114
+ ```
115
+ GitHub push event → POST /webhooks/github
116
+ │
117
+ ├─ verify HMAC-SHA256 signature (timingSafeEqual)
118
+ │ header: X-Hub-Signature-256
119
+ │ secret: GITHUB_WEBHOOK_SECRET
120
+ │
121
+ ├─ deduplicate by X-GitHub-Delivery header (idempotency)
122
+ │
123
+ ├─ extract changed file paths from commits[].added/modified/removed
124
+ │
125
+ ├─ map paths → genome sections (by path prefix)
126
+ │
127
+ └─ re-run genome-init --section <name> for each affected section
128
+ upsertSection → update last_built_at
129
+ ```
130
+
131
+ Signature verification is at `server/src/routes/webhooks.ts:28-35`. Deliveries are stored by delivery ID; a duplicate delivery is acknowledged with 200 and skipped.
132
+
133
+ To register the webhook on your repo: `github.com/<owner>/<repo>/settings/hooks` → Payload URL: `https://api.ashlr.ai/webhooks/github`, content type: `application/json`, events: `push`.
134
+
135
+ ---
136
+
137
+ ## Kill switch
138
+
139
+ Set `ASHLR_CLOUD_GENOME_DISABLE=1` in your shell environment (or in `~/.claude/settings.json` under `env`) to disable the cloud genome pull entirely. `ashlr__grep` will skip the `~/.ashlr/genomes/` cache and fall through to ripgrep.
140
+
141
+ This is useful if you are on a slow connection, working offline, or want to force the local-only code path for testing.
142
+
143
+ ---
144
+
145
+ ## When `ashlr__grep` consults the cloud cache
146
+
147
+ The retrieval order in `servers/_genome-cache.ts:findParentGenome`:
148
+
149
+ 1. Walk up from `cwd` looking for `.ashlrcode/genome/`. If found, use it — done.
150
+ 2. Compute `projectHash` from the git remote of `cwd`.
151
+ 3. Check `~/.ashlr/genomes/<projectHash>/.ashlr-cloud-genome` exists.
152
+ 4. If yes, load sections from that directory and run TF-IDF retrieval.
153
+ 5. If no match or `ASHLR_CLOUD_GENOME_DISABLE=1`, fall through to ripgrep.
154
+
155
+ The local genome always wins. Cloud is a supplement, not a replacement.
@@ -0,0 +1,92 @@
1
+ # WozCode Competitive Learnings
2
+
3
+ > Internal strategy doc — last updated 2026-06-01.
4
+ > Source: public site/repo analysis (minified), benchmark pages, pricing docs.
5
+ > Treat WozCode's self-reported numbers with skepticism (see Caveats).
6
+
7
+ ---
8
+
9
+ ## Summary
10
+
11
+ WozCode is a closed-source, account-gated Claude Code efficiency plugin (~182 GitHub stars). It competes directly with Ashlr on token reduction. Their headline claim is "80% token reduction," but their own benchmark pages show internally inconsistent numbers. Ashlr's measured, per-tool savings data is a stronger trust signal.
12
+
13
+ Three technical capabilities are worth adopting or beating. One pricing model (pay-for-performance) is defensible for Ashlr and worth studying. Several growth surfaces (llms.txt, leaderboard, benchmark blog) are low-effort wins.
14
+
15
+ ---
16
+
17
+ ## Capability Comparison
18
+
19
+ | Capability | WozCode | Ashlr |
20
+ |---|---|---|
21
+ | AST-truncated reads (stub bodies, keep signatures) | Yes — default-on for large files | Not yet |
22
+ | Fuzzy edit matching (Levenshtein + whitespace tolerance) | Yes | Not yet |
23
+ | Post-edit syntax validation loop (Tree-sitter/tsc) | Yes | Not yet |
24
+ | Genome / RAG context retrieval | No | Yes |
25
+ | Per-tool measured savings | No (aggregate self-report) | Yes |
26
+ | Open source + auditable | No (minified, account-gated) | Yes |
27
+ | Opt-in telemetry | No (PostHog on-by-default, hardcoded token) | Yes |
28
+ | Tool breadth | Narrow (deliberate) | 40 tools, 33 commands |
29
+ | `llms.txt` | Yes | No |
30
+ | Public savings leaderboard | Yes (gamified) | No |
31
+ | Multi-surface install (VS Code / Cursor / Windows) | Yes | macOS/Linux primary |
32
+ | Plain-English settings UI (`/woz-settings`) | Yes | Partial (`/ashlr-settings`) |
33
+ | Benchmark blog post | Yes | No |
34
+
35
+ ---
36
+
37
+ ## Prioritized Learnings
38
+
39
+ ### P0 — Product (implement to close capability gap)
40
+
41
+ **1. AST-truncated reads** (highest per-call token win)
42
+ WozCode stubs out function bodies on large file reads, returning only signatures, types, and exports. This is their biggest single-call saving. For Ashlr: extend `ashlr__read` to detect large files (>N LOC) and emit an AST-truncated view by default, with `bypassSummary:true` to get full content. Tree-sitter or `@ast-grep/napi` are viable. Make it default-on — users should not need to opt in.
43
+
44
+ **2. Fuzzy edit matching**
45
+ WozCode applies Levenshtein distance + whitespace/unicode normalization before failing an edit. Today Ashlr's `ashlr__edit` fails on whitespace drift, forcing a costly retry round-trip. Adding a fuzzy fallback (with a diff preview so the model can confirm) eliminates that class of second-turn errors entirely.
46
+
47
+ **3. Post-edit syntax validation loop**
48
+ After each edit, WozCode runs a fast syntax check (Tree-sitter for parse errors, `tsc --noEmit` for TypeScript, file-type-appropriate linter) and feeds failures back in the same turn. This prevents bad edits from reaching a second model round-trip. For Ashlr: add an optional `validate: true` flag to `ashlr__edit` / `ashlr__multi_edit` that runs the cheapest applicable checker and returns inline errors.
49
+
50
+ ### P1 — Positioning + Pricing
51
+
52
+ **Pay-for-performance pricing model**
53
+ WozCode Enterprise: `$50/seat + 10% of measured savings`. This is actually *more* defensible for Ashlr than for WozCode because Ashlr's savings are **measured per-tool** (not self-reported aggregate). A pay-for-performance tier aligns incentives perfectly and turns Ashlr's measurement advantage into a pricing advantage. Study structure: base seat fee covers fixed costs; the savings share creates a shared-upside relationship.
54
+
55
+ **Savings cap on free tier**
56
+ WozCode offers a free tier capped at $100/mo in savings rather than feature-gating. This is a better acquisition model than feature-gating: users experience the full product, and heavy users naturally convert. Consider adopting for Ashlr's free tier.
57
+
58
+ **Lean into WozCode's benchmark inconsistency**
59
+ WozCode's TerminalBench numbers differ across their own pages: 80.2%/69% vs 68%/58% vs "17% on their blog." These are internally inconsistent and unverifiable. Ashlr should publish a transparent, reproducible benchmark methodology with per-tool breakdowns — this is already partially done via `benchmarks.md` / `benchmarks-v2.json`. A short benchmark blog post with methodology and raw data is a credibility differentiator.
60
+
61
+ ### P2 — Growth + DX
62
+
63
+ **`llms.txt`** — Add `site/public/llms.txt` listing Ashlr's tools, commands, and genome format. WozCode has one; it improves AI-driven discovery and is a 30-minute task.
64
+
65
+ **Public savings leaderboard** — Opt-in leaderboard showing top savers (anonymized or named). WozCode uses this for social proof. Ashlr already collects savings data; surfacing it publicly turns a telemetry feature into a growth loop.
66
+
67
+ **Benchmark blog post** — A single authoritative post with methodology, per-tool numbers, and comparison. Addresses the credibility gap vs WozCode's (flawed) benchmarks. Publish to the marketing site; link from README and llms.txt.
68
+
69
+ **Multi-surface install matrix** — Document and test install on VS Code (with MCP), Cursor, Windows (PowerShell). `docs/install-windows.md` and `docs/install.ps1` already exist — surface them more prominently. WozCode's multi-surface presence expands their addressable audience.
70
+
71
+ **Plain-English settings** — `/ashlr-settings` should describe each setting in one plain sentence with a concrete example. Reduces friction for non-power users.
72
+
73
+ ---
74
+
75
+ ## Where Ashlr Already Wins
76
+
77
+ Message these proactively in docs, README, and the benchmark blog:
78
+
79
+ - **Open source + auditable.** WozCode is minified and requires account creation to inspect behavior. Ashlr is fully open — every tool, hook, and genome interaction is readable.
80
+ - **Measured savings, not self-reported.** Ashlr tracks per-tool token and cost savings with a verifiable methodology. WozCode's numbers are inconsistent across their own pages.
81
+ - **Opt-in telemetry.** WozCode ships PostHog with a hardcoded token, on by default. Ashlr's telemetry is opt-in and documented.
82
+ - **Breadth.** 40 tools, 33 commands, genome RAG, `/ashlr-brief`, `/ashlr-efficient`. WozCode's surface is deliberately narrow.
83
+ - **No account required.** Ashlr installs with one curl command and one slash command. WozCode requires account creation before the plugin is functional.
84
+
85
+ ---
86
+
87
+ ## Caveats
88
+
89
+ 1. **Benchmark numbers are unverifiable.** All WozCode efficiency claims are self-reported. Their own pages show inconsistent figures (TerminalBench: 80.2/69 vs 68/58 vs "17%"). Do not treat these as ground truth.
90
+ 2. **Internals are inferred.** The WozCode repo is minified and obfuscated. Technical capabilities above (AST truncation, fuzzy matching, syntax validation) are inferred from public documentation, changelogs, and behavior — not audited source.
91
+ 3. **Third-party reputation is thin.** 182 GitHub stars, low HN engagement, no independent benchmark reproductions as of 2026-06-01. This is an opening: Ashlr can establish the credibility standard before WozCode does.
92
+ 4. **Competitive landscape moves fast.** Re-verify these findings before any public messaging; capabilities may have changed.