,与编辑时一致。发送给智能体的内容保持不变。\n- 更新(智能体):**内置智能体已刷新。** OpenCode(1.18.3)、Cline(3.0.42)、CodeBuddy Code(2.123.1)、Kimi Code(0.26.0)已更新;Claude Code 的 ACP 适配器固定到 0.58.1。", "is_bot": false, "headline": "# Release version 0.20.4", "author_name": "xintaofei", "author_login": "xintaofei", "committed_at": "2026-07-16T16:34:12Z", "body_truncated": true, "is_coding_agent": false }, { "oid": "d2278d5ec7bb1729a85df4e23657d7576d2fd828", "body": "- Claude Code claude-agent-acp 0.59.0 -> 0.58.1\n- OpenCode 1.17.20 -> 1.18.3\n- Cline 3.0.40 -> 3.0.42\n- CodeBuddy 2.121.2 -> 2.123.1\n- Kimi Code 0.24.1 -> 0.26.0", "is_bot": false, "headline": "chore(acp): update pinned agent versions", "author_name": "xintaofei", "author_login": "xintaofei", "committed_at": "2026-07-16T16:09:39Z", "body_truncated": false, "is_coding_agent": false }, { "oid": "6b2006dfa838e86abb5149cb5f9248fe4c8e9736", "body": "… detail headers\n\n- Relocate the conversation and file tab strips into the desktop title bar; tabs shrink browser-style to share the row without a scrollbar, a draggable divider splits the two groups, and the leftover row stays a window-drag region.\n- Add a fixed conversation detail header above the\n[…]\ng the preview/source toggle, open-in-browser, and maximize actions.\n- Shift the macOS traffic lights down to stay centered in the taller workspace title bar for the local and remote workspace windows.", "is_bot": false, "headline": "feat(workspace): host tabs in the title bar and add conversation/file…", "author_name": "xintaofei", "author_login": "xintaofei", "committed_at": "2026-07-16T13:31:21Z", "body_truncated": true, "is_coding_agent": false }, { "oid": "0582a511e234aab933673a4265f21ba62eda246d", "body": "…ctors\n\nAdd a Session Details tab to the right panel as its first and default tab, showing the active conversation's metadata and live token usage. Move the git branch selector and command launcher out of the workspace title bar into this tab, and keep the panel and its toggle available in chat sessions.", "is_bot": false, "headline": "feat(aux-panel): add Session Details tab with branch and command sele…", "author_name": "xintaofei", "author_login": "xintaofei", "committed_at": "2026-07-16T08:38:14Z", "body_truncated": false, "is_coding_agent": false }, { "oid": "fb3b85b7d627316994cebf718e685b1ea383075e", "body": "…ranscript\n\nCommand and skill badges in the sent-message transcript now display the bare\nname without the leading /·$ prefix, matching the composer's inline badges. The\nwire invocation token (/command, $skill) is unchanged, so agents still receive\nthe literal text.", "is_bot": false, "headline": "fix(chat): drop /·$ prefix from command and skill badges in message t…", "author_name": "xintaofei", "author_login": "xintaofei", "committed_at": "2026-07-16T06:02:33Z", "body_truncated": false, "is_coding_agent": false }, { "oid": "758f50205ad8628c78e69100c15681fcc01050d0", "body": "The marketplace now ships v2 pets whose sheet appends two animation rows\n(1536x2288, 11 rows) onto the base 9-row 1536x1872 layout. codeg assumed a\nfixed 8x9 grid, so v2 pets failed to install outright and rendered squished.\n\n- Install validation accepts any 1536-wide sheet whose height is a whole\n \n[…]\nws are appended.\n- The pet manifest preserves unknown fields (spriteVersionNumber, kind)\n through install and edit instead of dropping them.\n- The spritesheet spec hint is updated across all locales.", "is_bot": false, "headline": "fix(pet): support variable-height v2 marketplace spritesheets", "author_name": "xintaofei", "author_login": "xintaofei", "committed_at": "2026-07-16T05:58:00Z", "body_truncated": true, "is_coding_agent": false }, { "oid": "7c48df5ac4aa56912436983447af5b1ba061f3de", "body": "- feat(chat-channel): **Telegram Topic mode.** Run multiple sessions inside one Telegram forum supergroup, each bound to its own topic. `/task \u003cdescription>` opens a new topic and session, `/resume \u003cid>` binds an existing one, and plain text follows up in the current topic. Requires a forum supergro\n[…]\nworkspace 配置,** 容器与自托管部署可正常构建。感谢 @AnotiaWang(#322)。\n- 更新(智能体):**内置智能体已刷新** —— Claude Code(0.59.0)、OpenCode(1.17.20)、OpenClaw(2026.7.1)、Cline(3.0.40)、CodeBuddy(2.121.2)、Kimi Code(0.24.1)、Grok(0.2.101)。", "is_bot": false, "headline": "# Release version 0.20.3", "author_name": "xintaofei", "author_login": "xintaofei", "committed_at": "2026-07-14T16:43:10Z", "body_truncated": true, "is_coding_agent": false }, { "oid": "6c4441f76bd6ec5ec8c1290f73d14740530b4fc8", "body": null, "is_bot": false, "headline": "Merge remote-tracking branch 'origin/main'", "author_name": "xintaofei", "author_login": "xintaofei", "committed_at": "2026-07-14T16:26:24Z", "body_truncated": false, "is_coding_agent": false }, { "oid": "2832fd1ed661be3b98c821230a9b7f4ba247228d", "body": "- Claude Code claude-agent-acp 0.58.1 -> 0.59.0\n- OpenCode 1.17.18 -> 1.17.20\n- OpenClaw 2026.6.11 -> 2026.7.1 (raise Node floor to 22.22.3)\n- Cline 3.0.39 -> 3.0.40\n- CodeBuddy 2.118.2 -> 2.121.2\n- Kimi Code 0.23.5 -> 0.24.1\n- Grok 0.2.94 -> 0.2.101", "is_bot": false, "headline": "chore(acp): update pinned agent versions", "author_name": "xintaofei", "author_login": "xintaofei", "committed_at": "2026-07-14T16:26:18Z", "body_truncated": false, "is_coding_agent": false }, { "oid": "851667f1b166441f7bf0838298b6d11006ed7472", "body": "Codex agents can now define custom models and curate the model list from a\nstructured editor in the agent settings and the model-provider dialogs, instead\nof a raw JSON field. A custom entry clones an official model as its base and\noverrides only the fields that differ; enum-valued fields (reasoning\n[…]\nodex falls back to its own catalog, and a\npre-existing hand-written catalog is imported into the editor on load. A notice\nexplains the whole-table-replace behavior whenever a customization is present.", "is_bot": false, "headline": "feat(codex): custom model catalog sourced from the launched codex", "author_name": "xintaofei", "author_login": "xintaofei", "committed_at": "2026-07-14T15:33:34Z", "body_truncated": true, "is_coding_agent": false }, { "oid": "12e2b158e680d734a011eeb200ec19694a6b5cdf", "body": "…d turns\n\nclaude-agent-acp 0.59.0 keeps a turn's prompt open while a spawned async\nsub-agent runs, streaming its completion live as the tail of that same turn\n(#870). Reconcile the transcript watcher with the live view so held-turn\ncontent no longer double-renders, the launch card fills in its resul\n[…]\ndicator arms only for settlements whose reply arrives\n out of turn, so an already-visible held reply no longer strands it.\n- A turn that ends abnormally releases its tracked background tasks at once.", "is_bot": false, "headline": "fix(acp): correct async sub-agent background task rendering under hel…", "author_name": "xintaofei", "author_login": "xintaofei", "committed_at": "2026-07-14T15:26:31Z", "body_truncated": true, "is_coding_agent": false }, { "oid": "6e61082954840c5a2c3a378c21d6ca83fc7edc50", "body": "…s all paths\n\nCapture the persisted-history boundary at send time (per batch) instead of reading detail at backfill: a mid-stream detail refetch or an agent's persisted partial reply can no longer shift it. Both the owner send and a co-controller's echoed prompt capture the boundary, on every dedup \n[…]\nparse tail, head-aligning when the parse lags so a later reply never inherits an earlier one's usage/duration, and retry the backfill on the latest reply's coverage rather than the last emitted patch.", "is_bot": false, "headline": "fix(chat): bound per-turn stats backfill to the current session acros…", "author_name": "xintaofei", "author_login": "xintaofei", "committed_at": "2026-07-13T18:18:05Z", "body_truncated": true, "is_coding_agent": false }, { "oid": "39322512229caea518ac120010a344864b28f9bb", "body": "The post-turn metadata backfill aligned this session's local turns against the full reparse (persisted history + new turns) and its offset roll-up folded the leading parsed turns' duration and usage into the first local turn. After resuming a conversation the offset equals the history length, so the\n[…]\nt the persisted-history boundary so only this session's slice of the parse is folded, and emit no patch when the reparse has not yet caught up to the new reply so the retry applies the complete parse.", "is_bot": false, "headline": "fix(chat): correct first-reply stats after resuming a conversation", "author_name": "xintaofei", "author_login": "xintaofei", "committed_at": "2026-07-13T16:57:35Z", "body_truncated": true, "is_coding_agent": false }, { "oid": "bd73b2061aedc8d3532b37e6b879fc9796434857", "body": null, "is_bot": false, "headline": "Merge remote-tracking branch 'origin/main'", "author_name": "xintaofei", "author_login": "xintaofei", "committed_at": "2026-07-13T16:18:12Z", "body_truncated": false, "is_coding_agent": false }, { "oid": "38ed09bc50d9a31bdffd20c88f2f841979595885", "body": "…fort\n\nPermission mode now uses grok's real `--permission-mode` enum\n(default/acceptEdits/auto/dontAsk/bypassPermissions/plan) instead of the\ncodeg-invented ask/always-approve markers grok rejects. Legacy values are\nmigrated on read, the selected mode is handed to the ACP launch as\n`--permission-mod\n[…]\nincludes the model's default even\nwhen it sits outside the switchable list (grok-4.5's Max/xhigh), with a\ndescription on every option.\n\nThe custom Model ID field now shows grok-4.5 as its placeholder.", "is_bot": false, "headline": "feat(grok): real permission-mode enum and model-reactive reasoning ef…", "author_name": "xintaofei", "author_login": "xintaofei", "committed_at": "2026-07-13T16:16:48Z", "body_truncated": true, "is_coding_agent": false }, { "oid": "72954c36636a12aaf2f5d290dcd83fbd3396bac9", "body": "Exercise the real create, save, duplicate, import, and delete paths against a temporary HOME so the central store and agent links resolve inside a throwaway tree, covering the destructive remove_dir_all delete and the unlink-before-delete ordering that were previously untested, and assert that path-traversal ids are rejected and cannot escape the store.\n\nUnix-only, since dirs::home_dir ignores $HOME on Windows. Enables the temp-env async_closure feature used by the async test helper.", "is_bot": false, "headline": "test(skills): cover custom skill filesystem mutations", "author_name": "xintaofei", "author_login": "xintaofei", "committed_at": "2026-07-13T15:44:43Z", "body_truncated": false, "is_coding_agent": false }, { "oid": "807b62245cc98385b64dc36b7a735f18519bbbfd", "body": "…ndings\n\nThe bot token is embedded in every Telegram API URL, and reqwest's error Display appends that URL, so a transport error exposed the token both in the logs and in the chat message returned on a failed topic create or edit. Scrub the token from every error string before it is surfaced.\n\nTopic\n[…]\ntopic missed its binding and a second /task spawned a duplicate agent. Resolve an @username to its numeric chat id, cached, and use it for both the created topic's binding target and inbound matching.", "is_bot": false, "headline": "fix(chat-channel): redact Telegram bot token and resolve @username bi…", "author_name": "xintaofei", "author_login": "xintaofei", "committed_at": "2026-07-13T15:44:28Z", "body_truncated": true, "is_coding_agent": false }, { "oid": "d2da2da7d8a842daf38398fcba72530fa47b7a91", "body": "[codex] Recover ACP runtime errors from snapshots", "is_bot": false, "headline": "Merge pull request #314 from ijry/codex/snapshot-last-error-rebased", "author_name": "XinTaoFei", "author_login": "xintaofei", "committed_at": "2026-07-13T11:33:27Z", "body_truncated": false, "is_coding_agent": false }, { "oid": "dca1328e29e8435419a6d774da7065b507705583", "body": "The pi and kimi skill_storage_spec tests read the process-global $HOME while computing both the spec and the expected paths; a concurrent temp_env HOME-mutating test could flip $HOME between the two reads and fail the assertion. Wrap both in temp_env::with_vars to pin $HOME (and clear the PI_CODING_\n[…]\n overrides) so they serialize with those tests and read one consistent home. Expected paths stay derived from the production helpers, keeping them correct on Windows where dirs::home_dir ignores HOME.", "is_bot": false, "headline": "test(acp): pin HOME in skill-storage spec tests to remove isolation race", "author_name": "xintaofei", "author_login": "xintaofei", "committed_at": "2026-07-13T11:20:34Z", "body_truncated": true, "is_coding_agent": false }, { "oid": "43c6eefa73ff172fe96e980b5789fb4e9e77a47d", "body": null, "is_bot": false, "headline": "Merge remote-tracking branch 'origin/main'", "author_name": "xintaofei", "author_login": "xintaofei", "committed_at": "2026-07-13T10:58:56Z", "body_truncated": false, "is_coding_agent": false }, { "oid": "7f936656b823ecb647fbd5e20ac8aaf202318f74", "body": "fix(editor): preserve Windows IME composition", "is_bot": false, "headline": "Merge pull request #332 from youxikexue/fix/windows-ime-composition", "author_name": "XinTaoFei", "author_login": "xintaofei", "committed_at": "2026-07-13T10:52:18Z", "body_truncated": false, "is_coding_agent": false }, { "oid": "3698a8534e5d37bb76c147c3bbc5bb1d840ad4fa", "body": "feat(chat-channel): support Telegram forum topic mode", "is_bot": false, "headline": "Merge pull request #322 from AnotiaWang/feat/telegram-topic-mode", "author_name": "XinTaoFei", "author_login": "xintaofei", "committed_at": "2026-07-13T10:51:54Z", "body_truncated": false, "is_coding_agent": false }, { "oid": "c1ccd8d0110cae1ccb00f195a35e1f63506abdbd", "body": "fix: compute completed session runtime from timestamps", "is_bot": false, "headline": "Merge pull request #311 from cnYui/codex/fix-agent-runtime-duration", "author_name": "XinTaoFei", "author_login": "xintaofei", "committed_at": "2026-07-13T10:50:46Z", "body_truncated": false, "is_coding_agent": false }, { "oid": "22eabe835137b5037ad3b5517de540b6a162f9a2", "body": "Let users author their own skills in the shared central store and enable\nthem across any agent from the skill matrix, so a skill is written once\nand reused everywhere instead of maintained per agent.\n\n- Create, edit, duplicate, and delete skills backed by ~/.codeg/skills\n- Import from a local folder\n[…]\n skills at once from an existing agent's global skills\n- Recognize custom skills by exclusion from the built-in expert, science,\n and office packs, so folders dropped into the store appear on refresh", "is_bot": false, "headline": "feat(skills): add custom skills tab to skill packs settings", "author_name": "xintaofei", "author_login": "xintaofei", "committed_at": "2026-07-13T10:49:23Z", "body_truncated": true, "is_coding_agent": false }, { "oid": "a394661b1b95160593019382c86772b28002d03f", "body": "…rection\n\nLock in HYDRATE_FROM_SNAPSHOT error behavior: a fresh snapshot recovers a\nlast_error the client missed live, and a stale snapshot must not resurrect an\nerror the current turn already cleared. The stale case fails against the\npre-fix reducer. Fixtures also set backgroundOutstanding for completeness.", "is_bot": false, "headline": "test(acp): cover snapshot last_error fresh recovery + stale non-resur…", "author_name": "xintaofei", "author_login": "xintaofei", "committed_at": "2026-07-13T10:17:29Z", "body_truncated": false, "is_coding_agent": false }, { "oid": "62d6cd1018377d4dd25dd3c65a41d89d5341e223", "body": "HYDRATE_FROM_SNAPSHOT's stale (event_seq \u003c= lastAppliedSeq) path folded a\nsnapshot's lastError back via `current.error ?? patch.lastError`. Since\n`error` is a current-state field cleared on a new prompt (STATUS_CHANGED ->\nprompting), a late stale snapshot generated between an error and the next\nprom\n[…]\ner until the following prompt. Recover the snapshot error only on\nthe fresh path, matching how status / configStale / backgroundOutstanding\nare already treated (current-state fields, fresh-path only).", "is_bot": false, "headline": "fix(acp): don't recover snapshot error on the stale race-guard path", "author_name": "xintaofei", "author_login": "xintaofei", "committed_at": "2026-07-13T09:50:17Z", "body_truncated": true, "is_coding_agent": false }, { "oid": "c60aae545226a88d0a47ac8acc2067f13a8bf50a", "body": null, "is_bot": false, "headline": "fix: recover ACP errors from session snapshots", "author_name": "jry", "author_login": null, "committed_at": "2026-07-13T09:48:14Z", "body_truncated": false, "is_coding_agent": false } ], "releases_count": 100, "commits_last_year": 1861, "latest_release_at": "2026-07-21T16:46:00Z", "latest_release_tag": "v0.21.4", "releases_from_tags": false, "days_since_last_push": 0, "active_weeks_last_year": 20, "days_since_latest_release": 0, "mean_days_between_releases": 1.2 }, "community": { "has_readme": true, "has_license": true, "has_description": true, "has_contributing": false, "health_percentage": 42, "has_issue_template": false, "has_code_of_conduct": false, "has_pull_request_template": false }, "ecosystem": { "packages": [] }, "popularity": { "forks": 276, "stars": 2302, "watchers": 9, "fork_history": { "days": [ { "date": "2026-03-07", "count": 5 }, { "date": "2026-03-08", "count": 5 }, { "date": "2026-03-09", "count": 3 }, { "date": "2026-03-11", "count": 2 }, { "date": "2026-03-12", "count": 1 }, { "date": "2026-03-13", "count": 2 }, { "date": "2026-03-14", "count": 1 }, { "date": "2026-03-16", "count": 2 }, { "date": "2026-03-18", "count": 1 }, { "date": "2026-03-19", "count": 3 }, { "date": "2026-03-20", "count": 2 }, { "date": "2026-03-21", "count": 2 }, { "date": "2026-03-22", "count": 1 }, { "date": "2026-03-23", "count": 4 }, { "date": "2026-03-24", "count": 1 }, { "date": "2026-03-27", "count": 2 }, { "date": "2026-03-28", "count": 1 }, { "date": "2026-03-31", "count": 1 }, { "date": "2026-04-01", "count": 1 }, { "date": "2026-04-02", "count": 4 }, { "date": "2026-04-04", "count": 1 }, { "date": "2026-04-05", "count": 2 }, { "date": "2026-04-08", "count": 2 }, { "date": "2026-04-10", "count": 3 }, { "date": "2026-04-11", "count": 2 }, { "date": "2026-04-12", "count": 1 }, { "date": "2026-04-13", "count": 4 }, { "date": "2026-04-14", "count": 3 }, { "date": "2026-04-15", "count": 2 }, { "date": "2026-04-17", "count": 3 }, { "date": "2026-04-18", "count": 2 }, { "date": "2026-04-19", "count": 4 }, { "date": "2026-04-20", "count": 1 }, { "date": "2026-04-22", "count": 3 }, { "date": "2026-04-23", "count": 3 }, { "date": "2026-04-24", "count": 3 }, { "date": "2026-04-25", "count": 4 }, { "date": "2026-04-26", "count": 4 }, { "date": "2026-04-27", "count": 1 }, { "date": "2026-04-29", "count": 2 }, { "date": "2026-04-30", "count": 2 }, { "date": "2026-05-02", "count": 1 }, { "date": "2026-05-04", "count": 1 }, { "date": "2026-05-06", "count": 3 }, { "date": "2026-05-07", "count": 3 }, { "date": "2026-05-08", "count": 1 }, { "date": "2026-05-09", "count": 4 }, { "date": "2026-05-10", "count": 3 }, { "date": "2026-05-11", "count": 5 }, { "date": "2026-05-12", "count": 3 }, { "date": "2026-05-13", "count": 1 }, { "date": "2026-05-14", "count": 1 }, { "date": "2026-05-15", "count": 1 }, { "date": "2026-05-16", "count": 1 }, { "date": "2026-05-20", "count": 3 }, { "date": "2026-05-21", "count": 1 }, { "date": "2026-05-22", "count": 1 }, { "date": "2026-05-23", "count": 3 }, { "date": "2026-05-24", "count": 1 }, { "date": "2026-05-25", "count": 4 }, { "date": "2026-05-26", "count": 5 }, { "date": "2026-05-27", "count": 1 }, { "date": "2026-05-28", "count": 4 }, { "date": "2026-05-29", "count": 1 }, { "date": "2026-05-30", "count": 1 }, { "date": "2026-05-31", "count": 3 }, { "date": "2026-06-01", "count": 1 }, { "date": "2026-06-02", "count": 1 }, { "date": "2026-06-04", "count": 3 }, { "date": "2026-06-05", "count": 4 }, { "date": "2026-06-06", "count": 1 }, { "date": "2026-06-07", "count": 3 }, { "date": "2026-06-08", "count": 1 }, { "date": "2026-06-09", "count": 2 }, { "date": "2026-06-10", "count": 2 }, { "date": "2026-06-11", "count": 4 }, { "date": "2026-06-12", "count": 3 }, { "date": "2026-06-13", "count": 2 }, { "date": "2026-06-14", "count": 6 }, { "date": "2026-06-15", "count": 3 }, { "date": "2026-06-16", "count": 3 }, { "date": "2026-06-17", "count": 1 }, { "date": "2026-06-18", "count": 2 }, { "date": "2026-06-22", "count": 2 }, { "date": "2026-06-23", "count": 5 }, { "date": "2026-06-25", "count": 3 }, { "date": "2026-06-26", "count": 5 }, { "date": "2026-06-27", "count": 4 }, { "date": "2026-06-28", "count": 2 }, { "date": "2026-06-29", "count": 3 }, { "date": "2026-06-30", "count": 1 }, { "date": "2026-07-01", "count": 2 }, { "date": "2026-07-02", "count": 1 }, { "date": "2026-07-03", "count": 1 }, { "date": "2026-07-06", "count": 1 }, { "date": "2026-07-07", "count": 2 }, { "date": "2026-07-08", "count": 2 }, { "date": "2026-07-09", "count": 3 }, { "date": "2026-07-10", "count": 3 }, { "date": "2026-07-11", "count": 2 }, { "date": "2026-07-12", "count": 4 }, { "date": "2026-07-13", "count": 4 }, { "date": "2026-07-14", "count": 2 }, { "date": "2026-07-15", "count": 3 }, { "date": "2026-07-16", "count": 5 }, { "date": "2026-07-17", "count": 5 }, { "date": "2026-07-18", "count": 4 }, { "date": "2026-07-19", "count": 2 }, { "date": "2026-07-20", "count": 2 }, { "date": "2026-07-21", "count": 3 }, { "date": "2026-07-22", "count": 5 } ], "complete": true, "collected": 275, "total_forks": 276 }, "star_history": { "days": [ { "date": "2026-05-26", "count": 12 }, { "date": "2026-05-27", "count": 15 }, { "date": "2026-05-28", "count": 19 }, { "date": "2026-05-29", "count": 14 }, { "date": "2026-05-30", "count": 21 }, { "date": "2026-05-31", "count": 29 }, { "date": "2026-06-01", "count": 25 }, { "date": "2026-06-02", "count": 8 }, { "date": "2026-06-03", "count": 5 }, { "date": "2026-06-04", "count": 16 }, { "date": "2026-06-05", "count": 21 }, { "date": "2026-06-06", "count": 9 }, { "date": "2026-06-07", "count": 26 }, { "date": "2026-06-08", "count": 18 }, { "date": "2026-06-09", "count": 18 }, { "date": "2026-06-10", "count": 14 }, { "date": "2026-06-11", "count": 14 }, { "date": "2026-06-12", "count": 20 }, { "date": "2026-06-13", "count": 5 }, { "date": "2026-06-14", "count": 20 }, { "date": "2026-06-15", "count": 14 }, { "date": "2026-06-16", "count": 7 }, { "date": "2026-06-17", "count": 12 }, { "date": "2026-06-18", "count": 8 }, { "date": "2026-06-19", "count": 5 }, { "date": "2026-06-20", "count": 7 }, { "date": "2026-06-21", "count": 5 }, { "date": "2026-06-22", "count": 22 }, { "date": "2026-06-23", "count": 25 }, { "date": "2026-06-24", "count": 15 }, { "date": "2026-06-25", "count": 12 }, { "date": "2026-06-26", "count": 29 }, { "date": "2026-06-27", "count": 22 }, { "date": "2026-06-28", "count": 15 }, { "date": "2026-06-29", "count": 20 }, { "date": "2026-06-30", "count": 19 }, { "date": "2026-07-01", "count": 19 }, { "date": "2026-07-02", "count": 18 }, { "date": "2026-07-03", "count": 11 }, { "date": "2026-07-04", "count": 9 }, { "date": "2026-07-05", "count": 7 }, { "date": "2026-07-06", "count": 14 }, { "date": "2026-07-07", "count": 10 }, { "date": "2026-07-08", "count": 10 }, { "date": "2026-07-09", "count": 14 }, { "date": "2026-07-10", "count": 11 }, { "date": "2026-07-11", "count": 24 }, { "date": "2026-07-12", "count": 23 }, { "date": "2026-07-13", "count": 28 }, { "date": "2026-07-14", "count": 17 }, { "date": "2026-07-15", "count": 17 }, { "date": "2026-07-16", "count": 34 }, { "date": "2026-07-17", "count": 45 }, { "date": "2026-07-18", "count": 28 }, { "date": "2026-07-19", "count": 12 }, { "date": "2026-07-20", "count": 22 }, { "date": "2026-07-21", "count": 46 }, { "date": "2026-07-22", "count": 15 } ], "complete": false, "collected": 1000, "total_stars": 2302 }, "open_issues_and_prs": 112 }, "ai_readiness": { "has_nix": false, "example_dirs": [ "examples" ], "has_llms_txt": false, "has_dockerfile": true, "has_mcp_signal": false, "bootstrap_files": [], "api_schema_files": [], "has_devcontainer": false, "typecheck_configs": [ "tsconfig.json" ], "toolchain_manifests": [ "src-tauri/Cargo.toml", "src-tauri/vendor/sacp-tokio/Cargo.toml" ], "largest_source_bytes": 476107, "source_files_sampled": 1041, "oversized_source_files": 44, "agent_instruction_files": [ "AGENTS.md", "CLAUDE.md" ], "agent_instruction_max_bytes": 5506 }, "dependencies": { "manifests": [ "package.json", "src-tauri/Cargo.toml" ], "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": [ "crates", "npm" ], "dependencies": [ { "name": "@base-ui/react", "manifest": "package.json", "ecosystem": "npm", "version_constraint": "^1.1.0" }, { "name": "@fontsource-variable/fira-code", "manifest": "package.json", "ecosystem": "npm", "version_constraint": "^5.2.7" }, { "name": "@fontsource-variable/geist", "manifest": "package.json", "ecosystem": "npm", "version_constraint": "^5.2.9" }, { "name": "@fontsource-variable/geist-mono", "manifest": "package.json", "ecosystem": "npm", "version_constraint": "^5.2.8" }, { "name": "@fontsource-variable/inter", "manifest": "package.json", "ecosystem": "npm", "version_constraint": "^5.2.8" }, { "name": "@fontsource-variable/jetbrains-mono", "manifest": "package.json", "ecosystem": "npm", "version_constraint": "^5.2.8" }, { "name": "@monaco-editor/react", "manifest": "package.json", "ecosystem": "npm", "version_constraint": "^4.7.0" }, { "name": "@radix-ui/react-use-controllable-state", "manifest": "package.json", "ecosystem": "npm", "version_constraint": "^1.2.2" }, { "name": "@streamdown/cjk", "manifest": "package.json", "ecosystem": "npm", "version_constraint": "^1.0.2" }, { "name": "@streamdown/code", "manifest": "package.json", "ecosystem": "npm", "version_constraint": "^1.0.2" }, { "name": "@streamdown/math", "manifest": "package.json", "ecosystem": "npm", "version_constraint": "^1.0.2" }, { "name": "@streamdown/mermaid", "manifest": "package.json", "ecosystem": "npm", "version_constraint": "^1.0.2" }, { "name": "@tauri-apps/api", "manifest": "package.json", "ecosystem": "npm", "version_constraint": "^2" }, { "name": "@tauri-apps/plugin-dialog", "manifest": "package.json", "ecosystem": "npm", "version_constraint": "^2.6.0" }, { "name": "@tauri-apps/plugin-opener", "manifest": "package.json", "ecosystem": "npm", "version_constraint": "^2" }, { "name": "@tauri-apps/plugin-process", "manifest": "package.json", "ecosystem": "npm", "version_constraint": "^2.3.1" }, { "name": "@tauri-apps/plugin-updater", "manifest": "package.json", "ecosystem": "npm", "version_constraint": "^2.10.0" }, { "name": "@tauri-apps/plugin-window-state", "manifest": "package.json", "ecosystem": "npm", "version_constraint": "~2.4.1" }, { "name": "@tiptap/core", "manifest": "package.json", "ecosystem": "npm", "version_constraint": "3.26.0" }, { "name": "@tiptap/extension-placeholder", "manifest": "package.json", "ecosystem": "npm", "version_constraint": "3.26.0" }, { "name": "@tiptap/markdown", "manifest": "package.json", "ecosystem": "npm", "version_constraint": "3.26.0" }, { "name": "@tiptap/pm", "manifest": "package.json", "ecosystem": "npm", "version_constraint": "3.26.0" }, { "name": "@tiptap/react", "manifest": "package.json", "ecosystem": "npm", "version_constraint": "3.26.0" }, { "name": "@tiptap/starter-kit", "manifest": "package.json", "ecosystem": "npm", "version_constraint": "3.26.0" }, { "name": "@tiptap/suggestion", "manifest": "package.json", "ecosystem": "npm", "version_constraint": "3.26.0" }, { "name": "@xterm/addon-fit", "manifest": "package.json", "ecosystem": "npm", "version_constraint": "^0.11.0" }, { "name": "@xterm/addon-ligatures", "manifest": "package.json", "ecosystem": "npm", "version_constraint": "^0.10.0" }, { "name": "@xterm/addon-web-links", "manifest": "package.json", "ecosystem": "npm", "version_constraint": "^0.12.0" }, { "name": "@xterm/xterm", "manifest": "package.json", "ecosystem": "npm", "version_constraint": "^6.0.0" }, { "name": "ai", "manifest": "package.json", "ecosystem": "npm", "version_constraint": "^6.0.78" }, { "name": "ansi-to-react", "manifest": "package.json", "ecosystem": "npm", "version_constraint": "^6.2.6" }, { "name": "class-variance-authority", "manifest": "package.json", "ecosystem": "npm", "version_constraint": "^0.7.1" }, { "name": "clsx", "manifest": "package.json", "ecosystem": "npm", "version_constraint": "^2.1.1" }, { "name": "cmdk", "manifest": "package.json", "ecosystem": "npm", "version_constraint": "^1.1.1" }, { "name": "date-fns", "manifest": "package.json", "ecosystem": "npm", "version_constraint": "^4.1.0" }, { "name": "html-to-image", "manifest": "package.json", "ecosystem": "npm", "version_constraint": "^1.11.13" }, { "name": "ignore", "manifest": "package.json", "ecosystem": "npm", "version_constraint": "^7.0.5" }, { "name": "katex", "manifest": "package.json", "ecosystem": "npm", "version_constraint": "^0.16.45" }, { "name": "lucide-react", "manifest": "package.json", "ecosystem": "npm", "version_constraint": "^0.563.0" }, { "name": "mdast-util-from-markdown", "manifest": "package.json", "ecosystem": "npm", "version_constraint": "^2.0.2" }, { "name": "monaco-editor", "manifest": "package.json", "ecosystem": "npm", "version_constraint": "^0.55.1" }, { "name": "motion", "manifest": "package.json", "ecosystem": "npm", "version_constraint": "^12.34.0" }, { "name": "next", "manifest": "package.json", "ecosystem": "npm", "version_constraint": "^16" }, { "name": "next-intl", "manifest": "package.json", "ecosystem": "npm", "version_constraint": "^4.8.3" }, { "name": "next-themes", "manifest": "package.json", "ecosystem": "npm", "version_constraint": "^0.4.6" }, { "name": "overlayscrollbars", "manifest": "package.json", "ecosystem": "npm", "version_constraint": "^2.15.1" }, { "name": "overlayscrollbars-react", "manifest": "package.json", "ecosystem": "npm", "version_constraint": "^0.5.6" }, { "name": "postcss", "manifest": "package.json", "ecosystem": "npm", "version_constraint": "^8.5.6" }, { "name": "qrcode.react", "manifest": "package.json", "ecosystem": "npm", "version_constraint": "^4.2.0" }, { "name": "radix-ui", "manifest": "package.json", "ecosystem": "npm", "version_constraint": "^1.4.3" }, { "name": "react", "manifest": "package.json", "ecosystem": "npm", "version_constraint": "^19.1.0" }, { "name": "react-dom", "manifest": "package.json", "ecosystem": "npm", "version_constraint": "^19.1.0" }, { "name": "react-markdown", "manifest": "package.json", "ecosystem": "npm", "version_constraint": "^10.1.0" }, { "name": "react-resizable-panels", "manifest": "package.json", "ecosystem": "npm", "version_constraint": "^2.1.9" }, { "name": "remark-breaks", "manifest": "package.json", "ecosystem": "npm", "version_constraint": "^4.0.0" }, { "name": "remark-gfm", "manifest": "package.json", "ecosystem": "npm", "version_constraint": "^4.0.1" }, { "name": "shadcn", "manifest": "package.json", "ecosystem": "npm", "version_constraint": "^3.8.4" }, { "name": "shiki", "manifest": "package.json", "ecosystem": "npm", "version_constraint": "^3.22.0" }, { "name": "sonner", "manifest": "package.json", "ecosystem": "npm", "version_constraint": "^2.0.7" }, { "name": "streamdown", "manifest": "package.json", "ecosystem": "npm", "version_constraint": "^2.2.0" }, { "name": "tailwind-merge", "manifest": "package.json", "ecosystem": "npm", "version_constraint": "^3.4.0" }, { "name": "tailwindcss", "manifest": "package.json", "ecosystem": "npm", "version_constraint": "^4.1.18" }, { "name": "use-stick-to-bottom", "manifest": "package.json", "ecosystem": "npm", "version_constraint": "^1.1.3" }, { "name": "virtua", "manifest": "package.json", "ecosystem": "npm", "version_constraint": "^0.48.8" }, { "name": "zustand", "manifest": "package.json", "ecosystem": "npm", "version_constraint": "^5.0.14" }, { "name": "tauri", "manifest": "src-tauri/Cargo.toml", "ecosystem": "crates", "version_constraint": "2" }, { "name": "tauri-plugin-opener", "manifest": "src-tauri/Cargo.toml", "ecosystem": "crates", "version_constraint": "2" }, { "name": "tauri-plugin-dialog", "manifest": "src-tauri/Cargo.toml", "ecosystem": "crates", "version_constraint": "2" }, { "name": "async-trait", "manifest": "src-tauri/Cargo.toml", "ecosystem": "crates", "version_constraint": "0.1" }, { "name": "serde", "manifest": "src-tauri/Cargo.toml", "ecosystem": "crates", "version_constraint": "1" }, { "name": "serde_json", "manifest": "src-tauri/Cargo.toml", "ecosystem": "crates", "version_constraint": "1" }, { "name": "chrono", "manifest": "src-tauri/Cargo.toml", "ecosystem": "crates", "version_constraint": "0.4" }, { "name": "chrono-tz", "manifest": "src-tauri/Cargo.toml", "ecosystem": "crates", "version_constraint": "0.10" }, { "name": "cron", "manifest": "src-tauri/Cargo.toml", "ecosystem": "crates", "version_constraint": "0.12" }, { "name": "thiserror", "manifest": "src-tauri/Cargo.toml", "ecosystem": "crates", "version_constraint": "2" }, { "name": "dirs", "manifest": "src-tauri/Cargo.toml", "ecosystem": "crates", "version_constraint": "6" }, { "name": "if-addrs", "manifest": "src-tauri/Cargo.toml", "ecosystem": "crates", "version_constraint": "0.13" }, { "name": "walkdir", "manifest": "src-tauri/Cargo.toml", "ecosystem": "crates", "version_constraint": "2" }, { "name": "ignore", "manifest": "src-tauri/Cargo.toml", "ecosystem": "crates", "version_constraint": "0.4" }, { "name": "sacp", "manifest": "src-tauri/Cargo.toml", "ecosystem": "crates", "version_constraint": "11.0.0" }, { "name": "sacp-tokio", "manifest": "src-tauri/Cargo.toml", "ecosystem": "crates", "version_constraint": "11.0.0" }, { "name": "tokio", "manifest": "src-tauri/Cargo.toml", "ecosystem": "crates", "version_constraint": "1" }, { "name": "uuid", "manifest": "src-tauri/Cargo.toml", "ecosystem": "crates", "version_constraint": "1" }, { "name": "futures", "manifest": "src-tauri/Cargo.toml", "ecosystem": "crates", "version_constraint": "0.3" }, { "name": "futures-lite", "manifest": "src-tauri/Cargo.toml", "ecosystem": "crates", "version_constraint": "2" }, { "name": "reqwest", "manifest": "src-tauri/Cargo.toml", "ecosystem": "crates", "version_constraint": "0.12" }, { "name": "flate2", "manifest": "src-tauri/Cargo.toml", "ecosystem": "crates", "version_constraint": "1" }, { "name": "bzip2", "manifest": "src-tauri/Cargo.toml", "ecosystem": "crates", "version_constraint": "0.5" }, { "name": "tar", "manifest": "src-tauri/Cargo.toml", "ecosystem": "crates", "version_constraint": "0.4" }, { "name": "zip", "manifest": "src-tauri/Cargo.toml", "ecosystem": "crates", "version_constraint": "2" }, { "name": "regex", "manifest": "src-tauri/Cargo.toml", "ecosystem": "crates", "version_constraint": "1" }, { "name": "portable-pty", "manifest": "src-tauri/Cargo.toml", "ecosystem": "crates", "version_constraint": "0.8" }, { "name": "urlencoding", "manifest": "src-tauri/Cargo.toml", "ecosystem": "crates", "version_constraint": "2" }, { "name": "fix-path-env", "manifest": "src-tauri/Cargo.toml", "ecosystem": "crates", "version_constraint": "0.0.0" }, { "name": "sea-orm", "manifest": "src-tauri/Cargo.toml", "ecosystem": "crates", "version_constraint": "1.1" }, { "name": "sea-orm-migration", "manifest": "src-tauri/Cargo.toml", "ecosystem": "crates", "version_constraint": "1.1" }, { "name": "rusqlite", "manifest": "src-tauri/Cargo.toml", "ecosystem": "crates", "version_constraint": "0.32" }, { "name": "toml", "manifest": "src-tauri/Cargo.toml", "ecosystem": "crates", "version_constraint": "0.8" }, { "name": "toml_edit", "manifest": "src-tauri/Cargo.toml", "ecosystem": "crates", "version_constraint": "0.19" }, { "name": "serde_yaml", "manifest": "src-tauri/Cargo.toml", "ecosystem": "crates", "version_constraint": "0.9" }, { "name": "notify", "manifest": "src-tauri/Cargo.toml", "ecosystem": "crates", "version_constraint": "6" }, { "name": "base64", "manifest": "src-tauri/Cargo.toml", "ecosystem": "crates", "version_constraint": "0.22" }, { "name": "agent-client-protocol-schema", "manifest": "src-tauri/Cargo.toml", "ecosystem": "crates", "version_constraint": "0.11" }, { "name": "kill_tree", "manifest": "src-tauri/Cargo.toml", "ecosystem": "crates", "version_constraint": "0.2" }, { "name": "which", "manifest": "src-tauri/Cargo.toml", "ecosystem": "crates", "version_constraint": "7" }, { "name": "keyring", "manifest": "src-tauri/Cargo.toml", "ecosystem": "crates", "version_constraint": "3" }, { "name": "axum", "manifest": "src-tauri/Cargo.toml", "ecosystem": "crates", "version_constraint": "0.8" }, { "name": "async_zip", "manifest": "src-tauri/Cargo.toml", "ecosystem": "crates", "version_constraint": "0.0.18" }, { "name": "tower-http", "manifest": "src-tauri/Cargo.toml", "ecosystem": "crates", "version_constraint": "0.6" }, { "name": "tokio-tungstenite", "manifest": "src-tauri/Cargo.toml", "ecosystem": "crates", "version_constraint": "0.26" }, { "name": "futures-util", "manifest": "src-tauri/Cargo.toml", "ecosystem": "crates", "version_constraint": "0.3" }, { "name": "tokio-util", "manifest": "src-tauri/Cargo.toml", "ecosystem": "crates", "version_constraint": "0.7" }, { "name": "prost", "manifest": "src-tauri/Cargo.toml", "ecosystem": "crates", "version_constraint": "0.13" }, { "name": "rand", "manifest": "src-tauri/Cargo.toml", "ecosystem": "crates", "version_constraint": "0.8" }, { "name": "qrcode", "manifest": "src-tauri/Cargo.toml", "ecosystem": "crates", "version_constraint": "0.14" }, { "name": "image", "manifest": "src-tauri/Cargo.toml", "ecosystem": "crates", "version_constraint": "0.25" }, { "name": "include_dir", "manifest": "src-tauri/Cargo.toml", "ecosystem": "crates", "version_constraint": "0.7" }, { "name": "sha2", "manifest": "src-tauri/Cargo.toml", "ecosystem": "crates", "version_constraint": "0.10" }, { "name": "aes-gcm", "manifest": "src-tauri/Cargo.toml", "ecosystem": "crates", "version_constraint": "0.10" }, { "name": "argon2", "manifest": "src-tauri/Cargo.toml", "ecosystem": "crates", "version_constraint": "0.5" }, { "name": "tempfile", "manifest": "src-tauri/Cargo.toml", "ecosystem": "crates", "version_constraint": "3" }, { "name": "minisign-verify", "manifest": "src-tauri/Cargo.toml", "ecosystem": "crates", "version_constraint": "0.2" }, { "name": "semver", "manifest": "src-tauri/Cargo.toml", "ecosystem": "crates", "version_constraint": "1" }, { "name": "tracing", "manifest": "src-tauri/Cargo.toml", "ecosystem": "crates", "version_constraint": "0.1" }, { "name": "tracing-subscriber", "manifest": "src-tauri/Cargo.toml", "ecosystem": "crates", "version_constraint": "0.3" }, { "name": "tracing-appender", "manifest": "src-tauri/Cargo.toml", "ecosystem": "crates", "version_constraint": "0.2" } ], "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": 23, "merged_prs": 20, "open_issues": 89, "closed_ratio": 0.704, "closed_issues": 212, "closed_unmerged_prs": 21 }, "bus_factor": 1, "bot_contributors": 0, "top_contributors": [ { "type": "User", "login": "xintaofei", "commits": 1826, "avatar_url": "https://avatars.githubusercontent.com/u/247335392?v=4" }, { "type": "User", "login": "AnotiaWang", "commits": 7, "avatar_url": "https://avatars.githubusercontent.com/u/62269186?v=4" }, { "type": "User", "login": "Kwensiu", "commits": 5, "avatar_url": "https://avatars.githubusercontent.com/u/240436088?v=4" }, { "type": "User", "login": "pia", "commits": 4, "avatar_url": "https://avatars.githubusercontent.com/u/6829895?v=4" }, { "type": "User", "login": "Jasion-han", "commits": 3, "avatar_url": "https://avatars.githubusercontent.com/u/64348627?v=4" }, { "type": "User", "login": "hsqbyte", "commits": 2, "avatar_url": "https://avatars.githubusercontent.com/u/22915141?v=4" }, { "type": "User", "login": "isYangs", "commits": 2, "avatar_url": "https://avatars.githubusercontent.com/u/110588441?v=4" }, { "type": "User", "login": "H1d3rOne", "commits": 1, "avatar_url": "https://avatars.githubusercontent.com/u/176208217?v=4" }, { "type": "User", "login": "mvanhorn", "commits": 1, "avatar_url": "https://avatars.githubusercontent.com/u/455140?v=4" }, { "type": "User", "login": "cnYui", "commits": 1, "avatar_url": "https://avatars.githubusercontent.com/u/132864240?v=4" } ], "contributors_sampled": 12, "top_contributor_share": 0.985 }, "quality_signals": { "has_ci": true, "has_tests": true, "ci_workflows": [ "release.yml", "test.yml" ], "has_docs_dir": true, "linter_configs": [ "eslint.config.mjs" ], "has_editorconfig": true, "has_linter_config": true, "has_precommit_config": false }, "security_signals": { "lockfiles": [ "Cargo.lock", "pnpm-lock.yaml" ], "scorecard": { "checks": [ { "name": "Binary-Artifacts", "score": 10, "reason": "no binaries found in the repo", "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts" }, { "name": "Branch-Protection", "score": 0, "reason": "branch protection not enabled on development/release branches", "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection" }, { "name": "CI-Tests", "score": null, "reason": "no pull request found", "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#ci-tests" }, { "name": "CII-Best-Practices", "score": 0, "reason": "no effort to earn an OpenSSF best practices badge detected", "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#cii-best-practices" }, { "name": "Code-Review", "score": 0, "reason": "Found 0/30 approved changesets -- score normalized to 0", "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review" }, { "name": "Contributors", "score": 3, "reason": "project has 1 contributing companies or organizations -- score normalized to 3", "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors" }, { "name": "Dangerous-Workflow", "score": 10, "reason": "no dangerous workflow patterns detected", "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow" }, { "name": "Dependency-Update-Tool", "score": 0, "reason": "no update tool detected", "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool" }, { "name": "Fuzzing", "score": 0, "reason": "project is not fuzzed", "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing" }, { "name": "License", "score": 10, "reason": "license file detected", "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license" }, { "name": "Maintained", "score": 10, "reason": "30 commit(s) and 9 issue activity found in the last 90 days -- score normalized to 10", "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained" }, { "name": "Packaging", "score": 10, "reason": "packaging workflow detected", "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging" }, { "name": "Pinned-Dependencies", "score": 0, "reason": "dependency not pinned by hash detected -- score normalized to 0", "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies" }, { "name": "SAST", "score": 0, "reason": "no SAST tool detected", "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast" }, { "name": "Security-Policy", "score": 0, "reason": "security policy file not detected", "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy" }, { "name": "Signed-Releases", "score": 8, "reason": "5 out of the last 5 releases have a total of 5 signed artifacts.", "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": "158 existing vulnerabilities detected", "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities" } ], "commit": "f073b659e8732745fed42adae83d31219175b278", "ran_at": "2026-07-22T08:03:15Z", "aggregate_score": 3.8, "scorecard_version": "v5.5.0" }, "has_codeql_workflow": false, "has_security_policy": false, "has_dependabot_config": false }, "contribution_flow": { "collected": true, "ci_last_run_at": "2026-07-21T16:46:02Z", "oldest_open_prs": [ { "number": 55, "created_at": "2026-04-02T05:18:49Z", "last_comment_at": "2026-04-03T13:19:54Z", "last_comment_author": "isYangs" }, { "number": 119, "created_at": "2026-04-26T13:03:56Z", "last_comment_at": "2026-05-02T03:33:40Z", "last_comment_author": "MoozLee" }, { "number": 124, "created_at": "2026-04-27T06:12:20Z", "last_comment_at": "2026-05-01T10:52:32Z", "last_comment_author": "MoozLee" }, { "number": 163, "created_at": "2026-05-11T01:55:42Z", "last_comment_at": "2026-05-11T09:59:00Z", "last_comment_author": "nzlov" }, { "number": 225, "created_at": "2026-05-28T13:48:08Z", "last_comment_at": null, "last_comment_author": null }, { "number": 237, "created_at": "2026-06-02T05:44:30Z", "last_comment_at": null, "last_comment_author": null }, { "number": 277, "created_at": "2026-06-12T11:35:45Z", "last_comment_at": null, "last_comment_author": null }, { "number": 282, "created_at": "2026-06-14T00:50:32Z", "last_comment_at": null, "last_comment_author": null }, { "number": 286, "created_at": "2026-06-15T23:25:45Z", "last_comment_at": "2026-07-20T03:02:34Z", "last_comment_author": "zengxiongzhuo" }, { "number": 287, "created_at": "2026-06-17T01:39:55Z", "last_comment_at": null, "last_comment_author": null }, { "number": 292, "created_at": "2026-06-17T09:28:44Z", "last_comment_at": null, "last_comment_author": null }, { "number": 296, "created_at": "2026-06-19T10:51:40Z", "last_comment_at": "2026-06-19T12:59:14Z", "last_comment_author": "ijry" }, { "number": 298, "created_at": "2026-06-19T13:22:16Z", "last_comment_at": null, "last_comment_author": null }, { "number": 302, "created_at": "2026-06-23T11:26:59Z", "last_comment_at": null, "last_comment_author": null }, { "number": 309, "created_at": "2026-06-28T10:37:30Z", "last_comment_at": "2026-07-13T12:30:17Z", "last_comment_author": "xintaofei" }, { "number": 337, "created_at": "2026-07-14T06:43:50Z", "last_comment_at": null, "last_comment_author": null }, { "number": 338, "created_at": "2026-07-14T09:29:49Z", "last_comment_at": null, "last_comment_author": null }, { "number": 341, "created_at": "2026-07-15T01:08:51Z", "last_comment_at": null, "last_comment_author": null }, { "number": 342, "created_at": "2026-07-15T01:15:07Z", "last_comment_at": null, "last_comment_author": null }, { "number": 343, "created_at": "2026-07-15T01:28:20Z", "last_comment_at": null, "last_comment_author": null } ], "last_merged_pr_at": "2026-07-13T11:33:27Z", "ci_last_conclusion": "SUCCESS", "oldest_open_issues": [ { "number": 12, "created_at": "2026-03-13T00:59:30Z", "last_comment_at": "2026-07-01T02:15:11Z", "last_comment_author": "damonwg99-lab" }, { "number": 28, "created_at": "2026-03-22T06:43:36Z", "last_comment_at": "2026-04-03T08:15:27Z", "last_comment_author": "ZhangSanMo" }, { "number": 32, "created_at": "2026-03-23T12:29:27Z", "last_comment_at": "2026-03-23T12:40:24Z", "last_comment_author": "xintaofei" }, { "number": 40, "created_at": "2026-03-27T01:22:20Z", "last_comment_at": "2026-03-27T08:51:37Z", "last_comment_author": "xintaofei" }, { "number": 88, "created_at": "2026-04-19T13:46:47Z", "last_comment_at": "2026-04-20T04:46:54Z", "last_comment_author": "xintaofei" }, { "number": 95, "created_at": "2026-04-22T05:43:08Z", "last_comment_at": "2026-04-22T11:27:03Z", "last_comment_author": "xintaofei" }, { "number": 105, "created_at": "2026-04-24T04:39:57Z", "last_comment_at": "2026-04-24T06:39:43Z", "last_comment_author": "xintaofei" }, { "number": 110, "created_at": "2026-04-25T07:24:47Z", "last_comment_at": "2026-05-19T07:13:34Z", "last_comment_author": "iLay1678" }, { "number": 130, "created_at": "2026-04-28T06:23:18Z", "last_comment_at": "2026-04-28T06:52:08Z", "last_comment_author": "lgq1024" }, { "number": 131, "created_at": "2026-04-28T06:59:46Z", "last_comment_at": "2026-04-29T04:45:05Z", "last_comment_author": "xintaofei" }, { "number": 132, "created_at": "2026-04-28T08:41:01Z", "last_comment_at": "2026-04-29T04:42:14Z", "last_comment_author": "xintaofei" }, { "number": 137, "created_at": "2026-04-29T15:27:41Z", "last_comment_at": "2026-04-30T10:28:53Z", "last_comment_author": "xintaofei" }, { "number": 149, "created_at": "2026-05-05T14:33:48Z", "last_comment_at": "2026-05-15T01:59:39Z", "last_comment_author": "xintaofei" }, { "number": 152, "created_at": "2026-05-06T01:47:45Z", "last_comment_at": "2026-05-15T01:59:31Z", "last_comment_author": "xintaofei" }, { "number": 156, "created_at": "2026-05-07T10:21:34Z", "last_comment_at": "2026-05-11T09:04:56Z", "last_comment_author": "xintaofei" }, { "number": 169, "created_at": "2026-05-13T02:13:27Z", "last_comment_at": "2026-05-20T03:17:15Z", "last_comment_author": "qinyongliang" }, { "number": 170, "created_at": "2026-05-14T01:43:44Z", "last_comment_at": "2026-05-14T05:40:43Z", "last_comment_author": "WPXSCode" }, { "number": 171, "created_at": "2026-05-14T07:18:23Z", "last_comment_at": "2026-05-15T01:58:49Z", "last_comment_author": "xintaofei" }, { "number": 172, "created_at": "2026-05-14T08:00:07Z", "last_comment_at": "2026-05-15T01:58:41Z", "last_comment_author": "xintaofei" }, { "number": 174, "created_at": "2026-05-14T12:41:03Z", "last_comment_at": "2026-05-15T01:58:30Z", "last_comment_author": "xintaofei" } ] } }, "config": { "disabled_metrics": [], "disabled_categories": [], "disabled_components": {} }, "source": { "url": "https://github.com/xintaofei/codeg", "host": "github.com", "name": "codeg", "owner": "xintaofei" }, "metrics": { "overall": { "key": "overall", "band": "moderate", "name": "Overall health", "note": null, "notes": [], "value": 64, "inputs": { "security": 38, "vitality": 86, "community": 66, "governance": 37, "engineering": 93 }, "components": [] }, "categories": [ { "key": "vitality", "band": "excellent", "name": "Vitality", "value": 86, "weight": 0.22, "metrics": [ { "key": "development_activity", "band": "good", "name": "Development activity", "note": null, "notes": [], "value": 78, "inputs": { "commits_last_year": 1861, "human_commit_share": 1, "days_since_last_push": 0, "active_weeks_last_year": 20 }, "components": [ { "key": "push_recency", "name": "Push recency", "detail": "last push 0 days ago", "points": 36, "status": "met", "details": [ { "code": "push_recency", "params": { "days": 0 } } ], "max_points": 36 }, { "key": "commit_cadence", "name": "Commit cadence", "detail": "20/52 weeks with commits", "points": 13.8, "status": "partial", "details": [ { "code": "commit_cadence_weeks", "params": { "weeks": 20 } } ], "max_points": 36 }, { "key": "commit_volume", "name": "Commit volume", "detail": "1861 commits in the last year", "points": 18, "status": "met", "details": [ { "code": "commits_last_year", "params": { "count": 1861 } } ], "max_points": 18 }, { "key": "openssf_scorecard_maintained", "name": "OpenSSF Scorecard: Maintained", "detail": "30 commit(s) and 9 issue activity found in the last 90 days -- score normalized to 10", "points": 10, "status": "met", "details": [], "max_points": 10 } ] }, { "key": "release_discipline", "band": "excellent", "name": "Release discipline", "note": null, "notes": [], "value": 98, "inputs": { "releases_count": 100, "latest_release_tag": "v0.21.4", "releases_from_tags": false, "days_since_latest_release": 0, "mean_days_between_releases": 1.2 }, "components": [ { "key": "ships_releases", "name": "Ships releases", "detail": "100 releases published", "points": 27, "status": "met", "details": [ { "code": "releases_published", "params": { "count": 100 } } ], "max_points": 27 }, { "key": "release_recency", "name": "Release recency", "detail": "latest release 0 days ago", "points": 36, "status": "met", "details": [ { "code": "release_recency", "params": { "days": 0 } } ], "max_points": 36 }, { "key": "release_cadence", "name": "Release cadence", "detail": "a release every ~1.2 days", "points": 27, "status": "met", "details": [ { "code": "release_cadence", "params": { "gap": 1.2 } } ], "max_points": 27 }, { "key": "openssf_scorecard_signed_releases", "name": "OpenSSF Scorecard: Signed-Releases", "detail": "5 out of the last 5 releases have a total of 5 signed artifacts.", "points": 8, "status": "partial", "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": "moderate", "name": "Community & Adoption", "value": 66, "weight": 0.18, "metrics": [ { "key": "popularity", "band": "good", "name": "Popularity & adoption", "note": null, "notes": [], "value": 80, "inputs": { "forks": 276, "stars": 2302, "watchers": 9, "growth_state": "unverified", "growth_factor_pct": 100, "growth_unverified_reason": "window_too_short" }, "components": [ { "key": "stars", "name": "Stars", "detail": "2,302 stars", "points": 54.5, "status": "partial", "details": [ { "code": "stars", "params": { "count": 2302 } } ], "max_points": 60 }, { "key": "forks", "name": "Forks", "detail": "276 forks", "points": 20.3, "status": "partial", "details": [ { "code": "forks", "params": { "count": 276 } } ], "max_points": 25 }, { "key": "watchers", "name": "Watchers", "detail": "9 watchers", "points": 5, "status": "partial", "details": [ { "code": "watchers", "params": { "count": 9 } } ], "max_points": 15 } ] }, { "key": "community_health", "band": "moderate", "name": "Community health", "note": null, "notes": [], "value": 50, "inputs": { "has_readme": true, "has_license": true, "has_contributing": false, "has_issue_template": false, "has_code_of_conduct": false, "has_pull_request_template": false }, "components": [ { "key": "readme", "name": "README", "detail": null, "points": 22.5, "status": "met", "details": [], "max_points": 22.5 }, { "key": "license", "name": "License", "detail": "recognized license (Apache-2.0)", "points": 22.5, "status": "met", "details": [ { "code": "license_standard", "params": {} }, { "code": "license_spdx", "params": { "spdx": "Apache-2.0" } } ], "max_points": 22.5 }, { "key": "contributing_guide", "name": "CONTRIBUTING guide", "detail": null, "points": 0, "status": "missed", "details": [], "max_points": 18 }, { "key": "code_of_conduct", "name": "Code of conduct", "detail": null, "points": 0, "status": "missed", "details": [], "max_points": 13.5 }, { "key": "issue_template", "name": "Issue template", "detail": null, "points": 0, "status": "missed", "details": [], "max_points": 7.2 }, { "key": "pr_template", "name": "PR template", "detail": null, "points": 0, "status": "missed", "details": [], "max_points": 6.3 } ] } ], "description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?" }, { "key": "governance", "band": "at_risk", "name": "Sustainability & Governance", "value": 37, "weight": 0.24, "metrics": [ { "key": "maintainer_resilience", "band": "critical", "name": "Maintainer resilience (bus factor)", "note": null, "notes": [], "value": 26, "inputs": { "bus_factor": 1, "contributors_sampled": 12, "top_contributor_share": 0.985 }, "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 98% of commits", "points": 0.3, "status": "partial", "details": [ { "code": "top_contributor_share", "params": { "share": 98 } } ], "max_points": 22.5 }, { "key": "contributor_breadth", "name": "Contributor breadth", "detail": "12 contributors", "points": 13.5, "status": "met", "details": [ { "code": "contributors_sampled", "params": { "count": 12 } } ], "max_points": 13.5 }, { "key": "openssf_scorecard_contributors", "name": "OpenSSF Scorecard: Contributors", "detail": "project has 1 contributing companies or organizations -- score normalized to 3", "points": 3, "status": "partial", "details": [], "max_points": 10 } ] }, { "key": "responsiveness", "band": "moderate", "name": "Issue & PR responsiveness", "note": null, "notes": [], "value": 52, "inputs": { "merged_prs": 20, "open_issues": 89, "closed_issues": 212, "issue_closed_ratio": 0.704, "closed_unmerged_prs": 21 }, "components": [ { "key": "issue_resolution", "name": "Issue resolution", "detail": "70% of issues closed", "points": 32.9, "status": "partial", "details": [ { "code": "issues_closed_share", "params": { "share": 70 } } ], "max_points": 46.75 }, { "key": "pr_acceptance", "name": "PR acceptance", "detail": "20/41 decided PRs merged", "points": 18.7, "status": "partial", "details": [ { "code": "decided_prs_merged", "params": { "merged": 20, "decided": 41 } } ], "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": "at_risk", "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": 35, "inputs": { "followers": 22, "owner_type": "User", "is_verified": null, "owner_login": "xintaofei", "public_repos": 8, "account_age_days": 231 }, "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": "22 followers of xintaofei", "points": 9.8, "status": "partial", "details": [ { "code": "owner_followers", "params": { "count": 22, "login": "xintaofei" } } ], "max_points": 25 }, { "key": "track_record", "name": "Track record", "detail": "8 public repos, account ~0 yr old", "points": 8.2, "status": "partial", "details": [ { "code": "public_repos", "params": { "count": 8 } }, { "code": "account_age_years", "params": { "years": 0 } } ], "max_points": 25 } ] } ], "description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?" }, { "key": "engineering", "band": "excellent", "name": "Engineering Quality", "value": 93, "weight": 0.2, "metrics": [ { "key": "engineering_practices", "band": "excellent", "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": 88, "inputs": { "has_ci": true, "has_tests": true, "has_editorconfig": true, "has_linter_config": true, "has_precommit_config": false }, "components": [ { "key": "ci_workflows", "name": "CI workflows", "detail": "2 workflow(s)", "points": 24, "status": "met", "details": [ { "code": "ci_workflows", "params": { "count": 2 } } ], "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": "eslint.config.mjs", "points": 16, "status": "met", "details": [ { "code": "file_list", "params": { "files": "eslint.config.mjs" } } ], "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": 6.4, "status": "met", "details": [], "max_points": 6.4 }, { "key": "openssf_scorecard_ci_tests", "name": "OpenSSF Scorecard: CI-Tests", "detail": "no pull request found", "points": 0, "status": "excluded", "details": [ { "code": "no_data", "params": {} } ], "max_points": 20 } ] }, { "key": "documentation", "band": "excellent", "name": "Documentation", "note": null, "notes": [], "value": 100, "inputs": { "topics": [ "acp", "agent", "claude-code", "code-generation", "codex", "gemini-cli", "openclaw", "opencode", "worktree", "gui", "cline", "codebuddy", "grok-build", "hermes-agent", "kimi-code", "pi" ], "has_wiki": true, "homepage": "https://docs.codeg.app", "has_readme": true, "has_docs_dir": true, "has_description": true }, "components": [ { "key": "readme", "name": "README", "detail": null, "points": 30, "status": "met", "details": [], "max_points": 30 }, { "key": "documentation_directory", "name": "Documentation directory", "detail": null, "points": 25, "status": "met", "details": [], "max_points": 25 }, { "key": "documentation_homepage_site", "name": "Documentation / homepage site", "detail": "https://docs.codeg.app", "points": 15, "status": "met", "details": [], "max_points": 15 }, { "key": "repository_description", "name": "Repository description", "detail": null, "points": 10, "status": "met", "details": [], "max_points": 10 }, { "key": "topics", "name": "Topics", "detail": "16 topics", "points": 10, "status": "met", "details": [ { "code": "topics_count", "params": { "count": 16 } } ], "max_points": 10 }, { "key": "wiki", "name": "Wiki", "detail": null, "points": 10, "status": "met", "details": [], "max_points": 10 } ] } ], "description": "Are baseline engineering and documentation practices in place?" }, { "key": "security", "band": "at_risk", "name": "Security", "value": 38, "weight": 0.16, "metrics": [ { "key": "security_posture", "band": "at_risk", "name": "Security posture", "note": "Excluded from scoring (no data or not applicable): CI-Tests. Remaining weights renormalized.", "notes": [ { "code": "excluded_no_data", "params": { "components": [ "ci_tests" ] } }, { "code": "weights_renormalized", "params": {} } ], "value": 38, "inputs": { "source": "openssf_scorecard", "checks_evaluated": 17, "scorecard_version": "v5.5.0", "checks_inconclusive": 1, "scorecard_aggregate": 3.8 }, "components": [ { "key": "binary_artifacts", "name": "Binary-Artifacts", "detail": "no binaries found in the repo", "points": 7.5, "status": "met", "details": [], "max_points": 7.5 }, { "key": "branch_protection", "name": "Branch-Protection", "detail": "branch protection not enabled on development/release branches", "points": 0, "status": "missed", "details": [], "max_points": 7.5 }, { "key": "ci_tests", "name": "CI-Tests", "detail": "no pull request found", "points": 0, "status": "excluded", "details": [ { "code": "no_data", "params": {} } ], "max_points": 2.5 }, { "key": "cii_best_practices", "name": "CII-Best-Practices", "detail": "no effort to earn an OpenSSF best practices badge detected", "points": 0, "status": "missed", "details": [], "max_points": 2.5 }, { "key": "code_review", "name": "Code-Review", "detail": "Found 0/30 approved changesets -- score normalized to 0", "points": 0, "status": "missed", "details": [], "max_points": 7.5 }, { "key": "contributors", "name": "Contributors", "detail": "project has 1 contributing companies or organizations -- score normalized to 3", "points": 0.8, "status": "partial", "details": [], "max_points": 2.5 }, { "key": "dangerous_workflow", "name": "Dangerous-Workflow", "detail": "no dangerous workflow patterns detected", "points": 10, "status": "met", "details": [], "max_points": 10 }, { "key": "dependency_update_tool", "name": "Dependency-Update-Tool", "detail": "no update tool detected", "points": 0, "status": "missed", "details": [], "max_points": 7.5 }, { "key": "fuzzing", "name": "Fuzzing", "detail": "project is not fuzzed", "points": 0, "status": "missed", "details": [], "max_points": 5 }, { "key": "license", "name": "License", "detail": "license file detected", "points": 2.5, "status": "met", "details": [], "max_points": 2.5 }, { "key": "maintained", "name": "Maintained", "detail": "30 commit(s) and 9 issue activity found in the last 90 days -- score normalized to 10", "points": 7.5, "status": "met", "details": [], "max_points": 7.5 }, { "key": "packaging", "name": "Packaging", "detail": "packaging workflow detected", "points": 5, "status": "met", "details": [], "max_points": 5 }, { "key": "pinned_dependencies", "name": "Pinned-Dependencies", "detail": "dependency not pinned by hash detected -- score normalized to 0", "points": 0, "status": "missed", "details": [], "max_points": 5 }, { "key": "sast", "name": "SAST", "detail": "no SAST tool detected", "points": 0, "status": "missed", "details": [], "max_points": 5 }, { "key": "security_policy", "name": "Security-Policy", "detail": "security policy file not detected", "points": 0, "status": "missed", "details": [], "max_points": 5 }, { "key": "signed_releases", "name": "Signed-Releases", "detail": "5 out of the last 5 releases have a total of 5 signed artifacts.", "points": 6, "status": "partial", "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": "158 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": 4 }, "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": 73, "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.86, "agent_instruction_files": [ "AGENTS.md", "CLAUDE.md" ], "agent_instruction_max_bytes": 5506 }, "components": [ { "key": "agent_instructions", "name": "Agent instructions", "detail": "AGENTS.md, CLAUDE.md", "points": 45, "status": "met", "details": [ { "code": "file_list", "params": { "files": "AGENTS.md, CLAUDE.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": "86 of 100 human commits state their intent (structured subject or explanatory body)", "points": 40, "status": "met", "details": [ { "code": "legible_history", "params": { "legible": 86, "sampled": 100 } } ], "max_points": 40 } ] }, { "key": "ai_verify_loop", "band": "moderate", "name": "Verify loop (build / test / typecheck)", "note": null, "notes": [], "value": 67, "inputs": { "has_nix": false, "has_tests": true, "lockfiles": [ "Cargo.lock", "pnpm-lock.yaml" ], "has_dockerfile": true, "typed_language": true, "bootstrap_files": [], "has_devcontainer": false, "has_linter_config": true, "typecheck_configs": [ "tsconfig.json" ], "agent_commit_share": 0, "toolchain_manifests": [ "src-tauri/Cargo.toml", "src-tauri/vendor/sacp-tokio/Cargo.toml" ], "dependency_bot_commit_share": 0 }, "components": [ { "key": "one_command_bootstrap", "name": "One-command bootstrap", "detail": "src-tauri/Cargo.toml, src-tauri/vendor/sacp-tokio/Cargo.toml (toolchain convention, no task runner)", "points": 12.6, "status": "partial", "details": [ { "code": "toolchain_convention", "params": { "files": "src-tauri/Cargo.toml, src-tauri/vendor/sacp-tokio/Cargo.toml" } } ], "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": "eslint.config.mjs", "points": 11, "status": "met", "details": [ { "code": "file_list", "params": { "files": "eslint.config.mjs" } } ], "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": "Dockerfile, lockfile", "points": 10, "status": "met", "details": [ { "code": "file_list", "params": { "files": "Dockerfile, 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 0", "points": 0, "status": "missed", "details": [], "max_points": 10 } ] }, { "key": "ai_code_legibility", "band": "excellent", "name": "Code legibility for models", "note": null, "notes": [], "value": 98, "inputs": { "primary_language": "TypeScript", "largest_source_bytes": 476107, "source_files_sampled": 1041, "oversized_source_files": 44 }, "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": "44/1041 source files over 60KB", "points": 52.7, "status": "partial", "details": [ { "code": "oversized_source_files", "params": { "kb": 60, "sampled": 1041, "oversized": 44 } } ], "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": [ "Could not fetch crates package 'codeg' from its registry", "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository" ], "report_type": "repository", "generated_at": "2026-07-22T08:03:28.927554Z", "schema_version": "0.26.0", "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/x/xintaofei/codeg.svg", "full_name": "xintaofei/codeg", "license_state": "standard", "license_spdx": "Apache-2.0" }, "repoMeta": null, "notFound": false, "related": [ { "id": 30197, "full_name": "microsoft/agent-governance-toolkit", "url": "https://github.com/microsoft/agent-governance-toolkit", "description": "AI Agent Governance Toolkit — Policy enforcement, zero-trust identity, execution sandboxing, and reliability engineering for autonomous AI agents. Covers 10/10 OWASP Agentic Top 10.", "ecosystem": "npm", "ecosystems": [ "npm", "go", "crates" ], "primary_language": "Python", "languages": [ "Python" ], "topics": [ "agent-framework", "ai-agents", "ai-safety", "compliance", "governance", "microsoft", "owasp", "policy-engine", "python", "security", "trust", "zero-trust", "antigravity", "cli", "agent", "policy", "claude-code", "mcp", "copilot", "opencode", "agentmesh", "identity", "audit" ], "license_spdx": "MIT", "license_state": "standard", "stars": 4869, "forks": 772, "watchers": 66, "monthly_downloads": 12295, "latest_score": 86, "latest_band": "excellent", "latest_scanned_at": "2026-07-20T23:06:13.846894Z", "has_high_risk_jurisdiction_exposure": false, "has_malicious_dependency": false, "growth_authenticity": "unverified", "abandonment_state": "unverified", "red_flags": [], "badge_url": "" }, { "id": 231, "full_name": "aaif-goose/goose", "url": "https://github.com/aaif-goose/goose", "description": "an open source, extensible AI agent that goes beyond code suggestions - install, execute, edit, and test with any LLM", "ecosystem": "crates", "ecosystems": [ "crates", "npm" ], "primary_language": "Rust", "languages": [ "Rust", "TypeScript" ], "topics": [ "mcp", "acp", "ai", "ai-agents" ], "license_spdx": "Apache-2.0", "license_state": "standard", "stars": 51252, "forks": 5693, "watchers": 325, "monthly_downloads": null, "latest_score": 89, "latest_band": "excellent", "latest_scanned_at": "2026-07-15T20:54:53.671043Z", "has_high_risk_jurisdiction_exposure": false, "has_malicious_dependency": false, "growth_authenticity": "unverified", "abandonment_state": "unverified", "red_flags": [], "badge_url": "" }, { "id": 30859, "full_name": "deepset-ai/haystack", "url": "https://github.com/deepset-ai/haystack", "description": "Open-source AI orchestration framework for building context-engineered, production-ready LLM applications. Design modular pipelines and agent workflows with explicit control over retrieval, routing, memory, and generation. Built for scalable agents, RAG, multimodal applications, semantic search, and conversational systems.", "ecosystem": "pypi", "ecosystems": [ "pypi", "npm" ], "primary_language": "Python", "languages": [ "Python" ], "topics": [ "nlp", "question-answering", "pytorch", "semantic-search", "information-retrieval", "summarization", "transformers", "machine-learning", "ai", "python", "large-language-models", "generative-ai", "llm", "rag", "retrieval-augmented-generation", "agents", "agent", "gemini", "gpt-4", "orchestration", "bert", "qa", "reader", "retriever", "albert", "language-model", "mrc", "roberta", "search", "squad", "transfer-learning", "transformer" ], "license_spdx": "Apache-2.0", "license_state": "standard", "stars": 25959, "forks": 2941, "watchers": 160, "monthly_downloads": 1022672, "latest_score": 93, "latest_band": "excellent", "latest_scanned_at": "2026-07-21T02:32:10.344140Z", "has_high_risk_jurisdiction_exposure": false, "has_malicious_dependency": false, "growth_authenticity": "unverified", "abandonment_state": "unverified", "red_flags": [], "badge_url": "" }, { "id": 27864, "full_name": "alibaba/nacos", "url": "https://github.com/alibaba/nacos", "description": "an easy-to-use dynamic service discovery, configuration and service management platform for building AI cloud native applications.", "ecosystem": "maven", "ecosystems": [ "maven", "npm" ], "primary_language": "Java", "languages": [ "Java" ], "topics": [ "nacos", "dubbo", "kubernetes", "istio", "spring-cloud", "microservices", "configuration-management", "distributed-configuration", "ai-registry", "mcp", "mcp-registry", "a2a-registry", "mcp-management", "prompt", "skills", "agent" ], "license_spdx": "Apache-2.0", "license_state": "standard", "stars": 33182, "forks": 13285, "watchers": 889, "monthly_downloads": null, "latest_score": 88, "latest_band": "excellent", "latest_scanned_at": "2026-07-20T12:27:05.160840Z", "has_high_risk_jurisdiction_exposure": false, "has_malicious_dependency": false, "growth_authenticity": "unverified", "abandonment_state": "unverified", "red_flags": [], "badge_url": "" }, { "id": 46, "full_name": "OpenHands/OpenHands", "url": "https://github.com/OpenHands/OpenHands", "description": "🙌 OpenHands: AI-Driven Development", "ecosystem": "npm", "ecosystems": [ "npm", "pypi" ], "primary_language": "Python", "languages": [], "topics": [ "agent", "artificial-intelligence", "chatgpt", "claude-ai", "cli", "developer-tools", "gpt", "llm", "openai" ], "license_spdx": null, "license_state": "custom", "stars": 80575, "forks": 10284, "watchers": 469, "monthly_downloads": 5176863, "latest_score": 87, "latest_band": "excellent", "latest_scanned_at": "2026-07-13T01:17:42.279995Z", "has_high_risk_jurisdiction_exposure": false, "has_malicious_dependency": false, "growth_authenticity": "unverified", "abandonment_state": "unverified", "red_flags": [], "badge_url": "" }, { "id": 111, "full_name": "langgenius/dify", "url": "https://github.com/langgenius/dify", "description": "Production-ready platform for agentic workflow development.", "ecosystem": "npm", "ecosystems": [ "npm", "pypi" ], "primary_language": "TypeScript", "languages": [], "topics": [ "agent", "agentic-ai", "agentic-framework", "agentic-workflow", "ai", "automation", "gemini", "genai", "gpt", "gpt-4", "llm", "low-code", "mcp", "nextjs", "no-code", "openai", "orchestration", "python", "rag", "workflow" ], "license_spdx": null, "license_state": "custom", "stars": 148611, "forks": 23425, "watchers": 818, "monthly_downloads": 0, "latest_score": 87, "latest_band": "excellent", "latest_scanned_at": "2026-07-13T01:49:18.026911Z", "has_high_risk_jurisdiction_exposure": false, "has_malicious_dependency": false, "growth_authenticity": "unverified", "abandonment_state": "unverified", "red_flags": [], "badge_url": "" } ] } }
Публічний реєстр
Звіт про здоров'я програмного забезпеченнясхема 0.26.0 · метрики 1.13.0 · 2026-07-22 08:03 UTC

