Skip to content

fix(plugin): real Update/repair upgrades and live /plugin info actions - #80

Merged
GeekCmore merged 1 commit into
mainfrom
fix/plugin-update-repair
Sep 28, 2026
Merged

GeekCmore merged 1 commit into
mainfrom
fix/plugin-update-repair

Conversation

@GeekCmore

Copy link
Copy Markdown
Collaborator

Closes #58, closes #59.

What

  • [UX] Plugin market "Update / repair" action always fails #58 — Update / repair always failed. installEntry hard-refused any entry with installed rows. Now installing over installed rows is a real upgrade: dsh plugin add replaces the manifest rows in place (the updater's swap seam). A failed operation rolls back transactionally — newly introduced rows are removed, previous rows are re-added pinned to their pre-operation versions (registry-external specs like github: reinstall verbatim), captured profile files restore byte-exactly, and an update's rollback re-imports the restored rows before reporting completion; rollback failures surface as rollback incomplete: … instead of a false success.
  • [UX] /plugin info <id> panel has dead Install/Remove/Update actions reported as silent success #59 — /plugin info <id> had dead Install/Remove buttons. The overlay now wires the same detail action handler as the browser panel (detailActionHandler, shared), so Install/Remove actually run and report their outcome. In the browser, completion returns to the market pane.
  • Surface-layer guard ([UX] /plugin info <id> panel has dead Install/Remove/Update actions reported as silent success #59 root cause). admitReply in @ephemeral-ai/mayfly-ui now throws TypeError('UI actions require a structured reply') for any non-observation event without a structured reply, so an action with no registered handler can never record silent success again. The ui-gallery demo pane settles its actions per the contract.
  • Update wording. operate() reports update progress/failure/success (updating "…"…, update failed: …, updated; restart Mayfly and start a new session to apply) with zh catalog entries.

Verification

  • pnpm run verify:full — exit 0 (build, typecheck, lint, 3773 tests at 100% per-file coverage including the touched files, happy smoke, screenshot freshness)
  • Real installer smoke against a dev profile with the real dsh CLI and npm registry: pinned @deepseek-ai/dsh-mcp-client@0.1.6-alpha.2, then installEntry upgraded it in place to 0.1.7-rc.2 with the post-install import check; a deliberately broken package install rolled back package.json/pnpm-lock.yaml/pnpm-workspace.yaml/cordis.patch.yml byte-exactly; uninstallEntry returned the profile to baseline
  • PTY smoke: /plugin catalog (real index, 15 entries) and /plugin info mcp overlay render and exit cleanly at 100×30 and 50×24; generic smoke:pty passes

Notes

  • Installation, update, and removal apply after restarting Mayfly and starting a new session; the notices and packages/mayfly/AGENTS.md say so.
  • Pre-existing market-data quirk found while testing (not addressed here): the mcp entry's bare npm spec resolves to latest = incompatible 0.0.1-rc.1 on npm, so installing mcp from the market is rejected by dsh's peer check regardless of this change.

- installEntry no longer refuses installed entries: dsh plugin add replaces
  manifest rows in place (the updater's swap seam); a failed operation rolls
  back by removing newly introduced rows, re-adding previous rows pinned to
  their pre-operation versions, and restoring captured files byte-exactly,
  then re-importing the restored rows before reporting completion
- /plugin info <id> wires the same detail action handlers as the browser
  panel instead of rendering dead Install/Remove buttons
- admitReply throws for any non-observation event without a structured
  reply, so an action with no registered handler can never record silent
  success; the ui-gallery demo pane settles its actions per the contract
- operate() reports update progress/failure/success with update wording,
  with zh catalog entries

Refs #58, #59
@GeekCmore
GeekCmore merged commit d648b0e into main Sep 28, 2026
7 checks passed
@GeekCmore
GeekCmore deleted the fix/plugin-update-repair branch September 28, 2026 07:37
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

1 participant