@polderlabs/bizar 10.26.0 → 10.28.0-beta.2

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 (121) hide show
  1. package/README.md +107 -58
  2. package/cli/bin.mjs +0 -17
  3. package/cli/commands/openkan.mjs +11 -3
  4. package/cli/commands/validate.mjs +6 -6
  5. package/cli/openkan.mjs +57 -8
  6. package/cli/provision.mjs +4 -1
  7. package/config/claude/CLAUDE.md +4 -4
  8. package/config/claude/agents/bizar-accessibility-architect.md +1 -0
  9. package/config/claude/agents/bizar-agent-evaluator.md +1 -0
  10. package/config/claude/agents/bizar-architect.md +1 -0
  11. package/config/claude/agents/bizar-build-error-resolver.md +1 -0
  12. package/config/claude/agents/bizar-chief-of-staff.md +1 -0
  13. package/config/claude/agents/bizar-code-architect.md +1 -0
  14. package/config/claude/agents/bizar-code-explorer.md +1 -0
  15. package/config/claude/agents/bizar-code-reviewer.md +1 -0
  16. package/config/claude/agents/bizar-code-simplifier.md +1 -0
  17. package/config/claude/agents/bizar-comment-analyzer.md +1 -0
  18. package/config/claude/agents/bizar-conversation-analyzer.md +1 -0
  19. package/config/claude/agents/bizar-cpp-build-resolver.md +1 -0
  20. package/config/claude/agents/bizar-cpp-reviewer.md +1 -0
  21. package/config/claude/agents/bizar-csharp-reviewer.md +1 -0
  22. package/config/claude/agents/bizar-dart-build-resolver.md +1 -0
  23. package/config/claude/agents/bizar-database-reviewer.md +1 -0
  24. package/config/claude/agents/bizar-django-build-resolver.md +1 -0
  25. package/config/claude/agents/bizar-django-reviewer.md +1 -0
  26. package/config/claude/agents/bizar-doc-updater.md +1 -0
  27. package/config/claude/agents/bizar-docs-lookup.md +1 -0
  28. package/config/claude/agents/bizar-end-to-end-runner.md +1 -0
  29. package/config/claude/agents/bizar-fastapi-reviewer.md +1 -0
  30. package/config/claude/agents/bizar-flutter-reviewer.md +1 -0
  31. package/config/claude/agents/bizar-fsharp-reviewer.md +1 -0
  32. package/config/claude/agents/bizar-gan-evaluator.md +1 -0
  33. package/config/claude/agents/bizar-gan-generator.md +1 -0
  34. package/config/claude/agents/bizar-gan-planner.md +1 -0
  35. package/config/claude/agents/bizar-go-build-resolver.md +1 -0
  36. package/config/claude/agents/bizar-go-reviewer.md +1 -0
  37. package/config/claude/agents/bizar-harmonyos-app-resolver.md +1 -0
  38. package/config/claude/agents/bizar-harness-optimizer.md +1 -0
  39. package/config/claude/agents/bizar-healthcare-reviewer.md +1 -0
  40. package/config/claude/agents/bizar-homelab-architect.md +1 -0
  41. package/config/claude/agents/bizar-java-build-resolver.md +1 -0
  42. package/config/claude/agents/bizar-java-reviewer.md +1 -0
  43. package/config/claude/agents/bizar-kotlin-build-resolver.md +1 -0
  44. package/config/claude/agents/bizar-kotlin-reviewer.md +1 -0
  45. package/config/claude/agents/bizar-loop-operator.md +1 -0
  46. package/config/claude/agents/bizar-marketing-agent.md +1 -0
  47. package/config/claude/agents/bizar-mle-reviewer.md +1 -0
  48. package/config/claude/agents/bizar-network-architect.md +1 -0
  49. package/config/claude/agents/bizar-network-config-reviewer.md +1 -0
  50. package/config/claude/agents/bizar-network-troubleshooter.md +1 -0
  51. package/config/claude/agents/bizar-opensource-forker.md +1 -0
  52. package/config/claude/agents/bizar-opensource-packager.md +1 -0
  53. package/config/claude/agents/bizar-opensource-sanitizer.md +1 -0
  54. package/config/claude/agents/bizar-performance-optimizer.md +1 -0
  55. package/config/claude/agents/bizar-php-reviewer.md +1 -0
  56. package/config/claude/agents/bizar-planner.md +1 -0
  57. package/config/claude/agents/bizar-pr-test-analyzer.md +1 -0
  58. package/config/claude/agents/bizar-python-reviewer.md +1 -0
  59. package/config/claude/agents/bizar-pytorch-build-resolver.md +1 -0
  60. package/config/claude/agents/bizar-rag-pipeline-reviewer.md +1 -0
  61. package/config/claude/agents/bizar-react-build-resolver.md +1 -0
  62. package/config/claude/agents/bizar-react-reviewer.md +1 -0
  63. package/config/claude/agents/bizar-refactor-cleaner.md +1 -0
  64. package/config/claude/agents/bizar-rust-build-resolver.md +1 -0
  65. package/config/claude/agents/bizar-rust-reviewer.md +1 -0
  66. package/config/claude/agents/bizar-security-reviewer.md +1 -0
  67. package/config/claude/agents/bizar-seo-specialist.md +1 -0
  68. package/config/claude/agents/bizar-silent-failure-hunter.md +1 -0
  69. package/config/claude/agents/bizar-spec-miner.md +1 -0
  70. package/config/claude/agents/bizar-swift-build-resolver.md +1 -0
  71. package/config/claude/agents/bizar-swift-reviewer.md +1 -0
  72. package/config/claude/agents/bizar-tdd-guide.md +1 -0
  73. package/config/claude/agents/bizar-type-design-analyzer.md +1 -0
  74. package/config/claude/agents/bizar-typescript-reviewer.md +1 -0
  75. package/config/claude/agents/bizar-vue-reviewer.md +1 -0
  76. package/config/claude/agents/office-greeter.md +1 -1
  77. package/config/claude/agents/office-manager.md +38 -5
  78. package/config/claude/agents/plan-architect.md +12 -12
  79. package/config/claude/agents/qa-reviewer.md +14 -14
  80. package/config/claude/commands/bizplan-heavy.md +8 -0
  81. package/config/claude/commands/bizplan-light.md +8 -0
  82. package/config/claude/commands/bizplan.md +8 -0
  83. package/config/claude/hooks/keyword-router.mjs +5 -3
  84. package/config/claude/hooks/persistent-mode.mjs +82 -32
  85. package/config/claude/hooks/worker-suggest.mjs +4 -4
  86. package/config/skills/autopilot/SKILL.md +33 -19
  87. package/config/skills/bizplan/SKILL.md +334 -0
  88. package/config/skills/{ralplan → bizplan}/references/pre-mortem.md +10 -6
  89. package/config/skills/cancel/SKILL.md +12 -10
  90. package/config/skills/deep-interview/SKILL.md +8 -9
  91. package/config/skills/ralph/SKILL.md +19 -8
  92. package/config/skills/ultragoal/SKILL.md +101 -79
  93. package/config/skills/ultraqa/SKILL.md +17 -8
  94. package/config/skills/ultrawork/SKILL.md +17 -8
  95. package/config/skills/verify/SKILL.md +15 -7
  96. package/config/workflows/bizar-debug.js +4 -5
  97. package/config/workflows/bizar-implement.js +5 -6
  98. package/config/workflows/bizar-research.js +4 -5
  99. package/config/workflows/ultracode-research.js +4 -5
  100. package/config/workflows/ultracode-review.js +3 -4
  101. package/config/workflows/ultracode.js +4 -5
  102. package/package.json +6 -7
  103. package/packages/sdk/dist/handoff/bizplan.d.ts +191 -0
  104. package/packages/sdk/dist/handoff/bizplan.js +256 -0
  105. package/packages/sdk/dist/index.d.ts +2 -1
  106. package/packages/sdk/dist/index.js +6 -3
  107. package/packages/sdk/dist/mcp/bizplan.d.ts +36 -0
  108. package/packages/sdk/dist/mcp/bizplan.js +43 -0
  109. package/packages/sdk/dist/mcp/server.js +32 -6
  110. package/packages/sdk/dist/version.d.ts +1 -1
  111. package/packages/sdk/dist/version.js +1 -1
  112. package/packages/sdk/package.json +6 -1
  113. package/cli/commands/workflow-gc.mjs +0 -221
  114. package/cli/commands/workflow.mjs +0 -261
  115. package/cli/core/ultragoal-state.mjs +0 -535
  116. package/cli/core/workflow-state.mjs +0 -627
  117. package/config/claude/commands/plan.md +0 -21
  118. package/config/claude/commands/ralplan.md +0 -8
  119. package/config/skills/ralplan/SKILL.md +0 -126
  120. package/packages/sdk/dist/handoff/ralplan.d.ts +0 -86
  121. package/packages/sdk/dist/handoff/ralplan.js +0 -94
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
 
