Skip to main content

Development

Repository layout

DirectoryPurpose
cmd/omac/Entrypoint
internal/cli/Subcommand dispatch (one file per subcommand; see CLI reference)
internal/config/Types for both config files: omac.yaml (skill manifest) and oh-my-agentic-coder.yaml (launcher config)
internal/registry/.opencode/sidecar.json (atomic writes, flock)
internal/keychain/Thin wrapper over github.com/zalando/go-keyring
internal/secrets/Secret type (redacted Stringer, zeroize) + masked prompt
internal/osinfo/macOS / Linux / WSL detection
internal/facade/Unix-socket HTTP reverse proxy (SSE + upgrades)
internal/supervisor/Sidecar lifecycle (spawn, health, shutdown)
internal/sandbox/Templated sandbox-backend launcher

Build

Dev build (version reports as 0.1.0-dev):

go build -o omac ./cmd/omac

Release-style build — stripped, reproducible, version-stamped (same ldflags as GoReleaser):

go build -trimpath -ldflags "-s -w -X main.Version=0.1.0-local" -o omac ./cmd/omac
./omac version # -> omac 0.1.0-local

For full multi-platform artifacts (.deb, .pkg.tar.zst, checksums), use GoReleaser (goreleaser release --clean --snapshot --skip=publish). See .goreleaser.yaml.

Documentation site

This directory is published at tng.github.io/oh-my-agentic-coder by the Docusaurus project in website/, which reads the markdown from docs/ in place — nothing is copied, so every page stays readable as a plain file on GitHub.

Deployment is automatic: merging a PR that touches docs/ or website/ pushes to main, and that push builds and deploys the site. There is no manual step. The same workflow builds (but never deploys) on every PR, so a dead link or an MDX parse error fails your PR rather than the live site — run npm ci && npm run build in website/ to see it before pushing.

Releases

Pushing a git tag such as v1.2.3 starts the release workflow (.github/workflows/release.yml), which builds the binaries and publishes them.

Tag format

Tags follow Semantic Versioning: vMAJOR.MINOR.PATCH, with two optional suffixes:

  • A - suffix marks a pre-release (example: v1.2.3-rc.1 (release candidate 1))
  • A + suffix is build metadata: an informational label for one particular build, such as a CI run number. It is ignored when comparing versions, so v1.2.3+build.42 counts as the same version as plain v1.2.3.

Release process

The release is built by GoReleaser.

Tag typeGitHub releaseHomebrew tapSlack
Stable (v1.2.3)Published as a normal releaseFormula updatedAnnouncement posted
Pre-release (v1.2.3-rc.1)Published as a pre-releaseNot updatedNo announcement

CI

CI (.github/workflows/ci.yml) gates every PR on gofmt, go vet, staticcheck, build, and go test -race. To catch gofmt drift before pushing, install the pre-commit hook:

scripts/install-hooks.sh