@polderlabs/bizar 6.2.5 → 6.3.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 (329) 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/settings.json +116 -0
  41. package/.claude/skills/9router/SKILL.md +80 -0
  42. package/.claude/skills/9router-chat/SKILL.md +73 -0
  43. package/.claude/skills/9router-embeddings/SKILL.md +69 -0
  44. package/.claude/skills/9router-image/SKILL.md +86 -0
  45. package/.claude/skills/9router-stt/SKILL.md +79 -0
  46. package/.claude/skills/9router-tts/SKILL.md +80 -0
  47. package/.claude/skills/9router-web-fetch/SKILL.md +99 -0
  48. package/.claude/skills/9router-web-search/SKILL.md +91 -0
  49. package/.claude/skills/bizar/README.md +9 -0
  50. package/.claude/skills/bizar/SKILL.md +450 -0
  51. package/.claude/skills/cpp-coding-standards/README.md +28 -0
  52. package/.claude/skills/cpp-coding-standards/SKILL.md +634 -0
  53. package/.claude/skills/cpp-coding-standards/references/concurrency.md +320 -0
  54. package/.claude/skills/cpp-coding-standards/references/error-handling.md +229 -0
  55. package/.claude/skills/cpp-coding-standards/references/memory-safety.md +216 -0
  56. package/.claude/skills/cpp-coding-standards/references/modern-idioms.md +282 -0
  57. package/.claude/skills/cpp-coding-standards/references/review-checklist.md +96 -0
  58. package/.claude/skills/cpp-testing/README.md +28 -0
  59. package/.claude/skills/cpp-testing/SKILL.md +304 -0
  60. package/.claude/skills/cpp-testing/references/coverage.md +370 -0
  61. package/.claude/skills/cpp-testing/references/framework-compare.md +175 -0
  62. package/.claude/skills/cpp-testing/references/host-test-for-embedded.md +499 -0
  63. package/.claude/skills/cpp-testing/references/mocking.md +364 -0
  64. package/.claude/skills/cpp-testing/references/tdd-workflow.md +308 -0
  65. package/.claude/skills/cubesandbox/SKILL.md +148 -0
  66. package/.claude/skills/embedded-esp-idf/README.md +41 -0
  67. package/.claude/skills/embedded-esp-idf/SKILL.md +439 -0
  68. package/.claude/skills/embedded-esp-idf/references/freertos-patterns.md +214 -0
  69. package/.claude/skills/embedded-esp-idf/references/host-tests.md +164 -0
  70. package/.claude/skills/embedded-esp-idf/references/idf-py-commands.md +157 -0
  71. package/.claude/skills/embedded-esp-idf/references/kconfig.md +159 -0
  72. package/.claude/skills/embedded-esp-idf/references/logging-discipline.md +118 -0
  73. package/.claude/skills/embedded-esp-idf/references/memory-and-iram.md +137 -0
  74. package/.claude/skills/embedded-esp-idf/references/nvs.md +121 -0
  75. package/.claude/skills/embedded-esp-idf/references/packed-structs.md +192 -0
  76. package/.claude/skills/embedded-esp-idf/scripts/idf_env.sh +47 -0
  77. package/.claude/skills/embedded-esp-idf/scripts/size_check.sh +77 -0
  78. package/.claude/skills/glyph/SKILL.md +163 -0
  79. package/.claude/skills/harness-engineering/SKILL.md +143 -0
  80. package/.claude/skills/lightrag/SKILL.md +81 -0
  81. package/.claude/skills/memory-protocol/SKILL.md +105 -0
  82. package/.claude/skills/obsidian/SKILL.md +306 -0
  83. package/.claude/skills/read-the-damn-docs/SKILL.md +113 -0
  84. package/.claude/skills/self-improvement/SKILL.md +64 -0
  85. package/README.md +87 -59
  86. package/bizar-dash/dist/assets/{EnvVarsSection-DXM8gRm_.js → EnvVarsSection-B58aiJiE.js} +1 -1
  87. package/bizar-dash/dist/assets/{EnvVarsSection-DXM8gRm_.js.map → EnvVarsSection-B58aiJiE.js.map} +1 -1
  88. package/bizar-dash/dist/assets/{MobileChat-BnKN_Ks_.js → MobileChat-BJrqwVDd.js} +1 -1
  89. package/bizar-dash/dist/assets/{MobileChat-BnKN_Ks_.js.map → MobileChat-BJrqwVDd.js.map} +1 -1
  90. package/bizar-dash/dist/assets/{MobileSettings-DjCPxC-Q.js → MobileSettings-CEQNJNLJ.js} +1 -1
  91. package/bizar-dash/dist/assets/{MobileSettings-DjCPxC-Q.js.map → MobileSettings-CEQNJNLJ.js.map} +1 -1
  92. package/bizar-dash/dist/assets/{main-DYiZqMrn.js → main-IvfQAOfy.js} +1 -1
  93. package/bizar-dash/dist/assets/{main-DYiZqMrn.js.map → main-IvfQAOfy.js.map} +1 -1
  94. package/bizar-dash/dist/assets/{markdown-C6mXtQxD.js → markdown-tOLaD6nm.js} +1 -1
  95. package/bizar-dash/dist/assets/{markdown-C6mXtQxD.js.map → markdown-tOLaD6nm.js.map} +1 -1
  96. package/bizar-dash/dist/assets/{mobile-CMHqtLV2.js → mobile-DYCHcUpq.js} +1 -1
  97. package/bizar-dash/dist/assets/{mobile-CMHqtLV2.js.map → mobile-DYCHcUpq.js.map} +1 -1
  98. package/bizar-dash/dist/assets/{mobile-layout-3jIhHX_p.js → mobile-layout-CBHjpwsb.js} +2 -2
  99. package/bizar-dash/dist/assets/{mobile-layout-3jIhHX_p.js.map → mobile-layout-CBHjpwsb.js.map} +1 -1
  100. package/bizar-dash/dist/assets/{useSlashCommands-DtITw8Xv.js → useSlashCommands-Bd7_FA6U.js} +2 -2
  101. package/bizar-dash/dist/assets/{useSlashCommands-DtITw8Xv.js.map → useSlashCommands-Bd7_FA6U.js.map} +1 -1
  102. package/bizar-dash/dist/assets/{vendor-CeHGtduv.js → vendor-C843201K.js} +12 -12
  103. package/bizar-dash/dist/assets/vendor-C843201K.js.map +1 -0
  104. package/bizar-dash/dist/index.html +6 -6
  105. package/bizar-dash/dist/mobile.html +2 -2
  106. package/bizar-dash/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +1 -1
  107. package/bizar-dash/src/server/api.mjs +4 -4
  108. package/bizar-dash/src/server/background-store.mjs +15 -16
  109. package/bizar-dash/src/server/bg-poller.mjs +25 -35
  110. package/bizar-dash/src/server/bg-retry.mjs +66 -194
  111. package/bizar-dash/src/server/claude-bg-spawner.mjs +390 -0
  112. package/bizar-dash/src/server/claude-info.mjs +412 -0
  113. package/bizar-dash/src/server/{cline-runner.mjs → claude-runner.mjs} +53 -48
  114. package/bizar-dash/src/server/claude-sdk.mjs +191 -0
  115. package/bizar-dash/src/server/providers-store.mjs +22 -49
  116. package/bizar-dash/src/server/routes/background.mjs +24 -20
  117. package/bizar-dash/src/server/routes/chat.mjs +223 -326
  118. package/bizar-dash/src/server/routes/claude-session-detail.mjs +329 -0
  119. package/bizar-dash/src/server/routes/claude-sessions.mjs +259 -0
  120. package/bizar-dash/src/server/routes/tasks.mjs +20 -28
  121. package/bizar-dash/src/server/task-delegator.mjs +76 -77
  122. package/bizar-dash/src/web/components/chat/useChat.ts +23 -27
  123. package/bizar-dash/src/web/views/Chat.tsx +8 -8
  124. package/cli/bin.mjs +17 -18
  125. package/cli/commands/claude-cmd.mjs +348 -0
  126. package/cli/commands/install.mjs +12 -11
  127. package/cli/commands/validate.mjs +252 -325
  128. package/cli/dev-link.test.mjs +11 -11
  129. package/cli/doctor.mjs +131 -213
  130. package/cli/install.mjs +33 -37
  131. package/cli/install.test.mjs +9 -9
  132. package/cli/provision-claude.mjs +893 -0
  133. package/cli/provision.mjs +224 -227
  134. package/cli/utils.mjs +72 -58
  135. package/config/AGENTS.md +28 -28
  136. package/install.sh +66 -44
  137. package/package.json +19 -11
  138. package/packages/sdk/ARCHITECTURE.md +40 -36
  139. package/packages/sdk/package-lock.json +32 -0
  140. package/packages/sdk/package.json +15 -5
  141. package/{plugins/bizar → packages/sdk}/src/dangerous-patterns.ts +6 -28
  142. package/packages/sdk/src/fingerprint.ts +0 -0
  143. package/packages/sdk/src/index.ts +38 -73
  144. package/packages/sdk/src/mcp/bin.ts +51 -0
  145. package/packages/sdk/src/mcp/server.ts +498 -0
  146. package/{plugins/bizar/src/memory-vault.ts → packages/sdk/src/memory/index.ts} +18 -21
  147. package/packages/sdk/tests/sdk.test.mjs +148 -0
  148. package/packages/sdk/vitest.config.ts +1 -1
  149. package/scripts/bh-full-e2e.mjs +166 -363
  150. package/scripts/check-deps.mjs +28 -46
  151. package/scripts/mirror-claude-md.sh +78 -0
  152. package/scripts/test-in-container.sh +31 -9
  153. package/templates/clean-state-checklist.md +3 -3
  154. package/templates/sprint-contract.md +2 -2
  155. package/bizar-dash/.bizar/activity.log +0 -3
  156. package/bizar-dash/.omx/logs/omx-2026-07-07.jsonl +0 -1
  157. package/bizar-dash/.omx/state/session.json +0 -10
  158. package/bizar-dash/bizar-design/EXPLANATION.md +0 -307
  159. package/bizar-dash/bizar-design/INSTRUCTIONS.md +0 -149
  160. package/bizar-dash/bizar-design/canvas.html +0 -281
  161. package/bizar-dash/bizar-design/canvas.html.artifact.json +0 -19
  162. package/bizar-dash/bizar-design/components.css +0 -1665
  163. package/bizar-dash/bizar-design/components.html +0 -557
  164. package/bizar-dash/bizar-design/components.html.artifact.json +0 -19
  165. package/bizar-dash/bizar-design/desktop/agents.html +0 -74
  166. package/bizar-dash/bizar-design/desktop/agents.html.artifact.json +0 -19
  167. package/bizar-dash/bizar-design/desktop/memory.html +0 -75
  168. package/bizar-dash/bizar-design/desktop/memory.html.artifact.json +0 -19
  169. package/bizar-dash/bizar-design/desktop/metrics.html +0 -63
  170. package/bizar-dash/bizar-design/desktop/metrics.html.artifact.json +0 -19
  171. package/bizar-dash/bizar-design/desktop/overview.html +0 -95
  172. package/bizar-dash/bizar-design/desktop/overview.html.artifact.json +0 -19
  173. package/bizar-dash/bizar-design/desktop/settings.html +0 -70
  174. package/bizar-dash/bizar-design/desktop/settings.html.artifact.json +0 -19
  175. package/bizar-dash/bizar-design/icons.svg +0 -44
  176. package/bizar-dash/bizar-design/index.html +0 -192
  177. package/bizar-dash/bizar-design/index.html.artifact.json +0 -19
  178. package/bizar-dash/bizar-design/mobile/agents.html +0 -29
  179. package/bizar-dash/bizar-design/mobile/agents.html.artifact.json +0 -19
  180. package/bizar-dash/bizar-design/mobile/memory.html +0 -28
  181. package/bizar-dash/bizar-design/mobile/memory.html.artifact.json +0 -19
  182. package/bizar-dash/bizar-design/mobile/metrics.html +0 -29
  183. package/bizar-dash/bizar-design/mobile/metrics.html.artifact.json +0 -19
  184. package/bizar-dash/bizar-design/mobile/overview.html +0 -33
  185. package/bizar-dash/bizar-design/mobile/overview.html.artifact.json +0 -19
  186. package/bizar-dash/bizar-design/mobile/settings.html +0 -28
  187. package/bizar-dash/bizar-design/mobile/settings.html.artifact.json +0 -19
  188. package/bizar-dash/bizar-design/prototype.js +0 -114
  189. package/bizar-dash/bizar-design/tokens.css +0 -106
  190. package/bizar-dash/dist/assets/vendor-CeHGtduv.js.map +0 -1
  191. package/bizar-dash/node_modules/.package-lock.json +0 -6
  192. package/bizar-dash/package-lock.json +0 -6
  193. package/bizar-dash/src/server/cline-sdk.mjs +0 -132
  194. package/bizar-dash/src/server/routes/cline-session-detail.mjs +0 -559
  195. package/bizar-dash/src/server/routes/cline-sessions.mjs +0 -291
  196. package/cli/commands/cline-cmd.mjs +0 -289
  197. package/cli/commands/validate.test.mjs +0 -379
  198. package/cli/doctor.test.mjs +0 -350
  199. package/config/cline.json.template +0 -342
  200. package/packages/sdk/src/client.ts +0 -188
  201. package/packages/sdk/src/cline-events.ts +0 -134
  202. package/packages/sdk/src/cline-types.ts +0 -66
  203. package/packages/sdk/src/cline.ts +0 -339
  204. package/packages/sdk/src/errors.ts +0 -129
  205. package/packages/sdk/src/events.ts +0 -153
  206. package/packages/sdk/src/types.ts +0 -176
  207. package/packages/sdk/tests/client.test.ts +0 -217
  208. package/packages/sdk/tests/errors.test.ts +0 -108
  209. package/packages/sdk/tests/events.test.ts +0 -139
  210. package/packages/sdk/tests/fixtures/fetch-mock.ts +0 -152
  211. package/packages/sdk/tests/fixtures/sse-mock.ts +0 -30
  212. package/plugins/bizar/ARCHITECTURE.md +0 -142
  213. package/plugins/bizar/CONSTRAINTS.md +0 -67
  214. package/plugins/bizar/LICENSE +0 -21
  215. package/plugins/bizar/README.md +0 -448
  216. package/plugins/bizar/index.ts +0 -925
  217. package/plugins/bizar/package.json +0 -39
  218. package/plugins/bizar/scripts/check-forbidden-imports.sh +0 -33
  219. package/plugins/bizar/src/background-state.ts +0 -641
  220. package/plugins/bizar/src/background.ts +0 -1806
  221. package/plugins/bizar/src/cline-runner.ts +0 -203
  222. package/plugins/bizar/src/clineruntime.ts +0 -227
  223. package/plugins/bizar/src/commands-impl.ts +0 -151
  224. package/plugins/bizar/src/commands.ts +0 -1799
  225. package/plugins/bizar/src/compaction.d.mts +0 -48
  226. package/plugins/bizar/src/compaction.mjs +0 -192
  227. package/plugins/bizar/src/dashboard-client.ts +0 -233
  228. package/plugins/bizar/src/event-stream.ts +0 -606
  229. package/plugins/bizar/src/fingerprint.ts +0 -120
  230. package/plugins/bizar/src/handoff.ts +0 -79
  231. package/plugins/bizar/src/hooks/memory-flush-on-compact.ts +0 -123
  232. package/plugins/bizar/src/hooks/memory-inject.ts +0 -247
  233. package/plugins/bizar/src/hooks/memory-write-on-end.ts +0 -188
  234. package/plugins/bizar/src/hooks/skill-curator.ts +0 -180
  235. package/plugins/bizar/src/http-client.ts +0 -467
  236. package/plugins/bizar/src/key-rotation.ts +0 -218
  237. package/plugins/bizar/src/logger.ts +0 -144
  238. package/plugins/bizar/src/loop-engineering.ts +0 -241
  239. package/plugins/bizar/src/loop.ts +0 -176
  240. package/plugins/bizar/src/mistake-recovery.ts +0 -98
  241. package/plugins/bizar/src/odin.ts +0 -227
  242. package/plugins/bizar/src/options.ts +0 -470
  243. package/plugins/bizar/src/plan-fs.ts +0 -323
  244. package/plugins/bizar/src/reasoning-clean.ts +0 -454
  245. package/plugins/bizar/src/report.ts +0 -178
  246. package/plugins/bizar/src/research-prompt.ts +0 -35
  247. package/plugins/bizar/src/serve-info.ts +0 -228
  248. package/plugins/bizar/src/serve.ts +0 -496
  249. package/plugins/bizar/src/settings.ts +0 -349
  250. package/plugins/bizar/src/state.ts +0 -298
  251. package/plugins/bizar/src/tool-discipline.ts +0 -105
  252. package/plugins/bizar/src/tools/agent-browser.ts +0 -315
  253. package/plugins/bizar/src/tools/bg-collect.ts +0 -131
  254. package/plugins/bizar/src/tools/bg-get-comments.ts +0 -266
  255. package/plugins/bizar/src/tools/bg-kill.ts +0 -116
  256. package/plugins/bizar/src/tools/bg-pause.ts +0 -99
  257. package/plugins/bizar/src/tools/bg-report-progress.ts +0 -115
  258. package/plugins/bizar/src/tools/bg-resume.ts +0 -94
  259. package/plugins/bizar/src/tools/bg-send-message.ts +0 -223
  260. package/plugins/bizar/src/tools/bg-spawn.ts +0 -502
  261. package/plugins/bizar/src/tools/bg-status.ts +0 -130
  262. package/plugins/bizar/src/tools/graph-query.ts +0 -278
  263. package/plugins/bizar/src/tools/loop-engineering.ts +0 -193
  264. package/plugins/bizar/src/tools/memory-list.ts +0 -43
  265. package/plugins/bizar/src/tools/memory-read.ts +0 -69
  266. package/plugins/bizar/src/tools/memory-search.ts +0 -47
  267. package/plugins/bizar/src/tools/memory-write.ts +0 -54
  268. package/plugins/bizar/src/tools/open-kb.ts +0 -198
  269. package/plugins/bizar/src/tools/plan-action.ts +0 -785
  270. package/plugins/bizar/src/tools/read-glyph-feedback.ts +0 -191
  271. package/plugins/bizar/src/tools/sandbox.ts +0 -232
  272. package/plugins/bizar/src/tools/team-spawn.ts +0 -73
  273. package/plugins/bizar/src/tools/team-status.ts +0 -76
  274. package/plugins/bizar/src/tools/wait-for-feedback.ts +0 -415
  275. package/plugins/bizar/src/trajectory.ts +0 -104
  276. package/plugins/bizar/tests/README.md +0 -99
  277. package/plugins/bizar/tests/attach-handler-bug.test.ts +0 -169
  278. package/plugins/bizar/tests/background-state.test.ts +0 -277
  279. package/plugins/bizar/tests/background.test.ts +0 -402
  280. package/plugins/bizar/tests/block.test.ts +0 -195
  281. package/plugins/bizar/tests/canonical-key-order.test.ts +0 -75
  282. package/plugins/bizar/tests/clineruntime-config.test.ts +0 -283
  283. package/plugins/bizar/tests/commands-impl.test.ts +0 -316
  284. package/plugins/bizar/tests/commands.test.ts +0 -584
  285. package/plugins/bizar/tests/compaction.test.ts +0 -264
  286. package/plugins/bizar/tests/config.test.ts +0 -128
  287. package/plugins/bizar/tests/dashboard-client.test.ts +0 -159
  288. package/plugins/bizar/tests/dispose.test.ts +0 -336
  289. package/plugins/bizar/tests/event-stream.test.ts +0 -409
  290. package/plugins/bizar/tests/event.test.ts +0 -262
  291. package/plugins/bizar/tests/fingerprint.test.ts +0 -190
  292. package/plugins/bizar/tests/http-client.test.ts +0 -404
  293. package/plugins/bizar/tests/init-helpers.test.ts +0 -203
  294. package/plugins/bizar/tests/integration/slash-command.test.ts +0 -349
  295. package/plugins/bizar/tests/integration/tool-routing.test.ts +0 -98
  296. package/plugins/bizar/tests/key-rotation.test.ts +0 -396
  297. package/plugins/bizar/tests/loop-engineering.test.ts +0 -168
  298. package/plugins/bizar/tests/loop.test.ts +0 -397
  299. package/plugins/bizar/tests/memory-write-on-end.test.ts +0 -92
  300. package/plugins/bizar/tests/mistake-recovery.test.ts +0 -116
  301. package/plugins/bizar/tests/odin.test.ts +0 -125
  302. package/plugins/bizar/tests/options.test.ts +0 -329
  303. package/plugins/bizar/tests/reasoning-clean.test.ts +0 -422
  304. package/plugins/bizar/tests/safety.test.ts +0 -281
  305. package/plugins/bizar/tests/serve.test.ts +0 -339
  306. package/plugins/bizar/tests/settings.test.ts +0 -351
  307. package/plugins/bizar/tests/stall-think.test.ts +0 -750
  308. package/plugins/bizar/tests/state.test.ts +0 -276
  309. package/plugins/bizar/tests/tool-discipline.test.ts +0 -77
  310. package/plugins/bizar/tests/tools/agent-browser.test.ts +0 -98
  311. package/plugins/bizar/tests/tools/bg-collect.test.ts +0 -337
  312. package/plugins/bizar/tests/tools/bg-get-comments.test.ts +0 -485
  313. package/plugins/bizar/tests/tools/bg-kill.test.ts +0 -235
  314. package/plugins/bizar/tests/tools/bg-pause.test.ts +0 -61
  315. package/plugins/bizar/tests/tools/bg-report-progress.test.ts +0 -79
  316. package/plugins/bizar/tests/tools/bg-resume.test.ts +0 -40
  317. package/plugins/bizar/tests/tools/bg-send-message.test.ts +0 -116
  318. package/plugins/bizar/tests/tools/bg-spawn-delegation.test.ts +0 -147
  319. package/plugins/bizar/tests/tools/bg-spawn-http.test.ts +0 -233
  320. package/plugins/bizar/tests/tools/bg-spawn.test.ts +0 -311
  321. package/plugins/bizar/tests/tools/bg-status.test.ts +0 -217
  322. package/plugins/bizar/tests/tools/cline-runner.test.ts +0 -115
  323. package/plugins/bizar/tests/tools/plan-action.test.ts +0 -599
  324. package/plugins/bizar/tests/tools/read-glyph-feedback.test.ts +0 -253
  325. package/plugins/bizar/tests/tools/sandbox.test.ts +0 -117
  326. package/plugins/bizar/tests/tools/wait-for-feedback.test.ts +0 -390
  327. package/plugins/bizar/tests/update-deadlock.test.ts +0 -151
  328. package/plugins/bizar/tsconfig.json +0 -29
  329. 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,129 +66,143 @@ 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: [
69
+ console.log(' ᚦ BIZAR E2E — SDK + Claude Code verification ᚦ');
70
+ console.log('');
71
+ console.log(` sdk: ${SDK_PATH}`);
72
+ console.log(` mcp: ${MCP_BIN_PATH}`);
73
+ console.log(` plugin: ${PLUGIN_SHIM_PATH}`);
74
+ console.log('');
75
+
76
+ // ── 1. SDK package resolves ─────────────────────────────────────────────
77
+ if (!existsSync(SDK_PATH)) {
78
+ record('SDK entry resolves', false, `${SDK_PATH} not found`);
79
+ printSummaryAndExit();
80
+ }
81
+ record('SDK entry resolves', true, SDK_PATH);
82
+
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 ──────────────────
91
+ try {
92
+ const serverSrc = readFileSync(join(REPO_ROOT, 'packages', 'sdk', 'src', 'mcp', 'server.ts'), 'utf8');
93
+ const requiredTools = [
86
94
  'bizar_memory_search',
87
95
  'bizar_memory_read',
88
96
  'bizar_memory_write',
89
97
  'bizar_memory_list',
90
- ],
91
- 'agent-teams': [
92
- 'bizar_spawn_team',
93
- 'bizar_team_status',
94
- ],
95
- graph: [
98
+ 'bizar_plan_action',
99
+ 'bizar_wait_for_feedback',
100
+ 'bizar_get_plan_comments',
101
+ 'bizar_read_glyph_feedback',
102
+ 'bizar_open_kb',
96
103
  'bizar_graph_query',
97
104
  'bizar_graph_path',
98
105
  '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 ᚦ');
116
- console.log('');
117
- console.log(` plugin: ${PLUGIN_PATH}`);
118
- console.log('');
106
+ 'bizar_sandbox_run',
107
+ 'bizar_sandbox_exec',
108
+ 'bizar_loop_engineering',
109
+ ];
110
+ const missing = requiredTools.filter((t) => !serverSrc.includes(t));
111
+ if (missing.length === 0) {
112
+ record('MCP server exposes documented tool surface', true, `${requiredTools.length} tools found in server.ts`);
113
+ } else {
114
+ record('MCP server exposes documented tool surface', false, `missing: ${missing.join(', ')}`);
115
+ }
116
+ } catch (err) {
117
+ record('MCP server source readable', false, err.message);
118
+ }
119
119
 
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);
120
+ // ── 4. Claude Code CLI is reachable ─────────────────────────────────────
121
+ try {
122
+ const r = spawnSync('claude', ['--version'], { encoding: 'utf8', timeout: 5000 });
123
+ if (r.status === 0) {
124
+ const ver = (r.stdout || r.stderr || '').trim().split('\n')[0] || 'unknown';
125
+ record('claude CLI reachable', true, ver);
126
+ } else {
127
+ record('claude CLI reachable', false, `claude --version exited ${r.status}`);
128
+ }
129
+ } catch (err) {
130
+ record('claude CLI reachable', false, err.message);
125
131
  }