@@ -41,24 +41,51 @@ the project you happen to be working on.
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
76
  Install Bizar globally and its Claude Code integration. Bizar dispatches
47
- through four static native aliases `haiku`, `sonnet`, `opus`, `fable`
48
- and OmniRoute handles ordered failover between configured full IDs for the
49
- chosen alias, so there is no model picker step.
77
+ through four static aliases: `haiku`, `sonnet`, `opus`, and `fable`. OmniRoute
78
+ maps each alias to configured full model IDs and applies ordered failover.
50
79
 
51
80
  ```sh
52
81
  npm install -g @polderlabs/bizar
53
82
  bizar install
54
83
  ```
55
84
 
56
- Restart Claude Code after installation. The installer adds Bizar's agents, skills, commands, hooks, settings, and the
57
- default OpenKan planning runtime to your user-level Claude configuration.
58
- Claude Code itself is installed with Anthropic's native installer; npm is used
59
- for Bizar and OpenKan, not for the Claude Code CLI.
60
- It preserves your configured gateway endpoint and credential values during a
61
- 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.
62
89
 
63
90
  On a new interactive install, Bizar also asks whether Claude Code agent teams
64
91
  should be enabled, the OpenKan install directory, and whether the current
@@ -75,7 +102,7 @@ bizar install --force
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,9 +132,9 @@ 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 dispatches through four static native aliases `haiku`, `sonnet`,
137
+ Bizar dispatches through four static native aliases: `haiku`, `sonnet`,
111
138
  `opus`, `fable`. Claude Code's native per-call `model` field accepts one of
