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

hellcoderGIT / companion

Web & Mobile UI for Claude Code & Codex . Launch sessions, stream responses, approve tools. All from your browser / mobile

TypeScriptMIT★ 1 星标⑂ 1 复刻始于 2026年4月复刻在 GitHub 上查看 ↗

hellcoderGIT/companion 的健康指数为 100 分中的 57 分,处于「中等」区间。 其得分最高的类别是Vitality(86/100),最低的是Community & Adoption(24/100)。 最近一次更新在 5 天前。 近期的大部分工作由 1 位贡献者完成。

57
总分 / 100
中等

软件健康指数

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

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

评分画像

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

所有权

Moritz个人账户
1 关注者3 个公开仓库始于 2013年8月

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

软件包生态系统

注册表软件包版本月下载量版本数最近发布标签
npm@hellcoder/companion0.108.03,170665 天前claudeclaude-codeaiagentweb-uivibe-coding

按类别列示的指标

活力

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

86优秀 · 占总体的 22%
评分方式
36/36推送新近度 — 最近一次推送于 5 天前
11.8/36提交节奏 — 52 周中有 17 周有提交
18/18提交量 — 最近一年 582 次提交
10/10OpenSSF Scorecard:Maintained — 30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
所用输入
commits_last_year582
human_commit_share0.69
days_since_last_push5
active_weeks_last_year17

发布纪律

100优秀
评分方式
27/27有发布版本 — 已发布 23 个发布版本
36/36发布时效 — 最近一次发布版本于 5 天前
27/27发布节奏 — 约每 3.4 天发布一次
0/10OpenSSF Scorecard:Signed-Releases — 无数据
所用输入
releases_count23
latest_release_tagcompanion-v0.108.0
releases_from_tags
days_since_latest_release5
mean_days_between_releases3.4
已排除计分(无数据或不适用):OpenSSF Scorecard:Signed-Releases。 其余权重已重新归一化。

社区与采用

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

24危急 · 占总体的 18%
评分方式
0/60星标 — 1 个星标
0/25复刻 — 1 个复刻
0/15关注者 — 0 位关注者
所用输入
forks1
stars1
watchers0
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history

社区健康

25危急
评分方式
0/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
评分方式
46.7/80月度下载量 — npm 合计每月 3,170 次下载
0/20注册表被依赖数 — 该生态系统不报告此项
所用输入
packages@hellcoder/companion
dependents
ecosystemsnpm
total_downloads
monthly_downloads3,170
已排除计分(无数据或不适用):注册表被依赖数。 其余权重已重新归一化。

可持续性与治理

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

58中等 · 占总体的 24%
评分方式
9/54巴士系数 — 1 位贡献者贡献了半数提交
4.3/22.5提交分布 — 头号贡献者编写了 81% 的提交
13.5/13.5贡献者广度 — 16 位贡献者
10/10OpenSSF Scorecard:Contributors — project has 3 contributing companies or organizations -- score normalized to 10
所用输入
bus_factor1
contributors_sampled16
top_contributor_share0.811
评分方式
0/46.8议题解决 — 没有议题或无数据
38.2/38.3PR 接受 — 已裁定的 PR 中 63/63 已合并
0/15OpenSSF Scorecard:Code-Review — Found 0/17 approved changesets -- score normalized to 0
所用输入
merged_prs63
open_issues0
closed_issues0
issue_closed_ratio
closed_unmerged_prs0
已排除计分(无数据或不适用):议题解决。 其余权重已重新归一化。
评分方式
10/30所有权背书 — 个人(用户)账户
0/20已验证域名 — 不适用于个人账户
2.2/25所有者影响力 — hellcoderGIT 有 1 位关注者
16.4/25既往记录 — 3 个公开仓库,账户约 12 年
所用输入
followers1
owner_typeUser
is_verified
owner_loginhellcoderGIT
public_repos3
account_age_days4,712
已排除计分(无数据或不适用):已验证域名。 其余权重已重新归一化。
评分方式
25/25已发布且可解析 — npm 上有 1 个软件包
35/35发布时效 — 最近一次发布于 5 天前
20/20版本历史 — 66 个已发布版本
20/20未被弃用 — 活跃,未被弃用或撤回
所用输入
packages@hellcoder/companion
ecosystemsnpm
any_deprecated
min_days_since_publish5

工程质量

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

55中等 · 占总体的 20%

工程实践

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

文档

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

安全

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

56中等 · 占总体的 16%

安全态势

45存在风险
评分方式
7.5/7.5Binary-Artifacts — no binaries found in the repo
0/7.5Branch-Protection — branch protection not enabled on development/release branches
1.2/2.5CI-Tests — 16 out of 28 merged PRs checked by a CI test -- score normalized to 5
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
0/7.5Code-Review — Found 0/17 approved changesets -- score normalized to 0
2.5/2.5Contributors — project has 3 contributing companies or organizations -- score normalized to 10
10/10Dangerous-Workflow — no dangerous workflow patterns detected
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 — 30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
5/5Packaging — packaging workflow detected
0/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
0/5SAST — SAST tool is not run on all commits -- score normalized to 0
0/5Security-Policy — security policy file not detected
0/7.5Signed-Releases — 无数据
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
7.5/7.5Vulnerabilities — 0 existing vulnerabilities detected
所用输入
sourceopenssf_scorecard
checks_evaluated17
scorecard_versionv5.5.0
checks_inconclusive1
scorecard_aggregate4.5
已排除计分(无数据或不适用):signed_releases。 其余权重已重新归一化。
评分方式
35/35直接依赖不含已知公告 — 没有直接依赖携带已知公告
25/25间接依赖不含已知公告 — 没有间接依赖携带已知公告
0/40没有长期未处理的公告 — 没有公告带有发布日期
所用输入
sourceosv
advisories0
affected_packages0
assessed_packages89
unassessed_packages0
affected_by_severitynone
direct_affected_packages0
已排除计分(无数据或不适用):没有长期未处理的公告。 其余权重已重新归一化。 比对的是 npm:@hellcoder/companion@0.108.0 的运行时依赖闭包——安装已发布的软件包时真正被拉取进来的内容——共 89 个软件包。 未对可达性进行分析。

AI 就绪度

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

81良好 · 占总体的 0%
评分方式
45/45代理指令 — AGENTS.md, CLAUDE.md
0/15机器可读文档(llms.txt)
40/40可读的提交历史 — 69 次人类提交中有 69 次说明了意图(结构化标题或解释性正文)
所用输入
has_llms_txt
legible_history_share1
agent_instruction_filesAGENTS.md, CLAUDE.md
agent_instruction_max_bytes10,656
评分方式
18/18一条命令的引导启动 — Makefile
22/22自动化测试
0/11Lint / 格式化配置
11/11静态类型检查 — landing/tsconfig.json, platform/tsconfig.json, relay/tsconfig.json, web/tsconfig.json
10/10可复现环境 — Dockerfile
10/10已体现的代理实践 — 最近 100 次提交中有 52 次由代理编写或署名代理
0/8自动化维护 — 未观察到自动依赖更新
0/10OpenSSF Scorecard:Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
所用输入
has_nix
has_tests
lockfiles
has_dockerfile
typed_language
bootstrap_filesMakefile
has_devcontainer
has_linter_config
typecheck_configslanding/tsconfig.json, platform/tsconfig.json, relay/tsconfig.json, web/tsconfig.json
agent_commit_share0.52
toolchain_manifests
dependency_bot_commit_share0
评分方式
45/45可类型检查的代码 — TypeScript(静态类型)
53.2/55可控的文件大小 — 采样的 522 个源文件中有 17 个超过 60KB
所用输入
primary_languageTypeScript
largest_source_bytes234,876
source_files_sampled522
oversized_source_files17

关键数据

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

数据采集警告

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

更多细节

OpenSSF Scorecard 4.5 / 10
4.5综合

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

10Binary-Artifactsno binaries found in the repo
0Branch-Protectionbranch protection not enabled on development/release branches
5CI-Tests16 out of 28 merged PRs checked by a CI test -- score normalized to 5
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
0Code-ReviewFound 0/17 approved changesets -- score normalized to 0
10Contributorsproject has 3 contributing companies or organizations -- score normalized to 10
10Dangerous-Workflowno dangerous workflow patterns detected
0Dependency-Update-Toolno update tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
10Maintained30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
10Packagingpackaging workflow detected
0Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 0
0SASTSAST tool is not run on all commits -- score normalized to 0
0Security-Policysecurity policy file not detected
不适用Signed-Releasesno releases found
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
10Vulnerabilities0 existing vulnerabilities detected
直接依赖 38
注册表软件包版本约束清单文件
npmreact^19.0.0landing/package.json
npmreact-dom^19.0.0landing/package.json
npmthe-companion^0.2.2package.json
npmbetter-auth^1.4.0platform/package.json
npmclass-variance-authority^0.7.1platform/package.json
npmclsx^2.1.1platform/package.json
npmdrizzle-orm^0.39.0platform/package.json
npmhono^4.7.0platform/package.json
npmlucide-react^0.575.0platform/package.json
npmdrizzle-kit^0.30.0platform/package.json
npmpostgres^3.4.8platform/package.json
npmreact^19.0.0platform/package.json
npmreact-dom^19.0.0platform/package.json
npmresend^6.9.4platform/package.json
npmstripe^17.0.0platform/package.json
npmtailwind-merge^3.5.0platform/package.json
npm@codemirror/lang-cpp^6.0.3web/package.json
npm@codemirror/lang-css^6.3.1web/package.json
npm@codemirror/lang-html^6.4.11web/package.json
npm@codemirror/lang-java^6.0.2web/package.json
npm@codemirror/lang-javascript6.2.4web/package.json
npm@codemirror/lang-json^6.0.2web/package.json
npm@codemirror/lang-markdown^6.5.0web/package.json
npm@codemirror/lang-python^6.2.1web/package.json
npm@codemirror/lang-rust^6.0.2web/package.json
npm@codemirror/lang-sql^6.10.0web/package.json
npm@codemirror/lang-xml^6.1.0web/package.json
npm@codemirror/lang-yaml^6.1.2web/package.json
npm@codemirror/view6.39.15web/package.json
npm@uiw/react-codemirror4.25.4web/package.json
npmaxe-core^4.11.1web/package.json
npmcroner^10.0.1web/package.json
npmdiff^8.0.3web/package.json
npmfzf^0.5.2web/package.json
npmhono^4.7.0web/package.json
npmposthog-js^1.347.2web/package.json
npmqrcode^1.5.4web/package.json
npmws^8.19.0web/package.json
全部依赖 未采集

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

依赖安全公告 0

安装 npm:@hellcoder/companion@0.108.0 会引入 89 个包(直接与传递):其中 0 个存在已知公告,0 个为直接依赖。

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

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

