@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,216 @@
1
+ /**
2
+ * core/integrations/editors.ts — Editor MCP gateway wiring (M18).
3
+ *
4
+ * detectEditors(): detect which of claude / codex / cursor are present by
5
+ * their config directories or files.
6
+ *
7
+ * wireEditor(target, opts): wire the ashlr MCP gateway entry into one editor's
8
+ * mcpServers config, reusing the M3 install pattern (backup-first, deep-merge,
9
+ * idempotent, never clobbers existing servers). LOCAL only. `opts.configPath`
10
+ * overrides the default path so tests can run against TEMP files.
11
+ *
12
+ * SAFETY RULES (matching M3 contract):
13
+ * - Parse the config file FIRST; abort without writing on malformed JSON.
14
+ * - Backup (.bak) ONLY after a clean parse.
15
+ * - Idempotent: re-running when the entry is already present is a no-op.
16
+ * - Never clobber other mcpServers entries or other top-level config keys.
17
+ * - Never throws — all errors are caught and returned as {ok:false, detail}.
18
+ * - LOCAL only: writes only the target editor's config file.
19
+ *
20
+ * Genome note: ~/.ashlr already serves as the genome store; no extra wiring
21
+ * is needed here — the mcpServers entry is sufficient for the gateway.
22
+ */
23
+ import { readFileSync, writeFileSync, existsSync, copyFileSync, mkdirSync } from 'node:fs';
24
+ import { homedir } from 'node:os';
25
+ import { join, dirname } from 'node:path';
26
+ // ---------------------------------------------------------------------------
27
+ // Editor config paths
28
+ // ---------------------------------------------------------------------------
29
+ const HOME = homedir();
30
+ /**
31
+ * Default config file paths for each supported editor target.
32
+ * Claude Code: ~/.claude/settings.json (preferred; falls back to ~/.claude.json)
33
+ * Codex: ~/.codex/config.json
34
+ * Cursor: ~/.cursor/mcp.json
35
+ */
36
+ const DEFAULT_CONFIG_PATHS = {
37
+ claude: join(HOME, '.claude', 'settings.json'),
38
+ codex: join(HOME, '.codex', 'config.json'),
39
+ cursor: join(HOME, '.cursor', 'mcp.json'),
40
+ };
41
+ /**
42
+ * Config directory presence checks for detectEditors.
43
+ * An editor is "detected" if its primary config directory (or file) exists.
44
+ */
45
+ const DETECTION_PATHS = {
46
+ claude: [join(HOME, '.claude'), join(HOME, '.claude.json')],
47
+ codex: [join(HOME, '.codex')],
48
+ cursor: [join(HOME, '.cursor')],
49
+ };
50
+ // ---------------------------------------------------------------------------
51
+ // Sentinel for malformed JSON (matches M3 pattern)
52
+ // ---------------------------------------------------------------------------
53
+ class ConfigParseError extends Error {
54
+ path;
55
+ constructor(path) {
56
+ super(`config is not valid JSON: ${path}`);
57
+ this.path = path;
58
+ this.name = 'ConfigParseError';
59
+ }
60
+ }
61
+ // ---------------------------------------------------------------------------
62
+ // Internal helpers (same contract as M3)
63
+ // ---------------------------------------------------------------------------
64
+ /**
65
+ * Parse a target config file.
66
+ * - absent or empty → {} (fresh config, may safely create)
67
+ * - present + valid JSON → parsed object
68
+ * - present + unparseable JSON → throws ConfigParseError (caller must abort;
69
+ * we NEVER derive a merged write from a file we failed to parse)
70
+ */
71
+ function parseConfigFile(filePath) {
72
+ if (!existsSync(filePath))
73
+ return {};
74
+ const raw = readFileSync(filePath, 'utf8').trim();
75
+ if (!raw)
76
+ return {};
77
+ try {
78
+ return JSON.parse(raw);
79
+ }
80
+ catch {
81
+ throw new ConfigParseError(filePath);
82
+ }
83
+ }
84
+ /**
85
+ * Backup a config file to <path>.bak.
86
+ * If a .bak already exists, rotate it to <path>.bak.<timestamp> first so a
87
+ * second run never destroys an earlier backup (best-effort; never blocks write).
88
+ */
89
+ function backupConfig(configPath) {
90
+ const bakPath = configPath + '.bak';
91
+ if (existsSync(bakPath)) {
92
+ try {
93
+ copyFileSync(bakPath, `${bakPath}.${Date.now()}`);
94
+ }
95
+ catch {
96
+ // Best-effort — never block on backup-of-backup failure.
97
+ }
98
+ }
99
+ copyFileSync(configPath, bakPath);
100
+ }
101
+ // ---------------------------------------------------------------------------
102
+ // Public API
103
+ // ---------------------------------------------------------------------------
104
+ /**
105
+ * Detect which editors are installed on this machine by checking for the
106
+ * presence of their primary config directory or config file.
107
+ *
108
+ * Returns a subset of ['claude', 'codex', 'cursor'].
109
+ * Never throws.
110
+ */
111
+ export function detectEditors() {
112
+ const detected = [];
113
+ const targets = ['claude', 'codex', 'cursor'];
114
+ for (const target of targets) {
115
+ const paths = DETECTION_PATHS[target];
116
+ const found = paths.some(p => existsSync(p));
117
+ if (found) {
118
+ detected.push(target);
119
+ }
120
+ }
121
+ return detected;
122
+ }
123
+ /**
124
+ * Wire the ashlr MCP gateway into one editor's mcpServers config.
125
+ *
126
+ * Follows the M3 install pattern exactly:
127
+ * 1. Parse FIRST — abort without any write if config is malformed JSON.
128
+ * 2. Backup (.bak) after a clean parse, only if the file exists.
129
+ * 3. Idempotency — if the "ashlr" entry already matches, return ok without writing.
130
+ * 4. Deep-merge — spread existing config + mcpServers, add/update only "ashlr".
131
+ * 5. Write the merged result as pretty-printed JSON.
132
+ *
133
+ * @param target - Editor to wire: 'claude' | 'codex' | 'cursor'
134
+ * @param opts.configPath - Override the default config path (use a TEMP path in tests).
135
+ * @returns { ok: boolean; detail: string } — never throws.
136
+ */
137
+ export async function wireEditor(target, opts) {
138
+ const configPath = opts.configPath ?? DEFAULT_CONFIG_PATHS[target];
139
+ // The gateway entry we install — command via PATH so any editor resolves it.
140
+ const gatewayEntry = {
141
+ command: 'ashlr',
142
+ args: ['mcp'],
143
+ };
144
+ // ── 1. Parse FIRST — abort on malformed input, before any write/backup ────
145
+ let existing;
146
+ try {
147
+ existing = parseConfigFile(configPath);
148
+ }
149
+ catch (err) {
150
+ if (err instanceof ConfigParseError) {
151
+ return {
152
+ ok: false,
153
+ detail: `refusing to write: ${configPath} is not valid JSON; restore it or pass a clean configPath.`,
154
+ };
155
+ }
156
+ // Unexpected read error (permissions, etc.)
157
+ const msg = err instanceof Error ? err.message : String(err);
158
+ return { ok: false, detail: `failed to read config: ${msg}` };
159
+ }
160
+ // ── 2. Backup (only after a clean parse, only if file exists) ─────────────
161
+ if (existsSync(configPath)) {
162
+ try {
163
+ backupConfig(configPath);
164
+ }
165
+ catch (err) {
166
+ const msg = err instanceof Error ? err.message : String(err);
167
+ return { ok: false, detail: `backup failed: ${msg}` };
168
+ }
169
+ }
170
+ else {
171
+ // Ensure the parent directory exists so the write succeeds.
172
+ try {
173
+ mkdirSync(dirname(configPath), { recursive: true });
174
+ }
175
+ catch (err) {
176
+ const msg = err instanceof Error ? err.message : String(err);
177
+ return { ok: false, detail: `could not create config directory: ${msg}` };
178
+ }
179
+ }
180
+ // ── 3. Idempotency check ───────────────────────────────────────────────────
181
+ const existingServers = existing.mcpServers ?? {};
182
+ const existingEntry = existingServers['ashlr'];
183
+ if (existingEntry) {
184
+ const same = existingEntry.command === gatewayEntry.command &&
185
+ JSON.stringify(existingEntry.args ?? []) === JSON.stringify(gatewayEntry.args ?? []);
186
+ if (same) {
187
+ return {
188
+ ok: true,
189
+ detail: `already wired — no changes needed (${configPath})`,
190
+ };
191
+ }
192
+ // Entry exists but differs — will update below.
193
+ }
194
+ // ── 4. Deep-merge: add/update "ashlr" key only, preserve all others ───────
195
+ const merged = {
196
+ ...existing,
197
+ mcpServers: {
198
+ ...existingServers,
199
+ ashlr: gatewayEntry,
200
+ },
201
+ };
202
+ // ── 5. Write ───────────────────────────────────────────────────────────────
203
+ try {
204
+ writeFileSync(configPath, JSON.stringify(merged, null, 2) + '\n', 'utf8');
205
+ }
206
+ catch (err) {
207
+ const msg = err instanceof Error ? err.message : String(err);
208
+ return { ok: false, detail: `write failed: ${msg}` };
209
+ }
210
+ const action = existingEntry ? 'updated' : 'wired';
211
+ return {
212
+ ok: true,
213
+ detail: `${action} ashlr gateway → ${configPath}`,
214
+ };
215
+ }
216
+ //# sourceMappingURL=editors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"editors.js","sourceRoot":"","sources":["../../../src/core/integrations/editors.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,66 @@
1
+ /**
2
+ * core/integrations/github.ts — GitHub integration via the `gh` CLI.
3
+ *
4
+ * RULES:
5
+ * - READ-FIRST: githubStatus, listPrs, listIssues are read-only and NEVER throw.
6
+ * On any failure (gh missing, not authed, not a repo, malformed output) they
7
+ * return a safe empty/degraded shape.
8
+ * - NEVER handle, read, log, or print raw tokens. `gh` owns its own auth.
9
+ * - createPr is EXPLICIT + MUTATING. The CLI layer (cli/gh.ts) MUST gate it
10
+ * behind an explicit `ashlr gh pr create` + confirmation prompt before calling.
11
+ * - All spawns use spawnSync (no shell) with a tight timeout.
12
+ */
13
+ import type { GithubStatus } from '../types.js';
14
+ /** A single PR summary (read-only list). */
15
+ export interface PrSummary {
16
+ number: number;
17
+ title: string;
18
+ url: string;
19
+ state: string;
20
+ author: string;
21
+ }
22
+ /** A single issue summary (read-only list). */
23
+ export interface IssueSummary {
24
+ number: number;
25
+ title: string;
26
+ url: string;
27
+ state: string;
28
+ author: string;
29
+ }
30
+ /** Options for creating a PR (EXPLICIT mutation only). */
31
+ export interface CreatePrOpts {
32
+ title: string;
33
+ body?: string;
34
+ base?: string;
35
+ head?: string;
36
+ draft?: boolean;
37
+ }
38
+ /** Result of a PR creation (EXPLICIT mutation only). */
39
+ export interface CreatePrResult {
40
+ ok: boolean;
41
+ url: string | null;
42
+ detail: string;
43
+ }
44
+ /**
45
+ * Read-only repo snapshot via `gh`. NEVER throws — degrades to a not-a-repo
46
+ * shape when cwd is not a GitHub repo or gh is unavailable / not authed.
47
+ */
48
+ export declare function githubStatus(cwd: string): GithubStatus;
49
+ /**
50
+ * List open PRs via `gh pr list`. NEVER throws — returns [] on any failure.
51
+ */
52
+ export declare function listPrs(cwd: string): PrSummary[];
53
+ /**
54
+ * List open issues via `gh issue list`. NEVER throws — returns [] on any failure.
55
+ */
56
+ export declare function listIssues(cwd: string): IssueSummary[];
57
+ /**
58
+ * EXPLICIT, MUTATING. Creates a PR via `gh pr create`.
59
+ *
60
+ * The CLI layer (cli/gh.ts) MUST gate this behind an explicit
61
+ * `ashlr gh pr create` command + confirmation prompt — NEVER call this
62
+ * automatically or from any read/status path.
63
+ *
64
+ * May reject on hard failures; ok:false + detail describes the error.
65
+ */
66
+ export declare function createPr(cwd: string, opts: CreatePrOpts): Promise<CreatePrResult>;
@@ -0,0 +1,332 @@
1
+ /**
2
+ * core/integrations/github.ts — GitHub integration via the `gh` CLI.
3
+ *
4
+ * RULES:
5
+ * - READ-FIRST: githubStatus, listPrs, listIssues are read-only and NEVER throw.
6
+ * On any failure (gh missing, not authed, not a repo, malformed output) they
7
+ * return a safe empty/degraded shape.
8
+ * - NEVER handle, read, log, or print raw tokens. `gh` owns its own auth.
9
+ * - createPr is EXPLICIT + MUTATING. The CLI layer (cli/gh.ts) MUST gate it
10
+ * behind an explicit `ashlr gh pr create` + confirmation prompt before calling.
11
+ * - All spawns use spawnSync (no shell) with a tight timeout.
12
+ */
13
+ import { spawnSync } from 'node:child_process';
14
+ // ---------------------------------------------------------------------------
15
+ // Constants
16
+ // ---------------------------------------------------------------------------
17
+ const GH_BIN = 'gh';
18
+ const TIMEOUT_MS = 8_000; // ms — gh can be slow on first auth check
19
+ // ---------------------------------------------------------------------------
20
+ // Internal helpers
21
+ // ---------------------------------------------------------------------------
22
+ /**
23
+ * Run a `gh` sub-command synchronously in `cwd`.
24
+ * Returns trimmed stdout on success (exit 0), or null on any error.
25
+ * NEVER throws.
26
+ */
27
+ function runGh(cwd, args) {
28
+ try {
29
+ const res = spawnSync(GH_BIN, args, {
30
+ cwd,
31
+ timeout: TIMEOUT_MS,
32
+ stdio: 'pipe',
33
+ encoding: 'utf8',
34
+ // Suppress interactive prompts; gh is already authed via its own config.
35
+ env: {
36
+ ...process.env,
37
+ GH_NO_UPDATE_NOTIFIER: '1',
38
+ NO_COLOR: '1',
39
+ },
40
+ });
41
+ // spawn error (e.g. ENOENT — gh not on PATH) or non-zero exit → null.
42
+ if (res.error)
43
+ return null;
44
+ if (res.status !== 0)
45
+ return null;
46
+ return typeof res.stdout === 'string' ? res.stdout.trim() : null;
47
+ }
48
+ catch {
49
+ return null;
50
+ }
51
+ }
52
+ /**
53
+ * Parse a JSON string safely. Returns null on any parse error.
54
+ */
55
+ function safeJson(raw) {
56
+ if (!raw)
57
+ return null;
58
+ try {
59
+ return JSON.parse(raw);
60
+ }
61
+ catch {
62
+ return null;
63
+ }
64
+ }
65
+ /**
66
+ * Determine CI status from the most recent workflow runs in cwd.
67
+ * Uses `gh run list --limit 5 --json status,conclusion` and aggregates:
68
+ * - any 'in_progress' / 'queued' / 'waiting' → 'pending'
69
+ * - any 'failure' / 'cancelled' / 'timed_out' → 'failing'
70
+ * - all 'success' / 'skipped' / 'neutral' → 'passing'
71
+ * - no runs found → 'none'
72
+ * NEVER throws.
73
+ */
74
+ function resolveCiStatus(cwd) {
75
+ const raw = runGh(cwd, [
76
+ 'run',
77
+ 'list',
78
+ '--limit',
79
+ '5',
80
+ '--json',
81
+ 'status,conclusion',
82
+ ]);
83
+ const parsed = safeJson(raw);
84
+ if (!Array.isArray(parsed) || parsed.length === 0)
85
+ return 'none';
86
+ const runs = parsed;
87
+ const IN_PROGRESS_STATUSES = new Set([
88
+ 'in_progress',
89
+ 'queued',
90
+ 'waiting',
91
+ 'requested',
92
+ 'pending',
93
+ ]);
94
+ const FAILURE_CONCLUSIONS = new Set([
95
+ 'failure',
96
+ 'cancelled',
97
+ 'timed_out',
98
+ 'action_required',
99
+ 'startup_failure',
100
+ ]);
101
+ const SUCCESS_CONCLUSIONS = new Set(['success', 'skipped', 'neutral']);
102
+ for (const run of runs) {
103
+ const status = (run.status ?? '').toLowerCase();
104
+ const conclusion = (run.conclusion ?? '').toLowerCase();
105
+ if (IN_PROGRESS_STATUSES.has(status))
106
+ return 'pending';
107
+ if (FAILURE_CONCLUSIONS.has(conclusion))
108
+ return 'failing';
109
+ // completed with non-success conclusion is also failing
110
+ if (status === 'completed' && conclusion && !SUCCESS_CONCLUSIONS.has(conclusion)) {
111
+ return 'failing';
112
+ }
113
+ }
114
+ // If we get here all completed runs were success/skipped/neutral
115
+ return 'passing';
116
+ }
117
+ // ---------------------------------------------------------------------------
118
+ // Public API — READ-ONLY (never throw)
119
+ // ---------------------------------------------------------------------------
120
+ /**
121
+ * Read-only repo snapshot via `gh`. NEVER throws — degrades to a not-a-repo
122
+ * shape when cwd is not a GitHub repo or gh is unavailable / not authed.
123
+ */
124
+ export function githubStatus(cwd) {
125
+ const NOT_A_REPO = {
126
+ isRepo: false,
127
+ openPrs: 0,
128
+ openIssues: 0,
129
+ ci: 'none',
130
+ repo: null,
131
+ };
132
+ // ── 1. Confirm it's a GitHub repo ────────────────────────────────────────
133
+ const repoRaw = runGh(cwd, ['repo', 'view', '--json', 'nameWithOwner']);
134
+ if (!repoRaw)
135
+ return NOT_A_REPO;
136
+ const repoParsed = safeJson(repoRaw);
137
+ if (repoParsed === null ||
138
+ typeof repoParsed !== 'object' ||
139
+ Array.isArray(repoParsed)) {
140
+ return NOT_A_REPO;
141
+ }
142
+ const repoObj = repoParsed;
143
+ const repoSlug = typeof repoObj['nameWithOwner'] === 'string'
144
+ ? repoObj['nameWithOwner']
145
+ : null;
146
+ if (!repoSlug)
147
+ return NOT_A_REPO;
148
+ // ── 2. Open PR count ─────────────────────────────────────────────────────
149
+ let openPrs = 0;
150
+ {
151
+ const raw = runGh(cwd, [
152
+ 'pr',
153
+ 'list',
154
+ '--state',
155
+ 'open',
156
+ '--json',
157
+ 'number',
158
+ ]);
159
+ const parsed = safeJson(raw);
160
+ if (Array.isArray(parsed))
161
+ openPrs = parsed.length;
162
+ }
163
+ // ── 3. Open issue count ──────────────────────────────────────────────────
164
+ let openIssues = 0;
165
+ {
166
+ const raw = runGh(cwd, [
167
+ 'issue',
168
+ 'list',
169
+ '--state',
170
+ 'open',
171
+ '--json',
172
+ 'number',
173
+ ]);
174
+ const parsed = safeJson(raw);
175
+ if (Array.isArray(parsed))
176
+ openIssues = parsed.length;
177
+ }
178
+ // ── 4. CI status ─────────────────────────────────────────────────────────
179
+ const ci = resolveCiStatus(cwd);
180
+ return {
181
+ isRepo: true,
182
+ openPrs,
183
+ openIssues,
184
+ ci,
185
+ repo: repoSlug,
186
+ };
187
+ }
188
+ /**
189
+ * List open PRs via `gh pr list`. NEVER throws — returns [] on any failure.
190
+ */
191
+ export function listPrs(cwd) {
192
+ const raw = runGh(cwd, [
193
+ 'pr',
194
+ 'list',
195
+ '--state',
196
+ 'open',
197
+ '--json',
198
+ 'number,title,url,state,author',
199
+ ]);
200
+ const parsed = safeJson(raw);
201
+ if (!Array.isArray(parsed))
202
+ return [];
203
+ const results = [];
204
+ for (const item of parsed) {
205
+ if (item === null || typeof item !== 'object' || Array.isArray(item))
206
+ continue;
207
+ const obj = item;
208
+ const number = typeof obj['number'] === 'number' ? obj['number'] : 0;
209
+ const title = typeof obj['title'] === 'string' ? obj['title'] : '';
210
+ const url = typeof obj['url'] === 'string' ? obj['url'] : '';
211
+ const state = typeof obj['state'] === 'string' ? obj['state'] : '';
212
+ // author is a nested { login: string } object in gh's JSON output
213
+ let author = '';
214
+ if (obj['author'] !== null && typeof obj['author'] === 'object') {
215
+ const a = obj['author'];
216
+ if (typeof a['login'] === 'string')
217
+ author = a['login'];
218
+ }
219
+ else if (typeof obj['author'] === 'string') {
220
+ author = obj['author'];
221
+ }
222
+ results.push({ number, title, url, state, author });
223
+ }
224
+ return results;
225
+ }
226
+ /**
227
+ * List open issues via `gh issue list`. NEVER throws — returns [] on any failure.
228
+ */
229
+ export function listIssues(cwd) {
230
+ const raw = runGh(cwd, [
231
+ 'issue',
232
+ 'list',
233
+ '--state',
234
+ 'open',
235
+ '--json',
236
+ 'number,title,url,state,author',
237
+ ]);
238
+ const parsed = safeJson(raw);
239
+ if (!Array.isArray(parsed))
240
+ return [];
241
+ const results = [];
242
+ for (const item of parsed) {
243
+ if (item === null || typeof item !== 'object' || Array.isArray(item))
244
+ continue;
245
+ const obj = item;
246
+ const number = typeof obj['number'] === 'number' ? obj['number'] : 0;
247
+ const title = typeof obj['title'] === 'string' ? obj['title'] : '';
248
+ const url = typeof obj['url'] === 'string' ? obj['url'] : '';
249
+ const state = typeof obj['state'] === 'string' ? obj['state'] : '';
250
+ let author = '';
251
+ if (obj['author'] !== null && typeof obj['author'] === 'object') {
252
+ const a = obj['author'];
253
+ if (typeof a['login'] === 'string')
254
+ author = a['login'];
255
+ }
256
+ else if (typeof obj['author'] === 'string') {
257
+ author = obj['author'];
258
+ }
259
+ results.push({ number, title, url, state, author });
260
+ }
261
+ return results;
262
+ }
263
+ // ---------------------------------------------------------------------------
264
+ // Public API — EXPLICIT MUTATION (caller must gate behind confirm)
265
+ // ---------------------------------------------------------------------------
266
+ /**
267
+ * EXPLICIT, MUTATING. Creates a PR via `gh pr create`.
268
+ *
269
+ * The CLI layer (cli/gh.ts) MUST gate this behind an explicit
270
+ * `ashlr gh pr create` command + confirmation prompt — NEVER call this
271
+ * automatically or from any read/status path.
272
+ *
273
+ * May reject on hard failures; ok:false + detail describes the error.
274
+ */
275
+ export async function createPr(cwd, opts) {
276
+ const args = ['pr', 'create', '--title', opts.title];
277
+ if (opts.body) {
278
+ args.push('--body', opts.body);
279
+ }
280
+ else {
281
+ // gh pr create requires --body or --fill; use --fill to generate from commits
282
+ args.push('--fill');
283
+ }
284
+ if (opts.base)
285
+ args.push('--base', opts.base);
286
+ if (opts.head)
287
+ args.push('--head', opts.head);
288
+ if (opts.draft)
289
+ args.push('--draft');
290
+ // NOTE: `gh pr create` does NOT support `--json` (only `gh pr list/view` do).
291
+ // On success it prints the created PR URL as plain text on stdout, which we
292
+ // parse below. Passing `--json` here would make gh exit non-zero on every run.
293
+ try {
294
+ const res = spawnSync(GH_BIN, args, {
295
+ cwd,
296
+ timeout: 30_000, // network operation — allow more time
297
+ stdio: 'pipe',
298
+ encoding: 'utf8',
299
+ env: {
300
+ ...process.env,
301
+ GH_NO_UPDATE_NOTIFIER: '1',
302
+ NO_COLOR: '1',
303
+ },
304
+ });
305
+ if (res.error) {
306
+ return { ok: false, url: null, detail: res.error.message };
307
+ }
308
+ if (res.status !== 0) {
309
+ const stderr = typeof res.stderr === 'string' ? res.stderr.trim() : '';
310
+ return { ok: false, url: null, detail: stderr || `gh pr create exited ${res.status}` };
311
+ }
312
+ const trimmed = typeof res.stdout === 'string' ? res.stdout.trim() : '';
313
+ let url = null;
314
+ // `gh pr create` prints the created PR URL as plain text on stdout. Scan
315
+ // the output for the first https:// line (gh may emit other lines first).
316
+ for (const line of trimmed.split('\n')) {
317
+ const t = line.trim();
318
+ if (t.startsWith('https://')) {
319
+ url = t;
320
+ break;
321
+ }
322
+ }
323
+ return { ok: true, url, detail: url ? `PR created: ${url}` : 'PR created' };
324
+ }
325
+ catch (err) {
326
+ const detail = err instanceof Error
327
+ ? err.message
328
+ : String(err);
329
+ return { ok: false, url: null, detail };
330
+ }
331
+ }
332
+ //# sourceMappingURL=github.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"github.js","sourceRoot":"","sources":["../../../src/core/integrations/github.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
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 type { Identity } from '../types.js';
14
+ /**
15
+ * Returns a read-only identity snapshot derived from the `phantom` CLI.
16
+ *
17
+ * Guarantees:
18
+ * - NEVER throws.
19
+ * - NEVER returns secret values — names/status only.
20
+ * - Degrades to {loggedIn:false, user:null, tier:null, team:null} when
21
+ * phantom is absent, not logged in, or returns unexpected output.
22
+ * - Each probe call is bounded by TIMEOUT_MS (4 s).
23
+ *
24
+ * Probe sequence:
25
+ * 1. `phantom cloud status --json` — login state + user + tier. A spawn
26
+ * error here (phantom absent) degrades to {loggedIn:false,...}.
27
+ * 2. `phantom team list --json` — team name (only when logged in).
28
+ */
29
+ export declare function getIdentity(): Identity;