JSON-Rohbericht maschinenlesbar
{
"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
}