公开记录
软件健康报告模式 0.27.0 · 指标 1.13.0 · 2026-07-23 10:53 UTC

yuanguangshan / npm_yuangs

my personal tools

TypeScript未检测到许可证★ 1 星标⑂ 0 复刻始于 2025年11月在 GitHub 上查看 ↗

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

51
总分 / 100
中等

软件健康指数

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

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

评分画像

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

所有权

yuanguangshan个人账户
11 关注者172 个公开仓库始于 2019年6月

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

软件包生态系统

注册表软件包版本月下载量版本数最近发布标签
npmyuangs6.9.302,3752585 天前yuangsclitoolscolorful

按类别列示的指标

活力

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

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

发布纪律

90优秀
评分方式
27/27有发布版本 — 已发布 2 个发布版本
27/36发布时效 — 最近一次发布版本于 180 天前
27/27发布节奏 — 约每 6.3 天发布一次
0/10OpenSSF Scorecard:Signed-Releases — 无数据
所用输入
releases_count2
latest_release_tagv3.30.0
releases_from_tags
days_since_latest_release180
mean_days_between_releases6.3
已排除计分(无数据或不适用):OpenSSF Scorecard:Signed-Releases。 其余权重已重新归一化。

社区与采用

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

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

社区健康

25危急
评分方式
22.5/22.5README
0/22.5许可证 — 未检测到许可证文件
0/18CONTRIBUTING 指南
0/13.5行为准则
0/7.2议题模板
0/6.3PR 模板
所用输入
has_readme
has_license
has_contributing
has_issue_template
has_code_of_conduct
has_pull_request_template
评分方式
45/80月度下载量 — npm 合计每月 2,375 次下载
0/20注册表被依赖数 — 该生态系统不报告此项
所用输入
packagesyuangs
dependents
ecosystemsnpm
total_downloads
monthly_downloads2,375
已排除计分(无数据或不适用):注册表被依赖数。 其余权重已重新归一化。

可持续性与治理

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

40存在风险 · 占总体的 24%
评分方式
9/54巴士系数 — 1 位贡献者贡献了半数提交
4.4/22.5提交分布 — 头号贡献者编写了 80% 的提交
4.1/13.5贡献者广度 — 3 位贡献者
3/10OpenSSF Scorecard:Contributors — project has 1 contributing companies or organizations -- score normalized to 3
所用输入
bus_factor1
contributors_sampled3
top_contributor_share0.805
评分方式
0/46.8议题解决 — 没有议题或无数据
0/38.3PR 接受 — 没有已裁定的拉取请求或无数据
0/15OpenSSF Scorecard:Code-Review — Found 0/30 approved changesets -- score normalized to 0
所用输入
merged_prs0
open_issues0
closed_issues0
issue_closed_ratio
closed_unmerged_prs0
已排除计分(无数据或不适用):议题解决, PR 接受。 其余权重已重新归一化。
评分方式
10/30所有权背书 — 个人(用户)账户
0/20已验证域名 — 不适用于个人账户
7.8/25所有者影响力 — yuanguangshan 有 11 位关注者
25/25既往记录 — 172 个公开仓库,账户约 7 年
所用输入
followers11
owner_typeUser
is_verified
owner_loginyuanguangshan
public_repos172
account_age_days2,583
已排除计分(无数据或不适用):已验证域名。 其余权重已重新归一化。
评分方式
25/25已发布且可解析 — npm 上有 1 个软件包
35/35发布时效 — 最近一次发布于 5 天前
20/20版本历史 — 258 个已发布版本
20/20未被弃用 — 活跃,未被弃用或撤回
所用输入
packagesyuangs
ecosystemsnpm
any_deprecated
min_days_since_publish5

工程质量

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

76良好 · 占总体的 20%

工程实践

60中等
评分方式
24/24CI 工作流 — 1 个工作流
24/24存在测试
0/16Linter 配置
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。 其余权重已重新归一化。

文档

100优秀
评分方式
30/30README
25/25文档目录
15/15文档 / 主页站点 — https://www.npmjs.com/package/yuangs?activeTab=versions
10/10仓库描述
10/10主题标签 — 1 个主题标签
10/10Wiki
所用输入
topicstools
has_wiki
homepagehttps://www.npmjs.com/package/yuangs?activeTab=versions
has_readme
has_docs_dir
has_description

安全

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

29危急 · 占总体的 16%

安全态势

29危急
评分方式
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.8/2.5Contributors — project has 1 contributing companies or organizations -- score normalized to 3
10/10Dangerous-Workflow — no dangerous workflow patterns detected
0/7.5Dependency-Update-Tool — no update tool detected
0/5Fuzzing — project is not fuzzed
0/2.5许可证 — license file not detected
7.5/7.5Maintained — 30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
0/5Packaging — 无数据
0.5/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 1
0/5SAST — no SAST tool detected
0/5Security-Policy — security policy file not detected
0/7.5Signed-Releases — 无数据
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
0/7.5Vulnerabilities — 62 existing vulnerabilities detected
所用输入
sourceopenssf_scorecard
checks_evaluated15
scorecard_versionv5.5.0
checks_inconclusive3
scorecard_aggregate2.9
已排除计分(无数据或不适用):ci_tests, packaging, signed_releases。 其余权重已重新归一化。

AI 就绪度

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

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

关键数据

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

数据采集警告

  • Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token
  • GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository
  • deps.dev does not index npm:yuangs@6.9.30; advisories assessed against the repository dependency graph instead

更多细节

OpenSSF Scorecard 2.9 / 10
2.9综合

来自开源项目 OpenSSF Scorecard 的独立、工具无关的安全评估。每项检查奖励的是安全实践本身,而非特定供应商的工具。Scorecard 无法判定的检查项标记为 不适用,并从安全评分中剔除(绝不按零分计)。Scorecard v5.5.0 · 2026-07-23 10:53 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
3Contributorsproject has 1 contributing companies or organizations -- score normalized to 3
10Dangerous-Workflowno dangerous workflow patterns detected
0Dependency-Update-Toolno update tool detected
0Fuzzingproject is not fuzzed
0Licenselicense file not detected
10Maintained30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
不适用Packagingpackaging workflow not detected
1Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 1
0SASTno SAST tool detected
0Security-Policysecurity policy file not detected
不适用Signed-Releasesno releases found
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
0Vulnerabilities62 existing vulnerabilities detected
直接依赖 22
注册表软件包版本约束清单文件
npmaxios^1.13.2package.json
npmbetter-sqlite3^12.6.2package.json
npmchalk^4.1.2package.json
npmcli-table3^0.6.5package.json
npmcommander^13.1.0package.json
npmexpress^5.2.1package.json
npmjs-yaml^4.1.0package.json
npmjson5^2.2.3package.json
npmmarkdown-it^14.1.0package.json
npmmarked^15.0.12package.json
npmmarked-terminal^7.3.0package.json
npmopen^11.0.0package.json
npmora^5.4.1package.json
npmp-limit^7.2.0package.json
npmpino^10.3.1package.json
npmpino-pretty^13.1.3package.json
npmsocket.io^4.8.3package.json
npmssh2^1.17.0package.json
npmtypescript^5.9.3package.json
npmyuangs^2.29.0package.json
npmzod^4.3.5package.json
npmzod-to-json-schema^3.25.1package.json
全部依赖 未采集

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

