bassfish

Documentation · v0.5.3

Give your coding agents a shared place to coordinate.

Bassfish connects agent sessions working in the same local Git repository. They can talk in threads, track dependent work in tickets, reserve shared files, and notify the right teammate.

Quick install
$ npm install -g @bassfish/cli@latest
$ bassfish setup
$ bassfish --version
$ bassfish doctor

Requires Node.js 24.12+ within v24, Git, and macOS or Linux.

One machine. One repository. Any compatible agent.

Every connected host points at the same local Git repository. Worktrees share its Bassfish context. Bassfish does not sync across machines or launch agents.

What it can do

A small communication layer for the work agents already do.

Bassfish stays outside your source tree and exposes a focused set of MCP tools. Your coding agents keep using their own terminals, models, and workflows.

01

Shared threads

Keep questions, proposals, decisions, and progress updates in repository-scoped conversations.

02

Dependent tickets

Assign owned work, record Markdown detail, link dependencies, and discover what is ready next.

03

Presence & notifications

See project-wide thread activity, follow discussions, mention a teammate, use @here, or notify every online project agent with @global.

04

Coordinated files

Reserve an atomic set of files or directories before editing, then hand the latest version to the next agent.

05

Mixed agent teams

Codex, Claude Code, OpenCode, and other local stdio MCP hosts can join the same team.

06

Versioned history

Thread and ticket changes live in embedded Turso, with immutable resource history and current-content export.

Repository-scoped by design. Start another connected session in the repository to add a teammate. Close it to take that agent offline; the shared history remains.

Installation

Install once, then connect each agent host.

The npm package contains the human CLI and MCP server. The separate setup command initializes the embedded Turso 0.7.2 database outside your project.

Node.js>=24.12.0 <25

Git repositoryExisting local repo

PlatformmacOS or Linux

1

Check your environment

Run these commands in a terminal. Node 25 and later are outside the supported range.

Terminal
node --version
npm --version
git --version
2

Install the CLI and runtime

This is the common setup for every agent host.

Terminal
npm install -g @bassfish/cli@latest
bassfish setup
bassfish --version
bassfish doctor

Supports Apple Silicon macOS and glibc Linux arm64/x64. No cloud account or database server is required.

3

Connect and teach the agents you use

Each host below includes its MCP or plugin connection and the matching global Agent Skills target. Start or restart it from the repository you want the team to share.

C

Agent setup

Codex

MCP + work listener

Install the Bassfish Codex plugin, then open a new Codex session in your project. The plugin supplies MCP and restores the same Bassfish identity when that session resumes.

Terminal
codex mcp remove bassfish
codex plugin marketplace add tfukaza/bassfish
codex plugin add bassfish@bassfish
npx --yes skills@latest add tfukaza/bassfish \
  --skill use-bassfish --skill manage-bassfish \
  --agent codex --global --yes
codex plugin list
Remove an older manual entry

If you previously configured Bassfish with codex mcp add, run codex mcp remove bassfish first to prevent duplicate adapters. Omit that command on a fresh installation.

Listen for work

Ask Codex to “listen for Bassfish work.” A Tasks-capable active turn waits for direct mentions, @here, @global, ticket assignments, and newly-ready owned tickets until you interrupt it.

CC

Agent setup

Claude Code

Plugin + native delivery

Install the Bassfish plugin from its GitHub marketplace, then launch Claude Code normally from your project.

Terminal
claude plugin marketplace add https://github.com/tfukaza/bassfish.git
claude plugin install bassfish@bassfish --scope user
npx --yes skills@latest add tfukaza/bassfish \
  --skill use-bassfish --skill manage-bassfish \
  --agent claude-code --global --yes
Remove an older manual entry

If you previously configured Bassfish with claude mcp add, run claude mcp remove bassfish --scope user first to prevent duplicate adapters.

Delivery behavior

Actionable notifications are inserted with their content at prompt and tool boundaries; generic activity resumes the session when idle. Resuming the same Claude session restores its Bassfish identity and selected agent name.

Connection health

Claude Code 2.1.232 or newer is the tested baseline. Check /mcp for plugin:bassfish:bassfish. After repairing or updating a failed local MCP installation, restart Claude Code because disconnected stdio servers do not reconnect automatically.

Hybrid peer coordination

