@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,323 +0,0 @@
1
- /**
2
- * plan-fs.ts
3
- *
4
- * v0.5.0 — Plan filesystem operations.
5
- *
6
- * Pure file-I/O helpers for the on-disk plan layout used by the v2
7
- * canvas:
8
- *
9
- * <worktree>/plans/<slug>/meta.json — status + bookkeeping
10
- * <worktree>/plans/<slug>/plan.json — v2 canvas
11
- *
12
- * This module is the **only** place in the plugin that knows the
13
- * layout. Both `src/commands-impl.ts` (slash-command side effects)
14
- * and `src/tools/plan-action.ts` (the `bizar_plan_action` tool) build
15
- * on these primitives. The CLI in `cli/plan.mjs` duplicates the same
16
- * layout (language boundary: mjs vs ts); keep both copies in sync.
17
- *
18
- * Concurrency:
19
- * - All writes go through a single async mutex so two concurrent
20
- * `createPlan()` calls cannot both create the same slug, and so a
21
- * `createPlan` racing with a `bizar_plan_action` write never
22
- * produces a partial state on disk.
23
- * - Writes are atomic: write to `<file>.tmp`, then `renameSync` to
24
- * the final path. A crash mid-write leaves a `.tmp` orphan — the
25
- * `rmSync` in the catch block is best-effort.
26
- *
27
- * Errors:
28
- * - All functions return a discriminated result object (`{ ok: true, ... }`
29
- * or `{ ok: false, error: ... }`) and NEVER throw. Callers can
30
- * surface the error string to the user.
31
- * - Slug validation: every public function validates the slug with
32
- * `SLUG_REGEX` and returns `{ ok: false, error: ... }` on failure.
33
- *
34
- * [KEEP-IN-SYNC-WITH cli/plan.mjs] — the CLI in `cli/plan.mjs` mirrors
35
- * the layout. If you change the canvas or meta shape, update both.
36
- */
37
-
38
- import {
39
- existsSync,
40
- mkdirSync,
41
- readFileSync,
42
- renameSync,
43
- rmSync,
44
- writeFileSync,
45
- } from "node:fs";
46
- import { dirname, join } from "node:path";
47
-
48
- import type { Logger } from "./logger.js";
49
-
50
- // --- Constants ------------------------------------------------------------
51
-
52
- /** Same slug rule used everywhere in the project. */
53
- const SLUG_REGEX = /^[a-z0-9][a-z0-9-]{0,63}$/;
54
-
55
- /** Initial status of a freshly created plan. */
56
- const DEFAULT_STATUS = "draft" as const;
57
-
58
- // --- Types ----------------------------------------------------------------
59
-
60
- /** Public result type for all plan-fs operations. */
61
- export type PlanFsResult<T> =
62
- | { ok: true; value: T }
63
- | { ok: false; error: string };
64
-
65
- /** A summary row used by `listPlans`. */
66
- export interface PlanListEntry {
67
- slug: string;
68
- status: string;
69
- lastEdited: string;
70
- }
71
-
72
- /** The shape stored in `meta.json`. */
73
- export interface PlanMeta {
74
- status: string;
75
- lastEdited: string;
76
- /** Anything else the viewer/agent has written into meta. */
77
- [key: string]: unknown;
78
- }
79
-
80
- /** The shape stored in `plan.json` (v2 canvas). */
81
- export interface PlanCanvas {
82
- schemaVersion: 2;
83
- title: string;
84
- elements: unknown[];
85
- connections: unknown[];
86
- comments: unknown[];
87
- viewport: { x: number; y: number; zoom: number };
88
- lastEdited: string;
89
- [key: string]: unknown;
90
- }
91
-
92
- /** Returned by `createPlan` on success. */
93
- export interface CreatePlanSuccess {
94
- meta: PlanMeta;
95
- canvas: PlanCanvas;
96
- }
97
-
98
- // --- Module-level mutex ---------------------------------------------------
99
-
100
- /** Per-process mutex. Serializes every plan-fs mutation. */
101
- const locks: { chain: Promise<unknown> } = { chain: Promise.resolve() };
102
-
103
- async function withLock<T>(fn: () => Promise<T>): Promise<T> {
104
- const prev = locks.chain ?? Promise.resolve();
105
- const next = prev.then(fn, fn);
106
- locks.chain = next.catch(() => {});
107
- return next;
108
- }
109
-
110
- // --- Helpers --------------------------------------------------------------
111
-
112
- function planDir(worktree: string, slug: string): string {
113
- return join(worktree, "plans", slug);
114
- }
115
-
116
- function metaPath(worktree: string, slug: string): string {
117
- return join(planDir(worktree, slug), "meta.json");
118
- }
119
-
120
- function canvasPath(worktree: string, slug: string): string {
121
- return join(planDir(worktree, slug), "plan.json");
122
- }
123
-
124
- function isValidSlug(slug: string): boolean {
125
- return SLUG_REGEX.test(slug);
126
- }
127
-
128
- function readJson<T>(filePath: string): T | null {
129
- if (!existsSync(filePath)) return null;
130
- try {
131
- const raw = readFileSync(filePath, "utf-8");
132
- const parsed = JSON.parse(raw) as unknown;
133
- if (parsed === null || typeof parsed !== "object" || Array.isArray(parsed)) {
134
- return null;
135
- }
136
- return parsed as T;
137
- } catch {
138
- return null;
139
- }
140
- }
141
-
142
- function writeJsonAtomic(
143
- filePath: string,
144
- data: unknown,
145
- logger: Logger,
146
- ): { ok: true } | { ok: false; error: string } {
147
- const tmp = `${filePath}.tmp`;
148
- try {
149
- mkdirSync(dirname(filePath), { recursive: true });
150
- writeFileSync(tmp, JSON.stringify(data, null, 2), "utf-8");
151
- renameSync(tmp, filePath);
152
- return { ok: true };
153
- } catch (err: unknown) {
154
- const msg = err instanceof Error ? err.message : String(err);
155
- logger.warn(`bizar: plan-fs: failed to write ${filePath}: ${msg}`);
156
- try {
157
- if (existsSync(tmp)) rmSync(tmp);
158
- } catch {
159
- // best-effort cleanup
160
- }
161
- return { ok: false, error: `Failed to write ${filePath}: ${msg}` };
162
- }
163
- }
164
-
165
- function titleCaseFromSlug(slug: string): string {
166
- return slug
167
- .split(/[-_]/)
168
- .map((w) => (w.length === 0 ? w : w[0]!.toUpperCase() + w.slice(1)))
169
- .join(" ");
170
- }
171
-
172
- // --- Public API -----------------------------------------------------------
173
-
174
- /**
175
- * Create a new plan at `<worktree>/plans/<slug>/`. The directory
176
- * contains:
177
- *
178
- * - `meta.json` — `{ status: "draft", lastEdited: <iso>, title }`
179
- * - `plan.json` — minimal v2 canvas (empty elements / connections / comments)
180
- *
181
- * If a plan with the same slug already exists, returns
182
- * `{ ok: false, error: "Plan already exists: <slug>" }` — we never
183
- * clobber. Callers should explicitly `/plan delete` first if they
184
- * want a fresh canvas.
185
- *
186
- * The `template` option is currently informational only — the v0.5.0
187
- * MVP always scaffolds a blank canvas. Future versions may seed the
188
- * canvas with template-specific elements.
189
- */
190
- export async function createPlan(
191
- worktree: string,
192
- slug: string,
193
- opts: { template?: string | null; logger: Logger },
194
- ): Promise<PlanFsResult<CreatePlanSuccess>> {
195
- if (!isValidSlug(slug)) {
196
- return {
197
- ok: false,
198
- error: `Invalid slug "${slug}". Must match ^[a-z0-9][a-z0-9-]{0,63}$.`,
199
- };
200
- }
201
-
202
- return withLock(async () => {
203
- const dir = planDir(worktree, slug);
204
- if (existsSync(dir)) {
205
- return {
206
- ok: false,
207
- error:
208
- `Plan "${slug}" already exists at ${dir}. ` +
209
- `Use /plan delete ${slug} first, or pick a new slug.`,
210
- };
211
- }
212
-
213
- const now = new Date().toISOString();
214
- const title = titleCaseFromSlug(slug);
215
- const meta: PlanMeta = {
216
- status: DEFAULT_STATUS,
217
- lastEdited: now,
218
- title,
219
- };
220
- const canvas: PlanCanvas = {
221
- schemaVersion: 2,
222
- title,
223
- elements: [],
224
- connections: [],
225
- comments: [],
226
- viewport: { x: 0, y: 0, zoom: 1 },
227
- lastEdited: now,
228
- };
229
-
230
- // Ensure the directory exists before writing (writeJsonAtomic also
231
- // mkdir's the parent, but doing it explicitly lets us return a
232
- // clearer error).
233
- try {
234
- mkdirSync(dir, { recursive: true });
235
- } catch (err: unknown) {
236
- const msg = err instanceof Error ? err.message : String(err);
237
- opts.logger.warn(`bizar: plan-fs: mkdir failed for ${dir}: ${msg}`);
238
- return { ok: false, error: `Cannot create plan directory: ${dir} (${msg})` };
239
- }
240
-
241
- const metaRes = writeJsonAtomic(metaPath(worktree, slug), meta, opts.logger);
242
- if (!metaRes.ok) return metaRes;
243
- const canvasRes = writeJsonAtomic(canvasPath(worktree, slug), canvas, opts.logger);
244
- if (!canvasRes.ok) {
245
- // Roll back the partially-created directory so a retry has a
246
- // clean slate. Best-effort.
247
- try {
248
- rmSync(dir, { recursive: true, force: true });
249
- } catch {
250
- // ignore
251
- }
252
- return canvasRes;
253
- }
254
-
255
- opts.logger.info(
256
- `bizar: plan-fs: created plan "${slug}" at ${dir} (template=${opts.template ?? "blank"})`,
257
- );
258
- return { ok: true, value: { meta, canvas } };
259
- });
260
- }
261
-
262
- /**
263
- * List the plans in `<worktree>/plans/`. Returns an array sorted by
264
- * slug. Each entry has `slug`, `status` (from `meta.json` if present,
265
- * else `"unknown"`), and `lastEdited` (ISO timestamp or `""` if
266
- * missing).
267
- *
268
- * Returns `[]` when the worktree has no `plans/` directory — that's
269
- * the "no plans yet" case, not an error.
270
- */
271
- export async function listPlans(
272
- worktree: string,
273
- _logger: Logger,
274
- ): Promise<PlanListEntry[]> {
275
- const dir = join(worktree, "plans");
276
- if (!existsSync(dir)) return [];
277
-
278
- // Use sync readdir here — the function is called rarely (from
279
- // /plan list) and the directory is small. Keeping the function
280
- // async lets us swap in an async implementation later.
281
- const { readdirSync, statSync } = await import("node:fs");
282
- let entries: string[];
283
- try {
284
- entries = readdirSync(dir);
285
- } catch {
286
- return [];
287
- }
288
-
289
- const out: PlanListEntry[] = [];
290
- for (const name of entries) {
291
- const full = join(dir, name);
292
- try {
293
- const stat = statSync(full);
294
- if (!stat.isDirectory()) continue;
295
- } catch {
296
- continue;
297
- }
298
- if (!isValidSlug(name)) continue; // skip non-slug dirs
299
-
300
- const meta = readJson<PlanMeta>(metaPath(worktree, name));
301
- out.push({
302
- slug: name,
303
- status: meta?.status ?? "unknown",
304
- lastEdited:
305
- typeof meta?.lastEdited === "string" ? meta.lastEdited : "",
306
- });
307
- }
308
- out.sort((a, b) => a.slug.localeCompare(b.slug));
309
- return out;
310
- }
311
-
312
- /**
313
- * Read `meta.json` for a plan. Returns `null` if the plan or the
314
- * meta file does not exist. The caller decides what "missing" means
315
- * (the slash command treats it as a soft error).
316
- */
317
- export async function getPlanMeta(
318
- worktree: string,
319
- slug: string,
320
- ): Promise<PlanMeta | null> {
321
- if (!isValidSlug(slug)) return null;
322
- return readJson<PlanMeta>(metaPath(worktree, slug));
323
- }