Skip to content

Releases: PythonLuvr/war-room

v0.13.0: brand-mark boardroom seats + agent profiles

17 May 11:17

Choose a tag to compare

Brand-mark boardroom seats + agent profiles system. Every configured agent gets its own seat (was one-per-human via a static TEAM array), seats now render the actual adapter brand mark instead of a generic Sparkles icon, and a new agent_profiles system lets you rename agents, change their logo, and pick a custom accent color.

Install

Download war-room-setup-0.13.0.exe from this release. Uninstall any older version and wipe %APPDATA%\War Room first if you've installed v0.7.0 or earlier. Localhost users can skip the installer entirely (clone + npm install + npm run dev). See README for both paths.

Release notes

[0.13.0] - 2026-05-17

Added

  • Boardroom seats now render the actual adapter brand mark per
    agent
    instead of a generic Sparkles icon. Every configured
    adapter gets its own seat in the room (was previously one
    agent-per-human via the static TEAM array). Seats pull the
    iconUrl + accent color from /api/agents.
  • Per-adapter brand color defaults at
    lib/agents/brand-colors.ts. Claude family = amber, OpenAI
    family = emerald, Gemini family = sky, Grok = rose, Hermes =
    violet, OpenClaw + SemaClaw = fuchsia. Used as the default
    accent unless the user sets a profile override.
  • Agent profiles system for renaming agents + changing their
    logo + changing their accent color:
    • New agent_profiles(adapter_id, display_name, icon_url, accent, updated_at) table.
    • getAgentProfile / getAllAgentProfiles / setAgentProfile / deleteAgentProfile helpers in lib/db.ts.
    • GET / POST / DELETE /api/agent-profiles route.
    • /api/agents GET now returns defaultName, defaultIconUrl,
      defaultAccent alongside the merged effective name,
      iconUrl, accent for every adapter so the UI can show
      "[built-in]" labels and let the user revert with one click.
    • Settings -> Agent now has an "Agent profiles" subsection at
      the top with a collapsible card per configured adapter:
      display-name field, logo gallery (built-in + bundled brand
      marks + paste-a-URL fallback), accent color picker. Reset to
      built-in deletes the override row.

Changed

  • Bundled agent logos at public/agent-logos/ swapped from
    hand-rolled SVG approximations to user-supplied brand images
    (claude.png, openai.jpg, gemini.png, hermes.png, openclaw.png,
    semaclaw.png). Adapter iconUrl paths repointed. The Grok logo
    stays as the placeholder SVG since no replacement was supplied.
  • Chat bubbles now prefer the adapter's brand / user-configured
    accent for color, falling back to the hash-based rotation only
    when neither is available (covers legacy chat history where the
    adapter id no longer exists).

Full notes

See CHANGELOG.md for everything line-by-line.

v0.12.0: roster polish, real pin-message, boardroom defaults

17 May 10:55

Choose a tag to compare

War Room jumps from v0.9.0 to v0.12.0 in one public drop. Four releases consolidated.

Install

Download war-room-setup-0.12.0.exe from this release. Uninstall any older version and wipe %APPDATA%\War Room first if you've installed v0.7.0 or earlier. Localhost users can skip the installer entirely (clone + npm install + npm run dev). See README for both paths.

Release notes

[0.12.0] - 2026-05-17

Changed

  • Right sidebar reordered + rebuilt. Humans now appears above
    Agents (was the other way). The Agents section was rendering only
    the primary agent via find(activeId) and silently dropping the
    rest of the roster; now it iterates every isConfigured adapter
    and renders one row each, with the primary marked by a small
    green primary tag next to the pulse dot. The vestigial
    Pinned placeholder section at the bottom of the sidebar is
    removed (it never wired up; the top-bar Pin button is the real
    surface, see below).
  • Boardroom no longer auto-broadcasts. The PreJoin screen used
    to start a live camera preview and a live mic-level meter the
    moment it mounted, which made opening the dashboard feel like
    being recorded. Both are now explicit opt-in: the camera tile
    starts as a CameraOff placeholder with a Preview camera
    button, and the mic-level meter has a Test mic / Stop test
    toggle. A new Join with mic unmuted checkbox sits alongside
    Join with camera on, both default unchecked. The join button
    reads Join silently when neither is checked, and the
    underlying MeetingContext.join() now mutes the local mic on
    publish when startWithMic is false. End result: opening the
    dashboard never touches the mic or camera until the user
    explicitly asks.

