@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,448 +0,0 @@
1
- # Bizar cline plugin
2
-
3
- A BizarHarness-bundled cline plugin that gives Odin better visibility into
4
- subagent activity and a mechanism to stop or reassign agents that are stuck.
5
- It does three things:
6
-
7
- 1. **Loop detection** — fingerprint tool calls and warn/block on repetition.
8
- 2. **Periodic status reporting** — log subagent activity so Odin (and the
9
- human) can see what is happening.
10
- 3. **Handoff signal** — when a subagent is clearly stuck, inject a message
11
- that nudges it (or the parent) to reassign via the `task` tool.
12
-
13
- The plugin is specified in `.bizar/plugin-architecture-v0.3.md` and
14
- implemented against that contract. v0.4.0 adds slash commands and the
15
- visual-plan flow (settings store, slash command parser, plan action
16
- tool, and wait-for-feedback tool).
17
-
18
- ## Install
19
-
20
- The plugin is copied to `<project>/.cline/plugins/bizar/` by the
21
- BizarHarness install script. After install, the layout is:
22
-
23
- ```
24
- <project-root>/
25
- └── .cline/
26
- ├── cline.json
27
- └── plugins/
28
- └── bizar/
29
- ├── package.json
30
- ├── tsconfig.json
31
- ├── README.md
32
- ├── index.ts
33
- ├── scripts/
34
- │ └── check-forbidden-imports.sh
35
- ├── src/
36
- │ ├── loop.ts
37
- │ ├── handoff.ts
38
- │ ├── logger.ts
39
- │ ├── options.ts
40
- │ ├── fingerprint.ts
41
- │ ├── state.ts
42
- │ └── report.ts
43
- └── tests/
44
- ├── loop.test.ts
45
- ├── block.test.ts
46
- ├── fingerprint.test.ts
47
- ├── state.test.ts
48
- ├── event.test.ts
49
- ├── options.test.ts
50
- └── integration.test.ts
51
- ```
52
-
53
- `cline.json` references the plugin via the relative path
54
- `./plugins/bizar/index.ts` (relative to the config directory).
55
-
56
- ## Options
57
-
58
- Plugin options are passed as the second element of the `plugin` tuple in
59
- `cline.json`:
60
-
61
- ```jsonc
62
- "plugin": [
63
- ["./plugins/bizar/index.ts", {
64
- "loopThresholdWarn": 5,
65
- "loopThresholdEscalate": 8,
66
- "loopThresholdBlock": 12,
67
- "loopWindowSize": 10,
68
- "logDir": "~/.cache/bizar/logs",
69
- "stateDir": "~/.cache/bizar",
70
- "logRotationBytes": 10485760
71
- }]
72
- ]
73
- ```
74
-
75
- All options are optional. Missing options fall back to the defaults. Bad
76
- input is clamped, never rejected — the plugin never throws on bad config.
77
-
78
- | Option | Default | Clamp / behavior |
79
- |---|---|---|
80
- | `loopThresholdWarn` | `5` | `Math.max(1, Math.floor(value))`. Out-of-order: `escalate = warn + 1`, `block = escalate + 1`. |
81
- | `loopThresholdEscalate` | `8` | `Math.max(1, Math.floor(value))`. |
82
- | `loopThresholdBlock` | `12` | `Math.max(1, Math.floor(value))`. Constrained: `block <= loopWindowSize + 2`. |
83
- | `loopWindowSize` | `10` | Clamped to `[3, 50]`. |
84
- | `logDir` | `~/.cache/bizar/logs` | Refused if inside `~/.ssh/`, `~/.gnupg/`, `~/.aws/`, `~/.kube/`. |
85
- | `stateDir` | `~/.cache/bizar` | Refused if inside a secret directory (same list as `logDir`). |
86
- | `logRotationBytes` | `10485760` (10 MB) | `Math.max(1024, Math.floor(value))`. |
87
- | `backgroundStallTimeoutMs` | `180000` (3 min) | v0.3.0 — stall timeout in ms. Clamped to `[10000, 600000]`. |
88
- | `backgroundThinkingLoopTimeoutMs` | `300000` (5 min) | v0.3.0 — thinking-loop timeout in ms. Clamped to `[30000, 900000]`. |
89
- | `backgroundMaxInterventions` | `1` | v0.3.0 — max research interventions before forced abort. Clamped to `[1, 3]`. |
90
-
91
- ## Environment variables
92
-
93
- | Env var | Effect |
94
- |---|---|
95
- | `BIZAR_DISABLE=1` | Disables the plugin entirely. The plugin returns empty hooks and logs once at debug level. |
96
- | `BIZAR_DISABLE_LOOP=1` | Loop guard disabled (no fingerprint, no threshold check, no throw). Status reporting still active. |
97
- | `BIZAR_DISABLE_LOG=1` | Status reporting disabled. Loop guard still active. |
98
- | `BIZAR_LOG_LEVEL=debug\|info\|warn\|error` | Sets log verbosity. Default `info`. Invalid values fall back to `info` with a warning. |
99
- | `BIZAR_STALL_TIMEOUT_MS` | v0.3.0 — overrides `backgroundStallTimeoutMs`. |
100
- | `BIZAR_THINKING_LOOP_TIMEOUT_MS` | v0.3.0 — overrides `backgroundThinkingLoopTimeoutMs`. |
101
- | `BIZAR_MAX_INTERVENTIONS` | v0.3.0 — overrides `backgroundMaxInterventions`. |
102
-
103
- Env vars are read once at plugin init. Mid-session changes are ignored.
104
-
105
- ## How loop detection works
106
-
107
- The plugin fingerprints every `tool.execute.before` call as a stable hash of
108
- the tool name and the normalized arguments. It keeps a rolling window of the
109
- last 10 (default) tool calls per session. When the count of matching
110
- fingerprints in the window crosses a threshold, the plugin acts:
111
-
112
- | Repetitions | Action | Mechanism |
113
- |---|---|---|
114
- | 3 (default) | Log a warning via `client.app.log`. **No injection.** | Diagnostic only. |
115
- | 5 (default) | Inject a system message via `experimental.chat.system.transform`. | Subagent sees it on its next turn. |
116
- | 8 (default) | Inject a stronger system message via `experimental.chat.system.transform`. | Subagent sees it on its next turn. |
117
- | 12 (default) | **Block.** Throw from `tool.execute.before`. | Surfaces in the TUI as a tool error. |
118
-
119
- The plugin's hard-block at threshold 12 runs BEFORE cline's soft
120
- `doom_loop` recovery. The plugin wins. See `.bizar/plugin-architecture-v0.3.md`
121
- §3.3 for the interaction with the `doom_loop` permission.
122
-
123
- ## What the plugin does NOT do
124
-
125
- - It does **not** modify user files.
126
- - It does **not** call external APIs (no LLM calls, no telemetry).
127
- - It does **not** override agent prompts (only injects ephemeral system
128
- messages into the current turn's context).
129
- - It does **not** manage subagent lifecycle (cline does that).
130
- - It does **not** read environment variables other than the four listed above.
131
- - It does **not** write outside `~/.cache/bizar/` by default.
132
- - It does **not** register slash commands in v0.1.
133
-
134
- ## Background Agents
135
-
136
- v0.4 adds **background agents** — asynchronous subagent execution via a single long-running `cline serve` instance. Background agents enable Odin to parallelize independent work without blocking the main conversation.
137
-
138
- ### Architecture
139
-
140
- The plugin starts one `cline serve` process on init (single-serve, multi-session). All background sessions share this process. Each background instance is tracked in `BackgroundState` at `~/.cache/bizar/bg/<instanceId>.json`.
141
-
142
- ### The 4 tools
143
-
144
- | Tool | Who can call | What it does |
145
- |---|---|---|
146
- | `bizar_spawn_background` | Odin only | Spawns a background agent; returns `{ instanceId, sessionId, status: "pending" }` |
147
- | `bizar_status` | Any agent | Lists all instances or a single one; read-only |
148
- | `bizar_collect` | Odin only | Blocks until instance completes or times out; returns `{ instanceId, status, result, toolCallCount, durationMs }` |
149
- | `bizar_kill` | Odin only | Sends `POST /session/{id}/abort`; marks instance `killed` |
150
-
151
- #### Spawning a background agent
152
-
153
- ```typescript
154
- // From within Odin's task decomposition:
155
- const result = await bizarre_spawn_background({
156
- agent: "mimir", // which agent to run
157
- prompt: "Research X and return findings", // what to do
158
- model: "minimax/minimax-m3", // optional: override model
159
- timeoutMs: 300_000, // optional: default 5 min, max 30 min
160
- }, ctx);
161
- console.log(result.instanceId); // "bgr_01ARSH3J5V..."
162
- ```
163
-
164
- #### Checking status
165
-
166
- ```typescript
167
- // All instances
168
- const all = await bizarre_status({}, ctx);
169
-
170
- // One instance
171
- const one = await bizarre_status({ instanceId: "bgr_01ARSH..." }, ctx);
172
- ```
173
-
174
- #### Collecting results
175
-
176
- ```typescript
177
- // Block until done/failed/killed/timeout
178
- const r = await bizarre_collect({
179
- instanceId: "bgr_01ARSH...",
180
- timeoutMs: 120_000, // optional override
181
- }, ctx);
182
- console.log(r.result); // concatenated assistant text
183
- console.log(r.status); // "done" | "failed" | "killed" | "timed_out"
184
- ```
185
-
186
- #### Killing an instance
187
-
188
- ```typescript
189
- await bizarre_kill({ instanceId: "bgr_01ARSH..." }, ctx);
190
- ```
191
-
192
- ### Security Model
193
-
194
- - **Localhost only** — `cline serve` binds to `127.0.0.1`, never exposed externally.
195
- - **Random shared secret** — a 32-byte secret is generated at plugin init and passed as `CLINE_SERVER_PASSWORD` to the serve child. Every HTTP call from the plugin authenticates with `Authorization: Basic base64("cline:<secret>")`.
196
- - **Password is in-memory only** — not written to disk. On process exit, the serve child is killed and the secret becomes invalid.
197
- - **`--dangerously-skip-permissions` opt-in** — by default the serve child respects the user's agent permission config. Set `BIZAR_BACKGROUND_SKIP_PERMISSIONS=1` to skip (not recommended).
198
- - **Odin-only spawn** — only Odin can spawn background agents. Other agents (Vör, Frigg, Mimir, etc.) can call `bizar_status` (read-only).
199
-
200
- ## Stall and thinking loop protection
201
-
202
- Background agents can hang in two ways:
203
-
204
- 1. **Stall** — the LLM provider drops the connection or the model stops emitting tokens. No SSE events arrive. The session is "alive" but not making progress.
205
- 2. **Thinking loop** — the model is in its internal reasoning phase, emitting `thinking` parts, but never calling tools or producing output. Events are flowing, just not useful ones.
206
-
207
- v0.3.0 adds automatic protection against both:
208
-
209
- | Guard | Default | Triggers when | Action |
210
- |---|---|---|---|
211
- | `backgroundStallTimeoutMs` | 180000 (3 min) | No SSE event arrives for N seconds | Abort session, mark `failed` with "No activity for N ms — LLM appears stalled" |
212
- | `backgroundThinkingLoopTimeoutMs` | 300000 (5 min) | No tool/text part arrives for N minutes (only `thinking` parts) | Send research intervention prompt (1 by default), then abort if still stuck |
213
-
214
- The intervention prompt instructs the LLM to:
215
- - Spawn a Mimir agent for research
216
- - Or use read/grep/glob for codebase info
217
- - Or use bash for observable commands
218
-
219
- This nudges the agent out of pure thinking and toward concrete progress. The intervention counter is reset to 0 the moment the agent makes progress (any `tool` or `text` part after an intervention), so a single intervention followed by activity does not count against the next thinking loop.
220
-
221
- ### Limitations
222
-
223
- 1. **Threshold-5/8 in background are not visible to Odin.** They happen in the background session's LLM context. Odin only sees the threshold-12 marker in the result. Developers can see threshold-5/8 in the plugin log.
224
- 2. **Loop-guard markers are added at collect time, not stored.** `resultPreview` does not contain the marker; `bizar_collect` prepends it.
225
- 3. **File-level races between concurrent background agents are the user's problem.** The plugin does not coordinate file access between instances.
226
- 4. **Loop-guard detection requires SSE events.** If the SSE stream is dropped, the plugin may miss the threshold-12 throw until reconnect.
227
- 5. **No nested spawns in v0.4.** `parentInstanceId` is reserved but no tool exposes background-to-background spawning.
228
- 6. **Serve child is per-process.** Multiple worktrees in the same plugin process share one SSE subscription — not supported for multi-worktree setups.
229
- 7. **Password is in-memory only.** Restarting the plugin generates a new password; old `BackgroundState` files point to sessions in the old serve child.
230
- 8. **`bizar_collect` on a killed/failed instance returns the partial result.** It does not retry.
231
- 9. **The `model` parameter is not validated.** cline will reject unknown providers/models with a 4xx.
232
- 10. **Custom agents without loop-guard instructions will not see the marker as a task cue.**
233
- 11. **v0.3.0 — Stall and thinking-loop detection has a 15-second polling latency.** The periodic checker runs every 15 seconds, so the actual detection happens within `timeout + 15s`. Adjust the timeouts downward if you need tighter SLAs.
234
- 12. **v0.3.0 — A stalled-but-already-closing serve child may briefly show `failed` with the stall message.** The abort call is best-effort; if the serve child has just died, the stall message is the user-visible reason. The underlying cause is captured in the plugin log.
235
-
236
- ## Slash commands and visual plan flow
237
-
238
- v0.4.0 introduces a "visual plan that waits for feedback" feature. The
239
- plugin supports slash commands in any user message and ships two new
240
- tools for the agent to drive the visual plan canvas.
241
-
242
- ### Slash commands
243
-
244
- The `chat.message` hook detects slash commands before state seeding.
245
- A recognized command runs to completion; the response text is surfaced
246
- to the user (the host renders it as a tool error, the same pattern
247
- `tool.execute.before` uses for loop blocks).
248
-
249
- | Command | Effect |
250
- |---|---|
251
- | `/visual-plan on` / `/off` | Toggle visual plan mode. Persists to settings. |
252
- | `/visual-plan` | Show current state (mode, default template, last slug). |
253
- | `/plan new <slug> [template]` | Create a new plan. Optional template: `blank`, `feature-design`, `bug-investigation`, `decision-record`. |
254
- | `/plan list` | List all plans in the worktree's `plans/` directory. |
255
- | `/plan open <slug>` | Return the URL for a plan. (Server startup is deferred to v0.5.0 — the URL is informational.) |
256
- | `/help` or `/commands` | List available commands. |
257
-
258
- Unknown commands return an error response (not a crash). Non-slash
259
- messages pass through to the LLM unchanged.
260
-
261
- ### The visual plan flow
262
-
263
- When visual plan mode is enabled, the agent's first action on a complex
264
- task is to create a plan canvas (using `bizar_plan_action`), present
265
- it to the user (via `bizar_wait_for_feedback`), and **wait for approval
266
- or feedback** before continuing.
267
-
268
- The agent uses two new tools to interact with the plan:
269
-
270
- - `bizar_plan_action` — CRUD on the canvas (add elements, comments,
271
- connections, set plan status). Pure file I/O — does not require the
272
- `cline serve` child, so it works in any environment.
273
- - `bizar_wait_for_feedback` — polls every 2 seconds until a new comment
274
- appears, status becomes `approved` / `rejected`, or the timeout fires.
275
- Default timeout 10 minutes; range `[5 s, 30 min]`.
276
-
277
- ### Settings persistence
278
-
279
- Plan settings are persisted at
280
- `~/.cache/bizar/plan-settings.json`:
281
-
282
- ```json
283
- {
284
- "visualPlanEnabled": true,
285
- "defaultTemplate": "blank",
286
- "lastUsedSlug": "my-feature"
287
- }
288
- ```
289
-
290
- The `SettingsStore` writes atomically (via `writeFileSync(tmp) + renameSync`)
291
- and falls back to defaults on missing or corrupt files. All methods
292
- are async and never throw on bad input.
293
-
294
- ### Odin usage example
295
-
296
- ```typescript
297
- // Odin decomposes a task and spots two independent research branches
298
- const [resultA, resultB] = await Promise.all([
299
- // Branch 1: Mimir researches feature X
300
- bizarre_spawn_background({ agent: "mimir", prompt: "Research X", timeoutMs: 300_000 }, odinCtx),
301
- // Branch 2: Thor implements feature Y (sync, doesn't block)
302
- // ... use task tool for sync work ...
303
- ]);
304
-
305
- // Continue the main conversation while background work runs
306
- appendMessage("Background agents launched for independent branches.");
307
-
308
- // Later, collect results when needed
309
- const findings = await bizar_collect({ instanceId: resultA.instanceId, timeoutMs: 120_000 }, odinCtx);
310
- console.log(findings.result);
311
- ```
312
-
313
- ## Network and forbidden imports
314
-
315
- The plugin does not import `node:dns`, `node:net`, `node:http`, or
316
- `node:https`. The plugin makes zero outbound calls.
317
-
318
- This is enforced by `scripts/check-forbidden-imports.sh`, which is run as
319
- part of the `test` script (it fails the build if any match is found):
320
-
321
- ```bash
322
- if grep -rE 'from "node:(dns|net|http|https)"' src/; then
323
- echo "FAIL: src/ contains a forbidden node: import (dns|net|http|https)"
324
- exit 1
325
- fi
326
- ```
327
-
328
- Other `node:` modules (`fs`, `path`, `os`, `util`, etc.) are allowed because
329
- they are not network-bearing.
330
-
331
- ## What gets logged
332
-
333
- The per-call log line at `~/.cache/bizar/logs/<sessionId>.log` is
334
- metadata only:
335
-
336
- ```
337
- 2026-06-17T14:30:01.123Z session=<sid> tool=read fingerprint=ab12cd outcome=ok duration=45ms
338
- ```
339
-
340
- It contains the ISO timestamp, session ID, tool name, fingerprint hash,
341
- outcome, and duration. It does **not** contain raw tool args, session
342
- content, environment values, or LLM output. This is the §7.6 invariant and
343
- is verified by the integration test.
344
-
345
- ## Limitations
346
-
347
- The following are known limitations of v0.1. They are part of the release
348
- contract; custom integrations must work around them, not against them.
349
-
350
- 1. **Syntactically different but semantically identical args are not caught.**
351
- Example: `ls -la` and `ls -la .` produce different fingerprints. The
352
- plugin only catches identical-args loops.
353
-
354
- 2. **Cross-tool loops are not caught.** Example: `read foo` → `grep foo` →
355
- `read foo` → `grep foo` is not detected as a loop. The fingerprint
356
- includes the tool name, so different tools produce different fingerprints.
357
-
358
- 3. **Arg-mutating loops are not caught.** Example: `read foo1`, `read foo2`,
359
- `read foo3` produces 3 distinct fingerprints even if the agent's
360
- *intent* is to loop. The fingerprint is on the actual call, not on
361
- inferred intent.
362
-
363
- 4. **Custom agents without loop-guard instructions will loop indefinitely
364
- past threshold 12.** The plugin throws at threshold 12, but if the
365
- subagent has no `## Loop Guard Handling` section in its prompt, it may
366
- simply retry the same call indefinitely — each retry blocked, but the
367
- agent does not progress. All BizarHarness subagents (Thor, Tyr, Mimir,
368
- Heimdall, Hermod, Baldr, Vör, Frigg, Forseti, Quick, Vidarr) include the
369
- canonical section. **Users who add custom agents without this section
370
- will experience infinite-block loops.** This warning is mandatory.
371
-
372
- 5. **Corrupt state files are not auto-recovered.** A corrupt JSON state
373
- file is logged and ignored; the session starts with empty state. The
374
- corrupt file is preserved on disk for forensic inspection, not deleted.
375
-
376
- 6. **Out-of-worktree paths are hashed, not stored.** A loop involving files
377
- outside the worktree will produce stable fingerprints across runs (good)
378
- but the original path is not recoverable from the log (acceptable since
379
- args are not logged at all).
380
-
381
- 7. **Stale session cleanup is best-effort.** If `client.session.list()`
382
- fails, the age-based cleanup still runs but the "session no longer in
383
- cline" branch is skipped.
384
-
385
- 8. **Single-host state.** State files are local to `~/.cache/bizar/`.
386
- A user with multiple machines will have separate state on each.
387
- Cross-host loop detection is out of scope.
388
-
389
- 9. **Env var changes mid-session are ignored.** Env vars (`BIZAR_DISABLE`,
390
- `BIZAR_LOG_LEVEL`, etc.) are read once at plugin init.
391
-
392
- 10. **Log rotation is best-effort.** If a `renameSync` fails, that step is
393
- skipped and a warning logged. The log may grow past `logRotationBytes`
394
- in degenerate cases.
395
-
396
- 11. **Canonical handoff messages hardcode the default threshold numbers.**
397
- The warn, escalate, and block message templates contain the literal
398
- text `"5 identical calls"`, `"8 identical calls"`, and
399
- `"12 identical calls"`. If a user reconfigures the thresholds
400
- (`loopThresholdWarn`, `loopThresholdEscalate`, `loopThresholdBlock`),
401
- the action still fires at the configured counts, but the message text
402
- still says the default numbers. The agent prompts' recognition
403
- patterns in §11.2 of the spec match the default text, so non-default
404
- thresholds may cause subagents to fail to recognize the handoff.
405
- Leave the thresholds at their defaults unless you also update the
406
- agent prompts.
407
-
408
- ## For plugin developers
409
-
410
- ```
411
- plugins/bizar/
412
- ├── package.json (ESM; deps: zod for option validation)
413
- ├── tsconfig.json (ES2022, strict, declaration files)
414
- ├── index.ts (Plugin entry; hook wiring; init try/catch)
415
- ├── src/
416
- │ ├── loop.ts (decide() — threshold table, decision tree)
417
- │ ├── handoff.ts (3 static message templates; only tool name interpolated)
418
- │ ├── logger.ts (thin wrapper over client.app.log; BIZAR_LOG_LEVEL)
419
- │ ├── options.ts (clamping, validation, secret-dir refusal, env vars)
420
- │ ├── fingerprint.ts (stable hash of (tool, args))
421
- │ ├── state.ts (per-session state, per-session mutex)
422
- │ └── report.ts (per-session log writer)
423
- ├── scripts/
424
- │ └── check-forbidden-imports.sh (CI: forbids node:dns/net/http/https imports)
425
- └── tests/
426
- ├── loop.test.ts (decision tree, window rolling, edge cases)
427
- ├── block.test.ts (threshold-12 throw)
428
- ├── fingerprint.test.ts
429
- ├── state.test.ts
430
- ├── event.test.ts
431
- ├── options.test.ts
432
- └── integration.test.ts (Docker-based; runs against a real cline install)
433
- ```
434
-
435
- To run the unit tests:
436
-
437
- ```bash
438
- cd plugins/bizar
439
- npm install # if not already installed
440
- npm test # runs the CI import check + bun test
441
- ```
442
-
443
- To typecheck only:
444
-
445
- ```bash
446
- cd plugins/bizar
447
- npm run typecheck
448
- ```