Team Setup
Setting up dmx for a team is mostly about getting .dmx/ committed to your repository and making sure everyone connects their IDE to dmx.
Step 1: Initialise the repo once
One person runs /dmx/init in the repository. This creates the .dmx/ directory with the project config and scaffolded memory bank.
Commit the .dmx/ directory:
git add .dmx/
git commit -m "chore: initialise dmx memory bank"
git push
Every developer who pulls this commit gets the project context automatically. No further setup per developer beyond connecting their IDE.
Step 2: Each developer connects their IDE
Each team member configures their IDE to use dmx as an MCP server. See MCP Setup for the config.
The command is the same for everyone:
{
"mcpServers": {
"dmx": {
"command": "uvx",
"args": ["--from", "deepmodel-dmx", "dmx", "serve"]
}
}
}
No per-developer configuration. No secrets to share. dmx reads project config from .dmx/config.md in the repo.
Step 3: Commit .dmx/ files as you work
As developers work on features, spec.md, tasks.md, and the core memory files (systemPatterns.md, techContext.md, productContext.md, activeContext.md) are updated. These should be committed alongside code changes.
Include .dmx/ in your standard commit workflow. The memory bank is project state, not developer scratch. It belongs in the repo.
What to gitignore
A minimal .gitignore for .dmx/:
# Ignore job execution records (can get large)
.dmx/jobs/
# Ignore the active loop pointer (resolves on checkout)
.dmx/loop-state.json
Some teams prefer to commit .dmx/jobs/ for full auditability. It's optional. The value is in the context files and loop configs, not the execution records.
Sharing loop configs
Custom loop configs in .dmx/loops/ are committed to the repo and shared across the team. Every developer runs the same loops with the same validators.
To change a loop config:
- Edit
.dmx/loops/{name}.yaml - Commit and open a PR
- The change is reviewed like any other code change
This is the principle that makes loops reliable for teams: loop configs are versioned artifacts, not personal preferences.
Sharing custom skills
If you've written custom skills (beyond the bundled set), point DMX_SKILLS_DIR at a directory in the repo:
{
"mcpServers": {
"dmx": {
"command": "uvx",
"args": ["--from", "deepmodel-dmx", "dmx", "serve"],
"env": {
"DMX_SKILLS_DIR": "/absolute/path/to/your/repo/.dmx/skills"
}
}
}
}
Everyone uses DMX_SKILLS_DIR pointing to the repo. Custom skills are versioned and shared.
Sharing custom validators
Custom validators in validators/ at the repo root are already shared. They're in the repo. No additional configuration needed; dmx looks there first.
your-project/
├── validators/
│ ├── run_tests.py # Team's custom test runner
│ └── security_scan.py # Team's security validator
└── .dmx/
└── loops/
└── dev.yaml # References the custom validators
Handling merge conflicts in .dmx/
Because spec.md and tasks.md are branch-level files, they rarely conflict. The context files (techContext.md, systemPatterns.md) can conflict if two developers are updating them simultaneously.
Resolve context file conflicts like documentation conflicts: read both versions, keep the most current and accurate content, commit the merge.
loop-state.json should be gitignored. If it's committed, accept any incoming version on merge. It always resolves to the correct state on the next loop run.
Onboarding new developers
A new developer on the team:
- Clones the repo (gets
.dmx/with full project context) - Configures their IDE to use dmx (MCP Setup)
- Runs their first
/dmx/create-ticketor picks up an in-progress job
No onboarding document needed for dmx itself. The memory bank is the onboarding document.