Öffentliches Register
Software-GesundheitsberichtSchema 0.27.0 · Metriken 1.13.0 · 2026-07-30 09:18 UTC

asciidoctor / asciidoctor-reveal.js

:crystal_ball: A reveal.js converter for Asciidoctor and Asciidoctor.js. Write your slides in AsciiDoc!

HTML · JavaScript · RubyEigene Lizenz★ 313 Sterne⑂ 185 Forksseit Okt. 2014Auf GitHub ansehen ↗

asciidoctor/asciidoctor-reveal.js erreicht einen Gesundheitsindex von 71 von 100 und liegt damit im Bereich Gut. Am stärksten schneidet es bei Engineering Quality (90/100) ab, am schwächsten bei AI Readiness (48/100). Zuletzt heute aktualisiert. Ein einzelner Mitwirkender trägt den Großteil der jüngsten Arbeit.

71
gesamt / 100
Gut

Software-Gesundheitsindex

Metriken werden auf einer Skala von 1–100 in gewichtete Kategorien gruppiert. Der Gesamtwert beginnt als ihr Mittel; sobald öffentliche Evidenz die Richtlinie für Hochrisikojurisdiktionen auslöst, wird die Bewertung angepasst und erhält die Obergrenze 49 (Gefährdet). AI Readiness liegt außerhalb.

71
Exzellent85-100Vorbildlich; erfüllt im Wesentlichen alle geprüften Kriterien
Gut70-84Gesund; geringfügige Lücken
Mittel50-69Akzeptabel mit deutlichen Lücken; Überprüfung empfohlen
Gefährdet30-49Erhebliche Schwächen; eine Übernahme erfordert Vorsicht
Kritisch1-29Schwerwiegende Probleme (aufgegeben, nur ein Maintainer, keine Hygiene)
VitalitätCommunity &VerbreitungNachhaltigkeit &GovernanceEngineering-QualitätSicherheitAI Readiness

Bewertungsprofil

Jede Achse ist eine Kategorie. Die Form zählt mehr als der Durchschnitt — ein gesundes Projekt füllt die gesamte Fläche, während ein Profil aus Spitzen und Kratern bedeutet, dass Stärke in einer Dimension Risiken in einer anderen verdeckt.

Eigentümerschaft

AsciidoctorOrganisation
466 Follower83 öffentliche Reposseit Dez. 2012

Dieses Repository wird von einer Organisation getragen — geteilte, rechenschaftspflichtige Trägerschaft, die jeden einzelnen Maintainer überdauern kann.

Paket-Ökosysteme

RegistryPaketVersionDownloads / MonatVersionenZuletzt veröffentlichtTags
npm@asciidoctor/reveal.js5.2.05.16211vor 603 Tagenasciidocasciidoctoropaljavascriptlibrarybackendtemplatereveal.js
RubyGemsasciidoctor-revealjs5.2.0-26vor 0 Tagen

Metriken nach Kategorie

Vitalität

Lebt das Projekt — wird Code geschrieben und werden Releases ausgeliefert?

70Gut · 22 % des Gesamtindex
Wie die Bewertung erfolgt
36/36Push-Aktualität — letzter Push vor 0 Tagen
2.8/36Commit-Rhythmus — 4/52 Wochen mit Commits
16.7/18Commit-Volumen — 71 Commits im letzten Jahr
10/10OpenSSF Scorecard: Maintained — 30 commit(s) and 19 issue activity found in the last 90 days -- score normalized to 10
Verwendete Eingangsdaten
commits_last_year71
human_commit_share0,96
days_since_last_push0
active_weeks_last_year4
Wie die Bewertung erfolgt
27/27Liefert Releases aus — 22 Releases veröffentlicht
36/36Release-Aktualität — letztes Release vor 0 Tagen
12.6/27Release-Rhythmus — ein Release etwa alle 264,9 Tage
0/10OpenSSF Scorecard: Signed-Releases — Project has not signed or included provenance with any releases.
Verwendete Eingangsdaten
releases_count22
latest_release_tagv6.0.0-beta.2
releases_from_tagsnein
days_since_latest_release0
mean_days_between_releases264,9

Community & Verbreitung

Hat das Projekt Nutzer, Downloads, Aufmerksamkeit und ein einladendes Umfeld für Beitragende?

62Mittel · 18 % des Gesamtindex
Wie die Bewertung erfolgt
40.5/60Stars — 313 Stars
18.9/25Forks — 185 Forks
6/15Watcher — 13 Watcher
Verwendete Eingangsdaten
forks185
stars313
watchers13
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
Wie die Bewertung erfolgt
22.5/22.5README
16.9/22.5Lizenz — Lizenzdatei vorhanden, keine anerkannte Lizenz
0/18CONTRIBUTING-Leitfaden
13.5/13.5Verhaltenskodex
0/7.2Issue-Vorlage
0/6.3PR-Vorlage
Verwendete Eingangsdaten
has_readmeja
has_licenseja
has_contributingnein
has_issue_templatenein
has_code_of_conductja
has_pull_request_templatenein
Wie die Bewertung erfolgt
49.5/80Downloads pro Monat — 5.162 Downloads/Monat über npm, rubygems
0/20Abhängige in der Registry — von diesem Ökosystem nicht ausgewiesen
Verwendete Eingangsdaten
packages@asciidoctor/reveal.js, asciidoctor-revealjs
dependents
ecosystemsnpm, rubygems
total_downloads293.858
monthly_downloads5.162
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): Abhängige in der Registry. Die verbleibenden Gewichte wurden renormalisiert.

Nachhaltigkeit & Governance

Überdauert das Projekt die Menschen, die es tragen — Bus-Faktor, Reaktionsfähigkeit, Trägerschaft und Paketpflege?

71Gut · 24 % des Gesamtindex
Wie die Bewertung erfolgt
9/54Bus-Faktor — 1 Beitragende decken die Hälfte aller Commits ab
8.9/22.5Commit-Verteilung — wichtigste beitragende Person verfasste 60 % der Commits
13.5/13.5Breite der Beitragenden — 42 Beitragende
10/10OpenSSF Scorecard: Contributors — project has 30 contributing companies or organizations
Verwendete Eingangsdaten
bus_factor1
contributors_sampled42
top_contributor_share0,605
Wie die Bewertung erfolgt
46.6/46.8Issue-Lösungsquote — 100 % der Issues geschlossen
34.3/38.3PR-Annahme — 292/326 entschiedene PRs gemergt
0/15OpenSSF Scorecard: Code-Review — Found 0/30 approved changesets -- score normalized to 0
Verwendete Eingangsdaten
merged_prs292
open_issues1
closed_issues273
issue_closed_ratio0,996
closed_unmerged_prs34
Wie die Bewertung erfolgt
30/30Organisatorische Trägerschaft — im Besitz einer Organisation
0/20Verifizierte Domain
19.2/25Reichweite des Inhabers — 466 Follower von asciidoctor
25/25Kontohistorie — 83 öffentliche Repos, Kontoalter ca. 13 Jahre
Verwendete Eingangsdaten
followers466
owner_typeOrganization
is_verified
owner_loginasciidoctor
public_repos83
account_age_days4.962

Paketpflege

100Exzellent
Wie die Bewertung erfolgt
25/25Veröffentlicht & auflösbar — 2 Paket(e) auf npm, rubygems
35/35Veröffentlichungsaktualität — letzte Veröffentlichung vor 0 Tagen
20/20Versionshistorie — 26 veröffentlichte Versionen
20/20Nicht veraltet — aktiv, nicht veraltet oder zurückgezogen
Verwendete Eingangsdaten
packages@asciidoctor/reveal.js, asciidoctor-revealjs
ecosystemsnpm, rubygems
any_deprecatednein
min_days_since_publish0

Engineering-Qualität

Sind grundlegende Engineering- und Dokumentationspraktiken vorhanden?

90Exzellent · 20 % des Gesamtindex
Wie die Bewertung erfolgt
24/24CI-Workflows — 2 Workflow(s)
24/24Tests vorhanden
16/16Linter-Konfiguration — .rubocop.yml
0/9.6Pre-Commit-Hooks
6.4/6.4.editorconfig
20/20OpenSSF Scorecard: CI-Tests — 22 out of 22 merged PRs checked by a CI test -- score normalized to 10
Verwendete Eingangsdaten
has_cija
has_testsja
has_editorconfigja
has_linter_configja
has_precommit_confignein

Dokumentation

90Exzellent
Wie die Bewertung erfolgt
30/30README
25/25Dokumentationsverzeichnis
15/15Dokumentations-/Homepage-Site — http://asciidoctor.org
10/10Repository-Beschreibung
10/10Topics — 7 Topics
0/10Wiki
Verwendete Eingangsdaten
topicsasciidoc, reveal-js, asciidoctor, slides, slideshow, presentations, hacktoberfest
has_wikinein
homepagehttp://asciidoctor.org
has_readmeja
has_docs_dirja
has_descriptionja

Sicherheit

Sind die sichtbaren Sicherheits- und Lieferkettenpraktiken belastbar, ohne ungeklärte Exposition gegenüber Hochrisikojurisdiktionen?

58Mittel · 16 % des Gesamtindex

Sicherheitslage

48Gefährdet
Wie die Bewertung erfolgt
7.5/7.5Binary-Artifacts — no binaries found in the repo
0/7.5Branch-Protection — branch protection not enabled on development/release branches
2.5/2.5CI-Tests — 22 out of 22 merged PRs checked by a CI test -- score normalized to 10
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
0/7.5Code-Review — Found 0/30 approved changesets -- score normalized to 0
2.5/2.5Contributors — project has 30 contributing companies or organizations
10/10Dangerous-Workflow — no dangerous workflow patterns detected
7.5/7.5Dependency-Update-Tool — update tool detected
0/5Fuzzing — project is not fuzzed
2.2/2.5Lizenz — license file detected
7.5/7.5Maintained — 30 commit(s) and 19 issue activity found in the last 90 days -- score normalized to 10
0/5Packaging — keine Daten
1.5/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 3
0/5SAST — SAST tool is not run on all commits -- score normalized to 0
0/5Security-Policy — security policy file not detected
0/7.5Signed-Releases — Project has not signed or included provenance with any releases.
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
6.8/7.5Vulnerabilities — 1 existing vulnerabilities detected
Verwendete Eingangsdaten
sourceopenssf_scorecard
checks_evaluated17
scorecard_versionv5.5.0
checks_inconclusive1
scorecard_aggregate4,8
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): packaging. Die verbleibenden Gewichte wurden renormalisiert.
Wie die Bewertung erfolgt
35/35Direkte Abhängigkeiten ohne bekannte Advisories — keine direkte Abhängigkeit trägt ein bekanntes Advisory
25/25Indirekte Abhängigkeiten ohne bekannte Advisories — keine indirekte Abhängigkeit trägt ein bekanntes Advisory
0/40Keine offenen Advisories — kein Advisory trägt ein Veröffentlichungsdatum
Verwendete Eingangsdaten
sourceosv
advisories0
affected_packages0
assessed_packages18
unassessed_packages0
affected_by_severitynone
direct_affected_packages0
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): Keine offenen Advisories. Die verbleibenden Gewichte wurden renormalisiert. Abgeglichen wurde die Laufzeit-Abhängigkeitshülle von npm:@asciidoctor/reveal.js@5.2.0 — das, was die Installation des veröffentlichten Pakets nach sich zieht — mit 18 Paketen. Erreichbarkeit wird nicht analysiert.

AI Readiness

Wie gut ist das Repository dafür ausgestattet, mit KI-Coding-Agenten entwickelt und gepflegt zu werden? Ein unabhängiges, experimentelles Badge — Gewicht 0,0, es wird eigenständig ausgewiesen und verändert den Gesamt-Gesundheitswert nicht.

48Gefährdet · 0 % des Gesamtindex
Wie die Bewertung erfolgt
0/45Agentenanweisungen — keine CLAUDE.md / AGENTS.md / Editor-Regeln
0/15Maschinenlesbare Doku (llms.txt)
40/40Lesbare Commit-Historie — 84 von 96 menschlichen Commits benennen ihre Absicht (strukturierter Betreff oder erläuternder Text)
Verwendete Eingangsdaten
has_llms_txtnein
legible_history_share0,875
agent_instruction_files
agent_instruction_max_bytes
Wie die Bewertung erfolgt
0/18Bootstrap mit einem Befehl
22/22Automatisierte Tests
11/11Lint-/Format-Konfiguration — .rubocop.yml
0/11Statische Typprüfung
10/10Reproduzierbare Umgebung — lockfile
10/10Belegte Agentenpraxis — 28 der letzten 100 Commits von Agenten verfasst oder ihnen zugeschrieben
0/8Automatisierte Wartung — keine automatisierten Abhängigkeits-Updates beobachtet
3/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 3
Verwendete Eingangsdaten
has_nixnein
has_testsja
lockfilespackage-lock.json
has_dockerfilenein
typed_languagenein
bootstrap_files
has_devcontainernein
has_linter_configja
typecheck_configs
agent_commit_share0,28
toolchain_manifests
dependency_bot_commit_share0
Wie die Bewertung erfolgt
0/45Typprüfbarer Code — HTML ohne Typprüfungs-Konfiguration
51.2/55Handhabbare Dateigrößen — 2/29 Quelldateien über 60 KB
Verwendete Eingangsdaten
primary_languageHTML
largest_source_bytes62.446
source_files_sampled29
oversized_source_files2
Wie die Bewertung erfolgt
0/40API-Schema (OpenAPI/GraphQL/proto)
0/20MCP-Server
40/40Lauffähige Beispiele — example, examples
Verwendete Eingangsdaten
example_dirsexample, examples
has_mcp_signalnein
api_schema_files

Eckdaten

313GitHub-Sterne
42Mitwirkende
71Commits, letzte 12 Monate
0Tage seit letztem Push
22Releases
1Bus-Faktor
1offene Issues
npm, RubyGemsPaket-Ökosysteme

Warnungen zur Datenerhebung

  • Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token

Weitere Details

Stern- und Fork-Verlauf 0 ★ / 185 ⇿
0Sterne
185Forks
20Releases

