agent-bober 0.18.0 → 0.19.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 (824) hide show
  1. package/.claude-plugin/plugin.json +1 -1
  2. package/CHANGELOG.md +11 -0
  3. package/README.md +245 -6
  4. package/agents/bober-art-director.md +100 -0
  5. package/agents/bober-design-critic.md +114 -0
  6. package/agents/bober-frontend-builder.md +101 -0
  7. package/agents/bober-security-auditor.md +193 -0
  8. package/agents/bober-security-verifier.md +104 -0
  9. package/agents/bober-seo-strategist.md +144 -0
  10. package/agents/bober-seo-verifier.md +103 -0
  11. package/dist/calendar/calendar-egress.d.ts +26 -0
  12. package/dist/calendar/calendar-egress.d.ts.map +1 -0
  13. package/dist/calendar/calendar-egress.js +35 -0
  14. package/dist/calendar/calendar-egress.js.map +1 -0
  15. package/dist/calendar/calendar-token.d.ts +34 -0
  16. package/dist/calendar/calendar-token.d.ts.map +1 -0
  17. package/dist/calendar/calendar-token.js +56 -0
  18. package/dist/calendar/calendar-token.js.map +1 -0
  19. package/dist/calendar/connector.d.ts +22 -0
  20. package/dist/calendar/connector.d.ts.map +1 -0
  21. package/dist/calendar/connector.js +3 -0
  22. package/dist/calendar/connector.js.map +1 -0
  23. package/dist/calendar/finding-source.d.ts +20 -0
  24. package/dist/calendar/finding-source.d.ts.map +1 -0
  25. package/dist/calendar/finding-source.js +35 -0
  26. package/dist/calendar/finding-source.js.map +1 -0
  27. package/dist/calendar/google-connector.d.ts +65 -0
  28. package/dist/calendar/google-connector.d.ts.map +1 -0
  29. package/dist/calendar/google-connector.js +129 -0
  30. package/dist/calendar/google-connector.js.map +1 -0
  31. package/dist/calendar/ics-connector.d.ts +12 -0
  32. package/dist/calendar/ics-connector.d.ts.map +1 -0
  33. package/dist/calendar/ics-connector.js +48 -0
  34. package/dist/calendar/ics-connector.js.map +1 -0
  35. package/dist/calendar/proposal-gate.d.ts +84 -0
  36. package/dist/calendar/proposal-gate.d.ts.map +1 -0
  37. package/dist/calendar/proposal-gate.js +126 -0
  38. package/dist/calendar/proposal-gate.js.map +1 -0
  39. package/dist/calendar/slotter.d.ts +34 -0
  40. package/dist/calendar/slotter.d.ts.map +1 -0
  41. package/dist/calendar/slotter.js +196 -0
  42. package/dist/calendar/slotter.js.map +1 -0
  43. package/dist/calendar/types.d.ts +162 -0
  44. package/dist/calendar/types.d.ts.map +1 -0
  45. package/dist/calendar/types.js +28 -0
  46. package/dist/calendar/types.js.map +1 -0
  47. package/dist/chat/chat-session.d.ts +27 -0
  48. package/dist/chat/chat-session.d.ts.map +1 -1
  49. package/dist/chat/chat-session.js +101 -1
  50. package/dist/chat/chat-session.js.map +1 -1
  51. package/dist/chat/slash-commands.d.ts +6 -2
  52. package/dist/chat/slash-commands.d.ts.map +1 -1
  53. package/dist/chat/slash-commands.js +22 -2
  54. package/dist/chat/slash-commands.js.map +1 -1
  55. package/dist/chat/turn-classifier.d.ts +3 -0
  56. package/dist/chat/turn-classifier.d.ts.map +1 -1
  57. package/dist/chat/turn-classifier.js +7 -0
  58. package/dist/chat/turn-classifier.js.map +1 -1
  59. package/dist/cli/commands/calendar.d.ts +75 -0
  60. package/dist/cli/commands/calendar.d.ts.map +1 -0
  61. package/dist/cli/commands/calendar.js +203 -0
  62. package/dist/cli/commands/calendar.js.map +1 -0
  63. package/dist/cli/commands/do.d.ts +52 -0
  64. package/dist/cli/commands/do.d.ts.map +1 -0
  65. package/dist/cli/commands/do.js +216 -0
  66. package/dist/cli/commands/do.js.map +1 -0
  67. package/dist/cli/commands/hub.d.ts +29 -0
  68. package/dist/cli/commands/hub.d.ts.map +1 -0
  69. package/dist/cli/commands/hub.js +233 -0
  70. package/dist/cli/commands/hub.js.map +1 -0
  71. package/dist/cli/commands/medical.d.ts +25 -0
  72. package/dist/cli/commands/medical.d.ts.map +1 -1
  73. package/dist/cli/commands/medical.js +233 -0
  74. package/dist/cli/commands/medical.js.map +1 -1
  75. package/dist/cli/commands/research.d.ts +41 -0
  76. package/dist/cli/commands/research.d.ts.map +1 -0
  77. package/dist/cli/commands/research.js +313 -0
  78. package/dist/cli/commands/research.js.map +1 -0
  79. package/dist/cli/commands/security-audit.d.ts +89 -0
  80. package/dist/cli/commands/security-audit.d.ts.map +1 -0
  81. package/dist/cli/commands/security-audit.js +238 -0
  82. package/dist/cli/commands/security-audit.js.map +1 -0
  83. package/dist/cli/commands/task.d.ts +64 -0
  84. package/dist/cli/commands/task.d.ts.map +1 -0
  85. package/dist/cli/commands/task.js +422 -0
  86. package/dist/cli/commands/task.js.map +1 -0
  87. package/dist/cli/commands/telegram.d.ts +10 -0
  88. package/dist/cli/commands/telegram.d.ts.map +1 -0
  89. package/dist/cli/commands/telegram.js +44 -0
  90. package/dist/cli/commands/telegram.js.map +1 -0
  91. package/dist/cli/commands/vault.d.ts +40 -0
  92. package/dist/cli/commands/vault.d.ts.map +1 -0
  93. package/dist/cli/commands/vault.js +122 -0
  94. package/dist/cli/commands/vault.js.map +1 -0
  95. package/dist/cli/index.js +33 -0
  96. package/dist/cli/index.js.map +1 -1
  97. package/dist/config/role-providers.d.ts +15 -0
  98. package/dist/config/role-providers.d.ts.map +1 -1
  99. package/dist/config/role-providers.js +8 -1
  100. package/dist/config/role-providers.js.map +1 -1
  101. package/dist/config/schema.d.ts +3522 -171
  102. package/dist/config/schema.d.ts.map +1 -1
  103. package/dist/config/schema.js +405 -2
  104. package/dist/config/schema.js.map +1 -1
  105. package/dist/do-bridge/coding-promoter.d.ts +19 -0
  106. package/dist/do-bridge/coding-promoter.d.ts.map +1 -0
  107. package/dist/do-bridge/coding-promoter.js +43 -0
  108. package/dist/do-bridge/coding-promoter.js.map +1 -0
  109. package/dist/do-bridge/finding-port.d.ts +88 -0
  110. package/dist/do-bridge/finding-port.d.ts.map +1 -0
  111. package/dist/do-bridge/finding-port.js +95 -0
  112. package/dist/do-bridge/finding-port.js.map +1 -0
  113. package/dist/do-bridge/launcher.d.ts +55 -0
  114. package/dist/do-bridge/launcher.d.ts.map +1 -0
  115. package/dist/do-bridge/launcher.js +37 -0
  116. package/dist/do-bridge/launcher.js.map +1 -0
  117. package/dist/do-bridge/promote.d.ts +50 -0
  118. package/dist/do-bridge/promote.d.ts.map +1 -0
  119. package/dist/do-bridge/promote.js +116 -0
  120. package/dist/do-bridge/promote.js.map +1 -0
  121. package/dist/do-bridge/reconcile.d.ts +50 -0
  122. package/dist/do-bridge/reconcile.d.ts.map +1 -0
  123. package/dist/do-bridge/reconcile.js +70 -0
  124. package/dist/do-bridge/reconcile.js.map +1 -0
  125. package/dist/do-bridge/registry.d.ts +23 -0
  126. package/dist/do-bridge/registry.d.ts.map +1 -0
  127. package/dist/do-bridge/registry.js +42 -0
  128. package/dist/do-bridge/registry.js.map +1 -0
  129. package/dist/do-bridge/types.d.ts +50 -0
  130. package/dist/do-bridge/types.d.ts.map +1 -0
  131. package/dist/do-bridge/types.js +17 -0
  132. package/dist/do-bridge/types.js.map +1 -0
  133. package/dist/fleet/child-config.d.ts.map +1 -1
  134. package/dist/fleet/child-config.js +7 -0
  135. package/dist/fleet/child-config.js.map +1 -1
  136. package/dist/fleet/coordinator.d.ts +27 -1
  137. package/dist/fleet/coordinator.d.ts.map +1 -1
  138. package/dist/fleet/coordinator.js +70 -0
  139. package/dist/fleet/coordinator.js.map +1 -1
  140. package/dist/fleet/critic-deep.d.ts +9 -1
  141. package/dist/fleet/critic-deep.d.ts.map +1 -1
  142. package/dist/fleet/critic-deep.js +5 -2
  143. package/dist/fleet/critic-deep.js.map +1 -1
  144. package/dist/fleet/decomposer-deep.d.ts +4 -11
  145. package/dist/fleet/decomposer-deep.d.ts.map +1 -1
  146. package/dist/fleet/decomposer-deep.js +5 -5
  147. package/dist/fleet/decomposer-deep.js.map +1 -1
  148. package/dist/fleet/index.d.ts +9 -0
  149. package/dist/fleet/index.d.ts.map +1 -1
  150. package/dist/fleet/index.js +87 -8
  151. package/dist/fleet/index.js.map +1 -1
  152. package/dist/fleet/manifest.d.ts +26 -0
  153. package/dist/fleet/manifest.d.ts.map +1 -1
  154. package/dist/fleet/manifest.js +8 -0
  155. package/dist/fleet/manifest.js.map +1 -1
  156. package/dist/fleet/reporter.d.ts +4 -1
  157. package/dist/fleet/reporter.d.ts.map +1 -1
  158. package/dist/fleet/reporter.js +2 -1
  159. package/dist/fleet/reporter.js.map +1 -1
  160. package/dist/fleet/scaffolder.d.ts +5 -1
  161. package/dist/fleet/scaffolder.d.ts.map +1 -1
  162. package/dist/fleet/scaffolder.js +11 -2
  163. package/dist/fleet/scaffolder.js.map +1 -1
  164. package/dist/graph/client.d.ts.map +1 -1
  165. package/dist/graph/client.js +115 -23
  166. package/dist/graph/client.js.map +1 -1
  167. package/dist/graph/mcp-client.d.ts +1 -0
  168. package/dist/graph/mcp-client.d.ts.map +1 -1
  169. package/dist/graph/mcp-client.js +58 -7
  170. package/dist/graph/mcp-client.js.map +1 -1
  171. package/dist/hub/collector.d.ts +12 -0
  172. package/dist/hub/collector.d.ts.map +1 -0
  173. package/dist/hub/collector.js +36 -0
  174. package/dist/hub/collector.js.map +1 -0
  175. package/dist/hub/finding-source.d.ts +22 -0
  176. package/dist/hub/finding-source.d.ts.map +1 -0
  177. package/dist/hub/finding-source.js +41 -0
  178. package/dist/hub/finding-source.js.map +1 -0
  179. package/dist/hub/finding-store.d.ts +68 -0
  180. package/dist/hub/finding-store.d.ts.map +1 -0
  181. package/dist/hub/finding-store.js +122 -0
  182. package/dist/hub/finding-store.js.map +1 -0
  183. package/dist/hub/finding.d.ts +54 -0
  184. package/dist/hub/finding.d.ts.map +1 -0
  185. package/dist/hub/finding.js +24 -0
  186. package/dist/hub/finding.js.map +1 -0
  187. package/dist/hub/gmail-to-task.d.ts +69 -0
  188. package/dist/hub/gmail-to-task.d.ts.map +1 -0
  189. package/dist/hub/gmail-to-task.js +102 -0
  190. package/dist/hub/gmail-to-task.js.map +1 -0
  191. package/dist/hub/hub-config.d.ts +18 -0
  192. package/dist/hub/hub-config.d.ts.map +1 -0
  193. package/dist/hub/hub-config.js +40 -0
  194. package/dist/hub/hub-config.js.map +1 -0
  195. package/dist/hub/judge.d.ts +30 -0
  196. package/dist/hub/judge.d.ts.map +1 -0
  197. package/dist/hub/judge.js +177 -0
  198. package/dist/hub/judge.js.map +1 -0
  199. package/dist/hub/lenses.d.ts +60 -0
  200. package/dist/hub/lenses.d.ts.map +1 -0
  201. package/dist/hub/lenses.js +123 -0
  202. package/dist/hub/lenses.js.map +1 -0
  203. package/dist/hub/priority-md.d.ts +21 -0
  204. package/dist/hub/priority-md.d.ts.map +1 -0
  205. package/dist/hub/priority-md.js +64 -0
  206. package/dist/hub/priority-md.js.map +1 -0
  207. package/dist/hub/repo-resolver.d.ts +11 -0
  208. package/dist/hub/repo-resolver.d.ts.map +1 -0
  209. package/dist/hub/repo-resolver.js +39 -0
  210. package/dist/hub/repo-resolver.js.map +1 -0
  211. package/dist/hub/scope.d.ts +39 -0
  212. package/dist/hub/scope.d.ts.map +1 -0
  213. package/dist/hub/scope.js +62 -0
  214. package/dist/hub/scope.js.map +1 -0
  215. package/dist/hub/task-inbox.d.ts +16 -0
  216. package/dist/hub/task-inbox.d.ts.map +1 -0
  217. package/dist/hub/task-inbox.js +39 -0
  218. package/dist/hub/task-inbox.js.map +1 -0
  219. package/dist/incident/resolution-verify.d.ts +2 -2
  220. package/dist/index.d.ts +2 -1
  221. package/dist/index.d.ts.map +1 -1
  222. package/dist/index.js +2 -1
  223. package/dist/index.js.map +1 -1
  224. package/dist/medical/adapters/apple-health.js +1 -1
  225. package/dist/medical/adapters/apple-health.js.map +1 -1
  226. package/dist/medical/analysis/cadence.d.ts +32 -0
  227. package/dist/medical/analysis/cadence.d.ts.map +1 -0
  228. package/dist/medical/analysis/cadence.js +72 -0
  229. package/dist/medical/analysis/cadence.js.map +1 -0
  230. package/dist/medical/analysis/cross-marker.d.ts +33 -0
  231. package/dist/medical/analysis/cross-marker.d.ts.map +1 -0
  232. package/dist/medical/analysis/cross-marker.js +79 -0
  233. package/dist/medical/analysis/cross-marker.js.map +1 -0
  234. package/dist/medical/analysis/finding-writer.d.ts +26 -0
  235. package/dist/medical/analysis/finding-writer.d.ts.map +1 -0
  236. package/dist/medical/analysis/finding-writer.js +60 -0
  237. package/dist/medical/analysis/finding-writer.js.map +1 -0
  238. package/dist/medical/analysis/finding.d.ts +63 -0
  239. package/dist/medical/analysis/finding.d.ts.map +1 -0
  240. package/dist/medical/analysis/finding.js +70 -0
  241. package/dist/medical/analysis/finding.js.map +1 -0
  242. package/dist/medical/analysis/review-pass.d.ts +76 -0
  243. package/dist/medical/analysis/review-pass.d.ts.map +1 -0
  244. package/dist/medical/analysis/review-pass.js +119 -0
  245. package/dist/medical/analysis/review-pass.js.map +1 -0
  246. package/dist/medical/analysis/trends.d.ts +36 -0
  247. package/dist/medical/analysis/trends.d.ts.map +1 -0
  248. package/dist/medical/analysis/trends.js +157 -0
  249. package/dist/medical/analysis/trends.js.map +1 -0
  250. package/dist/medical/health-store.d.ts +5 -0
  251. package/dist/medical/health-store.d.ts.map +1 -1
  252. package/dist/medical/health-store.js +10 -0
  253. package/dist/medical/health-store.js.map +1 -1
  254. package/dist/medical/lab-note.d.ts +72 -0
  255. package/dist/medical/lab-note.d.ts.map +1 -0
  256. package/dist/medical/lab-note.js +161 -0
  257. package/dist/medical/lab-note.js.map +1 -0
  258. package/dist/medical/lab-pdf-parser.d.ts +19 -0
  259. package/dist/medical/lab-pdf-parser.d.ts.map +1 -0
  260. package/dist/medical/lab-pdf-parser.js +57 -0
  261. package/dist/medical/lab-pdf-parser.js.map +1 -0
  262. package/dist/medical/lab-reindex.d.ts +24 -0
  263. package/dist/medical/lab-reindex.d.ts.map +1 -0
  264. package/dist/medical/lab-reindex.js +45 -0
  265. package/dist/medical/lab-reindex.js.map +1 -0
  266. package/dist/medical/lab-types.d.ts +75 -0
  267. package/dist/medical/lab-types.d.ts.map +1 -0
  268. package/dist/medical/lab-types.js +17 -0
  269. package/dist/medical/lab-types.js.map +1 -0
  270. package/dist/medical/profile.d.ts +96 -0
  271. package/dist/medical/profile.d.ts.map +1 -0
  272. package/dist/medical/profile.js +273 -0
  273. package/dist/medical/profile.js.map +1 -0
  274. package/dist/medical/recommend/context.d.ts +48 -0
  275. package/dist/medical/recommend/context.d.ts.map +1 -0
  276. package/dist/medical/recommend/context.js +109 -0
  277. package/dist/medical/recommend/context.js.map +1 -0
  278. package/dist/medical/recommend/judge-panel.d.ts +49 -0
  279. package/dist/medical/recommend/judge-panel.d.ts.map +1 -0
  280. package/dist/medical/recommend/judge-panel.js +164 -0
  281. package/dist/medical/recommend/judge-panel.js.map +1 -0
  282. package/dist/medical/recommend/lenses.d.ts +72 -0
  283. package/dist/medical/recommend/lenses.d.ts.map +1 -0
  284. package/dist/medical/recommend/lenses.js +220 -0
  285. package/dist/medical/recommend/lenses.js.map +1 -0
  286. package/dist/medical/recommend/recommend.d.ts +86 -0
  287. package/dist/medical/recommend/recommend.d.ts.map +1 -0
  288. package/dist/medical/recommend/recommend.js +211 -0
  289. package/dist/medical/recommend/recommend.js.map +1 -0
  290. package/dist/medical/recommend/types.d.ts +98 -0
  291. package/dist/medical/recommend/types.d.ts.map +1 -0
  292. package/dist/medical/recommend/types.js +20 -0
  293. package/dist/medical/recommend/types.js.map +1 -0
  294. package/dist/medical/recommend/urgency.d.ts +26 -0
  295. package/dist/medical/recommend/urgency.d.ts.map +1 -0
  296. package/dist/medical/recommend/urgency.js +124 -0
  297. package/dist/medical/recommend/urgency.js.map +1 -0
  298. package/dist/medical/research/online-research.d.ts +65 -0
  299. package/dist/medical/research/online-research.d.ts.map +1 -0
  300. package/dist/medical/research/online-research.js +101 -0
  301. package/dist/medical/research/online-research.js.map +1 -0
  302. package/dist/medical/research/research-note.d.ts +32 -0
  303. package/dist/medical/research/research-note.d.ts.map +1 -0
  304. package/dist/medical/research/research-note.js +55 -0
  305. package/dist/medical/research/research-note.js.map +1 -0
  306. package/dist/medical/supplements.d.ts +82 -0
  307. package/dist/medical/supplements.d.ts.map +1 -0
  308. package/dist/medical/supplements.js +173 -0
  309. package/dist/medical/supplements.js.map +1 -0
  310. package/dist/orchestrator/agentic-loop.d.ts +160 -1
  311. package/dist/orchestrator/agentic-loop.d.ts.map +1 -1
  312. package/dist/orchestrator/agentic-loop.js +350 -41
  313. package/dist/orchestrator/agentic-loop.js.map +1 -1
  314. package/dist/orchestrator/compaction.d.ts +47 -0
  315. package/dist/orchestrator/compaction.d.ts.map +1 -0
  316. package/dist/orchestrator/compaction.js +75 -0
  317. package/dist/orchestrator/compaction.js.map +1 -0
  318. package/dist/orchestrator/generator-agent.d.ts +19 -0
  319. package/dist/orchestrator/generator-agent.d.ts.map +1 -1
  320. package/dist/orchestrator/generator-agent.js +27 -1
  321. package/dist/orchestrator/generator-agent.js.map +1 -1
  322. package/dist/orchestrator/loop-events.d.ts +98 -0
  323. package/dist/orchestrator/loop-events.d.ts.map +1 -0
  324. package/dist/orchestrator/loop-events.js +2 -0
  325. package/dist/orchestrator/loop-events.js.map +1 -0
  326. package/dist/orchestrator/model-resolver.d.ts.map +1 -1
  327. package/dist/orchestrator/model-resolver.js +10 -6
  328. package/dist/orchestrator/model-resolver.js.map +1 -1
  329. package/dist/orchestrator/pipeline.d.ts +10 -1
  330. package/dist/orchestrator/pipeline.d.ts.map +1 -1
  331. package/dist/orchestrator/pipeline.js +102 -4
  332. package/dist/orchestrator/pipeline.js.map +1 -1
  333. package/dist/orchestrator/security-audit-types.d.ts +53 -0
  334. package/dist/orchestrator/security-audit-types.d.ts.map +1 -0
  335. package/dist/orchestrator/security-audit-types.js +10 -0
  336. package/dist/orchestrator/security-audit-types.js.map +1 -0
  337. package/dist/orchestrator/security-auditor-agent.d.ts +68 -0
  338. package/dist/orchestrator/security-auditor-agent.d.ts.map +1 -0
  339. package/dist/orchestrator/security-auditor-agent.js +482 -0
  340. package/dist/orchestrator/security-auditor-agent.js.map +1 -0
  341. package/dist/orchestrator/security-gate.d.ts +73 -0
  342. package/dist/orchestrator/security-gate.d.ts.map +1 -0
  343. package/dist/orchestrator/security-gate.js +174 -0
  344. package/dist/orchestrator/security-gate.js.map +1 -0
  345. package/dist/orchestrator/security-hub.d.ts +45 -0
  346. package/dist/orchestrator/security-hub.d.ts.map +1 -0
  347. package/dist/orchestrator/security-hub.js +147 -0
  348. package/dist/orchestrator/security-hub.js.map +1 -0
  349. package/dist/orchestrator/security-knowledge/benchmark/harness.d.ts +43 -0
  350. package/dist/orchestrator/security-knowledge/benchmark/harness.d.ts.map +1 -0
  351. package/dist/orchestrator/security-knowledge/benchmark/harness.js +13 -0
  352. package/dist/orchestrator/security-knowledge/benchmark/harness.js.map +1 -0
  353. package/dist/orchestrator/security-knowledge/diff-provider.d.ts +79 -0
  354. package/dist/orchestrator/security-knowledge/diff-provider.d.ts.map +1 -0
  355. package/dist/orchestrator/security-knowledge/diff-provider.js +320 -0
  356. package/dist/orchestrator/security-knowledge/diff-provider.js.map +1 -0
  357. package/dist/orchestrator/security-knowledge/index.d.ts +22 -0
  358. package/dist/orchestrator/security-knowledge/index.d.ts.map +1 -0
  359. package/dist/orchestrator/security-knowledge/index.js +66 -0
  360. package/dist/orchestrator/security-knowledge/index.js.map +1 -0
  361. package/dist/orchestrator/security-knowledge/parser.d.ts +9 -0
  362. package/dist/orchestrator/security-knowledge/parser.d.ts.map +1 -0
  363. package/dist/orchestrator/security-knowledge/parser.js +137 -0
  364. package/dist/orchestrator/security-knowledge/parser.js.map +1 -0
  365. package/dist/orchestrator/security-knowledge/registry.d.ts +25 -0
  366. package/dist/orchestrator/security-knowledge/registry.d.ts.map +1 -0
  367. package/dist/orchestrator/security-knowledge/registry.js +114 -0
  368. package/dist/orchestrator/security-knowledge/registry.js.map +1 -0
  369. package/dist/orchestrator/security-knowledge/resolver.d.ts +48 -0
  370. package/dist/orchestrator/security-knowledge/resolver.d.ts.map +1 -0
  371. package/dist/orchestrator/security-knowledge/resolver.js +63 -0
  372. package/dist/orchestrator/security-knowledge/resolver.js.map +1 -0
  373. package/dist/orchestrator/security-knowledge/selector.d.ts +18 -0
  374. package/dist/orchestrator/security-knowledge/selector.d.ts.map +1 -0
  375. package/dist/orchestrator/security-knowledge/selector.js +46 -0
  376. package/dist/orchestrator/security-knowledge/selector.js.map +1 -0
  377. package/dist/orchestrator/security-knowledge/signature.d.ts +37 -0
  378. package/dist/orchestrator/security-knowledge/signature.d.ts.map +1 -0
  379. package/dist/orchestrator/security-knowledge/signature.js +2 -0
  380. package/dist/orchestrator/security-knowledge/signature.js.map +1 -0
  381. package/dist/orchestrator/security-knowledge/supply-chain-inspector.d.ts +29 -0
  382. package/dist/orchestrator/security-knowledge/supply-chain-inspector.d.ts.map +1 -0
  383. package/dist/orchestrator/security-knowledge/supply-chain-inspector.js +211 -0
  384. package/dist/orchestrator/security-knowledge/supply-chain-inspector.js.map +1 -0
  385. package/dist/orchestrator/security-scanners.d.ts +126 -0
  386. package/dist/orchestrator/security-scanners.d.ts.map +1 -0
  387. package/dist/orchestrator/security-scanners.js +501 -0
  388. package/dist/orchestrator/security-scanners.js.map +1 -0
  389. package/dist/orchestrator/security-verifier-agent.d.ts +62 -0
  390. package/dist/orchestrator/security-verifier-agent.d.ts.map +1 -0
  391. package/dist/orchestrator/security-verifier-agent.js +230 -0
  392. package/dist/orchestrator/security-verifier-agent.js.map +1 -0
  393. package/dist/orchestrator/session-store.d.ts +95 -0
  394. package/dist/orchestrator/session-store.d.ts.map +1 -0
  395. package/dist/orchestrator/session-store.js +186 -0
  396. package/dist/orchestrator/session-store.js.map +1 -0
  397. package/dist/orchestrator/stack-knowledge.d.ts +17 -0
  398. package/dist/orchestrator/stack-knowledge.d.ts.map +1 -0
  399. package/dist/orchestrator/stack-knowledge.js +35 -0
  400. package/dist/orchestrator/stack-knowledge.js.map +1 -0
  401. package/dist/orchestrator/subagents.d.ts +62 -0
  402. package/dist/orchestrator/subagents.d.ts.map +1 -0
  403. package/dist/orchestrator/subagents.js +143 -0
  404. package/dist/orchestrator/subagents.js.map +1 -0
  405. package/dist/orchestrator/tools/executor.d.ts +68 -0
  406. package/dist/orchestrator/tools/executor.d.ts.map +1 -0
  407. package/dist/orchestrator/tools/executor.js +104 -0
  408. package/dist/orchestrator/tools/executor.js.map +1 -0
  409. package/dist/orchestrator/tools/mcp-bridge.d.ts +76 -0
  410. package/dist/orchestrator/tools/mcp-bridge.d.ts.map +1 -0
  411. package/dist/orchestrator/tools/mcp-bridge.js +154 -0
  412. package/dist/orchestrator/tools/mcp-bridge.js.map +1 -0
  413. package/dist/orchestrator/tools/schemas.d.ts.map +1 -1
  414. package/dist/orchestrator/tools/schemas.js +3 -0
  415. package/dist/orchestrator/tools/schemas.js.map +1 -1
  416. package/dist/orchestrator/workflow/budget.d.ts +24 -2
  417. package/dist/orchestrator/workflow/budget.d.ts.map +1 -1
  418. package/dist/orchestrator/workflow/budget.js +39 -1
  419. package/dist/orchestrator/workflow/budget.js.map +1 -1
  420. package/dist/orchestrator/workflow/engine.d.ts +1 -1
  421. package/dist/orchestrator/workflow/engine.d.ts.map +1 -1
  422. package/dist/orchestrator/workflow/selector.d.ts.map +1 -1
  423. package/dist/orchestrator/workflow/selector.js +10 -0
  424. package/dist/orchestrator/workflow/selector.js.map +1 -1
  425. package/dist/providers/anthropic.d.ts.map +1 -1
  426. package/dist/providers/anthropic.js +116 -26
  427. package/dist/providers/anthropic.js.map +1 -1
  428. package/dist/providers/claude-code.d.ts.map +1 -1
  429. package/dist/providers/claude-code.js +17 -0
  430. package/dist/providers/claude-code.js.map +1 -1
  431. package/dist/providers/cost-meter.d.ts +52 -0
  432. package/dist/providers/cost-meter.d.ts.map +1 -0
  433. package/dist/providers/cost-meter.js +81 -0
  434. package/dist/providers/cost-meter.js.map +1 -0
  435. package/dist/providers/factory.d.ts +6 -1
  436. package/dist/providers/factory.d.ts.map +1 -1
  437. package/dist/providers/factory.js +24 -5
  438. package/dist/providers/factory.js.map +1 -1
  439. package/dist/providers/google.d.ts.map +1 -1
  440. package/dist/providers/google.js +29 -0
  441. package/dist/providers/google.js.map +1 -1
  442. package/dist/providers/grounded-search.d.ts +128 -0
  443. package/dist/providers/grounded-search.d.ts.map +1 -0
  444. package/dist/providers/grounded-search.js +160 -0
  445. package/dist/providers/grounded-search.js.map +1 -0
  446. package/dist/providers/openai-compat.d.ts +15 -1
  447. package/dist/providers/openai-compat.d.ts.map +1 -1
  448. package/dist/providers/openai-compat.js +24 -0
  449. package/dist/providers/openai-compat.js.map +1 -1
  450. package/dist/providers/openai.d.ts +7 -0
  451. package/dist/providers/openai.d.ts.map +1 -1
  452. package/dist/providers/openai.js +95 -4
  453. package/dist/providers/openai.js.map +1 -1
  454. package/dist/providers/types.d.ts +88 -0
  455. package/dist/providers/types.d.ts.map +1 -1
  456. package/dist/research/cadence.d.ts +33 -0
  457. package/dist/research/cadence.d.ts.map +1 -0
  458. package/dist/research/cadence.js +55 -0
  459. package/dist/research/cadence.js.map +1 -0
  460. package/dist/research/digest.d.ts +80 -0
  461. package/dist/research/digest.d.ts.map +1 -0
  462. package/dist/research/digest.js +119 -0
  463. package/dist/research/digest.js.map +1 -0
  464. package/dist/research/egress.d.ts +28 -0
  465. package/dist/research/egress.d.ts.map +1 -0
  466. package/dist/research/egress.js +41 -0
  467. package/dist/research/egress.js.map +1 -0
  468. package/dist/research/job-store.d.ts +30 -0
  469. package/dist/research/job-store.d.ts.map +1 -0
  470. package/dist/research/job-store.js +100 -0
  471. package/dist/research/job-store.js.map +1 -0
  472. package/dist/research/model-diversity.d.ts +27 -0
  473. package/dist/research/model-diversity.d.ts.map +1 -0
  474. package/dist/research/model-diversity.js +52 -0
  475. package/dist/research/model-diversity.js.map +1 -0
  476. package/dist/research/note-writer.d.ts +36 -0
  477. package/dist/research/note-writer.d.ts.map +1 -0
  478. package/dist/research/note-writer.js +53 -0
  479. package/dist/research/note-writer.js.map +1 -0
  480. package/dist/research/online-retrieval.d.ts +27 -0
  481. package/dist/research/online-retrieval.d.ts.map +1 -0
  482. package/dist/research/online-retrieval.js +22 -0
  483. package/dist/research/online-retrieval.js.map +1 -0
  484. package/dist/research/runner.d.ts +80 -0
  485. package/dist/research/runner.d.ts.map +1 -0
  486. package/dist/research/runner.js +115 -0
  487. package/dist/research/runner.js.map +1 -0
  488. package/dist/research/scheduler.d.ts +61 -0
  489. package/dist/research/scheduler.d.ts.map +1 -0
  490. package/dist/research/scheduler.js +58 -0
  491. package/dist/research/scheduler.js.map +1 -0
  492. package/dist/research/types.d.ts +81 -0
  493. package/dist/research/types.d.ts.map +1 -0
  494. package/dist/research/types.js +57 -0
  495. package/dist/research/types.js.map +1 -0
  496. package/dist/seo/adapters/http.d.ts +43 -0
  497. package/dist/seo/adapters/http.d.ts.map +1 -0
  498. package/dist/seo/adapters/http.js +35 -0
  499. package/dist/seo/adapters/http.js.map +1 -0
  500. package/dist/seo/ai-visibility-provider.d.ts +171 -0
  501. package/dist/seo/ai-visibility-provider.d.ts.map +1 -0
  502. package/dist/seo/ai-visibility-provider.js +165 -0
  503. package/dist/seo/ai-visibility-provider.js.map +1 -0
  504. package/dist/seo/ai-visibility-scorer.d.ts +43 -0
  505. package/dist/seo/ai-visibility-scorer.d.ts.map +1 -0
  506. package/dist/seo/ai-visibility-scorer.js +102 -0
  507. package/dist/seo/ai-visibility-scorer.js.map +1 -0
  508. package/dist/seo/analyzer.d.ts +58 -0
  509. package/dist/seo/analyzer.d.ts.map +1 -0
  510. package/dist/seo/analyzer.js +265 -0
  511. package/dist/seo/analyzer.js.map +1 -0
  512. package/dist/seo/benchmark/harness.d.ts +56 -0
  513. package/dist/seo/benchmark/harness.d.ts.map +1 -0
  514. package/dist/seo/benchmark/harness.js +172 -0
  515. package/dist/seo/benchmark/harness.js.map +1 -0
  516. package/dist/seo/builder/approved-finding.d.ts +115 -0
  517. package/dist/seo/builder/approved-finding.d.ts.map +1 -0
  518. package/dist/seo/builder/approved-finding.js +145 -0
  519. package/dist/seo/builder/approved-finding.js.map +1 -0
  520. package/dist/seo/builder/build-runner.d.ts +41 -0
  521. package/dist/seo/builder/build-runner.d.ts.map +1 -0
  522. package/dist/seo/builder/build-runner.js +156 -0
  523. package/dist/seo/builder/build-runner.js.map +1 -0
  524. package/dist/seo/builder/draft-generators.d.ts +32 -0
  525. package/dist/seo/builder/draft-generators.d.ts.map +1 -0
  526. package/dist/seo/builder/draft-generators.js +31 -0
  527. package/dist/seo/builder/draft-generators.js.map +1 -0
  528. package/dist/seo/builder/draft-store.d.ts +30 -0
  529. package/dist/seo/builder/draft-store.d.ts.map +1 -0
  530. package/dist/seo/builder/draft-store.js +76 -0
  531. package/dist/seo/builder/draft-store.js.map +1 -0
  532. package/dist/seo/builder/draft-types.d.ts +36 -0
  533. package/dist/seo/builder/draft-types.d.ts.map +1 -0
  534. package/dist/seo/builder/draft-types.js +14 -0
  535. package/dist/seo/builder/draft-types.js.map +1 -0
  536. package/dist/seo/builder/hub-approved-source.d.ts +11 -0
  537. package/dist/seo/builder/hub-approved-source.d.ts.map +1 -0
  538. package/dist/seo/builder/hub-approved-source.js +48 -0
  539. package/dist/seo/builder/hub-approved-source.js.map +1 -0
  540. package/dist/seo/builder/seo-builder.d.ts +72 -0
  541. package/dist/seo/builder/seo-builder.d.ts.map +1 -0
  542. package/dist/seo/builder/seo-builder.js +72 -0
  543. package/dist/seo/builder/seo-builder.js.map +1 -0
  544. package/dist/seo/citation-gate.d.ts +36 -0
  545. package/dist/seo/citation-gate.d.ts.map +1 -0
  546. package/dist/seo/citation-gate.js +59 -0
  547. package/dist/seo/citation-gate.js.map +1 -0
  548. package/dist/seo/command.d.ts +11 -0
  549. package/dist/seo/command.d.ts.map +1 -0
  550. package/dist/seo/command.js +90 -0
  551. package/dist/seo/command.js.map +1 -0
  552. package/dist/seo/content-sanitizer.d.ts +56 -0
  553. package/dist/seo/content-sanitizer.d.ts.map +1 -0
  554. package/dist/seo/content-sanitizer.js +55 -0
  555. package/dist/seo/content-sanitizer.js.map +1 -0
  556. package/dist/seo/crawl-engine.d.ts +35 -0
  557. package/dist/seo/crawl-engine.d.ts.map +1 -0
  558. package/dist/seo/crawl-engine.js +2 -0
  559. package/dist/seo/crawl-engine.js.map +1 -0
  560. package/dist/seo/data-source.d.ts +156 -0
  561. package/dist/seo/data-source.d.ts.map +1 -0
  562. package/dist/seo/data-source.js +2 -0
  563. package/dist/seo/data-source.js.map +1 -0
  564. package/dist/seo/egress.d.ts +39 -0
  565. package/dist/seo/egress.d.ts.map +1 -0
  566. package/dist/seo/egress.js +64 -0
  567. package/dist/seo/egress.js.map +1 -0
  568. package/dist/seo/hub-emitter.d.ts +28 -0
  569. package/dist/seo/hub-emitter.d.ts.map +1 -0
  570. package/dist/seo/hub-emitter.js +95 -0
  571. package/dist/seo/hub-emitter.js.map +1 -0
  572. package/dist/seo/index.d.ts +42 -0
  573. package/dist/seo/index.d.ts.map +1 -0
  574. package/dist/seo/index.js +19 -0
  575. package/dist/seo/index.js.map +1 -0
  576. package/dist/seo/never-encode-filter.d.ts +45 -0
  577. package/dist/seo/never-encode-filter.d.ts.map +1 -0
  578. package/dist/seo/never-encode-filter.js +51 -0
  579. package/dist/seo/never-encode-filter.js.map +1 -0
  580. package/dist/seo/parser.d.ts +46 -0
  581. package/dist/seo/parser.d.ts.map +1 -0
  582. package/dist/seo/parser.js +113 -0
  583. package/dist/seo/parser.js.map +1 -0
  584. package/dist/seo/playbook-index.d.ts +19 -0
  585. package/dist/seo/playbook-index.d.ts.map +1 -0
  586. package/dist/seo/playbook-index.js +74 -0
  587. package/dist/seo/playbook-index.js.map +1 -0
  588. package/dist/seo/quota-governor.d.ts +100 -0
  589. package/dist/seo/quota-governor.d.ts.map +1 -0
  590. package/dist/seo/quota-governor.js +199 -0
  591. package/dist/seo/quota-governor.js.map +1 -0
  592. package/dist/seo/quota-ledger.d.ts +50 -0
  593. package/dist/seo/quota-ledger.d.ts.map +1 -0
  594. package/dist/seo/quota-ledger.js +95 -0
  595. package/dist/seo/quota-ledger.js.map +1 -0
  596. package/dist/seo/report-store.d.ts +30 -0
  597. package/dist/seo/report-store.d.ts.map +1 -0
  598. package/dist/seo/report-store.js +94 -0
  599. package/dist/seo/report-store.js.map +1 -0
  600. package/dist/seo/retriever.d.ts +34 -0
  601. package/dist/seo/retriever.d.ts.map +1 -0
  602. package/dist/seo/retriever.js +95 -0
  603. package/dist/seo/retriever.js.map +1 -0
  604. package/dist/seo/runner.d.ts +108 -0
  605. package/dist/seo/runner.d.ts.map +1 -0
  606. package/dist/seo/runner.js +512 -0
  607. package/dist/seo/runner.js.map +1 -0
  608. package/dist/seo/scrape-throttle.d.ts +84 -0
  609. package/dist/seo/scrape-throttle.d.ts.map +1 -0
  610. package/dist/seo/scrape-throttle.js +149 -0
  611. package/dist/seo/scrape-throttle.js.map +1 -0
  612. package/dist/seo/serp-provider.d.ts +52 -0
  613. package/dist/seo/serp-provider.d.ts.map +1 -0
  614. package/dist/seo/serp-provider.js +17 -0
  615. package/dist/seo/serp-provider.js.map +1 -0
  616. package/dist/seo/sources/ai-visibility-adapter.d.ts +87 -0
  617. package/dist/seo/sources/ai-visibility-adapter.d.ts.map +1 -0
  618. package/dist/seo/sources/ai-visibility-adapter.js +85 -0
  619. package/dist/seo/sources/ai-visibility-adapter.js.map +1 -0
  620. package/dist/seo/sources/api-spine-provider.d.ts +66 -0
  621. package/dist/seo/sources/api-spine-provider.d.ts.map +1 -0
  622. package/dist/seo/sources/api-spine-provider.js +68 -0
  623. package/dist/seo/sources/api-spine-provider.js.map +1 -0
  624. package/dist/seo/sources/citation-verifier.d.ts +95 -0
  625. package/dist/seo/sources/citation-verifier.d.ts.map +1 -0
  626. package/dist/seo/sources/citation-verifier.js +106 -0
  627. package/dist/seo/sources/citation-verifier.js.map +1 -0
  628. package/dist/seo/sources/crawl-source.d.ts +62 -0
  629. package/dist/seo/sources/crawl-source.d.ts.map +1 -0
  630. package/dist/seo/sources/crawl-source.js +87 -0
  631. package/dist/seo/sources/crawl-source.js.map +1 -0
  632. package/dist/seo/sources/damcrawler-crawl-engine.d.ts +151 -0
  633. package/dist/seo/sources/damcrawler-crawl-engine.d.ts.map +1 -0
  634. package/dist/seo/sources/damcrawler-crawl-engine.js +154 -0
  635. package/dist/seo/sources/damcrawler-crawl-engine.js.map +1 -0
  636. package/dist/seo/sources/damcrawler-serp-provider.d.ts +75 -0
  637. package/dist/seo/sources/damcrawler-serp-provider.d.ts.map +1 -0
  638. package/dist/seo/sources/damcrawler-serp-provider.js +60 -0
  639. package/dist/seo/sources/damcrawler-serp-provider.js.map +1 -0
  640. package/dist/seo/sources/dataforseo-adapter.d.ts +46 -0
  641. package/dist/seo/sources/dataforseo-adapter.d.ts.map +1 -0
  642. package/dist/seo/sources/dataforseo-adapter.js +335 -0
  643. package/dist/seo/sources/dataforseo-adapter.js.map +1 -0
  644. package/dist/seo/sources/dataforseo-serp-provider.d.ts +30 -0
  645. package/dist/seo/sources/dataforseo-serp-provider.d.ts.map +1 -0
  646. package/dist/seo/sources/dataforseo-serp-provider.js +20 -0
  647. package/dist/seo/sources/dataforseo-serp-provider.js.map +1 -0
  648. package/dist/seo/sources/engine-scrape-parser-chatgpt.d.ts +62 -0
  649. package/dist/seo/sources/engine-scrape-parser-chatgpt.d.ts.map +1 -0
  650. package/dist/seo/sources/engine-scrape-parser-chatgpt.js +72 -0
  651. package/dist/seo/sources/engine-scrape-parser-chatgpt.js.map +1 -0
  652. package/dist/seo/sources/engine-scrape-parser-perplexity.d.ts +10 -0
  653. package/dist/seo/sources/engine-scrape-parser-perplexity.d.ts.map +1 -0
  654. package/dist/seo/sources/engine-scrape-parser-perplexity.js +72 -0
  655. package/dist/seo/sources/engine-scrape-parser-perplexity.js.map +1 -0
  656. package/dist/seo/sources/gsc-adapter.d.ts +64 -0
  657. package/dist/seo/sources/gsc-adapter.d.ts.map +1 -0
  658. package/dist/seo/sources/gsc-adapter.js +221 -0
  659. package/dist/seo/sources/gsc-adapter.js.map +1 -0
  660. package/dist/seo/sources/local-export.d.ts +53 -0
  661. package/dist/seo/sources/local-export.d.ts.map +1 -0
  662. package/dist/seo/sources/local-export.js +307 -0
  663. package/dist/seo/sources/local-export.js.map +1 -0
  664. package/dist/seo/sources/mention-citation-extractor.d.ts +136 -0
  665. package/dist/seo/sources/mention-citation-extractor.d.ts.map +1 -0
  666. package/dist/seo/sources/mention-citation-extractor.js +272 -0
  667. package/dist/seo/sources/mention-citation-extractor.js.map +1 -0
  668. package/dist/seo/sources/scrape-arm-provider.d.ts +109 -0
  669. package/dist/seo/sources/scrape-arm-provider.d.ts.map +1 -0
  670. package/dist/seo/sources/scrape-arm-provider.js +129 -0
  671. package/dist/seo/sources/scrape-arm-provider.js.map +1 -0
  672. package/dist/seo/tracked-prompt-store.d.ts +33 -0
  673. package/dist/seo/tracked-prompt-store.d.ts.map +1 -0
  674. package/dist/seo/tracked-prompt-store.js +68 -0
  675. package/dist/seo/tracked-prompt-store.js.map +1 -0
  676. package/dist/seo/types.d.ts +128 -0
  677. package/dist/seo/types.d.ts.map +1 -0
  678. package/dist/seo/types.js +14 -0
  679. package/dist/seo/types.js.map +1 -0
  680. package/dist/seo/verifier.d.ts +34 -0
  681. package/dist/seo/verifier.d.ts.map +1 -0
  682. package/dist/seo/verifier.js +204 -0
  683. package/dist/seo/verifier.js.map +1 -0
  684. package/dist/seo/workflow-capabilities.d.ts +26 -0
  685. package/dist/seo/workflow-capabilities.d.ts.map +1 -0
  686. package/dist/seo/workflow-capabilities.js +12 -0
  687. package/dist/seo/workflow-capabilities.js.map +1 -0
  688. package/dist/state/facts.d.ts +5 -1
  689. package/dist/state/facts.d.ts.map +1 -1
  690. package/dist/state/facts.js +29 -19
  691. package/dist/state/facts.js.map +1 -1
  692. package/dist/state/index.d.ts +1 -1
  693. package/dist/state/index.d.ts.map +1 -1
  694. package/dist/state/index.js +1 -1
  695. package/dist/state/index.js.map +1 -1
  696. package/dist/state/outline-state.d.ts +0 -12
  697. package/dist/state/outline-state.d.ts.map +1 -1
  698. package/dist/state/outline-state.js +1 -18
  699. package/dist/state/outline-state.js.map +1 -1
  700. package/dist/state/security-audit-state.d.ts +20 -0
  701. package/dist/state/security-audit-state.d.ts.map +1 -0
  702. package/dist/state/security-audit-state.js +59 -0
  703. package/dist/state/security-audit-state.js.map +1 -0
  704. package/dist/teams/registry.d.ts.map +1 -1
  705. package/dist/teams/registry.js +17 -0
  706. package/dist/teams/registry.js.map +1 -1
  707. package/dist/telegram/bot.d.ts +137 -0
  708. package/dist/telegram/bot.d.ts.map +1 -0
  709. package/dist/telegram/bot.js +323 -0
  710. package/dist/telegram/bot.js.map +1 -0
  711. package/dist/telegram/digest.d.ts +19 -0
  712. package/dist/telegram/digest.d.ts.map +1 -0
  713. package/dist/telegram/digest.js +23 -0
  714. package/dist/telegram/digest.js.map +1 -0
  715. package/dist/telegram/fleet-view.d.ts +38 -0
  716. package/dist/telegram/fleet-view.d.ts.map +1 -0
  717. package/dist/telegram/fleet-view.js +98 -0
  718. package/dist/telegram/fleet-view.js.map +1 -0
  719. package/dist/telegram/handlers/approvals.d.ts +61 -0
  720. package/dist/telegram/handlers/approvals.d.ts.map +1 -0
  721. package/dist/telegram/handlers/approvals.js +122 -0
  722. package/dist/telegram/handlers/approvals.js.map +1 -0
  723. package/dist/telegram/handlers/capture.d.ts +43 -0
  724. package/dist/telegram/handlers/capture.d.ts.map +1 -0
  725. package/dist/telegram/handlers/capture.js +51 -0
  726. package/dist/telegram/handlers/capture.js.map +1 -0
  727. package/dist/telegram/handlers/prioritize.d.ts +50 -0
  728. package/dist/telegram/handlers/prioritize.d.ts.map +1 -0
  729. package/dist/telegram/handlers/prioritize.js +99 -0
  730. package/dist/telegram/handlers/prioritize.js.map +1 -0
  731. package/dist/telegram/handlers/upload.d.ts +105 -0
  732. package/dist/telegram/handlers/upload.d.ts.map +1 -0
  733. package/dist/telegram/handlers/upload.js +149 -0
  734. package/dist/telegram/handlers/upload.js.map +1 -0
  735. package/dist/telegram/keyboard.d.ts +48 -0
  736. package/dist/telegram/keyboard.d.ts.map +1 -0
  737. package/dist/telegram/keyboard.js +81 -0
  738. package/dist/telegram/keyboard.js.map +1 -0
  739. package/dist/telegram/outbound.d.ts +77 -0
  740. package/dist/telegram/outbound.d.ts.map +1 -0
  741. package/dist/telegram/outbound.js +45 -0
  742. package/dist/telegram/outbound.js.map +1 -0
  743. package/dist/telegram/router.d.ts +46 -0
  744. package/dist/telegram/router.d.ts.map +1 -0
  745. package/dist/telegram/router.js +63 -0
  746. package/dist/telegram/router.js.map +1 -0
  747. package/dist/telegram/streaming.d.ts +36 -0
  748. package/dist/telegram/streaming.d.ts.map +1 -0
  749. package/dist/telegram/streaming.js +55 -0
  750. package/dist/telegram/streaming.js.map +1 -0
  751. package/dist/telegram/whitelist.d.ts +20 -0
  752. package/dist/telegram/whitelist.d.ts.map +1 -0
  753. package/dist/telegram/whitelist.js +34 -0
  754. package/dist/telegram/whitelist.js.map +1 -0
  755. package/dist/utils/git.d.ts +0 -6
  756. package/dist/utils/git.d.ts.map +1 -1
  757. package/dist/utils/git.js +0 -19
  758. package/dist/utils/git.js.map +1 -1
  759. package/dist/utils/index.d.ts +1 -1
  760. package/dist/utils/index.d.ts.map +1 -1
  761. package/dist/utils/index.js +1 -1
  762. package/dist/utils/index.js.map +1 -1
  763. package/dist/vault/conventions.d.ts +23 -0
  764. package/dist/vault/conventions.d.ts.map +1 -0
  765. package/dist/vault/conventions.js +22 -0
  766. package/dist/vault/conventions.js.map +1 -0
  767. package/dist/vault/frontmatter.d.ts +47 -0
  768. package/dist/vault/frontmatter.d.ts.map +1 -0
  769. package/dist/vault/frontmatter.js +149 -0
  770. package/dist/vault/frontmatter.js.map +1 -0
  771. package/dist/vault/index-map.d.ts +35 -0
  772. package/dist/vault/index-map.d.ts.map +1 -0
  773. package/dist/vault/index-map.js +67 -0
  774. package/dist/vault/index-map.js.map +1 -0
  775. package/dist/vault/mcp-adapter.d.ts +96 -0
  776. package/dist/vault/mcp-adapter.d.ts.map +1 -0
  777. package/dist/vault/mcp-adapter.js +176 -0
  778. package/dist/vault/mcp-adapter.js.map +1 -0
  779. package/dist/vault/note-io.d.ts +29 -0
  780. package/dist/vault/note-io.d.ts.map +1 -0
  781. package/dist/vault/note-io.js +44 -0
  782. package/dist/vault/note-io.js.map +1 -0
  783. package/dist/vault/profile.d.ts +35 -0
  784. package/dist/vault/profile.d.ts.map +1 -0
  785. package/dist/vault/profile.js +50 -0
  786. package/dist/vault/profile.js.map +1 -0
  787. package/dist/vault/reindex.d.ts +55 -0
  788. package/dist/vault/reindex.d.ts.map +1 -0
  789. package/dist/vault/reindex.js +69 -0
  790. package/dist/vault/reindex.js.map +1 -0
  791. package/dist/vault/types.d.ts +25 -0
  792. package/dist/vault/types.d.ts.map +1 -0
  793. package/dist/vault/types.js +9 -0
  794. package/dist/vault/types.js.map +1 -0
  795. package/package.json +20 -4
  796. package/scripts/sync-targets.json +2 -1
  797. package/skills/bober.design/SKILL.md +190 -0
  798. package/skills/bober.design/references/1-anti-slop.md +102 -0
  799. package/skills/bober.design/references/2-design-brief.md +84 -0
  800. package/skills/bober.design/references/3-critique-rubric.md +62 -0
  801. package/skills/bober.design/references/4-copy-guide.md +43 -0
  802. package/skills/bober.plan/SKILL.md +15 -1
  803. package/skills/bober.run/SKILL.md +7 -4
  804. package/skills/bober.security-anchor/SKILL.md +172 -0
  805. package/skills/bober.security-audit/SKILL.md +288 -0
  806. package/skills/bober.security-dex-backend/SKILL.md +306 -0
  807. package/skills/bober.security-generic/SKILL.md +295 -0
  808. package/skills/bober.security-igaming/SKILL.md +290 -0
  809. package/skills/bober.security-node/SKILL.md +267 -0
  810. package/skills/bober.security-payments/SKILL.md +249 -0
  811. package/skills/bober.security-react/SKILL.md +194 -0
  812. package/skills/bober.security-solidity/SKILL.md +306 -0
  813. package/skills/bober.seo/SKILL.md +132 -0
  814. package/skills/bober.seo-ai-visibility/SKILL.md +110 -0
  815. package/skills/bober.seo-content-decay/SKILL.md +99 -0
  816. package/skills/bober.seo-generic/SKILL.md +173 -0
  817. package/skills/bober.seo-internal-linking/SKILL.md +87 -0
  818. package/skills/bober.seo-parasite-watch/SKILL.md +121 -0
  819. package/skills/bober.seo-rank-track/SKILL.md +98 -0
  820. package/skills/bober.seo-schema-audit/SKILL.md +97 -0
  821. package/skills/bober.seo-technical-audit/SKILL.md +113 -0
  822. package/skills/bober.seo-topical-map/SKILL.md +100 -0
  823. package/skills/bober.seo-verticals/SKILL.md +133 -0
  824. package/skills/bober.using-bober/SKILL.md +1 -0
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "bober",
3
3
  "description": "Generator-Evaluator multi-agent harness for building applications autonomously with Claude",
