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

WuErPing / solo

Solo Walk. Solo Code. Up to AI.

TypeScript · GoMIT★ 5 星标⑂ 1 复刻始于 2026年5月在 GitHub 上查看 ↗

WuErPing/solo 的健康指数为 100 分中的 55 分,处于「中等」区间。 其得分最高的类别是AI Readiness(88/100),最低的是Community & Adoption(29/100)。 最近一次更新在 4 天前。 近期的大部分工作由 1 位贡献者完成。

55
总分 / 100
中等

软件健康指数

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

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

评分画像

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

所有权

Andy Wu个人账户
14 关注者85 个公开仓库始于 2012年7月

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

软件包生态系统

注册表软件包版本月下载量版本数最近发布
Gogithub.com/WuErPing/solov0.11.0-55 天前

按类别列示的指标

活力

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

72良好 · 占总体的 22%
评分方式
36/36推送新近度 — 最近一次推送于 4 天前
6.9/36提交节奏 — 52 周中有 10 周有提交
18/18提交量 — 最近一年 194 次提交
0/10OpenSSF Scorecard:Maintained — project was created within the last 90 days. Please review its contents carefully
所用输入
commits_last_year194
human_commit_share1
days_since_last_push4
active_weeks_last_year10

发布纪律

88优秀
评分方式
16.2/27有发布版本 — 5 个版本标签(无 GitHub 发布版本)
36/36发布时效 — 最近一次发布版本于 5 天前
27/27发布节奏 — 约每 9.2 天发布一次
0/10OpenSSF Scorecard:Signed-Releases — 无数据
所用输入
releases_count5
latest_release_tagv0.11.0
releases_from_tags
days_since_latest_release5
mean_days_between_releases9.2
已排除计分(无数据或不适用):OpenSSF Scorecard:Signed-Releases。 其余权重已重新归一化。

社区与采用

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

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

社区健康

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

可持续性与治理

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

54中等 · 占总体的 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
评分方式
0/46.8议题解决 — 没有议题或无数据
38.2/38.3PR 接受 — 已裁定的 PR 中 1/1 已合并
0/15OpenSSF Scorecard:Code-Review — Found 0/30 approved changesets -- score normalized to 0
所用输入
merged_prs1
open_issues0
closed_issues0
issue_closed_ratio
closed_unmerged_prs0
已排除计分(无数据或不适用):议题解决。 其余权重已重新归一化。
评分方式
10/30所有权背书 — 个人(用户)账户
0/20已验证域名 — 不适用于个人账户
8.5/25所有者影响力 — WuErPing 有 14 位关注者
25/25既往记录 — 85 个公开仓库,账户约 13 年
所用输入
followers14
owner_typeUser
is_verified
owner_loginWuErPing
public_repos85
account_age_days5,107
已排除计分(无数据或不适用):已验证域名。 其余权重已重新归一化。
评分方式
25/25已发布且可解析 — go 上有 1 个软件包
35/35发布时效 — 最近一次发布于 5 天前
20/20版本历史 — 5 个已发布版本
20/20未被弃用 — 活跃,未被弃用或撤回
所用输入
packagesgithub.com/WuErPing/solo
ecosystemsgo
any_deprecated
min_days_since_publish5

工程质量

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

78良好 · 占总体的 20%

工程实践

80良好
评分方式
24/24CI 工作流 — 2 个工作流
24/24存在测试
16/16Linter 配置 — .golangci.yml, eslint.config.js, eslint.config.mjs
0/9.6Pre-commit 钩子
0/6.4.editorconfig
0/20OpenSSF Scorecard:CI-Tests — 无数据
所用输入
has_ci
has_tests
has_editorconfig
has_linter_config
has_precommit_config
已排除计分(无数据或不适用):OpenSSF Scorecard:CI-Tests。 其余权重已重新归一化。

文档

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

安全

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

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

安全态势

32存在风险
评分方式
7.5/7.5Binary-Artifacts — no binaries found in the repo
0/7.5Branch-Protection — branch protection not enabled on development/release branches
0/2.5CI-Tests — 无数据
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
0/7.5Code-Review — Found 0/30 approved changesets -- score normalized to 0
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
0/7.5Maintained — project was created within the last 90 days. Please review its contents carefully
0/5Packaging — 无数据
1.5/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 3
0/5SAST — no SAST tool detected
0/5Security-Policy — security policy file not detected
0/7.5Signed-Releases — 无数据
7.5/7.5Token-Permissions — GitHub workflow tokens follow principle of least privilege
0/7.5Vulnerabilities — 21 existing vulnerabilities detected
所用输入
sourceopenssf_scorecard
checks_evaluated15
scorecard_versionv5.5.0
checks_inconclusive3
scorecard_aggregate3.2
已排除计分(无数据或不适用):ci_tests, packaging, signed_releases。 其余权重已重新归一化。

AI 就绪度

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

88优秀 · 占总体的 0%
评分方式
45/45代理指令 — AGENTS.md, CLAUDE.md
0/15机器可读文档(llms.txt)
40/40可读的提交历史 — 100 次人类提交中有 96 次说明了意图(结构化标题或解释性正文)
所用输入
has_llms_txt
legible_history_share0.96
agent_instruction_filesAGENTS.md, CLAUDE.md
agent_instruction_max_bytes4,724
评分方式
18/18一条命令的引导启动 — Makefile
22/22自动化测试
11/11Lint / 格式化配置 — .golangci.yml, eslint.config.js, eslint.config.mjs
11/11静态类型检查 — app-bridge/tsconfig.json, app/tsconfig.json, packages/highlight/tsconfig.json, tsconfig.json
10/10可复现环境 — lockfile
10/10已体现的代理实践 — 最近 100 次提交中有 26 次由代理编写或署名代理
0/8自动化维护 — 未观察到自动依赖更新
3/10OpenSSF Scorecard:Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 3
所用输入
has_nix
has_tests
lockfilesgo.sum, package-lock.json
has_dockerfile
typed_language
bootstrap_filesMakefile
has_devcontainer
has_linter_config
typecheck_configsapp-bridge/tsconfig.json, app/tsconfig.json, packages/highlight/tsconfig.json, tsconfig.json
agent_commit_share0.26
toolchain_manifestscli/go.mod, daemon/go.mod, docs/analysis/demo/iterm2-agent-detection/go.mod, protocol/go.mod, relay-go/go.mod
dependency_bot_commit_share0
评分方式
45/45可类型检查的代码 — TypeScript(静态类型)
54.6/55可控的文件大小 — 采样的 1,313 个源文件中有 10 个超过 60KB
所用输入
primary_languageTypeScript
largest_source_bytes127,261
source_files_sampled1,313
oversized_source_files10

关键数据

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

数据采集警告

  • GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

更多细节

Star 与 Fork 历史 5 ★ / 1 ⇿
5Star
1Fork
3发布

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

0123455122026-062026-062026-06
主版本 0次版本 2修订 1
OpenSSF Scorecard 3.2 / 10
3.2综合

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

10Binary-Artifactsno binaries found in the repo
0Branch-Protectionbranch protection not enabled on development/release branches
不适用CI-Testsno pull request found
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
0Code-ReviewFound 0/30 approved changesets -- score normalized to 0
0Contributorsproject has 0 contributing companies or organizations -- score normalized to 0
10Dangerous-Workflowno dangerous workflow patterns detected
0Dependency-Update-Toolno update tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
0Maintainedproject was created within the last 90 days. Please review its contents carefully
不适用Packagingpackaging workflow not detected
3Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 3
0SASTno SAST tool detected
0Security-Policysecurity policy file not detected
不适用Signed-Releasesno releases found
10Token-PermissionsGitHub workflow tokens follow principle of least privilege
0Vulnerabilities21 existing vulnerabilities detected
直接依赖 97
注册表软件包版本约束清单文件
npmbase64-js^1.5.1app-bridge/package.json
npmtweetnacl^1.0.3app-bridge/package.json
npmzod^3.23.8app-bridge/package.json
RubyGemsfastlaneapp/Gemfile
npm@dnd-kit/core^6.3.1app/package.json
npm@dnd-kit/sortable^10.0.0app/package.json
npm@dnd-kit/utilities^3.2.2app/package.json
npm@floating-ui/react-native^0.10.7app/package.json
npm@getsolo/highlight*app/package.json
npm@gorhom/bottom-sheet^5.2.6app/package.json
npm@gorhom/portal^1.0.14app/package.json
npm@react-native-async-storage/async-storage2.2.0app/package.json
npm@react-native-masked-view/masked-view0.3.2app/package.json
npm@react-native/normalize-colors0.86.0app/package.json
npm@react-navigation/native^7.3.4app/package.json
npm@tanstack/react-query^5.90.11app/package.json
npm@tanstack/react-virtual^3.13.21app/package.json
npm@xterm/addon-clipboard^0.2.0app/package.json
npm@xterm/addon-fit^0.11.0app/package.json
npm@xterm/addon-image^0.9.0app/package.json
npm@xterm/addon-ligatures^0.10.0app/package.json
npm@xterm/addon-search^0.16.0app/package.json
npm@xterm/addon-unicode11^0.9.0app/package.json
npm@xterm/addon-web-links^0.12.0app/package.json
npm@xterm/addon-webgl^0.19.0app/package.json
npm@xterm/xterm^6.0.0app/package.json
npmbase64-js^1.5.1app/package.json
npmbuffer^6.0.3app/package.json
npmexpo^57app/package.json
npmexpo-asset~57.0.5app/package.json
npmexpo-build-properties~57.0.5app/package.json
npmexpo-camera~57.0.2app/package.json
npmexpo-clipboard~57.0.1app/package.json
npmexpo-constants~57.0.5app/package.json
npmexpo-crypto~57.0.1app/package.json
npmexpo-dev-client~57.0.6app/package.json
npmexpo-file-system~57.0.1app/package.json
npmexpo-haptics~57.0.1app/package.json
npmexpo-image~57.0.1app/package.json
npmexpo-image-picker~57.0.4app/package.json
npmexpo-keep-awake~57.0.1app/package.json
npmexpo-linking~57.0.3app/package.json
npmexpo-notifications~57.0.5app/package.json
npmexpo-router~57.0.6app/package.json
npmexpo-sharing~57.0.5app/package.json
npmexpo-splash-screen~57.0.4app/package.json
npmexpo-system-ui~57.0.1app/package.json
npmexpo-updates~57.0.7app/package.json
npmfast-deep-equal^3.1.3app/package.json
npmlucide-react-native^1.21.0app/package.json
npmmnemonic-id^3.2.7app/package.json
npmqrcode^1.5.4app/package.json
npmreact19.2.3app/package.json
npmreact-dom19.2.3app/package.json
npmreact-native0.86.0app/package.json
npmreact-native-draggable-flatlist^4.0.3app/package.json
npmreact-native-edge-to-edge^1.7.0app/package.json
npmreact-native-gesture-handler~2.32.0app/package.json
npmreact-native-keyboard-controller1.21.9app/package.json
npmreact-native-markdown-display^7.0.2app/package.json
npmreact-native-nitro-modules0.35.5app/package.json
npmreact-native-reanimated4.5.0app/package.json
npmreact-native-safe-area-context~5.7.0app/package.json
npmreact-native-screens4.25.2app/package.json
npmreact-native-svg15.15.4app/package.json
npmreact-native-unistyles^3.0.15app/package.json
npmreact-native-web~0.21.0app/package.json
npmreact-native-webview13.16.1app/package.json
npmreact-native-worklets0.10.0app/package.json
npmtiny-invariant^1.3.3app/package.json
npmtweetnacl^1.0.3app/package.json
npmuse-sync-external-store^1.6.0app/package.json
npmzod^3.23.8app/package.json
npmzustand^5.0.9app/package.json
Gogithub.com/WuErPing/solo/protocolv0.0.0-00010101000000-000000000000cli/go.mod
Gogithub.com/fatih/colorv1.19.0cli/go.mod
Gogithub.com/google/uuidv1.6.0cli/go.mod
Gogithub.com/gorilla/websocketv1.5.3cli/go.mod
Gogithub.com/skip2/go-qrcodev0.0.0-20200617195104-da1b6568686ecli/go.mod
Gogithub.com/spf13/cobrav1.10.2cli/go.mod
Gogolang.org/x/cryptov0.51.0cli/go.mod
Gogopkg.in/yaml.v3v3.0.1cli/go.mod
Gogithub.com/BurntSushi/tomlv1.6.0daemon/go.mod
Gogithub.com/WuErPing/solo/protocolv0.0.0daemon/go.mod
Gogithub.com/creack/ptyv1.1.21daemon/go.mod
Gogithub.com/google/uuidv1.6.0daemon/go.mod
Gogithub.com/gorilla/websocketv1.5.3daemon/go.mod
Gogithub.com/prometheus/client_golangv1.23.2daemon/go.mod
Gogithub.com/prometheus/client_modelv0.6.2daemon/go.mod
Gogithub.com/robfig/cron/v3v3.0.1daemon/go.mod
Gogolang.org/x/cryptov0.50.0daemon/go.mod
Gogolang.org/x/syncv0.21.0daemon/go.mod
Gogopkg.in/yaml.v3v3.0.1daemon/go.mod
Gogithub.com/WuErPing/solo/protocolv0.0.0relay-go/go.mod
Gogithub.com/gorilla/websocketv1.5.3relay-go/go.mod
Gogithub.com/prometheus/client_golangv1.23.2relay-go/go.mod
Gogolang.org/x/cryptov0.51.0relay-go/go.mod
全部依赖 未采集

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