原始 JSON 报告 机器可读
{
  "data": {
    "repo": {
      "topics": [],
      "is_fork": true,
      "size_kb": 10081,
      "has_wiki": true,
      "homepage": "https://thecompanion.sh",
      "languages": {
        "CSS": 23037,
        "HTML": 2753,
        "Shell": 16770,
        "Makefile": 373,
        "Dockerfile": 1356,
        "JavaScript": 6576,
        "TypeScript": 6785665
      },
      "pushed_at": "2026-07-19T08:09:08Z",
      "created_at": "2026-04-20T02:03:48Z",
      "owner_type": "User",
      "updated_at": "2026-07-19T08:09:12Z",
      "description": "Web & Mobile UI for Claude Code & Codex . Launch sessions, stream responses, approve tools.  All from your browser / mobile",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "MIT",
      "default_branch": "main",
      "license_spdx_raw": "MIT",
      "primary_language": "TypeScript",
      "significant_languages": [
        "TypeScript"
      ]
    },
    "owner": {
      "blog": null,
      "name": "Moritz",
      "type": "User",
      "login": "hellcoderGIT",
      "company": null,
      "location": null,
      "followers": 1,
      "avatar_url": "https://avatars.githubusercontent.com/u/5343954?v=4",
      "created_at": "2013-08-30T03:47:36Z",
      "is_verified": null,
      "public_repos": 3,
      "account_age_days": 4712
    },
    "license": {
      "state": "standard",
      "spdx_id": "MIT",
      "raw_spdx": "MIT",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": false
    },
    "activity": {
      "releases": [
        {
          "tag": "companion-v0.108.0",
          "kind": "other",
          "published_at": "2026-07-19T07:57:46Z"
        },
        {
          "tag": "companion-v0.107.0",
          "kind": "other",
          "published_at": "2026-07-08T07:56:14Z"
        },
        {
          "tag": "companion-v0.106.0",
          "kind": "other",
          "published_at": "2026-07-06T09:40:27Z"
        },
        {
          "tag": "companion-v0.105.3",
          "kind": "other",
          "published_at": "2026-07-02T06:15:33Z"
        },
        {
          "tag": "companion-v0.105.2",
          "kind": "other",
          "published_at": "2026-07-01T00:33:38Z"
        },
        {
          "tag": "companion-v0.105.1",
          "kind": "other",
          "published_at": "2026-06-26T05:26:57Z"
        },
        {
          "tag": "companion-v0.105.0",
          "kind": "other",
          "published_at": "2026-06-23T08:00:11Z"
        },
        {
          "tag": "companion-v0.104.3",
          "kind": "other",
          "published_at": "2026-06-19T10:40:43Z"
        },
        {
          "tag": "companion-v0.104.2",
          "kind": "other",
          "published_at": "2026-06-19T09:56:02Z"
        },
        {
          "tag": "companion-v0.104.1",
          "kind": "other",
          "published_at": "2026-06-18T07:35:46Z"
        },
        {
          "tag": "companion-v0.104.0",
          "kind": "other",
          "published_at": "2026-06-18T04:00:54Z"
        },
        {
          "tag": "companion-v0.103.0",
          "kind": "other",
          "published_at": "2026-06-18T03:25:29Z"
        },
        {
          "tag": "companion-v0.102.1",
          "kind": "other",
          "published_at": "2026-06-17T04:17:19Z"
        },
        {
          "tag": "companion-v0.102.0",
          "kind": "other",
          "published_at": "2026-06-16T09:24:18Z"
        },
        {
          "tag": "companion-v0.101.2",
          "kind": "other",
          "published_at": "2026-06-15T01:51:10Z"
        },
        {
          "tag": "companion-v0.101.1",
          "kind": "other",
          "published_at": "2026-06-13T08:26:58Z"
        },
        {
          "tag": "companion-v0.101.0",
          "kind": "other",
          "published_at": "2026-06-12T00:53:44Z"
        },
        {
          "tag": "companion-v0.100.0",
          "kind": "other",
          "published_at": "2026-06-11T05:52:05Z"
        },
        {
          "tag": "companion-v0.99.1",
          "kind": "other",
          "published_at": "2026-05-26T07:06:12Z"
        },
        {
          "tag": "companion-v0.99.0",
          "kind": "other",
          "published_at": "2026-05-15T07:15:21Z"
        },
        {
          "tag": "companion-v0.98.0",
          "kind": "other",
          "published_at": "2026-05-15T05:44:11Z"
        },
        {
          "tag": "companion-v0.97.0",
          "kind": "other",
          "published_at": "2026-04-20T03:34:37Z"
        },
        {
          "tag": "companion-v0.96.0",
          "kind": "other",
          "published_at": "2026-04-20T02:56:35Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "9a11f0fa3b506ab9c0c107965c681417fd4d8d3b",
          "body": "… path\n\nnpm@latest resolved to npm 12, which requires Node >= 22 and broke the\nTrusted Publishing upgrade step on the Node 20 runner. Also allows manually\ndispatching a publish when release-please has already tagged the release.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "ci(publish): pin npm@11 and Node 22; add workflow_dispatch re-publish…",
          "author_name": "MoeClaudeUI",
          "author_login": null,
          "committed_at": "2026-07-19T08:09:06Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "e8c410a40457bcf492f9cd0a22a843ccc637b09e",
          "body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(main): release companion 0.108.0 (#63)",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-19T07:57:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f983b4dccd45419cd6711bee368531c17c0622b4",
          "body": "…(#62)\n\n* feat(dashboard): add project dashboard with nightly AI session summaries\n\nAdds an opt-in project dashboard that shows where every session stands:\n- Nightly summarizer job (croner) summarizes each Claude session transcript\n  changed since the last run via the Anthropic API (Haiku 4.5 by def\n[…]\ne CLI availability instead.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: MoeClaudeUI <hellcoder@gmail.com>\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(dashboard): project dashboard with nightly AI session summaries …",
          "author_name": "Moritz",
          "author_login": "hellcoderGIT",
          "committed_at": "2026-07-19T04:06:51Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "9f18d7bc7ba5c8932e2615a3f0fc4ddc611158f9",
          "body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(main): release companion 0.107.0 (#61)",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-08T07:56:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5b270e2fb13d2c29e51a425c7853e5348c92554d",
          "body": "Add `claude-sonnet-5` (Claude 5-family Sonnet) as a selectable Claude\nmodel and remove the now-superseded Sonnet 4.6 entry. Update the model\npicker tests (backends, ModelSwitcher, HomePage) accordingly.\n\nCo-authored-by: MoeClaudeUI <hellcoder@gmail.com>\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(models): add Sonnet 5 to Claude model picker (#60)",
          "author_name": "Moritz",
          "author_login": "hellcoderGIT",
          "committed_at": "2026-07-08T07:55:23Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "1601ff9886e41e7e2ad395c251ace6643007eb10",
          "body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(main): release companion 0.106.0 (#59)",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-06T09:40:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "903b01f92e6b8a537e652c737ea1b6eb97625602",
          "body": "…ch (#58)\n\nThe proactive keepalive auto-relaunches a CLI process that exits with no\nbrowser attached, to keep long-running sessions (agents, cron) alive. Add a\nglobal setting (proactiveKeepaliveEnabled, default on) so operators can turn\nit off and let dead sessions stay dead while experimenting.\n\nsc\n[…]\nnager, the settings REST route (with boolean validation),\nand a toggle in Settings → General.\n\nCo-authored-by: MoeClaudeUI <hellcoder@gmail.com>\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(settings): add kill-switch to disable proactive keepalive relaun…",
          "author_name": "Moritz",
          "author_login": "hellcoderGIT",
          "committed_at": "2026-07-06T09:39:40Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "86a5a7315f6baace1812efeb88e622577a355a1b",
          "body": "Scheduled agents used process liveness (isAlive) as the overlap guard, but\nthe stdio CLI stays alive after a turn until the session is archived — so\nisAlive was permanently true and every subsequent scheduled run was skipped\nuntil someone manually archived the open session.\n\nAdd a per-agent restartM\n[…]\nkip\" preserves the old wait-if-open\nbehavior. Manual/forced runs still bypass the skip guard.\n\nCo-authored-by: MoeClaudeUI <hellcoder@gmail.com>\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(agents): terminate leftover session before scheduled runs (#57)",
          "author_name": "Moritz",
          "author_login": "hellcoderGIT",
          "committed_at": "2026-07-06T09:38:56Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "50e8ea3f8601a1b3c1541662dd5dc265d9d47606",
          "body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(main): release companion 0.105.3 (#56)",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-02T06:15:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e81f5cca3bd51243856a516e06d982f0a437409a",
          "body": "… (#55)\n\nNon-image uploads to a Claude session are supposed to be written to\n<cwd>/.companion-uploads/ and referenced by relative path so Claude reads\nthem from disk with its Read tool. PDFs were exempt: they were inlined as\nbase64 `document` blocks and handed to Claude directly. That pushes the who\n[…]\nery other non-image file. Only images inline now,\nwhich matches the Codex adapter's behavior.\n\nCo-authored-by: MoeClaudeUI <hellcoder@gmail.com>\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(claude-adapter): stage PDFs to disk instead of inlining to Claude…",
          "author_name": "Moritz",
          "author_login": "hellcoderGIT",
          "committed_at": "2026-07-02T06:14:42Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "b9a7e0f53b200430a161347ed784586345814d24",
          "body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(main): release companion 0.105.2 (#54)",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-01T00:33:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "464c71f0511afccc385b25a2bdd342ccf90ab906",
          "body": "…ean turn-end (#53)\n\nWhen the Claude CLI's stdout EOFs right after a turn-ending `result`, the\nprocess is shutting down cleanly but can take longer than the 2s grace to\nflush teardown (MCP servers, etc.) and exit code-0. The adapter was\nSIGTERM-ing it during that window, converting a code-0 exit int\n[…]\ncovery. The result grace stays\nbounded so a teardown deadlock after a result is still killed.\n\nCo-authored-by: MoeClaudeUI <hellcoder@gmail.com>\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(claude-adapter): stop relaunch churn from premature SIGTERM on cl…",
          "author_name": "Moritz",
          "author_login": "hellcoderGIT",
          "committed_at": "2026-07-01T00:29:11Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "88c45ae6528fb2b79c3129c3d1aed73d9a54a831",
          "body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(main): release companion 0.105.1 (#51)",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-06-26T05:26:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "191e34274de2d2f801b61833d61509409d9ccc21",
          "body": "…#52)\n\n* fix(codex): fetch model list live from app-server, drop stale cache\n\nRecent Codex releases (0.142.x, GPT-5.5) no longer write\n~/.codex/models_cache.json and serve their model catalog over the\napp-server `model/list` RPC instead. The companion's model picker read\nthe now-missing cache file, \n[…]\n to satisfy the 80% gate.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: MoeClaudeUI <hellcoder@gmail.com>\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(codex): fetch model list live from app-server, drop stale cache (…",
          "author_name": "Moritz",
          "author_login": "hellcoderGIT",
          "committed_at": "2026-06-26T05:26:09Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "10d7236f3c5818e486a5d690e8ebf07b25d50043",
          "body": "Up to ~10 minutes of silence is normal for long-running agents (builds,\nlarge web fetches, subagents), so warning at 7 minutes fired too eagerly.\nRaise ACTIVITY_STALLED_MS from 7 to 15 minutes and add a regression test\nasserting 10 minutes still reads as \"quiet\" rather than \"may be stuck\".\n\nCo-authored-by: MoeClaudeUI <hellcoder@gmail.com>\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(feed): raise \"may be stuck\" warning to 15min (#50)",
          "author_name": "Moritz",
          "author_login": "hellcoderGIT",
          "committed_at": "2026-06-24T13:51:49Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "2b64152d87fccc086f2694179c28dec398120769",
          "body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(main): release companion 0.105.0 (#49)",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-06-23T08:00:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "280fa4c64d7c214f4e2998e381cb07c6b4e42ae0",
          "body": "Add an effort dropdown next to the model selector so a session can be\nlaunched at a specific reasoning effort (Low / Medium / High / xHigh /\nMax), mapped to the Claude Code CLI's --effort flag. The default option\npasses no flag, so the model keeps its own built-in default effort.\n\n- Claude-only: Cod\n[…]\nionStream -> CreateSessionRequest -> launcher,\n  which adds `--effort <level>` only when non-empty and preserves it\n  across --resume relaunch.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(home): add reasoning-effort selector to the new-session screen",
          "author_name": "MoeClaudeUI",
          "author_login": null,
          "committed_at": "2026-06-22T03:02:22Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "d720c0a8e1beb90855c8775303e0e6801864b2a4",
          "body": "Replay an in-flight user turn after a --resume relaunch so a CLI death\nmid-turn no longer leaves the session waiting forever; detect auth\nfailures and skip auto-relaunch (which only loops back into the same\nexpired credentials) in favour of a re-login affordance; and re-queue\nmessages that hit a dyi\n[…]\nead pipe.\n- Surface an auth failure as a single re-login banner (drop the duplicate\n  auth_status bubble that stacked the same guidance twice).\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(cli): recover sessions that hang after CLI death or auth failure",
          "author_name": "MoeClaudeUI",
          "author_login": null,
          "committed_at": "2026-06-22T03:02:22Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "2961437fea9a65bccdfccb162ccf9c2fc4c5b8d3",
          "body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(main): release companion 0.104.3 (#47)",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-06-19T10:40:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0143a8187bc115b7a92143d80db46d6e94e77582",
          "body": "…#46)\n\nThe stdio adapter killed any CLI whose stdout EOF'd while the process was\nstill alive. But the CLI routinely closes stdout a beat *before* it exits\ncleanly (e.g. right after a `result`), so this converted a code-0 exit into a\nSIGTERM (143) and forced a needless --resume relaunch — churning he\n[…]\n wedged processes (e.g. stopped emitting after a 429)\nwhile no longer clobbering clean exits.\n\nCo-authored-by: MoeClaudeUI <hellcoder@gmail.com>\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(adapter): grace period before killing a CLI whose stdout closed (…",
          "author_name": "Moritz",
          "author_login": "hellcoderGIT",
          "committed_at": "2026-06-19T10:39:54Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "484509dc6b195d07c4bc2376b060f79e360e9f27",
          "body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(main): release companion 0.104.2 (#45)",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-06-19T09:55:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "edae64b586427e80a921003e854c759f4bb84d08",
          "body": "…(#44)\n\n* fix(session): cap auto-relaunch with a rolling window to stop invisible crash loops\n\nThe per-attempt budget (MAX_AUTO_RELAUNCHES) only catches *fast* re-crashes.\nA session that crashes every minute or two stays connected just long enough\n(> HEALTHY_UPTIME_MS) for scheduleHealthyReset to wi\n[…]\n and the Playground mock.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: MoeClaudeUI <hellcoder@gmail.com>\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: stop invisible CLI relaunch loops and delay stuck warning to 7m …",
          "author_name": "Moritz",
          "author_login": "hellcoderGIT",
          "committed_at": "2026-06-19T09:49:52Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "2ec188a248a5505938e4ebb318c455730d83d184",
          "body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(main): release companion 0.104.1 (#43)",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-06-18T07:35:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8af18671e5190c3693a865bb0e55f31e30b93f26",
          "body": "…uck-session diagnostics (#42)\n\nWhen a turn is interrupted mid-stream (CLI crash/relaunch/disconnect/reconnect),\nthe client cleared sessionStatus and the composer spinner but left the in-flight\nisStreaming draft message in the feed. With no \"Generating\" bar (gated on\nsessionStatus === \"running\") and\n[…]\nices in the chat, and\nstructured logs (browser + Companion server) for the next error search.\n\nCo-authored-by: MoeClaudeUI <hellcoder@gmail.com>\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(session): clear orphaned streaming draft on interruption + add st…",
          "author_name": "Moritz",
          "author_login": "hellcoderGIT",
          "committed_at": "2026-06-18T07:09:24Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "d39343037dea48a8eecc617ad8e63c4a14fba348",
          "body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(main): release companion 0.104.0 (#40)",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-06-18T04:00:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7c84217ad0173229d4e450f7904510e89640a9ca",
          "body": "Surfaces host memory usage so an approaching out-of-memory condition is\nvisible at a glance (we hit OOM on another server and it was hard to spot).\n\n- New GET /api/system/memory endpoint. On Linux it reads /proc/meminfo and\n  uses MemAvailable (accounts for reclaimable cache → real OOM headroom),\n  \n[…]\nored red >80% / amber >50%). Polls once a\n  minute — cheap and slow-moving. Backend-agnostic.\n\nCo-authored-by: MoeClaudeUI <hellcoder@gmail.com>\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(panel): add server memory usage meter to the side panel (#41)",
          "author_name": "Moritz",
          "author_login": "hellcoderGIT",
          "committed_at": "2026-06-18T04:00:01Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "0e79d7f104e55a6626284000599eb57a42a6a4fb",
          "body": "… (#39)\n\nReplaces the auto-derived initials with the intended behaviour:\n\n- The session prefix is the user's own initials, typed by them. Placeholder\n  is \"e.g. MA\" (no longer \"billing\"); it is not derived from the name.\n- \"Your name\" stays first-name only (placeholder \"e.g. Moritz\").\n- When no pref\n[…]\nthe auto-generated name, so\n  the session is named \"{prefix}_{topic}\" (e.g. \"MA_InvoicePdf\").\n\nCo-authored-by: MoeClaudeUI <hellcoder@gmail.com>\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(home): refine session naming — typed prefix, name fallback, topic…",
          "author_name": "Moritz",
          "author_login": "hellcoderGIT",
          "committed_at": "2026-06-18T03:49:26Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "b2e038144e51ba8e77e29fb5e645e9cc2c2ef9f2",
          "body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(main): release companion 0.103.0 (#37)",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-06-18T03:25:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c76442a4d0cd169ff865ee4062242dea21e2e2f1",
          "body": "…topic (#38)\n\nTwo small new-session naming improvements:\n\n- The session prefix now defaults to the user's initials (e.g. \"Moritz\n  Aschoff\" -> \"MA\") instead of the \"billing\" example placeholder. When no\n  prefix is explicitly set, the initials are used so sessions are tagged\n  with who created them.\n[…]\nrefix}_{topic}\" (e.g. \"MA_InvoicePdf\"). Empty topic falls back to the\n  existing random name.\n\nCo-authored-by: MoeClaudeUI <hellcoder@gmail.com>\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(home): default session prefix to user initials and add optional …",
          "author_name": "Moritz",
          "author_login": "hellcoderGIT",
          "committed_at": "2026-06-18T03:24:37Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "6929c50f45c7507060a71f5928a8a6dde5dcb189",
          "body": "…#36)\n\nThe working indicator was gated solely on sessionStatus === \"running\",\nwhich only flipped reliably after a full assistant message or a\nsession_phase event — neither covers the initial pre-first-token wait or\nevery streaming flow. As a result the indicator was often missing, and\nthere was no w\n[…]\ndex (both emit tool_progress + message flow).\nAdds Playground states and tests for all tiers.\n\nCo-authored-by: MoeClaudeUI <hellcoder@gmail.com>\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(session): make \"Generating\" indicator reliable and stall-aware (…",
          "author_name": "Moritz",
          "author_login": "hellcoderGIT",
          "committed_at": "2026-06-18T03:03:33Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "47cd6bc1b049628c5d34bb8d5fd7c9e1c2887f1a",
          "body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(main): release companion 0.102.1 (#35)",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-06-17T04:17:07Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c720db6ea3a1e21fac695bc9f1517fbffb81faad",
          "body": "…m image (#34)\n\nThe sandbox/container feature relied on the upstream, no-longer-maintained\ndocker.io/stangirard/the-companion image (run privileged). To avoid pulling or\nrunning an unmaintained image, sandbox support is now DISABLED by default behind\na feature flag. The code is kept intact so we can\n[…]\n\" notice (no pulls).\n\nRe-enable with COMPANION_SANDBOX_ENABLED=1 + VITE_SANDBOX_ENABLED=true.\n\nCo-authored-by: MoeClaudeUI <hellcoder@gmail.com>\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(sandbox): disable sandbox behind a flag; stop using the upstrea…",
          "author_name": "Moritz",
          "author_login": "hellcoderGIT",
          "committed_at": "2026-06-17T04:15:24Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "62b14e82a03ec7131a0b6b2777e6c77043bc4a92",
          "body": "… name saved (#33)\n\nThe Context panel (where identity is normally edited) only exists inside an\nopen session, so a fresh browser had no way to set a name. Surface the\nname/prefix inputs on the new-conversation screen when no name is saved yet,\nand make the name mandatory in that case. Once a name is\n[…]\nen hides the inputs again and reuses the saved value (still editable from\nthe Context panel).\n\nCo-authored-by: MoeClaudeUI <hellcoder@gmail.com>\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(session): show identity inputs on new-conversation screen when no…",
          "author_name": "Moritz",
          "author_login": "hellcoderGIT",
          "committed_at": "2026-06-17T04:13:57Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "1b57e0b7694864da3f5ed9a2812e37e71c664340",
          "body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(main): release companion 0.102.0 (#31)",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-06-16T09:24:07Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "dcfb68fb85fd9614d8778bfccfb7d2ad3cf0cf7e",
          "body": "…ptional (#32)\n\nThe name/prefix rarely change, so the prominent new-session form was the\nwrong home for them. Move the inputs into the Context panel (TaskPanel) as\na new \"Identity\" section, and stop requiring a name to start a session.\n\n- New IdentitySection in TaskPanel with name + prefix inputs, p\n[…]\nsage, prefix applied to the session name) when present.\n- Both fields are now fully optional.\n\nCo-authored-by: MoeClaudeUI <hellcoder@gmail.com>\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor(session): move identity inputs to Context panel, make name o…",
          "author_name": "Moritz",
          "author_login": "hellcoderGIT",
          "committed_at": "2026-06-16T09:22:36Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "7025b263ce8e6d038861b8793cffc5565955c0ca",
          "body": "…r (#30)\n\nRequire a name before creating a session and allow an optional session\nprefix. The name is injected into the initial message as \"[Name]: ...\"\nso the agent knows who it's talking to, and the prefix is applied to the\ngenerated session name as \"{prefix}_{Generated Name}\".\n\n- userName threads \n[…]\nult) and \"No user data\" options; only shown once\n  sessions carrying a user name have loaded.\n\nCo-authored-by: MoeClaudeUI <hellcoder@gmail.com>\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(session): add user identity, name prefix, and sidebar user filte…",
          "author_name": "Moritz",
          "author_login": "hellcoderGIT",
          "committed_at": "2026-06-15T08:52:12Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "9d828d9bba5f4b34f16f11679187595c087bc0af",
          "body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(main): release companion 0.101.2 (#29)",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-06-15T01:50:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ecc9d071844d43f522b8d8e25d3033411a75f969",
          "body": "The CLI's AskUserQuestion handler looks each answer up by the question's\nfull text, but the UI keyed the answers object by question index (\"0\").\nThe lookup missed, so the CLI returned an empty result (\"User has answered\nyour questions: .\") and the model never saw the choice — it just guessed.\n\nMap i\n[…]\n keys before sending. This was\ntransport-independent (broken under both --sdk-url and stdio).\n\nCo-authored-by: MoeClaudeUI <hellcoder@gmail.com>\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(permission): key AskUserQuestion answers by question text (#28)",
          "author_name": "Moritz",
          "author_login": "hellcoderGIT",
          "committed_at": "2026-06-15T01:49:57Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "485e510a709556174dd154fc2b6766633aff8318",
          "body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(main): release companion 0.101.1 (#27)",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-06-13T08:26:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "58af44d2634d2edb981144fab48a200f970be022",
          "body": "…me (#26)\n\nGate the auto-relaunch crash budget on real uptime instead of spawn success, so a session whose CLI keeps dying right after --resume stops looping after MAX_AUTO_RELAUNCHES and surfaces a clear in-chat message. Adds regression tests.",
          "is_bot": false,
          "headline": "fix(orchestrator): stop infinite crash-relaunch loop on poisoned resu…",
          "author_name": "Moritz",
          "author_login": "hellcoderGIT",
          "committed_at": "2026-06-13T08:25:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "caa3049520c42c34c878de0b68418dcbc476714d",
          "body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(main): release companion 0.101.0 (#25)",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-06-12T00:53:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "915ae6b7ae2186886e620e59f5903ecbc69a6228",
          "body": "Adds an Export button in the session header (TopBar) with a dropdown offering:\n- Download as HTML — self-contained file with images embedded inline as data:\n  URIs (thinking blocks collapsible, tool calls + results rendered).\n- Download as Text — plain transcript; images become\n  `[image: <type>, ~N\n[…]\nname),\nExportMenu (render + axe + interactions + error path), api.exportSession.\n\nCo-authored-by: MoeClaudeUI <hellcoder@gmail.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(session): add session export to HTML or text (#24)",
          "author_name": "Moritz",
          "author_login": "hellcoderGIT",
          "committed_at": "2026-06-12T00:52:16Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "62f315f0a11f63944d02650687ce0fd7bc562e9c",
          "body": "The Claude stdio (stream-json) adapter flipped `stdioConnected = false` on\ntransport loss but never fired its disconnect callback — unlike the WebSocket\npath (`detachWebSocket`) and the CodexAdapter (`proc.exited` →\n`cleanupAndDisconnect`). As a result the bridge kept believing the backend was\nattac\n[…]\nats on `cli_disconnected` so the spinner\n  stops and the reconnect banner shows.\n\nCo-authored-by: MoeClaudeUI <hellcoder@gmail.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(claude): recover stuck stdio sessions when the transport dies (#23)",
          "author_name": "Moritz",
          "author_login": "hellcoderGIT",
          "committed_at": "2026-06-12T00:52:13Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "fc6fbdf05eee9e79ba35521b196ebded9654968e",
          "body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(main): release companion 0.100.0 (#20)",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-06-11T05:51:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3590f0e7005877cba89e234bf2bf6efc1edcec1f",
          "body": "After the stdio stream-json migration the companion no longer uses --sdk-url,\nso the 2.1.121/2.1.170 lockdowns can't affect sessions. The ClaudeCompatBanner\nwas still firing on any 2.1.121+ binary (\"rejects local --sdk-url — sessions\nwill fail until you pin or patch\"), which is now false and mislead\n[…]\naude-patcher,\nclaude-tls, cli-ingress-server, and the legacy --sdk-url WS path).\n\nCo-authored-by: MoeClaudeUI <hellcoder@gmail.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(claude): remove obsolete --sdk-url compatibility banner (#22)",
          "author_name": "Moritz",
          "author_login": "hellcoderGIT",
          "committed_at": "2026-06-11T05:50:55Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "8008b9f4250f252691ee6985044d30b6c1cd8ee2",
          "body": "…l (#21)\n\n* feat(claude): drive Claude over stdio stream-json instead of --sdk-url\n\nThe `--sdk-url` WebSocket bridge is built on an undocumented, internal\nRemote-Control flag that Anthropic progressively locked down: 2.1.121 added a\nhostname allowlist (localhost rejected) and 2.1.170 made worker-reg\n[…]\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: MoeClaudeUI <hellcoder@gmail.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(claude): drive Claude over stdio stream-json instead of --sdk-ur…",
          "author_name": "Moritz",
          "author_login": "hellcoderGIT",
          "committed_at": "2026-06-11T05:32:33Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "5d5d2f34f620fee60fec674cd799666f1e065388",
          "body": "… list (#19)\n\n- claude-opus-4-8 becomes the new default (replaces 4.7 at the top of CLAUDE_MODELS)\n- claude-fable-5 added with ★ icon to mark the new Mythos-class tier; not the default since its safeguards route ~5% of sessions back to Opus 4.8\n- Updated the affected default-model assertions in back\n[…]\ndel ID claude-opus-4-8).\"\n  claude-fable-5  → \"I'm Claude Fable 5 (model ID claude-fable-5).\"\n\nCo-authored-by: MoeClaudeUI <hellcoder@gmail.com>\nCo-authored-by: Claude Opus 4.7 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(models): add Opus 4.8 and Fable 5 (Mythos-class) to Claude model…",
          "author_name": "Moritz",
          "author_login": "hellcoderGIT",
          "committed_at": "2026-06-10T10:55:55Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "3449f1bf46268d3992e1f35c38eb454c8aa492f0",
          "body": "Replaces the long-lived NPM_PUBLISH_TOKEN secret with GitHub OIDC.\nThe runner mints a short-lived id-token that npm verifies against the\ntrusted-publisher config registered on @hellcoder/companion. No more\ntoken rotation, no EOTP failures from 2FA-protected publish tokens.\n\n- Adds permissions: id-to\n[…]\nww.npmjs.com/package/@hellcoder/companion/access\n(done out-of-band before this PR is merged).\n\nCo-authored-by: MoeClaudeUI <hellcoder@gmail.com>\nCo-authored-by: Claude Opus 4.7 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "ci: switch npm publish to Trusted Publishing (OIDC) (#18)",
          "author_name": "Moritz",
          "author_login": "hellcoderGIT",
          "committed_at": "2026-05-26T07:19:54Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a5ca89224ca884f8e6ee4e232e23c1884792702d",
          "body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(main): release companion 0.99.1 (#17)",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-05-26T07:06:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bea346e2118abe8f1494f33ef9a5c2426d60fe29",
          "body": "…rade (#16)\n\n* fix(session-store): default to ~/.companion/sessions, never /tmp\n\n0.99.0 switched the default session directory to $TMPDIR/vibe-sessions,\nwhich on most Linux hosts is /tmp — wiped on every reboot and not\ndiscoverable to anyone with an existing ~/.companion/ corpus.\n\nDefaults to join(C\n[…]\na separate justification.\n\nCo-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: MoeClaudeUI <hellcoder@gmail.com>\nCo-authored-by: Claude Opus 4.7 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: restore ~/.companion/sessions default and drop root bypass downg…",
          "author_name": "Moritz",
          "author_login": "hellcoderGIT",
          "committed_at": "2026-05-26T07:05:21Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "07cba316a3b0f48bc1fd1bedd20224d7b2218038",
          "body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(main): release companion 0.99.0 (#14)",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-05-15T07:14:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6294bbe0f1cae2a059528dfa5d19e331483fe899",
          "body": "…nk resolution (#15)\n\nThree follow-ups to feat(claude-compat) (#13):\n\n1. detectPatched now streams the full binary instead of slicing the first\n   32 MiB. In observed Claude 2.1.142 builds the marker sits at ~166 MB\n   and ~217 MB out of 232 MB, so the previous head-of-file slice always\n   reported \n[…]\n FALSE in 378 ms\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-authored-by: MoeClaudeUI <hellcoder@gmail.com>\nCo-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(claude-compat): detect patched binary anywhere in file, fix symli…",
          "author_name": "Moritz",
          "author_login": "hellcoderGIT",
          "committed_at": "2026-05-15T07:08:39Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "15d15e5fed0bf4f843fff71c433cccc2ff657ce3",
          "body": "…m UI (#13)\n\nClaude Code CLI 2.1.121 (~2026-04-27) added a static hostname allowlist to\n--sdk-url that rejects every non-Anthropic host (validator YR4, set KU5).\nStock 2.1.121+ binaries make every spawned companion session exit immediately\nwith \"host 127.0.0.1 is not an approved Anthropic endpoint\" \n[…]\nal dependencies.\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-authored-by: MoeClaudeUI <hellcoder@gmail.com>\nCo-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(claude-compat): detect 2.1.121+ lockdown and offer pin/patch fro…",
          "author_name": "Moritz",
          "author_login": "hellcoderGIT",
          "committed_at": "2026-05-15T06:40:28Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "8e92f12d324d2c82673c7a94c2f8e42af8e051ef",
          "body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(main): release companion 0.98.0 (#8)",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-05-15T05:44:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8cac0884aff7cfd982370feb2e21e82bbae54ed3",
          "body": "…off bridge mode (#655) (#12)\n\nClaude Code v1.2.1+ rejects the literal hostname \"localhost\" in --sdk-url\nas a cross-site WebSocket hijacking hardening measure, breaking spawned\nCLI sessions. This change:\n\n* Switches the non-containerized branch in spawnCLI to ws://127.0.0.1\n  to bypass the string-ma\n[…]\nh settings-manager, settings-routes, api.ts and a new row\nin the General tab of SettingsPage.\n\nCo-authored-by: MoeClaudeUI <hellcoder@gmail.com>\nCo-authored-by: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(cli-launcher): use 127.0.0.1 in --sdk-url; add optional JSON-hand…",
          "author_name": "Moritz",
          "author_login": "hellcoderGIT",
          "committed_at": "2026-05-15T04:22:17Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "0f40433288e7e3628a5312e76e430d574837fe51",
          "body": "…or queued messages (#11)\n\nNon-image attachments are staged to <cwd>/.companion-uploads/ so the model\ncan Read them. This relied on sessionCwd being populated from system_init,\nbut system_init only arrives after the CLI WebSocket connects. User\nmessages sent before that point (very common: the bridg\n[…]\nually written to\n  disk under <cwd>/.companion-uploads/ when cwd is provided at construction.\n\nCo-authored-by: MoeClaudeUI <hellcoder@gmail.com>\nCo-authored-by: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(attachments): pass cwd at adapter construction so staging works f…",
          "author_name": "Moritz",
          "author_login": "hellcoderGIT",
          "committed_at": "2026-05-10T14:29:03Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "bc75eae8002b5180ba545484bb45dd8929b8b8c7",
          "body": "CI's jscpd@latest reports a higher duplication score than locally\n(1.6% vs 1.28% on the same SHA), so:\n\n- Extract IconToolbarButton + SaveAsPromptIcon and shared\n  openSavePromptModal helper, eliminating the remaining mobile/desktop\n  duplication of the Save-as-prompt and Attach-file buttons\n- Pin j\n[…]\nplication from 1.6% (CI failure) to 1.2% locally and removes\nall flagged Composer.tsx clones.\n\nCo-authored-by: MoeClaudeUI <hellcoder@gmail.com>\nCo-authored-by: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(composer): extract more shared toolbar buttons; pin jscpd (#10)",
          "author_name": "Moritz",
          "author_login": "hellcoderGIT",
          "committed_at": "2026-05-10T11:20:15Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a28c1043ae5905bd84fa006e36881092e7ad6716",
          "body": "…DRY guard (#9)\n\nThe mobile and desktop toolbar layouts each duplicated the mode-toggle\nand send/stop buttons, pushing the jscpd duplication score over the\n1.5% threshold (CI was failing at 1.69%). Extracting these into small\nhelper components drops the score to 1.28% with no behavior change.\n\nCo-authored-by: MoeClaudeUI <hellcoder@gmail.com>\nCo-authored-by: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor(composer): extract ModeToggleButton/SendOrStopButton to fix …",
          "author_name": "Moritz",
          "author_login": "hellcoderGIT",
          "committed_at": "2026-05-10T11:09:47Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "8b1140ec099e1e05a1418feabbf328558b52753f",
          "body": "Replaces the image-only upload flow with a generic attachment pipeline\nso users can drag-drop, paste, or pick any file. Images and PDFs are\nembedded inline as Claude content blocks; everything else is staged\nto <cwd>/.companion-uploads/ so Claude's Read tool can access it.\n\nAdds server-side validati\n[…]\nze (25MB/file, 100MB/message) and\nbase64 well-formedness, since clients can lie about either.\n\nCo-authored-by: MoeClaudeUI <hellcoder@gmail.com>\nCo-authored-by: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(attachments): support uploading any file type, not just images (#7)",
          "author_name": "Moritz",
          "author_login": "hellcoderGIT",
          "committed_at": "2026-05-10T10:54:09Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "6e9b64e21124aaaf088023471e4e3cbb14214af7",
          "body": "docs(moritz): add server-migration runbook",
          "is_bot": false,
          "headline": "Merge pull request #6 from hellcoderGIT/docs/moritz-edition-migration",
          "author_name": "Moritz",
          "author_login": "hellcoderGIT",
          "committed_at": "2026-04-20T06:08:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2ebdafcae7abf7c605204824fe098f5bf19cf01b",
          "body": "Operational runbook for cutting an existing the-companion install over to\n@hellcoder/companion without losing ~/.companion state. Self-contained so\nit can be handed verbatim to an agent on a target server.\n\nLives at the top of docs/ rather than inside the Mintlify nav tree\n(docs.json) because it's internal ops guidance, not user-facing product\ndocs — Mintlify ignores stray .md files not listed in docs.json.",
          "is_bot": false,
          "headline": "docs(moritz): add server-migration runbook",
          "author_name": "MoeClaudeUI",
          "author_login": null,
          "committed_at": "2026-04-20T06:08:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "684fe6013c1c6cee3ae8ebba79d47f7f3fc6b24a",
          "body": "…n--components--companion\n\nchore(main): release companion 0.97.0",
          "is_bot": false,
          "headline": "Merge pull request #5 from hellcoderGIT/release-please--branches--mai…",
          "author_name": "Moritz",
          "author_login": "hellcoderGIT",
          "committed_at": "2026-04-20T03:34:26Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ef014d3bfec256a3c8fff6f3463496d16cb44c7b",
          "body": null,
          "is_bot": true,
          "headline": "chore(main): release companion 0.97.0",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-04-20T03:32:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "00d0601a8a53ed77f65459084de064fa9eeb48a7",
          "body": "feat(ui): copy-to-clipboard button on code and tool-output blocks",
          "is_bot": false,
          "headline": "Merge pull request #4 from hellcoderGIT/feat/copy-code-button",
          "author_name": "Moritz",
          "author_login": "hellcoderGIT",
          "committed_at": "2026-04-20T03:32:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7c38495df6ddbc158b970973737f008b398ba83a",
          "body": "Addresses a long-standing selection-reset problem: when the assistant or a\ntool is streaming, React swaps the <pre> subtree on each new token, which\nwipes any text selection the user had made. The workaround was to pause or\nscroll to stop streaming before copying — awkward. A dedicated copy button\ns\n[…]\npyButton.test.tsx (7 cases covering render/click/success/\nfail/aria/axe) and three new assertions in MessageBubble.test.tsx that\nverify the button appears on each surface. Full suite 4952 / 4952 pass.",
          "is_bot": false,
          "headline": "feat(ui): add copy-to-clipboard button on code and tool-output blocks",
          "author_name": "MoeClaudeUI",
          "author_login": null,
          "committed_at": "2026-04-20T03:31:43Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "ab2759cba6ee58cdde44415056b94275f610588e",
          "body": "…n--components--companion\n\nchore(main): release companion 0.96.0",
          "is_bot": false,
          "headline": "Merge pull request #2 from hellcoderGIT/release-please--branches--mai…",
          "author_name": "Moritz",
          "author_login": "hellcoderGIT",
          "committed_at": "2026-04-20T02:56:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "26b3d44a9476042e59d17bf5d74dcded5b0c786c",
          "body": null,
          "is_bot": true,
          "headline": "chore(main): release companion 0.96.0",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-04-20T02:56:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ccc9c0d6c1f0d526d5ca1134241cd2656d2ad637",
          "body": "feat(models): add Claude Opus 4.7 and Codex GPT-5.3 xHigh/Max",
          "is_bot": false,
          "headline": "Merge pull request #3 from hellcoderGIT/feat/opus-4-7-and-xhigh-max",
          "author_name": "Moritz",
          "author_login": "hellcoderGIT",
          "committed_at": "2026-04-20T02:54:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5aa41ea2b4483986b601b478f0e4c212aea5d1b9",
          "body": "Add the newest Anthropic and OpenAI reasoning tiers as selectable models:\n\n- CLAUDE_MODELS: insert claude-opus-4-7 (\"Opus 4.7\") at the top so it\n  becomes the default for new Claude sessions. 4.6, Sonnet 4.6 and\n  Haiku 4.5 remain available.\n- CODEX_MODELS: insert gpt-5.3-codex-max (\"GPT-5.3 Max\") a\n[…]\n-7.\n- ModelSwitcher.test.tsx: the lone /Opus/ regex now matches two options\n  (4.7 and 4.6), so tests that needed a single match are tightened to\n  /Opus 4\\.6/ or /Opus 4\\.7/.\n\n4942 / 4942 tests pass.",
          "is_bot": false,
          "headline": "feat(models): add Claude Opus 4.7 and Codex GPT-5.3 xHigh/Max variants",
          "author_name": "MoeClaudeUI",
          "author_login": null,
          "committed_at": "2026-04-20T02:54:25Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "e1a11e4617419190e9ecfdf4cd01174a4caa9c5a",
          "body": "feat(fork): Moritz Edition branding + own npm release channel",
          "is_bot": false,
          "headline": "Merge pull request #1 from hellcoderGIT/feat/moritz-edition",
          "author_name": "Moritz",
          "author_login": "hellcoderGIT",
          "committed_at": "2026-04-20T02:28:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "db54769c042a35327aa2c8848785d1c6316cbff4",
          "body": "The existing publish.yml and preview.yml pushed docker images to\nstangirard/the-companion on Docker Hub — that's upstream's registry, not\nours, and we have no credentials for it. The auto-updater in the app only\npolls npm, so npm publishing is the only piece of the release pipeline\nthis fork actuall\n[…]\ner\n- delete docker.yml and docker-server.yml (standalone image builders; we\n  can add our own under ghcr.io/hellcoderGIT later if we want)\n\nPrereq: NPM_PUBLISH_TOKEN repo secret is already configured.",
          "is_bot": false,
          "headline": "ci: drop upstream Docker Hub publishing, keep npm release pipeline",
          "author_name": "MoeClaudeUI",
          "author_login": null,
          "committed_at": "2026-04-20T02:25:44Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "46627a6e2d4e32b775780b0180a4f614e08fd715",
          "body": "Make the fork visually distinguishable from upstream so we can tell at a\nglance which build is running. Adds a small \"Moritz Edition\" pill next to\nthe \"The Companion\" wordmark on the home page and an \"ME\" pill on the\nsidebar, both using the existing cc-primary brand color. Also updates the\n<title>, \n[…]\nile-web-app-title meta, and PWA manifest name.\n\nExisting component tests still assert on \"The Companion\" text and alt\nattribute; both are preserved, so all 154 HomePage/Sidebar tests continue\nto pass.",
          "is_bot": false,
          "headline": "feat(ui): add Moritz Edition badge to wordmark",
          "author_name": "MoeClaudeUI",
          "author_login": null,
          "committed_at": "2026-04-20T02:25:34Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b1cd299dc767814fe5be1a5222a5dff1171c2480",
          "body": "…updater\n\nSwitch the npm package name from the-companion to @hellcoder/companion so our\nfork can publish its own releases without colliding with upstream. The update\nchecker now polls the scoped package on npm, and the in-app Update & restart\nbutton installs from our package. Bin names (the-companio\n[…]\n-routes.ts: bun install -g uses the new name\n- release-please-config.json: package-name updated to match\n- tests updated accordingly (55 tests passing in the two touched files,\n  4939 passing overall)",
          "is_bot": false,
          "headline": "feat(fork): rename package to @hellcoder/companion and retarget auto-…",
          "author_name": "MoeClaudeUI",
          "author_login": null,
          "committed_at": "2026-04-20T02:25:23Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "52883144858f62d6f9b418c00432279f28d119d4",
          "body": "## Summary\n- expand the saved prompt editor into a wider split-layout workspace\n- give the content editor substantially more room for long prompt\nauthoring\n- improve scope and storage sections so metadata stays readable while\nediting\n\n## Why\n- the previous inline form was too cramped for longer reus\n[…]\npre-commit hook: cd web && bun run typecheck && bun run test --\n--coverage\n\n## Review provenance\n- Implemented by AI agent\n- Human review: no\n\n---------\n\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(prompts): expand prompt editor workspace (#640)",
          "author_name": "Stan Girard",
          "author_login": "StanGirard",
          "committed_at": "2026-04-02T18:39:11Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "4c9dbab91094d0d83a04c79681e6e153d7f17652",
          "body": "… (#639)\n\n## Summary\n- When the CLI exits plan mode autonomously (after ExitPlanMode tool\napproval), it reports the new `permissionMode` in its `system.status`\nmessage\n- The server was updating internal state but **never broadcasting** a\n`session_update` to connected browsers\n- This left the browser\n[…]\nunchanged (avoids\nunnecessary chatter)\n- Typecheck passes (`tsc --noEmit`)\n\n## Review provenance\n- Implemented by AI agent\n- Human review: no\n\n---------\n\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(ws-bridge): broadcast permissionMode changes from CLI to browsers…",
          "author_name": "Stan Girard",
          "author_login": "StanGirard",
          "committed_at": "2026-04-02T06:06:54Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "abdfb4bc7e096e810bde30b3cac844ceb2d8f469",
          "body": "…nd tasks (#638)\n\n## Summary\n- Adds a floating **ActivityTray** component (pill + expandable panel)\nthat shows background agent status and task progress within a session\n- Detects `Agent` tool_use with `run_in_background: true` in the\nWebSocket stream and tracks lifecycle in the store\n- First step t\n[…]\naxe a11y\n- All 4936 existing tests continue to pass\n\n## Review provenance\n- Implemented by AI agent (Claude Opus 4.6)\n- Human review: pending\n\n---------\n\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(ui): add ActivityTray floating component for background agents a…",
          "author_name": "Stan Girard",
          "author_login": "StanGirard",
          "committed_at": "2026-04-01T18:29:50Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e0c242dd1b0c94ff5ddbf3f8e7e706ce6d5cd506",
          "body": "…otocol drift warnings (#637)\n\n## Summary\n- Handle 10 previously unhandled Codex JSON-RPC notification methods\nthat were triggering false \"protocol drift\" warnings in the UI\n- Bare `\"error\"` notifications (transient stream disconnections like\n\"Reconnecting... 2/5\") are now handled gracefully — logge\n[…]\n\n- All 4915 tests pass, typecheck clean\n\n## Review provenance\n- Investigated and implemented by AI agent (Claude Opus 4.6)\n- Human review: no\n\n---------\n\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(codex): handle unhandled Codex notification methods to prevent pr…",
          "author_name": "Stan Girard",
          "author_login": "StanGirard",
          "committed_at": "2026-04-01T16:37:14Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a0d4e5263820fefc2bb6beaf6aeb1903052b568d",
          "body": "…active keepalive (#635)",
          "is_bot": false,
          "headline": "fix(keepalive): add Codex disconnect debounce and enable headless pro…",
          "author_name": "Stan Girard",
          "author_login": "StanGirard",
          "committed_at": "2026-04-01T15:42:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a2341a06b0a442d7a2989faf2ba248a0fc60da9a",
          "body": ":robot: I have created a release *beep* *boop*\n---\n\n\n##\n[0.95.0](https://github.com/The-Vibe-Company/companion/compare/the-companion-v0.94.0...the-companion-v0.95.0)\n(2026-04-01)\n\n\n### Features\n\n* **keepalive:** proactive CLI relaunch when frontend is disconnected\n([#634](https://github.com/The-Vibe\n[…]\nogleapis/release-please). See\n[documentation](https://github.com/googleapis/release-please#release-please).\n\nCo-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(main): release the-companion 0.95.0 (#633)",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-04-01T15:27:31Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "6a0e7c599c1700ca750fee2b6ad93f8aed362e99",
          "body": "… (#634)\n\n## Summary\n- CLI processes (Claude Code & Codex) now auto-relaunch on crash even\nwithout a browser connected\n- Ensures headless sessions (agents, cron jobs) stay alive with\nexponential backoff (3s/6s/12s)\n- Intentional kills (idle-kill, delete, archive) are excluded via\ntracking set\n- Also\n[…]\norchestrator tests pass (5 new)\n- Typecheck passes\n- Pre-commit hooks pass\n\n## Review provenance\n- Implemented by AI agent\n- Human review: no\n\n---------\n\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(keepalive): proactive CLI relaunch when frontend is disconnected…",
          "author_name": "Stan Girard",
          "author_login": "StanGirard",
          "committed_at": "2026-04-01T14:50:38Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "9b5e67535233acb987f60348a7f3d90d6f76f83c",
          "body": "## Summary\n- remove the workbench terminal entry and terminal route\n- simplify session chrome by removing editor, browser, terminal, and\nprocesses surfaces\n- drop the unused `editorTabEnabled` setting from the client and server\ncontracts\n\n## Why\n- the session UI had multiple dead or redundant surfac\n[…]\nts\nserver/routes.test.ts`\n\n## Screenshot\n- to be added after local capture\n\n## Review provenance\n- Implemented by AI agent\n- Human review: no\n\n---------\n\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(workbench): remove terminal and session extras (#632)",
          "author_name": "Stan Girard",
          "author_login": "StanGirard",
          "committed_at": "2026-04-01T08:31:12Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "b176624dff1c422bb4ec7521dc4ae13ac9fbd807",
          "body": ":robot: I have created a release *beep* *boop*\n---\n\n\n##\n[0.94.0](https://github.com/The-Vibe-Company/companion/compare/the-companion-v0.93.0...the-companion-v0.94.0)\n(2026-03-27)\n\n\n### Features\n\n* **settings:** add provider token configuration for Claude Code and\nCodex ([#623](https://github.com/The\n[…]\nogleapis/release-please). See\n[documentation](https://github.com/googleapis/release-please#release-please).\n\nCo-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(main): release the-companion 0.94.0 (#624)",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-03-30T14:39:15Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "a5559854b55b9605a0203a1ac07a998696487ddf",
          "body": "…Codex (#623)\n\n## Summary\n- Adds a new **Providers** section to the Settings page between\nNotifications and Anthropic\n- Users can configure/update their **Claude Code OAuth token** (from\n`claude setup-token`) and **OpenAI API key** (for Codex) without\nre-running onboarding\n- Masked input fields with\n[…]\n## Review provenance\n- Implemented by AI agent\n- Human review: no\n\n---------\n\nCo-authored-by: Codex Agent <codex-agent@users.noreply.github.com>\nCo-authored-by: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(settings): add provider token configuration for Claude Code and …",
          "author_name": "Stan Girard",
          "author_login": "StanGirard",
          "committed_at": "2026-03-27T19:48:34Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "75a6cc982da1f53a9236db01f0d22915758f1598",
          "body": ":robot: I have created a release *beep* *boop*\n---\n\n\n##\n[0.93.0](https://github.com/The-Vibe-Company/companion/compare/the-companion-v0.92.5...the-companion-v0.93.0)\n(2026-03-27)\n\n\n### Features\n\n* **claude:** support channels protocol updates\n([#613](https://github.com/The-Vibe-Company/companion/iss\n[…]\nogleapis/release-please). See\n[documentation](https://github.com/googleapis/release-please#release-please).\n\nCo-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(main): release the-companion 0.93.0 (#611)",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-03-27T15:12:18Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "177af4be321411dad1c1fe3683fd805e6beaa06c",
          "body": "## Summary\n- The sidebar poll updates `sdkSessions` from the server every 5s but\nnever prunes the client-side `sessions` Map\n- Since the sidebar renders from `UNION(sessions.keys(), sdkSessions)`,\nserver-deleted sessions persist as ghost entries until hard refresh\n- After `setSdkSessions(list)`, now\n[…]\nbar tests pass\n\n## Review provenance\n- Root cause identified and fix implemented by AI agent (dev-debug\nworkflow)\n- Human review: no\n\n---------\n\nCo-authored-by: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(sidebar): reconcile client sessions with server on poll (#621)",
          "author_name": "Edwin Hu",
          "author_login": "edwinhu",
          "committed_at": "2026-03-27T15:07:03Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "6f6d411cc4e7cb7d16216f179212ef7ea44e4a40",
          "body": "…ing, and diagnostics (#617)\n\n## Summary\n- Adds a hidden Recording Hub feature gated behind\n`COMPANION_RECORDING_HUB=1`\n- Enables secure upload/import of JSONL protocol recordings into a\ncurated store (`~/.companion/hub/`)\n- Implements `ReplayAdapter` (IBackendAdapter) to replay recorded\nsessions as\n[…]\n tests pass\n- Full suite passes (4855 tests, 188 files)\n- Typecheck passes\n\n## Review provenance\n- Implemented by AI agent\n- Human review: no\n\n---------\n\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(recording-hub): add hidden recording hub for replay, compat test…",
          "author_name": "Stan Girard",
          "author_login": "StanGirard",
          "committed_at": "2026-03-24T10:34:10Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "c2f2b55118cb576532746cbde87eab4de4b87001",
          "body": "… (#615)\n\n## Summary\n- Add first-launch onboarding wizard that guides users through\nconfiguring Claude Code (OAuth token via `claude setup-token`) and Codex\n(OpenAI API key)\n- Tokens are persisted in `~/.companion/settings.json` and auto-injected\ninto sessions as `CLAUDE_CODE_OAUTH_TOKEN` / `OPENAI_\n[…]\no\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\n---------\n\nCo-authored-by: Codex Agent <codex-agent@users.noreply.github.com>\nCo-authored-by: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(onboarding): add provider setup wizard for Claude Code and Codex…",
          "author_name": "Stan Girard",
          "author_login": "StanGirard",
          "committed_at": "2026-03-24T08:53:17Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "5baccb13ba0b87d2dfcaa9e0241951ca9febc684",
          "body": "## Summary\n- add support for new Claude channels/protocol message types in the\nbackend adapter and shared session types\n- surface new streamlined text, tool summary, and prompt suggestion\nevents in the frontend store and websocket client\n- document the protocol updates and refresh playground/tests f\n[…]\n run test` (launched in container; long-running suite)\n\n## Review provenance\n- Implemented by AI agent\n- Human review: no\n\n---------\n\nCo-authored-by: Codex Agent <codex-agent@users.noreply.github.com>",
          "is_bot": false,
          "headline": "feat(claude): support channels protocol updates (#613)",
          "author_name": "Stan Girard",
          "author_login": "StanGirard",
          "committed_at": "2026-03-21T18:58:05Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "08e495b3ac06323d1113a43328682deedeac373d",
          "body": null,
          "is_bot": false,
          "headline": "fix(linear): log webhook acceptance and rejection (#612)",
          "author_name": "Stan Girard",
          "author_login": "StanGirard",
          "committed_at": "2026-03-19T12:13:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c256360d6db3846e4110f1232c047ef16f939906",
          "body": "<!-- CURSOR_AGENT_PR_BODY_BEGIN -->\nThis pull request contains changes generated by a Cursor Cloud Agent\n<!-- CURSOR_AGENT_PR_BODY_END -->\n\n<div><a\nhref=\"https://cursor.com/agents/bc-7b5be7ef-d331-472b-ba4d-b80ec1a2c5eb\"><picture><source\nmedia=\"(prefers-color-scheme: dark)\"\nsrcset=\"https://cursor.co\n[…]\nom/assets/images/open-in-cursor-dark.png\"></picture></a>&nbsp;</div>\n\n---------\n\nCo-authored-by: Cursor Agent <cursoragent@cursor.com>\nCo-authored-by: Stan Girard <StanGirard@users.noreply.github.com>",
          "is_bot": false,
          "headline": "refactor: Code redundancy reduction (#610)",
          "author_name": "Stan Girard",
          "author_login": "StanGirard",
          "committed_at": "2026-03-18T20:56:55Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "b67650f91c2ba8c8473d9cbd4d5777bde1999acb",
          "body": ":robot: I have created a release *beep* *boop*\n---\n\n\n##\n[0.92.5](https://github.com/The-Vibe-Company/companion/compare/the-companion-v0.92.4...the-companion-v0.92.5)\n(2026-03-18)\n\n\n### Code Refactoring\n\n* **linear:** separate OAuth Apps from Tickets integration\n([#607](https://github.com/The-Vibe-Co\n[…]\nogleapis/release-please). See\n[documentation](https://github.com/googleapis/release-please#release-please).\n\nCo-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(main): release the-companion 0.92.5 (#609)",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-03-18T20:54:41Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "6710519081bcbde1c785c34075b9a56c5b52d898",
          "body": "## Summary\n- Separates the Linear integration into two distinct concepts: **Linear\nTickets** (API-key connections for issue viewing/searching) and **Linear\nOAuth Apps** (standalone OAuth connections for agent @mention triggers)\n- Introduces a new `LinearOAuthConnection` entity stored in\n`~/.companio\n[…]\n provenance\n- Implemented by AI agent (Claude)\n- Human review: no\n\n---------\n\nCo-authored-by: Codex Agent <codex-agent@users.noreply.github.com>\nCo-authored-by: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor(linear): separate OAuth Apps from Tickets integration (#607)",
          "author_name": "Stan Girard",
          "author_login": "StanGirard",
          "committed_at": "2026-03-18T19:56:34Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "b57488329e07c39b11c0cbd4c43ed6dea50730a3",
          "body": ":robot: I have created a release *beep* *boop*\n---\n\n\n##\n[0.92.4](https://github.com/The-Vibe-Company/companion/compare/the-companion-v0.92.3...the-companion-v0.92.4)\n(2026-03-18)\n\n\n### Bug Fixes\n\n* **claude-adapter:** re-apply user echo drop fix reverted by\n[#589](https://github.com/The-Vibe-Company\n[…]\nogleapis/release-please). See\n[documentation](https://github.com/googleapis/release-please#release-please).\n\nCo-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(main): release the-companion 0.92.4 (#606)",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-03-18T11:08:41Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "ee653928150ce7877d2baf79230dafbc5c9e3f84",
          "body": "## Summary\n- Re-apply the user echo drop fix from #592 that was inadvertently\nreverted by #589's merge resolution\n- Silently drop all CLI `user` echo messages (both string and\ntool_result arrays) — they're redundant since tool results already\narrive in assistant message content blocks\n\n## Why\nPR #59\n[…]\nhoes are silently dropped\n- 61/61 adapter tests pass\n- Typecheck clean\n\n## Review provenance\n- Investigated & implemented by AI agent\n- Human review: no\n\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(claude-adapter): re-apply user echo drop fix reverted by #589 (#605)",
          "author_name": "Stan Girard",
          "author_login": "StanGirard",
          "committed_at": "2026-03-18T11:06:57Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "0c2335e52b1983d1263e188923f97c656b5791ce",
          "body": ":robot: I have created a release *beep* *boop*\n---\n\n\n##\n[0.92.3](https://github.com/The-Vibe-Company/companion/compare/the-companion-v0.92.2...the-companion-v0.92.3)\n(2026-03-18)\n\n\n### Bug Fixes\n\n* **docker:** preserve containers on idle-kill and increase default\ntimeout to 24h\n([#602](https://githu\n[…]\nogleapis/release-please). See\n[documentation](https://github.com/googleapis/release-please#release-please).\n\nCo-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(main): release the-companion 0.92.3 (#603)",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-03-18T10:12:32Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "7f5eab2924686b3cbfebf1abf94951a361a13d13",
          "body": "…meout to 24h (#602)\n\n## Summary\n- Idle-kill no longer destroys Docker containers — only kills the CLI\nprocess, so containers survive and can be restarted on relaunch\n- Default idle timeout increased from 20 minutes to 24 hours\n(`COMPANION_IDLE_KILL_MINUTES` env var still works for override)\n- Expli\n[…]\n## Review provenance\n- Implemented by AI agent\n- Human review: no\n\n---------\n\nCo-authored-by: Codex Agent <codex-agent@users.noreply.github.com>\nCo-authored-by: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(docker): preserve containers on idle-kill and increase default ti…",
          "author_name": "Stan Girard",
          "author_login": "StanGirard",
          "committed_at": "2026-03-18T10:11:17Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "24ef8ac28e2adace6eec240bdcbe36f6a6b35fea",
          "body": ":robot: I have created a release *beep* *boop*\n---\n\n\n##\n[0.92.2](https://github.com/The-Vibe-Company/companion/compare/the-companion-v0.92.1...the-companion-v0.92.2)\n(2026-03-18)\n\n\n### Bug Fixes\n\n* **orchestrator:** prevent PID recycling from blocking Docker session\nrelaunch\n([#589](https://github.c\n[…]\nogleapis/release-please). See\n[documentation](https://github.com/googleapis/release-please#release-please).\n\nCo-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(main): release the-companion 0.92.2 (#601)",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-03-18T09:57:37Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "5e76c50051f70efa0bd827b3ae252e48d3afa0d1",
          "body": "… relaunch (#589)",
          "is_bot": false,
          "headline": "fix(orchestrator): prevent PID recycling from blocking Docker session…",
          "author_name": "Stan Girard",
          "author_login": "StanGirard",
          "committed_at": "2026-03-18T07:10:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f5f0a9284950d13dd2f869d62de17c4d0b22d526",
          "body": ":robot: I have created a release *beep* *boop*\n---\n\n\n##\n[0.92.1](https://github.com/The-Vibe-Company/companion/compare/the-companion-v0.92.0...the-companion-v0.92.1)\n(2026-03-17)\n\n\n### Bug Fixes\n\n* **ui:** redesign chat blocks inline and fix streaming message\nduplication\n([#597](https://github.com/T\n[…]\nogleapis/release-please). See\n[documentation](https://github.com/googleapis/release-please#release-please).\n\nCo-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(main): release the-companion 0.92.1 (#600)",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-03-18T06:12:53Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "6735a9a6482c650c36ffb280448a00148f1c8b12",
          "body": "…ation (#597)\n\n## Summary\n- Redesign chat tool blocks (ThinkingBlock, EditBlock, BashBlock,\nBashResultBlock) from card-based to inline rendering — no cards, no\nscroll, \"show more\" for long content\n- Fix streaming message duplication caused by CLI sending incremental\n`assistant` messages (one per con\n[…]\nlive session\n- Verified no React duplicate key warnings in browser console\n\n## Review provenance\n- Implemented by AI agent\n- Human review: no\n\n---------\n\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(ui): redesign chat blocks inline and fix streaming message duplic…",
          "author_name": "Stan Girard",
          "author_login": "StanGirard",
          "committed_at": "2026-03-17T21:21:11Z",
          "body_truncated": true,
          "is_coding_agent": true
        }
      ],
      "releases_count": 23,
      "commits_last_year": 582,
      "latest_release_at": "2026-07-19T07:57:46Z",
      "latest_release_tag": "companion-v0.108.0",
      "releases_from_tags": false,
      "days_since_last_push": 5,
      "active_weeks_last_year": 17,
      "days_since_latest_release": 5,
      "mean_days_between_releases": 3.4
    },
    "community": {
      "has_readme": false,
      "has_license": false,
      "has_description": false,
      "has_contributing": false,
      "health_percentage": null,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": false
    },
    "ecosystem": {
      "packages": [
        {
          "name": "@hellcoder/companion",
          "exists": true,
          "license": "MIT",
          "keywords": [
            "claude",
            "claude-code",
            "ai",
            "agent",
            "web-ui",
            "vibe-coding"
          ],
          "ecosystem": "npm",
          "matches_repo": true,
          "registry_url": "https://www.npmjs.com/package/@hellcoder/companion",
          "is_deprecated": false,
          "latest_version": "0.108.0",
          "repository_url": "https://github.com/hellcoderGIT/companion",
          "versions_count": 66,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": 1,
          "monthly_downloads": 3170,
          "first_published_at": "2026-04-20T02:57:10.337000Z",
          "latest_published_at": "2026-07-19T08:09:59.755000Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 5
        }
      ]
    },
    "popularity": {
      "forks": 1,
      "stars": 1,
      "watchers": 0,
      "fork_history": {
        "days": [
          {
            "date": "2026-07-08",
            "count": 1
          }
        ],
        "complete": true,
        "collected": 1,
        "total_forks": 1
      },
      "star_history": null,
      "open_issues_and_prs": 0
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [],
      "has_llms_txt": false,
      "has_dockerfile": true,
      "has_mcp_signal": false,
      "bootstrap_files": [
        "Makefile"
      ],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [
        "landing/tsconfig.json",
        "platform/tsconfig.json",
        "relay/tsconfig.json",
        "web/tsconfig.json"
      ],
      "toolchain_manifests": [],
      "largest_source_bytes": 234876,
      "source_files_sampled": 522,
      "oversized_source_files": 17,
      "agent_instruction_files": [
        "AGENTS.md",
        "CLAUDE.md"
      ],
      "agent_instruction_max_bytes": 10656
    },
    "dependencies": {
      "manifests": [
        "landing/package.json",
        "package.json",
        "platform/package.json",
        "relay/package.json",
        "web/package.json"
      ],
      "advisories": {
        "error": null,
        "scope": "published_package",
        "source": "osv",
        "findings": [],
        "collected": true,
        "malicious": [],
        "truncated": false,
        "by_severity": {},
        "advisory_count": 0,
        "affected_count": 0,
        "assessed_count": 89,
        "malicious_count": 0,
        "assessed_package": "npm:@hellcoder/companion@0.108.0",
        "unassessed_count": 0,
        "direct_affected_count": 0
      },
      "ecosystems": [
        "npm"
      ],
      "dependencies": [
        {
          "name": "react",
          "manifest": "landing/package.json",
          "ecosystem": "npm",
          "version_constraint": "^19.0.0"
        },
        {
          "name": "react-dom",
          "manifest": "landing/package.json",
          "ecosystem": "npm",
          "version_constraint": "^19.0.0"
        },
        {
          "name": "the-companion",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.2.2"
        },
        {
          "name": "better-auth",
          "manifest": "platform/package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.4.0"
        },
        {
          "name": "class-variance-authority",
          "manifest": "platform/package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.7.1"
        },
        {
          "name": "clsx",
          "manifest": "platform/package.json",
          "ecosystem": "npm",
          "version_constraint": "^2.1.1"
        },
        {
          "name": "drizzle-orm",
          "manifest": "platform/package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.39.0"
        },
        {
          "name": "hono",
          "manifest": "platform/package.json",
          "ecosystem": "npm",
          "version_constraint": "^4.7.0"
        },
        {
          "name": "lucide-react",
          "manifest": "platform/package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.575.0"
        },
        {
          "name": "drizzle-kit",
          "manifest": "platform/package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.30.0"
        },
        {
          "name": "postgres",
          "manifest": "platform/package.json",
          "ecosystem": "npm",
          "version_constraint": "^3.4.8"
        },
        {
          "name": "react",
          "manifest": "platform/package.json",
          "ecosystem": "npm",
          "version_constraint": "^19.0.0"
        },
        {
          "name": "react-dom",
          "manifest": "platform/package.json",
          "ecosystem": "npm",
          "version_constraint": "^19.0.0"
        },
        {
          "name": "resend",
          "manifest": "platform/package.json",
          "ecosystem": "npm",
          "version_constraint": "^6.9.4"
        },
        {
          "name": "stripe",
          "manifest": "platform/package.json",
          "ecosystem": "npm",
          "version_constraint": "^17.0.0"
        },
        {
          "name": "tailwind-merge",
          "manifest": "platform/package.json",
          "ecosystem": "npm",
          "version_constraint": "^3.5.0"
        },
        {
          "name": "@codemirror/lang-cpp",
          "manifest": "web/package.json",
          "ecosystem": "npm",
          "version_constraint": "^6.0.3"
        },
        {
          "name": "@codemirror/lang-css",
          "manifest": "web/package.json",
          "ecosystem": "npm",
          "version_constraint": "^6.3.1"
        },
        {
          "name": "@codemirror/lang-html",
          "manifest": "web/package.json",
          "ecosystem": "npm",
          "version_constraint": "^6.4.11"
        },
        {
          "name": "@codemirror/lang-java",
          "manifest": "web/package.json",
          "ecosystem": "npm",
          "version_constraint": "^6.0.2"
        },
        {
          "name": "@codemirror/lang-javascript",
          "manifest": "web/package.json",
          "ecosystem": "npm",
          "version_constraint": "6.2.4"
        },
        {
          "name": "@codemirror/lang-json",
          "manifest": "web/package.json",
          "ecosystem": "npm",
          "version_constraint": "^6.0.2"
        },
        {
          "name": "@codemirror/lang-markdown",
          "manifest": "web/package.json",
          "ecosystem": "npm",
          "version_constraint": "^6.5.0"
        },
        {
          "name": "@codemirror/lang-python",
          "manifest": "web/package.json",
          "ecosystem": "npm",
          "version_constraint": "^6.2.1"
        },
        {
          "name": "@codemirror/lang-rust",
          "manifest": "web/package.json",
          "ecosystem": "npm",
          "version_constraint": "^6.0.2"
        },
        {
          "name": "@codemirror/lang-sql",
          "manifest": "web/package.json",
          "ecosystem": "npm",
          "version_constraint": "^6.10.0"
        },
        {
          "name": "@codemirror/lang-xml",
          "manifest": "web/package.json",
          "ecosystem": "npm",
          "version_constraint": "^6.1.0"
        },
        {
          "name": "@codemirror/lang-yaml",
          "manifest": "web/package.json",
          "ecosystem": "npm",
          "version_constraint": "^6.1.2"
        },
        {
          "name": "@codemirror/view",
          "manifest": "web/package.json",
          "ecosystem": "npm",
          "version_constraint": "6.39.15"
        },
        {
          "name": "@uiw/react-codemirror",
          "manifest": "web/package.json",
          "ecosystem": "npm",
          "version_constraint": "4.25.4"
        },
        {
          "name": "axe-core",
          "manifest": "web/package.json",
          "ecosystem": "npm",
          "version_constraint": "^4.11.1"
        },
        {
          "name": "croner",
          "manifest": "web/package.json",
          "ecosystem": "npm",
          "version_constraint": "^10.0.1"
        },
        {
          "name": "diff",
          "manifest": "web/package.json",
          "ecosystem": "npm",
          "version_constraint": "^8.0.3"
        },
        {
          "name": "fzf",
          "manifest": "web/package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.5.2"
        },
        {
          "name": "hono",
          "manifest": "web/package.json",
          "ecosystem": "npm",
          "version_constraint": "^4.7.0"
        },
        {
          "name": "posthog-js",
          "manifest": "web/package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.347.2"
        },
        {
          "name": "qrcode",
          "manifest": "web/package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.5.4"
        },
        {
          "name": "ws",
          "manifest": "web/package.json",
          "ecosystem": "npm",
          "version_constraint": "^8.19.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": 0,
        "merged_prs": 63,
        "open_issues": 0,
        "closed_ratio": null,
        "closed_issues": 0,
        "closed_unmerged_prs": 0
      },
      "bus_factor": 1,
      "bot_contributors": 2,
      "top_contributors": [
        {
          "type": "User",
          "login": "StanGirard",
          "commits": 309,
          "avatar_url": "https://avatars.githubusercontent.com/u/19614572?v=4"
        },
        {
          "type": "User",
          "login": "hellcoderGIT",
          "commits": 41,
          "avatar_url": "https://avatars.githubusercontent.com/u/5343954?v=4"
        },
        {
          "type": "User",
          "login": "claude",
          "commits": 8,
          "avatar_url": "https://avatars.githubusercontent.com/u/81847?v=4"
        },
        {
          "type": "User",
          "login": "edwinhu",
          "commits": 5,
          "avatar_url": "https://avatars.githubusercontent.com/u/174409?v=4"
        },
        {
          "type": "User",
          "login": "binhnguyenduc",
          "commits": 3,
          "avatar_url": "https://avatars.githubusercontent.com/u/37066217?v=4"
        },
        {
          "type": "User",
          "login": "freezscholte",
          "commits": 3,
          "avatar_url": "https://avatars.githubusercontent.com/u/52416805?v=4"
        },
        {
          "type": "User",
          "login": "Ziltosh",
          "commits": 2,
          "avatar_url": "https://avatars.githubusercontent.com/u/7701420?v=4"
        },
        {
          "type": "User",
          "login": "sondh5",
          "commits": 2,
          "avatar_url": "https://avatars.githubusercontent.com/u/22186548?v=4"
        },
        {
          "type": "User",
          "login": "Codex-Agent",
          "commits": 1,
          "avatar_url": "https://avatars.githubusercontent.com/u/214169644?v=4"
        },
        {
          "type": "User",
          "login": "educamosonline",
          "commits": 1,
          "avatar_url": "https://avatars.githubusercontent.com/u/9588621?v=4"
        }
      ],
      "contributors_sampled": 16,
      "top_contributor_share": 0.811
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "a11y.yml",
        "ci.yml",
        "coverage-gate.yml",
        "preview.yml",
        "publish.yml"
      ],
      "has_docs_dir": true,
      "linter_configs": [],
      "has_editorconfig": false,
      "has_linter_config": false,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [],
      "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": 5,
            "reason": "16 out of 28 merged PRs checked by a CI test -- score normalized to 5",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#ci-tests"
          },
          {
            "name": "CII-Best-Practices",
            "score": 0,
            "reason": "no effort to earn an OpenSSF best practices badge detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#cii-best-practices"
          },
          {
            "name": "Code-Review",
            "score": 0,
            "reason": "Found 0/17 approved changesets -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 10,
            "reason": "project has 3 contributing companies or organizations -- score normalized to 10",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
          },
          {
            "name": "Dangerous-Workflow",
            "score": 10,
            "reason": "no dangerous workflow patterns detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
          },
          {
            "name": "Dependency-Update-Tool",
            "score": 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": "30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
          },
          {
            "name": "Packaging",
            "score": 10,
            "reason": "packaging workflow detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
          },
          {
            "name": "Pinned-Dependencies",
            "score": 0,
            "reason": "dependency not pinned by hash detected -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
          },
          {
            "name": "SAST",
            "score": 0,
            "reason": "SAST tool is not run on all commits -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
          },
          {
            "name": "Security-Policy",
            "score": 0,
            "reason": "security policy file not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
          },
          {
            "name": "Signed-Releases",
            "score": null,
            "reason": "no releases found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
          },
          {
            "name": "Token-Permissions",
            "score": 0,
            "reason": "detected GitHub workflow tokens with excessive permissions",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
          },
          {
            "name": "Vulnerabilities",
            "score": 10,
            "reason": "0 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "9a11f0fa3b506ab9c0c107965c681417fd4d8d3b",
        "ran_at": "2026-07-25T05:15:44Z",
        "aggregate_score": 4.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-19T08:10:04Z",
      "oldest_open_prs": [],
      "last_merged_pr_at": "2026-07-19T07:57:35Z",
      "ci_last_conclusion": "SUCCESS",
      "oldest_open_issues": []
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/hellcoderGIT/companion",
    "host": "github.com",
    "name": "companion",
    "owner": "hellcoderGIT"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "moderate",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 57,
      "inputs": {
        "security": 56,
        "vitality": 86,
        "community": 24,
        "governance": 58,
        "engineering": 55
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "excellent",
        "name": "Vitality",
        "value": 86,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "good",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 76,
            "inputs": {
              "commits_last_year": 582,
              "human_commit_share": 0.69,
              "days_since_last_push": 5,
              "active_weeks_last_year": 17
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 5 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 5
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "17/52 weeks with commits",
                "points": 11.8,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 17
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "582 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 582
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "release_discipline",
            "band": "excellent",
            "name": "Release discipline",
            "note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "openssf_scorecard_signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "releases_count": 23,
              "latest_release_tag": "companion-v0.108.0",
              "releases_from_tags": false,
              "days_since_latest_release": 5,
              "mean_days_between_releases": 3.4
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "23 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 23
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 5 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 5
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~3.4 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 3.4
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "openssf_scorecard_signed_releases",
                "name": "OpenSSF Scorecard: Signed-Releases",
                "detail": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 10
              }
            ]
          },
          {
            "key": "abandonment",
            "band": "excellent",
            "name": "Abandonment",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "cap": null,
              "state": "unverified",
              "guards": [],
              "signals": [],
              "red_flag": false,
              "multiplier_pct": 100,
              "declared_reason": null,
              "unverified_reason": "repository_too_young",
              "unanswered_open_prs": null,
              "unanswered_open_issues": null,
              "days_since_last_merged_pr": null,
              "days_since_last_human_commit": null,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "maintenance record not established from the collected data",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_unverified",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "critical",
        "name": "Community & Adoption",
        "value": 24,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "critical",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 1,
            "inputs": {
              "forks": 1,
              "stars": 1,
              "watchers": 0,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "1 stars",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "1 forks",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "0 watchers",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "critical",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 25,
            "inputs": {
              "has_readme": false,
              "has_license": false,
              "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": 0,
                "status": "missed",
                "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
              }
            ]
          },
          {
            "key": "ecosystem_adoption",
            "band": "moderate",
            "name": "Ecosystem adoption (downloads)",
            "note": "Excluded from scoring (no data or not applicable): Registry dependents. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "registry_dependents"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 58,
            "inputs": {
              "packages": [
                "@hellcoder/companion"
              ],
              "dependents": null,
              "ecosystems": "npm",
              "total_downloads": null,
              "monthly_downloads": 3170
            },
            "components": [
              {
                "key": "monthly_downloads",
                "name": "Monthly downloads",
                "detail": "3,170 downloads/month across npm",
                "points": 46.7,
                "status": "partial",
                "details": [
                  {
                    "code": "downloads_monthly",
                    "params": {
                      "count": 3170,
                      "ecosystems": "npm"
                    }
                  }
                ],
                "max_points": 80
              },
              {
                "key": "registry_dependents",
                "name": "Registry dependents",
                "detail": "not reported by this ecosystem",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "not_reported_by_this_ecosystem",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          }
        ],
        "description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
      },
      {
        "key": "governance",
        "band": "moderate",
        "name": "Sustainability & Governance",
        "value": 58,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "at_risk",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 37,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 16,
              "top_contributor_share": 0.811
            },
            "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 81% of commits",
                "points": 4.3,
                "status": "partial",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 81
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "16 contributors",
                "points": 13.5,
                "status": "met",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 16
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 3 contributing companies or organizations -- score normalized to 10",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "good",
            "name": "Issue & PR responsiveness",
            "note": "Excluded from scoring (no data or not applicable): Issue resolution. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "issue_resolution"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 72,
            "inputs": {
              "merged_prs": 63,
              "open_issues": 0,
              "closed_issues": 0,
              "issue_closed_ratio": null,
              "closed_unmerged_prs": 0
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "no issues or no data",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_issues_or_data",
                    "params": {}
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "63/63 decided PRs merged",
                "points": 38.2,
                "status": "met",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 63,
                      "decided": 63
                    }
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 0/17 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "at_risk",
            "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": 36,
            "inputs": {
              "followers": 1,
              "owner_type": "User",
              "is_verified": null,
              "owner_login": "hellcoderGIT",
              "public_repos": 3,
              "account_age_days": 4712
            },
            "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": "1 followers of hellcoderGIT",
                "points": 2.2,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 1,
                      "login": "hellcoderGIT"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "3 public repos, account ~12 yr old",
                "points": 16.4,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 3
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 12
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "excellent",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "@hellcoder/companion"
              ],
              "ecosystems": "npm",
              "any_deprecated": false,
              "min_days_since_publish": 5
            },
            "components": [
              {
                "key": "published_resolvable",
                "name": "Published & resolvable",
                "detail": "1 package(s) on npm",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "packages_published",
                    "params": {
                      "count": 1,
                      "ecosystems": "npm"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "publish_recency",
                "name": "Publish recency",
                "detail": "latest publish 5 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 5
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "66 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 66
                    }
                  }
                ],
                "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": 55,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "moderate",
            "name": "Engineering practices",
            "note": null,
            "notes": [],
            "value": 58,
            "inputs": {
              "has_ci": true,
              "has_tests": true,
              "has_editorconfig": false,
              "has_linter_config": false,
              "has_precommit_config": false
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": "5 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 5
                    }
                  }
                ],
                "max_points": 24
              },
              {
                "key": "tests_present",
                "name": "Tests present",
                "detail": null,
                "points": 24,
                "status": "met",
                "details": [],
                "max_points": 24
              },
              {
                "key": "linter_config",
                "name": "Linter config",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 16
              },
              {
                "key": "pre_commit_hooks",
                "name": "Pre-commit hooks",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 9.6
              },
              {
                "key": "editorconfig",
                "name": ".editorconfig",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.4
              },
              {
                "key": "openssf_scorecard_ci_tests",
                "name": "OpenSSF Scorecard: CI-Tests",
                "detail": "16 out of 28 merged PRs checked by a CI test -- score normalized to 5",
                "points": 10,
                "status": "partial",
                "details": [],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "moderate",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 50,
            "inputs": {
              "topics": [],
              "has_wiki": true,
              "homepage": "https://thecompanion.sh",
              "has_readme": false,
              "has_docs_dir": true,
              "has_description": false
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 30
              },
              {
                "key": "documentation_directory",
                "name": "Documentation directory",
                "detail": null,
                "points": 25,
                "status": "met",
                "details": [],
                "max_points": 25
              },
              {
                "key": "documentation_homepage_site",
                "name": "Documentation / homepage site",
                "detail": "https://thecompanion.sh",
                "points": 15,
                "status": "met",
                "details": [],
                "max_points": 15
              },
              {
                "key": "repository_description",
                "name": "Repository description",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              },
              {
                "key": "topics",
                "name": "Topics",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              },
              {
                "key": "wiki",
                "name": "Wiki",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          }
        ],
        "description": "Are baseline engineering and documentation practices in place?"
      },
      {
        "key": "security",
        "band": "moderate",
        "name": "Security",
        "value": 56,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "at_risk",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 45,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 17,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 1,
              "scorecard_aggregate": 4.5
            },
            "components": [
              {
                "key": "binary_artifacts",
                "name": "Binary-Artifacts",
                "detail": "no binaries found in the repo",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "branch_protection",
                "name": "Branch-Protection",
                "detail": "branch protection not enabled on development/release branches",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "ci_tests",
                "name": "CI-Tests",
                "detail": "16 out of 28 merged PRs checked by a CI test -- score normalized to 5",
                "points": 1.2,
                "status": "partial",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "cii_best_practices",
                "name": "CII-Best-Practices",
                "detail": "no effort to earn an OpenSSF best practices badge detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "code_review",
                "name": "Code-Review",
                "detail": "Found 0/17 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 3 contributing companies or organizations -- score normalized to 10",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "dangerous_workflow",
                "name": "Dangerous-Workflow",
                "detail": "no dangerous workflow patterns detected",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "dependency_update_tool",
                "name": "Dependency-Update-Tool",
                "detail": "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": "30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "packaging",
                "name": "Packaging",
                "detail": "packaging workflow detected",
                "points": 5,
                "status": "met",
                "details": [],
                "max_points": 5
              },
              {
                "key": "pinned_dependencies",
                "name": "Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "sast",
                "name": "SAST",
                "detail": "SAST tool is not run on all commits -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "security_policy",
                "name": "Security-Policy",
                "detail": "security policy file not detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "signed_releases",
                "name": "Signed-Releases",
                "detail": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 7.5
              },
              {
                "key": "token_permissions",
                "name": "Token-Permissions",
                "detail": "detected GitHub workflow tokens with excessive permissions",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "vulnerabilities",
                "name": "Vulnerabilities",
                "detail": "0 existing vulnerabilities detected",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              }
            ]
          },
          {
            "key": "dependency_advisories",
            "band": "excellent",
            "name": "Dependency advisories",
            "note": "Excluded from scoring (no data or not applicable): No advisories left outstanding. Remaining weights renormalized. Matched the npm:@hellcoder/companion@0.108.0 runtime dependency closure — what installing the published package pulls in — 89 packages. Reachability is not analyzed.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "no_advisories_left_outstanding"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              },
              {
                "code": "advisories_scope_published",
                "params": {
                  "package": "npm:@hellcoder/companion@0.108.0",
                  "assessed": 89
                }
              },
              {
                "code": "advisories_reachability",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "source": "osv",
              "advisories": 0,
              "affected_packages": 0,
              "assessed_packages": 89,
              "unassessed_packages": 0,
              "affected_by_severity": "none",
              "direct_affected_packages": 0
            },
            "components": [
              {
                "key": "direct_dependencies_free_of_known_advisories",
                "name": "Direct dependencies free of known advisories",
                "detail": "no direct dependency carries a known advisory",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "no_direct_advisories",
                    "params": {}
                  }
                ],
                "max_points": 35
              },
              {
                "key": "indirect_dependencies_free_of_known_advisories",
                "name": "Indirect dependencies free of known advisories",
                "detail": "no indirect dependency carries a known advisory",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "no_indirect_advisories",
                    "params": {}
                  }
                ],
                "max_points": 25
              },
              {
                "key": "no_advisories_left_outstanding",
                "name": "No advisories left outstanding",
                "detail": "no advisory carries a publication date",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "advisories_no_publication_date",
                    "params": {}
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "malicious_dependencies",
            "band": "excellent",
            "name": "Malicious dependencies",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "source": "osv",
              "meaning": "reported as a malicious package by the OpenSSF corpus; the remedy is removal or moving off the compromised name, never an upgrade of the same artifact. Versions the registry has since pulled are listed but not scored",
              "packages": [],
              "red_flag": false,
              "assessed_packages": 89,
              "malicious_packages": 0,
              "direct_malicious_packages": 0,
              "withdrawn_malicious_packages": 0,
              "installable_malicious_packages": 0
            },
            "components": [
              {
                "key": "no_dependency_reported_as_a_malicious_package",
                "name": "No dependency reported as a malicious package",
                "detail": "no dependency is reported as a malicious package",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "no_malicious_dependencies",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          },
          {
            "key": "high_risk_jurisdiction_exposure",
            "band": "excellent",
            "name": "High-Risk Jurisdiction Exposure",
            "note": "Only high-confidence self-published location evidence affects this multiplier. Ambiguous matches are review-only; country evidence is not proof of nationality, citizenship, legal registration, malicious intent, or sanctions status.",
            "notes": [
              {
                "code": "jurisdiction_evidence_limits",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "meaning": "self-published location evidence; not nationality or citizenship",
              "red_flag": false,
              "exposures": [],
              "policy_countries": [
                "Russia",
                "Iran",
                "North Korea"
              ],
              "review_only_matches": 0,
              "assessed_self_published_locations": 4
            },
            "components": [
              {
                "key": "policy_exposure_multiplier",
                "name": "Policy exposure multiplier",
                "detail": "no confirmed policy-scope location match",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "jurisdiction_no_match",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Are visible security and supply-chain practices strong, with no malicious dependency and no unresolved high-risk jurisdiction exposure?"
      },
      {
        "key": "ai_readiness",
        "band": "good",
        "name": "AI Readiness",
        "value": 81,
        "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": 1,
              "agent_instruction_files": [
                "AGENTS.md",
                "CLAUDE.md"
              ],
              "agent_instruction_max_bytes": 10656
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": "AGENTS.md, CLAUDE.md",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "AGENTS.md, CLAUDE.md"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "machine_readable_docs_llms_txt",
                "name": "Machine-readable docs (llms.txt)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "legible_commit_history",
                "name": "Legible commit history",
                "detail": "69 of 69 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 69,
                      "sampled": 69
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "good",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 71,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [],
              "has_dockerfile": true,
              "typed_language": true,
              "bootstrap_files": [
                "Makefile"
              ],
              "has_devcontainer": false,
              "has_linter_config": false,
              "typecheck_configs": [
                "landing/tsconfig.json",
                "platform/tsconfig.json",
                "relay/tsconfig.json",
                "web/tsconfig.json"
              ],
              "agent_commit_share": 0.52,
              "toolchain_manifests": [],
              "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": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 11
              },
              {
                "key": "static_type_checking",
                "name": "Static type checking",
                "detail": "landing/tsconfig.json, platform/tsconfig.json, relay/tsconfig.json, web/tsconfig.json",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "landing/tsconfig.json, platform/tsconfig.json, relay/tsconfig.json, web/tsconfig.json"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "reproducible_environment",
                "name": "Reproducible environment",
                "detail": "Dockerfile",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "Dockerfile"
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "52 of the last 100 commits agent-authored or agent-credited",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "agent_authored_commits",
                    "params": {
                      "count": 52,
                      "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": 98,
            "inputs": {
              "primary_language": "TypeScript",
              "largest_source_bytes": 234876,
              "source_files_sampled": 522,
              "oversized_source_files": 17
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "TypeScript (statically typed)",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "statically_typed_language",
                    "params": {
                      "language": "TypeScript"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "17/522 source files over 60KB",
                "points": 53.2,
                "status": "partial",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 522,
                      "oversized": 17
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          }
        ],
        "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",
    "Community profile unavailable",
    "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-25T05:16:06.936471Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/h/hellcoderGIT/companion.svg",
  "full_name": "hellcoderGIT/companion",
  "license_state": "standard",
  "license_spdx": "MIT"
}

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

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

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