Registro público
Informe de salud del softwareesquema 0.27.0 · métricas 1.13.0 · 2026-07-23 10:53 UTC

yuanguangshan / npm_yuangs

my personal tools

TypeScriptSin licencia detectada★ 1 estrella⑂ 0 forksdesde nov 2025Ver en GitHub ↗

yuanguangshan/npm_yuangs tiene un índice de salud de 51 sobre 100, lo que lo sitúa en la banda Moderado. Su puntuación más alta es Vitality (79/100) y la más baja, Community & Adoption (23/100). Se actualizó por última vez hace 5 días. Una sola persona concentra la mayor parte del trabajo reciente.

51
global / 100
Moderado

Índice de salud del software

Las métricas se agrupan en categorías ponderadas sobre una escala de 1 a 100. El resultado global parte de su media; cuando la evidencia pública activa la Política de Jurisdicciones de Alto Riesgo, la calificación se ajusta y recibe el límite 49 (En riesgo). Preparación para IA queda fuera.

51
Excelente85-100Ejemplar; cumple prácticamente todos los criterios evaluados
Bueno70-84Saludable; carencias menores
Moderado50-69Aceptable con carencias notables; se recomienda revisión
En riesgo30-49Debilidades significativas; su adopción exige cautela
Crítico1-29Problemas graves (proyecto abandonado, un solo mantenedor, sin higiene)
VitalidadComunidad yAdopciónSostenibilidady GobernanzaCalidad deIngenieríaSeguridadPreparaciónpara IA

Perfil de puntuación

Cada eje es una categoría. La forma importa más que la media: un proyecto sano llena toda la figura, mientras que un perfil de picos y cráteres indica que la fortaleza en una dimensión enmascara el riesgo en otra.

Titularidad

yuanguangshanCuenta personal
11 seguidores172 repositorios públicosdesde jun 2019

Este repositorio pertenece a una cuenta personal. Un proyecto con un único propietario conlleva más riesgo de continuidad que uno respaldado por una organización.

Ecosistemas de paquetes

RegistroPaqueteVersiónDescargas / mesVersionesÚltima publicaciónEtiquetas
npmyuangs6.9.302375258hace 5 díasyuangsclitoolscolorful

Métricas por categoría

Vitalidad

¿Está vivo el proyecto: se escribe código y se publican versiones?

79Bueno · 22% del índice global
Cómo se puntúa
36/36Recencia de push — último push hace 5 días
8.3/36Cadencia de commits — 12/52 semanas con commits
18/18Volumen de commits — 878 commits en el último año
10/10OpenSSF Scorecard: Maintained — 30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
Datos de entrada utilizados
commits_last_year878
human_commit_share1
days_since_last_push5
active_weeks_last_year12
Cómo se puntúa
27/27Publica versiones — 2 versiones publicadas
27/36Recencia de las versiones — última versión hace 180 días
27/27Cadencia de publicación — una versión cada ~6,3 días
0/10OpenSSF Scorecard: Signed-Releases — sin datos
Datos de entrada utilizados
releases_count2
latest_release_tagv3.30.0
releases_from_tagsno
days_since_latest_release180
mean_days_between_releases6,3
Excluidos de la puntuación (sin datos o no aplicable): OpenSSF Scorecard: Signed-Releases. Los pesos restantes se han renormalizado.

Comunidad y Adopción

¿Tiene el proyecto usuarios, descargas, atención y unas condiciones acogedoras para quienes contribuyen?

23Crítico · 18% del índice global
Cómo se puntúa
0/60Estrellas — 1 estrellas
0/25Forks — 0 forks
0/15Observadores — 0 observadores
Datos de entrada utilizados
forks0
stars1
watchers0
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
Cómo se puntúa
22.5/22.5README
0/22.5Licencia — no se detectó ningún archivo de licencia
0/18Guía CONTRIBUTING
0/13.5Código de conducta
0/7.2Plantilla de issues
0/6.3Plantilla de PR
Datos de entrada utilizados
has_readme
has_licenseno
has_contributingno
has_issue_templateno
has_code_of_conductno
has_pull_request_templateno
Cómo se puntúa
45/80Descargas mensuales — 2375 descargas/mes en npm
0/20Dependientes en el registro — no lo informa este ecosistema
Datos de entrada utilizados
packagesyuangs
dependents
ecosystemsnpm
total_downloads
monthly_downloads2375
Excluidos de la puntuación (sin datos o no aplicable): Dependientes en el registro. Los pesos restantes se han renormalizado.

