@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.
Files changed (159) hide show
  1. package/AGENTS.md +17 -14
  2. package/README.md +209 -67
  3. package/cli/banner.mjs +1 -1
  4. package/cli/commands/models.mjs +44 -3
  5. package/cli/commands/validate.mjs +6 -7
  6. package/cli/install/banner.mjs +1 -1
  7. package/cli/install/interactive-setup.mjs +13 -1
  8. package/cli/install/paths.mjs +2 -10
  9. package/cli/provision.mjs +21 -14
  10. package/cli/utils.mjs +2 -11
  11. package/config/claude/CLAUDE.md +17 -14
  12. package/config/claude/agents/bizar-accessibility-architect.md +153 -0
  13. package/config/claude/agents/bizar-agent-evaluator.md +210 -0
  14. package/config/claude/agents/bizar-architect.md +224 -0
  15. package/config/claude/agents/bizar-build-error-resolver.md +127 -0
  16. package/config/claude/agents/bizar-chief-of-staff.md +164 -0
  17. package/config/claude/agents/bizar-code-architect.md +84 -0
  18. package/config/claude/agents/bizar-code-explorer.md +82 -0
  19. package/config/claude/agents/bizar-code-reviewer.md +327 -0
  20. package/config/claude/agents/bizar-code-simplifier.md +60 -0
  21. package/config/claude/agents/bizar-comment-analyzer.md +58 -0
  22. package/config/claude/agents/bizar-conversation-analyzer.md +65 -0
  23. package/config/claude/agents/bizar-cpp-build-resolver.md +103 -0
  24. package/config/claude/agents/bizar-cpp-reviewer.md +85 -0
  25. package/config/claude/agents/bizar-csharp-reviewer.md +114 -0
  26. package/config/claude/agents/bizar-dart-build-resolver.md +214 -0
  27. package/config/claude/agents/bizar-database-reviewer.md +104 -0
  28. package/config/claude/agents/bizar-django-build-resolver.md +256 -0
  29. package/config/claude/agents/bizar-django-reviewer.md +173 -0
  30. package/config/claude/agents/bizar-doc-updater.md +120 -0
  31. package/config/claude/agents/bizar-docs-lookup.md +81 -0
  32. package/config/claude/agents/bizar-end-to-end-runner.md +120 -0
  33. package/config/claude/agents/bizar-fastapi-reviewer.md +83 -0
  34. package/config/claude/agents/bizar-flutter-reviewer.md +256 -0
  35. package/config/claude/agents/bizar-fsharp-reviewer.md +113 -0
  36. package/config/claude/agents/bizar-gan-evaluator.md +236 -0
  37. package/config/claude/agents/bizar-gan-generator.md +144 -0
  38. package/config/claude/agents/bizar-gan-planner.md +112 -0
  39. package/config/claude/agents/bizar-go-build-resolver.md +107 -0
  40. package/config/claude/agents/bizar-go-reviewer.md +89 -0
  41. package/config/claude/agents/bizar-harmonyos-app-resolver.md +186 -0
  42. package/config/claude/agents/bizar-harness-optimizer.md +59 -0
  43. package/config/claude/agents/bizar-healthcare-reviewer.md +96 -0
  44. package/config/claude/agents/bizar-homelab-architect.md +111 -0
  45. package/config/claude/agents/bizar-java-build-resolver.md +279 -0
  46. package/config/claude/agents/bizar-java-reviewer.md +194 -0
  47. package/config/claude/agents/bizar-kotlin-build-resolver.md +131 -0
  48. package/config/claude/agents/bizar-kotlin-reviewer.md +172 -0
  49. package/config/claude/agents/bizar-loop-operator.md +49 -0
  50. package/config/claude/agents/bizar-marketing-agent.md +163 -0
  51. package/config/claude/agents/bizar-mle-reviewer.md +166 -0
  52. package/config/claude/agents/bizar-network-architect.md +110 -0
  53. package/config/claude/agents/bizar-network-config-reviewer.md +110 -0
  54. package/config/claude/agents/bizar-network-troubleshooter.md +132 -0
  55. package/config/claude/agents/bizar-opensource-forker.md +211 -0
  56. package/config/claude/agents/bizar-opensource-packager.md +262 -0
  57. package/config/claude/agents/bizar-opensource-sanitizer.md +201 -0
  58. package/config/claude/agents/bizar-performance-optimizer.md +459 -0
  59. package/config/claude/agents/bizar-php-reviewer.md +113 -0
  60. package/config/claude/agents/bizar-planner.md +225 -0
  61. package/config/claude/agents/bizar-pr-test-analyzer.md +58 -0
  62. package/config/claude/agents/bizar-python-reviewer.md +111 -0
  63. package/config/claude/agents/bizar-pytorch-build-resolver.md +133 -0
  64. package/config/claude/agents/bizar-rag-pipeline-reviewer.md +71 -0
  65. package/config/claude/agents/bizar-react-build-resolver.md +219 -0
  66. package/config/claude/agents/bizar-react-reviewer.md +171 -0
  67. package/config/claude/agents/bizar-refactor-cleaner.md +98 -0
  68. package/config/claude/agents/bizar-rust-build-resolver.md +161 -0
  69. package/config/claude/agents/bizar-rust-reviewer.md +107 -0
  70. package/config/claude/agents/bizar-security-reviewer.md +121 -0
  71. package/config/claude/agents/bizar-seo-specialist.md +75 -0
  72. package/config/claude/agents/bizar-silent-failure-hunter.md +63 -0
  73. package/config/claude/agents/bizar-spec-miner.md +221 -0
  74. package/config/claude/agents/bizar-swift-build-resolver.md +174 -0
  75. package/config/claude/agents/bizar-swift-reviewer.md +120 -0
  76. package/config/claude/agents/bizar-tdd-guide.md +104 -0
  77. package/config/claude/agents/bizar-type-design-analyzer.md +54 -0
  78. package/config/claude/agents/bizar-typescript-reviewer.md +128 -0
  79. package/config/claude/agents/bizar-vue-reviewer.md +210 -0
  80. package/config/claude/agents/office-manager.md +13 -15
  81. package/config/claude/commands/bizar.md +6 -5
  82. package/config/claude/commands/plow-through.md +3 -2
  83. package/config/claude/commands/quick.md +14 -14
  84. package/config/claude/commands/team.md +5 -2
  85. package/config/claude/hooks/agent-model-guard.mjs +2 -2
  86. package/config/claude/hooks/sessionend-recall.mjs +1 -9
  87. package/config/claude/hooks/sessionstart-prime.mjs +2 -2
  88. package/config/claude/hooks/thinking-route.mjs +0 -1
  89. package/config/claude/hooks/worker-suggest.mjs +12 -24
  90. package/config/claude/hooks/workflow-route-guard.mjs +4 -3
  91. package/config/claude/hooks/workflow-route-state.mjs +1 -1
  92. package/config/skills/brainstorming/SKILL.md +253 -0
  93. package/config/skills/brainstorming/scripts/frame-template.html +213 -0
  94. package/config/skills/brainstorming/scripts/helper.js +167 -0
  95. package/config/skills/brainstorming/scripts/server.cjs +723 -0
  96. package/config/skills/brainstorming/scripts/start-server.sh +209 -0
  97. package/config/skills/brainstorming/scripts/stop-server.sh +120 -0
  98. package/config/skills/brainstorming/spec-document-reviewer-prompt.md +49 -0
  99. package/config/skills/brainstorming/visual-companion.md +299 -0
  100. package/config/skills/dispatching-parallel-agents/SKILL.md +170 -0
  101. package/config/skills/executing-plans/SKILL.md +67 -0
  102. package/config/skills/finishing-a-development-branch/SKILL.md +228 -0
  103. package/config/skills/receiving-code-review/SKILL.md +208 -0
  104. package/config/skills/requesting-code-review/SKILL.md +98 -0
  105. package/config/skills/requesting-code-review/code-reviewer.md +181 -0
  106. package/config/skills/subagent-driven-development/SKILL.md +571 -0
  107. package/config/skills/subagent-driven-development/implementer-prompt.md +154 -0
  108. package/config/skills/subagent-driven-development/re-review-prompt.md +115 -0
  109. package/config/skills/subagent-driven-development/scripts/review-package +46 -0
  110. package/config/skills/subagent-driven-development/scripts/sdd-workspace +40 -0
  111. package/config/skills/subagent-driven-development/scripts/task-brief +41 -0
  112. package/config/skills/subagent-driven-development/task-reviewer-prompt.md +207 -0
  113. package/config/skills/systematic-debugging/CREATION-LOG.md +119 -0
  114. package/config/skills/systematic-debugging/SKILL.md +286 -0
  115. package/config/skills/systematic-debugging/condition-based-waiting-example.ts +158 -0
  116. package/config/skills/systematic-debugging/condition-based-waiting.md +115 -0
  117. package/config/skills/systematic-debugging/defense-in-depth.md +122 -0
  118. package/config/skills/systematic-debugging/find-polluter.sh +72 -0
  119. package/config/skills/systematic-debugging/root-cause-tracing.md +169 -0
  120. package/config/skills/systematic-debugging/test-academic.md +14 -0
  121. package/config/skills/systematic-debugging/test-pressure-1.md +58 -0
  122. package/config/skills/systematic-debugging/test-pressure-2.md +68 -0
  123. package/config/skills/systematic-debugging/test-pressure-3.md +69 -0
  124. package/config/skills/test-driven-development/SKILL.md +323 -0
  125. package/config/skills/test-driven-development/writing-good-tests.md +198 -0
  126. package/config/skills/using-git-worktrees/SKILL.md +170 -0
  127. package/config/skills/using-superpowers/SKILL.md +66 -0
  128. package/config/skills/using-superpowers/references/antigravity-tools.md +23 -0
  129. package/config/skills/using-superpowers/references/codex-tools.md +108 -0
  130. package/config/skills/using-superpowers/references/gemini-tools.md +63 -0
  131. package/config/skills/using-superpowers/references/hermes-tools.md +56 -0
  132. package/config/skills/using-superpowers/references/pi-tools.md +16 -0
  133. package/config/skills/verification-before-completion/SKILL.md +123 -0
  134. package/config/skills/writing-plans/SKILL.md +174 -0
  135. package/config/skills/writing-plans/plan-document-reviewer-prompt.md +49 -0
  136. package/config/skills/writing-skills/SKILL.md +682 -0
  137. package/config/skills/writing-skills/anthropic-best-practices.md +1150 -0
  138. package/config/skills/writing-skills/examples/CLAUDE_MD_TESTING.md +189 -0
  139. package/config/skills/writing-skills/graphviz-conventions.dot +172 -0
  140. package/config/skills/writing-skills/persuasion-principles.md +187 -0
  141. package/config/skills/writing-skills/render-graphs.js +169 -0
  142. package/config/skills/writing-skills/testing-skills-with-subagents.md +384 -0
  143. package/config/trigger-patterns.json +1 -1
  144. package/config/workflows/bizar-debug.js +1 -0
  145. package/config/workflows/bizar-implement.js +1 -0
  146. package/config/workflows/bizar-research.js +1 -0
  147. package/config/workflows/ultracode-research.js +1 -0
  148. package/config/workflows/ultracode-review.js +1 -0
  149. package/config/workflows/ultracode.js +1 -0
  150. package/package.json +1 -1
  151. package/packages/sdk/dist/version.d.ts +1 -1
  152. package/packages/sdk/dist/version.js +1 -1
  153. package/packages/sdk/package.json +1 -1
  154. package/config/claude/commands/migrate.md +0 -18
  155. package/config/claude/commands/tailscale-serve.md +0 -14
  156. package/config/claude/commands/tier.md +0 -31
  157. package/config/claude/commands/upgrade-defaults.md +0 -34
  158. package/config/claude/commands/use-default.md +0 -12
  159. 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 selects the coordination mode after bounded read-only orientation and one
