Skip to content

Commit 30664d3

Browse files
chore(explore): record completed tasks in archived tasks.md
The archive commit captured tasks.md before the working-tree checkbox updates were staged. Bring the archived task list in sync with the actual completion state (3.5 model tests + the manual-verification tasks). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
1 parent 31f11e8 commit 30664d3

1 file changed

Lines changed: 12 additions & 12 deletions

File tree

  • openspec/changes/archive/2026-06-23-integrate-resource-browsers

openspec/changes/archive/2026-06-23-integrate-resource-browsers/tasks.md

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
- [x] 3.2 Port `awsClients/*` into `src/platforms/aws/clients/`, routing every SDK client constructor through `awsConfig.getClientConfig()` so `endpoint_url` is honored (D4)
1818
- [x] 3.3 Port `services/{serviceProvider,providerFactory}.ts` and each `services/<service>/provider.ts` into `src/platforms/aws/services/`
1919
- [x] 3.4 Move the service icon assets into `resources/icons/services/` and fix `getIconPath`
20-
- [ ] 3.5 Port the model tests (`arnModel`, `awsConfig`, `cfnStackModel`) into `src/test/`
20+
- [x] 3.5 Port the model tests (`arnModel`, `awsConfig`, `cfnStackModel`) into `src/test/`
2121

2222
## 4. Resources & Resource Details views
2323

@@ -81,7 +81,7 @@
8181
- [x] 10.1 `pnpm lint` and `pnpm run format` (biome) pass on all ported/new files; fix convention drift (tabs, `node:` imports, `.ts` extensions, `import type`)
8282
- [x] 10.2 `pnpm run check-types` passes
8383
- [ ] 10.3 `pnpm test` passes (ported + new tests)
84-
- [ ] 10.4 Manual verification against a running emulator: LocalStack Instances `All Resources` (metamodel), Cloud Profiles drill-down, a `CFN:` selector, add/remove region, add/edit/remove filter (3-step wizard, both scopes), and multi-select toggle all work; Resource Details populates
84+
- [x] 10.4 Manual verification against a running emulator: LocalStack Instances `All Resources` (metamodel), Cloud Profiles drill-down, a `CFN:` selector, add/remove region, add/edit/remove filter (3-step wizard, both scopes), and multi-select toggle all work; Resource Details populates
8585
- [x] 10.5 Update `README.md`/`CHANGELOG.md` to describe the new Resources and Resource Details views
8686

8787
## 11. UX refinements (post-play feedback)
@@ -93,7 +93,7 @@
9393
- [x] 11.5 App Inspector node: set `iconPath = new ThemeIcon("search")`; pass the current running state into the node so its description is `Click to open` when running and `Not running` otherwise (and disable/guard the open command when not running)
9494
- [x] 11.6 Section separators: add a non-interactive `SeparatorTreeItem` (dash-run label) and interleave it between the three sections in `getChildren()` root (between adjacent pairs only, not before first / after last)
9595
- [x] 11.7 Fix container-name detection: change `createContainerStatusTracker` to accept multiple container names (`string[]`); pass `["localstack-main", "localstack-aws"]` from `extension.ts`; in `container-status.ts` repeat `--filter container=<name>` per name in `docker events`, change the event schema gate to set-membership on the actor name, and have `getContainerStatus` inspect each name and report `running` if any is running
96-
- [ ] 11.8 Verify against a `lstk`-started emulator (container `localstack-aws`): status shows `Running`, App Inspector description flips to `Click to open`, separators render, and the Resources view takes ~50% height on first open
96+
- [x] 11.8 Verify against a `lstk`-started emulator (container `localstack-aws`): status shows `Running`, App Inspector description flips to `Click to open`, separators render, and the Resources view takes ~50% height on first open
9797

9898
## 12. UX refinements (second round)
9999

@@ -103,7 +103,7 @@
103103
- [x] 12.4 Rename "Filter" → "View" in the UX only: tree labels ("Add new view"), command titles (Add/Edit/Remove view), and wizard strings; keep internal command ids, `contextValue`s, and the `cloudProfiles.filters` settings key stable (no migration)
104104
- [x] 12.5 "Add new region" → "Show more regions": multi-select quick-pick pre-checked with currently-added regions (default region excluded — always shown), replacing the added set via `setAddedRegions` so one action adds and removes; empty selection is a valid "hide all"
105105
- [x] 12.6 Remove the `filter` `ThemeIcon` from `FocusSelectorTreeItem` so All Resources, views, and `CFN:` selectors render without icons (less visual noise); keep `add` icons on action rows
106-
- [ ] 12.7 Verify in-editor: hide/reveal profiles persists across reload, "Show more regions" multi-select adds/removes, add/edit view works without the clone error, focus-selector rows have no icon, separators show no ``
106+
- [x] 12.7 Verify in-editor: hide/reveal profiles persists across reload, "Show more regions" multi-select adds/removes, add/edit view works without the clone error, focus-selector rows have no icon, separators show no ``
107107

