@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
@@ -1,49 +1,38 @@
1
1
  /**
2
- * /tmp/bh-full-e2e.mjs
2
+ * scripts/bh-full-e2e.mjs
3
3
  *
4
- * v6.2.0 — Bizar Harness end-to-end smoke test.
4
+ * v6.3.0 — Bizar Harness end-to-end smoke test (Claude Code-native).
5
5
  *
6
- * Loaded by `make e2e` (see Makefile) and by `scripts/clean-state-check.sh`
7
- * dimension #5. Boots the Bizar plugin in-process via ClineCore and
8
- * verifies that:
6
+ * Migrated from Cline to Claude Code. The previous version booted the
7
+ * Bizar plugin in-process via ClineCore and verified its tool surface;
8
+ * the new version verifies the SDK + Claude Code integration instead.
9
9
  *
10
- * 1. The plugin entry resolves + parses
11
- * 2. setup() returns within the budget (1s)
12
- * 3. ≥ 19 tools are registered (the documented tool count)
13
- * 4. 4 hooks are exposed (beforeTool, afterTool, beforeModel, onEvent)
14
- * 5. Cline agent teams plumbing is present (enableAgentTeams: true)
15
- * 6. The expected tool surface is present:
16
- * - plan tools: bizar_plan_action, bizar_wait_for_feedback,
17
- * bizar_get_plan_comments, bizar_read_glyph_feedback
18
- * - bg tools: bizar_spawn_background, bizar_status, bizar_collect,
19
- * bizar_kill, bizar_pause, bizar_resume,
20
- * bizar_send_message, bizar_report_progress
21
- * - team tools: bizar_spawn_team, bizar_team_status
22
- * - graph tools: bizar_graph_query, bizar_graph_path, bizar_graph_explain
23
- * - memory tools: bizar_memory_search, bizar_memory_read,
24
- * bizar_memory_write, bizar_memory_list
25
- * - kb tools: bizar_open_kb
26
- * - browser tools: bizar_browser_open, bizar_browser_snapshot,
27
- * bizar_browser_click, bizar_browser_fill,
28
- * bizar_browser_screenshot, bizar_browser_command
29
- * - loop tools: bizar_loop_engineering (or related)
10
+ * Verifies that:
11
+ *
12
+ * 1. The SDK package builds and resolves
13
+ * 2. The MCP server entry exists at packages/sdk/src/mcp/bin.ts
14
+ * 3. The MCP server exposes the documented tool surface
15
+ * 4. The claude CLI is reachable on PATH
16
+ * 5. Project-level Claude Code settings are sane (.claude/settings.json)
17
+ * 6. Required agent files exist
18
+ * 7. Required skills exist
19
+ * 8. The plugin shim at plugins/bizar/index.ts re-exports from the SDK
20
+ * (no @cline/* imports anywhere in plugins/bizar/index.ts)
30
21
  *
31
22
  * Exits 0 on success, 1 on any failure. The script is intentionally
32
23
  * self-contained — no test framework, no fixtures, no mock agents.
33
- * Prints a one-line summary at the end.
34
24
  *
35
- * Run with: `bun run /tmp/bh-full-e2e.mjs`
25
+ * Run with: `bun run scripts/bh-full-e2e.mjs`
36
26
  */
37
27
 
38
- import { existsSync } from 'node:fs';
28
+ import { existsSync, readFileSync, readdirSync } from 'node:fs';
39
29
  import { join, dirname, resolve } from 'node:path';
40
30
  import { fileURLToPath } from 'node:url';
31
+ import { spawnSync } from 'node:child_process';
41
32
 
42
33
  const __dirname = dirname(fileURLToPath(import.meta.url));
43
34
 
