@polderlabs/bizar 3.7.3 → 3.9.0

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/cli/init.mjs CHANGED
@@ -150,6 +150,41 @@ ${stack.runner ? `- Dev: \`${stack.runner}\`` : ''}
150
150
  console.log(chalk.green(` ✓ Created ${siPath}`));
151
151
  }
152
152
 
153
+ // Build per-project knowledge graph (graphify -> .bizar/graph/)
154
+ // Soft step: never fails init. If graphify is missing or build errors,
155
+ // the user can retry manually with `bizar graph build`.
156
+ console.log(chalk.bold('\n--- Graph ---\n'));
157
+ const detectGraphify = spawnSync('python3', ['-c', 'import graphify; print(graphify.__version__)'], {
158
+ cwd,
159
+ encoding: 'utf8',
160
+ timeout: 5000,
161
+ });
162
+ const graphifyAvailable = detectGraphify.status === 0 && (detectGraphify.stdout || '').trim().length > 0;
163
+
164
+ if (!graphifyAvailable) {
165
+ console.log(chalk.yellow(' graphify not detected — skipping project graph build.'));
166
+ console.log(chalk.dim(' Install with: pip install graphifyy (or pipx install graphifyy)'));
167
+ console.log(chalk.dim(' Then re-run: bizar graph build'));
168
+ console.log(chalk.dim(' The graph will land in .bizar/graph/ inside this project.'));
169
+ } else {
170
+ console.log(chalk.dim(' Building project knowledge graph (.bizar/graph/)...'));
171
+ // npx resolves "bizar" via local package.json bin field (or global install).
172
+ // Fallback for environments without global bizar: node <repo>/cli/bin.mjs graph build
173
+ const buildResult = spawnSync('npx', ['bizar', 'graph', 'build'], {
174
+ cwd,
175
+ stdio: 'inherit',
176
+ timeout: 5 * 60 * 1000,
177
+ });
178
+ if (buildResult.status === 0) {
179
+ console.log(chalk.green(' ✓ Graph built at .bizar/graph/ — query with: bizar graph query "<concept>"'));
180
+ } else {
181
+ const code = buildResult.status !== null ? buildResult.status : (buildResult.signal || '?');
182
+ console.log(chalk.yellow(` Graph build failed (exit ${code}). You can retry manually:`));
183
+ console.log(chalk.dim(' bizar graph build'));
184
+ console.log(chalk.dim(' The graph will land in .bizar/graph/ inside this project.'));
185
+ }
186
+ }
187
+
153
188
  console.log(chalk.dim('\n Project initialized. Run `@frigg` to ask questions about the codebase.\n'));
154
189
  return true;
155
190
  }
package/cli/install.mjs CHANGED
@@ -292,6 +292,9 @@ export async function runInstaller() {
292
292
  }
293
293
  }
294
294
 
295
+ // ── Post-install: graphify ──
296
+ await promptGraphifyInstall();
297
+
295
298
  // ── Post-install ──
296
299
  console.log(chalk.dim('\n Odin watches. The Pantheon awaits. ᛟ\n'));
297
300
  }
@@ -386,6 +389,152 @@ async function promptAndInstallOptional() {
386
389
  }
387
390
  }
388
391
 
