Public record
Software health reportschema 0.25.0 · metrics 1.13.0 · 2026-07-21 22:42 UTC

schovest / pi

Fork Pi

TypeScriptMIT★ 2 stars⑂ 0 forkssince Jul 2026View on GitHub ↗

schovest/pi holds a health index of 54 out of 100, placing it in the Moderate band. It scores highest on Vitality (89/100) and lowest on Security (26/100). It was last updated 4 days ago. A single contributor accounts for most of its recent work.

54
overall / 100
Moderate

Software health index

Metrics are grouped into weighted categories on one standardized 1–100 scale. Overall starts as their weighted mean; when public evidence triggers the High-Risk Jurisdiction Policy, the rating is adjusted and receives an At risk ceiling of 49. AI Readiness sits outside the overall score.

54
Excellent85-100Exemplary; meets essentially all checked criteria
Good70-84Healthy; minor gaps
Moderate50-69Acceptable with notable gaps; review recommended
At risk30-49Significant weaknesses; adoption warrants caution
Critical1-29Severe problems (abandoned, single-maintainer, no hygiene)
VitalityCommunity &AdoptionSustainability &GovernanceEngineeringQualitySecurityAI Readiness

Score profile

Each axis is a category. The shape matters more than the average — a healthy subject fills the whole shape, while a spike-and-crater profile means strength in one dimension is masking risk in another.

Ownership

schovestPersonal account
0 followers2 public repossince Jul 2026

This repository is owned by a personal account. A single-owner project carries more continuity risk than an organization-backed one.

Package ecosystems

RegistryPackageVersionDownloads / moVersionsLast publishTags
npm@schovest/pi-tui0.11.32,127144 days agotuiterminaluitext-editordifferential-renderingtypescriptcli
npm@schovest/pi-coding-agent0.11.31,870144 days agocoding-agentaillmclituiagent

Metrics by category

Vitality

Is the project alive — is code being written and are releases shipping?

89Excellent · 22% of overall
How it's scored
36/36Push recency — last push 4 days ago
33.9/36Commit cadence — 49/52 weeks with commits
18/18Commit volume — 4,868 commits in the last year
0/10OpenSSF Scorecard: Maintained — project was created within the last 90 days. Please review its contents carefully
Inputs used
commits_last_year4,868
human_commit_share1
days_since_last_push4
active_weeks_last_year49
How it's scored
27/27Ships releases — 15 releases published
36/36Release recency — latest release 4 days ago
27/27Release cadence — a release every ~0.8 days
0/10OpenSSF Scorecard: Signed-Releases — Project has not signed or included provenance with any releases.
Inputs used
releases_count15
latest_release_tagv0.11.3
releases_from_tagsno
days_since_latest_release4
mean_days_between_releases0.8

Community & Adoption

Does the project have users, downloads, attention, and a welcoming setup for contributors?

40At risk · 18% of overall
How it's scored
0/60Stars — 2 stars
0/25Forks — 0 forks
0/15Watchers — 0 watchers
Inputs used
forks0
stars2
watchers0
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonbelow_threshold
How it's scored
22.5/22.5README
22.5/22.5License — recognized license (MIT)
18/18CONTRIBUTING guide
0/13.5Code of conduct
0/7.2Issue template
0/6.3PR template
Inputs used
has_readmeyes
has_licenseyes
has_contributingyes
has_issue_templateno
has_code_of_conductno
has_pull_request_templateno
How it's scored
48/80Monthly downloads — 3,997 downloads/month across npm
0/20Registry dependents — not reported by this ecosystem
Inputs used
packages@schovest/pi-tui, @schovest/pi-coding-agent
dependents
ecosystemsnpm
total_downloads
monthly_downloads3,997
Excluded from scoring (no data or not applicable): Registry dependents. Remaining weights renormalized.

Sustainability & Governance

Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?

36At risk · 24% of overall
How it's scored
9/54Bus factor — 1 contributor(s) cover half of all commits
4.7/22.5Commit distribution — top contributor authored 79% of commits
13.5/13.5Contributor breadth — 99 contributors
10/10OpenSSF Scorecard: Contributors — project has 40 contributing companies or organizations
Inputs used
bus_factor1
contributors_sampled99
top_contributor_share0.792
How it's scored
0/46.8Issue resolution — no issues or no data
0/38.3PR acceptance — no decided pull requests or no data
0/15OpenSSF Scorecard: Code-Review — Found 0/30 approved changesets -- score normalized to 0
Inputs used
merged_prs0
open_issues0
closed_issues0
issue_closed_ratio
closed_unmerged_prs0
Excluded from scoring (no data or not applicable): Issue resolution, PR acceptance. Remaining weights renormalized.
How it's scored
10/30Ownership backing — personal (user) account
0/20Verified domain — not applicable to user accounts
0/25Owner reach — 0 followers of schovest
3.6/25Track record — 2 public repos, account ~0 yr old
Inputs used
followers0
owner_typeUser
is_verified
owner_loginschovest
public_repos2
account_age_days17
Excluded from scoring (no data or not applicable): Verified domain. Remaining weights renormalized.
How it's scored
25/25Published & resolvable — 2 package(s) on npm
35/35Publish recency — latest publish 4 days ago
20/20Version history — 14 published versions
20/20Not deprecated — active, not deprecated or yanked
Inputs used
packages@schovest/pi-tui, @schovest/pi-coding-agent
ecosystemsnpm
any_deprecatedno
min_days_since_publish4