112
139
  these aliases. OmniRoute handles ordered failover between the configured full
113
140
  gateway IDs for the chosen alias, so the operator never picks a picker-style
@@ -116,10 +143,12 @@ gateway ID per agent at this layer. There is no `bizar models` picker, no
116
143
 
117
144
  The four aliases are the entire dispatch surface:
118
145
 
119
- - `haiku` trivial / cheap micro-edits
120
- - `sonnet` ordinary implementation, research, planning lanes
121
- - `opus` hard / architectural / adversarial / debug / high-risk review lanes
122
- - `fable` explicit Anthropic OpenAI-compat surfaces
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 |
123
152
 
124
153
  Workflow scripts (`config/workflows/*.js`) inline a tiny `dispatchAgent`
125
154
  wrapper that picks the alias from a static policy; agent definitions stay
@@ -140,25 +169,50 @@ Useful inspection commands:
140
169
  bizar doctor
141
170
  ```
142
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
+
143
203
  ## A specialist bench, not a generic swarm
144
204
 
145
- Bizar ships its core coordination roles alongside 68 focused specialists for
146
- architecture, accessibility, security, testing, documentation, performance,
147
- language and framework review, build repair, operations, and evaluation. It
148
- also ships 80 skills for planning, debugging, verification, review,
149
- 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.
150
209
 
151
210
  The coordinator selects specialists when their expertise reduces a concrete
152
211
  risk. It does not create parallel workers merely to look busy.
153
212
 
154
- ```text
155
- Core coordination Specialist coverage
156
- ───────────────── ──────────────────────────────────
157
- Mike · research · plan Architecture · accessibility · security
158
- Implementation · review Build repair · tests · documentation
159
- Verification · integration Frameworks · performance · operations
160
- Evaluation · product and domain analysis
161
- ```
213
+ | Coordination | Specialist coverage |
214
+ | --- | --- |
215
+ | Research, planning, implementation, review, verification | Architecture, accessibility, security, tests, documentation, performance, build repair, operations, and domain analysis |
162
216
 
163
217
  ## Guardrails that stay out of the way
164
218
 
@@ -180,25 +234,10 @@ point where an external or difficult-to-reverse decision belongs to you.
180
234
 
181
235
  ## What gets installed
182
236
 
183
- ```text
184
- ~/.claude/
185
- ├── agents/ 84 Bizar roles and specialist definitions
186
- ├── skills/ 80 skill packs
187
- ├── commands/ 39 slash-command surfaces
188
- ├── hooks/ routing, lifecycle, safety, evidence, and quality hooks
189
- ├── rules/ focused guidance for common development work
190
- ├── workflows/ native workflow definitions
191
- ├── settings.json Bizar-managed Claude Code integration
192
- └── agents/ Bizar agent definitions (alias-agnostic)
193
-
194
- ~/.config/bizar/
195
- ├── installed.json install record
196
- ├── openkan/ managed @polderlabs/openkan npm runtime
197
- ├── openkan-install.json selected OpenKan home/package settings
198
- ├── evidence/ local dispatch and verification evidence
199
- ├── telemetry/ local routing and rejected-action feedback
200
- └── worktree-queue.json completed worktree integration queue
201
- ```
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 |
202
241
 
203
242
  `bizar control` is a machine-readable command boundary for optional external
204
243
  interfaces. Bizar deliberately does not include an embedded browser control
@@ -248,6 +287,10 @@ make check
248
287
 
249
288
  - [Documentation index](docs/INDEX.md)
250
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
251
294
  - [Model routing decisions](docs/decisions/)
252
295
  - [Durable project progress, plans, and goals](.ok/)
253
296
  - [MIT license](LICENSE)
@@ -255,3 +298,9 @@ make check
255
298
  ## License
256
299
 
257
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
@@ -131,7 +131,6 @@ function showHelp() {
131
131
  goals <subcommand> OpenKan PRDs, goals, and milestones
132
132
  claim <subcommand> OpenKan task lease shortcut
133
133
  control <subcommand> Machine-readable agents/tasks/plans/goals/sessions/messages API
134
- workflow <subcommand> Session-bound autopilot workflow state
135
134
  hook <name> Run a portable Claude Code hook
136
135
  worktree-merge <branch> Merge a feature branch with archive tag (no work lost)
137
136
  worker <subcommand> Run an exact-model Claude process worker in a worktree
@@ -595,22 +594,6 @@ async function main() {
595
594
  break;
596
595
  }
597
596
 
598
- case 'workflow': {
599
- const mod = await importCommand('workflow');
600
- if (!mod) {
601
- console.error(chalk.red(` ✗ Could not load workflow command module`));
602
- process.exit(EXIT_ERROR);
603
- return;
604
- }
605
- dbg('loaded command module:', 'workflow');
606
- const found = await mod.run(cmd, cmdArgs, isHelpRequest);
607
- if (found === false) {
608
- console.error(chalk.red(` ✗ Usage: bizar workflow <subcommand> — run 'bizar workflow --help'`));
609
- process.exit(EXIT_USAGE);
610
- }
611
- break;
612
- }
613
-
614
597
  case 'hook': {
615
598
  const mod = await importCommand('hook');
616
599
  if (!mod) {
@@ -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 || '' });
@@ -44,12 +44,12 @@ export const REQUIRED_AGENTS = [
44
44
 
45
45
  export const REQUIRED_COMMANDS = [
46
46
  'artifact.md', 'audit.md', 'autopilot.md', 'backup.md', 'bizar.md',
47
- 'browser.md', 'cancel.md', 'cron.md', 'deep-interview.md', 'doctor.md',
48
- 'explain.md', 'init.md', 'learn.md', 'plan.md', 'plow-through.md',
49
- 'pr-review.md', 'quick.md', 'ralph.md', 'ralplan.md', 'rca.md',
50
- 'repair.md', 'restore.md', 'setup-provider.md', 'spec.md', 'sprint.md',
51
- 'team.md', 'test.md', 'tools.md', 'ultracode.md', 'ultraqa.md',
52
- 'ultrawork.md', 'update.md', 'validate.md', 'verify.md',
47
+ 'bizplan.md', 'bizplan-heavy.md', 'bizplan-light.md', 'browser.md',
48
+ 'cancel.md', 'cron.md', 'deep-interview.md', 'doctor.md', 'explain.md',
49
+ 'init.md', 'learn.md', 'plow-through.md', 'pr-review.md', 'quick.md',
50
+ 'ralph.md', 'rca.md', 'repair.md', 'restore.md', 'setup-provider.md',
51
+ 'spec.md', 'sprint.md', 'team.md', 'test.md', 'tools.md', 'ultracode.md',
52
+ 'ultraqa.md', 'ultrawork.md', 'update.md', 'validate.md', 'verify.md',
53
53
  ];
54
54
 
55
55
  // v6.3.0 — Claude Code hook adapter scripts (executable, .mjs extension).
package/cli/openkan.mjs CHANGED
@@ -46,6 +46,32 @@ function nodeMajorVersion() {
46
46
  return match ? Number(match[1]) : 0;
47
47
  }
48
48
 
49
+ /**
50
+ * Parse a semver-like string into [major, minor, patch] numeric parts.
51
+ * Pre-release / build metadata is stripped. Returns null when the input
52
+ * does not look like a version the caller can compare.
53
+ */
54
+ function parseOpenKanVersion(version) {
55
+ if (typeof version !== 'string') return null;
56
+ const match = version.trim().match(/^v?(\d+)\.(\d+)(?:\.(\d+))?/);
57
+ if (!match) return null;
58
+ return [Number(match[1]), Number(match[2]), Number(match[3] || 0)];
59
+ }
60
+
61
+ /**
62
+ * True when the installed OpenKan version ships the legacy `openkan` binary.
63
+ * v0.5.0 dropped the `openkan <cmd>` entry point; the `ok` CLI is the only
64
+ * supported surface from that release forward. Callers use this to decide
65
+ * whether to install the legacy `~/.local/bin/openkan` shim, clean up a
66
+ * stale one, or route dashboard launches through `ok serve`.
67
+ */
68
+ export function installedOpenKanSupportsLegacyBin(home) {
69
+ const version = readInstalledOpenKanVersion(home);
70
+ const parsed = parseOpenKanVersion(version);
71
+ if (!parsed) return true; // unknown version: be conservative and keep legacy behaviour
72
+ return parsed[0] < 0 || (parsed[0] === 0 && parsed[1] < 5);
73
+ }
74
+
49
75
  export class OpenKanError extends Error {
50
76
  constructor(code, message, details = {}) {
51
77
  super(message);
@@ -163,13 +189,19 @@ export function resolveOpenKanDashboard(options = {}) {
163
189
  const cwd = resolve(options.cwd || process.cwd());
164
190
  const explicitHome = options.home || process.env.BIZAR_OPENKAN_HOME;
165
191
  const home = explicitHome ? resolve(explicitHome) : resolveOpenKanHome({ cwd });
166
- const managed = join(openKanPackageRoot(home), 'bin', 'openkan.mjs');
167
- if (existsSync(managed)) return managed;
168
- const legacy = join(home, 'bin', 'openkan.mjs');
169
- if (existsSync(legacy)) return legacy;
170
- const configuredBin = options.openkanBin || process.env.BIZAR_OPENKAN_BIN || executableOnPath('openkan');
171
- if (configuredBin && existsSync(configuredBin)) return configuredBin;
172
- throw new OpenKanError('OPENKAN_NOT_FOUND', 'OpenKan is required. Run `bizar openkan install`.');
192
+ const legacySupported = installedOpenKanSupportsLegacyBin(home);
193
+ if (legacySupported) {
194
+ const managed = join(openKanPackageRoot(home), 'bin', 'openkan.mjs');
195
+ if (existsSync(managed)) return managed;
196
+ const legacy = join(home, 'bin', 'openkan.mjs');
197
+ if (existsSync(legacy)) return legacy;
198
+ const configuredBin = options.openkanBin || process.env.BIZAR_OPENKAN_BIN || executableOnPath('openkan');
199
+ if (configuredBin && existsSync(configuredBin)) return configuredBin;
200
+ throw new OpenKanError('OPENKAN_NOT_FOUND', 'OpenKan is required. Run `bizar openkan install`.');
201
+ }
202
+ // OpenKan v0.5.0+ drops the legacy `openkan` binary; the dashboard is
203
+ // served via `ok serve`. Always route to the `ok` launcher.
204
+ return resolveOpenKanOk({ cwd, home });
173
205
  }
174
206
 
175
207
  function nodeArgs(launcher, args) {
@@ -327,7 +359,23 @@ export function installOpenKanCommandShims({ home, env = process.env } = {}) {
327
359
  try { mkdirSync(binDir, { recursive: true, mode: 0o755 }); } catch (error) {
328
360
  return { ok: false, installed: [], preserved: [], message: `OpenKan command directory unavailable: ${error.message}` };
329
361
  }
330
- for (const name of ['ok', 'openkan']) {
362
+ const legacyBinSupported = installedOpenKanSupportsLegacyBin(home);
363
+ // OpenKan v0.5.0 dropped the legacy `openkan` binary. If the user
364
+ // upgraded from an earlier release, retire any existing shim so agent
365
+ // shells stop hitting a dangling or legacy symlink.
366
+ if (!legacyBinSupported) {
367
+ const staleShim = join(binDir, process.platform === 'win32' ? 'openkan.cmd' : 'openkan');
368
+ if (existsSync(staleShim)) {
369
+ try {
370
+ unlinkSync(staleShim);
371
+ commands.push({ name: 'openkan', path: staleShim, status: 'retired' });
372
+ } catch (error) {
373
+ commands.push({ name: 'openkan', path: staleShim, status: 'failed', error: error.message });
374
+ }
375
+ }
376
+ }
377
+ const shimNames = legacyBinSupported ? ['ok', 'openkan'] : ['ok'];
378
+ for (const name of shimNames) {
331
379
  const target = join(packageBin, `${name}.mjs`);
332
380
  const shim = join(binDir, process.platform === 'win32' ? `${name}.cmd` : name);
333
381
  if (!existsSync(target)) continue;
@@ -365,6 +413,7 @@ export function installOpenKanCommandShims({ home, env = process.env } = {}) {
365
413
  ok: failed.length === 0,
366
414
  installed: commands.filter((entry) => entry.status === 'installed'),
367
415
  preserved: commands.filter((entry) => entry.status === 'preserved'),
416
+ retired: commands.filter((entry) => entry.status === 'retired'),
368
417
  message: failed.length === 0
369
418
  ? `OpenKan native commands ready in ${binDir}`
370
419
  : `OpenKan command shims failed: ${failed.map((entry) => `${entry.name}: ${entry.error}`).join('; ')}`,
package/cli/provision.mjs CHANGED
@@ -1044,8 +1044,11 @@ export function setupMcpServer({ dryRun = false } = {}) {
1044
1044
  if (existing && existing.mcpServers && existing.mcpServers.bizar) {
1045
1045
  return { ok: true, message: `bizar MCP server already registered in ${settingsPath}` };
1046
1046
  }
1047
- if (!haveCmd('claude')) return { ok: false, message: 'claude CLI not on PATH' };
1047
+ // Honour `dryRun` BEFORE checking for the `claude` CLI: a dry-run
1048
+ // should never fail just because the host does not have Claude Code
1049
+ // installed (CI runners, fresh dev containers, agent sandboxes).
1048
1050
  if (dryRun) return { ok: true, message: '[dry-run] would run: claude mcp add bizar -- npx -y @polderlabs/bizar-sdk mcp' };
1051
+ if (!haveCmd('claude')) return { ok: false, message: 'claude CLI not on PATH' };
1049
1052
  const r = spawnSync('claude', ['mcp', 'add', '-f', '-s', 'user', 'bizar', '--', 'npx', '-y', '@polderlabs/bizar-sdk', 'mcp'], { stdio: 'inherit', timeout: 60_000 });
1050
1053
  if (r.status !== 0) return { ok: false, message: `claude mcp add exited with code ${r.status}` };
1051
1054
  return { ok: true, message: 'bizar MCP server registered' };
@@ -13,7 +13,7 @@
13
13
 
14
14
  Bizar Harness is a Claude Code-native, guarded-autonomy harness. It ships project and user-level agents, skills, slash commands, hooks, an MCP server, CLI utilities, and verification scripts. OpenKan is bundled as Bizar’s default durable planning, progression, task, and PRD-goal system; Bizar integrates with it only through the `.ok/` workspace and its supported CLI boundary.
15
15
 
16
- If you are an agent: read this file, inspect `.ok/` with `bizar task list` and `bizar goals list`, then run `make check` before changing code.
16
+ If you are an agent: read this file, inspect `.ok/` with `ok task list` and `ok prd list`, then run `make check` before changing code.
17
17
 
18
18
  ## Commands
19
19
 
@@ -26,9 +26,9 @@ make check-arch # architectural and removed-surface checks
26
26
  make verify-removed-surfaces # prove deleted subsystems are absent
27
27
  make verify-repo-structure # prove tracked/package paths are clean
28
28
  make clean-check # debug-artifact/static hygiene gate
29
- bizar task list # OpenKan task progression
30
- bizar plan list # OpenKan plans
31
- bizar goals list # OpenKan PRD goals
29
+ ok task list # OpenKan task progression
30
+ ok plan list # OpenKan plans
31
+ ok prd list # OpenKan PRD goals
32
32
  make session-start # lifecycle compatibility target
33
33
  make session-end # lifecycle compatibility target
34
34
  ```