62
- user clarification checkpoint: direct work only for an unmistakably tiny
63
- single-target copy/style/format edit; one isolated Agent for a clear bounded
64
- change; a native workflow for repeatable phased work; parallel Agents for
65
- disjoint scopes; and an Agent team for 3+ sustained roles that genuinely need
66
- cross-talk. Do not add unnecessary phases or duplicate workers. The team is
67
- host-side state under `CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS=1`, and per
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 adaptive coordination policy. For non-tiny
137
- work, Mike first gathers only bounded read-only context, asks one concise
138
- clarification question that names the inferred outcome and proposed mode, then
139
- continues autonomously after the answer. A native workflow is one available
140
- mode, not a universal gate; Mike may select an isolated Agent, parallel Agents,
141
- or an Agent team when that better fits the work. Mike owns integration and
142
- final verification.
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
- # Bizar Harness
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
- Bizar is a guarded-autonomy harness for Claude Code. It packages 16 uniquely named role agents, 66 skills, slash-command workflows, lifecycle and safety hooks, a typed SDK, a 14-tool MCP server, and install/audit/test utilities.
21
+ ---
4
22
 
5
- ## What it does
23
+ ## Why Bizar?
6
24
 
7
- - Executes clear local edit/test/verify work autonomously.
8
- - Uses Claude Code permission modes plus deterministic hooks for safety.
9
- - Requires human confirmation for commits, pushes, PR mutations, releases, publishing, deployments, and other external or irreversible operations.
10
- - Routes non-trivial work through research, plan/audit, implementation, review, and verification phases.
11
- - Preserves bounded session handoffs and learning evidence without providing a general-purpose note vault.
12
- - Guards compaction fidelity, commit quality, prose quality, dangerous shell commands, protected paths, and reviewer context.
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
- Bizar deliberately ships no embedded web control plane, browser extension,
15
- background web service, or note-vault/search subsystem. The machine-readable
16
- `bizar control` command lets an optional OpenKan installation present Bizar
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
- ## Quick start
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
- npm run build
25
- node cli/bin.mjs install
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 reads `.claude/settings.json`. `cli/provision.mjs` can copy agents, commands, skills, hooks, rules, and settings into `~/.claude/` for user-level use.
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
- ## Core surfaces
60
+ For a completely fresh Bizar-managed Claude setup while retaining endpoint and
61
+ authentication settings:
34
62
 
