@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
@@ -4,12 +4,12 @@
4
4
  * Tests for the `bizar dev-link` / `bizar dev-unlink` subcommands.
5
5
  * Uses Node's built-in node:test (no external test framework).
6
6
  *
7
- * Strategy: mock HOME (and XDG_CONFIG_HOME) so clineConfigDir() in
7
+ * Strategy: mock HOME (and XDG_CONFIG_HOME) so claudeConfigDir() in
8
8
  * cli/utils.mjs returns a path inside a tmpdir, and exercise the
9
9
  * create/remove symlink behavior against a controlled filesystem.
10
10
  *
11
11
  * Note: We mock HOME *before* importing dev-link.mjs because the module
12
- * imports clineConfigDir transitively from utils.mjs. The path is
12
+ * imports claudeConfigDir transitively from utils.mjs. The path is
13
13
  * resolved at call time, though, so the mock just needs to be in place
14
14
  * when the functions run.
15
15
  */
@@ -40,28 +40,28 @@ const ORIG_HOME = process.env.HOME;
40
40
  const ORIG_XDG = process.env.XDG_CONFIG_HOME;
41
41
 
42
42
  /**
43
- * Point HOME at a fresh tmpdir so the module's clineConfigDir()
44
- * resolves inside it (via the fallback `<HOME>/.cline`).
43
+ * Point HOME at a fresh tmpdir so the module's claudeConfigDir()
44
+ * resolves inside it (via the fallback `<HOME>/.claude`).
45
45
  * Returns the tmpdir path.
46
46
  *
47
47
  * Note: we deliberately do NOT set XDG_CONFIG_HOME here. The
48
- * clineConfigDir() helper treats a set XDG_CONFIG_HOME as the
49
- * direct parent (so `XDG_CONFIG_HOME=~/.config` → `~/.cline`,
48
+ * claudeConfigDir() helper treats a set XDG_CONFIG_HOME as the
49
+ * direct parent (so `XDG_CONFIG_HOME=~/.config` → `~/.claude`,
50
50
  * matching the standard layout). Setting it to a raw tmpdir would
51
- * produce `<tmpdir>/cline` instead of the expected
52
- * `<tmpdir>/.cline` and break path alignment with the test.
51
+ * produce `<tmpdir>/claude` instead of the expected
52
+ * `<tmpdir>/.claude` and break path alignment with the test.
53
53
  */
54
54
  function freshHome() {
55
55
  const home = mkdtempSync(join(tmpdir(), 'bizar-devlink-'));
56
56
  process.env.HOME = home;
57
- delete process.env.CLINE_DIR;
58
- delete process.env.BIZAR_LEGACY_CLINE_DIR;
57
+ delete process.env.CLAUDE_CONFIG_DIR;
58
+ delete process.env.BIZAR_LEGACY_CLAUDE_DIR;
59
59
  return home;
60
60
  }
61
61
 
62
62
  /** Path to the deployed plugin dir under the mocked HOME. */
63
63
  function pluginDest(home) {
64
- return join(home, '.cline', 'plugins', 'bizar');
64
+ return join(home, '.claude', 'plugins', 'bizar');
65
65
  }
66
66
 