@@ -1,6 +1,7 @@
1
1
  ---
2
2
  name: bizar-accessibility-architect
3
3
  description: Bizar-accessibility-architect — Bizar specialist.
4
+ isolation: worktree
4
5
  tools: Read, Write, Edit, Bash, Grep, Glob, WebSearch, WebFetch
5
6
  ---
6
7
 
@@ -1,6 +1,7 @@
1
1
  ---
2
2
  name: bizar-agent-evaluator
3
3
  description: Bizar-agent-evaluator — Bizar specialist.
4
+ isolation: worktree
4
5
  tools: Read, Write, Edit, Bash, Grep, Glob, WebSearch, WebFetch
5
6
  ---
6
7
 
@@ -1,6 +1,7 @@
1
1
  ---
2
2
  name: bizar-architect
3
3
  description: Bizar-architect — Bizar specialist.
4
+ isolation: worktree
4
5
  tools: Read, Write, Edit, Bash, Grep, Glob, WebSearch, WebFetch
5
6
  ---
6
7
 
@@ -1,6 +1,7 @@
1
1
  ---
2
2
  name: bizar-build-error-resolver
3
3
  description: Bizar-build-error-resolver — Bizar specialist.
4
+ isolation: worktree
4
5
  tools: Read, Write, Edit, Bash, Grep, Glob, WebSearch, WebFetch
