Health dashboards for the codesweep-ai open-source projects on GitHub.
This repository holds the web pages that show how the codesweep-ai projects on GitHub are doing. The set will grow.
Nothing collects the data centrally. Each project publishes its own status as part of its Pages deployment, and this page assembles them in the browser.
codesweep.ai/lint/ci-status.json published by lint's pages workflow
codesweep.ai/ledger/ci-status.json …
codesweep.ai/dashboards/
projects.json where to find them
ci.html + ci.js fetches the above and renders
action/ and deploys the result.
examples/lint-pages.yml is the worked example.projects.json here.The Pages workflow checks out the branch’s history without its file contents: fetch-depth: 0
with filter: blob:none. The action then asks git rather than GitHub’s API whether a build is
still on the branch. In the repository’s own job it reads its workflows, its go.mod and its details from
the checkout and the event, which leaves one API call: the run history.
A project that publishes images needs them out before a commit is built. The action reads that from the registry: the commit’s version has to be in every image repository the project publishes to. SPEC.md says why the run alone cannot tell.
The collection logic lives in action/, so it is written once rather than copied into each
project. A project pins it by commit, codesweep-ai/dashboards/action@<sha>, rather than by
branch: @main would mean that project’s build runs whatever this repository holds today.
CONTRIBUTING.md says what changing it then costs.
The page works unchanged in a fork, and shows the fork’s own projects. Its paths are relative, so it
reads the status files on the host that serves it. A fork owned by alice serves the page at
alice.github.io/dashboards/ci, which reads alice.github.io/lint/ci-status.json and the rest. The
page still carries the codesweep-ai name, since only the data follows the fork.
A project appears once its fork publishes a status:
The action reads the workflow history of the repository that calls it. A fork’s pin to
codesweep-ai/dashboards/action therefore reports the fork’s own builds. A project nobody has forked
is shown as “no status”.
make status takes the owner from the origin remote, so a fork’s preview shows the fork’s runs. Set
OWNER to preview another owner’s projects. Where origin is not on GitHub, such as a sandbox’s local
path, every target that reads GitHub stops at once and asks for OWNER= and REPOSITORY=. make owner
prints the owner the targets would read.
SPEC.md is the contract: what a status file must contain, and what a page may assume about one. A project that satisfies it needs to know nothing else about these pages.
Because each project publishes independently, the page is explicit about what it received:
ci run, not from when its file was written. A project
that rebuilds its site on a schedule is therefore still flagged once it stops building.The headline counts the repositories that are green right now, and the line under it says how steady they are:
ci workflow and folds the other
steady ones into one line, and the tiles measure the ci workflow alone.The page says where each project’s dependencies stand and what to do about them. It covers Go modules, npm packages, GitHub Actions, toolchains, container images, Fedora packages and native pins such as the Firecracker release and the guest kernel. CI runners count too, macOS and self-hosted ones included.
It opens on Projects. The Next action card names the most urgent change across the org, with the command that makes it, and a short list follows it. A card per project links to its own page. A project’s page starts with what to do in that project, in three tiers of urgency: fix now, plan and routine. Below that, closed until opened, sit its advisories, licenses, supply chain signals, pins on siblings, release lines and every dependency it has. Each row opens onto the detail behind it.
Four more views show the whole org another way:
deps-config.json are listed below the tiers, with when each lapses.The headline counts the projects with something to fix now. A libyear is the time between a pinned release and the newest one, and the tiles add them up across the org.
A verdict comes with the evidence a reviewer would ask for:
deps-config.json and nothing else, and a
license only matters where the dependency ships. Fedora packages are graded from their spec files. A
license the policy does not name becomes a routine action to add it. A stricter license found in a
package’s own files is shown beside the one it declares.deps-config.json sets a policy for them.deps-config.json with a reason and a date they lapse.deps-feed.xml, beside the page, is an Atom feed of what needs fixing now. Following it in a feed reader
is the alert, and needs no account. deps.cdx.json is the same inventory as a CycloneDX SBOM, with a VEX
analysis on each advisory, for tools such as Dependency-Track.
deps-actions.json, beside the page, is the actions file: every change the page recommends, per project,
written for an agent to carry out in a clone. Each action lists the commands to run and the edits to make,
at their file and line. It says what each dependency moves from and to, and when the change counts as
done. It also carries the accepted entry to propose when a change should not be made. An agent needs one GET:
curl -s https://codesweep.ai/dashboards/deps-actions.json
SPEC.md describes every field.
The page reads deps.json, the dependencies file, which is published beside it. This site’s build
writes it by running the collector, which clones each project’s default branch over plain git and asks
public sources about every dependency. It needs no API key. Sources, at the foot of the page, lists
every source and what each gives, and SPEC.md describes each in full.
In a fork, the build clones the fork owner’s repositories and reads the history its own site published, so the page shows the fork’s projects. The codesweep-ai modules, packages and images still count as siblings, because a fork keeps their names. The page keeps the codesweep-ai name too.
The collector runs every day as well as on every push to this repository. Dependencies move without anyone committing: a registry publishes a release, a runtime reaches its end of life, an advisory lands. The page flags a file older than 36 hours.
The collector finds dependencies in manifests, workflows and Containerfiles on its own. A version kept
anywhere else, such as in a Go constant, needs a pin in deps-config.json: the file, a pattern that
matches the version, and where newer releases are published. A pin that stops matching is flagged on the
page. SPEC.md lists the fields, and the other ways to declare a
version.
_preview/ mirrors the codesweep.ai layout, so relative paths and same-origin behaviour are
exercised exactly as in production:
export GH_TOKEN=$(gh auth token)
make deps status dependencies preview
# then open http://localhost:8732/dashboards/ci.html
# or http://localhost:8732/dashboards/deps.html
The preview server runs no Jekyll and serves no extensionless URLs, so follow ci.html rather than
ci. make dependencies writes deps.json, deps-actions.json, deps-feed.xml and deps.cdx.json
into the tree. It needs no token, and needs Go for govulncheck. It takes a few minutes.
CONTRIBUTING.md has the rest.
?theme=light|dark|system overrides the theme for one load without saving it.
Bug reports and pull requests are welcome. CONTRIBUTING.md has the rules, and applies to coding agents as much as to people. It also covers how to report a security issue privately.
Testing. make ci must pass before you open a PR. It runs every gate CI runs. No gate looks at
a page, so preview the result as well.
Apache-2.0. See LICENSE and NOTICE.