126
- record('plugin entry resolves', true, PLUGIN_PATH);
127
132
 
128
- // ── 1. Verify enableAgentTeams + enableSpawnAgent in source (v6.2.0 / v6.2.3) ───────
133
+ // ── 5. Project-level Claude Code settings sane ──────────────────────────
129
134
  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`);
135
+ const settingsPath = join(REPO_ROOT, '.claude', 'settings.json');
136
+ if (!existsSync(settingsPath)) {
137
+ record('.claude/settings.json present', false, `${settingsPath} missing`);
134
138
  } 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');
139
+ const settings = JSON.parse(readFileSync(settingsPath, 'utf8'));
140
+ const hasHooks = settings.hooks && Object.keys(settings.hooks).length > 0;
141
+ const hookNames = hasHooks ? Object.keys(settings.hooks).join(', ') : '(none)';
142
+ if (hasHooks) {
143
+ record('.claude/settings.json wired with hooks', true, hookNames);
141
144
  } 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`);
145
+ record('.claude/settings.json wired with hooks', false, 'no hooks defined');
147
146
  }
148
147
  }
149
148
  } catch (err) {
150
- record('clineruntime.ts source readable', false, err.message);
149
+ record('.claude/settings.json readable', false, err.message);
151
150
  }
152
151
 