5
6
  ---
6
7
 
@@ -1,6 +1,7 @@
1
1
  ---
2
2
  name: bizar-chief-of-staff
3
3
  description: Bizar-chief-of-staff — Bizar specialist.
4
+ isolation: worktree
4
5
  tools: Read, Write, Edit, Bash, Grep, Glob, WebSearch, WebFetch
5
6
  ---
6
7
 
@@ -1,6 +1,7 @@
1
1
  ---
2
2
  name: bizar-code-architect
3
3
  description: Bizar-code-architect — Bizar specialist.
4
+ isolation: worktree
4
5
  tools: Read, Write, Edit, Bash, Grep, Glob, WebSearch, WebFetch
5
6
  ---
6
7
 
@@ -1,6 +1,7 @@
1
1
  ---
2
2
  name: bizar-code-explorer
3
3
  description: Bizar-code-explorer — Bizar specialist.
4
+ isolation: worktree
4
5
  tools: Read, Write, Edit, Bash, Grep, Glob, WebSearch, WebFetch
5
6
  ---
6
7
 
@@ -1,6 +1,7 @@
1
1
  ---
2
2
  name: bizar-code-reviewer
3
3
  description: Bizar-code-reviewer — Bizar specialist.
4
+ isolation: worktree
4
5
  tools: Read, Write, Edit, Bash, Grep, Glob, WebSearch, WebFetch