35
- | Surface | Purpose |
36
- | --- | --- |
37
- | `.claude/agents/` | Office-themed role agents and orchestrator |
38
- | `config/skills/` | Canonical skill library |
39
- | `.claude/commands/` | Slash-command workflows |
40
- | `.claude/hooks/` | Safety, HITL, lifecycle, routing, telemetry, and compaction hooks |
41
- | `packages/sdk/` | Agent registry, router, learning logs, federation, consensus, and MCP |
42
- | `cli/` | Installer, validator, backup, audit, cost/claim/task/control, sandbox, repair |
43
- | `scripts/` | Architecture, absence, E2E, feature, eval, and clean-state verification |
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
- The MCP tools are `plan_action`, `loop_start`, `loop_stop`, `loop_list`, `loop_status`, `graph_query`, `graph_path`, `list_instincts`, and `list_decisions`.
99
+ ## Your models, everywhere Bizar dispatches
46
100
 
47
- ## Parallel agent coordination
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
- Code-writing subagents run in isolated Git worktrees. `bizar task` stores a
50
- shared SQLite task graph under Git's common directory, so all worktrees observe
51
- the same dependencies, owners, path scopes, and expiring leases. The
52
- PreToolUse ownership hook denies edits outside the current task scope and edits
53
- to paths leased by sibling agents.
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 task create sdk-change --title "Update SDK" --scope "packages/sdk/**"
57
- bizar task claim sdk-change --owner todd --workspace "$PWD"
58
- bizar task heartbeat sdk-change --owner todd
59
- bizar task complete sdk-change --owner todd --evidence "targeted tests passed"
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
- The integration queue records the commit, base reference, verification command,
66
- owner, integrator, and outcome. It deliberately does not perform unapproved
67
- merge, rebase, push, or publication operations.
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
- ## OpenKan control plane
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
- `bizar control snapshot --json` exposes the current agent catalogue, durable
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
- Messages are atomically queued under `.bizar/control/messages/`. Supported
78
- Claude Code `SessionStart` and `UserPromptSubmit` hooks claim and inject matching
79
- messages exactly once. A session-targeted message can request a documented
80
- background resume; Bizar never edits transcripts or attaches to private process
81
- internals.
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
- ## Guarded autonomy
215
+ ## Running Bizar from this repository
84
216
 
