Skip to content

Commit f15d689

Browse files
feat: dashboard design polish (#185)
* feat: polish dashboard visual design * feat: enrich dashboard stat card sparklines * feat: polish dashboard bar fills * feat: add contextual dashboard next moves * feat: add dashboard relationship visualizations * feat: add dashboard readiness queue * fix: reduce opportunity map mark density * docs: add dashboard map guide * docs: add editable dashboard guide * Polish dashboard storytelling and promotional guide * chore: publish Reponomics README dashboard [skip ci] * Revert "chore: publish Reponomics README dashboard [skip ci]" This reverts commit 7502f6d. * Add traffic chart code activity overlay * Fix unlock vault hero overlay * Add demo preview make target --------- Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
1 parent 0542025 commit f15d689

64 files changed

Lines changed: 9534 additions & 1290 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@ This directory contains the repository's CI, release, dependency, and supply-cha
2222

2323
- [`publish-demo.yml`](publish-demo.yml) builds the generated public demo repository and publishes it to `reponomics-dashboard-demo`. It supports manual publication and scheduled daily refresh. Scheduled refresh uses an approved source ref, imports the encrypted synthetic data seed into the demo repository's Actions artifact storage, and deploys the committed Pages dashboard shell without requiring daily human approval.
2424

25+
- [`promotional-dashboard-guide.yml`](promotional-dashboard-guide.yml) is a manual skeleton for refreshing the promotional HTML/PDF dashboard guide. It runs the same `make dashboard-guide-refresh` path used locally, with ephemeral `npx`/`pipx` guide tooling, and intentionally does not publish or commit artifacts by default.
26+
2527
- [`pre-release-validation.yml`](pre-release-validation.yml) is a manual, non-publishing validation pass for candidate refs. It builds the template from the candidate source, runs template smoke checks, runs generated-template consumer e2e against the same candidate action runtime, dry-runs template publication, and uploads the generated template for inspection.
2628

2729
- [`sbom-provenance.yml`](sbom-provenance.yml) generates a repository SPDX SBOM and creates release source/SBOM attestations for release and manual runs. Release asset upload is explicitly disabled because immutable releases cannot be mutated after publication, and dependency snapshot upload is disabled so the third-party SBOM action runs with a read-only job token.
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
name: Promotional dashboard guide
2+
3+
on:
4+
workflow_dispatch:
5+
6+
permissions:
7+
contents: read
8+
9+
jobs:
10+
build-guide:
11+
name: Build promotional guide artifacts
12+
runs-on: ubuntu-latest
13+
14+
steps:
15+
- name: Checkout
16+
# actions/checkout v7.0.0
17+
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0
18+
19+
- name: Setup Python
20+
# actions/setup-python v6.3.0
21+
uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1
22+
with:
23+
python-version: "3.11"
24+
25+
- name: Setup Node
26+
# actions/setup-node v6.4.0
27+
uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e
28+
with:
29+
node-version: "24"
30+
31+
- name: Prepare ephemeral guide tooling
32+
run: |
33+
python -m pip install --user pipx
34+
echo "$HOME/.local/bin" >> "$GITHUB_PATH"
35+
npx --yes --package playwright -- playwright install --with-deps chromium
36+
37+
- name: Build promotional guide
38+
run: make dashboard-guide-refresh
39+
40+
# Skeleton integration point:
41+
# Upload docs/promotional/dashboard-guide/ and docs/promotional/pdf/reponomics-dashboard-map.pdf
42+
# or commit them from a maintainer-approved workflow if desired.

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ docs/index.html
1616
README.generated.md
1717
.DS_Store
1818
.vscode/
19+
.playwright-mcp/
1920

2021
.tmp/
2122

Makefile

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,20 @@
44
.PHONY: test js-test js-coverage js-smoke coverage complexity security security-audit audit-runtime-lock lock-runtime validate-runtime-lock update-vendored-assets
55
.PHONY: lint type-check markdown-format
66
.PHONY: validate validate-action validate-workflows validate-vendored-assets
7-
.PHONY: build-template verify-template build-and-verify-generated verify-workflow-classification validate-template-action-ref validate-template-accepted-action template-smoke template-consumer-e2e template-action-boundary-e2e template-compat-e2e template-public-action-e2e template-accepted-action-e2e template-release-gates package-template-release publish-template-dry-run publish-template publish-template-staging-dry-run publish-template-staging build-demo verify-demo render-demo-preview preview-demo-site publish-demo-dry-run publish-demo
8-
.PHONY: fixtures fixture-collect fixture-publish fixture-rotate-key preview-collection-quality-dashboard dashboard-scenario-snapshots update-dashboard-scenario-snapshots clean
7+
.PHONY: build-template verify-template build-and-verify-generated verify-workflow-classification validate-template-action-ref validate-template-accepted-action template-smoke template-consumer-e2e template-action-boundary-e2e template-compat-e2e template-public-action-e2e template-accepted-action-e2e template-release-gates package-template-release publish-template-dry-run publish-template publish-template-staging-dry-run publish-template-staging build-demo verify-demo render-demo-preview preview-demo preview-demo-site publish-demo-dry-run publish-demo
8+
.PHONY: fixtures fixture-collect fixture-publish fixture-rotate-key preview-collection-quality-dashboard dashboard-scenario-snapshots update-dashboard-scenario-snapshots dashboard-guide-assets dashboard-guide dashboard-guide-refresh clean
99

1010
VENV := venv
1111
PYTHON := $(VENV)/bin/python
1212
PIP := $(VENV)/bin/pip
1313
NODE ?= node
14+
NPX ?= npx
1415
PIPX ?= pipx
1516
JS_SMOKE_PYTHON ?= python3
17+
GUIDE_PYTHON ?= $(PIPX) run --with Pillow --with reportlab python
18+
GUIDE_NODE ?= $(NPX) --yes --package playwright -- node
19+
GUIDE_NODE_PATH ?=
20+
GUIDE_ASSET_CAPTURE_ARGS ?=
1621
ANTIPASTA := $(VENV)/bin/antipasta
1722
PIP_AUDIT := $(VENV)/bin/pip-audit
1823
PIP_COMPILE := $(VENV)/bin/pip-compile
@@ -182,6 +187,17 @@ js-coverage: ## Run JavaScript module tests with Node coverage reporting
182187
js-smoke: ## Check dashboard JavaScript syntax and flattened secure runtime assembly
183188
NODE=$(NODE) $(JS_SMOKE_PYTHON) scripts/check_dashboard_js_smoke.py
184189

190+
dashboard-guide-assets: render-demo-preview ## Capture dashboard guide screenshot assets from the rendered demo preview
191+
NODE_PATH="$(GUIDE_NODE_PATH)" $(GUIDE_NODE) scripts/capture_dashboard_guide_assets.mjs \
192+
--dashboard-dir $(DEMO_PREVIEW_DIR) \
193+
--out-dir docs/promotional/dashboard-guide/assets \
194+
$(GUIDE_ASSET_CAPTURE_ARGS)
195+
196+
dashboard-guide: ## Build editable HTML and PDF dashboard guide artifacts
197+
$(GUIDE_PYTHON) scripts/build_dashboard_guide.py
198+
199+
dashboard-guide-refresh: dashboard-guide-assets dashboard-guide ## Refresh dashboard guide screenshots, HTML, and PDF
200+
185201
coverage: install ## Run tests with coverage report
186202
$(PYTHON) -m pytest tests -v --cov=dashboard_action --cov-report=term-missing --cov-report=xml --cov-fail-under=$(COVERAGE_FAIL_UNDER)
187203

@@ -312,6 +328,8 @@ render-demo-preview: build-demo ## Render the demo Pages dashboard locally in di
312328
@test -s $(DEMO_PREVIEW_DIR)/assets/demo-unlock.css
313329
@echo "Demo Pages preview rendered: $(DEMO_PREVIEW_DIR)/index.html"
314330

331+
preview-demo: preview-demo-site ## Render and serve the local demo dashboard preview
332+
315333
preview-demo-site: render-demo-preview ## Serve the local demo Pages dashboard preview
316334
@echo "Serving demo preview at http://$(DEMO_PREVIEW_HOST):$(DEMO_PREVIEW_PORT)/"
317335
$(PYTHON) -m http.server $(DEMO_PREVIEW_PORT) --bind $(DEMO_PREVIEW_HOST) --directory $(DEMO_PREVIEW_DIR)

dashboard_action/runtime/scripts/load_data.py

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,9 @@
4747
actionable_insights,
4848
actionable_insights_structured,
4949
)
50+
from load_data_modules.narratives import (
51+
narrative_insights_structured,
52+
)
5053
from load_data_modules.quality import (
5154
collection_quality,
5255
)
@@ -91,11 +94,21 @@
9194
"latest_repo_metrics_per_day",
9295
"load_collection_status",
9396
"load_collection_days",
97+
"load_collection_endpoints",
98+
"load_code_frequency_weekly",
99+
"load_contributor_activity_weekly",
94100
"load_daily",
101+
"load_event_index",
102+
"load_issue_label_snapshots",
103+
"load_issue_pr_snapshots",
104+
"load_languages",
95105
"load_paths",
96106
"load_referrers",
107+
"load_release_assets",
97108
"load_repo_metrics",
109+
"load_topics",
98110
"load_traffic_coverage",
111+
"narrative_insights_structured",
99112
"repo_growth_series",
100113
"repo_metric_deltas",
101114
"storage",
@@ -144,6 +157,51 @@ def load_traffic_coverage(data_dir=None):
144157
return _load_csv("traffic-coverage.csv", data_dir)
145158

