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
1
Teammate clones the repo and runs the CLI
2
CLI detects the binding and prints the invite hint
3
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.4
Teammate re-runs login
<workspace> prompt, and writes the workspace into .env.5
Run init to drop IDE configs (optional)
If the teammate wants Cursor / Claude Code / Codex hooks and MCP configs:
init detects the already-bound workspace and skips straight to writing the IDE files — no bind prompts.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:Members
Roles
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.