Files
kandev/docs/plans/bitbucket-plugin/task-07-provider-neutral-git-credentials.md
T
2026-08-24 11:09:03 +00:00

72 lines
3.1 KiB
Markdown

---
id: "07-provider-neutral-git-credentials"
title: "Provider-neutral Git credential broker"
status: completed
wave: 2
depends_on: ["01-design-package", "03-protocol-manifest-actions"]
plan: "plan.md"
spec: "../../specs/integrations/requirements/bitbucket-plugin.md"
---
# Task 07: Provider-neutral Git credential broker
## Intent
Extract generic broker lease mechanics, retain GitHub via adapter, and route plugin
credential resolution through scoped opaque helper leases for clone/fetch/push.
## Owned paths
- `apps/backend/internal/gitcredentials/`
- `apps/backend/internal/github/credential_broker.go`
- `apps/backend/internal/repoclone/clone.go`
- `apps/backend/internal/repoclone/protocol.go`
- `apps/backend/internal/orchestrator/executor/executor.go`
- `apps/backend/internal/orchestrator/executor/executor_credentials.go`
- `apps/backend/internal/orchestrator/executor/executor_execute.go`
- `apps/backend/internal/agent/runtime/lifecycle/remote_github_env.go`
- `apps/backend/internal/agent/runtime/lifecycle/broker_reachability.go`
- `apps/backend/internal/backendapp/orchestrator.go`
- Focused `internal/gitcredentials`, clone, executor, and lifecycle tests.
## Dependencies
Tasks 01 and 03.
## Acceptance
1. Composite resolver supports arbitrary manifest-declared provider IDs and optional
plugin credential RPCs while retaining current GitHub behavior unchanged.
2. Leases bind exact workspace/task/session/repository/host/path, expire/revoke on all
required lifecycle changes, re-resolve after OAuth refresh, and use HTTPS for remote
executor broker transport.
3. Clone/fetch/push preserve `RepositoryCloneURL` precedence and leave no credential in
URLs, task state, logs, environment, command arguments, or executor payloads.
4. Initial host clone requests carry exact task, active-session, and persisted-repository
scope through the orchestrator and workspace-source materializer. Plugin providers
reject missing scope; GitHub legacy behavior remains unchanged.
5. Pre-worktree refresh for plugin providers uses the same exact scope, is strict, and
suppresses every later unauthenticated fetch/pull while consuming refreshed refs.
## Verification
```sh
cd apps/backend && go test ./internal/gitcredentials ./internal/github ./internal/repoclone ./internal/orchestrator/executor ./internal/agent/runtime/lifecycle
cd apps/backend && go test ./internal/backendapp ./internal/orchestrator/executor ./internal/repoclone
make -C apps/backend lint
```
## Risks
Credential leakage and scope confusion are security failures. Treat host/path mismatch,
disabled plugin, expired lease, and unsupported resolver as deny-by-default.
## Completed verification (2026-08-06)
- Focused clone, worktree, executor, lifecycle, and backend-app suites passed, including
strict exact-scope refresh and no-network-after-refresh regressions.
- `make -C apps/backend lint` passed (with only the known stale external-worktree filter
warning).
- A live Bitbucket Cloud task prepared in 16 ms with only `git checkout`, performed no
second unauthenticated fetch, launched Codex, and reached `WAITING_FOR_INPUT` with `OK`.