@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,188 @@
1
+ /**
2
+ * `ashlr notify` — notification webhook subcommand.
3
+ *
4
+ * Usage:
5
+ * ashlr notify test [--json]
6
+ *
7
+ * Sends a test ping to configured webhook(s) (cfg.notify.slackWebhook /
8
+ * cfg.notify.discordWebhook). Informative no-op (exit 0) when none configured —
9
+ * explains how to set one up. Never posts without a configured webhook.
10
+ *
11
+ * Exit codes:
12
+ * 0 test ping sent (or no webhook configured — informative)
13
+ * 1 test ping failed
14
+ * 2 bad usage
15
+ */
16
+ import { makeColors, isTty } from './ui.js';
17
+ import { loadConfig } from '../core/config.js';
18
+ const { bold, dim, red, green, yellow, cyan } = makeColors(isTty());
19
+ // ---------------------------------------------------------------------------
20
+ // Lazy import — integrations built by another agent; degrade gracefully
21
+ // ---------------------------------------------------------------------------
22
+ async function importNotify() {
23
+ return import('../core/integrations/notify.js');
24
+ }
25
+ // ---------------------------------------------------------------------------
26
+ // Help
27
+ // ---------------------------------------------------------------------------
28
+ function printNotifyHelp() {
29
+ console.log('');
30
+ console.log(bold(' ashlr notify') + dim(' — notification webhook (opt-in)'));
31
+ console.log('');
32
+ console.log(' ' + bold('Subcommands:'));
33
+ console.log('');
34
+ console.log(` ${cyan('test [--json]')} Send a test ping to configured webhook(s).`);
35
+ console.log('');
36
+ console.log(' ' + bold('How to configure:'));
37
+ console.log('');
38
+ console.log(` Add ${bold('notify')} to your ${dim('~/.ashlr/config.json')}:`);
39
+ console.log('');
40
+ console.log(` ${dim('"notify": {')}`);
41
+ console.log(` ${dim(' "slackWebhook": "https://hooks.slack.com/services/..."')}`);
42
+ console.log(` ${dim(' "discordWebhook": "https://discord.com/api/webhooks/..."')}`);
43
+ console.log(` ${dim('}')}`);
44
+ console.log('');
45
+ console.log(' ' + bold('Notes:'));
46
+ console.log('');
47
+ console.log(` ${dim('• No-op (safe, informative exit 0) when no webhook is configured.')}`);
48
+ console.log(` ${dim('• Posts concise summaries only — no secrets, no raw tokens.')}`);
49
+ console.log(` ${dim('• Automatic posting only happens when a run/swarm completes and')}`);
50
+ console.log(` ${dim(' notify is called explicitly from that flow — never from reads.')}`);
51
+ console.log('');
52
+ }
53
+ // ---------------------------------------------------------------------------
54
+ // Subcommand: notify test
55
+ // ---------------------------------------------------------------------------
56
+ async function cmdNotifyTest(args) {
57
+ const jsonMode = args.includes('--json');
58
+ // Load config — degrade gracefully if unavailable
59
+ let cfg;
60
+ try {
61
+ cfg = loadConfig();
62
+ }
63
+ catch (err) {
64
+ const msg = err instanceof Error ? err.message : String(err);
65
+ if (jsonMode) {
66
+ process.stdout.write(JSON.stringify({ sent: false, detail: `config load failed: ${msg}` }, null, 2) + '\n');
67
+ }
68
+ else {
69
+ process.stderr.write(red('error: ') + `Could not load config: ${msg}\n`);
70
+ }
71
+ return 1;
72
+ }
73
+ // M32: opt-in desktop ping (macOS) — fired alongside the webhook test.
74
+ let desktopSent = false;
75
+ try {
76
+ const { desktopNotify, desktopNotifyEnabled } = await import('../core/integrations/desktop-notify.js');
77
+ if (desktopNotifyEnabled(cfg)) {
78
+ desktopSent = await desktopNotify('ashlr', 'notify test — desktop notifications are working', cfg);
79
+ if (!jsonMode && desktopSent) {
80
+ process.stdout.write('desktop notification sent ✓\n');
81
+ }
82
+ }
83
+ }
84
+ catch { /* desktop ping is best-effort */ }
85
+ // No webhook configured → informative no-op
86
+ const hasSlack = Boolean(cfg.notify?.slackWebhook);
87
+ const hasDiscord = Boolean(cfg.notify?.discordWebhook);
88
+ if (!hasSlack && !hasDiscord) {
89
+ if (jsonMode) {
90
+ process.stdout.write(JSON.stringify({
91
+ sent: false,
92
+ configured: false,
93
+ detail: 'no webhook configured',
94
+ hint: 'Add notify.slackWebhook or notify.discordWebhook to ~/.ashlr/config.json',
95
+ }, null, 2) + '\n');
96
+ }
97
+ else {
98
+ console.log('');
99
+ console.log(yellow(' No notification webhook configured.'));
100
+ console.log('');
101
+ console.log(' To enable notifications, add to ' + dim('~/.ashlr/config.json') + ':');
102
+ console.log('');
103
+ console.log(` ${dim('"notify": {')}`);
104
+ console.log(` ${dim(' "slackWebhook": "https://hooks.slack.com/services/..."')}`);
105
+ console.log(` ${dim(' "discordWebhook": "https://discord.com/api/webhooks/..."')}`);
106
+ console.log(` ${dim('}')}`);
107
+ console.log('');
108
+ console.log(dim(' Run `ashlr notify test` again once a webhook is configured.'));
109
+ console.log('');
110
+ }
111
+ return 0;
112
+ }
113
+ // Load the notify module
114
+ let mod;
115
+ try {
116
+ mod = await importNotify();
117
+ }
118
+ catch {
119
+ if (jsonMode) {
120
+ process.stdout.write(JSON.stringify({ sent: false, detail: 'notify module not yet available' }, null, 2) + '\n');
121
+ }
122
+ else {
123
+ process.stderr.write(red('error: ') + 'Notify integration module not yet available.\n');
124
+ }
125
+ return 1;
126
+ }
127
+ const targets = [];
128
+ if (hasSlack)
129
+ targets.push('Slack');
130
+ if (hasDiscord)
131
+ targets.push('Discord');
132
+ if (!jsonMode) {
133
+ console.log('');
134
+ console.log(bold(' ashlr notify test'));
135
+ console.log('');
136
+ console.log(` Sending test ping to: ${targets.map(t => cyan(t)).join(', ')}`);
137
+ console.log('');
138
+ }
139
+ const text = `ashlr notify test — connection check from ashlr-hub (${new Date().toISOString()})`;
140
+ let ok;
141
+ try {
142
+ ok = await mod.notify(text, cfg);
143
+ }
144
+ catch (err) {
145
+ const msg = err instanceof Error ? err.message : String(err);
146
+ if (jsonMode) {
147
+ process.stdout.write(JSON.stringify({ sent: false, detail: msg }, null, 2) + '\n');
148
+ }
149
+ else {
150
+ console.log(red(` ✗ Failed: ${msg}`));
151
+ console.log('');
152
+ }
153
+ return 1;
154
+ }
155
+ if (jsonMode) {
156
+ process.stdout.write(JSON.stringify({ sent: ok, targets, detail: ok ? 'ping sent' : 'post failed' }, null, 2) + '\n');
157
+ return ok ? 0 : 1;
158
+ }
159
+ if (ok) {
160
+ console.log(green(` ✓ Test ping sent to: ${targets.join(', ')}`));
161
+ }
162
+ else {
163
+ console.log(red(' ✗ Failed to send test ping — check webhook URL and network.'));
164
+ }
165
+ console.log('');
166
+ return ok ? 0 : 1;
167
+ }
168
+ // ---------------------------------------------------------------------------
169
+ // cmdNotify — main entry point
170
+ // ---------------------------------------------------------------------------
171
+ /**
172
+ * `ashlr notify test` — send a test ping to configured webhook(s).
173
+ * Informative no-op when no webhook is configured. Returns a process exit code.
174
+ */
175
+ export async function cmdNotify(args) {
176
+ const sub = args[0];
177
+ if (!sub || sub === '--help' || sub === '-h' || sub === 'help') {
178
+ printNotifyHelp();
179
+ return 0;
180
+ }
181
+ if (sub === 'test') {
182
+ return cmdNotifyTest(args.slice(1));
183
+ }
184
+ process.stderr.write(red('error: ') + `unknown notify subcommand: ${bold(sub)}\n`);
185
+ process.stderr.write(dim('Run `ashlr notify help` for usage.\n'));
186
+ return 2;
187
+ }
188
+ //# sourceMappingURL=notify.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notify.js","sourceRoot":"","sources":["../../src/cli/notify.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,85 @@
1
+ /**
2
+ * CLI handler for `ashlr onboard` — a TTY-aware GUIDED first-activation
3
+ * walkthrough + one-command rollback. See docs/contracts/CONTRACT-H7.md
4
+ * (BUILD ITEM 3, 4, 5).
5
+ *
6
+ * H7 ABSOLUTE RULES (proven by test/h7.onboard.test.ts + test/h7.rollback.test.ts):
7
+ * - ONBOARD-NEVER-AUTO-APPLIES: onboard chains ONLY the pre-existing human
8
+ * gates — preflight (read-only) → enroll ONE repo (the explicit enrollment
9
+ * gate, H6-audited) → daemon --dry-run --once (read-only, creates NO proposal)
10
+ * → print a human-readable PLAN → point the user at `ashlr inbox` (review
11
+ * only). It NEVER applies/approves a proposal, NEVER pushes/PRs/deploys, and
12
+ * NEVER runs a live (non-dry) daemon. It imports NO outward primitive.
13
+ * - ROLLBACK-INWARD-ONLY: `--rollback <repo>` only narrows state — unenroll +
14
+ * sweepRepoSandboxes (scoped to the repo; a LIVE owner is never reclaimed) +
15
+ * (opt-in --kill) setKill(true). The full trail is audited by the H6 audit()
16
+ * inside policy.ts.
17
+ * - Non-interactive (--yes OR non-TTY): prints the numbered steps as guidance
18
+ * WITHOUT prompting and WITHOUT enrolling (mirrors cmdInit yesMode).
19
+ * - No new runtime deps; node builtins + existing modules only.
20
+ *
21
+ * Wiring: BUILD/INTEGRATION adds `case 'onboard'` + a `loadOnboardCmd` lazy
22
+ * loader in src/cli/index.ts + a cmdHelp entry (+ optional `unenroll` alias).
23
+ */
24
+ import type { AshlrConfig } from '../core/types.js';
25
+ /** Interactive readline confirm (y/N). Resolves false when stdin is not a TTY. */
26
+ export declare function promptConfirm(question: string): Promise<boolean>;
27
+ /**
28
+ * Test seam: cmdOnboard calls the confirm prompt THROUGH this indirection object
29
+ * so a unit test can override `confirm` without a live TTY (a direct
30
+ * module-internal call to the exported `promptConfirm` cannot be spied across
31
+ * the ESM boundary). Production always uses the real `promptConfirm`.
32
+ */
33
+ export declare const _internals: {
34
+ confirm: (question: string) => Promise<boolean>;
35
+ };
36
+ /**
37
+ * Render a HUMAN-READABLE dry-run PLAN (BUILD ITEM 5). Re-derives the same
38
+ * would-run selection the dry-run uses (listEnrolled → buildBacklog → top-K) and
39
+ * runs tick(cfg,{dryRun:true}) for the authoritative count. Creates NO proposal,
40
+ * spends $0, takes NO outward action.
41
+ *
42
+ * WRITE NOTE (not strictly side-effect-free): the authoritative
43
+ * tick(cfg,{dryRun:true}) persists the daemon RUN-STATE via saveDaemonState
44
+ * before returning (loop.ts dry-run branch). That write is the pre-existing,
45
+ * H6-audited dry-run behavior — it persists the H5-self-healed run-state flag
46
+ * (it NEVER sets running:true and NEVER creates a proposal), is bounded to the
47
+ * (isolated-in-tests) ~/.ashlr/daemon.json, and is never an outward action.
48
+ * Everything else here (listEnrolled / loadBacklog / buildBacklog) is a pure
49
+ * read.
50
+ *
51
+ * Sequence:
52
+ * 1. enrolled = listEnrolled() (read)
53
+ * 2. tick(cfg,{dryRun:true}) — authoritative itemsConsidered (NO proposal, $0;
54
+ * persists daemon run-state only — never an outward action)
55
+ * 3. loadBacklog()/buildBacklog({repos:enrolled}) — the SAME scan the tick
56
+ * used, for titles (read)
57
+ * 4. format `N item(s) across M repo(s)` + a bulleted list of the top-K titles,
58
+ * explicitly labelled a PLAN that creates NO proposals.
59
+ *
60
+ * Never throws — degrades to a legible "0 item(s)" plan on any read error.
61
+ */
62
+ export declare function renderDryRunPlan(cfg: AshlrConfig): Promise<string>;
63
+ /**
64
+ * ROLLBACK (BUILD ITEM 4) — INWARD CLEANUP ONLY. In order:
65
+ * 1. unenroll(repo) (H6-audited enroll:remove)
66
+ * 2. sweepRepoSandboxes(repo) (SCOPED to this repo; a LIVE owner is
67
+ * NEVER reclaimed; the age guard is
68
+ * dropped so a fresh crash-leftover from
69
+ * the very activation being undone IS
70
+ * reclaimed — true one-command undo)
71
+ * 3. opts.kill ⇒ setKill(true) (opt-in; H6-audited kill:on)
72
+ * Returns 0. NEVER widens access; NEVER an outward action.
73
+ */
74
+ export declare function rollback(repo: string, opts: {
75
+ kill: boolean;
76
+ }): Promise<number>;
77
+ /**
78
+ * `ashlr onboard` — guided first-activation walkthrough.
79
+ * - `--rollback <repo> [--kill]` routes to rollback().
80
+ * - else: preflight → (TTY) confirm + enroll ONE repo → dry-run PLAN →
81
+ * point at `ashlr inbox` → offer rollback.
82
+ * - `--yes` OR non-TTY: print the numbered steps WITHOUT prompting/enrolling.
83
+ * Returns 0 on success, non-zero when preflight blocks.
84
+ */
85
+ export declare function cmdOnboard(args: string[]): Promise<number>;
@@ -0,0 +1,305 @@
1
+ /**
2
+ * CLI handler for `ashlr onboard` — a TTY-aware GUIDED first-activation
3
+ * walkthrough + one-command rollback. See docs/contracts/CONTRACT-H7.md
4
+ * (BUILD ITEM 3, 4, 5).
5
+ *
6
+ * H7 ABSOLUTE RULES (proven by test/h7.onboard.test.ts + test/h7.rollback.test.ts):
7
+ * - ONBOARD-NEVER-AUTO-APPLIES: onboard chains ONLY the pre-existing human
8
+ * gates — preflight (read-only) → enroll ONE repo (the explicit enrollment
9
+ * gate, H6-audited) → daemon --dry-run --once (read-only, creates NO proposal)
10
+ * → print a human-readable PLAN → point the user at `ashlr inbox` (review
11
+ * only). It NEVER applies/approves a proposal, NEVER pushes/PRs/deploys, and
12
+ * NEVER runs a live (non-dry) daemon. It imports NO outward primitive.
13
+ * - ROLLBACK-INWARD-ONLY: `--rollback <repo>` only narrows state — unenroll +
14
+ * sweepRepoSandboxes (scoped to the repo; a LIVE owner is never reclaimed) +
15
+ * (opt-in --kill) setKill(true). The full trail is audited by the H6 audit()
16
+ * inside policy.ts.
17
+ * - Non-interactive (--yes OR non-TTY): prints the numbered steps as guidance
18
+ * WITHOUT prompting and WITHOUT enrolling (mirrors cmdInit yesMode).
19
+ * - No new runtime deps; node builtins + existing modules only.
20
+ *
21
+ * Wiring: BUILD/INTEGRATION adds `case 'onboard'` + a `loadOnboardCmd` lazy
22
+ * loader in src/cli/index.ts + a cmdHelp entry (+ optional `unenroll` alias).
23
+ */
24
+ import { resolve } from 'node:path';
25
+ import { loadConfig } from '../core/config.js';
26
+ import { buildReadiness } from '../core/readiness.js';
27
+ import { enroll, unenroll, setKill, listEnrolled } from '../core/sandbox/policy.js';
28
+ import { tick } from '../core/daemon/loop.js';
29
+ import { loadBacklog, buildBacklog } from '../core/portfolio/backlog.js';
30
+ import { sweepRepoSandboxes } from '../core/sandbox/worktree.js';
31
+ import { makeColors, isTty } from './ui.js';
32
+ const { bold, dim, red, green, yellow, cyan } = makeColors(isTty());
33
+ // ---------------------------------------------------------------------------
34
+ // Prompt — readline y/N confirm. Exported so tests can spy/mock it without
35
+ // touching a live TTY. Resolves false when stdin is not a TTY (so a non-TTY
36
+ // run NEVER enrolls; the caller's yesMode short-circuits before this anyway).
37
+ // ---------------------------------------------------------------------------
38
+ /** Interactive readline confirm (y/N). Resolves false when stdin is not a TTY. */
39
+ export async function promptConfirm(question) {
40
+ if (!process.stdin.isTTY)
41
+ return false;
42
+ const readline = await import('node:readline');
43
+ return new Promise((resolveP) => {
44
+ const rl = readline.createInterface({
45
+ input: process.stdin,
46
+ output: process.stdout,
47
+ });
48
+ rl.question(question + ' [y/N] ', (answer) => {
49
+ rl.close();
50
+ resolveP(answer.trim().toLowerCase() === 'y');
51
+ });
52
+ });
53
+ }
54
+ /**
55
+ * Test seam: cmdOnboard calls the confirm prompt THROUGH this indirection object
56
+ * so a unit test can override `confirm` without a live TTY (a direct
57
+ * module-internal call to the exported `promptConfirm` cannot be spied across
58
+ * the ESM boundary). Production always uses the real `promptConfirm`.
59
+ */
60
+ export const _internals = {
61
+ confirm: promptConfirm,
62
+ };
63
+ // ---------------------------------------------------------------------------
64
+ // renderDryRunPlan (BUILD ITEM 5) — human-readable, dry-run (NO outward action)
65
+ // ---------------------------------------------------------------------------
66
+ /**
67
+ * Render a HUMAN-READABLE dry-run PLAN (BUILD ITEM 5). Re-derives the same
68
+ * would-run selection the dry-run uses (listEnrolled → buildBacklog → top-K) and
69
+ * runs tick(cfg,{dryRun:true}) for the authoritative count. Creates NO proposal,
70
+ * spends $0, takes NO outward action.
71
+ *
72
+ * WRITE NOTE (not strictly side-effect-free): the authoritative
73
+ * tick(cfg,{dryRun:true}) persists the daemon RUN-STATE via saveDaemonState
74
+ * before returning (loop.ts dry-run branch). That write is the pre-existing,
75
+ * H6-audited dry-run behavior — it persists the H5-self-healed run-state flag
76
+ * (it NEVER sets running:true and NEVER creates a proposal), is bounded to the
77
+ * (isolated-in-tests) ~/.ashlr/daemon.json, and is never an outward action.
78
+ * Everything else here (listEnrolled / loadBacklog / buildBacklog) is a pure
79
+ * read.
80
+ *
81
+ * Sequence:
82
+ * 1. enrolled = listEnrolled() (read)
83
+ * 2. tick(cfg,{dryRun:true}) — authoritative itemsConsidered (NO proposal, $0;
84
+ * persists daemon run-state only — never an outward action)
85
+ * 3. loadBacklog()/buildBacklog({repos:enrolled}) — the SAME scan the tick
86
+ * used, for titles (read)
87
+ * 4. format `N item(s) across M repo(s)` + a bulleted list of the top-K titles,
88
+ * explicitly labelled a PLAN that creates NO proposals.
89
+ *
90
+ * Never throws — degrades to a legible "0 item(s)" plan on any read error.
91
+ */
92
+ export async function renderDryRunPlan(cfg) {
93
+ const enrolled = listEnrolled();
94
+ // (2) Authoritative count from the existing read-only dry-run path. The
95
+ // dry-run branch of tick() returns proposalsCreated:0, spentUsd:0,
96
+ // reason:'dry-run' — it creates NO proposal and spends nothing.
97
+ let itemsConsidered = 0;
98
+ try {
99
+ const t = await tick(cfg, { dryRun: true });
100
+ itemsConsidered = t.itemsConsidered;
101
+ }
102
+ catch {
103
+ itemsConsidered = 0;
104
+ }
105
+ // (3) The matching titles. Prefer the PERSISTED backlog (loadBacklog reads
106
+ // ~/.ashlr/backlog.json — the same scored, top-score-first set the daemon last
107
+ // computed; pure read, never throws). If none is persisted yet, fall back to a
108
+ // fresh read-only buildBacklog scan over the enrolled repos. Both are
109
+ // read-only and create no proposal.
110
+ let items = [];
111
+ try {
112
+ const persisted = loadBacklog();
113
+ if (persisted && persisted.items.length > 0) {
114
+ items = persisted.items;
115
+ }
116
+ else {
117
+ const backlog = await buildBacklog({ repos: enrolled });
118
+ items = backlog.items;
119
+ }
120
+ }
121
+ catch {
122
+ items = [];
123
+ }
124
+ // Present exactly the top-`itemsConsidered` titles the dry-run would work.
125
+ const planned = items.slice(0, itemsConsidered);
126
+ const repoCount = new Set(planned.map((i) => i.repo)).size;
127
+ const lines = [];
128
+ lines.push(bold(' Dry-run plan') + dim(' (preview only — creates NO proposals, spends $0)'));
129
+ lines.push('');
130
+ if (planned.length === 0) {
131
+ lines.push(` ${dim('0 item(s) would run')}` +
132
+ `${enrolled.length === 0 ? dim(' — no repo enrolled yet') : dim(' — backlog is empty for enrolled repo(s)')}`);
133
+ }
134
+ else {
135
+ lines.push(` ${green(String(planned.length))} item(s) would run across ` +
136
+ `${green(String(repoCount))} repo(s):`);
137
+ for (const it of planned) {
138
+ lines.push(` ${cyan('•')} ${it.title}${it.detail ? dim(` — ${it.detail}`) : ''}`);
139
+ }
140
+ }
141
+ lines.push('');
142
+ return lines.join('\n');
143
+ }
144
+ // ---------------------------------------------------------------------------
145
+ // rollback (BUILD ITEM 4) — INWARD CLEANUP ONLY
146
+ // ---------------------------------------------------------------------------
147
+ /**
148
+ * ROLLBACK (BUILD ITEM 4) — INWARD CLEANUP ONLY. In order:
149
+ * 1. unenroll(repo) (H6-audited enroll:remove)
150
+ * 2. sweepRepoSandboxes(repo) (SCOPED to this repo; a LIVE owner is
151
+ * NEVER reclaimed; the age guard is
152
+ * dropped so a fresh crash-leftover from
153
+ * the very activation being undone IS
154
+ * reclaimed — true one-command undo)
155
+ * 3. opts.kill ⇒ setKill(true) (opt-in; H6-audited kill:on)
156
+ * Returns 0. NEVER widens access; NEVER an outward action.
157
+ */
158
+ export async function rollback(repo, opts) {
159
+ const abs = resolve(repo);
160
+ // 1. Narrow the enrollment gate. Idempotent; H6-audited enroll:remove.
161
+ unenroll(abs);
162
+ // 2. Reclaim THIS repo's crash-leftover sandboxes (scoped). The scoped sweep
163
+ // drops the 6h age guard (so a FRESH leftover from the activation being
164
+ // undone is reclaimed too) but KEEPS the ownerAlive guard, so it NEVER
165
+ // force-removes a LIVE in-flight worktree; each removal inherits
166
+ // removeSandbox's full containment guards.
167
+ let swept = [];
168
+ try {
169
+ swept = sweepRepoSandboxes(abs);
170
+ }
171
+ catch {
172
+ swept = [];
173
+ }
174
+ // 3. Opt-in: pause ALL autonomy in the same step (H6-audited kill:on).
175
+ if (opts.kill)
176
+ setKill(true);
177
+ console.log('');
178
+ console.log(bold(' ashlr onboard --rollback'));
179
+ console.log('');
180
+ console.log(` ${green('✓')} unenrolled ${dim(abs)}`);
181
+ console.log(` ${green('✓')} swept ${swept.length} leftover sandbox(es) for this repo ` +
182
+ dim('(a live in-flight worktree is never reclaimed)'));
183
+ if (opts.kill) {
184
+ console.log(` ${yellow('!')} kill switch ON ${dim('— all autonomy paused')}`);
185
+ }
186
+ console.log('');
187
+ console.log(` ${dim('Re-enable any time with')} ${cyan('ashlr onboard')}.`);
188
+ console.log('');
189
+ return 0;
190
+ }
191
+ // ---------------------------------------------------------------------------
192
+ // Blocker / guidance rendering
193
+ // ---------------------------------------------------------------------------
194
+ function printBlockers(report) {
195
+ console.log('');
196
+ console.log(bold(' ashlr onboard') + dim(' — preflight'));
197
+ console.log('');
198
+ console.log(` ${red('✗')} ${bold('not ready')} ${dim('— resolve the blocker(s) below, then re-run.')}`);
199
+ console.log('');
200
+ for (const b of report.blockers) {
201
+ console.log(` ${red('✗')} ${b.detail}${b.fix ? `\n ${dim('fix:')} ${cyan(b.fix)}` : ''}`);
202
+ }
203
+ console.log('');
204
+ }
205
+ /**
206
+ * Non-interactive guidance: print the numbered FIRST-ACTIVATION steps WITHOUT
207
+ * prompting and WITHOUT enrolling. Mirrors cmdInit's yesMode — it DESCRIBES the
208
+ * activation; the human still runs the explicit enroll/inbox steps themselves.
209
+ */
210
+ function printSteps(repoHint) {
211
+ console.log('');
212
+ console.log(bold(' ashlr onboard') + dim(' — first safe activation (steps)'));
213
+ console.log('');
214
+ console.log(` ${dim('Run these in order. Each step is the explicit human gate — nothing runs on its own.')}`);
215
+ console.log('');
216
+ console.log(` ${cyan('1.')} ${bold('Preflight')} ${dim('ashlr preflight')} ${dim('— read-only readiness check')}`);
217
+ console.log(` ${cyan('2.')} ${bold('Enroll ONE')} ${dim(`ashlr sandbox enroll ${repoHint}`)} ${dim('— the explicit enrollment gate')}`);
218
+ console.log(` ${cyan('3.')} ${bold('Dry-run')} ${dim('ashlr daemon start --dry-run --once')} ${dim('— preview the plan; NO proposal, $0')}`);
219
+ console.log(` ${cyan('4.')} ${bold('Review')} ${dim('ashlr inbox')} ${dim('— review + approve; NEVER auto-applied')}`);
220
+ console.log(` ${cyan('5.')} ${bold('Rollback')} ${dim(`ashlr onboard --rollback ${repoHint}`)} ${dim('— one-command undo')}`);
221
+ console.log('');
222
+ console.log(` ${dim('Re-run interactively (a TTY, no --yes) to be guided through steps 1–3 automatically.')}`);
223
+ console.log('');
224
+ }
225
+ // ---------------------------------------------------------------------------
226
+ // cmdOnboard — the dispatcher entry point
227
+ // ---------------------------------------------------------------------------
228
+ /**
229
+ * `ashlr onboard` — guided first-activation walkthrough.
230
+ * - `--rollback <repo> [--kill]` routes to rollback().
231
+ * - else: preflight → (TTY) confirm + enroll ONE repo → dry-run PLAN →
232
+ * point at `ashlr inbox` → offer rollback.
233
+ * - `--yes` OR non-TTY: print the numbered steps WITHOUT prompting/enrolling.
234
+ * Returns 0 on success, non-zero when preflight blocks.
235
+ */
236
+ export async function cmdOnboard(args) {
237
+ const cfg = loadConfig();
238
+ // ── Rollback route ────────────────────────────────────────────────────────
239
+ if (args.includes('--rollback')) {
240
+ const idx = args.indexOf('--rollback');
241
+ // The repo is the positional right after --rollback, else the first
242
+ // non-flag positional, else cwd.
243
+ const positional = args.filter((a, i) => !a.startsWith('--') && i !== idx + 1);
244
+ const repo = args[idx + 1] && !args[idx + 1].startsWith('--')
245
+ ? args[idx + 1]
246
+ : positional[0] ?? process.cwd();
247
+ const kill = args.includes('--kill');
248
+ return rollback(repo, { kill });
249
+ }
250
+ // ── yesMode = non-interactive guidance (NO prompt, NO enroll) ──────────────
251
+ const yesMode = args.includes('--yes') || !process.stdin.isTTY;
252
+ // Candidate repo: first positional arg, else cwd.
253
+ const repoArg = args.find((a) => !a.startsWith('--'));
254
+ const candidate = resolve(repoArg ?? process.cwd());
255
+ // ── Step 1: Preflight (READ-ONLY). Blockers ⇒ STOP, do nothing else. ───────
256
+ const report = await buildReadiness(cfg);
257
+ if (!report.ready) {
258
+ printBlockers(report);
259
+ return 1;
260
+ }
261
+ // Non-interactive: print the numbered steps and STOP — never enroll, never
262
+ // dry-run on the user's behalf. The human runs the explicit gates.
263
+ if (yesMode) {
264
+ printSteps(repoArg ?? candidate);
265
+ return 0;
266
+ }
267
+ // ── Interactive walkthrough ────────────────────────────────────────────────
268
+ console.log('');
269
+ console.log(bold(' ashlr onboard') + dim(' — first safe activation'));
270
+ console.log('');
271
+ console.log(` ${green('✓')} ${bold('ready')}` +
272
+ (report.warnings.length ? dim(` (${report.warnings.length} warning(s) — non-blocking)`) : ''));
273
+ for (const w of report.warnings) {
274
+ console.log(` ${yellow('!')} ${dim(w.detail)}`);
275
+ }
276
+ for (const note of report.info) {
277
+ console.log(` ${dim('•')} ${dim(note.detail)}`);
278
+ }
279
+ console.log('');
280
+ // ── Step 2: Enroll ONE repo (the explicit human gate; H6-audited) ──────────
281
+ const before = listEnrolled();
282
+ const confirmed = await _internals.confirm(` Enroll ${cyan(candidate)} for autonomous work?`);
283
+ if (!confirmed) {
284
+ console.log('');
285
+ console.log(` ${dim('No repo enrolled. Re-run when ready, or run')} ${cyan('ashlr preflight')} ${dim('to re-check.')}`);
286
+ console.log('');
287
+ return 0;
288
+ }
289
+ enroll(candidate); // idempotent; the ONLY mutating call in the whole flow
290
+ const after = listEnrolled();
291
+ console.log('');
292
+ console.log(` ${green('✓')} enrolled ${dim(candidate)} ${dim(`(${before.length} → ${after.length} repo(s))`)}`);
293
+ console.log('');
294
+ // ── Step 3: Dry-run PLAN (READ-ONLY — NO proposal, $0 spend) ───────────────
295
+ const plan = await renderDryRunPlan(cfg);
296
+ console.log(plan);
297
+ // ── Step 4: Point at the inbox (REVIEW ONLY — never auto-approve/apply) ─────
298
+ console.log(` ${bold('Next:')} review what would run with ${cyan('ashlr inbox')} ${dim('— nothing is applied until YOU approve it there.')}`);
299
+ console.log('');
300
+ // ── Step 5: Offer the one-command rollback ─────────────────────────────────
301
+ console.log(` ${dim('Undo this activation any time:')} ${cyan(`ashlr onboard --rollback ${candidate}`)}${dim(' [--kill]')}`);
302
+ console.log('');
303
+ return 0;
304
+ }
305
+ //# sourceMappingURL=onboard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"onboard.js","sourceRoot":"","sources":["../../src/cli/onboard.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * cli/open.ts — Launch items in editor, Finder, or Terminal.
3
+ *
4
+ * All launchers use spawn (detached, unref'd) so the CLI process exits
5
+ * immediately. Errors are swallowed — never throw; open operations are
6
+ * best-effort UI conveniences.
7
+ */
8
+ import type { AshlrConfig } from '../core/types.js';
9
+ /**
10
+ * Open `path` in the configured editor using a deep link URL.
11
+ *
12
+ * Strategy:
13
+ * 1. Cursor → `open "cursor://file/<abs>"`
14
+ * Fallback: `open -a Cursor <path>`
15
+ * 2. VSCode → `open "vscode://file/<abs>"`
16
+ * Fallback: `open -a "Visual Studio Code" <path>`
17
+ *
18
+ * The deep link is tried first; if the URL scheme handler is not registered
19
+ * (e.g. app not installed) macOS silently does nothing, so we do not attempt
20
+ * explicit fallback detection — callers are welcome to retry via openInFinder.
21
+ */
22
+ export declare function openInEditor(path: string, cfg: AshlrConfig): void;
23
+ /**
24
+ * Reveal `path` in macOS Finder.
25
+ * Uses `open <path>` which opens directories in Finder and files with their
26
+ * default app. For "reveal in Finder" semantics on a file, callers can pass
27
+ * the parent directory instead.
28
+ */
29
+ export declare function openInFinder(path: string): void;
30
+ /**
31
+ * Open a new Terminal window cd'd to `path` (best-effort).
32
+ *
33
+ * Uses `open -a Terminal <path>`. On macOS this opens a new Terminal window
34
+ * at the given directory when path is a directory. For files, Terminal opens
35
+ * at the parent directory. No guarantee for iTerm2 or other terminals — this
36
+ * targets the system Terminal.app only.
37
+ */
38
+ export declare function openInTerminal(path: string): void;