@ashlr/hub 2.2.0

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 (477) hide show
  1. package/CHANGELOG.md +1158 -0
  2. package/LICENSE +21 -0
  3. package/README.md +833 -0
  4. package/bin/ashlr +8 -0
  5. package/dist/api/core.d.ts +28 -0
  6. package/dist/api/core.js +42 -0
  7. package/dist/api/core.js.map +1 -0
  8. package/dist/api/index.d.ts +9 -0
  9. package/dist/api/index.js +9 -0
  10. package/dist/api/index.js.map +1 -0
  11. package/dist/api/plugin.d.ts +12 -0
  12. package/dist/api/plugin.js +13 -0
  13. package/dist/api/plugin.js.map +1 -0
  14. package/dist/api/types.d.ts +9 -0
  15. package/dist/api/types.js +9 -0
  16. package/dist/api/types.js.map +1 -0
  17. package/dist/cli/args.d.ts +20 -0
  18. package/dist/cli/args.js +23 -0
  19. package/dist/cli/args.js.map +1 -0
  20. package/dist/cli/ask.d.ts +22 -0
  21. package/dist/cli/ask.js +240 -0
  22. package/dist/cli/ask.js.map +1 -0
  23. package/dist/cli/audit.d.ts +26 -0
  24. package/dist/cli/audit.js +199 -0
  25. package/dist/cli/audit.js.map +1 -0
  26. package/dist/cli/backlog.d.ts +26 -0
  27. package/dist/cli/backlog.js +322 -0
  28. package/dist/cli/backlog.js.map +1 -0
  29. package/dist/cli/completions.d.ts +18 -0
  30. package/dist/cli/completions.js +156 -0
  31. package/dist/cli/completions.js.map +1 -0
  32. package/dist/cli/daemon.d.ts +31 -0
  33. package/dist/cli/daemon.js +334 -0
  34. package/dist/cli/daemon.js.map +1 -0
  35. package/dist/cli/demo-sandbox.d.ts +78 -0
  36. package/dist/cli/demo-sandbox.js +227 -0
  37. package/dist/cli/demo-sandbox.js.map +1 -0
  38. package/dist/cli/demo.d.ts +76 -0
  39. package/dist/cli/demo.js +285 -0
  40. package/dist/cli/demo.js.map +1 -0
  41. package/dist/cli/digest.d.ts +46 -0
  42. package/dist/cli/digest.js +352 -0
  43. package/dist/cli/digest.js.map +1 -0
  44. package/dist/cli/doctor-init.d.ts +28 -0
  45. package/dist/cli/doctor-init.js +335 -0
  46. package/dist/cli/doctor-init.js.map +1 -0
  47. package/dist/cli/genome.d.ts +62 -0
  48. package/dist/cli/genome.js +1061 -0
  49. package/dist/cli/genome.js.map +1 -0
  50. package/dist/cli/gh.d.ts +27 -0
  51. package/dist/cli/gh.js +322 -0
  52. package/dist/cli/gh.js.map +1 -0
  53. package/dist/cli/goals.d.ts +55 -0
  54. package/dist/cli/goals.js +667 -0
  55. package/dist/cli/goals.js.map +1 -0
  56. package/dist/cli/health.d.ts +56 -0
  57. package/dist/cli/health.js +407 -0
  58. package/dist/cli/health.js.map +1 -0
  59. package/dist/cli/help.d.ts +51 -0
  60. package/dist/cli/help.js +436 -0
  61. package/dist/cli/help.js.map +1 -0
  62. package/dist/cli/inbox.d.ts +28 -0
  63. package/dist/cli/inbox.js +589 -0
  64. package/dist/cli/inbox.js.map +1 -0
  65. package/dist/cli/index.d.ts +41 -0
  66. package/dist/cli/index.js +1208 -0
  67. package/dist/cli/index.js.map +1 -0
  68. package/dist/cli/knowledge.d.ts +33 -0
  69. package/dist/cli/knowledge.js +575 -0
  70. package/dist/cli/knowledge.js.map +1 -0
  71. package/dist/cli/mcp.d.ts +26 -0
  72. package/dist/cli/mcp.js +487 -0
  73. package/dist/cli/mcp.js.map +1 -0
  74. package/dist/cli/models.d.ts +26 -0
  75. package/dist/cli/models.js +435 -0
  76. package/dist/cli/models.js.map +1 -0
  77. package/dist/cli/new.d.ts +32 -0
  78. package/dist/cli/new.js +565 -0
  79. package/dist/cli/new.js.map +1 -0
  80. package/dist/cli/notify.d.ts +20 -0
  81. package/dist/cli/notify.js +188 -0
  82. package/dist/cli/notify.js.map +1 -0
  83. package/dist/cli/onboard.d.ts +85 -0
  84. package/dist/cli/onboard.js +305 -0
  85. package/dist/cli/onboard.js.map +1 -0
  86. package/dist/cli/open.d.ts +38 -0
  87. package/dist/cli/open.js +86 -0
  88. package/dist/cli/open.js.map +1 -0
  89. package/dist/cli/orient.d.ts +14 -0
  90. package/dist/cli/orient.js +110 -0
  91. package/dist/cli/orient.js.map +1 -0
  92. package/dist/cli/picker.d.ts +21 -0
  93. package/dist/cli/picker.js +177 -0
  94. package/dist/cli/picker.js.map +1 -0
  95. package/dist/cli/plugins.d.ts +21 -0
  96. package/dist/cli/plugins.js +394 -0
  97. package/dist/cli/plugins.js.map +1 -0
  98. package/dist/cli/preflight.d.ts +29 -0
  99. package/dist/cli/preflight.js +131 -0
  100. package/dist/cli/preflight.js.map +1 -0
  101. package/dist/cli/pulse.d.ts +26 -0
  102. package/dist/cli/pulse.js +482 -0
  103. package/dist/cli/pulse.js.map +1 -0
  104. package/dist/cli/reflect.d.ts +42 -0
  105. package/dist/cli/reflect.js +381 -0
  106. package/dist/cli/reflect.js.map +1 -0
  107. package/dist/cli/run.d.ts +29 -0
  108. package/dist/cli/run.js +687 -0
  109. package/dist/cli/run.js.map +1 -0
  110. package/dist/cli/sandbox.d.ts +20 -0
  111. package/dist/cli/sandbox.js +345 -0
  112. package/dist/cli/sandbox.js.map +1 -0
  113. package/dist/cli/seams.d.ts +41 -0
  114. package/dist/cli/seams.js +167 -0
  115. package/dist/cli/seams.js.map +1 -0
  116. package/dist/cli/serve.d.ts +25 -0
  117. package/dist/cli/serve.js +249 -0
  118. package/dist/cli/serve.js.map +1 -0
  119. package/dist/cli/ship.d.ts +33 -0
  120. package/dist/cli/ship.js +433 -0
  121. package/dist/cli/ship.js.map +1 -0
  122. package/dist/cli/spec.d.ts +19 -0
  123. package/dist/cli/spec.js +478 -0
  124. package/dist/cli/spec.js.map +1 -0
  125. package/dist/cli/swarm.d.ts +42 -0
  126. package/dist/cli/swarm.js +1365 -0
  127. package/dist/cli/swarm.js.map +1 -0
  128. package/dist/cli/telemetry.d.ts +26 -0
  129. package/dist/cli/telemetry.js +364 -0
  130. package/dist/cli/telemetry.js.map +1 -0
  131. package/dist/cli/tui.d.ts +17 -0
  132. package/dist/cli/tui.js +52 -0
  133. package/dist/cli/tui.js.map +1 -0
  134. package/dist/cli/ui.d.ts +53 -0
  135. package/dist/cli/ui.js +66 -0
  136. package/dist/cli/ui.js.map +1 -0
  137. package/dist/cli/update.d.ts +38 -0
  138. package/dist/cli/update.js +682 -0
  139. package/dist/cli/update.js.map +1 -0
  140. package/dist/cli/vercel.d.ts +20 -0
  141. package/dist/cli/vercel.js +193 -0
  142. package/dist/cli/vercel.js.map +1 -0
  143. package/dist/cli/verify-safety.d.ts +96 -0
  144. package/dist/cli/verify-safety.js +509 -0
  145. package/dist/cli/verify-safety.js.map +1 -0
  146. package/dist/cli/wire.d.ts +22 -0
  147. package/dist/cli/wire.js +205 -0
  148. package/dist/cli/wire.js.map +1 -0
  149. package/dist/core/classify.d.ts +51 -0
  150. package/dist/core/classify.js +450 -0
  151. package/dist/core/classify.js.map +1 -0
  152. package/dist/core/config.d.ts +63 -0
  153. package/dist/core/config.js +474 -0
  154. package/dist/core/config.js.map +1 -0
  155. package/dist/core/daemon/loop.d.ts +74 -0
  156. package/dist/core/daemon/loop.js +618 -0
  157. package/dist/core/daemon/loop.js.map +1 -0
  158. package/dist/core/daemon/state.d.ts +66 -0
  159. package/dist/core/daemon/state.js +197 -0
  160. package/dist/core/daemon/state.js.map +1 -0
  161. package/dist/core/dashboard.d.ts +40 -0
  162. package/dist/core/dashboard.js +463 -0
  163. package/dist/core/dashboard.js.map +1 -0
  164. package/dist/core/digest/build.d.ts +51 -0
  165. package/dist/core/digest/build.js +230 -0
  166. package/dist/core/digest/build.js.map +1 -0
  167. package/dist/core/digest/deliver.d.ts +47 -0
  168. package/dist/core/digest/deliver.js +230 -0
  169. package/dist/core/digest/deliver.js.map +1 -0
  170. package/dist/core/digest/store.d.ts +57 -0
  171. package/dist/core/digest/store.js +223 -0
  172. package/dist/core/digest/store.js.map +1 -0
  173. package/dist/core/doctor-fix.d.ts +21 -0
  174. package/dist/core/doctor-fix.js +440 -0
  175. package/dist/core/doctor-fix.js.map +1 -0
  176. package/dist/core/doctor.d.ts +18 -0
  177. package/dist/core/doctor.js +806 -0
  178. package/dist/core/doctor.js.map +1 -0
  179. package/dist/core/env-bridge.d.ts +64 -0
  180. package/dist/core/env-bridge.js +103 -0
  181. package/dist/core/env-bridge.js.map +1 -0
  182. package/dist/core/genome/capture.d.ts +49 -0
  183. package/dist/core/genome/capture.js +352 -0
  184. package/dist/core/genome/capture.js.map +1 -0
  185. package/dist/core/genome/consolidate.d.ts +38 -0
  186. package/dist/core/genome/consolidate.js +426 -0
  187. package/dist/core/genome/consolidate.js.map +1 -0
  188. package/dist/core/genome/export.d.ts +29 -0
  189. package/dist/core/genome/export.js +102 -0
  190. package/dist/core/genome/export.js.map +1 -0
  191. package/dist/core/genome/playbook.d.ts +33 -0
  192. package/dist/core/genome/playbook.js +320 -0
  193. package/dist/core/genome/playbook.js.map +1 -0
  194. package/dist/core/genome/recall.d.ts +45 -0
  195. package/dist/core/genome/recall.js +293 -0
  196. package/dist/core/genome/recall.js.map +1 -0
  197. package/dist/core/genome/store.d.ts +62 -0
  198. package/dist/core/genome/store.js +711 -0
  199. package/dist/core/genome/store.js.map +1 -0
  200. package/dist/core/git.d.ts +34 -0
  201. package/dist/core/git.js +115 -0
  202. package/dist/core/git.js.map +1 -0
  203. package/dist/core/goals/advance.d.ts +82 -0
  204. package/dist/core/goals/advance.js +263 -0
  205. package/dist/core/goals/advance.js.map +1 -0
  206. package/dist/core/goals/planner.d.ts +58 -0
  207. package/dist/core/goals/planner.js +233 -0
  208. package/dist/core/goals/planner.js.map +1 -0
  209. package/dist/core/goals/store.d.ts +128 -0
  210. package/dist/core/goals/store.js +442 -0
  211. package/dist/core/goals/store.js.map +1 -0
  212. package/dist/core/inbox/apply.d.ts +36 -0
  213. package/dist/core/inbox/apply.js +407 -0
  214. package/dist/core/inbox/apply.js.map +1 -0
  215. package/dist/core/inbox/notify-proposal.d.ts +13 -0
  216. package/dist/core/inbox/notify-proposal.js +21 -0
  217. package/dist/core/inbox/notify-proposal.js.map +1 -0
  218. package/dist/core/inbox/store.d.ts +67 -0
  219. package/dist/core/inbox/store.js +258 -0
  220. package/dist/core/inbox/store.js.map +1 -0
  221. package/dist/core/index-engine.d.ts +62 -0
  222. package/dist/core/index-engine.js +486 -0
  223. package/dist/core/index-engine.js.map +1 -0
  224. package/dist/core/integrations/desktop-notify.d.ts +18 -0
  225. package/dist/core/integrations/desktop-notify.js +42 -0
  226. package/dist/core/integrations/desktop-notify.js.map +1 -0
  227. package/dist/core/integrations/editors.d.ts +50 -0
  228. package/dist/core/integrations/editors.js +216 -0
  229. package/dist/core/integrations/editors.js.map +1 -0
  230. package/dist/core/integrations/github.d.ts +66 -0
  231. package/dist/core/integrations/github.js +332 -0
  232. package/dist/core/integrations/github.js.map +1 -0
  233. package/dist/core/integrations/identity.d.ts +29 -0
  234. package/dist/core/integrations/identity.js +359 -0
  235. package/dist/core/integrations/identity.js.map +1 -0
  236. package/dist/core/integrations/notify.d.ts +23 -0
  237. package/dist/core/integrations/notify.js +96 -0
  238. package/dist/core/integrations/notify.js.map +1 -0
  239. package/dist/core/integrations/vercel.d.ts +37 -0
  240. package/dist/core/integrations/vercel.js +192 -0
  241. package/dist/core/integrations/vercel.js.map +1 -0
  242. package/dist/core/knowledge/ask.d.ts +34 -0
  243. package/dist/core/knowledge/ask.js +325 -0
  244. package/dist/core/knowledge/ask.js.map +1 -0
  245. package/dist/core/knowledge/graph.d.ts +51 -0
  246. package/dist/core/knowledge/graph.js +564 -0
  247. package/dist/core/knowledge/graph.js.map +1 -0
  248. package/dist/core/knowledge/index.d.ts +74 -0
  249. package/dist/core/knowledge/index.js +586 -0
  250. package/dist/core/knowledge/index.js.map +1 -0
  251. package/dist/core/learn/playbooks.d.ts +84 -0
  252. package/dist/core/learn/playbooks.js +241 -0
  253. package/dist/core/learn/playbooks.js.map +1 -0
  254. package/dist/core/learn/reflect.d.ts +87 -0
  255. package/dist/core/learn/reflect.js +435 -0
  256. package/dist/core/learn/reflect.js.map +1 -0
  257. package/dist/core/learn/store.d.ts +51 -0
  258. package/dist/core/learn/store.js +165 -0
  259. package/dist/core/learn/store.js.map +1 -0
  260. package/dist/core/learn/tuning.d.ts +48 -0
  261. package/dist/core/learn/tuning.js +201 -0
  262. package/dist/core/learn/tuning.js.map +1 -0
  263. package/dist/core/lifecycle/scaffold.d.ts +43 -0
  264. package/dist/core/lifecycle/scaffold.js +260 -0
  265. package/dist/core/lifecycle/scaffold.js.map +1 -0
  266. package/dist/core/lifecycle/ship.d.ts +48 -0
  267. package/dist/core/lifecycle/ship.js +513 -0
  268. package/dist/core/lifecycle/ship.js.map +1 -0
  269. package/dist/core/lifecycle/templates.d.ts +20 -0
  270. package/dist/core/lifecycle/templates.js +605 -0
  271. package/dist/core/lifecycle/templates.js.map +1 -0
  272. package/dist/core/mcp-gateway.d.ts +59 -0
  273. package/dist/core/mcp-gateway.js +385 -0
  274. package/dist/core/mcp-gateway.js.map +1 -0
  275. package/dist/core/mcp-native.d.ts +53 -0
  276. package/dist/core/mcp-native.js +507 -0
  277. package/dist/core/mcp-native.js.map +1 -0
  278. package/dist/core/mcp-registry.d.ts +36 -0
  279. package/dist/core/mcp-registry.js +180 -0
  280. package/dist/core/mcp-registry.js.map +1 -0
  281. package/dist/core/observability/budget-alert.d.ts +18 -0
  282. package/dist/core/observability/budget-alert.js +90 -0
  283. package/dist/core/observability/budget-alert.js.map +1 -0
  284. package/dist/core/observability/estimate.d.ts +27 -0
  285. package/dist/core/observability/estimate.js +188 -0
  286. package/dist/core/observability/estimate.js.map +1 -0
  287. package/dist/core/observability/forecast.d.ts +19 -0
  288. package/dist/core/observability/forecast.js +101 -0
  289. package/dist/core/observability/forecast.js.map +1 -0
  290. package/dist/core/observability/governance.d.ts +28 -0
  291. package/dist/core/observability/governance.js +101 -0
  292. package/dist/core/observability/governance.js.map +1 -0
  293. package/dist/core/observability/otlp.d.ts +88 -0
  294. package/dist/core/observability/otlp.js +217 -0
  295. package/dist/core/observability/otlp.js.map +1 -0
  296. package/dist/core/observability/rollup.d.ts +35 -0
  297. package/dist/core/observability/rollup.js +311 -0
  298. package/dist/core/observability/rollup.js.map +1 -0
  299. package/dist/core/observability/telemetry-sink.d.ts +63 -0
  300. package/dist/core/observability/telemetry-sink.js +350 -0
  301. package/dist/core/observability/telemetry-sink.js.map +1 -0
  302. package/dist/core/observability/usage-source.d.ts +60 -0
  303. package/dist/core/observability/usage-source.js +347 -0
  304. package/dist/core/observability/usage-source.js.map +1 -0
  305. package/dist/core/onboard.d.ts +27 -0
  306. package/dist/core/onboard.js +288 -0
  307. package/dist/core/onboard.js.map +1 -0
  308. package/dist/core/orient.d.ts +23 -0
  309. package/dist/core/orient.js +135 -0
  310. package/dist/core/orient.js.map +1 -0
  311. package/dist/core/phantom.d.ts +23 -0
  312. package/dist/core/phantom.js +279 -0
  313. package/dist/core/phantom.js.map +1 -0
  314. package/dist/core/plugins/host-api.d.ts +29 -0
  315. package/dist/core/plugins/host-api.js +113 -0
  316. package/dist/core/plugins/host-api.js.map +1 -0
  317. package/dist/core/plugins/integrity.d.ts +36 -0
  318. package/dist/core/plugins/integrity.js +73 -0
  319. package/dist/core/plugins/integrity.js.map +1 -0
  320. package/dist/core/plugins/manifest.d.ts +31 -0
  321. package/dist/core/plugins/manifest.js +316 -0
  322. package/dist/core/plugins/manifest.js.map +1 -0
  323. package/dist/core/plugins/registry.d.ts +87 -0
  324. package/dist/core/plugins/registry.js +415 -0
  325. package/dist/core/plugins/registry.js.map +1 -0
  326. package/dist/core/plugins/types.d.ts +182 -0
  327. package/dist/core/plugins/types.js +40 -0
  328. package/dist/core/plugins/types.js.map +1 -0
  329. package/dist/core/plugins/wrappers.d.ts +40 -0
  330. package/dist/core/plugins/wrappers.js +229 -0
  331. package/dist/core/plugins/wrappers.js.map +1 -0
  332. package/dist/core/portfolio/backlog.d.ts +40 -0
  333. package/dist/core/portfolio/backlog.js +177 -0
  334. package/dist/core/portfolio/backlog.js.map +1 -0
  335. package/dist/core/portfolio/scanners.d.ts +21 -0
  336. package/dist/core/portfolio/scanners.js +600 -0
  337. package/dist/core/portfolio/scanners.js.map +1 -0
  338. package/dist/core/providers.d.ts +34 -0
  339. package/dist/core/providers.js +250 -0
  340. package/dist/core/providers.js.map +1 -0
  341. package/dist/core/quality/conventions.d.ts +35 -0
  342. package/dist/core/quality/conventions.js +267 -0
  343. package/dist/core/quality/conventions.js.map +1 -0
  344. package/dist/core/quality/fixes.d.ts +56 -0
  345. package/dist/core/quality/fixes.js +209 -0
  346. package/dist/core/quality/fixes.js.map +1 -0
  347. package/dist/core/quality/health.d.ts +69 -0
  348. package/dist/core/quality/health.js +350 -0
  349. package/dist/core/quality/health.js.map +1 -0
  350. package/dist/core/quality/store.d.ts +56 -0
  351. package/dist/core/quality/store.js +195 -0
  352. package/dist/core/quality/store.js.map +1 -0
  353. package/dist/core/readiness.d.ts +112 -0
  354. package/dist/core/readiness.js +431 -0
  355. package/dist/core/readiness.js.map +1 -0
  356. package/dist/core/run/agent-loop.d.ts +40 -0
  357. package/dist/core/run/agent-loop.js +291 -0
  358. package/dist/core/run/agent-loop.js.map +1 -0
  359. package/dist/core/run/budget.d.ts +47 -0
  360. package/dist/core/run/budget.js +113 -0
  361. package/dist/core/run/budget.js.map +1 -0
  362. package/dist/core/run/engines.d.ts +75 -0
  363. package/dist/core/run/engines.js +199 -0
  364. package/dist/core/run/engines.js.map +1 -0
  365. package/dist/core/run/model-manager.d.ts +64 -0
  366. package/dist/core/run/model-manager.js +339 -0
  367. package/dist/core/run/model-manager.js.map +1 -0
  368. package/dist/core/run/orchestrator.d.ts +100 -0
  369. package/dist/core/run/orchestrator.js +1515 -0
  370. package/dist/core/run/orchestrator.js.map +1 -0
  371. package/dist/core/run/provider-client.d.ts +46 -0
  372. package/dist/core/run/provider-client.js +796 -0
  373. package/dist/core/run/provider-client.js.map +1 -0
  374. package/dist/core/run/retry.d.ts +19 -0
  375. package/dist/core/run/retry.js +68 -0
  376. package/dist/core/run/retry.js.map +1 -0
  377. package/dist/core/run/router.d.ts +50 -0
  378. package/dist/core/run/router.js +257 -0
  379. package/dist/core/run/router.js.map +1 -0
  380. package/dist/core/run/self-heal.d.ts +52 -0
  381. package/dist/core/run/self-heal.js +181 -0
  382. package/dist/core/run/self-heal.js.map +1 -0
  383. package/dist/core/run/streaming.d.ts +31 -0
  384. package/dist/core/run/streaming.js +122 -0
  385. package/dist/core/run/streaming.js.map +1 -0
  386. package/dist/core/run/verify.d.ts +30 -0
  387. package/dist/core/run/verify.js +204 -0
  388. package/dist/core/run/verify.js.map +1 -0
  389. package/dist/core/sandbox/audit.d.ts +31 -0
  390. package/dist/core/sandbox/audit.js +169 -0
  391. package/dist/core/sandbox/audit.js.map +1 -0
  392. package/dist/core/sandbox/policy.d.ts +61 -0
  393. package/dist/core/sandbox/policy.js +211 -0
  394. package/dist/core/sandbox/policy.js.map +1 -0
  395. package/dist/core/sandbox/worktree.d.ts +175 -0
  396. package/dist/core/sandbox/worktree.js +673 -0
  397. package/dist/core/sandbox/worktree.js.map +1 -0
  398. package/dist/core/seams/backlog.d.ts +47 -0
  399. package/dist/core/seams/backlog.js +47 -0
  400. package/dist/core/seams/backlog.js.map +1 -0
  401. package/dist/core/seams/daemon-coordinator.d.ts +72 -0
  402. package/dist/core/seams/daemon-coordinator.js +76 -0
  403. package/dist/core/seams/daemon-coordinator.js.map +1 -0
  404. package/dist/core/seams/genome.d.ts +45 -0
  405. package/dist/core/seams/genome.js +53 -0
  406. package/dist/core/seams/genome.js.map +1 -0
  407. package/dist/core/seams/identity.d.ts +40 -0
  408. package/dist/core/seams/identity.js +44 -0
  409. package/dist/core/seams/identity.js.map +1 -0
  410. package/dist/core/seams/inbox.d.ts +60 -0
  411. package/dist/core/seams/inbox.js +66 -0
  412. package/dist/core/seams/inbox.js.map +1 -0
  413. package/dist/core/seams/index.d.ts +20 -0
  414. package/dist/core/seams/index.js +21 -0
  415. package/dist/core/seams/index.js.map +1 -0
  416. package/dist/core/seams/portfolio.d.ts +50 -0
  417. package/dist/core/seams/portfolio.js +61 -0
  418. package/dist/core/seams/portfolio.js.map +1 -0
  419. package/dist/core/seams/registry.d.ts +42 -0
  420. package/dist/core/seams/registry.js +128 -0
  421. package/dist/core/seams/registry.js.map +1 -0
  422. package/dist/core/seams/run-swarm.d.ts +66 -0
  423. package/dist/core/seams/run-swarm.js +74 -0
  424. package/dist/core/seams/run-swarm.js.map +1 -0
  425. package/dist/core/seams/types.d.ts +123 -0
  426. package/dist/core/seams/types.js +35 -0
  427. package/dist/core/seams/types.js.map +1 -0
  428. package/dist/core/spec/spec-store.d.ts +62 -0
  429. package/dist/core/spec/spec-store.js +359 -0
  430. package/dist/core/spec/spec-store.js.map +1 -0
  431. package/dist/core/swarm/gate.d.ts +45 -0
  432. package/dist/core/swarm/gate.js +114 -0
  433. package/dist/core/swarm/gate.js.map +1 -0
  434. package/dist/core/swarm/planner.d.ts +32 -0
  435. package/dist/core/swarm/planner.js +293 -0
  436. package/dist/core/swarm/planner.js.map +1 -0
  437. package/dist/core/swarm/rollback.d.ts +56 -0
  438. package/dist/core/swarm/rollback.js +266 -0
  439. package/dist/core/swarm/rollback.js.map +1 -0
  440. package/dist/core/swarm/runner.d.ts +62 -0
  441. package/dist/core/swarm/runner.js +1263 -0
  442. package/dist/core/swarm/runner.js.map +1 -0
  443. package/dist/core/swarm/sign.d.ts +71 -0
  444. package/dist/core/swarm/sign.js +362 -0
  445. package/dist/core/swarm/sign.js.map +1 -0
  446. package/dist/core/swarm/store.d.ts +52 -0
  447. package/dist/core/swarm/store.js +195 -0
  448. package/dist/core/swarm/store.js.map +1 -0
  449. package/dist/core/tidy.d.ts +32 -0
  450. package/dist/core/tidy.js +354 -0
  451. package/dist/core/tidy.js.map +1 -0
  452. package/dist/core/tools-registry.d.ts +16 -0
  453. package/dist/core/tools-registry.js +308 -0
  454. package/dist/core/tools-registry.js.map +1 -0
  455. package/dist/core/types.d.ts +2545 -0
  456. package/dist/core/types.js +9 -0
  457. package/dist/core/types.js.map +1 -0
  458. package/dist/core/web/api.d.ts +53 -0
  459. package/dist/core/web/api.js +698 -0
  460. package/dist/core/web/api.js.map +1 -0
  461. package/dist/core/web/public/app.js +1906 -0
  462. package/dist/core/web/public/index.html +721 -0
  463. package/dist/core/web/public/styles.css +2007 -0
  464. package/dist/core/web/server.d.ts +18 -0
  465. package/dist/core/web/server.js +122 -0
  466. package/dist/core/web/server.js.map +1 -0
  467. package/dist/core/web/static.d.ts +18 -0
  468. package/dist/core/web/static.js +122 -0
  469. package/dist/core/web/static.js.map +1 -0
  470. package/dist/tui/app.d.ts +33 -0
  471. package/dist/tui/app.js +350 -0
  472. package/dist/tui/app.js.map +1 -0
  473. package/dist/tui/render.d.ts +20 -0
  474. package/dist/tui/render.js +558 -0
  475. package/dist/tui/render.js.map +1 -0
  476. package/package.json +80 -0
  477. package/schema/config.schema.json +223 -0