4
- "version": "0.18.0",
4
+ "version": "0.19.0",
5
5
  "author": { "name": "BOBER3r" },
6
6
  "homepage": "https://agentbober.com",
7
7
  "repository": "https://github.com/BOBER3r/agent-bober",
package/CHANGELOG.md CHANGED
@@ -7,6 +7,17 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.19.0] — 2026-07-26
11
+
12
+ ### Fixed
13
+
14
+ - **Config bootstrap in plugin / standalone installs**: `bober.plan` and `bober.run` bootstrapped `bober.config.json` by telling the model to reference `src/config/schema.ts` and `src/config/defaults.ts` — source files that are **absent** when the plugin (or a bare `.claude/` copy) runs inside a user's project, so the config was frequently never written and every downstream step failed with a missing-config error. Both skills now embed a self-contained default config inline, make the write step **non-optional** (create-then-adjust rather than ask-and-wait), and no longer depend on the agent-bober source tree.
15
+ - **`run` prerequisites check on plugin installs**: `bober.run` step 1b ran `bash scripts/check-prereqs.sh` and stopped the run if it failed — but that script is not present in a plugin/standalone project, so the run dead-ended. The step now skips gracefully when the script is absent and only enforces it when present.
16
+
17
+ ### Changed
18
+
19
+ - **Release catch-up to `main`**: first published release since `0.18.0` to include the work merged via [#55](https://github.com/BOBER3r/agent-bober/pull/55) — the cross-domain knowledge platform, medical pipeline, SEO agent/skill suite, stack-aware security auditor, and fleet orchestrator. The npm package and the plugin manifest (`.claude-plugin/plugin.json`) both track `main` at `0.19.0`.
20
+
10
21
  ## [0.18.0] — 2026-06-23
11
22
 
12
23
  ### Fixed
package/README.md CHANGED
@@ -55,9 +55,9 @@ agent-bober operates in four modes — pick the one that matches your situation.
55
55
 
56
56
  | Mode | When to Use | Entry Point |
57
57
  |------|-------------|-------------|
58
- | **Autopilot** | Feature spikes, greenfield work, no production risk | `bober run` |
59
- | **Careful-Flow** | Production behavior changes, want checkpoint approval | `bober run --mode careful` |
60
- | **Diagnose** | Production system is broken right now | `bober incident start` |
58
+ | **Autopilot** | Feature spikes, greenfield work, no production risk | `agent-bober run` |
59
+ | **Careful-Flow** | Production behavior changes, want checkpoint approval | `agent-bober run --mode careful` |
60
+ | **Diagnose** | Production system is broken right now | `agent-bober incident start` |
61
61
  | **Postmortem** | After resolving an incident, generate a retrospective | `bober postmortem generate` |
62
62
 
63
63
  ---
@@ -425,7 +425,7 @@ Add to your Windsurf MCP configuration:
425
425
 
426
426
  ## Brownfield Auto-Discovery
427
427
 
428
- When you run `bober init brownfield` (or use the `bober_init` MCP tool with mode=brownfield), agent-bober deeply analyzes your existing codebase and automatically:
428
+ When you run `agent-bober init brownfield` (or use the `bober_init` MCP tool with mode=brownfield), agent-bober deeply analyzes your existing codebase and automatically:
429
429
 
430
430
  ### What It Scans
431
431
 
@@ -489,6 +489,8 @@ The `/bober-principles` command also triggers auto-discovery when called with no
489
489
  | `/bober-brownfield` | Existing codebase workflow |
490
490
  | `/bober-playwright` | Set up Playwright E2E testing, generate tests, debug failures |
491
491
  | `/bober-code-review` | Advisory review of the sprint diff against the contract + anti-pattern catalog |
492
+ | `/bober-security-audit` | On-demand stack-aware security audit of a path (or the working tree) -- spawns the `bober-security-auditor` subagent, presents severity-ranked findings; advisory-only |
493
+ | `/bober-seo` | SEO/GEO suite orchestrator -- routes to the 8 workflows (`bober seo <workflow> [target]`), offline by default, live data behind two default-false egress axes; spawns `bober-seo-strategist`/`bober-seo-verifier` |
492
494
  | `/bober-verify` | Verification-before-completion -- run checks and confirm output before claiming success |
493
495
  | `/bober-debug` | Systematic debugging -- reproduce, isolate, hypothesize, fix, verify |
494
496
  | `/bober-graph` | Manage the code graph index -- init, sync, status (requires tokensave) |
@@ -501,7 +503,7 @@ The `/bober-principles` command also triggers auto-discovery when called with no
501
503
  | `/bober-postmortem` | Synthesize an evidence-cited postmortem from incident artifacts |
502
504
  | `/bober-using-bober` | Establishes how to find and use bober skills (loaded at conversation start) |
503
505
 
504
- > **Preset-aware install:** `bober init <preset>` installs the universal commands above plus only the stack-specific commands matching your preset or mode -- e.g. `/bober-solidity` is added for a `solidity` project, `/bober-react` and `/bober-playwright` for `nextjs`/`react-vite`, and `/bober-brownfield` for an existing codebase. The Claude Code plugin (`/plugin install`) always ships the full set.
506
+ > **Preset-aware install:** `agent-bober init <preset>` installs the universal commands above plus only the stack-specific commands matching your preset or mode -- e.g. `/bober-solidity` is added for a `solidity` project, `/bober-react` and `/bober-playwright` for `nextjs`/`react-vite`, and `/bober-brownfield` for an existing codebase. The Claude Code plugin (`/plugin install`) always ships the full set.
505
507
 
506
508
  ### CLI
507
509
 
@@ -517,12 +519,13 @@ npx agent-bober run "feature" # Full autonomous loop
517
519
  npx agent-bober run "feature" --team example # Full autonomous loop using the 'example' team
518
520
  npx agent-bober chat # Interactive chat REPL (roster + memory aware)
519
521
  npx agent-bober chat example # Interactive chat REPL using the 'example' team
522
+ npx agent-bober chat hub # Priority-hub chat REPL (in-session /priority + /decide)
520
523
  npx agent-bober mcp # Start MCP server (Cursor/Windsurf)
521
524
  ```
522
525
 
523
526
  #### Chat Steer Commands (Phase 2 — mid-flight HITL)
524
527
 
525
- Inside the `bober chat` REPL you can steer in-flight runs with these commands:
528
+ Inside the `agent-bober chat` REPL you can steer in-flight runs with these commands:
526
529
 
527
530
  | Command | Description |
528
531
  |---|---|
@@ -572,6 +575,77 @@ npx agent-bober postmortem show <incidentId> # Print retrospective
572
575
  npx agent-bober playbook list # List all playbooks
573
576
  npx agent-bober playbook show <name> # Show playbook content
574
577
  npx agent-bober playbook search '<symptom>' # Search by symptom
578
+
579
+ # Medical team (Phase 6)
580
+ npx agent-bober medical import <file> # Stream-import a health export (e.g. Apple Health export.xml)
581
+ npx agent-bober medical import-labs <pdf> # Parse a lab PDF into vault notes + health store (cloud-inference axis; fail-closed off)
582
+ npx agent-bober medical supplements add <name> [--dose <d>] # Record a supplement as a FactStore fact (medical scope; idempotent re-add)
583
+ npx agent-bober medical supplements list # Print supplements from the markdown-frontmatter file
584
+ npx agent-bober medical profile show # Decrypt + show the SOPS-encrypted personalization profile (fail-closed if sops missing)
585
+ npx agent-bober medical profile set <key> <value> # Update one profile field (age/sex/conditions/...); re-encrypts via sops (age backend, local)
586
+ npx agent-bober medical whoop sync [--since <iso>] # Sync WHOOP recovery/sleep/cycle/workout (device-connection axis)
587
+ npx agent-bober medical review [--dig-deeper <id>] # Deterministic offline proactive pass -> trend + cadence-gap + cross-marker-offer Finding notes; --dig-deeper runs the gated 4-lens deep analysis for an offer
588
+ npx agent-bober medical recommend <question> [--goal <g>] # 4-lens judge panel -> action/question Finding (cloud-inference axis; fail-closed local)
589
+ npx agent-bober medical research [--marker <m>] # Online MedlinePlus research -> grounded vault research notes + watch findings (literature-retrieval axis; zero egress off)
590
+
591
+ # Vault knowledge base
592
+ npx agent-bober vault reindex --scope <domain> [--vault <dir>] # Rebuild the derived FactStore from a vault's note frontmatter
593
+
594
+ # Priority hub (cross-domain Findings)
595
+ npx agent-bober hub list # Print Findings from the project's own FactStore + sibling kb-* repos (read-only, deduped by id); title [kind] urgency/severity per line
596
+ npx agent-bober hub priority [--domain <d>] [--due <days>] [--tag <t>] # Rank pooled Findings (general, or filtered) and write priority.md into the kb-hub vault; prints a ranked summary
597
+ npx agent-bober hub decide "X vs Y" # Rank Findings under decision scope (only X/Y-relevant survive) and write priority.md
598
+
599
+ # Task inbox (zero-friction capture into the hub pool)
600
+ npx agent-bober task add "<text>" [--domain <d>] # Capture a plain task as one open kind=action Finding in the hub pool; deterministic, never prompts/blocks
601
+ npx agent-bober task list [--all] [--status <s>] # List tasks (open + in-progress + woken snoozed by default; --all or --status widens to done/dropped)
602
+ npx agent-bober task start <id> # Move a task to in-progress (supersede; prior status kept as history)
603
+ npx agent-bober task done <id> # Mark a task done (supersede; hidden from the default list, still in --all)
604
+ npx agent-bober task drop <id> # Abandon a task → status=dropped via supersede (never deleted)
605
+ npx agent-bober task snooze <id> --until <when> # Defer a task: status=snoozed + snooze-until:<ISO> tag; hidden from default list until wake time passes (lazy, no timer)
606
+ npx agent-bober task ingest [file] # Domain seam: ingest a Finding JSON (file or stdin) into the hub pool; content-id dedup (domain|title|kind), schema-validated, fail-closed exitCode=1
607
+ npx agent-bober task from-gmail <thread> # Opt-in: capture one Gmail thread as an open action task. OFF by default (taskInbox.gmailEgress) — refuses with no MCP client/network when disabled; sanitizes connector errors (never leaks tokens)
608
+
609
+ # Do-bridge (promote a Finding into an agent-bober run)
610
+ npx agent-bober do <findingId> --dry-run # Preview the agent-bober run task a coding/projects Finding would launch (read-only: no mutation, no approval marker, no spawn); unsupported domain → exitCode=1
611
+ npx agent-bober do <findingId> # Real path: write a promote-<id> approval marker, gate (TTY confirm / non-TTY wait for agent-bober approve|reject), then launch detached `agent-bober run` on approve — links Finding.promotesTo (runId, status launched) + moves it open→in-progress; reject leaves it unchanged
612
+ npx agent-bober do <findingId> --yes # Real path, auto-approve (skip the confirm prompt; still writes+clears the marker)
613
+ npx agent-bober do --reconcile # Reconcile launched promotions: read each run's run-state.json snapshot → advance the Finding (completed→done, aborted/failed→open, running→unchanged); also runs best-effort at the start of every `agent-bober do`
614
+
615
+ # Calendar planner (deterministic slot-fill from ranked Findings)
616
+ npx agent-bober calendar plan --dry-run --findings <path> [--freebusy <path>] # Place ranked Findings into open slots in priority order (pure JS, LLM never packs); print scheduled (ISO start/end) + unscheduled (reason) — dry-run writes nothing to any calendar
617
+ npx agent-bober calendar plan --export-ics <path> --findings <path> [--freebusy <path>] # Same slot-fill, then write the plan to a local-first RFC 5545 .ics file (one VEVENT per scheduled item, UTC DTSTART/DTEND) with zero network egress — import it manually into your calendar app
618
+ npx agent-bober calendar plan --findings <path> [--freebusy <path>] # Live path: slot, then PROPOSE through the existing approval gate — writes a pending marker + plan sidecar and ZERO events; prints checkpointId (calendar-<id>) + how to approve. No auto-approve in any mode
619
+ npx agent-bober calendar apply <checkpointId> # Write events for an approved plan: detects the approved/rejected marker inline → connector.writeEvents EXACTLY once on approval / never on reject (Google still egress-gated). Approve first: agent-bober approve <checkpointId> (or /approve in chat)
620
+
621
+ # Research scheduler (recurring multi-model research jobs)
622
+ npx agent-bober research job add --question "..." [--cadence daily|weekly|monthly] [--tier <t>] [--domain <d>] [--target-repo <r>] [--online-research] # Define a recurring research job as JSON under .bober/research/jobs/ (validated by ResearchJobSchema; deterministic jobId=sha256(question|createdAt); --online-research stored but inert until egress lands)
623
+ npx agent-bober research job list # List all defined research jobs (jobId, cadence, question, [domain])
624
+ npx agent-bober research job remove <jobId> # Delete a research job's JSON file (not-found → exitCode=1)
625
+ npx agent-bober research run <jobId> # Execute one stored job: query ≥2 distinct tier-policy provider/model blocks, write a vault research note (frontmatter jobId/question/models[]/generatedAt), emit exactly one kind:"watch" hub Finding; prints the note path. Offline unless research.egress.onlineResearch; never throws (not-found → exitCode=1)
626
+ npx agent-bober research tick [--watch] [--interval <ms>] # Run every job due as of now (nextDueAt unset or <= now) on the same path; idempotent — advances each run job's nextDueAt by cadence (daily+1d/weekly+7d/monthly+1mo) + sets lastRunAt, so a 2nd tick runs nothing. Clock read only at the boundary. --watch = in-process setInterval (default 1h); for unattended runs use OS cron/launchd, e.g. `0 * * * * agent-bober research tick`
627
+ npx agent-bober research digest [--since <iso>] # Aggregate research runs in [since, now] (default last 24h) into a morning digest under .bober/research/digests/<date>.{md,json} — markdown (one bullet per run: title/top finding/source) + JSON for the Telegram bot. Reads vault research notes (non-sensitive titles only); empty window writes both files with an explicit no-new-research body; never throws
628
+
629
+ # Telegram frontend (local long-polling bot; transport + whitelist + funnel + zero-friction capture + scoped hub-priority commands + inline approve/adjust/reject gate + document-upload medical-ingest opt-in + streaming in-place progress + silent scheduled digest + multi-LLM /fleet secretary view) — spec COMPLETE (7/7 sprints)
630
+ npx agent-bober telegram # Start the local getUpdates long-polling bot (NO server/webhook/inbound port). Reads TELEGRAM_BOT_TOKEN (required; absent → exitCode=1, no network) + TELEGRAM_ALLOWED_USERS (comma-separated numeric ids; empty → deny-all, fail-closed) from env. Plain text from a whitelisted sender is captured as one open inbox task (message = title, no other required field) with a "Captured: <title>" reply; /priority, /today, and /decide X vs Y reply with a numbered ranked list from the priority hub (ephemeral scope parsed from the command, delegated to the hub CLI subprocess so the LLM stays out of the adapter, titles only); /pending lists pending approval checkpoints with [Approve][Adjust][Reject] inline buttons whose taps write the SAME .approved.json/.rejected.json disk markers the approve/reject CLI writes (no new mechanism — calendar/do-bridge resolve through the one existing gate; Approve has no editDelta, Adjust carries editDelta, Reject carries feedback; taps are whitelist-first + pendingExists-guarded, Adjust/Reject collect a follow-up text turn via ephemeral in-memory state); uploading a document (Telegram is NOT E2E-encrypted) DEFERS the download behind a per-upload [Yes][No] opt-in that names the local medical store (.bober/medical) — only on Yes does it download to a temp dir + hand the file to the existing `medical import` ingest exactly once (medical egress/consent/audit guards stay authoritative in the subprocess) + reply with a non-sensitive count only (no PHI) + remove the temp dir; No/no-confirm ingests nothing; /start gets a help stub and any other /command an "Unknown command" stub; everyone else gets one denial echoing their own id. Two Sprint-6 outbound delivery modes (presentation only, no run/fleet/scheduler logic): streamProgress reports a long-running operation by editing ONE status message in place — one sendSafeForEdit send (captures the message id) + N sendSafeEdit edits on the SAME id over an injected async iterable (never a new message per tick; live do-bridge wiring left as a documented seam in src/do-bridge/do.ts), and sendDigest delivers a scheduler-handed digest payload silently (sendSafe with {silent:true} → disable_notification; content/cadence owned by the research-scheduler). /fleet (Sprint 7) shows the most recent fleet run: a read-only renderer reads .bober/fleet-synthesis.json, groups findings by per-agent FactRecord.subject, and replies with a header (round count) + one labeled section per agent (label + one-line summary of the latest finding + round + confidence + finding count); the SAME renderer feeds the live streaming sections, over-long values are truncated to one line, missing/empty synthesis → "no recent fleet run" (never throws), /fleet is whitelist-gated first (non-whitelisted reads nothing), and SynthesisBundle/FactRecord are type-only imports so the bot keeps zero runtime coupling to src/fleet/better-sqlite3 (no new dep). All text replies leave through the single sendSafe funnel + all keyboards through the single sendSafeKeyboard funnel + streaming through sendSafeForEdit/sendSafeEdit (four chokepoints total; the new silent option is an optional 4th sendSafe arg so prior callers are byte-identical); grammy is isolated behind the transport wrapper. Ctrl+C (SIGINT/SIGTERM) stops it; never throws. spec-20260628-telegram-frontend is COMPLETE (7/7 sprints); deferred: live do-bridge streaming wire + live smoke tests need a real bot token, Tier 2/Tier 3 → sibling specs
631
+
632
+ # Security audit (three surfaces over one runSecurityAudit core: fail-closed pipeline gate + this CLI + the advisory `bober.security-audit` skill; opt-in, default-off) — spec-20260712 COMPLETE (7/7). agent-bober itself dogfoods the gate (security.enabled=true, scanners:[] — LLM-only). Full reference: docs/security-audit.md
633
+ npx agent-bober security-audit [target] # Run an on-demand stack-aware security audit against a local path (or the working tree when target is omitted). Runs the SAME runSecurityAudit core the in-pipeline gate uses (with evaluation=null), persists a cited artifact to .bober/security/<id>-security-audit.md, and prints a summary (verdict, per-bucket counts, top findings as path:line, artifact path). Exit code: 0 = pass, 2 = blocked-by-threshold OR fail-closed (audit threw / auditor output unparseable) — wire it into CI. Blocking threshold is security.standaloneBlockOn ('critical' default | 'important' also fails on important-bucket findings). Does NOT require security.enabled=true — the explicit invocation IS the opt-in; the pipeline gate's critical-only veto is untouched. After the exit code is computed, critical (hub severity/urgency 5) + important (3) findings are emitted into the priority hub (best-effort, guarded by security.hub default true; never changes the exit code) so they show up in `bober hub list`/`priority`. Local paths only (no remote URLs). For a conversational audit inside Claude Code use the `/bober-security-audit` skill (advisory-only; spawns the bober-security-auditor subagent)
634
+
635
+ # SEO / GEO suite (one `bober seo <workflow>` CLI + the /bober-seo orchestration skill + bober-seo-strategist/verifier subagents; opt-in, default-off, offline by default) — spec-20260715 COMPLETE; the SEO improver+builder (spec-20260717) and the in-house AI-visibility Hybrid (spec-20260718) extensions are also COMPLETE. Full reference: docs/seo.md
636
+ npx agent-bober seo <workflow> [target] # Run one of 8 SEO/GEO workflows (technical-audit, rank-track, content-decay, topical-map, ai-visibility, parasite-watch, internal-linking, schema-audit) end-to-end. Offline by default (reads .bober/seo/imports/<capability>.csv|json); live data ONLY behind five default-false egress axes: config.seo.egress.{search-console (GSC), serp-provider (DataForSEO), ai-visibility, ai-visibility-scrape, site-crawl}. The ai-visibility axis now routes to an in-house Hybrid (3 BYOK grounded-API engines: anthropic/openai/perplexity) instead of the offline arm; ai-visibility-scrape adds a separately-gated damcrawler UI-scrape arm (chatgpt-ui/perplexity-ui). Exit 0=pass, 2=blocked-or-fail-closed (1 reserved). Prints `SEO report <id>: verdict=…, findings=…, droppedUncited=…`. Guardrails: never-encode tactics dropped at parse, humanApprovalRequired findings, every finding carries a primary-source citation. For a conversational run in Claude Code use /bober-seo.
637
+
638
+ # Fleet orchestrator (spawn N isolated agent-bober children in bulk)
639
+ npx agent-bober fleet <manifest> # Run a fleet of agent-bober children from a manifest (full reference in COMMANDS.md)
640
+ npx agent-bober fleet expand <goal> # Decompose a goal into a fleet manifest and optionally run it (full reference in COMMANDS.md)
641
+ npx agent-bober fleet expand-deep <goal> # Robustly decompose a large/ambiguous goal (two-stage plan-then-expand) into a fleet manifest and optionally run it (full reference in COMMANDS.md)
642
+
643
+ # Config, telemetry & introspection
644
+ npx agent-bober config [migrate] # Inspect and migrate bober.config.json (full reference in COMMANDS.md)
645
+ npx agent-bober telemetry <status|purge|export> # Inspect, export, or purge local telemetry events (opt-in, local-only; full reference in COMMANDS.md)
646
+ npx agent-bober worktree run <task> # Run the full Bober pipeline in an isolated git worktree on a new branch (full reference in COMMANDS.md)
647
+ npx agent-bober memory <distill|list|show|prune> # Inspect and distill self-improvement lessons (full reference in COMMANDS.md)
648
+ npx agent-bober facts <add|list|show|invalidate> # Inspect and manage semantic bi-temporal facts (full reference in COMMANDS.md)
575
649
  ```
576
650
 
577
651
  #### Clarification gating
@@ -685,6 +759,23 @@ namespace / pipeline shape), the built-in programming team, and the deferred
685
759
 
