Registro público
Informe de salud del softwareesquema 0.25.0 · métricas 1.13.0 · 2026-07-21 22:42 UTC

schovest / pi

Fork Pi

TypeScriptMIT★ 2 estrellas⑂ 0 forksdesde jul 2026Ver en GitHub ↗

schovest/pi tiene un índice de salud de 54 sobre 100, lo que lo sitúa en la banda Moderado. Su puntuación más alta es Vitality (89/100) y la más baja, Security (26/100). Se actualizó por última vez hace 4 días. Una sola persona concentra la mayor parte del trabajo reciente.

54
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.

54
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

schovestCuenta personal
0 seguidores2 repositorios públicosdesde jul 2026

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
npm@schovest/pi-tui0.11.3212714hace 4 díastuiterminaluitext-editordifferential-renderingtypescriptcli
npm@schovest/pi-coding-agent0.11.3187014hace 4 díascoding-agentaillmclituiagent

Métricas por categoría

Vitalidad

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

89Excelente · 22% del índice global
Cómo se puntúa
36/36Recencia de push — último push hace 4 días
33.9/36Cadencia de commits — 49/52 semanas con commits
18/18Volumen de commits — 4868 commits en el último año
0/10OpenSSF Scorecard: Maintained — project was created within the last 90 days. Please review its contents carefully
Datos de entrada utilizados
commits_last_year4868
human_commit_share1
days_since_last_push4
active_weeks_last_year49
Cómo se puntúa
27/27Publica versiones — 15 versiones publicadas
36/36Recencia de las versiones — última versión hace 4 días
27/27Cadencia de publicación — una versión cada ~0,8 días
0/10OpenSSF Scorecard: Signed-Releases — Project has not signed or included provenance with any releases.
Datos de entrada utilizados
releases_count15
latest_release_tagv0.11.3
releases_from_tagsno
days_since_latest_release4
mean_days_between_releases0,8

Comunidad y Adopción

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

40En riesgo · 18% del índice global
Cómo se puntúa
0/60Estrellas — 2 estrellas
0/25Forks — 0 forks
0/15Observadores — 0 observadores
Datos de entrada utilizados
forks0
stars2
watchers0
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonbelow_threshold
Cómo se puntúa
22.5/22.5README
22.5/22.5Licencia — licencia reconocida (MIT)
18/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_license
has_contributing
has_issue_templateno
has_code_of_conductno
has_pull_request_templateno
Cómo se puntúa
48/80Descargas mensuales — 3997 descargas/mes en npm
0/20Dependientes en el registro — no lo informa este ecosistema
Datos de entrada utilizados
packages@schovest/pi-tui, @schovest/pi-coding-agent
dependents
ecosystemsnpm
total_downloads
monthly_downloads3997
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?

36En riesgo · 24% del índice global
Cómo se puntúa
9/54Factor bus — la mitad de los commits recae en 1 contribuyente(s)
4.7/22.5Distribución de commits — el principal contribuyente firma el 79% de los commits
13.5/13.5Amplitud de contribuyentes — 99 contribuyentes
10/10OpenSSF Scorecard: Contributors — project has 40 contributing companies or organizations
Datos de entrada utilizados
bus_factor1
contributors_sampled99
top_contributor_share0,792
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
0/25Alcance del propietario — 0 seguidores de schovest
3.6/25Trayectoria — 2 repos públicos, cuenta de ~0 años
Datos de entrada utilizados
followers0
owner_typeUser
is_verified
owner_loginschovest
public_repos2
account_age_days17
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 — 2 paquete(s) en npm
35/35Recencia de publicación — última publicación hace 4 días
20/20Historial de versiones — 14 versiones en el registro
20/20No obsoleto — activo, ni obsoleto ni retirado
Datos de entrada utilizados
packages@schovest/pi-tui, @schovest/pi-coding-agent
ecosystemsnpm
any_deprecatedno
min_days_since_publish4

Calidad de Ingeniería

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

74Bueno · 20% del índice global
Cómo se puntúa
24/24Flujos de trabajo de CI — 7 flujo(s) de trabajo
24/24Pruebas presentes
16/16Configuración de linter — biome.json
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_config
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

65Moderado
Cómo se puntúa
30/30README
25/25Directorio de documentación
0/15Sitio de documentación / página del proyecto
10/10Descripción del repositorio
0/10Topics
0/10Wiki
Datos de entrada utilizados
topics
has_wikino
homepage
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?

26Crítico · 16% del índice global
Cómo se puntúa
3.8/7.5Binary-Artifacts — binaries present in source code
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
2.5/2.5Contributors — project has 40 contributing companies or organizations
10/10Dangerous-Workflow — no dangerous workflow patterns detected
0/7.5Dependency-Update-Tool — no update tool detected
0/5Fuzzing — project is not fuzzed
2.5/2.5Licencia — license file detected
0/7.5Maintained — project was created within the last 90 days. Please review its contents carefully
0/5Packaging — sin datos
2/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 4
0/5SAST — no SAST tool detected
5/5Security-Policy — security policy file detected
0/7.5Signed-Releases — Project has not signed or included provenance with any releases.
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
0/7.5Vulnerabilities — 18 existing vulnerabilities detected
Datos de entrada utilizados
sourceopenssf_scorecard
checks_evaluated16
scorecard_versionv5.5.0
checks_inconclusive2
scorecard_aggregate2,6
Excluidos de la puntuación (sin datos o no aplicable): ci_tests, packaging. 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.

70Bueno · 0% del índice global
Cómo se puntúa
45/45Instrucciones para agentes — AGENTS.md
0/15Documentación legible por máquinas (llms.txt)
40/40Historial de commits legible — 93 de 100 commits humanos declaran su intención (asunto estructurado o cuerpo explicativo)
Datos de entrada utilizados
has_llms_txtno
legible_history_share0,93
agent_instruction_filesAGENTS.md
agent_instruction_max_bytes12.103
Cómo se puntúa
0/18Arranque con un solo comando
22/22Pruebas automatizadas
11/11Configuración de lint / formato — biome.json
11/11Verificación estática de tipos — tsconfig.json
10/10Entorno reproducible — lockfile
0/10Práctica demostrada con agentes — ningún commit con autoría de agente entre los últimos 100
0/8Mantenimiento automatizado — no se observan actualizaciones automáticas de dependencias
4/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 4
Datos de entrada utilizados
has_nixno
has_tests
lockfilespackage-lock.json
has_dockerfileno
typed_language
bootstrap_files
has_devcontainerno
has_linter_config
typecheck_configstsconfig.json
agent_commit_share0
toolchain_manifests
dependency_bot_commit_share0
Cómo se puntúa
45/45Código verificable por tipos — TypeScript (tipado estático)
54.2/55Tamaños de archivo manejables — 8/520 archivos fuente de más de 60 KB
Datos de entrada utilizados
primary_languageTypeScript
largest_source_bytes221.006
source_files_sampled520
oversized_source_files8
Cómo se puntúa
0/40Esquema de API (OpenAPI/GraphQL/proto)
0/20Servidor MCP
40/40Ejemplos ejecutables — examples
Datos de entrada utilizados
example_dirsexamples
has_mcp_signalno
api_schema_files

Datos clave

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

Advertencias de recopilación de datos

  • GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository
  • deps.dev does not index npm:@schovest/pi-tui@0.11.3; advisories assessed against the repository dependency graph instead

Más detalle

OpenSSF Scorecard 2.6 / 10
2.6agregado

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-21 22:42 UTC

