公开记录
软件健康报告模式 0.27.0 · 指标 2.1.0 · 2026-08-01 20:00 UTC

vakovalskii / codbash

Termius-style browser dashboard for Claude Code & Codex sessions. View, search, resume, tag, and manage all your AI coding sessions.

JavaScript · CSSMIT★ 258 星标⑂ 49 复刻始于 2026年4月在 GitHub 上查看 ↗

vakovalskii/codbash 的健康指数为 100 分中的 73 分,处于「良好」区间。 其得分最高的类别是Vitality(79/100),最低的是Community & Adoption(53/100)。 最近一次更新在 2 天前。 近期的大部分工作由 1 位贡献者完成。

73
总分 / 100
良好

软件健康指数

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

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

评分画像

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

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

所有权

Valerii Kovalskii个人账户
245 关注者39 个公开仓库始于 2025年7月

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

软件包生态系统

注册表软件包版本月下载量版本数最近发布标签
npmcodbash-app7.15.02,718279 天前codbashcodedashclaudeclaude-codecodexcursoropencodekiroai-agentssessionsdashboardterminalclidevtools

按类别列示的指标

活力

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

79良好 · 占总体的 21%
评分方式
36/36推送新近度 — 最近一次推送于 2 天前
7.6/36提交节奏 — 52 周中有 11 周有提交
18/18提交量 — 最近一年 275 次提交
10/10OpenSSF Scorecard:Maintained — 30 commit(s) and 9 issue activity found in the last 90 days -- score normalized to 10
所用输入
commits_last_year275
human_commit_share1
days_since_last_push2
active_weeks_last_year11

发布纪律

90优秀
评分方式
27/27有发布版本 — 已发布 43 个发布版本
36/36发布时效 — 最近一次发布版本于 2 天前
27/27发布节奏 — 约每 1.1 天发布一次
0/10OpenSSF Scorecard:Signed-Releases — Project has not signed or included provenance with any releases.
所用输入
releases_count43
latest_release_tagv7.16.0
releases_from_tags
days_since_latest_release2
mean_days_between_releases1.1

社区与采用

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

53中等 · 占总体的 17%
评分方式
39.1/60星标 — 258 个星标
14/25复刻 — 49 个复刻
0/15关注者 — 1 位关注者
所用输入
forks49
stars258
watchers1
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history

社区健康

50中等
评分方式
22.5/22.5README
22.5/22.5许可证 — 可识别的许可证(MIT)
0/18CONTRIBUTING 指南
0/13.5行为准则
0/7.2议题模板
0/6.3PR 模板
所用输入
has_readme
has_license
readme_badges
has_contributing
has_issue_template
has_code_of_conduct
readme_badge_services
has_pull_request_template
评分方式
45.8/80月度下载量 — npm 合计每月 2,718 次下载
0/20注册表被依赖数 — 该生态系统不报告此项
所用输入
packagescodbash-app
dependents
ecosystemsnpm
total_downloads
monthly_downloads2,718
已排除计分(无数据或不适用):注册表被依赖数。 其余权重已重新归一化。

可持续性与治理

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

60中等 · 占总体的 23%
评分方式
9/54巴士系数 — 1 位贡献者贡献了半数提交
5.6/22.5提交分布 — 头号贡献者编写了 75% 的提交
13.5/13.5贡献者广度 — 23 位贡献者
3/10OpenSSF Scorecard:Contributors — project has 1 contributing companies or organizations -- score normalized to 3
所用输入
bus_factor1
contributors_sampled23
top_contributor_share0.749
评分方式
36.9/42议题解决 — 88% 的议题已关闭
25.3/30PR 接受 — 已裁定的 PR 中 188/223 已合并
0/13Newcomer PR acceptance — 30 天内没有首次贡献者的 PR 得到裁决
1.5/15OpenSSF Scorecard:Code-Review — Found 5/30 approved changesets -- score normalized to 1
所用输入
merged_prs188
open_issues7
closed_issues51
prs_merged_7d
prs_decided_7d
prs_merged_30d
prs_decided_30d
issue_closed_ratio0.879
closed_unmerged_prs35
first_time_authors_30d
first_time_prs_merged_30d
first_time_prs_decided_30d
已排除计分(无数据或不适用):newcomer_pr_acceptance。 其余权重已重新归一化。
评分方式
10/30所有权背书 — 个人(用户)账户
0/20已验证域名 — 不适用于个人账户
17.2/25所有者影响力 — vakovalskii 有 245 位关注者
13.8/25既往记录 — 39 个公开仓库,账户约 1 年
所用输入
followers245
owner_typeUser
is_verified
owner_loginvakovalskii
public_repos39
account_age_days384
已排除计分(无数据或不适用):已验证域名。 其余权重已重新归一化。
评分方式
25/25已发布且可解析 — npm 上有 1 个软件包
35/35发布时效 — 最近一次发布于 9 天前
20/20版本历史 — 27 个已发布版本
20/20未被弃用 — 活跃,未被弃用或撤回
所用输入
packagescodbash-app
ecosystemsnpm
any_deprecated
min_days_since_publish9

工程质量

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

70良好 · 占总体的 19%

工程实践

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

文档

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

安全

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

56中等 · 占总体的 16%

安全态势

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

AI 就绪度

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

63中等 · 占总体的 4%
评分方式
45/45代理指令 — CLAUDE.md
0/15机器可读文档(llms.txt)
40/40可读的提交历史 — 100 次人类提交中有 100 次说明了意图(结构化标题或解释性正文)
所用输入
has_llms_txt
legible_history_share1
agent_instruction_filesCLAUDE.md
agent_instruction_max_bytes14,921
评分方式
18/18一条命令的引导启动 — Makefile
22/22自动化测试
0/11Lint / 格式化配置
0/11静态类型检查
0/10可复现环境
10/10已体现的代理实践 — 最近 100 次提交中有 46 次由代理编写或署名代理
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_configs
agent_commit_share0.46
toolchain_manifests
dependency_bot_commit_share0
评分方式
0/45可类型检查的代码 — JavaScript,未配置类型检查
51.5/55可控的文件大小 — 采样的 63 个源文件中有 4 个超过 60KB
所用输入
primary_languageJavaScript
largest_source_bytes242,086
source_files_sampled63
oversized_source_files4

关键数据

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

数据采集警告

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

更多细节

Star 与 Fork 历史 0 ★ / 49 ⇿
0Star
49Fork
43发布

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

010203040504972026-042026-062026-08
主版本 1次版本 7修订 35
OpenSSF Scorecard 4.5 / 10
4.5综合

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

10Binary-Artifactsno binaries found in the repo
不适用Branch-Protectioninternal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md
9CI-Tests29 out of 30 merged PRs checked by a CI test -- score normalized to 9
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
1Code-ReviewFound 5/30 approved changesets -- score normalized to 1
3Contributorsproject has 1 contributing companies or organizations -- score normalized to 3
10Dangerous-Workflowno dangerous workflow patterns detected
0Dependency-Update-Toolno update tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
10Maintained30 commit(s) and 9 issue activity found in the last 90 days -- score normalized to 10
10Packagingpackaging workflow detected
0Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 0
0SASTSAST tool is not run on all commits -- score normalized to 0
0Security-Policysecurity policy file not detected
0Signed-ReleasesProject has not signed or included provenance with any releases.
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
10Vulnerabilities0 existing vulnerabilities detected
直接依赖 1
注册表软件包版本约束清单文件
npmelectron-updater^6.8.9desktop/package.json
全部依赖 未采集

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

依赖安全公告 0

安装 npm:codbash-app@7.15.0 会引入 7 个包(直接与传递):其中 0 个存在已知公告,0 个为直接依赖。

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

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