686
760
  ---
687
761
 
762
+ ## Documentation
763
+
764
+ The `bober/medical-team` build turns agent-bober into a **local-first, multi-LLM personal
765
+ knowledge platform** — recurring research + fleet runs produce Findings and vault notes, the
766
+ priority hub ranks them, and a local Telegram bot is the read/act surface. Start with the umbrella
767
+ guide, then drill into a subsystem:
768
+
769
+ - **[docs/knowledge-platform.md](./docs/knowledge-platform.md)** — umbrella guide: how the pieces
770
+ connect, one-time setup, and end-to-end quick-starts. **Read this first.**
771
+ - [docs/fleet.md](./docs/fleet.md) — multi-LLM fleet (heterogeneous children, difficulty tiers, blackboard, synthesis).
772
+ - [docs/research-scheduler.md](./docs/research-scheduler.md) — recurring multi-model research jobs, vault notes, digests.
773
+ - [docs/telegram.md](./docs/telegram.md) — the local long-polling Telegram frontend.
774
+ - [docs/providers.md](./docs/providers.md) — provider/model selection and env-var setup.
775
+ - [docs/storage.md](./docs/storage.md) — the local SQLite / JSON storage model and egress axes.
776
+
777
+ ---
778
+
688
779
  ## Configuration
689
780
 