xintaofei / codeg

Collaborative multi-agent AI coding workspace: aggregate sessions from Claude Code, Codex, OpenCode, Pi, Grok Build, etc. Desktop app, self-hosted server, or Docker.

TypeScript · RustApache-2.0★ 2 302 зірки⑂ 276 форківз лют. 2026 р.Переглянути на GitHub ↗

xintaofei/codeg має індекс здоров’я 64 зі 100, що відповідає смузі «Помірний». Найвищий показник — Engineering Quality (93/100), найнижчий — Sustainability & Governance (37/100). Останнє оновлення — сьогодні. Більшість нещодавньої роботи виконує один учасник.

64
загалом / 100
Помірний

Індекс здоров'я програмного забезпечення

Метрики згруповано у зважені категорії на шкалі 1–100. Загальна оцінка починається як їхнє середнє; коли публічні дані активують Політику юрисдикцій високого ризику, рейтинг коригується й отримує верхню межу 49 («Під ризиком»). Готовність до ШІ не входить до індексу.

64
Відмінний85-100Зразковий; відповідає практично всім перевіреним критеріям
Добрий70-84Здоровий; незначні прогалини
Помірний50-69Прийнятний, але з помітними прогалинами; рекомендовано перевірку
У зоні ризику30-49Суттєві слабкі місця; впровадження потребує обережності
Критичний1-29Серйозні проблеми (покинутий, єдиний мейнтейнер, без базової гігієни)
ЖиттєздатністьСпільнота тавпровадженняСталість таврядуванняІнженернаякістьБезпекаГотовність доШІ

