feat(interaction): /plugin marketplace command - #7
Conversation
- plugin-market/types|catalog|installer: index parse guard with a schemaVersion check, cache-first loader with raw → jsDelivr fallback and stale serving, installer over the dsh CLI seam (npm and github: specs incl. monorepo subdirs, allowBuilds preflight, profile-patch row insert/remove, installed-state derivation) - plugin-commands: flat grouped-by-badge browse panel (Enter detail, i/u/r hotkeys), installed view with updates and removed-from-market rows, install/uninstall/info/list/refresh argument paths, restart reminders, web-only warnings - settings: mayfly.marketIndexUrl (official chain when empty) - locale: zh catalog for the family; tips row; command reference rows - specs: catalog loader and command worlds over the updater seams, including fiber-unload gates and locale re-render Co-Authored-By: Claude Code <noreply@anthropic.com>
- shape arms: installed/update/versionless details, tools-only and commands-only provides, tui-only and web-only surfaces, github-only install commands, statusNote-less removals - lifecycle arms: fiber-unload gates at each await (load, findDshBin, install, refresh), locale re-render with and without the service, in-flight serialization, bare-context installs - installer arms: missing workspace file allowBuilds merge, no-trailing- newline patch append, regex unquote; catalog arms: non-Error rejections, cache shape guards; defensive arms carry v8 ignore notes Co-Authored-By: Claude Code <noreply@anthropic.com>
3d792e8 to
333ad53
Compare
|
Follow-up hardening is now on this PR.
Verification: |
|
Additional profile acceptance found and fixed the Cordis activation shape: Real dedicated-profile acceptance on
The final follow-up is commit |
|
Critical acceptance follow-up: ACP Server is an automation-only JSON-RPC stdio frontend. Loading it beside Mayfly causes both plugins to own the same stdin/stdout, making the TUI appear frozen. The acceptance profile has been recovered by removing ACP. Commit |
|
Discoverability follow-up |
|
Workflow redesign from acceptance feedback is now in
Verification: 2848 tests pass, full repository coverage is 100%, width scan/build/lib/examples/happy smoke pass. The dedicated acceptance profile is back to Installed 0 / Not installed 14. |
Acceptance completedAccepted against the dedicated Exercised scenarios:
Automated acceptance:
Known catalog/package issue: the live |
What
The
/plugincommand family: Mayfly's consumer for the plugin marketplace index published by Ephemeral-AI-Lab/dsh-plugins (dist/index.json, marketplace PR: Ephemeral-AI-Lab/dsh-plugins#8)./plugin— grouped flat catalog (Enter opens the read-only detail panel;iinstalls,uremoves,rrefreshes; type-to-filter). Badges carry source tier (official/dsh/community), surfaces (TUI/Web/Server), installed/update/removed state./plugin list— what the profile carries: installed, update available, removed-from-market (tombstone) rows./plugin install <id> [--source npm|github],uninstall <id>,info <id>,refresh.server ∨ own contribution), engines, capabilities disclosure, verified@version, copyable install command.Design notes
cordis.patch.yml; no runtime manifest, per the architecture rule.dsh plugin --profile <name> add|remove <specs>throughupdaterInternals.spawnOnce(the updater's swap seam): npm specs andgithub:owner/repo#ref[&path:subdir]both supported; all rows of an entry install together (sibling peers resolve); declaredallowBuildsnames merge into the profilepnpm-workspace.yamlfirst;profile-patchrows append to / remove from the profile'scordis.patch.yml.$DSH_HOME/storages/mayfly-plugin-market/cache.json, 1h TTL), falls back raw.githubusercontent → jsDelivr, serves stale cache offline;mayfly.marketIndexUrlsetting overrides the whole chain./pluginlocale block from an earlier draft stays untouched (superseded copy deck noted in locale.ts); this family ships its own strings.Verification
pnpm run verify:changedgreen: changed files at 100% statements / branches / functions / lines (620 branches), including fiber-unload gates staged through deferred seams and locale re-render with and without the service.plugin-market.spec.ts(catalog loader: parse guard, TTL, fallback chain, stale/offline, force) andplugin-commands.spec.ts(command worlds, installer seams, lifecycle, locale).Follow-up
Website marketplace section (nav third tab + generated plugin pages) lands as a separate PR on top of this branch.
🤖 Generated with Claude Code