公开记录
软件健康报告模式 0.27.0 · 指标 1.13.0 · 2026-07-24 12:31 UTC

neilberkman / ccrider

Search, browse, and resume your Claude Code sessions. Fast.

GoMIT★ 114 星标⑂ 4 复刻始于 2025年11月在 GitHub 上查看 ↗

neilberkman/ccrider 的健康指数为 100 分中的 59 分,处于「中等」区间。 其得分最高的类别是Vitality(79/100),最低的是Security(35/100)。 最近一次更新在 8 天前。 近期的大部分工作由 1 位贡献者完成。

59
总分 / 100
中等

软件健康指数

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

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

评分画像

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

所有权

Neil Berkman个人账户
30 关注者84 个公开仓库始于 2008年12月

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

软件包生态系统

注册表软件包版本月下载量版本数最近发布
Gogithub.com/neilberkman/ccriderv1.6.1-438 天前

按类别列示的指标

活力

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

79良好 · 占总体的 22%
评分方式
28.8/36推送新近度 — 最近一次推送于 8 天前
14.5/36提交节奏 — 52 周中有 21 周有提交
18/18提交量 — 最近一年 199 次提交
10/10OpenSSF Scorecard:Maintained — 28 commit(s) and 3 issue activity found in the last 90 days -- score normalized to 10
所用输入
commits_last_year199
human_commit_share1
days_since_last_push8
active_weeks_last_year21

发布纪律

90优秀
评分方式
27/27有发布版本 — 已发布 39 个发布版本
36/36发布时效 — 最近一次发布版本于 8 天前
27/27发布节奏 — 约每 4.4 天发布一次
0/10OpenSSF Scorecard:Signed-Releases — Project has not signed or included provenance with any releases.
所用输入
releases_count39
latest_release_tagv1.6.1
releases_from_tags
days_since_latest_release8
mean_days_between_releases4.4

社区与采用

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

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

流行度与采用

37存在风险
评分方式
33.3/60星标 — 114 个星标
4/25复刻 — 4 个复刻
0/15关注者 — 2 位关注者
所用输入
forks4
stars114
watchers2
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history

社区健康

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

可持续性与治理

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

60中等 · 占总体的 24%
评分方式
9/54巴士系数 — 1 位贡献者贡献了半数提交
1/22.5提交分布 — 头号贡献者编写了 96% 的提交
9.5/13.5贡献者广度 — 7 位贡献者
0/10OpenSSF Scorecard:Contributors — project has 0 contributing companies or organizations -- score normalized to 0
所用输入
bus_factor1
contributors_sampled7
top_contributor_share0.955
评分方式
46.8/46.8议题解决 — 100% 的议题已关闭
30.6/38.3PR 接受 — 已裁定的 PR 中 12/15 已合并
0/15OpenSSF Scorecard:Code-Review — Found 1/30 approved changesets -- score normalized to 0
所用输入
merged_prs12
open_issues0
closed_issues7
issue_closed_ratio1
closed_unmerged_prs3
评分方式
10/30所有权背书 — 个人(用户)账户
0/20已验证域名 — 不适用于个人账户
10.7/25所有者影响力 — neilberkman 有 30 位关注者
25/25既往记录 — 84 个公开仓库,账户约 17 年
所用输入
followers30
owner_typeUser
is_verified
owner_loginneilberkman
public_repos84
account_age_days6,443
已排除计分(无数据或不适用):已验证域名。 其余权重已重新归一化。
评分方式
25/25已发布且可解析 — go 上有 1 个软件包
35/35发布时效 — 最近一次发布于 8 天前
20/20版本历史 — 43 个已发布版本
20/20未被弃用 — 活跃,未被弃用或撤回
所用输入
packagesgithub.com/neilberkman/ccrider
ecosystemsgo
any_deprecated
min_days_since_publish8

工程质量

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

68中等 · 占总体的 20%

工程实践

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

文档

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

安全

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

35存在风险 · 占总体的 16%

安全态势

35存在风险
评分方式
7.5/7.5Binary-Artifacts — no binaries found in the repo
0/7.5Branch-Protection — branch protection not enabled on development/release branches
0/2.5CI-Tests — 0 out of 1 merged PRs checked by a CI test -- score normalized to 0
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
0/7.5Code-Review — Found 1/30 approved changesets -- score normalized to 0
0/2.5Contributors — project has 0 contributing companies or organizations -- score normalized to 0
10/10Dangerous-Workflow — no dangerous workflow patterns detected
0/7.5Dependency-Update-Tool — no update tool detected
0/5Fuzzing — project is not fuzzed
2.5/2.5许可证 — license file detected
7.5/7.5Maintained — 28 commit(s) and 3 issue activity found in the last 90 days -- score normalized to 10
5/5Packaging — packaging workflow detected
0/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
0/5SAST — SAST tool is not run on all commits -- score normalized to 0
0/5Security-Policy — security policy file not detected
0/7.5Signed-Releases — Project has not signed or included provenance with any releases.
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
4.5/7.5Vulnerabilities — 4 existing vulnerabilities detected
所用输入
sourceopenssf_scorecard
checks_evaluated18
scorecard_versionv5.5.0
checks_inconclusive0
scorecard_aggregate3.5

AI 就绪度

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

76良好 · 占总体的 0%
评分方式
45/45代理指令 — .claude/CLAUDE.md, AGENTS.md
0/15机器可读文档(llms.txt)
40/40可读的提交历史 — 100 次人类提交中有 77 次说明了意图(结构化标题或解释性正文)
所用输入
has_llms_txt
legible_history_share0.77
agent_instruction_files.claude/CLAUDE.md, AGENTS.md
agent_instruction_max_bytes6,389
评分方式
18/18一条命令的引导启动 — Makefile
22/22自动化测试
11/11Lint / 格式化配置 — .golangci.yml
11/11静态类型检查 — Go(静态类型)
10/10可复现环境 — lockfile
10/10已体现的代理实践 — 最近 100 次提交中有 23 次由代理编写或署名代理
0/8自动化维护 — 未观察到自动依赖更新
0/10OpenSSF Scorecard:Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
所用输入
has_nix
has_tests
lockfilesgo.sum
has_dockerfile
typed_language
bootstrap_filesMakefile
has_devcontainer
has_linter_config
typecheck_configs
agent_commit_share0.23
toolchain_manifestsgo.mod
dependency_bot_commit_share0
评分方式
45/45可类型检查的代码 — Go(静态类型)
55/55可控的文件大小 — 采样的 81 个源文件中有 0 个超过 60KB
所用输入
primary_languageGo
largest_source_bytes26,299
source_files_sampled81
oversized_source_files0
评分方式
0/40API 模式(OpenAPI/GraphQL/proto)
20/20MCP 服务器
0/40可运行示例
所用输入
example_dirs
has_mcp_signal
api_schema_files

关键数据

114GitHub 星标
7贡献者
199最近 12 个月提交数
8距最近推送天数
39发布版本数
1巴士系数(bus factor)
0开放议题
Go软件包生态系统数

数据采集警告

  • Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token
  • GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

更多细节

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

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

333444432026-072026-072026-07
主版本 0次版本 2修订 2
OpenSSF Scorecard 3.5 / 10
3.5综合

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

10Binary-Artifactsno binaries found in the repo
0Branch-Protectionbranch protection not enabled on development/release branches
0CI-Tests0 out of 1 merged PRs checked by a CI test -- score normalized to 0
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
0Code-ReviewFound 1/30 approved changesets -- score normalized to 0
0Contributorsproject has 0 contributing companies or organizations -- score normalized to 0
10Dangerous-Workflowno dangerous workflow patterns detected
0Dependency-Update-Toolno update tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
10Maintained28 commit(s) and 3 issue activity found in the last 90 days -- score normalized to 10
10Packagingpackaging workflow detected
0Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 0
0SASTSAST tool is not run on all commits -- score normalized to 0
0Security-Policysecurity policy file not detected
0Signed-ReleasesProject has not signed or included provenance with any releases.
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
6Vulnerabilities4 existing vulnerabilities detected
直接依赖 18
注册表软件包版本约束清单文件
Gogithub.com/BurntSushi/tomlv1.5.0go.mod
Gogithub.com/atotto/clipboardv0.1.4go.mod
Gogithub.com/aws/aws-sdk-go-v2/configv1.29.4go.mod
Gogithub.com/aws/aws-sdk-go-v2/credentialsv1.17.57go.mod
Gogithub.com/aws/aws-sdk-go-v2/service/bedrockruntimev1.24.3go.mod
Gogithub.com/cbroglie/mustachev1.4.0go.mod
Gogithub.com/charmbracelet/bubblesv0.21.0go.mod
Gogithub.com/charmbracelet/bubbleteav1.3.10go.mod
Gogithub.com/charmbracelet/lipglossv1.1.0go.mod
Gogithub.com/dustin/go-humanizev1.0.1go.mod
Gogithub.com/mark3labs/mcp-gov0.41.1go.mod
Gogithub.com/muesli/reflowv0.3.0go.mod
Gogithub.com/olebedev/whenv1.1.0go.mod
Gogithub.com/sethvargo/go-dicewarev0.5.0go.mod
Gogithub.com/spf13/cobrav1.10.1go.mod
Gogithub.com/tmc/langchaingov0.1.14go.mod
Gogithub.com/zeebo/blake3v0.2.4go.mod
Gomodernc.org/sqlitev1.40.0go.mod
全部依赖 未采集

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