Профіль оцінок

Кожна вісь — окрема категорія. Форма важить більше, ніж середнє: здоровий об'єкт заповнює всю фігуру, тоді як профіль із піками та провалами означає, що сила в одному вимірі маскує ризик в іншому.

Власність

XinTaoFeiОсобистий обліковий запис
22 підписники8 публічних репозиторіївз груд. 2025 р.

Цей репозиторій належить особистому обліковому запису. Проєкт з єдиним власником несе більший ризик безперервності, ніж підтримуваний організацією.

Метрики за категоріями

Життєздатність

Чи живий проєкт — чи пишеться код і чи виходять релізи?

86Відмінний · 22% загального індексу
Як обчислюється оцінка
36/36Свіжість push — останній push 0 дн. тому
13.8/36Ритм комітів — 20/52 тижнів із комітами
18/18Обсяг комітів — 1 861 комітів за останній рік
10/10OpenSSF Scorecard: Maintained — 30 commit(s) and 9 issue activity found in the last 90 days -- score normalized to 10
Використані вхідні дані
commits_last_year1 861
human_commit_share1
days_since_last_push0
active_weeks_last_year20
Як обчислюється оцінка
27/27Випускає релізи — опубліковано 100 релізів
36/36Свіжість релізів — останній реліз 0 дн. тому
27/27Ритм релізів — реліз кожні ~1,2 дн.
8/10OpenSSF Scorecard: Signed-Releases — 5 out of the last 5 releases have a total of 5 signed artifacts.
Використані вхідні дані
releases_count100
latest_release_tagv0.21.4
releases_from_tagsні
days_since_latest_release0
mean_days_between_releases1,2

Спільнота та впровадження

Чи має проєкт користувачів, завантаження, увагу та влаштовані умови для контриб’юторів?

66Помірний · 18% загального індексу
Як обчислюється оцінка
54.5/60Зірки — 2 302 зірок
20.3/25Форки — 276 форків
5/15Спостерігачі — 9 спостерігачів
Використані вхідні дані
forks276
stars2 302
watchers9
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonwindow_too_short
Як обчислюється оцінка
22.5/22.5README
22.5/22.5Ліцензія — визнана ліцензія (Apache-2.0)
0/18Настанови CONTRIBUTING
0/13.5Кодекс поведінки
0/7.2Шаблон issue
0/6.3Шаблон PR
Використані вхідні дані
has_readmeтак
has_licenseтак
has_contributingні
has_issue_templateні
has_code_of_conductні
has_pull_request_templateні

Сталість та врядування

Чи переживе проєкт своїх людей — бас-фактор, реактивність, хто за ним стоїть і як супроводжуються пакети?