392
+ async function promptGraphifyInstall() {
393
+ const { spawnSync, execSync } = await import('node:child_process');
394
+
395
+ console.log();
396
+ sectionHeading('Knowledge Graph (graphify)');
397
+
398
+ // 1. Detect graphify already installed
399
+ const detect = spawnSync('python3', ['-c', 'import graphify; print(graphify.__version__)'], {
400
+ cwd: process.cwd(),
401
+ encoding: 'utf8',
402
+ timeout: 5000,
403
+ });
404
+ const graphifyInstalled = detect.status === 0 && (detect.stdout || '').trim().length > 0;
405
+
406
+ if (graphifyInstalled) {
407
+ console.log(chalk.green(' graphify already installed — skipping.'));
408
+ return;
409
+ }
410
+
411
+ // 2. Non-interactive: print hint and exit
412
+ if (!stdin.isTTY || !stdout.isTTY) {
413
+ console.log(chalk.dim(' graphify not detected. Install later with:'));
414
+ console.log(chalk.dim(' uv tool install graphifyy # recommended'));
415
+ console.log(chalk.dim(' pip install graphifyy'));
416
+ console.log(chalk.dim(' pipx install graphifyy'));
417
+ console.log(chalk.dim(' Then run `bizar graph build` to populate .bizar/graph/.'));
418
+ return;
419
+ }
420
+
421
+ // 3. Interactive: show options with uv first
422
+ console.log(chalk.dim(' graphify not detected. graphify powers per-project knowledge graphs (bizar graph build).'));
423
+ console.log(chalk.dim(' Install with one of:'));
424
+ console.log(chalk.dim(' uv tool install graphifyy # recommended'));
425
+ console.log(chalk.dim(' pip install graphifyy'));
426
+ console.log(chalk.dim(' pipx install graphifyy'));
427
+
428
+ const hasUv = await detectUv();
429
+
430
+ if (hasUv) {
431
+ // 3a. uv is available — ask to install via uv directly
432
+ const rl = createInterface({ input: stdin, output: stdout });
433
+ try {
434
+ const answer = (await rl.question(' Install graphify now via uv? [Y/n]: ')).trim().toLowerCase();
435
+ rl.close();
436
+
437
+ if (answer === '' || answer.startsWith('y')) {
438
+ console.log(' Installing graphify via uv...');
439
+ try {
440
+ execSync('uv tool install graphifyy', { stdio: 'inherit', timeout: 120000 });
441
+ console.log(chalk.green(' graphify installed. Run `bizar graph build` to populate .bizar/graph/.'));
442
+ } catch (err) {
443
+ console.log(chalk.red(` uv tool install failed: ${err.message}`));
444
+ console.log(chalk.dim(' Install manually: uv tool install graphifyy'));
445
+ }
446
+ } else {
447
+ console.log(chalk.dim(' Skipped. Install manually with one of the commands above when ready.'));
448
+ }
449
+ } catch {
450
+ rl.close();
451
+ console.log(chalk.dim(' Skipped.'));
452
+ }
453
+ } else {
454
+ // 3b. uv not available — ask if we should install uv first
455
+ console.log();
456
+ console.log(chalk.dim(' uv not detected. uv is recommended on Arch/Fedora/macOS (avoids PEP 668).'));
457
+
458
+ const rl = createInterface({ input: stdin, output: stdout });
459
+ try {
460
+ const answer = (await rl.question(' Install uv first, then graphify? [Y/n]: ')).trim().toLowerCase();
461
+ rl.close();
462
+
463
+ if (answer === '' || answer.startsWith('y')) {
464
+ if (process.platform === 'win32') {
465
+ console.log(chalk.yellow(' Automatic uv install not supported on Windows.'));
466
+ console.log(chalk.dim(' Install from https://docs.astral.sh/uv then run: uv tool install graphifyy'));
467
+ return;
468
+ }
469
+
470
+ console.log(' Installing uv...');
471
+ try {
472
+ execSync('curl -LsSf https://astral.sh/uv/install.sh | sh', { stdio: 'inherit', timeout: 60000 });
473
+ } catch (err) {
474
+ console.log(chalk.red(` uv install failed: ${err.message}`));
475
+ console.log(chalk.dim(' Install manually from https://docs.astral.sh/uv'));
476
+ // Fall back to pip
477
+ const rl2 = createInterface({ input: stdin, output: stdout });
478
+ try {
479
+ const pipAnswer = (await rl2.question(' Install graphify via pip instead? [Y/n]: ')).trim().toLowerCase();
480
+ rl2.close();
481
+ if (pipAnswer === '' || pipAnswer.startsWith('y')) {
482
+ console.log(' Installing graphify via pip...');
483
+ const result = spawnSync('pip', ['install', 'graphifyy'], { stdio: 'inherit', timeout: 120000 });
484
+ if (result.status === 0) {
485
+ console.log(chalk.green(' graphify installed. Run `bizar graph build` to populate .bizar/graph/.'));
486
+ } else {
487
+ console.log(chalk.red(` pip install failed (exit ${result.status}).`));
488
+ console.log(chalk.dim(' Install manually: pip install graphifyy'));
489
+ }
490
+ } else {
491
+ console.log(chalk.dim(' Skipped.'));
492
+ }
493
+ } catch {
494
+ rl2.close();
495
+ console.log(chalk.dim(' Skipped.'));
496
+ }
497
+ return;
498
+ }
499
+
500
+ console.log(' Installing graphify via uv...');
501
+ try {
502
+ execSync('uv tool install graphifyy', { stdio: 'inherit', timeout: 120000 });
503
+ console.log(chalk.green(' graphify installed. Run `bizar graph build` to populate .bizar/graph/.'));
504
+ } catch (err) {
505
+ console.log(chalk.red(` uv tool install failed: ${err.message}`));
506
+ console.log(chalk.dim(' Install manually: uv tool install graphifyy'));
507
+ }
508
+ } else {
509
+ // User declined uv — fall back to pip
510
+ const rl2 = createInterface({ input: stdin, output: stdout });
511
+ try {
512
+ const pipAnswer = (await rl2.question(' Install graphify via pip instead? [Y/n]: ')).trim().toLowerCase();
513
+ rl2.close();
514
+ if (pipAnswer === '' || pipAnswer.startsWith('y')) {
515
+ console.log(' Installing graphify via pip...');
516
+ const result = spawnSync('pip', ['install', 'graphifyy'], { stdio: 'inherit', timeout: 120000 });
517
+ if (result.status === 0) {
518
+ console.log(chalk.green(' graphify installed. Run `bizar graph build` to populate .bizar/graph/.'));
519
+ } else {
520
+ console.log(chalk.red(` pip install failed (exit ${result.status}).`));
521
+ console.log(chalk.dim(' Install manually: pip install graphifyy'));
522
+ }
523
+ } else {
524
+ console.log(chalk.dim(' Skipped.'));
525
+ }
526
+ } catch {
527
+ rl2.close();
528
+ console.log(chalk.dim(' Skipped.'));
529
+ }
530
+ }
531
+ } catch {
532
+ rl.close();
533
+ console.log(chalk.dim(' Skipped.'));
534
+ }
535
+ }
536
+ }
537
+
389
538
  export async function runPostInstall() {
390
539
  // Skip interactive prompts in CI / non-TTY environments
391
540
  if (!process.env.BIZAR_SKIP_OPTIONAL_INSTALLS) {
package/config/AGENTS.md CHANGED
@@ -116,7 +116,7 @@ BizarHarness ships always-on coding rules organized by language and concern. All
116
116
 
117
117
  This system uses a 5-tier model architecture with a verification gate:
118
118
 
119
- ### Odin (default agent, MiniMax-M3)
119
+ ### Odin (default agent, OpenRouter minimax-m3)
120
120
 
121
121
  Odin (`@odin`) is the All-Father and primary/default agent. He analyzes each request and **decomposes it into independent work streams** — **he never executes work himself**:
122
122
  - **Identifies parallelizable work** and launches multiple subagent `task` calls in a **single message** (always 2+)
@@ -161,25 +161,25 @@ Odin (`@odin`) is the All-Father and primary/default agent. He analyzes each req
161
161
 
162
162
  ### Hermod
163
163
 
164
- - **Model**: `minimax/MiniMax-M2.7` (via minimax.io)
164
+ - **Model**: `openrouter/minimax-m2.7` (via OpenRouter)
165
165
  - **Use for**: Git and GitHub operations — commit, push, merge, PRs, branches, conflict resolution. The swift messenger.
166
166
  - **Cost**: $0.30/M input, $1.20/M output
167
167
 
168
168
  ### Thor
169
169
 
170
- - **Model**: `minimax/MiniMax-M2.7` (via minimax.io)
170
+ - **Model**: `openrouter/minimax-m2.7` (via OpenRouter)
171
171
  - **Use for**: Moderate complexity features, debugging, code review, refactoring
172
172
  - **Cost**: $0.30/M input, $1.20/M output — cheaper than Tyr, more capable than Heimdall
173
173
 
174
174
  ### Baldr
175
175
 
176
- - **Model**: `minimax/MiniMax-M2.7` (via minimax.io)
176
+ - **Model**: `openrouter/minimax-m2.7` (via OpenRouter)
177
177
  - **Use for**: Design system creation, DESIGN.md, visual audit, usability planning. Creates design plans — does not implement.
178
178
  - **Cost**: $0.30/M input, $1.20/M output
179
179
 
180
180
  ### Tyr
181
181
 
182
- - **Model**: `minimax/MiniMax-M3` (via minimax.io)
182
+ - **Model**: `openrouter/minimax-m3` (via OpenRouter)
183
183
  - **Use for**: Highest complexity implementation, debugging, architecture, multi-step engineering
184
184
  - **Cost**: Higher — reserved for the hardest problems
185
185
 
@@ -191,7 +191,7 @@ Odin (`@odin`) is the All-Father and primary/default agent. He analyzes each req
191
191
 
192
192
  ### Forseti
193
193
 
194
- - **Model**: `minimax/MiniMax-M3` (via minimax.io, audit-only, no edit permissions)
194
+ - **Model**: `openrouter/minimax-m3` (via OpenRouter, audit-only, no edit permissions)
195
195
  - **Use for**: Adversarial plan review — audits completeness, correctness, consistency, feasibility, security
196
196
  - **Always runs before any Tier 4 or Tier 5 implementation begins**
197
197
 
@@ -283,6 +283,36 @@ The Hindsight MCP server is already configured. All agents interact with it thro
283
283
 
284
284
  ---
285
285
 
286
+ ## Graph Query (bizar graph)
287
+
288
+ Bizar integrates [graphify](https://github.com/safishamsi/graphify) for per-project knowledge graphs. When investigating a Bizar project, **query the graph before grepping raw files** — it's faster and surfaces structural relationships grep can't see.
289
+
290
+ ### Where the graph lives
291
+ `.bizar/graph/` inside the project (git-trackable JSON + Markdown; cache and per-machine interpreter path are gitignored).
292
+
293
+ ### How to query
294
+ From the project root, the user (or heimdall via `/init` or any other agent prompted by Odin) can run:
295
+ - `bizar graph status` — confirm the graph exists; print node/edge/community counts
296
+ - `bizar graph query "<concept>"` — find nodes related to a concept (BFS traversal)
297
+ - `bizar graph path "<A>" "<B>"` — shortest path between two concepts
298
+ - `bizar graph explain "<X>"` — all nodes related to X
299
+ - `bizar graph update` — incremental rebuild after editing source files
300
+ - `bizar graph build` — full rebuild (overwrites existing graph)
301
+ - `bizar graph watch` — foreground watcher (Ctrl-C to stop)
302
+
303
+ ### When to use the graph
304
+ - Before reading a large file: `bizar graph explain "<module-name>"` to see what calls/uses it
305
+ - When mapping unfamiliar code: `bizar graph query "<feature>"` to find related concepts
306
+ - When debugging cross-module interactions: `bizar graph path "<symptom>" "<root-cause>"`
307
+ - Before grep: `bizar graph query "<term>"` first — the graph may already point you to the right file
308
+
309
+ ### When NOT to use the graph
310
+ - The graph is stale (run `bizar graph update` first)
311
+ - graphify is not installed (init skipped graph step; user can install with `pip install graphifyy` then `bizar graph build`)
312
+ - The question is about runtime behavior, not source structure
313
+
314
+ ---
315
+
286
316
  ---
287
317
 
288
318
  ## General Agent Baseline — Always-On Behavior
@@ -548,3 +578,26 @@ For Bizar-internal claims (citing files, lines, tool results), use file:line ref
548
578
 
549
579
  This baseline covers: identity, refusal, tone, formatting, lists, user wellbeing, evenhandedness, mistakes, knowledge cutoff and research-first, MCP servers and skills, mandatory skill-read, file creation, file handling, search, copyright, harmful content, citations, images, memory privacy, execution, clarification, and communication. Every Bizar agent — Odin, Frigg, Vör, Mimir, Heimdall, Hermod, Thor, Baldr, Tyr, Vidarr, Forseti — must follow it.
550
580
 
581
+ ---
582
+
583
+ ## Parallel Execution Awareness
584
+
585
+ You may be dispatched by Odin as one of several agents running concurrently against the same working directory and the same git repository. Your sibling agents **cannot see you** and you **cannot see them**. Without discipline this leads to silent file overwrites, `.git/index.lock` collisions, lockfile corruption, and lost work.
586
+
587
+ ### Hard rules when you have siblings (Odin tells you in the prompt)
588
+
589
+ 1. **File scope is sacred.** Odin assigns you a scope. Only modify files inside it. If you need to touch something outside, STOP and report — do not improvise.
590
+ 2. **No write-level git.** `git commit`, `push`, `merge`, `rebase`, `reset`, `clean`, `stash`, branch-switching `checkout`, and `pull --rebase` are FORBIDDEN for every agent except @hermod. Use `git status`, `git diff`, `git log`, and `git add` (scope files only) for context.
591
+ 3. **Detect conflicts before they happen.** Before writing a file, run `git diff --name-only` and confirm the file is not in a sibling's scope. If it has changed since you started, STOP and report.
592
+ 4. **`.git/index.lock` is a sibling's signal.** If you see it, wait 2-3 seconds and retry. If it persists, STOP and report. Do not delete the lock file.
593
+ 5. **Lockfiles and root configs are shared.** `package.json`, `package-lock.json`, `tsconfig.json`, `vite.config.*`, `Dockerfile`, CI configs — only ONE agent in a batch should touch these. If Odin did not assign them to you, treat as READ-ONLY.
594
+ 6. **Report parallel context in your final summary.** State "siblings: ..." and any conflicts observed.
595
+
596
+ ### Default behavior when Odin does NOT mention siblings
597
+
598
+ - You may work normally.
599
+ - Still avoid `git commit`/`push`/`merge`/`rebase`/`reset`/`clean`/`stash` unless explicitly asked. Default to read-only git unless the user/Odin explicitly requests a write operation. When in doubt, leave git work to @hermod.
600
+
601
+ ### Why this exists
602
+ The harness shares one `.git/` directory across all parallel sessions. Two simultaneous `git commit` calls race on the index lock. Two agents writing the same file = silent last-writer-wins data loss. Discipline now is cheaper than recovery later.
603
+
@@ -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: minimax/MiniMax-M2.7
4
+ model: openrouter/minimax-m2.7
5
5
  color: "#ec4899"
6
6
  permission:
7
7
  read: allow
@@ -160,6 +160,30 @@ The injected message you will see is exactly one of:
160
160
  - `[loop guard: 8 identical calls to <tool>]. Consider using the task tool to report back to your parent with what you've learned and what you need.`
161
161
  - An error containing: `Loop protection: 12 identical calls to <tool>. Use task to escalate.`
162
162
 
163
+ ## Parallel Execution
164
+
165
+ You may be dispatched alongside sibling agents working on the same repository at the same time. The shared `AGENTS.md` baseline contains the universal rules — read those first. This section adds role-specific guidance.
166
+
167
+ ### When Odin tells you about siblings in your prompt
168
+ - You will receive a `## PARALLEL EXECUTION CONTEXT` block listing your siblings and your file scope.
169
+ - Treat your scope as a hard boundary. Files outside your scope are READ-ONLY.
170
+ - If Odin did not give you a scope, default to: write nothing, return a clarifying question to Odin.
171
+
172
+ ### Git — your specific rules
173
+ - ALLOWED: `git status`, `git diff`, `git log`, `git branch --list`, `git add` (scope files only)
174
+ - FORBIDDEN: `git commit`, `git push`, `git merge`, `git rebase`, `git reset`, `git clean`, `git stash`, branch-switching `checkout`, `pull --rebase`
175
+ - If a task seems to require a forbidden operation, report it back to Odin in your final summary — do not improvise. Only @hermod performs write-level git.
176
+ - If you hit `.git/index.lock`, wait 2-3s and retry. If it persists, STOP and report.
177
+
178
+ ### Pre-write checklist (before every `write` / `edit` call)
179
+ 1. Is the file inside the scope Odin gave me? If not, STOP.
180
+ 2. Has this file changed since I started? (`git diff --name-only <file>`) If yes, STOP — a sibling may have written it.
181
+ 3. Is this a lockfile or root config (`package.json`, `package-lock.json`, `tsconfig.json`, `vite.config.*`, `Dockerfile`, CI)? If yes, only proceed if Odin explicitly assigned it to you.
182
+ 4. Proceed.
183
+
184
+ ### Reporting
185
+ End your final summary with: `Siblings: <list>. Conflicts: <list or "none">. Git ops performed: <list or "none">.`
186
+
163
187
  ---
164
188
 
165
189
  ## Always-On Behavior Baseline
@@ -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: minimax/MiniMax-M3
4
+ model: openrouter/minimax-m3
5
5
  color: "#ef4444"
6
6
  permission:
7
7
  read: allow
@@ -124,6 +124,15 @@ Be professional and concise. Do not write long essays for every action.
124
124
  - One sentence of context beats three paragraphs of preamble.
125
125
  - Match the user's register: if they write briefly, reply briefly. If they want depth, they will ask.
126
126
 
127
+ ## Parallel Execution
128
+
129
+ You may be invoked alongside other audit agents (parallel reviews of different files) or alongside implementation agents. The shared `AGENTS.md` baseline rules apply.
130
+
131
+ ### Your rules
132
+ - You are AUDIT-ONLY. You MUST NOT modify source files, write to `.bizar/`, or run write-level git.
133
+ - If running alongside an implementation agent and you need to read a file it is currently editing, do not block on `.git/index.lock` — just read the file directly.
134
+ - Report any active sibling agents in your final summary so Odin knows the audit was concurrent.
135
+
127
136
  ---
128
137
 
129
138
  ## Always-On Behavior Baseline
@@ -169,6 +169,30 @@ Be professional and concise. Do not write long essays for every action.
169
169
  - One sentence of context beats three paragraphs of preamble.
170
170
  - Match the user's register: if they write briefly, reply briefly. If they want depth, they will ask.
171
171
 
172
+ ## Parallel Execution
173
+
174
+ You may be dispatched alongside sibling agents working on the same repository at the same time. The shared `AGENTS.md` baseline contains the universal rules — read those first. This section adds role-specific guidance.
175
+
176
+ ### When Odin tells you about siblings in your prompt
177
+ - You will receive a `## PARALLEL EXECUTION CONTEXT` block listing your siblings and your file scope.
178
+ - Treat your scope as a hard boundary. Files outside your scope are READ-ONLY.
179
+ - If Odin did not give you a scope, default to: write nothing, return a clarifying question to Odin.
180
+
181
+ ### Git — your specific rules
182
+ - ALLOWED: `git status`, `git diff`, `git log`, `git branch --list`, `git add` (scope files only)
183
+ - FORBIDDEN: `git commit`, `git push`, `git merge`, `git rebase`, `git reset`, `git clean`, `git stash`, branch-switching `checkout`, `pull --rebase`
184
+ - If a task seems to require a forbidden operation, report it back to Odin in your final summary — do not improvise. Only @hermod performs write-level git.
185
+ - If you hit `.git/index.lock`, wait 2-3s and retry. If it persists, STOP and report.
186
+
187
+ ### Pre-write checklist (before every `write` / `edit` call)
188
+ 1. Is the file inside the scope Odin gave me? If not, STOP.
189
+ 2. Has this file changed since I started? (`git diff --name-only <file>`) If yes, STOP — a sibling may have written it.
190
+ 3. Is this a lockfile or root config (`package.json`, `package-lock.json`, `tsconfig.json`, `vite.config.*`, `Dockerfile`, CI)? If yes, only proceed if Odin explicitly assigned it to you.
191
+ 4. Proceed.
192
+
193
+ ### Reporting
194
+ End your final summary with: `Siblings: <list>. Conflicts: <list or "none">. Git ops performed: <list or "none">.`
195
+
172
196
  ---
173
197
 
174
198
  ## Always-On Behavior Baseline
@@ -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: minimax/MiniMax-M2.7
4
+ model: openrouter/minimax-m2.7
5
5
  color: "#06b6d4"
6
6
  permission:
7
7
  read: allow
@@ -156,6 +156,26 @@ When dispatched for a `/pr-review`:
156
156
 
157
157
  You have `gh` access — use it to fetch PR diffs and post comments.
158
158
 
159
+ ## Parallel Execution — Multi-Agent Integration
160
+
161
+ You may run while implementation agents (Thor, Tyr, Heimdall, Vidarr, Mimir, Baldr) are mid-task. Your job is to integrate their work safely.
162
+
163
+ ### Before any write-level git operation (commit, merge, rebase, push, PR)
164
+ 1. Run `git status` and `git diff --stat` to see the working tree state.
165
+ 2. Identify which files are staged/modified and which agent likely owns each (Odin's prompt told you, or infer from `chore:`, `feat(scope):`, file paths).
166
+ 3. If uncommitted work spans multiple agents' scopes, stage deliberately — `git add <specific files>` not `git add .`. Never `git add -A`.
167
+ 4. If `git status` shows work that does NOT match the scope Odin assigned to you, STOP and report — that work belongs to a sibling agent and you must integrate it deliberately, not roll it into your commit.
168
+ 5. If `.git/index.lock` exists, wait 2-3s and retry. If it persists, STOP and report — a sibling is mid-write.
169
+
170
+ ### Commit discipline for parallel work
171
+ - Commit messages should reference contributing agents: `feat(scope): description [co-authored-by: @thor, @tyr]` or use a multi-line body listing the agent contributions.
172
+ - Use a single commit per logical unit. Do NOT batch unrelated agents' work into one mega-commit.
173
+ - Never force-push to a branch a sibling may also be pushing to.
174
+
175
+ ### Conflict handling
176
+ - If a rebase or merge encounters conflicts on a file that was modified by a parallel agent (check the file path against the scope list Odin gave you), STOP and report — that resolution is Odin's call, not yours.
177
+ - If you find `.git/index.lock` held by a sibling (waiting did not help), report the conflict and stop.
178
+
159
179
  ---
160
180
 
161
181
  ## Always-On Behavior Baseline
@@ -127,6 +127,30 @@ Be professional and concise. Do not write long essays for every action.
127
127
  - One sentence of context beats three paragraphs of preamble.
128
128
  - Match the user's register: if they write briefly, reply briefly. If they want depth, they will ask.
129
129
 
130
+ ## Parallel Execution
131
+
132
+ You may be dispatched alongside sibling agents working on the same repository at the same time. The shared `AGENTS.md` baseline contains the universal rules — read those first. This section adds role-specific guidance.
133
+
134
+ ### When Odin tells you about siblings in your prompt
135
+ - You will receive a `## PARALLEL EXECUTION CONTEXT` block listing your siblings and your file scope.
136
+ - Treat your scope as a hard boundary. Files outside your scope are READ-ONLY.
137
+ - If Odin did not give you a scope, default to: write nothing, return a clarifying question to Odin.
138
+
139
+ ### Git — your specific rules
140
+ - ALLOWED: `git status`, `git diff`, `git log`, `git branch --list`, `git add` (scope files only)
141
+ - FORBIDDEN: `git commit`, `git push`, `git merge`, `git rebase`, `git reset`, `git clean`, `git stash`, branch-switching `checkout`, `pull --rebase`
142
+ - If a task seems to require a forbidden operation, report it back to Odin in your final summary — do not improvise. Only @hermod performs write-level git.
143
+ - If you hit `.git/index.lock`, wait 2-3s and retry. If it persists, STOP and report.
144
+
145
+ ### Pre-write checklist (before every `write` / `edit` call)
146
+ 1. Is the file inside the scope Odin gave me? If not, STOP.
147
+ 2. Has this file changed since I started? (`git diff --name-only <file>`) If yes, STOP — a sibling may have written it.
148
+ 3. Is this a lockfile or root config (`package.json`, `package-lock.json`, `tsconfig.json`, `vite.config.*`, `Dockerfile`, CI)? If yes, only proceed if Odin explicitly assigned it to you.
149
+ 4. Proceed.
150
+
151
+ ### Reporting
152
+ End your final summary with: `Siblings: <list>. Conflicts: <list or "none">. Git ops performed: <list or "none">.`
153
+
130
154
  ---
131
155
 
132
156
  ## Always-On Behavior Baseline
@@ -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: minimax/MiniMax-M3
4
+ model: openrouter/minimax-m3
5
5
  color: "#6366f1"
6
6
  permission:
7
7
  task: allow
@@ -53,8 +53,8 @@ When you get ANY request:
53
53
  4. After all return, synthesize the results
54
54
 
55
55
  For implementation work, you have two parallel implementation agents:
56
- - **@thor** (MiniMax-M2.7) — moderate complexity, cheaper
57
- - **@tyr** (MiniMax-M3) — complex work, more expensive
56
+ - **@thor** (OpenRouter minimax-m2.7) — moderate complexity, cheaper
57
+ - **@tyr** (OpenRouter minimax-m3) — complex work, more expensive
58
58
 
59
59
  **ALWAYS use both.** Split each implementation task across them. For example:
60
60
  - Frontend parts → @thor, Backend parts → @tyr
@@ -100,7 +100,7 @@ For deep codebase research, pattern discovery, documentation analysis:
100
100
  ### Simple Tasks & Quick Edits — Route to @heimdall (DeepSeek V4 Flash Free, free)
101
101
  For any simple, mechanical, or deterministic work:
102
102
 
103
- ### Git Operations — Route to @hermod (MiniMax M2.7 via minimax.io)
103
+ ### Git Operations — Route to @hermod (MiniMax M2.7 via OpenRouter)
104
104
  For any git or GitHub workflow:
105
105
  - Committing, pushing, pulling, branching, merging, rebasing
106
106
  - Pull request creation, review, and management
@@ -117,7 +117,7 @@ When the user asks for `@hermod /pr-review` or a PR review:
117
117
  2. @hermod waits for both, synthesizes the review, and posts as a PR comment
118
118
  3. @hermod has write access to post PR comments via `gh pr comment`
119
119
 
120
- ### Design System & Visual Planning — Route to @baldr (MiniMax M2.7 via minimax.io)
120
+ ### Design System & Visual Planning — Route to @baldr (MiniMax M2.7 via OpenRouter)
121
121
  For any task that touches visuals, usability, or design systems:
122
122
  - Creating DESIGN.md files (Google design.md standard — YAML tokens + prose sections)
123
123
  - Auditing visual consistency across a codebase (10-dimension scoring)
@@ -129,7 +129,7 @@ For any task that touches visuals, usability, or design systems:
129
129
 
130
130
  Baldr creates design plans. Baldr does NOT implement code — that goes to @thor or @tyr after the plan is approved.
131
131
 
132
- ### Moderate Complexity — Route to @thor (MiniMax M2.7 via minimax.io)
132
+ ### Moderate Complexity — Route to @thor (MiniMax M2.7 via OpenRouter)
133
133
  For tasks that need more reasoning than DeepSeek but aren't the hardest problems:
134
134
  - Implementing new features of moderate complexity
135
135
  - Debugging non-trivial issues
@@ -137,7 +137,7 @@ For tasks that need more reasoning than DeepSeek but aren't the hardest problems
137
137
  - Writing tests for non-trivial logic
138
138
  - Multi-step tasks that are well-scoped and understood
139
139
 
140
- ### Complex Work — Route to @tyr (MiniMax M3 via minimax.io)
140
+ ### Complex Work — Route to @tyr (MiniMax M3 via OpenRouter)
141
141
  For the most demanding engineering work:
142
142
  - Complex new feature implementation from scratch
143
143
  - Deep debugging of subtle or intermittent bugs
@@ -243,6 +243,51 @@ You MUST use **per-project banks** — never the default bank for project work.
243
243
  - Tag memories with `project:<repo-name>`
244
244
  - Create or update mental models for sustained project context
245
245
 
246
+ ## Parallel Dispatch Coordination
247
+
248
+ When you dispatch 2+ agents in parallel via `task` or `bizar_spawn_background`, each subagent opens its own session but **shares the same working directory and `.git/` directory**. They cannot see each other. Without explicit context they will collide on file writes and git operations.
249
+
250
+ ### Pre-dispatch checklist (MANDATORY before any parallel `task` call)
251
+ - [ ] Each subagent's **file scope is disjoint** — no two agents edit the same file or directory
252
+ - [ ] Lockfiles, `package.json`, root configs, and shared infra files (`tsconfig.json`, `vite.config.*`, `Dockerfile`, CI files) are assigned to ONE agent or marked READ-ONLY for everyone else
253
+ - [ ] You have not assigned any subagent `bash: allow` PLUS a write-level git task in the same batch (Hermod is the only git writer)
254
+ - [ ] You have named each subagent's scope in plain English (e.g. "Thor owns `src/api/`, Tyr owns `src/core/`")
255
+
256
+ ### Sibling-awareness block (PREPEND to every parallel subagent prompt)
257
+
258
+ Every prompt you send to a parallel subagent must start with this block, with the `{...}` placeholders filled in:
259
+
260
+ ```
261
+ ## PARALLEL EXECUTION CONTEXT
262
+
263
+ You are running alongside sibling agents in the same working directory and the same git repository. They cannot see you. You cannot see them. Follow these rules strictly.
264
+
265
+ ### Your siblings (running concurrently)
266
+ - **{sibling_agent_1}** ({sibling_1_scope})
267
+ - **{sibling_agent_2}** ({sibling_2_scope})
268
+ - ... (add lines as needed)
269
+
270
+ ### Your scope (files you MAY create or modify)
271
+ {comma_separated_paths_or_globs}
272
+
273
+ ### Sibling scopes (READ-ONLY for you — do NOT modify, even if you think they need it)
274
+ {comma_separated_paths_or_globs_for_each_sibling}
275
+
276
+ ### Git coordination
277
+ - ALLOWED: `git status`, `git diff`, `git log`, `git branch --list`, `git add` (only for files inside YOUR scope)
278
+ - FORBIDDEN: `git commit`, `git push`, `git merge`, `git rebase`, `git reset`, `git clean`, `git stash`, `git checkout` to switch branches, `git pull --rebase`
279
+ - If you need a forbidden operation, STOP and report back to Odin in your final summary. Only @hermod performs write-level git operations.
280
+ - If you encounter `.git/index.lock` existing, wait briefly and retry — a sibling is mid-write. If it persists, STOP and report.
281
+
282
+ ### Conflict detection
283
+ - Before each `write` or `edit`, if the target file is in a sibling's scope, STOP and report.
284
+ - If a file in your scope has been modified by another agent since you started (check `git diff --name-only` against your starting state), STOP and report — do not overwrite.
285
+ - Use the shared `AGENTS.md` baseline "Parallel Execution Awareness" section for full rules.
286
+ ```
287
+
288
+ ### Sequential fallback
289
+ If you cannot decompose into disjoint file scopes (e.g. the task is genuinely monolithic), do NOT parallelize — dispatch a single agent. Parallelism is a tool, not a religion.
290
+
246
291
  ## Background Agents (Asynchronous Work)
247
292
 
248
293
  When a sub-task can run independently, spawn it as a **background agent** instead of using the synchronous `task` tool. The main conversation continues while the background work progresses.
@@ -261,7 +306,7 @@ Call `bizar_spawn_background` with:
261
306
 
262
307
  - `agent`: the agent name (e.g., "mimir", "thor", "tyr")
263
308
  - `prompt`: what to do (specific, with context)
264
- - `model`: optional, `"<providerID>/<modelID>"` format (e.g., `"minimax/MiniMax-M3"`)
309
+ - `model`: optional, `"<providerID>/<modelID>"` format (e.g., `"openrouter/minimax-m3"`)
265
310
  - `timeoutMs`: optional, default 5 min, max 30 min, min 1s
266
311
 
267
312
  You get an `instanceId` back immediately.
@@ -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: minimax/MiniMax-M2.7
4
+ model: openrouter/minimax-m2.7
5
5
  color: "#22d3ee"
6
6
  permission:
7
7
  read: allow
@@ -1,7 +1,7 @@
1
1
  ---
2
- description: Thor — Handles medium-complexity tasks using MiniMax M2.7 from minimax.io. Strong and reliable, cheaper than Tyr but more capable than Heimdall.
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: minimax/MiniMax-M2.7
4
+ model: openrouter/minimax-m2.7
5
5
  color: "#a855f7"
6
6
  permission:
7
7
  read: allow
@@ -109,6 +109,30 @@ Be professional and concise. Do not write long essays for every action.
109
109
  - One sentence of context beats three paragraphs of preamble.
110
110
  - Match the user's register: if they write briefly, reply briefly. If they want depth, they will ask.
111
111
 
112
+ ## Parallel Execution
113
+
114
+ You may be dispatched alongside sibling agents working on the same repository at the same time. The shared `AGENTS.md` baseline contains the universal rules — read those first. This section adds role-specific guidance.
115
+
116
+ ### When Odin tells you about siblings in your prompt
117
+ - You will receive a `## PARALLEL EXECUTION CONTEXT` block listing your siblings and your file scope.
118
+ - Treat your scope as a hard boundary. Files outside your scope are READ-ONLY.
119
+ - If Odin did not give you a scope, default to: write nothing, return a clarifying question to Odin.
120
+
121
+ ### Git — your specific rules
122
+ - ALLOWED: `git status`, `git diff`, `git log`, `git branch --list`, `git add` (scope files only)
123
+ - FORBIDDEN: `git commit`, `git push`, `git merge`, `git rebase`, `git reset`, `git clean`, `git stash`, branch-switching `checkout`, `pull --rebase`
124
+ - If a task seems to require a forbidden operation, report it back to Odin in your final summary — do not improvise. Only @hermod performs write-level git.
125
+ - If you hit `.git/index.lock`, wait 2-3s and retry. If it persists, STOP and report.
126
+
127
+ ### Pre-write checklist (before every `write` / `edit` call)
128
+ 1. Is the file inside the scope Odin gave me? If not, STOP.
129
+ 2. Has this file changed since I started? (`git diff --name-only <file>`) If yes, STOP — a sibling may have written it.
130
+ 3. Is this a lockfile or root config (`package.json`, `package-lock.json`, `tsconfig.json`, `vite.config.*`, `Dockerfile`, CI)? If yes, only proceed if Odin explicitly assigned it to you.
131
+ 4. Proceed.
132
+
133
+ ### Reporting
134
+ End your final summary with: `Siblings: <list>. Conflicts: <list or "none">. Git ops performed: <list or "none">.`
135
+
112
136
  ---
113
137
 
114
138
  ## Always-On Behavior Baseline