Wann jeder Stern und Fork hinzugefügt wurde, von GitHub erfasst und nach Tagen gruppiert. Das kumulierte Wachstum steht direkt über den täglichen Zugängen, aus denen es besteht, sodass beide gegeneinander lesbar sind: stetiger organischer Zuwachs sieht ganz anders aus als ein abrupter, kurzlebiger Ausschlag. Wo dieser Unterschied messbar ist, wird er als Wachstumsauthentizität ausgewiesen.

0408012016020018432014-102019-112024-11
Major 4Minor 4Patch 10

Jeder Punkt umfasst 10 Tage.

OpenSSF Scorecard 4.8 / 10
4.8Gesamtwert

Unabhängige, werkzeugneutrale Sicherheitsbewertung durch das quelloffene OpenSSF Scorecard. Jede Prüfung honoriert eine Sicherheits-Praxis, nicht das Werkzeug eines bestimmten Anbieters. Prüfungen, die Scorecard nicht ermitteln konnte, sind mit k. A. markiert und vom Sicherheitswert ausgeschlossen (nie als null gezählt).Scorecard v5.5.0 · 2026-07-30 09:17 UTC

10Binary-Artifactsno binaries found in the repo
0Branch-Protectionbranch protection not enabled on development/release branches
10CI-Tests22 out of 22 merged PRs checked by a CI test -- score normalized to 10
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
0Code-ReviewFound 0/30 approved changesets -- score normalized to 0
10Contributorsproject has 30 contributing companies or organizations
10Dangerous-Workflowno dangerous workflow patterns detected
10Dependency-Update-Toolupdate tool detected
0Fuzzingproject is not fuzzed
9Licenselicense file detected
10Maintained30 commit(s) and 19 issue activity found in the last 90 days -- score normalized to 10
k. A.Packagingpackaging workflow not detected
3Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 3
0SASTSAST tool is not run on all commits -- score normalized to 0
0Security-Policysecurity policy file not detected
0Signed-ReleasesProject has not signed or included provenance with any releases.
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
9Vulnerabilities1 existing vulnerabilities detected
Direkte Abhängigkeiten 4
RegistryPaketVersionsvorgabeManifest
RubyGemscolorizeGemfile
RubyGemsrougeGemfile
RubyGemsslim~> 3.0.6Gemfile
npmreveal.js6.0.1package.json
Alle Abhängigkeiten 50

Vollständig aufgelöster Abhängigkeitssatz aus dem GitHub-Abhängigkeitsgraphen: 4 direkte und 46 indirekte (transitive) Pakete. Die transitive Hülle ist vollständig, wenn das Repository eine Lockfile eincheckt.

RegistryPaketVersionBeziehung
npmreveal.js6.0.1direkt
RubyGemscolorizedirekt
RubyGemsrougedirekt
RubyGemsslimdirekt
npm@asciidoctor/core4.0.6indirekt
npm@esbuild/aix-ppc640.28.0indirekt
npm@esbuild/android-arm0.28.0indirekt
npm@esbuild/android-arm640.28.0indirekt
npm@esbuild/android-x640.28.0indirekt
npm@esbuild/darwin-arm640.28.0indirekt
npm@esbuild/darwin-x640.28.0indirekt
npm@esbuild/freebsd-arm640.28.0indirekt
npm@esbuild/freebsd-x640.28.0indirekt
npm@esbuild/linux-arm0.28.0indirekt
npm@esbuild/linux-arm640.28.0indirekt
npm@esbuild/linux-ia320.28.0indirekt
npm@esbuild/linux-loong640.28.0indirekt
npm@esbuild/linux-mips64el0.28.0indirekt
npm@esbuild/linux-ppc640.28.0indirekt
npm@esbuild/linux-riscv640.28.0indirekt
npm@esbuild/linux-s390x0.28.0indirekt
npm@esbuild/linux-x640.28.0indirekt
npm@esbuild/netbsd-arm640.28.0indirekt
npm@esbuild/netbsd-x640.28.0indirekt
npm@esbuild/openbsd-arm640.28.0indirekt
npm@esbuild/openbsd-x640.28.0indirekt
npm@esbuild/openharmony-arm640.28.0indirekt
npm@esbuild/sunos-x640.28.0indirekt
npm@esbuild/win32-arm640.28.0indirekt
npm@esbuild/win32-ia320.28.0indirekt
npm@esbuild/win32-x640.28.0indirekt
npm@fortawesome/fontawesome-free6.7.2indirekt
npmasciidoc-converter-testkit-cli0.1.4indirekt
npmasciidoc-converter-testkit-core0.1.4indirekt
npmasciidoctor4.0.6indirekt
npmcommander9.5.0indirekt
npmentities8.0.0indirekt
npmesbuild0.28.0indirekt
npmparse58.0.1indirekt
npmpostject1.0.0-alpha.6indirekt
RubyGemsasciidoctorindirekt
RubyGemsirbindirekt
RubyGemsminitestindirekt
RubyGemspryindirekt
RubyGemspry-byebugindirekt
RubyGemspygments.rbindirekt
RubyGemsrakeindirekt
RubyGemsrubocopindirekt
RubyGemsrubocop-minitestindirekt
RubyGemsrubocop-rakeindirekt
Abhängigkeits-Advisories 0

Die Installation von npm:@asciidoctor/reveal.js@5.2.0 zieht 18 Pakete nach sich, direkt und transitiv: 0 tragen bekannte Advisories, davon 0 direkte Abhängigkeiten.

Keine bekannten Advisories betreffen die bewerteten Abhängigkeiten.

Ein Advisory bedeutet, dass die im Abhängigkeitsgraphen erfasste Version in den betroffenen Bereich eines Advisories fällt. Erreichbarkeit wird nicht analysiert, und der Graph enthält Entwicklungs- und Test-Pins — ein Fund kann das Werkzeug betreffen und nicht die ausgelieferte Software.

