marketplace.json → skill-inventory.js → explorer-data.json → the 3 Explorer views
apps/explorer/scripts/generate-explorer-data.js writes exactly one output file,
apps/explorer/public/explorer-data.json, which every Explorer view fetches through
apps/explorer/src/data.js's cached loadData(). It replaces three legacy
per-app generators (skills-registry, dependency-graph, skill-map)
whose separate JSON outputs are now just different slices of this one document.
graph LR MP["marketplace.json
plugins[] · name/source/skills[]"] SKMD["SKILL.md frontmatter
+ git log dates"] subgraph LIB["skill-inventory.js"] INV["getInventory()
DIVISION_COLORS palette
DIVISION_ALIASES normalize"] end subgraph GEN["generate-explorer-data.js"] MCP["scanMcpServers()
plugins/infrastructure/mcp-servers"] EDGES["buildEdges()
skill.dependencies.skills / .mcp"] STATIC["DATA_SOURCES · LAB_ITEMS
hand-authored constants"] end OUT["explorer-data.json
meta · plugins · skills · edges
mcpServers · map"] LOADER["data.js
loadData() — fetch + cache"] subgraph VIEWS["3 Explorer Views · apps/explorer/src/views/"] REG["registry.js
#/registry"] MAP["map.js
#/map"] GRAPH["graph.js
#/graph"] end MP --> INV SKMD --> INV INV --> EDGES INV --> MCP MCP --> EDGES INV --> OUT EDGES --> OUT MCP --> OUT STATIC --> OUT OUT --> LOADER LOADER --> REG LOADER --> MAP LOADER --> GRAPH class MP,SKMD source; class INV,MCP,EDGES,STATIC derive; class REG,MAP,GRAPH view;
| Key | Populated by | Consumed by |
|---|---|---|
meta | getSourceCommitDate() (only when SEER_HISTORY_OUTPUT=1, i.e. the deploy job — null in tracked output, see issue #203) + inventory.divisions | all 3 views (header stats, division palette) |
plugins | inventory.plugins (from marketplace.json) | registry.js |
skills | inventory.skills (SKILL.md frontmatter) | registry.js, map.js, graph.js |
edges | buildEdges() — resolves metadata.skill-dependencies / metadata.mcp-dependencies by exact id match | graph.js |
mcpServers | scanMcpServers() over plugins/infrastructure/mcp-servers | graph.js |
map.coreSkills | inventory.skills filtered to plugin core-dependencies | map.js |
map.dataSources / map.labItems | hand-authored DATA_SOURCES / LAB_ITEMS constants in the generator | map.js |
apps/explorer/src/router.js dispatches on a hash route (#/registry,
#/map, #/graph), each mapped to a handler registered via
registerRoute(). mkdocs.yml's Apps → Explorer nav section links
directly to these three hash routes.
#/registryplugins + skills as a browsable, filterable list.#/mapmap.coreSkills, map.dataSources, map.labItems plus meta.divisions.#/graphskills + edges + mcpServers as a node/edge graph.plugins/divisions/* directories and never looked at
plugins/preview or plugins/wil, silently dropping 12 + 17 skills. Because every
view now reads the same getInventory()-derived explorer-data.json, that class
of drift can't recur per-view — a fix to discovery in skill-inventory.js fixes all
three views at once.