Part of #1011 — implements U7 of docs/plans/2026-07-30-001-feat-teams-plan.md. Depends on U5.
Goal
View, select, create, and update teams from the native macapp.
Scope
ClientTeams.swift extends HarnessClient (macapp/Sources/HarnessKit/HarnessClient.swift:265-344) with list/get/put/selection calls; Decodable structs with explicit snake_case CodingKeys, mirroring ClientModelSettings.swift, built against U5's wire-contract fixtures.
- New
teams Tab case + TeamsTab view in macapp/Sources/GoCodeUI/SettingsView.swift (Tab enum at :8): team list with tier badges, roster detail, selected-team picker, a New Team action opening an empty editor, and a team editor whose roster is an editable list (add-member row, per-row delete; per-member name, description, profile picked from the existing profiles list) plus a top_level_tools field so GUI round-trips preserve the top-level allowlist policy. Saving PUTs the team.
- Builtins render read-only with an "edit a copy" affordance matching U5 shadowing semantics.
Files
macapp/Sources/GoCodeUI/SettingsView.swift, macapp/Sources/HarnessKit/ClientTeams.swift (new), macapp/Tests/ (client decode tests)
Test scenarios
- Client decodes list/get/selection responses (fixture JSON from U5's wire contract)
- PUT encodes with correct snake_case keys,
top_level_tools round-trips intact
- Creating a new team with one member PUTs it; it lists with tier
project
- UI smoke: selecting a team updates the selection endpoint; editing a builtin creates a project-tier shadow
Verification
swift test in macapp/ green; manual app smoke against a local harnessd.
Part of #1011 — implements U7 of
docs/plans/2026-07-30-001-feat-teams-plan.md. Depends on U5.Goal
View, select, create, and update teams from the native macapp.
Scope
ClientTeams.swiftextendsHarnessClient(macapp/Sources/HarnessKit/HarnessClient.swift:265-344) with list/get/put/selection calls;Decodablestructs with explicit snake_caseCodingKeys, mirroringClientModelSettings.swift, built against U5's wire-contract fixtures.teamsTab case +TeamsTabview inmacapp/Sources/GoCodeUI/SettingsView.swift(Tabenum at:8): team list with tier badges, roster detail, selected-team picker, a New Team action opening an empty editor, and a team editor whose roster is an editable list (add-member row, per-row delete; per-member name, description, profile picked from the existing profiles list) plus atop_level_toolsfield so GUI round-trips preserve the top-level allowlist policy. Saving PUTs the team.Files
macapp/Sources/GoCodeUI/SettingsView.swift,macapp/Sources/HarnessKit/ClientTeams.swift(new),macapp/Tests/(client decode tests)Test scenarios
top_level_toolsround-trips intactprojectVerification
swift testinmacapp/green; manual app smoke against a local harnessd.