Thanks for your interest in contributing! This guide covers the workflow for both human contributors and AI coding agents.
# 1. Fork this repo on GitHub, then clone your fork
git clone https://github.com/<your-username>/<repo-name>.git
cd <repo-name>
# 2. Install dependencies
npm install
# 3. Create a branch
git checkout -b your-branch-name
# 4. Make your changes, then verify everything passes
npm run lint:fix
npm run build
npm test- One PR per change. Keep PRs focused — a bug fix, a new feature, or a refactor, not all three.
- Branch from
main(ormasterif that's the default branch). - Run
npm run lint:fixbefore committing — CI will reject formatting issues. - Run
npm testand confirm all tests pass. - Write a clear PR title and description — explain what changed and why.
- All PRs require approval from a maintainer before merging.
| Command | What it does |
|---|---|
npm install |
Install dependencies |
npm run build |
Compile TypeScript |
npm run dev |
Run in development mode |
npm test |
Run the test suite |
npm run lint |
Check for lint errors |
npm run lint:fix |
Auto-fix lint and formatting |
- TypeScript, strict mode
- Formatting and linting are enforced by the project's linter — run
lint:fixand let the tooling handle it - No unnecessary abstractions — keep code simple and direct
- Add tests for new functionality
The JSON output of runComplianceSuite() is a stable, versioned contract consumed by downstream renderers (mcp.hosting, third-party dashboards). Every report carries a top-level schemaVersion field, defined by REPORT_SCHEMA_VERSION in src/types.ts, and is described by schemas/report.v1.json.
When changing the ComplianceReport type:
- Adding a field (non-breaking): update both
src/types.tsandschemas/report.v1.jsonin the same PR. No version bump needed. - Renaming, removing, or changing the type of an existing field (breaking): bump
REPORT_SCHEMA_VERSIONto"2", createschemas/report.v2.json, and keepschemas/report.v1.jsonfor downstream consumers still on v1. - Anything that affects determinism (new non-deterministic field, new warning that includes a timestamp/duration/random ID): the integration test
produces deterministic outputwill catch this. Don't bypass it — fix the root cause.
The CI suite enforces this:
src/tests/schema.test.tsvalidates a hand-crafted sample against the schema.src/tests/integration.test.tsvalidates a real CLI run against the schema.- Drift between
ComplianceReportandreport.v1.jsonwill fail CI.
If you're an AI agent (Claude Code, Copilot, Cursor, etc.) submitting a PR:
- Fork the repo and work on a branch — direct pushes to the default branch are blocked.
- Always run
npm run lint:fix && npm run build && npm testbefore committing. Do not skip this. - Do not add unrelated changes — no drive-by refactors, no extra comments, no unrelated formatting fixes.
- PR description must explain the change clearly — what problem does it solve, how does it work, how was it tested.
- One logical change per PR. If you're fixing a bug and adding a feature, that's two PRs.
Open an issue on GitHub. Include:
- What you expected to happen
- What actually happened
- Steps to reproduce
- Environment details (OS, Node version, etc.)
By contributing, you agree that your contributions will be licensed under the same license as this project.