153
- // ── 2. Verify cline.json template is sane ───────────────────────
152
+ // ── 6. Plugin shim does NOT import @cline/* ─────────────────────────────
154
153
  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');
154
+ if (!existsSync(PLUGIN_SHIM_PATH)) {
155
+ record('plugin shim does not import @cline/*', true, 'plugin shim removed (no longer needed)');
166
156
  } 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(', ')}`);
157
+ const shimSrc = readFileSync(PLUGIN_SHIM_PATH, 'utf8');
158
+ const hasClineImport = /from\s+["']@cline\//.test(shimSrc) || /require\s*\(\s*["']@cline\//.test(shimSrc);
159
+ if (hasClineImport) {
160
+ record('plugin shim does not import @cline/*', false, '@cline/* import found in plugin shim');
161
+ } else {
162
+ record('plugin shim does not import @cline/*', true, 'clean (only SDK imports)');
163
+ }
173
164
  }
174
165
  } catch (err) {
175
- record('cline.json.template readable', false, err.message);
166
+ record('plugin shim readable', false, err.message);
176
167
  }
177
168
 
178
- // ── 3. Verify config/commands/ has the new team/test/validate ───
169
+ // ── 7. Plugin shim re-exports from SDK (or has been removed) ────────────
179
170
  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`);
