Skip to content

feat(channels): Phase 3 — Channel Atlas SPA (/channels/atlas/) - #2169

Merged
jung-thomas merged 13 commits into
DEVfrom
feat/channels-hub-phase3-atlas
Sep 6, 2026
Merged

feat(channels): Phase 3 — Channel Atlas SPA (/channels/atlas/)#2169
jung-thomas merged 13 commits into
DEVfrom
feat/channels-hub-phase3-atlas

Conversation

@jung-thomas

Copy link
Copy Markdown
Contributor

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

  • CAP: srv/lib/build-channel-atlas.js (CQL, published+REVIEWED rows, safe column subset) + GET /build/channel-atlas (fail-open) + /build allowlist entry.
  • SPA (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, canonical i<j edge builders), AtlasGraph (renderer kill on rebuild + unmount, edge dedup with hasNode guards), owner-type filter, detail panel. 150 KB gzip budget enforced in vite config.
  • Build/deploy wiring: fetch-channel-atlas + build:channel-atlas + manifest builder; build:all order (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.
  • channel-atlas + manifest suites: all green (App/graph/filter/detail + endpoint + build-channel-atlas + manifest + useAtlasData).
  • check-xs-app-mta.ts → exit 0.
  • Whole-branch final review (opus): no correctness/integration/security/dead-wiring defects. The one LOW finding (build-time fetch error masquerading as an empty-filter state) is fixed in the last commit + covered by a new test.
  • Pre-existing unrelated suite failures (missing native deps / QA HDI binding / pre-existing explore+puzzle) are untouched by this branch — CI is the merge gate.

⚠️ Merge caveat

Phase-2 (#2168) is not yet on DEV. If #2168 merges after this PR, its /channels/:slug catch-all route must sit after the /channels/atlas literal route in approuter/xs-app.json, or the atlas page will be shadowed by the catch-all.

No self-merge, no deploy — leaving both to human review.

… 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)
…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
jung-thomas force-pushed the feat/channels-hub-phase3-atlas branch from fecf53e to d955014 Compare September 6, 2026 12:03
@jung-thomas
jung-thomas merged commit 91e3df5 into DEV Sep 6, 2026
6 of 7 checks passed
@jung-thomas
jung-thomas deleted the feat/channels-hub-phase3-atlas branch September 6, 2026 12:04
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant