Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
37 commits
Select commit Hold shift + click to select a range
8b3509c
auth: adopt resource-first OAuth discovery and RFC 8628 device flow
jeremy Jul 16, 2026
31c207e
auth: cover device flow, discovery fallbacks, and refresh behavior
jeremy Jul 16, 2026
3eb4125
docs: describe device-flow login and retire client.json references
jeremy Jul 16, 2026
b0f2337
auth: harden device display boundary; cover profile --device-code map…
jeremy Jul 16, 2026
1c611dc
go: drop stale SDK pseudo-version go.sum entries left by restack
jeremy Jul 28, 2026
25590c8
auth: persist and echo the RFC 8707 resource indicator across refreshes
jeremy Jul 28, 2026
200e50c
auth: canonicalize the resource origin; restack onto keyring-probe main
jeremy Jul 28, 2026
a2b4e96
go: pin the SDK at oauth-resource-indicator 819c0b86
jeremy Jul 28, 2026
9d6a531
go: pin the SDK at oauth-resource-indicator e9469832
jeremy Jul 28, 2026
18adab7
go: pin the SDK at oauth-resource-indicator 298ad8e4
jeremy Jul 28, 2026
470d0c4
go: pin the SDK at oauth-resource-indicator fd2ff934
jeremy Jul 28, 2026
afd489e
go: pin the SDK at oauth-resource-indicator 5645f897
jeremy Jul 28, 2026
bd77636
go: pin the SDK at oauth-resource-indicator 9c4cc6d6
jeremy Jul 28, 2026
5f3858e
go: pin the SDK at oauth-resource-indicator b63b12e9
jeremy Jul 28, 2026
8fa8540
go: pin the SDK at oauth-resource-indicator e421ea9f
jeremy Jul 28, 2026
71fd239
go: pin the SDK at oauth-resource-indicator 329d2278
jeremy Jul 28, 2026
a1df2b2
go: pin the SDK at oauth-resource-indicator e3e0ea5c
jeremy Jul 28, 2026
1cf51e0
go: pin the SDK at oauth-resource-indicator 0bdb14ac
jeremy Jul 28, 2026
fae9fda
go: pin the SDK at oauth-resource-indicator 05cc9f78
jeremy Jul 28, 2026
4e61d3e
auth: match loopback hosts case-insensitively in isSecureEndpointURL
jeremy Jul 29, 2026
6bbe677
docs: state the real Launchpad fallback boundary
jeremy Jul 29, 2026
7c16cd2
go: pin the SDK at oauth-resource-indicator 59358c11
jeremy Jul 29, 2026
46b2423
auth: name every constraint in the endpoint-validation error
jeremy Jul 29, 2026
cc25654
go: pin the SDK at oauth-resource-indicator c55e9f3a
jeremy Jul 29, 2026
1a256ac
go: pin the SDK at oauth-resource-indicator ac79e227
jeremy Jul 29, 2026
5952d45
go: pin the SDK at oauth-resource-indicator 602f7247
jeremy Jul 29, 2026
4317c10
auth: build the authorization-info URL from the resource origin
jeremy Jul 29, 2026
7ba2cb5
go: pin the SDK at oauth-resource-indicator e6112812
jeremy Jul 29, 2026
3d2400e
go: pin the SDK at oauth-resource-indicator 145c0010
jeremy Jul 29, 2026
d743da7
go: pin the SDK at oauth-resource-indicator 351266ea
jeremy Jul 29, 2026
0e69d5c
go: pin the SDK at oauth-resource-indicator 644129714
jeremy Jul 29, 2026
34f8fce
go: pin the SDK at oauth-resource-indicator 02ea83bf4
jeremy Jul 29, 2026
8b7da34
go: pin the SDK at oauth-resource-indicator 4b524ed1d
jeremy Jul 29, 2026
e8f4e51
go: pin the SDK at oauth-resource-indicator 916b4297b
jeremy Jul 29, 2026
964273e
go: pin the SDK at oauth-resource-indicator 7e924c0df
jeremy Jul 29, 2026
9f2dbd5
go: pin the SDK at oauth-resource-indicator 1b3e9a037
jeremy Jul 29, 2026
2252fc1
go: pin the SDK at the merged OAuth stack (9480aa4c84b8)
jeremy Jul 29, 2026
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
15 changes: 11 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -111,12 +111,17 @@ Breadcrumbs suggest next commands, making it easy for humans and agents to navig

## Authentication

OAuth 2.1 with automatic token refresh. First login opens your browser:
OAuth 2.1 with automatic token refresh. First login opens your browser.
When the server advertises the OAuth device flow, login uses it
automatically: you approve a short code in the browser instead of a
redirect. Login falls back to Launchpad's authorization-code flow only when
no modern OAuth issuer is advertised for the server; once a modern issuer is
selected, login failures surface loudly rather than silently falling back.

