Summary
Add an app-level focus filter that narrows resource lists to a selected client, keyed off a resource tag (default tag key Client, configurable in ~/.seamless-glance/config.json).
This is Phase 2 of the profile/multi-tenant work. Phase 1 (in-app AWS profile switching) is delivered separately.
Important framing
This is a view/focus filter, not a security boundary. In a shared AWS account, IAM cannot scope List/Describe results by tag, so isolation is not enforceable at the API layer. The UI must label the filter honestly (e.g. Focus: Client=Acme (view filter, not an access boundary)) and never imply it restricts access.
Scope
- Data layer: add a
tags field to model structs in src/models/ and read .tags() in the corresponding src/aws/ fetchers, service by service. EC2 already reads a subset of tags (src/aws/ec2.rs), so it is the natural first vertical slice; the remaining ~12 services each need model + fetcher changes.
- Config: configurable tag key (default
Client) in ~/.seamless-glance/config.json.
- State + command:
client_filter: Option<String> plus a /client <value> command, with a picker of distinct values for the configured tag key.
- Render: filter rows by
tag[key] == value before enumerate in each view, and recompute scroll/selection math against the filtered length.
- Honest labeling in the header/footer as described above.
- Docs: README, docs/architecture.md, and a changeset.
Suggested sequencing
Deliver as a vertical slice starting with EC2 so the filter can be validated end-to-end before rolling across all services.
Summary
Add an app-level focus filter that narrows resource lists to a selected client, keyed off a resource tag (default tag key
Client, configurable in~/.seamless-glance/config.json).This is Phase 2 of the profile/multi-tenant work. Phase 1 (in-app AWS profile switching) is delivered separately.
Important framing
This is a view/focus filter, not a security boundary. In a shared AWS account, IAM cannot scope List/Describe results by tag, so isolation is not enforceable at the API layer. The UI must label the filter honestly (e.g.
Focus: Client=Acme (view filter, not an access boundary)) and never imply it restricts access.Scope
tagsfield to model structs insrc/models/and read.tags()in the correspondingsrc/aws/fetchers, service by service. EC2 already reads a subset of tags (src/aws/ec2.rs), so it is the natural first vertical slice; the remaining ~12 services each need model + fetcher changes.Client) in~/.seamless-glance/config.json.client_filter: Option<String>plus a/client <value>command, with a picker of distinct values for the configured tag key.tag[key] == valuebefore enumerate in each view, and recompute scroll/selection math against the filtered length.Suggested sequencing
Deliver as a vertical slice starting with EC2 so the filter can be validated end-to-end before rolling across all services.