feat: add central package dashboard published to GitHub Pages - #17
Merged
Conversation
Adds a self-updating status + documentation surface for the fork program: - `scripts/build_dashboard.py` + `dashboard_template.html`: discover org forks (a repo is a fork iff it carries `.unabandoned.yml`), pull live state from the GitHub API (open PRs/issues, pending Renovate updates, latest release, CI, security fast-path, autorelease-pending), and render a theme-aware static site plus `data.json`. Empty-state handled for the pre-fork org. - `.unabandoned.yml` metadata convention (`templates/.unabandoned.yml`): each fork's single source of truth for editorial facts (upstream, summary, why-forked, used-by), co-located so it can't drift. Derivable state is never stored — only pulled live. - `scripts/validate_metadata.py`: one schema definition, imported by the builder and run by `reusable-ci` so forks can't merge broken metadata or fall off the dashboard silently. - `dashboard` workflow: rebuilds and deploys to Pages on a daily schedule, on demand, and whenever the builder changes. - Docs: fork-standup checklist, templates, org profile link, and CLAUDE.md program guidance (including the one-time Pages-enable human step). Co-Authored-By: Claude Opus 4.8 <[email protected]> Claude-Session: https://claude.ai/code/session_01EiJUpqQvbWm8pVyV8bRYy1
A filled-in reference alongside the blank template, showing what a fork's dashboard metadata looks like once completed. Co-Authored-By: Claude Opus 4.8 <[email protected]> Claude-Session: https://claude.ai/code/session_01EiJUpqQvbWm8pVyV8bRYy1
Renders the owned subtree as a computed, dependency-free SVG — a panel on the main dashboard plus a standalone topology.html — with consumers on top, the @unabandoned forks in dependency layers beneath, and shared leaves at the bottom. Node colour carries live CI/security health. Every edge is derived, never hand-drawn: - fork -> fork from each fork's package.json dependencies, filtered to the @unabandoned scope (build_dashboard now fetches package.json per fork); - consumer -> fork from used-by in each .unabandoned.yml. scripts/topology.py does a layered (Sugiyama-lite) layout with a barycenter crossing-reduction sweep and emits SVG that inherits the page's CSS variables, so it themes light/dark with the rest of the page. data.json gains a topology {nodes, edges} block. Docs (profile, README, CLAUDE.md) link the new view. Co-Authored-By: Claude Opus 4.8 <[email protected]> Claude-Session: https://claude.ai/code/session_01EiJUpqQvbWm8pVyV8bRYy1
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.
What & why
Gives the program a single status + documentation dashboard for every
@unabandoned/*fork — pending Renovate updates, open PRs/issues, latest release, CI, security fast-path in flight, and what each package is used for — built so it can't go stale.The sustainability design splits the data in two:
security/autorelease: pending) is pulled live from the GitHub API at build time — never stored anywhere..unabandoned.yml, co-located with the code so it's updated in the same PR. The dashboard reads it straight from the fork's default branch — there is no central registry to drift.The dashboard is generated and never hand-edited, published to GitHub Pages at
https://unabandoned.github.io/.github/on a daily schedule, on demand, and whenever the builder changes. Since the org has no forks published yet, this ships the whole convention before there's anything to retrofit; the page renders a clean empty state until the first fork lands.What's included
scripts/build_dashboard.py+scripts/dashboard_template.html— discovers forks (a repo is a fork iff it carries.unabandoned.yml), gathers live state, renders a theme-aware, self-contained static site + machine-readabledata.json. Best-effort by construction: one failing API call degrades a single datum to "unknown" rather than failing the build.scripts/validate_metadata.py— the single definition of the.unabandoned.ymlschema, imported by the builder and run byreusable-cion every fork PR, so a fork can't merge broken metadata or silently fall off the dashboard.templates/.unabandoned.yml— the metadata template + fork-standup docs..github/workflows/dashboard.yml— build + Pages deploy (SHA-pinnedcheckout; Pages actions on major-version tags per the existing "Renovate pins to digests on first run" convention).reusable-ci.yml— newmetadatajob validating.unabandoned.yml(no-op when absent).CONTRIBUTING.mdchecklist,templates/README.md,README.md,profile/README.mdlink, andCLAUDE.mdprogram guidance including the one-time human Settings → Pages → Source: GitHub Actions step.One-time human setup
Enable Pages in
unabandoned/.github: Settings → Pages → Build and deployment → Source: GitHub Actions. Like the Renovate app andnpm trust, this repo toggle can't be scripted.Type of change
fix/feat/perf— consumer-facingdeps— dependency update (add thesecuritylabel if it fixes a CVE)chore/ci/build/docs/test/refactor— maintenanceChecklist
commitlintpasses)npm testpasses on Node 20 / 22 / 24 — no JS/test surface changed; the Python scripts arepy_compile-clean and smoke-tested (validator against valid/invalid metadata, renderer against populated + empty states, all placeholders filled)PyYAML, installed into an isolated venv in CI only for the dashboard build; it never touches any published or fork dev treenode:testover new runners)Generated by Claude Code