67
67
  after(() => {
package/cli/doctor.mjs CHANGED
@@ -1,86 +1,53 @@
1
1
  /**
2
2
  * cli/doctor.mjs
3
3
  *
4
- * v3.12.2 — `bizar doctor` subcommand.
4
+ * v6.3.0 — `bizar doctor` subcommand (Claude Code-native).
5
5
  *
6
- * Runs a battery of health checks against the local Bizar / cline
6
+ * Runs a battery of health checks against the local Bizar / Claude Code
7
7
  * install and reports pass/fail for each. Returns a structured summary
8
8
  * suitable for callers (e.g. `bizar update`) that want to act on the
9
9
  * result without re-printing the per-check output.
10
10
  *
11
- * The checks are intentionally tolerant: missing optional tools
12
- * (headroom/semble/skills) don't fail the run, and the dashboard check
13
- * is skipped silently if no port file exists. The goal is "is your
14
- * install healthy?" not "is every conceivable thing present?".
11
+ * Checks (9 total):
12
+ * claude-cli-reachable: claude --version exits 0
13
+ * settings-valid: ~/.claude/settings.json parses
14
+ * mcp-server-registered: settings.json has mcpServers.bizar
15
+ * hooks-wired: settings.json has PreToolUse/PostToolUse/etc
16
+ * agent-files-installed: agent .md files deployed
17
+ * skill-files-installed: SKILL.md files deployed
18
+ * tools-on-path: at least one of headroom/semble/skills/claude
19
+ * memory-vault: BIZAR_HOME exists (memory subdir lazy)
20
+ * 9router-reachable: provider gateway responds
15
21
  *
16
22
  * Usage:
17
- * import { runDoctor } from './doctor.mjs';
18
- * const r = await runDoctor(); // prints everything
19
- * const r = await runDoctor({ silent: true }); // returns summary only
23
+ * import { runDoctor } from "./doctor.mjs";
24
+ * const r = await runDoctor();
25
+ * const r = await runDoctor({ silent: true });
20
26
  */
21
27
  import chalk from 'chalk';
22
28
  import { spawnSync } from 'node:child_process';
23
- import { existsSync, readFileSync } from 'node:fs';
29
+ import { existsSync, readFileSync, statSync, readdirSync } from 'node:fs';
24
30
  import { join } from 'node:path';
25
- import { clineConfigDir, clineAgentsDir, which, bizarConfigDir } from './utils.mjs';
31
+ import { homedir } from 'node:os';
26
32
 
27
- // v3.20.11: list every agent the install script is expected to deploy.
28
- // Adding a new agent to `config/agents/` without adding it here causes
29
- // doctor to silently under-count ("all 4 core agents present" when there
30
- // are actually 14). The list mirrors cli/install.mjs AGENT_FILES plus
31
- // `agent-browser.md` (added in v3.20.7) and `_shared/AGENT_BASELINE.md`
32
- // is intentionally excluded (it's a skill, not an agent).
33
- const REQUIRED_AGENTS = [
34
- 'odin.md',
35
- 'vor.md',
36
- 'frigg.md',
37
- 'quick.md',
38
- 'mimir.md',
39
- 'heimdall.md',
40
- 'hermod.md',
41
- 'thor.md',
42
- 'baldr.md',
43
- 'tyr.md',
44
- 'vidarr.md',
45
- 'forseti.md',
46
- 'semble-search.md',
47
- 'agent-browser.md',
48
- ];
49
-
50
- // ── helpers ─────────────────────────────────────────────────────────────────
51
-
52
- /**
53
- * Run a check function and capture its result. The check either
54
- * returns a string message (pass) or throws an Error (fail).
55
- */
56
- async function runCheck(name, fn) {
57
- try {
58
- const message = await fn();
59
- return { name, ok: true, message: message || 'ok' };
60
- } catch (err) {
61
- return {
62
- name,
63
- ok: false,
64
- message: err && err.message ? err.message : String(err),
65
- };
66
- }
67
- }
33
+ const CLAUDE_DIR = process.env.CLAUDE_CONFIG_DIR || join(homedir(), '.claude');
34
+ const BIZAR_HOME = process.env.BIZAR_HOME || join(homedir(), '.bizar_home');
68
35
 
69
36
  // ── individual checks ───────────────────────────────────────────────────────
70
37
 
71
- async function checkClineReachable() {
72
- const r = spawnSync('cline', ['--version'], {
38
+ async function checkClaudeReachable() {
39
+ const r = spawnSync('claude', ['--version'], {
73
40
  encoding: 'utf8',
74
41
  timeout: 5000,
75
42
  });
76
43
  if (r.status !== 0) {
77
- throw new Error(`cline --version exited ${r.status}`);
44
+ throw new Error(`claude --version exited ${r.status}`);
78
45
  }
79
- return (r.stdout || r.stderr || '').trim().split('\n')[0] || 'cline available';
46
+ return (r.stdout || r.stderr || '').trim().split('\n')[0] || 'claude available';
80
47
  }
81
48
 
82
- async function checkConfigValid() {
83
- const cfgPath = join(clineConfigDir(), 'cline.json');
49
+ async function checkSettingsValid() {
50
+ const cfgPath = join(CLAUDE_DIR, 'settings.json');
84
51
  if (!existsSync(cfgPath)) {
85
52
  throw new Error(`not found at ${cfgPath}`);
86
53
  }
@@ -89,73 +56,56 @@ async function checkConfigValid() {
89
56
  } catch (err) {
90
57
  throw new Error(`invalid JSON: ${err.message}`);
91
58
  }
92
- return 'cline.json parses';
59
+ return 'settings.json parses';
93
60
  }
94
61
 
95
- async function checkPluginEntryPresent() {
96
- const cfgPath = join(clineConfigDir(), 'cline.json');
62
+ async function checkMcpServerRegistered() {
63
+ const cfgPath = join(CLAUDE_DIR, 'settings.json');
97
64
  const cfg = JSON.parse(readFileSync(cfgPath, 'utf8'));
98
- const plugins = Array.isArray(cfg.plugin) ? cfg.plugin : [];
99
- if (plugins.length === 0) {
100
- throw new Error('no plugin entries in cline.json');
65
+ const servers = cfg.mcpServers || {};
66
+ if (!servers.bizar) {
67
+ throw new Error('mcpServers.bizar missing from settings.json');
101
68
  }
102
- const hasBizar = plugins.some((p) => {
103
- if (typeof p === 'string') return p.includes('bizar');
104
- if (Array.isArray(p)) {
105
- const [path] = p;
106
- return typeof path === 'string' && path.includes('bizar');
107
- }
108
- if (p && typeof p === 'object') {
109
- return (
110
- (p.name || '').includes('bizar') ||
111
- (p.path || '').includes('bizar')
112
- );
113
- }
114
- return false;
115
- });
116
- if (!hasBizar) {
117
- throw new Error('bizar not found in plugin[]');
118
- }
119
- return 'bizar present in plugin[]';
69
+ return `bizar MCP server registered (${servers.bizar.command ?? '?'})`;
120
70
  }
121
71
 
122
- async function checkPluginPathResolves() {
123
- const cfgPath = join(clineConfigDir(), 'cline.json');
72
+ async function checkHooksWired() {
73
+ const cfgPath = join(CLAUDE_DIR, 'settings.json');
124
74
  const cfg = JSON.parse(readFileSync(cfgPath, 'utf8'));
125
- const plugins = Array.isArray(cfg.plugin) ? cfg.plugin : [];
126
- let lastChecked = null;
127
- for (const p of plugins) {
128
- let entryPath = null;
129
- if (Array.isArray(p)) {
130
- const [path] = p;
131
- if (typeof path === 'string') entryPath = path;
132
- } else if (p && typeof p === 'object' && p.path) {
133
- entryPath = p.path;
134
- }
135
- if (!entryPath) continue;
136
- const isAbs = entryPath.startsWith('/') || /^[a-z]:[\\/]/i.test(entryPath);
137
- const resolved = isAbs ? entryPath : join(clineConfigDir(), entryPath);
138
- lastChecked = resolved;
139
- if (!existsSync(resolved)) {
140
- throw new Error(`plugin path does not exist: ${resolved}`);
141
- }
142
- }
143
- if (lastChecked === null) {
144
- return 'no plugin path to check';
75
+ const hooks = cfg.hooks || {};
76
+ const required = ['PreToolUse', 'PostToolUse', 'SessionStart', 'UserPromptSubmit'];
77
+ const missing = required.filter((e) => !Array.isArray(hooks[e]) || hooks[e].length === 0);
78
+ if (missing.length > 0) {
79
+ throw new Error(`missing hook events: ${missing.join(', ')}`);
145
80
  }
146
- return `plugin path resolves: ${lastChecked}`;
81
+ return `hooks wired: ${required.join(', ')}`;
147
82
  }
148
83
 
149
84
  async function checkAgentFilesInstalled() {
150
- const dir = clineAgentsDir();
85
+ const dir = join(CLAUDE_DIR, 'agents');
151
86
  if (!existsSync(dir)) {
152
87
  throw new Error(`agents dir missing: ${dir}`);
153
88
  }
154
- const missing = REQUIRED_AGENTS.filter((f) => !existsSync(join(dir, f)));
155
- if (missing.length > 0) {
156
- throw new Error(`missing: ${missing.join(', ')}`);
89
+ const have = readdirSync(dir).filter((f) => f.endsWith('.md'));
90
+ if (have.length === 0) {
91
+ throw new Error('no agent .md files installed');
92
+ }
93
+ return `${have.length} agents installed: ${have.slice(0, 4).join(', ')}${have.length > 4 ? '…' : ''}`;
94
+ }
95
+
96
+ async function checkSkillFilesInstalled() {
97
+ const dir = join(CLAUDE_DIR, 'skills');
98
+ if (!existsSync(dir)) {
99
+ throw new Error(`skills dir missing: ${dir}`);
100
+ }
101
+ const skills = readdirSync(dir).filter((d) => {
102
+ const fp = join(dir, d, 'SKILL.md');
103
+ return existsSync(fp);
104
+ });
105
+ if (skills.length === 0) {
106
+ throw new Error('no SKILL.md files found');
157
107
  }
158
- return `all ${REQUIRED_AGENTS.length} core agents present`;
108
+ return `${skills.length} skills installed`;
159
109
  }
160
110
 
161
111
  /**
@@ -165,7 +115,7 @@ async function checkAgentFilesInstalled() {
165
115
  * overall health report.
166
116
  */
167
117
  async function checkToolsAvailable() {
168
- const tools = ['headroom', 'semble', 'skills'];
118
+ const tools = ['headroom', 'semble', 'skills', 'claude'];
169
119
  const found = tools.filter(which);
170
120
  if (found.length === 0) {
171
121
  throw new Error(`none of ${tools.join('/')} on PATH`);
@@ -173,127 +123,95 @@ async function checkToolsAvailable() {
173
123
  return `available: ${found.join(', ')}`;
174
124
  }
175
125
 
176
- async function checkProviderConfigSanity() {
177
- const cfgPath = join(clineConfigDir(), 'cline.json');
178
- if (!existsSync(cfgPath)) {
179
- throw new Error('cline.json missing');
126
+ async function checkMemoryVault() {
127
+ if (!existsSync(BIZAR_HOME)) {
128
+ throw new Error(`BIZAR_HOME missing: ${BIZAR_HOME}`);
180
129
  }
181
- const cfg = JSON.parse(readFileSync(cfgPath, 'utf8'));
182
-
183
- // v6.0.19router is the primary gateway. All Bizar agents
184
- // route through it via `9router/<model>` prefixed model IDs.
185
- const nine = cfg.provider && cfg.provider['9router'];
186
- if (nine && nine.baseUrl) {
187
- const models = nine.models || {};
188
- const sane = Object.keys(models).filter((id) => typeof id === 'string' && id.length > 0);
189
- if (sane.length === 0) {
190
- throw new Error(
191
- 'provider.9router block has no models (run `bizar update` to re-sync)',
192
- );
193
- }
194
- return `provider.9router baseUrl=${nine.baseUrl} sane (${sane.length} models)`;
130
+ const memDir = process.env.BIZAR_MEMORY_VAULT || join(BIZAR_HOME, 'memory');
131
+ if (!existsSync(memDir)) {
132
+ // Not fatal the vault is created lazily on first write.
133
+ return `BIZAR_HOME present; memory vault will be created on demand`;
195
134
  }
196
-
197
- // Fallback: legacy `minimax` provider only. Kept for back-compat with
198
- // older pre-v6.0.1 cline.json installs.
199
- const minimax = cfg.provider && cfg.provider.minimax;
200
- if (!minimax) {
201
- return 'warn: no provider.9router AND no provider.minimax — run `bizar update`';
202
- }
203
- const models = minimax.models || {};
204
- const saneNames = Object.entries(models).filter(([, m]) => {
205
- return (
206
- m &&
207
- typeof m === 'object' &&
208
- 'interleaved' in m &&
209
- 'reasoning' in m
210
- );
211
- });
212
- if (saneNames.length === 0) {
213
- throw new Error(
214
- 'no MiniMax-style model with interleaved + reasoning flags',
215
- );
216
- }
217
- return `provider.minimax + ${saneNames.length} model(s) sane (legacy; consider migrating to provider.9router)`;
135
+ const st = statSync(memDir);
136
+ return `memory vault at ${memDir} (${st.isDirectory() ? 'dir' : '?'})`;
218
137
  }
219
138
 
220
- /**
221
- * v6.0.1 Check 9Router reachability. 9Router is the Bizar gateway;
222
- * if it's down, agents can't reach any upstream. Lenient (warn) by
223
- * design — the user might be intentionally working offline — but a
224
- * loud warning keeps the issue from being silent.
225
- */
226
- async function check9routerReachable() {
227
- const url = process.env.NINEROUTER_URL || 'http://localhost:20128';
228
- const ac = new AbortController();
229
- const timer = setTimeout(() => ac.abort(), 4000);
139
+ async function check9RouterReachable() {
140
+ const url = process.env.NINEROUTER_URL || 'http://127.0.0.1:8787';
141
+ let res;
230
142
  try {
231
- const res = await fetch(`${url}/api/health`, { signal: ac.signal });
232
- if (!res.ok) {
233
- return `warn: 9router at ${url} returned HTTP ${res.status}`;
234
- }
235
- const body = await res.text().catch(() => '');
236
- if (!body.includes('"ok":true')) {
237
- return `warn: 9router at ${url} responded but body did not include ok:true (got: ${body.slice(0, 60)})`;
238
- }
239
- return `9router healthy at ${url}`;
143
+ res = await fetch(`${url}/health`, { signal: AbortSignal.timeout(3000) });
240
144
  } catch (err) {
241
- const reason = err.name === 'AbortError' ? 'timeout after 4s' : (err.message || 'unreachable');
242
- return `warn: 9router unreachable at ${url} — ${reason}`;
243
- } finally {
244
- clearTimeout(timer);
145
+ throw new Error(`9router at ${url} unreachable: ${err.message ?? err}`);
146
+ }
147
+ if (!res.ok) {
148
+ throw new Error(`9router at ${url} responded HTTP ${res.status}`);
245
149
  }
150
+ return `9router at ${url} ok`;
246
151
  }
247
152
 
153
+ // ── runner ──────────────────────────────────────────────────────────────────
154
+
248
155
  const CHECKS = [
249
- ['cline-reachable', checkClineReachable],
250
- ['cline-config-valid', checkConfigValid],
251
- ['plugin-entry-present', checkPluginEntryPresent],
252
- ['plugin-path-resolves', checkPluginPathResolves],
253
- ['agent-files-installed', checkAgentFilesInstalled],
254
- ['tools-available', checkToolsAvailable],
255
- ['provider-config-sanity', checkProviderConfigSanity],
256
- ['9router-reachable', check9routerReachable],
156
+ { name: 'claude-cli-reachable', run: checkClaudeReachable },
157
+ { name: 'settings-valid', run: checkSettingsValid },
158
+ { name: 'mcp-server-registered', run: checkMcpServerRegistered },
159
+ { name: 'hooks-wired', run: checkHooksWired },
160
+ { name: 'agent-files-installed', run: checkAgentFilesInstalled },
161
+ { name: 'skill-files-installed', run: checkSkillFilesInstalled },
162
+ { name: 'tools-on-path', run: checkToolsAvailable },
163
+ { name: 'memory-vault', run: checkMemoryVault },
164
+ { name: '9router-reachable', run: check9RouterReachable },
257
165
  ];
258
166
 
259
- // ── public API ──────────────────────────────────────────────────────────────
260
-
261
- /**
262
- * Run all health checks. Prints per-check output unless `opts.silent`.
263
- * Prints a final summary line unless `opts.json` is true.
264
- * Returns `{ passed, failed, results }`.
265
- */
266
167
  export async function runDoctor(opts = {}) {
267
168
  const silent = !!opts.silent;
268
- const jsonMode = !!opts.json;
269
169
  const results = [];
270
- for (const [name, fn] of CHECKS) {
271
- const r = await runCheck(name, fn);
272
- results.push(r);
170
+ let passed = 0;
171
+ let failed = 0;
172
+
173
+ for (const check of CHECKS) {
174
+ let result;
175
+ try {
176
+ const message = await check.run();
177
+ result = { name: check.name, ok: true, message: message ?? 'ok' };
178
+ } catch (err) {
179
+ result = { name: check.name, ok: false, message: err?.message ?? String(err) };
180
+ }
181
+ results.push(result);
182
+ if (result.ok) passed += 1;
183
+ else failed += 1;
184
+
273
185
  if (!silent) {
274
- const marker = r.ok ? chalk.green('') : chalk.red('');
275
- const label = name.padEnd(28);
276
- const msg = r.ok ? chalk.dim(` ${r.message}`) : chalk.red(` ${r.message}`);
277
- console.log(` ${marker} ${label}${msg}`);
186
+ const tag = result.ok ? chalk.green('') : chalk.red('');
187
+ process.stdout.write(`${tag}${check.name}${result.ok ? '' : ` — ${result.message}`}\n`);
278
188
  }
279
189
  }
280
190
 
281
- const passed = results.filter((r) => r.ok).length;
282
- const failed = results.length - passed;
283
-
284
- // Print summary line only when not in JSON mode
285
- if (!jsonMode && (failed > 0 || !silent)) {
286
- console.log('');
287
- if (failed === 0) {
288
- console.log(
289
- chalk.green(` ✓ ${passed} checks passed, ${failed} failed`),
290
- );
291
- } else {
292
- console.log(
293
- chalk.yellow(` ⚠ ${passed} checks passed, ${failed} failed`),
294
- );
295
- }
191
+ if (!silent) {
192
+ const summary = chalk.bold(
193
+ failed > 0
194
+ ? chalk.red(`${failed} checks failed, ${passed} passed`)
195
+ : chalk.green(`${passed} checks passed`),
196
+ );
197
+ process.stdout.write(`\n${summary}\n`);
296
198
  }
297
199
 
298
200
  return { passed, failed, results };
299
- }
201
+ }
202
+
203
+ // ── helper ──────────────────────────────────────────────────────────────────
204
+
205
+ function which(cmd) {
206
+ const r = spawnSync('which', [cmd], { encoding: 'utf8' });
207
+ return r.status === 0 && !!r.stdout?.trim();
208
+ }
209
+
210
+ // Stand-alone CLI invocation (so `bizar doctor` still works when imported
211
+ // without the bin dispatcher).
212
+ if (import.meta.url === `file://${process.argv[1]}`) {
213
+ const silent = process.argv.includes('--silent');
214
+ runDoctor({ silent }).then(({ failed }) => {
215
+ process.exit(failed === 0 ? 0 : 1);
216
+ });
217
+ }
package/cli/install.mjs CHANGED
@@ -16,7 +16,7 @@ const __dirname = dirname(fileURLToPath(import.meta.url));
16
16
 
17
17
  import { showBanner, showPantheon, sectionHeading } from './banner.mjs';
18
18
  import { promptComponents, promptInstallMode, promptAgents, promptSkillPacks, promptApiKeys, promptConfirmInstall, promptRestartCline } from './prompts.mjs';
19
- import { detectCline, detectHeadroom, detectSemble, detectSkillsCli, detectUv, buildSummary, clineAgentsDir, clineConfigDir, repoPath } from './utils.mjs';
19
+ import { detectClaude, detectHeadroom, detectSemble, detectSkillsCli, detectUv, buildSummary, claudeAgentsDir, claudeConfigDir, repoPath } from './utils.mjs';
20
20
  import { installAgents, installAgentsMd, installSkill, installClineJson, installBizarFolder, installPluginBizar, installHeadroom, installSemble, installSkillsCli, installCuratedSkills, installRules, installHooks, installCommands, installCommandsBizar, mergeToolsIntoUserConfig } from './copy.mjs';
21
21
 
22
22
  const AGENT_FILES = [
@@ -27,8 +27,12 @@ const AGENT_FILES = [
27
27
  ];
28
28
 
29
29
  /**
30
- * Install the Bizar cline plugin from this package's own
31
- * `plugins/bizar/` directory into `~/.config/cline/plugins/bizar/`.
30
+ * Install the Bizar MCP server from this package's own `plugins/bizar/`
31
+ * directory into `~/.claude/plugins/bizar/`.
32
+ *
33
+ * v6.3.0 — Bizar is Claude Code-native. The plugin entry-point still
34
+ * ships at `plugins/bizar/` as a back-compat shim that re-exports the
35
+ * SDK; the actual MCP server lives in `packages/sdk/src/mcp/bin.ts`.
32
36
  *
33
37
  * v4.0.0 consolidated everything into one npm package, so the plugin
34
38
  * source ships with `@polderlabs/bizar` itself — no separate
@@ -44,8 +48,8 @@ const AGENT_FILES = [
44
48
  * workspace-internal package not on the public registry. After copying
45
49
  * the plugin files, this function ALSO copies the source's `node_modules/`
46
50
  * to the deployed `node_modules/` so Bun can resolve the import when the
47
- * plugin is loaded from `~/.config/cline/plugins/bizar/`. Without
48
- * this, the plugin silently fails to load.
51
+ * plugin is loaded from `~/.claude/plugins/bizar/`. Without this, the
52
+ * plugin silently fails to load.
49
53
  *
50
54
  * Pass `{ silent: true }` to suppress the warning prints; the function
51
55
  * still returns `true` if the dest is already in the desired state.
@@ -65,7 +69,7 @@ export async function installPluginFromGlobal(opts = {}) {
65
69
  // A plain copy would dereference the symlink and silently break the
66
70
  // dev workflow. Print a hint unless silent, or honour an explicit
67
71
  // --force from the caller.
68
- const destDir = join(clineConfigDir(), 'plugins', 'bizar');
72
+ const destDir = join(claudeConfigDir(), 'plugins', 'bizar');
69
73
  let destIsSymlink = false;
70
74
  try {
71
75
  destIsSymlink = lstatSync(destDir).isSymbolicLink();
@@ -81,7 +85,7 @@ export async function installPluginFromGlobal(opts = {}) {
81
85
  }
82
86
  console.log(
83
87
  chalk.yellow(
84
- ' ⚠ ~/.config/cline/plugins/bizar is a dev symlink — skipping copy.',
88
+ ' ⚠ ~/.claude/plugins/bizar is a dev symlink — skipping copy.',
85
89
  ),
86
90
  );
87
91
  console.log(
@@ -197,11 +201,11 @@ export async function installPluginFromGlobal(opts = {}) {
197
201
  }
198
202
  }
199
203
 
200
- // Wire runtime deps (`zod` plus `@cline/sdk`, `@cline/core`,
201
- // `@cline/shared`) into the deployed plugin's `node_modules/`.
204
+ // Wire runtime deps (`zod` plus `@anthropic-ai/claude-agent-sdk`)
205
+ // into the deployed plugin's `node_modules/`.
202
206
  // Bun's module resolver walks up from the plugin entry point
203
207
  // looking for `node_modules/`, and without entries there the
204
- // plugin throws `Cannot find module 'zod' (+2 more)` at startup.
208
+ // plugin throws `Cannot find module 'zod'` at startup.
205
209
  //
206
210
  // The resolution logic lives in `cli/plugin-runtime-deps.mjs` and
207
211
  // is shared with the modern provisioner (`cli/provision.mjs`). It
@@ -479,46 +483,38 @@ async function promptGraphifyInstall() {
479
483
  }
480
484
 
481
485
  export async function runPostInstall() {
482
- // v6.1.0 — Bizar is Cline-only. The legacy opencode-era
483
- // `promptAndInstallOptional()` (plugin/dashboard presence probes)
484
- // has been removed; `cli/provision.mjs:runProvision` covers the same
485
- // surface via `runProvision({ mode: 'install' })`, which is the path
486
+ // v6.3.0 — Bizar is Claude Code-native. `cli/provision-claude.mjs:runProvision`
487
+ // covers the install/update/validate surface and is the primary path
486
488
  // used by `bizar install` and `bizar update`. This `runPostInstall`
487
- // is now a thin Cline-only bootstrap that:
488
- // - copies `config/cline.json` template on first install
489
- // - runs `installCommandsBizar()` for the legacy `commands-bizar/` dir
490
- // - installs agents into `~/.cline/agents/`
489
+ // is a thin Claude Code-native bootstrap that:
490
+ // - copies `config/settings.json` template on first install
491
+ // - installs agents into `~/.claude/agents/`
491
492
  // - probes for headroom / semble / skills-cli
492
493
  // - installs Headroom via pip or npm
493
- // The old OpenCode-era probes (`Plugin source present`,
494
- // `Dashboard source present`) moved to `cli/doctor.mjs` as live checks.
495
494
  const { mkdirSync, copyFileSync, existsSync } = await import('node:fs');
496
495
  const { execSync } = await import('node:child_process');
497
496
 
498
- const dest = join(clineConfigDir(), 'cline.json');
499
- const templateSrc = repoPath('config', 'cline.json');
497
+ const dest = join(claudeConfigDir(), 'settings.json');
498
+ const templateSrc = repoPath('config', 'settings.json');
500
499
  if (!existsSync(dest)) {
501
500
  if (existsSync(templateSrc)) {
502
- mkdirSync(clineConfigDir(), { recursive: true });
501
+ mkdirSync(claudeConfigDir(), { recursive: true });
503
502
  copyFileSync(templateSrc, dest);
504
- console.log(' ✓ cline.json bootstrapped from package template');
503
+ console.log(' ✓ settings.json bootstrapped from package template');
505
504
  }
506
505
  }
507
506
 
508
- // Install Bizar commands to commands-bizar/ (separate from ECC's commands symlink)
509
- await installCommandsBizar();
510
-
511
- const env = await detectCline();
507
+ const env = await detectClaude();
512
508
  if (!env.exists) {
513
- mkdirSync(clineConfigDir(), { recursive: true });
514
- console.log(`BizarHarness: created ${clineConfigDir()}/`);
509
+ mkdirSync(claudeConfigDir(), { recursive: true });
510
+ console.log(`BizarHarness: created ${claudeConfigDir()}/`);
515
511
  }
516
512
 
517
- mkdirSync(clineAgentsDir(), { recursive: true });
513
+ mkdirSync(claudeAgentsDir(), { recursive: true });
518
514
 
519
515
  for (const file of AGENT_FILES) {
520
516
  const src = repoPath('config', 'agents', file);
521
- const dest = join(clineAgentsDir(), file);
517
+ const dest = join(claudeAgentsDir(), file);
522
518
  if (!existsSync(dest)) {
523
519
  copyFileSync(src, dest);
524
520
  }
@@ -537,14 +533,14 @@ export async function runPostInstall() {
537
533
  'pip install --user "headroom-ai[all]"',
538
534
  { stdio: 'pipe', timeout: 60000 },
539
535
  );
540
- execSync('headroom wrap cline', { stdio: 'pipe' });
536
+ execSync('headroom wrap claude', { stdio: 'pipe' });
541
537
  console.log('BizarHarness: Headroom installed and configured.');
542
538
  }
543
539
  } catch {
544
540
  // Fall back to npm
545
541
  try {
546
542
  execSync('npm install -g headroom-ai', { stdio: 'pipe', timeout: 60000 });
547
- execSync('headroom wrap cline', { stdio: 'pipe' });
543
+ execSync('headroom wrap claude', { stdio: 'pipe' });
548
544
  console.log('BizarHarness: Headroom installed (npm) and configured.');
549
545
  } catch {
550
546
  console.log('BizarHarness: Headroom install failed. Install manually: pip install "headroom-ai[all]" or npm install -g headroom-ai');
@@ -552,10 +548,10 @@ export async function runPostInstall() {
552
548
  }
553
549
  } else {
554
550
  try {
555
- execSync('headroom wrap cline', { stdio: 'pipe' });
556
- console.log('BizarHarness: Headroom configured for cline.');
551
+ execSync('headroom wrap claude', { stdio: 'pipe' });
552
+ console.log('BizarHarness: Headroom configured for claude.');
557
553
  } catch {
558
- console.log('BizarHarness: could not configure Headroom. Run `headroom wrap cline` manually.');
554
+ console.log('BizarHarness: could not configure Headroom. Run `headroom wrap claude` manually.');
559
555
  }
560
556
  }
561
557