Thank you for your interest in contributing to Catenary! This project aims to bridge the gap between AI agents and professional development tools.
- Fork the repository on GitHub.
- Clone your fork locally.
- Create a branch for your feature or bug fix.
- Implement your changes.
- Test your changes using
cargo test. - Lint your code using
cargo clippyandcargo fmt. - Submit a Pull Request to the
mainbranch.
- We follow standard Rust idioms and conventions.
- Ensure all code is formatted with
rustfmt. - Ensure no warnings are generated by
clippy. - Add documentation comments for public APIs.
Catenary uses a mix of unit tests and integration tests.
- Unit Tests: Located in the same file as the code (e.g.,
src/lib.rs). - Integration Tests: Located in
tests/. These spawn real LSP servers (likerust-analyzerorbash-language-server). Ensure you have the necessary tools installed if you are modifying relevant tests.
To test your changes end-to-end with Claude Code or Gemini CLI without publishing to a marketplace:
Build the release binary:
cargo build --releaseThe binary will be located at target/release/catenary.
Catenary ships plugin/extension manifests for both Claude Code and Gemini CLI. These bundle hooks for editing enforcement, command filtering, and agent lifecycle tracking, plus an MCP connection for session management and workspace root discovery.
# Install as a local marketplace plugin
/plugin marketplace add /path/to/Catenary
/plugin install catenary@catenaryThe plugin includes:
- MCP connection for session management and root discovery
PreToolUsehook — editing state enforcement and command filtering- Lifecycle hooks — session start/end, turn tracking, agent stop
# Link the local extension for development
gemini extensions link /path/to/CatenaryThe extension includes:
- MCP connection for session management and root discovery
BeforeToolhook — editing state enforcement and command filtering- Lifecycle hooks — session start/end, turn tracking, agent stop
After making changes, rebuild and reinstall:
cargo install --path .This places the updated binary at ~/.cargo/bin/catenary. Restart your
Claude Code or Gemini CLI session to pick up the new binary.
If you change hook definitions in plugins/catenary/hooks/hooks.json or
hooks/hooks.json, run catenary doctor to check whether the installed
hooks match the new definitions:
Hooks:
Claude Code 1.3.6 (directory) ✗ stale hooks (reinstall: claude plugin uninstall catenary@catenary && claude plugin install catenary@catenary)
Gemini CLI 1.3.6 (linked) ✓ hooks match
Reinstall the plugin/extension as indicated to pick up the new hooks.
Catenary is dual-licensed.
By contributing to Catenary, you agree that your contributions will be licensed under its GNU Affero General Public License v3.0 (or later).
Additionally, by submitting a Pull Request, you grant Mark Wells Dev a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare derivative works of, publicly display, publicly perform, sublicense, and distribute your contributions and such derivative works under the project's licenses (including the Commercial License).
This ensures the project can remain sustainable and legally sound while staying open source.