All notable changes to this project will be documented here.
- JSON Schema contracts: Draft-07 schemas for all evidence output files —
ecosystem-status,health-scores,manifest,action-queue. Machine-readable structure definitions inschemas/directory. - Evidence validator: Zero-dep Node.js script (
scripts/validate-evidence.js) validates evidence JSON against schemas in CI. Handles PowerShell BOM, validates types/required/enum/ranges, first 5 items per array. - CI validation step: New
validate-evidencejob invalidate.ymlcatches schema violations before merge. - Dashboard freshness banner: Pipeline status badge (success/partial/failed), relative time since last refresh ("2h ago"), step counts ("8/8 steps"). Stale data warning (orange banner) when data >12h old with link to GitHub Actions.
- Per-repo freshness dots: Green/yellow/red dots on health cards showing per-repository pipeline status from
manifest.json. - Trend arrows on health cards: ↑ improving, → stable, ↓ declining with 7-day delta from
health-trends.json. - Dashboard now fetches
manifest.json+health-trends.jsonalongside existing data (5 parallel fetches).
- GitHub GraphQL batching: All GitHub API calls now use a single GraphQL query instead of N individual REST calls. Scanning 30 packages makes 1 GitHub request instead of 30. Massive rate-limit savings.
lib/github-graphql.js: New module — builds aliased GraphQL queries, fetches stargazers, forks, issues, push date, archive status, and license in one round-trip. Batches up to 50 repos per query.- Smart concurrency: With
GITHUB_TOKEN, default concurrency increases from 2 to 5 (npm fetches are the bottleneck now, not GitHub). - Tests: 71 passing (up from 68) — new suite for GraphQL module with unit + integration tests
api.js: Refactored into 3-phase architecture — Phase 1 (npm metadata, parallel batches) → Phase 2 (GitHub GraphQL batch) → Phase 3 (score + enrich). Falls back to REST if no token.getNpmInfo()extracted fromgetPackageInfo()for npm-only fetches when GraphQL handles GitHub datamergeGithubData()extracted as shared merge function for both REST and GraphQL paths- User-Agent bumped to
oss-health-scan/1.4in GraphQL client
- 8 packages: 3 seconds with GraphQL (was ~12s with REST)
- 30 packages: 1 GitHub API call (was 30)
- Rate limit usage: ~97% reduction for GitHub API
--unusedflag: Detect dependencies not imported in any source file. Scans.js/.ts/.jsx/.tsx/.mjs/.cjs/.vue/.sveltefiles recursively. Knows about config-only deps (eslint, babel, jest, etc.) to avoid false positives.- ETag caching: GitHub API responses are cached with ETags. Second scan of the same packages uses conditional requests (304 Not Modified) — doesn't count toward rate limit. ~60% fewer API calls on repeated scans.
- Unused deps module (
lib/unused.js): Static analysis ofrequire()/import/import()across all source files - New export:
require('oss-health-scan/unused') - Tests: 68 passing (up from 55)
- GitHub Topics: 20 topics for discoverability
fetcher.js: ETag cache with 1h TTL, disk persistence inos.tmpdir()- User-Agent bumped to
oss-health-scan/1.3
--outdatedflag: Shows installed vs latest versions with libyear metric and drift classification (major/minor/patch)--vulnsflag: Checks OSV.dev for known vulnerabilities (CVEs) per package — zero dependencies- OSV.dev integration (
lib/osv.js): POST toapi.osv.dev/v1/query, CVSS v3 severity parsing, vulnerability summarization - Libyear metric (
lib/outdated.js): Readspackage-lock.json(v6 + v7+), parses semver, estimates version age - Enhanced terminal report: Per-package drift info, vulnerability counts with severity breakdown
- Enhanced Markdown output: Conditional Installed/Latest/Drift columns, CVE column with severity counts
- New exports:
require('oss-health-scan/outdated'),require('oss-health-scan/osv') - Tests: 55 passing (up from 31) — new suites for outdated, OSV, severity parsing
scanPackages()API acceptsoutdated,vulns,diroptions- JSON output includes
outdatedSummarywhen--outdatedis used - Terminal report shows outdated/vulnerability summary in header
- Description updated to reflect CVE + outdated capabilities
- Programmatic API:
scanPackages()andscanPackageJson()— import and use in custom tools, dashboards, Slack bots - SARIF output:
--sarifflag generates SARIF 2.1.0 for GitHub Code Scanning / Advanced Security - Config file support:
.oss-health-scanrc.jsonorpackage.json"oss-health-scan"field for persistent options - License risk scoring: GPL/UNLICENSED/missing license penalized in risk dimension
- Action outputs:
action.ymlnow exportshealth-json,manifest-json,critical-count,avg-health - Tests: 31 passing (up from 15) — new suites for API module, SARIF output, license scoring
- Scoring: stricter issue ratio curve (20 issues now penalizes significantly, was ignored before)
- Scoring: license risk factor added to risk dimension (15% weight)
- Action: consolidated to single step with PowerShell outputs instead of 4 separate steps
- CLI refactored:
getPackageInfoextracted toapi.jsfor reuse
- 429 rate limiting:
fetcher.jsnow retries on HTTP 429 withRetry-Afterheader support - Package version synced to 1.2.0
- CLI: retry logic with exponential backoff for transient HTTP failures
- CLI: comprehensive unit tests for scoring algorithm (15 test cases)
- CI: CLI unit tests and smoke test in validate workflow
- GitHub Action (
action.yml) as composite reusable action for other repos
- CLI: correct rate-limit header extraction from GitHub API responses
- CLI: handle missing/null fields gracefully in score computation
- Bumped
actions/checkoutfrom v4 to v6 in all workflows - README reframed for honest contribution scope (removed inflated aggregate claims)
- CONTRIBUTING.md updated to reference config-driven workflow
- Automated health tracking for 7 OSS packages across the tracked ecosystem
- GitHub Actions workflow running every 6 hours — zero manual updates required
- Machine-readable JSON evidence snapshots in
evidence/ - Human-readable Markdown SLA reports per tracked repo
- PR SLA monitoring: flags when maintainer feedback exceeds configurable threshold
- Prioritized action queue (
evidence/action-queue.md) generated from SLA data - Auto-updating README stats (stars, downloads, open PRs) from live evidence data
- Live dashboard at https://dusan-maintains.github.io/oss-maintenance-log
- GitHub Pages site with real-time data from evidence JSON
- Open Graph + Twitter card meta tags for rich link previews
- Reusable as a template repo — fork and update 3 scripts to track your own packages
- Issue templates: suggest-package, pr-status-update
- GitHub Discussions enabled
- SECURITY.md
- action.yml for GitHub Actions Marketplace
kylefox/jquery-modal— 3 open PRs (#315, #316, #317)kylefox/jquery-tablesort— 1 open PR (#49)extrabacon/python-shell— 1 open PR (#320)jkbrzt/rrule— 1 open PR (#664)Hellenic/react-hexgrid— 1 open PR (#123)lingdojo/kana-dojo— 1 merged PR (#6309)grafana/grafana— 1 open PR (#119212)