Thank you for considering a contribution to filigree. Whether it's a bug report, feature idea, documentation fix, or code change, your help is welcome.
Open a bug report on GitHub. Include:
- Filigree version (
filigree --version) - Whether you hit the issue via CLI, MCP, or the dashboard
- Steps to reproduce
- Expected vs actual behavior
- Python version and OS
Open a feature request. Describe the problem you're solving and your proposed approach.
git clone https://github.com/foundryside-dev/filigree.git
cd filigree
uv sync --group devThis installs all runtime and dev dependencies (ruff, mypy, pytest, coverage, etc.) into a virtualenv managed by uv.
- Linter/formatter: ruff (config in
pyproject.toml) - Type checker: mypy in strict mode
- Line length: 120 characters
Before committing:
make format # Auto-fix formatting and lint issues
make lint # Check without modifying (same as CI)
make typecheck # mypy strictmake test # Quick run (no coverage)
make test-cov # With coverage report and 85% thresholdTests live in tests/ and use pytest fixtures with temporary databases. No test state leaks between runs.
This project uses Conventional Commits. Each commit message should have the form:
<type>: <short description>
<optional body>
Accepted types:
| Type | When to use |
|---|---|
feat |
New feature |
fix |
Bug fix |
docs |
Documentation only |
test |
Adding or updating tests |
ci |
CI/CD pipeline changes |
refactor |
Code change that neither fixes a bug nor adds a feature |
chore |
Maintenance (deps, config, etc.) |
build |
Build system or packaging changes |
Use ! after the type for breaking changes: refactor!: rename public API.
- Fork the repository and create a branch from
main - Make your changes
- Run
make cito verify lint, types, and tests all pass - Open a pull request against
main - Describe what the PR does, why, and link any related issues
- Ensure the CI checks pass
Keep PRs focused. One logical change per PR is easier to review than a large omnibus.
Look for issues labeled good first issue. Good starting points include:
- Documentation improvements
- Adding tests for uncovered code paths
- CLI help text improvements
All SQLite operations live in src/filigree/core.py (the FiligreeDB class). Both the CLI (cli.py) and MCP server (mcp_server.py) import from it. If you're adding a new operation, add the method to FiligreeDB first, then expose it through whichever interface makes sense.
The summary generator (summary.py) regenerates .filigree/context.md after every mutation. If you add a new write operation, make sure it triggers a summary refresh.
By contributing, you agree that your contributions will be licensed under the MIT License.