原始 JSON 报告 机器可读
{
  "data": {
    "repo": {
      "topics": [],
      "is_fork": false,
      "size_kb": 10322,
      "has_wiki": true,
      "homepage": null,
      "languages": {
        "Go": 473711,
        "Shell": 1925,
        "Makefile": 241
      },
      "pushed_at": "2026-07-16T07:50:10Z",
      "created_at": "2025-11-11T21:43:43Z",
      "owner_type": "User",
      "updated_at": "2026-07-17T22:59:04Z",
      "description": "Search, browse, and resume your Claude Code sessions. Fast.",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "MIT",
      "default_branch": "main",
      "license_spdx_raw": "MIT",
      "primary_language": "Go",
      "significant_languages": [
        "Go"
      ]
    },
    "owner": {
      "blog": null,
      "name": "Neil Berkman",
      "type": "User",
      "login": "neilberkman",
      "company": null,
      "location": null,
      "followers": 30,
      "avatar_url": "https://avatars.githubusercontent.com/u/37657?v=4",
      "created_at": "2008-12-01T23:47:24Z",
      "is_verified": null,
      "public_repos": 84,
      "account_age_days": 6443
    },
    "license": {
      "state": "standard",
      "spdx_id": "MIT",
      "raw_spdx": "MIT",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v1.6.1",
          "kind": "patch",
          "published_at": "2026-07-16T07:53:08Z"
        },
        {
          "tag": "v1.6.0",
          "kind": "minor",
          "published_at": "2026-07-10T21:11:27Z"
        },
        {
          "tag": "v1.5.1",
          "kind": "patch",
          "published_at": "2026-07-04T15:49:23Z"
        },
        {
          "tag": "v1.5.0",
          "kind": "minor",
          "published_at": "2026-07-02T14:34:57Z"
        },
        {
          "tag": "v1.4.0",
          "kind": "minor",
          "published_at": "2026-06-28T21:44:46Z"
        },
        {
          "tag": "v1.3.2",
          "kind": "patch",
          "published_at": "2026-06-19T21:52:12Z"
        },
        {
          "tag": "v1.3.1",
          "kind": "patch",
          "published_at": "2026-06-18T12:43:26Z"
        },
        {
          "tag": "v1.3.0",
          "kind": "minor",
          "published_at": "2026-06-07T17:35:42Z"
        },
        {
          "tag": "v1.2.2",
          "kind": "patch",
          "published_at": "2026-06-07T14:38:04Z"
        },
        {
          "tag": "v1.2.1",
          "kind": "patch",
          "published_at": "2026-06-06T23:25:03Z"
        },
        {
          "tag": "v1.2.0",
          "kind": "minor",
          "published_at": "2026-06-06T21:31:41Z"
        },
        {
          "tag": "v1.1.9",
          "kind": "patch",
          "published_at": "2026-04-22T23:31:51Z"
        },
        {
          "tag": "v1.1.8",
          "kind": "patch",
          "published_at": "2026-04-07T21:43:51Z"
        },
        {
          "tag": "v1.1.7",
          "kind": "patch",
          "published_at": "2026-04-06T05:00:37Z"
        },
        {
          "tag": "v1.1.5",
          "kind": "patch",
          "published_at": "2026-03-26T14:30:20Z"
        },
        {
          "tag": "v1.1.4",
          "kind": "patch",
          "published_at": "2026-03-16T16:15:51Z"
        },
        {
          "tag": "v1.1.3",
          "kind": "patch",
          "published_at": "2026-03-10T05:29:17Z"
        },
        {
          "tag": "v1.1.1",
          "kind": "patch",
          "published_at": "2026-03-01T05:47:07Z"
        },
        {
          "tag": "v1.1.0",
          "kind": "minor",
          "published_at": "2026-02-28T19:52:28Z"
        },
        {
          "tag": "v1.0.0",
          "kind": "major",
          "published_at": "2026-02-28T16:32:32Z"
        },
        {
          "tag": "v0.9.7",
          "kind": "patch",
          "published_at": "2026-01-11T21:35:06Z"
        },
        {
          "tag": "v0.9.6",
          "kind": "patch",
          "published_at": "2026-01-06T20:47:50Z"
        },
        {
          "tag": "v0.9.5",
          "kind": "patch",
          "published_at": "2026-01-05T07:14:21Z"
        },
        {
          "tag": "v0.9.4",
          "kind": "patch",
          "published_at": "2026-01-05T06:12:48Z"
        },
        {
          "tag": "v0.9.3",
          "kind": "patch",
          "published_at": "2026-01-05T04:58:33Z"
        },
        {
          "tag": "v0.9.2",
          "kind": "patch",
          "published_at": "2026-01-02T05:15:35Z"
        },
        {
          "tag": "v0.9.1",
          "kind": "patch",
          "published_at": "2025-12-31T04:54:44Z"
        },
        {
          "tag": "v0.9.0",
          "kind": "minor",
          "published_at": "2025-12-30T22:42:30Z"
        },
        {
          "tag": "v0.2.6",
          "kind": "patch",
          "published_at": "2025-12-30T20:12:23Z"
        },
        {
          "tag": "v0.2.5",
          "kind": "patch",
          "published_at": "2025-12-30T20:02:26Z"
        },
        {
          "tag": "v0.2.4",
          "kind": "patch",
          "published_at": "2025-12-30T19:31:32Z"
        },
        {
          "tag": "v0.2.3",
          "kind": "patch",
          "published_at": "2025-12-30T05:32:57Z"
        },
        {
          "tag": "v0.2.2",
          "kind": "patch",
          "published_at": "2025-12-27T22:05:40Z"
        },
        {
          "tag": "v0.2.1",
          "kind": "patch",
          "published_at": "2025-12-27T21:48:57Z"
        },
        {
          "tag": "v0.1.4",
          "kind": "patch",
          "published_at": "2025-11-30T23:03:27Z"
        },
        {
          "tag": "v0.1.3",
          "kind": "patch",
          "published_at": "2025-11-30T22:57:11Z"
        },
        {
          "tag": "v0.1.2",
          "kind": "patch",
          "published_at": "2025-11-12T08:09:38Z"
        },
        {
          "tag": "v0.1.1",
          "kind": "patch",
          "published_at": "2025-11-12T07:23:34Z"
        },
        {
          "tag": "v0.1.0",
          "kind": "minor",
          "published_at": "2025-11-12T05:21:50Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "dae884161ef0f58237346cb93eb8c68e4229458d",
          "body": null,
          "is_bot": false,
          "headline": "chore: update changelog for v1.6.1",
          "author_name": "Neil Berkman",
          "author_login": "neilberkman",
          "committed_at": "2026-07-16T07:49:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6c1d09be57d63cf3961680aa631c56ae3bb913ab",
          "body": "- Errors print once (SilenceErrors/SilenceUsage) and runtime failures\n  no longer dump the full usage block after the message\n- Unknown session IDs surface db.ErrSessionNotFound with the ID\n  instead of leaking \"sql: no rows in result set\"\n- Sync messaging and progress write to stderr, keeping stdou\n[…]\n; non-TTY output gets plain per-10% lines instead of\n  progress-bar redraw frames\n- Bare invocation with piped stdout prints help instead of failing\n  with a TTY error; root help links the issues page",
          "is_bot": false,
          "headline": "fix: clean up CLI error handling and sync output streams",
          "author_name": "Neil Berkman",
          "author_login": "neilberkman",
          "committed_at": "2026-07-16T07:49:51Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "3ef5fbc059e2a30c03dee483dcfb4d9cfe792448",
          "body": null,
          "is_bot": false,
          "headline": "feat: add Antigravity CLI support",
          "author_name": "Neil Berkman",
          "author_login": "neilberkman",
          "committed_at": "2026-07-10T21:08:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b95273edd6bc5001817d0e8c88b1b35a076e5087",
          "body": null,
          "is_bot": false,
          "headline": "docs: remove retired Go Report Card badge",
          "author_name": "Neil Berkman",
          "author_login": "neilberkman",
          "committed_at": "2026-07-08T23:19:22Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b604f65b1ea77f81522b058c65c9e92efe301ddc",
          "body": null,
          "is_bot": false,
          "headline": "fix: make provider display neutral",
          "author_name": "Neil Berkman",
          "author_login": "neilberkman",
          "committed_at": "2026-07-04T15:45:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "07daeb254f9628966b9bf7e89cba7edfb2f60321",
          "body": null,
          "is_bot": false,
          "headline": "feat: add Pi provider support",
          "author_name": "Neil Berkman",
          "author_login": "neilberkman",
          "committed_at": "2026-07-02T14:30:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e767f2385f529e639123a38798615190a690552c",
          "body": null,
          "is_bot": false,
          "headline": "chore: update changelog for v1.5.0",
          "author_name": "Neil Berkman",
          "author_login": "neilberkman",
          "committed_at": "2026-07-02T14:30:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5c0936e913699f74b5072e4863776331e116572c",
          "body": "Add Pi to the provider registry with native resume/fork command construction, pi_flags config plumbing, default source discovery, and docs.\n\nAdd a Pi JSONL parser built on the shared ccsessions toolkit. Message UUIDs include the filename stem to avoid collisions between files with the same metadata \n[…]\ned on PR #21 by @Nabsku.\n\nKnown debt: Codex message UUIDs still use the shipped key format and can collide across copied rollout files; this change deliberately leaves existing Codex hashes untouched.",
          "is_bot": false,
          "headline": "feat: add Pi provider support",
          "author_name": "Neil Berkman",
          "author_login": "neilberkman",
          "committed_at": "2026-07-02T14:17:12Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "657ccba1885d4974004d8212e726a054ae0e67d3",
          "body": "Move provider identity, resume contracts, config flag lookup, display names, and source hints into one core registry so interface help and MCP descriptions derive from the same provider table.\n\nAdd shared JSONL parser utilities for long-line reads, deterministic message UUIDs, fallback summaries, and content-item text extraction. Existing provider hash keys are preserved so re-imports keep upserting the same messages.",
          "is_bot": false,
          "headline": "refactor: centralize provider registry",
          "author_name": "Neil Berkman",
          "author_login": "neilberkman",
          "committed_at": "2026-07-02T14:05:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4c7b40786dd3ffbb44f9af0a6f0ba5dd5cb2b994",
          "body": null,
          "is_bot": false,
          "headline": "docs: add toolbar offset changelog entry",
          "author_name": "Neil Berkman",
          "author_login": "neilberkman",
          "committed_at": "2026-07-02T13:36:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c9ae900d816c23d247379e2bfb6f8b097b6e5382",
          "body": "Use lipgloss vertical joining for the session list/help area and align list/detail viewport heights so the shortcut toolbar sits on the final terminal line.",
          "is_bot": false,
          "headline": "Fix toolbar offsets",
          "author_name": "Evan Widloski",
          "author_login": "Evidlo",
          "committed_at": "2026-07-02T13:31:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "52211c87dfc24cba59151ba86bfbc6551d668ed0",
          "body": null,
          "is_bot": false,
          "headline": "feat: add OpenCode support",
          "author_name": "Neil Berkman",
          "author_login": "neilberkman",
          "committed_at": "2026-06-28T21:39:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a35795f72a29d2b74b5620344224ecb2bda3b6c5",
          "body": "- Compute created_at/updated_at only from user/assistant turns, so\n  non-message events (pr-link, file-history-snapshot, queue-operation,\n  summary) no longer inflate a session's last-active time and scramble\n  the default sort. Existing rows need `ccrider sync --force` to recompute.\n- Render the he\n[…]\ncreen body at the terminal's default foreground instead\n  of a dim gray that washed out on dark themes; accent the title/headings.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: accurate last-active sort + readable help screen (v1.3.2)",
          "author_name": "Neil Berkman",
          "author_login": "neilberkman",
          "committed_at": "2026-06-19T21:49:14Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "b3f35f1b7a790184cdfb2f528a7aa1620ff70746",
          "body": null,
          "is_bot": false,
          "headline": "chore: update changelog for v1.3.1",
          "author_name": "Neil Berkman",
          "author_login": "neilberkman",
          "committed_at": "2026-06-18T12:39:12Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d0bfd65bb1144f04e09aa7d0f0c97a81e98d3e09",
          "body": "In the detail view's in-session search, the \"typing\" key handler bound\n`j`/`k` (and arrow up/down) to viewport scrolling *before* the keys\nreached the search text input. As a result, any query containing the\nletters `j` or `k` silently lost those characters — typing \"kotopia\"\nproduced \"otopia\", \"jes\n[…]\ny keeps `j`/`k`\nscrolling, which is correct there: you're cycling matches, not typing.\n\nAdds a regression test that types \"kj\" into the in-session search and\nasserts both characters land in the input.",
          "is_bot": false,
          "headline": "fix: type j/k into in-session search instead of scrolling viewport (#18)",
          "author_name": "koto",
          "author_login": "koto9x",
          "committed_at": "2026-06-18T12:36:10Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "5c34aeaa536bfd5ef9b84bf6d5d820fe1ad0223c",
          "body": "Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: update changelog for v1.3.0",
          "author_name": "Neil Berkman",
          "author_login": "neilberkman",
          "committed_at": "2026-06-07T17:32:11Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "045ae126b57900113429b45392567a0d28b7cb54",
          "body": "claude_flags has long been injected into every Claude resume command,\nbut Codex and Copilot sessions got bare commands — no way to bake in\nflags like --dangerously-bypass-approvals-and-sandbox that users\nalready apply via shell aliases.\n\nAdd codex_flags and copilot_flags to config.toml, and widen th\n[…]\n CONFIGURATION.md\ndocumented a dangerously_skip_permissions boolean that never existed\nin code — replaced with the real flag keys.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: per-provider resume flags (codex_flags, copilot_flags)",
          "author_name": "Neil Berkman",
          "author_login": "neilberkman",
          "committed_at": "2026-06-07T15:27:12Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "952dc3294edddddf4415102f706693c1cbe82585",
          "body": "Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: update changelog for v1.2.2",
          "author_name": "Neil Berkman",
          "author_login": "neilberkman",
          "committed_at": "2026-06-07T14:34:19Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "ec76e7cfd96b8aad7fb6dc4166514fe658fb051d",
          "body": "Core/interface cleanup pass — interfaces (CLI, TUI, MCP) were each\nre-deciding things that must hold regardless of interface:\n\n- ClaudeFlags application was per-callsite opt-in, so the TUI copy/\n  write/fallback commands silently omitted configured flags while the\n  exec and MCP paths applied them. \n[…]\ne.\n\nTests pin each behavior; TUI/core tests isolate HOME so they don't\nabsorb the developer's real ~/.config/ccrider claude flags.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor: move resume command/prompt assembly fully into core",
          "author_name": "Neil Berkman",
          "author_login": "neilberkman",
          "committed_at": "2026-06-07T14:28:53Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "ac77271b683966684d35aacc5ee24b342ea81424",
          "body": "Resume commands emitted by the MCP tools now include the user's\nconfigured claude flags (e.g. --dangerously-skip-permissions), matching\nhow the TUI exec path invokes claude. Flags are loaded per request so\nconfig edits apply without restarting the server, config errors fall\nback to no flags, and non-Claude providers ignore them (existing\ncore behavior).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: apply configured ClaudeFlags to MCP resume_command",
          "author_name": "Neil Berkman",
          "author_login": "neilberkman",
          "committed_at": "2026-06-07T14:19:55Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "0bce68ec3ba6ca161d031c3cedbbf1b29ef5726d",
          "body": "Agents consuming the MCP tools were stitching resume commands from the\nseparate project + session_id fields and frequently omitting the cd\nprefix, producing bare commands that fail with 'No conversation found'\nfrom any other cwd. Ship the full command instead so consumers never\nbuild it themselves.\n\n[…]\nrollout\nprefix stripped to the bare UUID, and the bare-command-plus-comment\nfallback when the project path is missing from the DB.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: add pre-built resume_command to all MCP session payloads",
          "author_name": "Neil Berkman",
          "author_login": "neilberkman",
          "committed_at": "2026-06-07T14:13:28Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "6691da6f692087618ac124b201c7f12a11485cc6",
          "body": "Resume commands only work from the directory the session was created in\n(Claude and Codex both scope session storage by cwd), so any command\nshown or copied without a cd prefix fails with 'No conversation found'.\n\nAdd session.ResumeCommandIn to core and route all interface emission\nsites through it:\n[…]\nng from the DB, emit the bare command with\na trailing '# project path missing in DB for session <id>' comment\ninstead of erroring.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: cd-prefix every emitted resume command via core ResumeCommandIn",
          "author_name": "Neil Berkman",
          "author_login": "neilberkman",
          "committed_at": "2026-06-07T14:05:27Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "c0df52decdf3d8c9bb30ec6a26fcf85bedec17dd",
          "body": null,
          "is_bot": false,
          "headline": "chore: update changelog for v1.2.1",
          "author_name": "Neil Berkman",
          "author_login": "neilberkman",
          "committed_at": "2026-06-06T23:21:37Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "dd796598afd4bfe8f38c6f4d38ab2c878b644c7d",
          "body": "Derive enumerated session skip hashes from message UUIDs and text content instead of file mtime.",
          "is_bot": false,
          "headline": "perf: hash enumerated session message content for skip checks",
          "author_name": "Daniel M. Drucker, Ph.D.",
          "author_login": "dmd",
          "committed_at": "2026-06-06T23:19:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "33cfa0cb806036afa312fbc1336b1925f9e6fb39",
          "body": "Quote session IDs and shell cd working directories in resume command construction.",
          "is_bot": false,
          "headline": "fix: shell-quote resume session IDs and working dirs",
          "author_name": "Daniel M. Drucker, Ph.D.",
          "author_login": "dmd",
          "committed_at": "2026-06-06T23:19:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "32c6f9a0d7996ed2b4482a42f92cae9e1ed68b5e",
          "body": "Skip malformed events.jsonl lines in the Copilot parser so one corrupt line does not drop the rest of the transcript.",
          "is_bot": false,
          "headline": "fix: skip malformed lines in Copilot events parser",
          "author_name": "Daniel M. Drucker, Ph.D.",
          "author_login": "dmd",
          "committed_at": "2026-06-06T23:09:12Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "15b25343dc53de800fb096ee7ebdaf008d233c23",
          "body": "Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: update changelog for v1.2.0",
          "author_name": "Neil Berkman",
          "author_login": "neilberkman",
          "committed_at": "2026-06-06T21:28:51Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "a54694f0347fd53d3a075335b599d35a1b8a8671",
          "body": "* fix: make session resume provider aware\n\nccrider hardcoded `claude --resume` for every provider, so resuming a\nCodex session generated a claude command (and hit claude session-recovery\nmode because the claude session file never exists).\n\nAdd internal/core/session/resume.go with provider-aware resu\n[…]\npilot sessions are tagged [copilot], filterable via --provider/MCP\nprovider, searchable via FTS, and resumable via `copilot --resume=<id>`.\n\nClaude + Codex + Copilot now share one searchable database.",
          "is_bot": false,
          "headline": "Add GitHub Copilot CLI support + provider-aware resume (#14)",
          "author_name": "Daniel M. Drucker, Ph.D.",
          "author_login": "dmd",
          "committed_at": "2026-06-06T21:27:24Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d501c3653cb219c1690bac0be39a842a247d4827",
          "body": "Adds `ccrider view <session-id>` as a stdout-only alias for export,\nuseful for piping and agent use without flags.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: add view command and bump to v1.1.9",
          "author_name": "Neil Berkman",
          "author_login": "neilberkman",
          "committed_at": "2026-04-22T23:27:21Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "dbb2742da5155cc6349a710f363d24ba15e4246f",
          "body": null,
          "is_bot": false,
          "headline": "chore: fix linter version in release.yml to match pr-test.yml",
          "author_name": "Neil Berkman",
          "author_login": "neilberkman",
          "committed_at": "2026-04-07T21:40:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "294fa660d1eb07762af86f0d235df50568736971",
          "body": "- Modify the session parser to ignore unparseable or corrupted lines\n  instead of failing.\n- Update the linter configuration and refactor string formatting to\n  resolve static analysis warnings.\n- Increment the project version to 1.1.8 and document changes in the\n  changelog.",
          "is_bot": false,
          "headline": "Skip corrupted session lines and fix CI (#12)",
          "author_name": "Neil Berkman",
          "author_login": "neilberkman",
          "committed_at": "2026-04-07T21:31:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fa8dd1806b0e001f865a59bbe42b80a7612f4928",
          "body": null,
          "is_bot": false,
          "headline": "chore: fix golangci-yml schema and bump version to 1.1.7",
          "author_name": "Neil Berkman",
          "author_login": "neilberkman",
          "committed_at": "2026-04-06T04:57:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0eab94eabc50c50ee4e5616fee8fa1cf9303708c",
          "body": null,
          "is_bot": false,
          "headline": "chore: bump version to 1.1.6",
          "author_name": "Neil Berkman",
          "author_login": "neilberkman",
          "committed_at": "2026-04-06T04:49:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ab27adaea472784fb0814f199836bbde090767c4",
          "body": "- Run go mod tidy to fix untidy dependencies\n- Remove accidentally tracked ccrider-linux binary\n- Update .gitignore to exclude build artifacts\n- Fix release workflow to use official golangci-lint-action",
          "is_bot": false,
          "headline": "chore: tidy modules, remove binary, and fix release workflow",
          "author_name": "Neil Berkman",
          "author_login": "neilberkman",
          "committed_at": "2026-04-06T04:49:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1385dc8098da051489798974f724ff645431492d",
          "body": null,
          "is_bot": false,
          "headline": "fix: lint errors in export code",
          "author_name": "Neil Berkman",
          "author_login": "neilberkman",
          "committed_at": "2026-03-26T14:27:07Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e33665ca165eade9dd90d06eaf1da8d3eb2c4285",
          "body": null,
          "is_bot": false,
          "headline": "release: v1.1.5 changelog",
          "author_name": "Neil Berkman",
          "author_login": "neilberkman",
          "committed_at": "2026-03-26T14:24:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1e7b5a8ce91ef94589ad6a17fc92d4f7a0bd2ab0",
          "body": "Redesign session export to be deliberate, repo-aware, and non-surprising.\n\nTUI: pressing 'e' now opens an export dialog with a prefilled path\ninstead of immediately writing to cwd. Default path for repo-backed\nsessions is <repo>/.ccrider/exports/session-<id>.md. 'E' opens the\ndialog with a blank pat\n[…]\nted to...\" display. Extracts shared\nmarkdown generation into internal/core/export/ (removes raw SQL from\ninterface layers). Remembers last export directory per-repo and globally\nin config.\n\nCloses #10",
          "is_bot": false,
          "headline": "feat: repo-aware export with confirmation dialog",
          "author_name": "Neil Berkman",
          "author_login": "neilberkman",
          "committed_at": "2026-03-26T14:19:42Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "fab4a565684b705db753f52e39baab0abe299577",
          "body": null,
          "is_bot": false,
          "headline": "chore: bump pinned Node.js from 23.7.0 to 25.8.2",
          "author_name": "Neil Berkman",
          "author_login": "neilberkman",
          "committed_at": "2026-03-26T14:19:42Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1723247d64fab7071f4229e8439be717ec0889e8",
          "body": null,
          "is_bot": false,
          "headline": "feat: add light theme",
          "author_name": "Marco Seguri",
          "author_login": "seguri",
          "committed_at": "2026-03-26T14:16:07Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "021a0226d0eb971d110a917da247ae4cea405241",
          "body": "Timezone was stripped during time.Time→string→time.Time roundtrip\n(Format without TZ, Parse assumes UTC), causing sessions to show\n\"7 hours ago\" instead of \"2 minutes ago\" for PDT users.\n\nAlso fix \"No sessions found\" flash on startup by distinguishing\ninitial async load from genuinely empty state.",
          "is_bot": false,
          "headline": "fix: session timestamps off by timezone offset and startup flash",
          "author_name": "Neil Berkman",
          "author_login": "neilberkman",
          "committed_at": "2026-03-16T16:12:07Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "384935d6755c559573a23f347c62247f0bdb4984",
          "body": null,
          "is_bot": false,
          "headline": "docs: note about Claude Code cleanupPeriodDays in configuration section",
          "author_name": "Neil Berkman",
          "author_login": "neilberkman",
          "committed_at": "2026-03-16T05:30:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "92c221095c31e484001d8f7b4007819532544aed",
          "body": "Codex CLI emits AGENTS.md instructions, environment_context, and\nsystem-reminder content as role=user response_item messages. These\nwere being imported as user messages, polluting summaries and search.\n\nSkip these known boilerplate patterns during parsing. Validated\nagainst 603 real Codex sessions (1,300 boilerplate items filtered).\n\nAlso updates CHANGELOG for v1.1.3.",
          "is_bot": false,
          "headline": "fix: filter system boilerplate from Codex response_item messages",
          "author_name": "Neil Berkman",
          "author_login": "neilberkman",
          "committed_at": "2026-03-10T05:28:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d627001463877a3ad9d44ccee312ee9362d09a6c",
          "body": "- Add migration005 to invalidate existing Codex sessions so they\n  re-import with the new response_item parser on next sync\n- Replace manual string concat with strings.Join in extractTextFromContent\n- Rename misleading test to TestParseFile_DualBufferSelectsLargerSource\n- Add comment explaining why developer role is skipped",
          "is_bot": false,
          "headline": "fix: add migration for existing Codex sessions and cleanup parser",
          "author_name": "Neil Berkman",
          "author_login": "neilberkman",
          "committed_at": "2026-03-10T05:28:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fa5634c186fb4697e6ba4135fab63d90040260ae",
          "body": "fix: parse response_item events in Codex session parser",
          "is_bot": false,
          "headline": "Merge pull request #8 from APE-147/fix/codex-response-item-parsing",
          "author_name": "Neil Berkman",
          "author_login": "neilberkman",
          "committed_at": "2026-03-10T05:28:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4ea89b3279dce8de33baf417611ca102081e85ab",
          "body": "Codex CLI emits conversation content via response_item events (type=message),\nbut the parser only handled event_msg events. This caused 16.4% message loss\n(335→390 messages across 48 sessions) and 11 zero-message sessions.\n\nStrategy: dual-buffer collects messages from both sources independently,\nthen selects whichever captured more messages. This handles sessions that\nuse only response_item, only event_msg, or both.\n\nFixes #7\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: parse response_item events in Codex session parser",
          "author_name": "APE-147",
          "author_login": "APE-147",
          "committed_at": "2026-03-07T08:31:01Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "d53b5ef2fb7261ee1887d5aa45b399fb6ab99a05",
          "body": "LLMs sometimes send numbers as strings (e.g. around_sequence: \"3913\"\ninstead of 3913), causing json.Unmarshal to reject the input. Pre-process\nthe arguments map to coerce parseable strings to numbers before\nunmarshaling into typed structs.",
          "is_bot": false,
          "headline": "fix: handle string-encoded numbers in MCP tool arguments",
          "author_name": "Neil Berkman",
          "author_login": "neilberkman",
          "committed_at": "2026-03-01T05:44:04Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "decb7f3161b2f6c2eae578fd4e2ffac347517a50",
          "body": "feat: add Codex CLI session support",
          "is_bot": false,
          "headline": "Merge pull request #6 from neilberkman/feature/codex-support",
          "author_name": "Neil Berkman",
          "author_login": "neilberkman",
          "committed_at": "2026-02-28T19:49:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "584bcf7e7674412585de62b381f05080424ab916",
          "body": "Index OpenAI Codex CLI sessions (~/.codex/sessions/) alongside Claude\nCode into a single searchable database. New parser (pkg/codexsessions)\nmaps Codex rollout JSONL to the same schema, generating deterministic\nUUIDs via BLAKE3 for idempotent re-import.\n\nProvider filtering on CLI (--provider codex/c\n[…]\ns). Non-Claude\nsessions tagged with [codex] in TUI and CLI list output.\n\nAlso fixes: panic on short session IDs, UTF-8 corruption in summary\ntruncation, silent zero timestamps from unparseable fields.",
          "is_bot": false,
          "headline": "feat: add Codex CLI session support",
          "author_name": "Neil Berkman",
          "author_login": "neilberkman",
          "committed_at": "2026-02-28T19:34:21Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "775d4c0ebe6b674dd139451e2a61dbf1108d547c",
          "body": "syscall.Stat_t doesn't exist on Windows. Runtime check wasn't enough\nsince the compiler still sees the type. Split into _unix.go and\n_windows.go with proper build constraints.",
          "is_bot": false,
          "headline": "Fix Windows build: split getFileIdentity into build-constrained files",
          "author_name": "Neil Berkman",
          "author_login": "neilberkman",
          "committed_at": "2026-02-28T16:30:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2d5c8ef082a9c98a2bf503635070492252ae80ba",
          "body": "Switch from SHA256 to BLAKE3 for file change detection. Key sessions\nby JSONL filename instead of parsed sessionId to fix hash thrashing\non resumed session chains. Relink orphaned messages via ON CONFLICT\nDO UPDATE. Deterministic token-based MCP response trimming on all\nhandlers. Crash-safe idempotent migrations. Importer warnings to\nstderr to prevent MCP JSON-RPC protocol corruption.\n\nInspired by @rcny's PR #5.",
          "is_bot": false,
          "headline": "BLAKE3 sync, message relinking, MCP response trimming",
          "author_name": "Neil Berkman",
          "author_login": "neilberkman",
          "committed_at": "2026-02-28T16:12:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "795f4fc42a9d1d36fe4221218f434526ceb2d563",
          "body": null,
          "is_bot": false,
          "headline": "Merge feature/fast-import: 3.9x faster imports with multi-level caching",
          "author_name": "Neil Berkman",
          "author_login": "neilberkman",
          "committed_at": "2026-02-02T06:18:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7d38e4d4bc261ad1886b46e9d6c255b34d736761",
          "body": null,
          "is_bot": false,
          "headline": "Update CHANGELOG for v0.10.0",
          "author_name": "Neil Berkman",
          "author_login": "neilberkman",
          "committed_at": "2026-02-02T05:48:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "808823b030b403811473f8c9d73053674f60d88c",
          "body": "Subagent session files use the parent session ID, so importing them\nwould overwrite/conflict with the actual parent session. They're not\nuseful to track separately, so hardcode skipping them instead of\nhaving a confusing flag.",
          "is_bot": false,
          "headline": "Always skip subagent sessions (they conflict with parent sessions)",
          "author_name": "Neil Berkman",
          "author_login": "neilberkman",
          "committed_at": "2026-02-02T05:27:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7aba1d4f410a61ca548903bc09397887fc280df0",
          "body": "Performance improvements:\n- 3.9x faster imports (19s → 2s for ~3150 sessions, 74% faster)\n- Multi-level change detection: mtime+size → hash → parse\n- Pre-load all session metadata in single query (avoids N queries)\n- Skip 805/888 files instantly via mtime+size check\n- Only hash/parse changed files (\n[…]\nime, file_size, file_inode, file_device columns\n- Added file_hash column for content-based change detection\n- Migration preserves existing data\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Optimize import with multi-level caching and handle huge JSONL lines",
          "author_name": "Neil Berkman",
          "author_login": "neilberkman",
          "committed_at": "2026-02-02T01:51:31Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "ed18e61a4b4cac1dd43260c3632fa51bed0f33ee",
          "body": null,
          "is_bot": false,
          "headline": "Fix symlinks (#4)",
          "author_name": "Vladimir Istyufeev",
          "author_login": "rcny",
          "committed_at": "2026-01-16T07:50:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3a61cb657646da3c37a3d7b971e4ba7a7b3cecab",
          "body": "The spinner's Stop() could panic with \"send on closed channel\" when\ncalled twice - which happens on error paths where Stop() is called\nexplicitly and then again via defer.\n\nFix: Use sync.Once to make Stop() idempotent and change to chan struct{}\nfor signal-only semantics.\n\nFixes #2",
          "is_bot": false,
          "headline": "Fix spinner panic on double Stop() call (#3)",
          "author_name": "Neil Berkman",
          "author_login": "neilberkman",
          "committed_at": "2026-01-12T15:16:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "04f3fb8d6f5f4e2a85e0e915db13f9f9e02c81e3",
          "body": null,
          "is_bot": false,
          "headline": "Fix errcheck lint errors in recovery mode prompts",
          "author_name": "Neil Berkman",
          "author_login": "neilberkman",
          "committed_at": "2026-01-12T07:00:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "edec4aaf049acf481c979f4e530c4cad44765558",
          "body": "When a session file has been deleted by Claude Code but CCRider still\nhas it indexed, CCRider can now start a new session with context from\nthe old conversation. Includes first/last 5 messages and instructions\nfor using CCRider MCP to search for more.\n\n- Prompts user to confirm before starting recovery\n- Warns if CCRider MCP server not configured\n- Falls back to asking for directory if original paths don't exist",
          "is_bot": false,
          "headline": "Add session recovery mode for deleted session files",
          "author_name": "Neil Berkman",
          "author_login": "neilberkman",
          "committed_at": "2026-01-12T05:55:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1e5b33d6a2d85464e731628d6cda020b0a31ecca",
          "body": "- Move filter parsing to internal/core/search/filters.go\n- CLI now supports same filters as TUI: after:, before:, date:, project:\n- Fix timestamp format mismatch in date comparisons\n- Supported formats: Go duration (3h), natural language (yesterday),\n  relative (3-days-ago), ISO 8601 (2024-01-15)\n- Delete duplicate TUI search_filters.go",
          "is_bot": false,
          "headline": "Centralize date filter parsing, fix timestamp comparison",
          "author_name": "Neil Berkman",
          "author_login": "neilberkman",
          "committed_at": "2026-01-11T21:38:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f6412431121ed2f63f58b04bc5e3bf63f3725c43",
          "body": "- project_path now always updates on re-import (was missing from ON CONFLICT)\n- Add --force flag to sync command to re-import all sessions\n- Fixes sessions with stale worktree paths that couldn't be resumed",
          "is_bot": false,
          "headline": "Fix project_path stuck on wrong value, add sync --force",
          "author_name": "Neil Berkman",
          "author_login": "neilberkman",
          "committed_at": "2026-01-11T21:31:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "aa653ffa0f56b04fc59c56fbed52d6a6bca6e677",
          "body": null,
          "is_bot": false,
          "headline": "Make Show HN badge black for better Y logo contrast",
          "author_name": "Neil Berkman",
          "author_login": "neilberkman",
          "committed_at": "2026-01-11T16:24:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b0cad468f5fb21a8bdddce9a88d2571201479870",
          "body": null,
          "is_bot": false,
          "headline": "Add MCP server mention to tagline",
          "author_name": "Neil Berkman",
          "author_login": "neilberkman",
          "committed_at": "2026-01-11T16:23:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b4d6435012e422def2af2b8337f00ea70534044b",
          "body": "- Support Go duration format (3h, 30m, 2h30m) in TUI date filters\n- Increase anchor phrase retry from 3 to 5 attempts with 1s delay\n- Update TUI help text to show duration syntax",
          "is_bot": false,
          "headline": "Add Go duration syntax for date filters, increase anchor retry",
          "author_name": "Neil Berkman",
          "author_login": "neilberkman",
          "committed_at": "2026-01-11T16:00:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ab5935a8bc7828a90663d6ce166c073c3239d8f9",
          "body": "- Remove get_session_detail (was removed in 81d3f4b)\n- Add generate_session_anchor tool\n- Add subtle lyric reference linking to song origin",
          "is_bot": false,
          "headline": "Update README: fix MCP tools list, add CC Rider lyric reference",
          "author_name": "Neil Berkman",
          "author_login": "neilberkman",
          "committed_at": "2026-01-11T16:00:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2be42c0c2c67b51fc94e48a0ac9d8b0ebaff49cd",
          "body": null,
          "is_bot": false,
          "headline": "Link Show HN badge to actual post",
          "author_name": "Neil Berkman",
          "author_login": "neilberkman",
          "committed_at": "2026-01-06T20:58:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cb14243ca637691c5bc06282cb0e2591bfcfd872",
          "body": null,
          "is_bot": false,
          "headline": "Add project badges to README",
          "author_name": "Neil Berkman",
          "author_login": "neilberkman",
          "committed_at": "2026-01-06T20:50:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "215cffebc7220942a7112fccd83902fbd0ab4e7f",
          "body": null,
          "is_bot": false,
          "headline": "Fix Homebrew tap path to match published install instructions",
          "author_name": "Neil Berkman",
          "author_login": "neilberkman",
          "committed_at": "2026-01-06T20:42:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "81d3f4b452329f84fb72fc29ab860ded2395b4cf",
          "body": "- generate_session_anchor: Creates unique diceware phrase for Claude to say,\n  enabling search for earlier context that disappeared from context window\n- Anchor phrase search now retries 3x with 500ms delays for write buffering\n- Removed get_session_detail (redundant with search + get_messages)\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)",
          "is_bot": false,
          "headline": "Add generate_session_anchor tool, remove get_session_detail",
          "author_name": "Neil Berkman",
          "author_login": "neilberkman",
          "committed_at": "2026-01-05T07:10:40Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "706fc1ccb20b5cf732186f2e1356a319bb351793",
          "body": "Allows Claude to find earlier context in current session:\n- anchor_phrase: unique phrase to identify session (auto-quoted, defaults to last hour)\n- exact_match: auto-quotes query for phrase matching",
          "is_bot": false,
          "headline": "Add anchor_phrase and exact_match to MCP search",
          "author_name": "Neil Berkman",
          "author_login": "neilberkman",
          "committed_at": "2026-01-05T06:08:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ce1e3980f37a2ffb3c7688b4dbca6ea2a37f0e50",
          "body": "Fast typing could show stale results if an earlier search completed\nafter a later one. Now uses sequence numbers to discard outdated results.",
          "is_bot": false,
          "headline": "Fix search race condition with sequence numbers",
          "author_name": "Neil Berkman",
          "author_login": "neilberkman",
          "committed_at": "2026-01-05T04:55:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "129617bcc94b6dffe001cacaf292729baa86c521",
          "body": "Queries with commas, hyphens, @, #, and other punctuation no longer\ncause FTS5 syntax errors. Implemented proper query escaping (same\napproach as sqlite-utils/datasette) - each token is quoted and internal\nquotes are escaped. Removed LIKE fallback. Wildcards still work.",
          "is_bot": false,
          "headline": "Fix FTS5 search: proper escaping for all special characters",
          "author_name": "Neil Berkman",
          "author_login": "neilberkman",
          "committed_at": "2026-01-02T05:12:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "82fbac6b636c29659bc74faec704aab11ffd9a11",
          "body": null,
          "is_bot": false,
          "headline": "Add MCP server installation to quick start",
          "author_name": "Neil Berkman",
          "author_login": "neilberkman",
          "committed_at": "2025-12-31T05:00:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "874484378f768e7c756cc3649e8536cdebe077b5",
          "body": null,
          "is_bot": false,
          "headline": "Release v0.9.1",
          "author_name": "Neil Berkman",
          "author_login": "neilberkman",
          "committed_at": "2025-12-31T04:51:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1f858f02cee1ded9f9ae48173536ce9e884c3224",
          "body": null,
          "is_bot": false,
          "headline": "Fix phrase search: preserve quotes in TUI, auto-balance for live typing",
          "author_name": "Neil Berkman",
          "author_login": "neilberkman",
          "committed_at": "2025-12-31T04:48:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3b0c850dd483b695b289d56b47a06954dfc54b5e",
          "body": null,
          "is_bot": false,
          "headline": "Mention TUI, CLI and MCP in intro",
          "author_name": "Neil Berkman",
          "author_login": "neilberkman",
          "committed_at": "2025-12-31T02:08:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "993834a1c574177d9bb041a5803810095f90e323",
          "body": null,
          "is_bot": false,
          "headline": "Mention MCP server in intro",
          "author_name": "Neil Berkman",
          "author_login": "neilberkman",
          "committed_at": "2025-12-31T02:07:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "44feacae3b6800624cc7b53bbcac22eea02c0a24",
          "body": null,
          "is_bot": false,
          "headline": "Remove incorrect macOS-only claim",
          "author_name": "Neil Berkman",
          "author_login": "neilberkman",
          "committed_at": "2025-12-31T02:05:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cd04c02df71f448b417db86cebc7c4bb47ca6ae7",
          "body": null,
          "is_bot": false,
          "headline": "Move Elvis video back to hero position",
          "author_name": "Neil Berkman",
          "author_login": "neilberkman",
          "committed_at": "2025-12-30T22:50:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a235727bb2b5ae0bbb6f9589f9219cbbe7156dd2",
          "body": null,
          "is_bot": false,
          "headline": "Restore embedded video (was replaced with dead YouTube link)",
          "author_name": "Neil Berkman",
          "author_login": "neilberkman",
          "committed_at": "2025-12-30T22:47:42Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cdb0bc450b9272db9a7a1bbd8ae58c55ae6634e2",
          "body": null,
          "is_bot": false,
          "headline": "Add session exports to gitignore",
          "author_name": "Neil Berkman",
          "author_login": "neilberkman",
          "committed_at": "2025-12-30T22:41:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5c64c3cf60e274b7828583bc6645556e7a34ffae",
          "body": "- Add Anthropic API as alternative to AWS Bedrock for summarization\n- Add filter-only search (date/project filters without text query)\n- Add SQLite busy timeout to prevent lock errors\n- Fix date filter parsing (2024-11-01, 3-days-ago)\n- Fix TUI search view overflow and text truncation\n- Improve summarization prompts for problem-solution focus\n- CLI search output now matches TUI format",
          "is_bot": false,
          "headline": "Release v0.9.0: Anthropic API support, search improvements, bug fixes",
          "author_name": "Neil Berkman",
          "author_login": "neilberkman",
          "committed_at": "2025-12-30T22:39:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d7bf0e4b499addd5e4e1a411c041154beafb7150",
          "body": null,
          "is_bot": false,
          "headline": "Skip sessions with <5 messages for summarization",
          "author_name": "Neil Berkman",
          "author_login": "neilberkman",
          "committed_at": "2025-12-30T21:30:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8ed2c7ed7ee0d798218ba60938c9ee61ec8225d2",
          "body": "- Ask LLM to identify the main problem, root cause, and solution\n- Add explicit \"ask yourself\" questions to guide summarization\n- Better BAD/GOOD examples showing problem→solution format\n- Remove project name prefix from summaries (redundant)\n- Increase one-line char limit to 50-90 for more detail\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Improve summarization prompts for problem→solution focus",
          "author_name": "Neil Berkman",
          "author_login": "neilberkman",
          "committed_at": "2025-12-30T21:08:33Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "37cd1d26150b177a5809371bf8b0ca211c8008df",
          "body": "- New anthropic.go provider using direct Anthropic API\n- Auto-detects provider from credentials (ANTHROPIC_API_KEY or AWS)\n- Shows warning when auto-detected, with instructions to override\n- Add --provider flag and llm_provider config option\n- Update default models to Claude Haiku 4.5\n  - Anthropic:\n[…]\nhaiku-4-5-20251001\n  - Bedrock: global.anthropic.claude-haiku-4-5-20251001-v1:0\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add Anthropic API support for session summarization",
          "author_name": "Neil Berkman",
          "author_login": "neilberkman",
          "committed_at": "2025-12-30T20:38:11Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e262e0465e3b68e06052927c1bfdb255311c78e5",
          "body": "README:\n- Add Homebrew as recommended installation method\n- Fix GitHub URL\n- Add missing get_session_messages MCP tool\n- Update config section to show actual format (claude_flags, txt files)\n- Update project structure to match reality\n\nCLI:\n- Fix serve-mcp help to show correct Claude Desktop config path\n- Add Claude Code MCP setup command to help\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Update README and CLI help for accuracy",
          "author_name": "Neil Berkman",
          "author_login": "neilberkman",
          "committed_at": "2025-12-30T20:08:46Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "40427b57dcb6db785b325281f6ddbcf2b817f480",
          "body": "Silently skip files that fail to stat, parse, or import instead of\nprinting warnings to stderr. These warnings were being printed during\nthe import process and corrupting the bubbletea TUI rendering.\n\nAlso removed debug prints from terminal spawn code.\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Remove stderr warnings that corrupt TUI display",
          "author_name": "Neil Berkman",
          "author_login": "neilberkman",
          "committed_at": "2025-12-30T19:58:00Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "d4f7bec252bc4e9a76e437f2930f4b22ef3a9b64",
          "body": "Validates that 'claude' command is runnable from the target directory\nbefore attempting to resume. Catches common issues like version manager\n(asdf/mise/nvm) failures and provides helpful diagnostic messages with\nsuggested fixes instead of cryptic exit codes.\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add pre-flight validation before resuming sessions",
          "author_name": "Neil Berkman",
          "author_login": "neilberkman",
          "committed_at": "2025-12-30T19:27:26Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "07b52057551d72d9aea256c977d36d5ed1c8de07",
          "body": "Truncates messages evenly from beginning/end when over limit.\nReports truncation status in response.\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)",
          "is_bot": false,
          "headline": "Limit MCP response size to ~50KB to prevent context overflow",
          "author_name": "Neil Berkman",
          "author_login": "neilberkman",
          "committed_at": "2025-12-30T05:29:16Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "b01d70c261c24ba6db752e1ea1d44b17bf91729c",
          "body": null,
          "is_bot": false,
          "headline": "Remove unnecessary Go build dependency from Homebrew formula",
          "author_name": "Neil Berkman",
          "author_login": "neilberkman",
          "committed_at": "2025-12-27T22:02:04Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0361a98f767e4b4ac90edd9c661cef18d4f9db84",
          "body": "- Add get_session_messages tool with three modes:\n  - last_n: tail mode for \"where were we\" / refresh memory\n  - around_sequence: context around a search match\n  - neither: full transcript\n- Add Sequence field to SearchResult and return real sequence numbers\n- Add GetSessionMessages to core/db with filtering options\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add get_session_messages MCP tool and sequence numbers to search",
          "author_name": "Neil Berkman",
          "author_login": "neilberkman",
          "committed_at": "2025-12-27T21:45:42Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "d580379c4d9dec562e1de1bbf7a2ac44a5c2b234",
          "body": null,
          "is_bot": false,
          "headline": "Fix version injection from GoReleaser ldflags",
          "author_name": "Neil Berkman",
          "author_login": "neilberkman",
          "committed_at": "2025-11-30T23:00:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "365c13c8e8941b8ae5252c7e108c8b6c38c7ac43",
          "body": null,
          "is_bot": false,
          "headline": "Fix all linter errors: errcheck, staticcheck, and unused code",
          "author_name": "Neil Berkman",
          "author_login": "neilberkman",
          "committed_at": "2025-11-30T22:53:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "14e7c8051fe444dbc5389131fcdbacf7b5cb66f4",
          "body": null,
          "is_bot": false,
          "headline": "Fix agent session handling to use parent sessionId",
          "author_name": "Neil Berkman",
          "author_login": "neilberkman",
          "committed_at": "2025-11-30T22:29:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "689b07f14110609917df98faaab7eff07ea9b5e3",
          "body": null,
          "is_bot": false,
          "headline": "Add GitHub workflows, LICENSE, and GoReleaser config",
          "author_name": "Neil Berkman",
          "author_login": "neilberkman",
          "committed_at": "2025-11-30T22:24:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "79f4b18dcb3216e0565d02d4b1d7388baf413b7d",
          "body": "- Implement progressive chunk-based summarization for long sessions\n- Two-tier summaries: one-line (60-80 chars) and full (2-3 paragraphs)\n- Extract issue IDs (ENA-1234, PROJ-123) and file paths from messages\n- Support AWS Bedrock with flexible credential options (profile, env vars, IAM)\n- Create ne\n[…]\nDB tables: session_summaries, summary_chunks, session_issues, session_files\n- Add --extract-only mode for metadata extraction without LLM calls\n- Increase max tokens to 1024 for better summary quality",
          "is_bot": false,
          "headline": "Add hierarchical LLM summarization with metadata extraction",
          "author_name": "Neil Berkman",
          "author_login": "neilberkman",
          "committed_at": "2025-11-30T22:06:10Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "aa4631c24ea72abb16f8d2278f6e934f5d4e4e05",
          "body": "- Add LastCwd field to Session struct\n- Update ListSessions query to fetch last cwd from messages\n- Falls back to session.cwd then project_path if no message cwd\n- Update TUI to display LastCwd instead of project_path\n- Match current directory highlighting uses LastCwd\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Show last working directory in TUI session list",
          "author_name": "Neil Berkman",
          "author_login": "neilberkman",
          "committed_at": "2025-11-26T22:47:01Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "a0364791811ba3b92d7bb273d3e4b9a38f74205c",
          "body": "- Replace both escaped (\\n) and actual newlines with spaces\n- Reduce snippet length to 100 chars (from 150) to ensure match visibility\n- Increase TUI display to 100 chars (from 80) to match core extraction\n- Ensures highlighted matches are always visible in viewport\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Fix search snippet newline handling and length",
          "author_name": "Neil Berkman",
          "author_login": "neilberkman",
          "committed_at": "2025-11-26T20:05:44Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "4a4ff9fae77cec46b848f36d59b9cb21fe6aae10",
          "body": "- Add relevance scoring that blends match count, summary matches, and recency\n- Rank sessions by score instead of pure timestamp ordering\n- Extract JSON field values instead of showing raw JSON blobs\n- Center snippets on matches with better boundary detection\n- Remove useless [message] label in TUI \n[…]\n save horizontal space\n- Shorten TUI snippet display to 80 chars to keep matches visible\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Improve search relevance ranking and snippet quality",
          "author_name": "Neil Berkman",
          "author_login": "neilberkman",
          "committed_at": "2025-11-26T17:28:55Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "89c41b001142c7f8f26a7d4baa9b7b2b388b7f9d",
          "body": "- Add LangChainGo dependency for LLM abstraction\n- Create llm package with Provider interface and Bedrock implementation\n- Add llm_summary and llm_summary_at columns to sessions table\n- Add `ccrider summarize` command with --limit, --force, --model flags\n- Supports Claude 3 Haiku (default) or other Bedrock models",
          "is_bot": false,
          "headline": "Add LLM-powered session summarization via AWS Bedrock",
          "author_name": "Neil Berkman",
          "author_login": "neilberkman",
          "committed_at": "2025-11-25T06:37:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4704908b4506e06915ac923dd6dfc4f97b15a781",
          "body": "- Remove \"substantive user message\" filtering that dropped entire sessions\n- Preserve agent session IDs from filename instead of parent session UUID\n- Agent sessions now import as separate entries (1252 agent sessions found)\n- Total sessions imported: 1968 (up from 358)",
          "is_bot": false,
          "headline": "Fix session import: remove aggressive filtering, preserve agent sessions",
          "author_name": "Neil Berkman",
          "author_login": "neilberkman",
          "committed_at": "2025-11-25T06:16:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        }
      ],
      "releases_count": 39,
      "commits_last_year": 199,
      "latest_release_at": "2026-07-16T07:53:08Z",
      "latest_release_tag": "v1.6.1",
      "releases_from_tags": false,
      "days_since_last_push": 8,
      "active_weeks_last_year": 21,
      "days_since_latest_release": 8,
      "mean_days_between_releases": 4.4
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": false,
      "health_percentage": 42,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": false
    },
    "ecosystem": {
      "packages": [
        {
          "name": "github.com/neilberkman/ccrider",
          "exists": true,
          "license": null,
          "keywords": [],
          "ecosystem": "go",
          "matches_repo": true,
          "registry_url": "https://pkg.go.dev/github.com/neilberkman/ccrider",
          "is_deprecated": false,
          "latest_version": "v1.6.1",
          "repository_url": "https://github.com/neilberkman/ccrider",
          "versions_count": 43,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": null,
          "first_published_at": null,
          "latest_published_at": "2026-07-16T07:49:51Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 8
        }
      ]
    },
    "popularity": {
      "forks": 4,
      "stars": 114,
      "watchers": 2,
      "fork_history": {
        "days": [
          {
            "date": "2026-07-01",
            "count": 3
          },
          {
            "date": "2026-07-22",
            "count": 1
          }
        ],
        "complete": true,
        "collected": 4,
        "total_forks": 4
      },
      "star_history": null,
      "open_issues_and_prs": 1
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [],
      "has_llms_txt": false,
      "has_dockerfile": false,
      "has_mcp_signal": true,
      "bootstrap_files": [
        "Makefile"
      ],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [],
      "toolchain_manifests": [
        "go.mod"
      ],
      "largest_source_bytes": 26299,
      "source_files_sampled": 81,
      "oversized_source_files": 0,
      "agent_instruction_files": [
        ".claude/CLAUDE.md",
        "AGENTS.md"
      ],
      "agent_instruction_max_bytes": 6389
    },
    "dependencies": {
      "manifests": [
        "go.mod"
      ],
      "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"
      ],
      "dependencies": [
        {
          "name": "github.com/BurntSushi/toml",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.5.0"
        },
        {
          "name": "github.com/atotto/clipboard",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.1.4"
        },
        {
          "name": "github.com/aws/aws-sdk-go-v2/config",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.29.4"
        },
        {
          "name": "github.com/aws/aws-sdk-go-v2/credentials",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.17.57"
        },
        {
          "name": "github.com/aws/aws-sdk-go-v2/service/bedrockruntime",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.24.3"
        },
        {
          "name": "github.com/cbroglie/mustache",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.4.0"
        },
        {
          "name": "github.com/charmbracelet/bubbles",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.21.0"
        },
        {
          "name": "github.com/charmbracelet/bubbletea",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.3.10"
        },
        {
          "name": "github.com/charmbracelet/lipgloss",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.1.0"
        },
        {
          "name": "github.com/dustin/go-humanize",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.0.1"
        },
        {
          "name": "github.com/mark3labs/mcp-go",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.41.1"
        },
        {
          "name": "github.com/muesli/reflow",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.3.0"
        },
        {
          "name": "github.com/olebedev/when",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.1.0"
        },
        {
          "name": "github.com/sethvargo/go-diceware",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.5.0"
        },
        {
          "name": "github.com/spf13/cobra",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.10.1"
        },
        {
          "name": "github.com/tmc/langchaingo",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.1.14"
        },
        {
          "name": "github.com/zeebo/blake3",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.2.4"
        },
        {
          "name": "modernc.org/sqlite",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.40.0"
        }
      ],
      "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": 1,
        "merged_prs": 12,
        "open_issues": 0,
        "closed_ratio": 1,
        "closed_issues": 7,
        "closed_unmerged_prs": 3
      },
      "bus_factor": 1,
      "bot_contributors": 0,
      "top_contributors": [
        {
          "type": "User",
          "login": "neilberkman",
          "commits": 190,
          "avatar_url": "https://avatars.githubusercontent.com/u/37657?v=4"
        },
        {
          "type": "User",
          "login": "dmd",
          "commits": 4,
          "avatar_url": "https://avatars.githubusercontent.com/u/41439?v=4"
        },
        {
          "type": "User",
          "login": "APE-147",
          "commits": 1,
          "avatar_url": "https://avatars.githubusercontent.com/u/70080800?v=4"
        },
        {
          "type": "User",
          "login": "Evidlo",
          "commits": 1,
          "avatar_url": "https://avatars.githubusercontent.com/u/5455841?v=4"
        },
        {
          "type": "User",
          "login": "seguri",
          "commits": 1,
          "avatar_url": "https://avatars.githubusercontent.com/u/2405157?v=4"
        },
        {
          "type": "User",
          "login": "rcny",
          "commits": 1,
          "avatar_url": "https://avatars.githubusercontent.com/u/1887341?v=4"
        },
        {
          "type": "User",
          "login": "koto9x",
          "commits": 1,
          "avatar_url": "https://avatars.githubusercontent.com/u/64445724?v=4"
        }
      ],
      "contributors_sampled": 7,
      "top_contributor_share": 0.955
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "pr-test.yml",
        "release.yml"
      ],
      "has_docs_dir": true,
      "linter_configs": [
        ".golangci.yml"
      ],
      "has_editorconfig": false,
      "has_linter_config": true,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [
        "go.sum"
      ],
      "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": 0,
            "reason": "0 out of 1 merged PRs checked by a CI test -- score normalized to 0",
            "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 1/30 approved changesets -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 0,
            "reason": "project has 0 contributing companies or organizations -- score normalized to 0",
            "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": 0,
            "reason": "no 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": "28 commit(s) and 3 issue activity found in the last 90 days -- score normalized to 10",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
          },
          {
            "name": "Packaging",
            "score": 10,
            "reason": "packaging workflow detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
          },
          {
            "name": "Pinned-Dependencies",
            "score": 0,
            "reason": "dependency not pinned by hash detected -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
          },
          {
            "name": "SAST",
            "score": 0,
            "reason": "SAST tool is not run on all commits -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
          },
          {
            "name": "Security-Policy",
            "score": 0,
            "reason": "security policy file not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
          },
          {
            "name": "Signed-Releases",
            "score": 0,
            "reason": "Project has not signed or included provenance with any releases.",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
          },
          {
            "name": "Token-Permissions",
            "score": 0,
            "reason": "detected GitHub workflow tokens with excessive permissions",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
          },
          {
            "name": "Vulnerabilities",
            "score": 6,
            "reason": "4 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "dae884161ef0f58237346cb93eb8c68e4229458d",
        "ran_at": "2026-07-24T12:31:34Z",
        "aggregate_score": 3.5,
        "scorecard_version": "v5.5.0"
      },
      "has_codeql_workflow": false,
      "has_security_policy": false,
      "has_dependabot_config": false
    },
    "contribution_flow": {
      "collected": true,
      "ci_last_run_at": "2026-07-16T07:53:15Z",
      "oldest_open_prs": [
        {
          "number": 23,
          "created_at": "2026-07-22T15:49:04Z",
          "last_comment_at": null,
          "last_comment_author": null
        }
      ],
      "last_merged_pr_at": "2026-07-02T13:31:46Z",
      "ci_last_conclusion": "SUCCESS",
      "oldest_open_issues": []
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/neilberkman/ccrider",
    "host": "github.com",
    "name": "ccrider",
    "owner": "neilberkman"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "moderate",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 59,
      "inputs": {
        "security": 35,
        "vitality": 79,
        "community": 43,
        "governance": 60,
        "engineering": 68
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "good",
        "name": "Vitality",
        "value": 79,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "good",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 71,
            "inputs": {
              "commits_last_year": 199,
              "human_commit_share": 1,
              "days_since_last_push": 8,
              "active_weeks_last_year": 21
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 8 days ago",
                "points": 28.8,
                "status": "partial",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 8
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "21/52 weeks with commits",
                "points": 14.5,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 21
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "199 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 199
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "28 commit(s) and 3 issue activity found in the last 90 days -- score normalized to 10",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "release_discipline",
            "band": "excellent",
            "name": "Release discipline",
            "note": null,
            "notes": [],
            "value": 90,
            "inputs": {
              "releases_count": 39,
              "latest_release_tag": "v1.6.1",
              "releases_from_tags": false,
              "days_since_latest_release": 8,
              "mean_days_between_releases": 4.4
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "39 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 39
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 8 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 8
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~4.4 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 4.4
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "openssf_scorecard_signed_releases",
                "name": "OpenSSF Scorecard: Signed-Releases",
                "detail": "Project has not signed or included provenance with any releases.",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "abandonment",
            "band": "excellent",
            "name": "Abandonment",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "cap": null,
              "state": "maintained",
              "guards": [],
              "signals": [],
              "red_flag": false,
              "multiplier_pct": 100,
              "declared_reason": null,
              "unverified_reason": null,
              "unanswered_open_prs": null,
              "unanswered_open_issues": null,
              "days_since_last_merged_pr": null,
              "days_since_last_human_commit": 8,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "last human commit 8 days ago",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_maintained",
                    "params": {
                      "days": 8
                    }
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "at_risk",
        "name": "Community & Adoption",
        "value": 43,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "at_risk",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 37,
            "inputs": {
              "forks": 4,
              "stars": 114,
              "watchers": 2,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "114 stars",
                "points": 33.3,
                "status": "partial",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 114
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "4 forks",
                "points": 4,
                "status": "partial",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 4
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "2 watchers",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 2
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "moderate",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 50,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "has_contributing": false,
              "has_issue_template": false,
              "has_code_of_conduct": false,
              "has_pull_request_template": false
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 22.5,
                "status": "met",
                "details": [],
                "max_points": 22.5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "recognized license (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": 0,
                "status": "missed",
                "details": [],
                "max_points": 18
              },
              {
                "key": "code_of_conduct",
                "name": "Code of conduct",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 13.5
              },
              {
                "key": "issue_template",
                "name": "Issue template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.2
              },
              {
                "key": "pr_template",
                "name": "PR template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.3
              }
            ]
          }
        ],
        "description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
      },
      {
        "key": "governance",
        "band": "moderate",
        "name": "Sustainability & Governance",
        "value": 60,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "critical",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 20,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 7,
              "top_contributor_share": 0.955
            },
            "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 96% of commits",
                "points": 1,
                "status": "partial",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 96
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "7 contributors",
                "points": 9.5,
                "status": "partial",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 7
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 0 contributing companies or organizations -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "good",
            "name": "Issue & PR responsiveness",
            "note": null,
            "notes": [],
            "value": 77,
            "inputs": {
              "merged_prs": 12,
              "open_issues": 0,
              "closed_issues": 7,
              "issue_closed_ratio": 1,
              "closed_unmerged_prs": 3
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "100% of issues closed",
                "points": 46.8,
                "status": "met",
                "details": [
                  {
                    "code": "issues_closed_share",
                    "params": {
                      "share": 100
                    }
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "12/15 decided PRs merged",
                "points": 30.6,
                "status": "partial",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 12,
                      "decided": 15
                    }
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 1/30 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "moderate",
            "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": 57,
            "inputs": {
              "followers": 30,
              "owner_type": "User",
              "is_verified": null,
              "owner_login": "neilberkman",
              "public_repos": 84,
              "account_age_days": 6443
            },
            "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": "30 followers of neilberkman",
                "points": 10.7,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 30,
                      "login": "neilberkman"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "84 public repos, account ~17 yr old",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 84
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 17
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "excellent",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "github.com/neilberkman/ccrider"
              ],
              "ecosystems": "go",
              "any_deprecated": false,
              "min_days_since_publish": 8
            },
            "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 8 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 8
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "43 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 43
                    }
                  }
                ],
                "max_points": 20
              },
              {
                "key": "not_deprecated",
                "name": "Not deprecated",
                "detail": "active, not deprecated or yanked",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "package_not_deprecated",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          }
        ],
        "description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?"
      },
      {
        "key": "engineering",
        "band": "moderate",
        "name": "Engineering Quality",
        "value": 68,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "moderate",
            "name": "Engineering practices",
            "note": null,
            "notes": [],
            "value": 64,
            "inputs": {
              "has_ci": true,
              "has_tests": true,
              "has_editorconfig": false,
              "has_linter_config": true,
              "has_precommit_config": false
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": "2 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 2
                    }
                  }
                ],
                "max_points": 24
              },
              {
                "key": "tests_present",
                "name": "Tests present",
                "detail": null,
                "points": 24,
                "status": "met",
                "details": [],
                "max_points": 24
              },
              {
                "key": "linter_config",
                "name": "Linter config",
                "detail": ".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": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.4
              },
              {
                "key": "openssf_scorecard_ci_tests",
                "name": "OpenSSF Scorecard: CI-Tests",
                "detail": "0 out of 1 merged PRs checked by a CI test -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "good",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 75,
            "inputs": {
              "topics": [],
              "has_wiki": true,
              "homepage": null,
              "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": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "repository_description",
                "name": "Repository description",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "topics",
                "name": "Topics",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              },
              {
                "key": "wiki",
                "name": "Wiki",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          }
        ],
        "description": "Are baseline engineering and documentation practices in place?"
      },
      {
        "key": "security",
        "band": "at_risk",
        "name": "Security",
        "value": 35,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "at_risk",
            "name": "Security posture",
            "note": null,
            "notes": [],
            "value": 35,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 18,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 0,
              "scorecard_aggregate": 3.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": "0 out of 1 merged PRs checked by a CI test -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "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 1/30 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 0 contributing companies or organizations -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "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": "no update tool detected",
                "points": 0,
                "status": "missed",
                "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": "28 commit(s) and 3 issue activity found in the last 90 days -- score normalized to 10",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "packaging",
                "name": "Packaging",
                "detail": "packaging workflow detected",
                "points": 5,
                "status": "met",
                "details": [],
                "max_points": 5
              },
              {
                "key": "pinned_dependencies",
                "name": "Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "sast",
                "name": "SAST",
                "detail": "SAST tool is not run on all commits -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "security_policy",
                "name": "Security-Policy",
                "detail": "security policy file not detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "signed_releases",
                "name": "Signed-Releases",
                "detail": "Project has not signed or included provenance with any releases.",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "token_permissions",
                "name": "Token-Permissions",
                "detail": "detected GitHub workflow tokens with excessive permissions",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "vulnerabilities",
                "name": "Vulnerabilities",
                "detail": "4 existing vulnerabilities detected",
                "points": 4.5,
                "status": "partial",
                "details": [],
                "max_points": 7.5
              }
            ]
          },
          {
            "key": "high_risk_jurisdiction_exposure",
            "band": "excellent",
            "name": "High-Risk Jurisdiction Exposure",
            "note": "Only high-confidence self-published location evidence affects this multiplier. Ambiguous matches are review-only; country evidence is not proof of nationality, citizenship, legal registration, malicious intent, or sanctions status.",
            "notes": [
              {
                "code": "jurisdiction_evidence_limits",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "meaning": "self-published location evidence; not nationality or citizenship",
              "red_flag": false,
              "exposures": [],
              "policy_countries": [
                "Russia",
                "Iran",
                "North Korea"
              ],
              "review_only_matches": 0,
              "assessed_self_published_locations": 3
            },
            "components": [
              {
                "key": "policy_exposure_multiplier",
                "name": "Policy exposure multiplier",
                "detail": "no confirmed policy-scope location match",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "jurisdiction_no_match",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Are visible security and supply-chain practices strong, with no malicious dependency and no unresolved high-risk jurisdiction exposure?"
      },
      {
        "key": "ai_readiness",
        "band": "good",
        "name": "AI Readiness",
        "value": 76,
        "weight": 0,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "excellent",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 85,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": 0.77,
              "agent_instruction_files": [
                ".claude/CLAUDE.md",
                "AGENTS.md"
              ],
              "agent_instruction_max_bytes": 6389
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": ".claude/CLAUDE.md, AGENTS.md",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": ".claude/CLAUDE.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": "77 of 100 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 77,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "good",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 82,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [
                "go.sum"
              ],
              "has_dockerfile": false,
              "typed_language": true,
              "bootstrap_files": [
                "Makefile"
              ],
              "has_devcontainer": false,
              "has_linter_config": true,
              "typecheck_configs": [],
              "agent_commit_share": 0.23,
              "toolchain_manifests": [
                "go.mod"
              ],
              "dependency_bot_commit_share": 0
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": "Makefile",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "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": "Go (statically typed)",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "statically_typed_language",
                    "params": {
                      "language": "Go"
                    }
                  }
                ],
                "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": "23 of the last 100 commits agent-authored or agent-credited",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "agent_authored_commits",
                    "params": {
                      "count": 23,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "automated_maintenance",
                "name": "Automated maintenance",
                "detail": "no automated dependency updates observed",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_dependency_automation",
                    "params": {}
                  }
                ],
                "max_points": 8
              },
              {
                "key": "openssf_scorecard_pinned_dependencies",
                "name": "OpenSSF Scorecard: Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "excellent",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "primary_language": "Go",
              "largest_source_bytes": 26299,
              "source_files_sampled": 81,
              "oversized_source_files": 0
            },
            "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": "0/81 source files over 60KB",
                "points": 55,
                "status": "met",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 81,
                      "oversized": 0
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          },
          {
            "key": "ai_interfaces",
            "band": "critical",
            "name": "Machine-readable interfaces",
            "note": null,
            "notes": [],
            "value": 20,
            "inputs": {
              "example_dirs": [],
              "has_mcp_signal": true,
              "api_schema_files": []
            },
            "components": [
              {
                "key": "api_schema_openapi_graphql_proto",
                "name": "API schema (OpenAPI/GraphQL/proto)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 40
              },
              {
                "key": "mcp_server",
                "name": "MCP server",
                "detail": null,
                "points": 20,
                "status": "met",
                "details": [],
                "max_points": 20
              },
              {
                "key": "runnable_examples",
                "name": "Runnable examples",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 40
              }
            ]
          }
        ],
        "description": "How well is the repo equipped to be developed and maintained with AI coding agents? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score."
      }
    ],
    "metrics_version": "1.13.0"
  },
  "warnings": [
    "Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token",
    "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-24T12:31:43.934337Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/n/neilberkman/ccrider.svg",
  "full_name": "neilberkman/ccrider",
  "license_state": "standard",
  "license_spdx": "MIT"
}

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

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

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