@polderlabs/bizar 3.12.0 → 3.12.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.
- package/README.md +1 -1
- package/cli/audit.mjs +2 -2
- package/cli/bin.mjs +101 -0
- package/cli/dev-link.mjs +175 -0
- package/cli/dev-link.test.mjs +297 -0
- package/cli/doctor.mjs +275 -0
- package/cli/doctor.test.mjs +312 -0
- package/cli/install.mjs +46 -4
- package/cli/update.mjs +123 -33
- package/config/AGENTS.md +10 -5
- package/config/agents/baldr.md +1 -1
- package/config/agents/forseti.md +1 -1
- package/config/agents/hermod.md +1 -1
- package/config/agents/odin.md +2 -2
- package/config/agents/quick.md +1 -1
- package/config/agents/thor.md +1 -1
- package/config/agents/tyr.md +1 -1
- package/config/opencode.json.template +29 -30
- package/config/rules/general.md +2 -1
- package/config/skills/bizar/SKILL.md +2 -2
- package/package.json +1 -1
package/cli/update.mjs
CHANGED
|
@@ -233,9 +233,18 @@ function latestVersion(pkg) {
|
|
|
233
233
|
/**
|
|
234
234
|
* Update opencode. Tries `opencode upgrade` first (the upstream installer's
|
|
235
235
|
* own command); falls back to `npm install -g opencode-ai@latest`.
|
|
236
|
+
* Pass `{ dryRun: true }` to print what would run without executing.
|
|
236
237
|
* Returns `{ ok: boolean, message: string }`.
|
|
237
238
|
*/
|
|
238
|
-
function updateOpencode() {
|
|
239
|
+
function updateOpencode({ dryRun = false } = {}) {
|
|
240
|
+
if (dryRun) {
|
|
241
|
+
console.log(
|
|
242
|
+
chalk.dim(
|
|
243
|
+
' [dry-run] would run: opencode upgrade (fallback: npm install -g opencode-ai@latest)',
|
|
244
|
+
),
|
|
245
|
+
);
|
|
246
|
+
return { ok: true, message: '[dry-run] opencode' };
|
|
247
|
+
}
|
|
239
248
|
const r1 = spawnSync('opencode', ['upgrade'], { stdio: 'inherit' });
|
|
240
249
|
if (r1.status === 0) {
|
|
241
250
|
return { ok: true, message: 'opencode updated via `opencode upgrade`' };
|
|
@@ -248,7 +257,13 @@ function updateOpencode() {
|
|
|
248
257
|
return { ok: false, message: 'opencode update failed — try `opencode upgrade` manually' };
|
|
249
258
|
}
|
|
250
259
|
|
|
251
|
-
function updatePackage(pkg) {
|
|
260
|
+
function updatePackage(pkg, { dryRun = false } = {}) {
|
|
261
|
+
if (dryRun) {
|
|
262
|
+
console.log(
|
|
263
|
+
chalk.dim(` [dry-run] would run: npm install -g ${pkg}@latest`),
|
|
264
|
+
);
|
|
265
|
+
return { ok: true, message: `[dry-run] ${pkg}` };
|
|
266
|
+
}
|
|
252
267
|
const r = spawnSync('npm', ['install', '-g', `${pkg}@latest`], { stdio: 'inherit' });
|
|
253
268
|
if (r.status !== 0) {
|
|
254
269
|
return { ok: false, message: `${pkg} update failed` };
|
|
@@ -467,27 +482,43 @@ export async function runUpdate(subargs = []) {
|
|
|
467
482
|
const assumeYes = subargs.includes('--yes') || subargs.includes('-y') || subargs.includes('--force');
|
|
468
483
|
const restartAfter = !subargs.includes('--no-restart');
|
|
469
484
|
const forceAll = subargs.includes('--all');
|
|
485
|
+
const dryRun = subargs.includes('--dry-run');
|
|
486
|
+
|
|
487
|
+
if (dryRun) {
|
|
488
|
+
console.log(
|
|
489
|
+
chalk.dim(' --dry-run set: no installs, kills, or restarts will be performed.\n'),
|
|
490
|
+
);
|
|
491
|
+
}
|
|
470
492
|
|
|
471
493
|
// 1. Detect running instances BEFORE doing anything else.
|
|
472
494
|
const instances = detectInstances();
|
|
473
495
|
const runningCount = (instances.service ? 1 : 0) + (instances.dashboard ? 1 : 0);
|
|
474
496
|
|
|
475
497
|
if (runningCount > 0) {
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
498
|
+
if (dryRun) {
|
|
499
|
+
const labels = [];
|
|
500
|
+
if (instances.service) labels.push(instances.service.label);
|
|
501
|
+
if (instances.dashboard) labels.push(instances.dashboard.label);
|
|
502
|
+
console.log(
|
|
503
|
+
chalk.dim(` [dry-run] would stop running instances: ${labels.join(', ')}`),
|
|
504
|
+
);
|
|
505
|
+
} else {
|
|
506
|
+
const ok = await confirmKill(instances, { assumeYes });
|
|
507
|
+
if (!ok) {
|
|
508
|
+
console.log(chalk.yellow('\n Update cancelled — instances still running.'));
|
|
509
|
+
console.log(chalk.dim(' Stop them with `bizar service stop` and `bizar dashboard stop`, then retry.'));
|
|
510
|
+
process.exit(1);
|
|
511
|
+
}
|
|
512
|
+
console.log(chalk.cyan('\n Stopping running instances...'));
|
|
513
|
+
const kills = await killInstances(instances);
|
|
514
|
+
for (const k of kills) {
|
|
515
|
+
const marker = k.ok ? chalk.green('✓') : chalk.red('✗');
|
|
516
|
+
console.log(` ${marker} ${k.name} stopped`);
|
|
517
|
+
}
|
|
518
|
+
// Give the kernel a moment to release any open file handles on the
|
|
519
|
+
// npm-global directory before npm tries to replace files.
|
|
520
|
+
await new Promise((resolve) => setTimeout(resolve, 500));
|
|
487
521
|
}
|
|
488
|
-
// Give the kernel a moment to release any open file handles on the
|
|
489
|
-
// npm-global directory before npm tries to replace files.
|
|
490
|
-
await new Promise((resolve) => setTimeout(resolve, 500));
|
|
491
522
|
} else {
|
|
492
523
|
console.log(chalk.dim(' No running Bizar instances detected.'));
|
|
493
524
|
}
|
|
@@ -523,8 +554,19 @@ export async function runUpdate(subargs = []) {
|
|
|
523
554
|
|
|
524
555
|
// 3. Decide what to update.
|
|
525
556
|
let selected;
|
|
526
|
-
if (forceAll || assumeYes) {
|
|
557
|
+
if (forceAll || assumeYes || dryRun) {
|
|
558
|
+
// dryRun defaults to showing everything (the whole point is to see
|
|
559
|
+
// what *would* change across the board). Pass a positional list to
|
|
560
|
+
// narrow the preview.
|
|
527
561
|
selected = new Set(COMPONENTS);
|
|
562
|
+
// If the user passed positional component names alongside --dry-run,
|
|
563
|
+
// narrow the selection to those.
|
|
564
|
+
const positional = subargs.filter((a) => !a.startsWith('-'));
|
|
565
|
+
if (positional.length > 0) {
|
|
566
|
+
const valid = new Set(COMPONENTS);
|
|
567
|
+
const narrowed = positional.filter((a) => valid.has(a));
|
|
568
|
+
if (narrowed.length > 0) selected = new Set(narrowed);
|
|
569
|
+
}
|
|
528
570
|
} else if (subargs.length === 0) {
|
|
529
571
|
selected = await promptForUpdates(false);
|
|
530
572
|
} else {
|
|
@@ -548,44 +590,57 @@ export async function runUpdate(subargs = []) {
|
|
|
548
590
|
const results = [];
|
|
549
591
|
if (selected.has('opencode')) {
|
|
550
592
|
console.log(chalk.bold(' → opencode'));
|
|
551
|
-
results.push(['opencode', updateOpencode()]);
|
|
593
|
+
results.push(['opencode', updateOpencode({ dryRun })]);
|
|
552
594
|
}
|
|
553
595
|
if (selected.has('bizar')) {
|
|
554
596
|
console.log(chalk.bold(` → ${PKG_MAIN}`));
|
|
555
|
-
results.push(['bizar', updatePackage(PKG_MAIN)]);
|
|
597
|
+
results.push(['bizar', updatePackage(PKG_MAIN, { dryRun })]);
|
|
556
598
|
}
|
|
557
599
|
if (selected.has('dash')) {
|
|
558
600
|
console.log(chalk.bold(` → ${PKG_DASH}`));
|
|
559
|
-
results.push(['dash', updatePackage(PKG_DASH)]);
|
|
601
|
+
results.push(['dash', updatePackage(PKG_DASH, { dryRun })]);
|
|
560
602
|
}
|
|
561
603
|
if (selected.has('plugin')) {
|
|
562
604
|
console.log(chalk.bold(` → ${PKG_PLUGIN}`));
|
|
563
|
-
results.push(['plugin', updatePackage(PKG_PLUGIN)]);
|
|
605
|
+
results.push(['plugin', updatePackage(PKG_PLUGIN, { dryRun })]);
|
|
564
606
|
}
|
|
565
607
|
|
|
566
608
|
// 4. Re-run the install script if anything relevant changed.
|
|
567
609
|
const anySuccess = results.some(([, r]) => r.ok);
|
|
568
610
|
if (anySuccess && (selected.has('bizar') || selected.has('plugin'))) {
|
|
569
611
|
console.log('');
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
612
|
+
if (dryRun) {
|
|
613
|
+
console.log(
|
|
614
|
+
chalk.dim(
|
|
615
|
+
' [dry-run] would re-run install script (bin.mjs --setup or install.sh)',
|
|
616
|
+
),
|
|
617
|
+
);
|
|
573
618
|
} else {
|
|
574
|
-
|
|
575
|
-
|
|
619
|
+
const rerun = rerunInstallScript();
|
|
620
|
+
if (rerun.ok) {
|
|
621
|
+
console.log(chalk.green(`\n ✓ ${rerun.message}`));
|
|
622
|
+
} else {
|
|
623
|
+
console.log(chalk.yellow(`\n ⚠ ${rerun.message}`));
|
|
624
|
+
console.log(chalk.dim(' Run `bash install.sh` from the Bizar repo manually.'));
|
|
625
|
+
}
|
|
576
626
|
}
|
|
577
627
|
}
|
|
578
628
|
|
|
579
629
|
// 5. Restart the dashboard if it was running before the update.
|
|
580
630
|
if (restartAfter && instances.dashboard && (selected.has('bizar') || selected.has('dash'))) {
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
if (res.ok) {
|
|
585
|
-
console.log(chalk.green(` ✓ ${res.message}`));
|
|
631
|
+
if (dryRun) {
|
|
632
|
+
console.log('');
|
|
633
|
+
console.log(chalk.dim(' [dry-run] would restart dashboard with the new code'));
|
|
586
634
|
} else {
|
|
587
|
-
console.log(
|
|
588
|
-
console.log(chalk.
|
|
635
|
+
console.log('');
|
|
636
|
+
console.log(chalk.cyan(' Restarting dashboard with the new code...'));
|
|
637
|
+
const res = spawnFreshDashboard({ port: instances.dashboard.port || undefined });
|
|
638
|
+
if (res.ok) {
|
|
639
|
+
console.log(chalk.green(` ✓ ${res.message}`));
|
|
640
|
+
} else {
|
|
641
|
+
console.log(chalk.yellow(` ⚠ ${res.message}`));
|
|
642
|
+
console.log(chalk.dim(' Start it manually with `bizar dash start --bg`.'));
|
|
643
|
+
}
|
|
589
644
|
}
|
|
590
645
|
}
|
|
591
646
|
|
|
@@ -602,5 +657,40 @@ export async function runUpdate(subargs = []) {
|
|
|
602
657
|
console.log(chalk.yellow('\n Some updates failed. See messages above.'));
|
|
603
658
|
process.exit(1);
|
|
604
659
|
}
|
|
660
|
+
if (dryRun) {
|
|
661
|
+
console.log(
|
|
662
|
+
chalk.green('\n ✓ Dry-run complete (no installs, kills, or restarts performed)\n'),
|
|
663
|
+
);
|
|
664
|
+
return;
|
|
665
|
+
}
|
|
605
666
|
console.log(chalk.green('\n ✓ Update complete\n'));
|
|
667
|
+
|
|
668
|
+
// 7. Post-update health check (v3.12.2). Catches a bad config merge or
|
|
669
|
+
// missing files before the user discovers it via a broken opencode session.
|
|
670
|
+
try {
|
|
671
|
+
const { runDoctor } = await import('./doctor.mjs');
|
|
672
|
+
const result = await runDoctor({ silent: true });
|
|
673
|
+
if (result.failed > 0) {
|
|
674
|
+
console.log('');
|
|
675
|
+
console.log(
|
|
676
|
+
chalk.yellow(' ⚠ Post-update health check found issues:'),
|
|
677
|
+
);
|
|
678
|
+
for (const r of result.results) {
|
|
679
|
+
if (!r.ok) {
|
|
680
|
+
console.log(chalk.red(` ✗ ${r.name}: ${r.message}`));
|
|
681
|
+
}
|
|
682
|
+
}
|
|
683
|
+
console.log(chalk.dim(' Run `bizar doctor` for details.'));
|
|
684
|
+
process.exit(1);
|
|
685
|
+
}
|
|
686
|
+
} catch (err) {
|
|
687
|
+
// Doctor import or runtime failure shouldn't crash the update —
|
|
688
|
+
// log a hint and let the user run `bizar doctor` themselves.
|
|
689
|
+
console.log(
|
|
690
|
+
chalk.yellow(
|
|
691
|
+
` ⚠ Post-update health check could not run: ${err.message}`,
|
|
692
|
+
),
|
|
693
|
+
);
|
|
694
|
+
console.log(chalk.dim(' Run `bizar doctor` manually to verify the install.'));
|
|
695
|
+
}
|
|
606
696
|
}
|
package/config/AGENTS.md
CHANGED
|
@@ -103,6 +103,7 @@ BizarHarness ships always-on coding rules organized by language and concern. All
|
|
|
103
103
|
| `rules/git.md` | Git and commit conventions |
|
|
104
104
|
| `rules/testing.md` | Test methodology and coverage |
|
|
105
105
|
| `rules/thinking.md` | All agents — concise thinking behavior |
|
|
106
|
+
| `rules/uncertainty.md` | All agents — stop-and-research rule; reach for `websearch` / `webfetch` when uncertain or stuck; self-catch loops before the plugin loop-guard fires |
|
|
106
107
|
|
|
107
108
|
### How to Use
|
|
108
109
|
|
|
@@ -115,6 +116,10 @@ BizarHarness ships always-on coding rules organized by language and concern. All
|
|
|
115
116
|
|
|
116
117
|
For agents with `reasoning: true` + `variant: "high"`, follow `rules/thinking.md` strictly. Cap reasoning at 2–4 sentences. No informal self-talk, no "what if" loops, no mid-thought self-correction. Think once, decide, act.
|
|
117
118
|
|
|
119
|
+
### Research-Loop Rule
|
|
120
|
+
|
|
121
|
+
Follow `rules/uncertainty.md` strictly. When uncertain or stuck, the next move is a research tool call (`websearch` for outside-the-repo facts, `webfetch` for official docs, `semble search` for codebase patterns, `hindsight_recall` for project memory) — not a third variation of the same edit. If you catch yourself about to retry the same failed command with slightly different arguments, stop and search first. The plugin's loop-guard (`loopThresholdWarn: 5`) is the safety net; self-correct at attempt 2.
|
|
122
|
+
|
|
118
123
|
---
|
|
119
124
|
|
|
120
125
|
## Model Routing & Agents
|
|
@@ -166,25 +171,25 @@ Odin (`@odin`) is the All-Father and primary/default agent. He analyzes each req
|
|
|
166
171
|
|
|
167
172
|
### Hermod
|
|
168
173
|
|
|
169
|
-
- **Model**: `openrouter/minimax-m2.7` (via OpenRouter)
|
|
174
|
+
- **Model**: `openrouter/minimax/minimax-m2.7` (via OpenRouter)
|
|
170
175
|
- **Use for**: Git and GitHub operations — commit, push, merge, PRs, branches, conflict resolution. The swift messenger.
|
|
171
176
|
- **Cost**: $0.30/M input, $1.20/M output
|
|
172
177
|
|
|
173
178
|
### Thor
|
|
174
179
|
|
|
175
|
-
- **Model**: `openrouter/minimax-m2.7` (via OpenRouter)
|
|
180
|
+
- **Model**: `openrouter/minimax/minimax-m2.7` (via OpenRouter)
|
|
176
181
|
- **Use for**: Moderate complexity features, debugging, code review, refactoring
|
|
177
182
|
- **Cost**: $0.30/M input, $1.20/M output — cheaper than Tyr, more capable than Heimdall
|
|
178
183
|
|
|
179
184
|
### Baldr
|
|
180
185
|
|
|
181
|
-
- **Model**: `openrouter/minimax-m2.7` (via OpenRouter)
|
|
186
|
+
- **Model**: `openrouter/minimax/minimax-m2.7` (via OpenRouter)
|
|
182
187
|
- **Use for**: Design system creation, DESIGN.md, visual audit, usability planning. Creates design plans — does not implement.
|
|
183
188
|
- **Cost**: $0.30/M input, $1.20/M output
|
|
184
189
|
|
|
185
190
|
### Tyr
|
|
186
191
|
|
|
187
|
-
- **Model**: `openrouter/minimax-m3` (via OpenRouter)
|
|
192
|
+
- **Model**: `openrouter/minimax/minimax-m3` (via OpenRouter)
|
|
188
193
|
- **Use for**: Highest complexity implementation, debugging, architecture, multi-step engineering
|
|
189
194
|
- **Cost**: Higher — reserved for the hardest problems
|
|
190
195
|
|
|
@@ -196,7 +201,7 @@ Odin (`@odin`) is the All-Father and primary/default agent. He analyzes each req
|
|
|
196
201
|
|
|
197
202
|
### Forseti
|
|
198
203
|
|
|
199
|
-
- **Model**: `openrouter/minimax-m3` (via OpenRouter, audit-only, no edit permissions)
|
|
204
|
+
- **Model**: `openrouter/minimax/minimax-m3` (via OpenRouter, audit-only, no edit permissions)
|
|
200
205
|
- **Use for**: Adversarial plan review — audits completeness, correctness, consistency, feasibility, security
|
|
201
206
|
- **Always runs before any Tier 4 or Tier 5 implementation begins**
|
|
202
207
|
|
package/config/agents/baldr.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
description: Baldr — UI/UX design system specialist. Creates DESIGN.md files using Google's design.md standard (alpha). Focuses on visual consistency, usability, accessibility, and design tokens.
|
|
3
3
|
mode: subagent
|
|
4
|
-
model: openrouter/minimax-m2.7
|
|
4
|
+
model: openrouter/minimax/minimax-m2.7
|
|
5
5
|
color: "#ec4899"
|
|
6
6
|
permission:
|
|
7
7
|
read: allow
|
package/config/agents/forseti.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
description: Forseti — Audits, criticizes, and corrects implementation plans before execution using MiniMax M3. No write permissions — review only.
|
|
3
3
|
mode: subagent
|
|
4
|
-
model: openrouter/minimax-m3
|
|
4
|
+
model: openrouter/minimax/minimax-m3
|
|
5
5
|
color: "#ef4444"
|
|
6
6
|
permission:
|
|
7
7
|
read: allow
|
package/config/agents/hermod.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
description: Hermod — Git and GitHub operations specialist using MiniMax M2.7. Branching, commits, PRs, merge/rebase, conflict resolution, CI/CD, releases, gh CLI.
|
|
3
3
|
mode: subagent
|
|
4
|
-
model: openrouter/minimax-m2.7
|
|
4
|
+
model: openrouter/minimax/minimax-m2.7
|
|
5
5
|
color: "#06b6d4"
|
|
6
6
|
permission:
|
|
7
7
|
read: allow
|
package/config/agents/odin.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
description: Odin — Pure router that delegates all work to subagents. Routes across Frigg (DeepSeek/Q&A), Vör (DeepSeek/clarify), Mimir (DeepSeek/research), Heimdall (DeepSeek/simple), Hermod (M2.7/git), Thor (M2.7/mid), Baldr (M2.7/design), Tyr (M3/top), Vidarr (GPT-5.5/ultra), Forseti (verifier/M3).
|
|
3
3
|
mode: primary
|
|
4
|
-
model: openrouter/minimax-m3
|
|
4
|
+
model: openrouter/minimax/minimax-m3
|
|
5
5
|
color: "#6366f1"
|
|
6
6
|
permission:
|
|
7
7
|
task: allow
|
|
@@ -306,7 +306,7 @@ Call `bizar_spawn_background` with:
|
|
|
306
306
|
|
|
307
307
|
- `agent`: the agent name (e.g., "mimir", "thor", "tyr")
|
|
308
308
|
- `prompt`: what to do (specific, with context)
|
|
309
|
-
- `model`: optional, `"<providerID>/<modelID>"` format (e.g., `"openrouter/minimax-m3"`)
|
|
309
|
+
- `model`: optional, `"<providerID>/<modelID>"` format (e.g., `"openrouter/minimax/minimax-m3"`)
|
|
310
310
|
- `timeoutMs`: optional, default 5 min, max 30 min, min 1s
|
|
311
311
|
|
|
312
312
|
You get an `instanceId` back immediately.
|
package/config/agents/quick.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
description: Quick (quick) — fast single-shot tasks. No delegation, no parallel streams. Use for small edits, mechanical changes, one-shot questions. Routes to no one.
|
|
3
3
|
mode: primary
|
|
4
|
-
model: openrouter/minimax-m2.7
|
|
4
|
+
model: openrouter/minimax/minimax-m2.7
|
|
5
5
|
color: "#22d3ee"
|
|
6
6
|
permission:
|
|
7
7
|
read: allow
|
package/config/agents/thor.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
description: Thor — Handles medium-complexity tasks using MiniMax M2.7 from OpenRouter. Strong and reliable, cheaper than Tyr but more capable than Heimdall.
|
|
3
3
|
mode: subagent
|
|
4
|
-
model: openrouter/minimax-m2.7
|
|
4
|
+
model: openrouter/minimax/minimax-m2.7
|
|
5
5
|
color: "#a855f7"
|
|
6
6
|
permission:
|
|
7
7
|
read: allow
|
package/config/agents/tyr.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
description: Tyr — Handles the most complex implementation, debugging, and architectural work using MiniMax M3 via OpenRouter. Unmatched wisdom for the hardest problems.
|
|
3
3
|
mode: subagent
|
|
4
|
-
model: openrouter/minimax-m3
|
|
4
|
+
model: openrouter/minimax/minimax-m3
|
|
5
5
|
color: "#f59e0b"
|
|
6
6
|
permission:
|
|
7
7
|
read: allow
|
|
@@ -1,23 +1,10 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "https://opencode.ai/config.json",
|
|
3
|
-
"model": "openrouter/minimax-m3",
|
|
4
|
-
"small_model": "openrouter/minimax-m2.7",
|
|
3
|
+
"model": "openrouter/minimax/minimax-m3",
|
|
4
|
+
"small_model": "openrouter/minimax/minimax-m2.7",
|
|
5
5
|
"default_agent": "odin",
|
|
6
6
|
"permission": "allow",
|
|
7
7
|
"snapshot": false,
|
|
8
|
-
"provider": {
|
|
9
|
-
"openrouter": {
|
|
10
|
-
"npm": "@openrouter/ai-sdk-provider",
|
|
11
|
-
"name": "OpenRouter",
|
|
12
|
-
"options": {
|
|
13
|
-
"apiKey": "{env:OPENROUTER_API_KEY}"
|
|
14
|
-
},
|
|
15
|
-
"models": {
|
|
16
|
-
"minimax-m2.7": {},
|
|
17
|
-
"minimax-m3": {}
|
|
18
|
-
}
|
|
19
|
-
}
|
|
20
|
-
},
|
|
21
8
|
"mcp": {
|
|
22
9
|
"supabase": {
|
|
23
10
|
"type": "remote",
|
|
@@ -66,7 +53,7 @@
|
|
|
66
53
|
"odin": {
|
|
67
54
|
"description": "Odin — Pure router that delegates all work to subagents.",
|
|
68
55
|
"mode": "primary",
|
|
69
|
-
"model": "openrouter/minimax-m3",
|
|
56
|
+
"model": "openrouter/minimax/minimax-m3",
|
|
70
57
|
"color": "#6366f1",
|
|
71
58
|
"permission": {
|
|
72
59
|
"task": "allow",
|
|
@@ -80,7 +67,7 @@
|
|
|
80
67
|
"vor": {
|
|
81
68
|
"description": "Vör — The Questioning One.",
|
|
82
69
|
"mode": "subagent",
|
|
83
|
-
"model": "openrouter/minimax-m2.7",
|
|
70
|
+
"model": "openrouter/minimax/minimax-m2.7",
|
|
84
71
|
"color": "#8b5cf6",
|
|
85
72
|
"permission": {
|
|
86
73
|
"read": "allow",
|
|
@@ -93,7 +80,7 @@
|
|
|
93
80
|
"frigg": {
|
|
94
81
|
"description": "Frigg — All-knowing Q&A agent.",
|
|
95
82
|
"mode": "primary",
|
|
96
|
-
"model": "openrouter/minimax-m2.7",
|
|
83
|
+
"model": "openrouter/minimax/minimax-m2.7",
|
|
97
84
|
"color": "#06b6d4",
|
|
98
85
|
"permission": {
|
|
99
86
|
"read": "allow",
|
|
@@ -111,7 +98,7 @@
|
|
|
111
98
|
"quick": {
|
|
112
99
|
"description": "Quick — Fast single-shot tasks.",
|
|
113
100
|
"mode": "primary",
|
|
114
|
-
"model": "openrouter/minimax-m2.7",
|
|
101
|
+
"model": "openrouter/minimax/minimax-m2.7",
|
|
115
102
|
"color": "#22d3ee",
|
|
116
103
|
"permission": {
|
|
117
104
|
"read": "allow",
|
|
@@ -130,7 +117,7 @@
|
|
|
130
117
|
"mimir": {
|
|
131
118
|
"description": "Mimir — Research and codebase exploration agent.",
|
|
132
119
|
"mode": "subagent",
|
|
133
|
-
"model": "openrouter/minimax-m2.7",
|
|
120
|
+
"model": "openrouter/minimax/minimax-m2.7",
|
|
134
121
|
"color": "#0ea5e9",
|
|
135
122
|
"permission": {
|
|
136
123
|
"read": "allow",
|
|
@@ -148,7 +135,7 @@
|
|
|
148
135
|
"heimdall": {
|
|
149
136
|
"description": "Heimdall — Simple, routine, deterministic tasks.",
|
|
150
137
|
"mode": "subagent",
|
|
151
|
-
"model": "openrouter/minimax-m2.7",
|
|
138
|
+
"model": "openrouter/minimax/minimax-m2.7",
|
|
152
139
|
"color": "#10b981",
|
|
153
140
|
"permission": {
|
|
154
141
|
"read": "allow",
|
|
@@ -165,7 +152,7 @@
|
|
|
165
152
|
"hermod": {
|
|
166
153
|
"description": "Hermod — Git and GitHub operations specialist.",
|
|
167
154
|
"mode": "subagent",
|
|
168
|
-
"model": "openrouter/minimax-m2.7",
|
|
155
|
+
"model": "openrouter/minimax/minimax-m2.7",
|
|
169
156
|
"color": "#06b6d4",
|
|
170
157
|
"permission": {
|
|
171
158
|
"read": "allow",
|
|
@@ -181,7 +168,7 @@
|
|
|
181
168
|
"thor": {
|
|
182
169
|
"description": "Thor — Medium-complexity tasks, strong and reliable.",
|
|
183
170
|
"mode": "subagent",
|
|
184
|
-
"model": "openrouter/minimax-m2.7",
|
|
171
|
+
"model": "openrouter/minimax/minimax-m2.7",
|
|
185
172
|
"color": "#a855f7",
|
|
186
173
|
"permission": {
|
|
187
174
|
"read": "allow",
|
|
@@ -198,7 +185,7 @@
|
|
|
198
185
|
"baldr": {
|
|
199
186
|
"description": "Baldr — UI/UX design system specialist.",
|
|
200
187
|
"mode": "subagent",
|
|
201
|
-
"model": "openrouter/minimax-m2.7",
|
|
188
|
+
"model": "openrouter/minimax/minimax-m2.7",
|
|
202
189
|
"color": "#ec4899",
|
|
203
190
|
"permission": {
|
|
204
191
|
"read": "allow",
|
|
@@ -215,7 +202,7 @@
|
|
|
215
202
|
"tyr": {
|
|
216
203
|
"description": "Tyr — Complex implementation, debugging, architecture.",
|
|
217
204
|
"mode": "subagent",
|
|
218
|
-
"model": "openrouter/minimax-m3",
|
|
205
|
+
"model": "openrouter/minimax/minimax-m3",
|
|
219
206
|
"color": "#f59e0b",
|
|
220
207
|
"permission": {
|
|
221
208
|
"read": "allow",
|
|
@@ -249,7 +236,7 @@
|
|
|
249
236
|
"forseti": {
|
|
250
237
|
"description": "Forseti — Audits and corrects plans before execution.",
|
|
251
238
|
"mode": "subagent",
|
|
252
|
-
"model": "openrouter/minimax-m3",
|
|
239
|
+
"model": "openrouter/minimax/minimax-m3",
|
|
253
240
|
"color": "#ef4444",
|
|
254
241
|
"permission": {
|
|
255
242
|
"read": "allow",
|
|
@@ -325,11 +312,17 @@
|
|
|
325
312
|
"models": {
|
|
326
313
|
"MiniMax-M3": {
|
|
327
314
|
"interleaved": { "field": "reasoning_details" },
|
|
328
|
-
"reasoning": true
|
|
315
|
+
"reasoning": true,
|
|
316
|
+
"options": {
|
|
317
|
+
"thinking": "adaptive"
|
|
318
|
+
}
|
|
329
319
|
},
|
|
330
320
|
"MiniMax-M2.7": {
|
|
331
321
|
"interleaved": { "field": "reasoning_details" },
|
|
332
|
-
"reasoning": true
|
|
322
|
+
"reasoning": true,
|
|
323
|
+
"options": {
|
|
324
|
+
"thinking": "adaptive"
|
|
325
|
+
}
|
|
333
326
|
}
|
|
334
327
|
}
|
|
335
328
|
},
|
|
@@ -337,11 +330,17 @@
|
|
|
337
330
|
"models": {
|
|
338
331
|
"minimax/minimax-m3": {
|
|
339
332
|
"interleaved": { "field": "reasoning_details" },
|
|
340
|
-
"reasoning": true
|
|
333
|
+
"reasoning": true,
|
|
334
|
+
"options": {
|
|
335
|
+
"reasoning": { "enabled": true }
|
|
336
|
+
}
|
|
341
337
|
},
|
|
342
338
|
"minimax/minimax-m2.7": {
|
|
343
339
|
"interleaved": { "field": "reasoning_details" },
|
|
344
|
-
"reasoning": true
|
|
340
|
+
"reasoning": true,
|
|
341
|
+
"options": {
|
|
342
|
+
"reasoning": { "enabled": true }
|
|
343
|
+
}
|
|
345
344
|
}
|
|
346
345
|
}
|
|
347
346
|
}
|
package/config/rules/general.md
CHANGED
|
@@ -5,4 +5,5 @@
|
|
|
5
5
|
- All code must be reviewed by another agent before merging
|
|
6
6
|
- Keep functions small and focused — a function should do one thing
|
|
7
7
|
- Use meaningful names for variables, functions, and classes
|
|
8
|
-
- Prefer readability over cleverness
|
|
8
|
+
- Prefer readability over cleverness
|
|
9
|
+
- When uncertain or stuck, reach for `websearch` / `webfetch` (or `semble search` / `hindsight_recall` for repo and project memory) before trying a third variation of the same edit — see `uncertainty.md`
|
|
@@ -98,8 +98,8 @@ permission:
|
|
|
98
98
|
|
|
99
99
|
**Fix:** Check `~/.config/opencode/agents/<name>.md` for the `model:` field. Valid models:
|
|
100
100
|
- `opencode/deepseek-v4-flash-free` — free
|
|
101
|
-
- `openrouter/minimax-m2.7` — M2.7
|
|
102
|
-
- `openrouter/minimax-m3` — M3
|
|
101
|
+
- `openrouter/minimax/minimax-m2.7` — M2.7
|
|
102
|
+
- `openrouter/minimax/minimax-m3` — M3
|
|
103
103
|
- `openai/gpt-5.5` — GPT-5.5
|
|
104
104
|
|
|
105
105
|
### OpenRouter 404 Errors
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@polderlabs/bizar",
|
|
3
|
-
"version": "3.12.
|
|
3
|
+
"version": "3.12.2",
|
|
4
4
|
"description": "Norse-pantheon multi-agent system for opencode — 13 agents across 4 cost tiers with cost-aware routing, plans, and a configurable agent harness.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|