@polderlabs/bizar 6.2.5 → 7.0.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 (540) hide show
  1. package/.claude/CLAUDE.md +15 -0
  2. package/.claude/agents/_shared/AGENT_BASELINE.md +168 -0
  3. package/.claude/agents/_shared/CLAUDE_TOOLS.md +412 -0
  4. package/.claude/agents/_shared/SKILLS.md +109 -0
  5. package/.claude/agents/agent-browser.md +80 -0
  6. package/.claude/agents/baldr.md +49 -0
  7. package/.claude/agents/forseti.md +51 -0
  8. package/.claude/agents/frigg.md +42 -0
  9. package/.claude/agents/heimdall.md +33 -0
  10. package/.claude/agents/hermod.md +53 -0
  11. package/.claude/agents/mimir.md +49 -0
  12. package/.claude/agents/odin.md +287 -0
  13. package/.claude/agents/quick.md +34 -0
  14. package/.claude/agents/semble-search.md +50 -0
  15. package/.claude/agents/thor.md +53 -0
  16. package/.claude/agents/tyr.md +56 -0
  17. package/.claude/agents/vidarr.md +54 -0
  18. package/.claude/agents/vor.md +53 -0
  19. package/.claude/commands/audit.md +25 -0
  20. package/.claude/commands/bizar.md +22 -0
  21. package/.claude/commands/explain.md +17 -0
  22. package/.claude/commands/init.md +29 -0
  23. package/.claude/commands/learn.md +44 -0
  24. package/.claude/commands/plan.md +35 -0
  25. package/.claude/commands/plow-through.md +50 -0
  26. package/.claude/commands/pr-review.md +49 -0
  27. package/.claude/commands/setup-provider.md +96 -0
  28. package/.claude/commands/tailscale-serve.md +100 -0
  29. package/.claude/commands/team.md +132 -0
  30. package/.claude/commands/test.md +62 -0
  31. package/.claude/commands/validate.md +68 -0
  32. package/.claude/commands/visual-plan.md +24 -0
  33. package/.claude/hooks/README.md +92 -0
  34. package/.claude/hooks/posttooluse-editwrite.mjs +91 -0
  35. package/.claude/hooks/pretooluse-bash.mjs +81 -0
  36. package/.claude/hooks/pretooluse-editwrite.mjs +139 -0
  37. package/.claude/hooks/sessionend-recall.mjs +74 -0
  38. package/.claude/hooks/sessionstart-prime.mjs +80 -0
  39. package/.claude/hooks/userpromptsubmit-tag.mjs +80 -0
  40. package/.claude/hooks/worker-suggest.mjs +110 -0
  41. package/.claude/settings.json +125 -0
  42. package/.claude/skills/9router/SKILL.md +80 -0
  43. package/.claude/skills/9router-chat/SKILL.md +73 -0
  44. package/.claude/skills/9router-embeddings/SKILL.md +69 -0
  45. package/.claude/skills/9router-image/SKILL.md +86 -0
  46. package/.claude/skills/9router-stt/SKILL.md +79 -0
  47. package/.claude/skills/9router-tts/SKILL.md +80 -0
  48. package/.claude/skills/9router-web-fetch/SKILL.md +99 -0
  49. package/.claude/skills/9router-web-search/SKILL.md +91 -0
  50. package/.claude/skills/bizar/README.md +9 -0
  51. package/.claude/skills/bizar/SKILL.md +450 -0
  52. package/.claude/skills/cpp-coding-standards/README.md +28 -0
  53. package/.claude/skills/cpp-coding-standards/SKILL.md +634 -0
  54. package/.claude/skills/cpp-coding-standards/references/concurrency.md +320 -0
  55. package/.claude/skills/cpp-coding-standards/references/error-handling.md +229 -0
  56. package/.claude/skills/cpp-coding-standards/references/memory-safety.md +216 -0
  57. package/.claude/skills/cpp-coding-standards/references/modern-idioms.md +282 -0
  58. package/.claude/skills/cpp-coding-standards/references/review-checklist.md +96 -0
  59. package/.claude/skills/cpp-testing/README.md +28 -0
  60. package/.claude/skills/cpp-testing/SKILL.md +304 -0
  61. package/.claude/skills/cpp-testing/references/coverage.md +370 -0
  62. package/.claude/skills/cpp-testing/references/framework-compare.md +175 -0
  63. package/.claude/skills/cpp-testing/references/host-test-for-embedded.md +499 -0
  64. package/.claude/skills/cpp-testing/references/mocking.md +364 -0
  65. package/.claude/skills/cpp-testing/references/tdd-workflow.md +308 -0
  66. package/.claude/skills/cubesandbox/SKILL.md +148 -0
  67. package/.claude/skills/embedded-esp-idf/README.md +41 -0
  68. package/.claude/skills/embedded-esp-idf/SKILL.md +439 -0
  69. package/.claude/skills/embedded-esp-idf/references/freertos-patterns.md +214 -0
  70. package/.claude/skills/embedded-esp-idf/references/host-tests.md +164 -0
  71. package/.claude/skills/embedded-esp-idf/references/idf-py-commands.md +157 -0
  72. package/.claude/skills/embedded-esp-idf/references/kconfig.md +159 -0
  73. package/.claude/skills/embedded-esp-idf/references/logging-discipline.md +118 -0
  74. package/.claude/skills/embedded-esp-idf/references/memory-and-iram.md +137 -0
  75. package/.claude/skills/embedded-esp-idf/references/nvs.md +121 -0
  76. package/.claude/skills/embedded-esp-idf/references/packed-structs.md +192 -0
  77. package/.claude/skills/embedded-esp-idf/scripts/idf_env.sh +47 -0
  78. package/.claude/skills/embedded-esp-idf/scripts/size_check.sh +77 -0
  79. package/.claude/skills/glyph/SKILL.md +163 -0
  80. package/.claude/skills/harness-engineering/SKILL.md +143 -0
  81. package/.claude/skills/lightrag/SKILL.md +81 -0
  82. package/.claude/skills/memory-protocol/SKILL.md +105 -0
  83. package/.claude/skills/obsidian/SKILL.md +306 -0
  84. package/.claude/skills/read-the-damn-docs/SKILL.md +113 -0
  85. package/.claude/skills/self-improvement/SKILL.md +64 -0
  86. package/README.md +87 -59
  87. package/bizar-dash/dist/assets/{EnvVarsSection-DXM8gRm_.js → EnvVarsSection-CW6fWKds.js} +3 -3
  88. package/bizar-dash/dist/assets/{EnvVarsSection-DXM8gRm_.js.map → EnvVarsSection-CW6fWKds.js.map} +1 -1
  89. package/bizar-dash/dist/assets/MobileChat-D7zRhU9K.js +1 -0
  90. package/bizar-dash/dist/assets/{MobileChat-BnKN_Ks_.js.map → MobileChat-D7zRhU9K.js.map} +1 -1
  91. package/bizar-dash/dist/assets/MobileSettings-K-sNsn_r.js +1 -0
  92. package/bizar-dash/dist/assets/{MobileSettings-DjCPxC-Q.js.map → MobileSettings-K-sNsn_r.js.map} +1 -1
  93. package/bizar-dash/dist/assets/{Toast-Cpl6-E63.js → Toast-WTxc3m2g.js} +1 -1
  94. package/bizar-dash/dist/assets/{Toast-Cpl6-E63.js.map → Toast-WTxc3m2g.js.map} +1 -1
  95. package/bizar-dash/dist/assets/flow-BpU0-gK2.js +1 -0
  96. package/bizar-dash/dist/assets/flow-BpU0-gK2.js.map +1 -0
  97. package/bizar-dash/dist/assets/fuzzy-l0sNRNKZ.js +1 -0
  98. package/bizar-dash/dist/assets/fuzzy-l0sNRNKZ.js.map +1 -0
  99. package/bizar-dash/dist/assets/{icons-Do5N2jmX.js → icons-B0AKnYI3.js} +98 -103
  100. package/bizar-dash/dist/assets/icons-B0AKnYI3.js.map +1 -0
  101. package/bizar-dash/dist/assets/main-C-Md3DaY.css +1 -0
  102. package/bizar-dash/dist/assets/main-CO8fIxQK.js +18 -0
  103. package/bizar-dash/dist/assets/main-CO8fIxQK.js.map +1 -0
  104. package/bizar-dash/dist/assets/markdown-w2bDDkAH.js +1 -0
  105. package/bizar-dash/dist/assets/{markdown-C6mXtQxD.js.map → markdown-w2bDDkAH.js.map} +1 -1
  106. package/bizar-dash/dist/assets/mobile-DXYCA0hC.js +1 -0
  107. package/bizar-dash/dist/assets/{mobile-CMHqtLV2.js.map → mobile-DXYCA0hC.js.map} +1 -1
  108. package/bizar-dash/dist/assets/mobile-layout-DSmtNPja.js +2 -0
  109. package/bizar-dash/dist/assets/mobile-layout-DSmtNPja.js.map +1 -0
  110. package/bizar-dash/dist/assets/react-vendor-BnuhLJ6X.css +1 -0
  111. package/bizar-dash/dist/assets/react-vendor-D3pra6w-.js +46 -0
  112. package/bizar-dash/dist/assets/react-vendor-D3pra6w-.js.map +1 -0
  113. package/bizar-dash/dist/assets/useSlashCommands-3DFLOfpk.js +2 -0
  114. package/bizar-dash/dist/assets/useSlashCommands-3DFLOfpk.js.map +1 -0
  115. package/bizar-dash/dist/assets/vendor-Di7Cp-rw.js +45 -0
  116. package/bizar-dash/dist/assets/vendor-Di7Cp-rw.js.map +1 -0
  117. package/bizar-dash/dist/index.html +12 -10
  118. package/bizar-dash/dist/mobile.html +7 -4
  119. package/bizar-dash/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +1 -1
  120. package/bizar-dash/src/server/api.mjs +15 -4
  121. package/bizar-dash/src/server/background-store.mjs +15 -16
  122. package/bizar-dash/src/server/bg-poller.mjs +25 -35
  123. package/bizar-dash/src/server/bg-retry.mjs +66 -194
  124. package/bizar-dash/src/server/claude-bg-spawner.mjs +390 -0
  125. package/bizar-dash/src/server/claude-info.mjs +412 -0
  126. package/bizar-dash/src/server/{cline-runner.mjs → claude-runner.mjs} +53 -48
  127. package/bizar-dash/src/server/claude-sdk.mjs +191 -0
  128. package/bizar-dash/src/server/memory-consolidator.mjs +218 -0
  129. package/bizar-dash/src/server/memory-distillation.mjs +296 -0
  130. package/bizar-dash/src/server/providers-store.mjs +22 -49
  131. package/bizar-dash/src/server/routes/background.mjs +24 -20
  132. package/bizar-dash/src/server/routes/chat.mjs +223 -326
  133. package/bizar-dash/src/server/routes/claude-session-detail.mjs +329 -0
  134. package/bizar-dash/src/server/routes/claude-sessions.mjs +259 -0
  135. package/bizar-dash/src/server/routes/distill.mjs +129 -0
  136. package/bizar-dash/src/server/routes/goal-planner.mjs +236 -0
  137. package/bizar-dash/src/server/routes/tasks.mjs +20 -28
  138. package/bizar-dash/src/server/task-delegator.mjs +76 -77
  139. package/bizar-dash/src/web/App.tsx +4 -0
  140. package/bizar-dash/src/web/components/Tag.tsx +18 -5
  141. package/bizar-dash/src/web/components/Topbar.tsx +3 -0
  142. package/bizar-dash/src/web/components/agents/CommunicationLog.tsx +126 -0
  143. package/bizar-dash/src/web/components/agents/DependencyGraph.tsx +163 -0
  144. package/bizar-dash/src/web/components/agents/QualityGates.tsx +123 -0
  145. package/bizar-dash/src/web/components/agents/RealTimeEventLog.tsx +127 -0
  146. package/bizar-dash/src/web/components/agents/RoutingDecisions.test.tsx +148 -0
  147. package/bizar-dash/src/web/components/agents/RoutingDecisions.tsx +160 -0
  148. package/bizar-dash/src/web/components/chat/useChat.ts +23 -27
  149. package/bizar-dash/src/web/components/goals/GoalInput.tsx +86 -0
  150. package/bizar-dash/src/web/components/goals/PlanVisualization.tsx +111 -0
  151. package/bizar-dash/src/web/lib/goapPlanner.ts +614 -0
  152. package/bizar-dash/src/web/lib/types.ts +25 -0
  153. package/bizar-dash/src/web/styles/agents-redesign.css +311 -0
  154. package/bizar-dash/src/web/styles/main.css +251 -0
  155. package/bizar-dash/src/web/styles/tasks-redesign.css +231 -0
  156. package/bizar-dash/src/web/ui/controls/Button.tsx +77 -0
  157. package/bizar-dash/src/web/ui/controls/Checkbox.tsx +95 -0
  158. package/bizar-dash/src/web/ui/controls/IconButton.tsx +66 -0
  159. package/bizar-dash/src/web/ui/controls/Kbd.tsx +24 -0
  160. package/bizar-dash/src/web/ui/controls/NumberInput.tsx +77 -0
  161. package/bizar-dash/src/web/ui/controls/RadioGroup.tsx +109 -0
  162. package/bizar-dash/src/web/ui/controls/SearchInput.tsx +91 -0
  163. package/bizar-dash/src/web/ui/controls/Select.tsx +92 -0
  164. package/bizar-dash/src/web/ui/controls/Slider.tsx +70 -0
  165. package/bizar-dash/src/web/ui/controls/TextInput.tsx +67 -0
  166. package/bizar-dash/src/web/ui/controls/Toggle.tsx +79 -0
  167. package/bizar-dash/src/web/ui/controls/controls.css +454 -0
  168. package/bizar-dash/src/web/ui/controls/index.ts +33 -0
  169. package/bizar-dash/src/web/ui/data/BarChart.tsx +60 -0
  170. package/bizar-dash/src/web/ui/data/DataTable.tsx +216 -0
  171. package/bizar-dash/src/web/ui/data/EmptyState.tsx +60 -0
  172. package/bizar-dash/src/web/ui/data/ErrorState.tsx +56 -0
  173. package/bizar-dash/src/web/ui/data/KeyValueList.tsx +106 -0
  174. package/bizar-dash/src/web/ui/data/LoadingState.tsx +65 -0
  175. package/bizar-dash/src/web/ui/data/Sparkline.tsx +87 -0
  176. package/bizar-dash/src/web/ui/data/StatTile.tsx +87 -0
  177. package/bizar-dash/src/web/ui/data/data.css +535 -0
  178. package/bizar-dash/src/web/ui/data/index.ts +31 -0
  179. package/bizar-dash/src/web/ui/feedback/Badge.tsx +49 -0
  180. package/bizar-dash/src/web/ui/feedback/Dialog.tsx +209 -0
  181. package/bizar-dash/src/web/ui/feedback/ProgressBar.tsx +69 -0
  182. package/bizar-dash/src/web/ui/feedback/StatusDot.tsx +50 -0
  183. package/bizar-dash/src/web/ui/feedback/Toast.tsx +200 -0
  184. package/bizar-dash/src/web/ui/feedback/Tooltip.tsx +126 -0
  185. package/bizar-dash/src/web/ui/feedback/feedback.css +314 -0
  186. package/bizar-dash/src/web/ui/feedback/index.ts +43 -0
  187. package/bizar-dash/src/web/ui/index.ts +56 -0
  188. package/bizar-dash/src/web/ui/layout/AppShell.tsx +51 -0
  189. package/bizar-dash/src/web/ui/layout/Breadcrumbs.tsx +97 -0
  190. package/bizar-dash/src/web/ui/layout/Panel.tsx +73 -0
  191. package/bizar-dash/src/web/ui/layout/PanelHeader.tsx +39 -0
  192. package/bizar-dash/src/web/ui/layout/Sidebar.tsx +131 -0
  193. package/bizar-dash/src/web/ui/layout/Tabs.tsx +133 -0
  194. package/bizar-dash/src/web/ui/layout/Topbar.tsx +42 -0
  195. package/bizar-dash/src/web/ui/layout/index.ts +33 -0
  196. package/bizar-dash/src/web/ui/layout/layout.css +413 -0
  197. package/bizar-dash/src/web/ui/navigation/CommandPalette.tsx +199 -0
  198. package/bizar-dash/src/web/ui/navigation/NavGroup.tsx +95 -0
  199. package/bizar-dash/src/web/ui/navigation/NavLink.tsx +93 -0
  200. package/bizar-dash/src/web/ui/navigation/index.ts +17 -0
  201. package/bizar-dash/src/web/ui/navigation/navigation.css +343 -0
  202. package/bizar-dash/src/web/ui/primitives/Box.tsx +91 -0
  203. package/bizar-dash/src/web/ui/primitives/Grid.tsx +49 -0
  204. package/bizar-dash/src/web/ui/primitives/Inline.tsx +55 -0
  205. package/bizar-dash/src/web/ui/primitives/Separator.tsx +46 -0
  206. package/bizar-dash/src/web/ui/primitives/Stack.tsx +54 -0
  207. package/bizar-dash/src/web/ui/primitives/VisuallyHidden.tsx +26 -0
  208. package/bizar-dash/src/web/ui/primitives/index.ts +23 -0
  209. package/bizar-dash/src/web/ui/primitives/primitives.css +183 -0
  210. package/bizar-dash/src/web/ui/styles/globals.css +86 -0
  211. package/bizar-dash/src/web/ui/styles/reset.css +125 -0
  212. package/bizar-dash/src/web/ui/styles/tokens.css +195 -0
  213. package/bizar-dash/src/web/ui/theme/ThemeProvider.tsx +142 -0
  214. package/bizar-dash/src/web/ui/theme/tokens.ts +131 -0
  215. package/bizar-dash/src/web/ui/theme/useTheme.ts +22 -0
  216. package/bizar-dash/src/web/ui/utils/cx.ts +42 -0
  217. package/bizar-dash/src/web/views/Agents.tsx +506 -266
  218. package/bizar-dash/src/web/views/Chat.tsx +8 -8
  219. package/bizar-dash/src/web/views/GoalPlanner.tsx +158 -0
  220. package/bizar-dash/src/web/views/Overview.tsx +996 -448
  221. package/bizar-dash/src/web/views/Tasks.tsx +277 -273
  222. package/bizar-dash/tests/communication-log.test.tsx +67 -0
  223. package/bizar-dash/tests/dep-graph.test.tsx +40 -0
  224. package/bizar-dash/tests/event-log.test.tsx +61 -0
  225. package/bizar-dash/tests/goal-input.test.tsx +72 -0
  226. package/bizar-dash/tests/goap-planner.test.ts +68 -0
  227. package/bizar-dash/tests/quality-gates.test.tsx +59 -0
  228. package/bizar-dash/tests/setup.ts +31 -1
  229. package/bizar-dash/tests/ui/controls/Button.test.tsx +50 -0
  230. package/bizar-dash/tests/ui/controls/Checkbox.test.tsx +44 -0
  231. package/bizar-dash/tests/ui/controls/IconButton.test.tsx +37 -0
  232. package/bizar-dash/tests/ui/controls/Kbd.test.tsx +39 -0
  233. package/bizar-dash/tests/ui/controls/NumberInput.test.tsx +56 -0
  234. package/bizar-dash/tests/ui/controls/RadioGroup.test.tsx +58 -0
  235. package/bizar-dash/tests/ui/controls/SearchInput.test.tsx +52 -0
  236. package/bizar-dash/tests/ui/controls/Select.test.tsx +66 -0
  237. package/bizar-dash/tests/ui/controls/Slider.test.tsx +41 -0
  238. package/bizar-dash/tests/ui/controls/TextInput.test.tsx +44 -0
  239. package/bizar-dash/tests/ui/controls/Toggle.test.tsx +39 -0
  240. package/bizar-dash/tests/ui/data/BarChart.test.tsx +55 -0
  241. package/bizar-dash/tests/ui/data/DataTable.test.tsx +112 -0
  242. package/bizar-dash/tests/ui/data/EmptyState.test.tsx +57 -0
  243. package/bizar-dash/tests/ui/data/ErrorState.test.tsx +47 -0
  244. package/bizar-dash/tests/ui/data/KeyValueList.test.tsx +59 -0
  245. package/bizar-dash/tests/ui/data/LoadingState.test.tsx +37 -0
  246. package/bizar-dash/tests/ui/data/Sparkline.test.tsx +56 -0
  247. package/bizar-dash/tests/ui/data/StatTile.test.tsx +69 -0
  248. package/bizar-dash/tests/ui/feedback/Badge.test.tsx +41 -0
  249. package/bizar-dash/tests/ui/feedback/Dialog.test.tsx +99 -0
  250. package/bizar-dash/tests/ui/feedback/ProgressBar.test.tsx +66 -0
  251. package/bizar-dash/tests/ui/feedback/StatusDot.test.tsx +41 -0
  252. package/bizar-dash/tests/ui/feedback/Toast.test.tsx +124 -0
  253. package/bizar-dash/tests/ui/feedback/Tooltip.test.tsx +102 -0
  254. package/bizar-dash/tests/ui/layout/AppShell.test.tsx +50 -0
  255. package/bizar-dash/tests/ui/layout/Breadcrumbs.test.tsx +85 -0
  256. package/bizar-dash/tests/ui/layout/Panel.test.tsx +52 -0
  257. package/bizar-dash/tests/ui/layout/PanelHeader.test.tsx +32 -0
  258. package/bizar-dash/tests/ui/layout/Sidebar.test.tsx +95 -0
  259. package/bizar-dash/tests/ui/layout/Tabs.test.tsx +87 -0
  260. package/bizar-dash/tests/ui/layout/Topbar.test.tsx +41 -0
  261. package/bizar-dash/tests/ui/navigation/CommandPalette.test.tsx +105 -0
  262. package/bizar-dash/tests/ui/navigation/NavGroup.test.tsx +55 -0
  263. package/bizar-dash/tests/ui/navigation/NavLink.test.tsx +61 -0
  264. package/bizar-dash/tests/ui/primitives/Box.test.tsx +49 -0
  265. package/bizar-dash/tests/ui/primitives/Grid.test.tsx +37 -0
  266. package/bizar-dash/tests/ui/primitives/Inline.test.tsx +33 -0
  267. package/bizar-dash/tests/ui/primitives/Separator.test.tsx +34 -0
  268. package/bizar-dash/tests/ui/primitives/Stack.test.tsx +45 -0
  269. package/bizar-dash/tests/ui/primitives/VisuallyHidden.test.tsx +27 -0
  270. package/bizar-dash/tests/views/Agents.test.tsx +359 -0
  271. package/bizar-dash/tests/views/Overview.test.tsx +413 -0
  272. package/bizar-dash/tests/views/Tasks.test.tsx +250 -0
  273. package/bizar-dash/vitest.config.ts +3 -1
  274. package/cli/__tests__/cost-gate.test.mjs +301 -0
  275. package/cli/__tests__/feature-list-bridge.test.mjs +371 -0
  276. package/cli/bin.mjs +55 -18
  277. package/cli/commands/claim.mjs +282 -0
  278. package/cli/commands/claude-cmd.mjs +348 -0
  279. package/cli/commands/cost.mjs +279 -0
  280. package/cli/commands/install.mjs +12 -11
  281. package/cli/commands/validate.mjs +252 -325
  282. package/cli/cost-gate.mjs +501 -0
  283. package/cli/dev-link.test.mjs +11 -11
  284. package/cli/doctor.mjs +131 -213
  285. package/cli/feature-list-bridge.mjs +400 -0
  286. package/cli/install.mjs +33 -37
  287. package/cli/install.test.mjs +9 -9
  288. package/cli/memory-constants.mjs +17 -0
  289. package/cli/provision-claude.mjs +893 -0
  290. package/cli/provision.mjs +224 -227
  291. package/cli/utils.mjs +72 -58
  292. package/cli/worker-dispatcher.mjs +259 -0
  293. package/cli/worker-dispatcher.test.mjs +204 -0
  294. package/config/AGENTS.md +28 -28
  295. package/config/trigger-patterns.json +186 -0
  296. package/install.sh +66 -44
  297. package/package.json +19 -11
  298. package/packages/sdk/ARCHITECTURE.md +40 -36
  299. package/packages/sdk/package.json +15 -5
  300. package/packages/sdk/src/agent-registry.ts +304 -0
  301. package/packages/sdk/src/consensus/byzantine.ts +587 -0
  302. package/packages/sdk/src/consensus/index.ts +147 -0
  303. package/packages/sdk/src/consensus/queen.ts +173 -0
  304. package/packages/sdk/src/consensus/types.ts +199 -0
  305. package/{plugins/bizar → packages/sdk}/src/dangerous-patterns.ts +6 -28
  306. package/packages/sdk/src/federation/audit.ts +156 -0
  307. package/packages/sdk/src/federation/budget.ts +269 -0
  308. package/packages/sdk/src/federation/envelope.ts +144 -0
  309. package/packages/sdk/src/federation/hmac.ts +160 -0
  310. package/packages/sdk/src/federation/index.ts +443 -0
  311. package/packages/sdk/src/federation/pii.ts +241 -0
  312. package/packages/sdk/src/federation/policy.ts +112 -0
  313. package/packages/sdk/src/federation/trust.ts +146 -0
  314. package/packages/sdk/src/fingerprint.ts +0 -0
  315. package/packages/sdk/src/index.ts +101 -69
  316. package/packages/sdk/src/mcp/bin.ts +51 -0
  317. package/packages/sdk/src/mcp/server.ts +848 -0
  318. package/{plugins/bizar/src/memory-vault.ts → packages/sdk/src/memory/index.ts} +18 -21
  319. package/packages/sdk/src/router/codemod-intent.ts +125 -0
  320. package/packages/sdk/src/router/index.ts +247 -0
  321. package/packages/sdk/src/router/memory-distillation-shim.mjs +18 -0
  322. package/packages/sdk/src/router/memory-distillation.ts +249 -0
  323. package/packages/sdk/src/router/model-router.ts +235 -0
  324. package/packages/sdk/src/router/q-learning-router.ts +304 -0
  325. package/packages/sdk/src/swarm-topology.ts +279 -0
  326. package/packages/sdk/tests/agent-registry.test.ts +285 -0
  327. package/packages/sdk/tests/consensus.test.ts +376 -0
  328. package/packages/sdk/tests/federation/audit.test.ts +164 -0
  329. package/packages/sdk/tests/federation/budget.test.ts +189 -0
  330. package/packages/sdk/tests/federation/envelope.test.ts +120 -0
  331. package/packages/sdk/tests/federation/hmac.test.ts +194 -0
  332. package/packages/sdk/tests/federation/orchestrator.test.ts +176 -0
  333. package/packages/sdk/tests/federation/pii.test.ts +106 -0
  334. package/packages/sdk/tests/federation/policy.test.ts +140 -0
  335. package/packages/sdk/tests/federation/trust.test.ts +124 -0
  336. package/packages/sdk/tests/mcp-tools.test.ts +204 -0
  337. package/packages/sdk/tests/memory-distillation.test.mjs +186 -0
  338. package/packages/sdk/tests/model-router.test.mjs +108 -0
  339. package/packages/sdk/tests/q-learning-router.test.mjs +100 -0
  340. package/packages/sdk/tests/router-orchestrator.test.mjs +172 -0
  341. package/packages/sdk/tests/router.test.mjs +91 -0
  342. package/packages/sdk/tests/sdk.test.mjs +172 -0
  343. package/packages/sdk/tests/swarm-topology.test.ts +258 -0
  344. package/packages/sdk/vitest.config.ts +1 -1
  345. package/scripts/bh-full-e2e.mjs +167 -368
  346. package/scripts/check-deps.mjs +28 -46
  347. package/scripts/mirror-claude-md.sh +78 -0
  348. package/scripts/test-in-container.sh +31 -9
  349. package/templates/clean-state-checklist.md +3 -3
  350. package/templates/sprint-contract.md +2 -2
  351. package/bizar-dash/.bizar/activity.log +0 -3
  352. package/bizar-dash/.omx/logs/omx-2026-07-07.jsonl +0 -1
  353. package/bizar-dash/.omx/state/session.json +0 -10
  354. package/bizar-dash/bizar-design/EXPLANATION.md +0 -307
  355. package/bizar-dash/bizar-design/INSTRUCTIONS.md +0 -149
  356. package/bizar-dash/bizar-design/canvas.html +0 -281
  357. package/bizar-dash/bizar-design/canvas.html.artifact.json +0 -19
  358. package/bizar-dash/bizar-design/components.css +0 -1665
  359. package/bizar-dash/bizar-design/components.html +0 -557
  360. package/bizar-dash/bizar-design/components.html.artifact.json +0 -19
  361. package/bizar-dash/bizar-design/desktop/agents.html +0 -74
  362. package/bizar-dash/bizar-design/desktop/agents.html.artifact.json +0 -19
  363. package/bizar-dash/bizar-design/desktop/memory.html +0 -75
  364. package/bizar-dash/bizar-design/desktop/memory.html.artifact.json +0 -19
  365. package/bizar-dash/bizar-design/desktop/metrics.html +0 -63
  366. package/bizar-dash/bizar-design/desktop/metrics.html.artifact.json +0 -19
  367. package/bizar-dash/bizar-design/desktop/overview.html +0 -95
  368. package/bizar-dash/bizar-design/desktop/overview.html.artifact.json +0 -19
  369. package/bizar-dash/bizar-design/desktop/settings.html +0 -70
  370. package/bizar-dash/bizar-design/desktop/settings.html.artifact.json +0 -19
  371. package/bizar-dash/bizar-design/icons.svg +0 -44
  372. package/bizar-dash/bizar-design/index.html +0 -192
  373. package/bizar-dash/bizar-design/index.html.artifact.json +0 -19
  374. package/bizar-dash/bizar-design/mobile/agents.html +0 -29
  375. package/bizar-dash/bizar-design/mobile/agents.html.artifact.json +0 -19
  376. package/bizar-dash/bizar-design/mobile/memory.html +0 -28
  377. package/bizar-dash/bizar-design/mobile/memory.html.artifact.json +0 -19
  378. package/bizar-dash/bizar-design/mobile/metrics.html +0 -29
  379. package/bizar-dash/bizar-design/mobile/metrics.html.artifact.json +0 -19
  380. package/bizar-dash/bizar-design/mobile/overview.html +0 -33
  381. package/bizar-dash/bizar-design/mobile/overview.html.artifact.json +0 -19
  382. package/bizar-dash/bizar-design/mobile/settings.html +0 -28
  383. package/bizar-dash/bizar-design/mobile/settings.html.artifact.json +0 -19
  384. package/bizar-dash/bizar-design/prototype.js +0 -114
  385. package/bizar-dash/bizar-design/tokens.css +0 -106
  386. package/bizar-dash/dist/assets/MobileChat-BnKN_Ks_.js +0 -1
  387. package/bizar-dash/dist/assets/MobileSettings-DjCPxC-Q.js +0 -1
  388. package/bizar-dash/dist/assets/icons-Do5N2jmX.js.map +0 -1
  389. package/bizar-dash/dist/assets/main-DYiZqMrn.js +0 -18
  390. package/bizar-dash/dist/assets/main-DYiZqMrn.js.map +0 -1
  391. package/bizar-dash/dist/assets/main-ietCEg_R.css +0 -1
  392. package/bizar-dash/dist/assets/markdown-C6mXtQxD.js +0 -1
  393. package/bizar-dash/dist/assets/mobile-CMHqtLV2.js +0 -1
  394. package/bizar-dash/dist/assets/mobile-layout-3jIhHX_p.js +0 -2
  395. package/bizar-dash/dist/assets/mobile-layout-3jIhHX_p.js.map +0 -1
  396. package/bizar-dash/dist/assets/react-vendor-Dn4wqh4Z.js +0 -40
  397. package/bizar-dash/dist/assets/react-vendor-Dn4wqh4Z.js.map +0 -1
  398. package/bizar-dash/dist/assets/useSlashCommands-DtITw8Xv.js +0 -2
  399. package/bizar-dash/dist/assets/useSlashCommands-DtITw8Xv.js.map +0 -1
  400. package/bizar-dash/dist/assets/vendor-CeHGtduv.js +0 -29
  401. package/bizar-dash/dist/assets/vendor-CeHGtduv.js.map +0 -1
  402. package/bizar-dash/node_modules/.package-lock.json +0 -6
  403. package/bizar-dash/package-lock.json +0 -6
  404. package/bizar-dash/src/server/cline-sdk.mjs +0 -132
  405. package/bizar-dash/src/server/routes/cline-session-detail.mjs +0 -559
  406. package/bizar-dash/src/server/routes/cline-sessions.mjs +0 -291
  407. package/cli/commands/cline-cmd.mjs +0 -289
  408. package/cli/commands/validate.test.mjs +0 -379
  409. package/cli/doctor.test.mjs +0 -350
  410. package/config/cline.json.template +0 -342
  411. package/packages/sdk/src/client.ts +0 -188
  412. package/packages/sdk/src/cline-events.ts +0 -134
  413. package/packages/sdk/src/cline-types.ts +0 -66
  414. package/packages/sdk/src/cline.ts +0 -339
  415. package/packages/sdk/src/errors.ts +0 -129
  416. package/packages/sdk/src/events.ts +0 -153
  417. package/packages/sdk/src/types.ts +0 -176
  418. package/packages/sdk/tests/client.test.ts +0 -217
  419. package/packages/sdk/tests/errors.test.ts +0 -108
  420. package/packages/sdk/tests/events.test.ts +0 -139
  421. package/packages/sdk/tests/fixtures/fetch-mock.ts +0 -152
  422. package/packages/sdk/tests/fixtures/sse-mock.ts +0 -30
  423. package/plugins/bizar/ARCHITECTURE.md +0 -142
  424. package/plugins/bizar/CONSTRAINTS.md +0 -67
  425. package/plugins/bizar/LICENSE +0 -21
  426. package/plugins/bizar/README.md +0 -448
  427. package/plugins/bizar/index.ts +0 -925
  428. package/plugins/bizar/package.json +0 -39
  429. package/plugins/bizar/scripts/check-forbidden-imports.sh +0 -33
  430. package/plugins/bizar/src/background-state.ts +0 -641
  431. package/plugins/bizar/src/background.ts +0 -1806
  432. package/plugins/bizar/src/cline-runner.ts +0 -203
  433. package/plugins/bizar/src/clineruntime.ts +0 -227
  434. package/plugins/bizar/src/commands-impl.ts +0 -151
  435. package/plugins/bizar/src/commands.ts +0 -1799
  436. package/plugins/bizar/src/compaction.d.mts +0 -48
  437. package/plugins/bizar/src/compaction.mjs +0 -192
  438. package/plugins/bizar/src/dashboard-client.ts +0 -233
  439. package/plugins/bizar/src/event-stream.ts +0 -606
  440. package/plugins/bizar/src/fingerprint.ts +0 -120
  441. package/plugins/bizar/src/handoff.ts +0 -79
  442. package/plugins/bizar/src/hooks/memory-flush-on-compact.ts +0 -123
  443. package/plugins/bizar/src/hooks/memory-inject.ts +0 -247
  444. package/plugins/bizar/src/hooks/memory-write-on-end.ts +0 -188
  445. package/plugins/bizar/src/hooks/skill-curator.ts +0 -180
  446. package/plugins/bizar/src/http-client.ts +0 -467
  447. package/plugins/bizar/src/key-rotation.ts +0 -218
  448. package/plugins/bizar/src/logger.ts +0 -144
  449. package/plugins/bizar/src/loop-engineering.ts +0 -241
  450. package/plugins/bizar/src/loop.ts +0 -176
  451. package/plugins/bizar/src/mistake-recovery.ts +0 -98
  452. package/plugins/bizar/src/odin.ts +0 -227
  453. package/plugins/bizar/src/options.ts +0 -470
  454. package/plugins/bizar/src/plan-fs.ts +0 -323
  455. package/plugins/bizar/src/reasoning-clean.ts +0 -454
  456. package/plugins/bizar/src/report.ts +0 -178
  457. package/plugins/bizar/src/research-prompt.ts +0 -35
  458. package/plugins/bizar/src/serve-info.ts +0 -228
  459. package/plugins/bizar/src/serve.ts +0 -496
  460. package/plugins/bizar/src/settings.ts +0 -349
  461. package/plugins/bizar/src/state.ts +0 -298
  462. package/plugins/bizar/src/tool-discipline.ts +0 -105
  463. package/plugins/bizar/src/tools/agent-browser.ts +0 -315
  464. package/plugins/bizar/src/tools/bg-collect.ts +0 -131
  465. package/plugins/bizar/src/tools/bg-get-comments.ts +0 -266
  466. package/plugins/bizar/src/tools/bg-kill.ts +0 -116
  467. package/plugins/bizar/src/tools/bg-pause.ts +0 -99
  468. package/plugins/bizar/src/tools/bg-report-progress.ts +0 -115
  469. package/plugins/bizar/src/tools/bg-resume.ts +0 -94
  470. package/plugins/bizar/src/tools/bg-send-message.ts +0 -223
  471. package/plugins/bizar/src/tools/bg-spawn.ts +0 -502
  472. package/plugins/bizar/src/tools/bg-status.ts +0 -130
  473. package/plugins/bizar/src/tools/graph-query.ts +0 -278
  474. package/plugins/bizar/src/tools/loop-engineering.ts +0 -193
  475. package/plugins/bizar/src/tools/memory-list.ts +0 -43
  476. package/plugins/bizar/src/tools/memory-read.ts +0 -69
  477. package/plugins/bizar/src/tools/memory-search.ts +0 -47
  478. package/plugins/bizar/src/tools/memory-write.ts +0 -54
  479. package/plugins/bizar/src/tools/open-kb.ts +0 -198
  480. package/plugins/bizar/src/tools/plan-action.ts +0 -785
  481. package/plugins/bizar/src/tools/read-glyph-feedback.ts +0 -191
  482. package/plugins/bizar/src/tools/sandbox.ts +0 -232
  483. package/plugins/bizar/src/tools/team-spawn.ts +0 -73
  484. package/plugins/bizar/src/tools/team-status.ts +0 -76
  485. package/plugins/bizar/src/tools/wait-for-feedback.ts +0 -415
  486. package/plugins/bizar/src/trajectory.ts +0 -104
  487. package/plugins/bizar/tests/README.md +0 -99
  488. package/plugins/bizar/tests/attach-handler-bug.test.ts +0 -169
  489. package/plugins/bizar/tests/background-state.test.ts +0 -277
  490. package/plugins/bizar/tests/background.test.ts +0 -402
  491. package/plugins/bizar/tests/block.test.ts +0 -195
  492. package/plugins/bizar/tests/canonical-key-order.test.ts +0 -75
  493. package/plugins/bizar/tests/clineruntime-config.test.ts +0 -283
  494. package/plugins/bizar/tests/commands-impl.test.ts +0 -316
  495. package/plugins/bizar/tests/commands.test.ts +0 -584
  496. package/plugins/bizar/tests/compaction.test.ts +0 -264
  497. package/plugins/bizar/tests/config.test.ts +0 -128
  498. package/plugins/bizar/tests/dashboard-client.test.ts +0 -159
  499. package/plugins/bizar/tests/dispose.test.ts +0 -336
  500. package/plugins/bizar/tests/event-stream.test.ts +0 -409
  501. package/plugins/bizar/tests/event.test.ts +0 -262
  502. package/plugins/bizar/tests/fingerprint.test.ts +0 -190
  503. package/plugins/bizar/tests/http-client.test.ts +0 -404
  504. package/plugins/bizar/tests/init-helpers.test.ts +0 -203
  505. package/plugins/bizar/tests/integration/slash-command.test.ts +0 -349
  506. package/plugins/bizar/tests/integration/tool-routing.test.ts +0 -98
  507. package/plugins/bizar/tests/key-rotation.test.ts +0 -396
  508. package/plugins/bizar/tests/loop-engineering.test.ts +0 -168
  509. package/plugins/bizar/tests/loop.test.ts +0 -397
  510. package/plugins/bizar/tests/memory-write-on-end.test.ts +0 -92
  511. package/plugins/bizar/tests/mistake-recovery.test.ts +0 -116
  512. package/plugins/bizar/tests/odin.test.ts +0 -125
  513. package/plugins/bizar/tests/options.test.ts +0 -329
  514. package/plugins/bizar/tests/reasoning-clean.test.ts +0 -422
  515. package/plugins/bizar/tests/safety.test.ts +0 -281
  516. package/plugins/bizar/tests/serve.test.ts +0 -339
  517. package/plugins/bizar/tests/settings.test.ts +0 -351
  518. package/plugins/bizar/tests/stall-think.test.ts +0 -750
  519. package/plugins/bizar/tests/state.test.ts +0 -276
  520. package/plugins/bizar/tests/tool-discipline.test.ts +0 -77
  521. package/plugins/bizar/tests/tools/agent-browser.test.ts +0 -98
  522. package/plugins/bizar/tests/tools/bg-collect.test.ts +0 -337
  523. package/plugins/bizar/tests/tools/bg-get-comments.test.ts +0 -485
  524. package/plugins/bizar/tests/tools/bg-kill.test.ts +0 -235
  525. package/plugins/bizar/tests/tools/bg-pause.test.ts +0 -61
  526. package/plugins/bizar/tests/tools/bg-report-progress.test.ts +0 -79
  527. package/plugins/bizar/tests/tools/bg-resume.test.ts +0 -40
  528. package/plugins/bizar/tests/tools/bg-send-message.test.ts +0 -116
  529. package/plugins/bizar/tests/tools/bg-spawn-delegation.test.ts +0 -147
  530. package/plugins/bizar/tests/tools/bg-spawn-http.test.ts +0 -233
  531. package/plugins/bizar/tests/tools/bg-spawn.test.ts +0 -311
  532. package/plugins/bizar/tests/tools/bg-status.test.ts +0 -217
  533. package/plugins/bizar/tests/tools/cline-runner.test.ts +0 -115
  534. package/plugins/bizar/tests/tools/plan-action.test.ts +0 -599
  535. package/plugins/bizar/tests/tools/read-glyph-feedback.test.ts +0 -253
  536. package/plugins/bizar/tests/tools/sandbox.test.ts +0 -117
  537. package/plugins/bizar/tests/tools/wait-for-feedback.test.ts +0 -390
  538. package/plugins/bizar/tests/update-deadlock.test.ts +0 -151
  539. package/plugins/bizar/tsconfig.json +0 -29
  540. package/scripts/mirror-agents-md.sh +0 -69