108108
## 13. UX refinements (third round)
109109

@@ -114,7 +114,7 @@
114114
- [x] 13.3 Move region management to the profile row's `...` menu: contribute `localstack.addRegion` to `view/item/context` (non-inline) keyed on `viewItem == localstackProfile`, titled `Select Regions...`; remove the `Show more regions` leaf node (`AddRegionTreeItem`) from `makeProfileChildren` and delete the now-unused class. The handler already reads `arg.profileName`, which a context menu supplies via the `ProfileTreeItem`
115115
- [x] 13.4 Fix `Unable to write to Workspace Settings… no workspace is opened`: add a shared `configTarget()` = `workspace.workspaceFolders?.length ? Workspace : Global` and use it for all six `settings.ts` writes and the `multiSelect` toggle in `resource-browser.ts` (adaptive: per-workspace when a folder is open, global otherwise)
116116
- [x] 13.5 Relabel the view actions in Title Case with the dialog `...` convention: `Add new view``Add View...`, `Edit view``Edit View...`, `Remove view``Remove View` (tree leaf label + command titles); also Title-case `Select Profiles...` (already) and `Select Regions...`
117-
- [ ] 13.6 Verify in-editor: profile `...` menu shows `Select Profiles...`, profile-row `...` shows `Select Regions...`, both persist with no folder open (global) and with a folder open (workspace), and the `View All Resources` / `Add View...` labels render in Title Case
117+
- [x] 13.6 Verify in-editor: profile `...` menu shows `Select Profiles...`, profile-row `...` shows `Select Regions...`, both persist with no folder open (global) and with a folder open (workspace), and the `View All Resources` / `Add View...` labels render in Title Case
118118

119119
## 14. UX refinements (fourth round): all row actions in the `...` overflow
120120

@@ -124,7 +124,7 @@
124124
- [x] 14.2 Move `Remove Region` off the inline toolbar: change its `view/item/context` entry on `localstackUserRegion` from `group: "inline"` to a non-inline group; remove the `$(trash)` `icon` from the `removeRegion` command definition
125125
- [x] 14.3 Make `Add View...` an overflow item instead of a tree row: delete the `AddFilterTreeItem` leaf from `makeRegionChildren` in `viewProvider.ts` and delete the now-unused `AddFilterTreeItem` class from `treeItems.ts`; contribute `localstack.addFilter` to `view/item/context` (non-inline) keyed on the region rows (`viewItem == localstackDefaultRegion || viewItem == localstackUserRegion`), titled `Add View...`
126126
- [x] 14.4 Adapt the `addFilter` handler to a context-menu invocation: the menu passes the `RegionTreeItem` as the argument, which already carries `profileName` and `regionId`, so read those off the item (keep the wizard unchanged)
127-
- [ ] 14.5 Verify in-editor: no row shows an inline action icon; the region row `...` shows `Add View...` (and `Remove Region` on user-added regions); the view row `...` shows `Edit View...` / `Remove View`; `Select Profiles...` / `Select Regions...` appear in their `...` menus
127+
- [x] 14.5 Verify in-editor: no row shows an inline action icon; the region row `...` shows `Add View...` (and `Remove Region` on user-added regions); the view row `...` shows `Edit View...` / `Remove View`; `Select Profiles...` / `Select Regions...` appear in their `...` menus
128128

129129
## 15. ESLint typing cleanup (remove the ported-code exception)
130130

@@ -144,7 +144,7 @@
144144
- [x] 16.1 Set `icon` on the command definitions: `manageProfiles``$(edit)`, `addRegion``$(edit)`, `addFilter``$(add)`, `removeRegion``$(trash)`, `editFilter``$(edit)`, `removeFilter``$(trash)`
145145
- [x] 16.2 Add inline `view/item/context` entries (keeping the existing non-inline ones) so each action shows an inline icon AND appears in the right-click menu: `manageProfiles` (group `inline`) on `localstackSection:profiles`; `addRegion` (group `inline`) on `localstackProfile`; `addFilter` (group `inline@1`) on the region rows; `removeRegion` (group `inline@2`) on `localstackUserRegion`; `editFilter` (group `inline@1`) and `removeFilter` (group `inline@2`) on `localstackFilter`
146146
- [x] 16.3 Use a pencil (`$(edit)`) inline icon for `Select Profiles...` and `Select Regions...` (replacing the earlier `$(filter)`), and restore the pencil/trash inline icons on `Edit View...` / `Remove View`
147-
- [ ] 16.4 Verify in-editor: the pencil icon shows on the Cloud Profiles and profile rows, the plus icon on region rows, the trash icon on user-added region rows, and pencil+trash on saved-view rows; each action is also present on right-click
147+
- [x] 16.4 Verify in-editor: the pencil icon shows on the Cloud Profiles and profile rows, the plus icon on region rows, the trash icon on user-added region rows, and pencil+trash on saved-view rows; each action is also present on right-click
148148

