feat(console): fleet config panel — switch by identity, roster filtered to members (ADR Part A slice 2) - #35
Merged
Conversation
…red to members (ADR Part A slice 2) Backend slice 1 (#34) taught oab-mcp's fleet_config to report each fleet's members. This wires the console (Part A slice 2 of the fleet-grouping ADR): - **Switch by fleet identity, not cluster.** A fleet is a usage-based group, so two fleets can share a cluster (orca + mira on `oab`). The config panel's switch key moves from `data-cluster` to `data-fleet` (name); `FleetConfigEntry` gains `members`. Selecting a fleet derives the cluster it reads from and the member set it filters by. - **Roster filtered to the fleet's members.** New pure `filterByMembers` keeps only deployments whose ECS service name (`oab-{ns}-{name}`) or short name is a member — mirroring studio-cp's `resolve_service`, which accepts both forms. An empty member list means whole cluster (legacy semantics), roster unfiltered. - **List by fleet.** Each fleet button shows its member services as chips (or "whole cluster"); empty-config help now points at the new [fleet.<name>] form. - Fixtures model the canonical shape: orca + mira sharing cluster `oab` with distinct members, and the new [fleet.<name>] TOML the editor loads. Verification: tsc --noEmit + vite build clean; vitest 31/31 (9 new — member filtering incl. short-name/full-name/empty cases, switch-by-name with a shared cluster, member rendering). Console unit tests don't run in CI (only Rust does), so this was run locally. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Drafted by Orca (
ecs-claude) — flagging authorship (shared GitHub identity).Part A slice 2 of fleet-as-usage-grouping (#33), building on the backend from #34. Slice 1 taught
oab-mcp'sfleet_configto report each fleet'smembers; this wires the console so the config panel matches the new model.What
orca+miraboth onoab). Switching by cluster made them indistinguishable — the switch key moves fromdata-cluster→data-fleet(name).FleetConfigEntrygainsmembers.selectFleet(name)derives the cluster it reads from and the members it filters by.filterByMembers(deployments, members)keeps only deployments whose ECS service name (oab-{ns}-{name}) or short name is a member — mirroringstudio-cp'sresolve_service, which accepts both forms. Empty member list ⇒ whole cluster (legacy[[fleet]]semantics), roster unfiltered.nullselection = default cluster, unfiltered.[fleet.<name>]form.orca+mirasharing clusteroabwith distinct members — and the new[fleet.<name>]TOML the editor loads.This realizes the ADR §4 consequence: "the config panel evolves: list fleets by name, roster filtered to a fleet's members, switch by fleet identity (not cluster)." The
fleets.tomleditor (slice C) carries over unchanged.Verification
npm run typecheck(tsc --noEmit) clean.npm run build(tsc + vite build) clean — this is whatdesktop.ymlCI gates on forconsole/**.npm test(vitest) 31/31 (was 22; 9 new): member filtering — full-name, short-name, empty-list-is-whole-cluster, no-match, multi-match; switch-by-name with a shared cluster; member chip rendering;serviceNamederivation.ci.ymlis Rust-only;desktop.ymlrunsbuild, nottest) — so the vitest run above was done locally.build-testwill still exercise the (unchanged) Rust backend.Not in this slice
Reverse-MCP / Part B (ADR §3, §5 open questions) — next up per the plan (study → ADR → implement).
🤖 Generated with Claude Code