Skip to content

Uninstall server plugin support; isolate Enhanced Inspector in GsEnhancedInspector (#318) - #384

Merged
ericwinger merged 5 commits into
mainfrom
eric/issue318-uninstall-server-support
Aug 7, 2026
Merged

Uninstall server plugin support; isolate Enhanced Inspector in GsEnhancedInspector (#318)#384
ericwinger merged 5 commits into
mainfrom
eric/issue318-uninstall-server-support

Conversation

@ericwinger

Copy link
Copy Markdown
Member

Summary

Implements #318: adds a way to uninstall the optional server-plugin support, and reworks the Enhanced Inspector so it can be removed cleanly.

Before this, neither the Enhanced Inspector nor the refactoring engine had any removal path — once filed into an image, their classes stayed forever. The Enhanced Inspector was also filed into the shared Published dictionary, commingled with unrelated content, so it couldn't be dropped as a unit. This change gives both an install/uninstall pair and isolates the Enhanced Inspector in its own GsEnhancedInspector dictionary — the same isolation the refactoring engine already uses with GsRefactoring.

What's included

Uninstall command (GemStone: Uninstall Server Support)

  • Mirrors the install flow: SystemUser elevation, progress, verify. Confirmation modal before it runs; a single consolidated GemStone server support installed/uninstalled. toast (not one per feature).
  • Visible only when something is installed (gemstone.serverSupportInstalled context key); also reachable from the settings/walkthrough links.
  • Refactoring: drops GsRefactoring from every user's symbol list, empties the dictionary object, removes the loader and the feature-detected *ast-core-compat kernel backports.
  • Enhanced Inspector: drops GsEnhancedInspector from every user's symbol list and removes the *GToolkit extension methods, plus a legacy Published sweep so stones installed by the old build are fully cleaned.

Enhanced Inspector → dedicated dictionary

  • The vendored payload is now filed into GsEnhancedInspector (build transform apply_jasper_transforms.sh retargeted; topaz loader updated to create/share the dictionary first). Install creates + shares the dictionary and migrates any legacy Published-resident classes.

UI gating the uninstall exposed

  • Every engine-dependent Explorer refactoring affordance and the editor "Refactor…" code actions now gate on gemstone.rbSupportAvailable, so they disappear when the engine is absent and return after reinstall (Delete Method / Rename Method Category stay — they don't need the engine).
  • Per-pane Filter buttons no longer require the pane to be focused (always visible, like Find Class).
  • The Explorer clears the class/hierarchy/method panes when the selected dictionary is removed (e.g. uninstalling while sitting on GsRefactoring), instead of leaving orphaned classes.

Testing

  • 86 new tests. Unit tests for both uninstall cores + command drivers, the consolidated toast, the dedicated-dictionary prepare/migrate step, the menu/code-action gating, the filter-visibility change, and the Explorer stale-pane reset.
  • Live-stone integration tests for the uninstall on both engines (dedicated-dict isolation + detection flip), transient (harness auto-aborts — no commit, no new gci/ tests).
  • Full local CI matrix on 3.6.2 and 3.7.5, both plugin worlds, green apart from two pre-existing in-stone-SUnit timeouts (change-signature suite, querySunitRunLimit) unrelated to this change.

🤖 Generated with Claude Code

…n GsEnhancedInspector (#318)

Adds a "Uninstall Server Support" command (Enhanced Inspector + refactoring
engine) mirroring the install flow, and reworks the Enhanced Inspector to install
into a dedicated GsEnhancedInspector dictionary so it can be removed cleanly by
dropping that dictionary -- the same isolation the refactoring engine already
uses with GsRefactoring.

Install + uninstall:
- Uninstall command gated on serverSupportInstalled; confirmation modal; one
  consolidated "GemStone server support installed/uninstalled." toast.
- Refactoring uninstall drops GsRefactoring from every user's symbol list (and
  empties the dictionary), removes the loader and the *ast-core-compat backports.
- Enhanced Inspector files its payload into GsEnhancedInspector (build transform
  + topaz loader updated); uninstall drops that dictionary and removes *GToolkit
  extension methods, with a legacy Published sweep for older installs.

UI gating exposed by uninstall:
- Every engine-dependent Explorer refactoring menu item and the editor
  "Refactor..." code actions now gate on gemstone.rbSupportAvailable (Delete
  Method / Rename Method Category stay available).
- Per-pane Filter buttons no longer require pane focus (always visible).
- Explorer clears the class/hierarchy/method panes when the selected dictionary
  is removed, instead of showing orphaned classes.

Tests: 86 new (unit + live-stone integration on both 3.6.2/3.7.5); no new gci/.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

@MatiasFernandez MatiasFernandez left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Left some comment worth reviewing

Comment thread client/src/optionalSupportOffer.ts
Comment thread client/src/serverPlugin/pluginFeatures.ts
Comment thread client/src/enhancedInspector/__tests__/enhancedInspectorUninstall.test.ts Outdated
Comment thread client/src/enhancedInspector/enhancedInspectorInstall.ts
Comment thread client/src/enhancedInspector/enhancedInspectorUninstallCommand.ts Outdated
Comment thread client/src/__tests__/explorerRefreshSelectionGone.test.ts Outdated
ericwinger and others added 4 commits August 7, 2026 13:58
…318)

- New client/src/serverPlugin/uninstallServerPlugin.ts module (+ test) — the
  uninstall counterpart to installServerPlugin.
- New client/bin/uninstall-server-plugin.mjs + uninstallServerPluginMain.ts CLI,
  wired as the npm script `test:server:uninstall-plugin` (mirrors install-plugin).
- Refine the Enhanced Inspector install/uninstall and refactoring uninstall
  commands and their tests (assert outcomes, not self-calls).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…esh latch (#384 review)

Addresses the optionalSupportOffer review thread: the install feature drivers returned
`base.<latch> === true`, but the latch only flips when refreshWorkingSessionAfterInstall
succeeds. When the session has uncommitted changes and the user picks "Later", the install
landed + committed + verified server-side yet the driver reported false, so the bundle showed
neither a success toast nor an error — the operation looked like it never happened.

The uninstall drivers were already fixed this way; this brings the two install drivers into
line:
- refactoringInstallCommand: return true after result.success is verified (latch still drives
  the context key / menu gating).
- enhancedInspectorCommand: performInstall now returns boolean (was void) so the feature can
  report the server-side result; installEnhancedInspectorFeature returns it.

Regression tests for both drivers cover the deferred-refresh ("Later") path (verified via a
negative control that they fail against the latch-based return).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@ericwinger
ericwinger added this pull request to the merge queue Aug 7, 2026
Merged via the queue into main with commit 56cde7f Aug 7, 2026
15 checks passed
@ericwinger
ericwinger deleted the eric/issue318-uninstall-server-support branch August 7, 2026 21:35
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants