Skip to content

Commit d7ce1ec

Browse files
ibuyspyCopilotCopilot
authored
Merge: align GitHub App org-admin handoff artifacts (#1142) (#1144)
* Initial plan * docs(extension): align issue 1073 app handoff checklist and secrets Agent-Logs-Url: https://github.com/IBuySpy-Shared/basecoat/sessions/89ab8e91-2be6-43f8-8776-f5c4d03ccbd4 * docs(extension): clarify requiredMetadata handoff intent Agent-Logs-Url: https://github.com/IBuySpy-Shared/basecoat/sessions/89ab8e91-2be6-43f8-8776-f5c4d03ccbd4 --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
1 parent 24b82d1 commit d7ce1ec

4 files changed

Lines changed: 49 additions & 45 deletions

File tree

docs/operations/COPILOT_EXTENSION_GITHUB_APP_REGISTRATION.md

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -24,14 +24,13 @@ Use these baseline settings when creating the App:
2424

2525
### Repository Permissions
2626

27-
- Contents: **Read-only**
28-
- Pull requests: **Read and write**
29-
- Actions: **Read and write**
30-
- Metadata: **Read-only** (implicit)
27+
Grant these permissions exactly:
3128

32-
### Organization Permissions
29+
- `contents`: **read**
30+
- `pull_requests`: **write**
31+
- `actions`: **write**
3332

34-
- Members: **Read-only** (recommended for org-scoped eligibility checks)
33+
`metadata:read` remains implicit and does not require a separate grant.
3534

3635
### Subscribe to Events
3736

@@ -52,7 +51,7 @@ Use these baseline settings when creating the App:
5251

5352
## Validation Steps After Admin Work
5453

55-
1. Confirm App is installed on `IBuySpy-Shared`.
54+
1. Confirm App is installed on `IBuySpy-Shared` and installation scope is correct.
5655
2. Confirm extension endpoint responds at health route.
5756
3. Confirm OAuth callback succeeds for org member.
5857
4. Confirm `@basecoat` appears in Copilot Chat and routes a test prompt.

docs/templates/copilot-extension/github-app-registration.template.json

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,7 @@
1212
"actions": "write",
1313
"metadata": "read"
1414
},
15-
"organizationPermissions": {
16-
"members": "read"
17-
},
15+
"organizationPermissions": {},
1816
"events": [
1917
"pull_request",
2018
"pull_request_review",
@@ -29,9 +27,16 @@
2927
"BASECOAT_EXTENSION_WEBHOOK_SECRET",
3028
"BASECOAT_EXTENSION_PRIVATE_KEY_PEM"
3129
],
30+
"requiredMetadata": [
31+
"app_id",
32+
"client_id",
33+
"installation_id"
34+
],
3235
"notes": [
3336
"Do not commit generated credentials.",
3437
"Store credentials in org/repo secrets manager.",
35-
"Installation must target IBuySpy-Shared organization."
38+
"requiredMetadata lists non-secret values to share in issue #1073 closure evidence.",
39+
"Installation must target IBuySpy-Shared organization.",
40+
"Share App ID, Client ID, and Installation ID with maintainers for issue #1073 closure."
3641
]
3742
}

mcp/basecoat-extension/README.md

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -33,11 +33,11 @@ The Extension backend reads configuration from environment variables. All OAuth-
3333

3434
| Variable | Required | Description |
3535
|---|---|---|
36-
| `BASECOAT_EXTENSION_GITHUB_APP_ID` | Yes | GitHub App ID (from app registration) |
37-
| `BASECOAT_EXTENSION_GITHUB_CLIENT_ID` | Yes | GitHub OAuth client ID |
38-
| `BASECOAT_EXTENSION_GITHUB_CLIENT_SECRET` | Yes | GitHub OAuth client secret (vault-managed) |
36+
| `BASECOAT_EXTENSION_APP_ID` | Yes | GitHub App ID (from app registration) |
37+
| `BASECOAT_EXTENSION_CLIENT_ID` | Yes | GitHub OAuth client ID |
38+
| `BASECOAT_EXTENSION_CLIENT_SECRET` | Yes | GitHub OAuth client secret (vault-managed) |
3939
| `BASECOAT_EXTENSION_WEBHOOK_SECRET` | Yes | Webhook signature secret (vault-managed) |
40-
| `BASECOAT_EXTENSION_GITHUB_PRIVATE_KEY` | Yes | GitHub App private key in PEM format (vault-managed) |
40+
| `BASECOAT_EXTENSION_PRIVATE_KEY_PEM` | Yes | GitHub App private key in PEM format (vault-managed) |
4141