Engineering Quality

Are baseline engineering and documentation practices in place?

74Good · 20% of overall
How it's scored
24/24CI workflows — 7 workflow(s)
24/24Tests present
16/16Linter config — biome.json
0/9.6Pre-commit hooks
0/6.4.editorconfig
0/20OpenSSF Scorecard: CI-Tests — no data
Inputs used
has_ciyes
has_testsyes
has_editorconfigno
has_linter_configyes
has_precommit_configno
Excluded from scoring (no data or not applicable): OpenSSF Scorecard: CI-Tests. Remaining weights renormalized.

Documentation

65Moderate
How it's scored
30/30README
25/25Documentation directory
0/15Documentation / homepage site
10/10Repository description
0/10Topics
0/10Wiki
Inputs used
topics
has_wikino
homepage
has_readmeyes
has_docs_diryes
has_descriptionyes

Security

Are visible security and supply-chain practices strong, without unresolved high-risk jurisdiction exposure?

26Critical · 16% of overall
How it's scored
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 — no data
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.5License — license file detected
0/7.5Maintained — project was created within the last 90 days. Please review its contents carefully
0/5Packaging — no data
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
Inputs used
sourceopenssf_scorecard
checks_evaluated16
scorecard_versionv5.5.0
checks_inconclusive2
scorecard_aggregate2.6
Excluded from scoring (no data or not applicable): ci_tests, packaging. Remaining weights renormalized.

AI Readiness

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.

70Good · 0% of overall
How it's scored
45/45Agent instructions — AGENTS.md
0/15Machine-readable docs (llms.txt)
40/40Legible commit history — 93 of 100 human commits state their intent (structured subject or explanatory body)
Inputs used
has_llms_txtno
legible_history_share0.93
agent_instruction_filesAGENTS.md
agent_instruction_max_bytes12,103
How it's scored
0/18One-command bootstrap
22/22Automated tests
11/11Lint / format config — biome.json
11/11Static type checking — tsconfig.json
10/10Reproducible environment — lockfile
0/10Demonstrated agent practice — no agent-authored commits among the last 100
0/8Automated maintenance — no automated dependency updates observed
4/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 4
Inputs used
has_nixno
has_testsyes
lockfilespackage-lock.json
has_dockerfileno
typed_languageyes
bootstrap_files
has_devcontainerno
has_linter_configyes
typecheck_configstsconfig.json
agent_commit_share0
toolchain_manifests
dependency_bot_commit_share0
How it's scored
45/45Type-checkable code — TypeScript (statically typed)
54.2/55Manageable file sizes — 8/520 source files over 60KB
Inputs used
primary_languageTypeScript
largest_source_bytes221,006
source_files_sampled520
oversized_source_files8
How it's scored
0/40API schema (OpenAPI/GraphQL/proto)
0/20MCP server
40/40Runnable examples — examples
Inputs used
example_dirsexamples
has_mcp_signalno
api_schema_files

Key facts

2GitHub stars
99contributors
4,868commits, last 12 months
4days since last push
15releases
1bus factor
0open issues
npmpackage ecosystems

Data collection 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

More detail

OpenSSF Scorecard 2.6 / 10
2.6aggregate

Independent, tool-agnostic security assessment from the open-source OpenSSF Scorecard. Each check rewards a security practice, not a specific vendor's tool. Checks Scorecard could not determine are marked n/a and excluded from the security score (never counted as zero).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/aCI-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/aPackagingpackaging 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
Direct dependencies 19
RegistryPackageVersion constraintManifest
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
All dependencies not collected

The resolved dependency set could not be collected for this report: GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

Raw JSON report machine-readable
{
  "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"
}

Scores are signals, not warranties. They reflect publicly visible practices on GitHub — not a code audit, and not a security guarantee.

Missing data is excluded and weights renormalized, never scored as zero. Methodology is versioned and open: metrics v1.13.0, schema v0.25.0 — full methodology · metrics wiki.

How one result sits in the wider record: aggregate statisticsnpm.