Bug description
The skills marketplace loader checks for marketplaces/default.json and returns [] if it is absent before attempting manifest discovery (openhands-agent-server/openhands/agent_server/skills_service.py:706-738).
The current OpenHands/extensions repository uses .plugin/marketplace.json; its marketplaces/ directory contains large-codebase.json and openhands-extensions.json, not default.json. The plugin marketplace loader already handles this correctly by calling Marketplace.load(repo_path) first (plugins_service.py:331-357).
As a result, a cold /skills/marketplace load can be blank while /plugins/marketplace loads the same repository successfully. The skills path also caches empty failures for the full TTL, while the plugin path deliberately does not.
Expected behavior
Skills and plugins should derive their views from the same successfully fetched and parsed marketplace snapshot, using manifest discovery first and the explicit path only as fallback.
Suggested implementation
Add one small shared marketplace snapshot loader/cache backed by Marketplace.load. Fetch/parse once, cache only successful snapshots, and let skills/plugins derive their distinct response shapes while computing installation state fresh.
Acceptance criteria
Version
Current main at 6d3881035. Repository layout was independently verified through the GitHub API on 2026-08-27; existing issue search found no duplicate.
Bug description
The skills marketplace loader checks for
marketplaces/default.jsonand returns[]if it is absent before attempting manifest discovery (openhands-agent-server/openhands/agent_server/skills_service.py:706-738).The current
OpenHands/extensionsrepository uses.plugin/marketplace.json; itsmarketplaces/directory containslarge-codebase.jsonandopenhands-extensions.json, notdefault.json. The plugin marketplace loader already handles this correctly by callingMarketplace.load(repo_path)first (plugins_service.py:331-357).As a result, a cold
/skills/marketplaceload can be blank while/plugins/marketplaceloads the same repository successfully. The skills path also caches empty failures for the full TTL, while the plugin path deliberately does not.Expected behavior
Skills and plugins should derive their views from the same successfully fetched and parsed marketplace snapshot, using manifest discovery first and the explicit path only as fallback.
Suggested implementation
Add one small shared marketplace snapshot loader/cache backed by
Marketplace.load. Fetch/parse once, cache only successful snapshots, and let skills/plugins derive their distinct response shapes while computing installation state fresh.Acceptance criteria
.plugin/marketplace.jsonlayout whenmarketplaces/default.jsonis absent.Version
Current
mainat6d3881035. Repository layout was independently verified through the GitHub API on 2026-08-27; existing issue search found no duplicate.