@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,509 @@
1
+ /**
2
+ * CLI handler for `ashlr verify-safety` — H4 READ-ONLY safety self-check.
3
+ *
4
+ * The runtime analogue of the H4 regression suite. It runs the STRUCTURAL safety
5
+ * guards against the INSTALLED build and prints a pass/fail report, so a human or
6
+ * CI can confirm — on any machine — that the hard safety invariants still hold.
7
+ *
8
+ * Usage:
9
+ * ashlr verify-safety # human-readable PASS/FAIL report
10
+ * ashlr verify-safety --json # machine-readable { ok, checks: [...] }
11
+ *
12
+ * HARD CONTRACT (docs/contracts/CONTRACT-H4.md §Verify-Safety) — this command:
13
+ * - MUTATES NOTHING. It writes no file, creates no sandbox, enrolls nothing,
14
+ * toggles no kill switch, and creates no proposal. It performs only reads
15
+ * (source reads) and pure in-memory checks.
16
+ * - MAKES NO OUTWARD CALL. No network, no `git push`, no PR, no deploy, no model
17
+ * spawn. Local-only and side-effect-free by construction.
18
+ * - Runs these READ-ONLY structural checks (each → one PASS/FAIL line):
19
+ * 1. ENROLLMENT default-empty: an absent/malformed registry parses to
20
+ * { repos: [] } (checked against synthesized in-memory input).
21
+ * 2. KILL-SWITCH precedence: assertMayMutate enforces the kill check BEFORE
22
+ * the enrollment/allowAnyRepo check (source check — never touches
23
+ * ~/.ashlr/KILL).
24
+ * 3. DAEMON exports no outward primitive: daemon/loop.ts imports/call-tokens
25
+ * contain no apply/push/createPr/deploy.
26
+ * 4. SCRUB patterns match: index.ts/graph.ts scrubSecrets redact a
27
+ * synthesized secret string (in-memory; no file written).
28
+ * 5. PROVIDER cloud-gate present: provider-client.ts defines the cloud gate
29
+ * and the !allowCloud throw path.
30
+ *
31
+ * Exit codes: 0 all checks pass, 1 one or more FAIL (so CI can gate), 2 bad usage.
32
+ *
33
+ * NOTE (integration — owned by the Build/Integrate phase, NOT this scaffold):
34
+ * src/cli/index.ts must add a
35
+ * `loadVerifySafetyCmd = lazyCmd(() => import('./verify-safety.js'),
36
+ * (m) => m.cmdVerifySafety as Cmd, 'verify-safety requires src/cli/verify-safety.ts (H4)')`,
37
+ * a `case 'verify-safety':` arm in the dispatch switch, and a cmdHelp entry.
38
+ *
39
+ * No new runtime deps; node builtins only; never throws out of cmdVerifySafety.
40
+ */
41
+ import { readFileSync } from 'node:fs';
42
+ import { fileURLToPath } from 'node:url';
43
+ import { dirname, join, resolve } from 'node:path';
44
+ // The REAL secret-scrub guard — imported (not copied) so CHECK 4 exercises the
45
+ // actual redaction logic. This is a pure, local-only function (no network, no
46
+ // I/O); importing it keeps verify-safety side-effect-free and outward-call-free.
47
+ import { scrubSecrets, SECRET_PATTERNS } from '../core/knowledge/index.js';
48
+ /**
49
+ * Read a module under `core/` of THIS build as raw UTF-8 text. Resolved RELATIVE
50
+ * to this running module (`<root>/cli/verify-safety.<ext>` → `<root>/core/<rel>`),
51
+ * so it works for both the compiled build (`dist/core/...js`) and the dev/test
52
+ * tree (`src/core/...ts`). Tries this file's own extension first, then the
53
+ * sibling extension, so a `.ts` test run still resolves the `.ts` source.
54
+ *
55
+ * READ-ONLY: a plain `readFileSync`. Makes no outward call and writes nothing.
56
+ */
57
+ function defaultReadCore(relFromCore) {
58
+ const here = dirname(fileURLToPath(import.meta.url)); // <root>/cli
59
+ const coreDir = resolve(here, '..', 'core'); // <root>/core
60
+ const selfExt = import.meta.url.endsWith('.ts') ? '.ts' : '.js';
61
+ const otherExt = selfExt === '.ts' ? '.js' : '.ts';
62
+ const base = join(coreDir, relFromCore);
63
+ try {
64
+ return readFileSync(base + selfExt, 'utf8');
65
+ }
66
+ catch {
67
+ return readFileSync(base + otherExt, 'utf8');
68
+ }
69
+ }
70
+ // ---------------------------------------------------------------------------
71
+ // Static-scan helpers (comment-strip + import specifiers + token scan)
72
+ // ---------------------------------------------------------------------------
73
+ /**
74
+ * Strip `//` line comments and block comments so a forbidden-call-token scan
75
+ * never trips on a passing mention inside a comment. Conservative — does not
76
+ * parse strings (acceptable: the scanned tokens never legitimately live in a
77
+ * string literal in these modules).
78
+ */
79
+ function stripComments(src) {
80
+ return src
81
+ .replace(/\/\*[\s\S]*?\*\//g, ' ')
82
+ .replace(/(^|[^:])\/\/[^\n]*/g, '$1');
83
+ }
84
+ /** Extract the set of module specifiers imported by `src`. */
85
+ function importSpecifiers(src) {
86
+ const specs = [];
87
+ const fromRe = /\bimport\b[^'"]*?from\s*['"]([^'"]+)['"]/g;
88
+ const bareRe = /\bimport\s*['"]([^'"]+)['"]/g;
89
+ const dynRe = /\bimport\s*\(\s*['"]([^'"]+)['"]\s*\)/g;
90
+ for (const re of [fromRe, bareRe, dynRe]) {
91
+ let m;
92
+ while ((m = re.exec(src)) !== null) {
93
+ if (m[1] !== undefined)
94
+ specs.push(m[1]);
95
+ }
96
+ }
97
+ return specs;
98
+ }
99
+ // ---------------------------------------------------------------------------
100
+ // Structural checks (READ-ONLY) — each is a pure read + in-memory assertion.
101
+ // ---------------------------------------------------------------------------
102
+ /**
103
+ * The complete set of structural-check ids the report MUST contain. A runtime
104
+ * coverage guard in {@link runSafetyChecks} emits a synthetic FAIL for any id
105
+ * here that did not run, so dropping a runner fails CI rather than silently
106
+ * shrinking coverage to a smaller all-passing set.
107
+ */
108
+ const EXPECTED_CHECK_IDS = [
109
+ 'enrollment-default-empty',
110
+ 'kill-switch-precedence',
111
+ 'daemon-no-primitive',
112
+ 'scrub-patterns-match',
113
+ 'provider-cloud-gate',
114
+ ];
115
+ /** Construct a SafetyCheck, normalizing the detail string. */
116
+ function mk(id, label, pass, detail = '') {
117
+ return { id, label, pass, detail };
118
+ }
119
+ /** Normalize an unknown thrown value to a message string. */
120
+ function errMsg(err) {
121
+ return err instanceof Error ? err.message : String(err);
122
+ }
123
+ /**
124
+ * Replicates policy.ts's `readRegistry` parse semantics on a SYNTHESIZED
125
+ * in-memory string — never reading or writing the real registry — so we can
126
+ * assert the DEFAULT-EMPTY guarantee at runtime. Mirrors the real parser:
127
+ * absent/malformed/non-`{repos:[]}` input yields `{ repos: [] }`; a valid
128
+ * `{ repos: [...] }` keeps only the string entries.
129
+ */
130
+ function parseRegistryLike(raw) {
131
+ if (raw === null)
132
+ return { repos: [] };
133
+ try {
134
+ const parsed = JSON.parse(raw);
135
+ if (typeof parsed === 'object' &&
136
+ parsed !== null &&
137
+ !Array.isArray(parsed) &&
138
+ Array.isArray(parsed['repos'])) {
139
+ const repos = parsed['repos'].filter((r) => typeof r === 'string');
140
+ return { repos };
141
+ }
142
+ }
143
+ catch {
144
+ // malformed — treat as empty
145
+ }
146
+ return { repos: [] };
147
+ }
148
+ /**
149
+ * CHECK 1 — ENROLLMENT default-empty semantics. Asserts the registry parser
150
+ * yields `{ repos: [] }` for absent (null), malformed (`{`), and wrong-shape
151
+ * (`[]`, `{"repos":"x"}`) inputs, and keeps only string entries otherwise. Runs
152
+ * entirely in-memory against synthesized inputs — the real registry is never
153
+ * touched.
154
+ */
155
+ function checkEnrollmentDefaultEmpty() {
156
+ const id = 'enrollment-default-empty';
157
+ const label = 'ENROLLMENT: absent/malformed registry parses to { repos: [] }';
158
+ const emptyCases = [null, '', '{', 'null', '[]', '{}', '{"repos":"nope"}'];
159
+ for (const raw of emptyCases) {
160
+ const got = parseRegistryLike(raw);
161
+ if (got.repos.length !== 0) {
162
+ return mk(id, label, false, `input ${JSON.stringify(raw)} did not yield empty repos`);
163
+ }
164
+ }
165
+ // A valid registry keeps only string entries (drops non-strings).
166
+ const mixed = parseRegistryLike('{"repos":["/a",5,"/b",null]}');
167
+ if (mixed.repos.length !== 2 || mixed.repos[0] !== '/a' || mixed.repos[1] !== '/b') {
168
+ return mk(id, label, false, 'valid registry did not normalize to its string entries');
169
+ }
170
+ return mk(id, label, true);
171
+ }
172
+ /**
173
+ * CHECK 2 — KILL-SWITCH precedes the enrollment / allowAnyRepo gate. Asserts (by
174
+ * reading the real `assertMayMutate` source) that the kill-switch check appears
175
+ * BEFORE the enrollment check, so `allowAnyRepo` can never reach a mutation while
176
+ * kill is on. Pure source read — never touches `~/.ashlr/KILL`.
177
+ */
178
+ function checkKillSwitchPrecedence(read) {
179
+ const id = 'kill-switch-precedence';
180
+ const label = 'KILL-SWITCH: kill check precedes the enrollment/allowAnyRepo check';
181
+ let src;
182
+ try {
183
+ src = stripComments(read('sandbox/policy'));
184
+ }
185
+ catch (err) {
186
+ return mk(id, label, false, `could not read policy source: ${errMsg(err)}`);
187
+ }
188
+ const fnIdx = src.indexOf('function assertMayMutate');
189
+ if (fnIdx === -1)
190
+ return mk(id, label, false, 'assertMayMutate not found in policy source');
191
+ // Scan the function BODY (after the parameter list) so the `allowAnyRepo`
192
+ // TYPE annotation in the signature never reorders the comparison — we compare
193
+ // the kill GUARD against the enrollment GUARD, which is unambiguous.
194
+ const bodyIdx = src.indexOf('{', fnIdx);
195
+ const body = bodyIdx === -1 ? src.slice(fnIdx) : src.slice(bodyIdx);
196
+ const killIdx = body.indexOf('killSwitchOn(');
197
+ const enrollIdx = body.indexOf('isEnrolled(');
198
+ if (killIdx === -1)
199
+ return mk(id, label, false, 'assertMayMutate has no killSwitchOn() check');
200
+ if (enrollIdx === -1)
201
+ return mk(id, label, false, 'assertMayMutate has no isEnrolled() check');
202
+ // The kill-switch check MUST appear before the enrollment/allowAnyRepo gate so
203
+ // allowAnyRepo can never reach a mutation while kill is on.
204
+ if (killIdx > enrollIdx) {
205
+ return mk(id, label, false, 'kill-switch check does NOT precede the enrollment/allowAnyRepo check');
206
+ }
207
+ return mk(id, label, true);
208
+ }
209
+ /**
210
+ * CHECK 3 — DAEMON exports no outward primitive (the [STATIC] grep-guard). Reads
211
+ * `daemon/loop` and asserts its import specifiers + comment-stripped call tokens
212
+ * contain none of apply/push/createPr/deploy. The only inbox import allowed is
213
+ * the read-only `inbox/store` (pendingCount).
214
+ */
215
+ function checkDaemonNoPrimitive(read) {
216
+ const id = 'daemon-no-primitive';
217
+ const label = 'PROPOSAL-ONLY: daemon/loop imports no apply/push/createPr/deploy primitive';
218
+ let src;
219
+ try {
220
+ src = read('daemon/loop');
221
+ }
222
+ catch (err) {
223
+ return mk(id, label, false, `could not read daemon/loop source: ${errMsg(err)}`);
224
+ }
225
+ // Forbidden import specifiers (substring match on each specifier). Includes
226
+ // the modules that EXPORT outward primitives (apply/createPr/ship/deploy) so a
227
+ // bare named import of one is caught at its specifier even if the call token
228
+ // is later renamed.
229
+ const forbiddenImports = ['inbox/apply', 'integrations/github', 'ship/', 'deploy'];
230
+ for (const spec of importSpecifiers(src)) {
231
+ for (const bad of forbiddenImports) {
232
+ if (spec.includes(bad)) {
233
+ return mk(id, label, false, `forbidden import specifier: ${spec}`);
234
+ }
235
+ }
236
+ }
237
+ // Forbidden CALL tokens (comment-stripped, so a doc-comment mention is fine).
238
+ // Kept in lockstep with the H4 regression suite's set
239
+ // (test/h4.proposal-only.test.ts guard 1.9) so the runtime self-check and CI
240
+ // assert the SAME token surface — including the gitPush( helper form.
241
+ const stripped = stripComments(src);
242
+ const forbiddenTokens = ['applyProposal(', 'createPr(', 'git push', 'gitPush(', 'deploy('];
243
+ for (const tok of forbiddenTokens) {
244
+ if (stripped.includes(tok)) {
245
+ return mk(id, label, false, `forbidden outward call token: ${tok}`);
246
+ }
247
+ }
248
+ return mk(id, label, true);
249
+ }
250
+ /**
251
+ * CHECK 4 — SCRUB patterns redact a synthesized secret. Reads the index.ts and
252
+ * graph.ts scrub sources for the drift markers, then invokes the REAL (imported,
253
+ * not copied) `scrubSecrets` over a synthesized JWT / AWS key / assignment-style
254
+ * secret and asserts every raw value is gone. Because it runs the actual
255
+ * redaction logic, a weakening of the real function body or pattern set FAILs
256
+ * this check. Run entirely in-memory on a synthesized string — no file is read
257
+ * into the index and nothing is written.
258
+ */
259
+ function checkScrubPatterns(read) {
260
+ const id = 'scrub-patterns-match';
261
+ const label = 'SECRET-SCRUB: index.ts/graph.ts scrubSecrets redact a synthesized secret';
262
+ let indexSrc;
263
+ let graphSrc;
264
+ try {
265
+ indexSrc = read('knowledge/index');
266
+ graphSrc = read('knowledge/graph');
267
+ }
268
+ catch (err) {
269
+ return mk(id, label, false, `could not read scrub sources: ${errMsg(err)}`);
270
+ }
271
+ // Both impls must define a scrubSecrets + a SECRET pattern source.
272
+ if (!/function scrubSecrets/.test(indexSrc) || !/SECRET_PATTERNS/.test(indexSrc)) {
273
+ return mk(id, label, false, 'index.ts is missing scrubSecrets / SECRET_PATTERNS');
274
+ }
275
+ if (!/function scrubSecrets/.test(graphSrc) || !/SECRET_PATTERNS/.test(graphSrc)) {
276
+ return mk(id, label, false, 'graph.ts is missing scrubSecrets / SECRET_PATTERNS');
277
+ }
278
+ // The index high-entropy markers must still be present (drift-guard against
279
+ // an INJECTED/broken source where the real import can't be swapped). This is
280
+ // what the H4 broken-reader negative test trips: a source missing these
281
+ // markers fails here even though the real import below still redacts.
282
+ if (!indexSrc.includes('AKIA') || !indexSrc.includes('eyJ')) {
283
+ return mk(id, label, false, 'index.ts no longer pins the AWS/JWT secret patterns');
284
+ }
285
+ // STRENGTH: run the REAL scrubSecrets (imported, not copied) over a synthesized
286
+ // secret carrying a JWT, an AWS key, and an assignment-style api_key. If a
287
+ // future change weakens the actual function body OR any pattern in the real
288
+ // SECRET_PATTERNS array, the raw values survive and this check FAILs — so the
289
+ // self-check tracks the real redaction logic, not a drifting private copy.
290
+ const synthSecret = [
291
+ 'api_key = "abcdefghij0123456789ABCDEFGHIJ"',
292
+ 'aws=AKIAIOSFODNN7EXAMPLE',
293
+ 'jwt=eyJhbGci.eyJzdWIiOiIxIn0.SflKxwRJSMeKKF2QT4fwpMeJf36',
294
+ ].join(' ');
295
+ const scrubbed = scrubSecrets(synthSecret);
296
+ for (const raw of [
297
+ 'abcdefghij0123456789ABCDEFGHIJ',
298
+ 'AKIAIOSFODNN7EXAMPLE',
299
+ 'eyJhbGci.eyJzdWIiOiIxIn0.SflKxwRJSMeKKF2QT4fwpMeJf36',
300
+ ]) {
301
+ if (scrubbed.includes(raw)) {
302
+ return mk(id, label, false, `real scrubSecrets left a secret unredacted: ${raw}`);
303
+ }
304
+ }
305
+ if (!scrubbed.includes('[REDACTED]')) {
306
+ return mk(id, label, false, 'real scrubSecrets produced no [REDACTED] marker');
307
+ }
308
+ // The real pattern array must still carry the high-entropy shapes (a complete
309
+ // wipe of the array would leave the synthSecret above only assignment-covered;
310
+ // pin the count so silent shrinkage of the pattern set is visible).
311
+ if (SECRET_PATTERNS.length < 6) {
312
+ return mk(id, label, false, `index SECRET_PATTERNS shrank to ${SECRET_PATTERNS.length} (<6)`);
313
+ }
314
+ // graph.ts must DELEGATE to index.ts's real scrub via the parity import
315
+ // (live code, not a vestigial assignment-regex comment): pin the
316
+ // `from './index.js'` import pulling scrubSecrets + SECRET_PATTERNS, which is
317
+ // the genuine H6 §B.1 strengthening. A cosmetic comment edit can no longer
318
+ // trip this; only removing the real delegation will.
319
+ if (!/from ['"]\.\/index\.js['"]/.test(graphSrc) ||
320
+ !/scrubSecrets/.test(graphSrc) || !/SECRET_PATTERNS/.test(graphSrc)) {
321
+ return mk(id, label, false, 'graph.ts no longer imports the index.ts parity scrub');
322
+ }
323
+ return mk(id, label, true);
324
+ }
325
+ /**
326
+ * CHECK 5 — PROVIDER cloud-gate present. Reads `run/provider-client` and asserts
327
+ * it defines the `CLOUD_PROVIDERS` gate and the `!opts.allowCloud` (local-first)
328
+ * throw path, so cloud egress can never happen silently.
329
+ */
330
+ function checkProviderCloudGate(read) {
331
+ const id = 'provider-cloud-gate';
332
+ const label = 'LOCAL-FIRST: provider-client defines the cloud gate + !allowCloud throw';
333
+ let src;
334
+ try {
335
+ src = read('run/provider-client');
336
+ }
337
+ catch (err) {
338
+ return mk(id, label, false, `could not read provider-client source: ${errMsg(err)}`);
339
+ }
340
+ if (!/CLOUD_PROVIDERS\s*=\s*new Set/.test(src)) {
341
+ return mk(id, label, false, 'CLOUD_PROVIDERS gate set not found');
342
+ }
343
+ if (!/isCloudProvider\(/.test(src)) {
344
+ return mk(id, label, false, 'isCloudProvider() gate not found');
345
+ }
346
+ const stripped = stripComments(src);
347
+ if (!/!\s*opts\.allowCloud/.test(stripped)) {
348
+ return mk(id, label, false, '!allowCloud throw path not found');
349
+ }
350
+ if (!/Pass --allow-cloud/.test(stripped)) {
351
+ return mk(id, label, false, 'local-first cloud-gate error message not found');
352
+ }
353
+ // ORDERING (mirrors CHECK 2's kill/enroll precedence technique): a present-but-
354
+ // bypassed gate (throw moved below the local-client build, or an early `return`
355
+ // added before the gate) must NOT pass. Scope the scan to the getActiveClient
356
+ // function BODY so an earlier buildOllamaClient/buildLmStudioClient DEFINITION
357
+ // never confuses the call-site ordering; then assert the cloud-gate refusal
358
+ // appears BEFORE the first LOCAL provider client is BUILT (called).
359
+ const fnIdx = stripped.search(/function getActiveClient\b/);
360
+ const body = fnIdx === -1 ? stripped : stripped.slice(fnIdx);
361
+ const gateIdx = body.search(/if\s*\(\s*isCloudProvider\(/);
362
+ // The cloud-gate refusal is uniquely marked by its 'Pass --allow-cloud' message;
363
+ // use that marker's position as the throw site (robust to error-text edits).
364
+ const throwIdx = body.indexOf('Pass --allow-cloud');
365
+ const allowIdx = body.indexOf('!opts.allowCloud');
366
+ // Call sites within the function body. The body slice starts AT
367
+ // `function getActiveClient`, so the earlier `function buildOllamaClient` /
368
+ // `function buildLmStudioClient` DEFINITIONS are already excluded — any
369
+ // `buildOllamaClient(` / `buildLmStudioClient(` token here is a CALL.
370
+ const localBuildIdx = (() => {
371
+ const o = body.indexOf('buildOllamaClient(');
372
+ const l = body.indexOf('buildLmStudioClient(');
373
+ if (o === -1)
374
+ return l;
375
+ if (l === -1)
376
+ return o;
377
+ return Math.min(o, l);
378
+ })();
379
+ if (gateIdx === -1) {
380
+ return mk(id, label, false, 'isCloudProvider() gate block not found in body');
381
+ }
382
+ if (allowIdx === -1 || allowIdx < gateIdx) {
383
+ return mk(id, label, false, '!opts.allowCloud check is not inside the cloud-gate block');
384
+ }
385
+ if (localBuildIdx !== -1 && throwIdx !== -1 && throwIdx > localBuildIdx) {
386
+ return mk(id, label, false, 'cloud-gate throw does NOT precede the local client build (bypassable)');
387
+ }
388
+ if (localBuildIdx !== -1 && gateIdx > localBuildIdx) {
389
+ return mk(id, label, false, 'cloud-gate block does NOT precede the local client build');
390
+ }
391
+ return mk(id, label, true);
392
+ }
393
+ /**
394
+ * Run all READ-ONLY structural safety checks and return the report.
395
+ *
396
+ * MUTATES NOTHING and makes NO outward call: each check is a pure read (source
397
+ * text + in-memory assertions). Never throws — an unexpected error inside a
398
+ * check is captured as that check FAILing (a thrown check would otherwise be
399
+ * indistinguishable from a missing guard).
400
+ *
401
+ * @param opts optional injectable source reader (test seam, default = this
402
+ * build's own sibling source).
403
+ */
404
+ export function runSafetyChecks(opts) {
405
+ const read = opts?.readSource ?? defaultReadCore;
406
+ const runners = [
407
+ () => checkEnrollmentDefaultEmpty(),
408
+ () => checkKillSwitchPrecedence(read),
409
+ () => checkDaemonNoPrimitive(read),
410
+ () => checkScrubPatterns(read),
411
+ () => checkProviderCloudGate(read),
412
+ ];
413
+ const checks = [];
414
+ for (const run of runners) {
415
+ try {
416
+ checks.push(run());
417
+ }
418
+ catch (err) {
419
+ // A check should never throw, but if one does, record it as a FAIL rather
420
+ // than letting it escape cmdVerifySafety.
421
+ checks.push(mk('check-error', 'a structural check threw', false, errMsg(err)));
422
+ }
423
+ }
424
+ // COVERAGE GUARD: a future edit that drops a runner from the array must FAIL CI
425
+ // rather than silently shrink the report to a smaller all-passing set. Emit a
426
+ // synthetic FAIL for any EXPECTED id that is missing from the produced checks.
427
+ const producedIds = new Set(checks.map((c) => c.id));
428
+ for (const expected of EXPECTED_CHECK_IDS) {
429
+ if (!producedIds.has(expected)) {
430
+ checks.push(mk('missing-check', `expected check '${expected}' did not run`, false, `coverage regression: '${expected}' is missing from the safety report`));
431
+ }
432
+ }
433
+ const ok = checks.length > 0 && checks.every((c) => c.pass);
434
+ return { ok, checks };
435
+ }
436
+ /** Parse the verify-safety argv. Recognizes only --json/--help; rejects others. */
437
+ function parseArgs(args) {
438
+ const parsed = { json: false, help: false, error: null };
439
+ for (const a of args) {
440
+ if (a === '--json')
441
+ parsed.json = true;
442
+ else if (a === '--help' || a === '-h')
443
+ parsed.help = true;
444
+ else {
445
+ parsed.error = `unknown argument: ${a}`;
446
+ break;
447
+ }
448
+ }
449
+ return parsed;
450
+ }
451
+ function printHelp() {
452
+ process.stdout.write([
453
+ 'ashlr verify-safety — READ-ONLY safety self-check (mutates nothing).',
454
+ '',
455
+ 'Usage:',
456
+ ' ashlr verify-safety Human-readable PASS/FAIL report',
457
+ ' ashlr verify-safety --json Machine-readable { ok, checks: [...] }',
458
+ '',
459
+ 'Exit codes: 0 all pass · 1 a check failed · 2 bad usage',
460
+ '',
461
+ ].join('\n'));
462
+ }
463
+ // ---------------------------------------------------------------------------
464
+ // Reporting
465
+ // ---------------------------------------------------------------------------
466
+ /** Render the human-readable PASS/FAIL report to stdout. */
467
+ function renderReport(report) {
468
+ for (const c of report.checks) {
469
+ const tag = c.pass ? 'PASS' : 'FAIL';
470
+ const detail = c.detail ? ` — ${c.detail}` : '';
471
+ process.stdout.write(`[${tag}] ${c.label}${detail}\n`);
472
+ }
473
+ if (report.checks.length === 0) {
474
+ process.stdout.write('verify-safety: no checks ran (unexpected).\n');
475
+ }
476
+ process.stdout.write(`\n${report.ok ? 'OK' : 'FAILED'}: ${report.checks.filter((c) => c.pass).length}/${report.checks.length} checks passed\n`);
477
+ }
478
+ // ---------------------------------------------------------------------------
479
+ // cmdVerifySafety — the CLI entry point (Cmd shape: src/cli/index.ts:59)
480
+ // ---------------------------------------------------------------------------
481
+ /**
482
+ * `ashlr verify-safety` entry point. READ-ONLY: runs the structural safety
483
+ * checks and prints the report. Returns 0 when every check passes, 1 when any
484
+ * check fails, 2 on bad usage. Never throws.
485
+ */
486
+ export async function cmdVerifySafety(args) {
487
+ // Async only to satisfy the repo's `Cmd = (args) => Promise<number>` shape;
488
+ // the checks themselves are synchronous, read-only, and outward-call-free.
489
+ await Promise.resolve();
490
+ const parsed = parseArgs(args);
491
+ if (parsed.help) {
492
+ printHelp();
493
+ return 0;
494
+ }
495
+ if (parsed.error) {
496
+ process.stderr.write(`error: ${parsed.error}\n`);
497
+ process.stderr.write('Run `ashlr verify-safety --help` for usage.\n');
498
+ return 2;
499
+ }
500
+ const report = runSafetyChecks();
501
+ if (parsed.json) {
502
+ process.stdout.write(JSON.stringify(report, null, 2) + '\n');
503
+ }
504
+ else {
505
+ renderReport(report);
506
+ }
507
+ return report.ok ? 0 : 1;
508
+ }
509
+ //# sourceMappingURL=verify-safety.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verify-safety.js","sourceRoot":"","sources":["../../src/cli/verify-safety.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * `ashlr wire` — wire the ashlr MCP gateway into editor config(s).
3
+ *
4
+ * Usage:
5
+ * ashlr wire [claude|codex|cursor|all] [--config <path>] [--json]
6
+ *
7
+ * Defaults to detected editors when no target is specified.
8
+ * Backup-first, deep-merge mcpServers, idempotent, LOCAL only.
9
+ * `--config <path>` overrides the default config path for the first/only target
10
+ * (temp-config-safe for tests; with `all` it applies to each detected editor).
11
+ *
12
+ * Exit codes:
13
+ * 0 all targets wired (or already up-to-date)
14
+ * 1 one or more targets failed
15
+ * 2 bad usage
16
+ */
17
+ /**
18
+ * `ashlr wire <claude|codex|cursor|all>` — wire MCP gateway into editor config(s).
19
+ * Defaults to detected editors; backup-first, idempotent, local.
20
+ * Returns a process exit code.
21
+ */
22
+ export declare function cmdWire(args: string[]): Promise<number>;