Documentation Index
Fetch the complete documentation index at: https://docs.enagrams.com/llms.txt
Use this file to discover all available pages before exploring further.
Workspaces
A workspace is the shared coordination context for a team working on one codebase. All agents connected to the same workspace share decisions, conventions, reservations, workstreams, tasks, and the symbol graph. Every workspace is bound to exactly one git repository. Binding is what makes “which workspace is this?” an unambiguous question — any teammate who clones the repo gets routed to the same workspace without guessing at a name.Creating a Workspace
Pick whichever path matches how you’re onboarding — they all produce the same workspace.- CLI (recommended for new repos)
- Dashboard + GitHub App
- Dashboard only (bind later)
- API
From the root of the repo you want to coordinate:The CLI:
- Opens your browser to authenticate (first run only — subsequent runs reuse
~/.config/enagrams/config.json). - Computes the repo fingerprint (normalized
originURL + root commit SHA). - Checks whether this repo is already bound to a workspace — if so, it routes you to it instead of creating a duplicate.
- Prompts for a name and slug, creates the workspace, binds it to this repo, and writes all IDE config files.
init writes to disk.Repo Binding
A binding is the pair(repo_url, repo_root_commit):
repo_url— normalized form ofgit remote get-url origin.git@github.com:Org/Repo.git,https://github.com/Org/Repo, andhttps://user:token@github.com/org/repo.git?ref=xall fold to the same canonical URL. Host is lowercased; org+repo are lowercased on GitHub/GitLab/Bitbucket (case-insensitive hosts).repo_root_commit— SHA of the earliest commit (git rev-list --max-parents=0 --all, sorted). Stable across branches, clones, and forks of the same history.
Shallow clones (
git clone --depth=N) don’t carry the real root commit. The CLI detects this, skips the SHA, and binds on URL alone. Run git fetch --unshallow for the full fingerprint.Workspace Slug
The slug is a URL-safe identifier (e.g.my-startup). It’s what you supply for ENAGRAMS_WORKSPACE in each developer’s .env. Slugs are unique across all workspaces.
When you create a workspace in the dashboard for a repo that doesn’t exist locally yet, set the slug to the repo’s basename (github.com/org/chatgpt-wrapper → slug chatgpt-wrapper). The CLI uses slug-matches-basename as the trigger for its one-keystroke bind shortcut.
Sharing a Workspace
Enagrams is invite-only. A teammate can’t join a workspace by guessing its slug or by runningenagrams init in a bound repo — workspace owners and admins invite from the dashboard, and teammates accept.
The flow
Teammate clones the repo and runs the CLI
CLI detects the binding and prints the invite hint
Admin invites from the dashboard
Owner or admin goes to Dashboard → Team → Invite and enters the teammate’s email. The teammate gets an email with the invite link, clicks to accept, and is added as a
member.Teammate re-runs login
<workspace> prompt, and writes the workspace into .env.The “ask for an invite” hint is fired by an unauthenticated
POST /repo-lookup probe, rate-limited to prevent enumeration. The endpoint only returns admin contacts when the fingerprint matches a real workspace — random probes get {match: null}.Fingerprint edge cases
The CLI surfaces actionable messages for the five non-happy git states before showing any menu:| Status | What the CLI says | Fix |
|---|---|---|
no_git | This directory is not inside a git worktree | cd into your project or git init |
no_commits | This git repo has no commits yet | git add -A && git commit -m "first" |
no_remote | No remote configured — binding on SHA alone | git remote add origin <url> (optional; SHA still works) |
shallow | Shallow clone; binding on URL alone | git fetch --unshallow for the full fingerprint |
no_remote_and_shallow | No signal available | Fix one of the two above first |
Members
Roles
| Role | Permissions |
|---|---|
owner | Full access, delete workspace, bind/unbind repo, manage all members |
admin | Manage members, bind/unbind repo, change settings |
member | Create decisions, claim work packages, propose conventions, use MCP tools |
Inviting Members
From the dashboard: Workspace → Team → Invite (enter email). The invitee gets an email; once they accept they’re added asmember by default (admins can change the role before or after).
You can also use the API:
Removing Members
API Keys
Each team member has their own API key:npx enagrams logincreates one automatically and saves it to~/.config/enagrams/config.json.- Or generate one manually at Dashboard → API Keys.
ek_ and are tied to a user account. A key can access any workspace the user is a member of.
Revoking Keys
Revoke from Dashboard → API Keys → Revoke. Active sessions using the key are terminated immediately.Workstreams
Workstreams are the primary unit of shared work within a workspace. Each one maps to a branch (ena/<slug>). See Workstreams for the full lifecycle.
List active workstreams:
workstream_list.
Reservations
View current reservations (file and symbol level):sessionEnd. Manual release: end the owning conversation.
Conventions
Conventions are workspace-scoped rules.must-tier conventions are enforced by the preToolUse hook. Manage them through:
- MCP:
convention_propose,convention_list. - Dashboard: Workspace → Conventions.
Moving a Workspace to a New Repo
If your team renames the repo or migrates hosts (GitHub → GitLab, etc.), the normalized URL usually still matches — the server silently backfills the new URL on the next bind. No action required. If you’re moving the workspace to a different repo (history and all), use:Workspace Settings
| Setting | Description |
|---|---|
name | Display name |
slug | URL-safe identifier — changing requires updating every .env and MCP config |
default_base_branch | Branch new workstreams fork from (defaults to main) |
repo_url / repo_root_commit | The current binding. Read-only in PATCH — use POST /workspaces/:id/repo-binding or the CLI instead. |
| GitHub App binding | Managed entirely from the dashboard. Disconnect releases the binding cleanly. |