git clone https://github.com/basecamp/basecamp-cli
cd basecamp-cli
bin/setup # Install toolchain and dev tools
make build # Build
bin/ci # Verify everything passesAs an alternative to bin/setup, contributors with Nix can enter the development environment with:
nix developThe development shell provides Go and the tools required by bin/ci.
When developing against a local copy of basecamp-sdk, use Go workspaces instead of replace directives in go.mod:
# Set up workspace (one-time)
go work init .
go work use ../basecamp-sdk/go
# Now basecamp will use your local SDK automatically
go build ./...The go.work file is gitignored - your local setup won't affect the repo.
- Go 1.26.7+
- bats-core for integration tests
- golangci-lint for linting
- jq for CLI surface checks
- Ruby 3.4 for the skill-eval pattern check, which compiles those patterns under the same engine the eval runner uses
-
Run CI locally before pushing:
bin/ci
This runs formatting, vetting, linting, unit tests, e2e tests, naming checks, CLI surface checks, provenance checks, and tidy checks. Fix anything that fails before pushing.
-
Add tests for new functionality
-
Update documentation if adding commands or changing behavior
-
Keep commits focused - one logical change per commit
- Run
make fmtbefore committing - Follow Effective Go conventions
- Follow Go Code Review Comments
basecamp-cli/
├── cmd/basecamp/ # Main entrypoint
├── internal/
│ ├── auth/ # OAuth authentication
│ ├── commands/ # CLI command implementations
│ ├── config/ # Configuration management
│ ├── output/ # Output formatting
│ └── sdk/ # Basecamp SDK wrapper
└── e2e/ # BATS end-to-end tests
make testRequires bats-core:
brew install bats-core # macOS
make test-e2eBASECAMP_BIN=./bin/basecamp bats e2e/Keep each skill's parsed YAML description between 1 and 1,024 characters,
including whitespace, as required by the
Agent Skills specification.
Use it for what the skill does and when to load it; keep workflow details in the
body. TestSkillDescriptionsFitAgentSkillsSpec checks every skills/*/SKILL.md
during the normal unit tests.
This is a cross-agent portability requirement. Anthropic's skill validator rejects descriptions over it. That validator is not proof that Claude Code's runtime warns, truncates, or rejects identically; do not rely on a particular consumer accepting an overlong description.
Open an issue for questions about contributing.