@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 @@
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../../../src/core/learn/store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * tuning.ts — M26 PROPOSAL-ONLY routing/policy/prompt tuning suggestions.
3
+ *
4
+ * Derives tuning suggestions from a deterministic ReflectionReport and — only
5
+ * when explicitly asked — routes them to the M23 Approval Inbox as PENDING
6
+ * proposals. It NEVER auto-applies anything.
7
+ *
8
+ * HARD SAFETY INVARIANTS (M26) — paramount:
9
+ * - PROPOSAL-ONLY. The ONLY sink is the inbox via createProposal (status
10
+ * pending). There is NO code path here that writes the global config path,
11
+ * saves config, or mutates routing policy or prompts. Suggestions reason
12
+ * ABOUT routing but never change it. Each proposal is kind 'note' (a no-op
13
+ * record that, even when applied, mutates nothing).
14
+ * - DETERMINISTIC. deriveTuning() is pure over the report — no LLM, no network.
15
+ * - NO OUTWARD ACTION. Proposals sit pending; nothing is shipped or deployed.
16
+ * - BOUNDED. Caps the number of suggestions emitted.
17
+ * - NEVER THROWS. Degrades to [] / a no-op emit.
18
+ *
19
+ * METADATA ONLY — proposals carry titles + rationale grounded in metrics; never
20
+ * secret values, never raw payloads.
21
+ */
22
+ import type { Proposal, ReflectionReport, TuningProposal } from '../types.js';
23
+ /**
24
+ * Derive PROPOSAL-ONLY tuning suggestions from a ReflectionReport. Pure over
25
+ * the report; never throws; never mutates anything; makes ZERO I/O or network
26
+ * calls. Returns at most MAX_TUNING suggestions, highest-confidence first.
27
+ *
28
+ * Heuristics (deterministic, grounded in report metrics):
29
+ * - High localShare + zero cloud spend -> "raise local-first threshold".
30
+ * - A recurring failure cluster -> "add a playbook for failure Y".
31
+ * - A category succeeding ~every time -> "lower retry cap for category X".
32
+ * - A category far costlier than the fleet -> "flag over-budget category X".
33
+ * - Effectiveness regressed vs prior -> "review recent routing/policy".
34
+ *
35
+ * NOTE: every suggestion only DESCRIBES a possible change. Nothing here applies
36
+ * it — emitTuningProposals() routes them to the inbox as inert pending notes.
37
+ */
38
+ export declare function deriveTuning(report: ReflectionReport): TuningProposal[];
39
+ /**
40
+ * Convert derived TuningProposals into PENDING M23 inbox proposals via
41
+ * createProposal(). Returns the created Proposal records.
42
+ *
43
+ * GUARDRAIL: this is the ONLY outward sink for tuning. Each proposal is created
44
+ * with kind 'note' (a no-op record — applying it mutates NOTHING), origin
45
+ * 'manual', repo null, status 'pending'. There is NO path here that touches the
46
+ * global config, routing policy, or prompts. Never throws.
47
+ */
48
+ export declare function emitTuningProposals(suggestions: TuningProposal[]): Proposal[];
@@ -0,0 +1,201 @@
1
+ /**
2
+ * tuning.ts — M26 PROPOSAL-ONLY routing/policy/prompt tuning suggestions.
3
+ *
4
+ * Derives tuning suggestions from a deterministic ReflectionReport and — only
5
+ * when explicitly asked — routes them to the M23 Approval Inbox as PENDING
6
+ * proposals. It NEVER auto-applies anything.
7
+ *
8
+ * HARD SAFETY INVARIANTS (M26) — paramount:
9
+ * - PROPOSAL-ONLY. The ONLY sink is the inbox via createProposal (status
10
+ * pending). There is NO code path here that writes the global config path,
11
+ * saves config, or mutates routing policy or prompts. Suggestions reason
12
+ * ABOUT routing but never change it. Each proposal is kind 'note' (a no-op
13
+ * record that, even when applied, mutates nothing).
14
+ * - DETERMINISTIC. deriveTuning() is pure over the report — no LLM, no network.
15
+ * - NO OUTWARD ACTION. Proposals sit pending; nothing is shipped or deployed.
16
+ * - BOUNDED. Caps the number of suggestions emitted.
17
+ * - NEVER THROWS. Degrades to [] / a no-op emit.
18
+ *
19
+ * METADATA ONLY — proposals carry titles + rationale grounded in metrics; never
20
+ * secret values, never raw payloads.
21
+ */
22
+ import { createProposal } from '../inbox/store.js';
23
+ // ---------------------------------------------------------------------------
24
+ // Bounds
25
+ // ---------------------------------------------------------------------------
26
+ /** Max tuning suggestions derived/emitted per reflection. */
27
+ const MAX_TUNING = 6;
28
+ /** Minimum analyzed swarms before any quantitative heuristic fires (avoids
29
+ * drawing conclusions from a 1-2 run sample). */
30
+ const MIN_SAMPLE = 3;
31
+ /** A localShare at/above this with zero cloud spend => the org is already
32
+ * local-first; suggest raising the local-first routing threshold. */
33
+ const HIGH_LOCAL_SHARE = 0.9;
34
+ /** A failure cluster this size (or larger) is "recurring" => playbook-worthy. */
35
+ const RECURRING_FAILURE_MIN = 2;
36
+ /** A category costing at least this multiple of the fleet average looks
37
+ * over-provisioned => flag as over-budget. */
38
+ const OVER_BUDGET_MULTIPLE = 1.75;
39
+ // ---------------------------------------------------------------------------
40
+ // Pure derivation (exported for testing) — NO I/O, NO LLM, NO MUTATION
41
+ // ---------------------------------------------------------------------------
42
+ /** Round a 0..1 confidence to 2 decimals, clamped into [0,1]. */
43
+ function clampConfidence(n) {
44
+ if (!Number.isFinite(n))
45
+ return 0;
46
+ const c = Math.max(0, Math.min(1, n));
47
+ return Math.round(c * 100) / 100;
48
+ }
49
+ /**
50
+ * Derive PROPOSAL-ONLY tuning suggestions from a ReflectionReport. Pure over
51
+ * the report; never throws; never mutates anything; makes ZERO I/O or network
52
+ * calls. Returns at most MAX_TUNING suggestions, highest-confidence first.
53
+ *
54
+ * Heuristics (deterministic, grounded in report metrics):
55
+ * - High localShare + zero cloud spend -> "raise local-first threshold".
56
+ * - A recurring failure cluster -> "add a playbook for failure Y".
57
+ * - A category succeeding ~every time -> "lower retry cap for category X".
58
+ * - A category far costlier than the fleet -> "flag over-budget category X".
59
+ * - Effectiveness regressed vs prior -> "review recent routing/policy".
60
+ *
61
+ * NOTE: every suggestion only DESCRIBES a possible change. Nothing here applies
62
+ * it — emitTuningProposals() routes them to the inbox as inert pending notes.
63
+ */
64
+ export function deriveTuning(report) {
65
+ const out = [];
66
+ try {
67
+ const analyzed = report.swarmsAnalyzed | 0;
68
+ // -- 1. Routing: already local-first => suggest raising the threshold. ----
69
+ // Only when we have a real sample, the local share is dominant, and there
70
+ // was no cloud spend to justify keeping headroom for escalation.
71
+ if (analyzed >= MIN_SAMPLE &&
72
+ report.localShare >= HIGH_LOCAL_SHARE &&
73
+ report.totalCostUsd <= 0) {
74
+ const localPct = Math.round(report.localShare * 100);
75
+ out.push({
76
+ key: 'routing.local-first-threshold',
77
+ area: 'routing',
78
+ title: 'Raise the local-first routing threshold',
79
+ rationale: `${localPct}% of token usage already ran on LOCAL providers across ` +
80
+ `${analyzed} swarms with $0 cloud spend. Routing could bias even more ` +
81
+ `work to local models before escalating to cloud. (Suggestion only — ` +
82
+ `routing is not changed.)`,
83
+ // More confident the larger the sample and the higher the local share.
84
+ confidence: clampConfidence(0.4 + report.localShare * 0.4 + (Math.min(analyzed, 20) / 20) * 0.2),
85
+ });
86
+ }
87
+ // -- 2. Playbook: recurring failure clusters => suggest a playbook. -------
88
+ for (const fm of report.topFailures ?? []) {
89
+ if (fm.count < RECURRING_FAILURE_MIN)
90
+ continue;
91
+ const phases = (fm.phases ?? []).filter(Boolean);
92
+ const where = phases.length ? ` (most often in phase ${phases[0]})` : '';
93
+ out.push({
94
+ key: `playbook.failure.${fm.key}`,
95
+ area: 'playbook',
96
+ title: `Add a playbook for recurring failure: ${fm.label}`,
97
+ rationale: `"${fm.label}" recurred ${fm.count} time(s)${where}. A distilled ` +
98
+ `playbook capturing the fix would auto-inject into future agents and ` +
99
+ `reduce repeat failures.`,
100
+ // Confidence scales with how often the failure recurred (caps at 1.0).
101
+ confidence: clampConfidence(0.45 + (Math.min(fm.count, 8) / 8) * 0.45),
102
+ });
103
+ }
104
+ // -- 3/4. Per-category retry + budget heuristics. ------------------------
105
+ const cats = report.goalCategories ?? [];
106
+ const fleetAvgCost = report.avgCostUsd;
107
+ for (const cat of cats) {
108
+ // 3. A category that essentially always succeeds first-try => the retry
109
+ // cap for that kind of work is likely larger than needed.
110
+ if (cat.swarms >= MIN_SAMPLE && cat.successRate >= 1) {
111
+ out.push({
112
+ key: `policy.retry-cap.${cat.category}`,
113
+ area: 'policy',
114
+ title: `Lower the retry cap for "${cat.category}" work`,
115
+ rationale: `"${cat.category}" succeeded on ${cat.swarms}/${cat.swarms} swarms ` +
116
+ `(100%). Retries for this category may rarely fire — a lower retry ` +
117
+ `cap could cut wasted steps with little risk. (Suggestion only.)`,
118
+ confidence: clampConfidence(0.35 + (Math.min(cat.swarms, 12) / 12) * 0.4),
119
+ });
120
+ }
121
+ // 4. A category costing far more than the fleet average => flag it.
122
+ if (cat.swarms >= MIN_SAMPLE &&
123
+ fleetAvgCost > 0 &&
124
+ cat.avgCostUsd >= fleetAvgCost * OVER_BUDGET_MULTIPLE) {
125
+ const x = cat.avgCostUsd / fleetAvgCost;
126
+ out.push({
127
+ key: `policy.budget.${cat.category}`,
128
+ area: 'policy',
129
+ title: `Flag over-budget goal category: "${cat.category}"`,
130
+ rationale: `"${cat.category}" averaged $${cat.avgCostUsd.toFixed(4)} per swarm ` +
131
+ `— ${x.toFixed(1)}x the fleet average of ` +
132
+ `$${fleetAvgCost.toFixed(4)}. Worth a budget cap or a cheaper ` +
133
+ `routing tier for this category. (Suggestion only.)`,
134
+ confidence: clampConfidence(0.4 + (Math.min(x - 1, 3) / 3) * 0.4),
135
+ });
136
+ }
137
+ }
138
+ // -- 5. Regression watch: effectiveness dropped week-over-week. ----------
139
+ const eff = report.delta?.effectivenessPct;
140
+ if (analyzed >= MIN_SAMPLE && typeof eff === 'number' && eff <= -10) {
141
+ out.push({
142
+ key: 'policy.effectiveness-regression',
143
+ area: 'policy',
144
+ title: 'Review recent routing/policy: effectiveness regressed',
145
+ rationale: `Success rate fell ${Math.abs(Math.round(eff))} points vs the prior ` +
146
+ `snapshot. Recent routing or policy changes may be worth reviewing. ` +
147
+ `(Suggestion only — nothing is reverted.)`,
148
+ confidence: clampConfidence(0.4 + (Math.min(Math.abs(eff), 50) / 50) * 0.4),
149
+ });
150
+ }
151
+ // Highest-confidence first, then stable by key. Bounded by MAX_TUNING.
152
+ out.sort((a, b) => b.confidence - a.confidence || a.key.localeCompare(b.key));
153
+ return out.slice(0, MAX_TUNING);
154
+ }
155
+ catch {
156
+ return [];
157
+ }
158
+ }
159
+ // ---------------------------------------------------------------------------
160
+ // Public: emit to the Approval Inbox (the SOLE sink)
161
+ // ---------------------------------------------------------------------------
162
+ /**
163
+ * Convert derived TuningProposals into PENDING M23 inbox proposals via
164
+ * createProposal(). Returns the created Proposal records.
165
+ *
166
+ * GUARDRAIL: this is the ONLY outward sink for tuning. Each proposal is created
167
+ * with kind 'note' (a no-op record — applying it mutates NOTHING), origin
168
+ * 'manual', repo null, status 'pending'. There is NO path here that touches the
169
+ * global config, routing policy, or prompts. Never throws.
170
+ */
171
+ export function emitTuningProposals(suggestions) {
172
+ const created = [];
173
+ try {
174
+ // Bounded defensively even though deriveTuning already caps the input.
175
+ for (const s of (suggestions ?? []).slice(0, MAX_TUNING)) {
176
+ try {
177
+ const pct = Math.round(clampConfidence(s.confidence) * 100);
178
+ const proposal = createProposal({
179
+ repo: null,
180
+ origin: 'manual',
181
+ // 'note' is a no-op record: approving/applying it mutates NOTHING.
182
+ kind: 'note',
183
+ title: `[tuning] ${s.title}`,
184
+ summary: `${s.rationale}\n\n` +
185
+ `area: ${s.area} · key: ${s.key} · confidence: ${pct}%\n` +
186
+ `This is a tuning SUGGESTION only — approving it records the ` +
187
+ `decision but changes no configuration, routing, policy, or prompt.`,
188
+ });
189
+ created.push(proposal);
190
+ }
191
+ catch {
192
+ // Skip a single failed proposal; keep emitting the rest.
193
+ }
194
+ }
195
+ return created;
196
+ }
197
+ catch {
198
+ return created;
199
+ }
200
+ }
201
+ //# sourceMappingURL=tuning.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tuning.js","sourceRoot":"","sources":["../../../src/core/learn/tuning.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * M6: Project Lifecycle — Scaffolder
3
+ *
4
+ * Materializes a ProjectTemplate onto disk for `ashlr new`, then best-effort
5
+ * runs `git init` and registers the project in the ashlr index.
6
+ *
7
+ * SAFETY GUARDRAILS:
8
+ * - REFUSES to write if the target directory already exists (no clobber).
9
+ * - Writes ONLY under spec.dir; every TemplateFile path is resolved relative
10
+ * to spec.dir and rejected if it escapes the directory.
11
+ * - NEVER throws — all failures surface via the returned ScaffoldResult.
12
+ */
13
+ import type { ScaffoldSpec, ScaffoldResult } from '../types.js';
14
+ /** The default category bucket for new projects. */
15
+ export declare function defaultCategory(): string;
16
+ /**
17
+ * The canonical root under which all scaffolded projects must live:
18
+ * ~/Desktop/github. Used as the allowed-root for the in-tree write guard.
19
+ */
20
+ export declare function githubRoot(): string;
21
+ /**
22
+ * Resolve the canonical target directory for a project under the
23
+ * ~/Desktop/github/<category>/<name> tree.
24
+ */
25
+ export declare function targetDir(name: string, category: string): string;
26
+ /** Synchronous index-registration function shape (injectable for tests). */
27
+ export type IndexRegistrar = () => {
28
+ registered: boolean;
29
+ warning?: string;
30
+ };
31
+ /**
32
+ * Scaffold a project from its template into spec.dir.
33
+ *
34
+ * Returns a ScaffoldResult; never throws. Index registration runs
35
+ * SYNCHRONOUSLY before returning, so `result.registered` deterministically
36
+ * reflects the real outcome (M6 contract).
37
+ *
38
+ * @param register Optional injected registrar (defaults to the real
39
+ * createRequire-based synchronous registration). Tests inject a stub here
40
+ * because vitest's `vi.mock` intercepts dynamic `import()` but NOT
41
+ * `createRequire`, so the real index-engine cannot be mocked otherwise.
42
+ */
43
+ export declare function scaffoldProject(spec: ScaffoldSpec, register?: IndexRegistrar): ScaffoldResult;
@@ -0,0 +1,260 @@
1
+ /**
2
+ * M6: Project Lifecycle — Scaffolder
3
+ *
4
+ * Materializes a ProjectTemplate onto disk for `ashlr new`, then best-effort
5
+ * runs `git init` and registers the project in the ashlr index.
6
+ *
7
+ * SAFETY GUARDRAILS:
8
+ * - REFUSES to write if the target directory already exists (no clobber).
9
+ * - Writes ONLY under spec.dir; every TemplateFile path is resolved relative
10
+ * to spec.dir and rejected if it escapes the directory.
11
+ * - NEVER throws — all failures surface via the returned ScaffoldResult.
12
+ */
13
+ import { execSync } from 'node:child_process';
14
+ import { existsSync, mkdirSync, writeFileSync, chmodSync, } from 'node:fs';
15
+ import { createRequire } from 'node:module';
16
+ import { homedir } from 'node:os';
17
+ import { dirname, isAbsolute, join, relative, resolve, sep, } from 'node:path';
18
+ import { getTemplate } from './templates.js';
19
+ // ---------------------------------------------------------------------------
20
+ // Path helpers
21
+ // ---------------------------------------------------------------------------
22
+ /** The default category bucket for new projects. */
23
+ export function defaultCategory() {
24
+ return 'side-projects';
25
+ }
26
+ /**
27
+ * The canonical root under which all scaffolded projects must live:
28
+ * ~/Desktop/github. Used as the allowed-root for the in-tree write guard.
29
+ */
30
+ export function githubRoot() {
31
+ return resolve(join(homedir(), 'Desktop', 'github'));
32
+ }
33
+ /**
34
+ * Resolve the canonical target directory for a project under the
35
+ * ~/Desktop/github/<category>/<name> tree.
36
+ */
37
+ export function targetDir(name, category) {
38
+ return resolve(join(homedir(), 'Desktop', 'github', category, name));
39
+ }
40
+ /**
41
+ * True when `child` resolves to a path strictly inside `parent`
42
+ * (or equal to it). Used to keep all writes under spec.dir.
43
+ */
44
+ function isInside(parent, child) {
45
+ const rel = relative(parent, child);
46
+ return rel === '' || (!rel.startsWith('..') && !isAbsolute(rel));
47
+ }
48
+ // ---------------------------------------------------------------------------
49
+ // git
50
+ // ---------------------------------------------------------------------------
51
+ function gitInit(dir) {
52
+ try {
53
+ execSync('git init', { cwd: dir, stdio: 'pipe', timeout: 30_000 });
54
+ return { ok: true };
55
+ }
56
+ catch (err) {
57
+ const msg = err instanceof Error ? err.message : String(err);
58
+ return { ok: false, warning: `git init failed: ${msg}` };
59
+ }
60
+ }
61
+ // ---------------------------------------------------------------------------
62
+ // stack recipe detection (warning-only; provisioning is done by the CLI layer)
63
+ // ---------------------------------------------------------------------------
64
+ function stackInstalled() {
65
+ try {
66
+ const out = execSync('which stack 2>/dev/null', { encoding: 'utf8' }).trim();
67
+ return out.length > 0;
68
+ }
69
+ catch {
70
+ return false;
71
+ }
72
+ }
73
+ // ---------------------------------------------------------------------------
74
+ // index registration (best-effort; never blocks scaffold success)
75
+ // ---------------------------------------------------------------------------
76
+ /**
77
+ * Register the new project in the ashlr index, SYNCHRONOUSLY.
78
+ *
79
+ * buildIndex / writeIndex / loadConfig are all synchronous in the real
80
+ * index-engine, so registration completes before scaffoldProject returns and
81
+ * the `registered` flag deterministically reflects the outcome (M6 contract).
82
+ *
83
+ * Modules are loaded via createRequire so this stays synchronous; failures and
84
+ * the (test-only) async-buildIndex case surface as a non-fatal warning with
85
+ * registered:false rather than blocking or throwing.
86
+ */
87
+ function registerInIndex() {
88
+ try {
89
+ const require = createRequire(import.meta.url);
90
+ const indexMod = require('../index-engine.js');
91
+ let configMod = null;
92
+ try {
93
+ configMod = require('../config.js');
94
+ }
95
+ catch {
96
+ configMod = null;
97
+ }
98
+ const { buildIndex, writeIndex } = indexMod;
99
+ let cfg = undefined;
100
+ if (configMod && typeof configMod.loadConfig === 'function') {
101
+ try {
102
+ cfg = configMod.loadConfig();
103
+ }
104
+ catch {
105
+ cfg = undefined;
106
+ }
107
+ }
108
+ const built = buildIndex(cfg);
109
+ // The real buildIndex is synchronous. If a caller (or a test mock) returns a
110
+ // Promise, we cannot await it on this synchronous path — report it as a
111
+ // non-fatal skip rather than registering a half-built index.
112
+ if (built instanceof Promise) {
113
+ return {
114
+ registered: false,
115
+ warning: 'index registration skipped: buildIndex returned a Promise (async index-engine)',
116
+ };
117
+ }
118
+ writeIndex(built);
119
+ return { registered: true };
120
+ }
121
+ catch (err) {
122
+ const msg = err instanceof Error ? err.message : String(err);
123
+ return { registered: false, warning: `index registration skipped: ${msg}` };
124
+ }
125
+ }
126
+ /**
127
+ * Scaffold a project from its template into spec.dir.
128
+ *
129
+ * Returns a ScaffoldResult; never throws. Index registration runs
130
+ * SYNCHRONOUSLY before returning, so `result.registered` deterministically
131
+ * reflects the real outcome (M6 contract).
132
+ *
133
+ * @param register Optional injected registrar (defaults to the real
134
+ * createRequire-based synchronous registration). Tests inject a stub here
135
+ * because vitest's `vi.mock` intercepts dynamic `import()` but NOT
136
+ * `createRequire`, so the real index-engine cannot be mocked otherwise.
137
+ */
138
+ export function scaffoldProject(spec, register = registerInIndex) {
139
+ const result = {
140
+ ok: false,
141
+ dir: spec.dir,
142
+ filesWritten: [],
143
+ gitInitialized: false,
144
+ mcpWired: false,
145
+ registered: false,
146
+ warnings: [],
147
+ };
148
+ try {
149
+ // SAFETY (defense-in-depth): the write-performing layer self-defends. Refuse
150
+ // any spec.dir that is not the cwd-relative `--here` form AND not strictly
151
+ // inside ~/Desktop/github/. This stops out-of-tree creation even if a CLI
152
+ // caller forgets to validate (e.g. a crafted --category). spec.allowAnyRoot
153
+ // is the explicit opt-out used by hermetic tmp-dir tests.
154
+ if (!spec.allowAnyRoot) {
155
+ const root = githubRoot();
156
+ const inTree = spec.dir === root || spec.dir.startsWith(root + sep);
157
+ const here = isInside(resolve(process.cwd()), spec.dir);
158
+ if (!inTree && !here) {
159
+ result.error =
160
+ `Refusing to scaffold outside the github tree: ${spec.dir} ` +
161
+ `(allowed root: ${root}).`;
162
+ return result;
163
+ }
164
+ }
165
+ // SAFETY: refuse to overwrite an existing directory.
166
+ if (existsSync(spec.dir)) {
167
+ result.error = `Target directory already exists: ${spec.dir}. Refusing to overwrite.`;
168
+ return result;
169
+ }
170
+ // Resolve the template.
171
+ const template = getTemplate(spec.templateId);
172
+ if (!template) {
173
+ result.error = `Unknown template: "${spec.templateId}".`;
174
+ return result;
175
+ }
176
+ // Build the file list.
177
+ let files;
178
+ try {
179
+ files = template.files({ name: spec.name, category: spec.category });
180
+ }
181
+ catch (err) {
182
+ const msg = err instanceof Error ? err.message : String(err);
183
+ result.error = `Template "${spec.templateId}" failed to produce files: ${msg}`;
184
+ return result;
185
+ }
186
+ // Create the root directory.
187
+ mkdirSync(spec.dir, { recursive: true });
188
+ // Write each file, guarding against path escape.
189
+ let mcpWired = false;
190
+ for (const file of files) {
191
+ const targetPath = resolve(spec.dir, file.path);
192
+ if (!isInside(spec.dir, targetPath)) {
193
+ result.warnings.push(`skipped file outside project dir: ${file.path}`);
194
+ continue;
195
+ }
196
+ mkdirSync(dirname(targetPath), { recursive: true });
197
+ writeFileSync(targetPath, file.content);
198
+ if (typeof file.mode === 'number') {
199
+ try {
200
+ chmodSync(targetPath, file.mode);
201
+ }
202
+ catch {
203
+ // mode is best-effort; ignore on platforms that reject it
204
+ }
205
+ }
206
+ result.filesWritten.push(targetPath);
207
+ // Detect the .mcp.json wiring the ashlr gateway.
208
+ if (targetPath === resolve(spec.dir, '.mcp.json')) {
209
+ try {
210
+ const parsed = JSON.parse(file.content);
211
+ if (parsed.mcpServers && 'ashlr' in parsed.mcpServers) {
212
+ mcpWired = true;
213
+ }
214
+ }
215
+ catch {
216
+ // not valid JSON — leave mcpWired false
217
+ }
218
+ }
219
+ }
220
+ result.mcpWired = mcpWired;
221
+ // stack recipe: warn (only) when requested but stack is not installed.
222
+ if (spec.stackRecipe) {
223
+ if (!stackInstalled()) {
224
+ result.warnings.push(`stack recipe "${spec.stackRecipe}" requested but \`stack\` is not installed — skipping provisioning.`);
225
+ }
226
+ }
227
+ // git init (best-effort).
228
+ if (spec.git) {
229
+ const git = gitInit(spec.dir);
230
+ result.gitInitialized = git.ok;
231
+ if (git.warning) {
232
+ result.warnings.push(git.warning);
233
+ }
234
+ }
235
+ // Index registration (synchronous — buildIndex/writeIndex are sync). Doing
236
+ // this inline makes `result.registered` deterministically reflect the real
237
+ // outcome before we return, satisfying the M6 contract. Never throws.
238
+ let reg;
239
+ try {
240
+ reg = register();
241
+ }
242
+ catch (err) {
243
+ const msg = err instanceof Error ? err.message : String(err);
244
+ reg = { registered: false, warning: `index registration skipped: ${msg}` };
245
+ }
246
+ if (reg.warning) {
247
+ result.warnings.push(reg.warning);
248
+ }
249
+ result.registered = reg.registered;
250
+ result.ok = true;
251
+ return result;
252
+ }
253
+ catch (err) {
254
+ const msg = err instanceof Error ? err.message : String(err);
255
+ result.error = `Scaffold failed: ${msg}`;
256
+ result.ok = false;
257
+ return result;
258
+ }
259
+ }
260
+ //# sourceMappingURL=scaffold.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scaffold.js","sourceRoot":"","sources":["../../../src/core/lifecycle/scaffold.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * core/lifecycle/ship.ts — pre-ship gate + optional deploy for `ashlr ship`.
3
+ *
4
+ * `runShipGate` is READ-ONLY: it scans, runs scripts, and reports.
5
+ * `deploy` is the ONLY place an outward action can happen, and ONLY when
6
+ * opts.confirm === true. Default is always dry-run.
7
+ *
8
+ * Both functions NEVER throw — errors are captured in ShipCheck / detail strings.
9
+ */
10
+ import type { ShipGate } from '../types.js';
11
+ /**
12
+ * Run all pre-ship gate checks for the project at `projectPath`.
13
+ *
14
+ * READ-ONLY: scans files and runs npm scripts. Never deploys or pushes.
15
+ * Never throws — all errors are captured as ShipCheck fail/warn/skip entries.
16
+ *
17
+ * Checks run in order:
18
+ * 1. supply-chain — binshield (if installed) else built-in dep sanity check
19
+ * 2. test — npm run test (if script exists)
20
+ * 3. lint — npm run lint (if script exists)
21
+ * 4. build — npm run build (if script exists)
22
+ * 5. secrets — git-tracked .env files + obvious key patterns
23
+ *
24
+ * `passed` is true when no check has status 'fail'.
25
+ */
26
+ export declare function runShipGate(projectPath: string, opts: {
27
+ strict: boolean;
28
+ }): Promise<ShipGate>;
29
+ /**
30
+ * Optionally deploy the project to the named target.
31
+ *
32
+ * DRY-RUN BY DEFAULT: only runs the real deploy command when `opts.confirm`
33
+ * is true. This is the ONLY function in the codebase that may execute an
34
+ * outward action.
35
+ *
36
+ * Supported targets: vercel | stack | morphkit | gh
37
+ * Detect every tool at runtime via `which`. If the tool is not installed,
38
+ * return a guidance string instead of failing.
39
+ *
40
+ * Never throws.
41
+ */
42
+ export declare function deploy(projectPath: string, target: string, opts: {
43
+ confirm: boolean;
44
+ }): Promise<{
45
+ ran: boolean;
46
+ dryRun: boolean;
47
+ detail: string;
48
+ }>;