fix(cli): open correct uninstall URL and wait for user confirmation - #1573
Conversation
Site previewPreview: https://a30e3bb0-site.fullsend-ai.workers.dev Commit: |
ReviewFindingsLow
Info
Previous runReviewFindingsNo findings. Previous run (2)ReviewFindingsNo findings. Previous run (3)ReviewFindingsLow
Info
Previous run (4)ReviewFindingsLow
|
| existingSlugs = agentSlugs | ||
| } | ||
|
|
||
| if len(existingSlugs) > 0 { |
There was a problem hiding this comment.
[low] correctness
Diagnostic messages removed when installation lookup fails. The old code warned "Could not verify which apps exist; opening all" when ListOrgInstallations returned an error, and printed "App {slug} not found, skipping" for individual misses. Both were removed, making the fallback behavior silent.
Suggested fix: Consider restoring a warning when listErr != nil so users understand why they are directed to the generic installations list page.
| @@ -1561,7 +1561,7 @@ func TestRunUninstall_LegacySlugsIncludedWhenConfigUnavailable(t *testing.T) { | |||
| var buf strings.Builder | |||
There was a problem hiding this comment.
[low] correctness
Post-uninstall verification logic is untested. The new code calls ListOrgInstallations a second time to check whether apps were removed, but no test covers this path. With FakeClient, installations are immutable, so verification always reports still-installed.
Suggested fix: Add a test that asserts the warning message appears, or use a FakeClient callback to simulate mutation so the success path is also covered.
9c7ca05 to
62cbcc7
Compare
ralphbean
left a comment
There was a problem hiding this comment.
LGTM. One non-blocking note inline about the rebase.
|
|
||
| // runUninstall tears down the fullsend installation. | ||
| func runUninstall(ctx context.Context, client forge.Client, printer *ui.Printer, org, appSet string) error { | ||
| func runUninstall(ctx context.Context, client forge.Client, printer *ui.Printer, org, appSet string, stdin io.Reader) error { |
There was a problem hiding this comment.
[non-blocking] Heads up — this branch is behind main and GitHub shows it as conflicting. During the rebase you'll run into the BrowserOpener injection that landed on main recently (plus slug dedup logic and two new tests). I think the cleanest path is to keep both browser and stdin as parameters so tests can still use NopBrowser and CI doesn't try to open a real browser.
Opens /organizations/{org}/settings/installations/{id} instead of
/organizations/{org}/settings/apps/{slug}/advanced. The /advanced page
requires app owner access; org admins installing a third-party app need
the installation settings page to uninstall.
Falls back to /settings/installations list when the installation ID is
unavailable (e.g. ListOrgInstallations failed).
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Signed-off-by: Hector Martinez <hemartin@redhat.com>
After opening the browser for each app's installation settings page, prompt the user to press Enter before continuing to the next app. Prevents the command from exiting immediately and making the manual uninstall step appear optional. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> Signed-off-by: Hector Martinez <hemartin@redhat.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> Signed-off-by: Hector Martinez <hemartin@redhat.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> Signed-off-by: Hector Martinez <hemartin@redhat.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> Signed-off-by: Hector Martinez <hemartin@redhat.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> Signed-off-by: Hector Martinez <hemartin@redhat.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> Signed-off-by: Hector Martinez <hemartin@redhat.com>
62cbcc7 to
07f902f
Compare
Retro: PR #1573 — fix(cli): open correct uninstall URL and wait for user confirmationWorkflow outcome: Good. Human-authored PR with useful review agent findings that drove iterative improvements before merge. Timeline
What went well
Cost concerns (already tracked)
No new proposalsAll identified improvement opportunities are already covered by existing open issues. No new proposals warranted. |
Summary
/organizations/{org}/settings/installations/{id}instead of/organizations/{org}/settings/apps/{slug}/advanced— the/advancedpage requires app owner access; org admins installing a third-party app need the installation settings page (Uninstall doesn't clean everything up (part 2) #1490 item 2)Relates to #1490
Closes #323
Test plan
fullsend admin uninstall <org>against an org with fullsend installed as a third-party app/settings/installations/{id}(not/settings/apps/.../advanced)/settings/installationslist when installation ID is unavailable🤖 Generated with Claude Code