Command-line tools for working with Basecamp, HEY, and Fizzy. Full API coverage, structured JSON output, and built-in agent skills make them equally fluent for human operators and AI agents. Use them to automate workflows, build integrations, or just get things done without leaving the terminal.
| CLI | What it does | Repo |
|---|---|---|
basecamp | Manage projects, messages, to-dos, and more | basecamp/basecamp-cli |
hey | Triage email, manage contacts, and search | basecamp/hey-cli |
fizzy | Work with boards, cards, and columns | basecamp/fizzy-cli |
This repo is the shared Go toolkit that powers all three CLIs. It provides reusable packages, seed templates, GitHub Actions, and a rubric specification that standardize CLI development across 37signals products.
| Package | Import | Description |
|---|---|---|
output | github.com/basecamp/cli/output | Structured JSON envelopes, typed exit codes, and TTY-aware formatting |
credstore | github.com/basecamp/cli/credstore | Credential storage with system keyring preference and file fallback (0600) |
pkce | github.com/basecamp/cli/pkce | PKCE code verifier and challenge generation (RFC 7636) |
oauthcallback | github.com/basecamp/cli/oauthcallback | Local HTTP server that captures OAuth authorization code callbacks |
profile | github.com/basecamp/cli/profile | Named environment profiles for targeting different accounts or environments |
surface | github.com/basecamp/cli/surface | CLI surface snapshot and compatibility diffing for Cobra command trees |
The seed/ directory contains templates for bootstrapping a new 37signals Go CLI. Templates include project scaffolding for auth, commands, output formatting, distribution, skills, and CI.
Use the prompts/seed-cli.md agent prompt to generate a new CLI from these templates:
Inputs: app name, API base URL, auth model (OAuth+PKCE, bearer token, or purchase token) Reusable composite actions in actions/:
| Action | Description |
|---|---|
rubric-check | Score a built CLI binary against the 37signals CLI rubric |
surface-compat | Fail CI if CLI flags or subcommands were removed (breaking change) |
sync-skills | Sync embedded SKILL.md files to the basecamp/skills distribution repo on release |
Usage in a workflow:
- uses: basecamp/cli/actions/rubric-check@main with: cli-binary: ./dist/myappRUBRIC.md codifies design decisions from basecamp-cli into a reusable standard covering:
- Tier 1 — Agent contract: structured output, exit codes, discovery, auth
- Tier 2 — Reliability: surface stability, resilience, configuration
- Tier 3 — Agent integration: skills, pagination, observability
- Tier 4 — Distribution & ecosystem: builds, testing, shell completion, DX
INPUT-CONVENTIONS.md standardizes how content-creation commands accept text input — positional shorthand, stdin piping, short flags, $EDITOR fallback — with a resolution chain, disambiguation patterns, and a cross-CLI conformance audit table.
MAKEFILE-CONVENTION.md standardizes Make targets across all CLI repos.
Reusable agent prompts in prompts/:
| Prompt | Purpose |
|---|---|
seed-cli.md | Bootstrap a new CLI from the seed templates |
close-gap.md | Close a specific rubric gap in an existing CLI |
close-input-gap.md | Close a specific input convention gap in a content command |
The skills/ directory contains agent skills distributed via basecamp/skills:
rubric-audit— Audit a Go CLI against the rubric
Requires Go 1.24+.
make check # fmt-check + vet + test (inner-loop dev) make test # go test ./... make test-race # go test -race ./... make lint # golangci-lint run make check-all # full suite: fmt-check + vet + lint + test-race + bench Copyright 2025 37signals LLC. Released under the MIT License.