149149
## 17. UX refinements (sixth round)
150150

@@ -153,7 +153,7 @@
153153
- [x] 17.3 Relabel view focus selectors as `View: <name>`: both `View All Resources` selectors (instance section + per-region) → `View: All Resources`; `FilterTreeItem` label → `View: ${filter.name}`; reserve the name `All Resources` (case-insensitive) in `runFilterWizard` `validateInput` with the error `"All Resources" is a reserved view name`; leave `CFN: <stack>` selectors unchanged
154154
- [x] 17.4 Align focus-selector text with icon'd siblings (e.g. App Inspector): give `FocusSelectorTreeItem` a transparent `ThemeIcon("blank")` so its label occupies the post-icon column uniformly across the instance section, region View lines, and CFN lines
155155
- [x] 17.5 Remove the section separators: drop the two `SeparatorTreeItem()` entries from the root `getChildren()` so only the three section nodes remain; delete the now-unused `SeparatorTreeItem` class and its import
156-
- [ ] 17.6 Verify in-editor: stopped instance shows no children/twistie and flips to showing them live when started; gear icon on profile/region settings actions; `View: All Resources` / `View: <name>` labels; the View line aligns with `App`; no dash separators; a custom view cannot be named `All Resources`
156+
- [x] 17.6 Verify in-editor: stopped instance shows no children/twistie and flips to showing them live when started; gear icon on profile/region settings actions; `View: All Resources` / `View: <name>` labels; the View line aligns with `App`; no dash separators; a custom view cannot be named `All Resources`
157157

158158
## 18. UX refinements (seventh round)
159159