Added

  • Pre-made General category on every fresh Personal server.
    Three starter channels (announcements, decisions,
    knowledge) get seeded under a General group on cold-clone
    installs. Idempotent via a seed.general_v1 settings flag so
    existing installs are left alone and re-running migrations
    doesn't duplicate.
  • Real pin-message functionality end-to-end:
    • New pinned_messages table (channel_id, role, content,
      agent_id, pinned_by, pinned_at, original_created_at). Content
      is copied at pin time so unpinning a deleted message still
      works.
    • pinMessage / unpinMessage / listPinnedMessages helpers
      in lib/db.ts.
    • GET / POST / DELETE /api/pinned route.
    • Hover-only Pin this message button on every chat bubble
      (top-right, group-hover). One click pins; emits a
      war-room:pinned-changed custom event.
    • Top-bar Pin icon in the channel header now opens a popover
      listing every pinned message in the channel (role, content,
      pin date, unpin link on hover). Auto-refreshes on the custom
      event so pinning from a bubble shows up immediately in the
      popover.

[0.11.0] - 2026-05-17

Changed

  • Wizard's "projects" step rebuilt as add-as-you-go. The previous
    design asked the user to point at a single "projects folder"
    whose direct subdirectories would each become a channel. That
    worked for users with a clean container like ~/clients; for
    everyone else (most people), it produced either nothing useful or
    a sidebar full of Downloads, Pictures, etc. Replaced with a
    three-zone screen:
    1. Found on your machine auto-detect list. Scans common roots
      (~/code, ~/projects, ~/clients, ~/dev, ~/Desktop,
      ~/Documents/code, ~/Documents/GitHub, etc.) and surfaces
      any direct subdirectory containing a recognizable marker file
      (.git, package.json, pyproject.toml, Cargo.toml,
      go.mod, Gemfile, pom.xml, build.gradle,
      composer.json, Makefile, CMakeLists.txt). Pre-checked.
    2. Added manually zone for anything the user picked via the
      folder picker that wasn't auto-detected, with a small remove
      button.
    3. Add another folder... button that opens the existing
      native folder picker for projects in non-standard locations
      (D:, OneDrive, anything the auto-detect missed).
  • On wizard finish, each picked project is created as a channel
    (kind: "chat", groupLabel: "Projects", project_path set) in
    the personal server. Duplicate-slug errors from re-runs are
    silently skipped.
  • Zero projects is allowed: the bottom hint reads "no projects
    added yet. Continue with zero and add them later from the
    sidebar." Wizard never blocks on this step.
  • New endpoint GET /api/onboarding/detect-projects returns the
    auto-detect results. Scans are one-level-deep, cheap, no caching.

Removed

  • The "Projects folder (absolute path)" single-field input is gone.
    Old onboarding.workspaceRoot setting still writes (for any code
    that might still want it) but no longer drives auto-discovery in
    the wizard.
  • Workspace verification flow (runCheck, CheckLine, CheckResult
    type) deleted. The new step doesn't need it because picked paths
    are created as channels and confirmed by the user clicking the
    checkbox / picker.

[0.10.0] - 2026-05-17

Changed

  • Onboarding agent step rebuilt as a roster builder. The old wall
    of provider cards is now framed as "your roster" filling up: a
    zone at the top shows added agents as chips, the provider cards
    below let you wire each one (paste a key or point at a CLI),
    filled-in adapters appear immediately as chips up top. When two
    or more are in the roster, each chip carries a small default
    radio so the user picks which one handles unaddressed messages.
    Replaces the previous "fill fields and hope you notice the green
    dot" interaction where selection was conflated with detection.
  • Wizard's Continue button on the agent step now hard-gates on
    roster count >= 1. Disabled state shows a tooltip explaining
    exactly what to do. Prevents users from walking into an empty
    channel with no agent to talk to.
  • Standalone "Default backend" picker removed. The roster's
    per-chip default radio is the single source of truth.