原始 JSON 报告 机器可读
{
  "data": {
    "repo": {
      "topics": [
        "tools"
      ],
      "is_fork": false,
      "size_kb": 8330,
      "has_wiki": true,
      "homepage": "https://www.npmjs.com/package/yuangs?activeTab=versions",
      "languages": {
        "TLA": 8039,
        "HTML": 55207,
        "Shell": 27710,
        "Python": 11301,
        "JavaScript": 183905,
        "TypeScript": 1568335
      },
      "pushed_at": "2026-07-18T01:21:33Z",
      "created_at": "2025-11-29T15:08:35Z",
      "owner_type": "User",
      "updated_at": "2026-07-18T01:21:32Z",
      "description": "my personal tools",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": null,
      "default_branch": "main",
      "license_spdx_raw": null,
      "primary_language": "TypeScript",
      "significant_languages": [
        "TypeScript"
      ]
    },
    "owner": {
      "blog": null,
      "name": "yuanguangshan",
      "type": "User",
      "login": "yuanguangshan",
      "company": null,
      "location": null,
      "followers": 11,
      "avatar_url": "https://avatars.githubusercontent.com/u/52271393?v=4",
      "created_at": "2019-06-27T05:45:35Z",
      "is_verified": null,
      "public_repos": 172,
      "account_age_days": 2583
    },
    "license": {
      "state": "absent",
      "spdx_id": null,
      "raw_spdx": null,
      "file_present": false,
      "scorecard_found": false,
      "profile_has_license": false
    },
    "activity": {
      "releases": [
        {
          "tag": "v3.30.0",
          "kind": "minor",
          "published_at": "2026-01-24T10:16:29Z"
        },
        {
          "tag": "v2.5.0",
          "kind": "minor",
          "published_at": "2026-01-18T02:14:36Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "2238f169a08d57306d570940cd245b0741385c95",
          "body": "Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: bump to 6.9.30",
          "author_name": "Qwen Assistant",
          "author_login": null,
          "committed_at": "2026-07-18T01:21:25Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "43b726b2e421196da25086b6a2f9cac47a66118a",
          "body": "StreamMarkdownRenderer 新增 modelUsed 字段 + setModelUsed;finish() 页脚追加\n「 · 模型: <name>」(未设置则不追加)。AgentRuntime.run 每次拿到 LLM thought 后\n调 agentRenderer.setModelUsed(thought.modelName),覆盖路由/-m/默认全路径;多轮\n流程以最后一次为准(最终回答的模型)。仅流式路径有页脚,管道/非 TTY 不受影响。\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(renderer): 响应页脚显示实际使用的模型(模型透明度)",
          "author_name": "Qwen Assistant",
          "author_login": null,
          "committed_at": "2026-07-18T01:21:24Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "34de6c7633f45d1f5b94f5420ba74908ceede635",
          "body": "Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: bump to 6.9.29",
          "author_name": "Qwen Assistant",
          "author_login": null,
          "committed_at": "2026-07-18T00:52:42Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "4dfeac10345b51cb30f413acb7facdba3bb16133",
          "body": "AgentRuntime 与 DualAgentRuntime 两分支的「TTY 流式渲染 + 捕获回答 +\naddToConversationHistory 持久化 + try/catch 报错」逻辑此前逐字重复(~25 行),\n仅 run() 调用签名不同。抽出模块级 streamAndPersist(question, runFn),两分支\n各自只传 runFn 回调屏蔽签名差异,从 ~25 行缩到 ~3 行,防「改一处漏一处」分叉。\n纯重构,行为不变。\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor(cli): 抽 streamAndPersist 公共函数,消除 ai 命令两分支重复",
          "author_name": "Qwen Assistant",
          "author_login": null,
          "committed_at": "2026-07-18T00:52:42Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "7a48dfa2360ff96666c1774b3064abeb0255592e",
          "body": "Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: bump to 6.9.28",
          "author_name": "Qwen Assistant",
          "author_login": null,
          "committed_at": "2026-07-18T00:16:32Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "086c7ad2e17cec66e836bff04abc2d379ec03721",
          "body": "默认路径(autoConfirm=false → DualAgentRuntime)此前有三个问题,本轮一并修复:\n\n- 多轮记忆缺失(iter 11):runFastPath 原本 new AgentRuntime({}) 用空上下文,\n  丢掉已加载的对话历史 → 第 8 轮 buildConversationRecap 拿不到历史。改为把\n  this.context.getMessages() 传给 AgentRuntime(addMessage 前取,避免当前 input 重复)。\n- 强制命令模式(iter 12 Gap#1):runFastPath 硬编码 'command' 模\n[…]\n;TTY 且非 --exec 时流式渲染 +\n  捕获完整回答 + addToConversationHistory 持久化(管道/非 TTY 保持无状态)。\n\n默认路径至此完整:多轮记忆(读 8/9/11 + 写 10/12)+ 对话模式 + TTY 流式。\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(agent): 默认路径(DualAgentRuntime)多轮记忆 + 对话模式 + 流式持久化",
          "author_name": "Qwen Assistant",
          "author_login": null,
          "committed_at": "2026-07-18T00:16:32Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "67aa1334a8b0a32fb99fe9146d2997c1f1d69573",
          "body": "Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: bump to 6.9.27",
          "author_name": "Qwen Assistant",
          "author_login": null,
          "committed_at": "2026-07-17T23:52:25Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "ffa6bfba12363a079c61967a5f43f1559593fa68",
          "body": "cli.ts 此前只读 getConversationHistory、从不调用 addToConversationHistory,\n单轮 yuangs ai 的问答不进历史 → 连续单轮之间无法累积(第 9 轮的跨调用\n历史加载对「连续单轮」场景形同虚设)。TTY 流式分支现捕获完整回答并写回\n历史;管道/脚本走非流式分支保持无状态、不污染历史。顺带补 try/catch 友好报错。\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(cli): 单轮 yuangs ai 持久化对话历史,闭合跨调用多轮记忆",
          "author_name": "Qwen Assistant",
          "author_login": null,
          "committed_at": "2026-07-17T23:52:05Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "699f990c217afeadb0cb02502063a8d4b11ec128",
          "body": "Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: bump to 6.9.26",
          "author_name": "Qwen Assistant",
          "author_login": null,
          "committed_at": "2026-07-17T23:38:07Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "ec11607d6463339506d1f0085ec20062ff94cffe",
          "body": "多轮对话记忆(最重要的修复)\n- LLMCaller.call 之前每轮只发 [summary, 文件项, 当前问题],模型拿不到前几轮对话,\n  无法理解“继续/接着说/上面提到的”。新增 buildConversationRecap:注入最近 6 条\n  user/assistant 对话(排除当前输入、过滤 tool/system、截断)作为 system 消息\n  ——修复「会话内」多轮\n- ContextManager 构造函数之前把 getConversationHistory() 数组当 GovernanceContext,\n  .history 恒为 undefined,跨调用\n[…]\nite fail-to-run:加测试专用直通桩(不动生产依赖),\n  pipeline(AI 聊天管道)suite 转绿\n- 新增 buildConversationRecap / contextManager / dynamicPrompt 缓存命中 用例\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(agent): 多轮对话记忆 + dynamicPrompt 缓存 + 测试修复(iter 5-9)",
          "author_name": "Qwen Assistant",
          "author_login": null,
          "committed_at": "2026-07-17T23:36:50Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "f2de4d5d8d783b6bdcb575eec93d2d8ec4b9a011",
          "body": "Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: bump to 6.9.25",
          "author_name": "Qwen Assistant",
          "author_login": null,
          "committed_at": "2026-07-17T20:48:52Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "9bf101c4647a2c7dc8f1137b248422cfd9d6f755",
          "body": "chat 流式\n- 不再把原始 JSON 直接打到终端:runLLM 包一层 onChunk 增量提取 content 正文\n  (extractStreamableContent),路由/直连两条路径共用\n- 单轮 yuangs ai <q> 在 TTY 下补齐流式(管道/--exec 保持原样)\n\n工具结果展示\n- 只读工具结果行级自适应截断(truncateToolOutputForChat),不再 1000 字符硬截\n- 结果包裹代码块原样展示(wrapAsCodeFence),不被 markdown 破坏\n\nrenderer\n- finish() 视口守卫:内容超出一屏时不再擦行重绘\n[…]\n 出错对用户可见(原只进 logger)\n- 空计划不再询问「是否继续执行」\n\n其它\n- handleAnswer 去掉 10 字符假流式\n- 修好预存失败测试:errorHandling / riskDisclosure / dualAgentRuntime\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(agent): 优化 chat 模式 AI 交互(流式正文/工具结果展示/单轮流式)+ 修复测试",
          "author_name": "Qwen Assistant",
          "author_login": null,
          "committed_at": "2026-07-17T20:48:38Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "9a813748bc49d2af6e4af75be2991e5c2a8dcde6",
          "body": "ExecutionStabilizer.renderAndFinish 之前把渲染缓冲清空成空串再 finish(),\n导致 quietMode 下工具结果不输出(终端空白,内容只进了对话历史)。\n改为 buffer=output,让 read_file / search_in_files / list_files 等结果正常显示。\n\n同时 chat prompt 补充\"严格满足字数/篇幅要求\"规则。\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(agent): 修复 chat 模式只读工具(read_file 等)结果不显示",
          "author_name": "Qwen Assistant",
          "author_login": null,
          "committed_at": "2026-06-30T08:22:07Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "bfcfbdff123c95804ca2d7bd2149cf62b1675ca7",
          "body": "- 新增 buildChatProtocolPrompt:chat 用通用助手 + 默认直接回答的轻量 prompt,\n  去掉\"技术助手\"身份设限,避免知识/写作/翻译类问题被误判为工具任务\n- LLMAdapter.think 按 mode 分流:chat 用轻量 prompt,command 保留完整 agent 协议\n- parseThought 对非法 action_type 兜底(弱模型把工具名当 action_type 时不再死循环)\n- 删除死代码 src/agent/prompt.ts\n- 新增 parseThought 单测覆盖兜底分支\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(agent): 修复 chat 模式知识问答被误判为工具任务的死循环",
          "author_name": "Qwen Assistant",
          "author_login": null,
          "committed_at": "2026-06-30T08:01:05Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "3321f03ca83a9b08b47dc8d21d612be7b2617c37",
          "body": null,
          "is_bot": false,
          "headline": "chore: bump to 6.9.22",
          "author_name": "Qwen Assistant",
          "author_login": null,
          "committed_at": "2026-05-31T06:12:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "83cc58d9d19d9a3d477ebf73a5898702626f0e1a",
          "body": "… flow\n\n- scripts_deep_read.py: deep read script with chapter skeleton + popular highlights + reader thoughts\n- scripts_research.py: add /book/bestbookmarks (热门划线) integration\n- weread-deep-read.md: skill definition for yuangs loader\n- SKILL.md: update to mention bookmark support\n- references/api-notes.md: API documentation",
          "is_bot": false,
          "headline": "feat: add weread-deep-read skill with chapter-by-chapter deep reading…",
          "author_name": "Qwen Assistant",
          "author_login": null,
          "committed_at": "2026-05-31T06:12:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "69f44da6343efacb6bf336aaf89b9dcff0581fe4",
          "body": "Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: 添加微信读书技能相关文档",
          "author_name": "yuanguangshan",
          "author_login": "yuanguangshan",
          "committed_at": "2026-05-29T15:57:06Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "1d179ef87615d1f2f3f59472c3bcf7815deef6a7",
          "body": null,
          "is_bot": false,
          "headline": "chore: bump to 6.9.21",
          "author_name": "Qwen Assistant",
          "author_login": null,
          "committed_at": "2026-05-29T14:20:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5fc9ec01bc183e4081dd1d454104cd55cb70ed26",
          "body": "…/skills/",
          "is_bot": false,
          "headline": "feat: user-defined skill system — load markdown skills from ~/.yuangs…",
          "author_name": "Qwen Assistant",
          "author_login": null,
          "committed_at": "2026-05-29T14:20:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d6c62a7a409ef6689240e6890b6528e131bdb48b",
          "body": null,
          "is_bot": false,
          "headline": "chore: bump to 6.9.20",
          "author_name": "Qwen Assistant",
          "author_login": null,
          "committed_at": "2026-05-29T10:50:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "573637daf9de42018fd477b9df6badd567e16c59",
          "body": null,
          "is_bot": false,
          "headline": "fix: XSS in index.html, keypress leak, ask() hang, dedup :ai/empty-line",
          "author_name": "Qwen Assistant",
          "author_login": null,
          "committed_at": "2026-05-29T10:50:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7a4d8e79a0b97a22b14c192a76598bc399a34930",
          "body": null,
          "is_bot": false,
          "headline": "chore: bump to 6.9.19",
          "author_name": "Qwen Assistant",
          "author_login": null,
          "committed_at": "2026-05-29T10:32:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6a72336120c837b9919e944f1b0a7cbe9b07e0de",
          "body": "…warnings, Enter debounce",
          "is_bot": false,
          "headline": "feat: UX improvements — remove stale help command, config validation …",
          "author_name": "Qwen Assistant",
          "author_login": null,
          "committed_at": "2026-05-29T10:32:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0dd1146a2e4f7f2a06bad3d2858ab249d4bbf287",
          "body": null,
          "is_bot": false,
          "headline": "chore: bump to 6.9.18",
          "author_name": "Qwen Assistant",
          "author_login": null,
          "committed_at": "2026-05-29T10:09:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b3e3bf8ffd9e47bda6a556e7494f9fd26d3c70b8",
          "body": "…prompt",
          "is_bot": false,
          "headline": "fix(shell): replace echo with PROMPT-based hint to survive zle reset-…",
          "author_name": "Qwen Assistant",
          "author_login": null,
          "committed_at": "2026-05-29T10:09:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c87233b25f7210b99c1e47c9d4bb7d79b60b9fbc",
          "body": null,
          "is_bot": false,
          "headline": "chore: bump to 6.9.17",
          "author_name": "Qwen Assistant",
          "author_login": null,
          "committed_at": "2026-05-29T09:50:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0fc728c6d1a8ed5a899d767e326e396d81472c84",
          "body": "Intercept cd commands to use process.chdir() instead of spawning\na subshell, so directory changes persist across commands.",
          "is_bot": false,
          "headline": "feat: support cd in interactive mode",
          "author_name": "Qwen Assistant",
          "author_login": null,
          "committed_at": "2026-05-29T09:50:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d72421db8a50b892d00dc89fad070a5d6b273aa7",
          "body": null,
          "is_bot": false,
          "headline": "chore: bump to 6.9.16",
          "author_name": "Qwen Assistant",
          "author_login": null,
          "committed_at": "2026-05-29T09:39:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fe2c8d1590836a0aca2147d4b328f8af5a783fb5",
          "body": null,
          "is_bot": false,
          "headline": "chore: rebuild dist for v6.9.16",
          "author_name": "Qwen Assistant",
          "author_login": null,
          "committed_at": "2026-05-29T09:39:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b9dea6ace3a0e611710a2b1b5dc5f36cd10fa957",
          "body": "Users can now type a macro name directly (e.g. 'gx') without\nthe 'yuangs macro' prefix — it auto-expands and executes.",
          "is_bot": false,
          "headline": "feat: auto-expand macro names in interactive mode",
          "author_name": "Qwen Assistant",
          "author_login": null,
          "committed_at": "2026-05-29T09:39:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6d3006cc55e4b765940c7f369f50cfa6818f8784",
          "body": null,
          "is_bot": false,
          "headline": "chore: bump to 6.9.15",
          "author_name": "Qwen Assistant",
          "author_login": null,
          "committed_at": "2026-05-29T08:17:22Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c6cf1cad992bcfc4e52626aadb42036f7879c5fd",
          "body": "…ENDING\n\nOh My Zsh's _omz_async_request triggers zle reset-prompt asynchronously,\ncausing precmd() to re-run with $?=0 and clearing __YU_AI_PENDING\nbefore the user presses Enter. Add early return if already pending.",
          "is_bot": false,
          "headline": "fix(shell): guard precmd against async zle reset-prompt clearing AI_P…",
          "author_name": "Qwen Assistant",
          "author_login": null,
          "committed_at": "2026-05-29T08:11:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a3ae03b67e2e7b612b5025e4492800c7a53f6b36",
          "body": "Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: bump version to 6.9.14 and add TLA+ tools cache to CI",
          "author_name": "Qwen Assistant",
          "author_login": null,
          "committed_at": "2026-05-06T01:31:09Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "817df83a0faf311626fd175487f7969fc66b663e",
          "body": null,
          "is_bot": false,
          "headline": "chore: bump version to 6.9.13",
          "author_name": "Qwen Assistant",
          "author_login": null,
          "committed_at": "2026-05-05T14:29:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "36b7d8c375c01d967729838a0b93f5661acda4ae",
          "body": "- Delete 35 archived implementation reports (restorable from backup branch)\n- Replace optimization-log.md with Git-based archive reference\n- Condense api/reference.md: 3460 → 65 lines\n- Condense tab-completion.md: 1034 → 42 lines\n- Condense governance-demo-guide.md: 535 → 67 lines\n- Condense model-r\n[…]\nd: 414 → 36 lines\n- Condense git-integration.md: 328 → 40 lines\n- Condense git-shortcuts.md: 253 → 22 lines\n\nTotal: 21,588 → 4,083 lines (-81%)\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: trim documentation from 21.5k to 4k lines",
          "author_name": "Qwen Assistant",
          "author_login": null,
          "committed_at": "2026-05-05T11:08:56Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "ada40f2ae959c4287974708ba5b63dd662a365df",
          "body": "- Add docs/README.md: central navigation hub with tables by role\n- Add docs/architecture/optimization-log.md: index of archived reports\n- Add docs/user-guide/configuration.md: config guide with JSON/YAML examples\n- Fix model-router.md stale links to archived locations\n- Include x-resolver.md content cleanup from rename\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: add navigation hub and fix cross-references",
          "author_name": "Qwen Assistant",
          "author_login": null,
          "committed_at": "2026-05-05T10:54:33Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "557cc34e44413800d2cfaad4f2d0f896a86f386d",
          "body": "Move 57 files from flat docs/ into organized hierarchy:\n- docs/optimizations/ → docs/architecture/archived/ (21 files)\n- docs/reference/ → docs/user-guide/ (9 user guides)\n- docs/reference/ → docs/features/ (8 feature docs)\n- docs/reference/ → docs/architecture/archived/ (11 implementation reports)\n\n[…]\noot docs files → appropriate subdirectories\n- Delete empty optimizations/ and reference/ directories\n\nAll moves use git mv to preserve history.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: restructure documentation tree",
          "author_name": "Qwen Assistant",
          "author_login": null,
          "committed_at": "2026-05-05T10:54:11Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "8869071b5c8d0a0d3b06da621c106105c7efd62e",
          "body": "Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: add Java dependency hint and workflow slogan to verification guide",
          "author_name": "Qwen Assistant",
          "author_login": null,
          "committed_at": "2026-05-05T10:32:01Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "ab68e4977393d2d60e2087c9f83d1bca5284f924",
          "body": "Add violation consequences table, detailed TLC bug history with lessons,\nand structured workflow guidance. Improve mapping honesty.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: rewrite verification guide for newcomers and future self",
          "author_name": "Qwen Assistant",
          "author_login": null,
          "committed_at": "2026-05-05T10:28:24Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "d47745f14637117c0aa99228b9bb168c95552fe3",
          "body": "Add direct vs conceptual mapping strength for each invariant,\nrecord known TLC-discovered defects, and update architecture overview.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: update TLA+ verification guide with accurate code mappings",
          "author_name": "Qwen Assistant",
          "author_login": null,
          "committed_at": "2026-05-05T10:19:31Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "62170b88c8f21a225392c041fd8982e5587c10f9",
          "body": "IssueCap now guards against cap \\notin revokedCaps to prevent\nre-issuance of revoked tokens, maintaining caps ∩ revokedCaps = {}.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(tla): prevent re-issuing revoked capabilities tokens",
          "author_name": "Qwen Assistant",
          "author_login": null,
          "committed_at": "2026-05-05T10:07:48Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "f638d9407893a57a6cf79039b2b3a44e0e5a53e1",
          "body": "REJECTED is a legitimate terminal state in the governance flow.\nAdd CHECK_DEADLOCK FALSE to .cfg so TLC treats this as expected termination.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(tla): allow deadlock in TLC model checking",
          "author_name": "Qwen Assistant",
          "author_login": null,
          "committed_at": "2026-05-05T10:03:33Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "fd97435f353a37ec475eb51118d206f7735a2947",
          "body": "TLC found RevokeCap violated TypeOk invariant: caps ∩ revokedCaps = {}.\nThe cap was added to revokedCaps but not removed from caps. Now both\nsets remain disjoint as required.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(tla): remove revoked cap from caps in RevokeCap",
          "author_name": "Qwen Assistant",
          "author_login": null,
          "committed_at": "2026-05-05T09:57:31Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "601cd02cb7a038aaa4b97a96da909672007df8d4",
          "body": "STRING quantifier in Next is not enumerable by TLC. Remove the\nunused scope parameter to eliminate the STRING bound.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(tla): remove unused scope parameter from IssueCap",
          "author_name": "Qwen Assistant",
          "author_login": null,
          "committed_at": "2026-05-05T09:51:44Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "c45a1f5366c00800cbb92093b7b1a9d55858b152",
          "body": "TLC can't use pre-defined STRING as function domain. Introduce finite\nSnapshotIds constant for snapshots, simplify Execute/Rollback actions.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(tla): replace STRING snapshot domain with SnapshotIds constant",
          "author_name": "Qwen Assistant",
          "author_login": null,
          "committed_at": "2026-05-05T09:48:10Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "ba9330cdd23a33867b1515a54eb34302512eed04",
          "body": "TLC cfg <- bindings only work for nullary constants. Parameterized\noperators must be defined directly in the spec.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(tla): inline operator definitions, remove cfg bindings",
          "author_name": "Qwen Assistant",
          "author_login": null,
          "committed_at": "2026-05-05T09:42:24Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "0f3f231a64e0f472adac5e4fbaa5eac8b48eaccb",
          "body": "Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: bump version to 6.9.6",
          "author_name": "Qwen Assistant",
          "author_login": null,
          "committed_at": "2026-05-05T09:38:38Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "029b4428742a3520ace7f2f3d327d9a316581cfb",
          "body": "Declare CapabilitySubject, CapabilityGrant, GetActualChanges as CONSTANTS\nin .tla, define Mock implementations in spec, and bind them via <- in .cfg.\nAlso add missing States constant to .cfg.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(tla): use CONSTANTS with cfg <- bindings for external operators",
          "author_name": "Qwen Assistant",
          "author_login": null,
          "committed_at": "2026-05-05T09:38:38Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "f89092786d7bc82f89243106532a1fc75c01d225",
          "body": "Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(tla): restore missing VARIABLES declaration",
          "author_name": "Qwen Assistant",
          "author_login": null,
          "committed_at": "2026-05-05T09:36:03Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "0a1659e4a2045a28109975a1f5d197f69475279b",
          "body": "Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: bump version to 6.9.3",
          "author_name": "Qwen Assistant",
          "author_login": null,
          "committed_at": "2026-05-05T09:33:47Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "49a6522e0de36c4370356673e8285cecb54934bf",
          "body": "CapabilitySubject and CapabilityGrant (pure operators) placed before\nVARIABLES declarations. GetActualChanges (references declaredChanges\nvariable) placed immediately after VARIABLES.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(tla): move operator definitions before their first use",
          "author_name": "Qwen Assistant",
          "author_login": null,
          "committed_at": "2026-05-05T09:33:46Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "42d50c3e39f43964e5329f9773e32b1cc3aa2ba4",
          "body": "Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: bump version to 6.9.2",
          "author_name": "Qwen Assistant",
          "author_login": null,
          "committed_at": "2026-05-05T09:31:33Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "2e076eda08f2cac42f9b53b6d50d5d145f399bbb",
          "body": "TLC requires operators at parse time, not just model-check time.\nReplace MockCapabilitySubject/MockCapabilityGrant/MockGetActualChanges\nwith direct CapabilitySubject/CapabilityGrant/GetActualChanges\noperator definitions.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(tla): define operators directly instead of via cfg binding",
          "author_name": "Qwen Assistant",
          "author_login": null,
          "committed_at": "2026-05-05T09:24:08Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "04726ae8c08580cab2a40ba18a9f96331f857ac3",
          "body": "CapabilitySubject, CapabilityGrant, GetActualChanges are parameterized\nMock operators defined in the .tla file and bound via <- in the .cfg.\nThey must not be declared as CONSTANTS (TLC treats them as nullary).\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(tla): remove constant declarations for operators bound via .cfg",
          "author_name": "Qwen Assistant",
          "author_login": null,
          "committed_at": "2026-05-05T09:22:24Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "3bffb5eb7bce3980c4db81436e829a390c19065a",
          "body": "Declare CapabilitySubject, CapabilityGrant, GetActualChanges as regular\nCONSTANTS instead of underscore function syntax, and bind them to Mock\nimplementations via <- in .cfg file.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(tla): resolve Unknown operator TLC parsing errors",
          "author_name": "Qwen Assistant",
          "author_login": null,
          "committed_at": "2026-05-05T09:20:08Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "42a141f667897a9f4816f4509640f57e2e098082",
          "body": null,
          "is_bot": false,
          "headline": "fix(tla): add STRING constant for TLC model checking",
          "author_name": "Qwen Assistant",
          "author_login": null,
          "committed_at": "2026-05-05T09:15:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2ad4434bd08663ab8889738a2034d8ce2e8f2c98",
          "body": null,
          "is_bot": false,
          "headline": "chore: bump version to 6.9.1",
          "author_name": "Qwen Assistant",
          "author_login": null,
          "committed_at": "2026-05-05T09:13:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2a8d71f77604b805ae5d224db7b1fe2c6c699157",
          "body": "Add verify-tla job that runs TLC model checking on CodeChangeGovernanceV2.tla\nbefore npm publish. If any of the 5 safety invariants (approval, capability,\nno-extra-changes, no-execute-after-revocation, no-double-execute) are violated,\nthe publish pipeline will fail immediately.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "ci: add TLA+ model check as publish quality gate",
          "author_name": "Qwen Assistant",
          "author_login": null,
          "committed_at": "2026-05-05T09:08:47Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "d89d129df6b643b30c8c06ac15e755a9b0113fe4",
          "body": "Delete original CodeChangeGovernance.tla (TLC-unrunnable due to\nundefined constants, invalid invariant syntax, THEOREM/PROVE blocks).\n\nAdd V2 with:\n- 9 complete state variables (added revokedCaps, execHistory)\n- 7 state transitions including VerifyFail path\n- 5 safety invariants (P1-P5): approval, c\n[…]\nute-after-revocation, no-double-execute\n- TLC-compatible Mock implementations\n- Verification guide with architecture mapping to TypeScript code\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: replace broken TLA+ spec with verified CodeChangeGovernanceV2",
          "author_name": "Qwen Assistant",
          "author_login": null,
          "committed_at": "2026-05-05T08:57:12Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "561184eb68aee2d3f07d128e80607793b2c3db43",
          "body": null,
          "is_bot": false,
          "headline": "add",
          "author_name": "Qwen Assistant",
          "author_login": null,
          "committed_at": "2026-05-05T08:04:42Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b80178cb28717886cde8c923632458815b6b5b82",
          "body": "…d tests\n\n- Replace all console.log/warn/error in at-handler.ts and exec-handler.ts\n  with logger.child('SyntaxHandler').info/warn/error pattern\n- Add 18 unit tests for newly split syntax modules (pure functions):\n  tokenizeWithQuotes (6), parseCatSpec (6), getLanguageByPath (6)\n- Test suite: 417 pass (was 399), 13 fail (same baseline)\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor: replace console.log with pino logger in syntax modules + ad…",
          "author_name": "Qwen Assistant",
          "author_login": null,
          "committed_at": "2026-05-05T07:12:19Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "d35016a752b544c93a1343c1ef272e2a5276d4c9",
          "body": "1. Split syntaxHandler.ts (1164 lines) → 8 focused modules under\n   src/utils/syntax/ with identical public API (handleSpecialSyntax,\n   tokenizeWithQuotes, resolveFilePathsAndQuestion).\n\n2. Remove all @ts-nocheck (13 → 0) from test files, fix real type\n   errors: missing resolve property, wrong arg\n[…]\nunts, implicit any.\n\n3. Add SessionCache for short-TTL I/O caching (applied to\n   ContextGatherer.getFileTree to avoid redundant git ls-files).\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: Phase 5 code quality repayment - split, typesafety, cache",
          "author_name": "Qwen Assistant",
          "author_login": null,
          "committed_at": "2026-05-05T07:06:32Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "7e0fcaa6e18bfef283acf0b9a630d6638a5e3a8d",
          "body": "Eliminate 4 separate pattern definitions into a single authoritative\nsource at src/agent/security/dangerousPatterns.ts (27 patterns).\nAll consumers (commandSemantics, policy engine, SSH CLI, SSH web\nterminal) now import from the unified source. Zero duplicate\ndefinitions remaining.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: unify dangerous shell patterns across entire codebase",
          "author_name": "Qwen Assistant",
          "author_login": null,
          "committed_at": "2026-05-05T05:25:59Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "7d399567a986cbeb6522f36be9721d9e3fb52cdc",
          "body": "- Replace dynamic import of AgentRuntime with static import in DualAgentRuntime\n- Extract dangerous shell patterns to shared constants (single source of truth)\n- Remove unused imports across 5 files (LLMAdapter, GovernanceService, fs, etc.)\n- Delete dead code: engine/ directory (5 files), ModelRegis\n[…]\nr\n- Remove dead methods from GitService (5 uncallable methods)\n- Remove stale dist/core/ConfigManager.* build artifacts\n- Bump version to 6.5.0\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor: eliminate dead code, circular imports, and policy duplication",
          "author_name": "Qwen Assistant",
          "author_login": null,
          "committed_at": "2026-05-05T04:13:31Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "d197aa799adb387aa7c29ab43c234257ec83a4c2",
          "body": "Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: bump version to 6.4.0",
          "author_name": "Qwen Assistant",
          "author_login": null,
          "committed_at": "2026-05-04T21:54:28Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "14230b36e51b812bf2e5e050415c9f145186edde",
          "body": "…work\n\n- Split ExecutionHandler (476→242 lines) into 5 focused classes\n  (Stabilizer, Completer, Recovery, Learning, Types)\n- Delete ConfigManager dead code (superseded by ConfigService)\n- Convert 16 dynamic imports to static (-44%, 36→20)\n- Upgrade security model with PolicyEngine + WorkdirWritePolicy\n  in PreFlightChecker\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor: Phase 4 architecture repayment - split, dedup, policy frame…",
          "author_name": "Qwen Assistant",
          "author_login": null,
          "committed_at": "2026-05-04T21:54:10Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "3f2881f0988c1e09a0c155a94690c14ea2b4da4b",
          "body": "Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: add dependencies update and AI feature tests",
          "author_name": "Qwen Assistant",
          "author_login": null,
          "committed_at": "2026-05-04T21:17:03Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "ae4aaede6514e8f23fef4aab5868dbc7294f697e",
          "body": "…afety\n\n- Replace console.log with pino-based structured logger in agent path\n- Add FileStorage persistence for ErrorTracker and Skills\n- Fix 27+ compilation errors from ProposedActionPayload type refinement\n- Add type guards (isToolCallPayload, isShellCmdPayload, isAnswerPayload)\n- Integrate Git backup/rollback for write operations\n- Unify skills load/save logic across skills.ts and skillsCommands.ts\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: Phase 3 observability - structured logging, persistence, type s…",
          "author_name": "Qwen Assistant",
          "author_login": null,
          "committed_at": "2026-05-04T21:16:36Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "45153ec1f9d05e91b8cea0856c21356b8eb36c03",
          "body": "Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: bump version to 6.3.0",
          "author_name": "Qwen Assistant",
          "author_login": null,
          "committed_at": "2026-05-04T18:23:58Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "3dce32514f99ff4301afcb6c9c25796c5155ea8c",
          "body": "- 稳定化检测从比较第一行改为比较前500字符\n- 预执行阶段拦截重复工具调用(force_break机制)\n- chat模式下读取工具结果直接展示,不依赖AI再次调用\n- 语义完成检测支持多行输出(最大/最小文件查询)\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: 修复重复工具调用和过早稳定化问题",
          "author_name": "Qwen Assistant",
          "author_login": null,
          "committed_at": "2026-05-04T18:23:45Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "67c43d2e7bc80b20f4b244c182121c3bc7ec3210",
          "body": "Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: bump version to 6.2.3",
          "author_name": "Qwen Assistant",
          "author_login": null,
          "committed_at": "2026-05-04T18:05:44Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "f8e165c2b9ae801b3f13f1a362319849f25cdd78",
          "body": "Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: 修复 generateToolDefinitionsPrompt 的模板字符串语法错误",
          "author_name": "Qwen Assistant",
          "author_login": null,
          "committed_at": "2026-05-04T18:05:22Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "9657c06685d1475ab64b1273c7973d5a9dad5969",
          "body": "1. 命令语义分类系统 (commandSemantics.ts)\n   - 将 shell 命令分类为 READ/SEARCH/LIST/WRITE/DANGEROUS\n   - 实现白名单安全模型,替代原有黑名单模式\n   - 支持路径安全验证,防止 cd 到系统目录\n\n2. 大结果存储系统 (toolResultStorage.ts)\n   - 工具输出超过 2KB 时自动持久化到临时文件\n   - 返回预览 + 文件路径引用\n   - 自动清理过期结果\n\n3. 路径/目录验证 (集成在 commandSemantics 中)\n   - 验证 shell 执行的工作目录\n   - 拦截对\n[…]\nlls 系统 (promptSkills.ts)\n   - 预定义技能模板:git_ops, code_analysis, file_ops, troubleshooting\n   - 根据用户输入自动匹配并注入专用 prompt\n   - 与现有 skills.ts(学习积累型)互补\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: 引入 Claude Code 源码的四个核心模式",
          "author_name": "Qwen Assistant",
          "author_login": null,
          "committed_at": "2026-05-04T17:50:14Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "4e527526aeb1ba3c75c358af2daba0578d0a3a9e",
          "body": "当用户问题涉及分析(如\"哪个文件最大/最小\"),不应直接格式化工具结果,\n而应让 AI 基于结果进行分析回答。\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: 复杂查询不走 tryFormatToolResult 直接格式化",
          "author_name": "Qwen Assistant",
          "author_login": null,
          "committed_at": "2026-05-04T17:36:13Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "9caa871c6e4f5baf04b326a812320176aa99beb5",
          "body": "对于 list_files 等只读工具的 JSON 输出,直接解析并格式化为\n人类可读的摘要(如 \"📁 19 个文件,📂 15 个目录\"),\n避免额外 LLM 调用带来的 ~4s 延迟。\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: REPL chat 模式下简单只读查询直接格式化结果返回",
          "author_name": "Qwen Assistant",
          "author_login": null,
          "committed_at": "2026-05-04T17:33:44Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "2c170a3cd74ee6225d626ce19ceba42147fe9069",
          "body": "在 chat 模式下,只读工具执行成功后不自动完成,而是让 AI 基于工具结果\n组织自然语言回答。避免直接输出原始 JSON 造成的体验问题。\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: REPL chat 模式下只读工具不再自动打印原始 JSON",
          "author_name": "Qwen Assistant",
          "author_login": null,
          "committed_at": "2026-05-04T17:30:44Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "977515cbefdd6c0ca5b6b1fd7f7caf672d92d588",
          "body": "在 chat 模式下,只读工具执行成功后不应 auto-complete 直接打印原始输出,\n而应让 AI 基于工具结果组织自然语言回答。\n添加 mode === 'chat' 检查,chat 模式下提示 AI 给出简洁的中文回答。\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: REPL 模式下 AI 直接打印原始 JSON 而非组织回答",
          "author_name": "Qwen Assistant",
          "author_login": null,
          "committed_at": "2026-05-04T17:29:04Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "112ed41bbea8ec7e0d269bd196cd640c3cbf5a46",
          "body": null,
          "is_bot": false,
          "headline": "6.2.1",
          "author_name": "Qwen Assistant",
          "author_login": null,
          "committed_at": "2026-05-04T17:23:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "47df3903f703b6347116ddae6e3ea16a8773ed85",
          "body": "StreamMarkdownRenderer.finish() 被 AgentRuntime 和 handleAIChat 各调用一次,\n导致耗时分隔线输出两次。添加 finished 状态 guard,确保 finish() 只渲染一次。\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: 修复 REPL 模式下耗时提醒重复显示的问题",
          "author_name": "Qwen Assistant",
          "author_login": null,
          "committed_at": "2026-05-04T17:21:33Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "41a2bac77d649eee08cb0aa74c302ca3ae30a723",
          "body": "- 添加 OS 检测注入 macOS/BSD 上下文到 system prompt,防止 AI 生成 GNU 命令(如 du -b)\n- 新增 isSemanticComplete 检测,当输出已经是直接答案时自动完成(避免多轮空转)\n- 强化重复错误检测:明确列出失败命令并加入对话黑名单\n- 添加截断输出引导,告诉 AI 直接展示已有结果\n- 修复模型快捷方式映射错误(-p → Pro, -f → Flash, -l → Lite)\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: 增强 AgentRuntime 语义完成检测与 OS 上下文注入",
          "author_name": "Qwen Assistant",
          "author_login": null,
          "committed_at": "2026-05-04T16:46:29Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "3ab805c6f1a238a5e97ec31d98630e9473c5250b",
          "body": null,
          "is_bot": false,
          "headline": "6.1.0",
          "author_name": "Qwen Assistant",
          "author_login": null,
          "committed_at": "2026-03-06T16:21:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2990e9b2c7af952bd3d25b65ca599688690c75b7",
          "body": null,
          "is_bot": false,
          "headline": "6.0.0",
          "author_name": "Qwen Assistant",
          "author_login": null,
          "committed_at": "2026-03-06T16:21:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2e385180909edac55853c1c4e0e4c910e5fe2af3",
          "body": null,
          "is_bot": false,
          "headline": "5.68.0",
          "author_name": "Qwen Assistant",
          "author_login": null,
          "committed_at": "2026-03-06T16:19:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7674af2e9b0fcdab3c85ce045d103fdc5e41a959",
          "body": "- CodeGenerator: 添加 WriteOptions 接口(dryRun, maxFileSize, warnOnOverwrite)\n- CodeGenerator: 改进 cleanOldBackups 支持 maxAgeDays 参数\n- fileReader: 添加 maxFileSize, maxContentLength, encoding 配置\n- fileReader: buildPromptWithFileContent 支持可配置截断长度\n- TodoManager: 改进 parseTodoFile 和 updateTaskStatus 错误处理\n- AutoWorkflow: 集成 WriteOptions 并改进错误处理\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: 完善文件读写工具的健壮性和安全性",
          "author_name": "yuanguangshan",
          "author_login": "yuanguangshan",
          "committed_at": "2026-03-06T16:18:42Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "9613827b358a8d162323335d24d7a40d329602bf",
          "body": null,
          "is_bot": false,
          "headline": "5.67.0",
          "author_name": "Qwen Assistant",
          "author_login": null,
          "committed_at": "2026-03-06T16:04:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e03e1cb6095e277fe6fc8d358c60e56ad25373b4",
          "body": "在 writeGeneratedCode 中添加路径验证:\n- 使用 path.resolve() 解析绝对路径\n- 检查目标路径是否在 baseDir 内\n- 跳过越出项目目录的不安全路径\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "security: 添加路径安全检查,防止越出项目目录",
          "author_name": "yuanguangshan",
          "author_login": "yuanguangshan",
          "committed_at": "2026-03-06T16:03:35Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "1478a8f4c12abdac2e9e996d41183ae9aee7ffd8",
          "body": null,
          "is_bot": false,
          "headline": "5.66.0",
          "author_name": "Qwen Assistant",
          "author_login": null,
          "committed_at": "2026-03-06T15:54:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f9976f7e2ec36660f132ac925aeb920c1b11347c",
          "body": "问题1: TodoManager 正则不支持 \"新增文件:\\`path\\`\" 格式\n修复: FILE_CHANGE_REGEX 支持 \"文件\" 关键字和中文冒号\n\n问题2: CodeGenerator 不支持 \"filepath:路径\" 单行格式\n修复: 添加 pattern7 支持 \\`filepath:相对路径\\n代码\\n\\` 格式\n\n测试验证:\n- yuangs git plan 生成包含 [文件变更] 的 todo.md\n- yuangs git auto 正确解析 targetFiles 并创建文件\n- skills/yuangs-autopilot/test_runner.sh 创建成功\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: 修复 git auto 无法正确写入目标文件的两个问题",
          "author_name": "yuanguangshan",
          "author_login": "yuanguangshan",
          "committed_at": "2026-03-06T15:51:39Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "ea4c0c42f8cfeb9254b772c2dcc3c7458e9f9b9a",
          "body": null,
          "is_bot": false,
          "headline": "5.65.0",
          "author_name": "Qwen Assistant",
          "author_login": null,
          "committed_at": "2026-03-06T15:28:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8285ecdec50f2aad1105181b5eb56de5ddad95a5",
          "body": "问题:\n- TodoManager.parseTodoFile 只解析任务描述,忽略 [文件变更] 部分\n- AutoWorkflow.generateCode 的 prompt 没有目标文件信息\n- 导致 AI 不知道要修改哪个文件,生成通用设计文档而非代码\n\n修复:\n1. TaskStatus 接口添加 targetFiles?: string[] 字段\n2. parseTodoFile 解析 [文件变更] 部分提取目标文件列表\n3. generateCode 在 prompt 中包含目标文件信息\n\n测试验证:\n- 解析 \"修改 \\`src/utils/fs.ts\\`\" 正确提取 \"src/utils/fs.ts\"\n- targetFiles 正确传递到 AI prompt\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: yuangs git auto 现在能正确传递目标文件信息给 AI",
          "author_name": "yuanguangshan",
          "author_login": "yuanguangshan",
          "committed_at": "2026-03-06T15:26:43Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "33fdd69b55bd2a3fadd833c8e31a2fd16ed94a79",
          "body": null,
          "is_bot": false,
          "headline": "5.64.0",
          "author_name": "Qwen Assistant",
          "author_login": null,
          "committed_at": "2026-02-24T13:11:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ca21fc3a8092a6cae8d5432a1c01bbaf7c84c2d8",
          "body": "自动解析 JSON - 从响应中提取 JSON 对象\n提取内容字段 - 获取 content、final_answer 或 text 字段\n渲染 Markdown - 只渲染提取的内容,而不是原始 JSON\n修复说明:\n\n问题\t原因\t解决方案\n显示原始 JSON\t渲染器直接输出完整 buffer\t添加 extractContentFromJSON() 方法解析并提取 content 字段\nMarkdown 无法解析\tJSON 格式未被处理\t解析后只渲染 content 中的 Markdown 文本\n现在再次运行 yuangs ai -m glm-4.7,你应该能看到正确渲染的 Markdown 输出了,格式类似:",
          "is_bot": false,
          "headline": "现在当 AI 返回 JSON 格式响应时,渲染器会:",
          "author_name": "Qwen Assistant",
          "author_login": null,
          "committed_at": "2026-02-24T13:10:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "af7042354b12fcb8062ee34ed87f44bcb8826352",
          "body": null,
          "is_bot": false,
          "headline": "5.63.0",
          "author_name": "Qwen Assistant",
          "author_login": null,
          "committed_at": "2026-02-24T11:49:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "be009df2383c0286a0862bbe2519d4b4719fb53c",
          "body": "错误\t文件\t修复内容\nType 'number' is not assignable to type '0.5'\trelevance.ts:492\t添加显式类型注解 let score: number = ...\nProperty '[RoutingStrategy.AUTO]' is missing\tAdaptiveWeights.ts:90\t添加 RoutingStrategy.AUTO 到 DEFAULT_WEIGHTS\nProperty 'BALANCED' does not exist\t多个文件\t将 RoutingStrategy.BALANCED 改为 RoutingStrategy.AUTO\nClass incorrectly extends base class\tMultiMetricSupervisor.ts:63\t重命名 noop 方法为 createNoopAction\nProperty 'taskMatch' is incompatible\tAdaptiveWeights.ts:19\t将 WeightConfig 属性改为可选\n构建成功 ✅",
          "is_bot": false,
          "headline": "修复总结",
          "author_name": "Qwen Assistant",
          "author_login": null,
          "committed_at": "2026-02-24T11:49:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8381af3608618581fc39b9970ee851a9cb77e351",
          "body": null,
          "is_bot": false,
          "headline": "5.62.0",
          "author_name": "Qwen Assistant",
          "author_login": null,
          "committed_at": "2026-02-24T11:41:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f6c55453b5c70a78390c33de90282c584f9b734d",
          "body": "文件\t新增/修改\t说明\nsrc/core/modelRouter/AdaptiveWeights.ts\t新增\t自适应权重学习系统\nsrc/core/modelRouter/MultiMetricSupervisor.ts\t新增\t多指标综合决策监督器\nsrc/agent/governance/riskScoring.ts\t新增\t风险评分量化模型\nsrc/agent/PlanCache.ts\t新增\t计划缓存系统 (已修复)\nsrc/core/modelRouter/ModelRouter.ts\t修改\t集成自适应权重、渐进式恢复\nsrc/core/modelRouter/policies/DslPolicy.ts\t修改\t支持动态权重覆盖\nsrc/agent/governance.ts\t修改\t集成风险评分\nsrc/agent/DualAgentRuntime.ts\t修改\t集成计划缓存\nsrc/agent/state.ts\t修改\t添加 riskScore 字段\n所有优化已完成并通过代码审查!",
          "is_bot": false,
          "headline": "完整的优化文件清单",
          "author_name": "Qwen Assistant",
          "author_login": null,
          "committed_at": "2026-02-24T11:24:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6f21fa4e6cd9347646911ff38a445e5e8e2f870c",
          "body": "章节\t内容\nQuick Reference\t最常用命令速查\nCore Commands\tai, list, history, macros 等\nAI Command Options\t-e, -m, -p, -f, -l, -w, --planner 等\nGit Commands\tcommit, review, plan, exec, auto, resolve 等\nConfig Commands\tmodel, get, set, list\nPreferences Commands\tlist, get, set, reset, setup\nInteractive Chat Syntax\t@file, #dir, $cmd, :ls, :cat 等\nContext Management\t持久化、智能评分、清理\nPipeline Syntax\t`\nCapability/Skills/Router/SSH\t高级功能\n文档已同步更新到项目的最新版本 (5.60.0),包含所有新增的记忆系统功能(时间衰减、重要性评分、意图识别、主动遗忘等)。",
          "is_bot": false,
          "headline": "文档概览",
          "author_name": "Qwen Assistant",
          "author_login": null,
          "committed_at": "2026-02-24T10:38:22Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "261c462307c74796e3ea882e4fd458fb76425789",
          "body": null,
          "is_bot": false,
          "headline": "5.61.0",
          "author_name": "Qwen Assistant",
          "author_login": null,
          "committed_at": "2026-02-24T10:33:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "77183f8b68d44a57befd02d769bbe4d4976bb40f",
          "body": "完成所有改进!以下是完整的改动清单:\n\n📁 改动文件\n文件\t改动内容\nrelevance.ts\t时间衰减、重要性评分、意图识别\nsmartContextManager.ts\t访问跟踪、节流优化\ncontextStorage.ts\t主动遗忘机制\n✅ 完成的功能\n1. 时间衰减机制\n指数衰减模型:score = e^(-days/halfLife)\n可配置半衰期(默认 30 天)\n访问频率加成(常访问的衰减慢)\npinned 项目不衰减\n2. 访问跟踪\n自动记录 lastUsedAt 和 accessCount\n节流机制:5 秒或 50 条批量保存\n避免频繁磁盘 I/O\n3. 重要性评分\n路径重要\n[…]\n5, pathWeight: 0.2, ... },\n  refactor: { keywordsWeight: 0.2, pathWeight: 0.5, ... },\n  // ... 更多意图\n}\n🔮 后续建议\n添加单元测试 - 特别是路径匹配正则表达式\n监控性能 - 节流机制在实际场景中的表现\n调优参数 - 根据使用情况调整半衰期、权重等\n考虑 NLP - 未来可用 ML 模型改进意图识别",
          "is_bot": false,
          "headline": "记忆系统改进 - 最终总结",
          "author_name": "Qwen Assistant",
          "author_login": null,
          "committed_at": "2026-02-24T10:31:53Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "1f0df1ce649a348b03d69217693221938cfc6c82",
          "body": "修复总结\n1. ✅ 魔术数字提取为常量\n文件: relevance.ts:50-95\n\n新增 IMPORTANCE_CONFIG 和 RECENCY_CONFIG 配置对象:\n\n所有关键阈值和权重都提取为具名常量\n便于理解和调优\n支持外部配置覆盖\n\nexport const IMPORTANCE_CONFIG = {\n  BASE_SCORE: 0.5,\n  CORE_PATH_BOOST: 0.2,\n  TEST_FILE_PENALTY: 0.15,\n  // ... 更多配置\n} as const;\n\nexport const RECENCY_CONFIG = {\n  DEFAULT_H\n[…]\nES = 50;\n4. ✅ 接口注释清理\n文件: relevance.ts:1-42\n\n移除了混淆的\"简化版本用于兼容性\"注释\n添加完整的 JSDoc 注释\n明确每个字段的含义\n预期改进\n指标\t改进前\t改进后\n可配置性\t魔术数字分散\t集中式配置对象\n意图识别准确率\t简单计数\t加权评分 + 否定词\n磁盘写入频率\t每次查询\t批量节流 (最多 5 秒 1 次)\n代码可读性\t需要解释数字含义\t自描述常量名",
          "is_bot": false,
          "headline": "改动总结:",
          "author_name": "Qwen Assistant",
          "author_login": null,
          "committed_at": "2026-02-24T10:22:50Z",
          "body_truncated": true,
          "is_coding_agent": false
        }
      ],
      "releases_count": 2,
      "commits_last_year": 878,
      "latest_release_at": "2026-01-24T10:16:29Z",
      "latest_release_tag": "v3.30.0",
      "releases_from_tags": false,
      "days_since_last_push": 5,
      "active_weeks_last_year": 12,
      "days_since_latest_release": 180,
      "mean_days_between_releases": 6.3
    },
    "community": {
      "has_readme": true,
      "has_license": false,
      "has_description": true,
      "has_contributing": false,
      "health_percentage": 28,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": false
    },
    "ecosystem": {
      "packages": [
        {
          "name": "yuangs",
          "exists": true,
          "license": "ISC",
          "keywords": [
            "yuangs",
            "cli",
            "tools",
            "colorful"
          ],
          "ecosystem": "npm",
          "matches_repo": true,
          "registry_url": "https://www.npmjs.com/package/yuangs",
          "is_deprecated": false,
          "latest_version": "6.9.30",
          "repository_url": "https://github.com/yuanguangshan/npm_yuangs",
          "versions_count": 258,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": 1,
          "monthly_downloads": 2375,
          "first_published_at": "2025-11-29T11:03:08.833000Z",
          "latest_published_at": "2026-07-18T01:23:37.716000Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 5
        }
      ]
    },
    "popularity": {
      "forks": 0,
      "stars": 1,
      "watchers": 0,
      "fork_history": {
        "days": [],
        "complete": true,
        "collected": 0,
        "total_forks": 0
      },
      "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": [],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [
        "tsconfig.json"
      ],
      "toolchain_manifests": [],
      "largest_source_bytes": 33658,
      "source_files_sampled": 354,
      "oversized_source_files": 0,
      "agent_instruction_files": [],
      "agent_instruction_max_bytes": null
    },
    "dependencies": {
      "manifests": [
        "package.json"
      ],
      "advisories": {
        "error": null,
        "scope": null,
        "source": null,
        "findings": [],
        "collected": false,
        "malicious": [],
        "truncated": false,
        "by_severity": {},
        "advisory_count": 0,
        "affected_count": 0,
        "assessed_count": 0,
        "malicious_count": 0,
        "assessed_package": null,
        "unassessed_count": 0,
        "direct_affected_count": 0
      },
      "ecosystems": [
        "npm"
      ],
      "dependencies": [
        {
          "name": "axios",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.13.2"
        },
        {
          "name": "better-sqlite3",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^12.6.2"
        },
        {
          "name": "chalk",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^4.1.2"
        },
        {
          "name": "cli-table3",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.6.5"
        },
        {
          "name": "commander",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^13.1.0"
        },
        {
          "name": "express",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^5.2.1"
        },
        {
          "name": "js-yaml",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^4.1.0"
        },
        {
          "name": "json5",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^2.2.3"
        },
        {
          "name": "markdown-it",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^14.1.0"
        },
        {
          "name": "marked",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^15.0.12"
        },
        {
          "name": "marked-terminal",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^7.3.0"
        },
        {
          "name": "open",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^11.0.0"
        },
        {
          "name": "ora",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^5.4.1"
        },
        {
          "name": "p-limit",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^7.2.0"
        },
        {
          "name": "pino",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^10.3.1"
        },
        {
          "name": "pino-pretty",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^13.1.3"
        },
        {
          "name": "socket.io",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^4.8.3"
        },
        {
          "name": "ssh2",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.17.0"
        },
        {
          "name": "typescript",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^5.9.3"
        },
        {
          "name": "yuangs",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^2.29.0"
        },
        {
          "name": "zod",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^4.3.5"
        },
        {
          "name": "zod-to-json-schema",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^3.25.1"
        }
      ],
      "all_dependencies": {
        "error": "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository",
        "source": null,
        "packages": [],
        "collected": false,
        "truncated": false,
        "total_count": null,
        "direct_count": null,
        "indirect_count": null
      }
    },
    "maintainership": {
      "issues": {
        "open_prs": 0,
        "merged_prs": 0,
        "open_issues": 0,
        "closed_ratio": null,
        "closed_issues": 0,
        "closed_unmerged_prs": 0
      },
      "bus_factor": 1,
      "bot_contributors": 0,
      "top_contributors": [
        {
          "type": "User",
          "login": "yuanguangshan",
          "commits": 400,
          "avatar_url": "https://avatars.githubusercontent.com/u/52271393?v=4"
        },
        {
          "type": "User",
          "login": "actions-user",
          "commits": 82,
          "avatar_url": "https://avatars.githubusercontent.com/u/65916846?v=4"
        },
        {
          "type": "User",
          "login": "yuangs",
          "commits": 15,
          "avatar_url": "https://avatars.githubusercontent.com/u/9217581?v=4"
        }
      ],
      "contributors_sampled": 3,
      "top_contributor_share": 0.805
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "publish.yml"
      ],
      "has_docs_dir": true,
      "linter_configs": [],
      "has_editorconfig": false,
      "has_linter_config": false,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [
        "package-lock.json"
      ],
      "scorecard": {
        "checks": [
          {
            "name": "Binary-Artifacts",
            "score": 10,
            "reason": "no binaries found in the repo",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
          },
          {
            "name": "Branch-Protection",
            "score": 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": 3,
            "reason": "project has 1 contributing companies or organizations -- score normalized to 3",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
          },
          {
            "name": "Dangerous-Workflow",
            "score": 10,
            "reason": "no dangerous workflow patterns detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
          },
          {
            "name": "Dependency-Update-Tool",
            "score": 0,
            "reason": "no update tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
          },
          {
            "name": "Fuzzing",
            "score": 0,
            "reason": "project is not fuzzed",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
          },
          {
            "name": "License",
            "score": 0,
            "reason": "license file not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
          },
          {
            "name": "Maintained",
            "score": 10,
            "reason": "30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
          },
          {
            "name": "Packaging",
            "score": null,
            "reason": "packaging workflow not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
          },
          {
            "name": "Pinned-Dependencies",
            "score": 1,
            "reason": "dependency not pinned by hash detected -- score normalized to 1",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
          },
          {
            "name": "SAST",
            "score": 0,
            "reason": "no SAST tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
          },
          {
            "name": "Security-Policy",
            "score": 0,
            "reason": "security policy file not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
          },
          {
            "name": "Signed-Releases",
            "score": null,
            "reason": "no releases found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
          },
          {
            "name": "Token-Permissions",
            "score": 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": "62 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "2238f169a08d57306d570940cd245b0741385c95",
        "ran_at": "2026-07-23T10:53:46Z",
        "aggregate_score": 2.9,
        "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-18T01:23:42Z",
      "oldest_open_prs": [],
      "last_merged_pr_at": null,
      "ci_last_conclusion": "SUCCESS",
      "oldest_open_issues": []
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/yuanguangshan/npm_yuangs",
    "host": "github.com",
    "name": "npm_yuangs",
    "owner": "yuanguangshan"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "moderate",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 51,
      "inputs": {
        "security": 29,
        "vitality": 79,
        "community": 23,
        "governance": 40,
        "engineering": 76
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "good",
        "name": "Vitality",
        "value": 79,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "good",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 72,
            "inputs": {
              "commits_last_year": 878,
              "human_commit_share": 1,
              "days_since_last_push": 5,
              "active_weeks_last_year": 12
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 5 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 5
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "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": "878 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 878
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "release_discipline",
            "band": "excellent",
            "name": "Release discipline",
            "note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "openssf_scorecard_signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 90,
            "inputs": {
              "releases_count": 2,
              "latest_release_tag": "v3.30.0",
              "releases_from_tags": false,
              "days_since_latest_release": 180,
              "mean_days_between_releases": 6.3
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "2 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 2
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 180 days ago",
                "points": 27,
                "status": "partial",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 180
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~6.3 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 6.3
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "openssf_scorecard_signed_releases",
                "name": "OpenSSF Scorecard: Signed-Releases",
                "detail": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 10
              }
            ]
          },
          {
            "key": "abandonment",
            "band": "excellent",
            "name": "Abandonment",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "cap": null,
              "state": "maintained",
              "guards": [],
              "signals": [],
              "red_flag": false,
              "multiplier_pct": 100,
              "declared_reason": null,
              "unverified_reason": null,
              "unanswered_open_prs": null,
              "unanswered_open_issues": null,
              "days_since_last_merged_pr": null,
              "days_since_last_human_commit": 5,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "last human commit 5 days ago",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_maintained",
                    "params": {
                      "days": 5
                    }
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "critical",
        "name": "Community & Adoption",
        "value": 23,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "critical",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 1,
            "inputs": {
              "forks": 0,
              "stars": 1,
              "watchers": 0,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "1 stars",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "0 forks",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "0 watchers",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "critical",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 25,
            "inputs": {
              "has_readme": true,
              "has_license": false,
              "has_contributing": false,
              "has_issue_template": false,
              "has_code_of_conduct": false,
              "has_pull_request_template": false
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 22.5,
                "status": "met",
                "details": [],
                "max_points": 22.5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "no license file detected",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "license_absent",
                    "params": {}
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributing_guide",
                "name": "CONTRIBUTING guide",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 18
              },
              {
                "key": "code_of_conduct",
                "name": "Code of conduct",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 13.5
              },
              {
                "key": "issue_template",
                "name": "Issue template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.2
              },
              {
                "key": "pr_template",
                "name": "PR template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.3
              }
            ]
          },
          {
            "key": "ecosystem_adoption",
            "band": "moderate",
            "name": "Ecosystem adoption (downloads)",
            "note": "Excluded from scoring (no data or not applicable): Registry dependents. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "registry_dependents"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 56,
            "inputs": {
              "packages": [
                "yuangs"
              ],
              "dependents": null,
              "ecosystems": "npm",
              "total_downloads": null,
              "monthly_downloads": 2375
            },
            "components": [
              {
                "key": "monthly_downloads",
                "name": "Monthly downloads",
                "detail": "2,375 downloads/month across npm",
                "points": 45,
                "status": "partial",
                "details": [
                  {
                    "code": "downloads_monthly",
                    "params": {
                      "count": 2375,
                      "ecosystems": "npm"
                    }
                  }
                ],
                "max_points": 80
              },
              {
                "key": "registry_dependents",
                "name": "Registry dependents",
                "detail": "not reported by this ecosystem",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "not_reported_by_this_ecosystem",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          }
        ],
        "description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
      },
      {
        "key": "governance",
        "band": "at_risk",
        "name": "Sustainability & Governance",
        "value": 40,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "critical",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 20,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 3,
              "top_contributor_share": 0.805
            },
            "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 80% of commits",
                "points": 4.4,
                "status": "partial",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 80
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "3 contributors",
                "points": 4.1,
                "status": "partial",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 3
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 1 contributing companies or organizations -- score normalized to 3",
                "points": 3,
                "status": "partial",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "critical",
            "name": "Issue & PR responsiveness",
            "note": "Excluded from scoring (no data or not applicable): Issue resolution, PR acceptance. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "issue_resolution",
                    "pr_acceptance"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 1,
            "inputs": {
              "merged_prs": 0,
              "open_issues": 0,
              "closed_issues": 0,
              "issue_closed_ratio": null,
              "closed_unmerged_prs": 0
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "no issues or no data",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_issues_or_data",
                    "params": {}
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "no decided pull requests or no data",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_decided_prs_or_data",
                    "params": {}
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 0/30 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "moderate",
            "name": "Ownership & stewardship",
            "note": "Excluded from scoring (no data or not applicable): Verified domain. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "verified_domain"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 54,
            "inputs": {
              "followers": 11,
              "owner_type": "User",
              "is_verified": null,
              "owner_login": "yuanguangshan",
              "public_repos": 172,
              "account_age_days": 2583
            },
            "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": "11 followers of yuanguangshan",
                "points": 7.8,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 11,
                      "login": "yuanguangshan"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "172 public repos, account ~7 yr old",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 172
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 7
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "excellent",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "yuangs"
              ],
              "ecosystems": "npm",
              "any_deprecated": false,
              "min_days_since_publish": 5
            },
            "components": [
              {
                "key": "published_resolvable",
                "name": "Published & resolvable",
                "detail": "1 package(s) on npm",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "packages_published",
                    "params": {
                      "count": 1,
                      "ecosystems": "npm"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "publish_recency",
                "name": "Publish recency",
                "detail": "latest publish 5 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 5
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "258 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 258
                    }
                  }
                ],
                "max_points": 20
              },
              {
                "key": "not_deprecated",
                "name": "Not deprecated",
                "detail": "active, not deprecated or yanked",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "package_not_deprecated",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          }
        ],
        "description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?"
      },
      {
        "key": "engineering",
        "band": "good",
        "name": "Engineering Quality",
        "value": 76,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "moderate",
            "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": 60,
            "inputs": {
              "has_ci": true,
              "has_tests": true,
              "has_editorconfig": false,
              "has_linter_config": false,
              "has_precommit_config": false
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": "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": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 16
              },
              {
                "key": "pre_commit_hooks",
                "name": "Pre-commit hooks",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 9.6
              },
              {
                "key": "editorconfig",
                "name": ".editorconfig",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.4
              },
              {
                "key": "openssf_scorecard_ci_tests",
                "name": "OpenSSF Scorecard: CI-Tests",
                "detail": "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": 100,
            "inputs": {
              "topics": [
                "tools"
              ],
              "has_wiki": true,
              "homepage": "https://www.npmjs.com/package/yuangs?activeTab=versions",
              "has_readme": true,
              "has_docs_dir": true,
              "has_description": true
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 30,
                "status": "met",
                "details": [],
                "max_points": 30
              },
              {
                "key": "documentation_directory",
                "name": "Documentation directory",
                "detail": null,
                "points": 25,
                "status": "met",
                "details": [],
                "max_points": 25
              },
              {
                "key": "documentation_homepage_site",
                "name": "Documentation / homepage site",
                "detail": "https://www.npmjs.com/package/yuangs?activeTab=versions",
                "points": 15,
                "status": "met",
                "details": [],
                "max_points": 15
              },
              {
                "key": "repository_description",
                "name": "Repository description",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "topics",
                "name": "Topics",
                "detail": "1 topics",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "topics_count",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "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": "critical",
        "name": "Security",
        "value": 29,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "critical",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): CI-Tests, Packaging, Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "ci_tests",
                    "packaging",
                    "signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 29,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 15,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 3,
              "scorecard_aggregate": 2.9
            },
            "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 1 contributing companies or organizations -- score normalized to 3",
                "points": 0.8,
                "status": "partial",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "dangerous_workflow",
                "name": "Dangerous-Workflow",
                "detail": "no dangerous workflow patterns detected",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "dependency_update_tool",
                "name": "Dependency-Update-Tool",
                "detail": "no update tool detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "fuzzing",
                "name": "Fuzzing",
                "detail": "project is not fuzzed",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "license file not detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "maintained",
                "name": "Maintained",
                "detail": "30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "packaging",
                "name": "Packaging",
                "detail": "packaging workflow 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 1",
                "points": 0.5,
                "status": "partial",
                "details": [],
                "max_points": 5
              },
              {
                "key": "sast",
                "name": "SAST",
                "detail": "no SAST tool detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "security_policy",
                "name": "Security-Policy",
                "detail": "security policy file not detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "signed_releases",
                "name": "Signed-Releases",
                "detail": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 7.5
              },
              {
                "key": "token_permissions",
                "name": "Token-Permissions",
                "detail": "detected GitHub workflow tokens with excessive permissions",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "vulnerabilities",
                "name": "Vulnerabilities",
                "detail": "62 existing vulnerabilities detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              }
            ]
          }
        ],
        "description": "Are visible security and supply-chain practices strong, with no malicious dependency and no unresolved high-risk jurisdiction exposure?"
      },
      {
        "key": "ai_readiness",
        "band": "moderate",
        "name": "AI Readiness",
        "value": 57,
        "weight": 0,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "at_risk",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": 0.88,
              "agent_instruction_files": [],
              "agent_instruction_max_bytes": null
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": "no CLAUDE.md / AGENTS.md / editor rules",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_agent_instructions",
                    "params": {}
                  }
                ],
                "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": "88 of 100 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 88,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "moderate",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 54,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [
                "package-lock.json"
              ],
              "has_dockerfile": false,
              "typed_language": true,
              "bootstrap_files": [],
              "has_devcontainer": false,
              "has_linter_config": false,
              "typecheck_configs": [
                "tsconfig.json"
              ],
              "agent_commit_share": 0.62,
              "toolchain_manifests": [],
              "dependency_bot_commit_share": 0
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 18
              },
              {
                "key": "automated_tests",
                "name": "Automated tests",
                "detail": null,
                "points": 22,
                "status": "met",
                "details": [],
                "max_points": 22
              },
              {
                "key": "lint_format_config",
                "name": "Lint / format config",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 11
              },
              {
                "key": "static_type_checking",
                "name": "Static type checking",
                "detail": "tsconfig.json",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "tsconfig.json"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "reproducible_environment",
                "name": "Reproducible environment",
                "detail": "lockfile",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "lockfile"
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "62 of the last 100 commits agent-authored or agent-credited",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "agent_authored_commits",
                    "params": {
                      "count": 62,
                      "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 1",
                "points": 1,
                "status": "partial",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "excellent",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "primary_language": "TypeScript",
              "largest_source_bytes": 33658,
              "source_files_sampled": 354,
              "oversized_source_files": 0
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "TypeScript (statically typed)",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "statically_typed_language",
                    "params": {
                      "language": "TypeScript"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "0/354 source files over 60KB",
                "points": 55,
                "status": "met",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 354,
                      "oversized": 0
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          }
        ],
        "description": "How well is the repo equipped to be developed and maintained with AI coding agents? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score."
      }
    ],
    "metrics_version": "1.13.0"
  },
  "warnings": [
    "Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token",
    "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository",
    "deps.dev does not index npm:yuangs@6.9.30; advisories assessed against the repository dependency graph instead"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-23T10:53:52.321078Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/y/yuanguangshan/npm_yuangs.svg",
  "full_name": "yuanguangshan/npm_yuangs",
  "license_state": "absent",
  "license_spdx": null
}

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

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

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