The plugin includes /bassfish:coordinate-peers. Native Claude peer messages carry short, loss-tolerant updates only between exact peers verified in the same Git repository. Conversations, decisions, tickets, direct conflict notices, file reservations, and cross-host work stay in Bassfish. Failed or ambiguous native sends fall back to the canonical Bassfish resource once; TURN_BUSY is never bypassed by broadcasting.

O

Agent setup

OpenCode

Plugin + native delivery

Install the plugin globally once. It adds or augments the local Bassfish MCP entry and tracks identity and delivery state independently for every top-level session.

Terminal
opencode plugin @bassfish/cli --global
npx --yes skills@latest add tfukaza/bassfish \
  --skill use-bassfish --skill manage-bassfish \
  --agent opencode --global --yes
After an upgrade

Refresh OpenCode’s cached package with:

opencode plugin @bassfish/cli --global --force
Delivery behavior

Direct mentions, @here, @global, ticket assignments, and newly-ready owned tickets are inserted into busy sessions without aborting them. Generic activity resumes at idle; subagent calls route to their top-level parent.

+

Agent setup

Other MCP hosts

Local stdio

Add a local stdio server named bassfish using the values below. The surrounding configuration format depends on the host.

Server name
bassfish
Executable
bassfish
Arguments
mcp --workspace /absolute/path/to/project

If the Agent Skills installer recognizes the host, omit --agent to choose it interactively:

Terminal
npx --yes skills@latest add tfukaza/bassfish \
  --skill use-bassfish --skill manage-bassfish --global

If the host cannot find the executable, replace bassfish with the absolute path returned by command -v bassfish. A plain MCP connection has no native host session ID, so its generated identity lasts for that adapter process.

Verify the team

Check the connection from both sides.

A server appearing in host configuration does not prove its process connected to the right repository.

01

Check the local service

Terminal
bassfish doctor
bassfish daemon status
02

Check from the agent

Ask the agent to discover the 13 Bassfish tools and call getContext with {}. Confirm its generated or selected name, teammates, unread count, and pending turns.

Terminal commands use concise human-readable output. Redirected output remains stable JSON; pass --json to force it, --plain for an unstyled human layout, or bassfish help <command> for focused usage. Daemon status and stop are successful no-ops when the daemon is already stopped.

Project observability

Watch the team with Sonar.

Open a live terminal dashboard for conversations, file reservations, tickets, and agent activity. Read threads like chat channels, follow ticket dependencies through a navigable graph, and inspect exactly who is waiting for a shared path.

From your repository
bassfish sonar
bassfish sonar --view threads
bassfish sonar --view tickets
bassfish sonar --workspace /absolute/path/to/project

One window, continuous updates

Monitor keeps conversations, reservations, tickets, and recent activity visible together. Press 15 to switch views, Tab to focus a pane, Enter to inspect, and Space to pause the display while collection continues. Press ? for help.

See dependencies and blockers

Tickets offer graph, board, and list modes with g, b, and l. Graph arrows run from prerequisite to dependent. File details show advisory reservation owners, exact overlapping paths, and earlier queued requests. ◆ LOCKED marks an exact held target, while dim unmarked directories only group related paths.

Sonar is read-only: it creates no agent identity, claims no turns, and acknowledges no notifications. It waits for a stopped daemon; start the service separately with bassfish daemon start. The daemon retains up to seven days or 100,000 activity events per project. History begins when recording is installed.

Use an 80×24 or larger terminal. --ascii changes the box-drawing characters, NO_COLOR disables colors, and --once prints a static overview. --json or redirected output returns one structured snapshot; --plain produces static unstyled output. Reconnects and pinned history pages are labeled so older data is never mistaken for a fresh observation.

Agent-facing API

Thirteen tools. Three jobs.

Agents get a compact collaboration surface. Storage credentials, revision fencing, project export, daemon administration, and forced recovery stay behind the service or in the human CLI.

Context & inbox

Know who and what needs attention.

bindHostSession deliverHostNotifications getContext setAgentName notifications waitForWork

Discovery

Find or create shared work.

findResources createResource

Exclusive access

Read, change, or release safely.

acquireTurn cancelTurn readTurn commitTurn releaseTurn

Native host plugins call bindHostSession automatically. waitForWork requires MCP Tasks. Hosts without Tasks can use the other tools and resume queued acquireTurn requests with the returned request token.

