Public record
Software health reportschema 0.26.0 · metrics 1.13.0 · 2026-07-22 19:12 UTC

itmisx / deepx-code

deepseek标配coding agent、原生支持模型路由、CodeGraph代码图谱、OCR截图识别、自动上下文压缩、最佳工作模式选择,workflow等功能,从根本上节省Token

GoMIT★ 320 stars⑂ 32 forkssince May 2026View on GitHub ↗

itmisx/deepx-code holds a health index of 56 out of 100, placing it in the Moderate band. It scores highest on Vitality (73/100) and lowest on Security (44/100). It was last updated today. A single contributor accounts for most of its recent work.

56
overall / 100
Moderate

Software health index

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

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

Score profile

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

Ownership

itmisxPersonal account
21 followers30 public repossince Oct 2013

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

Package ecosystems

RegistryPackageVersionDownloads / moVersionsLast publishTags
npmdeepxpoints to another repo — not scored0.1.01312193 days agohtmlmvvm

Metrics by category

Vitality

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

73Good · 22% of overall
How it's scored
36/36Push recency — last push 0 days ago
6.9/36Commit cadence — 10/52 weeks with commits
18/18Commit volume — 320 commits in the last year
0/10OpenSSF Scorecard: Maintained — project was created within the last 90 days. Please review its contents carefully
Inputs used
commits_last_year320
human_commit_share1
days_since_last_push0
active_weeks_last_year10
How it's scored
27/27Ships releases — 100 releases published
36/36Release recency — latest release 0 days ago
27/27Release cadence — a release every ~1.8 days
0/10OpenSSF Scorecard: Signed-Releases — Project has not signed or included provenance with any releases.
Inputs used
releases_count100
latest_release_tagv0.2.99
releases_from_tagsno
days_since_latest_release0
mean_days_between_releases1.8

Community & Adoption

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

53Moderate · 18% of overall
How it's scored
40.6/60Stars — 320 stars
12.4/25Forks — 32 forks
3.3/15Watchers — 5 watchers
Inputs used
forks32
stars320
watchers5
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
How it's scored
22.5/22.5README
22.5/22.5License — recognized license (MIT)
0/18CONTRIBUTING guide
0/13.5Code of conduct
0/7.2Issue template
0/6.3PR template
Inputs used
has_readmeyes
has_licenseyes
has_contributingno
has_issue_templateno
has_code_of_conductno
has_pull_request_templateno

Sustainability & Governance

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

48At risk · 24% of overall
How it's scored
9/54Bus factor — 1 contributor(s) cover half of all commits
0.8/22.5Commit distribution — top contributor authored 96% of commits
5.4/13.5Contributor breadth — 4 contributors
0/10OpenSSF Scorecard: Contributors — project has 0 contributing companies or organizations -- score normalized to 0
Inputs used
bus_factor1
contributors_sampled4
top_contributor_share0.963
How it's scored
43.1/46.8Issue resolution — 92% of issues closed
36.5/38.3PR acceptance — 107/112 decided PRs merged
3/15OpenSSF Scorecard: Code-Review — Found 4/15 approved changesets -- score normalized to 2
Inputs used
merged_prs107
open_issues7
closed_issues82
issue_closed_ratio0.921
closed_unmerged_prs5
How it's scored
10/30Ownership backing — personal (user) account
0/20Verified domain — not applicable to user accounts
9.7/25Owner reach — 21 followers of itmisx
22.9/25Track record — 30 public repos, account ~12 yr old
Inputs used
followers21
owner_typeUser
is_verified
owner_loginitmisx
public_repos30
account_age_days4,650
Excluded from scoring (no data or not applicable): Verified domain. Remaining weights renormalized.

Engineering Quality

Are baseline engineering and documentation practices in place?

59Moderate · 20% of overall
How it's scored
24/24CI workflows — 2 workflow(s)
24/24Tests present
0/16Linter config
0/9.6Pre-commit hooks
0/6.4.editorconfig
0/20OpenSSF Scorecard: CI-Tests — 0 out of 14 merged PRs checked by a CI test -- score normalized to 0
Inputs used
has_ciyes
has_testsyes
has_editorconfigno
has_linter_configno
has_precommit_configno
How it's scored
30/30README
0/25Documentation directory
15/15Documentation / homepage site — https://itmisx.github.io/deepx-code/
10/10Repository description
10/10Topics — 9 topics
10/10Wiki
Inputs used
topicsdeepseek, coding-agent, deepseek-tui, codegraph, workflow, agent, ocr, openspec, superpowers
has_wikiyes
homepagehttps://itmisx.github.io/deepx-code/
has_readmeyes
has_docs_dirno
has_descriptionyes

Security

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

44At risk · 16% of overall
How it's scored
7.5/7.5Binary-Artifacts — no binaries found in the repo
4.5/7.5Branch-Protection — branch protection is not maximal on development and all release branches
0/2.5CI-Tests — 0 out of 14 merged PRs checked by a CI test -- score normalized to 0
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
1.5/7.5Code-Review — Found 4/15 approved changesets -- score normalized to 2
0/2.5Contributors — project has 0 contributing companies or organizations -- score normalized to 0
10/10Dangerous-Workflow — no dangerous workflow patterns detected
0/7.5Dependency-Update-Tool — no update tool detected
0/5Fuzzing — project is not fuzzed
2.5/2.5License — license file detected
0/7.5Maintained — project was created within the last 90 days. Please review its contents carefully
5/5Packaging — packaging workflow detected
0/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
0/5SAST — SAST tool is not run on all commits -- score normalized to 0
0/5Security-Policy — security policy file not detected
0/7.5Signed-Releases — Project has not signed or included provenance with any releases.
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
0.8/7.5Vulnerabilities — 9 existing vulnerabilities detected
Inputs used
sourceopenssf_scorecard
checks_evaluated18
scorecard_versionv5.5.0
checks_inconclusive0
scorecard_aggregate3
How it's scored
35/35Direct dependencies free of known advisories — no direct dependency carries a known advisory
25/25Indirect dependencies free of known advisories — no indirect dependency carries a known advisory
0/40No advisories left outstanding — no advisory carries a publication date
Inputs used
sourceosv
advisories0
affected_packages0
assessed_packages2
unassessed_packages0
affected_by_severitynone
direct_affected_packages0
Excluded from scoring (no data or not applicable): No advisories left outstanding. Remaining weights renormalized. Matched the npm:deepx@0.1.0 runtime dependency closure — what installing the published package pulls in — 2 packages. Reachability is not analyzed.

AI Readiness

How well is the repo equipped to be developed and maintained with AI coding agents? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score.

54Moderate · 0% of overall
How it's scored
0/45Agent instructions — no CLAUDE.md / AGENTS.md / editor rules
0/15Machine-readable docs (llms.txt)
35.7/40Legible commit history — 67 of 100 human commits state their intent (structured subject or explanatory body)
Inputs used
has_llms_txtno
legible_history_share0.67
agent_instruction_files
agent_instruction_max_bytes
How it's scored
12.6/18One-command bootstrap — go.mod (toolchain convention, no task runner)
22/22Automated tests
0/11Lint / format config
11/11Static type checking — Go (statically typed)
10/10Reproducible environment — lockfile
0/10Demonstrated agent practice — no agent-authored commits among the last 100
0/8Automated maintenance — no automated dependency updates observed
0/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
Inputs used
has_nixno
has_testsyes
lockfilesgo.sum
has_dockerfileno
typed_languageyes
bootstrap_files
has_devcontainerno
has_linter_configno
typecheck_configs
agent_commit_share0
toolchain_manifestsgo.mod
dependency_bot_commit_share0
How it's scored
45/45Type-checkable code — Go (statically typed)
54.5/55Manageable file sizes — 2/207 source files over 60KB
Inputs used
primary_languageGo
largest_source_bytes160,908
source_files_sampled207
oversized_source_files2
How it's scored
0/40API schema (OpenAPI/GraphQL/proto)
0/20MCP server
40/40Runnable examples — examples
Inputs used
example_dirsexamples
has_mcp_signalno
api_schema_files

Key facts

320GitHub stars
4contributors
320commits, last 12 months
0days since last push
100releases
1bus factor
7open issues
Go, npmpackage ecosystems

