@polderlabs/bizar 10.25.2 → 10.28.0-beta.1

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 (173) hide show
  1. package/README.md +133 -91
  2. package/cli/bin.mjs +0 -60
  3. package/cli/commands/hook.mjs +0 -7
  4. package/cli/commands/openkan.mjs +11 -3
  5. package/cli/commands/setup-provider.mjs +4 -2
  6. package/cli/commands/tools.mjs +19 -6
  7. package/cli/commands/upgrade-defaults.mjs +6 -33
  8. package/cli/commands/util.mjs +1 -1
  9. package/cli/commands/validate.mjs +32 -26
  10. package/cli/commands/worker.mjs +30 -21
  11. package/cli/config-paths.mjs +0 -12
  12. package/cli/doctor.mjs +33 -23
  13. package/cli/install/interactive-setup.mjs +5 -4
  14. package/cli/openkan.mjs +57 -8
  15. package/cli/provision.mjs +50 -187
  16. package/config/agents/model-assignment.mjs +45 -97
  17. package/config/claude/CLAUDE.md +213 -0
  18. package/config/claude/agents/_shared/SKILLS.md +4 -2
  19. package/config/claude/agents/bizar-accessibility-architect.md +1 -0
  20. package/config/claude/agents/bizar-agent-evaluator.md +1 -0
  21. package/config/claude/agents/bizar-architect.md +1 -0
  22. package/config/claude/agents/bizar-build-error-resolver.md +1 -0
  23. package/config/claude/agents/bizar-chief-of-staff.md +1 -0
  24. package/config/claude/agents/bizar-code-architect.md +1 -0
  25. package/config/claude/agents/bizar-code-explorer.md +1 -0
  26. package/config/claude/agents/bizar-code-reviewer.md +1 -0
  27. package/config/claude/agents/bizar-code-simplifier.md +1 -0
  28. package/config/claude/agents/bizar-comment-analyzer.md +1 -0
  29. package/config/claude/agents/bizar-conversation-analyzer.md +1 -0
  30. package/config/claude/agents/bizar-cpp-build-resolver.md +1 -0
  31. package/config/claude/agents/bizar-cpp-reviewer.md +1 -0
  32. package/config/claude/agents/bizar-csharp-reviewer.md +1 -0
  33. package/config/claude/agents/bizar-dart-build-resolver.md +1 -0
  34. package/config/claude/agents/bizar-database-reviewer.md +1 -0
  35. package/config/claude/agents/bizar-django-build-resolver.md +1 -0
  36. package/config/claude/agents/bizar-django-reviewer.md +1 -0
  37. package/config/claude/agents/bizar-doc-updater.md +1 -0
  38. package/config/claude/agents/bizar-docs-lookup.md +1 -0
  39. package/config/claude/agents/bizar-end-to-end-runner.md +1 -0
  40. package/config/claude/agents/bizar-fastapi-reviewer.md +1 -0
  41. package/config/claude/agents/bizar-flutter-reviewer.md +1 -0
  42. package/config/claude/agents/bizar-fsharp-reviewer.md +1 -0
  43. package/config/claude/agents/bizar-gan-evaluator.md +1 -0
  44. package/config/claude/agents/bizar-gan-generator.md +1 -0
  45. package/config/claude/agents/bizar-gan-planner.md +1 -0
  46. package/config/claude/agents/bizar-go-build-resolver.md +1 -0
  47. package/config/claude/agents/bizar-go-reviewer.md +1 -0
  48. package/config/claude/agents/bizar-harmonyos-app-resolver.md +1 -0
  49. package/config/claude/agents/bizar-harness-optimizer.md +1 -0
  50. package/config/claude/agents/bizar-healthcare-reviewer.md +1 -0
  51. package/config/claude/agents/bizar-homelab-architect.md +1 -0
  52. package/config/claude/agents/bizar-java-build-resolver.md +1 -0
  53. package/config/claude/agents/bizar-java-reviewer.md +1 -0
  54. package/config/claude/agents/bizar-kotlin-build-resolver.md +1 -0
  55. package/config/claude/agents/bizar-kotlin-reviewer.md +1 -0
  56. package/config/claude/agents/bizar-loop-operator.md +1 -0
  57. package/config/claude/agents/bizar-marketing-agent.md +1 -0
  58. package/config/claude/agents/bizar-mle-reviewer.md +1 -0
  59. package/config/claude/agents/bizar-network-architect.md +1 -0
  60. package/config/claude/agents/bizar-network-config-reviewer.md +1 -0
  61. package/config/claude/agents/bizar-network-troubleshooter.md +1 -0
  62. package/config/claude/agents/bizar-opensource-forker.md +1 -0
  63. package/config/claude/agents/bizar-opensource-packager.md +1 -0
  64. package/config/claude/agents/bizar-opensource-sanitizer.md +1 -0
  65. package/config/claude/agents/bizar-performance-optimizer.md +1 -0
  66. package/config/claude/agents/bizar-php-reviewer.md +1 -0
  67. package/config/claude/agents/bizar-planner.md +1 -0
  68. package/config/claude/agents/bizar-pr-test-analyzer.md +1 -0
  69. package/config/claude/agents/bizar-python-reviewer.md +1 -0
  70. package/config/claude/agents/bizar-pytorch-build-resolver.md +1 -0
  71. package/config/claude/agents/bizar-rag-pipeline-reviewer.md +1 -0
  72. package/config/claude/agents/bizar-react-build-resolver.md +1 -0
  73. package/config/claude/agents/bizar-react-reviewer.md +1 -0
  74. package/config/claude/agents/bizar-refactor-cleaner.md +1 -0
  75. package/config/claude/agents/bizar-rust-build-resolver.md +1 -0
  76. package/config/claude/agents/bizar-rust-reviewer.md +1 -0
  77. package/config/claude/agents/bizar-security-reviewer.md +1 -0
  78. package/config/claude/agents/bizar-seo-specialist.md +1 -0
  79. package/config/claude/agents/bizar-silent-failure-hunter.md +1 -0
  80. package/config/claude/agents/bizar-spec-miner.md +1 -0
  81. package/config/claude/agents/bizar-swift-build-resolver.md +1 -0
  82. package/config/claude/agents/bizar-swift-reviewer.md +1 -0
  83. package/config/claude/agents/bizar-tdd-guide.md +1 -0
  84. package/config/claude/agents/bizar-type-design-analyzer.md +1 -0
  85. package/config/claude/agents/bizar-typescript-reviewer.md +1 -0
  86. package/config/claude/agents/bizar-vue-reviewer.md +1 -0
  87. package/config/claude/agents/office-greeter.md +1 -1
  88. package/config/claude/agents/office-manager.md +66 -32
  89. package/config/claude/agents/plan-architect.md +12 -12
  90. package/config/claude/agents/planner.md +18 -15
  91. package/config/claude/agents/qa-reviewer.md +14 -14
  92. package/config/claude/commands/bizplan-heavy.md +8 -0
  93. package/config/claude/commands/bizplan-light.md +8 -0
  94. package/config/claude/commands/bizplan.md +8 -0
  95. package/config/claude/commands/setup-provider.md +8 -2
  96. package/config/claude/hooks/README.md +14 -2
  97. package/config/claude/hooks/keyword-router.mjs +5 -3
  98. package/config/claude/hooks/persistent-mode.mjs +82 -32
  99. package/config/claude/hooks/worker-suggest.mjs +5 -5
  100. package/config/claude/hooks/workflow-route-guard.mjs +4 -3
  101. package/config/claude/settings.json +12 -1
  102. package/config/skills/autopilot/SKILL.md +33 -19
  103. package/config/skills/bizar/README.md +9 -0
  104. package/config/skills/bizar/SKILL.md +48 -0
  105. package/config/skills/bizplan/SKILL.md +334 -0
  106. package/config/skills/{ralplan → bizplan}/references/pre-mortem.md +10 -6
  107. package/config/skills/cancel/SKILL.md +12 -10
  108. package/config/skills/deep-interview/SKILL.md +8 -9
  109. package/config/skills/ralph/SKILL.md +19 -8
  110. package/config/skills/ultragoal/SKILL.md +101 -79
  111. package/config/skills/ultraqa/SKILL.md +17 -8
  112. package/config/skills/ultrawork/SKILL.md +17 -8
  113. package/config/skills/verify/SKILL.md +15 -7
  114. package/config/workflows/bizar-debug.js +21 -30
  115. package/config/workflows/bizar-implement.js +20 -30
  116. package/config/workflows/bizar-research.js +18 -29
  117. package/config/workflows/lib/dispatch.js +219 -998
  118. package/config/workflows/ultracode-research.js +18 -28
  119. package/config/workflows/ultracode-review.js +17 -27
  120. package/config/workflows/ultracode.js +19 -29
  121. package/package.json +6 -7
  122. package/packages/sdk/dist/autonomy/outcome-record.d.ts +1 -1
  123. package/packages/sdk/dist/autonomy/outcome-record.js +1 -1
  124. package/packages/sdk/dist/bench/auto-reduction.d.ts +3 -3
  125. package/packages/sdk/dist/bench/auto-reduction.js +3 -3
  126. package/packages/sdk/dist/handoff/bizplan.d.ts +191 -0
  127. package/packages/sdk/dist/handoff/bizplan.js +256 -0
  128. package/packages/sdk/dist/index.d.ts +2 -1
  129. package/packages/sdk/dist/index.js +6 -3
  130. package/packages/sdk/dist/mcp/bizplan.d.ts +36 -0
  131. package/packages/sdk/dist/mcp/bizplan.js +43 -0
  132. package/packages/sdk/dist/mcp/server.js +32 -23
  133. package/packages/sdk/dist/release/known-good-releases.d.ts +7 -0
  134. package/packages/sdk/dist/release/known-good-releases.js +43 -1
  135. package/packages/sdk/dist/version.d.ts +1 -1
  136. package/packages/sdk/dist/version.js +1 -1
  137. package/packages/sdk/package.json +6 -1
  138. package/cli/commands/model.mjs +0 -189
  139. package/cli/commands/models.mjs +0 -2808
  140. package/cli/commands/tier.mjs +0 -159
  141. package/cli/commands/workflow-gc.mjs +0 -221
  142. package/cli/commands/workflow.mjs +0 -347
  143. package/cli/core/ultragoal-state.mjs +0 -535
  144. package/cli/core/workflow-state.mjs +0 -630
  145. package/config/claude/commands/plan.md +0 -21
  146. package/config/claude/commands/ralplan.md +0 -8
  147. package/config/claude/hooks/agent-model-guard.mjs +0 -304
  148. package/config/claude/hooks/sessionstart-model-sync.mjs +0 -312
  149. package/config/claude/hooks/thinking-route.mjs +0 -311
  150. package/config/skills/ralplan/SKILL.md +0 -126
  151. package/packages/sdk/dist/handoff/ralplan.d.ts +0 -86
  152. package/packages/sdk/dist/handoff/ralplan.js +0 -94
  153. package/packages/sdk/dist/router/agent-model-registry.d.ts +0 -323
  154. package/packages/sdk/dist/router/agent-model-registry.js +0 -492
  155. package/packages/sdk/dist/router/codemod-intent.d.ts +0 -68
  156. package/packages/sdk/dist/router/codemod-intent.js +0 -112
  157. package/packages/sdk/dist/router/dispatch-evidence.d.ts +0 -176
  158. package/packages/sdk/dist/router/dispatch-evidence.js +0 -505
  159. package/packages/sdk/dist/router/failover-mirror.mjs +0 -315
  160. package/packages/sdk/dist/router/failover.d.ts +0 -188
  161. package/packages/sdk/dist/router/failover.js +0 -255
  162. package/packages/sdk/dist/router/index.d.ts +0 -176
  163. package/packages/sdk/dist/router/index.js +0 -238
  164. package/packages/sdk/dist/router/model-profile.d.ts +0 -229
  165. package/packages/sdk/dist/router/model-profile.js +0 -199
  166. package/packages/sdk/dist/router/model-router.d.ts +0 -113
  167. package/packages/sdk/dist/router/model-router.js +0 -268
  168. package/packages/sdk/dist/router/outcome-learner.d.ts +0 -180
  169. package/packages/sdk/dist/router/outcome-learner.js +0 -506
  170. package/packages/sdk/dist/router/q-learning-router.d.ts +0 -83
  171. package/packages/sdk/dist/router/q-learning-router.js +0 -277
  172. package/packages/sdk/dist/router/select-dispatch-model.d.ts +0 -227
  173. package/packages/sdk/dist/router/select-dispatch-model.js +0 -532