Reframed (the OpenWar repositioning)

  • OpenWar framework and the War Room agent primer are now opt-in,
    default off
    on cold-clone installs. The old default-on assumed
    every user wanted War Room's opinionated behavioral overlay
    prepended to every agent reply. That's wrong for power users who
    already have their own carefully-built system prompt; OpenWar
    is a starter kit, not a universal layer.
  • Wizard agent step grows an "Optional behavior overlays" subsection
    with two explicit checkboxes (both default unchecked):
    • Use the OpenWar framework
    • Teach my agents about War Room (the v0.9.0 primer)
  • Each checkbox has one paragraph of plain copy explaining what it
    does and who it's for. Power users skip both and their existing
    setup runs untouched. Newcomers without their own framework can
    flip one or both on.
  • seedDefaultFramework() deleted. New installs no longer get
    default.framework = "openwar" or default.primer_enabled = "1"
    written automatically. Existing installs preserve whatever value
    they already had (this is purely a cold-clone behavior change).
  • resolvePrimerEnabled() now defaults to false when the setting
    is absent (was true). Aligned with the new opt-in posture.

[0.9.1] - 2026-05-17

Fixed

  • Dashboard sidebar had a hardcoded "Decisions / Announcements /
    Playbook / Tools / References / Clients vault" link group pointing
    at channel ids (s6-decisions, s6-playbook, etc.) that only
    existed in the original developer's local database. On a cold-
    clone install, every one of those buttons hit 404. Worse, the
    labels themselves ("Playbook", "Clients vault") were opinionated
    defaults that don't belong baked into a generic team workspace.
    The whole hardcoded link section is removed; the regular channel
    list in the sidebar already shows whatever channels actually
    exist in the user's database.

Full notes

See CHANGELOG.md for everything line-by-line.

v0.9.0: agent primer + cross-machine sync

16 May 16:52

Choose a tag to compare

War Room jumps from v0.7.3 to v0.9.0 in one drop. Three substantive releases bundled together.

v0.9.0: agent primer system

Every agent invoked in a War Room chat now receives a short MD briefing as the outermost prompt overlay. It teaches them what War Room is, the channel / decision / announcement / knowledge model, and what HTTP endpoints they can call on the user's behalf. This is what turns "Claude in a chat box" into "Claude that can log decisions, post announcements, and add knowledge entries when you ask, and knows when not to ask."

  • New GET /api/war-room/context?channelId=... self-location endpoint returns the server + channel + 10 most recent decisions / announcements / knowledge for that channel.
  • GET/POST /api/primer for reading / writing per-channel + global toggle.
  • Per-channel toggle in the channel-header AgentChip popover (Inherit / On / Off).
  • Default-on for cold-clone installs. Set default.primer_enabled = "0" to default-off across all channels.

v0.8.0: cross-machine sync

Real WebSocket-based sync. Decisions, announcements, and knowledge entries propagate across every War Room install pointed at the same sync server.

  • Wire protocol spec at lib/sync/protocol.ts is the contract. PROTOCOL_VERSION = 1.
  • Reference server at tools/reference-sync-server/ (Node + ws, ~200 lines, AGPL-3.0, PM2-ready, optional shared-token auth). War Room never connects to anything the project hosts. BYO sync server.
  • SYNC.md at the repo root walks through setup, auth, and how to write your own server.
  • Three env vars: WAR_ROOM_SYNC_URL, WAR_ROOM_SYNC_WORKSPACE, WAR_ROOM_SYNC_TOKEN.
  • What syncs: decisions, announcements, knowledge entries. What doesn't: chat messages, Claude sessions, activity feed, channel/server definitions, settings.

v0.7.5: empty-state copy pass

Every channel surface that could sit empty on cold install now uses a mood-mapped WarBit + actionable one-liner via the new <EmptyState> component. First-chat hint above the composer in any empty chat suggests @<agent> what's in <folder>? with a one-click insert.

