@polderlabs/bizar 6.2.4 → 6.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (332) hide show
  1. package/.claude/CLAUDE.md +15 -0
  2. package/.claude/agents/_shared/AGENT_BASELINE.md +168 -0
  3. package/.claude/agents/_shared/CLAUDE_TOOLS.md +412 -0
  4. package/.claude/agents/_shared/SKILLS.md +109 -0
  5. package/.claude/agents/agent-browser.md +80 -0
  6. package/.claude/agents/baldr.md +49 -0
  7. package/.claude/agents/forseti.md +51 -0
  8. package/.claude/agents/frigg.md +42 -0
  9. package/.claude/agents/heimdall.md +33 -0
  10. package/.claude/agents/hermod.md +53 -0
  11. package/.claude/agents/mimir.md +49 -0
  12. package/.claude/agents/odin.md +287 -0
  13. package/.claude/agents/quick.md +34 -0
  14. package/.claude/agents/semble-search.md +50 -0
  15. package/.claude/agents/thor.md +53 -0
  16. package/.claude/agents/tyr.md +56 -0
  17. package/.claude/agents/vidarr.md +54 -0
  18. package/.claude/agents/vor.md +53 -0
  19. package/.claude/commands/audit.md +25 -0
  20. package/.claude/commands/bizar.md +22 -0
  21. package/.claude/commands/explain.md +17 -0
  22. package/.claude/commands/init.md +29 -0
  23. package/.claude/commands/learn.md +44 -0
  24. package/.claude/commands/plan.md +35 -0
  25. package/.claude/commands/plow-through.md +50 -0
  26. package/.claude/commands/pr-review.md +49 -0
  27. package/.claude/commands/setup-provider.md +96 -0
  28. package/.claude/commands/tailscale-serve.md +100 -0
  29. package/.claude/commands/team.md +132 -0
  30. package/.claude/commands/test.md +62 -0
  31. package/.claude/commands/validate.md +68 -0
  32. package/.claude/commands/visual-plan.md +24 -0
  33. package/.claude/hooks/README.md +92 -0
  34. package/.claude/hooks/posttooluse-editwrite.mjs +91 -0
  35. package/.claude/hooks/pretooluse-bash.mjs +81 -0
  36. package/.claude/hooks/pretooluse-editwrite.mjs +139 -0
  37. package/.claude/hooks/sessionend-recall.mjs +74 -0
  38. package/.claude/hooks/sessionstart-prime.mjs +80 -0
  39. package/.claude/hooks/userpromptsubmit-tag.mjs +80 -0
  40. package/.claude/settings.json +116 -0
  41. package/.claude/skills/9router/SKILL.md +80 -0
  42. package/.claude/skills/9router-chat/SKILL.md +73 -0
  43. package/.claude/skills/9router-embeddings/SKILL.md +69 -0
  44. package/.claude/skills/9router-image/SKILL.md +86 -0
  45. package/.claude/skills/9router-stt/SKILL.md +79 -0
  46. package/.claude/skills/9router-tts/SKILL.md +80 -0
  47. package/.claude/skills/9router-web-fetch/SKILL.md +99 -0
  48. package/.claude/skills/9router-web-search/SKILL.md +91 -0
  49. package/.claude/skills/bizar/README.md +9 -0
  50. package/.claude/skills/bizar/SKILL.md +450 -0
  51. package/.claude/skills/cpp-coding-standards/README.md +28 -0
  52. package/.claude/skills/cpp-coding-standards/SKILL.md +634 -0
  53. package/.claude/skills/cpp-coding-standards/references/concurrency.md +320 -0
  54. package/.claude/skills/cpp-coding-standards/references/error-handling.md +229 -0
  55. package/.claude/skills/cpp-coding-standards/references/memory-safety.md +216 -0
  56. package/.claude/skills/cpp-coding-standards/references/modern-idioms.md +282 -0
  57. package/.claude/skills/cpp-coding-standards/references/review-checklist.md +96 -0
  58. package/.claude/skills/cpp-testing/README.md +28 -0
  59. package/.claude/skills/cpp-testing/SKILL.md +304 -0
  60. package/.claude/skills/cpp-testing/references/coverage.md +370 -0
  61. package/.claude/skills/cpp-testing/references/framework-compare.md +175 -0
  62. package/.claude/skills/cpp-testing/references/host-test-for-embedded.md +499 -0
  63. package/.claude/skills/cpp-testing/references/mocking.md +364 -0
  64. package/.claude/skills/cpp-testing/references/tdd-workflow.md +308 -0
  65. package/.claude/skills/cubesandbox/SKILL.md +148 -0
  66. package/.claude/skills/embedded-esp-idf/README.md +41 -0
  67. package/.claude/skills/embedded-esp-idf/SKILL.md +439 -0
  68. package/.claude/skills/embedded-esp-idf/references/freertos-patterns.md +214 -0
  69. package/.claude/skills/embedded-esp-idf/references/host-tests.md +164 -0
  70. package/.claude/skills/embedded-esp-idf/references/idf-py-commands.md +157 -0
  71. package/.claude/skills/embedded-esp-idf/references/kconfig.md +159 -0
  72. package/.claude/skills/embedded-esp-idf/references/logging-discipline.md +118 -0
  73. package/.claude/skills/embedded-esp-idf/references/memory-and-iram.md +137 -0
  74. package/.claude/skills/embedded-esp-idf/references/nvs.md +121 -0
  75. package/.claude/skills/embedded-esp-idf/references/packed-structs.md +192 -0
  76. package/.claude/skills/embedded-esp-idf/scripts/idf_env.sh +47 -0
  77. package/.claude/skills/embedded-esp-idf/scripts/size_check.sh +77 -0
  78. package/.claude/skills/glyph/SKILL.md +163 -0
  79. package/.claude/skills/harness-engineering/SKILL.md +143 -0
  80. package/.claude/skills/lightrag/SKILL.md +81 -0
  81. package/.claude/skills/memory-protocol/SKILL.md +105 -0
  82. package/.claude/skills/obsidian/SKILL.md +306 -0
  83. package/.claude/skills/read-the-damn-docs/SKILL.md +113 -0
  84. package/.claude/skills/self-improvement/SKILL.md +64 -0
  85. package/README.md +87 -59
  86. package/bizar-dash/dist/assets/{EnvVarsSection-DXM8gRm_.js → EnvVarsSection-B58aiJiE.js} +1 -1
  87. package/bizar-dash/dist/assets/{EnvVarsSection-DXM8gRm_.js.map → EnvVarsSection-B58aiJiE.js.map} +1 -1
  88. package/bizar-dash/dist/assets/{MobileChat-BnKN_Ks_.js → MobileChat-BJrqwVDd.js} +1 -1
  89. package/bizar-dash/dist/assets/{MobileChat-BnKN_Ks_.js.map → MobileChat-BJrqwVDd.js.map} +1 -1
  90. package/bizar-dash/dist/assets/{MobileSettings-DjCPxC-Q.js → MobileSettings-CEQNJNLJ.js} +1 -1
  91. package/bizar-dash/dist/assets/{MobileSettings-DjCPxC-Q.js.map → MobileSettings-CEQNJNLJ.js.map} +1 -1
  92. package/bizar-dash/dist/assets/{main-DYiZqMrn.js → main-IvfQAOfy.js} +1 -1
  93. package/bizar-dash/dist/assets/{main-DYiZqMrn.js.map → main-IvfQAOfy.js.map} +1 -1
  94. package/bizar-dash/dist/assets/{markdown-C6mXtQxD.js → markdown-tOLaD6nm.js} +1 -1
  95. package/bizar-dash/dist/assets/{markdown-C6mXtQxD.js.map → markdown-tOLaD6nm.js.map} +1 -1
  96. package/bizar-dash/dist/assets/{mobile-CMHqtLV2.js → mobile-DYCHcUpq.js} +1 -1
  97. package/bizar-dash/dist/assets/{mobile-CMHqtLV2.js.map → mobile-DYCHcUpq.js.map} +1 -1
  98. package/bizar-dash/dist/assets/{mobile-layout-3jIhHX_p.js → mobile-layout-CBHjpwsb.js} +2 -2
  99. package/bizar-dash/dist/assets/{mobile-layout-3jIhHX_p.js.map → mobile-layout-CBHjpwsb.js.map} +1 -1
  100. package/bizar-dash/dist/assets/{useSlashCommands-DtITw8Xv.js → useSlashCommands-Bd7_FA6U.js} +2 -2
  101. package/bizar-dash/dist/assets/{useSlashCommands-DtITw8Xv.js.map → useSlashCommands-Bd7_FA6U.js.map} +1 -1
  102. package/bizar-dash/dist/assets/{vendor-CeHGtduv.js → vendor-C843201K.js} +12 -12
  103. package/bizar-dash/dist/assets/vendor-C843201K.js.map +1 -0
  104. package/bizar-dash/dist/index.html +6 -6
  105. package/bizar-dash/dist/mobile.html +2 -2
  106. package/bizar-dash/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +1 -1
  107. package/bizar-dash/src/server/api.mjs +4 -4
  108. package/bizar-dash/src/server/background-store.mjs +15 -16
  109. package/bizar-dash/src/server/bg-poller.mjs +25 -35
  110. package/bizar-dash/src/server/bg-retry.mjs +66 -194
  111. package/bizar-dash/src/server/claude-bg-spawner.mjs +390 -0
  112. package/bizar-dash/src/server/claude-info.mjs +412 -0
  113. package/bizar-dash/src/server/{cline-runner.mjs → claude-runner.mjs} +53 -48
  114. package/bizar-dash/src/server/claude-sdk.mjs +191 -0
  115. package/bizar-dash/src/server/providers-store.mjs +22 -49
  116. package/bizar-dash/src/server/routes/background.mjs +24 -20
  117. package/bizar-dash/src/server/routes/chat.mjs +223 -326
  118. package/bizar-dash/src/server/routes/claude-session-detail.mjs +329 -0
  119. package/bizar-dash/src/server/routes/claude-sessions.mjs +259 -0
  120. package/bizar-dash/src/server/routes/tasks.mjs +20 -28
  121. package/bizar-dash/src/server/task-delegator.mjs +76 -77
  122. package/bizar-dash/src/web/components/chat/useChat.ts +23 -27
  123. package/bizar-dash/src/web/views/Chat.tsx +8 -8
  124. package/cli/bin.mjs +31 -18
  125. package/cli/commands/claude-cmd.mjs +348 -0
  126. package/cli/commands/install.mjs +12 -11
  127. package/cli/commands/sandbox.mjs +220 -0
  128. package/cli/commands/validate.mjs +252 -288
  129. package/cli/dev-link.test.mjs +11 -11
  130. package/cli/doctor.mjs +131 -213
  131. package/cli/install.mjs +33 -37
  132. package/cli/install.test.mjs +9 -9
  133. package/cli/provision-claude.mjs +893 -0
  134. package/cli/provision.mjs +330 -226
  135. package/cli/provision.test.mjs +102 -0
  136. package/cli/utils.mjs +72 -58
  137. package/config/AGENTS.md +28 -28
  138. package/config/agents/_shared/AGENT_BASELINE.md +104 -684
  139. package/config/skills/bizar/SKILL.md +197 -0
  140. package/config/skills/cubesandbox/SKILL.md +148 -0
  141. package/config/skills/harness-engineering/SKILL.md +142 -0
  142. package/install.sh +66 -44
  143. package/package.json +19 -11
  144. package/packages/sdk/ARCHITECTURE.md +40 -36
  145. package/packages/sdk/package-lock.json +32 -0
  146. package/packages/sdk/package.json +15 -5
  147. package/{plugins/bizar → packages/sdk}/src/dangerous-patterns.ts +6 -28
  148. package/packages/sdk/src/fingerprint.ts +0 -0
  149. package/packages/sdk/src/index.ts +38 -73
  150. package/packages/sdk/src/mcp/bin.ts +51 -0
  151. package/packages/sdk/src/mcp/server.ts +498 -0
  152. package/{plugins/bizar/src/memory-vault.ts → packages/sdk/src/memory/index.ts} +18 -21
  153. package/packages/sdk/tests/sdk.test.mjs +148 -0
  154. package/packages/sdk/vitest.config.ts +1 -1
  155. package/scripts/bh-full-e2e.mjs +166 -363
  156. package/scripts/check-deps.mjs +28 -46
  157. package/scripts/mirror-claude-md.sh +78 -0
  158. package/scripts/test-in-container.sh +157 -0
  159. package/templates/clean-state-checklist.md +3 -3
  160. package/templates/sprint-contract.md +2 -2
  161. package/bizar-dash/.bizar/activity.log +0 -3
  162. package/bizar-dash/.omx/logs/omx-2026-07-07.jsonl +0 -1
  163. package/bizar-dash/.omx/state/session.json +0 -10
  164. package/bizar-dash/bizar-design/EXPLANATION.md +0 -307
  165. package/bizar-dash/bizar-design/INSTRUCTIONS.md +0 -149
  166. package/bizar-dash/bizar-design/canvas.html +0 -281
  167. package/bizar-dash/bizar-design/canvas.html.artifact.json +0 -19
  168. package/bizar-dash/bizar-design/components.css +0 -1665
  169. package/bizar-dash/bizar-design/components.html +0 -557
  170. package/bizar-dash/bizar-design/components.html.artifact.json +0 -19
  171. package/bizar-dash/bizar-design/desktop/agents.html +0 -74
  172. package/bizar-dash/bizar-design/desktop/agents.html.artifact.json +0 -19
  173. package/bizar-dash/bizar-design/desktop/memory.html +0 -75
  174. package/bizar-dash/bizar-design/desktop/memory.html.artifact.json +0 -19
  175. package/bizar-dash/bizar-design/desktop/metrics.html +0 -63
  176. package/bizar-dash/bizar-design/desktop/metrics.html.artifact.json +0 -19
  177. package/bizar-dash/bizar-design/desktop/overview.html +0 -95
  178. package/bizar-dash/bizar-design/desktop/overview.html.artifact.json +0 -19
  179. package/bizar-dash/bizar-design/desktop/settings.html +0 -70
  180. package/bizar-dash/bizar-design/desktop/settings.html.artifact.json +0 -19
  181. package/bizar-dash/bizar-design/icons.svg +0 -44
  182. package/bizar-dash/bizar-design/index.html +0 -192
  183. package/bizar-dash/bizar-design/index.html.artifact.json +0 -19
  184. package/bizar-dash/bizar-design/mobile/agents.html +0 -29
  185. package/bizar-dash/bizar-design/mobile/agents.html.artifact.json +0 -19
  186. package/bizar-dash/bizar-design/mobile/memory.html +0 -28
  187. package/bizar-dash/bizar-design/mobile/memory.html.artifact.json +0 -19
  188. package/bizar-dash/bizar-design/mobile/metrics.html +0 -29
  189. package/bizar-dash/bizar-design/mobile/metrics.html.artifact.json +0 -19
  190. package/bizar-dash/bizar-design/mobile/overview.html +0 -33
  191. package/bizar-dash/bizar-design/mobile/overview.html.artifact.json +0 -19
  192. package/bizar-dash/bizar-design/mobile/settings.html +0 -28
  193. package/bizar-dash/bizar-design/mobile/settings.html.artifact.json +0 -19
  194. package/bizar-dash/bizar-design/prototype.js +0 -114
  195. package/bizar-dash/bizar-design/tokens.css +0 -106
  196. package/bizar-dash/dist/assets/vendor-CeHGtduv.js.map +0 -1
  197. package/bizar-dash/node_modules/.package-lock.json +0 -6
  198. package/bizar-dash/package-lock.json +0 -6
  199. package/bizar-dash/src/server/cline-sdk.mjs +0 -132
  200. package/bizar-dash/src/server/routes/cline-session-detail.mjs +0 -559
  201. package/bizar-dash/src/server/routes/cline-sessions.mjs +0 -291
  202. package/cli/commands/cline-cmd.mjs +0 -289
  203. package/cli/commands/validate.test.mjs +0 -344
  204. package/cli/doctor.test.mjs +0 -350
  205. package/config/cline.json.template +0 -342
  206. package/packages/sdk/src/client.ts +0 -188
  207. package/packages/sdk/src/cline-events.ts +0 -134
  208. package/packages/sdk/src/cline-types.ts +0 -66
  209. package/packages/sdk/src/cline.ts +0 -339
  210. package/packages/sdk/src/errors.ts +0 -129
  211. package/packages/sdk/src/events.ts +0 -153
  212. package/packages/sdk/src/types.ts +0 -176
  213. package/packages/sdk/tests/client.test.ts +0 -217
  214. package/packages/sdk/tests/errors.test.ts +0 -108
  215. package/packages/sdk/tests/events.test.ts +0 -139
  216. package/packages/sdk/tests/fixtures/fetch-mock.ts +0 -152
  217. package/packages/sdk/tests/fixtures/sse-mock.ts +0 -30
  218. package/plugins/bizar/ARCHITECTURE.md +0 -142
  219. package/plugins/bizar/CONSTRAINTS.md +0 -67
  220. package/plugins/bizar/LICENSE +0 -21
  221. package/plugins/bizar/README.md +0 -448
  222. package/plugins/bizar/index.ts +0 -872
  223. package/plugins/bizar/package.json +0 -39
  224. package/plugins/bizar/scripts/check-forbidden-imports.sh +0 -33
  225. package/plugins/bizar/src/background-state.ts +0 -641
  226. package/plugins/bizar/src/background.ts +0 -1806
  227. package/plugins/bizar/src/cline-runner.ts +0 -203
  228. package/plugins/bizar/src/clineruntime.ts +0 -227
  229. package/plugins/bizar/src/commands-impl.ts +0 -151
  230. package/plugins/bizar/src/commands.ts +0 -1799
  231. package/plugins/bizar/src/compaction.d.mts +0 -48
  232. package/plugins/bizar/src/compaction.mjs +0 -192
  233. package/plugins/bizar/src/dashboard-client.ts +0 -233
  234. package/plugins/bizar/src/event-stream.ts +0 -606
  235. package/plugins/bizar/src/fingerprint.ts +0 -120
  236. package/plugins/bizar/src/handoff.ts +0 -79
  237. package/plugins/bizar/src/hooks/memory-flush-on-compact.ts +0 -123
  238. package/plugins/bizar/src/hooks/memory-inject.ts +0 -247
  239. package/plugins/bizar/src/hooks/memory-write-on-end.ts +0 -188
  240. package/plugins/bizar/src/hooks/skill-curator.ts +0 -180
  241. package/plugins/bizar/src/http-client.ts +0 -467
  242. package/plugins/bizar/src/key-rotation.ts +0 -218
  243. package/plugins/bizar/src/logger.ts +0 -144
  244. package/plugins/bizar/src/loop-engineering.ts +0 -241
  245. package/plugins/bizar/src/loop.ts +0 -176
  246. package/plugins/bizar/src/mistake-recovery.ts +0 -98
  247. package/plugins/bizar/src/odin.ts +0 -227
  248. package/plugins/bizar/src/options.ts +0 -470
  249. package/plugins/bizar/src/plan-fs.ts +0 -323
  250. package/plugins/bizar/src/reasoning-clean.ts +0 -454
  251. package/plugins/bizar/src/report.ts +0 -178
  252. package/plugins/bizar/src/research-prompt.ts +0 -35
  253. package/plugins/bizar/src/serve-info.ts +0 -228
  254. package/plugins/bizar/src/serve.ts +0 -496
  255. package/plugins/bizar/src/settings.ts +0 -349
  256. package/plugins/bizar/src/state.ts +0 -298
  257. package/plugins/bizar/src/tool-discipline.ts +0 -105
  258. package/plugins/bizar/src/tools/agent-browser.ts +0 -315
  259. package/plugins/bizar/src/tools/bg-collect.ts +0 -131
  260. package/plugins/bizar/src/tools/bg-get-comments.ts +0 -266
  261. package/plugins/bizar/src/tools/bg-kill.ts +0 -116
  262. package/plugins/bizar/src/tools/bg-pause.ts +0 -99
  263. package/plugins/bizar/src/tools/bg-report-progress.ts +0 -115
  264. package/plugins/bizar/src/tools/bg-resume.ts +0 -94
  265. package/plugins/bizar/src/tools/bg-send-message.ts +0 -223
  266. package/plugins/bizar/src/tools/bg-spawn.ts +0 -502
  267. package/plugins/bizar/src/tools/bg-status.ts +0 -130
  268. package/plugins/bizar/src/tools/graph-query.ts +0 -278
  269. package/plugins/bizar/src/tools/loop-engineering.ts +0 -193
  270. package/plugins/bizar/src/tools/memory-list.ts +0 -43
  271. package/plugins/bizar/src/tools/memory-read.ts +0 -69
  272. package/plugins/bizar/src/tools/memory-search.ts +0 -47
  273. package/plugins/bizar/src/tools/memory-write.ts +0 -54
  274. package/plugins/bizar/src/tools/open-kb.ts +0 -198
  275. package/plugins/bizar/src/tools/plan-action.ts +0 -785
  276. package/plugins/bizar/src/tools/read-glyph-feedback.ts +0 -191
  277. package/plugins/bizar/src/tools/team-spawn.ts +0 -73
  278. package/plugins/bizar/src/tools/team-status.ts +0 -76
  279. package/plugins/bizar/src/tools/wait-for-feedback.ts +0 -415
  280. package/plugins/bizar/src/trajectory.ts +0 -104
  281. package/plugins/bizar/tests/README.md +0 -99
  282. package/plugins/bizar/tests/attach-handler-bug.test.ts +0 -169
  283. package/plugins/bizar/tests/background-state.test.ts +0 -277
  284. package/plugins/bizar/tests/background.test.ts +0 -402
  285. package/plugins/bizar/tests/block.test.ts +0 -195
  286. package/plugins/bizar/tests/canonical-key-order.test.ts +0 -75
  287. package/plugins/bizar/tests/clineruntime-config.test.ts +0 -283
  288. package/plugins/bizar/tests/commands-impl.test.ts +0 -316
  289. package/plugins/bizar/tests/commands.test.ts +0 -584
  290. package/plugins/bizar/tests/compaction.test.ts +0 -264
  291. package/plugins/bizar/tests/config.test.ts +0 -128
  292. package/plugins/bizar/tests/dashboard-client.test.ts +0 -159
  293. package/plugins/bizar/tests/dispose.test.ts +0 -336
  294. package/plugins/bizar/tests/event-stream.test.ts +0 -409
  295. package/plugins/bizar/tests/event.test.ts +0 -262
  296. package/plugins/bizar/tests/fingerprint.test.ts +0 -162
  297. package/plugins/bizar/tests/http-client.test.ts +0 -404
  298. package/plugins/bizar/tests/init-helpers.test.ts +0 -203
  299. package/plugins/bizar/tests/integration/slash-command.test.ts +0 -349
  300. package/plugins/bizar/tests/integration/tool-routing.test.ts +0 -98
  301. package/plugins/bizar/tests/key-rotation.test.ts +0 -396
  302. package/plugins/bizar/tests/loop-engineering.test.ts +0 -168
  303. package/plugins/bizar/tests/loop.test.ts +0 -397
  304. package/plugins/bizar/tests/memory-write-on-end.test.ts +0 -92
  305. package/plugins/bizar/tests/mistake-recovery.test.ts +0 -116
  306. package/plugins/bizar/tests/odin.test.ts +0 -125
  307. package/plugins/bizar/tests/options.test.ts +0 -329
  308. package/plugins/bizar/tests/reasoning-clean.test.ts +0 -422
  309. package/plugins/bizar/tests/safety.test.ts +0 -256
  310. package/plugins/bizar/tests/serve.test.ts +0 -339
  311. package/plugins/bizar/tests/settings.test.ts +0 -351
  312. package/plugins/bizar/tests/stall-think.test.ts +0 -750
  313. package/plugins/bizar/tests/state.test.ts +0 -276
  314. package/plugins/bizar/tests/tool-discipline.test.ts +0 -77
  315. package/plugins/bizar/tests/tools/agent-browser.test.ts +0 -98
  316. package/plugins/bizar/tests/tools/bg-collect.test.ts +0 -337
  317. package/plugins/bizar/tests/tools/bg-get-comments.test.ts +0 -485
  318. package/plugins/bizar/tests/tools/bg-kill.test.ts +0 -235
  319. package/plugins/bizar/tests/tools/bg-pause.test.ts +0 -61
  320. package/plugins/bizar/tests/tools/bg-report-progress.test.ts +0 -79
  321. package/plugins/bizar/tests/tools/bg-resume.test.ts +0 -40
  322. package/plugins/bizar/tests/tools/bg-send-message.test.ts +0 -116
  323. package/plugins/bizar/tests/tools/bg-spawn-delegation.test.ts +0 -147
  324. package/plugins/bizar/tests/tools/bg-spawn-http.test.ts +0 -233
  325. package/plugins/bizar/tests/tools/bg-spawn.test.ts +0 -311
  326. package/plugins/bizar/tests/tools/bg-status.test.ts +0 -217
  327. package/plugins/bizar/tests/tools/cline-runner.test.ts +0 -115
  328. package/plugins/bizar/tests/tools/plan-action.test.ts +0 -599
  329. package/plugins/bizar/tests/tools/read-glyph-feedback.test.ts +0 -253
  330. package/plugins/bizar/tests/tools/wait-for-feedback.test.ts +0 -390
  331. package/plugins/bizar/tests/update-deadlock.test.ts +0 -151
  332. package/plugins/bizar/tsconfig.json +0 -29
@@ -1,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
- });