公开记录
软件健康报告模式 0.27.0 · 指标 1.13.0 · 2026-07-25 06:01 UTC

aeshell / aesh-readline

Java Readline API

JavaApache-2.0★ 26 星标⑂ 16 复刻始于 2015年12月在 GitHub 上查看 ↗

aeshell/aesh-readline 的健康指数为 100 分中的 65 分,处于「中等」区间。 其得分最高的类别是Vitality(89/100),最低的是Community & Adoption(41/100)。 最近一次更新在 4 天前。 近期的大部分工作由 1 位贡献者完成。

65
总分 / 100
中等

软件健康指数

指标归入加权类别,统一采用 1–100 量表。总体分先取类别加权平均;当公开证据触发高风险司法辖区政策时,评级会按政策调整,并设置 49(有风险)的上限。AI 就绪度不计入总体分。

65
优秀85-100堪称典范;基本满足所有检验标准
良好70-84健康;仅有轻微不足
中等50-69可接受,但存在明显不足;建议进行审查
存在风险30-49存在重大薄弱环节;采用时应保持审慎
危急1-29问题严重(项目被弃置、仅有单一维护者、缺乏基本工程规范)
活力社区与采用可持续性与治理工程质量安全AI 就绪度

评分画像

每条轴代表一个类别。形状比平均值更重要——健康的对象会填满整个图形,而“一峰一谷”式画像意味着某一维度的优势正掩盖另一维度的风险。

所有权

aeshell组织
0 关注者8 个公开仓库始于 2012年7月

该仓库由组织支持——共同承担、可问责的托管责任,可延续于任何单一维护者之后。

软件包生态系统

注册表软件包版本月下载量版本数最近发布
Mavenorg.aesh:readline3.16.3-2712 天前
Mavenorg.aesh:readline-api3.16.3-1312 天前
Mavenorg.aesh:terminal-api3.16.3-2712 天前
Mavenorg.aesh:terminal-ssh3.16.3-2712 天前
Mavenorg.aesh:terminal-tty3.16.3-2012 天前
Mavenorg.aesh:terminal-http3.16.3-2712 天前
Mavenorg.aesh:terminal-detect3.16.3-1212 天前
Mavenorg.aesh:terminal-telnet3.16.3-2712 天前

按类别列示的指标

活力

项目是否仍有生命——是否仍在编写代码,是否仍在发布版本?

89优秀 · 占总体的 22%
评分方式
36/36推送新近度 — 最近一次推送于 4 天前
18/36提交节奏 — 52 周中有 26 周有提交
18/18提交量 — 最近一年 346 次提交
10/10OpenSSF Scorecard:Maintained — 30 commit(s) and 28 issue activity found in the last 90 days -- score normalized to 10
所用输入
commits_last_year346
human_commit_share0.6
days_since_last_push4
active_weeks_last_year26

发布纪律

100优秀
评分方式
27/27有发布版本 — 已发布 18 个发布版本
36/36发布时效 — 最近一次发布版本于 12 天前
27/27发布节奏 — 约每 4.1 天发布一次
0/10OpenSSF Scorecard:Signed-Releases — 无数据
所用输入
releases_count18
latest_release_tagv3.16.3
releases_from_tags
days_since_latest_release12
mean_days_between_releases4.1
已排除计分(无数据或不适用):OpenSSF Scorecard:Signed-Releases。 其余权重已重新归一化。

社区与采用

项目是否拥有用户、下载量与关注度,并具备欢迎贡献者参与的配置?

41存在风险 · 占总体的 18%

流行度与采用

34存在风险
评分方式
22.7/60星标 — 26 个星标
9.8/25复刻 — 16 个复刻
1.7/15关注者 — 3 位关注者
所用输入
forks16
stars26
watchers3
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history

社区健康

50中等
评分方式
22.5/22.5README
22.5/22.5许可证 — 可识别的许可证(Apache-2.0)
0/18CONTRIBUTING 指南
0/13.5行为准则
0/7.2议题模板
0/6.3PR 模板
所用输入
has_readme
has_license
has_contributing
has_issue_template
has_code_of_conduct
has_pull_request_template

可持续性与治理

项目能否在其成员之外延续——巴士系数、响应能力、由谁支持,以及软件包的维护状况?

63中等 · 占总体的 24%
评分方式
9/54巴士系数 — 1 位贡献者贡献了半数提交
2/22.5提交分布 — 头号贡献者编写了 91% 的提交
13.5/13.5贡献者广度 — 12 位贡献者
10/10OpenSSF Scorecard:Contributors — project has 7 contributing companies or organizations
所用输入
bus_factor1
contributors_sampled12
top_contributor_share0.91
评分方式
44.4/46.8议题解决 — 95% 的议题已关闭
36.5/38.3PR 接受 — 已裁定的 PR 中 144/151 已合并
0/15OpenSSF Scorecard:Code-Review — Found 0/14 approved changesets -- score normalized to 0
所用输入
merged_prs144
open_issues4
closed_issues74
issue_closed_ratio0.949
closed_unmerged_prs7
评分方式
30/30所有权背书 — 组织持有
0/20已验证域名
0/25所有者影响力 — aeshell 有 0 位关注者
18.9/25既往记录 — 8 个公开仓库,账户约 13 年
所用输入
followers0
owner_typeOrganization
is_verified
owner_loginaeshell
public_repos8
account_age_days5,106
评分方式
25/25已发布且可解析 — maven 上有 8 个软件包
35/35发布时效 — 最近一次发布于 12 天前
20/20版本历史 — 27 个已发布版本
20/20未被弃用 — 活跃,未被弃用或撤回
所用输入
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_deprecated
min_days_since_publish12