```bash
basecamp auth login # Authenticate with Basecamp
basecamp auth login --scope read # Read-only access (BC3 OAuth only, default)
basecamp auth login --scope full # Full read+write access (BC3 OAuth only)
basecamp auth login --scope read # Read-only access (default; ignored by Launchpad)
basecamp auth login --scope full # Full read+write access (ignored by Launchpad)
basecamp auth token # Print token for scripts
```

Expand Down Expand Up @@ -175,7 +180,6 @@ See [install.md](install.md) for step-by-step setup instructions.
```
~/.config/basecamp/ # Your Basecamp identity
├── credentials.json # OAuth tokens (fallback when keyring unavailable)
├── client.json # DCR client registration
└── config.json # Global preferences

~/.config/basecamp/theme/ # Tool display (optional)
Expand All @@ -189,6 +193,9 @@ See [install.md](install.md) for step-by-step setup instructions.
└── config.json # Project, account defaults
```

A leftover `~/.config/basecamp/client.json` (from the removed development
client-registration flow) is obsolete and safe to delete.

## Troubleshooting

```bash
Expand Down
14 changes: 14 additions & 0 deletions e2e/auth.bats
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,20 @@ load test_helper
assert_output_contains "--device-code"
}

@test "basecamp auth login --help describes flags provider-neutrally" {
run basecamp auth login --help
assert_success
assert_output_contains "Headless authentication with manual browser instructions"
assert_output_contains "ignored by Launchpad"
}

@test "basecamp profile create --help describes flags provider-neutrally" {
run basecamp profile create --help
assert_success
assert_output_contains "Headless authentication with manual browser instructions"
assert_output_contains "ignored by Launchpad"
}

@test "basecamp auth login rejects --device-code --local" {
run basecamp auth login --device-code --local
assert_failure
Expand Down
2 changes: 1 addition & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ require (
charm.land/bubbles/v2 v2.1.1
charm.land/bubbletea/v2 v2.0.8
charm.land/lipgloss/v2 v2.0.5
github.com/basecamp/basecamp-sdk/go v0.10.0
github.com/basecamp/basecamp-sdk/go v0.10.1-0.20260729233651-9480aa4c84b8
github.com/basecamp/cli v0.2.2-0.20260728023309-04e401b12c6c
github.com/charmbracelet/bubbles v1.0.0
github.com/charmbracelet/glamour v1.0.0
Expand Down
4 changes: 2 additions & 2 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,8 @@ github.com/aymanbagabas/go-udiff v0.4.1 h1:OEIrQ8maEeDBXQDoGCbbTTXYJMYRCRO1fnodZ
github.com/aymanbagabas/go-udiff v0.4.1/go.mod h1:0L9PGwj20lrtmEMeyw4WKJ/TMyDtvAoK9bf2u/mNo3w=
github.com/aymerick/douceur v0.2.0 h1:Mv+mAeH1Q+n9Fr+oyamOlAkUNPWPlA8PPGR0QAaYuPk=
github.com/aymerick/douceur v0.2.0/go.mod h1:wlT5vV2O3h55X9m7iVYN0TBM0NH/MmbLnd30/FjWUq4=
github.com/basecamp/basecamp-sdk/go v0.10.0 h1:5mK+2Z2XmFCVWsl1pIxdOAF45M47gWtr0+/zgCZgFtY=
github.com/basecamp/basecamp-sdk/go v0.10.0/go.mod h1:r83ralDQ0q9vbAby5qQ5x9hgCgUdJLDLHYpiU6jaFjE=
github.com/basecamp/basecamp-sdk/go v0.10.1-0.20260729233651-9480aa4c84b8 h1:M4vBBDNYkS8XtwZ4q8TIhR4c8F8h/4Lk2QIqx2s/A5w=
github.com/basecamp/basecamp-sdk/go v0.10.1-0.20260729233651-9480aa4c84b8/go.mod h1:r83ralDQ0q9vbAby5qQ5x9hgCgUdJLDLHYpiU6jaFjE=
github.com/basecamp/cli v0.2.2-0.20260728023309-04e401b12c6c h1:+5sQBl8sqYoD1Qhwsibn8sBCKWPyZ9NDez6mnuo9Afo=
github.com/basecamp/cli v0.2.2-0.20260728023309-04e401b12c6c/go.mod h1:EK1Dba6DEw8ZAilVBpf/jri3ONDV7LQkLACSDe73f/c=
github.com/bmatcuk/doublestar v1.1.1/go.mod h1:UD6OnuiIn0yFxxA2le/rnRU1G4RaI4UvFv1sNto9p6w=
Expand Down
Loading
Loading