Contributing to gograph
August 23, 2026 ยท View on GitHub
First off, thank you for considering contributing to gograph! It's people like you that make open source such a great community.
Language Scope
gograph intentionally analyzes Go repositories. Multi-language parsing is a
current non-goal; open an issue before proposing any change to that product and
architecture boundary.
Development Setup
Install the Go version declared by go.mod (currently Go 1.27.0 or
newer) and GNU Make. The Makefile injects version metadata, so repository builds
must use make build rather than a raw go build command.
- Fork the repository on GitHub.
- Clone your fork locally:
git clone https://github.com/YOUR_USERNAME/gograph.git cd gograph - Build the project:
make build - Run tests:
make test
Pull Request Process
- Create a branch: Create a new branch for your feature or bugfix (
git checkout -b feature/my-new-feature). - Write code: Implement your changes. Ensure you add tests if you are adding new functionality.
- Format and verify: Run
make testbefore committing. It disables the Go test cache for both the normal and race suites, runs formatting, vet, lint, static analysis, andgovulncheck, and applies Grype's high-severity gate togo.modplus the freshly rebuilt native binary. CLI executable tests compile the current checkout into an ephemeral directory and use isolated fixtures; they never reusebin/gograph,bin/gograph-test, or a repository-resident graph. Install the tools used by the Makefile first. - Commit: Write clear, concise commit messages.
- Push: Push to your fork and submit a Pull Request against the
mainbranch. - Review: Maintainers will review your PR, suggest changes if needed, and merge it.
CLI, MCP, and Documentation Contracts
Query, analysis, and workflow features must have semantically equivalent CLI
and MCP entry points with tests for both. This includes the four workspace
read operations on their separate MCP server. The complete CLI-only boundary
is build, validate, doctor, gate, snapshot, plugin/hook installation,
project/workspace MCP startup, workspace build/member refresh, help, and
version. Output presentation may differ by transport: CLI commands use flags
such as --json, --files-only, and --mermaid, while MCP tools expose typed
parameters and content payloads. Keep the complete transport matrix and its
registry-backed documentation test current whenever either surface changes.
Document user-visible behavior in README.md,
docs/coding-agent-usage.md, CLI help/capabilities, the public docs site,
RELEASE_NOTES.md, and any affected integration metadata. For visual parity,
the eight graph-oriented CLI commands that accept --mermaid have MCP tools
with an optional mermaid=true parameter; both surfaces return
Markdown-fenced Mermaid for that presentation.
Use Scrinium only when maintained llm-wiki/ content must change or a material
architecture, security, release, governance, or external-source decision needs
durable cross-session context. Ordinary changes and read-only work do not need
a Scrinium session or mandatory wiki preload. When a wiki write is required,
call capabilities once for the connection, begin a session, read index.md,
agent-rules.md, and only directly relevant pages, then satisfy
session_status and finish the session. Do not edit protected pages directly;
use Scrinium's draft workflow.
Publishing an MCP Registry Release
The official Registry entry is io.github.ozgurcd/gograph. Registry/MCPB
publication is part of the normal tagged release; it must not replace or remove
the ordinary archives, checksums, or Homebrew update. The official Registry is
currently in preview, and published versions and metadata are immutable.
Current release pins are Registry schema 2025-12-11, MCPB manifest schema
0.4, @anthropic-ai/mcpb 2.1.2, mcp-publisher 1.7.9, and GoReleaser
v2.17.0; GitHub Actions vulnerability scans use Grype v0.116.1. Review the
official upstream schema and release notes before changing a pin. CI must
download the publisher by exact version, verify its pinned SHA-256 digest, and
must not use a moving latest URL.
The normal maintainer flow remains one command. Commit the feature or fix on
any attached branch whose HEAD includes the latest official main, leave the
worktree clean, and run:
make release
No version argument is required. The target computes the next patch version,
builds all six MCPBs, renders their immutable URLs and SHA-256 hashes into
server.json, runs the complete release verification and native MCP smoke
test, verifies modules and go mod tidy, runs go vet, and builds a pinned,
non-publishing GoReleaser snapshot in the temporary release directory. The
gate scans only explicit current inputs: declared modules in go.mod, the
fresh native binary, and each of the exact six newly generated ordinary
GoReleaser archives. A missing or extra archive fails closed. Ambient ignored
outputs under bin/, dist/, .release-mcpb/, and .release-work/ are not
release evidence and are never included by a repository-wide Grype scan. It
then commits only the generated version/release metadata and creates an
annotated version tag. It atomically pushes that exact commit to the official
remote's main together with the tag. The tag starts the immutable GitHub
release, Homebrew reconciliation, and official MCP Registry publication
workflow.
The command fails closed before publishing unless HEAD is attached to a branch,
the worktree is clean, the selected remote's main is an ancestor of HEAD, the
current declared version has a remote baseline tag in that history, the next
version is unused, and every build and validation gate passes. The selected
remote's push URL must be the official ozgurcd/gograph repository, and the
remote update is therefore a fast-forward. The coordinator never checks out,
merges, rebases, force-pushes, changes local main, or pushes the working
branch ref. A clone whose official remote is named upstream can use
make release RELEASE_REMOTE=upstream. This preserves the old git commit
followed by make release workflow while including the new MCPB and Registry
gates. If the command is rerun at the same already-tagged release commit, it
recognizes that release and does not increment the patch version again.
Use make release-dry-run to exercise the same automatic patch preparation,
full verification, and immutable-state checks while restoring the metadata and
creating no commit, tag, or push. If an atomic push fails, the coordinator
retains the already-verified local release commit and tag. Rerun make release
to retry that same version when remote main still permits a fast-forward; if
the unchanged release commit later reaches remote main, a rerun can publish
only the missing tag without moving main. An incompatible remote advance
fails closed and requires manual reconciliation of the unpublished local
release state. Branch protection may likewise require repository-specific
approval before the atomic update can succeed.
For CI or diagnosis of an already prepared release state, the non-publishing gate remains available:
make release-verify
This advanced target runs the cache-disabled local suites; explicit source/native/archive vulnerability scans; and the full MCPB, schema, hash, documentation, and smoke-test checks against the currently declared version without creating a commit, tag, or push.
After the atomic push, GoReleaser publishes the ordinary assets, six MCPBs,
checksums, and server.json. The workflow reconciles GoReleaser's generated
Homebrew cask idempotently, waits for every referenced GitHub asset to be
publicly downloadable, publishes with GitHub Actions OIDC, and verifies the
Registry record and downloadable hashes. Do not add a long-lived Registry
token.
Reruns may no-op only when the existing GitHub release and Registry record
match exactly. Any mismatch must fail closed, and no existing version, tag, or
release asset may be rewritten. Use the repository's independent validation as
the release gate rather than relying on publisher 1.7.9's standalone
mcp-publisher validate command. The complete package-selection, security, and
maintenance rationale is in
docs/mcp-registry.md.
When a tag-triggered run fails before publication, repair the workflow on
main and use gh workflow run release.yml --ref main -f tag=vX.Y.Z. This
re-verifies the existing tag commit; never delete, recreate, or move the tag.
Code of Conduct
By participating in this project, you agree to abide by our Code of Conduct.