@@ -0,0 +1,56 @@
1
+ /**
2
+ * store.ts — M27 HealthReport snapshot persistence (~/.ashlr/quality/).
3
+ *
4
+ * Persists + loads HealthReport snapshots so each `ashlr health` run can compute
5
+ * per-repo score deltas (trend) against the previous snapshot.
6
+ *
7
+ * Layout:
8
+ * ~/.ashlr/quality/reports/<generatedAt-ms>.json — one pretty-printed
9
+ * HealthReport per run
10
+ * ~/.ashlr/quality/reports/<generatedAt-ms>-N.json — collision fallback for a
11
+ * second run in the SAME ms
12
+ *
13
+ * Trend caveat: loadPreviousReport selects the newest snapshot STRICTLY BEFORE
14
+ * the current report's generatedAt (so a just-saved report is never diffed
15
+ * against itself). Snapshots are thus effectively at most one-per-ms for trend
16
+ * purposes: two runs that share an identical ms-resolution generatedAt are both
17
+ * persisted (distinct `-N` files, no history loss) but the second's delta degrades
18
+ * gracefully to '—' rather than diffing against the same-ms prior. This is benign
19
+ * for an interactive CLI; only a sub-ms daemon/cron driver would notice.
20
+ *
21
+ * HARD SAFETY INVARIANTS (M27):
22
+ * - WRITES ONLY under ~/.ashlr/quality/. NEVER writes CONFIG_PATH /
23
+ * saveConfig() / router policy / prompts, and NEVER touches a user repo
24
+ * working tree.
25
+ * - Atomic-ish write: tmp-write + rename (POSIX-atomic), mirroring
26
+ * core/learn/store.ts and core/inbox/store.ts.
27
+ * - Bounded: listReports caps how many snapshot files it reads (MAX_REPORTS).
28
+ * - Never throws: all exported functions swallow errors and return safe
29
+ * defaults (null / []).
30
+ */
31
+ import type { HealthReport } from '../types.js';
32
+ /**
33
+ * Absolute path to the reports directory: `~/.ashlr/quality/reports`.
34
+ * Created lazily by saveReport — this function does NOT create it.
35
+ */
36
+ export declare function reportsDir(): string;
37
+ /**
38
+ * Persist a HealthReport snapshot under reportsDir() as
39
+ * `<generatedAt-ms>.json` via atomic tmp-write + rename. Returns the written
40
+ * path, or null on any failure. Never throws. The ONLY filesystem destination
41
+ * is under ~/.ashlr/quality/.
42
+ */
43
+ export declare function saveReport(report: HealthReport): string | null;
44
+ /**
45
+ * List persisted HealthReport snapshots, most-recent first by generatedAt,
46
+ * bounded to MAX_REPORTS files. Read-only. Corrupt files are skipped silently.
47
+ * Never throws (returns [] on error).
48
+ */
49
+ export declare function listReports(): HealthReport[];
50
+ /**
51
+ * Return the newest persisted snapshot strictly BEFORE `before` (the current
52
+ * report's generatedAt) — so a just-saved report isn't diffed against itself.
53
+ * When `before` is omitted, returns the newest snapshot. Used to compute the
54
+ * per-repo score delta trend in the report. Never throws (null on absence).
55
+ */
56
+ export declare function loadPreviousReport(before?: string): HealthReport | null;
@@ -0,0 +1,195 @@
1
+ /**
2
+ * store.ts — M27 HealthReport snapshot persistence (~/.ashlr/quality/).
3
+ *
4
+ * Persists + loads HealthReport snapshots so each `ashlr health` run can compute
5
+ * per-repo score deltas (trend) against the previous snapshot.
6
+ *
7
+ * Layout:
8
+ * ~/.ashlr/quality/reports/<generatedAt-ms>.json — one pretty-printed
9
+ * HealthReport per run
10
+ * ~/.ashlr/quality/reports/<generatedAt-ms>-N.json — collision fallback for a
11
+ * second run in the SAME ms
12
+ *
13
+ * Trend caveat: loadPreviousReport selects the newest snapshot STRICTLY BEFORE
14
+ * the current report's generatedAt (so a just-saved report is never diffed
15
+ * against itself). Snapshots are thus effectively at most one-per-ms for trend
16
+ * purposes: two runs that share an identical ms-resolution generatedAt are both
17
+ * persisted (distinct `-N` files, no history loss) but the second's delta degrades
18
+ * gracefully to '—' rather than diffing against the same-ms prior. This is benign
19
+ * for an interactive CLI; only a sub-ms daemon/cron driver would notice.
20
+ *
21
+ * HARD SAFETY INVARIANTS (M27):
22
+ * - WRITES ONLY under ~/.ashlr/quality/. NEVER writes CONFIG_PATH /
23
+ * saveConfig() / router policy / prompts, and NEVER touches a user repo
24
+ * working tree.
25
+ * - Atomic-ish write: tmp-write + rename (POSIX-atomic), mirroring
26
+ * core/learn/store.ts and core/inbox/store.ts.
27
+ * - Bounded: listReports caps how many snapshot files it reads (MAX_REPORTS).
28
+ * - Never throws: all exported functions swallow errors and return safe
29
+ * defaults (null / []).
30
+ */
31
+ import { existsSync, mkdirSync, readdirSync, readFileSync, renameSync, writeFileSync, } from 'node:fs';
32
+ import { join } from 'node:path';
33
+ import { qualityDir } from '../config.js';
34
+ // ---------------------------------------------------------------------------
35
+ // Bounds
36
+ // ---------------------------------------------------------------------------
37
+ /** Never read more than this many snapshot files at once (bounds I/O). */
38
+ const MAX_REPORTS = 200;
39
+ // ---------------------------------------------------------------------------
40
+ // Path helpers (re-resolved at call time so tests can relocate HOME)
41
+ // ---------------------------------------------------------------------------
42
+ /**
43
+ * Absolute path to the reports directory: `~/.ashlr/quality/reports`.
44
+ * Created lazily by saveReport — this function does NOT create it.
45
+ */
46
+ export function reportsDir() {
47
+ return join(qualityDir(), 'reports');
48
+ }
49
+ /** Ensure a directory exists, silently creating it if needed. */
50
+ function ensureDir(dir) {
51
+ try {
52
+ if (!existsSync(dir))
53
+ mkdirSync(dir, { recursive: true });
54
+ }
55
+ catch {
56
+ // Best-effort; a subsequent write will fail gracefully in its try/catch.
57
+ }
58
+ }
59
+ /** Derive a filename-safe, chronologically-sortable stem from an ISO ts. */
60
+ function reportStem(generatedAt) {
61
+ // Epoch-ms keeps lexicographic order == chronological order. Fall back to a
62
+ // sanitized ISO string if the timestamp is unparseable.
63
+ const ms = Date.parse(generatedAt);
64
+ if (Number.isFinite(ms))
65
+ return String(ms);
66
+ return generatedAt.replace(/[^\w.-]+/g, '-');
67
+ }
68
+ /**
69
+ * Pick a destination path under `dir` for `stem` that does NOT already exist,
70
+ * so two runs in the same millisecond (identical epoch-ms stem) do not collide
71
+ * and overwrite each other's snapshot. The first run in a fresh dir gets the
72
+ * plain `<stem>.json` (preserving chronological lexicographic ordering and the
73
+ * documented filename), and a same-ms collision falls back to `<stem>-1.json`,
74
+ * `<stem>-2.json`, … (a tiny bounded suffix probe). Best-effort: on the rare
75
+ * exhaustion of the probe it returns the plain path (last-writer-wins, as before).
76
+ */
77
+ function uniqueDest(dir, stem) {
78
+ const plain = join(dir, `${stem}.json`);
79
+ try {
80
+ if (!existsSync(plain))
81
+ return plain;
82
+ for (let i = 1; i <= 1000; i++) {
83
+ const candidate = join(dir, `${stem}-${i}.json`);
84
+ if (!existsSync(candidate))
85
+ return candidate;
86
+ }
87
+ }
88
+ catch {
89
+ // existsSync should not throw, but fall through to the plain path defensively.
90
+ }
91
+ return plain;
92
+ }
93
+ /** Light type-guard so we never return garbage from the store. */
94
+ function isValidReport(parsed) {
95
+ if (parsed === null || typeof parsed !== 'object' || Array.isArray(parsed)) {
96
+ return false;
97
+ }
98
+ const r = parsed;
99
+ return (typeof r['generatedAt'] === 'string' &&
100
+ Array.isArray(r['repos']) &&
101
+ Array.isArray(r['scores']) &&
102
+ typeof r['averageScore'] === 'number');
103
+ }
104
+ // ---------------------------------------------------------------------------
105
+ // Public API
106
+ // ---------------------------------------------------------------------------
107
+ /**
108
+ * Persist a HealthReport snapshot under reportsDir() as
109
+ * `<generatedAt-ms>.json` via atomic tmp-write + rename. Returns the written
110
+ * path, or null on any failure. Never throws. The ONLY filesystem destination
111
+ * is under ~/.ashlr/quality/.
112
+ */
113
+ export function saveReport(report) {
114
+ try {
115
+ const dir = reportsDir();
116
+ ensureDir(dir);
117
+ // Collision-resistant: a second run in the SAME millisecond (identical
118
+ // epoch-ms stem) gets a `-N` suffix instead of overwriting the first snapshot.
119
+ const dest = uniqueDest(dir, reportStem(report.generatedAt));
120
+ const tmp = dest + '.tmp';
121
+ writeFileSync(tmp, JSON.stringify(report, null, 2) + '\n', 'utf8');
122
+ renameSync(tmp, dest);
123
+ return dest;
124
+ }
125
+ catch {
126
+ return null;
127
+ }
128
+ }
129
+ /**
130
+ * List persisted HealthReport snapshots, most-recent first by generatedAt,
131
+ * bounded to MAX_REPORTS files. Read-only. Corrupt files are skipped silently.
132
+ * Never throws (returns [] on error).
133
+ */
134
+ export function listReports() {
135
+ try {
136
+ const dir = reportsDir();
137
+ if (!existsSync(dir))
138
+ return [];
139
+ let files;
140
+ try {
141
+ // Filename stems are epoch-ms, so a lexicographic descending sort of the
142
+ // filenames already orders newest-first; sort here so the slice keeps the
143
+ // MOST-RECENT MAX_REPORTS rather than an arbitrary directory order.
144
+ files = readdirSync(dir)
145
+ .filter((f) => f.endsWith('.json') && !f.endsWith('.tmp'))
146
+ .sort((a, b) => (a < b ? 1 : a > b ? -1 : 0))
147
+ .slice(0, MAX_REPORTS);
148
+ }
149
+ catch {
150
+ return [];
151
+ }
152
+ const reports = [];
153
+ for (const file of files) {
154
+ try {
155
+ const raw = readFileSync(join(dir, file), 'utf8');
156
+ const parsed = JSON.parse(raw);
157
+ if (isValidReport(parsed))
158
+ reports.push(parsed);
159
+ }
160
+ catch {
161
+ // Unreadable or malformed — skip silently.
162
+ }
163
+ }
164
+ // Most-recent first by generatedAt (ISO strings sort lexicographically).
165
+ reports.sort((a, b) => a.generatedAt < b.generatedAt ? 1 : a.generatedAt > b.generatedAt ? -1 : 0);
166
+ return reports;
167
+ }
168
+ catch {
169
+ return [];
170
+ }
171
+ }
172
+ /**
173
+ * Return the newest persisted snapshot strictly BEFORE `before` (the current
174
+ * report's generatedAt) — so a just-saved report isn't diffed against itself.
175
+ * When `before` is omitted, returns the newest snapshot. Used to compute the
176
+ * per-repo score delta trend in the report. Never throws (null on absence).
177
+ */
178
+ export function loadPreviousReport(before) {
179
+ try {
180
+ const all = listReports();
181
+ if (all.length === 0)
182
+ return null;
183
+ if (before === undefined)
184
+ return all[0] ?? null;
185
+ for (const r of all) {
186
+ if (r.generatedAt < before)
187
+ return r;
188
+ }
189
+ return null;
190
+ }
191
+ catch {
192
+ return null;
193
+ }
194
+ }
195
+ //# sourceMappingURL=store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../../../src/core/quality/store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,112 @@
1
+ /**
2
+ * readiness.ts — SHARED, READ-ONLY first-activation readiness model (H7).
3
+ *
4
+ * Single source of truth consumed by BOTH `ashlr preflight` (src/cli/preflight.ts)
5
+ * AND the five new read-only `ashlr doctor` probes (src/core/doctor.ts), so there
6
+ * is no drift and no double maintenance. See docs/contracts/CONTRACT-H7.md
7
+ * (BUILD ITEM 1 + BUILD ITEM 2).
8
+ *
9
+ * H7 ABSOLUTE RULES (proven by test/h7.*):
10
+ * - READ-ONLY: composes only read-only primitives — probeEndpoint (local GET,
11
+ * never throws), listEnrolled, killSwitchOn, loadDaemonState (H5 self-heal),
12
+ * listSandboxes. It MUTATES NOTHING and adds NO outward capability.
13
+ * - The ONE write is the `~/.ashlr` writeable probe — it writes then UNLINKS a
14
+ * private sentinel under the (HOME-relative, isolated-in-tests) ~/.ashlr dir;
15
+ * it touches no repo, no enrollment, no kill, no daemon state, and leaves no
16
+ * persistent artifact.
17
+ * - NEVER throws — every facet degrades to a typed result on error.
18
+ * - No new runtime deps; node builtins + existing core modules only.
19
+ *
20
+ * NOTE: paths are resolved at CALL TIME via homedir() (matching policy.ts /
21
+ * daemon/state.ts) so a test that relocates process.env.HOME gets an ISOLATED
22
+ * ~/.ashlr — never the real one. (config.ts CONFIG_DIR is captured at import
23
+ * time, so we do NOT use it here for the writeable sentinel.)
24
+ */
25
+ import type { AshlrConfig } from './types.js';
26
+ /** Severity of a single readiness finding. */
27
+ export type ReadinessSeverity = 'blocker' | 'warning' | 'info';
28
+ /** One readiness finding (model/enrollment/kill/daemon/writeable/sandbox/git/phantom). */
29
+ export interface ReadinessFinding {
30
+ /** Stable facet id, e.g. 'model' | 'enrollment' | 'kill-switch' | 'daemon' |
31
+ * 'ashlr-writeable' | 'sandbox' | 'git' | 'phantom'. */
32
+ id: string;
33
+ /** Severity. 'blocker' forces ready=false; 'warning'/'info' do not. */
34
+ severity: ReadinessSeverity;
35
+ /** Human-readable detail line (metadata only — never a secret). */
36
+ detail: string;
37
+ /** Optional remediation hint. */
38
+ fix?: string;
39
+ }
40
+ /** Full readiness report. `ready` is true iff there are zero 'blocker' findings. */
41
+ export interface ReadinessReport {
42
+ /** True iff no finding has severity 'blocker'. */
43
+ ready: boolean;
44
+ /** Findings that BLOCK a safe first activation (ready=false). */
45
+ blockers: ReadinessFinding[];
46
+ /** Non-blocking warnings (surfaced, do not block). */
47
+ warnings: ReadinessFinding[];
48
+ /** Informational notes (e.g. empty-enrollment on a fresh install — fine). */
49
+ info: ReadinessFinding[];
50
+ /** ISO timestamp the report was built. */
51
+ generatedAt: string;
52
+ }
53
+ /** Orphan-sandbox count threshold at/above which sandbox health warns. */
54
+ export declare const SANDBOX_ORPHAN_WARN_THRESHOLD = 3;
55
+ /**
56
+ * READ-ONLY writeable probe for ~/.ashlr. Writes then immediately UNLINKS a
57
+ * private sentinel under the (call-time, HOME-relative) ~/.ashlr dir. Returns
58
+ * true when writeable, false otherwise. Leaves NO persistent artifact. Never
59
+ * throws.
60
+ */
61
+ export declare function checkAshlrWriteable(): boolean;
62
+ /** READ-ONLY enrollment snapshot: { count } via listEnrolled(). Never throws. */
63
+ export declare function readEnrollmentState(): {
64
+ count: number;
65
+ };
66
+ /** READ-ONLY kill-switch snapshot: { on } via killSwitchOn(). Never throws. */
67
+ export declare function readKillState(): {
68
+ on: boolean;
69
+ };
70
+ /**
71
+ * READ-ONLY daemon-health snapshot via loadDaemonState() (which applies the H5
72
+ * reconcileDaemonState self-heal at the load chokepoint). Returns whether the
73
+ * daemon is reported running, its recorded pid, and whether the recorded pid is
74
+ * still alive (a still-running flag with a live pid is a healthy live daemon; a
75
+ * dead-pid running flag is already self-healed to running:false by the load).
76
+ * Never throws.
77
+ */
78
+ export declare function readDaemonHealth(): {
79
+ running: boolean;
80
+ pid: number | null;
81
+ selfHealed: boolean;
82
+ pidAlive: boolean;
83
+ };
84
+ /**
85
+ * READ-ONLY sandbox-health snapshot via listSandboxes(): total on-disk sandboxes
86
+ * + an orphan estimate. A sandbox is counted as an orphan when its owner pid is
87
+ * no longer alive AND it is older than ORPHAN_STALE_MS (mirrors the sweep's two
88
+ * guards — a LIVE owner pid is NEVER counted as an orphan regardless of age).
89
+ * Read-only; removes NOTHING. Never throws.
90
+ */
91
+ export declare function readSandboxHealth(): {
92
+ total: number;
93
+ orphans: number;
94
+ };
95
+ /**
96
+ * Build the full first-activation readiness report (READ-ONLY).
97
+ *
98
+ * Composes (all read-only, all degrade gracefully):
99
+ * - local model reachable via probeEndpoint (down => WARNING, never a blocker)
100
+ * - enrollment count via readEnrollmentState (0 => INFO, never a blocker)
101
+ * - kill-switch via readKillState (on => WARNING)
102
+ * - daemon not stuck via readDaemonHealth (self-heal already applied)
103
+ * - ~/.ashlr writeable via checkAshlrWriteable (not writeable => BLOCKER)
104
+ * - sandbox health via readSandboxHealth (high orphan count => WARNING)
105
+ * - git present (absent => BLOCKER); phantom present (absent => WARNING)
106
+ *
107
+ * `ready` is true iff blockers.length === 0. Never throws.
108
+ *
109
+ * MUST NOT mutate any enrollment/kill/daemon/sandbox/repo state; the ONLY write
110
+ * is the self-cleaning sentinel inside checkAshlrWriteable.
111
+ */
112
+ export declare function buildReadiness(cfg: AshlrConfig): Promise<ReadinessReport>;