公开记录
软件健康报告模式 0.27.0 · 指标 2.3.2 · 2026-07-29 05:34 UTC

mapleafgo / singcast-cli

Dual-Format Proxy Core — Clash & sing-box Config, sing-box Engine

GoGPL-3.0★ 25 星标⑂ 17 复刻始于 2023年12月在 GitHub 上查看 ↗

mapleafgo/singcast-cli 的健康指数为 100 分中的 63 分,处于「中等」区间。 其得分最高的类别是AI Readiness(86/100),最低的是Security(38/100)。 最近一次更新在 2 天前。 近期的大部分工作由 1 位贡献者完成。

63
总分 / 100
中等

软件健康指数

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

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

评分画像

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

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

所有权

慕枫Go个人账户
35 关注者46 个公开仓库始于 2016年7月

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

软件包生态系统

注册表软件包版本月下载量版本数最近发布
Gogithub.com/mapleafgo/singcast指向其他仓库——不计分v1.1.17-401 天前

按类别列示的指标

活力

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

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

发布纪律

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

社区与采用

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

40薄弱 · 占总体的 17%

流行度与采用

32存在风险
评分方式
22.4/60星标 — 25 个星标
10/25复刻 — 17 个复刻
0/15关注者 — 2 位关注者
所用输入
forks17
stars25
watchers2
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history

社区健康

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

可持续性与治理

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

45薄弱 · 占总体的 23%
评分方式
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
评分方式
42/42议题解决 — 100% 的议题已关闭
0/30PR 接受 — 没有已裁定的拉取请求或无数据
0/13Newcomer PR acceptance — 30 天内没有首次贡献者的 PR 得到裁决
0/15OpenSSF Scorecard:Code-Review — Found 0/30 approved changesets -- score normalized to 0
所用输入
merged_prs0
open_issues0
closed_issues1
prs_merged_7d
prs_decided_7d
prs_merged_30d
prs_decided_30d
issue_closed_ratio1
closed_unmerged_prs0
first_time_authors_30d
first_time_prs_merged_30d
first_time_prs_decided_30d
已排除计分(无数据或不适用):PR 接受, newcomer_pr_acceptance。 其余权重已重新归一化。
评分方式
10/30所有权背书 — 个人(用户)账户
0/20已验证域名 — 不适用于个人账户
11.2/25所有者影响力 — mapleafgo 有 35 位关注者
24.2/25既往记录 — 46 个公开仓库,账户约 10 年
所用输入
followers35
owner_typeUser
is_verified
owner_loginmapleafgo
public_repos46
account_age_days3,661
已排除计分(无数据或不适用):已验证域名。 其余权重已重新归一化。

工程质量

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

82优秀 · 占总体的 19%

工程实践

80优秀
评分方式
24/24CI 工作流 — 1 个工作流
24/24存在测试
16/16Linter 配置 — .golangci.yml
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。 其余权重已重新归一化。

文档

85优秀
评分方式
30/30README
25/25文档目录
0/15文档 / 主页站点
10/10仓库描述
10/10主题标签 — 2 个主题标签
10/10Wiki
所用输入
topicsclash, sing-box
has_wiki
homepage
has_readme
has_docs_dir
has_description

安全

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

38薄弱 · 占总体的 16%

安全态势

28存在风险
评分方式
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
7.5/7.5Maintained — 30 commit(s) and 1 issue activity found in the last 90 days -- score normalized to 10
0/5Packaging — 无数据
0/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
0/5SAST — no SAST tool detected
0/5Security-Policy — security policy file not detected
0/7.5Signed-Releases — Project has not signed or included provenance with any releases.
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
0/7.5Vulnerabilities — 27 existing vulnerabilities detected
所用输入
sourceopenssf_scorecard
checks_evaluated16
scorecard_versionv5.5.0
checks_inconclusive2
scorecard_aggregate2.8
已排除计分(无数据或不适用):ci_tests, packaging。 其余权重已重新归一化。
评分方式
16.8/35直接依赖不含已知公告 — 1 个受影响:golang.org/x/net v0.54.0 (moderate 6.5)
0/25间接依赖不含已知公告 — 在此范围内,传递依赖集合无法与开发和测试依赖区分
40/40没有长期未处理的公告 — 没有公告公开超过 90 天
所用输入
sourceosv
advisories42
affected_packages6
assessed_packages160
unassessed_packages0
affected_by_severitycritical 2, moderate 1, unknown 3
direct_affected_packages1
已排除计分(无数据或不适用):间接依赖不含已知公告。 其余权重已重新归一化。 已将 160 个已解析依赖与 OSV 比对。 该仓库未发布任何索引可解析的软件包,因此改为评估仓库依赖图。该图将开发与测试版本固定同交付的依赖混在一起,因此仅对声明的运行时依赖计分;传递性发现仅作为背景信息列出,不计入评分。 未对可达性进行分析。

AI 就绪度

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

86优秀 · 占总体的 4%
评分方式
45/45代理指令 — CLAUDE.md
0/15机器可读文档(llms.txt)
40/40可读的提交历史 — 100 次人类提交中有 100 次说明了意图(结构化标题或解释性正文)
所用输入
has_llms_txt
legible_history_share1
agent_instruction_filesCLAUDE.md
agent_instruction_max_bytes4,312
评分方式
18/18一条命令的引导启动 — Taskfile.yml
22/22自动化测试
11/11Lint / 格式化配置 — .golangci.yml
11/11静态类型检查 — Go(静态类型)
10/10可复现环境 — lockfile
10/10已体现的代理实践 — 最近 100 次提交中有 69 次由代理编写或署名代理
0/8自动化维护 — 未观察到自动依赖更新
0/10OpenSSF Scorecard:Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
所用输入
has_nix
has_tests
lockfilesgo.sum
has_dockerfile
typed_language
bootstrap_filesTaskfile.yml
has_devcontainer
has_linter_config
typecheck_configs
agent_commit_share0.69
toolchain_manifestsgo.mod
dependency_bot_commit_share0
评分方式
45/45可类型检查的代码 — Go(静态类型)
55/55可控的文件大小 — 采样的 87 个源文件中有 0 个超过 60KB
所用输入
primary_languageGo
largest_source_bytes30,128
source_files_sampled87
oversized_source_files0

关键数据

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