package/cli/doctor.mjs CHANGED
@@ -1,86 +1,53 @@
1
1
  /**
2
2
  * cli/doctor.mjs
3
3
  *
4
- * v3.12.2 — `bizar doctor` subcommand.
4
+ * v6.3.0 — `bizar doctor` subcommand (Claude Code-native).
5
5
  *
6
- * Runs a battery of health checks against the local Bizar / cline
6
+ * Runs a battery of health checks against the local Bizar / Claude Code
7
7
  * install and reports pass/fail for each. Returns a structured summary
8
8
  * suitable for callers (e.g. `bizar update`) that want to act on the
9
9
  * result without re-printing the per-check output.
10
10
  *
11
- * The checks are intentionally tolerant: missing optional tools
12
- * (headroom/semble/skills) don't fail the run, and the dashboard check
13
- * is skipped silently if no port file exists. The goal is "is your
14
- * install healthy?" not "is every conceivable thing present?".
11
+ * Checks (9 total):
12
+ * claude-cli-reachable: claude --version exits 0
13
+ * settings-valid: ~/.claude/settings.json parses
14
+ * mcp-server-registered: settings.json has mcpServers.bizar
15
+ * hooks-wired: settings.json has PreToolUse/PostToolUse/etc
16
+ * agent-files-installed: agent .md files deployed
17
+ * skill-files-installed: SKILL.md files deployed
18
+ * tools-on-path: at least one of headroom/semble/skills/claude
19
+ * memory-vault: BIZAR_HOME exists (memory subdir lazy)
20
+ * 9router-reachable: provider gateway responds
15
21
  *
16
22
  * Usage:
17
- * import { runDoctor } from './doctor.mjs';
18
- * const r = await runDoctor(); // prints everything
19
- * const r = await runDoctor({ silent: true }); // returns summary only
23
+ * import { runDoctor } from "./doctor.mjs";
24
+ * const r = await runDoctor();
25
+ * const r = await runDoctor({ silent: true });
20
26
  */
