Öffentliches Register
Software-GesundheitsberichtSchema 0.27.0 · Metriken 1.13.0 · 2026-07-25 06:01 UTC

aeshell / aesh-readline

Java Readline API

JavaApache-2.0★ 26 Sterne⑂ 16 Forksseit Dez. 2015Auf GitHub ansehen ↗

aeshell/aesh-readline erreicht einen Gesundheitsindex von 65 von 100 und liegt damit im Bereich Mittel. Am stärksten schneidet es bei Vitality (89/100) ab, am schwächsten bei Community & Adoption (41/100). Zuletzt vor 4 Tagen aktualisiert. Ein einzelner Mitwirkender trägt den Großteil der jüngsten Arbeit.

65
gesamt / 100
Mittel

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.

65
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

aeshellOrganisation
0 Follower8 öffentliche Reposseit Juli 2012

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

Paket-Ökosysteme

RegistryPaketVersionDownloads / MonatVersionenZuletzt veröffentlicht
Mavenorg.aesh:readline3.16.3-27vor 12 Tagen
Mavenorg.aesh:readline-api3.16.3-13vor 12 Tagen
Mavenorg.aesh:terminal-api3.16.3-27vor 12 Tagen
Mavenorg.aesh:terminal-ssh3.16.3-27vor 12 Tagen
Mavenorg.aesh:terminal-tty3.16.3-20vor 12 Tagen
Mavenorg.aesh:terminal-http3.16.3-27vor 12 Tagen
Mavenorg.aesh:terminal-detect3.16.3-12vor 12 Tagen
Mavenorg.aesh:terminal-telnet3.16.3-27vor 12 Tagen

Metriken nach Kategorie

Vitalität

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

89Exzellent · 22 % des Gesamtindex
Wie die Bewertung erfolgt
36/36Push-Aktualität — letzter Push vor 4 Tagen
18/36Commit-Rhythmus — 26/52 Wochen mit Commits
18/18Commit-Volumen — 346 Commits im letzten Jahr
10/10OpenSSF Scorecard: Maintained — 30 commit(s) and 28 issue activity found in the last 90 days -- score normalized to 10
Verwendete Eingangsdaten
commits_last_year346
human_commit_share0,6
days_since_last_push4
active_weeks_last_year26

Release-Disziplin

100Exzellent
Wie die Bewertung erfolgt
27/27Liefert Releases aus — 18 Releases veröffentlicht
36/36Release-Aktualität — letztes Release vor 12 Tagen
27/27Release-Rhythmus — ein Release etwa alle 4,1 Tage
0/10OpenSSF Scorecard: Signed-Releases — keine Daten
Verwendete Eingangsdaten
releases_count18
latest_release_tagv3.16.3
releases_from_tagsnein
days_since_latest_release12
mean_days_between_releases4,1
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): OpenSSF Scorecard: Signed-Releases. Die verbleibenden Gewichte wurden renormalisiert.

Community & Verbreitung

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

41Gefährdet · 18 % des Gesamtindex
Wie die Bewertung erfolgt
22.7/60Stars — 26 Stars
9.8/25Forks — 16 Forks
1.7/15Watcher — 3 Watcher
Verwendete Eingangsdaten
forks16
stars26
watchers3
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
Wie die Bewertung erfolgt
22.5/22.5README
22.5/22.5Lizenz — anerkannte Lizenz (Apache-2.0)
0/18CONTRIBUTING-Leitfaden
0/13.5Verhaltenskodex
0/7.2Issue-Vorlage
0/6.3PR-Vorlage
Verwendete Eingangsdaten
has_readmeja
has_licenseja
has_contributingnein
has_issue_templatenein
has_code_of_conductnein
has_pull_request_templatenein

Nachhaltigkeit & Governance

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

63Mittel · 24 % des Gesamtindex
Wie die Bewertung erfolgt
9/54Bus-Faktor — 1 Beitragende decken die Hälfte aller Commits ab
2/22.5Commit-Verteilung — wichtigste beitragende Person verfasste 91 % der Commits
13.5/13.5Breite der Beitragenden — 12 Beitragende
10/10OpenSSF Scorecard: Contributors — project has 7 contributing companies or organizations
Verwendete Eingangsdaten
bus_factor1
contributors_sampled12
top_contributor_share0,91
Wie die Bewertung erfolgt
44.4/46.8Issue-Lösungsquote — 95 % der Issues geschlossen
36.5/38.3PR-Annahme — 144/151 entschiedene PRs gemergt
0/15OpenSSF Scorecard: Code-Review — Found 0/14 approved changesets -- score normalized to 0
Verwendete Eingangsdaten
merged_prs144
open_issues4
closed_issues74
issue_closed_ratio0,949
closed_unmerged_prs7
Wie die Bewertung erfolgt
30/30Organisatorische Trägerschaft — im Besitz einer Organisation
0/20Verifizierte Domain
0/25Reichweite des Inhabers — 0 Follower von aeshell
18.9/25Kontohistorie — 8 öffentliche Repos, Kontoalter ca. 13 Jahre
Verwendete Eingangsdaten
followers0
owner_typeOrganization
is_verified
owner_loginaeshell
public_repos8
account_age_days5.106

Paketpflege

100Exzellent
Wie die Bewertung erfolgt
25/25Veröffentlicht & auflösbar — 8 Paket(e) auf maven
35/35Veröffentlichungsaktualität — letzte Veröffentlichung vor 12 Tagen
20/20Versionshistorie — 27 veröffentlichte Versionen
20/20Nicht veraltet — aktiv, nicht veraltet oder zurückgezogen
Verwendete Eingangsdaten
packagesorg.aesh:readline, org.aesh:readline-api, org.aesh:terminal-api, org.aesh:terminal-ssh, org.aesh:terminal-tty, org.aesh:terminal-http, org.aesh:terminal-detect, org.aesh:terminal-telnet
ecosystemsmaven
any_deprecatednein
min_days_since_publish12

Engineering-Qualität

Sind grundlegende Engineering- und Dokumentationspraktiken vorhanden?

64Mittel · 20 % des Gesamtindex
Wie die Bewertung erfolgt
24/24CI-Workflows — 3 Workflow(s)
24/24Tests vorhanden
0/16Linter-Konfiguration
0/9.6Pre-Commit-Hooks
6.4/6.4.editorconfig
20/20OpenSSF Scorecard: CI-Tests — 8 out of 8 merged PRs checked by a CI test -- score normalized to 10
Verwendete Eingangsdaten
has_cija
has_testsja
has_editorconfigja
has_linter_confignein
has_precommit_confignein
Wie die Bewertung erfolgt
30/30README
0/25Dokumentationsverzeichnis
0/15Dokumentations-/Homepage-Site
10/10Repository-Beschreibung
0/10Topics
10/10Wiki
Verwendete Eingangsdaten
topics
has_wikija
homepage
has_readmeja
has_docs_dirnein
has_descriptionja

Sicherheit

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

62Mittel · 16 % des Gesamtindex
Wie die Bewertung erfolgt
6.8/7.5Binary-Artifacts — binaries present in source code
0/7.5Branch-Protection — branch protection not enabled on development/release branches
2.5/2.5CI-Tests — 8 out of 8 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/14 approved changesets -- score normalized to 0
2.5/2.5Contributors — project has 7 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.5/2.5Lizenz — license file detected
7.5/7.5Maintained — 30 commit(s) and 28 issue activity found in the last 90 days -- score normalized to 10
5/5Packaging — packaging workflow detected
0/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
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 — keine Daten
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
7.5/7.5Vulnerabilities — 0 existing vulnerabilities detected
Verwendete Eingangsdaten
sourceopenssf_scorecard
checks_evaluated17
scorecard_versionv5.5.0
checks_inconclusive1
scorecard_aggregate5,3
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): signed_releases. 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_packages4
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 maven:org.aesh:readline@3.16.3 — das, was die Installation des veröffentlichten Pakets nach sich zieht — mit 4 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.

70Gut · 0 % des Gesamtindex
Wie die Bewertung erfolgt
45/45Agentenanweisungen — CLAUDE.md
0/15Maschinenlesbare Doku (llms.txt)
40/40Lesbare Commit-Historie — 55 von 60 menschlichen Commits benennen ihre Absicht (strukturierter Betreff oder erläuternder Text)
Verwendete Eingangsdaten
has_llms_txtnein
legible_history_share0,917
agent_instruction_filesCLAUDE.md
agent_instruction_max_bytes1.009
Wie die Bewertung erfolgt
18/18Bootstrap mit einem Befehl — terminal-tty/src/main/native/Makefile
22/22Automatisierte Tests
0/11Lint-/Format-Konfiguration
11/11Statische Typprüfung — Java (statisch typisiert)
0/10Reproduzierbare Umgebung
0/10Belegte Agentenpraxis — keine von Agenten verfassten Commits unter den letzten 100
8/8Automatisierte Wartung — 13 der letzten 100 Commits sind automatisierte Abhängigkeits-Updates
0/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
Verwendete Eingangsdaten
has_nixnein
has_testsja
lockfiles
has_dockerfilenein
typed_languageja
bootstrap_filesterminal-tty/src/main/native/Makefile
has_devcontainernein
has_linter_confignein
typecheck_configs
agent_commit_share0
toolchain_manifestsbenchmark/pom.xml, bom/pom.xml, examples/pom.xml, pom.xml, readline-api/pom.xml, readline/pom.xml, terminal-api/pom.xml, terminal-detect/pom.xml, terminal-http/pom.xml, terminal-ssh/pom.xml, terminal-telnet/pom.xml, terminal-tty/pom.xml
dependency_bot_commit_share0,13
Wie die Bewertung erfolgt
45/45Typprüfbarer Code — Java (statisch typisiert)
54.7/55Handhabbare Dateigrößen — 2/424 Quelldateien über 60 KB
Verwendete Eingangsdaten
primary_languageJava
largest_source_bytes68.343
source_files_sampled424
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

26GitHub-Sterne
12Mitwirkende
346Commits, letzte 12 Monate
4Tage seit letztem Push
18Releases
1Bus-Faktor
4offene Issues
MavenPaket-Ökosysteme

Warnungen zur Datenerhebung

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

Weitere Details

Stern- und Fork-Verlauf 0 ★ / 16 ⇿
0Sterne
16Forks
4Releases

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.

04812161622015-122021-012026-03
Major 0Minor 0Patch 0

Jeder Punkt umfasst 10 Tage.

OpenSSF Scorecard 5.3 / 10
5.3Gesamtwert

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-25 06:01 UTC

9Binary-Artifactsbinaries present in source code
0Branch-Protectionbranch protection not enabled on development/release branches
10CI-Tests8 out of 8 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/14 approved changesets -- score normalized to 0
10Contributorsproject has 7 contributing companies or organizations
10Dangerous-Workflowno dangerous workflow patterns detected
10Dependency-Update-Toolupdate tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
10Maintained30 commit(s) and 28 issue activity found in the last 90 days -- score normalized to 10
10Packagingpackaging workflow detected
0Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 0
0SASTSAST tool is not run on all commits -- score normalized to 0
0Security-Policysecurity policy file not detected
k. A.Signed-Releasesno releases found
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
10Vulnerabilities0 existing vulnerabilities detected
Direkte Abhängigkeiten 32
RegistryPaketVersionsvorgabeManifest
Mavenorg.aesh:terminal-detect${project.version}bom/pom.xml
Mavenorg.aesh:terminal-api${project.version}bom/pom.xml
Mavenorg.aesh:readline-api${project.version}bom/pom.xml
Mavenorg.aesh:terminal-tty${project.version}bom/pom.xml
Mavenorg.aesh:readline${project.version}bom/pom.xml
Mavenorg.aesh:terminal-ssh${project.version}bom/pom.xml
Mavenorg.aesh:terminal-telnet${project.version}bom/pom.xml
Mavenorg.aesh:terminal-http${project.version}bom/pom.xml
Mavenorg.aesh:terminal-api${project.version}readline-api/pom.xml
Mavenorg.aesh:terminal-api${project.version}readline/pom.xml
Mavenorg.aesh:readline-api${project.version}readline/pom.xml
Mavenorg.aesh:terminal-tty${project.version}readline/pom.xml
Mavenorg.aesh:terminal-detect${project.version}terminal-api/pom.xml
Mavenorg.aesh:terminal-api${project.version}terminal-http/pom.xml
Mavenio.netty:netty-common${netty.version}terminal-http/pom.xml
Mavenio.netty:netty-transport${netty.version}terminal-http/pom.xml
Mavenio.netty:netty-handler${netty.version}terminal-http/pom.xml
Mavenio.netty:netty-codec-http${netty.version}terminal-http/pom.xml
Mavencom.fasterxml.jackson.core:jackson-databind${jackson.version}terminal-http/pom.xml
Mavenio.netty:netty-common${netty.version}terminal-ssh/pom.xml
Mavenio.netty:netty-transport${netty.version}terminal-ssh/pom.xml
Mavenio.netty:netty-handler${netty.version}terminal-ssh/pom.xml
Mavencommons-logging:commons-logging1.4.0terminal-ssh/pom.xml
Mavenorg.apache.sshd:sshd-core${sshd-core.version}terminal-ssh/pom.xml
Mavenorg.apache.sshd:sshd-netty${sshd-core.version}terminal-ssh/pom.xml
Mavenorg.aesh:terminal-api${project.version}terminal-ssh/pom.xml
Mavenio.netty:netty-common${netty.version}terminal-telnet/pom.xml
Mavenio.netty:netty-transport${netty.version}terminal-telnet/pom.xml
Mavenio.netty:netty-handler${netty.version}terminal-telnet/pom.xml
Mavencommons-logging:commons-logging1.4.0terminal-telnet/pom.xml
Mavenorg.aesh:terminal-api${project.version}terminal-telnet/pom.xml
Mavenorg.aesh:terminal-api${project.version}terminal-tty/pom.xml
Alle Abhängigkeiten 50

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

