Pluro is a local-first context bridge CLI that lets multiple LLM tools and agentic IDEs share structured context on one machine.
Pluro prioritizes three agentic IDEs as first-class integrations:
- Cursor
- VS Code (GitHub Copilot)
- Antigravity
Current connector commands support this focus directly while still keeping generic profiles for future IDEs and tools.
This repository now includes the first working implementation:
- TypeScript npm package with global CLI target:
pluro - SQLite context store with history tracking
- Optional encryption at rest with OS keychain default and passphrase fallback
- Snapshot export and import with conflict policies (
lww,keep-both) - File adapter profile templates for multi-tool interoperability
- Connector one-shot and watch sync modes for file-based adapters
- MCP stdio server mode for direct MCP client integration
- Local daemon mode with HTTP endpoints (
health, context CRUD, snapshot import/export) - SDK wrapper for app integrations
Global install from npm:
npm install -g pluro-cliRun without global install:
npx pluro-cli --helpLocal development setup:
npm install
npm run build
npm linkAfter linking, use:
pluro --helpThe package exposes pluro, pluro-cli, and pluro-tui command names.
pluro: classic command-oriented CLI (context,snapshot,conversation,connector,daemon)pluro-cli: interactive terminal UI launcherpluro-tui: explicit interactive terminal UI launcher (same UI aspluro-cli)
Running pluro without a subcommand now launches the TUI. Use pluro <command> for command-mode workflows.
The TUI now opens on a dashboard-first landing screen with a card-style console layout inspired by premium terminal products.
Launch the full-screen terminal UI:
pluroor
pluro-cli --ide vscode-copilotEquivalent explicit launcher:
pluro-tui --ide vscode-copilotGlobal keys:
Tab/Shift+Tab: switch panels1/2/3: jump to Dashboard, Transfer, Contextsq: quit
Transfer panel keys:
Up/Down: choose option in current stepEnter: confirm current stepLeft/Rightorb/n: move between stepss: scan selected source workspacer: refresh IDE/workspace/conversation catalogp: cycle conflict policy (keep-both,lww)g: cycle import scope (project,session,global)u: toggle skip unchanged modet: edit comma-separated transfer tags
Transfer flow in the UI:
- Select source IDE detected on your machine.
- Select source workspace.
- Select discovered conversation.
- Select target IDE.
- Select target workspace.
- Confirm inject to transfer into target IDE profile export.
Context panel keys:
g: cycle scope filterr: refresh rowsd: start delete confirmationy/n: confirm or cancel deletion
Add context:
pluro context add "project uses sqlite + daemon" --source vscode-copilot --tag architecture sharedList context:
pluro context listExport snapshot:
pluro snapshot export ./.pluro/snapshot.jsonImport snapshot:
pluro snapshot import ./.pluro/snapshot.json --policy lwwRun daemon:
pluro daemon run --port 43111Check daemon status:
pluro daemon status --port 43111Check connector health through daemon status API:
pluro daemon status --port 43111 --connectors --focus primary --compactShow daemon connector health in a terminal-friendly table:
pluro daemon status --port 43111 --connectors --focus primary --format tableEmit daemon connector health as a one-line summary for scripts:
pluro daemon status --port 43111 --connectors --focus primary --format summaryScan known Cursor conversation roots and index discovered conversations:
pluro conversation scan --ide cursor --format tableList discovered conversations for one IDE:
pluro conversation list --ide cursor --format tableFilter list output by project confidence and source:
pluro conversation list --ide vscode-copilot --project-confidence high --project-source metadataGate CI/scripts by minimum confidence (fails with exit code 1 if any listed conversation is below threshold):
pluro conversation list --ide vscode-copilot --min-project-confidence medium --format summaryBoth scan and list tables now include project confidence (high|medium|low) and fallback project grouping when exact project path cannot be inferred.
Inject one discovered conversation into Pluro store:
pluro conversation inject <conversation-id>Pick from discovered conversations interactively (when no id is passed):
pluro conversation inject --ide cursorPick by index in scripts/non-interactive terminals:
pluro conversation inject --ide cursor --select 1 --format summaryFilter picker candidates by confidence and source:
pluro conversation inject --ide vscode-copilot --project-confidence high --project-source metadata --select 1Gate scan results by minimum confidence (fails with exit code 1 if any discovered conversation is below threshold):
pluro conversation scan --ide cursor --min-project-confidence medium --format summaryInject and immediately export to a target profile adapter (for cross-IDE delivery):
pluro conversation inject <conversation-id> --target-profile vscode-copilot-fileRun MCP stdio server:
pluro daemon mcpRun local MCP conformance checks:
npm run verify:mcpUse pluro daemon mcp as the MCP stdio command in any MCP-capable client.
Add a server definition in your VS Code settings profile that controls MCP servers:
{
"chat.mcp.servers": {
"pluro": {
"command": "pluro",
"args": [
"daemon",
"mcp"
]
}
}
}If your VS Code/Copilot build uses a different MCP settings key, reuse the same command and args.
In Cursor MCP configuration, register:
{
"mcpServers": {
"pluro": {
"command": "pluro",
"args": [
"daemon",
"mcp"
]
}
}
}Any MCP client that supports stdio can use:
{
"name": "pluro",
"transport": "stdio",
"command": "pluro",
"args": [
"daemon",
"mcp"
]
}Bootstrap a Cursor adapter profile:
pluro connector bootstrap --sync-mode file-syncList only primary IDE profiles:
pluro connector list --focus primaryList only primary IDE MCP profiles:
pluro connector list --focus primary --sync-mode mcpCheck primary IDE adapter health at a glance:
pluro connector status --focus primaryRender adapter health as a table:
pluro connector status --focus primary --format tableEmit adapter health as a one-line summary:
pluro connector status --focus primary --format summaryFail CI when connector status has errors:
pluro connector status --focus primary --format summary --fail-on-errorCheck one adapter file explicitly:
pluro connector status <path-to-adapter-json>Run one-shot bidirectional sync:
pluro connector sync <path-to-adapter-json> --direction bidirectionalRun continuous sync watch mode:
pluro connector watch <path-to-adapter-json> --direction bidirectionalTune reliability behavior for active agent loops:
pluro connector watch <path-to-adapter-json> --direction import --max-retries 3 --retry-base-ms 200Watch mode listens for:
- inbound snapshot file writes for import direction
- SQLite
context.dband WAL/SHM sidecar file activity for export direction
If an inbound snapshot is invalid JSON/schema, watch mode retries and then quarantines the bad file under .pluro-invalid (unless --no-quarantine-invalid is set).
--data-dir <path>: root directory for runtime state--db-path <path>: override SQLite file path--passphrase <value>: fallback encryption key material--disable-keychain: skip OS keychain lookup
Environment variable alternative:
PLURO_DISABLE_KEYCHAIN=1disables keychain lookups in headless/CI environments.
context add|get|list|update|deletesnapshot export|importhistoryconversation scan|list|injectconnector list|status|bootstrap|init|sync|watchdaemon run|status|mcp
Daemon connector status endpoint:
GET /connectors/status?focus=primary|all&syncMode=file-sync|mcp&compact=1adapterFilequery param can be repeated to inspect explicit adapter files.
Daemon conversation endpoints:
POST /conversations/scanwith body{ ide, roots?, recursive?, projectPath?, minProjectConfidence?, maxFiles?, maxFileSizeBytes?, includeSessionLogs? }GET /conversations?ide=cursor|vscode-copilot|antigravity&projectPath=<path>&projectConfidence=high|medium|low&projectSource=<source>&minProjectConfidence=high|medium|low&limit=<n>POST /conversations/injectwith body{ conversationId, policy?, skipUnchanged?, scope?, tags?, projectPath? }
Daemon and MCP conversation confidence filtering notes:
minProjectConfidenceis filter mode (rows below the threshold are excluded).- For scan operations,
minProjectConfidencefilters response rows anddiscoveredcount whileindexedDiscoveredkeeps the full indexed total.
Conversation inject picker behavior:
- If
conversationIdis omitted, Pluro can pick from discovered conversations. - Use
--ide,--project-filter, and--limitto narrow picker candidates. - Use
--select <number>for non-interactive shells/automation.
Conversation list CI gating flags:
--fail-on-low-confidenceexits with code1when any listed conversation haslowconfidence.--fail-on-unresolved-projectexits with code1when any listed conversation has no resolvedprojectPath.
Project inference behavior:
high: explicit--projectoverride or project/workspace path found in conversation metadata.medium: inferred from nearby Git root.low: inferred from IDE path markers or workspace-storage fallback grouping.
Status command output formats:
--format json(default)--format tablefor a compact terminal-friendly view--format summaryfor machine-friendly one-line scripting output
Status command failure flags:
--fail-on-errorexits with code1when any errors are detected--fail-on-warningexits with code1when warnings or errors are detected
npm test: build + unit/integration testsnpm run verify:mcp: standalone MCP handshake and tool-call conformance smoke checknpm run verify:ci: CI-equivalent local gate (typecheck,test,verify:mcp)npm run verify:release-tag -- vX.Y.Z: ensure pushed release tag matches package version
Pluro follows Semantic Versioning for public interfaces.
- Patch releases (
x.y.Z) are for fixes and should not intentionally break existing workflows. - Minor releases (
x.Y.z) may add commands, flags, endpoints, and output fields in a backward-compatible way. - Major releases (
X.y.z) may include breaking changes.
Public interface commitments within a major version:
- CLI command names and documented flags.
- Daemon HTTP endpoint paths and documented request/response fields.
- MCP tool names and documented payload fields.
--format summarymachine-readable output remains backward-compatible; new fields may be added.
When possible, breaking removals are preceded by a deprecation notice in release notes before the next major release.
For supported versions and responsible vulnerability reporting, see SECURITY.md.
- Create an npm token in npm account settings with publish permissions and 2FA bypass for publishing.
- For granular tokens, enable package publish permission and bypass package publishing 2FA.
- Otherwise npm publish from GitHub Actions may fail with
E403.
- Add repository secret
NPM_TOKENin GitHub:- GitHub repository Settings -> Secrets and variables -> Actions -> New repository secret
- Name:
NPM_TOKEN - Value: npm token string from step 1
- Ensure package version in
package.jsonmatches your release tag version. - Create and push a semver tag in format
vMAJOR.MINOR.PATCH.
Example:
npm version patch
git push origin main
git push origin --tagsTag push triggers the Release workflow and publishes to npm.
Manual release trigger is also supported, but requires entering the tag input (for example v0.2.1).
GitHub Actions runs the CI gate on push and pull request via .github/workflows/ci.yml. Releases run from tags via .github/workflows/release.yml.
Contribution guide: CONTRIBUTING.md.
src/core: data model, conflict handling, storage, encryption, service layersrc/cli: command-line interfacesrc/daemon: daemon protocol and serversrc/adapters: tool adapter profiles and file-sync helperssrc/sdk: programmatic client wrapper
Pluro is designed so most new IDE/tool integrations start with adapter profiles, not core changes.
Recommended extension pattern:
- Define or update profile templates in
src/adapters/profiles.ts. - Keep profile metadata explicit (
syncMode, inbound/outbound snapshot locations, and notes). - Validate profile health with
pluro connector statusbefore adding new behavior. - Add or update tests under
src/testsfor command routing and integration behavior. - Run
npm run verify:ciandnpm run verify:mcpbefore submitting changes.
- Encryption key resolution order: OS keychain first, then passphrase.
- For environments where keychain is not available, set
PLURO_PASSPHRASEor pass--passphrase. - In CI/headless Linux, set
PLURO_DISABLE_KEYCHAIN=1to avoid keychain provider issues. - File-sync adapters include inbound and outbound snapshot files plus profile notes.
- MCP mode is exposed over stdio so it can be registered in MCP-capable clients.
- Generic and terminal profiles remain available to add new IDEs/tools without breaking core flows.