@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,359 @@
1
+ /**
2
+ * core/integrations/identity.ts — Phantom identity probe (M18).
3
+ *
4
+ * INTENTIONALLY VALUES-FREE: derives only names/status from the phantom CLI.
5
+ * Never reads, captures, logs, or returns secret values under any code path.
6
+ *
7
+ * Public API:
8
+ * getIdentity(): Identity
9
+ * — reads phantom cloud status + team list to derive who the caller is.
10
+ * — NEVER throws; degrades to {loggedIn:false,...null} on any failure.
11
+ * — bounded by a short timeout on each probe call.
12
+ */
13
+ import { spawnSync } from 'node:child_process';
14
+ // ---------------------------------------------------------------------------
15
+ // Constants
16
+ // ---------------------------------------------------------------------------
17
+ const PHANTOM_BIN = 'phantom';
18
+ /** Hard cap per phantom call — keeps getIdentity() snappy. */
19
+ const TIMEOUT_MS = 4_000;
20
+ // ---------------------------------------------------------------------------
21
+ // Internal helpers
22
+ // ---------------------------------------------------------------------------
23
+ /**
24
+ * Run a phantom sub-command synchronously.
25
+ * Never throws — all errors surface in the returned `error` string.
26
+ */
27
+ function runPhantom(args) {
28
+ try {
29
+ const result = spawnSync(PHANTOM_BIN, args, {
30
+ encoding: 'utf8',
31
+ timeout: TIMEOUT_MS,
32
+ // Suppress interactive prompts / update-check noise.
33
+ env: { ...process.env, PHANTOM_NO_UPDATE_CHECK: '1' },
34
+ });
35
+ if (result.error) {
36
+ return { stdout: '', stderr: '', status: null, error: result.error.message };
37
+ }
38
+ return {
39
+ stdout: result.stdout ?? '',
40
+ stderr: result.stderr ?? '',
41
+ status: result.status,
42
+ };
43
+ }
44
+ catch (err) {
45
+ const msg = err instanceof Error ? err.message : String(err);
46
+ return { stdout: '', stderr: '', status: null, error: msg };
47
+ }
48
+ }
49
+ // ---------------------------------------------------------------------------
50
+ // Parsers — names/status only, deliberately conservative
51
+ // ---------------------------------------------------------------------------
52
+ /**
53
+ * Parse `phantom cloud status [--json]` output to extract login state and
54
+ * optional user name.
55
+ *
56
+ * When logged in, phantom typically prints one of:
57
+ * -> Cloud: logged in as <user> (e.g. mason@evero-consulting.com)
58
+ * -> Cloud: logged in (no user shown)
59
+ *
60
+ * When logged out:
61
+ * -> Cloud: not logged in — run `phantom login`
62
+ *
63
+ * JSON form (--json) may yield: { "loggedIn": true, "user": "...", ... }
64
+ * We try JSON first, then fall back to the human-text heuristic.
65
+ *
66
+ * NEVER reads or returns secret values.
67
+ */
68
+ function parseCloudStatus(raw) {
69
+ const trimmed = raw.trim();
70
+ // ── JSON path ─────────────────────────────────────────────────────────────
71
+ if (trimmed.startsWith('{')) {
72
+ try {
73
+ const parsed = JSON.parse(trimmed);
74
+ // Recognised shapes:
75
+ // { "loggedIn": true, "user": "alice" }
76
+ // { "authenticated": true, "email": "alice@example.com" }
77
+ // { "account": { "email": "..." }, "loggedIn": true }
78
+ const loggedIn = typeof parsed['loggedIn'] === 'boolean'
79
+ ? parsed['loggedIn']
80
+ : typeof parsed['authenticated'] === 'boolean'
81
+ ? parsed['authenticated']
82
+ : null;
83
+ if (loggedIn !== null) {
84
+ const user = extractUserFromJson(parsed);
85
+ return { loggedIn, user };
86
+ }
87
+ }
88
+ catch {
89
+ // Fall through to text heuristic.
90
+ }
91
+ }
92
+ // ── Human-text heuristic ──────────────────────────────────────────────────
93
+ const lc = trimmed.toLowerCase();
94
+ // "not logged in" / "not authenticated" / "run `phantom login`"
95
+ if (lc.includes('not logged in') ||
96
+ lc.includes('not authenticated') ||
97
+ lc.includes('phantom login')) {
98
+ return { loggedIn: false, user: null };
99
+ }
100
+ // "logged in as <user>" — extract the user handle that follows "as "
101
+ if (lc.includes('logged in')) {
102
+ const user = extractUserFromText(trimmed);
103
+ return { loggedIn: true, user };
104
+ }
105
+ // Ambiguous / empty — treat as logged out.
106
+ return { loggedIn: false, user: null };
107
+ }
108
+ /**
109
+ * Extract a user identifier from a JSON object.
110
+ * Only reads fields whose names clearly carry an account handle/email/id.
111
+ * Returns null when none is found.
112
+ */
113
+ function extractUserFromJson(obj) {
114
+ // Direct top-level fields
115
+ for (const key of ['user', 'email', 'username', 'handle', 'id']) {
116
+ if (typeof obj[key] === 'string' && obj[key].length > 0) {
117
+ return obj[key];
118
+ }
119
+ }
120
+ // Nested account/profile object
121
+ for (const containerKey of ['account', 'profile', 'identity']) {
122
+ const container = obj[containerKey];
123
+ if (container !== null && typeof container === 'object') {
124
+ const inner = container;
125
+ for (const key of ['user', 'email', 'username', 'handle', 'id']) {
126
+ if (typeof inner[key] === 'string' && inner[key].length > 0) {
127
+ return inner[key];
128
+ }
129
+ }
130
+ }
131
+ }
132
+ return null;
133
+ }
134
+ /**
135
+ * Extract the user handle from a human-text "logged in as <user>" line.
136
+ * Returns null when no recognisable handle can be found.
137
+ */
138
+ function extractUserFromText(line) {
139
+ // Pattern: "logged in as <handle>" or "Logged in as: <handle>"
140
+ // (case-insensitive; tolerates an optional colon after "as").
141
+ const inlineMatch = line.match(/logged\s+in\s+as\s*:?\s+(\S+)/i);
142
+ if (inlineMatch && inlineMatch[1]) {
143
+ return inlineMatch[1];
144
+ }
145
+ // Fallback: a labelled "User: <handle>" line (phantom's verbose text form).
146
+ const userLineMatch = line.match(/^[\t ]*user\s*:?\s+(\S+)/im);
147
+ if (userLineMatch && userLineMatch[1]) {
148
+ return userLineMatch[1];
149
+ }
150
+ return null;
151
+ }
152
+ /**
153
+ * Parse `phantom team list [--json]` to find the caller's active team name.
154
+ *
155
+ * JSON form may yield:
156
+ * [ { "name": "my-team", "role": "admin", "active": true }, ... ]
157
+ * { "teams": [ ... ] }
158
+ *
159
+ * Text form: table lines like "my-team admin active"
160
+ *
161
+ * We return the first team marked active, or the first team when none is
162
+ * explicitly marked. Returns null on any parse failure.
163
+ *
164
+ * NEVER reads or returns secret values.
165
+ */
166
+ function parseTeamName(raw) {
167
+ const trimmed = raw.trim();
168
+ if (!trimmed)
169
+ return null;
170
+ // ── JSON path ─────────────────────────────────────────────────────────────
171
+ // When the input is JSON-shaped we ONLY trust the JSON path and never fall
172
+ // through to the whitespace-token text heuristic — that heuristic would
173
+ // otherwise return the entire raw JSON blob (potentially leaking embedded
174
+ // secret-shaped fields) as the "team name".
175
+ const looksJson = trimmed.startsWith('[') || trimmed.startsWith('{');
176
+ if (looksJson) {
177
+ try {
178
+ let parsed = JSON.parse(trimmed);
179
+ // Unwrap { "teams": [...] }
180
+ if (parsed !== null &&
181
+ typeof parsed === 'object' &&
182
+ !Array.isArray(parsed)) {
183
+ const obj = parsed;
184
+ if (Array.isArray(obj['teams']))
185
+ parsed = obj['teams'];
186
+ }
187
+ if (Array.isArray(parsed) && parsed.length > 0) {
188
+ // Prefer an entry explicitly marked active.
189
+ for (const item of parsed) {
190
+ if (item !== null && typeof item === 'object') {
191
+ const t = item;
192
+ if (t['active'] === true && typeof t['name'] === 'string') {
193
+ return t['name'];
194
+ }
195
+ }
196
+ }
197
+ // Fall back to the first entry.
198
+ const first = parsed[0];
199
+ if (first !== null && typeof first === 'object') {
200
+ const t = first;
201
+ if (typeof t['name'] === 'string')
202
+ return t['name'];
203
+ if (typeof t['slug'] === 'string')
204
+ return t['slug'];
205
+ }
206
+ }
207
+ }
208
+ catch {
209
+ // Malformed JSON — do not fall through to the text heuristic.
210
+ }
211
+ // JSON-shaped input is handled exclusively above; never run the text
212
+ // heuristic on it (avoids returning a raw JSON blob as a team name).
213
+ return null;
214
+ }
215
+ // ── Human-text heuristic ──────────────────────────────────────────────────
216
+ // Phantom team list typically renders a table:
217
+ // NAME ROLE STATUS
218
+ // my-team admin active
219
+ // other-team member -
220
+ //
221
+ // Strategy: skip header, extract first token from lines that contain "active".
222
+ const lines = trimmed.split('\n');
223
+ let firstCandidate = null;
224
+ for (const rawLine of lines) {
225
+ const line = rawLine.trim();
226
+ if (!line)
227
+ continue;
228
+ // Skip obvious header lines.
229
+ const lc = line.toLowerCase();
230
+ if (lc.startsWith('name') && (lc.includes('role') || lc.includes('status')))
231
+ continue;
232
+ if (lc.startsWith('error') || lc.startsWith('!'))
233
+ continue;
234
+ const token = line.split(/\s+/)[0];
235
+ if (!token || token.length === 0)
236
+ continue;
237
+ if (firstCandidate === null)
238
+ firstCandidate = token;
239
+ if (lc.includes('active'))
240
+ return token;
241
+ }
242
+ return firstCandidate;
243
+ }
244
+ /**
245
+ * Parse `phantom cloud status [--json]` for a tier/plan name.
246
+ *
247
+ * Phantom may include tier in cloud status:
248
+ * JSON: { "tier": "pro", ... } / { "plan": "free", ... }
249
+ * Text: typically not surfaced — we return null unless JSON provides it.
250
+ */
251
+ function parseTier(raw) {
252
+ const trimmed = raw.trim();
253
+ if (!trimmed.startsWith('{'))
254
+ return null;
255
+ try {
256
+ const parsed = JSON.parse(trimmed);
257
+ for (const key of ['tier', 'plan', 'subscription']) {
258
+ if (typeof parsed[key] === 'string' && parsed[key].length > 0) {
259
+ return parsed[key];
260
+ }
261
+ }
262
+ // Nested: { "account": { "tier": "pro" } }
263
+ for (const containerKey of ['account', 'profile']) {
264
+ const container = parsed[containerKey];
265
+ if (container !== null && typeof container === 'object') {
266
+ const inner = container;
267
+ for (const key of ['tier', 'plan', 'subscription']) {
268
+ if (typeof inner[key] === 'string' && inner[key].length > 0) {
269
+ return inner[key];
270
+ }
271
+ }
272
+ }
273
+ }
274
+ }
275
+ catch {
276
+ // Not JSON or parse failed — no tier.
277
+ }
278
+ return null;
279
+ }
280
+ // ---------------------------------------------------------------------------
281
+ // Public API
282
+ // ---------------------------------------------------------------------------
283
+ /**
284
+ * Returns a read-only identity snapshot derived from the `phantom` CLI.
285
+ *
286
+ * Guarantees:
287
+ * - NEVER throws.
288
+ * - NEVER returns secret values — names/status only.
289
+ * - Degrades to {loggedIn:false, user:null, tier:null, team:null} when
290
+ * phantom is absent, not logged in, or returns unexpected output.
291
+ * - Each probe call is bounded by TIMEOUT_MS (4 s).
292
+ *
293
+ * Probe sequence:
294
+ * 1. `phantom cloud status --json` — login state + user + tier. A spawn
295
+ * error here (phantom absent) degrades to {loggedIn:false,...}.
296
+ * 2. `phantom team list --json` — team name (only when logged in).
297
+ */
298
+ export function getIdentity() {
299
+ const notLoggedIn = {
300
+ loggedIn: false,
301
+ user: null,
302
+ tier: null,
303
+ team: null,
304
+ };
305
+ // ── 1. Cloud status: login state + user + tier ────────────────────────────
306
+ //
307
+ // The first probe is `phantom cloud status` itself — a spawn error here
308
+ // (ENOENT when phantom is absent) degrades to notLoggedIn below, so no
309
+ // separate `--version` presence check is needed.
310
+ //
311
+ //
312
+ // Try --json first; fall back to plain text. Both paths go through the
313
+ // same parser which handles JSON then falls back to human-text heuristic.
314
+ let loggedIn = false;
315
+ let user = null;
316
+ let tier = null;
317
+ {
318
+ // First attempt: structured JSON output.
319
+ const { stdout: jsonOut, error: jsonErr } = runPhantom(['cloud', 'status', '--json']);
320
+ if (jsonErr === undefined && jsonOut.trim().length > 0) {
321
+ const parsed = parseCloudStatus(jsonOut);
322
+ loggedIn = parsed.loggedIn;
323
+ user = parsed.user;
324
+ tier = parseTier(jsonOut);
325
+ }
326
+ // If JSON probe gave nothing useful, try plain text.
327
+ if (!loggedIn && jsonErr !== undefined) {
328
+ const { stdout: txtOut, stderr: txtErr } = runPhantom(['cloud', 'status']);
329
+ const combined = txtOut + txtErr;
330
+ if (combined.trim().length > 0) {
331
+ const parsed = parseCloudStatus(combined);
332
+ loggedIn = parsed.loggedIn;
333
+ user = parsed.user;
334
+ // Tier not available from plain text — stays null.
335
+ }
336
+ }
337
+ }
338
+ // Not logged in — return early without probing team.
339
+ if (!loggedIn) {
340
+ return notLoggedIn;
341
+ }
342
+ // ── 2. Team name (only when logged in) ────────────────────────────────────
343
+ let team = null;
344
+ {
345
+ const { stdout: jsonOut, error: jsonErr } = runPhantom(['team', 'list', '--json']);
346
+ if (jsonErr === undefined && jsonOut.trim().length > 0) {
347
+ team = parseTeamName(jsonOut);
348
+ }
349
+ // Fallback: plain text team list.
350
+ if (team === null && jsonErr !== undefined) {
351
+ const { stdout: txtOut } = runPhantom(['team', 'list']);
352
+ if (txtOut.trim().length > 0) {
353
+ team = parseTeamName(txtOut);
354
+ }
355
+ }
356
+ }
357
+ return { loggedIn, user, tier, team };
358
+ }
359
+ //# sourceMappingURL=identity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"identity.js","sourceRoot":"","sources":["../../../src/core/integrations/identity.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * M18 — notify.ts
3
+ *
4
+ * Sends a concise completion summary to configured webhook(s).
5
+ *
6
+ * CONTRACT GUARANTEES:
7
+ * - STRICT NO-OP (returns false, zero network calls) when no webhook is set.
8
+ * - Never throws — all errors are caught and returned as false.
9
+ * - Never includes secret values in the posted payload; the `text` arg is a
10
+ * caller-provided summary string; callers MUST NOT pass secrets in it.
11
+ * - Bounded timeout (5 s) on every fetch to avoid hanging the CLI.
12
+ * - Posts to Slack and/or Discord independently; partial success returns true
13
+ * when at least one webhook succeeds.
14
+ */
15
+ import type { AshlrConfig } from '../types.js';
16
+ /**
17
+ * Post `text` to each configured webhook in `cfg.notify`.
18
+ *
19
+ * Returns true when at least one webhook received a 2xx response.
20
+ * Returns false (no network call) when no webhook is configured.
21
+ * Never throws.
22
+ */
23
+ export declare function notify(text: string, cfg: AshlrConfig): Promise<boolean>;
@@ -0,0 +1,96 @@
1
+ /**
2
+ * M18 — notify.ts
3
+ *
4
+ * Sends a concise completion summary to configured webhook(s).
5
+ *
6
+ * CONTRACT GUARANTEES:
7
+ * - STRICT NO-OP (returns false, zero network calls) when no webhook is set.
8
+ * - Never throws — all errors are caught and returned as false.
9
+ * - Never includes secret values in the posted payload; the `text` arg is a
10
+ * caller-provided summary string; callers MUST NOT pass secrets in it.
11
+ * - Bounded timeout (5 s) on every fetch to avoid hanging the CLI.
12
+ * - Posts to Slack and/or Discord independently; partial success returns true
13
+ * when at least one webhook succeeds.
14
+ */
15
+ /** Timeout in milliseconds for each webhook POST. */
16
+ const FETCH_TIMEOUT_MS = 5_000;
17
+ /**
18
+ * Post `text` to each configured webhook in `cfg.notify`.
19
+ *
20
+ * Returns true when at least one webhook received a 2xx response.
21
+ * Returns false (no network call) when no webhook is configured.
22
+ * Never throws.
23
+ */
24
+ export async function notify(text, cfg) {
25
+ const slack = cfg.notify?.slackWebhook;
26
+ const discord = cfg.notify?.discordWebhook;
27
+ // Strict no-op when nothing is configured.
28
+ if (!slack && !discord) {
29
+ return false;
30
+ }
31
+ const results = await Promise.all([
32
+ slack ? postSlack(slack, text) : Promise.resolve(false),
33
+ discord ? postDiscord(discord, text) : Promise.resolve(false),
34
+ ]);
35
+ return results.some(Boolean);
36
+ }
37
+ // ---------------------------------------------------------------------------
38
+ // Internal helpers — one per webhook flavour
39
+ // ---------------------------------------------------------------------------
40
+ /**
41
+ * POST to a Slack incoming-webhook URL.
42
+ * Slack expects `{ "text": "..." }`.
43
+ * Returns true on HTTP 2xx; false on any error.
44
+ */
45
+ async function postSlack(url, text) {
46
+ try {
47
+ const controller = new AbortController();
48
+ const timer = setTimeout(() => controller.abort(), FETCH_TIMEOUT_MS);
49
+ try {
50
+ const res = await fetch(url, {
51
+ method: 'POST',
52
+ headers: { 'Content-Type': 'application/json' },
53
+ body: JSON.stringify({ text }),
54
+ signal: controller.signal,
55
+ });
56
+ return res.ok;
57
+ }
58
+ finally {
59
+ clearTimeout(timer);
60
+ }
61
+ }
62
+ catch {
63
+ // Network error, timeout, or invalid URL — degrade silently.
64
+ return false;
65
+ }
66
+ }
67
+ /**
68
+ * POST to a Discord webhook URL.
69
+ * Discord expects `{ "content": "..." }`.
70
+ * Returns true on HTTP 2xx (Discord returns 204 No Content on success);
71
+ * false on any error.
72
+ */
73
+ async function postDiscord(url, text) {
74
+ try {
75
+ const controller = new AbortController();
76
+ const timer = setTimeout(() => controller.abort(), FETCH_TIMEOUT_MS);
77
+ try {
78
+ const res = await fetch(url, {
79
+ method: 'POST',
80
+ headers: { 'Content-Type': 'application/json' },
81
+ body: JSON.stringify({ content: text }),
82
+ signal: controller.signal,
83
+ });
84
+ // Discord returns 204 on success; treat any 2xx as ok.
85
+ return res.ok;
86
+ }
87
+ finally {
88
+ clearTimeout(timer);
89
+ }
90
+ }
91
+ catch {
92
+ // Network error, timeout, or invalid URL — degrade silently.
93
+ return false;
94
+ }
95
+ }
96
+ //# sourceMappingURL=notify.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notify.js","sourceRoot":"","sources":["../../../src/core/integrations/notify.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAIH,qDAAqD;AACrD,MAAM,gBAAgB,GAAG,KAAK,CAAC;AAE/B;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,IAAY,EAAE,GAAgB;IACzD,MAAM,KAAK,GAAG,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC;IACvC,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC;IAE3C,2CAA2C;IAC3C,IAAI,CAAC,KAAK,IAAI,CAAC,OAAO,EAAE,CAAC;QACvB,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QAChC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC;QACvD,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC;KAC9D,CAAC,CAAC;IAEH,OAAO,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AAC/B,CAAC;AAED,8EAA8E;AAC9E,6CAA6C;AAC7C,8EAA8E;AAE9E;;;;GAIG;AACH,KAAK,UAAU,SAAS,CAAC,GAAW,EAAE,IAAY;IAChD,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,gBAAgB,CAAC,CAAC;QACrE,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;gBAC3B,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;gBAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,CAAC;gBAC9B,MAAM,EAAE,UAAU,CAAC,MAAM;aAC1B,CAAC,CAAC;YACH,OAAO,GAAG,CAAC,EAAE,CAAC;QAChB,CAAC;gBAAS,CAAC;YACT,YAAY,CAAC,KAAK,CAAC,CAAC;QACtB,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,6DAA6D;QAC7D,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,KAAK,UAAU,WAAW,CAAC,GAAW,EAAE,IAAY;IAClD,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,gBAAgB,CAAC,CAAC;QACrE,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;gBAC3B,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;gBAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;gBACvC,MAAM,EAAE,UAAU,CAAC,MAAM;aAC1B,CAAC,CAAC;YACH,uDAAuD;YACvD,OAAO,GAAG,CAAC,EAAE,CAAC;QAChB,CAAC;gBAAS,CAAC;YACT,YAAY,CAAC,KAAK,CAAC,CAAC;QACtB,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,6DAA6D;QAC7D,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * core/integrations/vercel.ts — Read-only Vercel project status via the
3
+ * `vercel` CLI.
4
+ *
5
+ * RULES:
6
+ * - READ-ONLY. Deploying stays in `ashlr ship` (already --confirm gated).
7
+ * - NEVER throws. Every exported function degrades gracefully on any
8
+ * failure (CLI absent, not authed, not linked, malformed output).
9
+ * - Uses the installed `vercel` CLI — no raw tokens are read, stored,
10
+ * logged, or printed.
11
+ * - spawnSync only (no shell prevents shell injection).
12
+ * - Bounded timeouts so a slow/hung CLI never blocks the caller.
13
+ */
14
+ import type { VercelStatus } from '../types.js';
15
+ /** A single deployment summary (read-only). */
16
+ export interface DeploySummary {
17
+ /** The deployment URL (e.g. my-app-abc123.vercel.app). */
18
+ url: string;
19
+ /** Build/deployment state (e.g. READY, BUILDING, ERROR, CANCELED). */
20
+ state: string;
21
+ /** ISO-8601 creation timestamp, or null when unavailable. */
22
+ createdAt: string | null;
23
+ /** Deployment target: "production" | "preview" | null. */
24
+ target: string | null;
25
+ }
26
+ /**
27
+ * Read-only linked-project snapshot via the `vercel` CLI.
28
+ * NEVER throws — degrades to `{ linked: false, latestState: null, url: null }`
29
+ * on any failure (CLI absent, not authed, not linked, scope prompt, timeout).
30
+ */
31
+ export declare function vercelStatus(cwd: string): VercelStatus;
32
+ /**
33
+ * List recent deployments for the Vercel project linked to `cwd`.
34
+ * NEVER throws — returns [] on any failure (CLI absent, not authed, not
35
+ * linked, malformed output, timeout).
36
+ */
37
+ export declare function listDeploys(cwd: string): DeploySummary[];