Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 34 additions & 0 deletions .codex-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
{
"name": "basecamp",
"version": "0.7.2",
"description": "Use Basecamp from Codex to find work, create todos, and keep projects up to date.",
"author": {
"name": "37signals",
"email": "support@37signals.com",
"url": "https://37signals.com"
},
"homepage": "https://basecamp.com/cli",
"repository": "https://github.com/basecamp/basecamp-cli",
"license": "MIT",
"skills": "./skills/",
"interface": {
"displayName": "Basecamp",
"shortDescription": "Work with Basecamp from Codex.",
"longDescription": "Find assignments, create and update Basecamp work, diagnose the CLI, and connect Git commits to Basecamp todos.",
"developerName": "37signals",
"category": "Productivity",
"capabilities": [
"Interactive",
"Read",
"Write"
],
"websiteURL": "https://basecamp.com/cli",
"defaultPrompt": [
"Show my assigned Basecamp work and highlight anything overdue.",
"Create a Basecamp todo from this task and assign it to me.",
"Summarize recent activity in the current Basecamp project."
],
"composerIcon": "./assets/bc5-snowglobe.png",
"logo": "./assets/bc5-snowglobe.png"
}
}
2 changes: 1 addition & 1 deletion .goreleaser.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ project_name: basecamp
before:
hooks:
- sh -c 'mkdir -p completions && go run ./cmd/basecamp completion bash > completions/basecamp.bash && go run ./cmd/basecamp completion zsh > completions/_basecamp && go run ./cmd/basecamp completion fish > completions/basecamp.fish'
- sh -c '{{ if .Prerelease }}echo "Skipping Claude plugin version stamp for prerelease {{ .Version }}"{{ else }}scripts/stamp-plugin-version.sh {{ .Version }}{{ end }}'
- sh -c '{{ if .Prerelease }}echo "Skipping plugin version stamps for prerelease {{ .Version }}"{{ else }}scripts/stamp-plugin-version.sh {{ .Version }} && scripts/stamp-codex-plugin-version.sh {{ .Version }}{{ end }}'