5
6
  ---
6
7
 
@@ -1,6 +1,7 @@
1
1
  ---
2
2
  name: bizar-code-simplifier
3
3
  description: Bizar-code-simplifier — Bizar specialist.
4
+ isolation: worktree
4
5
  tools: Read, Write, Edit, Bash, Grep, Glob, WebSearch, WebFetch
5
6
  ---
6
7
 
@@ -1,6 +1,7 @@
1
1
  ---
2
2
  name: bizar-comment-analyzer
3
3
  description: Bizar-comment-analyzer — Bizar specialist.
4
+ isolation: worktree
4
5
  tools: Read, Write, Edit, Bash, Grep, Glob, WebSearch, WebFetch
5
6
  ---
6
7
 
@@ -1,6 +1,7 @@
1
1
  ---
2
2
  name: bizar-conversation-analyzer
3
3
  description: Bizar-conversation-analyzer — Bizar specialist.
4
+ isolation: worktree
4
5
  tools: Read, Write, Edit, Bash, Grep, Glob, WebSearch, WebFetch
5
6
  ---
6
7
 
@@ -1,6 +1,7 @@
1
1
  ---
2
2
  name: bizar-cpp-build-resolver
3
3
  description: Bizar-cpp-build-resolver — Bizar specialist.
4
+ isolation: worktree
4
5
  tools: Read, Write, Edit, Bash, Grep, Glob, WebSearch, WebFetch