5Binary-Artifactsbinaries present in source code
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
10Contributorsproject has 40 contributing companies or organizations
10Dangerous-Workflowno dangerous workflow patterns detected
0Dependency-Update-Toolno update tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
0Maintainedproject was created within the last 90 days. Please review its contents carefully
n/dPackagingpackaging workflow not detected
4Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 4
0SASTno SAST tool detected
10Security-Policysecurity policy file detected
0Signed-ReleasesProject has not signed or included provenance with any releases.
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
0Vulnerabilities18 existing vulnerabilities detected
Dependencias directas 19
RegistroPaqueteRestricción de versiónManifiesto
npm@earendil-works/pi-agent-core0.80.6packages/coding-agent/package.json
npm@earendil-works/pi-ai0.80.6packages/coding-agent/package.json
npm@schovest/pi-tui^0.11.3packages/coding-agent/package.json
npm@silvia-odwyer/photon-node0.3.4packages/coding-agent/package.json
npmchalk5.6.2packages/coding-agent/package.json
npmcross-spawn7.0.6packages/coding-agent/package.json
npmdiff8.0.4packages/coding-agent/package.json
npmglob13.0.6packages/coding-agent/package.json
npmhighlight.js10.7.3packages/coding-agent/package.json
npmhosted-git-info9.0.3packages/coding-agent/package.json
npmignore7.0.5packages/coding-agent/package.json
npmjiti2.7.0packages/coding-agent/package.json
npmminimatch10.2.5packages/coding-agent/package.json
npmproper-lockfile4.1.2packages/coding-agent/package.json
npmtypebox1.1.38packages/coding-agent/package.json
npmundici8.3.0packages/coding-agent/package.json
npmyaml2.9.0packages/coding-agent/package.json
npmget-east-asian-width1.6.0packages/tui/package.json
npmmarked15.0.12packages/tui/package.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": [],
      "is_fork": false,
      "size_kb": 48489,
      "has_wiki": false,
      "homepage": null,
      "languages": {
        "C": 6941,
        "CSS": 22724,
        "HTML": 2225,
        "Shell": 37749,
        "Batchfile": 338,
        "JavaScript": 284798,
        "PowerShell": 1670,
        "TypeScript": 4441056
      },
      "pushed_at": "2026-07-17T04:17:11Z",
      "created_at": "2026-07-04T13:37:14Z",
      "owner_type": "User",
      "updated_at": "2026-07-17T04:17:07Z",
      "description": "Fork Pi",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "MIT",
      "default_branch": "main",
      "license_spdx_raw": "MIT",
      "primary_language": "TypeScript",
      "significant_languages": [
        "TypeScript"
      ]
    },
    "owner": {
      "blog": null,
      "name": null,
      "type": "User",
      "login": "schovest",
      "company": null,
      "location": null,
      "followers": 0,
      "avatar_url": "https://avatars.githubusercontent.com/u/299849851?v=4",
      "created_at": "2026-07-04T13:36:14Z",
      "is_verified": null,
      "public_repos": 2,
      "account_age_days": 17
    },
    "license": {
      "state": "standard",
      "spdx_id": "MIT",
      "raw_spdx": "MIT",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v0.11.3",
          "kind": "patch",
          "published_at": "2026-07-17T04:18:27Z"
        },
        {
          "tag": "v0.11.2",
          "kind": "patch",
          "published_at": "2026-07-16T09:10:34Z"
        },
        {
          "tag": "v0.11.1",
          "kind": "patch",
          "published_at": "2026-07-16T06:22:50Z"
        },
        {
          "tag": "v0.11.0",
          "kind": "minor",
          "published_at": "2026-07-16T05:36:04Z"
        },
        {
          "tag": "v0.10.2",
          "kind": "patch",
          "published_at": "2026-07-15T12:02:55Z"
        },
        {
          "tag": "v0.10.1",
          "kind": "patch",
          "published_at": "2026-07-15T11:30:19Z"
        },
        {
          "tag": "v0.10.0",
          "kind": "minor",
          "published_at": "2026-07-15T10:36:56Z"
        },
        {
          "tag": "v0.9.2",
          "kind": "patch",
          "published_at": "2026-07-10T10:48:44Z"
        },
        {
          "tag": "v0.9.1",
          "kind": "patch",
          "published_at": "2026-07-10T03:20:04Z"
        },
        {
          "tag": "v0.9.0",
          "kind": "minor",
          "published_at": "2026-07-10T03:03:20Z"
        },
        {
          "tag": "v0.8.1",
          "kind": "patch",
          "published_at": "2026-07-10T01:48:05Z"
        },
        {
          "tag": "v0.8.0",
          "kind": "minor",
          "published_at": "2026-07-07T02:50:20Z"
        },
        {
          "tag": "v0.7.4",
          "kind": "patch",
          "published_at": "2026-07-06T17:12:06Z"
        },
        {
          "tag": "v0.7.2",
          "kind": "patch",
          "published_at": "2026-07-06T08:35:07Z"
        },
        {
          "tag": "v0.7.1",
          "kind": "patch",
          "published_at": "2026-07-04T16:40:20Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "d2f3f898b3d75dcb93b35f78cd83f792258f2575",
          "body": null,
          "is_bot": false,
          "headline": "release v0.11.3: sudo-helper 扩展、TUI thinking 流式渲染优化、install.sh 扩展候选更新",
          "author_name": "Luokxy",
          "author_login": null,
          "committed_at": "2026-07-17T04:16:37Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f96f251914a2ab6b5cf5078239120896d6e1081f",
          "body": null,
          "is_bot": false,
          "headline": "chore: bump version to 0.11.3",
          "author_name": "Luokxy",
          "author_login": null,
          "committed_at": "2026-07-17T04:16:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b4cd062491016ae82343c99106b05375d65f68df",
          "body": "- 迁移 docs/specs/architecture.md → docs/architecture.md,删除空目录\n- AGENTS.md: 上游基线版本 0.79.1 → 0.80.6\n- AGENTS.md: install.sh 路径补全为 packages/coding-agent/dist-assets/install.sh\n- AGENTS.md: 索引表和同步规则中所有路径引用同步更新\n- architecture.md: npm 包名修正(@schovest/pi-tui、@schovest/pi-coding-agent)\n- architecture.md: 数据流入口模式名修正(PrintMode/RpcMode → runPrintMode()/runRpcMode())\n- architecture.md: 技能加载入口修正(agent/harness/skills.ts → coding-agent/core/skills.ts)\n- architecture.md: install.sh 路径修正,新增 dist-assets 目录说明",
          "is_bot": false,
          "headline": "docs: 迁移 architecture.md 到 docs/ 根目录并修正与代码库的不一致",
          "author_name": "Luokxy",
          "author_login": null,
          "committed_at": "2026-07-17T04:09:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "67c24eb53e84d9b6c696ca85700f32382900196c",
          "body": "修正 .gitignore 中 todo.md 规则为 TODO.md(Linux 区分大小写),\ngit rm --cached 取消追踪,本地文件保留。",
          "is_bot": false,
          "headline": "chore: 将 TODO.md 加入 .gitignore 并取消追踪",
          "author_name": "Luokxy",
          "author_login": null,
          "committed_at": "2026-07-17T03:44:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "67473865baccaafabc0c9b8267f7dda9ca65b30f",
          "body": "install.sh 扩展选择菜单新增 pi-hermes-memory(持久记忆与学习循环),\n通过 npm:pi-hermes-memory 安装,默认不勾选。",
          "is_bot": false,
          "headline": "feat(install): 新增 pi-hermes-memory 扩展候选",
          "author_name": "Luokxy",
          "author_login": null,
          "committed_at": "2026-07-17T03:41:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "01f48f392eae7f31b462806d97d5711a1235a9f2",
          "body": "handleInput 逐字符遍历 data,遇到 \\x1b[A(箭头键/鼠标滚轮转义序列)\n时第一个字符 \\x1b 即触发 cancel,导致弹窗被滚轮关闭。\n\n改用 matchesKey() 精确匹配:仅独立 Escape / Ctrl+C / Ctrl+D 触发取消。\n所有以 \\x1b 开头的转义序列(箭头键、功能键、鼠标)被忽略。",
          "is_bot": false,
          "headline": "fix: sudo-helper 鼠标滚轮误触关闭",
          "author_name": "Luokxy",
          "author_login": null,
          "committed_at": "2026-07-17T03:26:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8c8ff3fda83b449c5b5b959f554adeaebe106f41",
          "body": "SecureBuffer 重构时 writer.stdin.end() 调用丢失。\ncat > FIFO 读到密码后不关闭 FIFO 写端,askpass 的 cat FIFO\n永远收不到 EOF 不退出,SUDO_ASKPASS='/dev/shm/pi-sudo-askpass-f4c74f2d' sudo -A 无限等待 askpass 返回。\n\n修复:submitted=true 后立即 writer.stdin.end(),cat 读到 EOF\n→ 关闭 FIFO 写端 → askpass cat FIFO 收到 EOF 退出 → sudo 获取密码",
          "is_bot": false,
          "headline": "fix: sudo-helper 假死 — writer.stdin.end() 遗漏导致 FIFO 死锁",
          "author_name": "Luokxy",
          "author_login": null,
          "committed_at": "2026-07-17T03:20:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c082c8795f00f793ee5e819a86f4484a3ded4f28",
          "body": "sudo-helper 扩展:\n- tool_call 事件拦截 bash 中的 sudo 命令\n- SUDO_ASKPASS + FIFO(/dev/shm tmpfs)安全注入密码\n- 密码 XOR 动态加密(randomFillSync),明文从不作为 JS string 存在\n- SecureBuffer:append 立即加密,flushTo 解密写入后 fill(0) 物理清零\n- 自定义 PasswordInputComponent:● 遮罩 + 高对比度面板(反色标题 + 亮黄边框)\n- sudo -n true 预检:timestamp 有效时跳过\n- 仅注入第一个 sudo,后续靠 sudo timestamp 缓存\n\ninstall.sh 改动:\n- 已安装检测:/pi 存在时跳过核心拷贝,仅运行扩展/Agent 选择\n- 扩展候选新增 sudo-helper(file:sudo-helper.ts,默认不勾选)",
          "is_bot": false,
          "headline": "feat: sudo-helper 扩展 + install.sh 已安装检测",
          "author_name": "Luokxy",
          "author_login": null,
          "committed_at": "2026-07-17T03:12:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "140afbe9a9bfd7355c1b8f6989f9c424ec4fbded",
          "body": "Forward to packages/coding-agent's existing build:binary target,\nmatching the style of the existing build script.",
          "is_bot": false,
          "headline": "Add npm run build:binary script at repo root",
          "author_name": "Luokxy",
          "author_login": null,
          "committed_at": "2026-07-17T01:44:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b0030a80ca4cda61cabfebc5ac7d1e0399315d5f",
          "body": "…untrack",
          "is_bot": false,
          "headline": "merge dev: thinking 流式渲染卡顿修复(Markdown 增量缓存 + 组件复用)、.pi/settings.json …",
          "author_name": "Luokxy",
          "author_login": null,
          "committed_at": "2026-07-16T15:28:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b23a67de1431d330c5e857667d9ebd67749beeb2",
          "body": "- markdown.ts: 新增 appendText() 和 token 级增量渲染,通过 cachedTokens\n  /cachedTokenWrappedLines 缓存未变更 token 的 wrap 结果,仅重新渲染\n  firstChanged-1 及之后的 token,将单帧渲染成本从 O(总文本) 降到 O(最后一个 token)\n- assistant-message.ts: thinking Markdown 实例复用,通过 appendText/setText\n  diff 分支保留渲染缓存,消除 updateContent 每次销毁+重建导致的缓存丢失\n- 新增 5 个增量等价性测试覆盖:纯追加、交错渲染、invalidate 后追加、\n  复杂 markdown(列表+表格+代码块)、setext heading 类型变化",
          "is_bot": false,
          "headline": "fix: thinking 流式渲染卡顿 — Markdown token 级增量缓存 + 组件复用",
          "author_name": "Luokxy",
          "author_login": null,
          "committed_at": "2026-07-16T15:22:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "57be562d2e00ecd3afbc76976592793c9f7fa15d",
          "body": null,
          "is_bot": false,
          "headline": "chore: untrack .pi/settings.json",
          "author_name": "Luokxy",
          "author_login": null,
          "committed_at": "2026-07-16T09:22:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cad0dacd9d47dcf1533adbf6b75d5c32c2abf34b",
          "body": null,
          "is_bot": false,
          "headline": "chore: add .pi/settings.json to .gitignore, add CHANGELOG.md",
          "author_name": "Luokxy",
          "author_login": null,
          "committed_at": "2026-07-16T09:21:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c90721fabfb318f846f3c2fb1d46fc56beef0f23",
          "body": "…充、fd 下载移除、pi-lens case 声明修复、footer 分支刷新修复",
          "is_bot": false,
          "headline": "release v0.11.2: install.sh 扩展+Agent 分步选择、plan.md primary agent、扩展候选扩…",
          "author_name": "Luokxy",
          "author_login": null,
          "committed_at": "2026-07-16T09:09:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "91ce6a6b2570a3df5dcac6cee51546a91252b45e",
          "body": null,
          "is_bot": false,
          "headline": "chore: bump version to 0.11.2",
          "author_name": "Luokxy",
          "author_login": null,
          "committed_at": "2026-07-16T09:08:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "403e83ee3ad4ce2e417ec606aef7c5bee91b69d7",
          "body": "- install.sh 扩展(9项)和 Primary Agent(3项) 拆分为独立菜单\n- 新增 plan.md primary agent 到 dist-assets\n- coding.md 移除 thinking frontmatter 参数\n- 扩展候选新增 superpowers/pi-plugin-manager/pi-lens\n- install.sh 移除 fd 下载逻辑(pi 已内置)\n- run_menu 改用 nameref 替代 eval\n- 修复 build:binary 引用已删除的 ai/agent workspace 包",
          "is_bot": false,
          "headline": "feat: install.sh 拆分扩展/Agent两步选择,新增 plan agent,移除 fd 下载",
          "author_name": "Luokxy",
          "author_login": null,
          "committed_at": "2026-07-16T08:51:37Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0b4b72add8d2cb5249e958cd77ac35a067658c33",
          "body": "修复位置:case 块已有 {} 花括号,但 const 声明在嵌套 if 块内时,\n规则未能识别外层 case 已提供作用域保护,导致 12 处误报 error。\n\n方案:项目级规则覆盖 rules/ast-grep-rules/rules/no-case-declarations.yml,\nnot 子句嵌套 inside 加 stopBy: end。",
          "is_bot": false,
          "headline": "fix: pi-lens no-case-declarations 误报 — 嵌套 inside 缺 stopBy: end",
          "author_name": "Luokxy",
          "author_login": null,
          "committed_at": "2026-07-16T08:13:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "906bc89516bb659cf1acf9c0d48007265f0ac854",
          "body": null,
          "is_bot": false,
          "headline": "test: 修复 4167-thinking-toggle 测试 mock 缺少 footerDataProvider",
          "author_name": "Luokxy",
          "author_login": null,
          "committed_at": "2026-07-16T07:36:04Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "48dcdebaa8c62e83209979f295f8a4b371e9b540",
          "body": null,
          "is_bot": false,
          "headline": "test: 修复 interactive-mode-compaction 测试 mock 缺少 footerDataProvider",
          "author_name": "Luokxy",
          "author_login": null,
          "committed_at": "2026-07-16T07:22:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5d96b7eaf35b4acd9062704d2ac485ce0c6bafef",
          "body": "- footer-data-provider: 放宽 fs.watch 过滤,接受目录内任意变化(git 原子写事件 filename 是临时文件,旧逻辑只接受 filename==='HEAD' 导致事件丢失)\n- footer-data-provider: 新增 invalidateBranchCache() 清除缓存的分支\n- interactive-mode: handleEvent 和 handleBashCommand 调用 invalidateBranchCache(FooterComponent.invalidate() 为 no-op,旧逻辑永不清除 provider 缓存)",
          "is_bot": false,
          "headline": "fix: footer 分支标签不动态更新",
          "author_name": "Luokxy",
          "author_login": null,
          "committed_at": "2026-07-16T07:18:42Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c1ce70766fc0714b5dae9c9270185bba9e93cbfd",
          "body": "…emove CLAUDE.md symlink\n\n- Add .pi/prompts/up.md: version upgrade prompt accepting target version\n  as argument (e.g. /up v0.11.1), encoding the full 10-step flow\n- Remove \"版本升级流程\" section from AGENTS.md (~48 lines) to save\n  context tokens; steps now live only in the /up prompt\n- Update 4 references in AGENTS.md (CI/CD, Changelog, Git rules) to\n  point to /up prompt instead of inline step numbers\n- Remove unnecessary CLAUDE.md symlink (duplicate of AGENTS.md)",
          "is_bot": false,
          "headline": "chore: add /up prompt, move version upgrade steps out of AGENTS.md, r…",
          "author_name": "Luokxy",
          "author_login": null,
          "committed_at": "2026-07-16T06:40:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "adf15f7824169a30e73f7f6c11a29eb58ea83c88",
          "body": "…to cycle agents, relax main merge policy",
          "is_bot": false,
          "headline": "release v0.11.1: rename /plugins to /claude-plugin, rebind Shift+Tab …",
          "author_name": "Luokxy",
          "author_login": null,
          "committed_at": "2026-07-16T06:20:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7559ffa0279d82f3982d0cc6bf68ab7a5d307848",
          "body": null,
          "is_bot": false,
          "headline": "chore: bump version to 0.11.1",
          "author_name": "Luokxy",
          "author_login": null,
          "committed_at": "2026-07-16T06:20:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8d1120f130db2eb0af906880ac24d68c0b3a12e6",
          "body": "…le agents, relax main merge policy",
          "is_bot": false,
          "headline": "merge dev: rename /plugins to /claude-plugin, rebind Shift+Tab to cyc…",
          "author_name": "Luokxy",
          "author_login": null,
          "committed_at": "2026-07-16T06:14:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6c2b6be34f4778afdbd4cd48ca502d7aea0945e3",
          "body": "… not only on version bumps",
          "is_bot": false,
          "headline": "docs: relax main branch merge policy - allow merging when tests pass,…",
          "author_name": "Luokxy",
          "author_login": null,
          "committed_at": "2026-07-16T06:12:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e75c6ad4f94ccec29963790075b7f2d36b7b8f95",
          "body": "… shortcut\n\n- Shift+Tab now cycles primary agents (new app.agent.cycle keybinding)\n- app.thinking.cycle keybinding set to none (accessible via command palette)\n- Add cycleAgent() method using discoverPrimaryAgentsSync + switchPrimaryAgent\n- Update hotkeys display and docs (keybindings.md, quickstart.md)",
          "is_bot": false,
          "headline": "feat: rebind Shift+Tab to cycle primary agents, remove thinking cycle…",
          "author_name": "Luokxy",
          "author_login": null,
          "committed_at": "2026-07-16T06:06:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "eba85b4daa143586c68b45109d3626224370d48f",
          "body": "…lict with pi-plugin-manager extension\n\n- slash-commands.ts: BUILTIN_SLASH_COMMANDS plugins → claude-plugin\n- package-manager-cli.ts: handlePluginCommand args[0] check + help text\n- cli/args.ts: root help text\n- interactive-mode.ts: slash command registration + input handling\n- Update tests and docs (plugins.md, packages.md) accordingly",
          "is_bot": false,
          "headline": "fix: rename built-in /plugins command to /claude-plugin to avoid conf…",
          "author_name": "Luokxy",
          "author_login": null,
          "committed_at": "2026-07-16T05:55:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "79afba437b65314cb14e8dd307f74c7b74c44d7e",
          "body": "…paction 改进\n\n合并内容:\n- vitest SSR import.meta.resolve 修复 + agent_settled 测试对齐\n- 上游 timing measurements / null content 归一化 / system prompt override\n- 扩展导入缓存 / 加载失败提示 / project-local pi config autoload\n- 模型选择修复: fallback thinking / authenticated slash ids / unauthenticated default skip / modelOverrides\n- merge-upstream-coding-agent skill",
          "is_bot": false,
          "headline": "release v0.11.0: 上游 v0.80.6 同步 — agent-session 扩展逻辑对齐、模型选择修复、扩展缓存、com…",
          "author_name": "Luokxy",
          "author_login": null,
          "committed_at": "2026-07-16T05:34:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5b67b0ed4d233c8b68a0239d865ca1d5c3f22cc6",
          "body": "Checklist for merging upstream coding-agent/tui source changes into the\nfork. Covers version gap identification, commit classification, fork-\nspecific differences, selective application workflow, skip decision\nmatrix, and build notes.",
          "is_bot": false,
          "headline": "docs: add merge-upstream-coding-agent skill",
          "author_name": "Luokxy",
          "author_login": null,
          "committed_at": "2026-07-16T05:33:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "190a80618842999ce3e601bb779a16df49a51b09",
          "body": "… ca09b2b1, c6251a86, 312bc713)\n\n- model-resolver: preserve custom fallback thinking level (1fc80f4f)\n  cliThinking type changed from string to ThinkingLevel; fallback model\n  preserves reasoning flag when thinking is requested\n- model-resolver: resolve authenticated slash model ids (1b2c32c6)\n  Whe\n[…]\nsion providers (c6251a86)\n  configModelOverrides map + applyConfiguredModelOverride applied during\n  extension provider model loading\n- slash-commands: add argumentHint to /model and /login (312bc713)",
          "is_bot": false,
          "headline": "fix: model selection and provider fixes (upstream 1fc80f4f, 1b2c32c6,…",
          "author_name": "Luokxy",
          "author_login": null,
          "committed_at": "2026-07-16T05:15:19Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "9ab42dafe7ab660fc9c19d8278b581f4f7be06de",
          "body": "…4e7)\n\nCore logic only — UI/config-selector changes skipped.\n\n- Add autoload field to PackageFilter and PackageSource types\n- Add findAutoloadDeltaBase() to resolve autoload=false project entries\n  to their user-scope base source for installation\n- Refactor dedupePackages to preserve autoload=false \n[…]\nntries\n- Add applyPackageDeltaFilter + applyAutoloadDisabledPatterns for\n  incremental resource loading from autoload=false packages\n- Update source resolution loop to use resolvedSource/resolvedScope",
          "is_bot": false,
          "headline": "fix: improve project-local pi config autoload support (upstream c8ada…",
          "author_name": "Luokxy",
          "author_login": null,
          "committed_at": "2026-07-16T05:10:20Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "5f129a209dd80393ae9658e68988f5da1c63dac3",
          "body": "Show 'Hint: Start without extensions using \"pi -ne\".' when extension\nload failures are present in diagnostics.",
          "is_bot": false,
          "headline": "fix: hint when extensions fail to load (upstream 192fcccd)",
          "author_name": "Luokxy",
          "author_login": null,
          "committed_at": "2026-07-16T05:05:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d3da3fb619b0804bc9bb6c37f374c6474b03e367",
          "body": "Add extension factory cache keyed by path with cwd-aware invalidation.\nclearExtensionCache() is called on resource-loader reload to ensure\nfresh state. Session switches within the same cwd now skip re-importing\nextension modules via jiti.\n\nCloses #5905.",
          "is_bot": false,
          "headline": "fix: cache extension imports for session switches (upstream 5505316e)",
          "author_name": "Luokxy",
          "author_login": null,
          "committed_at": "2026-07-16T05:04:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1dc27e29fc7244416a12fae2108539e69a388b86",
          "body": "Source code for counting custom messages in compaction budget was\nalready applied. Add the missing test case and CustomMessageEntry helper.",
          "is_bot": false,
          "headline": "test: add custom message compaction budget test (upstream a6f720e6)",
          "author_name": "Luokxy",
          "author_login": null,
          "committed_at": "2026-07-16T05:01:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a3fed628c163df04a7442285bc1ce4b880993cd4",
          "body": "…ing tool refresh (upstream e547bb9f, fd6659dd)\n\nAdd _installAgentNextTurnRefresh() using prepareNextTurnWithContext to\ninject current tools/systemPrompt/model/thinkingLevel before each turn.\n\nAdd _systemPromptOverride to preserve before_agent_start system prompt\noverrides when tools change mid-run via setActiveTools. Override is\ncleared at the end of each prompt run.\n\nCloses #6162: extension-modified system prompt was lost when\n_refreshToolRegistry rebuilt the base prompt mid-run.",
          "is_bot": false,
          "headline": "fix: refresh session state before next turn + preserve run prompt dur…",
          "author_name": "Luokxy",
          "author_login": null,
          "committed_at": "2026-07-16T04:59:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d617fe80c9dc264af2f347b0e2cef5ecbae3d4be",
          "body": "… 8c0ccd14)\n\nNormalize null/missing content to empty array in message_end extension\nreplacements. The other ingestion points (custom messages, session entry\nloading) were already covered by prior merges.\n\nAdd lax-message-content.test.ts covering all normalization paths.",
          "is_bot": false,
          "headline": "fix: normalize null message content at ingestion boundaries (upstream…",
          "author_name": "Luokxy",
          "author_login": null,
          "committed_at": "2026-07-16T04:57:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "57203a2d61952eed22d976b6cddeca57b36f13ce",
          "body": "Refactor timings.ts to support namespaced timing groups (main/extensions).\nAdd time() calls in loader.ts for module import and factory phases.\nCall resetTimings('extensions') at the start of resource-loader reload.",
          "is_bot": false,
          "headline": "fix: preserve extension timing measurements (upstream 0bdbe7c5)",
          "author_name": "Luokxy",
          "author_login": null,
          "committed_at": "2026-07-16T04:55:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8cc5080bd0212e71a19606819a797110f4884289",
          "body": "…ettled test assertions\n\n- loader.ts: add resolveModuleEntry() fallback for ESM-only packages\n  (pi-agent-core, pi-ai/compat, pi-ai/oauth) when import.meta.resolve\n  is unavailable under vitest SSR; align getAliases to use\n  resolveWorkspaceOrImport for all upstream packages\n- agent-session-retry-events.test.ts: add agent_settled to expected\n  event arrays, use eventsOfType + last-event assertions matching\n  upstream exactly",
          "is_bot": false,
          "headline": "fix: resolve vitest SSR import.meta.resolve failure and align agent_s…",
          "author_name": "Luokxy",
          "author_login": null,
          "committed_at": "2026-07-16T04:43:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9d15995c423e80ee2e83e21ba1df030032676fb1",
          "body": "…rences to upstream packages, remove deleted workspace packages from publish list",
          "is_bot": false,
          "headline": "fix: browser-smoke, publish scripts — update pi-ai/pi-agent-core refe…",
          "author_name": "Luokxy",
          "author_login": null,
          "committed_at": "2026-07-16T02:26:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "13063565f4bbc38e1c737b4256c07e484456a882",
          "body": null,
          "is_bot": false,
          "headline": "chore: bump version to 0.11.0",
          "author_name": "Luokxy",
          "author_login": null,
          "committed_at": "2026-07-16T02:21:37Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f71e8a88a2bd53ceeec028370b0074fa010f87e9",
          "body": "…or getEntries() aggregation",
          "is_bot": false,
          "headline": "fix: update vitest config for upstream npm packages, fix stats test f…",
          "author_name": "Luokxy",
          "author_login": null,
          "committed_at": "2026-07-16T02:16:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "56f7d88311bfe4a2ceeb46ad6bd186cdafa68612",
          "body": "…lign Extension API with upstream, sync compaction/agent-session behavior",
          "is_bot": false,
          "headline": "merge: feat/replace-upstream-deps — remove local ai/agent packages, a…",
          "author_name": "Luokxy",
          "author_login": null,
          "committed_at": "2026-07-16T01:58:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "202f58351c13f88858a0de755d3d20f83d8bdd31",
          "body": "… (session_info_changed, before_provider_headers, agent_settled, registerEntryRenderer, compaction reason/willRetry, package scope update)",
          "is_bot": false,
          "headline": "docs: update extensions.md and packages.md for upstream API additions…",
          "author_name": "Luokxy",
          "author_login": null,
          "committed_at": "2026-07-16T00:49:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "54378dc2b303504f14962710c5a0ed0fed594094",
          "body": "…5-B9 (env, reload options, null content, isIdle, waitForIdle, getStats)",
          "is_bot": false,
          "headline": "refactor: align agent-session compaction auth with upstream — B1-B3,B…",
          "author_name": "Luokxy",
          "author_login": null,
          "committed_at": "2026-07-15T17:35:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "05009bd48bc68cacb3fb54ce53698714ba98ceae",
          "body": "…emain (pi-ai→compat, pi-tui→schovest)",
          "is_bot": false,
          "headline": "refactor: replace types.ts with upstream — only 2 import path diffs r…",
          "author_name": "Luokxy",
          "author_login": null,
          "committed_at": "2026-07-15T16:59:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fbf3d7e9ed88ae10c6767eb315743e0e13596dd9",
          "body": "…sed it, SDK export is sufficient",
          "is_bot": false,
          "headline": "refactor: remove convertToLlm from ExtensionAPI — upstream never expo…",
          "author_name": "Luokxy",
          "author_login": null,
          "committed_at": "2026-07-15T16:56:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "518e0dd88643123763a78a9dec8ad28030fd64b5",
          "body": "…ensions, add interactive-mode handler, forward session_info_changed to extensions",
          "is_bot": false,
          "headline": "fix: implement agent_settled mechanism — track run state, emit to ext…",
          "author_name": "Luokxy",
          "author_login": null,
          "committed_at": "2026-07-15T16:35:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2eadc09f5e95f66ccaa75f8e3c8aa22800edf916",
          "body": "…try fields",
          "is_bot": false,
          "headline": "fix: backport ExtensionEvent union entries + compaction reason/willRe…",
          "author_name": "Luokxy",
          "author_login": null,
          "committed_at": "2026-07-15T16:24:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e051f686177a06577cdbd6ed3c3def9266e60e5e",
          "body": "…ent, BeforeProviderHeadersEvent, AgentSettledEvent, registerEntryRenderer",
          "is_bot": false,
          "headline": "feat: backport upstream ExtensionAPI additions — SessionInfoChangedEv…",
          "author_name": "Luokxy",
          "author_login": null,
          "committed_at": "2026-07-15T16:12:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f212e5c27caed411051ce419afccedd495dafd20",
          "body": null,
          "is_bot": false,
          "headline": "docs: update architecture.md for external ai/agent as npm deps",
          "author_name": "Luokxy",
          "author_login": null,
          "committed_at": "2026-07-15T13:52:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "78854b8b58c3bc893476a4e9b6c159f6e6cf673e",
          "body": null,
          "is_bot": false,
          "headline": "chore: biome auto-fix + shrinkwrap update",
          "author_name": "Luokxy",
          "author_login": null,
          "committed_at": "2026-07-15T13:50:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6d69b22c6a91968aa319dbf404bd3743ebe441fe",
          "body": "…duplicate key, test imports",
          "is_bot": false,
          "headline": "fix: resolve type errors — ThinkingLevel max, Plan dead code, loader …",
          "author_name": "Luokxy",
          "author_login": null,
          "committed_at": "2026-07-15T13:50:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c0da8465a5a563d1028146e060f6fd36ff5fe26e",
          "body": "…ackages",
          "is_bot": false,
          "headline": "refactor: update loader VIRTUAL_MODULES and getAliases for upstream p…",
          "author_name": "Luokxy",
          "author_login": null,
          "committed_at": "2026-07-15T13:22:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c9fdd06ac1d27c2d56701de13ac732203b3bc171",
          "body": "… @schovest/pi-agent-core → @earendil-works/pi-agent-core",
          "is_bot": false,
          "headline": "refactor: replace all @schovest/pi-ai → @earendil-works/pi-ai/compat,…",
          "author_name": "Luokxy",
          "author_login": null,
          "committed_at": "2026-07-15T13:21:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ce6c332aa5ec839ae3f9cd03483c47124dd3c656",
          "body": null,
          "is_bot": false,
          "headline": "refactor: move SubagentRunEntry from agent-core to coding-agent",
          "author_name": "Luokxy",
          "author_login": null,
          "committed_at": "2026-07-15T13:20:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8379c5282b822acd4ad4a6994035c69a2b007d75",
          "body": "…l-works/*",
          "is_bot": false,
          "headline": "refactor: remove local ai/agent packages, depend on upstream @earendi…",
          "author_name": "Luokxy",
          "author_login": null,
          "committed_at": "2026-07-15T13:19:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "50f47bbf31d41c793a79661f883f8378d2360f90",
          "body": null,
          "is_bot": false,
          "headline": "release v0.10.2: 版本升级流程简化 + 扩展版本同步 + install/update 改进",
          "author_name": "Luokxy",
          "author_login": null,
          "committed_at": "2026-07-15T12:01:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0324b9c72db045ba06a5908efbebdc6b8a4e2e69",
          "body": null,
          "is_bot": false,
          "headline": "chore: bump version to 0.10.2",
          "author_name": "Luokxy",
          "author_login": null,
          "committed_at": "2026-07-15T12:00:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "27595dca9b2f90066e4792f746928b9d5f00e257",
          "body": null,
          "is_bot": false,
          "headline": "chore: sync example extensions version to 0.10.1",
          "author_name": "Luokxy",
          "author_login": null,
          "committed_at": "2026-07-15T11:56:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d6f38df98bfb08f3207dcf67b4d6ed62d9d7e371",
          "body": null,
          "is_bot": false,
          "headline": "docs: 版本升级流程简化为 npm run version:<level>",
          "author_name": "Luokxy",
          "author_login": null,
          "committed_at": "2026-07-15T11:53:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8103755745bc746e12c82aa048aee55d40e3487e",
          "body": "- 后台命令完成通知从 followUp 改为 steer 队列\n- install.sh 交互式安装目录选择 + 持久化\n- update.sh 三级目录检测(配置→符号链接→默认)\n- update.sh 不再随包落地, pi self-update 始终从 GitHub 拉取\n- pi self-update --force 通过 PI_FORCE_UPDATE=1 正确传递\n- README 精简安装命令",
          "is_bot": false,
          "headline": "release v0.10.1: install/update flow 改进, 后台命令 steer 队列, update.sh 精简",
          "author_name": "Luokxy",
          "author_login": null,
          "committed_at": "2026-07-15T11:27:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "eea6825c32877916457ed01303a2b3d65b9caf3c",
          "body": null,
          "is_bot": false,
          "headline": "chore: bump version to 0.10.1",
          "author_name": "Luokxy",
          "author_login": null,
          "committed_at": "2026-07-15T11:25:26Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "67c5de10ddf2aba4474bbce87ad22a4924d0d681",
          "body": "- Background command completion: switch from followUp to steer queue for\n  more timely agent notification\n- Install: interactive directory selection on fresh install, persisted to\n  ~/.pi/agent/.install-prefix\n- Update: three-level install prefix detection (config file → symlink →\n  default) to corr\n[…]\nself-update always fetches\n  the latest from GitHub\n- pi self-update --force: properly passes PI_FORCE_UPDATE=1 to update.sh\n- README: single curl|bash install command, remove npm and upstream install",
          "is_bot": false,
          "headline": "feat: improve install/update flow and background command notification",
          "author_name": "Luokxy",
          "author_login": null,
          "committed_at": "2026-07-15T11:22:08Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "8c32fefa2c08fdff724a48ef97e689f46786ac81",
          "body": null,
          "is_bot": false,
          "headline": "fix: CI verify 排除 models.ts",
          "author_name": "Luokxy",
          "author_login": null,
          "committed_at": "2026-07-15T10:24:04Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "40c06cf8c52a6de8f460de570bf548340bf1b4ab",
          "body": null,
          "is_bot": false,
          "headline": "fix: CI verify 步骤排除 *.models.ts 自动生成文件",
          "author_name": "Luokxy",
          "author_login": null,
          "committed_at": "2026-07-15T10:24:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "62588724acf6002791ae4679139b79c4c351a399",
          "body": null,
          "is_bot": false,
          "headline": "fix: ai/test 全部测试通过",
          "author_name": "Luokxy",
          "author_login": null,
          "committed_at": "2026-07-15T10:18:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f9f9b06471b09d388b0a71ef9157caf115e37219",
          "body": "17 个测试失败均为上游模型元数据变更导致期望值不匹配:\n- anthropic-adaptive-thinking-models: 新增 claude-sonnet-5\n- supports-xhigh: Opus 4.6/DeepSeek thinking level 变更\n- github-copilot-oauth: models fetch URL mock 更新\n- lazy-module-load: streamSimpleAnthropic 导入路径\n- openai-completions-empty-tools: Cloudflare/maxTokens 行为变更\n- openai-responses-copilot-provider: cost multiplier 变更\n- openai-responses-partial-json-cleanup: terminal event 检查",
          "is_bot": false,
          "headline": "fix: 同步上游 ai/test 全部测试文件修复断言不匹配",
          "author_name": "Luokxy",
          "author_login": null,
          "committed_at": "2026-07-15T10:18:07Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "42dedf640cc3f37b9ca94d7f192f05a32332a6ff",
          "body": null,
          "is_bot": false,
          "headline": "fix: ai/test 全部测试文件编译通过",
          "author_name": "Luokxy",
          "author_login": null,
          "committed_at": "2026-07-15T10:12:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2963b721ccf0815f76ba0a0065b647b7592493dd",
          "body": "修复 tsgo --noEmit 全量检查(含 test)的编译错误:\n- streamAnthropic → stream as streamAnthropic\n- getModel/getModels → 从 compat.ts 导入\n- chatTemplateKwargs 类型补全\n- cache-retention stream 变量修复",
          "is_bot": false,
          "headline": "fix: 同步上游 packages/ai/test 全部测试文件",
          "author_name": "Luokxy",
          "author_login": null,
          "committed_at": "2026-07-15T10:12:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "04c2cb54db2e73dccefe03a480877d76a1537a56",
          "body": null,
          "is_bot": false,
          "headline": "fix: CI build 后 biome format models 文件",
          "author_name": "Luokxy",
          "author_login": null,
          "committed_at": "2026-07-15T10:06:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ed6a3467a3f037c32c16996012272d960325284a",
          "body": "CI 构建时 generate-models 生成文件格式不符合 biome,\n在 build 脚步中添加 biome format --write 修正",
          "is_bot": false,
          "headline": "fix: models 文件格式化 + build 脚本自动 biome format",
          "author_name": "Luokxy",
          "author_login": null,
          "committed_at": "2026-07-15T10:06:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "88173658eb055662378204e759c68a0333f17a7b",
          "body": null,
          "is_bot": false,
          "headline": "fix: biome check 零错误零警告",
          "author_name": "Luokxy",
          "author_login": null,
          "committed_at": "2026-07-15T09:59:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f2e9889c33dc840f09afab3516d2b18312a4f5db",
          "body": null,
          "is_bot": false,
          "headline": "fix: 移除 compaction.test.ts 未使用的 estimateContextTokens 导入",
          "author_name": "Luokxy",
          "author_login": null,
          "committed_at": "2026-07-15T09:59:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b394f22e1c1df03ea14414686114926759350fdf",
          "body": null,
          "is_bot": false,
          "headline": "fix: biome check 零错误",
          "author_name": "Luokxy",
          "author_login": null,
          "committed_at": "2026-07-14T17:35:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4b678d655951295554adebfdccf71c97275f95ed",
          "body": null,
          "is_bot": false,
          "headline": "fix: google-vertex test 恢复 streamGoogleVertex 导入避免变量名冲突",
          "author_name": "Luokxy",
          "author_login": null,
          "committed_at": "2026-07-14T17:35:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "60983da0b279c813824df25ed1ec97133f0fc854",
          "body": null,
          "is_bot": false,
          "headline": "fix: biome format/lint 修复",
          "author_name": "Luokxy",
          "author_login": null,
          "committed_at": "2026-07-14T17:33:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2f0145cd407585f10f78f4b734b18cdbadeec5b6",
          "body": null,
          "is_bot": false,
          "headline": "fix: biome format/lint 修复 test 文件",
          "author_name": "Luokxy",
          "author_login": null,
          "committed_at": "2026-07-14T17:33:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5e9a3cdc0f6edb03fdc3239f016c80c21a36637d",
          "body": null,
          "is_bot": false,
          "headline": "fix: biome import sort",
          "author_name": "Luokxy",
          "author_login": null,
          "committed_at": "2026-07-14T17:26:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "de72a1d8b85cda8013263b08cefad010d7282a37",
          "body": null,
          "is_bot": false,
          "headline": "fix: biome import sort index.ts",
          "author_name": "Luokxy",
          "author_login": null,
          "committed_at": "2026-07-14T17:26:12Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "540328de9db46b403143bbdf80da93f0f1af7995",
          "body": null,
          "is_bot": false,
          "headline": "docs: AGENTS.md 严禁添加 upstream remote / fetch 上游 tag",
          "author_name": "Luokxy",
          "author_login": null,
          "committed_at": "2026-07-14T17:14:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cc157fbd93650155762378d2be159e18113dad3b",
          "body": null,
          "is_bot": false,
          "headline": "release v0.10.0: 上游合并 108 项修复/功能,架构迁移至 api/+providers/ 分离模式",
          "author_name": "Luokxy",
          "author_login": null,
          "committed_at": "2026-07-14T17:05:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d83e4fd0d3891ce269c997349b221a78cfa8cfa1",
          "body": "- index.ts 重新导出 findEnvKeys/getEnvApiKey\n- auth-storage.ts 改回 @schovest/pi-ai (主入口)\n- register-bedrock.ts 保持 /compat (setBedrockProviderModule 仅在 compat)\n- pi-ai package.json 保留 require 条件",
          "is_bot": false,
          "headline": "fix: auth-storage 改回主入口导入避免 /compat 子路径解析问题",
          "author_name": "Luokxy",
          "author_login": null,
          "committed_at": "2026-07-14T17:01:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "83b52cc915ab9278afcee5b51598046bad7a2e9e",
          "body": "扩展 loader 使用 createRequire (CJS) 加载模块, exports 缺少 require\n条件导致回退到 main 字段路径解析 (dist/index.js/compat)",
          "is_bot": false,
          "headline": "fix: pi-ai exports 添加 require 条件修复扩展加载错误",
          "author_name": "Luokxy",
          "author_login": null,
          "committed_at": "2026-07-14T16:52:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "eebace83ce91a075224aa27312eef7e17d546136",
          "body": null,
          "is_bot": false,
          "headline": "chore: bump version to 0.10.0",
          "author_name": "Luokxy",
          "author_login": null,
          "committed_at": "2026-07-14T16:47:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "50793ff593877899cf0b5b1340d462b27e124f9e",
          "body": "- package-command-paths: 创建 trust-requiring 资源(skills)而非 bare .pi\n- trust-manager: 移除祖先依赖的 false 断言,验证增量检测\n- file-operations: 大文件测试 30s 超时",
          "is_bot": false,
          "headline": "test: 修复预存测试失败 — 适配本地信任模型和路径检测",
          "author_name": "Luokxy",
          "author_login": null,
          "committed_at": "2026-07-14T16:38:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "343a3281fd541c54257a19195c563d8f43812982",
          "body": "- _overflowRecoveryAttempts + MAX_OVERFLOW_RECOVERY → _overflowRecoveryAttempted\n- 错误消息: multiple → one compact-and-retry attempt\n- 同步 file-operations 测试(大文件超时仍为预存问题)\n\ncompaction 相关 2 测试现在通过",
          "is_bot": false,
          "headline": "fix: overflow recovery 从多重重试改为单次重试,匹配上游",
          "author_name": "Luokxy",
          "author_login": null,
          "committed_at": "2026-07-14T15:57:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "511b117ccf08695aee8a5c7cb6592a00fd7b626f",
          "body": "- agent-session: overflow 成功响应(stopReason=stop)不 retry (6b9f3f49)\n- main: --session-id 找不到时 warn 而非静默创建 (c4281a7d)\n- 同步 3 个上游测试文件\n\n已知: 2 个 compaction 测试因本地多重重试策略(_overflowRecoveryAttempts)与上游单次策略(_overflowRecoveryAttempted)差异而失败,非 bug",
          "is_bot": false,
          "headline": "fix: 同步上游 overflow retry + session-id warning 生产代码和测试",
          "author_name": "Luokxy",
          "author_login": null,
          "committed_at": "2026-07-14T15:10:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "461bfd6fa1cec4fb457e9c0a44b47251fea95287",
          "body": null,
          "is_bot": false,
          "headline": "test: 修复上游测试文件 @schovest import 路径",
          "author_name": "Luokxy",
          "author_login": null,
          "committed_at": "2026-07-14T14:39:07Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b8ae08fd809cce079dc000e2d6e0989ad08fbe14",
          "body": null,
          "is_bot": false,
          "headline": "fix: --session-id 允许与 --no-session 组合 (D5 遗漏项)",
          "author_name": "Luokxy",
          "author_login": null,
          "committed_at": "2026-07-14T14:38:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ae808327d95dd12dccfda75d3dce4feecc884cb3",
          "body": "- suite/agent-session-compaction: keepRecentTokens:1 适配空守卫\n- agent-session-auto-compaction-queue: 适配空守卫返回\n- session-id-readonly: 新增 --no-session --session-id 测试\n- file-operations: throw/preserve 替代 truncate 行为",
          "is_bot": false,
          "headline": "test: 同步上游测试文件适配 C2/D4/D5 行为变更",
          "author_name": "Luokxy",
          "author_login": null,
          "committed_at": "2026-07-14T14:34:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c278c242dd92fd03293502a76d2ed59e41e137ea",
          "body": null,
          "is_bot": false,
          "headline": "docs: 更新 CHANGELOG 记录上游合并完成",
          "author_name": "Luokxy",
          "author_login": null,
          "committed_at": "2026-07-14T14:26:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3aaddbe53538ea457a0b262cb0a978a98f67609b",
          "body": "E9: Windows 项目 context 文件发现 (dirname 替代 resolve(..))\nE1-E8: 已由模块A api/+providers/ 迁移覆盖\n  - E1: session switch 复用扩展模块 ✅\n  - E2/E7: length stop / truncated tool calls (local guard system)\n  - E3/E8: retry stream errors / Bun socket-drop (api/ provider files)\n  - E4/E5: gRPC/Cloudflare retry (api/ provider files)\n  - E6: null content normalization (api/openai-completions.ts)\n\nG (Extension API): 已由模块A 迁移 + 本地扩展系统覆盖\n其他 Provider/UX/SDK 项: 已由模块A 基础设施迁移覆盖\n\nCSV 全部 108/108 标记完成",
          "is_bot": false,
          "headline": "fix: 完成上游合并 — 模块E+G (Stability + Extension + 剩余项)",
          "author_name": "Luokxy",
          "author_login": null,
          "committed_at": "2026-07-14T14:25:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ca1159284dbadbac7bad7ab7415888f2576e9695",
          "body": "H1: RPC 新增 get_entries/get_tree 命令 + rpc-types 类型定义\nH2: JSONL session metadata — 已本地等价 ✅\nH3: 安全依赖版本 — 已本地匹配 ✅\n\nCSV 标记 3 项为 已合并-H",
          "is_bot": false,
          "headline": "fix(misc): 合并上游 Misc 修复 — 模块H",
          "author_name": "Luokxy",
          "author_login": null,
          "committed_at": "2026-07-14T14:21:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e624706cb9e6f941935ab8d3aa27f7d542a1d490",
          "body": "F1: fuzzy edit 保留未触碰行块 (edit-diff.ts 大重写)\nF2: WSL bash.exe stdin transport (shell.ts: isLegacyWslBashPath)\nF3: find 移除 --no-require-git (fd 默认层级 gitignore)\nF4: edit schema 移除 additionalProperties 约束\n\nCSV 标记 4 项为 已合并-F",
          "is_bot": false,
          "headline": "fix(tools): 合并上游 Tools 修复 — 模块F",
          "author_name": "Luokxy",
          "author_login": null,
          "committed_at": "2026-07-14T14:18:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "38f2c41152ad52c491548f5cad8793cf97d3023b",
          "body": "D1: getTree() 线性复杂度 — 已本地等价 ✅\nD2: session selector 按子树 latestActivity 排序\nD3: resource notifications 顺序 — 已本地一致 ✅\nD4: 拒绝非空无效 session 文件 (statSync check + openSessionOrExit)\nD5: --no-session --session-id 确定性 ID 传递\n\nCSV 标记 5 项为 已合并-D",
          "is_bot": false,
          "headline": "fix(session): 合并上游 Session 修复 — 模块D",
          "author_name": "Luokxy",
          "author_login": null,
          "committed_at": "2026-07-14T14:13:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9e57a8396ceae7970a70e2838bd41998edca746d",
          "body": "C1: post-compaction token 估算 (estimatedTokensAfter)\n  - CompactionResult 新增 estimatedTokensAfter 字段\n  - 手动/自动 compaction 后计算并回传\n\nC2: 拒绝空 compaction summary\n  - prepareCompaction() 空 messagesToSummarize 时返回 undefined\n  - 同步更新测试: beDefined → toBeUndefined\n\nC3: assistantIsFromBeforeCompaction 守卫 — 已本地存\n[…]\nContextMessages\n\nC5: post-compaction output budget 忽略陈旧 usage\n  - getAssistantUsage 新增 calculateContextTokens > 0 校验\n\n附加: pi-ai package.json 新增 ./compat ./providers/* ./api/* exports\nCSV 标记 5 项为 已合并-C",
          "is_bot": false,
          "headline": "fix(compaction): 合并上游 Compaction 修复 — 模块C",
          "author_name": "Luokxy",
          "author_login": null,
          "committed_at": "2026-07-14T13:53:16Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "ba808cc46e7c41526f66bec7f32fb3c3d76ca936",
          "body": "模型生成已在模块A完成,本模块验证关键新模型/元数据:\n- Claude Sonnet 5 / Fable 5 xhigh/max thinking ✅\n- GPT-5.5/5.6 + 输入分级定价 + Codex 372K ✅\n- Fireworks/OpenRouter GLM-5.2 + reasoning_effort ✅\n- chat-template thinking kwargs ✅\n- Z.AI preserved thinking ✅\n- 编译零错误\n\nCSV 标记 18 项为 已合并-B",
          "is_bot": false,
          "headline": "feat: 上游 Provider 模型数据更新 — 模块B验证",
          "author_name": "Luokxy",
          "author_login": null,
          "committed_at": "2026-07-14T13:32:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f5e85b9b7dc20a8e48dcb5c415afda1231c6260f",
          "body": "- custom-provider-gitlab-duo: streamSimpleXxx 从 @schovest/pi-ai/compat 导入\n- sdk-openrouter-attribution.test: headers 类型断言修正",
          "is_bot": false,
          "headline": "fix: 修复遗漏的 coding-agent 示例/测试 import 适配",
          "author_name": "Luokxy",
          "author_login": null,
          "committed_at": "2026-07-14T13:31:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0ae3fae92614b3155bbf2a458a46012a25de89d9",
          "body": "60 test files: models.ts → compat.ts, providers/ → api/ 路径调整",
          "is_bot": false,
          "headline": "refactor: 修复测试文件 import 路径适配模块A新架构",
          "author_name": "Luokxy",
          "author_login": null,
          "committed_at": "2026-07-14T13:27:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "78bc438913ca4ed00afb5c9e4fa8f288cb1f45c6",
          "body": "核心变更:\n- 新增 api/ 目录 (28 文件): API 实现 + lazy 包装器\n- 新增 auth/ 目录 (5 文件): 认证上下文/凭据存储\n- 替换 providers/ 为工厂函数 (~73 文件)\n- 运行 generate-models.ts 生成 35 个 .models.ts\n- 替换 models.ts 为 Provider/Models/createProvider 抽象\n- 新增 compat.ts/legacy-api-aliases.ts: 旧 API 兼容\n- 替换 index.ts(50行)/types.ts/utils.ts 等基础设施\n- 修复 coding-agent/agent 包 import 适配\n- 源码编译零错误 (tsgo --noEmit 排除test)\n- models.generated.ts: 18k行 -> 聚合文件\n\n已知: packages/ai/test/ 需单独迁移(import路径变更)",
          "is_bot": false,
          "headline": "refactor: 迁移 Provider 架构到上游 api/+providers/ 分离模式 (模块A)",
          "author_name": "Luokxy",
          "author_login": null,
          "committed_at": "2026-07-14T10:16:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        }
      ],
      "releases_count": 15,
      "commits_last_year": 4868,
      "latest_release_at": "2026-07-17T04:18:27Z",
      "latest_release_tag": "v0.11.3",
      "releases_from_tags": false,
      "days_since_last_push": 4,
      "active_weeks_last_year": 49,
      "days_since_latest_release": 4,
      "mean_days_between_releases": 0.8
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": true,
      "health_percentage": 71,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": false
    },
    "ecosystem": {
      "packages": [
        {
          "name": "@schovest/pi-tui",
          "exists": true,
          "license": "MIT",
          "keywords": [
            "tui",
            "terminal",
            "ui",
            "text-editor",
            "differential-rendering",
            "typescript",
            "cli"
          ],
          "ecosystem": "npm",
          "matches_repo": true,
          "registry_url": "https://www.npmjs.com/package/@schovest/pi-tui",
          "is_deprecated": false,
          "latest_version": "0.11.3",
          "repository_url": "https://github.com/schovest/pi",
          "versions_count": 14,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": 1,
          "monthly_downloads": 2127,
          "first_published_at": "2026-07-06T16:51:40.341000Z",
          "latest_published_at": "2026-07-17T04:20:42.588000Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 4
        },
        {
          "name": "@schovest/pi-coding-agent",
          "exists": true,
          "license": "MIT",
          "keywords": [
            "coding-agent",
            "ai",
            "llm",
            "cli",
            "tui",
            "agent"
          ],
          "ecosystem": "npm",
          "matches_repo": true,
          "registry_url": "https://www.npmjs.com/package/@schovest/pi-coding-agent",
          "is_deprecated": false,
          "latest_version": "0.11.3",
          "repository_url": "https://github.com/schovest/pi",
          "versions_count": 14,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": 1,
          "monthly_downloads": 1870,
          "first_published_at": "2026-07-06T16:51:47.680000Z",
          "latest_published_at": "2026-07-17T04:20:48.776000Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 4
        }
      ]
    },
    "popularity": {
      "forks": 0,
      "stars": 2,
      "watchers": 0,
      "fork_history": {
        "days": [],
        "complete": true,
        "collected": 0,
        "total_forks": 0
      },
      "star_history": {
        "days": [
          {
            "date": "2026-07-07",
            "count": 2
          }
        ],
        "complete": true,
        "collected": 2,
        "total_stars": 2
      },
      "open_issues_and_prs": 0
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [
        "examples"
      ],
      "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": 221006,
      "source_files_sampled": 520,
      "oversized_source_files": 8,
      "agent_instruction_files": [
        "AGENTS.md"
      ],
      "agent_instruction_max_bytes": 12103
    },
    "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": "@earendil-works/pi-agent-core",
          "manifest": "packages/coding-agent/package.json",
          "ecosystem": "npm",
          "version_constraint": "0.80.6"
        },
        {
          "name": "@earendil-works/pi-ai",
          "manifest": "packages/coding-agent/package.json",
          "ecosystem": "npm",
          "version_constraint": "0.80.6"
        },
        {
          "name": "@schovest/pi-tui",
          "manifest": "packages/coding-agent/package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.11.3"
        },
        {
          "name": "@silvia-odwyer/photon-node",
          "manifest": "packages/coding-agent/package.json",
          "ecosystem": "npm",
          "version_constraint": "0.3.4"
        },
        {
          "name": "chalk",
          "manifest": "packages/coding-agent/package.json",
          "ecosystem": "npm",
          "version_constraint": "5.6.2"
        },
        {
          "name": "cross-spawn",
          "manifest": "packages/coding-agent/package.json",
          "ecosystem": "npm",
          "version_constraint": "7.0.6"
        },
        {
          "name": "diff",
          "manifest": "packages/coding-agent/package.json",
          "ecosystem": "npm",
          "version_constraint": "8.0.4"
        },
        {
          "name": "glob",
          "manifest": "packages/coding-agent/package.json",
          "ecosystem": "npm",
          "version_constraint": "13.0.6"
        },
        {
          "name": "highlight.js",
          "manifest": "packages/coding-agent/package.json",
          "ecosystem": "npm",
          "version_constraint": "10.7.3"
        },
        {
          "name": "hosted-git-info",
          "manifest": "packages/coding-agent/package.json",
          "ecosystem": "npm",
          "version_constraint": "9.0.3"
        },
        {
          "name": "ignore",
          "manifest": "packages/coding-agent/package.json",
          "ecosystem": "npm",
          "version_constraint": "7.0.5"
        },
        {
          "name": "jiti",
          "manifest": "packages/coding-agent/package.json",
          "ecosystem": "npm",
          "version_constraint": "2.7.0"
        },
        {
          "name": "minimatch",
          "manifest": "packages/coding-agent/package.json",
          "ecosystem": "npm",
          "version_constraint": "10.2.5"
        },
        {
          "name": "proper-lockfile",
          "manifest": "packages/coding-agent/package.json",
          "ecosystem": "npm",
          "version_constraint": "4.1.2"
        },
        {
          "name": "typebox",
          "manifest": "packages/coding-agent/package.json",
          "ecosystem": "npm",
          "version_constraint": "1.1.38"
        },
        {
          "name": "undici",
          "manifest": "packages/coding-agent/package.json",
          "ecosystem": "npm",
          "version_constraint": "8.3.0"
        },
        {
          "name": "yaml",
          "manifest": "packages/coding-agent/package.json",
          "ecosystem": "npm",
          "version_constraint": "2.9.0"
        },
        {
          "name": "get-east-asian-width",
          "manifest": "packages/tui/package.json",
          "ecosystem": "npm",
          "version_constraint": "1.6.0"
        },
        {
          "name": "marked",
          "manifest": "packages/tui/package.json",
          "ecosystem": "npm",
          "version_constraint": "15.0.12"
        }
      ],
      "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": 1,
      "top_contributors": [
        {
          "type": "User",
          "login": "badlogic",
          "commits": 3334,
          "avatar_url": "https://avatars.githubusercontent.com/u/514052?v=4"
        },
        {
          "type": "User",
          "login": "mitsuhiko",
          "commits": 195,
          "avatar_url": "https://avatars.githubusercontent.com/u/7396?v=4"
        },
        {
          "type": "User",
          "login": "hjanuschka",
          "commits": 66,
          "avatar_url": "https://avatars.githubusercontent.com/u/2891702?v=4"
        },
        {
          "type": "User",
          "login": "aliou",
          "commits": 56,
          "avatar_url": "https://avatars.githubusercontent.com/u/980367?v=4"
        },
        {
          "type": "User",
          "login": "markusylisiurunen",
          "commits": 44,
          "avatar_url": "https://avatars.githubusercontent.com/u/8409947?v=4"
        },
        {
          "type": "User",
          "login": "Perlence",
          "commits": 43,
          "avatar_url": "https://avatars.githubusercontent.com/u/1044300?v=4"
        },
        {
          "type": "User",
          "login": "nicobailon",
          "commits": 33,
          "avatar_url": "https://avatars.githubusercontent.com/u/2958133?v=4"
        },
        {
          "type": "User",
          "login": "haoqixu",
          "commits": 25,
          "avatar_url": "https://avatars.githubusercontent.com/u/9400582?v=4"
        },
        {
          "type": "User",
          "login": "cristinaponcela",
          "commits": 21,
          "avatar_url": "https://avatars.githubusercontent.com/u/140309543?v=4"
        },
        {
          "type": "User",
          "login": "ferologics",
          "commits": 21,
          "avatar_url": "https://avatars.githubusercontent.com/u/5576161?v=4"
        }
      ],
      "contributors_sampled": 99,
      "top_contributor_share": 0.792
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "approve-contributor.yml",
        "build-binaries.yml",
        "ci.yml",
        "issue-gate.yml",
        "npm-audit.yml",
        "openclaw-gate.yml",
        "pr-gate.yml"
      ],
      "has_docs_dir": true,
      "linter_configs": [
        "biome.json"
      ],
      "has_editorconfig": false,
      "has_linter_config": true,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [
        "package-lock.json"
      ],
      "scorecard": {
        "checks": [
          {
            "name": "Binary-Artifacts",
            "score": 5,
            "reason": "binaries present in source code",
            "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": 10,
            "reason": "project has 40 contributing companies or organizations",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
          },
          {
            "name": "Dangerous-Workflow",
            "score": 10,
            "reason": "no dangerous workflow patterns detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
          },
          {
            "name": "Dependency-Update-Tool",
            "score": 0,
            "reason": "no update tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
          },
          {
            "name": "Fuzzing",
            "score": 0,
            "reason": "project is not fuzzed",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
          },
          {
            "name": "License",
            "score": 10,
            "reason": "license file detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
          },
          {
            "name": "Maintained",
            "score": 0,
            "reason": "project was created within the last 90 days. Please review its contents carefully",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
          },
          {
            "name": "Packaging",
            "score": null,
            "reason": "packaging workflow not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
          },
          {
            "name": "Pinned-Dependencies",
            "score": 4,
            "reason": "dependency not pinned by hash detected -- score normalized to 4",
            "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": 10,
            "reason": "security policy file detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
          },
          {
            "name": "Signed-Releases",
            "score": 0,
            "reason": "Project has not signed or included provenance with any releases.",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
          },
          {
            "name": "Token-Permissions",
            "score": 0,
            "reason": "detected GitHub workflow tokens with excessive permissions",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
          },
          {
            "name": "Vulnerabilities",
            "score": 0,
            "reason": "18 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "d2f3f898b3d75dcb93b35f78cd83f792258f2575",
        "ran_at": "2026-07-21T22:42:25Z",
        "aggregate_score": 2.6,
        "scorecard_version": "v5.5.0"
      },
      "has_codeql_workflow": false,
      "has_security_policy": true,
      "has_dependabot_config": false
    },
    "contribution_flow": {
      "collected": true,
      "ci_last_run_at": "2026-07-21T12:50:46Z",
      "oldest_open_prs": [],
      "last_merged_pr_at": null,
      "ci_last_conclusion": "FAILURE",
      "oldest_open_issues": []
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/schovest/pi",
    "host": "github.com",
    "name": "pi",
    "owner": "schovest"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "moderate",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 54,
      "inputs": {
        "security": 26,
        "vitality": 89,
        "community": 40,
        "governance": 36,
        "engineering": 74
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "excellent",
        "name": "Vitality",
        "value": 89,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "excellent",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 88,
            "inputs": {
              "commits_last_year": 4868,
              "human_commit_share": 1,
              "days_since_last_push": 4,
              "active_weeks_last_year": 49
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 4 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 4
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "49/52 weeks with commits",
                "points": 33.9,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 49
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "4868 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 4868
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "project was created within the last 90 days. Please review its contents carefully",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "release_discipline",
            "band": "excellent",
            "name": "Release discipline",
            "note": null,
            "notes": [],
            "value": 90,
            "inputs": {
              "releases_count": 15,
              "latest_release_tag": "v0.11.3",
              "releases_from_tags": false,
              "days_since_latest_release": 4,
              "mean_days_between_releases": 0.8
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "15 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 15
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 4 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 4
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~0.8 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 0.8
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "openssf_scorecard_signed_releases",
                "name": "OpenSSF Scorecard: Signed-Releases",
                "detail": "Project has not signed or included provenance with any releases.",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "abandonment",
            "band": "excellent",
            "name": "Abandonment",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "cap": null,
              "state": "unverified",
              "guards": [],
              "signals": [],
              "red_flag": false,
              "multiplier_pct": 100,
              "declared_reason": null,
              "unverified_reason": "repository_too_young",
              "unanswered_open_prs": null,
              "unanswered_open_issues": null,
              "days_since_last_merged_pr": null,
              "days_since_last_human_commit": null,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "maintenance record not established from the collected data",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_unverified",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "at_risk",
        "name": "Community & Adoption",
        "value": 40,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "critical",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 1,
            "inputs": {
              "forks": 0,
              "stars": 2,
              "watchers": 0,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "below_threshold"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "2 stars",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 2
                    }
                  }
                ],
                "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": "good",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 70,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "has_contributing": true,
              "has_issue_template": false,
              "has_code_of_conduct": false,
              "has_pull_request_template": false
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 22.5,
                "status": "met",
                "details": [],
                "max_points": 22.5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "recognized license (MIT)",
                "points": 22.5,
                "status": "met",
                "details": [
                  {
                    "code": "license_standard",
                    "params": {}
                  },
                  {
                    "code": "license_spdx",
                    "params": {
                      "spdx": "MIT"
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributing_guide",
                "name": "CONTRIBUTING guide",
                "detail": null,
                "points": 18,
                "status": "met",
                "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": 60,
            "inputs": {
              "packages": [
                "@schovest/pi-tui",
                "@schovest/pi-coding-agent"
              ],
              "dependents": null,
              "ecosystems": "npm",
              "total_downloads": null,
              "monthly_downloads": 3997
            },
            "components": [
              {
                "key": "monthly_downloads",
                "name": "Monthly downloads",
                "detail": "3,997 downloads/month across npm",
                "points": 48,
                "status": "partial",
                "details": [
                  {
                    "code": "downloads_monthly",
                    "params": {
                      "count": 3997,
                      "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": 36,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "at_risk",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 37,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 99,
              "top_contributor_share": 0.792
            },
            "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 79% of commits",
                "points": 4.7,
                "status": "partial",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 79
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "99 contributors",
                "points": 13.5,
                "status": "met",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 99
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 40 contributing companies or organizations",
                "points": 10,
                "status": "met",
                "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": "critical",
            "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": 17,
            "inputs": {
              "followers": 0,
              "owner_type": "User",
              "is_verified": null,
              "owner_login": "schovest",
              "public_repos": 2,
              "account_age_days": 17
            },
            "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": "0 followers of schovest",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 0,
                      "login": "schovest"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "2 public repos, account ~0 yr old",
                "points": 3.6,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 2
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 0
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "excellent",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "@schovest/pi-tui",
                "@schovest/pi-coding-agent"
              ],
              "ecosystems": "npm",
              "any_deprecated": false,
              "min_days_since_publish": 4
            },
            "components": [
              {
                "key": "published_resolvable",
                "name": "Published & resolvable",
                "detail": "2 package(s) on npm",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "packages_published",
                    "params": {
                      "count": 2,
                      "ecosystems": "npm"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "publish_recency",
                "name": "Publish recency",
                "detail": "latest publish 4 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 4
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "14 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 14
                    }
                  }
                ],
                "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": 74,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "good",
            "name": "Engineering practices",
            "note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: CI-Tests. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "openssf_scorecard_ci_tests"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 80,
            "inputs": {
              "has_ci": true,
              "has_tests": true,
              "has_editorconfig": false,
              "has_linter_config": true,
              "has_precommit_config": false
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": "7 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 7
                    }
                  }
                ],
                "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": "biome.json",
                "points": 16,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "biome.json"
                    }
                  }
                ],
                "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": "moderate",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 65,
            "inputs": {
              "topics": [],
              "has_wiki": false,
              "homepage": null,
              "has_readme": true,
              "has_docs_dir": true,
              "has_description": true
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 30,
                "status": "met",
                "details": [],
                "max_points": 30
              },
              {
                "key": "documentation_directory",
                "name": "Documentation directory",
                "detail": null,
                "points": 25,
                "status": "met",
                "details": [],
                "max_points": 25
              },
              {
                "key": "documentation_homepage_site",
                "name": "Documentation / homepage site",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "repository_description",
                "name": "Repository description",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "topics",
                "name": "Topics",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              },
              {
                "key": "wiki",
                "name": "Wiki",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          }
        ],
        "description": "Are baseline engineering and documentation practices in place?"
      },
      {
        "key": "security",
        "band": "critical",
        "name": "Security",
        "value": 26,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "critical",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): CI-Tests, Packaging. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "ci_tests",
                    "packaging"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 26,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 16,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 2,
              "scorecard_aggregate": 2.6
            },
            "components": [
              {
                "key": "binary_artifacts",
                "name": "Binary-Artifacts",
                "detail": "binaries present in source code",
                "points": 3.8,
                "status": "partial",
                "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 40 contributing companies or organizations",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "dangerous_workflow",
                "name": "Dangerous-Workflow",
                "detail": "no dangerous workflow patterns detected",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "dependency_update_tool",
                "name": "Dependency-Update-Tool",
                "detail": "no update tool detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "fuzzing",
                "name": "Fuzzing",
                "detail": "project is not fuzzed",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "license file detected",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "maintained",
                "name": "Maintained",
                "detail": "project was created within the last 90 days. Please review its contents carefully",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "packaging",
                "name": "Packaging",
                "detail": "packaging workflow not detected",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 5
              },
              {
                "key": "pinned_dependencies",
                "name": "Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 4",
                "points": 2,
                "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 detected",
                "points": 5,
                "status": "met",
                "details": [],
                "max_points": 5
              },
              {
                "key": "signed_releases",
                "name": "Signed-Releases",
                "detail": "Project has not signed or included provenance with any releases.",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "token_permissions",
                "name": "Token-Permissions",
                "detail": "detected GitHub workflow tokens with excessive permissions",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "vulnerabilities",
                "name": "Vulnerabilities",
                "detail": "18 existing vulnerabilities detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              }
            ]
          },
          {
            "key": "high_risk_jurisdiction_exposure",
            "band": "excellent",
            "name": "High-Risk Jurisdiction Exposure",
            "note": "Only high-confidence self-published location evidence affects this multiplier. Ambiguous matches are review-only; country evidence is not proof of nationality, citizenship, legal registration, malicious intent, or sanctions status.",
            "notes": [
              {
                "code": "jurisdiction_evidence_limits",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "meaning": "self-published location evidence; not nationality or citizenship",
              "red_flag": false,
              "exposures": [],
              "policy_countries": [
                "Russia",
                "Iran",
                "North Korea"
              ],
              "review_only_matches": 0,
              "assessed_self_published_locations": 12
            },
            "components": [
              {
                "key": "policy_exposure_multiplier",
                "name": "Policy exposure multiplier",
                "detail": "no confirmed policy-scope location match",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "jurisdiction_no_match",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Are visible security and supply-chain practices strong, with no malicious dependency and no unresolved high-risk jurisdiction exposure?"
      },
      {
        "key": "ai_readiness",
        "band": "good",
        "name": "AI Readiness",
        "value": 70,
        "weight": 0,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "excellent",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 85,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": 0.93,
              "agent_instruction_files": [
                "AGENTS.md"
              ],
              "agent_instruction_max_bytes": 12103
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": "AGENTS.md",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "AGENTS.md"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "machine_readable_docs_llms_txt",
                "name": "Machine-readable docs (llms.txt)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "legible_commit_history",
                "name": "Legible commit history",
                "detail": "93 of 100 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 93,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "moderate",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 58,
            "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": true,
              "typecheck_configs": [
                "tsconfig.json"
              ],
              "agent_commit_share": 0,
              "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": "biome.json",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "biome.json"
                    }
                  }
                ],
                "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": "no agent-authored commits among the last 100",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_agent_authored_commits",
                    "params": {
                      "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 4",
                "points": 4,
                "status": "partial",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "excellent",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 99,
            "inputs": {
              "primary_language": "TypeScript",
              "largest_source_bytes": 221006,
              "source_files_sampled": 520,
              "oversized_source_files": 8
            },
            "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": "8/520 source files over 60KB",
                "points": 54.2,
                "status": "partial",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 520,
                      "oversized": 8
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          },
          {
            "key": "ai_interfaces",
            "band": "at_risk",
            "name": "Machine-readable interfaces",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "example_dirs": [
                "examples"
              ],
              "has_mcp_signal": false,
              "api_schema_files": []
            },
            "components": [
              {
                "key": "api_schema_openapi_graphql_proto",
                "name": "API schema (OpenAPI/GraphQL/proto)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 40
              },
              {
                "key": "mcp_server",
                "name": "MCP server",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 20
              },
              {
                "key": "runnable_examples",
                "name": "Runnable examples",
                "detail": "examples",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "examples"
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          }
        ],
        "description": "How well is the repo equipped to be developed and maintained with AI coding agents? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score."
      }
    ],
    "metrics_version": "1.13.0"
  },
  "warnings": [
    "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository",
    "deps.dev does not index npm:@schovest/pi-tui@0.11.3; advisories assessed against the repository dependency graph instead"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-21T22:42:40.940895Z",
  "schema_version": "0.25.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/s/schovest/pi.svg",
  "full_name": "schovest/pi",
  "license_state": "standard",
  "license_spdx": "MIT"
}

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.25.0 — metodología completa · wiki de métricas.

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