@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,350 +0,0 @@
1
- /**
2
- * cli/doctor.test.mjs
3
- *
4
- * Tests for the `bizar doctor` subcommand. Uses Node's built-in
5
- * node:test (no external test framework).
6
- *
7
- * Strategy: mock HOME so clineConfigDir() resolves inside a
8
- * tmpdir, and craft the cline.json + agents/ directory to drive
9
- * specific pass/fail outcomes. For checks that depend on global
10
- * npm-installed packages or external CLIs (e.g. cline --version,
11
- * npm root -g, which headroom), we accept that they may pass or fail
12
- * depending on the test environment and just verify the framework
13
- * returns the right shape.
14
- */
15
- import { test, describe, beforeEach, afterEach } from 'node:test';
16
- import assert from 'node:assert/strict';
17
- import {
18
- mkdtempSync,
19
- mkdirSync,
20
- writeFileSync,
21
- rmSync,
22
- existsSync,
23
- utimesSync,
24
- } from 'node:fs';
25
- import { tmpdir } from 'node:os';
26
- import { join, dirname } from 'node:path';
27
- import { fileURLToPath } from 'node:url';
28
-
29
- const __dirname = dirname(fileURLToPath(import.meta.url));
30
- const PROJECT_ROOT = join(__dirname, '..');
31
-
32
- const { runDoctor } = await import('./doctor.mjs');
33
-
34
- // ── HOME mocking ────────────────────────────────────────────────────────────
35
-
36
- const ORIG_HOME = process.env.HOME;
37
- const ORIG_XDG = process.env.XDG_CONFIG_HOME;
38
-
39
- /**
40
- * Mock HOME so clineConfigDir() resolves to `<tmpdir>/.cline`.
41
- * Returns the tmpdir path.
42
- *
43
- * We don't set XDG_CONFIG_HOME here for the same reason as dev-link.test.mjs:
44
- * the helper treats a set XDG_CONFIG_HOME as the direct parent (so
45
- * `XDG_CONFIG_HOME=~/.config` → `~/.cline`).
46
- */
47
- function freshHome() {
48
- const home = mkdtempSync(join(tmpdir(), 'bizar-doctor-'));
49
- process.env.HOME = home;
50
- delete process.env.CLINE_DIR;
51
- delete process.env.BIZAR_LEGACY_CLINE_DIR;
52
- return home;
53
- }
54
-
55
- afterEach(() => {
56
- if (ORIG_HOME === undefined) delete process.env.HOME;
57
- else process.env.HOME = ORIG_HOME;
58
- if (ORIG_XDG === undefined) {
59
- delete process.env.CLINE_DIR;
60
- delete process.env.BIZAR_LEGACY_CLINE_DIR;
61
- } else {
62
- process.env.XDG_CONFIG_HOME = ORIG_XDG;
63
- }
64
- });
65
-
66
- // ── Shape & silent-mode tests ───────────────────────────────────────────────
67
-
68
- describe('runDoctor() shape', () => {
69
- let home;
70
-
71
- beforeEach(() => {
72
- home = freshHome();
73
- });
74
-
75
- afterEach(() => {
76
- if (home && existsSync(home)) rmSync(home, { recursive: true, force: true });
77
- });
78
-
79
- test('returns { passed, failed, results }', async () => {
80
- const result = await runDoctor({ silent: true });
81
- assert.equal(typeof result.passed, 'number');
82
- assert.equal(typeof result.failed, 'number');
83
- assert.ok(Array.isArray(result.results));
84
- // results should have one entry per check
85
- assert.equal(result.results.length, 9);
86
- assert.equal(result.passed + result.failed, 9);
87
- // Each result has the expected fields
88
- for (const r of result.results) {
89
- assert.equal(typeof r.name, 'string');
90
- assert.equal(typeof r.ok, 'boolean');
91
- assert.equal(typeof r.message, 'string');
92
- }
93
- });
94
-
95
- test('silent mode suppresses per-check output but still prints summary on failure', async () => {
96
- // Capture stdout by overriding console.log.
97
- const lines = [];
98
- const origLog = console.log;
99
- console.log = (...args) => {
100
- lines.push(args.join(' '));
101
- };
102
-
103
- try {
104
- // Empty home → many checks will fail → summary should print.
105
- const result = await runDoctor({ silent: true });
106
- assert.ok(result.failed > 0, 'precondition: some checks should fail');
107
- } finally {
108
- console.log = origLog;
109
- }
110
-
111
- // In silent mode with failures, only the summary line should print
112
- // (an empty leading line is also fine — it's a visual separator).
113
- const summaryLines = lines.filter((l) => /checks passed.*failed/.test(l));
114
- assert.equal(
115
- summaryLines.length,
116
- 1,
117
- `expected exactly 1 summary line in silent+failed mode, got ${summaryLines.length}:\n${lines.join('\n')}`,
118
- );
119
- assert.match(summaryLines[0], /checks passed.*failed/);
120
- });
121
-
122
- test('silent mode suppresses ALL output when nothing fails', async () => {
123
- // Build a fully healthy environment. We can't make cline reachable
124
- // or headroom installed without modifying PATH, so we settle for: no failures
125
- // means no output at all. Since we know some checks will fail in a
126
- // bare tmpdir, this test is structured to assert the negative case
127
- // differently: we verify silent+no-fail produces 0 lines.
128
- //
129
- // For this we mock nothing — the test just confirms the framework
130
- // doesn't print per-check lines when silent is true.
131
- const lines = [];
132
- const origLog = console.log;
133
- console.log = (...args) => {
134
- lines.push(args.join(' '));
135
- };
136
-
137
- try {
138
- await runDoctor({ silent: true });
139
- // Some checks failed (because the env isn't fully healthy).
140
- // What we want to verify is that per-check lines did NOT print.
141
- const perCheckLines = lines.filter((l) =>
142
- /^\s+[✓✗]\s/.test(l) // chalk check markers
143
- );
144
- assert.equal(
145
- perCheckLines.length,
146
- 0,
147
- `silent mode should suppress per-check output, got:\n${perCheckLines.join('\n')}`,
148
- );
149
- } finally {
150
- console.log = origLog;
151
- }
152
- });
153
-
154
- test('non-silent mode prints per-check output', async () => {
155
- const lines = [];
156
- const origLog = console.log;
157
- console.log = (...args) => {
158
- lines.push(args.join(' '));
159
- };
160
-
161
- try {
162
- await runDoctor();
163
- } finally {
164
- console.log = origLog;
165
- }
166
-
167
- // Should have at least 9 per-check lines plus the summary.
168
- const perCheckLines = lines.filter((l) => /^\s+[✓✗]\s/.test(l));
169
- assert.ok(
170
- perCheckLines.length >= 9,
171
- `expected ≥9 per-check lines, got ${perCheckLines.length}`,
172
- );
173
- });
174
- });
175
-
176
- // ── Fixture-driven pass/fail tests ──────────────────────────────────────────
177
-
178
- describe('runDoctor() with fixture HOME', () => {
179
- let home;
180
-
181
- beforeEach(() => {
182
- home = freshHome();
183
- });
184
-
185
- afterEach(() => {
186
- if (home && existsSync(home)) rmSync(home, { recursive: true, force: true });
187
- });
188
-
189
- function writeClineConfig(json) {
190
- const cfgDir = join(home, '.cline');
191
- mkdirSync(cfgDir, { recursive: true });
192
- writeFileSync(join(cfgDir, 'cline.json'), JSON.stringify(json), 'utf8');
193
- return cfgDir;
194
- }
195
-
196
- function writeAgents(...files) {
197
- const agentsDir = join(home, '.cline', 'agents');
198
- mkdirSync(agentsDir, { recursive: true });
199
- for (const f of files) {
200
- writeFileSync(join(agentsDir, f), `# ${f}`, 'utf8');
201
- }
202
- return agentsDir;
203
- }
204
-
205
- function findCheck(result, name) {
206
- return result.results.find((r) => r.name === name);
207
- }
208
-
209
- test('config-valid passes for parseable JSON', async () => {
210
- writeClineConfig({ provider: {} });
211
- const result = await runDoctor({ silent: true });
212
- const r = findCheck(result, 'cline-config-valid');
213
- assert.equal(r.ok, true, `expected config-valid to pass: ${r.message}`);
214
- });
215
-
216
- test('config-valid fails for missing cline.json', async () => {
217
- // No cline.json written.
218
- const result = await runDoctor({ silent: true });
219
- const r = findCheck(result, 'cline-config-valid');
220
- assert.equal(r.ok, false);
221
- assert.match(r.message, /not found/);
222
- });
223
-
224
- test('config-valid fails for invalid JSON', async () => {
225
- const cfgDir = writeClineConfig({});
226
- // Overwrite with garbage
227
- writeFileSync(join(cfgDir, 'cline.json'), '{ this is not json', 'utf8');
228
- const result = await runDoctor({ silent: true });
229
- const r = findCheck(result, 'cline-config-valid');
230
- assert.equal(r.ok, false);
231
- assert.match(r.message, /invalid JSON/);
232
- });
233
-
234
- test('plugin-entry-present fails when plugin[] is empty', async () => {
235
- writeClineConfig({ plugin: [] });
236
- const result = await runDoctor({ silent: true });
237
- const r = findCheck(result, 'plugin-entry-present');
238
- assert.equal(r.ok, false);
239
- });
240
-
241
- test('plugin-entry-present fails when plugin[] has no bizar', async () => {
242
- writeClineConfig({ plugin: ['something-else'] });
243
- const result = await runDoctor({ silent: true });
244
- const r = findCheck(result, 'plugin-entry-present');
245
- assert.equal(r.ok, false);
246
- });
247
-
248
- test('plugin-entry-present passes when plugin[] has bizar string', async () => {
249
- writeClineConfig({ plugin: ['bizar'] });
250
- const result = await runDoctor({ silent: true });
251
- const r = findCheck(result, 'plugin-entry-present');
252
- assert.equal(r.ok, true, r.message);
253
- });
254
-
255
- test('plugin-entry-present passes when plugin[] has bizar object', async () => {
256
- writeClineConfig({ plugin: [{ name: 'bizar', path: './plugins/bizar' }] });
257
- const result = await runDoctor({ silent: true });
258
- const r = findCheck(result, 'plugin-entry-present');
259
- assert.equal(r.ok, true, r.message);
260
- });
261
-
262
- test('plugin-entry-present passes when plugin[] has [path, options] tuple', async () => {
263
- writeClineConfig({ plugin: [['./plugins/bizar/index.ts', { loopThresholdWarn: 5 }]] });
264
- const result = await runDoctor({ silent: true });
265
- const r = findCheck(result, 'plugin-entry-present');
266
- assert.equal(r.ok, true, r.message);
267
- });
268
-
269
- test('plugin-entry-present fails when tuple path does not contain "bizar"', async () => {
270
- writeClineConfig({ plugin: [['./plugins/other/index.ts', {}]] });
271
- const result = await runDoctor({ silent: true });
272
- const r = findCheck(result, 'plugin-entry-present');
273
- assert.equal(r.ok, false);
274
- });
275
-
276
- test('plugin-path-resolves passes when tuple path resolves', async () => {
277
- const home = process.env.HOME;
278
- const pluginsDir = join(home, '.cline', 'plugins', 'bizar');
279
- mkdirSync(pluginsDir, { recursive: true });
280
- writeFileSync(join(pluginsDir, 'index.ts'), '// fake plugin\n', 'utf8');
281
- writeClineConfig({ plugin: [['./plugins/bizar/index.ts', {}]] });
282
- const result = await runDoctor({ silent: true });
283
- const r = findCheck(result, 'plugin-path-resolves');
284
- assert.equal(r.ok, true, r.message);
285
- });
286
-
287
- test('agent-files-installed fails when core agents missing', async () => {
288
- writeClineConfig({});
289
- writeAgents('odin.md'); // missing the other 13
290
- const result = await runDoctor({ silent: true });
291
- const r = findCheck(result, 'agent-files-installed');
292
- assert.equal(r.ok, false);
293
- assert.match(r.message, /missing/);
294
- });
295
-
296
- test('agent-files-installed passes when all 14 agents present', async () => {
297
- writeClineConfig({});
298
- // v3.20.11: doctor now expects all 14 agents (was 4 in v3.20.10).
299
- writeAgents(
300
- 'odin.md', 'vor.md', 'frigg.md', 'quick.md',
301
- 'mimir.md', 'heimdall.md', 'hermod.md', 'thor.md', 'baldr.md',
302
- 'tyr.md', 'vidarr.md', 'forseti.md',
303
- 'semble-search.md', 'agent-browser.md',
304
- );
305
- const result = await runDoctor({ silent: true });
306
- const r = findCheck(result, 'agent-files-installed');
307
- assert.equal(r.ok, true, r.message);
308
- });
309
-
310
- test('provider-config-sanity warns (not fails) without minimax block', async () => {
311
- // v5.x: checkProviderConfigSanity warns instead of throwing when the
312
- // provider.minimax block is missing, since provision.mjs auto-adds it.
313
- writeClineConfig({ provider: {} });
314
- const result = await runDoctor({ silent: true });
315
- const r = findCheck(result, 'provider-config-sanity');
316
- assert.equal(r.ok, true, 'should pass with warning, not throw');
317
- assert.match(r.message, /warn.*minimax|minimax.*missing/i);
318
- });
319
-
320
- test('provider-config-sanity fails when models lack interleaved+reasoning', async () => {
321
- writeClineConfig({
322
- provider: {
323
- minimax: {
324
- models: { 'some-model': { id: 'foo' } },
325
- },
326
- },
327
- });
328
- const result = await runDoctor({ silent: true });
329
- const r = findCheck(result, 'provider-config-sanity');
330
- assert.equal(r.ok, false);
331
- assert.match(r.message, /interleaved.*reasoning/);
332
- });
333
-
334
- test('provider-config-sanity passes with interleaved+reasoning', async () => {
335
- writeClineConfig({
336
- provider: {
337
- minimax: {
338
- models: {
339
- 'MiniMax/MiniMax-M3': { interleaved: true, reasoning: true },
340
- },
341
- },
342
- },
343
- });
344
- const result = await runDoctor({ silent: true });
345
- const r = findCheck(result, 'provider-config-sanity');
346
- assert.equal(r.ok, true, r.message);
347
- });
348
- });
349
-
350
- console.log(' doctor.mjs tests loaded — run with: node --test cli/doctor.test.mjs');
@@ -1,342 +0,0 @@
1
- {
2
- "$schema": "https://docs.cline.bot/config.json",
3
- "instructions": [".cline/instructions/bizar-tools.md"],
4
- "model": "minimaxcustom/MiniMax-M3",
5
- "small_model": "minimaxcustom/MiniMax-M2.7",
6
- "default_agent": "odin",
7
- "permission": "allow",
8
- "snapshot": false,
9
- "mcp": {
10
- "supabase": {
11
- "type": "remote",
12
- "url": "https://mcp.supabase.com/mcp",
13
- "enabled": false
14
- },
15
- "semble": {
16
- "type": "local",
17
- "command": [
18
- "uvx",
19
- "--from",
20
- "semble[mcp]",
21
- "semble"
22
- ],
23
- "enabled": true
24
- }
25
- },
26
- "plugin": [
27
- ["./plugins/bizar/index.ts", {
28
- "loopThresholdWarn": 5,
29
- "loopThresholdEscalate": 8,
30
- "loopThresholdBlock": 12,
31
- "loopWindowSize": 10,
32
- "clineruntimeMaxConsecutiveMistakes": 6,
33
- "compaction": {
34
- "auto": true,
35
- "threshold": 0.5,
36
- "preserve_recent": 10,
37
- "strategy": "summarize",
38
- "model": "minimaxcustom/MiniMax-M3"
39
- }
40
- }]
41
- ],
42
- "tools": {
43
- "bizar_plan_action": true,
44
- "bizar_get_plan_comments": true,
45
- "bizar_wait_for_feedback": true,
46
- "bizar_spawn_background": true,
47
- "bizar_status": true,
48
- "bizar_collect": true,
49
- "bizar_kill": true
50
- },
51
- "agent": {
52
- "odin": {
53
- "description": "Odin — Pure router that delegates all work to subagents.",
54
- "mode": "primary",
55
- "model": "minimaxcustom/MiniMax-M3",
56
- "color": "#6366f1",
57
- "permission": {
58
- "task": "allow",
59
- "read": "allow",
60
- "list": "allow",
61
- "todowrite": "allow",
62
- "webfetch": "allow",
63
- "websearch": "allow"
64
- }
65
- },
66
- "vor": {
67
- "description": "Vör — The Questioning One.",
68
- "mode": "subagent",
69
- "model": "minimaxcustom/MiniMax-M2.7",
70
- "color": "#8b5cf6",
71
- "permission": {
72
- "read": "allow",
73
- "list": "allow",
74
- "question": "allow"
75
- }
76
- },
77
- "frigg": {
78
- "description": "Frigg — All-knowing Q&A agent.",
79
- "mode": "primary",
80
- "model": "minimaxcustom/MiniMax-M2.7",
81
- "color": "#06b6d4",
82
- "permission": {
83
- "read": "allow",
84
- "list": "allow",
85
- "glob": "allow",
86
- "grep": "allow",
87
- "bash": "allow",
88
- "webfetch": "allow",
89
- "websearch": "allow",
90
- "question": "allow"
91
- }
92
- },
93
- "quick": {
94
- "description": "Quick — Fast single-shot tasks.",
95
- "mode": "primary",
96
- "model": "minimaxcustom/MiniMax-M2.7",
97
- "color": "#22d3ee",
98
- "permission": {
99
- "read": "allow",
100
- "edit": "allow",
101
- "write": "allow",
102
- "bash": "allow",
103
- "glob": "allow",
104
- "grep": "allow",
105
- "list": "allow",
106
- "todowrite": "allow",
107
- "webfetch": "allow",
108
- "websearch": "allow",
109
- "task": "deny"
110
- }
111
- },
112
- "mimir": {
113
- "description": "Mimir — Research and codebase exploration agent.",
114
- "mode": "subagent",
115
- "model": "minimaxcustom/MiniMax-M2.7",
116
- "color": "#0ea5e9",
117
- "permission": {
118
- "read": "allow",
119
- "write": "allow",
120
- "edit": "allow",
121
- "bash": "allow",
122
- "glob": "allow",
123
- "grep": "allow",
124
- "list": "allow",
125
- "webfetch": "allow",
126
- "websearch": "allow",
127
- "todowrite": "allow"
128
- }
129
- },
130
- "heimdall": {
131
- "description": "Heimdall — Simple, routine, deterministic tasks.",
132
- "mode": "subagent",
133
- "model": "minimaxcustom/MiniMax-M2.7",
134
- "color": "#10b981",
135
- "permission": {
136
- "read": "allow",
137
- "edit": "allow",
138
- "bash": "allow",
139
- "glob": "allow",
140
- "grep": "allow",
141
- "list": "allow",
142
- "todowrite": "allow",
143
- "webfetch": "allow",
144
- "websearch": "allow"
145
- }
146
- },
147
- "hermod": {
148
- "description": "Hermod — Git and GitHub operations specialist.",
149
- "mode": "subagent",
150
- "model": "minimaxcustom/MiniMax-M2.7",
151
- "color": "#06b6d4",
152
- "permission": {
153
- "read": "allow",
154
- "edit": "allow",
155
- "bash": "allow",
156
- "glob": "allow",
157
- "grep": "allow",
158
- "list": "allow",
159
- "webfetch": "allow",
160
- "websearch": "allow"
161
- }
162
- },
163
- "thor": {
164
- "description": "Thor — Medium-complexity tasks, strong and reliable.",
165
- "mode": "subagent",
166
- "model": "minimaxcustom/MiniMax-M2.7",
167
- "color": "#a855f7",
168
- "permission": {
169
- "read": "allow",
170
- "edit": "allow",
171
- "bash": "allow",
172
- "glob": "allow",
173
- "grep": "allow",
174
- "list": "allow",
175
- "todowrite": "allow",
176
- "webfetch": "allow",
177
- "websearch": "allow"
178
- }
179
- },
180
- "baldr": {
181
- "description": "Baldr — UI/UX design system specialist.",
182
- "mode": "subagent",
183
- "model": "minimaxcustom/MiniMax-M2.7",
184
- "color": "#ec4899",
185
- "permission": {
186
- "read": "allow",
187
- "edit": "allow",
188
- "bash": "allow",
189
- "glob": "allow",
190
- "grep": "allow",
191
- "list": "allow",
192
- "todowrite": "allow",
193
- "webfetch": "allow",
194
- "websearch": "allow"
195
- }
196
- },
197
- "tyr": {
198
- "description": "Tyr — Complex implementation, debugging, architecture.",
199
- "mode": "subagent",
200
- "model": "minimaxcustom/MiniMax-M3",
201
- "color": "#f59e0b",
202
- "permission": {
203
- "read": "allow",
204
- "edit": "allow",
205
- "bash": "allow",
206
- "glob": "allow",
207
- "grep": "allow",
208
- "list": "allow",
209
- "todowrite": "allow",
210
- "webfetch": "allow",
211
- "websearch": "allow"
212
- }
213
- },
214
- "vidarr": {
215
- "description": "Vidarr — Ultimate fallback via MiniMax M3.",
216
- "mode": "subagent",
217
- "model": "minimaxcustom/MiniMax-M3",
218
- "color": "#dc2626",
219
- "permission": {
220
- "read": "allow",
221
- "edit": "allow",
222
- "bash": "allow",
223
- "glob": "allow",
224
- "grep": "allow",
225
- "list": "allow",
226
- "todowrite": "allow",
227
- "webfetch": "allow",
228
- "websearch": "allow"
229
- }
230
- },
231
- "forseti": {
232
- "description": "Forseti — Audits and corrects plans before execution.",
233
- "mode": "subagent",
234
- "model": "minimaxcustom/MiniMax-M3",
235
- "color": "#ef4444",
236
- "permission": {
237
- "read": "allow",
238
- "edit": "deny",
239
- "bash": "allow",
240
- "glob": "allow",
241
- "grep": "allow",
242
- "list": "allow",
243
- "todowrite": "allow",
244
- "question": "allow",
245
- "webfetch": "allow",
246
- "websearch": "allow"
247
- }
248
- },
249
- "agent-browser": {
250
- "description": "agent-browser — Primary agent for browser-driven E2E verification. No-edit permissions. Drives Chrome for Testing via the agent-browser Rust CLI for end-to-end testing of web apps. Reads `_shared/CLINE_TOOLS.md` before any tool call.",
251
- "mode": "primary",
252
- "model": "minimaxcustom/MiniMax-M2.7",
253
- "color": "#84cc16",
254
- "permission": {
255
- "read": "allow",
256
- "bash": "allow",
257
- "glob": "allow",
258
- "grep": "allow",
259
- "list": "allow",
260
- "webfetch": "allow",
261
- "websearch": "allow",
262
- "edit": "deny",
263
- "write": "deny"
264
- }
265
- },
266
- "semble-search": {
267
- "description": "Code search agent for exploring any codebase.",
268
- "mode": "subagent",
269
- "permission": {
270
- "bash": "allow",
271
- "read": "allow"
272
- }
273
- }
274
- },
275
- "command": {
276
- "audit": {
277
- "description": "Run bizar audit to scan agent configuration for security issues.",
278
- "agent": "forseti",
279
- "template": "commands-bizar/audit.md"
280
- },
281
- "explain": {
282
- "description": "Route to @frigg for read-only codebase Q&A.",
283
- "agent": "frigg",
284
- "template": "commands-bizar/explain.md"
285
- },
286
- "init": {
287
- "description": "Run bizar init to detect project stack and install skills.",
288
- "agent": "heimdall",
289
- "template": "commands-bizar/init.md"
290
- },
291
- "learn": {
292
- "description": "Extract patterns from current session.",
293
- "agent": "heimdall",
294
- "template": "commands-bizar/learn.md"
295
- },
296
- "plan": {
297
- "description": "Open the Bizar visual plan canvas.",
298
- "agent": "odin",
299
- "template": "commands-bizar/plan.md"
300
- },
301
- "pr-review": {
302
- "description": "PR review mode with @mimir and @forseti.",
303
- "agent": "hermod",
304
- "template": "commands-bizar/pr-review.md"
305
- },
306
- "tailscale-serve": {
307
- "description": "Authenticate Tailscale Serve and expose a local port.",
308
- "agent": "heimdall",
309
- "template": "commands-bizar/tailscale-serve.md"
310
- },
311
- "visual-plan": {
312
- "description": "Toggle the Bizar visual plan canvas.",
313
- "agent": "odin",
314
- "template": "commands-bizar/visual-plan.md"
315
- },
316
- "bizar": {
317
- "description": "Bizar Plugin Menu.",
318
- "agent": "odin",
319
- "template": "commands-bizar/bizar.md\n\n$ARGUMENTS"
320
- },
321
- "team": {
322
- "description": "Spawn a Cline agent team — coordinate Thor, Tyr, Mimir, Hermod, and Forseti to complete a complex mission end-to-end.",
323
- "agent": "odin",
324
- "template": "commands-bizar/team.md\n\n$ARGUMENTS"
325
- },
326
- "test": {
327
- "description": "Run the project's test suite via the Bizar test gate (auto-detects jest/vitest/bun/pytest/cargo/go).",
328
- "agent": "thor",
329
- "template": "commands-bizar/test.md\n\n$ARGUMENTS"
330
- },
331
- "validate": {
332
- "description": "Validate the Bizar install: cline.json, plugin entry, agents, skills, hooks, rules, commands, and provider config.",
333
- "agent": "heimdall",
334
- "template": "commands-bizar/validate.md\n\n$ARGUMENTS"
335
- },
336
- "setup-provider": {
337
- "description": "Configure a provider in cline.json. Since v6.2.2 the installer no longer touches provider config — use this to add your own.",
338
- "agent": "heimdall",
339
- "template": "commands-bizar/setup-provider.md\n\n$ARGUMENTS"
340
- }
341
- }
342
- }