RegistryPaketVersionBeziehung
Mavencom.fasterxml.jackson.core:jackson-databinddirekt
Mavencommons-logging:commons-logging1.4.0direkt
Mavenio.netty:netty-codec-httpdirekt
Mavenio.netty:netty-commondirekt
Mavenio.netty:netty-handlerdirekt
Mavenio.netty:netty-transportdirekt
Mavenorg.aesh:readline3.17-devdirekt
Mavenorg.aesh:readline-api3.17-devdirekt
Mavenorg.aesh:terminal-api3.17-devdirekt
Mavenorg.aesh:terminal-detect3.17-devdirekt
Mavenorg.aesh:terminal-http3.17-devdirekt
Mavenorg.aesh:terminal-ssh3.17-devdirekt
Mavenorg.aesh:terminal-telnet3.17-devdirekt
Mavenorg.aesh:terminal-tty3.17-devdirekt
Mavenorg.apache.sshd:sshd-core2.19.0direkt
Mavenorg.apache.sshd:sshd-netty2.19.0direkt
Mavencommons-net:commons-net3.13.0indirekt
Mavenjunit:junitindirekt
Mavenjunit:junit4.13.2indirekt
Mavennet.revelc.code.formatter:formatter-maven-pluginindirekt
Mavennet.revelc.code.formatter:formatter-maven-plugin2.29.0indirekt
Mavennet.revelc.code:impsort-maven-pluginindirekt
Mavennet.revelc.code:impsort-maven-plugin1.13.0indirekt
Mavenorg.apache.maven.plugins:maven-antrun-pluginindirekt
Mavenorg.apache.maven.plugins:maven-clean-plugin3.5.0indirekt
Mavenorg.apache.maven.plugins:maven-compiler-plugin1.37indirekt
Mavenorg.apache.maven.plugins:maven-compiler-plugin3.15.0indirekt
Mavenorg.apache.maven.plugins:maven-deploy-plugin3.1.4indirekt
Mavenorg.apache.maven.plugins:maven-enforcer-plugin3.6.3indirekt
Mavenorg.apache.maven.plugins:maven-gpg-pluginindirekt
Mavenorg.apache.maven.plugins:maven-gpg-plugin3.2.8indirekt
Mavenorg.apache.maven.plugins:maven-install-plugin3.1.4indirekt
Mavenorg.apache.maven.plugins:maven-jar-plugin3.5.0indirekt
Mavenorg.apache.maven.plugins:maven-javadoc-pluginindirekt
Mavenorg.apache.maven.plugins:maven-javadoc-plugin3.12.0indirekt
Mavenorg.apache.maven.plugins:maven-resources-plugin3.5.0indirekt
Mavenorg.apache.maven.plugins:maven-shade-pluginindirekt
Mavenorg.apache.maven.plugins:maven-shade-plugin3.6.2indirekt
Mavenorg.apache.maven.plugins:maven-site-plugin3.22.0indirekt
Mavenorg.apache.maven.plugins:maven-source-pluginindirekt
Mavenorg.apache.maven.plugins:maven-source-plugin3.4.0indirekt
Mavenorg.apache.maven.plugins:maven-surefire-plugin3.5.6indirekt
Mavenorg.apache.mina:mina-core2.2.9indirekt
Mavenorg.glassfish.tyrus.bundles:tyrus-standalone-clientindirekt
Mavenorg.graalvm.buildtools:native-maven-plugin1.1.5indirekt
Mavenorg.junit.platform:junit-platform-launcher1.14.4indirekt
Mavenorg.junit.vintage:junit-vintage-engine5.14.4indirekt
Mavenorg.openjdk.jmh:jmh-core1.37indirekt
Mavenorg.openjdk.jmh:jmh-generator-annprocess1.37indirekt
Mavenorg.sonatype.plugins:nexus-staging-maven-plugin1.7.0indirekt
Abhängigkeits-Advisories 0

