Public record
Software health reportschema 0.27.0 · metrics 1.13.0 · 2026-07-25 06:01 UTC

aeshell / aesh-readline

Java Readline API

JavaApache-2.0★ 26 stars⑂ 16 forkssince Dec 2015View on GitHub ↗

aeshell/aesh-readline holds a health index of 65 out of 100, placing it in the Moderate band. It scores highest on Vitality (89/100) and lowest on Community & Adoption (41/100). It was last updated 4 days ago. A single contributor accounts for most of its recent work.

65
overall / 100
Moderate

Software health index

Metrics are grouped into weighted categories on one standardized 1–100 scale. Overall starts as their weighted mean; when public evidence triggers the High-Risk Jurisdiction Policy, the rating is adjusted and receives an At risk ceiling of 49. AI Readiness sits outside the overall score.

65
Excellent85-100Exemplary; meets essentially all checked criteria
Good70-84Healthy; minor gaps
Moderate50-69Acceptable with notable gaps; review recommended
At risk30-49Significant weaknesses; adoption warrants caution
Critical1-29Severe problems (abandoned, single-maintainer, no hygiene)
VitalityCommunity &AdoptionSustainability &GovernanceEngineeringQualitySecurityAI Readiness

Score profile

Each axis is a category. The shape matters more than the average — a healthy subject fills the whole shape, while a spike-and-crater profile means strength in one dimension is masking risk in another.

Ownership

aeshellOrganization
0 followers8 public repossince Jul 2012

This repository is backed by an organization — shared, accountable stewardship that can outlive any single maintainer.

Package ecosystems

RegistryPackageVersionDownloads / moVersionsLast publish
Mavenorg.aesh:readline3.16.3-2712 days ago
Mavenorg.aesh:readline-api3.16.3-1312 days ago
Mavenorg.aesh:terminal-api3.16.3-2712 days ago
Mavenorg.aesh:terminal-ssh3.16.3-2712 days ago
Mavenorg.aesh:terminal-tty3.16.3-2012 days ago
Mavenorg.aesh:terminal-http3.16.3-2712 days ago
Mavenorg.aesh:terminal-detect3.16.3-1212 days ago
Mavenorg.aesh:terminal-telnet3.16.3-2712 days ago

Metrics by category

Vitality

Is the project alive — is code being written and are releases shipping?

89Excellent · 22% of overall
How it's scored
36/36Push recency — last push 4 days ago
18/36Commit cadence — 26/52 weeks with commits
18/18Commit volume — 346 commits in the last year
10/10OpenSSF Scorecard: Maintained — 30 commit(s) and 28 issue activity found in the last 90 days -- score normalized to 10
Inputs used
commits_last_year346
human_commit_share0.6
days_since_last_push4
active_weeks_last_year26

Release discipline

100Excellent
How it's scored
27/27Ships releases — 18 releases published
36/36Release recency — latest release 12 days ago
27/27Release cadence — a release every ~4.1 days
0/10OpenSSF Scorecard: Signed-Releases — no data
Inputs used
releases_count18
latest_release_tagv3.16.3
releases_from_tagsno
days_since_latest_release12
mean_days_between_releases4.1
Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Signed-Releases. Remaining weights renormalized.

Community & Adoption

Does the project have users, downloads, attention, and a welcoming setup for contributors?

41At risk · 18% of overall
How it's scored
22.7/60Stars — 26 stars
9.8/25Forks — 16 forks
1.7/15Watchers — 3 watchers
Inputs used
forks16
stars26
watchers3
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
How it's scored
22.5/22.5README
22.5/22.5License — recognized license (Apache-2.0)
0/18CONTRIBUTING guide
0/13.5Code of conduct
0/7.2Issue template
0/6.3PR template
Inputs used
has_readmeyes
has_licenseyes
has_contributingno
has_issue_templateno
has_code_of_conductno
has_pull_request_templateno

Sustainability & Governance

Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?

63Moderate · 24% of overall
How it's scored
9/54Bus factor — 1 contributor(s) cover half of all commits
2/22.5Commit distribution — top contributor authored 91% of commits
13.5/13.5Contributor breadth — 12 contributors
10/10OpenSSF Scorecard: Contributors — project has 7 contributing companies or organizations
Inputs used
bus_factor1
contributors_sampled12
top_contributor_share0.91
How it's scored
44.4/46.8Issue resolution — 95% of issues closed
36.5/38.3PR acceptance — 144/151 decided PRs merged
0/15OpenSSF Scorecard: Code-Review — Found 0/14 approved changesets -- score normalized to 0
Inputs used
merged_prs144
open_issues4
closed_issues74
issue_closed_ratio0.949
closed_unmerged_prs7
How it's scored
30/30Ownership backing — organization-owned
0/20Verified domain
0/25Owner reach — 0 followers of aeshell
18.9/25Track record — 8 public repos, account ~13 yr old
Inputs used
followers0
owner_typeOrganization
is_verified
owner_loginaeshell
public_repos8
account_age_days5,106
How it's scored
25/25Published & resolvable — 8 package(s) on maven
35/35Publish recency — latest publish 12 days ago
20/20Version history — 27 published versions
20/20Not deprecated — active, not deprecated or yanked
Inputs used
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_deprecatedno
min_days_since_publish12