37У зоні ризику · 24% загального індексу
Як обчислюється оцінка
9/54Бас-фактор — на 1 контриб’ютор(ів) припадає половина всіх комітів
0.3/22.5Розподіл комітів — головний контриб’ютор — автор 98% комітів
13.5/13.5Широта контриб’юторів — 12 контриб’юторів
3/10OpenSSF Scorecard: Contributors — project has 1 contributing companies or organizations -- score normalized to 3
Використані вхідні дані
bus_factor1
contributors_sampled12
top_contributor_share0,985
Як обчислюється оцінка
32.9/46.8Вирішення issue — закрито 70% issue
18.7/38.3Прийняття PR — злито 20/41 вирішених PR
0/15OpenSSF Scorecard: Code-Review — Found 0/30 approved changesets -- score normalized to 0
Використані вхідні дані
merged_prs20
open_issues89
closed_issues212
issue_closed_ratio0,704
closed_unmerged_prs21

Власність та опіка

35У зоні ризику
Як обчислюється оцінка
10/30Підтримка власника — особистий (користувацький) обліковий запис
0/20Верифікований домен — не застосовно до користувацьких облікових записів
9.8/25Охоплення власника — 22 підписників у xintaofei
8.2/25Послужний список — 8 публічних репозиторіїв, вік облікового запису ~0 р.
Використані вхідні дані
followers22
owner_typeUser
is_verified
owner_loginxintaofei
public_repos8
account_age_days231
Виключено з оцінювання (немає даних або не застосовно): Верифікований домен. Залишкові ваги перенормовано.

Інженерна якість

Чи наявні базові інженерні практики та документація?

93Відмінний · 20% загального індексу
Як обчислюється оцінка
24/24Процеси CI — 2 процес(ів) CI
24/24Наявні тести
16/16Конфігурація лінтера — eslint.config.mjs
0/9.6Pre-commit-хуки
6.4/6.4.editorconfig
0/20OpenSSF Scorecard: CI-Tests — немає даних
Використані вхідні дані
has_ciтак
has_testsтак
has_editorconfigтак
has_linter_configтак
has_precommit_configні
Виключено з оцінювання (немає даних або не застосовно): OpenSSF Scorecard: CI-Tests. Залишкові ваги перенормовано.

Документація

100Відмінний
Як обчислюється оцінка
30/30README
25/25Каталог документації
15/15Сайт документації / домашня сторінка — https://docs.codeg.app
10/10Опис репозиторію
10/10Теми — 16 тем
10/10Wiki
Використані вхідні дані
topicsacp, agent, claude-code, code-generation, codex, gemini-cli, openclaw, opencode, worktree, gui, cline, codebuddy, grok-build, hermes-agent, kimi-code, pi
has_wikiтак
homepagehttps://docs.codeg.app
has_readmeтак
has_docs_dirтак
has_descriptionтак

Безпека

Чи міцні видимі практики безпеки й ланцюга постачання, без непослабленої пов’язаності з юрисдикціями високого ризику?

38У зоні ризику · 16% загального індексу

Стан безпеки

38У зоні ризику
Як обчислюється оцінка
7.5/7.5Binary-Artifacts — no binaries found in the repo
0/7.5Branch-Protection — branch protection not enabled on development/release branches
0/2.5CI-Tests — немає даних
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
0/7.5Code-Review — Found 0/30 approved changesets -- score normalized to 0
0.8/2.5Contributors — project has 1 contributing companies or organizations -- score normalized to 3
10/10Dangerous-Workflow — no dangerous workflow patterns detected
0/7.5Dependency-Update-Tool — no update tool detected
0/5Fuzzing — project is not fuzzed
2.5/2.5Ліцензія — license file detected
7.5/7.5Maintained — 30 commit(s) and 9 issue activity found in the last 90 days -- score normalized to 10
5/5Packaging — packaging workflow detected
0/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
0/5SAST — no SAST tool detected
0/5Security-Policy — security policy file not detected
6/7.5Signed-Releases — 5 out of the last 5 releases have a total of 5 signed artifacts.
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
0/7.5Vulnerabilities — 158 existing vulnerabilities detected
Використані вхідні дані
sourceopenssf_scorecard
checks_evaluated17
scorecard_versionv5.5.0
checks_inconclusive1
scorecard_aggregate3,8
Виключено з оцінювання (немає даних або не застосовно): ci_tests. Залишкові ваги перенормовано.

Готовність до ШІ

Наскільки репозиторій оснащений для розробки та супроводу за участі ШІ-агентів? Незалежний, експериментальний бейдж — вага 0.0, тож він подається окремо і не впливає на загальний індекс здоров'я.

73Добрий · 0% загального індексу
Як обчислюється оцінка
45/45Інструкції для агентів — AGENTS.md, CLAUDE.md
0/15Машиночитана документація (llms.txt)
40/40Читабельна історія комітів — намір зазначено у 86 з 100 людських комітів (структурований заголовок або пояснювальний текст)
Використані вхідні дані
has_llms_txtні
legible_history_share0,86
agent_instruction_filesAGENTS.md, CLAUDE.md
agent_instruction_max_bytes5 506
Як обчислюється оцінка
12.6/18Розгортання однією командою — src-tauri/Cargo.toml, src-tauri/vendor/sacp-tokio/Cargo.toml (домовленість інструментарію, без раннера задач)
22/22Автоматизовані тести
11/11Конфігурація лінтера / форматера — eslint.config.mjs
11/11Статична перевірка типів — tsconfig.json
10/10Відтворюване середовище — Dockerfile, lockfile
0/10Підтверджена практика роботи з агентами — серед останніх 100 комітів немає створених агентом
0/8Автоматизоване супроводження — автоматичних оновлень залежностей не виявлено
0/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
Використані вхідні дані
has_nixні
has_testsтак
lockfilesCargo.lock, pnpm-lock.yaml
has_dockerfileтак
typed_languageтак
bootstrap_files
has_devcontainerні
has_linter_configтак
typecheck_configstsconfig.json
agent_commit_share0
toolchain_manifestssrc-tauri/Cargo.toml, src-tauri/vendor/sacp-tokio/Cargo.toml
dependency_bot_commit_share0
Як обчислюється оцінка
45/45Типізований код — TypeScript (статично типізована)
52.7/55Керовані розміри файлів — 44/1 041 файлів вихідного коду понад 60 КБ
Використані вхідні дані
primary_languageTypeScript
largest_source_bytes476 107
source_files_sampled1 041
oversized_source_files44
Як обчислюється оцінка
0/40Схема API (OpenAPI/GraphQL/proto)
0/20Сервер MCP
40/40Придатні до запуску приклади — examples
Використані вхідні дані
example_dirsexamples
has_mcp_signalні
api_schema_files

Ключові факти

2 302зірок GitHub
12контриб'юторів
1 861комітів за останні 12 місяців
0днів від останнього пушу
100релізів
1бас-фактор
89відкритих issue
crates.io, npmпакетних екосистем

Попередження щодо збору даних

  • Could not fetch crates package 'codeg' from its registry
  • GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

Докладніше

Історія зірок і форків 2 302 ★ / 276 ⇿
2 302Зірки
276Форки
100Релізи

Коли додано кожну зірку й форк — зібрано з GitHub і згруповано за днями. Кумулятивне зростання розміщено просто над денними додаваннями, з яких воно складається, тож їх видно одне проти одного: рівномірне органічне накопичення виглядає зовсім інакше, ніж різкий короткочасний сплеск. Там, де цю різницю можна виміряти, її подано як автентичність росту.

Показано лише найновішу історію — цей репозиторій перевищує вікно збору, тож найраніша історія не захоплена.

04008001 2001 6002 0002 4002 302275462026-032026-052026-07
Мажорні 0Мінорні 15Патчі 85
OpenSSF Scorecard 3.8 / 10
3.8сукупно

Незалежна, не прив'язана до інструментів оцінка безпеки від відкритого проєкту OpenSSF Scorecard. Кожна перевірка винагороджує практику безпеки, а не інструмент конкретного постачальника. Перевірки, які Scorecard не зміг визначити, позначено н/д і виключено з оцінки безпеки (вони ніколи не зараховуються як нуль).Scorecard v5.5.0 · 2026-07-22 08:03 UTC

10Binary-Artifactsno binaries found in the repo
0Branch-Protectionbranch protection not enabled on development/release branches
н/дCI-Testsno pull request found
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
0Code-ReviewFound 0/30 approved changesets -- score normalized to 0
3Contributorsproject has 1 contributing companies or organizations -- score normalized to 3
10Dangerous-Workflowno dangerous workflow patterns detected
0Dependency-Update-Toolno update tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
10Maintained30 commit(s) and 9 issue activity found in the last 90 days -- score normalized to 10
10Packagingpackaging workflow detected
0Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 0
0SASTno SAST tool detected
0Security-Policysecurity policy file not detected
8Signed-Releases5 out of the last 5 releases have a total of 5 signed artifacts.
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
0Vulnerabilities158 existing vulnerabilities detected
Прямі залежності 126
РеєстрПакетОбмеження версіїМаніфест
npm@base-ui/react^1.1.0package.json
npm@fontsource-variable/fira-code^5.2.7package.json
npm@fontsource-variable/geist^5.2.9package.json
npm@fontsource-variable/geist-mono^5.2.8package.json
npm@fontsource-variable/inter^5.2.8package.json
npm@fontsource-variable/jetbrains-mono^5.2.8package.json
npm@monaco-editor/react^4.7.0package.json
npm@radix-ui/react-use-controllable-state^1.2.2package.json
npm@streamdown/cjk^1.0.2package.json
npm@streamdown/code^1.0.2package.json
npm@streamdown/math^1.0.2package.json
npm@streamdown/mermaid^1.0.2package.json
npm@tauri-apps/api^2package.json
npm@tauri-apps/plugin-dialog^2.6.0package.json
npm@tauri-apps/plugin-opener^2package.json
npm@tauri-apps/plugin-process^2.3.1package.json
npm@tauri-apps/plugin-updater^2.10.0package.json
npm@tauri-apps/plugin-window-state~2.4.1package.json
npm@tiptap/core3.26.0package.json
npm@tiptap/extension-placeholder3.26.0package.json
npm@tiptap/markdown3.26.0package.json
npm@tiptap/pm3.26.0package.json
npm@tiptap/react3.26.0package.json
npm@tiptap/starter-kit3.26.0package.json
npm@tiptap/suggestion3.26.0package.json
npm@xterm/addon-fit^0.11.0package.json
npm@xterm/addon-ligatures^0.10.0package.json
npm@xterm/addon-web-links^0.12.0package.json
npm@xterm/xterm^6.0.0package.json
npmai^6.0.78package.json
npmansi-to-react^6.2.6package.json
npmclass-variance-authority^0.7.1package.json
npmclsx^2.1.1package.json
npmcmdk^1.1.1package.json
npmdate-fns^4.1.0package.json
npmhtml-to-image^1.11.13package.json
npmignore^7.0.5package.json
npmkatex^0.16.45package.json
npmlucide-react^0.563.0package.json
npmmdast-util-from-markdown^2.0.2package.json
npmmonaco-editor^0.55.1package.json
npmmotion^12.34.0package.json
npmnext^16package.json
npmnext-intl^4.8.3package.json
npmnext-themes^0.4.6package.json
npmoverlayscrollbars^2.15.1package.json
npmoverlayscrollbars-react^0.5.6package.json
npmpostcss^8.5.6package.json
npmqrcode.react^4.2.0package.json
npmradix-ui^1.4.3package.json
npmreact^19.1.0package.json
npmreact-dom^19.1.0package.json
npmreact-markdown^10.1.0package.json
npmreact-resizable-panels^2.1.9package.json
npmremark-breaks^4.0.0package.json
npmremark-gfm^4.0.1package.json
npmshadcn^3.8.4package.json
npmshiki^3.22.0package.json
npmsonner^2.0.7package.json
npmstreamdown^2.2.0package.json
npmtailwind-merge^3.4.0package.json
npmtailwindcss^4.1.18package.json
npmuse-stick-to-bottom^1.1.3package.json
npmvirtua^0.48.8package.json
npmzustand^5.0.14package.json
crates.iotauri2src-tauri/Cargo.toml
crates.iotauri-plugin-opener2src-tauri/Cargo.toml
crates.iotauri-plugin-dialog2src-tauri/Cargo.toml
crates.ioasync-trait0.1src-tauri/Cargo.toml
crates.ioserde1src-tauri/Cargo.toml
crates.ioserde_json1src-tauri/Cargo.toml
crates.iochrono0.4src-tauri/Cargo.toml
crates.iochrono-tz0.10src-tauri/Cargo.toml
crates.iocron0.12src-tauri/Cargo.toml
crates.iothiserror2src-tauri/Cargo.toml
crates.iodirs6src-tauri/Cargo.toml
crates.ioif-addrs0.13src-tauri/Cargo.toml
crates.iowalkdir2src-tauri/Cargo.toml
crates.ioignore0.4src-tauri/Cargo.toml
crates.iosacp11.0.0src-tauri/Cargo.toml
crates.iosacp-tokio11.0.0src-tauri/Cargo.toml
crates.iotokio1src-tauri/Cargo.toml
crates.iouuid1src-tauri/Cargo.toml
crates.iofutures0.3src-tauri/Cargo.toml
crates.iofutures-lite2src-tauri/Cargo.toml
crates.ioreqwest0.12src-tauri/Cargo.toml
crates.ioflate21src-tauri/Cargo.toml
crates.iobzip20.5src-tauri/Cargo.toml
crates.iotar0.4src-tauri/Cargo.toml
crates.iozip2src-tauri/Cargo.toml
crates.ioregex1src-tauri/Cargo.toml
crates.ioportable-pty0.8src-tauri/Cargo.toml
crates.iourlencoding2src-tauri/Cargo.toml
crates.iofix-path-env0.0.0src-tauri/Cargo.toml
crates.iosea-orm1.1src-tauri/Cargo.toml
crates.iosea-orm-migration1.1src-tauri/Cargo.toml
crates.iorusqlite0.32src-tauri/Cargo.toml
crates.iotoml0.8src-tauri/Cargo.toml
crates.iotoml_edit0.19src-tauri/Cargo.toml
crates.ioserde_yaml0.9src-tauri/Cargo.toml
crates.ionotify6src-tauri/Cargo.toml
crates.iobase640.22src-tauri/Cargo.toml
crates.ioagent-client-protocol-schema0.11src-tauri/Cargo.toml
crates.iokill_tree0.2src-tauri/Cargo.toml
crates.iowhich7src-tauri/Cargo.toml
crates.iokeyring3src-tauri/Cargo.toml
crates.ioaxum0.8src-tauri/Cargo.toml
crates.ioasync_zip0.0.18src-tauri/Cargo.toml
crates.iotower-http0.6src-tauri/Cargo.toml
crates.iotokio-tungstenite0.26src-tauri/Cargo.toml
crates.iofutures-util0.3src-tauri/Cargo.toml
crates.iotokio-util0.7src-tauri/Cargo.toml
crates.ioprost0.13src-tauri/Cargo.toml
crates.iorand0.8src-tauri/Cargo.toml
crates.ioqrcode0.14src-tauri/Cargo.toml
crates.ioimage0.25src-tauri/Cargo.toml
crates.ioinclude_dir0.7src-tauri/Cargo.toml
crates.iosha20.10src-tauri/Cargo.toml
crates.ioaes-gcm0.10src-tauri/Cargo.toml
crates.ioargon20.5src-tauri/Cargo.toml
crates.iotempfile3src-tauri/Cargo.toml
crates.iominisign-verify0.2src-tauri/Cargo.toml
crates.iosemver1src-tauri/Cargo.toml
crates.iotracing0.1src-tauri/Cargo.toml
crates.iotracing-subscriber0.3src-tauri/Cargo.toml
crates.iotracing-appender0.2src-tauri/Cargo.toml
Усі залежності не зібрано

Не вдалося зібрати розв'язаний набір залежностей для цього звіту: GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

