The upstream repository lives at https://somegit.dev/Owlibou/gnoma and is mirrored to https://github.com/VikingOwl91/gnoma. PRs are accepted on the upstream (Gitea) instance; the GitHub mirror is read-only.
git clone https://somegit.dev/Owlibou/gnoma && cd gnoma
make build # requires Go 1.26+
make test
make lint # requires golangci-lint- Branch from
main. - Write tests first (TDD). Table-driven where possible,
t.TempDir()for filesystem tests,testing/synctestfor concurrent ones. make check(fmt + vet + lint + test) must pass.- Conventional commits:
feat:,fix:,refactor:,test:,docs:,chore:. No co-signing or "Generated-by" trailers.
- Go 1.26 idioms (
new(expr),errors.AsType[E],sync.WaitGroup.Go). - Structured logging with
log/slog. json.RawMessagefor tool schemas (zero-cost passthrough).- Functional options for complex configuration.
- Short, lowercase package names — no underscores.
- Discriminated unions via struct + type discriminant, not interfaces.
- Pull-based stream iterators:
Next() / Current() / Err() / Close().
| Command | What it runs |
|---|---|
make test |
unit tests |
make test-integration |
tests behind //go:build integration — requires real API keys |
make cover |
coverage → coverage.html |
make lint |
golangci-lint run ./... |
make check |
fmt + vet + lint + test |
go test -bench=. ./internal/router/ |
router benchmarks |
Integration tests are skipped by default.
Read docs/essentials/INDEX.md before changing
architectural boundaries. Key packages:
| Package | Purpose |
|---|---|
internal/engine |
Agentic loop (stream → tool → re-query) |
internal/router |
Multi-armed bandit arm selection |
internal/provider |
LLM provider adapters |
internal/tool |
Tool interface + registry |
internal/mcp |
MCP client (JSON-RPC over stdio) |
internal/plugin |
Plugin manifest, loader, manager |
internal/elf |
Sub-agent (elf) system |
internal/security |
SafeProvider boundary, firewall, output scanner |
internal/skill |
Skill registry and templating |
internal/slm |
Small-language-model classifier + arm |
internal/tui |
Bubble Tea v2 terminal UI |
ADRs live in docs/essentials/decisions/.
File issues on the upstream Gitea instance with:
- A short reproduction (commands, prompts, configs that triggered the bug).
- Expected vs. actual behavior.
gnoma --versionoutput and OS / architecture.- Provider and model in use, if relevant.
--verboselog output if it sheds light.
By contributing you agree your work is licensed under the Apache License 2.0.