146159

160+
def load_event_index(data_dir=None):
161+
"""Load repo-event-index.csv and return the raw row list."""
162+
return _load_csv("repo-event-index.csv", data_dir)
163+
164+
165+
def load_release_assets(data_dir=None):
166+
"""Load repo-release-assets.csv and return the raw row list."""
167+
return _load_csv("repo-release-assets.csv", data_dir)
168+
169+
170+
def load_languages(data_dir=None):
171+
"""Load repo-languages.csv and return the raw row list."""
172+
return _load_csv("repo-languages.csv", data_dir)
173+
174+
175+
def load_topics(data_dir=None):
176+
"""Load repo-topics.csv and return the raw row list."""
177+
return _load_csv("repo-topics.csv", data_dir)
178+
179+
180+
def load_issue_pr_snapshots(data_dir=None):
181+
"""Load repo-issue-pr-snapshots.csv and return the raw row list."""
182+
return _load_csv("repo-issue-pr-snapshots.csv", data_dir)
183+
184+
185+
def load_issue_label_snapshots(data_dir=None):
186+
"""Load repo-issue-label-snapshots.csv and return the raw row list."""
187+
return _load_csv("repo-issue-label-snapshots.csv", data_dir)
188+
189+
190+
def load_collection_endpoints(data_dir=None):
191+
"""Load collection-endpoints.csv and return the raw row list."""
192+
return _load_csv("collection-endpoints.csv", data_dir)
193+
194+
195+
def load_code_frequency_weekly(data_dir=None):
196+
"""Load repo-code-frequency-weekly.csv and return the raw row list."""
197+
return _load_csv("repo-code-frequency-weekly.csv", data_dir)
198+
199+
200+
def load_contributor_activity_weekly(data_dir=None):
201+
"""Load repo-contributor-activity-weekly.csv and return the raw row list."""
202+
return _load_csv("repo-contributor-activity-weekly.csv", data_dir)
203+
204+
147205
def _load_csv(filename, data_dir=None):
148206
data_path = data_dir or storage.DATA_DIR
149207
return _filter_published_rows(storage.read_csv(os.path.join(data_path, filename)))

0 commit comments

Comments
 (0)