๐ gogo
A simple task runner. Define tasks in YAML, run them from anywhere.
Simple YAML Config
Define tasks with commands, dependencies, variables, and environment in a single gogo.yaml.
Incremental Builds
SHA-256 source checksums or generates: timestamp comparison skip work that is already up to date.
Source Presets
Reuse named glob lists (built-in go and go-vendored, or define your own).
Watch Mode
Polls sources at a configurable interval: and re-runs tasks when they change.
Concurrent Dependencies
Independent deps: run in parallel and are deduplicated within a single invocation.
Variables
Template expansion, shell-evaluated sh: values, and built-in {{.GIT_*}} and {{.TASK_FILE_DIR}}.
Dotenv
Global and per-task .env files, with deterministic precedence rules.
Secrets
Inject 1Password values into tasks using op:// references; op run handles auth.
Preconditions & Requires
Guard tasks with shell-evaluated checks or required vars / env before they run.
Platform Filtering
Restrict tasks to specific OS/arch with platforms: [linux/amd64, darwin].
Includes & Flatten
Split task files across subdirectories (includes:) or merge sibling files into one namespace (flatten:).
Dry Run
gogo -n <task> prints the full plan without executing commands.
Quick Example
# gogo.yaml
tasks:
# Build the project
build:
cmd: go build ./...
sources: go # built-in preset: **/*.go + go.mod + go.sum
# Run all tests
test:
deps: [build]
cmd: go test ./...
sources: go
# Format and lint
lint:
cmds:
- gofmt -w .
- golangci-lint run
gogo build # run the build task
gogo test # run tests (builds first)
gogo -w test # watch and re-run tests on changes
gogo -l # list tasks with descriptions