Sostenibilidad y Gobernanza

¿Sobrevivirá el proyecto a sus personas: factor bus, capacidad de respuesta, quién lo respalda y mantenimiento del paquete?

40En riesgo · 24% del índice global
Cómo se puntúa
9/54Factor bus — la mitad de los commits recae en 1 contribuyente(s)
4.4/22.5Distribución de commits — el principal contribuyente firma el 80% de los commits
4.1/13.5Amplitud de contribuyentes — 3 contribuyentes
3/10OpenSSF Scorecard: Contributors — project has 1 contributing companies or organizations -- score normalized to 3
Datos de entrada utilizados
bus_factor1
contributors_sampled3
top_contributor_share0,805
Cómo se puntúa
0/46.8Resolución de issues — sin issues o sin datos
0/38.3Aceptación de PR — sin PR decididos o sin datos
0/15OpenSSF Scorecard: Code-Review — Found 0/30 approved changesets -- score normalized to 0
Datos de entrada utilizados
merged_prs0
open_issues0
closed_issues0
issue_closed_ratio
closed_unmerged_prs0
Excluidos de la puntuación (sin datos o no aplicable): Resolución de issues, Aceptación de PR. Los pesos restantes se han renormalizado.
Cómo se puntúa
10/30Respaldo de la propiedad — cuenta personal (usuario)
0/20Dominio verificado — no aplicable a cuentas de usuario
7.8/25Alcance del propietario — 11 seguidores de yuanguangshan
25/25Trayectoria — 172 repos públicos, cuenta de ~7 años
Datos de entrada utilizados
followers11
owner_typeUser
is_verified
owner_loginyuanguangshan
public_repos172
account_age_days2583
Excluidos de la puntuación (sin datos o no aplicable): Dominio verificado. Los pesos restantes se han renormalizado.
Cómo se puntúa
25/25Publicado y resoluble — 1 paquete(s) en npm
35/35Recencia de publicación — última publicación hace 5 días
20/20Historial de versiones — 258 versiones en el registro
20/20No obsoleto — activo, ni obsoleto ni retirado
Datos de entrada utilizados
packagesyuangs
ecosystemsnpm
any_deprecatedno
min_days_since_publish5

Calidad de Ingeniería

¿Existen unas prácticas mínimas de ingeniería y documentación?

76Bueno · 20% del índice global
Cómo se puntúa
24/24Flujos de trabajo de CI — 1 flujo(s) de trabajo
24/24Pruebas presentes
0/16Configuración de linter
0/9.6Hooks de pre-commit
0/6.4.editorconfig
0/20OpenSSF Scorecard: CI-Tests — sin datos
Datos de entrada utilizados
has_ci
has_tests
has_editorconfigno
has_linter_configno
has_precommit_configno
Excluidos de la puntuación (sin datos o no aplicable): OpenSSF Scorecard: CI-Tests. Los pesos restantes se han renormalizado.

Documentación

100Excelente
Cómo se puntúa
30/30README
25/25Directorio de documentación
15/15Sitio de documentación / página del proyecto — https://www.npmjs.com/package/yuangs?activeTab=versions
10/10Descripción del repositorio
10/10Topics — 1 topics
10/10Wiki
Datos de entrada utilizados
topicstools
has_wiki
homepagehttps://www.npmjs.com/package/yuangs?activeTab=versions
has_readme
has_docs_dir
has_description

Seguridad

¿Son sólidas las prácticas visibles de seguridad y de cadena de suministro, sin exposición jurisdiccional de alto riesgo sin resolver?

