公开记录
软件健康报告模式 0.30.0 · 指标 2.3.1 · 2026-08-03 13:44 UTC

jongio / grut

A terminal file explorer with full Git and GitHub integration, AI chat, and reactive panels that stay in sync as you navigate.

GoMIT★ 41 星标⑂ 2 复刻始于 2026年3月在 GitHub 上查看 ↗
类型命令行工具终端界面如何判定

jongio/grut 的健康指数为 100 分中的 88 分,处于「优秀」区间。 其得分最高的类别是Engineering Quality(94/100),最低的是Community & Adoption(57/100)。 最近一次更新在今天。 近期的大部分工作由 1 位贡献者完成。

88
总分 / 100
优秀

软件健康指数

指标归入加权类别,统一采用 1–100 量表。总体分先取类别加权平均,再依据公开记录的分布进行校准,使各等级具有百分位含义;当公开证据触发高风险司法辖区政策时,评级会按政策调整,并设置 34(存在风险)的上限。

88
卓越93-100公开记录中的最高层级(约前 5%);基本满足所有检验标准
优秀80-92各方面均表现强劲;仅有少量不足
良好65-79健康;不足之处有限且可控
中等50-64可接受,但存在明显不足;建议进行审查
薄弱35-49多个领域存在实质性薄弱环节
存在风险20-34存在重大薄弱环节;采用时应保持审慎
危急1-19问题严重(项目被弃置、仅有单一维护者、缺乏基本工程规范)
活力社区与采用可持续性与治理工程质量安全AI 就绪度

评分画像

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

加权总体分 74 经校准后在公布的指数量表上为 88(记录校准 2026-08-02)。

所有权

Jon Gallant个人账户
376 关注者56 个公开仓库始于 2012年8月Microsoft

该仓库由个人账户拥有。相较于组织支持的项目,单一所有者项目的延续性风险更高。

软件包生态系统

注册表软件包版本月下载量版本数最近发布
Gogithub.com/jongio/grutv0.7.1-239 天前
npmweb指向其他仓库——不计分0.0.254,42834931 天前

按类别列示的指标

活力

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

85优秀 · 占总体的 21%
评分方式
36/36推送新近度 — 最近一次推送于 0 天前
12.5/36提交节奏 — 52 周中有 18 周有提交
18/18提交量 — 最近一年 438 次提交
10/10OpenSSF Scorecard:Maintained — 30 commit(s) and 30 issue activity found in the last 90 days -- score normalized to 10
所用输入
commits_last_year438
human_commit_share0.8
days_since_last_push0
active_weeks_last_year18

发布纪律

98卓越
评分方式
27/27有发布版本 — 已发布 18 个发布版本
36/36发布时效 — 最近一次发布版本于 9 天前
27/27发布节奏 — 约每 7.4 天发布一次
8/10OpenSSF Scorecard:Signed-Releases — 5 out of the last 5 releases have a total of 5 signed artifacts.
所用输入
releases_count18
latest_release_tagv0.7.1
releases_from_tags
days_since_latest_release9
mean_days_between_releases7.4

社区与采用

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

57中等 · 占总体的 17%

流行度与采用

26存在风险
评分方式
26/60星标 — 41 个星标
0/25复刻 — 2 个复刻
0/15关注者 — 0 位关注者
所用输入
forks2
stars41
watchers0
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history

社区健康

92优秀
评分方式
22.5/22.5README
22.5/22.5许可证 — 可识别的许可证(MIT)
18/18CONTRIBUTING 指南
13.5/13.5行为准则
0/7.2议题模板
6.3/6.3PR 模板
所用输入
has_readme
has_license
readme_badges6
has_contributing
has_issue_template
has_code_of_conduct
readme_badge_servicesgithub.com, goreportcard.com, pkg.go.dev, shields.io
has_pull_request_template

可持续性与治理

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

63中等 · 占总体的 23%
评分方式
9/54巴士系数 — 1 位贡献者贡献了半数提交
0/22.5提交分布 — 头号贡献者编写了 100% 的提交
1.4/13.5贡献者广度 — 1 位贡献者
10/10OpenSSF Scorecard:Contributors — project has 3 contributing companies or organizations -- score normalized to 10
所用输入
bus_factor1
contributors_sampled1
top_contributor_share1
评分方式
41.3/42议题解决 — 98% 的议题已关闭
28/30PR 接受 — 已裁定的 PR 中 150/161 已合并
0/13Newcomer PR acceptance — 30 天内没有首次贡献者的 PR 得到裁决
0/15OpenSSF Scorecard:Code-Review — Found 0/30 approved changesets -- score normalized to 0
所用输入
merged_prs150
open_issues4
closed_issues228
prs_merged_7d14
prs_decided_7d14
prs_merged_30d58
prs_decided_30d58
issue_closed_ratio0.983
closed_unmerged_prs11
first_time_authors_30d0
first_time_prs_merged_30d0
first_time_prs_decided_30d0
已排除计分(无数据或不适用):newcomer_pr_acceptance。 其余权重已重新归一化。
评分方式
10/30所有权背书 — 个人(用户)账户
0/20已验证域名 — 不适用于个人账户
18.5/25所有者影响力 — jongio 有 376 位关注者
24.8/25既往记录 — 56 个公开仓库,账户约 13 年
所用输入
followers376
owner_typeUser
is_verified
owner_loginjongio
public_repos56
account_age_days5,100
已排除计分(无数据或不适用):已验证域名。 其余权重已重新归一化。
评分方式
25/25已发布且可解析 — go 上有 1 个软件包
35/35发布时效 — 最近一次发布于 9 天前
20/20版本历史 — 23 个已发布版本
20/20未被弃用 — 活跃,未被弃用或撤回
所用输入
packagesgithub.com/jongio/grut
ecosystemsgo
any_deprecated
min_days_since_publish9

工程质量

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

94卓越 · 占总体的 19%

工程实践

90优秀
评分方式
24/24CI 工作流 — 4 个工作流
24/24存在测试
16/16Linter 配置 — .golangci.yml
0/9.6Pre-commit 钩子
6.4/6.4.editorconfig
20/20OpenSSF Scorecard:CI-Tests — 16 out of 16 merged PRs checked by a CI test -- score normalized to 10
所用输入
has_ci
has_tests
has_editorconfig
has_linter_config
has_precommit_config

文档

100卓越
评分方式
30/30README
25/25文档目录
15/15文档 / 主页站点 — https://jongio.github.io/grut/
10/10仓库描述
10/10主题标签 — 12 个主题标签
10/10Wiki
所用输入
topicsgit, terminal, cli, copilot, developer-tools, file-explorer, git-client, github, terminal-ui, tui, dprun, dx-idea
has_wiki
homepagehttps://jongio.github.io/grut/
has_readme
has_docs_dir
has_description

安全

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

65良好 · 占总体的 16%

安全态势

65良好
评分方式
7.5/7.5Binary-Artifacts — no binaries found in the repo
0/7.5Branch-Protection — branch protection not enabled on development/release branches
2.5/2.5CI-Tests — 16 out of 16 merged PRs checked by a CI test -- score normalized to 10
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
0/7.5Code-Review — Found 0/30 approved changesets -- score normalized to 0
2.5/2.5Contributors — project has 3 contributing companies or organizations -- score normalized to 10
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 30 issue activity found in the last 90 days -- score normalized to 10
5/5Packaging — packaging workflow detected
4.5/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 9
0/5SAST — SAST tool is not run on all commits -- score normalized to 0
5/5Security-Policy — security policy file detected
6/7.5Signed-Releases — 5 out of the last 5 releases have a total of 5 signed artifacts.
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
7.5/7.5Vulnerabilities — 0 existing vulnerabilities detected
所用输入
sourceopenssf_scorecard
checks_evaluated18
scorecard_versionv5.5.0
checks_inconclusive0
scorecard_aggregate6.5

AI 就绪度

该仓库在多大程度上具备与 AI 编码代理协同开发与维护的条件?权重刻意设小(4%):代理工具链是一项真实的维护信号,但完全不具备的仓库仍可达到 100/100。

93卓越 · 占总体的 4%
评分方式
45/45代理指令 — .github/copilot-instructions.md, AGENTS.md
0/15机器可读文档(llms.txt)
40/40可读的提交历史 — 80 次人类提交中有 80 次说明了意图(结构化标题或解释性正文)
所用输入
has_llms_txt
legible_history_share1
agent_instruction_files.github/copilot-instructions.md, AGENTS.md
agent_instruction_max_bytes3,607
评分方式
18/18一条命令的引导启动 — internal/extension/templates/wasm-go/Makefile
22/22自动化测试
11/11Lint / 格式化配置 — .golangci.yml
11/11静态类型检查 — web/tsconfig.json
10/10可复现环境 — lockfile
10/10已体现的代理实践 — 最近 100 次提交中有 75 次由代理编写或署名代理
5/8自动化维护 — 已配置依赖自动化,但在抽样提交中未观察到
9/10OpenSSF Scorecard:Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 9
所用输入
has_nix
has_tests
lockfilesgo.sum, package-lock.json
has_dockerfile
typed_language
bootstrap_filesinternal/extension/templates/wasm-go/Makefile
has_devcontainer
has_linter_config
typecheck_configsweb/tsconfig.json
agent_commit_share0.75
toolchain_manifestsgo.mod
dependency_bot_commit_share0
评分方式
45/45可类型检查的代码 — Go(静态类型)
54.3/55可控的文件大小 — 采样的 618 个源文件中有 8 个超过 60KB
所用输入
primary_languageGo
largest_source_bytes191,210
source_files_sampled618
oversized_source_files8

关键数据

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

