Skip to content

feat(macapp): Teams settings pane + client #1018

Description

@dennisonbertram

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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or requestmediumMedium effort: 1-3 daysuxUser experience improvements

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions