← Back to Documentation

Data Flow

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;
KeyPopulated byConsumed by
metagetSourceCommitDate() (only when SEER_HISTORY_OUTPUT=1, i.e. the deploy job — null in tracked output, see issue #203) + inventory.divisionsall 3 views (header stats, division palette)
pluginsinventory.plugins (from marketplace.json)registry.js
skillsinventory.skills (SKILL.md frontmatter)registry.js, map.js, graph.js
edgesbuildEdges() — resolves metadata.skill-dependencies / metadata.mcp-dependencies by exact id matchgraph.js
mcpServersscanMcpServers() over plugins/infrastructure/mcp-serversgraph.js
map.coreSkillsinventory.skills filtered to plugin core-dependenciesmap.js
map.dataSources / map.labItemshand-authored DATA_SOURCES / LAB_ITEMS constants in the generatormap.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.

Registry — #/registry
Renders plugins + skills as a browsable, filterable list.
Skill Map — #/map
Renders map.coreSkills, map.dataSources, map.labItems plus meta.divisions.
Dependency Graph — #/graph
Renders skills + edges + mcpServers as a node/edge graph.
Silent-drop fix baked into the schema. The legacy skill-map / dependency-graph generators walked hardcoded 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.