package/README.md CHANGED
@@ -1,20 +1,20 @@
1
1
  <div align="center">
2
2
 
3
- ```text
4
- ██████╗ ██╗███████╗ █████╗ ██████╗
5
- ██╔══██╗██║╚══███╔╝██╔══██╗██╔══██╗
6
- ██████╔╝██║ ███╔╝ ███████║██████╔╝
7
- ██╔══██╗██║ ███╔╝ ██╔══██║██╔══██╗
8
- ██████╔╝██║███████╗██║ ██║██║ ██║
9
- ╚═════╝ ╚═╝╚══════╝╚═╝ ╚═╝╚═╝ ╚═╝
10
- ```
3
+ <img src="docs/assets/bizar-banner.svg" alt="Bizar: guarded autonomy for Claude Code" width="100%" />
4
+
5
+ [![npm](https://img.shields.io/npm/v/%40polderlabs%2Fbizar?color=0f766e&label=npm)](https://www.npmjs.com/package/@polderlabs/bizar)
6
+ [![license](https://img.shields.io/badge/license-MIT-0f172a)](LICENSE)
7
+ [![Claude Code](https://img.shields.io/badge/works%20with-Claude%20Code-d97757)](https://docs.anthropic.com/en/docs/claude-code)
8
+ [![release](https://img.shields.io/github/v/release/PolderLabsVOF/BizarHarness?color=2563eb&label=release)](https://github.com/PolderLabsVOF/BizarHarness/releases)
9
+ ![OmniRoute routing](https://img.shields.io/badge/routing-OmniRoute-0ea5e9)
10
+ [![Planning](https://img.shields.io/badge/planning-OpenKan-f59e0b)](https://www.npmjs.com/package/@polderlabs/openkan)
11
11
 
12
12
  ### Guarded autonomy for Claude Code
13
13
 
14
14
  Choose your models once. Give Claude Code real work. Bizar supplies the routing,
15
15
  specialists, guardrails, and evidence to carry it through responsibly.
16
16
 
17
- `84 agents` · `80 skills` · `33 commands` · `14-tool MCP server`
17
+ `85 agents` · `85 skills` · `37 commands` · `21-tool MCP server`
18
18
 
19
19
  </div>
20
20
 
@@ -35,47 +35,74 @@ the project you happen to be working on.
35
35
 
36
36
  | You want | Bizar provides |
37
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 |
38
+ | A clean way to begin | A guided installer and a static four-alias dispatch surface |
39
+ | Your own gateway models | Four native aliases (`haiku`/`sonnet`/`opus`/`fable`) with OmniRoute handling ordered failover between configured full IDs |
40
40
  | Useful parallel work | Isolated worktrees, scoped tasks, and specialist roles |
41
41
  | Fewer surprises | Explicit safety checks for releases, publication, deployment, pushes, and destructive operations |
42
42
  | Confidence at the end | Tests, architecture checks, E2E checks, and evidence-aware handoff |
43
43
 
44
- ## Start here
44
+ ## Before you install
45
+
46
+ <table>
47
+ <tr>
48
+ <td width="50%"><strong>Claude Code</strong><br />Bizar adds its integration to your user-level Claude Code configuration. Install Claude Code with Anthropic's installer first.</td>
49
+ <td width="50%"><strong>Node.js 22+</strong><br />OpenKan requires Node.js 22 or newer. Bizar and OpenKan install from npm.</td>
50
+ </tr>
51
+ <tr>
52
+ <td width="50%"><strong>OmniRoute</strong><br />Configure a gateway endpoint, API key, and model ID. OmniRoute resolves the full model IDs behind Bizar's four aliases and handles ordered failover.</td>
53
+ <td width="50%"><strong>Git</strong><br />Needed for isolated worktrees and normal project history. Bizar does not require a persistent daemon.</td>
54
+ </tr>
55
+ </table>
56
+
57
+ ```mermaid
58
+ flowchart LR
59
+ CC[Claude Code] --> B[Bizar]
60
+ B --> OR[OmniRoute gateway]
61
+ OR --> M[Configured model IDs]
62
+ B --> OK[OpenKan]
63
+ OK --> S[.ok workspace]
64
+ ```
65
+
66
+ Configure OmniRoute once before installing Bizar. The command writes provider
67
+ settings to Claude Code and preserves existing hooks, permissions, and MCP
68
+ servers.
69
+
70
+ ```sh
71
+ bizar setup-provider --gateway https://your-gateway.example/v1 --key "$YOUR_API_KEY" --model your/model-id
72
+ ```
73
+
74
+ ## Install Bizar
45
75
 
46
- Install Bizar globally, install its Claude Code integration, then choose the
47
- models you want Bizar to use.
76
+ Install Bizar globally and its Claude Code integration. Bizar dispatches
77
+ through four static aliases: `haiku`, `sonnet`, `opus`, and `fable`. OmniRoute
78
+ maps each alias to configured full model IDs and applies ordered failover.
48
79
 
49
80
  ```sh
50
81
  npm install -g @polderlabs/bizar
51
82
  bizar install
52
- bizar models
53
83
  ```
54
84
 
55
- Restart Claude Code after installation. The installer adds Bizar's agents, skills, commands, hooks, settings, and the
56
- default OpenKan planning runtime to your user-level Claude configuration.
57
- Claude Code itself is installed with Anthropic's native installer; npm is used
58
- for Bizar and OpenKan, not for the Claude Code CLI.
59
- It preserves your configured gateway endpoint and credential values during a
60
- clean reinstall.
85
+ Restart Claude Code after installation. The installer adds Bizar's agents,
86
+ skills, commands, hooks, settings, and the default OpenKan planning runtime to
87
+ your user-level Claude configuration. It preserves your configured gateway
88
+ endpoint and credentials during a clean reinstall.
61
89
 
62
- On a new interactive install, Bizar also asks for an optional default model,
63
- whether Claude Code agent teams should be enabled, the OpenKan install
64
- directory, and whether the current project should receive a `.ok/` workspace.
65
- OpenKan is installed from npm as `@polderlabs/openkan@latest`; its package-owned
66
- agent and skill are installed into the same Claude configuration. Use
67
- `bizar install --yes` for CI or a prompt-free refresh.
90
+ On a new interactive install, Bizar also asks whether Claude Code agent teams
91
+ should be enabled, the OpenKan install directory, and whether the current
92
+ project should receive a `.ok/` workspace. OpenKan is installed from npm as
93
+ `@polderlabs/openkan@latest`; its package-owned agent and skill are
94
+ installed into the same Claude configuration. Use `bizar install --yes` for
95
+ CI or a prompt-free refresh.
68
96
 
69
97
  For a completely fresh Bizar-managed Claude setup while retaining endpoint and
70
98
  authentication settings:
71
99
 
72
100
  ```sh
73
101
  bizar install --force
74
- bizar models
75
102
  ```
76
103
 
77
104
  Then open any repository in Claude Code and describe the outcome you want.
78
- Mikethe Bizar coordinatorhandles the rest.
105
+ Mike, the Bizar coordinator, handles the rest.
79
106
 
80
107
  > **Tip:** Run `bizar doctor` whenever you want to verify that the global
81
108
  > install, Claude settings, hooks, skills, agents, and provider connection are
@@ -105,66 +132,87 @@ obvious edits stay small; larger requests get only the structure they need.
105
132
  Writing agents work in Git worktrees, while read-only research stays light and
106
133
  foregrounded.
107
134
 
108
- ## Your models, everywhere Bizar dispatches
135
+ ## OmniRoute model aliases
109
136
 
110
- `bizar models` is the single operator-facing place to select models. It
111
- discovers candidates from your configured gateway and writes your selections to
112
- the global model router:
137
+ Bizar dispatches through four static native aliases: `haiku`, `sonnet`,
138
+ `opus`, `fable`. Claude Code's native per-call `model` field accepts one of
139
+ these aliases. OmniRoute handles ordered failover between the configured full
140
+ gateway IDs for the chosen alias, so the operator never picks a picker-style
141
+ gateway ID per agent at this layer. There is no `bizar models` picker, no
142
+ `model-router.json`, no `userSelected` block, and no Agent-model-guard hook.
113
143
 
114
- ```text
115
- ~/.claude/model-router.json
116
- ```
144
+ The four aliases are the entire dispatch surface:
117
145
 
118
- The router is never stored in a project directory. Bizar uses the selected
119
- models for direct subagents, workflows, and agent-team teammates.
146
+ | Alias | Use it for |
147
+ | --- | --- |
148
+ | `haiku` | Trivial, economical micro-edits |
149
+ | `sonnet` | Ordinary implementation, research, and planning |
150
+ | `opus` | Architecture, debugging, adversarial review, and high-risk work |
151
+ | `fable` | Explicit Anthropic OpenAI-compatible surfaces |
152
+
153
+ Workflow scripts (`config/workflows/*.js`) inline a tiny `dispatchAgent`
154
+ wrapper that picks the alias from a static policy; agent definitions stay
155
+ model-agnostic so the harness, not the agent, owns alias selection.
120
156
 
121
157
  ```mermaid
122
158
  flowchart TD
123
- Picker["bizar models"] --> Router["Global model router\n~/.claude/model-router.json"]
124
- Router --> Definitions["Global Bizar agent definitions\nfull model ID in frontmatter"]
125
- Router --> Aliases["sonnet · opus · haiku · fable\ncompatibility aliases"]
126
- Definitions --> Agent["Subagents"]
127
- Definitions --> Workflow["Workflow workers"]
128
- Definitions --> Team["Agent-team teammates"]
159
+ Policy["Static alias policy\n(office-manager.md + workflow routeModel)"] --> Aliases["haiku · sonnet · opus · fable"]
160
+ Aliases --> OmniRoute["OmniRoute ordered failover\nper configured full ID"]
161
+ OmniRoute --> Agent["Subagents"]
162
+ OmniRoute --> Workflow["Workflow workers"]
163
+ OmniRoute --> Team["Agent-team teammates"]
129
164
  ```
130
165
 
131
- Claude Code's native per-call model field has a small alias vocabulary. Bizar
132
- avoids making that vocabulary a limitation: it projects each selected gateway
133
- model into a global subagent definition whose frontmatter contains the full
134
- model ID. The agent, workflow, and team routes use that definition. The four
135
- native aliases are compatibility shortcuts only; they do not enable an
136
- unselected provider or reduce your selected-model pool to four choices.
137
-
138
166
  Useful inspection commands:
139
167
 
140
168
  ```sh
141
- bizar models --list
142
- bizar models --agent-types --json
143
- bizar models explain todd
144
169
  bizar doctor
145
170
  ```
146
171
 
172
+ ## OpenKan owns durable work state
173
+
174
+ OpenKan is Bizar's default planning and progression system. Bizar orchestrates
175
+ the work; OpenKan stores project-local tasks, plans, PRDs, goals, and evidence
176
+ under `.ok/`. Bizar talks to OpenKan through the supported `ok` CLI boundary,
177
+ so OpenKan can evolve independently.
178
+
179
+ ```mermaid
180
+ flowchart LR
181
+ R[Repository] --> I[ok init]
182
+ I --> O[.ok workspace]
183
+ O --> T[ok task]
184
+ O --> P[ok plan]
185
+ O --> G[ok prd]
186
+ B[Bizar agents and hooks] --> T
187
+ B --> P
188
+ B --> G
189
+ ```
190
+
191
+ The installer can create an `.ok/` workspace for the current project. In an
192
+ existing repository, run `ok init`. Use `ok task`, `ok plan`, and `ok prd` as
193
+ the canonical commands. On OpenKan v0.5.0 and later, `ok` replaces the legacy
194
+ `openkan` command.
195
+
196
+ | Need | Command |
197
+ | --- | --- |
198
+ | Install or refresh OpenKan | `bizar openkan install` |
199
+ | Create project state | `ok init` |
200
+ | Track scoped work | `ok task` |
201
+ | Track plans and goals | `ok plan` and `ok prd` |
202
+
147
203
  ## A specialist bench, not a generic swarm
148
204
 
149
- Bizar ships its core coordination roles alongside 68 focused specialists for
150
- architecture, accessibility, security, testing, documentation, performance,
151
- language and framework review, build repair, operations, and evaluation. It
152
- also ships 80 skills for planning, debugging, verification, review,
153
- worktrees, and implementation practice.
205
+ Bizar ships 85 agent definitions and 85 skill packs for architecture,
206
+ accessibility, security, testing, documentation, performance, build repair,
207
+ operations, planning, debugging, review, worktrees, and implementation
208
+ practice.
154
209
 
155
210
  The coordinator selects specialists when their expertise reduces a concrete
156
- risk. It does not create parallel workers merely to look busy. You can inspect
157
- the installed specialist definition names through `bizar models --agent-types
158
- --json` and use a relevant Bizar specialist directly when needed.
159
-
160
- ```text
161
- Core coordination Specialist coverage
162
- ───────────────── ──────────────────────────────────
163
- Mike · research · plan Architecture · accessibility · security
164
- Implementation · review Build repair · tests · documentation
165
- Verification · integration Frameworks · performance · operations
166
- Evaluation · product and domain analysis
167
- ```
211
+ risk. It does not create parallel workers merely to look busy.
212
+
213
+ | Coordination | Specialist coverage |
214
+ | --- | --- |
215
+ | Research, planning, implementation, review, verification | Architecture, accessibility, security, tests, documentation, performance, build repair, operations, and domain analysis |
168
216
 
169
217
  ## Guardrails that stay out of the way
170
218
 
@@ -186,25 +234,10 @@ point where an external or difficult-to-reverse decision belongs to you.
186
234
 
187
235
  ## What gets installed
188
236
 
189
- ```text
190
- ~/.claude/
191
- ├── agents/ 84 Bizar roles and specialist definitions
192
- ├── skills/ 80 skill packs
193
- ├── commands/ 39 slash-command surfaces
194
- ├── hooks/ routing, lifecycle, safety, evidence, and quality hooks
195
- ├── rules/ focused guidance for common development work
196
- ├── workflows/ native workflow definitions
197
- ├── settings.json Bizar-managed Claude Code integration
198
- └── model-router.json operator-selected model state
199
-
200
- ~/.config/bizar/
201
- ├── installed.json install record
202
- ├── openkan/ managed @polderlabs/openkan npm runtime
203
- ├── openkan-install.json selected OpenKan home/package settings
204
- ├── evidence/ local dispatch and verification evidence
205
- ├── telemetry/ local routing and rejected-action feedback
206
- └── worktree-queue.json completed worktree integration queue
207
- ```
237
+ | Location | Contents |
238
+ | --- | --- |
239
+ | `~/.claude/` | 85 agent definitions, 85 skills, 37 command surfaces, hooks, rules, workflows, and managed settings |
240
+ | `~/.config/bizar/` | Install record, managed OpenKan runtime, evidence, telemetry, and completed-worktree queue |
208
241
 
209
242
  `bizar control` is a machine-readable command boundary for optional external
210
243
  interfaces. Bizar deliberately does not include an embedded browser control
@@ -217,7 +250,6 @@ plane, background daemon, or general-purpose note vault.
217
250
  | `bizar install` | Install or refresh Bizar, OpenKan, and the global Claude configuration |
218
251
  | `bizar openkan install` | Refresh the managed `@polderlabs/openkan` npm runtime and its agent/skill |
219
252
  | `bizar openkan init` | Initialise `.ok/` planning state in the current project |
220
- | `bizar models` | Discover and select the models Bizar may dispatch |
221
253
  | `bizar doctor` | Diagnose the global installation and provider connectivity |
222
254
  | `bizar validate` | Run an install-focused health check |
223
255
  | `ok task` | Inspect or coordinate scoped worktree tasks (OpenKan-native) |
@@ -255,6 +287,10 @@ make check
255
287
 
256
288
  - [Documentation index](docs/INDEX.md)
257
289
  - [Architecture](docs/architecture.md)
290
+ - [Branching model](docs/branches.md) — `master` (stable) · `beta` · `dev` (nightly)
291
+ - [Versioning rules](docs/versioning.md) — per-branch semver + conventional commits
292
+ - [Development workflow](docs/development.md) — local dev + promotion + manual builds
293
+ - [npm Trusted Publishing setup](docs/trusted-publishing.md) — one-time operator config
258
294
  - [Model routing decisions](docs/decisions/)
259
295
  - [Durable project progress, plans, and goals](.ok/)
260
296
  - [MIT license](LICENSE)
@@ -262,3 +298,9 @@ make check
262
298
  ## License
263
299
 
264
300
  MIT
301
+
302
+ ---
303
+
304
+ <div align="center">
305
+ <a href="https://polderlabs.io/"><img src="docs/assets/sponsored-by-polderlabs.svg" alt="Sponsored by PolderLabs" width="100%" /></a>
306
+ </div>
package/cli/bin.mjs CHANGED
@@ -108,7 +108,6 @@ function showHelp() {
108
108
  artifact Toggle global browser completion artifacts
109
109
  learn Manage bounded global preferences and project lessons
110
110
  tools Inventory installed agents, skills, hooks, commands, and MCP tools
111
- tier Explain the explicit configured model tier for a task
112
111
  upgrade-defaults Reapply safe Bizar-owned Claude defaults
113
112
  backup Create / list / verify / delete backups of BizarHarness state
114
113
  restore Restore BizarHarness from a backup
@@ -132,16 +131,13 @@ function showHelp() {
132
131
  goals <subcommand> OpenKan PRDs, goals, and milestones
133
132
  claim <subcommand> OpenKan task lease shortcut
134
133
  control <subcommand> Machine-readable agents/tasks/plans/goals/sessions/messages API
135
- workflow <subcommand> Session-bound autopilot workflow state
136
134
  hook <name> Run a portable Claude Code hook
137
135
  worktree-merge <branch> Merge a feature branch with archive tag (no work lost)
138
136
  worker <subcommand> Run an exact-model Claude process worker in a worktree
139
- models Configure the global model picker and Models.dev metadata
140
137
  evidence <subcommand> Inspect model-routing evidence
141
138
  improve <subcommand> Propose and verify bounded self-edits
142
139
  sandbox <subcommand> Manage local execution sandboxes
143
140
  explain-run <id> Explain a recorded run
144
- model Deprecated alias for models
145
141
 
146
142
  Examples:
147
143
  bizar install
@@ -452,22 +448,6 @@ async function main() {
452
448
  break;
453
449
  }
454
450
 
455
- case 'models': {
456
- const mod = await importCommand('models');
457
- if (!mod) {
458
- console.error(chalk.red(` ✗ Could not load models command module`));
459
- process.exit(EXIT_ERROR);
460
- return;
461
- }
462
- dbg('loaded command module:', 'models');
463
- const found = await mod.run(cmd, cmdArgs, isHelpRequest);
464
- if (found === false) {
465
- console.error(chalk.red(` ✗ Usage: bizar models [--list|--set|--clear|--json] — run 'bizar models --help'`));
466
- process.exit(EXIT_USAGE);
467
- }
468
- break;
469
- }
470
-
471
451
  case 'artifact': {
472
452
  const mod = await importCommand('artifact');
473
453
  if (!mod) { process.exit(EXIT_ERROR); return; }
@@ -483,7 +463,6 @@ async function main() {
483
463
  }
484
464
 
485
465
  case 'tools':
486
- case 'tier':
487
466
  case 'upgrade-defaults': {
488
467
  const mod = await importCommand(cmd);
489
468
  if (!mod) { process.exit(EXIT_ERROR); return; }
@@ -615,45 +594,6 @@ async function main() {
615
594
  break;
616
595
  }
617
596
 
618
- case 'model': {
619
- // Deprecated alias. Routes to the original `model.mjs` so the
620
- // legacy JSON shape (`{ providers: { ... }, total: N }`) and table
621
- // output keep working for existing scripts and tests. New code
622
- // should use `bizar models` (see `case 'models'`).
623
- const mod = await importCommand('model');
624
- if (!mod) {
625
- console.error(chalk.red(` ✗ Could not load model command module`));
626
- process.exit(EXIT_ERROR);
627
- return;
628
- }
629
- dbg('loaded command module (deprecated alias):', 'model');
630
- if (!isHelpRequest) {
631
- console.error(chalk.yellow(' ! `bizar model` is deprecated; use `bizar models` for the new picker surface.'));
632
- }
633
- const found = await mod.run(cmd, cmdArgs, isHelpRequest);
634
- if (found === false) {
635
- console.error(chalk.red(` ✗ Usage: bizar model <subcommand> — run 'bizar model --help'`));
636
- process.exit(EXIT_USAGE);
637
- }
638
- break;
639
- }
640
-
641
- case 'workflow': {
642
- const mod = await importCommand('workflow');
643
- if (!mod) {
644
- console.error(chalk.red(` ✗ Could not load workflow command module`));
645
- process.exit(EXIT_ERROR);
646
- return;
647
- }
648
- dbg('loaded command module:', 'workflow');
649
- const found = await mod.run(cmd, cmdArgs, isHelpRequest);
650
- if (found === false) {
651
- console.error(chalk.red(` ✗ Usage: bizar workflow <subcommand> — run 'bizar workflow --help'`));
652
- process.exit(EXIT_USAGE);
653
- }
654
- break;
655
- }
656
-
657
597
  case 'hook': {
658
598
  const mod = await importCommand('hook');
659
599
  if (!mod) {
@@ -18,14 +18,12 @@ const HOOK_ROOT = resolve(PACKAGE_ROOT, 'config', 'claude', 'hooks');
18
18
  const PRETOOL_SAFETY_LEAVES = new Set([
19
19
  'pretooluse-editwrite', 'path-ownership-guard',
20
20
  'pretooluse-bash', 'git-workflow-guard',
21
- 'agent-model-guard',
22
21
  'workflow-route-guard',
23
22
  ]);
24
23
 
25
24
  export const HOOK_PROGRAMS = Object.freeze({
26
25
  'advisor-context': 'advisor-context.mjs',
27
26
  'agent-grounding': 'agent-grounding.mjs',
28
- 'agent-model-guard': 'agent-model-guard.mjs',
29
27
  'content-style-guard': 'content-style-guard.mjs',
30
28
  'completion-artifact': 'completion-artifact.mjs',
31
29
  'control-inbox': 'control-inbox.mjs',
@@ -40,11 +38,9 @@ export const HOOK_PROGRAMS = Object.freeze({
40
38
  'pretooluse-bash': 'pretooluse-bash.mjs',
41
39
  'pretooluse-editwrite': 'pretooluse-editwrite.mjs',
42
40
  'sessionend-recall': 'sessionend-recall.mjs',
43
- 'sessionstart-model-sync': 'sessionstart-model-sync.mjs',
44
41
  'sessionstart-prime': 'sessionstart-prime.mjs',
45
42
  'simplify-guard': 'simplify-guard.mjs',
46
43
  telemetry: 'telemetry.mjs',
47
- 'thinking-route': 'thinking-route.mjs',
48
44
  'team-lifecycle': 'team-lifecycle.mjs',
49
45
  'verify-deliverables': 'verify-deliverables.mjs',
50
46
  'worker-suggest': 'worker-suggest.mjs',
@@ -59,12 +55,10 @@ export const EVENT_CHAINS = Object.freeze({
59
55
  'keyword-router',
60
56
  'workflow-route-guard',
61
57
  'worker-suggest',
62
- 'thinking-route',
63
58
  'telemetry',
64
59
  ]),
65
60
  'session-start': Object.freeze([
66
61
  'control-inbox',
67
- 'sessionstart-model-sync',
68
62
  'sessionstart-prime',
69
63
  'persistent-mode',
70
64
  'telemetry',
@@ -238,7 +232,6 @@ export function selectEventChain(eventKey, input = '') {
238
232
  if (toolName === 'Bash') {
239
233
  return ['workflow-route-guard', 'pretooluse-bash', 'git-workflow-guard'];
240
234
  }
241
- if (toolName === 'Agent') return ['workflow-route-guard', 'agent-model-guard'];
242
235
  return [];
243
236
  }
244
237
 
@@ -19,6 +19,9 @@ Usage:
19
19
  ok prd <add|list|show|update> Manage PRDs, goals, and milestones
20
20
  ok doctor Validate the .ok/ workspace
21
21
  bizar openkan dashboard [args...] Forward to the OpenKan dashboard CLI
22
+ (legacy openkan.mjs on pre-v0.5.0
23
+ releases; ok serve on v0.5.0+ where
24
+ the legacy binary is retired)
22
25
 
23
26
  Canonical commands are \`ok task\`, \`ok plan\`, and \`ok prd\`; they use this
24
27
  same OpenKan workspace. The Bizar planning aliases remain compatibility-only.
@@ -29,11 +32,16 @@ feature/progress files for live planning.
29
32
 
30
33
  function runDashboard(args) {
31
34
  const launcher = resolveOpenKanDashboard();
35
+ // OpenKan v0.5.0 dropped the legacy `openkan` dashboard launcher. The
36
+ // dashboard now ships as `ok serve`; route to that subcommand when the
37
+ // resolved launcher is the `ok` binary instead of `openkan.mjs`.
38
+ const isOkLauncher = launcher.endsWith('ok.mjs') || launcher.endsWith('ok.ts');
39
+ const launcherArgs = isOkLauncher ? ['serve', ...args] : args;
32
40
  const command = launcher.endsWith('.ts')
33
- ? [process.execPath, '--experimental-strip-types', launcher, ...args]
41
+ ? [process.execPath, '--experimental-strip-types', launcher, ...launcherArgs]
34
42
  : launcher.endsWith('.mjs')
35
- ? [process.execPath, launcher, ...args]
36
- : [launcher, ...args];
43
+ ? [process.execPath, launcher, ...launcherArgs]
44
+ : [launcher, ...launcherArgs];
37
45
  const result = spawnSync(command[0], command.slice(1), { cwd: process.cwd(), encoding: 'utf8', shell: false });
38
46
  if (result.error) throw result.error;
39
47
  print({ ok: result.status === 0, status: result.status ?? 1, stdout: result.stdout || '', stderr: result.stderr || '' });
@@ -43,7 +43,9 @@ export function updateProviderSettings(current, options) {
43
43
  const next = { ...current, env: { ...(current.env || {}) } };
44
44
  if (options.gateway !== undefined) {
45
45
  next.env.ANTHROPIC_BASE_URL = options.gateway;
46
- next.env.BIZAR_MODEL_ROUTER_URL = options.gateway;
46
+ // Legacy compatibility: drop any pre-existing router-URL mirror so the
47
+ // install surface converges on a single provider URL.
48
+ delete next.env.BIZAR_MODEL_ROUTER_URL;
47
49
  }
48
50
  if (options.key !== undefined) next.env.ANTHROPIC_AUTH_TOKEN = options.key;
49
51
  if (options.model !== undefined) next.env.ANTHROPIC_MODEL = options.model;
@@ -87,7 +89,7 @@ export async function runSetupProvider(args = []) {
87
89
 
88
90
  if (options.list) {
89
91
  console.log(` Settings: ${path}`);
90
- console.log(` Gateway: ${current.env?.ANTHROPIC_BASE_URL || current.env?.BIZAR_MODEL_ROUTER_URL || '(Anthropic default)'}`);
92
+ console.log(` Gateway: ${current.env?.ANTHROPIC_BASE_URL || '(Anthropic default)'}`);
91
93
  console.log(` Model: ${current.env?.ANTHROPIC_MODEL || '(Claude Code default)'}`);
92
94
  console.log(` API key: ${redact(current.env?.ANTHROPIC_AUTH_TOKEN || current.env?.ANTHROPIC_API_KEY)}`);
93
95
  return { ok: true, path, settings: current };
@@ -15,7 +15,7 @@ import { existsSync, readdirSync, readFileSync, statSync } from 'node:fs';
15
15
  import { join, resolve } from 'node:path';
16
16
  import { fileURLToPath } from 'node:url';
17
17
 
18
- import { resolveClaudeConfigDir, resolveGlobalModelRouter } from '../config-paths.mjs';
18
+ import { resolveClaudeConfigDir } from '../config-paths.mjs';
19
19
  const __filename = fileURLToPath(import.meta.url);
20
20
  const __dirname = resolve(__filename, '..', '..');
21
21
  const CLAUDE_DIR = resolveClaudeConfigDir();
@@ -80,8 +80,6 @@ export async function runTools(cmdArgs) {
80
80
 
81
81
  const settingsPath = join(CLAUDE_DIR, 'settings.json');
82
82
  const hasSettings = existsSync(settingsPath);
83
- const modelRouterPath = resolveGlobalModelRouter();
84
- const hasModelRouter = existsSync(modelRouterPath);
85
83
 
86
84
  const summary = {
87
85
  userLevel: CLAUDE_DIR,
@@ -92,7 +90,6 @@ export async function runTools(cmdArgs) {
92
90
  wiredCommands,
93
91
  mcpTools,
94
92
  settings: { path: settingsPath, present: hasSettings },
95
- modelRouter: { path: modelRouterPath, present: hasModelRouter },
96
93
  };
97
94
 
98
95
  if (asJson) {
@@ -118,8 +115,24 @@ export async function runTools(cmdArgs) {
118
115
  section(`wired bizar commands (${wiredCommands.length})`, wiredCommands.map((c) => 'bizar ' + c));
119
116
  console.log(chalk.bold('\n settings'));
120
117
  console.log(` ${hasSettings ? '✓' : '✗'} ${settingsPath}`);
121
- console.log(chalk.bold(' model-router'));
122
- console.log(` ${hasModelRouter ? '✓' : '✗'} ${modelRouterPath}`);
118
+ if (hasSettings) {
119
+ try {
120
+ const parsed = JSON.parse(readFileSync(settingsPath, 'utf8'));
121
+ const env = (parsed && parsed.env) || {};
122
+ const aliases = {
123
+ sonnet: env.ANTHROPIC_DEFAULT_SONNET_MODEL,
124
+ haiku: env.ANTHROPIC_DEFAULT_HAIKU_MODEL,
125
+ opus: env.ANTHROPIC_DEFAULT_OPUS_MODEL,
126
+ fable: env.ANTHROPIC_DEFAULT_FABLE_MODEL,
127
+ };
128
+ console.log(chalk.bold(' alias map'));
129
+ for (const [key, value] of Object.entries(aliases)) {
130
+ console.log(` ${key.padEnd(8)} → ${value || '(unset)'}`);
131
+ }
132
+ const model = parsed?.model;
133
+ if (model) console.log(chalk.dim(` default model: ${model}`));
134
+ } catch { /* ignore malformed settings */ }
135
+ }
123
136
  }
124
137
 
125
138
  export async function run(name, args, isHelpRequest) {
@@ -35,42 +35,18 @@
35
35
  import chalk from 'chalk';
36
36
  import { existsSync, readFileSync, writeFileSync, copyFileSync } from 'node:fs';
37
37
  import { join } from 'node:path';
38
- import { resolveClaudeConfigDir, resolveGlobalModelRouter } from '../config-paths.mjs';
39
- import { configuredFallbackModels } from './models.mjs';
38
+ import { resolveClaudeConfigDir } from '../config-paths.mjs';
40
39
 
41
40
  const CLAUDE_DIR = resolveClaudeConfigDir();
42
41
  const SETTINGS_PATH = join(CLAUDE_DIR, 'settings.json');
43
- // 10.22.0 / Phase 4 spirit-of-constraint: the install model id comes
44
- // from the operator's `userSelected.models[0]`, not a hardcoded literal.
45
- // The Bizar global router is the sole model-policy source.
46
- const BIZAR_ROUTER_PATH = resolveGlobalModelRouter();
47
-
48
- function readConfiguredModels() {
49
- for (const path of [BIZAR_ROUTER_PATH]) {
50
- if (!existsSync(path)) continue;
51
- try {
52
- const parsed = JSON.parse(readFileSync(path, 'utf8'));
53
- const list = Array.isArray(parsed?.userSelected?.models)
54
- ? parsed.userSelected.models.filter((id) => typeof id === 'string' && id.trim())
55
- : [];
56
- if (list.length > 0) return list;
57
- const fallback = configuredFallbackModels(parsed);
58
- if (fallback.length > 0) return fallback;
59
- // An explicit empty selection is an intentional global policy.
60
- if (path === BIZAR_ROUTER_PATH && parsed && typeof parsed === 'object'
61
- && Array.isArray(parsed.userSelected?.models)) {
62
- return [];
63
- }
64
- } catch { /* keep falling through */ }
65
- }
66
- return [];
67
- }
68
42
 
69
43
  const STATIC_FAVORED = {
70
44
  permissions: { defaultMode: 'bypassPermissions' },
71
45
  worktree: { bgIsolation: 'worktree' },
72
- // `model` is intentionally absent — `buildFavored()` derives it from
73
- // userSelected.models[0] (or omits it when empty).
46
+ // `model` is intentionally absent — settings.json ships the alias
47
+ // binding (model + modelOverrides + the four ANTHROPIC_DEFAULT_*_MODEL
48
+ // env vars) as the canonical source. `upgrade-defaults` only re-applies
49
+ // the safe Bizar-owned UX defaults, not model policy.
74
50
  alwaysThinkingEnabled: true,
75
51
  effortLevel: 'high',
76
52
  skipDangerousModePermissionPrompt: true,
@@ -79,10 +55,7 @@ const STATIC_FAVORED = {
79
55
  };
80
56
 
81
57
  function buildFavored() {
82
- const out = { ...STATIC_FAVORED };
83
- const picks = readConfiguredModels();
84
- if (picks[0]) out.model = picks[0];
85
- return out;
58
+ return { ...STATIC_FAVORED };
86
59
  }
87
60
 
88
61
  export async function run(name, args, isHelpRequest) {
@@ -82,7 +82,7 @@ export function showDoctorHelp() {
82
82
  • hook wiring
83
83
  • installed agents and skills
84
84
  • required local tools
85
- model-router reachability
85
+ alias map (ANTHROPIC_DEFAULT_*_MODEL)
86
86
 
87
87
  Prints ✓/✗ for each check and a final summary. Exits non-zero
88
88
  if any check fails. Use \`bizar doctor\` after installation or