Die Installation von maven:org.aesh:readline@3.16.3 zieht 4 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": [],
      "is_fork": false,
      "size_kb": 4504,
      "has_wiki": true,
      "homepage": null,
      "languages": {
        "C": 7489,
        "HTML": 7486,
        "Java": 2891443,
        "Makefile": 876
      },
      "pushed_at": "2026-07-20T09:45:25Z",
      "created_at": "2015-12-22T01:00:46Z",
      "owner_type": "Organization",
      "updated_at": "2026-07-20T09:45:43Z",
      "description": "Java Readline API",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "Apache-2.0",
      "default_branch": "master",
      "license_spdx_raw": "Apache-2.0",
      "primary_language": "Java",
      "significant_languages": [
        "Java"
      ]
    },
    "owner": {
      "blog": "http://aeshell.github.io",
      "name": "aeshell",
      "type": "Organization",
      "login": "aeshell",
      "company": null,
      "location": null,
      "followers": 0,
      "avatar_url": "https://avatars.githubusercontent.com/u/2073608?v=4",
      "created_at": "2012-07-31T21:08:32Z",
      "is_verified": null,
      "public_repos": 8,
      "account_age_days": 5106
    },
    "license": {
      "state": "standard",
      "spdx_id": "Apache-2.0",
      "raw_spdx": "Apache-2.0",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v3.16.3",
          "kind": "patch",
          "published_at": "2026-07-12T19:00:00Z"
        },
        {
          "tag": "v3.16.2",
          "kind": "patch",
          "published_at": "2026-06-29T20:48:57Z"
        },
        {
          "tag": "v3.16.1",
          "kind": "patch",
          "published_at": "2026-06-29T09:42:59Z"
        },
        {
          "tag": "v3.16",
          "kind": "other",
          "published_at": "2026-06-26T12:02:24Z"
        },
        {
          "tag": "v2.6.3",
          "kind": "patch",
          "published_at": "2026-06-22T19:52:41Z"
        },
        {
          "tag": "v3.15.1",
          "kind": "patch",
          "published_at": "2026-06-18T15:28:51Z"
        },
        {
          "tag": "v3.15",
          "kind": "other",
          "published_at": "2026-06-18T11:15:55Z"
        },
        {
          "tag": "v3.14.1",
          "kind": "patch",
          "published_at": "2026-06-11T13:16:40Z"
        },
        {
          "tag": "v3.14",
          "kind": "other",
          "published_at": "2026-06-10T12:36:02Z"
        },
        {
          "tag": "v3.12",
          "kind": "other",
          "published_at": "2026-06-05T11:12:48Z"
        },
        {
          "tag": "v3.11",
          "kind": "other",
          "published_at": "2026-06-04T10:51:25Z"
        },
        {
          "tag": "v3.8",
          "kind": "other",
          "published_at": "2026-05-22T08:18:34Z"
        },
        {
          "tag": "v3.7",
          "kind": "other",
          "published_at": "2026-05-11T14:49:42Z"
        },
        {
          "tag": "v3.6",
          "kind": "other",
          "published_at": "2026-04-28T10:35:52Z"
        },
        {
          "tag": "3.2",
          "kind": "other",
          "published_at": "2026-02-19T17:48:26Z"
        },
        {
          "tag": "3.0",
          "kind": "other",
          "published_at": "2026-02-06T13:43:54Z"
        },
        {
          "tag": "2.7",
          "kind": "other",
          "published_at": "2026-01-14T13:27:58Z"
        },
        {
          "tag": "2.2",
          "kind": "other",
          "published_at": "2022-08-05T12:36:14Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "7df67713ea0ac42ddf136cb71ced6276eca5de06",
          "body": "…ldtools-native-maven-plugin-1.1.5\n\nBump org.graalvm.buildtools:native-maven-plugin from 1.1.4 to 1.1.5",
          "is_bot": true,
          "headline": "Merge pull request #230 from aeshell/dependabot/maven/org.graalvm.bui…",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-20T09:45:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d275f8991d2d83d9367c0d830ecf589f78caa50b",
          "body": "Bumps [org.graalvm.buildtools:native-maven-plugin](https://github.com/graalvm/native-build-tools) from 1.1.4 to 1.1.5.\n- [Release notes](https://github.com/graalvm/native-build-tools/releases)\n- [Commits](https://github.com/graalvm/native-build-tools/compare/1.1.4...1.1.5)\n\n---\nupdated-dependencies:\n[…]\nlvm.buildtools:native-maven-plugin\n  dependency-version: 1.1.5\n  dependency-type: direct:development\n  update-type: version-update:semver-patch\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>",
          "is_bot": true,
          "headline": "Bump org.graalvm.buildtools:native-maven-plugin from 1.1.4 to 1.1.5",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-07-20T09:45:07Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "7f5e08c32e6be48c3effb5f685d7fc201eb6e2b1",
          "body": null,
          "is_bot": true,
          "headline": "Next version 3.17-dev",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-12T18:59:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e1eafbd66999330f807c184adabb806be056b893",
          "body": null,
          "is_bot": true,
          "headline": "Release 3.16.3",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-12T18:58:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "67e9bbbe596c9b9326ec8d029cdbf7f1302df7b2",
          "body": null,
          "is_bot": false,
          "headline": "updated sshd to 2.19.0",
          "author_name": "Ståle Pedersen",
          "author_login": "stalep",
          "committed_at": "2026-07-12T18:52:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4e0a3a0d3c52a23f63546dfc84d663a90203b4de",
          "body": "The version mismatch (vintage 5.12.2 + platform-launcher 1.14.4)\ncaused NoSuchMethodError on NamespacedHierarchicalStore.CloseAction.\nBoth must be from the same JUnit 5.x release. Verified working with\nnative-maven-plugin 1.1.3 on GraalVM 25.",
          "is_bot": false,
          "headline": "Align junit-vintage-engine to 5.14.4 matching platform-launcher 1.14.4",
          "author_name": "Ståle Pedersen",
          "author_login": "stalep",
          "committed_at": "2026-07-12T12:37:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "80ff98f4eebb83c91271894423f1c6e92b2c3825",
          "body": "Dependabot PR #223 merged junit-vintage-engine 6.1.1 after our\nignore rules were added, leaving master with an incompatible version.\nnative-maven-plugin 1.1.3 still does not support JUnit 6.x —\nthe native test runner crashes with UniqueId serialization errors.",
          "is_bot": false,
          "headline": "Revert junit-vintage-engine to 5.12.2 — 6.1.1 breaks native tests",
          "author_name": "Ståle Pedersen",
          "author_login": "stalep",
          "committed_at": "2026-07-12T12:02:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8dc0bd49c845d17a85fe27858a33f475e8ca24e6",
          "body": "…orm-junit-platform-launcher-1.14.4\n\nBump org.junit.platform:junit-platform-launcher from 1.12.2 to 1.14.4",
          "is_bot": true,
          "headline": "Merge pull request #229 from aeshell/dependabot/maven/org.junit.platf…",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-12T12:02:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "75bb221119f4017f3abc75773e0c5e51cf67c8dd",
          "body": "Bumps [org.junit.platform:junit-platform-launcher](https://github.com/junit-team/junit-framework) from 1.12.2 to 1.14.4.\n- [Release notes](https://github.com/junit-team/junit-framework/releases)\n- [Commits](https://github.com/junit-team/junit-framework/commits)\n\n---\nupdated-dependencies:\n- dependenc\n[…]\n.platform:junit-platform-launcher\n  dependency-version: 1.14.4\n  dependency-type: direct:development\n  update-type: version-update:semver-minor\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>",
          "is_bot": true,
          "headline": "Bump org.junit.platform:junit-platform-launcher from 1.12.2 to 1.14.4",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-07-12T12:01:55Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "3a0be8e98357416a21b9ab338c03fbf78da31e98",
          "body": "….2.16.Final\n\nBump netty.version from 4.2.15.Final to 4.2.16.Final",
          "is_bot": true,
          "headline": "Merge pull request #227 from aeshell/dependabot/maven/netty.version-4…",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-12T11:46:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "72a2bd11dc2373d0da65edec1c7b972986c868fb",
          "body": "Bumps `netty.version` from 4.2.15.Final to 4.2.16.Final.\n\nUpdates `io.netty:netty-common` from 4.2.15.Final to 4.2.16.Final\n- [Release notes](https://github.com/netty/netty/releases)\n- [Commits](https://github.com/netty/netty/compare/netty-4.2.15.Final...netty-4.2.16.Final)\n\nUpdates `io.netty:netty-\n[…]\nme: io.netty:netty-transport\n  dependency-version: 4.2.16.Final\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>",
          "is_bot": true,
          "headline": "Bump netty.version from 4.2.15.Final to 4.2.16.Final",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-07-12T11:46:08Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "7a3df8f1a7bb25b31dc2b6a79881ab713ef9ff64",
          "body": "…ldtools-native-maven-plugin-1.1.4\n\nBump org.graalvm.buildtools:native-maven-plugin from 1.1.3 to 1.1.4",
          "is_bot": true,
          "headline": "Merge pull request #228 from aeshell/dependabot/maven/org.graalvm.bui…",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-12T11:44:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c6f306f9c68ac5b6f86a4c61bd21022d67c67846",
          "body": "Bumps [org.graalvm.buildtools:native-maven-plugin](https://github.com/graalvm/native-build-tools) from 1.1.3 to 1.1.4.\n- [Release notes](https://github.com/graalvm/native-build-tools/releases)\n- [Commits](https://github.com/graalvm/native-build-tools/compare/1.1.3...1.1.4)\n\n---\nupdated-dependencies:\n[…]\nlvm.buildtools:native-maven-plugin\n  dependency-version: 1.1.4\n  dependency-type: direct:development\n  update-type: version-update:semver-patch\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>",
          "is_bot": true,
          "headline": "Bump org.graalvm.buildtools:native-maven-plugin from 1.1.3 to 1.1.4",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-07-12T11:43:53Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "945333afec8899f6009db6e705e020a5984f72d3",
          "body": "…ackson.core-jackson-databind-2.22.1\n\nBump com.fasterxml.jackson.core:jackson-databind from 2.22.0 to 2.22.1",
          "is_bot": true,
          "headline": "Merge pull request #225 from aeshell/dependabot/maven/com.fasterxml.j…",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-12T11:43:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a1c6deb99473ee5f4044ec306aace113953ffe51",
          "body": "Bumps [com.fasterxml.jackson.core:jackson-databind](https://github.com/FasterXML/jackson) from 2.22.0 to 2.22.1.\n- [Commits](https://github.com/FasterXML/jackson/commits)\n\n---\nupdated-dependencies:\n- dependency-name: com.fasterxml.jackson.core:jackson-databind\n  dependency-version: 2.22.1\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>",
          "is_bot": true,
          "headline": "Bump com.fasterxml.jackson.core:jackson-databind from 2.22.0 to 2.22.1",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-07-12T11:43:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "28581a0dc67030166cec16d0d686a7873b0bd4a6",
          "body": "On macOS with GNU coreutils installed (via Homebrew or Nix), the GNU\nstty takes precedence in PATH over the BSD /bin/stty. The GNU stty\ncannot perform certain operations on macOS's terminal subsystem,\ncausing 'unable to perform all requested operations' errors.\n\nHardcode /bin/stty and /usr/bin/tty on macOS — these are BSD system\nbinaries protected by SIP and always present.",
          "is_bot": false,
          "headline": "Hardcode /bin/stty on macOS to avoid GNU coreutils conflict (#224)",
          "author_name": "Ståle Pedersen",
          "author_login": "stalep",
          "committed_at": "2026-07-12T11:42:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "79f6e6aa4bbba30b89a2840fd820356c0520945d",
          "body": "JUnit 6.x (platform-launcher 6.x, vintage-engine 6.x) is incompatible\nwith native-maven-plugin 1.1.2 which bundles junit-platform-native\nbuilt against the JUnit 5.x UniqueId API. Dependabot keeps proposing\n6.x bumps that break native-image tests.\n\nAdd ignore rules in dependabot.yml for versions >= 6.0.0 and version\nconstraint comments in pom.xml. Closed PR #221.",
          "is_bot": false,
          "headline": "Ignore JUnit 6.x in Dependabot — incompatible with native-maven-plugin",
          "author_name": "Ståle Pedersen",
          "author_login": "stalep",
          "committed_at": "2026-07-12T11:42:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "46362a2f031f765f1116321b72b6d5c79893b7c8",
          "body": "…ge-junit-vintage-engine-6.1.1\n\nBump org.junit.vintage:junit-vintage-engine from 5.12.2 to 6.1.1",
          "is_bot": true,
          "headline": "Merge pull request #223 from aeshell/dependabot/maven/org.junit.vinta…",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-06T09:45:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3cc7bb9a167b6467c0610a98f60f0081e94f9158",
          "body": "Bumps [org.junit.vintage:junit-vintage-engine](https://github.com/junit-team/junit-framework) from 5.12.2 to 6.1.1.\n- [Release notes](https://github.com/junit-team/junit-framework/releases)\n- [Commits](https://github.com/junit-team/junit-framework/compare/r5.12.2...r6.1.1)\n\n---\nupdated-dependencies:\n[…]\njunit.vintage:junit-vintage-engine\n  dependency-version: 6.1.1\n  dependency-type: direct:development\n  update-type: version-update:semver-major\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>",
          "is_bot": true,
          "headline": "Bump org.junit.vintage:junit-vintage-engine from 5.12.2 to 6.1.1",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-07-06T09:45:03Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "5684f72693acb022d867d61e9901a422f62849f0",
          "body": null,
          "is_bot": true,
          "headline": "Next version 3.17-dev",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-06-29T20:48:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f7b19fafe0efc660e9592658b3229d70d48a6115",
          "body": null,
          "is_bot": true,
          "headline": "Release 3.16.2",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-06-29T20:47:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2782189093ed06d5870d1bc2c3acead9cd2b5645",
          "body": "Suppress FFM warning on Java 22+ by adding Enable-Native-Access:\nALL-UNNAMED to terminal-tty MANIFEST.MF. The JVM reads this from\nthe JAR manifest and grants native access automatically.\n\nAlso add --enable-native-access=ALL-UNNAMED to native-image.properties\nfor GraalVM native-image builds.\n\nNot add\n[…]\nes FFM class\ninit failures gracefully.\n\nAlso fix junit-vintage-engine version back to 5.12.2 in the native\nprofile (Dependabot bumped it to 6.1.1 which is incompatible with\nnative-maven-plugin 1.1.2).",
          "is_bot": false,
          "headline": "Add Enable-Native-Access manifest entry and native-image flag (#222)",
          "author_name": "Ståle Pedersen",
          "author_login": "stalep",
          "committed_at": "2026-06-29T19:46:38Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "1d8e230adc242933a04180f8902379defc8d1d99",
          "body": "…ldtools-native-maven-plugin-1.1.3\n\nBump org.graalvm.buildtools:native-maven-plugin from 1.1.2 to 1.1.3",
          "is_bot": true,
          "headline": "Merge pull request #220 from aeshell/dependabot/maven/org.graalvm.bui…",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-06-29T09:44:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8e4b3d141e4c830f283b7d4343992ee13875cc35",
          "body": "…ge-junit-vintage-engine-6.1.1\n\nBump org.junit.vintage:junit-vintage-engine from 5.12.2 to 6.1.1",
          "is_bot": true,
          "headline": "Merge pull request #219 from aeshell/dependabot/maven/org.junit.vinta…",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-06-29T09:44:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3d05055b380f39e39b4770412a51798d7871d383",
          "body": "Bumps [org.graalvm.buildtools:native-maven-plugin](https://github.com/graalvm/native-build-tools) from 1.1.2 to 1.1.3.\n- [Release notes](https://github.com/graalvm/native-build-tools/releases)\n- [Commits](https://github.com/graalvm/native-build-tools/compare/1.1.2...1.1.3)\n\n---\nupdated-dependencies:\n[…]\nlvm.buildtools:native-maven-plugin\n  dependency-version: 1.1.3\n  dependency-type: direct:development\n  update-type: version-update:semver-patch\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>",
          "is_bot": true,
          "headline": "Bump org.graalvm.buildtools:native-maven-plugin from 1.1.2 to 1.1.3",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-06-29T09:44:44Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "30ff85144885729e06c16085d4b44bc21c5fbd26",
          "body": "Bumps [org.junit.vintage:junit-vintage-engine](https://github.com/junit-team/junit-framework) from 5.12.2 to 6.1.1.\n- [Release notes](https://github.com/junit-team/junit-framework/releases)\n- [Commits](https://github.com/junit-team/junit-framework/compare/r5.12.2...r6.1.1)\n\n---\nupdated-dependencies:\n[…]\njunit.vintage:junit-vintage-engine\n  dependency-version: 6.1.1\n  dependency-type: direct:development\n  update-type: version-update:semver-major\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>",
          "is_bot": true,
          "headline": "Bump org.junit.vintage:junit-vintage-engine from 5.12.2 to 6.1.1",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-06-29T09:44:34Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "4a1e0b8d4205ed7e9e5104207395da52df66a4a5",
          "body": null,
          "is_bot": true,
          "headline": "Next version 3.17-dev",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-06-29T09:42:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "54d8142ed085b7fe51710e734aa27811bf4ad93f",
          "body": null,
          "is_bot": true,
          "headline": "Release 3.16.1",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-06-29T09:41:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f57de93cd7affef997a35b928ddaff25c1d40dd1",
          "body": "…spath\n\nGraalVM native-image consumes native-image.properties at build time\nand does not embed it as a classpath resource. Changed the test to\nread from target/classes on disk instead of getResourceAsStream(),\nwhich works in both JVM and native-image test runs.",
          "is_bot": false,
          "headline": "Fix ArtifactVerificationTest in native-image: read from disk not clas…",
          "author_name": "Ståle Pedersen",
          "author_login": "stalep",
          "committed_at": "2026-06-29T09:22:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "69f4c9ecfc1f53906b507afdc796c42279ce14aa",
          "body": "Replace MrjarBytecodeVersionTest with ArtifactVerificationTest (9 tests):\n- No Java 22+ bytecode in base path (#211)\n- native-image.properties exists with --initialize-at-run-time (#218)\n- native-image.properties does NOT contain ServiceLoaderFeatureExclude (#209)\n- ServiceLoader services file lists\n[…]\nge from the packaged\n  JARs (not target/classes), compiles NativeImageVerify separately,\n  and runs it. This tests what external consumers like Quarkus see —\n  the released artifact with MRJAR intact.",
          "is_bot": false,
          "headline": "Add comprehensive artifact verification guards (#209, #211, #218)",
          "author_name": "Ståle Pedersen",
          "author_login": "stalep",
          "committed_at": "2026-06-29T08:56:13Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "842198d0891b5438f6d7b3e95fcbaba7a0700e03",
          "body": "WinSysTerminal's static fields eagerly called WinConsoleNative.getStdHandle()\nwhich fails on non-Windows platforms when GraalVM initializes the class at\nbuild time. The FFM WinConsoleNative (from MRJAR versions/22/) leaves its\nMethodHandle fields null on non-Windows, causing NPE.\n\nTwo fixes applied:\n[…]\n\n2. Move handle fields to a lazy inner class (Handles) so loading\n   WinSysTerminal no longer triggers Windows API calls. The handles\n   are only initialized when the terminal is actually constructed.",
          "is_bot": false,
          "headline": "Fix native-image build failure on Linux for WinSysTerminal (#218)",
          "author_name": "Ståle Pedersen",
          "author_login": "stalep",
          "committed_at": "2026-06-29T08:25:46Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f7faf719203e465889c749779a4fbf6169ee4750",
          "body": null,
          "is_bot": false,
          "headline": "3.17-dev next dev cycle",
          "author_name": "Ståle Pedersen",
          "author_login": "stalep",
          "committed_at": "2026-06-29T08:11:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4f52d1fc0aa324b802fc9cf7db5a98d12b21486a",
          "body": null,
          "is_bot": true,
          "headline": "Next version 3.16-dev",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-06-26T12:02:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "409048baf333d5973a9f9487842859754c56daf4",
          "body": null,
          "is_bot": true,
          "headline": "Release 3.16",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-06-26T12:01:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "767f023fd955f89db2c332f7763e0fa85aa07d25",
          "body": "…lugin 1.1.2\n\nDependabot bumped junit-vintage-engine and junit-platform-launcher\nto 6.1.0, but native-maven-plugin 1.1.2 uses junit-platform-native\nwhich is not compatible with JUnit 6.x. The native test runner crashes\nwith UniqueId serialization errors during test discovery.\n\nRevert to JUnit 5.12.2 / 1.12.2 (latest 5.x) for the native profile.\nThe regular test runs still use JUnit 4 via junit:junit:4.13.2.",
          "is_bot": false,
          "headline": "Revert JUnit 6.x in native profile — incompatible with native-maven-p…",
          "author_name": "Ståle Pedersen",
          "author_login": "stalep",
          "committed_at": "2026-06-25T12:56:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b9646e5d91d42befc33e76c8233c785eb0f5fcdf",
          "body": "Bumps [org.junit.platform:junit-platform-launcher](https://github.com/junit-team/junit-framework) from 1.11.4 to 6.1.0.\n- [Release notes](https://github.com/junit-team/junit-framework/releases)\n- [Commits](https://github.com/junit-team/junit-framework/commits/r6.1.0)\n\n---\nupdated-dependencies:\n- dep\n[…]\nt.platform:junit-platform-launcher\n  dependency-version: 6.1.0\n  dependency-type: direct:development\n  update-type: version-update:semver-major\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>",
          "is_bot": true,
          "headline": "Bump org.junit.platform:junit-platform-launcher from 1.11.4 to 6.1.0",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-06-22T21:16:46Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "9523869b5ef815f49fec0def05482eb18c346aa0",
          "body": "Bumps [org.junit.vintage:junit-vintage-engine](https://github.com/junit-team/junit-framework) from 5.11.4 to 6.1.0.\n- [Release notes](https://github.com/junit-team/junit-framework/releases)\n- [Commits](https://github.com/junit-team/junit-framework/compare/r5.11.4...r6.1.0)\n\n---\nupdated-dependencies:\n[…]\njunit.vintage:junit-vintage-engine\n  dependency-version: 6.1.0\n  dependency-type: direct:development\n  update-type: version-update:semver-major\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>",
          "is_bot": true,
          "headline": "Bump org.junit.vintage:junit-vintage-engine from 5.11.4 to 6.1.0",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-06-22T21:16:29Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "0673ca285f1e27d504bdcd077c910f88574dec79",
          "body": "Add optional 'branch' input to workflow_dispatch. When specified,\nthe workflow checks out that branch instead of the default. This\nenables maintenance releases from branches like aesh-2.6 without\nduplicating the workflow.",
          "is_bot": false,
          "headline": "Allow release workflow to run from any branch",
          "author_name": "Ståle Pedersen",
          "author_login": "stalep",
          "committed_at": "2026-06-22T15:06:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e399a01f8575ec813d3ae1218b13e4d1a8bb9ac1",
          "body": "…-commons-logging-1.4.0\n\nBump commons-logging:commons-logging from 1.3.6 to 1.4.0",
          "is_bot": true,
          "headline": "Merge pull request #215 from aeshell/dependabot/maven/commons-logging…",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-06-22T09:46:07Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e5cb194cab026bfc4297ced28e49eaa0678d004f",
          "body": "…-mina-core-2.2.9\n\nBump org.apache.mina:mina-core from 2.2.8 to 2.2.9",
          "is_bot": true,
          "headline": "Merge pull request #214 from aeshell/dependabot/maven/org.apache.mina…",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-06-22T09:44:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a26b70d397567c73726879c8304e62730614920f",
          "body": "Bumps [commons-logging:commons-logging](https://github.com/apache/commons-logging) from 1.3.6 to 1.4.0.\n- [Changelog](https://github.com/apache/commons-logging/blob/master/RELEASE-NOTES.txt)\n- [Commits](https://github.com/apache/commons-logging/compare/rel/commons-logging-1.3.6...rel/commons-logging\n[…]\nme: commons-logging:commons-logging\n  dependency-version: 1.4.0\n  dependency-type: direct:production\n  update-type: version-update:semver-minor\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>",
          "is_bot": true,
          "headline": "Bump commons-logging:commons-logging from 1.3.6 to 1.4.0",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-06-22T09:44:51Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "8157f33e599d777402fe4ca1174b81ac438994d9",
          "body": "Bumps [org.apache.mina:mina-core](https://github.com/apache/mina) from 2.2.8 to 2.2.9.\n- [Commits](https://github.com/apache/mina/compare/2.2.8...2.2.9)\n\n---\nupdated-dependencies:\n- dependency-name: org.apache.mina:mina-core\n  dependency-version: 2.2.9\n  dependency-type: direct:development\n  update-type: version-update:semver-patch\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>",
          "is_bot": true,
          "headline": "Bump org.apache.mina:mina-core from 2.2.8 to 2.2.9",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-06-22T09:44:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "673ea72d7347dbb12d340176b2c30b9f442c75ef",
          "body": "…s/checkout-7\n\nBump actions/checkout from 6 to 7",
          "is_bot": true,
          "headline": "Merge pull request #212 from aeshell/dependabot/github_actions/action…",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-06-22T09:44:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "96110836b88a8bb3e9d860874162fd9225eff39d",
          "body": "Bumps [actions/checkout](https://github.com/actions/checkout) from 6 to 7.\n- [Release notes](https://github.com/actions/checkout/releases)\n- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/actions/checkout/compare/v6...v7)\n\n---\nupdated-dependenc\n[…]\n:\n- dependency-name: actions/checkout\n  dependency-version: '7'\n  dependency-type: direct:production\n  update-type: version-update:semver-major\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>",
          "is_bot": true,
          "headline": "Bump actions/checkout from 6 to 7",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-06-22T09:44:32Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "7dc2775c2e6d60e0d52f3fd9ecd7c402f292a406",
          "body": null,
          "is_bot": true,
          "headline": "Next version 3.16-dev",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-06-18T15:28:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "57467d7ab9b252136268080862411f4f7dccd694",
          "body": null,
          "is_bot": true,
          "headline": "Release 3.15.1",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-06-18T15:27:37Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4d62521d9bbe2d0ba19705d63bba357ffed4de99",
          "body": "The java22-ffm profile's copy-mrjar-for-test step was copying Java 22\nbytecode into target/classes, which gets packaged into the released\nJAR. This breaks JDK 8-17 users with UnsupportedClassVersionError.\n\nGuards to prevent recurrence:\n- MrjarBytecodeVersionTest: scans target/classes for any .class \n[…]\nwith the exact\n  class name and version if contamination is detected.\n- CI mrjar-verify job: builds with JDK 25 (activates java22-ffm\n  profile) then runs verify to catch contamination before release.",
          "is_bot": false,
          "headline": "Fix MRJAR bytecode contamination and add guards (#211)",
          "author_name": "Ståle Pedersen",
          "author_login": "stalep",
          "committed_at": "2026-06-18T15:21:15Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "4de8451597b396b8cfe734169c0d117ff0e88073",
          "body": null,
          "is_bot": true,
          "headline": "Next version 3.16-dev",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-06-18T11:15:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "52bf026eae650801f4a1a01edfef437db19cda43",
          "body": null,
          "is_bot": true,
          "headline": "Release 3.15",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-06-18T11:14:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3897987fc067925eca17938fd0b7ceda786a2d56",
          "body": "The copy-mrjar-for-native step now deletes FfmPty, LibC,\nPosixConstants, and WinConsoleNative from target/classes before\nnative-image compilation. This prevents FFM downcall warnings and\nArena.ofShared() errors in GraalVM native images.\n\nPreviously, the java22-ffm test profile copied these classes f\n[…]\n takes over.\n\nRemoved --enable-native-access=ALL-UNNAMED from native-maven-plugin\nbuildArgs — no longer needed without FFM classes in the image.\n\nLong-term FFM support in native-image tracked in #206.",
          "is_bot": false,
          "headline": "Exclude all FFM classes from native-image build (#210)",
          "author_name": "Ståle Pedersen",
          "author_login": "stalep",
          "committed_at": "2026-06-18T10:58:08Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "9f439c2015230db4b58b54ed0f6d54f918768418",
          "body": null,
          "is_bot": false,
          "headline": "Fix all javadoc warnings across modules",
          "author_name": "Ståle Pedersen",
          "author_login": "stalep",
          "committed_at": "2026-06-18T10:13:22Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "052890022242071d1d2a1ea2abc5030a2b0ff0c2",
          "body": "…e, HttpTtyConnection\n\nSSH (28 new tests):\n- NettySshTtyTest: runs 13 standard TtyTestBase tests over SSH transport\n  (write, read, signals, resize, close, terminal type, etc.)\n- SSHAttributesBuilderTest: 6 tests covering all PtyMode-to-Attributes\n  mappings (control chars, local/input/output flags,\n[…]\nith device capabilities\n  (type, colorDepth, features, userAgent), resize action, read action,\n  invalid JSON handling, unknown action, terminal type handler,\n  default device type and feature queries",
          "is_bot": false,
          "headline": "Add test coverage for SSH TtyTestBase, SSHAttributesBuilder, SSHDevic…",
          "author_name": "Ståle Pedersen",
          "author_login": "stalep",
          "committed_at": "2026-06-18T09:50:24Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "50bb32f0f5d681250862b228a8fa3c03b3aef526",
          "body": "HTTP tests:\n- NettyWebsocketTtyBootstrap: store EventLoopGroup, fix stop() deadlock\n  that blocked Netty I/O threads, shutdown group on stop\n- Dynamic port allocation instead of hardcoded 8080\n- Add 10s timeouts to WebSocket handshake and read operations\n\nTelnet tests (80s -> 0.6s):\n- TelnetServerRu\n[…]\nify server factory pattern (inline into TelnetServerRule)\n\nSSH:\n- NettySshTtyBootstrap: store parentGroup, shutdown both groups on stop\n\nTestBase:\n- Reduce await() timeout from 2 minutes to 30 seconds",
          "is_bot": false,
          "headline": "Fix test hangs and reduce test time from 1:48 to 24s",
          "author_name": "Ståle Pedersen",
          "author_login": "stalep",
          "committed_at": "2026-06-18T09:26:42Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "666cab9aa4cf85c7cd18569a5f169b6370198ada",
          "body": "The copy-mrjar-for-native step was overwriting the JNI WinConsoleNative\nwith the FFM version. GraalVM native-image cannot execute FFM downcalls\nwithout registered descriptors, causing MissingForeignRegistrationError\nat runtime. Exclude WinConsoleNative.class from the MRJAR copy so the\nJNI base versi\n[…]\n-config.json and aesh-console.dll).\n\nAlso catch Throwable (not just IOException) in TerminalBuilder as a\nsafety net so any future provider Error falls through to the next\nprovider instead of crashing.",
          "is_bot": false,
          "headline": "Keep JNI WinConsoleNative for native-image on Windows",
          "author_name": "Ståle Pedersen",
          "author_login": "stalep",
          "committed_at": "2026-06-18T08:40:47Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "001894d3ed261e132345e48daab3917312a24ef8",
          "body": "GraalVM native-image throws MissingForeignRegistrationError (an Error,\nnot Exception) when FFM downcall descriptors are not registered. The\n@Before guard now catches Throwable and does a probe call to detect\nthis at setup time, skipping tests gracefully instead of failing.",
          "is_bot": false,
          "headline": "Fix WinConsoleNativeTest in GraalVM native-image on Windows",
          "author_name": "Ståle Pedersen",
          "author_login": "stalep",
          "committed_at": "2026-06-18T08:30:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e1268abbbce2f6611f88c93ee27369a7290afeae",
          "body": "The test pushed two chars sequentially and expected read() to return\nboth in a single call. But read() uses take() (blocking) for the first\nchar then poll() (non-blocking) for subsequent chars — on slow CI the\nread thread could wake and poll before the second char was pushed.\n\nSplit into two deterministic parts:\n1. Pre-load queue then read — tests drain behavior (no race)\n2. Read on empty queue, verify block, push one char — tests blocking",
          "is_bot": false,
          "headline": "Fix flaky InputReaderTest.testBlockingRead on Windows CI",
          "author_name": "Ståle Pedersen",
          "author_login": "stalep",
          "committed_at": "2026-06-18T07:54:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3fd8b21c98003c45ed6fa750cc33204662674747",
          "body": "The native-image.properties ServiceLoaderFeatureExcludeServiceProviders\nflag intended to exclude only FfmTerminalProvider was excluding ALL\nTerminalProvider implementations, causing TerminalBuilder to fall back\nto ExternalTerminal (no raw mode, no readline).\n\nRemove native-image.properties entirely.\n[…]\nider which creates PosixSysTerminal.\n\nVerified working on GraalVM CE 23, 24, and 25.\n\nAlso add --enable-native-access=ALL-UNNAMED to native-maven-plugin\nbuildArgs and clean up ShellExample formatting.",
          "is_bot": false,
          "headline": "Fix native-image: remove broken ServiceLoader exclusion (#209)",
          "author_name": "Ståle Pedersen",
          "author_login": "stalep",
          "committed_at": "2026-06-18T07:39:44Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "26525930b279dba29be510d89e28d24827fa5d8d",
          "body": "When closing while the poll-based read loop is active, the\nSharedArena.close() fails with IllegalStateException because\nnbPollfd/nbReadBuf MemorySegments are still in use by an\nin-flight poll() call.\n\nFix: retry arena.close() up to 5 times with 50ms delays to\ngive the poll loop time to notice the closed flag and return.\nAfter retries, log at FINE level and continue (the arena will\nbe collected by GC eventually).",
          "is_bot": false,
          "headline": "Fix FfmPty.close() arena still in use from active poll()",
          "author_name": "Ståle Pedersen",
          "author_login": "stalep",
          "committed_at": "2026-06-17T20:55:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ecc6fff320b3d26c67edb60652d5576fbbcd61ef",
          "body": "Run scripts:\n- Add --enable-native-access=ALL-UNNAMED for Java 22+ to suppress\n  FFM restricted method warnings on Java 25+\n- Detect Java version automatically\n\nTerminalBuilder:\n- Catch ServiceConfigurationError during provider iteration so\n  unavailable providers (e.g., FfmTerminalProvider excluded in\n  native-image) are skipped instead of crashing\n\nresource-config.json:\n- Include META-INF/services/* in native-image resources so\n  ServiceLoader can discover terminal providers at runtime",
          "is_bot": false,
          "headline": "Fix native-image ServiceLoader and FFM native-access warnings",
          "author_name": "Ståle Pedersen",
          "author_login": "stalep",
          "committed_at": "2026-06-17T20:35:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a966746fd2635e86fc45eefd456e4704dd77dbfd",
          "body": "The FFM downcall throws MissingForeignRegistrationError (an Error,\nnot RuntimeException) when the downcall descriptor is not registered\nin reachability-metadata.json. The previous fix caught RuntimeException\nwhich didn't cover this case.\n\nThe underlying issue is that FFM downcall descriptors for Windows\nconsole functions are not registered (#206). Until that's done,\nthe test must tolerate the MissingForeignRegistrationError.",
          "is_bot": false,
          "headline": "Fix Windows native-image test: catch Throwable not RuntimeException",
          "author_name": "Ståle Pedersen",
          "author_login": "stalep",
          "committed_at": "2026-06-17T19:55:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6ff4e903aba8958705fb71038e295aae26e755b9",
          "body": "Cleanup:\n- ReadlineRequest: import Supplier, use short name (was 3x FQN)\n- Prompt: import ArrayList, use short names for List/ArrayList in\n  PromptBuilder (was inline FQN)\n\nTests:\n- PromptSupplierTest (7 tests): supplier returns prompt, supplier\n  takes precedence over static, null supplier fallback, no supplier\n  uses static, supplier called each time, multi-line prompt supplier\n\nFix:\n- ReadlineRequest.build() validation: allow prompt to be null when\n  promptSupplier is set (was requiring both)",
          "is_bot": false,
          "headline": "Clean up FQNs and add promptSupplier tests",
          "author_name": "Ståle Pedersen",
          "author_login": "stalep",
          "committed_at": "2026-06-17T18:41:37Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0919023a8d16f8c23e5e3ecaf81262ce15754b41",
          "body": "testSetConsoleModeGracefulOnInvalidHandle failed on Windows\nGraalVM native-image because FFM calls with invalid handles\nmay throw RuntimeException instead of returning an error code.\n\nThe test now catches RuntimeException as an acceptable outcome\nin native-image, while still asserting false on JVM mode.",
          "is_bot": false,
          "headline": "Fix Windows native-image test: handle FFM exception on invalid handle",
          "author_name": "Ståle Pedersen",
          "author_login": "stalep",
          "committed_at": "2026-06-17T18:30:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "de2b31a83dc7e016ee356ae202fae1d2755c08df",
          "body": "Support for a Supplier<Prompt> that provides the prompt dynamically\nat the start of each readline cycle. This enables prompts that change\nbetween invocations — for example, showing command execution time,\ngit branch, or environment status.\n\nIf both prompt and promptSupplier are set, the supplier tak\n[…]\ncially with the\nmulti-line PromptLine design from #208).\n\nThis provides the aesh-readline building block for aesh #528\n(starship-style command duration in prompt) and general dynamic\nprompt use cases.",
          "is_bot": false,
          "headline": "Add promptSupplier to ReadlineRequest for dynamic prompts",
          "author_name": "Ståle Pedersen",
          "author_login": "stalep",
          "committed_at": "2026-06-17T18:24:51Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "13f10cffa65c97ee3a4527c9d16193513e234610",
          "body": "Add support for prompts that span multiple lines, where contextual\ninformation is on upper lines and the input cursor is on the last line.\n\nExample:\n  myapp on main via ☕ v21\n  ❯ user types here_\n\nPrompt changes (readline-api):\n- Prompt(String) detects \\n and splits into lines, with per-line\n  ANSI \n[…]\nuffer's promptLength() returns last-line\nlength, so all cursor math (syncCursor, line wrapping, etc.) works\nunchanged. The extra prompt lines are handled only in display-row\ncalculations.\n\nCloses #208",
          "is_bot": false,
          "headline": "Support multi-line prompts (starship/powerlevel10k style) (#208)",
          "author_name": "Ståle Pedersen",
          "author_login": "stalep",
          "committed_at": "2026-06-17T18:01:56Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "1f10d90c03d409733a17c8be0350c7459911bff2",
          "body": "Replace testAttributesMatchExecPty and testSizeMatchesExecPty (which\ncompared FFM against ExecPty and required both to be available) with\nself-contained tests:\n\n- testAttributesSanity: verifies FFM attributes have sane defaults\n  (control chars set, flags non-empty, character size present)\n- testSiz\n[…]\np in CI (surefire-forked JVM under script couldn't run ExecPty).\n\nResult with TTY: 10/10 tests pass (was 8/10 with 2 skipped)\nResult without TTY: 1/10 pass, 9 skip (class loading only)\n\nAddresses #207",
          "is_bot": false,
          "headline": "Remove ExecPty dependency from FFM tests (#207)",
          "author_name": "Ståle Pedersen",
          "author_login": "stalep",
          "committed_at": "2026-06-17T16:56:38Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "4fbfdf855c8c85ac7f51e7d789210c0cd137276c",
          "body": "Use 'script -qefc ... /dev/null' to provide a PTY for the Maven\nbuild process. This allows FFM tests that require a TTY (FfmPty\nterminal I/O tests) to run in CI on JDK 25.\n\nWithout script: 1/10 FFM tests run (class loading only)\nWith script: 8/10 FFM tests run (terminal I/O exercised)\n\nThe 2 remaining skipped tests (testAttributesMatchExecPty,\ntestSizeMatchesExecPty) require ExecPty which isn't available\nin the surefire-forked JVM under script.\n\nAddresses #207",
          "is_bot": false,
          "headline": "CI: Wrap Linux build with script for TTY-dependent tests",
          "author_name": "Ståle Pedersen",
          "author_login": "stalep",
          "committed_at": "2026-06-16T07:37:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9cd0e196b9c32eea4ad40308dec6a8ea604ce9a3",
          "body": "Maven surefire runs tests from target/classes (exploded directory),\nnot from the packaged JAR. MRJAR class resolution only works with\nJAR files, so FfmPty and other Java 22+ classes were not found by\nClass.forName() during tests, causing all FFM tests to skip.\n\nFix: add an antrun copy step in the ja\n[…]\nable on the\nregular test classpath.\n\nResult:\n- Without TTY: 1 FFM test runs (class loading), 9 skip (need TTY)\n- With TTY (script command): 8 FFM tests run, 2 skip (ExecPty comparison)\n\nAddresses #207",
          "is_bot": false,
          "headline": "Copy MRJAR classes for test execution on JDK 22+ (#207)",
          "author_name": "Ståle Pedersen",
          "author_login": "stalep",
          "committed_at": "2026-06-16T07:34:51Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "e253a447c407b0ade4ce62398107451b317314f1",
          "body": "Build and windows-test jobs now run on both JDK 17 (JNI path) and\nJDK 25 (FFM path) using Temurin. This validates both code paths\nwith a standard JDK distribution.\n\nNative-image jobs (Linux + Windows) use GraalVM 25 for\nnative-image compilation validation.\n\nCI matrix:\n- build: Ubuntu, Temurin JDK 17 + 25\n- native-test: Ubuntu, GraalVM 25\n- native-test-windows: Windows, GraalVM 25\n- windows-test: Windows, Temurin JDK 17 + 25",
          "is_bot": false,
          "headline": "CI: Add JDK 17+25 Temurin matrix and Windows native-image job",
          "author_name": "Ståle Pedersen",
          "author_login": "stalep",
          "committed_at": "2026-06-16T07:25:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "921cb1d57e9a460d61c59b3f9ec3334688083241",
          "body": "Adds native-test-windows job that validates GraalVM native-image\ncompilation on Windows with Java 25 (FFM). This ensures the FFM\nWinConsoleNative, WinSysTerminal, and AbstractWindowsTerminal\nchain compiles into native-image correctly.\n\nMirrors the existing native-test job (Linux) with the same\nGraalVM 25 setup and native-maven-plugin configuration.",
          "is_bot": false,
          "headline": "Add Windows GraalVM native-image CI job",
          "author_name": "Ståle Pedersen",
          "author_login": "stalep",
          "committed_at": "2026-06-15T17:48:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9f6992b96dea752cfc948cdce7b1e286bd52d1c0",
          "body": null,
          "is_bot": false,
          "headline": "[#204] Add GraalVM native-image test job to CI",
          "author_name": "Tristan Tarrant",
          "author_login": "tristantarrant",
          "committed_at": "2026-06-15T17:21:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "44340ddf53311ccba24f2815d82162b531529de1",
          "body": "- Remove FfmPty and LibC from reflect-config.json to prevent GraalVM\n  from analyzing FFM bytecode that cannot be compiled to native-image\n- Add native-image.properties to exclude FfmTerminalProvider from\n  ServiceLoader in native-image\n- Add native Maven profile with native-maven-plugin for GraalVM\n  metadata validation\n- Add native-image skip guards to tests that assume surefire environment",
          "is_bot": false,
          "headline": "[#204] Fix GraalVM native-image compatibility for FFM classes",
          "author_name": "Tristan Tarrant",
          "author_login": "tristantarrant",
          "committed_at": "2026-06-15T17:21:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "55075425a7c2658648777983ddebb1f2c84e772f",
          "body": "New aesh-readline-bom module for consistent version management\nacross all aesh-readline modules. Users can import it in their\ndependencyManagement section to avoid specifying versions on\neach dependency.\n\nIncludes: terminal-detect, terminal-api, readline-api,\nterminal-tty, readline, terminal-ssh, terminal-telnet,\nterminal-http.\n\nUpdated README with BOM usage instructions.",
          "is_bot": false,
          "headline": "Add BOM (Bill of Materials) module",
          "author_name": "Ståle Pedersen",
          "author_login": "stalep",
          "committed_at": "2026-06-15T07:20:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "82c707a2bafbe4d3266dcd45de9ef172efa8731c",
          "body": null,
          "is_bot": true,
          "headline": "Next version 3.15-dev",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-06-11T13:16:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1e9ddfecb8aff92fbbc72139e2c65895ae63e5da",
          "body": null,
          "is_bot": true,
          "headline": "Release 3.14.1",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-06-11T13:15:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e6c9bb868f2d2ca1e8319436aceeaf435b311046",
          "body": "FFM WinConsoleNative (Java 22+):\n- Add OS guard to static initializer — skip kernel32 library\n  lookup on non-Windows platforms. Sets all MethodHandle fields\n  to null (never called on non-Windows).\n- Prevents ExceptionInInitializerError when the class is loaded\n  during GraalVM native-image builds \n[…]\ne in the build\n- Preserved existing entries: sun.misc.Signal,\n  sun.misc.SignalHandler, java.io.Console\n\nThe JNI WinConsoleNative (Java 8-21) already has the OS guard\nfrom a previous fix.\n\nCloses #203",
          "is_bot": false,
          "headline": "Guard WinConsoleNative FFM init and update GraalVM reflect-config (#203)",
          "author_name": "Ståle Pedersen",
          "author_login": "stalep",
          "committed_at": "2026-06-11T13:10:05Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "64cfef3a2dcf4b6c8a442d615fb8c6981f883dca",
          "body": "3a. Minimum size auto-suspend:\n  - handleResize() checks if terminal is too small for split\n    (below MIN_REGION_HEIGHT * 2 + 1 rows)\n  - Auto-suspends the split and auto-resumes when terminal\n    grows back to valid size\n  - autoSuspended flag distinguishes from manual suspend()\n\n3c. Shutdown hook\n[…]\nlose()\n\n3d. Synchronized close:\n  - close() acquires renderLock to prevent race with concurrent\n    top region writes\n  - Sets closed=true inside the lock so writeToTopRegion() sees\n    it immediately",
          "is_bot": false,
          "headline": "Split screen Phase 3: edge cases and hardening (#202)",
          "author_name": "Ståle Pedersen",
          "author_login": "stalep",
          "committed_at": "2026-06-11T13:10:05Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "84622bd6ca85ffea86b32114d2afd7e83fe7c3fb",
          "body": "Resize handling:\n- Wire SplitScreenImpl.handleResize() into SIGWINCH handler\n- Fix calculateLayout() to use full terminal size (not region-\n  constrained size from connection.size())\n- Synchronize resize redraw with renderLock\n- Position cursor in bottom region after resize\n\nprintAbove routing:\n- Te\n[…]\nion during split screen mode\n\nSplitScreenExample updated:\n- Added tab completion (log, clear, above, exit, help)\n- Added 'above' command to test printAbove routing to top region\n- Added 'help' command",
          "is_bot": false,
          "headline": "Split screen Phase 2: readline integration (#202)",
          "author_name": "Ståle Pedersen",
          "author_login": "stalep",
          "committed_at": "2026-06-11T13:10:05Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "996321aa7ce6d0dda859447de6e411d593a10079",
          "body": null,
          "is_bot": false,
          "headline": "Add Maven dependency instructions to Getting Started section",
          "author_name": "Ståle Pedersen",
          "author_login": "stalep",
          "committed_at": "2026-06-11T13:10:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "24393984755cf756b2f1b53e7d03e269dc728475",
          "body": null,
          "is_bot": false,
          "headline": "Add Maven dependency instructions to Getting Started section",
          "author_name": "Ståle Pedersen",
          "author_login": "stalep",
          "committed_at": "2026-06-10T16:01:07Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2f2fd632bbda225a7a59ac33cc7c8003612cc6c3",
          "body": "Added sections for:\n- Async Output: printAbove, status lines, split screen\n- Terminal Features: focus tracking, non-blocking input,\n  terminal provider SPI\n- Updated Core Readline: fuzzy search, right prompt,\n  ghost text, history ignore patterns\n- Fixed import path in Getting Started example",
          "is_bot": false,
          "headline": "Update README with new features for 3.13",
          "author_name": "Ståle Pedersen",
          "author_login": "stalep",
          "committed_at": "2026-06-10T15:58:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "43b399ab50b0aa3032cf65217c33a0ed38a7776e",
          "body": null,
          "is_bot": true,
          "headline": "Next version 3.15-dev",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-06-10T12:35:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e29eeb059eaa5ff97fb49a28bb4b8b2f6a171ac0",
          "body": null,
          "is_bot": true,
          "headline": "Release 3.14",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-06-10T12:34:37Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "478f6ca96701e6d6bd485ffe0338497e28493199",
          "body": "#1 StatusLine rendering restored in Readline:\n  - printAboveImpl now renders status lines between text and prompt\n  - start() renders status lines on initial prompt draw\n  - Empty text with status lines triggers redraw (not early return)\n\n#2 Connection.write() region routing:\n  - TerminalConnection \n[…]\ns max (was constant 1ms burning CPU)\n\n#13 Added PromptAnsiTest (9 tests):\n  - Verifies getLength() returns visible length with ANSI codes\n  - Tests plain, ANSI, empty, null, multi-code, copy scenarios",
          "is_bot": false,
          "headline": "Code review fixes for release readiness",
          "author_name": "Ståle Pedersen",
          "author_login": "stalep",
          "committed_at": "2026-06-10T12:14:20Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "6e77ebaa071d29ddf59a16329bcf5ed2cfeb4605",
          "body": "ScrollbackBufferTest (12 tests):\n- Empty buffer, add/retrieve, fewer/more than stored\n- Circular overflow, multiple overflows\n- Clear, clear after overflow\n- Capacity one, exact capacity, zero request\n- Thread safety with 4 concurrent writers\n\nSplitScreenTest (9 tests):\n- MIN_REGION_HEIGHT constant\n- ScreenRegion interface contract (size, writeln)\n- Scrollback buffer feeding visible lines\n- Split ratio calculations: standard, half, small terminal,\n  too small (validation), extreme ratios",
          "is_bot": false,
          "headline": "Add tests for ScrollbackBuffer and SplitScreen (#202)",
          "author_name": "Ståle Pedersen",
          "author_login": "stalep",
          "committed_at": "2026-06-10T10:02:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "beb87ee0c26fac63dfbdfccf294dc135ef6bead0",
          "body": "Experimental feature: split the terminal into independently scrolling\nregions using a hybrid approach — cursor addressing for the top region,\nDECSTBM scroll region for the bottom (readline) area.\n\nAPI (terminal-api):\n- ScreenRegion interface: write(), writeln(), size(), clear(), close()\n- SplitScree\n[…]\non size when split is active\n- close() cleans up split screen\n\nSplitScreenExample: simulated log output in top region with readline\nprompt in bottom region. Commands: log, clear, exit.\n\nAddresses #202",
          "is_bot": false,
          "headline": "Add split-screen mode with independent scrolling regions (#202)",
          "author_name": "Ståle Pedersen",
          "author_login": "stalep",
          "committed_at": "2026-06-10T09:56:03Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "eae4b1c5a69bbe47ccefe7fa74f17a51be21e827",
          "body": "Add Connection.registerStatusLine(int priority) returning a StatusLine\nwith setMessage(String) and close(). Status lines are displayed between\nscrolling output and the readline prompt, persisting across printAbove()\ncalls.\n\nStatusLine interface (terminal-api):\n- setMessage(String): update content (s\n[…]\nrintAbove(), and\nreadline prompt. Commands: status, build, clear, exit.\n\nAlso fix PrintAboveExample Ctrl+C: remove connection.close() from\nsignal handler (Readline handles INT itself).\n\nAddresses #201",
          "is_bot": false,
          "headline": "Add StatusLine for persistent status display above prompt (#201)",
          "author_name": "Ståle Pedersen",
          "author_login": "stalep",
          "committed_at": "2026-06-10T08:05:25Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "a65ed87c602ebc83ee7f3d34e66047d9f5b025b5",
          "body": "Prompt(String) now auto-detects ANSI escape codes in the prompt string\nand calculates the visible length correctly. Previously, passing a\nstring like \"\\033[32m>\\033[0m \" counted all 11 characters (including\ninvisible escape codes) as the prompt length instead of just the 2\nvisible characters. This c\n[…]\nhen ANSI codes are detected, the stripped text is stored for length\ncalculation and the full ANSI string is stored for display, matching\nthe behavior of the two-arg Prompt(String, String) constructor.",
          "is_bot": false,
          "headline": "Fix Prompt length calculation with embedded ANSI codes",
          "author_name": "Ståle Pedersen",
          "author_login": "stalep",
          "committed_at": "2026-06-10T08:04:59Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "3c039345c086854432da0bc3d3bd626938ae7a32",
          "body": "Add Connection.printAbove(String) to print text above the current\nprompt without disrupting the user's input or cursor position.\nThread-safe — can be called from any thread while readline is active.\n\nAPI (terminal-api):\n- Connection.printAbove(String): prints text above prompt when\n  readline is act\n[…]\nle calls, empty buffer, and\ncross-session behavior.\n\nPrintAboveExample: background thread prints timestamped notifications\nevery 3 seconds while user types. Commands: start/stop/msg/exit.\n\nCloses #189",
          "is_bot": false,
          "headline": "Add printAbove() for printing text above the prompt (#189)",
          "author_name": "Ståle Pedersen",
          "author_login": "stalep",
          "committed_at": "2026-06-10T06:04:14Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "71bf907d526a2169501c9ce10b14908e2abc6d28",
          "body": "TtyDetect.tryNativeIsatty() loads the POSIX LibC class via reflection.\nOn Windows, LibC's static initializer throws ExceptionInInitializerError\n(an Error, not Exception) because POSIX symbols don't exist. The\ncatch(Exception) didn't catch it, causing a crash at startup.\nFix: catch Throwable to fall \n[…]\no they are discovered\nby the run/run.bat scripts (which glob for *Example.class):\n- FuzzySearchDemo -> FuzzySearchExample\n- RightPromptDemo -> RightPromptExample\n- ShellExampleTty -> ShellLocalExample",
          "is_bot": false,
          "headline": "Fix TtyDetect crash on Windows, rename examples for consistency",
          "author_name": "Ståle Pedersen",
          "author_login": "stalep",
          "committed_at": "2026-06-09T21:55:58Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c017169264857222ed7f151365243230934cdec0",
          "body": "The examples/run and examples/run.bat scripts were missing\nreadline-api and terminal-detect from the classpath, causing\nNoClassDefFoundError at runtime for classes like Prompt\nand TerminalDetector.",
          "is_bot": false,
          "headline": "Add missing readline-api and terminal-detect jars to run scripts",
          "author_name": "Ståle Pedersen",
          "author_login": "stalep",
          "committed_at": "2026-06-09T21:55:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e37385844f4dbe27919c3193affb00340ceb1950",
          "body": "Add non-blocking read/peek support to the terminal input path for\nescape sequence timeout disambiguation, clean shutdown, and future\nfeatures like printAbove().\n\n=== API (terminal-api) ===\n\nTerminal: READ_EXPIRED constant, supportsNonBlockingRead(),\n  read(timeout), peek(timeout), read(b,off,len,tim\n[…]\n byte 8 to 127 (DEL), but Key.BACKSPACE on Windows was {8}.\n\n=== Tests ===\n\n- ActionDecoderEscapeTimeoutTest: 14 tests\n- NonBlockingApiTest: 8 tests\n- WinConsoleNativeTest: 4 new tests\n\nAddresses #198",
          "is_bot": false,
          "headline": "Non-blocking input: peek, poll-based read loop, Windows fixes (#198)",
          "author_name": "Ståle Pedersen",
          "author_login": "stalep",
          "committed_at": "2026-06-09T21:55:11Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "692910ef4997fb6c5b717c0b29588a03c7fd1cb8",
          "body": "ShellExample Task.run() sets conn.setSignalHandler(this) for Ctrl+C\nhandling but did not set a stdin handler. When Readline finishes, it\nrestores the previous stdin handler (null), which triggers\nTerminalConnection.suspend() — blocking the reader thread. With no\nbytes being read, Ctrl+C (byte 3) nev\n[…]\nandler, so the no-op handler is correct.\n\nAlso pass through command-line arguments in examples/run and\nexamples/run.bat so examples that accept arguments (e.g.,\nSyncImageDemoExample) can receive them.",
          "is_bot": false,
          "headline": "Fix Ctrl+C not interrupting commands in ShellExample",
          "author_name": "Ståle Pedersen",
          "author_login": "stalep",
          "committed_at": "2026-06-09T10:53:26Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "0485f0fb20ed99f7d945c115401d239b213d9a70",
          "body": "Add a ServiceLoader-based SPI for terminal implementations, replacing\nthe hardcoded OS detection chain in TerminalBuilder.\n\nTerminalProvider interface (terminal-api):\n- name(), isSupported(), priority(), createTerminal()\n- Providers discovered via ServiceLoader, sorted by priority (highest\n  first),\n[…]\nsmall file + 4 trivial constructor\ncalls. GraalVM native-image friendly.\n\n11 tests covering ServiceLoader discovery, provider names, priorities,\nplatform filtering, and priority ordering.\n\nCloses #194",
          "is_bot": false,
          "headline": "Terminal provider SPI for pluggable terminal implementations (#194)",
          "author_name": "Ståle Pedersen",
          "author_login": "stalep",
          "committed_at": "2026-06-09T07:40:37Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "de37ad3095c5842c89f27a4296341d7d851509a7",
          "body": "DeleteChar, DeletePrevChar, and DeleteCharOrList were adding deleted\ncharacters to the paste manager, which triggered OSC 52 clipboard\nwrites on every backspace/delete press. This caused visible clipboard\nnotifications on terminals like Ghostty.\n\nIn GNU readline, backward-delete-char and delete-char\n[…]\n\nsingle-character delete actions. The undo stack is still updated.\n\nKill-ring operations that correctly use addText() are unchanged:\nCopyLine, ChangeAction, KillRegion, UnixFilenameRubout.\n\nFixes #199",
          "is_bot": false,
          "headline": "Fix single-char deletes writing to system clipboard (#199)",
          "author_name": "Ståle Pedersen",
          "author_login": "stalep",
          "committed_at": "2026-06-08T19:34:20Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "95f272c247150ed0e9f75844eedac1a746677e95",
          "body": "Display a right-aligned prompt on the prompt line that automatically\ndisappears when the input grows too long and reappears when shortened.\n\nChanges:\n- Prompt: added rightPrompt field, getter/setter, copy constructor\n  support, and PromptBuilder.rightPrompt() method\n- ConsoleBuffer: added renderRigh\n[…]\nests covering: Prompt builder, copy, getter/setter, readline\nintegration, buffer independence, and combined fields.\n\nIncludes RightPromptDemo example showing current time as right prompt.\n\nCloses #188",
          "is_bot": false,
          "headline": "Add right prompt support (#188)",
          "author_name": "Ståle Pedersen",
          "author_login": "stalep",
          "committed_at": "2026-06-08T19:22:48Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b127e0b9dfd3ae8f93193696e67ae9efb31d8329",
          "body": "EventDecoder now intercepts the QUIT control character (default: 28,\nCtrl+\\) and dispatches Signal.QUIT to the signal handler, alongside\nthe existing INT, EOF, and SUSP signals.\n\nThe VQUIT value is read from terminal attributes when available,\ndefaulting to 28 (Ctrl+\\).\n\nAdded 10 tests covering all four signals (INT, QUIT, EOF, SUSP),\nsignals in middle of input, multiple signals, no handler passthrough,\ncustom VQUIT from attributes, and regular input.\n\nCloses #197",
          "is_bot": false,
          "headline": "Add QUIT signal (Ctrl+\\) handling in EventDecoder (#197)",
          "author_name": "Ståle Pedersen",
          "author_login": "stalep",
          "committed_at": "2026-06-08T15:26:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ef5b138d04d1056910225515887cb8a207b70b79",
          "body": "When synchronized output (Mode 2026) is active and the connection is\nclosed without sending ESU (CSI ? 2026 l), the terminal stays in\nsynchronized mode and buffers all subsequent output indefinitely.\nThis caused a visible delay (up to 14 seconds) on Ctrl+D exit.\n\nFixes in two places:\n- Readline.fini\n[…]\n and focus\n  tracking disable as part of cleanup, ensuring clean terminal state\n  even when Readline is not used\n\nAlso fixed FocusTrackingExample Ctrl+C handling and removed\nRuntime.halt() workaround.",
          "is_bot": false,
          "headline": "Fix Ctrl+D delay: send ESU before closing connection",
          "author_name": "Ståle Pedersen",
          "author_login": "stalep",
          "committed_at": "2026-06-08T15:02:52Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "64eb659a37e390c9aad56bda50db862c9c74437f",
          "body": "Interactive example that enables focus tracking and shows colored\nstatus messages when the terminal gains or loses focus.\n\nNote: requires 'set -g focus-events on' in tmux.conf for tmux.\n\nAlso fixed:\n- Ctrl+C no longer causes IOException (removed initial signal handler\n  that closed the connection before Readline could finish)\n- FfmPty.close() uses TCSANOW instead of TCSAFLUSH for immediate\n  terminal attribute restore (eliminates delay on Ctrl+D exit)",
          "is_bot": false,
          "headline": "Add FocusTrackingExample demonstrating terminal focus events",
          "author_name": "Ståle Pedersen",
          "author_login": "stalep",
          "committed_at": "2026-06-08T12:30:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "36bdc1dc8144a04696db2b68b230188611e5f4a1",
          "body": "Terminal focus tracking detects when the terminal window gains or\nloses focus via ESC [ I (focus in) and ESC [ O (focus out) sequences.\n\nChanges:\n- EventDecoder: new focusHandler field + filterFocusEvents() method\n  that intercepts focus sequences and dispatches to the handler\n- Connection: new setF\n[…]\n variant\n\n9 tests covering: focus in/out events, filtering from input stream,\nno handler passthrough, handler removal, other CSI not affected,\nincomplete sequences, multiple rapid events.\n\nCloses #192",
          "is_bot": false,
          "headline": "Add focus tracking support (#192)",
          "author_name": "Ståle Pedersen",
          "author_login": "stalep",
          "committed_at": "2026-06-08T12:09:57Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "5c170d97abf871af0c0d9e26c14c3dc5baacfe08",
          "body": "Commands matching ignore patterns are silently excluded from history.\nPatterns support simple wildcards:\n- ' *' — commands starting with a space (private commands)\n- '*password*' — commands containing a keyword\n- 'exit' — exact match\n- 'sudo *' — commands starting with a prefix\n- '*.tmp' — commands \n[…]\nore() before\nadding entries. FileHistory inherits this behavior.\n\n8 tests covering: space prefix, keyword, exact match, multiple\npatterns, no patterns, clear patterns, wildcard start/end.\n\nCloses #191",
          "is_bot": false,
          "headline": "Add history ignore patterns (#191)",
          "author_name": "Ståle Pedersen",
          "author_login": "stalep",
          "committed_at": "2026-06-08T11:17:44Z",
          "body_truncated": true,
          "is_coding_agent": false
        }
      ],
      "releases_count": 18,
      "commits_last_year": 346,
      "latest_release_at": "2026-07-12T19:00:00Z",
      "latest_release_tag": "v3.16.3",
      "releases_from_tags": false,
      "days_since_last_push": 4,
      "active_weeks_last_year": 26,
      "days_since_latest_release": 12,
      "mean_days_between_releases": 4.1
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": false,
      "health_percentage": 37,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": false
    },
    "ecosystem": {
      "packages": [
        {
          "name": "org.aesh:readline",
          "exists": true,
          "license": "Apache License, Version 2.0",
          "keywords": [],
          "ecosystem": "maven",
          "matches_repo": true,
          "registry_url": "https://central.sonatype.com/artifact/org.aesh/readline",
          "is_deprecated": false,
          "latest_version": "3.16.3",
          "repository_url": "https://github.com/aeshell/aesh-readline/tree/master",
          "versions_count": 27,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": null,
          "first_published_at": null,
          "latest_published_at": "2026-07-13T01:33:17Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 12
        },
        {
          "name": "org.aesh:readline-api",
          "exists": true,
          "license": null,
          "keywords": [],
          "ecosystem": "maven",
          "matches_repo": null,
          "registry_url": "https://central.sonatype.com/artifact/org.aesh/readline-api",
          "is_deprecated": false,
          "latest_version": "3.16.3",
          "repository_url": null,
          "versions_count": 13,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": null,
          "first_published_at": null,
          "latest_published_at": "2026-07-13T01:33:21Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 12
        },
        {
          "name": "org.aesh:terminal-api",
          "exists": true,
          "license": "Apache License, Version 2.0",
          "keywords": [],
          "ecosystem": "maven",
          "matches_repo": true,
          "registry_url": "https://central.sonatype.com/artifact/org.aesh/terminal-api",
          "is_deprecated": false,
          "latest_version": "3.16.3",
          "repository_url": "https://github.com/aeshell/aesh-readline/tree/master",
          "versions_count": 27,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": null,
          "first_published_at": null,
          "latest_published_at": "2026-07-13T01:33:20Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 12
        },
        {
          "name": "org.aesh:terminal-ssh",
          "exists": true,
          "license": "Apache License, Version 2.0",
          "keywords": [],
          "ecosystem": "maven",
          "matches_repo": true,
          "registry_url": "https://central.sonatype.com/artifact/org.aesh/terminal-ssh",
          "is_deprecated": false,
          "latest_version": "3.16.3",
          "repository_url": "https://github.com/aeshell/aesh-readline/tree/master",
          "versions_count": 27,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": null,
          "first_published_at": null,
          "latest_published_at": "2026-07-13T01:33:20Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 12
        },
        {
          "name": "org.aesh:terminal-tty",
          "exists": true,
          "license": "Apache License, Version 2.0",
          "keywords": [],
          "ecosystem": "maven",
          "matches_repo": true,
          "registry_url": "https://central.sonatype.com/artifact/org.aesh/terminal-tty",
          "is_deprecated": false,
          "latest_version": "3.16.3",
          "repository_url": "https://github.com/aeshell/aesh-readline/tree/master",
          "versions_count": 20,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": null,
          "first_published_at": null,
          "latest_published_at": "2026-07-13T01:33:21Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 12
        },
        {
          "name": "org.aesh:terminal-http",
          "exists": true,
          "license": "Apache License, Version 2.0",
          "keywords": [],
          "ecosystem": "maven",
          "matches_repo": true,
          "registry_url": "https://central.sonatype.com/artifact/org.aesh/terminal-http",
          "is_deprecated": false,
          "latest_version": "3.16.3",
          "repository_url": "https://github.com/aeshell/aesh-readline/tree/master",
          "versions_count": 27,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": null,
          "first_published_at": null,
          "latest_published_at": "2026-07-13T01:33:19Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 12
        },
        {
          "name": "org.aesh:terminal-detect",
          "exists": true,
          "license": "Apache License, Version 2.0",
          "keywords": [],
          "ecosystem": "maven",
          "matches_repo": true,
          "registry_url": "https://central.sonatype.com/artifact/org.aesh/terminal-detect",
          "is_deprecated": false,
          "latest_version": "3.16.3",
          "repository_url": "https://github.com/aeshell/aesh-readline/tree/master",
          "versions_count": 12,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": null,
          "first_published_at": null,
          "latest_published_at": "2026-07-13T01:33:20Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 12
        },
        {
          "name": "org.aesh:terminal-telnet",
          "exists": true,
          "license": "Apache License, Version 2.0",
          "keywords": [],
          "ecosystem": "maven",
          "matches_repo": true,
          "registry_url": "https://central.sonatype.com/artifact/org.aesh/terminal-telnet",
          "is_deprecated": false,
          "latest_version": "3.16.3",
          "repository_url": "https://github.com/aeshell/aesh-readline/tree/master",
          "versions_count": 27,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": null,
          "first_published_at": null,
          "latest_published_at": "2026-07-13T01:33:21Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 12
        }
      ]
    },
    "popularity": {
      "forks": 16,
      "stars": 26,
      "watchers": 3,
      "fork_history": {
        "days": [
          {
            "date": "2015-12-24",
            "count": 1
          },
          {
            "date": "2016-12-15",
            "count": 1
          },
          {
            "date": "2016-12-22",
            "count": 1
          },
          {
            "date": "2017-01-03",
            "count": 1
          },
          {
            "date": "2017-03-02",
            "count": 1
          },
          {
            "date": "2017-11-02",
            "count": 1
          },
          {
            "date": "2018-02-13",
            "count": 1
          },
          {
            "date": "2018-02-14",
            "count": 1
          },
          {
            "date": "2018-05-30",
            "count": 1
          },
          {
            "date": "2018-06-01",
            "count": 1
          },
          {
            "date": "2018-06-15",
            "count": 1
          },
          {
            "date": "2020-05-15",
            "count": 1
          },
          {
            "date": "2021-12-07",
            "count": 1
          },
          {
            "date": "2022-12-20",
            "count": 1
          },
          {
            "date": "2024-03-30",
            "count": 1
          },
          {
            "date": "2026-03-09",
            "count": 1
          }
        ],
        "complete": true,
        "collected": 16,
        "total_forks": 16
      },
      "star_history": null,
      "open_issues_and_prs": 5
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [
        "example",
        "examples"
      ],
      "has_llms_txt": false,
      "has_dockerfile": false,
      "has_mcp_signal": false,
      "bootstrap_files": [
        "terminal-tty/src/main/native/Makefile"
      ],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [],
      "toolchain_manifests": [
        "benchmark/pom.xml",
        "bom/pom.xml",
        "examples/pom.xml",
        "pom.xml",
        "readline-api/pom.xml",
        "readline/pom.xml",
        "terminal-api/pom.xml",
        "terminal-detect/pom.xml",
        "terminal-http/pom.xml",
        "terminal-ssh/pom.xml",
        "terminal-telnet/pom.xml",
        "terminal-tty/pom.xml"
      ],
      "largest_source_bytes": 68343,
      "source_files_sampled": 424,
      "oversized_source_files": 2,
      "agent_instruction_files": [
        "CLAUDE.md"
      ],
      "agent_instruction_max_bytes": 1009
    },
    "dependencies": {
      "manifests": [
        "benchmark/pom.xml",
        "bom/pom.xml",
        "examples/pom.xml",
        "pom.xml",
        "readline-api/pom.xml",
        "readline/pom.xml",
        "terminal-api/pom.xml",
        "terminal-detect/pom.xml",
        "terminal-http/pom.xml",
        "terminal-ssh/pom.xml",
        "terminal-telnet/pom.xml",
        "terminal-tty/pom.xml"
      ],
      "advisories": {
        "error": null,
        "scope": "published_package",
        "source": "osv",
        "findings": [],
        "collected": true,
        "malicious": [],
        "truncated": false,
        "by_severity": {},
        "advisory_count": 0,
        "affected_count": 0,
        "assessed_count": 4,
        "malicious_count": 0,
        "assessed_package": "maven:org.aesh:readline@3.16.3",
        "unassessed_count": 0,
        "direct_affected_count": 0
      },
      "ecosystems": [
        "maven"
      ],
      "dependencies": [
        {
          "name": "org.aesh:terminal-detect",
          "manifest": "bom/pom.xml",
          "ecosystem": "maven",
          "version_constraint": "${project.version}"
        },
        {
          "name": "org.aesh:terminal-api",
          "manifest": "bom/pom.xml",
          "ecosystem": "maven",
          "version_constraint": "${project.version}"
        },
        {
          "name": "org.aesh:readline-api",
          "manifest": "bom/pom.xml",
          "ecosystem": "maven",
          "version_constraint": "${project.version}"
        },
        {
          "name": "org.aesh:terminal-tty",
          "manifest": "bom/pom.xml",
          "ecosystem": "maven",
          "version_constraint": "${project.version}"
        },
        {
          "name": "org.aesh:readline",
          "manifest": "bom/pom.xml",
          "ecosystem": "maven",
          "version_constraint": "${project.version}"
        },
        {
          "name": "org.aesh:terminal-ssh",
          "manifest": "bom/pom.xml",
          "ecosystem": "maven",
          "version_constraint": "${project.version}"
        },
        {
          "name": "org.aesh:terminal-telnet",
          "manifest": "bom/pom.xml",
          "ecosystem": "maven",
          "version_constraint": "${project.version}"
        },
        {
          "name": "org.aesh:terminal-http",
          "manifest": "bom/pom.xml",
          "ecosystem": "maven",
          "version_constraint": "${project.version}"
        },
        {
          "name": "org.aesh:terminal-api",
          "manifest": "readline-api/pom.xml",
          "ecosystem": "maven",
          "version_constraint": "${project.version}"
        },
        {
          "name": "org.aesh:terminal-api",
          "manifest": "readline/pom.xml",
          "ecosystem": "maven",
          "version_constraint": "${project.version}"
        },
        {
          "name": "org.aesh:readline-api",
          "manifest": "readline/pom.xml",
          "ecosystem": "maven",
          "version_constraint": "${project.version}"
        },
        {
          "name": "org.aesh:terminal-tty",
          "manifest": "readline/pom.xml",
          "ecosystem": "maven",
          "version_constraint": "${project.version}"
        },
        {
          "name": "org.aesh:terminal-detect",
          "manifest": "terminal-api/pom.xml",
          "ecosystem": "maven",
          "version_constraint": "${project.version}"
        },
        {
          "name": "org.aesh:terminal-api",
          "manifest": "terminal-http/pom.xml",
          "ecosystem": "maven",
          "version_constraint": "${project.version}"
        },
        {
          "name": "io.netty:netty-common",
          "manifest": "terminal-http/pom.xml",
          "ecosystem": "maven",
          "version_constraint": "${netty.version}"
        },
        {
          "name": "io.netty:netty-transport",
          "manifest": "terminal-http/pom.xml",
          "ecosystem": "maven",
          "version_constraint": "${netty.version}"
        },
        {
          "name": "io.netty:netty-handler",
          "manifest": "terminal-http/pom.xml",
          "ecosystem": "maven",
          "version_constraint": "${netty.version}"
        },
        {
          "name": "io.netty:netty-codec-http",
          "manifest": "terminal-http/pom.xml",
          "ecosystem": "maven",
          "version_constraint": "${netty.version}"
        },
        {
          "name": "com.fasterxml.jackson.core:jackson-databind",
          "manifest": "terminal-http/pom.xml",
          "ecosystem": "maven",
          "version_constraint": "${jackson.version}"
        },
        {
          "name": "io.netty:netty-common",
          "manifest": "terminal-ssh/pom.xml",
          "ecosystem": "maven",
          "version_constraint": "${netty.version}"
        },
        {
          "name": "io.netty:netty-transport",
          "manifest": "terminal-ssh/pom.xml",
          "ecosystem": "maven",
          "version_constraint": "${netty.version}"
        },
        {
          "name": "io.netty:netty-handler",
          "manifest": "terminal-ssh/pom.xml",
          "ecosystem": "maven",
          "version_constraint": "${netty.version}"
        },
        {
          "name": "commons-logging:commons-logging",
          "manifest": "terminal-ssh/pom.xml",
          "ecosystem": "maven",
          "version_constraint": "1.4.0"
        },
        {
          "name": "org.apache.sshd:sshd-core",
          "manifest": "terminal-ssh/pom.xml",
          "ecosystem": "maven",
          "version_constraint": "${sshd-core.version}"
        },
        {
          "name": "org.apache.sshd:sshd-netty",
          "manifest": "terminal-ssh/pom.xml",
          "ecosystem": "maven",
          "version_constraint": "${sshd-core.version}"
        },
        {
          "name": "org.aesh:terminal-api",
          "manifest": "terminal-ssh/pom.xml",
          "ecosystem": "maven",
          "version_constraint": "${project.version}"
        },
        {
          "name": "io.netty:netty-common",
          "manifest": "terminal-telnet/pom.xml",
          "ecosystem": "maven",
          "version_constraint": "${netty.version}"
        },
        {
          "name": "io.netty:netty-transport",
          "manifest": "terminal-telnet/pom.xml",
          "ecosystem": "maven",
          "version_constraint": "${netty.version}"
        },
        {
          "name": "io.netty:netty-handler",
          "manifest": "terminal-telnet/pom.xml",
          "ecosystem": "maven",
          "version_constraint": "${netty.version}"
        },
        {
          "name": "commons-logging:commons-logging",
          "manifest": "terminal-telnet/pom.xml",
          "ecosystem": "maven",
          "version_constraint": "1.4.0"
        },
        {
          "name": "org.aesh:terminal-api",
          "manifest": "terminal-telnet/pom.xml",
          "ecosystem": "maven",
          "version_constraint": "${project.version}"
        },
        {
          "name": "org.aesh:terminal-api",
          "manifest": "terminal-tty/pom.xml",
          "ecosystem": "maven",
          "version_constraint": "${project.version}"
        }
      ],
      "all_dependencies": {
        "error": null,
        "source": "github-sbom",
        "packages": [
          {
            "name": "com.fasterxml.jackson.core:jackson-databind",
            "direct": true,
            "version": null,
            "ecosystem": "maven"
          },
          {
            "name": "commons-logging:commons-logging",
            "direct": true,
            "version": "1.4.0",
            "ecosystem": "maven"
          },
          {
            "name": "io.netty:netty-codec-http",
            "direct": true,
            "version": null,
            "ecosystem": "maven"
          },
          {
            "name": "io.netty:netty-common",
            "direct": true,
            "version": null,
            "ecosystem": "maven"
          },
          {
            "name": "io.netty:netty-handler",
            "direct": true,
            "version": null,
            "ecosystem": "maven"
          },
          {
            "name": "io.netty:netty-transport",
            "direct": true,
            "version": null,
            "ecosystem": "maven"
          },
          {
            "name": "org.aesh:readline",
            "direct": true,
            "version": "3.17-dev",
            "ecosystem": "maven"
          },
          {
            "name": "org.aesh:readline-api",
            "direct": true,
            "version": "3.17-dev",
            "ecosystem": "maven"
          },
          {
            "name": "org.aesh:terminal-api",
            "direct": true,
            "version": "3.17-dev",
            "ecosystem": "maven"
          },
          {
            "name": "org.aesh:terminal-detect",
            "direct": true,
            "version": "3.17-dev",
            "ecosystem": "maven"
          },
          {
            "name": "org.aesh:terminal-http",
            "direct": true,
            "version": "3.17-dev",
            "ecosystem": "maven"
          },
          {
            "name": "org.aesh:terminal-ssh",
            "direct": true,
            "version": "3.17-dev",
            "ecosystem": "maven"
          },
          {
            "name": "org.aesh:terminal-telnet",
            "direct": true,
            "version": "3.17-dev",
            "ecosystem": "maven"
          },
          {
            "name": "org.aesh:terminal-tty",
            "direct": true,
            "version": "3.17-dev",
            "ecosystem": "maven"
          },
          {
            "name": "org.apache.sshd:sshd-core",
            "direct": true,
            "version": "2.19.0",
            "ecosystem": "maven"
          },
          {
            "name": "org.apache.sshd:sshd-netty",
            "direct": true,
            "version": "2.19.0",
            "ecosystem": "maven"
          },
          {
            "name": "commons-net:commons-net",
            "direct": false,
            "version": "3.13.0",
            "ecosystem": "maven"
          },
          {
            "name": "junit:junit",
            "direct": false,
            "version": null,
            "ecosystem": "maven"
          },
          {
            "name": "junit:junit",
            "direct": false,
            "version": "4.13.2",
            "ecosystem": "maven"
          },
          {
            "name": "net.revelc.code.formatter:formatter-maven-plugin",
            "direct": false,
            "version": null,
            "ecosystem": "maven"
          },
          {
            "name": "net.revelc.code.formatter:formatter-maven-plugin",
            "direct": false,
            "version": "2.29.0",
            "ecosystem": "maven"
          },
          {
            "name": "net.revelc.code:impsort-maven-plugin",
            "direct": false,
            "version": null,
            "ecosystem": "maven"
          },
          {
            "name": "net.revelc.code:impsort-maven-plugin",
            "direct": false,
            "version": "1.13.0",
            "ecosystem": "maven"
          },
          {
            "name": "org.apache.maven.plugins:maven-antrun-plugin",
            "direct": false,
            "version": null,
            "ecosystem": "maven"
          },
          {
            "name": "org.apache.maven.plugins:maven-clean-plugin",
            "direct": false,
            "version": "3.5.0",
            "ecosystem": "maven"
          },
          {
            "name": "org.apache.maven.plugins:maven-compiler-plugin",
            "direct": false,
            "version": "1.37",
            "ecosystem": "maven"
          },
          {
            "name": "org.apache.maven.plugins:maven-compiler-plugin",
            "direct": false,
            "version": "3.15.0",
            "ecosystem": "maven"
          },
          {
            "name": "org.apache.maven.plugins:maven-deploy-plugin",
            "direct": false,
            "version": "3.1.4",
            "ecosystem": "maven"
          },
          {
            "name": "org.apache.maven.plugins:maven-enforcer-plugin",
            "direct": false,
            "version": "3.6.3",
            "ecosystem": "maven"
          },
          {
            "name": "org.apache.maven.plugins:maven-gpg-plugin",
            "direct": false,
            "version": null,
            "ecosystem": "maven"
          },
          {
            "name": "org.apache.maven.plugins:maven-gpg-plugin",
            "direct": false,
            "version": "3.2.8",
            "ecosystem": "maven"
          },
          {
            "name": "org.apache.maven.plugins:maven-install-plugin",
            "direct": false,
            "version": "3.1.4",
            "ecosystem": "maven"
          },
          {
            "name": "org.apache.maven.plugins:maven-jar-plugin",
            "direct": false,
            "version": "3.5.0",
            "ecosystem": "maven"
          },
          {
            "name": "org.apache.maven.plugins:maven-javadoc-plugin",
            "direct": false,
            "version": null,
            "ecosystem": "maven"
          },
          {
            "name": "org.apache.maven.plugins:maven-javadoc-plugin",
            "direct": false,
            "version": "3.12.0",
            "ecosystem": "maven"
          },
          {
            "name": "org.apache.maven.plugins:maven-resources-plugin",
            "direct": false,
            "version": "3.5.0",
            "ecosystem": "maven"
          },
          {
            "name": "org.apache.maven.plugins:maven-shade-plugin",
            "direct": false,
            "version": null,
            "ecosystem": "maven"
          },
          {
            "name": "org.apache.maven.plugins:maven-shade-plugin",
            "direct": false,
            "version": "3.6.2",
            "ecosystem": "maven"
          },
          {
            "name": "org.apache.maven.plugins:maven-site-plugin",
            "direct": false,
            "version": "3.22.0",
            "ecosystem": "maven"
          },
          {
            "name": "org.apache.maven.plugins:maven-source-plugin",
            "direct": false,
            "version": null,
            "ecosystem": "maven"
          },
          {
            "name": "org.apache.maven.plugins:maven-source-plugin",
            "direct": false,
            "version": "3.4.0",
            "ecosystem": "maven"
          },
          {
            "name": "org.apache.maven.plugins:maven-surefire-plugin",
            "direct": false,
            "version": "3.5.6",
            "ecosystem": "maven"
          },
          {
            "name": "org.apache.mina:mina-core",
            "direct": false,
            "version": "2.2.9",
            "ecosystem": "maven"
          },
          {
            "name": "org.glassfish.tyrus.bundles:tyrus-standalone-client",
            "direct": false,
            "version": null,
            "ecosystem": "maven"
          },
          {
            "name": "org.graalvm.buildtools:native-maven-plugin",
            "direct": false,
            "version": "1.1.5",
            "ecosystem": "maven"
          },
          {
            "name": "org.junit.platform:junit-platform-launcher",
            "direct": false,
            "version": "1.14.4",
            "ecosystem": "maven"
          },
          {
            "name": "org.junit.vintage:junit-vintage-engine",
            "direct": false,
            "version": "5.14.4",
            "ecosystem": "maven"
          },
          {
            "name": "org.openjdk.jmh:jmh-core",
            "direct": false,
            "version": "1.37",
            "ecosystem": "maven"
          },
          {
            "name": "org.openjdk.jmh:jmh-generator-annprocess",
            "direct": false,
            "version": "1.37",
            "ecosystem": "maven"
          },
          {
            "name": "org.sonatype.plugins:nexus-staging-maven-plugin",
            "direct": false,
            "version": "1.7.0",
            "ecosystem": "maven"
          }
        ],
        "collected": true,
        "truncated": false,
        "total_count": 50,
        "direct_count": 16,
        "indirect_count": 34
      }
    },
    "maintainership": {
      "issues": {
        "open_prs": 1,
        "merged_prs": 144,
        "open_issues": 4,
        "closed_ratio": 0.949,
        "closed_issues": 74,
        "closed_unmerged_prs": 7
      },
      "bus_factor": 1,
      "bot_contributors": 2,
      "top_contributors": [
        {
          "type": "User",
          "login": "stalep",
          "commits": 711,
          "avatar_url": "https://avatars.githubusercontent.com/u/49780?v=4"
        },
        {
          "type": "User",
          "login": "jfdenise",
          "commits": 39,
          "avatar_url": "https://avatars.githubusercontent.com/u/4104715?v=4"
        },
        {
          "type": "User",
          "login": "tristantarrant",
          "commits": 13,
          "avatar_url": "https://avatars.githubusercontent.com/u/392478?v=4"
        },
        {
          "type": "User",
          "login": "iweiss",
          "commits": 3,
          "avatar_url": "https://avatars.githubusercontent.com/u/4449438?v=4"
        },
        {
          "type": "User",
          "login": "gnodet",
          "commits": 3,
          "avatar_url": "https://avatars.githubusercontent.com/u/84022?v=4"
        },
        {
          "type": "User",
          "login": "dudaerich",
          "commits": 2,
          "avatar_url": "https://avatars.githubusercontent.com/u/2317374?v=4"
        },
        {
          "type": "User",
          "login": "Eng-Fouad",
          "commits": 2,
          "avatar_url": "https://avatars.githubusercontent.com/u/1194488?v=4"
        },
        {
          "type": "User",
          "login": "karlll",
          "commits": 2,
          "avatar_url": "https://avatars.githubusercontent.com/u/1835337?v=4"
        },
        {
          "type": "User",
          "login": "quintesse",
          "commits": 2,
          "avatar_url": "https://avatars.githubusercontent.com/u/778793?v=4"
        },
        {
          "type": "User",
          "login": "helio-frota",
          "commits": 2,
          "avatar_url": "https://avatars.githubusercontent.com/u/6443576?v=4"
        }
      ],
      "contributors_sampled": 12,
      "top_contributor_share": 0.91
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "dependabot-automerge.yml",
        "main.yml",
        "release.yml"
      ],
      "has_docs_dir": false,
      "linter_configs": [],
      "has_editorconfig": true,
      "has_linter_config": false,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [],
      "scorecard": {
        "checks": [
          {
            "name": "Binary-Artifacts",
            "score": 9,
            "reason": "binaries present in source code",
            "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": "8 out of 8 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/14 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 7 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": 10,
            "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 28 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": 10,
            "reason": "packaging workflow detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
          },
          {
            "name": "Pinned-Dependencies",
            "score": 0,
            "reason": "dependency not pinned by hash detected -- score normalized to 0",
            "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": null,
            "reason": "no releases found",
            "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": 10,
            "reason": "0 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "7df67713ea0ac42ddf136cb71ced6276eca5de06",
        "ran_at": "2026-07-25T06:01:11Z",
        "aggregate_score": 5.3,
        "scorecard_version": "v5.5.0"
      },
      "has_codeql_workflow": false,
      "has_security_policy": false,
      "has_dependabot_config": true
    },
    "contribution_flow": {
      "collected": true,
      "ci_last_run_at": null,
      "oldest_open_prs": [
        {
          "number": 165,
          "created_at": "2026-05-19T19:02:44Z",
          "last_comment_at": "2026-05-21T08:04:25Z",
          "last_comment_author": "stalep"
        }
      ],
      "last_merged_pr_at": "2026-07-20T09:45:18Z",
      "ci_last_conclusion": null,
      "oldest_open_issues": [
        {
          "number": 101,
          "created_at": "2026-02-20T14:24:30Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 164,
          "created_at": "2026-05-19T15:21:34Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 206,
          "created_at": "2026-06-15T17:22:52Z",
          "last_comment_at": "2026-06-18T10:53:14Z",
          "last_comment_author": "stalep"
        },
        {
          "number": 217,
          "created_at": "2026-06-23T15:49:02Z",
          "last_comment_at": "2026-06-23T18:52:47Z",
          "last_comment_author": "stalep"
        }
      ]
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/aeshell/aesh-readline",
    "host": "github.com",
    "name": "aesh-readline",
    "owner": "aeshell"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "moderate",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 65,
      "inputs": {
        "security": 62,
        "vitality": 89,
        "community": 41,
        "governance": 63,
        "engineering": 64
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "excellent",
        "name": "Vitality",
        "value": 89,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "good",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 82,
            "inputs": {
              "commits_last_year": 346,
              "human_commit_share": 0.6,
              "days_since_last_push": 4,
              "active_weeks_last_year": 26
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 4 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 4
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "26/52 weeks with commits",
                "points": 18,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 26
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "346 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 346
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "30 commit(s) and 28 issue activity found in the last 90 days -- score normalized to 10",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "release_discipline",
            "band": "excellent",
            "name": "Release discipline",
            "note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "openssf_scorecard_signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "releases_count": 18,
              "latest_release_tag": "v3.16.3",
              "releases_from_tags": false,
              "days_since_latest_release": 12,
              "mean_days_between_releases": 4.1
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "18 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 18
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 12 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 12
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~4.1 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 4.1
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "openssf_scorecard_signed_releases",
                "name": "OpenSSF Scorecard: Signed-Releases",
                "detail": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "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": 12,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "last human commit 12 days ago",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_maintained",
                    "params": {
                      "days": 12
                    }
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "at_risk",
        "name": "Community & Adoption",
        "value": 41,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "at_risk",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 34,
            "inputs": {
              "forks": 16,
              "stars": 26,
              "watchers": 3,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "26 stars",
                "points": 22.7,
                "status": "partial",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 26
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "16 forks",
                "points": 9.8,
                "status": "partial",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 16
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "3 watchers",
                "points": 1.7,
                "status": "partial",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 3
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "moderate",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 50,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "has_contributing": false,
              "has_issue_template": false,
              "has_code_of_conduct": false,
              "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": "recognized license (Apache-2.0)",
                "points": 22.5,
                "status": "met",
                "details": [
                  {
                    "code": "license_standard",
                    "params": {}
                  },
                  {
                    "code": "license_spdx",
                    "params": {
                      "spdx": "Apache-2.0"
                    }
                  }
                ],
                "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": 0,
                "status": "missed",
                "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
              }
            ]
          }
        ],
        "description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
      },
      {
        "key": "governance",
        "band": "moderate",
        "name": "Sustainability & Governance",
        "value": 63,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "at_risk",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 34,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 12,
              "top_contributor_share": 0.91
            },
            "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 91% of commits",
                "points": 2,
                "status": "partial",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 91
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "12 contributors",
                "points": 13.5,
                "status": "met",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 12
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 7 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": 144,
              "open_issues": 4,
              "closed_issues": 74,
              "issue_closed_ratio": 0.949,
              "closed_unmerged_prs": 7
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "95% of issues closed",
                "points": 44.4,
                "status": "partial",
                "details": [
                  {
                    "code": "issues_closed_share",
                    "params": {
                      "share": 95
                    }
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "144/151 decided PRs merged",
                "points": 36.5,
                "status": "partial",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 144,
                      "decided": 151
                    }
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 0/14 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "at_risk",
            "name": "Ownership & stewardship",
            "note": null,
            "notes": [],
            "value": 49,
            "inputs": {
              "followers": 0,
              "owner_type": "Organization",
              "is_verified": null,
              "owner_login": "aeshell",
              "public_repos": 8,
              "account_age_days": 5106
            },
            "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": "0 followers of aeshell",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 0,
                      "login": "aeshell"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "8 public repos, account ~13 yr old",
                "points": 18.9,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 8
                    }
                  },
                  {
                    "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": [
                "org.aesh:readline",
                "org.aesh:readline-api",
                "org.aesh:terminal-api",
                "org.aesh:terminal-ssh",
                "org.aesh:terminal-tty",
                "org.aesh:terminal-http",
                "org.aesh:terminal-detect",
                "org.aesh:terminal-telnet"
              ],
              "ecosystems": "maven",
              "any_deprecated": false,
              "min_days_since_publish": 12
            },
            "components": [
              {
                "key": "published_resolvable",
                "name": "Published & resolvable",
                "detail": "8 package(s) on maven",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "packages_published",
                    "params": {
                      "count": 8,
                      "ecosystems": "maven"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "publish_recency",
                "name": "Publish recency",
                "detail": "latest publish 12 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 12
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "27 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 27
                    }
                  }
                ],
                "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": "moderate",
        "name": "Engineering Quality",
        "value": 64,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "good",
            "name": "Engineering practices",
            "note": null,
            "notes": [],
            "value": 74,
            "inputs": {
              "has_ci": true,
              "has_tests": true,
              "has_editorconfig": true,
              "has_linter_config": false,
              "has_precommit_config": false
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": "3 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 3
                    }
                  }
                ],
                "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": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "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": "8 out of 8 merged PRs checked by a CI test -- score normalized to 10",
                "points": 20,
                "status": "met",
                "details": [],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "moderate",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 50,
            "inputs": {
              "topics": [],
              "has_wiki": true,
              "homepage": null,
              "has_readme": true,
              "has_docs_dir": false,
              "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": 0,
                "status": "missed",
                "details": [],
                "max_points": 25
              },
              {
                "key": "documentation_homepage_site",
                "name": "Documentation / homepage site",
                "detail": null,
                "points": 0,
                "status": "missed",
                "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": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              },
              {
                "key": "wiki",
                "name": "Wiki",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          }
        ],
        "description": "Are baseline engineering and documentation practices in place?"
      },
      {
        "key": "security",
        "band": "moderate",
        "name": "Security",
        "value": 62,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "moderate",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 53,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 17,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 1,
              "scorecard_aggregate": 5.3
            },
            "components": [
              {
                "key": "binary_artifacts",
                "name": "Binary-Artifacts",
                "detail": "binaries present in source code",
                "points": 6.8,
                "status": "partial",
                "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": "8 out of 8 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/14 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 7 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.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "maintained",
                "name": "Maintained",
                "detail": "30 commit(s) and 28 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 detected",
                "points": 5,
                "status": "met",
                "details": [],
                "max_points": 5
              },
              {
                "key": "pinned_dependencies",
                "name": "Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "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": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "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": "0 existing vulnerabilities detected",
                "points": 7.5,
                "status": "met",
                "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 maven:org.aesh:readline@3.16.3 runtime dependency closure — what installing the published package pulls in — 4 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": "maven:org.aesh:readline@3.16.3",
                  "assessed": 4
                }
              },
              {
                "code": "advisories_reachability",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "source": "osv",
              "advisories": 0,
              "affected_packages": 0,
              "assessed_packages": 4,
              "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": 4,
              "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": 15
            },
            "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": "good",
        "name": "AI Readiness",
        "value": 70,
        "weight": 0,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "excellent",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 85,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": 0.917,
              "agent_instruction_files": [
                "CLAUDE.md"
              ],
              "agent_instruction_max_bytes": 1009
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": "CLAUDE.md",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "CLAUDE.md"
                    }
                  }
                ],
                "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": "55 of 60 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 55,
                      "sampled": 60
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "moderate",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 59,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [],
              "has_dockerfile": false,
              "typed_language": true,
              "bootstrap_files": [
                "terminal-tty/src/main/native/Makefile"
              ],
              "has_devcontainer": false,
              "has_linter_config": false,
              "typecheck_configs": [],
              "agent_commit_share": 0,
              "toolchain_manifests": [
                "benchmark/pom.xml",
                "bom/pom.xml",
                "examples/pom.xml",
                "pom.xml",
                "readline-api/pom.xml",
                "readline/pom.xml",
                "terminal-api/pom.xml",
                "terminal-detect/pom.xml",
                "terminal-http/pom.xml",
                "terminal-ssh/pom.xml",
                "terminal-telnet/pom.xml",
                "terminal-tty/pom.xml"
              ],
              "dependency_bot_commit_share": 0.13
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": "terminal-tty/src/main/native/Makefile",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "terminal-tty/src/main/native/Makefile"
                    }
                  }
                ],
                "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": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 11
              },
              {
                "key": "static_type_checking",
                "name": "Static type checking",
                "detail": "Java (statically typed)",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "statically_typed_language",
                    "params": {
                      "language": "Java"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "reproducible_environment",
                "name": "Reproducible environment",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "no agent-authored commits among the last 100",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_agent_authored_commits",
                    "params": {
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "automated_maintenance",
                "name": "Automated maintenance",
                "detail": "13 of the last 100 commits are automated dependency updates",
                "points": 8,
                "status": "met",
                "details": [
                  {
                    "code": "dependency_bot_commits",
                    "params": {
                      "count": 13,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 8
              },
              {
                "key": "openssf_scorecard_pinned_dependencies",
                "name": "OpenSSF Scorecard: Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "excellent",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "primary_language": "Java",
              "largest_source_bytes": 68343,
              "source_files_sampled": 424,
              "oversized_source_files": 2
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "Java (statically typed)",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "statically_typed_language",
                    "params": {
                      "language": "Java"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "2/424 source files over 60KB",
                "points": 54.7,
                "status": "partial",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 424,
                      "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-25T06:01:28.450872Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/a/aeshell/aesh-readline.svg",
  "full_name": "aeshell/aesh-readline",
  "license_state": "standard",
  "license_spdx": "Apache-2.0"
}

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 StatistikenMaven.