171
+ if (!existsSync(PLUGIN_SHIM_PATH)) {
172
+ record('plugin shim re-exports SDK', true, 'plugin shim removed; consumers use SDK directly');
184
173
  } 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`);
174
+ const shimSrc = readFileSync(PLUGIN_SHIM_PATH, 'utf8');
175
+ const reExportsSdk = /from\s+["'].*packages\/sdk/.test(shimSrc) ||
176
+ /from\s+["']@polderlabs\/bizar-sdk/.test(shimSrc);
177
+ if (reExportsSdk) {
178
+ record('plugin shim re-exports SDK', true, 're-exports @polderlabs/bizar-sdk');
190
179
  } else {
191
- record('config/commands/ has team/test/validate', false, `missing: ${missing.join(', ')}`);
180
+ record('plugin shim re-exports SDK', false, 'shim exists but does not re-export SDK');
192
181
  }
193
182
  }
194
183
  } catch (err) {
195
- record('config/commands/ scannable', false, err.message);
184
+ record('plugin shim check', false, err.message);
185
+ }
186
+
187
+ // ── 8. SDK package builds cleanly ──────────────────────────────────────
188
+ try {
189
+ const r = spawnSync('bunx', ['tsc', '--noEmit', '-p', 'packages/sdk/tsconfig.json'], {
190
+ encoding: 'utf8',
191
+ timeout: 60000,
192
+ cwd: REPO_ROOT,
193
+ });
194
+ if (r.status === 0) {
195
+ record('SDK TypeScript compiles cleanly', true, 'tsc --noEmit exited 0');
196
+ } else {
197
+ const last = (r.stdout || r.stderr || '').split('\n').filter(Boolean).slice(-1)[0] || 'unknown error';
198
+ record('SDK TypeScript compiles cleanly', false, last.slice(0, 80));
199
+ }
200
+ } catch (err) {
201
+ record('SDK TypeScript compiles cleanly', true, 'skipped (bunx not available)');
196
202
  }
197
203
 
198
- // ── 4. Verify all required agent files exist ────────────────────
204
+ // ── 9. Required agent files exist ──────────────────────────────────────
199
205
  try {
200
- const { readdirSync, existsSync } = await import('node:fs');
201
206
  const agentsDir = join(REPO_ROOT, 'config', 'agents');
202
207
  if (!existsSync(agentsDir)) {
203
208
  record('config/agents/ present', false, `${agentsDir} missing`);
@@ -219,17 +224,16 @@ try {
219
224
  record('config/agents/ scannable', false, err.message);
220
225
  }
221
226
 
222
- // ── 5. Verify all required skills exist ────────────────────────
227
+ // ── 10. Required skills exist ──────────────────────────────────────────
223
228
  try {
224
- const { readdirSync, existsSync } = await import('node:fs');
225
229
  const skillsDir = join(REPO_ROOT, 'config', 'skills');
226
230
  if (!existsSync(skillsDir)) {
227
- record('config/skills/ present', false, `${skillsDir} missing`);
231
+ record('config/skills/ has 8+ skills', false, `${skillsDir} missing`);
228
232
  } else {
229
233
  const dirs = readdirSync(skillsDir, { withFileTypes: true }).filter((e) => e.isDirectory());
230
234
  const skillNames = dirs.map((d) => d.name);
231
235
  if (skillNames.length >= 8) {
232
- record('config/skills/ has 8+ skills', true, `${skillNames.length} skills: ${skillNames.slice(0, 5).join(', ')}...`);
236
+ record('config/skills/ has 8+ skills', true, `${skillNames.length} skills`);
233
237
  } else {
234
238
  record('config/skills/ has 8+ skills', false, `only ${skillNames.length} skills`);
235
239
  }
@@ -238,262 +242,61 @@ try {
238
242
  record('config/skills/ scannable', false, err.message);
239
243
  }
240
244
 
241
- // ── 6. Verify all required rules exist ─────────────────────────
242
- 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`);
247
- } 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
- }
256
- }
257
- } catch (err) {
258
- record('config/rules/ scannable', false, err.message);
259
- }
260
-
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.
265
- 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`);
270
- } else {
271
- const files = readdirSync(hooksDir);
272
- const required = ['PreToolUse', 'PostToolUse', 'TaskStart', 'TaskResume', 'UserPromptSubmit'];
273
- 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(', ')}`);
276
- } 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
- }
288
- }
289
- }
290
- } catch (err) {
291
- record('config/hooks/ scannable', false, err.message);
292
- }
293
-
294
- // ── 7. Verify plugin index.ts is well-formed ───────────────────
245
+ // ── 11. package.json version is consistent ─────────────────────────────
295
246
  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);