21
27
  import chalk from 'chalk';
22
28
  import { spawnSync } from 'node:child_process';
23
- import { existsSync, readFileSync } from 'node:fs';
29
+ import { existsSync, readFileSync, statSync, readdirSync } from 'node:fs';
24
30
  import { join } from 'node:path';
25
- import { clineConfigDir, clineAgentsDir, which, bizarConfigDir } from './utils.mjs';
31
+ import { homedir } from 'node:os';
26
32
 
27
- // v3.20.11: list every agent the install script is expected to deploy.
28
- // Adding a new agent to `config/agents/` without adding it here causes
29
- // doctor to silently under-count ("all 4 core agents present" when there
30
- // are actually 14). The list mirrors cli/install.mjs AGENT_FILES plus
31
- // `agent-browser.md` (added in v3.20.7) and `_shared/AGENT_BASELINE.md`
32
- // is intentionally excluded (it's a skill, not an agent).
33
- const REQUIRED_AGENTS = [
34
- 'odin.md',
35
- 'vor.md',
36
- 'frigg.md',
37
- 'quick.md',
38
- 'mimir.md',
39
- 'heimdall.md',
40
- 'hermod.md',
41
- 'thor.md',
42
- 'baldr.md',
43
- 'tyr.md',
44
- 'vidarr.md',
45
- 'forseti.md',
46
- 'semble-search.md',
47
- 'agent-browser.md',
48
- ];
49
-
50
- // ── helpers ─────────────────────────────────────────────────────────────────
51
-
52
- /**
53
- * Run a check function and capture its result. The check either
54
- * returns a string message (pass) or throws an Error (fail).
55
- */
56
- async function runCheck(name, fn) {
57
- try {
58
- const message = await fn();
59
- return { name, ok: true, message: message || 'ok' };
60
- } catch (err) {
61
- return {
62
- name,
63
- ok: false,
64
- message: err && err.message ? err.message : String(err),
65
- };
66
- }
67
- }
33
+ const CLAUDE_DIR = process.env.CLAUDE_CONFIG_DIR || join(homedir(), '.claude');
34
+ const BIZAR_HOME = process.env.BIZAR_HOME || join(homedir(), '.bizar_home');
68
35
 
