You work across multiple AI orchestrators β Claude Code, Gemini CLI, and OpenClaw.
Each one is its own universe.
You build an agent in Gemini CLI.
You open Claude Code.
It knows nothing about it.
You configure an MCP in Claude Code.
You open Codex.
Gone.
You write a skill, a command, a cron job β in one tool.
Every other tool: blank slate.
There is no shared layer. Every orchestrator hoards what lives inside it.
You end up copy-pasting configs, duplicating agent definitions, and maintaining the same thing in five places β and the moment one changes, everything else is out of date.
Wasla syncs assets across orchestrators from the CLI. Helper skill registration is optional.
When sync is triggered β manually (sync) or continuously (watch) β Wasla:
- Scans the known config directories of every supported orchestrator on your machine
(~/.claude/,~/.gemini/,~/.openclaw/) - Discovers all agents and MCPs β wherever they were originally created
- Mirrors the full content into every other tool's equivalent directory using the "Latest is Greatest" strategy.
- No more duplication. Whichever tool you used most recently to edit the asset becomes the source of truth for the next sync.
Full content mirroring. No complex imports. No duplication.
Just seamless synchronization that lets each tool use what the other built.
Say you create an agent inside Gemini CLI:
~/.gemini/agents/researcher.md β original, owned by Gemini
After wasla setup gemini --scope user, Wasla writes mirrored content into the new provider:
~/.claude/agents/researcher.md β stub, written by Wasla
~/.codex/agents/researcher.md β stub, written by Wasla
~/.openclaw/agents/researcher.md β stub, written by Wasla
Each stub contains only the minimum that native tool needs to load the original:
---
# researcher
wasla_ref: ~/.gemini/agents/researcher.md
origin: gemini
---
Refer to source definition at ~/.gemini/agents/researcher.mdClaude Code reads its stub β loads the Gemini original β agent is live.
Zero bytes duplicated. Zero maintenance.
The same pattern applies across every asset type:
~/.gemini/agents/ β stubs written to .claude .codex .openclaw .hermes
~/.claude/mcp/ β stubs written to .gemini .codex .openclaw .hermes
~/.codex/skills/ β stubs written to .claude .gemini .openclaw .hermes
~/.openclaw/commands/ β stubs written to .claude .gemini .codex .hermes
~/.hermes/crons/ β stubs written to .claude .gemini .codex .openclaw
Source of truth = the tool that created it first. Always. Forever.
| Asset | Scanned From | Synced To |
|---|---|---|
| Agents / Sub-agents | ~/.{tool}/agents/ |
All other tools' agent dirs |
| MCP Servers | ~/.{tool}/mcp/ |
All other tools' MCP configs |
Install globally:
npm i -g @untitled-devs/wasla
wasla setup gemini --scope workspaceUse workspace for the current project or user for assets shared across projects.
Or run via npx (no global installation required):
npx @untitled-devs/wasla setup gemini --scope workspaceOptional helper registration:
wasla install-skill --scope workspaceinstall-skill detects supported orchestrators and adds the Wasla helper skill inside each one.
Use wasla install-skill --to claude (or comma-separated targets) to install only specific providers.
# Provision a provider and hydrate it with the latest assets
wasla setup gemini --scope workspace
# Keep syncing while you work
wasla watch --scope workspace
# Open the visualizer dashboard
wasla visualizer --scope workspace
# Optional: install helper skill in all detected providers
wasla install-skill --scope workspace
# Optional: install helper skill in specific providers only
wasla install-skill --to claude,gemini --scope workspaceYou can also run without global install:
# Set up Gemini in the current workspace
npx @untitled-devs/wasla setup gemini --scope workspace
# Open visualizer
npx @untitled-devs/wasla visualizer# Build + set up Gemini in workspace scope
npm run setup:gemini
# Build + run watch and choose a scope when prompted
npm run watchUse npm run ... while developing because it runs your local code (dist) after build.
If you run through npm run ... in this repo: No reinstall needed. Just run the script again; it rebuilds.
If you installed globally with npm i -g @untitled-devs/wasla: Yes, reinstall (or relink) to test your latest local changes.
For local development without repeated global installs:
npm link
wasla setup gemini --scope workspaceThen after code changes, run npm run build (or any script that builds) and use wasla again.
wasla setup gemini --scope workspaceπ Scanning ~/.claude/ β 3 agents, 2 MCPs, 4 commands
π Scanning ~/.gemini/ β 5 agents, 1 MCP, 2 skills
π Scanning ~/.codex/ β 1 agent, 3 commands
π Scanning ~/.openclaw/ β 2 agents, 2 crons
π Scanning ~/.hermes/ β 1 agent, 1 skill
β Stubs written to ~/.claude/ β 6 new references
β Stubs written to ~/.gemini/ β 4 new references
β Stubs written to ~/.codex/ β 7 new references
β Stubs written to ~/.openclaw/ β 5 new references
β Stubs written to ~/.hermes/ β 8 new references
β¨ Sync complete β 30 cross-references written, 0 files duplicated
wasla watch is the background sync process. It watches for file changes across all tool directories while the command is running.
[watch starts] β Wasla process launched
[File changes] β Wasla detects change and syncs immediately
[watch stops] β Wasla process exits cleanly
π Wasla active (session: Claude Code)
Monitoring: ~/.claude ~/.gemini ~/.codex ~/.openclaw
[14:32:01] New agent detected β ~/.gemini/agents/planner.md
[14:32:01] Syncing stubs β .claude β .codex β .openclaw β
[15:10:44] Agent updated β ~/.claude/agents/researcher.md (Latest is Greatest)
[15:10:44] Syncing stubs β .gemini β .codex β .openclaw β
No restart. No manual trigger. The moment something changes β it's everywhere.
Pass a scope to each operational command. If omitted in an interactive terminal, Wasla prompts.
# Provision Gemini from the current project workspace
wasla setup gemini --scope workspace
# Keep user-level providers synchronized across projects
wasla watch --scope userWasla does not persist an active scope preference.
wasla status --scope workspaceASSET TYPE ORIGIN SYNCED TO
researcher agent gemini claude β codex β openclaw β hermes β
planner agent claude gemini β codex β openclaw β hermes β
notion-mcp mcp claude gemini β codex β openclaw β
web-scraper skill codex claude β gemini β openclaw β hermes β
daily-standup cron gemini claude β codex β
review-pr command openclaw claude β gemini β codex β hermes β
| Tool | Auto-detect | Scan | Sync | Skill Install | Daemon |
|---|---|---|---|---|---|
| Claude Code | β | β | β | β | β |
| Gemini CLI | β | β | β | β | β |
| OpenAI Codex CLI | β | β | β | β | β |
| OpenClaw | β | β | β | β | β |
| Hermes | π§ | π§ | π§ | π§ | π§ |
| Custom / BYO | π§ | π§ | π§ | π§ | π§ |
| Tool | Auto-detect | Scan | Sync | Skill Install | Daemon |
|---|---|---|---|---|---|
| Cursor | π | π | π | π | π |
| GitHub Copilot | π | π | π | π | π |
β Supported Β Β·Β π Planned Β Β·Β π§ Custom adapter required
Adding a new tool? See Writing an Adapter.
Wasla keeps its own state separately from all orchestrators. Each command selects its scope explicitly:
User-level (available across all your projects):
~/.wasla/
βββ registry.json β user-scope assets and stub locations
Workspace-level (scoped to current project only):
.wasla/
βββ registry.json β workspace-scope assets and stub locations
Select scope per command:
wasla setup gemini --scope workspace
wasla watch --scope userWasla respects the zero-friction promise: your agents live where they were born. You don't need to learn a new canonical location on day one.
But over time, Wasla offers a path toward centralization β for portability, backup, and eventually team sharing.
Day 1 β Agents live in ~/.claude/, ~/.gemini/, ~/.codex/
Wasla syncs them via stubs. You don't change anything.
Over time β You discover agents scattered across 5 tool directories.
You run: wasla migrate researcher --to ~/.wasla/
Now researcher lives in ~/.wasla/ and stubs point there.
Later β All your agents are in ~/.wasla/.
Backup is: wasla export
New machine is: wasla import backup.tar
Commands:
wasla status # see where every asset lives today
wasla migrate <name> --to ~/.wasla/ # optionally move an asset to central location
wasla export # bundle everything for backup or new machine
wasla import backup.tar # restore on a new machineNothing is forced. Centralization is a convenience, not a requirement.
wasla/
βββ apps/
β βββ cli/src/ # CLI commands and visualizer server
β βββ visualizer/src/ # React visualizer
βββ packages/
β βββ adapters/src/ # Per-tool directory knowledge + stub format
β βββ core/src/ # Registry, scanner, and shared types
β βββ shared/src/ # Shared config, filesystem, and path helpers
β βββ sync/src/ # Sync orchestration and filesystem watcher
βββ tests/
βββ scripts/
βββ docs/
βββ package.json
βββ README.md
Wasla (ΩΨ΅ΩΨ©) is Arabic for connection β the act of joining what was always separate.
Your agents live where they were born.
Your tools see everything.
Nothing is ever duplicated.
git clone https://github.com/The-Untitled-Org/wasla
cd wasla
npm install
npm run visualizer:install
npm run devMIT Β© The Untitled Org
Your agents live where they were born.
Wasla makes sure every tool can find them.
β Star this repo if you are tired of copy-pasting the same config into five different tools.