数据采集警告

  • Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token
  • go package 'github.com/mapleafgo/singcast' points at a different repository (https://github.com/mapleafgo/singcast); excluded from ecosystem scoring

更多细节

Star 与 Fork 历史 0 ★ / 17 ⇿
0Star
17Fork

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

0481216201722023-122025-012026-03

每个点涵盖 3 天。

OpenSSF Scorecard 2.8 / 10
2.8综合

来自开源项目 OpenSSF Scorecard 的独立、工具无关的安全评估。每项检查奖励的是安全实践本身,而非特定供应商的工具。Scorecard 无法判定的检查项标记为 不适用,并从安全评分中剔除(绝不按零分计)。Scorecard v5.5.0 · 2026-07-29 05:33 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
10Maintained30 commit(s) and 1 issue activity found in the last 90 days -- score normalized to 10
不适用Packagingpackaging workflow not detected
0Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 0
0SASTno SAST tool detected
0Security-Policysecurity policy file not detected
0Signed-ReleasesProject has not signed or included provenance with any releases.
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
0Vulnerabilities27 existing vulnerabilities detected
直接依赖 11
注册表软件包版本约束清单文件
Gogithub.com/gofrs/uuid/v5v5.4.0go.mod
Gogithub.com/sagernet/singv0.8.11go.mod
Gogithub.com/sagernet/sing-boxv1.13.14go.mod
Gogithub.com/sagernet/sing-tunv0.8.11go.mod
Gogithub.com/stretchr/testifyv1.11.1go.mod
Gogithub.com/tailscale/go-winiov0.0.0-20231025203758-c4f33415bf55go.mod
Gogithub.com/urfave/cli/v3v3.9.0go.mod
Gogo.yaml.in/yaml/v3v3.0.4go.mod
Gogolang.org/x/mobilev0.0.0-20260520154334-0e4426e1883dgo.mod
Gogolang.org/x/netv0.54.0go.mod
Gogolang.org/x/sysv0.44.0go.mod
全部依赖 160

来自 GitHub 依赖图的完整解析依赖集合:11 个直接依赖与 149 个间接(传递)软件包。仓库提交锁文件时,传递闭包才是完整的。

注册表软件包版本关系
Gogithub.com/gofrs/uuid/v5v5.4.0直接
Gogithub.com/sagernet/singv0.8.11直接
Gogithub.com/sagernet/sing-boxv1.13.14直接
Gogithub.com/sagernet/sing-tunv0.8.11直接
Gogithub.com/stretchr/testifyv1.11.1直接
Gogithub.com/tailscale/go-winiov0.0.0-20231025203758-c4f33415bf55直接
Gogithub.com/urfave/cli/v3v3.9.0直接
Gogo.yaml.in/yaml/v3v3.0.4直接
Gogolang.org/x/mobilev0.0.0-20260520154334-0e4426e1883d直接
Gogolang.org/x/netv0.54.0直接
Gogolang.org/x/sysv0.44.0直接
Gofilippo.io/edwards25519v1.2.0间接
Gogithub.com/ajg/formv1.7.1间接
Gogithub.com/akutz/memconnv0.1.0间接
Gogithub.com/alexbrainman/sspiv0.0.0-20250919150558-7d374ff0d59e间接
Gogithub.com/andybalholm/brotliv1.2.1间接
Gogithub.com/anthropics/anthropic-sdk-gov1.44.1间接
Gogithub.com/anytls/sing-anytlsv0.0.11间接
Gogithub.com/bahlo/generic-list-gov0.2.0间接
Gogithub.com/buger/jsonparserv1.2.0间接
Gogithub.com/caddyserver/certmagicv0.25.3间接
Gogithub.com/caddyserver/zerosslv0.1.5间接
Gogithub.com/coder/websocketv1.8.14间接
Gogithub.com/coreos/go-iptablesv0.8.0间接
Gogithub.com/cretz/binev0.2.0间接
Gogithub.com/database64128/netx-gov0.1.1间接
Gogithub.com/database64128/tfo-go/v2v2.3.3间接
Gogithub.com/davecgh/go-spewv1.1.2-0.20180830191138-d8f796af33cc间接
Gogithub.com/dblohm7/wingoesv0.0.0-20250822163801-6d8e6105c62d间接
Gogithub.com/ebitengine/puregov0.10.0间接
Gogithub.com/florianl/go-nfqueue/v2v2.0.3间接
Gogithub.com/fsnotify/fsnotifyv1.10.1间接
Gogithub.com/fxamacker/cbor/v2v2.9.2间接
Gogithub.com/gaissmai/bartv0.28.0间接
Gogithub.com/go-chi/chi/v5v5.2.5间接
Gogithub.com/go-chi/renderv1.0.3间接
Gogithub.com/go-json-experiment/jsonv0.0.0-20260520185125-572e7c383686间接
Gogithub.com/go-ole/go-olev1.3.0间接
Gogithub.com/gobwas/httpheadv0.1.0间接
Gogithub.com/gobwas/poolv0.2.1间接
Gogithub.com/godbus/dbus/v5v5.2.2间接
Gogithub.com/golang/groupcachev0.0.0-20241129210726-2c02b8208cf8间接
Gogithub.com/google/btreev1.1.3间接
Gogithub.com/google/go-cmpv0.7.0间接
Gogithub.com/google/nftablesv0.3.0间接
Gogithub.com/google/uuidv1.6.0间接
Gogithub.com/hashicorp/yamuxv0.1.2间接
Gogithub.com/hdevalence/ed25519consensusv0.2.0间接
Gogithub.com/insomniacslk/dhcpv0.0.0-20260407060928-11b94ed970f2间接
Gogithub.com/invopop/jsonschemav0.14.0间接
Gogithub.com/jsimonetti/rtnetlinkv1.4.2间接
Gogithub.com/keybase/go-keychainv0.0.1间接
Gogithub.com/klauspost/compressv1.18.6间接
Gogithub.com/klauspost/cpuid/v2v2.3.0间接
Gogithub.com/libdns/acmednsv0.5.0间接
Gogithub.com/libdns/alidnsv1.0.7间接
Gogithub.com/libdns/cloudflarev0.2.2间接
Gogithub.com/libdns/libdnsv1.1.1间接
Gogithub.com/logrusorgru/aurorav2.0.3+incompatible间接
Gogithub.com/mailru/easyjsonv0.9.2间接
Gogithub.com/mdlayher/netlinkv1.11.2间接
Gogithub.com/mdlayher/socketv0.6.0间接
Gogithub.com/metacubex/utlsv1.8.4间接
Gogithub.com/mholt/acmez/v3v3.1.6间接
Gogithub.com/miekg/dnsv1.1.72间接
Gogithub.com/mitchellh/go-psv1.0.0间接
Gogithub.com/openai/openai-go/v3v3.36.0间接
Gogithub.com/pb33f/ordered-map/v2v2.3.1间接
Gogithub.com/pierrec/lz4/v4v4.1.26间接
Gogithub.com/pires/go-proxyprotov0.12.0间接
Gogithub.com/pmezard/go-difflibv1.0.1-0.20181226105442-5d4384ee4fb2间接
Gogithub.com/prometheus-community/pro-bingv0.8.0间接
Gogithub.com/quic-go/qpackv0.6.0间接
Gogithub.com/safchain/ethtoolv0.7.0间接
Gogithub.com/sagernet/bboltv0.0.0-20231014093535-ea5cb2fe9f0a间接
Gogithub.com/sagernet/corsv1.2.1间接
Gogithub.com/sagernet/cronet-gov0.0.0-20260620140045-05ab0dc17597间接
Gogithub.com/sagernet/cronet-go/allv0.0.0-20260620140045-05ab0dc17597间接
Gogithub.com/sagernet/cronet-go/lib/android_386v0.0.0-20260620135226-def9ff0fb992间接
Gogithub.com/sagernet/cronet-go/lib/android_amd64v0.0.0-20260620135226-def9ff0fb992间接
Gogithub.com/sagernet/cronet-go/lib/android_armv0.0.0-20260620135226-def9ff0fb992间接
Gogithub.com/sagernet/cronet-go/lib/android_arm64v0.0.0-20260620135226-def9ff0fb992间接
Gogithub.com/sagernet/cronet-go/lib/darwin_amd64v0.0.0-20260620135226-def9ff0fb992间接
Gogithub.com/sagernet/cronet-go/lib/darwin_arm64v0.0.0-20260620135226-def9ff0fb992间接
Gogithub.com/sagernet/cronet-go/lib/ios_amd64_simulatorv0.0.0-20260620135226-def9ff0fb992间接
Gogithub.com/sagernet/cronet-go/lib/ios_arm64v0.0.0-20260620135226-def9ff0fb992间接
Gogithub.com/sagernet/cronet-go/lib/ios_arm64_simulatorv0.0.0-20260620135226-def9ff0fb992间接
Gogithub.com/sagernet/cronet-go/lib/linux_386v0.0.0-20260620135226-def9ff0fb992间接
Gogithub.com/sagernet/cronet-go/lib/linux_386_muslv0.0.0-20260620135226-def9ff0fb992间接
Gogithub.com/sagernet/cronet-go/lib/linux_amd64v0.0.0-20260620135226-def9ff0fb992间接
Gogithub.com/sagernet/cronet-go/lib/linux_amd64_muslv0.0.0-20260620135226-def9ff0fb992间接
Gogithub.com/sagernet/cronet-go/lib/linux_armv0.0.0-20260620135226-def9ff0fb992间接
Gogithub.com/sagernet/cronet-go/lib/linux_arm64v0.0.0-20260620135226-def9ff0fb992间接
Gogithub.com/sagernet/cronet-go/lib/linux_arm64_muslv0.0.0-20260620135226-def9ff0fb992间接
Gogithub.com/sagernet/cronet-go/lib/linux_arm_muslv0.0.0-20260620135226-def9ff0fb992间接
Gogithub.com/sagernet/cronet-go/lib/linux_loong64v0.0.0-20260620135226-def9ff0fb992间接
Gogithub.com/sagernet/cronet-go/lib/linux_loong64_muslv0.0.0-20260620135226-def9ff0fb992间接
Gogithub.com/sagernet/cronet-go/lib/linux_mips64lev0.0.0-20260620135226-def9ff0fb992间接
Gogithub.com/sagernet/cronet-go/lib/linux_mipslev0.0.0-20260620135226-def9ff0fb992间接
Gogithub.com/sagernet/cronet-go/lib/linux_mipsle_muslv0.0.0-20260620135226-def9ff0fb992间接
Gogithub.com/sagernet/cronet-go/lib/linux_riscv64v0.0.0-20260620135226-def9ff0fb992间接
Gogithub.com/sagernet/cronet-go/lib/linux_riscv64_muslv0.0.0-20260620135226-def9ff0fb992间接
Gogithub.com/sagernet/cronet-go/lib/tvos_amd64_simulatorv0.0.0-20260620135226-def9ff0fb992间接
Gogithub.com/sagernet/cronet-go/lib/tvos_arm64v0.0.0-20260620135226-def9ff0fb992间接
Gogithub.com/sagernet/cronet-go/lib/tvos_arm64_simulatorv0.0.0-20260620135226-def9ff0fb992间接
Gogithub.com/sagernet/cronet-go/lib/windows_amd64v0.0.0-20260620135226-def9ff0fb992间接
Gogithub.com/sagernet/cronet-go/lib/windows_arm64v0.0.0-20260620135226-def9ff0fb992间接
Gogithub.com/sagernet/fswatchv0.1.2间接
Gogithub.com/sagernet/gvisorv0.0.0-20250811-sing-box-mod.1间接
Gogithub.com/sagernet/netlinkv0.0.0-20240916134442-83396419aa8b间接
Gogithub.com/sagernet/nftablesv0.3.0-mod.2间接
Gogithub.com/sagernet/quic-gov0.59.0-sing-box-mod.5间接
Gogithub.com/sagernet/sing-muxv0.3.5间接
Gogithub.com/sagernet/sing-quicv0.6.1间接
Gogithub.com/sagernet/sing-shadowsocksv0.2.9间接
Gogithub.com/sagernet/sing-shadowsocks2v0.2.2间接
Gogithub.com/sagernet/sing-shadowtlsv0.2.1间接
Gogithub.com/sagernet/sing-vmessv0.2.8-0.20250909125414-3aed155119a1间接
Gogithub.com/sagernet/smuxv1.5.50-sing-box-mod.1间接
Gogithub.com/sagernet/tailscalev1.92.4-sing-box-1.13-mod.7间接
Gogithub.com/sagernet/wireguard-gov0.0.3间接
Gogithub.com/sagernet/wsv0.0.0-20231204124109-acfe8907c854间接
Gogithub.com/standard-webhooks/standard-webhooks/librariesv0.0.1间接
Gogithub.com/tailscale/certstorev0.1.1-0.20231202035212-d3fa0460f47e间接
Gogithub.com/tailscale/goupnpv1.0.1-0.20210804011211-c64d0f06ea05间接
Gogithub.com/tailscale/hujsonv0.0.0-20260302212456-ecc657c15afd间接
Gogithub.com/tailscale/netlinkv1.1.1-0.20240822203006-4d49adab4de7间接
Gogithub.com/tailscale/peercredv0.0.0-20250107143737-35a0c7bd7edc间接
Gogithub.com/tailscale/web-client-prebuiltv0.0.0-20251127225136-f19339b67368间接
Gogithub.com/tidwall/gjsonv1.19.0间接
Gogithub.com/tidwall/matchv1.2.0间接
Gogithub.com/tidwall/prettyv1.2.1间接
Gogithub.com/tidwall/sjsonv1.2.5间接
Gogithub.com/u-root/uiov0.0.0-20240224005618-d2acac8f3701间接
Gogithub.com/vishvananda/netnsv0.0.5间接
Gogithub.com/wk8/go-ordered-map/v2v2.1.8间接
Gogithub.com/x448/float16v0.8.4间接
Gogithub.com/zeebo/blake3v0.2.4间接
Gogo.uber.org/multierrv1.11.0间接
Gogo.uber.org/zapv1.28.0间接
Gogo.uber.org/zap/expv0.3.0间接
Gogo.yaml.in/yaml/v4v4.0.0-rc.4间接
Gogo4.org/memv0.0.0-20240501181205-ae6ca9944745间接
Gogo4.org/netipxv0.0.0-20231129151722-fdeea329fbba间接
Gogolang.org/x/cryptov0.51.0间接
Gogolang.org/x/expv0.0.0-20260508232706-74f9aab9d74a间接
Gogolang.org/x/modv0.36.0间接
Gogolang.org/x/oauth2v0.36.0间接
Gogolang.org/x/syncv0.20.0间接
Gogolang.org/x/termv0.43.0间接
Gogolang.org/x/textv0.37.0间接
Gogolang.org/x/timev0.15.0间接
Gogolang.org/x/toolsv0.45.0间接
Gogolang.zx2c4.com/wintunv0.0.0-20230126152724-0fa3db229ce2间接
Gogolang.zx2c4.com/wireguard/windowsv1.0.1间接
Gogoogle.golang.org/genproto/googleapis/rpcv0.0.0-20260519071638-aa98bba5eb94间接
Gogoogle.golang.org/grpcv1.81.1间接
Gogoogle.golang.org/protobufv1.36.11间接
Gogopkg.in/yaml.v3v3.0.1间接
Golukechampine.com/blake3v1.4.1间接
依赖安全公告 6

该仓库未发布可被索引解析的包,因此评估的是其自身的依赖图——共 160 个包,其中也包含从不交付的开发与测试版本固定:6 个存在已知公告,1 个为直接依赖。

软件包版本关系严重程度公告数修复版本
golang.org/x/cryptov0.51.0间接严重270.52.0
google.golang.org/grpcv1.81.1间接严重21.82.1
golang.org/x/netv0.54.0直接80.56.0
github.com/go-chi/chi/v5v5.2.5间接未知35.3.0
github.com/klauspost/compressv1.18.6间接未知11.18.7
golang.org/x/textv0.37.0间接未知10.39.0

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

原始 JSON 报告 机器可读
{
  "data": {
    "repo": {
      "topics": [
        "clash",
        "sing-box"
      ],
      "is_fork": false,
      "size_kb": 1028,
      "has_wiki": true,
      "homepage": null,
      "languages": {
        "Go": 439646
      },
      "pushed_at": "2026-07-27T05:03:37Z",
      "created_at": "2023-12-03T04:15:21Z",
      "owner_type": "User",
      "updated_at": "2026-07-27T05:01:31Z",
      "description": "Dual-Format Proxy Core — Clash & sing-box Config, sing-box Engine",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "GPL-3.0",
      "default_branch": "singcast",
      "license_spdx_raw": "GPL-3.0",
      "primary_language": "Go",
      "significant_languages": [
        "Go"
      ]
    },
    "owner": {
      "blog": "blog.mapleafgo.cn",
      "name": "慕枫Go",
      "type": "User",
      "login": "mapleafgo",
      "company": null,
      "location": null,
      "followers": 35,
      "avatar_url": "https://avatars.githubusercontent.com/u/20534139?v=4",
      "created_at": "2016-07-19T08:43:14Z",
      "is_verified": null,
      "public_repos": 46,
      "account_age_days": 3661
    },
    "license": {
      "state": "standard",
      "spdx_id": "GPL-3.0",
      "raw_spdx": "GPL-3.0",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v1.1.21",
          "kind": "patch",
          "published_at": "2026-07-27T03:50:10Z"
        },
        {
          "tag": "v1.1.20",
          "kind": "patch",
          "published_at": "2026-07-26T15:44:16Z"
        },
        {
          "tag": "v1.1.19",
          "kind": "patch",
          "published_at": "2026-07-26T07:00:31Z"
        },
        {
          "tag": "v1.1.18",
          "kind": "patch",
          "published_at": "2026-07-20T03:30:25Z"
        },
        {
          "tag": "v1.1.17",
          "kind": "patch",
          "published_at": "2026-07-14T04:11:54Z"
        },
        {
          "tag": "v1.1.16",
          "kind": "patch",
          "published_at": "2026-07-10T06:14:32Z"
        },
        {
          "tag": "v1.1.15",
          "kind": "patch",
          "published_at": "2026-07-08T09:11:10Z"
        },
        {
          "tag": "v1.1.14",
          "kind": "patch",
          "published_at": "2026-07-02T16:37:05Z"
        },
        {
          "tag": "v1.1.13",
          "kind": "patch",
          "published_at": "2026-06-15T13:50:53Z"
        },
        {
          "tag": "v1.1.12",
          "kind": "patch",
          "published_at": "2026-06-15T06:35:48Z"
        },
        {
          "tag": "v1.1.11",
          "kind": "patch",
          "published_at": "2026-06-10T11:05:25Z"
        },
        {
          "tag": "v1.1.10",
          "kind": "patch",
          "published_at": "2026-06-05T07:09:30Z"
        },
        {
          "tag": "v1.1.9",
          "kind": "patch",
          "published_at": "2026-05-29T15:02:30Z"
        },
        {
          "tag": "v1.1.8",
          "kind": "patch",
          "published_at": "2026-05-28T10:44:40Z"
        },
        {
          "tag": "v1.1.7",
          "kind": "patch",
          "published_at": "2026-05-27T16:43:40Z"
        },
        {
          "tag": "v1.1.6",
          "kind": "patch",
          "published_at": "2026-05-27T10:39:39Z"
        },
        {
          "tag": "v1.1.5",
          "kind": "patch",
          "published_at": "2026-05-26T02:59:41Z"
        },
        {
          "tag": "v1.1.4",
          "kind": "patch",
          "published_at": "2026-05-25T18:34:49Z"
        },
        {
          "tag": "v1.1.3",
          "kind": "patch",
          "published_at": "2026-05-25T16:53:40Z"
        },
        {
          "tag": "v1.1.2",
          "kind": "patch",
          "published_at": "2026-05-24T18:06:54Z"
        },
        {
          "tag": "v1.1.1",
          "kind": "patch",
          "published_at": "2026-05-21T18:35:49Z"
        },
        {
          "tag": "v1.1.0",
          "kind": "minor",
          "published_at": "2026-05-21T10:42:41Z"
        },
        {
          "tag": "v1.0.2",
          "kind": "patch",
          "published_at": "2026-05-20T14:33:23Z"
        },
        {
          "tag": "v1.0.1",
          "kind": "patch",
          "published_at": "2026-05-20T10:47:06Z"
        },
        {
          "tag": "v1.0.0",
          "kind": "major",
          "published_at": "2026-05-20T09:26:48Z"
        },
        {
          "tag": "1.18.1",
          "kind": "patch",
          "published_at": "2023-12-03T04:22:46Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "75fd7b3f0a0a58393d5c92009dc3d3c856235602",
          "body": null,
          "is_bot": false,
          "headline": "fix(ci): get-release job 缺少 checkout 导致 gh 无法确定仓库",
          "author_name": "mapleafgo",
          "author_login": "mapleafgo",
          "committed_at": "2026-07-27T05:00:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "97c69c7b96c51f4b4e18c12a6ad273f9e817d490",
          "body": "GUI 不再传 tun.device 后,sing-box 通过 CalculateInterfaceName\n自动分配唯一接口名(tun0/tun1/...),热重载不存在同名冲突,\n不再需要重试退避和清理机制。\n\n- 删除 tunBusyMaxRetries/tunBusyRetryDelay 常量\n- 删除 isTunBusyErr 函数及 TestIsTunBusyErr 测试\n- startWithJSON 恢复为直通创建+启动",
          "is_bot": false,
          "headline": "fix: 去掉 TUN 热重载兜底处理(重试+清理),改用 sing-box 自动分配接口名",
          "author_name": "mapleafgo",
          "author_login": "mapleafgo",
          "committed_at": "2026-07-27T03:49:22Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5f255560cb8395ae88c641bc7b4e4a1c08cdb932",
          "body": "RestrictSUIDSGID=yes 禁止所有 chown 系统调用,singcast 用户无法将\n/run/singcast/command.sock 的属主改为 GUI 用户。服务因 grantSocketAccess\n失败而退出,GUI 回退无 CAP_NET_ADMIN 的用户态 core,最终报\n\"TUNSETIFF: operation not permitted\"。\n\n改用 setfacl 替代 os.Chown:socket 保持 singcast 属主,用 ACL 项授权 GUI\n用户读写。setfacl 无需额外 capability,acl 包已是 AUR 显式依赖。",
          "is_bot": false,
          "headline": "fix(ipc): socket 授权改用 setfacl,修复 RestrictSUIDSGID 阻断 chown 致服务崩溃",
          "author_name": "mapleafgo",
          "author_login": "mapleafgo",
          "committed_at": "2026-07-27T02:20:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "071803c6baa5e591dc389a4aeb4b034d61401187",
          "body": "- Service.Init 拆出 InitContext(ctx):自愈看门狗的生命周期改为派生自调用方\n  而非 context.Background(),healthProbe 也接 ctx;Init 保留给没有 context\n  可用的 FFI/gomobile 宿主。InstallService/UninstallService/runCmd 同样接\n  ctx,使 pkexec 下 Ctrl+C 能中断挂起的 systemctl。lint 原有的 4 个\n  contextcheck 由此根治而非压制\n- run/check/convert 三处重复的\"检测格式→翻译→打印 wa\n[…]\nne;删掉 ensureCustomRuleSetDef 纯转发别名;\n  detect.go 补导出符号文档注释,说明\"非对象 JSON 一律按 YAML 处理\"的判定语义\n- macOS 服务桩的错误文案由\"仅 Windows 支持\"更正为\"macOS 不支持\"(Linux 已支持)\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor: 贯穿 context、提取配置加载并清理冗余",
          "author_name": "mapleafgo",
          "author_login": "mapleafgo",
          "committed_at": "2026-07-26T15:42:07Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "afba246ffd9786670f7a2faf45c6bb0f276fdb81",
          "body": "- 补 defer svc.Destroy():此前 systemctl stop 时 sing-box 不优雅关闭,\n  cache.db 不落盘、sing-tun 的 resolvectl revert 不执行,系统 DNS 仍指向\n  已消失的代理,停服后整机断网。Windows 服务处理器同样补上\n- ctx 取消时同时关闭在用连接:serveConnection 阻塞在 Decode 上,只关\n  listener 无法让它返回,systemd 要等到 TimeoutStopSec 才 SIGKILL\n- 写端重构为 per-connection 的 clientConn:原先 s.\n[…]\n志里没有任何线索\n- 请求入口/出口各打一条 Debug 并带 elapsed_ms:startWithContent、\n  testGroupDelay 是秒级操作,只有入口日志时无法区分\"仍在处理\"和\"已卡死\"\n- 写失败日志补 kind/bytes 上下文,否则不知道丢的是哪条消息\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(ipc): 优雅关闭、消除响应串扰与写端数据竞态",
          "author_name": "mapleafgo",
          "author_login": "mapleafgo",
          "committed_at": "2026-07-26T15:41:34Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "9c73180d251c04dbd26f8f0a1e05dee15f045f6c",
          "body": "sing-box 对悬空的 outbound / DNS server 引用是启动硬失败,此前 validate()\n只检查 route 规则的 outbound 和 route.final,用户会遇到\"翻译成功但内核起\n不来\"且没有可定位的错误。\n\n- 校验范围扩展到代理组的 outbounds 成员、DNS 规则的 server、DNS server 的\n  detour、dns.final;凡 sing-box 会硬失败的引用这里也返回 error,\n  只影响单条规则的降级为 warning\n- 用户自定义节点与内建 DIRECT 撞名改为报错:此前特判放行,会输出两个\n  同名 ou\n[…]\n让这条校验在表示形式\n  变化后默默失效,而它防的正是启动失败\n- cleanupGroupOutbounds 迭代至不动点:丢弃一个组会让引用它的组也可能变空,\n  单趟扫描中\"先处理、后失效\"的组不会被回补清理,组 A 引用组 B 而 B 在 A\n  之后被丢弃时,A 会留下悬空引用\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(translator): 校验分组与 DNS 引用完整性",
          "author_name": "mapleafgo",
          "author_login": "mapleafgo",
          "committed_at": "2026-07-26T15:41:13Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "55870cf9cc661e76f0feb39b6d9d1ea6e5753ecf",
          "body": "- fakeip 兜底规则不再前插到已有规则之前:sing-box DNS 规则首匹配,而\n  \"A/AAAA → fakeip\" 匹配一切 A/AAAA 查询,前插会让 fake-ip-filter 的\n  whitelist 模式完全失效、blacklist 例外项仍拿到 fake IP、hosts 固定解析\n  对 A/AAAA 全部无效。改为显式排序:mode 开关 → 用户显式规则 → 自动分流\n  → 无条件兜底,并把无匹配条件的兜底规则单独收集到 dnsTerminalRules,\n  避免它留在中间遮蔽后续更精确的规则\n- 裸 IPv6 nameserver 不再被截断:mih\n[…]\n存与变更检测\n- rules/proxy-providers/rule-providers 被自动分流整体替代或忽略时逐类告警:\n  此前静默丢弃,用户面对\"规则不生效\"却无从排查\n- nameserver 写 fakeip 时告知会另建一个默认地址池的 fakeip transport\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(translator): 修正 DNS 翻译、规则顺序与输出确定性",
          "author_name": "mapleafgo",
          "author_login": "mapleafgo",
          "committed_at": "2026-07-26T15:40:53Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "90799419bf90c3ab56b940bc53f26bd2f1d8bcf3",
          "body": "对照 sing-box v1.13.14 源码逐条核实,以下错翻会让整份配置起不来,\n其中 fingerprint 那条不报错但更危险。\n\n- fingerprint 不再映射到 certificate_public_key_sha256:后者算的是 SPKI\n  公钥的 SHA-256(common/tls/std_client.go verifyPublicKeySHA256)而非整\n  证书 DER 哈希,且字段类型是 []byte(JSON 走 base64)而非 hex。硬填不报错、\n  实例正常启动,但会开启 InsecureSkipVerify + 自定义校验,使该出站所有握手\n\n[…]\n_ports 要求每段 \"start:end\",\n  此前整串替换 \"-\"→\":\",\"1000-2000,3000\" 会产出无法解析的条目\n- 补 smux min-streams 映射;去掉 hysteria2 无依据且与 hysteria 不一致的\n  hop-interval 封顶\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(translator): 修复导致 sing-box 启动失败与静默失效的协议错翻",
          "author_name": "mapleafgo",
          "author_login": "mapleafgo",
          "committed_at": "2026-07-26T15:40:31Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "2d9ba387fb0c4bde935227d8c08efef657ac04c6",
          "body": "- onLogEvent 从裸全局函数变量改为 atomic.Pointer:Init、看门狗、\n  observeStats 等 goroutine 在宿主注册回调的同时就可能在打日志,\n  裸变量构成数据竞态(同文件的 onEvent 早已用原子指针,此处不一致)\n- netlinkUnavailable 改 atomic.Bool,且只对确定不支持的 errno\n  (EPROTONOSUPPORT/EAFNOSUPPORT/EPERM/ENOSYS)闩锁——原先任何一次\n  瞬时失败(如 fd 耗尽 EMFILE)都会永久禁用连接归属查询直到进程重启\n- sockdiag 收发超时 T\n[…]\nlushSystemDNS 套 3s 上限:它在网络切换路径上被调用,resolvectl 挂起\n  会拖住整条切网处理\n- 看门狗的 outbound 类型判断改用 sing-box constant 常量,避免上游改名后\n  静默失配(把 block 当代理节点探测会误触发自愈重启)\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(core): 修正全局态原子性、超时取值与魔法数字",
          "author_name": "mapleafgo",
          "author_login": "mapleafgo",
          "committed_at": "2026-07-26T15:40:01Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "72657b968b2616cd5bded3ff6663828057ba1bf2",
          "body": "切换订阅时 core 会\"停旧实例→立即起新实例\",而内核释放同名 TUN 设备存在\n短暂延迟,新实例立刻 TUNSETIFF 就撞 EBUSY,启动失败后代理直接断掉。\n排查中进一步发现 Stop() 作为公开 API 不参与串行化,\"状态 CAS / running\n指针 / hooks 订阅\"三份状态可交错,派生出双重 Close、查询使用已关闭实例、\n订阅 goroutine 泄漏三个症状。\n\n- box.Start 遇 EBUSY 时退避重试(300/600/900ms)覆盖内核释放窗口;\n  用 errors.Is(syscall.EBUSY) 精确匹配而非匹配错误文案。Box.S\n[…]\n达\n- 全组测速加 16 并发上限,且 timeoutMs 作为整批墙钟上限而非每节点各自\n  上限——该调用是 GUI 同步等待的,按节点计时最坏要等 ceil(N/16)×timeout\n- 翻译 warning 不再被丢弃,改经 slog 输出(进而转为 EventLog 送前端)\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(core): 消除 start/stop 竞态、订阅泄漏与 TUN 占用启动失败",
          "author_name": "mapleafgo",
          "author_login": "mapleafgo",
          "committed_at": "2026-07-26T15:39:30Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "26a4d7a480162b9dcecc1fe6764340ebf210303b",
          "body": "服务进程要解析不可信的订阅配置,此前它对自己的 ExecStart 二进制有写权限\n(/var/lib/singcast/singcast-core 属主为 singcast 用户),一次沦陷即可跨重启\n持久化;服务用户还能把该路径替换为符号链接,使下次 root 安装时的 O_TRUNC\n写入变成\"向任意路径写内容\"的提权原语。\n\n- 二进制安装路径迁到 /usr/local/lib/singcast(root 独占可写),不再 chown\n  给服务用户,写入改用 O_EXCL|O_NOFOLLOW;安装与卸载都清理历史位置的残留副本\n- socket 改为在 bind 期间收紧 umas\n[…]\n补 NoNewPrivileges/RestrictSUIDSGID/ProtectHome/ProtectClock/\n  RestrictAddressFamilies;刻意不加 ProtectSystem=strict 与\n  ProtectKernelModules 的原因见注释\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(ipc): 硬化服务安装与 socket 权限",
          "author_name": "mapleafgo",
          "author_login": "mapleafgo",
          "committed_at": "2026-07-26T15:38:44Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "021f162dc97d10c614763c6d2c6fe00fa49aa134",
          "body": "需显式设置 health_check.enabled=true 启用,避免默认开启\n对不需要自愈的场景造成误重启。",
          "is_bot": false,
          "headline": "fix(core): 健康看门狗默认关闭",
          "author_name": "mapleafgo",
          "author_login": "mapleafgo",
          "committed_at": "2026-07-26T06:57:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6e87a096b02c18087ea7748ed881d04fa7f5717f",
          "body": "重新引入 systemd unit + polkit 管理:AppImage/home 下二进制\n复制到 /var/lib/singcast,socket ACL 授权 GUI 用户,\nInstallService 不再要求 --home。Windows 自动推导用户数据目录。",
          "is_bot": false,
          "headline": "feat(ipc): 恢复 Linux systemd 服务安装并稳定化路径",
          "author_name": "mapleafgo",
          "author_login": "mapleafgo",
          "committed_at": "2026-07-26T06:39:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0cdfea9e338502defd19274b29b3be1c669855f2",
          "body": "物理网卡抖动等场景下,代理持续不通时自动重启 core,\n重新解析入口域名并重建连接。默认开启,可通过\nInitOptions.health_check 关闭或调参。",
          "is_bot": false,
          "headline": "feat(core): 代理链路自愈看门狗",
          "author_name": "mapleafgo",
          "author_login": "mapleafgo",
          "committed_at": "2026-07-26T06:39:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ea9197c58d7d545a872127099c19a0afd88e1c1b",
          "body": "需求只是让 core 调 resolvectl 不弹密码。\n不再引入系统用户、双 socket、ACL——只写一条 polkit rule 放行\nresolved 三条 action 对本地用户。\nInstallService/UninstallService 简化为单文件写入/删除。",
          "is_bot": false,
          "headline": "refactor(ipc): Linux 提权改为纯 polkit rules,去掉 systemd 服务",
          "author_name": "mapleafgo",
          "author_login": "mapleafgo",
          "committed_at": "2026-07-25T15:08:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "82218ec1c701154f04d70d03bce223d27059557c",
          "body": "- ExecStart 路径 strconv.Quote 转义,避免空格拆词\n- guiUID=0(包安装 root)跳过无效 ACL 写入\n- setfacl 失败显式返回错误而非 silent warn\n- 补 ExecStart 引号与 root guiUID 跳过测试",
          "is_bot": false,
          "headline": "fix(ipc): 硬化 Linux 服务 socket 与 unit 生成",
          "author_name": "mapleafgo",
          "author_login": "mapleafgo",
          "committed_at": "2026-07-25T15:01:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b2a133e38bf1ae596656030a202c0c41c384fe3f",
          "body": "系统级 unit + polkit rules 放行 resolved 三条 action,\n支持 SINGCAST_IPC_PATH 环境变量覆盖 + socket ACL 授权。",
          "is_bot": false,
          "headline": "feat(ipc): Linux systemd InstallService/UninstallService",
          "author_name": "mapleafgo",
          "author_login": "mapleafgo",
          "committed_at": "2026-07-25T14:23:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "677c49a41710170e892e6db1bf8c2697a13dcfcf",
          "body": "Mihomo's xhttp is Xray's SplitHTTP protocol, which sing-box does not\nsupport. Previously we translated it to httpupgrade (wrong protocol)\nor returned nil (creating a bare vless outbound without transport).\n\nNow we detect xhttp early in TranslateVLESS/VMess/Trojan via\nSkipUnsupportedNetwork and return nil. The caller (translateProxies)\ncreates a socks stub so the node stays visible in the UI but is\nclearly non-functional. Other proxies are not affected.",
          "is_bot": false,
          "headline": "fix(translator): skip xhttp proxies instead of creating broken outbounds",
          "author_name": "mapleafgo",
          "author_login": "mapleafgo",
          "committed_at": "2026-07-20T10:35:12Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "26a7740f532bccf421e613281cc7d00e8353e96e",
          "body": "Mihomo's xhttp is Xray's SplitHTTP protocol, which is fundamentally\ndifferent from sing-box's httpupgrade (HTTP/1.1 Upgrade to websocket).\nPreviously we incorrectly translated xhttp to httpupgrade, which would\nsilently fail to connect since the protocols are incompatible.\n\nsing-box v1.13.12 has no S\n[…]\n. Now we warn clearly:\n  xhttp (SplitHTTP) transport is not supported by sing-box, proxy will not work\n\nThis prevents confusing silent failures and lets users know the proxy\ncannot work with sing-box.",
          "is_bot": false,
          "headline": "fix(translator): correctly reject xhttp (SplitHTTP) as unsupported",
          "author_name": "mapleafgo",
          "author_login": "mapleafgo",
          "committed_at": "2026-07-20T10:30:38Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "638bb32089365759960b285b38b91646c1f8117c",
          "body": "…fields\n\nMihomo's xhttp network type was not handled in TranslateTransport,\ncausing the entire transport config to be silently dropped. This broke\nproxies using xhttp (e.g. CG1) since sing-box received plain TCP\ninstead of HTTP Upgrade transport.\n\n- Add xhttp case mapping to sing-box's httpupgrade transport\n- Warn when xhttp-opts contains fields sing-box cannot handle\n  (e.g. mode, x-padding-*, reuse-settings, download-settings)\n- Pass warn function through TranslateTransport signature",
          "is_bot": false,
          "headline": "fix(translator): add xhttp transport support and warn on unsupported …",
          "author_name": "mapleafgo",
          "author_login": "mapleafgo",
          "committed_at": "2026-07-20T10:24:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f5cba3f3defb088496ff76c1e52a7b69b77537c0",
          "body": "当 proxy-server-nameserver 全部是域名 DoH(如 dns.alidns.com、doh.pub)时,\ntranslator 会把 psn-* 互相设为 domain_resolver 做 bootstrap,sing-box 启动\n时检测到循环依赖并报错:\n\n    start instance: circular server dependency: ns-0 -> psn-0 -> psn-1 -> psn-0\n\ndomain_resolver 只有指向 IP 地址的 server 才不会再需要被解析。因此固定\n使用 default-nameserver(mihomo 语义上就是 bootstrap 用的纯 IP DNS)\n作为 domainResolverTags,psn-* 仍照常翻译输出到 dns.servers 但不再参与\nbootstrap 链。",
          "is_bot": false,
          "headline": "fix(dns): 不再把 proxy-server-nameserver 作为 domain_resolver 候选",
          "author_name": "mapleafgo",
          "author_login": "mapleafgo",
          "committed_at": "2026-07-20T03:19:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0ffc6d23c46a3e51293beede8e75edeb7de37353",
          "body": "翻译代理时标记静态无效 endpoint 和降级 stub,并在 url-test/fallback 组中剔除这些成员,避免健康检查卡在不可用节点上。\n\nselect 组保持原有成员,便于手动查看订阅伪节点或降级节点。",
          "is_bot": false,
          "headline": "fix(translator): 过滤健康检查组中的无效节点",
          "author_name": "mapleafgo",
          "author_login": "mapleafgo",
          "committed_at": "2026-07-15T03:18:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ee9d15216b15ee334a40d848788796b094238371",
          "body": "sing-box 没有 plain HTTP DNS server 类型,继续改写为 HTTPS 会生成可能不可用的配置。现在遇到 http:// DNS 时跳过该 server 并保留 warning。",
          "is_bot": false,
          "headline": "fix(dns): 跳过不支持的 HTTP DNS",
          "author_name": "mapleafgo",
          "author_login": "mapleafgo",
          "committed_at": "2026-07-14T14:36:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c6313e5361669da15b595773ff5769222dc0bfc4",
          "body": "别名(chacha20-poly1305 等)未识别即降级 stub, 不做隐式转换",
          "is_bot": false,
          "headline": "refactor(translator): 移除 SS cipher 别名归一化",
          "author_name": "mapleafgo",
          "author_login": "mapleafgo",
          "committed_at": "2026-07-14T13:58:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "58920bb65c6160b3d1556bc0be8e8c31bc9eedda",
          "body": "- proxy.go: 缺失 server/port 的节点提前降级为 stub outbound\n- shadowsocks: cipher 别名归一化(chacha20-poly1305→chacha20-ietf-poly1305), 未识别 cipher 跳过而非透传\n- vless/vmess: 校验 flow/security/packet-encoding, 非标准值跳过\n- hysteria2: 校验 obfs 仅支持 salamander, 缺 obfs-password 跳过\n- tuic: 校验 uuid 格式、udp-relay-mode、congestion-controller",
          "is_bot": false,
          "headline": "fix(translator): 无效代理参数前置校验并降级 stub, 避免坏节点致整个配置启动失败",
          "author_name": "mapleafgo",
          "author_login": "mapleafgo",
          "committed_at": "2026-07-14T13:47:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3eddbd84068017bfbe0ae3dd9fdefbef884ea419",
          "body": "ECH config 获取需查 cloudflare-ech.com 的 DNS HTTPS(type65) 记录, 之前 ECH\n规则复用 findFirstDirectDNSTag(优先明文 UDP), 而明文 UDP 查 type65 易被\n偶发干扰, 叠加 sing-box DNS 单 server 无故障转移, 一次几分钟抖动会让\n所有 VLESS+ECH 节点同时不可用(实测 cloudflare-ech.com 重查超时导致\n整批节点建连失败)。\n\n新增 findFirstECHCapableDNSTag: ECH 域名优先走加密直连 DNS(DoH/DoQ/DoH3,\n抗干扰), 无加密时 fallback 到首个直连; 仍跳过 detour 避免\nproxy->ECH->DNS->proxy 循环。findFirstDirectDNSTag(解析代理域名, 需明文\nUDP 抗封锁)不变。补充 3 个测试覆盖优先加密/fallback/跳过 detour。\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(translator): ECH 域名 DNS 优先加密 server, 避免明文 UDP 间歇抖动致 ECH 节点全挂",
          "author_name": "mapleafgo",
          "author_login": "mapleafgo",
          "committed_at": "2026-07-14T04:06:40Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "bff80fdf10b8e57ab432eb3197370c596d9ee140",
          "body": "- 将 885 行 service.go 按职责拆分为 service.go(状态机+生命周期) / query.go(API 操作) / events.go(事件系统)\n- connEntry/ruleEntry 移入 types.go 统一管理\n- 删除未使用的 TrafficSnapshot/TunOptionsSnapshot 死类型\n- QueryStats 用 StatsSnapshot 结构体替代手写 map[string]any\n- QueryMode/QueryRules/VersionJSON 用结构体替代手拼 JSON 字符串\n- Init 调用改为 json.Marsh\n[…]\n DialContext/NewRequestWithContext\n- contextcheck: CheckConfig/runIpc/runForeground 增加 context 参数传递\n- unparam: generateCountryRoutes/handleVoid/callbackInterfaceMonitor.update 移除未使用参数\n- goimports 格式修复",
          "is_bot": false,
          "headline": "refactor(core): 拆分 service.go god file, 结构体化 JSON 响应",
          "author_name": "mapleafgo",
          "author_login": "mapleafgo",
          "committed_at": "2026-07-10T06:11:47Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "013736de493f63c7027aa2a96f6173416c0a99a9",
          "body": "- 新增 collectECHQueryServers 从翻译后的 outbound 提取 ECH query-server-name 域名\n- 在 generateDNSRules 中为 ECH 域名生成直连 DNS 规则, 避免代理 → ECH → DNS(detour=代理) 循环\n- collectECHQueryServers 作为 Step 3b 在 translator.go 流水线中显式调用, 不再藏在 translateProxies 内部\n- 补充 3 个测试用例覆盖 ECH DNS 规则生成、无 ECH 时不生成、域名去重\n- 修复 group.go goimports 格式",
          "is_bot": false,
          "headline": "fix(translator): ECH 节点 DNS 循环依赖导致测速全部超时",
          "author_name": "mapleafgo",
          "author_login": "mapleafgo",
          "committed_at": "2026-07-10T06:11:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a4656140b41d1263d938234a83f91e7facaae9c6",
          "body": "- maxGroupInterval 从 86400(24h) 降至 1800(30m),防止机场订阅设的超大 interval 透传到 sing-box\n- idle_timeout 计算从 max(interval, 1800) 改为 max(interval*2, 1800),确保始终大于 interval\n- fallback tolerance 从 65535 降至 10000,更合理地模拟 Clash fallback 行为\n- interval 被截断时产生 warning 提示",
          "is_bot": false,
          "headline": "fix(translator): 修复 urltest/fallback 组因 interval 过大导致几乎不切换的问题",
          "author_name": "mapleafgo",
          "author_login": "mapleafgo",
          "committed_at": "2026-07-08T09:09:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8fb06d18c2237e495ada54618e881c6cbfbe6ce8",
          "body": "sing-box 的 DNS 规则路由到单个服务器, 无自动 failover (上游 issue #226\n被关闭未采纳)。findFirstDirectDNSTag 之前无条件取列表第一个直连 DNS,\n若首位是 quic://223.5.5.5 (853 端口握手重、易被封), 国内域名解析全部\n超时, 导致无法上网。\n\n改为优先选 UDP 类型 (明文 53, 最抗封锁), 无 UDP 时退回第一个直连服务器。\n复用 preferUDPServer 已有的容错思路, 补充 3 个测试用例。",
          "is_bot": false,
          "headline": "fix(translator): 国内域名 DNS 优先选明文 UDP 服务器, 避免单点 QUIC 故障",
          "author_name": "mapleafgo",
          "author_login": "mapleafgo",
          "committed_at": "2026-07-07T10:47:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ece88a5d14aa769a42dcce7a5af191dcafd83b3b",
          "body": "- translator/proxy: 增加 AnyTLS、Hysteria、Unsupported、HTTP/H2 Transport 测试\n- core: 增加 Service 方法未运行时的默认返回值测试(20 个)\n- translator: 增加 unsupported proxy stub 集成测试\n- 覆盖率提升:translator/proxy 61.0% → 74.7%,core 36.1% → 43.4%",
          "is_bot": false,
          "headline": "test: 补充 translator/proxy 和 core 包的测试用例",
          "author_name": "mapleafgo",
          "author_login": "mapleafgo",
          "committed_at": "2026-07-06T07:40:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5f66b6a536e7bf5eee1b8f53b0fd2505f38f9905",
          "body": "- 不支持的协议(ssr, snell, ssh, wireguard 等)不再被丢弃,而是转为\n  socks stub outbound,使节点在 Clash API UI 中保持可见\n- stub 指向 127.0.0.1:1(死端点),连接会失败,明确表示节点不可用\n- translateConfig 返回 stubTags 映射,用于 QueryProxies 报告原始协议类型\n- cleanupGroupOutbounds 清理引用了被跳过组的悬挂引用\n- TranslateWithMeta 返回翻译元数据(StubTags)",
          "is_bot": false,
          "headline": "feat(translator): 支持不支持的协议转为 socks stub",
          "author_name": "mapleafgo",
          "author_login": "mapleafgo",
          "committed_at": "2026-07-06T07:38:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3d4aa6f0e8955800237d196cccc96c6b083b1e3e",
          "body": "- 适配 sing-tun DefaultInterfaceMonitor 接口变更 (MyInterface → MyInterfaces)\n- 返回 []string 支持多 TUN 接口场景, 与上游实现保持一致",
          "is_bot": false,
          "headline": "chore: 升级 sing-box v1.13.12 → v1.13.14",
          "author_name": "mapleafgo",
          "author_login": "mapleafgo",
          "committed_at": "2026-07-02T16:35:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ab3f164a76363a57e38431a6f6d87c2ae5519147",
          "body": null,
          "is_bot": false,
          "headline": "fix(mobile): Destroy 时先停止 IPC server",
          "author_name": "mapleafgo",
          "author_login": "mapleafgo",
          "committed_at": "2026-06-15T13:48:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fb203509a7f1c7220624638360a2b52d5ba37183",
          "body": "…ort 改用 switch 语句",
          "is_bot": false,
          "headline": "fix(translator): DNS strategy 改用顶层 ipv6 字段, FakeIPFilter/extractHostP…",
          "author_name": "mapleafgo",
          "author_login": "mapleafgo",
          "committed_at": "2026-06-15T12:32:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "25219a9fdef591b8dad2641143bd41ac5f43ec32",
          "body": "NewServer 签名新增 ipcPath 后遗漏了 ipc_run_windows.go,导致 Windows 交叉编译失败(cloud build tag 本地不触发)。\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(ipc): 补全 Windows service 调用 NewServer 的 ipcPath 参数",
          "author_name": "mapleafgo",
          "author_login": "mapleafgo",
          "committed_at": "2026-06-15T05:54:57Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "4140f4d168b99afab3fc5c837ffabcb0361f84e7",
          "body": "Co-Authored-By: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "style: goimports/gofmt 统一代码格式",
          "author_name": "mapleafgo",
          "author_login": "mapleafgo",
          "committed_at": "2026-06-15T05:09:37Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "21b6a18b10557042d5d993512b6bd191cf261b1e",
          "body": "新增 .golangci.yml(固化 build tags、standard linter + 增补集);Taskfile 加 lint/lint-fix 任务;.gitignore 忽略 .mimicode。\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: 引入 golangci-lint v2 配置与 task lint/lint-fix",
          "author_name": "mapleafgo",
          "author_login": "mapleafgo",
          "committed_at": "2026-06-15T05:09:37Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "0510ca2905e6fa693beb586c0a5859d733626114",
          "body": "mobile 新增 StartIpcServer/StopIpcServer 方法;NewServer 接受 ipcPath 参数以支持 App Group 共享 socket。\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(ipc): 移动端新增 IPC server,支持跨进程 JSON-RPC 控制",
          "author_name": "mapleafgo",
          "author_login": "mapleafgo",
          "committed_at": "2026-06-15T05:09:37Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "7c5e430ab6714ab5bf6cc26cfc9c7ac7307b045c",
          "body": "…e host 映射\n\n- ws-opts.early-data-header-name 翻译为 transport.early_data_header_name,修复 VLESS WebSocket 0-RTT 不通\n- ws-opts.host 翻译为 httpupgrade transport.host\n- tls.go 注释更新为 sing-box OutboundTLSOptions 完整字段对照表\n- transport.go 各函数注释更新为 sing-box 对应结构体完整字段列表\n- 新增 TestTranslateTransportWSEarlyData 测试\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(translator): 补全 WebSocket early-data-header-name 映射,补全 HTTPUpgrad…",
          "author_name": "mapleafgo",
          "author_login": "mapleafgo",
          "committed_at": "2026-06-10T11:04:49Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "9338af6d56f3cabf9de1d113864cea4f45a858b1",
          "body": "urltest 组不支持手动切换节点,之前硬编码 selectable=true\n会误导客户端对 urltest 组调用 CoreSelectProxy 报错。",
          "is_bot": false,
          "headline": "fix(core): Selectable 仅对 selector 类型代理组返回 true",
          "author_name": "mapleafgo",
          "author_login": "mapleafgo",
          "committed_at": "2026-06-10T07:24:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "65b5eb215236fd8ed05db3f721c620688716a8da",
          "body": "Mihomo 的 hosts 字段值既可以是单个 IP 字符串,也可以是 IP 数组\n(如 [223.5.5.5, '2400:3200::1'])。部分机场订阅根据 UA 返回\n数组格式,导致 map[string]string 类型无法反序列化报错\n'cannot unmarshal !!seq into string'。\n\n将 Hosts 类型改为 map[string]any,数组值完整透传至 sing-box\nhosts DNS server 的 predefined 字段(sing-box 原生支持多 IP)。",
          "is_bot": false,
          "headline": "fix(translator): 支持 Mihomo hosts 字段数组值,修复 YAML 反序列化失败",
          "author_name": "mapleafgo",
          "author_login": "mapleafgo",
          "committed_at": "2026-06-10T06:54:26Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c605b8425df92e457fbefca2305adb6bf976ad62",
          "body": "- 新增 startMu + startSeq 实现并发请求 coalesce,只执行最后一个\n- 配置翻译移到锁外,减小临界区\n- CAS 循环简化为单次 CAS\n- Stop() 错误不再静默丢弃,记录日志",
          "is_bot": false,
          "headline": "refactor(core): 重构 StartWithContent 并发模型,改用互斥锁序列化并支持请求合并",
          "author_name": "mapleafgo",
          "author_login": "mapleafgo",
          "committed_at": "2026-06-05T07:06:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c710af4b0b73009ac462ea4a168898b38d753dfc",
          "body": null,
          "is_bot": false,
          "headline": "perf(ipc): 请求处理改为协程并发,启动期间状态查询不再阻塞",
          "author_name": "mapleafgo",
          "author_login": "mapleafgo",
          "committed_at": "2026-05-29T15:01:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3def05b08b057f397e002533a21dc112a58ba1d2",
          "body": "…回环;简化 TLS enabled 逻辑并移除 trojan 多余警告,测试改为注入 mixed inbound 避免端口冲突。\n\nCo-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(translator): 无 default-nameserver 时自动提取 IP 直连 DNS 作为引导服务器,修复 DNS …",
          "author_name": "mapleafgo",
          "author_login": "mapleafgo",
          "committed_at": "2026-05-28T10:44:12Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "5a80fdda096fce7e4388b62ac80b4e94fc947867",
          "body": "sing-box 的 NetworkManager.ResetNetwork() 不重置 DNS 路由,\n接口变更回调走 NetworkManager 漏掉 DNS,导致 DNS 传输连接\n仍绑定旧接口,新查询全部超时。改用 Router.ResetNetwork()\n同时重置连接管理和 DNS 缓存+传输。\n\nCo-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(mobile): 接口变更后重置 DNS,修复蜂窝切 WiFi 网络不可用",
          "author_name": "mapleafgo",
          "author_login": "mapleafgo",
          "committed_at": "2026-05-27T16:39:56Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "d5f3242be76ba6555f88fbf6b89f5dc75124a6e3",
          "body": "移动端接口监控 update() 对齐官方 libbox 实现:\nUpdateInterfaces 刷新接口列表 → ByIndex 查找完整对象 → 去重跳过 → 回调通知。\nInitialize() 保存 NetworkManager 供 update() 调用。",
          "is_bot": false,
          "headline": "fix(mobile): 对齐 sing-box libbox 最佳实践,修复 WiFi 切换后网络不可用",
          "author_name": "mapleafgo",
          "author_login": "mapleafgo",
          "committed_at": "2026-05-27T14:55:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "42cf079ab86e4f795112e554882e980b4bf2b08f",
          "body": "Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor(core): platformLogWriter 改为持有 Service 引用,日志事件也走 emitEvent",
          "author_name": "mapleafgo",
          "author_login": "mapleafgo",
          "committed_at": "2026-05-27T10:39:23Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "956ae9d61450ab8b76c7d8019e49a5741fe285a4",
          "body": "事件回调从闭包捕获 fn 改为通过 emitEvent 每次调用 getOnEvent,\n确保 SetOnEvent 更新回调后所有 goroutine 立即生效。\n顺便修复 observe 中 sub.Close() 缩进和 gofmt 格式问题。\n\nCo-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor(core): 提取 emitEvent 辅助方法,事件回调改为每次读取最新引用",
          "author_name": "mapleafgo",
          "author_login": "mapleafgo",
          "committed_at": "2026-05-27T10:36:03Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "daf7221addef9bb81d642f256721458bd0e3d45b",
          "body": "- 将 stats 推送从 IPC trafficPusher 下沉到 core.Service.observeStats,\n  三个入口(IPC/mobile/FFI)统一通过 EventStats 事件接收,停止/重载时推送零值\n- 移动端 SetInterfacesJSON/SetWIFIState 改为 InterfaceProvider/\n  WiFiStateProvider 按需回调模式,与 sing-box 引擎主动拉取的设计一致\n- 删除过时的 cmd/lib/cff_core.h(构建时自动生成)\n\nBREAKING CHANGE: mobile SDK 移除 SetInterfacesJSON/SetWIFIState,\n新增 InterfaceProvider/WiFiStateProvider 接口\n\nCo-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(core): 统一 stats 推送至核心层,移动端网络接口改为按需拉取",
          "author_name": "mapleafgo",
          "author_login": "mapleafgo",
          "committed_at": "2026-05-27T06:29:09Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "1215043d626eb0433739f3b99568009f41967484",
          "body": "Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(ipc): 卸载服务前先停止,超时降级交由 SCM 兜底清理",
          "author_name": "mapleafgo",
          "author_login": "mapleafgo",
          "committed_at": "2026-05-26T02:59:29Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "481679890e1306e70d7958b677a6f5678e5bfa78",
          "body": "移除 JSON-RPC 的 service.install/uninstall 方法,服务管理仅保留 CLI。\n卸载改用 SC_MANAGER_CONNECT 最小权限连接 SCM,无需管理员权限。\n\nCo-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor(ipc): 移除 IPC 服务管理接口,卸载改为免提权",
          "author_name": "mapleafgo",
          "author_login": "mapleafgo",
          "committed_at": "2026-05-25T18:34:14Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "431c0980724ed481c014dac6119e30fdc5107acf",
          "body": "当 YAML 配置中 flow 字段值为 null 时,GetStr 会将 Go nil 格式化为\n\"<nil>\" 字符串,被 sing-box 拒绝:unsupported flow: <nil。\n\nCo-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(translator): 修复 YAML nil 值被转为 \"<nil>\" 字符串导致 VLESS flow 报错",
          "author_name": "mapleafgo",
          "author_login": "mapleafgo",
          "committed_at": "2026-05-25T16:51:00Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "f0ee0b0ed0916b9974dd74544b7df580d8a8ac68",
          "body": "新增 `singcast service install --home <dir>` / `singcast service uninstall` 命令,\nInstallService 接受 homeDir 参数而非内部获取工作目录。VLESS flow 字段不再写死\n为 xtls-rprx-vision,改为直接透传用户配置值由 sing-box 运行时校验。\n\nCo-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(ipc): 暴露服务安装卸载到 CLI 命令,VLESS flow 改为透传",
          "author_name": "mapleafgo",
          "author_login": "mapleafgo",
          "committed_at": "2026-05-24T18:06:36Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "ec57f31fa81934254eaf431b266d3cc4c229f35c",
          "body": "- InstallService 在服务已存在时更新配置和 DACL 而非报错\n- 启动类型从 Automatic 改为 Manual\n- 添加 setServiceDACL 授权 Authenticated Users 启停查询服务\n\nCo-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(ipc): Windows 服务已存在时更新配置,添加 DACL 权限",
          "author_name": "mapleafgo",
          "author_login": "mapleafgo",
          "committed_at": "2026-05-21T18:33:31Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "beb2e5b5c6f2bb5f1a0aa4b1beeb84d5543164c8",
          "body": "- 移除 os.Getuid()==0 判断,始终按工作目录 owner chown socket\n- macOS 产物构建后自动 codesign -s -,避免 Gatekeeper 拦截\n\nCo-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(ipc): chown socket 给工作目录所有者 + macOS codesign",
          "author_name": "mapleafgo",
          "author_login": "mapleafgo",
          "committed_at": "2026-05-21T17:25:32Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "ec17d014fad0066e2863e78a50b51d407df67d8c",
          "body": "以 setuid root 运行时,socket 文件属主为 root,GUI 进程无法连接。\n将 socket chown 给 home 目录所有者,同时移除 UID 非 0 的条件限制,\n确保所有情况下都设置 0600 权限。\n\nCo-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(ipc): root 运行时 chown Unix socket 给用户",
          "author_name": "mapleafgo",
          "author_login": "mapleafgo",
          "committed_at": "2026-05-21T16:59:26Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "f746b998c29f3449a07ab0e7919caf64caee9782",
          "body": "Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: API 文档新增 IPC (JSON-RPC 2.0) 接口文档",
          "author_name": "mapleafgo",
          "author_login": "mapleafgo",
          "committed_at": "2026-05-21T10:42:25Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "4022c37635c0c525fee6b1e71a3be2f98bd70085",
          "body": "- 修复 os.Stdout.Write / SetsockoptTimeval / json.Unmarshal / w.Write\n  返回值未检查的 errcheck 警告\n- 移除 translator/dns.go 中未使用的 findFirstRemoteDNSTag 函数\n- 连接测试从硬编码路径改为读取 SINGCAST_TEST_CONFIG 环境变量\n- 清理多余注释、统一 runForeground 函数签名\n\nCo-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: 修复 errcheck 警告、移除 unused 函数、测试配置路径环境变量化",
          "author_name": "mapleafgo",
          "author_login": "mapleafgo",
          "committed_at": "2026-05-21T09:54:09Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "918b68fcff70aa9fe5aa46f50b51d3fd21cdd450",
          "body": "新增 ipc 子命令,通过 JSON-RPC 2.0 over Unix socket / Windows Named Pipe\n提供 GUI 与内核通信的完整接口。支持 service.install / service.uninstall\n方法注册/卸载 Windows 服务,SCM 上下文自动检测并包装 svc.Handler。\n\nCo-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(ipc): 新增 IPC 子命令和 Windows Service 管理",
          "author_name": "mapleafgo",
          "author_login": "mapleafgo",
          "committed_at": "2026-05-21T09:53:52Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "d5ae04caa035d1d63db3440eed10816e2e6548c2",
          "body": "sing-box 仅支持 xtls-rprx-vision,部分客户端会生成非标准变体\n(如 xtls-rprx-vision-udp443-udp443),直接写死合法值。\n\nCloses https://github.com/mapleafgo/clash-for-flutter/issues/66\n\nCo-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(translator): 规范化 VLESS flow 字段为 xtls-rprx-vision",
          "author_name": "mapleafgo",
          "author_login": "mapleafgo",
          "committed_at": "2026-05-20T14:26:25Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "76def31af421be28498b9f9d29f35548345c103b",
          "body": "Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "build: 添加 task tidy 命令用于更新依赖",
          "author_name": "mapleafgo",
          "author_login": "mapleafgo",
          "committed_at": "2026-05-20T10:46:38Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "d1034440e16eece42a8448228ad42a4498c2656b",
          "body": "mihomo-singbox-config-mapping.md: 更新版本基准至 v1.13.12,修正 REJECT 处理\n(block outbound → route action),新增 Section T 独立实现功能章节(sniffer、\nnameserver-policy、自动路由、clash mode、DNS detour、domain_resolver、\nrule_set 默认参数),更新骨架模板。\n\napi-reference.md: 移除已删除的 QueryDNS 数据结构。\nREADME: 移除 Multi-Platform 特性描述。\n\nCo-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: 更新配置映射文档和接口文档,标注独立实现功能",
          "author_name": "mapleafgo",
          "author_login": "mapleafgo",
          "committed_at": "2026-05-20T10:46:28Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "df26ae5178579d4788e45f6ec988ff789b79bd77",
          "body": "更新 sing-box v1.13.11 → v1.13.12,同步更新 urfave/cli、stretchr/objx 等直接依赖。\n移除 miekg/dns 直接依赖及 QueryDNS 功能(桌面端 CoreQueryDNS、移动端 QueryDNS),\n该功能不属于代理核心职责,可通过外部 DNS 库实现。\n\nCo-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(deps): 更新 sing-box 至 v1.13.12 并移除 QueryDNS",
          "author_name": "mapleafgo",
          "author_login": "mapleafgo",
          "committed_at": "2026-05-20T10:46:16Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "ada64bde0f1e1287c15353a7d8ee76ab0d1c166c",
          "body": "之前 ruleSetProxy 只在 YAML 翻译时生效,传入 sing-box JSON 时被忽略。\n现在 JSON 模式也会遍历 route.rule_set[].url,对 raw.githubusercontent.com\n的链接加上代理前缀。同时导出 translator.ProxyURL 消除重复逻辑。\n\nCo-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(core): JSON 模式下也支持 rule-set-proxy 前缀代理",
          "author_name": "mapleafgo",
          "author_login": "mapleafgo",
          "committed_at": "2026-05-20T09:16:18Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "d62c7ce702afef68b1eda2b96f8876e78585ce56",
          "body": "nameserver-policy 不翻译 mihomo 的配置字段,而是由 generateDNSRules\n基于 geosite/geoip 自动生成 DNS 路由规则;sniffer 无条件启用 sniff +\nhijack-dns,忽略 RawSniffer 配置。在 dns.go、autoroute.go、assemble.go\n中补充了这些设计决策的说明。\n\nCo-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(translator): 补充 nameserver-policy 和 sniffer 独立实现的注释说明",
          "author_name": "mapleafgo",
          "author_login": "mapleafgo",
          "committed_at": "2026-05-20T08:46:51Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "b1f27836e9f450d3b0d77e2df1ba335ea98a8b05",
          "body": "AutoDetectInterface 从 bool 改为 *bool 以区分\"未设置\"和\"显式 false\",\ngeneral.go 保持默认 true,tun.go 在用户显式设置时覆盖默认值。\n\nCo-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(translator): 正确映射 tun.auto-detect-interface 用户配置",
          "author_name": "mapleafgo",
          "author_login": "mapleafgo",
          "committed_at": "2026-05-20T05:43:32Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "00d58f20553bd21f323f9bb5a473802e52550c6b",
          "body": "包含项目架构说明(三个入口、核心层状态机、翻译器 10 步流水线)、\n构建与测试命令(含必需的 build tags)、以及开发约定。\n\nCo-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: 新增 CLAUDE.md 为 Claude Code 提供项目指引",
          "author_name": "mapleafgo",
          "author_login": "mapleafgo",
          "committed_at": "2026-05-20T02:51:53Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "6d51a954ef3c27740c13129cf39f1b64c341205c",
          "body": "runningState 新增 startedAt 字段,记录实例启动的毫秒时间戳,\nQueryStats 接口在返回流量统计时一并输出 started_at 字段。\n\nCo-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(stats): 在 QueryStats 中返回服务启动时间戳",
          "author_name": "mapleafgo",
          "author_login": "mapleafgo",
          "committed_at": "2026-05-15T05:59:19Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "d1bec3cf83456159948ae94fd788e4c9ebb906b2",
          "body": "… set_system_proxy\n\nNon-standard mihomo extension: when mixed-system-proxy is set to true\nin Clash YAML config, translates to set_system_proxy on the mixed\ninbound only (http inbound is not affected).\n\nCo-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(translator): add mixed-system-proxy extension field for sing-box…",
          "author_name": "mapleafgo",
          "author_login": "mapleafgo",
          "committed_at": "2026-05-13T15:55:38Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "47bf5b3bec910d40e70708c16c0eae7247deebe4",
          "body": "- README 加入 logo,突出 Clash 与 sing-box 双格式支持、sing-box 内核驱动\n- 移除 FFI 接口板块(API 详情保留在 api-reference.md)\n- 许可证从 MIT 改为 GPL-3.0,新增 LICENSE 文件\n- api-reference.md 根据代码修正 CoreQueryState 返回类型、State 枚举(5个状态)、\n  新增 StateChange 事件类型、Connection event 字段、DNS Question 字段名\n\nCo-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: 重构项目文档,突出双格式配置与 sing-box 内核定位",
          "author_name": "mapleafgo",
          "author_login": "mapleafgo",
          "committed_at": "2026-05-13T14:49:31Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "18bf25324b55f0fd3fc5e7958b032ffe9eb56ade",
          "body": "translateTUN 不再覆盖 auto_detect_interface,测试应验证\ngeneral.go 的默认值 true 被保留。\n\nCo-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(test): 更新 auto_detect_interface 测试期望值为 true",
          "author_name": "mapleafgo",
          "author_login": "mapleafgo",
          "committed_at": "2026-05-12T15:47:27Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "e66d996e5d8f1a702552a215c729d1e987d09757",
          "body": "translateGeneral 已将 auto_detect_interface 默认设为 true(sing-box\n正确默认值),但 tun.go 会因 mihomo 默认值为 false 而将其覆盖回去,\n导致桌面端 TUN 模式下接口自动检测被关闭。移动端不受影响,\nservice.go 会强制设为 true。\n\nCo-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(tun): 移除 auto_detect_interface 的错误覆盖",
          "author_name": "mapleafgo",
          "author_login": "mapleafgo",
          "committed_at": "2026-05-12T15:34:55Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "49ad1c3bfddee0b3a7f58b3a5a42207130e4463b",
          "body": "Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "test(connectivity): 增加 flutter-io.cn 国内站点测试",
          "author_name": "mapleafgo",
          "author_login": "mapleafgo",
          "committed_at": "2026-05-12T12:03:14Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "b6c5481030970bb40f328f3695187a88b545a5c2",
          "body": "- 移除 geosite-cn AND NOT geoip-cn 逻辑规则,改用简单 geosite/geoip 匹配\n  (geoip-cn 数据库不含部分 CDN IP 导致逻辑规则误匹配)\n- 移除废弃的 outbound:\"any\" DNS 规则(由 default_domain_resolver 替代)\n- 添加 download_detour:\"DIRECT\" 确保规则集直接下载\n- 遵循 sing-box 官方最佳实践:DNS 层防污染 + 路由层简单匹配\n\nCo-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(router): 移除逻辑规则,修复国内域名误走代理",
          "author_name": "mapleafgo",
          "author_login": "mapleafgo",
          "committed_at": "2026-05-12T12:02:31Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "9cae70433f69f4cbc6e882c55f7b793fed828aac",
          "body": "- 移除 mihomo nameserver-policy/fallback-filter DNS 规则翻译\n- 新增 generateDNSRules 按地理位置生成完整 DNS 规则集\n- 合并 geosite+geoip 到单一 rule_set 条目(sing-box 官方风格)\n- 移除 TestIntegrationRealProfile 结构测试\n- 连接测试增加 aliyun.com 国内站点验证,使用 gh-proxy.org 代理\n\nCo-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor(translator): DNS 规则改为按 sing-box 最佳实践自动生成",
          "author_name": "mapleafgo",
          "author_login": "mapleafgo",
          "committed_at": "2026-05-12T11:47:37Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "3a6a5841de0c84a4108a1baa1067ada6abc1beeb",
          "body": "- 修复 generateDNSRule 在 translateDNS 之前调用导致 DNS rules 为空的问题\n  将 DNS 规则生成移至 Step 6b(translateDNS 之后)执行\n- 修复 logical 规则未添加 clash_mode:\"Rule\" 导致模式切换失效\n  在 AND 逻辑规则中追加 clash_mode 子规则替代跳过\n- 跳过 mihomo geosite: 前缀的 nameserver-policy,改为基于地理位置自动生成\n- 增强集成测试覆盖:验证所有 outbound 类型、logical 规则子规则、DNS 规则\n\nCo-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(translator): 修复 DNS 规则生成和 clash_mode 处理",
          "author_name": "mapleafgo",
          "author_login": "mapleafgo",
          "committed_at": "2026-05-12T10:44:41Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "69f9626f81905f50ccc19f4d51e6b261b3af8621",
          "body": "- 拆分 generateGeoRoute 为 generateCNRoutes/generateCountryRoutes\n- 使用 geosite-cn 替代 geolocation-cn 覆盖更广的国内域名\n- 移除非 CN 路由的 geolocation-!cn 规则\n- 精简注释,保持代码简洁清晰\n\nCo-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor(translator): 精简自动路由代码和注释",
          "author_name": "mapleafgo",
          "author_login": "mapleafgo",
          "committed_at": "2026-05-12T09:15:00Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "eb48ccf814374306f5d837bfbc250db9ebd544e7",
          "body": "路由规则:\n- 新增 overseas-ai 规则集,海外 AI 服务优先走代理\n- 新增 .cn/.{cc} 域名后缀兜底直连规则\n- 非 CN 分支对齐 CN 分支的 DNS 污染保护逻辑\n- 重构 rule.go:提取 proxyURL/registerRuleSet 消除重复代码\n- 仅 raw.githubusercontent.com 域名加代理前缀\n- 清理冗余的重复 ensureRuleSetDef 调用\n\nIP 地理位置检测:\n- 新增 ip.sb 和 ipwho.is 两个检测源\n- 移除国内不可用的 Cloudflare 检测源\n- 超时由 context 统一控制(2s),移除 HTTP 客户端固定超时\n\nCo-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(router): 优化自动路由规则和 IP 地理位置检测",
          "author_name": "mapleafgo",
          "author_login": "mapleafgo",
          "committed_at": "2026-05-12T08:34:40Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "5b918bd2838aa0373547055daf859511c8d2626c",
          "body": "4 路 provider (Cloudflare/country.is/ipinfo.io/ip-api.com) 并发请求,\n首个成功返回即采用,取消其余。全局 1s 超时,复用 HTTP client。\n\nCo-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "perf(translator): 并发竞速多路 IP 地理位置检测",
          "author_name": "mapleafgo",
          "author_login": "mapleafgo",
          "committed_at": "2026-05-12T06:37:42Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "d806e175d6225d116d6d4cc069eb4f4ee5f31d99",
          "body": "使用 sync.Once 将 detectCountryByIP 结果缓存到进程生命周期,\n防止每次调用 DetectCountry 都发起网络请求。\n\nCo-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "perf(translator): 缓存 IP 地理位置检测结果,避免重复请求",
          "author_name": "mapleafgo",
          "author_login": "mapleafgo",
          "committed_at": "2026-05-12T04:21:04Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "5752364bc7e98fe3872d9568a9afb2bd0a9d81a0",
          "body": "Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "style(ci): CI 步骤名与 task 名保持一致",
          "author_name": "mapleafgo",
          "author_login": "mapleafgo",
          "committed_at": "2026-05-12T01:59:11Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "343e7f21211fd988d4770d90de5c562f0f33b060",
          "body": "TUN 模式下,gstatic.com 等域名被收录在 geolocation-cn 但不在\ngeolocation-!cn 中,TLS SNI 嗅探后匹配 geolocation-cn→DIRECT 规则,\n导致直连到被墙的 Google IP 反复超时。\n\n新增逻辑规则:域名在直连 geosite 集中但解析 IP 不在对应 geoip 集中\n时走代理,覆盖 CN 和所有其他国家。\n\nCo-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(router): 防止 geosite 直连域名解析到国外 IP 时误走直连",
          "author_name": "mapleafgo",
          "author_login": "mapleafgo",
          "committed_at": "2026-05-12T00:54:42Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "0ce77d11f72bafde8a5be465e7f123f39b8c477c",
          "body": "- State 查询从 int32 改为返回字符串(\"created\"/\"initialized\"/\"starting\"/\"running\"/\"destroyed\")\n- 移动端 Singcast.State() 和桌面端 CoreQueryState() 统一返回字符串\n- 与 EventStateChange 回调的 payload 格式一致\n\nCo-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(api): 统一状态回调和状态查询返回字符串",
          "author_name": "mapleafgo",
          "author_login": "mapleafgo",
          "committed_at": "2026-05-11T16:57:01Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "85915c39db3ed443503f3dd77fb391450dacda30",
          "body": "- 移除不可靠的 .{cc} 域名后缀规则\n- 所有国家增加 geolocation-!cn → proxy 规则兜底\n- CN 规则顺序:!cn 代理 → cn 直连 → 逻辑与(geoip+!cn) 直连\n- 非 CN 规则顺序:geoip 直连 → geosite 直连 → !cn 代理\n\nCo-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(router): 优化自动路由规则顺序,修复国外域名误走直连",
          "author_name": "mapleafgo",
          "author_login": "mapleafgo",
          "committed_at": "2026-05-11T16:38:57Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "7d95034b0c1006042e55cfc20fccf11e4093a66e",
          "body": "Service 和 PlatformIO 从 sync.Mutex 全面迁移到 atomic 操作:\n- 新增 atomicState 类型封装,消除 int32/State 转换噪音\n- Service 状态机使用 CAS loop 实现无锁状态转换\n- runningState 不可变发布模式,所有读路径零锁零竞争\n- PlatformIO 热路径 AutoDetectInterfaceControl 从 mutex 改为 atomic load\n- 新增 EventStateChange 回调和 StateStarting 中间状态\n- 修复频繁调用 StartWithContent 导致崩溃的竞态条件\n\nCo-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor(core): 无锁原子化重构,消除 Service/PlatformIO 全部互斥锁",
          "author_name": "mapleafgo",
          "author_login": "mapleafgo",
          "committed_at": "2026-05-11T16:38:37Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "472990e08123fbd26d14be3523e6be3721e3ba05",
          "body": "- 移动端强制启用 auto_detect_interface,确保 VpnService.protect() 生效\n- SetSocketProtector 支持 nil 清除,修复 VPN 断连后 stale protectFn\n- protectCallCount 从全局变量改为 PlatformIO 字段\n- callbackInterfaceMonitor.update 锁内快照回调,消除竞态\n- isMobile 移除锁保护(初始化后不变)\n- 诊断日志降级为 Debug,关键事件日志提升为 Info\n- 修正 translator/tun.go 注释说明 mihomo 默认行为\n\nCo-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(platform): 修复 TUN 模式 VPN 路由环路,代码审查优化",
          "author_name": "mapleafgo",
          "author_login": "mapleafgo",
          "committed_at": "2026-05-11T10:30:18Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "b4cfb23ae3842bc9a1e245049d57bfcbc98b0a2c",
          "body": "1. OpenInterface 打开 TUN 后获取接口名并调用 RegisterMyInterface,\n   使 selectInterfaces 能过滤掉 TUN 接口,防止路由环路\n2. AutoDetectInterfaceControl 成功时记录前 5 次及每 100 次的 protect 调用\n3. startWithJSON 重置 protectCallCount 计数器\n\nCo-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(platform): 注册 TUN 接口名到 interface monitor,添加 protect 调用日志",
          "author_name": "mapleafgo",
          "author_login": "mapleafgo",
          "committed_at": "2026-05-11T03:23:30Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "4b5d244e272a9e9c23dc2fa31b7365b42d5829bc",
          "body": "非 TUN 模式下没有 VPN,socket protection 不需要,protectFn 为 nil 是正常行为。\n将 AutoDetectInterfaceControl 中的 protectFn nil 检查从 Warn 降级为静默通过。\n同时在关键路径添加 debug 日志覆盖整个平台接口生命周期。\n\nCo-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(platform): 移除非 TUN 模式下 protectFn nil 警告噪音,增加全流程 debug 日志",
          "author_name": "mapleafgo",
          "author_login": "mapleafgo",
          "committed_at": "2026-05-11T02:08:52Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "fffe1a254b8c5ae0394f64583ee2a21d7272d09b",
          "body": "- parseAdapterInterfaces 补充 Flags 字段,修复 sing-box 接口过滤\n  将所有接口误判为 down 导致 \"no available network interface\"\n- 移除 UpdateInterfaces 调试日志,改为简洁的 Debug 级别输出\n\nCo-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(mobile): 接口 Flags 字段填充,移除调试日志",
          "author_name": "mapleafgo",
          "author_login": "mapleafgo",
          "committed_at": "2026-05-10T18:23:44Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "3b589747458f879d7fc0de0524250452aab6dcb9",
          "body": "Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "debug(service): 添加 UpdateInterfaces 调试日志",
          "author_name": "mapleafgo",
          "author_login": "mapleafgo",
          "committed_at": "2026-05-10T18:12:18Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "07601d36954609130e6b229ef590f46efe5ef5a1",
          "body": "sing-box 的 NetworkManager.NetworkInterfaces() 返回缓存列表,\n只在 UpdateInterfaces() 中填充。移动端路径从未调用该方法,\n导致 selectInterfaces 获取空列表 → \"no available network interface\"。\n\n在 box.New 之后、inst.Start 之前主动调用 UpdateInterfaces()。\n\n同时修复:\n- RegisterCallback 注册后即时推送当前接口状态\n- OpenInterface 成功创建 TUN 设备后才清零 fd\n- 删除未使用的 detectDefaultInterface\n- parseInterfaceAddrs 错误记录日志\n\nCo-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(service): 移动端启动前填充网络接口列表,修复 DNS 解析失败",
          "author_name": "mapleafgo",
          "author_login": "mapleafgo",
          "committed_at": "2026-05-10T17:32:53Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "761d807d79feab55b29111fa22d50ebe5a20b9f4",
          "body": "- RegisterCallback 注册后立即触发当前接口状态,修复 sing-box\n  NetworkManager 缓存初始化为 nil 导致 DNS 解析失败的问题\n- OpenInterface 成功创建 TUN 设备后才清零 fd,失败不丢失\n- 删除未使用的 detectDefaultInterface 及多余 import\n- parseInterfaceAddrs 错误记录日志而非静默忽略\n\nCo-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(platform): RegisterCallback 即时推送状态,OpenInterface 延迟清零 fd",
          "author_name": "mapleafgo",
          "author_login": "mapleafgo",
          "committed_at": "2026-05-10T17:12:35Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "2f8d156412438c177c2b132efce7d287e9137fc9",
          "body": "SetMobile(true) 时立即创建 callbackInterfaceMonitor,\n使 UpdateDefaultInterface 始终有目标可写,无需缓冲。\n\n移除 defaultIfaceName/Index/Expensive 三个字段及 replay 逻辑。\n\nCo-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor(platform): 即时创建接口监视器,消除缓冲字段",
          "author_name": "mapleafgo",
          "author_login": "mapleafgo",
          "committed_at": "2026-05-10T16:49:35Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "5a16566467856f33f49604b87228df7106d3b933",
          "body": "启动前调用 UpdateDefaultInterface 时 ifaceMonitor 尚为 nil,\n数据被丢弃导致 \"no available network interface\"。现在将数据\n缓冲在 PlatformIO 上,CreateDefaultInterfaceMonitor 时回放。\n\nCo-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(platform): 缓冲 UpdateDefaultInterface 数据,monitor 创建时回放",
          "author_name": "mapleafgo",
          "author_login": "mapleafgo",
          "committed_at": "2026-05-10T16:43:45Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "d7db616b61a753a121069e6aced6496092462cd9",
          "body": "FFI 单例串行调用,SetOnEvent/SetOnLogEvent 仅在启动前调用一次,\n之后只有 goroutine 只读访问,无需读写锁保护。\n\nCo-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor(core): 移除单例场景下不必要的 eventMu/logEventMu 锁",
          "author_name": "mapleafgo",
          "author_login": "mapleafgo",
          "committed_at": "2026-05-10T16:24:37Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "0847111a35dbf054307da65427dede55b9e7ff36",
          "body": "Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "style(mobile): 简化 SetOnEvent 消除重复路径",
          "author_name": "mapleafgo",
          "author_login": "mapleafgo",
          "committed_at": "2026-05-10T16:15:39Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "d24c7dc7e46fabd8cc2492f77492203671342a3f",
          "body": "- callbackInterfaceMonitor 实现 RegisterCallback/UnregisterCallback,\n  update 时触发已注册回调,通知 sing-box 网络变化\n- Service.onEvent 加 RWMutex 保护,避免 SetOnEvent 竞态\n- Stop/Destroy/StartWithContent 重构:Close 在锁外调用,消除死锁风险\n- NetworkInterfaces 空数据错误提示改为可操作指引\n\nCo-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(core): 回调触发、事件锁保护、Close 不持锁、异常提示优化",
          "author_name": "mapleafgo",
          "author_login": "mapleafgo",
          "committed_at": "2026-05-10T16:11:04Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "62ed9d779695a7099f4da701cbc077921e3080e3",
          "body": "- startWithJSON 注入条件从 UsePlatformInterface 改为 IsMobile\n  确保 Android 非 TUN 模式也使用平台接口监控,避免 netlink 禁用\n- 修复 logging.go 中 onLogEvent TOCTOU 竞态,使用局部变量 cb\n\nCo-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(platform): 移动端始终注入 PlatformIO,修复日志回调竞态",
          "author_name": "mapleafgo",
          "author_login": "mapleafgo",
          "committed_at": "2026-05-10T15:59:46Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "626964f2a83843b2984e67e410be33753b505eda",
          "body": "UsePlatformDefaultInterfaceMonitor/UsePlatformNetworkInterfaces/\nCreateDefaultInterfaceMonitor 改为只检查 isMobile,避免 sing-box\n回退到 netlink 检测接口(Android 禁止普通 app 使用)。\nUsePlatformInterface 仍需 tunFd(TUN 专属)。\n\nCo-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(platform): 移动端始终使用平台接口监控,避免 Android netlink 禁用",
          "author_name": "mapleafgo",
          "author_login": "mapleafgo",
          "committed_at": "2026-05-10T15:49:02Z",
          "body_truncated": false,
          "is_coding_agent": true
        }
      ],
      "releases_count": 26,
      "commits_last_year": 212,
      "latest_release_at": "2026-07-27T03:50:10Z",
      "latest_release_tag": "v1.1.21",
      "releases_from_tags": false,
      "days_since_last_push": 2,
      "active_weeks_last_year": 12,
      "days_since_latest_release": 2,
      "mean_days_between_releases": 4.7
    },
    "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/mapleafgo/singcast",
          "exists": true,
          "license": null,
          "keywords": [],
          "ecosystem": "go",
          "matches_repo": false,
          "registry_url": "https://pkg.go.dev/github.com/mapleafgo/singcast",
          "is_deprecated": false,
          "latest_version": "v1.1.17",
          "repository_url": "https://github.com/mapleafgo/singcast",
          "versions_count": 40,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": null,
          "first_published_at": null,
          "latest_published_at": "2026-07-27T07:31:21Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 1
        }
      ]
    },
    "popularity": {
      "forks": 17,
      "stars": 25,
      "watchers": 2,
      "fork_history": {
        "days": [
          {
            "date": "2023-12-07",
            "count": 1
          },
          {
            "date": "2024-02-20",
            "count": 1
          },
          {
            "date": "2024-03-12",
            "count": 1
          },
          {
            "date": "2024-03-29",
            "count": 1
          },
          {
            "date": "2024-04-01",
            "count": 1
          },
          {
            "date": "2024-04-08",
            "count": 1
          },
          {
            "date": "2024-05-21",
            "count": 1
          },
          {
            "date": "2024-05-22",
            "count": 1
          },
          {
            "date": "2024-06-27",
            "count": 1
          },
          {
            "date": "2024-07-16",
            "count": 1
          },
          {
            "date": "2024-08-16",
            "count": 1
          },
          {
            "date": "2024-10-07",
            "count": 1
          },
          {
            "date": "2024-10-25",
            "count": 1
          },
          {
            "date": "2025-04-20",
            "count": 1
          },
          {
            "date": "2025-07-15",
            "count": 1
          },
          {
            "date": "2025-10-20",
            "count": 1
          },
          {
            "date": "2026-03-26",
            "count": 1
          }
        ],
        "complete": true,
        "collected": 17,
        "total_forks": 17
      },
      "star_history": null,
      "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": [
        "Taskfile.yml"
      ],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [],
      "toolchain_manifests": [
        "go.mod"
      ],
      "largest_source_bytes": 30128,
      "source_files_sampled": 87,
      "oversized_source_files": 0,
      "agent_instruction_files": [
        "CLAUDE.md"
      ],
      "agent_instruction_max_bytes": 4312
    },
    "dependencies": {
      "manifests": [
        "go.mod"
      ],
      "advisories": {
        "error": null,
        "scope": "repository_graph",
        "source": "osv",
        "findings": [
          {
            "name": "golang.org/x/crypto",
            "direct": false,
            "version": "v0.51.0",
            "severity": "critical",
            "ecosystem": "go",
            "cvss_score": 10,
            "advisory_ids": [
              "GHSA-45gg-vh54-h5m9",
              "GHSA-5cgq-3rg8-m6cv",
              "GHSA-78mq-xcr3-xm33",
              "GHSA-89gr-r52h-f8rx",
              "GHSA-9m57-25v3-79x9",
              "GHSA-f5wc-c3c7-36mc",
              "GHSA-jppx-rxg9-jmrx",
              "GHSA-q4h4-gmj2-qvw2",
              "GHSA-qpw4-5x99-6vjp",
              "GHSA-rm3j-f69w-wqmq"
            ],
            "fixed_version": "0.52.0",
            "advisory_count": 27,
            "oldest_advisory_days": 68
          },
          {
            "name": "google.golang.org/grpc",
            "direct": false,
            "version": "v1.81.1",
            "severity": "critical",
            "ecosystem": "go",
            "cvss_score": 9.1,
            "advisory_ids": [
              "GHSA-hrxh-6v49-42gf",
              "GO-2026-6061"
            ],
            "fixed_version": "1.82.1",
            "advisory_count": 2,
            "oldest_advisory_days": 7
          },
          {
            "name": "golang.org/x/net",
            "direct": true,
            "version": "v0.54.0",
            "severity": "moderate",
            "ecosystem": "go",
            "cvss_score": 6.5,
            "advisory_ids": [
              "GHSA-5cv4-jp36-h3mw",
              "GO-2026-5025",
              "GO-2026-5026",
              "GO-2026-5027",
              "GO-2026-5028",
              "GO-2026-5029",
              "GO-2026-5030",
              "GO-2026-5942"
            ],
            "fixed_version": "0.56.0",
            "advisory_count": 8,
            "oldest_advisory_days": 68
          },
          {
            "name": "github.com/go-chi/chi/v5",
            "direct": false,
            "version": "v5.2.5",
            "severity": "unknown",
            "ecosystem": "go",
            "cvss_score": null,
            "advisory_ids": [
              "GO-2026-5774",
              "GO-2026-5775",
              "GO-2026-5777"
            ],
            "fixed_version": "5.3.0",
            "advisory_count": 3,
            "oldest_advisory_days": 4
          },
          {
            "name": "github.com/klauspost/compress",
            "direct": false,
            "version": "v1.18.6",
            "severity": "unknown",
            "ecosystem": "go",
            "cvss_score": null,
            "advisory_ids": [
              "GO-2026-5841"
            ],
            "fixed_version": "1.18.7",
            "advisory_count": 1,
            "oldest_advisory_days": 1
          },
          {
            "name": "golang.org/x/text",
            "direct": false,
            "version": "v0.37.0",
            "severity": "unknown",
            "ecosystem": "go",
            "cvss_score": null,
            "advisory_ids": [
              "GO-2026-5970"
            ],
            "fixed_version": "0.39.0",
            "advisory_count": 1,
            "oldest_advisory_days": 14
          }
        ],
        "collected": true,
        "malicious": [],
        "truncated": false,
        "by_severity": {
          "unknown": 3,
          "critical": 2,
          "moderate": 1
        },
        "advisory_count": 42,
        "affected_count": 6,
        "assessed_count": 160,
        "malicious_count": 0,
        "assessed_package": null,
        "unassessed_count": 0,
        "direct_affected_count": 1
      },
      "ecosystems": [
        "go"
      ],
      "dependencies": [
        {
          "name": "github.com/gofrs/uuid/v5",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v5.4.0"
        },
        {
          "name": "github.com/sagernet/sing",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.8.11"
        },
        {
          "name": "github.com/sagernet/sing-box",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.13.14"
        },
        {
          "name": "github.com/sagernet/sing-tun",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.8.11"
        },
        {
          "name": "github.com/stretchr/testify",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.11.1"
        },
        {
          "name": "github.com/tailscale/go-winio",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.0.0-20231025203758-c4f33415bf55"
        },
        {
          "name": "github.com/urfave/cli/v3",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v3.9.0"
        },
        {
          "name": "go.yaml.in/yaml/v3",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v3.0.4"
        },
        {
          "name": "golang.org/x/mobile",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.0.0-20260520154334-0e4426e1883d"
        },
        {
          "name": "golang.org/x/net",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.54.0"
        },
        {
          "name": "golang.org/x/sys",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.44.0"
        }
      ],
      "all_dependencies": {
        "error": null,
        "source": "github-sbom",
        "packages": [
          {
            "name": "github.com/gofrs/uuid/v5",
            "direct": true,
            "version": "v5.4.0",
            "ecosystem": "go"
          },
          {
            "name": "github.com/sagernet/sing",
            "direct": true,
            "version": "v0.8.11",
            "ecosystem": "go"
          },
          {
            "name": "github.com/sagernet/sing-box",
            "direct": true,
            "version": "v1.13.14",
            "ecosystem": "go"
          },
          {
            "name": "github.com/sagernet/sing-tun",
            "direct": true,
            "version": "v0.8.11",
            "ecosystem": "go"
          },
          {
            "name": "github.com/stretchr/testify",
            "direct": true,
            "version": "v1.11.1",
            "ecosystem": "go"
          },
          {
            "name": "github.com/tailscale/go-winio",
            "direct": true,
            "version": "v0.0.0-20231025203758-c4f33415bf55",
            "ecosystem": "go"
          },
          {
            "name": "github.com/urfave/cli/v3",
            "direct": true,
            "version": "v3.9.0",
            "ecosystem": "go"
          },
          {
            "name": "go.yaml.in/yaml/v3",
            "direct": true,
            "version": "v3.0.4",
            "ecosystem": "go"
          },
          {
            "name": "golang.org/x/mobile",
            "direct": true,
            "version": "v0.0.0-20260520154334-0e4426e1883d",
            "ecosystem": "go"
          },
          {
            "name": "golang.org/x/net",
            "direct": true,
            "version": "v0.54.0",
            "ecosystem": "go"
          },
          {
            "name": "golang.org/x/sys",
            "direct": true,
            "version": "v0.44.0",
            "ecosystem": "go"
          },
          {
            "name": "filippo.io/edwards25519",
            "direct": false,
            "version": "v1.2.0",
            "ecosystem": "go"
          },
          {
            "name": "github.com/ajg/form",
            "direct": false,
            "version": "v1.7.1",
            "ecosystem": "go"
          },
          {
            "name": "github.com/akutz/memconn",
            "direct": false,
            "version": "v0.1.0",
            "ecosystem": "go"
          },
          {
            "name": "github.com/alexbrainman/sspi",
            "direct": false,
            "version": "v0.0.0-20250919150558-7d374ff0d59e",
            "ecosystem": "go"
          },
          {
            "name": "github.com/andybalholm/brotli",
            "direct": false,
            "version": "v1.2.1",
            "ecosystem": "go"
          },
          {
            "name": "github.com/anthropics/anthropic-sdk-go",
            "direct": false,
            "version": "v1.44.1",
            "ecosystem": "go"
          },
          {
            "name": "github.com/anytls/sing-anytls",
            "direct": false,
            "version": "v0.0.11",
            "ecosystem": "go"
          },
          {
            "name": "github.com/bahlo/generic-list-go",
            "direct": false,
            "version": "v0.2.0",
            "ecosystem": "go"
          },
          {
            "name": "github.com/buger/jsonparser",
            "direct": false,
            "version": "v1.2.0",
            "ecosystem": "go"
          },
          {
            "name": "github.com/caddyserver/certmagic",
            "direct": false,
            "version": "v0.25.3",
            "ecosystem": "go"
          },
          {
            "name": "github.com/caddyserver/zerossl",
            "direct": false,
            "version": "v0.1.5",
            "ecosystem": "go"
          },
          {
            "name": "github.com/coder/websocket",
            "direct": false,
            "version": "v1.8.14",
            "ecosystem": "go"
          },
          {
            "name": "github.com/coreos/go-iptables",
            "direct": false,
            "version": "v0.8.0",
            "ecosystem": "go"
          },
          {
            "name": "github.com/cretz/bine",
            "direct": false,
            "version": "v0.2.0",
            "ecosystem": "go"
          },
          {
            "name": "github.com/database64128/netx-go",
            "direct": false,
            "version": "v0.1.1",
            "ecosystem": "go"
          },
          {
            "name": "github.com/database64128/tfo-go/v2",
            "direct": false,
            "version": "v2.3.3",
            "ecosystem": "go"
          },
          {
            "name": "github.com/davecgh/go-spew",
            "direct": false,
            "version": "v1.1.2-0.20180830191138-d8f796af33cc",
            "ecosystem": "go"
          },
          {
            "name": "github.com/dblohm7/wingoes",
            "direct": false,
            "version": "v0.0.0-20250822163801-6d8e6105c62d",
            "ecosystem": "go"
          },
          {
            "name": "github.com/ebitengine/purego",
            "direct": false,
            "version": "v0.10.0",
            "ecosystem": "go"
          },
          {
            "name": "github.com/florianl/go-nfqueue/v2",
            "direct": false,
            "version": "v2.0.3",
            "ecosystem": "go"
          },
          {
            "name": "github.com/fsnotify/fsnotify",
            "direct": false,
            "version": "v1.10.1",
            "ecosystem": "go"
          },
          {
            "name": "github.com/fxamacker/cbor/v2",
            "direct": false,
            "version": "v2.9.2",
            "ecosystem": "go"
          },
          {
            "name": "github.com/gaissmai/bart",
            "direct": false,
            "version": "v0.28.0",
            "ecosystem": "go"
          },
          {
            "name": "github.com/go-chi/chi/v5",
            "direct": false,
            "version": "v5.2.5",
            "ecosystem": "go"
          },
          {
            "name": "github.com/go-chi/render",
            "direct": false,
            "version": "v1.0.3",
            "ecosystem": "go"
          },
          {
            "name": "github.com/go-json-experiment/json",
            "direct": false,
            "version": "v0.0.0-20260520185125-572e7c383686",
            "ecosystem": "go"
          },
          {
            "name": "github.com/go-ole/go-ole",
            "direct": false,
            "version": "v1.3.0",
            "ecosystem": "go"
          },
          {
            "name": "github.com/gobwas/httphead",
            "direct": false,
            "version": "v0.1.0",
            "ecosystem": "go"
          },
          {
            "name": "github.com/gobwas/pool",
            "direct": false,
            "version": "v0.2.1",
            "ecosystem": "go"
          },
          {
            "name": "github.com/godbus/dbus/v5",
            "direct": false,
            "version": "v5.2.2",
            "ecosystem": "go"
          },
          {
            "name": "github.com/golang/groupcache",
            "direct": false,
            "version": "v0.0.0-20241129210726-2c02b8208cf8",
            "ecosystem": "go"
          },
          {
            "name": "github.com/google/btree",
            "direct": false,
            "version": "v1.1.3",
            "ecosystem": "go"
          },
          {
            "name": "github.com/google/go-cmp",
            "direct": false,
            "version": "v0.7.0",
            "ecosystem": "go"
          },
          {
            "name": "github.com/google/nftables",
            "direct": false,
            "version": "v0.3.0",
            "ecosystem": "go"
          },
          {
            "name": "github.com/google/uuid",
            "direct": false,
            "version": "v1.6.0",
            "ecosystem": "go"
          },
          {
            "name": "github.com/hashicorp/yamux",
            "direct": false,
            "version": "v0.1.2",
            "ecosystem": "go"
          },
          {
            "name": "github.com/hdevalence/ed25519consensus",
            "direct": false,
            "version": "v0.2.0",
            "ecosystem": "go"
          },
          {
            "name": "github.com/insomniacslk/dhcp",
            "direct": false,
            "version": "v0.0.0-20260407060928-11b94ed970f2",
            "ecosystem": "go"
          },
          {
            "name": "github.com/invopop/jsonschema",
            "direct": false,
            "version": "v0.14.0",
            "ecosystem": "go"
          },
          {
            "name": "github.com/jsimonetti/rtnetlink",
            "direct": false,
            "version": "v1.4.2",
            "ecosystem": "go"
          },
          {
            "name": "github.com/keybase/go-keychain",
            "direct": false,
            "version": "v0.0.1",
            "ecosystem": "go"
          },
          {
            "name": "github.com/klauspost/compress",
            "direct": false,
            "version": "v1.18.6",
            "ecosystem": "go"
          },
          {
            "name": "github.com/klauspost/cpuid/v2",
            "direct": false,
            "version": "v2.3.0",
            "ecosystem": "go"
          },
          {
            "name": "github.com/libdns/acmedns",
            "direct": false,
            "version": "v0.5.0",
            "ecosystem": "go"
          },
          {
            "name": "github.com/libdns/alidns",
            "direct": false,
            "version": "v1.0.7",
            "ecosystem": "go"
          },
          {
            "name": "github.com/libdns/cloudflare",
            "direct": false,
            "version": "v0.2.2",
            "ecosystem": "go"
          },
          {
            "name": "github.com/libdns/libdns",
            "direct": false,
            "version": "v1.1.1",
            "ecosystem": "go"
          },
          {
            "name": "github.com/logrusorgru/aurora",
            "direct": false,
            "version": "v2.0.3+incompatible",
            "ecosystem": "go"
          },
          {
            "name": "github.com/mailru/easyjson",
            "direct": false,
            "version": "v0.9.2",
            "ecosystem": "go"
          },
          {
            "name": "github.com/mdlayher/netlink",
            "direct": false,
            "version": "v1.11.2",
            "ecosystem": "go"
          },
          {
            "name": "github.com/mdlayher/socket",
            "direct": false,
            "version": "v0.6.0",
            "ecosystem": "go"
          },
          {
            "name": "github.com/metacubex/utls",
            "direct": false,
            "version": "v1.8.4",
            "ecosystem": "go"
          },
          {
            "name": "github.com/mholt/acmez/v3",
            "direct": false,
            "version": "v3.1.6",
            "ecosystem": "go"
          },
          {
            "name": "github.com/miekg/dns",
            "direct": false,
            "version": "v1.1.72",
            "ecosystem": "go"
          },
          {
            "name": "github.com/mitchellh/go-ps",
            "direct": false,
            "version": "v1.0.0",
            "ecosystem": "go"
          },
          {
            "name": "github.com/openai/openai-go/v3",
            "direct": false,
            "version": "v3.36.0",
            "ecosystem": "go"
          },
          {
            "name": "github.com/pb33f/ordered-map/v2",
            "direct": false,
            "version": "v2.3.1",
            "ecosystem": "go"
          },
          {
            "name": "github.com/pierrec/lz4/v4",
            "direct": false,
            "version": "v4.1.26",
            "ecosystem": "go"
          },
          {
            "name": "github.com/pires/go-proxyproto",
            "direct": false,
            "version": "v0.12.0",
            "ecosystem": "go"
          },
          {
            "name": "github.com/pmezard/go-difflib",
            "direct": false,
            "version": "v1.0.1-0.20181226105442-5d4384ee4fb2",
            "ecosystem": "go"
          },
          {
            "name": "github.com/prometheus-community/pro-bing",
            "direct": false,
            "version": "v0.8.0",
            "ecosystem": "go"
          },
          {
            "name": "github.com/quic-go/qpack",
            "direct": false,
            "version": "v0.6.0",
            "ecosystem": "go"
          },
          {
            "name": "github.com/safchain/ethtool",
            "direct": false,
            "version": "v0.7.0",
            "ecosystem": "go"
          },
          {
            "name": "github.com/sagernet/bbolt",
            "direct": false,
            "version": "v0.0.0-20231014093535-ea5cb2fe9f0a",
            "ecosystem": "go"
          },
          {
            "name": "github.com/sagernet/cors",
            "direct": false,
            "version": "v1.2.1",
            "ecosystem": "go"
          },
          {
            "name": "github.com/sagernet/cronet-go",
            "direct": false,
            "version": "v0.0.0-20260620140045-05ab0dc17597",
            "ecosystem": "go"
          },
          {
            "name": "github.com/sagernet/cronet-go/all",
            "direct": false,
            "version": "v0.0.0-20260620140045-05ab0dc17597",
            "ecosystem": "go"
          },
          {
            "name": "github.com/sagernet/cronet-go/lib/android_386",
            "direct": false,
            "version": "v0.0.0-20260620135226-def9ff0fb992",
            "ecosystem": "go"
          },
          {
            "name": "github.com/sagernet/cronet-go/lib/android_amd64",
            "direct": false,
            "version": "v0.0.0-20260620135226-def9ff0fb992",
            "ecosystem": "go"
          },
          {
            "name": "github.com/sagernet/cronet-go/lib/android_arm",
            "direct": false,
            "version": "v0.0.0-20260620135226-def9ff0fb992",
            "ecosystem": "go"
          },
          {
            "name": "github.com/sagernet/cronet-go/lib/android_arm64",
            "direct": false,
            "version": "v0.0.0-20260620135226-def9ff0fb992",
            "ecosystem": "go"
          },
          {
            "name": "github.com/sagernet/cronet-go/lib/darwin_amd64",
            "direct": false,
            "version": "v0.0.0-20260620135226-def9ff0fb992",
            "ecosystem": "go"
          },
          {
            "name": "github.com/sagernet/cronet-go/lib/darwin_arm64",
            "direct": false,
            "version": "v0.0.0-20260620135226-def9ff0fb992",
            "ecosystem": "go"
          },
          {
            "name": "github.com/sagernet/cronet-go/lib/ios_amd64_simulator",
            "direct": false,
            "version": "v0.0.0-20260620135226-def9ff0fb992",
            "ecosystem": "go"
          },
          {
            "name": "github.com/sagernet/cronet-go/lib/ios_arm64",
            "direct": false,
            "version": "v0.0.0-20260620135226-def9ff0fb992",
            "ecosystem": "go"
          },
          {
            "name": "github.com/sagernet/cronet-go/lib/ios_arm64_simulator",
            "direct": false,
            "version": "v0.0.0-20260620135226-def9ff0fb992",
            "ecosystem": "go"
          },
          {
            "name": "github.com/sagernet/cronet-go/lib/linux_386",
            "direct": false,
            "version": "v0.0.0-20260620135226-def9ff0fb992",
            "ecosystem": "go"
          },
          {
            "name": "github.com/sagernet/cronet-go/lib/linux_386_musl",
            "direct": false,
            "version": "v0.0.0-20260620135226-def9ff0fb992",
            "ecosystem": "go"
          },
          {
            "name": "github.com/sagernet/cronet-go/lib/linux_amd64",
            "direct": false,
            "version": "v0.0.0-20260620135226-def9ff0fb992",
            "ecosystem": "go"
          },
          {
            "name": "github.com/sagernet/cronet-go/lib/linux_amd64_musl",
            "direct": false,
            "version": "v0.0.0-20260620135226-def9ff0fb992",
            "ecosystem": "go"
          },
          {
            "name": "github.com/sagernet/cronet-go/lib/linux_arm",
            "direct": false,
            "version": "v0.0.0-20260620135226-def9ff0fb992",
            "ecosystem": "go"
          },
          {
            "name": "github.com/sagernet/cronet-go/lib/linux_arm64",
            "direct": false,
            "version": "v0.0.0-20260620135226-def9ff0fb992",
            "ecosystem": "go"
          },
          {
            "name": "github.com/sagernet/cronet-go/lib/linux_arm64_musl",
            "direct": false,
            "version": "v0.0.0-20260620135226-def9ff0fb992",
            "ecosystem": "go"
          },
          {
            "name": "github.com/sagernet/cronet-go/lib/linux_arm_musl",
            "direct": false,
            "version": "v0.0.0-20260620135226-def9ff0fb992",
            "ecosystem": "go"
          },
          {
            "name": "github.com/sagernet/cronet-go/lib/linux_loong64",
            "direct": false,
            "version": "v0.0.0-20260620135226-def9ff0fb992",
            "ecosystem": "go"
          },
          {
            "name": "github.com/sagernet/cronet-go/lib/linux_loong64_musl",
            "direct": false,
            "version": "v0.0.0-20260620135226-def9ff0fb992",
            "ecosystem": "go"
          },
          {
            "name": "github.com/sagernet/cronet-go/lib/linux_mips64le",
            "direct": false,
            "version": "v0.0.0-20260620135226-def9ff0fb992",
            "ecosystem": "go"
          },
          {
            "name": "github.com/sagernet/cronet-go/lib/linux_mipsle",
            "direct": false,
            "version": "v0.0.0-20260620135226-def9ff0fb992",
            "ecosystem": "go"
          },
          {
            "name": "github.com/sagernet/cronet-go/lib/linux_mipsle_musl",
            "direct": false,
            "version": "v0.0.0-20260620135226-def9ff0fb992",
            "ecosystem": "go"
          },
          {
            "name": "github.com/sagernet/cronet-go/lib/linux_riscv64",
            "direct": false,
            "version": "v0.0.0-20260620135226-def9ff0fb992",
            "ecosystem": "go"
          },
          {
            "name": "github.com/sagernet/cronet-go/lib/linux_riscv64_musl",
            "direct": false,
            "version": "v0.0.0-20260620135226-def9ff0fb992",
            "ecosystem": "go"
          },
          {
            "name": "github.com/sagernet/cronet-go/lib/tvos_amd64_simulator",
            "direct": false,
            "version": "v0.0.0-20260620135226-def9ff0fb992",
            "ecosystem": "go"
          },
          {
            "name": "github.com/sagernet/cronet-go/lib/tvos_arm64",
            "direct": false,
            "version": "v0.0.0-20260620135226-def9ff0fb992",
            "ecosystem": "go"
          },
          {
            "name": "github.com/sagernet/cronet-go/lib/tvos_arm64_simulator",
            "direct": false,
            "version": "v0.0.0-20260620135226-def9ff0fb992",
            "ecosystem": "go"
          },
          {
            "name": "github.com/sagernet/cronet-go/lib/windows_amd64",
            "direct": false,
            "version": "v0.0.0-20260620135226-def9ff0fb992",
            "ecosystem": "go"
          },
          {
            "name": "github.com/sagernet/cronet-go/lib/windows_arm64",
            "direct": false,
            "version": "v0.0.0-20260620135226-def9ff0fb992",
            "ecosystem": "go"
          },
          {
            "name": "github.com/sagernet/fswatch",
            "direct": false,
            "version": "v0.1.2",
            "ecosystem": "go"
          },
          {
            "name": "github.com/sagernet/gvisor",
            "direct": false,
            "version": "v0.0.0-20250811-sing-box-mod.1",
            "ecosystem": "go"
          },
          {
            "name": "github.com/sagernet/netlink",
            "direct": false,
            "version": "v0.0.0-20240916134442-83396419aa8b",
            "ecosystem": "go"
          },
          {
            "name": "github.com/sagernet/nftables",
            "direct": false,
            "version": "v0.3.0-mod.2",
            "ecosystem": "go"
          },
          {
            "name": "github.com/sagernet/quic-go",
            "direct": false,
            "version": "v0.59.0-sing-box-mod.5",
            "ecosystem": "go"
          },
          {
            "name": "github.com/sagernet/sing-mux",
            "direct": false,
            "version": "v0.3.5",
            "ecosystem": "go"
          },
          {
            "name": "github.com/sagernet/sing-quic",
            "direct": false,
            "version": "v0.6.1",
            "ecosystem": "go"
          },
          {
            "name": "github.com/sagernet/sing-shadowsocks",
            "direct": false,
            "version": "v0.2.9",
            "ecosystem": "go"
          },
          {
            "name": "github.com/sagernet/sing-shadowsocks2",
            "direct": false,
            "version": "v0.2.2",
            "ecosystem": "go"
          },
          {
            "name": "github.com/sagernet/sing-shadowtls",
            "direct": false,
            "version": "v0.2.1",
            "ecosystem": "go"
          },
          {
            "name": "github.com/sagernet/sing-vmess",
            "direct": false,
            "version": "v0.2.8-0.20250909125414-3aed155119a1",
            "ecosystem": "go"
          },
          {
            "name": "github.com/sagernet/smux",
            "direct": false,
            "version": "v1.5.50-sing-box-mod.1",
            "ecosystem": "go"
          },
          {
            "name": "github.com/sagernet/tailscale",
            "direct": false,
            "version": "v1.92.4-sing-box-1.13-mod.7",
            "ecosystem": "go"
          },
          {
            "name": "github.com/sagernet/wireguard-go",
            "direct": false,
            "version": "v0.0.3",
            "ecosystem": "go"
          },
          {
            "name": "github.com/sagernet/ws",
            "direct": false,
            "version": "v0.0.0-20231204124109-acfe8907c854",
            "ecosystem": "go"
          },
          {
            "name": "github.com/standard-webhooks/standard-webhooks/libraries",
            "direct": false,
            "version": "v0.0.1",
            "ecosystem": "go"
          },
          {
            "name": "github.com/tailscale/certstore",
            "direct": false,
            "version": "v0.1.1-0.20231202035212-d3fa0460f47e",
            "ecosystem": "go"
          },
          {
            "name": "github.com/tailscale/goupnp",
            "direct": false,
            "version": "v1.0.1-0.20210804011211-c64d0f06ea05",
            "ecosystem": "go"
          },
          {
            "name": "github.com/tailscale/hujson",
            "direct": false,
            "version": "v0.0.0-20260302212456-ecc657c15afd",
            "ecosystem": "go"
          },
          {
            "name": "github.com/tailscale/netlink",
            "direct": false,
            "version": "v1.1.1-0.20240822203006-4d49adab4de7",
            "ecosystem": "go"
          },
          {
            "name": "github.com/tailscale/peercred",
            "direct": false,
            "version": "v0.0.0-20250107143737-35a0c7bd7edc",
            "ecosystem": "go"
          },
          {
            "name": "github.com/tailscale/web-client-prebuilt",
            "direct": false,
            "version": "v0.0.0-20251127225136-f19339b67368",
            "ecosystem": "go"
          },
          {
            "name": "github.com/tidwall/gjson",
            "direct": false,
            "version": "v1.19.0",
            "ecosystem": "go"
          },
          {
            "name": "github.com/tidwall/match",
            "direct": false,
            "version": "v1.2.0",
            "ecosystem": "go"
          },
          {
            "name": "github.com/tidwall/pretty",
            "direct": false,
            "version": "v1.2.1",
            "ecosystem": "go"
          },
          {
            "name": "github.com/tidwall/sjson",
            "direct": false,
            "version": "v1.2.5",
            "ecosystem": "go"
          },
          {
            "name": "github.com/u-root/uio",
            "direct": false,
            "version": "v0.0.0-20240224005618-d2acac8f3701",
            "ecosystem": "go"
          },
          {
            "name": "github.com/vishvananda/netns",
            "direct": false,
            "version": "v0.0.5",
            "ecosystem": "go"
          },
          {
            "name": "github.com/wk8/go-ordered-map/v2",
            "direct": false,
            "version": "v2.1.8",
            "ecosystem": "go"
          },
          {
            "name": "github.com/x448/float16",
            "direct": false,
            "version": "v0.8.4",
            "ecosystem": "go"
          },
          {
            "name": "github.com/zeebo/blake3",
            "direct": false,
            "version": "v0.2.4",
            "ecosystem": "go"
          },
          {
            "name": "go.uber.org/multierr",
            "direct": false,
            "version": "v1.11.0",
            "ecosystem": "go"
          },
          {
            "name": "go.uber.org/zap",
            "direct": false,
            "version": "v1.28.0",
            "ecosystem": "go"
          },
          {
            "name": "go.uber.org/zap/exp",
            "direct": false,
            "version": "v0.3.0",
            "ecosystem": "go"
          },
          {
            "name": "go.yaml.in/yaml/v4",
            "direct": false,
            "version": "v4.0.0-rc.4",
            "ecosystem": "go"
          },
          {
            "name": "go4.org/mem",
            "direct": false,
            "version": "v0.0.0-20240501181205-ae6ca9944745",
            "ecosystem": "go"
          },
          {
            "name": "go4.org/netipx",
            "direct": false,
            "version": "v0.0.0-20231129151722-fdeea329fbba",
            "ecosystem": "go"
          },
          {
            "name": "golang.org/x/crypto",
            "direct": false,
            "version": "v0.51.0",
            "ecosystem": "go"
          },
          {
            "name": "golang.org/x/exp",
            "direct": false,
            "version": "v0.0.0-20260508232706-74f9aab9d74a",
            "ecosystem": "go"
          },
          {
            "name": "golang.org/x/mod",
            "direct": false,
            "version": "v0.36.0",
            "ecosystem": "go"
          },
          {
            "name": "golang.org/x/oauth2",
            "direct": false,
            "version": "v0.36.0",
            "ecosystem": "go"
          },
          {
            "name": "golang.org/x/sync",
            "direct": false,
            "version": "v0.20.0",
            "ecosystem": "go"
          },
          {
            "name": "golang.org/x/term",
            "direct": false,
            "version": "v0.43.0",
            "ecosystem": "go"
          },
          {
            "name": "golang.org/x/text",
            "direct": false,
            "version": "v0.37.0",
            "ecosystem": "go"
          },
          {
            "name": "golang.org/x/time",
            "direct": false,
            "version": "v0.15.0",
            "ecosystem": "go"
          },
          {
            "name": "golang.org/x/tools",
            "direct": false,
            "version": "v0.45.0",
            "ecosystem": "go"
          },
          {
            "name": "golang.zx2c4.com/wintun",
            "direct": false,
            "version": "v0.0.0-20230126152724-0fa3db229ce2",
            "ecosystem": "go"
          },
          {
            "name": "golang.zx2c4.com/wireguard/windows",
            "direct": false,
            "version": "v1.0.1",
            "ecosystem": "go"
          },
          {
            "name": "google.golang.org/genproto/googleapis/rpc",
            "direct": false,
            "version": "v0.0.0-20260519071638-aa98bba5eb94",
            "ecosystem": "go"
          },
          {
            "name": "google.golang.org/grpc",
            "direct": false,
            "version": "v1.81.1",
            "ecosystem": "go"
          },
          {
            "name": "google.golang.org/protobuf",
            "direct": false,
            "version": "v1.36.11",
            "ecosystem": "go"
          },
          {
            "name": "gopkg.in/yaml.v3",
            "direct": false,
            "version": "v3.0.1",
            "ecosystem": "go"
          },
          {
            "name": "lukechampine.com/blake3",
            "direct": false,
            "version": "v1.4.1",
            "ecosystem": "go"
          }
        ],
        "collected": true,
        "truncated": false,
        "total_count": 160,
        "direct_count": 11,
        "indirect_count": 149
      }
    },
    "maintainership": {
      "issues": {
        "open_prs": 0,
        "merged_prs": 0,
        "open_issues": 0,
        "closed_ratio": 1,
        "closed_issues": 1,
        "closed_unmerged_prs": 0
      },
      "bus_factor": 1,
      "bot_contributors": 0,
      "top_contributors": [
        {
          "type": "User",
          "login": "mapleafgo",
          "commits": 241,
          "avatar_url": "https://avatars.githubusercontent.com/u/20534139?v=4"
        }
      ],
      "contributors_sampled": 1,
      "top_contributor_share": 1
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "build.yml"
      ],
      "has_docs_dir": true,
      "linter_configs": [
        ".golangci.yml"
      ],
      "has_editorconfig": false,
      "has_linter_config": true,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [
        "go.sum"
      ],
      "scorecard": {
        "checks": [
          {
            "name": "Binary-Artifacts",
            "score": 10,
            "reason": "no binaries found in the repo",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
          },
          {
            "name": "Branch-Protection",
            "score": 0,
            "reason": "branch protection not enabled on development/release branches",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
          },
          {
            "name": "CI-Tests",
            "score": 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": 10,
            "reason": "30 commit(s) and 1 issue activity found in the last 90 days -- score normalized to 10",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
          },
          {
            "name": "Packaging",
            "score": null,
            "reason": "packaging workflow not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
          },
          {
            "name": "Pinned-Dependencies",
            "score": 0,
            "reason": "dependency not pinned by hash detected -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
          },
          {
            "name": "SAST",
            "score": 0,
            "reason": "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": 0,
            "reason": "Project has not signed or included provenance with any releases.",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
          },
          {
            "name": "Token-Permissions",
            "score": 0,
            "reason": "detected GitHub workflow tokens with excessive permissions",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
          },
          {
            "name": "Vulnerabilities",
            "score": 0,
            "reason": "27 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "75fd7b3f0a0a58393d5c92009dc3d3c856235602",
        "ran_at": "2026-07-29T05:33:57Z",
        "aggregate_score": 2.8,
        "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-27T05:00:54Z",
      "oldest_open_prs": [],
      "last_merged_pr_at": null,
      "ci_last_conclusion": null,
      "oldest_open_issues": []
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/mapleafgo/singcast-cli",
    "host": "github.com",
    "name": "singcast-cli",
    "owner": "mapleafgo"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "moderate",
      "name": "Overall health",
      "note": "The weighted overall 59 is calibrated to 63 on the published index scale (record calibration 2026-08-02).",
      "notes": [
        {
          "code": "overall_calibration",
          "params": {
            "raw": 59,
            "calibrated": 63,
            "calibration": "2026-08-02"
          }
        }
      ],
      "value": 63,
      "inputs": {
        "security": 38,
        "vitality": 79,
        "community": 40,
        "governance": 45,
        "calibration": "2026-08-02",
        "engineering": 82,
        "ai_readiness": 86,
        "weighted_overall_raw": 59
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "good",
        "name": "Vitality",
        "value": 79,
        "weight": 0.21,
        "metrics": [
          {
            "key": "development_activity",
            "band": "good",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 72,
            "inputs": {
              "commits_last_year": 212,
              "human_commit_share": 1,
              "days_since_last_push": 2,
              "active_weeks_last_year": 12
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 2 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 2
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "12/52 weeks with commits",
                "points": 8.3,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 12
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "212 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 212
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "30 commit(s) and 1 issue activity found in the last 90 days -- score normalized to 10",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "release_discipline",
            "band": "excellent",
            "name": "Release discipline",
            "note": null,
            "notes": [],
            "value": 90,
            "inputs": {
              "releases_count": 26,
              "latest_release_tag": "v1.1.21",
              "releases_from_tags": false,
              "days_since_latest_release": 2,
              "mean_days_between_releases": 4.7
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "26 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 26
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 2 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 2
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~4.7 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 4.7
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "openssf_scorecard_signed_releases",
                "name": "OpenSSF Scorecard: Signed-Releases",
                "detail": "Project has not signed or included provenance with any releases.",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "abandonment",
            "band": "exceptional",
            "name": "Abandonment",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "cap": null,
              "state": "maintained",
              "guards": [],
              "signals": [],
              "red_flag": false,
              "multiplier_pct": 100,
              "declared_reason": null,
              "unverified_reason": null,
              "unanswered_open_prs": null,
              "unanswered_open_issues": null,
              "days_since_last_merged_pr": null,
              "days_since_last_human_commit": 8,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "last human commit 8 days ago",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_maintained",
                    "params": {
                      "days": 8
                    }
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "weak",
        "name": "Community & Adoption",
        "value": 40,
        "weight": 0.17,
        "metrics": [
          {
            "key": "popularity",
            "band": "at_risk",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 32,
            "inputs": {
              "forks": 17,
              "stars": 25,
              "watchers": 2,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "25 stars",
                "points": 22.4,
                "status": "partial",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 25
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "17 forks",
                "points": 10,
                "status": "partial",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 17
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "2 watchers",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 2
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "moderate",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 50,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "readme_badges": null,
              "has_contributing": false,
              "has_issue_template": false,
              "has_code_of_conduct": false,
              "readme_badge_services": [],
              "has_pull_request_template": false
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 22.5,
                "status": "met",
                "details": [],
                "max_points": 22.5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "recognized license (GPL-3.0)",
                "points": 22.5,
                "status": "met",
                "details": [
                  {
                    "code": "license_standard",
                    "params": {}
                  },
                  {
                    "code": "license_spdx",
                    "params": {
                      "spdx": "GPL-3.0"
                    }
                  }
                ],
                "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": "weak",
        "name": "Sustainability & Governance",
        "value": 45,
        "weight": 0.23,
        "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): PR acceptance, Newcomer PR acceptance. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "pr_acceptance",
                    "newcomer_pr_acceptance"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 74,
            "inputs": {
              "merged_prs": 0,
              "open_issues": 0,
              "closed_issues": 1,
              "prs_merged_7d": null,
              "prs_decided_7d": null,
              "prs_merged_30d": null,
              "prs_decided_30d": null,
              "issue_closed_ratio": 1,
              "closed_unmerged_prs": 0,
              "first_time_authors_30d": null,
              "first_time_prs_merged_30d": null,
              "first_time_prs_decided_30d": null
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "100% of issues closed",
                "points": 42,
                "status": "met",
                "details": [
                  {
                    "code": "issues_closed_share",
                    "params": {
                      "share": 100
                    }
                  }
                ],
                "max_points": 42
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "no decided pull requests or no data",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_decided_prs_or_data",
                    "params": {}
                  }
                ],
                "max_points": 30
              },
              {
                "key": "newcomer_pr_acceptance",
                "name": "Newcomer PR acceptance",
                "detail": "no first-time contributor's PR decided in 30d",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_newcomer_prs",
                    "params": {
                      "days": 30
                    }
                  }
                ],
                "max_points": 13
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 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": 57,
            "inputs": {
              "followers": 35,
              "owner_type": "User",
              "is_verified": null,
              "owner_login": "mapleafgo",
              "public_repos": 46,
              "account_age_days": 3661
            },
            "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": "35 followers of mapleafgo",
                "points": 11.2,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 35,
                      "login": "mapleafgo"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "46 public repos, account ~10 yr old",
                "points": 24.2,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 46
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 10
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          }
        ],
        "description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?"
      },
      {
        "key": "engineering",
        "band": "excellent",
        "name": "Engineering Quality",
        "value": 82,
        "weight": 0.19,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "excellent",
            "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": "1 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 24
              },
              {
                "key": "tests_present",
                "name": "Tests present",
                "detail": null,
                "points": 24,
                "status": "met",
                "details": [],
                "max_points": 24
              },
              {
                "key": "linter_config",
                "name": "Linter config",
                "detail": ".golangci.yml",
                "points": 16,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": ".golangci.yml"
                    }
                  }
                ],
                "max_points": 16
              },
              {
                "key": "pre_commit_hooks",
                "name": "Pre-commit hooks",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 9.6
              },
              {
                "key": "editorconfig",
                "name": ".editorconfig",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.4
              },
              {
                "key": "openssf_scorecard_ci_tests",
                "name": "OpenSSF Scorecard: CI-Tests",
                "detail": "no pull request found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "excellent",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 85,
            "inputs": {
              "topics": [
                "clash",
                "sing-box"
              ],
              "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": "2 topics",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "topics_count",
                    "params": {
                      "count": 2
                    }
                  }
                ],
                "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": "weak",
        "name": "Security",
        "value": 38,
        "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. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "ci_tests",
                    "packaging"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 28,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 16,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 2,
              "scorecard_aggregate": 2.8
            },
            "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": "30 commit(s) and 1 issue activity found in the last 90 days -- score normalized to 10",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "packaging",
                "name": "Packaging",
                "detail": "packaging workflow 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 0",
                "points": 0,
                "status": "missed",
                "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": "Project has not signed or included provenance with any releases.",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "token_permissions",
                "name": "Token-Permissions",
                "detail": "detected GitHub workflow tokens with excessive permissions",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "vulnerabilities",
                "name": "Vulnerabilities",
                "detail": "27 existing vulnerabilities detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              }
            ]
          },
          {
            "key": "dependency_advisories",
            "band": "good",
            "name": "Dependency advisories",
            "note": "Excluded from scoring (no data or not applicable): Indirect dependencies free of known advisories. Remaining weights renormalized. Matched 160 resolved dependencies against OSV. This repository publishes no package the index resolves, so the repository dependency graph was assessed instead. That graph mixes development and test pins with shipped dependencies, so only the declared runtime dependencies are scored; transitive findings are reported as context and excluded from the score. Reachability is not analyzed.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "indirect_dependencies_free_of_known_advisories"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              },
              {
                "code": "advisories_scope_repository",
                "params": {
                  "assessed": 160
                }
              },
              {
                "code": "advisories_repo_graph_caveat",
                "params": {}
              },
              {
                "code": "advisories_reachability",
                "params": {}
              }
            ],
            "value": 76,
            "inputs": {
              "source": "osv",
              "advisories": 42,
              "affected_packages": 6,
              "assessed_packages": 160,
              "unassessed_packages": 0,
              "affected_by_severity": "critical 2, moderate 1, unknown 3",
              "direct_affected_packages": 1
            },
            "components": [
              {
                "key": "direct_dependencies_free_of_known_advisories",
                "name": "Direct dependencies free of known advisories",
                "detail": "1 affected: golang.org/x/net v0.54.0 (moderate 6.5)",
                "points": 16.8,
                "status": "partial",
                "details": [
                  {
                    "code": "advisories_affected",
                    "params": {
                      "count": 1,
                      "packages": "golang.org/x/net v0.54.0 (moderate 6.5)"
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "indirect_dependencies_free_of_known_advisories",
                "name": "Indirect dependencies free of known advisories",
                "detail": "transitive set not separable from development and test dependencies in this scope",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "advisories_scope_not_separable",
                    "params": {}
                  }
                ],
                "max_points": 25
              },
              {
                "key": "no_advisories_left_outstanding",
                "name": "No advisories left outstanding",
                "detail": "no advisory has been public longer than 90 days",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "advisories_none_stale",
                    "params": {
                      "days": 90
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "malicious_dependencies",
            "band": "exceptional",
            "name": "Malicious dependencies",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "source": "osv",
              "meaning": "reported as a malicious package by the OpenSSF corpus; the remedy is removal or moving off the compromised name, never an upgrade of the same artifact. Versions the registry has since pulled are listed but not scored",
              "packages": [],
              "red_flag": false,
              "assessed_packages": 160,
              "malicious_packages": 0,
              "direct_malicious_packages": 0,
              "withdrawn_malicious_packages": 0,
              "installable_malicious_packages": 0
            },
            "components": [
              {
                "key": "no_dependency_reported_as_a_malicious_package",
                "name": "No dependency reported as a malicious package",
                "detail": "no dependency is reported as a malicious package",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "no_malicious_dependencies",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "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": 86,
        "weight": 0.04,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "excellent",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 85,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": 1,
              "agent_instruction_files": [
                "CLAUDE.md"
              ],
              "agent_instruction_max_bytes": 4312
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": "CLAUDE.md",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "CLAUDE.md"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "machine_readable_docs_llms_txt",
                "name": "Machine-readable docs (llms.txt)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "legible_commit_history",
                "name": "Legible commit history",
                "detail": "100 of 100 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 100,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "excellent",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 82,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [
                "go.sum"
              ],
              "has_dockerfile": false,
              "typed_language": true,
              "bootstrap_files": [
                "Taskfile.yml"
              ],
              "has_devcontainer": false,
              "has_linter_config": true,
              "typecheck_configs": [],
              "agent_commit_share": 0.69,
              "toolchain_manifests": [
                "go.mod"
              ],
              "dependency_bot_commit_share": 0
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": "Taskfile.yml",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "Taskfile.yml"
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "automated_tests",
                "name": "Automated tests",
                "detail": null,
                "points": 22,
                "status": "met",
                "details": [],
                "max_points": 22
              },
              {
                "key": "lint_format_config",
                "name": "Lint / format config",
                "detail": ".golangci.yml",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": ".golangci.yml"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "static_type_checking",
                "name": "Static type checking",
                "detail": "Go (statically typed)",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "statically_typed_language",
                    "params": {
                      "language": "Go"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "reproducible_environment",
                "name": "Reproducible environment",
                "detail": "lockfile",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "lockfile"
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "69 of the last 100 commits agent-authored or agent-credited",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "agent_authored_commits",
                    "params": {
                      "count": 69,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "automated_maintenance",
                "name": "Automated maintenance",
                "detail": "no automated dependency updates observed",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_dependency_automation",
                    "params": {}
                  }
                ],
                "max_points": 8
              },
              {
                "key": "openssf_scorecard_pinned_dependencies",
                "name": "OpenSSF Scorecard: Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "exceptional",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "primary_language": "Go",
              "largest_source_bytes": 30128,
              "source_files_sampled": 87,
              "oversized_source_files": 0
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "Go (statically typed)",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "statically_typed_language",
                    "params": {
                      "language": "Go"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "0/87 source files over 60KB",
                "points": 55,
                "status": "met",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 87,
                      "oversized": 0
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          }
        ],
        "description": "How well is the repo equipped to be developed and maintained with AI coding agents? Carries a deliberately small weight: agent tooling is a real maintenance signal, but its absence must never gate the top of the scale (calibration saturates at raw 91, so 100/100 remains reachable with AI Readiness at zero)."
      }
    ],
    "classification": {
      "labels": [],
      "scores": {},
      "primary": null,
      "evidence": [],
      "artifacts": [],
      "confidence": "none",
      "host_extension": false,
      "runs_as_process": false,
      "consumed_by_code": false
    },
    "metrics_version": "2.3.2"
  },
  "warnings": [
    "Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token",
    "go package 'github.com/mapleafgo/singcast' points at a different repository (https://github.com/mapleafgo/singcast); excluded from ecosystem scoring"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-29T05:34:02.801920Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/m/mapleafgo/singcast-cli.svg",
  "full_name": "mapleafgo/singcast-cli",
  "license_state": "standard",
  "license_spdx": "GPL-3.0"
}

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

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

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