Engineering Quality

Are baseline engineering and documentation practices in place?

64Moderate · 20% of overall
How it's scored
24/24CI workflows — 3 workflow(s)
24/24Tests present
0/16Linter config
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
Inputs used
has_ciyes
has_testsyes
has_editorconfigyes
has_linter_configno
has_precommit_configno

Documentation

50Moderate
How it's scored
30/30README
0/25Documentation directory
0/15Documentation / homepage site
10/10Repository description
0/10Topics
10/10Wiki
Inputs used
topics
has_wikiyes
homepage
has_readmeyes
has_docs_dirno
has_descriptionyes

Security

Are visible security and supply-chain practices strong, without unresolved high-risk jurisdiction exposure?

62Moderate · 16% of overall
How it's scored
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.5License — 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 — no data
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
7.5/7.5Vulnerabilities — 0 existing vulnerabilities detected
Inputs used
sourceopenssf_scorecard
checks_evaluated17
scorecard_versionv5.5.0
checks_inconclusive1
scorecard_aggregate5.3
Excluded from scoring (no data or not applicable): signed_releases. Remaining weights renormalized.
How it's scored
35/35Direct dependencies free of known advisories — no direct dependency carries a known advisory
25/25Indirect dependencies free of known advisories — no indirect dependency carries a known advisory
0/40No advisories left outstanding — no advisory carries a publication date
Inputs used
sourceosv
advisories0
affected_packages0
assessed_packages4
unassessed_packages0
affected_by_severitynone
direct_affected_packages0
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.

AI Readiness

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.

70Good · 0% of overall
How it's scored
45/45Agent instructions — CLAUDE.md
0/15Machine-readable docs (llms.txt)
40/40Legible commit history — 55 of 60 human commits state their intent (structured subject or explanatory body)
Inputs used
has_llms_txtno
legible_history_share0.917
agent_instruction_filesCLAUDE.md
agent_instruction_max_bytes1,009
How it's scored
18/18One-command bootstrap — terminal-tty/src/main/native/Makefile
22/22Automated tests
0/11Lint / format config
11/11Static type checking — Java (statically typed)
0/10Reproducible environment
0/10Demonstrated agent practice — no agent-authored commits among the last 100
8/8Automated maintenance — 13 of the last 100 commits are automated dependency updates
0/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
Inputs used
has_nixno
has_testsyes
lockfiles
has_dockerfileno
typed_languageyes
bootstrap_filesterminal-tty/src/main/native/Makefile
has_devcontainerno
has_linter_configno
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
How it's scored
45/45Type-checkable code — Java (statically typed)
54.7/55Manageable file sizes — 2/424 source files over 60KB
Inputs used
primary_languageJava
largest_source_bytes68,343
source_files_sampled424
oversized_source_files2
How it's scored
0/40API schema (OpenAPI/GraphQL/proto)
0/20MCP server
40/40Runnable examples — example, examples
Inputs used
example_dirsexample, examples
has_mcp_signalno
api_schema_files

Key facts

26GitHub stars
12contributors
346commits, last 12 months
4days since last push
18releases
1bus factor
4open issues
Mavenpackage ecosystems

Data collection warnings

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

More detail

Star and fork history 0 ★ / 16 ⇿
0Stars
16Forks
4Releases

When each star and fork was added, collected from GitHub and bucketed by day. Cumulative growth sits directly above the daily additions it is made of, so the two read against each other: steady organic accretion looks nothing like an abrupt, short-lived burst. Where that difference is measurable, it is reported as growth authenticity.

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

Each point covers 10 days.

OpenSSF Scorecard 5.3 / 10
5.3aggregate

Independent, tool-agnostic security assessment from the open-source OpenSSF Scorecard. Each check rewards a security practice, not a specific vendor's tool. Checks Scorecard could not determine are marked n/a and excluded from the security score (never counted as zero).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
n/aSigned-Releasesno releases found
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
10Vulnerabilities0 existing vulnerabilities detected
Direct dependencies 32
RegistryPackageVersion constraintManifest
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
All dependencies 50