690
781
  All configuration lives in `bober.config.json` at your project root. The `init` command creates this file from a template, and you can customize it afterward.
@@ -775,6 +866,18 @@ All configuration lives in `bober.config.json` at your project root. The `init`
775
866
  }
776
867
  },
777
868
 
869
+ // -- Security auditor (opt-in; whole section optional, default-off; agent-bober's own repo dogfoods it with { enabled: true, scanners: [] } — LLM-only) --
870
+ "security": { // Optional. Omit entirely => byte-identical (no key, no defaults).
871
+ "enabled": false, // Fail-closed pipeline gate runs ONLY when exactly true. NOT required by the standalone CLI.
872
+ "failClosed": true, // Unparseable auditor output / timeout blocks. Default true.
873
+ "timeoutMs": 300000, // Per-audit time-box (pipeline gate).
874
+ "model": "opus", // Auditor model. Any model string or shorthand.
875
+ "maxTurns": 20, // Max read-only tool-use turns for the audit.
876
+ "standaloneBlockOn": "critical", // CI threshold for `bober security-audit`: 'critical' | 'important'. Gate ignores this key.
877
+ "scanners": [], // Opt-in deterministic pre-filter strategies (EvalStrategy[]). slither/semgrep JSON parsed into auditor priors; unknown scanners → raw-text excerpt. Nonzero exit ⇒ [] (use exit-0 commands). Empty ⇒ zero child processes.
878
+ "hub": true // Emit critical (severity 5) / important (severity 3) findings into the priority hub after the verdict (gate + CLI). Best-effort; false ⇒ zero hub writes. Never affects the verdict/exit code.
879
+ },
880
+
778
881
  // -- Sprint ------------------------------------------
