@polderlabs/bizar 10.23.21 → 10.23.23
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/AGENTS.md +17 -14
- package/README.md +209 -67
- package/cli/banner.mjs +1 -1
- package/cli/commands/models.mjs +44 -3
- package/cli/commands/validate.mjs +6 -7
- package/cli/install/banner.mjs +1 -1
- package/cli/install/interactive-setup.mjs +13 -1
- package/cli/install/paths.mjs +2 -10
- package/cli/provision.mjs +21 -14
- package/cli/utils.mjs +2 -11
- package/config/claude/CLAUDE.md +17 -14
- package/config/claude/agents/bizar-accessibility-architect.md +153 -0
- package/config/claude/agents/bizar-agent-evaluator.md +210 -0
- package/config/claude/agents/bizar-architect.md +224 -0
- package/config/claude/agents/bizar-build-error-resolver.md +127 -0
- package/config/claude/agents/bizar-chief-of-staff.md +164 -0
- package/config/claude/agents/bizar-code-architect.md +84 -0
- package/config/claude/agents/bizar-code-explorer.md +82 -0
- package/config/claude/agents/bizar-code-reviewer.md +327 -0
- package/config/claude/agents/bizar-code-simplifier.md +60 -0
- package/config/claude/agents/bizar-comment-analyzer.md +58 -0
- package/config/claude/agents/bizar-conversation-analyzer.md +65 -0
- package/config/claude/agents/bizar-cpp-build-resolver.md +103 -0
- package/config/claude/agents/bizar-cpp-reviewer.md +85 -0
- package/config/claude/agents/bizar-csharp-reviewer.md +114 -0
- package/config/claude/agents/bizar-dart-build-resolver.md +214 -0
- package/config/claude/agents/bizar-database-reviewer.md +104 -0
- package/config/claude/agents/bizar-django-build-resolver.md +256 -0
- package/config/claude/agents/bizar-django-reviewer.md +173 -0
- package/config/claude/agents/bizar-doc-updater.md +120 -0
- package/config/claude/agents/bizar-docs-lookup.md +81 -0
- package/config/claude/agents/bizar-end-to-end-runner.md +120 -0
- package/config/claude/agents/bizar-fastapi-reviewer.md +83 -0
- package/config/claude/agents/bizar-flutter-reviewer.md +256 -0
- package/config/claude/agents/bizar-fsharp-reviewer.md +113 -0
- package/config/claude/agents/bizar-gan-evaluator.md +236 -0
- package/config/claude/agents/bizar-gan-generator.md +144 -0
- package/config/claude/agents/bizar-gan-planner.md +112 -0
- package/config/claude/agents/bizar-go-build-resolver.md +107 -0
- package/config/claude/agents/bizar-go-reviewer.md +89 -0
- package/config/claude/agents/bizar-harmonyos-app-resolver.md +186 -0
- package/config/claude/agents/bizar-harness-optimizer.md +59 -0
- package/config/claude/agents/bizar-healthcare-reviewer.md +96 -0
- package/config/claude/agents/bizar-homelab-architect.md +111 -0
- package/config/claude/agents/bizar-java-build-resolver.md +279 -0
- package/config/claude/agents/bizar-java-reviewer.md +194 -0
- package/config/claude/agents/bizar-kotlin-build-resolver.md +131 -0
- package/config/claude/agents/bizar-kotlin-reviewer.md +172 -0
- package/config/claude/agents/bizar-loop-operator.md +49 -0
- package/config/claude/agents/bizar-marketing-agent.md +163 -0
- package/config/claude/agents/bizar-mle-reviewer.md +166 -0
- package/config/claude/agents/bizar-network-architect.md +110 -0
- package/config/claude/agents/bizar-network-config-reviewer.md +110 -0
- package/config/claude/agents/bizar-network-troubleshooter.md +132 -0
- package/config/claude/agents/bizar-opensource-forker.md +211 -0
- package/config/claude/agents/bizar-opensource-packager.md +262 -0
- package/config/claude/agents/bizar-opensource-sanitizer.md +201 -0
- package/config/claude/agents/bizar-performance-optimizer.md +459 -0
- package/config/claude/agents/bizar-php-reviewer.md +113 -0
- package/config/claude/agents/bizar-planner.md +225 -0
- package/config/claude/agents/bizar-pr-test-analyzer.md +58 -0
- package/config/claude/agents/bizar-python-reviewer.md +111 -0
- package/config/claude/agents/bizar-pytorch-build-resolver.md +133 -0
- package/config/claude/agents/bizar-rag-pipeline-reviewer.md +71 -0
- package/config/claude/agents/bizar-react-build-resolver.md +219 -0
- package/config/claude/agents/bizar-react-reviewer.md +171 -0
- package/config/claude/agents/bizar-refactor-cleaner.md +98 -0
- package/config/claude/agents/bizar-rust-build-resolver.md +161 -0
- package/config/claude/agents/bizar-rust-reviewer.md +107 -0
- package/config/claude/agents/bizar-security-reviewer.md +121 -0
- package/config/claude/agents/bizar-seo-specialist.md +75 -0
- package/config/claude/agents/bizar-silent-failure-hunter.md +63 -0
- package/config/claude/agents/bizar-spec-miner.md +221 -0
- package/config/claude/agents/bizar-swift-build-resolver.md +174 -0
- package/config/claude/agents/bizar-swift-reviewer.md +120 -0
- package/config/claude/agents/bizar-tdd-guide.md +104 -0
- package/config/claude/agents/bizar-type-design-analyzer.md +54 -0
- package/config/claude/agents/bizar-typescript-reviewer.md +128 -0
- package/config/claude/agents/bizar-vue-reviewer.md +210 -0
- package/config/claude/agents/office-manager.md +13 -15
- package/config/claude/commands/bizar.md +6 -5
- package/config/claude/commands/plow-through.md +3 -2
- package/config/claude/commands/quick.md +14 -14
- package/config/claude/commands/team.md +5 -2
- package/config/claude/hooks/agent-model-guard.mjs +2 -2
- package/config/claude/hooks/sessionend-recall.mjs +1 -9
- package/config/claude/hooks/sessionstart-prime.mjs +2 -2
- package/config/claude/hooks/thinking-route.mjs +0 -1
- package/config/claude/hooks/worker-suggest.mjs +12 -24
- package/config/claude/hooks/workflow-route-guard.mjs +4 -3
- package/config/claude/hooks/workflow-route-state.mjs +1 -1
- package/config/skills/brainstorming/SKILL.md +253 -0
- package/config/skills/brainstorming/scripts/frame-template.html +213 -0
- package/config/skills/brainstorming/scripts/helper.js +167 -0
- package/config/skills/brainstorming/scripts/server.cjs +723 -0
- package/config/skills/brainstorming/scripts/start-server.sh +209 -0
- package/config/skills/brainstorming/scripts/stop-server.sh +120 -0
- package/config/skills/brainstorming/spec-document-reviewer-prompt.md +49 -0
- package/config/skills/brainstorming/visual-companion.md +299 -0
- package/config/skills/dispatching-parallel-agents/SKILL.md +170 -0
- package/config/skills/executing-plans/SKILL.md +67 -0
- package/config/skills/finishing-a-development-branch/SKILL.md +228 -0
- package/config/skills/receiving-code-review/SKILL.md +208 -0
- package/config/skills/requesting-code-review/SKILL.md +98 -0
- package/config/skills/requesting-code-review/code-reviewer.md +181 -0
- package/config/skills/subagent-driven-development/SKILL.md +571 -0
- package/config/skills/subagent-driven-development/implementer-prompt.md +154 -0
- package/config/skills/subagent-driven-development/re-review-prompt.md +115 -0
- package/config/skills/subagent-driven-development/scripts/review-package +46 -0
- package/config/skills/subagent-driven-development/scripts/sdd-workspace +40 -0
- package/config/skills/subagent-driven-development/scripts/task-brief +41 -0
- package/config/skills/subagent-driven-development/task-reviewer-prompt.md +207 -0
- package/config/skills/systematic-debugging/CREATION-LOG.md +119 -0
- package/config/skills/systematic-debugging/SKILL.md +286 -0
- package/config/skills/systematic-debugging/condition-based-waiting-example.ts +158 -0
- package/config/skills/systematic-debugging/condition-based-waiting.md +115 -0
- package/config/skills/systematic-debugging/defense-in-depth.md +122 -0
- package/config/skills/systematic-debugging/find-polluter.sh +72 -0
- package/config/skills/systematic-debugging/root-cause-tracing.md +169 -0
- package/config/skills/systematic-debugging/test-academic.md +14 -0
- package/config/skills/systematic-debugging/test-pressure-1.md +58 -0
- package/config/skills/systematic-debugging/test-pressure-2.md +68 -0
- package/config/skills/systematic-debugging/test-pressure-3.md +69 -0
- package/config/skills/test-driven-development/SKILL.md +323 -0
- package/config/skills/test-driven-development/writing-good-tests.md +198 -0
- package/config/skills/using-git-worktrees/SKILL.md +170 -0
- package/config/skills/using-superpowers/SKILL.md +66 -0
- package/config/skills/using-superpowers/references/antigravity-tools.md +23 -0
- package/config/skills/using-superpowers/references/codex-tools.md +108 -0
- package/config/skills/using-superpowers/references/gemini-tools.md +63 -0
- package/config/skills/using-superpowers/references/hermes-tools.md +56 -0
- package/config/skills/using-superpowers/references/pi-tools.md +16 -0
- package/config/skills/verification-before-completion/SKILL.md +123 -0
- package/config/skills/writing-plans/SKILL.md +174 -0
- package/config/skills/writing-plans/plan-document-reviewer-prompt.md +49 -0
- package/config/skills/writing-skills/SKILL.md +682 -0
- package/config/skills/writing-skills/anthropic-best-practices.md +1150 -0
- package/config/skills/writing-skills/examples/CLAUDE_MD_TESTING.md +189 -0
- package/config/skills/writing-skills/graphviz-conventions.dot +172 -0
- package/config/skills/writing-skills/persuasion-principles.md +187 -0
- package/config/skills/writing-skills/render-graphs.js +169 -0
- package/config/skills/writing-skills/testing-skills-with-subagents.md +384 -0
- package/config/trigger-patterns.json +1 -1
- package/config/workflows/bizar-debug.js +1 -0
- package/config/workflows/bizar-implement.js +1 -0
- package/config/workflows/bizar-research.js +1 -0
- package/config/workflows/ultracode-research.js +1 -0
- package/config/workflows/ultracode-review.js +1 -0
- package/config/workflows/ultracode.js +1 -0
- package/package.json +1 -1
- package/packages/sdk/dist/version.d.ts +1 -1
- package/packages/sdk/dist/version.js +1 -1
- package/packages/sdk/package.json +1 -1
- package/config/claude/commands/migrate.md +0 -18
- package/config/claude/commands/tailscale-serve.md +0 -14
- package/config/claude/commands/tier.md +0 -31
- package/config/claude/commands/upgrade-defaults.md +0 -34
- package/config/claude/commands/use-default.md +0 -12
- package/config/claude/commands/use-premium.md +0 -12
package/AGENTS.md
CHANGED
|
@@ -58,13 +58,15 @@ still deny prohibited actions and escalate externally visible or irreversible
|
|
|
58
58
|
actions with `permissionDecision: "ask"`; that escalation list is the
|
|
59
59
|
authoritative floor, not a starting point.
|
|
60
60
|
|
|
61
|
-
Mike
|
|
62
|
-
|
|
63
|
-
single-target copy/style/format edit
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
61
|
+
Mike performs bounded read-only orientation, then uses a native Agent team as
|
|
62
|
+
the default for substantive work. Direct work is reserved for an unmistakably
|
|
63
|
+
tiny single-target copy/style/format edit or the user's explicit `/quick`
|
|
64
|
+
request. A single Agent or native workflow is used only when the user
|
|
65
|
+
explicitly requests that mode or a durable workflow must be resumed. Ask one
|
|
66
|
+
concise clarification question only when a material choice, acceptance
|
|
67
|
+
criterion, safety boundary, or unresolved constraint would change the work;
|
|
68
|
+
otherwise continue autonomously. The team is host-side state under
|
|
69
|
+
`CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS=1`, and per
|
|
68
70
|
Anthropic's docs `team_name` is deprecated and ignored. Every editing dispatch
|
|
69
71
|
uses an explicit configured model and call-level `isolation: "worktree"`.
|
|
70
72
|
When two or more subtasks have non-overlapping writable scopes and no data
|
|
@@ -133,13 +135,14 @@ The autonomy and approval policy above governs this execution model. The project
|
|
|
133
135
|
Every non-empty primary request enters Bizar through `office-manager` (`@mike`).
|
|
134
136
|
The installer sets Claude Code's global `agent` setting to Mike's frontmatter
|
|
135
137
|
name (`mike`),
|
|
136
|
-
and the routing hook supplies the
|
|
137
|
-
work, Mike first gathers only bounded read-only context
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
138
|
+
and the routing hook supplies the team-first coordination policy. For non-tiny
|
|
139
|
+
work, Mike first gathers only bounded read-only context. When the inferred
|
|
140
|
+
outcome, acceptance criteria, and safety boundary are clear, it forms the
|
|
141
|
+
default Agent team and continues autonomously. It asks one concise
|
|
142
|
+
clarification only when a material choice or unresolved constraint would
|
|
143
|
+
change the work. `/quick` explicitly selects direct primary-session execution;
|
|
144
|
+
single Agents and native workflows are explicit or resumed modes. Mike owns
|
|
145
|
+
integration and final verification.
|
|
143
146
|
A Bizar custom agent already executing its assigned role does not recursively
|
|
144
147
|
dispatch itself.
|
|
145
148
|
|
package/README.md
CHANGED
|
@@ -1,92 +1,231 @@
|
|
|
1
|
-
|
|
1
|
+
<div align="center">
|
|
2
|
+
|
|
3
|
+
```text
|
|
4
|
+
██████╗ ██╗███████╗ █████╗ ██████╗
|
|
5
|
+
██╔══██╗██║╚══███╔╝██╔══██╗██╔══██╗
|
|
6
|
+
██████╔╝██║ ███╔╝ ███████║██████╔╝
|
|
7
|
+
██╔══██╗██║ ███╔╝ ██╔══██║██╔══██╗
|
|
8
|
+
██████╔╝██║███████╗██║ ██║██║ ██║
|
|
9
|
+
╚═════╝ ╚═╝╚══════╝╚═╝ ╚═╝╚═╝ ╚═╝
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
### Guarded autonomy for Claude Code
|
|
13
|
+
|
|
14
|
+
Choose your models once. Give Claude Code real work. Bizar supplies the routing,
|
|
15
|
+
specialists, guardrails, and evidence to carry it through responsibly.
|
|
16
|
+
|
|
17
|
+
`84 agents` · `80 skills` · `33 commands` · `14-tool MCP server`
|
|
18
|
+
|
|
19
|
+
</div>
|
|
2
20
|
|
|
3
|
-
|
|
21
|
+
---
|
|
4
22
|
|
|
5
|
-
##
|
|
23
|
+
## Why Bizar?
|
|
6
24
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
25
|
+
Claude Code is already powerful. Bizar makes longer, cross-cutting work easier
|
|
26
|
+
to trust and easier to follow. It starts with a small read-only orientation,
|
|
27
|
+
forms an agent team by default for substantive work, and asks a clarification
|
|
28
|
+
only when a material decision remains unresolved. `/quick` deliberately
|
|
29
|
+
selects direct primary-session work; workflows and single agents are explicit
|
|
30
|
+
or resumed modes.
|
|
13
31
|
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
agents, tasks, sessions, feature state, and durable messages without coupling
|
|
18
|
-
to Bizar internals.
|
|
32
|
+
It keeps the operator in control of model selection and high-impact actions.
|
|
33
|
+
Your configured model choices live in your global Claude configuration—not in
|
|
34
|
+
the project you happen to be working on.
|
|
19
35
|
|
|
20
|
-
|
|
36
|
+
| You want | Bizar provides |
|
|
37
|
+
| --- | --- |
|
|
38
|
+
| A clean way to begin | A guided installer and `bizar models` picker |
|
|
39
|
+
| Your own gateway models | Global selection, full-ID subagent definitions, and native alias mapping |
|
|
40
|
+
| Useful parallel work | Isolated worktrees, scoped tasks, and specialist roles |
|
|
41
|
+
| Fewer surprises | Explicit safety checks for releases, publication, deployment, pushes, and destructive operations |
|
|
42
|
+
| Confidence at the end | Tests, architecture checks, E2E checks, and evidence-aware handoff |
|
|
43
|
+
|
|
44
|
+
## Start here
|
|
45
|
+
|
|
46
|
+
Install Bizar globally, install its Claude Code integration, then choose the
|
|
47
|
+
models you want Bizar to use.
|
|
21
48
|
|
|
22
49
|
```sh
|
|
23
|
-
npm install
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
make check
|
|
27
|
-
make test
|
|
28
|
-
make e2e
|
|
50
|
+
npm install -g @polderlabs/bizar
|
|
51
|
+
bizar install
|
|
52
|
+
bizar models
|
|
29
53
|
```
|
|
30
54
|
|
|
31
|
-
Claude Code
|
|
55
|
+
Restart Claude Code after installation. The installer adds Bizar's agents,
|
|
56
|
+
skills, commands, hooks, and settings to your user-level Claude configuration.
|
|
57
|
+
It preserves your configured gateway endpoint and credential values during a
|
|
58
|
+
clean reinstall.
|
|
32
59
|
|
|
33
|
-
|
|
60
|
+
For a completely fresh Bizar-managed Claude setup while retaining endpoint and
|
|
61
|
+
authentication settings:
|
|
34
62
|
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
63
|
+
```sh
|
|
64
|
+
bizar install --force
|
|
65
|
+
bizar models
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
Then open any repository in Claude Code and describe the outcome you want.
|
|
69
|
+
Mike—the Bizar coordinator—handles the rest.
|
|
70
|
+
|
|
71
|
+
> **Tip:** Run `bizar doctor` whenever you want to verify that the global
|
|
72
|
+
> install, Claude settings, hooks, skills, agents, and provider connection are
|
|
73
|
+
> healthy.
|
|
74
|
+
|
|
75
|
+
## The first-task experience
|
|
76
|
+
|
|
77
|
+
```mermaid
|
|
78
|
+
flowchart LR
|
|
79
|
+
U["Describe the outcome"] --> M["Mike: brief orientation"]
|
|
80
|
+
M --> Q{"Material choice?"}
|
|
81
|
+
Q -- Yes --> C["One concise question"]
|
|
82
|
+
C --> R["Choose a coordination mode"]
|
|
83
|
+
Q -- No --> R
|
|
84
|
+
R --> D["Direct edit"]
|
|
85
|
+
R --> A["Isolated specialist"]
|
|
86
|
+
R --> P["Parallel agents / team"]
|
|
87
|
+
R --> W["Visible workflow"]
|
|
88
|
+
D --> V["Verify and report evidence"]
|
|
89
|
+
A --> V
|
|
90
|
+
P --> V
|
|
91
|
+
W --> V
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
The coordinator does not force every request through a workflow. Small,
|
|
95
|
+
obvious edits stay small; larger requests get only the structure they need.
|
|
96
|
+
Writing agents work in Git worktrees, while read-only research stays light and
|
|
97
|
+
foregrounded.
|
|
44
98
|
|
|
45
|
-
|
|
99
|
+
## Your models, everywhere Bizar dispatches
|
|
46
100
|
|
|
47
|
-
|
|
101
|
+
`bizar models` is the single operator-facing place to select models. It
|
|
102
|
+
discovers candidates from your configured gateway and writes your selections to
|
|
103
|
+
the global model router:
|
|
48
104
|
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
105
|
+
```text
|
|
106
|
+
~/.claude/model-router.json
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
The router is never stored in a project directory. Bizar uses the selected
|
|
110
|
+
models for direct subagents, workflows, and agent-team teammates.
|
|
111
|
+
|
|
112
|
+
```mermaid
|
|
113
|
+
flowchart TD
|
|
114
|
+
Picker["bizar models"] --> Router["Global model router\n~/.claude/model-router.json"]
|
|
115
|
+
Router --> Definitions["Global Bizar agent definitions\nfull model ID in frontmatter"]
|
|
116
|
+
Router --> Aliases["sonnet · opus · haiku · fable\ncompatibility aliases"]
|
|
117
|
+
Definitions --> Agent["Subagents"]
|
|
118
|
+
Definitions --> Workflow["Workflow workers"]
|
|
119
|
+
Definitions --> Team["Agent-team teammates"]
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
Claude Code's native per-call model field has a small alias vocabulary. Bizar
|
|
123
|
+
avoids making that vocabulary a limitation: it projects each selected gateway
|
|
124
|
+
model into a global subagent definition whose frontmatter contains the full
|
|
125
|
+
model ID. The agent, workflow, and team routes use that definition. The four
|
|
126
|
+
native aliases are compatibility shortcuts only; they do not enable an
|
|
127
|
+
unselected provider or reduce your selected-model pool to four choices.
|
|
128
|
+
|
|
129
|
+
Useful inspection commands:
|
|
54
130
|
|
|
55
131
|
```sh
|
|
56
|
-
bizar
|
|
57
|
-
bizar
|
|
58
|
-
bizar
|
|
59
|
-
bizar
|
|
60
|
-
bizar task integrate enqueue sdk-change --commit abc1234 --owner todd
|
|
61
|
-
bizar task integrate claim --worker steve
|
|
62
|
-
bizar task integrate pass 1 --worker steve --evidence "aggregate checks passed"
|
|
132
|
+
bizar models --list
|
|
133
|
+
bizar models --agent-types --json
|
|
134
|
+
bizar models explain todd
|
|
135
|
+
bizar doctor
|
|
63
136
|
```
|
|
64
137
|
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
138
|
+
## A specialist bench, not a generic swarm
|
|
139
|
+
|
|
140
|
+
Bizar ships its core coordination roles alongside 68 focused specialists for
|
|
141
|
+
architecture, accessibility, security, testing, documentation, performance,
|
|
142
|
+
language and framework review, build repair, operations, and evaluation. It
|
|
143
|
+
also ships 80 skills for planning, debugging, verification, review,
|
|
144
|
+
worktrees, and implementation practice.
|
|
145
|
+
|
|
146
|
+
The coordinator selects specialists when their expertise reduces a concrete
|
|
147
|
+
risk. It does not create parallel workers merely to look busy. You can inspect
|
|
148
|
+
the installed specialist definition names through `bizar models --agent-types
|
|
149
|
+
--json` and use a relevant Bizar specialist directly when needed.
|
|
150
|
+
|
|
151
|
+
```text
|
|
152
|
+
Core coordination Specialist coverage
|
|
153
|
+
───────────────── ──────────────────────────────────
|
|
154
|
+
Mike · research · plan Architecture · accessibility · security
|
|
155
|
+
Implementation · review Build repair · tests · documentation
|
|
156
|
+
Verification · integration Frameworks · performance · operations
|
|
157
|
+
Evaluation · product and domain analysis
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
## Guardrails that stay out of the way
|
|
161
|
+
|
|
162
|
+
Bizar is designed to be autonomous for local, reversible work and deliberate
|
|
163
|
+
for consequential actions.
|
|
164
|
+
|
|
165
|
+
| Category | Default behavior |
|
|
166
|
+
| --- | --- |
|
|
167
|
+
| Read, inspect, edit, test, format | Proceeds autonomously within the task scope |
|
|
168
|
+
| Parallel code changes | Uses isolated worktrees and scoped task ownership |
|
|
169
|
+
| Ambiguous material design choice | Asks one concise clarification before execution |
|
|
170
|
+
| Commit | Locally allowed, with a fresh simplify review reminder |
|
|
171
|
+
| Push, PR mutation, release, publish, deploy | Requires an explicit human decision |
|
|
172
|
+
| Rebase, force-push, broad destructive commands | Denied or escalated by the safety floor |
|
|
173
|
+
|
|
174
|
+
The goal is not to make Claude Code timid. It is to make its boundaries clear:
|
|
175
|
+
Bizar works through local implementation and verification, then stops at the
|
|
176
|
+
point where an external or difficult-to-reverse decision belongs to you.
|
|
177
|
+
|
|
178
|
+
## What gets installed
|
|
179
|
+
|
|
180
|
+
```text
|
|
181
|
+
~/.claude/
|
|
182
|
+
├── agents/ 84 Bizar roles and specialist definitions
|
|
183
|
+
├── skills/ 80 skill packs
|
|
184
|
+
├── commands/ 39 slash-command surfaces
|
|
185
|
+
├── hooks/ routing, lifecycle, safety, evidence, and quality hooks
|
|
186
|
+
├── rules/ focused guidance for common development work
|
|
187
|
+
├── workflows/ native workflow definitions
|
|
188
|
+
├── settings.json Bizar-managed Claude Code integration
|
|
189
|
+
└── model-router.json operator-selected model state
|
|
190
|
+
|
|
191
|
+
~/.config/bizar/
|
|
192
|
+
├── installed.json install record
|
|
193
|
+
├── evidence/ local dispatch and verification evidence
|
|
194
|
+
├── telemetry/ local routing and rejected-action feedback
|
|
195
|
+
└── worktree-queue.json completed worktree integration queue
|
|
196
|
+
```
|
|
68
197
|
|
|
69
|
-
|
|
198
|
+
`bizar control` is a machine-readable command boundary for optional external
|
|
199
|
+
interfaces. Bizar deliberately does not include an embedded browser control
|
|
200
|
+
plane, background daemon, or general-purpose note vault.
|
|
70
201
|
|
|
71
|
-
|
|
72
|
-
task and integration queues, feature ledger, progress summary, Claude Code
|
|
73
|
-
background sessions, and durable control messages. OpenKan invokes task and
|
|
74
|
-
session mutations through the same CLI instead of importing Bizar modules or
|
|
75
|
-
opening its SQLite database.
|
|
202
|
+
## Commands worth knowing
|
|
76
203
|
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
204
|
+
| Command | When to use it |
|
|
205
|
+
| --- | --- |
|
|
206
|
+
| `bizar install` | Install or refresh Bizar in your global Claude configuration |
|
|
207
|
+
| `bizar models` | Discover and select the models Bizar may dispatch |
|
|
208
|
+
| `bizar doctor` | Diagnose the global installation and provider connectivity |
|
|
209
|
+
| `bizar validate` | Run an install-focused health check |
|
|
210
|
+
| `bizar task` | Inspect or coordinate scoped worktree tasks |
|
|
211
|
+
| `bizar worktree-merge --all` | Review and merge completed isolated work, surfacing conflicts |
|
|
212
|
+
| `bizar control snapshot --json` | Read the machine-friendly current harness state |
|
|
213
|
+
| `bizar evidence` | Inspect local dispatch and verification evidence |
|
|
82
214
|
|
|
83
|
-
##
|
|
215
|
+
## Running Bizar from this repository
|
|
84
216
|
|
|
85
|
-
|
|
217
|
+
For contributors, use the repository checkout rather than the global package:
|
|
86
218
|
|
|
87
|
-
|
|
219
|
+
```sh
|
|
220
|
+
npm install
|
|
221
|
+
npm run build
|
|
222
|
+
node cli/bin.mjs install
|
|
223
|
+
make check
|
|
224
|
+
make test
|
|
225
|
+
make e2e
|
|
226
|
+
```
|
|
88
227
|
|
|
89
|
-
|
|
228
|
+
The verification suite covers both the code and the integration contract:
|
|
90
229
|
|
|
91
230
|
```sh
|
|
92
231
|
make verify-removed-surfaces
|
|
@@ -98,10 +237,13 @@ make clean-check
|
|
|
98
237
|
make check
|
|
99
238
|
```
|
|
100
239
|
|
|
101
|
-
|
|
102
|
-
duplicate skill mirror, or source-only fixture is published.
|
|
240
|
+
## Learn more
|
|
103
241
|
|
|
104
|
-
|
|
242
|
+
- [Documentation index](docs/INDEX.md)
|
|
243
|
+
- [Architecture](docs/architecture.md)
|
|
244
|
+
- [Model routing decisions](docs/decisions/)
|
|
245
|
+
- [Current progress and evidence](PROGRESS.md)
|
|
246
|
+
- [MIT license](LICENSE)
|
|
105
247
|
|
|
106
248
|
## License
|
|
107
249
|
|
package/cli/banner.mjs
CHANGED
|
@@ -14,7 +14,7 @@ export function showBanner() {
|
|
|
14
14
|
console.log(chalk.hex('#6366f1').bold(RUNE_HELM));
|
|
15
15
|
console.log(chalk.hex('#a855f7')(' Guarded autonomous agent system for Claude Code'));
|
|
16
16
|
console.log();
|
|
17
|
-
console.log(chalk.dim('
|
|
17
|
+
console.log(chalk.dim(' 84 agents · guarded autonomy · human approval gates · MCP · Skills CLI'));
|
|
18
18
|
console.log();
|
|
19
19
|
}
|
|
20
20
|
|
package/cli/commands/models.mjs
CHANGED
|
@@ -18,7 +18,8 @@
|
|
|
18
18
|
* reject user-selected IDs.
|
|
19
19
|
*/
|
|
20
20
|
import chalk from 'chalk';
|
|
21
|
-
import {
|
|
21
|
+
import { createHash } from 'node:crypto';
|
|
22
|
+
import { existsSync, mkdirSync, readFileSync, readdirSync, renameSync, rmSync, writeFileSync } from 'node:fs';
|
|
22
23
|
import { dirname, join } from 'node:path';
|
|
23
24
|
import readline from 'node:readline';
|
|
24
25
|
|
|
@@ -1055,6 +1056,7 @@ export const CLAUDE_MODEL_OVERRIDE_KEYS = Object.freeze([
|
|
|
1055
1056
|
'claude-sonnet-5',
|
|
1056
1057
|
'claude-opus-5',
|
|
1057
1058
|
'claude-haiku-4-5-20251001',
|
|
1059
|
+
'claude-fable-5',
|
|
1058
1060
|
'claude-opus-4-8',
|
|
1059
1061
|
'claude-opus-4-7',
|
|
1060
1062
|
'claude-opus-4-6',
|
|
@@ -1076,14 +1078,49 @@ export const NATIVE_AGENT_ALIASES = Object.freeze(['sonnet', 'opus', 'haiku', 'f
|
|
|
1076
1078
|
|
|
1077
1079
|
const MODEL_AGENT_WORDS = Object.freeze({ a:'alpha', b:'bravo', c:'charlie', d:'delta', e:'echo', f:'foxtrot', g:'golf', h:'hotel', i:'india', j:'juliet', k:'kilo', l:'lima', m:'mike', n:'november', o:'oscar', p:'papa', q:'quebec', r:'romeo', s:'sierra', t:'tango', u:'uniform', v:'victor', w:'whiskey', x:'xray', y:'yankee', z:'zulu', 0:'zero', 1:'one', 2:'two', 3:'three', 4:'four', 5:'five', 6:'six', 7:'seven', 8:'eight', 9:'nine', '/':'slash', '.':'dot', '-':'dash', '_':'under' });
|
|
1078
1080
|
|
|
1081
|
+
// Keep generated names below common filesystem component limits and leave
|
|
1082
|
+
// enough path budget for the Claude config directory on Windows. The complete
|
|
1083
|
+
// gateway ID remains in frontmatter; this limit only affects the native agent
|
|
1084
|
+
// name and its filename.
|
|
1085
|
+
export const MODEL_AGENT_NAME_MAX_LENGTH = 160;
|
|
1086
|
+
const MODEL_AGENT_NAME_HASH_LENGTH = 16;
|
|
1087
|
+
|
|
1079
1088
|
// These are the stable Bizar role frontmatter names. Model definitions are
|
|
1080
1089
|
// projected per role so Claude Code's task UI retains a meaningful Bizar agent
|
|
1081
1090
|
// identity instead of displaying an opaque model-only worker.
|
|
1082
1091
|
export const BIZAR_AGENT_ROLES = Object.freeze(['mike', 'paul', 'karen', 'linda', 'ria', 'greg', 'steve', 'oscar', 'todd', 'susan', 'pam', 'brenda', 'janet', 'kevin', 'brad', 'carl']);
|
|
1083
1092
|
|
|
1093
|
+
/** Imported specialist definitions use the native Bizar namespace. They are
|
|
1094
|
+
* stable model-bound definitions just like the named Bizar roles, but are
|
|
1095
|
+
* never selected by Bizar's default workflow router. */
|
|
1096
|
+
export const BIZAR_SPECIALIST_AGENT_PREFIX = 'bizar-';
|
|
1097
|
+
|
|
1098
|
+
export function isStableManagedAgentName(name) {
|
|
1099
|
+
const value = String(name || '').trim();
|
|
1100
|
+
return BIZAR_AGENT_ROLES.includes(value) || /^bizar-[a-z-]+$/.test(value);
|
|
1101
|
+
}
|
|
1102
|
+
|
|
1103
|
+
export function stableSpecialistAgentNames(agentsDir = join(resolveClaudeConfigDir(), 'agents')) {
|
|
1104
|
+
if (!existsSync(agentsDir)) return [];
|
|
1105
|
+
return readdirSync(agentsDir)
|
|
1106
|
+
.filter((name) => /^bizar-[a-z-]+\.md$/.test(name))
|
|
1107
|
+
.map((name) => name.slice(0, -3))
|
|
1108
|
+
.sort();
|
|
1109
|
+
}
|
|
1110
|
+
|
|
1084
1111
|
export function modelAgentName(modelId, role = 'worker') {
|
|
1085
1112
|
const safeRole = BIZAR_AGENT_ROLES.includes(role) ? role : 'worker';
|
|
1086
|
-
|
|
1113
|
+
const normalizedModelId = String(modelId || '').toLowerCase();
|
|
1114
|
+
const expanded = [...normalizedModelId].map((ch) => MODEL_AGENT_WORDS[ch] || 'unknown').join('-');
|
|
1115
|
+
const fullName = `${safeRole}-bizar-${expanded}`;
|
|
1116
|
+
if (fullName.length <= MODEL_AGENT_NAME_MAX_LENGTH) return fullName;
|
|
1117
|
+
|
|
1118
|
+
const hash = createHash('sha256')
|
|
1119
|
+
.update(`${safeRole}\0${normalizedModelId}`)
|
|
1120
|
+
.digest('hex')
|
|
1121
|
+
.slice(0, MODEL_AGENT_NAME_HASH_LENGTH);
|
|
1122
|
+
const suffix = `-${hash}`;
|
|
1123
|
+
return `${fullName.slice(0, MODEL_AGENT_NAME_MAX_LENGTH - suffix.length)}${suffix}`;
|
|
1087
1124
|
}
|
|
1088
1125
|
|
|
1089
1126
|
export function isGeneratedModelAgentName(name, modelIds) {
|
|
@@ -1117,7 +1154,8 @@ export function syncStableRoleModelAgents(modelIds, opts = {}) {
|
|
|
1117
1154
|
const agentsDir = opts.agentsDir || join(resolveClaudeConfigDir(), 'agents');
|
|
1118
1155
|
const defaultModel = (Array.isArray(modelIds) ? modelIds : []).find((id) => typeof id === 'string' && id.trim())?.trim() || null;
|
|
1119
1156
|
const names = [];
|
|
1120
|
-
|
|
1157
|
+
const managedNames = [...new Set([...BIZAR_AGENT_ROLES, ...stableSpecialistAgentNames(agentsDir)])];
|
|
1158
|
+
for (const role of managedNames) {
|
|
1121
1159
|
const path = join(agentsDir, `${role}.md`);
|
|
1122
1160
|
if (!existsSync(path)) continue;
|
|
1123
1161
|
const source = readFileSync(path, 'utf8');
|
|
@@ -2401,17 +2439,20 @@ export async function run(name, args, isHelpRequest, deps = {}) {
|
|
|
2401
2439
|
const models = configuredEnabledModels(router);
|
|
2402
2440
|
const agentTypes = Object.fromEntries(models.map((id) => [id, Object.fromEntries(BIZAR_AGENT_ROLES.map((role) => [role, modelAgentName(id, role)]))]));
|
|
2403
2441
|
const stableRoleTypes = Object.fromEntries(BIZAR_AGENT_ROLES.map((role) => [role, role]));
|
|
2442
|
+
const stableSpecialistTypes = Object.fromEntries(stableSpecialistAgentNames().map((role) => [role, role]));
|
|
2404
2443
|
const payload = {
|
|
2405
2444
|
routerPath,
|
|
2406
2445
|
models,
|
|
2407
2446
|
defaultModel: models[0] || null,
|
|
2408
2447
|
stableRoleTypes,
|
|
2448
|
+
stableSpecialistTypes,
|
|
2409
2449
|
agentTypes,
|
|
2410
2450
|
agentsDir: join(resolveClaudeConfigDir(), 'agents', 'bizar-models'),
|
|
2411
2451
|
};
|
|
2412
2452
|
if (wantJson) process.stdout.write(JSON.stringify(payload, null, 2) + '\n');
|
|
2413
2453
|
else {
|
|
2414
2454
|
process.stdout.write(`default\t${JSON.stringify(stableRoleTypes)}\n`);
|
|
2455
|
+
process.stdout.write(`specialists\t${JSON.stringify(stableSpecialistTypes)}\n`);
|
|
2415
2456
|
for (const id of models) process.stdout.write(`${id}\t${JSON.stringify(agentTypes[id])}\n`);
|
|
2416
2457
|
}
|
|
2417
2458
|
return true;
|
|
@@ -46,12 +46,11 @@ export const REQUIRED_AGENTS = [
|
|
|
46
46
|
export const REQUIRED_COMMANDS = [
|
|
47
47
|
'artifact.md', 'audit.md', 'autopilot.md', 'backup.md', 'bizar.md',
|
|
48
48
|
'browser.md', 'cancel.md', 'cron.md', 'doctor.md', 'explain.md', 'init.md',
|
|
49
|
-
'learn.md', '
|
|
50
|
-
'
|
|
51
|
-
'setup-provider.md', 'spec.md', 'sprint.md', '
|
|
52
|
-
'
|
|
53
|
-
'
|
|
54
|
-
'use-premium.md', 'validate.md', 'verify.md',
|
|
49
|
+
'learn.md', 'plan.md', 'plow-through.md', 'pr-review.md', 'quick.md',
|
|
50
|
+
'ralph.md', 'ralplan.md', 'rca.md', 'repair.md', 'restore.md',
|
|
51
|
+
'setup-provider.md', 'spec.md', 'sprint.md', 'team.md', 'test.md',
|
|
52
|
+
'tools.md', 'ultracode.md', 'ultraqa.md', 'ultrawork.md', 'update.md',
|
|
53
|
+
'validate.md', 'verify.md',
|
|
55
54
|
];
|
|
56
55
|
|
|
57
56
|
// v6.3.0 — Claude Code hook adapter scripts (executable, .mjs extension).
|
|
@@ -434,7 +433,7 @@ export function showValidateHelp() {
|
|
|
434
433
|
• permissions follow the current hook-enforced policy
|
|
435
434
|
• hook-enforced approval and destructive-action floor
|
|
436
435
|
• all 14 Claude Code lifecycle events wired in settings.json
|
|
437
|
-
• all
|
|
436
|
+
• all shipped agent files installed with unique Claude Code names
|
|
438
437
|
• all shipped slash commands
|
|
439
438
|
• all skills / rules / hooks mirrored to ~/.claude/
|
|
440
439
|
• ~/.config/bizar/ runtime state ready
|
package/cli/install/banner.mjs
CHANGED
|
@@ -15,7 +15,7 @@ const RUNE_HELM = `
|
|
|
15
15
|
╚═════╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚═╝ ╚═╝
|
|
16
16
|
`;
|
|
17
17
|
|
|
18
|
-
const TAGLINE = '
|
|
18
|
+
const TAGLINE = '84 agents · guarded autonomy · human approval gates · MCP · Skills CLI';
|
|
19
19
|
|
|
20
20
|
export const palette = {
|
|
21
21
|
primary: chalk.hex('#6366f1'),
|
|
@@ -92,7 +92,19 @@ export async function runInteractiveSetup({
|
|
|
92
92
|
const interactive = enabled && input.isTTY === true && output.isTTY === true;
|
|
93
93
|
if (!interactive) {
|
|
94
94
|
if (detected.missing.length > 0) {
|
|
95
|
-
|
|
95
|
+
const missing = detected.missing.join(' and ');
|
|
96
|
+
const header = ` [BIZAR_PROVIDER_CONFIG_MISSING] Provider ${missing} not configured in this non-interactive run.`;
|
|
97
|
+
const action = ` Set ANTHROPIC_BASE_URL and ANTHROPIC_AUTH_TOKEN in the environment, or run \`bizar setup-provider\` interactively.`;
|
|
98
|
+
writeLine(output, '');
|
|
99
|
+
writeLine(output, header);
|
|
100
|
+
writeLine(output, action);
|
|
101
|
+
writeLine(output, '');
|
|
102
|
+
// Also surface to stderr when output is the real stdout so CI runners
|
|
103
|
+
// and operator logs do not silently lose the warning in a flood of
|
|
104
|
+
// piped output. The custom test output streams ignore stderr.
|
|
105
|
+
if (output === process.stdout) {
|
|
106
|
+
process.stderr.write(`${header}\n${action}\n`);
|
|
107
|
+
}
|
|
96
108
|
}
|
|
97
109
|
return { ok: true, interactive: false, configured: detected.missing.length === 0, missing: detected.missing };
|
|
98
110
|
}
|
package/cli/install/paths.mjs
CHANGED
|
@@ -8,22 +8,14 @@
|
|
|
8
8
|
import chalk from 'chalk';
|
|
9
9
|
import { homedir } from 'node:os';
|
|
10
10
|
import { join } from 'node:path';
|
|
11
|
+
import { resolveClaudeConfigDir } from '../config-paths.mjs';
|
|
11
12
|
|
|
12
13
|
/** Resolve the Claude Code config directory.
|
|
13
14
|
* 1. `process.env.CLAUDE_CONFIG_DIR`
|
|
14
15
|
* 2. `$HOME/.claude`
|
|
15
16
|
*/
|
|
16
17
|
export function resolveClaudeDir() {
|
|
17
|
-
|
|
18
|
-
if (process.env.CLAUDE_CONFIG_DIR && process.env.CLAUDE_CONFIG_DIR.trim()) {
|
|
19
|
-
return process.env.CLAUDE_CONFIG_DIR.trim();
|
|
20
|
-
}
|
|
21
|
-
if (process.platform === 'win32') {
|
|
22
|
-
return process.env.APPDATA
|
|
23
|
-
? join(process.env.APPDATA, 'Claude')
|
|
24
|
-
: join(HOME, '.claude');
|
|
25
|
-
}
|
|
26
|
-
return join(HOME, '.claude');
|
|
18
|
+
return resolveClaudeConfigDir();
|
|
27
19
|
}
|
|
28
20
|
|
|
29
21
|
const HOME = homedir();
|
package/cli/provision.mjs
CHANGED
|
@@ -31,7 +31,11 @@ import {
|
|
|
31
31
|
import { homedir } from 'node:os';
|
|
32
32
|
import { dirname, join, resolve, sep } from 'node:path';
|
|
33
33
|
import { fileURLToPath } from 'node:url';
|
|
34
|
-
import {
|
|
34
|
+
import {
|
|
35
|
+
resolveBizarHome,
|
|
36
|
+
resolveClaudeConfigDir,
|
|
37
|
+
resolveGlobalModelRouter,
|
|
38
|
+
} from './config-paths.mjs';
|
|
35
39
|
import {
|
|
36
40
|
buildClaudeModelOverrides,
|
|
37
41
|
configuredEnabledModels,
|
|
@@ -64,15 +68,7 @@ export const BIZAR_VERSION = (() => {
|
|
|
64
68
|
* 2. `$HOME/.claude`
|
|
65
69
|
*/
|
|
66
70
|
export function resolveClaudeDir() {
|
|
67
|
-
|
|
68
|
-
return process.env.CLAUDE_CONFIG_DIR.trim();
|
|
69
|
-
}
|
|
70
|
-
if (process.platform === 'win32') {
|
|
71
|
-
return process.env.APPDATA
|
|
72
|
-
? join(process.env.APPDATA, 'Claude')
|
|
73
|
-
: join(HOME, '.claude');
|
|
74
|
-
}
|
|
75
|
-
return join(HOME, '.claude');
|
|
71
|
+
return resolveClaudeConfigDir();
|
|
76
72
|
}
|
|
77
73
|
|
|
78
74
|
export const CLAUDE_DIR = resolveClaudeDir();
|
|
@@ -98,9 +94,13 @@ export const CLAUDE_RULES_DIR = join(CLAUDE_DIR, 'rules');
|
|
|
98
94
|
|
|
99
95
|
// ─── Tiny utilities ──────────────────────────────────────────────────────────
|
|
100
96
|
|
|
101
|
-
function haveCmd(cmd) {
|
|
97
|
+
export function haveCmd(cmd) {
|
|
102
98
|
try {
|
|
103
|
-
|
|
99
|
+
if (process.platform === 'win32') {
|
|
100
|
+
execFileSync('where.exe', [cmd], { stdio: ['ignore', 'pipe', 'ignore'] });
|
|
101
|
+
} else {
|
|
102
|
+
execSync(`command -v ${cmd}`, { stdio: ['ignore', 'pipe', 'ignore'] });
|
|
103
|
+
}
|
|
104
104
|
return true;
|
|
105
105
|
} catch {
|
|
106
106
|
return false;
|
|
@@ -1204,7 +1204,14 @@ export async function runProvision(opts = {}) {
|
|
|
1204
1204
|
if (routerStep.ok) logOk(routerStep.message); else logErr(routerStep.message);
|
|
1205
1205
|
stepResults.push({ label: 'model-router', ...routerStep });
|
|
1206
1206
|
|
|
1207
|
-
|
|
1207
|
+
section('Syncing configured model agents');
|
|
1208
|
+
let modelAgentsStep;
|
|
1209
|
+
try {
|
|
1210
|
+
modelAgentsStep = syncConfiguredModelAgents({ dryRun });
|
|
1211
|
+
} catch (err) {
|
|
1212
|
+
const message = err?.message ?? String(err);
|
|
1213
|
+
modelAgentsStep = { ok: false, message: `configured model-agent sync failed: ${message}`, error: message, code: err?.code };
|
|
1214
|
+
}
|
|
1208
1215
|
if (modelAgentsStep.ok) logOk(modelAgentsStep.message); else logErr(modelAgentsStep.message);
|
|
1209
1216
|
stepResults.push({ label: 'model-agents', ...modelAgentsStep });
|
|
1210
1217
|
|
|
@@ -1259,7 +1266,7 @@ export async function runProvision(opts = {}) {
|
|
|
1259
1266
|
} else {
|
|
1260
1267
|
console.log(chalk.dim(' Premium model: (no premium pick configured yet — run `bizar models`)'));
|
|
1261
1268
|
}
|
|
1262
|
-
console.log(chalk.dim('
|
|
1269
|
+
console.log(chalk.dim(' Inspect configured selections with `bizar models --list` or `bizar models --agent-types --json`.'));
|
|
1263
1270
|
console.log('');
|
|
1264
1271
|
return { ok: !anyFail, mode: effectiveMode, state: detectState(), stepResults };
|
|
1265
1272
|
}
|