Звіт у форматі JSON машиночитний
{
  "data": {
    "repo": {
      "topics": [
        "acp",
        "agent",
        "claude-code",
        "code-generation",
        "codex",
        "gemini-cli",
        "openclaw",
        "opencode",
        "worktree",
        "gui",
        "cline",
        "codebuddy",
        "grok-build",
        "hermes-agent",
        "kimi-code",
        "pi"
      ],
      "is_fork": false,
      "size_kb": 32209,
      "has_wiki": true,
      "homepage": "https://docs.codeg.app",
      "languages": {
        "CSS": 96740,
        "TeX": 36974,
        "HTML": 8094,
        "NSIS": 1145,
        "Rust": 6862233,
        "Shell": 43487,
        "Python": 396398,
        "Dockerfile": 2551,
        "JavaScript": 41969,
        "PowerShell": 13724,
        "TypeScript": 7084781
      },
      "pushed_at": "2026-07-21T16:08:59Z",
      "created_at": "2026-02-09T09:22:50Z",
      "owner_type": "User",
      "updated_at": "2026-07-22T06:38:00Z",
      "description": "Collaborative multi-agent AI coding workspace: aggregate sessions from Claude Code, Codex, OpenCode, Pi, Grok Build, etc. Desktop app, self-hosted server, or Docker.",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "Apache-2.0",
      "default_branch": "main",
      "license_spdx_raw": "Apache-2.0",
      "primary_language": "TypeScript",
      "significant_languages": [
        "TypeScript",
        "Rust"
      ]
    },
    "owner": {
      "blog": null,
      "name": "XinTaoFei",
      "type": "User",
      "login": "xintaofei",
      "company": null,
      "location": "Wuhan",
      "followers": 22,
      "avatar_url": "https://avatars.githubusercontent.com/u/247335392?v=4",
      "created_at": "2025-12-02T08:40:57Z",
      "is_verified": null,
      "public_repos": 8,
      "account_age_days": 231
    },
    "license": {
      "state": "standard",
      "spdx_id": "Apache-2.0",
      "raw_spdx": "Apache-2.0",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v0.21.4",
          "kind": "patch",
          "published_at": "2026-07-21T16:46:00Z"
        },
        {
          "tag": "v0.21.3",
          "kind": "patch",
          "published_at": "2026-07-21T00:56:10Z"
        },
        {
          "tag": "v0.21.2",
          "kind": "patch",
          "published_at": "2026-07-20T15:45:35Z"
        },
        {
          "tag": "v0.21.1",
          "kind": "patch",
          "published_at": "2026-07-19T14:48:13Z"
        },
        {
          "tag": "v0.21.0",
          "kind": "minor",
          "published_at": "2026-07-18T14:30:59Z"
        },
        {
          "tag": "v0.20.4",
          "kind": "patch",
          "published_at": "2026-07-16T17:11:54Z"
        },
        {
          "tag": "v0.20.3",
          "kind": "patch",
          "published_at": "2026-07-14T17:16:44Z"
        },
        {
          "tag": "v0.20.2",
          "kind": "patch",
          "published_at": "2026-07-12T15:57:55Z"
        },
        {
          "tag": "v0.20.1",
          "kind": "patch",
          "published_at": "2026-07-11T18:00:07Z"
        },
        {
          "tag": "v0.20.0",
          "kind": "minor",
          "published_at": "2026-07-11T02:57:27Z"
        },
        {
          "tag": "v0.19.3",
          "kind": "patch",
          "published_at": "2026-07-10T00:18:15Z"
        },
        {
          "tag": "v0.19.2",
          "kind": "patch",
          "published_at": "2026-07-08T15:30:29Z"
        },
        {
          "tag": "v0.19.1",
          "kind": "patch",
          "published_at": "2026-07-08T04:05:39Z"
        },
        {
          "tag": "v0.19.0",
          "kind": "minor",
          "published_at": "2026-07-05T17:09:21Z"
        },
        {
          "tag": "v0.18.8",
          "kind": "patch",
          "published_at": "2026-07-03T00:49:31Z"
        },
        {
          "tag": "v0.18.7",
          "kind": "patch",
          "published_at": "2026-07-01T05:12:10Z"
        },
        {
          "tag": "v0.18.6",
          "kind": "patch",
          "published_at": "2026-06-30T05:46:27Z"
        },
        {
          "tag": "v0.18.5",
          "kind": "patch",
          "published_at": "2026-06-29T17:55:23Z"
        },
        {
          "tag": "v0.18.3",
          "kind": "patch",
          "published_at": "2026-06-28T05:41:33Z"
        },
        {
          "tag": "v0.18.2",
          "kind": "patch",
          "published_at": "2026-06-27T14:18:49Z"
        },
        {
          "tag": "v0.18.1",
          "kind": "patch",
          "published_at": "2026-06-27T00:38:30Z"
        },
        {
          "tag": "v0.18.0",
          "kind": "minor",
          "published_at": "2026-06-26T05:45:30Z"
        },
        {
          "tag": "v0.17.0",
          "kind": "minor",
          "published_at": "2026-06-24T13:44:39Z"
        },
        {
          "tag": "v0.16.0",
          "kind": "minor",
          "published_at": "2026-06-22T14:10:37Z"
        },
        {
          "tag": "v0.15.14",
          "kind": "patch",
          "published_at": "2026-06-18T16:13:10Z"
        },
        {
          "tag": "v0.15.13",
          "kind": "patch",
          "published_at": "2026-06-17T14:30:16Z"
        },
        {
          "tag": "v0.15.12",
          "kind": "patch",
          "published_at": "2026-06-17T00:28:49Z"
        },
        {
          "tag": "v0.15.11",
          "kind": "patch",
          "published_at": "2026-06-15T16:33:43Z"
        },
        {
          "tag": "v0.15.10",
          "kind": "patch",
          "published_at": "2026-06-14T16:00:42Z"
        },
        {
          "tag": "v0.15.9",
          "kind": "patch",
          "published_at": "2026-06-12T13:28:24Z"
        },
        {
          "tag": "v0.15.8",
          "kind": "patch",
          "published_at": "2026-06-11T17:06:49Z"
        },
        {
          "tag": "v0.15.7",
          "kind": "patch",
          "published_at": "2026-06-11T01:14:46Z"
        },
        {
          "tag": "v0.15.6",
          "kind": "patch",
          "published_at": "2026-06-10T01:12:16Z"
        },
        {
          "tag": "v0.15.5",
          "kind": "patch",
          "published_at": "2026-06-09T17:34:35Z"
        },
        {
          "tag": "v0.15.4",
          "kind": "patch",
          "published_at": "2026-06-09T02:56:20Z"
        },
        {
          "tag": "v0.15.3",
          "kind": "patch",
          "published_at": "2026-06-08T17:29:49Z"
        },
        {
          "tag": "v0.15.2",
          "kind": "patch",
          "published_at": "2026-06-07T17:49:44Z"
        },
        {
          "tag": "v0.15.1",
          "kind": "patch",
          "published_at": "2026-06-06T17:15:06Z"
        },
        {
          "tag": "v0.15.0",
          "kind": "minor",
          "published_at": "2026-06-05T16:38:26Z"
        },
        {
          "tag": "v0.14.12",
          "kind": "patch",
          "published_at": "2026-06-04T13:55:33Z"
        },
        {
          "tag": "v0.14.11",
          "kind": "patch",
          "published_at": "2026-06-02T15:41:10Z"
        },
        {
          "tag": "v0.14.10",
          "kind": "patch",
          "published_at": "2026-06-01T16:27:55Z"
        },
        {
          "tag": "v0.14.9",
          "kind": "patch",
          "published_at": "2026-06-01T13:06:23Z"
        },
        {
          "tag": "v0.14.8",
          "kind": "patch",
          "published_at": "2026-05-30T15:32:44Z"
        },
        {
          "tag": "v0.14.7",
          "kind": "patch",
          "published_at": "2026-05-29T11:22:28Z"
        },
        {
          "tag": "v0.14.6",
          "kind": "patch",
          "published_at": "2026-05-29T00:12:37Z"
        },
        {
          "tag": "v0.14.5",
          "kind": "patch",
          "published_at": "2026-05-28T15:40:01Z"
        },
        {
          "tag": "v0.14.4",
          "kind": "patch",
          "published_at": "2026-05-28T03:28:34Z"
        },
        {
          "tag": "v0.14.3",
          "kind": "patch",
          "published_at": "2026-05-26T14:00:24Z"
        },
        {
          "tag": "v0.14.2",
          "kind": "patch",
          "published_at": "2026-05-25T05:32:49Z"
        },
        {
          "tag": "v0.14.1",
          "kind": "patch",
          "published_at": "2026-05-24T16:56:53Z"
        },
        {
          "tag": "v0.14.0",
          "kind": "minor",
          "published_at": "2026-05-24T14:25:29Z"
        },
        {
          "tag": "v0.13.10",
          "kind": "patch",
          "published_at": "2026-05-22T04:46:56Z"
        },
        {
          "tag": "v0.13.9",
          "kind": "patch",
          "published_at": "2026-05-20T15:35:20Z"
        },
        {
          "tag": "v0.13.8",
          "kind": "patch",
          "published_at": "2026-05-19T17:04:00Z"
        },
        {
          "tag": "v0.13.7",
          "kind": "patch",
          "published_at": "2026-05-19T11:16:06Z"
        },
        {
          "tag": "v0.13.6",
          "kind": "patch",
          "published_at": "2026-05-18T14:58:09Z"
        },
        {
          "tag": "v0.13.5",
          "kind": "patch",
          "published_at": "2026-05-18T06:20:28Z"
        },
        {
          "tag": "v0.13.4",
          "kind": "patch",
          "published_at": "2026-05-15T16:37:51Z"
        },
        {
          "tag": "v0.13.2",
          "kind": "patch",
          "published_at": "2026-05-14T18:36:17Z"
        },
        {
          "tag": "v0.13.1",
          "kind": "patch",
          "published_at": "2026-05-14T10:50:33Z"
        },
        {
          "tag": "v0.13.0",
          "kind": "minor",
          "published_at": "2026-05-14T05:42:00Z"
        },
        {
          "tag": "v0.12.3",
          "kind": "patch",
          "published_at": "2026-05-12T16:02:42Z"
        },
        {
          "tag": "v0.12.2",
          "kind": "patch",
          "published_at": "2026-05-11T14:56:59Z"
        },
        {
          "tag": "v0.12.1",
          "kind": "patch",
          "published_at": "2026-05-10T11:51:15Z"
        },
        {
          "tag": "v0.12.0",
          "kind": "minor",
          "published_at": "2026-05-10T03:33:03Z"
        },
        {
          "tag": "v0.11.9",
          "kind": "patch",
          "published_at": "2026-05-08T03:45:44Z"
        },
        {
          "tag": "v0.11.8",
          "kind": "patch",
          "published_at": "2026-05-07T17:09:39Z"
        },
        {
          "tag": "v0.11.7",
          "kind": "patch",
          "published_at": "2026-05-06T14:54:45Z"
        },
        {
          "tag": "v0.11.6",
          "kind": "patch",
          "published_at": "2026-05-06T06:24:08Z"
        },
        {
          "tag": "v0.11.5",
          "kind": "patch",
          "published_at": "2026-05-05T10:03:00Z"
        },
        {
          "tag": "v0.11.4",
          "kind": "patch",
          "published_at": "2026-05-04T23:10:23Z"
        },
        {
          "tag": "v0.11.3",
          "kind": "patch",
          "published_at": "2026-04-30T14:29:23Z"
        },
        {
          "tag": "v0.11.2",
          "kind": "patch",
          "published_at": "2026-04-29T11:43:00Z"
        },
        {
          "tag": "v0.11.1",
          "kind": "patch",
          "published_at": "2026-04-29T03:55:28Z"
        },
        {
          "tag": "v0.11.0",
          "kind": "minor",
          "published_at": "2026-04-27T16:51:49Z"
        },
        {
          "tag": "v0.10.4",
          "kind": "patch",
          "published_at": "2026-04-25T14:01:07Z"
        },
        {
          "tag": "v0.10.3",
          "kind": "patch",
          "published_at": "2026-04-24T16:49:02Z"
        },
        {
          "tag": "v0.10.2",
          "kind": "patch",
          "published_at": "2026-04-24T12:19:36Z"
        },
        {
          "tag": "v0.10.1",
          "kind": "patch",
          "published_at": "2026-04-23T16:59:55Z"
        },
        {
          "tag": "v0.10.0",
          "kind": "minor",
          "published_at": "2026-04-23T08:27:35Z"
        },
        {
          "tag": "v0.9.5",
          "kind": "patch",
          "published_at": "2026-04-20T16:56:46Z"
        },
        {
          "tag": "v0.9.4",
          "kind": "patch",
          "published_at": "2026-04-19T01:53:34Z"
        },
        {
          "tag": "v0.9.3",
          "kind": "patch",
          "published_at": "2026-04-18T16:15:41Z"
        },
        {
          "tag": "v0.9.2",
          "kind": "patch",
          "published_at": "2026-04-18T11:17:02Z"
        },
        {
          "tag": "v0.9.1",
          "kind": "patch",
          "published_at": "2026-04-18T04:28:12Z"
        },
        {
          "tag": "v0.9.0",
          "kind": "minor",
          "published_at": "2026-04-17T08:03:43Z"
        },
        {
          "tag": "v0.8.9",
          "kind": "patch",
          "published_at": "2026-04-16T05:25:10Z"
        },
        {
          "tag": "v0.8.8",
          "kind": "patch",
          "published_at": "2026-04-15T16:38:47Z"
        },
        {
          "tag": "v0.8.7",
          "kind": "patch",
          "published_at": "2026-04-15T09:32:37Z"
        },
        {
          "tag": "v0.8.6",
          "kind": "patch",
          "published_at": "2026-04-14T16:01:39Z"
        },
        {
          "tag": "v0.8.5",
          "kind": "patch",
          "published_at": "2026-04-13T16:18:47Z"
        },
        {
          "tag": "v0.8.4",
          "kind": "patch",
          "published_at": "2026-04-13T15:16:41Z"
        },
        {
          "tag": "v0.8.3",
          "kind": "patch",
          "published_at": "2026-04-13T05:07:07Z"
        },
        {
          "tag": "v0.8.2",
          "kind": "patch",
          "published_at": "2026-04-12T15:33:33Z"
        },
        {
          "tag": "v0.8.1",
          "kind": "patch",
          "published_at": "2026-04-12T06:32:36Z"
        },
        {
          "tag": "v0.8.0",
          "kind": "minor",
          "published_at": "2026-04-11T10:04:38Z"
        },
        {
          "tag": "v0.7.2",
          "kind": "patch",
          "published_at": "2026-04-11T03:45:43Z"
        },
        {
          "tag": "v0.7.1",
          "kind": "patch",
          "published_at": "2026-04-10T17:39:33Z"
        },
        {
          "tag": "v0.7.0",
          "kind": "minor",
          "published_at": "2026-04-10T10:55:37Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "f073b659e8732745fed42adae83d31219175b278",
          "body": "- feat(workspace): **A reorganized desktop layout.** The folder selector now lives in the conversation header — sized to the title and aware of your folder aliases — while the git branch selector and command launcher move into the bottom status bar as paired controls. A one-click pull-code button si\n[…]\n让日志文件无限增长的 debug 目标被限制为 warning 级别,重复的广播滞后警告也在每个时间窗内合并为一行。\n- 维护(智能体):**升级注册表中的内置智能体版本。** Claude Code 0.60.0、OpenCode 1.18.4、Gemini 0.51.0、Cline 3.0.46、Hermes 0.19.0、CodeBuddy 2.125.0、Kimi Code 0.28.1。",
          "is_bot": false,
          "headline": "# Release version 0.21.4",
          "author_name": "xintaofei",
          "author_login": "xintaofei",
          "committed_at": "2026-07-21T16:08:27Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "13068373572e91616c3ac2940e91793ee335e47e",
          "body": null,
          "is_bot": false,
          "headline": "Merge remote-tracking branch 'origin/main'",
          "author_name": "xintaofei",
          "author_login": "xintaofei",
          "committed_at": "2026-07-21T15:42:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "646fe51456875ef02dc337c9427494553d7a4610",
          "body": "…rners\n\n- Lift the inter-tab separators and the trailing new-conversation divider to the\n  chrome border color under a workspace background so they match the tab arch and\n  strip line instead of the faint theme border\n- Reveal a tab's reverse-corner feet only when it is active: on hover the fill is\n  a floating pill that stops short of the strip bottom, so revealing the feet left\n  two orphaned nubs at the bottom corners",
          "is_bot": false,
          "headline": "fix(workspace): correct tab separator color and hovered-tab bottom co…",
          "author_name": "xintaofei",
          "author_login": "xintaofei",
          "committed_at": "2026-07-21T15:41:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8ccd0c8135022d926750b030f27c595bb6f29265",
          "body": "The bottom status-bar branch selector briefly showed \"no branch\" after a\npull, fetch, commit, or checkout.\n\n- refreshFolder no longer overwrites the poll-resolved branch with the folder\n  row's git_branch, which is always null (branch state comes from git-head\n  polling), so a refresh can't blank the label until the next poll.\n- The selector label now falls back to the detected HEAD branch before the\n  detached short SHA, so a known head fills in immediately.",
          "is_bot": false,
          "headline": "fix(git): keep the current branch label after pull and branch switch",
          "author_name": "xintaofei",
          "author_login": "xintaofei",
          "committed_at": "2026-07-21T15:22:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "154d7fd4ffdfee04011d610ce4b6f51082fc50ab",
          "body": null,
          "is_bot": false,
          "headline": "Merge remote-tracking branch 'origin/main'",
          "author_name": "xintaofei",
          "author_login": "xintaofei",
          "committed_at": "2026-07-21T14:58:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e17a3bae01d6ddc4775ca51d84779e609313e641",
          "body": "- Clip long user messages to a default max height with a fading bottom\n  edge, revealing a \"Show more\" control that expands to the full message\n  and back to \"Show less\"\n- Leave assistant messages unaffected\n- Keep the fade correct whether the bubble is solid or translucent under\n  a workspace background image\n- Localize the toggle labels across all 10 supported languages",
          "is_bot": false,
          "headline": "feat(chat): cap user message height with a show more/less toggle",
          "author_name": "xintaofei",
          "author_login": "xintaofei",
          "committed_at": "2026-07-21T14:58:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "84e66baf2e9cac0eb7ed1a5e9d272ba315ad8406",
          "body": "Claude Code 0.60.0, OpenCode 1.18.4, Gemini 0.51.0, Cline 3.0.46,\nHermes 0.19.0, CodeBuddy 2.125.0, Kimi Code 0.28.1.",
          "is_bot": false,
          "headline": "chore(acp): upgrade pinned agent versions",
          "author_name": "xintaofei",
          "author_login": "xintaofei",
          "committed_at": "2026-07-21T14:39:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "350fa4b6dfb077f3097702fc71b2fd4184e31efd",
          "body": null,
          "is_bot": false,
          "headline": "Merge remote-tracking branch 'origin/main'",
          "author_name": "xintaofei",
          "author_login": "xintaofei",
          "committed_at": "2026-07-21T14:24:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f2a3c680180672d4b35e97e8fe4459e06b5c4a69",
          "body": "- Append a standing kill_tree=warn backstop to every constructed EnvFilter,\n  including the RUST_LOG / CODEG_LOG override path, so a global debug level no\n  longer emits the crate's per-PID process-scan lines that can grow the log\n  file without bound\n- Route the env override through a shared helper so it applies the same\n  backstops (kill_tree plus the logging module's own target) as build_env_filter",
          "is_bot": false,
          "headline": "fix(logging): pin the kill_tree target to warn in every log filter",
          "author_name": "xintaofei",
          "author_login": "xintaofei",
          "committed_at": "2026-07-21T14:07:04Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "992376c0369938558240fb4d30e2d766e74d54f0",
          "body": "- Add a leading-edge LagLogThrottle: the first lag logs immediately, further\n  lags within a 10s window are counted and suppressed, and the next line past\n  the window reports the coalesced occurrence count and dropped-event total\n- Gate the Lagged WARN in every long-lived broadcast subscriber (life\n[…]\napper, and the WebSocket global firehose) through a task-local throttle\n- Keep the lagged_count metrics and the overrun recovery side-effects\n  unthrottled so only the duplicate log line is suppressed",
          "is_bot": false,
          "headline": "fix(logging): throttle broadcast-lag warnings to one line per window",
          "author_name": "xintaofei",
          "author_login": "xintaofei",
          "committed_at": "2026-07-21T14:06:56Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "10798a78a4ac15764dac6011e4793985f3f8b652",
          "body": "- Rewrite bare Windows drive paths (C:/…, C:\\…) and file:///C:/… links to a\n  schemeless /C:/… form at the remark stage so rehype-sanitize no longer reads\n  the drive letter as a URL protocol and drops the href\n- Keep such links clickable through the workspace file opener, stripping the\n  leading sl\n[…]\nections\n  untouched, and preserve POSIX, UNC, http(s), mailto, tel and codeg:// behavior\n- Add a render-pipeline test through the real Streamdown sanitize + harden\n  layers plus the click-to-open path",
          "is_bot": false,
          "headline": "fix(chat): open Windows local file links instead of showing \"[blocked]\"",
          "author_name": "xintaofei",
          "author_login": "xintaofei",
          "committed_at": "2026-07-21T13:22:19Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f0bc14090bc38bf0de124d90958a965b41aef129",
          "body": "- Boost the persistent chrome hairlines with a foreground-tinted border so the\n  status bar, sidebar, mobile title bar and aux tabs, and the tab-strip line and\n  active-tab arch stay legible over a workspace background image\n- Frost the trailing new-conversation button's hover with a backdrop blur a\n[…]\nauncher hover surfaces to full\n  pills and prefix the command name with a terminal icon\n- Draw a divider between the last conversation tab and the new-conversation\n  button when that tab is not active",
          "is_bot": false,
          "headline": "feat(workspace): sharpen the desktop chrome borders and hover controls",
          "author_name": "xintaofei",
          "author_login": "xintaofei",
          "committed_at": "2026-07-21T13:19:50Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "a6dd7f322a35ebc633a307c0a6393777654d5d35",
          "body": "…ayout\n\n- Replace the mobile conversation and file tab strips with the folder-and-title\n  conversation header and the file breadcrumb header\n- Slim the top bar to a sidebar toggle, a new-conversation button and the\n  terminal, aux-panel and settings controls, matched to the desktop height and\n  drag\n[…]\nlose and navigation shortcuts in the always-mounted\n  workspace controller so they keep working when the tab strips are hidden\n- Remove the unused embedded tab-bar variants and the retired picker code",
          "is_bot": false,
          "headline": "feat(workspace): align the mobile workspace chrome with the desktop l…",
          "author_name": "xintaofei",
          "author_login": "xintaofei",
          "committed_at": "2026-07-21T12:13:37Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c8827c7450abaf2d6438a0fa0dd629cdc103aa9e",
          "body": "…esktop chrome\n\n- Move the folder selector into the conversation header: alias-aware, iconless,\n  sized to the title, themed while drafting a new conversation and muted for an\n  existing one\n- Drop the folder and branch pickers below the composer\n- Host the git branch selector and command launcher i\n[…]\nails tab on desktop and remove the old\n  static branch label\n- Rename the folderless label to \"Chat mode\" across all locales\n- Give the active conversation composer a little more bottom breathing room",
          "is_bot": false,
          "headline": "feat(workspace): rework folder, branch and command placement in the d…",
          "author_name": "xintaofei",
          "author_login": "xintaofei",
          "committed_at": "2026-07-21T09:18:23Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "bbd1080ff47825d85d9c67355cd8445b5529f42a",
          "body": null,
          "is_bot": false,
          "headline": "docs(images): update WeChat contact images",
          "author_name": "xintaofei",
          "author_login": "xintaofei",
          "committed_at": "2026-07-21T04:31:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ddb5a8a3785400d075d23d6a160069f8e7213fea",
          "body": null,
          "is_bot": false,
          "headline": "Merge remote-tracking branch 'origin/main'",
          "author_name": "xintaofei",
          "author_login": "xintaofei",
          "committed_at": "2026-07-21T04:18:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c011aba102f85801f4030d5d7a6f3b6e9b71a79d",
          "body": null,
          "is_bot": false,
          "headline": "Merge branch 'cv-main-0720'",
          "author_name": "xintaofei",
          "author_login": "xintaofei",
          "committed_at": "2026-07-21T04:17:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a9341692eec8170695c04c5316a5488372c15bac",
          "body": "…indow\n\nReplace the sidebar folder's inline import action with a standalone window\nthat scans every local agent store, groups discovered sessions by project\nfolder, and imports a multi-selection in a single pass.\n\n- Show per-agent scan progress while walking the local session stores\n- Offer folder- \n[…]\nr's context menu (preselecting that folder) or the\n  Folders section header, and refresh the main window on completion\n- Guard against concurrent imports and support both desktop and server\n  runtimes",
          "is_bot": false,
          "headline": "feat(import-sessions): batch-import local sessions from a dedicated w…",
          "author_name": "xintaofei",
          "author_login": "xintaofei",
          "committed_at": "2026-07-21T04:14:47Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "76369ca9987d72f800fc82eeae0294cb72232447",
          "body": "- feat(chat): **Frosted message surfaces over your background image.** With a workspace background image on, the surfaces inside chat messages — bubbles, capsules, cards, code headers, tables, and inline code — turn to one family of translucent frosted panels so the image shows through. Inline code \n[…]\n1.3\n\n- 功能(聊天):**背景图之上的磨砂消息表面。** 启用工作区背景图后,消息内的各类表面——气泡、胶囊、卡片、代码标题栏、表格与内联代码——统一为一族半透明磨砂面板,背景图得以透出。内联代码也呈现为胶囊,表格呈现为带边框的圆角卡片。\n- 修复(标签栏):**新建会话按钮妥帖地落在标签旁边。** 按钮与标签同处一行、紧贴最后一个标签,在背景图之上其悬停磨砂与标签条底边框也渲染得干净利落。",
          "is_bot": false,
          "headline": "# Release version 0.21.3",
          "author_name": "xintaofei",
          "author_login": "xintaofei",
          "committed_at": "2026-07-21T00:16:59Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "9903b8ebeb7b2c89ec7e2f3edd1921a9d69e14d5",
          "body": "…alog",
          "is_bot": false,
          "headline": "chore(prettier): ignore vendored science skills and bundled codex cat…",
          "author_name": "xintaofei",
          "author_login": "xintaofei",
          "committed_at": "2026-07-21T00:15:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "87aa51933d1d32486c48c613ab76ff8f24071d60",
          "body": "…round\n\nWhen a workspace background image is enabled, the surfaces inside chat\nmessages — user bubbles, tool/agent capsules, delegation / background-task /\nask-question / plan cards, code-block headers, tables, and inline code —\nrender as one family of translucent, neutral-tinted surfaces with a hai\n[…]\nackground image the tinting is inert and\neach surface keeps its original color.\n\nIndependently of the background image, inline code renders as a full pill and\ntables render as rounded, bordered cards.",
          "is_bot": false,
          "headline": "feat(chat): unify in-message surface styling over the workspace backg…",
          "author_name": "xintaofei",
          "author_login": "xintaofei",
          "committed_at": "2026-07-21T00:00:43Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "52b326cf935096ab6737abc958f94dd5b36d0101",
          "body": "…ton hover\n\nWith a background image enabled, the strip's bottom border now stays unbroken\naround the new-conversation button. When the last tab is active it no longer\nleaves a stray segment poking out from under its rounded bottom-right corner,\nand the border runs continuously to the strip's right e\n[…]\nright reserve.\n\nThe new-conversation button's hover fill uses the changed-files card's\ntranslucent accent tint, so it reads as a light frost over the background image\nrather than an opaque dark patch.",
          "is_bot": false,
          "headline": "fix(tabs): polish the title-bar strip border and new-conversation but…",
          "author_name": "xintaofei",
          "author_login": "xintaofei",
          "committed_at": "2026-07-20T23:56:26Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "673a23b9f32cd899068195e159047323eee3a6e4",
          "body": "The title-bar tab strip hosts the new-conversation button and its drag spacer\ninside the tab row, so the tabs, button, and spacer share one flex line: each\ntab keeps its equal width until the row fills and then they shrink together,\nand the button stays directly beside the last tab instead of detaching with a\ngap between them.\n\nThe button is now circular and evenly inset from the strip's top, bottom, and\nleft edges, so its hover fill floats clear of the last tab.",
          "is_bot": false,
          "headline": "fix(tabs): seat the new-conversation button beside the tabs",
          "author_name": "xintaofei",
          "author_login": "xintaofei",
          "committed_at": "2026-07-20T17:06:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "333278de7eb824291eca90690c92d56f02aea430",
          "body": "- feat(git-log): **The Commit history tab is now a continuous timeline.** History renders as one virtualized timeline that loads older commits on demand as you scroll, so the whole log stays reachable — not just the first page.\n- feat(file-tree): **Drive the file tree from the keyboard.** Arrow keys\n[…]\n数旁显示所连工作区的名称——悬停可见其地址。\n- 修复(搜索):**文件搜索对话框能找到深层嵌套的文件。** 后端按 gitignore 规则遍历,不进入 node_modules 或 target 即可触达任意深度的文件,模糊排序让深层匹配浮现。输入框的 @ 提及选择器也同样受益。\n- 修复(工作台):**Cursor 与 Grok 的委派卡片重新显示图标。** 这两类子智能体不再显示空白图标。",
          "is_bot": false,
          "headline": "# Release version 0.21.2",
          "author_name": "xintaofei",
          "author_login": "xintaofei",
          "committed_at": "2026-07-20T14:44:51Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f54066b2e830c741a07d674ef71491d45dd6e79b",
          "body": null,
          "is_bot": false,
          "headline": "Merge remote-tracking branch 'origin/main'",
          "author_name": "xintaofei",
          "author_login": "xintaofei",
          "committed_at": "2026-07-20T14:19:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0ce209508c3917722f004a3fd111c2f6693d1179",
          "body": "Drop the viewCommitDiffAria and changedFilesTitle keys from every locale; nothing references them after the git-log tab redesign.",
          "is_bot": false,
          "headline": "chore(i18n): remove unused git-log tab message keys",
          "author_name": "xintaofei",
          "author_login": "xintaofei",
          "committed_at": "2026-07-20T13:44:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b77c17304f824f9875335299740151b97cb65088",
          "body": "The AcpAgentInfo test fixtures now set cursor_cli_config_json and cursor_settings, so they match the type and the project type-checks cleanly.",
          "is_bot": false,
          "headline": "fix(agents): add the cursor fields to the acp agent test fixtures",
          "author_name": "xintaofei",
          "author_login": "xintaofei",
          "committed_at": "2026-07-20T13:43:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3f8d87f406de2251cd4802568d961ce49bd0e4b3",
          "body": "…nated timeline\n\nThe right-sidebar commit tab renders history as a single continuous, virtualized timeline that loads older commits on demand as the list scrolls, so the whole history stays reachable instead of only the first page. The git_log command takes a skip offset to page through commits and \n[…]\nsh and message.\n\nA borderless header carries a searchable branch filter that scopes the log and a refresh control, with the header's and each row's leading and trailing glyphs aligned to shared edges.",
          "is_bot": false,
          "headline": "feat(git-log): redesign the commit-history tab as a virtualized, pagi…",
          "author_name": "xintaofei",
          "author_login": "xintaofei",
          "committed_at": "2026-07-20T13:06:26Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "84d020869faa3e602b191ab8e8a7c4a941ca74d5",
          "body": "Discover workspace files via a gitignore-aware backend walk\n(list_workspace_files) that prunes ignored directories during traversal,\nso deeply-nested files are reachable without descending node_modules or\ntarget and without a depth cap. Rank results by relevance with fuzzy\nsubsequence matching across the full list so deep matches surface. The\ncomposer's @-mention reference picker shares the same hook and benefits too.",
          "is_bot": false,
          "headline": "fix(search): find deeply-nested files in the file search dialog",
          "author_name": "xintaofei",
          "author_login": "xintaofei",
          "committed_at": "2026-07-20T11:09:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ce624deaaf635749ef8802dd71dcd9bee9c7fa3e",
          "body": "The right-sidebar file tree can now be operated entirely from the\nkeyboard, IntelliJ-style.\n\n- Up/Down move the selection between visible rows; Right expands a\n  collapsed directory or steps into its first child; Left collapses an\n  expanded directory or moves to the parent.\n- Enter or Space opens t\n[…]\nted row is highlighted and kept scrolled into view, and the\n  tree is a single tab stop that exposes the active row through\n  aria-activedescendant instead of making every row individually\n  tabbable.",
          "is_bot": false,
          "headline": "feat(file-tree): add keyboard navigation to the workspace file tree",
          "author_name": "xintaofei",
          "author_login": "xintaofei",
          "committed_at": "2026-07-20T11:06:36Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "40b30a0e8fa94eb973755994a618b1c564061ae8",
          "body": "The Grok settings panel now offers a choice of how to authenticate,\ninstead of always exposing a single XAI_API_KEY field.\n\n- Authentication is a choice of official subscription (`grok login`), an\n  XAI_API_KEY, or a custom endpoint; the panel shows only the credential\n  the chosen method needs.\n- T\n[…]\ne.\n- Subscription mode relies on the `grok login` credential: any inherited\n  XAI_API_KEY is cleared for the launched session, and a copyable sign-in\n  command is shown.\n- The ten locales are updated.",
          "is_bot": false,
          "headline": "feat(grok): add authentication-method selection to the settings panel",
          "author_name": "xintaofei",
          "author_login": "xintaofei",
          "committed_at": "2026-07-20T09:09:28Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "de53f8c226f7b5e69f7101e7bdc73a69cd68b873",
          "body": "…chrome\n\nWhen a workspace background image is enabled, render inline code, user-message bubbles, delegation cards, and the Monaco sticky-scroll header as translucent frosted surfaces so they blend into the image instead of appearing as opaque blocks.\n\nDraw the browser-style titlebar tabs at equal wi\n[…]\nle the window-chrome reserve with the app zoom level so the top-right controls no longer overflow at high zoom.\n\nFix the delegation card rendering a blank icon for the Cursor and Grok sub-agent types.",
          "is_bot": false,
          "headline": "feat(workspace): polish the background-image appearance and titlebar …",
          "author_name": "xintaofei",
          "author_login": "xintaofei",
          "committed_at": "2026-07-20T08:59:24Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "a813de385affd700f0cf8dc5ff64fcdd20122d14",
          "body": "On a remote-desktop window, the status bar now shows the connected workspace's name — with its address in a hover tooltip — to the left of the session count. The agent icon list that sat to the right of the count is removed.",
          "is_bot": false,
          "headline": "feat(workspace): show the remote workspace name in the status bar",
          "author_name": "xintaofei",
          "author_login": "xintaofei",
          "committed_at": "2026-07-20T07:25:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "18318d22175c280647f5a901b590beb87524779b",
          "body": "- feat(acp): **Cursor joins as the 12th coding agent.** Sign in with your subscription or an API key, pick a model, and use it like any other agent — with full session history, MCP, and delegation.\n- fix(chat): **Images now work with Grok and other embedded-context agents.** Pasted images show as th\n[…]\n在打开时聚焦。** 输入框会与你选择的智能体保持同步,并在会话一打开就获得焦点,而不再等到 ACP 连接建立之后。\n- 修复(命令):**命令的运行状态在侧边栏重开后得以保留。** 关闭再打开侧边栏时,命令会保留其运行状态与你的选择,而不会被重置。\n- 修复(工作台):**背景图打磨。** 背景图现在会透过右侧栏头显示,不透明度滑块范围也更大——遮罩最高可达 99%,面板最低可至完全透明的 0%。",
          "is_bot": false,
          "headline": "# Release version 0.21.1",
          "author_name": "xintaofei",
          "author_login": "xintaofei",
          "committed_at": "2026-07-19T14:11:17Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c27be5dff8aec8285fa2d25ffe3d220ae3e9b4c7",
          "body": "Allow the mask opacity up to 99% and the panel opacity down to 0%.",
          "is_bot": false,
          "headline": "feat(workspace): widen the background opacity slider ranges",
          "author_name": "xintaofei",
          "author_login": "xintaofei",
          "committed_at": "2026-07-19T13:53:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a91780aa4b87a45122f7559dc4966fa58496a06a",
          "body": null,
          "is_bot": false,
          "headline": "Merge remote-tracking branch 'origin/main'",
          "author_name": "xintaofei",
          "author_login": "xintaofei",
          "committed_at": "2026-07-19T13:46:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "689a55ce0bc292c88475860227205c8f2ae4866b",
          "body": "The Cursor settings panel now lists the account's models and offers only\nthe authentication the cursor-agent CLI actually supports.\n\n- Authentication is a choice of official subscription (browser sign-in)\n  or a Cursor API key for headless/server machines; the custom\n  API-endpoint field is removed,\n[…]\nin credential: any inherited\n  CURSOR_API_KEY / CURSOR_API_BASE_URL is cleared for the settings probes\n  and the launched session, and the probes test the on-screen key.\n- The ten locales are updated.",
          "is_bot": false,
          "headline": "fix(cursor): rework the settings panel's authentication and model picker",
          "author_name": "xintaofei",
          "author_login": "xintaofei",
          "committed_at": "2026-07-19T13:45:53Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "9b16eee55f3ca343c8217da6658a3b1172424194",
          "body": "…tion",
          "is_bot": false,
          "headline": "fix(chat): focus the composer on open instead of after the ACP connec…",
          "author_name": "xintaofei",
          "author_login": "xintaofei",
          "committed_at": "2026-07-19T12:13:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a2e2103685d7c2eebf40084286989f4b3b243792",
          "body": null,
          "is_bot": false,
          "headline": "Merge remote-tracking branch 'origin/main'",
          "author_name": "xintaofei",
          "author_login": "xintaofei",
          "committed_at": "2026-07-19T10:56:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8fdf0b43d0b4ec0bde40836bd1ca42d378259a22",
          "body": "# Conflicts:\n#\tsrc-tauri/src/acp/connection.rs\n#\tsrc-tauri/src/paths.rs\n#\tsrc/components/message/message-list-view.test.tsx\n#\tsrc/components/message/message-list-view.tsx",
          "is_bot": false,
          "headline": "Merge remote-tracking branch 'origin/main'",
          "author_name": "xintaofei",
          "author_login": "xintaofei",
          "committed_at": "2026-07-19T10:52:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "31e81b5ba93d700c1e60f69d0f7742d098f8ef96",
          "body": "…eader\n\nWith a workspace background image set, the right sidebar's top tab strip\nnow goes transparent to reveal the image — matching the column body and\nthe conversation/file tab strips — and draws a hairline bottom border to\nseparate it from the tab content, instead of the frosted surface that\nleft the top reading as a detached panel. Without a background image the\nstrip is unchanged.",
          "is_bot": false,
          "headline": "fix(workspace): show the background image through the right sidebar h…",
          "author_name": "xintaofei",
          "author_login": "xintaofei",
          "committed_at": "2026-07-19T10:51:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d75198eb6abc1d7651c8ffed1ab4d3487e7c20cf",
          "body": "Picking an agent on the new-session screen now fully switches to it,\ninstead of leaving the composer on the previously selected agent and\nsilently accepting an uninstalled pick.\n\n- The connection at a tab is keyed by a stable tab id, so a just-switched\n  draft (or one whose switch was blocked by the\n[…]\nhe doomed auto-connect, replacing a connect-time\n  toast that could be deduped or superseded away.\n- Not-installed agents are flagged in the picker with a badge and tooltip\n  while staying selectable.",
          "is_bot": false,
          "headline": "fix(chat): keep the new-session composer in sync with the selected agent",
          "author_name": "xintaofei",
          "author_login": "xintaofei",
          "committed_at": "2026-07-19T10:17:09Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "ba35438b90ae79355e7cf17289961217f81edb1d",
          "body": "Registry, managed install (whole-tree binary distribution), history\nparser for Cursor's protobuf store.db sessions, native MCP management\n(~/.cursor/mcp.json), and per-launch codeg-mcp delegation for Cursor.\n\n- structured config panel: model, permission mode, Run Everything\n  toggle, sandbox mode, a\n[…]\nrns surface completion time from any sub-turn\n  in the reply's footer\n- task sub-agent cards fold the wire title into the card description\n- README agent matrix and the ten locales cover the new agent",
          "is_bot": false,
          "headline": "feat(acp): integrate Cursor as the 12th ACP agent",
          "author_name": "xintaofei",
          "author_login": "xintaofei",
          "committed_at": "2026-07-19T07:38:13Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "0f14ee9c6008669531083568d21d90204df678cf",
          "body": "Closing and reopening the right sidebar no longer loses the command\nlauncher's state.\n\n- Run/Stop linkage now lives in a module-level store keyed by command\n  id, so it survives the panel unmounting, and is derived against live\n  terminals — a command whose terminal ended while the panel was closed\n\n[…]\nnot running instead of a stale Stop.\n- The last selected or run command is restored per folder on reopen; it\n  is persisted only on an explicit pick or run and no longer resets to\n  the first command.",
          "is_bot": false,
          "headline": "fix(commands): preserve run state and selection across sidebar reopen",
          "author_name": "xintaofei",
          "author_login": "xintaofei",
          "committed_at": "2026-07-19T05:44:58Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c9c1dff695df3f061145c862f84e599efc0b3cd4",
          "body": "Grok carries a user image as an embedded resource (image mime + blob), but every user-message display path recognized only native image blocks: the sent bubble dropped the image, and a reopened session showed an empty attachment bubble instead of the picture.\n\nNormalize an image-mime embedded resour\n[…]\ns_from_prompt), and the Grok transcript parser, which also merges the prose and image chunks of one prompt into a single user turn. Existing image rendering is reused and the wire format is unchanged.",
          "is_bot": false,
          "headline": "fix(chat): display embedded-resource images in user message bubbles",
          "author_name": "xintaofei",
          "author_login": "xintaofei",
          "committed_at": "2026-07-19T05:05:42Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "2a2472a0bd62080d6443d3b5a1549be05263a4c0",
          "body": "Agents that advertise `image: false` with `embedded_context: true` (e.g. Grok) accept images only as embedded resources, so a pasted image took the generic file path and rendered as an inline file badge instead of a top thumbnail like image-capable agents.\n\nRoute pasted/dropped/picked images to the \n[…]\nnd time — a native image block when supported, otherwise an embedded resource blob — leaving the sent payload unchanged per agent. Image-mime embedded resources restore as thumbnails on queue re-edit.",
          "is_bot": false,
          "headline": "fix(chat): show pasted images as thumbnails for embedded-context agents",
          "author_name": "xintaofei",
          "author_login": "xintaofei",
          "committed_at": "2026-07-19T05:05:21Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "0a79636d210b493a232f0e3692efbfc709945d7c",
          "body": "Every 16ms live-message batch replaces the session object, so the per-session\ntimeline memo missed and rebuilt all four phases plus the dedup pass on each\nbatch — the one per-frame cost that grew with conversation length. The\npersisted/local/background/optimistic prefix is now cached on the detail\no\n[…]\nl is rebuilt per\nbatch: a tail with no key collisions appends via a fast path, and collisions\nfall back to the full role-aware dedup with unchanged keep-first (user) /\nkeep-last (assistant) semantics.",
          "is_bot": false,
          "headline": "perf(chat): memoize stable timeline prefix across live-message batches",
          "author_name": "xintaofei",
          "author_login": "xintaofei",
          "committed_at": "2026-07-19T03:04:28Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "6ffb7b8472674711d9f9cc42360250463255c954",
          "body": "Multi-sub-turn assistant replies were re-merged into fresh\ngroup/parts/sourceTurns objects on every streaming batch, defeating the memo\nof every merged card in the viewport. mergeConsecutiveAssistantTurns now\nreuses the merged item while the run's membership (member group references\nand item keys) i\n[…]\nstreaming turn still\nrebuild each batch by design. The showStats/isRoleTransition/\npreviousUserIndex pass resets each flag before recomputing so a cached item\ncannot carry stale values across renders.",
          "is_bot": false,
          "headline": "perf(chat): cache merged assistant groups across streaming batches",
          "author_name": "xintaofei",
          "author_login": "xintaofei",
          "committed_at": "2026-07-19T03:04:18Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "3f9336d795993d4c5b43519216abe0f559326c44",
          "body": "…ssage cards\n\nRadix Collapsible measures its content on every open-on-mount (disable\nanimation, getBoundingClientRect, restore), which turned a history\nconversation full of expanded cards into a forced-layout storm inside a\nsingle React commit — while nothing ever consumed the measured CSS\nvariables\n[…]\nt-when-closed contract, with close\nanimations still playing via a lightweight exit presence that never reads\nlayout. Non-message collapsibles (file tree, commit card, settings) keep\nthe Radix version.",
          "is_bot": false,
          "headline": "perf(message): replace radix collapsible with measure-free fold in me…",
          "author_name": "xintaofei",
          "author_login": "xintaofei",
          "committed_at": "2026-07-19T03:04:11Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "399327450b770e5358b8b9e591c4706bc0e313e8",
          "body": "…wrapper\n\nUntiled, nothing in the conversation tile wrapper can scroll, yet its\nalways-initialized OverlayScrollbars instance answered every streaming DOM\nmutation with a forced-reflow scrollWidth read — the largest single JS cost\nin performance traces. The new TileScrollContainer keeps the host/con\n[…]\n(so toggling tile mode never remounts the\nconversation subtree or tears down a live response) and only creates the\nOverlayScrollbars decoration while tiling is on, destroying it when tiling\nturns off.",
          "is_bot": false,
          "headline": "perf(chat): skip overlayscrollbars init for the untiled conversation …",
          "author_name": "xintaofei",
          "author_login": "xintaofei",
          "committed_at": "2026-07-19T03:04:03Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c3f4e2e152e1a44813bfd68104b67b7d90f2477f",
          "body": "@monaco-editor/react keeps a model alive for every path it has shown:\nswitching paths only setModel()s away and unmount disposes just the attached\none, so each file opened during a session left its model (full text,\ntokenization, undo stack) in the registry after its tab closed. The workspace\npanel \n[…]\nchedToEditor()\nand scoped strictly to its own URIs, so models owned by others (diff\neditors' anonymous pairs) are never touched. The keep-set derivation lives\nin collectLiveModelPaths with unit tests.",
          "is_bot": false,
          "headline": "fix(files): dispose orphaned monaco models when file tabs close",
          "author_name": "xintaofei",
          "author_login": "xintaofei",
          "committed_at": "2026-07-19T03:03:57Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "5c88766dd5fd7c254227c5e6adca03b73d8355e7",
          "body": "The rich-diff viewer passed keepCurrentOriginalModel/keepCurrentModifiedModel\nwhile feeding plain strings, so the two anonymous Monaco models it creates per\nmount were never disposed — every diff open or switch leaked both. Dropping\nthe flags lets the library dispose them on unmount; the commit, unstash, and\npush dialogs reuse the same viewer and are covered too.",
          "is_bot": false,
          "headline": "fix(files): dispose diff editor models on unmount",
          "author_name": "xintaofei",
          "author_login": "xintaofei",
          "committed_at": "2026-07-19T03:03:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "07d9eb1e558d12c61f87e28dec5932676982430f",
          "body": "- feat(workspace): **A redesigned four-column desktop workspace.** Sidebar, conversation, file, and aux panel each get a full-height column with its own top bar; tabs move into the title bar, and new conversation and file detail headers carry quick actions.\n- feat(aux-panel): **A new Session Details\n[…]\n在会呈现给所有正在查看的人。** 它会同步进你打开的会话,而不必等到重新加载后才出现。\n- 修复(聊天):**更清晰的输入框边框与选中的快捷操作标签。** 静息边框在任何主题下及背景图之上都清晰可见,当前标签也更突出。\n- 更新(智能体):**内置智能体已刷新。** Cline 3.0.44、CodeBuddy Code 2.124.0、Kimi Code 0.27.0、Grok 0.2.103。",
          "is_bot": false,
          "headline": "# Release version 0.21.0",
          "author_name": "xintaofei",
          "author_login": "xintaofei",
          "committed_at": "2026-07-18T13:56:32Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "5a6a4595ed7a60a075ac1ad3dad9d18cbc19e2dc",
          "body": "Update Cline to 3.0.44, CodeBuddy to 2.124.0, Kimi Code to 0.27.0,\nand Grok to 0.2.103.",
          "is_bot": false,
          "headline": "chore(acp): bump pinned agent CLI versions",
          "author_name": "xintaofei",
          "author_login": "xintaofei",
          "committed_at": "2026-07-18T13:52:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3701dabaee69892d91edb19d5b132edef47f57bf",
          "body": "…rettier",
          "is_bot": false,
          "headline": "style(test): wrap ask-question-result-card answer object to satisfy p…",
          "author_name": "xintaofei",
          "author_login": "xintaofei",
          "committed_at": "2026-07-18T13:37:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0677fa5e6989394eb211024b9a7bff010faba785",
          "body": "…r to see\n\nDarken the composer's resting border, which was near-invisible by default and\nvanished entirely over a workspace background image, so it stays legible in\nevery theme. Give the welcome quick-action tabs a muted frosted bar with a\nringed active pill so the selected tab clearly stands out from the rest.",
          "is_bot": false,
          "headline": "fix(chat): make the composer border and active quick-action tab easie…",
          "author_name": "xintaofei",
          "author_login": "xintaofei",
          "committed_at": "2026-07-18T13:10:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b06192d8b53e416a2166689331a616957bc13608",
          "body": null,
          "is_bot": false,
          "headline": "Merge remote-tracking branch 'origin/main'",
          "author_name": "xintaofei",
          "author_login": "xintaofei",
          "committed_at": "2026-07-18T12:30:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3f417ecacb039a2cd5357f084aec354f4d4d7188",
          "body": "…faces\n\nAdd a workspace background image configurable from appearance settings, with\nadjustable image blur, mask opacity, panel opacity, and fill mode. When\nenabled, chrome surfaces (sidebar, panels, tab strip, terminal, status bar,\nand cards) turn semi-transparent and frosted to reveal the image, while\ncanvas surfaces (editor and conversation/file overlays) become fully\ntransparent. The image persists on disk and applies in both desktop and\nserver modes.",
          "is_bot": false,
          "headline": "feat(workspace): add a customizable background image with frosted sur…",
          "author_name": "xintaofei",
          "author_login": "xintaofei",
          "committed_at": "2026-07-18T12:07:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c67e62e2a4aa71ad37a5a6cc5216d9e42a5d99a3",
          "body": "A client viewing a conversation whose reply completes on another client\nhad no path to render that reply: turn promotion is gated on the\nconnection's prompting→connected edge, which a short reply's live stream\ncan miss, and the conversation://changed side-channel only refreshed the\nsidebar, never th\n[…]\ny-viewed conversation on a conversation://changed nudge and\ncommits the reply once it settles. It no-ops for the owner (which holds\nthe reply in memory) and backs off across the transcript-flush race.",
          "is_bot": false,
          "headline": "fix(sync): sync a completed reply to clients only viewing a conversation",
          "author_name": "xintaofei",
          "author_login": "xintaofei",
          "committed_at": "2026-07-18T11:00:44Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "581125fd799332c0cc84afc61f08e2187185bbe5",
          "body": null,
          "is_bot": false,
          "headline": "Merge remote-tracking branch 'origin/main'",
          "author_name": "xintaofei",
          "author_login": "xintaofei",
          "committed_at": "2026-07-18T04:23:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e9e002f70e2ea6149b6a7e9447d60aee1bfb3a40",
          "body": "…oser\n\nMake the workspace file tree draggable:\n\n- Drag a file or directory onto another directory, or onto the workspace root,\n  to move it there. A new move_file_tree_entry command backs both the desktop\n  and server runtimes and rejects no-op, into-self, and into-descendant moves.\n- Drag a file or\n[…]\n a row selects it, and the selection, hover, and\n  drop-target states share one inset row highlight, while the drag shows a\n  compact labeled chip.\n- Add the move-failure toast across the ten locales.",
          "is_bot": false,
          "headline": "feat(file-tree): drag entries to move them or attach them to the comp…",
          "author_name": "xintaofei",
          "author_login": "xintaofei",
          "committed_at": "2026-07-18T04:22:34Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "bca2e829acfc05561b538f334b494b60691415e8",
          "body": "Grok's built-in ask_user_question arrives as a blocking _x.ai/ask_user_question\nACP ext request rather than the codeg-mcp tool, so it previously fell back to\ngrok's inert fire-and-forget rendering: an unanswerable dead card. Bridge it into\ncodeg's interactive question card through the existing quest\n[…]\nd and\ndeclined) when reloading a past conversation, both rendering the picks instead of\nan empty selection. The redundant raw ask tool_call is suppressed so only the\ninteractive/answered card renders.",
          "is_bot": false,
          "headline": "feat(grok): support the native ask_user_question tool",
          "author_name": "xintaofei",
          "author_login": "xintaofei",
          "committed_at": "2026-07-18T01:44:59Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "864afdec286d0a4e4e9bdeb04e9ed9c907c6b41c",
          "body": null,
          "is_bot": false,
          "headline": "feat(workspace): collapse the right sidebar tabs into a menu when narrow",
          "author_name": "xintaofei",
          "author_login": "xintaofei",
          "committed_at": "2026-07-17T17:01:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "589e19adc880f65cba902d6218fe72d2d1b45999",
          "body": "Folders can now be given an optional alias via a \"Set alias\" action in the\nsidebar folder context menu (opened from either the three-dot button or a\nright-click); the alias is persisted to the database.\n\nWhen set, the sidebar folder row and the conversation detail header display\n\"alias [ name ]\", wi\n[…]\nal name in a slightly deeper shade\nthan the folder name; clearing it restores the plain name. Includes the schema\nmigration, the dual-mode command and web route, and localized strings for all\nlocales.",
          "is_bot": false,
          "headline": "feat(workspace): add persistent folder aliases",
          "author_name": "xintaofei",
          "author_login": "xintaofei",
          "committed_at": "2026-07-17T16:27:28Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "7d6f4434abc31a6125259ce1e829936f5d7cc72c",
          "body": "…ders\n\nGive the desktop sidebar header the same subtle bottom divider as the conversation detail header so the top bars align across the workspace. Keep the existing full-strength divider in the mobile sheet.",
          "is_bot": false,
          "headline": "refactor(workspace): align the sidebar header divider with detail hea…",
          "author_name": "xintaofei",
          "author_login": "xintaofei",
          "committed_at": "2026-07-17T15:18:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2ad2e8ed0742cb7172c5e797efe19d2db3f1cb74",
          "body": "The Monaco editor canvas was a fixed white / #171717 regardless of the selected\ntheme color. Derive its background (editor, gutter, and peek surfaces) from the\nactive theme's --card token so it reads as the app's card surface: the neutral\nand gray presets are unchanged and the accent presets carry their hue. Each\nMonaco theme name now encodes both light/dark and the color, and the sync hook\nwatches data-theme so switching either axis re-applies through the theme prop.",
          "is_bot": false,
          "headline": "feat(editor): follow the theme color for the editor background",
          "author_name": "xintaofei",
          "author_login": "xintaofei",
          "committed_at": "2026-07-17T14:57:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "eef28edfc70fdf97dce1033ba2a7402549111925",
          "body": "The light background, card, and popover of the seven accent presets stayed pure\nwhite while every other surface — and the dark-mode canvas — already carried the\ntheme hue. Give them the faintest tint in the ramp so the light canvas joins the\ntheme and matches dark mode.",
          "is_bot": false,
          "headline": "feat(appearance): tint the light-mode canvas with the accent theme color",
          "author_name": "xintaofei",
          "author_login": "xintaofei",
          "committed_at": "2026-07-17T14:57:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6cb48ed3497d25f67fcc188b3906a41c542f6bf4",
          "body": "… the file breadcrumb popover\n\nRender the aux-panel session details tab and the file header directory popover with the shared ScrollArea so their scrollbars match the thin themed scrollbar used across the rest of the workspace instead of the default browser scrollbar.",
          "is_bot": false,
          "headline": "refactor(workspace): use the shared ScrollArea in session details and…",
          "author_name": "xintaofei",
          "author_login": "xintaofei",
          "committed_at": "2026-07-17T14:10:12Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7a8544519f78e2167246635894081493610650fa",
          "body": "The seven accent presets (red, rose, orange, green, blue, yellow, violet)\nused zinc gray for their muted, secondary, accent, border, input, sidebar,\nand dark background surfaces, so only the primary and ring carried the theme\ncolor. Rotate those surfaces onto each preset's own hue at low chroma so m\n[…]\nnvas, and the translucent\ndark-mode borders stay as-is, keeping the accent presets consistent with the\nneutral gray presets. The neutral presets (neutral, zinc, slate, stone, gray)\nare left unchanged.",
          "is_bot": false,
          "headline": "feat(appearance): tint neutral surfaces with the accent theme color",
          "author_name": "xintaofei",
          "author_login": "xintaofei",
          "committed_at": "2026-07-17T13:58:27Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "4d74a0ff5b399d271a31b3716a9f805f1ef71a37",
          "body": null,
          "is_bot": false,
          "headline": "Merge remote-tracking branch 'origin/cv-main-0716'",
          "author_name": "xintaofei",
          "author_login": "xintaofei",
          "committed_at": "2026-07-17T12:25:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cefcc57a4953710963afb0c4660008b4cf498b7e",
          "body": "- Content-size the browser-style conversation/file tabs, inline their close\n  buttons, and center the tab separators on the strip midline, so the\n  new-conversation button hugs the last tab.\n- Give the file detail header a folder path breadcrumb, match its font to the\n  conversation header, and ligh\n[…]\np and\n  defer the cross-folder aux rebuild so switching tabs stays responsive.\n- Add the file path breadcrumb, conversation-locate context, and window-chrome\n  metrics modules with their translations.",
          "is_bot": false,
          "headline": "refactor(workspace): refine desktop tabs, detail headers, and aux panel",
          "author_name": "xintaofei",
          "author_login": "xintaofei",
          "committed_at": "2026-07-17T10:48:23Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c341570c4c1630ccf64a1905d3f3da4944eb2277",
          "body": null,
          "is_bot": false,
          "headline": "docs(readme): add OneHop sponsor across all locales",
          "author_name": "xintaofei",
          "author_login": "xintaofei",
          "committed_at": "2026-07-17T06:38:37Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6b0c31b0fbcb7065d9e32127afe85624033e933a",
          "body": "…ar columns + Codex-style edge chrome\n\nSplit the desktop workspace into four full-height columns\n[sidebar | conversation | file | aux panel], with vertical dividers\nrunning from top to bottom; drop the full-width title bar and give each\ncolumn its own h-10 top bar. Move window chrome to the four cor\n[…]\ntcuts and the search/directory dialogs into a\nheadless WorkspaceChromeController; collapse FolderTitleBar to\nmobile-only. Aux/sidebar minimum widths are tiered by platform to clear\nthe native caption.",
          "is_bot": false,
          "headline": "refactor(workspace): rebuild desktop shell into four independent-topb…",
          "author_name": "xintaofei",
          "author_login": "xintaofei",
          "committed_at": "2026-07-16T16:39:49Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b49635494ca99bebbddf75d69664db364330ae02",
          "body": "- fix(pet): **Desktop pets with extra animations now install and display correctly.** The marketplace's new \"v2\" pets add animation rows that codeg used to reject or render squished. It now adapts to each spritesheet's real size, keeping every pet sharp.\n- fix(chat): **Cleaner command and skill badg\n[…]\n*已发送消息里的命令与技能徽章更清爽。** 徽章只显示名称,去掉开头的 `/` 或 `$`,与编辑时一致。发送给智能体的内容保持不变。\n- 更新(智能体):**内置智能体已刷新。** OpenCode(1.18.3)、Cline(3.0.42)、CodeBuddy Code(2.123.1)、Kimi Code(0.26.0)已更新;Claude Code 的 ACP 适配器固定到 0.58.1。",
          "is_bot": false,
          "headline": "# Release version 0.20.4",
          "author_name": "xintaofei",
          "author_login": "xintaofei",
          "committed_at": "2026-07-16T16:34:12Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d2278d5ec7bb1729a85df4e23657d7576d2fd828",
          "body": "- Claude Code claude-agent-acp 0.59.0 -> 0.58.1\n- OpenCode 1.17.20 -> 1.18.3\n- Cline 3.0.40 -> 3.0.42\n- CodeBuddy 2.121.2 -> 2.123.1\n- Kimi Code 0.24.1 -> 0.26.0",
          "is_bot": false,
          "headline": "chore(acp): update pinned agent versions",
          "author_name": "xintaofei",
          "author_login": "xintaofei",
          "committed_at": "2026-07-16T16:09:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6b2006dfa838e86abb5149cb5f9248fe4c8e9736",
          "body": "… detail headers\n\n- Relocate the conversation and file tab strips into the desktop title bar; tabs shrink browser-style to share the row without a scrollbar, a draggable divider splits the two groups, and the leftover row stays a window-drag region.\n- Add a fixed conversation detail header above the\n[…]\ng the preview/source toggle, open-in-browser, and maximize actions.\n- Shift the macOS traffic lights down to stay centered in the taller workspace title bar for the local and remote workspace windows.",
          "is_bot": false,
          "headline": "feat(workspace): host tabs in the title bar and add conversation/file…",
          "author_name": "xintaofei",
          "author_login": "xintaofei",
          "committed_at": "2026-07-16T13:31:21Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "0582a511e234aab933673a4265f21ba62eda246d",
          "body": "…ctors\n\nAdd a Session Details tab to the right panel as its first and default tab, showing the active conversation's metadata and live token usage. Move the git branch selector and command launcher out of the workspace title bar into this tab, and keep the panel and its toggle available in chat sessions.",
          "is_bot": false,
          "headline": "feat(aux-panel): add Session Details tab with branch and command sele…",
          "author_name": "xintaofei",
          "author_login": "xintaofei",
          "committed_at": "2026-07-16T08:38:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fb3b85b7d627316994cebf718e685b1ea383075e",
          "body": "…ranscript\n\nCommand and skill badges in the sent-message transcript now display the bare\nname without the leading /·$ prefix, matching the composer's inline badges. The\nwire invocation token (/command, $skill) is unchanged, so agents still receive\nthe literal text.",
          "is_bot": false,
          "headline": "fix(chat): drop /·$ prefix from command and skill badges in message t…",
          "author_name": "xintaofei",
          "author_login": "xintaofei",
          "committed_at": "2026-07-16T06:02:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "758f50205ad8628c78e69100c15681fcc01050d0",
          "body": "The marketplace now ships v2 pets whose sheet appends two animation rows\n(1536x2288, 11 rows) onto the base 9-row 1536x1872 layout. codeg assumed a\nfixed 8x9 grid, so v2 pets failed to install outright and rendered squished.\n\n- Install validation accepts any 1536-wide sheet whose height is a whole\n \n[…]\nws are appended.\n- The pet manifest preserves unknown fields (spriteVersionNumber, kind)\n  through install and edit instead of dropping them.\n- The spritesheet spec hint is updated across all locales.",
          "is_bot": false,
          "headline": "fix(pet): support variable-height v2 marketplace spritesheets",
          "author_name": "xintaofei",
          "author_login": "xintaofei",
          "committed_at": "2026-07-16T05:58:00Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "7c48df5ac4aa56912436983447af5b1ba061f3de",
          "body": "- feat(chat-channel): **Telegram Topic mode.** Run multiple sessions inside one Telegram forum supergroup, each bound to its own topic. `/task <description>` opens a new topic and session, `/resume <id>` binds an existing one, and plain text follows up in the current topic. Requires a forum supergro\n[…]\nworkspace 配置,** 容器与自托管部署可正常构建。感谢 @AnotiaWang(#322)。\n- 更新(智能体):**内置智能体已刷新** —— Claude Code(0.59.0)、OpenCode(1.17.20)、OpenClaw(2026.7.1)、Cline(3.0.40)、CodeBuddy(2.121.2)、Kimi Code(0.24.1)、Grok(0.2.101)。",
          "is_bot": false,
          "headline": "# Release version 0.20.3",
          "author_name": "xintaofei",
          "author_login": "xintaofei",
          "committed_at": "2026-07-14T16:43:10Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "6c4441f76bd6ec5ec8c1290f73d14740530b4fc8",
          "body": null,
          "is_bot": false,
          "headline": "Merge remote-tracking branch 'origin/main'",
          "author_name": "xintaofei",
          "author_login": "xintaofei",
          "committed_at": "2026-07-14T16:26:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2832fd1ed661be3b98c821230a9b7f4ba247228d",
          "body": "- Claude Code claude-agent-acp 0.58.1 -> 0.59.0\n- OpenCode 1.17.18 -> 1.17.20\n- OpenClaw 2026.6.11 -> 2026.7.1 (raise Node floor to 22.22.3)\n- Cline 3.0.39 -> 3.0.40\n- CodeBuddy 2.118.2 -> 2.121.2\n- Kimi Code 0.23.5 -> 0.24.1\n- Grok 0.2.94 -> 0.2.101",
          "is_bot": false,
          "headline": "chore(acp): update pinned agent versions",
          "author_name": "xintaofei",
          "author_login": "xintaofei",
          "committed_at": "2026-07-14T16:26:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "851667f1b166441f7bf0838298b6d11006ed7472",
          "body": "Codex agents can now define custom models and curate the model list from a\nstructured editor in the agent settings and the model-provider dialogs, instead\nof a raw JSON field. A custom entry clones an official model as its base and\noverrides only the fields that differ; enum-valued fields (reasoning\n[…]\nodex falls back to its own catalog, and a\npre-existing hand-written catalog is imported into the editor on load. A notice\nexplains the whole-table-replace behavior whenever a customization is present.",
          "is_bot": false,
          "headline": "feat(codex): custom model catalog sourced from the launched codex",
          "author_name": "xintaofei",
          "author_login": "xintaofei",
          "committed_at": "2026-07-14T15:33:34Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "12e2b158e680d734a011eeb200ec19694a6b5cdf",
          "body": "…d turns\n\nclaude-agent-acp 0.59.0 keeps a turn's prompt open while a spawned async\nsub-agent runs, streaming its completion live as the tail of that same turn\n(#870). Reconcile the transcript watcher with the live view so held-turn\ncontent no longer double-renders, the launch card fills in its resul\n[…]\ndicator arms only for settlements whose reply arrives\n  out of turn, so an already-visible held reply no longer strands it.\n- A turn that ends abnormally releases its tracked background tasks at once.",
          "is_bot": false,
          "headline": "fix(acp): correct async sub-agent background task rendering under hel…",
          "author_name": "xintaofei",
          "author_login": "xintaofei",
          "committed_at": "2026-07-14T15:26:31Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "6e61082954840c5a2c3a378c21d6ca83fc7edc50",
          "body": "…s all paths\n\nCapture the persisted-history boundary at send time (per batch) instead of reading detail at backfill: a mid-stream detail refetch or an agent's persisted partial reply can no longer shift it. Both the owner send and a co-controller's echoed prompt capture the boundary, on every dedup \n[…]\nparse tail, head-aligning when the parse lags so a later reply never inherits an earlier one's usage/duration, and retry the backfill on the latest reply's coverage rather than the last emitted patch.",
          "is_bot": false,
          "headline": "fix(chat): bound per-turn stats backfill to the current session acros…",
          "author_name": "xintaofei",
          "author_login": "xintaofei",
          "committed_at": "2026-07-13T18:18:05Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "39322512229caea518ac120010a344864b28f9bb",
          "body": "The post-turn metadata backfill aligned this session's local turns against the full reparse (persisted history + new turns) and its offset roll-up folded the leading parsed turns' duration and usage into the first local turn. After resuming a conversation the offset equals the history length, so the\n[…]\nt the persisted-history boundary so only this session's slice of the parse is folded, and emit no patch when the reparse has not yet caught up to the new reply so the retry applies the complete parse.",
          "is_bot": false,
          "headline": "fix(chat): correct first-reply stats after resuming a conversation",
          "author_name": "xintaofei",
          "author_login": "xintaofei",
          "committed_at": "2026-07-13T16:57:35Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "bd73b2061aedc8d3532b37e6b879fc9796434857",
          "body": null,
          "is_bot": false,
          "headline": "Merge remote-tracking branch 'origin/main'",
          "author_name": "xintaofei",
          "author_login": "xintaofei",
          "committed_at": "2026-07-13T16:18:12Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "38ed09bc50d9a31bdffd20c88f2f841979595885",
          "body": "…fort\n\nPermission mode now uses grok's real `--permission-mode` enum\n(default/acceptEdits/auto/dontAsk/bypassPermissions/plan) instead of the\ncodeg-invented ask/always-approve markers grok rejects. Legacy values are\nmigrated on read, the selected mode is handed to the ACP launch as\n`--permission-mod\n[…]\nincludes the model's default even\nwhen it sits outside the switchable list (grok-4.5's Max/xhigh), with a\ndescription on every option.\n\nThe custom Model ID field now shows grok-4.5 as its placeholder.",
          "is_bot": false,
          "headline": "feat(grok): real permission-mode enum and model-reactive reasoning ef…",
          "author_name": "xintaofei",
          "author_login": "xintaofei",
          "committed_at": "2026-07-13T16:16:48Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "72954c36636a12aaf2f5d290dcd83fbd3396bac9",
          "body": "Exercise the real create, save, duplicate, import, and delete paths against a temporary HOME so the central store and agent links resolve inside a throwaway tree, covering the destructive remove_dir_all delete and the unlink-before-delete ordering that were previously untested, and assert that path-traversal ids are rejected and cannot escape the store.\n\nUnix-only, since dirs::home_dir ignores $HOME on Windows. Enables the temp-env async_closure feature used by the async test helper.",
          "is_bot": false,
          "headline": "test(skills): cover custom skill filesystem mutations",
          "author_name": "xintaofei",
          "author_login": "xintaofei",
          "committed_at": "2026-07-13T15:44:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "807b62245cc98385b64dc36b7a735f18519bbbfd",
          "body": "…ndings\n\nThe bot token is embedded in every Telegram API URL, and reqwest's error Display appends that URL, so a transport error exposed the token both in the logs and in the chat message returned on a failed topic create or edit. Scrub the token from every error string before it is surfaced.\n\nTopic\n[…]\ntopic missed its binding and a second /task spawned a duplicate agent. Resolve an @username to its numeric chat id, cached, and use it for both the created topic's binding target and inbound matching.",
          "is_bot": false,
          "headline": "fix(chat-channel): redact Telegram bot token and resolve @username bi…",
          "author_name": "xintaofei",
          "author_login": "xintaofei",
          "committed_at": "2026-07-13T15:44:28Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d2da2da7d8a842daf38398fcba72530fa47b7a91",
          "body": "[codex] Recover ACP runtime errors from snapshots",
          "is_bot": false,
          "headline": "Merge pull request #314 from ijry/codex/snapshot-last-error-rebased",
          "author_name": "XinTaoFei",
          "author_login": "xintaofei",
          "committed_at": "2026-07-13T11:33:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "dca1328e29e8435419a6d774da7065b507705583",
          "body": "The pi and kimi skill_storage_spec tests read the process-global $HOME while computing both the spec and the expected paths; a concurrent temp_env HOME-mutating test could flip $HOME between the two reads and fail the assertion. Wrap both in temp_env::with_vars to pin $HOME (and clear the PI_CODING_\n[…]\n overrides) so they serialize with those tests and read one consistent home. Expected paths stay derived from the production helpers, keeping them correct on Windows where dirs::home_dir ignores HOME.",
          "is_bot": false,
          "headline": "test(acp): pin HOME in skill-storage spec tests to remove isolation race",
          "author_name": "xintaofei",
          "author_login": "xintaofei",
          "committed_at": "2026-07-13T11:20:34Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "43c6eefa73ff172fe96e980b5789fb4e9e77a47d",
          "body": null,
          "is_bot": false,
          "headline": "Merge remote-tracking branch 'origin/main'",
          "author_name": "xintaofei",
          "author_login": "xintaofei",
          "committed_at": "2026-07-13T10:58:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7f936656b823ecb647fbd5e20ac8aaf202318f74",
          "body": "fix(editor): preserve Windows IME composition",
          "is_bot": false,
          "headline": "Merge pull request #332 from youxikexue/fix/windows-ime-composition",
          "author_name": "XinTaoFei",
          "author_login": "xintaofei",
          "committed_at": "2026-07-13T10:52:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3698a8534e5d37bb76c147c3bbc5bb1d840ad4fa",
          "body": "feat(chat-channel): support Telegram forum topic mode",
          "is_bot": false,
          "headline": "Merge pull request #322 from AnotiaWang/feat/telegram-topic-mode",
          "author_name": "XinTaoFei",
          "author_login": "xintaofei",
          "committed_at": "2026-07-13T10:51:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c1ccd8d0110cae1ccb00f195a35e1f63506abdbd",
          "body": "fix: compute completed session runtime from timestamps",
          "is_bot": false,
          "headline": "Merge pull request #311 from cnYui/codex/fix-agent-runtime-duration",
          "author_name": "XinTaoFei",
          "author_login": "xintaofei",
          "committed_at": "2026-07-13T10:50:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "22eabe835137b5037ad3b5517de540b6a162f9a2",
          "body": "Let users author their own skills in the shared central store and enable\nthem across any agent from the skill matrix, so a skill is written once\nand reused everywhere instead of maintained per agent.\n\n- Create, edit, duplicate, and delete skills backed by ~/.codeg/skills\n- Import from a local folder\n[…]\n skills at once from an existing agent's global skills\n- Recognize custom skills by exclusion from the built-in expert, science,\n  and office packs, so folders dropped into the store appear on refresh",
          "is_bot": false,
          "headline": "feat(skills): add custom skills tab to skill packs settings",
          "author_name": "xintaofei",
          "author_login": "xintaofei",
          "committed_at": "2026-07-13T10:49:23Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "a394661b1b95160593019382c86772b28002d03f",
          "body": "…rection\n\nLock in HYDRATE_FROM_SNAPSHOT error behavior: a fresh snapshot recovers a\nlast_error the client missed live, and a stale snapshot must not resurrect an\nerror the current turn already cleared. The stale case fails against the\npre-fix reducer. Fixtures also set backgroundOutstanding for completeness.",
          "is_bot": false,
          "headline": "test(acp): cover snapshot last_error fresh recovery + stale non-resur…",
          "author_name": "xintaofei",
          "author_login": "xintaofei",
          "committed_at": "2026-07-13T10:17:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "62d6cd1018377d4dd25dd3c65a41d89d5341e223",
          "body": "HYDRATE_FROM_SNAPSHOT's stale (event_seq <= lastAppliedSeq) path folded a\nsnapshot's lastError back via `current.error ?? patch.lastError`. Since\n`error` is a current-state field cleared on a new prompt (STATUS_CHANGED ->\nprompting), a late stale snapshot generated between an error and the next\nprom\n[…]\ner until the following prompt. Recover the snapshot error only on\nthe fresh path, matching how status / configStale / backgroundOutstanding\nare already treated (current-state fields, fresh-path only).",
          "is_bot": false,
          "headline": "fix(acp): don't recover snapshot error on the stale race-guard path",
          "author_name": "xintaofei",
          "author_login": "xintaofei",
          "committed_at": "2026-07-13T09:50:17Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c60aae545226a88d0a47ac8acc2067f13a8bf50a",
          "body": null,
          "is_bot": false,
          "headline": "fix: recover ACP errors from session snapshots",
          "author_name": "jry",
          "author_login": null,
          "committed_at": "2026-07-13T09:48:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        }
      ],
      "releases_count": 100,
      "commits_last_year": 1861,
      "latest_release_at": "2026-07-21T16:46:00Z",
      "latest_release_tag": "v0.21.4",
      "releases_from_tags": false,
      "days_since_last_push": 0,
      "active_weeks_last_year": 20,
      "days_since_latest_release": 0,
      "mean_days_between_releases": 1.2
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": false,
      "health_percentage": 42,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": false
    },
    "ecosystem": {
      "packages": []
    },
    "popularity": {
      "forks": 276,
      "stars": 2302,
      "watchers": 9,
      "fork_history": {
        "days": [
          {
            "date": "2026-03-07",
            "count": 5
          },
          {
            "date": "2026-03-08",
            "count": 5
          },
          {
            "date": "2026-03-09",
            "count": 3
          },
          {
            "date": "2026-03-11",
            "count": 2
          },
          {
            "date": "2026-03-12",
            "count": 1
          },
          {
            "date": "2026-03-13",
            "count": 2
          },
          {
            "date": "2026-03-14",
            "count": 1
          },
          {
            "date": "2026-03-16",
            "count": 2
          },
          {
            "date": "2026-03-18",
            "count": 1
          },
          {
            "date": "2026-03-19",
            "count": 3
          },
          {
            "date": "2026-03-20",
            "count": 2
          },
          {
            "date": "2026-03-21",
            "count": 2
          },
          {
            "date": "2026-03-22",
            "count": 1
          },
          {
            "date": "2026-03-23",
            "count": 4
          },
          {
            "date": "2026-03-24",
            "count": 1
          },
          {
            "date": "2026-03-27",
            "count": 2
          },
          {
            "date": "2026-03-28",
            "count": 1
          },
          {
            "date": "2026-03-31",
            "count": 1
          },
          {
            "date": "2026-04-01",
            "count": 1
          },
          {
            "date": "2026-04-02",
            "count": 4
          },
          {
            "date": "2026-04-04",
            "count": 1
          },
          {
            "date": "2026-04-05",
            "count": 2
          },
          {
            "date": "2026-04-08",
            "count": 2
          },
          {
            "date": "2026-04-10",
            "count": 3
          },
          {
            "date": "2026-04-11",
            "count": 2
          },
          {
            "date": "2026-04-12",
            "count": 1
          },
          {
            "date": "2026-04-13",
            "count": 4
          },
          {
            "date": "2026-04-14",
            "count": 3
          },
          {
            "date": "2026-04-15",
            "count": 2
          },
          {
            "date": "2026-04-17",
            "count": 3
          },
          {
            "date": "2026-04-18",
            "count": 2
          },
          {
            "date": "2026-04-19",
            "count": 4
          },
          {
            "date": "2026-04-20",
            "count": 1
          },
          {
            "date": "2026-04-22",
            "count": 3
          },
          {
            "date": "2026-04-23",
            "count": 3
          },
          {
            "date": "2026-04-24",
            "count": 3
          },
          {
            "date": "2026-04-25",
            "count": 4
          },
          {
            "date": "2026-04-26",
            "count": 4
          },
          {
            "date": "2026-04-27",
            "count": 1
          },
          {
            "date": "2026-04-29",
            "count": 2
          },
          {
            "date": "2026-04-30",
            "count": 2
          },
          {
            "date": "2026-05-02",
            "count": 1
          },
          {
            "date": "2026-05-04",
            "count": 1
          },
          {
            "date": "2026-05-06",
            "count": 3
          },
          {
            "date": "2026-05-07",
            "count": 3
          },
          {
            "date": "2026-05-08",
            "count": 1
          },
          {
            "date": "2026-05-09",
            "count": 4
          },
          {
            "date": "2026-05-10",
            "count": 3
          },
          {
            "date": "2026-05-11",
            "count": 5
          },
          {
            "date": "2026-05-12",
            "count": 3
          },
          {
            "date": "2026-05-13",
            "count": 1
          },
          {
            "date": "2026-05-14",
            "count": 1
          },
          {
            "date": "2026-05-15",
            "count": 1
          },
          {
            "date": "2026-05-16",
            "count": 1
          },
          {
            "date": "2026-05-20",
            "count": 3
          },
          {
            "date": "2026-05-21",
            "count": 1
          },
          {
            "date": "2026-05-22",
            "count": 1
          },
          {
            "date": "2026-05-23",
            "count": 3
          },
          {
            "date": "2026-05-24",
            "count": 1
          },
          {
            "date": "2026-05-25",
            "count": 4
          },
          {
            "date": "2026-05-26",
            "count": 5
          },
          {
            "date": "2026-05-27",
            "count": 1
          },
          {
            "date": "2026-05-28",
            "count": 4
          },
          {
            "date": "2026-05-29",
            "count": 1
          },
          {
            "date": "2026-05-30",
            "count": 1
          },
          {
            "date": "2026-05-31",
            "count": 3
          },
          {
            "date": "2026-06-01",
            "count": 1
          },
          {
            "date": "2026-06-02",
            "count": 1
          },
          {
            "date": "2026-06-04",
            "count": 3
          },
          {
            "date": "2026-06-05",
            "count": 4
          },
          {
            "date": "2026-06-06",
            "count": 1
          },
          {
            "date": "2026-06-07",
            "count": 3
          },
          {
            "date": "2026-06-08",
            "count": 1
          },
          {
            "date": "2026-06-09",
            "count": 2
          },
          {
            "date": "2026-06-10",
            "count": 2
          },
          {
            "date": "2026-06-11",
            "count": 4
          },
          {
            "date": "2026-06-12",
            "count": 3
          },
          {
            "date": "2026-06-13",
            "count": 2
          },
          {
            "date": "2026-06-14",
            "count": 6
          },
          {
            "date": "2026-06-15",
            "count": 3
          },
          {
            "date": "2026-06-16",
            "count": 3
          },
          {
            "date": "2026-06-17",
            "count": 1
          },
          {
            "date": "2026-06-18",
            "count": 2
          },
          {
            "date": "2026-06-22",
            "count": 2
          },
          {
            "date": "2026-06-23",
            "count": 5
          },
          {
            "date": "2026-06-25",
            "count": 3
          },
          {
            "date": "2026-06-26",
            "count": 5
          },
          {
            "date": "2026-06-27",
            "count": 4
          },
          {
            "date": "2026-06-28",
            "count": 2
          },
          {
            "date": "2026-06-29",
            "count": 3
          },
          {
            "date": "2026-06-30",
            "count": 1
          },
          {
            "date": "2026-07-01",
            "count": 2
          },
          {
            "date": "2026-07-02",
            "count": 1
          },
          {
            "date": "2026-07-03",
            "count": 1
          },
          {
            "date": "2026-07-06",
            "count": 1
          },
          {
            "date": "2026-07-07",
            "count": 2
          },
          {
            "date": "2026-07-08",
            "count": 2
          },
          {
            "date": "2026-07-09",
            "count": 3
          },
          {
            "date": "2026-07-10",
            "count": 3
          },
          {
            "date": "2026-07-11",
            "count": 2
          },
          {
            "date": "2026-07-12",
            "count": 4
          },
          {
            "date": "2026-07-13",
            "count": 4
          },
          {
            "date": "2026-07-14",
            "count": 2
          },
          {
            "date": "2026-07-15",
            "count": 3
          },
          {
            "date": "2026-07-16",
            "count": 5
          },
          {
            "date": "2026-07-17",
            "count": 5
          },
          {
            "date": "2026-07-18",
            "count": 4
          },
          {
            "date": "2026-07-19",
            "count": 2
          },
          {
            "date": "2026-07-20",
            "count": 2
          },
          {
            "date": "2026-07-21",
            "count": 3
          },
          {
            "date": "2026-07-22",
            "count": 5
          }
        ],
        "complete": true,
        "collected": 275,
        "total_forks": 276
      },
      "star_history": {
        "days": [
          {
            "date": "2026-05-26",
            "count": 12
          },
          {
            "date": "2026-05-27",
            "count": 15
          },
          {
            "date": "2026-05-28",
            "count": 19
          },
          {
            "date": "2026-05-29",
            "count": 14
          },
          {
            "date": "2026-05-30",
            "count": 21
          },
          {
            "date": "2026-05-31",
            "count": 29
          },
          {
            "date": "2026-06-01",
            "count": 25
          },
          {
            "date": "2026-06-02",
            "count": 8
          },
          {
            "date": "2026-06-03",
            "count": 5
          },
          {
            "date": "2026-06-04",
            "count": 16
          },
          {
            "date": "2026-06-05",
            "count": 21
          },
          {
            "date": "2026-06-06",
            "count": 9
          },
          {
            "date": "2026-06-07",
            "count": 26
          },
          {
            "date": "2026-06-08",
            "count": 18
          },
          {
            "date": "2026-06-09",
            "count": 18
          },
          {
            "date": "2026-06-10",
            "count": 14
          },
          {
            "date": "2026-06-11",
            "count": 14
          },
          {
            "date": "2026-06-12",
            "count": 20
          },
          {
            "date": "2026-06-13",
            "count": 5
          },
          {
            "date": "2026-06-14",
            "count": 20
          },
          {
            "date": "2026-06-15",
            "count": 14
          },
          {
            "date": "2026-06-16",
            "count": 7
          },
          {
            "date": "2026-06-17",
            "count": 12
          },
          {
            "date": "2026-06-18",
            "count": 8
          },
          {
            "date": "2026-06-19",
            "count": 5
          },
          {
            "date": "2026-06-20",
            "count": 7
          },
          {
            "date": "2026-06-21",
            "count": 5
          },
          {
            "date": "2026-06-22",
            "count": 22
          },
          {
            "date": "2026-06-23",
            "count": 25
          },
          {
            "date": "2026-06-24",
            "count": 15
          },
          {
            "date": "2026-06-25",
            "count": 12
          },
          {
            "date": "2026-06-26",
            "count": 29
          },
          {
            "date": "2026-06-27",
            "count": 22
          },
          {
            "date": "2026-06-28",
            "count": 15
          },
          {
            "date": "2026-06-29",
            "count": 20
          },
          {
            "date": "2026-06-30",
            "count": 19
          },
          {
            "date": "2026-07-01",
            "count": 19
          },
          {
            "date": "2026-07-02",
            "count": 18
          },
          {
            "date": "2026-07-03",
            "count": 11
          },
          {
            "date": "2026-07-04",
            "count": 9
          },
          {
            "date": "2026-07-05",
            "count": 7
          },
          {
            "date": "2026-07-06",
            "count": 14
          },
          {
            "date": "2026-07-07",
            "count": 10
          },
          {
            "date": "2026-07-08",
            "count": 10
          },
          {
            "date": "2026-07-09",
            "count": 14
          },
          {
            "date": "2026-07-10",
            "count": 11
          },
          {
            "date": "2026-07-11",
            "count": 24
          },
          {
            "date": "2026-07-12",
            "count": 23
          },
          {
            "date": "2026-07-13",
            "count": 28
          },
          {
            "date": "2026-07-14",
            "count": 17
          },
          {
            "date": "2026-07-15",
            "count": 17
          },
          {
            "date": "2026-07-16",
            "count": 34
          },
          {
            "date": "2026-07-17",
            "count": 45
          },
          {
            "date": "2026-07-18",
            "count": 28
          },
          {
            "date": "2026-07-19",
            "count": 12
          },
          {
            "date": "2026-07-20",
            "count": 22
          },
          {
            "date": "2026-07-21",
            "count": 46
          },
          {
            "date": "2026-07-22",
            "count": 15
          }
        ],
        "complete": false,
        "collected": 1000,
        "total_stars": 2302
      },
      "open_issues_and_prs": 112
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [
        "examples"
      ],
      "has_llms_txt": false,
      "has_dockerfile": true,
      "has_mcp_signal": false,
      "bootstrap_files": [],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [
        "tsconfig.json"
      ],
      "toolchain_manifests": [
        "src-tauri/Cargo.toml",
        "src-tauri/vendor/sacp-tokio/Cargo.toml"
      ],
      "largest_source_bytes": 476107,
      "source_files_sampled": 1041,
      "oversized_source_files": 44,
      "agent_instruction_files": [
        "AGENTS.md",
        "CLAUDE.md"
      ],
      "agent_instruction_max_bytes": 5506
    },
    "dependencies": {
      "manifests": [
        "package.json",
        "src-tauri/Cargo.toml"
      ],
      "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": [
        "crates",
        "npm"
      ],
      "dependencies": [
        {
          "name": "@base-ui/react",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.1.0"
        },
        {
          "name": "@fontsource-variable/fira-code",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^5.2.7"
        },
        {
          "name": "@fontsource-variable/geist",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^5.2.9"
        },
        {
          "name": "@fontsource-variable/geist-mono",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^5.2.8"
        },
        {
          "name": "@fontsource-variable/inter",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^5.2.8"
        },
        {
          "name": "@fontsource-variable/jetbrains-mono",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^5.2.8"
        },
        {
          "name": "@monaco-editor/react",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^4.7.0"
        },
        {
          "name": "@radix-ui/react-use-controllable-state",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.2.2"
        },
        {
          "name": "@streamdown/cjk",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.0.2"
        },
        {
          "name": "@streamdown/code",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.0.2"
        },
        {
          "name": "@streamdown/math",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.0.2"
        },
        {
          "name": "@streamdown/mermaid",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.0.2"
        },
        {
          "name": "@tauri-apps/api",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^2"
        },
        {
          "name": "@tauri-apps/plugin-dialog",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^2.6.0"
        },
        {
          "name": "@tauri-apps/plugin-opener",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^2"
        },
        {
          "name": "@tauri-apps/plugin-process",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^2.3.1"
        },
        {
          "name": "@tauri-apps/plugin-updater",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^2.10.0"
        },
        {
          "name": "@tauri-apps/plugin-window-state",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "~2.4.1"
        },
        {
          "name": "@tiptap/core",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "3.26.0"
        },
        {
          "name": "@tiptap/extension-placeholder",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "3.26.0"
        },
        {
          "name": "@tiptap/markdown",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "3.26.0"
        },
        {
          "name": "@tiptap/pm",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "3.26.0"
        },
        {
          "name": "@tiptap/react",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "3.26.0"
        },
        {
          "name": "@tiptap/starter-kit",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "3.26.0"
        },
        {
          "name": "@tiptap/suggestion",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "3.26.0"
        },
        {
          "name": "@xterm/addon-fit",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.11.0"
        },
        {
          "name": "@xterm/addon-ligatures",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.10.0"
        },
        {
          "name": "@xterm/addon-web-links",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.12.0"
        },
        {
          "name": "@xterm/xterm",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^6.0.0"
        },
        {
          "name": "ai",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^6.0.78"
        },
        {
          "name": "ansi-to-react",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^6.2.6"
        },
        {
          "name": "class-variance-authority",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.7.1"
        },
        {
          "name": "clsx",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^2.1.1"
        },
        {
          "name": "cmdk",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.1.1"
        },
        {
          "name": "date-fns",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^4.1.0"
        },
        {
          "name": "html-to-image",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.11.13"
        },
        {
          "name": "ignore",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^7.0.5"
        },
        {
          "name": "katex",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.16.45"
        },
        {
          "name": "lucide-react",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.563.0"
        },
        {
          "name": "mdast-util-from-markdown",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^2.0.2"
        },
        {
          "name": "monaco-editor",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.55.1"
        },
        {
          "name": "motion",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^12.34.0"
        },
        {
          "name": "next",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^16"
        },
        {
          "name": "next-intl",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^4.8.3"
        },
        {
          "name": "next-themes",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.4.6"
        },
        {
          "name": "overlayscrollbars",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^2.15.1"
        },
        {
          "name": "overlayscrollbars-react",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.5.6"
        },
        {
          "name": "postcss",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^8.5.6"
        },
        {
          "name": "qrcode.react",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^4.2.0"
        },
        {
          "name": "radix-ui",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.4.3"
        },
        {
          "name": "react",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^19.1.0"
        },
        {
          "name": "react-dom",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^19.1.0"
        },
        {
          "name": "react-markdown",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^10.1.0"
        },
        {
          "name": "react-resizable-panels",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^2.1.9"
        },
        {
          "name": "remark-breaks",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^4.0.0"
        },
        {
          "name": "remark-gfm",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^4.0.1"
        },
        {
          "name": "shadcn",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^3.8.4"
        },
        {
          "name": "shiki",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^3.22.0"
        },
        {
          "name": "sonner",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^2.0.7"
        },
        {
          "name": "streamdown",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^2.2.0"
        },
        {
          "name": "tailwind-merge",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^3.4.0"
        },
        {
          "name": "tailwindcss",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^4.1.18"
        },
        {
          "name": "use-stick-to-bottom",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.1.3"
        },
        {
          "name": "virtua",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.48.8"
        },
        {
          "name": "zustand",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^5.0.14"
        },
        {
          "name": "tauri",
          "manifest": "src-tauri/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "2"
        },
        {
          "name": "tauri-plugin-opener",
          "manifest": "src-tauri/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "2"
        },
        {
          "name": "tauri-plugin-dialog",
          "manifest": "src-tauri/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "2"
        },
        {
          "name": "async-trait",
          "manifest": "src-tauri/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.1"
        },
        {
          "name": "serde",
          "manifest": "src-tauri/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1"
        },
        {
          "name": "serde_json",
          "manifest": "src-tauri/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1"
        },
        {
          "name": "chrono",
          "manifest": "src-tauri/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.4"
        },
        {
          "name": "chrono-tz",
          "manifest": "src-tauri/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.10"
        },
        {
          "name": "cron",
          "manifest": "src-tauri/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.12"
        },
        {
          "name": "thiserror",
          "manifest": "src-tauri/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "2"
        },
        {
          "name": "dirs",
          "manifest": "src-tauri/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "6"
        },
        {
          "name": "if-addrs",
          "manifest": "src-tauri/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.13"
        },
        {
          "name": "walkdir",
          "manifest": "src-tauri/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "2"
        },
        {
          "name": "ignore",
          "manifest": "src-tauri/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.4"
        },
        {
          "name": "sacp",
          "manifest": "src-tauri/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "11.0.0"
        },
        {
          "name": "sacp-tokio",
          "manifest": "src-tauri/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "11.0.0"
        },
        {
          "name": "tokio",
          "manifest": "src-tauri/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1"
        },
        {
          "name": "uuid",
          "manifest": "src-tauri/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1"
        },
        {
          "name": "futures",
          "manifest": "src-tauri/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.3"
        },
        {
          "name": "futures-lite",
          "manifest": "src-tauri/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "2"
        },
        {
          "name": "reqwest",
          "manifest": "src-tauri/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.12"
        },
        {
          "name": "flate2",
          "manifest": "src-tauri/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1"
        },
        {
          "name": "bzip2",
          "manifest": "src-tauri/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.5"
        },
        {
          "name": "tar",
          "manifest": "src-tauri/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.4"
        },
        {
          "name": "zip",
          "manifest": "src-tauri/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "2"
        },
        {
          "name": "regex",
          "manifest": "src-tauri/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1"
        },
        {
          "name": "portable-pty",
          "manifest": "src-tauri/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.8"
        },
        {
          "name": "urlencoding",
          "manifest": "src-tauri/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "2"
        },
        {
          "name": "fix-path-env",
          "manifest": "src-tauri/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.0.0"
        },
        {
          "name": "sea-orm",
          "manifest": "src-tauri/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1.1"
        },
        {
          "name": "sea-orm-migration",
          "manifest": "src-tauri/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1.1"
        },
        {
          "name": "rusqlite",
          "manifest": "src-tauri/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.32"
        },
        {
          "name": "toml",
          "manifest": "src-tauri/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.8"
        },
        {
          "name": "toml_edit",
          "manifest": "src-tauri/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.19"
        },
        {
          "name": "serde_yaml",
          "manifest": "src-tauri/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.9"
        },
        {
          "name": "notify",
          "manifest": "src-tauri/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "6"
        },
        {
          "name": "base64",
          "manifest": "src-tauri/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.22"
        },
        {
          "name": "agent-client-protocol-schema",
          "manifest": "src-tauri/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.11"
        },
        {
          "name": "kill_tree",
          "manifest": "src-tauri/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.2"
        },
        {
          "name": "which",
          "manifest": "src-tauri/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "7"
        },
        {
          "name": "keyring",
          "manifest": "src-tauri/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "3"
        },
        {
          "name": "axum",
          "manifest": "src-tauri/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.8"
        },
        {
          "name": "async_zip",
          "manifest": "src-tauri/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.0.18"
        },
        {
          "name": "tower-http",
          "manifest": "src-tauri/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.6"
        },
        {
          "name": "tokio-tungstenite",
          "manifest": "src-tauri/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.26"
        },
        {
          "name": "futures-util",
          "manifest": "src-tauri/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.3"
        },
        {
          "name": "tokio-util",
          "manifest": "src-tauri/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.7"
        },
        {
          "name": "prost",
          "manifest": "src-tauri/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.13"
        },
        {
          "name": "rand",
          "manifest": "src-tauri/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.8"
        },
        {
          "name": "qrcode",
          "manifest": "src-tauri/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.14"
        },
        {
          "name": "image",
          "manifest": "src-tauri/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.25"
        },
        {
          "name": "include_dir",
          "manifest": "src-tauri/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.7"
        },
        {
          "name": "sha2",
          "manifest": "src-tauri/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.10"
        },
        {
          "name": "aes-gcm",
          "manifest": "src-tauri/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.10"
        },
        {
          "name": "argon2",
          "manifest": "src-tauri/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.5"
        },
        {
          "name": "tempfile",
          "manifest": "src-tauri/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "3"
        },
        {
          "name": "minisign-verify",
          "manifest": "src-tauri/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.2"
        },
        {
          "name": "semver",
          "manifest": "src-tauri/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1"
        },
        {
          "name": "tracing",
          "manifest": "src-tauri/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.1"
        },
        {
          "name": "tracing-subscriber",
          "manifest": "src-tauri/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.3"
        },
        {
          "name": "tracing-appender",
          "manifest": "src-tauri/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.2"
        }
      ],
      "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": 23,
        "merged_prs": 20,
        "open_issues": 89,
        "closed_ratio": 0.704,
        "closed_issues": 212,
        "closed_unmerged_prs": 21
      },
      "bus_factor": 1,
      "bot_contributors": 0,
      "top_contributors": [
        {
          "type": "User",
          "login": "xintaofei",
          "commits": 1826,
          "avatar_url": "https://avatars.githubusercontent.com/u/247335392?v=4"
        },
        {
          "type": "User",
          "login": "AnotiaWang",
          "commits": 7,
          "avatar_url": "https://avatars.githubusercontent.com/u/62269186?v=4"
        },
        {
          "type": "User",
          "login": "Kwensiu",
          "commits": 5,
          "avatar_url": "https://avatars.githubusercontent.com/u/240436088?v=4"
        },
        {
          "type": "User",
          "login": "pia",
          "commits": 4,
          "avatar_url": "https://avatars.githubusercontent.com/u/6829895?v=4"
        },
        {
          "type": "User",
          "login": "Jasion-han",
          "commits": 3,
          "avatar_url": "https://avatars.githubusercontent.com/u/64348627?v=4"
        },
        {
          "type": "User",
          "login": "hsqbyte",
          "commits": 2,
          "avatar_url": "https://avatars.githubusercontent.com/u/22915141?v=4"
        },
        {
          "type": "User",
          "login": "isYangs",
          "commits": 2,
          "avatar_url": "https://avatars.githubusercontent.com/u/110588441?v=4"
        },
        {
          "type": "User",
          "login": "H1d3rOne",
          "commits": 1,
          "avatar_url": "https://avatars.githubusercontent.com/u/176208217?v=4"
        },
        {
          "type": "User",
          "login": "mvanhorn",
          "commits": 1,
          "avatar_url": "https://avatars.githubusercontent.com/u/455140?v=4"
        },
        {
          "type": "User",
          "login": "cnYui",
          "commits": 1,
          "avatar_url": "https://avatars.githubusercontent.com/u/132864240?v=4"
        }
      ],
      "contributors_sampled": 12,
      "top_contributor_share": 0.985
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "release.yml",
        "test.yml"
      ],
      "has_docs_dir": true,
      "linter_configs": [
        "eslint.config.mjs"
      ],
      "has_editorconfig": true,
      "has_linter_config": true,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [
        "Cargo.lock",
        "pnpm-lock.yaml"
      ],
      "scorecard": {
        "checks": [
          {
            "name": "Binary-Artifacts",
            "score": 10,
            "reason": "no binaries found in the repo",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
          },
          {
            "name": "Branch-Protection",
            "score": 0,
            "reason": "branch protection not enabled on development/release branches",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
          },
          {
            "name": "CI-Tests",
            "score": null,
            "reason": "no pull request found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#ci-tests"
          },
          {
            "name": "CII-Best-Practices",
            "score": 0,
            "reason": "no effort to earn an OpenSSF best practices badge detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#cii-best-practices"
          },
          {
            "name": "Code-Review",
            "score": 0,
            "reason": "Found 0/30 approved changesets -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 3,
            "reason": "project has 1 contributing companies or organizations -- score normalized to 3",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
          },
          {
            "name": "Dangerous-Workflow",
            "score": 10,
            "reason": "no dangerous workflow patterns detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
          },
          {
            "name": "Dependency-Update-Tool",
            "score": 0,
            "reason": "no update tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
          },
          {
            "name": "Fuzzing",
            "score": 0,
            "reason": "project is not fuzzed",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
          },
          {
            "name": "License",
            "score": 10,
            "reason": "license file detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
          },
          {
            "name": "Maintained",
            "score": 10,
            "reason": "30 commit(s) and 9 issue activity found in the last 90 days -- score normalized to 10",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
          },
          {
            "name": "Packaging",
            "score": 10,
            "reason": "packaging workflow detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
          },
          {
            "name": "Pinned-Dependencies",
            "score": 0,
            "reason": "dependency not pinned by hash detected -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
          },
          {
            "name": "SAST",
            "score": 0,
            "reason": "no SAST tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
          },
          {
            "name": "Security-Policy",
            "score": 0,
            "reason": "security policy file not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
          },
          {
            "name": "Signed-Releases",
            "score": 8,
            "reason": "5 out of the last 5 releases have a total of 5 signed artifacts.",
            "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": "158 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "f073b659e8732745fed42adae83d31219175b278",
        "ran_at": "2026-07-22T08:03:15Z",
        "aggregate_score": 3.8,
        "scorecard_version": "v5.5.0"
      },
      "has_codeql_workflow": false,
      "has_security_policy": false,
      "has_dependabot_config": false
    },
    "contribution_flow": {
      "collected": true,
      "ci_last_run_at": "2026-07-21T16:46:02Z",
      "oldest_open_prs": [
        {
          "number": 55,
          "created_at": "2026-04-02T05:18:49Z",
          "last_comment_at": "2026-04-03T13:19:54Z",
          "last_comment_author": "isYangs"
        },
        {
          "number": 119,
          "created_at": "2026-04-26T13:03:56Z",
          "last_comment_at": "2026-05-02T03:33:40Z",
          "last_comment_author": "MoozLee"
        },
        {
          "number": 124,
          "created_at": "2026-04-27T06:12:20Z",
          "last_comment_at": "2026-05-01T10:52:32Z",
          "last_comment_author": "MoozLee"
        },
        {
          "number": 163,
          "created_at": "2026-05-11T01:55:42Z",
          "last_comment_at": "2026-05-11T09:59:00Z",
          "last_comment_author": "nzlov"
        },
        {
          "number": 225,
          "created_at": "2026-05-28T13:48:08Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 237,
          "created_at": "2026-06-02T05:44:30Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 277,
          "created_at": "2026-06-12T11:35:45Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 282,
          "created_at": "2026-06-14T00:50:32Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 286,
          "created_at": "2026-06-15T23:25:45Z",
          "last_comment_at": "2026-07-20T03:02:34Z",
          "last_comment_author": "zengxiongzhuo"
        },
        {
          "number": 287,
          "created_at": "2026-06-17T01:39:55Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 292,
          "created_at": "2026-06-17T09:28:44Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 296,
          "created_at": "2026-06-19T10:51:40Z",
          "last_comment_at": "2026-06-19T12:59:14Z",
          "last_comment_author": "ijry"
        },
        {
          "number": 298,
          "created_at": "2026-06-19T13:22:16Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 302,
          "created_at": "2026-06-23T11:26:59Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 309,
          "created_at": "2026-06-28T10:37:30Z",
          "last_comment_at": "2026-07-13T12:30:17Z",
          "last_comment_author": "xintaofei"
        },
        {
          "number": 337,
          "created_at": "2026-07-14T06:43:50Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 338,
          "created_at": "2026-07-14T09:29:49Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 341,
          "created_at": "2026-07-15T01:08:51Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 342,
          "created_at": "2026-07-15T01:15:07Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 343,
          "created_at": "2026-07-15T01:28:20Z",
          "last_comment_at": null,
          "last_comment_author": null
        }
      ],
      "last_merged_pr_at": "2026-07-13T11:33:27Z",
      "ci_last_conclusion": "SUCCESS",
      "oldest_open_issues": [
        {
          "number": 12,
          "created_at": "2026-03-13T00:59:30Z",
          "last_comment_at": "2026-07-01T02:15:11Z",
          "last_comment_author": "damonwg99-lab"
        },
        {
          "number": 28,
          "created_at": "2026-03-22T06:43:36Z",
          "last_comment_at": "2026-04-03T08:15:27Z",
          "last_comment_author": "ZhangSanMo"
        },
        {
          "number": 32,
          "created_at": "2026-03-23T12:29:27Z",
          "last_comment_at": "2026-03-23T12:40:24Z",
          "last_comment_author": "xintaofei"
        },
        {
          "number": 40,
          "created_at": "2026-03-27T01:22:20Z",
          "last_comment_at": "2026-03-27T08:51:37Z",
          "last_comment_author": "xintaofei"
        },
        {
          "number": 88,
          "created_at": "2026-04-19T13:46:47Z",
          "last_comment_at": "2026-04-20T04:46:54Z",
          "last_comment_author": "xintaofei"
        },
        {
          "number": 95,
          "created_at": "2026-04-22T05:43:08Z",
          "last_comment_at": "2026-04-22T11:27:03Z",
          "last_comment_author": "xintaofei"
        },
        {
          "number": 105,
          "created_at": "2026-04-24T04:39:57Z",
          "last_comment_at": "2026-04-24T06:39:43Z",
          "last_comment_author": "xintaofei"
        },
        {
          "number": 110,
          "created_at": "2026-04-25T07:24:47Z",
          "last_comment_at": "2026-05-19T07:13:34Z",
          "last_comment_author": "iLay1678"
        },
        {
          "number": 130,
          "created_at": "2026-04-28T06:23:18Z",
          "last_comment_at": "2026-04-28T06:52:08Z",
          "last_comment_author": "lgq1024"
        },
        {
          "number": 131,
          "created_at": "2026-04-28T06:59:46Z",
          "last_comment_at": "2026-04-29T04:45:05Z",
          "last_comment_author": "xintaofei"
        },
        {
          "number": 132,
          "created_at": "2026-04-28T08:41:01Z",
          "last_comment_at": "2026-04-29T04:42:14Z",
          "last_comment_author": "xintaofei"
        },
        {
          "number": 137,
          "created_at": "2026-04-29T15:27:41Z",
          "last_comment_at": "2026-04-30T10:28:53Z",
          "last_comment_author": "xintaofei"
        },
        {
          "number": 149,
          "created_at": "2026-05-05T14:33:48Z",
          "last_comment_at": "2026-05-15T01:59:39Z",
          "last_comment_author": "xintaofei"
        },
        {
          "number": 152,
          "created_at": "2026-05-06T01:47:45Z",
          "last_comment_at": "2026-05-15T01:59:31Z",
          "last_comment_author": "xintaofei"
        },
        {
          "number": 156,
          "created_at": "2026-05-07T10:21:34Z",
          "last_comment_at": "2026-05-11T09:04:56Z",
          "last_comment_author": "xintaofei"
        },
        {
          "number": 169,
          "created_at": "2026-05-13T02:13:27Z",
          "last_comment_at": "2026-05-20T03:17:15Z",
          "last_comment_author": "qinyongliang"
        },
        {
          "number": 170,
          "created_at": "2026-05-14T01:43:44Z",
          "last_comment_at": "2026-05-14T05:40:43Z",
          "last_comment_author": "WPXSCode"
        },
        {
          "number": 171,
          "created_at": "2026-05-14T07:18:23Z",
          "last_comment_at": "2026-05-15T01:58:49Z",
          "last_comment_author": "xintaofei"
        },
        {
          "number": 172,
          "created_at": "2026-05-14T08:00:07Z",
          "last_comment_at": "2026-05-15T01:58:41Z",
          "last_comment_author": "xintaofei"
        },
        {
          "number": 174,
          "created_at": "2026-05-14T12:41:03Z",
          "last_comment_at": "2026-05-15T01:58:30Z",
          "last_comment_author": "xintaofei"
        }
      ]
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/xintaofei/codeg",
    "host": "github.com",
    "name": "codeg",
    "owner": "xintaofei"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "moderate",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 64,
      "inputs": {
        "security": 38,
        "vitality": 86,
        "community": 66,
        "governance": 37,
        "engineering": 93
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "excellent",
        "name": "Vitality",
        "value": 86,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "good",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 78,
            "inputs": {
              "commits_last_year": 1861,
              "human_commit_share": 1,
              "days_since_last_push": 0,
              "active_weeks_last_year": 20
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 0 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 0
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "20/52 weeks with commits",
                "points": 13.8,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 20
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "1861 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 1861
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "30 commit(s) and 9 issue activity found in the last 90 days -- score normalized to 10",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "release_discipline",
            "band": "excellent",
            "name": "Release discipline",
            "note": null,
            "notes": [],
            "value": 98,
            "inputs": {
              "releases_count": 100,
              "latest_release_tag": "v0.21.4",
              "releases_from_tags": false,
              "days_since_latest_release": 0,
              "mean_days_between_releases": 1.2
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "100 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 100
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 0 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 0
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~1.2 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 1.2
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "openssf_scorecard_signed_releases",
                "name": "OpenSSF Scorecard: Signed-Releases",
                "detail": "5 out of the last 5 releases have a total of 5 signed artifacts.",
                "points": 8,
                "status": "partial",
                "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": "moderate",
        "name": "Community & Adoption",
        "value": 66,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "good",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 80,
            "inputs": {
              "forks": 276,
              "stars": 2302,
              "watchers": 9,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "window_too_short"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "2,302 stars",
                "points": 54.5,
                "status": "partial",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 2302
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "276 forks",
                "points": 20.3,
                "status": "partial",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 276
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "9 watchers",
                "points": 5,
                "status": "partial",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 9
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "moderate",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 50,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "has_contributing": false,
              "has_issue_template": false,
              "has_code_of_conduct": false,
              "has_pull_request_template": false
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 22.5,
                "status": "met",
                "details": [],
                "max_points": 22.5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "recognized license (Apache-2.0)",
                "points": 22.5,
                "status": "met",
                "details": [
                  {
                    "code": "license_standard",
                    "params": {}
                  },
                  {
                    "code": "license_spdx",
                    "params": {
                      "spdx": "Apache-2.0"
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributing_guide",
                "name": "CONTRIBUTING guide",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 18
              },
              {
                "key": "code_of_conduct",
                "name": "Code of conduct",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 13.5
              },
              {
                "key": "issue_template",
                "name": "Issue template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.2
              },
              {
                "key": "pr_template",
                "name": "PR template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.3
              }
            ]
          }
        ],
        "description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
      },
      {
        "key": "governance",
        "band": "at_risk",
        "name": "Sustainability & Governance",
        "value": 37,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "critical",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 26,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 12,
              "top_contributor_share": 0.985
            },
            "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 98% of commits",
                "points": 0.3,
                "status": "partial",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 98
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "12 contributors",
                "points": 13.5,
                "status": "met",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 12
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 1 contributing companies or organizations -- score normalized to 3",
                "points": 3,
                "status": "partial",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "moderate",
            "name": "Issue & PR responsiveness",
            "note": null,
            "notes": [],
            "value": 52,
            "inputs": {
              "merged_prs": 20,
              "open_issues": 89,
              "closed_issues": 212,
              "issue_closed_ratio": 0.704,
              "closed_unmerged_prs": 21
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "70% of issues closed",
                "points": 32.9,
                "status": "partial",
                "details": [
                  {
                    "code": "issues_closed_share",
                    "params": {
                      "share": 70
                    }
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "20/41 decided PRs merged",
                "points": 18.7,
                "status": "partial",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 20,
                      "decided": 41
                    }
                  }
                ],
                "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": "at_risk",
            "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": 35,
            "inputs": {
              "followers": 22,
              "owner_type": "User",
              "is_verified": null,
              "owner_login": "xintaofei",
              "public_repos": 8,
              "account_age_days": 231
            },
            "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": "22 followers of xintaofei",
                "points": 9.8,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 22,
                      "login": "xintaofei"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "8 public repos, account ~0 yr old",
                "points": 8.2,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 8
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 0
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          }
        ],
        "description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?"
      },
      {
        "key": "engineering",
        "band": "excellent",
        "name": "Engineering Quality",
        "value": 93,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "excellent",
            "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": 88,
            "inputs": {
              "has_ci": true,
              "has_tests": true,
              "has_editorconfig": true,
              "has_linter_config": true,
              "has_precommit_config": false
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": "2 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 2
                    }
                  }
                ],
                "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": "eslint.config.mjs",
                "points": 16,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "eslint.config.mjs"
                    }
                  }
                ],
                "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": 6.4,
                "status": "met",
                "details": [],
                "max_points": 6.4
              },
              {
                "key": "openssf_scorecard_ci_tests",
                "name": "OpenSSF Scorecard: CI-Tests",
                "detail": "no pull request found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "excellent",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "topics": [
                "acp",
                "agent",
                "claude-code",
                "code-generation",
                "codex",
                "gemini-cli",
                "openclaw",
                "opencode",
                "worktree",
                "gui",
                "cline",
                "codebuddy",
                "grok-build",
                "hermes-agent",
                "kimi-code",
                "pi"
              ],
              "has_wiki": true,
              "homepage": "https://docs.codeg.app",
              "has_readme": true,
              "has_docs_dir": true,
              "has_description": true
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 30,
                "status": "met",
                "details": [],
                "max_points": 30
              },
              {
                "key": "documentation_directory",
                "name": "Documentation directory",
                "detail": null,
                "points": 25,
                "status": "met",
                "details": [],
                "max_points": 25
              },
              {
                "key": "documentation_homepage_site",
                "name": "Documentation / homepage site",
                "detail": "https://docs.codeg.app",
                "points": 15,
                "status": "met",
                "details": [],
                "max_points": 15
              },
              {
                "key": "repository_description",
                "name": "Repository description",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "topics",
                "name": "Topics",
                "detail": "16 topics",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "topics_count",
                    "params": {
                      "count": 16
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "wiki",
                "name": "Wiki",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          }
        ],
        "description": "Are baseline engineering and documentation practices in place?"
      },
      {
        "key": "security",
        "band": "at_risk",
        "name": "Security",
        "value": 38,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "at_risk",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): CI-Tests. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "ci_tests"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 38,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 17,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 1,
              "scorecard_aggregate": 3.8
            },
            "components": [
              {
                "key": "binary_artifacts",
                "name": "Binary-Artifacts",
                "detail": "no binaries found in the repo",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "branch_protection",
                "name": "Branch-Protection",
                "detail": "branch protection not enabled on development/release branches",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "ci_tests",
                "name": "CI-Tests",
                "detail": "no pull request found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 2.5
              },
              {
                "key": "cii_best_practices",
                "name": "CII-Best-Practices",
                "detail": "no effort to earn an OpenSSF best practices badge detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "code_review",
                "name": "Code-Review",
                "detail": "Found 0/30 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 1 contributing companies or organizations -- score normalized to 3",
                "points": 0.8,
                "status": "partial",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "dangerous_workflow",
                "name": "Dangerous-Workflow",
                "detail": "no dangerous workflow patterns detected",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "dependency_update_tool",
                "name": "Dependency-Update-Tool",
                "detail": "no update tool detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "fuzzing",
                "name": "Fuzzing",
                "detail": "project is not fuzzed",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "license file detected",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "maintained",
                "name": "Maintained",
                "detail": "30 commit(s) and 9 issue activity found in the last 90 days -- score normalized to 10",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "packaging",
                "name": "Packaging",
                "detail": "packaging workflow detected",
                "points": 5,
                "status": "met",
                "details": [],
                "max_points": 5
              },
              {
                "key": "pinned_dependencies",
                "name": "Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "sast",
                "name": "SAST",
                "detail": "no SAST tool detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "security_policy",
                "name": "Security-Policy",
                "detail": "security policy file not detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "signed_releases",
                "name": "Signed-Releases",
                "detail": "5 out of the last 5 releases have a total of 5 signed artifacts.",
                "points": 6,
                "status": "partial",
                "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": "158 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": 4
            },
            "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": 73,
        "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.86,
              "agent_instruction_files": [
                "AGENTS.md",
                "CLAUDE.md"
              ],
              "agent_instruction_max_bytes": 5506
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": "AGENTS.md, CLAUDE.md",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "AGENTS.md, CLAUDE.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": "86 of 100 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 86,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "moderate",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 67,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [
                "Cargo.lock",
                "pnpm-lock.yaml"
              ],
              "has_dockerfile": true,
              "typed_language": true,
              "bootstrap_files": [],
              "has_devcontainer": false,
              "has_linter_config": true,
              "typecheck_configs": [
                "tsconfig.json"
              ],
              "agent_commit_share": 0,
              "toolchain_manifests": [
                "src-tauri/Cargo.toml",
                "src-tauri/vendor/sacp-tokio/Cargo.toml"
              ],
              "dependency_bot_commit_share": 0
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": "src-tauri/Cargo.toml, src-tauri/vendor/sacp-tokio/Cargo.toml (toolchain convention, no task runner)",
                "points": 12.6,
                "status": "partial",
                "details": [
                  {
                    "code": "toolchain_convention",
                    "params": {
                      "files": "src-tauri/Cargo.toml, src-tauri/vendor/sacp-tokio/Cargo.toml"
                    }
                  }
                ],
                "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": "eslint.config.mjs",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "eslint.config.mjs"
                    }
                  }
                ],
                "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": "Dockerfile, lockfile",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "Dockerfile, 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 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "excellent",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 98,
            "inputs": {
              "primary_language": "TypeScript",
              "largest_source_bytes": 476107,
              "source_files_sampled": 1041,
              "oversized_source_files": 44
            },
            "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": "44/1041 source files over 60KB",
                "points": 52.7,
                "status": "partial",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 1041,
                      "oversized": 44
                    }
                  }
                ],
                "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": [
    "Could not fetch crates package 'codeg' from its registry",
    "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-22T08:03:28.927554Z",
  "schema_version": "0.26.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/x/xintaofei/codeg.svg",
  "full_name": "xintaofei/codeg",
  "license_state": "standard",
  "license_spdx": "Apache-2.0"
}

Оцінки — це сигнали, а не гарантії. Вони відображають публічно видимі практики на GitHub — це не аудит коду й не гарантія безпеки.

Відсутні дані виключаються, а ваги перенормовуються — нуль за відсутність ніколи не ставиться. Методологія версіонована й відкрита: метрики v1.13.0, схема v0.26.0 — повна методологія · вікі метрик.

Як окремий результат виглядає на тлі всього реєстру: сукупна статистика.