v0.7.4: cold-install fix on Windows

Fixed the blank Server Components error on first launch. Root cause: @electron/rebuild silently no-opped when its cache thought better-sqlite3 was already built, so the shipped installer carried a binary tagged for Node's NODE_MODULE_VERSION instead of Electron's. Three new gates make the mismatch impossible to ship again.

Install

Download war-room-setup-0.9.0.exe from this release. Uninstall any older version and wipe %APPDATA%\War Room first if you've installed v0.7.0 or earlier.

Full notes

See CHANGELOG.md for the line-item entries on every release.

v0.7.3 - WarBit mood set + wired everywhere

16 May 05:01

Choose a tag to compare

WarBit goes from single mascot to ten-mood curated set. The pixel-art knight now shows up across seven UI surfaces: three error pages plus four warmer states (cold-clone welcome, demo banner, placeholder channels, channel chat empty state).

This is two minor releases collapsed into one tag (v0.7.2 introduced WarBit on error pages, v0.7.3 expands to the mood set and warmer surfaces). Both versions detailed in the CHANGELOG.

What's new

Mood set at public/war-bit/ (10 variants):

File Mood Use on
default.png neutral angry stance generic mascot slot
confused.png frowning 404 page
calm.png slight smile empty-but-OK states
focused.png scowl, locked in runtime error boundary
alert.png crosshair eyes service degraded / approval pending
friendly.png small smile onboarding, OpenWar opt-in
happy.png open smile demo / welcome / success
angry.png full angry stance global error (layout crash)
sleepy.png squinting 'nothing pending' placeholders
done.png smug half-smile Phase 4 completion / task-done

Drop new variants in with a semantic filename and a row in public/war-bit/README.md to extend.

Wired into surfaces:

  • 404 page (app/not-found.tsx) - confused
  • Runtime error (app/error.tsx) - focused
  • Layout crash (app/global-error.tsx) - angry
  • Cold-clone WelcomeBanner - happy (48px, replaces the Sparkles glyph)
  • DemoBanner - happy (20px, left of the demo notice)
  • PlaceholderChannel (approvals + sessions empty states) - sleepy (112px)
  • Channel chat Welcome (empty thread) - friendly (80px)

Copy across all surfaces follows OpenWar voice: "Hit a wall" not "Oh no!"

Generic mascot slot (public/war-bit.png) stays available for any surface that wants WarBit without picking a specific mood.

No functional changes

This is a visual / UX release. No schema changes, no API changes, no behavior changes. Settings, agents, frameworks, demo mode, all unchanged.

Full diff

v0.7.1 - Behavioral framework system + 3 new CLI adapters

16 May 03:59

Choose a tag to compare

Combined release. v0.6, v0.7.0, and v0.7.1 all landed on the dev branch since public's last sync at v0.5.2 yesterday. Shipping as one tag to avoid release-spam.

The headline: War Room now ships OpenWar v0.3.0 as the bundled default framework, with a registry that lets you switch per channel or globally. Plus three new CLI adapters and brand-mark logos across the whole UI.

Behavioral framework system