4242
### OAuth & Session Tuning
4343

@@ -69,11 +69,11 @@ The Extension backend reads configuration from environment variables. All OAuth-
6969

7070
```bash
7171
# Required: GitHub App credentials
72-
BASECOAT_EXTENSION_GITHUB_APP_ID=123456
73-
BASECOAT_EXTENSION_GITHUB_CLIENT_ID=Iv1.a1b2c3d4e5f6g7h8
74-
BASECOAT_EXTENSION_GITHUB_CLIENT_SECRET=ghp_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
72+
BASECOAT_EXTENSION_APP_ID=123456
73+
BASECOAT_EXTENSION_CLIENT_ID=Iv1.a1b2c3d4e5f6g7h8
74+
BASECOAT_EXTENSION_CLIENT_SECRET=ghp_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
7575
BASECOAT_EXTENSION_WEBHOOK_SECRET=whsec_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
76-
BASECOAT_EXTENSION_GITHUB_PRIVATE_KEY="-----BEGIN RSA PRIVATE KEY-----\nMIIEpAIBAAKCAQEA...\n-----END RSA PRIVATE KEY-----"
76+
BASECOAT_EXTENSION_PRIVATE_KEY_PEM="-----BEGIN RSA PRIVATE KEY-----\nMIIEpAIBAAKCAQEA...\n-----END RSA PRIVATE KEY-----"
7777

7878
# Optional: OAuth & session tuning
7979
BASECOAT_EXTENSION_OAUTH_STATE_TTL_MS=600000

mcp/basecoat-extension/scripts/bootstrap-credentials.ps1

Lines changed: 26 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -23,18 +23,18 @@ Prerequisites:
2323
- Azure CLI (az) authenticated with Key Vault permissions (optional, for production)
2424
2525
.PARAMETER AppId
26-
GitHub App ID. If not provided, reads from $env:BASECOAT_EXTENSION_GITHUB_APP_ID
26+
GitHub App ID. If not provided, reads from $env:BASECOAT_EXTENSION_APP_ID
2727
If not provided, script will prompt you to create app manually via GitHub UI.
2828
2929
.PARAMETER OrgName
3030
GitHub organization for app creation guidance. Default: IBuySpy-Shared (extracted from $Repo)
3131
Only used if credentials are missing (to show correct creation link).
3232
3333
.PARAMETER ClientId
34-
GitHub OAuth Client ID. If not provided, reads from $env:BASECOAT_EXTENSION_GITHUB_CLIENT_ID
34+
GitHub OAuth Client ID. If not provided, reads from $env:BASECOAT_EXTENSION_CLIENT_ID
3535
3636
.PARAMETER ClientSecret
37-
GitHub OAuth Client Secret. If not provided, reads from $env:BASECOAT_EXTENSION_GITHUB_CLIENT_SECRET
37+
GitHub OAuth Client Secret. If not provided, reads from $env:BASECOAT_EXTENSION_CLIENT_SECRET
3838
3939
.PARAMETER WebhookSecret
4040
GitHub webhook signature secret. If not provided, reads from $env:BASECOAT_EXTENSION_WEBHOOK_SECRET
@@ -58,9 +58,9 @@ PS> .\bootstrap-credentials.ps1
5858
5959
.EXAMPLE
6060
# Minimal interaction: set creds, no app creation
61-
PS> $env:BASECOAT_EXTENSION_GITHUB_APP_ID = "123456"
62-
PS> $env:BASECOAT_EXTENSION_GITHUB_CLIENT_ID = "Iv1.a1b2c3d4..."
63-
PS> $env:BASECOAT_EXTENSION_GITHUB_CLIENT_SECRET = "ghp_xxxxxxxx"
61+
PS> $env:BASECOAT_EXTENSION_APP_ID = "123456"
62+
PS> $env:BASECOAT_EXTENSION_CLIENT_ID = "Iv1.a1b2c3d4..."
63+
PS> $env:BASECOAT_EXTENSION_CLIENT_SECRET = "ghp_xxxxxxxx"
6464
PS> $env:BASECOAT_EXTENSION_WEBHOOK_SECRET = "whsec_xxxxxxxx"
6565
PS> $env:BASECOAT_EXTENSION_PRIVATE_KEY_PATH = "./private-key.pem"
6666
PS> .\bootstrap-credentials.ps1
@@ -82,13 +82,13 @@ Updated: Bootstrap with auto-create GitHub App capability
8282

8383
param(
8484
[Parameter(Mandatory = $false)]
85-
[string]$AppId = $env:BASECOAT_EXTENSION_GITHUB_APP_ID,
85+
[string]$AppId = $env:BASECOAT_EXTENSION_APP_ID ?? $env:BASECOAT_EXTENSION_GITHUB_APP_ID,
8686

8787
[Parameter(Mandatory = $false)]
88-
[string]$ClientId = $env:BASECOAT_EXTENSION_GITHUB_CLIENT_ID,
88+
[string]$ClientId = $env:BASECOAT_EXTENSION_CLIENT_ID ?? $env:BASECOAT_EXTENSION_GITHUB_CLIENT_ID,
8989

9090
[Parameter(Mandatory = $false)]
91-
[string]$ClientSecret = $env:BASECOAT_EXTENSION_GITHUB_CLIENT_SECRET,
91+
[string]$ClientSecret = $env:BASECOAT_EXTENSION_CLIENT_SECRET ?? $env:BASECOAT_EXTENSION_GITHUB_CLIENT_SECRET,
9292

9393
[Parameter(Mandatory = $false)]
9494
[string]$WebhookSecret = $env:BASECOAT_EXTENSION_WEBHOOK_SECRET,
@@ -163,9 +163,9 @@ function Show-AppCreationGuide {
163163
Write-Host " 4. Download private key (PEM format)" -ForegroundColor Cyan
164164
Write-Host ""
165165
Write-Host " 5. Run bootstrap with credentials:" -ForegroundColor Cyan
166-
Write-Host " `$env:BASECOAT_EXTENSION_GITHUB_APP_ID = 'YOUR_APP_ID'" -ForegroundColor Green
167-
Write-Host " `$env:BASECOAT_EXTENSION_GITHUB_CLIENT_ID = 'YOUR_CLIENT_ID'" -ForegroundColor Green
168-
Write-Host " `$env:BASECOAT_EXTENSION_GITHUB_CLIENT_SECRET = 'YOUR_CLIENT_SECRET'" -ForegroundColor Green
166+
Write-Host " `$env:BASECOAT_EXTENSION_APP_ID = 'YOUR_APP_ID'" -ForegroundColor Green
167+
Write-Host " `$env:BASECOAT_EXTENSION_CLIENT_ID = 'YOUR_CLIENT_ID'" -ForegroundColor Green
168+
Write-Host " `$env:BASECOAT_EXTENSION_CLIENT_SECRET = 'YOUR_CLIENT_SECRET'" -ForegroundColor Green
169169
Write-Host " `$env:BASECOAT_EXTENSION_WEBHOOK_SECRET = 'YOUR_WEBHOOK_SECRET'" -ForegroundColor Green
170170
Write-Host " `$env:BASECOAT_EXTENSION_PRIVATE_KEY_PATH = './private-key.pem'" -ForegroundColor Green
171171
Write-Host " .\bootstrap-credentials.ps1" -ForegroundColor Green
@@ -185,19 +185,19 @@ if (-not $AppId -and (-not $ClientId -or -not $ClientSecret -or -not $WebhookSec
185185

186186
# Validate that credentials are provided (either via params or env vars)
187187
$missingCredentials = @()
188-
if (-not $AppId) { $missingCredentials += "AppId (set env var BASECOAT_EXTENSION_GITHUB_APP_ID or pass -AppId)" }
189-
if (-not $ClientId) { $missingCredentials += "ClientId (set env var BASECOAT_EXTENSION_GITHUB_CLIENT_ID or pass -ClientId)" }
190-
if (-not $ClientSecret) { $missingCredentials += "ClientSecret (set env var BASECOAT_EXTENSION_GITHUB_CLIENT_SECRET or pass -ClientSecret)" }
188+
if (-not $AppId) { $missingCredentials += "AppId (set env var BASECOAT_EXTENSION_APP_ID or pass -AppId)" }
189+
if (-not $ClientId) { $missingCredentials += "ClientId (set env var BASECOAT_EXTENSION_CLIENT_ID or pass -ClientId)" }
190+
if (-not $ClientSecret) { $missingCredentials += "ClientSecret (set env var BASECOAT_EXTENSION_CLIENT_SECRET or pass -ClientSecret)" }
191191
if (-not $WebhookSecret) { $missingCredentials += "WebhookSecret (set env var BASECOAT_EXTENSION_WEBHOOK_SECRET or pass -WebhookSecret)" }
192192

193193
if ($missingCredentials.Count -gt 0) {
194194
Write-Error-Custom "Missing required credentials:"
195195
$missingCredentials | ForEach-Object { Write-Host " - $_" -ForegroundColor Red }
196196
Write-Host ""
197197
Write-Info "To bootstrap with smart defaults, set these environment variables:"
198-
Write-Host " `$env:BASECOAT_EXTENSION_GITHUB_APP_ID = '...'"
199-
Write-Host " `$env:BASECOAT_EXTENSION_GITHUB_CLIENT_ID = '...'"
200-
Write-Host " `$env:BASECOAT_EXTENSION_GITHUB_CLIENT_SECRET = '...'"
198+
Write-Host " `$env:BASECOAT_EXTENSION_APP_ID = '...'"
199+
Write-Host " `$env:BASECOAT_EXTENSION_CLIENT_ID = '...'"
200+
Write-Host " `$env:BASECOAT_EXTENSION_CLIENT_SECRET = '...'"
201201
Write-Host " `$env:BASECOAT_EXTENSION_WEBHOOK_SECRET = '...'"
202202
Write-Host " `$env:BASECOAT_EXTENSION_PRIVATE_KEY_PATH = './private-key.pem' (optional; defaults to ./private-key.pem)"
203203
Write-Host ""
@@ -215,20 +215,20 @@ $PrivateKey = Get-Content $PrivateKeyPath -Raw
215215
# Store in GitHub repository secrets (for CI/CD workflow)
216216
Write-Info "Storing credentials in GitHub repository secrets..."
217217
try {
218-
gh secret set BASECOAT_EXTENSION_GITHUB_APP_ID --body "$AppId" --repo "$Repo"
219-
Write-Status "Secret set: BASECOAT_EXTENSION_GITHUB_APP_ID"
218+
gh secret set BASECOAT_EXTENSION_APP_ID --body "$AppId" --repo "$Repo"
219+
Write-Status "Secret set: BASECOAT_EXTENSION_APP_ID"
220220

221-
gh secret set BASECOAT_EXTENSION_GITHUB_CLIENT_ID --body "$ClientId" --repo "$Repo"
222-
Write-Status "Secret set: BASECOAT_EXTENSION_GITHUB_CLIENT_ID"
221+
gh secret set BASECOAT_EXTENSION_CLIENT_ID --body "$ClientId" --repo "$Repo"
222+
Write-Status "Secret set: BASECOAT_EXTENSION_CLIENT_ID"
223223

224-
gh secret set BASECOAT_EXTENSION_GITHUB_CLIENT_SECRET --body "$ClientSecret" --repo "$Repo"
225-
Write-Status "Secret set: BASECOAT_EXTENSION_GITHUB_CLIENT_SECRET"
224+
gh secret set BASECOAT_EXTENSION_CLIENT_SECRET --body "$ClientSecret" --repo "$Repo"
225+
Write-Status "Secret set: BASECOAT_EXTENSION_CLIENT_SECRET"
226226

227227
gh secret set BASECOAT_EXTENSION_WEBHOOK_SECRET --body "$WebhookSecret" --repo "$Repo"
228228
Write-Status "Secret set: BASECOAT_EXTENSION_WEBHOOK_SECRET"
229229

230-
gh secret set BASECOAT_EXTENSION_GITHUB_PRIVATE_KEY --body "$PrivateKey" --repo "$Repo"
231-
Write-Status "Secret set: BASECOAT_EXTENSION_GITHUB_PRIVATE_KEY"
230+
gh secret set BASECOAT_EXTENSION_PRIVATE_KEY_PEM --body "$PrivateKey" --repo "$Repo"
231+
Write-Status "Secret set: BASECOAT_EXTENSION_PRIVATE_KEY_PEM"
232232
} catch {
233233
Write-Error-Custom "Failed to set GitHub secrets: $_"
234234
exit 1

0 commit comments

Comments
 (0)