29Crítico · 16% del índice global
Cómo se puntúa
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 — sin datos
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.5Licencia — 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 — sin datos
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 — sin datos
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
0/7.5Vulnerabilities — 62 existing vulnerabilities detected
Datos de entrada utilizados
sourceopenssf_scorecard
checks_evaluated15
scorecard_versionv5.5.0
checks_inconclusive3
scorecard_aggregate2,9
Excluidos de la puntuación (sin datos o no aplicable): ci_tests, packaging, signed_releases. Los pesos restantes se han renormalizado.

Preparación para IA

¿Hasta qué punto está el repositorio preparado para desarrollarse y mantenerse con agentes de codificación de IA? Es una insignia independiente y experimental — peso 0,0, de modo que se presenta por separado y no afecta a la puntuación de salud global.

57Moderado · 0% del índice global
Cómo se puntúa
0/45Instrucciones para agentes — sin CLAUDE.md / AGENTS.md / reglas de editor
0/15Documentación legible por máquinas (llms.txt)
40/40Historial de commits legible — 88 de 100 commits humanos declaran su intención (asunto estructurado o cuerpo explicativo)
Datos de entrada utilizados
has_llms_txtno
legible_history_share0,88
agent_instruction_files
agent_instruction_max_bytes
Cómo se puntúa
0/18Arranque con un solo comando
22/22Pruebas automatizadas
0/11Configuración de lint / formato
11/11Verificación estática de tipos — tsconfig.json
10/10Entorno reproducible — lockfile
10/10Práctica demostrada con agentes — 62 de los últimos 100 commits con autoría o crédito de agente
0/8Mantenimiento automatizado — no se observan actualizaciones automáticas de dependencias
1/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 1
Datos de entrada utilizados
has_nixno
has_tests
lockfilespackage-lock.json
has_dockerfileno
typed_language
bootstrap_files
has_devcontainerno
has_linter_configno
typecheck_configstsconfig.json
agent_commit_share0,62
toolchain_manifests
dependency_bot_commit_share0
Cómo se puntúa
45/45Código verificable por tipos — TypeScript (tipado estático)
55/55Tamaños de archivo manejables — 0/354 archivos fuente de más de 60 KB
Datos de entrada utilizados
primary_languageTypeScript
largest_source_bytes33.658
source_files_sampled354
oversized_source_files0

Datos clave

1estrellas de GitHub
3contribuidores
878commits en los últimos 12 meses
5días desde el último push
2versiones publicadas
1factor bus
0issues abiertas
npmecosistemas de paquetes

Advertencias de recopilación de datos

  • 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

Más detalle

OpenSSF Scorecard 2.9 / 10
2.9agregado

Evaluación de seguridad independiente y agnóstica en cuanto a herramientas, procedente del proyecto de código abierto OpenSSF Scorecard. Cada comprobación premia una práctica de seguridad, no la herramienta de un proveedor concreto. Las comprobaciones que Scorecard no pudo determinar se marcan como n/d y se excluyen de la puntuación de seguridad (nunca se cuentan como cero).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
n/dCI-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
n/dPackagingpackaging workflow not detected
1Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 1
0SASTno SAST tool detected
0Security-Policysecurity policy file not detected
n/dSigned-Releasesno releases found
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
0Vulnerabilities62 existing vulnerabilities detected
Dependencias directas 22
RegistroPaqueteRestricción de versiónManifiesto
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
Todas las dependencias no recopilado

No fue posible recopilar el conjunto de dependencias resuelto para este informe: GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

Informe JSON sin procesar legible por máquina
{
  "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
}

Las puntuaciones son señales, no garantías. Reflejan prácticas públicamente visibles en GitHub; no son una auditoría de código ni una garantía de seguridad.

Los datos ausentes se excluyen y los pesos se renormalizan; nunca se puntúan como cero. La metodología es versionada y abierta: métricas v1.13.0, esquema v0.27.0 — metodología completa · wiki de métricas.

Cómo se sitúa un resultado dentro del registro general: estadísticas agregadasnpm.