工程质量

基础的工程与文档实践是否到位?

64中等 · 占总体的 20%

工程实践

74良好
评分方式
24/24CI 工作流 — 3 个工作流
24/24存在测试
0/16Linter 配置
0/9.6Pre-commit 钩子
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
所用输入
has_ci
has_tests
has_editorconfig
has_linter_config
has_precommit_config

文档

50中等
评分方式
30/30README
0/25文档目录
0/15文档 / 主页站点
10/10仓库描述
0/10主题标签
10/10Wiki
所用输入
topics
has_wiki
homepage
has_readme
has_docs_dir
has_description

安全

可见的安全与供应链实践是否稳固,且不存在未解决的高风险司法辖区暴露?

62中等 · 占总体的 16%

安全态势

53中等
评分方式
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.5许可证 — 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 — 无数据
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
7.5/7.5Vulnerabilities — 0 existing vulnerabilities detected
所用输入
sourceopenssf_scorecard
checks_evaluated17
scorecard_versionv5.5.0
checks_inconclusive1
scorecard_aggregate5.3
已排除计分(无数据或不适用):signed_releases。 其余权重已重新归一化。
评分方式
35/35直接依赖不含已知公告 — 没有直接依赖携带已知公告
25/25间接依赖不含已知公告 — 没有间接依赖携带已知公告
0/40没有长期未处理的公告 — 没有公告带有发布日期
所用输入
sourceosv
advisories0
affected_packages0
assessed_packages4
unassessed_packages0
affected_by_severitynone
direct_affected_packages0
已排除计分(无数据或不适用):没有长期未处理的公告。 其余权重已重新归一化。 比对的是 maven:org.aesh:readline@3.16.3 的运行时依赖闭包——安装已发布的软件包时真正被拉取进来的内容——共 4 个软件包。 未对可达性进行分析。

AI 就绪度

该仓库在多大程度上具备与 AI 编码代理协同开发与维护的条件?这是一枚独立的实验性徽章——权重为 0.0,因此单独呈现,不影响总体健康评分。

70良好 · 占总体的 0%
评分方式
45/45代理指令 — CLAUDE.md
0/15机器可读文档(llms.txt)
40/40可读的提交历史 — 60 次人类提交中有 55 次说明了意图(结构化标题或解释性正文)
所用输入
has_llms_txt
legible_history_share0.917
agent_instruction_filesCLAUDE.md
agent_instruction_max_bytes1,009
评分方式
18/18一条命令的引导启动 — terminal-tty/src/main/native/Makefile
22/22自动化测试
0/11Lint / 格式化配置
11/11静态类型检查 — Java(静态类型)
0/10可复现环境
0/10已体现的代理实践 — 最近 100 次提交中没有代理编写的提交
8/8自动化维护 — 最近 100 次提交中有 13 次为自动依赖更新
0/10OpenSSF Scorecard:Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
所用输入
has_nix
has_tests
lockfiles
has_dockerfile
typed_language
bootstrap_filesterminal-tty/src/main/native/Makefile
has_devcontainer
has_linter_config
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
评分方式
45/45可类型检查的代码 — Java(静态类型)
54.7/55可控的文件大小 — 采样的 424 个源文件中有 2 个超过 60KB
所用输入
primary_languageJava
largest_source_bytes68,343
source_files_sampled424
oversized_source_files2

机器可读接口

40存在风险
评分方式
0/40API 模式(OpenAPI/GraphQL/proto)
0/20MCP 服务器
40/40可运行示例 — example, examples
所用输入
example_dirsexample, examples
has_mcp_signal
api_schema_files

关键数据

26GitHub 星标
12贡献者
346最近 12 个月提交数
4距最近推送天数
18发布版本数
1巴士系数(bus factor)
4开放议题
Maven软件包生态系统数

数据采集警告

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

更多细节

Star 与 Fork 历史 0 ★ / 16 ⇿
0Star
16Fork
4发布

每颗 star 和每个 fork 的添加时间,来自 GitHub 并按天汇总。累计增长位于其构成来源——每日新增——的正上方,二者可相互对照:稳定的自然增长与短暂的突增形态截然不同。当这一差别可被衡量时,它会作为增长真实性予以报告。

04812161622015-122021-012026-03
主版本 0次版本 0修订 0

每个点涵盖 10 天。

OpenSSF Scorecard 5.3 / 10
5.3综合

