@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.
- 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 +17 -18
- package/cli/commands/claude-cmd.mjs +348 -0
- package/cli/commands/install.mjs +12 -11
- package/cli/commands/validate.mjs +252 -325
- 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 +224 -227
- package/cli/utils.mjs +72 -58
- package/config/AGENTS.md +28 -28
- 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 +31 -9
- 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 -379
- 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 -925
- 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/sandbox.ts +0 -232
- 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 -190
- 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 -281
- 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/sandbox.test.ts +0 -117
- 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/mirror-agents-md.sh +0 -69
package/cli/doctor.test.mjs
DELETED
|
@@ -1,350 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* cli/doctor.test.mjs
|
|
3
|
-
*
|
|
4
|
-
* Tests for the `bizar doctor` subcommand. Uses Node's built-in
|
|
5
|
-
* node:test (no external test framework).
|
|
6
|
-
*
|
|
7
|
-
* Strategy: mock HOME so clineConfigDir() resolves inside a
|
|
8
|
-
* tmpdir, and craft the cline.json + agents/ directory to drive
|
|
9
|
-
* specific pass/fail outcomes. For checks that depend on global
|
|
10
|
-
* npm-installed packages or external CLIs (e.g. cline --version,
|
|
11
|
-
* npm root -g, which headroom), we accept that they may pass or fail
|
|
12
|
-
* depending on the test environment and just verify the framework
|
|
13
|
-
* returns the right shape.
|
|
14
|
-
*/
|
|
15
|
-
import { test, describe, beforeEach, afterEach } from 'node:test';
|
|
16
|
-
import assert from 'node:assert/strict';
|
|
17
|
-
import {
|
|
18
|
-
mkdtempSync,
|
|
19
|
-
mkdirSync,
|
|
20
|
-
writeFileSync,
|
|
21
|
-
rmSync,
|
|
22
|
-
existsSync,
|
|
23
|
-
utimesSync,
|
|
24
|
-
} from 'node:fs';
|
|
25
|
-
import { tmpdir } from 'node:os';
|
|
26
|
-
import { join, dirname } from 'node:path';
|
|
27
|
-
import { fileURLToPath } from 'node:url';
|
|
28
|
-
|
|
29
|
-
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
30
|
-
const PROJECT_ROOT = join(__dirname, '..');
|
|
31
|
-
|
|
32
|
-
const { runDoctor } = await import('./doctor.mjs');
|
|
33
|
-
|
|
34
|
-
// ── HOME mocking ────────────────────────────────────────────────────────────
|
|
35
|
-
|
|
36
|
-
const ORIG_HOME = process.env.HOME;
|
|
37
|
-
const ORIG_XDG = process.env.XDG_CONFIG_HOME;
|
|
38
|
-
|
|
39
|
-
/**
|
|
40
|
-
* Mock HOME so clineConfigDir() resolves to `<tmpdir>/.cline`.
|
|
41
|
-
* Returns the tmpdir path.
|
|
42
|
-
*
|
|
43
|
-
* We don't set XDG_CONFIG_HOME here for the same reason as dev-link.test.mjs:
|
|
44
|
-
* the helper treats a set XDG_CONFIG_HOME as the direct parent (so
|
|
45
|
-
* `XDG_CONFIG_HOME=~/.config` → `~/.cline`).
|
|
46
|
-
*/
|
|
47
|
-
function freshHome() {
|
|
48
|
-
const home = mkdtempSync(join(tmpdir(), 'bizar-doctor-'));
|
|
49
|
-
process.env.HOME = home;
|
|
50
|
-
delete process.env.CLINE_DIR;
|
|
51
|
-
delete process.env.BIZAR_LEGACY_CLINE_DIR;
|
|
52
|
-
return home;
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
afterEach(() => {
|
|
56
|
-
if (ORIG_HOME === undefined) delete process.env.HOME;
|
|
57
|
-
else process.env.HOME = ORIG_HOME;
|
|
58
|
-
if (ORIG_XDG === undefined) {
|
|
59
|
-
delete process.env.CLINE_DIR;
|
|
60
|
-
delete process.env.BIZAR_LEGACY_CLINE_DIR;
|
|
61
|
-
} else {
|
|
62
|
-
process.env.XDG_CONFIG_HOME = ORIG_XDG;
|
|
63
|
-
}
|
|
64
|
-
});
|
|
65
|
-
|
|
66
|
-
// ── Shape & silent-mode tests ───────────────────────────────────────────────
|
|
67
|
-
|
|
68
|
-
describe('runDoctor() shape', () => {
|
|
69
|
-
let home;
|
|
70
|
-
|
|
71
|
-
beforeEach(() => {
|
|
72
|
-
home = freshHome();
|
|
73
|
-
});
|
|
74
|
-
|
|
75
|
-
afterEach(() => {
|
|
76
|
-
if (home && existsSync(home)) rmSync(home, { recursive: true, force: true });
|
|
77
|
-
});
|
|
78
|
-
|
|
79
|
-
test('returns { passed, failed, results }', async () => {
|
|
80
|
-
const result = await runDoctor({ silent: true });
|
|
81
|
-
assert.equal(typeof result.passed, 'number');
|
|
82
|
-
assert.equal(typeof result.failed, 'number');
|
|
83
|
-
assert.ok(Array.isArray(result.results));
|
|
84
|
-
// results should have one entry per check
|
|
85
|
-
assert.equal(result.results.length, 9);
|
|
86
|
-
assert.equal(result.passed + result.failed, 9);
|
|
87
|
-
// Each result has the expected fields
|
|
88
|
-
for (const r of result.results) {
|
|
89
|
-
assert.equal(typeof r.name, 'string');
|
|
90
|
-
assert.equal(typeof r.ok, 'boolean');
|
|
91
|
-
assert.equal(typeof r.message, 'string');
|
|
92
|
-
}
|
|
93
|
-
});
|
|
94
|
-
|
|
95
|
-
test('silent mode suppresses per-check output but still prints summary on failure', async () => {
|
|
96
|
-
// Capture stdout by overriding console.log.
|
|
97
|
-
const lines = [];
|
|
98
|
-
const origLog = console.log;
|
|
99
|
-
console.log = (...args) => {
|
|
100
|
-
lines.push(args.join(' '));
|
|
101
|
-
};
|
|
102
|
-
|
|
103
|
-
try {
|
|
104
|
-
// Empty home → many checks will fail → summary should print.
|
|
105
|
-
const result = await runDoctor({ silent: true });
|
|
106
|
-
assert.ok(result.failed > 0, 'precondition: some checks should fail');
|
|
107
|
-
} finally {
|
|
108
|
-
console.log = origLog;
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
// In silent mode with failures, only the summary line should print
|
|
112
|
-
// (an empty leading line is also fine — it's a visual separator).
|
|
113
|
-
const summaryLines = lines.filter((l) => /checks passed.*failed/.test(l));
|
|
114
|
-
assert.equal(
|
|
115
|
-
summaryLines.length,
|
|
116
|
-
1,
|
|
117
|
-
`expected exactly 1 summary line in silent+failed mode, got ${summaryLines.length}:\n${lines.join('\n')}`,
|
|
118
|
-
);
|
|
119
|
-
assert.match(summaryLines[0], /checks passed.*failed/);
|
|
120
|
-
});
|
|
121
|
-
|
|
122
|
-
test('silent mode suppresses ALL output when nothing fails', async () => {
|
|
123
|
-
// Build a fully healthy environment. We can't make cline reachable
|
|
124
|
-
// or headroom installed without modifying PATH, so we settle for: no failures
|
|
125
|
-
// means no output at all. Since we know some checks will fail in a
|
|
126
|
-
// bare tmpdir, this test is structured to assert the negative case
|
|
127
|
-
// differently: we verify silent+no-fail produces 0 lines.
|
|
128
|
-
//
|
|
129
|
-
// For this we mock nothing — the test just confirms the framework
|
|
130
|
-
// doesn't print per-check lines when silent is true.
|
|
131
|
-
const lines = [];
|
|
132
|
-
const origLog = console.log;
|
|
133
|
-
console.log = (...args) => {
|
|
134
|
-
lines.push(args.join(' '));
|
|
135
|
-
};
|
|
136
|
-
|
|
137
|
-
try {
|
|
138
|
-
await runDoctor({ silent: true });
|
|
139
|
-
// Some checks failed (because the env isn't fully healthy).
|
|
140
|
-
// What we want to verify is that per-check lines did NOT print.
|
|
141
|
-
const perCheckLines = lines.filter((l) =>
|
|
142
|
-
/^\s+[✓✗]\s/.test(l) // chalk check markers
|
|
143
|
-
);
|
|
144
|
-
assert.equal(
|
|
145
|
-
perCheckLines.length,
|
|
146
|
-
0,
|
|
147
|
-
`silent mode should suppress per-check output, got:\n${perCheckLines.join('\n')}`,
|
|
148
|
-
);
|
|
149
|
-
} finally {
|
|
150
|
-
console.log = origLog;
|
|
151
|
-
}
|
|
152
|
-
});
|
|
153
|
-
|
|
154
|
-
test('non-silent mode prints per-check output', async () => {
|
|
155
|
-
const lines = [];
|
|
156
|
-
const origLog = console.log;
|
|
157
|
-
console.log = (...args) => {
|
|
158
|
-
lines.push(args.join(' '));
|
|
159
|
-
};
|
|
160
|
-
|
|
161
|
-
try {
|
|
162
|
-
await runDoctor();
|
|
163
|
-
} finally {
|
|
164
|
-
console.log = origLog;
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
// Should have at least 9 per-check lines plus the summary.
|
|
168
|
-
const perCheckLines = lines.filter((l) => /^\s+[✓✗]\s/.test(l));
|
|
169
|
-
assert.ok(
|
|
170
|
-
perCheckLines.length >= 9,
|
|
171
|
-
`expected ≥9 per-check lines, got ${perCheckLines.length}`,
|
|
172
|
-
);
|
|
173
|
-
});
|
|
174
|
-
});
|
|
175
|
-
|
|
176
|
-
// ── Fixture-driven pass/fail tests ──────────────────────────────────────────
|
|
177
|
-
|
|
178
|
-
describe('runDoctor() with fixture HOME', () => {
|
|
179
|
-
let home;
|
|
180
|
-
|
|
181
|
-
beforeEach(() => {
|
|
182
|
-
home = freshHome();
|
|
183
|
-
});
|
|
184
|
-
|
|
185
|
-
afterEach(() => {
|
|
186
|
-
if (home && existsSync(home)) rmSync(home, { recursive: true, force: true });
|
|
187
|
-
});
|
|
188
|
-
|
|
189
|
-
function writeClineConfig(json) {
|
|
190
|
-
const cfgDir = join(home, '.cline');
|
|
191
|
-
mkdirSync(cfgDir, { recursive: true });
|
|
192
|
-
writeFileSync(join(cfgDir, 'cline.json'), JSON.stringify(json), 'utf8');
|
|
193
|
-
return cfgDir;
|
|
194
|
-
}
|
|
195
|
-
|
|
196
|
-
function writeAgents(...files) {
|
|
197
|
-
const agentsDir = join(home, '.cline', 'agents');
|
|
198
|
-
mkdirSync(agentsDir, { recursive: true });
|
|
199
|
-
for (const f of files) {
|
|
200
|
-
writeFileSync(join(agentsDir, f), `# ${f}`, 'utf8');
|
|
201
|
-
}
|
|
202
|
-
return agentsDir;
|
|
203
|
-
}
|
|
204
|
-
|
|
205
|
-
function findCheck(result, name) {
|
|
206
|
-
return result.results.find((r) => r.name === name);
|
|
207
|
-
}
|
|
208
|
-
|
|
209
|
-
test('config-valid passes for parseable JSON', async () => {
|
|
210
|
-
writeClineConfig({ provider: {} });
|
|
211
|
-
const result = await runDoctor({ silent: true });
|
|
212
|
-
const r = findCheck(result, 'cline-config-valid');
|
|
213
|
-
assert.equal(r.ok, true, `expected config-valid to pass: ${r.message}`);
|
|
214
|
-
});
|
|
215
|
-
|
|
216
|
-
test('config-valid fails for missing cline.json', async () => {
|
|
217
|
-
// No cline.json written.
|
|
218
|
-
const result = await runDoctor({ silent: true });
|
|
219
|
-
const r = findCheck(result, 'cline-config-valid');
|
|
220
|
-
assert.equal(r.ok, false);
|
|
221
|
-
assert.match(r.message, /not found/);
|
|
222
|
-
});
|
|
223
|
-
|
|
224
|
-
test('config-valid fails for invalid JSON', async () => {
|
|
225
|
-
const cfgDir = writeClineConfig({});
|
|
226
|
-
// Overwrite with garbage
|
|
227
|
-
writeFileSync(join(cfgDir, 'cline.json'), '{ this is not json', 'utf8');
|
|
228
|
-
const result = await runDoctor({ silent: true });
|
|
229
|
-
const r = findCheck(result, 'cline-config-valid');
|
|
230
|
-
assert.equal(r.ok, false);
|
|
231
|
-
assert.match(r.message, /invalid JSON/);
|
|
232
|
-
});
|
|
233
|
-
|
|
234
|
-
test('plugin-entry-present fails when plugin[] is empty', async () => {
|
|
235
|
-
writeClineConfig({ plugin: [] });
|
|
236
|
-
const result = await runDoctor({ silent: true });
|
|
237
|
-
const r = findCheck(result, 'plugin-entry-present');
|
|
238
|
-
assert.equal(r.ok, false);
|
|
239
|
-
});
|
|
240
|
-
|
|
241
|
-
test('plugin-entry-present fails when plugin[] has no bizar', async () => {
|
|
242
|
-
writeClineConfig({ plugin: ['something-else'] });
|
|
243
|
-
const result = await runDoctor({ silent: true });
|
|
244
|
-
const r = findCheck(result, 'plugin-entry-present');
|
|
245
|
-
assert.equal(r.ok, false);
|
|
246
|
-
});
|
|
247
|
-
|
|
248
|
-
test('plugin-entry-present passes when plugin[] has bizar string', async () => {
|
|
249
|
-
writeClineConfig({ plugin: ['bizar'] });
|
|
250
|
-
const result = await runDoctor({ silent: true });
|
|
251
|
-
const r = findCheck(result, 'plugin-entry-present');
|
|
252
|
-
assert.equal(r.ok, true, r.message);
|
|
253
|
-
});
|
|
254
|
-
|
|
255
|
-
test('plugin-entry-present passes when plugin[] has bizar object', async () => {
|
|
256
|
-
writeClineConfig({ plugin: [{ name: 'bizar', path: './plugins/bizar' }] });
|
|
257
|
-
const result = await runDoctor({ silent: true });
|
|
258
|
-
const r = findCheck(result, 'plugin-entry-present');
|
|
259
|
-
assert.equal(r.ok, true, r.message);
|
|
260
|
-
});
|
|
261
|
-
|
|
262
|
-
test('plugin-entry-present passes when plugin[] has [path, options] tuple', async () => {
|
|
263
|
-
writeClineConfig({ plugin: [['./plugins/bizar/index.ts', { loopThresholdWarn: 5 }]] });
|
|
264
|
-
const result = await runDoctor({ silent: true });
|
|
265
|
-
const r = findCheck(result, 'plugin-entry-present');
|
|
266
|
-
assert.equal(r.ok, true, r.message);
|
|
267
|
-
});
|
|
268
|
-
|
|
269
|
-
test('plugin-entry-present fails when tuple path does not contain "bizar"', async () => {
|
|
270
|
-
writeClineConfig({ plugin: [['./plugins/other/index.ts', {}]] });
|
|
271
|
-
const result = await runDoctor({ silent: true });
|
|
272
|
-
const r = findCheck(result, 'plugin-entry-present');
|
|
273
|
-
assert.equal(r.ok, false);
|
|
274
|
-
});
|
|
275
|
-
|
|
276
|
-
test('plugin-path-resolves passes when tuple path resolves', async () => {
|
|
277
|
-
const home = process.env.HOME;
|
|
278
|
-
const pluginsDir = join(home, '.cline', 'plugins', 'bizar');
|
|
279
|
-
mkdirSync(pluginsDir, { recursive: true });
|
|
280
|
-
writeFileSync(join(pluginsDir, 'index.ts'), '// fake plugin\n', 'utf8');
|
|
281
|
-
writeClineConfig({ plugin: [['./plugins/bizar/index.ts', {}]] });
|
|
282
|
-
const result = await runDoctor({ silent: true });
|
|
283
|
-
const r = findCheck(result, 'plugin-path-resolves');
|
|
284
|
-
assert.equal(r.ok, true, r.message);
|
|
285
|
-
});
|
|
286
|
-
|
|
287
|
-
test('agent-files-installed fails when core agents missing', async () => {
|
|
288
|
-
writeClineConfig({});
|
|
289
|
-
writeAgents('odin.md'); // missing the other 13
|
|
290
|
-
const result = await runDoctor({ silent: true });
|
|
291
|
-
const r = findCheck(result, 'agent-files-installed');
|
|
292
|
-
assert.equal(r.ok, false);
|
|
293
|
-
assert.match(r.message, /missing/);
|
|
294
|
-
});
|
|
295
|
-
|
|
296
|
-
test('agent-files-installed passes when all 14 agents present', async () => {
|
|
297
|
-
writeClineConfig({});
|
|
298
|
-
// v3.20.11: doctor now expects all 14 agents (was 4 in v3.20.10).
|
|
299
|
-
writeAgents(
|
|
300
|
-
'odin.md', 'vor.md', 'frigg.md', 'quick.md',
|
|
301
|
-
'mimir.md', 'heimdall.md', 'hermod.md', 'thor.md', 'baldr.md',
|
|
302
|
-
'tyr.md', 'vidarr.md', 'forseti.md',
|
|
303
|
-
'semble-search.md', 'agent-browser.md',
|
|
304
|
-
);
|
|
305
|
-
const result = await runDoctor({ silent: true });
|
|
306
|
-
const r = findCheck(result, 'agent-files-installed');
|
|
307
|
-
assert.equal(r.ok, true, r.message);
|
|
308
|
-
});
|
|
309
|
-
|
|
310
|
-
test('provider-config-sanity warns (not fails) without minimax block', async () => {
|
|
311
|
-
// v5.x: checkProviderConfigSanity warns instead of throwing when the
|
|
312
|
-
// provider.minimax block is missing, since provision.mjs auto-adds it.
|
|
313
|
-
writeClineConfig({ provider: {} });
|
|
314
|
-
const result = await runDoctor({ silent: true });
|
|
315
|
-
const r = findCheck(result, 'provider-config-sanity');
|
|
316
|
-
assert.equal(r.ok, true, 'should pass with warning, not throw');
|
|
317
|
-
assert.match(r.message, /warn.*minimax|minimax.*missing/i);
|
|
318
|
-
});
|
|
319
|
-
|
|
320
|
-
test('provider-config-sanity fails when models lack interleaved+reasoning', async () => {
|
|
321
|
-
writeClineConfig({
|
|
322
|
-
provider: {
|
|
323
|
-
minimax: {
|
|
324
|
-
models: { 'some-model': { id: 'foo' } },
|
|
325
|
-
},
|
|
326
|
-
},
|
|
327
|
-
});
|
|
328
|
-
const result = await runDoctor({ silent: true });
|
|
329
|
-
const r = findCheck(result, 'provider-config-sanity');
|
|
330
|
-
assert.equal(r.ok, false);
|
|
331
|
-
assert.match(r.message, /interleaved.*reasoning/);
|
|
332
|
-
});
|
|
333
|
-
|
|
334
|
-
test('provider-config-sanity passes with interleaved+reasoning', async () => {
|
|
335
|
-
writeClineConfig({
|
|
336
|
-
provider: {
|
|
337
|
-
minimax: {
|
|
338
|
-
models: {
|
|
339
|
-
'MiniMax/MiniMax-M3': { interleaved: true, reasoning: true },
|
|
340
|
-
},
|
|
341
|
-
},
|
|
342
|
-
},
|
|
343
|
-
});
|
|
344
|
-
const result = await runDoctor({ silent: true });
|
|
345
|
-
const r = findCheck(result, 'provider-config-sanity');
|
|
346
|
-
assert.equal(r.ok, true, r.message);
|
|
347
|
-
});
|
|
348
|
-
});
|
|
349
|
-
|
|
350
|
-
console.log(' doctor.mjs tests loaded — run with: node --test cli/doctor.test.mjs');
|
|
@@ -1,342 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"$schema": "https://docs.cline.bot/config.json",
|
|
3
|
-
"instructions": [".cline/instructions/bizar-tools.md"],
|
|
4
|
-
"model": "minimaxcustom/MiniMax-M3",
|
|
5
|
-
"small_model": "minimaxcustom/MiniMax-M2.7",
|
|
6
|
-
"default_agent": "odin",
|
|
7
|
-
"permission": "allow",
|
|
8
|
-
"snapshot": false,
|
|
9
|
-
"mcp": {
|
|
10
|
-
"supabase": {
|
|
11
|
-
"type": "remote",
|
|
12
|
-
"url": "https://mcp.supabase.com/mcp",
|
|
13
|
-
"enabled": false
|
|
14
|
-
},
|
|
15
|
-
"semble": {
|
|
16
|
-
"type": "local",
|
|
17
|
-
"command": [
|
|
18
|
-
"uvx",
|
|
19
|
-
"--from",
|
|
20
|
-
"semble[mcp]",
|
|
21
|
-
"semble"
|
|
22
|
-
],
|
|
23
|
-
"enabled": true
|
|
24
|
-
}
|
|
25
|
-
},
|
|
26
|
-
"plugin": [
|
|
27
|
-
["./plugins/bizar/index.ts", {
|
|
28
|
-
"loopThresholdWarn": 5,
|
|
29
|
-
"loopThresholdEscalate": 8,
|
|
30
|
-
"loopThresholdBlock": 12,
|
|
31
|
-
"loopWindowSize": 10,
|
|
32
|
-
"clineruntimeMaxConsecutiveMistakes": 6,
|
|
33
|
-
"compaction": {
|
|
34
|
-
"auto": true,
|
|
35
|
-
"threshold": 0.5,
|
|
36
|
-
"preserve_recent": 10,
|
|
37
|
-
"strategy": "summarize",
|
|
38
|
-
"model": "minimaxcustom/MiniMax-M3"
|
|
39
|
-
}
|
|
40
|
-
}]
|
|
41
|
-
],
|
|
42
|
-
"tools": {
|
|
43
|
-
"bizar_plan_action": true,
|
|
44
|
-
"bizar_get_plan_comments": true,
|
|
45
|
-
"bizar_wait_for_feedback": true,
|
|
46
|
-
"bizar_spawn_background": true,
|
|
47
|
-
"bizar_status": true,
|
|
48
|
-
"bizar_collect": true,
|
|
49
|
-
"bizar_kill": true
|
|
50
|
-
},
|
|
51
|
-
"agent": {
|
|
52
|
-
"odin": {
|
|
53
|
-
"description": "Odin — Pure router that delegates all work to subagents.",
|
|
54
|
-
"mode": "primary",
|
|
55
|
-
"model": "minimaxcustom/MiniMax-M3",
|
|
56
|
-
"color": "#6366f1",
|
|
57
|
-
"permission": {
|
|
58
|
-
"task": "allow",
|
|
59
|
-
"read": "allow",
|
|
60
|
-
"list": "allow",
|
|
61
|
-
"todowrite": "allow",
|
|
62
|
-
"webfetch": "allow",
|
|
63
|
-
"websearch": "allow"
|
|
64
|
-
}
|
|
65
|
-
},
|
|
66
|
-
"vor": {
|
|
67
|
-
"description": "Vör — The Questioning One.",
|
|
68
|
-
"mode": "subagent",
|
|
69
|
-
"model": "minimaxcustom/MiniMax-M2.7",
|
|
70
|
-
"color": "#8b5cf6",
|
|
71
|
-
"permission": {
|
|
72
|
-
"read": "allow",
|
|
73
|
-
"list": "allow",
|
|
74
|
-
"question": "allow"
|
|
75
|
-
}
|
|
76
|
-
},
|
|
77
|
-
"frigg": {
|
|
78
|
-
"description": "Frigg — All-knowing Q&A agent.",
|
|
79
|
-
"mode": "primary",
|
|
80
|
-
"model": "minimaxcustom/MiniMax-M2.7",
|
|
81
|
-
"color": "#06b6d4",
|
|
82
|
-
"permission": {
|
|
83
|
-
"read": "allow",
|
|
84
|
-
"list": "allow",
|
|
85
|
-
"glob": "allow",
|
|
86
|
-
"grep": "allow",
|
|
87
|
-
"bash": "allow",
|
|
88
|
-
"webfetch": "allow",
|
|
89
|
-
"websearch": "allow",
|
|
90
|
-
"question": "allow"
|
|
91
|
-
}
|
|
92
|
-
},
|
|
93
|
-
"quick": {
|
|
94
|
-
"description": "Quick — Fast single-shot tasks.",
|
|
95
|
-
"mode": "primary",
|
|
96
|
-
"model": "minimaxcustom/MiniMax-M2.7",
|
|
97
|
-
"color": "#22d3ee",
|
|
98
|
-
"permission": {
|
|
99
|
-
"read": "allow",
|
|
100
|
-
"edit": "allow",
|
|
101
|
-
"write": "allow",
|
|
102
|
-
"bash": "allow",
|
|
103
|
-
"glob": "allow",
|
|
104
|
-
"grep": "allow",
|
|
105
|
-
"list": "allow",
|
|
106
|
-
"todowrite": "allow",
|
|
107
|
-
"webfetch": "allow",
|
|
108
|
-
"websearch": "allow",
|
|
109
|
-
"task": "deny"
|
|
110
|
-
}
|
|
111
|
-
},
|
|
112
|
-
"mimir": {
|
|
113
|
-
"description": "Mimir — Research and codebase exploration agent.",
|
|
114
|
-
"mode": "subagent",
|
|
115
|
-
"model": "minimaxcustom/MiniMax-M2.7",
|
|
116
|
-
"color": "#0ea5e9",
|
|
117
|
-
"permission": {
|
|
118
|
-
"read": "allow",
|
|
119
|
-
"write": "allow",
|
|
120
|
-
"edit": "allow",
|
|
121
|
-
"bash": "allow",
|
|
122
|
-
"glob": "allow",
|
|
123
|
-
"grep": "allow",
|
|
124
|
-
"list": "allow",
|
|
125
|
-
"webfetch": "allow",
|
|
126
|
-
"websearch": "allow",
|
|
127
|
-
"todowrite": "allow"
|
|
128
|
-
}
|
|
129
|
-
},
|
|
130
|
-
"heimdall": {
|
|
131
|
-
"description": "Heimdall — Simple, routine, deterministic tasks.",
|
|
132
|
-
"mode": "subagent",
|
|
133
|
-
"model": "minimaxcustom/MiniMax-M2.7",
|
|
134
|
-
"color": "#10b981",
|
|
135
|
-
"permission": {
|
|
136
|
-
"read": "allow",
|
|
137
|
-
"edit": "allow",
|
|
138
|
-
"bash": "allow",
|
|
139
|
-
"glob": "allow",
|
|
140
|
-
"grep": "allow",
|
|
141
|
-
"list": "allow",
|
|
142
|
-
"todowrite": "allow",
|
|
143
|
-
"webfetch": "allow",
|
|
144
|
-
"websearch": "allow"
|
|
145
|
-
}
|
|
146
|
-
},
|
|
147
|
-
"hermod": {
|
|
148
|
-
"description": "Hermod — Git and GitHub operations specialist.",
|
|
149
|
-
"mode": "subagent",
|
|
150
|
-
"model": "minimaxcustom/MiniMax-M2.7",
|
|
151
|
-
"color": "#06b6d4",
|
|
152
|
-
"permission": {
|
|
153
|
-
"read": "allow",
|
|
154
|
-
"edit": "allow",
|
|
155
|
-
"bash": "allow",
|
|
156
|
-
"glob": "allow",
|
|
157
|
-
"grep": "allow",
|
|
158
|
-
"list": "allow",
|
|
159
|
-
"webfetch": "allow",
|
|
160
|
-
"websearch": "allow"
|
|
161
|
-
}
|
|
162
|
-
},
|
|
163
|
-
"thor": {
|
|
164
|
-
"description": "Thor — Medium-complexity tasks, strong and reliable.",
|
|
165
|
-
"mode": "subagent",
|
|
166
|
-
"model": "minimaxcustom/MiniMax-M2.7",
|
|
167
|
-
"color": "#a855f7",
|
|
168
|
-
"permission": {
|
|
169
|
-
"read": "allow",
|
|
170
|
-
"edit": "allow",
|
|
171
|
-
"bash": "allow",
|
|
172
|
-
"glob": "allow",
|
|
173
|
-
"grep": "allow",
|
|
174
|
-
"list": "allow",
|
|
175
|
-
"todowrite": "allow",
|
|
176
|
-
"webfetch": "allow",
|
|
177
|
-
"websearch": "allow"
|
|
178
|
-
}
|
|
179
|
-
},
|
|
180
|
-
"baldr": {
|
|
181
|
-
"description": "Baldr — UI/UX design system specialist.",
|
|
182
|
-
"mode": "subagent",
|
|
183
|
-
"model": "minimaxcustom/MiniMax-M2.7",
|
|
184
|
-
"color": "#ec4899",
|
|
185
|
-
"permission": {
|
|
186
|
-
"read": "allow",
|
|
187
|
-
"edit": "allow",
|
|
188
|
-
"bash": "allow",
|
|
189
|
-
"glob": "allow",
|
|
190
|
-
"grep": "allow",
|
|
191
|
-
"list": "allow",
|
|
192
|
-
"todowrite": "allow",
|
|
193
|
-
"webfetch": "allow",
|
|
194
|
-
"websearch": "allow"
|
|
195
|
-
}
|
|
196
|
-
},
|
|
197
|
-
"tyr": {
|
|
198
|
-
"description": "Tyr — Complex implementation, debugging, architecture.",
|
|
199
|
-
"mode": "subagent",
|
|
200
|
-
"model": "minimaxcustom/MiniMax-M3",
|
|
201
|
-
"color": "#f59e0b",
|
|
202
|
-
"permission": {
|
|
203
|
-
"read": "allow",
|
|
204
|
-
"edit": "allow",
|
|
205
|
-
"bash": "allow",
|
|
206
|
-
"glob": "allow",
|
|
207
|
-
"grep": "allow",
|
|
208
|
-
"list": "allow",
|
|
209
|
-
"todowrite": "allow",
|
|
210
|
-
"webfetch": "allow",
|
|
211
|
-
"websearch": "allow"
|
|
212
|
-
}
|
|
213
|
-
},
|
|
214
|
-
"vidarr": {
|
|
215
|
-
"description": "Vidarr — Ultimate fallback via MiniMax M3.",
|
|
216
|
-
"mode": "subagent",
|
|
217
|
-
"model": "minimaxcustom/MiniMax-M3",
|
|
218
|
-
"color": "#dc2626",
|
|
219
|
-
"permission": {
|
|
220
|
-
"read": "allow",
|
|
221
|
-
"edit": "allow",
|
|
222
|
-
"bash": "allow",
|
|
223
|
-
"glob": "allow",
|
|
224
|
-
"grep": "allow",
|
|
225
|
-
"list": "allow",
|
|
226
|
-
"todowrite": "allow",
|
|
227
|
-
"webfetch": "allow",
|
|
228
|
-
"websearch": "allow"
|
|
229
|
-
}
|
|
230
|
-
},
|
|
231
|
-
"forseti": {
|
|
232
|
-
"description": "Forseti — Audits and corrects plans before execution.",
|
|
233
|
-
"mode": "subagent",
|
|
234
|
-
"model": "minimaxcustom/MiniMax-M3",
|
|
235
|
-
"color": "#ef4444",
|
|
236
|
-
"permission": {
|
|
237
|
-
"read": "allow",
|
|
238
|
-
"edit": "deny",
|
|
239
|
-
"bash": "allow",
|
|
240
|
-
"glob": "allow",
|
|
241
|
-
"grep": "allow",
|
|
242
|
-
"list": "allow",
|
|
243
|
-
"todowrite": "allow",
|
|
244
|
-
"question": "allow",
|
|
245
|
-
"webfetch": "allow",
|
|
246
|
-
"websearch": "allow"
|
|
247
|
-
}
|
|
248
|
-
},
|
|
249
|
-
"agent-browser": {
|
|
250
|
-
"description": "agent-browser — Primary agent for browser-driven E2E verification. No-edit permissions. Drives Chrome for Testing via the agent-browser Rust CLI for end-to-end testing of web apps. Reads `_shared/CLINE_TOOLS.md` before any tool call.",
|
|
251
|
-
"mode": "primary",
|
|
252
|
-
"model": "minimaxcustom/MiniMax-M2.7",
|
|
253
|
-
"color": "#84cc16",
|
|
254
|
-
"permission": {
|
|
255
|
-
"read": "allow",
|
|
256
|
-
"bash": "allow",
|
|
257
|
-
"glob": "allow",
|
|
258
|
-
"grep": "allow",
|
|
259
|
-
"list": "allow",
|
|
260
|
-
"webfetch": "allow",
|
|
261
|
-
"websearch": "allow",
|
|
262
|
-
"edit": "deny",
|
|
263
|
-
"write": "deny"
|
|
264
|
-
}
|
|
265
|
-
},
|
|
266
|
-
"semble-search": {
|
|
267
|
-
"description": "Code search agent for exploring any codebase.",
|
|
268
|
-
"mode": "subagent",
|
|
269
|
-
"permission": {
|
|
270
|
-
"bash": "allow",
|
|
271
|
-
"read": "allow"
|
|
272
|
-
}
|
|
273
|
-
}
|
|
274
|
-
},
|
|
275
|
-
"command": {
|
|
276
|
-
"audit": {
|
|
277
|
-
"description": "Run bizar audit to scan agent configuration for security issues.",
|
|
278
|
-
"agent": "forseti",
|
|
279
|
-
"template": "commands-bizar/audit.md"
|
|
280
|
-
},
|
|
281
|
-
"explain": {
|
|
282
|
-
"description": "Route to @frigg for read-only codebase Q&A.",
|
|
283
|
-
"agent": "frigg",
|
|
284
|
-
"template": "commands-bizar/explain.md"
|
|
285
|
-
},
|
|
286
|
-
"init": {
|
|
287
|
-
"description": "Run bizar init to detect project stack and install skills.",
|
|
288
|
-
"agent": "heimdall",
|
|
289
|
-
"template": "commands-bizar/init.md"
|
|
290
|
-
},
|
|
291
|
-
"learn": {
|
|
292
|
-
"description": "Extract patterns from current session.",
|
|
293
|
-
"agent": "heimdall",
|
|
294
|
-
"template": "commands-bizar/learn.md"
|
|
295
|
-
},
|
|
296
|
-
"plan": {
|
|
297
|
-
"description": "Open the Bizar visual plan canvas.",
|
|
298
|
-
"agent": "odin",
|
|
299
|
-
"template": "commands-bizar/plan.md"
|
|
300
|
-
},
|
|
301
|
-
"pr-review": {
|
|
302
|
-
"description": "PR review mode with @mimir and @forseti.",
|
|
303
|
-
"agent": "hermod",
|
|
304
|
-
"template": "commands-bizar/pr-review.md"
|
|
305
|
-
},
|
|
306
|
-
"tailscale-serve": {
|
|
307
|
-
"description": "Authenticate Tailscale Serve and expose a local port.",
|
|
308
|
-
"agent": "heimdall",
|
|
309
|
-
"template": "commands-bizar/tailscale-serve.md"
|
|
310
|
-
},
|
|
311
|
-
"visual-plan": {
|
|
312
|
-
"description": "Toggle the Bizar visual plan canvas.",
|
|
313
|
-
"agent": "odin",
|
|
314
|
-
"template": "commands-bizar/visual-plan.md"
|
|
315
|
-
},
|
|
316
|
-
"bizar": {
|
|
317
|
-
"description": "Bizar Plugin Menu.",
|
|
318
|
-
"agent": "odin",
|
|
319
|
-
"template": "commands-bizar/bizar.md\n\n$ARGUMENTS"
|
|
320
|
-
},
|
|
321
|
-
"team": {
|
|
322
|
-
"description": "Spawn a Cline agent team — coordinate Thor, Tyr, Mimir, Hermod, and Forseti to complete a complex mission end-to-end.",
|
|
323
|
-
"agent": "odin",
|
|
324
|
-
"template": "commands-bizar/team.md\n\n$ARGUMENTS"
|
|
325
|
-
},
|
|
326
|
-
"test": {
|
|
327
|
-
"description": "Run the project's test suite via the Bizar test gate (auto-detects jest/vitest/bun/pytest/cargo/go).",
|
|
328
|
-
"agent": "thor",
|
|
329
|
-
"template": "commands-bizar/test.md\n\n$ARGUMENTS"
|
|
330
|
-
},
|
|
331
|
-
"validate": {
|
|
332
|
-
"description": "Validate the Bizar install: cline.json, plugin entry, agents, skills, hooks, rules, commands, and provider config.",
|
|
333
|
-
"agent": "heimdall",
|
|
334
|
-
"template": "commands-bizar/validate.md\n\n$ARGUMENTS"
|
|
335
|
-
},
|
|
336
|
-
"setup-provider": {
|
|
337
|
-
"description": "Configure a provider in cline.json. Since v6.2.2 the installer no longer touches provider config — use this to add your own.",
|
|
338
|
-
"agent": "heimdall",
|
|
339
|
-
"template": "commands-bizar/setup-provider.md\n\n$ARGUMENTS"
|
|
340
|
-
}
|
|
341
|
-
}
|
|
342
|
-
}
|