builds:
- id: basecamp
Expand Down
4 changes: 3 additions & 1 deletion AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,9 @@ basecamp-cli/
│ └── version/ # Version info
├── e2e/ # BATS integration tests
├── skills/ # Agent skills
└── .claude-plugin/ # Claude Code integration
├── hooks/ # Codex-native lifecycle hooks
├── .claude-plugin/ # Claude Code integration
└── .codex-plugin/ # Codex plugin manifest
```

## Basecamp API Reference
Expand Down
13 changes: 12 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
- Works standalone or with any AI agent (Claude, Codex, Copilot, Gemini)
- JSON output with breadcrumbs for easy navigation
- OAuth authentication with automatic token refresh
- Includes agent skill and Claude plugin
- Includes agent skills plus native Claude Code and Codex plugins

## Quick Start

Expand Down Expand Up @@ -150,6 +150,16 @@ Both `BASECAMP_OAUTH_CLIENT_ID` and `BASECAMP_OAUTH_CLIENT_SECRET` must be set t

**Claude Code:** `basecamp setup claude` — installs the plugin with skills, hooks, and agent workflow support.

**Codex:** `basecamp setup codex` — registers the 37signals marketplace and installs the native plugin with Basecamp skills, diagnostics, and opt-in hooks. Start a new Codex thread afterward, then review and trust the hooks with `/hooks`.

Manual Codex installation uses the same marketplace:

```bash
codex plugin marketplace add basecamp/claude-plugins --json || \
codex plugin marketplace upgrade 37signals --json
codex plugin add basecamp@37signals --json
```

**Other agents:** Point your agent at [`skills/basecamp/SKILL.md`](skills/basecamp/SKILL.md) for Basecamp workflow coverage.

**Agent discovery:** Every command supports `--help --agent` for structured JSON output (flags, gotchas, subcommands). Use `basecamp commands --json` for the full catalog.
Expand Down Expand Up @@ -180,6 +190,7 @@ See [install.md](install.md) for step-by-step setup instructions.
```bash
basecamp doctor # Check CLI health and diagnose issues
basecamp doctor --verbose # Verbose output with details
basecamp doctor --json # Structured checks, including Claude and Codex
```

## Development
Expand Down
3 changes: 2 additions & 1 deletion RELEASING.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ make release VERSION=0.2.0 DRY_RUN=1
1. Validates semver format, main branch, clean tree, synced with remote
2. Checks for `replace` directives in go.mod
3. Runs `make release-check` (quality checks, vuln scan, replace-check, race-test, surface compat)
4. Updates stable release metadata (`nix/package.nix` and `.claude-plugin/plugin.json`) for stable versions
4. Updates stable release metadata (`nix/package.nix`, `.claude-plugin/plugin.json`, and `.codex-plugin/plugin.json`) for stable versions
5. Creates annotated tag `v$VERSION` and pushes to origin
6. GitHub Actions [release workflow](.github/workflows/release.yml) runs:
- Security scan + full test suite + CLI surface compatibility check
Expand Down Expand Up @@ -58,6 +58,7 @@ manager channels and agent distribution metadata on the latest stable version.
| AUR | Updates the `basecamp-cli` package when `AUR_KEY` is configured. | The stable AUR package remains active. |
| Nix flake | Updates `nix/package.nix` and verifies the flake. | Nix metadata remains on the latest stable version. |
| Claude plugin metadata | Updates `.claude-plugin/plugin.json`. | Plugin metadata remains on the latest stable version. |
| Codex plugin metadata | Updates `.codex-plugin/plugin.json`. | Plugin metadata remains on the latest stable version. |
| Skills distribution | Syncs skills to the distribution repo. | Uses the skill embedded in the prerelease binary. |

The prerelease binary embeds the matching `skills/basecamp/SKILL.md`. Testers can
Expand Down
1 change: 1 addition & 0 deletions bin/ci
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
#!/usr/bin/env bash
set -euo pipefail
python3 scripts/check-codex-plugin.py
exec make check
1 change: 1 addition & 0 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ require (
golang.org/x/sys v0.47.0
golang.org/x/text v0.40.0
gopkg.in/yaml.v3 v3.0.1
mvdan.cc/sh/v3 v3.13.1
)

require (
Expand Down
6 changes: 6 additions & 0 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -87,10 +87,14 @@ github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f h1:Y/CXytFA4m6
github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f/go.mod h1:vw97MGsxSvLiUE2X8qFplwetxpGLQrlU1Q9AUEIzCaM=
github.com/fsnotify/fsnotify v1.10.1 h1:b0/UzAf9yR5rhf3RPm9gf3ehBPpf0oZKIjtpKrx59Ho=
github.com/fsnotify/fsnotify v1.10.1/go.mod h1:TLheqan6HD6GBK6PrDWyDPBaEV8LspOxvPSjC+bVfgo=
github.com/go-quicktest/qt v1.101.0 h1:O1K29Txy5P2OK0dGo59b7b0LR6wKfIhttaAhHUyn7eI=
github.com/go-quicktest/qt v1.101.0/go.mod h1:14Bz/f7NwaXPtdYEgzsx46kqSxVwTbzVZsDC26tQJow=
github.com/godbus/dbus/v5 v5.2.2 h1:TUR3TgtSVDmjiXOgAAyaZbYmIeP3DPkld3jgKGV8mXQ=
github.com/godbus/dbus/v5 v5.2.2/go.mod h1:3AAv2+hPq5rdnr5txxxRwiGjPXamgoIHgz9FPBfOp3c=
github.com/gofrs/flock v0.13.0 h1:95JolYOvGMqeH31+FC7D2+uULf6mG61mEZ/A8dRYMzw=
github.com/gofrs/flock v0.13.0/go.mod h1:jxeyy9R1auM5S6JYDBhDt+E2TCo7DkratH4Pgi8P+Z0=
github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/gorilla/css v1.0.1 h1:ntNaBIghp6JmvWnxbZKANoLyuXTPZ4cAMlo6RyhlbO8=
Expand Down Expand Up @@ -184,3 +188,5 @@ gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntN
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
mvdan.cc/sh/v3 v3.13.1 h1:DP3TfgZhDkT7lerUdnp6PTGKyxxzz6T+cOlY/xEvfWk=
mvdan.cc/sh/v3 v3.13.1/go.mod h1:lXJ8SexMvEVcHCoDvAGLZgFJ9Wsm2sulmoNEXGhYZD0=
30 changes: 30 additions & 0 deletions hooks/hooks.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
{
"hooks": {
"SessionStart": [
{
"matcher": "startup|resume|clear|compact",
"hooks": [
{
"type": "command",
"command": "basecamp codex-hook session-start",
"timeout": 5,
"statusMessage": "Checking Basecamp integration"
}
]
}
],
"PostToolUse": [
{
"matcher": "^Bash$",
"hooks": [
{
"type": "command",
"command": "basecamp codex-hook post-commit-check",
"timeout": 5,
"statusMessage": "Checking for Basecamp references"
}
]
}
]
}
}
22 changes: 22 additions & 0 deletions install.md
Original file line number Diff line number Diff line change
Expand Up @@ -120,6 +120,28 @@ basecamp setup claude

This registers the marketplace and installs the plugin with skills, hooks, and agent workflow support.

### Codex

```bash
basecamp setup codex
```

This installs the shared Basecamp skill, registers the 37signals Codex marketplace, and installs the native plugin. Start a new Codex thread after setup, then review and trust the plugin hooks with `/hooks`.

For a manual install:

```bash
codex plugin marketplace add basecamp/claude-plugins --json || \
codex plugin marketplace upgrade 37signals --json
codex plugin add basecamp@37signals --json
```

Verify either agent integration with structured diagnostics:

```bash
basecamp doctor --json
```

### Other Agents

Point your agent at the skill file for full Basecamp workflow coverage:
Expand Down
1 change: 1 addition & 0 deletions internal/cli/root.go
Original file line number Diff line number Diff line change
Expand Up @@ -342,6 +342,7 @@ func Execute() {
cmd.AddCommand(commands.NewNotificationsCmd())
cmd.AddCommand(commands.NewTUICmd())
cmd.AddCommand(commands.NewBonfireCmd())
cmd.AddCommand(commands.NewCodexHookCmd())

// Use ExecuteC to get the executed command (for correct context access)
executedCmd, err := cmd.ExecuteC()
Expand Down
Loading
Loading