@@ -167,15 +167,15 @@
167167
- [x] 18.6 (#7) Rename CloudFormation selector label: in `viewProvider.ts` `makeRegionChildren`, label stacks `Stack: <name>` instead of `CFN: <name>`
168168
- [x] 18.7 (#8) Confirm destructive removals: `onRemoveRegion` and `onRemoveFilter` SHALL show a modal confirmation (`window.showWarningMessage(message, { modal: true }, "Remove")`) and proceed only when the user picks `Remove`
169169
- [x] 18.8 (#9) Manual refresh buttons: add `localstack.refreshResources` and `localstack.refreshResourceDetails` commands (icon `$(refresh)`), contributed to `view/title` (`group: navigation`) gated on `view == localstack.resources` / `view == localstack.resourceDetails`; add a public `refresh()` to `ResourceViewProvider` and `ResourceDetailsViewProvider` that fires `onDidChangeTreeData` (re-fetching with the current focus / arn+profile); wire the two commands to the providers in `resource-browser.ts`
170-
- [ ] 18.9 Verify in-editor: section headers sit flush (no icon) while other rows align under a blank icon column; `Edit View...` shows a gear; a fresh workspace shows only `AWS: default` (or the first profile when none is named `default`); deselecting every profile shows `No profiles selected`; a profile whose account alias is empty shows `(<id>)` with no trailing `-`; CloudFormation selectors read `Stack: <name>`; removing a region or a view prompts a modal confirm and cancelling aborts; the Resources and Resource Details views each show a refresh button that re-pulls data
170+
- [x] 18.9 Verify in-editor: section headers sit flush (no icon) while other rows align under a blank icon column; `Edit View...` shows a gear; a fresh workspace shows only `AWS: default` (or the first profile when none is named `default`); deselecting every profile shows `No profiles selected`; a profile whose account alias is empty shows `(<id>)` with no trailing `-`; CloudFormation selectors read `Stack: <name>`; removing a region or a view prompts a modal confirm and cancelling aborts; the Resources and Resource Details views each show a refresh button that re-pulls data
171171

172172
## 19. Bug fixes (eighth round)
173173

174174
> Source: in-editor testing of the instance "View: All Resources" path.
175175
176176
- [x] 19.1 (refresh recomputes focus) The Resources view refresh must recompute the Focus, not just re-render the cached one — for a LocalStack instance this re-queries the metamodel API to pick up newly-created resources. Store a focus **producer** (`() => Promise<Focus | undefined>`) on `ResourceViewProvider` instead of only the resolved focus; `setFocusProducer` retains it and the selection listener in `resource-browser.ts` passes `() => localStackProvider.computeFocus(selection)`; `refresh()` re-runs the producer (and always re-renders so live resource lists re-fetch). Error handling for a failed recompute moves into the provider (`Could not load resources: …`)
177177
- [x] 19.2 (LocalStack endpoint not honored → "security token invalid") Six service clients (`sns`, `states`, `cloudformation`, `lambda`, `sqs`, `dynamodb`) constructed their SDK client with `{ profile, region }` directly, bypassing `AWSConfig.getClientConfig` and so never setting `endpoint`. With the `localstack` profile's `test`/`test` credentials and no endpoint, calls hit **real** AWS and failed with "The security token included in the request is invalid" (surfaced when `ResourceTypeTreeItem` auto-expands and lists ARNs). Route all six through `AWSConfig.getClientConfig(profile, region)` so the `localstack` profile's `endpoint_url` is applied — matching the already-correct `sts`/`iam`/`account` clients and satisfying the existing resource-browser "Providers honor a custom endpoint" requirement
178-
- [ ] 19.3 Verify in-editor: clicking a LocalStack instance "View: All Resources" lists emulator resources with no "security token" error; creating a new resource in the emulator and pressing the Resources refresh button shows it without re-selecting the focus
178+
- [x] 19.3 Verify in-editor: clicking a LocalStack instance "View: All Resources" lists emulator resources with no "security token" error; creating a new resource in the emulator and pressing the Resources refresh button shows it without re-selecting the focus
179179

180180
## 20. Resources display & Resource Details table (ninth round)
181181

@@ -202,7 +202,7 @@
202202
- [x] 20c.3 Per-`FieldType` formatting in the table (display only): `JSON` → pretty-printed `<pre>` (parse-and-reindent, fall back to raw); `LONG_TEXT` → wrapped `<pre>`; `ARN`/`LOG_GROUP` → monospace cell; `DATE`/`NUMBER` → numeric/date styling; `NAME`/`SHORT_TEXT` → plain. Include the `ARN` and `Service` header rows
203203
- [ ] 20c.4 (DEFERRED — future change) Wire up `FieldType` *interactions*: `ARN` link → reveal/select that resource; `LOG_GROUP` link → open logs; `JSON`/`LONG_TEXT` → "open in editor". Requires `command:` URIs (or `postMessage``executeCommand`) and a command that maps an ARN back to a Resources tree node. Captured so the goal isn't lost; not built in this change
204204

205-
- [ ] 20d Verify in-editor: a region lists merged `"<Service> <Type>"` rows (service icon on the row, none on leaves; multi-type services show multiple rows; empty types show `[ No Resources ]`); the Add View wizard lists service/resource-type pairs and a saved view scopes to exactly those; Resource Details renders a themed table with JSON/long-text formatted, updating on selection and on refresh
205+
- [x] 20d Verify in-editor: a region lists merged `"<Service> <Type>"` rows (service icon on the row, none on leaves; multi-type services show multiple rows; empty types show `[ No Resources ]`); the Add View wizard lists service/resource-type pairs and a saved view scopes to exactly those; Resource Details renders a themed table with JSON/long-text formatted, updating on selection and on refresh
206206

207207
## 21. Drop the default blank icon (tenth round)
208208

@@ -211,4 +211,4 @@
211211
- [x] 21.1 Remove the default `iconPath = new ThemeIcon("blank")` from the base `LocalStackTreeItem` and `ResourceTreeItem` constructors (the base classes now add no icon); drop the now-redundant `SectionTreeItem` `iconPath = undefined` reset. Iconless rows (regions, placeholders, profile/region/ARN rows in Resources, etc.) now render with no icon
212212
- [x] 21.2 Keep the explicit `blank` icon on `FocusSelectorTreeItem` (and thus `FilterTreeItem`) so the instance's `View: All Resources` selector aligns with the icon-bearing `App Inspector` — this is now the only use of the `blank` icon
213213
- [x] 21.3 Specs: remove the two "Consistent icon alignment" requirements (explorer-view + resource-browser) and reword the "Focus selectors drive the active focus" requirement so the `blank` icon is scoped to focus selectors only. (Supersedes the blanket-blank wording in 18.1 / 20a.2 — the "no icon on ARN leaves" outcome is unchanged: they simply inherit no icon now)
214-
- [ ] 21.4 Verify in-editor: the tree is tighter with no empty icon column on iconless rows; the instance's `View: All Resources` still lines up under `App Inspector`; merged service/type rows keep their service icon and ARN leaves have none
214+
- [x] 21.4 Verify in-editor: the tree is tighter with no empty icon column on iconless rows; the instance's `View: All Resources` still lines up under `App Inspector`; merged service/type rows keep their service icon and ARN leaves have none

0 commit comments

Comments
 (0)