5
6
  ---
6
7
 
@@ -1,6 +1,7 @@
1
1
  ---
2
2
  name: bizar-cpp-reviewer
3
3
  description: Bizar-cpp-reviewer — Bizar specialist.
4
+ isolation: worktree
4
5
  tools: Read, Write, Edit, Bash, Grep, Glob, WebSearch, WebFetch
5
6
  ---
6
7
 
@@ -1,6 +1,7 @@
1
1
  ---
2
2
  name: bizar-csharp-reviewer
3
3
  description: Bizar-csharp-reviewer — Bizar specialist.
4
+ isolation: worktree
4
5
  tools: Read, Write, Edit, Bash, Grep, Glob, WebSearch, WebFetch
5
6
  ---
6
7
 
@@ -1,6 +1,7 @@
1
1
  ---
2
2
  name: bizar-dart-build-resolver
3
3
  description: Bizar-dart-build-resolver — Bizar specialist.
4
+ isolation: worktree
4
5
  tools: Read, Write, Edit, Bash, Grep, Glob, WebSearch, WebFetch
5
6
  ---
6
7
 
@@ -1,6 +1,7 @@
1
1
  ---
2
2
  name: bizar-database-reviewer
3
3
  description: Bizar-database-reviewer — Bizar specialist.
4
+ isolation: worktree
4
5
  tools: Read, Write, Edit, Bash, Grep, Glob, WebSearch, WebFetch
