7.9 KiB
id, title, status, wave, depends_on, plan, requirements, acceptance_criteria, system_design
| id | title | status | wave | depends_on | plan | requirements | acceptance_criteria | system_design | |||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 15-codehost-settings | Expose code-host integration settings | done | 15 |
|
plan.md |
|
|
|
Task 15: Expose code-host integration settings
Summary
Deliver the domain through the shared settings tools and authorized resource lookup. Include its complete eligible field set, current UI result, and independent contract checks.
In scope
- Adopt GitHub, GitLab, and Azure DevOps workspace defaults, repository scope, presets, and watch configuration.
- Keep personal saved-query preferences in user settings and provider workspace settings in their domain.
- Preserve credential generation, provider-host identity, repository scope, and authorized watch references.
- Exclude account enrollment, token operations, remote issue/PR mutations, and immediate watch execution.
- Retain domain cache/event behavior and reconcile each provider's settings and watch editor.
- Register metadata, context schemas, typed updates, redacted reads, and authorized lookup in the production composition.
- Add domain aliases to the independent search-query suite and update the generated snapshots.
- Include shared DTO conversion, semantic validation, and required atomic patch behavior for every write interface.
- Use current domain events, or add scoped value-free invalidation when none exists.
- Add coverage bindings and scoped editor tests. Update
docs/public/automation-and-mcp.mdwith delivered behavior.
Out of scope
- New persistence owners, arbitrary database access, privilege changes, and unrelated lifecycle operations.
- Automatic merging of dirty drafts, new navigation layouts, and real provider credentials in tests.
Acceptance
- Registered MCP calls match the existing UI contract for every eligible field, including explicit empties and domain-specific errors.
- Unauthorized, invalid, and conflicting changes preserve invariants without partial writes or sensitive output. New atomic patches cover competing writers.
- Clean editors update live and survive reload. Dirty drafts survive until recovery, on desktop and phone.
Verification
Run from the repository root after the one-time workspace dependency install in Task 00. These new test paths and names are planned implementation outputs, not existing evidence.
rtk proxy go -C apps/backend test ./internal/github ./internal/gitlab ./internal/azuredevops ./internal/mcp/server ./internal/mcp/handlers
rtk proxy go -C apps/backend run ./cmd/settings-catalog --check
rtk pnpm --dir apps/web exec vitest run lib/settings-discovery/codehost-settings-contract.test.ts components/settings/codehost-settings-reconciliation.test.tsx
rtk pnpm --dir apps/web run typecheck
rtk pnpm --dir apps/web run i18n:check
rtk pnpm --dir apps/web e2e:run --project chromium tests/settings/codehost-settings-mcp.spec.ts
rtk pnpm --dir apps/web e2e:run --project mobile-chrome tests/settings/mobile-codehost-settings-mcp.spec.ts
rtk node scripts/validate-public-docs.mjs
rtk git diff --check
Add TestCodeHostSettingsParity and TestCodeHostSettingsAuthority in
apps/backend/internal/mcp/server/settings_codehost_settings_test.go.
Use real registered tools plus domain fixtures, not only direct handler invocation.
Add domain tests for any changed persistence path, including rollback and concurrent updates.
When a SQL query changes, include SQLite/PostgreSQL behavior evidence under the existing domain test conventions.
E2E scenario
Update a scope or preset and a watch fixture for each provider, observe the UI, and prove cross-workspace isolation. Use disposable resources and mock providers. Restore user-level settings in cleanup, including after failures. Run desktop and phone separately with the managed runner and record discovered test counts.
Files likely touched
apps/backend/internal/github/workspace_settings_service.goapps/backend/internal/github/models.goapps/backend/internal/gitlab/service_config.goapps/backend/internal/gitlab/watch_models.goapps/backend/internal/azuredevops/workspace_settings.goapps/backend/internal/azuredevops/watch_service.goapps/backend/internal/{github,gitlab,azuredevops}/settings_catalog.go (new)apps/web/app/settings/integrations/apps/backend/internal/backendapp/services.goand MCP handler composition.apps/backend/internal/mcp/server/settings_codehost_settings_test.go(new).apps/web/lib/settings-discovery/codehost-settings-contract.test.ts(new).apps/web/components/settings/codehost-settings-reconciliation.test.tsx(new): clean updates, dirty conflicts, own acknowledgements, and late replies.apps/web/lib/settings-discovery/coverage-inventory.tsand generated snapshots.- Relevant domain store subscriptions, current editor state, and locale catalogs.
- The two E2E files named in Verification.
Dependencies
Task 14 completes the preceding slice. Tasks 00 through 04 establish inventory, schemas, generic tools, and draft-recovery behavior. The sequential order avoids conflicts in shared composition and generated snapshots.
Risks
- Provider identity and workspace scope are authorization boundaries. A settings update cannot borrow another workspace's credential context.
- Saved settings and active runtime state can differ. Responses must not claim an unobserved runtime change.
- Missing identity can look like an internal service caller. MCP must reject that case under enforced authentication.
Mobile contract
Reuse the current domain settings route, shared save contributor, and existing phone composition. Keep recovery inline with the existing discard action, one content scroll owner, and safe-area-aware controls. Prove touch access and no horizontal page overflow. No new modal or breakpoint layout is required.
Parallelism
sequential
Inputs
- Both system designs, especially Required domains, Mutation semantics, Relationships, and Visible results.
- Task 00's field inventory and each source contract listed above.
- Existing domain tests, profile parity tests, and nearby shipped settings E2E.
- Scoped AGENTS.md, /tdd, /mobile-parity, /e2e, and /docs-maintainer before implementation.
Results
Completed on 2026-09-09.
- Registered GitHub, GitLab, Azure DevOps, and code-host watch settings.
- Routed noncredential fields through provider-owned integration services with workspace authorization.
- Preserved connection identity and secret boundaries and covered provider adapters in backend tests.