@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,40 @@
1
+ /**
2
+ * core/plugins/wrappers.ts — M33 plugin contribution safety wrappers.
3
+ *
4
+ * CONTRACT RULES (non-negotiable):
5
+ * - wrapScanner: 15s AbortSignal timeout, never-throws (→ []), cap 100 items,
6
+ * clamp value/effort to 1..5 integers, recompute score via scoreItem,
7
+ * scrub title+detail with scrubSecrets, force source:'plugin', tags include
8
+ * ['plugin', pluginName, s.id], ids namespaced plugin:<name>:<s.id>:<orig|index>.
9
+ * - validateTemplate: id prefixed <pluginName>: unless already, reject any
10
+ * template file path that is absolute, contains '..', or starts with '.git/'.
11
+ * Returns validated template or null (audited on rejection).
12
+ * - wrapCommand: run wrapped with audit of invocation + exit code, catches
13
+ * throws → exit 1.
14
+ * - All wrappers NEVER throw themselves.
15
+ */
16
+ import type { WorkItem, ProjectTemplate } from '../types.js';
17
+ import type { PluginScanner, PluginCommandSpec } from './types.js';
18
+ /**
19
+ * Wrap a PluginScanner for safety:
20
+ * - 15-second AbortSignal timeout (signal passed to scanner.scan).
21
+ * - Never throws → [] on any error or timeout.
22
+ * - Caps results at 100 items.
23
+ * - Clamps value/effort to integers in 1..5.
24
+ * - Recomputes score via scoreItem.
25
+ * - Scrubs title + detail with scrubSecrets.
26
+ * - Forces source: 'plugin'.
27
+ * - Forces tags to include ['plugin', pluginName, s.id].
28
+ * - Namespaces id as "plugin:<name>:<s.id>:<orig-id-or-index>".
29
+ */
30
+ export declare function wrapScanner(pluginName: string, s: PluginScanner): (repo: string) => Promise<WorkItem[]>;
31
+ export declare function validateTemplate(pluginName: string, t: ProjectTemplate): ProjectTemplate | null;
32
+ /**
33
+ * Wrap a PluginCommandSpec for safety:
34
+ * - Audits invocation (action: "plugin:<name>:command:<cmd.name>").
35
+ * - Catches throws → returns exit code 1.
36
+ * - Audits the exit code (ok when 0, error otherwise).
37
+ *
38
+ * NEVER throws from the wrapper itself.
39
+ */
40
+ export declare function wrapCommand(pluginName: string, c: PluginCommandSpec): PluginCommandSpec;
@@ -0,0 +1,229 @@
1
+ /**
2
+ * core/plugins/wrappers.ts — M33 plugin contribution safety wrappers.
3
+ *
4
+ * CONTRACT RULES (non-negotiable):
5
+ * - wrapScanner: 15s AbortSignal timeout, never-throws (→ []), cap 100 items,
6
+ * clamp value/effort to 1..5 integers, recompute score via scoreItem,
7
+ * scrub title+detail with scrubSecrets, force source:'plugin', tags include
8
+ * ['plugin', pluginName, s.id], ids namespaced plugin:<name>:<s.id>:<orig|index>.
9
+ * - validateTemplate: id prefixed <pluginName>: unless already, reject any
10
+ * template file path that is absolute, contains '..', or starts with '.git/'.
11
+ * Returns validated template or null (audited on rejection).
12
+ * - wrapCommand: run wrapped with audit of invocation + exit code, catches
13
+ * throws → exit 1.
14
+ * - All wrappers NEVER throw themselves.
15
+ */
16
+ import { audit } from '../sandbox/audit.js';
17
+ import { scoreItem } from '../portfolio/backlog.js';
18
+ import { scrubSecrets } from '../knowledge/index.js';
19
+ // ---------------------------------------------------------------------------
20
+ // wrapScanner
21
+ // ---------------------------------------------------------------------------
22
+ /** Maximum items returned by a plugin scanner. */
23
+ const SCANNER_CAP = 100;
24
+ /** Scanner timeout in milliseconds. */
25
+ const SCANNER_TIMEOUT_MS = 15_000;
26
+ /**
27
+ * Wrap a PluginScanner for safety:
28
+ * - 15-second AbortSignal timeout (signal passed to scanner.scan).
29
+ * - Never throws → [] on any error or timeout.
30
+ * - Caps results at 100 items.
31
+ * - Clamps value/effort to integers in 1..5.
32
+ * - Recomputes score via scoreItem.
33
+ * - Scrubs title + detail with scrubSecrets.
34
+ * - Forces source: 'plugin'.
35
+ * - Forces tags to include ['plugin', pluginName, s.id].
36
+ * - Namespaces id as "plugin:<name>:<s.id>:<orig-id-or-index>".
37
+ */
38
+ export function wrapScanner(pluginName, s) {
39
+ return async (repo) => {
40
+ const controller = new AbortController();
41
+ const timer = setTimeout(() => controller.abort(), SCANNER_TIMEOUT_MS);
42
+ let raw;
43
+ try {
44
+ raw = await s.scan(repo, { signal: controller.signal });
45
+ }
46
+ catch {
47
+ // never-throws contract: scanner timeout or error → []
48
+ return [];
49
+ }
50
+ finally {
51
+ clearTimeout(timer);
52
+ }
53
+ if (!Array.isArray(raw))
54
+ return [];
55
+ const result = [];
56
+ const capped = raw.slice(0, SCANNER_CAP);
57
+ for (let i = 0; i < capped.length; i++) {
58
+ const item = capped[i];
59
+ if (item === null || typeof item !== 'object')
60
+ continue;
61
+ // Clamp value/effort to integers in 1..5
62
+ const rawValue = typeof item.value === 'number' ? item.value : 3;
63
+ const rawEffort = typeof item.effort === 'number' ? item.effort : 2;
64
+ const value = Math.max(1, Math.min(5, Math.round(rawValue)));
65
+ const effort = Math.max(1, Math.min(5, Math.round(rawEffort)));
66
+ // Recompute score via scoreItem (deterministic, pure)
67
+ const score = scoreItem(value, effort);
68
+ // Scrub secrets from title + detail
69
+ const rawTitle = typeof item.title === 'string' ? item.title : '';
70
+ const rawDetail = typeof item.detail === 'string' ? item.detail : '';
71
+ const title = scrubSecrets(rawTitle);
72
+ const detail = scrubSecrets(rawDetail);
73
+ // Namespace id: plugin:<name>:<s.id>:<orig-or-index>
74
+ const origId = typeof item.id === 'string' && item.id.length > 0 ? item.id : String(i);
75
+ const id = `plugin:${pluginName}:${s.id}:${origId}`;
76
+ // Force tags to include ['plugin', pluginName, s.id]
77
+ const baseTags = Array.isArray(item.tags)
78
+ ? item.tags.filter((t) => typeof t === 'string')
79
+ : [];
80
+ const requiredTags = ['plugin', pluginName, s.id];
81
+ const tags = [
82
+ ...requiredTags,
83
+ ...baseTags.filter((t) => !requiredTags.includes(t)),
84
+ ];
85
+ const wrapped = {
86
+ id,
87
+ repo: typeof item.repo === 'string' ? item.repo : repo,
88
+ source: 'plugin',
89
+ title,
90
+ detail,
91
+ value,
92
+ effort,
93
+ score,
94
+ tags,
95
+ ts: typeof item.ts === 'string' ? item.ts : new Date().toISOString(),
96
+ };
97
+ result.push(wrapped);
98
+ }
99
+ return result;
100
+ };
101
+ }
102
+ // ---------------------------------------------------------------------------
103
+ // validateTemplate
104
+ // ---------------------------------------------------------------------------
105
+ /**
106
+ * Validate and sanitize a plugin-contributed template.
107
+ *
108
+ * - Prefixes id with "<pluginName>:" unless it already starts with that prefix.
109
+ * - Rejects any template whose files() function (called with probe ctx) returns
110
+ * a path that is absolute, contains '..', or starts with '.git/'.
111
+ * - The files() function is wrapped: the path guard also runs on every future
112
+ * call so a template cannot sneak bad paths in via a closure.
113
+ * - Returns the sanitized template or null (rejection is audited).
114
+ *
115
+ * NEVER throws.
116
+ */
117
+ function checkFilePath(pluginName, templateId, p) {
118
+ if (p.startsWith('/')) {
119
+ return `plugin "${pluginName}" template "${templateId}" rejected: absolute path "${p}"`;
120
+ }
121
+ if (p.includes('..')) {
122
+ return `plugin "${pluginName}" template "${templateId}" rejected: traversal path "${p}"`;
123
+ }
124
+ if (p.startsWith('.git/')) {
125
+ return `plugin "${pluginName}" template "${templateId}" rejected: .git path "${p}"`;
126
+ }
127
+ return null;
128
+ }
129
+ export function validateTemplate(pluginName, t) {
130
+ try {
131
+ const prefix = `${pluginName}:`;
132
+ // Probe the files function with empty-string ctx to catch static bad paths.
133
+ let probeFiles;
134
+ try {
135
+ probeFiles = t.files({ name: '', category: '' });
136
+ }
137
+ catch {
138
+ // files() threw on probe — reject.
139
+ audit({
140
+ action: `plugin:${pluginName}:template-rejected`,
141
+ repo: null,
142
+ sandboxId: null,
143
+ summary: `plugin "${pluginName}" template "${t.id}" rejected: files() threw on probe`,
144
+ result: 'refused',
145
+ });
146
+ return null;
147
+ }
148
+ for (const f of probeFiles) {
149
+ const reason = checkFilePath(pluginName, t.id, f.path);
150
+ if (reason !== null) {
151
+ audit({
152
+ action: `plugin:${pluginName}:template-rejected`,
153
+ repo: null,
154
+ sandboxId: null,
155
+ summary: reason,
156
+ result: 'refused',
157
+ });
158
+ return null;
159
+ }
160
+ }
161
+ // Prefix id if not already prefixed.
162
+ const id = t.id.startsWith(prefix) ? t.id : `${prefix}${t.id}`;
163
+ // Wrap files() to enforce path guard on every call.
164
+ const safeFiles = (ctx) => {
165
+ let result;
166
+ try {
167
+ result = t.files(ctx);
168
+ }
169
+ catch {
170
+ return [];
171
+ }
172
+ return result.filter((f) => checkFilePath(pluginName, id, f.path) === null);
173
+ };
174
+ return { ...t, id, files: safeFiles };
175
+ }
176
+ catch {
177
+ // Belt-and-suspenders: validateTemplate must never throw.
178
+ return null;
179
+ }
180
+ }
181
+ // ---------------------------------------------------------------------------
182
+ // wrapCommand
183
+ // ---------------------------------------------------------------------------
184
+ /**
185
+ * Wrap a PluginCommandSpec for safety:
186
+ * - Audits invocation (action: "plugin:<name>:command:<cmd.name>").
187
+ * - Catches throws → returns exit code 1.
188
+ * - Audits the exit code (ok when 0, error otherwise).
189
+ *
190
+ * NEVER throws from the wrapper itself.
191
+ */
192
+ export function wrapCommand(pluginName, c) {
193
+ return {
194
+ ...c,
195
+ async run(args, host) {
196
+ audit({
197
+ action: `plugin:${pluginName}:command:${c.name}`,
198
+ repo: null,
199
+ sandboxId: null,
200
+ summary: `plugin "${pluginName}" command "${c.name}" invoked (${args.length} arg(s))`,
201
+ result: 'ok',
202
+ });
203
+ let exitCode;
204
+ try {
205
+ exitCode = await c.run(args, host);
206
+ }
207
+ catch (err) {
208
+ audit({
209
+ action: `plugin:${pluginName}:command:${c.name}:exit`,
210
+ repo: null,
211
+ sandboxId: null,
212
+ summary: `plugin "${pluginName}" command "${c.name}" threw: ${err instanceof Error ? err.message : String(err)}`,
213
+ result: 'error',
214
+ });
215
+ return 1;
216
+ }
217
+ const code = typeof exitCode === 'number' && Number.isFinite(exitCode) ? exitCode : 1;
218
+ audit({
219
+ action: `plugin:${pluginName}:command:${c.name}:exit`,
220
+ repo: null,
221
+ sandboxId: null,
222
+ summary: `plugin "${pluginName}" command "${c.name}" exited with code ${code}`,
223
+ result: code === 0 ? 'ok' : 'error',
224
+ });
225
+ return code;
226
+ },
227
+ };
228
+ }
229
+ //# sourceMappingURL=wrappers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wrappers.js","sourceRoot":"","sources":["../../../src/core/plugins/wrappers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * backlog.ts — Aggregated work-discovery backlog for enrolled repos.
3
+ *
4
+ * GUARDRAILS:
5
+ * - READ-ONLY: this module never writes to any scanned repo.
6
+ * - ENROLLMENT-SCOPED: only listEnrolled() repos are scanned (DEFAULT EMPTY).
7
+ * - Never throws: all errors are caught and produce empty/null results.
8
+ * - No secrets in persisted data (enforced by scanners + audit).
9
+ * - Persists atomically to ~/.ashlr/backlog.json.
10
+ */
11
+ import type { Backlog } from '../types.js';
12
+ /**
13
+ * Absolute path of the persisted backlog file: ~/.ashlr/backlog.json.
14
+ * Re-resolved at call time so tests can relocate HOME.
15
+ */
16
+ export declare function backlogPath(): string;
17
+ /**
18
+ * Priority score; higher = do first.
19
+ * Heuristic: value / effort (effort clamped >= 1; both clamped to 1..5).
20
+ * Deterministic, pure.
21
+ */
22
+ export declare function scoreItem(value: number, effort: number): number;
23
+ /**
24
+ * Load the persisted backlog from ~/.ashlr/backlog.json.
25
+ * Returns null if the file is absent or unreadable/malformed.
26
+ * Never throws.
27
+ */
28
+ export declare function loadBacklog(): Backlog | null;
29
+ /**
30
+ * Run all SCANNERS over each enrolled repo, aggregate, dedupe, score, persist,
31
+ * and return the Backlog.
32
+ *
33
+ * - Default repos = listEnrolled() (DEFAULT EMPTY => items: []).
34
+ * - Bounded concurrency: repos scanned sequentially; scanners within a repo
35
+ * run in parallel (each scanner is individually bounded + never throws).
36
+ * - Never throws: any scanner error yields [] (enforced by scanner contract).
37
+ */
38
+ export declare function buildBacklog(opts?: {
39
+ repos?: string[];
40
+ }): Promise<Backlog>;
@@ -0,0 +1,177 @@
1
+ /**
2
+ * backlog.ts — Aggregated work-discovery backlog for enrolled repos.
3
+ *
4
+ * GUARDRAILS:
5
+ * - READ-ONLY: this module never writes to any scanned repo.
6
+ * - ENROLLMENT-SCOPED: only listEnrolled() repos are scanned (DEFAULT EMPTY).
7
+ * - Never throws: all errors are caught and produce empty/null results.
8
+ * - No secrets in persisted data (enforced by scanners + audit).
9
+ * - Persists atomically to ~/.ashlr/backlog.json.
10
+ */
11
+ import { existsSync, mkdirSync, readFileSync, renameSync, writeFileSync } from 'node:fs';
12
+ import { homedir } from 'node:os';
13
+ import { join } from 'node:path';
14
+ import { listEnrolled } from '../sandbox/policy.js';
15
+ import { audit } from '../sandbox/audit.js';
16
+ // ---------------------------------------------------------------------------
17
+ // Path helpers
18
+ // ---------------------------------------------------------------------------
19
+ /**
20
+ * Absolute path of the persisted backlog file: ~/.ashlr/backlog.json.
21
+ * Re-resolved at call time so tests can relocate HOME.
22
+ */
23
+ export function backlogPath() {
24
+ return join(homedir(), '.ashlr', 'backlog.json');
25
+ }
26
+ // ---------------------------------------------------------------------------
27
+ // Scoring
28
+ // ---------------------------------------------------------------------------
29
+ /**
30
+ * Priority score; higher = do first.
31
+ * Heuristic: value / effort (effort clamped >= 1; both clamped to 1..5).
32
+ * Deterministic, pure.
33
+ */
34
+ export function scoreItem(value, effort) {
35
+ const v = Math.max(1, Math.min(5, value));
36
+ const e = Math.max(1, Math.min(5, effort));
37
+ return v / e;
38
+ }
39
+ // ---------------------------------------------------------------------------
40
+ // Persistence
41
+ // ---------------------------------------------------------------------------
42
+ /**
43
+ * Load the persisted backlog from ~/.ashlr/backlog.json.
44
+ * Returns null if the file is absent or unreadable/malformed.
45
+ * Never throws.
46
+ */
47
+ export function loadBacklog() {
48
+ try {
49
+ const p = backlogPath();
50
+ if (!existsSync(p))
51
+ return null;
52
+ const raw = readFileSync(p, 'utf8');
53
+ const parsed = JSON.parse(raw);
54
+ if (parsed !== null &&
55
+ typeof parsed === 'object' &&
56
+ !Array.isArray(parsed) &&
57
+ typeof parsed['generatedAt'] === 'string' &&
58
+ Array.isArray(parsed['repos']) &&
59
+ Array.isArray(parsed['items'])) {
60
+ return parsed;
61
+ }
62
+ return null;
63
+ }
64
+ catch {
65
+ return null;
66
+ }
67
+ }
68
+ /** Persist the backlog atomically (write + sync approach for node builtins). */
69
+ function persistBacklog(backlog) {
70
+ const p = backlogPath();
71
+ const dir = join(homedir(), '.ashlr');
72
+ if (!existsSync(dir)) {
73
+ mkdirSync(dir, { recursive: true });
74
+ }
75
+ // Atomic write: write to a temp file then rename. Node's fs.renameSync is
76
+ // atomic on POSIX within the same filesystem.
77
+ const tmp = p + '.tmp';
78
+ writeFileSync(tmp, JSON.stringify(backlog, null, 2) + '\n', 'utf8');
79
+ // Atomic rename: node:fs renameSync is atomic on POSIX within one filesystem.
80
+ renameSync(tmp, p);
81
+ }
82
+ // ---------------------------------------------------------------------------
83
+ // Deduplication helpers
84
+ // ---------------------------------------------------------------------------
85
+ function dedupeItems(items) {
86
+ const seen = new Set();
87
+ const out = [];
88
+ for (const item of items) {
89
+ if (!seen.has(item.id)) {
90
+ seen.add(item.id);
91
+ out.push(item);
92
+ }
93
+ }
94
+ return out;
95
+ }
96
+ async function getScanners() {
97
+ let builtin = [];
98
+ try {
99
+ const mod = await import('./scanners.js');
100
+ builtin = mod.SCANNERS;
101
+ }
102
+ catch {
103
+ builtin = [];
104
+ }
105
+ // M33: merge enabled-plugin scanners (already wrapped: bounded, never-throw,
106
+ // scrubbed, namespaced). Best-effort — a broken plugin layer never blocks
107
+ // the builtin sweep; with plugins.enabled [] this resolves to [].
108
+ let fromPlugins = [];
109
+ try {
110
+ const { loadConfig } = await import('../config.js');
111
+ const { getPluginScanners } = await import('../plugins/registry.js');
112
+ fromPlugins = await getPluginScanners(loadConfig());
113
+ }
114
+ catch {
115
+ fromPlugins = [];
116
+ }
117
+ return [...builtin, ...fromPlugins];
118
+ }
119
+ /**
120
+ * Run all SCANNERS over each enrolled repo, aggregate, dedupe, score, persist,
121
+ * and return the Backlog.
122
+ *
123
+ * - Default repos = listEnrolled() (DEFAULT EMPTY => items: []).
124
+ * - Bounded concurrency: repos scanned sequentially; scanners within a repo
125
+ * run in parallel (each scanner is individually bounded + never throws).
126
+ * - Never throws: any scanner error yields [] (enforced by scanner contract).
127
+ */
128
+ export async function buildBacklog(opts) {
129
+ const repos = opts?.repos ?? listEnrolled();
130
+ const scanners = await getScanners();
131
+ const now = new Date().toISOString();
132
+ const allItems = [];
133
+ // Repos scanned sequentially to avoid thundering-herd on gh/npm APIs.
134
+ for (const repo of repos) {
135
+ // Scanners within each repo run in parallel; each is bounded + never throws.
136
+ const perScannerResults = await Promise.all(scanners.map(async (scanner) => {
137
+ try {
138
+ return await scanner(repo);
139
+ }
140
+ catch {
141
+ // Belt-and-suspenders: scanners must not throw, but we catch anyway.
142
+ return [];
143
+ }
144
+ }));
145
+ for (const items of perScannerResults) {
146
+ allItems.push(...items);
147
+ }
148
+ }
149
+ // Dedupe by id, recompute score, sort descending.
150
+ const deduped = dedupeItems(allItems).map((item) => ({
151
+ ...item,
152
+ score: scoreItem(item.value, item.effort),
153
+ }));
154
+ deduped.sort((a, b) => b.score - a.score);
155
+ const backlog = {
156
+ generatedAt: now,
157
+ repos,
158
+ items: deduped,
159
+ };
160
+ // Persist; never throw on persistence failure.
161
+ try {
162
+ persistBacklog(backlog);
163
+ }
164
+ catch {
165
+ // Persistence failure does not prevent returning the in-memory backlog.
166
+ }
167
+ // Audit record (metadata only; never secrets).
168
+ audit({
169
+ action: 'backlog:refresh',
170
+ repo: null,
171
+ sandboxId: null,
172
+ summary: `backlog refreshed: ${repos.length} repo(s), ${deduped.length} item(s)`,
173
+ result: 'ok',
174
+ });
175
+ return backlog;
176
+ }
177
+ //# sourceMappingURL=backlog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backlog.js","sourceRoot":"","sources":["../../../src/core/portfolio/backlog.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * portfolio/scanners.ts — Work-discovery scanners for `ashlr backlog`.
3
+ *
4
+ * GUARDRAILS (enforced throughout this file):
5
+ * - READ-ONLY: no file writes, no git mutations, no installs, no fixes,
6
+ * no `npm test`/`npm run build`.
7
+ * - No shell: all child-process invocations use execFile with arg arrays
8
+ * (no shell:true, no string interpolation of repo paths into a shell string).
9
+ * - Bounded: skip node_modules/.git/dist/build; cap output/files/time.
10
+ * - Never throws: every scanner returns [] on any error/timeout/missing-tool.
11
+ * - Enrollment-scoped: callers (buildBacklog) only pass listEnrolled() paths.
12
+ * - No secrets in any emitted WorkItem.
13
+ */
14
+ import type { WorkItem } from '../types.js';
15
+ export declare function scanIssues(repo: string): Promise<WorkItem[]>;
16
+ export declare function scanTodos(repo: string): Promise<WorkItem[]>;
17
+ export declare function scanTests(repo: string): Promise<WorkItem[]>;
18
+ export declare function scanDeps(repo: string): Promise<WorkItem[]>;
19
+ export declare function scanDocs(repo: string): Promise<WorkItem[]>;
20
+ export declare function scanSecurity(repo: string): Promise<WorkItem[]>;
21
+ export declare const SCANNERS: ReadonlyArray<(repo: string) => Promise<WorkItem[]>>;