feat(channels): Phase 3 — Channel Atlas SPA (/channels/atlas/) - #2169
Merged
Conversation
… wiring - srv/server.js: add GET /build/channel-atlas handler (after /build/channel-collections); selects published Channels + separate REVIEWED ChannelTopicMap SELECT; groups topicTags by channel_ID; lazy import of buildAtlasChannels inside handler (srv-qa safe) - srv/lib/build-channel-atlas.js: convert module.exports → ESM export (project type=module) - approuter/xs-app.json: add /channel-atlas-ui/ SPA route (after /explore-ui/); add /channels/atlas/ static route (before /browse/ routes); /build/ allowlist already contained channel-atlas (confirmed present, no change needed) - .deploy/mta.yaml: add ../../srv/lib/build-channel-atlas.js to srv-qa cp list - test/unit/channels-atlas-endpoint.test.js: 4/4 passing unit tests
…es, styles) Adds all base files for the channel-atlas Vue 3 + Vite + TS SPA: - package.json with pinned deps (sigma 3.0.3, graphology 0.26.0, vue 3.5.34) - vite.config.ts with /channel-atlas-ui/ base, gzip budget plugin (150KB), dev proxy - index.html, tsconfig.json, src/main.ts, src/styles.css, src/App.vue (minimal stub) - Replaces types.ts stub with full domain types: OwnerType, AtlasChannelDTO, AtlasNode, AtlasEdge (shape preserved), AtlasPayload Verified: 20/20 graph.test.ts pass; vue-tsc --noEmit 0 errors.
…tlas2) - Add AtlasGraph.vue: Sigma 3 renderer with graphology MultiDirectedGraph, forceAtlas2 layout, node/edge styling, nodeClick emit - Add AtlasGraph.test.ts: 5 unit tests (mount, nodes, edge dedup, nodeClick emit, prop-change rebuild) - Fix tsconfig.json: add "types": ["vite/client"] so import './styles.css' resolves (TS2882)
…l, useOwnerTypeFilter
…ate, doc star exclusion, ref-based click-outside
The vitest `unit` project (run from repo root in CI) includes app/channel-atlas/src/**/__tests__, and App.test.ts + AtlasGraph.test.ts transitively import AtlasGraph.vue → graphology/sigma. Those deps live only in app/channel-atlas/package.json, not root, so unit-tests.yml's `npm run setup` must install that workspace the same way it already installs app/explore. Without it CI fails: 'Failed to resolve import graphology from AtlasGraph.vue'. Passed locally only because the SPA node_modules was already present.
jung-thomas
force-pushed
the
feat/channels-hub-phase3-atlas
branch
from
September 6, 2026 12:03
fecf53e to
d955014
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Phase 3 — Channel Atlas SPA (
/channels/atlas/)Third and final phase of the Channels-hub buildout. Adds a force-directed graph SPA that maps the SAP developer content channel ecosystem: channels are nodes; edges come from shared focus areas (phase-1, works pre-seed) and shared REVIEWED topic tags (phase-2). Forked from
app/explore/(Sigma 3 + graphology + Vue 3.5 + Vite 5), served at/channels/atlas/via/channel-atlas-ui/.Built with subagent-driven-development: 10 tasks, each task-reviewed (spec + quality); one whole-branch final review on the most-capable model, clean but for one LOW cosmetic fail-open gap which is fixed in the final commit.
What's here
srv/lib/build-channel-atlas.js(CQL, published+REVIEWED rows, safe column subset) +GET /build/channel-atlas(fail-open) +/buildallowlist entry.app/channel-atlas/): typed DTO seam (id,name,url,purpose,ownerType,subscribers,githubStars,focusAreas,topicTags),useAtlasData(inline payload → live-fetch fallback),graph.ts(log-scale sizing with??, 9-value owner-type palette, canonicali<jedge builders),AtlasGraph(renderer kill on rebuild + unmount, edge dedup withhasNodeguards), owner-type filter, detail panel. 150 KB gzip budget enforced in vite config.fetch-channel-atlas+build:channel-atlas+ manifest builder;build:allorder (fetch → build SPA → hugo); MTA before-all + approuter static copy; Hugo layout (channels/atlas.html, CSS link outside mount per explore: path overlay renders nothing — /graph/path returns a ranked candidate list, not a connected chain #1131) + content; vitest include.Verification
vue-tsc -p app/channel-atlas/tsconfig.json→ 0 errors.check-xs-app-mta.ts→ exit 0.Phase-2 (#2168) is not yet on DEV. If #2168 merges after this PR, its
/channels/:slugcatch-all route must sit after the/channels/atlasliteral route inapprouter/xs-app.json, or the atlas page will be shadowed by the catch-all.No self-merge, no deploy — leaving both to human review.