# Default is OpenWar, enabled out of the box for cold-clone installs.
# Switch per-channel via the channel-header chip, or globally via Settings.
  • OpenWar v0.3.0 vendored at presets/frameworks/openwar.md with a vendor-trace header showing the upstream tag and SHA
  • Framework registry (lib/frameworks.ts): scans presets/frameworks/*.md, exposes listFrameworks(), getFramework(), refreshFrameworkCache()
  • Per-channel override + global default with proper resolution order: channel pin > global default > none
  • Mid-conversation switch modal explains the contract (next turn uses the new framework, existing context stays) and gates on explicit confirmation
  • Graceful degrade: missing-framework toast in chat instead of 500
  • API: GET /api/frameworks (list + default), POST /api/frameworks (set global default or per-channel pin)
  • npm run update-frameworks pulls pinned upstream tags, lints content (em-dashes + sanity patterns), writes to presets/frameworks/. Forker-extensible sanity patterns via WAR_ROOM_FRAMEWORK_SANITY_PATTERNS env var.

Three new CLI adapters

OpenClaw, Hermes (Nous Research), and SemaClaw (midea-ai) join the existing five providers. All three probe via where/which so the green-dot signal in the UI means the binary genuinely exists on PATH, not just that the setting is non-empty.

Total adapter count is now nine: 5 BYOK APIs + 4 CLI bridges, with the same per-channel pin and @mention routing as before.

Brand-mark logos

Every adapter ships with an SVG brand mark in public/agent-logos/. Chat bubbles, boardroom seats, and right-panel agent rows render the right mark per agent. New reusable <AgentAvatar> component handles it. The OpenWar shield logo also ships at public/openwar-logo.svg.

Identity polish

  • Right-click any rail server icon to rename, change icon, or change color (War Room server stays branded)
  • Personal workspace icon auto-derives from your display name (first letter)
  • Display-name and agent-label changes propagate to chat, boardroom, and team-presence rows live (no page reload)
  • Customizable agent label via the wizard's Identity step or Settings -> General

Fixed

  • Packaged Electron installer now includes presets/. The first NSIS build of v0.7.0 was crashing on launch with "Page couldn't load" because the embedded Next server couldn't find framework files. next.config.ts tracing config + electron/after-pack.js copy + robust dir resolution in lib/frameworks.ts fix it.
  • isConfigured() on CLI adapters now genuinely probes binary-on-PATH instead of returning true for any non-empty setting. End to end you now know whether a green dot in the UI means "installed" or just "configured."

Demo polish

The acme-website multi-agent thread now opens with a Phase 0 brief + Confirmation Summary exchange, so the OpenWar framework's gating behavior is visible before the Phase 1 multi-agent execution kicks off. Screenshot-friendly.

Full diff

v0.5.2 - Hotfix: production builds across all platforms

15 May 14:36

Choose a tag to compare

Hotfix. v0.5.1 broke production builds on every OS/Node combination in CI. Cold-clone forkers running npm run build would hit a wall.

What broke

useIdentityVersion (added in v0.5.1) was placed inside lib/team.ts directly. That file is imported by server code (e.g. workspace-color from API routes), so a React hook in there is a Next.js client/server boundary violation. Turbopack production rejects the module with Ecmascript file had an error across every route. Dev mode is more permissive, which masked the issue in npm run dev and npm run demo locally.

Fix

Extracted the hook to a new lib/use-identity-version.ts with the "use client" directive at the top. Re-exported from lib/team.ts so the five existing import sites keep working without code changes.

npm run build  # now passes on Linux, macOS, Windows × Node 20 + 22

No other changes. Dev mode, demo mode, and runtime behavior identical to v0.5.1.

Full diff

v0.5.1 - Demo polish for first-impression screenshots

15 May 13:26

Choose a tag to compare

Patch release that turns npm run demo from a single-user sandbox into a populated multi-operator cockpit. All changes confined to demo seed + demo-mode dashboard overrides. Real installs unaffected.

What's different

Server rail is now six servers instead of three. The War Room, Personal, ACME Co, plus three teammate workspaces (Sara, Mike, Studio). Distinct colors and icons. Each has channels seeded so clicking through never hits empty.

Boardroom now seats 5-6 agents. Claude CLI, Codex CLI, Gemini CLI, plus Anthropic, OpenAI, and Gemini APIs. All show green-dot configured in demo mode without needing the CLIs installed locally.

Multi-agent thread extended from 7 turns to 9, from 2 agents to 4 (Claude → OpenAI → Gemini → Codex). Per-bubble attribution and color coding reads as a real cross-agent collaboration.

War Room dashboard density. New deterministic 7-day activity generator with day-of-week weighting (Mon-Thu busier, weekend trickles) and bell-shaped hour-of-day distribution. ~250 events across 10 projects. Activity-by-day chart, hourly heatmap, top-channels leaderboard, and by-kind pie all read full.

Demo-mode dashboard overrides for KPIs that don't come from the activity table: 8 active clients, 3 pending approvals, 4-of-5 VPS services online (one degraded for color contrast), 3-of-4 team online. Real installs hit the original code paths.

Try it

git clone https://github.com/pythonluvr/war-room.git
cd war-room
npm install
npm run demo

Open http://localhost:3031.

No changes for real users

  • Zero schema changes
  • Zero API breaks
  • Zero behavior changes when WAR_ROOM_DEMO is unset

Full diff

v0.5.0 - Demo mode + test scaffold + zero lint errors

15 May 10:14

Choose a tag to compare

Adoption hardening pass. New npm run demo lets anyone preview a fully populated cockpit before deciding whether to install. Plus a test scaffold, auto-updater cleanup, and a full lint pass.

TL;DR

git clone https://github.com/pythonluvr/war-room.git
cd war-room
npm install
npm run demo

Open http://localhost:3031. You'll see a populated cockpit: three servers, nine channels, three seated agents, a multi-agent conversation. All data is synthetic; demo state lives in ~/.war-room-demo/ and never touches a real install.

Demo mode

  • npm run demo boots Next on :3031 with an isolated demo data dir. Three servers (The War Room, Personal, ACME Co), nine channels across Workspaces / Active projects / Finished projects / Team, three jobs, two decisions, ~24h of varied activity, three seated agents, a seven-turn multi-agent thread that exercises per-(project, adapter) sessions and per-bubble attribution.
  • Amber top banner identifies demo mode and points at dev:blank for a clean start.
  • Stashes your .env.local while running; restores on Ctrl+C.

Test scaffold

  • tests/migration.test.ts (node:test via tsx) exercises legacy-DB upgrade, migration idempotency, and cold-DB seeding.
  • tests/smoke.spec.ts (Playwright) walks the rail and the Settings modal, asserts no 5xx.
  • New .github/workflows/test.yml: Ubuntu + Node 24, typecheck + migration + smoke.
  • npm test runs both locally.

Auto-updater opt-in

The Electron auto-updater is now opt-in by env var. WAR_ROOM_UPDATE_URL unset = updater disabled with a one-line log. The packaged manifest ships a clearly-invalid example.invalid URL so the intent is obvious to anyone inspecting it.

Forkers running the desktop installer no longer see failed update checks.

Bug fixes (caught by the new migration test)

  • Legacy-DB upgrade was broken when migrating from very old schemas. CREATE INDEX idx_user_channels_group was running before server_id existed on the table, throwing SQLITE_ERROR: no such column: server_id. Fixed.
  • claude_sessions rebuild now wraps the table swap in PRAGMA foreign_keys = OFF plus BEGIN/COMMIT plus foreign_key_check per SQLite's ALTER recipe. Foreign keys from chat_messages survive the rebuild.

Lint cleanup

89 problems (61 errors, 28 warnings) across 23 files → 0 errors, 0 warnings. CI lint is now a hard gate again. Highlights:

  • Math.random() in render replaced with module-scope deterministic width arrays
  • Inline component definitions hoisted to module scope
  • setState in useEffect body addressed via React's adjust-state-during-render idiom, lazy initializers, or per-line disables with documented reasons
  • JSX entity escaping, missing exhaustive-deps, unused imports — all addressed

Full diff

v0.4.0 - Multi-agent threads + two-server arch + @mention routing

15 May 08:50

Choose a tag to compare

Minor version bump. Schema migrations are idempotent on fresh clones and existing installs.

Multi-agent threads, for real this time

v0.2.0 shipped 9 backend adapters but they shared one session per project, so two agents in the same channel last-writer-wins on context. v0.4.0 fixes the architecture.

  • Each agent now keeps its own session row and --resume token per project. Talking to Claude in a channel doesn't poison Gemini's context.
  • New agent_id column on chat messages. Assistant bubbles know which adapter wrote them.
  • /api/chat/history returns a canonical merged timeline across every adapter that's spoken in a channel.
  • New stream event { type: 'adapter', adapterId } so the client renders the streaming bubble in the correct agent's color and chip before any text arrives.

Per-channel agent override + @mention routing

  • Every chat channel gets a "Primary AI" chip in the header. Click it to pin a default agent. The pin persists per channel.
  • Pull any other configured agent into a thread by typing @claude, @openai, @gemini, @grok. Mention several in one message and they fire in parallel.
  • Resolution order: explicit backendId (boardroom uses this) > leading @mention > channel pin > global default.
  • Handles strip the -cli/-api suffix. When both CLI and API of the same provider are configured, they disambiguate to @provider.cli / @provider.api.

Multi-agent boardroom seats

The boardroom now enumerates every configured adapter as a first-class seat with its own color, dot, mention handle, and chat bubble identity. Unconfigured adapters show grey; mentioning one returns a clear "binary path or API key not set" system message instead of failing silently.

Two-server architecture

The app now seeds two canonical servers instead of one:

  • The War Room — dashboard-only, aggregates everything cross-server, branded violet ⚔.
  • Personal — carries the System category, static workspaces, and auto-discovered project folders. Branded amber ✦.

Custom user-created servers keep System but no auto-discovery. Neither canonical can be deleted.

Onboarding + welcome banner polish

  • Identity step simplified to two presets (Workspace owner, Teammate) plus free-text display name.
  • Agent picker shows provider rows with inline [CLI] and [API key] pills. Click to configure, auto-saves.
  • 'BYOK' wording dropped everywhere. It's just 'API key' now.
  • Welcome banner: full CTA card on cold-clone, shrinks to a dismissible one-liner after onboarding completes. Dismissal persists.
  • 'Clients folder' renamed 'Projects folder' throughout.

dev:blank robustness

npm run dev:blank no longer EBUSY/EPERMs on Windows when another process holds the better-sqlite3 native binary. Probe-first: spawn a fresh Node subprocess to try requiring it, rebuild only if it fails to load.

Full diff

v0.2.0 - Pluggable AI backends + cold-clone hardening

15 May 05:46

Choose a tag to compare

Headline: War Room is no longer Claude-only.

New: Pluggable AI backend

Pick how War Room talks to AI from the new Agent tab in settings:

CLI bridges (full feature set, tools, files, memory, MCP):

  • claude-cli (Claude Code)
  • codex-cli (OpenAI Codex CLI)
  • gemini-cli (Google Gemini CLI)
  • custom-cli (any binary with your own args template)

BYOK direct APIs (chat-only, stateless):

  • anthropic-api, openai-api, gemini-api, grok-api
  • openai-compat-api covers OpenRouter, Groq, Together, Mistral, DeepSeek, local Ollama, and anything OpenAI Chat-Completions-shaped

API keys can be set via env vars or in the settings UI. Keys are masked on read so re-saving doesn't clobber existing values.

Cold-clone first-run hardening

Fresh git clone && npm install && npm run dev no longer surfaces broken edges:

  • home channel now exists on every server (was War-Room-only). No more /c/home 404.
  • activity table created in DB migrate(). /api/dashboard no longer 500s on a fresh DB.
  • recentActivity() defensively returns [] on query failure.
  • New WelcomeBanner surfaces a "do this first" CTA when onboarding is incomplete or no agent backend is configured.
  • New war-room:open-settings event lets any component surface the settings modal on a specific tab.

Empty-state pass

Every blank screen now explains itself and suggests a next click:

  • Approvals, Sessions, Boardroom voice-offline notice, channel chat with no projectPath, right panel agents, dashboard header

Hygiene

  • All hardcoded team-specific strings stripped from UI components
  • Onboarding identity step replaced with generic Workspace owner / Teammate / Custom roles plus free-text display name
  • lib/claude-session.ts deleted (logic now in lib/agents/claude-cli.ts)

Developer ergonomics

  • npm run dev:blank spins up dev on port 3030 with a fresh temp WAR_ROOM_DATA_DIR and your .env.local stashed out of the way. Auto-rebuilds better-sqlite3 if the ABI drifted. Ctrl+C restores everything. Preview the true cold-clone experience without destroying your state.

Full diff