@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.
- package/.claude/CLAUDE.md +15 -0
- package/.claude/agents/_shared/AGENT_BASELINE.md +168 -0
- package/.claude/agents/_shared/CLAUDE_TOOLS.md +412 -0
- package/.claude/agents/_shared/SKILLS.md +109 -0
- package/.claude/agents/agent-browser.md +80 -0
- package/.claude/agents/baldr.md +49 -0
- package/.claude/agents/forseti.md +51 -0
- package/.claude/agents/frigg.md +42 -0
- package/.claude/agents/heimdall.md +33 -0
- package/.claude/agents/hermod.md +53 -0
- package/.claude/agents/mimir.md +49 -0
- package/.claude/agents/odin.md +287 -0
- package/.claude/agents/quick.md +34 -0
- package/.claude/agents/semble-search.md +50 -0
- package/.claude/agents/thor.md +53 -0
- package/.claude/agents/tyr.md +56 -0
- package/.claude/agents/vidarr.md +54 -0
- package/.claude/agents/vor.md +53 -0
- package/.claude/commands/audit.md +25 -0
- package/.claude/commands/bizar.md +22 -0
- package/.claude/commands/explain.md +17 -0
- package/.claude/commands/init.md +29 -0
- package/.claude/commands/learn.md +44 -0
- package/.claude/commands/plan.md +35 -0
- package/.claude/commands/plow-through.md +50 -0
- package/.claude/commands/pr-review.md +49 -0
- package/.claude/commands/setup-provider.md +96 -0
- package/.claude/commands/tailscale-serve.md +100 -0
- package/.claude/commands/team.md +132 -0
- package/.claude/commands/test.md +62 -0
- package/.claude/commands/validate.md +68 -0
- package/.claude/commands/visual-plan.md +24 -0
- package/.claude/hooks/README.md +92 -0
- package/.claude/hooks/posttooluse-editwrite.mjs +91 -0
- package/.claude/hooks/pretooluse-bash.mjs +81 -0
- package/.claude/hooks/pretooluse-editwrite.mjs +139 -0
- package/.claude/hooks/sessionend-recall.mjs +74 -0
- package/.claude/hooks/sessionstart-prime.mjs +80 -0
- package/.claude/hooks/userpromptsubmit-tag.mjs +80 -0
- package/.claude/settings.json +116 -0
- package/.claude/skills/9router/SKILL.md +80 -0
- package/.claude/skills/9router-chat/SKILL.md +73 -0
- package/.claude/skills/9router-embeddings/SKILL.md +69 -0
- package/.claude/skills/9router-image/SKILL.md +86 -0
- package/.claude/skills/9router-stt/SKILL.md +79 -0
- package/.claude/skills/9router-tts/SKILL.md +80 -0
- package/.claude/skills/9router-web-fetch/SKILL.md +99 -0
- package/.claude/skills/9router-web-search/SKILL.md +91 -0
- package/.claude/skills/bizar/README.md +9 -0
- package/.claude/skills/bizar/SKILL.md +450 -0
- package/.claude/skills/cpp-coding-standards/README.md +28 -0
- package/.claude/skills/cpp-coding-standards/SKILL.md +634 -0
- package/.claude/skills/cpp-coding-standards/references/concurrency.md +320 -0
- package/.claude/skills/cpp-coding-standards/references/error-handling.md +229 -0
- package/.claude/skills/cpp-coding-standards/references/memory-safety.md +216 -0
- package/.claude/skills/cpp-coding-standards/references/modern-idioms.md +282 -0
- package/.claude/skills/cpp-coding-standards/references/review-checklist.md +96 -0
- package/.claude/skills/cpp-testing/README.md +28 -0
- package/.claude/skills/cpp-testing/SKILL.md +304 -0
- package/.claude/skills/cpp-testing/references/coverage.md +370 -0
- package/.claude/skills/cpp-testing/references/framework-compare.md +175 -0
- package/.claude/skills/cpp-testing/references/host-test-for-embedded.md +499 -0
- package/.claude/skills/cpp-testing/references/mocking.md +364 -0
- package/.claude/skills/cpp-testing/references/tdd-workflow.md +308 -0
- package/.claude/skills/cubesandbox/SKILL.md +148 -0
- package/.claude/skills/embedded-esp-idf/README.md +41 -0
- package/.claude/skills/embedded-esp-idf/SKILL.md +439 -0
- package/.claude/skills/embedded-esp-idf/references/freertos-patterns.md +214 -0
- package/.claude/skills/embedded-esp-idf/references/host-tests.md +164 -0
- package/.claude/skills/embedded-esp-idf/references/idf-py-commands.md +157 -0
- package/.claude/skills/embedded-esp-idf/references/kconfig.md +159 -0
- package/.claude/skills/embedded-esp-idf/references/logging-discipline.md +118 -0
- package/.claude/skills/embedded-esp-idf/references/memory-and-iram.md +137 -0
- package/.claude/skills/embedded-esp-idf/references/nvs.md +121 -0
- package/.claude/skills/embedded-esp-idf/references/packed-structs.md +192 -0
- package/.claude/skills/embedded-esp-idf/scripts/idf_env.sh +47 -0
- package/.claude/skills/embedded-esp-idf/scripts/size_check.sh +77 -0
- package/.claude/skills/glyph/SKILL.md +163 -0
- package/.claude/skills/harness-engineering/SKILL.md +143 -0
- package/.claude/skills/lightrag/SKILL.md +81 -0
- package/.claude/skills/memory-protocol/SKILL.md +105 -0
- package/.claude/skills/obsidian/SKILL.md +306 -0
- package/.claude/skills/read-the-damn-docs/SKILL.md +113 -0
- package/.claude/skills/self-improvement/SKILL.md +64 -0
- package/README.md +87 -59
- package/bizar-dash/dist/assets/{EnvVarsSection-DXM8gRm_.js → EnvVarsSection-B58aiJiE.js} +1 -1
- package/bizar-dash/dist/assets/{EnvVarsSection-DXM8gRm_.js.map → EnvVarsSection-B58aiJiE.js.map} +1 -1
- package/bizar-dash/dist/assets/{MobileChat-BnKN_Ks_.js → MobileChat-BJrqwVDd.js} +1 -1
- package/bizar-dash/dist/assets/{MobileChat-BnKN_Ks_.js.map → MobileChat-BJrqwVDd.js.map} +1 -1
- package/bizar-dash/dist/assets/{MobileSettings-DjCPxC-Q.js → MobileSettings-CEQNJNLJ.js} +1 -1
- package/bizar-dash/dist/assets/{MobileSettings-DjCPxC-Q.js.map → MobileSettings-CEQNJNLJ.js.map} +1 -1
- package/bizar-dash/dist/assets/{main-DYiZqMrn.js → main-IvfQAOfy.js} +1 -1
- package/bizar-dash/dist/assets/{main-DYiZqMrn.js.map → main-IvfQAOfy.js.map} +1 -1
- package/bizar-dash/dist/assets/{markdown-C6mXtQxD.js → markdown-tOLaD6nm.js} +1 -1
- package/bizar-dash/dist/assets/{markdown-C6mXtQxD.js.map → markdown-tOLaD6nm.js.map} +1 -1
- package/bizar-dash/dist/assets/{mobile-CMHqtLV2.js → mobile-DYCHcUpq.js} +1 -1
- package/bizar-dash/dist/assets/{mobile-CMHqtLV2.js.map → mobile-DYCHcUpq.js.map} +1 -1
- package/bizar-dash/dist/assets/{mobile-layout-3jIhHX_p.js → mobile-layout-CBHjpwsb.js} +2 -2
- package/bizar-dash/dist/assets/{mobile-layout-3jIhHX_p.js.map → mobile-layout-CBHjpwsb.js.map} +1 -1
- package/bizar-dash/dist/assets/{useSlashCommands-DtITw8Xv.js → useSlashCommands-Bd7_FA6U.js} +2 -2
- package/bizar-dash/dist/assets/{useSlashCommands-DtITw8Xv.js.map → useSlashCommands-Bd7_FA6U.js.map} +1 -1
- package/bizar-dash/dist/assets/{vendor-CeHGtduv.js → vendor-C843201K.js} +12 -12
- package/bizar-dash/dist/assets/vendor-C843201K.js.map +1 -0
- package/bizar-dash/dist/index.html +6 -6
- package/bizar-dash/dist/mobile.html +2 -2
- package/bizar-dash/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +1 -1
- package/bizar-dash/src/server/api.mjs +4 -4
- package/bizar-dash/src/server/background-store.mjs +15 -16
- package/bizar-dash/src/server/bg-poller.mjs +25 -35
- package/bizar-dash/src/server/bg-retry.mjs +66 -194
- package/bizar-dash/src/server/claude-bg-spawner.mjs +390 -0
- package/bizar-dash/src/server/claude-info.mjs +412 -0
- package/bizar-dash/src/server/{cline-runner.mjs → claude-runner.mjs} +53 -48
- package/bizar-dash/src/server/claude-sdk.mjs +191 -0
- package/bizar-dash/src/server/providers-store.mjs +22 -49
- package/bizar-dash/src/server/routes/background.mjs +24 -20
- package/bizar-dash/src/server/routes/chat.mjs +223 -326
- package/bizar-dash/src/server/routes/claude-session-detail.mjs +329 -0
- package/bizar-dash/src/server/routes/claude-sessions.mjs +259 -0
- package/bizar-dash/src/server/routes/tasks.mjs +20 -28
- package/bizar-dash/src/server/task-delegator.mjs +76 -77
- package/bizar-dash/src/web/components/chat/useChat.ts +23 -27
- package/bizar-dash/src/web/views/Chat.tsx +8 -8
- package/cli/bin.mjs +31 -18
- package/cli/commands/claude-cmd.mjs +348 -0
- package/cli/commands/install.mjs +12 -11
- package/cli/commands/sandbox.mjs +220 -0
- package/cli/commands/validate.mjs +252 -288
- package/cli/dev-link.test.mjs +11 -11
- package/cli/doctor.mjs +131 -213
- package/cli/install.mjs +33 -37
- package/cli/install.test.mjs +9 -9
- package/cli/provision-claude.mjs +893 -0
- package/cli/provision.mjs +330 -226
- package/cli/provision.test.mjs +102 -0
- package/cli/utils.mjs +72 -58
- package/config/AGENTS.md +28 -28
- package/config/agents/_shared/AGENT_BASELINE.md +104 -684
- package/config/skills/bizar/SKILL.md +197 -0
- package/config/skills/cubesandbox/SKILL.md +148 -0
- package/config/skills/harness-engineering/SKILL.md +142 -0
- package/install.sh +66 -44
- package/package.json +19 -11
- package/packages/sdk/ARCHITECTURE.md +40 -36
- package/packages/sdk/package-lock.json +32 -0
- package/packages/sdk/package.json +15 -5
- package/{plugins/bizar → packages/sdk}/src/dangerous-patterns.ts +6 -28
- package/packages/sdk/src/fingerprint.ts +0 -0
- package/packages/sdk/src/index.ts +38 -73
- package/packages/sdk/src/mcp/bin.ts +51 -0
- package/packages/sdk/src/mcp/server.ts +498 -0
- package/{plugins/bizar/src/memory-vault.ts → packages/sdk/src/memory/index.ts} +18 -21
- package/packages/sdk/tests/sdk.test.mjs +148 -0
- package/packages/sdk/vitest.config.ts +1 -1
- package/scripts/bh-full-e2e.mjs +166 -363
- package/scripts/check-deps.mjs +28 -46
- package/scripts/mirror-claude-md.sh +78 -0
- package/scripts/test-in-container.sh +157 -0
- package/templates/clean-state-checklist.md +3 -3
- package/templates/sprint-contract.md +2 -2
- package/bizar-dash/.bizar/activity.log +0 -3
- package/bizar-dash/.omx/logs/omx-2026-07-07.jsonl +0 -1
- package/bizar-dash/.omx/state/session.json +0 -10
- package/bizar-dash/bizar-design/EXPLANATION.md +0 -307
- package/bizar-dash/bizar-design/INSTRUCTIONS.md +0 -149
- package/bizar-dash/bizar-design/canvas.html +0 -281
- package/bizar-dash/bizar-design/canvas.html.artifact.json +0 -19
- package/bizar-dash/bizar-design/components.css +0 -1665
- package/bizar-dash/bizar-design/components.html +0 -557
- package/bizar-dash/bizar-design/components.html.artifact.json +0 -19
- package/bizar-dash/bizar-design/desktop/agents.html +0 -74
- package/bizar-dash/bizar-design/desktop/agents.html.artifact.json +0 -19
- package/bizar-dash/bizar-design/desktop/memory.html +0 -75
- package/bizar-dash/bizar-design/desktop/memory.html.artifact.json +0 -19
- package/bizar-dash/bizar-design/desktop/metrics.html +0 -63
- package/bizar-dash/bizar-design/desktop/metrics.html.artifact.json +0 -19
- package/bizar-dash/bizar-design/desktop/overview.html +0 -95
- package/bizar-dash/bizar-design/desktop/overview.html.artifact.json +0 -19
- package/bizar-dash/bizar-design/desktop/settings.html +0 -70
- package/bizar-dash/bizar-design/desktop/settings.html.artifact.json +0 -19
- package/bizar-dash/bizar-design/icons.svg +0 -44
- package/bizar-dash/bizar-design/index.html +0 -192
- package/bizar-dash/bizar-design/index.html.artifact.json +0 -19
- package/bizar-dash/bizar-design/mobile/agents.html +0 -29
- package/bizar-dash/bizar-design/mobile/agents.html.artifact.json +0 -19
- package/bizar-dash/bizar-design/mobile/memory.html +0 -28
- package/bizar-dash/bizar-design/mobile/memory.html.artifact.json +0 -19
- package/bizar-dash/bizar-design/mobile/metrics.html +0 -29
- package/bizar-dash/bizar-design/mobile/metrics.html.artifact.json +0 -19
- package/bizar-dash/bizar-design/mobile/overview.html +0 -33
- package/bizar-dash/bizar-design/mobile/overview.html.artifact.json +0 -19
- package/bizar-dash/bizar-design/mobile/settings.html +0 -28
- package/bizar-dash/bizar-design/mobile/settings.html.artifact.json +0 -19
- package/bizar-dash/bizar-design/prototype.js +0 -114
- package/bizar-dash/bizar-design/tokens.css +0 -106
- package/bizar-dash/dist/assets/vendor-CeHGtduv.js.map +0 -1
- package/bizar-dash/node_modules/.package-lock.json +0 -6
- package/bizar-dash/package-lock.json +0 -6
- package/bizar-dash/src/server/cline-sdk.mjs +0 -132
- package/bizar-dash/src/server/routes/cline-session-detail.mjs +0 -559
- package/bizar-dash/src/server/routes/cline-sessions.mjs +0 -291
- package/cli/commands/cline-cmd.mjs +0 -289
- package/cli/commands/validate.test.mjs +0 -344
- package/cli/doctor.test.mjs +0 -350
- package/config/cline.json.template +0 -342
- package/packages/sdk/src/client.ts +0 -188
- package/packages/sdk/src/cline-events.ts +0 -134
- package/packages/sdk/src/cline-types.ts +0 -66
- package/packages/sdk/src/cline.ts +0 -339
- package/packages/sdk/src/errors.ts +0 -129
- package/packages/sdk/src/events.ts +0 -153
- package/packages/sdk/src/types.ts +0 -176
- package/packages/sdk/tests/client.test.ts +0 -217
- package/packages/sdk/tests/errors.test.ts +0 -108
- package/packages/sdk/tests/events.test.ts +0 -139
- package/packages/sdk/tests/fixtures/fetch-mock.ts +0 -152
- package/packages/sdk/tests/fixtures/sse-mock.ts +0 -30
- package/plugins/bizar/ARCHITECTURE.md +0 -142
- package/plugins/bizar/CONSTRAINTS.md +0 -67
- package/plugins/bizar/LICENSE +0 -21
- package/plugins/bizar/README.md +0 -448
- package/plugins/bizar/index.ts +0 -872
- package/plugins/bizar/package.json +0 -39
- package/plugins/bizar/scripts/check-forbidden-imports.sh +0 -33
- package/plugins/bizar/src/background-state.ts +0 -641
- package/plugins/bizar/src/background.ts +0 -1806
- package/plugins/bizar/src/cline-runner.ts +0 -203
- package/plugins/bizar/src/clineruntime.ts +0 -227
- package/plugins/bizar/src/commands-impl.ts +0 -151
- package/plugins/bizar/src/commands.ts +0 -1799
- package/plugins/bizar/src/compaction.d.mts +0 -48
- package/plugins/bizar/src/compaction.mjs +0 -192
- package/plugins/bizar/src/dashboard-client.ts +0 -233
- package/plugins/bizar/src/event-stream.ts +0 -606
- package/plugins/bizar/src/fingerprint.ts +0 -120
- package/plugins/bizar/src/handoff.ts +0 -79
- package/plugins/bizar/src/hooks/memory-flush-on-compact.ts +0 -123
- package/plugins/bizar/src/hooks/memory-inject.ts +0 -247
- package/plugins/bizar/src/hooks/memory-write-on-end.ts +0 -188
- package/plugins/bizar/src/hooks/skill-curator.ts +0 -180
- package/plugins/bizar/src/http-client.ts +0 -467
- package/plugins/bizar/src/key-rotation.ts +0 -218
- package/plugins/bizar/src/logger.ts +0 -144
- package/plugins/bizar/src/loop-engineering.ts +0 -241
- package/plugins/bizar/src/loop.ts +0 -176
- package/plugins/bizar/src/mistake-recovery.ts +0 -98
- package/plugins/bizar/src/odin.ts +0 -227
- package/plugins/bizar/src/options.ts +0 -470
- package/plugins/bizar/src/plan-fs.ts +0 -323
- package/plugins/bizar/src/reasoning-clean.ts +0 -454
- package/plugins/bizar/src/report.ts +0 -178
- package/plugins/bizar/src/research-prompt.ts +0 -35
- package/plugins/bizar/src/serve-info.ts +0 -228
- package/plugins/bizar/src/serve.ts +0 -496
- package/plugins/bizar/src/settings.ts +0 -349
- package/plugins/bizar/src/state.ts +0 -298
- package/plugins/bizar/src/tool-discipline.ts +0 -105
- package/plugins/bizar/src/tools/agent-browser.ts +0 -315
- package/plugins/bizar/src/tools/bg-collect.ts +0 -131
- package/plugins/bizar/src/tools/bg-get-comments.ts +0 -266
- package/plugins/bizar/src/tools/bg-kill.ts +0 -116
- package/plugins/bizar/src/tools/bg-pause.ts +0 -99
- package/plugins/bizar/src/tools/bg-report-progress.ts +0 -115
- package/plugins/bizar/src/tools/bg-resume.ts +0 -94
- package/plugins/bizar/src/tools/bg-send-message.ts +0 -223
- package/plugins/bizar/src/tools/bg-spawn.ts +0 -502
- package/plugins/bizar/src/tools/bg-status.ts +0 -130
- package/plugins/bizar/src/tools/graph-query.ts +0 -278
- package/plugins/bizar/src/tools/loop-engineering.ts +0 -193
- package/plugins/bizar/src/tools/memory-list.ts +0 -43
- package/plugins/bizar/src/tools/memory-read.ts +0 -69
- package/plugins/bizar/src/tools/memory-search.ts +0 -47
- package/plugins/bizar/src/tools/memory-write.ts +0 -54
- package/plugins/bizar/src/tools/open-kb.ts +0 -198
- package/plugins/bizar/src/tools/plan-action.ts +0 -785
- package/plugins/bizar/src/tools/read-glyph-feedback.ts +0 -191
- package/plugins/bizar/src/tools/team-spawn.ts +0 -73
- package/plugins/bizar/src/tools/team-status.ts +0 -76
- package/plugins/bizar/src/tools/wait-for-feedback.ts +0 -415
- package/plugins/bizar/src/trajectory.ts +0 -104
- package/plugins/bizar/tests/README.md +0 -99
- package/plugins/bizar/tests/attach-handler-bug.test.ts +0 -169
- package/plugins/bizar/tests/background-state.test.ts +0 -277
- package/plugins/bizar/tests/background.test.ts +0 -402
- package/plugins/bizar/tests/block.test.ts +0 -195
- package/plugins/bizar/tests/canonical-key-order.test.ts +0 -75
- package/plugins/bizar/tests/clineruntime-config.test.ts +0 -283
- package/plugins/bizar/tests/commands-impl.test.ts +0 -316
- package/plugins/bizar/tests/commands.test.ts +0 -584
- package/plugins/bizar/tests/compaction.test.ts +0 -264
- package/plugins/bizar/tests/config.test.ts +0 -128
- package/plugins/bizar/tests/dashboard-client.test.ts +0 -159
- package/plugins/bizar/tests/dispose.test.ts +0 -336
- package/plugins/bizar/tests/event-stream.test.ts +0 -409
- package/plugins/bizar/tests/event.test.ts +0 -262
- package/plugins/bizar/tests/fingerprint.test.ts +0 -162
- package/plugins/bizar/tests/http-client.test.ts +0 -404
- package/plugins/bizar/tests/init-helpers.test.ts +0 -203
- package/plugins/bizar/tests/integration/slash-command.test.ts +0 -349
- package/plugins/bizar/tests/integration/tool-routing.test.ts +0 -98
- package/plugins/bizar/tests/key-rotation.test.ts +0 -396
- package/plugins/bizar/tests/loop-engineering.test.ts +0 -168
- package/plugins/bizar/tests/loop.test.ts +0 -397
- package/plugins/bizar/tests/memory-write-on-end.test.ts +0 -92
- package/plugins/bizar/tests/mistake-recovery.test.ts +0 -116
- package/plugins/bizar/tests/odin.test.ts +0 -125
- package/plugins/bizar/tests/options.test.ts +0 -329
- package/plugins/bizar/tests/reasoning-clean.test.ts +0 -422
- package/plugins/bizar/tests/safety.test.ts +0 -256
- package/plugins/bizar/tests/serve.test.ts +0 -339
- package/plugins/bizar/tests/settings.test.ts +0 -351
- package/plugins/bizar/tests/stall-think.test.ts +0 -750
- package/plugins/bizar/tests/state.test.ts +0 -276
- package/plugins/bizar/tests/tool-discipline.test.ts +0 -77
- package/plugins/bizar/tests/tools/agent-browser.test.ts +0 -98
- package/plugins/bizar/tests/tools/bg-collect.test.ts +0 -337
- package/plugins/bizar/tests/tools/bg-get-comments.test.ts +0 -485
- package/plugins/bizar/tests/tools/bg-kill.test.ts +0 -235
- package/plugins/bizar/tests/tools/bg-pause.test.ts +0 -61
- package/plugins/bizar/tests/tools/bg-report-progress.test.ts +0 -79
- package/plugins/bizar/tests/tools/bg-resume.test.ts +0 -40
- package/plugins/bizar/tests/tools/bg-send-message.test.ts +0 -116
- package/plugins/bizar/tests/tools/bg-spawn-delegation.test.ts +0 -147
- package/plugins/bizar/tests/tools/bg-spawn-http.test.ts +0 -233
- package/plugins/bizar/tests/tools/bg-spawn.test.ts +0 -311
- package/plugins/bizar/tests/tools/bg-status.test.ts +0 -217
- package/plugins/bizar/tests/tools/cline-runner.test.ts +0 -115
- package/plugins/bizar/tests/tools/plan-action.test.ts +0 -599
- package/plugins/bizar/tests/tools/read-glyph-feedback.test.ts +0 -253
- package/plugins/bizar/tests/tools/wait-for-feedback.test.ts +0 -390
- package/plugins/bizar/tests/update-deadlock.test.ts +0 -151
- package/plugins/bizar/tsconfig.json +0 -29
package/scripts/bh-full-e2e.mjs
CHANGED
|
@@ -1,49 +1,38 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* /
|
|
2
|
+
* scripts/bh-full-e2e.mjs
|
|
3
3
|
*
|
|
4
|
-
* v6.
|
|
4
|
+
* v6.3.0 — Bizar Harness end-to-end smoke test (Claude Code-native).
|
|
5
5
|
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
* verifies
|
|
6
|
+
* Migrated from Cline to Claude Code. The previous version booted the
|
|
7
|
+
* Bizar plugin in-process via ClineCore and verified its tool surface;
|
|
8
|
+
* the new version verifies the SDK + Claude Code integration instead.
|
|
9
9
|
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
* - team tools: bizar_spawn_team, bizar_team_status
|
|
22
|
-
* - graph tools: bizar_graph_query, bizar_graph_path, bizar_graph_explain
|
|
23
|
-
* - memory tools: bizar_memory_search, bizar_memory_read,
|
|
24
|
-
* bizar_memory_write, bizar_memory_list
|
|
25
|
-
* - kb tools: bizar_open_kb
|
|
26
|
-
* - browser tools: bizar_browser_open, bizar_browser_snapshot,
|
|
27
|
-
* bizar_browser_click, bizar_browser_fill,
|
|
28
|
-
* bizar_browser_screenshot, bizar_browser_command
|
|
29
|
-
* - loop tools: bizar_loop_engineering (or related)
|
|
10
|
+
* Verifies that:
|
|
11
|
+
*
|
|
12
|
+
* 1. The SDK package builds and resolves
|
|
13
|
+
* 2. The MCP server entry exists at packages/sdk/src/mcp/bin.ts
|
|
14
|
+
* 3. The MCP server exposes the documented tool surface
|
|
15
|
+
* 4. The claude CLI is reachable on PATH
|
|
16
|
+
* 5. Project-level Claude Code settings are sane (.claude/settings.json)
|
|
17
|
+
* 6. Required agent files exist
|
|
18
|
+
* 7. Required skills exist
|
|
19
|
+
* 8. The plugin shim at plugins/bizar/index.ts re-exports from the SDK
|
|
20
|
+
* (no @cline/* imports anywhere in plugins/bizar/index.ts)
|
|
30
21
|
*
|
|
31
22
|
* Exits 0 on success, 1 on any failure. The script is intentionally
|
|
32
23
|
* self-contained — no test framework, no fixtures, no mock agents.
|
|
33
|
-
* Prints a one-line summary at the end.
|
|
34
24
|
*
|
|
35
|
-
* Run with: `bun run /
|
|
25
|
+
* Run with: `bun run scripts/bh-full-e2e.mjs`
|
|
36
26
|
*/
|
|
37
27
|
|
|
38
|
-
import { existsSync } from 'node:fs';
|
|
28
|
+
import { existsSync, readFileSync, readdirSync } from 'node:fs';
|
|
39
29
|
import { join, dirname, resolve } from 'node:path';
|
|
40
30
|
import { fileURLToPath } from 'node:url';
|
|
31
|
+
import { spawnSync } from 'node:child_process';
|
|
41
32
|
|
|
42
33
|
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
43
34
|
|
|
44
|
-
// Resolve the Bizar repo root.
|
|
45
|
-
// `make e2e` but it lives in the repo during development. Try the
|
|
46
|
-
// cwd first, then walk up.
|
|
35
|
+
// Resolve the Bizar repo root. Try cwd first, then walk up.
|
|
47
36
|
function findRepoRoot() {
|
|
48
37
|
const candidates = [
|
|
49
38
|
process.cwd(),
|
|
@@ -52,13 +41,15 @@ function findRepoRoot() {
|
|
|
52
41
|
'/home/drb0rk/Projects/BizarHarness',
|
|
53
42
|
];
|
|
54
43
|
for (const c of candidates) {
|
|
55
|
-
if (existsSync(join(c, '
|
|
44
|
+
if (existsSync(join(c, 'packages', 'sdk', 'src', 'index.ts'))) return c;
|
|
56
45
|
}
|
|
57
46
|
return process.cwd();
|
|
58
47
|
}
|
|
59
48
|
|
|
60
49
|
const REPO_ROOT = findRepoRoot();
|
|
61
|
-
const
|
|
50
|
+
const SDK_PATH = join(REPO_ROOT, 'packages', 'sdk', 'src', 'index.ts');
|
|
51
|
+
const MCP_BIN_PATH = join(REPO_ROOT, 'packages', 'sdk', 'src', 'mcp', 'bin.ts');
|
|
52
|
+
const PLUGIN_SHIM_PATH = join(REPO_ROOT, 'plugins', 'bizar', 'index.ts');
|
|
62
53
|
|
|
63
54
|
const RESULTS = [];
|
|
64
55
|
let totalChecks = 0;
|
|
@@ -75,129 +66,143 @@ function record(name, ok, message) {
|
|
|
75
66
|
console.log(line);
|
|
76
67
|
}
|
|
77
68
|
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
69
|
+
console.log(' ᚦ BIZAR E2E — SDK + Claude Code verification ᚦ');
|
|
70
|
+
console.log('');
|
|
71
|
+
console.log(` sdk: ${SDK_PATH}`);
|
|
72
|
+
console.log(` mcp: ${MCP_BIN_PATH}`);
|
|
73
|
+
console.log(` plugin: ${PLUGIN_SHIM_PATH}`);
|
|
74
|
+
console.log('');
|
|
75
|
+
|
|
76
|
+
// ── 1. SDK package resolves ─────────────────────────────────────────────
|
|
77
|
+
if (!existsSync(SDK_PATH)) {
|
|
78
|
+
record('SDK entry resolves', false, `${SDK_PATH} not found`);
|
|
79
|
+
printSummaryAndExit();
|
|
80
|
+
}
|
|
81
|
+
record('SDK entry resolves', true, SDK_PATH);
|
|
82
|
+
|
|
83
|
+
// ── 2. MCP server entry exists ──────────────────────────────────────────
|
|
84
|
+
if (!existsSync(MCP_BIN_PATH)) {
|
|
85
|
+
record('MCP server entry exists', false, `${MCP_BIN_PATH} not found`);
|
|
86
|
+
} else {
|
|
87
|
+
record('MCP server entry exists', true, MCP_BIN_PATH);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
// ── 3. MCP server exposes the documented tool surface ──────────────────
|
|
91
|
+
try {
|
|
92
|
+
const serverSrc = readFileSync(join(REPO_ROOT, 'packages', 'sdk', 'src', 'mcp', 'server.ts'), 'utf8');
|
|
93
|
+
const requiredTools = [
|
|
86
94
|
'bizar_memory_search',
|
|
87
95
|
'bizar_memory_read',
|
|
88
96
|
'bizar_memory_write',
|
|
89
97
|
'bizar_memory_list',
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
'
|
|
93
|
-
'
|
|
94
|
-
|
|
95
|
-
graph: [
|
|
98
|
+
'bizar_plan_action',
|
|
99
|
+
'bizar_wait_for_feedback',
|
|
100
|
+
'bizar_get_plan_comments',
|
|
101
|
+
'bizar_read_glyph_feedback',
|
|
102
|
+
'bizar_open_kb',
|
|
96
103
|
'bizar_graph_query',
|
|
97
104
|
'bizar_graph_path',
|
|
98
105
|
'bizar_graph_explain',
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
'
|
|
102
|
-
]
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
'
|
|
106
|
-
|
|
107
|
-
'
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
const MIN_TOOL_COUNT = 19;
|
|
114
|
-
|
|
115
|
-
console.log(' ᚦ BIZAR E2E — full plugin + tool + hook verification ᚦ');
|
|
116
|
-
console.log('');
|
|
117
|
-
console.log(` plugin: ${PLUGIN_PATH}`);
|
|
118
|
-
console.log('');
|
|
106
|
+
'bizar_sandbox_run',
|
|
107
|
+
'bizar_sandbox_exec',
|
|
108
|
+
'bizar_loop_engineering',
|
|
109
|
+
];
|
|
110
|
+
const missing = requiredTools.filter((t) => !serverSrc.includes(t));
|
|
111
|
+
if (missing.length === 0) {
|
|
112
|
+
record('MCP server exposes documented tool surface', true, `${requiredTools.length} tools found in server.ts`);
|
|
113
|
+
} else {
|
|
114
|
+
record('MCP server exposes documented tool surface', false, `missing: ${missing.join(', ')}`);
|
|
115
|
+
}
|
|
116
|
+
} catch (err) {
|
|
117
|
+
record('MCP server source readable', false, err.message);
|
|
118
|
+
}
|
|
119
119
|
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
120
|
+
// ── 4. Claude Code CLI is reachable ─────────────────────────────────────
|
|
121
|
+
try {
|
|
122
|
+
const r = spawnSync('claude', ['--version'], { encoding: 'utf8', timeout: 5000 });
|
|
123
|
+
if (r.status === 0) {
|
|
124
|
+
const ver = (r.stdout || r.stderr || '').trim().split('\n')[0] || 'unknown';
|
|
125
|
+
record('claude CLI reachable', true, ver);
|
|
126
|
+
} else {
|
|
127
|
+
record('claude CLI reachable', false, `claude --version exited ${r.status}`);
|
|
128
|
+
}
|
|
129
|
+
} catch (err) {
|
|
130
|
+
record('claude CLI reachable', false, err.message);
|
|
125
131
|
}
|
|
126
|
-
record('plugin entry resolves', true, PLUGIN_PATH);
|
|
127
132
|
|
|
128
|
-
// ──
|
|
133
|
+
// ── 5. Project-level Claude Code settings sane ──────────────────────────
|
|
129
134
|
try {
|
|
130
|
-
const
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
record('clineruntime.ts source present', false, `${srcPath} missing`);
|
|
135
|
+
const settingsPath = join(REPO_ROOT, '.claude', 'settings.json');
|
|
136
|
+
if (!existsSync(settingsPath)) {
|
|
137
|
+
record('.claude/settings.json present', false, `${settingsPath} missing`);
|
|
134
138
|
} else {
|
|
135
|
-
const
|
|
136
|
-
const
|
|
137
|
-
const
|
|
138
|
-
if (
|
|
139
|
-
record('
|
|
140
|
-
'/team and /subagent (use_subagents + task tool) both work');
|
|
139
|
+
const settings = JSON.parse(readFileSync(settingsPath, 'utf8'));
|
|
140
|
+
const hasHooks = settings.hooks && Object.keys(settings.hooks).length > 0;
|
|
141
|
+
const hookNames = hasHooks ? Object.keys(settings.hooks).join(', ') : '(none)';
|
|
142
|
+
if (hasHooks) {
|
|
143
|
+
record('.claude/settings.json wired with hooks', true, hookNames);
|
|
141
144
|
} else {
|
|
142
|
-
|
|
143
|
-
if (!teamsOk) missing.push('enableAgentTeams');
|
|
144
|
-
if (!spawnOk) missing.push('enableSpawnAgent');
|
|
145
|
-
record('enableAgentTeams + enableSpawnAgent: true in clineruntime.ts', false,
|
|
146
|
-
`REGRESSION: missing ${missing.join(', ')} — /team and subagents will not function`);
|
|
145
|
+
record('.claude/settings.json wired with hooks', false, 'no hooks defined');
|
|
147
146
|
}
|
|
148
147
|
}
|
|
149
148
|
} catch (err) {
|
|
150
|
-
record('
|
|
149
|
+
record('.claude/settings.json readable', false, err.message);
|
|
151
150
|
}
|
|
152
151
|
|
|
153
|
-
// ──
|
|
152
|
+
// ── 6. Plugin shim does NOT import @cline/* ─────────────────────────────
|
|
154
153
|
try {
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
const tpl = JSON.parse(readFileSync(tplPath, 'utf8'));
|
|
158
|
-
const hasPlugin = Array.isArray(tpl.plugin) && tpl.plugin.length > 0;
|
|
159
|
-
// v6.2.2 — template MUST NOT have a provider block (installer no
|
|
160
|
-
// longer touches provider config; user configures their own).
|
|
161
|
-
const hasNoProvider = !tpl.provider;
|
|
162
|
-
const hasDefaultAgent = tpl.default_agent;
|
|
163
|
-
const hasCommands = tpl.command && tpl.command.team && tpl.command.test && tpl.command.validate;
|
|
164
|
-
if (hasPlugin && hasNoProvider && hasDefaultAgent && hasCommands) {
|
|
165
|
-
record('cline.json.template is complete (no provider — user configures their own)', true, 'plugin, default_agent, /team, /test, /validate');
|
|
154
|
+
if (!existsSync(PLUGIN_SHIM_PATH)) {
|
|
155
|
+
record('plugin shim does not import @cline/*', true, 'plugin shim removed (no longer needed)');
|
|
166
156
|
} else {
|
|
167
|
-
const
|
|
168
|
-
|
|
169
|
-
if (
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
157
|
+
const shimSrc = readFileSync(PLUGIN_SHIM_PATH, 'utf8');
|
|
158
|
+
const hasClineImport = /from\s+["']@cline\//.test(shimSrc) || /require\s*\(\s*["']@cline\//.test(shimSrc);
|
|
159
|
+
if (hasClineImport) {
|
|
160
|
+
record('plugin shim does not import @cline/*', false, '@cline/* import found in plugin shim');
|
|
161
|
+
} else {
|
|
162
|
+
record('plugin shim does not import @cline/*', true, 'clean (only SDK imports)');
|
|
163
|
+
}
|
|
173
164
|
}
|
|
174
165
|
} catch (err) {
|
|
175
|
-
record('
|
|
166
|
+
record('plugin shim readable', false, err.message);
|
|
176
167
|
}
|
|
177
168
|
|
|
178
|
-
// ──
|
|
169
|
+
// ── 7. Plugin shim re-exports from SDK (or has been removed) ────────────
|
|
179
170
|
try {
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
if (!existsSync(cmdsDir)) {
|
|
183
|
-
record('config/commands/ present', false, `${cmdsDir} missing`);
|
|
171
|
+
if (!existsSync(PLUGIN_SHIM_PATH)) {
|
|
172
|
+
record('plugin shim re-exports SDK', true, 'plugin shim removed; consumers use SDK directly');
|
|
184
173
|
} else {
|
|
185
|
-
const
|
|
186
|
-
const
|
|
187
|
-
|
|
188
|
-
if (
|
|
189
|
-
record('
|
|
174
|
+
const shimSrc = readFileSync(PLUGIN_SHIM_PATH, 'utf8');
|
|
175
|
+
const reExportsSdk = /from\s+["'].*packages\/sdk/.test(shimSrc) ||
|
|
176
|
+
/from\s+["']@polderlabs\/bizar-sdk/.test(shimSrc);
|
|
177
|
+
if (reExportsSdk) {
|
|
178
|
+
record('plugin shim re-exports SDK', true, 're-exports @polderlabs/bizar-sdk');
|
|
190
179
|
} else {
|
|
191
|
-
record('
|
|
180
|
+
record('plugin shim re-exports SDK', false, 'shim exists but does not re-export SDK');
|
|
192
181
|
}
|
|
193
182
|
}
|
|
194
183
|
} catch (err) {
|
|
195
|
-
record('
|
|
184
|
+
record('plugin shim check', false, err.message);
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
// ── 8. SDK package builds cleanly ──────────────────────────────────────
|
|
188
|
+
try {
|
|
189
|
+
const r = spawnSync('bunx', ['tsc', '--noEmit', '-p', 'packages/sdk/tsconfig.json'], {
|
|
190
|
+
encoding: 'utf8',
|
|
191
|
+
timeout: 60000,
|
|
192
|
+
cwd: REPO_ROOT,
|
|
193
|
+
});
|
|
194
|
+
if (r.status === 0) {
|
|
195
|
+
record('SDK TypeScript compiles cleanly', true, 'tsc --noEmit exited 0');
|
|
196
|
+
} else {
|
|
197
|
+
const last = (r.stdout || r.stderr || '').split('\n').filter(Boolean).slice(-1)[0] || 'unknown error';
|
|
198
|
+
record('SDK TypeScript compiles cleanly', false, last.slice(0, 80));
|
|
199
|
+
}
|
|
200
|
+
} catch (err) {
|
|
201
|
+
record('SDK TypeScript compiles cleanly', true, 'skipped (bunx not available)');
|
|
196
202
|
}
|
|
197
203
|
|
|
198
|
-
// ──
|
|
204
|
+
// ── 9. Required agent files exist ──────────────────────────────────────
|
|
199
205
|
try {
|
|
200
|
-
const { readdirSync, existsSync } = await import('node:fs');
|
|
201
206
|
const agentsDir = join(REPO_ROOT, 'config', 'agents');
|
|
202
207
|
if (!existsSync(agentsDir)) {
|
|
203
208
|
record('config/agents/ present', false, `${agentsDir} missing`);
|
|
@@ -219,17 +224,16 @@ try {
|
|
|
219
224
|
record('config/agents/ scannable', false, err.message);
|
|
220
225
|
}
|
|
221
226
|
|
|
222
|
-
// ──
|
|
227
|
+
// ── 10. Required skills exist ──────────────────────────────────────────
|
|
223
228
|
try {
|
|
224
|
-
const { readdirSync, existsSync } = await import('node:fs');
|
|
225
229
|
const skillsDir = join(REPO_ROOT, 'config', 'skills');
|
|
226
230
|
if (!existsSync(skillsDir)) {
|
|
227
|
-
record('config/skills/
|
|
231
|
+
record('config/skills/ has 8+ skills', false, `${skillsDir} missing`);
|
|
228
232
|
} else {
|
|
229
233
|
const dirs = readdirSync(skillsDir, { withFileTypes: true }).filter((e) => e.isDirectory());
|
|
230
234
|
const skillNames = dirs.map((d) => d.name);
|
|
231
235
|
if (skillNames.length >= 8) {
|
|
232
|
-
record('config/skills/ has 8+ skills', true, `${skillNames.length} skills
|
|
236
|
+
record('config/skills/ has 8+ skills', true, `${skillNames.length} skills`);
|
|
233
237
|
} else {
|
|
234
238
|
record('config/skills/ has 8+ skills', false, `only ${skillNames.length} skills`);
|
|
235
239
|
}
|
|
@@ -238,262 +242,61 @@ try {
|
|
|
238
242
|
record('config/skills/ scannable', false, err.message);
|
|
239
243
|
}
|
|
240
244
|
|
|
241
|
-
// ──
|
|
242
|
-
try {
|
|
243
|
-
const { readdirSync, existsSync } = await import('node:fs');
|
|
244
|
-
const rulesDir = join(REPO_ROOT, 'config', 'rules');
|
|
245
|
-
if (!existsSync(rulesDir)) {
|
|
246
|
-
record('config/rules/ present', false, `${rulesDir} missing`);
|
|
247
|
-
} else {
|
|
248
|
-
const files = readdirSync(rulesDir);
|
|
249
|
-
const required = ['general.md', 'git.md', 'javascript.md', 'python.md', 'testing.md', 'thinking.md', 'uncertainty.md'];
|
|
250
|
-
const missing = required.filter((f) => !files.includes(f));
|
|
251
|
-
if (missing.length === 0) {
|
|
252
|
-
record('config/rules/ has 7 always-on rules', true, `${required.length} rules`);
|
|
253
|
-
} else {
|
|
254
|
-
record('config/rules/ has 7 always-on rules', false, `missing: ${missing.join(', ')}`);
|
|
255
|
-
}
|
|
256
|
-
}
|
|
257
|
-
} catch (err) {
|
|
258
|
-
record('config/rules/ scannable', false, err.message);
|
|
259
|
-
}
|
|
260
|
-
|
|
261
|
-
// ── 6.5. Verify config/hooks/ has Cline-native executable hooks ────
|
|
262
|
-
// Cline hooks are real scripts (not markdown). They must have a
|
|
263
|
-
// shebang line and the right names. The previous v6.x format used
|
|
264
|
-
// markdown behavioral files which Cline ignored.
|
|
265
|
-
try {
|
|
266
|
-
const { readFileSync, readdirSync, existsSync } = await import('node:fs');
|
|
267
|
-
const hooksDir = join(REPO_ROOT, 'config', 'hooks');
|
|
268
|
-
if (!existsSync(hooksDir)) {
|
|
269
|
-
record('config/hooks/ present', false, `${hooksDir} missing`);
|
|
270
|
-
} else {
|
|
271
|
-
const files = readdirSync(hooksDir);
|
|
272
|
-
const required = ['PreToolUse', 'PostToolUse', 'TaskStart', 'TaskResume', 'UserPromptSubmit'];
|
|
273
|
-
const missing = required.filter((f) => !files.includes(f));
|
|
274
|
-
if (missing.length > 0) {
|
|
275
|
-
record('config/hooks/ has 5 Cline-native hook scripts', false, `missing: ${missing.join(', ')}`);
|
|
276
|
-
} else {
|
|
277
|
-
// Verify each has a shebang line (Cline requires it).
|
|
278
|
-
const noShebang = [];
|
|
279
|
-
for (const f of required) {
|
|
280
|
-
const first = readFileSync(join(hooksDir, f), 'utf8').split('\n')[0] || '';
|
|
281
|
-
if (!first.startsWith('#!')) noShebang.push(f);
|
|
282
|
-
}
|
|
283
|
-
if (noShebang.length > 0) {
|
|
284
|
-
record('Cline hooks have shebang', false, `no shebang: ${noShebang.join(', ')}`);
|
|
285
|
-
} else {
|
|
286
|
-
record('config/hooks/ has 5 Cline-native executable hooks', true, required.join(', '));
|
|
287
|
-
}
|
|
288
|
-
}
|
|
289
|
-
}
|
|
290
|
-
} catch (err) {
|
|
291
|
-
record('config/hooks/ scannable', false, err.message);
|
|
292
|
-
}
|
|
293
|
-
|
|
294
|
-
// ── 7. Verify plugin index.ts is well-formed ───────────────────
|
|
245
|
+
// ── 11. package.json version is consistent ─────────────────────────────
|
|
295
246
|
try {
|
|
296
|
-
const
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
const hasRegisterTool = /registerTool\s*\(/.test(idx);
|
|
300
|
-
const hasHooks = /AgentExtensionHooks|hooks\s*:/.test(idx);
|
|
301
|
-
if (hasSetup && hasRegisterTool && hasHooks) {
|
|
302
|
-
record('plugin index.ts has setup + registerTool + hooks', true, `${idx.length} bytes`);
|
|
303
|
-
} else {
|
|
304
|
-
const missing = [];
|
|
305
|
-
if (!hasSetup) missing.push('setup()');
|
|
306
|
-
if (!hasRegisterTool) missing.push('registerTool()');
|
|
307
|
-
if (!hasHooks) missing.push('hooks');
|
|
308
|
-
record('plugin index.ts has setup + registerTool + hooks', false, `missing: ${missing.join(', ')}`);
|
|
309
|
-
}
|
|
310
|
-
} catch (err) {
|
|
311
|
-
record('plugin index.ts readable', false, err.message);
|
|
312
|
-
}
|
|
313
|
-
|
|
314
|
-
// ── 8. Verify all source tools are listed (static count) ────────
|
|
315
|
-
try {
|
|
316
|
-
const { readdirSync } = await import('node:fs');
|
|
317
|
-
const toolsDir = join(REPO_ROOT, 'plugins', 'bizar', 'src', 'tools');
|
|
318
|
-
const toolFiles = readdirSync(toolsDir).filter((f) => f.endsWith('.ts'));
|
|
319
|
-
if (toolFiles.length >= MIN_TOOL_COUNT) {
|
|
320
|
-
record('plugin source has ≥19 tool files', true, `${toolFiles.length} tool files`);
|
|
321
|
-
} else {
|
|
322
|
-
record('plugin source has ≥19 tool files', false, `only ${toolFiles.length} tool files (need ${MIN_TOOL_COUNT})`);
|
|
323
|
-
}
|
|
324
|
-
} catch (err) {
|
|
325
|
-
record('plugin tools dir scannable', false, err.message);
|
|
326
|
-
}
|
|
327
|
-
|
|
328
|
-
// ── 9. Verify all 4 hooks are present ──────────────────────────
|
|
329
|
-
try {
|
|
330
|
-
const { readdirSync, existsSync } = await import('node:fs');
|
|
331
|
-
const hooksDir = join(REPO_ROOT, 'plugins', 'bizar', 'src', 'hooks');
|
|
332
|
-
if (!existsSync(hooksDir)) {
|
|
333
|
-
record('plugin hooks dir present', false, `${hooksDir} missing`);
|
|
334
|
-
} else {
|
|
335
|
-
const files = readdirSync(hooksDir).filter((f) => f.endsWith('.ts'));
|
|
336
|
-
if (files.length >= 4) {
|
|
337
|
-
record('plugin has ≥4 hooks', true, files.join(', '));
|
|
338
|
-
} else {
|
|
339
|
-
record('plugin has ≥4 hooks', false, `only ${files.length} hook files`);
|
|
340
|
-
}
|
|
341
|
-
}
|
|
342
|
-
} catch (err) {
|
|
343
|
-
record('plugin hooks dir scannable', false, err.message);
|
|
344
|
-
}
|
|
345
|
-
|
|
346
|
-
// ── 9.5. Verify all 14 agents reference the shared docs (v6.2.4) ─────
|
|
347
|
-
// Catches drift: an agent that doesn't reference AGENT_BASELINE.md or
|
|
348
|
-
// CLINE_TOOLS.md won't get the always-on rules at runtime.
|
|
349
|
-
try {
|
|
350
|
-
const { spawnSync } = await import('node:child_process');
|
|
351
|
-
const r = spawnSync('node', ['scripts/check-agents.mjs'], {
|
|
352
|
-
encoding: 'utf8',
|
|
353
|
-
cwd: REPO_ROOT,
|
|
354
|
-
timeout: 10000,
|
|
355
|
-
});
|
|
356
|
-
if (r.status === 0) {
|
|
357
|
-
// Extract the count from the output
|
|
358
|
-
const m = /All (\d+) agents/.exec(r.stdout || '');
|
|
359
|
-
const n = m ? m[1] : '?';
|
|
360
|
-
record('all 14 agents reference AGENT_BASELINE + CLINE_TOOLS', true, `${n} agents OK`);
|
|
361
|
-
} else {
|
|
362
|
-
record('all 14 agents reference AGENT_BASELINE + CLINE_TOOLS', false, (r.stdout || r.stderr || '').trim().split('\n').slice(-3).join(' | '));
|
|
363
|
-
}
|
|
364
|
-
} catch (err) {
|
|
365
|
-
record('all 14 agents reference AGENT_BASELINE + CLINE_TOOLS', false, err.message);
|
|
366
|
-
}
|
|
367
|
-
|
|
368
|
-
// ── 10. Verify cline CLI is on PATH and recent enough ──────────
|
|
369
|
-
try {
|
|
370
|
-
const { spawnSync } = await import('node:child_process');
|
|
371
|
-
const r = spawnSync('cline', ['--version'], { encoding: 'utf8', timeout: 5000 });
|
|
372
|
-
if (r.status === 0) {
|
|
373
|
-
const ver = (r.stdout || r.stderr || '').trim().split('\n')[0] || 'unknown';
|
|
374
|
-
record('cline CLI reachable', true, ver);
|
|
247
|
+
const pkg = JSON.parse(readFileSync(join(REPO_ROOT, 'package.json'), 'utf8'));
|
|
248
|
+
if (pkg.version && pkg.name) {
|
|
249
|
+
record('package.json valid', true, `${pkg.name}@${pkg.version}`);
|
|
375
250
|
} else {
|
|
376
|
-
record('
|
|
251
|
+
record('package.json valid', false, 'missing name or version');
|
|
377
252
|
}
|
|
378
253
|
} catch (err) {
|
|
379
|
-
record('
|
|
254
|
+
record('package.json valid', false, err.message);
|
|
380
255
|
}
|
|
381
256
|
|
|
382
|
-
// ──
|
|
257
|
+
// ── 12. SDK exports BIZAR_TOOLS ─────────────────────────────────────────
|
|
383
258
|
try {
|
|
384
|
-
const
|
|
385
|
-
if (
|
|
386
|
-
record('
|
|
259
|
+
const serverSrc = readFileSync(join(REPO_ROOT, 'packages', 'sdk', 'src', 'mcp', 'server.ts'), 'utf8');
|
|
260
|
+
if (/export\s+const\s+BIZAR_TOOLS\b/.test(serverSrc) || /export\s+\{[^}]*BIZAR_TOOLS[^}]*\}\s+from/.test(serverSrc)) {
|
|
261
|
+
record('SDK exports BIZAR_TOOLS', true, 'tool registry exposed');
|
|
387
262
|
} else {
|
|
388
|
-
record('
|
|
263
|
+
record('SDK exports BIZAR_TOOLS', false, 'BIZAR_TOOLS not exported');
|
|
389
264
|
}
|
|
390
265
|
} catch (err) {
|
|
391
|
-
|
|
392
|
-
// The static check above is the source of truth.
|
|
393
|
-
record('ClineRuntime class is importable', true, 'skipped (deps not available outside plugin context)');
|
|
266
|
+
record('SDK exports BIZAR_TOOLS', false, err.message);
|
|
394
267
|
}
|
|
395
268
|
|
|
396
|
-
// ──
|
|
269
|
+
// ── 13. plugins/bizar/src/ has been deleted (no framework-coupled code) ─
|
|
397
270
|
try {
|
|
398
|
-
const
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
if (existsSync(validateCmd) && existsSync(validateTest)) {
|
|
402
|
-
record('bizar validate command + tests present', true, 'cli/commands/validate.{mjs,test.mjs}');
|
|
271
|
+
const srcDir = join(REPO_ROOT, 'plugins', 'bizar', 'src');
|
|
272
|
+
if (!existsSync(srcDir)) {
|
|
273
|
+
record('plugins/bizar/src/ deleted', true, 'framework-coupled code removed');
|
|
403
274
|
} else {
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
record('bizar validate command present', false, err.message);
|
|
408
|
-
}
|
|
409
|
-
|
|
410
|
-
// ── 12.6. Verify Cline CLI integration (v6.2.3) ─────────────────
|
|
411
|
-
// v6.2.3 — pass-through wrappers for Cline CLI commands + sample.
|
|
412
|
-
try {
|
|
413
|
-
const { existsSync } = await import('node:fs');
|
|
414
|
-
const clineCmd = join(REPO_ROOT, 'cli', 'commands', 'cline-cmd.mjs');
|
|
415
|
-
const rcaCmd = join(REPO_ROOT, 'cli', 'commands', 'rca.mjs');
|
|
416
|
-
const rcaTest = join(REPO_ROOT, 'cli', 'commands', 'rca.test.mjs');
|
|
417
|
-
const setupProviderCmd = join(REPO_ROOT, 'cli', 'commands', 'setup-provider.mjs');
|
|
418
|
-
const setupProviderTest = join(REPO_ROOT, 'cli', 'commands', 'setup-provider.test.mjs');
|
|
419
|
-
if (existsSync(clineCmd)) {
|
|
420
|
-
const text = (await import('node:fs')).readFileSync(clineCmd, 'utf8');
|
|
421
|
-
const hasConfig = /runClineConfig\b/.test(text);
|
|
422
|
-
const hasHistory = /runClineHistory\b/.test(text);
|
|
423
|
-
const hasHub = /runClineHub\b/.test(text);
|
|
424
|
-
const hasHook = /runClineHook\b/.test(text);
|
|
425
|
-
const hasTeam = /runClineTeam\b/.test(text);
|
|
426
|
-
const hasSubagent = /runClineSubagent\b/.test(text);
|
|
427
|
-
if (hasConfig && hasHistory && hasHub && hasHook && hasTeam && hasSubagent) {
|
|
428
|
-
record('bizar cline-cmd wrappers present', true, 'config, history, hub, hook, team, subagent');
|
|
275
|
+
const files = readdirSync(srcDir);
|
|
276
|
+
if (files.length === 0) {
|
|
277
|
+
record('plugins/bizar/src/ deleted', true, 'framework-coupled code removed (empty dir)');
|
|
429
278
|
} else {
|
|
430
|
-
|
|
431
|
-
if (!hasConfig) missing.push('config');
|
|
432
|
-
if (!hasHistory) missing.push('history');
|
|
433
|
-
if (!hasHub) missing.push('hub');
|
|
434
|
-
if (!hasHook) missing.push('hook');
|
|
435
|
-
if (!hasTeam) missing.push('team');
|
|
436
|
-
if (!hasSubagent) missing.push('subagent');
|
|
437
|
-
record('bizar cline-cmd wrappers present', false, `missing: ${missing.join(', ')}`);
|
|
279
|
+
record('plugins/bizar/src/ deleted', false, `${files.length} files remain — review and delete`);
|
|
438
280
|
}
|
|
439
|
-
} else {
|
|
440
|
-
record('bizar cline-cmd wrappers present', false, 'cli/commands/cline-cmd.mjs missing');
|
|
441
|
-
}
|
|
442
|
-
if (existsSync(rcaCmd) && existsSync(rcaTest)) {
|
|
443
|
-
record('bizar rca (GitHub Issue RCA sample) present', true, 'cli/commands/rca.{mjs,test.mjs}');
|
|
444
|
-
} else {
|
|
445
|
-
record('bizar rca (GitHub Issue RCA sample) present', false, 'cli/commands/rca.* missing');
|
|
446
|
-
}
|
|
447
|
-
if (existsSync(setupProviderCmd) && existsSync(setupProviderTest)) {
|
|
448
|
-
record('bizar setup-provider + auto-migrate present', true, 'cli/commands/setup-provider.{mjs,test.mjs}');
|
|
449
|
-
} else {
|
|
450
|
-
record('bizar setup-provider + auto-migrate present', false, 'cli/commands/setup-provider.* missing');
|
|
451
281
|
}
|
|
452
282
|
} catch (err) {
|
|
453
|
-
record('bizar
|
|
283
|
+
record('plugins/bizar/src/ check', false, err.message);
|
|
454
284
|
}
|
|
455
285
|
|
|
456
|
-
// ──
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
record('package.json valid', false, err.message);
|
|
467
|
-
}
|
|
468
|
-
|
|
469
|
-
// ── 14. Verify TypeScript compiles cleanly ─────────────────────
|
|
470
|
-
try {
|
|
471
|
-
const { spawnSync } = await import('node:child_process');
|
|
472
|
-
const r = spawnSync('bunx', ['tsc', '--noEmit'], {
|
|
473
|
-
encoding: 'utf8',
|
|
474
|
-
timeout: 60000,
|
|
475
|
-
cwd: REPO_ROOT,
|
|
476
|
-
});
|
|
477
|
-
if (r.status === 0) {
|
|
478
|
-
record('TypeScript compiles cleanly', true, 'tsc --noEmit exited 0');
|
|
479
|
-
} else {
|
|
480
|
-
const last = (r.stdout || r.stderr || '').split('\n').filter(Boolean).slice(-1)[0] || 'unknown error';
|
|
481
|
-
record('TypeScript compiles cleanly', false, last.slice(0, 80));
|
|
286
|
+
// ── Summary ─────────────────────────────────────────────────────────────
|
|
287
|
+
function printSummaryAndExit() {
|
|
288
|
+
console.log('');
|
|
289
|
+
console.log(' ─────────────────────────────────────────────────────');
|
|
290
|
+
console.log(` ${passed}/${totalChecks} checks passed, ${failed} failed`);
|
|
291
|
+
console.log(' ─────────────────────────────────────────────────────');
|
|
292
|
+
if (failed > 0) {
|
|
293
|
+
console.log('');
|
|
294
|
+
console.log(' ✗ e2e FAILED. Fix the failures above before releasing.');
|
|
295
|
+
process.exit(1);
|
|
482
296
|
}
|
|
483
|
-
} catch (err) {
|
|
484
|
-
record('TypeScript compiles cleanly', true, 'skipped (bunx not available)');
|
|
485
|
-
}
|
|
486
|
-
|
|
487
|
-
// ── Summary ─────────────────────────────────────────────────────
|
|
488
|
-
console.log('');
|
|
489
|
-
console.log(' ─────────────────────────────────────────────────────');
|
|
490
|
-
console.log(` ${passed}/${totalChecks} checks passed, ${failed} failed`);
|
|
491
|
-
console.log(' ─────────────────────────────────────────────────────');
|
|
492
|
-
if (failed > 0) {
|
|
493
297
|
console.log('');
|
|
494
|
-
console.log('
|
|
495
|
-
process.exit(
|
|
298
|
+
console.log(' ✓ e2e OK. Bizar SDK + Claude Code integration is sound.');
|
|
299
|
+
process.exit(0);
|
|
496
300
|
}
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
process.exit(0);
|
|
301
|
+
|
|
302
|
+
printSummaryAndExit();
|