5
6
  ---
6
7
 
@@ -1,6 +1,7 @@
1
1
  ---
2
2
  name: bizar-django-build-resolver
3
3
  description: Bizar-django-build-resolver — Bizar specialist.
4
+ isolation: worktree
4
5
  tools: Read, Write, Edit, Bash, Grep, Glob, WebSearch, WebFetch
5
6
  ---
6
7
 
@@ -1,6 +1,7 @@
1
1
  ---
2
2
  name: bizar-django-reviewer
3
3
  description: Bizar-django-reviewer — Bizar specialist.
4
+ isolation: worktree
4
5
  tools: Read, Write, Edit, Bash, Grep, Glob, WebSearch, WebFetch
5
6
  ---
6
7
 
@@ -1,6 +1,7 @@
1
1
  ---
2
2
  name: bizar-doc-updater
3
3
  description: Bizar-doc-updater — Bizar specialist.
4
+ isolation: worktree
4
5
  tools: Read, Write, Edit, Bash, Grep, Glob, WebSearch, WebFetch
5
6
  ---
6
7
 
@@ -1,6 +1,7 @@
1
1
  ---
2
2
  name: bizar-docs-lookup
3
3
  description: Bizar-docs-lookup — Bizar specialist.
4
+ isolation: worktree
4
5
  tools: Read, Write, Edit, Bash, Grep, Glob, WebSearch, WebFetch
5
6
  ---
6
7
 
@@ -1,6 +1,7 @@
1
1
  ---
2
2
  name: bizar-end-to-end-runner
3
3
  description: Bizar-end-to-end-runner — Bizar specialist.
4
+ isolation: worktree
4
5
  tools: Read, Write, Edit, Bash, Grep, Glob, WebSearch, WebFetch
5
6
  ---
6
7