69
36
  // ── individual checks ───────────────────────────────────────────────────────
70
37
 
71
- async function checkClineReachable() {
72
- const r = spawnSync('cline', ['--version'], {
38
+ async function checkClaudeReachable() {
39
+ const r = spawnSync('claude', ['--version'], {
73
40
  encoding: 'utf8',
74
41
  timeout: 5000,
75
42
  });
76
43
  if (r.status !== 0) {
77
- throw new Error(`cline --version exited ${r.status}`);
44
+ throw new Error(`claude --version exited ${r.status}`);
78
45
  }
79
- return (r.stdout || r.stderr || '').trim().split('\n')[0] || 'cline available';
46
+ return (r.stdout || r.stderr || '').trim().split('\n')[0] || 'claude available';
80
47
  }
81
48
 
82
- async function checkConfigValid() {
83
- const cfgPath = join(clineConfigDir(), 'cline.json');
49
+ async function checkSettingsValid() {
50
+ const cfgPath = join(CLAUDE_DIR, 'settings.json');
84
51
  if (!existsSync(cfgPath)) {
85
52
  throw new Error(`not found at ${cfgPath}`);
86
53
  }
@@ -89,73 +56,56 @@ async function checkConfigValid() {
89
56
  } catch (err) {
90
57
  throw new Error(`invalid JSON: ${err.message}`);
91
58
  }
92
- return 'cline.json parses';
59
+ return 'settings.json parses';
93
60
  }
94
61
 
95
- async function checkPluginEntryPresent() {
96
- const cfgPath = join(clineConfigDir(), 'cline.json');
62
+ async function checkMcpServerRegistered() {
63
+ const cfgPath = join(CLAUDE_DIR, 'settings.json');
97
64
  const cfg = JSON.parse(readFileSync(cfgPath, 'utf8'));
98
- const plugins = Array.isArray(cfg.plugin) ? cfg.plugin : [];
99
- if (plugins.length === 0) {
100
- throw new Error('no plugin entries in cline.json');
65
+ const servers = cfg.mcpServers || {};
66
+ if (!servers.bizar) {
67
+ throw new Error('mcpServers.bizar missing from settings.json');
101
68
  }
102
- const hasBizar = plugins.some((p) => {
103
- if (typeof p === 'string') return p.includes('bizar');
104
- if (Array.isArray(p)) {
105
- const [path] = p;
106
- return typeof path === 'string' && path.includes('bizar');
107
- }
108
- if (p && typeof p === 'object') {
109
- return (
110
- (p.name || '').includes('bizar') ||
111
- (p.path || '').includes('bizar')
112
- );
113
- }
114
- return false;
115
- });
116
- if (!hasBizar) {
117
- throw new Error('bizar not found in plugin[]');
118
- }
119
- return 'bizar present in plugin[]';
69
+ return `bizar MCP server registered (${servers.bizar.command ?? '?'})`;
120
70
  }
121
71
 
122
- async function checkPluginPathResolves() {
123
- const cfgPath = join(clineConfigDir(), 'cline.json');
72
+ async function checkHooksWired() {
73
+ const cfgPath = join(CLAUDE_DIR, 'settings.json');
124
74
  const cfg = JSON.parse(readFileSync(cfgPath, 'utf8'));
125
- const plugins = Array.isArray(cfg.plugin) ? cfg.plugin : [];
126
- let lastChecked = null;
127
- for (const p of plugins) {
128
- let entryPath = null;
129
- if (Array.isArray(p)) {
130
- const [path] = p;
131
- if (typeof path === 'string') entryPath = path;
132
- } else if (p && typeof p === 'object' && p.path) {
133
- entryPath = p.path;
134
- }
135
- if (!entryPath) continue;
136
- const isAbs = entryPath.startsWith('/') || /^[a-z]:[\\/]/i.test(entryPath);
137
- const resolved = isAbs ? entryPath : join(clineConfigDir(), entryPath);
138
- lastChecked = resolved;
139
- if (!existsSync(resolved)) {
140
- throw new Error(`plugin path does not exist: ${resolved}`);
141
- }
142
- }
143
- if (lastChecked === null) {
144
- return 'no plugin path to check';
75
+ const hooks = cfg.hooks || {};
76
+ const required = ['PreToolUse', 'PostToolUse', 'SessionStart', 'UserPromptSubmit'];
77
+ const missing = required.filter((e) => !Array.isArray(hooks[e]) || hooks[e].length === 0);
78
+ if (missing.length > 0) {
79
+ throw new Error(`missing hook events: ${missing.join(', ')}`);
145
80
  }
146
- return `plugin path resolves: ${lastChecked}`;
81
+ return `hooks wired: ${required.join(', ')}`;
147
82
  }
148
83
 
149
84
  async function checkAgentFilesInstalled() {
150
- const dir = clineAgentsDir();
85
+ const dir = join(CLAUDE_DIR, 'agents');
151
86
  if (!existsSync(dir)) {
152
87
  throw new Error(`agents dir missing: ${dir}`);
153
88
  }
154
- const missing = REQUIRED_AGENTS.filter((f) => !existsSync(join(dir, f)));
155
- if (missing.length > 0) {
156
- throw new Error(`missing: ${missing.join(', ')}`);
89
+ const have = readdirSync(dir).filter((f) => f.endsWith('.md'));
90
+ if (have.length === 0) {
91
+ throw new Error('no agent .md files installed');
92
+ }
93
+ return `${have.length} agents installed: ${have.slice(0, 4).join(', ')}${have.length > 4 ? '…' : ''}`;
94
+ }
95
+
96
+ async function checkSkillFilesInstalled() {
97
+ const dir = join(CLAUDE_DIR, 'skills');
98
+ if (!existsSync(dir)) {
99
+ throw new Error(`skills dir missing: ${dir}`);
100
+ }
101
+ const skills = readdirSync(dir).filter((d) => {
102
+ const fp = join(dir, d, 'SKILL.md');
103
+ return existsSync(fp);
104
+ });
105
+ if (skills.length === 0) {
106
+ throw new Error('no SKILL.md files found');
157
107
  }
158
- return `all ${REQUIRED_AGENTS.length} core agents present`;
108
+ return `${skills.length} skills installed`;
159
109
  }
160
110
 
161
111
  /**
@@ -165,7 +115,7 @@ async function checkAgentFilesInstalled() {
165
115
  * overall health report.
166
116
  */
167
117
  async function checkToolsAvailable() {
168
- const tools = ['headroom', 'semble', 'skills'];
118
+ const tools = ['headroom', 'semble', 'skills', 'claude'];
169
119
  const found = tools.filter(which);
170
120
  if (found.length === 0) {
171
121
  throw new Error(`none of ${tools.join('/')} on PATH`);
@@ -173,127 +123,95 @@ async function checkToolsAvailable() {
173
123
  return `available: ${found.join(', ')}`;
174
124
  }
175
125
 
176
- async function checkProviderConfigSanity() {
177
- const cfgPath = join(clineConfigDir(), 'cline.json');
178
- if (!existsSync(cfgPath)) {
179
- throw new Error('cline.json missing');
126
+ async function checkMemoryVault() {
127
+ if (!existsSync(BIZAR_HOME)) {
128
+ throw new Error(`BIZAR_HOME missing: ${BIZAR_HOME}`);
180
129
  }
181
- const cfg = JSON.parse(readFileSync(cfgPath, 'utf8'));
182
-
183
- // v6.0.1 — 9router is the primary gateway. All Bizar agents
184
- // route through it via `9router/<model>` prefixed model IDs.
185
- const nine = cfg.provider && cfg.provider['9router'];
186
- if (nine && nine.baseUrl) {
187
- const models = nine.models || {};
188
- const sane = Object.keys(models).filter((id) => typeof id === 'string' && id.length > 0);
189
- if (sane.length === 0) {
190
- throw new Error(
191
- 'provider.9router block has no models (run `bizar update` to re-sync)',
192
- );
193
- }
194
- return `provider.9router baseUrl=${nine.baseUrl} sane (${sane.length} models)`;
130
+ const memDir = process.env.BIZAR_MEMORY_VAULT || join(BIZAR_HOME, 'memory');
131
+ if (!existsSync(memDir)) {
132
+ // Not fatal — the vault is created lazily on first write.
133
+ return `BIZAR_HOME present; memory vault will be created on demand`;
195
134
  }
196
-
197
- // Fallback: legacy `minimax` provider only. Kept for back-compat with
198
- // older pre-v6.0.1 cline.json installs.
199
- const minimax = cfg.provider && cfg.provider.minimax;
200
- if (!minimax) {
201
- return 'warn: no provider.9router AND no provider.minimax — run `bizar update`';
202
- }
203
- const models = minimax.models || {};
204
- const saneNames = Object.entries(models).filter(([, m]) => {
205
- return (
206
- m &&
207
- typeof m === 'object' &&
208
- 'interleaved' in m &&
209
- 'reasoning' in m
210
- );
211
- });
212
- if (saneNames.length === 0) {
213
- throw new Error(
214
- 'no MiniMax-style model with interleaved + reasoning flags',
215
- );
216
- }
217
- return `provider.minimax + ${saneNames.length} model(s) sane (legacy; consider migrating to provider.9router)`;
135
+ const st = statSync(memDir);
136
+ return `memory vault at ${memDir} (${st.isDirectory() ? 'dir' : '?'})`;
218
137
  }
219
138
 
220
- /**
221
- * v6.0.1 — Check 9Router reachability. 9Router is the Bizar gateway;
222
- * if it's down, agents can't reach any upstream. Lenient (warn) by
223
- * design — the user might be intentionally working offline — but a
224
- * loud warning keeps the issue from being silent.
225
- */
226
- async function check9routerReachable() {
227
- const url = process.env.NINEROUTER_URL || 'http://localhost:20128';
228
- const ac = new AbortController();
229
- const timer = setTimeout(() => ac.abort(), 4000);
139
+ async function check9RouterReachable() {
140
+ const url = process.env.NINEROUTER_URL || 'http://127.0.0.1:8787';
141
+ let res;
230
142
  try {
231
- const res = await fetch(`${url}/api/health`, { signal: ac.signal });
232
- if (!res.ok) {
233
- return `warn: 9router at ${url} returned HTTP ${res.status}`;
234
- }
235
- const body = await res.text().catch(() => '');
236
- if (!body.includes('"ok":true')) {
237
- return `warn: 9router at ${url} responded but body did not include ok:true (got: ${body.slice(0, 60)})`;
238
- }
239
- return `9router healthy at ${url}`;
143
+ res = await fetch(`${url}/health`, { signal: AbortSignal.timeout(3000) });
240
144
  } catch (err) {
241
- const reason = err.name === 'AbortError' ? 'timeout after 4s' : (err.message || 'unreachable');
242
- return `warn: 9router unreachable at ${url} — ${reason}`;
243
- } finally {
244
- clearTimeout(timer);
145
+ throw new Error(`9router at ${url} unreachable: ${err.message ?? err}`);
146
+ }
147
+ if (!res.ok) {
148
+ throw new Error(`9router at ${url} responded HTTP ${res.status}`);
245
149
  }
150
+ return `9router at ${url} ok`;
246
151
  }
247
152
 
153
+ // ── runner ──────────────────────────────────────────────────────────────────
154
+
248
155
  const CHECKS = [
249
- ['cline-reachable', checkClineReachable],
250
- ['cline-config-valid', checkConfigValid],
251
- ['plugin-entry-present', checkPluginEntryPresent],
252
- ['plugin-path-resolves', checkPluginPathResolves],
253
- ['agent-files-installed', checkAgentFilesInstalled],
254
- ['tools-available', checkToolsAvailable],
255
- ['provider-config-sanity', checkProviderConfigSanity],
256
- ['9router-reachable', check9routerReachable],
156
+ { name: 'claude-cli-reachable', run: checkClaudeReachable },
157
+ { name: 'settings-valid', run: checkSettingsValid },
158
+ { name: 'mcp-server-registered', run: checkMcpServerRegistered },
159
+ { name: 'hooks-wired', run: checkHooksWired },
160
+ { name: 'agent-files-installed', run: checkAgentFilesInstalled },
161
+ { name: 'skill-files-installed', run: checkSkillFilesInstalled },
162
+ { name: 'tools-on-path', run: checkToolsAvailable },
163
+ { name: 'memory-vault', run: checkMemoryVault },
164
+ { name: '9router-reachable', run: check9RouterReachable },
257
165
  ];
258
166
 
259
- // ── public API ──────────────────────────────────────────────────────────────
260
-
261
- /**
262
- * Run all health checks. Prints per-check output unless `opts.silent`.
263
- * Prints a final summary line unless `opts.json` is true.
264
- * Returns `{ passed, failed, results }`.
265
- */
266
167
  export async function runDoctor(opts = {}) {
267
168
  const silent = !!opts.silent;
268
- const jsonMode = !!opts.json;
269
169
  const results = [];
270
- for (const [name, fn] of CHECKS) {
271
- const r = await runCheck(name, fn);
272
- results.push(r);
170
+ let passed = 0;
171
+ let failed = 0;
172
+
173
+ for (const check of CHECKS) {
174
+ let result;
175
+ try {
176
+ const message = await check.run();
177
+ result = { name: check.name, ok: true, message: message ?? 'ok' };
178
+ } catch (err) {
179
+ result = { name: check.name, ok: false, message: err?.message ?? String(err) };
180
+ }
181
+ results.push(result);
182
+ if (result.ok) passed += 1;
183
+ else failed += 1;
184
+
273
185
  if (!silent) {
274
- const marker = r.ok ? chalk.green('✓') : chalk.red('✗');
275
- const label = name.padEnd(28);
276
- const msg = r.ok ? chalk.dim(` ${r.message}`) : chalk.red(` ${r.message}`);
277
- console.log(` ${marker} ${label}${msg}`);
186
+ const tag = result.ok ? chalk.green(' ✔ ') : chalk.red(' ✖ ');
187
+ process.stdout.write(`${tag}${check.name}${result.ok ? '' : ` — ${result.message}`}\n`);
278
188
  }
279
189
  }
280
190
 
281
- const passed = results.filter((r) => r.ok).length;
282
- const failed = results.length - passed;
283
-
284
- // Print summary line only when not in JSON mode
285
- if (!jsonMode && (failed > 0 || !silent)) {
286
- console.log('');
287
- if (failed === 0) {
288
- console.log(
289
- chalk.green(` ✓ ${passed} checks passed, ${failed} failed`),
290
- );
291
- } else {
292
- console.log(
293
- chalk.yellow(` ⚠ ${passed} checks passed, ${failed} failed`),
294
- );
295
- }
191
+ if (!silent) {
192
+ const summary = chalk.bold(
193
+ failed > 0
194
+ ? chalk.red(`${failed} checks failed, ${passed} passed`)
195
+ : chalk.green(`${passed} checks passed`),
196
+ );
197
+ process.stdout.write(`\n${summary}\n`);
296
198
  }
297
199
 
298
200
  return { passed, failed, results };
299
- }
201
+ }
202
+
203
+ // ── helper ──────────────────────────────────────────────────────────────────
204
+
205
+ function which(cmd) {
206
+ const r = spawnSync('which', [cmd], { encoding: 'utf8' });
207
+ return r.status === 0 && !!r.stdout?.trim();
208
+ }
209
+
210
+ // Stand-alone CLI invocation (so `bizar doctor` still works when imported
211
+ // without the bin dispatcher).
212
+ if (import.meta.url === `file://${process.argv[1]}`) {
213
+ const silent = process.argv.includes('--silent');
214
+ runDoctor({ silent }).then(({ failed }) => {
215
+ process.exit(failed === 0 ? 0 : 1);
216
+ });
217
+ }