@polderlabs/bizar 3.9.0 → 3.10.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/install.mjs CHANGED
@@ -395,8 +395,12 @@ async function promptGraphifyInstall() {
395
395
  console.log();
396
396
  sectionHeading('Knowledge Graph (graphify)');
397
397
 
398
- // 1. Detect graphify already installed
399
- const detect = spawnSync('python3', ['-c', 'import graphify; print(graphify.__version__)'], {
398
+ // 1. Detect graphify already installed. Windows users typically have
399
+ // `py` on PATH (the Python launcher) rather than `python3`, so probe
400
+ // the right binary per platform. A failed probe just means we will
401
+ // prompt to install below.
402
+ const pythonBin = process.platform === 'win32' ? 'py' : 'python3';
403
+ const detect = spawnSync(pythonBin, ['-c', 'import graphify; print(graphify.__version__)'], {
400
404
  cwd: process.cwd(),
401
405
  encoding: 'utf8',
402
406
  timeout: 5000,
@@ -408,6 +412,26 @@ async function promptGraphifyInstall() {
408
412
  return;
409
413
  }
410
414
 
415
+ // Install graphify via pip as a fallback when uv is unavailable or the
416
+ // user declined the uv-based install. On Windows, `pip` is often not
417
+ // on PATH, so we invoke it as a `py -m pip` module instead. Returns
418
+ // the spawn result so the caller can log success/failure.
419
+ const installGraphifyWithPip = () => {
420
+ if (process.platform === 'win32') {
421
+ return spawnSync('py', ['-m', 'pip', 'install', 'graphifyy'], {
422
+ stdio: 'inherit',
423
+ timeout: 120000,
424
+ });
425
+ }
426
+ return spawnSync('pip', ['install', 'graphifyy'], {
427
+ stdio: 'inherit',
428
+ timeout: 120000,
429
+ });
430
+ };
431
+ const pipManualHint = process.platform === 'win32'
432
+ ? 'py -m pip install graphifyy'
433
+ : 'pip install graphifyy';
434
+
411
435
  // 2. Non-interactive: print hint and exit
412
436
  if (!stdin.isTTY || !stdout.isTTY) {
413
437
  console.log(chalk.dim(' graphify not detected. Install later with:'));
@@ -469,7 +493,12 @@ async function promptGraphifyInstall() {
469
493
 
470
494
  console.log(' Installing uv...');
471
495
  try {
472
- execSync('curl -LsSf https://astral.sh/uv/install.sh | sh', { stdio: 'inherit', timeout: 60000 });
496
+ if (process.platform === 'win32') {
497
+ // Windows: use the official PowerShell installer
498
+ execSync('powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"', { stdio: 'inherit', timeout: 60000 });
499
+ } else {
500
+ execSync('curl -LsSf https://astral.sh/uv/install.sh | sh', { stdio: 'inherit', timeout: 60000 });
501
+ }
473
502
  } catch (err) {
474
503
  console.log(chalk.red(` uv install failed: ${err.message}`));
475
504
  console.log(chalk.dim(' Install manually from https://docs.astral.sh/uv'));
@@ -480,12 +509,12 @@ async function promptGraphifyInstall() {
480
509
  rl2.close();
481
510
  if (pipAnswer === '' || pipAnswer.startsWith('y')) {
482
511
  console.log(' Installing graphify via pip...');
483
- const result = spawnSync('pip', ['install', 'graphifyy'], { stdio: 'inherit', timeout: 120000 });
512
+ const result = installGraphifyWithPip();
484
513
  if (result.status === 0) {
485
514
  console.log(chalk.green(' graphify installed. Run `bizar graph build` to populate .bizar/graph/.'));
486
515
  } else {
487
516
  console.log(chalk.red(` pip install failed (exit ${result.status}).`));
488
- console.log(chalk.dim(' Install manually: pip install graphifyy'));
517
+ console.log(chalk.dim(` Install manually: ${pipManualHint}`));
489
518
  }
490
519
  } else {
491
520
  console.log(chalk.dim(' Skipped.'));
@@ -513,12 +542,12 @@ async function promptGraphifyInstall() {
513
542
  rl2.close();
514
543
  if (pipAnswer === '' || pipAnswer.startsWith('y')) {
515
544
  console.log(' Installing graphify via pip...');
516
- const result = spawnSync('pip', ['install', 'graphifyy'], { stdio: 'inherit', timeout: 120000 });
545
+ const result = installGraphifyWithPip();
517
546
  if (result.status === 0) {
518
547
  console.log(chalk.green(' graphify installed. Run `bizar graph build` to populate .bizar/graph/.'));
519
548
  } else {
520
549
  console.log(chalk.red(` pip install failed (exit ${result.status}).`));
521
- console.log(chalk.dim(' Install manually: pip install graphifyy'));
550
+ console.log(chalk.dim(` Install manually: ${pipManualHint}`));
522
551
  }
523
552
  } else {
524
553
  console.log(chalk.dim(' Skipped.'));
@@ -578,12 +607,18 @@ export async function runPostInstall() {
578
607
  if (!rtkPresent) {
579
608
  console.log('BizarHarness: installing RTK (token optimizer)...');
580
609
  try {
581
- execSync(
582
- 'curl -fsSL https://raw.githubusercontent.com/rtk-ai/rtk/refs/heads/master/install.sh | sh',
583
- { stdio: 'pipe', timeout: 60000 },
584
- );
585
- execSync('rtk init -g --opencode', { stdio: 'pipe' });
586
- console.log('BizarHarness: RTK installed and configured.');
610
+ if (process.platform === 'win32') {
611
+ // RTK ships a bash-only installer; on Windows the user installs it
612
+ // manually (e.g. `cargo install --git https://github.com/rtk-ai/rtk`).
613
+ console.log('BizarHarness: RTK bash installer does not run on Windows. Install manually from https://github.com/rtk-ai/rtk');
614
+ } else {
615
+ execSync(
616
+ 'curl -fsSL https://raw.githubusercontent.com/rtk-ai/rtk/refs/heads/master/install.sh | sh',
617
+ { stdio: 'pipe', timeout: 60000 },
618
+ );
619
+ execSync('rtk init -g --opencode', { stdio: 'pipe' });
620
+ console.log('BizarHarness: RTK installed and configured.');
621
+ }
587
622
  } catch {
588
623
  console.log('BizarHarness: RTK install failed. Install manually from https://github.com/rtk-ai/rtk');
589
624
  }
@@ -601,13 +636,21 @@ export async function runPostInstall() {
601
636
  if (!semblePresent) {
602
637
  console.log('BizarHarness: installing Semble (code search)...');
603
638
  try {
604
- const hasUv = await detectUv();
605
- if (!hasUv) {
639
+ const hasUv = await detectUv();
640
+ if (!hasUv) {
641
+ if (process.platform === 'win32') {
642
+ // Windows: use the official PowerShell installer
643
+ execSync(
644
+ 'powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"',
645
+ { stdio: 'pipe', timeout: 60000 },
646
+ );
647
+ } else {
606
648
  execSync(
607
649
  'curl -LsSf https://astral.sh/uv/install.sh | sh',
608
650
  { stdio: 'pipe', timeout: 60000 },
609
651
  );
610
652
  }
653
+ }
611
654
  execSync('uv tool install "semble[mcp]"', { stdio: 'pipe', timeout: 60000 });
612
655
  console.log('BizarHarness: Semble installed.');
613
656
  } catch {
package/cli/update.mjs CHANGED
@@ -121,23 +121,30 @@ export function readLivePid(pidFile) {
121
121
  * We treat any successful signal delivery as success; if SIGKILL is
122
122
  * sent, the original process is certainly dead (uncatchable).
123
123
  *
124
+ * Cross-platform note: Node.js 14+ maps `process.kill(pid)` without an
125
+ * explicit signal to the platform-appropriate default (`SIGTERM` on
126
+ * POSIX, `TerminateProcess` on Windows). We drop the signal argument so
127
+ * the same code works on both platforms. For the forced-kill phase on
128
+ * Windows we use `taskkill /F /PID <pid>` because `SIGKILL` is not
129
+ * delivered the same way there.
130
+ *
124
131
  * Exported for testability.
125
132
  */
126
- export function killAndWait(pid, { timeoutMs = 5000, label = 'process' } = {}) {
133
+ export async function killAndWait(pid, { timeoutMs = 5000, label = 'process' } = {}) {
127
134
  if (!pid) return true;
128
135
 
129
- // Phase 1: graceful SIGTERM
136
+ // Phase 1: graceful SIGTERM (or platform default on Windows)
130
137
  let sigtermOk = false;
131
138
  try {
132
- process.kill(pid, 'SIGTERM');
139
+ process.kill(pid);
133
140
  sigtermOk = true;
134
141
  } catch (err) {
135
142
  if (err.code === 'ESRCH') return true; // already dead
136
- console.log(chalk.yellow(` ! could not SIGTERM ${label} (pid ${pid}): ${err.message}`));
143
+ console.log(chalk.yellow(` ! could not signal ${label} (pid ${pid}): ${err.message}`));
137
144
  return false;
138
145
  }
139
146
 
140
- // Best-effort poll for graceful exit. Note: a SIGTERM-handling process
147
+ // Best-effort poll for graceful exit. Note: a signal-handling process
141
148
  // (Express dashboard, Node sleeper) usually exits within ~100ms. We
142
149
  // poll for up to `timeoutMs`; if anything responds to kill -0 it may be
143
150
  // a recycled PID, so we don't treat that as "still our process".
@@ -149,7 +156,7 @@ export function killAndWait(pid, { timeoutMs = 5000, label = 'process' } = {}) {
149
156
  } catch (err) {
150
157
  if (err.code === 'ESRCH') { sawExit = true; break; }
151
158
  }
152
- spawnSync('sleep', ['0.1']);
159
+ await new Promise((resolve) => setTimeout(resolve, 100));
153
160
  }
154
161
 
155
162
  if (sawExit) {
@@ -157,20 +164,26 @@ export function killAndWait(pid, { timeoutMs = 5000, label = 'process' } = {}) {
157
164
  return true;
158
165
  }
159
166
 
160
- // Phase 2: escalate to SIGKILL. Even if `kill -0` still succeeds (PID
161
- // recycled or process truly stuck), SIGKILL is uncatchable and the
162
- // original process — if it was still our PID — is now dead.
167
+ // Phase 2: escalate to forced kill. Even if `kill -0` still succeeds
168
+ // (PID recycled or process truly stuck), SIGKILL is uncatchable and
169
+ // the original process — if it was still our PID — is now dead.
170
+ // On Windows, use `taskkill /F` because POSIX SIGKILL semantics don't
171
+ // exist there.
163
172
  try {
164
- process.kill(pid, 'SIGKILL');
173
+ if (process.platform === 'win32') {
174
+ spawnSync('taskkill', ['/F', '/T', '/PID', String(pid)], { stdio: 'ignore' });
175
+ } else {
176
+ process.kill(pid, 'SIGKILL');
177
+ }
165
178
  if (sigtermOk) {
166
- console.log(chalk.yellow(` ! ${label} (pid ${pid}) did not exit gracefully; sent SIGKILL`));
179
+ console.log(chalk.yellow(` ! ${label} (pid ${pid}) did not exit gracefully; sent forced kill`));
167
180
  }
168
181
  // Brief settle for the kernel.
169
- spawnSync('sleep', ['0.2']);
182
+ await new Promise((resolve) => setTimeout(resolve, 200));
170
183
  return true;
171
184
  } catch (err) {
172
185
  if (err.code === 'ESRCH') return true;
173
- console.log(chalk.red(` ✗ could not SIGKILL ${label} (pid ${pid}): ${err.message}`));
186
+ console.log(chalk.red(` ✗ could not force-kill ${label} (pid ${pid}): ${err.message}`));
174
187
  return false;
175
188
  }
176
189
  }
@@ -272,9 +285,16 @@ function rerunInstallScript() {
272
285
  return { ok: false, message: 'setup rerun failed' };
273
286
  }
274
287
  const installSh = join(pkgRoot, 'install.sh');
275
- if (process.platform === 'win32' || !existsSync(installSh)) {
288
+ if (!existsSync(installSh)) {
276
289
  return { ok: false, message: 'could not locate a compatible setup script to re-run' };
277
290
  }
291
+ if (process.platform === 'win32') {
292
+ // On Windows, the bash install path doesn't apply. The plugin is
293
+ // already installed globally via the npm install
294
+ // (see cli/install.mjs:installPluginFromGlobal).
295
+ console.log(chalk.dim(' Skipping install.sh (Windows uses npm-based plugin install)'));
296
+ return { ok: true, message: 'install.sh skipped on Windows' };
297
+ }
278
298
  console.log(chalk.dim(`\n Re-running install script at ${installSh}...`));
279
299
  const r = spawnSync('bash', [installSh], { stdio: 'inherit' });
280
300
  if (r.status !== 0) {
@@ -349,17 +369,17 @@ async function confirmKill(instances, { assumeYes } = {}) {
349
369
  }
350
370
  }
351
371
 
352
- function killInstances(instances) {
372
+ async function killInstances(instances) {
353
373
  const out = [];
354
374
  if (instances.service) {
355
- const ok = killAndWait(instances.service.pid, { label: 'bizar service' });
375
+ const ok = await killAndWait(instances.service.pid, { label: 'bizar service' });
356
376
  out.push({ name: 'service', ok });
357
377
  if (ok) {
358
378
  try { rmSync(SERVICE_PID_FILE, { force: true }); } catch { /* ignore */ }
359
379
  }
360
380
  }
361
381
  if (instances.dashboard) {
362
- const ok = killAndWait(instances.dashboard.pid, { label: 'bizar-dash' });
382
+ const ok = await killAndWait(instances.dashboard.pid, { label: 'bizar-dash' });
363
383
  out.push({ name: 'dashboard', ok });
364
384
  if (ok) {
365
385
  try { rmSync(DASHBOARD_PID_FILE, { force: true }); } catch { /* ignore */ }
@@ -428,7 +448,7 @@ async function promptForUpdates(forceAll) {
428
448
  choices: [
429
449
  { name: 'opencode (the opencode CLI itself)', value: 'opencode', checked: true },
430
450
  { name: `bizar (${PKG_MAIN})`, value: 'bizar', checked: true },
431
- { name: `bizar-dash (${PKG_DASH}) — web dashboard`, value: 'dash', checked: true },
451
+ { name: `bizar dash (${PKG_DASH}) — web dashboard`, value: 'dash', checked: true },
432
452
  { name: `plugin (${PKG_PLUGIN})`, value: 'plugin', checked: true },
433
453
  ],
434
454
  },
@@ -460,14 +480,14 @@ export async function runUpdate(subargs = []) {
460
480
  process.exit(1);
461
481
  }
462
482
  console.log(chalk.cyan('\n Stopping running instances...'));
463
- const kills = killInstances(instances);
483
+ const kills = await killInstances(instances);
464
484
  for (const k of kills) {
465
485
  const marker = k.ok ? chalk.green('✓') : chalk.red('✗');
466
486
  console.log(` ${marker} ${k.name} stopped`);
467
487
  }
468
488
  // Give the kernel a moment to release any open file handles on the
469
489
  // npm-global directory before npm tries to replace files.
470
- spawnSync('sleep', ['0.5']);
490
+ await new Promise((resolve) => setTimeout(resolve, 500));
471
491
  } else {
472
492
  console.log(chalk.dim(' No running Bizar instances detected.'));
473
493
  }
@@ -565,7 +585,7 @@ export async function runUpdate(subargs = []) {
565
585
  console.log(chalk.green(` ✓ ${res.message}`));
566
586
  } else {
567
587
  console.log(chalk.yellow(` ⚠ ${res.message}`));
568
- console.log(chalk.dim(' Start it manually with `bizar-dash start --bg`.'));
588
+ console.log(chalk.dim(' Start it manually with `bizar dash start --bg`.'));
569
589
  }
570
590
  }
571
591
 
package/config/AGENTS.md CHANGED
@@ -102,6 +102,7 @@ BizarHarness ships always-on coding rules organized by language and concern. All
102
102
  | `rules/python.md` | Python conventions |
103
103
  | `rules/git.md` | Git and commit conventions |
104
104
  | `rules/testing.md` | Test methodology and coverage |
105
+ | `rules/thinking.md` | All agents — concise thinking behavior |
105
106
 
106
107
  ### How to Use
107
108
 
@@ -110,6 +111,10 @@ BizarHarness ships always-on coding rules organized by language and concern. All
110
111
  3. All implementation agents (Heimdall, Thor, Tyr, Vidarr) MUST follow these rules
111
112
  4. Agents MAY propose additions to the rule files when patterns are discovered
112
113
 
114
+ ### Thinking Rule
115
+
116
+ 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
+
113
118
  ---
114
119
 
115
120
  ## Model Routing & Agents
@@ -329,7 +334,7 @@ This section is the single source of truth for every Bizar agent's behavior. It
329
334
  > | `bash_tool` | `bash` |
330
335
  > | `web_search` | `websearch` (opencode built-in) |
331
336
  > | `web_fetch` | `webfetch` (opencode built-in) |
332
- > | `present_files` | not applicable — Bizar delivers files via the dashboard (`bizar-dash/src/server/routes/artifacts.mjs`) or by writing to the workspace |
337
+ > | `present_files` | not applicable — Bizar delivers files via the dashboard (`@polderlabs/bizar-dash/src/server/routes/artifacts.mjs`) or by writing to the workspace |
333
338
  > | `image_search` / `places_*` / `weather_fetch` / `recipe_display_v0` / `fetch_sports_data` / `message_compose_v1` / `recommend_claude_apps` | not available in Bizar — do not assume these exist |
334
339
  > | `search_mcp_registry` / `suggest_connectors` | use the `skills` CLI (`skills add <owner/repo> -s <name>`) to discover and install skills instead |
335
340
  > | `ask_user_input_v0` | Bizar has a `question` tool — same shape, single high-value question |
@@ -184,6 +184,9 @@ You may be dispatched alongside sibling agents working on the same repository at
184
184
  ### Reporting
185
185
  End your final summary with: `Siblings: <list>. Conflicts: <list or "none">. Git ops performed: <list or "none">.`
186
186
 
187
+ ## Thinking style
188
+ Follow `config/rules/thinking.md` strictly. Be precise, concise, and decisive in reasoning. No informal self-talk, no "what if" loops, no mid-thought self-correction.
189
+
187
190
  ---
188
191
 
189
192
  ## Always-On Behavior Baseline
@@ -124,6 +124,9 @@ 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
+ ## Thinking style
128
+ Follow `config/rules/thinking.md` strictly. Be precise, concise, and decisive in reasoning. No informal self-talk, no "what if" loops, no mid-thought self-correction.
129
+
127
130
  ## Parallel Execution
128
131
 
129
132
  You may be invoked alongside other audit agents (parallel reviews of different files) or alongside implementation agents. The shared `AGENTS.md` baseline rules apply.
@@ -111,6 +111,10 @@ The injected message you will see is exactly one of:
111
111
  - `[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.`
112
112
  - An error containing: `Loop protection: 12 identical calls to <tool>. Use task to escalate.`
113
113
 
114
+
115
+ ## Thinking style
116
+ Follow `config/rules/thinking.md` strictly. Be precise, concise, and decisive in reasoning. No informal self-talk, no "what if" loops, no mid-thought self-correction.
117
+
114
118
  ---
115
119
 
116
120
  ## Always-On Behavior Baseline
@@ -169,6 +169,9 @@ 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
+ ## Thinking style
173
+ Follow `config/rules/thinking.md` strictly. Be precise, concise, and decisive in reasoning. No informal self-talk, no "what if" loops, no mid-thought self-correction.
174
+
172
175
  ## Parallel Execution
173
176
 
174
177
  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.
@@ -144,6 +144,9 @@ Be professional and concise. Do not write long essays for every action.
144
144
  - One sentence of context beats three paragraphs of preamble.
145
145
  - Match the user's register: if they write briefly, reply briefly. If they want depth, they will ask.
146
146
 
147
+ ## Thinking style
148
+ Follow `config/rules/thinking.md` strictly. Be precise, concise, and decisive in reasoning. No informal self-talk, no "what if" loops, no mid-thought self-correction.
149
+
147
150
  ## PR Review Mode
148
151
 
149
152
  When dispatched for a `/pr-review`:
@@ -127,6 +127,9 @@ 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
+ ## Thinking style
131
+ Follow `config/rules/thinking.md` strictly. Be precise, concise, and decisive in reasoning. No informal self-talk, no "what if" loops, no mid-thought self-correction.
132
+
130
133
  ## Parallel Execution
131
134
 
132
135
  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.
@@ -90,6 +90,10 @@ The injected message you will see is exactly one of:
90
90
  - `[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.`
91
91
  - An error containing: `Loop protection: 12 identical calls to <tool>. Use task to escalate.`
92
92
 
93
+
94
+ ## Thinking style
95
+ Follow `config/rules/thinking.md` strictly. Be precise, concise, and decisive in reasoning. No informal self-talk, no "what if" loops, no mid-thought self-correction.
96
+
93
97
  ---
94
98
 
95
99
  ## Always-On Behavior Baseline
@@ -50,6 +50,9 @@ If `semble` is not on `$PATH`, use `uvx --from "semble[mcp]" semble` in its plac
50
50
 
51
51
  ---
52
52
 
53
+ ## Thinking style
54
+ Follow `config/rules/thinking.md` strictly. Be precise, concise, and decisive in reasoning. No informal self-talk, no "what if" loops, no mid-thought self-correction.
55
+
53
56
  ## Always-On Behavior Baseline
54
57
 
55
58
  **Follow the global baseline in `config/AGENTS.md` → "General Agent Baseline — Always-On Behavior".** It 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.
@@ -109,6 +109,9 @@ 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
+ ## Thinking style
113
+ Follow `config/rules/thinking.md` strictly. Be precise, concise, and decisive in reasoning. No informal self-talk, no "what if" loops, no mid-thought self-correction.
114
+
112
115
  ## Parallel Execution
113
116
 
114
117
  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.
@@ -108,6 +108,9 @@ Be professional and concise. Do not write long essays for every action.
108
108
  - One sentence of context beats three paragraphs of preamble.
109
109
  - Match the user's register: if they write briefly, reply briefly. If they want depth, they will ask.
110
110
 
111
+ ## Thinking style
112
+ Follow `config/rules/thinking.md` strictly. Be precise, concise, and decisive in reasoning. No informal self-talk, no "what if" loops, no mid-thought self-correction.
113
+
111
114
  ## Parallel Execution
112
115
 
113
116
  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.
@@ -112,6 +112,9 @@ Be professional and concise. Do not write long essays for every action.
112
112
  - One sentence of context beats three paragraphs of preamble.
113
113
  - Match the user's register: if they write briefly, reply briefly. If they want depth, they will ask.
114
114
 
115
+ ## Thinking style
116
+ Follow `config/rules/thinking.md` strictly. Be precise, concise, and decisive in reasoning. No informal self-talk, no "what if" loops, no mid-thought self-correction.
117
+
115
118
  ## Parallel Execution
116
119
 
117
120
  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.
@@ -150,6 +150,9 @@ Be professional and concise. Do not write long essays for every action.
150
150
  - One sentence of context beats three paragraphs of preamble.
151
151
  - Match the user's register: if they write briefly, reply briefly. If they want depth, they will ask.
152
152
 
153
+ ## Thinking style
154
+ Follow `config/rules/thinking.md` strictly. Be precise, concise, and decisive in reasoning. No informal self-talk, no "what if" loops, no mid-thought self-correction.
155
+
153
156
  ---
154
157
 
155
158
  ## Always-On Behavior Baseline
@@ -13,6 +13,6 @@ If the user invoked `/bizar` with arguments, treat them as a request and route a
13
13
  - "dashboard" or "open dashboard" → `/bizar` (no args, will launch the dashboard)
14
14
  - Otherwise: ask one clarifying question
15
15
 
16
- If the user invoked `/bizar` with no arguments, the dashboard is launching in the background. Visit `http://localhost:<port>/` to access it. The plugin's `chat.message` hook spawns `bizar dashboard start` as a detached child process and surfaces the live URL in its response.
16
+ If the user invoked `/bizar` with no arguments, the dashboard is launching in the background. Visit `http://localhost:<port>/` to access it. The plugin's `chat.message` hook spawns `bizar dash start` as a detached child process and surfaces the live URL in its response.
17
17
 
18
- Common ports: 4321 is preferred; if it's taken, the launcher walks upward and picks the next free port. The PID and port are recorded under `~/.config/bizar/dashboard.{pid,port}` so `bizar dashboard stop` and `bizar dashboard status` can find the running instance.
18
+ Common ports: 4321 is preferred; if it's taken, the launcher walks upward and picks the next free port. The PID and port are recorded under `~/.config/bizar/dashboard.{pid,port}` so `bizar dash stop` and `bizar dash status` can find the running instance.