公开记录
软件健康报告模式 0.26.0 · 指标 1.13.0 · 2026-07-22 04:41 UTC

Kewton / CommandMate

Issue-driven AI development IDE for Claude Code and Codex CLI. Run multiple issues in parallel and keep work moving from desktop or mobile.

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

Kewton/CommandMate 的健康指数为 100 分中的 69 分,处于「中等」区间。 其得分最高的类别是Vitality(92/100),最低的是Security(45/100)。 最近一次更新在今天。 近期的大部分工作由 1 位贡献者完成。

69
总分 / 100
中等

软件健康指数

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

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

评分画像

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

所有权

Kewton个人账户
2 关注者43 个公开仓库始于 2015年3月

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

软件包生态系统

按类别列示的指标

活力

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

92优秀 · 占总体的 22%
评分方式
36/36推送新近度 — 最近一次推送于 0 天前
22.2/36提交节奏 — 52 周中有 32 周有提交
18/18提交量 — 最近一年 1,751 次提交
10/10OpenSSF Scorecard:Maintained — 30 commit(s) and 30 issue activity found in the last 90 days -- score normalized to 10
所用输入
commits_last_year1,751
human_commit_share1
days_since_last_push0
active_weeks_last_year32

发布纪律

100优秀
评分方式
27/27有发布版本 — 已发布 88 个发布版本
36/36发布时效 — 最近一次发布版本于 2 天前
27/27发布节奏 — 约每 0.4 天发布一次
0/10OpenSSF Scorecard:Signed-Releases — 无数据
所用输入
releases_count88
latest_release_tagv0.11.4
releases_from_tags
days_since_latest_release2
mean_days_between_releases0.4
已排除计分(无数据或不适用):OpenSSF Scorecard:Signed-Releases。 其余权重已重新归一化。

社区与采用

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

59中等 · 占总体的 18%
评分方式
25.4/60星标 — 38 个星标
4/25复刻 — 4 个复刻
0/15关注者 — 0 位关注者
所用输入
forks4
stars38
watchers0
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonbelow_threshold

社区健康

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

可持续性与治理

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

55中等 · 占总体的 24%
评分方式
9/54巴士系数 — 1 位贡献者贡献了半数提交
0/22.5提交分布 — 头号贡献者编写了 100% 的提交
1.4/13.5贡献者广度 — 1 位贡献者
0/10OpenSSF Scorecard:Contributors — project has 0 contributing companies or organizations -- score normalized to 0
所用输入
bus_factor1
contributors_sampled1
top_contributor_share1
评分方式
45/46.8议题解决 — 96% 的议题已关闭
37.3/38.3PR 接受 — 已裁定的 PR 中 799/819 已合并
0/15OpenSSF Scorecard:Code-Review — Found 0/23 approved changesets -- score normalized to 0
所用输入
merged_prs799
open_issues24
closed_issues617
issue_closed_ratio0.963
closed_unmerged_prs20
评分方式
10/30所有权背书 — 个人(用户)账户
0/20已验证域名 — 不适用于个人账户
3.4/25所有者影响力 — Kewton 有 2 位关注者
24/25既往记录 — 43 个公开仓库,账户约 11 年
所用输入
followers2
owner_typeUser
is_verified
owner_loginKewton
public_repos43
account_age_days4,154
已排除计分(无数据或不适用):已验证域名。 其余权重已重新归一化。
评分方式
25/25已发布且可解析 — npm 上有 1 个软件包
35/35发布时效 — 最近一次发布于 2 天前
20/20版本历史 — 84 个已发布版本
20/20未被弃用 — 活跃,未被弃用或撤回
所用输入
packagescommandmate
ecosystemsnpm
any_deprecated
min_days_since_publish2

工程质量

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

90优秀 · 占总体的 20%

工程实践

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

文档

100优秀
评分方式
30/30README
25/25文档目录
15/15文档 / 主页站点 — https://www.npmjs.com/package/commandmate
10/10仓库描述
10/10主题标签 — 14 个主题标签
10/10Wiki
所用输入
topicsclaude-code, developer-tools, git-worktree, terminal, tmux, commandmate, ai-coding, codex-cli, mobile-development, session-manager, autonomous-coding, claude-mobile, vibe-coding, web-ui
has_wiki
homepagehttps://www.npmjs.com/package/commandmate
has_readme
has_docs_dir
has_description

安全

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

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

安全态势

45存在风险
评分方式
7.5/7.5Binary-Artifacts — no binaries found in the repo
0/7.5Branch-Protection — 无数据
2.5/2.5CI-Tests — 23 out of 23 merged PRs checked by a CI test -- score normalized to 10
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
0/7.5Code-Review — Found 0/23 approved changesets -- score normalized to 0
0/2.5Contributors — project has 0 contributing companies or organizations -- score normalized to 0
10/10Dangerous-Workflow — no dangerous workflow patterns detected
0/7.5Dependency-Update-Tool — no update tool detected
0/5Fuzzing — project is not fuzzed
2.5/2.5许可证 — license file detected
7.5/7.5Maintained — 30 commit(s) and 30 issue activity found in the last 90 days -- score normalized to 10
5/5Packaging — packaging workflow detected
1/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 2
0/5SAST — SAST tool is not run on all commits -- score normalized to 0
4.5/5Security-Policy — security policy file detected
0/7.5Signed-Releases — 无数据
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
0/7.5Vulnerabilities — 57 existing vulnerabilities detected
所用输入
sourceopenssf_scorecard
checks_evaluated16
scorecard_versionv5.5.0
checks_inconclusive2
scorecard_aggregate4.5
已排除计分(无数据或不适用):branch_protection, signed_releases。 其余权重已重新归一化。

AI 就绪度

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

73良好 · 占总体的 0%
评分方式
45/45代理指令 — AGENTS.md, CLAUDE.md
0/15机器可读文档(llms.txt)
40/40可读的提交历史 — 100 次人类提交中有 99 次说明了意图(结构化标题或解释性正文)
所用输入
has_llms_txt
legible_history_share0.99
agent_instruction_filesAGENTS.md, CLAUDE.md
agent_instruction_max_bytes17,804
评分方式
0/18一条命令的引导启动
22/22自动化测试
11/11Lint / 格式化配置 — .eslintrc.json
11/11静态类型检查 — tsconfig.json
10/10可复现环境 — lockfile
10/10已体现的代理实践 — 最近 100 次提交中有 70 次由代理编写或署名代理
0/8自动化维护 — 未观察到自动依赖更新
2/10OpenSSF Scorecard:Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 2
所用输入
has_nix
has_tests
lockfilespackage-lock.json
has_dockerfile
typed_language
bootstrap_files
has_devcontainer
has_linter_config
typecheck_configstsconfig.json
agent_commit_share0.7
toolchain_manifests
dependency_bot_commit_share0
评分方式
45/45可类型检查的代码 — TypeScript(静态类型)
54.8/55可控的文件大小 — 采样的 1,422 个源文件中有 6 个超过 60KB
所用输入
primary_languageTypeScript
largest_source_bytes127,698
source_files_sampled1,422
oversized_source_files6

机器可读接口

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

关键数据

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

数据采集警告

  • GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository
  • deps.dev does not index npm:commandmate@0.11.4; advisories assessed against the repository dependency graph instead

更多细节

Star 与 Fork 历史 38 ★ / 4 ⇿
38Star
4Fork
35发布

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

01020304038432026-022026-042026-05
主版本 0次版本 3修订 32
OpenSSF Scorecard 4.5 / 10
4.5综合

来自开源项目 OpenSSF Scorecard 的独立、工具无关的安全评估。每项检查奖励的是安全实践本身,而非特定供应商的工具。Scorecard 无法判定的检查项标记为 不适用,并从安全评分中剔除(绝不按零分计)。Scorecard v5.5.0 · 2026-07-22 04:41 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
10CI-Tests23 out of 23 merged PRs checked by a CI test -- score normalized to 10
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
0Code-ReviewFound 0/23 approved changesets -- score normalized to 0
0Contributorsproject has 0 contributing companies or organizations -- score normalized to 0
10Dangerous-Workflowno dangerous workflow patterns detected
0Dependency-Update-Toolno update tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
10Maintained30 commit(s) and 30 issue activity found in the last 90 days -- score normalized to 10
10Packagingpackaging workflow detected
2Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 2
0SASTSAST tool is not run on all commits -- score normalized to 0
9Security-Policysecurity policy file detected
不适用Signed-Releasesno releases found
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
0Vulnerabilities57 existing vulnerabilities detected
直接依赖 50
注册表软件包版本约束清单文件
npm@dnd-kit/core^6.3.1package.json
npm@dnd-kit/sortable^10.0.0package.json
npm@dnd-kit/utilities^3.2.2package.json
npm@marp-team/marp-core^4.3.0package.json
npm@radix-ui/react-checkbox^1.3.7package.json
npm@radix-ui/react-dropdown-menu^2.1.20package.json
npm@radix-ui/react-radio-group^1.4.3package.json
npm@radix-ui/react-select^2.3.3package.json
npm@radix-ui/react-switch^1.3.3package.json
npm@radix-ui/react-tabs^1.1.17package.json
npm@radix-ui/react-tooltip^1.2.12package.json
npm@tanstack/react-virtual^3.13.26package.json
npmansi-to-html^0.7.2package.json
npmbetter-sqlite3^12.4.1package.json
npmclass-variance-authority^0.7.1package.json
npmclsx^2.1.1package.json
npmcmdk^1.1.1package.json
npmcommander^14.0.2package.json
npmcroner^10.0.1package.json
npmdate-fns^4.1.0package.json
npmdotenv^17.2.3package.json
npmgeist^1.7.2package.json
npmgithub-slugger^2.0.0package.json
npmgray-matter^4.0.3package.json
npmhttp-proxy^1.18.1package.json
npmisomorphic-dompurify^2.35.0package.json
npmjsdom^28.1.0package.json
npmlucide-react^0.554.0package.json
npmmermaid^11.12.2package.json
npmnext^15.5.20package.json
npmnext-intl^4.8.2package.json
npmnext-themes^0.4.6package.json
npmpostcss^8.5.6package.json
npmreact^19.2.7package.json
npmreact-dom^19.2.7package.json
npmreact-markdown^10.1.0package.json
npmreact-qr-code^2.0.18package.json
npmrehype-highlight^7.0.2package.json
npmrehype-raw^7.0.0package.json
npmrehype-sanitize^6.0.0package.json
npmrehype-slug^6.0.0package.json
npmremark-gfm^4.0.1package.json
npmsafe-regex2^5.0.0package.json
npmtailwind-merge^3.6.0package.json
npmuuid^13.0.0package.json
npmweb-push^3.6.7package.json
npmws^8.18.3package.json
npmxterm^5.3.0package.json
npmxterm-addon-fit^0.8.0package.json
npmxterm-addon-web-links^0.9.0package.json
全部依赖 未采集

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