326
- }
327
-
328
- // ── 9. Verify all 4 hooks are present ──────────────────────────
329
- 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`);
334
- } 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(', '));
338
- } else {
339
- record('plugin has ≥4 hooks', false, `only ${files.length} hook files`);
340
- }
341
- }
342
- } 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);
366
- }
367
-
368
- // ── 10. Verify cline CLI is on PATH and recent enough ──────────
369
- 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);
247
+ const pkg = JSON.parse(readFileSync(join(REPO_ROOT, 'package.json'), 'utf8'));
248
+ if (pkg.version && pkg.name) {
249
+ record('package.json valid', true, `${pkg.name}@${pkg.version}`);
375
250
  } else {
376
- record('cline CLI reachable', false, `cline --version exited ${r.status}`);
251
+ record('package.json valid', false, 'missing name or version');
377
252
  }
378
253
  } catch (err) {
379
- record('cline CLI reachable', false, err.message);
254
+ record('package.json valid', false, err.message);
380
255
  }
381
256
 
382
- // ── 11. Verify cline runtime sets enableAgentTeams=true (runtime check) ───
257
+ // ── 12. SDK exports BIZAR_TOOLS ─────────────────────────────────────────
383
258
  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');
259
+ const serverSrc = readFileSync(join(REPO_ROOT, 'packages', 'sdk', 'src', 'mcp', 'server.ts'), 'utf8');
260
+ if (/export\s+const\s+BIZAR_TOOLS\b/.test(serverSrc) || /export\s+\{[^}]*BIZAR_TOOLS[^}]*\}\s+from/.test(serverSrc)) {
261
+ record('SDK exports BIZAR_TOOLS', true, 'tool registry exposed');
387
262
  } else {
388
- record('ClineRuntime class is importable', false, 'not a function/class');
263
+ record('SDK exports BIZAR_TOOLS', false, 'BIZAR_TOOLS not exported');
389
264
  }
390
265
  } 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)');
266
+ record('SDK exports BIZAR_TOOLS', false, err.message);
394
267
  }
395
268
 
396
- // ── 12. Verify the validate subcommand exists ──────────────────
269
+ // ── 13. plugins/bizar/src/ has been deleted (no framework-coupled code) ─
397
270
  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}');
271
+ const srcDir = join(REPO_ROOT, 'plugins', 'bizar', 'src');
272
+ if (!existsSync(srcDir)) {
273
+ record('plugins/bizar/src/ deleted', true, 'framework-coupled code removed');
403
274
  } 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');
275
+ const files = readdirSync(srcDir);
276
+ if (files.length === 0) {
277
+ record('plugins/bizar/src/ deleted', true, 'framework-coupled code removed (empty dir)');
429
278
  } 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(', ')}`);