原始 JSON 报告 机器可读
{
  "data": {
    "repo": {
      "topics": [],
      "is_fork": false,
      "size_kb": 8924,
      "has_wiki": true,
      "homepage": null,
      "languages": {
        "Go": 2469712,
        "HTML": 1931,
        "Ruby": 1132,
        "Shell": 20252,
        "Makefile": 6834,
        "JavaScript": 21466,
        "TypeScript": 6078106
      },
      "pushed_at": "2026-07-17T16:39:17Z",
      "created_at": "2026-05-17T12:51:56Z",
      "owner_type": "User",
      "updated_at": "2026-07-17T16:39:53Z",
      "description": "Solo Walk. Solo Code. Up to AI.",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "MIT",
      "default_branch": "main",
      "license_spdx_raw": "MIT",
      "primary_language": "TypeScript",
      "significant_languages": [
        "TypeScript",
        "Go"
      ]
    },
    "owner": {
      "blog": null,
      "name": "Andy Wu",
      "type": "User",
      "login": "WuErPing",
      "company": null,
      "location": null,
      "followers": 14,
      "avatar_url": "https://avatars.githubusercontent.com/u/2055091?v=4",
      "created_at": "2012-07-28T03:07:47Z",
      "is_verified": null,
      "public_repos": 85,
      "account_age_days": 5107
    },
    "license": {
      "state": "standard",
      "spdx_id": "MIT",
      "raw_spdx": "MIT",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v0.11.0",
          "kind": "minor",
          "published_at": "2026-07-16T12:44:01Z"
        },
        {
          "tag": "v0.8.0",
          "kind": "minor",
          "published_at": "2026-06-22T15:18:13Z"
        },
        {
          "tag": "v0.7.0",
          "kind": "minor",
          "published_at": "2026-06-20T17:00:42Z"
        },
        {
          "tag": "v0.6.5",
          "kind": "patch",
          "published_at": "2026-06-18T21:26:46Z"
        },
        {
          "tag": "v0.6.0",
          "kind": "minor",
          "published_at": "2026-06-09T17:15:48Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "5a37859ae7aaacded228bdb6281524ed939f3417",
          "body": "… schema ordering\n\nAdd product design for a chat-based schedule assistant that lets users\ncreate and edit schedules via natural language, powered by existing LLM\nproviders. The LLM produces proposals only; all mutations go through\nexisting schedule RPCs after explicit user confirmation.\n\nAlso reorder WorkspaceGitRuntimeSchema in generated protocol-schemas and\nremove an unused import in the websocket transport test.",
          "is_bot": false,
          "headline": "docs: add chat-based schedule assistant design and clean up generated…",
          "author_name": "Andy",
          "author_login": "WuErPing",
          "committed_at": "2026-07-17T16:38:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "278e5054e74929a4c98cb34c00a649395eb1f856",
          "body": "On web, unistyles StyleSheet.create objects carry an enumerable\n`unistyles_<id>: {}` metadata key. Reanimated's CSSManager flattens\nAnimated.* style props and validates every entry, throwing\n`[Reanimated] Invalid value for \"unistyles_<id>\": an empty object is\nnot a valid style value.` (reanimated sr\n[…]\ne to work\n  around TS's inability to discriminate the union through Updater<T>\n- terminal-emulator-runtime.browser.test: resize the outer container\n  (not root) since the runtime owns root.style.width",
          "is_bot": false,
          "headline": "fix(app): eliminate remaining unistyles-style crashes on Animated.*",
          "author_name": "Andy",
          "author_login": "WuErPing",
          "committed_at": "2026-07-17T13:45:25Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "5d94385ed3a84b5d86443fccca270a5aa1bce99a",
          "body": "Co-authored-by: kimi-code <kimi-code-cli>",
          "is_bot": false,
          "headline": "fix(app): stop reanimated entering/exiting crashes from unistyles styles",
          "author_name": "Andy",
          "author_login": "WuErPing",
          "committed_at": "2026-07-17T12:31:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "41606df3d98c5f12bad15db35d2782fc22d46138",
          "body": "…st routes\n\nCo-authored-by: kimi-code <kimi-code-cli>",
          "is_bot": false,
          "headline": "fix(app): keep sidebar mounted by routing Agents/Tmux/Schedules to ho…",
          "author_name": "Andy",
          "author_login": "WuErPing",
          "committed_at": "2026-07-17T00:30:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "354b83c04a6abf86dc84c49e9ec21e147c57d759",
          "body": "…tch + fork useIsFocused)\n\n- fix(app): make WorkspaceScreen/ExplorerSidebar focus prop-driven\n- fix(app): keep unistyles styles out of Animated.View style arrays\n- fix(app): strip uniProps from unistyles web withUnistyles forwarded props\n- fix(app): eliminate nested <button> in sidebar rows\n- refactor(app): extract PrBadge, relocate host-runtime-bootstrap, stub notifications on web\n- test(app): add web interop guard tests and sidebar navigation e2e spec\n\nCo-authored-by: kimi-code <kimi-code-cli>",
          "is_bot": false,
          "headline": "- fix(app): restore navigation context on web screens (expo-router pa…",
          "author_name": "Andy",
          "author_login": "WuErPing",
          "committed_at": "2026-07-16T23:56:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b8aa8bfe3248431a99e853b768e212b00fb3fcea",
          "body": "…f expo-router\n\nexpo-router SDK 57 no longer re-exports useIsFocused, causing a runtime\n\"useIsFocused is not a function\" crash. Switch all 10 source files to\nimport from @react-navigation/native (the actual exporter) and add it\nas a direct dependency. Includes a regression guard test.",
          "is_bot": false,
          "headline": "fix(app): import useIsFocused from @react-navigation/native instead o…",
          "author_name": "Andy",
          "author_login": "WuErPing",
          "committed_at": "2026-07-16T11:37:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "dea8de1dcaffbd3be5d26bf220423a54fe616bc6",
          "body": "- SDK 54→55: React 19.2, RN 0.83, babel-preset-expo 55\n- SDK 55→56: RN 0.85, TS 6.0.3, @react-navigation/native→expo-router migration\n- SDK 56→57: RN 0.86, reanimated 4.5, worklets 0.10\n- Disabled React Compiler ESLint rules (343 pre-existing violations for follow-up)\n- No test regressions (1854 passed, 4 pre-existing browser failures)",
          "is_bot": false,
          "headline": "Merge branch 'expo-upgrade': Expo SDK 54→57 upgrade",
          "author_name": "Andy",
          "author_login": "WuErPing",
          "committed_at": "2026-07-16T11:25:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0e9990d2c11661baefe739e6aacb45fff47ffeb7",
          "body": "…ler lint rules\n\n- Auto-merge duplicate expo-router imports created during @react-navigation\n  migration (import/no-duplicates)\n- Disable React Compiler ESLint rules (react-hooks/refs, set-state-in-effect,\n  preserve-manual-memoization, immutability, etc.) introduced in SDK 55+\n  eslint-config-expo.\n[…]\nse flag 343 pre-existing code patterns and should\n  be re-enabled and fixed in follow-up PRs.\n- Remove unused LoopListItem import (pre-existing lint warning)\n- Lint passes with 0 errors and 0 warnings",
          "is_bot": false,
          "headline": "fix(app): merge duplicate expo-router imports and disable React Compi…",
          "author_name": "Andy",
          "author_login": "WuErPing",
          "committed_at": "2026-07-16T11:19:32Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "1dabc410cbe2efb1c2feb811e1bf0d471b286f3c",
          "body": "- Update all Expo packages to SDK 57 compatible versions\n- React Native 0.85→0.86, react-native-reanimated 4.3→4.5\n- react-native-worklets 0.8→0.10, gesture-handler 2.31→2.32\n- babel-preset-expo 56→57, eslint-config-expo 56→57\n- No typecheck regressions (2 pre-existing errors unchanged)\n- No test regressions (1854 passed, 4 pre-existing browser failures)",
          "is_bot": false,
          "headline": "chore(app): upgrade Expo SDK 56→57",
          "author_name": "Andy",
          "author_login": "WuErPing",
          "committed_at": "2026-07-16T11:14:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5568ed176389a63ab61fbc67776afb9664cc5d36",
          "body": "- Update all Expo packages to SDK 56 compatible versions\n- React 19.2.0→19.2.3, React Native 0.83→0.85\n- TypeScript 5.9→6.0.3, babel-preset-expo 55→56\n- Migrate @react-navigation/native imports to expo-router\n  (useIsFocused, useFocusEffect, useNavigation now from expo-router)\n- Remove @react-naviga\n[…]\ndate test mocks to use expo-router instead of @react-navigation/native\n- No typecheck regressions (2 pre-existing errors unchanged)\n- No test regressions (1854 passed, 4 pre-existing browser failures)",
          "is_bot": false,
          "headline": "chore(app): upgrade Expo SDK 55→56",
          "author_name": "Andy",
          "author_login": "WuErPing",
          "committed_at": "2026-07-16T09:13:45Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "4732a24fbb6bbe5d9db0ee468a341a717017f6e3",
          "body": "- Update all Expo packages to SDK 55 compatible versions\n- React 19.1→19.2, React Native 0.81→0.83\n- babel-preset-expo 54→55, eslint-config-expo 10→55\n- Update @types/react to ~19.2.10 in root and app\n- No typecheck regressions (2 pre-existing errors unchanged)\n- No test regressions (1854 passed, 4 pre-existing browser failures)",
          "is_bot": false,
          "headline": "chore(app): upgrade Expo SDK 54→55",
          "author_name": "Andy",
          "author_login": "WuErPing",
          "committed_at": "2026-07-16T08:33:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "36f3c849e11f456044e3c4bd9daff8a5714cf9da",
          "body": "After host wake-from-sleep the relay drops both control and data sockets,\nbut the daemon kept stale data sockets in its map. A new data socket\nattached by the mobile client would race with the stale one, leaving\nthe Android app stuck on \"connecting\" even after app restart.\n\nClose all data connections at the top of connectControl so a fresh\ncontrol session always starts from a clean slate.",
          "is_bot": false,
          "headline": "fix(daemon,relayclient): close stale data sockets on control reconnect",
          "author_name": "Andy",
          "author_login": "WuErPing",
          "committed_at": "2026-07-16T07:07:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0ff9bcc8b0e00541ef77f1fa9ccb153f87d4e38c",
          "body": "- Add friendlyTmuxError() to convert raw exec errors (exit status 1, binary not found) into readable messages\n- Show \"New tmux\" and \"Refresh\" buttons below error text in tmux dashboard screen\n- Cover both backend error conversion and frontend error state in tests\n\ndocs(product): consolidate loop-sch\n[…]\np-dive.md into loop-schedule-spec.md Appendix A\n- Update roadmap-2026.md to v2.5 with Loop Engineering industry trends (Andrew Ng, Saboo, Osmani)\n- Remove deleted file references from roadmap and spec",
          "is_bot": false,
          "headline": "fix(tmux): show user-friendly error messages and recovery actions",
          "author_name": "Andy",
          "author_login": "WuErPing",
          "committed_at": "2026-07-14T13:14:50Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "a34a16807483c850268f145a03bc89cd84d80afa",
          "body": "Loop template/instance model, shared AgentTemplate, LLM provider settings,\nand HTTP client hardening. See CHANGELOG for details.",
          "is_bot": false,
          "headline": "release: app v0.10.0, app-bridge v0.4.0, daemon v0.5.0",
          "author_name": "Andy",
          "author_login": "WuErPing",
          "committed_at": "2026-07-07T03:06:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "edf4757bb6870a55fe2595600eb69ab01b4d30a8",
          "body": "…RPC types\n\nfeat(daemon,loop): add template CRUD, log file separation, and instance grouping\nfeat(app-bridge): add template RPC schemas, message registration, and client methods\nfeat(app): add template hooks, instance detail screen, and group loops by template\ntest(daemon,loop): cover template operations and log file storage\ndocs(product): update prototype for template/instance model\nfix(daemon,server): extract requestId from raw JSON on decode failure",
          "is_bot": false,
          "headline": "feat(protocol): add LoopTemplateSummary and template list/get/delete …",
          "author_name": "Andy",
          "author_login": "WuErPing",
          "committed_at": "2026-07-07T02:58:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c69839d67b2ae44300b827f6a1f881dfc57900c1",
          "body": "…ndler errors\n\n- refactor(daemon): extract shared streamevents builder and detector across providers\n- feat(app): add babel-preset-expo dependency and align vitest versions\n- chore(deps): update go modules and rename bottom-sheet patch to 5.2.14\n\nCo-authored-by: kimi <kimi-code-cli>",
          "is_bot": false,
          "headline": "- feat(app-bridge): add shared structured logger and log swallowed ha…",
          "author_name": "Andy",
          "author_login": "WuErPing",
          "committed_at": "2026-06-30T07:44:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f39fff5f31857596d711dd1e7220a460055743a4",
          "body": "- fix(daemon/push,opencode): use bounded clients to avoid goroutine leaks\n- test(daemon): cover httpx timeouts and skip flaky attention test in short mode\n- build(npm): build highlight workspace on postinstall\n- chore(app-bridge): regenerate protocol schemas with reordered workspace defs\n\nCo-authored-by: kimi-code <moonshot/kimi-k2>",
          "is_bot": false,
          "headline": "- feat(daemon/httpx): add shared HTTP clients with sane timeouts",
          "author_name": "Andy",
          "author_login": "WuErPing",
          "committed_at": "2026-06-30T01:59:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a01985e9c82a7310c08e51be10203898c05ee752",
          "body": "# Conflicts:\n#\tdocs/README.md\n#\tdocs/decisions/adr-001-shared-agent-template-for-loop-and-schedule.md",
          "is_bot": false,
          "headline": "Merge branch 'solo-loop-agents'",
          "author_name": "Andy",
          "author_login": "WuErPing",
          "committed_at": "2026-06-29T16:43:04Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b01e40874505e2e43d2a5b53ea72d96a08cf3ec4",
          "body": "…pace runtime defs\n\n- refactor(app-bridge/schedule): remove unused ScheduleTargetSchema import\n\nCo-authored-by: kimi-code <kimi-code>",
          "is_bot": false,
          "headline": "- chore(app-bridge): regenerate protocol schemas with reordered works…",
          "author_name": "Andy",
          "author_login": "WuErPing",
          "committed_at": "2026-06-29T16:18:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6e5b97483dd28edf88d2dbaff0632ef230e898b6",
          "body": "…hedule\n\n- feat(loop): feed verify failures back to worker and bound verify timeout\n- feat(loop,agent): default loop worker to the provider's most autonomous mode\n- feat(app): add loop logs view and re-run action on loop detail screen\n- feat(app): add permission-mode picker to loop create screen\n- f\n[…]\nared AgentTemplate\n- test(loop,agent,protocol): cover templates, worker feedback, and schemas\n- docs(adr): add ADR-001 shared agent template for loop and schedule\n\nCo-authored-by: Kimi <kimi-code-cli>",
          "is_bot": false,
          "headline": "- feat(protocol,app-bridge): add shared AgentTemplate for loop and sc…",
          "author_name": "Andy",
          "author_login": "WuErPing",
          "committed_at": "2026-06-29T15:58:33Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "44fe66a7754b101814e4b54c543448478720d16e",
          "body": "…edule\n\n- docs(readme): add decisions section and renumber chapters\n- docs(product): add ASCII prototype overview\n\nCo-authored-by: kimi-code <kimi>",
          "is_bot": false,
          "headline": "- docs(decisions): add ADR-001 shared agent template for loop and sch…",
          "author_name": "Andy",
          "author_login": "WuErPing",
          "committed_at": "2026-06-29T08:36:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "949cb4df3ee630f43dfebe0d9c0110ab6325c1dc",
          "body": "…ect name\n\n- fix(daemon): implement solo_worktree_archive_request and persist archive removal\n- fix(daemon): correct DeleteWorktree safety check and repo-root resolution\n- test(app,daemon): add worktree-slug tests and archive handler registration test\n- style(protocol): apply gofmt to message_loop and message_tmux\n\nCo-authored-by: Kimi <kimi-code-cli>",
          "is_bot": false,
          "headline": "- feat(app): derive new-workspace slug from prompt, PR title, or proj…",
          "author_name": "Andy",
          "author_login": "WuErPing",
          "committed_at": "2026-06-28T17:00:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "596244a34ac2331c618a8434879e53245a3e23a6",
          "body": "…spawned agents\n\n- fix(app-bridge,schedule): tolerate malformed schedule targets in list responses\n- fix(app): show schedule query errors and optimistic cache update on create\n- refactor(app/e2e): update schedule tests for provider-only save/load/edit\n- refactor(app): remove existing-agent tab from schedule modals\n- fix(app-bridge): add missing llmProviders field in workspace rpc test\n\nCo-authored-by: Kimi Code CLI <kimi-code-cli>",
          "is_bot": false,
          "headline": "- feat(daemon,schedule): add provider schedule target and auto-close …",
          "author_name": "Andy",
          "author_login": "WuErPing",
          "committed_at": "2026-06-28T16:27:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "14efd8603d23b22ebc02356f799204266620e757",
          "body": "- feat(settings): support adding custom coding agent providers\n- refactor(settings): present LLM provider form in AdaptiveModalSheet\n- refactor(app): reorder Tmux entry in sidebar\n- docs(roadmap): update 2026 roadmap and remove HTML export\n\nCo-authored-by: kimi <kimi-code-cli>",
          "is_bot": false,
          "headline": "- feat(daemon,settings): add LLM provider configuration backend and UI",
          "author_name": "Andy",
          "author_login": "WuErPing",
          "committed_at": "2026-06-26T14:59:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cad18483392a666f5de5ed3ab918e52caae8248f",
          "body": "Co-authored-by: kimi-code-cli <kimi-k2>",
          "is_bot": false,
          "headline": "docs(roadmap): add human-agent and agent-to-agent handoff features",
          "author_name": "Andy",
          "author_login": "WuErPing",
          "committed_at": "2026-06-24T18:55:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5c2bb451e7ce606ba698a507e8b62069a2b2936e",
          "body": "…shboard\" → \"Tmux\"\n\nCo-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor(app): rename sidebar labels \"Dashboard\" → \"Agents\", \"Tmux Da…",
          "author_name": "Andy",
          "author_login": "WuErPing",
          "committed_at": "2026-06-24T11:42:49Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "e571fd37f3242cdd636b218da386f2a30b26ade8",
          "body": "- Add 7 boundary tests to genzod generator covering pointer edge cases\n  (*int, *float64, *bool, *Inner, *[]string, *map[string]string),\n  omitempty combinations, array edge cases (2D, pointer elements,\n  interface slices), map edge cases (struct/pointer/slice values),\n  non-string key error path, k\n[…]\ns null, not undefined)\n- Add null coercion in normalizeAgentSnapshot and test fixtures for\n  labels/pendingPermissions to match Agent interface\n\nCo-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(app-bridge,protocol): harden schema-first infrastructure",
          "author_name": "Andy",
          "author_login": "WuErPing",
          "committed_at": "2026-06-24T06:55:49Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "9df0b2eeb7123350fcbde46ba7bf2b69045c4bb0",
          "body": "- Migrate 9 hand-written Zod schemas to genzod-generated, fix pointer/nullable bug in genzod\n- Add typed unions for WorkspaceDescriptor fields (ProjectKind, WorkspaceKind, WorkspaceStatus)\n- Unify StatusLoaderBucket as alias for SidebarStateBucket\n- Add CI lint rule (check-schema-duplication) to prevent hand-written schema duplication\n- Bump app 0.8.0 → 0.9.0, daemon 0.3.0 → 0.4.0\n\nCo-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "release: app v0.9.0, daemon v0.4.0",
          "author_name": "Andy",
          "author_login": "WuErPing",
          "committed_at": "2026-06-24T01:54:36Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "bddeb5566b0a9ef069a3bb3ad9d750272224e61b",
          "body": "…ptorSchema\n\nReplace hand-written WorkspaceDescriptorPayloadSchema with genzod-generated\nWorkspaceDescriptorSchema, eliminating dual schema definitions (§7-R3).\nRemove 6 dead fields (diffStat, project, aheadBehind, etc.) from the type\nsystem. Add null-safe wrappers for Go pointer fields and workspaceDirectory\ndefault transform. Fix identity preservation in patchWorkspaceScripts by\nnormalizing null→undefined before comparison.\n\nCo-authored-by: claude-code <claude-opus-4-7>",
          "is_bot": false,
          "headline": "refactor(app-bridge,app): migrate to genzod-generated WorkspaceDescri…",
          "author_name": "Andy",
          "author_login": "WuErPing",
          "committed_at": "2026-06-23T13:31:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "844f2a8e0a3e9c6fb772958ba764726f38822c53",
          "body": "The daemon expects WSProtocolVersion=2 but the client was sending\nprotocolVersion=1, causing every connection to be rejected with\n\"incompatible protocol version\" and triggering a reconnect loop.\n\nCo-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(app-bridge): send correct protocol version in hello message",
          "author_name": "Andy",
          "author_login": "WuErPing",
          "committed_at": "2026-06-23T07:09:36Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "4ac3c1471e47b6040961b6cfba5d8fee3af788a5",
          "body": "refactor(daemon,agent): split provider implementations into sub-packages\n\nMoved provider files from daemon/internal/agent/ to\ndaemon/internal/agent/providers/{claude,codex,kimi,opencode,pi}/\nand renamed CodexAgentClient to Client for consistency with\nthe sub-package layout. Resolved merge conflicts by combining\nthe branch's package-qualified type references with main's\nunused-parameter underscore convention.",
          "is_bot": false,
          "headline": "Merge branch 'worktree-refactor-agent-split-providers'",
          "author_name": "Andy",
          "author_login": "WuErPing",
          "committed_at": "2026-06-23T07:04:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e4c77abfd156a7c77f887f74d023970006f0c53a",
          "body": "… log failures\n\n- fix(daemon,agent): enforce per-agent timeline row limit with FIFO eviction\n- feat(daemon,config): add TimelineMaxRowsPerAgent configuration (default 10000)\n- feat(daemon,metrics): add timeline_rows_total and timeline_rows_dropped_total metrics\n- test(daemon): cover persistTurn failures and timeline limit eviction\n\nCo-authored-by: kimi-code-cli <kimi>",
          "is_bot": false,
          "headline": "- fix(daemon,memory): propagate persistTurn errors to Flush/Close and…",
          "author_name": "Andy",
          "author_login": "WuErPing",
          "committed_at": "2026-06-23T06:59:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "85b309b05b978ad534a07ba5eea11c4f265c9338",
          "body": "Move 5 provider implementations (Claude, Kimi, Pi, Codex, OpenCode) from\nthe monolithic agent/ package into agent/providers/{name}/ sub-packages.\nExtract shared utilities (DeriveToolCallDetail, HumanReadablePermission)\nto base/util.go and contract test helpers to providers/contracttest/.\n\nThe agent/\n[…]\n Mock\nprovider stays in agent/ due to circular dependency with agent tests.\n\nProvider registration in server/daemon.go updated to import sub-packages\ndirectly (claude.NewClient, kimi.NewClient, etc.).",
          "is_bot": false,
          "headline": "refactor(agent): split provider implementations into sub-packages",
          "author_name": "Andy",
          "author_login": "WuErPing",
          "committed_at": "2026-06-23T04:42:47Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "bf759306cd7722f6c6ae6ba47f82d096a62b6599",
          "body": "- fix(app): rewrite useCallback factory calls as inline arrows in session-context\n- fix(app): copy revalidation timer ref in cleanup to satisfy eslint\n- build(deps): override app-bridge zod to ^3.23.8 to avoid v4 API mismatch\n\nCo-authored-by: opencode <kimi>",
          "is_bot": false,
          "headline": "fix(app,deps): resolve lint and typecheck failures",
          "author_name": "Andy",
          "author_login": "WuErPing",
          "committed_at": "2026-06-23T04:40:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d12b2427e26bf442f0e9ff38fd29333b8b9c16b5",
          "body": "- fix(highlight): move package back to packages/highlight\n- fix(app): resolve useCallback exhaustive-deps warnings in session-context\n- build(deps): pin app-bridge zod to ^3.23.8 via npm override\n\nCo-authored-by: opencode <kimi>",
          "is_bot": false,
          "headline": "fix(ci): resolve make ci failures",
          "author_name": "Andy",
          "author_login": "WuErPing",
          "committed_at": "2026-06-23T04:40:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0a86415b7ec84e499b20a5068a2763950a43e3a2",
          "body": "Co-authored-by: opencode <kimi>",
          "is_bot": false,
          "headline": "chore(highlight): move highlight package into patches directory",
          "author_name": "Andy",
          "author_login": "WuErPing",
          "committed_at": "2026-06-23T04:27:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a305c922c2c6a293e94f91e3daae0061c9fd4c13",
          "body": null,
          "is_bot": false,
          "headline": "Merge branch 'solo-go-2-ts'",
          "author_name": "Andy",
          "author_login": "WuErPing",
          "committed_at": "2026-06-23T04:26:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7c87077d0bad6a82acebcf1cc2b906596fde0227",
          "body": "- add genzod generator and cmd/genzod CLI using go/ast\n- generate workspace Zod schemas from Go structs\n- re-export generated schemas in app-bridge messages\n- fix TS7056 for large discriminated unions with explicit types\n- integrate schema generation into Makefile and CI diff check\n\nCo-authored-by: kimi <kimi-code-cli>",
          "is_bot": false,
          "headline": "feat(protocol, app-bridge): add Go-to-TypeScript Zod codegen",
          "author_name": "Andy",
          "author_login": "WuErPing",
          "committed_at": "2026-06-23T04:25:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e50cea52ff4d8d2e0253662ca58c616bfaac296e",
          "body": "- extract tmux scan/agent detection into session_tmux_scan.go\n- extract pane capture and wrapping into session_tmux_pane.go\n- extract session lifecycle helpers into session_tmux_session.go\n- add session_structure_test.go to enforce <500 line handler files\n- clean stale placeholder comments from session.go\n- fix pre-existing lint warnings in provider_codex.go and agent_integration_test.go\n\nCo-authored-by: Kimi Code <kimi-code-cli>",
          "is_bot": false,
          "headline": "refactor(daemon/session): split tmux logic into focused files",
          "author_name": "Andy",
          "author_login": "WuErPing",
          "committed_at": "2026-06-23T04:05:22Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "eb0248b9d7b517493c9a3da27383e210954265ee",
          "body": "Decompose the 1,672-line God Object into focused modules using a\nfactory function pattern:\n\n- session-notifications.ts — OS notification factory + helpers\n- agent-operations.ts — sendAgentMessage factory\n- session-helpers.ts — pure helpers + reducer glue + pending buffer\n- session-agent-sync.ts — sn\n[…]\no removes 9 dead-code _-prefixed callbacks (~150 lines).\n\nTDD-first: 112 tests across 14 files, all passing. TypeScript and ESLint\nclean. Public API 100% preserved (SessionProvider + type re-exports).",
          "is_bot": false,
          "headline": "refactor(app): split session-context into domain modules",
          "author_name": "Andy",
          "author_login": "WuErPing",
          "committed_at": "2026-06-23T01:22:56Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "447334f52ce23fe682e0405852eb848cc15c957a",
          "body": "…sets\n\nAdd architecture, flywheel, pillars, and tech-tree diagrams (SVG+PNG),\nan HTML render, and rewrite the roadmap around a project-as-anchor\nproduct thesis.",
          "is_bot": false,
          "headline": "docs(roadmap): update 2026 roadmap to project-centric version with as…",
          "author_name": "Andy",
          "author_login": "WuErPing",
          "committed_at": "2026-06-22T18:51:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3b164f475ca7645e179f2ee749eff03b0f014c11",
          "body": "Extract agent, chat, git, schedule, terminal, and workspace RPC logic\nout of the monolithic DaemonClient into dedicated modules with tests\nand a shared test harness + mock transport.",
          "is_bot": false,
          "headline": "refactor(app-bridge): split daemon-client into per-domain RPC modules",
          "author_name": "Andy",
          "author_login": "WuErPing",
          "committed_at": "2026-06-22T18:51:07Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cab3d495c2eaab05e24a1afb9d446c41958131ff",
          "body": "- feat(schedule): add working directory field and fix save/load schema mismatch\n- feat(sidebar): color sidebar icons and add loop/schedule count badges\n- feat(loop): support editing all fields from detail page\n- feat(agent): add Codex provider support\n- chore(protocol): bump WSProtocolVersion to 2\n-\n[…]\n.3.0, cli to 0.2.0\n- docs(architecture): update README and architecture diagrams\n- test(schedule): add E2E and unit tests for schedule creation and dashboard\n\nCo-authored-by: Kimi Code <kimi-code-cli>",
          "is_bot": false,
          "headline": "chore(release): bump version to 0.8.0",
          "author_name": "Andy",
          "author_login": "WuErPing",
          "committed_at": "2026-06-22T15:18:13Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "2b25a44791b60391d5d58ad02a69ee3012c7d657",
          "body": "Remove unused imports and variables in loop/schedule project count hooks\n(ProjectPathSource, useQueryClient) that caused lint warnings. Fix two\nagent integration tests that used hardcoded /tmp paths for cwd, causing\nTempDir cleanup failures, and add proper agent cleanup via\ndeleteAgentForTest.\n\nCo-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: resolve lint warnings and fix flaky integration tests",
          "author_name": "Andy",
          "author_login": "WuErPing",
          "committed_at": "2026-06-22T03:07:39Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "2497933d6a9aea99a35f5d0100dac7ee5b21c10a",
          "body": "Add colored icons to sidebar navigation items (Sessions=green,\nDashboard=amber, Schedules=blue, Loops=purple, Tmux Dashboard=orange)\non both mobile and desktop. Update project row badges to match:\npane badge→orange, loop badge→purple, schedule badge→blue. Add\niconColor prop to SidebarHeaderRow for custom icon coloring.\n\nCo-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(sidebar): color sidebar icons and align project badge colors",
          "author_name": "Andy",
          "author_login": "WuErPing",
          "committed_at": "2026-06-21T17:15:33Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "a90c09df58ca565d232e6988efb23e10c3961352",
          "body": null,
          "is_bot": false,
          "headline": "Merge branch 'worktree-stateless-inventing-umbrella'",
          "author_name": "Andy",
          "author_login": "WuErPing",
          "committed_at": "2026-06-21T16:44:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a1cd89fa7bc63b265e3f01868ec505eecd06c151",
          "body": "Show loop (Repeat icon, purple) and schedule (Calendar icon, blue)\ncount badges on sidebar project rows, matching the existing agent/pane\nbadge pattern. Clicking a badge navigates to the corresponding page.\n\n- Add generic cwd→project matcher with tilde expansion inferred from\n  project paths (works \n[…]\nheduleCount\n- Wire hooks into left-sidebar and thread badges through sidebar-workspace-list\n- Add unit tests (48 total) and E2E tests (3 tests)\n\nCo-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(sidebar): add loop and schedule count badges to project rows",
          "author_name": "Andy",
          "author_login": "WuErPing",
          "committed_at": "2026-06-21T16:43:27Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e221a43d3912b99ef6dc31608769b1206e6d8d84",
          "body": "Extend the loop update API to support prompt, cwd, verifyChecks, and\nmaxIterations in addition to name and archive. The edit modal on the\nloop detail page now exposes all these fields with validation matching\nthe create form.\n\nCo-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(loop): support editing all fields from the detail page",
          "author_name": "Andy",
          "author_login": "WuErPing",
          "committed_at": "2026-06-21T16:21:50Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "20be7e42c5858f5d96e77ec0e26278e3ea53d364",
          "body": null,
          "is_bot": false,
          "headline": "Merge branch 'worktree-functional-whistling-hearth'",
          "author_name": "Andy",
          "author_login": "WuErPing",
          "committed_at": "2026-06-21T01:53:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "034cb65e38580d3b072627a53351d099365c5252",
          "body": "…ebase\n\nAdd full Codex CLI provider backend following the stdio-based provider\npattern (Pi/Claude). Uses `codex exec --experimental-json` for\nnon-interactive JSON streaming with event translation to protocol\nstream events. Includes unit tests, contract test, and daemon\nregistration.\n\nAlso update README, docs index, components, and analysis docs to\nreflect the current codebase state (v0.7.0).\n\nCo-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(agent): implement Codex provider and update docs for current cod…",
          "author_name": "Andy",
          "author_login": "WuErPing",
          "committed_at": "2026-06-21T01:52:03Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "a21fed6a696248c464d52473f210b7e2749fcbd4",
          "body": "Run Go module tests, lint jobs, and typecheck jobs concurrently instead\nof sequentially. Benchmark showed test-go drops from 75.8s to 59.5s;\ncombined CI time improves ~30-35s. Also adds benchmark results doc.\n\nCo-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "perf(ci): parallelize test-go, lint, and typecheck with xargs -P0",
          "author_name": "Andy",
          "author_login": "WuErPing",
          "committed_at": "2026-06-20T18:39:38Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "b04639d9e75711dcc2e7555eb1442b9e0bed18ec",
          "body": null,
          "is_bot": false,
          "headline": "Merge branch 'worktree-w-feature-deadcode'",
          "author_name": "Andy",
          "author_login": "WuErPing",
          "committed_at": "2026-06-20T18:07:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2e8106bd54f47ca15da1b87d4bfc7796402bba9f",
          "body": "The captureTmuxPane function now returns (string, int, error) to include\npane column width. Update all test call sites to handle the new return.\n\nCo-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(test): update captureTmuxPane calls for new paneCols return value",
          "author_name": "Andy",
          "author_login": "WuErPing",
          "committed_at": "2026-06-20T18:06:57Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "1d0eef8b91242569931a80c16d39d192944e3db6",
          "body": "Fix incorrect findings: TerminalCell/TerminalCursor are used in\nTerminalSnapshot, AgentSessionConfig is used in daemon-client, safeRandomId\nis used in daemon-client-transport. Reclassify 3 daemon-client methods as\nE2E test-only. Update counts from ~127 to ~118 findings.\n\nCo-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: update dead code analysis with re-verification corrections",
          "author_name": "Andy",
          "author_login": "WuErPing",
          "committed_at": "2026-06-20T18:02:38Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "a5629b135e8f817caa9bb95afd38b1ff9b93e989",
          "body": "Co-authored-by: Qoder <noreply@qoder.dev>",
          "is_bot": false,
          "headline": "chore: bump app to 0.7.0, app-bridge to 0.2.3, and update CHANGELOG",
          "author_name": "Andy",
          "author_login": "WuErPing",
          "committed_at": "2026-06-20T17:23:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "855bef416f3d11ff9f4d3e145e204247b9b8e61f",
          "body": "Co-authored-by: Qoder <noreply@qoder.dev>",
          "is_bot": false,
          "headline": "chore: bump app to 0.7.0 and app-bridge to 0.2.3",
          "author_name": "Andy",
          "author_login": "WuErPing",
          "committed_at": "2026-06-20T17:00:42Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8065eeab7f9126cf7854321940118309db3e8d0b",
          "body": "Replace clear()+write() (terminal.reset then async write) with a single\nin-place repaint write (\\x1b[3J\\x1b[H + content + \\x1b[J). xterm no longer\nrenders an empty buffer between reset and write, so the \"Thinking...\" spinner\nupdating each poll no longer flickers the whole 1:1 window.\n\nCo-authored-by: Qoder <noreply@qoder.dev>",
          "is_bot": false,
          "headline": "- fix(terminal): eliminate snapshot flicker with in-place repaint",
          "author_name": "Andy",
          "author_login": "WuErPing",
          "committed_at": "2026-06-20T17:00:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e0f46e17caf3f184c9e0de3ef0e81426b50ae475",
          "body": "…n-DOM 1:1 horizontal scroller\n\n- fix(terminal): make the root div the horizontal scroller so panning works inside the DOM iframe/WebView\n- refactor(terminal): add fitToWidth runtime support and stop requesting rewrapped cols\n- test(tmux): update screen and browser tests for fit-to-width and root-scroller behavior\n- chore(app): add Expo ESLint flat config\n- docs: rework tmux pane handoff for the full-content fit design\n\nCo-authored-by: Qoder <noreply@qoder.dev>",
          "is_bot": false,
          "headline": "- feat(tmux): render full native pane content with scale-to-fit and i…",
          "author_name": "Andy",
          "author_login": "WuErPing",
          "committed_at": "2026-06-20T14:47:42Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "db0c5df895290496e75113200b822c1eec5ca850",
          "body": "- feat(protocol): add paneCols to TmuxCapturePaneResponsePayload\n- feat(terminal): add forceCols and allowHorizontalScroll props to runtime\n- test(tmux): add paneCols hook tests, width toggle screen tests, and browser runtime tests\n- test(e2e): add tmux pane horizontal scroll E2E test\n- feat(agent):\n[…]\nclaude and kimi\n- docs: add analysis docs, tmux pane handoff, and loop schedule spec\n- feat(app): add pending-create-finalize utility and improve error boundary\n\nCo-authored-by: Claude <mimo-v2.5-pro>",
          "is_bot": false,
          "headline": "- feat(tmux): add horizontal scroll toggle for tmux pane xterm screen",
          "author_name": "Andy",
          "author_login": "WuErPing",
          "committed_at": "2026-06-20T11:55:05Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "930675ba3a56caf3155dd490d7cf673767cb7464",
          "body": "Version is now set at build time via -ldflags instead of being hardcoded.\nDev builds default to {tag}-dev-{YYYYMMDDHHMMSS}[-dirty], release builds\ncan override with VERSION=v0.6.5 make solo.\n\nAlso fixes t.Fatal calls in HTTP handler goroutines (test-only).\n\nCo-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(daemon): inject version at build time via ldflags",
          "author_name": "Andy",
          "author_login": "WuErPing",
          "committed_at": "2026-06-18T21:39:42Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "66b40adf86f1e4f11c4a75cde39255a2ab91d9dd",
          "body": "Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: bump version to 0.6.5",
          "author_name": "Andy",
          "author_login": "WuErPing",
          "committed_at": "2026-06-18T21:26:46Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "d2ff7062698fa86c8e2a0bb1b7f2553777e127dd",
          "body": "…setExtendsTimeout\n\nReplace plain int with atomic.Int64 for pingCount, which is written by\nthe HTTP handler goroutine and read by the test goroutine.\n\nCo-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(daemon): fix data race on pingCount in TestConsumeSSE_HeartbeatRe…",
          "author_name": "Andy",
          "author_login": "WuErPing",
          "committed_at": "2026-06-18T21:09:18Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "fbdcb59cee4ee4f9d1097aef52e811de52e33731",
          "body": "…orkflow\n\n- Pass ptmx as parameter to readLoop instead of reading t.ptmx without\n  lock, which raced with Close() setting t.ptmx = nil under lock\n- Add build:workspace-deps step before app typecheck in ci.yml so\n  @getsolo/highlight is available when tsc runs\n\nCo-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(ci): fix data race in readLoop and add missing build step in CI w…",
          "author_name": "Andy",
          "author_login": "WuErPing",
          "committed_at": "2026-06-18T21:01:19Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "0c71040d8a355dc52c9cf910e8ec4ee5bf08ed4d",
          "body": "…iming issues\n\n- Add closed flag to fakeGitCommander to prevent wg.Add/wg.Wait race when\n  background goroutines from IsDirtyCached outlive the test cleanup\n- Increase readUntilAgentUpdateAttention timeout from 10s to 30s for\n  race-detector load\n- Increase TestTerminalManager_KillAll post-KillAll sleep from 100ms to 500ms\n\nCo-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(daemon): fix flaky CI tests — data race in fakeGitCommander and t…",
          "author_name": "Andy",
          "author_login": "WuErPing",
          "committed_at": "2026-06-18T20:50:33Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "c7f08cd05e104a3ac8989f903ba24e2c5bab8dcb",
          "body": "Close() sets t.ptmx = nil under lock while readLoop() reads t.ptmx\nwithout lock. Capture a local reference at loop start so the read\npath never races with Close().\n\nCo-authored-by: opencode <xiaomi-token-plan-cn/mimo-v2.5-pro>",
          "is_bot": false,
          "headline": "fix(daemon): capture local ptmx reference in readLoop to fix data race",
          "author_name": "Andy",
          "author_login": "WuErPing",
          "committed_at": "2026-06-18T19:40:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "16e22552efa65e45654fa65ca2f8a62c4cdca179",
          "body": "Build workspace deps before typecheck to fix missing @getsolo/highlight\non fresh checkouts. Use `make ci` as the pre-commit gate.\n\nCo-authored-by: opencode <xiaomi-token-plan-cn/mimo-v2.5-pro>",
          "is_bot": false,
          "headline": "chore(makefile): add ci target with lint, test, and typecheck",
          "author_name": "Andy",
          "author_login": "WuErPing",
          "committed_at": "2026-06-18T19:25:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "00b81ed59f49228f7cb13d66cf4ade4e8ba9e899",
          "body": "…tests with coverage)\n\n- fix(app): fix pre-existing test failures in composer mock and voice-removal checks\n\nCo-authored-by: opencode <xiaomi-token-plan-cn/mimo-v2.5-pro>",
          "is_bot": false,
          "headline": "- chore(makefile): add test targets mirroring CI (go test + app unit …",
          "author_name": "Andy",
          "author_login": "WuErPing",
          "committed_at": "2026-06-18T19:08:42Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "78a9eef18517546872fc2ce8ca3cc00f6156049c",
          "body": "…tibility\n\n- fix(app): replace removed Github icon with Code in composer\n- fix(app): resolve 45 TypeScript type errors across 18 files\n\nCo-authored-by: claude <mimo-v2.5-pro>",
          "is_bot": false,
          "headline": "- fix(app): upgrade lucide-react-native to ^1.21.0 for React 19 compa…",
          "author_name": "Andy",
          "author_login": "WuErPing",
          "committed_at": "2026-06-18T15:54:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "64928315e433f254c4803a899766821b9f88407c",
          "body": "…sages\n\n- fix(ci): add external_api tag to Go test command for explicit skip\n\nCo-authored-by: Claude Opus 4.7 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "- fix(app): fix TypeScript type errors in pair-scan, _layout, and mes…",
          "author_name": "Andy",
          "author_login": "WuErPing",
          "committed_at": "2026-06-18T14:55:28Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "24a2323dc00ee7db245ddc61bc787bc7196fab34",
          "body": "vitest 4.1.7 in app-bridge conflicted with vitest 3.2.4 in app due to\nnpm hoisting. @vitest/coverage-v8 resolved to the wrong vitest version,\nbreaking BaseCoverageProvider import.\n\nCo-authored-by: Claude Opus 4.7 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(app-bridge): downgrade vitest to ^3.2.4 to match app workspace",
          "author_name": "Andy",
          "author_login": "WuErPing",
          "committed_at": "2026-06-18T14:31:50Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "8fd10720e2e1f0957d07c9ddc4f24673a1bd8c6e",
          "body": "Same pattern as pi integration tests — these depend on local binaries.\n\nCo-authored-by: Claude Opus 4.7 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(daemon): add external_api build tag to kimi and pi provider tests",
          "author_name": "Andy",
          "author_login": "WuErPing",
          "committed_at": "2026-06-18T14:27:51Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "f2b9e6a4e673668fb6033ef1d22fd1c2dcc1c906",
          "body": "These tests depend on the local `pi` binary and fail when it's not\ninstalled. Add !short && !external_api build tags to skip them in CI.\n\nCo-authored-by: Claude Opus 4.7 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(daemon): add external_api build tag to pi integration tests",
          "author_name": "Andy",
          "author_login": "WuErPing",
          "committed_at": "2026-06-18T14:26:47Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "7f432569fed4e28ce1393e7a212d1beac467f558",
          "body": "… in CI\n\n- fix(app): add @getsolo/highlight alias in vitest config for CI resolution\n\nCo-authored-by: Claude Opus 4.7 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "- fix(daemon): add external_api build tag to skip reasoning E2E tests…",
          "author_name": "Andy",
          "author_login": "WuErPing",
          "committed_at": "2026-06-18T14:16:11Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "c2801c824ddec42ec43f6ff7b3169045bcba2cbc",
          "body": "The browser test project requires Playwright chromium which is not\ninstalled in CI. Add --project=unit to skip it.\n\nCo-authored-by: Claude Opus 4.7 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(ci): run only unit tests in app coverage step",
          "author_name": "Andy",
          "author_login": "WuErPing",
          "committed_at": "2026-06-18T12:38:46Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "05f198631ecdd6cb801159dbcd8b25157a61769b",
          "body": "TestClearAgentAttentionResponseAndUpdate was timing out at 5s waiting\nfor the agent_update broadcast after clear_agent_attention. Bump the\ndeadline to 10s to account for async processing latency.\n\nCo-authored-by: Claude Opus 4.7 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(daemon): increase readUntilAgentAttention timeout to fix flaky test",
          "author_name": "Andy",
          "author_login": "WuErPing",
          "committed_at": "2026-06-18T12:33:52Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "785f540e5e92fffa0973de768d3c43f14995de7c",
          "body": "… test mock\n\nThe lucide-react-native mock was missing ChevronDown and ChevronUp,\ncausing 33 tests to fail with \"No export is defined\" error.\n\nCo-authored-by: Claude Opus 4.7 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(app): add missing ChevronDown/ChevronUp icons to tmux-pane-screen…",
          "author_name": "Andy",
          "author_login": "WuErPing",
          "committed_at": "2026-06-18T12:29:06Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "d2d0371d01cb9189d31fd58f671ae339c6546a99",
          "body": "- fix(app): fix lint errors and clean up warnings\n  - move useCallback before early return in tmux-pane-screen to fix rules-of-hooks\n  - ignore @getsolo/highlight in import/no-unresolved (workspace dep not built before lint)\n  - remove unused imports across 8 files\n  - remove unused pad2 function in schedule-create-modal\n  - remove stale eslint-disable directive in ansi-text-renderer test\n  - convert Array<T> to T[] in 4 test files\n\nCo-authored-by: Claude Opus 4.7 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "- fix(protocol): gofmt alignment in RemoveProjectResponse struct",
          "author_name": "Andy",
          "author_login": "WuErPing",
          "committed_at": "2026-06-18T11:55:46Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "66b1d674be381044a1f50ec8a9bc247fb2b1e358",
          "body": "Co-authored-by: qoder <glm-5.2>",
          "is_bot": false,
          "headline": "chore: bump daemon to 0.2.0 and app-bridge to 0.2.1",
          "author_name": "Andy",
          "author_login": "WuErPing",
          "committed_at": "2026-06-18T11:24:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c7924a8c5e18b019ee1606e4e7bd6656e7200db7",
          "body": "…daemon restart\n\n- fix(tmux,daemon): detect version-suffixed agent commands like qodercli-1.0.22\n- fix(sidebar,app): use Solo-managed agent counts instead of tmux CLI panes for agent badge\n- fix(tmux,app): deduplicate pane counts when project has multiple workspaces\n- fix(tmux,app): exclude exited agents from sidebar agent count\n- feat(protocol,app-bridge): add remove_project RPC for bulk workspace removal\n- chore: bump version to 0.6.4\n\nCo-authored-by: qoder <glm-5.2>",
          "is_bot": false,
          "headline": "- fix(workspace,daemon): fix stale git branch names in sidebar after …",
          "author_name": "Andy",
          "author_login": "WuErPing",
          "committed_at": "2026-06-18T11:22:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "882a3cdcff9639b0eaa24718ebe16543b68cf6e6",
          "body": "…ect rows\n\n- feat(tmux): add directory filtering to tmux dashboard with filter banner\n- test(e2e): add tmux pane counts sidebar badge e2e test\n- docs(analysis): add tmux project matcher spec, plan, and architecture review\n- chore: bump version to 0.6.4\n\nCo-authored-by: opencode <xiaomi-token-plan-cn/mimo-v2.5-pro>",
          "is_bot": false,
          "headline": "- feat(sidebar,tmux): add pane and agent count badges to sidebar proj…",
          "author_name": "Andy",
          "author_login": "WuErPing",
          "committed_at": "2026-06-18T06:33:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "daeffbd0f2c891159cbc16e2e62d066cde1098b4",
          "body": "Co-authored-by: opencode <xiaomi-token-plan-cn/mimo-v2.5-pro>",
          "is_bot": false,
          "headline": "chore: bump version to 0.6.3",
          "author_name": "Andy",
          "author_login": "WuErPing",
          "committed_at": "2026-06-17T08:39:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "72e4637274d761cf878536b369b590bd4040889f",
          "body": "…nsistency\n\n- feat(protocol): add LastContentChangeHHMM and LastContentChangeAgo fields\n- feat(daemon): add formatUnixHHMM and formatWindowActivity helpers\n- refactor(app): remove client-side formatHHMM/formatWindowActivity, use daemon strings\n- fix(app): show HH:MM unconditionally outside statusLin\n[…]\nWindowActivity\n- test(app): update mocks to use daemon-provided time strings\n- test(e2e): strengthen HH:MM assertion with ±1min tolerance\n\nCo-authored-by: opencode <xiaomi-token-plan-cn/mimo-v2.5-pro>",
          "is_bot": false,
          "headline": "- refactor(tmux): move time display computation to daemon for data co…",
          "author_name": "Andy",
          "author_login": "WuErPing",
          "committed_at": "2026-06-16T17:51:41Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "8ee124c1f2d8742cdcb15efde7af26b368b630b4",
          "body": "…y time\n\n- Add LastContentChange field to protocol (TmuxPaneInfo, TmuxAgentInfo)\n- Implement hash-based content change detection in daemon (detectAgentActivity)\n- Add 3-second noise filter for window_activity on otherPanes (filterWindowActivity)\n- Add lastContentChange and activity to app-bridge Zod\n[…]\ntentChange descending in frontend\n- Display HH:MM and relative time (\"just now\", \"Xm ago\") on tmux cards\n- Add daemon, frontend unit, and Playwright E2E tests\n\nCo-authored-by: opencode <mimo-v2.5-pro>",
          "is_bot": false,
          "headline": "feat(tmux): sort dashboard by last content change and display activit…",
          "author_name": "Andy",
          "author_login": "WuErPing",
          "committed_at": "2026-06-16T16:51:30Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "121573a5216042724b8237c3e7e97b4327d6b326",
          "body": "…op Automation section, update tmux features and test counts\n\n- docs(analysis, product): update test counts (app 1663, e2e 35), cliutil rename, loop implemented status\n- style(protocol, cli, daemon): fix gofmt/goimports formatting in loop and server files\n\nCo-authored-by: opencode <xiaomi-token-plan-cn/mimo-v2.5-pro>",
          "is_bot": false,
          "headline": "- docs(readme, zh-CN): add Loop Engine to architecture diagram and Lo…",
          "author_name": "Andy",
          "author_login": "WuErPing",
          "committed_at": "2026-06-16T08:38:07Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d5dfcf1951885dfa045017f2511043ee45229195",
          "body": "…ridge, app and CLI\n\n- refactor(cli): rename internal/util to cliutil and consolidate output helpers\n- refactor(daemon): streamline agent providers, manager and relay client internals\n- refactor(relay): clean up metrics, e2ee channel and session management\n- refactor(protocol): normalize schedule and tmux message structures\n- test(daemon,loop): update tests and add Playwright e2e coverage\n\nCo-authored-by: opencode <xiaomi-token-plan-cn/mimo-v2.5-pro>",
          "is_bot": false,
          "headline": "- feat(loop): add end-to-end loop CRUD across protocol, daemon, app-b…",
          "author_name": "Andy",
          "author_login": "WuErPing",
          "committed_at": "2026-06-16T07:53:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3b9148f002ed54e4fe632352574cf43672723bd6",
          "body": "…mon, app-bridge and app\n\n- feat(tmux): add stale entry cleanup on rescan via DeleteByAgentName before Merge\n- refactor(tmux): simplify extractAgentLaunchCmd to ps-only, remove pane scrollback code\n\nPane scrollback (capture-pane -e) was unreliable for TUI agents that use\nthe alternate screen buffer \n[…]\nnsiRe, and\npaneID parameter from extractAgentLaunchCmd. The ps-based approach via\nfindAgentDescendant remains the single source of truth.\n\nCo-authored-by: opencode <xiaomi-token-plan-cn/mimo-v2.5-pro>",
          "is_bot": false,
          "headline": "- feat(tmux): add delete command history support across protocol, dae…",
          "author_name": "Andy",
          "author_login": "WuErPing",
          "committed_at": "2026-06-15T18:26:02Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d3678b8c5ba8030b8c7fe8500f1a4691913e77db",
          "body": "…-layer cascade fix - Strip ANSI SGR/OSC codes from capture-pane -e output before regex matching - Add isSuspiciousPsArgs heuristic and agentNameByPrefix fallback (kimi-code → kimi) - Upgrade bare ps result from pane scrollback when flags are present - Add isStaleLaunchCmd (suspicious + LookPath) cl\n[…]\n for launch-cmd detection, ANSI stripping, prefix matching, load cleanup - docs(analysis): add deep-dive on kimi→kimi-code cascade failure and defense-in-depth fix\n\nCo-authored-by: Qoder <qoder-agent>",
          "is_bot": false,
          "headline": "- fix(tmux): resolve kimi --yolo misidentified as kimi-code via eight…",
          "author_name": "Andy",
          "author_login": "WuErPing",
          "committed_at": "2026-06-15T08:15:09Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b2429322f6fbd871d1660c37d9c49a6d3ec52f9b",
          "body": "…ridge and app\n\n- feat(tmux-dashboard): add close button to agent/pane cards with confirmation dialog\n- feat(tmux-dashboard): add run confirmation and agents tab switch on history run\n- test(e2e): add Playwright tests for tmux close-session flow\n\nCo-authored-by: opencode <xiaomi-token-plan-cn/mimo-v2.5-pro>",
          "is_bot": false,
          "headline": "- feat(tmux): add kill-session support across protocol, daemon, app-b…",
          "author_name": "Andy",
          "author_login": "WuErPing",
          "committed_at": "2026-06-14T18:52:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6987dd135fd993e1472a4d90e1b01a7ed8c5bf10",
          "body": "Co-authored-by: opencode <xiaomi-token-plan-cn/mimo-v2.5-pro>",
          "is_bot": false,
          "headline": "docs: update tmux features, test counts, and terminal themes across docs",
          "author_name": "Andy",
          "author_login": "WuErPing",
          "committed_at": "2026-06-14T17:51:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c3088ee990daf8b1eaebf6c81d7cf96631d19f87",
          "body": "Co-authored-by: opencode <xiaomi-token-plan-cn/mimo-v2.5-pro>",
          "is_bot": false,
          "headline": "docs(readme): update test counts and tmux dashboard features",
          "author_name": "Andy",
          "author_login": "WuErPing",
          "committed_at": "2026-06-14T17:47:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ef7b7db8dc6c64d718cd4c4ab0936d7a33c34fa2",
          "body": "Co-authored-by: opencode <xiaomi-token-plan-cn/mimo-v2.5-pro>",
          "is_bot": false,
          "headline": "feat(tmux): add new session creation from dashboard",
          "author_name": "Andy",
          "author_login": "WuErPing",
          "committed_at": "2026-06-14T17:42:07Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "89d0fc99f08a85f91bd6606e214be0b3982ed5be",
          "body": "- Extract full launch command (with flags) via pgrep + ps -o args=\n- Persist deduplicated command history to ~/.solo/agent-commands.json\n- Add History tab to tmux dashboard with copy-to-clipboard\n- Add history command picker in tmux pane Send view\n\nCo-authored-by: opencode <xiaomi-token-plan-cn/mimo-v2.5-pro>",
          "is_bot": false,
          "headline": "feat(tmux): add coding agent command history tracking and display",
          "author_name": "Andy",
          "author_login": "WuErPing",
          "committed_at": "2026-06-14T16:51:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "47f2720a5afa3e5a5ec3851fe38775f34a8392db",
          "body": "- Extend tmux/list_agents RPC to return non-agent panes as otherPanes\n- Add TmuxPaneInfo protocol type and Zod schema with null-safe defaults\n- Fix Go nil slice JSON encoding (null → []) with make([]T, 0)\n- Add \"Other Panes\" tab with command-name NameCard grouping and filtering\n- Extend TmuxAgentSto\n[…]\nxPane union type\n- Handle missing agentName in tmux-pane-screen for non-agent panes\n- Add tests for otherPanes parsing, command grouping, and tab switching\n\nCo-authored-by: claude-code <mimo-v2.5-pro>",
          "is_bot": false,
          "headline": "feat(tmux): add non-agent pane display to tmux dashboard",
          "author_name": "Andy",
          "author_login": "WuErPing",
          "committed_at": "2026-06-14T15:30:08Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f9416b3cf62f0f3b2df206339bcbfd8947df1a3f",
          "body": "…to themes\n\n- feat(terminal): add Bash preset and auto theme with OSC 10/11 default colors\n- feat(terminal): parse default colors from pane content via OSC sequences\n- feat(terminal): apply minimum contrast adjustment to ANSI-rendered text\n- refactor(terminal): simplify resolveTerminalColors to syst\n[…]\nst, and OSC parsing\n- docs(product): add roadmap, feature directions, and loop schedule design docs\n- chore(app): bump version to 0.6.1\n- chore: update .gitignore\n\nCo-authored-by: kimi <kimi-code-cli>",
          "is_bot": false,
          "headline": "feat(tmux): move terminal color detection to frontend and add Bash/au…",
          "author_name": "Andy",
          "author_login": "WuErPing",
          "committed_at": "2026-06-14T10:51:07Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "19d11d6a4d82f39371bdae666663262ce559f9d2",
          "body": "- docs(readme, architecture, product, providers): update provider roster, CI pipeline, tmux themes, schedule modules and test counts\n- docs(solo-dev-base): bump skill version, update repo map, providers, recent architecture changes and CI\n- docs(agents): add documentation index pointer\n- docs(testing): update app unit test count to 1617\n\nCo-authored-by: kimi <kimi-k2.5>",
          "is_bot": false,
          "headline": "docs: sync docs, skill and rules with current codebase",
          "author_name": "Andy",
          "author_login": "WuErPing",
          "committed_at": "2026-06-13T04:05:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "45e7d73b5bae091a7bf42799c1a4f558c96be92f",
          "body": "- refactor(tmux-pane): extract terminal color resolution to resolveTerminalColors\n- refactor(terminal-themes): simplify theme presets to system/dark/light/tmux\n- fix(agent): sort provider model variants for deterministic test output\n- test(agent): add manager_config, provider_claude_translate, provi\n[…]\nndlers tests\n- docs: consolidate coverage/tmux/product docs, delete 11 stale files, update indexes\n- chore: add .codegraph/ to .gitignore\n\nCo-authored-by: opencode <xiaomi-token-plan-cn/mimo-v2.5-pro>",
          "is_bot": false,
          "headline": "- feat(tmux-pane): add slash command filtering and tmux theme support",
          "author_name": "Andy",
          "author_login": "WuErPing",
          "committed_at": "2026-06-12T10:31:16Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c36fb2bb7da7adbb1fac9c374cc393d06bb664a8",
          "body": "…tines\n\n- perf(tmux): coalesce concurrent capture-pane requests via singleflight\n\nCo-authored-by: claude <claude-opus-4-7>",
          "is_bot": false,
          "headline": "- perf(tmux): parallelize extractTmuxStatusLine with concurrent gorou…",
          "author_name": "Andy",
          "author_login": "WuErPing",
          "committed_at": "2026-06-10T19:04:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4b00f562d62d73bacb2d76a6c12afc1e8796f063",
          "body": "- perf(tmux): batch child process detection to reduce N+1 subprocess calls\n\nCo-authored-by: claude <claude-opus-4-7>",
          "is_bot": false,
          "headline": "- refactor(tmux): add subprocess timeouts to prevent goroutine blocking",
          "author_name": "Andy",
          "author_login": "WuErPing",
          "committed_at": "2026-06-10T18:22:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d04802dfee1a5932afdbbfe417506d5fbf8fe1d5",
          "body": "…m host page to general settings\n\n- feat(tmux): detect exited agents via title-only match and add status field\n- chore: add eslint-plugin-complexity, remove expo-audio, update .gitignore\n- docs: add agent-send-presets design doc\n\nCo-authored-by: Trae CLI <glm-5.1>",
          "is_bot": false,
          "headline": "- refactor(settings): move Providers, Operations, and Tmux agents fro…",
          "author_name": "Andy",
          "author_login": "WuErPing",
          "committed_at": "2026-06-10T13:57:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9e1c11c54a91db62bc8434101c016949853a5908",
          "body": "Co-authored-by: opencode <mimo-v2.5-pro>",
          "is_bot": false,
          "headline": "chore(version): bump app to 0.6.0 with changelog",
          "author_name": "Andy",
          "author_login": "WuErPing",
          "committed_at": "2026-06-09T17:15:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        }
      ],
      "releases_count": 5,
      "commits_last_year": 194,
      "latest_release_at": "2026-07-16T12:44:01Z",
      "latest_release_tag": "v0.11.0",
      "releases_from_tags": true,
      "days_since_last_push": 4,
      "active_weeks_last_year": 10,
      "days_since_latest_release": 5,
      "mean_days_between_releases": 9.2
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": false,
      "health_percentage": 42,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": false
    },
    "ecosystem": {
      "packages": [
        {
          "name": "github.com/WuErPing/solo",
          "exists": true,
          "license": null,
          "keywords": [],
          "ecosystem": "go",
          "matches_repo": true,
          "registry_url": "https://pkg.go.dev/github.com/WuErPing/solo",
          "is_deprecated": false,
          "latest_version": "v0.11.0",
          "repository_url": "https://github.com/WuErPing/solo",
          "versions_count": 5,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": null,
          "first_published_at": null,
          "latest_published_at": "2026-07-16T12:44:01Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 5
        }
      ]
    },
    "popularity": {
      "forks": 1,
      "stars": 5,
      "watchers": 0,
      "fork_history": {
        "days": [
          {
            "date": "2026-06-22",
            "count": 1
          }
        ],
        "complete": true,
        "collected": 1,
        "total_forks": 1
      },
      "star_history": {
        "days": [
          {
            "date": "2026-06-06",
            "count": 1
          },
          {
            "date": "2026-06-08",
            "count": 2
          },
          {
            "date": "2026-06-14",
            "count": 1
          },
          {
            "date": "2026-06-22",
            "count": 1
          }
        ],
        "complete": true,
        "collected": 5,
        "total_stars": 5
      },
      "open_issues_and_prs": 0
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [],
      "has_llms_txt": false,
      "has_dockerfile": false,
      "has_mcp_signal": false,
      "bootstrap_files": [
        "Makefile"
      ],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [
        "app-bridge/tsconfig.json",
        "app/tsconfig.json",
        "packages/highlight/tsconfig.json",
        "tsconfig.json"
      ],
      "toolchain_manifests": [
        "cli/go.mod",
        "daemon/go.mod",
        "docs/analysis/demo/iterm2-agent-detection/go.mod",
        "protocol/go.mod",
        "relay-go/go.mod"
      ],
      "largest_source_bytes": 127261,
      "source_files_sampled": 1313,
      "oversized_source_files": 10,
      "agent_instruction_files": [
        "AGENTS.md",
        "CLAUDE.md"
      ],
      "agent_instruction_max_bytes": 4724
    },
    "dependencies": {
      "manifests": [
        "app-bridge/package.json",
        "app/Gemfile",
        "app/package.json",
        "cli/go.mod",
        "daemon/go.mod",
        "package.json",
        "protocol/go.mod",
        "relay-go/go.mod"
      ],
      "advisories": {
        "error": null,
        "scope": null,
        "source": null,
        "findings": [],
        "collected": false,
        "malicious": [],
        "truncated": false,
        "by_severity": {},
        "advisory_count": 0,
        "affected_count": 0,
        "assessed_count": 0,
        "malicious_count": 0,
        "assessed_package": null,
        "unassessed_count": 0,
        "direct_affected_count": 0
      },
      "ecosystems": [
        "go",
        "npm",
        "rubygems"
      ],
      "dependencies": [
        {
          "name": "base64-js",
          "manifest": "app-bridge/package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.5.1"
        },
        {
          "name": "tweetnacl",
          "manifest": "app-bridge/package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.0.3"
        },
        {
          "name": "zod",
          "manifest": "app-bridge/package.json",
          "ecosystem": "npm",
          "version_constraint": "^3.23.8"
        },
        {
          "name": "fastlane",
          "manifest": "app/Gemfile",
          "ecosystem": "rubygems",
          "version_constraint": null
        },
        {
          "name": "@dnd-kit/core",
          "manifest": "app/package.json",
          "ecosystem": "npm",
          "version_constraint": "^6.3.1"
        },
        {
          "name": "@dnd-kit/sortable",
          "manifest": "app/package.json",
          "ecosystem": "npm",
          "version_constraint": "^10.0.0"
        },
        {
          "name": "@dnd-kit/utilities",
          "manifest": "app/package.json",
          "ecosystem": "npm",
          "version_constraint": "^3.2.2"
        },
        {
          "name": "@floating-ui/react-native",
          "manifest": "app/package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.10.7"
        },
        {
          "name": "@getsolo/highlight",
          "manifest": "app/package.json",
          "ecosystem": "npm",
          "version_constraint": "*"
        },
        {
          "name": "@gorhom/bottom-sheet",
          "manifest": "app/package.json",
          "ecosystem": "npm",
          "version_constraint": "^5.2.6"
        },
        {
          "name": "@gorhom/portal",
          "manifest": "app/package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.0.14"
        },
        {
          "name": "@react-native-async-storage/async-storage",
          "manifest": "app/package.json",
          "ecosystem": "npm",
          "version_constraint": "2.2.0"
        },
        {
          "name": "@react-native-masked-view/masked-view",
          "manifest": "app/package.json",
          "ecosystem": "npm",
          "version_constraint": "0.3.2"
        },
        {
          "name": "@react-native/normalize-colors",
          "manifest": "app/package.json",
          "ecosystem": "npm",
          "version_constraint": "0.86.0"
        },
        {
          "name": "@react-navigation/native",
          "manifest": "app/package.json",
          "ecosystem": "npm",
          "version_constraint": "^7.3.4"
        },
        {
          "name": "@tanstack/react-query",
          "manifest": "app/package.json",
          "ecosystem": "npm",
          "version_constraint": "^5.90.11"
        },
        {
          "name": "@tanstack/react-virtual",
          "manifest": "app/package.json",
          "ecosystem": "npm",
          "version_constraint": "^3.13.21"
        },
        {
          "name": "@xterm/addon-clipboard",
          "manifest": "app/package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.2.0"
        },
        {
          "name": "@xterm/addon-fit",
          "manifest": "app/package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.11.0"
        },
        {
          "name": "@xterm/addon-image",
          "manifest": "app/package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.9.0"
        },
        {
          "name": "@xterm/addon-ligatures",
          "manifest": "app/package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.10.0"
        },
        {
          "name": "@xterm/addon-search",
          "manifest": "app/package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.16.0"
        },
        {
          "name": "@xterm/addon-unicode11",
          "manifest": "app/package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.9.0"
        },
        {
          "name": "@xterm/addon-web-links",
          "manifest": "app/package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.12.0"
        },
        {
          "name": "@xterm/addon-webgl",
          "manifest": "app/package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.19.0"
        },
        {
          "name": "@xterm/xterm",
          "manifest": "app/package.json",
          "ecosystem": "npm",
          "version_constraint": "^6.0.0"
        },
        {
          "name": "base64-js",
          "manifest": "app/package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.5.1"
        },
        {
          "name": "buffer",
          "manifest": "app/package.json",
          "ecosystem": "npm",
          "version_constraint": "^6.0.3"
        },
        {
          "name": "expo",
          "manifest": "app/package.json",
          "ecosystem": "npm",
          "version_constraint": "^57"
        },
        {
          "name": "expo-asset",
          "manifest": "app/package.json",
          "ecosystem": "npm",
          "version_constraint": "~57.0.5"
        },
        {
          "name": "expo-build-properties",
          "manifest": "app/package.json",
          "ecosystem": "npm",
          "version_constraint": "~57.0.5"
        },
        {
          "name": "expo-camera",
          "manifest": "app/package.json",
          "ecosystem": "npm",
          "version_constraint": "~57.0.2"
        },
        {
          "name": "expo-clipboard",
          "manifest": "app/package.json",
          "ecosystem": "npm",
          "version_constraint": "~57.0.1"
        },
        {
          "name": "expo-constants",
          "manifest": "app/package.json",
          "ecosystem": "npm",
          "version_constraint": "~57.0.5"
        },
        {
          "name": "expo-crypto",
          "manifest": "app/package.json",
          "ecosystem": "npm",
          "version_constraint": "~57.0.1"
        },
        {
          "name": "expo-dev-client",
          "manifest": "app/package.json",
          "ecosystem": "npm",
          "version_constraint": "~57.0.6"
        },
        {
          "name": "expo-file-system",
          "manifest": "app/package.json",
          "ecosystem": "npm",
          "version_constraint": "~57.0.1"
        },
        {
          "name": "expo-haptics",
          "manifest": "app/package.json",
          "ecosystem": "npm",
          "version_constraint": "~57.0.1"
        },
        {
          "name": "expo-image",
          "manifest": "app/package.json",
          "ecosystem": "npm",
          "version_constraint": "~57.0.1"
        },
        {
          "name": "expo-image-picker",
          "manifest": "app/package.json",
          "ecosystem": "npm",
          "version_constraint": "~57.0.4"
        },
        {
          "name": "expo-keep-awake",
          "manifest": "app/package.json",
          "ecosystem": "npm",
          "version_constraint": "~57.0.1"
        },
        {
          "name": "expo-linking",
          "manifest": "app/package.json",
          "ecosystem": "npm",
          "version_constraint": "~57.0.3"
        },
        {
          "name": "expo-notifications",
          "manifest": "app/package.json",
          "ecosystem": "npm",
          "version_constraint": "~57.0.5"
        },
        {
          "name": "expo-router",
          "manifest": "app/package.json",
          "ecosystem": "npm",
          "version_constraint": "~57.0.6"
        },
        {
          "name": "expo-sharing",
          "manifest": "app/package.json",
          "ecosystem": "npm",
          "version_constraint": "~57.0.5"
        },
        {
          "name": "expo-splash-screen",
          "manifest": "app/package.json",
          "ecosystem": "npm",
          "version_constraint": "~57.0.4"
        },
        {
          "name": "expo-system-ui",
          "manifest": "app/package.json",
          "ecosystem": "npm",
          "version_constraint": "~57.0.1"
        },
        {
          "name": "expo-updates",
          "manifest": "app/package.json",
          "ecosystem": "npm",
          "version_constraint": "~57.0.7"
        },
        {
          "name": "fast-deep-equal",
          "manifest": "app/package.json",
          "ecosystem": "npm",
          "version_constraint": "^3.1.3"
        },
        {
          "name": "lucide-react-native",
          "manifest": "app/package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.21.0"
        },
        {
          "name": "mnemonic-id",
          "manifest": "app/package.json",
          "ecosystem": "npm",
          "version_constraint": "^3.2.7"
        },
        {
          "name": "qrcode",
          "manifest": "app/package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.5.4"
        },
        {
          "name": "react",
          "manifest": "app/package.json",
          "ecosystem": "npm",
          "version_constraint": "19.2.3"
        },
        {
          "name": "react-dom",
          "manifest": "app/package.json",
          "ecosystem": "npm",
          "version_constraint": "19.2.3"
        },
        {
          "name": "react-native",
          "manifest": "app/package.json",
          "ecosystem": "npm",
          "version_constraint": "0.86.0"
        },
        {
          "name": "react-native-draggable-flatlist",
          "manifest": "app/package.json",
          "ecosystem": "npm",
          "version_constraint": "^4.0.3"
        },
        {
          "name": "react-native-edge-to-edge",
          "manifest": "app/package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.7.0"
        },
        {
          "name": "react-native-gesture-handler",
          "manifest": "app/package.json",
          "ecosystem": "npm",
          "version_constraint": "~2.32.0"
        },
        {
          "name": "react-native-keyboard-controller",
          "manifest": "app/package.json",
          "ecosystem": "npm",
          "version_constraint": "1.21.9"
        },
        {
          "name": "react-native-markdown-display",
          "manifest": "app/package.json",
          "ecosystem": "npm",
          "version_constraint": "^7.0.2"
        },
        {
          "name": "react-native-nitro-modules",
          "manifest": "app/package.json",
          "ecosystem": "npm",
          "version_constraint": "0.35.5"
        },
        {
          "name": "react-native-reanimated",
          "manifest": "app/package.json",
          "ecosystem": "npm",
          "version_constraint": "4.5.0"
        },
        {
          "name": "react-native-safe-area-context",
          "manifest": "app/package.json",
          "ecosystem": "npm",
          "version_constraint": "~5.7.0"
        },
        {
          "name": "react-native-screens",
          "manifest": "app/package.json",
          "ecosystem": "npm",
          "version_constraint": "4.25.2"
        },
        {
          "name": "react-native-svg",
          "manifest": "app/package.json",
          "ecosystem": "npm",
          "version_constraint": "15.15.4"
        },
        {
          "name": "react-native-unistyles",
          "manifest": "app/package.json",
          "ecosystem": "npm",
          "version_constraint": "^3.0.15"
        },
        {
          "name": "react-native-web",
          "manifest": "app/package.json",
          "ecosystem": "npm",
          "version_constraint": "~0.21.0"
        },
        {
          "name": "react-native-webview",
          "manifest": "app/package.json",
          "ecosystem": "npm",
          "version_constraint": "13.16.1"
        },
        {
          "name": "react-native-worklets",
          "manifest": "app/package.json",
          "ecosystem": "npm",
          "version_constraint": "0.10.0"
        },
        {
          "name": "tiny-invariant",
          "manifest": "app/package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.3.3"
        },
        {
          "name": "tweetnacl",
          "manifest": "app/package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.0.3"
        },
        {
          "name": "use-sync-external-store",
          "manifest": "app/package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.6.0"
        },
        {
          "name": "zod",
          "manifest": "app/package.json",
          "ecosystem": "npm",
          "version_constraint": "^3.23.8"
        },
        {
          "name": "zustand",
          "manifest": "app/package.json",
          "ecosystem": "npm",
          "version_constraint": "^5.0.9"
        },
        {
          "name": "github.com/WuErPing/solo/protocol",
          "manifest": "cli/go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.0.0-00010101000000-000000000000"
        },
        {
          "name": "github.com/fatih/color",
          "manifest": "cli/go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.19.0"
        },
        {
          "name": "github.com/google/uuid",
          "manifest": "cli/go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.6.0"
        },
        {
          "name": "github.com/gorilla/websocket",
          "manifest": "cli/go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.5.3"
        },
        {
          "name": "github.com/skip2/go-qrcode",
          "manifest": "cli/go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.0.0-20200617195104-da1b6568686e"
        },
        {
          "name": "github.com/spf13/cobra",
          "manifest": "cli/go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.10.2"
        },
        {
          "name": "golang.org/x/crypto",
          "manifest": "cli/go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.51.0"
        },
        {
          "name": "gopkg.in/yaml.v3",
          "manifest": "cli/go.mod",
          "ecosystem": "go",
          "version_constraint": "v3.0.1"
        },
        {
          "name": "github.com/BurntSushi/toml",
          "manifest": "daemon/go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.6.0"
        },
        {
          "name": "github.com/WuErPing/solo/protocol",
          "manifest": "daemon/go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.0.0"
        },
        {
          "name": "github.com/creack/pty",
          "manifest": "daemon/go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.1.21"
        },
        {
          "name": "github.com/google/uuid",
          "manifest": "daemon/go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.6.0"
        },
        {
          "name": "github.com/gorilla/websocket",
          "manifest": "daemon/go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.5.3"
        },
        {
          "name": "github.com/prometheus/client_golang",
          "manifest": "daemon/go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.23.2"
        },
        {
          "name": "github.com/prometheus/client_model",
          "manifest": "daemon/go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.6.2"
        },
        {
          "name": "github.com/robfig/cron/v3",
          "manifest": "daemon/go.mod",
          "ecosystem": "go",
          "version_constraint": "v3.0.1"
        },
        {
          "name": "golang.org/x/crypto",
          "manifest": "daemon/go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.50.0"
        },
        {
          "name": "golang.org/x/sync",
          "manifest": "daemon/go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.21.0"
        },
        {
          "name": "gopkg.in/yaml.v3",
          "manifest": "daemon/go.mod",
          "ecosystem": "go",
          "version_constraint": "v3.0.1"
        },
        {
          "name": "github.com/WuErPing/solo/protocol",
          "manifest": "relay-go/go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.0.0"
        },
        {
          "name": "github.com/gorilla/websocket",
          "manifest": "relay-go/go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.5.3"
        },
        {
          "name": "github.com/prometheus/client_golang",
          "manifest": "relay-go/go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.23.2"
        },
        {
          "name": "golang.org/x/crypto",
          "manifest": "relay-go/go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.51.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": 1,
        "open_issues": 0,
        "closed_ratio": null,
        "closed_issues": 0,
        "closed_unmerged_prs": 0
      },
      "bus_factor": 1,
      "bot_contributors": 0,
      "top_contributors": [
        {
          "type": "User",
          "login": "WuErPing",
          "commits": 194,
          "avatar_url": "https://avatars.githubusercontent.com/u/2055091?v=4"
        }
      ],
      "contributors_sampled": 1,
      "top_contributor_share": 1
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "ci.yml",
        "e2e-nightly.yml"
      ],
      "has_docs_dir": true,
      "linter_configs": [
        ".golangci.yml",
        "eslint.config.js",
        "eslint.config.mjs"
      ],
      "has_editorconfig": false,
      "has_linter_config": true,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [
        "go.sum",
        "package-lock.json"
      ],
      "scorecard": {
        "checks": [
          {
            "name": "Binary-Artifacts",
            "score": 10,
            "reason": "no binaries found in the repo",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
          },
          {
            "name": "Branch-Protection",
            "score": 0,
            "reason": "branch protection not enabled on development/release branches",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
          },
          {
            "name": "CI-Tests",
            "score": null,
            "reason": "no pull request found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#ci-tests"
          },
          {
            "name": "CII-Best-Practices",
            "score": 0,
            "reason": "no effort to earn an OpenSSF best practices badge detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#cii-best-practices"
          },
          {
            "name": "Code-Review",
            "score": 0,
            "reason": "Found 0/30 approved changesets -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 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": 0,
            "reason": "project was created within the last 90 days. Please review its contents carefully",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
          },
          {
            "name": "Packaging",
            "score": null,
            "reason": "packaging workflow not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
          },
          {
            "name": "Pinned-Dependencies",
            "score": 3,
            "reason": "dependency not pinned by hash detected -- score normalized to 3",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
          },
          {
            "name": "SAST",
            "score": 0,
            "reason": "no SAST tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
          },
          {
            "name": "Security-Policy",
            "score": 0,
            "reason": "security policy file not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
          },
          {
            "name": "Signed-Releases",
            "score": null,
            "reason": "no releases found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
          },
          {
            "name": "Token-Permissions",
            "score": 10,
            "reason": "GitHub workflow tokens follow principle of least privilege",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
          },
          {
            "name": "Vulnerabilities",
            "score": 0,
            "reason": "21 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "5a37859ae7aaacded228bdb6281524ed939f3417",
        "ran_at": "2026-07-22T06:48:57Z",
        "aggregate_score": 3.2,
        "scorecard_version": "v5.5.0"
      },
      "has_codeql_workflow": false,
      "has_security_policy": false,
      "has_dependabot_config": false
    },
    "contribution_flow": {
      "collected": true,
      "ci_last_run_at": "2026-07-22T05:21:03Z",
      "oldest_open_prs": [],
      "last_merged_pr_at": "2026-06-07T12:57:25Z",
      "ci_last_conclusion": "FAILURE",
      "oldest_open_issues": []
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/WuErPing/solo",
    "host": "github.com",
    "name": "solo",
    "owner": "WuErPing"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "moderate",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 55,
      "inputs": {
        "security": 32,
        "vitality": 72,
        "community": 29,
        "governance": 54,
        "engineering": 78
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "good",
        "name": "Vitality",
        "value": 72,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "moderate",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 61,
            "inputs": {
              "commits_last_year": 194,
              "human_commit_share": 1,
              "days_since_last_push": 4,
              "active_weeks_last_year": 10
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 4 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 4
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "10/52 weeks with commits",
                "points": 6.9,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 10
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "194 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 194
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "project was created within the last 90 days. Please review its contents carefully",
                "points": 0,
                "status": "missed",
                "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": 88,
            "inputs": {
              "releases_count": 5,
              "latest_release_tag": "v0.11.0",
              "releases_from_tags": true,
              "days_since_latest_release": 5,
              "mean_days_between_releases": 9.2
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "5 version tags (no GitHub releases)",
                "points": 16.2,
                "status": "partial",
                "details": [
                  {
                    "code": "version_tags_no_releases",
                    "params": {
                      "count": 5
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 5 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 5
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~9.2 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 9.2
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "openssf_scorecard_signed_releases",
                "name": "OpenSSF Scorecard: Signed-Releases",
                "detail": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 10
              }
            ]
          },
          {
            "key": "abandonment",
            "band": "excellent",
            "name": "Abandonment",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "cap": null,
              "state": "unverified",
              "guards": [],
              "signals": [],
              "red_flag": false,
              "multiplier_pct": 100,
              "declared_reason": null,
              "unverified_reason": "repository_too_young",
              "unanswered_open_prs": null,
              "unanswered_open_issues": null,
              "days_since_last_merged_pr": null,
              "days_since_last_human_commit": null,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "maintenance record not established from the collected data",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_unverified",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "critical",
        "name": "Community & Adoption",
        "value": 29,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "critical",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 10,
            "inputs": {
              "forks": 1,
              "stars": 5,
              "watchers": 0,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "below_threshold"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "5 stars",
                "points": 9.8,
                "status": "partial",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 5
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "1 forks",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "0 watchers",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "moderate",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 50,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "has_contributing": false,
              "has_issue_template": false,
              "has_code_of_conduct": false,
              "has_pull_request_template": false
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 22.5,
                "status": "met",
                "details": [],
                "max_points": 22.5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "recognized license (MIT)",
                "points": 22.5,
                "status": "met",
                "details": [
                  {
                    "code": "license_standard",
                    "params": {}
                  },
                  {
                    "code": "license_spdx",
                    "params": {
                      "spdx": "MIT"
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributing_guide",
                "name": "CONTRIBUTING guide",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 18
              },
              {
                "key": "code_of_conduct",
                "name": "Code of conduct",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 13.5
              },
              {
                "key": "issue_template",
                "name": "Issue template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.2
              },
              {
                "key": "pr_template",
                "name": "PR template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.3
              }
            ]
          }
        ],
        "description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
      },
      {
        "key": "governance",
        "band": "moderate",
        "name": "Sustainability & Governance",
        "value": 54,
        "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": "Excluded from scoring (no data or not applicable): Issue resolution. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "issue_resolution"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 72,
            "inputs": {
              "merged_prs": 1,
              "open_issues": 0,
              "closed_issues": 0,
              "issue_closed_ratio": null,
              "closed_unmerged_prs": 0
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "no issues or no data",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_issues_or_data",
                    "params": {}
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "1/1 decided PRs merged",
                "points": 38.2,
                "status": "met",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 1,
                      "decided": 1
                    }
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 0/30 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "moderate",
            "name": "Ownership & stewardship",
            "note": "Excluded from scoring (no data or not applicable): Verified domain. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "verified_domain"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 54,
            "inputs": {
              "followers": 14,
              "owner_type": "User",
              "is_verified": null,
              "owner_login": "WuErPing",
              "public_repos": 85,
              "account_age_days": 5107
            },
            "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": "14 followers of WuErPing",
                "points": 8.5,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 14,
                      "login": "WuErPing"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "85 public repos, account ~13 yr old",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 85
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 13
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "excellent",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "github.com/WuErPing/solo"
              ],
              "ecosystems": "go",
              "any_deprecated": false,
              "min_days_since_publish": 5
            },
            "components": [
              {
                "key": "published_resolvable",
                "name": "Published & resolvable",
                "detail": "1 package(s) on go",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "packages_published",
                    "params": {
                      "count": 1,
                      "ecosystems": "go"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "publish_recency",
                "name": "Publish recency",
                "detail": "latest publish 5 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 5
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "5 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 5
                    }
                  }
                ],
                "max_points": 20
              },
              {
                "key": "not_deprecated",
                "name": "Not deprecated",
                "detail": "active, not deprecated or yanked",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "package_not_deprecated",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          }
        ],
        "description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?"
      },
      {
        "key": "engineering",
        "band": "good",
        "name": "Engineering Quality",
        "value": 78,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "good",
            "name": "Engineering practices",
            "note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: CI-Tests. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "openssf_scorecard_ci_tests"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 80,
            "inputs": {
              "has_ci": true,
              "has_tests": true,
              "has_editorconfig": false,
              "has_linter_config": true,
              "has_precommit_config": false
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": "2 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 2
                    }
                  }
                ],
                "max_points": 24
              },
              {
                "key": "tests_present",
                "name": "Tests present",
                "detail": null,
                "points": 24,
                "status": "met",
                "details": [],
                "max_points": 24
              },
              {
                "key": "linter_config",
                "name": "Linter config",
                "detail": ".golangci.yml, eslint.config.js, eslint.config.mjs",
                "points": 16,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": ".golangci.yml, eslint.config.js, eslint.config.mjs"
                    }
                  }
                ],
                "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": "no pull request found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "good",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 75,
            "inputs": {
              "topics": [],
              "has_wiki": true,
              "homepage": null,
              "has_readme": true,
              "has_docs_dir": true,
              "has_description": true
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 30,
                "status": "met",
                "details": [],
                "max_points": 30
              },
              {
                "key": "documentation_directory",
                "name": "Documentation directory",
                "detail": null,
                "points": 25,
                "status": "met",
                "details": [],
                "max_points": 25
              },
              {
                "key": "documentation_homepage_site",
                "name": "Documentation / homepage site",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "repository_description",
                "name": "Repository description",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "topics",
                "name": "Topics",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              },
              {
                "key": "wiki",
                "name": "Wiki",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          }
        ],
        "description": "Are baseline engineering and documentation practices in place?"
      },
      {
        "key": "security",
        "band": "at_risk",
        "name": "Security",
        "value": 32,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "at_risk",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): CI-Tests, Packaging, Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "ci_tests",
                    "packaging",
                    "signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 32,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 15,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 3,
              "scorecard_aggregate": 3.2
            },
            "components": [
              {
                "key": "binary_artifacts",
                "name": "Binary-Artifacts",
                "detail": "no binaries found in the repo",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "branch_protection",
                "name": "Branch-Protection",
                "detail": "branch protection not enabled on development/release branches",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "ci_tests",
                "name": "CI-Tests",
                "detail": "no pull request found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 2.5
              },
              {
                "key": "cii_best_practices",
                "name": "CII-Best-Practices",
                "detail": "no effort to earn an OpenSSF best practices badge detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "code_review",
                "name": "Code-Review",
                "detail": "Found 0/30 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 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": "project was created within the last 90 days. Please review its contents carefully",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "packaging",
                "name": "Packaging",
                "detail": "packaging workflow not detected",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 5
              },
              {
                "key": "pinned_dependencies",
                "name": "Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 3",
                "points": 1.5,
                "status": "partial",
                "details": [],
                "max_points": 5
              },
              {
                "key": "sast",
                "name": "SAST",
                "detail": "no SAST tool detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "security_policy",
                "name": "Security-Policy",
                "detail": "security policy file not detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "signed_releases",
                "name": "Signed-Releases",
                "detail": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 7.5
              },
              {
                "key": "token_permissions",
                "name": "Token-Permissions",
                "detail": "GitHub workflow tokens follow principle of least privilege",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "vulnerabilities",
                "name": "Vulnerabilities",
                "detail": "21 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": "excellent",
        "name": "AI Readiness",
        "value": 88,
        "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.96,
              "agent_instruction_files": [
                "AGENTS.md",
                "CLAUDE.md"
              ],
              "agent_instruction_max_bytes": 4724
            },
            "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": "96 of 100 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 96,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "excellent",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 85,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [
                "go.sum",
                "package-lock.json"
              ],
              "has_dockerfile": false,
              "typed_language": true,
              "bootstrap_files": [
                "Makefile"
              ],
              "has_devcontainer": false,
              "has_linter_config": true,
              "typecheck_configs": [
                "app-bridge/tsconfig.json",
                "app/tsconfig.json",
                "packages/highlight/tsconfig.json",
                "tsconfig.json"
              ],
              "agent_commit_share": 0.26,
              "toolchain_manifests": [
                "cli/go.mod",
                "daemon/go.mod",
                "docs/analysis/demo/iterm2-agent-detection/go.mod",
                "protocol/go.mod",
                "relay-go/go.mod"
              ],
              "dependency_bot_commit_share": 0
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": "Makefile",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "Makefile"
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "automated_tests",
                "name": "Automated tests",
                "detail": null,
                "points": 22,
                "status": "met",
                "details": [],
                "max_points": 22
              },
              {
                "key": "lint_format_config",
                "name": "Lint / format config",
                "detail": ".golangci.yml, eslint.config.js, eslint.config.mjs",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": ".golangci.yml, eslint.config.js, eslint.config.mjs"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "static_type_checking",
                "name": "Static type checking",
                "detail": "app-bridge/tsconfig.json, app/tsconfig.json, packages/highlight/tsconfig.json, tsconfig.json",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "app-bridge/tsconfig.json, app/tsconfig.json, packages/highlight/tsconfig.json, 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": "26 of the last 100 commits agent-authored or agent-credited",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "agent_authored_commits",
                    "params": {
                      "count": 26,
                      "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 3",
                "points": 3,
                "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": 127261,
              "source_files_sampled": 1313,
              "oversized_source_files": 10
            },
            "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": "10/1313 source files over 60KB",
                "points": 54.6,
                "status": "partial",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 1313,
                      "oversized": 10
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          }
        ],
        "description": "How well is the repo equipped to be developed and maintained with AI coding agents? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score."
      }
    ],
    "metrics_version": "1.13.0"
  },
  "warnings": [
    "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-22T06:49:03.047794Z",
  "schema_version": "0.26.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/w/WuErPing/solo.svg",
  "full_name": "WuErPing/solo",
  "license_state": "standard",
  "license_spdx": "MIT"
}

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

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

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