779
882
  "sprint": {
780
883
  "maxSprints": 10, // Max sprints per plan
@@ -811,10 +914,146 @@ All configuration lives in `bober.config.json` at your project root. The `init`
811
914
  "pipelineShape": "ts", // "ts" | "skill" | "workflow"
812
915
  "providers": { "chat": "openai" } // Partial role->provider override; unset roles keep defaults
813
916
  }
917
+ },
918
+
919
+ // -- Medical team egress (Phase 6; all three axes default false) --
920
+ "medical": { // Optional. Omit entirely => zero egress (all axes off).
921
+ "egress": { // Three INDEPENDENT opt-in axes; code-enforced zero-egress default.
922
+ "cloudInference": false, // Permit cloud inference synthesis. Default false.
923
+ "literatureRetrieval": false, // Permit MedlinePlus literature retrieval. Default false.
924
+ "deviceConnection": false // Permit WHOOP device-connection egress. Default false.
925
+ },
926
+ "inference": { // Optional. Synthesis/critic model override. Omit => local Ollama default.
927
+ "provider": "openai-compat", // Default openai-compat. A CLOUD provider here needs egress.cloudInference=true.
928
+ "endpoint": "http://localhost:11434/v1", // Default localhost (Ollama). Non-localhost => treated as cloud + gated.
929
+ "model": "llama3" // Default llama3. Threaded into both synthesis and the grounding critic.
930
+ },
931
+ "vaultDir": ".bober/medical/vault" // Optional. Vault dir for proactive-review Finding notes. Omit => <root>/.bober/medical/vault.
932
+ },
933
+
934
+ // -- Vault (on-device Obsidian MCP read/write adapter) --
935
+ "vault": { // Optional. Omit entirely => no MCP adapter.
936
+ "obsidian": { // Declares ONE on-device Obsidian MCP server.
937
+ "name": "my_vault", // Alphanumeric/underscore. Used in errors — never secrets.
938
+ "mcpCommand": "npx", // Local executable to spawn (stdio). REMOTE schemes are refused.
939
+ "mcpArgs": ["-y", "obsidian-mcp-server"],
940
+ "mcpEnv": { "OBSIDIAN_API_KEY": "..." }, // OPAQUE secret — never logged or stringified.
941
+ "enabled": true, // Default true.
942
+ "toolNames": { // Optional. Override per-op tool names for a non-cyanheads server.
943
+ "readNote": "obsidian_read_file", // Default (cyanheads/obsidian-mcp-server).
944
+ "writeNote": "obsidian_update_file", // Default.
945
+ "listNotes": "obsidian_list_files_in_dir" // Default.
946
+ }
947
+ }
948
+ },
949
+
950
+ // -- Task inbox Gmail egress (opt-in; isolated single axis, default false) --
951
+ "taskInbox": { // Optional. Omit entirely => zero Gmail egress.
952
+ "gmailEgress": false // Permit `agent-bober task from-gmail` to read a thread via the MCP connector. Default false.
953
+ },
954
+
955
+ // -- Calendar planner (Google Calendar egress, opt-in; default 'ics', zero-egress) --
956
+ "calendar": { // Optional. Omit entirely => local .ics connector, zero cloud egress.
957
+ "egress": { // Single opt-in axis; code-enforced fail-closed default.
958
+ "cloudCalendar": false // Permit Google Calendar (cloud) free/busy read + event write. Default false.
959
+ },
960
+ "connector": "ics", // 'ics' (local, default) | 'google' (cloud, needs egress.cloudCalendar=true + a 0600 token).
961
+ "timezone": "America/New_York" // Optional IANA tz, informational only (not used in epoch-ms slot math).
962
+ },
963
+
964
+ // -- Research scheduler online egress (opt-in; isolated single axis, default false) --
965
+ "research": { // Optional. Omit entirely => research runs are fully offline.
966
+ "egress": { // Single opt-in axis; code-enforced fail-closed default.
967
+ "onlineResearch": false // Permit `agent-bober research run` web/online retrieval. Default false.
968
+ }
814
969
  }
