--- id: "15-codehost-settings" title: "Expose code-host integration settings" status: done wave: 15 depends_on: - "14-issue-integration-settings" plan: "plan.md" requirements: - REQ-PLATFORM-AGENT-SETTINGS-PARITY-003 - REQ-PLATFORM-AGENT-SETTINGS-PARITY-004 - REQ-PLATFORM-AGENT-SETTINGS-PARITY-005 - REQ-PLATFORM-AGENT-SETTINGS-PARITY-006 - REQ-PLATFORM-AGENT-SETTINGS-PARITY-007 - REQ-PLATFORM-AGENT-SETTINGS-PARITY-008 - REQ-PLATFORM-AGENT-SETTINGS-PARITY-009 acceptance_criteria: - AC-PLATFORM-AGENT-SETTINGS-PARITY-006.8 - AC-PLATFORM-AGENT-SETTINGS-PARITY-003.1 - AC-PLATFORM-AGENT-SETTINGS-PARITY-003.2 - AC-PLATFORM-AGENT-SETTINGS-PARITY-003.3 - AC-PLATFORM-AGENT-SETTINGS-PARITY-003.5 - AC-PLATFORM-AGENT-SETTINGS-PARITY-004.1 - AC-PLATFORM-AGENT-SETTINGS-PARITY-004.2 - AC-PLATFORM-AGENT-SETTINGS-PARITY-004.3 - AC-PLATFORM-AGENT-SETTINGS-PARITY-004.4 - AC-PLATFORM-AGENT-SETTINGS-PARITY-004.5 - AC-PLATFORM-AGENT-SETTINGS-PARITY-005.1 - AC-PLATFORM-AGENT-SETTINGS-PARITY-005.2 - AC-PLATFORM-AGENT-SETTINGS-PARITY-005.3 - AC-PLATFORM-AGENT-SETTINGS-PARITY-005.5 - AC-PLATFORM-AGENT-SETTINGS-PARITY-007.2 - AC-PLATFORM-AGENT-SETTINGS-PARITY-007.3 - AC-PLATFORM-AGENT-SETTINGS-PARITY-007.5 - AC-PLATFORM-AGENT-SETTINGS-PARITY-008.1 - AC-PLATFORM-AGENT-SETTINGS-PARITY-008.2 - AC-PLATFORM-AGENT-SETTINGS-PARITY-008.3 - AC-PLATFORM-AGENT-SETTINGS-PARITY-008.4 - AC-PLATFORM-AGENT-SETTINGS-PARITY-008.5 - AC-PLATFORM-AGENT-SETTINGS-PARITY-008.6 - AC-PLATFORM-AGENT-SETTINGS-PARITY-009.2 - AC-PLATFORM-AGENT-SETTINGS-PARITY-009.3 system_design: - ../../specs/platform/system-design/agent-settings-parity.md - ../../specs/platform/system-design/agent-settings-domains.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.md` with 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. ```bash 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.go` - `apps/backend/internal/github/models.go` - `apps/backend/internal/gitlab/service_config.go` - `apps/backend/internal/gitlab/watch_models.go` - `apps/backend/internal/azuredevops/workspace_settings.go` - `apps/backend/internal/azuredevops/watch_service.go` - `apps/backend/internal/{github,gitlab,azuredevops}/settings_catalog.go (new)` - `apps/web/app/settings/integrations/` - `apps/backend/internal/backendapp/services.go` and 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.ts` and 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.