@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,199 @@
1
+ /**
2
+ * `ashlr audit` — READ-ONLY audit-trail viewer (Ashlr v2.1 MILESTONE H6, PART A).
3
+ *
4
+ * Tails the append-only JSONL audit trail (newest-first) written by
5
+ * `core/sandbox/audit.ts`. MUTATES NOTHING. No outward call. No model. The only
6
+ * thing this command does is READ `~/.ashlr/audit/<date>.jsonl` via `readAudit()`
7
+ * and print / filter it — see docs/contracts/CONTRACT-H6.md §A.3.
8
+ *
9
+ * H6 MOVES the viewer here from `cli/sandbox.ts` (where a minimal `cmdAudit`
10
+ * lived) and EXTENDS it with `--action` / `--result` / `--since` filters. The
11
+ * dispatcher's `loadAuditCmd` (src/cli/index.ts) is re-pointed at this module;
12
+ * the old `cmdAudit`/`formatAuditEntry`/`loadAuditModule` block in
13
+ * `cli/sandbox.ts` is removed in the implementation step.
14
+ *
15
+ * Flags (ALL read-only):
16
+ * --limit N | -n N | N Cap to the newest N records (applied AFTER filters).
17
+ * --json Emit the records as a JSON array.
18
+ * --action <verb> Filter by action; `--action enroll` matches `enroll:*`,
19
+ * `--action kill:on` matches exactly. [H6 NEW]
20
+ * --result <ok|refused|error> Filter by outcome. [H6 NEW]
21
+ * --since <ISO|YYYY-MM-DD> Drop records with ts strictly before this. [H6 NEW]
22
+ *
23
+ * Returns 0 on success, 2 on bad args (unknown flag / unparseable --since),
24
+ * 1 when the audit core module is not built.
25
+ */
26
+ import { makeColors, isTty } from './ui.js';
27
+ // ---------------------------------------------------------------------------
28
+ // ANSI helpers (non-TTY safe) — same palette as cli/sandbox.ts
29
+ // ---------------------------------------------------------------------------
30
+ const { bold, dim, red, green, yellow } = makeColors(isTty());
31
+ let _readAudit = undefined;
32
+ async function loadReadAudit() {
33
+ if (_readAudit === undefined) {
34
+ try {
35
+ const mod = (await import('../core/sandbox/audit.js'));
36
+ _readAudit = mod.readAudit;
37
+ }
38
+ catch {
39
+ _readAudit = null;
40
+ }
41
+ }
42
+ return _readAudit ?? null;
43
+ }
44
+ function moduleNotBuilt() {
45
+ console.error(red('error: ') + 'audit requires src/core/sandbox/ (M21 module not yet built).');
46
+ }
47
+ /**
48
+ * Parse argv into AuditViewOptions. Returns `{ error }` for bad args so the
49
+ * caller can print usage + return 2 (read NOTHING — never touch disk on bad args).
50
+ *
51
+ * The action/result/since values parsed here drive the read-only post-filter in
52
+ * applyFilters(). See docs/contracts/CONTRACT-H6.md §A.3.
53
+ */
54
+ function parseArgs(args) {
55
+ const opts = { json: false };
56
+ for (let i = 0; i < args.length; i++) {
57
+ const a = args[i];
58
+ if ((a === '--limit' || a === '-n') && args[i + 1] !== undefined) {
59
+ const n = parseInt(args[i + 1], 10);
60
+ if (!isNaN(n) && n > 0) {
61
+ opts.limit = n;
62
+ i++;
63
+ }
64
+ else {
65
+ return { error: `invalid --limit value: ${args[i + 1]}` };
66
+ }
67
+ }
68
+ else if (a === '--json') {
69
+ opts.json = true;
70
+ }
71
+ else if (a === '--action' && args[i + 1] !== undefined) {
72
+ opts.action = args[i + 1];
73
+ i++;
74
+ }
75
+ else if (a === '--result' && args[i + 1] !== undefined) {
76
+ const v = args[i + 1];
77
+ if (v !== 'ok' && v !== 'refused' && v !== 'error') {
78
+ return { error: `invalid --result value: ${v} (expected ok|refused|error)` };
79
+ }
80
+ opts.result = v;
81
+ i++;
82
+ }
83
+ else if (a === '--since' && args[i + 1] !== undefined) {
84
+ const v = args[i + 1];
85
+ const ms = Date.parse(v);
86
+ if (isNaN(ms)) {
87
+ return { error: `invalid --since value: ${v} (expected ISO timestamp or YYYY-MM-DD)` };
88
+ }
89
+ opts.sinceMs = ms;
90
+ i++;
91
+ }
92
+ else if (/^\d+$/.test(a ?? '')) {
93
+ // Positional numeric shorthand: `ashlr audit 20`
94
+ opts.limit = parseInt(a, 10);
95
+ }
96
+ else {
97
+ return { error: `unknown argument: ${a}` };
98
+ }
99
+ }
100
+ return opts;
101
+ }
102
+ // ---------------------------------------------------------------------------
103
+ // Filtering (READ-ONLY post-filter over readAudit() output)
104
+ // ---------------------------------------------------------------------------
105
+ /**
106
+ * Apply the H6 action/result/since filters to an already-loaded record list,
107
+ * THEN cap to `limit` (so the result is "newest N MATCHING"). Read-only — never
108
+ * touches disk.
109
+ *
110
+ * Filter order: action → result → since, then slice(0, limit) LAST so the
111
+ * result is "newest N MATCHING". See docs/contracts/CONTRACT-H6.md §A.3.
112
+ */
113
+ function applyFilters(entries, opts) {
114
+ // READ-ONLY post-filter over readAudit()'s output — touches NO disk. Filters
115
+ // are applied FIRST (action → result → since), THEN `--limit` last, so the
116
+ // result is "the newest N records MATCHING the filters". See CONTRACT-H6 §A.3.
117
+ let out = entries;
118
+ if (opts.action !== undefined) {
119
+ const want = opts.action;
120
+ // A bare verb (no ':') matches every `verb:*` sub-action (e.g. `enroll`
121
+ // matches `enroll:add` + `enroll:remove`); a `verb:sub` value matches exactly.
122
+ const prefixMatch = !want.includes(':');
123
+ out = out.filter((e) => prefixMatch ? e.action === want || e.action.startsWith(`${want}:`) : e.action === want);
124
+ }
125
+ if (opts.result !== undefined) {
126
+ out = out.filter((e) => e.result === opts.result);
127
+ }
128
+ if (opts.sinceMs !== undefined) {
129
+ const floor = opts.sinceMs;
130
+ // Drop records whose ts is STRICTLY before the bound. An unparseable ts in a
131
+ // record is treated as not-after-the-floor and dropped (it cannot prove it is
132
+ // newer); readAudit() only yields string `ts`, so this is defensive.
133
+ out = out.filter((e) => {
134
+ const t = Date.parse(e.ts);
135
+ return !isNaN(t) && t >= floor;
136
+ });
137
+ }
138
+ // `--limit` LAST: newest-N of the already-filtered set (readAudit() is newest-first).
139
+ return opts.limit !== undefined ? out.slice(0, opts.limit) : out;
140
+ }
141
+ // ---------------------------------------------------------------------------
142
+ // Pretty printer (non-TTY safe) — carried over from cli/sandbox.ts
143
+ // ---------------------------------------------------------------------------
144
+ // READ-TIME TRUST CONTRACT (H6 review finding, §A.3): this viewer prints
145
+ // entry.summary / entry.repo / entry.sandboxId verbatim (and re-emits all fields
146
+ // in --json) WITHOUT re-running stripSecrets on read. That is correct by design:
147
+ // the SOLE secret-scrub enforcement point is audit() WRITE-TIME
148
+ // (core/sandbox/audit.ts) which runs stripSecrets() over `summary` before append.
149
+ // `repo`/`sandboxId` are METADATA-ONLY by the audit() contract (an abs repo path
150
+ // or a sandbox id — never a token), so re-scrubbing on read would be redundant on
151
+ // `summary` and would not cover `repo`/`sandboxId` anyway. The invariant the
152
+ // viewer relies on: every audit() CALL SITE (current and future) MUST keep tokens
153
+ // out of `repo`/`sandboxId`; the H6 sites pass repo=abs-path, sandboxId=null.
154
+ function formatAuditEntry(entry) {
155
+ const resultColor = entry.result === 'ok'
156
+ ? green(entry.result)
157
+ : entry.result === 'refused'
158
+ ? yellow(entry.result)
159
+ : red(entry.result);
160
+ const ts = dim(entry.ts.replace('T', ' ').replace(/\.\d+Z$/, 'Z'));
161
+ const action = bold(entry.action);
162
+ const repo = entry.repo ? dim(` repo=${entry.repo}`) : '';
163
+ const sbId = entry.sandboxId ? dim(` sandbox=${entry.sandboxId}`) : '';
164
+ return `${ts} [${resultColor}] ${action} ${entry.summary}${repo}${sbId}`;
165
+ }
166
+ // ---------------------------------------------------------------------------
167
+ // cmdAudit — the command entry point
168
+ // ---------------------------------------------------------------------------
169
+ export async function cmdAudit(args) {
170
+ const parsed = parseArgs(args);
171
+ if ('error' in parsed) {
172
+ console.error(red('error: ') + parsed.error);
173
+ console.error(dim('Usage: ashlr audit [N | --limit N] [--json] [--action <verb>] ' +
174
+ '[--result ok|refused|error] [--since <ISO|YYYY-MM-DD>]'));
175
+ return 2;
176
+ }
177
+ const readAudit = await loadReadAudit();
178
+ if (!readAudit) {
179
+ moduleNotBuilt();
180
+ return 1;
181
+ }
182
+ // Read ALL records (limit is applied AFTER filtering in applyFilters), then
183
+ // filter read-only. readAudit() itself is unchanged + never throws.
184
+ const all = readAudit();
185
+ const entries = applyFilters(all, parsed);
186
+ if (parsed.json) {
187
+ console.log(JSON.stringify(entries, null, 2));
188
+ return 0;
189
+ }
190
+ if (entries.length === 0) {
191
+ console.log(dim('No audit entries found.'));
192
+ return 0;
193
+ }
194
+ for (const entry of entries) {
195
+ console.log(formatAuditEntry(entry));
196
+ }
197
+ return 0;
198
+ }
199
+ //# sourceMappingURL=audit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit.js","sourceRoot":"","sources":["../../src/cli/audit.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * `ashlr backlog` — Work Discovery CLI (M22).
3
+ *
4
+ * Commands:
5
+ * backlog List current scored backlog (load from disk or build if missing).
6
+ * backlog refresh Re-scan all enrolled repos via buildBacklog(), then list.
7
+ *
8
+ * Flags:
9
+ * --repo <path> Filter items to a specific enrolled repo.
10
+ * --source <source> Filter by WorkSource (issue|todo|test|dep|doc|security).
11
+ * --limit <n> Cap the number of rows shown.
12
+ * --json Emit raw JSON (the full filtered Backlog object).
13
+ *
14
+ * Non-TTY safe. READ-ONLY — this CLI only reads the backlog; all mutations are
15
+ * performed by buildBacklog() in core/portfolio/backlog.ts (which is itself
16
+ * READ-ONLY with respect to the scanned repos).
17
+ *
18
+ * Enrollment-scoped: only enrolled repos are ever scanned. When no repos are
19
+ * enrolled (DEFAULT EMPTY) the backlog is empty and a friendly hint is shown.
20
+ */
21
+ /**
22
+ * `ashlr backlog [refresh] [--repo <path>] [--source <src>] [--limit <n>] [--json]`
23
+ *
24
+ * Returns process exit code (0 = success, 1 = error, 2 = usage error).
25
+ */
26
+ export declare function cmdBacklog(args: string[]): Promise<number>;
@@ -0,0 +1,322 @@
1
+ /**
2
+ * `ashlr backlog` — Work Discovery CLI (M22).
3
+ *
4
+ * Commands:
5
+ * backlog List current scored backlog (load from disk or build if missing).
6
+ * backlog refresh Re-scan all enrolled repos via buildBacklog(), then list.
7
+ *
8
+ * Flags:
9
+ * --repo <path> Filter items to a specific enrolled repo.
10
+ * --source <source> Filter by WorkSource (issue|todo|test|dep|doc|security).
11
+ * --limit <n> Cap the number of rows shown.
12
+ * --json Emit raw JSON (the full filtered Backlog object).
13
+ *
14
+ * Non-TTY safe. READ-ONLY — this CLI only reads the backlog; all mutations are
15
+ * performed by buildBacklog() in core/portfolio/backlog.ts (which is itself
16
+ * READ-ONLY with respect to the scanned repos).
17
+ *
18
+ * Enrollment-scoped: only enrolled repos are ever scanned. When no repos are
19
+ * enrolled (DEFAULT EMPTY) the backlog is empty and a friendly hint is shown.
20
+ */
21
+ import { makeColors, pad } from './ui.js';
22
+ let _buildBacklog;
23
+ let _loadBacklog;
24
+ async function getBuildBacklog() {
25
+ if (_buildBacklog === undefined) {
26
+ try {
27
+ const mod = await import('../core/portfolio/backlog.js');
28
+ _buildBacklog = mod.buildBacklog;
29
+ _loadBacklog = mod.loadBacklog;
30
+ }
31
+ catch {
32
+ _buildBacklog = null;
33
+ _loadBacklog = null;
34
+ }
35
+ }
36
+ return _buildBacklog;
37
+ }
38
+ async function getLoadBacklog() {
39
+ // Ensure the module load attempt has been made.
40
+ await getBuildBacklog();
41
+ return _loadBacklog ?? null;
42
+ }
43
+ // ---------------------------------------------------------------------------
44
+ // Helpers
45
+ // ---------------------------------------------------------------------------
46
+ const SOURCE_LABELS = {
47
+ issue: 'issue',
48
+ todo: 'todo',
49
+ test: 'test',
50
+ dep: 'dep',
51
+ doc: 'doc',
52
+ security: 'security',
53
+ plugin: 'plugin', // M33
54
+ };
55
+ const SOURCE_COLORS = {
56
+ issue: 'blue',
57
+ todo: 'yellow',
58
+ test: 'red',
59
+ dep: 'magenta',
60
+ doc: 'cyan',
61
+ security: 'red',
62
+ plugin: 'cyan', // M33
63
+ };
64
+ /** Shorten an absolute repo path: replace $HOME with ~, truncate if long. */
65
+ function shortRepo(repo) {
66
+ const home = process.env['HOME'] ?? '';
67
+ const s = home ? repo.replace(home, '~') : repo;
68
+ // Keep last two segments for readability.
69
+ const parts = s.split('/');
70
+ return parts.length > 3 ? '…/' + parts.slice(-2).join('/') : s;
71
+ }
72
+ /** Score bar: 5 filled blocks out of 5, proportional. */
73
+ function scoreBar(score) {
74
+ // score = value/effort, typically 0.2..5.0
75
+ // Map to 0-5 blocks (each 0.2 wide steps → 1 block per integer score up to 5).
76
+ const filled = Math.max(0, Math.min(5, Math.round(score)));
77
+ return '█'.repeat(filled) + '░'.repeat(5 - filled);
78
+ }
79
+ /** Print the backlog as a human-readable aligned table. */
80
+ function printTable(items, tty) {
81
+ const col = makeColors(tty);
82
+ if (items.length === 0) {
83
+ console.log(col.dim(' (no items)'));
84
+ return;
85
+ }
86
+ // Column widths (computed from data).
87
+ const scoreW = 7; // " 5.00 " fits; fixed
88
+ const barW = 5; // 5 blocks; fixed
89
+ const srcW = 8; // longest source is "security"
90
+ const repoW = Math.min(30, Math.max(10, ...items.map(i => shortRepo(i.repo).length)));
91
+ const veW = 6; // "V5/E5" fits
92
+ const titleW = Math.min(60, Math.max(10, ...items.map(i => i.title.length)));
93
+ // Header.
94
+ const hdr = [
95
+ col.bold(pad('SCORE', scoreW)),
96
+ col.bold(pad('', barW)),
97
+ col.bold(pad('SRC', srcW)),
98
+ col.bold(pad('REPO', repoW)),
99
+ col.bold(pad('V/E', veW)),
100
+ col.bold('TITLE'),
101
+ ].join(' ');
102
+ console.log('');
103
+ console.log(' ' + hdr);
104
+ console.log(' ' + col.dim('─'.repeat(scoreW + barW + srcW + repoW + veW + titleW + 10)));
105
+ for (const item of items) {
106
+ const srcColor = SOURCE_COLORS[item.source] ?? 'cyan';
107
+ // makeColors returns an object; access by key.
108
+ const colorFn = col[srcColor];
109
+ const scoreFmt = item.score.toFixed(2);
110
+ const bar = tty ? col.green(scoreBar(item.score)) : scoreBar(item.score);
111
+ const src = colorFn(pad(SOURCE_LABELS[item.source] ?? item.source, srcW));
112
+ const repo = col.dim(pad(shortRepo(item.repo), repoW));
113
+ const ve = col.dim(`V${item.value}/E${item.effort}`);
114
+ // Truncate long titles.
115
+ const title = item.title.length > titleW
116
+ ? item.title.slice(0, titleW - 1) + '…'
117
+ : item.title;
118
+ const row = [
119
+ col.bold(pad(scoreFmt, scoreW)),
120
+ bar,
121
+ src,
122
+ repo,
123
+ pad(ve, veW),
124
+ title,
125
+ ].join(' ');
126
+ console.log(' ' + row);
127
+ }
128
+ console.log('');
129
+ }
130
+ /** Print a brief summary line after a refresh. */
131
+ function printSummary(repos, items, col) {
132
+ const counts = {};
133
+ for (const item of items) {
134
+ counts[item.source] = (counts[item.source] ?? 0) + 1;
135
+ }
136
+ const breakdown = Object.entries(counts)
137
+ .sort((a, b) => b[1] - a[1])
138
+ .map(([src, n]) => `${n} ${src}`)
139
+ .join(', ');
140
+ console.log(col.green('✓') + ' Backlog refreshed — ' +
141
+ col.bold(String(items.length)) + ' item' + (items.length !== 1 ? 's' : '') +
142
+ ' across ' + col.bold(String(repos.length)) + ' repo' + (repos.length !== 1 ? 's' : '') +
143
+ (breakdown ? col.dim(' (' + breakdown + ')') : ''));
144
+ }
145
+ // ---------------------------------------------------------------------------
146
+ // Public entry point
147
+ // ---------------------------------------------------------------------------
148
+ /**
149
+ * `ashlr backlog [refresh] [--repo <path>] [--source <src>] [--limit <n>] [--json]`
150
+ *
151
+ * Returns process exit code (0 = success, 1 = error, 2 = usage error).
152
+ */
153
+ export async function cmdBacklog(args) {
154
+ const tty = process.stdout.isTTY === true;
155
+ const col = makeColors(tty);
156
+ // ── Parse arguments ──────────────────────────────────────────────────────
157
+ let subcommand = 'list';
158
+ let filterRepo;
159
+ let filterSource;
160
+ let limit;
161
+ let jsonMode = false;
162
+ const validSources = new Set(['issue', 'todo', 'test', 'dep', 'doc', 'security']);
163
+ for (let i = 0; i < args.length; i++) {
164
+ const a = args[i];
165
+ if (a === 'refresh') {
166
+ subcommand = 'refresh';
167
+ }
168
+ else if (a === '--json') {
169
+ jsonMode = true;
170
+ }
171
+ else if (a === '--repo') {
172
+ filterRepo = args[++i];
173
+ if (!filterRepo) {
174
+ console.error(col.red('error: ') + '--repo requires a path argument');
175
+ return 2;
176
+ }
177
+ }
178
+ else if (a === '--source') {
179
+ const raw = args[++i];
180
+ if (!raw || !validSources.has(raw)) {
181
+ console.error(col.red('error: ') + `--source requires one of: ${[...validSources].join('|')}, got: ${raw ?? '(missing)'}`);
182
+ return 2;
183
+ }
184
+ filterSource = raw;
185
+ }
186
+ else if (a === '--limit') {
187
+ const raw = args[++i];
188
+ const n = raw !== undefined ? parseInt(raw, 10) : NaN;
189
+ if (isNaN(n) || n <= 0) {
190
+ console.error(col.red('error: ') + `--limit requires a positive integer, got: ${raw ?? '(missing)'}`);
191
+ return 2;
192
+ }
193
+ limit = n;
194
+ }
195
+ else if (a === 'list') {
196
+ // explicit 'list' subcommand — no-op, it's the default
197
+ }
198
+ else if (a?.startsWith('-')) {
199
+ console.error(col.red('error: ') + `Unknown flag: ${a}`);
200
+ console.error(col.dim('Usage: ashlr backlog [refresh] [--repo <path>] [--source <src>] [--limit <n>] [--json]'));
201
+ return 2;
202
+ }
203
+ }
204
+ // ── Load portfolio modules ───────────────────────────────────────────────
205
+ const buildBacklog = await getBuildBacklog();
206
+ const loadBacklog = await getLoadBacklog();
207
+ if (!buildBacklog || !loadBacklog) {
208
+ console.error(col.red('error: ') + 'backlog command requires src/core/portfolio/backlog.ts (M22 module not yet built).');
209
+ return 1;
210
+ }
211
+ // ── Execute subcommand ───────────────────────────────────────────────────
212
+ let backlog = null;
213
+ if (subcommand === 'refresh') {
214
+ if (!jsonMode) {
215
+ process.stdout.write(col.dim('Scanning enrolled repos…') + (tty ? '\r' : '\n'));
216
+ }
217
+ try {
218
+ backlog = await buildBacklog();
219
+ }
220
+ catch (err) {
221
+ const msg = err instanceof Error ? err.message : String(err);
222
+ console.error(col.red('error: ') + msg);
223
+ return 1;
224
+ }
225
+ if (!jsonMode) {
226
+ // Clear the scanning line on TTY.
227
+ if (tty)
228
+ process.stdout.write('\x1b[2K\r');
229
+ printSummary(backlog.repos, backlog.items, col);
230
+ }
231
+ }
232
+ else {
233
+ // Default: list — load from disk; build if missing.
234
+ backlog = loadBacklog();
235
+ if (!backlog) {
236
+ if (!jsonMode) {
237
+ process.stdout.write(col.dim('No backlog found — building now…') + (tty ? '\r' : '\n'));
238
+ }
239
+ try {
240
+ backlog = await buildBacklog();
241
+ }
242
+ catch (err) {
243
+ const msg = err instanceof Error ? err.message : String(err);
244
+ console.error(col.red('error: ') + msg);
245
+ return 1;
246
+ }
247
+ if (!jsonMode && tty) {
248
+ process.stdout.write('\x1b[2K\r');
249
+ }
250
+ }
251
+ }
252
+ // ── No enrolled repos ────────────────────────────────────────────────────
253
+ if (backlog.repos.length === 0 && backlog.items.length === 0) {
254
+ if (jsonMode) {
255
+ console.log(JSON.stringify(backlog, null, 2));
256
+ return 0;
257
+ }
258
+ console.log('');
259
+ console.log(col.yellow('No repos enrolled.'));
260
+ console.log(col.dim(' Enroll a repo to start discovering work:'));
261
+ console.log(' ' + col.cyan('ashlr enroll add <path-to-repo>'));
262
+ console.log('');
263
+ return 0;
264
+ }
265
+ // ── Apply filters ────────────────────────────────────────────────────────
266
+ let items = backlog.items;
267
+ if (filterRepo) {
268
+ // Normalize: support both absolute and partial matches.
269
+ const norm = filterRepo.replace(/\/$/, '');
270
+ items = items.filter(i => i.repo === norm || i.repo.endsWith('/' + norm) || i.repo.includes(norm));
271
+ }
272
+ if (filterSource) {
273
+ items = items.filter(i => i.source === filterSource);
274
+ }
275
+ if (limit !== undefined) {
276
+ items = items.slice(0, limit);
277
+ }
278
+ // ── Output ───────────────────────────────────────────────────────────────
279
+ if (jsonMode) {
280
+ const out = {
281
+ generatedAt: backlog.generatedAt,
282
+ repos: backlog.repos,
283
+ items,
284
+ };
285
+ console.log(JSON.stringify(out, null, 2));
286
+ return 0;
287
+ }
288
+ // Human-readable header.
289
+ const age = (() => {
290
+ try {
291
+ const ms = Date.now() - new Date(backlog.generatedAt).getTime();
292
+ if (ms < 60_000)
293
+ return 'just now';
294
+ if (ms < 3_600_000)
295
+ return `${Math.floor(ms / 60_000)}m ago`;
296
+ if (ms < 86_400_000)
297
+ return `${Math.floor(ms / 3_600_000)}h ago`;
298
+ return `${Math.floor(ms / 86_400_000)}d ago`;
299
+ }
300
+ catch {
301
+ return backlog.generatedAt;
302
+ }
303
+ })();
304
+ console.log('');
305
+ console.log(col.bold(' ashlr backlog') +
306
+ col.dim(` — ${items.length} item${items.length !== 1 ? 's' : ''}` +
307
+ (filterRepo || filterSource || limit !== undefined ? ' (filtered)' : '') +
308
+ ` · generated ${age}` +
309
+ ` · ${backlog.repos.length} repo${backlog.repos.length !== 1 ? 's' : ''}`));
310
+ printTable(items, tty);
311
+ if (items.length === 0 && (filterRepo || filterSource)) {
312
+ console.log(col.dim(' No items match the current filters.'));
313
+ console.log('');
314
+ }
315
+ // Hint: how to refresh.
316
+ if (subcommand === 'list') {
317
+ console.log(col.dim(' Run `ashlr backlog refresh` to re-scan.'));
318
+ console.log('');
319
+ }
320
+ return 0;
321
+ }
322
+ //# sourceMappingURL=backlog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backlog.js","sourceRoot":"","sources":["../../src/cli/backlog.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * cli/completions.ts — `ashlr completions zsh|bash` (M31).
3
+ *
4
+ * Emits a STATIC shell-completion script generated from the top-level command
5
+ * table. Install:
6
+ * zsh: ashlr completions zsh > ~/.zsh/completions/_ashlr (fpath dir)
7
+ * bash: ashlr completions bash > ~/.local/share/bash-completion/completions/ashlr
8
+ *
9
+ * Read-only: prints to stdout, writes nothing. Exit codes: 0 / 2 bad usage.
10
+ */
11
+ /** Top-level commands (kept in sync by test/m31.cli-agent.test.ts). */
12
+ export declare const TOP_LEVEL_COMMANDS: string[];
13
+ export declare function cmdCompletions(args: string[]): Promise<number>;
14
+ /**
15
+ * Closest known command for a typo, or null when nothing is plausibly close
16
+ * (distance must be ≤ 2 and less than half the input length).
17
+ */
18
+ export declare function didYouMean(input: string): string | null;