85
- Project settings default to `acceptEdits`, which lets Claude iterate locally while preserving prompts around broader shell operations. Operators who meet Claude Code's requirements may choose Auto mode; Bizar's deny/ask hooks still apply before permission-mode evaluation.
217
+ For contributors, use the repository checkout rather than the global package:
86
218
 
87
- The Git workflow hook denies force-push, rebase, unsupported commit subjects, and AI-attribution trailers. It asks before a commit, push, PR mutation, release, publish, or deploy. The simplify guard requires `/simplify` for every commit attempt.
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
- ## Verification
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
- The root package uses a runtime-only allowlist: no test files, local state,
102
- duplicate skill mirror, or source-only fixture is published.
240
+ ## Learn more
103
241
 
104
- See [the documentation index](docs/INDEX.md), [architecture](docs/architecture.md), [core feature audit](docs/audits/core-feature-audit-2026-07-30.md), [repository cleanup audit](docs/audits/repository-cleanup-2026-07-30.md), and [upstream parity matrix](docs/audits/claude-codex-settings-parity-2026-07-30.md).
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(' 16 agents · guarded autonomy · human approval gates · MCP · Skills CLI'));
17
+ console.log(chalk.dim(' 84 agents · guarded autonomy · human approval gates · MCP · Skills CLI'));
18
18
  console.log();