Data collection warnings

  • Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token
  • npm package 'deepx' points at a different repository (https://github.com/compositejs/deepx); excluded from ecosystem scoring
  • GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

More detail

Star and fork history 0 ★ / 32 ⇿
0Stars
32Forks
93Releases

When each star and fork was added, collected from GitHub and bucketed by day. Cumulative growth sits directly above the daily additions it is made of, so the two read against each other: steady organic accretion looks nothing like an abrupt, short-lived burst. Where that difference is measurable, it is reported as growth authenticity.

01325383252026-052026-062026-07
Major 0Minor 0Patch 93
OpenSSF Scorecard 3.0 / 10
3.0aggregate

Independent, tool-agnostic security assessment from the open-source OpenSSF Scorecard. Each check rewards a security practice, not a specific vendor's tool. Checks Scorecard could not determine are marked n/a and excluded from the security score (never counted as zero).Scorecard v5.5.0 · 2026-07-22 19:11 UTC

10Binary-Artifactsno binaries found in the repo
6Branch-Protectionbranch protection is not maximal on development and all release branches
0CI-Tests0 out of 14 merged PRs checked by a CI test -- score normalized to 0
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
2Code-ReviewFound 4/15 approved changesets -- score normalized to 2
0Contributorsproject has 0 contributing companies or organizations -- score normalized to 0
10Dangerous-Workflowno dangerous workflow patterns detected
0Dependency-Update-Toolno update tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
0Maintainedproject was created within the last 90 days. Please review its contents carefully
10Packagingpackaging workflow detected
0Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 0
0SASTSAST tool is not run on all commits -- score normalized to 0
0Security-Policysecurity policy file not detected
0Signed-ReleasesProject has not signed or included provenance with any releases.
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
1Vulnerabilities9 existing vulnerabilities detected
Direct dependencies 12
RegistryPackageVersion constraintManifest
Gocharm.land/bubbles/v2v2.1.0go.mod
Gocharm.land/bubbletea/v2v2.0.6go.mod
Gocharm.land/glamour/v2v2.0.0go.mod
Gocharm.land/lipgloss/v2v2.0.3go.mod
Gogithub.com/charmbracelet/x/ansiv0.11.7go.mod
Gogithub.com/fastschema/qjsv0.0.6go.mod
Gogithub.com/getcharzp/onnxruntime_puregov1.24.0go.mod
Gogithub.com/odvcencio/gotreesitterv0.19.1go.mod
Gogithub.com/tiktoken-go/tokenizerv0.7.0go.mod
Gogolang.org/x/sysv0.45.0go.mod
Gogolang.org/x/toolsv0.45.0go.mod
Gogopkg.in/yaml.v3v3.0.1go.mod
All dependencies not collected

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

Dependency advisories 0

Installing npm:deepx@0.1.0 pulls in 2 packages, direct and transitive: 0 carry known advisories, of which 0 are direct dependencies.

No known advisories affect the assessed dependencies.

An advisory means the version recorded in the dependency graph falls inside an advisory’s affected range. Reachability is not analysed, and the graph includes development and test pins — a finding may concern tooling rather than shipped software.

Raw JSON report machine-readable
{
  "data": {
    "repo": {
      "topics": [
        "deepseek",
        "coding-agent",
        "deepseek-tui",
        "codegraph",
        "workflow",
        "agent",
        "ocr",
        "openspec",
        "superpowers"
      ],
      "is_fork": false,
      "size_kb": 3216,
      "has_wiki": true,
      "homepage": "https://itmisx.github.io/deepx-code/",
      "languages": {
        "Go": 1253419,
        "CSS": 22569,
        "HTML": 62727,
        "Shell": 23722,
        "JavaScript": 41795,
        "PowerShell": 12268
      },
      "pushed_at": "2026-07-22T09:31:44Z",
      "created_at": "2026-05-14T12:29:28Z",
      "owner_type": "User",
      "updated_at": "2026-07-22T14:24:44Z",
      "description": "deepseek标配coding agent、原生支持模型路由、CodeGraph代码图谱、OCR截图识别、自动上下文压缩、最佳工作模式选择,workflow等功能,从根本上节省Token",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "MIT",
      "default_branch": "main",
      "license_spdx_raw": "MIT",
      "primary_language": "Go",
      "significant_languages": [
        "Go"
      ]
    },
    "owner": {
      "blog": null,
      "name": "itmisx",
      "type": "User",
      "login": "itmisx",
      "company": null,
      "location": "shenzhen.china",
      "followers": 21,
      "avatar_url": "https://avatars.githubusercontent.com/u/5791324?v=4",
      "created_at": "2013-10-28T06:05:33Z",
      "is_verified": null,
      "public_repos": 30,
      "account_age_days": 4650
    },
    "license": {
      "state": "standard",
      "spdx_id": "MIT",
      "raw_spdx": "MIT",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v0.2.99",
          "kind": "patch",
          "published_at": "2026-07-22T09:35:05Z"
        },
        {
          "tag": "v0.2.98",
          "kind": "patch",
          "published_at": "2026-07-20T08:35:34Z"
        },
        {
          "tag": "v0.2.97",
          "kind": "patch",
          "published_at": "2026-07-19T05:05:06Z"
        },
        {
          "tag": "v0.2.96",
          "kind": "patch",
          "published_at": "2026-07-18T05:39:15Z"
        },
        {
          "tag": "v0.2.95",
          "kind": "patch",
          "published_at": "2026-07-18T00:10:33Z"
        },
        {
          "tag": "v0.2.94",
          "kind": "patch",
          "published_at": "2026-07-15T13:14:28Z"
        },
        {
          "tag": "v0.2.93",
          "kind": "patch",
          "published_at": "2026-07-13T02:10:13Z"
        },
        {
          "tag": "v0.2.92",
          "kind": "patch",
          "published_at": "2026-07-12T15:29:36Z"
        },
        {
          "tag": "v0.2.91",
          "kind": "patch",
          "published_at": "2026-07-07T01:37:29Z"
        },
        {
          "tag": "v0.2.90",
          "kind": "patch",
          "published_at": "2026-07-06T11:28:50Z"
        },
        {
          "tag": "v0.2.89",
          "kind": "patch",
          "published_at": "2026-07-02T07:15:03Z"
        },
        {
          "tag": "v0.2.88",
          "kind": "patch",
          "published_at": "2026-07-02T06:28:10Z"
        },
        {
          "tag": "v0.2.87",
          "kind": "patch",
          "published_at": "2026-07-02T02:04:10Z"
        },
        {
          "tag": "v0.2.86",
          "kind": "patch",
          "published_at": "2026-06-30T07:27:35Z"
        },
        {
          "tag": "v0.2.85",
          "kind": "patch",
          "published_at": "2026-06-29T02:11:28Z"
        },
        {
          "tag": "v0.2.84",
          "kind": "patch",
          "published_at": "2026-06-28T10:17:08Z"
        },
        {
          "tag": "v0.2.83",
          "kind": "patch",
          "published_at": "2026-06-25T08:37:11Z"
        },
        {
          "tag": "v0.2.82",
          "kind": "patch",
          "published_at": "2026-06-24T04:03:32Z"
        },
        {
          "tag": "v0.2.81",
          "kind": "patch",
          "published_at": "2026-06-24T02:12:02Z"
        },
        {
          "tag": "v0.2.80",
          "kind": "patch",
          "published_at": "2026-06-22T03:07:16Z"
        },
        {
          "tag": "v0.2.79",
          "kind": "patch",
          "published_at": "2026-06-19T01:54:51Z"
        },
        {
          "tag": "v0.2.78",
          "kind": "patch",
          "published_at": "2026-06-18T21:33:53Z"
        },
        {
          "tag": "v0.2.77",
          "kind": "patch",
          "published_at": "2026-06-18T14:51:44Z"
        },
        {
          "tag": "v0.2.76",
          "kind": "patch",
          "published_at": "2026-06-18T14:13:04Z"
        },
        {
          "tag": "v0.2.75",
          "kind": "patch",
          "published_at": "2026-06-18T08:22:23Z"
        },
        {
          "tag": "v0.2.74",
          "kind": "patch",
          "published_at": "2026-06-18T08:09:52Z"
        },
        {
          "tag": "v0.2.73",
          "kind": "patch",
          "published_at": "2026-06-18T00:49:02Z"
        },
        {
          "tag": "v0.2.72",
          "kind": "patch",
          "published_at": "2026-06-18T00:00:30Z"
        },
        {
          "tag": "v0.2.71",
          "kind": "patch",
          "published_at": "2026-06-17T14:18:03Z"
        },
        {
          "tag": "v0.2.70",
          "kind": "patch",
          "published_at": "2026-06-16T09:15:00Z"
        },
        {
          "tag": "v0.2.69",
          "kind": "patch",
          "published_at": "2026-06-14T08:42:16Z"
        },
        {
          "tag": "v0.2.68",
          "kind": "patch",
          "published_at": "2026-06-14T07:17:20Z"
        },
        {
          "tag": "v0.2.67",
          "kind": "patch",
          "published_at": "2026-06-14T06:47:56Z"
        },
        {
          "tag": "v0.2.66",
          "kind": "patch",
          "published_at": "2026-06-14T02:31:23Z"
        },
        {
          "tag": "v0.2.65",
          "kind": "patch",
          "published_at": "2026-06-13T14:01:46Z"
        },
        {
          "tag": "v0.2.64",
          "kind": "patch",
          "published_at": "2026-06-13T11:23:35Z"
        },
        {
          "tag": "v0.2.63",
          "kind": "patch",
          "published_at": "2026-06-13T07:46:43Z"
        },
        {
          "tag": "v0.2.62",
          "kind": "patch",
          "published_at": "2026-06-12T09:44:32Z"
        },
        {
          "tag": "v0.2.61",
          "kind": "patch",
          "published_at": "2026-06-11T07:13:29Z"
        },
        {
          "tag": "v0.2.60",
          "kind": "patch",
          "published_at": "2026-06-11T03:12:27Z"
        },
        {
          "tag": "v0.2.59",
          "kind": "patch",
          "published_at": "2026-06-10T14:58:58Z"
        },
        {
          "tag": "v0.2.58",
          "kind": "patch",
          "published_at": "2026-06-10T13:57:46Z"
        },
        {
          "tag": "v0.2.57",
          "kind": "patch",
          "published_at": "2026-06-09T06:22:06Z"
        },
        {
          "tag": "v0.2.56",
          "kind": "patch",
          "published_at": "2026-06-08T10:00:52Z"
        },
        {
          "tag": "v0.2.55",
          "kind": "patch",
          "published_at": "2026-06-07T10:28:37Z"
        },
        {
          "tag": "v0.2.54",
          "kind": "patch",
          "published_at": "2026-06-07T09:52:57Z"
        },
        {
          "tag": "v0.2.53",
          "kind": "patch",
          "published_at": "2026-06-07T09:30:26Z"
        },
        {
          "tag": "v0.2.52",
          "kind": "patch",
          "published_at": "2026-06-07T07:45:29Z"
        },
        {
          "tag": "v0.2.51",
          "kind": "patch",
          "published_at": "2026-06-07T02:50:37Z"
        },
        {
          "tag": "v0.2.50",
          "kind": "patch",
          "published_at": "2026-06-07T00:41:33Z"
        },
        {
          "tag": "v0.2.49",
          "kind": "patch",
          "published_at": "2026-06-07T00:15:19Z"
        },
        {
          "tag": "v0.2.48",
          "kind": "patch",
          "published_at": "2026-06-06T00:30:28Z"
        },
        {
          "tag": "v0.2.47",
          "kind": "patch",
          "published_at": "2026-06-06T00:09:47Z"
        },
        {
          "tag": "v0.2.46",
          "kind": "patch",
          "published_at": "2026-06-05T15:33:48Z"
        },
        {
          "tag": "v0.2.45",
          "kind": "patch",
          "published_at": "2026-06-05T14:28:26Z"
        },
        {
          "tag": "v0.2.44",
          "kind": "patch",
          "published_at": "2026-06-05T10:27:46Z"
        },
        {
          "tag": "v0.2.43",
          "kind": "patch",
          "published_at": "2026-06-05T10:00:00Z"
        },
        {
          "tag": "v0.2.42",
          "kind": "patch",
          "published_at": "2026-06-05T09:53:40Z"
        },
        {
          "tag": "v0.2.41",
          "kind": "patch",
          "published_at": "2026-06-05T03:31:42Z"
        },
        {
          "tag": "v0.2.40",
          "kind": "patch",
          "published_at": "2026-06-05T03:27:34Z"
        },
        {
          "tag": "v0.2.39",
          "kind": "patch",
          "published_at": "2026-06-05T00:06:08Z"
        },
        {
          "tag": "v0.2.38",
          "kind": "patch",
          "published_at": "2026-06-04T18:21:49Z"
        },
        {
          "tag": "v0.2.37",
          "kind": "patch",
          "published_at": "2026-06-04T12:06:27Z"
        },
        {
          "tag": "v0.2.36",
          "kind": "patch",
          "published_at": "2026-06-04T11:14:15Z"
        },
        {
          "tag": "v0.2.35",
          "kind": "patch",
          "published_at": "2026-06-04T10:12:04Z"
        },
        {
          "tag": "v0.2.34",
          "kind": "patch",
          "published_at": "2026-06-04T09:29:19Z"
        },
        {
          "tag": "v0.2.33",
          "kind": "patch",
          "published_at": "2026-06-04T07:22:05Z"
        },
        {
          "tag": "v0.2.32",
          "kind": "patch",
          "published_at": "2026-06-03T12:43:23Z"
        },
        {
          "tag": "v0.2.31",
          "kind": "patch",
          "published_at": "2026-06-03T10:32:46Z"
        },
        {
          "tag": "v0.2.30",
          "kind": "patch",
          "published_at": "2026-06-03T02:47:44Z"
        },
        {
          "tag": "v0.2.29",
          "kind": "patch",
          "published_at": "2026-06-03T00:25:58Z"
        },
        {
          "tag": "v0.2.28",
          "kind": "patch",
          "published_at": "2026-06-02T16:36:34Z"
        },
        {
          "tag": "v0.2.27",
          "kind": "patch",
          "published_at": "2026-06-02T15:54:12Z"
        },
        {
          "tag": "v0.2.26",
          "kind": "patch",
          "published_at": "2026-06-02T15:08:55Z"
        },
        {
          "tag": "v0.2.25",
          "kind": "patch",
          "published_at": "2026-06-02T14:33:27Z"
        },
        {
          "tag": "v0.2.24",
          "kind": "patch",
          "published_at": "2026-06-02T09:19:10Z"
        },
        {
          "tag": "v0.2.23",
          "kind": "patch",
          "published_at": "2026-06-01T23:40:54Z"
        },
        {
          "tag": "v0.2.22",
          "kind": "patch",
          "published_at": "2026-06-01T08:42:07Z"
        },
        {
          "tag": "v0.2.21",
          "kind": "patch",
          "published_at": "2026-06-01T04:09:31Z"
        },
        {
          "tag": "v0.2.20",
          "kind": "patch",
          "published_at": "2026-06-01T00:19:53Z"
        },
        {
          "tag": "v0.2.19",
          "kind": "patch",
          "published_at": "2026-05-31T17:22:07Z"
        },
        {
          "tag": "v0.2.18",
          "kind": "patch",
          "published_at": "2026-05-31T07:52:50Z"
        },
        {
          "tag": "v0.2.17",
          "kind": "patch",
          "published_at": "2026-05-31T02:39:16Z"
        },
        {
          "tag": "v0.2.16",
          "kind": "patch",
          "published_at": "2026-05-30T17:06:14Z"
        },
        {
          "tag": "v0.2.15",
          "kind": "patch",
          "published_at": "2026-05-30T11:27:26Z"
        },
        {
          "tag": "v0.2.14",
          "kind": "patch",
          "published_at": "2026-05-30T07:43:23Z"
        },
        {
          "tag": "v0.2.13",
          "kind": "patch",
          "published_at": "2026-05-29T14:30:21Z"
        },
        {
          "tag": "v0.2.12",
          "kind": "patch",
          "published_at": "2026-05-29T13:04:00Z"
        },
        {
          "tag": "v0.2.11",
          "kind": "patch",
          "published_at": "2026-05-28T14:32:40Z"
        },
        {
          "tag": "v0.2.10",
          "kind": "patch",
          "published_at": "2026-05-28T07:41:22Z"
        },
        {
          "tag": "v0.2.9",
          "kind": "patch",
          "published_at": "2026-05-27T23:21:06Z"
        },
        {
          "tag": "v0.2.8",
          "kind": "patch",
          "published_at": "2026-05-27T14:55:54Z"
        },
        {
          "tag": "v0.2.7",
          "kind": "patch",
          "published_at": "2026-05-27T11:04:06Z"
        },
        {
          "tag": "v0.2.6",
          "kind": "patch",
          "published_at": "2026-05-27T09:56:51Z"
        },
        {
          "tag": "v0.2.5",
          "kind": "patch",
          "published_at": "2026-05-26T04:05:02Z"
        },
        {
          "tag": "v0.2.4",
          "kind": "patch",
          "published_at": "2026-05-25T23:46:56Z"
        },
        {
          "tag": "v0.2.3",
          "kind": "patch",
          "published_at": "2026-05-24T15:49:43Z"
        },
        {
          "tag": "v0.2.2",
          "kind": "patch",
          "published_at": "2026-05-23T15:04:07Z"
        },
        {
          "tag": "v0.2.1",
          "kind": "patch",
          "published_at": "2026-05-23T14:08:08Z"
        },
        {
          "tag": "v0.2.0",
          "kind": "minor",
          "published_at": "2026-05-23T13:02:37Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "a9ecc2f8ef903afd9f5e89918f5c6957a4462afc",
          "body": "⚡️ compress optimize",
          "is_bot": false,
          "headline": "Merge pull request #204 from itmisx/feature/compress-optimization",
          "author_name": "itmisx",
          "author_login": "itmisx",
          "committed_at": "2026-07-22T09:30:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b1825ffd8ebe661731aedeb7c0ef70320bb25e06",
          "body": null,
          "is_bot": false,
          "headline": "⚡️ compress optimize",
          "author_name": "solly",
          "author_login": "itmisx",
          "committed_at": "2026-07-22T09:30:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ed4473334bb37178ffc2e5c7b16c8073ebe0f3ae",
          "body": "🐛  zwj-emoji-align",
          "is_bot": false,
          "headline": "Merge pull request #199 from itmisx/fix/zwj-emoji-align",
          "author_name": "itmisx",
          "author_login": "itmisx",
          "committed_at": "2026-07-20T09:40:04Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "692ef86a45070857531ec663a872c7f6adae9880",
          "body": null,
          "is_bot": false,
          "headline": "🐛  zwj-emoji-align",
          "author_name": "solly",
          "author_login": "itmisx",
          "committed_at": "2026-07-20T09:12:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b5a9b28a11619ffefa28fb869b5ca1b3f3570792",
          "body": "🔧 test(tools): extractID 挪到跨平台文件,修 Windows 测试构建",
          "is_bot": false,
          "headline": "Merge pull request #198 from itmisx/fix/windows-test-build",
          "author_name": "itmisx",
          "author_login": "itmisx",
          "committed_at": "2026-07-20T07:22:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "68f442f58dc1c735abf023055ed6bf67eca897c5",
          "body": "🐛 fix(windows): 剪贴板操作锁 OS 线程,修粘贴图片后全局复制粘贴失效(#195)",
          "is_bot": false,
          "headline": "Merge pull request #197 from itmisx/fix/windows-clipboard-lock",
          "author_name": "itmisx",
          "author_login": "itmisx",
          "committed_at": "2026-07-20T07:22:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "585d75551d78ece5456fe7fceabb9d3b8b61efd2",
          "body": "command_test.go 是跨平台的(RunCommand 测试运行时按 runtime.GOOS 跳过 Windows),\n但它引用的 extractID 定义在 bg_test.go(//go:build !windows)里 —— Windows 下该\n符号未定义,导致整个 tools 测试包在 Windows 上编译失败(交叉编译 #195 时暴露)。\n\nextractID 是纯字符串解析、无平台依赖,挪到不带约束的 testhelpers_test.go,\nbg_test.go(!windows)与 command_test.go(跨平台)都能用。command_test.go 一字未改,\n保留其原有的运行时 GOOS 跳过设计。GOOS=windows go vet ./tools/ 现通过。",
          "is_bot": false,
          "headline": "🔧 test(tools): extractID 挪到跨平台文件,修 Windows 测试构建",
          "author_name": "solly",
          "author_login": "itmisx",
          "committed_at": "2026-07-20T07:17:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9e6f2e7f6fab21488958b60e3189003bc3142036",
          "body": "Windows 剪贴板按 OS 线程归属:OpenClipboard 在哪个线程开,必须在同一线程\nCloseClipboard 才能关。Go 的 goroutine 会在 syscall 间被调度到别的 OS 线程 ——\nreadClipboardImage 尤甚:它 return dibToPNG(dib),PNG 编码(耗时+分配)期间\n剪贴板还开着,极易迁线程 → defer CloseClipboard 落到另一线程 → 关闭失败 →\n剪贴板被全局锁死,记事本/浏览器都不能复制粘贴(图片必现、文本很少,因文本\n读写 syscall 少、几乎不迁线程)。\n\nreadClipboardImage / writeClipboardText 均在 OpenClipboard 前 runtime.LockOSThread()\n+ defer UnlockOSThread(),把 open→close 钉在同一线程(defer 后进先出,\nUnlockOSThread 在 CloseClipboard 之后执行)。这是 Go 调 Win32 剪贴板的标准做法。",
          "is_bot": false,
          "headline": "🐛 fix(windows): 剪贴板操作锁 OS 线程,修粘贴图片后全局复制粘贴失效(#195)",
          "author_name": "solly",
          "author_login": "itmisx",
          "committed_at": "2026-07-20T07:07:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bedbb4e574b83821d1ef4ff41d5d8f79361a23ce",
          "body": "✨ feat(agent): 视觉模型对外部图片路径调 OCR 时改为内联识图(#194)",
          "is_bot": false,
          "headline": "Merge pull request #196 from itmisx/feat/ocr-vision-redirect",
          "author_name": "itmisx",
          "author_login": "itmisx",
          "committed_at": "2026-07-20T07:00:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4e164c17dcf8e94978595835483946390255afa8",
          "body": "用户在文本里直接给图片路径(而非粘贴)时,裸路径是纯文本、模型看不到那张图,\n只能退回本地 OCR —— 而本地 OCR 对复杂图不如模型多模态准(reporter 诉求)。\n\n改在 OCR 工具调用这一刻分流(agent/llm.go case \"OCR\"):视觉模型 + path 指向一张\n真实存在的本地图片文件(ocrImageFilePath:图片扩展名 + os.Stat 普通文件)→ 不跑\n本地 OCR,回一条\"已内联,请直接看图\"的 tool 结果,并在 tc 循环收尾追加一条带该图\n(ImagePaths + [Image #N])的 user 消息;renderConvoIm\n[…]\n更通用\n(工具产出的图片路径也覆盖)。代价仅一次额外模型往返(调 OCR→redirect→再看图)。\n\n安全性:追加消息(非改历史)不破前缀缓存;第二次对同一图 OCR 会被既有\nocrTargetsInlinedImage 命中,不重复注入,自然收敛。非视觉模型完全不变(仍走 OCR)。\n\n补 TestOcrImageFilePath(真实图片/不存在/目录/非图片扩展名/空/坏 JSON)。",
          "is_bot": false,
          "headline": "✨ feat(agent): 视觉模型对外部图片路径调 OCR 时改为内联识图(#194)",
          "author_name": "solly",
          "author_login": "itmisx",
          "committed_at": "2026-07-20T05:46:33Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "0adbe16a2be79375d3765059721db00b82486698",
          "body": "feat(tui): 输入区多行时鼠标滚轮可上下移动光标",
          "is_bot": false,
          "headline": "Merge pull request #193 from lordquest/feat/input-wheel-scroll",
          "author_name": "itmisx",
          "author_login": "itmisx",
          "committed_at": "2026-07-19T04:54:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cbe524e96b1c36bf6b4483309ca1baf71686abb5",
          "body": "fix(tui): 上下键在折行/历史项内应移动光标而非误翻历史",
          "is_bot": false,
          "headline": "Merge pull request #192 from lordquest/fix/up-key-wrapped-line",
          "author_name": "itmisx",
          "author_login": "itmisx",
          "committed_at": "2026-07-19T04:50:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "908d77c5b4115a1dc7891440e8f8ab9f48e4128f",
          "body": "本地部署的大模型(llama.cpp 等)首次跑图推理常 >20s → 探针 ctx 超时 → 按\n瞬时错误不缓存 → 每次启动重探又超时 → 一直被判成不支持视觉、强制走本地 OCR。\n放宽到 60s,让能识图但慢的本地模型探得到。",
          "is_bot": false,
          "headline": "🐛 fix(vision): 视觉探针超时 20s→60s(#194)",
          "author_name": "solly",
          "author_login": "itmisx",
          "committed_at": "2026-07-19T04:43:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "78a4d30dc75fa20887b7a6b0332fc0a74b5c894e",
          "body": null,
          "is_bot": false,
          "headline": "feat(tui): 输入区多行时鼠标滚轮上下移动光标",
          "author_name": "lordquest",
          "author_login": "lordquest",
          "committed_at": "2026-07-18T13:13:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d14d6cee56c470190bfaf3fff6a852e8a642364d",
          "body": null,
          "is_bot": false,
          "headline": "fix(tui): 上下键在折行/历史项内应移动光标而非误翻历史",
          "author_name": "lordquest",
          "author_login": "lordquest",
          "committed_at": "2026-07-18T13:01:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c42fe7efdfa544a690a05a976fde15f9d39f1b04",
          "body": "✨ feat(tui): 输入区支持鼠标拖拽选择片段并复制(#188)",
          "is_bot": false,
          "headline": "Merge pull request #190 from itmisx/feat/input-partial-select",
          "author_name": "itmisx",
          "author_login": "itmisx",
          "committed_at": "2026-07-18T05:31:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "caea8da5d5f1cf34c2f0c8dea319dfcb38378e18",
          "body": "此前输入区拖拽只能\"全选+复制全部\"(#189),因 bubbles v2 textarea 不暴露选区\nAPI。本版在 textarea 渲染输出之上自造流式选区,做到和 chat 区一致的\"部分选择\":\n\n- 坐标映射:鼠标 (X,Y) → 输入可见行 cellPos(X-gutter=列,Y-文本首行=行号)。\n- 高亮/抠字直接复用 selection.go 的 applySelectionHighlight / extractSelectionText,\n  基于 m.input.View() 的可见行 —— 因此软换行、纵向滚动都天然正确(选的、抠的都是\n  屏幕上看得见的那几行,\n[…]\n\n顺带把 initModel 测试辅助对齐生产输入框配置(关行号 / 空 Prompt / 固定行高 /\n真实光标),否则 View() 带默认行号 gutter,选区坐标对不上。\n\n补 TestInputDragSelectsFragment / TestInputSelectionClearedByKey 覆盖选区+复制+\n取消+按键清除。删除不再用到的 inputDragThreshold。",
          "is_bot": false,
          "headline": "✨ feat(tui): 输入区支持鼠标拖拽选择片段并复制(#188)",
          "author_name": "solly",
          "author_login": "itmisx",
          "committed_at": "2026-07-18T05:10:09Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d77c6cda1553142e7f85a1135ce609f91b30bc7d",
          "body": "✨ feat(tui): 输入区全选态下单击即取消高亮(#188)",
          "is_bot": false,
          "headline": "Merge pull request #189 from itmisx/fix/input-click-cancel-select",
          "author_name": "itmisx",
          "author_login": "itmisx",
          "committed_at": "2026-07-18T03:20:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "197e77bb321f6c25b777e8b9bfe9b3a6a7f3b11d",
          "body": "输入区\"拖拽全选\"是有意设计:textarea 不暴露选区 API,做不到 chat 区那种\n子区间拖选,故拖动整段选中 + 复制全部。但全选高亮后,鼠标\"点一下取消\"此前\n没接上 —— 单击 press 只设 inputDragging,release 无拖动时反而又复制一次并\n保留高亮,用户只能靠键盘(方向键/Esc…)解除,反直觉(见 issue 反馈)。\n\n修复:MouseClick 命中输入区时,若已处于全选态就先清掉高亮。之后若是真拖动,\nMouseMotion 会重新点亮;若只是单击松手,就实现了\"点一下取消\"。既有的拖拽\n复制全文行为不受影响。\n\n补 TestInputClickCancelsSelectAll 钉死该行为(已验证:无此改动时 FAIL)。",
          "is_bot": false,
          "headline": "✨ feat(tui): 输入区全选态下单击即取消高亮(#188)",
          "author_name": "solly",
          "author_login": "itmisx",
          "committed_at": "2026-07-18T03:14:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "85d589a2dd543a03c8e77209586287d90a8def47",
          "body": "🐛 fix(tui): 用户气泡去掉 ansi.Wrap 二次折行(修 #186 回归)",
          "is_bot": false,
          "headline": "Merge pull request #187 from itmisx/fix/user-bubble-double-wrap",
          "author_name": "itmisx",
          "author_login": "itmisx",
          "committed_at": "2026-07-18T00:05:37Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b1181b24a7f2532b717e243b7c4700769b7cbef6",
          "body": "renderUserBubble 里 lipgloss 的 Width 本就会硬折行超长无空格单行、并把每行\n补白到 boxW,不会溢出 chat 区。#186 额外套的一层 ansi.Wrap 是对「已折行 + 已\n补白」的内容二次折行:行尾补白被顶到新行 → 生成交替空行(双倍行距)、补白被\n打散、右边参差。实测 200 个 x 在 viewportW=40 下,原来 6 行干净铺满,二次折行\n后变 11 行含 5 个空「┃ 」行。\n\n改回直接按 \\n 切 box.Render 的输出,删掉不再用到的 x/ansi import。\n\n同时补强 TestRenderUserBubbleNoOverflow:从「只查最大宽度 <= boxW」改为要求\n每行都恰好铺满 viewportW 且含实际内容 —— 这样二次折行产生的空行/参差会被直接\n测出(已验证:此断言在旧 ansi.Wrap 版本下 FAIL、在本修复下 PASS)。",
          "is_bot": false,
          "headline": "🐛 fix(tui): 用户气泡去掉 ansi.Wrap 二次折行(修 #186 回归)",
          "author_name": "solly",
          "author_login": "itmisx",
          "committed_at": "2026-07-18T00:02:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "13486095c200748321876b5733b5e48bb4b9b6ce",
          "body": "feat(tui): 长文本粘贴占位符 [Pasted text #N +X lines]",
          "is_bot": false,
          "headline": "Merge pull request #186 from lordquest/feat/long-paste-placeholder",
          "author_name": "itmisx",
          "author_login": "itmisx",
          "committed_at": "2026-07-17T23:58:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "eca68798628a35ed1a699d1938feb3ce2cb5424d",
          "body": "fix(tui): normalize bare CR in padLinesToWidth to fix divider misalig…",
          "is_bot": false,
          "headline": "Merge pull request #185 from lordquest/fix/history-cr-divider",
          "author_name": "itmisx",
          "author_login": "itmisx",
          "committed_at": "2026-07-17T23:47:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "afdabbf8e86a4ec3e988aa21ce3e0c3e3542c7f9",
          "body": "粘贴超阈值(>800 字符,或行数超 min(height-10,2)、常态 >2 行)的文本,\n不直接塞进输入框(避免被 textarea 的 CharLimit(4000) 截断、撑爆输入区),\n而是存全文、在输入框放占位符 [Pasted text #N +X lines],发送前展开回全文。\n\n- 与 free-code 一致:字符阈值 PASTE_THRESHOLD=800;行数阈值 = min(height-10,2)。\n- 发送前 normalizeNewlines 统一 \\r\\n/\\r → \\n,消除旧消息光标错乱根因。\n- Esc 打断回填用 pendingInputOrig\n[…]\n / tui/paste_check_test.go / tui/user_bubble_test.go\n- 改已有(主干本就有,仅修其 TestUpdatePreviewLineNumbers 的 Windows JSON 构造):\n  tui/tool_display_test.go\n即除 tool_display_test.go 外,本提交涉及的测试文件均为 PR2 新加,不动主干既有测试。",
          "is_bot": false,
          "headline": "feat(tui): 长文本粘贴占位符 [Pasted text #N +X lines]",
          "author_name": "lordquest",
          "author_login": "lordquest",
          "committed_at": "2026-07-17T16:24:49Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "121397ed8a8dc8effc84500ec328321a6a822f68",
          "body": "…nment on old messages containing a lone carriage return",
          "is_bot": false,
          "headline": "fix(tui): normalize bare CR in padLinesToWidth to fix divider misalig…",
          "author_name": "lordquest",
          "author_login": "lordquest",
          "committed_at": "2026-07-17T14:05:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0c96a8ac3203896e608f43df7016ae0032f04829",
          "body": "Feat/balance delayed refresh",
          "is_bot": false,
          "headline": "Merge pull request #184 from itmisx/feat/balance-delayed-refresh",
          "author_name": "itmisx",
          "author_login": "itmisx",
          "committed_at": "2026-07-17T07:25:04Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "605ee2d674c06835c34a8741b971d80243e16f6c",
          "body": "语言选择器右侧加一个 GitHub 图标链接,点击新标签页打开本项目仓库,\n省得用户还要自己去搜。\n\n- 图标用内联 SVG,不引外链:整个 web UI 的资源都是本地 vendor 的,\n  面板常跑在内网 / 离线机器上,引远端图标会裂图。\n- 沿用 .lang-select 的视觉语言:平时 --dim(与\"已连接\"同层级、不抢眼),\n  hover / focus 跟随 --accent2。.lang-select 的 margin-left:auto 已把这一组\n  推到右侧,两者靠 .topbar 的 gap 分隔,无需额外定位。\n- target=_blank 配 rel=noopener noreferrer 防 tabnabbing;\n  tooltip 走 i18n(中英文案都补了,否则切 en 会显示成 key)。\n\n验证:把 topbar 渲染成图片肉眼确认了图标形状(SVG path 是手写的,错一个数字\n就会渲染成乱形,看代码看不出来)与排版位置;并确认链接、样式、中英文案都进到\ngo:embed 的产物里(静态资源改了要重编才生效)。",
          "is_bot": false,
          "headline": "✨ feat: web 面板标题栏加 GitHub 仓库入口 (#182)",
          "author_name": "solly",
          "author_login": "itmisx",
          "committed_at": "2026-07-17T07:13:26Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3bae0cf570fa4e950ed62949126cc3e0588e8d3d",
          "body": "现象:右栏余额比网页大,给人「回答怎么这么省钱」的错觉,一看网页才发现对不上。\n\n根因不是「没刷新」—— StreamDoneMsg 里本就每轮回答结束都重探一次(见 model.go\n「本轮花了 token,余额变了」)。问题是刷得太早:DeepSeek/Kimi 的计费是滞后结算的,\n答完瞬间去查,拿到的还是扣费前的数。\n\n修复:保留即时那次(让用户马上看到个大概),再挂一次 balanceSettleDelay(5min)\n之后的重探校准到真实值。用代数(balanceGen)防抖 —— 每轮结束 +1 并重新挂钟,钟到点时\n代数对不上就丢弃,否则连聊 20 轮会攒 20 口钟、白打 2\n[…]\n来也够用。要调准得实打一轮按 30s 采样看多久数字才变。\n\n测试:新增 tui/balance_settle_test.go,锁住防抖契约 —— 代数相符才探、过期即丢、\n连聊 20 轮只触发 1 次探测。另带一个前置用例确认有 key 时探测命令非 nil,\n免得断言变成假阳性。全量测试无回归。\n\n注:issue #182 里另一条「webui 加 github 链接」与本项无关,未在此实现。",
          "is_bot": false,
          "headline": "✨ feat: 余额在计费结算后延迟重探一次(防抖) (#182)",
          "author_name": "solly",
          "author_login": "itmisx",
          "committed_at": "2026-07-17T07:08:03Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "769c8430853dcabbb9b43caf7da7fb437449abda",
          "body": "Fix/stream idle timeout",
          "is_bot": false,
          "headline": "Merge pull request #183 from itmisx/fix/stream-idle-timeout",
          "author_name": "itmisx",
          "author_login": "itmisx",
          "committed_at": "2026-07-17T06:57:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "228847a6e588f8948d85f7fafa2cd218555f1801",
          "body": "上一版空闲看门狗触发即报错收尾。但零输出的空闲超时其实可以干净重试 ——\n此刻没有任何 token 吐给 UI、assistant 也没进历史,重来不会重复吐字,\n与 maxAPIRetries「只重试进流式之前的失败」是同一条原则。端点偶发抽风时\n用户不用手动重发,体验更好。\n\n实现:把原 streamOnce 原样改名 streamAttempt(内部一行未动,保留它自己的\n连接重试),外面套一层只在「空闲超时 且 本次尝试零输出」时重入的 streamOnce。\n每次尝试在 streamAttempt 内部各自派生可取消 ctx,所以被看门狗 cancel 掉的\nctx 不会污染下一次重\n[…]\n「重试 N/2 · 响应超时」\n可看,而不是一个什么都不说的 spinner。\n\n已吐字后不再重试:带着已吐内容直接报错收尾,交由上层处理。\n\n测试:新增三个场景 —— 全程无响应时恰好尝试 1+2 次并发出 2 条 RetryNoticeMsg、\n第二次尝试正常返回时静默自愈(用户看不到错误)、已吐字后卡死只请求 1 次且\n已吐内容随错误返回。连同原有四个场景共 6 个用例全过,全量测试无回归。",
          "is_bot": false,
          "headline": "✨ feat: 流式空闲超时后自动重试,而非直接报错 (#181)",
          "author_name": "solly",
          "author_login": "itmisx",
          "committed_at": "2026-07-17T06:47:36Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "361dcf5cb213a64b1a06a1070e963c287884acb9",
          "body": "根因:主流式路径上一个超时都没有 ——\n1. ctx 来自 context.WithCancel(context.Background()),无 deadline,只能 ESC 取消;\n2. 用 http.DefaultClient,其 Timeout 为 0,永不超时;\n3. SSE 读取是裸 for scanner.Scan(),阻塞在网络读上没有任何空闲检测。\n\n端点接了连接却不吐数据时(接 OpenRouter 实测)会无限等下去,UI 上就是 spinner\n一直转、用户完全不知道卡在哪。原以为兜底的 maxNoProgressRounds 管不到这里:\n它数的是「轮次」,而流卡死时\n[…]\n会把大摘要掐死,那条路已由 compactionTimeout 兜住。\n\n测试:新增 agent/stream_timeout_test.go,用 httptest 假 SSE 端点覆盖四个场景 ——\n超时触发且不被误报成 context.Canceled、keep-alive 注释行能续命(防误杀推理模型)、\n持续吐 token 的慢流不被误杀、用户 ESC 不被误报成空闲超时。全量测试无回归。",
          "is_bot": false,
          "headline": "🐛 fix: 流式响应卡死无限等待,加空闲看门狗自动兜底 (#181)",
          "author_name": "solly",
          "author_login": "itmisx",
          "committed_at": "2026-07-17T06:36:39Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c9da81c1e20d9cb431a5f635b061c72caba55d69",
          "body": "   fix: correct Web IP display & sync model names on /provider switch",
          "is_bot": false,
          "headline": "Merge pull request #179 from lordquest/main",
          "author_name": "itmisx",
          "author_login": "itmisx",
          "committed_at": "2026-07-15T12:00:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "64b89c1326287072f4ef044a5cb81b7871890a4e",
          "body": null,
          "is_bot": false,
          "headline": "chore: remove web/server_ip_test.go",
          "author_name": "lordquest",
          "author_login": "lordquest",
          "committed_at": "2026-07-15T10:55:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b42380fcaae6a693b7ae0663c6234f6db3c5bad2",
          "body": "给输入框加了 ↑↓ 翻历史记录",
          "is_bot": false,
          "headline": "Merge pull request #178 from FUSU123fusu/feat/input-history",
          "author_name": "itmisx",
          "author_login": "itmisx",
          "committed_at": "2026-07-15T04:41:12Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "96da04e752fb7e241211d952859f29e2489706fa",
          "body": null,
          "is_bot": false,
          "headline": "feat(tui): add up/down arrow input history navigation",
          "author_name": "FUSU123fusu",
          "author_login": "FUSU123fusu",
          "committed_at": "2026-07-15T04:07:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a31c86f08ca483295ba532b8ed32a860ca639847",
          "body": "根因:Hub 的 Models 在 tui/run.go 启动时初始化一次,之后 /provider 切换供应商只更新了\nTUI 侧的 m.models,没有同步到 Hub 快照,导致 Web 右栏仍显示旧模型名。\n\n修复:\n- 后端:Event 加 Flash/Pro 字段;Hub 新增 SetModels(flash,pro,activeRole)方法\n  (线程安全,直接更新 snap.Models + 广播 models 事件);\n  applyProvider 末尾调用 m.hub.SetModels 同步 Web 侧。\n- 前端(web/static/app.js):reducer 新增 case 'models',更新 this.models.flash/pro/activeRole。",
          "is_bot": false,
          "headline": "🐛 fix: /provider 切换供应商后 Web 面板模型名未同步",
          "author_name": "lordquest",
          "author_login": "lordquest",
          "committed_at": "2026-07-14T17:01:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c1e8b8c7ade34b21d68df8ff86b142e4f2ad11f3",
          "body": "根因:localIP() 只过滤回环地址就返回第一个非回环 IPv4,而 net.InterfaceAddrs()\n枚举顺序下,排在前面的常是 169.254.x.x 链路本地(APIPA,虚拟网卡 / 无 DHCP 自动分配)\n或 Docker/WSL 虚拟网卡,导致面板 URL 回显成点不开的地址。\n\n修复:\n1. 优先用默认路由出口探测 —— net.Dial(\"udp\",\"8.8.8.8:80\")(不发真实流量,\n   仅触发内核路由查找)取 LocalAddr,即默认路由那张真实网卡的 IP;多张真实网卡时\n   取到的是 LAN 设备访问本机该用的地址。探测失败再退用枚举挑选法。\n\n[…]\n地(169.254.0.0/16),优先非链路本地地址;\n   全是链路本地才退用它,避免直接回退 127.0.0.1 让用户连不上。\n3. 出口 IP 即便为链路本地也信任(说明默认路由真在那张卡上),不再二次过滤。\n\n测试:新增 web/server_ip_test.go,用注入 dial 的桩覆盖 outboundIP 三态、\nselectHostIP 多网卡挑选;原 web 包测试无回归。",
          "is_bot": false,
          "headline": "🐛 fix: Web 面板回显的访问 IP 选错网卡(169.254.x.x / 虚拟网卡)",
          "author_name": "lordquest",
          "author_login": "lordquest",
          "committed_at": "2026-07-14T17:01:08Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c24b2e06efdd373ba25027a0ac777ca173475941",
          "body": "🐛 fix: 终端不断吐出字面 \"q\" 字符 (#167)",
          "is_bot": false,
          "headline": "Merge pull request #174 from itmisx/fix/cursor-decscusr-q",
          "author_name": "itmisx",
          "author_login": "itmisx",
          "committed_at": "2026-07-13T02:05:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d10939593e71cb295b2490de63059f707aef795f",
          "body": "app 侧光标闪烁靠把 tea.View.Cursor 在 nil 与有值之间来回切,而 bubbletea 只要\n发现光标样式变了就写一条 DECSCUSR:nil → 样式 0、有值 → 样式 5,于是每 600ms\n往终端写一次 \"\\x1b[5 q\" / \"\\x1b[0 q\"。该序列的 q 前有一个空格(中间字节),CSI\n解析不健全的终端会在空格处提前结束序列、把末尾的 q 当普通字符打印;又因 bubbletea\n是差分渲染不重画旧格子,野生的 q 会从输入框光标处一路向右堆积。\n\n改为默认让光标常驻、由终端按 DECSCUSR 的 blink 位自己闪 —— 样式全程不变,DECSCUSR\n只在启停各写一次。仅对默认忽略 blink 位的 VS Code 集成终端(其 xterm.js 能正确解析\n中间字节、不会漏 q)保留 app 侧闪烁。\n\n600ms 心跳保持不变:codegraph 状态轮询与 workflow 计时重画仍搭它的车。",
          "is_bot": false,
          "headline": "🐛 fix: 终端不断吐出字面 \"q\" 字符 (#167)",
          "author_name": "solly",
          "author_login": "itmisx",
          "committed_at": "2026-07-13T01:55:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "920093d5ad4a4a9a59de449078e09a152a443650",
          "body": "🐛 fix: Windows 上 Bash 命令带空格的引号参数被错误拆分 (#171)",
          "is_bot": false,
          "headline": "Merge pull request #173 from itmisx/fix/windows-cmd-quoting",
          "author_name": "itmisx",
          "author_login": "itmisx",
          "committed_at": "2026-07-12T15:25:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e5e6eb7457ba69cb90e93b35b84cb14a51589cf3",
          "body": "根因是 Go 的参数转义,不是 cmd 本身:exec.Command(\"cmd\",\"/C\",command)\n把整条命令当一个参数,Go 的 syscall.EscapeArg 把内部 \" 转义成 \\\" —— cmd.exe\n不认这种转义,导致 --title \"Hello World\" 被拆成 \"Hello 和 World\"。\n\n修法:Windows 下改用 SysProcAttr.CmdLine 绕过 Go 转义,以 cmd /S /C \"<命令>\"\n把命令串原样交给 cmd 按自身规则解析(等价于手敲),&&/||/| 等 cmd 原生操作符\n保持可用。不改用 powershell —\n[…]\nllCmd 按平台拆到\nshell_windows.go / shell_other.go。前台(command.go)/后台(bg.go)共用此函数,\n且 Windows 的 setPgid 为空操作、killProc 用 taskkill,均不覆盖 SysProcAttr,一处修复全覆盖。\n\ndarwin/linux/windows 三平台交叉编译通过;运行时行为待真机 Windows 验证。",
          "is_bot": false,
          "headline": "🐛 fix: Windows 上 Bash 命令带空格的引号参数被错误拆分 (#171)",
          "author_name": "solly",
          "author_login": "itmisx",
          "committed_at": "2026-07-12T15:09:53Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "59342efecfc8d9b7529b12fc270c59c88069fe2c",
          "body": "🐛 fix: 流式响应截断/空响应导致对话卡死无法恢复 (#169)",
          "is_bot": false,
          "headline": "Merge pull request #172 from itmisx/fix/stream-truncation-empty",
          "author_name": "itmisx",
          "author_login": "itmisx",
          "committed_at": "2026-07-12T14:58:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "29af5d93ea35693228cf5e49e0f59f7e20e4e5ec",
          "body": "两类 harness 缺口,被非 DeepSeek 的不稳定/免费供应商放大:\n\n1) tool_call 参数被输出长度上限截断:模型把超大文件塞进 tool_call.arguments,\n   撞 max_tokens → arguments JSON 残缺 → 执行报 'unexpected end of JSON input'。\n   原逻辑只在无 tool_call 时判截断,截断的 tool_call 会被当普通 parse 错喂回,\n   模型重试同一超大调用 → 再截断 → 死循环,对话卡死无法恢复。\n\n2) 空响应:供应商返回 content/reasoning/tool_\n[…]\n类:截断的 tool_call / 空响应\n  都不落这条 assistant,改注入催继续提示让模型自愈(分块重写 / 重新回复);\n  连续到 maxGateNudges 上限仍无法自愈则回可读错误,不再空转。\n- Write 工具描述新增大文件分块提示,从源头减少单次超大写入触发截断。\n- 补 stream_outcome_test 覆盖分类逻辑与 completionGate 催继续上限。",
          "is_bot": false,
          "headline": "🐛 fix: 流式响应截断/空响应导致对话卡死无法恢复 (#169)",
          "author_name": "solly",
          "author_login": "itmisx",
          "committed_at": "2026-07-12T06:31:16Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "77005d8096b82c76391ad69280f8a0f369dd8c35",
          "body": "✨ feat: light-theme",
          "is_bot": false,
          "headline": "Merge pull request #164 from itmisx/feat/light-theme",
          "author_name": "itmisx",
          "author_login": "itmisx",
          "committed_at": "2026-07-07T01:33:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7a898bf42f2d0996c3c87a8065522d255ba6c3c7",
          "body": null,
          "is_bot": false,
          "headline": "✨ feat: light-theme",
          "author_name": "solly",
          "author_login": "itmisx",
          "committed_at": "2026-07-07T01:32:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8a45549dfaa4deee0e41619a0f76abe7f8279021",
          "body": "🐛  fix: input-queue",
          "is_bot": false,
          "headline": "Merge pull request #162 from itmisx/fix/input-queue",
          "author_name": "itmisx",
          "author_login": "itmisx",
          "committed_at": "2026-07-06T11:23:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "25c5e332b4c0e411d2e9207a3b6aaf3f2078dc35",
          "body": null,
          "is_bot": false,
          "headline": "🐛  fix: input-queue",
          "author_name": "solly",
          "author_login": "itmisx",
          "committed_at": "2026-07-06T11:23:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "afb0de9c715c2e5990df1faac8fcc56dc4b80801",
          "body": "✨ feat: 可切换显示模型思考过程(TUI + web)",
          "is_bot": false,
          "headline": "Merge pull request #156 from itmisx/feat/thinking-display",
          "author_name": "itmisx",
          "author_login": "itmisx",
          "committed_at": "2026-07-02T07:10:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "54cae33664ac4059898248fdeb496133448fc5d9",
          "body": "新增 /thinking 开关(默认关,记忆到 meta),打开后把模型 reasoning_content\n暗显进对话流:\n- TUI:新增 kindThinking 段,暗灰斜体 + 二级缩进细竖线,流式逐 token 追加\n- web:reasoning 内联成 role=thinking 消息,排在随后助手回复之前;偏好经\n  show_thinking 事件与 TUI 双向同步,存快照支持刷新/重连\n- exec/管道路径不受影响,始终不打印思考\n\nagent 层零改动(reasoning_content 本就已解析并发到 TUI/web),仅补显示与开关。",
          "is_bot": false,
          "headline": "✨ feat: 可切换显示模型思考过程(TUI + web)",
          "author_name": "solly",
          "author_login": "itmisx",
          "committed_at": "2026-07-02T07:09:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "03f2ecb350f208d48617628dd9e80b7e348153b0",
          "body": "OpenAIFunctionSpec 的 Parameters/RawParameters 均为 json:\"-\",只有自定义\nMarshalJSON 没有对称的 UnmarshalJSON。压缩走快照还原(UnmarshalToolSpecs)时\nparameters 无处落地,重新 marshal 退化成 {\"type\":\"\",\"properties\":null},\nAPI 报 Invalid schema: null is not of type object,压缩必崩、上下文撑爆窗口。\n\n补 UnmarshalJSON 把 parameters 原样收进 RawParameters,逐字节还原保前缀缓存。\n加 round-trip 单测钉死此回归(workflow 提交 317da0c 引入)。",
          "is_bot": false,
          "headline": "🐛 fix: 工具 specs round-trip 丢 parameters 致压缩必崩",
          "author_name": "solly",
          "author_login": "itmisx",
          "committed_at": "2026-07-02T06:21:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "48ffbc6ceae1b3621e8dd35431e009dedd0fd8c1",
          "body": "只有 .zprofile 无 .zshrc 的 Mac(Homebrew 只建 .zprofile)旧逻辑一个 rc 都写不到,\n且 .zprofile 只在登录 shell 读,tmux/子shell 等非登录交互只读 .zshrc → deepx 不在 PATH。\n改为按 $SHELL 保底创建交互式必读 rc:zsh→.zshrc,bash→.bash_profile+.bashrc,fish→config.fish。",
          "is_bot": false,
          "headline": "🐛 fix: install.sh 保证交互式 shell 的 rc 拿到 PATH",
          "author_name": "solly",
          "author_login": "itmisx",
          "committed_at": "2026-07-02T01:59:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1e93478bb1c42a6c11a77cd02a9a20a27fa2c8dd",
          "body": null,
          "is_bot": false,
          "headline": "📝 README",
          "author_name": "solly",
          "author_login": "itmisx",
          "committed_at": "2026-07-01T02:58:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d3ae231adcd8eaf35f1c02f26c901fc24d094af4",
          "body": "🐛 fix: tool executor timeout",
          "is_bot": false,
          "headline": "Merge pull request #154 from itmisx/fix/tool-executor-timeout",
          "author_name": "itmisx",
          "author_login": "itmisx",
          "committed_at": "2026-06-30T07:23:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "17480eb442bc2286b4a77ce146315686b233ffb4",
          "body": null,
          "is_bot": false,
          "headline": "🐛 fix: tool executor timeout",
          "author_name": "solly",
          "author_login": "itmisx",
          "committed_at": "2026-06-30T07:22:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e6714bd6e67d6ec97726f252111703ac6fbd9541",
          "body": "✨ feat: web-balance-collapse",
          "is_bot": false,
          "headline": "Merge pull request #152 from itmisx/feat/web-balance-collapse",
          "author_name": "itmisx",
          "author_login": "itmisx",
          "committed_at": "2026-06-29T02:06:04Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "14a2cf3343d7cccffa1bc9072373f678fe274ab7",
          "body": null,
          "is_bot": false,
          "headline": "✨ feat: web-balance-collapse",
          "author_name": "solly",
          "author_login": "itmisx",
          "committed_at": "2026-06-29T02:05:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "84c3f2a4e913950e5821a448e57cb6ad72fa9a01",
          "body": "🐛 fix: web-input-height",
          "is_bot": false,
          "headline": "Merge pull request #150 from itmisx/fix/web-input-145",
          "author_name": "itmisx",
          "author_login": "itmisx",
          "committed_at": "2026-06-28T10:12:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f597704e5bf7bd521d430da62edad129ffbde8f8",
          "body": null,
          "is_bot": false,
          "headline": "🐛 fix: web-input-height",
          "author_name": "solly",
          "author_login": "itmisx",
          "committed_at": "2026-06-28T10:11:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4a1a8588c83a2ec88341a831da975821b0951fc3",
          "body": "✨ feat: api-retry",
          "is_bot": false,
          "headline": "Merge pull request #149 from itmisx/feat/api-retry-147",
          "author_name": "itmisx",
          "author_login": "itmisx",
          "committed_at": "2026-06-28T07:59:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2a5ec0db7429ed8689e1cff04c6b7a5cfc603f25",
          "body": null,
          "is_bot": false,
          "headline": "✨ feat: api-retry",
          "author_name": "solly",
          "author_login": "itmisx",
          "committed_at": "2026-06-28T07:58:42Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5ed20ca68001fc417574539c51e1a5142365f9ec",
          "body": "🐛 fix: ocr-repeat-loop",
          "is_bot": false,
          "headline": "Merge pull request #148 from itmisx/fix/ocr-repeat-loop-146",
          "author_name": "itmisx",
          "author_login": "itmisx",
          "committed_at": "2026-06-28T03:30:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6d3ce45ca9251c747cd120674b48b17e349c2241",
          "body": null,
          "is_bot": false,
          "headline": "🐛 fix: ocr-repeat-loop",
          "author_name": "solly",
          "author_login": "itmisx",
          "committed_at": "2026-06-28T03:29:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5d976d081090de11e8874b32abd371a4d7668c65",
          "body": null,
          "is_bot": false,
          "headline": "🐛 fix tool-output-turn-cap(并发tool调用)",
          "author_name": "solly",
          "author_login": "itmisx",
          "committed_at": "2026-06-26T09:34:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "04d3de7a01476f7aa18970c1ad3af3187626e36b",
          "body": null,
          "is_bot": false,
          "headline": "🐛 fix: ssh-clipboard-osc52",
          "author_name": "solly",
          "author_login": "itmisx",
          "committed_at": "2026-06-26T08:03:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "23862c0e5847d6ab0403751eed190722783d2e1d",
          "body": "🐛 fix: web-session-delete",
          "is_bot": false,
          "headline": "Merge pull request #143 from itmisx/fix/web-session-delete-notice-141",
          "author_name": "itmisx",
          "author_login": "itmisx",
          "committed_at": "2026-06-25T08:33:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3eb24b1e4e51cf259c13ba11187ef6d1f4bfd16e",
          "body": null,
          "is_bot": false,
          "headline": "🐛 fix: web-session-delete",
          "author_name": "solly",
          "author_login": "itmisx",
          "committed_at": "2026-06-25T08:32:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6a6e34550f8178a2f0fa06ed17e82f21e8dc9f79",
          "body": "🐛 fix: codegraph-skip-generated",
          "is_bot": false,
          "headline": "Merge pull request #142 from itmisx/fix/codegraph-skip-generated-140",
          "author_name": "itmisx",
          "author_login": "itmisx",
          "committed_at": "2026-06-25T06:09:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "35888925efc574ae939b1851de7232504637a41b",
          "body": null,
          "is_bot": false,
          "headline": "🐛 fix: codegraph-skip-generated",
          "author_name": "solly",
          "author_login": "itmisx",
          "committed_at": "2026-06-25T06:08:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2708d8ff80dd5d27e08b1183d9a72aa3658d1a3c",
          "body": "🐛 fix landlock panic",
          "is_bot": false,
          "headline": "Merge pull request #139 from itmisx/fix/landlock-raw-syscall-138",
          "author_name": "itmisx",
          "author_login": "itmisx",
          "committed_at": "2026-06-24T03:59:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cdf6fa43895a8d46f6dbdb643a3af8334fbd0c93",
          "body": null,
          "is_bot": false,
          "headline": "🐛 fix landlock panic",
          "author_name": "solly",
          "author_login": "itmisx",
          "committed_at": "2026-06-24T03:58:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9224afe739d99390e0f5acfa41ba558d21b3867d",
          "body": "✨ feat: askuser-inline",
          "is_bot": false,
          "headline": "Merge pull request #137 from itmisx/feat/askuser-inline-134",
          "author_name": "itmisx",
          "author_login": "itmisx",
          "committed_at": "2026-06-24T02:08:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9e919b393bc18a87e27510044d81b20c06425fbc",
          "body": null,
          "is_bot": false,
          "headline": "✨ feat: askuser-inline",
          "author_name": "solly",
          "author_login": "itmisx",
          "committed_at": "2026-06-24T02:07:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "850db4d437cbc754b7752b17c33718e280e5f441",
          "body": "🐛 fix tool-output-clamp",
          "is_bot": false,
          "headline": "Merge pull request #136 from itmisx/fix/tool-output-clamp",
          "author_name": "itmisx",
          "author_login": "itmisx",
          "committed_at": "2026-06-22T03:01:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "246ba1cfceef60f713458f14b1306b870174ee85",
          "body": null,
          "is_bot": false,
          "headline": "🐛 fix tool-output-clamp",
          "author_name": "solly",
          "author_login": "itmisx",
          "committed_at": "2026-06-22T02:58:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "05b94f7106554d94c44115beda8112e611e35ac3",
          "body": null,
          "is_bot": false,
          "headline": "🔧 issue template",
          "author_name": "solly",
          "author_login": "itmisx",
          "committed_at": "2026-06-19T06:32:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "032c1ccde2ec9c68b77ebf6131e863fd4a18e06c",
          "body": "✨ feat: vendor-balance",
          "is_bot": false,
          "headline": "Merge pull request #129 from itmisx/feat/vendor-balance",
          "author_name": "itmisx",
          "author_login": "itmisx",
          "committed_at": "2026-06-19T01:50:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "58f13df4ec149efe55a3717bb7cc2e8830a6fa1e",
          "body": null,
          "is_bot": false,
          "headline": "✨ feat: vendor-balance",
          "author_name": "solly",
          "author_login": "itmisx",
          "committed_at": "2026-06-19T01:50:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "132ed5586565bdbfec04bee722742ebca11db9c1",
          "body": "🐛 fix: esc-double-interrupt",
          "is_bot": false,
          "headline": "Merge pull request #128 from itmisx/fix/esc-double-interrupt",
          "author_name": "itmisx",
          "author_login": "itmisx",
          "committed_at": "2026-06-18T21:28:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "217c28251564186d3cef3d6a4781affa4e45e2ea",
          "body": null,
          "is_bot": false,
          "headline": "🐛 fix: esc-double-interrupt",
          "author_name": "solly",
          "author_login": "itmisx",
          "committed_at": "2026-06-18T21:27:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "878acef8af2b3b0d8b1d089911e63223c3f9d9cf",
          "body": "✨ provider switch",
          "is_bot": false,
          "headline": "Merge pull request #127 from itmisx/feat/provider-switch",
          "author_name": "itmisx",
          "author_login": "itmisx",
          "committed_at": "2026-06-18T14:47:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6088b803b29ab22fa3482fb4ab8a66a9245a0f34",
          "body": null,
          "is_bot": false,
          "headline": "✨ provider switch",
          "author_name": "solly",
          "author_login": "itmisx",
          "committed_at": "2026-06-18T14:46:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "78a3c5665621c8065e2f12001036e23ffc384d67",
          "body": "🐛 fix newline",
          "is_bot": false,
          "headline": "Merge pull request #126 from itmisx/fix/newline",
          "author_name": "itmisx",
          "author_login": "itmisx",
          "committed_at": "2026-06-18T14:08:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c6f8e28339af64aa93df3185a69d7d8cacac58e8",
          "body": null,
          "is_bot": false,
          "headline": "🐛 fix newline",
          "author_name": "solly",
          "author_login": "itmisx",
          "committed_at": "2026-06-18T14:08:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a1465ac59f30a51a4c11252bcc7f3e028356b774",
          "body": "📝 docs/workflow-help",
          "is_bot": false,
          "headline": "Merge pull request #123 from itmisx/docs/workflow-help",
          "author_name": "itmisx",
          "author_login": "itmisx",
          "committed_at": "2026-06-18T08:18:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9d710ab644f9504272b63bb693ce5e4b3d3503a8",
          "body": null,
          "is_bot": false,
          "headline": "📝 docs/workflow-help",
          "author_name": "solly",
          "author_login": "itmisx",
          "committed_at": "2026-06-18T08:17:04Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5bb53005a0c2494b2a6b86420a62e256f3d22121",
          "body": "🐛 fix: windows session case",
          "is_bot": false,
          "headline": "Merge pull request #122 from itmisx/fix/windows-session-case",
          "author_name": "itmisx",
          "author_login": "itmisx",
          "committed_at": "2026-06-18T08:05:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "998d14e18a10c15a884d9483c6023916a6770bea",
          "body": null,
          "is_bot": false,
          "headline": "🐛 fix: windows session case",
          "author_name": "solly",
          "author_login": "itmisx",
          "committed_at": "2026-06-18T08:05:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b2fc4090f3778fdb3aba92b9484900e3aee33a91",
          "body": "✨ edit match",
          "is_bot": false,
          "headline": "Merge pull request #119 from itmisx/feature/edit-tolerant-match",
          "author_name": "itmisx",
          "author_login": "itmisx",
          "committed_at": "2026-06-17T23:43:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "96945663b59c99508ec9ff0188337d6717d2ea77",
          "body": null,
          "is_bot": false,
          "headline": "✨ edit match",
          "author_name": "solly",
          "author_login": "itmisx",
          "committed_at": "2026-06-17T23:43:12Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0acff9c29f5e6d7d3a0971056e3c9b816d29cd57",
          "body": "✨ workflow",
          "is_bot": false,
          "headline": "Merge pull request #117 from itmisx/feature/workflow",
          "author_name": "itmisx",
          "author_login": "itmisx",
          "committed_at": "2026-06-17T14:12:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "317da0cefb90e863d74e36cc045acc990642f8e3",
          "body": null,
          "is_bot": false,
          "headline": "✨ workflow",
          "author_name": "solly",
          "author_login": "itmisx",
          "committed_at": "2026-06-17T14:11:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c9b5fd87a3ea4259657016bf45786b680ad8c89b",
          "body": "🐛 fix: codegraph-oom",
          "is_bot": false,
          "headline": "Merge pull request #116 from itmisx/codegraph-oom",
          "author_name": "itmisx",
          "author_login": "itmisx",
          "committed_at": "2026-06-16T09:10:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bf0368db45a3b6ff54d75b0e6c64393b7ebdde86",
          "body": null,
          "is_bot": false,
          "headline": "🐛 fix: codegraph-oom",
          "author_name": "solly",
          "author_login": "itmisx",
          "committed_at": "2026-06-16T09:10:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a1f8e7eac48a9fbcb39d7afccb11b7ab67855a7e",
          "body": null,
          "is_bot": false,
          "headline": "🐛 fix  CJK 输入残影",
          "author_name": "solly",
          "author_login": "itmisx",
          "committed_at": "2026-06-14T08:39:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4c4da4d342c313b860d62b9c9be95fc99a8d8177",
          "body": null,
          "is_bot": false,
          "headline": "🐛 fix CJK 输入残影",
          "author_name": "solly",
          "author_login": "itmisx",
          "committed_at": "2026-06-14T07:14:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "60663a93e83627cd5fe5e0e617f644ba05c978fe",
          "body": null,
          "is_bot": false,
          "headline": "🐛 CJK input",
          "author_name": "solly",
          "author_login": "itmisx",
          "committed_at": "2026-06-14T06:44:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b7b530c3de05426e8e8525ed6757d42eb04c81ae",
          "body": null,
          "is_bot": false,
          "headline": "👷 gitee ci",
          "author_name": "solly",
          "author_login": "itmisx",
          "committed_at": "2026-06-14T02:27:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "88c030db4f554e1cc7e77d548fe64c9758483b80",
          "body": null,
          "is_bot": false,
          "headline": "💄 logo style",
          "author_name": "solly",
          "author_login": "itmisx",
          "committed_at": "2026-06-13T14:46:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "aad42279830c24923fda8c01afe111e708eae420",
          "body": "✨ explore tool",
          "is_bot": false,
          "headline": "Merge pull request #112 from itmisx/feat/explore-tool",
          "author_name": "itmisx",
          "author_login": "itmisx",
          "committed_at": "2026-06-13T13:56:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a836b7f8be15dea501a7c07a3669904f53d145ca",
          "body": null,
          "is_bot": false,
          "headline": "✨ explore tool",
          "author_name": "solly",
          "author_login": "itmisx",
          "committed_at": "2026-06-13T13:56:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        }
      ],
      "releases_count": 100,
      "commits_last_year": 320,
      "latest_release_at": "2026-07-22T09:35:05Z",
      "latest_release_tag": "v0.2.99",
      "releases_from_tags": false,
      "days_since_last_push": 0,
      "active_weeks_last_year": 10,
      "days_since_latest_release": 0,
      "mean_days_between_releases": 1.8
    },
    "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": [
        {
          "name": "deepx",
          "exists": true,
          "license": "MIT",
          "keywords": [
            "html",
            "mvvm"
          ],
          "ecosystem": "npm",
          "matches_repo": false,
          "registry_url": "https://www.npmjs.com/package/deepx",
          "is_deprecated": false,
          "latest_version": "0.1.0",
          "repository_url": "https://github.com/compositejs/deepx",
          "versions_count": 1,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": 1,
          "monthly_downloads": 13,
          "first_published_at": "2020-07-20T14:17:50.464000Z",
          "latest_published_at": "2020-07-20T14:17:50.610000Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 2193
        }
      ]
    },
    "popularity": {
      "forks": 32,
      "stars": 320,
      "watchers": 5,
      "fork_history": {
        "days": [
          {
            "date": "2026-05-26",
            "count": 2
          },
          {
            "date": "2026-05-27",
            "count": 1
          },
          {
            "date": "2026-05-28",
            "count": 1
          },
          {
            "date": "2026-05-29",
            "count": 2
          },
          {
            "date": "2026-06-01",
            "count": 1
          },
          {
            "date": "2026-06-02",
            "count": 1
          },
          {
            "date": "2026-06-03",
            "count": 1
          },
          {
            "date": "2026-06-05",
            "count": 1
          },
          {
            "date": "2026-06-06",
            "count": 1
          },
          {
            "date": "2026-06-08",
            "count": 1
          },
          {
            "date": "2026-06-10",
            "count": 1
          },
          {
            "date": "2026-06-11",
            "count": 5
          },
          {
            "date": "2026-06-13",
            "count": 2
          },
          {
            "date": "2026-06-15",
            "count": 1
          },
          {
            "date": "2026-06-20",
            "count": 1
          },
          {
            "date": "2026-06-21",
            "count": 1
          },
          {
            "date": "2026-06-27",
            "count": 1
          },
          {
            "date": "2026-07-04",
            "count": 1
          },
          {
            "date": "2026-07-06",
            "count": 1
          },
          {
            "date": "2026-07-13",
            "count": 1
          },
          {
            "date": "2026-07-15",
            "count": 2
          },
          {
            "date": "2026-07-16",
            "count": 1
          },
          {
            "date": "2026-07-17",
            "count": 1
          },
          {
            "date": "2026-07-20",
            "count": 1
          }
        ],
        "complete": true,
        "collected": 32,
        "total_forks": 32
      },
      "star_history": null,
      "open_issues_and_prs": 7
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [
        "examples"
      ],
      "has_llms_txt": false,
      "has_dockerfile": false,
      "has_mcp_signal": false,
      "bootstrap_files": [],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [],
      "toolchain_manifests": [
        "go.mod"
      ],
      "largest_source_bytes": 160908,
      "source_files_sampled": 207,
      "oversized_source_files": 2,
      "agent_instruction_files": [],
      "agent_instruction_max_bytes": null
    },
    "dependencies": {
      "manifests": [
        "go.mod",
        "package.json"
      ],
      "advisories": {
        "error": null,
        "scope": "published_package",
        "source": "osv",
        "findings": [],
        "collected": true,
        "malicious": [],
        "truncated": false,
        "by_severity": {},
        "advisory_count": 0,
        "affected_count": 0,
        "assessed_count": 2,
        "malicious_count": 0,
        "assessed_package": "npm:deepx@0.1.0",
        "unassessed_count": 0,
        "direct_affected_count": 0
      },
      "ecosystems": [
        "go",
        "npm"
      ],
      "dependencies": [
        {
          "name": "charm.land/bubbles/v2",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v2.1.0"
        },
        {
          "name": "charm.land/bubbletea/v2",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v2.0.6"
        },
        {
          "name": "charm.land/glamour/v2",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v2.0.0"
        },
        {
          "name": "charm.land/lipgloss/v2",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v2.0.3"
        },
        {
          "name": "github.com/charmbracelet/x/ansi",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.11.7"
        },
        {
          "name": "github.com/fastschema/qjs",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.0.6"
        },
        {
          "name": "github.com/getcharzp/onnxruntime_purego",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.24.0"
        },
        {
          "name": "github.com/odvcencio/gotreesitter",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.19.1"
        },
        {
          "name": "github.com/tiktoken-go/tokenizer",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.7.0"
        },
        {
          "name": "golang.org/x/sys",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.45.0"
        },
        {
          "name": "golang.org/x/tools",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.45.0"
        },
        {
          "name": "gopkg.in/yaml.v3",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v3.0.1"
        }
      ],
      "all_dependencies": {
        "error": "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository",
        "source": null,
        "packages": [],
        "collected": false,
        "truncated": false,
        "total_count": null,
        "direct_count": null,
        "indirect_count": null
      }
    },
    "maintainership": {
      "issues": {
        "open_prs": 0,
        "merged_prs": 107,
        "open_issues": 7,
        "closed_ratio": 0.921,
        "closed_issues": 82,
        "closed_unmerged_prs": 5
      },
      "bus_factor": 1,
      "bot_contributors": 0,
      "top_contributors": [
        {
          "type": "User",
          "login": "itmisx",
          "commits": 310,
          "avatar_url": "https://avatars.githubusercontent.com/u/5791324?v=4"
        },
        {
          "type": "User",
          "login": "lordquest",
          "commits": 7,
          "avatar_url": "https://avatars.githubusercontent.com/u/90535769?v=4"
        },
        {
          "type": "User",
          "login": "mkaros2025",
          "commits": 4,
          "avatar_url": "https://avatars.githubusercontent.com/u/197320386?v=4"
        },
        {
          "type": "User",
          "login": "FUSU123fusu",
          "commits": 1,
          "avatar_url": "https://avatars.githubusercontent.com/u/88240205?v=4"
        }
      ],
      "contributors_sampled": 4,
      "top_contributor_share": 0.963
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "mirror-to-gitee.yml",
        "release.yml"
      ],
      "has_docs_dir": false,
      "linter_configs": [],
      "has_editorconfig": false,
      "has_linter_config": false,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [
        "go.sum"
      ],
      "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": 6,
            "reason": "branch protection is not maximal on development and all release branches",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
          },
          {
            "name": "CI-Tests",
            "score": 0,
            "reason": "0 out of 14 merged PRs checked by a CI test -- score normalized to 0",
            "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": 2,
            "reason": "Found 4/15 approved changesets -- score normalized to 2",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 0,
            "reason": "project has 0 contributing companies or organizations -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
          },
          {
            "name": "Dangerous-Workflow",
            "score": 10,
            "reason": "no dangerous workflow patterns detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
          },
          {
            "name": "Dependency-Update-Tool",
            "score": 0,
            "reason": "no update tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
          },
          {
            "name": "Fuzzing",
            "score": 0,
            "reason": "project is not fuzzed",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
          },
          {
            "name": "License",
            "score": 10,
            "reason": "license file detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
          },
          {
            "name": "Maintained",
            "score": 0,
            "reason": "project was created within the last 90 days. Please review its contents carefully",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
          },
          {
            "name": "Packaging",
            "score": 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": "SAST tool is not run on all commits -- score normalized to 0",
            "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": 0,
            "reason": "Project has not signed or included provenance with any releases.",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
          },
          {
            "name": "Token-Permissions",
            "score": 0,
            "reason": "detected GitHub workflow tokens with excessive permissions",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
          },
          {
            "name": "Vulnerabilities",
            "score": 1,
            "reason": "9 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "a9ecc2f8ef903afd9f5e89918f5c6957a4462afc",
        "ran_at": "2026-07-22T19:11:56Z",
        "aggregate_score": 3,
        "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-22T09:35:15Z",
      "oldest_open_prs": [],
      "last_merged_pr_at": "2026-07-22T09:30:47Z",
      "ci_last_conclusion": "SUCCESS",
      "oldest_open_issues": [
        {
          "number": 157,
          "created_at": "2026-07-02T15:03:22Z",
          "last_comment_at": "2026-07-03T14:31:33Z",
          "last_comment_author": "suvman195"
        },
        {
          "number": 159,
          "created_at": "2026-07-04T12:19:56Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 160,
          "created_at": "2026-07-05T03:33:25Z",
          "last_comment_at": "2026-07-05T03:49:04Z",
          "last_comment_author": "itmisx"
        },
        {
          "number": 165,
          "created_at": "2026-07-07T12:57:34Z",
          "last_comment_at": "2026-07-11T08:25:25Z",
          "last_comment_author": "itmisx"
        },
        {
          "number": 168,
          "created_at": "2026-07-11T07:36:32Z",
          "last_comment_at": "2026-07-11T08:23:07Z",
          "last_comment_author": "itmisx"
        },
        {
          "number": 191,
          "created_at": "2026-07-18T11:38:11Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 201,
          "created_at": "2026-07-21T14:11:48Z",
          "last_comment_at": "2026-07-22T14:06:01Z",
          "last_comment_author": "lordquest"
        }
      ]
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/itmisx/deepx-code",
    "host": "github.com",
    "name": "deepx-code",
    "owner": "itmisx"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "moderate",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 56,
      "inputs": {
        "security": 44,
        "vitality": 73,
        "community": 53,
        "governance": 48,
        "engineering": 59
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "good",
        "name": "Vitality",
        "value": 73,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "moderate",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 61,
            "inputs": {
              "commits_last_year": 320,
              "human_commit_share": 1,
              "days_since_last_push": 0,
              "active_weeks_last_year": 10
            },
            "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": "10/52 weeks with commits",
                "points": 6.9,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 10
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "320 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 320
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "project was created within the last 90 days. Please review its contents carefully",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "release_discipline",
            "band": "excellent",
            "name": "Release discipline",
            "note": null,
            "notes": [],
            "value": 90,
            "inputs": {
              "releases_count": 100,
              "latest_release_tag": "v0.2.99",
              "releases_from_tags": false,
              "days_since_latest_release": 0,
              "mean_days_between_releases": 1.8
            },
            "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.8 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 1.8
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "openssf_scorecard_signed_releases",
                "name": "OpenSSF Scorecard: Signed-Releases",
                "detail": "Project has not signed or included provenance with any releases.",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "abandonment",
            "band": "excellent",
            "name": "Abandonment",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "cap": null,
              "state": "unverified",
              "guards": [],
              "signals": [],
              "red_flag": false,
              "multiplier_pct": 100,
              "declared_reason": null,
              "unverified_reason": "repository_too_young",
              "unanswered_open_prs": null,
              "unanswered_open_issues": null,
              "days_since_last_merged_pr": null,
              "days_since_last_human_commit": null,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "maintenance record not established from the collected data",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_unverified",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "moderate",
        "name": "Community & Adoption",
        "value": 53,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "moderate",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 56,
            "inputs": {
              "forks": 32,
              "stars": 320,
              "watchers": 5,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "320 stars",
                "points": 40.6,
                "status": "partial",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 320
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "32 forks",
                "points": 12.4,
                "status": "partial",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 32
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "5 watchers",
                "points": 3.3,
                "status": "partial",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 5
                    }
                  }
                ],
                "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 (MIT)",
                "points": 22.5,
                "status": "met",
                "details": [
                  {
                    "code": "license_standard",
                    "params": {}
                  },
                  {
                    "code": "license_spdx",
                    "params": {
                      "spdx": "MIT"
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributing_guide",
                "name": "CONTRIBUTING guide",
                "detail": null,
                "points": 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": 48,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "critical",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 15,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 4,
              "top_contributor_share": 0.963
            },
            "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 96% of commits",
                "points": 0.8,
                "status": "partial",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 96
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "4 contributors",
                "points": 5.4,
                "status": "partial",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 4
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 0 contributing companies or organizations -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "good",
            "name": "Issue & PR responsiveness",
            "note": null,
            "notes": [],
            "value": 83,
            "inputs": {
              "merged_prs": 107,
              "open_issues": 7,
              "closed_issues": 82,
              "issue_closed_ratio": 0.921,
              "closed_unmerged_prs": 5
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "92% of issues closed",
                "points": 43.1,
                "status": "partial",
                "details": [
                  {
                    "code": "issues_closed_share",
                    "params": {
                      "share": 92
                    }
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "107/112 decided PRs merged",
                "points": 36.5,
                "status": "partial",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 107,
                      "decided": 112
                    }
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 4/15 approved changesets -- score normalized to 2",
                "points": 3,
                "status": "partial",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "moderate",
            "name": "Ownership & stewardship",
            "note": "Excluded from scoring (no data or not applicable): Verified domain. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "verified_domain"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 53,
            "inputs": {
              "followers": 21,
              "owner_type": "User",
              "is_verified": null,
              "owner_login": "itmisx",
              "public_repos": 30,
              "account_age_days": 4650
            },
            "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": "21 followers of itmisx",
                "points": 9.7,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 21,
                      "login": "itmisx"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "30 public repos, account ~12 yr old",
                "points": 22.9,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 30
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 12
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          }
        ],
        "description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?"
      },
      {
        "key": "engineering",
        "band": "moderate",
        "name": "Engineering Quality",
        "value": 59,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "at_risk",
            "name": "Engineering practices",
            "note": null,
            "notes": [],
            "value": 48,
            "inputs": {
              "has_ci": true,
              "has_tests": true,
              "has_editorconfig": false,
              "has_linter_config": false,
              "has_precommit_config": false
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": "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": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 16
              },
              {
                "key": "pre_commit_hooks",
                "name": "Pre-commit hooks",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 9.6
              },
              {
                "key": "editorconfig",
                "name": ".editorconfig",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.4
              },
              {
                "key": "openssf_scorecard_ci_tests",
                "name": "OpenSSF Scorecard: CI-Tests",
                "detail": "0 out of 14 merged PRs checked by a CI test -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "good",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 75,
            "inputs": {
              "topics": [
                "deepseek",
                "coding-agent",
                "deepseek-tui",
                "codegraph",
                "workflow",
                "agent",
                "ocr",
                "openspec",
                "superpowers"
              ],
              "has_wiki": true,
              "homepage": "https://itmisx.github.io/deepx-code/",
              "has_readme": true,
              "has_docs_dir": false,
              "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": 0,
                "status": "missed",
                "details": [],
                "max_points": 25
              },
              {
                "key": "documentation_homepage_site",
                "name": "Documentation / homepage site",
                "detail": "https://itmisx.github.io/deepx-code/",
                "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": "9 topics",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "topics_count",
                    "params": {
                      "count": 9
                    }
                  }
                ],
                "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": 44,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "at_risk",
            "name": "Security posture",
            "note": null,
            "notes": [],
            "value": 30,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 18,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 0,
              "scorecard_aggregate": 3
            },
            "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 is not maximal on development and all release branches",
                "points": 4.5,
                "status": "partial",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "ci_tests",
                "name": "CI-Tests",
                "detail": "0 out of 14 merged PRs checked by a CI test -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "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 4/15 approved changesets -- score normalized to 2",
                "points": 1.5,
                "status": "partial",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 0 contributing companies or organizations -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "dangerous_workflow",
                "name": "Dangerous-Workflow",
                "detail": "no dangerous workflow patterns detected",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "dependency_update_tool",
                "name": "Dependency-Update-Tool",
                "detail": "no update tool detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "fuzzing",
                "name": "Fuzzing",
                "detail": "project is not fuzzed",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "license file detected",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "maintained",
                "name": "Maintained",
                "detail": "project was created within the last 90 days. Please review its contents carefully",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "packaging",
                "name": "Packaging",
                "detail": "packaging workflow 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": "SAST tool is not run on all commits -- score normalized to 0",
                "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": "Project has not signed or included provenance with any releases.",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "token_permissions",
                "name": "Token-Permissions",
                "detail": "detected GitHub workflow tokens with excessive permissions",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "vulnerabilities",
                "name": "Vulnerabilities",
                "detail": "9 existing vulnerabilities detected",
                "points": 0.8,
                "status": "partial",
                "details": [],
                "max_points": 7.5
              }
            ]
          },
          {
            "key": "dependency_advisories",
            "band": "excellent",
            "name": "Dependency advisories",
            "note": "Excluded from scoring (no data or not applicable): No advisories left outstanding. Remaining weights renormalized. Matched the npm:deepx@0.1.0 runtime dependency closure — what installing the published package pulls in — 2 packages. Reachability is not analyzed.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "no_advisories_left_outstanding"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              },
              {
                "code": "advisories_scope_published",
                "params": {
                  "package": "npm:deepx@0.1.0",
                  "assessed": 2
                }
              },
              {
                "code": "advisories_reachability",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "source": "osv",
              "advisories": 0,
              "affected_packages": 0,
              "assessed_packages": 2,
              "unassessed_packages": 0,
              "affected_by_severity": "none",
              "direct_affected_packages": 0
            },
            "components": [
              {
                "key": "direct_dependencies_free_of_known_advisories",
                "name": "Direct dependencies free of known advisories",
                "detail": "no direct dependency carries a known advisory",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "no_direct_advisories",
                    "params": {}
                  }
                ],
                "max_points": 35
              },
              {
                "key": "indirect_dependencies_free_of_known_advisories",
                "name": "Indirect dependencies free of known advisories",
                "detail": "no indirect dependency carries a known advisory",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "no_indirect_advisories",
                    "params": {}
                  }
                ],
                "max_points": 25
              },
              {
                "key": "no_advisories_left_outstanding",
                "name": "No advisories left outstanding",
                "detail": "no advisory carries a publication date",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "advisories_no_publication_date",
                    "params": {}
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "malicious_dependencies",
            "band": "excellent",
            "name": "Malicious dependencies",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "source": "osv",
              "meaning": "reported as a malicious package by the OpenSSF corpus; the remedy is removal or moving off the compromised name, never an upgrade of the same artifact. Versions the registry has since pulled are listed but not scored",
              "packages": [],
              "red_flag": false,
              "assessed_packages": 2,
              "malicious_packages": 0,
              "direct_malicious_packages": 0,
              "withdrawn_malicious_packages": 0,
              "installable_malicious_packages": 0
            },
            "components": [
              {
                "key": "no_dependency_reported_as_a_malicious_package",
                "name": "No dependency reported as a malicious package",
                "detail": "no dependency is reported as a malicious package",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "no_malicious_dependencies",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          },
          {
            "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": 3
            },
            "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": "moderate",
        "name": "AI Readiness",
        "value": 54,
        "weight": 0,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "at_risk",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 36,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": 0.67,
              "agent_instruction_files": [],
              "agent_instruction_max_bytes": null
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": "no CLAUDE.md / AGENTS.md / editor rules",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_agent_instructions",
                    "params": {}
                  }
                ],
                "max_points": 45
              },
              {
                "key": "machine_readable_docs_llms_txt",
                "name": "Machine-readable docs (llms.txt)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "legible_commit_history",
                "name": "Legible commit history",
                "detail": "67 of 100 human commits state their intent (structured subject or explanatory body)",
                "points": 35.7,
                "status": "partial",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 67,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "moderate",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 56,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [
                "go.sum"
              ],
              "has_dockerfile": false,
              "typed_language": true,
              "bootstrap_files": [],
              "has_devcontainer": false,
              "has_linter_config": false,
              "typecheck_configs": [],
              "agent_commit_share": 0,
              "toolchain_manifests": [
                "go.mod"
              ],
              "dependency_bot_commit_share": 0
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": "go.mod (toolchain convention, no task runner)",
                "points": 12.6,
                "status": "partial",
                "details": [
                  {
                    "code": "toolchain_convention",
                    "params": {
                      "files": "go.mod"
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "automated_tests",
                "name": "Automated tests",
                "detail": null,
                "points": 22,
                "status": "met",
                "details": [],
                "max_points": 22
              },
              {
                "key": "lint_format_config",
                "name": "Lint / format config",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 11
              },
              {
                "key": "static_type_checking",
                "name": "Static type checking",
                "detail": "Go (statically typed)",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "statically_typed_language",
                    "params": {
                      "language": "Go"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "reproducible_environment",
                "name": "Reproducible environment",
                "detail": "lockfile",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "lockfile"
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "no agent-authored commits among the last 100",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_agent_authored_commits",
                    "params": {
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "automated_maintenance",
                "name": "Automated maintenance",
                "detail": "no automated dependency updates observed",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_dependency_automation",
                    "params": {}
                  }
                ],
                "max_points": 8
              },
              {
                "key": "openssf_scorecard_pinned_dependencies",
                "name": "OpenSSF Scorecard: Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "excellent",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "primary_language": "Go",
              "largest_source_bytes": 160908,
              "source_files_sampled": 207,
              "oversized_source_files": 2
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "Go (statically typed)",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "statically_typed_language",
                    "params": {
                      "language": "Go"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "2/207 source files over 60KB",
                "points": 54.5,
                "status": "partial",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 207,
                      "oversized": 2
                    }
                  }
                ],
                "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": [
    "Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token",
    "npm package 'deepx' points at a different repository (https://github.com/compositejs/deepx); excluded from ecosystem scoring",
    "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-22T19:12:13.498946Z",
  "schema_version": "0.26.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/i/itmisx/deepx-code.svg",
  "full_name": "itmisx/deepx-code",
  "license_state": "standard",
  "license_spdx": "MIT"
}

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

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

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