原始 JSON 报告 机器可读
{
  "data": {
    "repo": {
      "topics": [
        "claude-code",
        "developer-tools",
        "git-worktree",
        "terminal",
        "tmux",
        "commandmate",
        "ai-coding",
        "codex-cli",
        "mobile-development",
        "session-manager",
        "autonomous-coding",
        "claude-mobile",
        "vibe-coding",
        "web-ui"
      ],
      "is_fork": false,
      "size_kb": 127864,
      "has_wiki": true,
      "homepage": "https://www.npmjs.com/package/commandmate",
      "languages": {
        "CSS": 39205,
        "HTML": 17189,
        "Shell": 58883,
        "JavaScript": 32793,
        "TypeScript": 10647301
      },
      "pushed_at": "2026-07-22T00:44:08Z",
      "created_at": "2025-11-16T14:18:16Z",
      "owner_type": "User",
      "updated_at": "2026-07-20T00:33:58Z",
      "description": "Issue-driven AI development IDE for Claude Code and Codex CLI. Run multiple issues in parallel and keep work moving from desktop or mobile.",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "MIT",
      "default_branch": "main",
      "license_spdx_raw": "MIT",
      "primary_language": "TypeScript",
      "significant_languages": [
        "TypeScript"
      ]
    },
    "owner": {
      "blog": null,
      "name": null,
      "type": "User",
      "login": "Kewton",
      "company": null,
      "location": null,
      "followers": 2,
      "avatar_url": "https://avatars.githubusercontent.com/u/11370858?v=4",
      "created_at": "2015-03-08T01:59:38Z",
      "is_verified": null,
      "public_repos": 43,
      "account_age_days": 4154
    },
    "license": {
      "state": "standard",
      "spdx_id": "MIT",
      "raw_spdx": "MIT",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v0.11.4",
          "kind": "patch",
          "published_at": "2026-07-20T00:38:18Z"
        },
        {
          "tag": "v0.11.3",
          "kind": "patch",
          "published_at": "2026-07-19T15:26:19Z"
        },
        {
          "tag": "v0.11.2",
          "kind": "patch",
          "published_at": "2026-07-19T04:24:19Z"
        },
        {
          "tag": "v0.11.1",
          "kind": "patch",
          "published_at": "2026-07-18T16:31:06Z"
        },
        {
          "tag": "v0.11.0",
          "kind": "minor",
          "published_at": "2026-07-18T06:39:16Z"
        },
        {
          "tag": "v0.10.4",
          "kind": "patch",
          "published_at": "2026-07-18T01:47:03Z"
        },
        {
          "tag": "v0.10.3",
          "kind": "patch",
          "published_at": "2026-07-17T07:47:18Z"
        },
        {
          "tag": "v0.10.2",
          "kind": "patch",
          "published_at": "2026-07-17T05:56:51Z"
        },
        {
          "tag": "v0.10.1",
          "kind": "patch",
          "published_at": "2026-07-17T01:01:12Z"
        },
        {
          "tag": "v0.10.0",
          "kind": "minor",
          "published_at": "2026-07-16T14:13:05Z"
        },
        {
          "tag": "v0.9.1",
          "kind": "patch",
          "published_at": "2026-07-15T08:50:59Z"
        },
        {
          "tag": "v0.9.0",
          "kind": "minor",
          "published_at": "2026-07-15T01:46:19Z"
        },
        {
          "tag": "v0.8.4",
          "kind": "patch",
          "published_at": "2026-07-10T09:28:12Z"
        },
        {
          "tag": "v0.8.3",
          "kind": "patch",
          "published_at": "2026-07-08T16:08:13Z"
        },
        {
          "tag": "v0.8.2",
          "kind": "patch",
          "published_at": "2026-07-06T05:05:26Z"
        },
        {
          "tag": "v0.8.1",
          "kind": "patch",
          "published_at": "2026-07-05T10:09:42Z"
        },
        {
          "tag": "v0.8.0",
          "kind": "minor",
          "published_at": "2026-07-03T10:44:41Z"
        },
        {
          "tag": "v0.7.5",
          "kind": "patch",
          "published_at": "2026-06-30T07:26:14Z"
        },
        {
          "tag": "v0.7.4",
          "kind": "patch",
          "published_at": "2026-06-25T15:09:43Z"
        },
        {
          "tag": "v0.7.3",
          "kind": "patch",
          "published_at": "2026-06-23T00:42:01Z"
        },
        {
          "tag": "v0.7.2",
          "kind": "patch",
          "published_at": "2026-06-21T14:47:41Z"
        },
        {
          "tag": "v0.7.1",
          "kind": "patch",
          "published_at": "2026-06-20T14:25:06Z"
        },
        {
          "tag": "v0.7.0",
          "kind": "minor",
          "published_at": "2026-06-17T06:44:35Z"
        },
        {
          "tag": "v0.6.4",
          "kind": "patch",
          "published_at": "2026-06-10T04:47:43Z"
        },
        {
          "tag": "v0.6.3",
          "kind": "patch",
          "published_at": "2026-06-05T03:34:43Z"
        },
        {
          "tag": "v0.6.2",
          "kind": "patch",
          "published_at": "2026-06-04T07:48:56Z"
        },
        {
          "tag": "v0.6.1",
          "kind": "patch",
          "published_at": "2026-06-03T00:54:10Z"
        },
        {
          "tag": "v0.6.0",
          "kind": "minor",
          "published_at": "2026-06-02T00:01:08Z"
        },
        {
          "tag": "v0.5.8",
          "kind": "patch",
          "published_at": "2026-05-27T15:24:56Z"
        },
        {
          "tag": "v0.5.7",
          "kind": "patch",
          "published_at": "2026-05-11T02:00:05Z"
        },
        {
          "tag": "v0.5.6",
          "kind": "patch",
          "published_at": "2026-04-27T14:57:49Z"
        },
        {
          "tag": "v0.5.5",
          "kind": "patch",
          "published_at": "2026-04-16T15:29:46Z"
        },
        {
          "tag": "v0.5.4",
          "kind": "patch",
          "published_at": "2026-04-12T14:26:57Z"
        },
        {
          "tag": "v0.5.3",
          "kind": "patch",
          "published_at": "2026-04-05T13:26:49Z"
        },
        {
          "tag": "v0.5.2",
          "kind": "patch",
          "published_at": "2026-04-04T07:30:56Z"
        },
        {
          "tag": "v0.5.1",
          "kind": "patch",
          "published_at": "2026-04-02T06:50:21Z"
        },
        {
          "tag": "v0.5.0",
          "kind": "minor",
          "published_at": "2026-04-01T15:53:27Z"
        },
        {
          "tag": "v0.4.16",
          "kind": "patch",
          "published_at": "2026-03-31T22:57:37Z"
        },
        {
          "tag": "v0.4.15",
          "kind": "patch",
          "published_at": "2026-03-31T01:41:46Z"
        },
        {
          "tag": "v0.4.14",
          "kind": "patch",
          "published_at": "2026-03-29T01:36:17Z"
        },
        {
          "tag": "v0.4.13",
          "kind": "patch",
          "published_at": "2026-03-27T16:27:14Z"
        },
        {
          "tag": "v0.4.12",
          "kind": "patch",
          "published_at": "2026-03-24T07:02:12Z"
        },
        {
          "tag": "v0.4.11",
          "kind": "patch",
          "published_at": "2026-03-21T03:14:39Z"
        },
        {
          "tag": "v0.4.10",
          "kind": "patch",
          "published_at": "2026-03-18T16:17:51Z"
        },
        {
          "tag": "v0.4.9",
          "kind": "patch",
          "published_at": "2026-03-16T13:36:51Z"
        },
        {
          "tag": "v0.4.8",
          "kind": "patch",
          "published_at": "2026-03-14T02:08:56Z"
        },
        {
          "tag": "v0.4.7",
          "kind": "patch",
          "published_at": "2026-03-13T04:17:54Z"
        },
        {
          "tag": "v0.4.6",
          "kind": "patch",
          "published_at": "2026-03-11T09:37:08Z"
        },
        {
          "tag": "v0.4.5",
          "kind": "patch",
          "published_at": "2026-03-10T14:40:21Z"
        },
        {
          "tag": "v0.4.4",
          "kind": "patch",
          "published_at": "2026-03-09T22:09:35Z"
        },
        {
          "tag": "v0.4.3",
          "kind": "patch",
          "published_at": "2026-03-08T14:46:45Z"
        },
        {
          "tag": "v0.4.2",
          "kind": "patch",
          "published_at": "2026-03-08T14:14:28Z"
        },
        {
          "tag": "v0.4.1",
          "kind": "patch",
          "published_at": "2026-03-06T02:12:59Z"
        },
        {
          "tag": "v0.4.0",
          "kind": "minor",
          "published_at": "2026-03-04T23:42:16Z"
        },
        {
          "tag": "v0.3.6",
          "kind": "patch",
          "published_at": "2026-03-03T03:38:27Z"
        },
        {
          "tag": "v0.3.5",
          "kind": "patch",
          "published_at": "2026-03-01T12:55:24Z"
        },
        {
          "tag": "v0.3.4",
          "kind": "patch",
          "published_at": "2026-02-28T02:52:56Z"
        },
        {
          "tag": "v0.3.3",
          "kind": "patch",
          "published_at": "2026-02-26T12:25:46Z"
        },
        {
          "tag": "v0.3.2",
          "kind": "patch",
          "published_at": "2026-02-24T13:42:57Z"
        },
        {
          "tag": "v0.3.1",
          "kind": "patch",
          "published_at": "2026-02-23T03:07:57Z"
        },
        {
          "tag": "v0.3.0",
          "kind": "minor",
          "published_at": "2026-02-22T15:05:05Z"
        },
        {
          "tag": "v0.2.13",
          "kind": "patch",
          "published_at": "2026-02-20T13:42:05Z"
        },
        {
          "tag": "v0.2.12",
          "kind": "patch",
          "published_at": "2026-02-20T04:25:39Z"
        },
        {
          "tag": "v0.2.11",
          "kind": "patch",
          "published_at": "2026-02-19T03:51:17Z"
        },
        {
          "tag": "v0.2.10",
          "kind": "patch",
          "published_at": "2026-02-17T05:01:25Z"
        },
        {
          "tag": "v0.2.9",
          "kind": "patch",
          "published_at": "2026-02-15T05:10:24Z"
        },
        {
          "tag": "v0.2.8",
          "kind": "patch",
          "published_at": "2026-02-14T14:55:20Z"
        },
        {
          "tag": "v0.2.7",
          "kind": "patch",
          "published_at": "2026-02-14T11:00:30Z"
        },
        {
          "tag": "v0.2.6",
          "kind": "patch",
          "published_at": "2026-02-14T02:00:27Z"
        },
        {
          "tag": "v0.2.5",
          "kind": "patch",
          "published_at": "2026-02-14T00:16:21Z"
        },
        {
          "tag": "v0.2.4",
          "kind": "patch",
          "published_at": "2026-02-13T14:10:30Z"
        },
        {
          "tag": "v0.2.3",
          "kind": "patch",
          "published_at": "2026-02-12T15:23:30Z"
        },
        {
          "tag": "v0.2.2",
          "kind": "patch",
          "published_at": "2026-02-10T08:54:12Z"
        },
        {
          "tag": "v0.2.1",
          "kind": "patch",
          "published_at": "2026-02-09T23:00:18Z"
        },
        {
          "tag": "v0.2.0",
          "kind": "minor",
          "published_at": "2026-02-08T08:24:27Z"
        },
        {
          "tag": "v0.1.12",
          "kind": "patch",
          "published_at": "2026-02-04T07:00:11Z"
        },
        {
          "tag": "v0.1.11",
          "kind": "patch",
          "published_at": "2026-02-03T16:39:26Z"
        },
        {
          "tag": "v0.1.10",
          "kind": "patch",
          "published_at": "2026-02-02T06:20:18Z"
        },
        {
          "tag": "v0.1.9",
          "kind": "patch",
          "published_at": "2026-02-02T02:29:30Z"
        },
        {
          "tag": "v0.1.8",
          "kind": "patch",
          "published_at": "2026-02-02T01:57:40Z"
        },
        {
          "tag": "v0.1.7",
          "kind": "patch",
          "published_at": "2026-02-01T23:38:17Z"
        },
        {
          "tag": "v0.1.6",
          "kind": "patch",
          "published_at": "2026-02-01T15:35:34Z"
        },
        {
          "tag": "v0.1.5",
          "kind": "patch",
          "published_at": "2026-01-31T17:19:00Z"
        },
        {
          "tag": "v0.1.4",
          "kind": "patch",
          "published_at": "2026-01-31T17:08:51Z"
        },
        {
          "tag": "v0.1.3",
          "kind": "patch",
          "published_at": "2026-01-31T16:57:36Z"
        },
        {
          "tag": "v0.1.2",
          "kind": "patch",
          "published_at": "2026-01-31T16:12:04Z"
        },
        {
          "tag": "v0.1.1",
          "kind": "patch",
          "published_at": "2026-01-31T15:56:04Z"
        },
        {
          "tag": "v0.1.0",
          "kind": "minor",
          "published_at": "2026-01-30T01:23:40Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "ad1579473c98b0b9268c0be2f68b10726f9fa1ec",
          "body": "Refs #1410",
          "is_bot": false,
          "headline": "release: v0.11.4 (#1412)",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-07-20T00:33:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0364d0530274f6ef3f8fc3ed5d2c43fcf4780b69",
          "body": "* feat(files): スマホ版でファイルをダウンロード可能に(attachment配信+FileViewer DL導線)(#1024) (#1025)\n\nスマホ版のファイルビューア(FileViewer, Issue #438 でモバイル専用化)から\n任意種別のファイルをダウンロードできるようにする。\n\n- B(サーバ): files/[...path] GET に download 分岐を追加し、生バイトを\n  Content-Type: application/octet-stream + Content-Disposition: attachment で返却。\n  filenam\n[…]\n鍵)は非ログ\n- プロンプト検出/セッション完了時に response-checker からファンアウト(検出ロジックは不変・fire-and-forget)\n- 購読登録/解除/種別設定/VAPID公開鍵の認証必須API(グローバルmiddleware配下)\n- Service Worker に push/notificationclick ハンドラ(該当worktreeへdeep link・…",
          "is_bot": false,
          "headline": "release: v0.11.3 (#1409)",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-07-19T15:15:01Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "5bc7f3353535d7ba773e13801bff1f3fddc548b3",
          "body": "* feat(files): スマホ版でファイルをダウンロード可能に(attachment配信+FileViewer DL導線)(#1024) (#1025)\n\nスマホ版のファイルビューア(FileViewer, Issue #438 でモバイル専用化)から\n任意種別のファイルをダウンロードできるようにする。\n\n- B(サーバ): files/[...path] GET に download 分岐を追加し、生バイトを\n  Content-Type: application/octet-stream + Content-Disposition: attachment で返却。\n  filenam\n[…]\n鍵)は非ログ\n- プロンプト検出/セッション完了時に response-checker からファンアウト(検出ロジックは不変・fire-and-forget)\n- 購読登録/解除/種別設定/VAPID公開鍵の認証必須API(グローバルmiddleware配下)\n- Service Worker に push/notificationclick ハンドラ(該当worktreeへdeep link・…",
          "is_bot": false,
          "headline": "release: v0.11.2 (#1406)",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-07-19T04:23:50Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e74c4a0e085538c86d1ada3b8885b7e9e6810343",
          "body": "* feat(files): スマホ版でファイルをダウンロード可能に(attachment配信+FileViewer DL導線)(#1024) (#1025)\n\nスマホ版のファイルビューア(FileViewer, Issue #438 でモバイル専用化)から\n任意種別のファイルをダウンロードできるようにする。\n\n- B(サーバ): files/[...path] GET に download 分岐を追加し、生バイトを\n  Content-Type: application/octet-stream + Content-Disposition: attachment で返却。\n  filenam\n[…]\n鍵)は非ログ\n- プロンプト検出/セッション完了時に response-checker からファンアウト(検出ロジックは不変・fire-and-forget)\n- 購読登録/解除/種別設定/VAPID公開鍵の認証必須API(グローバルmiddleware配下)\n- Service Worker に push/notificationclick ハンドラ(該当worktreeへdeep link・…",
          "is_bot": false,
          "headline": "release: v0.11.1 (#1403)",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-07-18T16:29:47Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "b8331343387ffa8e2da4663b3234dc9ca553d41d",
          "body": "npx 起動サーバの GUI アップデート対応(#1394 fix + #1395 feat)をまとめた minor リリース。詳細は PR #1398 / CHANGELOG 参照。",
          "is_bot": false,
          "headline": "release: v0.11.0 (#1398)",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-07-18T06:38:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5f7d6c993219c56e16b2ece11fe3049c96e83115",
          "body": "* feat(files): スマホ版でファイルをダウンロード可能に(attachment配信+FileViewer DL導線)(#1024) (#1025)\n\nスマホ版のファイルビューア(FileViewer, Issue #438 でモバイル専用化)から\n任意種別のファイルをダウンロードできるようにする。\n\n- B(サーバ): files/[...path] GET に download 分岐を追加し、生バイトを\n  Content-Type: application/octet-stream + Content-Disposition: attachment で返却。\n  filenam\n[…]\n鍵)は非ログ\n- プロンプト検出/セッション完了時に response-checker からファンアウト(検出ロジックは不変・fire-and-forget)\n- 購読登録/解除/種別設定/VAPID公開鍵の認証必須API(グローバルmiddleware配下)\n- Service Worker に push/notificationclick ハンドラ(該当worktreeへdeep link・…",
          "is_bot": false,
          "headline": "release: v0.10.4 (#1393)",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-07-18T01:45:42Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "8fa53e2a9c7ece9711518c56a1b82f17332f2df3",
          "body": "* feat(files): スマホ版でファイルをダウンロード可能に(attachment配信+FileViewer DL導線)(#1024) (#1025)\n\nスマホ版のファイルビューア(FileViewer, Issue #438 でモバイル専用化)から\n任意種別のファイルをダウンロードできるようにする。\n\n- B(サーバ): files/[...path] GET に download 分岐を追加し、生バイトを\n  Content-Type: application/octet-stream + Content-Disposition: attachment で返却。\n  filenam\n[…]\n鍵)は非ログ\n- プロンプト検出/セッション完了時に response-checker からファンアウト(検出ロジックは不変・fire-and-forget)\n- 購読登録/解除/種別設定/VAPID公開鍵の認証必須API(グローバルmiddleware配下)\n- Service Worker に push/notificationclick ハンドラ(該当worktreeへdeep link・…",
          "is_bot": false,
          "headline": "release: v0.10.3 (#1336)",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-07-17T07:46:40Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "6b33fa354256d9c0b150f3d224ccca870493c6de",
          "body": "* feat(files): スマホ版でファイルをダウンロード可能に(attachment配信+FileViewer DL導線)(#1024) (#1025)\n\nスマホ版のファイルビューア(FileViewer, Issue #438 でモバイル専用化)から\n任意種別のファイルをダウンロードできるようにする。\n\n- B(サーバ): files/[...path] GET に download 分岐を追加し、生バイトを\n  Content-Type: application/octet-stream + Content-Disposition: attachment で返却。\n  filenam\n[…]\n鍵)は非ログ\n- プロンプト検出/セッション完了時に response-checker からファンアウト(検出ロジックは不変・fire-and-forget)\n- 購読登録/解除/種別設定/VAPID公開鍵の認証必須API(グローバルmiddleware配下)\n- Service Worker に push/notificationclick ハンドラ(該当worktreeへdeep link・…",
          "is_bot": false,
          "headline": "release: v0.10.2 (#1333)",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-07-17T05:55:57Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "7edcb567ec1a85c4201604eb05fa00f30f20f9fa",
          "body": "* feat(files): スマホ版でファイルをダウンロード可能に(attachment配信+FileViewer DL導線)(#1024) (#1025)\n\nスマホ版のファイルビューア(FileViewer, Issue #438 でモバイル専用化)から\n任意種別のファイルをダウンロードできるようにする。\n\n- B(サーバ): files/[...path] GET に download 分岐を追加し、生バイトを\n  Content-Type: application/octet-stream + Content-Disposition: attachment で返却。\n  filenam\n[…]\n鍵)は非ログ\n- プロンプト検出/セッション完了時に response-checker からファンアウト(検出ロジックは不変・fire-and-forget)\n- 購読登録/解除/種別設定/VAPID公開鍵の認証必須API(グローバルmiddleware配下)\n- Service Worker に push/notificationclick ハンドラ(該当worktreeへdeep link・…",
          "is_bot": false,
          "headline": "release: v0.10.1 (#1325)",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-07-17T00:58:53Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e568c655c9922d16ffec847bc0a74adacce1961f",
          "body": "* feat(files): スマホ版でファイルをダウンロード可能に(attachment配信+FileViewer DL導線)(#1024) (#1025)\n\nスマホ版のファイルビューア(FileViewer, Issue #438 でモバイル専用化)から\n任意種別のファイルをダウンロードできるようにする。\n\n- B(サーバ): files/[...path] GET に download 分岐を追加し、生バイトを\n  Content-Type: application/octet-stream + Content-Disposition: attachment で返却。\n  filenam\n[…]\n鍵)は非ログ\n- プロンプト検出/セッション完了時に response-checker からファンアウト(検出ロジックは不変・fire-and-forget)\n- 購読登録/解除/種別設定/VAPID公開鍵の認証必須API(グローバルmiddleware配下)\n- Service Worker に push/notificationclick ハンドラ(該当worktreeへdeep link・…",
          "is_bot": false,
          "headline": "release: v0.10.0 (#1314)",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-07-16T14:10:32Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "ebbbed5f05171868d50d59e3dbad579db7fabc6e",
          "body": "chore: release v0.9.1",
          "is_bot": false,
          "headline": "release: v0.9.1 (#1202)",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-07-15T08:50:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5847d674eeea3642c476681a2f756bd2c2dc95d1",
          "body": null,
          "is_bot": false,
          "headline": "chore: release v0.9.1",
          "author_name": "kewton",
          "author_login": "Kewton",
          "committed_at": "2026-07-15T08:39:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1ecf027ec6812d8c250ad65c25b006019034542a",
          "body": "… E2EのCI組込み #1180 / ちらつき解消 #1184) (#1191)\n\n* feat(files): スマホ版でファイルをダウンロード可能に(attachment配信+FileViewer DL導線)(#1024) (#1025)\n\nスマホ版のファイルビューア(FileViewer, Issue #438 でモバイル専用化)から\n任意種別のファイルをダウンロードできるようにする。\n\n- B(サーバ): files/[...path] GET に download 分岐を追加し、生バイトを\n  Content-Type: application/octet-stream + Con\n[…]\nns テーブル(migration v41)と CRUD モジュールを追加\n- VAPID/web-push 送信層: 種別フィルタ・デバウンス・410自動削除、機密(endpoint/秘密鍵)は非ログ\n- プロンプト検出/セッション完了時に response-checker からファンアウト(検出ロジックは不変・fire-and-forget)\n- 購読登録/解除/種別設定/VAPID公開鍵の…",
          "is_bot": false,
          "headline": "release: develop の受け入れ済み変更を main へ反映(Next15/React19/Tailwind4 #1129 /…",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-07-15T07:50:11Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "ec7d4c90e31aaaa77b1835f80133e244490c63ef",
          "body": "chore: release v0.9.0",
          "is_bot": false,
          "headline": "release: v0.9.0 (#1176)",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-07-15T01:45:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c186222b9c2a133321aeccfa6d875cbe41794a34",
          "body": "The filter chips render unconditionally before the fetch resolves — only\nthe list below them is gated on isLoading — so waiting on their existence\npassed at count 0 and the count assertions raced fetch -> json -> setState\n-> re-render. React schedules that re-render through the Scheduler\n(MessageCha\n[…]\n 10ms reproduces the exact CI\nfailure (\"expected 'In Review0' to match /2/\") against the old form and\npasses 7/7 against this one.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "test(review): wait on data, not markup, in filter count badge test",
          "author_name": "kewton",
          "author_login": "Kewton",
          "committed_at": "2026-07-15T01:37:06Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "2fca15b8ffee75944c25895e992ef9eb4ccf8c1e",
          "body": null,
          "is_bot": false,
          "headline": "chore: release v0.9.0",
          "author_name": "kewton",
          "author_login": "Kewton",
          "committed_at": "2026-07-15T01:00:37Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "86583cce27ad804588e1a80f1a4d07ba822dff8a",
          "body": "…ターミナル・tmux安定化 / 履歴CASCADE削除修正 #1153) (#1175)\n\n* feat(files): スマホ版でファイルをダウンロード可能に(attachment配信+FileViewer DL導線)(#1024) (#1025)\n\nスマホ版のファイルビューア(FileViewer, Issue #438 でモバイル専用化)から\n任意種別のファイルをダウンロードできるようにする。\n\n- B(サーバ): files/[...path] GET に download 分岐を追加し、生バイトを\n  Content-Type: application/octet-stream +\n[…]\nsh_subscriptions テーブル(migration v41)と CRUD モジュールを追加\n- VAPID/web-push 送信層: 種別フィルタ・デバウンス・410自動削除、機密(endpoint/秘密鍵)は非ログ\n- プロンプト検出/セッション完了時に response-checker からファンアウト(検出ロジックは不変・fire-and-forget)\n- 購読登録/解除/…",
          "is_bot": false,
          "headline": "release: develop の受け入れ済み変更を main へ反映(UI/UXモダナイゼーション #1110 Phase1-5 / …",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-07-15T00:49:16Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "eb9a89c05a9aeaf8420f430f435b946d240bb366",
          "body": "…61 / integration復旧 #1102 / bug #1104) (#1106)\n\n* feat(files): スマホ版でファイルをダウンロード可能に(attachment配信+FileViewer DL導線)(#1024) (#1025)\n\nスマホ版のファイルビューア(FileViewer, Issue #438 でモバイル専用化)から\n任意種別のファイルをダウンロードできるようにする。\n\n- B(サーバ): files/[...path] GET に download 分岐を追加し、生バイトを\n  Content-Type: application/octet-stream \n[…]\nplicate name テストを un-skip(#1104 で修正済み)\n\n---------\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: develop の受け入れ済み変更を main へ反映(UIモダン化2段階 #1041-1082 / 生UI移行 #10…",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-07-13T14:10:50Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "2bfbfab15ce5ca3864a829b029a4f5f7f10dacd4",
          "body": "release: v0.8.4",
          "is_bot": false,
          "headline": "Merge pull request #1039 from Kewton/release/v0.8.4",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-07-10T09:27:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ffeed4455bae4096c135ccb82181a6f8f087aef7",
          "body": null,
          "is_bot": false,
          "headline": "chore: release v0.8.4",
          "author_name": "kewton",
          "author_login": "Kewton",
          "committed_at": "2026-07-10T09:20:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6b9ba440cd9528698b5fceb8ad3a4e85b12e7bcd",
          "body": "… 詳細・編集 / #1036 コピー) (#1038)\n\n* feat(files): スマホ版でファイルをダウンロード可能に(attachment配信+FileViewer DL導線)(#1024) (#1025)\n\nスマホ版のファイルビューア(FileViewer, Issue #438 でモバイル専用化)から\n任意種別のファイルをダウンロードできるようにする。\n\n- B(サーバ): files/[...path] GET に download 分岐を追加し、生バイトを\n  Content-Type: application/octet-stream + Content-Disposit\n[…]\nト3件追加\n- migration/DB/API 変更なし(UIのみ)\n\nCloses #1036\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: develop の受け入れ済み変更を main へ反映(ブランチ単位ToDo強化: #1032 3状態化 / #1034…",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-07-10T09:00:43Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "707cbc1f93b96c6a305a21e6512013c4e9d9b67b",
          "body": "release: v0.8.3",
          "is_bot": false,
          "headline": "Merge pull request #1031 from Kewton/release/v0.8.3",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-07-08T16:07:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d42bd0b258fff98e5caf467ddd1646742eaf8e5f",
          "body": null,
          "is_bot": false,
          "headline": "chore: release v0.8.3",
          "author_name": "kewton",
          "author_login": "Kewton",
          "committed_at": "2026-07-08T15:59:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4f8aec2e931bb0a131b7b024261d078929381dbc",
          "body": "* feat(files): スマホ版でファイルをダウンロード可能に(attachment配信+FileViewer DL導線)(#1024) (#1025)\n\nスマホ版のファイルビューア(FileViewer, Issue #438 でモバイル専用化)から\n任意種別のファイルをダウンロードできるようにする。\n\n- B(サーバ): files/[...path] GET に download 分岐を追加し、生バイトを\n  Content-Type: application/octet-stream + Content-Disposition: attachment で返却。\n  filenam\n[…]\n (2引数アサート vs 3引数呼び出し)で本修正と無関係(CI の test:unit 対象外)\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: develop の受け入れ済み変更を main へ反映(#1028 Timer送信のHistory記録) (#1030)",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-07-08T15:38:26Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "62c591a0b237273fbcb5f15fc4afa71dade7f396",
          "body": "release: v0.8.2",
          "is_bot": false,
          "headline": "Merge pull request #1027 from Kewton/release/v0.8.2",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-07-06T05:04:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4d64818583ae84afa4f49a441cb2793a98055625",
          "body": null,
          "is_bot": false,
          "headline": "chore: release v0.8.2",
          "author_name": "kewton",
          "author_login": "Kewton",
          "committed_at": "2026-07-06T04:57:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "02bb34f3183076597418b249ac0a826b7b7fae56",
          "body": "… (#1025) (#1026)\n\nスマホ版のファイルビューア(FileViewer, Issue #438 でモバイル専用化)から\n任意種別のファイルをダウンロードできるようにする。\n\n- B(サーバ): files/[...path] GET に download 分岐を追加し、生バイトを\n  Content-Type: application/octet-stream + Content-Disposition: attachment で返却。\n  filename は src/lib/http の content-disposition ヘルパーで RFC 準拠にサニタイズ\n  (A\n[…]\nスト新規29本(download API のヘッダ/パス検証/filename、content-disposition\n  ヘルパー、FileViewer ボタン)\n- C(独立ページのPDF分岐/DLリンク)は範囲外(モバイル動線が独立ページを使わないため)\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(files): スマホ版でファイルをダウンロード可能に(attachment配信+FileViewer DL導線)(#1024)…",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-07-06T04:46:14Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "81b344ee0e3374727000a264fda06b8f05f4c102",
          "body": "release: v0.8.1(ブランチ単位ToDo #1015 / Codex選択ウィンドウ #1017 / Historyヘッダー固定 #1019)",
          "is_bot": false,
          "headline": "Merge pull request #1023 from Kewton/release/v0.8.1",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-07-05T10:08:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2f54421a0d7e98219e621d570a7dd6e009001e8f",
          "body": "- feat(worktree): ブランチ単位のToDoリスト (#1015)\n- fix(terminal): Codexのページャ/選択状態で選択ウィンドウ表示 (#1017)\n- fix(history): Message Historyヘッダー固定・スクロール限定 (#1019)\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(release): v0.8.1",
          "author_name": "kewton",
          "author_login": "Kewton",
          "committed_at": "2026-07-05T08:20:06Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "f18a102f8ccb3c4ede4d4e10b79924634abef0f1",
          "body": "History パネルが「ペイン全体が単一スクロールコンテナ + sticky ヘッダー」構造の\nため、メッセージがヘッダーの背後を通過して違和感があった。固定ヘッダー行 +\n独立スクロール領域のレイアウトに変更する。\n\n- HistoryPane: 最外層を非スクロール(flex-col overflow-hidden)化し、ヘッダー/検索\n  バーを flex-shrink-0(sticky/top-0/top-12/z-10 撤去)、メッセージを新設の内側\n  スクロール div(flex-1 min-h-0 overflow-y-auto overflow-x-hidden)に配置。\n\n[…]\nダー/検索バーはスクロール領域の外、メッセージは中)\n- HistoryPane は PC(TerminalSplitPaneContent)/モバイル(WorktreeDetailMobile)\n  共用のため両方のレンダーテストで検証(リグレッションなし)\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(history): Message Historyヘッダーを固定しスクロールをヘッダー下に限定 (#1019) (#1021)",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-07-05T05:36:29Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "3b2f3bd580cc5237a5b0baff2f772f2c057ac3e8",
          "body": "History パネルが「ペイン全体が単一スクロールコンテナ + sticky ヘッダー」構造の\nため、メッセージがヘッダーの背後を通過して違和感があった。固定ヘッダー行 +\n独立スクロール領域のレイアウトに変更する。\n\n- HistoryPane: 最外層を非スクロール(flex-col overflow-hidden)化し、ヘッダー/検索\n  バーを flex-shrink-0(sticky/top-0/top-12/z-10 撤去)、メッセージを新設の内側\n  スクロール div(flex-1 min-h-0 overflow-y-auto overflow-x-hidden)に配置。\n\n[…]\nダー/検索バーはスクロール領域の外、メッセージは中)\n- HistoryPane は PC(TerminalSplitPaneContent)/モバイル(WorktreeDetailMobile)\n  共用のため両方のレンダーテストで検証(リグレッションなし)\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(history): Message Historyヘッダーを固定しスクロールをヘッダー下に限定 (#1019) (#1020)",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-07-05T05:15:38Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "42033ab71a6541e4180859993b16cb08f0e58bc8",
          "body": "…(#1018)\n\nCodex CLI がページャ/edit-previous モードのとき、選択ウィンドウ(NavigationButtons)が\n表示されず、読み取り専用ターミナルから操作・脱出できない問題を修正。複数インスタンス\n(codex-2/codex-3)がページャに滞留した際に顕在化していた。\n\n- A(検出): CODEX_PAGER_FOOTER_PATTERN 追加、status-detector にステータスバー非依存の\n  ページャ検出分岐(reason=CODEX_PAGER, SELECTION_LIST_REASONS入り)。/model 等の\n  \"press\n[…]\n/\n  tmux-navigation / NavigationButtons / TerminalEscapeHatch / TerminalSplitPaneContent\n- B(上部インスタンスタブ↔分割セレクタ連動)は本PR対象外(別Issue推奨)\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(terminal): Codexのページャ/選択状態で選択ウィンドウ(NavigationButtons)を表示 (#1017) …",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-07-05T01:20:19Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "56f47fe37fd47fee44710d38a42ea3e4e97aa8dc",
          "body": "ブランチ(worktree)単位で管理できるチェックボックス式ToDoリストを追加。\nPC版はアクティビティバー、スマホ版はTools(NotesAndLogsPane)から利用でき、\nPC/スマホで共通の TodoPane コンポーネントを共有する。\n\n- DB: worktree_todos テーブル(migration v37, worktree_id FK, ON DELETE CASCADE)\n  + worktree-todo-db(CRUD)。CURRENT_SCHEMA_VERSION 36→37\n- API: /api/worktrees/[id]/todos(GET/POS\n[…]\nb ラベル(parity テスト付き)\n- 既存のリポジトリ単位ToDo(repository_todos)とは独立して併存\n- テスト新規6本(DB / API / TodoPane / migration v37 / i18n parity / 既存追随)\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(worktree): ブランチ単位のToDoリスト(PC=アクティビティバー / スマホ=Tools)(#1015) (#1016)",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-07-04T08:16:52Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "90c4b77a6b054110aa903c046a83adc3704d7f3d",
          "body": null,
          "is_bot": false,
          "headline": "chore: merge release v0.8.0 to develop",
          "author_name": "kewton",
          "author_login": "Kewton",
          "committed_at": "2026-07-03T10:44:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0cb49a9de296166260865df074f5f6c6ba3bf679",
          "body": "release: v0.8.0",
          "is_bot": false,
          "headline": "Merge pull request #1013 from Kewton/release/v0.8.0",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-07-03T10:44:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3d5f2d4bcb4388d5bb1d6caa60e8aec14c3b8e31",
          "body": null,
          "is_bot": false,
          "headline": "chore: release v0.8.0",
          "author_name": "kewton",
          "author_login": "Kewton",
          "committed_at": "2026-07-03T10:37:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e000567f8b4f850452ef38a64faf3e1c08a5d75d",
          "body": "…rkdown TOC 他) (#1012)\n\n* feat(files): toggleable file-tree metadata columns + hover tooltip (#969) (#972)\n\nPreviously each file row always rendered size and a relative birthtime\ninline, crowding the file name. This makes the inline metadata columns\n(size / created / modified) individually toggleabl\n[…]\nスの fireResize(500) -> fireResize(400)(新しきい値480未満)\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: develop の受け入れ済み変更を main へ反映(Antigravity対応 / CLIマルチセッション / Ma…",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-07-03T10:03:20Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "ced6c934bfd4971f389a4fbab942d2bb86a151d2",
          "body": null,
          "is_bot": false,
          "headline": "Merge remote-tracking branch 'origin/main' into develop",
          "author_name": "kewton",
          "author_login": "Kewton",
          "committed_at": "2026-07-03T09:52:07Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c0d80d60577359b4cc0f21dbe7f6a4c7d4b23ce1",
          "body": "worktree詳細ページのインラインプレビューペインは既定の複数パネルレイアウトで\n約551px幅となり、従来のTOC表示しきい値640pxでは目次サイドバーが常に自動非表示に\nなっていた。しきい値を480pxへ下げ、サイドバーをw-56→w-48に縮小して本文の可読幅を\n確保することで、全画面化しなくても詳細ページのインラインプレビューで目次を表示できる\nようにする。\n\n- TOC_SIDEBAR_MIN_WIDTH_PX: 640 -> 480\n- TOCサイドバー幅: w-56(224px) -> w-48(192px)\n- テスト: 狭幅ケースの fireResize(500) -> fireResize(400)(新しきい値480未満)\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(ui): インラインMarkdownプレビューのTOC表示しきい値を480pxに調整 (#1009) (#1011)",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-07-02T08:04:57Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "f6b22f637eb282e627919db62135892bcd2c3a0d",
          "body": "MarkdownPreview に rehype-slug を rehype-sanitize 後段で適用して見出しへ\nプレーンな id を付与し、MarkdownToc に root prop を追加してプレビュー\nペイン内のスクロールコンテナを基準にスクロールスパイできるようにした。\nMarkdownEditor のプレビューペインに ResizeObserver でコンテナ幅を判定\nする TOC サイドバー+トグルを追加し、表示状態は #1007 と同じ\nlocalStorage キー(commandmate:md-toc-visible)で共有する。\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(ui): worktree詳細ページのインラインMarkdownプレビューにサイドTOCを追加 (#1009) (#1010)",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-07-02T07:48:27Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "a1750ff116b641042c6dd2f5aa450ec58b394b56",
          "body": "独立ファイルビューワーページ (src/app/worktrees/[id]/files/[...path]/page.tsx)\nのマークダウン表示にサイド TOC(目次)を PC 幅限定で追加する。\n\n- rehype-slug@^6 / github-slugger@^2 を導入し、見出しに id を付与\n- extractToc 純粋関数 (src/lib/markdown-toc.ts): ATX 見出しを抽出し\n  github-slugger で rehype-slug と完全一致する id を生成\n  (フェンス/インデントコード除外・ATX 制約・重複 suffix 対応、se\n[…]\n追加: extractToc(rehype-slug 実パイプラインとの id 一致検証含む)/\n  MarkdownToc(jsdom + IntersectionObserver/scrollIntoView モック)/ toc.* i18n parity\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(ui): PC版マークダウンビューワーにサイドTOC(目次)を追加 (#1007) (#1008)",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-07-02T05:15:39Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "9b9acc5a9c2742f78be9327f9216911ff5e57ddf",
          "body": "同一ブランチ名(develop等)が複数リポジトリに存在する環境で、worktree ID\nの前方一致により特定リポジトリの worktree を一意に絞り込めるようにする。\n既存の --branch フィルタと独立した AND 条件として適用可能。\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(cli): ls --id <prefix> で worktree ID 前方一致フィルタを追加 (#1005) (#1006)",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-07-02T04:13:08Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "108c1926f0105ccacb33c043847a5edb7554ddb5",
          "body": "worktrees テーブルに branch カラムを追加し、sync 時に実ブランチ名を\n保存・API/型で伝播する方針A を採用。ls --branch フィルタを name\n直接参照から (wt.branch ?? wt.name) の前方一致へ変更する。\n\n- v36 マイグレーション追加 (ALTER TABLE worktrees ADD COLUMN branch)\n  - migrations/index.ts へ登録、CURRENT_SCHEMA_VERSION 35→36\n- Worktree / WorktreeItem 型に branch?: string を追加\n  \n[…]\nィルタを branch 優先・name フォールバックに変更(後方互換)\n- テスト追加: v36 冪等/無損失、worktree-db round-trip、API branch 返却、\n  ls --branch (branch != name) フィルタ\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(cli): ls --branch を実ブランチ名で絞り込む (#1003) (#1004)",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-07-02T03:13:38Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "4ec5645ddcf841e0456f3a2f3cd34d4a76a90d17",
          "body": "- commandmate instances サブコマンドで roster + 稼働状況を一覧・add/remove/alias/kill 操作可能に\n- send --instance --register でアドホックセッションを roster に自動登録\n- ApiClient に PATCH サポートを追加、agentInstances を型定義(ls --json 含む)\n- 埋め込みdocs/user-guideにマルチセッション節を追加、--instance のヘルプにID規約例を追記",
          "is_bot": false,
          "headline": "feat(cli): 1エージェント複数セッションのCLI管理・ドキュメント整備 (#1000) (#1002)",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-07-01T16:36:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "af945d4dee03adc3296642bc903353904a36c2f5",
          "body": "…) (#1001)\n\nAuto-Yes never answered agy's \"Do you want to proceed?\" permission menu:\nthe poller ran (poller:started x4) but sent nothing (response-sent x0).\nTwo gaps, both fixed:\n\n1. Detection: buildDetectPromptOptions('antigravity') returned undefined\n   (requireDefaultIndicator=true). agy highligh\n[…]\nr => \"1\"; sendPromptAnswer uses cursor nav (Enter / Down+Enter)\nfor antigravity. Other tools' detection and sending are unchanged.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(auto-yes): respond to Antigravity permission-approval menus (#999…",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-07-01T16:15:30Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "0cd6d7e55114013cd9455243a426fe619763634f",
          "body": "…ermission-approval menu (#997) (#998)\n\nRelax ANTIGRAVITY_SELECTION_LIST_PATTERN (Option A) so the \"↑/↓ Navigate\"\nfooter alone is sufficient, dropping the \"enter Select\" requirement from #995.\nThe agy \"Do you want to proceed?\" permission-approval menu footer is\n\"↑/↓ Navigate · tab Amend · ctrl+g … ·\n[…]\ntion tests for the permission menu at\nboth the pattern and status-detector layers, including the thinking-priority\nordering guard.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(detection): broaden Antigravity selection-list pattern to cover p…",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-07-01T11:29:41Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "ced3b923875bfb64d68110b609021c5fd3c27705",
          "body": "* feat(files): toggleable file-tree metadata columns + hover tooltip (#969) (#972)\n\nPreviously each file row always rendered size and a relative birthtime\ninline, crowding the file name. This makes the inline metadata columns\n(size / created / modified) individually toggleable and persisted, and\nadd\n[…]\n the pattern and the thinking-collision ordering.\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(agent): Antigravity CLI(agy)対応(Phase A/B/C)を main へ反映 (#994)",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-07-01T06:45:22Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "1d3ff44ee458971be9ceeffbde1c675adc113512",
          "body": "…ttons show (#995) (#996)\n\nagy's \"Switch Model\" (and other) selection TUIs render an \"esc to cancel\"\nfooter that ANTIGRAVITY_THINKING_PATTERN also matches, so the selection\nscreen was misreported as running/thinking and NavigationButtons never\nappeared — leaving ↑↓/Enter model selection unreachable.\n[…]\nrroring the Copilot (0) / Codex (0.8) early-detection ordering.\n\nUnit tests cover the pattern and the thinking-collision ordering.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(detection): detect Antigravity selection-list TUI so NavigationBu…",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-07-01T05:55:25Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "6c1f2c0cde1e59033128acd2c60f064117caa455",
          "body": "… C, #990) (#992)\n\nIntegrate Antigravity (`agy -p`) into all non-interactive execution paths,\nmirroring the existing claude/codex handling.\n\nAssistant Chat (non-interactive):\n- AssistantChatPanel: add antigravity to ASSISTANT_ALLOWED_TOOLS\n- tool-capabilities: add antigravity to NON_INTERACTIVE_TOOL\n[…]\n tool-capabilities, executor, report --tool, review-config,\nstandard-commands. Updated docs/module-reference.md. All 4 gates pass.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(agent): add Antigravity (agy) non-interactive integration (Phase…",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-07-01T02:31:14Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "252d16db151472f07c53c490a663f958b83f7c4d",
          "body": "…989) (#993)\n\nAdds Auto-Yes (--dangerously-skip-permissions) and --model support for the\nAntigravity (agy) CLI tool introduced in Phase A (#988), bringing it to\nfeature parity with other agents.\n\n- schedule-config/cmate-parser/cmate-validator: antigravity permission\n  handling for the CMATE.md sched\n[…]\n_AGENTS 5->6, antigravity added\n  to DEFAULT_SELECTED_AGENTS\n- CLI help text updated across send/respond/capture/auto-yes commands\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(agent): add Antigravity Auto-Yes and model selection (Phase B, #…",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-07-01T02:30:54Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "074e36d60b205b5a8cc2e9b685ba53c2ee331272",
          "body": "Register the Antigravity `agy` CLI (v1.0.14) as a selectable agent.\n\n- types/index/manager: add 'antigravity' to CLI_TOOL_IDS, the\n  'Antigravity' display name, and register AntigravityTool.\n- cli-tools/antigravity.ts: new AntigravityTool. agy is an INLINE TUI\n  (scrollback retained, Codex-style — n\n[…]\n from source. Scope is Phase A (MVP) only: permission flags,\nmodel selection, and non-interactive `agy -p` are tracked separately.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(agent): add Antigravity (agy) CLI support (Phase A, #988) (#991)",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-06-30T16:12:24Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "abb6216d093fd160d5ab76a8677816cc71644e3e",
          "body": null,
          "is_bot": false,
          "headline": "chore: merge release v0.7.5 to develop",
          "author_name": "kewton",
          "author_login": "Kewton",
          "committed_at": "2026-06-30T07:26:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "74c8bc1cc21b7a036cde6e9bca32e2b72fd2e1fa",
          "body": "release: v0.7.5",
          "is_bot": false,
          "headline": "Merge pull request #986 from Kewton/release/v0.7.5",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-06-30T07:25:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "033e1f905b88a3df3696e8028f68af1f63ee727c",
          "body": null,
          "is_bot": false,
          "headline": "chore: release v0.7.5",
          "author_name": "kewton",
          "author_login": "Kewton",
          "committed_at": "2026-06-30T07:17:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a32bab6e83564a829d92032a89f2c902bd13cc68",
          "body": "* feat(files): toggleable file-tree metadata columns + hover tooltip (#969) (#972)\n\nPreviously each file row always rendered size and a relative birthtime\ninline, crowding the file name. This makes the inline metadata columns\n(size / created / modified) individually toggleable and persisted, and\nadd\n[…]\nnd mermaid diagrams stay button-free.\n\nFixes #983\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": "chore: v0.7.4以降のUI改善・不具合修正を main へ反映 (#985)",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-06-30T07:10:33Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "c5975a6e7e019d874405ef9a395fc43b881218a7",
          "body": "…de (#984)\n\nreact-markdown v10 no longer passes an `inline` prop to the `code`\ncomponent, so MermaidCodeBlock's inline check was always undefined. Every\ninline code span fell through to CodeBlockWithCopy, gaining a copy button\nand being forced onto its own line via the `as=\"span\"` block class.\n\nMove\n[…]\no line\nbreak, fenced blocks (with and without a language) get a working button,\nand mermaid diagrams stay button-free.\n\nFixes #983\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(markdown): attach code copy button at pre renderer, not inline co…",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-06-29T14:06:07Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "247d9e4425e0c4f823b9ba54422ab764421a0146",
          "body": "…982)\n\nAdds a copy-to-clipboard button to each non-mermaid code block in the\nmarkdown file preview render paths (PC + mobile).\n\n- Extract CopyButton into src/components/common/CopyButton.tsx, reused\n  by AssistantMessageList (behavior unchanged) and the new wrapper.\n- Add CodeBlockWithCopy that wrap\n[…]\nsanitize cannot drop it.\n- Add unit tests for CopyButton, CodeBlockWithCopy/extractCodeText, and\n  MermaidCodeBlock copy behavior.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(markdown): add copy button to file-preview code blocks (#981) (#…",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-06-29T12:20:40Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "fcebd67b3b4e4d8a2ed9c37bc779d999e20e7e4e",
          "body": "…t/Equal widths/History/Files order (#977) (#980)\n\nRemove the `ml-auto` on the +Split button (which split the action bar into\nleft/right groups) and reorder the JSX so all buttons read left-to-right:\n+Split → -Split → Equal widths → History → Files. PC-only change\n(TerminalSplitContainer is rendered\n[…]\nes are unaffected. Button behavior, enabled/disabled conditions, and aria\nstate are unchanged. Adds order-verification unit tests.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(terminal): left-align PC terminal header buttons in +Split/-Spli…",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-06-29T09:57:29Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "823e0c9d59c35702dd8b74827f748bcda574f0d5",
          "body": "…r overlap (#976) (#979)\n\nWhen the sidebar is narrowed, the header's heading + action button group\n(ViewModeToggle / SortSelector / SyncButton / Repositories) overflowed\nhorizontally and overlapped the adjacent ActivityBar because the row was\nflex-nowrap with the default overflow:visible.\n\n- Sidebar\n[…]\nown.\n- tests: add 3 cases asserting flex-wrap on the header row and actions\n  group, and min-w-0/truncate on the Branches heading.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(sidebar): wrap header buttons on narrow width to avoid ActivityBa…",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-06-29T09:57:26Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e6275707196c1300a9f4d8881856ac9455bf8463",
          "body": "…5) (#978)\n\nMerge the two independent file-row tooltips into a single styled bubble.\nPreviously a native `title` metadata tooltip (#969) and the custom name\nTruncationTooltip (#859) appeared separately, with different delays\n(~0.5-1s native vs 200ms custom) and styling.\n\n- TruncationTooltip: add opt\n[…]\nance criterion).\n- Sidebar usage is unaffected (the new prop is optional/additive).\n- Tests updated for the unified hover tooltip.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(files): unify file-tree tooltips into one (metadata + name) (#97…",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-06-29T09:57:23Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "320335a0413cb2f383ac7294b400ed85d98174d5",
          "body": "…p (#971) (#974)\n\nEliminate the sidebar's horizontal scrollbar caused by long repository\nnames overflowing the group header. Make the group header a min-w-0 flex\ncontainer so the existing truncate takes effect, wrap the repository name\nin TruncationTooltip to show the full name on hover only when cl\n[…]\nden to the branch list as a\nsafeguard, and constrain the DnD sortable wrapper with w-full min-w-0 to\nprevent overflow during drag.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(sidebar): remove horizontal scrollbar via truncate + hover toolti…",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-06-29T00:51:51Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "b24041630d7336867912927e4720b0e8ae857b02",
          "body": "worktree 詳細画面の 4 つのドラッグ可能な仕切り(PaneResizer)が太く・濃く\n見える問題を解消する。共通コンポーネント 1 ファイルの修正で全境界に反映。\n\n- 線色を bg-gray-700 から bg-gray-200 dark:bg-gray-700 へ変更し、固定パネル\n  枠線と同色の控えめな 1px 線にする\n- ホバー時の線幅拡大(hover:w-2 / hover:h-2)を削除。常時 1px を維持し、\n  ホバー/フォーカス時のみアクセント色(cyan-500)を表示\n- darkMode: 'class' では base の dark:bg-gray-\n[…]\ncus:ring-offset-white dark:...gray-900)\n- ドラッグ中のみ線幅拡大 + accent をライブフィードバックとして維持\n\nPaneResizer の単体テストに VS Code 風細線の挙動を固定する 6 ケースを追加。\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(ui): make PaneResizer dividers VS Code-style thin (#970) (#973)",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-06-29T00:51:48Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a6604986e533aae0ab2d7bc76d119b939889bd26",
          "body": "…969) (#972)\n\nPreviously each file row always rendered size and a relative birthtime\ninline, crowding the file name. This makes the inline metadata columns\n(size / created / modified) individually toggleable and persisted, and\nadds a formatted, locale-aware hover tooltip so timestamps stay\naccessibl\n[…]\nrings (parity)\n- tests: mtime backend, hook persistence/sync, TreeNode conditional\n  render + tooltip, FileTreeView toolbar toggle\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(files): toggleable file-tree metadata columns + hover tooltip (#…",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-06-29T00:51:45Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "5cfb088940f56064651009de053dcab5cbdcce64",
          "body": null,
          "is_bot": false,
          "headline": "chore: merge release v0.7.4 to develop",
          "author_name": "kewton",
          "author_login": "Kewton",
          "committed_at": "2026-06-25T15:09:26Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "53eedd41e4b0696de5c5ba1fd9b8ad594ac9328d",
          "body": "release: v0.7.4",
          "is_bot": false,
          "headline": "release: v0.7.4 (#968)",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-06-25T15:09:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "621681f948e99439ee7b3bf47b5fd4bd3e9ebbec",
          "body": "Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: release v0.7.4",
          "author_name": "kewton",
          "author_login": "Kewton",
          "committed_at": "2026-06-25T15:01:05Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "ad18e577d75bae7cade2b448f3b89768bf8de446",
          "body": "4 perf quick-wins to reduce sidebar-click -> detail render latency:\n\n1. WorktreeSelectionContext: stale-while-revalidate. SELECT_WORKTREE seeds the\n   detail pane from the already-loaded list cache and only shows the loading\n   state on a cache miss; getById() overwrites with fresh detail in backgro\n[…]\n  instead of after it; session detection still chains off listSessions().\n4. tmux-capture-cache: extend CACHE_TTL_MS 3000 -> 5000.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "perf(worktree): speed up sidebar click to detail view (#965) (#967)",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-06-25T14:11:40Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "36e77825e9532b47d8bf454754948aa6b9be51ac",
          "body": "Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(worktree): hide mobile agent tab header scrollbar (#964) (#966)",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-06-25T14:06:57Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "6862709b40ac938882ee8b4f09c0c3b5d250b54e",
          "body": "…tool (#960) (#963)\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(worktree): resolve mobile agent status per instance, not per CLI …",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-06-24T15:01:55Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "6a8f104b20151376ff9260eebd82c4a0351e84f8",
          "body": "Auto-Yes stayed enabled for one extra polling tick after the countdown\nreached 00:00 because expiry used a strict `>` (now > expiresAt) while the\ndisplay clamps to 0 at now === expiresAt.\n\n- auto-yes-state: isAutoYesExpired now uses `>=` so the state expires at the\n  exact instant the countdown show\n[…]\ne and component tests for the zero-countdown UI behaviour;\n  correct the prior exact-expiry assertion that encoded the off-by-one.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(auto-yes): disable exactly when countdown reaches zero (#959) (#962)",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-06-24T14:53:57Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "438efe399b4e5fcb3fce1bebbaaf0661715cbc11",
          "body": "…#958) (#961)\n\nMobile header now pins the Auto Yes toggle on the left and the search +\nEnd (kill session) buttons on the right, with the agent instance tabs in\na horizontally scrollable middle region. Previously the right cluster\nheld both the tabs and the End button without overflow handling, so 3+\n[…]\nr-thin\n- Each tab button gets flex-shrink-0 whitespace-nowrap\n- Search + End buttons split into a right-pinned flex-shrink-0 group\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(worktree): make mobile agent tab header horizontally scrollable (…",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-06-24T14:49:44Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "f9823c9655e0edfd70a47e3b741bb9dc95169530",
          "body": "…56) (#957)\n\nセッションクローズ確認ダイアログ(ヘッダーの「✕ End」)のタイトルが、\nインスタンスに付与したエイリアス(別名)ではなく CLI ツール名(Claude/Codex)\nを表示していた問題を修正。\n\n- 新規 getActiveInstanceLabel() を追加(cli-tools/types.ts)。activeInstanceId に\n  一致するインスタンスを getInstanceLabel でエイリアス優先解決し、見つからない/\n  stale 時は CLI 表示名へフォールバック。\n- WorktreeDetailRefactored.tsx の c\n[…]\nbel に差し替え。\n  タブ表示(getInstanceLabel 使用)との不整合を解消。\n- エイリアス未設定時はフォールバックにより従来挙動を維持(後方互換)。\n- ロケール文言は {tool} プレースホルダのみで変更不要。\n\nCloses #956\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(worktree): show instance alias in kill-session confirm dialog (#9…",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-06-24T01:05:59Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "ed028ff031e7c324544b7e5fdd76fc007fc02c71",
          "body": null,
          "is_bot": false,
          "headline": "chore: merge release v0.7.3 to develop",
          "author_name": "kewton",
          "author_login": "Kewton",
          "committed_at": "2026-06-23T00:41:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "efb7f9ca5b890f7210c1d8810800827c86497ea5",
          "body": "release: v0.7.3",
          "is_bot": false,
          "headline": "release: v0.7.3 (#955)",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-06-23T00:41:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d439eae3b0280fd67aebef92d7053d84cc75920c",
          "body": null,
          "is_bot": false,
          "headline": "chore: release v0.7.3",
          "author_name": "kewton",
          "author_login": "Kewton",
          "committed_at": "2026-06-23T00:33:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4023bb1f576fd2c81b6f94ff2021ee13a8577a22",
          "body": "…rkspace/.playwright-mcp (#954)\n\n* fix(terminal-pane): clear residual PC terminal output after agent close + add ended placeholder (#843)\n\nIssue #842.\n\nA. Polling guard fix (root cause): useTerminalPanePolling cleared output only\n   when it had content or the session was running, so the \"empty + sto\n[…]\n残る bloat とパスリークは許容(将来厳密化が必要なら別途 filter-repo を検討)。\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": "chore: propagate repo cleanup (#953) to main — untrack dev-reports/wo…",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-06-22T15:14:14Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "32d36e3aa046e23f08f582b68ff211a798d2519a",
          "body": "…-mcp & sanitize test fixtures (#953)\n\nリポジトリ肥大化(追跡 8,481 ファイル中 7,136=84% が dev-reports/ の AI エージェント\n自動生成ログ)と、ログに焼き込まれた絶対パス(contributor のローカルユーザー名)への対応。\n\n- git rm -r --cached で dev-reports / workspace / .playwright-mcp を追跡解除(計 7,169 件)。\n  ローカルの実ファイルは保持(machine output は手元には残す)。\n- .gitignore に /dev-rep\n[…]\nxample)。検証ロジック(パス折り返し判定)は不変。\n\n履歴の書き換えは行わない(force-push なし・既存クローン/fork に無影響)。\n過去履歴に残る bloat とパスリークは許容(将来厳密化が必要なら別途 filter-repo を検討)。\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(repo): untrack auto-generated dev-reports/workspace/.playwright…",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-06-22T14:55:25Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "8f4667f323dba7e846e0d4aaaa775a08af6c282b",
          "body": "…946 + Timer モーダル化 #945 + メモ並び替え #944 + Timer codex 送信修正 #947) (#952)\n\n* fix(terminal-pane): clear residual PC terminal output after agent close + add ended placeholder (#843)\n\nIssue #842.\n\nA. Polling guard fix (root cause): useTerminalPanePolling cleared output only\n   when it had content or the se\n[…]\nnstanceId 伝播・no_session 時非送信・失敗時 failed)を検証するよう更新\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: develop → main (Timer/Schedule インスタンス選択 #942 + サイドバーアイコン拡大 #…",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-06-22T14:34:19Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "3a1730ec9afdcb25950fb8cc59b0fda9666b346d",
          "body": "…irmation (#947) (#951)\n\nTimer 発火処理が tmux に直接 sendKeys(text+Enter 一括) を投入していたため、\ncodex の TUI がテキスト確定前に Enter を受け取り、メッセージが入力欄に\n残ったまま送信されない不具合があった。\n\n恒久対策として executeTimer の送信を cliTool.sendMessage(worktreeId,\nmessage, instanceId) に委譲。手動送信と完全に同じコードパス(CLIツール\nごとのテキスト/Enter 分離・待機)を通るため、claude/codex/gemini す\n[…]\nsionName 解決を除去\n- tests/unit/lib/timer-manager.test.ts: 送信委譲(sendMessage 呼び出し・\n  instanceId 伝播・no_session 時非送信・失敗時 failed)を検証するよう更新\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(timer): delegate Timer send to cliTool.sendMessage for Enter conf…",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-06-22T02:18:32Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "81f2cebc4ecbc301902ef3474f1e9c2fab081dbe",
          "body": "- PATCH /api/worktrees/[id]/memos: validate + reorder memo positions\n- new src/lib/memo-reorder-validator.ts: pure validation (count/dup/foreign-id)\n- memoApi.reorder() client method\n- MemoCard ↑↓ move buttons (disabled at ends, backward-compat props)\n- MemoPane handleMove with optimistic update + rollback, disabled during search\n- i18n memoMoveUp/memoMoveDown (en/ja)\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(memo): add ↑↓ reorder buttons to Activity Bar Notes (#944) (#950)",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-06-22T01:49:04Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "2c2671d828ad404aeb8d04192f881d3fec9ef763",
          "body": "…alog (#945) (#949)\n\nReplace the always-visible inline Timer form with a \"+ Create Timer\" empty-state\nCTA / \"+ New Timer\" button that opens a modal dialog (PC=Modal, mobile=FullScreenModal),\nmirroring the Schedule UX. Extract formatDelayLabel into timers/timer-format.ts shared\nby pane and dialog. Li\n[…]\nistory/load-more are preserved and\npublic props are unchanged so callers (WorktreeDetailDesktop / NotesAndLogsPane) need no edits.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(timer): switch Timer input to \"+ Create Timer\" button + modal di…",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-06-22T01:42:35Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "f6bc868c2e4b24a6dec53362b4cf18c4ed039cb4",
          "body": "…ity (#946) (#948)\n\nIntroduce a shared HEADER_ICON_CLASS ('w-4 h-4') for the five sidebar\nheader action icons (view-mode toggle, sort, sort-direction, sync,\nRepositories link), bumping them from 12px to 16px. SortSelectorBase\ngains an optional iconClassName prop (defaults to 'w-3 h-3') so other\nconsumers such as the Sessions page keep the original size.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(sidebar): enlarge top-row header action icons for better visibil…",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-06-22T01:35:29Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "9488a58ef61151dea15711981086b61dccacd09a",
          "body": "…ances\n\nfeat(timer): select registered agent instances in Timer and Schedule (#942)",
          "is_bot": false,
          "headline": "Merge pull request #943 from Kewton/fix/942-timer-schedule-agent-inst…",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-06-22T00:13:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7b681482a5282bb55e977a74eecb486745bb9973",
          "body": "…(#942)\n\nTimer (#534) and Schedule (#824-827) predate the AgentInstance system\n(#869), so their agent selectors were bound to the static CLI_TOOL_IDS list\nand could not target instances registered in the Agents panel.\n\nTimer — full instance support:\n- v35 migration adds a nullable timer_messages.ins\n[…]\nthreaded through WorktreeDetailDesktop (desktop) and\nNotesAndLogsPane (mobile) into TimerPane/ExecutionLogPane/ScheduleEditDialog.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(timer): select registered agent instances in Timer and Schedule …",
          "author_name": "kewton",
          "author_login": "Kewton",
          "committed_at": "2026-06-21T16:23:41Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "58194c82933bad4ccca92397d52a7fc46f3e1a1b",
          "body": null,
          "is_bot": false,
          "headline": "chore: merge release v0.7.2 to develop",
          "author_name": "kewton",
          "author_login": "Kewton",
          "committed_at": "2026-06-21T14:47:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ac499383feccdc5b264dd87ecf76833233e65713",
          "body": "release: v0.7.2",
          "is_bot": false,
          "headline": "release: v0.7.2 (#941)",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-06-21T14:46:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4caf5c6c9e125df9314648fee48239b31c88555d",
          "body": null,
          "is_bot": false,
          "headline": "chore: release v0.7.2",
          "author_name": "kewton",
          "author_login": "Kewton",
          "committed_at": "2026-06-21T14:39:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ce2d9b5b9259666a42b4e362eb11e80d7a741042",
          "body": "…3 + ドキュメント整備 #924-929) (#940)\n\n* fix(terminal-pane): clear residual PC terminal output after agent close + add ended placeholder (#843)\n\nIssue #842.\n\nA. Polling guard fix (root cause): useTerminalPanePolling cleared output only\n   when it had content or the session was running, so the \"empty + stop\n[…]\nt tests for the new hooks and the context/layout.\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: develop → main (PC表示サイズ #915/#919 + god-module リファクタ #920-92…",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-06-21T08:16:26Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "82643596c39901860bcd8ab1bdb7e55e0438d505",
          "body": "…ls + layout (#922) (#939)\n\nSplit the ~3.1k-line src/components/worktree/GitPane.tsx into a thin\ncoordinator that wires focused custom hooks (logic) to memo'd panel\ncomponents (presentation) via a shared layout — a behavior-preserving\nrefactor with the 112 existing GitPane tests as the safety net.\n\n\n[…]\nrnal props, data-testids, and runtime behavior are unchanged.\n- Added focused unit tests for the new hooks and the context/layout.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor(worktree): decompose GitPane god-component into hooks + pane…",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-06-20T17:10:30Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "118d7d8c75af556ffdffbeafa669b67a08e2c962",
          "body": "…#928) (#938)\n\nIssue #928: コード構造ドキュメントが現行 src/ 構成から乖離していた問題を解消。\n\n- CLAUDE.md ディレクトリツリーに欠落していた主要ディレクトリを追記:\n  app/{chat,login,proxy,worktrees}、cli/docs、components/{auth,error,\n  external-apps,repository,ui}、lib/{assistant,browser-compat,external-apps,\n  proxy}+lib/ws-server.ts/logger.ts(brief overview\n[…]\nib/assistant 非インタラクティブ実行群、lib/external-apps、lib/proxy、\n  app/{chat,login,proxy} ルート。\n- CLAUDE.md は 16,632 bytes で 35,000 byte 上限内。\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: sync CLAUDE.md tree and module-reference.md with current src/ (…",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-06-20T16:41:17Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "3295209bc291f68156fbcd67a3bc46c4d398ea88",
          "body": "…921) (#937)\n\nDecompose the 2327-line src/lib/git/git-utils.ts (37 exports) into\nsingle-concern modules, keeping git-utils.ts as a backward-compatible\nre-export barrel so all callers via the barrel are unchanged.\n\nNew modules (no circular dependencies):\n- git-errors.ts     typed error classes + hand\n[…]\nriginal cases are preserved verbatim across 11 per-module files.\n\nGates: lint / tsc --noEmit / test:unit (7900) / build all green.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor(git): split git-utils god-module into per-concern modules (#…",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-06-20T16:32:08Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "138f38ea2330214957f410e9b3b684513b087b66",
          "body": "… Phase 1) (#936)\n\n低リスク・無結合の3関心事を useWorktreeDetailController から独立サブフックへ抽出\n(純構造リファクタ・振る舞い不変):\n\n- useHistoryFilters: historySubTab / showArchived / historyUserOnly /\n  historyDisplayLimit + localStorage 同期\n- useDiffViewerState: diffContent / diffFilePath + open/close(mobile は no-op)\n- useVisibilityRe\n[…]\nisplayLimitRef)は\npolling 関心(Phase 2/3 で対応)として controller に残置。本体は 1671→1514 行に縮小。\n各サブフックに focused unit test を追加(18 ケース)。\n\nRefs #923\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor(worktree): useWorktreeDetailController god-hook をサブフックへ分解(P2…",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-06-20T16:26:34Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "d9785e04adfe6a37b47484821c84f12cfc8f1fca",
          "body": "…#920) (#935)\n\nWorktreeDetailHeader.tsx had no render path — the real PC worktree\ndetail top bar is DesktopHeader in WorktreeDetailSubComponents.tsx.\nOnly its own unit test referenced it (test-backed dead code).\n\n- Delete src/components/worktree/WorktreeDetailHeader.tsx\n- Delete tests/unit/component\n[…]\neader.test.tsx\n\nVerified zero remaining references repo-wide (barrel index.ts never\nexported it). No behavior change.\n\nCloses #920\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor(worktree): remove dead-code WorktreeDetailHeader component (…",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-06-20T16:23:49Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "c9b8f3b5b0762d958e2545f4bafb440feea4ef94",
          "body": "…927) (#934)\n\n- report コマンド(generate/show/list)を cli-operations-guide.md(日英)に追記\n- start の不足フラグ(--issue/--auto-port/--auth/--auth-expire/--https/--cert/--key/--allow-http/--allowed-ips/--trust-proxy)を cli-setup-guide.md(日英)に追記\n- stop の --issue、status の --issue/--all を追記\n- CLAUDE.md の CLIコマンド節に report を追加(詳細はガイドへ集約、35KB制限内)\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: add report command and start/stop/status flags to CLI guides (#…",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-06-20T16:19:59Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "52a314c3266d58a47ecffde2c8a6a11145fcdc30",
          "body": "…ty (#929) (#933)\n\nCreate docs/en/ counterparts for the 6 documents that previously had no\nEnglish version, closing the multilingual structure-parity gap (#929):\n\n- security-guide.md / security-identifiers.md (already English; add header)\n- user-guide/wsl2-setup.md (translate remaining JP comments/p\n[…]\n.\n\nAlso add reciprocal [English] / [日本語版] language-switch links to every\nJA↔EN pair, matching the existing translation convention.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(i18n): add English translations to achieve docs/ ↔ docs/en/ pari…",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-06-20T16:19:55Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "d622853934ea0677a14a43e5e2563f9e868431ec",
          "body": "… (#932)\n\nimplementation-history.md(JA/EN)の破損した design-policy リンクを修正。\n\n- #469: リンク先を実在ファイル issue-469-file-auto-update-design-policy.md に修正\n- #588 / #379 / #294 / #138: dev-reports/design/ に対応設計書が存在しないためリンク解除(`-` 化)\n- JA/EN 両ファイルで相対リンクが全て解決することを確認(破損リンク 0 件)\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: fix broken design-policy links in implementation-history (#926)…",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-06-20T16:19:51Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "9c566427d472d9062f87db50cc3b3abcb95d9d56",
          "body": "docs/architecture.md の環境変数表記を旧プレフィックス MCBD_ から\n実コード(src/lib/env.ts)の正である CM_* に統一。\n\n- CM_BIND / CM_PORT / CM_ROOT_DIR / CM_DB_PATH / CM_LOG_LEVEL へ統一\n- レガシー MCBD_* fallback の注記を Configuration 節に追加\n  (ENV_MAPPING / getEnvWithFallback による後方互換を明示)\n- src/lib/env.ts の変数名と最終突合済み\n\nCloses #925\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(architecture): 環境変数表記を MCBD_ から CM_ に統一 (#925) (#931)",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-06-20T16:19:47Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "c5144e71ef57b0f7ba540ed0ec7d22536ad10618",
          "body": "… (#930)\n\n.claude/commands/ 配下のスラッシュコマンド定義に残存していた旧リポジトリ名\nKewton/MyCodeBranchDesk(gh --repo 引数)を正しい Kewton/CommandMate に一括置換。\nGitHub のリネームリダイレクト依存を解消し、コマンド実行の信頼性・可読性を改善。\n\n対象 5 ファイル / 計22箇所:\n- .claude/commands/pr-merge-pipeline.md (8)\n- .claude/commands/uat-fix-loop.md (5)\n- .claude/commands/orchestra\n[…]\n.md (4)\n- .claude/commands/cause-analysis.md (3)\n- .claude/commands/current-situation.md (2)\n\n移行ガイド等の意図的な MyCodeBranchDesk 参照は対象外。\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: 旧リポジトリ名 Kewton/MyCodeBranchDesk を Kewton/CommandMate に修正 (#924)…",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-06-20T16:19:43Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "d46d65b356670d5887871754c1da8925e5da1356",
          "body": "… localize labels (#919)\n\nIssue #915 added the PC display-size selector to the global Header, but two\nfollow-up problems remained:\n\n- #917: /worktrees/[id] suppresses the global Header (useLayoutConfig\n  showGlobalNav:false), so the selector was unreachable on the worktree detail\n  page. Surface it \n[…]\nsktopHeader renders the selector and that option\nlabels come from the i18n dictionary (not raw Japanese).\n\nCloses #917\nCloses #918\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(display): show PC display-size selector on worktree detail page +…",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-06-20T15:20:03Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "ec264659eef59ac086f8113dab477d4e62fd2d58",
          "body": "案A(rem カスケード)で PC 専用の表示サイズ切替を実装。\n\n- usePcDisplaySize: localStorage(mcbd-pc-display-size, 既定=medium, 検証付き)で\n  サイズを永続化。サイズ係数表・ターミナルfontSize・rootフォントサイズをメタ定義。\n- PcDisplaySizeContext/Provider: 単一の真実源。PC(!isMobile)時のみ\n  <html data-pc-size> を付与して rem カスケードを適用。モバイル/アンマウント時は除去。\n- globals.css: html[data-pc-s\n[…]\n。変更時は term.options.fontSize 更新+fit()で\n  再フィット(再接続なし)。terminal ページが選択サイズに応じた値を配線。\n\nモバイル(<768px)では非適用(従来通り)。ユニット/型/lint/build 全Pass。\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(display): PC版に表示サイズ切替(大/中/小/極小)を追加(既定=中・remカスケード)(#915) (#916)",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-06-20T14:51:37Z",
          "body_truncated": true,
          "is_coding_agent": true
        }
      ],
      "releases_count": 88,
      "commits_last_year": 1751,
      "latest_release_at": "2026-07-20T00:38:18Z",
      "latest_release_tag": "v0.11.4",
      "releases_from_tags": false,
      "days_since_last_push": 0,
      "active_weeks_last_year": 32,
      "days_since_latest_release": 2,
      "mean_days_between_releases": 0.4
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": true,
      "health_percentage": 100,
      "has_issue_template": false,
      "has_code_of_conduct": true,
      "has_pull_request_template": true
    },
    "ecosystem": {
      "packages": [
        {
          "name": "commandmate",
          "exists": true,
          "license": null,
          "keywords": [
            "claude-code",
            "codex-cli",
            "gemini-cli",
            "agent-cli",
            "cli-orchestration",
            "ai-coding",
            "git-worktree",
            "coding-agent",
            "session-manager",
            "tmux",
            "cli",
            "developer-tools"
          ],
          "ecosystem": "npm",
          "matches_repo": true,
          "registry_url": "https://www.npmjs.com/package/commandmate",
          "is_deprecated": false,
          "latest_version": "0.11.4",
          "repository_url": "https://github.com/Kewton/CommandMate",
          "versions_count": 84,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": 1,
          "monthly_downloads": 3909,
          "first_published_at": "2026-01-31T15:11:13.139000Z",
          "latest_published_at": "2026-07-20T00:49:25.025000Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 2
        }
      ]
    },
    "popularity": {
      "forks": 4,
      "stars": 38,
      "watchers": 0,
      "fork_history": {
        "days": [
          {
            "date": "2026-02-19",
            "count": 1
          },
          {
            "date": "2026-02-21",
            "count": 1
          },
          {
            "date": "2026-03-11",
            "count": 1
          },
          {
            "date": "2026-05-06",
            "count": 1
          }
        ],
        "complete": true,
        "collected": 4,
        "total_forks": 4
      },
      "star_history": {
        "days": [
          {
            "date": "2026-02-19",
            "count": 1
          },
          {
            "date": "2026-02-21",
            "count": 1
          },
          {
            "date": "2026-02-22",
            "count": 1
          },
          {
            "date": "2026-03-02",
            "count": 1
          },
          {
            "date": "2026-03-07",
            "count": 1
          },
          {
            "date": "2026-03-11",
            "count": 3
          },
          {
            "date": "2026-03-12",
            "count": 1
          },
          {
            "date": "2026-03-13",
            "count": 2
          },
          {
            "date": "2026-03-14",
            "count": 1
          },
          {
            "date": "2026-03-16",
            "count": 1
          },
          {
            "date": "2026-03-17",
            "count": 1
          },
          {
            "date": "2026-03-18",
            "count": 3
          },
          {
            "date": "2026-03-19",
            "count": 2
          },
          {
            "date": "2026-03-21",
            "count": 1
          },
          {
            "date": "2026-03-22",
            "count": 1
          },
          {
            "date": "2026-03-23",
            "count": 1
          },
          {
            "date": "2026-03-25",
            "count": 2
          },
          {
            "date": "2026-03-30",
            "count": 1
          },
          {
            "date": "2026-03-31",
            "count": 1
          },
          {
            "date": "2026-04-04",
            "count": 2
          },
          {
            "date": "2026-04-12",
            "count": 1
          },
          {
            "date": "2026-04-16",
            "count": 1
          },
          {
            "date": "2026-04-29",
            "count": 1
          },
          {
            "date": "2026-05-02",
            "count": 1
          },
          {
            "date": "2026-05-05",
            "count": 1
          },
          {
            "date": "2026-05-06",
            "count": 1
          },
          {
            "date": "2026-05-13",
            "count": 1
          },
          {
            "date": "2026-05-19",
            "count": 1
          },
          {
            "date": "2026-05-21",
            "count": 1
          },
          {
            "date": "2026-05-25",
            "count": 1
          }
        ],
        "complete": true,
        "collected": 38,
        "total_stars": 38
      },
      "open_issues_and_prs": 24
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [
        "examples"
      ],
      "has_llms_txt": false,
      "has_dockerfile": false,
      "has_mcp_signal": false,
      "bootstrap_files": [],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [
        "tsconfig.json"
      ],
      "toolchain_manifests": [],
      "largest_source_bytes": 127698,
      "source_files_sampled": 1422,
      "oversized_source_files": 6,
      "agent_instruction_files": [
        "AGENTS.md",
        "CLAUDE.md"
      ],
      "agent_instruction_max_bytes": 17804
    },
    "dependencies": {
      "manifests": [
        "package.json"
      ],
      "advisories": {
        "error": null,
        "scope": null,
        "source": null,
        "findings": [],
        "collected": false,
        "malicious": [],
        "truncated": false,
        "by_severity": {},
        "advisory_count": 0,
        "affected_count": 0,
        "assessed_count": 0,
        "malicious_count": 0,
        "assessed_package": null,
        "unassessed_count": 0,
        "direct_affected_count": 0
      },
      "ecosystems": [
        "npm"
      ],
      "dependencies": [
        {
          "name": "@dnd-kit/core",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^6.3.1"
        },
        {
          "name": "@dnd-kit/sortable",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^10.0.0"
        },
        {
          "name": "@dnd-kit/utilities",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^3.2.2"
        },
        {
          "name": "@marp-team/marp-core",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^4.3.0"
        },
        {
          "name": "@radix-ui/react-checkbox",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.3.7"
        },
        {
          "name": "@radix-ui/react-dropdown-menu",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^2.1.20"
        },
        {
          "name": "@radix-ui/react-radio-group",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.4.3"
        },
        {
          "name": "@radix-ui/react-select",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^2.3.3"
        },
        {
          "name": "@radix-ui/react-switch",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.3.3"
        },
        {
          "name": "@radix-ui/react-tabs",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.1.17"
        },
        {
          "name": "@radix-ui/react-tooltip",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.2.12"
        },
        {
          "name": "@tanstack/react-virtual",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^3.13.26"
        },
        {
          "name": "ansi-to-html",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.7.2"
        },
        {
          "name": "better-sqlite3",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^12.4.1"
        },
        {
          "name": "class-variance-authority",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.7.1"
        },
        {
          "name": "clsx",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^2.1.1"
        },
        {
          "name": "cmdk",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.1.1"
        },
        {
          "name": "commander",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^14.0.2"
        },
        {
          "name": "croner",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^10.0.1"
        },
        {
          "name": "date-fns",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^4.1.0"
        },
        {
          "name": "dotenv",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^17.2.3"
        },
        {
          "name": "geist",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.7.2"
        },
        {
          "name": "github-slugger",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^2.0.0"
        },
        {
          "name": "gray-matter",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^4.0.3"
        },
        {
          "name": "http-proxy",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.18.1"
        },
        {
          "name": "isomorphic-dompurify",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^2.35.0"
        },
        {
          "name": "jsdom",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^28.1.0"
        },
        {
          "name": "lucide-react",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.554.0"
        },
        {
          "name": "mermaid",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^11.12.2"
        },
        {
          "name": "next",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^15.5.20"
        },
        {
          "name": "next-intl",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^4.8.2"
        },
        {
          "name": "next-themes",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.4.6"
        },
        {
          "name": "postcss",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^8.5.6"
        },
        {
          "name": "react",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^19.2.7"
        },
        {
          "name": "react-dom",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^19.2.7"
        },
        {
          "name": "react-markdown",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^10.1.0"
        },
        {
          "name": "react-qr-code",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^2.0.18"
        },
        {
          "name": "rehype-highlight",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^7.0.2"
        },
        {
          "name": "rehype-raw",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^7.0.0"
        },
        {
          "name": "rehype-sanitize",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^6.0.0"
        },
        {
          "name": "rehype-slug",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^6.0.0"
        },
        {
          "name": "remark-gfm",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^4.0.1"
        },
        {
          "name": "safe-regex2",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^5.0.0"
        },
        {
          "name": "tailwind-merge",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^3.6.0"
        },
        {
          "name": "uuid",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^13.0.0"
        },
        {
          "name": "web-push",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^3.6.7"
        },
        {
          "name": "ws",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^8.18.3"
        },
        {
          "name": "xterm",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^5.3.0"
        },
        {
          "name": "xterm-addon-fit",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.8.0"
        },
        {
          "name": "xterm-addon-web-links",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.9.0"
        }
      ],
      "all_dependencies": {
        "error": "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository",
        "source": null,
        "packages": [],
        "collected": false,
        "truncated": false,
        "total_count": null,
        "direct_count": null,
        "indirect_count": null
      }
    },
    "maintainership": {
      "issues": {
        "open_prs": 0,
        "merged_prs": 799,
        "open_issues": 24,
        "closed_ratio": 0.963,
        "closed_issues": 617,
        "closed_unmerged_prs": 20
      },
      "bus_factor": 1,
      "bot_contributors": 0,
      "top_contributors": [
        {
          "type": "User",
          "login": "Kewton",
          "commits": 1751,
          "avatar_url": "https://avatars.githubusercontent.com/u/11370858?v=4"
        }
      ],
      "contributors_sampled": 1,
      "top_contributor_share": 1
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "ci-pr.yml",
        "pages.yml",
        "publish.yml"
      ],
      "has_docs_dir": true,
      "linter_configs": [
        ".eslintrc.json"
      ],
      "has_editorconfig": false,
      "has_linter_config": true,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [
        "package-lock.json"
      ],
      "scorecard": {
        "checks": [
          {
            "name": "Binary-Artifacts",
            "score": 10,
            "reason": "no binaries found in the repo",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
          },
          {
            "name": "Branch-Protection",
            "score": 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": 10,
            "reason": "23 out of 23 merged PRs checked by a CI test -- score normalized to 10",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#ci-tests"
          },
          {
            "name": "CII-Best-Practices",
            "score": 0,
            "reason": "no effort to earn an OpenSSF best practices badge detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#cii-best-practices"
          },
          {
            "name": "Code-Review",
            "score": 0,
            "reason": "Found 0/23 approved changesets -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 0,
            "reason": "project has 0 contributing companies or organizations -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
          },
          {
            "name": "Dangerous-Workflow",
            "score": 10,
            "reason": "no dangerous workflow patterns detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
          },
          {
            "name": "Dependency-Update-Tool",
            "score": 0,
            "reason": "no update tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
          },
          {
            "name": "Fuzzing",
            "score": 0,
            "reason": "project is not fuzzed",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
          },
          {
            "name": "License",
            "score": 10,
            "reason": "license file detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
          },
          {
            "name": "Maintained",
            "score": 10,
            "reason": "30 commit(s) and 30 issue activity found in the last 90 days -- score normalized to 10",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
          },
          {
            "name": "Packaging",
            "score": 10,
            "reason": "packaging workflow detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
          },
          {
            "name": "Pinned-Dependencies",
            "score": 2,
            "reason": "dependency not pinned by hash detected -- score normalized to 2",
            "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": 9,
            "reason": "security policy file detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
          },
          {
            "name": "Signed-Releases",
            "score": null,
            "reason": "no releases found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
          },
          {
            "name": "Token-Permissions",
            "score": 0,
            "reason": "detected GitHub workflow tokens with excessive permissions",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
          },
          {
            "name": "Vulnerabilities",
            "score": 0,
            "reason": "57 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "ad1579473c98b0b9268c0be2f68b10726f9fa1ec",
        "ran_at": "2026-07-22T04:41:31Z",
        "aggregate_score": 4.5,
        "scorecard_version": "v5.5.0"
      },
      "has_codeql_workflow": false,
      "has_security_policy": true,
      "has_dependabot_config": false
    },
    "contribution_flow": {
      "collected": true,
      "ci_last_run_at": "2026-07-20T00:49:29Z",
      "oldest_open_prs": [],
      "last_merged_pr_at": "2026-07-22T00:44:07Z",
      "ci_last_conclusion": "SUCCESS",
      "oldest_open_issues": [
        {
          "number": 1227,
          "created_at": "2026-07-15T16:08:36Z",
          "last_comment_at": "2026-07-21T02:11:13Z",
          "last_comment_author": "Kewton"
        },
        {
          "number": 1242,
          "created_at": "2026-07-15T16:11:31Z",
          "last_comment_at": "2026-07-20T15:28:11Z",
          "last_comment_author": "Kewton"
        },
        {
          "number": 1243,
          "created_at": "2026-07-15T16:11:52Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 1244,
          "created_at": "2026-07-15T16:12:02Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 1245,
          "created_at": "2026-07-15T16:12:12Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 1246,
          "created_at": "2026-07-15T16:12:22Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 1247,
          "created_at": "2026-07-15T16:12:27Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 1248,
          "created_at": "2026-07-15T16:12:37Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 1249,
          "created_at": "2026-07-15T16:12:47Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 1250,
          "created_at": "2026-07-15T16:13:03Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 1251,
          "created_at": "2026-07-15T16:13:08Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 1252,
          "created_at": "2026-07-15T16:13:15Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 1253,
          "created_at": "2026-07-15T16:13:23Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 1254,
          "created_at": "2026-07-15T16:13:31Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 1255,
          "created_at": "2026-07-15T16:13:38Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 1256,
          "created_at": "2026-07-15T16:13:43Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 1257,
          "created_at": "2026-07-15T16:13:49Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 1258,
          "created_at": "2026-07-15T16:14:03Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 1259,
          "created_at": "2026-07-15T16:14:08Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 1260,
          "created_at": "2026-07-15T16:14:14Z",
          "last_comment_at": null,
          "last_comment_author": null
        }
      ]
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/Kewton/CommandMate",
    "host": "github.com",
    "name": "CommandMate",
    "owner": "Kewton"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "moderate",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 69,
      "inputs": {
        "security": 45,
        "vitality": 92,
        "community": 59,
        "governance": 55,
        "engineering": 90
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "excellent",
        "name": "Vitality",
        "value": 92,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "excellent",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 86,
            "inputs": {
              "commits_last_year": 1751,
              "human_commit_share": 1,
              "days_since_last_push": 0,
              "active_weeks_last_year": 32
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 0 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 0
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "32/52 weeks with commits",
                "points": 22.2,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 32
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "1751 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 1751
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "30 commit(s) and 30 issue activity found in the last 90 days -- score normalized to 10",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "release_discipline",
            "band": "excellent",
            "name": "Release discipline",
            "note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "openssf_scorecard_signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "releases_count": 88,
              "latest_release_tag": "v0.11.4",
              "releases_from_tags": false,
              "days_since_latest_release": 2,
              "mean_days_between_releases": 0.4
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "88 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 88
                    }
                  }
                ],
                "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 ~0.4 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 0.4
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "openssf_scorecard_signed_releases",
                "name": "OpenSSF Scorecard: Signed-Releases",
                "detail": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 10
              }
            ]
          },
          {
            "key": "abandonment",
            "band": "excellent",
            "name": "Abandonment",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "cap": null,
              "state": "maintained",
              "guards": [],
              "signals": [],
              "red_flag": false,
              "multiplier_pct": 100,
              "declared_reason": null,
              "unverified_reason": null,
              "unanswered_open_prs": null,
              "unanswered_open_issues": null,
              "days_since_last_merged_pr": null,
              "days_since_last_human_commit": 2,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "last human commit 2 days ago",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_maintained",
                    "params": {
                      "days": 2
                    }
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "moderate",
        "name": "Community & Adoption",
        "value": 59,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "critical",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 29,
            "inputs": {
              "forks": 4,
              "stars": 38,
              "watchers": 0,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "below_threshold"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "38 stars",
                "points": 25.4,
                "status": "partial",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 38
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "4 forks",
                "points": 4,
                "status": "partial",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 4
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "0 watchers",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "excellent",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 92,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "has_contributing": true,
              "has_issue_template": false,
              "has_code_of_conduct": true,
              "has_pull_request_template": true
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 22.5,
                "status": "met",
                "details": [],
                "max_points": 22.5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "recognized license (MIT)",
                "points": 22.5,
                "status": "met",
                "details": [
                  {
                    "code": "license_standard",
                    "params": {}
                  },
                  {
                    "code": "license_spdx",
                    "params": {
                      "spdx": "MIT"
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributing_guide",
                "name": "CONTRIBUTING guide",
                "detail": null,
                "points": 18,
                "status": "met",
                "details": [],
                "max_points": 18
              },
              {
                "key": "code_of_conduct",
                "name": "Code of conduct",
                "detail": null,
                "points": 13.5,
                "status": "met",
                "details": [],
                "max_points": 13.5
              },
              {
                "key": "issue_template",
                "name": "Issue template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.2
              },
              {
                "key": "pr_template",
                "name": "PR template",
                "detail": null,
                "points": 6.3,
                "status": "met",
                "details": [],
                "max_points": 6.3
              }
            ]
          },
          {
            "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": 60,
            "inputs": {
              "packages": [
                "commandmate"
              ],
              "dependents": null,
              "ecosystems": "npm",
              "total_downloads": null,
              "monthly_downloads": 3909
            },
            "components": [
              {
                "key": "monthly_downloads",
                "name": "Monthly downloads",
                "detail": "3,909 downloads/month across npm",
                "points": 47.9,
                "status": "partial",
                "details": [
                  {
                    "code": "downloads_monthly",
                    "params": {
                      "count": 3909,
                      "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": 55,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "critical",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 10,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 1,
              "top_contributor_share": 1
            },
            "components": [
              {
                "key": "bus_factor",
                "name": "Bus factor",
                "detail": "1 contributor(s) cover half of all commits",
                "points": 9,
                "status": "partial",
                "details": [
                  {
                    "code": "bus_factor",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 54
              },
              {
                "key": "commit_distribution",
                "name": "Commit distribution",
                "detail": "top contributor authored 100% of commits",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 100
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "1 contributors",
                "points": 1.4,
                "status": "partial",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 0 contributing companies or organizations -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "good",
            "name": "Issue & PR responsiveness",
            "note": null,
            "notes": [],
            "value": 82,
            "inputs": {
              "merged_prs": 799,
              "open_issues": 24,
              "closed_issues": 617,
              "issue_closed_ratio": 0.963,
              "closed_unmerged_prs": 20
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "96% of issues closed",
                "points": 45,
                "status": "partial",
                "details": [
                  {
                    "code": "issues_closed_share",
                    "params": {
                      "share": 96
                    }
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "799/819 decided PRs merged",
                "points": 37.3,
                "status": "partial",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 799,
                      "decided": 819
                    }
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 0/23 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "at_risk",
            "name": "Ownership & stewardship",
            "note": "Excluded from scoring (no data or not applicable): Verified domain. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "verified_domain"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 47,
            "inputs": {
              "followers": 2,
              "owner_type": "User",
              "is_verified": null,
              "owner_login": "Kewton",
              "public_repos": 43,
              "account_age_days": 4154
            },
            "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": "2 followers of Kewton",
                "points": 3.4,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 2,
                      "login": "Kewton"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "43 public repos, account ~11 yr old",
                "points": 24,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 43
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 11
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "excellent",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "commandmate"
              ],
              "ecosystems": "npm",
              "any_deprecated": false,
              "min_days_since_publish": 2
            },
            "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 2 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 2
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "84 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 84
                    }
                  }
                ],
                "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": "excellent",
        "name": "Engineering Quality",
        "value": 90,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "good",
            "name": "Engineering practices",
            "note": null,
            "notes": [],
            "value": 84,
            "inputs": {
              "has_ci": true,
              "has_tests": true,
              "has_editorconfig": false,
              "has_linter_config": true,
              "has_precommit_config": false
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": "3 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 3
                    }
                  }
                ],
                "max_points": 24
              },
              {
                "key": "tests_present",
                "name": "Tests present",
                "detail": null,
                "points": 24,
                "status": "met",
                "details": [],
                "max_points": 24
              },
              {
                "key": "linter_config",
                "name": "Linter config",
                "detail": ".eslintrc.json",
                "points": 16,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": ".eslintrc.json"
                    }
                  }
                ],
                "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": "23 out of 23 merged PRs checked by a CI test -- score normalized to 10",
                "points": 20,
                "status": "met",
                "details": [],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "excellent",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "topics": [
                "claude-code",
                "developer-tools",
                "git-worktree",
                "terminal",
                "tmux",
                "commandmate",
                "ai-coding",
                "codex-cli",
                "mobile-development",
                "session-manager",
                "autonomous-coding",
                "claude-mobile",
                "vibe-coding",
                "web-ui"
              ],
              "has_wiki": true,
              "homepage": "https://www.npmjs.com/package/commandmate",
              "has_readme": true,
              "has_docs_dir": true,
              "has_description": true
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 30,
                "status": "met",
                "details": [],
                "max_points": 30
              },
              {
                "key": "documentation_directory",
                "name": "Documentation directory",
                "detail": null,
                "points": 25,
                "status": "met",
                "details": [],
                "max_points": 25
              },
              {
                "key": "documentation_homepage_site",
                "name": "Documentation / homepage site",
                "detail": "https://www.npmjs.com/package/commandmate",
                "points": 15,
                "status": "met",
                "details": [],
                "max_points": 15
              },
              {
                "key": "repository_description",
                "name": "Repository description",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "topics",
                "name": "Topics",
                "detail": "14 topics",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "topics_count",
                    "params": {
                      "count": 14
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "wiki",
                "name": "Wiki",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          }
        ],
        "description": "Are baseline engineering and documentation practices in place?"
      },
      {
        "key": "security",
        "band": "at_risk",
        "name": "Security",
        "value": 45,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "at_risk",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): Branch-Protection, Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "branch_protection",
                    "signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 45,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 16,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 2,
              "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": "23 out of 23 merged PRs checked by a CI test -- score normalized to 10",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "cii_best_practices",
                "name": "CII-Best-Practices",
                "detail": "no effort to earn an OpenSSF best practices badge detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "code_review",
                "name": "Code-Review",
                "detail": "Found 0/23 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 0 contributing companies or organizations -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "dangerous_workflow",
                "name": "Dangerous-Workflow",
                "detail": "no dangerous workflow patterns detected",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "dependency_update_tool",
                "name": "Dependency-Update-Tool",
                "detail": "no update tool detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "fuzzing",
                "name": "Fuzzing",
                "detail": "project is not fuzzed",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "license file detected",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "maintained",
                "name": "Maintained",
                "detail": "30 commit(s) and 30 issue activity found in the last 90 days -- score normalized to 10",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "packaging",
                "name": "Packaging",
                "detail": "packaging workflow detected",
                "points": 5,
                "status": "met",
                "details": [],
                "max_points": 5
              },
              {
                "key": "pinned_dependencies",
                "name": "Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 2",
                "points": 1,
                "status": "partial",
                "details": [],
                "max_points": 5
              },
              {
                "key": "sast",
                "name": "SAST",
                "detail": "SAST tool is not run on all commits -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "security_policy",
                "name": "Security-Policy",
                "detail": "security policy file detected",
                "points": 4.5,
                "status": "partial",
                "details": [],
                "max_points": 5
              },
              {
                "key": "signed_releases",
                "name": "Signed-Releases",
                "detail": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 7.5
              },
              {
                "key": "token_permissions",
                "name": "Token-Permissions",
                "detail": "detected GitHub workflow tokens with excessive permissions",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "vulnerabilities",
                "name": "Vulnerabilities",
                "detail": "57 existing vulnerabilities detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              }
            ]
          }
        ],
        "description": "Are visible security and supply-chain practices strong, with no malicious dependency and no unresolved high-risk jurisdiction exposure?"
      },
      {
        "key": "ai_readiness",
        "band": "good",
        "name": "AI Readiness",
        "value": 73,
        "weight": 0,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "excellent",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 85,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": 0.99,
              "agent_instruction_files": [
                "AGENTS.md",
                "CLAUDE.md"
              ],
              "agent_instruction_max_bytes": 17804
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": "AGENTS.md, CLAUDE.md",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "AGENTS.md, CLAUDE.md"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "machine_readable_docs_llms_txt",
                "name": "Machine-readable docs (llms.txt)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "legible_commit_history",
                "name": "Legible commit history",
                "detail": "99 of 100 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 99,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "moderate",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 66,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [
                "package-lock.json"
              ],
              "has_dockerfile": false,
              "typed_language": true,
              "bootstrap_files": [],
              "has_devcontainer": false,
              "has_linter_config": true,
              "typecheck_configs": [
                "tsconfig.json"
              ],
              "agent_commit_share": 0.7,
              "toolchain_manifests": [],
              "dependency_bot_commit_share": 0
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "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": ".eslintrc.json",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": ".eslintrc.json"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "static_type_checking",
                "name": "Static type checking",
                "detail": "tsconfig.json",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "tsconfig.json"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "reproducible_environment",
                "name": "Reproducible environment",
                "detail": "lockfile",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "lockfile"
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "70 of the last 100 commits agent-authored or agent-credited",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "agent_authored_commits",
                    "params": {
                      "count": 70,
                      "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 2",
                "points": 2,
                "status": "partial",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "excellent",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "primary_language": "TypeScript",
              "largest_source_bytes": 127698,
              "source_files_sampled": 1422,
              "oversized_source_files": 6
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "TypeScript (statically typed)",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "statically_typed_language",
                    "params": {
                      "language": "TypeScript"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "6/1422 source files over 60KB",
                "points": 54.8,
                "status": "partial",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 1422,
                      "oversized": 6
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          },
          {
            "key": "ai_interfaces",
            "band": "at_risk",
            "name": "Machine-readable interfaces",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "example_dirs": [
                "examples"
              ],
              "has_mcp_signal": false,
              "api_schema_files": []
            },
            "components": [
              {
                "key": "api_schema_openapi_graphql_proto",
                "name": "API schema (OpenAPI/GraphQL/proto)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 40
              },
              {
                "key": "mcp_server",
                "name": "MCP server",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 20
              },
              {
                "key": "runnable_examples",
                "name": "Runnable examples",
                "detail": "examples",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "examples"
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          }
        ],
        "description": "How well is the repo equipped to be developed and maintained with AI coding agents? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score."
      }
    ],
    "metrics_version": "1.13.0"
  },
  "warnings": [
    "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository",
    "deps.dev does not index npm:commandmate@0.11.4; advisories assessed against the repository dependency graph instead"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-22T04:41:52.672692Z",
  "schema_version": "0.26.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/k/Kewton/CommandMate.svg",
  "full_name": "Kewton/CommandMate",
  "license_state": "standard",
  "license_spdx": "MIT"
}

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

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

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