Full resolved dependency set from the GitHub dependency graph: 16 direct and 34 indirect (transitive) packages. The transitive closure is complete when the repository commits a lockfile.

RegistryPackageVersionRelation
Mavencom.fasterxml.jackson.core:jackson-databinddirect
Mavencommons-logging:commons-logging1.4.0direct
Mavenio.netty:netty-codec-httpdirect
Mavenio.netty:netty-commondirect
Mavenio.netty:netty-handlerdirect
Mavenio.netty:netty-transportdirect
Mavenorg.aesh:readline3.17-devdirect
Mavenorg.aesh:readline-api3.17-devdirect
Mavenorg.aesh:terminal-api3.17-devdirect
Mavenorg.aesh:terminal-detect3.17-devdirect
Mavenorg.aesh:terminal-http3.17-devdirect
Mavenorg.aesh:terminal-ssh3.17-devdirect
Mavenorg.aesh:terminal-telnet3.17-devdirect
Mavenorg.aesh:terminal-tty3.17-devdirect
Mavenorg.apache.sshd:sshd-core2.19.0direct
Mavenorg.apache.sshd:sshd-netty2.19.0direct
Mavencommons-net:commons-net3.13.0indirect
Mavenjunit:junitindirect
Mavenjunit:junit4.13.2indirect
Mavennet.revelc.code.formatter:formatter-maven-pluginindirect
Mavennet.revelc.code.formatter:formatter-maven-plugin2.29.0indirect
Mavennet.revelc.code:impsort-maven-pluginindirect
Mavennet.revelc.code:impsort-maven-plugin1.13.0indirect
Mavenorg.apache.maven.plugins:maven-antrun-pluginindirect
Mavenorg.apache.maven.plugins:maven-clean-plugin3.5.0indirect
Mavenorg.apache.maven.plugins:maven-compiler-plugin1.37indirect
Mavenorg.apache.maven.plugins:maven-compiler-plugin3.15.0indirect
Mavenorg.apache.maven.plugins:maven-deploy-plugin3.1.4indirect
Mavenorg.apache.maven.plugins:maven-enforcer-plugin3.6.3indirect
Mavenorg.apache.maven.plugins:maven-gpg-pluginindirect
Mavenorg.apache.maven.plugins:maven-gpg-plugin3.2.8indirect
Mavenorg.apache.maven.plugins:maven-install-plugin3.1.4indirect
Mavenorg.apache.maven.plugins:maven-jar-plugin3.5.0indirect
Mavenorg.apache.maven.plugins:maven-javadoc-pluginindirect
Mavenorg.apache.maven.plugins:maven-javadoc-plugin3.12.0indirect
Mavenorg.apache.maven.plugins:maven-resources-plugin3.5.0indirect
Mavenorg.apache.maven.plugins:maven-shade-pluginindirect
Mavenorg.apache.maven.plugins:maven-shade-plugin3.6.2indirect
Mavenorg.apache.maven.plugins:maven-site-plugin3.22.0indirect
Mavenorg.apache.maven.plugins:maven-source-pluginindirect
Mavenorg.apache.maven.plugins:maven-source-plugin3.4.0indirect
Mavenorg.apache.maven.plugins:maven-surefire-plugin3.5.6indirect
Mavenorg.apache.mina:mina-core2.2.9indirect
Mavenorg.glassfish.tyrus.bundles:tyrus-standalone-clientindirect
Mavenorg.graalvm.buildtools:native-maven-plugin1.1.5indirect
Mavenorg.junit.platform:junit-platform-launcher1.14.4indirect
Mavenorg.junit.vintage:junit-vintage-engine5.14.4indirect
Mavenorg.openjdk.jmh:jmh-core1.37indirect
Mavenorg.openjdk.jmh:jmh-generator-annprocess1.37indirect
Mavenorg.sonatype.plugins:nexus-staging-maven-plugin1.7.0indirect
Dependency advisories 0

Installing maven:org.aesh:readline@3.16.3 pulls in 4 packages, direct and transitive: 0 carry known advisories, of which 0 are direct dependencies.

No known advisories affect the assessed dependencies.

An advisory means the version recorded in the dependency graph falls inside an advisory’s affected range. Reachability is not analysed, and the graph includes development and test pins — a finding may concern tooling rather than shipped software.

Raw JSON report machine-readable
{
  "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"
}

Scores are signals, not warranties. They reflect publicly visible practices on GitHub — not a code audit, and not a security guarantee.

Missing data is excluded and weights renormalized, never scored as zero. Methodology is versioned and open: metrics v1.13.0, schema v0.27.0 — full methodology · metrics wiki.

How one result sits in the wider record: aggregate statisticsMaven.