数据采集警告

  • Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token
  • npm package 'web' points at a different repository (https://github.com/creationix/node-web); excluded from ecosystem scoring
  • GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

更多细节

Star 与 Fork 历史 0 ★ / 2 ⇿
0Star
2Fork

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

111222212026-052026-052026-05
OpenSSF Scorecard 6.5 / 10
6.5综合

来自开源项目 OpenSSF Scorecard 的独立、工具无关的安全评估。每项检查奖励的是安全实践本身,而非特定供应商的工具。Scorecard 无法判定的检查项标记为 不适用,并从安全评分中剔除(绝不按零分计)。Scorecard v5.5.0 · 2026-08-03 13:43 UTC

10Binary-Artifactsno binaries found in the repo
0Branch-Protectionbranch protection not enabled on development/release branches
10CI-Tests16 out of 16 merged PRs checked by a CI test -- score normalized to 10
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
0Code-ReviewFound 0/30 approved changesets -- score normalized to 0
10Contributorsproject has 3 contributing companies or organizations -- score normalized to 10
10Dangerous-Workflowno dangerous workflow patterns detected
10Dependency-Update-Toolupdate tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
10Maintained30 commit(s) and 30 issue activity found in the last 90 days -- score normalized to 10
10Packagingpackaging workflow detected
9Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 9
0SASTSAST tool is not run on all commits -- score normalized to 0
10Security-Policysecurity policy file detected
8Signed-Releases5 out of the last 5 releases have a total of 5 signed artifacts.
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
10Vulnerabilities0 existing vulnerabilities detected
直接依赖 24
注册表软件包版本约束清单文件
Gocharm.land/bubbles/v2v2.1.1go.mod
Gocharm.land/bubbletea/v2v2.0.8go.mod
Gocharm.land/glamour/v2v2.0.1go.mod
Gocharm.land/lipgloss/v2v2.0.5go.mod
Gogithub.com/adrg/xdgv0.5.3go.mod
Gogithub.com/alecthomas/chroma/v2v2.27.0go.mod
Gogithub.com/anthropics/anthropic-sdk-gov1.61.0go.mod
Gogithub.com/charmbracelet/x/ansiv0.11.7go.mod
Gogithub.com/fsnotify/fsnotifyv1.10.1go.mod
Gogithub.com/gabriel-vasile/mimetypev1.4.15go.mod
Gogithub.com/github/copilot-sdk/gov1.0.8go.mod
Gogithub.com/google/go-github/v89v89.0.0go.mod
Gogithub.com/mark3labs/mcp-gov0.57.0go.mod
Gogithub.com/mattn/go-runewidthv0.0.27go.mod
Gogithub.com/pelletier/go-toml/v2v2.4.3go.mod
Gogithub.com/sabhiram/go-gitignorev0.0.0-20210923224102-525f6e181f06go.mod
Gogithub.com/sahilm/fuzzyv0.1.3go.mod
Gogithub.com/spf13/cobrav1.10.2go.mod
Gogithub.com/stretchr/testifyv1.11.1go.mod
Gogithub.com/tetratelabs/wazerov1.12.0go.mod
Gogithub.com/yuin/gopher-luav1.1.2go.mod
Gogolang.org/x/sysv0.47.0go.mod
Gogopkg.in/yaml.v3v3.0.1go.mod
npmastro^7.1.6web/package.json
全部依赖 未采集

本报告未能采集到解析后的依赖集合:GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

原始 JSON 报告 机器可读
{
  "data": {
    "repo": {
      "topics": [
        "git",
        "terminal",
        "cli",
        "copilot",
        "developer-tools",
        "file-explorer",
        "git-client",
        "github",
        "terminal-ui",
        "tui",
        "dprun",
        "dx-idea"
      ],
      "is_fork": false,
      "size_kb": 29359,
      "has_wiki": true,
      "homepage": "https://jongio.github.io/grut/",
      "languages": {
        "Go": 5929192,
        "CSS": 5436,
        "Lua": 159,
        "Astro": 205618,
        "Shell": 17055,
        "Python": 7768,
        "Makefile": 111,
        "JavaScript": 9153,
        "PowerShell": 14958,
        "Go Template": 258
      },
      "pushed_at": "2026-08-03T07:10:11Z",
      "created_at": "2026-03-10T04:26:50Z",
      "owner_type": "User",
      "updated_at": "2026-08-03T07:11:11Z",
      "description": "A terminal file explorer with full Git and GitHub integration, AI chat, and reactive panels that stay in sync as you navigate.",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "MIT",
      "default_branch": "main",
      "license_spdx_raw": "MIT",
      "primary_language": "Go",
      "significant_languages": [
        "Go"
      ]
    },
    "owner": {
      "blog": "http://jongallant.com",
      "name": "Jon Gallant",
      "type": "User",
      "login": "jongio",
      "company": "Microsoft",
      "location": "Seattle, WA",
      "followers": 376,
      "avatar_url": "https://avatars.githubusercontent.com/u/2163001?v=4",
      "created_at": "2012-08-16T12:38:10Z",
      "is_verified": null,
      "public_repos": 56,
      "account_age_days": 5100
    },
    "license": {
      "state": "standard",
      "spdx_id": "MIT",
      "raw_spdx": "MIT",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v0.7.1",
          "kind": "patch",
          "published_at": "2026-07-25T05:11:02Z"
        },
        {
          "tag": "v0.7.0",
          "kind": "minor",
          "published_at": "2026-07-24T18:44:27Z"
        },
        {
          "tag": "v0.6.0",
          "kind": "minor",
          "published_at": "2026-07-21T22:01:07Z"
        },
        {
          "tag": "v0.5.0",
          "kind": "minor",
          "published_at": "2026-07-07T19:37:19Z"
        },
        {
          "tag": "v0.4.4",
          "kind": "patch",
          "published_at": "2026-06-26T06:39:15Z"
        },
        {
          "tag": "v0.4.3",
          "kind": "patch",
          "published_at": "2026-06-08T03:26:22Z"
        },
        {
          "tag": "v0.4.2",
          "kind": "patch",
          "published_at": "2026-06-03T20:53:36Z"
        },
        {
          "tag": "v0.4.1",
          "kind": "patch",
          "published_at": "2026-06-02T18:25:57Z"
        },
        {
          "tag": "v0.4.0",
          "kind": "minor",
          "published_at": "2026-05-27T04:25:27Z"
        },
        {
          "tag": "v0.3.3",
          "kind": "patch",
          "published_at": "2026-05-19T17:20:15Z"
        },
        {
          "tag": "v0.3.2",
          "kind": "patch",
          "published_at": "2026-05-19T12:55:46Z"
        },
        {
          "tag": "v0.3.0",
          "kind": "minor",
          "published_at": "2026-05-19T03:10:20Z"
        },
        {
          "tag": "v0.2.1",
          "kind": "patch",
          "published_at": "2026-05-18T13:57:59Z"
        },
        {
          "tag": "v0.1.2",
          "kind": "patch",
          "published_at": "2026-05-15T22:14:17Z"
        },
        {
          "tag": "v0.1.1",
          "kind": "patch",
          "published_at": "2026-05-14T16:43:48Z"
        },
        {
          "tag": "v0.1.0",
          "kind": "minor",
          "published_at": "2026-05-11T13:48:37Z"
        },
        {
          "tag": "v0.0.4",
          "kind": "patch",
          "published_at": "2026-03-23T23:50:09Z"
        },
        {
          "tag": "v0.0.1",
          "kind": "patch",
          "published_at": "2026-03-19T20:37:10Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "4913b085accc7827e3d445c53949f3bee3666f8e",
          "body": null,
          "is_bot": true,
          "headline": "perf: update baselines [skip ci]",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-08-03T07:10:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d86227c76fc80fcb67bafadce7e8ea39573949c8",
          "body": null,
          "is_bot": true,
          "headline": "perf: update baselines [skip ci]",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-08-03T05:01:12Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6c6fb0cf9406fa143f5237fd4e1c029999c1d7a7",
          "body": "Closes #387\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>",
          "is_bot": false,
          "headline": "feat(clean): add --check flag to fail when cleanup is pending (#395)",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-08-03T04:50:02Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "cd131d0285307003fecf5016b56b477b76f292c2",
          "body": null,
          "is_bot": true,
          "headline": "perf: update baselines [skip ci]",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-08-02T17:42:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4942478ca07568db74edc497e598b9ad616d5d59",
          "body": "Closes #381\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>",
          "is_bot": false,
          "headline": "feat(doctor): add --check flag for quiet health gate (#394)",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-08-02T17:31:10Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "b115391ab3566308145d218d830386e80c72988f",
          "body": null,
          "is_bot": true,
          "headline": "perf: update baselines [skip ci]",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-08-02T15:56:22Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bcffaf96eaa03ecc9559fd79f393b43e25db70b1",
          "body": "Closes #389\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>",
          "is_bot": false,
          "headline": "feat(theme): add --filter flag to theme list (#393)",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-08-02T15:45:14Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "b966f636b8fbf125d1e9c99b2b057086fa67727e",
          "body": null,
          "is_bot": true,
          "headline": "perf: update baselines [skip ci]",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-08-01T19:21:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fb8345f751ea93f67c8bcbd9b0cd856f3c3c636a",
          "body": "Go:\n- github.com/buger/jsonparser: v1.2.0 -> v1.6.1\n- github.com/yuin/goldmark: v1.8.4 -> v1.8.5\n- github.com/charmbracelet/ultraviolet: 20260720091822 -> 20260730003005\n- github.com/charmbracelet/x/exp/golden: 20260720091843 -> 20260730164118\n- github.com/charmbracelet/x/exp/slice: 20260720091843 -\n[…]\nort zero\nvulnerabilities. astro check and astro build pass for the web site.\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>\nCopilot-Session: 322b4a6b-6ff1-4af4-a0e5-ee8f09b78c2c",
          "is_bot": false,
          "headline": "deps: update dependencies to latest (#392)",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-08-01T19:10:19Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "16240036dd0492a89dc07a14e5e3290a67c62a5b",
          "body": null,
          "is_bot": true,
          "headline": "perf: update baselines [skip ci]",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-31T14:45:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1ef070e0ead909646844145966e7f440ae923c03",
          "body": "* Allow report show to use short IDs\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>\nCopilot-Session: e02217cd-ffed-496e-b8ea-848a781cda64\n\n* fix: remove unreachable crashlog.Read after short-ID lookup\n\nrunReportShow now resolves reports through List plus findCrashReport, so Re\n[…]\n26e7a44f1ed\n\n---------\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>\nCopilot-Session: e02217cd-ffed-496e-b8ea-848a781cda64\nCopilot-Session: 66a101e5-8e3c-41f0-bcf4-e26e7a44f1ed",
          "is_bot": false,
          "headline": "Allow crash reports to be shown by short ID (#376)",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-07-31T14:34:03Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "d2b72b441632059dbf7e687911804d3104c1bb85",
          "body": null,
          "is_bot": true,
          "headline": "perf: update baselines [skip ci]",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-31T06:01:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1fcc295a348b66bbb27f12e6740fc8b2d541c203",
          "body": "* Add JSON output to config check\n\nCloses #378\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>\n\nCopilot-Session: 3f892a21-0f5d-41e7-aebb-afbda057615d\n\n* fix(config): print config path when keymap load fails\n\nThe JSON refactor dropped the \"Config: <path>\" line from the text\noutp\n[…]\n72d43653508\n\n---------\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>\nCopilot-Session: 3f892a21-0f5d-41e7-aebb-afbda057615d\nCopilot-Session: 951180a3-9772-4cf6-8e49-372d43653508",
          "is_bot": false,
          "headline": "Add JSON output to config check (#383)",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-07-31T05:50:29Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "433a3b04ed02005d0491ef0f667e53d80aacddad",
          "body": "Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>\n\nCopilot-Session: 340b4dd3-b4b3-4f1a-9163-66b16d96fa81",
          "is_bot": false,
          "headline": "config: add JSON path output (#369)",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-07-31T05:49:14Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "edf5d4af2422e7317231d8eacf50e02d2626441c",
          "body": null,
          "is_bot": true,
          "headline": "perf: update baselines [skip ci]",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-27T16:34:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "dd8725af820d23b6bc5b09b51249a72ef0589432",
          "body": "Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>\nCopilot-Session: e02217cd-ffed-496e-b8ea-848a781cda64",
          "is_bot": false,
          "headline": "Add JSON output to clean command (#374)",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-07-27T16:22:34Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "e849a63d6f537927250fe38eca65ec946ba15ed7",
          "body": "Closes #379\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>\n\nCopilot-Session: 3f892a21-0f5d-41e7-aebb-afbda057615d",
          "is_bot": false,
          "headline": "Show resolved theme details (#384)",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-07-27T16:22:26Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "340b3a5cd37546d1ce842ea4c46b9771451f494e",
          "body": "Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>\n\nCopilot-Session: 340b4dd3-b4b3-4f1a-9163-66b16d96fa81",
          "is_bot": false,
          "headline": "mcp: filter tool inventory (#368)",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-07-27T16:22:18Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "51ebd2d7ce20ff10a7694a8038ae2277a30c123c",
          "body": "Closes #380\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>\n\nCopilot-Session: 3f892a21-0f5d-41e7-aebb-afbda057615d",
          "is_bot": false,
          "headline": "Filter keybindings by section (#385)",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-07-27T16:22:10Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "af02cc2168bb2d43db811b803e7487c73fd8513e",
          "body": "Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>\n\nCopilot-Session: 340b4dd3-b4b3-4f1a-9163-66b16d96fa81",
          "is_bot": false,
          "headline": "status: add dirty worktree check (#367)",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-07-27T16:22:01Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "888c157d6397db38a1fbf2b451941ba684e6e335",
          "body": "Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>\nCopilot-Session: e02217cd-ffed-496e-b8ea-848a781cda64",
          "is_bot": false,
          "headline": "Write completions to output files (#375)",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-07-27T16:19:56Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "0ea863518045b92a68e3891128862b5b38e1c03c",
          "body": null,
          "is_bot": true,
          "headline": "perf: update baselines [skip ci]",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-27T14:27:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e95d0e5e9dedfab09c344308d174fae76cf106c7",
          "body": "* deps: update dependencies to latest\n\n- actions/checkout: v7.0.0 -> v7.0.1\n- goreleaser: v2.16.0 -> v2.17.0\n- playwright: 1.61.1 -> 1.62.0\n- golang.org/x/exp: 20260709172345 -> 20260718201538\n- charmbracelet/x/exp/golden: 20260705004817 -> 20260720091843\n- @emnapi/core, @emnapi/runtime: 1.11.2 -> 1\n[…]\ngithub.com>\nCopilot-Session: 2127a7a3-47c9-410a-9f75-7eaf08125751\n\n---------\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>\nCopilot-Session: 2127a7a3-47c9-410a-9f75-7eaf08125751",
          "is_bot": false,
          "headline": "deps: update dependencies to latest (#377)",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-07-27T14:15:11Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "07d4f6256c59120fd2a62b9c2ffd238fc9aecb83",
          "body": null,
          "is_bot": true,
          "headline": "perf: update baselines [skip ci]",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-27T07:10:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e810a8b830a7e876e777a296b17cf267a2f88187",
          "body": null,
          "is_bot": true,
          "headline": "perf: update baselines [skip ci]",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-25T05:00:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8c3dc6fe07a2d13fcebfcc5235cf7a16dd2a8b8c",
          "body": "…e crashes (#370)\n\n* fix(gitinfo): pick workflow-dispatch inputs and stop command-goroutine crashes\n\nPrompt for each workflow_dispatch input in turn: choice and boolean\ninputs are picked from their valid values (preselected on the workflow\ndefault), and free-form inputs are pre-filled with the defau\n[…]\ngithub.com>\nCopilot-Session: b9a3d924-7b48-4000-9d4d-fb592f3485b6\n\n---------\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>\nCopilot-Session: b9a3d924-7b48-4000-9d4d-fb592f3485b6",
          "is_bot": false,
          "headline": "fix(gitinfo): pick workflow-dispatch inputs and stop command-goroutin…",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-07-25T04:49:44Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "87f3fa295472eb51ac9e17b8236d5f32aecca50a",
          "body": null,
          "is_bot": true,
          "headline": "perf: update baselines [skip ci]",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-24T21:49:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "08b2e8140b3a6920540e65da35ca33027829c10e",
          "body": null,
          "is_bot": false,
          "headline": "deps: update all dependencies to latest versions (#363)",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-07-24T21:38:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2210af7f96b77b6cebd1e3c089a08c705b9be674",
          "body": null,
          "is_bot": true,
          "headline": "perf: update baselines [skip ci]",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-24T18:26:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ed211f09f1ee187a9074bc69cf38f8db732231d5",
          "body": "TestShellInvocationForGOOS_WindowsPowerShellVariants forced goos=windows with a backslash path, but shellInvocationForGOOS uses filepath.Base (host-separator dependent), so on Linux/macOS CI the path wasn't reduced to pwsh.exe and the case failed. Production always calls with goos==runtime.GOOS, so \n[…]\noos test. The bare shell-name variants already cover the PowerShell branch.\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>\n\nCopilot-Session: 51e674dd-2361-4070-b223-21f7d08b972c",
          "is_bot": false,
          "headline": "test(customactions): drop non-portable Windows pwsh path case",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-07-24T18:14:43Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "11bec0fba75323463e1369f857cf08aca33d6c4f",
          "body": "th fix: filled the three genuinely low-coverage app packages surfaced by a test-health audit.\n\n- overlayreg: 0% -> 91.7% (factory panel constructors + custom-action copy semantics + all fuzzy-finder modes)\n\n- customactions: 25.9% -> 100% (Run success/failure/exit-code/cancel + shell-invocation branc\n[…]\nions to keep the new tests goconst-clean. All build/vet/lint/gofumpt clean.\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>\n\nCopilot-Session: 51e674dd-2361-4070-b223-21f7d08b972c",
          "is_bot": false,
          "headline": "test: raise coverage for overlayreg, customactions, and textsearch",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-07-24T18:00:38Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "45d843ae5aa5345f9ef8a1e36a34da445c217825",
          "body": null,
          "is_bot": true,
          "headline": "perf: update baselines [skip ci]",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-24T17:33:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "eac8642787333268498d1fd7dbfd672020bdf8c0",
          "body": "CI's TestSetupProjectWithConflictScenario failed on Windows because the conflict setup silently ignored git errors (_ =), so a failing command produced a repo without the expected conflict and a later identity-less merge exited 128. Now buildGitHistory's conflict-critical git commands are error-chec\n[…]\ne merge diagnostic now includes git output to pinpoint any remaining cause.\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>\n\nCopilot-Session: 51e674dd-2361-4070-b223-21f7d08b972c",
          "is_bot": false,
          "headline": "fix(demo): surface git errors and set identity in demo scenario setup",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-07-24T17:21:00Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "18697813a22cc0bee13b31ff6605259f4b197b65",
          "body": "CI 'Check modules tidy' failed because go.sum was missing transitive hashes (e.g. github.com/MakeNowJust/heredoc). Regenerated with go mod tidy.\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>\n\nCopilot-Session: 51e674dd-2361-4070-b223-21f7d08b972c",
          "is_bot": false,
          "headline": "chore: go mod tidy (add missing go.sum hashes)",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-07-24T17:21:00Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "bc158fb3de1048e9fd78f08607a29a76f108f2e0",
          "body": null,
          "is_bot": true,
          "headline": "perf: update baselines [skip ci]",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-24T17:02:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "df00656dc7e10601406f112cf2e0a9de7c161557",
          "body": "Documentation-accuracy fixes from a doc-check audit against the current code:\n\n- configuration.md: add the [mcp.security] section (the whole block was\n  undocumented), including allowed_write_paths which is now enforced. Note that\n  socket_auth is reserved and not yet enforced (#174).\n- web configur\n[…]\n, `R` request reviewers,\n  not `f`/refresh) and list the shipped PR actions.\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>\nCopilot-Session: 51e674dd-2361-4070-b223-21f7d08b972c",
          "is_bot": false,
          "headline": "docs: document MCP security and fix config/keybinding drift (doc-check)",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-07-24T16:14:40Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "90df2169c7a05e4e15769ba7da3f26040eecd982",
          "body": "…R checkout, DoS)\n\nSecurity and robustness fixes surfaced by a deep max-quality + red-team pass over\nthe ~50 features shipped in the last week:\n\n- mcp: enforce mcp.security.allowed_write_paths on file_write. The option was\n  validated and stored but never consulted by any write tool, so it was a no-\n[…]\nolangci-lint, gofumpt,\ngovulncheck, and the full `go test ./...` suite pass.\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>\nCopilot-Session: 51e674dd-2361-4070-b223-21f7d08b972c",
          "is_bot": false,
          "headline": "fix: harden last-week features (symlink exfil, MCP write allowlist, P…",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-07-24T16:14:17Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "938f9f39d5d5ce956114ccc898278f1136e45271",
          "body": "Section 9 (final) of the swarm backlog, implemented as two sequential commits\nin one integration worktree (zero merge conflicts):\n\n- #288 feat: user-defined custom actions. New [[custom_actions]] config\n  (name, command, cwd, key, prompt, confirm) parsed into a dedicated\n  internal/customactions pac\n[…]\nok), diff-scoped\nemoji scan, and binary smoke (including NO_COLOR) all pass.\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>\nCopilot-Session: 48b0e4d0-26ca-4355-9957-777a9d00d8b3",
          "is_bot": false,
          "headline": "swarm: resolve config/theme issues (#288, #193)",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-07-24T01:26:15Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "b74eba03552d807f47c67376052445c876d8daea",
          "body": "Add theme.color_mode resolution with NO_COLOR-aware mono mode, stable status markers, and a help overlay legend for color-safe state reading.\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>\nCopilot-Session: 48b0e4d0-26ca-4355-9957-777a9d00d8b3",
          "is_bot": false,
          "headline": "feat: add color-safe mode and status legend (#193)",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-07-24T01:20:30Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "f743386ae2c3b143b338d96ceed116654d8df9e3",
          "body": "Add config-driven shell actions with palette entries, optional keys, confirmation prompts, and async execution through the process-tree runner.\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>\nCopilot-Session: 48b0e4d0-26ca-4355-9957-777a9d00d8b3",
          "is_bot": false,
          "headline": "feat: add user-defined custom actions (#288)",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-07-24T00:51:56Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "5e18678c95faf55bfbaf06f74cce5e0d560e5d60",
          "body": "Section 8 of the swarm backlog, implemented as three sequential commits in\none integration worktree (zero merge conflicts):\n\n- #243 feat: send current file, diff, or commit to Copilot chat with an\n  explain key. New panels.AIExplainMsg; preview builds a context-aware\n  prompt (file / diff / commit) \n[…]\n suite (all packages ok), diff-scoped\nemoji scan, and binary smoke all pass.\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>\nCopilot-Session: 48b0e4d0-26ca-4355-9957-777a9d00d8b3",
          "is_bot": false,
          "headline": "swarm: resolve 3 TUI navigation/AI/search issues (#243, #205, #208)",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-07-24T00:26:46Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "6f86de5fa20692107abcb979deeab96482b3d8e4",
          "body": "Add a repository text search overlay backed by git grep, with capped results, line-aware file selection, and command palette/keybinding documentation.\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>\nCopilot-Session: 48b0e4d0-26ca-4355-9957-777a9d00d8b3",
          "is_bot": false,
          "headline": "feat: add repo-wide text search overlay (#208)",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-07-24T00:17:31Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "bcca9563c275c3e50daa870833ec87e27e1f829e",
          "body": "Track TUI selection contexts for files, commits, branches, issues, PRs, and workflows. Add Alt+Left/Alt+Right actions that restore saved selections through the existing panel engine and reset history on directory changes.\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>\nCopilot-Session: 48b0e4d0-26ca-4355-9957-777a9d00d8b3",
          "is_bot": false,
          "headline": "feat: add back/forward navigation history (#205)",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-07-23T23:43:28Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "a9b79027df21cd94851d67b5d08af10d3628c0e2",
          "body": "… key (#243)\n\nAdd an explain-this action for preview content and commit selections that builds bounded prompts and opens the AI chat automatically.\nDocument the keybinding and cover file, diff, and commit prompt construction with unit tests.\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>\nCopilot-Session: 48b0e4d0-26ca-4355-9957-777a9d00d8b3",
          "is_bot": false,
          "headline": "feat: send current file, diff, or commit to Copilot chat with explain…",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-07-23T23:14:05Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "159dcd26b109fc8fa7ffab77216dae36b4796176",
          "body": "Section 7 of the swarm backlog (GitHub II cluster), developed sequentially in\none integration worktree and validated as a unit.\n\n- #245 feat: filter GitHub issues and PRs with / (incremental client-side\n  title/number filter on the Issues and PRs tabs; composes with state filters;\n  empty \"no matche\n[…]\n issues), full test suite,\nmage deadcode, emoji scan, binary smoke all pass.\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>\nCopilot-Session: 48b0e4d0-26ca-4355-9957-777a9d00d8b3",
          "is_bot": false,
          "headline": "swarm: resolve 3 GitHub II issues (#245, #202, #212)",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-07-23T22:09:14Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "3b033683d3e5ed5c2334f871ed66f5cf514a3a44",
          "body": "Add a preview-panel PR diff comment composer that routes review comment requests through the GitHub panel, posts line-anchored review comments when possible, falls back to PR comments without line data, and refreshes the preview after posting. Closes #212\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>\nCopilot-Session: 48b0e4d0-26ca-4355-9957-777a9d00d8b3",
          "is_bot": false,
          "headline": "feat: post PR review comments from the GitHub panel",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-07-23T21:34:34Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "733d05a2872b5609cec1899f7cfc2fe6fbf39c97",
          "body": "Add a read-only release compare action that compares a selected release against the next older release tag, then drives preview, file tree, and commits panels with the resulting range.\n\nCloses #202\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>\nCopilot-Session: 48b0e4d0-26ca-4355-9957-777a9d00d8b3",
          "is_bot": false,
          "headline": "feat: compare releases with the previous tag",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-07-23T21:03:49Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "1679f916a57f5abfc358a3261fcf97992d2a1793",
          "body": "Enable the existing incremental list filter for GitHub Issues and Pull Requests, and keep it applied when loaded GitHub rows are rebuilt.\\n\\nUpdate keybinding docs and add coverage for GitHub filter matching, cursor clamping, empty states, and filtered selection.\\n\\nCloses #245\\n\\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>\\nCopilot-Session: 48b0e4d0-26ca-4355-9957-777a9d00d8b3",
          "is_bot": false,
          "headline": "feat: filter GitHub issues and PRs with /",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-07-23T20:29:10Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "5e2a2bd53cdc2729f4e7144ad45ab99723d78ced",
          "body": "Section 6 of the swarm backlog: GitHub panel improvements.\n\n#201: retain last-good GitHub tab data when a refresh fails, mark the\nsection stale with a last-updated age, and show one warning toast per\nrefresh burst instead of blanking the panel.\n\n#200: check out a pull request from the PRs tab with `\n[…]\nnterval until the\nrun reaches a terminal state, with a capped 100-line tail.\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>\nCopilot-Session: 48b0e4d0-26ca-4355-9957-777a9d00d8b3",
          "is_bot": false,
          "headline": "swarm: resolve 3 GitHub I issues (#201, #200, #192)",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-07-23T19:55:16Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "29312734d6eaba75b3ffdddc06953d1e2440dbf3",
          "body": "Add a documented Actions-tab live log follow toggle plus pause/resume controls.\nFresh log fetches bypass the 30s cache on a 3s loop until the run reaches a terminal state.\nFollow updates replace the preview log tail, auto-scroll to the newest lines, and keep the 100-line truncation cap.\nPreview jump/copy keys (g/G/y) continue to work for followed logs.\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>\nCopilot-Session: 48b0e4d0-26ca-4355-9957-777a9d00d8b3",
          "is_bot": false,
          "headline": "feat: add live GitHub Actions log follow mode (#192)",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-07-23T19:42:46Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "53097fd14f5f6af3b4ab6c5be6a44b5272c45e5c",
          "body": "Pressing c on the PRs tab now opens a current/sibling worktree picker.\nFetch PR heads through origin pull/N/head for same-repo and fork PRs without fork remotes.\nRefuse dirty current-worktree checkouts while allowing sibling worktrees and refreshing panels.\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>\nCopilot-Session: 48b0e4d0-26ca-4355-9957-777a9d00d8b3",
          "is_bot": false,
          "headline": "feat: check out pull requests from the GitHub panel (#200)",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-07-23T19:12:07Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "afd33ce2ddb9ddb7313abcd43f410cdde3507aa7",
          "body": "Retain prior successful GitHub tab rows when page refreshes fail, mark those sections stale, and show a last-updated age in the active tab/header.\nDeduplicate stale refresh warnings to one toast per refresh burst while keeping cached previews display-only.\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>\nCopilot-Session: 48b0e4d0-26ca-4355-9957-777a9d00d8b3",
          "is_bot": false,
          "headline": "fix: retain last-good GitHub data on refresh failure (#201)",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-07-23T18:29:43Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "f1b67aab16c1a0a5f3147a22dab9c661796c838c",
          "body": "Section 5 of the issue-backlog swarm. Two features on the Git Info panel,\nimplemented sequentially in one integration worktree.\n\n#242 - Filter Git Info lists with /: incremental case-insensitive filter on\nthe git-side list tabs (branches, tags, remotes, stash, worktrees, reflog,\nsubmodules), mirrori\n[…]\nhows in the status\nbar; a deleted or missing base warns instead of breaking.\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>\nCopilot-Session: 48b0e4d0-26ca-4355-9957-777a9d00d8b3",
          "is_bot": false,
          "headline": "swarm: resolve 2 Git Info II issues (#242, #204)",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-07-23T17:15:16Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "db83abb37cc7973e32c128b351870a1625be547f",
          "body": "Add a compare-base action to the Git Info branches flow: press `=` on a\nbranch, remote branch, or tag to pin it as the active diff base (press\nagain to clear). The file-tree branch-diff toggle and preview diffs then\ncompare against the pinned base instead of the configured default. The\nactive base i\n[…]\n deleted or missing base is\nhandled with a warning instead of a broken diff.\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>\nCopilot-Session: 48b0e4d0-26ca-4355-9957-777a9d00d8b3",
          "is_bot": false,
          "headline": "feat(gitinfo): pin a compare base for branch diff mode (#204)",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-07-23T16:20:21Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "3fa03d278d4389b584b143009fe23edc633a5a2d",
          "body": "Add an incremental `/` filter to the Git Info git-side list tabs\n(branches, tags, stash, remotes, worktrees, reflog, submodules),\nmirroring the gitlog search pattern. Live case-insensitive substring\nnarrowing, cursor clamping on the filtered list, Escape to exit and\nrestore, Enter to keep the filter\n[…]\nd (their\nown `f` filter is unchanged; `/` for GitHub is tracked separately).\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>\nCopilot-Session: 48b0e4d0-26ca-4355-9957-777a9d00d8b3",
          "is_bot": false,
          "headline": "feat(gitinfo): add / incremental filter to git list tabs (#242)",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-07-23T15:55:09Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "3246aaeaf902d6da573cacbd5a36f6560924ce28",
          "body": "Section 4 (Git Info I):\n\n- #287 Submodules overview tab in Git Info (git submodule status parsing,\n  conditional tab, path/commit/state rows, preview details, empty message)\n- #286 In-memory git command log with bounded storage + credential\n  redaction, exposed via a read-only scrollable ctrl+g TUI \n[…]\nll-with-rebase, and push sync actions with\n  confirmations and notifications\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>\nCopilot-Session: 48b0e4d0-26ca-4355-9957-777a9d00d8b3",
          "is_bot": false,
          "headline": "swarm: resolve 3 Git Info issues (#287, #286, #213)",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-07-23T14:43:11Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "2cb0eb1d34136a9602c382df5cfd23555d9fde6d",
          "body": "The submodules mock method is test-only, like the other MockClient\nmethods already in the deadcode allowlist.\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>\nCopilot-Session: 48b0e4d0-26ca-4355-9957-777a9d00d8b3",
          "is_bot": false,
          "headline": "chore(mage): allowlist MockClient.Submodules in deadcode (#287)",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-07-23T02:55:25Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "a4ea144286001cf282a4b36e174da19b1e838ad6",
          "body": "…nc actions (#213)\n\nShow upstream names and ahead/behind state in branch rows, with diverged branches marked distinctly. Add confirm-gated pull, pull --rebase, and push actions for local branches with success/error notifications and reload-backed count refresh. Cover no-upstream, ahead-only, behind-only, diverged, request, modal, and reload behavior with tests.\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>\nCopilot-Session: 48b0e4d0-26ca-4355-9957-777a9d00d8b3",
          "is_bot": false,
          "headline": "feat(gitinfo): show branch upstream/ahead-behind and add pull/push sy…",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-07-23T02:44:13Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "9ce1267c848fa5d89519121c00d6cd18a2d9ea8a",
          "body": "Record all git client executions through runWithEnv into a bounded, thread-safe shared command log. Redact credentials and token-like values before storing entries, and expose a read-only scrollable TUI overlay with a global keybinding. Add coverage for recording, redaction, trimming, client integration, overlay rendering, and TUI toggling.\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>\nCopilot-Session: 48b0e4d0-26ca-4355-9957-777a9d00d8b3",
          "is_bot": false,
          "headline": "feat(git): add in-memory command log with TUI overlay (#286)",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-07-23T02:04:45Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "df3efd20b6b0e56d86e1c8de417a7e54ee77245d",
          "body": "Add git submodule status parsing, expose submodule operations through the git client interfaces, render a conditional Submodules tab with path/commit/state rows, and show selected submodule details in preview. Cover parser, tab rendering, row state, and preview behavior with tests.\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>\nCopilot-Session: 48b0e4d0-26ca-4355-9957-777a9d00d8b3",
          "is_bot": false,
          "headline": "feat(gitinfo): add submodules overview tab (#287)",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-07-23T00:13:57Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "5ca121169d47634cdfd590fa736f53dfa7b25918",
          "body": "Section 3 (Preview cluster) resolved in one integration worktree:\n\n- #210 feat(preview): show archive manifest without extracting (zip/tar/tar.gz/tgz)\n- #203 feat(preview): add in-panel search with Ctrl+F and n/N navigation\n- #315 feat(preview): wire blame end-to-end and jump a blame line's commit into the Commits panel\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>\nCopilot-Session: 48b0e4d0-26ca-4355-9957-777a9d00d8b3",
          "is_bot": false,
          "headline": "swarm: resolve 3 preview issues (#210, #203, #315)",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-07-22T22:56:05Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "a3dba12af013652ea1b75a0444a665218b8a0b1b",
          "body": "…t (#315)\n\nWire ToggleBlameMsg -> async git blame -> BlameLoadedMsg in the tui, then\nadd preview key 'o' to open the current blame line's commit in the Commits\npanel (focus + detail view). Uncommitted lines show a toast.\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>\nCopilot-Session: 48b0e4d0-26ca-4355-9957-777a9d00d8b3",
          "is_bot": false,
          "headline": "feat(preview): wire blame end-to-end and jump blame line to its commi…",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-07-22T22:18:23Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "ec83253ff1a954af9cdc3ea0ba340298e29cba3e",
          "body": "Adds preview-local search state, ANSI-aware highlighting, footer counts, and n/N match navigation for rendered file, diff, GitHub, and blame buffers. Updates keybinding metadata/docs and adds targeted preview search tests.\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>\nCopilot-Session: 48b0e4d0-26ca-4355-9957-777a9d00d8b3",
          "is_bot": false,
          "headline": "feat(preview): add in-panel search with Ctrl+F and n/N navigation (#203)",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-07-22T21:52:14Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "341275b51ce5df4acf847cfec37740304530a60c",
          "body": "Show read-only manifests for zip, tar, tar.gz, and tgz archives with capped entries, sizes, and modified times. Corrupt archives render a friendly preview error instead of falling through to binary metadata.\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>\nCopilot-Session: 48b0e4d0-26ca-4355-9957-777a9d00d8b3",
          "is_bot": false,
          "headline": "feat(preview): show archive manifest without extracting (#210)",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-07-22T21:33:43Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "e557055cee19f2ab011fc93910846a802a51a454",
          "body": "File tree cluster (Section 2 of the issue-backlog swarm):\n\n- #209 On-demand directory size scan (key D): async subtree walk, no\n  symlink follow, skips .git, cached until refresh, human-readable\n  right-aligned sizes preserving git-status markers.\n- #214 Move deletes to a per-repo trash with undo (k\n[…]\n.json, and the default/classic/vim schemes;\ndocs/keybindings.md regenerated.\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>\nCopilot-Session: 48b0e4d0-26ca-4355-9957-777a9d00d8b3",
          "is_bot": false,
          "headline": "swarm: resolve 3 file tree issues (#209, #214, #190)",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-07-22T20:23:22Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "fca0f3e49896be3287fdfd29059e954275c63ce4",
          "body": "Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>\nCopilot-Session: 48b0e4d0-26ca-4355-9957-777a9d00d8b3",
          "is_bot": false,
          "headline": "feat(filetree): add batch rename for selected entries (#190)",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-07-22T19:49:15Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "2d4f92a9e9c8d3a839dad14284faae14a386a391",
          "body": "Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>\nCopilot-Session: 48b0e4d0-26ca-4355-9957-777a9d00d8b3",
          "is_bot": false,
          "headline": "feat(filetree): move deletes to trash with undo (#214)",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-07-22T19:28:48Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "9d8e9492707de419184c7292df62327702be6339",
          "body": "Scan selected directories asynchronously and cache human-readable sizes until the tree refreshes. Render cached sizes alongside existing git status markers without following symlinks or descending into .git.\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>\nCopilot-Session: 48b0e4d0-26ca-4355-9957-777a9d00d8b3",
          "is_bot": false,
          "headline": "feat(filetree): add on-demand directory size scan (#209)",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-07-22T19:13:37Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "44c26d0a951ec37408ddc10ce33ba3623d46e83c",
          "body": "Closes #290: Validate extension projects before install\nCloses #296: Print resolved config and data paths with a config path command\nCloses #289: Add a doctor command for environment checks\nCloses #291: Add guided scenarios to demo mode\n\nQuality: build, vet, golangci-lint, gofumpt, full test suite (\n[…]\ncluster E - CLI) | Agents: 4 | Conflicts resolved: 1 (docs/configuration.md)\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>\nCopilot-Session: 48b0e4d0-26ca-4355-9957-777a9d00d8b3",
          "is_bot": false,
          "headline": "swarm: resolve 4 CLI issues (#290, #296, #289, #291)",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-07-22T18:02:48Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "8dc9d9c6d7287fb2d464aa3458a082e8e1fd0203",
          "body": "SetupProject is only referenced by cmd/screenshots/main.go behind the\n//go:build screenshots tag; the wired demo API is SetupProjectWithOptions.\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>\nCopilot-Session: 48b0e4d0-26ca-4355-9957-777a9d00d8b3",
          "is_bot": false,
          "headline": "chore(mage): allowlist demo.SetupProject deadcode false positive",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-07-22T17:48:07Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "e46f9fe28562b35075f1c7c6362ffd73e4925389",
          "body": null,
          "is_bot": false,
          "headline": "Merge #291: guided demo scenarios",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-07-22T17:37:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6af5e58965b79b7358a3dce953284ff997e19111",
          "body": "Adds branch-review, conflict-resolution, and extensions scenarios behind the existing --demo flow. Scenario guidance is written into .grut/demo-scenario.md and opened in preview so the walkthrough is visible inside the TUI without adding a new overlay surface.\n\nThe conflict scenario resets tracked c\n[…]\nkeeps the generated repository and prints its path for local repro sharing.\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>\n\nCopilot-Session: 48b0e4d0-26ca-4355-9957-777a9d00d8b3",
          "is_bot": false,
          "headline": "feat(demo): add guided scenarios to demo mode (#291)",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-07-22T17:36:46Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "17f3fca054d366e1f0b82c5e1ebf9d4083ad22e5",
          "body": "# Conflicts:\n#\tdocs/configuration.md",
          "is_bot": false,
          "headline": "Merge #289: doctor command",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-07-22T17:27:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a7258853fcf0fe2a1e6009e50beb8c97029f0947",
          "body": "Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>\n\nCopilot-Session: 48b0e4d0-26ca-4355-9957-777a9d00d8b3",
          "is_bot": false,
          "headline": "feat(cmd): add doctor command for environment health checks (#289)",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-07-22T17:25:52Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "80cbd9045effff1874b5bf7473f0697169071599",
          "body": null,
          "is_bot": false,
          "headline": "Merge #290: ext validate command",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-07-22T17:24:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fd0eb5a085095f4a99ee50b4fa022fefe19af7e9",
          "body": "Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>\n\nCopilot-Session: 48b0e4d0-26ca-4355-9957-777a9d00d8b3",
          "is_bot": false,
          "headline": "feat(ext): add ext validate command (#290)",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-07-22T17:23:33Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "1273174c3faa8d83e818a9ac277ea90c8a32afc6",
          "body": null,
          "is_bot": false,
          "headline": "Merge #296: config path command",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-07-22T17:21:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "88614ffe6aaed736f1ec1a192db5e9bf0b2bbd16",
          "body": "Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>\n\nCopilot-Session: 48b0e4d0-26ca-4355-9957-777a9d00d8b3",
          "is_bot": false,
          "headline": "feat(config): add config path command (#296)",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-07-22T17:20:29Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "6a994555950edb2f7b5c14fb1a7568c508439667",
          "body": null,
          "is_bot": true,
          "headline": "perf: update baselines [skip ci]",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-22T16:57:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9fbbaa87dfc6fee0e7d7323ddbba04d5f2aa1b8f",
          "body": "* fix(tui): capture panics and harden GitHub workflow dispatch\n\nDispatching a GitHub Actions workflow crashed the whole TUI with a\ngeneric \"program was killed: program experienced a panic\" and left no\ncrash report, because Bubble Tea catches panics in the model's\nUpdate/View, swallows the value, and\n[…]\nauthored-by: Copilot <223556219+Copilot@users.noreply.github.com>\nCopilot-Session: 2fe7a260-26ac-4066-8f4f-369ab6a38550\n\n---------\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>",
          "is_bot": false,
          "headline": "fix(tui): capture panics and harden GitHub workflow dispatch (#362)",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-07-22T16:46:45Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "5724f372a05d90a4f2437e5450293fa60e9f711f",
          "body": "The website CLI reference only covered version, update, mcp, run, and ext. Add the status, config, theme, keys, clean, completion, and report commands with accurate flags and subcommands, matching the recent releases.\n\nAlso correct the mcp section: the --socket flag returns 'not yet implemented', so\n[…]\nGRUT_NERD_FONT, GRUT_FORCE_TERMINAL). Verified with astro build (42 pages).\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>\n\nCopilot-Session: e1e7a2e9-8a0a-42dc-be96-9ac694fc55c5",
          "is_bot": false,
          "headline": "docs(web): document new CLI commands and fix stale MCP socket reference",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-07-21T23:01:31Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "9d299cccfeb9de64d92f3745a5ebf13667f8b7d2",
          "body": "README: add a Commands table covering status, config, theme, keys, clean, completion, run, ext, report, and mcp (all shipped recently but undocumented), and correct the Tech Stack Go version from 1.26.3 to 1.26.5 to match go.mod.\n\nconfiguration.md: add an Environment Variables section documenting GR\n[…]\n_FORCE_TERMINAL, which the code reads but were not in the config reference.\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>\n\nCopilot-Session: e1e7a2e9-8a0a-42dc-be96-9ac694fc55c5",
          "is_bot": false,
          "headline": "docs: document new CLI subcommands and env vars, fix stale Go version",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-07-21T22:41:52Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "dd1e564ebd16ae3105c34962a87dd4a8f8750001",
          "body": null,
          "is_bot": true,
          "headline": "perf: add v0.6.0 linux-amd64 baseline and release notes [skip ci]",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-21T21:57:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "38aeadb9ae667bb60e7b31bb8a3f06f98899178d",
          "body": null,
          "is_bot": true,
          "headline": "perf: update baselines [skip ci]",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-21T20:59:04Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e02e73933faa56276bb1aab719809826afa7942e",
          "body": "…L lookup\n\nThe commits panel spawned a raw 'git remote get-url origin' subprocess, and TestOpenCommitOnGitHubNoGitHubRemote relied on that subprocess failing in a temp dir to simulate 'no remote'. Under heavy parallel load (e.g. mage install) the subprocess result was non-deterministic, intermittent\n[…]\nessage, and add a non-github-remote case. Verified 200x under -parallel 32.\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>\n\nCopilot-Session: e1e7a2e9-8a0a-42dc-be96-9ac694fc55c5",
          "is_bot": false,
          "headline": "test(commits): de-flake openCommitOnGitHub by injecting the origin-UR…",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-07-21T20:46:46Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e7b07edbeaee70ce29ba99018ba0a58ba3819bfc",
          "body": null,
          "is_bot": true,
          "headline": "perf: update baselines [skip ci]",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-21T20:39:22Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6400577a3483bfea9aad85064412d036ae6af0c6",
          "body": "…ad pendingRevertSubject field\n\nMax-quality follow-up on the idea-PR backlog merges (PR-triage delta):\n\n- Add TestCopyLocalLocation_NoOpWhenNoFile/NoOpInGitHubMode to match the guard-test coverage its sibling preview actions (copyPermalink, openOnGitHub) already have.\n\n- Remove the write-only pendin\n[…]\ndingAndConfirms to assert the subject appears in the confirm modal message.\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>\n\nCopilot-Session: e1e7a2e9-8a0a-42dc-be96-9ac694fc55c5",
          "is_bot": false,
          "headline": "test(preview): add copyLocalLocation guard tests; chore(tui): drop de…",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-07-21T20:27:23Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "6272c4dc4d29fa7bc8f794b7dd5f76cb0fd85228",
          "body": null,
          "is_bot": true,
          "headline": "perf: update baselines [skip ci]",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-21T19:11:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "dc1e9a8133d18c2176bb0841ae672a9082a184f3",
          "body": "Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>",
          "is_bot": false,
          "headline": "feat: copy local file location (#293)",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-07-21T18:58:39Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "5732280a1bf2e86c65577f4993d9ba00b367ca2f",
          "body": "Add an O keybinding to the preview panel that opens the current file on\ngithub.com, pinned to the current HEAD commit and anchored to the selected\nline range (or the top visible line). It reuses the existing permalink\nbuilder and the browser launcher, and shows a clear toast when the preview\nis not \n[…]\ndings manifest, the generated\ndocs, and the help overlay. Adds unit tests for the no-file and github-mode\nguards.\n\nCloses #324\n\nCo-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>",
          "is_bot": false,
          "headline": "feat(preview): open the previewed file on GitHub (#329)",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-07-21T18:51:52Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "c543d31753e36ad4d01044c469fd72d104015521",
          "body": "grut only accepted a directory as its positional argument, so jumping to a\nspecific file meant opening grut and then navigating the tree by hand. Now\nthe argument can also name a file, optionally with a \":line\" suffix.\n\nPassing a file roots grut at that file's directory, selects it in the File\nTree,\n[…]\nilesystem. The last colon is used as the line\nseparator so Windows drive letters such as C:\\path are not misread.\n\nCloses #317\n\nCo-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>",
          "is_bot": false,
          "headline": "feat(cli): open a file at path and line from the command line (#321)",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-07-21T18:47:12Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "79ffb37cfc18dd3d8c92e6dd8e30e7b89a53b694",
          "body": "Press v on a commit in the Commits panel to revert it. grut shows a\nconfirm prompt with the commit subject, then runs git revert on the\nselected hash and reloads the commits, branches, and status views.\n\nThe revert is recorded as an undoable action: undo resets HEAD back to\nwhere it was before the r\n[…]\nHeadSHA runs first; if it fails, the revert\ndoes not run.\n\nCloses #340\n\n\nCopilot-Session: 07f6eb49-d72f-4f2a-9285-065b5d835f5b\n\nCo-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>",
          "is_bot": false,
          "headline": "feat(commits): revert the selected commit from the Commits panel (#350)",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-07-21T18:40:35Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "2f28092c306d5e00cb4922e7b97a63800d84f6bb",
          "body": "Press T to open a fuzzy finder over TODO, FIXME, HACK, BUG, and XXX\nmarkers across the working tree. Each entry shows file:line plus the\nmarker text; selecting one opens the file in the preview and jumps to\nthe line. The scanner walks the tree with the same hidden-dir and\n.gitignore filtering the fi\n[…]\n bound to todo_finder in the default, classic, and vim schemes\n- keybindings.json and docs/keybindings.md updated\n\nCloses #327\n\nCo-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>",
          "is_bot": false,
          "headline": "feat(fuzzyfinder): add TODO/FIXME finder source (#333)",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-07-21T18:38:46Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "2b37e7e97811569e1d563c28da05d99cda86cf1d",
          "body": "* feat(help): filter shortcuts in help overlay\n\nCloses #346\n\nCo-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>\n\n* fix(help): extract escape key constant and align close-hint test with filter footer\n\nFixes the goconst failure and the stale TestView_ContainsCloseHint assertion t\n[…]\nred-by: Copilot <223556219+Copilot@users.noreply.github.com>\n\nCopilot-Session: e1e7a2e9-8a0a-42dc-be96-9ac694fc55c5\n\n---------\n\nCo-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>",
          "is_bot": false,
          "headline": "Filter the help overlay by key or action (#351)",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-07-21T18:35:31Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "6c1a05a5ffa2545c4dfbf28d3a86517194aa4a16",
          "body": "Add an M keybinding in the file tree that opens the OS file manager with\nthe item under the cursor highlighted inside its parent directory. Works\nfor both files and directories.\n\nPlatform launchers live in internal/panels/open.go:\n- Windows: explorer /select,<path>\n- macOS: open -R <path>\n- Linux: f\n[…]\nhs pass through ValidateEditorPath, so shell metacharacters and null\nbytes are rejected before any launcher runs.\n\nCloses #313\n\nCo-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>",
          "is_bot": false,
          "headline": "feat(filetree): reveal selected file in OS file manager (#318)",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-07-21T18:27:08Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "dd95c5cdc2f2dabc223eb3473e403f1dfeac90b7",
          "body": "Add an `o` keybinding to the commits panel that opens the selected\ncommit's github.com page in the default browser. The commits panel\ncould copy a commit hash but had no way to jump straight to the commit\non GitHub, so reviewers had to build the URL by hand.\n\nThe handler resolves the origin remote, \n[…]\nkeybindings\nmanifest already documented `o` for this panel; this wires it up and\nregenerates docs/keybindings.md.\n\nCloses #328\n\nCo-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>",
          "is_bot": false,
          "headline": "feat(commits): open the selected commit on GitHub (#330)",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-07-21T18:23:48Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "28e66554292ead76aebb5ad1285f82fe93420eae",
          "body": "Add a `B` keybinding to the file tree that opens the entry under the\ncursor on github.com in the default browser, pinned to the current HEAD\ncommit. Files open at their blob URL and directories at their tree URL.\nThe tree could open files locally (editor, default app) but had no way\nto jump to the s\n[…]\nfault app) were already taken,\nso this uses `B` for browse. keybindings.json and docs/keybindings.md\nare updated.\n\nCloses #325\n\nCo-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>",
          "is_bot": false,
          "headline": "feat(filetree): open the selected file or directory on GitHub (#331)",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-07-21T18:22:30Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "f309b0975784cad6e71c7fd0e426660dc534adeb",
          "body": "Add Ctrl+G in the preview panel to create a secret GitHub gist from the\nfile currently on screen and copy the gist URL to the clipboard. This is\na fast way to share a single file without leaving the TUI.\n\nThe handler is a no-op for GitHub content or an empty view, matching the\nexisting permalink guard. A new github.CreateGist helper shells out to\ngh gist create --secret via the shared ghExec path.\n\nCloses #326\n\nCo-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>",
          "is_bot": false,
          "headline": "feat(preview): create a secret gist from the previewed file (#332)",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-07-21T18:21:11Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "fd5f17be99148b20ae28851b0c3e7e87fafaf6bb",
          "body": "Reading a long markdown file in the preview panel meant scrolling by hand\nto reach a section. Press \"t\" on a markdown file to open a heading list,\nmove the selection with j/k (or the arrows, g/G, home/end), and press\nEnter to scroll straight to that heading. Esc closes the list without\nmoving the vi\n[…]\natching the ansi-stripped heading text in document order. With\nrendering off the raw line index is used directly.\n\nCloses #316\n\nCo-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>",
          "is_bot": false,
          "headline": "feat(preview): jump to a markdown heading in the preview (#320)",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-07-21T18:19:38Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "d354ebd4010813daaa61a100bf850beb28b9425a",
          "body": "Closes #349\n\nCo-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>",
          "is_bot": false,
          "headline": "feat(github): show issue metadata in preview (#353)",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-07-21T18:17:00Z",
          "body_truncated": false,
          "is_coding_agent": true
        }
      ],
      "releases_count": 18,
      "commits_last_year": 438,
      "latest_release_at": "2026-07-25T05:11:02Z",
      "latest_release_tag": "v0.7.1",
      "releases_from_tags": false,
      "days_since_last_push": 0,
      "active_weeks_last_year": 18,
      "days_since_latest_release": 9,
      "mean_days_between_releases": 7.4
    },
    "artifacts": {
      "collected": true,
      "structure": [
        "tree.go_main",
        "tree.goreleaser"
      ],
      "declarations": []
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "readme_badges": {
        "hosts": [
          "github.com",
          "goreportcard.com",
          "pkg.go.dev",
          "shields.io"
        ],
        "total": 6,
        "header": 6,
        "collected": true,
        "has_inspect_badge": false
      },
      "has_description": true,
      "has_contributing": true,
      "health_percentage": 100,
      "has_issue_template": false,
      "has_code_of_conduct": true,
      "has_pull_request_template": true
    },
    "ecosystem": {
      "packages": [
        {
          "name": "github.com/jongio/grut",
          "exists": true,
          "license": null,
          "keywords": [],
          "ecosystem": "go",
          "categories": [],
          "matches_repo": true,
          "registry_url": "https://pkg.go.dev/github.com/jongio/grut",
          "declared_type": null,
          "is_deprecated": false,
          "latest_version": "v0.7.1",
          "repository_url": "https://github.com/jongio/grut",
          "versions_count": 23,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": null,
          "first_published_at": null,
          "latest_published_at": "2026-07-25T05:00:58Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 9
        },
        {
          "name": "web",
          "exists": true,
          "license": "MIT",
          "keywords": [],
          "ecosystem": "npm",
          "categories": [],
          "matches_repo": false,
          "registry_url": "https://www.npmjs.com/package/web",
          "declared_type": null,
          "is_deprecated": false,
          "latest_version": "0.0.2",
          "repository_url": "https://github.com/creationix/node-web",
          "versions_count": 3,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": 1,
          "monthly_downloads": 54428,
          "first_published_at": "2012-09-13T05:12:45.210000Z",
          "latest_published_at": "2013-01-31T19:50:36.663000Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 4931
        }
      ]
    },
    "popularity": {
      "forks": 2,
      "stars": 41,
      "watchers": 0,
      "fork_history": {
        "days": [
          {
            "date": "2026-05-06",
            "count": 1
          },
          {
            "date": "2026-05-07",
            "count": 1
          }
        ],
        "complete": true,
        "collected": 2,
        "total_forks": 2
      },
      "star_history": null,
      "open_issues_and_prs": 9
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [],
      "has_llms_txt": false,
      "has_dockerfile": false,
      "has_mcp_signal": false,
      "bootstrap_files": [
        "internal/extension/templates/wasm-go/Makefile"
      ],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [
        "web/tsconfig.json"
      ],
      "toolchain_manifests": [
        "go.mod"
      ],
      "largest_source_bytes": 191210,
      "source_files_sampled": 618,
      "oversized_source_files": 8,
      "agent_instruction_files": [
        ".github/copilot-instructions.md",
        "AGENTS.md"
      ],
      "agent_instruction_max_bytes": 3607
    },
    "dependencies": {
      "manifests": [
        "go.mod",
        "web/package.json"
      ],
      "advisories": {
        "error": null,
        "scope": null,
        "source": null,
        "findings": [],
        "collected": false,
        "malicious": [],
        "truncated": false,
        "by_severity": {},
        "advisory_count": 0,
        "affected_count": 0,
        "assessed_count": 0,
        "malicious_count": 0,
        "assessed_package": null,
        "unassessed_count": 0,
        "direct_affected_count": 0
      },
      "ecosystems": [
        "go",
        "npm"
      ],
      "dependencies": [
        {
          "name": "charm.land/bubbles/v2",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v2.1.1"
        },
        {
          "name": "charm.land/bubbletea/v2",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v2.0.8"
        },
        {
          "name": "charm.land/glamour/v2",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v2.0.1"
        },
        {
          "name": "charm.land/lipgloss/v2",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v2.0.5"
        },
        {
          "name": "github.com/adrg/xdg",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.5.3"
        },
        {
          "name": "github.com/alecthomas/chroma/v2",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v2.27.0"
        },
        {
          "name": "github.com/anthropics/anthropic-sdk-go",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.61.0"
        },
        {
          "name": "github.com/charmbracelet/x/ansi",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.11.7"
        },
        {
          "name": "github.com/fsnotify/fsnotify",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.10.1"
        },
        {
          "name": "github.com/gabriel-vasile/mimetype",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.4.15"
        },
        {
          "name": "github.com/github/copilot-sdk/go",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.0.8"
        },
        {
          "name": "github.com/google/go-github/v89",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v89.0.0"
        },
        {
          "name": "github.com/mark3labs/mcp-go",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.57.0"
        },
        {
          "name": "github.com/mattn/go-runewidth",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.0.27"
        },
        {
          "name": "github.com/pelletier/go-toml/v2",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v2.4.3"
        },
        {
          "name": "github.com/sabhiram/go-gitignore",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.0.0-20210923224102-525f6e181f06"
        },
        {
          "name": "github.com/sahilm/fuzzy",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.1.3"
        },
        {
          "name": "github.com/spf13/cobra",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.10.2"
        },
        {
          "name": "github.com/stretchr/testify",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.11.1"
        },
        {
          "name": "github.com/tetratelabs/wazero",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.12.0"
        },
        {
          "name": "github.com/yuin/gopher-lua",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.1.2"
        },
        {
          "name": "golang.org/x/sys",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.47.0"
        },
        {
          "name": "gopkg.in/yaml.v3",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v3.0.1"
        },
        {
          "name": "astro",
          "manifest": "web/package.json",
          "ecosystem": "npm",
          "version_constraint": "^7.1.6"
        }
      ],
      "all_dependencies": {
        "error": "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository",
        "source": null,
        "packages": [],
        "collected": false,
        "truncated": false,
        "total_count": null,
        "direct_count": null,
        "indirect_count": null
      }
    },
    "maintainership": {
      "issues": {
        "open_prs": 5,
        "merged_prs": 150,
        "open_issues": 4,
        "closed_ratio": 0.983,
        "closed_issues": 228,
        "closed_unmerged_prs": 11
      },
      "bus_factor": 1,
      "bot_contributors": 2,
      "top_contributors": [
        {
          "type": "User",
          "login": "jongio",
          "commits": 241,
          "avatar_url": "https://avatars.githubusercontent.com/u/2163001?v=4"
        }
      ],
      "contributors_sampled": 1,
      "top_contributor_share": 1
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "bench.yml",
        "ci.yml",
        "deploy-web.yml",
        "release.yml"
      ],
      "has_docs_dir": true,
      "linter_configs": [
        ".golangci.yml"
      ],
      "has_editorconfig": true,
      "has_linter_config": true,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [
        "go.sum",
        "package-lock.json"
      ],
      "scorecard": {
        "checks": [
          {
            "name": "Binary-Artifacts",
            "score": 10,
            "reason": "no binaries found in the repo",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
          },
          {
            "name": "Branch-Protection",
            "score": 0,
            "reason": "branch protection not enabled on development/release branches",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
          },
          {
            "name": "CI-Tests",
            "score": 10,
            "reason": "16 out of 16 merged PRs checked by a CI test -- score normalized to 10",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#ci-tests"
          },
          {
            "name": "CII-Best-Practices",
            "score": 0,
            "reason": "no effort to earn an OpenSSF best practices badge detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#cii-best-practices"
          },
          {
            "name": "Code-Review",
            "score": 0,
            "reason": "Found 0/30 approved changesets -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 10,
            "reason": "project has 3 contributing companies or organizations -- score normalized to 10",
            "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 30 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": 9,
            "reason": "dependency not pinned by hash detected -- score normalized to 9",
            "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": 10,
            "reason": "security policy file detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
          },
          {
            "name": "Signed-Releases",
            "score": 8,
            "reason": "5 out of the last 5 releases have a total of 5 signed artifacts.",
            "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": "4913b085accc7827e3d445c53949f3bee3666f8e",
        "ran_at": "2026-08-03T13:43:45Z",
        "aggregate_score": 6.5,
        "scorecard_version": "v5.5.0"
      },
      "has_codeql_workflow": false,
      "has_security_policy": true,
      "has_dependabot_config": true
    },
    "contribution_flow": {
      "collected": true,
      "recent_prs": {
        "merged_7d": 14,
        "decided_7d": 14,
        "merged_30d": 58,
        "authors_30d": 1,
        "decided_30d": 58,
        "sample_size": 60,
        "window_days": 30,
        "sample_exhausted": true,
        "authors_probed_30d": 1,
        "newcomer_merged_30d": 0,
        "bot_prs_excluded_30d": 2,
        "newcomer_authors_30d": 0,
        "newcomer_decided_30d": 0
      },
      "ci_last_run_at": null,
      "oldest_open_prs": [
        {
          "number": 396,
          "created_at": "2026-08-02T14:27:45Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 397,
          "created_at": "2026-08-02T14:28:13Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 398,
          "created_at": "2026-08-02T14:28:35Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 399,
          "created_at": "2026-08-02T14:28:58Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 400,
          "created_at": "2026-08-02T20:07:48Z",
          "last_comment_at": null,
          "last_comment_author": null
        }
      ],
      "last_merged_pr_at": "2026-08-03T04:50:02Z",
      "ci_last_conclusion": null,
      "oldest_open_issues": [
        {
          "number": 382,
          "created_at": "2026-07-26T17:49:21Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 388,
          "created_at": "2026-07-27T17:14:13Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 390,
          "created_at": "2026-07-27T17:14:15Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 391,
          "created_at": "2026-07-27T17:14:17Z",
          "last_comment_at": null,
          "last_comment_author": null
        }
      ]
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/jongio/grut",
    "host": "github.com",
    "name": "grut",
    "owner": "jongio"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "excellent",
      "name": "Overall health",
      "note": "The weighted overall 74 is calibrated to 88 on the published index scale (record calibration 2026-08-02).",
      "notes": [
        {
          "code": "overall_calibration",
          "params": {
            "raw": 74,
            "calibrated": 88,
            "calibration": "2026-08-02"
          }
        }
      ],
      "value": 88,
      "inputs": {
        "security": 65,
        "vitality": 85,
        "community": 57,
        "governance": 63,
        "calibration": "2026-08-02",
        "engineering": 94,
        "ai_readiness": 93,
        "weighted_overall_raw": 74
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "excellent",
        "name": "Vitality",
        "value": 85,
        "weight": 0.21,
        "metrics": [
          {
            "key": "development_activity",
            "band": "good",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 76,
            "inputs": {
              "commits_last_year": 438,
              "human_commit_share": 0.8,
              "days_since_last_push": 0,
              "active_weeks_last_year": 18
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 0 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 0
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "18/52 weeks with commits",
                "points": 12.5,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 18
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "438 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 438
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "30 commit(s) and 30 issue activity found in the last 90 days -- score normalized to 10",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "release_discipline",
            "band": "exceptional",
            "name": "Release discipline",
            "note": null,
            "notes": [],
            "value": 98,
            "inputs": {
              "releases_count": 18,
              "latest_release_tag": "v0.7.1",
              "releases_from_tags": false,
              "days_since_latest_release": 9,
              "mean_days_between_releases": 7.4
            },
            "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 9 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 9
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~7.4 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 7.4
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "openssf_scorecard_signed_releases",
                "name": "OpenSSF Scorecard: Signed-Releases",
                "detail": "5 out of the last 5 releases have a total of 5 signed artifacts.",
                "points": 8,
                "status": "partial",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "abandonment",
            "band": "exceptional",
            "name": "Abandonment",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "cap": null,
              "state": "unverified",
              "guards": [],
              "signals": [],
              "red_flag": false,
              "multiplier_pct": 100,
              "declared_reason": null,
              "unverified_reason": "repository_too_young",
              "unanswered_open_prs": null,
              "unanswered_open_issues": null,
              "days_since_last_merged_pr": null,
              "days_since_last_human_commit": null,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "maintenance record not established from the collected data",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_unverified",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "moderate",
        "name": "Community & Adoption",
        "value": 57,
        "weight": 0.17,
        "metrics": [
          {
            "key": "popularity",
            "band": "at_risk",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 26,
            "inputs": {
              "forks": 2,
              "stars": 41,
              "watchers": 0,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "41 stars",
                "points": 26,
                "status": "partial",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 41
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "2 forks",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 2
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "0 watchers",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "excellent",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 92,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "readme_badges": 6,
              "has_contributing": true,
              "has_issue_template": false,
              "has_code_of_conduct": true,
              "readme_badge_services": [
                "github.com",
                "goreportcard.com",
                "pkg.go.dev",
                "shields.io"
              ],
              "has_pull_request_template": true
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 22.5,
                "status": "met",
                "details": [],
                "max_points": 22.5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "recognized license (MIT)",
                "points": 22.5,
                "status": "met",
                "details": [
                  {
                    "code": "license_standard",
                    "params": {}
                  },
                  {
                    "code": "license_spdx",
                    "params": {
                      "spdx": "MIT"
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributing_guide",
                "name": "CONTRIBUTING guide",
                "detail": null,
                "points": 18,
                "status": "met",
                "details": [],
                "max_points": 18
              },
              {
                "key": "code_of_conduct",
                "name": "Code of conduct",
                "detail": null,
                "points": 13.5,
                "status": "met",
                "details": [],
                "max_points": 13.5
              },
              {
                "key": "issue_template",
                "name": "Issue template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.2
              },
              {
                "key": "pr_template",
                "name": "PR template",
                "detail": null,
                "points": 6.3,
                "status": "met",
                "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.23,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "at_risk",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 20,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 1,
              "top_contributor_share": 1
            },
            "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 100% of commits",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 100
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "1 contributors",
                "points": 1.4,
                "status": "partial",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 3 contributing companies or organizations -- score normalized to 10",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "excellent",
            "name": "Issue & PR responsiveness",
            "note": "Excluded from scoring (no data or not applicable): Newcomer PR acceptance. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "newcomer_pr_acceptance"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 80,
            "inputs": {
              "merged_prs": 150,
              "open_issues": 4,
              "closed_issues": 228,
              "prs_merged_7d": 14,
              "prs_decided_7d": 14,
              "prs_merged_30d": 58,
              "prs_decided_30d": 58,
              "issue_closed_ratio": 0.983,
              "closed_unmerged_prs": 11,
              "first_time_authors_30d": 0,
              "first_time_prs_merged_30d": 0,
              "first_time_prs_decided_30d": 0
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "98% of issues closed",
                "points": 41.3,
                "status": "partial",
                "details": [
                  {
                    "code": "issues_closed_share",
                    "params": {
                      "share": 98
                    }
                  }
                ],
                "max_points": 42
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "150/161 decided PRs merged",
                "points": 28,
                "status": "partial",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 150,
                      "decided": 161
                    }
                  }
                ],
                "max_points": 30
              },
              {
                "key": "newcomer_pr_acceptance",
                "name": "Newcomer PR acceptance",
                "detail": "no first-time contributor's PR decided in 30d",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_newcomer_prs",
                    "params": {
                      "days": 30
                    }
                  }
                ],
                "max_points": 13
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 0/30 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "good",
            "name": "Ownership & stewardship",
            "note": "Excluded from scoring (no data or not applicable): Verified domain. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "verified_domain"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 67,
            "inputs": {
              "followers": 376,
              "owner_type": "User",
              "is_verified": null,
              "owner_login": "jongio",
              "public_repos": 56,
              "account_age_days": 5100
            },
            "components": [
              {
                "key": "ownership_backing",
                "name": "Ownership backing",
                "detail": "personal (user) account",
                "points": 10,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_personal",
                    "params": {}
                  }
                ],
                "max_points": 30
              },
              {
                "key": "verified_domain",
                "name": "Verified domain",
                "detail": "not applicable to user accounts",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "not_applicable_to_user_accounts",
                    "params": {}
                  }
                ],
                "max_points": 20
              },
              {
                "key": "owner_reach",
                "name": "Owner reach",
                "detail": "376 followers of jongio",
                "points": 18.5,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 376,
                      "login": "jongio"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "56 public repos, account ~13 yr old",
                "points": 24.8,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 56
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 13
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "exceptional",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "github.com/jongio/grut"
              ],
              "ecosystems": "go",
              "any_deprecated": false,
              "min_days_since_publish": 9
            },
            "components": [
              {
                "key": "published_resolvable",
                "name": "Published & resolvable",
                "detail": "1 package(s) on go",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "packages_published",
                    "params": {
                      "count": 1,
                      "ecosystems": "go"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "publish_recency",
                "name": "Publish recency",
                "detail": "latest publish 9 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 9
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "23 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 23
                    }
                  }
                ],
                "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": "exceptional",
        "name": "Engineering Quality",
        "value": 94,
        "weight": 0.19,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "excellent",
            "name": "Engineering practices",
            "note": null,
            "notes": [],
            "value": 90,
            "inputs": {
              "has_ci": true,
              "has_tests": true,
              "has_editorconfig": true,
              "has_linter_config": true,
              "has_precommit_config": false
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": "4 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 4
                    }
                  }
                ],
                "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": ".golangci.yml",
                "points": 16,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": ".golangci.yml"
                    }
                  }
                ],
                "max_points": 16
              },
              {
                "key": "pre_commit_hooks",
                "name": "Pre-commit hooks",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 9.6
              },
              {
                "key": "editorconfig",
                "name": ".editorconfig",
                "detail": null,
                "points": 6.4,
                "status": "met",
                "details": [],
                "max_points": 6.4
              },
              {
                "key": "openssf_scorecard_ci_tests",
                "name": "OpenSSF Scorecard: CI-Tests",
                "detail": "16 out of 16 merged PRs checked by a CI test -- score normalized to 10",
                "points": 20,
                "status": "met",
                "details": [],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "exceptional",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "topics": [
                "git",
                "terminal",
                "cli",
                "copilot",
                "developer-tools",
                "file-explorer",
                "git-client",
                "github",
                "terminal-ui",
                "tui",
                "dprun",
                "dx-idea"
              ],
              "has_wiki": true,
              "homepage": "https://jongio.github.io/grut/",
              "has_readme": true,
              "has_docs_dir": true,
              "has_description": true
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 30,
                "status": "met",
                "details": [],
                "max_points": 30
              },
              {
                "key": "documentation_directory",
                "name": "Documentation directory",
                "detail": null,
                "points": 25,
                "status": "met",
                "details": [],
                "max_points": 25
              },
              {
                "key": "documentation_homepage_site",
                "name": "Documentation / homepage site",
                "detail": "https://jongio.github.io/grut/",
                "points": 15,
                "status": "met",
                "details": [],
                "max_points": 15
              },
              {
                "key": "repository_description",
                "name": "Repository description",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "topics",
                "name": "Topics",
                "detail": "12 topics",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "topics_count",
                    "params": {
                      "count": 12
                    }
                  }
                ],
                "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": "good",
        "name": "Security",
        "value": 65,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "good",
            "name": "Security posture",
            "note": null,
            "notes": [],
            "value": 65,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 18,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 0,
              "scorecard_aggregate": 6.5
            },
            "components": [
              {
                "key": "binary_artifacts",
                "name": "Binary-Artifacts",
                "detail": "no binaries found in the repo",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "branch_protection",
                "name": "Branch-Protection",
                "detail": "branch protection not enabled on development/release branches",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "ci_tests",
                "name": "CI-Tests",
                "detail": "16 out of 16 merged PRs checked by a CI test -- score normalized to 10",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "cii_best_practices",
                "name": "CII-Best-Practices",
                "detail": "no effort to earn an OpenSSF best practices badge detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "code_review",
                "name": "Code-Review",
                "detail": "Found 0/30 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 3 contributing companies or organizations -- score normalized to 10",
                "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 30 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 9",
                "points": 4.5,
                "status": "partial",
                "details": [],
                "max_points": 5
              },
              {
                "key": "sast",
                "name": "SAST",
                "detail": "SAST tool is not run on all commits -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "security_policy",
                "name": "Security-Policy",
                "detail": "security policy file detected",
                "points": 5,
                "status": "met",
                "details": [],
                "max_points": 5
              },
              {
                "key": "signed_releases",
                "name": "Signed-Releases",
                "detail": "5 out of the last 5 releases have a total of 5 signed artifacts.",
                "points": 6,
                "status": "partial",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "token_permissions",
                "name": "Token-Permissions",
                "detail": "detected GitHub workflow tokens with excessive permissions",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "vulnerabilities",
                "name": "Vulnerabilities",
                "detail": "0 existing vulnerabilities detected",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              }
            ]
          },
          {
            "key": "high_risk_jurisdiction_exposure",
            "band": "exceptional",
            "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"
              ],
              "commit_weight_rule": {
                "min_commits": 50,
                "min_commit_share": 0.1
              },
              "review_only_matches": 0,
              "below_threshold_exposures": [],
              "assessed_self_published_locations": 4
            },
            "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": "exceptional",
        "name": "AI Readiness",
        "value": 93,
        "weight": 0.04,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "excellent",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 85,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": 1,
              "agent_instruction_files": [
                ".github/copilot-instructions.md",
                "AGENTS.md"
              ],
              "agent_instruction_max_bytes": 3607
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": ".github/copilot-instructions.md, AGENTS.md",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": ".github/copilot-instructions.md, AGENTS.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": "80 of 80 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 80,
                      "sampled": 80
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "exceptional",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 96,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [
                "go.sum",
                "package-lock.json"
              ],
              "has_dockerfile": false,
              "typed_language": true,
              "bootstrap_files": [
                "internal/extension/templates/wasm-go/Makefile"
              ],
              "has_devcontainer": false,
              "has_linter_config": true,
              "typecheck_configs": [
                "web/tsconfig.json"
              ],
              "agent_commit_share": 0.75,
              "toolchain_manifests": [
                "go.mod"
              ],
              "dependency_bot_commit_share": 0
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": "internal/extension/templates/wasm-go/Makefile",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "internal/extension/templates/wasm-go/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": ".golangci.yml",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": ".golangci.yml"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "static_type_checking",
                "name": "Static type checking",
                "detail": "web/tsconfig.json",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "web/tsconfig.json"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "reproducible_environment",
                "name": "Reproducible environment",
                "detail": "lockfile",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "lockfile"
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "75 of the last 100 commits agent-authored or agent-credited",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "agent_authored_commits",
                    "params": {
                      "count": 75,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "automated_maintenance",
                "name": "Automated maintenance",
                "detail": "dependency automation configured, none observed in the sampled commits",
                "points": 5,
                "status": "partial",
                "details": [
                  {
                    "code": "dependency_bot_config_only",
                    "params": {}
                  }
                ],
                "max_points": 8
              },
              {
                "key": "openssf_scorecard_pinned_dependencies",
                "name": "OpenSSF Scorecard: Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 9",
                "points": 9,
                "status": "partial",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "exceptional",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 99,
            "inputs": {
              "primary_language": "Go",
              "largest_source_bytes": 191210,
              "source_files_sampled": 618,
              "oversized_source_files": 8
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "Go (statically typed)",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "statically_typed_language",
                    "params": {
                      "language": "Go"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "8/618 source files over 60KB",
                "points": 54.3,
                "status": "partial",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 618,
                      "oversized": 8
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          }
        ],
        "description": "How well is the repo equipped to be developed and maintained with AI coding agents? Carries a deliberately small weight: agent tooling is a real maintenance signal, but its absence must never gate the top of the scale (calibration saturates at raw 91, so 100/100 remains reachable with AI Readiness at zero)."
      }
    ],
    "classification": {
      "labels": [
        "cli",
        "library",
        "tui"
      ],
      "scores": {
        "cli": 13,
        "tui": 4,
        "library": 6
      },
      "primary": "cli",
      "evidence": [
        {
          "tier": "distribution",
          "label": "library",
          "source": "registry:go",
          "weight": 6
        },
        {
          "tier": "dependencies",
          "label": "cli",
          "source": "dep:github.com/spf13/cobra",
          "weight": 4
        },
        {
          "tier": "structure",
          "label": "cli",
          "source": "tree.goreleaser",
          "weight": 4
        },
        {
          "tier": "structure",
          "label": "cli",
          "source": "tree.go_main",
          "weight": 3
        },
        {
          "tier": "tags",
          "label": "cli",
          "source": "tag:cli",
          "weight": 2
        },
        {
          "tier": "tags",
          "label": "tui",
          "source": "tag:terminal-ui",
          "weight": 2
        },
        {
          "tier": "tags",
          "label": "tui",
          "source": "tag:tui",
          "weight": 2
        }
      ],
      "artifacts": [],
      "confidence": "medium",
      "host_extension": false,
      "runs_as_process": true,
      "consumed_by_code": true
    },
    "metrics_version": "2.3.1"
  },
  "warnings": [
    "Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token",
    "npm package 'web' points at a different repository (https://github.com/creationix/node-web); excluded from ecosystem scoring",
    "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository"
  ],
  "report_type": "repository",
  "generated_at": "2026-08-03T13:44:00.953549Z",
  "schema_version": "0.30.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/j/jongio/grut.svg",
  "full_name": "jongio/grut",
  "license_state": "standard",
  "license_spdx": "MIT"
}

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

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

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