@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,264 +0,0 @@
1
- /**
2
- * compaction.test.ts
3
- *
4
- * Spec contract for the compaction gate (see src/compaction.mjs):
5
- * - `shouldCompact` returns false below 50%, true at and above 50%.
6
- * - `shouldCompact` is defensive: null usage, undefined usage.total, and
7
- * non-positive maxContext all return false (no false positives).
8
- * - `maybeCompactSession` returns `{ compacted: false, reason: "below_threshold" }`
9
- * when below the gate.
10
- * - `maybeCompactSession` returns `{ compacted: true, sessionId, threshold, … }`
11
- * when at/over the gate.
12
- * - The default threshold is 0.5.
13
- * - `setCompactionThreshold` rejects out-of-range values with a throw;
14
- * accepts in-range values silently.
15
- * - State leaks between tests are not allowed — every test that mutates
16
- * the threshold calls `resetCompactionDefaults()` in its teardown
17
- * (bun:test does not have a global afterEach, so we use try/finally).
18
- *
19
- * Tests use `bun:test` to match the rest of the plugin suite (see
20
- * `tests/loop.test.ts`, `tests/options.test.ts`, etc.).
21
- */
22
-
23
- import {
24
- describe,
25
- test,
26
- expect,
27
- beforeEach,
28
- afterEach,
29
- } from "bun:test";
30
-
31
- import {
32
- shouldCompact,
33
- maybeCompactSession,
34
- getCompactionThreshold,
35
- setCompactionThreshold,
36
- resetCompactionDefaults,
37
- } from "../src/compaction.mjs";
38
-
39
- /**
40
- * Bun:test does not expose a global `afterEach`/`beforeEach` reset hook
41
- * that runs across describe blocks, so we wire per-block setup/teardown
42
- * via the standard `beforeEach`/`afterEach` imports. We also reset on
43
- * entry to each test as a belt-and-braces guarantee that no leak from a
44
- * prior test (run in the same process by `bun test`) can poison state.
45
- */
46
- beforeEach(() => {
47
- resetCompactionDefaults();
48
- });
49
-
50
- afterEach(() => {
51
- resetCompactionDefaults();
52
- });
53
-
54
- describe("shouldCompact", () => {
55
- test("does not compact below 50%", () => {
56
- expect(shouldCompact({ total: 40000 }, 100000)).toBe(false);
57
- });
58
-
59
- test("does not compact at 49.99%", () => {
60
- expect(shouldCompact({ total: 49999 }, 100000)).toBe(false);
61
- });
62
-
63
- test("compacts at exactly 50%", () => {
64
- expect(shouldCompact({ total: 50000 }, 100000)).toBe(true);
65
- });
66
-
67
- test("compacts above 50%", () => {
68
- expect(shouldCompact({ total: 80000 }, 100000)).toBe(true);
69
- });
70
-
71
- test("compacts at 100% (full context)", () => {
72
- expect(shouldCompact({ total: 100000 }, 100000)).toBe(true);
73
- });
74
-
75
- test("does not compact with null usage", () => {
76
- expect(shouldCompact(null, 100000)).toBe(false);
77
- });
78
-
79
- test("does not compact with undefined usage", () => {
80
- expect(shouldCompact(undefined, 100000)).toBe(false);
81
- });
82
-
83
- test("does not compact when usage.total is missing", () => {
84
- expect(shouldCompact({}, 100000)).toBe(false);
85
- });
86
-
87
- test("does not compact with non-positive maxContext", () => {
88
- expect(shouldCompact({ total: 50000 }, 0)).toBe(false);
89
- expect(shouldCompact({ total: 50000 }, -1)).toBe(false);
90
- });
91
-
92
- test("respects a non-default threshold (0.7)", () => {
93
- setCompactionThreshold(0.7);
94
- expect(shouldCompact({ total: 60000 }, 100000)).toBe(false);
95
- expect(shouldCompact({ total: 70000 }, 100000)).toBe(true);
96
- expect(shouldCompact({ total: 80000 }, 100000)).toBe(true);
97
- });
98
- });
99
-
100
- describe("getCompactionThreshold / setCompactionThreshold", () => {
101
- test("default threshold is 0.5", () => {
102
- expect(getCompactionThreshold()).toBe(0.5);
103
- });
104
-
105
- test("setCompactionThreshold rejects 0 (below minimum)", () => {
106
- expect(() => setCompactionThreshold(0)).toThrow(/Invalid compaction threshold/);
107
- });
108
-
109
- test("setCompactionThreshold rejects 0.05 (below minimum 0.1)", () => {
110
- expect(() => setCompactionThreshold(0.05)).toThrow(/Invalid compaction threshold/);
111
- });
112
-
113
- test("setCompactionThreshold rejects 1.5 (above maximum)", () => {
114
- expect(() => setCompactionThreshold(1.5)).toThrow(/Invalid compaction threshold/);
115
- });
116
-
117
- test("setCompactionThreshold rejects NaN", () => {
118
- expect(() => setCompactionThreshold(Number.NaN)).toThrow(/Invalid compaction threshold/);
119
- });
120
-
121
- test("setCompactionThreshold rejects Infinity", () => {
122
- expect(() => setCompactionThreshold(Number.POSITIVE_INFINITY)).toThrow(
123
- /Invalid compaction threshold/,
124
- );
125
- });
126
-
127
- test("setCompactionThreshold rejects non-number values", () => {
128
- expect(() => setCompactionThreshold("0.5" as unknown as number)).toThrow(
129
- /Invalid compaction threshold/,
130
- );
131
- expect(() => setCompactionThreshold(null as unknown as number)).toThrow(
132
- /Invalid compaction threshold/,
133
- );
134
- });
135
-
136
- test("setCompactionThreshold accepts 0.1 (lower bound)", () => {
137
- expect(() => setCompactionThreshold(0.1)).not.toThrow();
138
- expect(getCompactionThreshold()).toBe(0.1);
139
- });
140
-
141
- test("setCompactionThreshold accepts 1.0 (upper bound)", () => {
142
- expect(() => setCompactionThreshold(1.0)).not.toThrow();
143
- expect(getCompactionThreshold()).toBe(1.0);
144
- });
145
-
146
- test("setCompactionThreshold accepts 0.7 (in-range)", () => {
147
- expect(() => setCompactionThreshold(0.7)).not.toThrow();
148
- expect(getCompactionThreshold()).toBe(0.7);
149
- });
150
- });
151
-
152
- describe("maybeCompactSession", () => {
153
- test("returns below_threshold when under limit", async () => {
154
- const r = await maybeCompactSession({
155
- sessionId: "s1",
156
- messageCount: 5,
157
- currentUsage: { total: 30000 },
158
- maxContext: 100000,
159
- summarizer: async (texts) => texts.join(" "),
160
- });
161
- expect(r.compacted).toBe(false);
162
- expect(r.reason).toBe("below_threshold");
163
- expect(r.ratio).toBeCloseTo(0.3);
164
- });
165
-
166
- test("triggers when over limit", async () => {
167
- const r = await maybeCompactSession({
168
- sessionId: "s1",
169
- messageCount: 100,
170
- currentUsage: { total: 60000 },
171
- maxContext: 100000,
172
- summarizer: async () => "summary",
173
- });
174
- expect(r.compacted).toBe(true);
175
- expect(r.sessionId).toBe("s1");
176
- expect(r.atMessages).toBe(100);
177
- expect(r.threshold).toBe(0.5);
178
- expect(r.preservedRecent).toBe(10);
179
- expect(r.ratio).toBeCloseTo(0.6);
180
- });
181
-
182
- test("triggers at exactly the threshold (50000/100000 = 0.5)", async () => {
183
- const r = await maybeCompactSession({
184
- sessionId: "edge",
185
- messageCount: 42,
186
- currentUsage: { total: 50000 },
187
- maxContext: 100000,
188
- summarizer: async () => "",
189
- });
190
- expect(r.compacted).toBe(true);
191
- expect(r.atMessages).toBe(42);
192
- });
193
-
194
- test("respects a custom preserveRecent override", async () => {
195
- const r = await maybeCompactSession({
196
- sessionId: "s2",
197
- messageCount: 200,
198
- currentUsage: { total: 90000 },
199
- maxContext: 100000,
200
- summarizer: async () => "",
201
- preserveRecent: 25,
202
- });
203
- expect(r.compacted).toBe(true);
204
- expect(r.preservedRecent).toBe(25);
205
- });
206
-
207
- test("respects a non-default threshold", async () => {
208
- setCompactionThreshold(0.8);
209
- const r1 = await maybeCompactSession({
210
- sessionId: "s3",
211
- messageCount: 50,
212
- currentUsage: { total: 70000 },
213
- maxContext: 100000,
214
- summarizer: async () => "",
215
- });
216
- expect(r1.compacted).toBe(false);
217
-
218
- const r2 = await maybeCompactSession({
219
- sessionId: "s3",
220
- messageCount: 50,
221
- currentUsage: { total: 85000 },
222
- maxContext: 100000,
223
- summarizer: async () => "",
224
- });
225
- expect(r2.compacted).toBe(true);
226
- expect(r2.threshold).toBe(0.8);
227
- });
228
-
229
- test("does not invoke the summarizer when below threshold", async () => {
230
- let called = false;
231
- await maybeCompactSession({
232
- sessionId: "s4",
233
- messageCount: 10,
234
- currentUsage: { total: 1000 },
235
- maxContext: 100000,
236
- summarizer: async () => {
237
- called = true;
238
- return "should-not-run";
239
- },
240
- });
241
- expect(called).toBe(false);
242
- });
243
-
244
- test("throws when sessionId is missing", async () => {
245
- await expect(
246
- maybeCompactSession({
247
- sessionId: "",
248
- messageCount: 1,
249
- currentUsage: { total: 999999 },
250
- maxContext: 100000,
251
- summarizer: async () => "",
252
- }),
253
- ).rejects.toThrow(/sessionId is required/);
254
- });
255
- });
256
-
257
- describe("resetCompactionDefaults", () => {
258
- test("restores the threshold to 0.5 after a custom set", () => {
259
- setCompactionThreshold(0.9);
260
- expect(getCompactionThreshold()).toBe(0.9);
261
- resetCompactionDefaults();
262
- expect(getCompactionThreshold()).toBe(0.5);
263
- });
264
- });
@@ -1,128 +0,0 @@
1
- /**
2
- * config.test.ts — Config drift detection tests (R4 audit).
3
- *
4
- * Verifies:
5
- * 1. Every `bizar_*` tool registered in `plugins/bizar/index.ts`
6
- * is also present in `config/cline.json` `tools: { ... }`.
7
- * 2. No `bizarre_*` (double-r) typos remain in `plugins/bizar/src/`.
8
- * 3. `plugins/bizar/package.json` version matches the current beta.
9
- */
10
-
11
- import { describe, test, expect } from "bun:test";
12
- import { readFileSync, readdirSync, statSync, existsSync } from "node:fs";
13
- import { join } from "node:path";
14
-
15
- const BIZAR_PLUGIN_ROOT = join(__dirname, "..");
16
- const PLUGIN_INDEX = join(BIZAR_PLUGIN_ROOT, "index.ts");
17
- const CONFIG_CLINE = join(__dirname, "..", "..", "..", "config", "cline.json");
18
- const PKG_JSON = join(BIZAR_PLUGIN_ROOT, "package.json");
19
- const SRC_DIR = join(BIZAR_PLUGIN_ROOT, "src");
20
-
21
- // ---------------------------------------------------------------------------
22
- // Helpers
23
- // ---------------------------------------------------------------------------
24
-
25
- /**
26
- * Extract `bizar_*` tool registration keys from index.ts.
27
- * Matches: `bizar_spawn_background: createBgSpawnTool(...)` etc.
28
- */
29
- function extractPluginToolKeys(indexContent: string): string[] {
30
- const keys: string[] = [];
31
- // Matches `bizar_xxx: createXxxTool(` or `bizar_xxx: createBgXxxTool(`
32
- const toolKeyRegex = /\bbizar_([a-z_]+)\s*:\s*(?:create(?:Bg)?[A-Z]\w*Tool|createWaitForFeedbackTool)\s*\(/g;
33
- let m: RegExpExecArray | null;
34
- while ((m = toolKeyRegex.exec(indexContent)) !== null) {
35
- keys.push(`bizar_${m[1]}`);
36
- }
37
- return [...new Set(keys)].sort();
38
- }
39
-
40
- /**
41
- * Extract `tools: { ... }` keys from config/cline.json.
42
- */
43
- function extractConfigToolKeys(configContent: string): string[] {
44
- const parsed = JSON.parse(configContent) as { tools?: Record<string, unknown> };
45
- if (!parsed.tools) return [];
46
- return Object.keys(parsed.tools).sort();
47
- }
48
-
49
- // ---------------------------------------------------------------------------
50
- // Test cases
51
- // ---------------------------------------------------------------------------
52
-
53
- describe("config drift detection", () => {
54
- test("plugin_tool_keys ⊆ config_tools_keys (R4 audit)", () => {
55
- if (!existsSync(CONFIG_CLINE)) {
56
- // Skip when config/cline.json has not been generated yet.
57
- // `bizar install` produces it from `config/cline.json.template`.
58
- return;
59
- }
60
- const indexContent = readFileSync(PLUGIN_INDEX, "utf-8");
61
- const configContent = readFileSync(CONFIG_CLINE, "utf-8");
62
-
63
- const pluginKeys = extractPluginToolKeys(indexContent);
64
- const configKeys = extractConfigToolKeys(configContent);
65
-
66
- const missingInConfig = pluginKeys.filter((k) => !configKeys.includes(k));
67
- expect(missingInConfig, `Plugin tools missing in config: ${JSON.stringify(missingInConfig)}`).toEqual([]);
68
- });
69
-
70
- test("no 'bizarre_*' (double-r) typos remain in plugins/bizar/src/", () => {
71
- // Walk src/ directory recursively and grep for 'bizarre_'
72
- const allSrcFiles = getAllTsFiles(SRC_DIR);
73
- const violations: Array<{ file: string; match: string }> = [];
74
-
75
- const doubleRRegex = /\bbizarre_[a-z_]+\b/g;
76
-
77
- for (const file of allSrcFiles) {
78
- const content = readFileSync(file, "utf-8");
79
- let m: RegExpExecArray | null;
80
- while ((m = doubleRRegex.exec(content)) !== null) {
81
- violations.push({ file: relativeToSrc(file), match: m[0] });
82
- }
83
- }
84
-
85
- expect(
86
- violations,
87
- `Found 'bizarre_*' typos: ${JSON.stringify(violations)}`,
88
- ).toEqual([]);
89
- });
90
-
91
- test("plugins/bizar/package.json version is current beta", () => {
92
- const pkg = JSON.parse(readFileSync(PKG_JSON, "utf-8")) as { version?: string };
93
- // v6.0.0 sprint bumped to 5.6.0-beta series; assert the prefix.
94
- expect(pkg.version).toMatch(/^\d+\.\d+\.\d+(-beta\.\d+)?$/);
95
- });
96
- });
97
-
98
- // ---------------------------------------------------------------------------
99
- // Helper: recursively collect all .ts files under a directory
100
- // ---------------------------------------------------------------------------
101
-
102
- function getAllTsFiles(dir: string): string[] {
103
- const results: string[] = [];
104
- let entries: string[];
105
- try {
106
- entries = readdirSync(dir);
107
- } catch {
108
- return results;
109
- }
110
- for (const name of entries) {
111
- const full = join(dir, name);
112
- try {
113
- const stat = statSync(full);
114
- if (stat.isDirectory()) {
115
- results.push(...getAllTsFiles(full));
116
- } else if (name.endsWith(".ts") || name.endsWith(".tsx")) {
117
- results.push(full);
118
- }
119
- } catch {
120
- // skip inaccessible entries
121
- }
122
- }
123
- return results;
124
- }
125
-
126
- function relativeToSrc(file: string): string {
127
- return file.replace(SRC_DIR + "/", "");
128
- }
@@ -1,159 +0,0 @@
1
- /**
2
- * dashboard-client.test.ts
3
- *
4
- * v0.7.0-alpha.1 — Tests for the SDK-backed dashboard publisher.
5
- *
6
- * Verifies:
7
- * - publish() succeeds when the dashboard is reachable (uses a stub
8
- * fetch via `createBizarClient`'s `fetch` injection — but our
9
- * publisher doesn't currently expose fetch injection, so we test
10
- * via the real `publishV2Event` round-trip from the smoke test
11
- * pattern instead).
12
- * - publish() drops events when the publisher is not started.
13
- * - Graceful degradation: env var override is respected.
14
- *
15
- * Network tests (publish to a real dashboard) live in
16
- * `tests/integration/dashboard-bridge.test.ts` and require a running
17
- * dashboard server.
18
- */
19
-
20
- import { describe, it, expect } from "bun:test";
21
- import { createDashboardPublisher, type Logger } from "../src/dashboard-client.js";
22
-
23
- // ---------------------------------------------------------------------------
24
- // Test logger
25
- // ---------------------------------------------------------------------------
26
-
27
- const makeLogger = (): Logger & { lines: string[] } => {
28
- const lines: string[] = [];
29
- return {
30
- lines,
31
- debug(m) { lines.push(`debug: ${m}`); },
32
- info(m) { lines.push(`info: ${m}`); },
33
- warn(m) { lines.push(`warn: ${m}`); },
34
- error(m) { lines.push(`error: ${m}`); },
35
- };
36
- };
37
-
38
- // ---------------------------------------------------------------------------
39
- // Tests
40
- // ---------------------------------------------------------------------------
41
-
42
- describe("createDashboardPublisher", () => {
43
- it("publish() drops events when not started", async () => {
44
- const logger = makeLogger();
45
- const pub = createDashboardPublisher({ logger });
46
- // Do NOT call start()
47
- expect(pub.isReady()).toBe(false);
48
-
49
- await pub.publish({
50
- type: "session.created",
51
- properties: { sessionId: "ses_1", agent: "mimir" },
52
- });
53
-
54
- // Logger should have recorded a debug drop message.
55
- expect(logger.lines.some((l) => l.includes("not ready"))).toBe(true);
56
- });
57
-
58
- it("start() is a no-op when disabled by config", async () => {
59
- const logger = makeLogger();
60
- const pub = createDashboardPublisher({ logger, disabled: true });
61
- await pub.start();
62
- expect(pub.isReady()).toBe(false);
63
- expect(logger.lines.some((l) => l.includes("disabled"))).toBe(true);
64
- });
65
-
66
- it("start() is a no-op when no password is available", async () => {
67
- const logger = makeLogger();
68
- // Make sure no env vars or auth files are present in this test.
69
- const prevUrl = process.env.BIZAR_DASHBOARD_URL;
70
- const prevPort = process.env.BIZAR_DASHBOARD_PORT;
71
- const prevPw = process.env.BIZAR_DASHBOARD_PASSWORD;
72
- const prevAuthFile = process.env.BIZAR_DASHBOARD_AUTH_FILE;
73
- const prevAuthFiles = process.env.BIZAR_DASHBOARD_AUTH_FILES;
74
- delete process.env.BIZAR_DASHBOARD_URL;
75
- delete process.env.BIZAR_DASHBOARD_PORT;
76
- delete process.env.BIZAR_DASHBOARD_PASSWORD;
77
- // Point auth-file discovery at a non-existent path.
78
- process.env.BIZAR_DASHBOARD_AUTH_FILE = "/tmp/__no_such_auth_file__.json";
79
-
80
- try {
81
- const pub = createDashboardPublisher({ logger });
82
- await pub.start();
83
- expect(pub.isReady()).toBe(false);
84
- expect(logger.lines.some((l) => l.includes("not started"))).toBe(true);
85
- } finally {
86
- if (prevUrl !== undefined) process.env.BIZAR_DASHBOARD_URL = prevUrl;
87
- if (prevPort !== undefined) process.env.BIZAR_DASHBOARD_PORT = prevPort;
88
- if (prevPw !== undefined) process.env.BIZAR_DASHBOARD_PASSWORD = prevPw;
89
- if (prevAuthFile !== undefined) {
90
- process.env.BIZAR_DASHBOARD_AUTH_FILE = prevAuthFile;
91
- } else {
92
- delete process.env.BIZAR_DASHBOARD_AUTH_FILE;
93
- }
94
- if (prevAuthFiles !== undefined) {
95
- process.env.BIZAR_DASHBOARD_AUTH_FILES = prevAuthFiles;
96
- } else {
97
- delete process.env.BIZAR_DASHBOARD_AUTH_FILES;
98
- }
99
- }
100
- });
101
-
102
- it("start() succeeds when password is provided via env", async () => {
103
- const logger = makeLogger();
104
- process.env.BIZAR_DASHBOARD_PASSWORD = "test-password-1234567890abcdef";
105
-
106
- try {
107
- const pub = createDashboardPublisher({
108
- logger,
109
- baseUrl: "http://127.0.0.1:1", // port 1 = unreachable, but SDK client constructs fine
110
- });
111
- await pub.start();
112
- expect(pub.isReady()).toBe(true);
113
- expect(logger.lines.some((l) => l.includes("publisher started"))).toBe(true);
114
- pub.stop();
115
- } finally {
116
- delete process.env.BIZAR_DASHBOARD_PASSWORD;
117
- }
118
- });
119
-
120
- it("start() respects BIZAR_DASHBOARD_URL env var", async () => {
121
- const logger = makeLogger();
122
- process.env.BIZAR_DASHBOARD_URL = "http://127.0.0.1:4099";
123
- process.env.BIZAR_DASHBOARD_PASSWORD = "test-password-1234567890abcdef";
124
-
125
- try {
126
- const pub = createDashboardPublisher({ logger });
127
- await pub.start();
128
- expect(pub.isReady()).toBe(true);
129
- expect(
130
- logger.lines.some((l) => l.includes("url=http://127.0.0.1:4099")),
131
- ).toBe(true);
132
- pub.stop();
133
- } finally {
134
- delete process.env.BIZAR_DASHBOARD_URL;
135
- delete process.env.BIZAR_DASHBOARD_PASSWORD;
136
- }
137
- });
138
-
139
- it("stop() clears ready state and drops queue", async () => {
140
- const logger = makeLogger();
141
- process.env.BIZAR_DASHBOARD_PASSWORD = "test-password-1234567890abcdef";
142
-
143
- try {
144
- const pub = createDashboardPublisher({ logger });
145
- await pub.start();
146
- expect(pub.isReady()).toBe(true);
147
- pub.stop();
148
- expect(pub.isReady()).toBe(false);
149
- // Subsequent publish should be a no-op (drops because not ready).
150
- await pub.publish({
151
- type: "session.created",
152
- properties: { sessionId: "ses_x", agent: "thor" },
153
- });
154
- // Just verifies it doesn't throw.
155
- } finally {
156
- delete process.env.BIZAR_DASHBOARD_PASSWORD;
157
- }
158
- });
159
- });