JSON-Rohbericht maschinenlesbar
{
  "data": {
    "repo": {
      "topics": [
        "asciidoc",
        "reveal-js",
        "asciidoctor",
        "slides",
        "slideshow",
        "presentations",
        "hacktoberfest"
      ],
      "is_fork": false,
      "size_kb": 9081,
      "has_wiki": false,
      "homepage": "http://asciidoctor.org",
      "languages": {
        "CSS": 46791,
        "HTML": 303524,
        "Ruby": 127132,
        "Slim": 130,
        "JavaScript": 132032
      },
      "pushed_at": "2026-07-30T09:11:27Z",
      "created_at": "2014-10-12T20:15:53Z",
      "owner_type": "Organization",
      "updated_at": "2026-07-30T09:13:14Z",
      "description": ":crystal_ball: A reveal.js converter for Asciidoctor and Asciidoctor.js. Write your slides in AsciiDoc!",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": null,
      "default_branch": "main",
      "license_spdx_raw": "NOASSERTION",
      "primary_language": "HTML",
      "significant_languages": [
        "HTML",
        "JavaScript",
        "Ruby"
      ]
    },
    "owner": {
      "blog": "https://asciidoctor.org",
      "name": "Asciidoctor",
      "type": "Organization",
      "login": "asciidoctor",
      "company": null,
      "location": null,
      "followers": 466,
      "avatar_url": "https://avatars.githubusercontent.com/u/3137042?v=4",
      "created_at": "2012-12-27T21:15:25Z",
      "is_verified": null,
      "public_repos": 83,
      "account_age_days": 4962
    },
    "license": {
      "state": "custom",
      "spdx_id": null,
      "raw_spdx": "NOASSERTION",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v6.0.0-beta.2",
          "kind": "prerelease",
          "published_at": "2026-07-30T09:13:58Z"
        },
        {
          "tag": "v5.2.0",
          "kind": "minor",
          "published_at": "2024-12-04T07:03:02Z"
        },
        {
          "tag": "v5.1.0",
          "kind": "minor",
          "published_at": "2023-12-12T13:18:15Z"
        },
        {
          "tag": "v5.0.1",
          "kind": "patch",
          "published_at": "2023-06-24T16:03:17Z"
        },
        {
          "tag": "v5.0.0-rc.1",
          "kind": "prerelease",
          "published_at": "2021-08-29T12:33:19Z"
        },
        {
          "tag": "v4.1.0",
          "kind": "minor",
          "published_at": "2020-12-19T13:31:28Z"
        },
        {
          "tag": "v4.1.0-rc.5",
          "kind": "prerelease",
          "published_at": "2020-12-19T13:03:14Z"
        },
        {
          "tag": "v4.0.1",
          "kind": "patch",
          "published_at": "2020-02-19T05:05:16Z"
        },
        {
          "tag": "v4.0.0",
          "kind": "major",
          "published_at": "2020-02-19T04:48:25Z"
        },
        {
          "tag": "v3.1.0",
          "kind": "minor",
          "published_at": "2020-01-19T04:59:29Z"
        },
        {
          "tag": "v3.0.0",
          "kind": "major",
          "published_at": "2020-01-07T06:42:36Z"
        },
        {
          "tag": "v2.0.1",
          "kind": "patch",
          "published_at": "2019-12-04T06:25:25Z"
        },
        {
          "tag": "v2.0.0",
          "kind": "major",
          "published_at": "2019-03-01T06:05:04Z"
        },
        {
          "tag": "v1.1.3",
          "kind": "patch",
          "published_at": "2018-01-31T14:28:58Z"
        },
        {
          "tag": "v1.1.2",
          "kind": "patch",
          "published_at": "2018-01-31T02:01:15Z"
        },
        {
          "tag": "v1.1.1",
          "kind": "patch",
          "published_at": "2018-01-04T01:01:32Z"
        },
        {
          "tag": "v1.1.0",
          "kind": "minor",
          "published_at": "2017-12-25T06:26:45Z"
        },
        {
          "tag": "v1.0.4",
          "kind": "patch",
          "published_at": "2017-09-28T00:27:01Z"
        },
        {
          "tag": "v1.0.3",
          "kind": "patch",
          "published_at": "2017-08-29T02:55:26Z"
        },
        {
          "tag": "v1.0.2",
          "kind": "patch",
          "published_at": "2016-12-23T03:45:57Z"
        },
        {
          "tag": "v1.0.1",
          "kind": "patch",
          "published_at": "2016-10-13T01:41:45Z"
        },
        {
          "tag": "v1.0.0",
          "kind": "major",
          "published_at": "2016-10-07T02:17:55Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "8de8b6e166bdbab38c977fa2c221a7a308ceb6ca",
          "body": null,
          "is_bot": true,
          "headline": "Release 6.0.0-beta.2",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-30T09:11:26Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8674381aa8aedb8f6684773f53a32ec3d056c754",
          "body": null,
          "is_bot": true,
          "headline": "Prepare 6.0.0-beta.2 release",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-30T09:11:26Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "19f55f1bc842dad111a3681ec720832f663bc08a",
          "body": "…ed default\n\nnpm refuses to publish a prerelease version without an explicit --tag,\nwhich broke the 6.0.0-beta.1 release. The Release workflow now checks\nout and pushes back to whichever branch it was dispatched from\n(instead of hardcoding main), and computes the npm dist-tag from that\nbranch: \"test\n[…]\n (e.g.\nlatest-5-2) from a maintenance branch like 5.2.x, failing loudly for\nanything else so it never falls back to npm's default \"latest\" tag.\n\nCo-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: derive npm dist-tag from the release branch instead of a hardcod…",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2026-07-30T09:08:09Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "00eb27c6fd6fd028c71db6f64a24eedfb7541d1b",
          "body": "Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "ci: show release version and actor in workflow run name",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2026-07-30T08:42:01Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "356cf71ca8ce889eba6235fc5af2236f51411bc3",
          "body": null,
          "is_bot": true,
          "headline": "Release 6.0.0-beta.1",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-30T08:36:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "16bd21562718733b42d1e4ef624f455acfa5dfaf",
          "body": null,
          "is_bot": true,
          "headline": "Prepare 6.0.0-beta.1 release",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-30T08:36:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "318634b63d16801c76285228732576f5794920c5",
          "body": "…kit/\n\nMove test/fixtures/standalone/, test/expected-testkit/ and\ntest/expected/standalone/ under a single test/converter-testkit/\n(fixtures/standalone/, expected/generic/, expected/standalone/) so\neverything belonging to the asciidoc-converter-testkit corpus is\nidentifiable at a glance instead of living directly under test/\nalongside the unrelated Ruby unit tests.\n\nCo-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: regroup the converter-testkit corpus under test/converter-test…",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2026-07-30T07:41:21Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "85f96835d3235d8b9099ae19d7ba9da1588627b7",
          "body": "…stkit\n\nThe fixture-testing tool was renamed upstream from asciidoc-testkit to\nasciidoc-converter-testkit (asciidoc-testkit-cli -> asciidoc-converter-testkit-cli\n0.1.4 on npm); update the devDependency, the CLI binary path and error\nmessage in tasks/testkit.rake, and all comments/docs that referenced the\nold name. Invocation contract is unchanged.\n\nCo-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: rename asciidoc-testkit devDependency to asciidoc-converter-te…",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2026-07-30T07:26:23Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "1b98d1a0d1f9d54074180937b4cc92ededd043be",
          "body": "Replace the placeholder CSS dump in the Aurora \"Customize\" slide with a\nminimal, real example: overriding the two tokens that drive the theme's\nsignature gradient motif (--aurora-violet/--aurora-cyan), with a callout\nexplaining everywhere that motif shows up, and a pointer to the full token\nreference. Same mechanism aurora-light.css already uses to flip the whole\ntheme from dark to light.\n\nCo-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: show token-based customization in the 6.0 release notes",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2026-07-29T09:30:21Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "e343cb04f0e68716ebe62b6a967f0e26aeae29ba",
          "body": "data/themes/aurora.css and aurora-light.css already ship inside the\nasciidoctor-revealjs RubyGem, not just the @asciidoctor/reveal.js npm\npackage — the gemspec's file filter already matches anything under data/\n(confirmed by building the gem and inspecting its data.tar.gz), so no\npackaging change wa\n[…]\n Aurora README\nshowing how to resolve the installed gem's path (no node_modules-style\ninstall directory to reference by a fixed relative path).\n\nCo-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: document Aurora as bundled in the Ruby gem too",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2026-07-29T09:16:26Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "b11a9741982c62861b7f4a55a6373ac1c8a7ddad",
          "body": "…se notes\n\nMove aurora.css/aurora-light.css from examples/aurora-theme/ into\ndata/themes/, so the theme is published as part of the @asciidoctor/reveal.js\nnpm package (data/ is already in package.json's files list) instead of only\nexisting in a directory that npm never ships. Update the four example\n[…]\nointing at examples/... after\na previous refactor moved those files to release-notes/, and one release-5.2\nlink that pointed at 5.1 by mistake.\n\nCo-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: ship Aurora as a bundled theme and showcase it in the 6.0 relea…",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2026-07-29T08:58:35Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "c84cf242ddb7ba63688c1669e02bd158cd0eb1a2",
          "body": "…d 4 example decks\n\nA dark, gradient-accented reveal.js theme built entirely from CSS custom\nproperties, so it can be restyled by overriding tokens instead of editing\ncomponent rules. Ships as examples/aurora-theme/aurora.css, plus\naurora-light.css (a light mood variant that changes only the tokens)\n[…]\ns, collapsible\nblocks), and a business review (stats, KPI bars, timeline).\n\nSee examples/aurora-theme/README.adoc for the full token reference.\n\nCo-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: add Aurora, a token-based custom theme, with a light variant an…",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2026-07-28T13:46:13Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "88a675662648cc508e04af40cfe9a41d541682bd",
          "body": "Antora resolves a bare relative xref target from the pages family root\nof the target module, not from the referencing page's own directory —\nso a page in pages/syntax/ linking to another page in the same\ndirectory needs the syntax/ prefix (or ./), not a bare filename.\n\n- diagrams.adoc and layout.ado\n[…]\ns attributes:role.adoc (singular).\n\nVerified against the actual asciidoc-lang page tree (GitLab API) and\nagainst the local antora build errors.\n\nCo-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: fix broken xrefs found in the pre-6.0 review",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2026-07-28T09:28:22Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "aee8c7efee5587a788eb55747a6f38650e297ed6",
          "body": "- Fix footnotes losing their content entirely (only the numbered marker\n  survived) when placed inside a level 3+ subsection, which renders\n  inline instead of as its own <section>. Footnotes were bucketed by\n  the nearest enclosing Section node regardless of level, so one\n  bucketed against a level\n[…]\nself-link.adoc) so Ruby stays the\nverified reference and `rake testkit:test:js` catches regressions.\n\nVerified with `rake test` and `npm test`.\n\nCo-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: 3 JS converter parity gaps found in the pre-6.0 review",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2026-07-28T09:23:08Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "62d6db2e84be42fb3f82a3fb5385d0ca411c3033",
          "body": "…stead of continue-on-error\n\nsource-prettify/source-rouge can never match the JS converter (third-party\nRuby-only syntax highlighters, only highlightjs is ported), but\ncontinue-on-error: true was swallowing every JS/Ruby parity failure, not\njust those two. Excludes them individually via asciidoc-testkit's own\n--ignore <family/name>:<reason> flag, so the CI job now fails on any other\n(real) regression.",
          "is_bot": false,
          "headline": "ci: ignore the known Ruby-only-highlighter gaps in testkit:test:js in…",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2026-07-28T08:20:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "def5af65f7f9b566b16d10762ef212c4a091c474",
          "body": "…versions\n\nBumps asciidoc-testkit-cli to 0.1.3 (latest).",
          "is_bot": false,
          "headline": "chore(deps): pin esbuild, postject and asciidoc-testkit-cli to exact …",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2026-07-27T19:53:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f0a25c1f773f6c436c3d6cfc7e60ffc1cd8525d5",
          "body": "display: block on <summary> stacked the marker above the text instead\nof beside it, overriding the default list-item layout without\nreplacing its inline-marker behavior; switch to display: flex with\npadding-left instead. Also adds the docinfo-locations/with-docinfo-shared\nHTML fixtures generated by the test suite.",
          "is_bot": false,
          "headline": "fix: align the summary disclosure triangle in collapsible blocks",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2026-07-27T19:52:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c12f667fd1cbcfdbb55370e0760094c522594f0c",
          "body": "Asciidoctor.js 4.0 is now stable; update the peer/dev dependency and\ndocs to the plain >=4.0.0 <5.0.0 range instead of the 4.0.0-alpha.6\nfloor. All existing tests pass against 4.0.6.",
          "is_bot": false,
          "headline": "chore(deps): bump asciidoctor to stable 4.0.6, drop alpha range mentions",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2026-07-27T19:39:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a196411474da473dce99931be9b772790335540d",
          "body": "Both features already shipped and are documented in the changelog, but\nthe release-6.0.adoc presentation didn't demonstrate them yet.",
          "is_bot": false,
          "headline": "docs: add collapsible blocks and rowstep table demo to the 6.0 showcase",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2026-07-27T19:26:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "aeb2f90f1690bf8cc217535c6cd81b7e8c6519b1",
          "body": "…466)\n\nheader/footer meant \"first/last child of .slides\" in this converter, but\n\"first/last child of <body>\" in every other Asciidoctor converter (html5,\ndocbook5, ...). Redefine header/footer to the html5 meaning (with a\nbody-header/body-footer alias), and give the old position its own name,\nslides\n[…]\nior. An unsuffixed docinfo-footer.html is no\nlonger read by the revealjs backend at all. See\ndocs/modules/converter/pages/migrating-to-v6.adoc.\n\nCo-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat!: redefine docinfo header/footer to match the html5 converter (#…",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2026-07-27T18:43:50Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "64a6dd056e5a1b8ac6c8bdf618bdd89953a604cf",
          "body": null,
          "is_bot": false,
          "headline": "chore(deps): update dependency ruby to v3.4.10",
          "author_name": "Renovate Bot",
          "author_login": "renovate-bot",
          "committed_at": "2026-07-27T17:38:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1b86b8f0052ed2cffe46a5140dbb3be615bb2ea8",
          "body": "…ki URL\n\nThe docinfo cross-reference had no link text, which renders as an empty/\nbroken-looking link in the built site. Also replace the url-revealjs-gh\nattribute reference with the plain URL, matching the hardcoded\nhttps://revealjs.com/plugins/ link right above it on the same line.\n\nCo-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: add link text to the docinfo xref and hardcode the reveal.js wi…",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2026-07-27T17:38:25Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "533d0f29e48c66e2ef064ffb92d123bea06d045e",
          "body": null,
          "is_bot": false,
          "headline": "chore(deps): update dependency rake to '~> 13.4.0'",
          "author_name": "Renovate Bot",
          "author_login": "renovate-bot",
          "committed_at": "2026-07-27T17:38:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "820831f602eecce7233aeb82e5ddf945e8b4f41c",
          "body": "Documents the new collapsible-blocks feature (#484) and the previously\nundocumented revealjs_minscale/maxscale options and revealjs_plugin_search\ntoggle. Fixes hacking.adoc's dead test/doctest instructions (replaced by\nasciidoc-testkit), clarifies the compatibility matrix for the in-development\n6.x line, lists missing roles (text-*, small), adds contributing.adoc to the\nproject nav, and documents the 4th (shared) docinfo insertion point.\n\nCo-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: fix outdated content and gaps found in an Antora docs audit",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2026-07-27T17:35:23Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "3d09731aae6cc36ab0d779c1bd869f430a784698",
          "body": null,
          "is_bot": false,
          "headline": "chore(deps): update actions/checkout action to v7",
          "author_name": "Renovate Bot",
          "author_login": "renovate-bot",
          "committed_at": "2026-07-27T17:35:12Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "17d707b61a08dcb6d5598450ea55f9de1d38d9ba",
          "body": "Asciidoctor's own html5 converter renders [%collapsible] example\nblocks as <details>/<summary>, but this converter always fell back to\nits regular .exampleblock <div> since collapsible/open handling was\nnever implemented here. Also ships the asciidoctor-default.css\n<details>/<summary> styling, since reveal.js has none of its own (#484).",
          "is_bot": false,
          "headline": "feat: support collapsible blocks (%collapsible option on example blocks)",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2026-07-26T10:44:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2ede4e741c7bde86c86a07e522b4dba6f63b7c53",
          "body": "The step option applies fragment to the whole <table>, revealing every\nrow at once. rowstep applies fragment to each body row individually\ninstead, leaving the header row always visible (#493).",
          "is_bot": false,
          "headline": "feat: add a rowstep option to reveal tables one body row at a time",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2026-07-26T09:52:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ab6ebcbcd1d27876ebf16eef06b583d66accec14",
          "body": "Content left outside a [.column] block on a [.columns] slide becomes a\nflex item of the row alongside the columns instead of spanning above\nthem, since the columns layout applies to the slide's content as a\nwhole. This was a recurring source of confusion (#494).",
          "is_bot": false,
          "headline": "docs: clarify that non-column content on a columns slide must be wrapped",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2026-07-26T09:16:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "86f718c8d005c2edd0257d09ff7f6e466b886b69",
          "body": "reveal.js's layout utility classes (r-stack, r-hstack, r-vstack) style\ntheir *direct* children - e.g. .r-stack > * for stacking elements on\ntop of each other. convert_open unconditionally wrapped an open\nblock's content in a <div class=\"content\">, putting the block's own\nchildren one level too deep \n[…]\napping.\n\nSkip the .content wrapper for open blocks carrying one of these three\nroles, in both Ruby and JS converters. Also documents r-stack on the\nLayout page (was entirely undocumented).\n\nFixes #520",
          "is_bot": false,
          "headline": "fix: don't wrap r-stack/r-hstack/r-vstack open blocks in a content div",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2026-07-26T09:13:48Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "e27b55dc3fe5e1141068f6163b835f6abb4e0bfd",
          "body": "The `wrap` class (`[.columns.wrap]`) was usable but never documented\non the Layout page - discoverable only by finding it in an unrelated\nexample. Explain what it actually changes (every column in the row\nsizes itself to its own content and can wrap onto a new row, instead\nof the default equal-width\n[…]\n for it likely wants: equal-width columns already\nshrink their content to fit without wrapping, with no modifier\nneeded. wrap is meant for content that shouldn't be shrunk, such as\nimages.\n\nFixes #456",
          "is_bot": false,
          "headline": "docs: document the wrap columns modifier",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2026-07-26T08:17:53Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "6110d8b0add0f29b2ea03aad9a3c8118e72851df",
          "body": "Reveal.js's own core CSS sets .reveal .slides { text-align: center },\nwhich centered the .attribution div (instead of right/left-aligning\nit per asciidoctor-default.css) and left it visually identical to\nthe quoted text, since this converter shipped no quoteblock/verseblock\nCSS of its own.\n\nPort the\n[…]\ns's .attribution\nrules (right-aligned for quoteblock, left-aligned for verseblock,\nsmaller italic font for both), prefixed with .reveal for specificity\nover reveal.js's own centering rule.\n\nFixes #506",
          "is_bot": false,
          "headline": "fix: align/style block quote and verse attribution",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2026-07-26T08:03:26Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "268d056d192a95fad0ac8f0024ec8a7b9876eef2",
          "body": "New syntax/diagrams.adoc page covering asciidoctor-kroki for both\nRuby and JavaScript - no reveal.js-specific setup needed since it\njust produces a regular image, which this converter already knows\nhow to render.\n\nFixes #366",
          "is_bot": false,
          "headline": "docs: document diagram generation via the Kroki extension",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2026-07-25T21:14:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "eca42d952f39e0cb5e53315ffed12c701cfee764",
          "body": "…efault\n\n- State explicitly that :customcss: (and its asciidoctor-revealjs.css\n  fallback) names a file the converter only links to - it never\n  generates one, the reader has to author it themselves. That wasn't\n  said anywhere, so anyone who forgot to create the file just saw no\n  effect with no ex\n[…]\nit still said the built-in lib/css/zenburn.css,\n  a leftover from the pre-pure-Ruby Slim templates; the actual\n  default is reveal.js's own bundled dist/plugin/highlight/monokai.css.\n\nFixes #513, #133",
          "is_bot": false,
          "headline": "docs: clarify custom-styles.adoc and fix a stale highlight.js theme d…",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2026-07-25T20:12:50Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "8dafc3fa4eb214303f1cc861b1aa0f787113ea79",
          "body": "convert_outline (the toc::[]/:toc: table of contents generator) had\nno notion of the \"!\"-means-titleless convention convert_section\nalready uses to decide whether to render a slide's <h2> - so a\ntitleless slide showed up in the ToC as a literal, meaningless \"!\"\nentry instead of being skipped.\n\nSkip sections whose title is literally '!' when building the ToC,\nthe same way convert_section already treats them as titleless.\n\nFixes #236",
          "is_bot": false,
          "headline": "fix: omit titleless slides (== !) from the table of contents",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2026-07-25T19:47:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "dff49212f078c0cc77e6b738e6265634eee5ec18",
          "body": "Registering our HighlightJsAdapter for 'highlightjs'/'highlight.js'\nreplaces Asciidoctor's built-in highlight.js syntax highlighter in\nthe process-wide SyntaxHighlighter registry - which has no notion of\n\"per backend\". So simply requiring this converter (e.g. to register\nmultiple backends in one pro\n[…]\nonverter already uses for non-\nrevealjs-specific node types.\n\nVerified the html5-backend output is now byte-for-byte identical\nwhether or not this converter is loaded, in both Ruby and JS.\n\nFixes #489",
          "is_bot": false,
          "headline": "fix: scope the highlightjs syntax highlighter override to revealjs",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2026-07-25T17:29:21Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "1c2a140732f40284c51fcdac63cc73c78f25073b",
          "body": "test/fixtures/standalone/*.adoc carried a // .<case-name> / // :include:\n/ // :header_footer: comment block at the top of each file - directives\nread by the old asciidoctor-doctest gem (case name, xpath selector for\nthe fragment to compare, whether to run standalone conversion).\n\nThat gem was replac\n[…]\nmment, .admonitions-font, didn't even match its own filename\nanymore), so drop them; the few lines that were genuine descriptive\ncomments (what the fixture demonstrates, issue/PR references) are kept.",
          "is_bot": false,
          "headline": "chore: remove vestigial asciidoctor-doctest comments from fixtures",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2026-07-25T17:11:04Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "4d974f6a239ada40c511c4ebe77534210f61c8cf",
          "body": null,
          "is_bot": false,
          "headline": "docs: add changelog entry for the windows CI speedup",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2026-07-25T17:10:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "126a99a2434322b8a3b31737b581aa3bd8c6df3d",
          "body": "The windows-latest/3.4 leg was running the full test task (unit tests\nplus the ~300-spawn asciidoc-testkit corpus) as well as examples and\nrelease-notes conversion, making it by far the slowest job in the\nmatrix. Those checks are already covered exhaustively by the\nUbuntu/CRuby leg, so windows now runs unit tests only.",
          "is_bot": false,
          "headline": "ci: skip testkit and example/release-notes conversion on windows",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2026-07-25T17:10:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cf08a21b6cf19552a25a5f28035782b606fef7c9",
          "body": "Every other title-slide-background-* attribute (color, image, video,\nsize, repeat, position, opacity, iframe, transition) is already\ncarried over to the title slide's data-background-* attributes;\ngradient was the one missing from that list, even though the\nequivalent background-gradient attribute already works on regular\nsections.\n\nFixes #514",
          "is_bot": false,
          "headline": "fix: support :title-slide-background-gradient:",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2026-07-25T16:46:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "96bf0292dfcad86a8faa8b602870c0e579c7a926",
          "body": "The converter already emitted <ul class=\"unstyled\"> (and the other\nAsciidoctor list-style keywords) correctly for these - matching\nAsciidoctor's own html5 converter, which applies the block style\n(not the role) to the <ul>/<ol> element. But nothing in the bundled\ncompatibility.css gave that class an\n[…]\nh bullets.\n\nAdd the same rules asciidoctor-default.css uses for these classes\n(list-style-type: none, appropriate margin), tracked in this project\nsince 2016 and never actually implemented.\n\nFixes #77",
          "is_bot": false,
          "headline": "feat: style unstyled lists ([unstyled]/[none]/[no-bullet]/[unnumbered])",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2026-07-25T16:37:53Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "50bd7928cf705f8ca06b735595ef8c6edfc92fde",
          "body": "convert_embedded rendered the document title as a bare <h1>, outside\nany <section>, whenever showtitle made it eligible for embedded\n(--no-header-footer) conversion. That breaks the reveal.js slide\nmodel - the stray <h1> isn't part of any slide, and shows up wherever\nthe embedded fragment happens to\n[…]\ndoes for standalone\nconversion: as a real title_slide, wrapped in <section class=\"title\"\ndata-state=\"title\">. There's no reason for embedded conversion to\nrender the title any differently.\n\nFixes #270",
          "is_bot": false,
          "headline": "fix: wrap the embedded conversion title in a proper title-slide section",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2026-07-25T16:10:45Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d1506c288ee32e3112f0434f43f71dc09f6664cc",
          "body": "video::[options=\"autoplay,muted\"] autoplayed but never actually muted\nthe <video> element for a local (non-vimeo/youtube) video block: the\nmuted option was the only playback option (autoplay, controls, loop)\nnot carried over to the generated <video> tag's attributes.\n\nAsciidoctor's own html5 converter already sets muted for the same\ncase (asciidoctor/asciidoctor#3408); do the same here.\n\nFixes #523",
          "is_bot": false,
          "headline": "fix: set the muted attribute on local video blocks",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2026-07-25T15:24:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2f74279632720429d7a6ac07db574e25c137d268",
          "body": "The highlightjs syntax-highlighter docinfo footer script called\nhljs.configure({ ignoreUnescapedHTML: true }) *after* injecting\ndata/highlight-plugin.js, which ends with\nReveal.registerPlugin('highlight', Plugin). Since Reveal.initialize()\nis already running by the time this footer script executes, \n[…]\n (jsdom, real highlight.js from\ncdnjs, real reveal.js from CDN) reproducing the exact corrupted DOM\nreported in the issue, and confirming the fix restores clean output\nfor both converters.\n\nFixes #525",
          "is_bot": false,
          "headline": "fix: configure hljs before registering the reveal.js highlight plugin",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2026-07-24T22:05:10Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f0b529b3225ca2b4be6d8b2596bcefbf74443535",
          "body": "convert_ulist's checklist branch for `:icons: font` rendered\n<i class=\"icon-check\"></i>/<i class=\"icon-check-empty\"></i>, Font\nAwesome 3 class names that don't exist in Font Awesome 4/5/6 (the only\nversions this converter's docinfo actually loads), so the checkbox\nicon was invisible - only the inter\n[…]\n elsewhere for icons (icon_mapping in convert_admonition),\nmatching the Font Awesome 4-compatible class names shimmed by the\nv4-shims.min.css this converter loads alongside Font Awesome 5.\n\nFixes #526",
          "is_bot": false,
          "headline": "fix: show checklist checkboxes when :icons: font is set",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2026-07-24T20:31:17Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "1b653d892c4fe58d38ddd2325ce55b6cc02fecbf",
          "body": "convert_document (Ruby and JS) always rendered the title slide\nwhenever the document had a header, regardless of the :notitle:\ndocument attribute. Every other title-related check in the converters\n([%notitle] on a section, the embedded converter's own <h1>) already\nrespected notitle/isNotitle; only \n[…]\ntle slide dispatch didn't.\n\nGuard the title_slide conversion with the same check so setting\n:notitle: on the document hides the title slide entirely, as it does\nfor the embedded converter.\n\nFixes #535",
          "is_bot": false,
          "headline": "fix: honor the :notitle: document attribute (hide the title slide)",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2026-07-24T20:19:03Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "bc98607128aa2c01608668049ea27870400d4891",
          "body": "…tle slide\n\nconvert_section/convert_title_slide (Ruby and JS) only rendered a fixed\nallowlist of data-* attributes (data-background-*, data-transition,\ndata-state, data-auto-animate-*, ...), silently dropping any other\ndata-* attribute set on a section or in the document header. That\nprevented using\n[…]\nme way, while keeping the already-computed known values\n(e.g. data-background-color derived from the background-color shorthand)\nfrom being clobbered by a same-named passthrough attribute.\n\nFixes #541",
          "is_bot": false,
          "headline": "fix: stop dropping arbitrary data-* attributes on sections and the ti…",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2026-07-24T20:06:19Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "6bc7c656e1dd8254c5c1c200429d7375fb1852a3",
          "body": "- inlineImageContent: the icon: macro's image-icon branch used a plain\n  truthiness check on the icons attribute's *value* (else if (icons)),\n  which is false for an empty string. Ruby's equivalent is written the\n  same way but works there because '' is truthy in Ruby — exactly the\n  kind of diverge\n[…]\n:test:js` into CI\n(Linux only, continue-on-error: true — 2 permanent, documented gaps\nremain: source-prettify/source-rouge, third-party Ruby-only syntax\nhighlighters never ported to the JS converter).",
          "is_bot": false,
          "headline": "fix: three JS converter parity gaps (icon macro, bibref, footnote reuse)",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2026-07-24T12:50:38Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "3e2037d6506a2617babee35c31fbe36aba91b958",
          "body": "…e's default\n\nrevealjsdir's default intentionally differs between the two converters\n(reveal.js/ outside Node, node_modules/reveal.js/ in a Node.js\nenvironment — see revealjs-options.adoc), but neither RUBY_CONVERTER\nnor JS_CONVERTER in tasks/testkit.rake overrode it, so every\n`standalone` family ca\n[…]\nDN URL).\n\nOnly 2 genuine gaps remain in that family (source-prettify,\nsource-rouge — third-party Ruby-only syntax highlighters, same\ncategory as the already-known source-coderay/source-pygments gaps).",
          "is_bot": false,
          "headline": "fix: pin revealjsdir in the JS testkit converter to match the Ruby on…",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2026-07-24T10:43:10Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "bd14d09f364d7d9d75b677370e647ddab770bb51",
          "body": "…-revealjs) naming, merge revealjs/revealjs-examples\n\ntest/fixtures-extra/ becomes test/fixtures/ (the \"-extra\" qualifier only\never meant \"beyond asciidoc-testkit's own bundled corpus\"). The bundled\ncorpus's own expected output moves from test/expected/ to\ntest/expected-testkit/, freeing test/expect\n[…]\ngments skips (third-party Ruby-only\nsyntax highlighters, not ported to the JS converter).\n\nAntora attachment symlinks under docs/modules/converter/attachments/ are\nrecreated to point at the new paths.",
          "is_bot": false,
          "headline": "refactor: rename test/fixtures-extra to test/fixtures, swap expected(…",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2026-07-24T10:25:22Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "07f6302d956fff9946cd4fa9a5c8aaf793a085a9",
          "body": "Every doc page that cites a specific example file now points at a\nsymlink under docs/modules/converter/attachments/ (Antora's\nattachment$ resource family) through xref:attachment$..., instead of a\nhand-typed examples/ path or GitHub blob URL that can silently rot.\n\nThis also fixes two dead links: re\n[…]\nect-examples},\nupdated in antora.yml to the new test/fixtures-extra/revealjs-examples/\nlocation. hacking.adoc's description of the examples/test/release-notes\nsplit is updated to match the new layout.",
          "is_bot": false,
          "headline": "docs: link examples via Antora attachment xrefs instead of raw paths",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2026-07-24T10:25:22Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f233b74d593ad09d14cd6d3efd1fecd0ca2bfb85",
          "body": "examples/ mixed three unrelated concerns: the Netlify release-notes\nshowcase, the asciidoc-testkit \"revealjs-examples\" regression corpus\n(previously reached through a symlink), and the JS/Ruby parity corpus.\n\nMove the release-*.adoc/.css demos (and only the images they actually\nuse) to a new top-lev\n[…]\nks/examples.js and js/test/examples.test.js at the new test-corpus\nlocation, and add release-notes/ to the JS/Ruby parity coverage so it\nisn't lost. Update netlify.toml, CI and .gitignore accordingly.",
          "is_bot": false,
          "headline": "refactor: split examples/ into release-notes/ and a real test corpus",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2026-07-24T10:25:22Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c19923a4131975797761df96831e96ce5c79e4fa",
          "body": "test/fixtures, test/fixtures-extra, and test/fixtures-revealjs all\nstarted with \"fixtures\" despite meaning three different things (two\nare expected *output*, one is *input*), which made the tree confusing\nto navigate. Renamed the output side to test/expected and\ntest/expected-revealjs, matching asci\n[…]\n.\n\nAlso removes test/settings.adoc and test/admonition-paragraphs.adoc,\ntwo orphaned pre-doctest scratch files sitting directly in test/ with\nno rake task, test file, or JS glob ever referencing them.",
          "is_bot": false,
          "headline": "refactor: rename test/fixtures(-revealjs) to test/expected(-revealjs)",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2026-07-23T20:51:43Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "4ab39fa10d42a3ef39bc33ac9ef137cabccc3b61",
          "body": "Split `rake test` into `rake test:unit` (just the Minitest suite) and\nthe aggregate `rake test` (unit tests + the asciidoc-testkit corpus).\nThe corpus's ~300 sequential `bundle exec` spawns (asciidoc-testkit has\nno persistent-worker mode yet) multiply JRuby/TruffleRuby's JVM startup\ncost into a 10+ \n[…]\ny. Those legs\nexist to catch Ruby-implementation compat bugs, not to re-validate\nfixture content, which the CRuby legs already do exhaustively, so CI\nnow runs test:unit there instead of the full test.",
          "is_bot": false,
          "headline": "ci: skip the asciidoc-testkit corpus on JRuby/TruffleRuby",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2026-07-23T20:25:00Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "be2094eaf498bc69c0a3088a97c8415452ffd86b",
          "body": "Each fixture case spawns a fresh `bundle exec asciidoctor` process (no\npersistent worker), and on JRuby/TruffleRuby the JVM startup alone can\ntake several seconds — well past the CLI's 10s default.\nrevealjs/source-rouge (which also loads the rouge gem) was timing out\non both in CI.",
          "is_bot": false,
          "headline": "fix: raise asciidoc-testkit's --timeout to 30s for JRuby/TruffleRuby",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2026-07-23T20:25:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5df07611e6bb50ce99f5415f2ee4c16fb3a5dd0f",
          "body": "Fixes `spawn bundle ENOENT` on Windows CI: 0.1.1 shelled out to the\nconverter command without a shell, which fails there for any command\nthat resolves to a .bat/.cmd shim (bundle, npm, etc.).",
          "is_bot": false,
          "headline": "chore: bump asciidoc-testkit-cli to 0.1.2",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2026-07-23T20:25:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "842704afb2037b6f3d31294a009500e952af55c4",
          "body": "Full replacement of the asciidoctor-doctest gem with asciidoc-testkit\n(asciidoc-testkit-cli npm package): `rake testkit:test`/`testkit:update`\nrun two invocations against the Ruby converter (a fixed converter\ncommand per invocation is a hard constraint of the tool, so families\nneeding different flag\n[…]\novers examples/. Not wired\n  into CI yet — it currently surfaces 24 pre-existing parity gaps\n  (footnote numbering, the icon: macro rendering as text instead of\n  <img>, ...) that need triaging first.",
          "is_bot": false,
          "headline": "feat: replace asciidoctor-doctest with asciidoc-testkit",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2026-07-23T20:25:00Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "7598b93c07cb9095bbe2005a5b2e5f9c51dce0f2",
          "body": "Alongside the existing asciidoctor-doctest suite, not replacing it yet:\nadd test/fixtures/<family>/<case>.html for the 37 generic AsciiDoc-\nconstruct families, split from the equivalent test/doctest/<family>.html\n(dropping 4 cases with no matching asciidoc-testkit corpus input: two\nextra admonition \n[…]\nst:test\ntask.\n\n.gitignore also drops .claude/worktrees/ (worktrees are now created\ninside the project's .claude/ dir so they show up in the IDE) from the\nnoise a plain git status would otherwise show.",
          "is_bot": false,
          "headline": "feat: add an experimental asciidoc-testkit-based fixture suite",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2026-07-23T20:25:00Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "bae75fa59aa69a13d5a64680c47430bf47f87ab5",
          "body": "Windows CI failed: both GNU and BSD tar misparse a Windows drive-letter\npath (D:/...) as a remote host spec (host:path), so `tar xzf ... -C\nD:/...` tried to open a network connection to a host named \"D\" instead\nof extracting locally. Extracting via Gem::Package::TarReader +\nZlib::GzipReader avoids the external tar binary (and its\nflag/quirk differences across GNU/BSD/JRuby/TruffleRuby) entirely.",
          "is_bot": false,
          "headline": "fix: extract reveal.js-plugins tarball in pure Ruby, not via `tar`",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2026-07-23T16:51:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2cd5a5b7f22dcf85b32a4d045e2b89ab1cd9a06e",
          "body": "…e assets\n\nexamples/Font-Awesome-6.7.2/ (~7MB) and examples/reveal.js-plugins-4.6.0/\nwere committed directly to the repo, unlike examples/reveal.js/, which is\ngitignored and fetched on demand. Bring them in line: fetch Font Awesome\nas a normal devDependency copied by `rake examples:assets`, and\nreve\n[…]\n a normal dependency, since that package\nlists `npm` itself as a dependency and would otherwise drag in npm's\nentire internal tooling tree for a plugin package that never touches any\nof it at runtime.",
          "is_bot": false,
          "headline": "chore: stop committing vendored Font Awesome/reveal.js-plugins exampl…",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2026-07-23T16:51:49Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "3a007ddb710e992c2f9b74e61fe55cc7c7d4f144",
          "body": "Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: ignore the .claude/ directory",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2026-07-23T16:51:49Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "5226484e5895bc914d976375767d5f0559a31ca6",
          "body": "…_nested_elements\n\nNone of these are ever dispatched: Asciidoctor dispatches convert_X methods by\nnode_name, and no node has a `ruler`, `notes`, or `stretch_nested_elements`\nnode name.\n\n- convert_ruler (Ruby converter.rb, JS converter.js): thematic breaks are\n  parsed as :thematic_break, which conve\n[…]\n JS port carried over the same leftover.\n\nVerified with `rake test` (245/245 doctest examples pass) and `npm test`\n(86/86 JS tests pass, including byte-for-byte comparison against the Ruby\nconverter).",
          "is_bot": false,
          "headline": "chore: remove unreachable convert_ruler/convert_notes/convert_stretch…",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2026-07-23T13:15:29Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c9678d9a557e83b02b9f7f66596bec9b0d39a349",
          "body": "bin/asciidoctor-revealjs required the hyphenated `asciidoctor-revealjs`\ninstead of the actual `asciidoctor_revealjs` file/gem name, so every\ninvocation (including the `bundle exec asciidoctor-revealjs` command\ndocumented in the setup guide) crashed with:\n\n  LoadError: cannot load such file -- asciid\n[…]\n\nVerified by building the gem and installing it into an isolated GEM_HOME:\nthe CLI now runs. The typo dates back to the very first commit and is\nalso present in the currently published v5.2.0 release.",
          "is_bot": false,
          "headline": "fix: repair the broken asciidoctor-revealjs Ruby CLI require path",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2026-07-23T13:15:29Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "08f66edaadc2d157b6f3d6fffc0bfe402bb3934c",
          "body": "…sOptions/highlightjs\n\ntest/templates_test.rb referenced templates/slim and test/output/slim, both\nremoved by the pure-Ruby converter rewrite (#544); it wasn't wired into\n`rake test` (which only globs test/asciidoctor_revealjs/*_test.rb), so it was\ndead code. Drop it along with the now-unused `requi\n[…]\nn) and the highlightjs syntax highlighter adapter (language class,\nline-number/highlight-range conversion, docinfo), which previously had no\ndedicated unit tests outside the doctest golden-file suite.",
          "is_bot": false,
          "headline": "test: remove dead Slim-era test scaffolding, add coverage for RevealJ…",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2026-07-23T13:06:09Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b04cd9c46eb99fce14ff3d033de78aa9c38a47d3",
          "body": "Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor: simplify the release scripts and workflow (#559)",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2026-07-23T10:07:43Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "0b81ad2c97837031b5c166cefa369496b0d28e10",
          "body": null,
          "is_bot": false,
          "headline": "chore: update remaining master references to main (#557)",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2026-07-22T21:00:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "92f07778a04c0338b253d680e78dd494cbf927f3",
          "body": null,
          "is_bot": false,
          "headline": "fix: resync the embedded highlight.js plugin with reveal.js 6.0.1 (#558)",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2026-07-22T21:00:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d1ba15a4fb03ca322fe3d7983577436024c0c0a8",
          "body": "Render one card per release (most recent first), tag the latest release,\nand list curated highlights per version. Add a \"What's new\" section to the\nREADME pointing to the demos site and switch the 6.0 demo to the blood theme.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: redesign the release showcase landing page with highlight cards",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2026-06-04T16:23:15Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "8d0cbb937ba729dc0b8c653bfb23ecd7e20d396f",
          "body": "Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: review user documentation for consistency and accuracy (#553)",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2026-06-04T15:47:05Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "bc381a5e7b48f3fe4976a6743ff7becc1628ff36",
          "body": "…endency (#552)\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor: share data assets with Ruby and make asciidoctor a peer dep…",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2026-06-04T14:52:07Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "9108e2d53e3ad52a77e58a12e0e148304b9bbdd6",
          "body": "…ses are published (#551)\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "build: Modernizes how the standalone binaries are built and how relea…",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2026-06-04T14:03:46Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "1b46d27b082624971b9eecb7a53255363ae12318",
          "body": "Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: add reveal.js 6.0 release demo showcasing the lightbox (#550)",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2026-06-04T11:44:19Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "867916602a20419443c652a8f9270fb937abe0d7",
          "body": "…(#549)\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: auto-discover release demos when publishing the showcase site …",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2026-06-04T09:45:00Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "df8ce163d9fa4320e78d8a7ef10f609e4c6ab42d",
          "body": "Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor: extract shared helpers for release scripts (#548)",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2026-06-04T09:34:26Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "dc7df8f21aae5b30f7582f17ede8c4d963f84ac9",
          "body": "Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: upgrade reveal.js to 6.0.1 and clean up release tasks (#547)",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2026-06-03T15:21:40Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "2bbfa4fc50e26350a62b79eac1c8a7fd5b162c54",
          "body": "… (#546)\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: update asciidoctor to 4.0.0-alpha.6 and drop fixed workarounds…",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2026-06-03T15:13:36Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "f6821ecf6a4f619523f4221fdaecc0b93555973d",
          "body": "Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor: port the converter to native Asciidoctor.js 4.0  (#545)",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2026-06-03T13:52:39Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "1178898c36272fe5c5ebfd3035bf0ecb3e85da23",
          "body": "Split dependency updates by ecosystem (npm/ruby), limit concurrent PRs\nto 3, schedule updates on Mondays, wait 7 days before proposing a new\nrelease, and switch to emoji-free semantic commits.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: improve renovate config for smaller, scheduled PRs",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2026-06-03T10:30:00Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "d593baf688b5b220951f1dc260723aea7744ec49",
          "body": "Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor: implement the converter using pure Ruby (#544)",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2026-06-03T10:24:54Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "727e2a9a0e5187d880503614e47b17832491d495",
          "body": "Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Automate release process via GitHub Actions (#543)",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2026-06-02T09:43:10Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "abf4081b526eea24cd933efbf71ebf5a84e96874",
          "body": null,
          "is_bot": false,
          "headline": "Amend release process description",
          "author_name": "Jérôme Tama",
          "author_login": "jtama",
          "committed_at": "2024-12-05T09:44:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2b3fd8fabd02e2dce3e278b99a9a35b00dfc9c37",
          "body": null,
          "is_bot": false,
          "headline": "Amend release process description",
          "author_name": "jtama",
          "author_login": "jtama",
          "committed_at": "2024-12-05T08:26:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d26cee12a009529d6be016a8e4e05da9d5167898",
          "body": null,
          "is_bot": false,
          "headline": "Begin development on next release 5.3.0-dev",
          "author_name": "jtama",
          "author_login": "jtama",
          "committed_at": "2024-12-04T07:43:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d0e60aecbda2dd546358fd3bab1056675870048d",
          "body": null,
          "is_bot": false,
          "headline": "Release 5.2.0",
          "author_name": "jtama",
          "author_login": "jtama",
          "committed_at": "2024-12-04T06:59:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "37133aa56a4e171ed504b67424bce85eab0eb104",
          "body": null,
          "is_bot": false,
          "headline": "Prepare 5.2.0 release",
          "author_name": "jtama",
          "author_login": "jtama",
          "committed_at": "2024-12-04T06:59:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8f45cb83d9ab74b98c881f3e39f0db94dbd32fbd",
          "body": null,
          "is_bot": false,
          "headline": "Prepare 5.2.0 (#537)",
          "author_name": "Jérôme Tama",
          "author_login": "jtama",
          "committed_at": "2024-12-03T18:43:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4f8cd93231894a043f576350732e5b712f4439e4",
          "body": null,
          "is_bot": false,
          "headline": "fix: update source-rouge assertion based on the latest version of Rouge",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2024-12-03T17:10:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "68d298b7f5f9f51a7b89d41bb74423d2f0694baf",
          "body": null,
          "is_bot": false,
          "headline": "chore: asciidoctor-doctest is incompatible with minitest >= 5.25",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2024-12-03T16:52:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c69f16945e418b33a016d29286c321ec7962f519",
          "body": "resolves #532",
          "is_bot": false,
          "headline": "Fixes data-fragment-index on code block (#533)",
          "author_name": "Jérôme Tama",
          "author_login": "jtama",
          "committed_at": "2024-05-04T14:04:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8484b01943a085cc1279cf2abe1d041a2e194254",
          "body": null,
          "is_bot": false,
          "headline": "Using [%step] on colist works the same as on ulist (#529)",
          "author_name": "ibethus",
          "author_login": "ibethus",
          "committed_at": "2024-04-15T20:19:07Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cbe2ac7f72877050ce15ee4a38fd54ca91590a78",
          "body": null,
          "is_bot": false,
          "headline": "Bump pkg",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2023-12-12T13:16:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a82413668f51dd0ebc2f1b24b58d251954c7a006",
          "body": null,
          "is_bot": false,
          "headline": "Release 5.1.0",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2023-12-12T12:57:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "11b3a47b5708e241d7aa2f9a9834a6f4f41cc162",
          "body": null,
          "is_bot": false,
          "headline": "Prepare 5.1.0 release",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2023-12-12T12:57:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "42e944b5bf82f9fd1d3d2d934e6e066feab6d818",
          "body": null,
          "is_bot": false,
          "headline": "Update ggrossetie GitHub username",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2023-12-12T12:48:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5ac68b6309778016930d12a319331abb2785f63f",
          "body": null,
          "is_bot": false,
          "headline": "Ignore public folder",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2023-12-12T12:46:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2b9f1e00547143475ad174b4ba07dbffaa6f7977",
          "body": null,
          "is_bot": false,
          "headline": "Update changelog",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2023-12-12T12:46:26Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c16a9494e430767b36c338c0e6cdb7b32a65dca4",
          "body": null,
          "is_bot": false,
          "headline": "Update dependencies to support Asciidoctor.js 3.x (#524)",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2023-12-12T12:02:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "68013c50201a42235f3a0cfeb9018ac656c2e6eb",
          "body": null,
          "is_bot": false,
          "headline": "Prepare 5.1.0 release based on reveal.js 4.5.0 (#517)",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2023-12-12T11:56:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "52a6bb95751f23db4dd7490b638da17e24b33363",
          "body": null,
          "is_bot": false,
          "headline": "resolves #479 upgrade to asciidoctor-templates-compiler 0.7.0 (#515)",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2023-12-12T11:55:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6e320b1d371f3d90bfe92ad916fa724e3d78ad1d",
          "body": "Co-authored-by: Renovate Bot <bot@renovateapp.com>",
          "is_bot": false,
          "headline": ":arrow_up: Update all dependencies (#498)",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2023-07-15T08:30:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d192d0b209021de034b0a77f82e873c676c75037",
          "body": null,
          "is_bot": false,
          "headline": "Fix docinfo xref",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2023-07-15T08:22:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        }
      ],
      "releases_count": 22,
      "commits_last_year": 71,
      "latest_release_at": "2026-07-30T09:13:58Z",
      "latest_release_tag": "v6.0.0-beta.2",
      "releases_from_tags": false,
      "days_since_last_push": 0,
      "active_weeks_last_year": 4,
      "days_since_latest_release": 0,
      "mean_days_between_releases": 264.9
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": false,
      "health_percentage": 50,
      "has_issue_template": false,
      "has_code_of_conduct": true,
      "has_pull_request_template": false
    },
    "ecosystem": {
      "packages": [
        {
          "name": "@asciidoctor/reveal.js",
          "exists": true,
          "license": "MIT",
          "keywords": [
            "asciidoc",
            "asciidoctor",
            "opal",
            "javascript",
            "library",
            "backend",
            "template",
            "reveal.js"
          ],
          "ecosystem": "npm",
          "matches_repo": true,
          "registry_url": "https://www.npmjs.com/package/@asciidoctor/reveal.js",
          "is_deprecated": false,
          "latest_version": "5.2.0",
          "repository_url": "https://github.com/asciidoctor/asciidoctor-reveal.js",
          "versions_count": 11,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": 3,
          "monthly_downloads": 5162,
          "first_published_at": "2019-12-26T20:36:40.014000Z",
          "latest_published_at": "2024-12-04T07:02:55.529000Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 603
        },
        {
          "name": "asciidoctor-revealjs",
          "exists": true,
          "license": "MIT",
          "keywords": [],
          "ecosystem": "rubygems",
          "matches_repo": true,
          "registry_url": "https://rubygems.org/gems/asciidoctor-revealjs",
          "is_deprecated": false,
          "latest_version": "5.2.0",
          "repository_url": "https://github.com/asciidoctor/asciidoctor-reveal.js",
          "versions_count": 26,
          "total_downloads": 293858,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": null,
          "first_published_at": "2016-10-07T02:01:21.456000Z",
          "latest_published_at": "2026-07-30T09:12:26.379000Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 0
        }
      ]
    },
    "popularity": {
      "forks": 185,
      "stars": 313,
      "watchers": 13,
      "fork_history": {
        "days": [
          {
            "date": "2014-10-17",
            "count": 1
          },
          {
            "date": "2014-10-19",
            "count": 2
          },
          {
            "date": "2014-12-06",
            "count": 1
          },
          {
            "date": "2015-01-14",
            "count": 1
          },
          {
            "date": "2015-02-02",
            "count": 1
          },
          {
            "date": "2015-02-21",
            "count": 1
          },
          {
            "date": "2015-05-05",
            "count": 1
          },
          {
            "date": "2015-05-26",
            "count": 1
          },
          {
            "date": "2015-06-05",
            "count": 1
          },
          {
            "date": "2015-06-12",
            "count": 1
          },
          {
            "date": "2015-07-09",
            "count": 2
          },
          {
            "date": "2015-07-14",
            "count": 1
          },
          {
            "date": "2015-07-21",
            "count": 1
          },
          {
            "date": "2015-08-14",
            "count": 1
          },
          {
            "date": "2015-08-27",
            "count": 1
          },
          {
            "date": "2015-09-04",
            "count": 1
          },
          {
            "date": "2015-09-18",
            "count": 1
          },
          {
            "date": "2015-09-25",
            "count": 1
          },
          {
            "date": "2015-10-17",
            "count": 1
          },
          {
            "date": "2015-10-20",
            "count": 1
          },
          {
            "date": "2015-10-22",
            "count": 1
          },
          {
            "date": "2015-11-20",
            "count": 1
          },
          {
            "date": "2015-11-26",
            "count": 1
          },
          {
            "date": "2015-12-01",
            "count": 1
          },
          {
            "date": "2016-02-25",
            "count": 1
          },
          {
            "date": "2016-02-29",
            "count": 1
          },
          {
            "date": "2016-04-21",
            "count": 1
          },
          {
            "date": "2016-04-22",
            "count": 1
          },
          {
            "date": "2016-04-27",
            "count": 1
          },
          {
            "date": "2016-05-25",
            "count": 1
          },
          {
            "date": "2016-06-12",
            "count": 1
          },
          {
            "date": "2016-07-18",
            "count": 1
          },
          {
            "date": "2016-09-06",
            "count": 1
          },
          {
            "date": "2016-09-08",
            "count": 1
          },
          {
            "date": "2016-09-14",
            "count": 1
          },
          {
            "date": "2016-09-22",
            "count": 1
          },
          {
            "date": "2016-09-29",
            "count": 1
          },
          {
            "date": "2016-10-18",
            "count": 1
          },
          {
            "date": "2016-10-29",
            "count": 1
          },
          {
            "date": "2017-01-11",
            "count": 1
          },
          {
            "date": "2017-02-26",
            "count": 1
          },
          {
            "date": "2017-03-03",
            "count": 2
          },
          {
            "date": "2017-03-14",
            "count": 1
          },
          {
            "date": "2017-04-02",
            "count": 1
          },
          {
            "date": "2017-04-19",
            "count": 1
          },
          {
            "date": "2017-05-22",
            "count": 1
          },
          {
            "date": "2017-08-14",
            "count": 1
          },
          {
            "date": "2017-09-17",
            "count": 1
          },
          {
            "date": "2017-10-08",
            "count": 1
          },
          {
            "date": "2017-10-18",
            "count": 1
          },
          {
            "date": "2017-10-31",
            "count": 1
          },
          {
            "date": "2017-12-26",
            "count": 1
          },
          {
            "date": "2018-01-31",
            "count": 1
          },
          {
            "date": "2018-02-01",
            "count": 1
          },
          {
            "date": "2018-02-03",
            "count": 1
          },
          {
            "date": "2018-02-08",
            "count": 1
          },
          {
            "date": "2018-03-05",
            "count": 1
          },
          {
            "date": "2018-03-13",
            "count": 1
          },
          {
            "date": "2018-04-10",
            "count": 1
          },
          {
            "date": "2018-04-15",
            "count": 1
          },
          {
            "date": "2018-07-05",
            "count": 1
          },
          {
            "date": "2018-09-09",
            "count": 1
          },
          {
            "date": "2018-10-11",
            "count": 1
          },
          {
            "date": "2018-11-19",
            "count": 1
          },
          {
            "date": "2018-12-04",
            "count": 1
          },
          {
            "date": "2019-01-17",
            "count": 1
          },
          {
            "date": "2019-02-02",
            "count": 1
          },
          {
            "date": "2019-03-03",
            "count": 1
          },
          {
            "date": "2019-03-04",
            "count": 1
          },
          {
            "date": "2019-04-01",
            "count": 1
          },
          {
            "date": "2019-04-26",
            "count": 1
          },
          {
            "date": "2019-06-12",
            "count": 2
          },
          {
            "date": "2019-09-08",
            "count": 1
          },
          {
            "date": "2019-09-22",
            "count": 1
          },
          {
            "date": "2019-09-30",
            "count": 1
          },
          {
            "date": "2019-10-28",
            "count": 1
          },
          {
            "date": "2019-10-31",
            "count": 1
          },
          {
            "date": "2019-11-27",
            "count": 1
          },
          {
            "date": "2019-12-04",
            "count": 1
          },
          {
            "date": "2020-01-23",
            "count": 1
          },
          {
            "date": "2020-01-28",
            "count": 1
          },
          {
            "date": "2020-02-21",
            "count": 1
          },
          {
            "date": "2020-03-03",
            "count": 1
          },
          {
            "date": "2020-05-08",
            "count": 1
          },
          {
            "date": "2020-05-18",
            "count": 1
          },
          {
            "date": "2020-07-01",
            "count": 1
          },
          {
            "date": "2020-07-05",
            "count": 1
          },
          {
            "date": "2020-08-10",
            "count": 1
          },
          {
            "date": "2020-08-18",
            "count": 1
          },
          {
            "date": "2020-09-08",
            "count": 1
          },
          {
            "date": "2020-09-22",
            "count": 1
          },
          {
            "date": "2020-09-24",
            "count": 1
          },
          {
            "date": "2020-09-29",
            "count": 1
          },
          {
            "date": "2020-11-16",
            "count": 1
          },
          {
            "date": "2020-11-26",
            "count": 3
          },
          {
            "date": "2020-12-22",
            "count": 1
          },
          {
            "date": "2021-01-19",
            "count": 1
          },
          {
            "date": "2021-01-26",
            "count": 2
          },
          {
            "date": "2021-02-05",
            "count": 1
          },
          {
            "date": "2021-02-27",
            "count": 1
          },
          {
            "date": "2021-03-02",
            "count": 1
          },
          {
            "date": "2021-03-03",
            "count": 1
          },
          {
            "date": "2021-03-05",
            "count": 1
          },
          {
            "date": "2021-03-30",
            "count": 1
          },
          {
            "date": "2021-04-15",
            "count": 1
          },
          {
            "date": "2021-04-22",
            "count": 1
          },
          {
            "date": "2021-05-06",
            "count": 1
          },
          {
            "date": "2021-05-17",
            "count": 1
          },
          {
            "date": "2021-06-06",
            "count": 1
          },
          {
            "date": "2021-06-10",
            "count": 1
          },
          {
            "date": "2021-06-13",
            "count": 1
          },
          {
            "date": "2021-06-16",
            "count": 1
          },
          {
            "date": "2021-06-28",
            "count": 1
          },
          {
            "date": "2021-07-10",
            "count": 1
          },
          {
            "date": "2021-07-20",
            "count": 1
          },
          {
            "date": "2021-07-27",
            "count": 1
          },
          {
            "date": "2021-08-01",
            "count": 1
          },
          {
            "date": "2021-08-10",
            "count": 1
          },
          {
            "date": "2021-08-24",
            "count": 1
          },
          {
            "date": "2021-09-15",
            "count": 1
          },
          {
            "date": "2021-09-20",
            "count": 1
          },
          {
            "date": "2021-09-22",
            "count": 1
          },
          {
            "date": "2021-10-06",
            "count": 1
          },
          {
            "date": "2021-10-27",
            "count": 1
          },
          {
            "date": "2021-11-01",
            "count": 1
          },
          {
            "date": "2021-11-22",
            "count": 1
          },
          {
            "date": "2021-12-11",
            "count": 1
          },
          {
            "date": "2021-12-16",
            "count": 1
          },
          {
            "date": "2022-01-06",
            "count": 1
          },
          {
            "date": "2022-01-11",
            "count": 1
          },
          {
            "date": "2022-01-13",
            "count": 1
          },
          {
            "date": "2022-01-26",
            "count": 1
          },
          {
            "date": "2022-01-28",
            "count": 1
          },
          {
            "date": "2022-03-01",
            "count": 1
          },
          {
            "date": "2022-03-06",
            "count": 1
          },
          {
            "date": "2022-03-15",
            "count": 1
          },
          {
            "date": "2022-03-27",
            "count": 1
          },
          {
            "date": "2022-04-01",
            "count": 1
          },
          {
            "date": "2022-04-13",
            "count": 1
          },
          {
            "date": "2022-04-14",
            "count": 1
          },
          {
            "date": "2022-05-25",
            "count": 1
          },
          {
            "date": "2022-06-29",
            "count": 1
          },
          {
            "date": "2022-07-09",
            "count": 1
          },
          {
            "date": "2022-07-19",
            "count": 1
          },
          {
            "date": "2022-08-05",
            "count": 1
          },
          {
            "date": "2022-08-08",
            "count": 1
          },
          {
            "date": "2022-08-11",
            "count": 1
          },
          {
            "date": "2022-09-08",
            "count": 1
          },
          {
            "date": "2022-09-09",
            "count": 1
          },
          {
            "date": "2022-09-11",
            "count": 1
          },
          {
            "date": "2022-09-15",
            "count": 1
          },
          {
            "date": "2022-09-22",
            "count": 1
          },
          {
            "date": "2022-09-24",
            "count": 1
          },
          {
            "date": "2022-10-03",
            "count": 2
          },
          {
            "date": "2022-10-14",
            "count": 1
          },
          {
            "date": "2022-10-25",
            "count": 1
          },
          {
            "date": "2022-11-07",
            "count": 1
          },
          {
            "date": "2022-11-14",
            "count": 2
          },
          {
            "date": "2022-12-08",
            "count": 1
          },
          {
            "date": "2023-02-06",
            "count": 1
          },
          {
            "date": "2023-02-09",
            "count": 1
          },
          {
            "date": "2023-02-13",
            "count": 1
          },
          {
            "date": "2023-03-01",
            "count": 1
          },
          {
            "date": "2023-03-06",
            "count": 1
          },
          {
            "date": "2023-03-22",
            "count": 1
          },
          {
            "date": "2023-04-04",
            "count": 1
          },
          {
            "date": "2023-05-07",
            "count": 1
          },
          {
            "date": "2023-06-11",
            "count": 1
          },
          {
            "date": "2023-06-24",
            "count": 1
          },
          {
            "date": "2024-03-20",
            "count": 1
          },
          {
            "date": "2024-03-23",
            "count": 1
          },
          {
            "date": "2024-04-13",
            "count": 1
          },
          {
            "date": "2024-04-16",
            "count": 1
          },
          {
            "date": "2024-06-07",
            "count": 1
          },
          {
            "date": "2024-12-02",
            "count": 1
          }
        ],
        "complete": true,
        "collected": 184,
        "total_forks": 185
      },
      "star_history": null,
      "open_issues_and_prs": 1
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [
        "example",
        "examples"
      ],
      "has_llms_txt": false,
      "has_dockerfile": false,
      "has_mcp_signal": false,
      "bootstrap_files": [],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [],
      "toolchain_manifests": [],
      "largest_source_bytes": 62446,
      "source_files_sampled": 29,
      "oversized_source_files": 2,
      "agent_instruction_files": [],
      "agent_instruction_max_bytes": null
    },
    "dependencies": {
      "manifests": [
        "Gemfile",
        "package.json"
      ],
      "advisories": {
        "error": null,
        "scope": "published_package",
        "source": "osv",
        "findings": [],
        "collected": true,
        "malicious": [],
        "truncated": false,
        "by_severity": {},
        "advisory_count": 0,
        "affected_count": 0,
        "assessed_count": 18,
        "malicious_count": 0,
        "assessed_package": "npm:@asciidoctor/reveal.js@5.2.0",
        "unassessed_count": 0,
        "direct_affected_count": 0
      },
      "ecosystems": [
        "npm",
        "rubygems"
      ],
      "dependencies": [
        {
          "name": "colorize",
          "manifest": "Gemfile",
          "ecosystem": "rubygems",
          "version_constraint": null
        },
        {
          "name": "rouge",
          "manifest": "Gemfile",
          "ecosystem": "rubygems",
          "version_constraint": null
        },
        {
          "name": "slim",
          "manifest": "Gemfile",
          "ecosystem": "rubygems",
          "version_constraint": "~> 3.0.6"
        },
        {
          "name": "reveal.js",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "6.0.1"
        }
      ],
      "all_dependencies": {
        "error": null,
        "source": "github-sbom",
        "packages": [
          {
            "name": "reveal.js",
            "direct": true,
            "version": "6.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "colorize",
            "direct": true,
            "version": null,
            "ecosystem": "rubygems"
          },
          {
            "name": "rouge",
            "direct": true,
            "version": null,
            "ecosystem": "rubygems"
          },
          {
            "name": "slim",
            "direct": true,
            "version": null,
            "ecosystem": "rubygems"
          },
          {
            "name": "@asciidoctor/core",
            "direct": false,
            "version": "4.0.6",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/aix-ppc64",
            "direct": false,
            "version": "0.28.0",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/android-arm",
            "direct": false,
            "version": "0.28.0",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/android-arm64",
            "direct": false,
            "version": "0.28.0",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/android-x64",
            "direct": false,
            "version": "0.28.0",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/darwin-arm64",
            "direct": false,
            "version": "0.28.0",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/darwin-x64",
            "direct": false,
            "version": "0.28.0",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/freebsd-arm64",
            "direct": false,
            "version": "0.28.0",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/freebsd-x64",
            "direct": false,
            "version": "0.28.0",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/linux-arm",
            "direct": false,
            "version": "0.28.0",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/linux-arm64",
            "direct": false,
            "version": "0.28.0",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/linux-ia32",
            "direct": false,
            "version": "0.28.0",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/linux-loong64",
            "direct": false,
            "version": "0.28.0",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/linux-mips64el",
            "direct": false,
            "version": "0.28.0",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/linux-ppc64",
            "direct": false,
            "version": "0.28.0",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/linux-riscv64",
            "direct": false,
            "version": "0.28.0",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/linux-s390x",
            "direct": false,
            "version": "0.28.0",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/linux-x64",
            "direct": false,
            "version": "0.28.0",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/netbsd-arm64",
            "direct": false,
            "version": "0.28.0",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/netbsd-x64",
            "direct": false,
            "version": "0.28.0",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/openbsd-arm64",
            "direct": false,
            "version": "0.28.0",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/openbsd-x64",
            "direct": false,
            "version": "0.28.0",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/openharmony-arm64",
            "direct": false,
            "version": "0.28.0",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/sunos-x64",
            "direct": false,
            "version": "0.28.0",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/win32-arm64",
            "direct": false,
            "version": "0.28.0",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/win32-ia32",
            "direct": false,
            "version": "0.28.0",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/win32-x64",
            "direct": false,
            "version": "0.28.0",
            "ecosystem": "npm"
          },
          {
            "name": "@fortawesome/fontawesome-free",
            "direct": false,
            "version": "6.7.2",
            "ecosystem": "npm"
          },
          {
            "name": "asciidoc-converter-testkit-cli",
            "direct": false,
            "version": "0.1.4",
            "ecosystem": "npm"
          },
          {
            "name": "asciidoc-converter-testkit-core",
            "direct": false,
            "version": "0.1.4",
            "ecosystem": "npm"
          },
          {
            "name": "asciidoctor",
            "direct": false,
            "version": "4.0.6",
            "ecosystem": "npm"
          },
          {
            "name": "commander",
            "direct": false,
            "version": "9.5.0",
            "ecosystem": "npm"
          },
          {
            "name": "entities",
            "direct": false,
            "version": "8.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "esbuild",
            "direct": false,
            "version": "0.28.0",
            "ecosystem": "npm"
          },
          {
            "name": "parse5",
            "direct": false,
            "version": "8.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "postject",
            "direct": false,
            "version": "1.0.0-alpha.6",
            "ecosystem": "npm"
          },
          {
            "name": "asciidoctor",
            "direct": false,
            "version": null,
            "ecosystem": "rubygems"
          },
          {
            "name": "irb",
            "direct": false,
            "version": null,
            "ecosystem": "rubygems"
          },
          {
            "name": "minitest",
            "direct": false,
            "version": null,
            "ecosystem": "rubygems"
          },
          {
            "name": "pry",
            "direct": false,
            "version": null,
            "ecosystem": "rubygems"
          },
          {
            "name": "pry-byebug",
            "direct": false,
            "version": null,
            "ecosystem": "rubygems"
          },
          {
            "name": "pygments.rb",
            "direct": false,
            "version": null,
            "ecosystem": "rubygems"
          },
          {
            "name": "rake",
            "direct": false,
            "version": null,
            "ecosystem": "rubygems"
          },
          {
            "name": "rubocop",
            "direct": false,
            "version": null,
            "ecosystem": "rubygems"
          },
          {
            "name": "rubocop-minitest",
            "direct": false,
            "version": null,
            "ecosystem": "rubygems"
          },
          {
            "name": "rubocop-rake",
            "direct": false,
            "version": null,
            "ecosystem": "rubygems"
          }
        ],
        "collected": true,
        "truncated": false,
        "total_count": 50,
        "direct_count": 4,
        "indirect_count": 46
      }
    },
    "maintainership": {
      "issues": {
        "open_prs": 0,
        "merged_prs": 292,
        "open_issues": 1,
        "closed_ratio": 0.996,
        "closed_issues": 273,
        "closed_unmerged_prs": 34
      },
      "bus_factor": 1,
      "bot_contributors": 2,
      "top_contributors": [
        {
          "type": "User",
          "login": "obilodeau",
          "commits": 671,
          "avatar_url": "https://avatars.githubusercontent.com/u/546325?v=4"
        },
        {
          "type": "User",
          "login": "ggrossetie",
          "commits": 298,
          "avatar_url": "https://avatars.githubusercontent.com/u/333276?v=4"
        },
        {
          "type": "User",
          "login": "mojavelinux",
          "commits": 55,
          "avatar_url": "https://avatars.githubusercontent.com/u/79351?v=4"
        },
        {
          "type": "User",
          "login": "jtama",
          "commits": 7,
          "avatar_url": "https://avatars.githubusercontent.com/u/39991688?v=4"
        },
        {
          "type": "User",
          "login": "archiloque",
          "commits": 6,
          "avatar_url": "https://avatars.githubusercontent.com/u/3771?v=4"
        },
        {
          "type": "User",
          "login": "robertpanzer",
          "commits": 6,
          "avatar_url": "https://avatars.githubusercontent.com/u/1163662?v=4"
        },
        {
          "type": "User",
          "login": "cmoulliard",
          "commits": 5,
          "avatar_url": "https://avatars.githubusercontent.com/u/463790?v=4"
        },
        {
          "type": "User",
          "login": "dschulten",
          "commits": 4,
          "avatar_url": "https://avatars.githubusercontent.com/u/107194?v=4"
        },
        {
          "type": "User",
          "login": "akosma",
          "commits": 4,
          "avatar_url": "https://avatars.githubusercontent.com/u/55348?v=4"
        },
        {
          "type": "User",
          "login": "JacobAae",
          "commits": 4,
          "avatar_url": "https://avatars.githubusercontent.com/u/2094825?v=4"
        }
      ],
      "contributors_sampled": 42,
      "top_contributor_share": 0.605
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "ci.yml",
        "release.yml"
      ],
      "has_docs_dir": true,
      "linter_configs": [
        ".rubocop.yml"
      ],
      "has_editorconfig": true,
      "has_linter_config": true,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [
        "package-lock.json"
      ],
      "scorecard": {
        "checks": [
          {
            "name": "Binary-Artifacts",
            "score": 10,
            "reason": "no binaries found in the repo",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
          },
          {
            "name": "Branch-Protection",
            "score": 0,
            "reason": "branch protection not enabled on development/release branches",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
          },
          {
            "name": "CI-Tests",
            "score": 10,
            "reason": "22 out of 22 merged PRs checked by a CI test -- score normalized to 10",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#ci-tests"
          },
          {
            "name": "CII-Best-Practices",
            "score": 0,
            "reason": "no effort to earn an OpenSSF best practices badge detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#cii-best-practices"
          },
          {
            "name": "Code-Review",
            "score": 0,
            "reason": "Found 0/30 approved changesets -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 10,
            "reason": "project has 30 contributing companies or organizations",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
          },
          {
            "name": "Dangerous-Workflow",
            "score": 10,
            "reason": "no dangerous workflow patterns detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
          },
          {
            "name": "Dependency-Update-Tool",
            "score": 10,
            "reason": "update tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
          },
          {
            "name": "Fuzzing",
            "score": 0,
            "reason": "project is not fuzzed",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
          },
          {
            "name": "License",
            "score": 9,
            "reason": "license file detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
          },
          {
            "name": "Maintained",
            "score": 10,
            "reason": "30 commit(s) and 19 issue activity found in the last 90 days -- score normalized to 10",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
          },
          {
            "name": "Packaging",
            "score": null,
            "reason": "packaging workflow not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
          },
          {
            "name": "Pinned-Dependencies",
            "score": 3,
            "reason": "dependency not pinned by hash detected -- score normalized to 3",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
          },
          {
            "name": "SAST",
            "score": 0,
            "reason": "SAST tool is not run on all commits -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
          },
          {
            "name": "Security-Policy",
            "score": 0,
            "reason": "security policy file not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
          },
          {
            "name": "Signed-Releases",
            "score": 0,
            "reason": "Project has not signed or included provenance with any releases.",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
          },
          {
            "name": "Token-Permissions",
            "score": 0,
            "reason": "detected GitHub workflow tokens with excessive permissions",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
          },
          {
            "name": "Vulnerabilities",
            "score": 9,
            "reason": "1 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "8de8b6e166bdbab38c977fa2c221a7a308ceb6ca",
        "ran_at": "2026-07-30T09:17:54Z",
        "aggregate_score": 4.8,
        "scorecard_version": "v5.5.0"
      },
      "has_codeql_workflow": false,
      "has_security_policy": false,
      "has_dependabot_config": false
    },
    "contribution_flow": {
      "collected": true,
      "ci_last_run_at": "2026-07-30T09:11:28Z",
      "oldest_open_prs": [],
      "last_merged_pr_at": "2026-07-30T09:08:10Z",
      "ci_last_conclusion": null,
      "oldest_open_issues": [
        {
          "number": 516,
          "created_at": "2023-07-15T09:52:43Z",
          "last_comment_at": null,
          "last_comment_author": null
        }
      ]
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/asciidoctor/asciidoctor-reveal.js",
    "host": "github.com",
    "name": "asciidoctor-reveal.js",
    "owner": "asciidoctor"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "good",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 71,
      "inputs": {
        "security": 58,
        "vitality": 70,
        "community": 62,
        "governance": 71,
        "engineering": 90
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "good",
        "name": "Vitality",
        "value": 70,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "moderate",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 66,
            "inputs": {
              "commits_last_year": 71,
              "human_commit_share": 0.96,
              "days_since_last_push": 0,
              "active_weeks_last_year": 4
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 0 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 0
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "4/52 weeks with commits",
                "points": 2.8,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 4
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "71 commits in the last year",
                "points": 16.7,
                "status": "partial",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 71
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "30 commit(s) and 19 issue activity found in the last 90 days -- score normalized to 10",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "release_discipline",
            "band": "good",
            "name": "Release discipline",
            "note": null,
            "notes": [],
            "value": 76,
            "inputs": {
              "releases_count": 22,
              "latest_release_tag": "v6.0.0-beta.2",
              "releases_from_tags": false,
              "days_since_latest_release": 0,
              "mean_days_between_releases": 264.9
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "22 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 22
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 0 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 0
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~264.9 days",
                "points": 12.6,
                "status": "partial",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 264.9
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "openssf_scorecard_signed_releases",
                "name": "OpenSSF Scorecard: Signed-Releases",
                "detail": "Project has not signed or included provenance with any releases.",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "abandonment",
            "band": "excellent",
            "name": "Abandonment",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "cap": null,
              "state": "maintained",
              "guards": [],
              "signals": [],
              "red_flag": false,
              "multiplier_pct": 100,
              "declared_reason": null,
              "unverified_reason": null,
              "unanswered_open_prs": null,
              "unanswered_open_issues": null,
              "days_since_last_merged_pr": null,
              "days_since_last_human_commit": 0,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "last human commit 0 days ago",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_maintained",
                    "params": {
                      "days": 0
                    }
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "moderate",
        "name": "Community & Adoption",
        "value": 62,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "moderate",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 65,
            "inputs": {
              "forks": 185,
              "stars": 313,
              "watchers": 13,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "313 stars",
                "points": 40.5,
                "status": "partial",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 313
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "185 forks",
                "points": 18.9,
                "status": "partial",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 185
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "13 watchers",
                "points": 6,
                "status": "partial",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 13
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "moderate",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 59,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "has_contributing": false,
              "has_issue_template": false,
              "has_code_of_conduct": true,
              "has_pull_request_template": false
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 22.5,
                "status": "met",
                "details": [],
                "max_points": 22.5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "license file present, not a recognized license",
                "points": 16.9,
                "status": "partial",
                "details": [
                  {
                    "code": "license_custom",
                    "params": {}
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributing_guide",
                "name": "CONTRIBUTING guide",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 18
              },
              {
                "key": "code_of_conduct",
                "name": "Code of conduct",
                "detail": null,
                "points": 13.5,
                "status": "met",
                "details": [],
                "max_points": 13.5
              },
              {
                "key": "issue_template",
                "name": "Issue template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.2
              },
              {
                "key": "pr_template",
                "name": "PR template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.3
              }
            ]
          },
          {
            "key": "ecosystem_adoption",
            "band": "moderate",
            "name": "Ecosystem adoption (downloads)",
            "note": "Excluded from scoring (no data or not applicable): Registry dependents. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "registry_dependents"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 62,
            "inputs": {
              "packages": [
                "@asciidoctor/reveal.js",
                "asciidoctor-revealjs"
              ],
              "dependents": null,
              "ecosystems": "npm, rubygems",
              "total_downloads": 293858,
              "monthly_downloads": 5162
            },
            "components": [
              {
                "key": "monthly_downloads",
                "name": "Monthly downloads",
                "detail": "5,162 downloads/month across npm, rubygems",
                "points": 49.5,
                "status": "partial",
                "details": [
                  {
                    "code": "downloads_monthly",
                    "params": {
                      "count": 5162,
                      "ecosystems": "npm, rubygems"
                    }
                  }
                ],
                "max_points": 80
              },
              {
                "key": "registry_dependents",
                "name": "Registry dependents",
                "detail": "not reported by this ecosystem",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "not_reported_by_this_ecosystem",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          }
        ],
        "description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
      },
      {
        "key": "governance",
        "band": "good",
        "name": "Sustainability & Governance",
        "value": 71,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "at_risk",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 41,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 42,
              "top_contributor_share": 0.605
            },
            "components": [
              {
                "key": "bus_factor",
                "name": "Bus factor",
                "detail": "1 contributor(s) cover half of all commits",
                "points": 9,
                "status": "partial",
                "details": [
                  {
                    "code": "bus_factor",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 54
              },
              {
                "key": "commit_distribution",
                "name": "Commit distribution",
                "detail": "top contributor authored 60% of commits",
                "points": 8.9,
                "status": "partial",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 60
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "42 contributors",
                "points": 13.5,
                "status": "met",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 42
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 30 contributing companies or organizations",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "good",
            "name": "Issue & PR responsiveness",
            "note": null,
            "notes": [],
            "value": 81,
            "inputs": {
              "merged_prs": 292,
              "open_issues": 1,
              "closed_issues": 273,
              "issue_closed_ratio": 0.996,
              "closed_unmerged_prs": 34
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "100% of issues closed",
                "points": 46.6,
                "status": "partial",
                "details": [
                  {
                    "code": "issues_closed_share",
                    "params": {
                      "share": 100
                    }
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "292/326 decided PRs merged",
                "points": 34.3,
                "status": "partial",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 292,
                      "decided": 326
                    }
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 0/30 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "good",
            "name": "Ownership & stewardship",
            "note": null,
            "notes": [],
            "value": 74,
            "inputs": {
              "followers": 466,
              "owner_type": "Organization",
              "is_verified": null,
              "owner_login": "asciidoctor",
              "public_repos": 83,
              "account_age_days": 4962
            },
            "components": [
              {
                "key": "ownership_backing",
                "name": "Ownership backing",
                "detail": "organization-owned",
                "points": 30,
                "status": "met",
                "details": [
                  {
                    "code": "owner_organization",
                    "params": {}
                  }
                ],
                "max_points": 30
              },
              {
                "key": "verified_domain",
                "name": "Verified domain",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 20
              },
              {
                "key": "owner_reach",
                "name": "Owner reach",
                "detail": "466 followers of asciidoctor",
                "points": 19.2,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 466,
                      "login": "asciidoctor"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "83 public repos, account ~13 yr old",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 83
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 13
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "excellent",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "@asciidoctor/reveal.js",
                "asciidoctor-revealjs"
              ],
              "ecosystems": "npm, rubygems",
              "any_deprecated": false,
              "min_days_since_publish": 0
            },
            "components": [
              {
                "key": "published_resolvable",
                "name": "Published & resolvable",
                "detail": "2 package(s) on npm, rubygems",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "packages_published",
                    "params": {
                      "count": 2,
                      "ecosystems": "npm, rubygems"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "publish_recency",
                "name": "Publish recency",
                "detail": "latest publish 0 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 0
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "26 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 26
                    }
                  }
                ],
                "max_points": 20
              },
              {
                "key": "not_deprecated",
                "name": "Not deprecated",
                "detail": "active, not deprecated or yanked",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "package_not_deprecated",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          }
        ],
        "description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?"
      },
      {
        "key": "engineering",
        "band": "excellent",
        "name": "Engineering Quality",
        "value": 90,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "excellent",
            "name": "Engineering practices",
            "note": null,
            "notes": [],
            "value": 90,
            "inputs": {
              "has_ci": true,
              "has_tests": true,
              "has_editorconfig": true,
              "has_linter_config": true,
              "has_precommit_config": false
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": "2 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 2
                    }
                  }
                ],
                "max_points": 24
              },
              {
                "key": "tests_present",
                "name": "Tests present",
                "detail": null,
                "points": 24,
                "status": "met",
                "details": [],
                "max_points": 24
              },
              {
                "key": "linter_config",
                "name": "Linter config",
                "detail": ".rubocop.yml",
                "points": 16,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": ".rubocop.yml"
                    }
                  }
                ],
                "max_points": 16
              },
              {
                "key": "pre_commit_hooks",
                "name": "Pre-commit hooks",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 9.6
              },
              {
                "key": "editorconfig",
                "name": ".editorconfig",
                "detail": null,
                "points": 6.4,
                "status": "met",
                "details": [],
                "max_points": 6.4
              },
              {
                "key": "openssf_scorecard_ci_tests",
                "name": "OpenSSF Scorecard: CI-Tests",
                "detail": "22 out of 22 merged PRs checked by a CI test -- score normalized to 10",
                "points": 20,
                "status": "met",
                "details": [],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "excellent",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 90,
            "inputs": {
              "topics": [
                "asciidoc",
                "reveal-js",
                "asciidoctor",
                "slides",
                "slideshow",
                "presentations",
                "hacktoberfest"
              ],
              "has_wiki": false,
              "homepage": "http://asciidoctor.org",
              "has_readme": true,
              "has_docs_dir": true,
              "has_description": true
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 30,
                "status": "met",
                "details": [],
                "max_points": 30
              },
              {
                "key": "documentation_directory",
                "name": "Documentation directory",
                "detail": null,
                "points": 25,
                "status": "met",
                "details": [],
                "max_points": 25
              },
              {
                "key": "documentation_homepage_site",
                "name": "Documentation / homepage site",
                "detail": "http://asciidoctor.org",
                "points": 15,
                "status": "met",
                "details": [],
                "max_points": 15
              },
              {
                "key": "repository_description",
                "name": "Repository description",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "topics",
                "name": "Topics",
                "detail": "7 topics",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "topics_count",
                    "params": {
                      "count": 7
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "wiki",
                "name": "Wiki",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          }
        ],
        "description": "Are baseline engineering and documentation practices in place?"
      },
      {
        "key": "security",
        "band": "moderate",
        "name": "Security",
        "value": 58,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "at_risk",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): Packaging. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "packaging"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 48,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 17,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 1,
              "scorecard_aggregate": 4.8
            },
            "components": [
              {
                "key": "binary_artifacts",
                "name": "Binary-Artifacts",
                "detail": "no binaries found in the repo",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "branch_protection",
                "name": "Branch-Protection",
                "detail": "branch protection not enabled on development/release branches",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "ci_tests",
                "name": "CI-Tests",
                "detail": "22 out of 22 merged PRs checked by a CI test -- score normalized to 10",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "cii_best_practices",
                "name": "CII-Best-Practices",
                "detail": "no effort to earn an OpenSSF best practices badge detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "code_review",
                "name": "Code-Review",
                "detail": "Found 0/30 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 30 contributing companies or organizations",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "dangerous_workflow",
                "name": "Dangerous-Workflow",
                "detail": "no dangerous workflow patterns detected",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "dependency_update_tool",
                "name": "Dependency-Update-Tool",
                "detail": "update tool detected",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "fuzzing",
                "name": "Fuzzing",
                "detail": "project is not fuzzed",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "license file detected",
                "points": 2.2,
                "status": "partial",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "maintained",
                "name": "Maintained",
                "detail": "30 commit(s) and 19 issue activity found in the last 90 days -- score normalized to 10",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "packaging",
                "name": "Packaging",
                "detail": "packaging workflow not detected",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 5
              },
              {
                "key": "pinned_dependencies",
                "name": "Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 3",
                "points": 1.5,
                "status": "partial",
                "details": [],
                "max_points": 5
              },
              {
                "key": "sast",
                "name": "SAST",
                "detail": "SAST tool is not run on all commits -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "security_policy",
                "name": "Security-Policy",
                "detail": "security policy file not detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "signed_releases",
                "name": "Signed-Releases",
                "detail": "Project has not signed or included provenance with any releases.",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "token_permissions",
                "name": "Token-Permissions",
                "detail": "detected GitHub workflow tokens with excessive permissions",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "vulnerabilities",
                "name": "Vulnerabilities",
                "detail": "1 existing vulnerabilities detected",
                "points": 6.8,
                "status": "partial",
                "details": [],
                "max_points": 7.5
              }
            ]
          },
          {
            "key": "dependency_advisories",
            "band": "excellent",
            "name": "Dependency advisories",
            "note": "Excluded from scoring (no data or not applicable): No advisories left outstanding. Remaining weights renormalized. Matched the npm:@asciidoctor/reveal.js@5.2.0 runtime dependency closure — what installing the published package pulls in — 18 packages. Reachability is not analyzed.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "no_advisories_left_outstanding"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              },
              {
                "code": "advisories_scope_published",
                "params": {
                  "package": "npm:@asciidoctor/reveal.js@5.2.0",
                  "assessed": 18
                }
              },
              {
                "code": "advisories_reachability",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "source": "osv",
              "advisories": 0,
              "affected_packages": 0,
              "assessed_packages": 18,
              "unassessed_packages": 0,
              "affected_by_severity": "none",
              "direct_affected_packages": 0
            },
            "components": [
              {
                "key": "direct_dependencies_free_of_known_advisories",
                "name": "Direct dependencies free of known advisories",
                "detail": "no direct dependency carries a known advisory",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "no_direct_advisories",
                    "params": {}
                  }
                ],
                "max_points": 35
              },
              {
                "key": "indirect_dependencies_free_of_known_advisories",
                "name": "Indirect dependencies free of known advisories",
                "detail": "no indirect dependency carries a known advisory",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "no_indirect_advisories",
                    "params": {}
                  }
                ],
                "max_points": 25
              },
              {
                "key": "no_advisories_left_outstanding",
                "name": "No advisories left outstanding",
                "detail": "no advisory carries a publication date",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "advisories_no_publication_date",
                    "params": {}
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "malicious_dependencies",
            "band": "excellent",
            "name": "Malicious dependencies",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "source": "osv",
              "meaning": "reported as a malicious package by the OpenSSF corpus; the remedy is removal or moving off the compromised name, never an upgrade of the same artifact. Versions the registry has since pulled are listed but not scored",
              "packages": [],
              "red_flag": false,
              "assessed_packages": 18,
              "malicious_packages": 0,
              "direct_malicious_packages": 0,
              "withdrawn_malicious_packages": 0,
              "installable_malicious_packages": 0
            },
            "components": [
              {
                "key": "no_dependency_reported_as_a_malicious_package",
                "name": "No dependency reported as a malicious package",
                "detail": "no dependency is reported as a malicious package",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "no_malicious_dependencies",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          },
          {
            "key": "high_risk_jurisdiction_exposure",
            "band": "excellent",
            "name": "High-Risk Jurisdiction Exposure",
            "note": "Only high-confidence self-published location evidence affects this multiplier. Ambiguous matches are review-only; country evidence is not proof of nationality, citizenship, legal registration, malicious intent, or sanctions status.",
            "notes": [
              {
                "code": "jurisdiction_evidence_limits",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "meaning": "self-published location evidence; not nationality or citizenship",
              "red_flag": false,
              "exposures": [],
              "policy_countries": [
                "Russia",
                "Iran",
                "North Korea"
              ],
              "review_only_matches": 0,
              "assessed_self_published_locations": 22
            },
            "components": [
              {
                "key": "policy_exposure_multiplier",
                "name": "Policy exposure multiplier",
                "detail": "no confirmed policy-scope location match",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "jurisdiction_no_match",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Are visible security and supply-chain practices strong, with no malicious dependency and no unresolved high-risk jurisdiction exposure?"
      },
      {
        "key": "ai_readiness",
        "band": "at_risk",
        "name": "AI Readiness",
        "value": 48,
        "weight": 0,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "at_risk",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": 0.875,
              "agent_instruction_files": [],
              "agent_instruction_max_bytes": null
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": "no CLAUDE.md / AGENTS.md / editor rules",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_agent_instructions",
                    "params": {}
                  }
                ],
                "max_points": 45
              },
              {
                "key": "machine_readable_docs_llms_txt",
                "name": "Machine-readable docs (llms.txt)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "legible_commit_history",
                "name": "Legible commit history",
                "detail": "84 of 96 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 84,
                      "sampled": 96
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "moderate",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 56,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [
                "package-lock.json"
              ],
              "has_dockerfile": false,
              "typed_language": false,
              "bootstrap_files": [],
              "has_devcontainer": false,
              "has_linter_config": true,
              "typecheck_configs": [],
              "agent_commit_share": 0.28,
              "toolchain_manifests": [],
              "dependency_bot_commit_share": 0
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 18
              },
              {
                "key": "automated_tests",
                "name": "Automated tests",
                "detail": null,
                "points": 22,
                "status": "met",
                "details": [],
                "max_points": 22
              },
              {
                "key": "lint_format_config",
                "name": "Lint / format config",
                "detail": ".rubocop.yml",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": ".rubocop.yml"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "static_type_checking",
                "name": "Static type checking",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 11
              },
              {
                "key": "reproducible_environment",
                "name": "Reproducible environment",
                "detail": "lockfile",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "lockfile"
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "28 of the last 100 commits agent-authored or agent-credited",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "agent_authored_commits",
                    "params": {
                      "count": 28,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "automated_maintenance",
                "name": "Automated maintenance",
                "detail": "no automated dependency updates observed",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_dependency_automation",
                    "params": {}
                  }
                ],
                "max_points": 8
              },
              {
                "key": "openssf_scorecard_pinned_dependencies",
                "name": "OpenSSF Scorecard: Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 3",
                "points": 3,
                "status": "partial",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "moderate",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 51,
            "inputs": {
              "primary_language": "HTML",
              "largest_source_bytes": 62446,
              "source_files_sampled": 29,
              "oversized_source_files": 2
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "HTML without a type-check config",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_typecheck_config_language",
                    "params": {
                      "language": "HTML"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "2/29 source files over 60KB",
                "points": 51.2,
                "status": "partial",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 29,
                      "oversized": 2
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          },
          {
            "key": "ai_interfaces",
            "band": "at_risk",
            "name": "Machine-readable interfaces",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "example_dirs": [
                "example",
                "examples"
              ],
              "has_mcp_signal": false,
              "api_schema_files": []
            },
            "components": [
              {
                "key": "api_schema_openapi_graphql_proto",
                "name": "API schema (OpenAPI/GraphQL/proto)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 40
              },
              {
                "key": "mcp_server",
                "name": "MCP server",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 20
              },
              {
                "key": "runnable_examples",
                "name": "Runnable examples",
                "detail": "example, examples",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "example, examples"
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          }
        ],
        "description": "How well is the repo equipped to be developed and maintained with AI coding agents? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score."
      }
    ],
    "metrics_version": "1.13.0"
  },
  "warnings": [
    "Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-30T09:18:20.318936Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/a/asciidoctor/asciidoctor-reveal.js.svg",
  "full_name": "asciidoctor/asciidoctor-reveal.js",
  "license_state": "custom",
  "license_spdx": null
}

Bewertungen sind Signale, keine Garantien. Sie spiegeln öffentlich sichtbare Praxis auf GitHub wider — kein Code-Audit und keine Sicherheitsgarantie.

Fehlende Daten werden ausgeschlossen und die Gewichte neu normiert, nie als null bewertet. Die Methodik ist versioniert und offen: Metriken v1.13.0, Schema v0.27.0 — vollständige Methodik · Metriken-Wiki.

Wie ein einzelnes Ergebnis im Gesamtregister steht: aggregierte Statistikennpm, RubyGems.