815
970
  }
816
971
  ```
817
972
 
973
+ > **The Obsidian MCP adapter is on-device only.** `VaultMcpAdapter` wraps the existing
974
+ > `ExternalMcpServer` and exposes `readNote` / `writeNote` / `listNotes` over the declared
975
+ > server. An `isOnDevice()` guard **refuses any non-local declaration before the server is
976
+ > spawned** — a `mcpCommand` with a remote URL scheme (`https?`/`wss?`/`ftp`/`tcp://`) or an
977
+ > `mcpArgs` element pointing at a non-loopback host throws (naming only `name`, never `mcpEnv`).
978
+ > `mcpEnv` is treated as opaque secrets and is never logged. Tool names default to
979
+ > cyanheads/obsidian-mcp-server and are overridable for other servers (e.g. the Obsidian Local
980
+ > REST API plugin's built-in MCP). The adapter is an independent read/write surface — it is **not**
981
+ > wired into `agent-bober vault reindex`, which reads notes from the local filesystem. See
982
+ > [docs/sprints/sprint-spec-20260628-obsidian-vault-store-4.md](./docs/sprints/sprint-spec-20260628-obsidian-vault-store-4.md).
983
+
984
+ > **Zero-egress is code-enforced for the medical team.** All three `medical.egress` axes
985
+ > default `false`, so a medical SOP turn makes **zero outbound calls** out of the box —
986
+ > a numeric question is answered from deterministic local compute and a literature
987
+ > question abstains, with no network module ever reached. The default is enforced two
988
+ > ways: the runtime `EgressGuard` (whose `assertAllowed` throws when an axis is off) and
989
+ > a scoped `no-restricted-imports` ESLint boundary over `src/medical/**/*.ts` that makes
990
+ > any network import a lint error (with **two** sanctioned exceptions — the
991
+ > literature-retrieval source `src/medical/retrieval/medline-source.ts` and the WHOOP
992
+ > client `src/medical/whoop/whoop-client.ts`). Opting `literatureRetrieval` **in** turns
993
+ > on a real MedlinePlus / NIH (no-auth) grounded retrieval + cited synthesis that
994
+ > **abstains unless a retrieved passage supports the claim**; it runs the synthesis on a
995
+ > **local** model (Ollama by default). Opting `deviceConnection` **in** turns on the
996
+ > authenticated WHOOP transport (OAuth2 refresh + paginated v2 fetch; credentials from
997
+ > `WHOOP_CLIENT_ID`/`WHOOP_CLIENT_SECRET` env vars + a `0600` refresh-token sidecar, no
998
+ > keychain) used by the on-demand `agent-bober medical whoop sync [--since <iso>]` command,
999
+ > which persists WHOOP recovery/sleep/cycle/workout into the medical health store
1000
+ > (idempotent, fail-closed). The three axes are **independent** — enabling one never
1001
+ > enables another. See
1002
+ > [docs/teams.md](./docs/teams.md) ("EgressGuard + full SOP wiring", "MedlinePlus
1003
+ > grounded retrieval + cited synthesis", and "WHOOP device-connection axis +
1004
+ > authenticated transport").
1005
+
1006
+ > **The synthesis/critic model is configurable, and cloud is gated by `cloudInference`.**
1007
+ > The optional `medical.inference` block `{ provider?, endpoint?, model? }` overrides the
1008
+ > model used for grounded synthesis **and** the grounding critic. Omit it (the default) and
1009
+ > the medical team uses the **local Ollama default** (`openai-compat`,
1010
+ > `http://localhost:11434/v1`, `llama3`). A **cloud** provider here (anything that is not
1011
+ > `openai-compat` against a `localhost` endpoint) is honoured **only** when
1012
+ > `medical.egress.cloudInference` is `true`; with the axis off (the default) the resolver
1013
+ > **fails closed to the local default** and **no cloud client is ever constructed** — so the
1014
+ > out-of-the-box posture still makes zero cloud egress. The critic's outcome is recorded as
1015
+ > the IDs/enums-only `criticVerdict` (`approve` / `reject-abstained` / `error-abstained`)
1016
+ > field on the PHI-free `0600` medical audit log. See
1017
+ > [docs/teams.md](./docs/teams.md) ("Configurable model + cloud-inference gating" and
1018
+ > "Critic verdict in the audit").
1019
+
1020
+ > **Gmail capture is opt-in and default-off.** The isolated `taskInbox.gmailEgress` axis
1021
+ > (default `false`, separate from the `medical.egress` axes) gates `agent-bober task from-gmail
1022
+ > <thread>`. With the axis off — the default — the command **refuses with an opt-in message,
1023
+ > sets `exitCode=1`, and constructs no MCP client / makes no network call**, so the
1024
+ > out-of-the-box build performs **zero Gmail egress**. The gate fires fail-closed at two
1025
+ > layers (the CLI returns before constructing the connector, and the `fromGmailTask` core
1026
+ > throws before `mcp.start()`/`callTool()`), a missing/invalid config resolves to disabled,
1027
+ > and any connector error is caught and **sanitized** (`KEY=VALUE` env assignments stripped to
1028
+ > `[redacted]`, the same regex as `src/mcp/external-client.ts`) so tokens never leak. When
1029
+ > enabled (plus an enabled `observability` provider named `gmail`), one thread is read on
1030
+ > demand and captured through the same `captureTask` write path as `task add`. See
1031
+ > [COMMANDS.md](./COMMANDS.md) (`agent-bober task from-gmail <thread>`) and
1032
+ > [docs/sprints/sprint-spec-20260628-task-inbox-6.md](./docs/sprints/sprint-spec-20260628-task-inbox-6.md).
1033
+
1034
+ > **Google Calendar egress is opt-in and default-off.** The isolated `calendar.egress.cloudCalendar`
1035
+ > axis (default `false`, separate from the `medical`/`taskInbox` axes) gates the Sprint 3 Google
1036
+ > Calendar connector. With the axis off — the default — the calendar planner uses the local-first
1037
+ > `.ics` connector and makes **zero cloud egress**; any Google read/write **refuses before constructing
1038
+ > the MCP client**, naming `calendar.egress.cloudCalendar`. Enabling it also requires a provisioned
1039
+ > `0600` OAuth token sidecar (`.bober/calendar/google-token.json`), and only a non-sensitive
1040
+ > `calendarSafeTitle` (never the full finding title, evidence, or tags) ever leaves the device as the
1041
+ > event summary; connector errors are sanitized (`KEY=VALUE` stripped, same regex as
1042
+ > `src/mcp/external-client.ts`) so tokens never leak. Hosted OAuth is **unfit for unattended/cron runs**,
1043
+ > so scheduled use should stay on the `.ics` fallback. See [docs/calendar.md](./docs/calendar.md) and
1044
+ > [docs/sprints/sprint-spec-20260628-calendar-planner-3.md](./docs/sprints/sprint-spec-20260628-calendar-planner-3.md).
1045
+
1046
+ > **Online research egress is opt-in and default-off.** The isolated `research.egress.onlineResearch`
1047
+ > axis (default `false`, **separate** from the `medical`/`taskInbox`/`calendar` axes) gates `bober
1048
+ > research run` (and `agent-bober research tick`) web retrieval. With the axis off — the default — a research run uses only its injected
1049
+ > provider clients and makes **zero outbound retrieval requests**; the `ResearchEgressGuard`
1050
+ > (`src/research/egress.ts`, mirroring the medical `EgressGuard`) is fail-closed (`assertAllowed` throws
1051
+ > `Egress axis 'online-research' not enabled` when off), and the runner's gated branch skips retrieval
1052
+ > entirely so the retrieval client is **never constructed** and the note is byte-identical to the
1053
+ > offline run. Opting in threads the retrieved source URLs into the note frontmatter `sources` list. See
1054
+ > [COMMANDS.md](./COMMANDS.md) (Research Commands → "Online research egress") and
1055
+ > [docs/sprints/sprint-spec-20260628-research-scheduler-3.md](./docs/sprints/sprint-spec-20260628-research-scheduler-3.md).
1056
+
818
1057
  ### Sprint Sizes
819
1058
 
820
1059
  | Size | Generator Effort | Files Changed | Scope |
@@ -0,0 +1,100 @@
1
+ ---
2
+ name: bober-art-director
3
+ description: Art direction specialist that turns a design brief into a complete DESIGN.md contract — named vibe, fresh color tokens, type pairing, layout wireframes, signature element — self-critiqued against the anti-slop catalog before handoff. Produces design documents only; never writes application code.
4
+ tools:
5
+ - Read
6
+ - Grep
7
+ - Glob
8
+ - Bash
9
+ - Write
10
+ model: opus
11
+ ---
12
+
13
+ # Bober Art Director Agent
14
+
15
+ ## Subagent Context
16
+
17
+ You are being **spawned as a subagent** by the bober.design orchestrator. You have no access to
18
+ the orchestrator's conversation. Everything you need is in your prompt:
19
+
20
+ - **BRIEF.md** — the intake brief: subject, audience, job, reference notes, discovery answers,
21
+ constraints, assets. This is the user's intent; you do not get to ask follow-up questions,
22
+ so where the brief is silent, decide and state the decision (never leave an axis undesigned).
23
+ - **Reference image paths** — Read every one. For each, the brief says what to take from it.
24
+ Borrow patterns and moods across references; never reproduce one site.
25
+ - **The Anti-Slop Catalog** — the tells you design against, the entropy rules you must apply,
26
+ and the replacement pools (a floor, not the method).
27
+ - **The DESIGN.md template** — your output contract, all 11 sections.
28
+ - **`.bober/design/history.md`** (if provided) — faces, vibes, and palettes used in previous
29
+ projects. Never repeat the last three display faces, vibe names, or palettes.
30
+
31
+ Your final message back to the orchestrator is the complete DESIGN.md content plus a short
32
+ self-critique summary. Also Write it to the path the orchestrator specifies.
33
+
34
+ ## Identity
35
+
36
+ You are the design lead at a small studio known for giving every client a visual identity that
37
+ could not be mistaken for anyone else's. This client has already rejected work that felt
38
+ templated and is paying for a distinctive point of view: make deliberate, opinionated choices
39
+ about palette, typography, and layout that are specific to THIS brief, and take one real
40
+ aesthetic risk you can justify. Not taking a risk is itself a risk.
41
+
42
+ The subject's own world — its materials, instruments, artifacts, era, vernacular — is where
43
+ distinctive choices come from. A page about beekeeping and a page about GPU kernels must not
44
+ share a palette logic, a type voice, or a hero thesis.
45
+
46
+ ## Method
47
+
48
+ Work in two passes. **Do the exploration in your thinking; show only decisions.**
49
+
50
+ ### Pass 1 — Design
51
+
52
+ 1. **Ground:** restate subject, audience, single job in your own words. The hero is a thesis —
53
+ decide the most characteristic thing in the subject's world to open with (headline, image,
54
+ demo, interactive moment — whatever form fits the subject, not the template).
55
+ 2. **Influences:** pick exactly two unrelated influences (at least one from the subject's own
56
+ world; references may supply the other). Name where their collision will be visible.
57
+ 3. **Name the vibe** in 2–4 words. Every decision after this is tested against the name.
58
+ 4. **Colors:** generate 4–6 tokens fresh from real-world sources in the subject's world — no
59
+ remembered hex defaults. Name each after its source. Compute and record contrast ratios for
60
+ every text pair (4.5:1 body / 3:1 large — the floor is not negotiable).
61
+ 5. **Type:** a characterful display face used with restraint, a complementary body face
62
+ (different family), a utility face if data/captions demand it. Rotate per history.md. State
63
+ the scale as named steps and why this pairing belongs to this brief.
64
+ 6. **Layout:** one-sentence thesis, then ASCII wireframes per section. Every structural device
65
+ (numbering, eyebrows, dividers) must encode something true about the content — numbered
66
+ markers only if the content is genuinely a sequence. Devices that encode nothing get cut.
67
+ 7. **Signature element:** the ONE thing the page will be remembered by. Spend the entire
68
+ boldness budget here; keep everything around it quiet and disciplined. Design its
69
+ reduced-motion fallback in the same breath.
70
+ 8. **Wildcard:** one deliberate misfit detail. Perfectly coherent = obviously generated.
71
+ 9. **Motion plan & copy deck** per the template — one orchestrated moment beats scattered
72
+ effects; the headline must pass the litmus test before it goes in the deck.
73
+
74
+ ### Pass 2 — The generic-twin critique (mandatory, before handoff)
75
+
76
+ Simulate the twin: work through what you would have produced for a *similar but generic*
77
+ prompt — same product category, no brief. Compare axis by axis (palette, type, hero, layout,
78
+ motion). **Any axis where your design and the twin's converge is an axis you defaulted** —
79
+ redesign it and note what changed and why. Then check the three whole-page default looks and
80
+ the component tells; fill the Slop Ledger with every rule you consciously break and its
81
+ one-line justification tied to the brief. The brief's own words always win — if the user asked
82
+ for a "banned" look, deliver it excellently and record it in the ledger.
83
+
84
+ ## Hard rules
85
+
86
+ - You produce DESIGN.md and nothing else — no application code, no CSS files, no prototypes.
87
+ - All 11 template sections present and concrete. A section you can't fill means the brief is
88
+ deficient — fill it with a stated assumption and flag it at the top of your report.
89
+ - Where the brief pins something down (brand colors, a reference the user loves), follow it
90
+ exactly. Your freedom lives only on the axes the brief leaves open.
91
+ - If a candidate-generator tool result is in your prompt (e.g. ui-ux-pro-max search output),
92
+ treat it as raw material: harvest structure and options, but every adopted item must survive
93
+ the generic-twin critique like any other choice. Its font/palette defaults trend generic.
94
+ - Quality floor (template §11) is restated verbatim, never weakened.
95
+
96
+ ## Report format
97
+
98
+ Return: (1) the complete DESIGN.md content; (2) a 5-line self-critique summary — what the
99
+ generic twin would have done on each major axis and what you did instead; (3) any assumptions
100
+ made where the brief was silent.
@@ -0,0 +1,114 @@
1
+ ---
2
+ name: bober-design-critic
3
+ description: Skeptical design reviewer that judges the RENDERED page against DESIGN.md and the anti-slop catalog — Playwright screenshots at three viewports, eight review phases, deterministic slop lint and accessibility scan — and returns severity-ranked findings. Never writes or edits code.
4
+ tools:
5
+ - Read
6
+ - Bash
7
+ - Grep
8
+ - Glob
9
+ - mcp__plugin_playwright_playwright__browser_navigate
10
+ - mcp__plugin_playwright_playwright__browser_snapshot
11
+ - mcp__plugin_playwright_playwright__browser_take_screenshot
12
+ - mcp__plugin_playwright_playwright__browser_click
13
+ - mcp__plugin_playwright_playwright__browser_fill_form
14
+ - mcp__plugin_playwright_playwright__browser_evaluate
15
+ - mcp__plugin_playwright_playwright__browser_console_messages
16
+ - mcp__plugin_playwright_playwright__browser_network_requests
17
+ - mcp__plugin_playwright_playwright__browser_resize
18
+ - mcp__plugin_playwright_playwright__browser_tabs
19
+ - mcp__plugin_playwright_playwright__browser_close
20
+ model: sonnet
21
+ ---
22
+
23
+ # Bober Design Critic Agent
24
+
25
+ ## Subagent Context
26
+
27
+ You are being **spawned as a subagent** by the bober.design orchestrator. You have no access to
28
+ the orchestrator's conversation. Your prompt contains:
29
+
30
+ - **DESIGN.md** — the contract you judge against. You are not judging your own taste; you are
31
+ judging fidelity to an approved design plus the objective quality floor plus genericness.
32
+ - **The Critique Rubric** — your full protocol (baseline screenshots, eight phases,
33
+ deterministic gates, finding format). Follow it exactly; every phase is mandatory.
34
+ - **The Anti-Slop Catalog** — the tells, the scoring (0–1 pass / 2–3 warn / 4+ fail), the
35
+ Slop Ledger exemption, and the final AI Slop Test.
36
+ - **How to run the page** — dev server command or file path, and the iteration number.
37
+
38
+ Your final message is the structured DesignReviewResult JSON below — raw data for the
39
+ orchestrator, not prose for a human.
40
+
41
+ ## Identity
42
+
43
+ You are a skeptical design reviewer with one conviction: **the rendered page is the truth; the
44
+ source code is a claim about it.** You review the live environment first — screenshots at
45
+ 1440/768/375, real interactions, keyboard-only passes — and only read source in phase 7. You
46
+ have seen a thousand pages that "passed" in code review and fell apart at 375px. A picture is
47
+ worth 1000 tokens; capture the baseline screenshot set before forming any opinion.
48
+
49
+ You are adversarial toward the work, not the builder: your job is to find what's wrong before
50
+ a user does. But you are calibrated — you distinguish a BLOCKER from a preference, you prefix
51
+ preferences with "Nit:", and you open with one line on what genuinely works so it doesn't get
52
+ regressed away.
53
+
54
+ ## Non-negotiables
55
+
56
+ - **Never write or edit code.** You describe problems and fix *directions*; the builder owns
57
+ the how. Prescribing exact CSS is overstepping; describing the defect precisely is the job.
58
+ - **Evidence for every finding**: viewport + screenshot reference + what/where. A finding you
59
+ can't evidence is a hunch — either verify it or drop it.
60
+ - **Faithful-but-weak routing:** if the page correctly implements a DESIGN.md decision that is
61
+ itself weak (a contrast pair that passes ratios but reads muddy; a signature element that
62
+ lands flat), file it as `"target": "design-brief"` — that goes to the art director, not the
63
+ builder. Never punish the builder for following the contract.
64
+ - **Fonts first:** check computed `font-family` on display and body text immediately after
65
+ load. If a fallback is serving, everything visual you'd review is a different design —
66
+ file the CRITICAL and short-circuit the visual phases.
67
+ - **Deterministic gates run every time:** slop lint (impeccable if available, else the
68
+ catalog's built-in DOM checks) and a11y scan (axe if available, else the manual phase-5
69
+ pass, with the gap noted). Slop Ledger entries in DESIGN.md exempt their tells from the
70
+ score — unledgered tells count.
71
+ - **The AI Slop Test verdict is mandatory** on iteration 1 and on the final pass: look at the
72
+ 1440px screenshot cold and answer honestly. On smoke passes (post-polish), run phases
73
+ 1, 3, 8 + slop lint only, as instructed by the orchestrator.
74
+
75
+ ## DesignReviewResult format
76
+
77
+ ```json
78
+ {
79
+ "reviewId": "design-review-<project>-<iteration>",
80
+ "iteration": 1,
81
+ "verdict": "pass | fail",
82
+ "worksWell": "<one line — what must not regress>",
83
+ "screenshots": { "1440": "<path>", "768": "<path>", "375": "<path>" },
84
+ "slopLint": {
85
+ "tool": "impeccable | builtin",
86
+ "score": 0,
87
+ "tellsFound": ["<tell> (ledgered: yes/no)"],
88
+ "aiSlopTest": { "verdict": "pass | fail", "reason": "<one line>" }
89
+ },
90
+ "accessibility": {
91
+ "tool": "axe | manual",
92
+ "blockers": ["<serious/critical violations>"],
93
+ "keyboardPass": "clean | <issues>"
94
+ },
95
+ "findings": [
96
+ {
97
+ "id": "F1",
98
+ "severity": "BLOCKER | HIGH | MEDIUM | NIT",
99
+ "phase": 3,
100
+ "target": "build | design-brief",
101
+ "viewport": "375",
102
+ "finding": "<what + where>",
103
+ "evidence": "<screenshot ref / console line / computed style>",
104
+ "fixDirection": "<direction, not prescription>"
105
+ }
106
+ ],
107
+ "phasesRun": [1,2,3,4,5,6,7,8],
108
+ "summary": "<2-3 sentences: verdict rationale>"
109
+ }
110
+ ```
111
+
112
+ `pass` requires: zero BLOCKER/HIGH findings, slop score ≤1, AI Slop Test passed, no
113
+ accessibility blockers. Anything else is `fail` — with findings complete enough that the
114
+ builder can fix everything in one batch.