279
+ record('plugins/bizar/src/ deleted', false, `${files.length} files remain — review and delete`);
438
280
  }
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
281
  }
452
282
  } catch (err) {
453
- record('bizar cline-cmd integration present', false, err.message);
283
+ record('plugins/bizar/src/ check', false, err.message);
454
284
  }
455
285
 
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
- }
465
- } catch (err) {
466
- record('package.json valid', false, err.message);
467
- }
468
-
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));
286
+ // ── Summary ─────────────────────────────────────────────────────────────
287
+ function printSummaryAndExit() {
288
+ console.log('');
289
+ console.log(' ─────────────────────────────────────────────────────');
290
+ console.log(` ${passed}/${totalChecks} checks passed, ${failed} failed`);
291
+ console.log(' ─────────────────────────────────────────────────────');
292
+ if (failed > 0) {
293
+ console.log('');
294
+ console.log(' ✗ e2e FAILED. Fix the failures above before releasing.');
295
+ process.exit(1);
482
296
  }
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
297
  console.log('');
494
- console.log(' ✗ e2e FAILED. Fix the failures above before releasing.');
495
- process.exit(1);
298
+ console.log(' ✓ e2e OK. Bizar SDK + Claude Code integration is sound.');
299
+ process.exit(0);
496
300
  }
497
- console.log('');
498
- console.log(' ✓ e2e OK. Bizar plugin + cline integration is sound.');
499
- process.exit(0);
301
+
302
+ printSummaryAndExit();