ragbaz-frog is the workspace coordination toolkit for /data/src.
It keeps human-readable rules in files and shared machine-readable coordination
state in /data/src/AGENTS.db.
Two other repos in this workspace sit near frog's territory. Neither replaces it today; read this before assuming either one does.
- WeftMark is a prospective successor to
frog's task/lock/coordination domain specifically — not a fork, not a
rewrite of frog's code. Its own README carries a "From Frog to WeftMark"
table naming the transition explicitly: frog's tasks/deps/claims become
WeftMark's Change Sets, frog's file/repo locks become file and
semantic/contract scopes, frog's event log becomes an immutable evidence
ledger, and so on — frog's lessons made first-class, not thrown away.
WeftMark is still
prototype(its ownragbaz.component.jsonsays so) and has no repo/build/scan/discovery layer at all — it starts from evidence and handoff semantics, not from "find and index every repo." Practical answer: use frog for anything repo/task/lock/build/discovery today. WeftMark is worth watching, not switching to, until it grows that ground floor. - Sylvae is unrelated in scope, not a
coordination tool at all — a portable skill runner that executes a
SKILL.mdagainst a chosen backend (Ollama, Claude Code, Codex, OpenCode, or the Anthropic API directly) and logs every run as an evidence record. Complementary layer, not competing: frog decides what work exists and who's doing it; Sylvae is one way a cheap-tier model could actually execute a well-scoped piece of it. Nothing wires them together today (Sylvae's own docs don't mention frog), but frog's MCP tool surface and Sylvae's MCP server (sylvae mcp, toolssylvae_list_skills/sylvae_run_skill) are both real integration points if that's ever worth building.
PLAN.md tracks everything actually committed and shipped — Phase 0
through Phase II are all closed there; there is no open Phase III entry in
it right now, so treat anything below as informed extrapolation, not a
roadmap promise:
- WeftMark absorbing the task/lock/evidence domain is the most concrete forward signal on file (see above) — not a frog initiative, but the reason not to over-invest in frog's own evidence/scope model growing much further past where it is today.
- Hardening the surface every other product actually calls. This
review (2026-08-25) found and fixed two bugs that were reachable by any
caller of
frog repo discover— including WeftMark or Sylvae sessions, or anyone else'sfrog_repo_discoverMCP call, not just a human running the CLI: a dead.git-detection code path that made manifest-less repos invisible to discovery, and one malformed manifest anywhere under the scanned root aborting discovery for the entire remaining workspace. Neither was theoretical — both were live, reproducible against this actual workspace. The general lesson (audit every MCP-exposed code path for "what happens when a peer product hands this something malformed or unexpected," not just "does the happy path work") is the kind of pass worth repeating periodically, not a one-time fix. frog repo discover's self-registration gap. Discovering a repo by passing its own path as--rootnow works (the.gitfix above), but there's no single obvious command a new repo's owner runs once to register-and-forget —frog repo discover --root <path>is the answer, but it's not documented as the onboarding step anywhere prominent. Worth afrog new-adjacent affordance or a README callout, not solved here.
/data/src/ragbaz-frog/bin/frog
The frog command is human-facing by default and supports --json for
structured output. It is intended to be suitable for placement on PATH.
On first run, frog bootstraps a local config at
~/.config/ragbaz-frog/frog.json with a default local workspace root inferred
from the installed tree.
Strict grammar: frog <command> <subcommand> [args]. No positional
guessing — there is no bare frog <repo> <action> or frog <action>
shorthand. A repo is always addressed under frog repo ….
frog db migrate/frog db schema— AGENTS.db schema (wasfrog init …)frog new NAME— scaffold a repo/draft (was the overloadedfrog init NAME)frog repo list/frog repo list -lfrog repo info REPOfrog repo build [REPO](andpackage|dist|test|lint|clean|check|verify|diff|status|scan|targets|doctor|artifacts|artifact-stale; REPO defaults to the cwd repo)frog repo task list --repo REPOfrog repo discover [--root PATH](syncis an alias;detectaliasesscan)frog task create …/frog task list [--repo REPO]frog lock acquire …frog provider sync --source asana|linear|jira --config-file FILE --direction pull|push|bothfrog hook add URL/frog hook list/frog hook remove IDfrog hook dispatch [--id ID] [--limit N]— POST new event-log batches to enabled hooksfrog hook digest [--limit N] [--repo REPO]— emit a Markdown event digestfrog status— workspace summary (now reachable; previously shadowed by the repostatusaction)frog log/frog log --follow(there is nofrog log tail)frog unit discover [--repo REPO]/frog unit listfrog config info/frog config host …/frog config workspace …frog config coordinator show/frog config coordinator set WORKSPACEfrog box whoami— show the stable identity stamped onto locks and aliasesfrog box join [user@]host[:/path/AGENTS.db]— learn a peer box over SSHfrog box peers— list registered peer boxesfrog whereis REPO_KEY— resolve a logical repo key to paths on configured boxesfrog config path fishfrog completion bash/frog completion fishfrog mcp tools/frog mcp serve
Every --repo-ref flag is now spelled --repo. Use --workspace NAME
(not a workspace:repo first token) to target another box.
frog can expose a stdio MCP server over the same service layer used by the
CLI:
frog mcp toolsfrog mcp serve/data/src/ragbaz-frog/bin/frog-mcp
The initial MCP tool surface includes repo, unit, task, lock, log, status, and workspace-listing operations, and it can reuse the configured workspace model for remote SSH-backed workspaces.
- The storage layer uses explicit SQLite migrations.
- The service layer is structured so it can later back an HTTP API.
- The database stores coordination metadata, not full architecture or product docs.
frog's differentiator is the coordination/scheduling/forensics layer:
frog lock audit [--repo R] [--agent N]— flag working-tree changes not covered by your active lock (advisory → noticed).frog lock reap/frog lock list --status {active,stale,released,all}.- Lock kinds are freeform labels, not an enum. Use stable conventional names
such as
edit,docs,build,test,scan, ordeployso humans can read lock lists quickly. frog repo affected [--since REF]/frog repo build --affected(input-fingerprintedtarget_runscache: unchanged targets are skipped).frog repo dep add DEPENDENT DEPENDENCY— declared cross-repo edges; upstream changes fan out to dependents.frog task next [--agent N]— highest-ROI unblocked slice (deps, conflicts, locks, ownership aware). The scheduler an issue tracker isn't.frog log why SLUG/frog log blame FILE— causality/forensics.frog sync pull WS/frog sync list— read-only event mirror of another workspace (single-writer-per-DB; safe cross-box visibility).frog config coordinator set WSdesignates the single write authority for tasks and locks. Default/current workspace writes to task and lock state route there over the existing SSH workspace seam; explicit--workspaceand explicit--dbstill mean exactly what they say.frog whereis REPO_KEYresolves the local path and asks configured remote workspaces in non-recursive local-only mode, so agents can find the same logical repo on different boxes.frog box join [user@]host[:/path/AGENTS.db]asks the peer for itsbox_idand repo-key map over SSH, records shared repo aliases locally, and registers the peer for later sync/scheduling flows. It does not share a DB, move source code, or start a daemon.frog provider syncruns concrete Asana, Linear, and Jira adapters on top of the normalized provider contract.--direction pull|push|bothcontrols sync direction; provider JSON supplies credentials and status round-trip mappings such as Asana enum option GIDs, Linear state IDs, or Jira transition IDs.frog hook ...publishes event-log batches to human notification systems. Dispatch is explicit (frog hook dispatch) so ordinary coordination writes do not unexpectedly perform network calls;frog hook digestprovides a terminal-friendly Markdown summary of recent events.connect()enforces WAL + local-FS-only AGENTS.db (network-FS sqlite refused; use--workspacewhich RPCs over SSH).- Runner delegation: a declared Taskfile/justfile/mise outranks re-derived make/npm targets — frog orchestrates, the runner builds.
- Opt-in
hooks/pretooluse-lock-guard.shbridges locks to the harness.
See PLAN.md for the phased rollout; tests/ is a stdlib unittest
suite (python3 -m unittest discover -s tests).
frog agent whoami|register— first-class identity (FROG_AGENT) so peers on the same OS user are distinct; flows into locks/tasks/audit.frog task claim <slug>/frog task finish <slug>— composed workflow: claim = assign+lock+in_progress; finish = affected build/test gate → done + release + report unblocked dependents. Claim refuses a second active task for the same agent by default; use--allow-parallelonly when the extra slice is intentionally disjoint.frog db gc [--older-than D] [--keep N]— prune event/target_runs + VACUUM.frog doctor— self-diagnostic.frog board [--once]— realtime colored lifecycle board over the event log.- Concurrency-safe: lock_acquire is atomic (BEGIN IMMEDIATE) — proven
by a multiprocessing stress test.
--dbnow overrides the workspace DB (was silently ignored). SSH path testable via an injectable seam. pip install -e .(pyproject + console_scripts frog / frog-mcp).
- docs/COMMANDS.md — full command reference (generated; run
frog docs) - docs/FEDERATION.md — multi-box model: box identity, join, whereis, cross-box locks
- docs/MCP.md — using frog as an MCP server for agents
- docs/DEPLOY.md — install, the DB, schema-skew guard, backups, repo move