来自开源项目 OpenSSF Scorecard 的独立、工具无关的安全评估。每项检查奖励的是安全实践本身,而非特定供应商的工具。Scorecard 无法判定的检查项标记为 不适用,并从安全评分中剔除(绝不按零分计)。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
不适用Signed-Releasesno releases found
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
10Vulnerabilities0 existing vulnerabilities detected
直接依赖 32
注册表软件包版本约束清单文件
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
全部依赖 50

来自 GitHub 依赖图的完整解析依赖集合:16 个直接依赖与 34 个间接(传递)软件包。仓库提交锁文件时,传递闭包才是完整的。

注册表软件包版本关系
Mavencom.fasterxml.jackson.core:jackson-databind直接
Mavencommons-logging:commons-logging1.4.0直接
Mavenio.netty:netty-codec-http直接
Mavenio.netty:netty-common直接
Mavenio.netty:netty-handler直接
Mavenio.netty:netty-transport直接
Mavenorg.aesh:readline3.17-dev直接
Mavenorg.aesh:readline-api3.17-dev直接
Mavenorg.aesh:terminal-api3.17-dev直接
Mavenorg.aesh:terminal-detect3.17-dev直接
Mavenorg.aesh:terminal-http3.17-dev直接
Mavenorg.aesh:terminal-ssh3.17-dev直接
Mavenorg.aesh:terminal-telnet3.17-dev直接
Mavenorg.aesh:terminal-tty3.17-dev直接
Mavenorg.apache.sshd:sshd-core2.19.0直接
Mavenorg.apache.sshd:sshd-netty2.19.0直接
Mavencommons-net:commons-net3.13.0间接
Mavenjunit:junit间接
Mavenjunit:junit4.13.2间接
Mavennet.revelc.code.formatter:formatter-maven-plugin间接
Mavennet.revelc.code.formatter:formatter-maven-plugin2.29.0间接
Mavennet.revelc.code:impsort-maven-plugin间接
Mavennet.revelc.code:impsort-maven-plugin1.13.0间接
Mavenorg.apache.maven.plugins:maven-antrun-plugin间接
Mavenorg.apache.maven.plugins:maven-clean-plugin3.5.0间接
Mavenorg.apache.maven.plugins:maven-compiler-plugin1.37间接
Mavenorg.apache.maven.plugins:maven-compiler-plugin3.15.0间接
Mavenorg.apache.maven.plugins:maven-deploy-plugin3.1.4间接
Mavenorg.apache.maven.plugins:maven-enforcer-plugin3.6.3间接
Mavenorg.apache.maven.plugins:maven-gpg-plugin间接
Mavenorg.apache.maven.plugins:maven-gpg-plugin3.2.8间接
Mavenorg.apache.maven.plugins:maven-install-plugin3.1.4间接
Mavenorg.apache.maven.plugins:maven-jar-plugin3.5.0间接
Mavenorg.apache.maven.plugins:maven-javadoc-plugin间接
Mavenorg.apache.maven.plugins:maven-javadoc-plugin3.12.0间接
Mavenorg.apache.maven.plugins:maven-resources-plugin3.5.0间接
Mavenorg.apache.maven.plugins:maven-shade-plugin间接
Mavenorg.apache.maven.plugins:maven-shade-plugin3.6.2间接
Mavenorg.apache.maven.plugins:maven-site-plugin3.22.0间接
Mavenorg.apache.maven.plugins:maven-source-plugin间接
Mavenorg.apache.maven.plugins:maven-source-plugin3.4.0间接
Mavenorg.apache.maven.plugins:maven-surefire-plugin3.5.6间接
Mavenorg.apache.mina:mina-core2.2.9间接
Mavenorg.glassfish.tyrus.bundles:tyrus-standalone-client间接
Mavenorg.graalvm.buildtools:native-maven-plugin1.1.5间接
Mavenorg.junit.platform:junit-platform-launcher1.14.4间接
Mavenorg.junit.vintage:junit-vintage-engine5.14.4间接
Mavenorg.openjdk.jmh:jmh-core1.37间接
Mavenorg.openjdk.jmh:jmh-generator-annprocess1.37间接
Mavenorg.sonatype.plugins:nexus-staging-maven-plugin1.7.0间接
依赖安全公告 0

安装 maven:org.aesh:readline@3.16.3 会引入 4 个包(直接与传递):其中 0 个存在已知公告,0 个为直接依赖。

没有已知公告影响已评估的依赖。

公告表示依赖图中记录的版本落入某条公告的受影响范围。可达性未经分析,且依赖图包含开发与测试的版本固定——某项发现可能只涉及工具链而非交付的软件。

原始 JSON 报告 机器可读
{
  "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"
}

评分是信号,而非担保。 评分反映的是 GitHub 上公开可见的实践——不是代码审计,也不是安全保证。

缺失数据将被剔除并重新归一化权重,绝不按零分计。方法论已版本化并公开:指标 v1.13.0、模式 v0.27.0—— 完整方法论 · 指标知识库.

单项结果在整体记录中的位置: 汇总统计Maven.