原始 JSON 报告 机器可读
{
  "data": {
    "repo": {
      "topics": [],
      "is_fork": false,
      "size_kb": 2946,
      "has_wiki": true,
      "homepage": null,
      "languages": {
        "CSS": 148089,
        "HTML": 26718,
        "Shell": 643,
        "Gherkin": 47116,
        "Makefile": 1740,
        "JavaScript": 1188837
      },
      "pushed_at": "2026-07-30T13:05:06Z",
      "created_at": "2026-04-03T19:52:00Z",
      "owner_type": "User",
      "updated_at": "2026-07-30T15:56:23Z",
      "description": "Termius-style browser dashboard for Claude Code & Codex sessions. View, search, resume, tag, and manage all your AI coding sessions.",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "MIT",
      "default_branch": "main",
      "license_spdx_raw": "MIT",
      "primary_language": "JavaScript",
      "significant_languages": [
        "JavaScript",
        "CSS"
      ]
    },
    "owner": {
      "blog": null,
      "name": "Valerii Kovalskii",
      "type": "User",
      "login": "vakovalskii",
      "company": null,
      "location": null,
      "followers": 245,
      "avatar_url": "https://avatars.githubusercontent.com/u/220532298?v=4",
      "created_at": "2025-07-12T21:48:20Z",
      "is_verified": null,
      "public_repos": 39,
      "account_age_days": 384
    },
    "license": {
      "state": "standard",
      "spdx_id": "MIT",
      "raw_spdx": "MIT",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v7.16.0",
          "kind": "minor",
          "published_at": "2026-07-30T08:07:30Z"
        },
        {
          "tag": "v7.15.0",
          "kind": "minor",
          "published_at": "2026-07-23T06:46:08Z"
        },
        {
          "tag": "v7.14.7",
          "kind": "patch",
          "published_at": "2026-07-21T14:21:55Z"
        },
        {
          "tag": "v7.14.6",
          "kind": "patch",
          "published_at": "2026-07-21T10:19:10Z"
        },
        {
          "tag": "v7.14.5",
          "kind": "patch",
          "published_at": "2026-07-20T18:23:23Z"
        },
        {
          "tag": "v7.14.4",
          "kind": "patch",
          "published_at": "2026-07-20T16:14:06Z"
        },
        {
          "tag": "v7.14.3",
          "kind": "patch",
          "published_at": "2026-07-20T11:11:54Z"
        },
        {
          "tag": "v7.14.2",
          "kind": "patch",
          "published_at": "2026-07-20T11:00:13Z"
        },
        {
          "tag": "v7.14.1",
          "kind": "patch",
          "published_at": "2026-07-20T10:46:22Z"
        },
        {
          "tag": "v7.14.0",
          "kind": "minor",
          "published_at": "2026-07-20T10:20:47Z"
        },
        {
          "tag": "v7.13.0",
          "kind": "minor",
          "published_at": "2026-07-20T09:50:02Z"
        },
        {
          "tag": "v7.5.1",
          "kind": "patch",
          "published_at": "2026-05-26T05:43:27Z"
        },
        {
          "tag": "v7.5.0",
          "kind": "minor",
          "published_at": "2026-05-25T18:12:41Z"
        },
        {
          "tag": "v7.0.0",
          "kind": "major",
          "published_at": "2026-04-16T08:21:32Z"
        },
        {
          "tag": "v6.16.4",
          "kind": "patch",
          "published_at": "2026-04-10T12:34:26Z"
        },
        {
          "tag": "v6.16.3",
          "kind": "patch",
          "published_at": "2026-04-10T11:25:21Z"
        },
        {
          "tag": "v6.16.2",
          "kind": "patch",
          "published_at": "2026-04-10T06:59:33Z"
        },
        {
          "tag": "v6.16.1",
          "kind": "patch",
          "published_at": "2026-04-10T06:27:01Z"
        },
        {
          "tag": "v6.16.0",
          "kind": "minor",
          "published_at": "2026-04-10T06:19:38Z"
        },
        {
          "tag": "v6.15.14",
          "kind": "patch",
          "published_at": "2026-04-09T13:44:37Z"
        },
        {
          "tag": "v6.15.13",
          "kind": "patch",
          "published_at": "2026-04-09T13:40:50Z"
        },
        {
          "tag": "v6.15.12",
          "kind": "patch",
          "published_at": "2026-04-09T12:14:54Z"
        },
        {
          "tag": "v6.15.11",
          "kind": "patch",
          "published_at": "2026-04-09T07:12:22Z"
        },
        {
          "tag": "v6.15.10",
          "kind": "patch",
          "published_at": "2026-04-08T22:38:58Z"
        },
        {
          "tag": "v6.15.9",
          "kind": "patch",
          "published_at": "2026-04-08T22:36:30Z"
        },
        {
          "tag": "v6.15.8",
          "kind": "patch",
          "published_at": "2026-04-08T21:41:16Z"
        },
        {
          "tag": "v6.15.7",
          "kind": "patch",
          "published_at": "2026-04-08T21:34:35Z"
        },
        {
          "tag": "v6.15.6",
          "kind": "patch",
          "published_at": "2026-04-08T21:30:19Z"
        },
        {
          "tag": "v6.15.5",
          "kind": "patch",
          "published_at": "2026-04-08T21:17:32Z"
        },
        {
          "tag": "v6.15.4",
          "kind": "patch",
          "published_at": "2026-04-08T20:48:45Z"
        },
        {
          "tag": "v6.15.3",
          "kind": "patch",
          "published_at": "2026-04-08T20:36:46Z"
        },
        {
          "tag": "v6.15.2",
          "kind": "patch",
          "published_at": "2026-04-08T20:21:23Z"
        },
        {
          "tag": "v6.15.1",
          "kind": "patch",
          "published_at": "2026-04-08T20:11:25Z"
        },
        {
          "tag": "v6.15.0",
          "kind": "minor",
          "published_at": "2026-04-08T20:00:55Z"
        },
        {
          "tag": "v6.14.11",
          "kind": "patch",
          "published_at": "2026-04-08T17:39:19Z"
        },
        {
          "tag": "v6.14.10",
          "kind": "patch",
          "published_at": "2026-04-08T16:34:11Z"
        },
        {
          "tag": "v6.14.9",
          "kind": "patch",
          "published_at": "2026-04-08T15:57:48Z"
        },
        {
          "tag": "v6.14.8",
          "kind": "patch",
          "published_at": "2026-04-08T15:32:19Z"
        },
        {
          "tag": "v6.14.7",
          "kind": "patch",
          "published_at": "2026-04-08T15:21:23Z"
        },
        {
          "tag": "v6.14.6",
          "kind": "patch",
          "published_at": "2026-04-08T15:05:21Z"
        },
        {
          "tag": "v6.14.5",
          "kind": "patch",
          "published_at": "2026-04-08T14:54:08Z"
        },
        {
          "tag": "v6.14.4",
          "kind": "patch",
          "published_at": "2026-04-08T14:46:13Z"
        },
        {
          "tag": "v6.14.3",
          "kind": "patch",
          "published_at": "2026-04-08T14:33:45Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "8b9bf7d08b70fc0816f327503f187a62179da70a",
          "body": "* fix(terminal): dimmed text on a filled background no longer renders invisible\n\nClaude Code (and other TUIs) draw some rows as *dimmed* text on a filled\nbackground — e.g. the grey 'message above' bars. In a codbash pane those bars\ncame out as empty grey strips with no text at all, while the same ou\n[…]\n 7.17.0 — named terminal panes + readable dimmed text\n\nCo-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "release: 7.17.0 — release candidate (merges #279 #280) (#281)",
          "author_name": "Valerii Kovalskii",
          "author_login": "vakovalskii",
          "committed_at": "2026-07-30T13:05:05Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "5082827f02e0b607f65b2164323c05d81e4fb3a2",
          "body": "…#268) (#278)\n\n* feat(kiro): support new file-based session format (~May 2026)\n\nKiro CLI moved to per-session files under ~/.kiro/sessions/cli/:\n  <uuid>.json  — metadata (session_id, cwd, title, created_at, updated_at)\n  <uuid>.jsonl — events: Prompt / AssistantMessage / ToolResults\n\n- Add KIRO_SES\n[…]\noreply@anthropic.com>\n\n---------\n\nCo-authored-by: sean10 <sean10reborn@gmail.com>\nCo-authored-by: NovakPAai <novakpavela@gmail.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "release: 7.16.0 — release candidate (merges #272 #273 #274 #275 #276 …",
          "author_name": "Valerii Kovalskii",
          "author_login": "vakovalskii",
          "committed_at": "2026-07-30T08:07:27Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "4781e00d073a00744dff0b144698db22fad408ec",
          "body": "Bring the project guide in line with this release cycle:\n- super-app framing (Overview landing + in-browser Workspace/Terminal) and\n  two-channel shipping (npm CLI + signed/notarized macOS DMG)\n- current source map (terminal.js, workspace-layouts/commands.js, shell-path.js,\n  overview/workspace/cale\n[…]\ng: manual npm workflow_dispatch + signed-DMG runbook with the\n  codesign timestamp/proxy gotcha; versioning examples bumped to 7.x\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: update CLAUDE.md for the super-app + signed-desktop reality (#267)",
          "author_name": "Valerii Kovalskii",
          "author_login": "vakovalskii",
          "committed_at": "2026-07-23T10:26:04Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "5e0a4f33ecfc68821bf6ff3c76e77825ea23e4a0",
          "body": "…settings, resizable panes) + input-freeze & lost-dialog fixes (#269)\n\n* feat: browser-like terminal workspace + input-freeze & lost-dialog fixes (7.15.0)\n\nFeatures\n- Resume where you left off: reopening offers one-click continue of each\n  pane's last agent conversation in that folder (claude --cont\n[…]\nift+T while typing in a form field (codex review)\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "release: 7.15.0 — browser-like terminal (resume, bookmarks & groups, …",
          "author_name": "Valerii Kovalskii",
          "author_login": "vakovalskii",
          "committed_at": "2026-07-23T06:45:24Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "3307ce9bd78d7f0fd693205c536d8df0c9c52f5e",
          "body": "…it (#265)\n\nShips #263 (repair stripped GUI PATH so agents are detected when launched\nfrom Finder/Dock) and #264 (Kiro maxBuffer + ToolUse; robust Workspace\nterminal fit for large/hi-DPI displays, #259).\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(release): 7.14.7 — GUI-launch detection, Kiro fixes, terminal f…",
          "author_name": "Valerii Kovalskii",
          "author_login": "vakovalskii",
          "committed_at": "2026-07-21T14:09:33Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "f2b77f97fbd8b90629354195a4da475be606fdae",
          "body": "…(#264)\n\nKiro (from PR #230 review, part 1 — the confirmed, mergeable half):\n- Add maxBuffer (50MB) to the scanKiroSessions + loadKiroDetail sqlite3 calls.\n  Without it, a large conversations_v2 value blows past the 1MB default and\n  the call throws ENOBUFS, so the Kiro session list / detail came ba\n[…]\n host spawned the pty at the wrong width and garbled full-screen\n  TUIs like Claude Code, most visibly on large / hi-DPI displays.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: Kiro maxBuffer + ToolUse (#230 pt1), robust terminal fit (#259) …",
          "author_name": "Valerii Kovalskii",
          "author_login": "vakovalskii",
          "committed_at": "2026-07-21T10:23:24Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "7042cf82fa9d871eebd49283c5953e565d73f721",
          "body": "* fix: detect agents when launched from GUI with stripped PATH\n\nmacOS/Linux GUI launches (Finder/Dock/Spotlight) inherit a minimal PATH\n(/usr/bin:/bin:/usr/sbin:/sbin) that omits user bin dirs such as\n~/.local/bin and ~/.npm-global/bin where CLIs like claude and codex are\ninstalled. agents-detect.js\n[…]\nocument the intentional append-after-system precedence + assert it\n  in a test; note case-insensitive-FS dupes are an accepted no-op.\n- CODBASH_DEBUG=1 logs skip/augment decisions for field diagnosis.",
          "is_bot": false,
          "headline": "fix: detect Claude/Codex when launched from GUI (stripped PATH) (#263)",
          "author_name": "NovakPAai",
          "author_login": "NovakPAai",
          "committed_at": "2026-07-21T10:08:32Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "1374f25711f9bf9be65a3c0e404f65f78932c9f1",
          "body": "Ships the changes merged since 7.14.5: native Add-project folder picker\n(desktop), Oh My Pi title-before-session parsing (#231/#260), GitHub avatar\nCSP fix (#249), Overview/Recommended full-width tiles (#243), Neuraldeep\nfooter, and signed-release docs + manual npm publish workflow.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(release): 7.14.6 — folder picker, community fixes, docs (#262)",
          "author_name": "Valerii Kovalskii",
          "author_login": "vakovalskii",
          "committed_at": "2026-07-21T08:05:22Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "32db6429bf0115e41f5f623e4f263322d1d38dc5",
          "body": "…#261)\n\nThe \"Add project → Local path\" field only had a text input + a datalist of\nknown folders; the native datalist popup overflows and can't be scrolled/\nstyled, and there was no way to browse for a folder.\n\n- Desktop: add a preload bridge (window.codbashDesktop.pickFolder) + an\n  ipcMain 'codbas\n[…]\n(verified: button hidden,\n78 suggestions, no bridge, 0 console errors). Takes effect in the installed\napp after a desktop rebuild.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(add-project): native folder picker (Finder) in the desktop app (…",
          "author_name": "Valerii Kovalskii",
          "author_login": "vakovalskii",
          "committed_at": "2026-07-21T07:48:29Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "bf74c4413d6a412af7ebe55ee14206db7b4555e0",
          "body": null,
          "is_bot": false,
          "headline": "fix(pi): share delayed header parsing with detail view (#260)",
          "author_name": "Tim Seriakov",
          "author_login": "timseriakov",
          "committed_at": "2026-07-21T07:42:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9e8b5f6c3bef5724a59b65de6b71815a9ec1ccbf",
          "body": "Overview was capped at max-width:1040px and Recommended rendered inside\n.changelog-container (max-width:700px), so on wide screens both views were\nsqueezed to the left with dead space on the right — unlike Sessions and\nProjects which span the full content area.\n\n- drop the 1040px cap on .ov-wrap\n- give Recommended its own full-width .tools-container\n- switch .tools-grid to auto-fit so the few curated cards stretch across\n  the row instead of leaving empty tracks",
          "is_bot": false,
          "headline": "fix: let Overview and Recommended tiles fill the available width (#243)",
          "author_name": "NovakPAai",
          "author_login": "NovakPAai",
          "committed_at": "2026-07-20T18:47:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4f4fae37cdaae2130541d6c8f7e5d4a22ba544dc",
          "body": null,
          "is_bot": false,
          "headline": "fix(pi): parse title-before-session OMP logs (#231)",
          "author_name": "Tim Seriakov",
          "author_login": "timseriakov",
          "committed_at": "2026-07-20T18:47:42Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7a8f420aec95a7665c3c4cba3e867795412baf9f",
          "body": "The cloud profile and leaderboard render GitHub avatars from\navatar_url (https://avatars.githubusercontent.com/...), but the\nContent-Security-Policy img-src directive only allowed 'self' and\ndata:, so the browser blocked them:\n\n  Loading the image 'https://avatars.githubusercontent.com/...'\n  violates the following Content Security Policy directive:\n  \"img-src 'self' data:\".\n\nAdd avatars.githubusercontent.com to img-src so avatars load.\n\nCo-authored-by: Mikhail Vasilyev <m.a.vasilyev@bitrix.ru>",
          "is_bot": false,
          "headline": "fix(csp): allow GitHub avatar images in img-src (#249)",
          "author_name": "Mikhail Vasilyev",
          "author_login": "mvasilyev",
          "committed_at": "2026-07-20T18:47:37Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fe8c53d1f10fd8204f6fc8a4e55d0ffa7ba4cbc5",
          "body": "…h (#258)\n\n- README: desktop app is now signed & notarized (arm64 + x64), opens with\n  no Gatekeeper warning (was \"Apple Silicon\" only).\n- desktop/RELEASE.md: rewritten for the real signed+notarized flow — keychain\n  notary profile, the VPN/proxy timestamp gotcha, `--arm64 --x64`, DMG-container\n  st\n[…]\n — desktop DMG releases no longer trigger (and 403-fail) a\n  CLI publish; publishing stays a deliberate, short-lived-token action.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs+chore: signed-release docs, Neuraldeep footer, manual npm publis…",
          "author_name": "Valerii Kovalskii",
          "author_login": "vakovalskii",
          "committed_at": "2026-07-20T18:46:54Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "8178a9cfbf63047e892b3642ccd7d52ee0292ec9",
          "body": "….14.5) (#257)\n\nFixes from a multi-agent bug hunt (21 findings, adversarially verified).\n\nHIGH\n- server.js: prototype-safe findSessionFile + validate read-route ids +\n  wrap route dispatch in try/catch → a malformed id like\n  /api/session/__proto__ no longer crashes the whole process (one-request Do\n[…]\n::1]).\n- terminal.js: expand ~ in a requested cwd before spawn.\n- convert.js: assistant turns serialized as output_text for Codex.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: bug-hunt sweep — crash-safety, import data-loss, correctness (v7…",
          "author_name": "Valerii Kovalskii",
          "author_login": "vakovalskii",
          "committed_at": "2026-07-20T18:06:51Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "f36e335eac7cd650f431321f458b3899784c67ca",
          "body": "…256)\n\nSession cards had only the in-app \"Open here\" (▶) action. Added a\nterminal-icon button that launches in the OS terminal (iTerm2/Terminal.app/\n… via /api/launch, reusing resumeLastProjectSession):\n- CLI agents (claude/codex/qwen/opencode/kiro/kilo/gemini/pi): resume in\n  the native terminal\n- \n[…]\nVS Code-only, no terminal to resume into)\n\nThe ▶ in-app button stays; its title now says \"in-app terminal\" to\ndistinguish the two.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(cards): launch a session in the native terminal from its card (#…",
          "author_name": "Valerii Kovalskii",
          "author_login": "vakovalskii",
          "committed_at": "2026-07-20T17:48:31Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "6d129c20a2c0a505c1e3b5e09adf42ab43b85880",
          "body": "- jumpToRunningAgent: the agent is already running, so clicking a row\n  must not prefill a resume command (that started a 2nd instance) and\n  must not dead-click when the session isn't indexed. Now: jump to the\n  live pane if one exists, else open a plain terminal in the project\n  folder — no resume\n[…]\non the full\n  cwd, not the folder basename, so two same-named projects (or a swap)\n  can't reuse a stale tree / wrong jump target.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(workspace): running-agent click no longer spawns a duplicate (#255)",
          "author_name": "Valerii Kovalskii",
          "author_login": "vakovalskii",
          "committed_at": "2026-07-20T17:28:42Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "3ff4eec81f5396104a1971d9ab3554c2bdd4fde7",
          "body": "- Pin mac signing identity to the Developer ID Application cert\n  (team A933C2TJXU). Name is given WITHOUT the \"Developer ID\n  Application:\" prefix — electron-builder rejects the prefix and\n  picks the cert type automatically.\n- notarize.js now prefers a keychain profile (APPLE_KEYCHAIN_PROFILE →\n  \n[…]\nLE_KEYCHAIN_PROFILE=codbash-notary CSC_IDENTITY_AUTO_DISCOVERY=true \\\n    ./node_modules/.bin/electron-builder --mac --arm64 --x64\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(desktop): enable Developer ID signing + notarization (#254)",
          "author_name": "Valerii Kovalskii",
          "author_login": "vakovalskii",
          "committed_at": "2026-07-20T16:11:03Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "0a4cc466504f5d04366cd907d3c40ea4e7fc725c",
          "body": "…(v7.14.4) (#253)\n\n- Saved layouts now capture each pane's working directory (cwd) and any\n  prefilled-but-unrun command, and restore them — previously only cmd was\n  stored, so restored panes opened in the home dir with no command.\n- Rewrote the sidebar running tree to build from real agent detecti\n[…]\n session toolbar in the Terminal and Overview views via a\n  body[data-view] attribute, since neither has a session list to act on.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: layout restore, agent-aware running tree, cleaner Terminal view …",
          "author_name": "Valerii Kovalskii",
          "author_login": "vakovalskii",
          "committed_at": "2026-07-20T11:25:54Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "7d556b532a6d50c8b6c09e8047562ae1211147d5",
          "body": "…14.3) (#252)\n\nRelocates #wsRunningTree from the bottom of the sidebar to directly beneath the\nTerminal nav item, above the Sessions group — where it reads as part of the\nterminal area.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: move running-projects tree under the Terminal sidebar item (v7.…",
          "author_name": "Valerii Kovalskii",
          "author_login": "vakovalskii",
          "committed_at": "2026-07-20T11:05:46Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "3fc8b4431412bfa284d01e70662968befbef991e",
          "body": "- Sidebar shows a live tree of projects that currently have running Workspace\n  terminals (bottom of the sidebar); click a project or a terminal to jump to\n  it. Grouped by folder, skips home shells, change-signature guarded.\n- _wsPaneLabel now strips leading VAR=value env prefixes and masks secrets\n[…]\n so a\n  proxied command (HTTPS_PROXY='...' claude) shows as \"claude\" — proxy\n  credentials no longer leak into the pane title bar.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: sidebar running-projects tree + safer pane labels (v7.14.2) (#251)",
          "author_name": "Valerii Kovalskii",
          "author_login": "vakovalskii",
          "committed_at": "2026-07-20T10:51:21Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "7413931182b1e1b195ce93a903cf56b5c1dbf3ba",
          "body": "…250)\n\n- Save layout was a no-op in the Electron app: it used window.prompt, which\n  Electron ignores (returns undefined). Added codbashPrompt() — an in-app modal\n  prompt — used for saving layouts and the copy fallback.\n- Pane title bars now show a short label (folder basename like \"codbash\", or th\n[…]\nwser-verified: pane label \"codbash\", layout save via the new prompt persists,\nCmd+D adds a tab; 182 tests pass, no console errors.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: layout save in desktop app + tidier terminal naming (v7.14.1) (#…",
          "author_name": "Valerii Kovalskii",
          "author_login": "vakovalskii",
          "committed_at": "2026-07-20T10:38:42Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "c67c89ce95a4000a6acfb08872394af7c820f485",
          "body": "- Terminals auto-name after their project folder (skips home dir); a visible ✎\n  rename button on each tab (plus double-click) makes naming discoverable, and\n  a manual name sticks (userNamed) so auto-naming won't override it.\n- README: hero screenshot (docs/assets/codbash-desktop.png) + Overview,\n  Workspace terminal, and macOS desktop-app sections; Quick Start links the DMG.\n- Changelog + version → 7.14.0 (npm + desktop).\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: named terminals + macOS desktop app in README (v7.14.0) (#248)",
          "author_name": "Valerii Kovalskii",
          "author_login": "vakovalskii",
          "committed_at": "2026-07-20T10:16:55Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "8b2c29de94a205a63649741b61d97d2ae6706b8c",
          "body": "…aunch (#247)\n\nTwo crashes hit only when launched from Finder/`open` (not `npm start`):\n\n1. `https is not defined` — the notify updater used https.get without requiring\n   it, throwing on launch (caught → app quit). Add `require('https')`.\n2. `node` not found — a GUI-launched macOS app inherits only\n[…]\n to /Applications and launched via `open` — app boots, spawns\nthe server on an ephemeral port, dashboard returns 200, stays alive.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(desktop): require https + robust node-binary resolution for GUI l…",
          "author_name": "Valerii Kovalskii",
          "author_login": "vakovalskii",
          "committed_at": "2026-07-20T10:03:05Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "d4804c997d329c389bd43d667d88f3cb1efdaa10",
          "body": "Silent auto-update on macOS requires a signed build; codbash currently ships\nunsigned. So the app now uses a NOTIFY model: on launch + every 6h it queries\nthe GitHub releases/latest API and, if a newer version exists, offers to open\nthe download page. Works without a signing identity today; can be s\n[…]\n the notify-now / silent-when-signed update models\n\nFirst desktop release published: v7.13.0 (unsigned, arm64) on GitHub Releases.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(desktop): notify-based update check via GitHub Releases (#246)",
          "author_name": "Valerii Kovalskii",
          "author_login": "vakovalskii",
          "committed_at": "2026-07-20T09:51:04Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e9ec3760bae27e0d1f473fd32c3fca63ad0eb8aa",
          "body": "… (#245)\n\n- Icon: codbash stacked-layers glyph on brand-blue rounded square\n  (build/icon.svg source → build/icon.png 1024²; electron-builder makes .icns)\n- Auto-update: electron-updater checks GitHub Releases on launch + every 6h\n  (packaged builds only; dev/smoke skip it)\n- Notarization: afterSign\n[…]\nnd\nthe @lydell/node-pty prebuilt bundled, icon.icns generated, afterSign hook\ncorrectly skipping notarization without credentials.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(desktop): app icon, auto-updater, and notarized-release pipeline…",
          "author_name": "Valerii Kovalskii",
          "author_login": "vakovalskii",
          "committed_at": "2026-07-20T09:33:51Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "bacf02ed6fa8451986931c05abdce713bd475405",
          "body": "…244)\n\nAdds a desktop/ module that wraps the UNMODIFIED codbash server in a native\nElectron window. It is purely additive — the zero-dependency CLI core and the\npublished npm package behavior are unchanged; Electron lives only in desktop/\nwith its own package.json.\n\nHow it works: the Electron main p\n[…]\ned: `CODBASH_SMOKE=1 electron .` boots the server on an ephemeral port,\nloads the window, serves /api/sessions, and quits cleanly.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(desktop): Electron shell for macOS (additive, core untouched) (#…",
          "author_name": "Valerii Kovalskii",
          "author_login": "vakovalskii",
          "committed_at": "2026-07-20T09:25:11Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "814754c904d605ef1e2172b04a84b0dd7bb726ec",
          "body": "….0) (#242)\n\nOverview\n- Headline stats (sessions / active agents / terminals / spend), recent\n  sessions as clickable cards, live terminals grouped by project folder.\n\nTerminals ↔ projects\n- Session cards get \"Open here\": opens a pane in the session's project folder\n  with the agent's resume command\n[…]\nthe tooltip;\n  rebuild is skipped when nothing changed (no more jitter).\n- \"Add project\" autocompletes from known session folders.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: project-aware terminals, richer Overview, tidier sidebar (v7.13…",
          "author_name": "Valerii Kovalskii",
          "author_login": "vakovalskii",
          "committed_at": "2026-07-20T08:27:57Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "7acd29e805d598eb23b0024352547d486b5f9d99",
          "body": "…ebar (v7.12.0) (#241)\n\n* fix: Workspace launches commands into the focused pane (v7.10.1)\n\nPreviously saved commands / the manager \"Run\" always went to the first\npane of the active tab, so with splits the command landed in the wrong\nterminal. Now:\n\n- Clicking/focusing a pane marks it focused (track\n[…]\nupdate available\". Destroy the socket on timeout.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: Workspace status bar + focused pane, Overview landing, tidy sid…",
          "author_name": "Valerii Kovalskii",
          "author_login": "vakovalskii",
          "committed_at": "2026-07-20T07:44:39Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "4e1f6719d2900383da6ea41a78f7683d094b4de8",
          "body": "…es (v7.10.0) (#240)\n\nTwo things land together:\n\nSaved layouts (src/workspace-layouts.js, /api/terminal/layouts):\n- \"Save layout\" snapshots the whole workspace — every tab, its panes,\n  and each pane's start command.\n- \"Layouts ▾\" relaunches a saved workspace in one click: rebuilds the\n  tabs/panes \n[…]\nlist/delete + tab structure persisted; and a marker command's\noutput survives leaving to another view and returning (same socket).\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: Workspace save/relaunch layouts + keep-alive across view switch…",
          "author_name": "Valerii Kovalskii",
          "author_login": "vakovalskii",
          "committed_at": "2026-07-20T06:52:46Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "11e9ebb958a50b588e9f9493c74c7fe92a81eeae",
          "body": "Save custom agent start commands (e.g. a proxied launch:\nHTTPS_PROXY='http://user:pass@host:port' claude --dangerously-skip-permissions)\nand fire them into any pane from the per-pane Launch menu.\n\n- src/workspace-commands.js: server-side store at ~/.codedash/\n  workspace-commands.json, mode 0600 (th\n[…]\ned-claude example: saved,\nlisted masked, present in the Launch menu with the full value. Full\nsuite 173 pass / 2 skipped / 0 fail.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: Workspace saved start commands (v7.9.0) (#239)",
          "author_name": "Valerii Kovalskii",
          "author_login": "vakovalskii",
          "committed_at": "2026-07-20T06:27:48Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "f0c23375083ea374d0b63bb4aa6b8f06b052bdb3",
          "body": "- Replace the ▯/⊞ glyph layout buttons (rendered as tofu boxes in many\n  fonts) with crisp inline SVG icons (1 / 2-col / 3-col / 2×2).\n- Fill the content area edge-to-edge: drop the dashboard's 20px padding\n  and scroll while the workspace is mounted (`.content:has(.workspace-wrap)`)\n  and give the \n[…]\nd: fresh load = 1 tab / 1 pane, no horizontal overflow, wrap\nheight exactly matches the content box, all four layout icons render.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: Workspace UI — SVG split icons + full-height layout (#238)",
          "author_name": "Valerii Kovalskii",
          "author_login": "vakovalskii",
          "committed_at": "2026-07-20T06:18:04Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a51cac82b9cc0d7d8cb77a9dc7732ab3d575e9d9",
          "body": "Turns the single-pane terminal into an iTerm-like workspace:\n- Named tabs (double-click to rename); + to add, × to close.\n- Each tab splits into 1–4 panes via layout buttons or \"+ Pane\"; every\n  pane is an independent xterm + WebSocket + server-side pty.\n- Per-pane \"Launch\" dropdown types an agent c\n[…]\na browser: 2 tabs with 2- and 3-pane layouts, 5 live ptys,\nrename, and background-tab survival across switches. No server changes.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: Workspace tabs + splits + agent launcher (v7.8.0) (#237)",
          "author_name": "Valerii Kovalskii",
          "author_login": "vakovalskii",
          "committed_at": "2026-07-20T06:12:28Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "af393589a9eb98919cc12f976787397a3640792a",
          "body": "Adds a real terminal in the browser (new \"Workspace\" view) as the first\nstep of the TermDeck merge. Single pane for now; splits, tmux-less\nreattach, saved commands and per-project workspaces come next.\n\nArchitecture (optional feature — core stays dependency-free):\n- src/terminal.js: lazily loads @ly\n[…]\nnd-to-end in a browser (real zsh round-trip, bad-token rejection,\nteardown on navigate). Full suite 166 pass / 2 skipped / 0 fail.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: Workspace browser terminal — B-0 walking skeleton (v7.7.0) (#236)",
          "author_name": "Valerii Kovalskii",
          "author_login": "vakovalskii",
          "committed_at": "2026-07-20T05:59:29Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "ceb8c1fe976cdea47ad70476b46f36646a426409",
          "body": "New \"Recommended\" sidebar view (Tools section) showing curated companion\napps that pair well with codbash — Copyosity, ccstatusline, RustDesk,\niTerm2 — ported from TermDeck's useful-links section.\n\n- Tool list is a plain config array (RECOMMENDED_TOOLS) so adding a tool\n  is a one-liner.\n- Each card\n[…]\n  render() dispatch for currentView === 'recommended', nav item + key,\n  NAV_HELP entry, and themed card CSS (dark/light/monokai).\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: Recommended tools view (v7.6.0) (#235)",
          "author_name": "Valerii Kovalskii",
          "author_login": "vakovalskii",
          "committed_at": "2026-07-19T19:05:38Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "0de25b715cda57a7e93df83a4685f334fe5f7c3d",
          "body": "Every sidebar item now shows a one-line \"what it is & why\" tooltip on\nhover, keyed by data-key/data-view via a new NAV_HELP map in\nsidebar-config.js.\n\nThe sidebar has overflow-x:hidden, so a pure-CSS ::after tooltip would\nbe clipped. Instead we render a single shared element appended to\n<body> and p\n[…]\nAdded tests asserting every KNOWN_ITEM_KEY (+ settings) has NAV_HELP and\nthat navHelpFor is safe against unknown / prototype keys.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: sidebar hover tooltips explaining each item (v7.5.3) (#234)",
          "author_name": "Valerii Kovalskii",
          "author_login": "vakovalskii",
          "committed_at": "2026-07-19T07:12:39Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "d28d1a75db207ec90c3a0de44fcb335702f7e83e",
          "body": "The \"Update Now\" flow installed the new version but then died without\ncoming back up — the port was freed but nothing relistened, so the UI\nkept showing the stale version and the page failed to reload.\n\nRoot cause: the restart spawned a child inside a `process.on('exit')`\nhandler. The event loop is \n[…]\nase\nthe port. Restarter reuses the same port/host and skips reopening the\nbrowser. Also raise the npm-install timeout 60s -> 120s.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: make self-update restart reliably (v7.5.2) (#233)",
          "author_name": "Valerii Kovalskii",
          "author_login": "vakovalskii",
          "committed_at": "2026-07-19T03:38:43Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "5d7234424105c181ae4fdeb0a392e24bc51b3b05",
          "body": "fix: Add deleteSession safety guard and extend file tracking for session",
          "is_bot": false,
          "headline": "Merge pull request #232 from skargaklop/main",
          "author_name": "Valerii Kovalskii",
          "author_login": "vakovalskii",
          "committed_at": "2026-07-18T12:39:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ae889e6f36b7e673bf6bc243b4529f7c975710fb",
          "body": "rescan\n\nThe deleteSession function now validates sessionId to prevent accidental\ndirectory destruction from empty or traversal values like '.' and '..'.\nAlso tracks individual .jsonl files in project dirs and additional agent\ndatabases (Cursor, Opencode, Kilo, Kiro, Qwen) for more accurate rescan\ndetection.",
          "is_bot": false,
          "headline": "fix: Add deleteSession safety guard and extend file tracking for session",
          "author_name": "skargaklop",
          "author_login": "skargaklop",
          "committed_at": "2026-07-03T11:26:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2fdd5a5f945ca6ec7c52329401c437e876611be0",
          "body": null,
          "is_bot": false,
          "headline": "Merge pull request #222 from embogomolov/fix/codex-activity-timezone",
          "author_name": "NovakPAai",
          "author_login": "NovakPAai",
          "committed_at": "2026-05-26T18:16:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "56fa2b90ad14a54c0b3e5ac9fce7f04f26933fa6",
          "body": "Patch — picks up the design port (#225) and Pi resume-target hardening\n(#224) shipped since 7.5.0.\n\nCo-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: release 7.5.1 (#226)",
          "author_name": "Valerii Kovalskii",
          "author_login": "vakovalskii",
          "committed_at": "2026-05-26T05:43:22Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "b4e6cbaf59472d82fdf201c7a83d17e263e332b2",
          "body": "…on) (#225)\n\nTokens\n- Dark theme deepened to #08090C bg / #121418 panels with #2A2D33 borders\n- Cool text (#EBEDF0 / #B6BCC8 / #9499A5) replaces gray-blue stack\n- Brand accent shifted to neon green #00FF88 (dark) / AA-safe #10804A (light)\n- Light theme cooled to #FAFBFC bg + #111827 fg + #57606D mut\n[…]\nraphy\n- Inter loaded from Google Fonts, font-smoothing antialiased\n- CSP relaxed for fonts.googleapis.com / fonts.gstatic.com only\n\nCo-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(design): port neuraldeep visual identity (palette + Inter + moti…",
          "author_name": "Valerii Kovalskii",
          "author_login": "vakovalskii",
          "committed_at": "2026-05-26T05:41:37Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "77dfd8c2af66b4bbfc8fa0303874cfe92768517e",
          "body": null,
          "is_bot": false,
          "headline": "fix(pi): address resume review findings (#224)",
          "author_name": "Tim Seriakov",
          "author_login": "timseriakov",
          "committed_at": "2026-05-26T05:27:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7d425df46c9cb596785e041cb550799c728588ac",
          "body": null,
          "is_bot": false,
          "headline": "chore(cache): use codbash temp cache names",
          "author_name": "embogomolov",
          "author_login": "embogomolov",
          "committed_at": "2026-05-25T20:12:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "84d92199dcf36d5af56ef1dea264675335955a9b",
          "body": null,
          "is_bot": false,
          "headline": "fix(codex): use real activity timestamps and local calendar days",
          "author_name": "embogomolov",
          "author_login": "embogomolov",
          "committed_at": "2026-05-25T20:12:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "89554e4c061bd7aa93b40e8a965d094cefc91a33",
          "body": "Five new agents (Qwen, Copilot Chat, Copilot CLI, Pi, Oh My Pi), project\nlauncher with GitHub repo onboarding, subscriptions management, background\ngit fetch worker, sidebar customization, and 7+ Codex/Windows/cloud-sync\nstability fixes accumulated over 27 commits since 7.4.0.\n\nCo-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: release 7.5.0 (#223)",
          "author_name": "Valerii Kovalskii",
          "author_login": "vakovalskii",
          "committed_at": "2026-05-25T17:53:07Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "5a0dffaab12a7de519b9994a1d48d6b6059b359b",
          "body": "* feat(pi): add Pi and Oh My Pi support\n\nAdds Pi and Oh My Pi as first-class agents instead of treating them as a combined sidebar entry. The sidebar exposes separate Pi and Oh My Pi filters, while leaderboard aggregation keeps their stats distinct and renders lowercase badges only in the leaderboar\n[…]\nisplay casing outside Leaderboard and lowercase badges inside Leaderboard.\n\nTests:\n\n- node --test\n- Manual: omp --resume <jsonl path> --print 'respond ok'\n\n* docs(pi): document Pi and Oh My Pi support",
          "is_bot": false,
          "headline": "feat(pi): add Pi and Oh My Pi support (#221)",
          "author_name": "Tim Seriakov",
          "author_login": "timseriakov",
          "committed_at": "2026-05-25T17:49:04Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "4ba985d98b15055546fc9e73cf0c9ce57438cb8a",
          "body": "Codex Desktop >= 0.133.0-alpha.1 ingests Claude Code sessions from\n~/.claude/projects/**/*.jsonl into ~/.codex/sessions/ and registers\nthem in session_index.jsonl with a fresh UUIDv7 thread id. The\noriginal Claude file stays in place, so the same conversation\nappeared twice in codbash — once correct\n[…]\nfile in the rescan-change detector to close a\nrace where Codex writes the rollout/index slightly before the ledger\nand a poll fires in between.\n\nCo-authored-by: jackrescuer-gif <jackrescuer@gmail.com>",
          "is_bot": false,
          "headline": "fix: dedupe Claude sessions imported by Codex Desktop (#220)",
          "author_name": "NovakPAai",
          "author_login": "NovakPAai",
          "committed_at": "2026-05-25T05:55:26Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c39e09cdb04ec944583489854a08c4374b42cd39",
          "body": "…splay (#218)\n\nAnalytics → History tab now lets you track paid subscriptions and API\ndeposits across all supported services. Service select expanded from\n5 to 9 entries (+ API custom): Claude Code, ChatGPT/Codex, Cursor,\nCopilot, Kiro, OpenCode, Qwen Code, Kilo, API (custom). Picking a\nservice popul\n[…]\n- Three-agent review (code / security / UX-with-skills): all CRITICAL,\n  HIGH, MEDIUM addressed; selected LOW deferred with reasons in PR body.\n\nCo-authored-by: jackrescuer-gif <jackrescuer@gmail.com>",
          "is_bot": false,
          "headline": "feat: subscriptions management for all 7 agents + fix project name di…",
          "author_name": "NovakPAai",
          "author_login": "NovakPAai",
          "committed_at": "2026-05-20T05:45:18Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "654530cf4e15c7fbc451f89ae3739e483a8b4605",
          "body": "Sidebar is now organized into 3 collapsible sections — Workspace, Agents,\nTools — with Install agents as a default-collapsed sub-section. Each entry\ncan be hidden via Settings → Sidebar. Section state and per-item visibility\npersist in localStorage['codedash-sidebar-config'] (schema v:1). Settings\np\n[…]\nfile-driven if it ever shows up.\n- out-of-scope: count badge on collapsed \"Install agents\" — cosmetic polish,\n  will land in a follow-up UI PR.\n\nCo-authored-by: jackrescuer-gif <jackrescuer@gmail.com>",
          "is_bot": false,
          "headline": "feat(sidebar): group + customize sidebar items, tabbed Settings (#216)",
          "author_name": "NovakPAai",
          "author_login": "NovakPAai",
          "committed_at": "2026-05-18T13:45:21Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "56a8da823b443e2a748bc5dbec156b971d6b7615",
          "body": "* fix(repo-refresh): cancel manager-owned timers in test teardown + run tests in CI\n\nAddresses two non-blocking follow-ups from #213 review.\n\nTest isolation: createRepoRefreshManager() now tracks every setTimeout it\nschedules (debounced save, runFetch 60s timeout/SIGKILL grace, waiter\ntimeouts) in a\n[…]\neps(t, ...) helper — that file ran before repo-refresh.test.js in\nthe CI test order and was leaving timers across the file boundary.\n\n---------\n\nCo-authored-by: jackrescuer-gif <jackrescuer@gmail.com>",
          "is_bot": false,
          "headline": "fix(repo-refresh): cancel manager-owned timers + run tests in CI (#217)",
          "author_name": "NovakPAai",
          "author_login": "NovakPAai",
          "committed_at": "2026-05-16T07:53:29Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "94e7be62e2e362bc13e49ff21ddfb255bed70d69",
          "body": "Adds per-project \"Auto-fetch on new chat\" toggle, a manual refresh\nbutton on each project card, and a global \"Fetch all on codbash start\"\ntoggle. Runs `git fetch --all --prune` in the background — never touches\nthe working tree, never blocks the HTTP server.\n\nGoal: when a session starts, the LLM see\n[…]\nrowser.\n- \"Behind by N commits\" indicator.\n- Connection-lost banner when poll fails.\n- toast queue/stack (current dedupe is sufficient for v1).\n\nCo-authored-by: jackrescuer-gif <jackrescuer@gmail.com>",
          "is_bot": false,
          "headline": "feat: background git fetch for connected repos (auto-refresh v1) (#213)",
          "author_name": "NovakPAai",
          "author_login": "NovakPAai",
          "committed_at": "2026-05-15T07:59:51Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "7c148bef3033ad958a26bfd757c1af39a13d89de",
          "body": null,
          "is_bot": false,
          "headline": "fix: preserve Windows paths for Codex resume (#214)",
          "author_name": "Nikita Smirnov",
          "author_login": "IamXesus",
          "committed_at": "2026-05-15T07:58:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "831e5280e864b3341013a17186aa28ce386d11ac",
          "body": "…sses (#209) (#215)\n\n- Watch ~/.codex/history.jsonl, session_index.jsonl and per-day session\n  dirs in _sessionsNeedRescan so new Codex sessions appear without\n  restarting a long-running codbash server. Walk is performed once per\n  rescan and reused in _updateScanMarkers to avoid a TOCTOU race.\n- P\n[…]\n is swallowed\n- EACCES on ~/.codex: symmetric with other agents' silent skip\n- stat-on-poll when no Codex installed: one existsSync, negligible\n\nCo-authored-by: jackrescuer-gif <jackrescuer@gmail.com>",
          "is_bot": false,
          "headline": "fix(codex): pick up new sessions and stop misattributing active proce…",
          "author_name": "NovakPAai",
          "author_login": "NovakPAai",
          "committed_at": "2026-05-15T07:56:35Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "95d48438c4049c4e105f180f93298a7836822c2a",
          "body": "* fix: collapse worktrees to main repo, ignore $HOME-as-git-root\n\nresolveGitRoot now:\n- Uses `git worktree list --porcelain` first record to map linked\n  worktrees to the main repo (was: separate \"project\" per worktree).\n- Drops bare-repo paths (root ending in .git) so they don't pollute\n  downstrea\n[…]\nsistent\n  with other cache writers in this file; loader try/catch handles a\n  truncated JSON gracefully (falls back to empty cache).\n\n---------\n\nCo-authored-by: jackrescuer-gif <jackrescuer@gmail.com>",
          "is_bot": false,
          "headline": "fix: collapse worktrees to main repo, ignore $HOME-as-git-root (#212)",
          "author_name": "NovakPAai",
          "author_login": "NovakPAai",
          "committed_at": "2026-05-13T19:36:01Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "ecdafab9c8d725ccba1fd41909abe1758a9f43ba",
          "body": "…ucture\n\nfeat: Projects tab → Projects (launcher) + History subtabs + agent picker\n\nWhat's new\n\nUser-facing\n\nEach registered project gets a clean launcher card: name, path, source tag (github / added / auto), ▶ New, ⟳ Last, ⏷ agent picker, View N sessions → deeplink to History filtered to that proje\n[…]\nPI routes: GET/PUT /api/settings, GET /api/agents/installed, POST /api/agents/refresh-detect.\nPOST /api/launch gains optional autoRegister and returns registered: { ... } when a new project was added.",
          "is_bot": false,
          "headline": "Merge pull request #211 from NovakPAai/claude/jack-projects-tab-restr…",
          "author_name": "NovakPAai",
          "author_login": "NovakPAai",
          "committed_at": "2026-05-12T19:49:16Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c902d039ba163efafde4edc025d43f3ac08c176d",
          "body": "…ttings\n\nFalse positives fixed:\n- Copilot CLI was 'detected' just because 'gh' is on PATH. Now checks for\n  the actual gh-copilot extension dir under ~/.local/share/gh/extensions/\n  (Linux/macOS) or %LOCALAPPDATA%/GitHub CLI/extensions (Windows).\n- Copilot Chat was 'detected' just because VS Code.ap\n[…]\ntalled but the plugin is missing.\n\nTests stub customChecks to keep them deterministic vs. the developer's\nreal filesystem. New scenario locked: customCheck fires only when PATH +\napp-bundle both miss.",
          "is_bot": false,
          "headline": "feat(detect): proper copilot detection + 'Detected agents' list in Se…",
          "author_name": "jackrescuer-gif",
          "author_login": "jackrescuer-gif",
          "committed_at": "2026-05-12T19:41:38Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "00ee55adbfe43409bc020e40075a89ee492753ae",
          "body": "…ivity\n\nCSS was using wrong variable names (--card-bg, --input-bg) — those don't\nexist in codbash, so the new surface fell back to hardcoded grays instead\nof the active theme. Switch to the real names (--bg-card, --bg-input,\n--text-secondary, --text-muted) and match the existing .card / .toolbar-btn\n[…]\nrojectActivityTs() now takes max(last_ts) across all of a project's\nsessions instead of trusting list[0] to be the most recent. Same idea in\nrenderLauncherCard — slice().sort() before reading list[0].",
          "is_bot": false,
          "headline": "style(projects): use existing theme variables; sort cards by last act…",
          "author_name": "jackrescuer-gif",
          "author_login": "jackrescuer-gif",
          "committed_at": "2026-05-12T19:41:38Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "3824fcfc644f6a196c180bce3ae1360c6906c02e",
          "body": "…rived folders\n\nThe Projects landing was rendering every folder that ever held a session as a\nlauncher card, mirroring the old behavior. That defeats the purpose of the\nsplit — Projects = 'things I'm actively working on', History = 'everywhere\nI've ever been'. Filter the landing to entries with a manualId set (i.e.\nprojects from projects.json) so it stays focused on the registry.",
          "is_bot": false,
          "headline": "fix(projects): landing shows only registered projects, not session-de…",
          "author_name": "jackrescuer-gif",
          "author_login": "jackrescuer-gif",
          "committed_at": "2026-05-12T19:41:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f9857e4c91cb69658c97c49c3df189d9175fe7fe",
          "body": "…agent picker\n\nSplits the single Projects view into two purpose-built subtabs:\n- Projects (landing): registered project launcher cards, ▶ New split-button,\n  ⏷ per-launch agent picker, ⚙ Settings modal for default agent.\n- History: the existing grouped-session view, relocated unchanged.\n\nAdds settin\n[…]\nUbuntu/Fedora) — agent detection via PATH walk, no .app bundles\n- WSL (Ubuntu under Windows 11) — same as Linux + WSL-specific paths\n- Windows native — `where.exe` detection branch in agents-detect.js",
          "is_bot": false,
          "headline": "feat: restructure Projects tab — launcher landing + History subtab + …",
          "author_name": "jackrescuer-gif",
          "author_login": "jackrescuer-gif",
          "committed_at": "2026-05-12T19:41:38Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "a50aeff919279dbaeb959fe5ca0fd3cf0f81adc2",
          "body": "…210)\n\n* feat: project launcher with New/Last session + GitHub repo onboarding\n\nAdds a \"Project launcher\" experience on the Projects view:\n- \"▶ New\" button on each project group opens a fresh agent session in the\n  project directory (no --resume). Uses the most recently used tool for that\n  project,\n[…]\nthored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: jackrescuer-gif <jackrescuer@gmail.com>\nCo-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: project launcher — New/Last session + GitHub repo onboarding (#…",
          "author_name": "NovakPAai",
          "author_login": "NovakPAai",
          "committed_at": "2026-05-12T19:29:00Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "93fe8e39e37ce31122757300db599565452969ca",
          "body": "* feat: add GitHub Copilot CLI as 6th supported agent\n\n- Reads VS Code sessions from ~/.copilot/session-state/<uuid>/\n- Reads JetBrains sessions from ~/.copilot/jb/<uuid>/partition-1.jsonl\n- Parses workspace.yaml (flat + block scalar) for metadata\n- Active detection via inuse.<pid>.lock files\n- Wire\n[…]\nilot Chat, Resume for Copilot CLI\n\n* fix: restore Kilo CLI lookup, add UUID validation for Copilot CLI, fix indentation\n\n---------\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>",
          "is_bot": false,
          "headline": "feat: add GitHub Copilot CLI as 7th supported agent (#207)",
          "author_name": "ABIvan-Tech",
          "author_login": "ABIvan-Tech",
          "committed_at": "2026-05-07T16:22:34Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "258d41f3582cfe247629077d0f9cc0a111c45e16",
          "body": "…tab (#208)\n\n- Clear _analyticsHtmlCache in addSubEntry/removeSubEntry so render()\n  always rebuilds the HTML from current localStorage, not the stale cache\n- Replace service/plan <select> dropdowns with <input>+<datalist> to\n  allow adding any custom service (GitHub Copilot, Windsurf, etc.)\n- Auto-\n[…]\n 180px to fit longer service names\n- Add aria-label to all form inputs\n- Include service name in breakdown label for multi-subscription clarity\n\nCo-authored-by: jackrescuer-gif <jackrescuer@gmail.com>",
          "is_bot": false,
          "headline": "fix: subscription entries not appearing after 3 additions in History …",
          "author_name": "NovakPAai",
          "author_login": "NovakPAai",
          "committed_at": "2026-05-06T07:26:12Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "655a695ca2a78ce2258d79da44c09da76bf40d57",
          "body": "* initial version of structured messages support\n\n* truncation for structured messages\n\n* structured messages for Claude Code sessions\n\n* more structures supported\n\n* code review comments addressed\n\n---------\n\nCo-authored-by: Alexander Kolotov <alexander.kolotov@gmail.com>",
          "is_bot": false,
          "headline": "feat: render structured Claude Code session detail messages (#198)",
          "author_name": "Alexander Kolotov",
          "author_login": "akolotov",
          "committed_at": "2026-04-23T05:47:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "34ae59cd994c5bc5d03db44f20f1ad0635392110",
          "body": "Co-authored-by: jackrescuer-gif <jackrescuer@gmail.com>",
          "is_bot": false,
          "headline": "docs: rename codedash → codbash in installation and CLI docs (#205)",
          "author_name": "NovakPAai",
          "author_login": "NovakPAai",
          "committed_at": "2026-04-22T18:02:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3fd494334e3345415a9060598a2404c6b3bcbde5",
          "body": "… (#204)\n\nCloud Sync previously preserved the source machine's absolute project\npath and derived the Claude/Cursor project key from it on pull. That\ntied project identity to the source machine, so sessions pushed from\ne.g. /Users/alice/work/app on macOS were restored under a Claude\nproject bucket th\n[…]\nssh/git@ variants + case + credentials +\n  trailing slashes/.git all map to one canonical form\n- findLocalProjectByRemote: 30s-cached scan of loaded sessions\n- Add unit tests for normalization helpers",
          "is_bot": false,
          "headline": "fix(cloud): remap project paths across machines via git remote (#154)…",
          "author_name": "Valerii Kovalskii",
          "author_login": "vakovalskii",
          "committed_at": "2026-04-21T21:15:36Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "6aaa0273d7db75f7601aeb2961b2653b05a0988c",
          "body": "* feat: add GitHub Copilot session discovery and detail loading\n\nScan VS Code workspaceStorage for Copilot Chat sessions (JSON and JSONL\nmutation format). Includes workspace-to-project mapping with disk cache,\ntargeted JSONL replay for request/response extraction, and integration\ninto loadSessions/f\n[…]\nTL expiry — catches new workspaces\n  created within TTL window\n- docs/ARCHITECTURE.md: update stale tool name \"copilot\" → \"copilot-chat\"\n\n---------\n\nCo-authored-by: Максим Рябов <m.riabov@itexpert.ru>",
          "is_bot": false,
          "headline": "feat: add GitHub Copilot Chat (VS Code) agent support (#171)",
          "author_name": "Max Ryabov",
          "author_login": "MaxRyabov",
          "committed_at": "2026-04-21T21:15:10Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "0db9c4c746e459697b7cebff2ca1043cb16a18b2",
          "body": null,
          "is_bot": false,
          "headline": "feat: add qwen terminal resume support (#203)",
          "author_name": "dorogao5",
          "author_login": "dorogao5",
          "committed_at": "2026-04-21T07:55:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7551330c565666e8ca76085dd9cdd92b25e65471",
          "body": null,
          "is_bot": false,
          "headline": "feat: add qwen frontend UI (#202)",
          "author_name": "dorogao5",
          "author_login": "dorogao5",
          "committed_at": "2026-04-21T07:55:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e9cd96b9c3dc9d084404007c6e3d99f78bbf0cef",
          "body": null,
          "is_bot": false,
          "headline": "feat: add qwen backend support (#201)",
          "author_name": "dorogao5",
          "author_login": "dorogao5",
          "committed_at": "2026-04-21T07:54:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "50d975786d5431a4230041f9bf5eab47e4f9be30",
          "body": "* initial version of structured messages support\n\n* truncation for structured messages\n\n---------\n\nCo-authored-by: Alexander Kolotov <alexander.kolotov@gmail.com>",
          "is_bot": false,
          "headline": "feat: render structured Codex session detail messages (#197)",
          "author_name": "Alexander Kolotov",
          "author_login": "akolotov",
          "committed_at": "2026-04-21T07:36:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c0be1dfb2b89ae1c28a7725517878b4c7b3f440c",
          "body": "- Add 'Open ›' button to each project row in Projects view; clicking it\n  filters Sessions view to show only that project's sessions\n- Show breadcrumb bar with project name and 'Clear filter' button that\n  returns to Projects view\n- Group renderProjects by git-root key (not name) to correctly handle\n[…]\nd\n  JSON.stringify in inline onclick handlers (XSS hardening)\n- Document that drill-down always uses git-root key independent of\n  groupingMode\n\nCo-authored-by: jackrescuer-gif <jackrescuer@gmail.com>",
          "is_bot": false,
          "headline": "feat: git project drill-down from Projects view (#200)",
          "author_name": "NovakPAai",
          "author_login": "NovakPAai",
          "committed_at": "2026-04-21T07:36:08Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "3ee4cc575633c7a15a2de261f4494f4cc2314d91",
          "body": "- Invalidate _analyticsHtmlCache on every loadSessions() call so the\n  Analytics tab always shows fresh data after navigating away and back\n- Add setInterval(loadSessions, 60000) so allSessions (used by Activity\n  heatmap and Analytics) stays current without manual refresh\n- Guard loadSessions with _loadSessionsInFlight flag to prevent\n  overlapping fetches when setInterval and the X-Loading progressive\n  auto-refresh fire simultaneously\n\nCo-authored-by: jackrescuer-gif <jackrescuer@gmail.com>",
          "is_bot": false,
          "headline": "fix: prevent stale analytics data and add session auto-refresh (#199)",
          "author_name": "NovakPAai",
          "author_login": "NovakPAai",
          "committed_at": "2026-04-21T07:35:12Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "29abcb7aca08acec310c970031c0b51b64d8e60b",
          "body": "Co-authored-by: Nathan Widjaja <nathan@Nathans-MacBook-Air.local>",
          "is_bot": false,
          "headline": "docs: sharpen README opener around core job (#190)",
          "author_name": "nathan-widjaja",
          "author_login": "nathan-widjaja",
          "committed_at": "2026-04-21T07:35:07Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e713f6dd34d6c6e21ef907b266601f9593f6851d",
          "body": null,
          "is_bot": false,
          "headline": "release: v7.4.0 — Cloud Sync redesign + self-update (#196)",
          "author_name": "Valerii Kovalskii",
          "author_login": "vakovalskii",
          "committed_at": "2026-04-17T12:53:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bab79d1eb5d4592f82961dd238da79c0b2d0fc28",
          "body": "…mit (#195)\n\n- Replaced two-column layout with single merged list\n- Three sections: Synced / Cloud Only / Local Only\n- Auto-setup encryption on page load (no passphrase modal)\n- Clear explanation text for new users\n- Counter: 3/10 sessions synced\n- Push/Pull buttons per session\n- Removed passphrase input, lock/unlock — all automatic via GitHub token\n\nCo-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: redesign Cloud Sync UI — single list, auto-setup, 10 session li…",
          "author_name": "Valerii Kovalskii",
          "author_login": "vakovalskii",
          "committed_at": "2026-04-17T12:52:46Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "9ce8e18d8ecb16b0c03d66053833d7648e982d48",
          "body": null,
          "is_bot": false,
          "headline": "release: v7.3.1 — GitHub token cloud encryption (#194)",
          "author_name": "Valerii Kovalskii",
          "author_login": "vakovalskii",
          "committed_at": "2026-04-17T12:36:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "219fd2a700181c1f8b7f67a615fdad519a4764a5",
          "body": "…193)\n\n- cloud.js: ensureEncryptionKey uses profile.token as passphrase\n- server.js: /api/cloud/setup auto-derives key from GitHub token\n- server.js: /api/cloud/locked auto-unlocks if GitHub connected\n- Removed manual passphrase prompts (setup, unlock, lock)\n- Same GitHub account on both PCs = same encryption key\n\nCo-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: use GitHub token for cloud encryption (no passphrase needed) (#…",
          "author_name": "Valerii Kovalskii",
          "author_login": "vakovalskii",
          "committed_at": "2026-04-17T12:35:35Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "4495c852fc92dfd0af667ebbdb4e237d646a1df4",
          "body": null,
          "is_bot": false,
          "headline": "release: v7.3.0 — self-update UI + changelog (#192)",
          "author_name": "Valerii Kovalskii",
          "author_login": "vakovalskii",
          "committed_at": "2026-04-17T12:22:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2c31b428631f187440d841bfb3e5fe3bd20855c3",
          "body": "- POST /api/update: runs npm i -g codbash-app@latest, restarts process\n- \"Update Now\" button in update banner (replaces copy-only)\n- Version badge clickable → triggers update\n- Auto-check for updates every 10 seconds\n- Banner shows when new version available with Update Now + Copy Command\n\nCo-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: one-click self-update from UI (#191)",
          "author_name": "Valerii Kovalskii",
          "author_login": "vakovalskii",
          "committed_at": "2026-04-17T12:22:23Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "7f7bdd65cb41ec69ec705fbfcb8960dfee0831b7",
          "body": null,
          "is_bot": false,
          "headline": "release: v7.2.3 (#189)",
          "author_name": "Valerii Kovalskii",
          "author_login": "vakovalskii",
          "committed_at": "2026-04-17T08:01:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c8c3bba9efeab358f802bfbb2a4d61dae8cd217d",
          "body": "Save which groups are collapsed before render(), restore after.\nPrevents groups from expanding on background refresh/poll.\n\nCo-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: preserve collapsed group state across re-renders (#188)",
          "author_name": "Valerii Kovalskii",
          "author_login": "vakovalskii",
          "committed_at": "2026-04-17T08:00:46Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "686108d3f7e2aed3e8f0f569845fb340dae5af1f",
          "body": null,
          "is_bot": false,
          "headline": "release: v7.2.2 (#187)",
          "author_name": "Valerii Kovalskii",
          "author_login": "vakovalskii",
          "committed_at": "2026-04-17T07:55:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d2abe542fd9af8f5da9a7893f04a9ad0a1601365",
          "body": "…s (#186)\n\nCo-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: Collapse All / Expand All buttons for Projects and grouped view…",
          "author_name": "Valerii Kovalskii",
          "author_login": "vakovalskii",
          "committed_at": "2026-04-17T07:54:37Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "20d4ea353f4b0a08eb3abed02263cfeac5fb9f7a",
          "body": null,
          "is_bot": false,
          "headline": "release: v7.2.1 (#185)",
          "author_name": "Valerii Kovalskii",
          "author_login": "vakovalskii",
          "committed_at": "2026-04-17T07:46:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f18b998359043857411d0d179e5a2fe40dc3a448",
          "body": "- Changelog: 11 new entries from v6.3.0 to v7.2.0\n- Save/restore content.scrollTop in render() so page doesn't jump\n  when pollActiveSessions or background refresh triggers re-render\n\nCo-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: update changelog (v6.3–v7.2) + preserve scroll on re-render (#184)",
          "author_name": "Valerii Kovalskii",
          "author_login": "vakovalskii",
          "committed_at": "2026-04-17T07:45:32Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "4b5e53f500a3d0ef48918d7dabc1be42e4d9c4c7",
          "body": "…lytics tabs (#183)\n\nMerged PRs:\n- #182 (@rrr3try): Show Claude Code recap (away_summary) as session title\n- #181 (@NovakPAai): Block bulk delete for filter-hidden sessions\n- #180 (@NovakPAai): Detect new sessions in existing dirs + local-agent-mode\n- #179 (@NovakPAai): Message sort toggle in session drawer + default setting\n- #86 (@NovakPAai): Sub-tabs in Cost Analytics (Overview/Breakdown/History)\n\nCo-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "release: v7.2.0 — recap titles, sort toggle, new sessions detect, ana…",
          "author_name": "Valerii Kovalskii",
          "author_login": "vakovalskii",
          "committed_at": "2026-04-17T07:36:26Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "b136a5bd06abba1953e3ce273133689b3f5357f6",
          "body": "* feat: cost attribution breakdown в Token Breakdown\n\nДобавлен стэкованный бар стоимости по типам токенов:\n- Output (красный) — обычно 80-95% стоимости (в 5× дороже input)\n- Input (синий) — прямые входные токены\n- Cache write / Cache read — запись и чтение кэша\n\nПропорции рассчитаны через Sonnet-bas\n[…]\noutputCostEst, cacheReadCostEst, cacheCreateCostEst,\ncacheSavings, cacheHitRate\n\n* feat: sub-tabs в Cost Analytics (Overview / Breakdown / History)\n\n---------\n\nCo-authored-by: Pawel <pwlnvk@gmail.com>",
          "is_bot": false,
          "headline": "feat: sub-tabs в Cost Analytics (Overview / Breakdown / History) (#86)",
          "author_name": "NovakPAai",
          "author_login": "NovakPAai",
          "committed_at": "2026-04-17T07:35:17Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c51efe73182c9669e07d5472915b856432747ace",
          "body": "Claude Code 2.1.108+ writes auto-recap entries to session JSONL:\n  {\"type\":\"system\",\"subtype\":\"away_summary\",\"content\":\"~40 words…\"}\n\nParse the last away_summary per session, surface it as session.recap,\nand use it in the card title when no explicit session_name is set.\nFalls back to first_message w\n[…]\ne recap in search haystack\n- Bump parsed disk cache filename to -v2.json to force a one-time\n  rebuild so pre-existing cache entries pick up the new field\n\nCo-authored-by: Vadim <retry@MacBookPro.lan>",
          "is_bot": false,
          "headline": "feat: show Claude Code recap (away_summary) as session title (#182)",
          "author_name": "Vadim Gusev",
          "author_login": "rrr3try",
          "committed_at": "2026-04-17T07:34:53Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "5640968bf3dd68a804a65dd2385e9694e3dafa8f",
          "body": "- Extract message rendering into renderDetailMessages() in detail.js\n- Add ↑/↓ sort toggle button in Conversation header\n- toggleMsgSort() flips order without re-fetching (uses cached _detailMessages)\n- Settings page: new \"Message Sort Order\" option (Oldest/Newest first)\n- Persisted in localStorage key codedash-msg-sort, default: asc\n\nCo-authored-by: Pawel <pwlnvk@gmail.com>",
          "is_bot": false,
          "headline": "feat: add message sort toggle in session drawer + default setting (#179)",
          "author_name": "NovakPAai",
          "author_login": "NovakPAai",
          "committed_at": "2026-04-17T07:34:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4caa7b6612ff7b01c6b14d3bfe4ed97907254b50",
          "body": "…mode sessions (#180)\n\nTwo session discovery bugs fixed:\n\n1. Cache invalidation: _sessionsNeedRescan() only checked PROJECTS_DIR top-level\n   mtime, so new sessions added to existing project subdirs were invisible until\n   history.jsonl changed or server restarted. Now also tracks each subdir mtime.\n[…]\ne-sessions/\n   were never scanned. Added detectLocalAgentModeClaudeDirs() (macOS only)\n   to find embedded .claude dirs and include them in EXTRA_CLAUDE_DIRS.\n\nCo-authored-by: Pawel <pwlnvk@gmail.com>",
          "is_bot": false,
          "headline": "fix: detect new sessions in existing project dirs + scan local-agent-…",
          "author_name": "NovakPAai",
          "author_login": "NovakPAai",
          "committed_at": "2026-04-17T07:34:44Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "37a367bae2bea1d70a9118c747143820cdcea1bf",
          "body": "…181)\n\nWhen a user selects sessions then applies a search/filter, some\nselected sessions become invisible. Previously, Delete would silently\nremove those hidden sessions too — a data loss risk.\n\nNow:\n- updateBulkBar() detects selected IDs not in filteredSessions\n- Shows warning: \"⚠ N hidden by filte\n[…]\nen selections are resolved\n- \"deselect hidden\" link removes only the invisible selections,\n  preserving the visible ones so the user can continue bulk actions\n\nCo-authored-by: Pawel <pwlnvk@gmail.com>",
          "is_bot": false,
          "headline": "fix: block bulk delete when selected sessions are hidden by filter (#…",
          "author_name": "NovakPAai",
          "author_login": "NovakPAai",
          "committed_at": "2026-04-17T07:34:39Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "a4d23ab6c3abfc67ed0c08703ee3422f2f12342b",
          "body": "Merged PRs:\n- #169 (@buriy): Running card titles white for visibility\n- #170 (@buriy): Makefile for easy service management\n- #177 (@tearfu1): Linux precise terminal focus via WINDOWID\n- #172 (@vbp1): WSL browser UI (launch, focus, IDE)\n- #150 (@dum3r): WSL agent homes discovery on Windows\n- #165 (@tpitsunov): Kilo CLI agent support (SQLite backend)\n\nCo-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "release: v7.1.0 — Kilo agent, Linux focus, WSL support, Makefile (#178)",
          "author_name": "Valerii Kovalskii",
          "author_login": "vakovalskii",
          "committed_at": "2026-04-16T09:39:31Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "5404825feec213fbe2658b52eb6a81035908d59f",
          "body": "- Scan/load/cost/replay/search/export for Kilo CLI sessions from ~/.local/share/kilo/kilo.db\n- Reuses OpenCode SQLite patterns (same schema: session, message, part tables)\n- Fix findSessionFile: OpenCode now verifies via SQL instead of eagerly returning for ses_* IDs\n- Fix buildSearchIndex: SQLite/C\n[…]\nip rule\n- Sidebar: Kilo filter + install entry (layers icon, emerald green badge)\n- Frontend: analytics label, heatmap color, calendar filter, copy-resume command\n- Docs: CLAUDE.md updated to 6 agents",
          "is_bot": false,
          "headline": "feat: add Kilo CLI agent support (SQLite backend + UI) (#165)",
          "author_name": "Timur Pitsunov",
          "author_login": "tpitsunov",
          "committed_at": "2026-04-16T09:36:42Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "4680bdcb3492917f3eeb055caf652b93c165970e",
          "body": "* feat: ingest WSL agent homes on Windows\n\n* feat: prepare narrow WSL ingestion support on latest main",
          "is_bot": false,
          "headline": "feat: discover WSL agent homes on Windows (#150)",
          "author_name": "dum3r",
          "author_login": "dum3r",
          "committed_at": "2026-04-16T09:36:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "72be42768f1b5ac0c8877fba9337a2b225b3949a",
          "body": "* feat(wsl): launch, focus and IDE open from Windows host\n\nAdds first-class support for running codedash inside WSL while using the\nWindows browser as UI:\n\n- terminals.js: detect WSL via /proc/version + WSL_DISTRO_NAME; expose\n  wt.exe / powershell.exe as launch targets. Open new terminals through\n \n[…]\nons (nvm, pyenv, etc.) and shell\ncustomizations. Switch WSL launch invocations from bash -l to bash -li\nso the trampoline script runs as both login and interactive, sourcing\nthe full user environment.",
          "is_bot": false,
          "headline": "feat(wsl): run codedash from WSL with Windows-host browser UI (#172)",
          "author_name": "vbp1",
          "author_login": "vbp1",
          "committed_at": "2026-04-16T09:36:13Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "719422358ad3fcfb3cbd936f96f00094f1f88b89",
          "body": "…nal support (#177)\n\n- Read WINDOWID from /proc/<pid>/environ for accurate window matching\n  instead of matching first window by terminal server PID\n- Add kitty remote control support for tab-level focus\n- Support arbitrary terminal binary path in settings (text input with\n  datalist suggestions ins\n[…]\nrminal via x-terminal-emulator symlink\n- Handle gnome-terminal (--) and wezterm (start --) special flags,\n  generic -e for all other terminals\n- Add wmctrl hex conversion and xdotool decimal fallbacks",
          "is_bot": false,
          "headline": "feat(linux): add precise terminal focus via WINDOWID and custom termi…",
          "author_name": "Maxim Vayda",
          "author_login": "tearfu1",
          "committed_at": "2026-04-16T09:36:08Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d89b199ac221ced22280b1abdd8bd8ff75afd545",
          "body": null,
          "is_bot": false,
          "headline": "feat: add Makefile for easy service management (#170)",
          "author_name": "Yuri Baburov",
          "author_login": "buriy",
          "committed_at": "2026-04-16T09:36:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e251c00da908c31e97ba5d1b6c5701f3de1b41c3",
          "body": null,
          "is_bot": false,
          "headline": "style: make running card titles white for better visibility (#169)",
          "author_name": "Yuri Baburov",
          "author_login": "buriy",
          "committed_at": "2026-04-16T09:35:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "201b3ca2817d7fa3bb41aefacb896163921c51dc",
          "body": "…s too similar to 'lodash')\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: npm package name codbash → codbash-app (npm rejected 'codbash' a…",
          "author_name": "v.kovalskii",
          "author_login": "vakovalskii",
          "committed_at": "2026-04-16T08:20:58Z",
          "body_truncated": false,
          "is_coding_agent": true
        }
      ],
      "releases_count": 43,
      "commits_last_year": 275,
      "latest_release_at": "2026-07-30T08:07:30Z",
      "latest_release_tag": "v7.16.0",
      "releases_from_tags": false,
      "days_since_last_push": 2,
      "active_weeks_last_year": 11,
      "days_since_latest_release": 2,
      "mean_days_between_releases": 1.1
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": false,
      "health_percentage": 42,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": false
    },
    "ecosystem": {
      "packages": [
        {
          "name": "codbash-app",
          "exists": true,
          "license": "MIT",
          "keywords": [
            "codbash",
            "codedash",
            "claude",
            "claude-code",
            "codex",
            "cursor",
            "opencode",
            "kiro",
            "ai-agents",
            "sessions",
            "dashboard",
            "terminal",
            "cli",
            "devtools"
          ],
          "ecosystem": "npm",
          "matches_repo": true,
          "registry_url": "https://www.npmjs.com/package/codbash-app",
          "is_deprecated": false,
          "latest_version": "7.15.0",
          "repository_url": "https://github.com/vakovalskii/codbash",
          "versions_count": 27,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": 1,
          "monthly_downloads": 2718,
          "first_published_at": "2026-04-16T08:21:47.295000Z",
          "latest_published_at": "2026-07-23T06:45:40.501000Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 9
        }
      ]
    },
    "popularity": {
      "forks": 49,
      "stars": 258,
      "watchers": 1,
      "fork_history": {
        "days": [
          {
            "date": "2026-04-03",
            "count": 2
          },
          {
            "date": "2026-04-04",
            "count": 2
          },
          {
            "date": "2026-04-05",
            "count": 4
          },
          {
            "date": "2026-04-06",
            "count": 7
          },
          {
            "date": "2026-04-07",
            "count": 1
          },
          {
            "date": "2026-04-08",
            "count": 6
          },
          {
            "date": "2026-04-09",
            "count": 3
          },
          {
            "date": "2026-04-10",
            "count": 4
          },
          {
            "date": "2026-04-16",
            "count": 1
          },
          {
            "date": "2026-04-17",
            "count": 2
          },
          {
            "date": "2026-04-20",
            "count": 1
          },
          {
            "date": "2026-04-30",
            "count": 1
          },
          {
            "date": "2026-05-01",
            "count": 1
          },
          {
            "date": "2026-05-14",
            "count": 1
          },
          {
            "date": "2026-05-23",
            "count": 1
          },
          {
            "date": "2026-05-25",
            "count": 1
          },
          {
            "date": "2026-05-26",
            "count": 1
          },
          {
            "date": "2026-05-30",
            "count": 1
          },
          {
            "date": "2026-06-01",
            "count": 1
          },
          {
            "date": "2026-06-08",
            "count": 1
          },
          {
            "date": "2026-06-18",
            "count": 1
          },
          {
            "date": "2026-06-24",
            "count": 1
          },
          {
            "date": "2026-07-20",
            "count": 1
          },
          {
            "date": "2026-07-22",
            "count": 1
          },
          {
            "date": "2026-07-24",
            "count": 2
          },
          {
            "date": "2026-08-01",
            "count": 1
          }
        ],
        "complete": true,
        "collected": 49,
        "total_forks": 49
      },
      "star_history": null,
      "open_issues_and_prs": 7
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [],
      "has_llms_txt": false,
      "has_dockerfile": false,
      "has_mcp_signal": false,
      "bootstrap_files": [
        "Makefile"
      ],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [],
      "toolchain_manifests": [],
      "largest_source_bytes": 242086,
      "source_files_sampled": 63,
      "oversized_source_files": 4,
      "agent_instruction_files": [
        "CLAUDE.md"
      ],
      "agent_instruction_max_bytes": 14921
    },
    "dependencies": {
      "manifests": [
        "desktop/package.json",
        "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": 7,
        "malicious_count": 0,
        "assessed_package": "npm:codbash-app@7.15.0",
        "unassessed_count": 0,
        "direct_affected_count": 0
      },
      "ecosystems": [
        "npm"
      ],
      "dependencies": [
        {
          "name": "electron-updater",
          "manifest": "desktop/package.json",
          "ecosystem": "npm",
          "version_constraint": "^6.8.9"
        }
      ],
      "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": 188,
        "open_issues": 7,
        "closed_ratio": 0.879,
        "closed_issues": 51,
        "closed_unmerged_prs": 35
      },
      "bus_factor": 1,
      "bot_contributors": 0,
      "top_contributors": [
        {
          "type": "User",
          "login": "vakovalskii",
          "commits": 206,
          "avatar_url": "https://avatars.githubusercontent.com/u/220532298?v=4"
        },
        {
          "type": "User",
          "login": "NovakPAai",
          "commits": 26,
          "avatar_url": "https://avatars.githubusercontent.com/u/271973710?v=4"
        },
        {
          "type": "User",
          "login": "akolotov",
          "commits": 10,
          "avatar_url": "https://avatars.githubusercontent.com/u/20793260?v=4"
        },
        {
          "type": "User",
          "login": "timseriakov",
          "commits": 4,
          "avatar_url": "https://avatars.githubusercontent.com/u/59409712?v=4"
        },
        {
          "type": "User",
          "login": "izzzzzi",
          "commits": 4,
          "avatar_url": "https://avatars.githubusercontent.com/u/17871694?v=4"
        },
        {
          "type": "User",
          "login": "jackrescuer-gif",
          "commits": 4,
          "avatar_url": "https://avatars.githubusercontent.com/u/262566065?v=4"
        },
        {
          "type": "User",
          "login": "dorogao5",
          "commits": 3,
          "avatar_url": "https://avatars.githubusercontent.com/u/145500950?v=4"
        },
        {
          "type": "User",
          "login": "buriy",
          "commits": 2,
          "avatar_url": "https://avatars.githubusercontent.com/u/21124?v=4"
        },
        {
          "type": "User",
          "login": "embogomolov",
          "commits": 2,
          "avatar_url": "https://avatars.githubusercontent.com/u/185256086?v=4"
        },
        {
          "type": "User",
          "login": "ABIvan-Tech",
          "commits": 1,
          "avatar_url": "https://avatars.githubusercontent.com/u/3127933?v=4"
        }
      ],
      "contributors_sampled": 23,
      "top_contributor_share": 0.749
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "ci.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": null,
            "reason": "internal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
          },
          {
            "name": "CI-Tests",
            "score": 9,
            "reason": "29 out of 30 merged PRs checked by a CI test -- score normalized to 9",
            "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": 1,
            "reason": "Found 5/30 approved changesets -- score normalized to 1",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 3,
            "reason": "project has 1 contributing companies or organizations -- score normalized to 3",
            "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 9 issue activity found in the last 90 days -- score normalized to 10",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
          },
          {
            "name": "Packaging",
            "score": 10,
            "reason": "packaging workflow detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
          },
          {
            "name": "Pinned-Dependencies",
            "score": 0,
            "reason": "dependency not pinned by hash detected -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
          },
          {
            "name": "SAST",
            "score": 0,
            "reason": "SAST tool is not run on all commits -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
          },
          {
            "name": "Security-Policy",
            "score": 0,
            "reason": "security policy file not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
          },
          {
            "name": "Signed-Releases",
            "score": 0,
            "reason": "Project has not signed or included provenance with any releases.",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
          },
          {
            "name": "Token-Permissions",
            "score": 0,
            "reason": "detected GitHub workflow tokens with excessive permissions",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
          },
          {
            "name": "Vulnerabilities",
            "score": 10,
            "reason": "0 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "8b9bf7d08b70fc0816f327503f187a62179da70a",
        "ran_at": "2026-08-01T20:00:09Z",
        "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-30T13:05:36Z",
      "oldest_open_prs": [],
      "last_merged_pr_at": "2026-07-30T13:05:06Z",
      "ci_last_conclusion": "SUCCESS",
      "oldest_open_issues": [
        {
          "number": 151,
          "created_at": "2026-04-09T09:10:56Z",
          "last_comment_at": "2026-07-30T06:12:02Z",
          "last_comment_author": "vakovalskii"
        },
        {
          "number": 158,
          "created_at": "2026-04-09T17:13:09Z",
          "last_comment_at": "2026-07-30T06:12:04Z",
          "last_comment_author": "vakovalskii"
        },
        {
          "number": 206,
          "created_at": "2026-05-01T14:37:49Z",
          "last_comment_at": "2026-07-30T06:11:23Z",
          "last_comment_author": "vakovalskii"
        },
        {
          "number": 228,
          "created_at": "2026-06-05T15:24:57Z",
          "last_comment_at": "2026-07-30T06:11:22Z",
          "last_comment_author": "vakovalskii"
        },
        {
          "number": 229,
          "created_at": "2026-06-05T15:43:06Z",
          "last_comment_at": "2026-07-30T07:28:07Z",
          "last_comment_author": "vakovalskii"
        },
        {
          "number": 270,
          "created_at": "2026-07-23T12:06:09Z",
          "last_comment_at": "2026-07-31T08:11:37Z",
          "last_comment_author": "Slach"
        },
        {
          "number": 277,
          "created_at": "2026-07-29T23:18:49Z",
          "last_comment_at": "2026-07-30T13:07:25Z",
          "last_comment_author": "dedyyshka"
        }
      ]
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/vakovalskii/codbash",
    "host": "github.com",
    "name": "codbash",
    "owner": "vakovalskii"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "good",
      "name": "Overall health",
      "note": "The weighted overall 64 is calibrated to 73 on the published index scale (record calibration 2026-08-02).",
      "notes": [
        {
          "code": "overall_calibration",
          "params": {
            "raw": 64,
            "calibrated": 73,
            "calibration": "2026-08-02"
          }
        }
      ],
      "value": 73,
      "inputs": {
        "security": 56,
        "vitality": 79,
        "community": 53,
        "governance": 60,
        "calibration": "2026-08-02",
        "engineering": 70,
        "ai_readiness": 63,
        "weighted_overall_raw": 64
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "good",
        "name": "Vitality",
        "value": 79,
        "weight": 0.21,
        "metrics": [
          {
            "key": "development_activity",
            "band": "good",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 72,
            "inputs": {
              "commits_last_year": 275,
              "human_commit_share": 1,
              "days_since_last_push": 2,
              "active_weeks_last_year": 11
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 2 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 2
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "11/52 weeks with commits",
                "points": 7.6,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 11
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "275 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 275
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "30 commit(s) and 9 issue activity found in the last 90 days -- score normalized to 10",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "release_discipline",
            "band": "excellent",
            "name": "Release discipline",
            "note": null,
            "notes": [],
            "value": 90,
            "inputs": {
              "releases_count": 43,
              "latest_release_tag": "v7.16.0",
              "releases_from_tags": false,
              "days_since_latest_release": 2,
              "mean_days_between_releases": 1.1
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "43 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 43
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 2 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 2
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~1.1 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 1.1
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "openssf_scorecard_signed_releases",
                "name": "OpenSSF Scorecard: Signed-Releases",
                "detail": "Project has not signed or included provenance with any releases.",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "abandonment",
            "band": "exceptional",
            "name": "Abandonment",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "cap": null,
              "state": "unverified",
              "guards": [],
              "signals": [],
              "red_flag": false,
              "multiplier_pct": 100,
              "declared_reason": null,
              "unverified_reason": "repository_too_young",
              "unanswered_open_prs": null,
              "unanswered_open_issues": null,
              "days_since_last_merged_pr": null,
              "days_since_last_human_commit": null,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "maintenance record not established from the collected data",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_unverified",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "moderate",
        "name": "Community & Adoption",
        "value": 53,
        "weight": 0.17,
        "metrics": [
          {
            "key": "popularity",
            "band": "moderate",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 53,
            "inputs": {
              "forks": 49,
              "stars": 258,
              "watchers": 1,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "258 stars",
                "points": 39.1,
                "status": "partial",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 258
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "49 forks",
                "points": 14,
                "status": "partial",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 49
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "1 watchers",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "moderate",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 50,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "readme_badges": null,
              "has_contributing": false,
              "has_issue_template": false,
              "has_code_of_conduct": false,
              "readme_badge_services": [],
              "has_pull_request_template": false
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 22.5,
                "status": "met",
                "details": [],
                "max_points": 22.5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "recognized license (MIT)",
                "points": 22.5,
                "status": "met",
                "details": [
                  {
                    "code": "license_standard",
                    "params": {}
                  },
                  {
                    "code": "license_spdx",
                    "params": {
                      "spdx": "MIT"
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributing_guide",
                "name": "CONTRIBUTING guide",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 18
              },
              {
                "key": "code_of_conduct",
                "name": "Code of conduct",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 13.5
              },
              {
                "key": "issue_template",
                "name": "Issue template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.2
              },
              {
                "key": "pr_template",
                "name": "PR template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.3
              }
            ]
          },
          {
            "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": 57,
            "inputs": {
              "packages": [
                "codbash-app"
              ],
              "dependents": null,
              "ecosystems": "npm",
              "total_downloads": null,
              "monthly_downloads": 2718
            },
            "components": [
              {
                "key": "monthly_downloads",
                "name": "Monthly downloads",
                "detail": "2,718 downloads/month across npm",
                "points": 45.8,
                "status": "partial",
                "details": [
                  {
                    "code": "downloads_monthly",
                    "params": {
                      "count": 2718,
                      "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": 60,
        "weight": 0.23,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "at_risk",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 31,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 23,
              "top_contributor_share": 0.749
            },
            "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 75% of commits",
                "points": 5.6,
                "status": "partial",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 75
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "23 contributors",
                "points": 13.5,
                "status": "met",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 23
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 1 contributing companies or organizations -- score normalized to 3",
                "points": 3,
                "status": "partial",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "good",
            "name": "Issue & PR responsiveness",
            "note": "Excluded from scoring (no data or not applicable): Newcomer PR acceptance. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "newcomer_pr_acceptance"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 73,
            "inputs": {
              "merged_prs": 188,
              "open_issues": 7,
              "closed_issues": 51,
              "prs_merged_7d": null,
              "prs_decided_7d": null,
              "prs_merged_30d": null,
              "prs_decided_30d": null,
              "issue_closed_ratio": 0.879,
              "closed_unmerged_prs": 35,
              "first_time_authors_30d": null,
              "first_time_prs_merged_30d": null,
              "first_time_prs_decided_30d": null
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "88% of issues closed",
                "points": 36.9,
                "status": "partial",
                "details": [
                  {
                    "code": "issues_closed_share",
                    "params": {
                      "share": 88
                    }
                  }
                ],
                "max_points": 42
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "188/223 decided PRs merged",
                "points": 25.3,
                "status": "partial",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 188,
                      "decided": 223
                    }
                  }
                ],
                "max_points": 30
              },
              {
                "key": "newcomer_pr_acceptance",
                "name": "Newcomer PR acceptance",
                "detail": "no first-time contributor's PR decided in 30d",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_newcomer_prs",
                    "params": {
                      "days": 30
                    }
                  }
                ],
                "max_points": 13
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 5/30 approved changesets -- score normalized to 1",
                "points": 1.5,
                "status": "partial",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "moderate",
            "name": "Ownership & stewardship",
            "note": "Excluded from scoring (no data or not applicable): Verified domain. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "verified_domain"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 51,
            "inputs": {
              "followers": 245,
              "owner_type": "User",
              "is_verified": null,
              "owner_login": "vakovalskii",
              "public_repos": 39,
              "account_age_days": 384
            },
            "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": "245 followers of vakovalskii",
                "points": 17.2,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 245,
                      "login": "vakovalskii"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "39 public repos, account ~1 yr old",
                "points": 13.8,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 39
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 1
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "exceptional",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "codbash-app"
              ],
              "ecosystems": "npm",
              "any_deprecated": false,
              "min_days_since_publish": 9
            },
            "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 9 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 9
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "27 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 27
                    }
                  }
                ],
                "max_points": 20
              },
              {
                "key": "not_deprecated",
                "name": "Not deprecated",
                "detail": "active, not deprecated or yanked",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "package_not_deprecated",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          }
        ],
        "description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?"
      },
      {
        "key": "engineering",
        "band": "good",
        "name": "Engineering Quality",
        "value": 70,
        "weight": 0.19,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "good",
            "name": "Engineering practices",
            "note": null,
            "notes": [],
            "value": 66,
            "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": "2 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 2
                    }
                  }
                ],
                "max_points": 24
              },
              {
                "key": "tests_present",
                "name": "Tests present",
                "detail": null,
                "points": 24,
                "status": "met",
                "details": [],
                "max_points": 24
              },
              {
                "key": "linter_config",
                "name": "Linter config",
                "detail": 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": "29 out of 30 merged PRs checked by a CI test -- score normalized to 9",
                "points": 18,
                "status": "partial",
                "details": [],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "good",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 75,
            "inputs": {
              "topics": [],
              "has_wiki": true,
              "homepage": null,
              "has_readme": true,
              "has_docs_dir": true,
              "has_description": true
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 30,
                "status": "met",
                "details": [],
                "max_points": 30
              },
              {
                "key": "documentation_directory",
                "name": "Documentation directory",
                "detail": null,
                "points": 25,
                "status": "met",
                "details": [],
                "max_points": 25
              },
              {
                "key": "documentation_homepage_site",
                "name": "Documentation / homepage site",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "repository_description",
                "name": "Repository description",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "topics",
                "name": "Topics",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              },
              {
                "key": "wiki",
                "name": "Wiki",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          }
        ],
        "description": "Are baseline engineering and documentation practices in place?"
      },
      {
        "key": "security",
        "band": "moderate",
        "name": "Security",
        "value": 56,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "weak",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): Branch-Protection. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "branch_protection"
                  ]
                }
              },
              {
                "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": "internal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 7.5
              },
              {
                "key": "ci_tests",
                "name": "CI-Tests",
                "detail": "29 out of 30 merged PRs checked by a CI test -- score normalized to 9",
                "points": 2.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 5/30 approved changesets -- score normalized to 1",
                "points": 0.8,
                "status": "partial",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 1 contributing companies or organizations -- score normalized to 3",
                "points": 0.8,
                "status": "partial",
                "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 9 issue activity found in the last 90 days -- score normalized to 10",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "packaging",
                "name": "Packaging",
                "detail": "packaging workflow detected",
                "points": 5,
                "status": "met",
                "details": [],
                "max_points": 5
              },
              {
                "key": "pinned_dependencies",
                "name": "Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "sast",
                "name": "SAST",
                "detail": "SAST tool is not run on all commits -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "security_policy",
                "name": "Security-Policy",
                "detail": "security policy file not detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "signed_releases",
                "name": "Signed-Releases",
                "detail": "Project has not signed or included provenance with any releases.",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "token_permissions",
                "name": "Token-Permissions",
                "detail": "detected GitHub workflow tokens with excessive permissions",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "vulnerabilities",
                "name": "Vulnerabilities",
                "detail": "0 existing vulnerabilities detected",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              }
            ]
          },
          {
            "key": "dependency_advisories",
            "band": "exceptional",
            "name": "Dependency advisories",
            "note": "Excluded from scoring (no data or not applicable): No advisories left outstanding. Remaining weights renormalized. Matched the npm:codbash-app@7.15.0 runtime dependency closure — what installing the published package pulls in — 7 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:codbash-app@7.15.0",
                  "assessed": 7
                }
              },
              {
                "code": "advisories_reachability",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "source": "osv",
              "advisories": 0,
              "affected_packages": 0,
              "assessed_packages": 7,
              "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": "exceptional",
            "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": 7,
              "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": "exceptional",
            "name": "High-Risk Jurisdiction Exposure",
            "note": "Only high-confidence self-published location evidence affects this multiplier. Ambiguous matches are review-only; country evidence is not proof of nationality, citizenship, legal registration, malicious intent, or sanctions status. 1 match(es) from contributors below the commit-weight threshold (fewer than 50 commits and under 10% of sampled commits) are recorded for review and do not affect the score.",
            "notes": [
              {
                "code": "jurisdiction_evidence_limits",
                "params": {}
              },
              {
                "code": "jurisdiction_below_threshold",
                "params": {
                  "count": 1
                }
              }
            ],
            "value": 100,
            "inputs": {
              "meaning": "self-published location evidence; not nationality or citizenship",
              "red_flag": false,
              "exposures": [],
              "policy_countries": [
                "Russia",
                "Iran",
                "North Korea"
              ],
              "commit_weight_rule": {
                "min_commits": 50,
                "min_commit_share": 0.1
              },
              "review_only_matches": 0,
              "below_threshold_exposures": [
                {
                  "role": "top_contributor",
                  "count": 1,
                  "country": "Russia"
                }
              ],
              "assessed_self_published_locations": 4
            },
            "components": [
              {
                "key": "policy_exposure_multiplier",
                "name": "Policy exposure multiplier",
                "detail": "no confirmed policy-scope location match; 1 match(es) below the commit-weight threshold (<50 commits and <10% of commits), review-only",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "jurisdiction_no_match",
                    "params": {}
                  },
                  {
                    "code": "jurisdiction_below_threshold",
                    "params": {
                      "count": 1,
                      "share": 10,
                      "commits": 50
                    }
                  }
                ],
                "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": "moderate",
        "name": "AI Readiness",
        "value": 63,
        "weight": 0.04,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "excellent",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 85,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": 1,
              "agent_instruction_files": [
                "CLAUDE.md"
              ],
              "agent_instruction_max_bytes": 14921
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": "CLAUDE.md",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "CLAUDE.md"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "machine_readable_docs_llms_txt",
                "name": "Machine-readable docs (llms.txt)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "legible_commit_history",
                "name": "Legible commit history",
                "detail": "100 of 100 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 100,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "moderate",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 50,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [],
              "has_dockerfile": false,
              "typed_language": false,
              "bootstrap_files": [
                "Makefile"
              ],
              "has_devcontainer": false,
              "has_linter_config": false,
              "typecheck_configs": [],
              "agent_commit_share": 0.46,
              "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": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 11
              },
              {
                "key": "reproducible_environment",
                "name": "Reproducible environment",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "46 of the last 100 commits agent-authored or agent-credited",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "agent_authored_commits",
                    "params": {
                      "count": 46,
                      "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": "moderate",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 52,
            "inputs": {
              "primary_language": "JavaScript",
              "largest_source_bytes": 242086,
              "source_files_sampled": 63,
              "oversized_source_files": 4
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "JavaScript without a type-check config",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_typecheck_config_language",
                    "params": {
                      "language": "JavaScript"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "4/63 source files over 60KB",
                "points": 51.5,
                "status": "partial",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 63,
                      "oversized": 4
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          }
        ],
        "description": "How well is the repo equipped to be developed and maintained with AI coding agents? Carries a deliberately small weight: agent tooling is a real maintenance signal, but its absence must never gate the top of the scale (calibration saturates at raw 91, so 100/100 remains reachable with AI Readiness at zero)."
      }
    ],
    "metrics_version": "2.1.0"
  },
  "warnings": [
    "Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token",
    "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository"
  ],
  "report_type": "repository",
  "generated_at": "2026-08-01T20:00:34.774936Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/v/vakovalskii/codbash.svg",
  "full_name": "vakovalskii/codbash",
  "license_state": "standard",
  "license_spdx": "MIT"
}

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

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

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