Thanks for your interest in contributing! Ensemble is an experimental multi-agent collaboration engine, and we welcome contributions of all kinds.
- Fork the repository
- Clone your fork:
git clone https://github.com/<your-username>/ensemble.git - Install dependencies:
npm install - Start the dev server:
npm run dev - Run the type checker:
npm run build
npm run dev # Start server with hot reload (tsx)
npm run build # Type check (tsc --noEmit)
npx vitest run # Run the test suite
npm run monitor # Launch TUI monitorgit config core.hooksPath .githooksTwo hooks, both about the same thing: no AI session transcript ever enters this repository.
commit-msgstripsClaude-Session:trailers, which some AI harnesses append automaticallypre-commitrefuses a commit that stages a transcript file, or any file containing aclaude.ai/code/session_...link
A transcript is a full record of a working session. It can contain paths, hostnames, customer names, credentials read aloud and half-finished reasoning that nobody reviewed for publication.
This is enforced rather than requested because it is not recoverable. On 2026-08-11 ten commits carrying session links reached this repo. History was rewritten, and it only half worked: forks share an object store with the parent, so the old commits stayed reachable through any of the 28 forks. A pushed transcript cannot be taken back.
Use git commit --no-verify if you are certain a file is a false positive.
skill/SKILL.md is the source of truth. The installed copy at
~/.claude/skills/collab/SKILL.md is generated from it by scripts/setup-claude-code.sh, which
substitutes __ENSEMBLE_DIR__ for your repo path. That substitution is why the installed copy
must never be edited directly, and why the installer has to be re-run after every skill change:
./scripts/setup-claude-code.sh # re-install after editing skill/SKILL.mdSkip it and your session keeps running the old skill while the repo says otherwise, which is exactly how the two files drifted apart before.
- Node.js 18+
- tmux
- TypeScript 5.5+
- Create a branch:
git checkout -b my-change - Make your changes
- Ensure
npm run buildpasses with no errors - Commit with a clear message (e.g.,
feat: add agent timeout config) - Push and open a Pull Request
- TypeScript with
strict: true - Use the existing patterns in
lib/andservices/ - Keep agent runtimes behind the
AgentRuntimeinterface - Sanitize all external input (tmux names, file paths, shell args)
Open an issue with:
- What you expected to happen
- What actually happened
- Steps to reproduce
- Environment (OS, Node version, tmux version)
By contributing, you agree that your contributions will be licensed under the MIT License.