@polderlabs/bizar 6.2.4 → 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 (332) 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 +31 -18
  125. package/cli/commands/claude-cmd.mjs +348 -0
  126. package/cli/commands/install.mjs +12 -11
  127. package/cli/commands/sandbox.mjs +220 -0
  128. package/cli/commands/validate.mjs +252 -288
  129. package/cli/dev-link.test.mjs +11 -11
  130. package/cli/doctor.mjs +131 -213
  131. package/cli/install.mjs +33 -37
  132. package/cli/install.test.mjs +9 -9
  133. package/cli/provision-claude.mjs +893 -0
  134. package/cli/provision.mjs +330 -226
  135. package/cli/provision.test.mjs +102 -0
  136. package/cli/utils.mjs +72 -58
  137. package/config/AGENTS.md +28 -28
  138. package/config/agents/_shared/AGENT_BASELINE.md +104 -684
  139. package/config/skills/bizar/SKILL.md +197 -0
  140. package/config/skills/cubesandbox/SKILL.md +148 -0
  141. package/config/skills/harness-engineering/SKILL.md +142 -0
  142. package/install.sh +66 -44
  143. package/package.json +19 -11
  144. package/packages/sdk/ARCHITECTURE.md +40 -36
  145. package/packages/sdk/package-lock.json +32 -0
  146. package/packages/sdk/package.json +15 -5
  147. package/{plugins/bizar → packages/sdk}/src/dangerous-patterns.ts +6 -28
  148. package/packages/sdk/src/fingerprint.ts +0 -0
  149. package/packages/sdk/src/index.ts +38 -73
  150. package/packages/sdk/src/mcp/bin.ts +51 -0
  151. package/packages/sdk/src/mcp/server.ts +498 -0
  152. package/{plugins/bizar/src/memory-vault.ts → packages/sdk/src/memory/index.ts} +18 -21
  153. package/packages/sdk/tests/sdk.test.mjs +148 -0
  154. package/packages/sdk/vitest.config.ts +1 -1
  155. package/scripts/bh-full-e2e.mjs +166 -363
  156. package/scripts/check-deps.mjs +28 -46
  157. package/scripts/mirror-claude-md.sh +78 -0
  158. package/scripts/test-in-container.sh +157 -0
  159. package/templates/clean-state-checklist.md +3 -3
  160. package/templates/sprint-contract.md +2 -2
  161. package/bizar-dash/.bizar/activity.log +0 -3
  162. package/bizar-dash/.omx/logs/omx-2026-07-07.jsonl +0 -1
  163. package/bizar-dash/.omx/state/session.json +0 -10
  164. package/bizar-dash/bizar-design/EXPLANATION.md +0 -307
  165. package/bizar-dash/bizar-design/INSTRUCTIONS.md +0 -149
  166. package/bizar-dash/bizar-design/canvas.html +0 -281
  167. package/bizar-dash/bizar-design/canvas.html.artifact.json +0 -19
  168. package/bizar-dash/bizar-design/components.css +0 -1665
  169. package/bizar-dash/bizar-design/components.html +0 -557
  170. package/bizar-dash/bizar-design/components.html.artifact.json +0 -19
  171. package/bizar-dash/bizar-design/desktop/agents.html +0 -74
  172. package/bizar-dash/bizar-design/desktop/agents.html.artifact.json +0 -19
  173. package/bizar-dash/bizar-design/desktop/memory.html +0 -75
  174. package/bizar-dash/bizar-design/desktop/memory.html.artifact.json +0 -19
  175. package/bizar-dash/bizar-design/desktop/metrics.html +0 -63
  176. package/bizar-dash/bizar-design/desktop/metrics.html.artifact.json +0 -19
  177. package/bizar-dash/bizar-design/desktop/overview.html +0 -95
  178. package/bizar-dash/bizar-design/desktop/overview.html.artifact.json +0 -19
  179. package/bizar-dash/bizar-design/desktop/settings.html +0 -70
  180. package/bizar-dash/bizar-design/desktop/settings.html.artifact.json +0 -19
  181. package/bizar-dash/bizar-design/icons.svg +0 -44
  182. package/bizar-dash/bizar-design/index.html +0 -192
  183. package/bizar-dash/bizar-design/index.html.artifact.json +0 -19
  184. package/bizar-dash/bizar-design/mobile/agents.html +0 -29
  185. package/bizar-dash/bizar-design/mobile/agents.html.artifact.json +0 -19
  186. package/bizar-dash/bizar-design/mobile/memory.html +0 -28
  187. package/bizar-dash/bizar-design/mobile/memory.html.artifact.json +0 -19
  188. package/bizar-dash/bizar-design/mobile/metrics.html +0 -29
  189. package/bizar-dash/bizar-design/mobile/metrics.html.artifact.json +0 -19
  190. package/bizar-dash/bizar-design/mobile/overview.html +0 -33
  191. package/bizar-dash/bizar-design/mobile/overview.html.artifact.json +0 -19
  192. package/bizar-dash/bizar-design/mobile/settings.html +0 -28
  193. package/bizar-dash/bizar-design/mobile/settings.html.artifact.json +0 -19
  194. package/bizar-dash/bizar-design/prototype.js +0 -114
  195. package/bizar-dash/bizar-design/tokens.css +0 -106
  196. package/bizar-dash/dist/assets/vendor-CeHGtduv.js.map +0 -1
  197. package/bizar-dash/node_modules/.package-lock.json +0 -6
  198. package/bizar-dash/package-lock.json +0 -6
  199. package/bizar-dash/src/server/cline-sdk.mjs +0 -132
  200. package/bizar-dash/src/server/routes/cline-session-detail.mjs +0 -559
  201. package/bizar-dash/src/server/routes/cline-sessions.mjs +0 -291
  202. package/cli/commands/cline-cmd.mjs +0 -289
  203. package/cli/commands/validate.test.mjs +0 -344
  204. package/cli/doctor.test.mjs +0 -350
  205. package/config/cline.json.template +0 -342
  206. package/packages/sdk/src/client.ts +0 -188
  207. package/packages/sdk/src/cline-events.ts +0 -134
  208. package/packages/sdk/src/cline-types.ts +0 -66
  209. package/packages/sdk/src/cline.ts +0 -339
  210. package/packages/sdk/src/errors.ts +0 -129
  211. package/packages/sdk/src/events.ts +0 -153
  212. package/packages/sdk/src/types.ts +0 -176
  213. package/packages/sdk/tests/client.test.ts +0 -217
  214. package/packages/sdk/tests/errors.test.ts +0 -108
  215. package/packages/sdk/tests/events.test.ts +0 -139
  216. package/packages/sdk/tests/fixtures/fetch-mock.ts +0 -152
  217. package/packages/sdk/tests/fixtures/sse-mock.ts +0 -30
  218. package/plugins/bizar/ARCHITECTURE.md +0 -142
  219. package/plugins/bizar/CONSTRAINTS.md +0 -67
  220. package/plugins/bizar/LICENSE +0 -21
  221. package/plugins/bizar/README.md +0 -448
  222. package/plugins/bizar/index.ts +0 -872
  223. package/plugins/bizar/package.json +0 -39
  224. package/plugins/bizar/scripts/check-forbidden-imports.sh +0 -33
  225. package/plugins/bizar/src/background-state.ts +0 -641
  226. package/plugins/bizar/src/background.ts +0 -1806
  227. package/plugins/bizar/src/cline-runner.ts +0 -203
  228. package/plugins/bizar/src/clineruntime.ts +0 -227
  229. package/plugins/bizar/src/commands-impl.ts +0 -151
  230. package/plugins/bizar/src/commands.ts +0 -1799
  231. package/plugins/bizar/src/compaction.d.mts +0 -48
  232. package/plugins/bizar/src/compaction.mjs +0 -192
  233. package/plugins/bizar/src/dashboard-client.ts +0 -233
  234. package/plugins/bizar/src/event-stream.ts +0 -606
  235. package/plugins/bizar/src/fingerprint.ts +0 -120
  236. package/plugins/bizar/src/handoff.ts +0 -79
  237. package/plugins/bizar/src/hooks/memory-flush-on-compact.ts +0 -123
  238. package/plugins/bizar/src/hooks/memory-inject.ts +0 -247
  239. package/plugins/bizar/src/hooks/memory-write-on-end.ts +0 -188
  240. package/plugins/bizar/src/hooks/skill-curator.ts +0 -180
  241. package/plugins/bizar/src/http-client.ts +0 -467
  242. package/plugins/bizar/src/key-rotation.ts +0 -218
  243. package/plugins/bizar/src/logger.ts +0 -144
  244. package/plugins/bizar/src/loop-engineering.ts +0 -241
  245. package/plugins/bizar/src/loop.ts +0 -176
  246. package/plugins/bizar/src/mistake-recovery.ts +0 -98
  247. package/plugins/bizar/src/odin.ts +0 -227
  248. package/plugins/bizar/src/options.ts +0 -470
  249. package/plugins/bizar/src/plan-fs.ts +0 -323
  250. package/plugins/bizar/src/reasoning-clean.ts +0 -454
  251. package/plugins/bizar/src/report.ts +0 -178
  252. package/plugins/bizar/src/research-prompt.ts +0 -35
  253. package/plugins/bizar/src/serve-info.ts +0 -228
  254. package/plugins/bizar/src/serve.ts +0 -496
  255. package/plugins/bizar/src/settings.ts +0 -349
  256. package/plugins/bizar/src/state.ts +0 -298
  257. package/plugins/bizar/src/tool-discipline.ts +0 -105
  258. package/plugins/bizar/src/tools/agent-browser.ts +0 -315
  259. package/plugins/bizar/src/tools/bg-collect.ts +0 -131
  260. package/plugins/bizar/src/tools/bg-get-comments.ts +0 -266
  261. package/plugins/bizar/src/tools/bg-kill.ts +0 -116
  262. package/plugins/bizar/src/tools/bg-pause.ts +0 -99
  263. package/plugins/bizar/src/tools/bg-report-progress.ts +0 -115
  264. package/plugins/bizar/src/tools/bg-resume.ts +0 -94
  265. package/plugins/bizar/src/tools/bg-send-message.ts +0 -223
  266. package/plugins/bizar/src/tools/bg-spawn.ts +0 -502
  267. package/plugins/bizar/src/tools/bg-status.ts +0 -130
  268. package/plugins/bizar/src/tools/graph-query.ts +0 -278
  269. package/plugins/bizar/src/tools/loop-engineering.ts +0 -193
  270. package/plugins/bizar/src/tools/memory-list.ts +0 -43
  271. package/plugins/bizar/src/tools/memory-read.ts +0 -69
  272. package/plugins/bizar/src/tools/memory-search.ts +0 -47
  273. package/plugins/bizar/src/tools/memory-write.ts +0 -54
  274. package/plugins/bizar/src/tools/open-kb.ts +0 -198
  275. package/plugins/bizar/src/tools/plan-action.ts +0 -785
  276. package/plugins/bizar/src/tools/read-glyph-feedback.ts +0 -191
  277. package/plugins/bizar/src/tools/team-spawn.ts +0 -73
  278. package/plugins/bizar/src/tools/team-status.ts +0 -76
  279. package/plugins/bizar/src/tools/wait-for-feedback.ts +0 -415
  280. package/plugins/bizar/src/trajectory.ts +0 -104
  281. package/plugins/bizar/tests/README.md +0 -99
  282. package/plugins/bizar/tests/attach-handler-bug.test.ts +0 -169
  283. package/plugins/bizar/tests/background-state.test.ts +0 -277
  284. package/plugins/bizar/tests/background.test.ts +0 -402
  285. package/plugins/bizar/tests/block.test.ts +0 -195
  286. package/plugins/bizar/tests/canonical-key-order.test.ts +0 -75
  287. package/plugins/bizar/tests/clineruntime-config.test.ts +0 -283
  288. package/plugins/bizar/tests/commands-impl.test.ts +0 -316
  289. package/plugins/bizar/tests/commands.test.ts +0 -584
  290. package/plugins/bizar/tests/compaction.test.ts +0 -264
  291. package/plugins/bizar/tests/config.test.ts +0 -128
  292. package/plugins/bizar/tests/dashboard-client.test.ts +0 -159
  293. package/plugins/bizar/tests/dispose.test.ts +0 -336
  294. package/plugins/bizar/tests/event-stream.test.ts +0 -409
  295. package/plugins/bizar/tests/event.test.ts +0 -262
  296. package/plugins/bizar/tests/fingerprint.test.ts +0 -162
  297. package/plugins/bizar/tests/http-client.test.ts +0 -404
  298. package/plugins/bizar/tests/init-helpers.test.ts +0 -203
  299. package/plugins/bizar/tests/integration/slash-command.test.ts +0 -349
  300. package/plugins/bizar/tests/integration/tool-routing.test.ts +0 -98
  301. package/plugins/bizar/tests/key-rotation.test.ts +0 -396
  302. package/plugins/bizar/tests/loop-engineering.test.ts +0 -168
  303. package/plugins/bizar/tests/loop.test.ts +0 -397
  304. package/plugins/bizar/tests/memory-write-on-end.test.ts +0 -92
  305. package/plugins/bizar/tests/mistake-recovery.test.ts +0 -116
  306. package/plugins/bizar/tests/odin.test.ts +0 -125
  307. package/plugins/bizar/tests/options.test.ts +0 -329
  308. package/plugins/bizar/tests/reasoning-clean.test.ts +0 -422
  309. package/plugins/bizar/tests/safety.test.ts +0 -256
  310. package/plugins/bizar/tests/serve.test.ts +0 -339
  311. package/plugins/bizar/tests/settings.test.ts +0 -351
  312. package/plugins/bizar/tests/stall-think.test.ts +0 -750
  313. package/plugins/bizar/tests/state.test.ts +0 -276
  314. package/plugins/bizar/tests/tool-discipline.test.ts +0 -77
  315. package/plugins/bizar/tests/tools/agent-browser.test.ts +0 -98
  316. package/plugins/bizar/tests/tools/bg-collect.test.ts +0 -337
  317. package/plugins/bizar/tests/tools/bg-get-comments.test.ts +0 -485
  318. package/plugins/bizar/tests/tools/bg-kill.test.ts +0 -235
  319. package/plugins/bizar/tests/tools/bg-pause.test.ts +0 -61
  320. package/plugins/bizar/tests/tools/bg-report-progress.test.ts +0 -79
  321. package/plugins/bizar/tests/tools/bg-resume.test.ts +0 -40
  322. package/plugins/bizar/tests/tools/bg-send-message.test.ts +0 -116
  323. package/plugins/bizar/tests/tools/bg-spawn-delegation.test.ts +0 -147
  324. package/plugins/bizar/tests/tools/bg-spawn-http.test.ts +0 -233
  325. package/plugins/bizar/tests/tools/bg-spawn.test.ts +0 -311
  326. package/plugins/bizar/tests/tools/bg-status.test.ts +0 -217
  327. package/plugins/bizar/tests/tools/cline-runner.test.ts +0 -115
  328. package/plugins/bizar/tests/tools/plan-action.test.ts +0 -599
  329. package/plugins/bizar/tests/tools/read-glyph-feedback.test.ts +0 -253
  330. package/plugins/bizar/tests/tools/wait-for-feedback.test.ts +0 -390
  331. package/plugins/bizar/tests/update-deadlock.test.ts +0 -151
  332. package/plugins/bizar/tsconfig.json +0 -29
@@ -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();