19
19
  }
20
20
 
@@ -18,7 +18,8 @@
18
18
  * reject user-selected IDs.
19
19
  */
20
20
  import chalk from 'chalk';
21
- import { existsSync, mkdirSync, readFileSync, renameSync, rmSync, writeFileSync } from 'node:fs';
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
- return `${safeRole}-bizar-${[...String(modelId || '').toLowerCase()].map((ch) => MODEL_AGENT_WORDS[ch] || 'unknown').join('-')}`;
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
- for (const role of BIZAR_AGENT_ROLES) {
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', 'migrate.md', 'plan.md', 'plow-through.md', 'pr-review.md',
50
- 'quick.md', 'ralph.md', 'ralplan.md', 'rca.md', 'repair.md', 'restore.md',
51
- 'setup-provider.md', 'spec.md', 'sprint.md', 'tailscale-serve.md', 'team.md',
52
- 'test.md', 'tier.md', 'tools.md', 'ultracode.md', 'ultraqa.md',
53
- 'ultrawork.md', 'update.md', 'upgrade-defaults.md', 'use-default.md',
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 16 agent files installed with unique Claude Code names
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
@@ -15,7 +15,7 @@ const RUNE_HELM = `
15
15
  ╚═════╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚═╝ ╚═╝
16
16
  `;
17
17
 
18
- const TAGLINE = '16 agents · guarded autonomy · human approval gates · MCP · Skills CLI';
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
- writeLine(output, ` ! Provider ${detected.missing.join(' and ')} not detected; set ANTHROPIC_BASE_URL and ANTHROPIC_AUTH_TOKEN or run \`bizar setup-provider\`.`);
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
  }
@@ -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
- const HOME = homedir();
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 { resolveBizarHome, resolveGlobalModelRouter } from './config-paths.mjs';
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
- if (process.env.CLAUDE_CONFIG_DIR && process.env.CLAUDE_CONFIG_DIR.trim()) {
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
- execSync(`command -v ${cmd}`, { stdio: ['ignore', 'pipe', 'ignore'] });
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
- const modelAgentsStep = syncConfiguredModelAgents({ dryRun });
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(' See /use-premium or .claude/commands/use-premium.md for the full launch snippet.'));
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
  }