-
Notifications
You must be signed in to change notification settings - Fork 0
Contributing
Thanks for considering a contribution to Auris. This page covers the practical mechanics — forking, branching, running checks locally, and opening a pull request. For the technical rulebook the codebase itself follows (naming conventions, validation patterns, how each package is expected to behave), see CLAUDE.md at the repository root; it's the canonical source and this page won't duplicate it.
gh repo fork fuchicar/auris-ai --clone
cd auris-aiOr without the GitHub CLI: click Fork on fuchicar/auris-ai first, then clone your fork.
git clone https://github.com/<your-username>/auris-ai.git
cd auris-ai
git remote add upstream https://github.com/fuchicar/auris-ai.gitmain is the stable branch — what go install github.com/fuchicar/auris-ai@latest resolves to — and only takes merges from develop. New work lives in feature branches cut from develop.
git fetch upstream
git checkout -b feat/short-description upstream/developBranch names aren't enforced by tooling, but feat/…, fix/…, refactor/…, and docs/… prefixes match the commit convention below and make the diff's intent obvious at a glance.
A few habits the codebase already follows consistently — matching them keeps your diff easy to review:
-
New market driver? Implement every method of
market.ProviderAPI, wrap sentinel errors withfmt.Errorf("<driver>: <Method>: %w", market.ErrXxx), add a compile-timevar _ market.ProviderAPI = (*Driver)(nil)check, register it inpkg/registry/market.go, and — if any method is a permanentErrNotSupportedregardless of account tier — implementmarket.CapabilityReporterso the agent doesn't burn a tool-call iteration on something that can never succeed. Full checklist inCLAUDE.md. -
New LLM driver? Same shape: implement
llm.AIProvider, wrap sentinel errors, add the compile-time interface check, register inpkg/registry/llm.go. If the provider supports tool calling,Streammust populateToolCalls/StopReason/Extraon the terminal chunk exactly asCompletedoes — reuse one mapping helper for both, don't re-derive the parsing twice. -
New
Calc*function inpkg/finance? Validate every numeric parameter with the matching helper frompkg/finance/validate.goas the first statements of the function — before any computation. Pick the helper by the parameter's real-world domain (a price is never negative, a return can legitimately be ±1000%+, an annualised rate assumption shouldn't).CLAUDE.md's "Validating numeric tool inputs" section has the full decision table. -
New or removed agent tool? Update the hardcoded count in
TestBuildTools_Count(pkg/agent/agent_test.go) to match. - Integration tests that need live API keys must
t.Skipautomatically when credentials aren't present — nobody should need a paid API key just to rungo test ./....
go build ./... # build everything
go vet ./... # static analysis
go test ./... -timeout 120s # full test suite (hermetic — no network, no keys needed)These three commands are exactly what CI runs on every push and PR (.github/workflows/ci.yml), so a clean local run means a clean CI run.
The project follows Conventional Commits informally but consistently — recent history looks like:
feat: add currency formatting and selection in portfolio management
fix: preserve assistant text alongside tool calls in OpenAI driver responses
refactor: rename portfolio identifiers for clarity in tests
docs: add Acknowledgements section in both READMEs
chore: expand .gitignore and ignore local AI-agent and personal files
build: drop Windows targets, add FreeBSD amd64 to release matrix
feat: and fix: prefixes aren't just style — GoReleaser's changelog generation (.goreleaser.yaml) groups release notes by exactly these prefixes, so using them correctly makes the auto-generated changelog readable.
PRs target develop, not main. main only takes merges via a deliberate develop→main promotion — see Releasing below.
git push -u origin feat/short-description
gh pr create --base develop --fillTwo automated workflows run on every PR (against either branch):
-
ci.yml—go build/go vet/go test ./... -timeout 120s. Must be green. -
claude-code-review.yml— an automated Claude Code review that comments on the diff. Treat its findings the same as a human reviewer's: worth a look, not automatically blocking.
When the work accumulated on develop is stable and ready to ship, a maintainer opens a second PR — develop → main. Merging that PR is what gets tagged (e.g. v0.5.0); tagging a main commit then triggers GoReleaser (.github/workflows/release.yml), which is what produces the artefact that go install github.com/fuchicar/auris-ai@latest actually picks up.
# maintainer with push access to both branches
git checkout main && git pull --ff-only upstream main
git merge --no-ff upstream/develop # keep the promotion as a merge commit on purpose
git tag vX.Y.Z
git push upstream main --follow-tagsDon't open a develop→main PR unless CI is green on develop and nothing half-finished is still in flight — main should always be releasable as-is.
There's no formal CONTRIBUTING.md or code of conduct in the repo yet, so this wiki page is the canonical contribution reference. Keep discussion technical, assume good faith, and prefer a small focused PR over a large mixed one; it's much easier to review and to trace back later.
This project has itself been developed with substantial AI coding assistance (see the README's Acknowledgements section) — including an automated @claude-mention workflow (.github/workflows/claude.yml) that can respond to review comments on a PR. AI-assisted PRs are welcome; the same bar applies as to any other contribution: it must build, pass tests, and the human submitting it is responsible for understanding and standing behind the change.
For new users
For contributors
Under the hood