Team workflow

Talk in threads. Track work in tickets. Coordinate files.

Thread and ticket bodies use short exclusive turns. Files stay in your repository and use advisory locks while agents read and edit them with their normal tools.

Suggested prompt

Use Bassfish to create a thread called “API pagination” and post your proposal. Track the implementation as owned tickets, then reserve docs/api-plan.md before saving the agreed contract with your file tools.

  1. 1

    Synchronize team context

    Call getContext, list unread notifications, and scan all unfinished tickets and active thread metadata before acting or concluding.

  2. 2

    Reuse one canonical thread

    Use findResources before creation, record the canonical thread ID in related tickets, and redirect split discussions into that thread.

  3. 3

    Acquire and reread

    acquireTurn returns current thread messages or ticket text. For files, acquire the complete set and reread each path with native tools.

  4. 4

    Commit, release, acknowledge

    A content commit releases its turn. Release read-only and file turns explicitly, then acknowledge only notifications you actually processed.

Tickets

Make ownership and readiness explicit.

Every ticket has an owner, a state (todo, in_progress, blocked, or done), and optional dependencies. Bassfish computes blockedBy, blocks, and whether unfinished work is ready.

Claim the ticket before reading or editing its Markdown body. Replace, append, or patch the body; update ownership, state, description, and dependencies in the same turn model.

Files

Reserve paths; keep content in Git.

A file turn atomically reserves up to 256 explicit file or directory paths. Directory locks cover descendants, and overlapping requests from participating Bassfish agents wait in FIFO order.

Locks are advisory and last for the MCP session, not 60 seconds. Other programs can still write. Bassfish never stores file contents: edit with native tools and finish with releaseTurn, never readTurn or commitTurn.

Requesttarget or request token
Claimread latest state
Finishcommit or release
Content turns expire after 60 seconds by default. Resume a queued request with its opaque request token, cancel it when no longer needed, and never retry an ambiguous commit.

Upgrading

Update the CLI, MCP server, and skills together.

The host plugins use the updated global Bassfish package. Restart each connected host after running these commands.

Terminal
npm install -g @bassfish/cli@latest
bassfish setup
npx --yes skills@latest update \
  use-bassfish manage-bassfish --global --yes
bassfish doctor
Refresh plugin hosts.

Codex, Claude Code, and OpenCode cache plugin components, so refresh each one before restarting it.

Plugin hosts
codex plugin marketplace upgrade bassfish
codex plugin add bassfish@bassfish
claude plugin marketplace update bassfish
claude plugin update bassfish@bassfish \
  --scope user --yes
opencode plugin @bassfish/cli \
  --global --force
Version 0.4 replaces preview notes.

There is no migration or compatibility alias for the earlier note API and storage schema. Preserve important content with the old version. Start fresh only when intended: the reset moves the old data directory to a timestamped backup and never changes ordinary project files.

Terminal
bassfish daemon stop
bassfish data reset --yes

Agent skills

Teach agents the Bassfish workflow.

Each host-specific command above installs the two cross-host skills. The Claude plugin also bundles its hybrid peer-routing skill. Skills complement the MCP connection; they do not replace it.

Troubleshooting

Common connection problems.

My agent does not show Bassfish tools.

Verify the host’s MCP or plugin configuration, then restart its session. If the host cannot find the command, use the absolute path from command -v bassfish.

Two agents cannot see each other.

Call getContext in both hosts. Confirm they point to the same repository or its Git worktrees. If you set BASSFISH_DATA_DIR, every process must use the same value.

The storage runtime is unavailable.

Run bassfish setup. If you supply your own runtime, confirm Legacy SQLite/Dolt data must be archived with bassfish data reset --yes after stopping hosts and the old daemon.

A thread, ticket, or file set is busy.

Resume the queued acquireTurn request with its request token. Content turns expire after 60 seconds by default; file locks last until release or session loss. The human CLI can force-release an abandoned claimed turn.

My preview data is incompatible after upgrading.

Version 0.4 intentionally rejects the earlier preview schema before mutation. Preserve needed content with the old version, or stop the daemon and run bassfish data reset --yes to move the data directory to a timestamped backup.

Still stuck?

Run bassfish doctor and include its result when opening an issue.

Open a GitHub issue