You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
The registry list lives as a markdown table in the README. It reads well, but it is hard to consume: the website, the docs, and any tool that wants to install a plugin has to parse markdown or scrape HTML.
Hand maintenance has also let the table drift. As of today: two CI badges are swapped between the nextcloud and dokuwiki rows, the false-positive-report-plugin row is missing its License cell, dokuwiki's link text has a typo, two plugins have integration tests but no badge, and there is an undocumented hole in the rule ID space at 9,515,000 - 9,515,999. See this comment for the full audit.
Goal
Make the registry a machine-readable index that tooling can resolve against to discover and install plugins from a place it can trust, and generate the README table from that index instead of maintaining it by hand.
An installer needs to answer, without parsing markdown: which plugins exist, where they live, which version to install (resolved to a release tag, not a moving branch), whether the plugin is vetted, its license, its rule ID range so collisions with already-installed plugins are detectable, and how to configure it.
Design
Two artifacts, with different owners:
registry.yaml, in this repo — authoritative for rule ID range allocation and for the vetting signal (type, status). Changed only through reviewed PRs.
plugin.yaml, in each plugin repo (feat: add plugin schema #37) — authoritative for the plugin's description and its configuration variables.
The index stays in this repo rather than being assembled by fetching every plugin repo, because ranges have to be allocated centrally to prevent collisions, some registered plugin repos are private and cannot be fetched at all, and a plugin repo declaring itself status: tested in its own descriptor attests nothing — the same field here, set through review, does.
What the registry attests: that a rule ID range is allocated, and that CRS maintainers reviewed the registration. It is not a code audit and not a supply-chain guarantee. Signing or checksums can attach to release tags later; out of scope for the first iteration.
Requirements
registry.yaml holding the plugin list (name, rule ID range, repository, type, status, license), migrated from the current table with the drift above fixed
JSON Schema for registry.yaml, validated in CI: unique names, no duplicate or overlapping ranges, ranges inside 9,500,000 - 9,999,999, GitHub repository URLs, SPDX license identifiers
README skeleton with markers delimiting where the generated table goes
generator that renders the table from registry.yaml, with CI badges derived from the repository field instead of typed by hand
CI regenerates and fails on drift (git diff --exit-code) rather than committing from a GHA — same guarantee, no write access to main, no branch-protection friction
publish a generated machine-readable index (registry.json) at a stable URL, for the website, the docs and installers
document what the registry attests and what it does not, so downstream tooling does not over-read it
Problem
The registry list lives as a markdown table in the README. It reads well, but it is hard to consume: the website, the docs, and any tool that wants to install a plugin has to parse markdown or scrape HTML.
Hand maintenance has also let the table drift. As of today: two CI badges are swapped between the nextcloud and dokuwiki rows, the
false-positive-report-pluginrow is missing its License cell, dokuwiki's link text has a typo, two plugins have integration tests but no badge, and there is an undocumented hole in the rule ID space at 9,515,000 - 9,515,999. See this comment for the full audit.Goal
Make the registry a machine-readable index that tooling can resolve against to discover and install plugins from a place it can trust, and generate the README table from that index instead of maintaining it by hand.
An installer needs to answer, without parsing markdown: which plugins exist, where they live, which version to install (resolved to a release tag, not a moving branch), whether the plugin is vetted, its license, its rule ID range so collisions with already-installed plugins are detectable, and how to configure it.
Design
Two artifacts, with different owners:
registry.yaml, in this repo — authoritative for rule ID range allocation and for the vetting signal (type,status). Changed only through reviewed PRs.plugin.yaml, in each plugin repo (feat: add plugin schema #37) — authoritative for the plugin's description and its configuration variables.The index stays in this repo rather than being assembled by fetching every plugin repo, because ranges have to be allocated centrally to prevent collisions, some registered plugin repos are private and cannot be fetched at all, and a plugin repo declaring itself
status: testedin its own descriptor attests nothing — the same field here, set through review, does.What the registry attests: that a rule ID range is allocated, and that CRS maintainers reviewed the registration. It is not a code audit and not a supply-chain guarantee. Signing or checksums can attach to release tags later; out of scope for the first iteration.
Requirements
registry.yamlholding the plugin list (name, rule ID range, repository, type, status, license), migrated from the current table with the drift above fixedregistry.yaml, validated in CI: unique names, no duplicate or overlapping ranges, ranges inside 9,500,000 - 9,999,999, GitHub repository URLs, SPDX license identifiersregistry.yaml, with CI badges derived from therepositoryfield instead of typed by handgit diff --exit-code) rather than committing from a GHA — same guarantee, no write access tomain, no branch-protection frictionregistry.json) at a stable URL, for the website, the docs and installersRefs #37 for the per-plugin descriptor schema.