Skip to content
1 change: 1 addition & 0 deletions .surface
Original file line number Diff line number Diff line change
Expand Up @@ -13345,6 +13345,7 @@ FLAG basecamp setup agents --no-stats type=bool
FLAG basecamp setup agents --profile type=string
FLAG basecamp setup agents --project type=string
FLAG basecamp setup agents --quiet type=bool
FLAG basecamp setup agents --remove type=bool
FLAG basecamp setup agents --stats type=bool
FLAG basecamp setup agents --styled type=bool
FLAG basecamp setup agents --todolist type=string
Expand Down
13 changes: 13 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -302,6 +302,19 @@ To pick up a newer plugin version later, refresh the marketplace with

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

To remove the Basecamp-managed shared skill and coding-agent plugins without
removing Basecamp authentication, configuration, or data, run:

```bash
basecamp setup agents --remove
```

The command leaves user-authored skill directories and additional files alone.
It also keeps the `37signals` marketplace registration in Claude, which may serve
other plugins; remove it yourself with `claude plugin marketplace remove 37signals`.
The command uses the `codex` binary to inspect and remove the Codex plugin, so
that binary must still be installed.

**Agent discovery:** Every command supports `--help --agent` for structured JSON output (flags, gotchas, subcommands). Use `basecamp commands --json` for the full catalog.

See [install.md](install.md) for step-by-step setup instructions.
Expand Down
4 changes: 4 additions & 0 deletions internal/appctx/context.go
Original file line number Diff line number Diff line change
Expand Up @@ -277,6 +277,10 @@ func (a *App) OK(data any, opts ...output.ResponseOption) error {
func (a *App) Err(err error) error {
// Determine if we should include stats
var opts []output.ErrorResponseOption
var carrier output.ErrorMetaProvider
if errors.As(err, &carrier) {
opts = append(opts, output.WithErrorMeta(carrier.ErrorMetadata()))
}
if a.shouldIncludeStatsInError() {
stats := a.Collector.Summary()
opts = append(opts, output.WithErrorStats(&stats))
Expand Down
Loading
Loading