44
- // Resolve the Bizar repo root. This script is written to /tmp/ by
45
- // `make e2e` but it lives in the repo during development. Try the
46
- // cwd first, then walk up.
35
+ // Resolve the Bizar repo root. Try cwd first, then walk up.
47
36
  function findRepoRoot() {
48
37
  const candidates = [
49
38
  process.cwd(),
@@ -52,13 +41,15 @@ function findRepoRoot() {
52
41
  '/home/drb0rk/Projects/BizarHarness',
53
42
  ];
54
43
  for (const c of candidates) {
55
- if (existsSync(join(c, 'plugins', 'bizar', 'index.ts'))) return c;
44
+ if (existsSync(join(c, 'packages', 'sdk', 'src', 'index.ts'))) return c;
56
45
  }
57
46
  return process.cwd();
58
47
  }
59
48
 
60
49
  const REPO_ROOT = findRepoRoot();
61
- const PLUGIN_PATH = join(REPO_ROOT, 'plugins', 'bizar', 'index.ts');
50
+ const SDK_PATH = join(REPO_ROOT, 'packages', 'sdk', 'src', 'index.ts');
51
+ const MCP_BIN_PATH = join(REPO_ROOT, 'packages', 'sdk', 'src', 'mcp', 'bin.ts');
52
+ const PLUGIN_SHIM_PATH = join(REPO_ROOT, 'plugins', 'bizar', 'index.ts');
62
53
 
63
54
  const RESULTS = [];
64
55
  let totalChecks = 0;
@@ -75,425 +66,233 @@ function record(name, ok, message) {
75
66
  console.log(line);
76
67
  }
77
68
 
78
- const REQUIRED_TOOLS = {
79
- plan: [
80
- 'bizar_plan_action',
81
- 'bizar_wait_for_feedback',
82
- 'bizar_get_plan_comments',
83
- 'bizar_read_glyph_feedback',
84
- ],
85
- memory: [
86
- 'bizar_memory_search',
87
- 'bizar_memory_read',
88
- 'bizar_memory_write',
89
- 'bizar_memory_list',
90
- ],
91
- 'agent-teams': [
92
- 'bizar_spawn_team',
93
- 'bizar_team_status',
94
- ],
95
- graph: [
96
- 'bizar_graph_query',
97
- 'bizar_graph_path',
98
- 'bizar_graph_explain',
99
- ],
100
- 'open-kb': [
101
- 'bizar_open_kb',
102
- ],
103
- browser: [
104
- 'bizar_browser_open',
105
- 'bizar_browser_snapshot',
106
- 'bizar_browser_click',
107
- 'bizar_browser_fill',
108
- 'bizar_browser_screenshot',
109
- 'bizar_browser_command',
110
- ],
111
- };
112
-
113
- const MIN_TOOL_COUNT = 19;
114
-
115
- console.log(' ᚦ BIZAR E2E — full plugin + tool + hook verification ᚦ');
69
+ console.log(' ᚦ BIZAR E2E — SDK + Claude Code verification ᚦ');
116
70
  console.log('');
117
- console.log(` plugin: ${PLUGIN_PATH}`);
71
+ console.log(` sdk: ${SDK_PATH}`);
72
+ console.log(` mcp: ${MCP_BIN_PATH}`);
73
+ console.log(` plugin: ${PLUGIN_SHIM_PATH}`);
118
74
  console.log('');
119
75
 
120
- if (!existsSync(PLUGIN_PATH)) {
121
- record('plugin entry resolves', false, `${PLUGIN_PATH} not found`);
122
- console.log('');
123
- console.log(` ✗ ${passed}/${totalChecks} passed`);
124
- process.exit(1);
76
+ // ── 1. SDK package resolves ─────────────────────────────────────────────
77
+ if (!existsSync(SDK_PATH)) {
78
+ record('SDK entry resolves', false, `${SDK_PATH} not found`);
79
+ printSummaryAndExit();
125
80
  }
126
- record('plugin entry resolves', true, PLUGIN_PATH);
81
+ record('SDK entry resolves', true, SDK_PATH);
127
82
 
128
- // ── 1. Verify enableAgentTeams + enableSpawnAgent in source (v6.2.0 / v6.2.3) ───────
83
+ // ── 2. MCP server entry exists ──────────────────────────────────────────
84
+ if (!existsSync(MCP_BIN_PATH)) {
85
+ record('MCP server entry exists', false, `${MCP_BIN_PATH} not found`);
86
+ } else {
87
+ record('MCP server entry exists', true, MCP_BIN_PATH);
88
+ }
89
+
90
+ // ── 3. MCP server exposes the documented tool surface ──────────────────
129
91
  try {
130
- const { readFileSync } = await import('node:fs');
131
- const srcPath = join(REPO_ROOT, 'plugins', 'bizar', 'src', 'clineruntime.ts');
132
- if (!existsSync(srcPath)) {
133
- record('clineruntime.ts source present', false, `${srcPath} missing`);
92
+ const serverSrc = readFileSync(join(REPO_ROOT, 'packages', 'sdk', 'src', 'mcp', 'server.ts'), 'utf8');
93
+ // Tool surface updated for v6.4.0 (was: bizar_* prefix + sandbox/glyph/plan_comment tools
94
+ // that were removed in the v6.3.0 migration; F-032 + F-033 added agent/router tools).
95
+ const requiredTools = [
96
+ // v6.3.0 core
97
+ 'memory_read', 'memory_write', 'memory_list', 'memory_search',
98
+ 'plan_action', 'open_kb',
99
+ 'loop_list', 'loop_status', 'loop_start', 'loop_stop',
100
+ 'graph_query', 'graph_path', 'danger_check',
101
+ // F-032 Swarm Coordination
102
+ 'agent_spawn', 'agent_list', 'agent_terminate', 'swarm_init',
103
+ // F-033 Self-Learning
104
+ 'model_route', 'agent_route', 'memory_distill', 'hooks_route',
105
+ ];
106
+ const missing = requiredTools.filter((t) => !serverSrc.includes(t));
107
+ if (missing.length === 0) {
108
+ record('MCP server exposes documented tool surface', true, `${requiredTools.length} tools found in server.ts`);
134
109
  } else {
135
- const text = readFileSync(srcPath, 'utf8');
136
- const teamsOk = /enableAgentTeams:\s*true/.test(text);
137
- const spawnOk = /enableSpawnAgent:\s*true/.test(text);
138
- if (teamsOk && spawnOk) {
139
- record('enableAgentTeams + enableSpawnAgent: true in clineruntime.ts', true,
140
- '/team and /subagent (use_subagents + task tool) both work');
141
- } else {
142
- const missing = [];
143
- if (!teamsOk) missing.push('enableAgentTeams');
144
- if (!spawnOk) missing.push('enableSpawnAgent');
145
- record('enableAgentTeams + enableSpawnAgent: true in clineruntime.ts', false,
146
- `REGRESSION: missing ${missing.join(', ')} — /team and subagents will not function`);
147
- }
110
+ record('MCP server exposes documented tool surface', false, `missing: ${missing.join(', ')}`);
148
111
  }
149
112
  } catch (err) {
150
- record('clineruntime.ts source readable', false, err.message);
113
+ record('MCP server source readable', false, err.message);
151
114
  }
152
115
 
153
- // ── 2. Verify cline.json template is sane ───────────────────────
116
+ // ── 4. Claude Code CLI is reachable ─────────────────────────────────────
154
117
  try {
155
- const { readFileSync } = await import('node:fs');
156
- const tplPath = join(REPO_ROOT, 'config', 'cline.json.template');
157
- const tpl = JSON.parse(readFileSync(tplPath, 'utf8'));
158
- const hasPlugin = Array.isArray(tpl.plugin) && tpl.plugin.length > 0;
159
- // v6.2.2 — template MUST NOT have a provider block (installer no
160
- // longer touches provider config; user configures their own).
161
- const hasNoProvider = !tpl.provider;
162
- const hasDefaultAgent = tpl.default_agent;
163
- const hasCommands = tpl.command && tpl.command.team && tpl.command.test && tpl.command.validate;
164
- if (hasPlugin && hasNoProvider && hasDefaultAgent && hasCommands) {
165
- record('cline.json.template is complete (no provider — user configures their own)', true, 'plugin, default_agent, /team, /test, /validate');
118
+ const r = spawnSync('claude', ['--version'], { encoding: 'utf8', timeout: 5000 });
119
+ if (r.status === 0) {
120
+ const ver = (r.stdout || r.stderr || '').trim().split('\n')[0] || 'unknown';
121
+ record('claude CLI reachable', true, ver);
166
122
  } else {
167
- const missing = [];
168
- if (!hasPlugin) missing.push('plugin[]');
169
- if (!hasNoProvider) missing.push('provider (should be absent — user configures)');
170
- if (!hasDefaultAgent) missing.push('default_agent');
171
- if (!hasCommands) missing.push('command.team/test/validate');
172
- record('cline.json.template is complete (no provider — user configures their own)', false, `missing/wrong: ${missing.join(', ')}`);
123
+ record('claude CLI reachable', false, `claude --version exited ${r.status}`);
173
124
  }
174
125
  } catch (err) {
175
- record('cline.json.template readable', false, err.message);
126
+ record('claude CLI reachable', false, err.message);
176
127
  }
177
128
 
178
- // ── 3. Verify config/commands/ has the new team/test/validate ───
129
+ // ── 5. Project-level Claude Code settings sane ──────────────────────────
179
130
  try {
180
- const { readdirSync, existsSync } = await import('node:fs');
181
- const cmdsDir = join(REPO_ROOT, 'config', 'commands');
182
- if (!existsSync(cmdsDir)) {
183
- record('config/commands/ present', false, `${cmdsDir} missing`);
131
+ const settingsPath = join(REPO_ROOT, '.claude', 'settings.json');
132
+ if (!existsSync(settingsPath)) {
133
+ record('.claude/settings.json present', false, `${settingsPath} missing`);
184
134
  } else {
185
- const files = readdirSync(cmdsDir);
186
- const required = ['team.md', 'test.md', 'validate.md'];
187
- const missing = required.filter((f) => !files.includes(f));
188
- if (missing.length === 0) {
189
- record('config/commands/ has team/test/validate', true, `${files.length} command files`);
135
+ const settings = JSON.parse(readFileSync(settingsPath, 'utf8'));
136
+ const hasHooks = settings.hooks && Object.keys(settings.hooks).length > 0;
137
+ const hookNames = hasHooks ? Object.keys(settings.hooks).join(', ') : '(none)';
138
+ if (hasHooks) {
139
+ record('.claude/settings.json wired with hooks', true, hookNames);
190
140
  } else {
191
- record('config/commands/ has team/test/validate', false, `missing: ${missing.join(', ')}`);
141
+ record('.claude/settings.json wired with hooks', false, 'no hooks defined');
192
142
  }
193
143
  }
194
144
  } catch (err) {
195
- record('config/commands/ scannable', false, err.message);
145
+ record('.claude/settings.json readable', false, err.message);
196
146
  }
197
147
 
198
- // ── 4. Verify all required agent files exist ────────────────────
148
+ // ── 6. Plugin shim does NOT import @cline/* ─────────────────────────────
199
149
  try {
200
- const { readdirSync, existsSync } = await import('node:fs');
201
- const agentsDir = join(REPO_ROOT, 'config', 'agents');
202
- if (!existsSync(agentsDir)) {
203
- record('config/agents/ present', false, `${agentsDir} missing`);
150
+ if (!existsSync(PLUGIN_SHIM_PATH)) {
151
+ record('plugin shim does not import @cline/*', true, 'plugin shim removed (no longer needed)');
204
152
  } else {
205
- const files = readdirSync(agentsDir);
206
- const required = [
207
- 'odin.md', 'vor.md', 'frigg.md', 'quick.md',
208
- 'mimir.md', 'heimdall.md', 'hermod.md', 'thor.md', 'baldr.md',
209
- 'tyr.md', 'vidarr.md', 'forseti.md', 'semble-search.md', 'agent-browser.md',
210
- ];
211
- const missing = required.filter((f) => !files.includes(f));
212
- if (missing.length === 0) {
213
- record('config/agents/ has all 14 agents', true, `${required.length} agents`);
153
+ const shimSrc = readFileSync(PLUGIN_SHIM_PATH, 'utf8');
154
+ const hasClineImport = /from\s+["']@cline\//.test(shimSrc) || /require\s*\(\s*["']@cline\//.test(shimSrc);
155
+ if (hasClineImport) {
156
+ record('plugin shim does not import @cline/*', false, '@cline/* import found in plugin shim');
214
157
  } else {
215
- record('config/agents/ has all 14 agents', false, `missing: ${missing.join(', ')}`);
158
+ record('plugin shim does not import @cline/*', true, 'clean (only SDK imports)');
216
159
  }
217
160
  }
218
161
  } catch (err) {
219
- record('config/agents/ scannable', false, err.message);
162
+ record('plugin shim readable', false, err.message);
220
163
  }
221
164
 
222
- // ── 5. Verify all required skills exist ────────────────────────
165
+ // ── 7. Plugin shim re-exports from SDK (or has been removed) ────────────
223
166
  try {
224
- const { readdirSync, existsSync } = await import('node:fs');
225
- const skillsDir = join(REPO_ROOT, 'config', 'skills');
226
- if (!existsSync(skillsDir)) {
227
- record('config/skills/ present', false, `${skillsDir} missing`);
167
+ if (!existsSync(PLUGIN_SHIM_PATH)) {
168
+ record('plugin shim re-exports SDK', true, 'plugin shim removed; consumers use SDK directly');
228
169
  } else {
229
- const dirs = readdirSync(skillsDir, { withFileTypes: true }).filter((e) => e.isDirectory());
230
- const skillNames = dirs.map((d) => d.name);
231
- if (skillNames.length >= 8) {
232
- record('config/skills/ has 8+ skills', true, `${skillNames.length} skills: ${skillNames.slice(0, 5).join(', ')}...`);
170
+ const shimSrc = readFileSync(PLUGIN_SHIM_PATH, 'utf8');
171
+ const reExportsSdk = /from\s+["'].*packages\/sdk/.test(shimSrc) ||
172
+ /from\s+["']@polderlabs\/bizar-sdk/.test(shimSrc);
173
+ if (reExportsSdk) {
174
+ record('plugin shim re-exports SDK', true, 're-exports @polderlabs/bizar-sdk');
233
175
  } else {
234
- record('config/skills/ has 8+ skills', false, `only ${skillNames.length} skills`);
176
+ record('plugin shim re-exports SDK', false, 'shim exists but does not re-export SDK');
235
177
  }
236
178
  }
237
179
  } catch (err) {
238
- record('config/skills/ scannable', false, err.message);
180
+ record('plugin shim check', false, err.message);
239
181
  }
240
182
 
241
- // ── 6. Verify all required rules exist ─────────────────────────
183
+ // ── 8. SDK package builds cleanly ──────────────────────────────────────
242
184
  try {
243
- const { readdirSync, existsSync } = await import('node:fs');
244
- const rulesDir = join(REPO_ROOT, 'config', 'rules');
245
- if (!existsSync(rulesDir)) {
246
- record('config/rules/ present', false, `${rulesDir} missing`);
185
+ const r = spawnSync('bunx', ['tsc', '--noEmit', '-p', 'packages/sdk/tsconfig.json'], {
186
+ encoding: 'utf8',
187
+ timeout: 60000,
188
+ cwd: REPO_ROOT,
189
+ });
190
+ if (r.status === 0) {
191
+ record('SDK TypeScript compiles cleanly', true, 'tsc --noEmit exited 0');
247
192
  } else {
248
- const files = readdirSync(rulesDir);
249
- const required = ['general.md', 'git.md', 'javascript.md', 'python.md', 'testing.md', 'thinking.md', 'uncertainty.md'];
250
- const missing = required.filter((f) => !files.includes(f));
251
- if (missing.length === 0) {
252
- record('config/rules/ has 7 always-on rules', true, `${required.length} rules`);
253
- } else {
254
- record('config/rules/ has 7 always-on rules', false, `missing: ${missing.join(', ')}`);
255
- }
193
+ const last = (r.stdout || r.stderr || '').split('\n').filter(Boolean).slice(-1)[0] || 'unknown error';
194
+ record('SDK TypeScript compiles cleanly', false, last.slice(0, 80));
256
195
  }
257
196
  } catch (err) {
258
- record('config/rules/ scannable', false, err.message);
197
+ record('SDK TypeScript compiles cleanly', true, 'skipped (bunx not available)');
259
198
  }
260
199
 
261
- // ── 6.5. Verify config/hooks/ has Cline-native executable hooks ────
262
- // Cline hooks are real scripts (not markdown). They must have a
263
- // shebang line and the right names. The previous v6.x format used
264
- // markdown behavioral files which Cline ignored.
200
+ // ── 9. Required agent files exist ──────────────────────────────────────
265
201
  try {
266
- const { readFileSync, readdirSync, existsSync } = await import('node:fs');
267
- const hooksDir = join(REPO_ROOT, 'config', 'hooks');
268
- if (!existsSync(hooksDir)) {
269
- record('config/hooks/ present', false, `${hooksDir} missing`);
202
+ const agentsDir = join(REPO_ROOT, 'config', 'agents');
203
+ if (!existsSync(agentsDir)) {
204
+ record('config/agents/ present', false, `${agentsDir} missing`);
270
205
  } else {
271
- const files = readdirSync(hooksDir);
272
- const required = ['PreToolUse', 'PostToolUse', 'TaskStart', 'TaskResume', 'UserPromptSubmit'];
206
+ const files = readdirSync(agentsDir);
207
+ const required = [
208
+ 'odin.md', 'vor.md', 'frigg.md', 'quick.md',
209
+ 'mimir.md', 'heimdall.md', 'hermod.md', 'thor.md', 'baldr.md',
210
+ 'tyr.md', 'vidarr.md', 'forseti.md', 'semble-search.md', 'agent-browser.md',
211
+ ];
273
212
  const missing = required.filter((f) => !files.includes(f));
274
- if (missing.length > 0) {
275
- record('config/hooks/ has 5 Cline-native hook scripts', false, `missing: ${missing.join(', ')}`);
213
+ if (missing.length === 0) {
214
+ record('config/agents/ has all 14 agents', true, `${required.length} agents`);
276
215
  } else {
277
- // Verify each has a shebang line (Cline requires it).
278
- const noShebang = [];
279
- for (const f of required) {
280
- const first = readFileSync(join(hooksDir, f), 'utf8').split('\n')[0] || '';
281
- if (!first.startsWith('#!')) noShebang.push(f);
282
- }
283
- if (noShebang.length > 0) {
284
- record('Cline hooks have shebang', false, `no shebang: ${noShebang.join(', ')}`);
285
- } else {
286
- record('config/hooks/ has 5 Cline-native executable hooks', true, required.join(', '));
287
- }
216
+ record('config/agents/ has all 14 agents', false, `missing: ${missing.join(', ')}`);
288
217
  }
289
218
  }
290
219
  } catch (err) {
291
- record('config/hooks/ scannable', false, err.message);
292
- }
293
-
294
- // ── 7. Verify plugin index.ts is well-formed ───────────────────
295
- try {
296
- const { readFileSync } = await import('node:fs');
297
- const idx = readFileSync(PLUGIN_PATH, 'utf8');
298
- const hasSetup = /async\s+setup\s*\(/.test(idx);
299
- const hasRegisterTool = /registerTool\s*\(/.test(idx);
300
- const hasHooks = /AgentExtensionHooks|hooks\s*:/.test(idx);
301
- if (hasSetup && hasRegisterTool && hasHooks) {
302
- record('plugin index.ts has setup + registerTool + hooks', true, `${idx.length} bytes`);
303
- } else {
304
- const missing = [];
305
- if (!hasSetup) missing.push('setup()');
306
- if (!hasRegisterTool) missing.push('registerTool()');
307
- if (!hasHooks) missing.push('hooks');
308
- record('plugin index.ts has setup + registerTool + hooks', false, `missing: ${missing.join(', ')}`);
309
- }
310
- } catch (err) {
311
- record('plugin index.ts readable', false, err.message);
312
- }
313
-
314
- // ── 8. Verify all source tools are listed (static count) ────────
315
- try {
316
- const { readdirSync } = await import('node:fs');
317
- const toolsDir = join(REPO_ROOT, 'plugins', 'bizar', 'src', 'tools');
318
- const toolFiles = readdirSync(toolsDir).filter((f) => f.endsWith('.ts'));
319
- if (toolFiles.length >= MIN_TOOL_COUNT) {
320
- record('plugin source has ≥19 tool files', true, `${toolFiles.length} tool files`);
321
- } else {
322
- record('plugin source has ≥19 tool files', false, `only ${toolFiles.length} tool files (need ${MIN_TOOL_COUNT})`);
323
- }
324
- } catch (err) {
325
- record('plugin tools dir scannable', false, err.message);
220
+ record('config/agents/ scannable', false, err.message);
326
221
  }
327
222
 
328
- // ── 9. Verify all 4 hooks are present ──────────────────────────
223
+ // ── 10. Required skills exist ──────────────────────────────────────────
329
224
  try {
330
- const { readdirSync, existsSync } = await import('node:fs');
331
- const hooksDir = join(REPO_ROOT, 'plugins', 'bizar', 'src', 'hooks');
332
- if (!existsSync(hooksDir)) {
333
- record('plugin hooks dir present', false, `${hooksDir} missing`);
225
+ const skillsDir = join(REPO_ROOT, 'config', 'skills');
226
+ if (!existsSync(skillsDir)) {
227
+ record('config/skills/ has 8+ skills', false, `${skillsDir} missing`);
334
228
  } else {
335
- const files = readdirSync(hooksDir).filter((f) => f.endsWith('.ts'));
336
- if (files.length >= 4) {
337
- record('plugin has ≥4 hooks', true, files.join(', '));
229
+ const dirs = readdirSync(skillsDir, { withFileTypes: true }).filter((e) => e.isDirectory());
230
+ const skillNames = dirs.map((d) => d.name);
231
+ if (skillNames.length >= 8) {
232
+ record('config/skills/ has 8+ skills', true, `${skillNames.length} skills`);
338
233
  } else {
339
- record('plugin has ≥4 hooks', false, `only ${files.length} hook files`);
234
+ record('config/skills/ has 8+ skills', false, `only ${skillNames.length} skills`);
340
235
  }
341
236
  }
342
237
  } catch (err) {
343
- record('plugin hooks dir scannable', false, err.message);
344
- }
345
-
346
- // ── 9.5. Verify all 14 agents reference the shared docs (v6.2.4) ─────
347
- // Catches drift: an agent that doesn't reference AGENT_BASELINE.md or
348
- // CLINE_TOOLS.md won't get the always-on rules at runtime.
349
- try {
350
- const { spawnSync } = await import('node:child_process');
351
- const r = spawnSync('node', ['scripts/check-agents.mjs'], {
352
- encoding: 'utf8',
353
- cwd: REPO_ROOT,
354
- timeout: 10000,
355
- });
356
- if (r.status === 0) {
357
- // Extract the count from the output
358
- const m = /All (\d+) agents/.exec(r.stdout || '');
359
- const n = m ? m[1] : '?';
360
- record('all 14 agents reference AGENT_BASELINE + CLINE_TOOLS', true, `${n} agents OK`);
361
- } else {
362
- record('all 14 agents reference AGENT_BASELINE + CLINE_TOOLS', false, (r.stdout || r.stderr || '').trim().split('\n').slice(-3).join(' | '));
363
- }
364
- } catch (err) {
365
- record('all 14 agents reference AGENT_BASELINE + CLINE_TOOLS', false, err.message);
238
+ record('config/skills/ scannable', false, err.message);
366
239
  }
367
240
 
368
- // ── 10. Verify cline CLI is on PATH and recent enough ──────────
241
+ // ── 11. package.json version is consistent ─────────────────────────────
369
242
  try {
370
- const { spawnSync } = await import('node:child_process');
371
- const r = spawnSync('cline', ['--version'], { encoding: 'utf8', timeout: 5000 });
372
- if (r.status === 0) {
373
- const ver = (r.stdout || r.stderr || '').trim().split('\n')[0] || 'unknown';
374
- record('cline CLI reachable', true, ver);
243
+ const pkg = JSON.parse(readFileSync(join(REPO_ROOT, 'package.json'), 'utf8'));
244
+ if (pkg.version && pkg.name) {
245
+ record('package.json valid', true, `${pkg.name}@${pkg.version}`);
375
246
  } else {
376
- record('cline CLI reachable', false, `cline --version exited ${r.status}`);
247
+ record('package.json valid', false, 'missing name or version');
377
248
  }
378
249
  } catch (err) {
379
- record('cline CLI reachable', false, err.message);
250
+ record('package.json valid', false, err.message);
380
251
  }
381
252
 
382
- // ── 11. Verify cline runtime sets enableAgentTeams=true (runtime check) ───
253
+ // ── 12. SDK exports BIZAR_TOOLS ─────────────────────────────────────────
383
254
  try {
384
- const { ClineRuntime } = await import(join(REPO_ROOT, 'plugins', 'bizar', 'src', 'clineruntime.ts'));
385
- if (typeof ClineRuntime === 'function') {
386
- record('ClineRuntime class is importable', true, 'runtime class exports correctly');
255
+ const serverSrc = readFileSync(join(REPO_ROOT, 'packages', 'sdk', 'src', 'mcp', 'server.ts'), 'utf8');
256
+ if (/export\s+const\s+BIZAR_TOOLS\b/.test(serverSrc) || /export\s+\{[^}]*BIZAR_TOOLS[^}]*\}\s+from/.test(serverSrc)) {
257
+ record('SDK exports BIZAR_TOOLS', true, 'tool registry exposed');
387
258
  } else {
388
- record('ClineRuntime class is importable', false, 'not a function/class');
259
+ record('SDK exports BIZAR_TOOLS', false, 'BIZAR_TOOLS not exported');
389
260
  }
390
261
  } catch (err) {
391
- // Non-fatal: the class may not import in isolation (depends on @cline/core).
392
- // The static check above is the source of truth.
393
- record('ClineRuntime class is importable', true, 'skipped (deps not available outside plugin context)');
262
+ record('SDK exports BIZAR_TOOLS', false, err.message);
394
263
  }
395
264
 
396
- // ── 12. Verify the validate subcommand exists ──────────────────
265
+ // ── 13. plugins/bizar/src/ has been deleted (no framework-coupled code) ─
397
266
  try {
398
- const { existsSync } = await import('node:fs');
399
- const validateCmd = join(REPO_ROOT, 'cli', 'commands', 'validate.mjs');
400
- const validateTest = join(REPO_ROOT, 'cli', 'commands', 'validate.test.mjs');
401
- if (existsSync(validateCmd) && existsSync(validateTest)) {
402
- record('bizar validate command + tests present', true, 'cli/commands/validate.{mjs,test.mjs}');
267
+ const srcDir = join(REPO_ROOT, 'plugins', 'bizar', 'src');
268
+ if (!existsSync(srcDir)) {
269
+ record('plugins/bizar/src/ deleted', true, 'framework-coupled code removed');
403
270
  } else {
404
- record('bizar validate command + tests present', false, 'cli/commands/validate.* missing');
405
- }
406
- } catch (err) {
407
- record('bizar validate command present', false, err.message);
408
- }
409
-
410
- // ── 12.6. Verify Cline CLI integration (v6.2.3) ─────────────────
411
- // v6.2.3 — pass-through wrappers for Cline CLI commands + sample.
412
- try {
413
- const { existsSync } = await import('node:fs');
414
- const clineCmd = join(REPO_ROOT, 'cli', 'commands', 'cline-cmd.mjs');
415
- const rcaCmd = join(REPO_ROOT, 'cli', 'commands', 'rca.mjs');
416
- const rcaTest = join(REPO_ROOT, 'cli', 'commands', 'rca.test.mjs');
417
- const setupProviderCmd = join(REPO_ROOT, 'cli', 'commands', 'setup-provider.mjs');
418
- const setupProviderTest = join(REPO_ROOT, 'cli', 'commands', 'setup-provider.test.mjs');
419
- if (existsSync(clineCmd)) {
420
- const text = (await import('node:fs')).readFileSync(clineCmd, 'utf8');
421
- const hasConfig = /runClineConfig\b/.test(text);
422
- const hasHistory = /runClineHistory\b/.test(text);
423
- const hasHub = /runClineHub\b/.test(text);
424
- const hasHook = /runClineHook\b/.test(text);
425
- const hasTeam = /runClineTeam\b/.test(text);
426
- const hasSubagent = /runClineSubagent\b/.test(text);
427
- if (hasConfig && hasHistory && hasHub && hasHook && hasTeam && hasSubagent) {
428
- record('bizar cline-cmd wrappers present', true, 'config, history, hub, hook, team, subagent');
271
+ const files = readdirSync(srcDir);
272
+ if (files.length === 0) {
273
+ record('plugins/bizar/src/ deleted', true, 'framework-coupled code removed (empty dir)');
429
274
  } else {
430
- const missing = [];
431
- if (!hasConfig) missing.push('config');
432
- if (!hasHistory) missing.push('history');
433
- if (!hasHub) missing.push('hub');
434
- if (!hasHook) missing.push('hook');
435
- if (!hasTeam) missing.push('team');
436
- if (!hasSubagent) missing.push('subagent');
437
- record('bizar cline-cmd wrappers present', false, `missing: ${missing.join(', ')}`);
275
+ record('plugins/bizar/src/ deleted', false, `${files.length} files remain — review and delete`);
438
276
  }
439
- } else {
440
- record('bizar cline-cmd wrappers present', false, 'cli/commands/cline-cmd.mjs missing');
441
- }
442
- if (existsSync(rcaCmd) && existsSync(rcaTest)) {
443
- record('bizar rca (GitHub Issue RCA sample) present', true, 'cli/commands/rca.{mjs,test.mjs}');
444
- } else {
445
- record('bizar rca (GitHub Issue RCA sample) present', false, 'cli/commands/rca.* missing');
446
- }
447
- if (existsSync(setupProviderCmd) && existsSync(setupProviderTest)) {
448
- record('bizar setup-provider + auto-migrate present', true, 'cli/commands/setup-provider.{mjs,test.mjs}');
449
- } else {
450
- record('bizar setup-provider + auto-migrate present', false, 'cli/commands/setup-provider.* missing');
451
- }
452
- } catch (err) {
453
- record('bizar cline-cmd integration present', false, err.message);
454
- }
455
-
456
- // ── 13. Verify package.json version is consistent ──────────────
457
- try {
458
- const { readFileSync } = await import('node:fs');
459
- const pkg = JSON.parse(readFileSync(join(REPO_ROOT, 'package.json'), 'utf8'));
460
- if (pkg.version && pkg.name) {
461
- record('package.json valid', true, `${pkg.name}@${pkg.version}`);
462
- } else {
463
- record('package.json valid', false, 'missing name or version');
464
277
  }
465
278
  } catch (err) {
466
- record('package.json valid', false, err.message);
279
+ record('plugins/bizar/src/ check', false, err.message);
467
280
  }
468
281
 
469
- // ── 14. Verify TypeScript compiles cleanly ─────────────────────
470
- try {
471
- const { spawnSync } = await import('node:child_process');
472
- const r = spawnSync('bunx', ['tsc', '--noEmit'], {
473
- encoding: 'utf8',
474
- timeout: 60000,
475
- cwd: REPO_ROOT,
476
- });
477
- if (r.status === 0) {
478
- record('TypeScript compiles cleanly', true, 'tsc --noEmit exited 0');
479
- } else {
480
- const last = (r.stdout || r.stderr || '').split('\n').filter(Boolean).slice(-1)[0] || 'unknown error';
481
- record('TypeScript compiles cleanly', false, last.slice(0, 80));
282
+ // ── Summary ─────────────────────────────────────────────────────────────
283
+ function printSummaryAndExit() {
284
+ console.log('');
285
+ console.log(' ─────────────────────────────────────────────────────');
286
+ console.log(` ${passed}/${totalChecks} checks passed, ${failed} failed`);
287
+ console.log(' ─────────────────────────────────────────────────────');
288
+ if (failed > 0) {
289
+ console.log('');
290
+ console.log(' ✗ e2e FAILED. Fix the failures above before releasing.');
291
+ process.exit(1);
482
292
  }
483
- } catch (err) {
484
- record('TypeScript compiles cleanly', true, 'skipped (bunx not available)');
485
- }
486
-
487
- // ── Summary ─────────────────────────────────────────────────────
488
- console.log('');
489
- console.log(' ─────────────────────────────────────────────────────');
490
- console.log(` ${passed}/${totalChecks} checks passed, ${failed} failed`);
491
- console.log(' ─────────────────────────────────────────────────────');
492
- if (failed > 0) {
493
293
  console.log('');
494
- console.log(' ✗ e2e FAILED. Fix the failures above before releasing.');
495
- process.exit(1);
294
+ console.log(' ✓ e2e OK. Bizar SDK + Claude Code integration is sound.');
295
+ process.exit(0);
496
296
  }
497
- console.log('');
498
- console.log(' ✓ e2e OK. Bizar plugin + cline integration is sound.');
499
- process.exit(0);
297
+
298
+ printSummaryAndExit();