# Contributing to agentmemory Thanks for taking an interest. This file is the short path from "I have an idea" to "it's in main." ## Ground rules - Apache-2.0 license applies to every contribution. - Sign-off is required on every commit (see [DCO](#developer-certificate-of-origin) below). - Be civil. [CODE_OF_CONDUCT.md](./CODE_OF_CONDUCT.md) applies. - No attribution headers ("Generated with Claude Code", "Co-Authored-By: Claude", etc.) in commits or PR descriptions. ## Before you open an issue Search existing issues first: - [open issues](https://github.com/rohitg00/agentmemory/issues?q=is%3Aissue+is%3Aopen) - [closed issues](https://github.com/rohitg00/agentmemory/issues?q=is%3Aissue+is%3Aclosed) If it's a bug: provide the repro steps, your Node version, OS, agentmemory version (`npm view @agentmemory/agentmemory version`), and what you expected vs. what you saw. If it's a feature: describe the user problem before the implementation. "I couldn't X because Y" beats "please add X." ## Before you open a PR 1. Fork the repo and create a branch off `main`: - `feat/` for features - `fix/-` for bug fixes - `docs/`, `refactor/`, `chore/` for the rest 2. `npm install` — you need Node >=20. 3. `npm run build` — TypeScript must compile clean. 4. `npm test` — the full test suite must pass. The one integration test under `test/integration.test.ts` needs a live server on `:3111` and is fine to skip locally. 5. Commit with sign-off. Rebase over tiny fixup commits so the history stays readable. ## Pull request flow - Keep PRs small and focused. One logical change per PR. - Write a clear description: what it does, why, and how to verify. - Link the issue the PR resolves (`Fixes #NNN` / `Closes #NNN`). - Expect CodeRabbit to review automatically. Address its comments before asking a human. - Address review feedback in new commits (do not force-push to the same branch). Maintainers may squash on merge. - A maintainer will merge when tests pass, CodeRabbit is green, and any review comments are addressed. ## Developer Certificate of Origin Every commit must carry a `Signed-off-by` trailer stating you have the right to submit the contribution under Apache-2.0. The full text of the DCO is at . Add it automatically: ```bash git commit -s -m "feat: your message" ``` PRs with commits lacking sign-off will not merge. ## Coding style - TypeScript strict mode. No `any` unless justified in a comment. - Prettier-compatible formatting (editor on save is fine; no repo-wide hook). - No code comments that restate what the code does. Only write a comment when the *why* is non-obvious — a hidden constraint, an invariant, a workaround for a specific bug. - No dead code, no commented-out imports. - Tests live next to the feature in `test/.test.ts`. Name the test after the behavior, not the implementation. ## Subsystems at a glance | Directory | What lives here | |-|-| | `src/triggers/api.ts` | Every HTTP endpoint under `/agentmemory/*`. Adding an MCP tool? Add the REST twin here too. | | `src/mcp/` | Standalone MCP server (`@agentmemory/mcp`), tools registry, transport, in-memory KV. | | `src/functions/` | Core memory operations — observe, compress, consolidate, retention, forget, graph, smart-search, export-import, governance. | | `src/hooks/` | The 12 auto-hooks that capture sessions in agents. | | `src/health/` | Liveness + readiness + alert thresholds. | | `src/state/` | KV schema, keyed mutex, access log. | | `integrations/` | First-party plugins: `hermes/`, `openclaw/`, `filesystem-watcher/`. | | `plugin/` | Claude Code plugin (`agentmemory@agentmemory`). | | `website/` | Marketing site (Next.js 16). | | `test/` | Vitest test suite. | ## Adding an MCP tool 1. Register the function in `src/functions/.ts`. 2. Register the HTTP trigger in `src/triggers/api.ts` with a matching `api_path`. 3. Add the tool entry in `src/mcp/tools-registry.ts`. 4. Implement in `src/mcp/standalone.ts` if the standalone MCP package should also expose it. 5. Write a test under `test/`. 6. No CHANGELOG touch in the PR itself — release PRs are the only place CHANGELOG changes. ## Adding an auto-hook 1. Add the new `HookType` string to the union in `src/types.ts`. 2. Wire the handler in `src/hooks/.ts`. 3. Add a Vitest case that fires the hook and asserts the observation gets written. ## Release process Maintainers cut releases. Every bump touches 8 files in lockstep: 1. `package.json` 2. `package-lock.json` (top + `packages[""].version`) 3. `plugin/.claude-plugin/plugin.json` 4. `packages/mcp/package.json` (self + `~x.y.z` pin on the main package) 5. `src/version.ts` (extend the union, assign) 6. `src/types.ts` (`ExportData.version` union) 7. `src/functions/export-import.ts` (`supportedVersions` Set) 8. `test/export-import.test.ts` (assertion) Then: CHANGELOG section, PR, merge, tag, GitHub release. The `Publish to npm` workflow picks up the release trigger and publishes `@agentmemory/agentmemory`, `@agentmemory/mcp`, and `@agentmemory/fs-watcher` to npm with provenance. ## Security issues Do not open a public issue for a security report. See [SECURITY.md](./SECURITY.md). ## Questions - Implementation questions: open a GitHub Discussion. - Governance questions: open an issue labeled `governance`. See [GOVERNANCE.md](./GOVERNANCE.md).